From 30ce29cd96dc989d92f0a1329577ca69b7d892e7 Mon Sep 17 00:00:00 2001 From: Anton Kovsharov <2538570+antonkov@users.noreply.github.com> Date: Tue, 10 Nov 2026 15:09:05 +0000 Subject: [PATCH] =?UTF-8?q?Verify=2010=20more=20library=20routines=20in=20?= =?UTF-8?q?the=20binary;=20trusted=20hooks=2037=20=E2=86=92=2027?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The headline theorems no longer trust 10 of the 37 routines that were hooked (replaced by a trusted Lean contract). The proofs now execute their machine code in the pinned libsignal-cli binary: - musl libc (rustc 1.98.1's self-contained libc.a): memmove, bcmp (and the memcmp it tail-calls), strlen - Rust standard library: memrchr, str::from_utf8, SystemTime::duration_since, >::add - non-cryptographic helpers in the crypto crates: subtle::black_box and the zeroizing Drop impls of x25519_dalek::SharedSecret and StaticSecret 27 hooked routines remain: the 23 low-level cryptographic primitives (whose security the theorems assume), Rust's error-message formatting (core::fmt::write, format_inner), and the two functions that write files and standard output. CliHooks, which the binary theorems quantify over, now holds only the abstract cryptographic primitives. The headline theorem statements are unchanged; the trusted definitions they refer to (the hook table, CliHooks, the ELF pin) are smaller. The pinned binary changes because the newly verified routines are now linked and placed as verified code: same libsignal v0.105.4 and rustc 1.98.1, linker script third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld, SHA-256 50066cbd732256eb5f19f93d1d98800914336b7926225de3ebfa0bb37eca98ce (was 2f20c836…). The bug-injection mutants are rebuilt with the same link recipe and 27-hook table, and their disproofs still go through. comparator passes on this tree; comparator/README.md now explains how the challenge and solution are set up and how to run the check locally. GitOrigin-RevId: 84be1556f741f1f348de110f12d9883d70ba9980 --- .../Tests/Guards/CliPqAllocPremiseGuard.lean | 37 +- Computational/docs/DEVIATIONS.md | 56 +- LibsignalBinary.lean | 1 + LibsignalBinary/Cli.lean | 14 + LibsignalBinary/Heap/Fine/F3LayoutData.lean | 8 +- LibsignalBinary/Heap/Fine/SpecBudgetFine.lean | 4 +- .../Heap/Fine/SpecBudgetFineSat.lean | 4 +- .../Heap/Fine/SpecBudgetHelpersFine.lean | 8 +- .../E2E/Pqxdh/DecryptPq/RootTrapPlaced.lean | 129 +- .../Pqxdh/DecryptPq/RootTrapPlacedBudget.lean | 17 +- .../DecryptPq/RootTrapPlacedBudgetFd.lean | 14 +- .../DecryptPq/RootTrapPlacedBudgetPart2.lean | 36 +- .../DecryptPq/RootTrapPlacedBudgetPart3.lean | 12 +- .../RootTrapPlacedBudgetPart3Sat.lean | 17 +- .../DecryptPq/RootTrapPlacedBudgetPart4.lean | 63 +- .../RootTrapPlacedBudgetPart4Sat.lean | 58 +- .../DecryptPq/RootTrapPlacedBudgetPart5.lean | 124 +- .../Kits/StageP2PurePlacedBbSat.lean | 65 + .../Kits/StageP2PurePlacedBudgetSat.lean | 51 +- .../Matched/M2TopPlacedBudgetSat.lean | 1047 +++++++++++ .../Matched/M2TopPlacedSat.lean | 771 ++++++++ .../Over/StageP3PlacedBudget.lean | 10 +- .../PrevDec/Chain3CroCPlacedBudget.lean | 11 +- .../PrevDec/ExactDecodePlacedBudget.lean | 11 +- .../PrevDec/TopPlacedBudget.lean | 6 +- .../VerNe/TopPlacedBudget.lean | 12 +- .../Cli/SpqrV1/M4/DecryptFrontTrapPlaced.lean | 111 +- .../M4/DecryptFrontTrapPlacedBudget.lean | 141 +- .../M4/DecryptFrontTrapPlacedBudgetPart2.lean | 27 +- .../M4/DecryptFrontTrapPlacedBudgetPart3.lean | 15 +- .../DecryptFrontTrapPlacedBudgetPart3Sat.lean | 17 +- .../M4/DecryptFrontTrapPlacedBudgetPart4.lean | 61 +- .../DecryptFrontTrapPlacedBudgetPart4Sat.lean | 59 +- .../M4/DecryptFrontTrapPlacedBudgetSat.lean | 144 +- .../SpqrV1/M4/RecordDecryptPV1TrapPlaced.lean | 6 +- .../SpqrV1/M4/TryDecryptPV1TrapPlaced.lean | 9 +- .../M4/TryDecryptPV1TrapPlacedBudget.lean | 8 +- .../Decrypt/DhCommit433PlacedBudget.lean | 46 +- .../Decrypt/DhCommit433PlacedBudgetAux.lean | 4 +- .../Decrypt/DhCommitClMainPlacedBudget.lean | 8 +- .../Decrypt/DhCommitClStep4PlacedBudget.lean | 36 +- .../Decrypt/DhStep433PlacedBudget.lean | 20 +- .../Shared/VerifySignaturePlacedA2Sat.lean | 365 ++++ .../Shared/VerifySignaturePlacedBSat.lean | 600 ++++++ .../Shared/VerifySignaturePlacedSat.lean | 811 ++++++++ .../E2E/Record/DeserializeGeneral/Root.lean | 5 +- .../Proofs/E2E/Record/L1GX/Body.lean | 10 +- .../Proofs/E2E/Record/L1GX/Glue.lean | 5 +- .../HookDischarge/RustStd/MemrchrRO.lean | 14 +- .../Proofs/PeakBudget/CliF3MainOkBridge.lean | 293 +-- .../Proofs/PeakBudget/CliNoOomOfFitsEnv.lean | 843 +-------- .../PeakBudget/CliNoOomOfFitsEnvGhostSat.lean | 202 ++ .../PeakBudget/CliNoOomOfFitsEnvSat.lean | 40 +- .../PeakBudget/D3MatchingPathBSeqFreeR.lean | 28 +- .../PeakBudget/DecPkD2cSlotOkLinkedAux.lean | 9 +- .../Proofs/PeakBudget/RealCliDecPkSlotOk.lean | 8 +- .../PeakBudget/RealMainEnvNonVacSuccInit.lean | 7 - .../PeakBudget/RealMainEnvNonVacSuccSend.lean | 8 - .../RealMainEnvNonVacSuccWhisper.lean | 3 - .../PeakBudget/W4RecvPrekeyCmkDom0.lean | 16 - .../W4RecvPrekeyCmkDom0PostBob.lean | 8 - .../Proofs/Placed/SubsetA4cBudget.lean | 14 +- .../Proofs/Placed/SubsetA4cBudgetSat.lean | 14 +- .../SessionRecordAt/Hooks2/Adapters.lean | 9 - .../Hooks2/AdaptersBudget.lean | 18 +- .../SessionRecordAt/Hooks2/DoReserveExt.lean | 1 - .../Hooks2/DoReserveExtBudget.lean | 3 +- .../SessionRecordAt/Hooks2/SerDefsX.lean | 9 +- .../Hooks2/SerDefsXBudget.lean | 11 +- .../SessionRecordAt/Stage1X/GrowOneX.lean | 9 +- .../Stage1X/GrowOneXBudget.lean | 18 +- .../Proofs/SessionRecordMin/Deserialize.lean | 3 +- .../SessionRecordMin/DeserializeBudget.lean | 15 +- .../Cli/AllocGhostLinkTransfer.lean | 70 +- .../Proofs/SignalSession/Cli/CliElfProof.lean | 2 +- .../SignalSession/Cli/CliExternsWitness.lean | 12 +- .../Budget/D3BadKemRejectAuxPlacedBudget.lean | 17 +- .../D3BadKemRejectAuxPlacedBudgetFd.lean | 17 +- .../D3/Budget/D3BadKemRejectPlacedBudget.lean | 4 +- .../Budget/D3BadKemRejectPlacedBudgetFd.lean | 4 +- .../D3MatchingPathBKitsPlacedBudgetFd.lean | 21 +- .../Budget/D3MatchingPathBPlacedBudget.lean | 29 +- .../D3MatchingPathBPollPlacedBudgetFd.lean | 28 +- ...NonCanonStage2PathAFullPlacedBudgetFd.lean | 14 +- ...3NonCanonStage2PathAOfEnvPlacedBudget.lean | 14 +- .../D3NonCanonStage2PathAPlacedBudget.lean | 14 +- .../D3NonCanonStage2PathCPlacedBudget.lean | 18 +- .../D3NonCanonValidMatchSlotPlacedBudget.lean | 3 +- ...nCanonValidMatchUntrustedPlacedBudget.lean | 8 +- .../D3/Budget/D3NonCanonValidOfEnvGlue.lean | 9 +- ...onCanonValidOverPathCP4PlacedBudgetFd.lean | 2 +- .../D3NonCanonValidOverPlacedBudgetFd.lean | 3 +- ...3NonCanonValidOverPollAuxPlacedBudget.lean | 2 +- .../D3NonCanonValidOverPollPlacedBudget.lean | 9 +- ...D3NonCanonValidOverStage2PlacedBudget.lean | 25 +- ...NonCanonValidOverStage2PlacedBudgetFd.lean | 17 +- ...D3NonCanonValidOverStage4PlacedBudget.lean | 2 +- .../Budget/D3PollRejectAuxPlacedBudget.lean | 9 +- .../D3/Budget/D3StageP3Prev1PlacedBudget.lean | 10 +- .../Cli/D3/Budget/D3V3RejectPlacedBudget.lean | 2 +- .../DecPkPollKitsStage2PlacedBudgetFd.lean | 4 +- .../DecPkPollKitsStage4PlacedBudgetFd.lean | 4 +- .../D3/Budget/Stage4KitsPlacedBudgetFd.lean | 3 +- .../D3/Budget/StageP3RawBodyPlacedBudget.lean | 11 +- .../Cli/D3/D3BadKemRejectPlaced.lean | 14 +- .../Cli/D3/D3PollRejectAuxPlaced.lean | 73 +- .../Cli/D3/F3/D3BinaryOomProofF3G.lean | 22 +- .../Cli/D3/F3/D3MainLiftGlueF3.lean | 30 +- .../Cli/D3/F3/D3MainLiftGlueOverF3.lean | 608 +----- ...verD3SlotDom0BridgePostBobProducerAux.lean | 5 +- .../Cli/D3/F3/H7RAVerNeRawSlot520.lean | 17 +- .../Cli/D3/F3/H9PathBAssemblyG2.lean | 2 +- .../Cli/F3/HInit/CliInitSlotOkPlacedAt.lean | 65 +- .../Cli/F3/HInit/CliInitSlotOkPlacedAtFd.lean | 33 +- .../Cli/F3/HRead/AgreesOutsideReadHooks.lean | 53 +- .../Cli/F3/HRead/CryptoHookFds.lean | 17 +- .../Cli/F3/HRead/ReadStdinBudgetPlaced.lean | 73 +- .../Cli/F3/L4B/CliStrictPlaced2.lean | 34 +- .../Cli/F3/L4B/CliStrictPlaced2G.lean | 28 +- .../Cli/F3/L4B/F3AllocStdinGhostHooks.lean | 99 +- .../Cli/F3/L4B/F3ExternNoAllocFail.lean | 13 +- .../Cli/F3/L4B/Ghost617Transfer.lean | 106 +- .../SignalSession/Cli/F3/L4B/M24L4BEquiv.lean | 75 +- .../SignalSession/Cli/Heap/AllocWithFds.lean | 1 + .../Cli/HooksDehook/BcmpCode.lean | 12 +- .../Cli/HooksDehook/BcmpGhostReplays.lean | 619 ++++++ .../Cli/HooksDehook/BlackBoxGhostReplays.lean | 605 ++++++ .../Cli/HooksDehook/C2EntryGuard.lean | 88 + .../Cli/HooksDehook/C2RowLayoutFacts.lean | 592 ++++++ .../C2RowLayoutFacts/CodeSubslice.lean | 95 + .../HooksDehook/C2RowLayoutFacts/Dalek.lean | 308 +++ .../C2RowLayoutFacts/DalekRows.lean | 316 ++++ .../C2RowLayoutFacts/DurCst16.lean | 89 + .../C2RowLayoutFacts/FromUtf8.lean | 435 +++++ .../C2RowLayoutFacts/FromUtf8Row.lean | 372 ++++ .../C2RowLayoutFacts/LibcRows.lean | 353 ++++ .../C2RowLayoutFacts/MemmoveRow.lean | 485 +++++ .../C2RowLayoutFacts/MemrchrRow.lean | 160 ++ .../C2RowLayoutFacts/RowCommon.lean | 218 +++ .../C2RowLayoutFacts/T4Witness.lean | 824 ++++++++ .../HooksDehook/C2RowLayoutFacts/Time.lean | 579 ++++++ .../C2RowLayoutFacts/TimeAddPanic.lean | 689 +++++++ .../Cli/HooksDehook/CliMemcpyRowSat.lean | 81 +- .../DurationSinceGhostReplays.lean | 628 +++++++ .../Cli/HooksDehook/ExtraGhostReplay.lean | 730 ++++++++ .../Cli/HooksDehook/FromUtf8Ghost.lean | 6 +- .../Cli/HooksDehook/FromUtf8GhostReplays.lean | 847 +++++++++ .../Cli/HooksDehook/MemmoveCode.lean | 12 +- .../Cli/HooksDehook/MemmoveExtraReplays.lean | 763 ++++++++ .../Cli/HooksDehook/MemrchrExtraReplays.lean | 539 ++++++ .../SharedSecretDropGhostReplays.lean | 691 +++++++ .../StaticSecretDropGhostReplays.lean | 651 +++++++ .../Cli/HooksDehook/StrlenGhostReplays.lean | 673 +++++++ .../Cli/HooksDehook/TimeAddGhostReplays.lean | 537 ++++++ .../DecPkPollKitsInstPlacedBudgetFd.lean | 34 +- .../Cli/KitInst/IdentityKitOkCliPlaced.lean | 102 +- .../KitInst/IdentityKitOkCliPlacedBudget.lean | 83 +- .../Cli/KitInst/IdentityKitOkPlaced.lean | 252 ++- .../KitInst/IdentityKitOkPlacedBudget.lean | 155 +- .../Cli/KitInst/SessionKitOkCliPlaced.lean | 4 - .../KitInst/SessionKitOkCliPlacedBudget.lean | 29 +- .../Cli/M24/AddressRoA1PlacedBudget.lean | 31 +- .../Cli/M24/AddressRoA1PlacedBudgetSat.lean | 5 +- .../Proofs/SignalSession/Cli/M24/ArgvPad.lean | 26 +- .../SignalSession/Cli/M24/CalleesRO.lean | 36 +- .../SignalSession/Cli/M24/CalleesROSat.lean | 9 +- .../Cli/M24/CliStrictPlacedPadSat.lean | 8 +- .../Cli/M24/M2ExternNoAllocFail.lean | 21 +- .../Cli/M24/MainEntryBudgetFitsInst.lean | 666 +------ .../Cli/M24/MainEntryBudgetFitsInstSat.lean | 215 ++- .../Cli/Main/HopsPlacedBudget.lean | 4 +- .../SignalSession/Cli/Main/IoHooksPlaced.lean | 9 +- .../Cli/Main/Proofs/AddressA1Placed.lean | 15 - .../Main/Proofs/AddressA1PlacedBudget.lean | 14 +- .../Cli/Main/Proofs/AllocFsA1Placed.lean | 30 +- .../Main/Proofs/AllocFsA1PlacedBudget.lean | 33 +- .../Main/Proofs/AllocFsA1PlacedBudgetSat.lean | 22 +- .../Cli/Main/Proofs/AllocFsSitesPlaced.lean | 28 - .../Main/Proofs/AllocFsSitesPlacedBudget.lean | 32 +- .../Main/Proofs/CallSitesPlacedBudget.lean | 10 +- .../Main/Proofs/CliSlotCalleesInstPlaced.lean | 112 +- .../CliSlotCalleesInstPlacedBudgetAux.lean | 89 +- .../CliSlotCalleesInstPlacedBudgetAuxSat.lean | 26 +- ...CliSlotCalleesInstPlacedBudgetCallees.lean | 20 +- .../CliSlotCalleesInstPlacedBudgetSeams.lean | 20 +- .../Cli/Main/Proofs/KeepsFs.lean | 22 + .../Cli/Main/Proofs/M2PlacedBudget.lean | 108 +- .../Cli/Main/Proofs/M2PlacedBudgetSat.lean | 8 +- .../Cli/Main/Proofs/MainAllocExtPlaced.lean | 17 - .../Cli/Main/Proofs/MainInstAllPlaced.lean | 101 +- .../Cli/Main/Proofs/MainOkA1Placed.lean | 70 +- .../Cli/Main/Proofs/MainOkA1PlacedSat.lean | 7 +- .../Cli/Main/Proofs/RunInstPlaced.lean | 15 +- .../Cli/Main/Proofs/StrlenUtf8A1.lean | 2 +- .../Cli/Main/Proofs/StrlenUtf8A1Placed.lean | 24 - .../Cli/Run/Compose/Arms/AllPlacedBudget.lean | 4 +- .../Run/Compose/RunOkNoMatchPlacedBudget.lean | 4 +- .../Compose/RunOkNoMatchPlacedBudgetFd.lean | 20 +- .../SignalSession/Cli/Run/Glue/BcmpHook.lean | 10 +- .../Cli/Run/Glue/BcmpHookPlaced.lean | 330 ++-- .../Cli/Run/Glue/FsTracedPlaced.lean | 27 +- .../Over/DecPkD2cCanonKitsPlacedBudgetFd.lean | 2 +- .../DecPkD2cCanonPollPathBPlacedBudgetFd.lean | 24 +- ...ecPkD2cCanonStage2OverBPlacedBudgetFd.lean | 24 +- ...DecPkD2cCanonStage2OverPlacedBudgetFd.lean | 6 +- ...ecPkD2cCanonStage2PathAPlacedBudgetFd.lean | 36 +- .../Over/DecPkD2cSlotOkAtPlacedBudget.lean | 16 +- .../Over/Stage2OverInstPlaced.lean | 176 +- .../Over/Stage2OverInstPlacedBudget.lean | 58 +- .../Over/Stage2OverInstPlacedBudgetAux.lean | 28 +- .../Over/Stage4OverInstPlaced.lean | 4 +- .../Over/Stage4OverInstPlacedBudget.lean | 2 +- .../Over/StagesOverInstPlaced.lean | 4 +- .../DecryptPrekey/Poll/ClosurePlaced.lean | 25 +- .../Poll/ClosureStagesStmtPlacedBudget.lean | 8 +- .../Poll/ClosureTrustedP1PlacedBudgetAux.lean | 24 +- .../Poll/ClosureUntrustedPlacedBudget.lean | 22 +- .../Poll/StagesInst/MatchedInstPlaced.lean | 42 +- .../StagesInst/MatchedInstPlacedBudget.lean | 23 +- .../ResponderCanonicalPlacedBudgetSat.lean | 96 + .../Poll/StagesInst/Stage1InstPlaced.lean | 4 +- .../Poll/StagesInst/Stage2V1BasePlaced.lean | 91 +- .../StagesInst/Stage2V1BasePlacedBudget.lean | 77 +- .../Stage2V1BasePlacedBudgetBbSat.lean | 31 +- .../Stage2V1BasePlacedBudgetSat.lean | 86 +- .../Poll/StagesInst/Stage2V1InstPlaced.lean | 145 +- .../Stage2V1InstPlacedBudgetAux.lean | 28 +- .../Stage2V1KitsPlacedBudgetAux.lean | 2 +- .../StagesInst/Stage3GenInstPlacedBudget.lean | 8 +- .../Poll/StagesInst/Stage4V1InstPlaced.lean | 47 +- .../StagesInst/Stage4V1InstPlacedBudget.lean | 76 +- .../Cli/Run/Proofs/Initiate/HooksPlaced.lean | 18 +- .../Proofs/Initiate/HooksPlacedBudget.lean | 80 +- .../Initiate/HooksPlacedBudgetBbSat.lean | 142 +- .../Run/Proofs/Initiate/HooksPlacedSat.lean | 12 +- .../Proofs/Initiate/LocalCalleesPlaced.lean | 11 +- .../Initiate/LocalCalleesPlacedBudget.lean | 67 +- .../Initiate/LocalCalleesPlacedBudgetSat.lean | 99 +- .../Initiate/SetUnackEpochPlacedBudgetFd.lean | 52 +- .../EntryAndRegIdPlacedBudget.lean | 5 +- .../DecryptLemmas/InnerInstPlaced.lean | 14 +- .../DecryptLemmas/InnerInstPlacedBudget.lean | 11 +- .../InnerInstPlacedBudgetFd.lean | 69 +- .../Run/Proofs/Ratchet/DecryptLemmas/Top.lean | 4 - .../DecryptLemmas/TopPlacedBudget.lean | 4 - .../Proofs/Ratchet/EncryptSlotWithFds.lean | 35 +- .../SignalSession/Cli/Run/Skeleton.lean | 2 +- .../SignalSession/Cli/Run/SkeletonPlaced.lean | 27 +- .../Cli/Run/SkeletonPlacedBudget.lean | 43 +- .../Cli/Run/Slots/CliHookSat.lean | 10 +- .../Cli/Run/Slots/CliHookSatPlaced.lean | 285 +-- .../Cli/Run/Slots/CliHookSatPlacedBudget.lean | 333 ++-- .../Cli/Run/Slots/ExtraGhostSpecs.lean | 859 +++++++++ .../Run/Slots/ExtraRowSpecs/BcmpRowSpec.lean | 58 + .../Slots/ExtraRowSpecs/BlackBoxRowSpec.lean | 58 + .../ExtraRowSpecs/DurationSinceRowSpec.lean | 87 + .../Slots/ExtraRowSpecs/FromUtf8RowSpec.lean | 61 + .../Slots/ExtraRowSpecs/MemmoveRowSpec.lean | 67 + .../Slots/ExtraRowSpecs/MemrchrRowSpec.lean | 91 + .../SharedSecretDropRowSpec.lean | 51 + .../StaticSecretDropRowSpec.lean | 51 + .../Slots/ExtraRowSpecs/StrlenRowSpec.lean | 70 + .../Slots/ExtraRowSpecs/TimeAddRowSpec.lean | 68 + .../Cli/Run/Slots/PureExtraGhosts.lean | 612 ++++++ .../Cli/Run/Slots/SetUnackEpochPlaced.lean | 16 +- .../Run/Slots/SetUnackEpochPlacedBudget.lean | 102 +- .../Proofs/SignalSession/Cli/SpecsPlaced.lean | 16 +- .../SignalSession/Cli/SpecsPlacedBudget.lean | 18 +- .../Cli/SpqrChainPlacedInst.lean | 22 +- .../Cli/SpqrChainPlacedInstBudget.lean | 49 +- .../Cli/SpqrDecodeStatePlacedInst.lean | 6 +- .../Cli/SpqrInitialStatePlacedInst.lean | 3 +- .../Cli/SpqrSendCoinsPlacedInst.lean | 58 +- .../Cli/SpqrSendCoinsPlacedInstBudget.lean | 33 +- .../Cli/SpqrSendCoinsPlacedInstBudgetSat.lean | 12 +- .../Cli/SpqrStatesFromPbGateU2Bridge.lean | 8 +- .../Cli/SpqrStatesIntoPbPlacedInst.lean | 11 +- .../Cli/SpqrV1PlacedSeamsInst.lean | 44 +- .../Cli/Store/IdSavePoll/BranchesPlaced.lean | 42 + .../IdSavePoll/BranchesPlacedBudget.lean | 48 + .../IdSavePoll/BranchesPlacedBudgetFd.lean | 59 + .../Cli/Store/IdSavePoll/Layout.lean | 3 + .../Cli/Store/IdSavePoll/SymPlaced.lean | 125 +- .../Cli/Store/IdSavePoll/SymPlacedBudget.lean | 238 ++- .../Store/IdSavePoll/SymPlacedBudgetFd.lean | 248 ++- .../Cli/Store/IdSavePollPlaced.lean | 108 ++ .../Cli/Store/IdSavePollPlacedBudget.lean | 253 ++- .../Cli/Store/IdSavePollPlacedBudgetFd.lean | 253 ++- .../Cli/Store/IdTrustPoll/SymPlaced.lean | 100 +- .../Store/IdTrustPoll/SymPlacedBudget.lean | 150 +- .../Cli/Store/IdTrustPollPlaced.lean | 101 + .../Cli/Store/IdTrustPollPlacedBudget.lean | 201 ++ .../Cli/Store/SerGlueXCliPlaced.lean | 5 +- .../Cli/Store/SerGlueXCliPlacedBudget.lean | 5 +- .../Cli/Store/ShimCommonPlaced.lean | 18 - .../Cli/Store/ShimCommonPlacedBudget.lean | 27 +- .../SpecLemmas/SignalSession/CliRunFixed.lean | 19 +- .../SignalSession/CliSymtabGhost.lean | 4 +- .../SignalSession/ElfBcmpEntryGuard.lean | 314 ++++ .../ElfF3Relink/Lib2LayoutFacts.lean | 604 ++++++ .../ElfF3Relink/StartupStatics.lean | 61 +- .../SignalSession/ElfFob2W2InnerLinked.lean | 19 +- .../SignalSession/ElfMemmoveEntryGuard.lean | 335 ++++ .../ElfSlicesPqOomC2EntryGuardLr.lean | 397 ++++ .../SignalSession/ElfSlicesPqOomH2Asm.lean | 83 +- .../ElfSlicesPqOomH2Branch2.lean | 126 +- .../ElfSlicesPqOomH2ExecFrozenWire.lean | 737 +------- .../ElfSlicesPqOomH2ExecFrozenWireExtra.lean | 411 ++++ .../ElfSlicesPqOomH2KAssembly.lean | 103 +- .../ElfSlicesPqOomH2KBridges.lean | 5 +- .../ElfSlicesPqOomH2KCliNoOom.lean | 172 +- .../ElfSlicesPqOomH2KCliNoOomSat.lean | 201 ++ .../ElfSlicesPqOomH2KD3MainLiftGlue.lean | 29 +- .../ElfSlicesPqOomH2KD3MainLiftGlueSat.lean | 49 +- .../SignalSession/ElfSlicesPqOomH2KHooks.lean | 849 ++++++--- .../ElfSlicesPqOomH2KMainEntryFits.lean | 119 +- .../ElfSlicesPqOomH2KMainEntryFitsSat.lean | 102 +- .../ElfSlicesPqOomH2KMemcpy.lean | 24 +- .../ElfSlicesPqOomH2KMemset.lean | 126 +- .../ElfSlicesPqOomH2KNarrowR1.lean | 127 +- .../ElfSlicesPqOomH2KSlot463.lean | 43 +- .../ElfSlicesPqOomH2KSlot464.lean | 47 +- .../ElfSlicesPqOomH2KSlot464Cal.lean | 12 +- .../ElfSlicesPqOomH2KSlot464Send.lean | 6 +- .../ElfSlicesPqOomH2KSlot520Canon.lean | 58 +- .../ElfSlicesPqOomH2KSlot520PathB.lean | 2 +- .../ElfSlicesPqOomH2KSlot520VmPoll.lean | 3 +- .../ElfSlicesPqOomH2KSpineA.lean | 19 +- .../ElfSlicesPqOomH2KSpineB.lean | 3 +- .../ElfSlicesPqOomH2KWitness.lean | 7 +- .../SignalSession/ElfSlicesPqOomPlacedG.lean | 10 +- .../ElfSlicesPqOomPlacedInst.lean | 33 +- .../SignalSession/ElfStrlenEntryGuard.lean | 371 ++++ .../SignalSession/ElfTopJoinPathB.lean | 4 +- .../SignalSession/Hole3W1InnerTight.lean | 26 +- .../SignalSession/Hole3W2InnerTight.lean | 34 +- .../SignalSession/Hole3W3VerifySigAux.lean | 464 +++-- .../SignalSession/Hole3W3VerifySigBbSat.lean | 101 + .../SignalSession/Hole3W4DecPkR2.lean | 64 +- .../SignalSession/Hole3W4DecPkWire.lean | 23 +- .../SignalSession/Hole3W4DecPkWireStep2.lean | 14 +- .../SignalSession/ValidMatchDecPkSlot.lean | 3 +- .../ValidMatchDecPkSlotSeqFree.lean | 3 +- .../SignalSession/Wp4LayoutGen.lean | 112 +- .../SpqrV1/Alloc/VecDequeGrowBudget.lean | 263 ++- .../SpqrV1/Alloc/VecDequeGrowBudgetAux.lean | 47 +- .../Poly/AddChunk/LoopPlacedBudget.lean | 57 +- .../Poly/AddChunk/ProofPlacedBudget.lean | 13 +- .../Poly/AddChunk/ProofPlacedBudgetAux.lean | 7 +- .../SpqrV1/Poly/AddChunk/ProofXBudget.lean | 29 +- .../DecoderPb/FromPbExitPlacedBudget.lean | 6 +- .../DecoderPb/FromPbInnerPlacedBudget.lean | 58 +- .../DecoderPb/FromPbOuterPlacedBudget.lean | 40 +- .../Poly/DecoderPb/FromPbProofBudget.lean | 16 +- .../FromPb/DecoderFromPbClPlacedBudget.lean | 16 +- .../SpqrV1/States/FromPb/TopPlacedBudget.lean | 21 +- .../States/FromPb/TopPlacedTightBudgetR.lean | 18 +- .../Leaves/AddChunkCl1PlacedBudget.lean | 35 +- .../Leaves/AddChunkCl1PlacedBudgetAux.lean | 7 +- .../States/Leaves/LeavesTopPlacedBudget.lean | 54 +- .../Leaves/LeavesTopPlacedBudgetSat.lean | 24 +- .../SpqrV1/States/Recv/TopPlacedBudget.lean | 6 +- .../States/Recv/TopPlacedBudgetSat.lean | 8 +- .../Decrypt/DhCommitMainBudget.lean | 22 +- .../Decrypt/DhCommitMainBudgetCore.lean | 4 +- .../Decrypt/DhCommitMainBudgetStep4.lean | 32 +- .../TripleRatchet/Decrypt/DhStepBudget.lean | 32 +- .../Specifications/LibsignalSession.lean | 8 +- .../LibsignalSpqrV1/Guards.lean | 2 +- .../LibsignalTripleRatchet.lean | 10 +- .../SignalSession/CliBinaryPq.lean | 59 +- .../Specifications/SignalSession/CliElf.lean | 6 +- .../Specifications/SignalSession/CliRun.lean | 76 +- .../Impl/MutantLink/WalkSpecAnyOrder.lean | 144 ++ .../Impl/MutantLink/WeakStateMallocng.lean | 47 +- .../Impl/SmallSubgroup/BaseData.lean | 33 +- .../Impl/SmallSubgroup/BaseFull.lean | 24 +- .../Impl/SmallSubgroup/BaseLines0.lean | 603 +++--- .../Impl/SmallSubgroup/BaseLines1.lean | 603 +++--- .../Impl/SmallSubgroup/BaseLines10.lean | 598 +++--- .../Impl/SmallSubgroup/BaseLines11.lean | 597 +++--- .../Impl/SmallSubgroup/BaseLines12.lean | 597 +++--- .../Impl/SmallSubgroup/BaseLines13.lean | 597 +++--- .../Impl/SmallSubgroup/BaseLines14.lean | 596 +++--- .../Impl/SmallSubgroup/BaseLines15.lean | 596 +++--- .../Impl/SmallSubgroup/BaseLines2.lean | 602 +++--- .../Impl/SmallSubgroup/BaseLines3.lean | 601 +++--- .../Impl/SmallSubgroup/BaseLines4.lean | 602 +++--- .../Impl/SmallSubgroup/BaseLines5.lean | 601 +++--- .../Impl/SmallSubgroup/BaseLines6.lean | 600 +++--- .../Impl/SmallSubgroup/BaseLines7.lean | 599 +++--- .../Impl/SmallSubgroup/BaseLines8.lean | 599 +++--- .../Impl/SmallSubgroup/BaseLines9.lean | 599 +++--- .../Impl/SmallSubgroup/BaseScalarsHooks.lean | 6 +- .../Disproofs/Impl/SmallSubgroup/Call0.lean | 282 +-- .../Disproofs/Impl/SmallSubgroup/Call1.lean | 92 +- .../Disproofs/Impl/SmallSubgroup/Call2.lean | 174 +- .../Impl/SmallSubgroup/F3LayoutData.lean | 255 ++- .../SmallSubgroupMallocng.lean | 37 +- .../Disproofs/Impl/WeakState/BaseData.lean | 33 +- .../Disproofs/Impl/WeakState/BaseFull.lean | 24 +- .../Disproofs/Impl/WeakState/BaseLines0.lean | 603 +++--- .../Disproofs/Impl/WeakState/BaseLines1.lean | 601 +++--- .../Disproofs/Impl/WeakState/BaseLines10.lean | 597 +++--- .../Disproofs/Impl/WeakState/BaseLines11.lean | 596 +++--- .../Disproofs/Impl/WeakState/BaseLines12.lean | 596 +++--- .../Disproofs/Impl/WeakState/BaseLines13.lean | 596 +++--- .../Disproofs/Impl/WeakState/BaseLines14.lean | 596 +++--- .../Disproofs/Impl/WeakState/BaseLines15.lean | 596 +++--- .../Disproofs/Impl/WeakState/BaseLines2.lean | 600 +++--- .../Disproofs/Impl/WeakState/BaseLines3.lean | 600 +++--- .../Disproofs/Impl/WeakState/BaseLines4.lean | 600 +++--- .../Disproofs/Impl/WeakState/BaseLines5.lean | 600 +++--- .../Disproofs/Impl/WeakState/BaseLines6.lean | 599 +++--- .../Disproofs/Impl/WeakState/BaseLines7.lean | 598 +++--- .../Disproofs/Impl/WeakState/BaseLines8.lean | 597 +++--- .../Disproofs/Impl/WeakState/BaseLines9.lean | 598 +++--- .../Impl/WeakState/BaseScalarsHooks.lean | 6 +- .../Disproofs/Impl/WeakState/Call0.lean | 198 +- .../Disproofs/Impl/WeakState/Call1.lean | 92 +- .../Disproofs/Impl/WeakState/Call2.lean | 198 +- .../Disproofs/Impl/WeakState/Call3.lean | 188 +- .../Disproofs/Impl/WeakState/Call4.lean | 198 +- .../Disproofs/Impl/WeakState/Call5.lean | 92 +- .../Disproofs/Impl/WeakState/Call6.lean | 188 +- .../Impl/WeakState/F3LayoutData.lean | 256 ++- .../Impl/WeakState/MutantLinkData.lean | 16 +- .../Disproofs/Impl/ckpt_chunk_plan.json | 20 +- .../Proofs/CliExec/CompHooks0Placed.lean | 3 - .../Proofs/CliExec/FastHooks.lean | 8 +- .../Proofs/CliExec/FastHooksPlaced.lean | 17 +- .../Proofs/CliExec/FastHooksPlacedSound.lean | 21 +- .../Proofs/Common443/CompI0Laws.lean | 3 - .../DefsI0.lean | 3 - Symbolic/BugInjection/README.md | 26 +- .../Tests/Refinement/Cli/ExternWitness.lean | 3 - .../Composed/Cli/ExternWitness.lean | 3 - .../Composed/Cli/RefinementElf.lean | 1 + .../scripts/machine_free_allow_proofdeps.txt | 5 +- .../machine_free_allow_proofdeps_q1.txt | 3 +- comparator/README.md | 151 +- docs/PAPER_MAP.md | 6 +- docs/Symbolic/PAPER_DIFFERENCES.md | 4 +- scripts/cli-elf-stock | 1656 ++++++++++++++++- scripts/stock-pin/alink_check.py | 959 +++++++++- scripts/stock-pin/elf_inspect.py | 569 +++++- .../libsignal-session/cli-elf/inputs.lock | 79 - .../libsignal-session/cli-elf/main_cli.c | 16 - .../cli-elf/musl_string_native.toml | 136 -- .../cli-elf/signal_session_io.S | 454 ----- .../libsignal-session/cli-elf/stock.ld | 42 +- .../cli-elf/stock/inputs_stock_stdbin.lock | 52 +- .../cli-elf/stock/m4_stock.lock | 699 +++++-- .../cli-elf/stock/stock_c2.ld | 206 ++ .../cli-elf/string-include/features.h | 20 - .../cli-elf/string-include/string.h | 30 - .../libsignal-session/cli/rt/translation.toml | 131 ++ 457 files changed, 43815 insertions(+), 22122 deletions(-) create mode 100644 LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Kits/StageP2PurePlacedBbSat.lean create mode 100644 LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Matched/M2TopPlacedBudgetSat.lean create mode 100644 LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Matched/M2TopPlacedSat.lean create mode 100644 LibsignalBinary/Proofs/E2E/Pqxdh/Shared/VerifySignaturePlacedA2Sat.lean create mode 100644 LibsignalBinary/Proofs/E2E/Pqxdh/Shared/VerifySignaturePlacedBSat.lean create mode 100644 LibsignalBinary/Proofs/E2E/Pqxdh/Shared/VerifySignaturePlacedSat.lean create mode 100644 LibsignalBinary/Proofs/PeakBudget/CliNoOomOfFitsEnvGhostSat.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/BcmpGhostReplays.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/BlackBoxGhostReplays.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2EntryGuard.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/CodeSubslice.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/Dalek.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/DalekRows.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/DurCst16.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/FromUtf8.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/FromUtf8Row.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/LibcRows.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/MemmoveRow.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/MemrchrRow.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/RowCommon.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/T4Witness.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/Time.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/TimeAddPanic.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/DurationSinceGhostReplays.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/ExtraGhostReplay.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/FromUtf8GhostReplays.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/MemmoveExtraReplays.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/MemrchrExtraReplays.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/SharedSecretDropGhostReplays.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/StaticSecretDropGhostReplays.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/StrlenGhostReplays.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/TimeAddGhostReplays.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraGhostSpecs.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/BcmpRowSpec.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/BlackBoxRowSpec.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/DurationSinceRowSpec.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/FromUtf8RowSpec.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/MemmoveRowSpec.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/MemrchrRowSpec.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/SharedSecretDropRowSpec.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/StaticSecretDropRowSpec.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/StrlenRowSpec.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/TimeAddRowSpec.lean create mode 100644 LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/PureExtraGhosts.lean create mode 100644 LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfBcmpEntryGuard.lean create mode 100644 LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfF3Relink/Lib2LayoutFacts.lean create mode 100644 LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfMemmoveEntryGuard.lean create mode 100644 LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomC2EntryGuardLr.lean create mode 100644 LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2ExecFrozenWireExtra.lean create mode 100644 LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KCliNoOomSat.lean create mode 100644 LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfStrlenEntryGuard.lean create mode 100644 LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W3VerifySigBbSat.lean create mode 100644 Symbolic/BugInjection/Disproofs/Impl/MutantLink/WalkSpecAnyOrder.lean delete mode 100644 third_party/libsignal/libsignal-session/cli-elf/inputs.lock delete mode 100644 third_party/libsignal/libsignal-session/cli-elf/main_cli.c delete mode 100644 third_party/libsignal/libsignal-session/cli-elf/musl_string_native.toml delete mode 100644 third_party/libsignal/libsignal-session/cli-elf/signal_session_io.S create mode 100644 third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld delete mode 100644 third_party/libsignal/libsignal-session/cli-elf/string-include/features.h delete mode 100644 third_party/libsignal/libsignal-session/cli-elf/string-include/string.h create mode 100644 third_party/libsignal/libsignal-session/cli/rt/translation.toml diff --git a/Computational/Tests/Guards/CliPqAllocPremiseGuard.lean b/Computational/Tests/Guards/CliPqAllocPremiseGuard.lean index 91160fe4e..5cbfbfa68 100644 --- a/Computational/Tests/Guards/CliPqAllocPremiseGuard.lean +++ b/Computational/Tests/Guards/CliPqAllocPremiseGuard.lean @@ -20,9 +20,9 @@ public import VerifiedLibraries.Mallocng.Proofs.BridgeHelpers by default `lake build`) pinning: * K2 `svc` / `overrides` agreement on `Placed.cliProgPlacedSig mpl mmpl W` (`Syscall.standard`, `overrides = fun _ => none`), ensuring `MallocngSvcValid (Placed.cliProgPlacedSig mpl mmpl W).svc`. -* K5 `cliHookTablePlaced` row count (`37`, whose exact `37`-key list in - `cliHookTablePlaced_keys_guard` also fails closed if a `::clone`, `memset` or - `memcpy` row is re-added) and absence of all `9` `cliDehookedSymsPlaced` names from both +* K5 `cliHookTablePlaced` row count (`27`, whose exact `27`-key list in + `cliHookTablePlaced_keys_guard` also fails closed if a `::clone`, `memset`, + `memcpy` or C2 row is re-added) and absence of all `19` `cliDehookedSymsPlaced` names from both `isCliPanicSymbolPlaced` and `cliHookTablePlaced` (`cliExternsPlacedSig mmpl W sym = none`). * `cliRunPlacedSig_eq_none_of_reachesOOM_guard`: reaching `.OutOfMemory` (`CliReachesOOMPlaced`) forces `Placed.cliRunPlacedSig mpl mmpl elf W i = none`. @@ -68,7 +68,7 @@ theorem cliProgPlacedSig_mallocngSvcValid_guard VerifiedLibraries.Mallocng.MallocngSvcValid (Placed.cliProgPlacedSig mpl mmpl W).svc := VerifiedLibraries.Mallocng.Proofs.mallocngSvcValid_standard -/-- Expected ordered `37`-symbol key list of `cliHookTablePlaced`. -/ +/-- Expected ordered `27`-symbol key list of `cliHookTablePlaced`. -/ def cliHookTableKeysExpected : List String := ["_RNvNtCsbvWyylYiyxg_4sha26sha51211compress512", "_RNvMs5_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPoint10to_edwards", @@ -88,44 +88,36 @@ def cliHookTableKeysExpected : List String := "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental26decapsulate_compressed_key", "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes", "_RNvCs65XVORQObL2_12libcrux_hmac4hmac", - "memmove", - "bcmp", - "strlen", lsWriteFileSym, lsWriteStdoutSym, - lsMemrchrSym, - lsFromUtf8Sym, lsFmtWriteSym, lsFormatInnerSym, - lsDurationSinceSym, - lsTimeAddSym, - lsBlackBoxSym, lsCompress256Sym, lsAesEncSym, lsAesDecSym, lsPubFromSecretSym, - lsDiffieHellmanSym, - lsStaticSecretDropSym, - lsSharedSecretDropSym] + lsDiffieHellmanSym] -/-- Guard (GK2 K5): `cliHookTablePlaced` has the exact `37` expected symbol keys in order. -/ +/-- Guard (GK2 K5): `cliHookTablePlaced` has the exact `27` expected symbol keys in order. -/ theorem cliHookTablePlaced_keys_guard (mmpl : Obj.MultiPlacement) (W : CliHooks) : (cliHookTablePlaced mmpl W).map Prod.fst = cliHookTableKeysExpected := rfl -/-- Guard (GK2 K5): `cliHookTablePlaced` has `37` rows (`18` PQXDH/SPQR + `19` base/IO/crypto). -/ +/-- Guard (GK2 K5): `cliHookTablePlaced` has `27` rows (`18` PQXDH/SPQR + `9` base/IO/crypto). -/ theorem cliHookTablePlaced_length_guard (mmpl : Obj.MultiPlacement) (W : CliHooks) : - (cliHookTablePlaced mmpl W).length = 37 := + (cliHookTablePlaced mmpl W).length = 27 := rfl -/-- Guard (GK2 K2): none of the `9` de-hooked symbol names in `cliDehookedSymsPlaced` is a panic symbol (`isCliPanicSymbolPlaced`). -/ +/-- Guard (GK2 K2): none of the `19` de-hooked symbol names in `cliDehookedSymsPlaced` is a panic symbol (`isCliPanicSymbolPlaced`). -/ theorem cliDehookedSymsPlaced_not_panic_guard : (cliDehookedSymsPlaced.all fun s => !isCliPanicSymbolPlaced s) = true := by simp [cliDehookedSymsPlaced, isCliPanicSymbolPlaced, cliPanicSymbolsPlaced, Rust.isPanicSymbol, lsRustNoAllocShimSymCli, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, - lsRustAllocZeroedSymCli, lsReadFileSym, lsReadStdinSym] + lsRustAllocZeroedSymCli, lsReadFileSym, lsReadStdinSym, + lsMemrchrSym, lsFromUtf8Sym, lsDurationSinceSym, lsTimeAddSym, + lsBlackBoxSym, lsStaticSecretDropSym, lsSharedSecretDropSym] private theorem not_panic_of_all {s : String} {l : List String} (hall : (l.all fun x => !isCliPanicSymbolPlaced x) = true) (hmem : s ∈ l) : @@ -153,7 +145,10 @@ theorem cliExternsPlacedSig_dehooked_eq_none_guard · rfl · rw [cliHookTablePlaced_keys_guard] simp only [cliDehookedSymsPlaced, List.mem_cons, List.not_mem_nil, or_false] at hsym - rcases hsym with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> decide +kernel + rcases hsym with + rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | + rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> + decide +kernel theorem cliRunPlacedSig_eq_none_of_reachesOOM_guard {mpl mmpl : Obj.MultiPlacement} {elf : ElfImage} {W : CliHooks} {i : Inputs} diff --git a/Computational/docs/DEVIATIONS.md b/Computational/docs/DEVIATIONS.md index 15f9bbc6c..febc47aa6 100644 --- a/Computational/docs/DEVIATIONS.md +++ b/Computational/docs/DEVIATIONS.md @@ -1324,7 +1324,7 @@ effect: out of scope - Each valid pair of multi-block placements `mpl` (`libsignalSessionLib.LinkedAt bytes mpl`) and `mmpl` (`VerifiedLibraries.mallocngLib.LinkedAt bytes mmpl`, `Placed.CliElfCodeMatchesPlaced mpl mmpl elf`) places code and data where `elf` maps them (for the - pinned static non-PIE ELF `cliElfBytes`, linked with stock `ld.lld` under `third_party/libsignal/libsignal-session/cli-elf/stock.ld` at base `0x400000`, 4 + pinned static non-PIE ELF `cliElfBytes`, linked with stock `ld.lld` under `third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld` at base `0x400000`, 4 `PT_LOAD` segments). The process gets an 8 MiB stack with its top at `0x7fff_ffff_0000` (DEV-CLI7), the engine's default auxiliary vector (`AT_RANDOM` = 16 zero bytes, `AT_HWCAP` = `0x3`), `mmap` slots from `0x6000_0000_0000` (`SignalSession/Process.lean`), and `brk` starting at @@ -1340,7 +1340,7 @@ effect: out of scope - The claim is about the ELF pinned by SHA-256 in `CliElf.lean` (`.GeneratedLean/cli-elf/libsignal-cli.elf`): libsignal v0.105.4's `libsignal-cli` CLI built from source by `scripts/cli-elf-stock --stdbin --build` with stock LLVM `ld.lld` (`22.1.8`, `--no-relax`, `-static`, `-no-pie`, `--gc-sections`, - `-T third_party/libsignal/libsignal-session/cli-elf/stock.ld`, pinned in + `-T third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld`, which `scripts/cli-elf-stock` renders from `cli-elf/stock.ld` (`_render_c2_stock_ld`: C2 moves the `4` libc rows `memmove`, `memcmp`, `bcmp`, `strlen` to the `.text.b_pre` tail below `e_entry`) and fails on any drift, pinned in `third_party/libsignal/libsignal-session/cli-elf/stock/inputs_stock_stdbin.lock`) from the compiled `rustc 1.98.1` crate objects and trimmed `alloc`/`std` sysroot members (`translation.toml` and `cli/io/translation.toml`: release profile @@ -1437,12 +1437,12 @@ effect: out of scope - Under AAPCS64 (the Arm 64-bit procedure call standard) a callee may clobber all caller-saved state: `x0`–`x18`, the caller-saved SIMD/FP (vector / floating-point) registers and the NZCV condition flags. Each hook of `cliHookTablePlaced` writes only what its definition names and keeps - every other register (`cliBcmpHook` writes only `x0`, `durationSinceExactHook` only its 24 - result bytes), so a compiled caller that wrongly relied on a caller-saved register surviving a + every other register (e.g. `writeStdoutHook` writes only `x0` and + the trace), so a compiled caller that wrongly relied on a caller-saved register surviving a hooked call would still verify. - Argued, not proved: correct compiler output never relies on caller-saved registers across a call; every reached call site keeps its live values in callee-saved registers and reads only the - outputs (`bcmp`: `cbnz w0`). + outputs. - Future work that would make it machine-checked: have these hooks havoc (overwrite with arbitrary values) every caller-saved register, the values drawn from the hook choice `W`, and re-run the proofs; the result would then hold for every AAPCS64-conforming libc (still for one ELF, @@ -1517,24 +1517,23 @@ scope - The UUID parser is not a hook: `::try_parse` is in the image (the whole `uuid` crate is compiled in) and is verified against the trusted model `uuidTryParse` (`LibsignalBinary/Specifications/LibsignalTripleRatchetRepr.lean`, a transcription of uuid 1.26.1 `src/parser.rs`). -- Like the primitives, `bcmp` (the libc byte compare LLVM emits for byte-slice `==`) is hooked in - `cliHookTablePlaced` rather than executed in the placed CLI proofs (on the stock `ld.lld` - ELF its 1-word `b memcmp` wrapper and `memcmp` are linked from `rustc 1.98.1`'s - `self-contained/libc.a`, while the fixed-image session export still gives it a zero-filled stub). - Its contract is trusted: `CliHooks.bcmp` is any result whose low 32 bits are zero exactly when the - strings are equal (`bcmp_ok`). It is universally quantified, not fixed, because the nonzero value - is libc dependent and AAPCS64 leaves the upper 32 bits of an `int` in `x0` unspecified - (`LibsignalBinary/Specifications/SignalSession/CliRun.lean`). +- `bcmp` (the libc byte compare LLVM emits for byte-slice `==`) was a hook with a trusted contract + (`CliHooks.bcmp`: any result whose low 32 bits are zero exactly when the strings are equal, + `bcmp_ok`) until the second stock `ld.lld` cutover (C2) de-hooked it: the run now executes musl's + `bcmp` (and the `memcmp` it tail-calls) from the pinned ELF, and the `CliHooks` fields `bcmp` / + `bcmp_ok` / `utf8Err` were removed from the structure (D-C2b; + `LibsignalBinary/Specifications/SignalSession/CliRun.lean`). - Alongside the cryptographic primitives, the CLI's hook table `cliHookTablePlaced` - (`LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean`, `37` rows: `18` PQXDH/SPQR + `19` + (`LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean`, `27` rows: `18` PQXDH/SPQR + `9` base/IO/crypto, with hook definitions in `CliRun.lean` and retired fixed-image `cliHookTable` in `CliRunFixed.lean`) keeps `core::fmt::write` and `alloc::fmt::format::format_inner` (error-message formatting) hooked in this release by design (memory safety proved post-release together with the - cryptographic primitives), and hooks the non-crypto rows not yet de-hooked: the two write functions - `write_file` and `write_stdout` of the I/O crate (`libsignal_cli_io`), `memmove` (`hookMemmove := - hookMemcpy`), `strlen`, `core::slice::memchr::memrchr`, `core::str::converts::from_utf8`, - `::duration_since`, `>::add`, `subtle::black_box`, and the - two X25519 `Drop::drop` zeroize hooks. `read_file`, `read_stdin` (`1 MiB` stdin cap, `2 MiB` file + cryptographic primitives), and hooks the non-crypto rows not yet de-hooked: the two write + functions `write_file` and `write_stdout` of the I/O crate (`libsignal_cli_io`). The second stock + `ld.lld` cutover (C2) de-hooked `memmove`, `bcmp`, `strlen`, `core::slice::memchr::memrchr`, + `core::str::converts::from_utf8`, `::duration_since`, `>::add`, `subtle::black_box`, and the two X25519 `Drop::drop` destructors, whose + linked code runs. `read_file`, `read_stdin` (`1 MiB` stdin cap, `2 MiB` file cap, `< 4096`-B NUL-free paths), `memcpy`, and `memset` are no longer hooks: across `B2-TLIT` (`49 → 47`), F3 (`47 → 39`), and the stock `ld.lld` cutover (`39 → 37`, `cliHookTablePlaced_length_guard`—`9` external de-hooked symbols in `cliDehookedSymsPlaced` (`2` read, `5` `__rust_*` allocator, and @@ -3483,13 +3482,18 @@ section that puts a term in a bound (DEV-CLI17, the excused-abort term, is retir `CliSpecPqxdhNoMatch`, and `CliSpecE` (`LibsignalBinary/Proofs/SpecLemmas/SignalSession/SmDirProofDefs.lean`), and completeness proofs in `Computational/Proofs/LibsignalCli/CliCapsCompleteness.lean`). -- In the bounded-read CLI build (B2 removed the 2 `grow_one` hooks, `49 → 47`; the F3 + IO.6b cutover - removed `::clone` and `7` external de-hooked symbols, `47 → 39`; and the stock `ld.lld` - cutover removes `memcpy` and `memset`—executed as `VerifiedLibraries.mallocngLib` blocks `20` and `21` - on the stock ELF—bringing `cliDehookedSymsPlaced` to `9` external de-hooked symbols and - `cliHookTablePlaced` to `37` rows (`39 → 37`), with `libsignal_cli_io::{read_file, read_stdin}` - running their linked `lib1_0.o` code while `write_file` and `write_stdout` stay linked in `lib1_0.o` - and intercepted at entry as disclosed trusted hooks until `W-DIS0`, see DEV-CLI19): +- In the bounded-read CLI build (B2 removed the 2 `grow_one` hooks, `49 → 47`; the F3 + IO.6b + cutover removed `::clone` and `7` external de-hooked symbols, `47 → 39`; the + stock `ld.lld` cutover removed `memcpy` and `memset`—executed as `VerifiedLibraries.mallocngLib` + blocks `20` and `21` on the stock ELF—leaving `9` external de-hooked symbols and `37` rows + (`39 → 37`); and the second stock `ld.lld` cutover (C2) removes `memmove`, `bcmp`, and `strlen` + (`self-contained/libc.a`; `bcmp` tail-calls the unhooked `memcmp`) and `memrchr`, `from_utf8`, + `SystemTime::duration_since`, `>::add`, `subtle::black_box`, and the + `2` X25519 `Drop::drop` destructors (compiled Rust in the C2 `lib2_*.o` objects), bringing + `cliDehookedSymsPlaced` to `19` external de-hooked symbols and `cliHookTablePlaced` to `27` rows + (`37 → 27`), with `libsignal_cli_io::{read_file, read_stdin}` running their linked `lib1_0.o` code + while `write_file` and `write_stdout` stay linked in `lib1_0.o` and intercepted at entry as + disclosed trusted hooks until `W-DIS0`, see DEV-CLI19): - `read_stdin` caps standard input at `stdinCapBytes = 2^20` (`1,048,576` B), exiting `2` with files unchanged when `stdin.length > stdinCapBytes`; - `read_file` caps file reads at `fileCapBytes = 2^21` (`2,097,152` B), and both `read_file` and diff --git a/LibsignalBinary.lean b/LibsignalBinary.lean index 414c67716..0ec18f158 100644 --- a/LibsignalBinary.lean +++ b/LibsignalBinary.lean @@ -634,6 +634,7 @@ import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfFrozen import LibsignalBinary.Proofs.SpecLemmas.SignalSession.Hole3PksmAux import LibsignalBinary.Proofs.SpecLemmas.SignalSession.Hole3W1InnerTight import LibsignalBinary.Proofs.SpecLemmas.SignalSession.Hole3W1InnerTightGlue +import LibsignalBinary.Proofs.SpecLemmas.SignalSession.Hole3W3VerifySigBbSat import LibsignalBinary.Proofs.SpecLemmas.SignalSession.Hole3W4DecPkArmAB import LibsignalBinary.Proofs.SpecLemmas.SignalSession.Hole3W4DecPkArmC import LibsignalBinary.Proofs.SpecLemmas.SignalSession.Hole3W4DecPkArmUP diff --git a/LibsignalBinary/Cli.lean b/LibsignalBinary/Cli.lean index ccc2b0fd8..9295b581f 100644 --- a/LibsignalBinary/Cli.lean +++ b/LibsignalBinary/Cli.lean @@ -900,9 +900,11 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.F3Relink.TieSpec public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpCode public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhost public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostK +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpLrTrap public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxCode public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhost +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhostReplays public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxLrTrap public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.CliMemcpyRowSat @@ -910,9 +912,12 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DalekLrTrap public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceCode public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhost public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhostLs +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhostReplays public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceHullAux +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8Code public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8Ghost +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8GhostReplays public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8LrTrap public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8SingleBlock public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8SingleBlockRO @@ -926,12 +931,14 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyGhostLi public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyGhostLiftsPcs public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyGhostReplaysOn public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveCode +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveGhost public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveGhostK public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveGhostReplays public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveLrTrap public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveLrTrapBase public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrCode +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrExtraReplays public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrGhost public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrGhostK public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrGhostLifts @@ -942,12 +949,16 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetKeepLrO public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetLrTrap public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowMemOpsR1 +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropGhostReplays public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropLrTrap +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StaticSecretDropGhostReplays public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StripRunPanicExterns public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenCode public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhost public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostK +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenLrTrap +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddGhostReplays public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddPanicGhost public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddPanicGhostK public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords @@ -1283,6 +1294,9 @@ public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.CliBinaryPqProofDe public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.CliExternsFixed public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.CliProcessFixed public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.CliRunFixed +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfBcmpEntryGuard +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfMemmoveEntryGuard +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfStrlenEntryGuard public import LibsignalBinary.Proofs.SpqrV1.Auth.MergeBaseClPlacedBudget public import LibsignalBinary.Proofs.SpqrV1.Prost.BytesMerge.ExactPlacedBudget public import LibsignalBinary.Proofs.SpqrV1.Prost.BytesMerge.ExactPlacedBudgetAux diff --git a/LibsignalBinary/Heap/Fine/F3LayoutData.lean b/LibsignalBinary/Heap/Fine/F3LayoutData.lean index e541d6f92..5c3147417 100644 --- a/LibsignalBinary/Heap/Fine/F3LayoutData.lean +++ b/LibsignalBinary/Heap/Fine/F3LayoutData.lean @@ -18,7 +18,7 @@ public import LibsignalBinary.Heap.Iface # Generated ELF Layout & Address Table (`F3LayoutData`) **Checked by Lean.** Untrusted (`Role::Proof`): auto-generated by `gen_stock_layout.py` -from `libsignal-cli.elf` (`617448` B, `sha256 = 2f20c836342437a882b5882c34eab604e4f23b2b388c2b2a0696eeda51cddc7e`) and `stock-link.json`. +from `libsignal-cli.elf` (`619032` B, `sha256 = 50066cbd732256eb5f19f93d1d98800914336b7926225de3ebfa0bb37eca98ce`) and `stock-link.json`. Single generated definition module holding all literal ELF segment bounds, PHDR bytes, `musl` `StdBinaryLayout` addresses, `mallocngLib` `MultiLayout` addresses, and Rust allocator @@ -37,7 +37,7 @@ open LibsignalBinary.Heap (RustAllocAddrs) /-- Expected SHA-256 of `libsignal-cli.elf`. -/ def f3ElfSha256 : String := - "2f20c836342437a882b5882c34eab604e4f23b2b388c2b2a0696eeda51cddc7e" + "50066cbd732256eb5f19f93d1d98800914336b7926225de3ebfa0bb37eca98ce" /-- Compatibility alias for `f3ElfSha256`. -/ abbrev f3TrialElfSha256 : String := f3ElfSha256 @@ -45,7 +45,7 @@ abbrev f3TrialElfSha256 : String := f3ElfSha256 /-- `PT_LOAD` segment count of the stock CLI ELF. -/ def f3SegCount : Nat := 4 -/-- Sum of page-aligned `PT_LOAD` region byte lengths. -/ +/-- Sum of page-aligned `PT_LOAD` region byte lengths (`(elf.segments.map (·.bytes.length)).sum`). -/ def f3SegByteSum : Nat := 462848 /-- Word count (`bytes / 4`) of the page-aligned `rxSeg` (`seg[2]`). -/ @@ -65,7 +65,7 @@ def f3BrkStart : BitVec 64 := 0x471000#64 /-- The `7 × 56 = 392` B ELF program header table at `0x400040` (`PT_TLS` index `5` = `0/0/0/0`). -/ def f3PhdrBytes : List (BitVec 8) := [ - 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x88#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x88#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x08#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x50#8, 0x95#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x50#8, 0x95#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0xec#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0xec#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xbc#8, 0x55#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xbc#8, 0x55#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x88#8, 0x11#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xe0#8, 0x17#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x07#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x51#8, 0xe5#8, 0x74#8, 0x64#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8 + 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x88#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x88#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x08#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x96#8, 0x97#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x96#8, 0x97#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x4c#8, 0xea#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x4c#8, 0xea#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x5d#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x5d#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x88#8, 0x11#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xe0#8, 0x17#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x07#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x51#8, 0xe5#8, 0x74#8, 0x64#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8 ] /-- Concrete `StdBinaryLayout` for the stock CLI ELF. -/ diff --git a/LibsignalBinary/Heap/Fine/SpecBudgetFine.lean b/LibsignalBinary/Heap/Fine/SpecBudgetFine.lean index cbd311830..0273d64d1 100644 --- a/LibsignalBinary/Heap/Fine/SpecBudgetFine.lean +++ b/LibsignalBinary/Heap/Fine/SpecBudgetFine.lean @@ -567,12 +567,12 @@ structure FineCliB2ExternRows [LibsignalPlacement] (mpl : Obj.MultiPlacement) (W memmove : ext "memmove" = some hookMemmove memcpy : HookSat ext "memcpy" memcpySpec memcpyRO : HookSat ext "memcpy" memcpyROSpec - bcmp : ext "bcmp" = some (cliBcmpHook W.bcmp) + bcmp : ext "bcmp" = some (cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp) strlen : ext "strlen" = some strlenHook writeFile : ext writeFileName = some writeFileHook writeStdout : ext writeStdoutName = some writeStdoutHook memrchr : ext "core::slice::memchr::memrchr" = some memrchrHook - fromUtf8 : ext "core::str::converts::from_utf8" = some (fromUtf8Hook W.utf8Err) + fromUtf8 : ext "core::str::converts::from_utf8" = some (fromUtf8Hook CryptoVerification.SignalSession.cliDefaultUtf8Err) stringClone : ext stringCloneHookName = some (stringCloneHookMallocng mpl) fmtWrite : ext fmtWriteName = some CryptoVerification.E2E.fmtWriteHook0 formatInner : ext formatInnerName = some CryptoVerification.E2E.formatInnerHook0 diff --git a/LibsignalBinary/Heap/Fine/SpecBudgetFineSat.lean b/LibsignalBinary/Heap/Fine/SpecBudgetFineSat.lean index b6498062c..7c0158920 100644 --- a/LibsignalBinary/Heap/Fine/SpecBudgetFineSat.lean +++ b/LibsignalBinary/Heap/Fine/SpecBudgetFineSat.lean @@ -82,12 +82,12 @@ structure FineCliB2ExternRowsSat [LibsignalPlacement] (mpl : Obj.MultiPlacement) memmove : ext "memmove" = some hookMemmove memcpy : HookSat ext "memcpy" memcpySpec memcpyRO : HookSat ext "memcpy" memcpyROSpec - bcmp : ext "bcmp" = some (cliBcmpHook W.bcmp) + bcmp : ext "bcmp" = some (cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp) strlen : ext "strlen" = some strlenHook writeFile : ext writeFileName = some writeFileHook writeStdout : ext writeStdoutName = some writeStdoutHook memrchr : ext "core::slice::memchr::memrchr" = some memrchrHook - fromUtf8 : ext "core::str::converts::from_utf8" = some (fromUtf8Hook W.utf8Err) + fromUtf8 : ext "core::str::converts::from_utf8" = some (fromUtf8Hook CryptoVerification.SignalSession.cliDefaultUtf8Err) stringClone : ext stringCloneHookName = some (stringCloneHookMallocng mpl) fmtWrite : ext fmtWriteName = some CryptoVerification.E2E.fmtWriteHook0 formatInner : ext formatInnerName = some CryptoVerification.E2E.formatInnerHook0 diff --git a/LibsignalBinary/Heap/Fine/SpecBudgetHelpersFine.lean b/LibsignalBinary/Heap/Fine/SpecBudgetHelpersFine.lean index 8a3a1b70e..8e557ca61 100644 --- a/LibsignalBinary/Heap/Fine/SpecBudgetHelpersFine.lean +++ b/LibsignalBinary/Heap/Fine/SpecBudgetHelpersFine.lean @@ -492,7 +492,7 @@ theorem cliMemcpyRO_hookOk : HookOk hookMemcpy memcpyROSpec := hookOk_cliWithStack CryptoVerification.SpqrV1.Alloc.hookMemcpy_region_ro_trace_ok memHookStack (fun _ _ _ => rfl) (fun _ _ _ _ => rfl) (fun _ _ _ => rfl) -theorem cliBcmp_hookOk (W : CliHooks) : HookOk (cliBcmpHook W.bcmp) bcmpSpec := +theorem cliBcmp_hookOk (W : CliHooks) : HookOk (cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp) bcmpSpec := hookOk_map (s₁ := CryptoVerification.SignalSession.Cli.cliBcmpSpec) (fun x => ⟨x.a, x.aRo, x.bsA, x.b, x.bRo, x.bsB⟩) (fun _ _ => True) (fun _ => trivial) @@ -533,9 +533,9 @@ theorem cliMemrchr_hookOk : HookOk memrchrHook memrchrSpec := (fun _ _ _ hp => hp) (fun _ _ _ _ _ _ hq => hq) (fun _ _ _ _ hq => hq) (fun _ _ _ _ _ hq => hq) (fun _ _ _ _ hq => hq) -theorem cliFromUtf8_hookOk (W : CliHooks) : - HookOk (fromUtf8Hook W.utf8Err) fromUtf8Spec := - CryptoVerification.SignalSession.Cli.MainHops.fromUtf8Hook_ok extHookStack W.utf8Err +theorem cliFromUtf8_hookOk (_W : CliHooks) : + HookOk (fromUtf8Hook CryptoVerification.SignalSession.cliDefaultUtf8Err) fromUtf8Spec := + CryptoVerification.SignalSession.Cli.MainHops.fromUtf8Hook_ok extHookStack CryptoVerification.SignalSession.cliDefaultUtf8Err theorem cliBlackBox_hookOk : HookOk CryptoVerification.LibsignalSession.blackBoxHook blackBoxSpec := diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlaced.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlaced.lean index 9b45aeef4..ca594a0c7 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlaced.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlaced.lean @@ -26,7 +26,10 @@ public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.Reloc.DropChain2Placed import all Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Proofs.ConsumeMessageKey.AssemblySat +import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexSat import LibsignalBinary.Proofs.E2E.Pqxdh.DecryptPq.Model +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedSat +import LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedSat import LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.NewFromSliceSat import LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.Transfer import LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhStepBlocks @@ -37,6 +40,7 @@ import LibsignalBinary.Proofs.TripleRatchet.Getters.Drops.SignalProtocolError.Ex import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat import LibsignalBinary.Proofs.TripleRatchet.Hkdf.ExpandSat import LibsignalBinary.Proofs.TripleRatchet.Hkdf.ExtractSat +import LibsignalBinary.Proofs.TripleRatchet.Mac.VerifySat /-! # Relocatable Tight-Panic Assembly for CLI `try_decrypt_with_state::` (Block `507`) @@ -86,11 +90,44 @@ private theorem cliGhostExterns_row_placed (mmpl : Obj.MultiPlacement) (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W) sym = some f := - (RunGlue.cliGhostExterns_other gh _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans + (RunGlue.cliGhostExterns_other gh _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans (RunGlue.cliExternsPlaced_row mmpl W hrow) +private theorem cliGhostExterns_blackBoxSat_a0_sat [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) + (hOk : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.ExtraSpecOk gh) : + HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) + CryptoVerification.lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat := + LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.hookSat_cliGhostExterns_of_extraOk + gh (cliExternsPlaced mmpl W) hOk + (fun _ _ hr => hr.blackBox_budget_ok (by decide) (by decide)) + +private theorem find_receiver_chain_index_placed_ok_at_cmk_sat [LibsignalPlacement] + {H : String → Option (State → State)} (A : RustAlloc) + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : + CryptoVerification.LibsignalSession.FindIndexPlacedOk H A := by + refine subroutine_ok_outcome_intro fun ⟨p, cs, theirA, their⟩ R s0 hpc hrun hpre hsp => ?_ + have h1 : subroutine_ok ((blkPC_24).rebase (blkPl_24).base H) (lsmpl.base 26) + (withLsCodeLoaded lsmpl + (CryptoVerification.LibsignalSession.FindReceiverChainIndex.findPlacedSpec A)) := + ls_subroutine_ok_of_block (i := 24) (j := 26) + (LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexSat.find_receiver_chain_index_placed_ok_sat + A h_bb) + refine h1.mono_outcome (p, cs, theirA, their) R s0 hpc hrun ?_ hsp fun _ hout => hout + have ⟨hcl, hp⟩ := extract_withLsCodeLoaded hpre + dsimp only [withLsCodeLoaded] + rw [sepConj_assoc, sepConj_left_comm, satisfies_pure_sepConj] + refine ⟨hcl, ?_⟩ + dsimp only [CryptoVerification.LibsignalSession.FindReceiverChainIndex.findPlacedSpec, + CryptoVerification.LibsignalSession.findIndexPlacedSpec] at hp ⊢ + rw [sepConj_assoc, satisfies_pure_sepConj] at hp ⊢ + exact ⟨⟨hp.1.1, hp.1.2.1, hp.1.2.2.1, hp.1.2.2.2, hsp⟩, hp.2⟩ + theorem errTail_507_cli [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (ctl : BitVec 64) (S : SpqrModel) : @@ -138,6 +175,7 @@ theorem aesDecrypt_507_cli [LibsignalPlacement] theorem s0_507_cli [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) + (hOk : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.ExtraSpecOk gh) (ctl : BitVec 64) (S : SpqrModel) : S0PSeamPlaced ((blkPC_508).rebase (blkPl_508).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) @@ -155,10 +193,10 @@ theorem s0_507_cli [LibsignalPlacement] dsimp only [withLsCodeLoaded, Spec.keepsFs] at hq ⊢ rw [sepConj_assoc, satisfies_pure_sepConj] at hq; exact hq.2 exact CryptoVerification.Cli.LibsignalTripleRatchet.Decrypt.ChainLookup.s0_507_placed_ok_P - (CryptoVerification.E2E.Pqxdh.WireEntries.isSameAccountEqDistinct_placed_ok_at E2E.HooksE.A0 + (LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedSat.isSameAccountEqDistinct_placed_ok_at_sat E2E.HooksE.A0 (callerProg := (blkPC_508).rebase (blkPl_508).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) - (cliGhostExterns_row_placed mmpl gh W (Slots.blackBox_row_placed mmpl W)) huuid (by decide)) + (cliGhostExterns_blackBoxSat_a0_sat mmpl gh W hOk) huuid (by decide)) private theorem sub_ok_same_blk [LibsignalPlacement] {α : Type} {P Q : Program} {i : Nat} {H : LibsignalHooks} [hP : IsLsBlockProg P i H] [hQ : IsLsBlockProg Q i H] {entry : BitVec 64} {spec : Spec α} @@ -180,13 +218,17 @@ theorem s1_507_cli [LibsignalPlacement] (sub_ok_same_blk (Getters.drop_vec_chain_placed_ok (Slots.cliExternsPlaced_dealloc_sat mmpl gh W hG)))) theorem s2_507_cli [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) (ctl : BitVec 64) : + (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) + (hOk : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.ExtraSpecOk gh) + (ctl : BitVec 64) : S2SeamPlaced ((blkPC_508).rebase (blkPl_508).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) (blkPl_508).base E2E.HooksE.A0 ctl := CryptoVerification.Cli.LibsignalTripleRatchet.Decrypt.ChainLookup.findChain_507_placed_ok - (find_receiver_chain_key_placed_ok - (cliGhostExterns_row_placed mmpl gh W (Slots.blackBox_row_placed mmpl W))) + (find_receiver_chain_key_placed_ok_of_find_index + (ls_subroutine_ok_of_block + (LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexSat.find_receiver_chain_index_placed_ok_sat + E2E.HooksE.A0 (cliGhostExterns_blackBoxSat_a0_sat mmpl gh W hOk)))) private theorem new_from_slice_cro_of_cl_ro [LibsignalPlacement] {prog : Program} {F : ShaState → List (BitVec 8) → ShaState} @@ -325,24 +367,17 @@ private theorem createChain_507_cro_ok [LibsignalPlacement] have : LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat.HkdfPlacedHooksExactSat W.C.F (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) := LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat.HkdfPlacedHooksExactSat.of_a0Hooks hG - have hct207 := ls_subroutine_ok_of_block - (callerProg := (blkPC_207).rebase (blkPl_207).base - (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) - (ConsumeMessageKeyTransfer.ct_eq_ro_mem_placed_ok_withLsCodeLoaded - (cliGhostExterns_row_placed mmpl gh W (Slots.blackBox_row_placed mmpl W))) have hag40 := keys_ls_subroutine_ok_of_block_cro (callerProg := (blkPC_40).rebase (blkPl_40).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) - (CryptoVerification.LibsignalTripleRatchet.Keys.calculateAgreement_placed_ok' + (LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedSat.calculateAgreement_placed_ok_unconditional_sat (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W (Slots.cliExternsPlaced_diffieHellman_sat mmpl W)) - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_sharedSecretDrop_sat mmpl W)) - hct207 + (Slots.cliGhostExterns_sharedSecretDrop_sat gh (cliExternsPlaced mmpl W) hG.extraOk) + (cliGhostExterns_blackBoxSat_a0_sat mmpl gh W hG.extraOk) (Slots.cliExternsPlaced_noAllocShim_sat mmpl gh W hG.shim_eq) (Slots.cliExternsPlaced_alloc_sat mmpl gh W hG) - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_staticSecretDrop_sat mmpl W)) + (Slots.cliGhostExterns_staticSecretDrop_sat gh (cliExternsPlaced mmpl W) hG.extraOk) (Slots.cliGhostExterns_panic_handle_alloc_error mmpl gh W)) have hext40 := keys_ls_subroutine_ok_of_block_cro (callerProg := (blkPC_40).rebase (blkPl_40).base @@ -1118,7 +1153,9 @@ private theorem growOne_507_cl_ok [LibsignalPlacement] theorem dhStep_507_cli [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) - (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (ctl : BitVec 64) (S : SpqrModel) : + (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) + (ctl : BitVec 64) (S : SpqrModel) : S3TightSeamPlaced ((blkPC_508).rebase (blkPl_508).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsmpl.base 508) W.C E2E.HooksE.A0 ctl uuidTryParse S := by @@ -1135,8 +1172,7 @@ theorem dhStep_507_cli [LibsignalPlacement] (Slots.cliCoinsFillAtPlaced_ok_cl mmpl gh W hG cur rest tryDecryptSubStack (by decide) (by decide))) (keys_ls_hook_ok_of_mem - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_staticSecretDrop_sat mmpl W))) + (Slots.cliGhostExterns_staticSecretDrop_sat gh (cliExternsPlaced mmpl W) hG.extraOk)) (s3_commit_placed_ok_cli (dhCommitBlockWp_507 (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) W.C E2E.HooksE.A0 ctl P3kR1bd.spqrNoPanic @@ -1153,8 +1189,8 @@ theorem dhStep_507_cli [LibsignalPlacement] (keys_ls_hook_ok_of_mem (Slots.cliExternsPlaced_framelessMemcpy_sat mmpl gh W hG)) (keys_ls_hook_ok_of_mem - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_sessionMemmove_sat mmpl W dropChainStack))) + ⟨hookMemmove, RunGlue.cliGhostExterns_extra_some gh (cliExternsPlaced mmpl W) hMv, + CryptoVerification.LibsignalTripleRatchet.hookMemmove_trace_ok dropChainStack⟩) ((cmk_externAt?_of_mem (prog := (blkPC_508).rebase (blkPl_508).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) @@ -1163,7 +1199,9 @@ theorem dhStep_507_cli [LibsignalPlacement] theorem s4_507_cli [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) - (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (ctl : BitVec 64) (S : SpqrModel) : + (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) + (ctl : BitVec 64) (S : SpqrModel) : S4SeamPlaced ((blkPC_508).rebase (blkPl_508).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) (blkPl_508).base W.C E2E.HooksE.A0 ctl uuidTryParse S := by @@ -1181,16 +1219,22 @@ theorem s4_507_cli [LibsignalPlacement] Slots.cliGhostExterns_panic_handle_error mmpl gh W, Slots.cliGhostExterns_panic_option_expect_failed mmpl gh W, RunGlue.cliGhostExterns_panic_of_mem mmpl gh W (by decide)⟩ - have hcmk24 := LibsignalBinary.Proofs.ConsumeMessageKey.AssemblySat.consume_message_key_placed_ro_run_sat + have hcmk24 := CryptoVerification.LibsignalSession.consume_message_key_placed_ro_run_of W.C.F E2E.HooksE.A0 (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) - (cliGhostExterns_row_placed mmpl gh W (Slots.blackBox_row_placed mmpl W)) - ((RunGlue.cliGhostExterns_shim gh _).trans (congrArg some hG.shim_eq)) - (Slots.cliExternsPlaced_realloc_sat mmpl gh W hG) - (Slots.cliGhostExterns_a0_exactMemcpy_sat (cliExternsPlaced mmpl W) hG) - (Slots.cliExternsPlaced_sessionMemsetRegion_sat mmpl gh W hG) - (cliGhostExterns_row_placed mmpl gh W (Slots.compress256_row_placed mmpl W)) + (find_receiver_chain_index_placed_ok_at_cmk_sat + E2E.HooksE.A0 (cliGhostExterns_blackBoxSat_a0_sat mmpl gh W hG.extraOk)) + (LibsignalBinary.Proofs.ConsumeMessageKey.AssemblySat.hmac_sha256_placed_ro_ok_at_cmk_sat + W.C.F + (Slots.cliGhostExterns_a0_exactMemcpy_sat (cliExternsPlaced mmpl W) hG) + (Slots.cliExternsPlaced_sessionMemsetRegion_sat mmpl gh W hG) + (cliGhostExterns_row_placed mmpl gh W (Slots.compress256_row_placed mmpl W))) + (CryptoVerification.LibsignalSession.grow_one_placed_ok_at_cmk + E2E.HooksE.A0 + ((RunGlue.cliGhostExterns_shim gh _).trans (congrArg some hG.shim_eq)) + (Slots.cliExternsPlaced_realloc_sat mmpl gh W hG) + hA_cmk) hA_cmk - (cliGhostExterns_row_placed mmpl gh W (Slots.memmove_row_placed mmpl W)) + (RunGlue.cliGhostExterns_extra_some gh (cliExternsPlaced mmpl W) hMv) have hcmk24_cro : subroutine_ok ((blkPC_24).rebase (blkPl_24).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) (blkPl_24).base @@ -1250,12 +1294,10 @@ theorem s7_507_cli [LibsignalPlacement] (callerProg := (blkPC_60).rebase (blkPl_60).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) (subroutine_ok_withLsCodeLoaded_of_plain (pl := lsmpl) (pkSer_205_ok mmpl gh W hG))) - have hvmac62 := verifyMacWithAddresses_placed_cro_ok W.C E2E.HooksE.A0 uuidTryParse + have hvmac62 := LibsignalBinary.Proofs.TripleRatchet.Mac.VerifySat.verifyMacWithAddresses_placed_cro_ok_sat W.C E2E.HooksE.A0 uuidTryParse (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) (parseSid_61_ok mmpl gh W) (new_from_slice_60_cro_ok mmpl gh W hG) hpk60 - (keys_ls_hook_ok_of_mem - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_blackBox_sat mmpl W))) + (cliGhostExterns_blackBoxSat_a0_sat mmpl gh W hG.extraOk) (Slots.cliExternsPlaced_noAllocShim_sat mmpl gh W hG.shim_eq) (Slots.cliExternsPlaced_alloc_sat mmpl gh W hG) (Slots.cliExternsPlaced_dealloc_sat mmpl gh W hG) @@ -1293,6 +1335,7 @@ theorem tryDecryptPqV1_placed_ok_PTight_cli [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) (ctl : BitVec 64) (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hAesDec : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) lsAesDecSym (aesDecSpec W.C.D E2E.HooksE.A0)) (hSpqr : SpqrV1PlacedSeams mmpl gh W) : @@ -1302,11 +1345,11 @@ theorem tryDecryptPqV1_placed_ok_PTight_cli [LibsignalPlacement] (tryDecryptSpecTPTightAt W.C E2E.HooksE.A0 ctl uuidTryParse (spqrV1 W.C.F W.Q.K)) := tryDecrypt_placed_ok_of_seams (errTail_507_cli mmpl gh W hG ctl (spqrV1 W.C.F W.Q.K)) - (s0_507_cli mmpl gh W ctl (spqrV1 W.C.F W.Q.K)) + (s0_507_cli mmpl gh W hG.extraOk ctl (spqrV1 W.C.F W.Q.K)) (s1_507_cli mmpl gh W hG ctl (spqrV1 W.C.F W.Q.K)) - (s2_507_cli mmpl gh W ctl) - (dhStep_507_cli mmpl gh W hG ctl (spqrV1 W.C.F W.Q.K)) - (s4_507_cli mmpl gh W hG ctl (spqrV1 W.C.F W.Q.K)) + (s2_507_cli mmpl gh W hG.extraOk ctl) + (dhStep_507_cli mmpl gh W hG hMv ctl (spqrV1 W.C.F W.Q.K)) + (s4_507_cli mmpl gh W hG hMv ctl (spqrV1 W.C.F W.Q.K)) (pqRecv_507_cli mmpl gh W hG hSpqr ctl) (s6_507_cli mmpl gh W hG ctl) (s7_507_cli mmpl gh W hG ctl (spqrV1 W.C.F W.Q.K)) @@ -1319,6 +1362,7 @@ theorem tryDecryptPqV1_placed_ok_PTight_cli_rocl [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) (ctl : BitVec 64) (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hAesDec : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) lsAesDecSym (aesDecSpec W.C.D E2E.HooksE.A0)) (hSpqr : SpqrV1PlacedSeams mmpl gh W) @@ -1331,7 +1375,7 @@ theorem tryDecryptPqV1_placed_ok_PTight_cli_rocl [LibsignalPlacement] have _ := CryptoVerification.CliHandshake.TryDecPlaced.instIsLsBlockProg_508 (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) exact CryptoVerification.LibsignalPublicApi.StoreKit.ls_subroutine_ok_rocl_of_block - (tryDecryptPqV1_placed_ok_PTight_cli mmpl gh W ctl hG hAesDec hSpqr) hi + (tryDecryptPqV1_placed_ok_PTight_cli mmpl gh W ctl hG hMv hAesDec hSpqr) hi /-- Caller-block-polymorphic `StoreKit.withLsCodeRoLoaded lsmpl` transfer of `tryDecryptPqV1_placed_ok_PTight_cli`. -/ theorem tryDecryptPqV1_placed_ok_PTight_cli_at_block [LibsignalPlacement] @@ -1339,6 +1383,7 @@ theorem tryDecryptPqV1_placed_ok_PTight_cli_at_block [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) (ctl : BitVec 64) (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hAesDec : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) lsAesDecSym (aesDecSpec W.C.D E2E.HooksE.A0)) (hSpqr : SpqrV1PlacedSeams mmpl gh W) @@ -1349,6 +1394,6 @@ theorem tryDecryptPqV1_placed_ok_PTight_cli_at_block [LibsignalPlacement] (CryptoVerification.LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (tryDecryptRawSpecTPTightAt W.C E2E.HooksE.A0 ctl uuidTryParse (spqrV1 W.C.F W.Q.K))) := CryptoVerification.LibsignalPublicApi.StoreKit.subroutine_ok_withLsCodeRoLoaded_of_rocl - (tryDecryptPqV1_placed_ok_PTight_cli_rocl mmpl gh W ctl hG hAesDec hSpqr hi) + (tryDecryptPqV1_placed_ok_PTight_cli_rocl mmpl gh W ctl hG hMv hAesDec hSpqr hi) end CryptoVerification.LibsignalTripleRatchet.DecryptPq diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudget.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudget.lean index 1c94f48dc..6ecdb0a5d 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudget.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudget.lean @@ -94,6 +94,7 @@ open LibsignalBinary.Proofs.ConsumeMessageKey.StoreLoopProofs.DefsBudget ( cmkLoopAdvanceEvs_nonempty ) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (ExtraSpecOk) open LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget ( SpqrRecvBytesEnv SpqrV1PlacedSeams SpqrV1PlacedSeamsOfEnv spqrRecvBytesEnv_nonempty ) @@ -169,12 +170,13 @@ theorem aesDecrypt_507_cli [LibsignalPlacement] {M : AllocCostModel} theorem s0_507_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) + (hOk : ExtraSpecOk g) (ctl : BitVec 64) (S : SpqrModel) (tdEnv : TryDecryptEnvArgs → List AllocEvent → Prop) : S0PSeamPlaced ((blkPC_508).rebase (blkPl_508).base (cliGhostExterns g (cliExternsPlaced mmpl W))) (blkPl_508).base W.C A lim ctl uuidTryParse S tdEnv := - RootTrapPlacedBudgetPart2.s0_507_cli mmpl g W ctl S tdEnv + RootTrapPlacedBudgetPart2.s0_507_cli mmpl g W hOk ctl S tdEnv theorem s1_pinned_507_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -198,11 +200,12 @@ theorem s1_507_cli [LibsignalPlacement] {M : AllocCostModel} theorem s2_507_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} - (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) (ctl : BitVec 64) : + (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) + (hOk : ExtraSpecOk g) (ctl : BitVec 64) : S2SeamPlaced ((blkPC_508).rebase (blkPl_508).base (cliGhostExterns g (cliExternsPlaced mmpl W))) (blkPl_508).base A lim ctl := - RootTrapPlacedBudgetPart2.s2_507_cli mmpl g W ctl + RootTrapPlacedBudgetPart2.s2_507_cli mmpl g W hOk ctl theorem s6_507_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -434,9 +437,9 @@ theorem tryDecryptPqV1_placed_ok_PTight_cli_of_tdEnv [LibsignalPlacement] {M : A rw [fromS2_envArgsToGhost_eq] exact hseq)) (cliSeamEnvs_inhabited W.C (spqrV1 W.C.F W.Q.K) hRecv_ne hFmtWrite_ne hFmtInner_ne) - (s0_507_cli mmpl g W ctl (spqrV1 W.C.F W.Q.K) tdEnv) + (s0_507_cli mmpl g W hG.extraOk ctl (spqrV1 W.C.F W.Q.K) tdEnv) (s1_pinned_507_cli mmpl g W hG ctl (spqrV1 W.C.F W.Q.K) tdEnv) - (s2_507_cli mmpl g W ctl) + (s2_507_cli mmpl g W hG.extraOk ctl) (dhStep_pinned_507_cli mmpl g W hG ctl (spqrV1 W.C.F W.Q.K)) (s4_507_cli_ofEnv mmpl g W hG hFmtWrite ctl (spqrV1 W.C.F W.Q.K)) (pqRecv_507_cli_ofEnv mmpl g W hG hSpqr hFmtInner ctl) @@ -507,10 +510,10 @@ theorem tryDecryptPqV1_placed_ok_PTight_cli [LibsignalPlacement] {M : AllocCostM (cliSeamEnvs_inhabited (fmtWriteEnv := FmtWriteEnv) (fmtEnv := FormatInnerEnv) W.C (spqrV1 W.C.F W.Q.K) spqrRecvBytesEnv_nonempty ⟨[], rfl⟩ ⟨[], rfl⟩) - (s0_507_cli mmpl g W ctl (spqrV1 W.C.F W.Q.K) (TryDecryptCliEnv W.C (spqrV1 W.C.F W.Q.K))) + (s0_507_cli mmpl g W hG.extraOk ctl (spqrV1 W.C.F W.Q.K) (TryDecryptCliEnv W.C (spqrV1 W.C.F W.Q.K))) (s1_pinned_507_cli mmpl g W hG ctl (spqrV1 W.C.F W.Q.K) (TryDecryptCliEnv W.C (spqrV1 W.C.F W.Q.K))) - (s2_507_cli mmpl g W ctl) + (s2_507_cli mmpl g W hG.extraOk ctl) (dhStep_pinned_507_cli mmpl g W hG ctl (spqrV1 W.C.F W.Q.K)) (s4_507_cli mmpl g W hG ctl (spqrV1 W.C.F W.Q.K)) (pqRecv_507_cli mmpl g W hG hSpqr ctl) diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetFd.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetFd.lean index 6d1f5f95d..4b8553ee4 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetFd.lean @@ -469,9 +469,11 @@ private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans + (cliExternsPlaced_row mmpl W hrow) private theorem pqRecv_507_cli_of_spqrRecv [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -688,9 +690,9 @@ theorem tryDecryptPqV1_placed_ok_PTight_cli_fd_of_recv_of_tdEnv [LibsignalPlacem rw [fromS2_envArgsToGhost_eq] exact hseq)) (cliSeamEnvs_inhabited W.C (spqrV1 W.C.F W.Q.K) hRecv_ne hFmtWrite_ne hFmtInner_ne) - (s0_507_cli (A := A') mmpl g W ctl (spqrV1 W.C.F W.Q.K) tdEnv) + (s0_507_cli (A := A') mmpl g W hG.extraOk ctl (spqrV1 W.C.F W.Q.K) tdEnv) (s1_pinned_507_cli mmpl g W hG' ctl (spqrV1 W.C.F W.Q.K) tdEnv) - (s2_507_cli (A := A') mmpl g W ctl) + (s2_507_cli (A := A') mmpl g W hG.extraOk ctl) (dhStep_pinned_507_cli mmpl g W hG' ctl (spqrV1 W.C.F W.Q.K)) (s4_507_cli_ofEnv mmpl g W hG' hFmtW' ctl (spqrV1 W.C.F W.Q.K)) (pqRecv_507_cli_of_spqrRecv mmpl g W hG' hRecv' hFmtI' ctl) @@ -753,11 +755,11 @@ theorem tryDecryptPqV1_placed_ok_PTight_cli_fd_of_recv [LibsignalPlacement] (cliSeamEnvs_inhabited (fmtWriteEnv := FmtWriteEnv) (fmtEnv := FormatInnerEnv) W.C (spqrV1 W.C.F W.Q.K) spqrRecvBytesEnv_nonempty ⟨[], rfl⟩ ⟨[], rfl⟩) - (s0_507_cli (A := A') mmpl g W ctl (spqrV1 W.C.F W.Q.K) + (s0_507_cli (A := A') mmpl g W hG.extraOk ctl (spqrV1 W.C.F W.Q.K) (TryDecryptCliEnv W.C (spqrV1 W.C.F W.Q.K))) (s1_pinned_507_cli mmpl g W hG' ctl (spqrV1 W.C.F W.Q.K) (TryDecryptCliEnv W.C (spqrV1 W.C.F W.Q.K))) - (s2_507_cli (A := A') mmpl g W ctl) + (s2_507_cli (A := A') mmpl g W hG.extraOk ctl) (dhStep_pinned_507_cli mmpl g W hG' ctl (spqrV1 W.C.F W.Q.K)) (s4_507_cli mmpl g W hG' ctl (spqrV1 W.C.F W.Q.K)) (pqRecv_507_cli_of_spqrRecv mmpl g W hG' hRecv' hFmtI' ctl) diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart2.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart2.lean index 537a54696..37e68e1f4 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart2.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart2.lean @@ -16,9 +16,12 @@ public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.DecryptPq.DecryptTailTrap507P public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.DecryptPq.SpqrRecvTrapV1_507PlacedBudget public import LibsignalBinary.Proofs.Cli.SpqrV1.M4.TryDecryptPV1TrapPlacedBudget import LibsignalBinary.Heap.Fine.SpecBudgetHelpersFine +import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexBudgetSat +import LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedBudgetSat import LibsignalBinary.Proofs.Placed.BudgetVmSteps import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.UuidFsPlaced import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget +import LibsignalBinary.Proofs.TripleRatchet.ChainKey.FindReceiverChainKeyBudget import LibsignalBinary.Proofs.TripleRatchet.Getters.Drops.Chain.VecExtBudget import LibsignalBinary.Proofs.TripleRatchet.Getters.Drops.SignalProtocolError.ExtBudget import LibsignalBinary.Proofs.TripleRatchet.Getters.IdentityBudget @@ -53,7 +56,7 @@ open CryptoVerification.SignalSession ( open CryptoVerification.SignalSession.Cli.RunGlue ( CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other ) -open CryptoVerification.SignalSession.Cli.Slots (aesDec_row_placed blackBox_row_placed formatInner_row_placed) +open CryptoVerification.SignalSession.Cli.Slots (aesDec_row_placed formatInner_row_placed) open CryptoVerification.SpqrV1.GF.Mul2U16 (tokenInitPlacedAt) open CryptoVerification.SpqrV1.Top.InitialState (InitialStateGhost) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FreeOnlyEvs RustCliAllocBudget) @@ -61,7 +64,9 @@ open LibsignalBinary.Heap.SpecBudget (FormatInnerEnv aesDecBudgetSpec formatInne open LibsignalBinary.Proofs.Cli.SpqrV1.M4.DecryptTailTrapPlacedBudget (s8Env) open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.ChainLookupS1ErrPlacedBudget (S1TightSeamFreePlaced S1TightSeamPinnedFreePlaced) open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DefsPlacedBudget (ErrTailTightSeamPlaced S0PSeamPlaced S2SeamPlaced S5WTSeamPlaced S8SeamPlaced) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks cliExternsPlaced_dealloc_budget_sat) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( + CliGhostAllocHooks cliExternsPlaced_dealloc_budget_sat cliGhostExterns_blackBoxSat_budget_sat) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (ExtraSpecOk) open LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget (SpqrRecvBytesEnv SpqrV1PlacedSeams SpqrV1PlacedSeamsOfEnv) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.PqRecvBudgetDefs (PqRecvEnv) open LibsignalBinary.Proofs.TripleRatchet.Record.DefsBudget (TryDecryptEnvArgs) @@ -226,9 +231,10 @@ private theorem cliGhost_row (mmpl : MultiPlacement) (g : CliGhostHooks) (W : Cl (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans (cliExternsPlaced_row mmpl W hrow) private theorem formatInner_budget_sat {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (mmpl : MultiPlacement) (g : CliGhostHooks) (W : CliHooks) : @@ -318,14 +324,20 @@ theorem aesDecrypt_507_cli [LibsignalPlacement] {M : AllocCostModel} theorem s0_507_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (mmpl : MultiPlacement) (g : CliGhostHooks) (W : CliHooks) + (hOk : ExtraSpecOk g) (ctl : BitVec 64) (S : SpqrModel) (tdEnv : TryDecryptEnvArgs → List AllocEvent → Prop) : S0PSeamPlaced ((blkPC_508).rebase (blkPl_508).base (cliGhostExterns g (cliExternsPlaced mmpl W))) (blkPl_508).base W.C A lim ctl uuidTryParse S tdEnv := by - exact ChainLookupS0_507PlacedBudget.s0_507_placed_ok_P_of_callees - (cliGhost_row mmpl g W (blackBox_row_placed mmpl W)) - (uuidTryParse_vm_placed_ok (cliGhostExterns g (cliExternsPlaced mmpl W))) + have _ := instIsLsBlockProg_508 (cliGhostExterns g (cliExternsPlaced mmpl W)) + exact ChainLookupS0_507PlacedBudget.s0_507_placed_ok_P + (LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedBudgetSat.isSameAccountEqDistinct_placed_ok_at_sat + A.repAlloc + (callerProg := (blkPC_508).rebase (blkPl_508).base (cliGhostExterns g (cliExternsPlaced mmpl W))) + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hOk) + (uuidTryParse_vm_placed_ok (cliGhostExterns g (cliExternsPlaced mmpl W))) + (by decide)) theorem s1_pinned_507_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -351,11 +363,15 @@ theorem s1_507_cli [LibsignalPlacement] {M : AllocCostModel} theorem s2_507_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} - (mmpl : MultiPlacement) (g : CliGhostHooks) (W : CliHooks) (ctl : BitVec 64) : + (mmpl : MultiPlacement) (g : CliGhostHooks) (W : CliHooks) + (hOk : ExtraSpecOk g) (ctl : BitVec 64) : S2SeamPlaced ((blkPC_508).rebase (blkPl_508).base (cliGhostExterns g (cliExternsPlaced mmpl W))) (blkPl_508).base A lim ctl := by - exact ChainLookup507PlacedBudget.findChain_507_placed_ok_of_bb - (cliGhost_row mmpl g W (blackBox_row_placed mmpl W)) + exact ChainLookup507PlacedBudget.findChain_507_placed_ok + (LibsignalBinary.Proofs.TripleRatchet.ChainKey.FindReceiverChainKeyBudget.find_receiver_chain_key_placed_ok_of_find_index + (CryptoVerification.ls_subroutine_ok_of_block (i := 25) (j := 26) + (LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexBudgetSat.find_receiver_chain_index_placed_ok_sat A + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hOk)))) end LibsignalBinary.Proofs.Cli.E2E.Pqxdh.DecryptPq.RootTrapPlacedBudgetPart2 diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart3.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart3.lean index 62ee04382..02c59dba8 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart3.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart3.lean @@ -29,6 +29,7 @@ import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat import LibsignalBinary.Proofs.TripleRatchet.InImageCallees.CallsBudget import LibsignalBinary.Proofs.TripleRatchet.Keys.GenerateKeysBudget import LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudget +import LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudgetSat import LibsignalBinary.Proofs.TripleRatchet.ReceiveRatchet.ApplyBudget /-! @@ -56,7 +57,7 @@ open LibsignalBinary.Heap.SpecBudget (withVmPreserved) open LibsignalBinary.Proofs.Cli.SpqrV1.M4.DecryptTailTrapPlacedBudget (s9Env) open LibsignalBinary.Proofs.Cli.SpqrV1.M4.VerifyMacTrapPlacedBudget (s7Env) open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DefsPlacedBudget (S6SeamPlaced S7SeamPlaced S9SeamPlaced) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_blackBox_budget_sat cliExternsPlaced_compress256Multi_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_exactMemcpy_sat cliExternsPlaced_framelessMemcpy_budget_sat cliExternsPlaced_noAllocShim_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat cliExternsPlaced_shim_budget_sat) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_compress256Multi_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_exactMemcpy_sat cliExternsPlaced_framelessMemcpy_budget_sat cliExternsPlaced_noAllocShim_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat cliExternsPlaced_shim_budget_sat cliGhostExterns_blackBoxSat_budget_sat) open LibsignalBinary.Proofs.SpqrV1.Poly.EncodeBytes.DefsBudget (calleeSavedPreserved_of_stripS_right checkBlockSafeVm checkBytesSafeVm isTotalTrapHooks_vmTrapHooks placedLib_rebase_allInstrs_safeVm stripS_pc stripS_readReg64 stripS_sp stripS_status vmTrapHooks) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (framelessMemcpyBudgetSpec noAllocShim_hookOk) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DeriveKeysBudget (s6FreeOnlyEnv) @@ -74,9 +75,10 @@ private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans (cliExternsPlaced_row mmpl W hrow) private theorem new_from_slice_114_cro_ok [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -309,9 +311,9 @@ theorem s7_507_cli [LibsignalPlacement] {M : AllocCostModel} (LibsignalBinary.Proofs.TripleRatchet.Alloc.PublicKeySerializeBudget.public_key_serialize_placed_ok ⟨hookNoop, (cliGhostExterns_shim g _).trans (congrArg some hG.shim_eq), noAllocShim_hookOk⟩ (cliExternsPlaced_alloc_budget_sat mmpl g W hG)))) - have hvmac62 := LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudget.verifyMacWithAddresses_placed_cro_ok W.C M A lim uuidTryParse H + have hvmac62 := LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudgetSat.verifyMacWithAddresses_placed_cro_ok_sat W.C M A lim uuidTryParse H (parseSid_61_ok H) (new_from_slice_60_cro_ok mmpl g W hG) hpk60 - (keys_ls_hook_ok_of_mem (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W (cliExternsPlaced_blackBox_budget_sat mmpl W))) + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) (cliExternsPlaced_noAllocShim_budget_sat mmpl g W hG.shim_eq) (cliExternsPlaced_alloc_budget_sat mmpl g W hG) (cliExternsPlaced_dealloc_budget_sat mmpl g W hG) diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart3Sat.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart3Sat.lean index a574f7960..3f457bb36 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart3Sat.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart3Sat.lean @@ -41,7 +41,7 @@ import LibsignalBinary.Proofs.TripleRatchet.Getters.ClearUnacknowledgedPreKeyMes import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat import LibsignalBinary.Proofs.TripleRatchet.InImageCallees.CallsBudget import LibsignalBinary.Proofs.TripleRatchet.Keys.GenerateKeysBudget -import LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudget +import LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudgetSat import LibsignalBinary.Proofs.TripleRatchet.ReceiveRatchet.ApplyBudget /-! @@ -125,7 +125,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.CliSlotCalleesInstPlacedBudgetUuid (uuidTryParse_placed_vm_ok) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_blackBox_budget_sat + (CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliGhostExterns_blackBoxSat_budget_sat cliExternsPlaced_compress256Multi_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_exactMemcpy_sat cliExternsPlaced_framelessMemcpy_budget_sat cliExternsPlaced_noAllocShim_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat @@ -148,7 +148,7 @@ open LibsignalBinary.Proofs.TripleRatchet.InImageCallees.DefsBudget open LibsignalBinary.Proofs.TripleRatchet.Keys.GenerateKeysBudget (generateKeys_placed_ok_of_contracts) open LibsignalBinary.Proofs.TripleRatchet.Mac.ComputeBudgetAux (newFromSliceBudgetSpec) -open LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudget (verifyMacWithAddresses_placed_cro_ok) +open LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudgetSat (verifyMacWithAddresses_placed_cro_ok_sat) open LibsignalBinary.Proofs.TripleRatchet.ReceiveRatchet.ApplyBudget (trApply_placed_ok) open LibsignalBinary.Proofs.TripleRatchet.Record.DefsBudget (TryDecryptEnvArgs) open Obj (MultiPlacedLib MultiPlacement PlacedLib) @@ -162,9 +162,10 @@ private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans (cliExternsPlaced_row mmpl W hrow) private theorem mkHkdfPlacedHooksExactSat_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -1128,11 +1129,9 @@ theorem s7_507_cli_of_hMs [LibsignalPlacement] {M : AllocCostModel} (public_key_serialize_placed_ok ⟨hookNoop, (cliGhostExterns_shim g _).trans (congrArg some hG.shim_eq), noAllocShim_hookOk⟩ (cliExternsPlaced_alloc_budget_sat mmpl g W hG)))) - have hvmac62 := verifyMacWithAddresses_placed_cro_ok W.C M A lim uuidTryParse H + have hvmac62 := verifyMacWithAddresses_placed_cro_ok_sat W.C M A lim uuidTryParse H (parseSid_61_ok H) (new_from_slice_60_cro_ok mmpl g W hG) hpk60 - (keys_ls_hook_ok_of_mem - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_blackBox_budget_sat mmpl W))) + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) (cliExternsPlaced_noAllocShim_budget_sat mmpl g W hG.shim_eq) (cliExternsPlaced_alloc_budget_sat mmpl g W hG) (cliExternsPlaced_dealloc_budget_sat mmpl g W hG) diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart4.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart4.lean index a7b62b9dd..b48ccc875 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart4.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart4.lean @@ -27,7 +27,7 @@ public meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Proofs.Common.SharedHelpers -import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat import LibsignalBinary.Proofs.Placed.ElfLsRetAddr import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat @@ -48,17 +48,16 @@ namespace LibsignalBinary.Proofs.Cli.E2E.Pqxdh.DecryptPq.RootTrapPlacedBudgetPar open Arm64 ProofLib open CryptoVerification ( - LibsignalPlacement blkPC_200 blkPC_205 blkPC_22 blkPl_200 blkPl_205 blkPl_22 - lsBlackBoxU8Sym lsNoAllocShimSym lsRustAllocSym lsRustDeallocSym lsRustNoAllocShimSym + LibsignalPlacement blkPC_200 blkPC_205 blkPC_22 blkPC_40 blkPl_200 blkPl_205 blkPl_22 blkPl_40 + lsNoAllocShimSym lsRustAllocSym lsRustDeallocSym lsRustNoAllocShimSym ls_hook_ok_of_mem lsmpl withLsCodeLoaded ) open CryptoVerification.CliHandshake.Placed (blkPC_513 blkPl_513) open CryptoVerification.CliHandshake.TryDecPlaced ( blkPC_508 blkPl_508 instIsLsBlockProg_508 ) -open CryptoVerification.LibsignalSession (blackBoxHook) open CryptoVerification.LibsignalTripleRatchet ( - SpqrModel keys_ls_hook_ok_of_mem + SpqrModel keys_ls_hook_ok_of_mem keys_ls_subroutine_ok_of_block_cro subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded withLsCodeRoLoaded ) open CryptoVerification.LibsignalTripleRatchet.ConsumeMessageKeyTransfer ( @@ -75,7 +74,7 @@ open CryptoVerification.SignalSession.Cli.RunGlue ( CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other cliGhostExterns_shim ) open CryptoVerification.SignalSession.Cli.Slots ( - blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced + cliGhostExterns_sat_of_cliExternsPlaced ) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits RustCliAllocBudget) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.DecryptPq.RootTrapPlacedBudgetWp ( @@ -96,8 +95,11 @@ open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhStepCoinsFillBridgePlace coinsFill_507_cro_placed_cli ) open LibsignalBinary.Proofs.ConsumeMessageKey.DefsBudget (GrowOneEnv) +open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat ( + calculateAgreement_placed_ok_unconditional_sat +) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat ( - createChain_placed_ok_of_block_sat + expand_multi_info_placed_vm_ok_of_other_block_sat extract_placed_vm_ok_of_other_block_sat ) open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (lsRetAddr624_base_add) open LibsignalBinary.Proofs.SessionRecordAt.Stage1X.GrowOneXBudget ( @@ -107,8 +109,9 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_derivePublicKeyBytes_budget_sat cliExternsPlaced_diffieHellman_budget_sat cliExternsPlaced_framelessMemcpy_budget_sat cliExternsPlaced_realloc_budget_sat - cliExternsPlaced_sessionMemmove_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat - cliExternsPlaced_sharedSecretDrop_budget_sat cliExternsPlaced_staticSecretDrop_budget_sat + cliExternsPlaced_sessionMemsetRegion_budget_sat cliGhostExterns_blackBoxSat_budget_sat + cliGhostExterns_sessionMemmove_budget_sat cliGhostExterns_sharedSecretDrop_budget_sat + cliGhostExterns_staticSecretDrop_budget_sat ) open LibsignalBinary.Proofs.TripleRatchet.Alloc.ChainKeyToPbBudget (chain_key_to_pb_placed_ok) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( @@ -136,7 +139,9 @@ open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhStepBudgetWp (DhStepBlockVmW open LibsignalBinary.Proofs.TripleRatchet.Getters.DefsBudget (dropChainSpec) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat (HkdfPlacedHooksExactBudgetSat) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat (HkdfPlacedHooksExactSat) -open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemmoveBudgetSpec) +open LibsignalBinary.Proofs.TripleRatchet.Keys.CreateChainBudget ( + createChain_placed_ok_of_contracts +) open LibsignalBinary.Proofs.TripleRatchet.Keys.DefsBudget (createChainSpec) private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) @@ -147,9 +152,10 @@ private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans (cliExternsPlaced_row mmpl W hrow) private theorem noAllocShim_budget_sat (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) (hShim : g.shim = hookNoop) : @@ -189,17 +195,22 @@ private theorem createChain_507_cro_ok [LibsignalPlacement] {M : AllocCostModel} have : HkdfPlacedHooksExactBudgetSat W.C.F (cliGhostExterns g (cliExternsPlaced mmpl W)) := HkdfPlacedHooksExactBudgetSat.of_exactSat (cliExternsPlaced_sessionMemsetRegion_budget_sat mmpl g W hG) - exact createChain_placed_ok_of_block_sat - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_diffieHellman_budget_sat mmpl W)) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sharedSecretDrop_budget_sat mmpl W)) - (cliGhost_row mmpl g W (blackBox_row_placed mmpl W)) - (noAllocShim_budget_sat mmpl g W hG.shim_eq) - (cliExternsPlaced_alloc_budget_sat mmpl g W hG) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W)) - (cliExternsPlaced_dealloc_budget_sat mmpl g W hG) + exact keys_ls_subroutine_ok_of_block_cro + (createChain_placed_ok_of_contracts + (keys_ls_subroutine_ok_of_block_cro + (calculateAgreement_placed_ok_unconditional_sat + (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W + (cliExternsPlaced_diffieHellman_budget_sat mmpl W)) + (cliGhostExterns_sharedSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) + (noAllocShim_budget_sat mmpl g W hG.shim_eq) + (cliExternsPlaced_alloc_budget_sat mmpl g W hG) + (cliGhostExterns_staticSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk))) + (extract_placed_vm_ok_of_other_block_sat W.C (cliGhostExterns g (cliExternsPlaced mmpl W))) + (expand_multi_info_placed_vm_ok_of_other_block_sat W.C + (cliGhostExterns g (cliExternsPlaced mmpl W))) + (keys_ls_hook_ok_of_mem (cliExternsPlaced_dealloc_budget_sat mmpl g W hG))) + (by decide) (by decide) (by decide) private theorem derivePk_507_cro_ok [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) : @@ -331,8 +342,7 @@ private theorem s3_commit_507_cli [LibsignalPlacement] {M : AllocCostModel} (keys_ls_hook_ok_of_mem (cliExternsPlaced_dealloc_budget_sat mmpl g W hG)) (keys_ls_hook_ok_of_mem (framelessMemcpy_budget_sat mmpl g W hG)) (keys_ls_hook_ok_of_mem - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W dropChainStack))) + (cliGhostExterns_sessionMemmove_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk dropChainStack)) (hlr_alloc := lsRetAddr624_base_add 508 0xa00#64 (by decide) (by decide)) (hlr_dealloc := lsRetAddr624_base_add 508 0xaf0#64 (by decide) (by decide)) (hlr_ls := lsRetAddr624_base_add 508 0xb8c#64 (by decide) (by decide)) @@ -352,8 +362,7 @@ theorem dhStep_pinned_507_cli [LibsignalPlacement] {M : AllocCostModel} have hsd : subroutine_ok ((blkPC_508).rebase (blkPl_508).base H) (lsmpl.ρ lsStaticDropSym) zeroizeSecretBudgetSpec := keys_ls_hook_ok_of_mem - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W)) + (cliGhostExterns_staticSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) exact s3_pinned_cro_placed_okT_cli hwp W.C A lim ctl S (createChain_507_cro_ok mmpl g W hG) (derivePk_507_cro_ok mmpl g W) diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart4Sat.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart4Sat.lean index 15ccd2869..f72a0a42e 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart4Sat.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart4Sat.lean @@ -15,7 +15,7 @@ import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep -import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat import LibsignalBinary.Proofs.Placed.ElfLsRetAddr import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat @@ -35,14 +35,14 @@ namespace LibsignalBinary.Proofs.Cli.E2E.Pqxdh.DecryptPq.RootTrapPlacedBudgetPar open Arm64 ProofLib SepProp open CryptoVerification - (LibsignalPlacement blkPC_200 blkPC_205 blkPC_22 blkPl_200 blkPl_205 blkPl_22 + (LibsignalPlacement blkPC_200 blkPC_205 blkPC_22 blkPC_40 blkPl_200 blkPl_205 blkPl_22 blkPl_40 lsRustNoAllocShimSym ls_hook_ok_of_mem lsmpl withLsCodeLoaded) open CryptoVerification.CliHandshake.Placed (blkPC_513 blkPl_513) open CryptoVerification.CliHandshake.TryDecPlaced (blkPC_508 blkPl_508 instIsLsBlockProg_508) open CryptoVerification.LibsignalSession.CryptoHmacSha256 (lsMemcpySym lsMemsetSym) open CryptoVerification.LibsignalTripleRatchet - (SpqrModel keys_ls_hook_ok_of_mem sessionMemsetRegionSpec + (SpqrModel keys_ls_hook_ok_of_mem keys_ls_subroutine_ok_of_block_cro sessionMemsetRegionSpec subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded withLsCodeRoLoaded) open CryptoVerification.LibsignalTripleRatchet.ConsumeMessageKeyTransfer (ls_subroutine_ok_transfer_of_plain) @@ -55,7 +55,7 @@ open CryptoVerification.SignalSession open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other cliGhostExterns_shim) open CryptoVerification.SignalSession.Cli.Slots - (blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced compress256_row_placed) + (cliGhostExterns_sat_of_cliExternsPlaced compress256_row_placed) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits RustCliAllocBudget) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.DecryptPq.RootTrapPlacedBudgetWp @@ -71,8 +71,10 @@ open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhStep433PlacedBudget open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhStepCoinsFillBridgePlacedBudget (coinsFill_507_cro_placed_cli) open LibsignalBinary.Proofs.ConsumeMessageKey.DefsBudget (GrowOneEnv) +open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat + (calculateAgreement_placed_ok_unconditional_sat) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat - (createChain_placed_ok_of_block_sat) + (expand_multi_info_placed_vm_ok_of_other_block_sat extract_placed_vm_ok_of_other_block_sat) open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (lsRetAddr624_base_add) open LibsignalBinary.Proofs.SessionRecordAt.Stage1X.GrowOneXBudget (fitsEnv_growOne104_iff growOne104Events) @@ -80,9 +82,9 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_derivePublicKeyBytes_budget_sat cliExternsPlaced_diffieHellman_budget_sat cliExternsPlaced_exactMemcpy_sat cliExternsPlaced_framelessMemcpy_budget_sat - cliExternsPlaced_realloc_budget_sat cliExternsPlaced_sessionMemmove_budget_sat - cliExternsPlaced_sessionMemsetRegion_budget_sat cliExternsPlaced_sharedSecretDrop_budget_sat - cliExternsPlaced_staticSecretDrop_budget_sat) + cliExternsPlaced_realloc_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat + cliGhostExterns_blackBoxSat_budget_sat cliGhostExterns_sessionMemmove_budget_sat + cliGhostExterns_sharedSecretDrop_budget_sat cliGhostExterns_staticSecretDrop_budget_sat) open LibsignalBinary.Proofs.TripleRatchet.Alloc.ChainKeyToPbBudget (chain_key_to_pb_placed_ok) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (chainKeyToPbSpec derivePublicKeyBytesBudgetSpec finishGrowEvents framelessMemcpyBudgetSpec @@ -105,6 +107,8 @@ open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat (HkdfPlacedHooksE open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat (HkdfPlacedHooksExactSat hookSat_sessionMemsetRegion_of_budget) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemsetRegionBudgetSpec) +open LibsignalBinary.Proofs.TripleRatchet.Keys.CreateChainBudget + (createChain_placed_ok_of_contracts) open LibsignalBinary.Proofs.TripleRatchet.Keys.DefsBudget (createChainSpec) private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) @@ -114,9 +118,10 @@ private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W (h5 : sym ≠ lsRustNoAllocShimSymCli := by decide) (h6 : sym ≠ lsStringCloneSym := by decide) (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) - (h9 : sym ≠ lsMemsetSym := by decide) (h10 : sym ≠ lsMemcpySym := by decide) : + (h9 : sym ≠ lsMemsetSym := by decide) (h10 : sym ≠ lsMemcpySym := by decide) + (hExtra : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans (cliExternsPlaced_row mmpl W hrow) private theorem mkHkdfPlacedHooksExactSat_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -168,17 +173,22 @@ private theorem createChain_507_cro_ok [LibsignalPlacement] {M : AllocCostModel} mkHkdfPlacedHooksExactSat_cli mmpl g W hG have _ : HkdfPlacedHooksExactBudgetSat W.C.F (cliGhostExterns g (cliExternsPlaced mmpl W)) := HkdfPlacedHooksExactBudgetSat.of_exactSat hMs - exact createChain_placed_ok_of_block_sat - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_diffieHellman_budget_sat mmpl W)) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sharedSecretDrop_budget_sat mmpl W)) - (cliGhost_row mmpl g W (blackBox_row_placed mmpl W)) - (noAllocShim_budget_sat mmpl g W hG.shim_eq) - (cliExternsPlaced_alloc_budget_sat mmpl g W hG) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W)) - (cliExternsPlaced_dealloc_budget_sat mmpl g W hG) + exact keys_ls_subroutine_ok_of_block_cro + (createChain_placed_ok_of_contracts + (keys_ls_subroutine_ok_of_block_cro + (calculateAgreement_placed_ok_unconditional_sat + (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W + (cliExternsPlaced_diffieHellman_budget_sat mmpl W)) + (cliGhostExterns_sharedSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) + (noAllocShim_budget_sat mmpl g W hG.shim_eq) + (cliExternsPlaced_alloc_budget_sat mmpl g W hG) + (cliGhostExterns_staticSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk))) + (extract_placed_vm_ok_of_other_block_sat W.C (cliGhostExterns g (cliExternsPlaced mmpl W))) + (expand_multi_info_placed_vm_ok_of_other_block_sat W.C + (cliGhostExterns g (cliExternsPlaced mmpl W))) + (keys_ls_hook_ok_of_mem (cliExternsPlaced_dealloc_budget_sat mmpl g W hG))) + (by decide) (by decide) (by decide) private theorem derivePk_507_cro_ok [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) : @@ -310,8 +320,7 @@ private theorem s3_commit_507_cli [LibsignalPlacement] {M : AllocCostModel} (keys_ls_hook_ok_of_mem (cliExternsPlaced_dealloc_budget_sat mmpl g W hG)) (keys_ls_hook_ok_of_mem (framelessMemcpy_budget_sat mmpl g W hG)) (keys_ls_hook_ok_of_mem - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W dropChainStack))) + (cliGhostExterns_sessionMemmove_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk dropChainStack)) (hlr_alloc := lsRetAddr624_base_add 508 0xa00#64 (by decide) (by decide)) (hlr_dealloc := lsRetAddr624_base_add 508 0xaf0#64 (by decide) (by decide)) (hlr_ls := lsRetAddr624_base_add 508 0xb8c#64 (by decide) (by decide)) @@ -336,8 +345,7 @@ theorem dhStep_pinned_507_cli [LibsignalPlacement] {M : AllocCostModel} have hsd : subroutine_ok ((blkPC_508).rebase (blkPl_508).base H) (lsmpl.ρ lsStaticDropSym) zeroizeSecretBudgetSpec := keys_ls_hook_ok_of_mem - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W)) + (cliGhostExterns_staticSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) exact s3_pinned_cro_placed_okT_cli hwp W.C A lim ctl S (createChain_507_cro_ok mmpl g W hG hMs) (derivePk_507_cro_ok mmpl g W) diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart5.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart5.lean index cc02ce6c6..87911d235 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart5.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/DecryptPq/RootTrapPlacedBudgetPart5.lean @@ -13,8 +13,10 @@ public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.DecryptPq.ConsumeMsgKeyTrap50 public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexBudgetSat import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove import LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.InstancesBudgetSat +import LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.Transfer import LibsignalBinary.Proofs.TripleRatchet.InImageCallees.CallsBudget /-! @@ -50,8 +52,8 @@ open CryptoVerification.SignalSession.Cli.RunGlue ( CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other ) open CryptoVerification.SignalSession.Cli.Slots ( - blackBox_row_placed cliGhostExterns_panic_all cliGhostExterns_sat_of_cliExternsPlaced - compress256_row_placed fmtWrite_row_placed memmove_row_placed + cliGhostExterns_panic_all cliGhostExterns_sat_of_cliExternsPlaced + compress256_row_placed fmtWrite_row_placed ) open LibsignalBinary.Heap ( AllocCostModel AllocEvent BudgetLimits RustCliAllocBudget @@ -69,20 +71,109 @@ open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DefsPlacedBudget (S4SeamPl open LibsignalBinary.Proofs.ConsumeMessageKey.AdvanceEpilogueProofs.FetchBudget ( CmkAllocHooks ) -open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove ( - hookSat_sessionMemmoveBoundedBudget_of_unbounded -) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_exactMemcpy_sat cliExternsPlaced_realloc_budget_sat - cliExternsPlaced_sessionMemmove_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat - cliExternsPlaced_shim_budget_sat -) -open LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.InstancesBudgetSat ( - cmk_raw_placed_cro_ok_at_block_sat + cliExternsPlaced_sessionMemsetRegion_budget_sat cliExternsPlaced_shim_budget_sat + cliGhostExterns_blackBoxSat_budget_sat cliGhostExterns_sessionMemmove_budget_sat ) open LibsignalBinary.Proofs.TripleRatchet.InImageCallees.CallsBudget (addr_display_placed_ok_at) +section CmkBbSat + +open SepProp +open CryptoGames.LibsignalSession (ShaCompress) +open CryptoVerification (IsLsBlockProg LibsignalCodeLoaded blkPC_24 blkPl_24 extract_withLsCodeLoaded lsRustReallocSym withLsCodeLoaded) +open CryptoVerification.LibsignalTripleRatchet (extract_withLsCodeRoLoaded withLsCodeRoLoaded) +open CryptoVerification.LibsignalTripleRatchet.ConsumeMessageKeyTransfer (ls_subroutine_ok_transfer_of_plain) +open LibsignalBinary.Heap (rustCliReallocBudgetSpec) +open LibsignalBinary.Proofs.ConsumeMessageKey.AdvanceEpilogueProofs.FetchBudget (CmkEnv cmkPlacedSpec) +open LibsignalBinary.Proofs.ConsumeMessageKey.AssemblyBudgetSat (grow_one_placed_ok_at_cmk_sat hmac_sha256_placed_ro_ok_at_cmk_sat) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexBudgetSat (find_receiver_chain_index_placed_ok_at_cmk_sat) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat (blackBoxSpecSat) +open LibsignalBinary.Proofs.ConsumeMessageKey.RunOfCalleesBudget (cmkPlacedRoSpec) +open LibsignalBinary.Proofs.ConsumeMessageKey.RunOfCalleesBudgetSat (consume_message_key_placed_ro_run_of_sat) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedBudgetSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore (HookSatExactMemcpy) +open LibsignalBinary.Proofs.TripleRatchet.Decrypt.ConsumeMsgKeyBudget (cmkRawSpecPlaced) +open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemsetRegionBudgetSpec) + +attribute [local irreducible] + CryptoVerification.LibsignalSession.cmkDummyImg + CryptoVerification.LibsignalTripleRatchet.Decrypt.tryDecryptPlacedImg + +private theorem cmkPlacedSpec_pre_eq_raw [LibsignalPlacement] (F : ShaCompress) + (A' : CryptoVerification.RustHeap.RustAlloc) + (x : CryptoVerification.LibsignalSession.ConsumeMessageKeyGhost) (s : State) : + (CryptoVerification.LibsignalSession.cmkPlacedSpec F A').pre x s = + (CryptoVerification.LibsignalTripleRatchet.Decrypt.KeyDerive.cmkRawSpecPlaced F A').pre x s ∗ + ⌜LibsignalCodeLoaded lsmpl s.mem⌝ := by + dsimp only [CryptoVerification.LibsignalSession.cmkPlacedSpec, + CryptoVerification.LibsignalTripleRatchet.Decrypt.KeyDerive.cmkRawSpecPlaced, + withLsCodeLoaded] + rw [CryptoVerification.LibsignalTripleRatchet.Decrypt.logOff_tryDecryptPlacedImg] + +private theorem cmkPlacedSpec_post_eq_raw [LibsignalPlacement] (F : ShaCompress) + (A' : CryptoVerification.RustHeap.RustAlloc) + (x : CryptoVerification.LibsignalSession.ConsumeMessageKeyGhost) (s0 sf : State) : + (CryptoVerification.LibsignalSession.cmkPlacedSpec F A').post x s0 sf = + (CryptoVerification.LibsignalTripleRatchet.Decrypt.KeyDerive.cmkRawSpecPlaced + F A').post x s0 sf := by + dsimp only [CryptoVerification.LibsignalSession.cmkPlacedSpec, + CryptoVerification.LibsignalTripleRatchet.Decrypt.KeyDerive.cmkRawSpecPlaced, + withLsCodeLoaded] + rw [CryptoVerification.LibsignalTripleRatchet.Decrypt.logOff_tryDecryptPlacedImg] + +private theorem cmk_raw_placed_cro_ok_at_block_bb_sat [LibsignalPlacement] + {callerProg : Program} {i : Nat} {M : AllocCostModel} + (F : ShaCompress) (A : RustCliAllocBudget M) (lim : BudgetLimits) + {H : String → Option (State → State)} [IsLsBlockProg callerProg i H] + (hA : CmkAllocHooks A lim H) + (hmm : HookSat H "memmove" (sessionMemmoveBoundedBudgetSpec 4096)) + (h_bb : HookSat H lsBlackBoxU8Sym blackBoxSpecSat) + (h_realloc : HookSat H lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) + (h_mc : HookSatExactMemcpy H CryptoVerification.LibsignalSession.CryptoHmacSha256.lsMemcpySym) + (h_ms : HookSat H CryptoVerification.LibsignalSession.CryptoHmacSha256.lsMemsetSym + sessionMemsetRegionBudgetSpec) + (h_c256 : H CryptoVerification.LibsignalSession.CryptoHmacSha256.lsCompress256Sym = + some (CryptoVerification.LibsignalHmac.compress256Hook F)) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 24) + (withLsCodeRoLoaded lsmpl (cmkRawSpecPlaced F A lim CmkEnv)) := by + have hcmk0 : subroutine_ok ((blkPC_24).rebase (blkPl_24).base H) (blkPl_24).base + (cmkPlacedRoSpec F A lim) := + consume_message_key_placed_ro_run_of_sat F A lim H + (find_receiver_chain_index_placed_ok_at_cmk_sat A h_bb) + (hmac_sha256_placed_ro_ok_at_cmk_sat F h_mc h_ms h_c256) + (grow_one_placed_ok_at_cmk_sat hA h_realloc) hA hmm + have htr : subroutine_ok callerProg (lsmpl.base 24) + (withLsCodeLoaded lsmpl (cmkPlacedRoSpec F A lim)) := + ls_subroutine_ok_transfer_of_plain hcmk0 hi + refine subroutine_ok_outcome_intro fun ⟨x, st_init⟩ R s0 hpc hrun hpre hsp => ?_ + have ⟨⟨hcl, hro⟩, hp⟩ := extract_withLsCodeRoLoaded hpre + refine htr.mono_outcome (x, st_init) R s0 hpc hrun ?_ hsp fun sf hout => ?_ + · dsimp only [cmkRawSpecPlaced] at hp + rw [sepConj_assoc, satisfies_pure_sepConj] at hp + dsimp only [withLsCodeLoaded, cmkPlacedRoSpec, cmkPlacedSpec] + rw [sepConj_assoc, sepConj_left_comm, satisfies_pure_sepConj] + refine ⟨hcl, ?_⟩ + rw [cmkPlacedSpec_pre_eq_raw, sepConj_assoc, sepConj_assoc, satisfies_pure_sepConj] + refine ⟨hp.1, ?_⟩ + rw [sepConj_assoc, sepConj_left_comm, satisfies_pure_sepConj] + refine ⟨hcl, ?_⟩ + rw [sepConj_left_comm, satisfies_pure_sepConj] + exact ⟨hro, hp.2⟩ + · rcases hout with ⟨hret, hcc, hq⟩ | ⟨hpan, hq⟩ | ⟨code, hex, hq⟩ | ⟨hoom, hq⟩ + · refine Or.inl ⟨hret, hcc, ?_⟩ + dsimp only [cmkPlacedRoSpec, cmkPlacedSpec, cmkRawSpecPlaced, withLsCodeRoLoaded] at hq ⊢ + simp only [cmkPlacedSpec_post_eq_raw] at hq + exact hq + · exact Or.inr (Or.inl ⟨hpan, hq⟩) + · exact Or.inr (Or.inr (Or.inl ⟨code, hex, hq⟩)) + · exact Or.inr (Or.inr (Or.inr ⟨hoom, hq⟩)) + +end CmkBbSat + /-! ## Hook and Bundle Witnesses -/ private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) @@ -93,9 +184,10 @@ private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans (cliExternsPlaced_row mmpl W hrow) private theorem cmkAllocHooks_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -145,13 +237,11 @@ theorem s4_507_cli_ofEnv [LibsignalPlacement] {M : AllocCostModel} have haddrDisplay := subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded (addr_display_placed_ok_at (prog := (blkPC_508).rebase (blkPl_508).base H) hFmtWrite) - have hcmk := cmk_raw_placed_cro_ok_at_block_sat + have hcmk := cmk_raw_placed_cro_ok_at_block_bb_sat (callerProg := (blkPC_508).rebase (blkPl_508).base H) W.C.F A lim (cmkAllocHooks_cli mmpl g W hG) - (hookSat_sessionMemmoveBoundedBudget_of_unbounded 4096 - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W 4096))) - (cliGhost_row mmpl g W (blackBox_row_placed mmpl W)) + (cliGhostExterns_sessionMemmove_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk 4096) + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) (cliExternsPlaced_realloc_budget_sat mmpl g W hG) (cliExternsPlaced_exactMemcpy_sat mmpl g W hG) (cliExternsPlaced_sessionMemsetRegion_budget_sat mmpl g W hG) diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Kits/StageP2PurePlacedBbSat.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Kits/StageP2PurePlacedBbSat.lean new file mode 100644 index 000000000..c6b07a60f --- /dev/null +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Kits/StageP2PurePlacedBbSat.lean @@ -0,0 +1,65 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlaced -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedSat -- proof-setup: allow-public-import + +/-! +# `HookSat` `black_box` Sibling of `StageP2PurePlaced` (`Kits/StageP2PurePlacedBbSat.lean`) + +Provides `isSameAccount_placed_ok_on_stageP1_sat` and `isSameAccount_4k_placed_ok_on_stageP1_sat` +on `stageP1ProgPlaced ext` from `HookSat ext lsBlackBoxU8Sym blackBoxSpecSat` (replacing +`ext lsBlackBoxU8Sym = some blackBoxHook` in `StageP2PurePlaced.lean:455, 466`). +-/ + +public section + +set_option autoImplicit false + +namespace LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBbSat + +open Arm64 ProofLib +open CryptoVerification + (LibsignalPlacement blkPC_252 blkPl_252 lsBlackBoxU8Sym lsmpl withLsCodeLoaded) +open CryptoVerification.RustHeap (RustAlloc) +open CryptoVerification.LibsignalTripleRatchet (uuidTryParseCodeSpec) +open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) +open CryptoVerification.E2E.Pqxdh.WireEntries (isSameAccountDistinctSpec) +open CryptoVerification.Cli.LibsignalTripleRatchet.DecryptPq (isSameAccountDistinctSpecExt) +open CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Kits + (isSameAccountDistinctSpec_lscl_to_ext stageP1ProgPlaced) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat (blackBoxSpecSat) +open LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedSat + (isSameAccountEqDistinct_placed_ok_at_sat) + +/-- `::is_same_account` (`lsmpl.base 17`) on `stageP1ProgPlaced ext` from +`HookSat ext lsBlackBoxU8Sym blackBoxSpecSat`. -/ +theorem isSameAccount_placed_ok_on_stageP1_sat [LibsignalPlacement] {A : RustAlloc} + {ext : String → Option (State → State)} + (hBb : HookSat ext lsBlackBoxU8Sym blackBoxSpecSat) + (hUuid : subroutine_ok ((blkPC_252).rebase (blkPl_252).base ext) (blkPl_252).base + (withLsCodeLoaded lsmpl (uuidTryParseCodeSpec uuidTryParse))) : + subroutine_ok (stageP1ProgPlaced ext) (lsmpl.base 17) + (withLsCodeLoaded lsmpl (isSameAccountDistinctSpec A uuidTryParse)) := + isSameAccountEqDistinct_placed_ok_at_sat A hBb hUuid (by decide) + +/-- 4K/`Ext` `::is_same_account` (`lsmpl.base 17`) on `stageP1ProgPlaced ext` from +`HookSat ext lsBlackBoxU8Sym blackBoxSpecSat`. -/ +theorem isSameAccount_4k_placed_ok_on_stageP1_sat [LibsignalPlacement] {A : RustAlloc} + {ext : String → Option (State → State)} + (hBb : HookSat ext lsBlackBoxU8Sym blackBoxSpecSat) + (hUuid : subroutine_ok ((blkPC_252).rebase (blkPl_252).base ext) (blkPl_252).base + (withLsCodeLoaded lsmpl (uuidTryParseCodeSpec uuidTryParse))) : + subroutine_ok (stageP1ProgPlaced ext) (lsmpl.base 17) + (withLsCodeLoaded lsmpl (isSameAccountDistinctSpecExt A uuidTryParse)) := + isSameAccountDistinctSpec_lscl_to_ext (isSameAccount_placed_ok_on_stageP1_sat hBb hUuid) + +end LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBbSat diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Kits/StageP2PurePlacedBudgetSat.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Kits/StageP2PurePlacedBudgetSat.lean index 54d7d9763..49c9acf08 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Kits/StageP2PurePlacedBudgetSat.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Kits/StageP2PurePlacedBudgetSat.lean @@ -13,14 +13,19 @@ public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2 public import LibsignalBinary.Proofs.Cli.E2E.V1.BobTailV1PlacedBudgetSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.E2E.Pqxdh.FullPlacementCorollariesBudgetSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedBudgetSat -- proof-setup: allow-public-import /-! # `HookSat` Sibling of `StageP2PurePlacedBudget` (`Kits/StageP2PurePlacedBudgetSat.lean`) -Provides the 20 closed `[LibsignalFullPlacement]` `initialize_bob_session` (Block `75`) -bridges on `stageP1ProgPlaced ext` from Section 6 of `StageP2PurePlacedBudget` re-typed over -`PqxdhPlacedHookContractsSat` (replacing `HkdfPlacedHooks`'s `memset` equality with -`HookSat ext lsMemsetSym sessionMemsetRegionBudgetSpec`). +Provides: +- `isSameAccount_placed_ok_on_stageP1_sat` and `isSameAccount_4k_placed_ok_on_stageP1_sat` on + `stageP1ProgPlaced ext` from `HookSat ext lsBlackBoxU8Sym blackBoxSpecSat` (replacing + `ext lsBlackBoxU8Sym = some blackBoxHook`); +- the closed `[LibsignalFullPlacement]` `initialize_bob_session` (Block `75`) + bridges on `stageP1ProgPlaced ext` from Section 6 of `StageP2PurePlacedBudget` re-typed over + `PqxdhPlacedHookContractsSat` (replacing `HkdfPlacedHooks`'s `memset` equality with + `HookSat ext lsMemsetSym sessionMemsetRegionBudgetSpec`). -/ set_option autoImplicit false @@ -32,9 +37,11 @@ namespace LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Pure open Arm64 ProofLib SepProp open CryptoGames.LibsignalSession (Crypto ShaCompress) open CryptoVerification - (LibsignalCodeLoaded LibsignalFrozen LibsignalFullPlacement - lsMemcpySym lsProg_75 lsmpl) -open CryptoVerification.LibsignalTripleRatchet (withLsCodeRoLoaded) + (LibsignalCodeLoaded LibsignalFrozen LibsignalFullPlacement LibsignalPlacement + blkPC_252 blkPl_252 lsBlackBoxU8Sym lsMemcpySym lsProg_75 lsmpl withLsCodeLoaded) +open CryptoVerification.RustHeap (RustAlloc) +open CryptoVerification.LibsignalTripleRatchet (uuidTryParseCodeSpec withLsCodeRoLoaded) +open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) open CryptoVerification.LibsignalPublicApi.StoreKit (LibsignalCodeRoLoaded) open CryptoVerification.E2E.Pqxdh.Initiator (AcceptKeysInput Bytes Primitives StructuralPrims) @@ -45,8 +52,12 @@ open CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Kits (stageP1ProgPlaced) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FitsEnv RustCliAllocBudget SeqEnv) open LibsignalBinary.Heap.RustStdAllocBudgetBridge (allocMemcpyVmSpec) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat (blackBoxSpecSat) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemcpyRegionBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (framelessMemcpySpec) +open LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedBudgetSat + (isSameAccountEqDistinct_placed_ok_at_sat) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.AcceptPlacedABudget (AcceptOptFieldsEnv) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat (PqxdhPlacedHookContractsSat) @@ -66,14 +77,40 @@ open LibsignalBinary.Proofs.Cli.E2E.V1.BobTailV1PlacedBudget open LibsignalBinary.Proofs.Cli.E2E.V1.BobTailV1PlacedBudgetSat (initializeBobSession_ok_v1_full_placed_of_env_of_session_sat initializeBobSession_ok_v1_full_placed_of_env_std_sat) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2DefsBudget + (isSameAccountDistinctSpec isSameAccountDistinctSpecExt) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2DefsPlacedBudget (InitializeBobV1FrozenOkPlaced4KOfEnv InitializeBobV1FrozenOkPlacedOfEnv) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Sub1PlacedBudget + (isSameAccountDistinctSpec_lscl_to_ext) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Sub5DefsPlacedBudget (of_stageP2Defs_errOwned4K_frozen_placed) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget (InitializeBobV1OptFieldsEnv ls_sepWPp_of_block p2_errOwned_frozen_to_defs4K_placed p2_initBobV1FrozenPlacedOfEnv_to_4K) +/-- `::is_same_account` (`lsmpl.base 17`, `withVmPreserved`) on `stageP1ProgPlaced ext` +from `HookSat ext lsBlackBoxU8Sym blackBoxSpecSat`. -/ +public theorem isSameAccount_placed_ok_on_stageP1_sat [LibsignalPlacement] {A : RustAlloc} + {ext : String → Option (State → State)} + (hBb : HookSat ext lsBlackBoxU8Sym blackBoxSpecSat) + (hUuid : subroutine_ok ((blkPC_252).rebase (blkPl_252).base ext) (blkPl_252).base + (withLsCodeLoaded lsmpl (withVmPreserved (uuidTryParseCodeSpec uuidTryParse)))) : + subroutine_ok (stageP1ProgPlaced ext) (lsmpl.base 17) + (withLsCodeLoaded lsmpl (isSameAccountDistinctSpec A uuidTryParse)) := + isSameAccountEqDistinct_placed_ok_at_sat A hBb hUuid (by decide) + +/-- 4K/`Ext` `::is_same_account` (`lsmpl.base 17`, `withVmPreserved`) on +`stageP1ProgPlaced ext` from `HookSat ext lsBlackBoxU8Sym blackBoxSpecSat`. -/ +public theorem isSameAccount_4k_placed_ok_on_stageP1_sat [LibsignalPlacement] {A : RustAlloc} + {ext : String → Option (State → State)} + (hBb : HookSat ext lsBlackBoxU8Sym blackBoxSpecSat) + (hUuid : subroutine_ok ((blkPC_252).rebase (blkPl_252).base ext) (blkPl_252).base + (withLsCodeLoaded lsmpl (withVmPreserved (uuidTryParseCodeSpec uuidTryParse)))) : + subroutine_ok (stageP1ProgPlaced ext) (lsmpl.base 17) + (withLsCodeLoaded lsmpl (isSameAccountDistinctSpecExt A uuidTryParse)) := + isSameAccountDistinctSpec_lscl_to_ext (isSameAccount_placed_ok_on_stageP1_sat hBb hUuid) + /-- Closed `[LibsignalFullPlacement]` rejecting run of `initialize_bob_session` (`lsmpl.base 75`, `withLsCodeRoLoaded lsmpl (initializeBobSessionErrFrozenPlacedSpec ...)`) on `stageP1ProgPlaced ext` under `PqxdhPlacedHookContractsSat`. -/ diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Matched/M2TopPlacedBudgetSat.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Matched/M2TopPlacedBudgetSat.lean new file mode 100644 index 000000000..ab9a43441 --- /dev/null +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Matched/M2TopPlacedBudgetSat.lean @@ -0,0 +1,1047 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Heap.IfaceBudget +public import LibsignalBinary.Heap.IfaceBudgetLemmas +public import LibsignalBinary.Heap.SpecBudget +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M1PlacedBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2BridgePlacedBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2BridgePlacedBudgetSat -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2OkPlacedBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2PlacedBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2StepsBBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TailPlacedBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlaced -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.RespClosureCodeSym -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.PublicApi.StoreKit.PlacedBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.TripleRatchet.FromRecordCallees.DefsBudget -- proof-setup: allow-public-import +import Arm64.Trusted.Spec.Hoare +import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP1Comb +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP4StoreSession +import LibsignalBinary.Proofs.Common.SharedHelpers +meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderClosure.AssemblyP3b2 +import ProofLib.SepLogic.WPp + +/-! +# `HookSat`-Backed Budget-Threaded Top-Level Stage P2 Matched-Session Contract + +Additive `HookSat (Rust.withPanics ext) lsBlackBoxU8Sym blackBoxSpecSat` sibling of +`LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedBudget` on Block `518` +(`lsProg_518 (Rust.withPanics ext)`). Carves `80` B (`publicKeyEqMemBudgetSpec16`) out of +`stackAt sp rootStack` (`262144` B), keeping all outer theorem conclusions identical to +`M2TopPlacedBudget`. +-/ + +public section + +set_option autoImplicit false +set_option maxRecDepth 200000 +set_option maxHeartbeats 400000 +set_option linter.unusedSimpArgs false + +namespace LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedBudgetSat + +noncomputable section + +open Arm64 ProofLib SepProp +open CryptoGames.LibsignalSession (IdentityKey PublicKey SessionState) +open CryptoGames.LibsignalSessionApi (Session SessionRecord) +open CryptoVerification ( + LibsignalPlacement lsBlackBoxU8Sym lsLogFilterAddr ls_subroutine_ok_of_block lsmpl lsρ + withLsCodeLoaded +) +open CryptoVerification.RustHeap (RustAlloc) +open CryptoVerification.LibsignalTripleRatchet (rootStack) +open CryptoVerification.LibsignalTripleRatchet.Getters (remoteIdentityOkAt) +open CryptoVerification.LibsignalTripleRatchetRepr (SessionGhost sessionStateAt) +open CryptoVerification.LibsignalPublicApiRepr ( + RecordGhost apiDecResultAt sessionRecordAt +) +open CryptoVerification.LibsignalPublicApi.StoreKit ( + LibsignalCodeRoLoaded subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded +) +open CryptoVerification.E2E.Pqxdh.ResponderClosure ( + ClosureCalleeSaved decryptPrekeySavedRegsAt +) +open CryptoVerification.E2E.Pqxdh.ResponderClosure.P3P4 ( + SepWPp.weaken_frame entails_replace_sub eq_of_sep_emp +) +open CryptoVerification.CliHandshake.RespClosurePlaced (blkPl_518 lsProg_518) +open scoped CryptoVerification.CliHandshake.RespClosurePlaced +open CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Kits ( + SessionExtraRel stackAt_split_of_le +) +open CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Matched ( + chunks32At coro_2a0_split32_placed memRegion_32_eq_chunks32 memRegion_34_split_24_10 + memRegion_34_split_32_2 memRegion_920_6_join memRegion_920_6_split memRegion_a90_48_join_10_38 + memRegion_a90_48_split_10_38 mismatchRemoteIkStrPlaced pack16LE pack32LE pack64LE + pointsToBytes_32_eq_chunks32 prevSessionsEmptyAt processPrekeyActive10At_eq_placed + publicKey_beq_false_of_ne_placed rem34_bytes_entails_memRegion34 remoteIdentityOkAt_none_eq + remoteIdentityOkAt_some_eq +) +open LibsignalBinary.Heap ( + AllocCostModel AllocEvent BudgetLimits FitsEnv FitsEvents RustCliAllocBudget VmPreserved + rustCliDeallocBudgetSpec +) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( + publicKeySerializeSpec +) +open LibsignalBinary.Proofs.TripleRatchet.FromRecordCallees.DefsBudget ( + dropSessionStructureLocal2Spec +) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat ( + blackBoxSpecSat publicKeyEqMemBudgetSpec16 publicKeyEqMemSpec16 + publicKey_eq_mem_placed_vm_ok_16_sat +) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2BridgePlacedBudget ( + StageP2MatchedBridgeEnv stageP2MatchedBridgeEvents +) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2BridgePlacedBudgetSat ( + stageP2_matched_0868_to_094c_placed_sat +) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2OkPlacedBudget ( + bind_sepWPp_nopanic_state p2_seg_094c_ok_placed_wp p2_seg_094c_ok_vm_placed_wp + p2_seg_1064_none_placed_wp p2_seg_1064_some_load_vm_placed_wp + p2_seg_1094_some_store_vm_placed_wp p2_seg_10cc_mismatch_placed_wp + sepWPp_frame_pool_drop_vm sepWPp_lift_qp stageP2_matched_ok_10cc_to_1778_vm_placed +) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2PlacedBudget ( + bind_sepWP_lscro_steps_m2_placed call_lscro_nopanic_m2_placed +) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2StepsBBudget ( + strToOwnedEvents strToOwnedLocal2Spec +) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TailPlacedBudget ( + StageP2MismatchTailEnv stageP2MismatchTailPostAtPlaced stageP2MismatchTailPrePlaced + stageP2_matched_mismatch_tail_exists_placed +) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedBudget ( + StageP2MatchedEnv StageP2MatchedMismatchEnv + fitsEnv_publicKeySerialize_of_matchedEnv fitsEvents_mismatchTail_of_matchedEnv + stageP2MatchedMatchPrePlaced stageP2MatchedMismatchEnv_of_tail + stageP2MatchedMismatchPostPlaced stageP2MatchedPrePlaced +) + +attribute [local irreducible] Program.fetch Program.externAt? Program.fnOff +attribute [local arm64_norm] bv_sub_add_lit BitVec.add_assoc BitVec.toNat_zero + +local macro "sep_norm" : tactic => + `(tactic| repeat (first + | simp only [↓reduceIte] + | simp only [BitVec.add_assoc] + | simp only [BitVec.reduceAdd] + | simp only [sepExists_sepConj_left] + | simp only [sepExists_sepConj_right] + | simp only [emp_sepConj] + | simp only [sepConj_emp] + | simp only [sepConj_assoc])) + +private theorem stack_root_to_pkEq16_mem_placed (sp : BitVec 64) (hn : rootStack ≤ 2 ^ 64) : + stackAt sp rootStack = + memRegion (sp - BitVec.ofNat 64 rootStack) (rootStack - 80) ∗ + memRegion (sp - 80#64) 80 := by + rw [stackAt_split_of_le sp rootStack 80 (by decide) hn] + +private theorem sepWPp_ret_frame_nopanic {prog : Program} {ret : BitVec 64} {s : State} + {P P_stage F : SepProp} {Q_stage Q Qp : State → SepProp → Prop} + (hstage : SepWPp prog ret s P_stage Q_stage (fun _ _ => False)) + (hP : P = P_stage ∗ F) + (hret : ∀ sf P_f, Steps prog s sf → sf.pc = ret → sf.status = .Running → + Q_stage sf P_f → Q sf (P_f ∗ F)) : + SepWPp prog ret s P Q Qp := by + intro R hm hL + rw [hP, sepConj_assoc] at hm + obtain ⟨sf, hsteps, ⟨hpcf, hrunf, P_f, hmf, hqf⟩ | ⟨_, _, _, hpan⟩ | ⟨_, hoom⟩⟩ := + hstage (F ∗ R) hm hL + · rw [← sepConj_assoc] at hmf + exact ⟨sf, hsteps, Or.inl ⟨hpcf, hrunf, P_f ∗ F, hmf, hret sf P_f hsteps hpcf hrunf hqf⟩⟩ + · exact False.elim hpan + · exact (not_satisfies_false_sepConj hoom).elim + +/-! ## Remote-identity `Some ik` check (`+0x094c → +0x10cc`) under `HookSat` -/ + +set_option maxHeartbeats 1200000 in +/-- `HookSat`-backed sibling of `M2OkPlacedBudget.stageP2_matched_094c_some_to_10cc_vm_placed`. -/ +theorem stageP2_matched_094c_some_to_10cc_vm_placed_sat [LibsignalPlacement] + {ext : String → Option (State → State)} + (h_bb : HookSat (Rust.withPanics ext) lsBlackBoxU8Sym blackBoxSpecSat) + (s : State) + (sp coroPtr outPtr msgPtr : BitVec 64) + (remIdKey ik : IdentityKey) + (hcro : LibsignalCodeRoLoaded lsmpl s.mem) + (hsp_eq : s.sp = sp) + (hsp_root : rootStack ≤ sp.toNat) + (hpc : s.pc = (blkPl_518).base + 0x94c#64) + (hrun : s.status = .Running) + (hsp_align : (s.sp &&& 15#64 == 0#64) = true) + (hx19 : s.readReg64 .x19 = coroPtr) + (hx21 : s.readReg64 .x21 = sp + 0x370#64) + (hx25 : s.readReg64 .x25 = sp + 0x210#64) + (hx28 : s.readReg64 .x28 = sp + 0xa90#64) : + SepWPp (lsProg_518 (Rust.withPanics ext)) ((blkPl_518).base + 0x10cc#64) s + (remoteIdentityOkAt (sp + 0x3e0#64) (some ik) ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + stackAt sp rootStack) + (fun s4 P_f => + (P_f ⊢ + memRegion (sp + 0x3e0#64) 34 ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + stackAt sp rootStack) ∧ + VmPreserved s s4 ∧ + (s4.sp = sp ∧ + s4.trace = s.trace ∧ + s4.readReg64 .x0 = (if remIdKey.publicKey == ik.publicKey then 1#64 else 0#64) ∧ + s4.readReg64 .x19 = coroPtr ∧ + s4.readReg64 .x25 = sp + 0x210#64 ∧ + s4.readReg64 .x26 = outPtr ∧ + s4.readReg64 .x28 = sp + 0xa90#64 ∧ + s4.readReg64 .x29 = s.readReg64 .x29 ∧ + calleeSavedVRegs s4 = calleeSavedVRegs s ∧ + LibsignalCodeRoLoaded lsmpl s4.mem)) + (fun _ _ => False) := by + have hroot_le : rootStack ≤ 2 ^ 64 := Nat.le_trans hsp_root (Nat.le_of_lt sp.isLt) + let bs := ik.publicKey.bytes.toList + have hbs_len : bs.length = 32 := ik.publicKey.bytes.property + let w0 := pack32LE (bs.take 4) + let h1 := pack16LE ((bs.drop 4).take 2) + let q2 := pack64LE ((bs.drop 6).take 8) + let q3 := pack64LE ((bs.drop 14).take 8) + let q4 := pack64LE ((bs.drop 22).take 8) + let h5 := pack16LE (bs.drop 30) + conv => arg 4; rw [remoteIdentityOkAt_some_eq sp ik, + show ik.publicKey.bytes.toList = bs from rfl, + pointsToBytes_32_eq_chunks32 (sp + 0x3e2#64) bs hbs_len, + memRegion_920_6_split sp, memRegion_a90_48_split_10_38 sp] + dsimp only [chunks32At] + simp only [BitVec.add_assoc, BitVec.reduceAdd, sepConj_assoc] + sep_norm + refine SepWPp.exists_elim fun u_920 => SepWPp.exists_elim fun u_924 => + SepWPp.exists_elim fun u_a90 => SepWPp.exists_elim fun u_a98 => ?_ + have h094c := p2_seg_094c_ok_vm_placed_wp ext s coroPtr outPtr hpc hrun hsp_align hx19 + rw [hsp_eq] at h094c + refine bind_sepWP_lscro_steps_m2_placed hcro h094c (by sep_focus) + fun s1 _ hpc1 hrun1 hcro1 ⟨hvm1, hregs1⟩ => ?_ + rcases hregs1 with ⟨hsp1_s, htr1_s, hvregs1, hx19_1, hx21_1, _, _, hx25_1, hx26_1, _, hx28_1, hx29_1, _⟩ + have hsp1 : s1.sp = sp := hsp1_s + have hsp1_align : (s1.sp &&& 15#64 == 0#64) = true := by rw [hsp1, ← hsp_eq]; exact hsp_align + have hx21_1' : s1.readReg64 .x21 = s1.sp + 0x370#64 := by rw [hsp1]; exact hx21_1.trans hx21 + have h1064 := p2_seg_1064_some_load_vm_placed_wp ext s1 coroPtr q2 q3 q4 u_a90 + w0 u_920 h1 h5 u_924 u_a98 hpc1 hrun1 hsp1_align hx19_1 hx21_1' + rw [hsp1] at h1064 + refine bind_sepWP_lscro_steps_m2_placed hcro1 h1064 (by sep_focus) + fun s2 _ hpc2 hrun2 hcro2 ⟨hvm2, hregs2⟩ => ?_ + rcases hregs2 with ⟨hsp2_1, htr2_1, hvregs2, hx8_2, hx9_2, hx19_2, hx21_2, hx25_2, hx26_2, _, hx28_2, hx29_2, _⟩ + have hsp2 : s2.sp = sp := hsp2_1 + have hsp2_align : (s2.sp &&& 15#64 == 0#64) = true := by rw [hsp2, ← hsp_eq]; exact hsp_align + have hx21_2' : s2.readReg64 .x21 = s2.sp + 0x370#64 := by rw [hsp2]; exact hx21_2 + have hrepack34 : + ((sp + 0x3e0#64) ↦₈ 0#8) ∗ ((sp + 0x3e1#64) ↦₈ 1#8) ∗ + chunks32At (sp + 0x3e2#64) w0 h1 q2 q3 q4 h5 ⊢ + memRegion (sp + 0x3e0#64) 32 ∗ memRegion (sp + 0x400#64) 2 := by + rw [← memRegion_34_split_32_2 sp] + exact rem34_bytes_entails_memRegion34 sp 0#8 1#8 w0 h1 q2 q3 q4 h5 + dsimp only [chunks32At] at hrepack34 + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hrepack34 + refine SepWPp.weaken_frame hrepack34 (by sep_focus) ?_ + conv => arg 4; rw [memRegion_32_eq_chunks32 (sp + 0x3e0#64)] + dsimp only [chunks32At] + simp only [BitVec.add_assoc, BitVec.reduceAdd, sepConj_assoc] + sep_norm + refine SepWPp.exists_elim fun d0 => SepWPp.exists_elim fun d1 => + SepWPp.exists_elim fun d2 => SepWPp.exists_elim fun d3 => + SepWPp.exists_elim fun d4 => SepWPp.exists_elim fun d5 => ?_ + have h1094 := p2_seg_1094_some_store_vm_placed_wp ext s2 coroPtr msgPtr q2 q3 q4 d2 d3 d4 + w0 d0 h1 h5 d1 d5 hpc2 hrun2 hsp2_align hx8_2 hx9_2 hx19_2 hx21_2' + rw [hsp2] at h1094 + refine bind_sepWP_lscro_steps_m2_placed hcro2 h1094 (by sep_focus) + fun s3 _ hpc3 hrun3 hcro3 ⟨hvm3, hregs3⟩ => ?_ + rcases hregs3 with ⟨hsp3_2, htr3_2, hvregs3, hx0_3, hx1_3, hx19_3, _, hx25_3, hx26_3, _, hx28_3, hx29_3, hx30_3⟩ + have hsp3 : s3.sp = sp := hsp3_2 + have hsp3_al : s3.spAligned = true := by + simpa only [State.spAligned, hsp3, ← hsp_eq] using hsp_align + have hfold_bs : + ((sp + 0x3e0#64) ↦₃₂ w0) ∗ ((sp + 0x3e4#64) ↦₁₆ h1) ∗ + ((sp + 0x3e6#64) ↦₆₄ q2) ∗ ((sp + 0x3ee#64) ↦₆₄ q3) ∗ + ((sp + 0x3f6#64) ↦₆₄ q4) ∗ ((sp + 0x3fe#64) ↦₁₆ h5) = + ((sp + 0x3e0#64) ↦ₛ ik.publicKey.bytes.toList) := by + rw [show ik.publicKey.bytes.toList = bs from rfl, + pointsToBytes_32_eq_chunks32 (sp + 0x3e0#64) bs hbs_len] + dsimp only [chunks32At, w0, h1, q2, q3, q4, h5] + simp only [BitVec.add_assoc, BitVec.reduceAdd, sepConj_assoc] + refine SepWPp.weaken_frame (Entails.of_eq hfold_bs) (by sep_focus) ?_ + refine SepWPp.weaken_frame (Entails.of_eq (stack_root_to_pkEq16_mem_placed sp hroot_le)) (by sep_focus) ?_ + have hpkeq := subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded + (ls_subroutine_ok_of_block (callerProg := lsProg_518 (Rust.withPanics ext)) + (j := 212) (entry := lsmpl.base 212) + (publicKey_eq_mem_placed_vm_ok_16_sat h_bb) + (by decide)) + refine call_lscro_nopanic_m2_placed + (spec := publicKeyEqMemBudgetSpec16) + (x := (msgPtr + 0xc8#64, remIdKey.publicKey, sp + 0x3e0#64, ik.publicKey, sp)) + (T := ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + ((sp + 0x3e0#64) ↦ₛ ik.publicKey.bytes.toList) ∗ + memRegion (sp - 80#64) 80) + hcro3 hpkeq hpc3 hrun3 hsp3_al hx30_3 + (by dsimp only [publicKeyEqMemBudgetSpec16, withVmPreserved, publicKeyEqMemSpec16]) + (And.intro hx0_3 (And.intro hx1_3 hsp3)) (by sep_focus) + (hoom_false := fun _ => rfl) + (hnext := fun s4 _ hpc4 hrun4 hsp4_3 _ hcs4 hcro4 => ?_) + dsimp only [publicKeyEqMemBudgetSpec16, withVmPreserved, publicKeyEqMemSpec16] + simp only [sepConj_assoc] + refine SepWPp.pure_elim fun hvm4 => SepWPp.pure_elim fun ⟨hx0_4, htr4_3⟩ => ?_ + refine SepWPp.weaken_frame (Entails.of_eq (stack_root_to_pkEq16_mem_placed sp hroot_le).symm) (by sep_focus) ?_ + rcases hcs4 with ⟨hx19_cs4, _, _, _, _, _, hx25_cs4, hx26_cs4, _, hx28_cs4, hx29_cs4, hvregs_cs4⟩ + refine SepWPp.done hpc4 hrun4 ⟨?_, hvm1.trans (hvm2.trans (hvm3.trans hvm4)), + hsp4_3.trans hsp3, + htr4_3.trans (htr3_2.trans (htr2_1.trans htr1_s)), + hx0_4, hx19_cs4.trans hx19_3, + hx25_cs4.trans (hx25_3.trans (hx25_2.trans (hx25_1.trans hx25))), + hx26_cs4.trans (hx26_3.trans (hx26_2.trans hx26_1)), + hx28_cs4.trans (hx28_3.trans (hx28_2.trans (hx28_1.trans hx28))), + hx29_cs4.trans (hx29_3.trans (hx29_2.trans hx29_1)), + hvregs_cs4.trans (congrArg VRegFile.calleeSaved (hvregs3.trans (hvregs2.trans hvregs1))), + hcro4⟩ + have hbs34 : + ((sp + 0x3e0#64) ↦ₛ ik.publicKey.bytes.toList) ∗ memRegion (sp + 0x400#64) 2 ⊢ + memRegion (sp + 0x3e0#64) 34 := by + rw [memRegion_34_split_32_2 sp] + refine sepConj_mono_left ?_ + simpa only [hbs_len] using ProofLib.pointsToBytes_entails_memRegion (sp + 0x3e0#64) bs + refine Entails.trans (entails_replace_sub hbs34 (by sep_focus) rfl) ?_ + refine Entails.trans (entails_replace_sub (memRegion_920_6_join sp w0 h1) (by sep_focus) rfl) ?_ + exact entails_replace_sub (memRegion_a90_48_join_10_38 sp q4 h5) (by sep_focus) + (eq_of_sep_emp (by sep_focus)) + +set_option maxHeartbeats 1200000 in +/-- `HookSat`-backed sibling of `M2OkPlacedBudget.stageP2_matched_094c_some_to_10cc_placed`. -/ +theorem stageP2_matched_094c_some_to_10cc_placed_sat [LibsignalPlacement] + {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} + {ext : String → Option (State → State)} {Qp : State → SepProp → Prop} + (h_bb : HookSat (Rust.withPanics ext) lsBlackBoxU8Sym blackBoxSpecSat) + (st : M.σ) (s : State) + (sp coroPtr outPtr msgPtr : BitVec 64) + (remIdKey ik : IdentityKey) + (hcro : LibsignalCodeRoLoaded lsmpl s.mem) + (hsp_eq : s.sp = sp) + (hsp_root : rootStack ≤ sp.toNat) + (hpc : s.pc = (blkPl_518).base + 0x94c#64) + (hrun : s.status = .Running) + (hsp_align : (s.sp &&& 15#64 == 0#64) = true) + (hx19 : s.readReg64 .x19 = coroPtr) + (hx21 : s.readReg64 .x21 = sp + 0x370#64) + (hx25 : s.readReg64 .x25 = sp + 0x210#64) + (hx28 : s.readReg64 .x28 = sp + 0xa90#64) : + SepWPp (lsProg_518 (Rust.withPanics ext)) ((blkPl_518).base + 0x10cc#64) s + (remoteIdentityOkAt (sp + 0x3e0#64) (some ik) ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + A.pool lim st s ∗ + stackAt sp rootStack) + (fun s4 P_f => + (P_f ⊢ + memRegion (sp + 0x3e0#64) 34 ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + A.pool lim st s4 ∗ + stackAt sp rootStack) ∧ + s4.sp = sp ∧ + s4.trace = s.trace ∧ + s4.readReg64 .x0 = (if remIdKey.publicKey == ik.publicKey then 1#64 else 0#64) ∧ + s4.readReg64 .x19 = coroPtr ∧ + s4.readReg64 .x25 = sp + 0x210#64 ∧ + s4.readReg64 .x26 = outPtr ∧ + s4.readReg64 .x28 = sp + 0xa90#64 ∧ + s4.readReg64 .x29 = s.readReg64 .x29 ∧ + calleeSavedVRegs s4 = calleeSavedVRegs s ∧ + LibsignalCodeRoLoaded lsmpl s4.mem) + Qp := by + have hvm := sepWPp_frame_pool_drop_vm A lim st (Qp := Qp) + (stageP2_matched_094c_some_to_10cc_vm_placed_sat h_bb s sp coroPtr outPtr msgPtr + remIdKey ik hcro hsp_eq hsp_root hpc hrun hsp_align hx19 hx21 hx25 hx28) + intro R hm hL + obtain ⟨s4, hsteps, ⟨hpc4, hrun4, P_f, hm4, hent, hregs⟩ | hrest⟩ := + hvm R (Arm64.Satisfies.mono (sepConj_mono_left (Entails.of_eq (by sep_ac_rfl))) hm) hL + · refine ⟨s4, hsteps, Or.inl ⟨hpc4, hrun4, P_f, hm4, ?_, hregs⟩⟩ + exact Entails.trans hent (Entails.of_eq (by sep_ac_rfl)) + · exact ⟨s4, hsteps, Or.inr hrest⟩ + +/-! ## Remote-identity match branch (`+0x094c → +0x1778`) under `HookSat` -/ + +set_option maxHeartbeats 1200000 in +/-- `HookSat`-backed sibling of `M2OkPlacedBudget.stageP2_matched_094c_match_vm_placed`. -/ +theorem stageP2_matched_094c_match_vm_placed_sat [LibsignalPlacement] {A : RustAlloc} + {ext : String → Option (State → State)} + (h_bb : HookSat (Rust.withPanics ext) lsBlackBoxU8Sym blackBoxSpecSat) + (s : State) + (sp coroPtr outPtr msgPtr remoteAddrPtr localAddrPtr v_330 v_388 + u_80 u_88 u_90 u_a8 u_b0 v_d0 + u_298 u_2a0 u_3a0 u_3b0 u_3b8 u_3c0 u_3c8 u_3d0 u_3d8 : BitVec 64) + (u_2a8 u_b8 : BitVec 32) + (msgVerByte b_4f2 b_390 b_3ac : BitVec 8) + (remIdKey : IdentityKey) + (recG : SessionGhost) (recSt : SessionState (List (BitVec 8))) + (hrem_eq : recSt.remoteIdentity = some remIdKey) + (hcro : LibsignalCodeRoLoaded lsmpl s.mem) + (hsp_eq : s.sp = sp) + (hsp_root : rootStack ≤ sp.toNat) + (hpc : s.pc = (blkPl_518).base + 0x94c#64) + (hrun : s.status = .Running) + (hsp_align : (s.sp &&& 15#64 == 0#64) = true) + (hx19 : s.readReg64 .x19 = coroPtr) + (hx21 : s.readReg64 .x21 = sp + 0x370#64) + (hx25 : s.readReg64 .x25 = sp + 0x210#64) + (hx28 : s.readReg64 .x28 = sp + 0xa90#64) : + SepWPp (lsProg_518 (Rust.withPanics ext)) ((blkPl_518).base + 0x1778#64) s + (remoteIdentityOkAt (sp + 0x3e0#64) recSt.remoteIdentity ∗ + sessionStateAt A (coroPtr + 0xf8#64) recG recSt ∗ + ((coroPtr + 0x70#64) ↦₆₄ msgPtr) ∗ + ((coroPtr + 0x78#64) ↦₆₄ remoteAddrPtr) ∗ + ((coroPtr + 0x80#64) ↦₆₄ localAddrPtr) ∗ + cells (coroPtr + 0x250#64) 6 ∗ + ((coroPtr + 0x298#64) ↦₆₄ u_298) ∗ + ((coroPtr + 0x2a0#64) ↦₆₄ u_2a0) ∗ + ((coroPtr + 0x2a8#64) ↦₃₂ u_2a8) ∗ + ((coroPtr + 0x330#64) ↦₆₄ v_330) ∗ + ((coroPtr + 0x388#64) ↦₆₄ v_388) ∗ + ((coroPtr + 0x390#64) ↦₈ b_390) ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((coroPtr + 0x4f2#64) ↦₈ b_4f2) ∗ + ((msgPtr + 0x70#64) ↦₈ msgVerByte) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + ((sp + 0x80#64) ↦₆₄ u_80) ∗ + ((sp + 0x88#64) ↦₆₄ u_88) ∗ + ((sp + 0x90#64) ↦₆₄ u_90) ∗ + ((sp + 0x98#64) ↦₆₄ (coroPtr + 0x398#64)) ∗ + ((sp + 0xa0#64) ↦₆₄ (coroPtr + 0x4f2#64)) ∗ + ((sp + 0xa8#64) ↦₆₄ u_a8) ∗ + ((sp + 0xb0#64) ↦₆₄ u_b0) ∗ + ((sp + 0xb8#64) ↦₃₂ u_b8) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + ((sp + 0xd0#64) ↦₆₄ v_d0) ∗ + ((sp + 0x3a0#64) ↦₆₄ u_3a0) ∗ + ((sp + 0x3ac#64) ↦₈ b_3ac) ∗ + ((sp + 0x3b0#64) ↦₆₄ u_3b0) ∗ + ((sp + 0x3b8#64) ↦₆₄ u_3b8) ∗ + ((sp + 0x3c0#64) ↦₆₄ u_3c0) ∗ + ((sp + 0x3c8#64) ↦₆₄ u_3c8) ∗ + ((sp + 0x3d0#64) ↦₆₄ u_3d0) ∗ + ((sp + 0x3d8#64) ↦₆₄ u_3d8) ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + stackAt sp rootStack) + (fun sf P_f => + (P_f ⊢ + ∃∗ opkHi : BitVec 32, ∃∗ kyberPacked : BitVec 64, + memRegion (sp + 0x3e0#64) 34 ∗ + sessionStateAt A (coroPtr + 0xf8#64) recG recSt ∗ + ((coroPtr + 0x70#64) ↦₆₄ msgPtr) ∗ + ((coroPtr + 0x78#64) ↦₆₄ remoteAddrPtr) ∗ + ((coroPtr + 0x80#64) ↦₆₄ localAddrPtr) ∗ + cells (coroPtr + 0x250#64) 6 ∗ + ((coroPtr + 0x298#64) ↦₃₂ 2#32) ∗ + ((coroPtr + 0x29c#64) ↦₃₂ opkHi) ∗ + ((coroPtr + 0x2a0#64) ↦₆₄ kyberPacked) ∗ + ((coroPtr + 0x2a8#64) ↦₃₂ v_d0.truncate 32) ∗ + ((coroPtr + 0x330#64) ↦₆₄ v_330) ∗ + ((coroPtr + 0x388#64) ↦₆₄ v_388) ∗ + ((coroPtr + 0x390#64) ↦₈ 1#8) ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((coroPtr + 0x4f2#64) ↦₈ 1#8) ∗ + ((msgPtr + 0x70#64) ↦₈ msgVerByte) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + ((sp + 0x80#64) ↦₆₄ (coroPtr + 0xf8#64)) ∗ + ((sp + 0x88#64) ↦₆₄ (coroPtr + 0xe0#64)) ∗ + ((sp + 0x90#64) ↦₆₄ v_388) ∗ + ((sp + 0x98#64) ↦₆₄ (coroPtr + 0x398#64)) ∗ + ((sp + 0xa0#64) ↦₆₄ localAddrPtr) ∗ + ((sp + 0xa8#64) ↦₆₄ v_330) ∗ + ((sp + 0xb0#64) ↦₆₄ msgPtr) ∗ + ((sp + 0xb8#64) ↦₃₂ msgVerByte.zeroExtend 32) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + ((sp + 0xd0#64) ↦₆₄ v_d0) ∗ + ((sp + 0x3a0#64) ↦₆₄ remoteAddrPtr) ∗ + ((sp + 0x3ac#64) ↦₈ 3#8) ∗ + ((sp + 0x3b0#64) ↦₆₄ (sp + 0x3ac#64)) ∗ + ((sp + 0x3b8#64) ↦₆₄ msgPtr) ∗ + ((sp + 0x3c0#64) ↦₆₄ (sp + 0x3a0#64)) ∗ + ((sp + 0x3c8#64) ↦₆₄ 0#64) ∗ + ((sp + 0x3d0#64) ↦₆₄ 8#64) ∗ + ((sp + 0x3d8#64) ↦₆₄ 0#64) ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + stackAt sp rootStack) ∧ + VmPreserved s sf ∧ + (sf.sp = sp ∧ + sf.trace = s.trace ∧ + sf.readReg64 .x19 = coroPtr ∧ + sf.readReg64 .x27 = sp + 0x370#64 ∧ + sf.readReg64 .x29 = s.readReg64 .x29 ∧ + calleeSavedVRegs sf = calleeSavedVRegs s ∧ + LibsignalCodeRoLoaded lsmpl sf.mem)) + (fun _ _ => False) := by + conv => + arg 4 + rw [hrem_eq] + have hchk := stageP2_matched_094c_some_to_10cc_vm_placed_sat h_bb s sp coroPtr outPtr msgPtr + remIdKey remIdKey hcro hsp_eq hsp_root hpc hrun hsp_align hx19 hx21 hx25 hx28 + refine bind_sepWPp_nopanic_state hchk (by sep_focus) + fun s1 _ hpc1 hrun1 ⟨hvm1, hsp1, htr1, hx0_1, hx19_1, _, hx26_1, _, hx29_1, hvregs1, hcro1⟩ => ?_ + have hx0_one : s1.readReg64 .x0 = 1#64 := by + simpa [beq_self_eq_true] using hx0_1 + have hsp1_align : (s1.sp &&& 15#64 == 0#64) = true := by rw [hsp1, ← hsp_eq]; exact hsp_align + have htail := stageP2_matched_ok_10cc_to_1778_vm_placed (A := A) (ext := ext) + s1 sp coroPtr outPtr msgPtr remoteAddrPtr localAddrPtr v_330 v_388 + u_80 u_88 u_90 (coroPtr + 0x4f2#64) u_a8 u_b0 v_d0 + u_298 u_2a0 u_3a0 u_3b0 u_3b8 u_3c0 u_3c8 u_3d0 u_3d8 + u_2a8 u_b8 msgVerByte b_4f2 b_390 b_3ac + recG recSt hcro1 hsp1 hsp_root hpc1 hrun1 hsp1_align hx0_one hx19_1 hx26_1 + refine bind_sepWPp_nopanic_state htail (by sep_focus) + fun sf _ hpcf hrunf ⟨hvm2, hspf, htrf, hx19_f, hx27_f, hx29_f, hvregsf_1, hcrof⟩ => ?_ + refine SepWPp.done hpcf hrunf + ⟨?_, hvm1.trans hvm2, + hspf, htrf.trans htr1, hx19_f, hx27_f, hx29_f.trans hx29_1, hvregsf_1.trans hvregs1, hcrof⟩ + sep_norm + refine Entails.sepExists_elim fun opkHi => Entails.sepExists_right opkHi ?_ + refine Entails.sepExists_elim fun kyberPacked => Entails.sepExists_right kyberPacked ?_ + exact Entails.of_eq (eq_of_sep_emp (by sep_focus)) + +set_option maxHeartbeats 1200000 in +/-- `HookSat`-backed sibling of `M2OkPlacedBudget.stageP2_matched_094c_match_placed`. -/ +theorem stageP2_matched_094c_match_placed_sat [LibsignalPlacement] + {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} + {ext : String → Option (State → State)} {Qp : State → SepProp → Prop} + (h_bb : HookSat (Rust.withPanics ext) lsBlackBoxU8Sym blackBoxSpecSat) + (st : M.σ) (s : State) + (sp coroPtr outPtr msgPtr remoteAddrPtr localAddrPtr v_330 v_388 + u_80 u_88 u_90 u_a8 u_b0 v_d0 + u_298 u_2a0 u_3a0 u_3b0 u_3b8 u_3c0 u_3c8 u_3d0 u_3d8 : BitVec 64) + (u_2a8 u_b8 : BitVec 32) + (msgVerByte b_4f2 b_390 b_3ac : BitVec 8) + (remIdKey : IdentityKey) + (recG : SessionGhost) (recSt : SessionState (List (BitVec 8))) + (hrem_eq : recSt.remoteIdentity = some remIdKey) + (hcro : LibsignalCodeRoLoaded lsmpl s.mem) + (hsp_eq : s.sp = sp) + (hsp_root : rootStack ≤ sp.toNat) + (hpc : s.pc = (blkPl_518).base + 0x94c#64) + (hrun : s.status = .Running) + (hsp_align : (s.sp &&& 15#64 == 0#64) = true) + (hx19 : s.readReg64 .x19 = coroPtr) + (hx21 : s.readReg64 .x21 = sp + 0x370#64) + (hx25 : s.readReg64 .x25 = sp + 0x210#64) + (hx28 : s.readReg64 .x28 = sp + 0xa90#64) : + SepWPp (lsProg_518 (Rust.withPanics ext)) ((blkPl_518).base + 0x1778#64) s + (remoteIdentityOkAt (sp + 0x3e0#64) recSt.remoteIdentity ∗ + sessionStateAt A.repAlloc (coroPtr + 0xf8#64) recG recSt ∗ + ((coroPtr + 0x70#64) ↦₆₄ msgPtr) ∗ + ((coroPtr + 0x78#64) ↦₆₄ remoteAddrPtr) ∗ + ((coroPtr + 0x80#64) ↦₆₄ localAddrPtr) ∗ + cells (coroPtr + 0x250#64) 6 ∗ + ((coroPtr + 0x298#64) ↦₆₄ u_298) ∗ + ((coroPtr + 0x2a0#64) ↦₆₄ u_2a0) ∗ + ((coroPtr + 0x2a8#64) ↦₃₂ u_2a8) ∗ + ((coroPtr + 0x330#64) ↦₆₄ v_330) ∗ + ((coroPtr + 0x388#64) ↦₆₄ v_388) ∗ + ((coroPtr + 0x390#64) ↦₈ b_390) ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((coroPtr + 0x4f2#64) ↦₈ b_4f2) ∗ + ((msgPtr + 0x70#64) ↦₈ msgVerByte) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + ((sp + 0x80#64) ↦₆₄ u_80) ∗ + ((sp + 0x88#64) ↦₆₄ u_88) ∗ + ((sp + 0x90#64) ↦₆₄ u_90) ∗ + ((sp + 0x98#64) ↦₆₄ (coroPtr + 0x398#64)) ∗ + ((sp + 0xa0#64) ↦₆₄ (coroPtr + 0x4f2#64)) ∗ + ((sp + 0xa8#64) ↦₆₄ u_a8) ∗ + ((sp + 0xb0#64) ↦₆₄ u_b0) ∗ + ((sp + 0xb8#64) ↦₃₂ u_b8) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + ((sp + 0xd0#64) ↦₆₄ v_d0) ∗ + ((sp + 0x3a0#64) ↦₆₄ u_3a0) ∗ + ((sp + 0x3ac#64) ↦₈ b_3ac) ∗ + ((sp + 0x3b0#64) ↦₆₄ u_3b0) ∗ + ((sp + 0x3b8#64) ↦₆₄ u_3b8) ∗ + ((sp + 0x3c0#64) ↦₆₄ u_3c0) ∗ + ((sp + 0x3c8#64) ↦₆₄ u_3c8) ∗ + ((sp + 0x3d0#64) ↦₆₄ u_3d0) ∗ + ((sp + 0x3d8#64) ↦₆₄ u_3d8) ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + A.pool lim st s ∗ + stackAt sp rootStack) + (fun sf P_f => + (P_f ⊢ + ∃∗ opkHi : BitVec 32, ∃∗ kyberPacked : BitVec 64, + memRegion (sp + 0x3e0#64) 34 ∗ + sessionStateAt A.repAlloc (coroPtr + 0xf8#64) recG recSt ∗ + ((coroPtr + 0x70#64) ↦₆₄ msgPtr) ∗ + ((coroPtr + 0x78#64) ↦₆₄ remoteAddrPtr) ∗ + ((coroPtr + 0x80#64) ↦₆₄ localAddrPtr) ∗ + cells (coroPtr + 0x250#64) 6 ∗ + ((coroPtr + 0x298#64) ↦₃₂ 2#32) ∗ + ((coroPtr + 0x29c#64) ↦₃₂ opkHi) ∗ + ((coroPtr + 0x2a0#64) ↦₆₄ kyberPacked) ∗ + ((coroPtr + 0x2a8#64) ↦₃₂ v_d0.truncate 32) ∗ + ((coroPtr + 0x330#64) ↦₆₄ v_330) ∗ + ((coroPtr + 0x388#64) ↦₆₄ v_388) ∗ + ((coroPtr + 0x390#64) ↦₈ 1#8) ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((coroPtr + 0x4f2#64) ↦₈ 1#8) ∗ + ((msgPtr + 0x70#64) ↦₈ msgVerByte) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + ((sp + 0x80#64) ↦₆₄ (coroPtr + 0xf8#64)) ∗ + ((sp + 0x88#64) ↦₆₄ (coroPtr + 0xe0#64)) ∗ + ((sp + 0x90#64) ↦₆₄ v_388) ∗ + ((sp + 0x98#64) ↦₆₄ (coroPtr + 0x398#64)) ∗ + ((sp + 0xa0#64) ↦₆₄ localAddrPtr) ∗ + ((sp + 0xa8#64) ↦₆₄ v_330) ∗ + ((sp + 0xb0#64) ↦₆₄ msgPtr) ∗ + ((sp + 0xb8#64) ↦₃₂ msgVerByte.zeroExtend 32) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + ((sp + 0xd0#64) ↦₆₄ v_d0) ∗ + ((sp + 0x3a0#64) ↦₆₄ remoteAddrPtr) ∗ + ((sp + 0x3ac#64) ↦₈ 3#8) ∗ + ((sp + 0x3b0#64) ↦₆₄ (sp + 0x3ac#64)) ∗ + ((sp + 0x3b8#64) ↦₆₄ msgPtr) ∗ + ((sp + 0x3c0#64) ↦₆₄ (sp + 0x3a0#64)) ∗ + ((sp + 0x3c8#64) ↦₆₄ 0#64) ∗ + ((sp + 0x3d0#64) ↦₆₄ 8#64) ∗ + ((sp + 0x3d8#64) ↦₆₄ 0#64) ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + A.pool lim st sf ∗ + stackAt sp rootStack) ∧ + sf.sp = sp ∧ + sf.trace = s.trace ∧ + sf.readReg64 .x19 = coroPtr ∧ + sf.readReg64 .x27 = sp + 0x370#64 ∧ + sf.readReg64 .x29 = s.readReg64 .x29 ∧ + calleeSavedVRegs sf = calleeSavedVRegs s ∧ + LibsignalCodeRoLoaded lsmpl sf.mem) + Qp := by + have hvm := sepWPp_frame_pool_drop_vm A lim st (Qp := Qp) + (stageP2_matched_094c_match_vm_placed_sat (A := A.repAlloc) (ext := ext) + h_bb s sp coroPtr outPtr msgPtr remoteAddrPtr localAddrPtr v_330 v_388 + u_80 u_88 u_90 u_a8 u_b0 v_d0 + u_298 u_2a0 u_3a0 u_3b0 u_3b8 u_3c0 u_3c8 u_3d0 u_3d8 + u_2a8 u_b8 msgVerByte b_4f2 b_390 b_3ac remIdKey recG recSt hrem_eq + hcro hsp_eq hsp_root hpc hrun hsp_align hx19 hx21 hx25 hx28) + intro R hm hL + obtain ⟨sf, hsteps, ⟨hpcf, hrunf, P_f, hmf, hent, hregs⟩ | hrest⟩ := + hvm R (Arm64.Satisfies.mono (sepConj_mono_left (Entails.of_eq (by sep_ac_rfl))) hm) hL + · refine ⟨sf, hsteps, Or.inl ⟨hpcf, hrunf, P_f, hmf, ?_, hregs⟩⟩ + refine Entails.trans hent ?_ + sep_norm + refine Entails.sepExists_elim fun opkHi => Entails.sepExists_right opkHi ?_ + refine Entails.sepExists_elim fun kyberPacked => Entails.sepExists_right kyberPacked ?_ + exact Entails.of_eq (by sep_ac_rfl) + · exact ⟨sf, hsteps, Or.inr hrest⟩ + +/-! ## Remote-identity mismatch branch (`+0x094c → s0.readReg64 .x30`) under `HookSat` -/ + +set_option maxHeartbeats 1200000 in +/-- `HookSat`-backed sibling of `M2TopPlacedBudget.stageP2_matched_094c_mismatch_exists_placed`. -/ +theorem stageP2_matched_094c_mismatch_exists_placed_sat [LibsignalPlacement] + {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} + {ext : String → Option (State → State)} {Qp : State → SepProp → Prop} + (hto : subroutine_ok (lsProg_518 (Rust.withPanics ext)) + (lsmpl.base 530) + (withLsCodeLoaded lsmpl (strToOwnedLocal2Spec A lim))) + (hdealloc : subroutine_ok (lsProg_518 (Rust.withPanics ext)) + (lsρ "_RNvCs1njKG4L9aB3_7___rustc14___rust_dealloc") + (rustCliDeallocBudgetSpec M A lim)) + (h_bb : HookSat (Rust.withPanics ext) lsBlackBoxU8Sym blackBoxSpecSat) + (hdrop_ss : subroutine_ok (lsProg_518 (Rust.withPanics ext)) + (lsmpl.base 512) + (withLsCodeLoaded lsmpl (dropSessionStructureLocal2Spec M A lim))) + (st : M.σ) (s0 s : State) + (sp coroPtr outPtr msgPtr u_a8 u_d0 : BitVec 64) + (b_4f2 b_390 b_2c0 : BitVec 8) + (remIdKey : IdentityKey) + (g : RecordGhost) (recG : SessionGhost) (recSt : SessionState (List (BitVec 8))) + (hrem_ne : recSt.remoteIdentity ≠ some remIdKey) + (hfits : FitsEvents M lim st (strToOwnedEvents mismatchRemoteIkStrPlaced)) + (hcro : LibsignalCodeRoLoaded lsmpl s.mem) + (hsp_eq : s.sp = sp) + (hsp_root : rootStack ≤ sp.toNat) + (hpc : s.pc = (blkPl_518).base + 0x94c#64) + (hrun : s.status = .Running) + (hsp_align : (s.sp &&& 15#64 == 0#64) = true) + (hx19 : s.readReg64 .x19 = coroPtr) + (hx21 : s.readReg64 .x21 = sp + 0x370#64) + (hx25 : s.readReg64 .x25 = sp + 0x210#64) + (hx28 : s.readReg64 .x28 = sp + 0xa90#64) : + SepWPp (lsProg_518 (Rust.withPanics ext)) (s0.readReg64 .x30) s + (remoteIdentityOkAt (sp + 0x3e0#64) recSt.remoteIdentity ∗ + prevSessionsEmptyAt A.repAlloc coroPtr g ∗ + sessionStateAt A.repAlloc (coroPtr + 0xf8#64) recG recSt ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + cells (coroPtr + 0x250#64) 6 ∗ + ((coroPtr + 0x2c0#64) ↦₈ b_2c0) ∗ + ((coroPtr + 0x390#64) ↦₈ b_390) ∗ + ((coroPtr + 0x4f2#64) ↦₈ b_4f2) ∗ + ((sp + 0x98#64) ↦₆₄ (coroPtr + 0x398#64)) ∗ + ((sp + 0xa0#64) ↦₆₄ (coroPtr + 0x4f2#64)) ∗ + ((sp + 0xa8#64) ↦₆₄ u_a8) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + ((sp + 0xd0#64) ↦₆₄ u_d0) ∗ + memRegion (sp + 0x370#64) 36 ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + memRegion outPtr 48 ∗ + (lsLogFilterAddr ↦₆₄ 0#64) ∗ + decryptPrekeySavedRegsAt (sp + 0xcd0#64) s0 ∗ + A.pool lim st s ∗ + stackAt sp rootStack) + (fun sf P_f => + (∃ evs : List AllocEvent, StageP2MismatchTailEnv evs ∧ + (P_f ⊢ + memRegion (sp + 0x3e0#64) 34 ∗ + memRegion (coroPtr + 0xe0#64) 368 ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + cells (coroPtr + 0x250#64) 6 ∗ + ((coroPtr + 0x2c0#64) ↦₈ 1#8) ∗ + ((coroPtr + 0x390#64) ↦₈ 1#8) ∗ + ((coroPtr + 0x4f2#64) ↦₈ 1#8) ∗ + ((sp + 0x98#64) ↦₆₄ (coroPtr + 0x398#64)) ∗ + ((sp + 0xa0#64) ↦₆₄ (coroPtr + 0x4f2#64)) ∗ + ((sp + 0xa8#64) ↦₆₄ 3#64) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + ((sp + 0xd0#64) ↦₆₄ 70#64) ∗ + memRegion (sp + 0x370#64) 36 ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + apiDecResultAt A.repAlloc outPtr + (.error (.protocol (.invalidMessage .preKey .badCiphertext))) ∗ + (lsLogFilterAddr ↦₆₄ 0#64) ∗ + decryptPrekeySavedRegsAt (sp + 0xcd0#64) s0 ∗ + A.pool lim (M.stepEvents evs st) sf ∗ + stackAt sp rootStack)) ∧ + sf.sp = sp + 0xcd0#64 ∧ + sf.trace = s.trace ∧ + ClosureCalleeSaved s0 sf ∧ + calleeSavedVRegs sf = calleeSavedVRegs s ∧ + LibsignalCodeRoLoaded lsmpl sf.mem) + Qp := by + apply sepWPp_lift_qp + cases hrem : recSt.remoteIdentity with + | none => + conv => + arg 4 + rw [remoteIdentityOkAt_none_eq sp, memRegion_32_eq_chunks32 (sp + 0x3e2#64), + memRegion_920_6_split sp, memRegion_a90_48_split_10_38 sp] + dsimp only [chunks32At] + simp only [BitVec.add_assoc, BitVec.reduceAdd, sepConj_assoc] + sep_norm + refine SepWPp.exists_elim fun w0 => SepWPp.exists_elim fun h1 => + SepWPp.exists_elim fun q2 => SepWPp.exists_elim fun q3 => + SepWPp.exists_elim fun q4 => SepWPp.exists_elim fun h5 => + SepWPp.exists_elim fun u_920 => SepWPp.exists_elim fun u_924 => + SepWPp.exists_elim fun u_a90 => SepWPp.exists_elim fun u_a98 => ?_ + have h094c := p2_seg_094c_ok_placed_wp (A := A) (lim := lim) ext st s coroPtr outPtr + hpc hrun hsp_align hx19 + rw [hsp_eq] at h094c + refine bind_sepWP_lscro_steps_m2_placed hcro h094c (by sep_focus) + fun s1 _ hpc1 hrun1 hcro1 hregs1 => ?_ + rcases hregs1 with ⟨hsp1_s, htr1_s, hvregs1, hx19_1, hx21_1, _, _, hx25_1, hx26_1, _, hx28_1, _, _⟩ + have hsp1 : s1.sp = sp := hsp1_s + have hx21_1' : s1.readReg64 .x21 = s1.sp + 0x370#64 := by rw [hsp1]; exact hx21_1.trans hx21 + have h1064 := p2_seg_1064_none_placed_wp (A := A) (lim := lim) ext st s1 coroPtr q2 q3 q4 u_a90 + w0 u_920 h1 h5 u_924 u_a98 hpc1 hrun1 (by rw [hsp1, ← hsp_eq]; exact hsp_align) hx19_1 hx21_1' + rw [hsp1] at h1064 + refine bind_sepWP_lscro_steps_m2_placed hcro1 h1064 (by sep_focus) + fun s2 _ hpc2 hrun2 hcro2 hregs2 => ?_ + rcases hregs2 with ⟨hsp2_1, htr2_1, hvregs2, hx19_2, hx25_2, hx26_2, _, hx28_2, _, _⟩ + have hsp2 : s2.sp = sp := hsp2_1 + have hsp2_align : (s2.sp &&& 15#64 == 0#64) = true := by rw [hsp2, ← hsp_eq]; exact hsp_align + have htr2_s : s2.trace = s.trace := htr2_1.trans htr1_s + have hx25_2' : s2.readReg64 .x25 = sp + 0x210#64 := hx25_2.trans (hx25_1.trans hx25) + have hx26_2' : s2.readReg64 .x26 = outPtr := hx26_2.trans hx26_1 + have hx28_2' : s2.readReg64 .x28 = sp + 0xa90#64 := hx28_2.trans (hx28_1.trans hx28) + have hvregs2_s : calleeSavedVRegs s2 = calleeSavedVRegs s := + congrArg VRegFile.calleeSaved (hvregs2.trans hvregs1) + have hrem34 := rem34_bytes_entails_memRegion34 sp 0#8 0#8 w0 h1 q2 q3 q4 h5 + dsimp only [chunks32At] at hrem34 + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hrem34 + refine SepWPp.weaken_frame hrem34 (by sep_focus) ?_ + refine SepWPp.weaken_frame (memRegion_920_6_join sp w0 h1) (by sep_focus) ?_ + refine SepWPp.weaken_frame (memRegion_a90_48_join_10_38 sp q4 h5) (by sep_focus) ?_ + conv => arg 4; rw [memRegion_34_split_24_10 sp] + simp only [sepConj_assoc] + have htail := stageP2_matched_mismatch_tail_exists_placed (Qp := fun _ _ => False) + hto hdealloc hdrop_ss st s0 s2 sp coroPtr outPtr u_a8 u_d0 b_4f2 b_390 b_2c0 g recG recSt + hfits hcro2 hsp2 hsp_root hpc2 hrun2 hsp2_align hx19_2 hx25_2' hx26_2' hx28_2' + refine sepWPp_ret_frame_nopanic htail + (by unfold stageP2MismatchTailPrePlaced; sep_focus) + fun sf P_tail _ _ _ ⟨⟨evs, henv, hent_tail⟩, hspf, htrf_2, hcsf, hvregsf_2, hcrof⟩ => ?_ + refine ⟨⟨evs, henv, ?_⟩, hspf, htrf_2.trans htr2_s, hcsf, hvregsf_2.trans hvregs2_s, hcrof⟩ + unfold stageP2MismatchTailPostAtPlaced at hent_tail + refine Entails.trans (sepConj_mono_left hent_tail) ?_ + have hjoin34 : memRegion (sp + 0x3e0#64) 24 ∗ memRegion (sp + 0x3f8#64) 10 ⊢ + memRegion (sp + 0x3e0#64) 34 := + Entails.of_eq (memRegion_34_split_24_10 sp).symm + exact entails_replace_sub hjoin34 (by sep_focus) (by sep_ac_rfl) + | some ik => + have hne_ik : some ik ≠ some remIdKey := by rw [← hrem]; exact hrem_ne + have hchk := stageP2_matched_094c_some_to_10cc_placed_sat (A := A) (lim := lim) + (Qp := fun _ _ => False) + h_bb st s sp coroPtr outPtr msgPtr remIdKey ik hcro hsp_eq hsp_root hpc hrun hsp_align + hx19 hx21 hx25 hx28 + refine bind_sepWPp_nopanic_state hchk (by sep_focus) + fun s1 _ hpc1 hrun1 ⟨hsp1, htr1_s, hx0_1, hx19_1, hx25_1, hx26_1, hx28_1, _, hvregs1, hcro1⟩ => ?_ + have hx0_zero : s1.readReg64 .x0 = 0#64 := by + simpa [publicKey_beq_false_of_ne_placed hne_ik] using hx0_1 + have h10cc := p2_seg_10cc_mismatch_placed_wp (A := A) (lim := lim) ext st s1 coroPtr + hpc1 hrun1 hx0_zero hx19_1 + refine bind_sepWP_lscro_steps_m2_placed hcro1 h10cc (by sep_focus) + fun s2 _ hpc2 hrun2 hcro2 hregs2 => ?_ + rcases hregs2 with ⟨hsp2_1, htr2_1, hvregs2, hx19_2, hx25_2, hx26_2, _, hx28_2, _, _⟩ + have hsp2 : s2.sp = sp := hsp2_1.trans hsp1 + have hsp2_align : (s2.sp &&& 15#64 == 0#64) = true := by rw [hsp2, ← hsp_eq]; exact hsp_align + have htr2_s : s2.trace = s.trace := htr2_1.trans htr1_s + have hx25_2' : s2.readReg64 .x25 = sp + 0x210#64 := hx25_2.trans hx25_1 + have hx26_2' : s2.readReg64 .x26 = outPtr := hx26_2.trans hx26_1 + have hx28_2' : s2.readReg64 .x28 = sp + 0xa90#64 := hx28_2.trans hx28_1 + have hvregs2_s : calleeSavedVRegs s2 = calleeSavedVRegs s := + (congrArg VRegFile.calleeSaved hvregs2).trans hvregs1 + conv => arg 4; rw [memRegion_34_split_24_10 sp] + simp only [sepConj_assoc] + have htail := stageP2_matched_mismatch_tail_exists_placed (Qp := fun _ _ => False) + hto hdealloc hdrop_ss st s0 s2 sp coroPtr outPtr u_a8 u_d0 b_4f2 b_390 b_2c0 g recG recSt + hfits hcro2 hsp2 hsp_root hpc2 hrun2 hsp2_align hx19_2 hx25_2' hx26_2' hx28_2' + refine sepWPp_ret_frame_nopanic htail + (by unfold stageP2MismatchTailPrePlaced; sep_focus) + fun sf P_tail _ _ _ ⟨⟨evs, henv, hent_tail⟩, hspf, htrf_2, hcsf, hvregsf_2, hcrof⟩ => ?_ + refine ⟨⟨evs, henv, ?_⟩, hspf, htrf_2.trans htr2_s, hcsf, hvregsf_2.trans hvregs2_s, hcrof⟩ + unfold stageP2MismatchTailPostAtPlaced at hent_tail + refine Entails.trans (sepConj_mono_left hent_tail) ?_ + have hjoin34 : memRegion (sp + 0x3e0#64) 24 ∗ memRegion (sp + 0x3f8#64) 10 ⊢ + memRegion (sp + 0x3e0#64) 34 := + Entails.of_eq (memRegion_34_split_24_10 sp).symm + exact entails_replace_sub hjoin34 (by sep_focus) (by sep_ac_rfl) + +/-! ## Top-level budget-threaded Stage P2 matched-session contract under `HookSat` -/ + +set_option maxHeartbeats 1200000 in +/-- `HookSat`-backed sibling of `M2TopPlacedBudget.stageP2_matched_ok_placed`. -/ +theorem stageP2_matched_ok_placed_sat [LibsignalPlacement] + {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} + {ext : String → Option (State → State)} {Q Qp : State → SepProp → Prop} + (hser : subroutine_ok (lsProg_518 (Rust.withPanics ext)) + (lsmpl.base 205) + (withLsCodeLoaded lsmpl (publicKeySerializeSpec M A lim))) + (hto : subroutine_ok (lsProg_518 (Rust.withPanics ext)) + (lsmpl.base 530) + (withLsCodeLoaded lsmpl (strToOwnedLocal2Spec A lim))) + (hdealloc : subroutine_ok (lsProg_518 (Rust.withPanics ext)) + (lsρ "_RNvCs1njKG4L9aB3_7___rustc14___rust_dealloc") + (rustCliDeallocBudgetSpec M A lim)) + (h_bb : HookSat (Rust.withPanics ext) lsBlackBoxU8Sym blackBoxSpecSat) + (hdrop_ss : subroutine_ok (lsProg_518 (Rust.withPanics ext)) + (lsmpl.base 512) + (withLsCodeLoaded lsmpl (dropSessionStructureLocal2Spec M A lim))) + (st : M.σ) (s0 s : State) + (sp coroPtr outPtr msgPtr remoteAddrPtr localAddrPtr + idStorePtr idStoreVt preKeyStorePtr preKeyStoreVt + spkStorePtr spkStoreVt kyberStorePtr kyberStoreVt + v_330 v_388 u_80 u_88 u_90 u_a8 u_b0 v_d0 + u_298 u_2a0 u_3a0 u_3b0 u_3b8 u_3c0 u_3c8 u_3d0 u_3d8 : BitVec 64) + (u_2a8 u_b8 : BitVec 32) + (outerVerByte innerVerByte b_4f1 b_4f2 b_390 b_2c0 b_3ac : BitVec 8) + (baseKey : PublicKey) (remIdKey : IdentityKey) + (g : RecordGhost) (r : SessionRecord (List (BitVec 8))) (sess : Session (List (BitVec 8))) + (F : SepProp) + (hcur : r.currentSession = some sess) + (hver : sess.state.version = outerVerByte.zeroExtend 32) + (halice : sess.aliceBaseKey = baseKey.serialize) + (hfits : FitsEnv M lim st (StageP2MatchedEnv sess remIdKey)) + (hcro : LibsignalCodeRoLoaded lsmpl s.mem) + (hsp_eq : s.sp = sp) + (hsp_root : rootStack ≤ sp.toNat) + (hpc : s.pc = (blkPl_518).base + 0x868#64) + (hrun : s.status = .Running) + (hsp_align : (s.sp &&& 15#64 == 0#64) = true) + (hx8 : s.readReg64 .x8 = kyberStorePtr) + (hx9 : s.readReg64 .x9 = msgPtr) + (hx10 : s.readReg64 .x10 = kyberStoreVt) + (hx11 : s.readReg64 .x11 = preKeyStorePtr) + (hx12 : s.readReg64 .x12 = remoteAddrPtr) + (hx13 : s.readReg64 .x13 = preKeyStoreVt) + (hx14 : s.readReg64 .x14 = localAddrPtr) + (hx15 : s.readReg64 .x15 = idStorePtr) + (hx16 : s.readReg64 .x16 = idStoreVt) + (hx19 : s.readReg64 .x19 = coroPtr) + (hx22 : s.readReg64 .x22 = spkStorePtr) + (hx23 : s.readReg64 .x23 = coroPtr + 0xe0#64) + (hx24 : s.readReg64 .x24 = spkStoreVt) + (hx28 : s.readReg64 .x28 = sp + 0xa90#64) + (hx29 : s.readReg64 .x29 = sp + 0xc70#64) + (hmismatch : sess.state.remoteIdentity ≠ some remIdKey → + ∀ (evs : List AllocEvent), + StageP2MatchedMismatchEnv evs → + ∀ (sf : State) (Pf : SepProp), + sf.pc = s0.readReg64 .x30 → + sf.status = .Running → + Steps (lsProg_518 (Rust.withPanics ext)) s sf → + sf.sp = sp + 0xcd0#64 → + sf.trace = s.trace → + ClosureCalleeSaved s0 sf → + calleeSavedVRegs sf = calleeSavedVRegs s → + LibsignalCodeRoLoaded lsmpl sf.mem → + (Pf ⊢ stageP2MatchedMismatchPostPlaced A lim (M.stepEvents evs st) s0 sf sp coroPtr outPtr + msgPtr remoteAddrPtr localAddrPtr idStorePtr idStoreVt preKeyStorePtr preKeyStoreVt + kyberStorePtr kyberStoreVt v_330 v_388 u_80 u_88 u_90 u_b0 + u_298 u_2a0 u_3a0 u_3b0 u_3b8 u_3c0 u_3c8 u_3d0 u_3d8 + u_2a8 u_b8 outerVerByte innerVerByte b_3ac baseKey remIdKey F) → + Q sf Pf) + (hmatch : sess.state.remoteIdentity = some remIdKey → + ∀ (evs : List AllocEvent), + StageP2MatchedBridgeEnv evs → + ∀ (s2 : State) (recG : SessionGhost) (opkHi kyberPreKeyId signedPreKeyId : BitVec 32), + g.cur = some recG → + SessionExtraRel recG sess → + Steps (lsProg_518 (Rust.withPanics ext)) s s2 → + s2.pc = (blkPl_518).base + 0x1778#64 → + s2.status = .Running → + s2.sp = sp → + (s2.sp &&& 15#64 == 0#64) = true → + s2.trace = s.trace → + s2.readReg64 .x19 = coroPtr → + s2.readReg64 .x27 = sp + 0x370#64 → + s2.readReg64 .x29 = sp + 0xc70#64 → + calleeSavedVRegs s2 = calleeSavedVRegs s → + LibsignalCodeRoLoaded lsmpl s2.mem → + SepWPp (lsProg_518 (Rust.withPanics ext)) (s0.readReg64 .x30) s2 + (stageP2MatchedMatchPrePlaced A lim (M.stepEvents evs st) s0 s2 sp coroPtr outPtr msgPtr + remoteAddrPtr localAddrPtr idStorePtr idStoreVt preKeyStorePtr preKeyStoreVt + kyberStorePtr kyberStoreVt v_330 v_388 v_d0 + opkHi kyberPreKeyId signedPreKeyId outerVerByte innerVerByte b_2c0 + baseKey remIdKey g recG sess.state F) + Q Qp) : + SepWPp (lsProg_518 (Rust.withPanics ext)) (s0.readReg64 .x30) s + (stageP2MatchedPrePlaced A lim st s0 s sp coroPtr outPtr msgPtr remoteAddrPtr localAddrPtr + v_330 v_388 u_80 u_88 u_90 u_a8 u_b0 v_d0 + u_298 u_2a0 u_3a0 u_3b0 u_3b8 u_3c0 u_3c8 u_3d0 u_3d8 + u_2a8 u_b8 outerVerByte innerVerByte b_4f1 b_4f2 b_390 b_2c0 b_3ac + baseKey remIdKey g r F) + Q Qp := by + dsimp only [stageP2MatchedPrePlaced, stageP2MatchedMismatchPostPlaced, + stageP2MatchedMatchPrePlaced, + CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Matched.stageP2MatchedPrePlaced, + CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Matched.stageP2MatchedMismatchPostPlaced, + CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Matched.stageP2MatchedMatchPrePlaced] + at hmismatch hmatch ⊢ + have hpre_eq : + sessionRecordAt (A.atState lim st s) (coroPtr + 0xe0#64) g r = + sessionRecordAt A.repAlloc (coroPtr + 0xe0#64) g r := rfl + have hpool_s : (A.atState lim st s).pool = A.pool lim st s := rfl + rw [hpre_eq, hpool_s] + have hpre := stageP2_matched_0868_to_094c_placed_sat (Qp := fun _ _ => False) + hser hdealloc h_bb st s sp coroPtr msgPtr + remoteAddrPtr localAddrPtr idStorePtr idStoreVt preKeyStorePtr preKeyStoreVt + spkStorePtr spkStoreVt kyberStorePtr kyberStoreVt outerVerByte b_4f1 baseKey + g r sess hcur hver halice (fitsEnv_publicKeySerialize_of_matchedEnv hfits) + hcro hsp_eq hsp_root hpc hrun hsp_align + hx8 hx9 hx10 hx11 hx12 hx13 hx14 hx15 hx16 hx19 hx22 hx23 hx24 hx28 hx29 + refine bind_sepWPp_nopanic_state hpre (by sep_focus) + fun sm hsteps01 hpcm hrunm hregsm => ?_ + rcases hregsm with ⟨hspm, htrm, hx19m, hx21m, hx25m, hx28m, hx29m, hvregsm, hcrom⟩ + have hspm_align : (sm.sp &&& 15#64 == 0#64) = true := by rw [hspm, ← hsp_eq]; exact hsp_align + let st_br := M.stepEvents stageP2MatchedBridgeEvents st + sep_norm + refine SepWPp.exists_elim fun recG => SepWPp.pure_elim fun ⟨hgc, hextra⟩ => ?_ + by_cases hrem : sess.state.remoteIdentity = some remIdKey + · conv => + arg 4 + rw [processPrekeyActive10At_eq_placed] + simp only [sepConj_assoc] + have hm := stageP2_matched_094c_match_placed_sat (A := A) (lim := lim) (Qp := fun _ _ => False) + h_bb st_br sm sp coroPtr outPtr msgPtr remoteAddrPtr localAddrPtr v_330 v_388 + u_80 u_88 u_90 u_a8 u_b0 v_d0 u_298 u_2a0 u_3a0 u_3b0 u_3b8 u_3c0 u_3c8 u_3d0 u_3d8 + u_2a8 u_b8 innerVerByte b_4f2 b_390 b_3ac remIdKey recG sess.state hrem + hcrom hspm hsp_root hpcm hrunm hspm_align hx19m hx21m hx25m hx28m + refine bind_sepWPp_nopanic_state hm (by sep_focus) + fun s2 hsteps12 hpc2 hrun2 hregs2 => ?_ + rcases hregs2 with ⟨hsp2, htr2, hx19_2, hx27_2, hx29_2, hvregs2, hcro2⟩ + have hsp2_align : (s2.sp &&& 15#64 == 0#64) = true := by rw [hsp2, ← hsp_eq]; exact hsp_align + sep_norm + refine SepWPp.exists_elim fun opkHi => SepWPp.exists_elim fun kyberPacked => ?_ + have hgoal := hmatch hrem stageP2MatchedBridgeEvents rfl s2 recG opkHi + (kyberPacked.extractLsb' 0 32) (kyberPacked.extractLsb' 32 32) + hgc hextra (hsteps01.trans hsteps12) hpc2 hrun2 hsp2 hsp2_align + (htr2.trans htrm) hx19_2 hx27_2 (hx29_2.trans hx29m) (hvregs2.trans hvregsm) hcro2 + refine fun R hmR hL => hgoal R (Arm64.Satisfies.mono (sepConj_mono_left ?_) hmR) hL + have hprev2 : + prevSessionsEmptyAt (A.atState lim st_br s2) coroPtr g = + prevSessionsEmptyAt A.repAlloc coroPtr g := rfl + have hss2 : + sessionStateAt (A.atState lim st_br s2) (coroPtr + 0xf8#64) recG sess.state = + sessionStateAt A.repAlloc (coroPtr + 0xf8#64) recG sess.state := rfl + have hpool2 : (A.atState lim st_br s2).pool = A.pool lim st_br s2 := rfl + rw [hprev2, hss2, hpool2, coro_2a0_split32_placed coroPtr kyberPacked, + processPrekeyActive10At_eq_placed] + simp only [sepConj_assoc] + exact Entails.of_eq (eq_of_sep_emp (by sep_focus)) + · conv => + arg 4 + rw [processPrekeyActive10At_eq_placed] + simp only [sepConj_assoc] + have hmm := stageP2_matched_094c_mismatch_exists_placed_sat (A := A) (lim := lim) + (Qp := fun _ _ => False) hto hdealloc h_bb hdrop_ss st_br s0 sm + sp coroPtr outPtr msgPtr u_a8 v_d0 b_4f2 b_390 b_2c0 remIdKey g recG sess.state + hrem (fitsEvents_mismatchTail_of_matchedEnv hrem hfits) + hcrom hspm hsp_root hpcm hrunm hspm_align hx19m hx21m hx25m hx28m + refine sepWPp_ret_frame_nopanic hmm (by sep_focus) + fun sf P_mis hsteps1f hpcf hrunf ⟨⟨evs_tail, htail, hent_mis⟩, hspf, htrf, hcsf, hvregsf, hcrof⟩ => ?_ + refine hmismatch hrem (stageP2MatchedBridgeEvents ++ evs_tail) + (stageP2MatchedMismatchEnv_of_tail htail) sf _ hpcf hrunf + (hsteps01.trans hsteps1f) hspf (htrf.trans htrm) hcsf (hvregsf.trans hvregsm) hcrof ?_ + refine Entails.trans (sepConj_mono_left hent_mis) ?_ + let st_exit := M.stepEvents (stageP2MatchedBridgeEvents ++ evs_tail) st + have hstep_eq : M.stepEvents evs_tail st_br = st_exit := + (M.stepEvents_append stageP2MatchedBridgeEvents evs_tail st).symm + have hdec_eq : + apiDecResultAt (A.atState lim st_exit sf) outPtr + (.error (.protocol (.invalidMessage .preKey .badCiphertext))) = + apiDecResultAt A.repAlloc outPtr + (.error (.protocol (.invalidMessage .preKey .badCiphertext))) := rfl + have hpoolf : (A.atState lim st_exit sf).pool = A.pool lim st_exit sf := rfl + rw [hstep_eq, hdec_eq, hpoolf, processPrekeyActive10At_eq_placed] + simp only [sepConj_assoc] + exact Entails.of_eq (eq_of_sep_emp (by sep_focus)) + +abbrev stageP2_matched_ok_framed_placed_sat := @stageP2_matched_ok_placed_sat + +end + +end LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedBudgetSat diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Matched/M2TopPlacedSat.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Matched/M2TopPlacedSat.lean new file mode 100644 index 000000000..da88cc2a2 --- /dev/null +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Matched/M2TopPlacedSat.lean @@ -0,0 +1,771 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2BridgePlacedSat -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2OkPlaced -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TailPlaced -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlaced -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat -- proof-setup: allow-public-import +import Arm64.Trusted.Spec.Hoare +import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP1Comb +import LibsignalBinary.Proofs.Common.SharedHelpers +meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderClosure.AssemblyP3b2 +import ProofLib.SepLogic.WPp + +/-! +# `HookSat`-Backed Top-Level Stage P2 Matched-Session Contract (`Matched/M2TopPlacedSat`) + +Additive `HookSat (Rust.withPanics ext) lsBlackBoxU8Sym blackBoxSpecSat` sibling of +`CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Matched.stageP2_matched_ok_framed_placed` +(`M2TopPlaced.lean`) on Block `518`. Carves `80` B (`publicKeyEqMemSpec16`) out of +`stackAt sp rootStack` (`262144` B), keeping all outer theorem conclusions identical to +`M2TopPlaced`. +-/ + +public section + +set_option autoImplicit false +set_option maxRecDepth 200000 +set_option maxHeartbeats 400000 +set_option linter.unusedSimpArgs false + +namespace LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedSat + +noncomputable section + +open Arm64 ProofLib SepProp +open CryptoGames.LibsignalSession (IdentityKey PublicKey SessionState) +open CryptoGames.LibsignalSessionApi (Session SessionRecord) +open CryptoVerification ( + LibsignalPlacement lsBlackBoxU8Sym lsLogFilterAddr ls_subroutine_ok_of_block lsmpl lsρ + withLsCodeLoaded +) +open CryptoVerification.RustHeap (RustAlloc rustDeallocSpec) +open CryptoVerification.LibsignalTripleRatchet (publicKeySerializeSpec rootStack) +open CryptoVerification.LibsignalTripleRatchet.FromRecordCallees ( + dropSessionStructureLocal2Spec +) +open CryptoVerification.LibsignalTripleRatchet.Getters (remoteIdentityOkAt) +open CryptoVerification.LibsignalTripleRatchetRepr (SessionGhost sessionStateAt) +open CryptoVerification.LibsignalPublicApiRepr (RecordGhost apiDecResultAt) +open CryptoVerification.LibsignalPublicApi.StoreKit ( + LibsignalCodeRoLoaded subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded +) +open CryptoVerification.E2E.Pqxdh.ResponderClosure ( + ClosureCalleeSaved PanicOomProp SepWPp.bind_sepWPp_steps_frame SepWPp.weaken_frame + decryptPrekeySavedRegsAt processPrekeyActive10At +) +open CryptoVerification.E2E.Pqxdh.ResponderClosure.P3P4 ( + entails_replace_sub eq_of_sep_emp +) +open CryptoVerification.CliHandshake.RespClosurePlaced (blkPl_518 lsProg_518) +open scoped CryptoVerification.CliHandshake.RespClosurePlaced +open CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Kits ( + SessionExtraRel stackAt_split_of_le +) +open scoped CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Kits +open CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Matched ( + bind_sepWP_lscro_steps_m2_placed + call_lscro_nopanic_m2_placed chunks32At coro_2a0_split32_placed + memRegion_32_eq_chunks32_placed memRegion_34_split_24_10_placed memRegion_34_split_32_2_placed + memRegion_920_6_join_placed memRegion_920_6_split_placed memRegion_a90_48_join_10_38_placed + memRegion_a90_48_split_10_38_placed p2_seg_094c_ok_placed_wp p2_seg_1064_none_placed_wp + p2_seg_1064_some_load_placed_wp p2_seg_1094_some_store_placed_wp p2_seg_10cc_mismatch_placed_wp + pack16LE pack32LE pack64LE panicOomProp_frame_placed pointsToBytes_32_eq_chunks32 + prevSessionsEmptyAt processPrekeyActive10At_eq publicKey_beq_false_of_ne_placed + rem34_bytes_entails_memRegion34_placed remoteIdentityOkAt_none_eq_placed + remoteIdentityOkAt_some_eq_placed stageP2MatchedMatchPrePlaced stageP2MatchedMismatchPostPlaced + stageP2MatchedPrePlaced stageP2_matched_mismatch_tail_placed + stageP2_matched_ok_10cc_to_1778_placed strToOwnedLocal2Spec +) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat ( + blackBoxSpecSat publicKeyEqMemSpec16 publicKey_eq_mem_placed_ok_16_sat +) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2BridgePlacedSat ( + stageP2_matched_0868_to_094c_placed_sat +) + +attribute [local irreducible] Program.fetch Program.externAt? Program.fnOff +attribute [local arm64_norm] bv_sub_add_lit BitVec.add_assoc BitVec.toNat_zero + +local macro "sep_norm" : tactic => + `(tactic| repeat (first + | simp only [↓reduceIte] + | simp only [BitVec.add_assoc] + | simp only [BitVec.reduceAdd] + | simp only [sepExists_sepConj_left] + | simp only [sepExists_sepConj_right] + | simp only [emp_sepConj] + | simp only [sepConj_emp] + | simp only [sepConj_assoc])) + +private theorem stack_root_to_pkEq16_mem_placed (sp : BitVec 64) (hn : rootStack ≤ 2 ^ 64) : + stackAt sp rootStack = + memRegion (sp - BitVec.ofNat 64 rootStack) (rootStack - 80) ∗ + memRegion (sp - 80#64) 80 := by + rw [stackAt_split_of_le sp rootStack 80 (by decide) hn] + +private theorem bind_sepWPp_steps_frame_panicF_placed [LibsignalPlacement] + {prog : Program} {mid ret : BitVec 64} {s0 s : State} + {P F P_stage P_stage_post F_inner : SepProp} {Q_regs : State → Prop} + {Q Qp : State → SepProp → Prop} + (hpan : ∀ sf Pf, PanicOomProp s0 sf Pf → Qp sf (Pf ∗ F)) + (hstage : SepWPp prog mid s P_stage + (fun sm P_m => (P_m ⊢ P_stage_post) ∧ Q_regs sm) + (PanicOomProp s0)) + (hP : P = (P_stage ∗ F) ∗ F_inner) + (hnext : ∀ sm : State, Steps prog s sm → sm.pc = mid → sm.status = .Running → + Q_regs sm → + SepWPp prog ret sm (P_stage_post ∗ (F_inner ∗ F)) Q Qp) : + SepWPp prog ret s P Q Qp := by + intro R hm hL + have hP_re : P = P_stage ∗ (F_inner ∗ F) := by + rw [hP]; sep_ac_rfl + rw [hP_re, sepConj_assoc P_stage (F_inner ∗ F) R] at hm + obtain ⟨sm, hsteps, ⟨hpcm, hrunm, P_m, hmm, hent, hregs⟩ | ⟨hp, P_m, hmm, hpanm⟩ | ⟨_, hoom⟩⟩ := + hstage ((F_inner ∗ F) ∗ R) hm hL + · have hmm' : sm.mem ⊨ (P_stage_post ∗ (F_inner ∗ F)) ∗ R := by + rw [sepConj_assoc P_stage_post (F_inner ∗ F) R] + exact Arm64.Satisfies.mono (sepConj_mono_left hent) hmm + obtain ⟨sf, hsteps', hout'⟩ := + hnext sm hsteps hpcm hrunm hregs R hmm' (hsteps.codeLoaded hL) + exact ⟨sf, hsteps.trans hsteps', hout'⟩ + · rw [← sepConj_assoc P_m (F_inner ∗ F) R, ← sepConj_assoc P_m F_inner F] at hmm + exact ⟨sm, hsteps, Or.inr (Or.inl ⟨hp, (P_m ∗ F_inner) ∗ F, hmm, + hpan sm (P_m ∗ F_inner) (panicOomProp_frame_placed F_inner hpanm)⟩)⟩ + · exact (not_satisfies_false_sepConj hoom).elim + +set_option maxHeartbeats 1200000 in +/-- `HookSat`-backed sibling of `M2OkPlaced.stageP2_matched_094c_some_to_10cc_placed`. -/ +theorem stageP2_matched_094c_some_to_10cc_placed_sat [LibsignalPlacement] + {ext : String → Option (State → State)} {Qp : State → SepProp → Prop} + (h_bb : HookSat (Rust.withPanics ext) lsBlackBoxU8Sym blackBoxSpecSat) + (s : State) + (sp coroPtr outPtr msgPtr : BitVec 64) + (remIdKey ik : IdentityKey) + (hcro : LibsignalCodeRoLoaded lsmpl s.mem) + (hsp_eq : s.sp = sp) + (hsp_root : rootStack ≤ sp.toNat) + (hpc : s.pc = (blkPl_518).base + 0x94c#64) + (hrun : s.status = .Running) + (hsp_align : (s.sp &&& 15#64 == 0#64) = true) + (hx19 : s.readReg64 .x19 = coroPtr) + (hx21 : s.readReg64 .x21 = sp + 0x370#64) + (hx25 : s.readReg64 .x25 = sp + 0x210#64) + (hx28 : s.readReg64 .x28 = sp + 0xa90#64) : + SepWPp (lsProg_518 (Rust.withPanics ext)) ((blkPl_518).base + 0x10cc#64) s + (remoteIdentityOkAt (sp + 0x3e0#64) (some ik) ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + stackAt sp rootStack) + (fun s4 P_f => + (P_f ⊢ + memRegion (sp + 0x3e0#64) 34 ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + stackAt sp rootStack) ∧ + s4.sp = sp ∧ + s4.trace = s.trace ∧ + s4.readReg64 .x0 = (if remIdKey.publicKey == ik.publicKey then 1#64 else 0#64) ∧ + s4.readReg64 .x19 = coroPtr ∧ + s4.readReg64 .x25 = sp + 0x210#64 ∧ + s4.readReg64 .x26 = outPtr ∧ + s4.readReg64 .x28 = sp + 0xa90#64 ∧ + s4.readReg64 .x29 = s.readReg64 .x29 ∧ + calleeSavedVRegs s4 = calleeSavedVRegs s ∧ + LibsignalCodeRoLoaded lsmpl s4.mem) + Qp := by + have hroot_le : rootStack ≤ 2 ^ 64 := Nat.le_trans hsp_root (Nat.le_of_lt sp.isLt) + let bs := ik.publicKey.bytes.toList + have hbs_len : bs.length = 32 := ik.publicKey.bytes.property + let w0 := pack32LE (bs.take 4) + let h1 := pack16LE ((bs.drop 4).take 2) + let q2 := pack64LE ((bs.drop 6).take 8) + let q3 := pack64LE ((bs.drop 14).take 8) + let q4 := pack64LE ((bs.drop 22).take 8) + let h5 := pack16LE (bs.drop 30) + conv => arg 4; rw [remoteIdentityOkAt_some_eq_placed sp ik, + show ik.publicKey.bytes.toList = bs from rfl, + pointsToBytes_32_eq_chunks32 (sp + 0x3e2#64) bs hbs_len, + memRegion_920_6_split_placed sp, memRegion_a90_48_split_10_38_placed sp] + dsimp only [chunks32At] + simp only [BitVec.add_assoc, BitVec.reduceAdd, sepConj_assoc] + sep_norm + refine SepWPp.exists_elim fun u_920 => SepWPp.exists_elim fun u_924 => + SepWPp.exists_elim fun u_a90 => SepWPp.exists_elim fun u_a98 => ?_ + have h094c := p2_seg_094c_ok_placed_wp ext s coroPtr outPtr hpc hrun hsp_align hx19 + rw [hsp_eq] at h094c + refine bind_sepWP_lscro_steps_m2_placed hcro h094c (by sep_focus) + fun s1 _ hpc1 hrun1 hcro1 hregs1 => ?_ + rcases hregs1 with ⟨hsp1_s, htr1_s, hvregs1, hx19_1, hx21_1, _, _, hx25_1, hx26_1, _, hx28_1, hx29_1, _⟩ + have hsp1 : s1.sp = sp := hsp1_s + have hsp1_align : (s1.sp &&& 15#64 == 0#64) = true := by rw [hsp1, ← hsp_eq]; exact hsp_align + have hx21_1' : s1.readReg64 .x21 = s1.sp + 0x370#64 := by rw [hsp1]; exact hx21_1.trans hx21 + have h1064 := p2_seg_1064_some_load_placed_wp ext s1 coroPtr q2 q3 q4 u_a90 + w0 u_920 h1 h5 u_924 u_a98 hpc1 hrun1 hsp1_align hx19_1 hx21_1' + rw [hsp1] at h1064 + refine bind_sepWP_lscro_steps_m2_placed hcro1 h1064 (by sep_focus) + fun s2 _ hpc2 hrun2 hcro2 hregs2 => ?_ + rcases hregs2 with ⟨hsp2_1, htr2_1, hvregs2, hx8_2, hx9_2, hx19_2, hx21_2, hx25_2, hx26_2, _, hx28_2, hx29_2, _⟩ + have hsp2 : s2.sp = sp := hsp2_1 + have hsp2_align : (s2.sp &&& 15#64 == 0#64) = true := by rw [hsp2, ← hsp_eq]; exact hsp_align + have hx21_2' : s2.readReg64 .x21 = s2.sp + 0x370#64 := by rw [hsp2]; exact hx21_2 + have hrepack34 : + ((sp + 0x3e0#64) ↦₈ 0#8) ∗ ((sp + 0x3e1#64) ↦₈ 1#8) ∗ + chunks32At (sp + 0x3e2#64) w0 h1 q2 q3 q4 h5 ⊢ + memRegion (sp + 0x3e0#64) 32 ∗ memRegion (sp + 0x400#64) 2 := by + rw [← memRegion_34_split_32_2_placed sp] + exact rem34_bytes_entails_memRegion34_placed sp 0#8 1#8 w0 h1 q2 q3 q4 h5 + dsimp only [chunks32At] at hrepack34 + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hrepack34 + refine SepWPp.weaken_frame hrepack34 (by sep_focus) ?_ + conv => arg 4; rw [memRegion_32_eq_chunks32_placed (sp + 0x3e0#64)] + dsimp only [chunks32At] + simp only [BitVec.add_assoc, BitVec.reduceAdd, sepConj_assoc] + sep_norm + refine SepWPp.exists_elim fun d0 => SepWPp.exists_elim fun d1 => + SepWPp.exists_elim fun d2 => SepWPp.exists_elim fun d3 => + SepWPp.exists_elim fun d4 => SepWPp.exists_elim fun d5 => ?_ + have h1094 := p2_seg_1094_some_store_placed_wp ext s2 coroPtr msgPtr q2 q3 q4 d2 d3 d4 + w0 d0 h1 h5 d1 d5 hpc2 hrun2 hsp2_align hx8_2 hx9_2 hx19_2 hx21_2' + rw [hsp2] at h1094 + refine bind_sepWP_lscro_steps_m2_placed hcro2 h1094 (by sep_focus) + fun s3 _ hpc3 hrun3 hcro3 hregs3 => ?_ + rcases hregs3 with ⟨hsp3_2, htr3_2, hvregs3, hx0_3, hx1_3, hx19_3, _, hx25_3, hx26_3, _, hx28_3, hx29_3, hx30_3⟩ + have hsp3 : s3.sp = sp := hsp3_2 + have hsp3_al : s3.spAligned = true := by + simpa only [State.spAligned, hsp3, ← hsp_eq] using hsp_align + have hfold_bs : + ((sp + 0x3e0#64) ↦₃₂ w0) ∗ ((sp + 0x3e4#64) ↦₁₆ h1) ∗ + ((sp + 0x3e6#64) ↦₆₄ q2) ∗ ((sp + 0x3ee#64) ↦₆₄ q3) ∗ + ((sp + 0x3f6#64) ↦₆₄ q4) ∗ ((sp + 0x3fe#64) ↦₁₆ h5) = + ((sp + 0x3e0#64) ↦ₛ ik.publicKey.bytes.toList) := by + rw [show ik.publicKey.bytes.toList = bs from rfl, + pointsToBytes_32_eq_chunks32 (sp + 0x3e0#64) bs hbs_len] + dsimp only [chunks32At, w0, h1, q2, q3, q4, h5] + simp only [BitVec.add_assoc, BitVec.reduceAdd, sepConj_assoc] + refine SepWPp.weaken_frame (Entails.of_eq hfold_bs) (by sep_focus) ?_ + refine SepWPp.weaken_frame (Entails.of_eq (stack_root_to_pkEq16_mem_placed sp hroot_le)) (by sep_focus) ?_ + have hpkeq := subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded + (ls_subroutine_ok_of_block (callerProg := lsProg_518 (Rust.withPanics ext)) + (j := 212) (entry := lsmpl.base 212) + (publicKey_eq_mem_placed_ok_16_sat h_bb) + (by decide)) + refine call_lscro_nopanic_m2_placed + (spec := publicKeyEqMemSpec16) + (x := (msgPtr + 0xc8#64, remIdKey.publicKey, sp + 0x3e0#64, ik.publicKey, sp)) + (T := ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + ((sp + 0x3e0#64) ↦ₛ ik.publicKey.bytes.toList) ∗ + memRegion (sp - 80#64) 80) + hcro3 hpkeq hpc3 hrun3 hsp3_al hx30_3 + (by dsimp only [publicKeyEqMemSpec16]) + (And.intro hx0_3 (And.intro hx1_3 hsp3)) (by sep_focus) + (hoom_false := fun _ => rfl) + (hnext := fun s4 _ hpc4 hrun4 hsp4_3 _ hcs4 hcro4 => ?_) + dsimp only [publicKeyEqMemSpec16] + simp only [sepConj_assoc] + refine SepWPp.pure_elim fun ⟨hx0_4, htr4_3⟩ => ?_ + refine SepWPp.weaken_frame (Entails.of_eq (stack_root_to_pkEq16_mem_placed sp hroot_le).symm) (by sep_focus) ?_ + rcases hcs4 with ⟨hx19_cs4, _, _, _, _, _, hx25_cs4, hx26_cs4, _, hx28_cs4, hx29_cs4, hvregs_cs4⟩ + refine SepWPp.done hpc4 hrun4 ⟨?_, hsp4_3.trans hsp3, + htr4_3.trans (htr3_2.trans (htr2_1.trans htr1_s)), + hx0_4, hx19_cs4.trans hx19_3, + hx25_cs4.trans (hx25_3.trans (hx25_2.trans (hx25_1.trans hx25))), + hx26_cs4.trans (hx26_3.trans (hx26_2.trans hx26_1)), + hx28_cs4.trans (hx28_3.trans (hx28_2.trans (hx28_1.trans hx28))), + hx29_cs4.trans (hx29_3.trans (hx29_2.trans hx29_1)), + hvregs_cs4.trans (congrArg VRegFile.calleeSaved (hvregs3.trans (hvregs2.trans hvregs1))), + hcro4⟩ + have hbs34 : + ((sp + 0x3e0#64) ↦ₛ ik.publicKey.bytes.toList) ∗ memRegion (sp + 0x400#64) 2 ⊢ + memRegion (sp + 0x3e0#64) 34 := by + rw [memRegion_34_split_32_2_placed sp] + refine sepConj_mono_left ?_ + simpa only [hbs_len] using ProofLib.pointsToBytes_entails_memRegion (sp + 0x3e0#64) bs + refine Entails.trans (entails_replace_sub hbs34 (by sep_focus) rfl) ?_ + refine Entails.trans (entails_replace_sub (memRegion_920_6_join_placed sp w0 h1) (by sep_focus) rfl) ?_ + exact entails_replace_sub (memRegion_a90_48_join_10_38_placed sp q4 h5) (by sep_focus) + (eq_of_sep_emp (by sep_focus)) + +set_option maxHeartbeats 1200000 in +/-- `HookSat`-backed sibling of `M2OkPlaced.stageP2_matched_094c_match_placed`. -/ +theorem stageP2_matched_094c_match_placed_sat [LibsignalPlacement] {A : RustAlloc} + {ext : String → Option (State → State)} {s0 : State} + (h_bb : HookSat (Rust.withPanics ext) lsBlackBoxU8Sym blackBoxSpecSat) + (s : State) + (sp coroPtr outPtr msgPtr remoteAddrPtr localAddrPtr v_330 v_388 + u_80 u_88 u_90 u_a8 u_b0 v_d0 + u_298 u_2a0 u_3a0 u_3b0 u_3b8 u_3c0 u_3c8 u_3d0 u_3d8 : BitVec 64) + (u_2a8 u_b8 : BitVec 32) + (msgVerByte b_4f2 b_390 b_3ac : BitVec 8) + (remIdKey : IdentityKey) + (recG : SessionGhost) (recSt : SessionState (List (BitVec 8))) + (hrem_eq : recSt.remoteIdentity = some remIdKey) + (hcro : LibsignalCodeRoLoaded lsmpl s.mem) + (hsp_eq : s.sp = sp) + (hsp_root : rootStack ≤ sp.toNat) + (hpc : s.pc = (blkPl_518).base + 0x94c#64) + (hrun : s.status = .Running) + (hsp_align : (s.sp &&& 15#64 == 0#64) = true) + (hx19 : s.readReg64 .x19 = coroPtr) + (hx21 : s.readReg64 .x21 = sp + 0x370#64) + (hx25 : s.readReg64 .x25 = sp + 0x210#64) + (hx28 : s.readReg64 .x28 = sp + 0xa90#64) : + SepWPp (lsProg_518 (Rust.withPanics ext)) ((blkPl_518).base + 0x1778#64) s + (remoteIdentityOkAt (sp + 0x3e0#64) recSt.remoteIdentity ∗ + sessionStateAt A (coroPtr + 0xf8#64) recG recSt ∗ + ((coroPtr + 0x70#64) ↦₆₄ msgPtr) ∗ + ((coroPtr + 0x78#64) ↦₆₄ remoteAddrPtr) ∗ + ((coroPtr + 0x80#64) ↦₆₄ localAddrPtr) ∗ + cells (coroPtr + 0x250#64) 6 ∗ + ((coroPtr + 0x298#64) ↦₆₄ u_298) ∗ + ((coroPtr + 0x2a0#64) ↦₆₄ u_2a0) ∗ + ((coroPtr + 0x2a8#64) ↦₃₂ u_2a8) ∗ + ((coroPtr + 0x330#64) ↦₆₄ v_330) ∗ + ((coroPtr + 0x388#64) ↦₆₄ v_388) ∗ + ((coroPtr + 0x390#64) ↦₈ b_390) ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((coroPtr + 0x4f2#64) ↦₈ b_4f2) ∗ + ((msgPtr + 0x70#64) ↦₈ msgVerByte) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + ((sp + 0x80#64) ↦₆₄ u_80) ∗ + ((sp + 0x88#64) ↦₆₄ u_88) ∗ + ((sp + 0x90#64) ↦₆₄ u_90) ∗ + ((sp + 0x98#64) ↦₆₄ (coroPtr + 0x398#64)) ∗ + ((sp + 0xa0#64) ↦₆₄ (coroPtr + 0x4f2#64)) ∗ + ((sp + 0xa8#64) ↦₆₄ u_a8) ∗ + ((sp + 0xb0#64) ↦₆₄ u_b0) ∗ + ((sp + 0xb8#64) ↦₃₂ u_b8) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + ((sp + 0xd0#64) ↦₆₄ v_d0) ∗ + ((sp + 0x3a0#64) ↦₆₄ u_3a0) ∗ + ((sp + 0x3ac#64) ↦₈ b_3ac) ∗ + ((sp + 0x3b0#64) ↦₆₄ u_3b0) ∗ + ((sp + 0x3b8#64) ↦₆₄ u_3b8) ∗ + ((sp + 0x3c0#64) ↦₆₄ u_3c0) ∗ + ((sp + 0x3c8#64) ↦₆₄ u_3c8) ∗ + ((sp + 0x3d0#64) ↦₆₄ u_3d0) ∗ + ((sp + 0x3d8#64) ↦₆₄ u_3d8) ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + stackAt sp rootStack) + (fun sf P_f => + (P_f ⊢ + ∃∗ opkHi : BitVec 32, ∃∗ kyberPacked : BitVec 64, + memRegion (sp + 0x3e0#64) 34 ∗ + sessionStateAt A (coroPtr + 0xf8#64) recG recSt ∗ + ((coroPtr + 0x70#64) ↦₆₄ msgPtr) ∗ + ((coroPtr + 0x78#64) ↦₆₄ remoteAddrPtr) ∗ + ((coroPtr + 0x80#64) ↦₆₄ localAddrPtr) ∗ + cells (coroPtr + 0x250#64) 6 ∗ + ((coroPtr + 0x298#64) ↦₃₂ 2#32) ∗ + ((coroPtr + 0x29c#64) ↦₃₂ opkHi) ∗ + ((coroPtr + 0x2a0#64) ↦₆₄ kyberPacked) ∗ + ((coroPtr + 0x2a8#64) ↦₃₂ v_d0.truncate 32) ∗ + ((coroPtr + 0x330#64) ↦₆₄ v_330) ∗ + ((coroPtr + 0x388#64) ↦₆₄ v_388) ∗ + ((coroPtr + 0x390#64) ↦₈ 1#8) ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((coroPtr + 0x4f2#64) ↦₈ 1#8) ∗ + ((msgPtr + 0x70#64) ↦₈ msgVerByte) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + ((sp + 0x80#64) ↦₆₄ (coroPtr + 0xf8#64)) ∗ + ((sp + 0x88#64) ↦₆₄ (coroPtr + 0xe0#64)) ∗ + ((sp + 0x90#64) ↦₆₄ v_388) ∗ + ((sp + 0x98#64) ↦₆₄ (coroPtr + 0x398#64)) ∗ + ((sp + 0xa0#64) ↦₆₄ localAddrPtr) ∗ + ((sp + 0xa8#64) ↦₆₄ v_330) ∗ + ((sp + 0xb0#64) ↦₆₄ msgPtr) ∗ + ((sp + 0xb8#64) ↦₃₂ msgVerByte.zeroExtend 32) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + ((sp + 0xd0#64) ↦₆₄ v_d0) ∗ + ((sp + 0x3a0#64) ↦₆₄ remoteAddrPtr) ∗ + ((sp + 0x3ac#64) ↦₈ 3#8) ∗ + ((sp + 0x3b0#64) ↦₆₄ (sp + 0x3ac#64)) ∗ + ((sp + 0x3b8#64) ↦₆₄ msgPtr) ∗ + ((sp + 0x3c0#64) ↦₆₄ (sp + 0x3a0#64)) ∗ + ((sp + 0x3c8#64) ↦₆₄ 0#64) ∗ + ((sp + 0x3d0#64) ↦₆₄ 8#64) ∗ + ((sp + 0x3d8#64) ↦₆₄ 0#64) ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + stackAt sp rootStack) ∧ + sf.sp = sp ∧ + sf.trace = s.trace ∧ + sf.readReg64 .x19 = coroPtr ∧ + sf.readReg64 .x27 = sp + 0x370#64 ∧ + sf.readReg64 .x29 = s.readReg64 .x29 ∧ + calleeSavedVRegs sf = calleeSavedVRegs s ∧ + LibsignalCodeRoLoaded lsmpl sf.mem) + (PanicOomProp s0) := by + conv => + arg 4 + rw [hrem_eq] + have hchk := stageP2_matched_094c_some_to_10cc_placed_sat + (Qp := PanicOomProp s0) h_bb s sp coroPtr outPtr msgPtr + remIdKey remIdKey hcro hsp_eq hsp_root hpc hrun hsp_align hx19 hx21 hx25 hx28 + refine SepWPp.bind_sepWPp_steps_frame hchk (by sep_focus) + fun s1 _ hpc1 hrun1 ⟨hsp1, htr1, hx0_1, hx19_1, _, hx26_1, _, hx29_1, hvregs1, hcro1⟩ => ?_ + have hx0_one : s1.readReg64 .x0 = 1#64 := by + simpa [beq_self_eq_true] using hx0_1 + have hsp1_align : (s1.sp &&& 15#64 == 0#64) = true := by rw [hsp1, ← hsp_eq]; exact hsp_align + have htail := stageP2_matched_ok_10cc_to_1778_placed (A := A) (ext := ext) + (Qp := PanicOomProp s0) s1 sp coroPtr outPtr msgPtr + remoteAddrPtr localAddrPtr v_330 v_388 u_80 u_88 u_90 (coroPtr + 0x4f2#64) u_a8 u_b0 v_d0 + u_298 u_2a0 u_3a0 u_3b0 u_3b8 u_3c0 u_3c8 u_3d0 u_3d8 u_2a8 u_b8 msgVerByte b_4f2 b_390 b_3ac + recG recSt hcro1 hsp1 hsp_root hpc1 hrun1 hsp1_align hx0_one hx19_1 hx26_1 + refine SepWPp.bind_sepWPp_steps_frame htail (by sep_focus) + fun sf _ hpcf hrunf ⟨hspf, htrf, hx19_f, hx27_f, hx29_f, hvregsf_1, hcrof⟩ => ?_ + refine SepWPp.done hpcf hrunf + ⟨?_, hspf, htrf.trans htr1, hx19_f, hx27_f, hx29_f.trans hx29_1, hvregsf_1.trans hvregs1, hcrof⟩ + sep_norm + refine Entails.sepExists_elim fun opkHi => Entails.sepExists_right opkHi ?_ + refine Entails.sepExists_elim fun kyberPacked => Entails.sepExists_right kyberPacked ?_ + exact Entails.of_eq (eq_of_sep_emp (by sep_focus)) + +set_option maxHeartbeats 1200000 in +/-- `HookSat`-backed sibling of `M2TopPlaced.stageP2_matched_094c_mismatch_placed`. -/ +theorem stageP2_matched_094c_mismatch_placed_sat [LibsignalPlacement] {A : RustAlloc} + {ext : String → Option (State → State)} + (hto : subroutine_ok (lsProg_518 (Rust.withPanics ext)) + (lsmpl.base 530) + (withLsCodeLoaded lsmpl (strToOwnedLocal2Spec A))) + (hdealloc : subroutine_ok (lsProg_518 (Rust.withPanics ext)) + (lsρ "_RNvCs1njKG4L9aB3_7___rustc14___rust_dealloc") + (rustDeallocSpec A)) + (h_bb : HookSat (Rust.withPanics ext) lsBlackBoxU8Sym blackBoxSpecSat) + (hdrop_ss : subroutine_ok (lsProg_518 (Rust.withPanics ext)) + (lsmpl.base 512) + (withLsCodeLoaded lsmpl (dropSessionStructureLocal2Spec A))) + (s0 s : State) + (sp coroPtr outPtr msgPtr u_a8 u_d0 : BitVec 64) + (b_4f2 b_390 b_2c0 : BitVec 8) + (remIdKey : IdentityKey) + (g : RecordGhost) (recG : SessionGhost) (recSt : SessionState (List (BitVec 8))) + (hrem_ne : recSt.remoteIdentity ≠ some remIdKey) + (hcro : LibsignalCodeRoLoaded lsmpl s.mem) + (htr : s0.trace <+: s.trace) + (hsp_eq : s.sp = sp) + (hsp_root : rootStack ≤ sp.toNat) + (hpc : s.pc = (blkPl_518).base + 0x94c#64) + (hrun : s.status = .Running) + (hsp_align : (s.sp &&& 15#64 == 0#64) = true) + (hx19 : s.readReg64 .x19 = coroPtr) + (hx21 : s.readReg64 .x21 = sp + 0x370#64) + (hx25 : s.readReg64 .x25 = sp + 0x210#64) + (hx28 : s.readReg64 .x28 = sp + 0xa90#64) : + SepWPp (lsProg_518 (Rust.withPanics ext)) (s0.readReg64 .x30) s + (remoteIdentityOkAt (sp + 0x3e0#64) recSt.remoteIdentity ∗ + prevSessionsEmptyAt A coroPtr g ∗ + sessionStateAt A (coroPtr + 0xf8#64) recG recSt ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + cells (coroPtr + 0x250#64) 6 ∗ + ((coroPtr + 0x2c0#64) ↦₈ b_2c0) ∗ + ((coroPtr + 0x390#64) ↦₈ b_390) ∗ + ((coroPtr + 0x4f2#64) ↦₈ b_4f2) ∗ + ((sp + 0x98#64) ↦₆₄ (coroPtr + 0x398#64)) ∗ + ((sp + 0xa0#64) ↦₆₄ (coroPtr + 0x4f2#64)) ∗ + ((sp + 0xa8#64) ↦₆₄ u_a8) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + ((sp + 0xd0#64) ↦₆₄ u_d0) ∗ + memRegion (sp + 0x370#64) 36 ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + memRegion outPtr 48 ∗ + (lsLogFilterAddr ↦₆₄ 0#64) ∗ + decryptPrekeySavedRegsAt (sp + 0xcd0#64) s0 ∗ + A.pool ∗ + stackAt sp rootStack) + (fun sf P_f => + (P_f ⊢ + memRegion (sp + 0x3e0#64) 34 ∗ + memRegion (coroPtr + 0xe0#64) 368 ∗ + ((coroPtr + 0x468#64) ↦₆₄ msgPtr) ∗ + ((msgPtr + 0xc8#64) ↦ₛ remIdKey.publicKey.bytes.toList) ∗ + cells (coroPtr + 0x250#64) 6 ∗ + ((coroPtr + 0x2c0#64) ↦₈ 1#8) ∗ + ((coroPtr + 0x390#64) ↦₈ 1#8) ∗ + ((coroPtr + 0x4f2#64) ↦₈ 1#8) ∗ + ((sp + 0x98#64) ↦₆₄ (coroPtr + 0x398#64)) ∗ + ((sp + 0xa0#64) ↦₆₄ (coroPtr + 0x4f2#64)) ∗ + ((sp + 0xa8#64) ↦₆₄ 3#64) ∗ + ((sp + 0xc8#64) ↦₆₄ outPtr) ∗ + ((sp + 0xd0#64) ↦₆₄ 70#64) ∗ + memRegion (sp + 0x370#64) 36 ∗ + memRegion (sp + 0x920#64) 6 ∗ + memRegion (sp + 0xa90#64) 48 ∗ + apiDecResultAt A outPtr (.error (.protocol (.invalidMessage .preKey .badCiphertext))) ∗ + (lsLogFilterAddr ↦₆₄ 0#64) ∗ + decryptPrekeySavedRegsAt (sp + 0xcd0#64) s0 ∗ + A.pool ∗ + stackAt sp rootStack) ∧ + sf.sp = sp + 0xcd0#64 ∧ + sf.trace = s.trace ∧ + ClosureCalleeSaved s0 sf ∧ + calleeSavedVRegs sf = calleeSavedVRegs s ∧ + LibsignalCodeRoLoaded lsmpl sf.mem) + (PanicOomProp s0) := by + cases hrem : recSt.remoteIdentity with + | none => + conv => + arg 4 + rw [remoteIdentityOkAt_none_eq_placed sp, memRegion_32_eq_chunks32_placed (sp + 0x3e2#64), + memRegion_920_6_split_placed sp, memRegion_a90_48_split_10_38_placed sp] + dsimp only [chunks32At] + simp only [BitVec.add_assoc, BitVec.reduceAdd, sepConj_assoc] + sep_norm + refine SepWPp.exists_elim fun w0 => SepWPp.exists_elim fun h1 => + SepWPp.exists_elim fun q2 => SepWPp.exists_elim fun q3 => + SepWPp.exists_elim fun q4 => SepWPp.exists_elim fun h5 => + SepWPp.exists_elim fun u_920 => SepWPp.exists_elim fun u_924 => + SepWPp.exists_elim fun u_a90 => SepWPp.exists_elim fun u_a98 => ?_ + have h094c := p2_seg_094c_ok_placed_wp ext s coroPtr outPtr hpc hrun hsp_align hx19 + rw [hsp_eq] at h094c + refine bind_sepWP_lscro_steps_m2_placed hcro h094c (by sep_focus) + fun s1 _ hpc1 hrun1 hcro1 hregs1 => ?_ + rcases hregs1 with ⟨hsp1_s, htr1_s, hvregs1, hx19_1, hx21_1, _, _, hx25_1, hx26_1, _, hx28_1, _, _⟩ + have hsp1 : s1.sp = sp := hsp1_s + have hx21_1' : s1.readReg64 .x21 = s1.sp + 0x370#64 := by rw [hsp1]; exact hx21_1.trans hx21 + have h1064 := p2_seg_1064_none_placed_wp ext s1 coroPtr q2 q3 q4 u_a90 + w0 u_920 h1 h5 u_924 u_a98 hpc1 hrun1 (by rw [hsp1, ← hsp_eq]; exact hsp_align) hx19_1 hx21_1' + rw [hsp1] at h1064 + refine bind_sepWP_lscro_steps_m2_placed hcro1 h1064 (by sep_focus) + fun s2 _ hpc2 hrun2 hcro2 hregs2 => ?_ + rcases hregs2 with ⟨hsp2_1, htr2_1, hvregs2, hx19_2, hx25_2, hx26_2, _, hx28_2, _, _⟩ + have hsp2 : s2.sp = sp := hsp2_1 + have hsp2_align : (s2.sp &&& 15#64 == 0#64) = true := by rw [hsp2, ← hsp_eq]; exact hsp_align + have htr2_s : s2.trace = s.trace := htr2_1.trans htr1_s + have htr2 : s0.trace <+: s2.trace := by rw [htr2_s]; exact htr + have hx25_2' : s2.readReg64 .x25 = sp + 0x210#64 := hx25_2.trans (hx25_1.trans hx25) + have hx26_2' : s2.readReg64 .x26 = outPtr := hx26_2.trans hx26_1 + have hx28_2' : s2.readReg64 .x28 = sp + 0xa90#64 := hx28_2.trans (hx28_1.trans hx28) + have hvregs2_s : calleeSavedVRegs s2 = calleeSavedVRegs s := + congrArg VRegFile.calleeSaved (hvregs2.trans hvregs1) + have hrem34 := rem34_bytes_entails_memRegion34_placed sp 0#8 0#8 w0 h1 q2 q3 q4 h5 + dsimp only [chunks32At] at hrem34 + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hrem34 + refine SepWPp.weaken_frame hrem34 (by sep_focus) ?_ + refine SepWPp.weaken_frame (memRegion_920_6_join_placed sp w0 h1) (by sep_focus) ?_ + refine SepWPp.weaken_frame (memRegion_a90_48_join_10_38_placed sp q4 h5) (by sep_focus) ?_ + conv => arg 4; rw [memRegion_34_split_24_10_placed sp] + simp only [sepConj_assoc] + have htail := stageP2_matched_mismatch_tail_placed hto hdealloc hdrop_ss s0 s2 sp coroPtr outPtr + u_a8 u_d0 b_4f2 b_390 b_2c0 g recG recSt hcro2 htr2 hsp2 hsp_root hpc2 hrun2 + hsp2_align hx19_2 hx25_2' hx26_2' hx28_2' + refine SepWPp.bind_sepWPp_steps_frame htail (by sep_focus) + fun sf _ hpcf hrunf ⟨hspf, htrf_2, hcsf, hvregsf_2, hcrof⟩ => ?_ + refine SepWPp.done hpcf hrunf + ⟨?_, hspf, htrf_2.trans htr2_s, hcsf, hvregsf_2.trans hvregs2_s, hcrof⟩ + have hjoin34 : memRegion (sp + 0x3e0#64) 24 ∗ memRegion (sp + 0x3f8#64) 10 ⊢ + memRegion (sp + 0x3e0#64) 34 := + Entails.of_eq (memRegion_34_split_24_10_placed sp).symm + exact entails_replace_sub hjoin34 (by sep_focus) (eq_of_sep_emp (by sep_focus)) + | some ik => + have hne_ik : some ik ≠ some remIdKey := by rw [← hrem]; exact hrem_ne + have hchk := stageP2_matched_094c_some_to_10cc_placed_sat (Qp := PanicOomProp s0) + h_bb s sp coroPtr outPtr msgPtr remIdKey ik hcro hsp_eq hsp_root hpc hrun hsp_align + hx19 hx21 hx25 hx28 + refine SepWPp.bind_sepWPp_steps_frame hchk (by sep_focus) + fun s1 _ hpc1 hrun1 ⟨hsp1, htr1_s, hx0_1, hx19_1, hx25_1, hx26_1, hx28_1, _, hvregs1, hcro1⟩ => ?_ + have hx0_zero : s1.readReg64 .x0 = 0#64 := by + simpa [publicKey_beq_false_of_ne_placed hne_ik] using hx0_1 + have h10cc := p2_seg_10cc_mismatch_placed_wp ext s1 coroPtr hpc1 hrun1 hx0_zero hx19_1 + refine bind_sepWP_lscro_steps_m2_placed hcro1 h10cc (by sep_focus) + fun s2 _ hpc2 hrun2 hcro2 hregs2 => ?_ + rcases hregs2 with ⟨hsp2_1, htr2_1, hvregs2, hx19_2, hx25_2, hx26_2, _, hx28_2, _, _⟩ + have hsp2 : s2.sp = sp := hsp2_1.trans hsp1 + have hsp2_align : (s2.sp &&& 15#64 == 0#64) = true := by rw [hsp2, ← hsp_eq]; exact hsp_align + have htr2_s : s2.trace = s.trace := htr2_1.trans htr1_s + have htr2 : s0.trace <+: s2.trace := by rw [htr2_s]; exact htr + have hx25_2' : s2.readReg64 .x25 = sp + 0x210#64 := hx25_2.trans hx25_1 + have hx26_2' : s2.readReg64 .x26 = outPtr := hx26_2.trans hx26_1 + have hx28_2' : s2.readReg64 .x28 = sp + 0xa90#64 := hx28_2.trans hx28_1 + have hvregs2_s : calleeSavedVRegs s2 = calleeSavedVRegs s := + (congrArg VRegFile.calleeSaved hvregs2).trans hvregs1 + conv => arg 4; rw [memRegion_34_split_24_10_placed sp] + simp only [sepConj_assoc] + have htail := stageP2_matched_mismatch_tail_placed hto hdealloc hdrop_ss s0 s2 sp coroPtr outPtr + u_a8 u_d0 b_4f2 b_390 b_2c0 g recG recSt hcro2 htr2 hsp2 hsp_root hpc2 hrun2 + hsp2_align hx19_2 hx25_2' hx26_2' hx28_2' + refine SepWPp.bind_sepWPp_steps_frame htail (by sep_focus) + fun sf _ hpcf hrunf ⟨hspf, htrf_2, hcsf, hvregsf_2, hcrof⟩ => ?_ + refine SepWPp.done hpcf hrunf + ⟨?_, hspf, htrf_2.trans htr2_s, hcsf, hvregsf_2.trans hvregs2_s, hcrof⟩ + have hjoin34 : memRegion (sp + 0x3e0#64) 24 ∗ memRegion (sp + 0x3f8#64) 10 ⊢ + memRegion (sp + 0x3e0#64) 34 := + Entails.of_eq (memRegion_34_split_24_10_placed sp).symm + exact entails_replace_sub hjoin34 (by sep_focus) (eq_of_sep_emp (by sep_focus)) + +set_option maxHeartbeats 1200000 in +/-- `HookSat`-backed sibling of `M2TopPlaced.stageP2_matched_ok_framed_placed`. -/ +theorem stageP2_matched_ok_framed_placed_sat [LibsignalPlacement] {A : RustAlloc} + {ext : String → Option (State → State)} {Q Qp : State → SepProp → Prop} + (hser : subroutine_ok (lsProg_518 (Rust.withPanics ext)) + (lsmpl.base 205) + (withLsCodeLoaded lsmpl (publicKeySerializeSpec A))) + (hto : subroutine_ok (lsProg_518 (Rust.withPanics ext)) + (lsmpl.base 530) + (withLsCodeLoaded lsmpl (strToOwnedLocal2Spec A))) + (hdealloc : subroutine_ok (lsProg_518 (Rust.withPanics ext)) + (lsρ "_RNvCs1njKG4L9aB3_7___rustc14___rust_dealloc") + (rustDeallocSpec A)) + (h_bb : HookSat (Rust.withPanics ext) lsBlackBoxU8Sym blackBoxSpecSat) + (hdrop_ss : subroutine_ok (lsProg_518 (Rust.withPanics ext)) + (lsmpl.base 512) + (withLsCodeLoaded lsmpl (dropSessionStructureLocal2Spec A))) + (s0 s : State) + (sp coroPtr outPtr msgPtr remoteAddrPtr localAddrPtr + idStorePtr idStoreVt preKeyStorePtr preKeyStoreVt + spkStorePtr spkStoreVt kyberStorePtr kyberStoreVt + v_330 v_388 u_80 u_88 u_90 u_a8 u_b0 v_d0 + u_298 u_2a0 u_3a0 u_3b0 u_3b8 u_3c0 u_3c8 u_3d0 u_3d8 : BitVec 64) + (u_2a8 u_b8 : BitVec 32) + (outerVerByte innerVerByte b_4f1 b_4f2 b_390 b_2c0 b_3ac : BitVec 8) + (baseKey : PublicKey) (remIdKey : IdentityKey) + (g : RecordGhost) (r : SessionRecord (List (BitVec 8))) (sess : Session (List (BitVec 8))) + (F : SepProp) + (hcur : r.currentSession = some sess) + (hver : sess.state.version = outerVerByte.zeroExtend 32) + (halice : sess.aliceBaseKey = baseKey.serialize) + (hcro : LibsignalCodeRoLoaded lsmpl s.mem) + (htr : s0.trace <+: s.trace) + (hsp_eq : s.sp = sp) + (hsp_root : rootStack ≤ sp.toNat) + (hpc : s.pc = (blkPl_518).base + 0x868#64) + (hrun : s.status = .Running) + (hsp_align : (s.sp &&& 15#64 == 0#64) = true) + (hx8 : s.readReg64 .x8 = kyberStorePtr) + (hx9 : s.readReg64 .x9 = msgPtr) + (hx10 : s.readReg64 .x10 = kyberStoreVt) + (hx11 : s.readReg64 .x11 = preKeyStorePtr) + (hx12 : s.readReg64 .x12 = remoteAddrPtr) + (hx13 : s.readReg64 .x13 = preKeyStoreVt) + (hx14 : s.readReg64 .x14 = localAddrPtr) + (hx15 : s.readReg64 .x15 = idStorePtr) + (hx16 : s.readReg64 .x16 = idStoreVt) + (hx19 : s.readReg64 .x19 = coroPtr) + (hx22 : s.readReg64 .x22 = spkStorePtr) + (hx23 : s.readReg64 .x23 = coroPtr + 0xe0#64) + (hx24 : s.readReg64 .x24 = spkStoreVt) + (hx28 : s.readReg64 .x28 = sp + 0xa90#64) + (hx29 : s.readReg64 .x29 = sp + 0xc70#64) + (hpan : ∀ sf Pf, PanicOomProp s0 sf Pf → Qp sf (Pf ∗ F)) + (hmismatch : sess.state.remoteIdentity ≠ some remIdKey → + ∀ (sf : State) (Pf : SepProp), + sf.pc = s0.readReg64 .x30 → + sf.status = .Running → + Steps (lsProg_518 (Rust.withPanics ext)) s sf → + sf.sp = sp + 0xcd0#64 → + sf.trace = s.trace → + ClosureCalleeSaved s0 sf → + calleeSavedVRegs sf = calleeSavedVRegs s → + LibsignalCodeRoLoaded lsmpl sf.mem → + (Pf ⊢ stageP2MatchedMismatchPostPlaced A s0 sp coroPtr outPtr msgPtr + remoteAddrPtr localAddrPtr idStorePtr idStoreVt preKeyStorePtr preKeyStoreVt + kyberStorePtr kyberStoreVt v_330 v_388 u_80 u_88 u_90 u_b0 + u_298 u_2a0 u_3a0 u_3b0 u_3b8 u_3c0 u_3c8 u_3d0 u_3d8 + u_2a8 u_b8 outerVerByte innerVerByte b_3ac baseKey remIdKey F) → + Q sf Pf) + (hmatch : sess.state.remoteIdentity = some remIdKey → + ∀ (s2 : State) (recG : SessionGhost) (opkHi kyberPreKeyId signedPreKeyId : BitVec 32), + g.cur = some recG → + SessionExtraRel recG sess → + Steps (lsProg_518 (Rust.withPanics ext)) s s2 → + s2.pc = (blkPl_518).base + 0x1778#64 → + s2.status = .Running → + s2.sp = sp → + (s2.sp &&& 15#64 == 0#64) = true → + s2.trace = s.trace → + s2.readReg64 .x19 = coroPtr → + s2.readReg64 .x27 = sp + 0x370#64 → + s2.readReg64 .x29 = sp + 0xc70#64 → + calleeSavedVRegs s2 = calleeSavedVRegs s → + LibsignalCodeRoLoaded lsmpl s2.mem → + SepWPp (lsProg_518 (Rust.withPanics ext)) (s0.readReg64 .x30) s2 + (stageP2MatchedMatchPrePlaced A s0 sp coroPtr outPtr msgPtr + remoteAddrPtr localAddrPtr idStorePtr idStoreVt preKeyStorePtr preKeyStoreVt + kyberStorePtr kyberStoreVt v_330 v_388 v_d0 + opkHi kyberPreKeyId signedPreKeyId outerVerByte innerVerByte b_2c0 + baseKey remIdKey g recG sess.state F) + Q Qp) : + SepWPp (lsProg_518 (Rust.withPanics ext)) (s0.readReg64 .x30) s + (stageP2MatchedPrePlaced A s0 sp coroPtr outPtr msgPtr remoteAddrPtr localAddrPtr + v_330 v_388 u_80 u_88 u_90 u_a8 u_b0 v_d0 + u_298 u_2a0 u_3a0 u_3b0 u_3b8 u_3c0 u_3c8 u_3d0 u_3d8 + u_2a8 u_b8 outerVerByte innerVerByte b_4f1 b_4f2 b_390 b_2c0 b_3ac + baseKey remIdKey g r F) + Q Qp := by + dsimp only [stageP2MatchedPrePlaced, stageP2MatchedMismatchPostPlaced, stageP2MatchedMatchPrePlaced] + at hmismatch hmatch ⊢ + have hpre := stageP2_matched_0868_to_094c_placed_sat hser hdealloc h_bb s0 s sp coroPtr msgPtr + remoteAddrPtr localAddrPtr idStorePtr idStoreVt preKeyStorePtr preKeyStoreVt + spkStorePtr spkStoreVt kyberStorePtr kyberStoreVt outerVerByte b_4f1 baseKey + g r sess hcur hver halice hcro htr hsp_eq hsp_root hpc hrun hsp_align + hx8 hx9 hx10 hx11 hx12 hx13 hx14 hx15 hx16 hx19 hx22 hx23 hx24 hx28 hx29 + refine bind_sepWPp_steps_frame_panicF_placed hpan hpre (by sep_focus) + fun sm hsteps01 hpcm hrunm hregsm => ?_ + rcases hregsm with ⟨hspm, htrm, hx19m, hx21m, hx25m, hx28m, hx29m, hvregsm, hcrom⟩ + have hspm_align : (sm.sp &&& 15#64 == 0#64) = true := by rw [hspm, ← hsp_eq]; exact hsp_align + have htr0m : s0.trace <+: sm.trace := by rw [htrm]; exact htr + sep_norm + refine SepWPp.exists_elim fun recG => SepWPp.pure_elim fun ⟨hgc, hextra⟩ => ?_ + by_cases hrem : sess.state.remoteIdentity = some remIdKey + · conv => + arg 4 + rw [processPrekeyActive10At_eq] + simp only [sepConj_assoc] + have hm := stageP2_matched_094c_match_placed_sat (A := A) (s0 := s0) + h_bb sm sp coroPtr outPtr msgPtr remoteAddrPtr localAddrPtr v_330 v_388 + u_80 u_88 u_90 u_a8 u_b0 v_d0 u_298 u_2a0 u_3a0 u_3b0 u_3b8 u_3c0 u_3c8 u_3d0 u_3d8 + u_2a8 u_b8 innerVerByte b_4f2 b_390 b_3ac remIdKey recG sess.state hrem + hcrom hspm hsp_root hpcm hrunm hspm_align hx19m hx21m hx25m hx28m + refine bind_sepWPp_steps_frame_panicF_placed hpan hm (by sep_focus) + fun s2 hsteps12 hpc2 hrun2 hregs2 => ?_ + rcases hregs2 with ⟨hsp2, htr2, hx19_2, hx27_2, hx29_2, hvregs2, hcro2⟩ + have hsp2_align : (s2.sp &&& 15#64 == 0#64) = true := by rw [hsp2, ← hsp_eq]; exact hsp_align + sep_norm + refine SepWPp.exists_elim fun opkHi => SepWPp.exists_elim fun kyberPacked => ?_ + have hgoal := hmatch hrem s2 recG opkHi + (kyberPacked.extractLsb' 0 32) (kyberPacked.extractLsb' 32 32) + hgc hextra (hsteps01.trans hsteps12) hpc2 hrun2 hsp2 hsp2_align + (htr2.trans htrm) hx19_2 hx27_2 (hx29_2.trans hx29m) (hvregs2.trans hvregsm) hcro2 + refine fun R hmR hL => hgoal R (Arm64.Satisfies.mono (sepConj_mono_left ?_) hmR) hL + rw [coro_2a0_split32_placed coroPtr kyberPacked, processPrekeyActive10At_eq] + simp only [sepConj_assoc] + exact Entails.of_eq (eq_of_sep_emp (by sep_focus)) + · conv => + arg 4 + rw [processPrekeyActive10At_eq] + simp only [sepConj_assoc] + have hmm := stageP2_matched_094c_mismatch_placed_sat hto hdealloc h_bb hdrop_ss s0 sm + sp coroPtr outPtr msgPtr u_a8 v_d0 b_4f2 b_390 b_2c0 remIdKey g recG sess.state + hrem hcrom htr0m hspm hsp_root hpcm hrunm hspm_align hx19m hx21m hx25m hx28m + refine bind_sepWPp_steps_frame_panicF_placed hpan hmm (by sep_focus) + fun sf hsteps1f hpcf hrunf hregsf => ?_ + rcases hregsf with ⟨hspf, htrf, hcsf, hvregsf, hcrof⟩ + refine SepWPp.done hpcf hrunf (hmismatch hrem sf _ hpcf hrunf + (hsteps01.trans hsteps1f) hspf (htrf.trans htrm) hcsf (hvregsf.trans hvregsm) hcrof ?_) + rw [processPrekeyActive10At_eq] + simp only [sepConj_assoc] + exact Entails.of_eq (eq_of_sep_emp (by sep_focus)) + +end + +end LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedSat diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Over/StageP3PlacedBudget.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Over/StageP3PlacedBudget.lean index 4465cfc0c..4cb6bb68f 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Over/StageP3PlacedBudget.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/Over/StageP3PlacedBudget.lean @@ -68,7 +68,7 @@ open CryptoVerification.LibsignalTripleRatchetRepr ( signalMessageAt uuidTryParse vecResultAt ) open CryptoVerification.LibsignalTripleRatchet ( - SeedsLen32 TryDecryptGhost extHookStack rootStack + SeedsLen32 TryDecryptGhost rootStack ) open CryptoVerification.LibsignalTripleRatchet.FromRecordCallees ( growOneSpeStack lsLogOff setSessionStateStack @@ -147,7 +147,7 @@ open LibsignalBinary.Proofs.TripleRatchet.FromRecordCallees.DefsBudget ( dropSessionStructureLocal2Spec growOneSpeSpec setSessionStateSpec ) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget ( - sessionMemcpyBudgetSpec sessionMemcpyRegionBudgetSpec sessionMemmoveBudgetSpec + sessionMemcpyBudgetSpec sessionMemcpyRegionBudgetSpec sessionShimBudgetSpec ) open LibsignalBinary.Proofs.TripleRatchet.Record.DefsBudget ( @@ -336,7 +336,6 @@ theorem overVerNe1e04CliAtPlacedBody_of_hooks_chain5 [LibsignalPlacement] {M : A (hrealloc_sat : HookSat ext lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hdealloc_sat : HookSat ext lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmc_sat : HookSat ext lsMemcpySym framelessMemcpyBudgetSpec) - (hmemmove_sat : HookSat ext "memmove" (sessionMemmoveBudgetSpec extHookStack)) (hpanic_raw : ext lsHandleErrorSym = some Rust.panicked) (hChain5 : ChainMerge5CroPlacedOkExt A lim ext) : OverVerNe1e04CliAtPlacedBody A lim PrevEncOK VerNeTopEnv ext := @@ -347,7 +346,7 @@ theorem overVerNe1e04CliAtPlacedBody_of_hooks_chain5 [LibsignalPlacement] {M : A hx9_1 hx19_1 hx24_1 hx27_1 hx29_1 => sepWPp_weaken_post_false (overVerNe_1e04_cro_placed_of_hooks_chain5 ext hLogClosure hGrow hDropSS3 - hshim_sat halloc_sat hrealloc_sat hdealloc_sat hmc_sat hmemmove_sat hpanic_raw hChain5 + hshim_sat halloc_sat hrealloc_sat hdealloc_sat hmc_sat hpanic_raw hChain5 st_init s0 s s1 coroPtr ctxPtr outPtr initErrsPtr prevCap prevPtr ud0 hinit_ne hcap msgVer hver_ne b_2c0 enc hEnc hfits G₁ recG st hver4 hsp_root hcro1 hpc1 hrun1 hs1_sp hsp_align htr1 @@ -1330,7 +1329,6 @@ theorem overVerNe1e04CliAtFrozenPlacedBody_of_hooks_chain5 [CryptoVerification.L (hrealloc_sat : HookSat ext lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hdealloc_sat : HookSat ext lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmc_sat : HookSat ext lsMemcpySym framelessMemcpyBudgetSpec) - (hmemmove_sat : HookSat ext "memmove" (sessionMemmoveBudgetSpec extHookStack)) (hpanic_raw : ext lsHandleErrorSym = some Rust.panicked) (hChain5 : ChainMerge5CroPlacedOkExt A lim ext) : OverVerNe1e04CliAtFrozenPlacedBody A lim PrevEncOK VerNeTopEnv ext := @@ -1341,7 +1339,7 @@ theorem overVerNe1e04CliAtFrozenPlacedBody_of_hooks_chain5 [CryptoVerification.L hx9_1 hx19_1 hx24_1 hx27_1 hx29_1 => sepWPp_weaken_post_false (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.VerNe.TopPlacedBudget.overVerNe_1e04_frozen_placed_of_hooks_chain5 ext hGrow hDropSS3 - hshim_sat halloc_sat hrealloc_sat hdealloc_sat hmc_sat hmemmove_sat hpanic_raw hChain5 + hshim_sat halloc_sat hrealloc_sat hdealloc_sat hmc_sat hpanic_raw hChain5 st_init s0 s s1 coroPtr ctxPtr outPtr initErrsPtr prevCap prevPtr ud0 hinit_ne hcap msgVer hver_ne b_2c0 enc hEnc hfits G₁ recG st hver4 hsp_root hfr1 hpc1 hrun1 hs1_sp hsp_align htr1 diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/PrevDec/Chain3CroCPlacedBudget.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/PrevDec/Chain3CroCPlacedBudget.lean index 20492545d..3a6581dc4 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/PrevDec/Chain3CroCPlacedBudget.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/PrevDec/Chain3CroCPlacedBudget.lean @@ -50,7 +50,6 @@ open CryptoVerification ( ) open CryptoVerification.RustHeap (RustAlloc arrayAt arrayAt_concat arrayAt_nil vecAt vecBuf vecHeader vecOf vecU8 vecU8At) open CryptoVerification.LibsignalProtoCodec (encodeVarint) -open CryptoVerification.LibsignalTripleRatchet (extHookStack) open CryptoVerification.LibsignalTripleRatchet.Prost (sliceCursorAfter sliceCursorAt) open CryptoVerification.LibsignalPublicApi.StoreKit ( LibsignalCodeRoLoaded withLsCodeRoLoaded @@ -63,7 +62,7 @@ open CryptoVerification.SignalSession.Cli.RunGlue ( CliGhostHooks cliGhostExterns cliGhostExterns_shim ) open CryptoVerification.SignalSession.Cli.Slots ( - cliGhostExterns_panic_handle_error cliGhostExterns_sat_of_cliExternsPlaced + cliGhostExterns_panic_handle_error ) open CryptoVerification.E2E.Record (pbBytes pbVarint) open CryptoVerification.E2E.Record.DeserializeSeed ( @@ -101,7 +100,6 @@ open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( finishGrowStackX framelessMemcpyBudgetSpec framelessMemcpy_hookOk noAllocShimBudgetSpec noAllocShim_hookOk ) -open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemmoveBudgetSpec) open LibsignalBinary.Proofs.SessionRecordAt.Stage1X.GrowOneXBudget ( GrowOne104Env growOne104Events growOne104SpecX growOneChainSpecX ) @@ -112,7 +110,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AllocFsA1Budget (CliAl open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( CliGhostAllocHooks bumpGhost cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat - cliExternsPlaced_realloc_budget_sat cliExternsPlaced_sessionMemmove_budget_sat + cliExternsPlaced_realloc_budget_sat ) open LibsignalBinary.Proofs.SignalSession.Cli.Store.SerGlueXCliPlacedBudget ( cliAllocHooks_to_bumpGhost @@ -1198,11 +1196,10 @@ theorem overPrevDecode_cro_placed_of_hooks [LibsignalPlacement] {M : AllocCostMo (hrealloc : HookSat ext lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hdealloc : HookSat ext lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmc : HookSat ext lsMemcpySym framelessMemcpyBudgetSpec) - (hmemmove : HookSat ext "memmove" (sessionMemmoveBudgetSpec extHookStack)) (hpanic_raw : ext lsHandleErrorSym = some Rust.panicked) : OverPrevDecodeCroPlacedAt A lim ext := overPrevDecode_cro_placed_of_hooks_chain5 - hshim halloc hrealloc hdealloc hmc hmemmove hpanic_raw + hshim halloc hrealloc hdealloc hmc hpanic_raw (chainMerge5CroPlacedOkExt_of_hooks hshim halloc hrealloc hdealloc hmc hpanic_raw) theorem overPrevDecode_cro_placed_cli [LibsignalPlacement] @@ -1218,8 +1215,6 @@ theorem overPrevDecode_cro_placed_cli [LibsignalPlacement] ((show lsRustDeallocSymCli = lsRustDeallocSym by decide) ▸ cliExternsPlaced_dealloc_budget_sat mmpl gh W hA) (cli_framelessMemcpy_sat mmpl gh W hA) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W extHookStack)) (cliGhostExterns_panic_handle_error mmpl gh W) theorem overPrevDecode_cro_placed_of_cliHooks [LibsignalPlacement] diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/PrevDec/ExactDecodePlacedBudget.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/PrevDec/ExactDecodePlacedBudget.lean index 96c3de08c..b2feb5f46 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/PrevDec/ExactDecodePlacedBudget.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/PrevDec/ExactDecodePlacedBudget.lean @@ -54,7 +54,6 @@ open CryptoVerification ( ) open CryptoVerification.RustHeap (RustAlloc arrayAt arrayAt_concat vecAt vecBuf vecHeader vecOf vecU8 vecU8At) open CryptoVerification.LibsignalTripleRatchetRepr (noneCap) -open CryptoVerification.LibsignalTripleRatchet (extHookStack) open CryptoVerification.LibsignalTripleRatchet.RawByteMove (chunks104_6QWAt) open CryptoVerification.LibsignalTripleRatchet.Prost (sliceCursorAfter sliceCursorAt) open CryptoVerification.LibsignalPublicApi.StoreKit ( @@ -104,7 +103,7 @@ open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( framelessMemcpyBudgetSpec noAllocShimBudgetSpec ) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget ( - sessionMemmoveBudgetSpec sessionShimBudgetSpec + sessionShimBudgetSpec ) open LibsignalBinary.Proofs.SessionRecordAt.Stage1X.GrowOneXBudget ( AllocContractsPlaced GrowOne104Env finishGrowStackX growOne104Events growOne104SpecX @@ -2011,7 +2010,7 @@ theorem b518x_overPrevDecode_exact_cro_placed_of_alloc_bm6w_chain5' (b518r3_armSender hChain5) (b518r3_armRecv hAlloc hChain5) -/-- Hook-discharged Block-`518` (`+0x1ee8..+0x2620`) exact-trace decode theorem from single-step allocator, `memcpy`, `memmove`, and panic hooks plus `b518x_ChainMerge5ExactCroPlacedOkExt'`. -/ +/-- Hook-discharged Block-`518` (`+0x1ee8..+0x2620`) exact-trace decode theorem from single-step allocator, `memcpy`, and panic hooks plus `b518x_ChainMerge5ExactCroPlacedOkExt'`. -/ theorem b518x_overPrevDecode_exact_cro_placed_of_hooks_chain5' [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : LibsignalHooks} @@ -2020,13 +2019,12 @@ theorem b518x_overPrevDecode_exact_cro_placed_of_hooks_chain5' (hrealloc : HookSat ext lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hdealloc : HookSat ext lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmc : HookSat ext lsMemcpySym framelessMemcpyBudgetSpec) - (hmemmove : HookSat ext "memmove" (sessionMemmoveBudgetSpec extHookStack)) (hpanic_raw : ext lsHandleErrorSym = some Rust.panicked) (hChain5 : b518x_ChainMerge5ExactCroPlacedOkExt' A lim ext) : b518x_OverPrevDecodeExactCroPlacedAt A lim ext := b518x_overPrevDecode_exact_cro_placed_of_alloc_bm6w_chain5' (AllocContractsPlaced.of_hooks halloc hdealloc hrealloc - (b518x_sessionShim_of_noAllocShim hshim) hmemmove) + (b518x_sessionShim_of_noAllocShim hshim)) (bytes_merge_6_placed_ok_w_cro (callerProg := lsProg_518 ext) hshim halloc hrealloc hdealloc hmc hpanic_raw) hChain5 @@ -2051,13 +2049,12 @@ theorem b518x_overPrevDecode_exact_cro_placed_of_hooks_chain5 (hrealloc : HookSat ext lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hdealloc : HookSat ext lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmc : HookSat ext lsMemcpySym framelessMemcpyBudgetSpec) - (hmemmove : HookSat ext "memmove" (sessionMemmoveBudgetSpec extHookStack)) (hpanic_raw : ext lsHandleErrorSym = some Rust.panicked) (hChain5 : b518x_ChainMerge5ExactCroPlacedOkExt A lim ext) : b518x_OverPrevDecodeExactCroPlacedAt A lim ext := b518x_overPrevDecode_exact_cro_placed_of_alloc_bm6w_chain5 (AllocContractsPlaced.of_hooks halloc hdealloc hrealloc - (b518x_sessionShim_of_noAllocShim hshim) hmemmove) + (b518x_sessionShim_of_noAllocShim hshim)) (bytes_merge_6_placed_ok_w_cro (callerProg := lsProg_518 ext) hshim halloc hrealloc hdealloc hmc hpanic_raw) hChain5 diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/PrevDec/TopPlacedBudget.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/PrevDec/TopPlacedBudget.lean index e8a9fe030..8c94df80c 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/PrevDec/TopPlacedBudget.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/PrevDec/TopPlacedBudget.lean @@ -44,7 +44,6 @@ open CryptoVerification ( lsHandleErrorSym lsMemcpySym lsRustAllocSym lsRustDeallocSym lsRustNoAllocShimSym lsRustReallocSym lsmpl withLsCl ) -open CryptoVerification.LibsignalTripleRatchet (extHookStack) open CryptoVerification.LibsignalTripleRatchet.Prost (sliceCursorAfter sliceCursorAt) open CryptoVerification.LibsignalPublicApi.StoreKit ( LibsignalCodeRoLoaded extract_withLsCodeRoLoaded withLsCodeRoLoaded @@ -91,7 +90,7 @@ open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( framelessMemcpyBudgetSpec noAllocShimBudgetSpec ) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget ( - sessionMemmoveBudgetSpec sessionShimBudgetSpec + sessionShimBudgetSpec ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.PrevDec.ArmChainRecvPushAPlacedBudget ( growOne_plain_post_elim_sp_q_ext growOne_plain_pre_eq_q_ext @@ -980,13 +979,12 @@ theorem overPrevDecode_cro_placed_of_hooks_chain5 [LibsignalPlacement] {M : Allo (hrealloc : HookSat ext lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hdealloc : HookSat ext lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmc : HookSat ext lsMemcpySym framelessMemcpyBudgetSpec) - (hmemmove : HookSat ext "memmove" (sessionMemmoveBudgetSpec extHookStack)) (hpanic_raw : ext lsHandleErrorSym = some Rust.panicked) (hChain5 : ChainMerge5CroPlacedOkExt A lim ext) : OverPrevDecodeCroPlacedAt A lim ext := overPrevDecode_cro_placed_of_alloc_bm6w_chain5 (AllocContractsPlaced.of_hooks halloc hdealloc hrealloc - (sessionShim_of_noAllocShim hshim) hmemmove) + (sessionShim_of_noAllocShim hshim)) (bytes_merge_6_placed_ok_w_cro (callerProg := lsProg_518 ext) hshim halloc hrealloc hdealloc hmc hpanic_raw) hChain5 diff --git a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/VerNe/TopPlacedBudget.lean b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/VerNe/TopPlacedBudget.lean index a256127a0..eab2429c3 100644 --- a/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/VerNe/TopPlacedBudget.lean +++ b/LibsignalBinary/Proofs/Cli/E2E/Pqxdh/ResponderClosure/VerNe/TopPlacedBudget.lean @@ -52,7 +52,7 @@ open CryptoVerification ( lsRustNoAllocShimSym lsRustReallocSym ls_hook_ok_ultra_of_mem lsmpl lsρ withLsCodeLoaded ) open CryptoVerification.RustHeap (allocHookStack) -open CryptoVerification.LibsignalTripleRatchet (extHookStack recordResultAt rootStack) +open CryptoVerification.LibsignalTripleRatchet (recordResultAt rootStack) open CryptoVerification.LibsignalTripleRatchetRepr (SessionGhost sessionStateAt) open CryptoVerification.LibsignalTripleRatchet.FromRecordCallees (growOneSpeStack) open CryptoVerification.LibsignalPublicApi.StoreKit (LibsignalCodeRoLoaded) @@ -76,7 +76,7 @@ open LibsignalBinary.Proofs.TripleRatchet.FromRecordCallees.DefsBudget ( dropSessionStructureLocal2Spec growOneSpeSpec ) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget ( - sessionMemcpyBudgetSpec sessionMemmoveBudgetSpec + sessionMemcpyBudgetSpec ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.PrevDec.LoopDefsBudget ( OverPrevDecodeCroPlacedAt OverPrevDecodeEnv overPrevElemAtBudget @@ -778,7 +778,7 @@ theorem overVerNe_1e04_cro_placed_of_alloc_bm6w_chain5 [LibsignalPlacement] hx9_1 hx19_1 hx24_1 hx27_1 hx29_1 /-- Hook-discharged `LibsignalCodeRoLoaded`-threaded Stage P3/P4 `VerNe` at -`(blkPl_518).base + 0x1e04` on `lsProg_518 ext` from single-step allocator/`memcpy`/`memmove`/panic +`(blkPl_518).base + 0x1e04` on `lsProg_518 ext` from single-step allocator/`memcpy`/panic hooks and `ChainMerge5CroPlacedOkExt` at Block `516`. -/ theorem overVerNe_1e04_cro_placed_of_hooks_chain5 [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -795,7 +795,6 @@ theorem overVerNe_1e04_cro_placed_of_hooks_chain5 [LibsignalPlacement] (hrealloc_sat : HookSat ext lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hdealloc_sat : HookSat ext lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmc_sat : HookSat ext lsMemcpySym framelessMemcpyBudgetSpec) - (hmemmove_sat : HookSat ext "memmove" (sessionMemmoveBudgetSpec extHookStack)) (hpanic_raw : ext lsHandleErrorSym = some Rust.panicked) (hChain5 : ChainMerge5CroPlacedOkExt A lim ext) (st_init : M.σ) (s0 s s1 : State) @@ -852,7 +851,7 @@ theorem overVerNe_1e04_cro_placed_of_hooks_chain5 [LibsignalPlacement] (hookSat_verNeMemcpy_of_frameless allocHookStack hmc_sat)) (overPrevDecode_cro_placed_of_hooks_chain5 (hookSat_noAllocShimBudget_of_rustAllocShimVm hshim_sat) - halloc_sat hrealloc_sat hdealloc_sat hmc_sat hmemmove_sat hpanic_raw hChain5) + halloc_sat hrealloc_sat hdealloc_sat hmc_sat hpanic_raw hChain5) st_init s0 s s1 coroPtr ctxPtr outPtr initErrsPtr prevCap prevPtr ud0 hinit_ne hcap msgVer hver_ne b_2c0 enc hEnc hfits G₁ recG st hver4 hsp_root hcro1 hpc1 hrun1 hs1_sp hsp_align htr1 @@ -1520,7 +1519,6 @@ theorem overVerNe_1e04_frozen_placed_of_hooks_chain5 [CryptoVerification.Libsign (hrealloc_sat : HookSat ext lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hdealloc_sat : HookSat ext lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmc_sat : HookSat ext lsMemcpySym framelessMemcpyBudgetSpec) - (hmemmove_sat : HookSat ext "memmove" (sessionMemmoveBudgetSpec extHookStack)) (hpanic_raw : ext lsHandleErrorSym = some Rust.panicked) (hChain5 : ChainMerge5CroPlacedOkExt A lim ext) (st_init : M.σ) (s0 s s1 : State) @@ -1577,7 +1575,7 @@ theorem overVerNe_1e04_frozen_placed_of_hooks_chain5 [CryptoVerification.Libsign (hookSat_verNeMemcpy_of_frameless allocHookStack hmc_sat)) (overPrevDecode_cro_placed_of_hooks_chain5 (hookSat_noAllocShimBudget_of_rustAllocShimVm hshim_sat) - halloc_sat hrealloc_sat hdealloc_sat hmc_sat hmemmove_sat hpanic_raw hChain5) + halloc_sat hrealloc_sat hdealloc_sat hmc_sat hpanic_raw hChain5) st_init s0 s s1 coroPtr ctxPtr outPtr initErrsPtr prevCap prevPtr ud0 hinit_ne hcap msgVer hver_ne b_2c0 enc hEnc hfits G₁ recG st hver4 hsp_root hfr1 hpc1 hrun1 hs1_sp hsp_align htr1 diff --git a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlaced.lean b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlaced.lean index 9159f42b0..9b9ee010e 100644 --- a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlaced.lean +++ b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlaced.lean @@ -41,6 +41,9 @@ public import LibsignalBinary.Proofs.TripleRatchet.Mac.Verify import all Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Proofs.ConsumeMessageKey.AssemblySat +import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexSat +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedSat +import LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedSat import LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.NewFromSliceSat import LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.Transfer import LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhStepBlocks @@ -51,6 +54,7 @@ import LibsignalBinary.Proofs.TripleRatchet.Getters.Drops.SignalProtocolError.Ex import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat import LibsignalBinary.Proofs.TripleRatchet.Hkdf.ExpandSat import LibsignalBinary.Proofs.TripleRatchet.Hkdf.ExtractSat +import LibsignalBinary.Proofs.TripleRatchet.Mac.VerifySat /-! # Relocatable Segment 3 (`DhStep`) and Block `433` Callee Seams @@ -97,11 +101,44 @@ private theorem cliGhostExterns_row_placed (mmpl : Obj.MultiPlacement) (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W) sym = some f := - (RunGlue.cliGhostExterns_other gh _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans + (RunGlue.cliGhostExterns_other gh _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans (RunGlue.cliExternsPlaced_row mmpl W hrow) +private theorem cliGhostExterns_blackBoxSat_a0_sat [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) + (hOk : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.ExtraSpecOk gh) : + HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) + CryptoVerification.lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat := + LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.hookSat_cliGhostExterns_of_extraOk + gh (cliExternsPlaced mmpl W) hOk + (fun _ _ hr => hr.blackBox_budget_ok (by decide) (by decide)) + +private theorem find_receiver_chain_index_placed_ok_at_cmk_sat [LibsignalPlacement] + {H : String → Option (State → State)} (A : RustAlloc) + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : + CryptoVerification.LibsignalSession.FindIndexPlacedOk H A := by + refine subroutine_ok_outcome_intro fun ⟨p, cs, theirA, their⟩ R s0 hpc hrun hpre hsp => ?_ + have h1 : subroutine_ok ((blkPC_24).rebase (blkPl_24).base H) (lsmpl.base 26) + (withLsCodeLoaded lsmpl + (CryptoVerification.LibsignalSession.FindReceiverChainIndex.findPlacedSpec A)) := + ls_subroutine_ok_of_block (i := 24) (j := 26) + (LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexSat.find_receiver_chain_index_placed_ok_sat + A h_bb) + refine h1.mono_outcome (p, cs, theirA, their) R s0 hpc hrun ?_ hsp fun _ hout => hout + have ⟨hcl, hp⟩ := extract_withLsCodeLoaded hpre + dsimp only [withLsCodeLoaded] + rw [sepConj_assoc, sepConj_left_comm, satisfies_pure_sepConj] + refine ⟨hcl, ?_⟩ + dsimp only [CryptoVerification.LibsignalSession.FindReceiverChainIndex.findPlacedSpec, + CryptoVerification.LibsignalSession.findIndexPlacedSpec] at hp ⊢ + rw [sepConj_assoc, satisfies_pure_sepConj] at hp ⊢ + exact ⟨⟨hp.1.1, hp.1.2.1, hp.1.2.2.1, hp.1.2.2.2, hsp⟩, hp.2⟩ + /-- `ErrTailTightSeamPlaced` on Block `433` at `RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)`. -/ theorem errTail_433_cli [LibsignalPlacement] @@ -155,6 +192,7 @@ theorem aesDecrypt_433_cli [LibsignalPlacement] /-- `S0PSeamPlaced` on Block `433` at `RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)`. -/ theorem s0_433_cli [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) + (hOk : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.ExtraSpecOk gh) (ctl : BitVec 64) (S : SpqrModel) : S0PSeamPlaced ((blkPC_434).rebase (blkPl_434).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) @@ -174,11 +212,11 @@ theorem s0_433_cli [LibsignalPlacement] rw [sepConj_assoc, satisfies_pure_sepConj] at hq exact hq.2 exact CryptoVerification.Cli.LibsignalTripleRatchet.Decrypt.ChainLookup.s0_433_placed_ok_P - (CryptoVerification.E2E.Pqxdh.WireEntries.isSameAccountEqDistinct_placed_ok_at + (LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedSat.isSameAccountEqDistinct_placed_ok_at_sat E2E.HooksE.A0 (callerProg := (blkPC_434).rebase (blkPl_434).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) - (cliGhostExterns_row_placed mmpl gh W (Slots.blackBox_row_placed mmpl W)) + (cliGhostExterns_blackBoxSat_a0_sat mmpl gh W hOk) huuid (by decide)) private theorem sub_ok_same_blk [LibsignalPlacement] {α : Type} @@ -210,13 +248,16 @@ theorem s1_433_cli [LibsignalPlacement] /-- `S2SeamPlaced` on Block `433` at `RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)`. -/ theorem s2_433_cli [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) + (hOk : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.ExtraSpecOk gh) (ctl : BitVec 64) : S2SeamPlaced ((blkPC_434).rebase (blkPl_434).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) (blkPl_434).base E2E.HooksE.A0 ctl := CryptoVerification.Cli.LibsignalTripleRatchet.Decrypt.ChainLookup.findChain_433_placed_ok - (find_receiver_chain_key_placed_ok - (cliGhostExterns_row_placed mmpl gh W (Slots.blackBox_row_placed mmpl W))) + (find_receiver_chain_key_placed_ok_of_find_index + (ls_subroutine_ok_of_block + (LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexSat.find_receiver_chain_index_placed_ok_sat + E2E.HooksE.A0 (cliGhostExterns_blackBoxSat_a0_sat mmpl gh W hOk)))) private theorem new_from_slice_cro_of_cl_ro [LibsignalPlacement] {prog : Program} {F : ShaState → List (BitVec 8) → ShaState} @@ -358,24 +399,17 @@ private theorem createChain_433_cro_ok [LibsignalPlacement] have _ : LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat.HkdfPlacedHooksExactSat W.C.F (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) := LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat.HkdfPlacedHooksExactSat.of_a0Hooks hG - have hct207 := ls_subroutine_ok_of_block - (callerProg := (blkPC_207).rebase (blkPl_207).base - (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) - (ConsumeMessageKeyTransfer.ct_eq_ro_mem_placed_ok_withLsCodeLoaded - (cliGhostExterns_row_placed mmpl gh W (Slots.blackBox_row_placed mmpl W))) have hag40 := keys_ls_subroutine_ok_of_block_cro (callerProg := (blkPC_40).rebase (blkPl_40).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) - (CryptoVerification.LibsignalTripleRatchet.Keys.calculateAgreement_placed_ok' + (LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedSat.calculateAgreement_placed_ok_unconditional_sat (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W (Slots.cliExternsPlaced_diffieHellman_sat mmpl W)) - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_sharedSecretDrop_sat mmpl W)) - hct207 + (Slots.cliGhostExterns_sharedSecretDrop_sat gh (cliExternsPlaced mmpl W) hG.extraOk) + (cliGhostExterns_blackBoxSat_a0_sat mmpl gh W hG.extraOk) (Slots.cliExternsPlaced_noAllocShim_sat mmpl gh W hG.shim_eq) (Slots.cliExternsPlaced_alloc_sat mmpl gh W hG) - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_staticSecretDrop_sat mmpl W)) + (Slots.cliGhostExterns_staticSecretDrop_sat gh (cliExternsPlaced mmpl W) hG.extraOk) (Slots.cliGhostExterns_panic_handle_alloc_error mmpl gh W)) have hext40 := keys_ls_subroutine_ok_of_block_cro (callerProg := (blkPC_40).rebase (blkPl_40).base @@ -1160,7 +1194,9 @@ private theorem growOne_433_cl_ok [LibsignalPlacement] /-- `S3TightSeamPlaced` on Block `433` at `RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)`. -/ theorem dhStep_433_cli [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) - (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (ctl : BitVec 64) (S : SpqrModel) : + (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) + (ctl : BitVec 64) (S : SpqrModel) : S3TightSeamPlaced ((blkPC_434).rebase (blkPl_434).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsmpl.base 434) W.C E2E.HooksE.A0 ctl uuidTryParse S := by @@ -1177,8 +1213,7 @@ theorem dhStep_433_cli [LibsignalPlacement] (Slots.cliCoinsFillAtPlaced_ok_cl mmpl gh W hG cur rest tryDecryptSubStack (by decide) (by decide))) (keys_ls_hook_ok_of_mem - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_staticSecretDrop_sat mmpl W))) + (Slots.cliGhostExterns_staticSecretDrop_sat gh (cliExternsPlaced mmpl W) hG.extraOk)) (s3_commit_433_placed_ok (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) W.C E2E.HooksE.A0 ctl P3kR1bd.spqrNoPanic (ConsumeMessageKeyTransfer.ls_subroutine_ok_transfer_of_plain @@ -1193,8 +1228,8 @@ theorem dhStep_433_cli [LibsignalPlacement] (keys_ls_hook_ok_of_mem (Slots.cliExternsPlaced_dealloc_sat mmpl gh W hG)) (keys_ls_hook_ok_of_mem (Slots.cliExternsPlaced_framelessMemcpy_sat mmpl gh W hG)) (keys_ls_hook_ok_of_mem - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_sessionMemmove_sat mmpl W dropChainStack))) + ⟨hookMemmove, RunGlue.cliGhostExterns_extra_some gh (cliExternsPlaced mmpl W) hMv, + CryptoVerification.LibsignalTripleRatchet.hookMemmove_trace_ok dropChainStack⟩) ((cmk_externAt?_of_mem (prog := (blkPC_434).rebase (blkPl_434).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) @@ -1204,7 +1239,9 @@ theorem dhStep_433_cli [LibsignalPlacement] /-- `S4SeamPlaced` on Block `433` at `RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)`. -/ theorem s4_433_cli [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) - (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (ctl : BitVec 64) (S : SpqrModel) : + (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) + (ctl : BitVec 64) (S : SpqrModel) : S4SeamPlaced ((blkPC_434).rebase (blkPl_434).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) (blkPl_434).base W.C E2E.HooksE.A0 ctl uuidTryParse S := by @@ -1225,16 +1262,22 @@ theorem s4_433_cli [LibsignalPlacement] Slots.cliGhostExterns_panic_handle_error mmpl gh W, Slots.cliGhostExterns_panic_option_expect_failed mmpl gh W, RunGlue.cliGhostExterns_panic_of_mem mmpl gh W (by decide)⟩ - have hcmk24 := LibsignalBinary.Proofs.ConsumeMessageKey.AssemblySat.consume_message_key_placed_ro_run_sat + have hcmk24 := CryptoVerification.LibsignalSession.consume_message_key_placed_ro_run_of W.C.F E2E.HooksE.A0 (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) - (cliGhostExterns_row_placed mmpl gh W (Slots.blackBox_row_placed mmpl W)) - ((RunGlue.cliGhostExterns_shim gh _).trans (congrArg some hG.shim_eq)) - (Slots.cliExternsPlaced_realloc_sat mmpl gh W hG) - hEx.memcpy - (Slots.cliExternsPlaced_sessionMemsetRegion_sat mmpl gh W hG) - hEx.compress256 + (find_receiver_chain_index_placed_ok_at_cmk_sat + E2E.HooksE.A0 (cliGhostExterns_blackBoxSat_a0_sat mmpl gh W hG.extraOk)) + (LibsignalBinary.Proofs.ConsumeMessageKey.AssemblySat.hmac_sha256_placed_ro_ok_at_cmk_sat + W.C.F + hEx.memcpy + (Slots.cliExternsPlaced_sessionMemsetRegion_sat mmpl gh W hG) + hEx.compress256) + (CryptoVerification.LibsignalSession.grow_one_placed_ok_at_cmk + E2E.HooksE.A0 + ((RunGlue.cliGhostExterns_shim gh _).trans (congrArg some hG.shim_eq)) + (Slots.cliExternsPlaced_realloc_sat mmpl gh W hG) + hA_cmk) hA_cmk - (cliGhostExterns_row_placed mmpl gh W (Slots.memmove_row_placed mmpl W)) + (RunGlue.cliGhostExterns_extra_some gh (cliExternsPlaced mmpl W) hMv) have hcmk24_cro : subroutine_ok ((blkPC_24).rebase (blkPl_24).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) (blkPl_24).base @@ -1295,12 +1338,10 @@ theorem s7_433_cli [LibsignalPlacement] (callerProg := (blkPC_60).rebase (blkPl_60).base (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) (subroutine_ok_withLsCodeLoaded_of_plain (pl := lsmpl) (pkSer_205_ok mmpl gh W hG))) - have hvmac62 := verifyMacWithAddresses_placed_cro_ok W.C E2E.HooksE.A0 uuidTryParse + have hvmac62 := LibsignalBinary.Proofs.TripleRatchet.Mac.VerifySat.verifyMacWithAddresses_placed_cro_ok_sat W.C E2E.HooksE.A0 uuidTryParse (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) (parseSid_61_ok mmpl gh W) (new_from_slice_60_cro_ok mmpl gh W hG) hpk60 - (keys_ls_hook_ok_of_mem - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_blackBox_sat mmpl W))) + (cliGhostExterns_blackBoxSat_a0_sat mmpl gh W hG.extraOk) (Slots.cliExternsPlaced_noAllocShim_sat mmpl gh W hG.shim_eq) (Slots.cliExternsPlaced_alloc_sat mmpl gh W hG) (Slots.cliExternsPlaced_dealloc_sat mmpl gh W hG) diff --git a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudget.lean b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudget.lean index 8990c0148..c27cd50da 100644 --- a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudget.lean +++ b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudget.lean @@ -25,10 +25,13 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Heap.Fine.SpecBudgetHelpersFine +import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexBudgetSat import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudgetSat import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove +import LibsignalBinary.Proofs.TripleRatchet.ChainKey.FindReceiverChainKeyBudget import LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.InstancesBudgetSat +import LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.Transfer import LibsignalBinary.Proofs.TripleRatchet.Getters.ClearUnacknowledgedPreKeyMessageBudget import LibsignalBinary.Proofs.TripleRatchet.Getters.Drops.Chain.VecExtBudget import LibsignalBinary.Proofs.TripleRatchet.Getters.Drops.SignalProtocolError.ExtBudget @@ -84,9 +87,9 @@ open CryptoVerification.SignalSession.Cli.RunGlue ( cliGhostExterns_shim ) open CryptoVerification.SignalSession.Cli.Slots ( - aesDec_row_placed blackBox_row_placed cliGhostExterns_panic_all + aesDec_row_placed cliGhostExterns_panic_all cliGhostExterns_sat_of_cliExternsPlaced compress256_row_placed fmtWrite_row_placed - formatInner_row_placed memmove_row_placed + formatInner_row_placed ) open CryptoVerification.SpqrV1.GF.Mul2U16 (tokenInitPlacedAt) open CryptoVerification.SpqrV1.Top.InitialState (InitialStateGhost) @@ -110,8 +113,9 @@ open LibsignalBinary.Proofs.Cli.SpqrV1.M4.SpqrRecvTrapV1PlacedBudget ( ) open LibsignalBinary.Proofs.Cli.SpqrV1.M4.VerifyMacTrapPlacedBudget (s7Env) open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.ChainLookupPlacedBudget ( - findChain_433_placed_ok_of_bb + findChain_433_placed_ok ) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (ExtraSpecOk) open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.ChainLookupS1ErrPlacedBudget ( S1TightSeamFreePlaced S1TightSeamPinnedFreePlaced errTail_433_placed_okT loadRatchet_433_placed_okT loadRatchet_pinned_433_placed_okT @@ -129,14 +133,12 @@ open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudgetSat open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat ( extract_placed_vm_ok_of_other_block_sat ) -open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove ( - hookSat_sessionMemmoveBoundedBudget_of_unbounded -) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_framelessMemcpy_budget_sat cliExternsPlaced_realloc_budget_sat - cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemmove_budget_sat - cliExternsPlaced_sessionMemsetRegion_budget_sat cliExternsPlaced_shim_budget_sat + cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat + cliExternsPlaced_shim_budget_sat cliGhostExterns_blackBoxSat_budget_sat + cliGhostExterns_sessionMemmove_budget_sat ) open LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget ( SpqrRecvBytesEnv SpqrV1PlacedSeams SpqrV1PlacedSeamsOfEnv @@ -144,9 +146,101 @@ open LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget ( open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( framelessMemcpyBudgetSpec noAllocShim_hookOk ) -open LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.InstancesBudgetSat ( - cmk_raw_placed_cro_ok_at_block_sat -) + +section CmkBbSat + +open SepProp +open CryptoGames.LibsignalSession (ShaCompress) +open CryptoVerification (LibsignalCodeLoaded blkPC_24 blkPl_24 extract_withLsCodeLoaded lsBlackBoxU8Sym lsRustReallocSym withLsCodeLoaded) +open CryptoVerification.LibsignalTripleRatchet (extract_withLsCodeRoLoaded withLsCodeRoLoaded) +open CryptoVerification.LibsignalTripleRatchet.ConsumeMessageKeyTransfer (ls_subroutine_ok_transfer_of_plain) +open LibsignalBinary.Heap (rustCliReallocBudgetSpec) +open LibsignalBinary.Proofs.ConsumeMessageKey.AdvanceEpilogueProofs.FetchBudget (CmkEnv cmkPlacedSpec) +open LibsignalBinary.Proofs.ConsumeMessageKey.AssemblyBudgetSat (grow_one_placed_ok_at_cmk_sat hmac_sha256_placed_ro_ok_at_cmk_sat) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexBudgetSat (find_receiver_chain_index_placed_ok_at_cmk_sat) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat (blackBoxSpecSat) +open LibsignalBinary.Proofs.ConsumeMessageKey.RunOfCalleesBudget (cmkPlacedRoSpec) +open LibsignalBinary.Proofs.ConsumeMessageKey.RunOfCalleesBudgetSat (consume_message_key_placed_ro_run_of_sat) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedBudgetSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore (HookSatExactMemcpy) +open LibsignalBinary.Proofs.TripleRatchet.Decrypt.ConsumeMsgKeyBudget (cmkRawSpecPlaced) +open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemsetRegionBudgetSpec) + +attribute [local irreducible] + CryptoVerification.LibsignalSession.cmkDummyImg + CryptoVerification.LibsignalTripleRatchet.Decrypt.tryDecryptPlacedImg + +private theorem cmkPlacedSpec_pre_eq_raw [LibsignalPlacement] (F : ShaCompress) + (A' : CryptoVerification.RustHeap.RustAlloc) + (x : CryptoVerification.LibsignalSession.ConsumeMessageKeyGhost) (s : State) : + (CryptoVerification.LibsignalSession.cmkPlacedSpec F A').pre x s = + (CryptoVerification.LibsignalTripleRatchet.Decrypt.KeyDerive.cmkRawSpecPlaced F A').pre x s ∗ + ⌜LibsignalCodeLoaded lsmpl s.mem⌝ := by + dsimp only [CryptoVerification.LibsignalSession.cmkPlacedSpec, + CryptoVerification.LibsignalTripleRatchet.Decrypt.KeyDerive.cmkRawSpecPlaced, + withLsCodeLoaded] + rw [CryptoVerification.LibsignalTripleRatchet.Decrypt.logOff_tryDecryptPlacedImg] + +private theorem cmkPlacedSpec_post_eq_raw [LibsignalPlacement] (F : ShaCompress) + (A' : CryptoVerification.RustHeap.RustAlloc) + (x : CryptoVerification.LibsignalSession.ConsumeMessageKeyGhost) (s0 sf : State) : + (CryptoVerification.LibsignalSession.cmkPlacedSpec F A').post x s0 sf = + (CryptoVerification.LibsignalTripleRatchet.Decrypt.KeyDerive.cmkRawSpecPlaced + F A').post x s0 sf := by + dsimp only [CryptoVerification.LibsignalSession.cmkPlacedSpec, + CryptoVerification.LibsignalTripleRatchet.Decrypt.KeyDerive.cmkRawSpecPlaced, + withLsCodeLoaded] + rw [CryptoVerification.LibsignalTripleRatchet.Decrypt.logOff_tryDecryptPlacedImg] + +private theorem cmk_raw_placed_cro_ok_at_block_bb_sat [LibsignalPlacement] + {callerProg : Program} {i : Nat} {M : AllocCostModel} + (F : ShaCompress) (A : RustCliAllocBudget M) (lim : BudgetLimits) + {H : String → Option (State → State)} [IsLsBlockProg callerProg i H] + (hA : CmkAllocHooks A lim H) + (hmm : HookSat H "memmove" (sessionMemmoveBoundedBudgetSpec 4096)) + (h_bb : HookSat H lsBlackBoxU8Sym blackBoxSpecSat) + (h_realloc : HookSat H lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) + (h_mc : HookSatExactMemcpy H CryptoVerification.LibsignalSession.CryptoHmacSha256.lsMemcpySym) + (h_ms : HookSat H CryptoVerification.LibsignalSession.CryptoHmacSha256.lsMemsetSym + sessionMemsetRegionBudgetSpec) + (h_c256 : H CryptoVerification.LibsignalSession.CryptoHmacSha256.lsCompress256Sym = + some (CryptoVerification.LibsignalHmac.compress256Hook F)) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 24) + (withLsCodeRoLoaded lsmpl (cmkRawSpecPlaced F A lim CmkEnv)) := by + have hcmk0 : subroutine_ok ((blkPC_24).rebase (blkPl_24).base H) (blkPl_24).base + (cmkPlacedRoSpec F A lim) := + consume_message_key_placed_ro_run_of_sat F A lim H + (find_receiver_chain_index_placed_ok_at_cmk_sat A h_bb) + (hmac_sha256_placed_ro_ok_at_cmk_sat F h_mc h_ms h_c256) + (grow_one_placed_ok_at_cmk_sat hA h_realloc) hA hmm + have htr : subroutine_ok callerProg (lsmpl.base 24) + (withLsCodeLoaded lsmpl (cmkPlacedRoSpec F A lim)) := + ls_subroutine_ok_transfer_of_plain hcmk0 hi + refine subroutine_ok_outcome_intro fun ⟨x, st_init⟩ R s0 hpc hrun hpre hsp => ?_ + have ⟨⟨hcl, hro⟩, hp⟩ := extract_withLsCodeRoLoaded hpre + refine htr.mono_outcome (x, st_init) R s0 hpc hrun ?_ hsp fun sf hout => ?_ + · dsimp only [cmkRawSpecPlaced] at hp + rw [sepConj_assoc, satisfies_pure_sepConj] at hp + dsimp only [withLsCodeLoaded, cmkPlacedRoSpec, cmkPlacedSpec] + rw [sepConj_assoc, sepConj_left_comm, satisfies_pure_sepConj] + refine ⟨hcl, ?_⟩ + rw [cmkPlacedSpec_pre_eq_raw, sepConj_assoc, sepConj_assoc, satisfies_pure_sepConj] + refine ⟨hp.1, ?_⟩ + rw [sepConj_assoc, sepConj_left_comm, satisfies_pure_sepConj] + refine ⟨hcl, ?_⟩ + rw [sepConj_left_comm, satisfies_pure_sepConj] + exact ⟨hro, hp.2⟩ + · rcases hout with ⟨hret, hcc, hq⟩ | ⟨hpan, hq⟩ | ⟨code, hex, hq⟩ | ⟨hoom, hq⟩ + · refine Or.inl ⟨hret, hcc, ?_⟩ + dsimp only [cmkPlacedRoSpec, cmkPlacedSpec, cmkRawSpecPlaced, withLsCodeRoLoaded] at hq ⊢ + simp only [cmkPlacedSpec_post_eq_raw] at hq + exact hq + · exact Or.inr (Or.inl ⟨hpan, hq⟩) + · exact Or.inr (Or.inr (Or.inl ⟨code, hex, hq⟩)) + · exact Or.inr (Or.inr (Or.inr ⟨hoom, hq⟩)) + +end CmkBbSat open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DeriveKeysBudget (s6FreeOnlyEnv) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhStepBudgetCore (s3DefaultEnv) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.PqRecvBudgetDefs (PqRecvEnv) @@ -193,9 +287,10 @@ private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans (cliExternsPlaced_row mmpl W hrow) private theorem trFrom_57_cli_ok [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -301,12 +396,13 @@ theorem aesDecrypt_433_cli [LibsignalPlacement] {M : AllocCostModel} theorem s0_433_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) + (hOk : ExtraSpecOk g) (ctl : BitVec 64) (S : SpqrModel) (tdEnv : TryDecryptEnvArgs → List AllocEvent → Prop) : S0PSeamPlaced ((blkPC_434).rebase (blkPl_434).base (cliGhostExterns g (cliExternsPlaced mmpl W))) (blkPl_434).base W.C A lim ctl uuidTryParse S tdEnv := - DecryptFrontTrapPlacedBudgetPart2.s0_433_cli mmpl g W ctl S tdEnv + DecryptFrontTrapPlacedBudgetPart2.s0_433_cli mmpl g W hOk ctl S tdEnv /-- Pinned `S1TightSeamPinnedFreePlaced` on Block `433` at `cliGhostExterns g (cliExternsPlaced mmpl W)`. -/ theorem s1_pinned_433_cli [LibsignalPlacement] {M : AllocCostModel} @@ -333,11 +429,16 @@ theorem s1_433_cli [LibsignalPlacement] {M : AllocCostModel} /-- `S2SeamPlaced` on Block `433` at `cliGhostExterns g (cliExternsPlaced mmpl W)`. -/ theorem s2_433_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} - (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) (ctl : BitVec 64) : + (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) + (hOk : ExtraSpecOk g) (ctl : BitVec 64) : S2SeamPlaced ((blkPC_434).rebase (blkPl_434).base (cliGhostExterns g (cliExternsPlaced mmpl W))) (blkPl_434).base A lim ctl := - findChain_433_placed_ok_of_bb (cliGhost_row mmpl g W (blackBox_row_placed mmpl W)) + findChain_433_placed_ok + (LibsignalBinary.Proofs.TripleRatchet.ChainKey.FindReceiverChainKeyBudget.find_receiver_chain_key_placed_ok_of_find_index + (CryptoVerification.ls_subroutine_ok_of_block (i := 25) (j := 26) + (LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexBudgetSat.find_receiver_chain_index_placed_ok_sat A + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hOk)))) /-- `S6SeamPlaced` on Block `433` at `cliGhostExterns g (cliExternsPlaced mmpl W)`. -/ theorem s6_433_cli [LibsignalPlacement] {M : AllocCostModel} @@ -452,13 +553,11 @@ theorem s4_433_cli_ofEnv [LibsignalPlacement] {M : AllocCostModel} (subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded (ls_subroutine_ok_of_block (callerProg := (blkPC_434).rebase (blkPl_434).base H) h215)) - (cmk_raw_placed_cro_ok_at_block_sat + (cmk_raw_placed_cro_ok_at_block_bb_sat (callerProg := (blkPC_434).rebase (blkPl_434).base H) W.C.F A lim hA_cmk - (hookSat_sessionMemmoveBoundedBudget_of_unbounded 4096 - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W 4096))) - (cliGhost_row mmpl g W (blackBox_row_placed mmpl W)) + (cliGhostExterns_sessionMemmove_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk 4096) + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) (cliExternsPlaced_realloc_budget_sat mmpl g W hG) hEx.memcpy (cliExternsPlaced_sessionMemsetRegion_budget_sat mmpl g W hG) diff --git a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart2.lean b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart2.lean index ee9fd66a1..d6a4da6f8 100644 --- a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart2.lean +++ b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart2.lean @@ -13,6 +13,7 @@ public import LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.ChainLookupS0Plac public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedBudgetSat import LibsignalBinary.Proofs.Placed.BudgetPoolSync import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.UuidFsPlaced import ProofLib.Placed.OpcodeExclusion @@ -36,18 +37,20 @@ open CryptoVerification (IsLsBlockProg LibsignalCodeLoaded LibsignalHooks Libsig blkPC_252 blkPl_252 extract_withLsCodeLoaded libsignalMutatedBlocks libsignalSessionLib lsmpl withLsCodeLoaded) open CryptoVerification.LibsignalTripleRatchet (SpqrModel uuidTryParseCodeSpec) -open CryptoVerification.LibsignalTripleRatchet.Decrypt (blkPC_434 blkPl_434) +open CryptoVerification.LibsignalTripleRatchet.Decrypt (blkPC_434 blkPl_434 instIsLsBlockProg_434) open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) open CryptoVerification.SignalSession (CliHooks cliExternsPlaced) open CryptoVerification.SignalSession.Cli.MainHops.UuidFs (uuidTryParse_placed_okFs_F) -open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other) -open CryptoVerification.SignalSession.Cli.Slots (blackBox_row_placed) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits RustCliAllocBudget VmPreserved) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.ChainLookupS0PlacedBudget ( - s0_433_placed_ok_P_of_callees) + s0_433_placed_ok_P) open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DefsPlacedBudget (S0PSeamPlaced) open LibsignalBinary.Proofs.Placed.BudgetPoolSync (hooksException) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( + cliGhostExterns_blackBoxSat_budget_sat) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (ExtraSpecOk) open LibsignalBinary.Proofs.TripleRatchet.Record.DefsBudget (TryDecryptEnvArgs) private theorem allBlocks_patchSafe : @@ -297,15 +300,19 @@ private theorem uuidTryParse_placed_vm_ok [LibsignalPlacement] (H : LibsignalHoo theorem s0_433_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) + (hOk : ExtraSpecOk g) (ctl : BitVec 64) (S : SpqrModel) (tdEnv : TryDecryptEnvArgs → List AllocEvent → Prop) : S0PSeamPlaced ((blkPC_434).rebase (blkPl_434).base (cliGhostExterns g (cliExternsPlaced mmpl W))) - (blkPl_434).base W.C A lim ctl uuidTryParse S tdEnv := - s0_433_placed_ok_P_of_callees - ((cliGhostExterns_other g _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W))) - (uuidTryParse_placed_vm_ok (cliGhostExterns g (cliExternsPlaced mmpl W))) + (blkPl_434).base W.C A lim ctl uuidTryParse S tdEnv := by + have _ := instIsLsBlockProg_434 (cliGhostExterns g (cliExternsPlaced mmpl W)) + exact s0_433_placed_ok_P + (LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedBudgetSat.isSameAccountEqDistinct_placed_ok_at_sat + A.repAlloc + (callerProg := (blkPC_434).rebase (blkPl_434).base (cliGhostExterns g (cliExternsPlaced mmpl W))) + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hOk) + (uuidTryParse_placed_vm_ok (cliGhostExterns g (cliExternsPlaced mmpl W))) + (by decide)) end LibsignalBinary.Proofs.Cli.SpqrV1.M4.DecryptFrontTrapPlacedBudgetPart2 diff --git a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart3.lean b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart3.lean index 78c2472b7..372fd5587 100644 --- a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart3.lean +++ b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart3.lean @@ -27,7 +27,7 @@ import LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.InstancesB import LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.NewFromSlice import LibsignalBinary.Proofs.TripleRatchet.InImage.UuidTryParse.ParserTryParse import LibsignalBinary.Proofs.TripleRatchet.InImageCallees.CallsBudget -import LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudget +import LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudgetSat import ProofLib.SepLogic.Entry import ProofLib.SepLogic.WP.Apply /-! @@ -68,7 +68,7 @@ open LibsignalBinary.Heap.SpecBudget (withVmPreserved) open LibsignalBinary.Proofs.Cli.SpqrV1.M4.VerifyMacTrapPlacedBudget (s7Env verifyMac_433_placed_ok) open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DefsPlacedBudget (S7SeamPlaced) open LibsignalBinary.Proofs.ConsumeMessageKey.AssemblyBudgetAux (hmacExcHooks hmacExcHooks_compress hmacExcHooks_memcpy runsTo_block_lift_vm stripExecOutside_readBytes stripExecOutside_readable stripExecOutside_rw unstrip_frame) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_blackBox_budget_sat cliExternsPlaced_compress256Multi_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_exactMemcpy_sat cliExternsPlaced_noAllocShim_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat cliExternsPlaced_shim_budget_sat) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_compress256Multi_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_exactMemcpy_sat cliExternsPlaced_noAllocShim_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat cliExternsPlaced_shim_budget_sat cliGhostExterns_blackBoxSat_budget_sat) open LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.InstancesBudgetSat (new_from_slice_placed_cro_budget_ok_at_block_sat) open LibsignalBinary.Proofs.SpqrV1.Poly.EncodeBytes.DefsBudget (checkBlockSafeVm isTotalTrapHooks_vmTrapHooks sepWP_lsBlock_vmPreserved stripS_readReg64 stripS_sp stripS_trace vmTrapHooks) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (noAllocShim_hookOk) @@ -76,7 +76,7 @@ open LibsignalBinary.Proofs.TripleRatchet.Alloc.PublicKeySerializeBudget (public open LibsignalBinary.Proofs.TripleRatchet.InImageCallees.CallsBudget (parse_sid_placed_ok_at_of_code) open LibsignalBinary.Proofs.TripleRatchet.InImageCallees.DefsBudget (uuidTryParseCodeBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Mac.ComputeBudgetAux (newFromSliceBudgetSpec) -open LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudget (verifyMacWithAddresses_placed_cro_ok) +open LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudgetSat (verifyMacWithAddresses_placed_cro_ok_sat) set_option maxRecDepth 200000 set_option maxHeartbeats 400000 set_option linter.unreachableTactic false @@ -252,9 +252,10 @@ private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans (cliExternsPlaced_row mmpl W hrow) private theorem new_from_slice_60_cro_ok [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) @@ -275,10 +276,10 @@ theorem s7_433_cli [LibsignalPlacement] {M : AllocCostModel} have _ := instIsLsBlockProg_434 H have hpk60 := subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded (ls_subroutine_ok_of_block (callerProg := (blkPC_60).rebase (blkPl_60).base H) (subroutine_ok_withLsCodeLoaded_of_plain (pl := lsmpl) (public_key_serialize_placed_ok ⟨hookNoop, (cliGhostExterns_shim g _).trans (congrArg some hG.shim_eq), noAllocShim_hookOk⟩ (cliExternsPlaced_alloc_budget_sat mmpl g W hG)))) - have hvmac62 := verifyMacWithAddresses_placed_cro_ok W.C M A lim uuidTryParse H + have hvmac62 := verifyMacWithAddresses_placed_cro_ok_sat W.C M A lim uuidTryParse H (parse_sid_placed_ok_at_of_code (prog := (blkPC_61).rebase (blkPl_61).base H) (uuidTryParse_placed_vm_ok H)) (new_from_slice_60_cro_ok mmpl g W hG) hpk60 - (ls_hook_ok_ultra_of_mem (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W (cliExternsPlaced_blackBox_budget_sat mmpl W))) + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) (cliExternsPlaced_noAllocShim_budget_sat mmpl g W hG.shim_eq) (cliExternsPlaced_alloc_budget_sat mmpl g W hG) (cliExternsPlaced_dealloc_budget_sat mmpl g W hG) diff --git a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart3Sat.lean b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart3Sat.lean index d8f7fd2a6..1ea94dc04 100644 --- a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart3Sat.lean +++ b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart3Sat.lean @@ -32,7 +32,7 @@ import LibsignalBinary.Proofs.SpqrV1.Poly.EncodeBytes.DefsBudget import LibsignalBinary.Proofs.TripleRatchet.Alloc.PublicKeySerializeBudget import LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.NewFromSlice import LibsignalBinary.Proofs.TripleRatchet.InImageCallees.CallsBudget -import LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudget +import LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudgetSat import ProofLib.SepLogic.Entry /-! @@ -103,7 +103,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.CliSlotCalleesInstPlacedBudgetUuid (uuidTryParse_placed_vm_ok) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_blackBox_budget_sat + (CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliGhostExterns_blackBoxSat_budget_sat cliExternsPlaced_compress256Multi_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_exactMemcpy_sat cliExternsPlaced_noAllocShim_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat @@ -117,7 +117,7 @@ open LibsignalBinary.Proofs.TripleRatchet.InImageCallees.CallsBudget (parse_sid_ open LibsignalBinary.Proofs.TripleRatchet.InImageCallees.DefsBudget (parseSidCodeBudgetSpec uuidTryParseCodeBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Mac.ComputeBudgetAux (newFromSliceBudgetSpec) -open LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudget (verifyMacWithAddresses_placed_cro_ok) +open LibsignalBinary.Proofs.TripleRatchet.Mac.VerifyBudgetSat (verifyMacWithAddresses_placed_cro_ok_sat) open Obj (MultiPlacedLib MultiPlacement PlacedLib) open VerifiedLibraries.RustStd (blockProgram_rebase_allInstrs_not_isSvc0) @@ -786,9 +786,10 @@ private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W (h5 : sym ≠ lsRustNoAllocShimSymCli := by decide) (h6 : sym ≠ lsStringCloneSym := by decide) (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) - (h9 : sym ≠ lsMemsetSym := by decide) (h10 : sym ≠ lsMemcpySym := by decide) : + (h9 : sym ≠ lsMemsetSym := by decide) (h10 : sym ≠ lsMemcpySym := by decide) + (hExtra : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans (cliExternsPlaced_row mmpl W hrow) private theorem stripS_mem (p : BitVec 64 → Bool) (s : State) : (ProofLib.stripS p s).mem = ProofLib.stripExecOutside p s.mem := by cases s; rfl @@ -1003,12 +1004,10 @@ theorem s7_433_cli_of_hMs [LibsignalPlacement] {M : AllocCostModel} (public_key_serialize_placed_ok ⟨hookNoop, (cliGhostExterns_shim g _).trans (congrArg some hG.shim_eq), noAllocShim_hookOk⟩ (cliExternsPlaced_alloc_budget_sat mmpl g W hG)))) - have hvmac62 := verifyMacWithAddresses_placed_cro_ok W.C M A lim uuidTryParse H + have hvmac62 := verifyMacWithAddresses_placed_cro_ok_sat W.C M A lim uuidTryParse H (parseSid_61_ok H) (new_from_slice_60_cro_ok mmpl g W hG) hpk60 - (ls_hook_ok_ultra_of_mem - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_blackBox_budget_sat mmpl W))) + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) (cliExternsPlaced_noAllocShim_budget_sat mmpl g W hG.shim_eq) (cliExternsPlaced_alloc_budget_sat mmpl g W hG) (cliExternsPlaced_dealloc_budget_sat mmpl g W hG) diff --git a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart4.lean b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart4.lean index 964103060..a26914bda 100644 --- a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart4.lean +++ b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart4.lean @@ -16,7 +16,7 @@ import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhCommitClMainPlacedBudget import LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhStepCoinsFillBridgePlacedBudget import LibsignalBinary.Proofs.Cli.TripleRatchet.Getters.Drops.ChainPlacedBudget -import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat import LibsignalBinary.Proofs.Placed.ElfLsRetAddr import LibsignalBinary.Proofs.TripleRatchet.Alloc.ChainKeyToPbBudget import LibsignalBinary.Proofs.TripleRatchet.Alloc.DerivePublicKeyBytesBudget @@ -41,11 +41,12 @@ namespace LibsignalBinary.Proofs.Cli.SpqrV1.M4.DecryptFrontTrapPlacedBudgetPart4 open Arm64 ProofLib open CryptoVerification ( - LibsignalPlacement ls_hook_ok_ultra_of_mem ls_subroutine_ok_of_block lsmpl + LibsignalPlacement blkPC_40 blkPl_40 ls_hook_ok_ultra_of_mem ls_subroutine_ok_of_block lsmpl subroutine_ok_withLsCodeLoaded_of_plain withLsCodeLoaded ) open CryptoVerification.LibsignalTripleRatchet ( - HkdfPlacedHooks SpqrModel hookMemset_eq_memsetHook pubFromSecretHook + HkdfPlacedHooks SpqrModel hookMemset_eq_memsetHook keys_ls_hook_ok_of_mem + keys_ls_subroutine_ok_of_block_cro pubFromSecretHook subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded withLsCodeRoLoaded ) open CryptoVerification.LibsignalTripleRatchet.Decrypt (blkPC_434 blkPl_434 instIsLsBlockProg_434) @@ -60,7 +61,7 @@ open CryptoVerification.SignalSession.Cli.RunGlue ( CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other cliGhostExterns_shim ) open CryptoVerification.SignalSession.Cli.Slots ( - blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced compress256_row_placed + cliGhostExterns_sat_of_cliExternsPlaced compress256_row_placed pubFromSecret_row_placed ) open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget) @@ -76,16 +77,19 @@ open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhStepCoinsFillBridgePlace ) open LibsignalBinary.Proofs.Cli.TripleRatchet.Getters.Drops.ChainPlacedBudget (drop_chain_placed_ok) open LibsignalBinary.Proofs.ConsumeMessageKey.DefsBudget (growOneSpec) +open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat ( + calculateAgreement_placed_ok_unconditional_sat +) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat ( - createChain_placed_ok_of_block_sat + expand_multi_info_placed_vm_ok_of_other_block_sat extract_placed_vm_ok_of_other_block_sat ) open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (lsRetAddr624_base_add) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_diffieHellman_budget_sat cliExternsPlaced_realloc_budget_sat - cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemmove_budget_sat - cliExternsPlaced_sessionMemsetRegion_budget_sat cliExternsPlaced_sharedSecretDrop_budget_sat - cliExternsPlaced_staticSecretDrop_budget_sat + cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat + cliGhostExterns_blackBoxSat_budget_sat cliGhostExterns_sessionMemmove_budget_sat + cliGhostExterns_sharedSecretDrop_budget_sat cliGhostExterns_staticSecretDrop_budget_sat ) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat (HkdfPlacedHooksExactBudgetSat) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat (HkdfPlacedHooksExactSat) @@ -108,6 +112,9 @@ open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhCommitMainBudgetCore (dhComm open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhStepBudgetCore (s3DefaultEnv) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhStepBudgetWp (dhStepBlockVmWp_549) open LibsignalBinary.Proofs.TripleRatchet.Getters.DefsBudget (dropChainSpec) +open LibsignalBinary.Proofs.TripleRatchet.Keys.CreateChainBudget ( + createChain_placed_ok_of_contracts +) open LibsignalBinary.Proofs.TripleRatchet.Keys.DefsBudget (createChainSpec) private theorem blk433_s3_entry_eq [LibsignalPlacement] : (blkPl_434).base = lsmpl.base 434 := rfl @@ -120,9 +127,10 @@ private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans (cliExternsPlaced_row mmpl W hrow) private theorem createChain_433_cro_ok [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -137,17 +145,22 @@ private theorem createChain_433_cro_ok [LibsignalPlacement] {M : AllocCostModel} have _ : HkdfPlacedHooksExactBudgetSat W.C.F (cliGhostExterns g (cliExternsPlaced mmpl W)) := HkdfPlacedHooksExactBudgetSat.of_exactSat (cliExternsPlaced_sessionMemsetRegion_budget_sat mmpl g W hG) - exact createChain_placed_ok_of_block_sat - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_diffieHellman_budget_sat mmpl W)) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sharedSecretDrop_budget_sat mmpl W)) - (cliGhost_row mmpl g W (blackBox_row_placed mmpl W)) - ⟨hookNoop, (cliGhostExterns_shim g _).trans (congrArg some hG.shim_eq), noAllocShim_hookOk⟩ - (cliExternsPlaced_alloc_budget_sat mmpl g W hG) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W)) - (cliExternsPlaced_dealloc_budget_sat mmpl g W hG) + exact keys_ls_subroutine_ok_of_block_cro + (createChain_placed_ok_of_contracts + (keys_ls_subroutine_ok_of_block_cro + (calculateAgreement_placed_ok_unconditional_sat + (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W + (cliExternsPlaced_diffieHellman_budget_sat mmpl W)) + (cliGhostExterns_sharedSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) + ⟨hookNoop, (cliGhostExterns_shim g _).trans (congrArg some hG.shim_eq), noAllocShim_hookOk⟩ + (cliExternsPlaced_alloc_budget_sat mmpl g W hG) + (cliGhostExterns_staticSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk))) + (extract_placed_vm_ok_of_other_block_sat W.C (cliGhostExterns g (cliExternsPlaced mmpl W))) + (expand_multi_info_placed_vm_ok_of_other_block_sat W.C + (cliGhostExterns g (cliExternsPlaced mmpl W))) + (keys_ls_hook_ok_of_mem (cliExternsPlaced_dealloc_budget_sat mmpl g W hG))) + (by decide) (by decide) (by decide) private theorem derivePk_433_cro_ok [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) : @@ -229,8 +242,7 @@ theorem dhStep_pinned_433_cli [LibsignalPlacement] {M : AllocCostModel} (derivePk_433_cro_ok mmpl g W) (coinsFill_433_cro_placed_cli mmpl g W hG) (ls_hook_ok_ultra_of_mem - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W))) + (cliGhostExterns_staticSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk)) (s3_commit_pinned_cmk_cl_budget_placed_ok_cli (dhCommitBlockVmWp_549 H) W.C A lim ctl uuidTryParse spqrNoPanic (pkSer_433_cl_ok mmpl g W hG) @@ -244,8 +256,7 @@ theorem dhStep_pinned_433_cli [LibsignalPlacement] {M : AllocCostModel} (subroutine_ok_framelessMemcpy_of_sessionMemcpyRegionBudget (ls_hook_ok_ultra_of_mem (cliExternsPlaced_sessionMemcpyRegion_budget_sat mmpl g W hG))) (ls_hook_ok_ultra_of_mem - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W dropChainStack))) + (cliGhostExterns_sessionMemmove_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk dropChainStack)) (hlr_alloc := lsRetAddr624_base_add 434 0xa00#64 (by decide) (by decide)) (hlr_dealloc := lsRetAddr624_base_add 434 0xaf0#64 (by decide) (by decide)) (hlr_ls := lsRetAddr624_base_add 434 0xb8c#64 (by decide) (by decide))) diff --git a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart4Sat.lean b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart4Sat.lean index a4450ec9c..449a8e406 100644 --- a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart4Sat.lean +++ b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetPart4Sat.lean @@ -16,7 +16,7 @@ import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhCommitClMainPlacedBudget import LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhStepCoinsFillBridgePlacedBudget import LibsignalBinary.Proofs.Cli.TripleRatchet.Getters.Drops.ChainPlacedBudget -import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat import LibsignalBinary.Proofs.Placed.ElfLsRetAddr import LibsignalBinary.Proofs.TripleRatchet.Alloc.ChainKeyToPbBudget import LibsignalBinary.Proofs.TripleRatchet.Alloc.DerivePublicKeyBytesBudget @@ -41,12 +41,12 @@ namespace LibsignalBinary.Proofs.Cli.SpqrV1.M4.DecryptFrontTrapPlacedBudgetPart4 open Arm64 ProofLib SepProp open CryptoVerification - (LibsignalPlacement ls_hook_ok_ultra_of_mem ls_subroutine_ok_of_block lsmpl + (LibsignalPlacement blkPC_40 blkPl_40 ls_hook_ok_ultra_of_mem ls_subroutine_ok_of_block lsmpl subroutine_ok_withLsCodeLoaded_of_plain withLsCodeLoaded) open CryptoVerification.LibsignalSession.CryptoHmacSha256 (lsMemsetSym) open CryptoVerification.LibsignalTripleRatchet - (SpqrModel pubFromSecretHook subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded - withLsCodeRoLoaded) + (SpqrModel keys_ls_hook_ok_of_mem keys_ls_subroutine_ok_of_block_cro pubFromSecretHook + subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded withLsCodeRoLoaded) open CryptoVerification.LibsignalTripleRatchet.Decrypt (blkPC_434 blkPl_434 instIsLsBlockProg_434) open CryptoVerification.LibsignalTripleRatchet.Decrypt.DhStep.P3kR1bd (spqrNoPanic) open CryptoVerification.LibsignalTripleRatchet.Getters (dropChainStack) @@ -57,7 +57,7 @@ open CryptoVerification.SignalSession open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other cliGhostExterns_shim) open CryptoVerification.SignalSession.Cli.Slots - (blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced compress256_row_placed + (cliGhostExterns_sat_of_cliExternsPlaced compress256_row_placed pubFromSecret_row_placed) open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) @@ -70,15 +70,18 @@ open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhStepCoinsFillBridgePlace (coinsFill_433_cro_placed_cli) open LibsignalBinary.Proofs.Cli.TripleRatchet.Getters.Drops.ChainPlacedBudget (drop_chain_placed_ok) open LibsignalBinary.Proofs.ConsumeMessageKey.DefsBudget (growOneSpec) +open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat + (calculateAgreement_placed_ok_unconditional_sat) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat - (createChain_placed_ok_of_block_sat) + (expand_multi_info_placed_vm_ok_of_other_block_sat extract_placed_vm_ok_of_other_block_sat) open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (lsRetAddr624_base_add) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_diffieHellman_budget_sat cliExternsPlaced_exactMemcpy_sat cliExternsPlaced_framelessMemcpy_budget_sat cliExternsPlaced_realloc_budget_sat - cliExternsPlaced_sessionMemmove_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat - cliExternsPlaced_sharedSecretDrop_budget_sat cliExternsPlaced_staticSecretDrop_budget_sat) + cliExternsPlaced_sessionMemsetRegion_budget_sat cliGhostExterns_blackBoxSat_budget_sat + cliGhostExterns_sessionMemmove_budget_sat cliGhostExterns_sharedSecretDrop_budget_sat + cliGhostExterns_staticSecretDrop_budget_sat) open LibsignalBinary.Proofs.TripleRatchet.Alloc.ChainKeyToPbBudget (chain_key_to_pb_placed_ok) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (chainKeyToPbSpec derivePublicKeyBytesBudgetSpec framelessMemcpyBudgetSpec noAllocShim_hookOk @@ -97,6 +100,8 @@ open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat (HkdfPlacedHooksE open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat (HkdfPlacedHooksExactSat hookSat_sessionMemsetRegion_of_budget) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemsetRegionBudgetSpec) +open LibsignalBinary.Proofs.TripleRatchet.Keys.CreateChainBudget + (createChain_placed_ok_of_contracts) open LibsignalBinary.Proofs.TripleRatchet.Keys.DefsBudget (createChainSpec) private theorem blk433_s3_entry_eq [LibsignalPlacement] : (blkPl_434).base = lsmpl.base 434 := rfl @@ -109,9 +114,10 @@ private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans (cliExternsPlaced_row mmpl W hrow) private theorem mkHkdfPlacedHooksExactSat_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -157,17 +163,22 @@ private theorem createChain_433_cro_ok [LibsignalPlacement] {M : AllocCostModel} mkHkdfPlacedHooksExactSat_cli mmpl g W hG have _ : HkdfPlacedHooksExactBudgetSat W.C.F (cliGhostExterns g (cliExternsPlaced mmpl W)) := HkdfPlacedHooksExactBudgetSat.of_exactSat hMs - exact createChain_placed_ok_of_block_sat - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_diffieHellman_budget_sat mmpl W)) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sharedSecretDrop_budget_sat mmpl W)) - (cliGhost_row mmpl g W (blackBox_row_placed mmpl W)) - ⟨hookNoop, (cliGhostExterns_shim g _).trans (congrArg some hG.shim_eq), noAllocShim_hookOk⟩ - (cliExternsPlaced_alloc_budget_sat mmpl g W hG) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W)) - (cliExternsPlaced_dealloc_budget_sat mmpl g W hG) + exact keys_ls_subroutine_ok_of_block_cro + (createChain_placed_ok_of_contracts + (keys_ls_subroutine_ok_of_block_cro + (calculateAgreement_placed_ok_unconditional_sat + (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W + (cliExternsPlaced_diffieHellman_budget_sat mmpl W)) + (cliGhostExterns_sharedSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) + ⟨hookNoop, (cliGhostExterns_shim g _).trans (congrArg some hG.shim_eq), noAllocShim_hookOk⟩ + (cliExternsPlaced_alloc_budget_sat mmpl g W hG) + (cliGhostExterns_staticSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk))) + (extract_placed_vm_ok_of_other_block_sat W.C (cliGhostExterns g (cliExternsPlaced mmpl W))) + (expand_multi_info_placed_vm_ok_of_other_block_sat W.C + (cliGhostExterns g (cliExternsPlaced mmpl W))) + (keys_ls_hook_ok_of_mem (cliExternsPlaced_dealloc_budget_sat mmpl g W hG))) + (by decide) (by decide) (by decide) private theorem derivePk_433_cro_ok [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) : @@ -253,8 +264,7 @@ theorem dhStep_pinned_433_cli [LibsignalPlacement] {M : AllocCostModel} (derivePk_433_cro_ok mmpl g W) (coinsFill_433_cro_placed_cli mmpl g W hG) (ls_hook_ok_ultra_of_mem - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W))) + (cliGhostExterns_staticSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk)) (s3_commit_pinned_cmk_cl_budget_placed_ok_cli (dhCommitBlockVmWp_549 H) W.C A lim ctl uuidTryParse spqrNoPanic (pkSer_433_cl_ok mmpl g W hG) @@ -267,8 +277,7 @@ theorem dhStep_pinned_433_cli [LibsignalPlacement] {M : AllocCostModel} (ls_hook_ok_ultra_of_mem (cliExternsPlaced_dealloc_budget_sat mmpl g W hG)) (ls_hook_ok_ultra_of_mem (framelessMemcpy_budget_sat mmpl g W hG)) (ls_hook_ok_ultra_of_mem - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W dropChainStack))) + (cliGhostExterns_sessionMemmove_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk dropChainStack)) (hlr_alloc := lsRetAddr624_base_add 434 0xa00#64 (by decide) (by decide)) (hlr_dealloc := lsRetAddr624_base_add 434 0xaf0#64 (by decide) (by decide)) (hlr_ls := lsRetAddr624_base_add 434 0xb8c#64 (by decide) (by decide))) diff --git a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetSat.lean b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetSat.lean index acd0b33ad..9cebefeae 100644 --- a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetSat.lean +++ b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/DecryptFrontTrapPlacedBudgetSat.lean @@ -16,10 +16,12 @@ public import LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget -- proof-set import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Heap.Fine.SpecBudgetHelpersFine +import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexBudgetSat import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudgetSat import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove import LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.InstancesBudgetSat +import LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.Transfer import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat import LibsignalBinary.Proofs.TripleRatchet.InImageCallees.ProtocolAddressDisplayBudget import LibsignalBinary.Proofs.TripleRatchet.Keys.GenerateKeysBudget @@ -30,9 +32,9 @@ import LibsignalBinary.Proofs.TripleRatchet.Keys.GenerateKeysBudget Re-proves the `memset`-dependent Block `433` segment seams (`s6_433_cli`, `dhStep_pinned_433_cli`, `dhStep_433_cli`, `s4_433_cli_ofEnv`, `s4_433_cli`, and `s7_433_cli`) parameterized by `HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsMemsetSym sessionMemsetRegionBudgetSpec`, -while preserving all `memset`-free Block `433` seams (`errTail_433_cli`, `pqRecv_433_cli_ofEnv`, -`pqRecv_433_cli`, `aesDecrypt_433_cli`, `s0_433_cli`, `s1_pinned_433_cli`, `s1_433_cli`, -`s2_433_cli`, `s9_433_cli`). +while preserving the remaining `memset`-free Block `433` seams (`errTail_433_cli`, +`pqRecv_433_cli_ofEnv`, `pqRecv_433_cli`, `aesDecrypt_433_cli`, `s1_pinned_433_cli`, `s1_433_cli`, +`s9_433_cli`). -/ public section @@ -62,7 +64,7 @@ open CryptoVerification.SignalSession open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other) open CryptoVerification.SignalSession.Cli.Slots - (blackBox_row_placed cliGhostExterns_panic_all cliGhostExterns_sat_of_cliExternsPlaced + (cliGhostExterns_panic_all cliGhostExterns_sat_of_cliExternsPlaced compress256_row_placed fmtWrite_row_placed) open CryptoVerification.SpqrV1.GF.Mul2U16 (tokenInitPlacedAt) open CryptoVerification.SpqrV1.Top.InitialState (InitialStateGhost) @@ -79,24 +81,20 @@ open LibsignalBinary.Proofs.Cli.SpqrV1.M4.VerifyMacTrapPlacedBudget (s7Env) open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.ChainLookupS1ErrPlacedBudget (S1TightSeamFreePlaced S1TightSeamPinnedFreePlaced) open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DefsPlacedBudget - (ErrTailTightSeamPlaced S0PSeamPlaced S2SeamPlaced S3TightSeamPinnedPlaced S3TightSeamPlaced + (ErrTailTightSeamPlaced S3TightSeamPinnedPlaced S3TightSeamPlaced S4SeamPlaced S5WTSeamPlaced S6SeamPlaced S7SeamPlaced S8SeamPlaced S9SeamPlaced) open LibsignalBinary.Proofs.ConsumeMessageKey.AdvanceEpilogueProofs.FetchBudget (CmkAllocHooks) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudgetSat (expand_multi_info_placed_vm_ok_of_other_block_sat) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat (extract_placed_vm_ok_of_other_block_sat) -open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove - (hookSat_sessionMemmoveBoundedBudget_of_unbounded) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_exactMemcpy_sat cliExternsPlaced_realloc_budget_sat - cliExternsPlaced_sessionMemmove_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat - cliExternsPlaced_shim_budget_sat) + cliExternsPlaced_sessionMemsetRegion_budget_sat cliExternsPlaced_shim_budget_sat + cliGhostExterns_blackBoxSat_budget_sat cliGhostExterns_sessionMemmove_budget_sat) open LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget (SpqrRecvBytesEnv SpqrV1PlacedSeams SpqrV1PlacedSeamsOfEnv) -open LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.InstancesBudgetSat - (cmk_raw_placed_cro_ok_at_block_sat) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DeriveKeysBudget (s6FreeOnlyEnv) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhStepBudgetCore (s3DefaultEnv) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.PqRecvBudgetDefs (PqRecvEnv) @@ -110,6 +108,99 @@ open LibsignalBinary.Proofs.TripleRatchet.Keys.GenerateKeysBudget (generateKeys_placed_ok_of_contracts) open LibsignalBinary.Proofs.TripleRatchet.Record.DefsBudget (TryDecryptEnvArgs) +section CmkBbSat + +open CryptoGames.LibsignalSession (ShaCompress) +open CryptoVerification (IsLsBlockProg LibsignalCodeLoaded blkPC_24 blkPl_24 extract_withLsCodeLoaded lsBlackBoxU8Sym lsRustReallocSym withLsCodeLoaded) +open CryptoVerification.LibsignalTripleRatchet (extract_withLsCodeRoLoaded withLsCodeRoLoaded) +open CryptoVerification.LibsignalTripleRatchet.ConsumeMessageKeyTransfer (ls_subroutine_ok_transfer_of_plain) +open LibsignalBinary.Heap (rustCliReallocBudgetSpec) +open LibsignalBinary.Proofs.ConsumeMessageKey.AdvanceEpilogueProofs.FetchBudget (CmkEnv cmkPlacedSpec) +open LibsignalBinary.Proofs.ConsumeMessageKey.AssemblyBudgetSat (grow_one_placed_ok_at_cmk_sat hmac_sha256_placed_ro_ok_at_cmk_sat) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexBudgetSat (find_receiver_chain_index_placed_ok_at_cmk_sat) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat (blackBoxSpecSat) +open LibsignalBinary.Proofs.ConsumeMessageKey.RunOfCalleesBudget (cmkPlacedRoSpec) +open LibsignalBinary.Proofs.ConsumeMessageKey.RunOfCalleesBudgetSat (consume_message_key_placed_ro_run_of_sat) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedBudgetSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore (HookSatExactMemcpy) +open LibsignalBinary.Proofs.TripleRatchet.Decrypt.ConsumeMsgKeyBudget (cmkRawSpecPlaced) + +attribute [local irreducible] + CryptoVerification.LibsignalSession.cmkDummyImg + CryptoVerification.LibsignalTripleRatchet.Decrypt.tryDecryptPlacedImg + +private theorem cmkPlacedSpec_pre_eq_raw [LibsignalPlacement] (F : ShaCompress) + (A' : CryptoVerification.RustHeap.RustAlloc) + (x : CryptoVerification.LibsignalSession.ConsumeMessageKeyGhost) (s : State) : + (CryptoVerification.LibsignalSession.cmkPlacedSpec F A').pre x s = + (CryptoVerification.LibsignalTripleRatchet.Decrypt.KeyDerive.cmkRawSpecPlaced F A').pre x s ∗ + ⌜LibsignalCodeLoaded lsmpl s.mem⌝ := by + dsimp only [CryptoVerification.LibsignalSession.cmkPlacedSpec, + CryptoVerification.LibsignalTripleRatchet.Decrypt.KeyDerive.cmkRawSpecPlaced, + withLsCodeLoaded] + rw [CryptoVerification.LibsignalTripleRatchet.Decrypt.logOff_tryDecryptPlacedImg] + +private theorem cmkPlacedSpec_post_eq_raw [LibsignalPlacement] (F : ShaCompress) + (A' : CryptoVerification.RustHeap.RustAlloc) + (x : CryptoVerification.LibsignalSession.ConsumeMessageKeyGhost) (s0 sf : State) : + (CryptoVerification.LibsignalSession.cmkPlacedSpec F A').post x s0 sf = + (CryptoVerification.LibsignalTripleRatchet.Decrypt.KeyDerive.cmkRawSpecPlaced + F A').post x s0 sf := by + dsimp only [CryptoVerification.LibsignalSession.cmkPlacedSpec, + CryptoVerification.LibsignalTripleRatchet.Decrypt.KeyDerive.cmkRawSpecPlaced, + withLsCodeLoaded] + rw [CryptoVerification.LibsignalTripleRatchet.Decrypt.logOff_tryDecryptPlacedImg] + +private theorem cmk_raw_placed_cro_ok_at_block_bb_sat [LibsignalPlacement] + {callerProg : Program} {i : Nat} {M : AllocCostModel} + (F : ShaCompress) (A : RustCliAllocBudget M) (lim : BudgetLimits) + {H : String → Option (State → State)} [IsLsBlockProg callerProg i H] + (hA : CmkAllocHooks A lim H) + (hmm : HookSat H "memmove" (sessionMemmoveBoundedBudgetSpec 4096)) + (h_bb : HookSat H lsBlackBoxU8Sym blackBoxSpecSat) + (h_realloc : HookSat H lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) + (h_mc : HookSatExactMemcpy H CryptoVerification.LibsignalSession.CryptoHmacSha256.lsMemcpySym) + (h_ms : HookSat H CryptoVerification.LibsignalSession.CryptoHmacSha256.lsMemsetSym + sessionMemsetRegionBudgetSpec) + (h_c256 : H CryptoVerification.LibsignalSession.CryptoHmacSha256.lsCompress256Sym = + some (CryptoVerification.LibsignalHmac.compress256Hook F)) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 24) + (withLsCodeRoLoaded lsmpl (cmkRawSpecPlaced F A lim CmkEnv)) := by + have hcmk0 : subroutine_ok ((blkPC_24).rebase (blkPl_24).base H) (blkPl_24).base + (cmkPlacedRoSpec F A lim) := + consume_message_key_placed_ro_run_of_sat F A lim H + (find_receiver_chain_index_placed_ok_at_cmk_sat A h_bb) + (hmac_sha256_placed_ro_ok_at_cmk_sat F h_mc h_ms h_c256) + (grow_one_placed_ok_at_cmk_sat hA h_realloc) hA hmm + have htr : subroutine_ok callerProg (lsmpl.base 24) + (withLsCodeLoaded lsmpl (cmkPlacedRoSpec F A lim)) := + ls_subroutine_ok_transfer_of_plain hcmk0 hi + refine subroutine_ok_outcome_intro fun ⟨x, st_init⟩ R s0 hpc hrun hpre hsp => ?_ + have ⟨⟨hcl, hro⟩, hp⟩ := extract_withLsCodeRoLoaded hpre + refine htr.mono_outcome (x, st_init) R s0 hpc hrun ?_ hsp fun sf hout => ?_ + · dsimp only [cmkRawSpecPlaced] at hp + rw [sepConj_assoc, satisfies_pure_sepConj] at hp + dsimp only [withLsCodeLoaded, cmkPlacedRoSpec, cmkPlacedSpec] + rw [sepConj_assoc, sepConj_left_comm, satisfies_pure_sepConj] + refine ⟨hcl, ?_⟩ + rw [cmkPlacedSpec_pre_eq_raw, sepConj_assoc, sepConj_assoc, satisfies_pure_sepConj] + refine ⟨hp.1, ?_⟩ + rw [sepConj_assoc, sepConj_left_comm, satisfies_pure_sepConj] + refine ⟨hcl, ?_⟩ + rw [sepConj_left_comm, satisfies_pure_sepConj] + exact ⟨hro, hp.2⟩ + · rcases hout with ⟨hret, hcc, hq⟩ | ⟨hpan, hq⟩ | ⟨code, hex, hq⟩ | ⟨hoom, hq⟩ + · refine Or.inl ⟨hret, hcc, ?_⟩ + dsimp only [cmkPlacedRoSpec, cmkPlacedSpec, cmkRawSpecPlaced, withLsCodeRoLoaded] at hq ⊢ + simp only [cmkPlacedSpec_post_eq_raw] at hq + exact hq + · exact Or.inr (Or.inl ⟨hpan, hq⟩) + · exact Or.inr (Or.inr (Or.inl ⟨code, hex, hq⟩)) + · exact Or.inr (Or.inr (Or.inr ⟨hoom, hq⟩)) + +end CmkBbSat + private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) {sym : String} {f : State → State} (hrow : (sym, f) ∈ cliHookTablePlaced mmpl W) (h1 : sym ≠ lsRustAllocSymCli := by decide) (h2 : sym ≠ lsRustDeallocSymCli := by decide) @@ -117,9 +208,10 @@ private theorem cliGhost_row (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W (h5 : sym ≠ lsRustNoAllocShimSymCli := by decide) (h6 : sym ≠ lsStringCloneSym := by decide) (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) - (h9 : sym ≠ lsMemsetSym := by decide) (h10 : sym ≠ lsMemcpySym := by decide) : + (h9 : sym ≠ lsMemsetSym := by decide) (h10 : sym ≠ lsMemcpySym := by decide) + (hExtra : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans (cliExternsPlaced_row mmpl W hrow) private theorem mkHkdfPlacedHooksExactSat_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -184,16 +276,6 @@ theorem aesDecrypt_433_cli [LibsignalPlacement] {M : AllocCostModel} (blkPl_434).base W.C A lim ctl uuidTryParse S s8Env := DecryptFrontTrapPlacedBudget.aesDecrypt_433_cli mmpl g W hG hAesDec ctl S -theorem s0_433_cli [LibsignalPlacement] {M : AllocCostModel} - {A : RustCliAllocBudget M} {lim : BudgetLimits} - (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) - (ctl : BitVec 64) (S : SpqrModel) - (tdEnv : TryDecryptEnvArgs → List AllocEvent → Prop) : - S0PSeamPlaced - ((blkPC_434).rebase (blkPl_434).base (cliGhostExterns g (cliExternsPlaced mmpl W))) - (blkPl_434).base W.C A lim ctl uuidTryParse S tdEnv := - DecryptFrontTrapPlacedBudget.s0_433_cli mmpl g W ctl S tdEnv - theorem s1_pinned_433_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) @@ -214,14 +296,6 @@ theorem s1_433_cli [LibsignalPlacement] {M : AllocCostModel} (blkPl_434).base W.C A lim ctl uuidTryParse S tdEnv (fun _ => FreeOnlyEvs) := DecryptFrontTrapPlacedBudget.s1_433_cli mmpl g W hG ctl S tdEnv -theorem s2_433_cli [LibsignalPlacement] {M : AllocCostModel} - {A : RustCliAllocBudget M} {lim : BudgetLimits} - (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) (ctl : BitVec 64) : - S2SeamPlaced - ((blkPC_434).rebase (blkPl_434).base (cliGhostExterns g (cliExternsPlaced mmpl W))) - (blkPl_434).base A lim ctl := - DecryptFrontTrapPlacedBudget.s2_433_cli mmpl g W ctl - /-- `S6SeamPlaced` on Block `433` at `cliGhostExterns g (cliExternsPlaced mmpl W)` under `HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsMemsetSym sessionMemsetRegionBudgetSpec`. -/ theorem s6_433_cli [LibsignalPlacement] {M : AllocCostModel} @@ -317,13 +391,11 @@ theorem s4_433_cli_ofEnv [LibsignalPlacement] {M : AllocCostModel} (subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded (ls_subroutine_ok_of_block (callerProg := (blkPC_434).rebase (blkPl_434).base H) h215)) - (cmk_raw_placed_cro_ok_at_block_sat + (cmk_raw_placed_cro_ok_at_block_bb_sat (callerProg := (blkPC_434).rebase (blkPl_434).base H) W.C.F A lim hA_cmk - (hookSat_sessionMemmoveBoundedBudget_of_unbounded 4096 - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W 4096))) - (cliGhost_row mmpl g W (blackBox_row_placed mmpl W)) + (cliGhostExterns_sessionMemmove_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk 4096) + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) (cliExternsPlaced_realloc_budget_sat mmpl g W hG) hH_cmk.memcpy hMs diff --git a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/RecordDecryptPV1TrapPlaced.lean b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/RecordDecryptPV1TrapPlaced.lean index a2f632368..08d7c3921 100644 --- a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/RecordDecryptPV1TrapPlaced.lean +++ b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/RecordDecryptPV1TrapPlaced.lean @@ -1450,6 +1450,7 @@ theorem _root_.CryptoVerification.Cli.LibsignalSpqrV1.recordDecryptV1_placed_reg [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) (ctl : BitVec 64) (hG : Slots.CliGhostA0Hooks CryptoVerification.E2E.HooksE.A0 gh) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hAesDec : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) lsAesDecSym (aesDecSpec W.C.D CryptoVerification.E2E.HooksE.A0)) (hSpqr : SpqrV1PlacedSeams mmpl gh W) @@ -1472,7 +1473,7 @@ theorem _root_.CryptoVerification.Cli.LibsignalSpqrV1.recordDecryptV1_placed_reg (Slots.cliExternsPlaced_dealloc_sat mmpl gh W hG) (Slots.cliExternsPlaced_sessionMemcpyRegion_sat mmpl gh W hG) (Slots.cliGhostExterns_panic_handle_error mmpl gh W) - (tryDecryptV1_placed_ok_PTight_cli mmpl gh W ctl hG hAesDec hSpqr) + (tryDecryptV1_placed_ok_PTight_cli mmpl gh W ctl hG hMv hAesDec hSpqr) hclosure private theorem rdp_region_reaches_full_placed_TPTight [LibsignalFullPlacement] @@ -1645,6 +1646,7 @@ theorem _root_.CryptoVerification.Cli.LibsignalSpqrV1.recordDecryptV1_full_place [LibsignalFullPlacement] (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) (ctl : BitVec 64) (hG : Slots.CliGhostA0Hooks CryptoVerification.E2E.HooksE.A0 gh) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hAesDec : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) lsAesDecSym (aesDecSpec W.C.D CryptoVerification.E2E.HooksE.A0)) (hSpqr : SpqrV1PlacedSeams mmpl gh W) : @@ -1663,6 +1665,6 @@ theorem _root_.CryptoVerification.Cli.LibsignalSpqrV1.recordDecryptV1_full_place (Slots.cliExternsPlaced_dealloc_sat mmpl gh W hG) (Slots.cliExternsPlaced_sessionMemcpyRegion_sat mmpl gh W hG) (Slots.cliGhostExterns_panic_handle_error mmpl gh W) - (tryDecryptV1_placed_ok_PTight_cli mmpl gh W ctl hG hAesDec hSpqr) + (tryDecryptV1_placed_ok_PTight_cli mmpl gh W ctl hG hMv hAesDec hSpqr) end CryptoVerification.Cli.LibsignalSpqrV1.M4 diff --git a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/TryDecryptPV1TrapPlaced.lean b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/TryDecryptPV1TrapPlaced.lean index 8c95b449c..b94cef0fe 100644 --- a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/TryDecryptPV1TrapPlaced.lean +++ b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/TryDecryptPV1TrapPlaced.lean @@ -407,6 +407,7 @@ theorem tryDecryptV1_placed_ok_PTight_cli [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) (ctl : BitVec 64) (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hAesDec : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) lsAesDecSym (aesDecSpec W.C.D E2E.HooksE.A0)) (hSpqr : SpqrV1PlacedSeams mmpl gh W) : @@ -416,11 +417,11 @@ theorem tryDecryptV1_placed_ok_PTight_cli [LibsignalPlacement] (tryDecryptSpecTPTightAt W.C E2E.HooksE.A0 ctl uuidTryParse (spqrV1 W.C.F W.Q.K)) := tryDecrypt_placed_ok_of_seams (errTail_433_cli mmpl gh W hG ctl (spqrV1 W.C.F W.Q.K)) - (s0_433_cli mmpl gh W ctl (spqrV1 W.C.F W.Q.K)) + (s0_433_cli mmpl gh W hG.extraOk ctl (spqrV1 W.C.F W.Q.K)) (s1_433_cli mmpl gh W hG ctl (spqrV1 W.C.F W.Q.K)) - (s2_433_cli mmpl gh W ctl) - (dhStep_433_cli mmpl gh W hG ctl (spqrV1 W.C.F W.Q.K)) - (s4_433_cli mmpl gh W hG ctl (spqrV1 W.C.F W.Q.K)) + (s2_433_cli mmpl gh W hG.extraOk ctl) + (dhStep_433_cli mmpl gh W hG hMv ctl (spqrV1 W.C.F W.Q.K)) + (s4_433_cli mmpl gh W hG hMv ctl (spqrV1 W.C.F W.Q.K)) (pqRecv_433_cli mmpl gh W hG hSpqr ctl) (s6_433_cli mmpl gh W hG ctl) (s7_433_cli mmpl gh W hG ctl (spqrV1 W.C.F W.Q.K)) diff --git a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/TryDecryptPV1TrapPlacedBudget.lean b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/TryDecryptPV1TrapPlacedBudget.lean index c6ce0c6ba..1a2d8c355 100644 --- a/LibsignalBinary/Proofs/Cli/SpqrV1/M4/TryDecryptPV1TrapPlacedBudget.lean +++ b/LibsignalBinary/Proofs/Cli/SpqrV1/M4/TryDecryptPV1TrapPlacedBudget.lean @@ -915,9 +915,9 @@ theorem tryDecryptV1_placed_ok_PTight_cli_of_tdEnv [LibsignalPlacement] {M : All rw [fromS2_envArgsToGhost_eq] exact hseq)) (cliSeamEnvs_inhabited W.C (spqrV1 W.C.F W.Q.K) hRecv_ne hFmtWrite_ne hFmtInner_ne) - (s0_433_cli mmpl g W ctl (spqrV1 W.C.F W.Q.K) tdEnv) + (s0_433_cli mmpl g W hG.extraOk ctl (spqrV1 W.C.F W.Q.K) tdEnv) (s1_pinned_433_cli mmpl g W hG ctl (spqrV1 W.C.F W.Q.K) tdEnv) - (s2_433_cli mmpl g W ctl) + (s2_433_cli mmpl g W hG.extraOk ctl) (dhStep_pinned_433_cli mmpl g W hG ctl (spqrV1 W.C.F W.Q.K)) (s4_433_cli_ofEnv mmpl g W hG hFmtWrite ctl (spqrV1 W.C.F W.Q.K)) (pqRecv_433_cli_ofEnv mmpl g W hG hSpqr hFmtInner ctl) @@ -989,10 +989,10 @@ theorem tryDecryptV1_placed_ok_PTight_cli [LibsignalPlacement] {M : AllocCostMod (cliSeamEnvs_inhabited (fmtWriteEnv := FmtWriteEnv) (fmtEnv := FormatInnerEnv) W.C (spqrV1 W.C.F W.Q.K) spqrRecvBytesEnv_nonempty ⟨[], rfl⟩ ⟨[], rfl⟩) - (s0_433_cli mmpl g W ctl (spqrV1 W.C.F W.Q.K) (TryDecryptCliEnv W.C (spqrV1 W.C.F W.Q.K))) + (s0_433_cli mmpl g W hG.extraOk ctl (spqrV1 W.C.F W.Q.K) (TryDecryptCliEnv W.C (spqrV1 W.C.F W.Q.K))) (s1_pinned_433_cli mmpl g W hG ctl (spqrV1 W.C.F W.Q.K) (TryDecryptCliEnv W.C (spqrV1 W.C.F W.Q.K))) - (s2_433_cli mmpl g W ctl) + (s2_433_cli mmpl g W hG.extraOk ctl) (dhStep_pinned_433_cli mmpl g W hG ctl (spqrV1 W.C.F W.Q.K)) (s4_433_cli mmpl g W hG ctl (spqrV1 W.C.F W.Q.K)) (pqRecv_433_cli mmpl g W hG hSpqr ctl) diff --git a/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommit433PlacedBudget.lean b/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommit433PlacedBudget.lean index 90b2ec420..9917ba89f 100644 --- a/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommit433PlacedBudget.lean +++ b/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommit433PlacedBudget.lean @@ -65,6 +65,7 @@ open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DefsPlacedBudget ( open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhCommit433PlacedBudgetAux ( dhCommit_pinned_withStack_env_of_wp ) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedBudgetSpec) open LibsignalBinary.Proofs.SessionRecordAt.Stage1X.GrowOneXBudget (growOneChainSpecX) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( chainKeyToPbSpec chainKeyToPbSpecX framelessMemcpyBudgetSpec noAllocShimBudgetSpec @@ -86,7 +87,6 @@ open LibsignalBinary.Proofs.TripleRatchet.Decrypt.RootBudgetAux ( open LibsignalBinary.Proofs.TripleRatchet.Getters.DefsBudget ( dropChainSpec dropChainSpecX ) -open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemmoveBudgetSpec) export LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhCommitMainBudgetCore ( DhCommitEnv dhCommitAllocEvents s3CommitDefaultEnv @@ -434,7 +434,7 @@ theorem dhCommit_cli_pinned_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) (x : TryDecryptGhost) (trG : TrGhost) (tr : TripleRatchet (List (BitVec 8))) (st1 : SessionState (List (BitVec 8))) (sc : SenderChain) (receiverChainKey : ChainKey) (newSenderKey : KeyPair) @@ -543,7 +543,7 @@ theorem dhCommit_cli_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) (x : TryDecryptGhost) (trG : TrGhost) (tr : TripleRatchet (List (BitVec 8))) (st1 : SessionState (List (BitVec 8))) (sc : SenderChain) (receiverChainKey : ChainKey) (newSenderKey : KeyPair) @@ -604,7 +604,7 @@ theorem dhCommit_cli_pinned_x_placed_ok [LibsignalPlacement] {M : AllocCostModel (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) (x : TryDecryptGhost) (trG : TrGhost) (tr : TripleRatchet (List (BitVec 8))) (st1 : SessionState (List (BitVec 8))) (sc : SenderChain) (receiverChainKey : ChainKey) (newSenderKey : KeyPair) @@ -713,7 +713,7 @@ theorem dhCommit_cli_x_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) (x : TryDecryptGhost) (trG : TrGhost) (tr : TripleRatchet (List (BitVec 8))) (st1 : SessionState (List (BitVec 8))) (sc : SenderChain) (receiverChainKey : ChainKey) (newSenderKey : KeyPair) @@ -775,7 +775,7 @@ theorem s3_commit_pinned_tight_placed_ok_cli [LibsignalPlacement] {M : AllocCost (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) (hlr_alloc : LsRetAddr624 (entry + 0xa00#64) := by first | assumption @@ -811,7 +811,7 @@ theorem s3_commit_tight_placed_ok_cli [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) (hlr_alloc : LsRetAddr624 (entry + 0xa00#64) := by first | assumption @@ -841,7 +841,7 @@ theorem s3_commit_pinned_placed_ok_cli [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) (hlr_alloc : LsRetAddr624 (entry + 0xa00#64) := by first | assumption @@ -871,7 +871,7 @@ theorem s3_commit_placed_ok_cli [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) (hlr_alloc : LsRetAddr624 (entry + 0xa00#64) := by first | assumption @@ -903,7 +903,7 @@ theorem s3_commit_pinned_x_placed_ok_cli [LibsignalPlacement] {M : AllocCostMode (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) (hlr_alloc : LsRetAddr624 (entry + 0xa00#64) := by first | assumption @@ -941,7 +941,7 @@ theorem s3_commit_x_placed_ok_cli [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) (hlr_alloc : LsRetAddr624 (entry + 0xa00#64) := by first | assumption @@ -978,7 +978,7 @@ theorem s3_commit_433_pinned_tight_placed_ok [LibsignalPlacement] {M : AllocCost (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : CliS3CommitSeamPinnedTightPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S s3CommitDefaultEnv := s3_commit_pinned_tight_placed_ok_cli (dhCommitBlockVmWp_549 H) C A lim ctl uuidTryParse S @@ -1004,7 +1004,7 @@ theorem s3_commit_433_pinned_tight_budget_placed_ok [LibsignalPlacement] {M : Al (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : CliS3CommitSeamPinnedTightPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S s3CommitDefaultEnv := s3_commit_433_pinned_tight_placed_ok H C A lim ctl S @@ -1031,7 +1031,7 @@ theorem s3_commit_433_tight_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : CliS3CommitSeamTightPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S s3CommitDefaultEnv := (s3_commit_433_pinned_tight_placed_ok H C A lim ctl S @@ -1057,7 +1057,7 @@ theorem s3_commit_433_tight_budget_placed_ok [LibsignalPlacement] {M : AllocCost (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : CliS3CommitSeamTightPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S s3CommitDefaultEnv := (s3_commit_433_pinned_tight_budget_placed_ok H C A lim ctl S @@ -1083,7 +1083,7 @@ theorem s3_commit_433_pinned_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : CliS3CommitSeamPinnedPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S s3CommitDefaultEnv := CliS3CommitSeamPinnedPlaced.ofTight (s3_commit_433_pinned_tight_placed_ok H C A lim ctl S @@ -1109,7 +1109,7 @@ theorem s3_commit_433_pinned_budget_placed_ok [LibsignalPlacement] {M : AllocCos (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : CliS3CommitSeamPinnedPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S s3CommitDefaultEnv := CliS3CommitSeamPinnedPlaced.ofTight (s3_commit_433_pinned_tight_budget_placed_ok H C A lim ctl S @@ -1135,7 +1135,7 @@ theorem s3_commit_433_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : CliS3CommitSeamPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S s3CommitDefaultEnv := (s3_commit_433_pinned_placed_ok H C A lim ctl S @@ -1161,7 +1161,7 @@ theorem s3_commit_433_budget_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : CliS3CommitSeamPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S s3CommitDefaultEnv := (s3_commit_433_pinned_budget_placed_ok H C A lim ctl S @@ -1189,7 +1189,7 @@ theorem s3_commit_433_pinned_x_placed_ok [LibsignalPlacement] {M : AllocCostMode (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) : CliS3CommitSeamPinnedXPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C decFn A lim ctl uuidTryParse S s3CommitDefaultEnv := s3_commit_pinned_x_placed_ok_cli (dhCommitBlockVmWp_549 H) C decFn A lim ctl uuidTryParse S @@ -1217,7 +1217,7 @@ theorem s3_commit_433_pinned_x_budget_placed_ok [LibsignalPlacement] {M : AllocC (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) : CliS3CommitSeamPinnedXPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C decFn A lim ctl uuidTryParse S s3CommitDefaultEnv := s3_commit_433_pinned_x_placed_ok H C decFn A lim ctl S @@ -1246,7 +1246,7 @@ theorem s3_commit_433_x_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) : CliS3CommitSeamXPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C decFn A lim ctl uuidTryParse S s3CommitDefaultEnv := (s3_commit_433_pinned_x_placed_ok H C decFn A lim ctl S @@ -1274,7 +1274,7 @@ theorem s3_commit_433_x_budget_placed_ok [LibsignalPlacement] {M : AllocCostMode (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) : CliS3CommitSeamXPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C decFn A lim ctl uuidTryParse S s3CommitDefaultEnv := (s3_commit_433_pinned_x_budget_placed_ok H C decFn A lim ctl S diff --git a/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommit433PlacedBudgetAux.lean b/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommit433PlacedBudgetAux.lean index 4cca26c95..7d631d4b5 100644 --- a/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommit433PlacedBudgetAux.lean +++ b/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommit433PlacedBudgetAux.lean @@ -57,6 +57,7 @@ open CryptoVerification.LibsignalTripleRatchet.Decrypt.DhCommit.DhCommitFacts ( evictGcs le_of_eq_succ_lt map_snd_evictGcs map_snd_zip_append sckWord0 sckWord16 sckWord20 sckWord28 sckWord8 vecAt_chains_eq zip_map_fst_snd) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FitsEnv FitsEvents RustCliAllocBudget rustCliAllocNoOomSpec rustCliDeallocBudgetSpec rustDeallocEvents) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedBudgetSpec) open LibsignalBinary.Proofs.SessionRecordAt.Stage1X.GrowOneXBudget (GrowOne104Env fitsEnv_growOne104_iff growOne104Events) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (chainKeyToPbSpecWithStack framelessMemcpyBudgetSpec noAllocShimBudgetSpec publicKeySerializeSpecWithStack) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhCommitMainBudgetCore (DhCommitBlockVmWp DhCommitEnv dhCommitAllocEvents fitsEvents_of_fitsEnv_dhCommitEnv) @@ -65,7 +66,6 @@ open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhCommitMainBudgetStep5 (dhCom open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhCommitStep12Budget (dhCommitStep12Events dhCommitStep12Pre dhCommit_step1_2_withStack_placed) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhCommitStep3Budget (CommitStep3bVmWp DhCommitStep3BlockWp dhCommitStep3Events dhCommitStep3aEvents growOneSpecWithStack) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.RootBudgetAux (TrGhostCaps dhStepNewChainsCap s3AfterCaps trGhostCaps) -open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemmoveBudgetSpec) set_option maxRecDepth 200000 set_option maxHeartbeats 400000 @@ -640,7 +640,7 @@ theorem dhCommit_pinned_withStack_env_of_wp [LibsignalPlacement] {M : AllocCostM (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropStk)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropStk)) (x : TryDecryptGhost) (trG : TrGhost) (tr : TripleRatchet (List (BitVec 8))) (st1 : SessionState (List (BitVec 8))) (sc : SenderChain) (receiverChainKey : ChainKey) (newSenderKey : KeyPair) (finalRootKey : RootKey) (senderChainKey : ChainKey) diff --git a/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommitClMainPlacedBudget.lean b/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommitClMainPlacedBudget.lean index bf2c643ab..19764efaa 100644 --- a/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommitClMainPlacedBudget.lean +++ b/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommitClMainPlacedBudget.lean @@ -91,6 +91,7 @@ open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhCommitClStep3PlacedBudge open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhCommitClStep4PlacedBudget ( dhCommit_step4_cl_of_wp ) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( chainKeyToPbSpec framelessMemcpyBudgetSpec noAllocShimBudgetSpec publicKeySerializeSpec ) @@ -109,7 +110,6 @@ open LibsignalBinary.Proofs.TripleRatchet.Decrypt.RootBudgetAux ( dhStepNewChainsCap s3AfterCaps trGhostCaps ) open LibsignalBinary.Proofs.TripleRatchet.Getters.DefsBudget (dropChainSpec) -open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemmoveBudgetSpec) /-- Pinned-capacity total-correctness CLI S3 Commit (`+0x8ac → +0x3e4`) with `withLsCodeLoaded` cross-block callees (`hPkSer`, `hToPb`, `hGrowOne`, `hDropChain`). -/ @@ -129,7 +129,7 @@ theorem dhCommit_cli_cl_pinned_placed_ok [LibsignalPlacement] {M : AllocCostMode (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) (x : TryDecryptGhost) (trG : TrGhost) (tr : TripleRatchet (List (BitVec 8))) (st1 : SessionState (List (BitVec 8))) (sc : SenderChain) (receiverChainKey : ChainKey) (newSenderKey : KeyPair) @@ -479,7 +479,7 @@ theorem s3_commit_pinned_cl_budget_placed_ok_cli [LibsignalPlacement] {M : Alloc (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocBudgetSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) (hlr_alloc : LsRetAddr624 (entry + 0xa00#64) := by first | assumption @@ -518,7 +518,7 @@ theorem s3_commit_pinned_cmk_cl_budget_placed_ok_cli [LibsignalPlacement] {M : A (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocBudgetSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) (hlr_alloc : LsRetAddr624 (entry + 0xa00#64) := by first | assumption diff --git a/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommitClStep4PlacedBudget.lean b/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommitClStep4PlacedBudget.lean index 3dfb3a5dc..0c55209c1 100644 --- a/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommitClStep4PlacedBudget.lean +++ b/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhCommitClStep4PlacedBudget.lean @@ -9,6 +9,7 @@ limitations under the License. module +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.Placed.ElfLsRetAddr public import LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhCommitMainBudgetStep4 public meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep @@ -48,6 +49,9 @@ open CryptoVerification.LibsignalTripleRatchet.Decrypt.DhCommit.DhCommitFacts ( ult_five_eq_false_of_le_five ult_five_of_ge_six ult_six_eq_false_of_not_lt_six ult_six_of_lt_six) open CryptoVerification.RustHeap (vecBuf) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FreeOnlyEvs RustCliAllocBudget) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove ( + MemmoveArithBound sessionMemmoveBoundedBudgetSpec +) open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (LsRetAddr624 lsLen) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhCommitMainBudgetStep4 ( CommitStep4aGeVmWp CommitStep4aLoVmWp CommitStep4bPostMemmoveVmWp CommitStep4bPreMemmoveVmWp @@ -104,6 +108,15 @@ private theorem steps_of_call_no_panic_cl [LibsignalPlacement] {α : Type} {prog · rw [hexit_false code s1, satisfies_pure_sepConj] at hpost1; exact False.elim hpost1.1 · rw [hoom_false s1, satisfies_pure_sepConj] at hpost1; exact False.elim hpost1.1 +private theorem repAlloc_live_noWrap {M : AllocCostModel} (A : RustCliAllocBudget M) + (p : BitVec 64) (n al : Nat) : + A.repAlloc.live p n al ⊢ ⌜p.toNat + n < 2 ^ 64⌝ ∗ A.repAlloc.live p n al := by + simp only [RustCliAllocBudget.repAlloc_live] + refine Entails.trans (A.block_valid p n al) ?_ + apply Entails.pure_left + rintro ⟨_, _, hnw, _⟩ + exact Entails.pure_right hnw (Entails.refl _) + /-- Single iteration of the receiver-chain eviction loop (`+0xb04 → +0xb8c`) for `gc₀ :: gcs` with `withLsCodeLoaded lsmpl` on `hDrop`, yielding `FreeOnlyEvs evs`. -/ theorem dhCommit_evict_one_cl_of_wp [LibsignalPlacement] @@ -111,7 +124,7 @@ theorem dhCommit_evict_one_cl_of_wp [LibsignalPlacement] {stk : Nat} {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (st : M.σ) (hwp_pre : CommitStep4bPreMemmoveVmWp prog entry memmoveEntry) (hwp_post : CommitStep4bPostMemmoveVmWp prog entry dropChainEntry) - (hMemmove : subroutine_ok prog memmoveEntry (sessionMemmoveBudgetSpec stk)) + (hMemmove : subroutine_ok prog memmoveEntry (sessionMemmoveBoundedBudgetSpec stk)) (hDrop : subroutine_ok prog dropChainEntry (withLsCodeLoaded lsmpl (dropChainSpecWithStack stk M A lim))) (R Frame : SepProp) (s0 s : State) @@ -165,6 +178,12 @@ theorem dhCommit_evict_one_cl_of_wp [LibsignalPlacement] rw [sepExists_sepConj_left, satisfies_sepExists] at hexp_pull; rcases hexp_pull with ⟨bs_rest, hexp_pull⟩ rw [sepConj_assoc, satisfies_pure_sepConj] at hexp_pull rcases hexp_pull with ⟨⟨hpad₀, hrest, hbs_len, hcap_le, hcap_lt, hptr, _hcap_ne⟩, hm0⟩ + have hnw : chainsPtr.toNat + chainsCap.toNat * 104 < 2 ^ 64 := by + have h := Satisfies.mono + (sepConj_mono_left (sepConj_mono_left + (repAlloc_live_noWrap A chainsPtr (chainsCap.toNat * 104) 8))) hm0 + simp only [sepConj_assoc, satisfies_pure_sepConj] at h + exact h.1 have hsrk_pull : s.mem ⊨ chainHeap A.repAlloc gc₀ ∗ (A.repAlloc.live chainsPtr (chainsCap.toNat * 104) 8 ∗ (chainsPtr ↦ₛ chainBytes gc₀ pad₀) ∗ ((chainsPtr + 104#64) ↦ₛ bs_rest) ∗ @@ -238,13 +257,20 @@ theorem dhCommit_evict_one_cl_of_wp [LibsignalPlacement] have hcomb_bytes : (chainsPtr ↦ₛ (b₀ ++ bs_rest)) = (chainsPtr ↦ₛ b₀) ∗ ((chainsPtr + 104#64) ↦ₛ bs_rest) := by rw [pointsToBytes_append, hb₀_len] have hx2_toNat : (s1.readReg64 .x2).toNat = gcs.length * 104 := by rw [hx2_1, List.length_cons]; exact memmove_len_toNat hlen_lt + have hbound : MemmoveArithBound chainsPtr (b₀ ++ bs_rest) := by + have hmul : (gcs.length + 1) * 104 ≤ chainsCap.toNat * 104 := + Nat.mul_le_mul_right 104 hcap_le + refine ⟨?_, ?_⟩ <;> rw [List.length_append, hb₀_len, hbs_len] <;> omega have hm_memmove : s1.mem ⊨ - (sessionMemmoveBudgetSpec stk).pre (chainsPtr, b₀ ++ bs_rest, 0, 104, gcs.length * 104) s1 ∗ + (sessionMemmoveBoundedBudgetSpec stk).pre (chainsPtr, b₀ ++ bs_rest, 0, 104, gcs.length * 104) s1 ∗ ((((sp + 0x40#64) ↦₆₄ chainsPtr) ∗ ((sp + 0x48#64) ↦₆₄ BitVec.ofNat 64 (gc₀ :: gcs).length) ∗ memRegion (sp + 0x190#64) 104 ∗ cells500 sp c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 ∗ A.repAlloc.live chainsPtr (chainsCap.toNat * 104) 8 ∗ memRegion (chainsPtr + BitVec.ofNat 64 ((gcs.length + 1) * 104)) ((chainsCap.toNat - (gcs.length + 1)) * 104) ∗ chainHeap A.repAlloc gc₀ ∗ chainHeaps A.repAlloc gcs ∗ A.pool lim st s1 ∗ Frame) ∗ R) := by + dsimp only [sessionMemmoveBoundedBudgetSpec] + rw [sepConj_assoc, satisfies_pure_sepConj] + refine ⟨hbound, ?_⟩ dsimp only [sessionMemmoveBudgetSpec, sessionMemmoveSpec, libcMemmoveSpec, cells500] have ⟨hb1, hb2⟩ := memmove_bounds (n := gcs.length); rw [hsp1, sepConj_assoc, satisfies_pure_sepConj] refine ⟨by rw [BitVec.add_zero, List.length_append, hb₀_len, hbs_len]; exact ⟨hx0_1, hx1_1, hx2_toNat, hb1, hb2⟩, ?_⟩ @@ -253,7 +279,7 @@ theorem dhCommit_evict_one_cl_of_wp [LibsignalPlacement] refine steps_of_call_no_panic_cl hMemmove hpc1 hrun1 hsp_align1 hx30_1 hm_memmove hcl1 hL1 (by intro _; rfl) (by intros; rfl) (by intro _; rfl) ?_ intro s2 hpc2 hrun2 hsp2 hsp_align2 hcs2 hcl2 hL2 hm_s2 - dsimp only [sessionMemmoveBudgetSpec, sessionMemmoveSpec] at hm_s2 + dsimp only [sessionMemmoveBoundedBudgetSpec, sessionMemmoveBudgetSpec, sessionMemmoveSpec] at hm_s2 rw [hsp1, sepConj_assoc, satisfies_pure_sepConj] at hm_s2; rcases hm_s2 with ⟨hvm2, hm_s2⟩ rw [sepConj_assoc, satisfies_pure_sepConj] at hm_s2; rcases hm_s2 with ⟨⟨_hx0_2, htr2⟩, hm_s2⟩ rw [← A.pool_transport lim st s1 s2 hvm2] at hm_s2 @@ -360,7 +386,7 @@ private theorem dhCommit_evict_loop_cl_of_wp [LibsignalPlacement] (hwp_pre : CommitStep4bPreMemmoveVmWp prog entry memmoveEntry) (hwp_post : CommitStep4bPostMemmoveVmWp prog entry dropChainEntry) (hwp_4c_hi : CommitStep4cHiVmWp prog entry) (hwp_4c_le : CommitStep4cLeVmWp prog entry) - (hMemmove : subroutine_ok prog memmoveEntry (sessionMemmoveBudgetSpec stk)) + (hMemmove : subroutine_ok prog memmoveEntry (sessionMemmoveBoundedBudgetSpec stk)) (hDropChain : subroutine_ok prog dropChainEntry (withLsCodeLoaded lsmpl (dropChainSpecWithStack stk M A lim))) (R Frame : SepProp) (s0 : State) (sp chainsCap chainsPtr : BitVec 64) (gcs : List (ChainGhost × ReceiverChain)) @@ -455,7 +481,7 @@ theorem dhCommit_step4_cl_of_wp [LibsignalPlacement] (hwp_post : CommitStep4bPostMemmoveVmWp prog entry dropChainEntry) (hwp_4c_hi : CommitStep4cHiVmWp prog entry) (hwp_4c_le : CommitStep4cLeVmWp prog entry) - (hMemmove : subroutine_ok prog memmoveEntry (sessionMemmoveBudgetSpec stk)) + (hMemmove : subroutine_ok prog memmoveEntry (sessionMemmoveBoundedBudgetSpec stk)) (hDropChain : subroutine_ok prog dropChainEntry (withLsCodeLoaded lsmpl (dropChainSpecWithStack stk M A lim))) (R Frame : SepProp) (s0 s : State) diff --git a/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhStep433PlacedBudget.lean b/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhStep433PlacedBudget.lean index fca419147..62b64be69 100644 --- a/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhStep433PlacedBudget.lean +++ b/LibsignalBinary/Proofs/Cli/TripleRatchet/Decrypt/DhStep433PlacedBudget.lean @@ -92,6 +92,7 @@ open LibsignalBinary.Heap ( rustCliAllocBudgetSpec rustCliAllocNoOomSpec rustCliDeallocBudgetSpec subroutine_ok_allocNoOom_of_budget ) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedBudgetSpec) open LibsignalBinary.Proofs.SessionRecordAt.Stage1X.GrowOneXBudget (growOneChainSpecX) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( chainKeyToPbSpec chainKeyToPbSpecX derivePublicKeyBytesBudgetSpec framelessMemcpyBudgetSpec @@ -119,7 +120,6 @@ open LibsignalBinary.Proofs.TripleRatchet.Decrypt.OnPanicTightBudget ( ) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.RootBudgetAux (s3AfterCaps trGhostCaps) open LibsignalBinary.Proofs.TripleRatchet.Getters.DefsBudget (dropChainSpec dropChainSpecX) -open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemmoveBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Keys.DefsBudget ( createChainSpec createChainSpecWithStack createChainSpecX ) @@ -998,7 +998,7 @@ theorem dhStep_433_pinned_cro_placed_okT [LibsignalPlacement] {M : AllocCostMode (hAlloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3TightSeamPinnedPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S (s3DefaultEnv C) := s3_pinned_cro_placed_okT_cli (dhStepBlockVmWp_549 H) C A lim ctl S hcc hdpk hrng hsd (s3_commit_433_pinned_placed_ok H C A lim ctl spqrNoPanic hPkSer hToPb hGrowOne hDropChain hShim hAlloc hDealloc hMemcpy hMemmove) @@ -1018,7 +1018,7 @@ theorem dhStep_433_pinned_cro_budget_placed_okT [LibsignalPlacement] {M : AllocC (hAlloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustAllocSym) (rustCliAllocBudgetSpec M A lim false)) (hDealloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3TightSeamPinnedPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S (s3DefaultEnv C) := dhStep_433_pinned_cro_placed_okT H C A lim ctl S hcc hdpk hrng hsd hPkSer hToPb hGrowOne hDropChain hShim (subroutine_ok_allocNoOom_of_budget hAlloc) hDealloc hMemcpy hMemmove @@ -1038,7 +1038,7 @@ theorem dhStep_433_cro_placed_okT [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3TightSeamPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S (s3DefaultEnv C) := (dhStep_433_pinned_cro_placed_okT H C A lim ctl S hcc hdpk hrng hsd hPkSer hToPb hGrowOne hDropChain hShim hAlloc hDealloc hMemcpy hMemmove).toUnpinned @@ -1057,7 +1057,7 @@ theorem dhStep_433_cro_budget_placed_okT [LibsignalPlacement] {M : AllocCostMode (hAlloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustAllocSym) (rustCliAllocBudgetSpec M A lim false)) (hDealloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3TightSeamPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S (s3DefaultEnv C) := (dhStep_433_pinned_cro_budget_placed_okT H C A lim ctl S hcc hdpk hrng hsd hPkSer hToPb hGrowOne hDropChain hShim hAlloc hDealloc hMemcpy hMemmove).toUnpinned @@ -1076,7 +1076,7 @@ theorem dhStep_433_pinned_placed_okT [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3TightSeamPinnedPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S (s3DefaultEnv C) := dhStep_433_pinned_cro_placed_okT H C A lim ctl S (subroutine_ok_withLsCodeRoLoaded_of_plain hcc) @@ -1099,7 +1099,7 @@ theorem dhStep_433_pinned_budget_placed_okT [LibsignalPlacement] {M : AllocCostM (hAlloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustAllocSym) (rustCliAllocBudgetSpec M A lim false)) (hDealloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3TightSeamPinnedPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S (s3DefaultEnv C) := dhStep_433_pinned_placed_okT H C A lim ctl S hcc hdpk hrng hsd hPkSer hToPb hGrowOne hDropChain hShim (subroutine_ok_allocNoOom_of_budget hAlloc) hDealloc hMemcpy hMemmove @@ -1119,7 +1119,7 @@ theorem dhStep_433_placed_okT [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3TightSeamPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S (s3DefaultEnv C) := (dhStep_433_pinned_placed_okT H C A lim ctl S hcc hdpk hrng hsd hPkSer hToPb hGrowOne hDropChain hShim hAlloc hDealloc hMemcpy hMemmove).toUnpinned @@ -1138,7 +1138,7 @@ theorem dhStep_433_budget_placed_okT [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustAllocSym) (rustCliAllocBudgetSpec M A lim false)) (hDealloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3TightSeamPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S (s3DefaultEnv C) := (dhStep_433_pinned_budget_placed_okT H C A lim ctl S hcc hdpk hrng hsd hPkSer hToPb hGrowOne hDropChain hShim hAlloc hDealloc hMemcpy hMemmove).toUnpinned @@ -1159,7 +1159,7 @@ theorem dhStep_433_pinned_x_cro_budget_placed_ok [LibsignalPlacement] {M : Alloc (hAlloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustAllocSym) (rustCliAllocBudgetSpec M A lim false)) (hDealloc : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) : + (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) : CliS3SeamPinnedXPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C decFn A lim ctl uuidTryParse S (s3DefaultEnv C) := s3_pinned_x_cro_placed_ok_cli (dhStepBlockVmWp_549 H) C decFn A lim ctl uuidTryParse S hcc hdpk hrng hsd (s3_commit_433_pinned_x_budget_placed_ok H C decFn A lim ctl S hPkSer hToPb hGrowOne hDropChain hShim hAlloc hDealloc hMemcpy hMemmove) diff --git a/LibsignalBinary/Proofs/E2E/Pqxdh/Shared/VerifySignaturePlacedA2Sat.lean b/LibsignalBinary/Proofs/E2E/Pqxdh/Shared/VerifySignaturePlacedA2Sat.lean new file mode 100644 index 000000000..a18d2210f --- /dev/null +++ b/LibsignalBinary/Proofs/E2E/Pqxdh/Shared/VerifySignaturePlacedA2Sat.lean @@ -0,0 +1,365 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedASat -- proof-setup: allow-public-import +import LibsignalBinary.Proofs.Common.SharedHelpers +meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep +import LibsignalBinary.Proofs.ConsumeMessageKey.HmacProofs.NewFromSliceInvariants +import LibsignalBinary.Proofs.Placed.BridgeReloc +import LibsignalBinary.Proofs.TripleRatchet.ConsumeMessageKeyTransfer.CtEqRO +import LibsignalBinary.Proofs.TripleRatchet.Keys.CreateChain + +/-! +# `HookSat`-backed `black_box` Sibling of `VerifySignaturePlacedA` Segments 2 and 3a + +Proves `verifySig_seg2_1569_placed_sat`, `verifySig_seg2_33_placed_sat`, and +`verifySig_seg3a_placed_sat` for unmutated Block `204` (`verify_signature_for_multipart_message`) +under `[LibsignalPlacement]` and `VerifySignaturePlacedHooks'Sat P H`, completing the Segment 2–3 +`HookSat` siblings alongside `VerifySignaturePlacedASat.verifySig_seg3b_placed_sat`. +-/ + +public section + +set_option autoImplicit false +set_option maxRecDepth 200000 + +open scoped CryptoVerification.E2E.Pqxdh.Shared + +namespace LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedA2Sat + +open Arm64 ProofLib ProofLib.ProgramReflection +open CryptoVerification + (LibsignalHooks LibsignalPlacement blkPC_204 blkPl_204 ls_hook_ok_any) +open CryptoVerification.E2E.Pqxdh.Shared + (and64_mask255_ite_1_0 blockBuf_tail32_pack blockBuf_tail32_unpack bv_add_neg64 bv_sub_sub_lit + bytesToBv8 bytesToBv8_append cell_split7 cells_10_merge cells_16_merge csinc_eq_zero32_ite_1_0 + exists_pad97_cells exists_unpack64_of_length_64 exists_unpack64_revWords64_of_length_64 first7 + first7_pack fitBv8 fitBv8_64_sha512CompressOutBytes pqxdhHookStack + readReg32_setMem_setPC_pre readReg32_setPC_pre readReg64_setMem_setPC_pre readReg64_setPC_pre + readReg_setMem_setPC_pre readReg_setPC_pre revWords64 revWords64_length sha512CompressOutBytes + sha512CompressOutBytes_length sp_setMem_setPC_pre sp_setPC_pre) +open LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedASat + (VerifySignaturePlacedHooks'Sat) +open SignalPqxdh (Bytes Primitives encodeBitLen128BE encodeBitLen64BE) + +attribute [local irreducible] Program.fetch Program.externAt? Program.fnAddr Program.fnOff +attribute [local arm64_norm] bv_sub_add_lit BitVec.toNat_zero bv_sub_sub_lit bv_add_neg64 + +private theorem calleeSavedVRegs_setPC_pre_placed (s : State) (pc : BitVec 64) : + calleeSavedVRegs (s.setPC pc) = calleeSavedVRegs s := calleeSavedVRegs_setPC s pc + +private theorem calleeSavedVRegs_setMem_setPC_pre_placed (s : State) (m : Memory) (pc : BitVec 64) : + calleeSavedVRegs ((s.setMem m).setPC pc) = calleeSavedVRegs s := by + rw [calleeSavedVRegs_setPC, calleeSavedVRegs_setMem] + +attribute [local arm64_norm ↓, local wp_norm ↓] + sp_setPC_pre sp_setMem_setPC_pre readReg64_setPC_pre readReg64_setMem_setPC_pre + readReg32_setPC_pre readReg32_setMem_setPC_pre readReg_setPC_pre readReg_setMem_setPC_pre + calleeSavedVRegs_setPC_pre_placed calleeSavedVRegs_setMem_setPC_pre_placed + +attribute [local simp, local arm64_norm, local wp_norm, local arm64_norm ↓, local wp_norm ↓] + and64_mask255_ite_1_0 csinc_eq_zero32_ite_1_0 + +set_option maxHeartbeats 1600000 in +public theorem verifySig_seg2_1569_placed_sat [LibsignalPlacement] + (P : Primitives) (H : LibsignalHooks) (hH : VerifySignaturePlacedHooks'Sat P H) + (s : State) (fsp slicesPtr msgPtr : BitVec 64) (pre64 m st0 : Bytes) (Frame : SepProp) + (hpre64 : pre64.length = 64) (hm : m.length = 1569) (_hst0 : st0.length = 64) + (hfsp_align : fsp &&& 15#64 == 0#64) (hrun : s.status = ExecStatus.Running) + (hpc : s.pc = (blkPl_204).base + 320#64) + (hsp : s.sp = fsp) (hx20 : s.readReg64 (.gpr 20#5) = slicesPtr) + (hx21 : s.readReg64 (.gpr 21#5) = 1#64) : + SepWP ((blkPC_204).rebase (blkPl_204).base H) + ((blkPl_204).base + 548#64) s + ((slicesPtr ↦₆₄ msgPtr) ∗ ((slicesPtr + 8#64) ↦₆₄ 1569#64) ∗ (msgPtr ↦ₛ bytesToBv8 m) ∗ + ((fsp + 560#64) ↦ₛ bytesToBv8 pre64) ∗ memRegion (fsp + 624#64) 63 ∗ + ((fsp + 687#64) ↦₈ 64#8) ∗ ((fsp + 688#64) ↦ₛ bytesToBv8 st0) ∗ ((fsp + 752#64) ↦₆₄ 0#64) ∗ + ((fsp + 760#64) ↦₆₄ 0#64) ∗ stackAt fsp pqxdhHookStack ∗ Frame) + (fun sm Pm => + (Pm ⊢ + (slicesPtr ↦₆₄ msgPtr) ∗ ((slicesPtr + 8#64) ↦₆₄ 1569#64) ∗ (msgPtr ↦ₛ bytesToBv8 m) ∗ + ((fsp + 560#64) ↦ₛ bytesToBv8 (m.drop 1472)) ∗ memRegion (fsp + 657#64) 30 ∗ + ((fsp + 687#64) ↦₈ 97#8) ∗ + ((fsp + 688#64) ↦ₛ bytesToBv8 + (sha512CompressOutBytes P (sha512CompressOutBytes P st0 (pre64 ++ m.take 64)) + ((m.drop 64).take 1408))) ∗ + ((fsp + 752#64) ↦₆₄ 12#64) ∗ ((fsp + 760#64) ↦₆₄ 0#64) ∗ + stackAt fsp pqxdhHookStack ∗ Frame) ∧ + sm.status = ExecStatus.Running ∧ + sm.pc = (blkPl_204).base + 548#64 ∧ sm.sp = fsp ∧ + sm.readReg64 (.gpr 23#5) = s.readReg64 (.gpr 23#5) ∧ + sm.readReg64 (.gpr 29#5) = s.readReg64 (.gpr 29#5) ∧ + calleeSavedVRegs sm = calleeSavedVRegs s ∧ sm.trace = s.trace) := by + have hmemcpy := ls_hook_ok_any (prog := (blkPC_204).rebase (blkPl_204).base H) hH.memcpy + have hsha := ls_hook_ok_any (prog := (blkPC_204).rebase (blkPl_204).base H) hH.sha512Compress + clear hH + have hlen_m64_bv : (bytesToBv8 (m.take 64)).length = 64 := by simp [bytesToBv8, hm] + have hlen_m1408 : ((m.drop 64).take 1408).length = 128 * 11 := by simp [hm] + have hlen_m1408_bv : (bytesToBv8 ((m.drop 64).take 1408)).length = 1408 := by + simp [bytesToBv8, hm] + have hlen_m97_bv : (bytesToBv8 (m.drop 1472)).length = 97 := by simp [bytesToBv8, hm] + have hlen_pre_bv : (bytesToBv8 pre64).length = 64 := by simp [bytesToBv8, hpre64] + have hlen_blk0 : (pre64 ++ m.take 64).length = 128 * 1 := by simp [hpre64, hm] + have hlen_blk0_bv : (bytesToBv8 (pre64 ++ m.take 64)).length = 128 := by + simp [bytesToBv8, hpre64, hm] + have hst1_len : (sha512CompressOutBytes P st0 (pre64 ++ m.take 64)).length = 64 := + sha512CompressOutBytes_length P _ _ + have hm_split : msgPtr ↦ₛ bytesToBv8 m = + ((msgPtr ↦ₛ bytesToBv8 (m.take 64)) ∗ + ((msgPtr + 64#64) ↦ₛ bytesToBv8 ((m.drop 64).take 1408)) ∗ + ((msgPtr + 1472#64) ↦ₛ bytesToBv8 (m.drop 1472))) := by + have h1 : m = m.take 64 ++ ((m.drop 64).take 1408 ++ m.drop 1472) := by + have ha : (m.drop 64).take 1408 ++ m.drop 1472 = m.drop 64 := by + rw [show (1472 : Nat) = 64 + 1408 from rfl, ← List.drop_drop, List.take_append_drop] + rw [ha, List.take_append_drop] + conv => lhs; rw [h1, bytesToBv8_append, bytesToBv8_append] + rw [pointsToBytes_append, pointsToBytes_append, hlen_m64_bv, hlen_m1408_bv] + have h64 : BitVec.ofNat 64 64 = 64#64 := rfl + have h1408 : 64#64 + BitVec.ofNat 64 1408 = 1472#64 := rfl + rw [h64, BitVec.add_assoc, h1408] + have hbuf64_in : memRegion (fsp + 624#64) 63 ∗ ((fsp + 687#64) ↦₈ 64#8) ⊢ + memRegion (fsp + 624#64) (bytesToBv8 (m.take 64)).length := by + rw [hlen_m64_bv, ProofLib.memRegion_split' (b := fsp + 624#64) (n := 63) (k := 1) + (b' := fsp + 687#64) rfl (by bv_omega) (by decide), ProofLib.memRegion_one] + exact sepConj_mono_right (Entails.sepExists_intro 64#8) + have hbuf128_weaken : ((fsp + 560#64) ↦ₛ bytesToBv8 (pre64 ++ m.take 64)) ⊢ + memRegion (fsp + 560#64) (bytesToBv8 (m.drop 1472)).length ∗ memRegion (fsp + 657#64) 30 ∗ + (∃∗ b687 : BitVec 8, (fsp + 687#64) ↦₈ b687) := by + refine Entails.trans (Q := memRegion (fsp + 560#64) 128) ?_ (Entails.of_eq ?_) + · rw [← hlen_blk0_bv]; exact pointsToBytes_entails_memRegion _ _ + · rw [hlen_m97_bv, ProofLib.memRegion_split' (b := fsp + 560#64) (n := 97) (k := 31) + (b' := fsp + 657#64) rfl (by bv_omega) (by decide), + ProofLib.memRegion_split' (b := fsp + 657#64) (n := 30) (k := 1) + (b' := fsp + 687#64) rfl (by bv_omega) (by decide), ProofLib.memRegion_one] + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hm_split) (by sep_frame) + wp_steps + apply ProofLib.SepWP.replace_pre (hPQ := hbuf64_in) (by sep_frame) + wp_call hmemcpy ⟨fsp + 624#64, msgPtr, bytesToBv8 (m.take 64)⟩ + have hmerge128 : + ((fsp + 560#64) ↦ₛ bytesToBv8 pre64) ∗ ((fsp + 624#64) ↦ₛ bytesToBv8 (m.take 64)) = + ((fsp + 560#64) ↦ₛ bytesToBv8 (pre64 ++ m.take 64)) := by + rw [bytesToBv8_append, pointsToBytes_append, hlen_pre_bv, BitVec.add_assoc] + rfl + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hmerge128) (by sep_frame) + wp_steps + wp_call hsha ⟨fsp + 688#64, st0, fsp + 560#64, pre64 ++ m.take 64, 1⟩ + rw [fitBv8_64_sha512CompressOutBytes] + apply ProofLib.SepWP.replace_pre (hPQ := hbuf128_weaken) (by sep_frame) + simp only [sepExists_sepConj_left, sepExists_sepConj_right, sepConj_assoc] + apply SepWP.exists_left; intro _ + wp_steps + wp_call hsha ⟨fsp + 688#64, sha512CompressOutBytes P st0 (pre64 ++ m.take 64), msgPtr + 64#64, + (m.drop 64).take 1408, 11⟩ + rw [fitBv8_64_sha512CompressOutBytes] + wp_steps + wp_call hmemcpy ⟨fsp + 560#64, msgPtr + 1472#64, bytesToBv8 (m.drop 1472)⟩ + wp_steps + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hm_split.symm) (by sep_frame) + apply SepWP.done (by wp_norm_goal) (by wp_norm_lhs) + refine ⟨Entails.of_eq (by rw [hsp_sf_1, hsp_sf, hsp]; sep_ac_rfl), by wp_norm_goal, + by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, + by wp_norm_goal⟩ + +set_option maxHeartbeats 1600000 in +public theorem verifySig_seg2_33_placed_sat [LibsignalPlacement] + (P : Primitives) (H : LibsignalHooks) (hH : VerifySignaturePlacedHooks'Sat P H) + (s : State) (fsp slicesPtr msgPtr : BitVec 64) (pre64 m st0 : Bytes) (Frame : SepProp) + (hpre64 : pre64.length = 64) (hm : m.length = 33) (hfsp_align : fsp &&& 15#64 == 0#64) + (hrun : s.status = ExecStatus.Running) + (hpc : s.pc = (blkPl_204).base + 320#64) + (hsp : s.sp = fsp) (hx20 : s.readReg64 (.gpr 20#5) = slicesPtr) + (hx21 : s.readReg64 (.gpr 21#5) = 1#64) : + SepWP ((blkPC_204).rebase (blkPl_204).base H) + ((blkPl_204).base + 548#64) s + ((slicesPtr ↦₆₄ msgPtr) ∗ ((slicesPtr + 8#64) ↦₆₄ 33#64) ∗ (msgPtr ↦ₛ bytesToBv8 m) ∗ + ((fsp + 560#64) ↦ₛ bytesToBv8 pre64) ∗ memRegion (fsp + 624#64) 63 ∗ + ((fsp + 687#64) ↦₈ 64#8) ∗ ((fsp + 688#64) ↦ₛ bytesToBv8 st0) ∗ ((fsp + 752#64) ↦₆₄ 0#64) ∗ + ((fsp + 760#64) ↦₆₄ 0#64) ∗ stackAt fsp pqxdhHookStack ∗ Frame) + (fun sm Pm => + (Pm ⊢ + (slicesPtr ↦₆₄ msgPtr) ∗ ((slicesPtr + 8#64) ↦₆₄ 33#64) ∗ (msgPtr ↦ₛ bytesToBv8 m) ∗ + ((fsp + 560#64) ↦ₛ bytesToBv8 (pre64 ++ m)) ∗ memRegion (fsp + 657#64) 30 ∗ + ((fsp + 687#64) ↦₈ 97#8) ∗ ((fsp + 688#64) ↦ₛ bytesToBv8 st0) ∗ + ((fsp + 752#64) ↦₆₄ 0#64) ∗ ((fsp + 760#64) ↦₆₄ 0#64) ∗ stackAt fsp pqxdhHookStack ∗ + Frame) ∧ + sm.status = ExecStatus.Running ∧ + sm.pc = (blkPl_204).base + 548#64 ∧ sm.sp = fsp ∧ + sm.readReg64 (.gpr 23#5) = s.readReg64 (.gpr 23#5) ∧ + sm.readReg64 (.gpr 29#5) = s.readReg64 (.gpr 29#5) ∧ + calleeSavedVRegs sm = calleeSavedVRegs s ∧ sm.trace = s.trace) := by + have hmemcpy := ls_hook_ok_any (prog := (blkPC_204).rebase (blkPl_204).base H) hH.memcpy + clear hH + have hlen_pre_bv : (bytesToBv8 pre64).length = 64 := by simp [bytesToBv8, hpre64] + have hlen_m_bv : (bytesToBv8 m).length = 33 := by simp [bytesToBv8, hm] + have hbuf63_split : memRegion (fsp + 624#64) 63 = + memRegion (fsp + 624#64) (bytesToBv8 m).length ∗ memRegion (fsp + 657#64) 30 := by + rw [hlen_m_bv] + exact ProofLib.memRegion_split' (b := fsp + 624#64) (n := 33) (k := 30) (b' := fsp + 657#64) + rfl (by bv_omega) (by decide) + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hbuf63_split) (by sep_frame) + wp_steps + wp_call hmemcpy ⟨fsp + 624#64, msgPtr, bytesToBv8 m⟩ + have hmerge97 : + ((fsp + 560#64) ↦ₛ bytesToBv8 pre64) ∗ ((fsp + 624#64) ↦ₛ bytesToBv8 m) = + ((fsp + 560#64) ↦ₛ bytesToBv8 (pre64 ++ m)) := by + rw [bytesToBv8_append, pointsToBytes_append, hlen_pre_bv, BitVec.add_assoc] + rfl + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hmerge97) (by sep_frame) + wp_steps + apply SepWP.done (by wp_norm_goal) (by wp_norm_lhs) + refine ⟨Entails.of_eq (by sep_ac_rfl), by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, + by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, by wp_norm_goal⟩ + +set_option maxHeartbeats 2400000 in +/-- Segment 3a of Block `204` (`+548 .. +992`, SHA-512 final padding & `from_bytes_mod_order_wide`) + under `[LibsignalPlacement]` and `VerifySignaturePlacedHooks'Sat P H`. -/ +public theorem verifySig_seg3a_placed_sat [LibsignalPlacement] + (P : Primitives) (H : LibsignalHooks) (hH : VerifySignaturePlacedHooks'Sat P H) + (s : State) (fsp : BitVec 64) (tail97 st : Bytes) (blkCnt : BitVec 64) (L : Nat) + (Frame : SepProp) (htail97 : tail97.length = 97) (hst : st.length = 64) + (hblkL : (blkCnt = 0#64 ∧ L = 97) ∨ (blkCnt = 12#64 ∧ L = 1633)) + (hfsp_align : fsp &&& 15#64 == 0#64) (hrun : s.status = ExecStatus.Running) + (hpc : s.pc = (blkPl_204).base + 548#64) + (hsp : s.sp = fsp) (hx23 : s.readReg64 (.gpr 23#5) = fsp + 800#64) + (hx29 : s.readReg64 (.gpr 29#5) = fsp + 1152#64) : + SepWP ((blkPC_204).rebase (blkPl_204).base H) + ((blkPl_204).base + 992#64) s + (((fsp + 560#64) ↦ₛ bytesToBv8 tail97) ∗ memRegion (fsp + 657#64) 30 ∗ + ((fsp + 687#64) ↦₈ 97#8) ∗ ((fsp + 688#64) ↦ₛ bytesToBv8 st) ∗ ((fsp + 752#64) ↦₆₄ blkCnt) ∗ + ((fsp + 760#64) ↦₆₄ 0#64) ∗ memRegion (fsp + 768#64) 32 ∗ cells (fsp + 800#64) 16 ∗ + cells (fsp + 928#64) 10 ∗ cells (fsp + 1008#64) 16 ∗ stackAt fsp pqxdhHookStack ∗ Frame) + (fun sm Pm => + (Pm ⊢ cells (fsp + 560#64) 16 ∗ cells (fsp + 688#64) 10 ∗ + ((fsp + 768#64) ↦ₛ fitBv8 32 (P.scalarFromWide (revWords64 (sha512CompressOutBytes P st + (tail97 ++ [0x80] ++ List.replicate 14 0 ++ encodeBitLen128BE L))))) ∗ + cells (fsp + 800#64) 16 ∗ cells (fsp + 928#64) 10 ∗ cells (fsp + 1008#64) 16 ∗ + stackAt fsp pqxdhHookStack ∗ Frame) ∧ + sm.status = ExecStatus.Running ∧ + sm.pc = (blkPl_204).base + 992#64 ∧ sm.sp = fsp ∧ + sm.readReg64 (.gpr 23#5) = fsp + 800#64 ∧ sm.readReg64 (.gpr 29#5) = fsp + 1152#64 ∧ + calleeSavedVRegs sm = calleeSavedVRegs s ∧ sm.trace = s.trace) := by + have hmemset := ls_hook_ok_any (prog := (blkPC_204).rebase (blkPl_204).base H) hH.memset + have hsha := ls_hook_ok_any (prog := (blkPC_204).rebase (blkPl_204).base H) hH.sha512Compress + have hwide := ls_hook_ok_any (prog := (blkPC_204).rebase (blkPl_204).base H) hH.scalarWide + clear hH + obtain ⟨b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, _p12, _p13, hp1, hp2, hp3⟩ := + exists_pad97_cells htail97 + have hst_bv : (bytesToBv8 st).length = 64 := by simp [bytesToBv8, hst] + obtain ⟨w0, w1, w2, w3, w4, w5, w6, w7, hw_st⟩ := exists_unpack64_of_length_64 hst_bv + cells_pre_unfold_fast + wp_extract_exists + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (hp1 (fsp + 560#64))) (by sep_frame) + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (hw_st (fsp + 688#64))) (by sep_frame) + wp_simp_pre_fast [BitVec.add_assoc, BitVec.reduceAdd, sepConj_assoc] + apply ProofLib.SepWP.replace_pre + (hPQ := blockBuf_tail32_pack (fsp + 656#64) ((bytesToBv8 tail97).getD 96 0#8) 97#8) + (by sep_frame) + simp only [sepExists_sepConj_left, sepConj_assoc] + apply SepWP.exists_left; intro b12 + apply SepWP.exists_left; intro b13 + apply SepWP.exists_left; intro b14 + apply SepWP.exists_left; intro b15 + apply SepWP.pure_elim; rintro ⟨hb12, hb15⟩ + wp_steps + have hsp7 : ((fsp + 920#64) ↦₆₄ b15) = + (((fsp + 920#64) ↦ₛ first7 b15) ∗ ((fsp + 927#64) ↦₈ 97#8)) := by + rw [cell_split7 (fsp + 920#64) b15, hb15, BitVec.add_assoc]; rfl + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hsp7) (by sep_frame) + wp_steps + have hunpack32 := blockBuf_tail32_unpack (fsp + 896#64) b12 b13 b14 b15 + ((bytesToBv8 tail97).getD 96 0#8) 97#8 hb12 + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hunpack32 + apply ProofLib.SepWP.replace_pre (hPQ := hunpack32) (by sep_frame) + simp only [sepExists_sepConj_left, sepExists_sepConj_right, sepConj_assoc] + apply SepWP.exists_left; intro _ + wp_steps + wp_call hmemset (fsp + 898#64, 0#8, 30) + have hp2_896 := hp2 (fsp + 896#64) + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hp2_896 + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hp2_896) (by sep_frame) + wp_steps + have hbithi : rev64 (BitVec.truncate 64 ((0#64 ++ blkCnt) >>> 54)) = 0#64 := by + rcases hblkL with ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ <;> decide + have hbitlo : rev64 (blkCnt <<< 10 ||| 776#64) = rev64 (BitVec.ofNat 64 (8 * L)) := by + rcases hblkL with ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ <;> decide + have hL_or : L = 97 ∨ L = 1633 := hblkL.imp And.right And.right + have hp3_1008 := hp3 (fsp + 1008#64) hL_or + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hp3_1008 + have hw_st_928 := (hw_st (fsp + 928#64)).symm + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hw_st_928 + wp_simp_pre_fast [hbithi, hbitlo] + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hp3_1008) (by sep_frame) + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hw_st_928) (by sep_frame) + have hpad_len : + (tail97 ++ 128 :: (List.replicate 14 0 ++ encodeBitLen128BE L)).length = 128 := by + simp [encodeBitLen128BE, encodeBitLen64BE, htail97] + wp_call hsha ⟨fsp + 928#64, st, fsp + 1008#64, tail97 ++ [0x80] ++ List.replicate 14 0 ++ + encodeBitLen128BE L, 1⟩ + have hpad_norm : + tail97 ++ 128 :: (List.replicate 14 0 ++ encodeBitLen128BE L) = + tail97 ++ [0x80] ++ List.replicate 14 0 ++ encodeBitLen128BE L := by + simp [List.append_assoc] + wp_simp_pre_fast [fitBv8_64_sha512CompressOutBytes, hpad_norm] + have hst_out_len : + (sha512CompressOutBytes P st + (tail97 ++ [0x80] ++ List.replicate 14 0 ++ encodeBitLen128BE L)).length = 64 := + sha512CompressOutBytes_length P _ _ + obtain ⟨u0, u1, u2, u3, u4, u5, u6, u7, hu_st, hu_rev⟩ := + exists_unpack64_revWords64_of_length_64 hst_out_len + have hu_st_928 := hu_st (fsp + 928#64) + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hu_st_928 + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hu_st_928) (by sep_frame) + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hp3_1008.symm) (by sep_frame) + have hsp7_920 := cell_split7 (fsp + 920#64) (rev64 (BitVec.ofNat 64 (8 * L))) + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hsp7_920 + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hsp7_920) (by sep_frame) + wp_steps + have hpk7_920 := first7_pack (fsp + 920#64) (rev64 (BitVec.ofNat 64 (8 * L))) 0#8 + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hpk7_920 + apply ProofLib.SepWP.replace_pre (hPQ := hpk7_920) (by sep_frame) + simp only [sepExists_sepConj_left] + apply SepWP.exists_left; intro _ + wp_steps + have hu_rev_1008 := (hu_rev (fsp + 1008#64)).symm + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hu_rev_1008 + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hu_rev_1008) (by sep_frame) + have hrev_len : + (revWords64 (sha512CompressOutBytes P st + (tail97 ++ 128 :: (List.replicate 14 0 ++ encodeBitLen128BE L)))).length = 64 := + revWords64_length (sha512CompressOutBytes_length P _ _) + wp_call hwide ⟨fsp + 1008#64, revWords64 (sha512CompressOutBytes P st (tail97 ++ [0x80] ++ + List.replicate 14 0 ++ encodeBitLen128BE L)), fsp + 768#64⟩ + wp_simp_pre_fast [hpad_norm] + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hu_rev_1008.symm) (by sep_frame) + have hm560 := cells_16_merge (fsp + 560#64) b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hm560 + apply ProofLib.SepWP.replace_pre (hPQ := hm560) (by sep_frame) + have hm688 := cells_10_merge (fsp + 688#64) w0 w1 w2 w3 w4 w5 w6 w7 blkCnt 0#64 + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hm688 + apply ProofLib.SepWP.replace_pre (hPQ := hm688) (by sep_frame) + have hm800 := cells_16_merge (fsp + 800#64) + 0#64 0#64 0#64 0#64 0#64 0#64 0#64 0#64 0#64 0#64 0#64 0#64 0#64 0#64 0#64 0#64 + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hm800 + apply ProofLib.SepWP.replace_pre (hPQ := hm800) (by sep_frame) + have hm928 := cells_10_merge (fsp + 928#64) u0 u1 u2 u3 u4 u5 u6 u7 blkCnt 0#64 + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hm928 + apply ProofLib.SepWP.replace_pre (hPQ := hm928) (by sep_frame) + have hm1008 := cells_16_merge (fsp + 1008#64) + (rev64 u0) (rev64 u1) (rev64 u2) (rev64 u3) (rev64 u4) (rev64 u5) (rev64 u6) (rev64 u7) + 0#64 0#64 0#64 0#64 0#64 0#64 0#64 0#64 + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hm1008 + apply ProofLib.SepWP.replace_pre (hPQ := hm1008) (by sep_frame) + wp_simp_pre_fast [hsp_sf_1, hsp_sf, hsp] + apply SepWP.done (by wp_norm_goal) (by wp_norm_lhs) + refine ⟨Entails.of_eq (by sep_ac_rfl), by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, + by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, by wp_norm_goal⟩ + +end LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedA2Sat diff --git a/LibsignalBinary/Proofs/E2E/Pqxdh/Shared/VerifySignaturePlacedBSat.lean b/LibsignalBinary/Proofs/E2E/Pqxdh/Shared/VerifySignaturePlacedBSat.lean new file mode 100644 index 000000000..e36ce5ae5 --- /dev/null +++ b/LibsignalBinary/Proofs/E2E/Pqxdh/Shared/VerifySignaturePlacedBSat.lean @@ -0,0 +1,600 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedA2Sat -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedB -- proof-setup: allow-public-import +import LibsignalBinary.Proofs.Common.SharedHelpers +meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep +import LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignature +import LibsignalBinary.Proofs.TripleRatchet.Keys.CreateChain +import ProofLib.SepLogic.WPFrozen + +/-! +# `HookSat`-backed `black_box` Sibling of `VerifySignaturePlacedB` + +Proves `verifySig_seg1a_placed_sat`, `verifySig_seg1b_placed_sat`, `verifySig_seg1c_placed_sat`, +and `verifySig_tail_from_548_placed_sat` for unmutated Block `204` +(`verify_signature_for_multipart_message`) under `[LibsignalPlacement]` and +`VerifySignaturePlacedHooks'Sat P H`, reusing the hook-independent epilogue and invalid-branch +lemmas from `VerifySignaturePlacedB`. +-/ + +public section + +set_option autoImplicit false +set_option maxRecDepth 200000 + +open scoped CryptoVerification.E2E.Pqxdh.Shared + +namespace LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedBSat + +open Arm64 ProofLib ProofLib.ProgramReflection +open CryptoVerification + (LibsignalCodeLoaded LibsignalHooks LibsignalPlacement blkPC_204 blkPC_204_pairStep_0x104 + blkPl_204 ls_hook_ok_any lsmpl) +open CryptoVerification.E2E.Pqxdh.Shared + (SepWP.done_ro SepWP.step_ldpSimd128_ro VerifySignaturePrims and64_mask255_ite_1_0 bv_add_neg64 + bv_sub_sub_lit bytesToBv8 bytesToBv8_append bytesToBv8_getD_eq csinc_eq_zero32_ite_1_0 + dalekMontToEdOutAt dalekMontToEdOutAt_some fitBv8_of_length_eq lsVerifySha512IVRoSym + pointsToBytes_entails_memRegion_n pqxdhHookStack readReg32_setMem_setPC_pre readReg32_setPC_pre + readReg64_setMem_setPC_pre readReg64_setPC_pre readReg_setMem_setPC_pre readReg_setPC_pre + revWords64 roStop sha512CompressOutBytes sha512IVBytesLE sha512IVBytesLE_eq_unpack64 + sha512IV_placed_quad0 sha512IV_placed_quad1 sig_split_32 signBit_shr7_and_one + sp_setMem_setPC_pre sp_setPC_pre verifySig_end_seg verifySig_epilogue_placed verifySig_seq_seg + verifySig_seq_seg_lscl) +open LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedA2Sat + (verifySig_seg3a_placed_sat) +open LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedASat + (VerifySignaturePlacedHooks'Sat verifySig_seg3b_placed_sat) +open SignalPqxdh (Bytes Primitives encodeBitLen128BE) + +attribute [local irreducible] Program.fetch Program.externAt? Program.fnAddr Program.fnOff +attribute [local arm64_norm] bv_sub_add_lit BitVec.toNat_zero bv_sub_sub_lit bv_add_neg64 + +private theorem calleeSavedVRegs_setPC_pre_placed (s : State) (pc : BitVec 64) : + calleeSavedVRegs (s.setPC pc) = calleeSavedVRegs s := calleeSavedVRegs_setPC s pc + +private theorem calleeSavedVRegs_setMem_setPC_pre_placed (s : State) (m : Memory) (pc : BitVec 64) : + calleeSavedVRegs ((s.setMem m).setPC pc) = calleeSavedVRegs s := by + rw [calleeSavedVRegs_setPC, calleeSavedVRegs_setMem] + +attribute [local arm64_norm ↓, local wp_norm ↓] + sp_setPC_pre sp_setMem_setPC_pre readReg64_setPC_pre readReg64_setMem_setPC_pre + readReg32_setPC_pre readReg32_setMem_setPC_pre readReg_setPC_pre readReg_setMem_setPC_pre + calleeSavedVRegs_setPC_pre_placed calleeSavedVRegs_setMem_setPC_pre_placed + +attribute [local simp, local arm64_norm, local wp_norm, local arm64_norm ↓, local wp_norm ↓] + and64_mask255_ite_1_0 csinc_eq_zero32_ite_1_0 + +/-! ## Private Framing, Bit-Mask, and Frozen-Memory Helpers -/ + +private theorem list_sig_split_63 {sig : Bytes} (hsig : sig.length = 64) : + bytesToBv8 sig = bytesToBv8 (sig.take 63) ++ [(bytesToBv8 sig).getD 63 0#8] := by + rcases sig with _ | ⟨b0, _ | ⟨b1, _ | ⟨b2, _ | ⟨b3, _ | ⟨b4, _ | ⟨b5, _ | ⟨b6, _ | ⟨b7, + _ | ⟨b8, _ | ⟨b9, _ | ⟨b10, _ | ⟨b11, _ | ⟨b12, _ | ⟨b13, _ | ⟨b14, _ | ⟨b15, + _ | ⟨b16, _ | ⟨b17, _ | ⟨b18, _ | ⟨b19, _ | ⟨b20, _ | ⟨b21, _ | ⟨b22, _ | ⟨b23, + _ | ⟨b24, _ | ⟨b25, _ | ⟨b26, _ | ⟨b27, _ | ⟨b28, _ | ⟨b29, _ | ⟨b30, _ | ⟨b31, + _ | ⟨b32, _ | ⟨b33, _ | ⟨b34, _ | ⟨b35, _ | ⟨b36, _ | ⟨b37, _ | ⟨b38, _ | ⟨b39, + _ | ⟨b40, _ | ⟨b41, _ | ⟨b42, _ | ⟨b43, _ | ⟨b44, _ | ⟨b45, _ | ⟨b46, _ | ⟨b47, + _ | ⟨b48, _ | ⟨b49, _ | ⟨b50, _ | ⟨b51, _ | ⟨b52, _ | ⟨b53, _ | ⟨b54, _ | ⟨b55, + _ | ⟨b56, _ | ⟨b57, _ | ⟨b58, _ | ⟨b59, _ | ⟨b60, _ | ⟨b61, _ | ⟨b62, _ | ⟨b63, _ | + _⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩⟩ + all_goals try (simp at hsig) + rfl + +private theorem sig_focus_63 {sig : Bytes} (sigPtr : BitVec 64) (h : sig.length = 64) : + (sigPtr ↦ₛ bytesToBv8 sig) = + ((sigPtr ↦ₛ bytesToBv8 (sig.take 63)) ∗ ((sigPtr + 63#64) ↦₈ (bytesToBv8 sig).getD 63 0#8)) := by + have hl63 : (bytesToBv8 (sig.take 63)).length = 63 := by simp [bytesToBv8, h] + conv => lhs; rw [list_sig_split_63 h] + rw [pointsToBytes_append, hl63] + simp only [pointsToBytes_cons, pointsToBytes_nil, sepConj_emp] + +@[local simp, local wp_norm, local arm64_norm] +private theorem sig_getD63_ushiftRight7_eq_signBit (sig : Bytes) : + (bytesToBv8 sig).getD 63 0#8 >>> 7 = + BitVec.ofNat 8 (((sig.getD 63 0 &&& 0x80) >>> 7).toNat) := by + rw [bytesToBv8_getD_eq] + rcases sig.getD 63 0 with ⟨bv⟩ + revert bv; decide + +private theorem memRegion168_of_cell_and_bytes160 (a : BitVec 64) (v : BitVec 64) + {bs : List (BitVec 8)} (hlen : bs.length = 160) : + (a ↦₆₄ v) ∗ ((a + 8#64) ↦ₛ bs) ⊢ memRegion a 168 := by + have h1 : (a ↦₆₄ v) ⊢ memRegion a 8 := pointsTo64_entails_memRegion a v + have h2 : ((a + 8#64) ↦ₛ bs) ⊢ memRegion (a + 8#64) 160 := + pointsToBytes_entails_memRegion_n (a + 8#64) bs hlen + refine Entails.trans (sepConj_mono h1 h2) ?_ + rw [← ProofLib.memRegion_split' (b := a) (n := 8) (k := 160) (b' := a + 8#64) + rfl (by bv_omega) (by decide)] + exact Entails.refl _ + +private theorem exists_unpack64_of_length_160_eq {bs : List (BitVec 8)} (h : bs.length = 160) : + ∃ w0 w1 w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 w13 w14 w15 w16 w17 w18 w19 : BitVec 64, + ∀ a : BitVec 64, (a ↦ₛ bs) = + ((a ↦₆₄ w0) ∗ ((a + 8#64) ↦₆₄ w1) ∗ ((a + 16#64) ↦₆₄ w2) ∗ ((a + 24#64) ↦₆₄ w3) ∗ + ((a + 32#64) ↦₆₄ w4) ∗ ((a + 40#64) ↦₆₄ w5) ∗ ((a + 48#64) ↦₆₄ w6) ∗ ((a + 56#64) ↦₆₄ w7) ∗ + ((a + 64#64) ↦₆₄ w8) ∗ ((a + 72#64) ↦₆₄ w9) ∗ ((a + 80#64) ↦₆₄ w10) ∗ ((a + 88#64) ↦₆₄ w11) ∗ + ((a + 96#64) ↦₆₄ w12) ∗ ((a + 104#64) ↦₆₄ w13) ∗ ((a + 112#64) ↦₆₄ w14) ∗ ((a + 120#64) ↦₆₄ w15) ∗ + ((a + 128#64) ↦₆₄ w16) ∗ ((a + 136#64) ↦₆₄ w17) ∗ ((a + 144#64) ↦₆₄ w18) ∗ ((a + 152#64) ↦₆₄ w19)) := by + have h0 : (bs.take 32).length = 32 := by simp [h] + have h1 : ((bs.drop 32).take 32).length = 32 := by simp [h] + have h2 : ((bs.drop 64).take 32).length = 32 := by simp [h] + have h3 : ((bs.drop 96).take 32).length = 32 := by simp [h] + have h4 : (bs.drop 128).length = 32 := by simp [h] + obtain ⟨w0, w1, w2, w3, _, hp0⟩ := exists_unpack64_of_length_32 h0 + obtain ⟨w4, w5, w6, w7, _, hp1⟩ := exists_unpack64_of_length_32 h1 + obtain ⟨w8, w9, w10, w11, _, hp2⟩ := exists_unpack64_of_length_32 h2 + obtain ⟨w12, w13, w14, w15, _, hp3⟩ := exists_unpack64_of_length_32 h3 + obtain ⟨w16, w17, w18, w19, _, hp4⟩ := exists_unpack64_of_length_32 h4 + refine ⟨w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15, w16, w17, w18, w19, + fun a => ?_⟩ + have hsplit : bs = bs.take 32 ++ ((bs.drop 32).take 32 ++ ((bs.drop 64).take 32 ++ + ((bs.drop 96).take 32 ++ bs.drop 128))) := by + have s4 : bs.drop 96 = (bs.drop 96).take 32 ++ bs.drop 128 := by + simpa [List.drop_drop] using (List.take_append_drop 32 (bs.drop 96)).symm + have s3 : bs.drop 64 = (bs.drop 64).take 32 ++ bs.drop 96 := by + simpa [List.drop_drop] using (List.take_append_drop 32 (bs.drop 64)).symm + have s2 : bs.drop 32 = (bs.drop 32).take 32 ++ bs.drop 64 := by + simpa [List.drop_drop] using (List.take_append_drop 32 (bs.drop 32)).symm + have s1 : bs = bs.take 32 ++ bs.drop 32 := (List.take_append_drop 32 bs).symm + rw [s4] at s3; rw [s3] at s2; rw [s2] at s1; exact s1 + conv => lhs; rw [hsplit] + rw [pointsToBytes_append, h0, hp0, pointsToBytes_append, h1, hp1, pointsToBytes_append, h2, hp2, + pointsToBytes_append, h3, hp3, hp4] + simp only [BitVec.add_assoc, BitVec.reduceAdd, sepConj_assoc] + +private theorem uint8_and7f_ule32_of_and60_eq_true (b : UInt8) (h : (b &&& 0x60 == 0) = true) : + (32#64).ule (BitVec.zeroExtend 64 b.toBitVec &&& 545460846719#64) = false := by + rcases b with ⟨bv⟩; revert bv h; decide + +private theorem truncate32_and7f_eq (sig : Bytes) : + BitVec.truncate 32 (BitVec.zeroExtend 64 (sig.getD 63 0).toBitVec &&& 545460846719#64) = + BitVec.zeroExtend 32 ((bytesToBv8 sig).getD 63 0#8) &&& 0x7f#32 := by + rw [bytesToBv8_getD_eq] + generalize sig.getD 63 0 = b + rcases b with ⟨bv⟩; revert bv; decide + +private theorem of_sepWP_sha512IV_placed {prog : Program} {mid target_pc : BitVec 64} + {s : State} {P : SepProp} {post : State → SepProp → Prop} {pl : Obj.MultiPlacement} + (hro : Obj.HoldsBytes s.mem (pl.ρ lsVerifySha512IVRoSym) sha512IVBytesLE (fun _ => Perm.ro)) + (h : SepWP prog (roStop mid) s P + (fun sm Pm => + Obj.HoldsBytes sm.mem (pl.ρ lsVerifySha512IVRoSym) sha512IVBytesLE (fun _ => Perm.ro) → + SepWP prog target_pc sm Pm post)) : + SepWP prog target_pc s P post := by + unfold roStop at h + exact SepWP.seq_frozen (fun _ _ h0 hkf => holdsBytes_ro_of_keepsFrozen h0 hkf) hro h + +private theorem sha512IV_cells_eq (a : BitVec 64) : + ((a ↦₆₄ 0x6a09e667f3bcc908#64) ∗ ((a + 8#64) ↦₆₄ 0xbb67ae8584caa73b#64) ∗ + ((a + 16#64) ↦₆₄ 0x3c6ef372fe94f82b#64) ∗ ((a + 24#64) ↦₆₄ 0xa54ff53a5f1d36f1#64) ∗ + ((a + 32#64) ↦₆₄ 0x510e527fade682d1#64) ∗ ((a + 40#64) ↦₆₄ 0x9b05688c2b3e6c1f#64) ∗ + ((a + 48#64) ↦₆₄ 0x1f83d9abfb41bd6b#64) ∗ ((a + 56#64) ↦₆₄ 0x5be0cd19137e2179#64)) = + (a ↦ₛ sha512IVBytesLE) := by + rw [sha512IVBytesLE_eq_unpack64] + simp only [List.append_assoc, pointsToBytes_append, unpack64_length, ← pointsTo64_eq_pointsToBytes, + BitVec.add_assoc, BitVec.reduceAdd] + +private theorem memRegion_800_seg3a_split (fsp : BitVec 64) : + memRegion (fsp + 800#64) 168 ∗ memRegion (fsp + 968#64) 184 = + cells (fsp + 800#64) 16 ∗ cells (fsp + 928#64) 10 ∗ cells (fsp + 1008#64) 16 ∗ + memRegion (fsp + 1136#64) 16 := by + rw [← @ProofLib.memRegion_split' (fsp + 800#64) (fsp + 968#64) 168 184 352 rfl (by bv_omega) (by decide), + @ProofLib.memRegion_split' (fsp + 800#64) (fsp + 928#64) 128 224 352 rfl (by bv_omega) (by decide), + @ProofLib.memRegion_split' (fsp + 928#64) (fsp + 1008#64) 80 144 224 rfl (by bv_omega) (by decide), + @ProofLib.memRegion_split' (fsp + 1008#64) (fsp + 1136#64) 128 16 144 rfl (by bv_omega) (by decide), + memRegion_cells (fsp + 800#64) 16 (by decide), + memRegion_cells (fsp + 928#64) 10 (by decide), + memRegion_cells (fsp + 1008#64) 16 (by decide)] + +private theorem seg3a_to_seg3b_split (fsp : BitVec 64) : + cells (fsp + 800#64) 16 ∗ cells (fsp + 928#64) 10 ∗ cells (fsp + 1008#64) 16 = + cells (fsp + 800#64) 4 ∗ memRegion (fsp + 832#64) 128 ∗ memRegion (fsp + 960#64) 48 ∗ + memRegion (fsp + 1008#64) 32 ∗ memRegion (fsp + 1040#64) 96 := by + rw [← memRegion_cells (fsp + 800#64) 16 (by decide), + ← memRegion_cells (fsp + 928#64) 10 (by decide), + ← memRegion_cells (fsp + 1008#64) 16 (by decide), + ← @ProofLib.memRegion_split' (fsp + 928#64) (fsp + 1008#64) 80 128 208 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' (fsp + 800#64) (fsp + 928#64) 128 208 336 rfl (by bv_omega) (by decide), + @ProofLib.memRegion_split' (fsp + 800#64) (fsp + 832#64) 32 304 336 rfl (by bv_omega) (by decide), + @ProofLib.memRegion_split' (fsp + 832#64) (fsp + 960#64) 128 176 304 rfl (by bv_omega) (by decide), + @ProofLib.memRegion_split' (fsp + 960#64) (fsp + 1008#64) 48 128 176 rfl (by bv_omega) (by decide), + @ProofLib.memRegion_split' (fsp + 1008#64) (fsp + 1040#64) 32 96 128 rfl (by bv_omega) (by decide), + memRegion_cells (fsp + 800#64) 4 (by decide)] + +private theorem seg3b_to_epilogue_merge (fsp : BitVec 64) + (v4 : BitVec 32) (v8 : BitVec 64) {capA minusCapA hScalar : Bytes} + (hcapA : capA.length = 32) (hnegA : minusCapA.length = 160) (hh : hScalar.length = 32) : + memRegion fsp 4 ∗ ((fsp + 4#64) ↦₃₂ v4) ∗ ((fsp + 8#64) ↦₆₄ v8) ∗ + memRegion (fsp + 16#64) 32 ∗ memRegion (fsp + 48#64) 160 ∗ memRegion (fsp + 208#64) 160 ∗ + ((fsp + 368#64) ↦ₛ bytesToBv8 capA) ∗ ((fsp + 400#64) ↦ₛ bytesToBv8 minusCapA) ∗ + cells (fsp + 560#64) 16 ∗ cells (fsp + 688#64) 10 ∗ + ((fsp + 768#64) ↦ₛ bytesToBv8 hScalar) ∗ memRegion (fsp + 800#64) 160 ∗ + memRegion (fsp + 960#64) 48 ∗ memRegion (fsp + 1008#64) 32 ∗ + memRegion (fsp + 1040#64) 96 ∗ memRegion (fsp + 1136#64) 16 ⊢ memRegion fsp 1152 := by + have hw4 : ((fsp + 4#64) ↦₃₂ v4) ⊢ memRegion (fsp + 4#64) 4 := pointsTo32_entails_memRegion _ _ + have hw8 : ((fsp + 8#64) ↦₆₄ v8) ⊢ memRegion (fsp + 8#64) 8 := pointsTo64_entails_memRegion _ _ + have hw368 : ((fsp + 368#64) ↦ₛ bytesToBv8 capA) ⊢ memRegion (fsp + 368#64) 32 := + pointsToBytes_entails_memRegion_n _ _ (by simp [bytesToBv8, hcapA]) + have hw400 : ((fsp + 400#64) ↦ₛ bytesToBv8 minusCapA) ⊢ memRegion (fsp + 400#64) 160 := + pointsToBytes_entails_memRegion_n _ _ (by simp [bytesToBv8, hnegA]) + have hw768 : ((fsp + 768#64) ↦ₛ bytesToBv8 hScalar) ⊢ memRegion (fsp + 768#64) 32 := + pointsToBytes_entails_memRegion_n _ _ (by simp [bytesToBv8, hh]) + rw [← memRegion_cells (fsp + 560#64) 16 (by decide), + ← memRegion_cells (fsp + 688#64) 10 (by decide)] + refine Entails.trans + (sepConj_mono_right (sepConj_mono hw4 (sepConj_mono hw8 + (sepConj_mono_right (sepConj_mono_right (sepConj_mono_right + (sepConj_mono hw368 (sepConj_mono hw400 + (sepConj_mono_right (sepConj_mono_right (sepConj_mono_left hw768))))))))))) + (Entails.of_eq ?_) + rw [← @ProofLib.memRegion_split' (fsp + 1040#64) (fsp + 1136#64) 96 16 112 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' (fsp + 1008#64) (fsp + 1040#64) 32 112 144 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' (fsp + 960#64) (fsp + 1008#64) 48 144 192 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' (fsp + 800#64) (fsp + 960#64) 160 192 352 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' (fsp + 768#64) (fsp + 800#64) 32 352 384 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' (fsp + 688#64) (fsp + 768#64) 80 384 464 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' (fsp + 560#64) (fsp + 688#64) 128 464 592 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' (fsp + 400#64) (fsp + 560#64) 160 592 752 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' (fsp + 368#64) (fsp + 400#64) 32 752 784 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' (fsp + 208#64) (fsp + 368#64) 160 784 944 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' (fsp + 48#64) (fsp + 208#64) 160 944 1104 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' (fsp + 16#64) (fsp + 48#64) 32 1104 1136 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' (fsp + 8#64) (fsp + 16#64) 8 1136 1144 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' (fsp + 4#64) (fsp + 8#64) 4 1144 1148 rfl (by bv_omega) (by decide), + ← @ProofLib.memRegion_split' fsp (fsp + 4#64) 4 1148 1152 rfl (by bv_omega) (by decide)] + +/-! ## Block `204` Segment 1 (`HookSat` Siblings) -/ + +set_option maxHeartbeats 1600000 in +/-- Segment 1a (`+0 .. +84`, prologue & `MontgomeryPoint::to_edwards`) of Block `204` + under `[LibsignalPlacement]` and `VerifySignaturePlacedHooks'Sat P H`. -/ +public theorem verifySig_seg1a_placed_sat [LibsignalPlacement] + (P : Primitives) (H : LibsignalHooks) (hH : VerifySignaturePlacedHooks'Sat P H) + (s : State) (fsp pkPtr slicesPtr sigPtr retAddr : BitVec 64) (pk sig : Bytes) (Frame : SepProp) + (hpk : pk.length = 32) (hsig : sig.length = 64) (hfsp_align : fsp &&& 15#64 == 0#64) + (hrun : s.status = ExecStatus.Running) + (hpc : s.pc = (blkPl_204).base) + (hsp : s.sp = fsp + 1248#64) (hx0 : s.readReg64 (.gpr 0#5) = pkPtr) + (hx1 : s.readReg64 (.gpr 1#5) = slicesPtr) (hx2 : s.readReg64 (.gpr 2#5) = 1#64) + (hx3 : s.readReg64 (.gpr 3#5) = sigPtr) (hx4 : s.readReg64 (.gpr 4#5) = 64#64) + (hx30 : s.readReg64 (.gpr 30#5) = retAddr) : + SepWP ((blkPC_204).rebase (blkPl_204).base H) ((blkPl_204).base + 84#64) s + ((pkPtr ↦ₛ bytesToBv8 pk) ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ cells fsp 1 ∗ cells (fsp + 16#64) 4 ∗ + memRegion (fsp + 800#64) 168 ∗ cells (fsp + 1152#64) 12 ∗ stackAt fsp pqxdhHookStack ∗ Frame) + (fun sm Pm => + (Pm ⊢ (pkPtr ↦ₛ bytesToBv8 pk) ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ (fsp ↦₆₄ 0#64) ∗ + memRegion (fsp + 16#64) 32 ∗ + dalekMontToEdOutAt P (fsp + 800#64) pk ((sig.getD 63 0 &&& 0x80) >>> 7) ∗ + ((fsp + 1152#64) ↦₆₄ s.readReg64 (.gpr 29#5)) ∗ ((fsp + 1160#64) ↦₆₄ retAddr) ∗ + ((fsp + 1168#64) ↦₆₄ s.readReg64 (.gpr 28#5)) ∗ + ((fsp + 1176#64) ↦₆₄ s.readReg64 (.gpr 27#5)) ∗ + ((fsp + 1184#64) ↦₆₄ s.readReg64 (.gpr 26#5)) ∗ + ((fsp + 1192#64) ↦₆₄ s.readReg64 (.gpr 25#5)) ∗ + ((fsp + 1200#64) ↦₆₄ s.readReg64 (.gpr 24#5)) ∗ + ((fsp + 1208#64) ↦₆₄ s.readReg64 (.gpr 23#5)) ∗ + ((fsp + 1216#64) ↦₆₄ s.readReg64 (.gpr 22#5)) ∗ + ((fsp + 1224#64) ↦₆₄ s.readReg64 (.gpr 21#5)) ∗ + ((fsp + 1232#64) ↦₆₄ s.readReg64 (.gpr 20#5)) ∗ + ((fsp + 1240#64) ↦₆₄ s.readReg64 (.gpr 19#5)) ∗ stackAt fsp pqxdhHookStack ∗ Frame) ∧ + sm.status = ExecStatus.Running ∧ + sm.pc = (blkPl_204).base + 84#64 ∧ sm.sp = fsp ∧ + sm.readReg64 (.gpr 19#5) = sigPtr ∧ sm.readReg64 (.gpr 20#5) = slicesPtr ∧ + sm.readReg64 (.gpr 21#5) = 1#64 ∧ + sm.readReg64 (.gpr 22#5) = BitVec.zeroExtend 64 ((bytesToBv8 sig).getD 63 0#8) ∧ + sm.readReg64 (.gpr 29#5) = fsp + 1152#64 ∧ + calleeSavedVRegs sm = calleeSavedVRegs s ∧ sm.trace = s.trace) := by + have hmont := ls_hook_ok_any (prog := (blkPC_204).rebase (blkPl_204).base H) hH.montToEd + (by set_option maxRecDepth 20000 in decide) + clear hH + have hpk_bv : (bytesToBv8 pk).length = 32 := by simp [bytesToBv8, hpk] + obtain ⟨p0, p1, p2, p3, _, hpk_cells⟩ := exists_unpack64_of_length_32 hpk_bv + cells_pre_unfold_fast + wp_extract_exists + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (sig_focus_63 sigPtr hsig)) (by sep_frame) + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (hpk_cells pkPtr)) (by sep_frame) + wp_steps + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (sig_focus_63 sigPtr hsig).symm) + (by sep_frame) + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (hpk_cells pkPtr).symm) (by sep_frame) + have hpk_sp16 := (hpk_cells (fsp + 16#64)).symm + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hpk_sp16 + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hpk_sp16) (by sep_frame) + wp_call hmont ⟨pk, (sig.getD 63 0 &&& 0x80) >>> 7, fsp + 16#64, fsp + 800#64⟩ + apply ProofLib.SepWP.replace_pre + (hPQ := Entails.of_eq (congrArg (dalekMontToEdOutAt P (fsp + 800#64) pk) + (signBit_shr7_and_one (sig.getD 63 0)))) + (by sep_frame) + have hm32_16 := pointsToBytes_entails_memRegion_n (fsp + 16#64) _ hpk_bv + apply ProofLib.SepWP.replace_pre (hPQ := hm32_16) (by sep_frame) + wp_simp_pre_fast [hsp_sf] + apply SepWP.done (by wp_norm_goal) (by wp_norm_lhs) + refine ⟨Entails.of_eq (by sep_ac_rfl), by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, + by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, + by wp_norm_goal, by wp_norm_goal⟩ + +set_option maxHeartbeats 2400000 in +/-- Segment 1b (`+84 .. +232`, `to_edwards = some edPt` & `EdwardsPoint::compress`) of Block `204` + under `[LibsignalPlacement]` and `VerifySignaturePlacedHooks'Sat P H`. -/ +public theorem verifySig_seg1b_placed_sat [LibsignalPlacement] + (P : Primitives) (H : LibsignalHooks) (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) (s : State) (fsp : BitVec 64) + (pk edPt : Bytes) (signBit : UInt8) (Frame : SepProp) + (hmont : P.montToEd pk signBit = some edPt) (hfsp_align : fsp &&& 15#64 == 0#64) + (hrun : s.status = ExecStatus.Running) + (hpc : s.pc = (blkPl_204).base + 84#64) (hsp : s.sp = fsp) : + SepWP ((blkPC_204).rebase (blkPl_204).base H) ((blkPl_204).base + 232#64) s + (cells (fsp + 48#64) 20 ∗ cells (fsp + 208#64) 20 ∗ memRegion (fsp + 368#64) 32 ∗ + dalekMontToEdOutAt P (fsp + 800#64) pk signBit ∗ stackAt fsp pqxdhHookStack ∗ Frame) + (fun sm Pm => + (Pm ⊢ memRegion (fsp + 48#64) 160 ∗ ((fsp + 208#64) ↦ₛ bytesToBv8 edPt) ∗ + ((fsp + 368#64) ↦ₛ bytesToBv8 (P.compress edPt)) ∗ memRegion (fsp + 800#64) 168 ∗ + stackAt fsp pqxdhHookStack ∗ Frame) ∧ + sm.status = ExecStatus.Running ∧ + sm.pc = (blkPl_204).base + 232#64 ∧ sm.sp = fsp ∧ + sm.readReg64 (.gpr 19#5) = s.readReg64 (.gpr 19#5) ∧ + sm.readReg64 (.gpr 20#5) = s.readReg64 (.gpr 20#5) ∧ + sm.readReg64 (.gpr 21#5) = s.readReg64 (.gpr 21#5) ∧ + sm.readReg64 (.gpr 22#5) = s.readReg64 (.gpr 22#5) ∧ + sm.readReg64 (.gpr 23#5) = fsp + 800#64 ∧ + sm.readReg64 (.gpr 29#5) = s.readReg64 (.gpr 29#5) ∧ + calleeSavedVRegs sm = calleeSavedVRegs s ∧ sm.trace = s.trace) := by + have hcomp := ls_hook_ok_any (prog := (blkPC_204).rebase (blkPl_204).base H) hH.compress + clear hH + have hed_len : edPt.length = 160 := hWF.montToEd_len pk signBit edPt hmont + have hed_bv_len : (bytesToBv8 edPt).length = 160 := by simp [bytesToBv8, hed_len] + obtain ⟨e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, + hed_cells⟩ := exists_unpack64_of_length_160_eq hed_bv_len + cells_pre_unfold_fast + wp_extract_exists + apply ProofLib.SepWP.replace_pre + (hPQ := Entails.of_eq (dalekMontToEdOutAt_some P pk edPt signBit hmont hed_len (fsp + 800#64))) + (by sep_frame) + have hed_808 := hed_cells (fsp + 800#64 + 8#64) + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hed_808 + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hed_808) (by sep_frame) + wp_steps + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hed_808.symm) (by sep_frame) + have hm168 := memRegion168_of_cell_and_bytes160 (fsp + 800#64) 1#64 hed_bv_len + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hm168 + apply ProofLib.SepWP.replace_pre (hPQ := hm168) (by sep_frame) + have hed_48 := (hed_cells (fsp + 48#64)).symm + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hed_48 + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hed_48) (by sep_frame) + have hed_208 := (hed_cells (fsp + 208#64)).symm + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hed_208 + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hed_208) (by sep_frame) + wp_call hcomp ⟨fsp + 48#64, edPt, fsp + 368#64⟩ + wp_simp_pre_fast [fitBv8_of_length_eq (hWF.compress_len _), hsp, hsp_sf] + have hm160_48 := pointsToBytes_entails_memRegion_n (fsp + 48#64) _ hed_bv_len + apply ProofLib.SepWP.replace_pre (hPQ := hm160_48) (by sep_frame) + apply SepWP.done (by wp_norm_goal) (by wp_norm_lhs) + refine ⟨Entails.of_eq (by sep_ac_rfl), by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, + by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, + by wp_norm_goal, by wp_norm_goal, by wp_norm_goal⟩ + +set_option maxHeartbeats 2400000 in +/-- Segment 1c valid branch (`+232 .. +320`, `EdwardsPoint::neg` & `.rodata` SHA-512 IV init) + of Block `204` under `[LibsignalPlacement]` and `VerifySignaturePlacedHooks'Sat P H`. -/ +public theorem verifySig_seg1c_placed_sat [LibsignalPlacement] + (P : Primitives) (H : LibsignalHooks) (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) (s : State) (fsp sigPtr : BitVec 64) + (edPt sig : Bytes) (Frame : SepProp) + (hro : Obj.HoldsBytes s.mem (lsmpl.ρ lsVerifySha512IVRoSym) sha512IVBytesLE (fun _ => Perm.ro)) + (hedPt : edPt.length = 160) (hsig : sig.length = 64) + (hvalid : (sig.getD 63 0 &&& 0x60 == 0) = true) (hfsp_align : fsp &&& 15#64 == 0#64) + (hrun : s.status = ExecStatus.Running) + (hpc : s.pc = (blkPl_204).base + 232#64) + (hsp : s.sp = fsp) (hx19 : s.readReg64 (.gpr 19#5) = sigPtr) + (hx22 : s.readReg64 (.gpr 22#5) = BitVec.zeroExtend 64 (sig.getD 63 0).toBitVec) : + SepWP ((blkPC_204).rebase (blkPl_204).base H) ((blkPl_204).base + 320#64) s + (memRegion fsp 4 ∗ memRegion (fsp + 4#64) 4 ∗ cells (fsp + 8#64) 1 ∗ + ((fsp + 208#64) ↦ₛ bytesToBv8 edPt) ∗ ((fsp + 368#64) ↦ₛ bytesToBv8 (P.compress edPt)) ∗ + memRegion (fsp + 400#64) 160 ∗ cells (fsp + 560#64) 8 ∗ memRegion (fsp + 687#64) 1 ∗ + cells (fsp + 688#64) 10 ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ stackAt fsp pqxdhHookStack ∗ Frame) + (fun sm Pm => + (Pm ⊢ memRegion fsp 4 ∗ + ((fsp + 4#64) ↦₃₂ (BitVec.zeroExtend 32 ((bytesToBv8 sig).getD 63 0#8) &&& 0x7f#32)) ∗ + ((fsp + 8#64) ↦₆₄ sigPtr) ∗ memRegion (fsp + 208#64) 160 ∗ + ((fsp + 368#64) ↦ₛ bytesToBv8 (P.compress edPt)) ∗ + ((fsp + 400#64) ↦ₛ bytesToBv8 (P.edNeg edPt)) ∗ + ((fsp + 560#64) ↦ₛ bytesToBv8 (sig.take 32 ++ P.compress edPt)) ∗ + ((fsp + 687#64) ↦₈ 64#8) ∗ ((fsp + 688#64) ↦ₛ sha512IVBytesLE) ∗ + ((fsp + 752#64) ↦₆₄ 0#64) ∗ ((fsp + 760#64) ↦₆₄ 0#64) ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ + stackAt fsp pqxdhHookStack ∗ Frame) ∧ + sm.status = ExecStatus.Running ∧ + sm.pc = (blkPl_204).base + 320#64 ∧ sm.sp = fsp ∧ + sm.readReg64 (.gpr 20#5) = s.readReg64 (.gpr 20#5) ∧ + sm.readReg64 (.gpr 21#5) = s.readReg64 (.gpr 21#5) ∧ + sm.readReg64 (.gpr 23#5) = s.readReg64 (.gpr 23#5) ∧ + sm.readReg64 (.gpr 29#5) = s.readReg64 (.gpr 29#5) ∧ + calleeSavedVRegs sm = calleeSavedVRegs s ∧ sm.trace = s.trace) := by + have hedneg := ls_hook_ok_any (prog := (blkPC_204).rebase (blkPl_204).base H) hH.edNeg + (by set_option maxRecDepth 20000 in decide) + clear hH + have hsig32_bv : (bytesToBv8 (sig.take 32)).length = 32 := by simp [bytesToBv8, hsig] + obtain ⟨r0, r1, r2, r3, _, hsig32_cells⟩ := exists_unpack64_of_length_32 hsig32_bv + have hcapA_bv : (bytesToBv8 (P.compress edPt)).length = 32 := by + simp [bytesToBv8, hWF.compress_len] + obtain ⟨a0, a1, a2, a3, _, hcapA_cells⟩ := exists_unpack64_of_length_32 hcapA_bv + rw [ProofLib.memRegion_four (fsp + 4#64), ProofLib.memRegion_one (fsp + 687#64)] + cells_pre_unfold_fast + wp_extract_exists + apply of_sepWP_sha512IV_placed hro (mid := (blkPl_204).base + 272#64) + wp_step + wp_step + wp_step + rw [uint8_and7f_ule32_of_and60_eq_true (sig.getD 63 0) hvalid] + simp only [Bool.false_eq_true, ↓reduceIte] + wp_steps + wp_call hedneg ⟨fsp + 208#64, edPt, fsp + 400#64⟩ + wp_simp_pre_fast [fitBv8_of_length_eq (hWF.edNeg_len _), truncate32_and7f_eq, hsp, hsp_sf] + apply blkPC_204_pairStep_0x104 (blkPl_204).base H rfl (by wp_norm_goal) (by wp_norm_goal) + wp_steps + apply SepWP.done_ro (by wp_norm_lhs) (by wp_norm_lhs) + intro hro1 + apply of_sepWP_sha512IV_placed hro1 (mid := (blkPl_204).base + 288#64) + wp_step_ldp_ro (sha512IV_placed_quad0 hro1) + wp_steps + apply SepWP.done_ro (by wp_norm_lhs) (by wp_norm_lhs) + intro hro2 + wp_step_ldp_ro (sha512IV_placed_quad1 hro2) + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (sig_split_32 sigPtr hsig)) (by sep_frame) + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (hsig32_cells sigPtr)) (by sep_frame) + have hcapA_368 := hcapA_cells (fsp + 368#64) + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hcapA_368 + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hcapA_368) (by sep_frame) + wp_steps + have hsha_688 := sha512IV_cells_eq (fsp + 688#64) + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hsha_688 + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hsha_688) (by sep_frame) + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (hsig32_cells sigPtr).symm) (by sep_frame) + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (sig_split_32 sigPtr hsig).symm) + (by sep_frame) + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hcapA_368.symm) (by sep_frame) + have hsig_560 := (hsig32_cells (fsp + 560#64)).symm + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hsig_560 + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hsig_560) (by sep_frame) + have hcapA_592 := (hcapA_cells (fsp + 592#64)).symm + simp only [BitVec.add_assoc, BitVec.reduceAdd] at hcapA_592 + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hcapA_592) (by sep_frame) + have hmerge_560 : + ((fsp + 560#64) ↦ₛ bytesToBv8 (sig.take 32)) ∗ ((fsp + 592#64) ↦ₛ bytesToBv8 (P.compress edPt)) = + ((fsp + 560#64) ↦ₛ bytesToBv8 (sig.take 32 ++ P.compress edPt)) := by + rw [bytesToBv8_append, pointsToBytes_append, hsig32_bv, BitVec.add_assoc]; rfl + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq hmerge_560) (by sep_frame) + have hedPt_bv : (bytesToBv8 edPt).length = 160 := by simp [bytesToBv8, hedPt] + have hm160_208 := pointsToBytes_entails_memRegion_n (fsp + 208#64) _ hedPt_bv + apply ProofLib.SepWP.replace_pre (hPQ := hm160_208) (by sep_frame) + apply SepWP.done (by wp_norm_goal) (by wp_norm_lhs) + refine ⟨Entails.of_eq (by sep_ac_rfl), by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, + by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, by wp_norm_goal, + by wp_norm_goal⟩ + +/-! ## Block `204` Tail (`+548 .. retAddr`, `HookSat` Sibling) -/ + +set_option maxHeartbeats 1600000 in +/-- Tail segment (`+548 .. retAddr`) of Block `204` (`verify_signature_for_multipart_message`) + under `[LibsignalPlacement]` and `VerifySignaturePlacedHooks'Sat P H`, sequencing + `verifySig_seg3a_placed_sat`, `verifySig_seg3b_placed_sat`, and `verifySig_epilogue_placed`. -/ +public theorem verifySig_tail_from_548_placed_sat [LibsignalPlacement] + (P : Primitives) (H : LibsignalHooks) (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) (s : State) (fsp sigPtr retAddr : BitVec 64) + (x19_0 x20_0 x21_0 x22_0 x23_0 x24_0 x25_0 x26_0 x27_0 x28_0 x29_0 : BitVec 64) + (edPt m sig tail97 st : Bytes) (blkCnt : BitVec 64) (L : Nat) (Frame : SepProp) + (hcl : LibsignalCodeLoaded lsmpl s.mem) + (_hedPt : edPt.length = 160) (hsig : sig.length = 64) (htail97 : tail97.length = 97) + (hst : st.length = 64) + (hblkL : (blkCnt = 0#64 ∧ L = 97) ∨ (blkCnt = 12#64 ∧ L = 1633)) + (hsha_eq : revWords64 (sha512CompressOutBytes P st + (tail97 ++ [0x80] ++ List.replicate 14 0 ++ encodeBitLen128BE L)) = + P.sha512 (sig.take 32 ++ P.compress edPt ++ m)) + (hfsp_align : fsp &&& 15#64 == 0#64) (hrun : s.status = ExecStatus.Running) + (hpc : s.pc = (blkPl_204).base + 548#64) + (hsp : s.sp = fsp) (hx23 : s.readReg64 (.gpr 23#5) = fsp + 800#64) + (hx29 : s.readReg64 (.gpr 29#5) = fsp + 1152#64) : + SepWP ((blkPC_204).rebase (blkPl_204).base H) retAddr s + (memRegion fsp 4 ∗ + ((fsp + 4#64) ↦₃₂ (BitVec.zeroExtend 32 ((bytesToBv8 sig).getD 63 0#8) &&& 0x7f#32)) ∗ + ((fsp + 8#64) ↦₆₄ sigPtr) ∗ memRegion (fsp + 16#64) 32 ∗ + memRegion (fsp + 48#64) 160 ∗ memRegion (fsp + 208#64) 160 ∗ + ((fsp + 368#64) ↦ₛ bytesToBv8 (P.compress edPt)) ∗ + ((fsp + 400#64) ↦ₛ bytesToBv8 (P.edNeg edPt)) ∗ + ((fsp + 560#64) ↦ₛ bytesToBv8 tail97) ∗ memRegion (fsp + 657#64) 30 ∗ + ((fsp + 687#64) ↦₈ 97#8) ∗ ((fsp + 688#64) ↦ₛ bytesToBv8 st) ∗ + ((fsp + 752#64) ↦₆₄ blkCnt) ∗ ((fsp + 760#64) ↦₆₄ 0#64) ∗ + memRegion (fsp + 768#64) 32 ∗ memRegion (fsp + 800#64) 168 ∗ + memRegion (fsp + 968#64) 184 ∗ + ((fsp + 1152#64) ↦₆₄ x29_0) ∗ ((fsp + 1160#64) ↦₆₄ retAddr) ∗ + ((fsp + 1168#64) ↦₆₄ x28_0) ∗ ((fsp + 1176#64) ↦₆₄ x27_0) ∗ + ((fsp + 1184#64) ↦₆₄ x26_0) ∗ ((fsp + 1192#64) ↦₆₄ x25_0) ∗ + ((fsp + 1200#64) ↦₆₄ x24_0) ∗ ((fsp + 1208#64) ↦₆₄ x23_0) ∗ + ((fsp + 1216#64) ↦₆₄ x22_0) ∗ ((fsp + 1224#64) ↦₆₄ x21_0) ∗ + ((fsp + 1232#64) ↦₆₄ x20_0) ∗ ((fsp + 1240#64) ↦₆₄ x19_0) ∗ + (sigPtr ↦ₛ bytesToBv8 sig) ∗ stackAt fsp pqxdhHookStack ∗ Frame) + (fun sm Pm => + (Pm ⊢ (sigPtr ↦ₛ bytesToBv8 sig) ∗ stackAt (fsp + 1248#64) (pqxdhHookStack + 1248) ∗ Frame) ∧ + sm.status = ExecStatus.Running ∧ sm.pc = retAddr ∧ sm.sp = fsp + 1248#64 ∧ + sm.readReg64 (.gpr 0#5) = + (let capA := P.compress edPt + let minusCapA := P.edNeg edPt + let capR := sig.take 32 + let sRaw := sig.drop 32 + let sClamped := sRaw.take 31 ++ [sRaw.getD 31 0 &&& 0x7F] + let h := P.scalarFromWide (P.sha512 (capR ++ capA ++ m)) + let sScalar := P.scalarFromBytesModOrder sClamped + let capRCheck := P.compress (P.doubleScalarMulBasepoint h minusCapA sScalar) + if (capRCheck == capR) = true then 1#64 else 0#64) ∧ + sm.readReg64 (.gpr 19#5) = x19_0 ∧ sm.readReg64 (.gpr 20#5) = x20_0 ∧ + sm.readReg64 (.gpr 21#5) = x21_0 ∧ sm.readReg64 (.gpr 22#5) = x22_0 ∧ + sm.readReg64 (.gpr 23#5) = x23_0 ∧ sm.readReg64 (.gpr 24#5) = x24_0 ∧ + sm.readReg64 (.gpr 25#5) = x25_0 ∧ sm.readReg64 (.gpr 26#5) = x26_0 ∧ + sm.readReg64 (.gpr 27#5) = x27_0 ∧ sm.readReg64 (.gpr 28#5) = x28_0 ∧ + sm.readReg64 (.gpr 29#5) = x29_0 ∧ + calleeSavedVRegs sm = calleeSavedVRegs s ∧ sm.trace = s.trace) := by + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (memRegion_800_seg3a_split fsp)) + (by sep_frame) + apply verifySig_seq_seg_lscl hcl (verifySig_seg3a_placed_sat P H hH s fsp tail97 st blkCnt L + (memRegion fsp 4 ∗ + ((fsp + 4#64) ↦₃₂ (BitVec.zeroExtend 32 ((bytesToBv8 sig).getD 63 0#8) &&& 0x7f#32)) ∗ + ((fsp + 8#64) ↦₆₄ sigPtr) ∗ memRegion (fsp + 16#64) 32 ∗ + memRegion (fsp + 48#64) 160 ∗ memRegion (fsp + 208#64) 160 ∗ + ((fsp + 368#64) ↦ₛ bytesToBv8 (P.compress edPt)) ∗ + ((fsp + 400#64) ↦ₛ bytesToBv8 (P.edNeg edPt)) ∗ + memRegion (fsp + 1136#64) 16 ∗ + ((fsp + 1152#64) ↦₆₄ x29_0) ∗ ((fsp + 1160#64) ↦₆₄ retAddr) ∗ + ((fsp + 1168#64) ↦₆₄ x28_0) ∗ ((fsp + 1176#64) ↦₆₄ x27_0) ∗ + ((fsp + 1184#64) ↦₆₄ x26_0) ∗ ((fsp + 1192#64) ↦₆₄ x25_0) ∗ + ((fsp + 1200#64) ↦₆₄ x24_0) ∗ ((fsp + 1208#64) ↦₆₄ x23_0) ∗ + ((fsp + 1216#64) ↦₆₄ x22_0) ∗ ((fsp + 1224#64) ↦₆₄ x21_0) ∗ + ((fsp + 1232#64) ↦₆₄ x20_0) ∗ ((fsp + 1240#64) ↦₆₄ x19_0) ∗ + (sigPtr ↦ₛ bytesToBv8 sig) ∗ Frame) + htail97 hst hblkL hfsp_align hrun hpc hsp hx23 hx29) + (Entails.of_eq (by sep_ac_rfl)) + intro s1 hpc1 hrun1 hcl1 ⟨_, _, hsp1, hx23_1, hx29_1, hv1, htr1⟩ + rw [hsha_eq, fitBv8_of_length_eq (hWF.scalarFromWide_len _)] + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (seg3a_to_seg3b_split fsp)) (by sep_frame) + have hnegA : (P.edNeg edPt).length = 160 := hWF.edNeg_len edPt + have hh : (P.scalarFromWide (P.sha512 (sig.take 32 ++ P.compress edPt ++ m))).length = 32 := + hWF.scalarFromWide_len _ + apply verifySig_seq_seg (verifySig_seg3b_placed_sat P H hWF hH s1 fsp sigPtr + sig (P.edNeg edPt) (P.scalarFromWide (P.sha512 (sig.take 32 ++ P.compress edPt ++ m))) + (memRegion fsp 4 ∗ memRegion (fsp + 16#64) 32 ∗ memRegion (fsp + 48#64) 160 ∗ + memRegion (fsp + 208#64) 160 ∗ ((fsp + 368#64) ↦ₛ bytesToBv8 (P.compress edPt)) ∗ + cells (fsp + 560#64) 16 ∗ cells (fsp + 688#64) 10 ∗ memRegion (fsp + 960#64) 48 ∗ + memRegion (fsp + 1040#64) 96 ∗ memRegion (fsp + 1136#64) 16 ∗ + ((fsp + 1152#64) ↦₆₄ x29_0) ∗ ((fsp + 1160#64) ↦₆₄ retAddr) ∗ + ((fsp + 1168#64) ↦₆₄ x28_0) ∗ ((fsp + 1176#64) ↦₆₄ x27_0) ∗ + ((fsp + 1184#64) ↦₆₄ x26_0) ∗ ((fsp + 1192#64) ↦₆₄ x25_0) ∗ + ((fsp + 1200#64) ↦₆₄ x24_0) ∗ ((fsp + 1208#64) ↦₆₄ x23_0) ∗ + ((fsp + 1216#64) ↦₆₄ x22_0) ∗ ((fsp + 1224#64) ↦₆₄ x21_0) ∗ + ((fsp + 1232#64) ↦₆₄ x20_0) ∗ ((fsp + 1240#64) ↦₆₄ x19_0) ∗ Frame) + hcl1 hsig hnegA hh hfsp_align hrun1 hpc1 hsp1 hx23_1 hx29_1) + (Entails.of_eq (by sep_ac_rfl)) + intro s2 hpc2 hrun2 ⟨_, _, hsp2, hx0_2, hv2, htr2⟩ + have hcapA : (P.compress edPt).length = 32 := hWF.compress_len edPt + apply ProofLib.SepWP.replace_pre + (hPQ := seg3b_to_epilogue_merge fsp + (BitVec.zeroExtend 32 ((bytesToBv8 sig).getD 63 0#8) &&& 0x7f#32) sigPtr hcapA hnegA hh) + (by sep_frame) + apply verifySig_end_seg (verifySig_epilogue_placed H s2 fsp retAddr (s2.readReg64 (.gpr 0#5)) + x19_0 x20_0 x21_0 x22_0 x23_0 x24_0 x25_0 x26_0 x27_0 x28_0 x29_0 + ((sigPtr ↦ₛ bytesToBv8 sig) ∗ Frame) + hfsp_align hrun2 hpc2 hsp2 rfl) + (Entails.of_eq (by sep_ac_rfl)) + intro s3 P3 hP3 ⟨hrun3, hpc3, hsp3, hx0_3, h19, h20, h21, h22, h23, h24, h25, h26, h27, h28, h29, + hv3, htr3⟩ + exact ⟨Entails.trans hP3 (Entails.of_eq (by sep_ac_rfl)), hrun3, hpc3, hsp3, + hx0_3.trans hx0_2, h19, h20, h21, h22, h23, h24, h25, h26, h27, h28, h29, + hv3.trans (hv2.trans hv1), htr3.trans (htr2.trans htr1)⟩ + +end LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedBSat diff --git a/LibsignalBinary/Proofs/E2E/Pqxdh/Shared/VerifySignaturePlacedSat.lean b/LibsignalBinary/Proofs/E2E/Pqxdh/Shared/VerifySignaturePlacedSat.lean new file mode 100644 index 000000000..bc57ac9b7 --- /dev/null +++ b/LibsignalBinary/Proofs/E2E/Pqxdh/Shared/VerifySignaturePlacedSat.lean @@ -0,0 +1,811 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlaced -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedASat -- proof-setup: allow-public-import +import LibsignalBinary.Proofs.Common.SharedHelpers +meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep +import LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedA2Sat +import LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedBSat +import LibsignalBinary.Proofs.TripleRatchet.Keys.CreateChain + +/-! +# `HookSat`-backed `black_box` Sibling of `VerifySignaturePlaced` (Blocks `203` and `204`) + +Proves relocatable `[LibsignalPlacement]` contracts for unmutated Blocks `204` +(`verify_signature_for_multipart_message`) and `203` (`verify_signature`) under +`VerifySignaturePlacedHooksSat P H` (`HookSat H lsBlackBoxU8Sym blackBoxSpecSat`), along with +explicit-`h_canon` `CurveVerifyAndCanonPlacedOk` bundles and `[LibsignalFullPlacement]` corollaries. +-/ + +public section + +set_option autoImplicit false + +namespace LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedSat + +open Arm64 ProofLib +open CryptoVerification + (IsLsBlockProg LibsignalCodeLoaded LibsignalFullPlacement LibsignalHooks LibsignalPlacement + blkPC_203 blkPC_204 blkPl_203 blkPl_204 libsignalSessionLib ls_blockPlacement_base lsjump_blk + lsmpl) +open CryptoVerification.E2E.Pqxdh.Shared + (CurveVerifyAndCanonPlacedOk StructuralPrims VerifySignaturePrims bytesToBv8 + bytesToBv8_getD_eq cryptoBoolRegStubSpec ecPubKeyIsCanonicalCallSpec + isCanonical_placed_ok'_cl_placed isCanonical_placed_ok_cl_placed lsDalekTorsionFreeSym + lsVerifySha512IVRoSym pqxdhHookStack revWords64 revWords64_length sha512CompressOutBytes + sha512CompressOutBytes_length sha512IVBytesLE sha512IV_placed_holdsBytes sha512Ref_of_length_1633 + sha512Ref_of_length_97 verifySig_end_seg verifySig_epilogue_false_placed + verifySig_memRegion_1152_seg1a_merge verifySig_memRegion_1152_seg1a_split + verifySig_memRegion_752_seg1b_merge verifySig_memRegion_752_seg1b_split + verifySig_seg1a_none_placed verifySig_seg1b_to_seg1c_split verifySig_seg1c_invalid_placed + verifySig_seq_seg verifySig_seq_seg_lscl verifySig_seq_seg_lscro verifySig_stackAt_1248_split + verifySig_xeddsaVerifyRef_of_60_false verifySig_xeddsaVerifyRef_of_montToEd_none + verifySig_xeddsaVerifyRef_of_some verifySignatureCallSpec verifySignatureMultipartCallSpec + verifySignature_epilogue_placed verifySignature_prologue_placed) +open CryptoVerification.LibsignalTripleRatchet + (extract_withLsCodeRoLoaded keys_ls_subroutine_ok_of_block_cro + subroutine_ok_withLsFrozen_of_withLsCodeRoLoaded withLsCodeRoLoaded withLsFrozen) +open LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedA2Sat + (verifySig_seg2_1569_placed_sat verifySig_seg2_33_placed_sat) +open LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedASat + (VerifySignaturePlacedHooks'Sat VerifySignaturePlacedHooksSat) +open LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedBSat + (verifySig_seg1a_placed_sat verifySig_seg1b_placed_sat verifySig_seg1c_placed_sat + verifySig_tail_from_548_placed_sat) +open SignalPqxdh + (Bytes Primitives encodeBitLen128BE isCanonicalRef sha512InitState xeddsaVerifyRef) + +/-! ## Block `204` (`verify_signature_for_multipart_message`, `HookSat` Siblings) -/ + +set_option maxHeartbeats 2400000 in +/-- Full end-to-end `SepWP` theorem for Block `204` (`verify_signature_for_multipart_message`) + under `[LibsignalPlacement]` and `VerifySignaturePlacedHooks'Sat P H`, returning + `xeddsaVerifyRef P pk m sig` in `x0`. -/ +public theorem verifySignatureMultipart_sepWP_placed_sat [LibsignalPlacement] + (P : Primitives) (H : LibsignalHooks) (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) + (s : State) (fsp pkPtr slicesPtr msgPtr sigPtr retAddr : BitVec 64) + (pk m sig : Bytes) (Frame : SepProp) + (hcl : LibsignalCodeLoaded lsmpl s.mem) + (hro : Obj.HoldsBytes s.mem (lsmpl.ρ lsVerifySha512IVRoSym) sha512IVBytesLE (fun _ => Perm.ro)) + (hpk : pk.length = 32) + (hm : m.length = 33 ∨ m.length = 1569) + (hsig : sig.length = 64) + (hfsp_align : fsp &&& 15#64 == 0#64) + (hrun : s.status = ExecStatus.Running) + (hpc : s.pc = (blkPl_204).base) + (hsp : s.sp = fsp + 1248#64) + (hx0 : s.readReg64 (.gpr 0#5) = pkPtr) + (hx1 : s.readReg64 (.gpr 1#5) = slicesPtr) + (hx2 : s.readReg64 (.gpr 2#5) = 1#64) + (hx3 : s.readReg64 (.gpr 3#5) = sigPtr) + (hx4 : s.readReg64 (.gpr 4#5) = 64#64) + (hx30 : s.readReg64 (.gpr 30#5) = retAddr) : + SepWP ((blkPC_204).rebase (blkPl_204).base H) retAddr s + ((pkPtr ↦ₛ bytesToBv8 pk) ∗ (slicesPtr ↦₆₄ msgPtr) ∗ + ((slicesPtr + 8#64) ↦₆₄ BitVec.ofNat 64 m.length) ∗ + (msgPtr ↦ₛ bytesToBv8 m) ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ + stackAt (fsp + 1248#64) (pqxdhHookStack + 1248) ∗ Frame) + (fun sm Pm => + (Pm ⊢ (pkPtr ↦ₛ bytesToBv8 pk) ∗ (slicesPtr ↦₆₄ msgPtr) ∗ + ((slicesPtr + 8#64) ↦₆₄ BitVec.ofNat 64 m.length) ∗ + (msgPtr ↦ₛ bytesToBv8 m) ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ + stackAt (fsp + 1248#64) (pqxdhHookStack + 1248) ∗ Frame) ∧ + sm.status = ExecStatus.Running ∧ sm.pc = retAddr ∧ sm.sp = fsp + 1248#64 ∧ + sm.readReg64 (.gpr 0#5) = (if xeddsaVerifyRef P pk m sig = true then 1#64 else 0#64) ∧ + sm.readReg64 (.gpr 19#5) = s.readReg64 (.gpr 19#5) ∧ + sm.readReg64 (.gpr 20#5) = s.readReg64 (.gpr 20#5) ∧ + sm.readReg64 (.gpr 21#5) = s.readReg64 (.gpr 21#5) ∧ + sm.readReg64 (.gpr 22#5) = s.readReg64 (.gpr 22#5) ∧ + sm.readReg64 (.gpr 23#5) = s.readReg64 (.gpr 23#5) ∧ + sm.readReg64 (.gpr 24#5) = s.readReg64 (.gpr 24#5) ∧ + sm.readReg64 (.gpr 25#5) = s.readReg64 (.gpr 25#5) ∧ + sm.readReg64 (.gpr 26#5) = s.readReg64 (.gpr 26#5) ∧ + sm.readReg64 (.gpr 27#5) = s.readReg64 (.gpr 27#5) ∧ + sm.readReg64 (.gpr 28#5) = s.readReg64 (.gpr 28#5) ∧ + sm.readReg64 (.gpr 29#5) = s.readReg64 (.gpr 29#5) ∧ + calleeSavedVRegs sm = calleeSavedVRegs s ∧ sm.trace = s.trace) := by + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (verifySig_stackAt_1248_split fsp)) + (by sep_frame) + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (verifySig_memRegion_1152_seg1a_split fsp)) + (by sep_frame) + apply verifySig_seq_seg_lscro ⟨hcl, hro⟩ (verifySig_seg1a_placed_sat P H hH s fsp pkPtr slicesPtr sigPtr + retAddr pk sig + ((slicesPtr ↦₆₄ msgPtr) ∗ ((slicesPtr + 8#64) ↦₆₄ BitVec.ofNat 64 m.length) ∗ + (msgPtr ↦ₛ bytesToBv8 m) ∗ memRegion (fsp + 8#64) 8 ∗ + memRegion (fsp + 48#64) 752 ∗ memRegion (fsp + 968#64) 184 ∗ Frame) + hpk hsig hfsp_align hrun hpc hsp hx0 hx1 hx2 hx3 hx4 hx30) + (Entails.of_eq (by sep_ac_rfl)) + intro s1 hpc1 hrun1 ⟨hcl1, hro1⟩ ⟨_, _, hsp1, hx19_1, hx20_1, hx21_1, hx22_1, hx29_1, hv1, htr1⟩ + cases hmont : P.montToEd pk ((sig.getD 63 0 &&& 0x80) >>> 7) with + | none => + have hxed : xeddsaVerifyRef P pk m sig = false := verifySig_xeddsaVerifyRef_of_montToEd_none P hmont + apply verifySig_seq_seg (verifySig_seg1a_none_placed P H s1 fsp pk ((sig.getD 63 0 &&& 0x80) >>> 7) + ((pkPtr ↦ₛ bytesToBv8 pk) ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ (fsp ↦₆₄ 0#64) ∗ + memRegion (fsp + 8#64) 8 ∗ memRegion (fsp + 16#64) 32 ∗ + memRegion (fsp + 48#64) 752 ∗ memRegion (fsp + 968#64) 184 ∗ + ((fsp + 1152#64) ↦₆₄ s.readReg64 (.gpr 29#5)) ∗ ((fsp + 1160#64) ↦₆₄ retAddr) ∗ + ((fsp + 1168#64) ↦₆₄ s.readReg64 (.gpr 28#5)) ∗ + ((fsp + 1176#64) ↦₆₄ s.readReg64 (.gpr 27#5)) ∗ + ((fsp + 1184#64) ↦₆₄ s.readReg64 (.gpr 26#5)) ∗ + ((fsp + 1192#64) ↦₆₄ s.readReg64 (.gpr 25#5)) ∗ + ((fsp + 1200#64) ↦₆₄ s.readReg64 (.gpr 24#5)) ∗ + ((fsp + 1208#64) ↦₆₄ s.readReg64 (.gpr 23#5)) ∗ + ((fsp + 1216#64) ↦₆₄ s.readReg64 (.gpr 22#5)) ∗ + ((fsp + 1224#64) ↦₆₄ s.readReg64 (.gpr 21#5)) ∗ + ((fsp + 1232#64) ↦₆₄ s.readReg64 (.gpr 20#5)) ∗ + ((fsp + 1240#64) ↦₆₄ s.readReg64 (.gpr 19#5)) ∗ + stackAt fsp pqxdhHookStack ∗ (slicesPtr ↦₆₄ msgPtr) ∗ + ((slicesPtr + 8#64) ↦₆₄ BitVec.ofNat 64 m.length) ∗ + (msgPtr ↦ₛ bytesToBv8 m) ∗ Frame) + hmont hfsp_align hrun1 hpc1 hsp1) + (Entails.of_eq (by sep_ac_rfl)) + intro s2 hpc2 hrun2 ⟨_, _, hsp2, hv2, htr2⟩ + apply ProofLib.SepWP.replace_pre (hPQ := verifySig_memRegion_1152_seg1a_merge fsp) (by sep_frame) + apply verifySig_end_seg (verifySig_epilogue_false_placed H s2 fsp retAddr + (s.readReg64 (.gpr 19#5)) (s.readReg64 (.gpr 20#5)) (s.readReg64 (.gpr 21#5)) + (s.readReg64 (.gpr 22#5)) (s.readReg64 (.gpr 23#5)) (s.readReg64 (.gpr 24#5)) + (s.readReg64 (.gpr 25#5)) (s.readReg64 (.gpr 26#5)) (s.readReg64 (.gpr 27#5)) + (s.readReg64 (.gpr 28#5)) (s.readReg64 (.gpr 29#5)) + ((pkPtr ↦ₛ bytesToBv8 pk) ∗ (slicesPtr ↦₆₄ msgPtr) ∗ + ((slicesPtr + 8#64) ↦₆₄ BitVec.ofNat 64 m.length) ∗ + (msgPtr ↦ₛ bytesToBv8 m) ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ Frame) + hfsp_align hrun2 hpc2 hsp2) + (Entails.of_eq (by sep_ac_rfl)) + intro s3 P3 hP3 ⟨hrun3, hpc3, hsp3, hx0_3, h19, h20, h21, h22, h23, h24, h25, h26, h27, h28, + h29, hv3, htr3⟩ + rw [hxed] + exact ⟨Entails.trans hP3 (Entails.of_eq (by sep_ac_rfl)), hrun3, hpc3, hsp3, hx0_3, + h19, h20, h21, h22, h23, h24, h25, h26, h27, h28, h29, + hv3.trans (hv2.trans hv1), htr3.trans (htr2.trans htr1)⟩ + | some edPt => + have hedPt : edPt.length = 160 := hWF.montToEd_len pk _ edPt hmont + have hcapA : (P.compress edPt).length = 32 := hWF.compress_len edPt + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (verifySig_memRegion_752_seg1b_split fsp)) + (by sep_frame) + apply verifySig_seq_seg_lscro ⟨hcl1, hro1⟩ (verifySig_seg1b_placed_sat P H hWF hH s1 fsp pk edPt + ((sig.getD 63 0 &&& 0x80) >>> 7) + ((pkPtr ↦ₛ bytesToBv8 pk) ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ (fsp ↦₆₄ 0#64) ∗ + memRegion (fsp + 8#64) 8 ∗ memRegion (fsp + 16#64) 32 ∗ + memRegion (fsp + 400#64) 400 ∗ memRegion (fsp + 968#64) 184 ∗ + ((fsp + 1152#64) ↦₆₄ s.readReg64 (.gpr 29#5)) ∗ ((fsp + 1160#64) ↦₆₄ retAddr) ∗ + ((fsp + 1168#64) ↦₆₄ s.readReg64 (.gpr 28#5)) ∗ + ((fsp + 1176#64) ↦₆₄ s.readReg64 (.gpr 27#5)) ∗ + ((fsp + 1184#64) ↦₆₄ s.readReg64 (.gpr 26#5)) ∗ + ((fsp + 1192#64) ↦₆₄ s.readReg64 (.gpr 25#5)) ∗ + ((fsp + 1200#64) ↦₆₄ s.readReg64 (.gpr 24#5)) ∗ + ((fsp + 1208#64) ↦₆₄ s.readReg64 (.gpr 23#5)) ∗ + ((fsp + 1216#64) ↦₆₄ s.readReg64 (.gpr 22#5)) ∗ + ((fsp + 1224#64) ↦₆₄ s.readReg64 (.gpr 21#5)) ∗ + ((fsp + 1232#64) ↦₆₄ s.readReg64 (.gpr 20#5)) ∗ + ((fsp + 1240#64) ↦₆₄ s.readReg64 (.gpr 19#5)) ∗ + (slicesPtr ↦₆₄ msgPtr) ∗ ((slicesPtr + 8#64) ↦₆₄ BitVec.ofNat 64 m.length) ∗ + (msgPtr ↦ₛ bytesToBv8 m) ∗ Frame) + hmont hfsp_align hrun1 hpc1 hsp1) + (Entails.of_eq (by sep_ac_rfl)) + intro s2 hpc2 hrun2 ⟨hcl2, hro2⟩ ⟨_, _, hsp2, hx19_2, hx20_2, hx21_2, hx22_2, hx23_2, hx29_2, + hv2, htr2⟩ + have hx19_s2 : s2.readReg64 (.gpr 19#5) = sigPtr := hx19_2.trans hx19_1 + have hx20_s2 : s2.readReg64 (.gpr 20#5) = slicesPtr := hx20_2.trans hx20_1 + have hx21_s2 : s2.readReg64 (.gpr 21#5) = 1#64 := hx21_2.trans hx21_1 + have hx22_s2 : s2.readReg64 (.gpr 22#5) = BitVec.zeroExtend 64 (sig.getD 63 0).toBitVec := by + rw [hx22_2, hx22_1, bytesToBv8_getD_eq sig 63] + generalize sig.getD 63 0 = b; rcases b with ⟨bv⟩; revert bv; decide + have hx29_s2 : s2.readReg64 (.gpr 29#5) = fsp + 1152#64 := hx29_2.trans hx29_1 + cases h60 : (sig.getD 63 0 &&& 0x60 == 0) with + | false => + have hxed : xeddsaVerifyRef P pk m sig = false := verifySig_xeddsaVerifyRef_of_60_false P h60 + apply verifySig_seq_seg (verifySig_seg1c_invalid_placed H s2 sig + (memRegion (fsp + 48#64) 160 ∗ ((fsp + 208#64) ↦ₛ bytesToBv8 edPt) ∗ + ((fsp + 368#64) ↦ₛ bytesToBv8 (P.compress edPt)) ∗ memRegion (fsp + 800#64) 168 ∗ + stackAt fsp pqxdhHookStack ∗ (pkPtr ↦ₛ bytesToBv8 pk) ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ + (fsp ↦₆₄ 0#64) ∗ memRegion (fsp + 8#64) 8 ∗ memRegion (fsp + 16#64) 32 ∗ + memRegion (fsp + 400#64) 400 ∗ memRegion (fsp + 968#64) 184 ∗ + ((fsp + 1152#64) ↦₆₄ s.readReg64 (.gpr 29#5)) ∗ ((fsp + 1160#64) ↦₆₄ retAddr) ∗ + ((fsp + 1168#64) ↦₆₄ s.readReg64 (.gpr 28#5)) ∗ + ((fsp + 1176#64) ↦₆₄ s.readReg64 (.gpr 27#5)) ∗ + ((fsp + 1184#64) ↦₆₄ s.readReg64 (.gpr 26#5)) ∗ + ((fsp + 1192#64) ↦₆₄ s.readReg64 (.gpr 25#5)) ∗ + ((fsp + 1200#64) ↦₆₄ s.readReg64 (.gpr 24#5)) ∗ + ((fsp + 1208#64) ↦₆₄ s.readReg64 (.gpr 23#5)) ∗ + ((fsp + 1216#64) ↦₆₄ s.readReg64 (.gpr 22#5)) ∗ + ((fsp + 1224#64) ↦₆₄ s.readReg64 (.gpr 21#5)) ∗ + ((fsp + 1232#64) ↦₆₄ s.readReg64 (.gpr 20#5)) ∗ + ((fsp + 1240#64) ↦₆₄ s.readReg64 (.gpr 19#5)) ∗ + (slicesPtr ↦₆₄ msgPtr) ∗ ((slicesPtr + 8#64) ↦₆₄ BitVec.ofNat 64 m.length) ∗ + (msgPtr ↦ₛ bytesToBv8 m) ∗ Frame) + h60 hrun2 hpc2 hx22_s2) + (Entails.of_eq (by sep_ac_rfl)) + intro s3 hpc3 hrun3 ⟨_, _, hsp3, hv3, htr3⟩ + have hsp3_eq : s3.sp = fsp := hsp3.trans hsp2 + apply ProofLib.SepWP.replace_pre (hPQ := verifySig_memRegion_752_seg1b_merge fsp hedPt hcapA) + (by sep_frame) + apply ProofLib.SepWP.replace_pre (hPQ := verifySig_memRegion_1152_seg1a_merge fsp) (by sep_frame) + apply verifySig_end_seg (verifySig_epilogue_false_placed H s3 fsp retAddr + (s.readReg64 (.gpr 19#5)) (s.readReg64 (.gpr 20#5)) (s.readReg64 (.gpr 21#5)) + (s.readReg64 (.gpr 22#5)) (s.readReg64 (.gpr 23#5)) (s.readReg64 (.gpr 24#5)) + (s.readReg64 (.gpr 25#5)) (s.readReg64 (.gpr 26#5)) (s.readReg64 (.gpr 27#5)) + (s.readReg64 (.gpr 28#5)) (s.readReg64 (.gpr 29#5)) + ((pkPtr ↦ₛ bytesToBv8 pk) ∗ (slicesPtr ↦₆₄ msgPtr) ∗ + ((slicesPtr + 8#64) ↦₆₄ BitVec.ofNat 64 m.length) ∗ + (msgPtr ↦ₛ bytesToBv8 m) ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ Frame) + hfsp_align hrun3 hpc3 hsp3_eq) + (Entails.of_eq (by sep_ac_rfl)) + intro s4 P4 hP4 ⟨hrun4, hpc4, hsp4, hx0_4, h19, h20, h21, h22, h23, h24, h25, h26, h27, h28, + h29, hv4, htr4⟩ + rw [hxed] + exact ⟨Entails.trans hP4 (Entails.of_eq (by sep_ac_rfl)), hrun4, hpc4, hsp4, hx0_4, + h19, h20, h21, h22, h23, h24, h25, h26, h27, h28, h29, + hv4.trans (hv3.trans (hv2.trans hv1)), htr4.trans (htr3.trans (htr2.trans htr1))⟩ + | true => + have hxed_eq := verifySig_xeddsaVerifyRef_of_some P m hpk hsig h60 hmont + apply ProofLib.SepWP.replace_pre (hPQ := verifySig_seg1b_to_seg1c_split fsp) (by sep_frame) + apply verifySig_seq_seg_lscl hcl2 (verifySig_seg1c_placed_sat P H hWF hH s2 fsp sigPtr edPt sig + (memRegion (fsp + 16#64) 32 ∗ memRegion (fsp + 48#64) 160 ∗ + memRegion (fsp + 624#64) 63 ∗ memRegion (fsp + 768#64) 32 ∗ + memRegion (fsp + 800#64) 168 ∗ memRegion (fsp + 968#64) 184 ∗ + ((fsp + 1152#64) ↦₆₄ s.readReg64 (.gpr 29#5)) ∗ ((fsp + 1160#64) ↦₆₄ retAddr) ∗ + ((fsp + 1168#64) ↦₆₄ s.readReg64 (.gpr 28#5)) ∗ + ((fsp + 1176#64) ↦₆₄ s.readReg64 (.gpr 27#5)) ∗ + ((fsp + 1184#64) ↦₆₄ s.readReg64 (.gpr 26#5)) ∗ + ((fsp + 1192#64) ↦₆₄ s.readReg64 (.gpr 25#5)) ∗ + ((fsp + 1200#64) ↦₆₄ s.readReg64 (.gpr 24#5)) ∗ + ((fsp + 1208#64) ↦₆₄ s.readReg64 (.gpr 23#5)) ∗ + ((fsp + 1216#64) ↦₆₄ s.readReg64 (.gpr 22#5)) ∗ + ((fsp + 1224#64) ↦₆₄ s.readReg64 (.gpr 21#5)) ∗ + ((fsp + 1232#64) ↦₆₄ s.readReg64 (.gpr 20#5)) ∗ + ((fsp + 1240#64) ↦₆₄ s.readReg64 (.gpr 19#5)) ∗ + (pkPtr ↦ₛ bytesToBv8 pk) ∗ (slicesPtr ↦₆₄ msgPtr) ∗ + ((slicesPtr + 8#64) ↦₆₄ BitVec.ofNat 64 m.length) ∗ + (msgPtr ↦ₛ bytesToBv8 m) ∗ Frame) + hro2 hedPt hsig h60 hfsp_align hrun2 hpc2 hsp2 hx19_s2 hx22_s2) + (Entails.of_eq (by sep_ac_rfl)) + intro s3 hpc3 hrun3 hcl3 ⟨_, _, hsp3, hx20_3, hx21_3, hx23_3, hx29_3, hv3, htr3⟩ + have hx20_s3 : s3.readReg64 (.gpr 20#5) = slicesPtr := hx20_3.trans hx20_s2 + have hx21_s3 : s3.readReg64 (.gpr 21#5) = 1#64 := hx21_3.trans hx21_s2 + have hx23_s3 : s3.readReg64 (.gpr 23#5) = fsp + 800#64 := hx23_3.trans hx23_2 + have hx29_s3 : s3.readReg64 (.gpr 29#5) = fsp + 1152#64 := hx29_3.trans hx29_s2 + have hpre64 : (sig.take 32 ++ P.compress edPt).length = 64 := by simp [hsig, hcapA] + have hshaIV : sha512IVBytesLE = bytesToBv8 (revWords64 sha512InitState) := rfl + have hst0 : (revWords64 sha512InitState).length = 64 := revWords64_length (by decide) + rw [hshaIV] + rcases hm with hm33 | hm1569 + · rw [hm33, show BitVec.ofNat 64 33 = 33#64 from rfl] + apply verifySig_seq_seg_lscl hcl3 (verifySig_seg2_33_placed_sat P H hH s3 fsp slicesPtr msgPtr + (sig.take 32 ++ P.compress edPt) m (revWords64 sha512InitState) + (memRegion fsp 4 ∗ + ((fsp + 4#64) ↦₃₂ (BitVec.zeroExtend 32 ((bytesToBv8 sig).getD 63 0#8) &&& 0x7f#32)) ∗ + ((fsp + 8#64) ↦₆₄ sigPtr) ∗ memRegion (fsp + 16#64) 32 ∗ + memRegion (fsp + 48#64) 160 ∗ memRegion (fsp + 208#64) 160 ∗ + ((fsp + 368#64) ↦ₛ bytesToBv8 (P.compress edPt)) ∗ + ((fsp + 400#64) ↦ₛ bytesToBv8 (P.edNeg edPt)) ∗ + memRegion (fsp + 768#64) 32 ∗ memRegion (fsp + 800#64) 168 ∗ + memRegion (fsp + 968#64) 184 ∗ + ((fsp + 1152#64) ↦₆₄ s.readReg64 (.gpr 29#5)) ∗ ((fsp + 1160#64) ↦₆₄ retAddr) ∗ + ((fsp + 1168#64) ↦₆₄ s.readReg64 (.gpr 28#5)) ∗ + ((fsp + 1176#64) ↦₆₄ s.readReg64 (.gpr 27#5)) ∗ + ((fsp + 1184#64) ↦₆₄ s.readReg64 (.gpr 26#5)) ∗ + ((fsp + 1192#64) ↦₆₄ s.readReg64 (.gpr 25#5)) ∗ + ((fsp + 1200#64) ↦₆₄ s.readReg64 (.gpr 24#5)) ∗ + ((fsp + 1208#64) ↦₆₄ s.readReg64 (.gpr 23#5)) ∗ + ((fsp + 1216#64) ↦₆₄ s.readReg64 (.gpr 22#5)) ∗ + ((fsp + 1224#64) ↦₆₄ s.readReg64 (.gpr 21#5)) ∗ + ((fsp + 1232#64) ↦₆₄ s.readReg64 (.gpr 20#5)) ∗ + ((fsp + 1240#64) ↦₆₄ s.readReg64 (.gpr 19#5)) ∗ + (pkPtr ↦ₛ bytesToBv8 pk) ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ Frame) + hpre64 hm33 hfsp_align hrun3 hpc3 hsp3 hx20_s3 hx21_s3) + (Entails.of_eq (by sep_ac_rfl)) + intro s4 hpc4 hrun4 hcl4 ⟨_, _, hsp4, hx23_4, hx29_4, hv4, htr4⟩ + have hx23_s4 : s4.readReg64 (.gpr 23#5) = fsp + 800#64 := hx23_4.trans hx23_s3 + have hx29_s4 : s4.readReg64 (.gpr 29#5) = fsp + 1152#64 := hx29_4.trans hx29_s3 + have htail97 : ((sig.take 32 ++ P.compress edPt) ++ m).length = 97 := by + simp [hsig, hcapA, hm33] + have hsha_eq : revWords64 (sha512CompressOutBytes P (revWords64 sha512InitState) + (((sig.take 32 ++ P.compress edPt) ++ m) ++ [0x80] ++ List.replicate 14 0 ++ + encodeBitLen128BE 97)) = + P.sha512 (sig.take 32 ++ P.compress edPt ++ m) := by + rw [hWF.sha512_eq_ref, sha512Ref_of_length_97 P htail97] + apply verifySig_end_seg (verifySig_tail_from_548_placed_sat P H hWF hH s4 fsp sigPtr retAddr + (s.readReg64 (.gpr 19#5)) (s.readReg64 (.gpr 20#5)) (s.readReg64 (.gpr 21#5)) + (s.readReg64 (.gpr 22#5)) (s.readReg64 (.gpr 23#5)) (s.readReg64 (.gpr 24#5)) + (s.readReg64 (.gpr 25#5)) (s.readReg64 (.gpr 26#5)) (s.readReg64 (.gpr 27#5)) + (s.readReg64 (.gpr 28#5)) (s.readReg64 (.gpr 29#5)) + edPt m sig ((sig.take 32 ++ P.compress edPt) ++ m) (revWords64 sha512InitState) 0#64 97 + ((pkPtr ↦ₛ bytesToBv8 pk) ∗ (slicesPtr ↦₆₄ msgPtr) ∗ + ((slicesPtr + 8#64) ↦₆₄ 33#64) ∗ (msgPtr ↦ₛ bytesToBv8 m) ∗ Frame) + hcl4 hedPt hsig htail97 hst0 (Or.inl ⟨rfl, rfl⟩) + hsha_eq hfsp_align hrun4 hpc4 hsp4 hx23_s4 hx29_s4) + (Entails.of_eq (by sep_ac_rfl)) + intro s5 P5 hP5 ⟨hrun5, hpc5, hsp5, hx0_5, h19, h20, h21, h22, h23, h24, h25, h26, h27, h28, + h29, hv5, htr5⟩ + exact ⟨Entails.trans hP5 (Entails.of_eq (by sep_ac_rfl)), hrun5, hpc5, hsp5, + hx0_5.trans hxed_eq, h19, h20, h21, h22, h23, h24, h25, h26, h27, h28, h29, + hv5.trans (hv4.trans (hv3.trans (hv2.trans hv1))), + htr5.trans (htr4.trans (htr3.trans (htr2.trans htr1)))⟩ + · rw [hm1569, show BitVec.ofNat 64 1569 = 1569#64 from rfl] + apply verifySig_seq_seg_lscl hcl3 (verifySig_seg2_1569_placed_sat P H hH s3 fsp slicesPtr msgPtr + (sig.take 32 ++ P.compress edPt) m (revWords64 sha512InitState) + (memRegion fsp 4 ∗ + ((fsp + 4#64) ↦₃₂ (BitVec.zeroExtend 32 ((bytesToBv8 sig).getD 63 0#8) &&& 0x7f#32)) ∗ + ((fsp + 8#64) ↦₆₄ sigPtr) ∗ memRegion (fsp + 16#64) 32 ∗ + memRegion (fsp + 48#64) 160 ∗ memRegion (fsp + 208#64) 160 ∗ + ((fsp + 368#64) ↦ₛ bytesToBv8 (P.compress edPt)) ∗ + ((fsp + 400#64) ↦ₛ bytesToBv8 (P.edNeg edPt)) ∗ + memRegion (fsp + 768#64) 32 ∗ memRegion (fsp + 800#64) 168 ∗ + memRegion (fsp + 968#64) 184 ∗ + ((fsp + 1152#64) ↦₆₄ s.readReg64 (.gpr 29#5)) ∗ ((fsp + 1160#64) ↦₆₄ retAddr) ∗ + ((fsp + 1168#64) ↦₆₄ s.readReg64 (.gpr 28#5)) ∗ + ((fsp + 1176#64) ↦₆₄ s.readReg64 (.gpr 27#5)) ∗ + ((fsp + 1184#64) ↦₆₄ s.readReg64 (.gpr 26#5)) ∗ + ((fsp + 1192#64) ↦₆₄ s.readReg64 (.gpr 25#5)) ∗ + ((fsp + 1200#64) ↦₆₄ s.readReg64 (.gpr 24#5)) ∗ + ((fsp + 1208#64) ↦₆₄ s.readReg64 (.gpr 23#5)) ∗ + ((fsp + 1216#64) ↦₆₄ s.readReg64 (.gpr 22#5)) ∗ + ((fsp + 1224#64) ↦₆₄ s.readReg64 (.gpr 21#5)) ∗ + ((fsp + 1232#64) ↦₆₄ s.readReg64 (.gpr 20#5)) ∗ + ((fsp + 1240#64) ↦₆₄ s.readReg64 (.gpr 19#5)) ∗ + (pkPtr ↦ₛ bytesToBv8 pk) ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ Frame) + hpre64 hm1569 hst0 hfsp_align hrun3 hpc3 hsp3 hx20_s3 hx21_s3) + (Entails.of_eq (by sep_ac_rfl)) + intro s4 hpc4 hrun4 hcl4 ⟨_, _, hsp4, hx23_4, hx29_4, hv4, htr4⟩ + have hx23_s4 : s4.readReg64 (.gpr 23#5) = fsp + 800#64 := hx23_4.trans hx23_s3 + have hx29_s4 : s4.readReg64 (.gpr 29#5) = fsp + 1152#64 := hx29_4.trans hx29_s3 + have hblk0 : ((sig.take 32 ++ P.compress edPt) ++ m.take 64).length = 128 := by + simp [hsig, hcapA, hm1569] + have hblks11 : ((m.drop 64).take 1408).length = 1408 := by simp [hm1569] + have htail97 : (m.drop 1472).length = 97 := by simp [hm1569] + have hm_split : ((sig.take 32 ++ P.compress edPt) ++ m.take 64) ++ (m.drop 64).take 1408 ++ + m.drop 1472 = sig.take 32 ++ P.compress edPt ++ m := by + have h1 : (m.drop 64).take 1408 ++ m.drop 1472 = m.drop 64 := by + rw [show (1472 : Nat) = 64 + 1408 from rfl, ← List.drop_drop, List.take_append_drop] + rw [List.append_assoc, List.append_assoc ((sig.take 32 ++ P.compress edPt)), h1, + List.take_append_drop] + have hst12 : (sha512CompressOutBytes P (sha512CompressOutBytes P + (revWords64 sha512InitState) ((sig.take 32 ++ P.compress edPt) ++ m.take 64)) + ((m.drop 64).take 1408)).length = 64 := + sha512CompressOutBytes_length P _ _ + have hsha_eq : revWords64 (sha512CompressOutBytes P + (sha512CompressOutBytes P (sha512CompressOutBytes P (revWords64 sha512InitState) + ((sig.take 32 ++ P.compress edPt) ++ m.take 64)) ((m.drop 64).take 1408)) + (m.drop 1472 ++ [0x80] ++ List.replicate 14 0 ++ encodeBitLen128BE 1633)) = + P.sha512 (sig.take 32 ++ P.compress edPt ++ m) := by + rw [hWF.sha512_eq_ref, ← hm_split, sha512Ref_of_length_1633 P hblk0 hblks11 htail97] + apply verifySig_end_seg (verifySig_tail_from_548_placed_sat P H hWF hH s4 fsp sigPtr retAddr + (s.readReg64 (.gpr 19#5)) (s.readReg64 (.gpr 20#5)) (s.readReg64 (.gpr 21#5)) + (s.readReg64 (.gpr 22#5)) (s.readReg64 (.gpr 23#5)) (s.readReg64 (.gpr 24#5)) + (s.readReg64 (.gpr 25#5)) (s.readReg64 (.gpr 26#5)) (s.readReg64 (.gpr 27#5)) + (s.readReg64 (.gpr 28#5)) (s.readReg64 (.gpr 29#5)) + edPt m sig (m.drop 1472) + (sha512CompressOutBytes P (sha512CompressOutBytes P (revWords64 sha512InitState) + ((sig.take 32 ++ P.compress edPt) ++ m.take 64)) ((m.drop 64).take 1408)) + 12#64 1633 + ((pkPtr ↦ₛ bytesToBv8 pk) ∗ (slicesPtr ↦₆₄ msgPtr) ∗ + ((slicesPtr + 8#64) ↦₆₄ 1569#64) ∗ (msgPtr ↦ₛ bytesToBv8 m) ∗ Frame) + hcl4 hedPt hsig htail97 hst12 (Or.inr ⟨rfl, rfl⟩) + hsha_eq hfsp_align hrun4 hpc4 hsp4 hx23_s4 hx29_s4) + (Entails.of_eq (by sep_ac_rfl)) + intro s5 P5 hP5 ⟨hrun5, hpc5, hsp5, hx0_5, h19, h20, h21, h22, h23, h24, h25, h26, h27, h28, + h29, hv5, htr5⟩ + exact ⟨Entails.trans hP5 (Entails.of_eq (by sep_ac_rfl)), hrun5, hpc5, hsp5, + hx0_5.trans hxed_eq, h19, h20, h21, h22, h23, h24, h25, h26, h27, h28, h29, + hv5.trans (hv4.trans (hv3.trans (hv2.trans hv1))), + htr5.trans (htr4.trans (htr3.trans (htr2.trans htr1)))⟩ + +public theorem verifySignatureMultipart_placed_ok'_sat [LibsignalPlacement] + {P : Primitives} {H : LibsignalHooks} + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) : + subroutine_ok ((blkPC_204).rebase (blkPl_204).base H) + (blkPl_204).base + (withLsCodeRoLoaded lsmpl (verifySignatureMultipartCallSpec P)) := by + refine subroutine_ok_of_sepWP fun g R s0 hpc hrun hpre hsp => ?_ + obtain ⟨⟨hcl, hro_all⟩, hpre0⟩ := extract_withLsCodeRoLoaded hpre + have hro := sha512IV_placed_holdsBytes hro_all + dsimp only [verifySignatureMultipartCallSpec] at hpre0 + rw [sepConj_assoc, satisfies_pure_sepConj] at hpre0 + rcases hpre0 with ⟨⟨hx0, hx1, hx2, hx3, hx4, hpk, hm, hsig⟩, hmem⟩ + have hfsp_align : ((s0.sp - 1248#64) &&& 15#64 == 0#64) = true := + ProofLib.spAligned_sub s0.sp 1248#64 hsp (by decide) + have hfsp_add : (s0.sp - 1248#64) + 1248#64 = s0.sp := by bv_omega + refine ⟨((g.pkPtr ↦ₛ bytesToBv8 g.pk) ∗ (g.slicesPtr ↦₆₄ g.msgPtr) ∗ + ((g.slicesPtr + 8#64) ↦₆₄ BitVec.ofNat 64 g.m.length) ∗ + (g.msgPtr ↦ₛ bytesToBv8 g.m) ∗ (g.sigPtr ↦ₛ bytesToBv8 g.sig) ∗ + stackAt ((s0.sp - 1248#64) + 1248#64) (pqxdhHookStack + 1248) ∗ emp), R, ?_, ?_⟩ + · rw [hfsp_add, sepConj_emp] + exact Arm64.Satisfies.of_eq hmem (by sep_ac_rfl) + · refine SepWP.mono + (verifySignatureMultipart_sepWP_placed_sat P H hWF hH s0 (s0.sp - 1248#64) + g.pkPtr g.slicesPtr g.msgPtr g.sigPtr (s0.readReg64 Reg.lr) + g.pk g.m g.sig emp hcl hro hpk hm hsig hfsp_align hrun hpc hfsp_add.symm + hx0 hx1 hx2 hx3 hx4 rfl) ?_ + intro sf Pf _ _ ⟨hPf, _, _, hsp_f, hx0_f, + h19, h20, h21, h22, h23, h24, h25, h26, h27, h28, h29, hvregs, htr⟩ + refine ⟨fun hsat => ?_, hsp_f.trans hfsp_add, + ⟨h19, h20, h21, h22, h23, h24, h25, h26, h27, h28, h29, hvregs⟩⟩ + rw [hfsp_add, sepConj_emp] at hPf + dsimp only [verifySignatureMultipartCallSpec] + rw [sepConj_assoc, satisfies_pure_sepConj] + exact ⟨⟨hx0_f, htr⟩, + Arm64.Satisfies.mono + (sepConj_mono_left (Entails.trans hPf (Entails.of_eq (by sep_ac_rfl)))) hsat⟩ + +public theorem verifySignatureMultipart_placed_ok_of_block'_sat [LibsignalPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 204) + (withLsCodeRoLoaded lsmpl (verifySignatureMultipartCallSpec P)) := by + simpa only [ls_blockPlacement_base] using + keys_ls_subroutine_ok_of_block_cro (j := 204) + (verifySignatureMultipart_placed_ok'_sat hWF hH) hi + +public theorem verifySignatureMultipart_placed_frozen_ok_of_block'_sat [LibsignalPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 204) + (withLsFrozen lsmpl (verifySignatureMultipartCallSpec P)) := + subroutine_ok_withLsFrozen_of_withLsCodeRoLoaded + (verifySignatureMultipart_placed_ok_of_block'_sat hWF hH hi) + +/-- `subroutine_ok` for Block `204` (`verify_signature_for_multipart_message`) on its own block + program under `[LibsignalPlacement]` and `VerifySignaturePlacedHooksSat P H`. -/ +public theorem verifySignatureMultipart_placed_ok_sat [LibsignalPlacement] + {P : Primitives} {H : LibsignalHooks} + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooksSat P H) : + subroutine_ok ((blkPC_204).rebase (blkPl_204).base H) + (blkPl_204).base + (withLsCodeRoLoaded lsmpl (verifySignatureMultipartCallSpec P)) := + verifySignatureMultipart_placed_ok'_sat hWF (.of_hooks hH) + +public theorem verifySignatureMultipart_placed_ok_of_block_sat [LibsignalPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooksSat P H) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 204) + (withLsCodeRoLoaded lsmpl (verifySignatureMultipartCallSpec P)) := + verifySignatureMultipart_placed_ok_of_block'_sat hWF (.of_hooks hH) hi + +public theorem verifySignatureMultipart_placed_frozen_ok_of_block_sat [LibsignalPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooksSat P H) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 204) + (withLsFrozen lsmpl (verifySignatureMultipartCallSpec P)) := + verifySignatureMultipart_placed_frozen_ok_of_block'_sat hWF (.of_hooks hH) hi + +/-! ## Block `203` (`verify_signature`, `HookSat` Siblings) -/ + +private theorem verifySig_stackAt_1280_split (fsp : BitVec 64) : + stackAt (fsp + 1280#64) (pqxdhHookStack + 1280) = + stackAt (fsp + 1248#64) (pqxdhHookStack + 1248) ∗ cells (fsp + 1248#64) 4 := by + have h1 : fsp + 1280#64 - 32#64 = fsp + 1248#64 := by bv_omega + have h2 : pqxdhHookStack + 1280 = (pqxdhHookStack + 1248) + 4 * 8 := by decide + rw [h2, + CryptoVerification.E2E.Pqxdh.Shared.stackAt_split_cells + (fsp + 1280#64) (pqxdhHookStack + 1248) 4 (by decide), + h1] + +/-- Full end-to-end `SepWP` theorem for Block `203` (`verify_signature`) under + `[LibsignalPlacement]` and `VerifySignaturePlacedHooks'Sat P H`, returning + `P.sigVerify pk m sig` in `x0`. -/ +public theorem verifySignature_sepWP_placed_sat [LibsignalPlacement] + (P : Primitives) (H : LibsignalHooks) (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) + (s : State) (fsp pkPtr msgPtr sigPtr retAddr : BitVec 64) + (pk m sig : Bytes) + (Frame : SepProp) + (hcl : LibsignalCodeLoaded lsmpl s.mem) + (hro : Obj.HoldsBytes s.mem (lsmpl.ρ lsVerifySha512IVRoSym) sha512IVBytesLE (fun _ => Perm.ro)) + (hpk : pk.length = 32) + (hm : m.length = 33 ∨ m.length = 1569) + (hsig : sig.length = 64) + (hfsp_align : fsp &&& 15#64 == 0#64) + (hrun : s.status = ExecStatus.Running) + (hpc : s.pc = (blkPl_203).base) + (hsp : s.sp = fsp + 1280#64) + (hx0 : s.readReg64 (.gpr 0#5) = pkPtr) + (hx1 : s.readReg64 (.gpr 1#5) = msgPtr) + (hx2 : s.readReg64 (.gpr 2#5) = BitVec.ofNat 64 m.length) + (hx3 : s.readReg64 (.gpr 3#5) = sigPtr) + (hx4 : s.readReg64 (.gpr 4#5) = 64#64) + (hx30 : s.readReg64 (.gpr 30#5) = retAddr) : + SepWP ((blkPC_203).rebase (blkPl_203).base H) + retAddr + s + ((pkPtr ↦ₛ bytesToBv8 pk) ∗ + (msgPtr ↦ₛ bytesToBv8 m) ∗ + (sigPtr ↦ₛ bytesToBv8 sig) ∗ + stackAt (fsp + 1280#64) (pqxdhHookStack + 1280) ∗ + Frame) + (fun sm Pm => + (Pm ⊢ + (pkPtr ↦ₛ bytesToBv8 pk) ∗ + (msgPtr ↦ₛ bytesToBv8 m) ∗ + (sigPtr ↦ₛ bytesToBv8 sig) ∗ + stackAt (fsp + 1280#64) (pqxdhHookStack + 1280) ∗ + Frame) ∧ + sm.status = ExecStatus.Running ∧ + sm.pc = retAddr ∧ + sm.sp = fsp + 1280#64 ∧ + sm.readReg64 (.gpr 0#5) = (if P.sigVerify pk m sig = true then 1#64 else 0#64) ∧ + sm.readReg64 (.gpr 19#5) = s.readReg64 (.gpr 19#5) ∧ + sm.readReg64 (.gpr 20#5) = s.readReg64 (.gpr 20#5) ∧ + sm.readReg64 (.gpr 21#5) = s.readReg64 (.gpr 21#5) ∧ + sm.readReg64 (.gpr 22#5) = s.readReg64 (.gpr 22#5) ∧ + sm.readReg64 (.gpr 23#5) = s.readReg64 (.gpr 23#5) ∧ + sm.readReg64 (.gpr 24#5) = s.readReg64 (.gpr 24#5) ∧ + sm.readReg64 (.gpr 25#5) = s.readReg64 (.gpr 25#5) ∧ + sm.readReg64 (.gpr 26#5) = s.readReg64 (.gpr 26#5) ∧ + sm.readReg64 (.gpr 27#5) = s.readReg64 (.gpr 27#5) ∧ + sm.readReg64 (.gpr 28#5) = s.readReg64 (.gpr 28#5) ∧ + sm.readReg64 (.gpr 29#5) = s.readReg64 (.gpr 29#5) ∧ + calleeSavedVRegs sm = calleeSavedVRegs s ∧ + sm.trace = s.trace) := by + apply ProofLib.SepWP.replace_pre (hPQ := Entails.of_eq (verifySig_stackAt_1280_split fsp)) + (by sep_frame) + apply verifySig_seq_seg_lscro ⟨hcl, hro⟩ + (verifySignature_prologue_placed H s fsp pkPtr msgPtr (BitVec.ofNat 64 m.length) sigPtr retAddr + ((pkPtr ↦ₛ bytesToBv8 pk) ∗ (msgPtr ↦ₛ bytesToBv8 m) ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ + stackAt (fsp + 1248#64) (pqxdhHookStack + 1248) ∗ Frame) + hfsp_align hrun hpc hsp hx0 hx1 hx2 hx3 hx4 hx30) + (Entails.of_eq (by sep_ac_rfl)) + intro s1 hpc1 hrun1 ⟨hcl1, hro1⟩ ⟨_, _, hsp1, hx0_1, hx1_1, hx2_1, hx3_1, hx4_1, hx30_1, + h19_1, h20_1, h21_1, h22_1, h23_1, h24_1, h25_1, h26_1, h27_1, h28_1, hv1, htr1⟩ + have hpc1_204 : s1.pc = (blkPl_204).base := hpc1 + have hmp_on_203 := lsjump_blk (callerProg := (blkPC_203).rebase (blkPl_203).base H) + hcl1 (by decide) (by decide) (by decide) + (verifySignatureMultipart_sepWP_placed_sat P H hWF hH s1 fsp pkPtr (fsp + 1248#64) msgPtr sigPtr + ((blkPl_203).base + 28#64) pk m sig + (((fsp + 1264#64) ↦₆₄ s.readReg64 (.gpr 29#5)) ∗ ((fsp + 1272#64) ↦₆₄ retAddr) ∗ Frame) + hcl1 hro1 hpk hm hsig hfsp_align hrun1 hpc1_204 hsp1 hx0_1 hx1_1 hx2_1 hx3_1 hx4_1 hx30_1) + apply verifySig_seq_seg hmp_on_203 + (Entails.of_eq (by simp only [BitVec.add_assoc, BitVec.reduceAdd]; sep_ac_rfl)) + intro s2 hpc2 hrun2 ⟨_, _, hsp2, hx0_2, h19_2, h20_2, h21_2, h22_2, h23_2, h24_2, h25_2, h26_2, + h27_2, h28_2, _, hv2, htr2⟩ + apply verifySig_end_seg + (verifySignature_epilogue_placed H s2 fsp msgPtr (BitVec.ofNat 64 m.length) + (s.readReg64 (.gpr 29#5)) retAddr + ((pkPtr ↦ₛ bytesToBv8 pk) ∗ (msgPtr ↦ₛ bytesToBv8 m) ∗ (sigPtr ↦ₛ bytesToBv8 sig) ∗ Frame) + hfsp_align hrun2 hpc2 hsp2) + (Entails.of_eq (by simp only [BitVec.add_assoc, BitVec.reduceAdd]; sep_ac_rfl)) + intro s3 P3 hP3 ⟨hrun3, hpc3, hsp3, hx0_3, h19_3, h20_3, h21_3, h22_3, h23_3, h24_3, h25_3, h26_3, + h27_3, h28_3, h29_3, hv3, htr3⟩ + rw [hWF.sigVerify_eq_xeddsaVerifyRef pk m sig] + exact ⟨Entails.trans hP3 (Entails.of_eq (by sep_ac_rfl)), hrun3, hpc3, hsp3, + hx0_3.trans hx0_2, + h19_3.trans (h19_2.trans h19_1), h20_3.trans (h20_2.trans h20_1), + h21_3.trans (h21_2.trans h21_1), h22_3.trans (h22_2.trans h22_1), + h23_3.trans (h23_2.trans h23_1), h24_3.trans (h24_2.trans h24_1), + h25_3.trans (h25_2.trans h25_1), h26_3.trans (h26_2.trans h26_1), + h27_3.trans (h27_2.trans h27_1), h28_3.trans (h28_2.trans h28_1), + h29_3, hv3.trans (hv2.trans hv1), htr3.trans (htr2.trans htr1)⟩ + +public theorem verifySignature_placed_ok'_sat [LibsignalPlacement] + {P : Primitives} {H : LibsignalHooks} + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) : + subroutine_ok ((blkPC_203).rebase (blkPl_203).base H) + (blkPl_203).base + (withLsCodeRoLoaded lsmpl (verifySignatureCallSpec P)) := by + refine subroutine_ok_of_sepWP fun g R s0 hpc hrun hpre hsp => ?_ + obtain ⟨⟨hcl, hro_all⟩, hpre0⟩ := extract_withLsCodeRoLoaded hpre + have hro := sha512IV_placed_holdsBytes hro_all + dsimp only [verifySignatureCallSpec] at hpre0 + rw [sepConj_assoc, satisfies_pure_sepConj] at hpre0 + rcases hpre0 with ⟨⟨hx0, hx1, hx2, hx3, hx4, hpk, hm, hsig⟩, hmem⟩ + have hfsp_align : ((s0.sp - 1280#64) &&& 15#64 == 0#64) = true := + ProofLib.spAligned_sub s0.sp 1280#64 hsp (by decide) + have hfsp_add : (s0.sp - 1280#64) + 1280#64 = s0.sp := by bv_omega + refine ⟨((g.pkPtr ↦ₛ bytesToBv8 g.pk) ∗ (g.msgPtr ↦ₛ bytesToBv8 g.m) ∗ + (g.sigPtr ↦ₛ bytesToBv8 g.sig) ∗ + stackAt ((s0.sp - 1280#64) + 1280#64) (pqxdhHookStack + 1280) ∗ emp), R, ?_, ?_⟩ + · rw [hfsp_add, sepConj_emp] + exact Arm64.Satisfies.of_eq hmem (by sep_ac_rfl) + · refine SepWP.mono + (verifySignature_sepWP_placed_sat P H hWF hH s0 (s0.sp - 1280#64) + g.pkPtr g.msgPtr g.sigPtr (s0.readReg64 Reg.lr) + g.pk g.m g.sig emp hcl hro hpk hm hsig hfsp_align hrun hpc hfsp_add.symm + hx0 hx1 hx2 hx3 hx4 rfl) ?_ + intro sf Pf _ _ ⟨hPf, _, _, hsp_f, hx0_f, + h19, h20, h21, h22, h23, h24, h25, h26, h27, h28, h29, hvregs, htr⟩ + refine ⟨fun hsat => ?_, hsp_f.trans hfsp_add, + ⟨h19, h20, h21, h22, h23, h24, h25, h26, h27, h28, h29, hvregs⟩⟩ + rw [hfsp_add, sepConj_emp] at hPf + dsimp only [verifySignatureCallSpec] + rw [sepConj_assoc, satisfies_pure_sepConj] + exact ⟨⟨hx0_f, htr⟩, + Arm64.Satisfies.mono + (sepConj_mono_left (Entails.trans hPf (Entails.of_eq (by sep_ac_rfl)))) hsat⟩ + +public theorem verifySignature_placed_ok_of_block'_sat [LibsignalPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 203) + (withLsCodeRoLoaded lsmpl (verifySignatureCallSpec P)) := by + simpa only [ls_blockPlacement_base] using + keys_ls_subroutine_ok_of_block_cro (j := 203) + (verifySignature_placed_ok'_sat hWF hH) hi + +public theorem verifySignature_placed_frozen_ok_of_block'_sat [LibsignalPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 203) + (withLsFrozen lsmpl (verifySignatureCallSpec P)) := + subroutine_ok_withLsFrozen_of_withLsCodeRoLoaded + (verifySignature_placed_ok_of_block'_sat hWF hH hi) + +/-- `subroutine_ok` for Block `203` (`verify_signature`) on its own block program under + `[LibsignalPlacement]` and `VerifySignaturePlacedHooksSat P H`. -/ +public theorem verifySignature_placed_ok_sat [LibsignalPlacement] + {P : Primitives} {H : LibsignalHooks} + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooksSat P H) : + subroutine_ok ((blkPC_203).rebase (blkPl_203).base H) + (blkPl_203).base + (withLsCodeRoLoaded lsmpl (verifySignatureCallSpec P)) := + verifySignature_placed_ok'_sat hWF (.of_hooks hH) + +public theorem verifySignature_placed_ok_of_block_sat [LibsignalPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooksSat P H) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 203) + (withLsCodeRoLoaded lsmpl (verifySignatureCallSpec P)) := + verifySignature_placed_ok_of_block'_sat hWF (.of_hooks hH) hi + +public theorem verifySignature_placed_frozen_ok_of_block_sat [LibsignalPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooksSat P H) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 203) + (withLsFrozen lsmpl (verifySignatureCallSpec P)) := + verifySignature_placed_frozen_ok_of_block'_sat hWF (.of_hooks hH) hi + +/-! ## Explicit-`h_canon` `[LibsignalPlacement]` Bundle (`HookSat` Siblings) -/ + +public theorem curveVerifyAndCanon_placed_ok_of_canon'_sat [LibsignalPlacement] {α : Type} + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + {canonSpec : Spec α} + (h_canon : subroutine_ok callerProg (lsmpl.base 202) canonSpec) + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) + (hi : i < 619 := by decide) : + CurveVerifyAndCanonPlacedOk P callerProg canonSpec where + isCanonical := h_canon + verifySignature := verifySignature_placed_ok_of_block'_sat hWF hH hi + verifySignatureMultipart := verifySignatureMultipart_placed_ok_of_block'_sat hWF hH hi + +public theorem curveVerifyAndCanon_placed_ok_of_canon_sat [LibsignalPlacement] {α : Type} + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + {canonSpec : Spec α} + (h_canon : subroutine_ok callerProg (lsmpl.base 202) canonSpec) + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooksSat P H) + (hi : i < 619 := by decide) : + CurveVerifyAndCanonPlacedOk P callerProg canonSpec := + curveVerifyAndCanon_placed_ok_of_canon'_sat h_canon hWF (.of_hooks hH) hi + +/-! ## `[LibsignalFullPlacement]` Corollaries (`HookSat` Siblings) -/ + +public theorem verifySignatureMultipart_full_placed_ok'_sat [LibsignalFullPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hWF : StructuralPrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 204) + (withLsCodeRoLoaded lsmpl (verifySignatureMultipartCallSpec P)) := + verifySignatureMultipart_placed_ok_of_block'_sat (.of_structuralPrims hWF) hH hi + +public theorem verifySignature_full_placed_ok'_sat [LibsignalFullPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hWF : StructuralPrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 203) + (withLsCodeRoLoaded lsmpl (verifySignatureCallSpec P)) := + verifySignature_placed_ok_of_block'_sat (.of_structuralPrims hWF) hH hi + +public theorem curveVerifyAndCanon_full_placed_ok'_placed_sat [LibsignalFullPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hisCanon : ∀ k, P.isCanonicalEC k = isCanonicalRef P k) + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) + (htorsHook : HookSat H lsDalekTorsionFreeSym (cryptoBoolRegStubSpec P.isTorsionFree 160)) + (hi : i < 619 := by decide) : + CurveVerifyAndCanonPlacedOk P callerProg + (libsignalSessionLib.withCodeLoaded lsmpl (ecPubKeyIsCanonicalCallSpec P)) := + curveVerifyAndCanon_placed_ok_of_canon'_sat + (isCanonical_placed_ok'_cl_placed hisCanon hWF.montToEd_len hH.montToEd htorsHook) + hWF hH hi + +public theorem curveVerifyAndCanon_full_placed_ok_placed_sat [LibsignalFullPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hWF : StructuralPrims P) + (hH : VerifySignaturePlacedHooks'Sat P H) + (htorsHook : HookSat H lsDalekTorsionFreeSym (cryptoBoolRegStubSpec P.isTorsionFree 160)) + (hi : i < 619 := by decide) : + CurveVerifyAndCanonPlacedOk P callerProg + (libsignalSessionLib.withCodeLoaded lsmpl (ecPubKeyIsCanonicalCallSpec P)) := + curveVerifyAndCanon_placed_ok_of_canon'_sat + (isCanonical_placed_ok_cl_placed hWF hH.montToEd htorsHook) + (.of_structuralPrims hWF) hH hi + +public theorem verifySignatureMultipart_full_placed_ok_sat [LibsignalFullPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hWF : StructuralPrims P) + (hH : VerifySignaturePlacedHooksSat P H) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 204) + (withLsCodeRoLoaded lsmpl (verifySignatureMultipartCallSpec P)) := + verifySignatureMultipart_full_placed_ok'_sat hWF (.of_hooks hH) hi + +public theorem verifySignature_full_placed_ok_sat [LibsignalFullPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hWF : StructuralPrims P) + (hH : VerifySignaturePlacedHooksSat P H) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (lsmpl.base 203) + (withLsCodeRoLoaded lsmpl (verifySignatureCallSpec P)) := + verifySignature_full_placed_ok'_sat hWF (.of_hooks hH) hi + +public theorem curveVerifyAndCanon_full_placed_ok'_sat [LibsignalFullPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hisCanon : ∀ k, P.isCanonicalEC k = isCanonicalRef P k) + (hWF : VerifySignaturePrims P) + (hH : VerifySignaturePlacedHooksSat P H) + (htorsHook : HookSat H lsDalekTorsionFreeSym (cryptoBoolRegStubSpec P.isTorsionFree 160)) + (hi : i < 619 := by decide) : + CurveVerifyAndCanonPlacedOk P callerProg + (libsignalSessionLib.withCodeLoaded lsmpl (ecPubKeyIsCanonicalCallSpec P)) := + curveVerifyAndCanon_full_placed_ok'_placed_sat hisCanon hWF (.of_hooks hH) htorsHook hi + +public theorem curveVerifyAndCanon_full_placed_ok_sat [LibsignalFullPlacement] + {callerProg : Program} {i : Nat} {P : Primitives} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hWF : StructuralPrims P) + (hH : VerifySignaturePlacedHooksSat P H) + (htorsHook : HookSat H lsDalekTorsionFreeSym (cryptoBoolRegStubSpec P.isTorsionFree 160)) + (hi : i < 619 := by decide) : + CurveVerifyAndCanonPlacedOk P callerProg + (libsignalSessionLib.withCodeLoaded lsmpl (ecPubKeyIsCanonicalCallSpec P)) := + curveVerifyAndCanon_full_placed_ok_placed_sat hWF (.of_hooks hH) htorsHook hi + +end LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedSat diff --git a/LibsignalBinary/Proofs/E2E/Record/DeserializeGeneral/Root.lean b/LibsignalBinary/Proofs/E2E/Record/DeserializeGeneral/Root.lean index f5d6566a0..5ce3969bf 100644 --- a/LibsignalBinary/Proofs/E2E/Record/DeserializeGeneral/Root.lean +++ b/LibsignalBinary/Proofs/E2E/Record/DeserializeGeneral/Root.lean @@ -117,7 +117,7 @@ theorem deserializeGen_placed_ok_of_stage2 [LibsignalPlacement] set_option maxRecDepth 200000 in /-- Relocatable `SessionRecord::deserialize` (Block `46`) satisfies `deserializeGenPlacedSpec` on -`lsProg_46 H` for any hook map `H` meeting the allocator, `memcpy`, `memmove`, shim, and panic +`lsProg_46 H` for any hook map `H` meeting the allocator, `memcpy`, shim, and panic contracts. -/ theorem deserializeGen_placed_ok [LibsignalPlacement] {H : LibsignalHooks} @@ -126,14 +126,13 @@ theorem deserializeGen_placed_ok [LibsignalPlacement] (hrealloc : HookSat H lsRustReallocSym (rustReallocSpec A0)) (hshim : HookSat H lsRustNoAllocShimSym sessionShimSpec) (hmemcpy : HookSat H "memcpy" (sessionMemcpySpec extHookStack)) - (hmemmove : HookSat H "memmove" (sessionMemmoveSpec extHookStack)) (hpan_err : H lsHandleErrorSym = some Rust.panicked) (hpan_alloc : H "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" = some Rust.panicked) : subroutine_ok (lsProg_46 H) (blkPl_46).base Proofs.libsignal.Hooks2.deserializeGenPlacedSpec := Proofs.libsignal.Hooks2.deserializeGen_placed_ok_of_alloc (Proofs.libsignal.Stage1X.AllocContractsPlaced.of_hooks - halloc hdealloc hrealloc hshim hmemmove hpan_err hpan_alloc) + halloc hdealloc hrealloc hshim hpan_err hpan_alloc) (ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemcpy)) end Placed diff --git a/LibsignalBinary/Proofs/E2E/Record/L1GX/Body.lean b/LibsignalBinary/Proofs/E2E/Record/L1GX/Body.lean index ceda4ef63..d6354a211 100644 --- a/LibsignalBinary/Proofs/E2E/Record/L1GX/Body.lean +++ b/LibsignalBinary/Proofs/E2E/Record/L1GX/Body.lean @@ -178,7 +178,7 @@ theorem deserializeX_placed_ok_of_stage2 [LibsignalPlacement] set_option maxRecDepth 200000 in /-- Relocatable `SessionRecord::deserialize` (block `46`) satisfies `deserializeQExactPlacedSpecW` on -`lsProg_46 H` under allocator, `memcpy`, `memmove`, shim, and panic hook contracts. -/ +`lsProg_46 H` under allocator, `memcpy`, shim, and panic hook contracts. -/ theorem deserializeXExact_placed_ok [LibsignalPlacement] {H : LibsignalHooks} (halloc : HookSat H lsRustAllocSym (rustAllocSpec A0)) @@ -186,19 +186,18 @@ theorem deserializeXExact_placed_ok [LibsignalPlacement] (hrealloc : HookSat H lsRustReallocSym (rustReallocSpec A0)) (hshim : HookSat H lsRustNoAllocShimSym sessionShimSpec) (hmemcpy : HookSat H "memcpy" (sessionMemcpySpec extHookStack)) - (hmemmove : HookSat H "memmove" (sessionMemmoveSpec extHookStack)) (hpan_err : H lsHandleErrorSym = some Rust.panicked) (hpan_alloc : H "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" = some Rust.panicked) : subroutine_ok (lsProg_46 H) (blkPl_46).base Symbolic.Swarm.TRREF.B3DeserQ.deserializeQExactPlacedSpecW := Symbolic.Swarm.TRREF.B3DeserQ.deserializeExactAtQ_placed_ok_of_alloc (Proofs.libsignal.Stage1X.AllocContractsPlaced.of_hooks - halloc hdealloc hrealloc hshim hmemmove hpan_err hpan_alloc) + halloc hdealloc hrealloc hshim hpan_err hpan_alloc) (ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemcpy)) set_option maxRecDepth 200000 in /-- Relocatable `SessionRecord::deserialize` (block `46`) satisfies `deserializeQPlacedSpecW` on -`lsProg_46 H` under allocator, `memcpy`, `memmove`, shim, and panic hook contracts. -/ +`lsProg_46 H` under allocator, `memcpy`, shim, and panic hook contracts. -/ theorem deserializeX_placed_ok [LibsignalPlacement] {H : LibsignalHooks} (halloc : HookSat H lsRustAllocSym (rustAllocSpec A0)) @@ -206,14 +205,13 @@ theorem deserializeX_placed_ok [LibsignalPlacement] (hrealloc : HookSat H lsRustReallocSym (rustReallocSpec A0)) (hshim : HookSat H lsRustNoAllocShimSym sessionShimSpec) (hmemcpy : HookSat H "memcpy" (sessionMemcpySpec extHookStack)) - (hmemmove : HookSat H "memmove" (sessionMemmoveSpec extHookStack)) (hpan_err : H lsHandleErrorSym = some Rust.panicked) (hpan_alloc : H "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" = some Rust.panicked) : subroutine_ok (lsProg_46 H) (blkPl_46).base Symbolic.Swarm.TRREF.B3DeserQ.deserializeQPlacedSpecW := Symbolic.Swarm.TRREF.B3DeserQ.deserializeBodyQ_placed_ok_of_alloc (Proofs.libsignal.Stage1X.AllocContractsPlaced.of_hooks - halloc hdealloc hrealloc hshim hmemmove hpan_err hpan_alloc) + halloc hdealloc hrealloc hshim hpan_err hpan_alloc) (ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemcpy)) end Placed diff --git a/LibsignalBinary/Proofs/E2E/Record/L1GX/Glue.lean b/LibsignalBinary/Proofs/E2E/Record/L1GX/Glue.lean index e418025c7..69f31b8f1 100644 --- a/LibsignalBinary/Proofs/E2E/Record/L1GX/Glue.lean +++ b/LibsignalBinary/Proofs/E2E/Record/L1GX/Glue.lean @@ -98,7 +98,7 @@ theorem mergeFieldX_placed_ok_of_alloc [LibsignalPlacement] (Proofs.libsignal.Hooks2.deserializeCalleesPlacedW_of_alloc hA hMemcpy) set_option maxRecDepth 200000 in -/-- Relocatable `SessionStructure::merge_field` contract from individual allocator, memory, shim, and panic hook hypotheses. -/ +/-- Relocatable `SessionStructure::merge_field` contract from individual allocator, `memcpy`, shim, and panic hook hypotheses. -/ theorem mergeFieldX_placed_ok [LibsignalPlacement] {H : LibsignalHooks} (halloc : HookSat H lsRustAllocSym (rustAllocSpec A0)) @@ -106,13 +106,12 @@ theorem mergeFieldX_placed_ok [LibsignalPlacement] (hrealloc : HookSat H lsRustReallocSym (rustReallocSpec A0)) (hshim : HookSat H lsRustNoAllocShimSym sessionShimSpec) (hmemcpy : HookSat H "memcpy" (sessionMemcpySpec extHookStack)) - (hmemmove : HookSat H "memmove" (sessionMemmoveSpec extHookStack)) (hpan_err : H lsHandleErrorSym = some Rust.panicked) (hpan_alloc : H "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" = some Rust.panicked) : Symbolic.Swarm.TRREF.B3DeserQ.MergeFieldQPlacedOkW H (fun _ => True) := mergeFieldX_placed_ok_of_alloc (Proofs.libsignal.Stage1X.AllocContractsPlaced.of_hooks - halloc hdealloc hrealloc hshim hmemmove hpan_err hpan_alloc) + halloc hdealloc hrealloc hshim hpan_err hpan_alloc) (ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemcpy)) end Placed diff --git a/LibsignalBinary/Proofs/HookDischarge/RustStd/MemrchrRO.lean b/LibsignalBinary/Proofs/HookDischarge/RustStd/MemrchrRO.lean index a2f3be117..6bb21424c 100644 --- a/LibsignalBinary/Proofs/HookDischarge/RustStd/MemrchrRO.lean +++ b/LibsignalBinary/Proofs/HookDischarge/RustStd/MemrchrRO.lean @@ -48,8 +48,8 @@ open VerifiedLibraries.RustStd (coreMultiLib coreMemrchrSym cmNoSvc0_2 memrchr_prefix_check_false memrchr_loop1_ptr_eq memrchr_loop1_hit_idx memrchr_loop2_ptr_eq memrchr_loop3_ptr_eq) open CryptoVerification.LibsignalTripleRatchet (extHookStack) -open CryptoVerification.SignalSession (CliHooks cliExternsPlaced lsMemrchrSym memrchrHook) -open CryptoVerification.SignalSession.Cli.MainHops (MemrchrCall cliExternsPlaced_memrchr memrchrIdx) +open CryptoVerification.SignalSession (memrchrHook) +open CryptoVerification.SignalSession.Cli.MainHops (MemrchrCall memrchrIdx) open LibsignalBinary.Heap (VmPreserved) open LibsignalBinary.Heap.Fine (VmPreserved.of_eq hookOk_withVmPreserved hookSat_of_hookOk) open LibsignalBinary.Heap.SpecBudget (subroutine_ok_of_withVmPreserved withVmPreserved) @@ -971,14 +971,4 @@ theorem memrchrSpecRO_vm_toSat {H : String → Option (State → State)} {sym : HookSat H sym (withVmPreserved (memrchrSpecRO stk)) := hookSat_of_hookOk h (memrchrHook_ro_vm_ok stk) -/-- `cliExternsPlaced` instantiation of `memrchrSpecRO_toSat` at `lsMemrchrSym`. -/ -theorem cliExternsPlaced_memrchrRO_toSat (mmpl : MultiPlacement) (W : CliHooks) (stk : Nat) : - HookSat (cliExternsPlaced mmpl W) lsMemrchrSym (memrchrSpecRO stk) := - memrchrSpecRO_toSat stk (cliExternsPlaced_memrchr mmpl W) - -/-- `cliExternsPlaced` instantiation of `memrchrSpecRO_vm_toSat` at `lsMemrchrSym`. -/ -theorem cliExternsPlaced_memrchrRO_vm_toSat (mmpl : MultiPlacement) (W : CliHooks) (stk : Nat) : - HookSat (cliExternsPlaced mmpl W) lsMemrchrSym (withVmPreserved (memrchrSpecRO stk)) := - memrchrSpecRO_vm_toSat stk (cliExternsPlaced_memrchr mmpl W) - end LibsignalBinary.Proofs.HookDischarge.RustStd.MemrchrRO diff --git a/LibsignalBinary/Proofs/PeakBudget/CliF3MainOkBridge.lean b/LibsignalBinary/Proofs/PeakBudget/CliF3MainOkBridge.lean index c81e899eb..10271dd30 100644 --- a/LibsignalBinary/Proofs/PeakBudget/CliF3MainOkBridge.lean +++ b/LibsignalBinary/Proofs/PeakBudget/CliF3MainOkBridge.lean @@ -15,10 +15,11 @@ public import LibsignalBinary.Heap.IfaceBudgetBase public import LibsignalBinary.Heap.IfaceBudgetBaseBridges public import LibsignalBinary.Proofs.PeakBudget.CliKitEnvFits public import LibsignalBinary.Proofs.PeakBudget.CliMainIoCredit -public import LibsignalBinary.Proofs.PeakBudget.CliNoOomOfFitsEnv +public import LibsignalBinary.Proofs.PeakBudget.CliNoOomOfFitsEnvGhostSat public import LibsignalBinary.Proofs.PeakBudget.RealCliRunEnvMemFixed public import LibsignalBinary.Proofs.PeakBudget.RealMainEnvAdapter public import LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer +public import LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Compose.RunOkPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadFileBudgetPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.F3ReadFileGhostHook @@ -30,7 +31,9 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.M24L4BEquiv public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.PlacedOomRecovery2 public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4A.T2Strict2Bridge +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs /-! # Whole-program `FitsEnv` to `MainOk`, strict placed ELF correctness, and `¬ CliReachesOOMPlaced` @@ -73,7 +76,8 @@ open CryptoVerification.SignalSession.Cli.MainHops (LsCodeInv RunCall cliIo cliMainStk cliResStack cliRunBudgets cliWrOk inputOf mProgPlaced mainFrameSize parseArgs) open CryptoVerification.SignalSession.Cli.RunCompose (PksmGhost runRel) -open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks IsFsC cliGhostExterns) +open CryptoVerification.SignalSession.Cli.RunGlue + (CliGhostHooks ExtraGhostTable IsFsC cliExtraGhostSyms cliGhostExterns) open VerifiedLibraries (mallocngLib) open VerifiedLibraries.Mallocng (mallocngAddrsOfPlacement) open LibsignalBinary.Heap @@ -100,14 +104,14 @@ open LibsignalBinary.Proofs.PeakBudget.RealCliRunEnvMemFixed runEnvFixed_sub_realCliRunBinaryKitEnvOfFixed_canonOrFallback runEnvFixed_sub_realCliRunBinaryKitEnvOfFixed_canonSlice) open LibsignalBinary.Proofs.PeakBudget.WirePksmTightCredit (PksmCanonSliceEnv) -open LibsignalBinary.Proofs.PeakBudget.CliNoOomOfFitsEnv - (mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf - mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf) +open LibsignalBinary.Proofs.PeakBudget.CliNoOomOfFitsEnvGhostSat + (mainOkCliExtOverB2NeedLocksPadPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf + mainOkCliExtPqB2NeedLocksPadPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf) open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer (ExecFrozen StubReachesTarget) open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) -open LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced - (MainOkCliExtOverB2NeedLocksPlacedAt MainOkCliExtPqB2NeedLocksPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat + (MainOkCliExtOverB2NeedLocksPadPlacedAt MainOkCliExtPqB2NeedLocksPadPlacedAt) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainOkCliExtB2NeedLocksInst (cliRunSemD2c_placed) open LibsignalBinary.Proofs.SignalSession.Cli.Main.HopsPlacedBudget (runSpecTightPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadFileBudgetPlaced @@ -146,7 +150,10 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.M24L4BEquiv (mainOkCliExtOverB2NeedLocksPlacedAt_iff mainOkCliExtPqB2NeedLocksPlacedAt_iff) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4A.T2Strict2Bridge (hAlloc_of_cliPqxdhElfCorrectStrictPlaced2 not_cliReachesOOMPlaced_of_strict2) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + (GhostSymActive_iff_named_or_extra) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore (HookExactMemcpy) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (ExtraFullListSpecOk) /-! ## `ReadFileRuleEnvFixed cliIo.rd` ⊆ `BoundedReadFileEnv` -/ @@ -168,7 +175,7 @@ theorem boundedReadFileEnv_of_readFileRuleEnvFixed_cliIo /-! ## Ghost-hook and subroutine replay bundle (`F3FixedHookHyp`) -/ -/-- Ghost-hook, subroutine-correctness, and Block-`617` replay hypotheses for `f3CliGhostHooksFixed` (including `fMemset` and `fMemcpy`). -/ +/-- Ghost-hook, subroutine-correctness, and Block-`617` replay hypotheses for `f3CliGhostHooksFixed` (including `fMemset`, `fMemcpy`, and Cutover-2 `extra`). -/ structure F3FixedHookHyp (mpl mmpl : MultiPlacement) (CodeOk_ghost CodeOk_real : Memory → Prop) @@ -178,7 +185,8 @@ structure F3FixedHookHyp (P_real P_sub : Program) (T : F3GhostEntryTargets) (hookStack : Nat) - (fMemset fMemcpy : Option (State → State)) : Prop where + (fMemset fMemcpy : Option (State → State)) + (extra : ExtraGhostTable) : Prop where hPl_ls : libsignalSessionLib.Placeable mpl hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i) @@ -236,6 +244,7 @@ structure F3FixedHookHyp hMemcpyExact : ∀ f, fMemcpy = some f → HookExactMemcpy f hMemsetAcp : ∀ f, fMemset = some f → ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle + hExtraOk : @ExtraFullListSpecOk (libsignalPlacementOf mpl hblk hext_nodup) extra hStubAlloc : StubReachesTarget P_real (libsignalSessionLib.resolve mpl lsRustAllocSymCli) T.alloc hStubDealloc : StubReachesTarget P_real (libsignalSessionLib.resolve mpl lsRustDeallocSymCli) T.dealloc hStubRealloc : StubReachesTarget P_real (libsignalSessionLib.resolve mpl lsRustReallocSymCli) T.realloc @@ -253,7 +262,7 @@ structure F3FixedHookHyp hGhostCL : ∀ (W : CliHooks) (m : Memory), CodeOk_ghost m → (cliProgExtPlacedAt mpl (fun W' => cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W')) 617 W).CodeLoaded m hFr0 : ∀ m : Memory, CodeOk_real m → ExecFrozen m hInv0 : ∀ m : Memory, CodeOk_real m → InvMem m @@ -261,7 +270,7 @@ structure F3FixedHookHyp hInvCodeSub : ∀ m : Memory, ExecFrozen m → InvMem m → P_sub.CodeLoaded (stripExecOutside keep m) hRealNone : ∀ (W : CliHooks) (sym : String) (f : State → State), GhostSymActive - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) sym f → + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) sym f → (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? (libsignalSessionLib.resolve mpl sym) = none hStepsReal : ∀ (W : CliHooks) (u v : State), @@ -269,7 +278,7 @@ structure F3FixedHookHyp hReplayMemset : ∀ (W : CliHooks) (i : Inputs) (s0 sf u : State) (f : State → State), let P_ghost := cliProgExtPlacedAt mpl (fun W' => cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W')) 617 W let P_real_W := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W fMemset = some f → @@ -293,7 +302,7 @@ structure F3FixedHookHyp hReplayMemcpy : ∀ (W : CliHooks) (i : Inputs) (s0 sf u : State) (f : State → State), let P_ghost := cliProgExtPlacedAt mpl (fun W' => cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W')) 617 W let P_real_W := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W fMemcpy = some f → @@ -314,10 +323,36 @@ structure F3FixedHookHyp InvMem u.mem → FdsGe3Closed u.fs → Steps P_real_W u (f u) ∧ ExecFrozen (f u).mem ∧ FdsGe3Closed (f u).fs + hReplayExtra : ∀ (W : CliHooks) (i : Inputs) (s0 sf u : State) + (sym : String) (f : State → State), + let P_ghost := cliProgExtPlacedAt mpl + (fun W' => cliGhostExterns + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) + (cliExternsPlaced mmpl W')) 617 W + let P_real_W := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W + cliExtraGhostSyms.contains sym = true → + extra.lookup sym = some f → + CodeOk_real s0.mem → + s0.pc = mpl.base 617 → + s0.fs = initFsState (cliProcessInputs i) → + s0.trace = [] → + Steps P_ghost s0 u → + Steps P_ghost (f u) sf → + (∀ msg, sf.status ≠ .Exception msg) → + sf.status ≠ .Halted → + u.pc = libsignalSessionLib.resolve mpl sym → + u.status = .Running → + (∀ msg, (f u).status ≠ .Exception msg) → + u.mem.KeepsFrozen (f u).mem → + ExecFrozen u.mem → + keep (u.readReg64 .lr) = false → + InvMem u.mem → + FdsGe3Closed u.fs → + Steps P_real_W u (f u) ∧ ExecFrozen (f u).mem ∧ FdsGe3Closed (f u).fs hMallocngFds : ∀ (W : CliHooks) (i : Inputs) (s0 sf u : State) (f : State → State), let P_ghost := cliProgExtPlacedAt mpl (fun W' => cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W')) 617 W CodeOk_real s0.mem → s0.pc = mpl.base 617 → @@ -338,7 +373,7 @@ structure F3FixedHookHyp hSvcFds : ∀ (W : CliHooks) (i : Inputs) (s0 sf u : State), let P_ghost := cliProgExtPlacedAt mpl (fun W' => cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W')) 617 W CodeOk_real s0.mem → s0.pc = mpl.base 617 → @@ -358,7 +393,7 @@ structure F3FixedHookHyp hLrCalls : ∀ (W : CliHooks) (i : Inputs) (s0 sf u : State), let P_ghost := cliProgExtPlacedAt mpl (fun W' => cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl hblk hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W')) 617 W let P_real_W := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W CodeOk_real s0.mem → @@ -373,9 +408,9 @@ structure F3FixedHookHyp P_ghost.externAt? u.pc ≠ P_real_W.externAt? u.pc → keep (u.readReg64 .lr) = false -/-! ## Ghost-externs `MainOkCliExt{Pq,Over}B2NeedLocksPlacedAt` -/ +/-! ## Ghost-externs `MainOkCliExt{Pq,Over}B2NeedLocksPadPlacedAt` -/ -/-- Whole-program ghost-externs `MainOkCliExtPqB2NeedLocksPlacedAt` under `cliBudgetLimits`, +/-- Whole-program ghost-externs `MainOkCliExtPqB2NeedLocksPadPlacedAt` under `cliBudgetLimits`, `f3CliGhostHooksFixed`, `ReadFileRuleEnvFixed cliIo.rd`, and `mkBinaryKitRealCalleeEnvsFixed img (cliRunSemD2c_placed X W) X W`. -/ theorem mainOkCliExtPqB2NeedLocksPlacedAt_f3Fixed @@ -385,8 +420,9 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_f3Fixed {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -411,7 +447,7 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_f3Fixed @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -421,14 +457,14 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_f3Fixed (RunEnv X W γ tp) uuidTryParse (runRel (cliRunSemD2c_placed X W)) cliWrOk cliResStack)) : - MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl + MainOkCliExtPqB2NeedLocksPadPlacedAt mpl mmpl (fun W => cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk_ghost libcAddr brkStart cliMainStk cliBudgetLimits := - mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf + mainOkCliExtPqB2NeedLocksPadPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf HF.hblk HF.hext_nodup HF.hCI - (fun _ => @f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (fun _ => @f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (fun X W => @mkBinaryKitRealCalleeEnvsFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) img (cliRunSemD2c_placed X W) X W) RunEnv HF.hlibc @@ -440,10 +476,10 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_f3Fixed (subroutine_ok_rustCliAllocBudget_of_base (HF.hAlloc γ tp)) (subroutine_ok_rustCliDeallocBudget_of_base (HF.hDealloc γ tp)) (subroutine_ok_rustCliReallocBudget_of_base (HF.hRealloc γ tp)) - HF.hMemset HF.hMemcpy HF.hMemcpyExact HF.hMemsetAcp) + HF.hMemset HF.hMemcpy HF.hMemcpyExact HF.hMemsetAcp HF.hExtraOk) (fun W γ tp => @mainIoOfPlaced_f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) - keep P_real P_sub T mmpl W brkStart cliBudgetLimits hookStack fMemset fMemcpy + keep P_real P_sub T mmpl W brkStart cliBudgetLimits hookStack fMemset fMemcpy extra HF.hsvc_real HF.hsvc_sub HF.hreal_no HF.hsub_no HF.hPl_mng HF.hKeepMallocng HF.hHookStack HF.hReadFileCond HF.hReadStdinCond γ tp) (fun files path _ h => boundedReadFileEnv_of_readFileRuleEnvFixed_cliIo files path h) @@ -452,7 +488,7 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_f3Fixed hRunSub hrun -/-- Overcap-arm ghost-externs `MainOkCliExtOverB2NeedLocksPlacedAt` under `cliBudgetLimits`, +/-- Overcap-arm ghost-externs `MainOkCliExtOverB2NeedLocksPadPlacedAt` under `cliBudgetLimits`, `f3CliGhostHooksFixed`, `ReadFileRuleEnvFixed cliIo.rd`, and `mkBinaryKitRealCalleeEnvsFixed img (cliRunSemD2c_placed X W) X W`. -/ theorem mainOkCliExtOverB2NeedLocksPlacedAt_f3Fixed @@ -462,8 +498,9 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_f3Fixed {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -488,7 +525,7 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_f3Fixed @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -498,14 +535,14 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_f3Fixed (RunEnv X W γ tp) uuidTryParse (runRel (cliRunSemD2c_placed X W)) cliWrOk cliResStack)) : - MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl + MainOkCliExtOverB2NeedLocksPadPlacedAt mpl mmpl (fun W => cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk_ghost libcAddr brkStart cliMainStk cliBudgetLimits := - mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf + mainOkCliExtOverB2NeedLocksPadPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf HF.hblk HF.hext_nodup HF.hCI - (fun _ => @f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (fun _ => @f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (fun X W => @mkBinaryKitRealCalleeEnvsFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) img (cliRunSemD2c_placed X W) X W) RunEnv HF.hlibc @@ -517,10 +554,10 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_f3Fixed (subroutine_ok_rustCliAllocBudget_of_base (HF.hAlloc γ tp)) (subroutine_ok_rustCliDeallocBudget_of_base (HF.hDealloc γ tp)) (subroutine_ok_rustCliReallocBudget_of_base (HF.hRealloc γ tp)) - HF.hMemset HF.hMemcpy HF.hMemcpyExact HF.hMemsetAcp) + HF.hMemset HF.hMemcpy HF.hMemcpyExact HF.hMemsetAcp HF.hExtraOk) (fun W γ tp => @mainIoOfPlaced_f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) - keep P_real P_sub T mmpl W brkStart cliBudgetLimits hookStack fMemset fMemcpy + keep P_real P_sub T mmpl W brkStart cliBudgetLimits hookStack fMemset fMemcpy extra HF.hsvc_real HF.hsvc_sub HF.hreal_no HF.hsub_no HF.hPl_mng HF.hKeepMallocng HF.hHookStack HF.hReadFileCond HF.hReadStdinCond γ tp) (fun files path _ h => boundedReadFileEnv_of_readFileRuleEnvFixed_cliIo files path h) @@ -574,7 +611,7 @@ private theorem blockProgram_externAt?_some_exists exact findSome?_table_exists _ _ h /-- Internal Block-`617` ghost-to-real transfer for `f3CliGhostHooksFixed` via -`Ghost617Transfer.block617TransferFixed_of_replaysOn`, the `f3*GhostHookFine_steps_of_call` replay lemmas, `hookNoop`, and `HF.hReplay{Memset,Memcpy}`. -/ +`Ghost617Transfer.block617TransferFixed_of_replaysOn`, the `f3*GhostHookFine_steps_of_call` replay lemmas, `hookNoop`, and `HF.hReplay{Memset,Memcpy,Extra}`. -/ private theorem block617TransferFixed_f3CliGhostHooksFixed {mpl mmpl : MultiPlacement} {CodeOk_ghost CodeOk_real : Memory → Prop} @@ -582,14 +619,15 @@ private theorem block617TransferFixed_f3CliGhostHooksFixed {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) : + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) : Block617TransferFixedHyp mpl mmpl - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) CodeOk_ghost CodeOk_real libcAddr brkStart cliMainStk := by let : LibsignalPlacement := libsignalPlacementOf mpl HF.hblk HF.hext_nodup let ghFixed := @f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) - keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy + keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra refine block617TransferFixed_of_replaysOn keep InvMem FdsGe3Closed HF.hCode HF.hGhostCL HF.hFr0 HF.hInv0 HF.hInvStable (fun i => fdsGe3Closed_initFsState (cliProcessInputs i)) ?_ @@ -618,7 +656,12 @@ private theorem block617TransferFixed_f3CliGhostHooksFixed suffices Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) u (f u) ∧ ExecFrozen (f u).mem ∧ FdsGe3Closed (f u).fs by exact ⟨this.1, this.2.1, HF.hInvStable u.mem _ hinv hkf, this.2.2⟩ - rcases hAct with + rcases (GhostSymActive_iff_named_or_extra ghFixed sym f).mp hAct with hNamed | ⟨hDom, hLook⟩ + swap + · dsimp only [ghFixed, f3CliGhostHooksFixed] at hLook + exact HF.hReplayExtra W i s0 sf u sym f hDom hLook hReal0 hpc0 hfs0 htr0 hpre hpost + hnoex_sf hnhalt_sf hpc hrun hnoex hkf hfr hlr hinv hfs + rcases hNamed with ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, hsc⟩ | ⟨rfl, h, hrf⟩ | ⟨rfl, h, hrs⟩ | ⟨rfl, hms⟩ | ⟨rfl, hmc⟩ · dsimp only [ghFixed, f3CliGhostHooksFixed] at hnoex ⊢ @@ -693,8 +736,9 @@ theorem mainOkCliF3Pq_of_f3Fixed {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -719,7 +763,7 @@ theorem mainOkCliF3Pq_of_f3Fixed @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -734,7 +778,7 @@ theorem mainOkCliF3Pq_of_f3Fixed (block617TransferFixed_f3CliGhostHooksFixed HF) ((mainOkCliExtPqB2NeedLocksPlacedAt_iff mpl mmpl (fun W => cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk_ghost libcAddr brkStart cliMainStk cliBudgetLimits).mp (mainOkCliExtPqB2NeedLocksPlacedAt_f3Fixed HF img RunEnv hKitFits hRunSub hrun)) @@ -748,8 +792,9 @@ theorem mainOkCliF3Over_of_f3Fixed {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -774,7 +819,7 @@ theorem mainOkCliF3Over_of_f3Fixed @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -789,7 +834,7 @@ theorem mainOkCliF3Over_of_f3Fixed (block617TransferFixed_f3CliGhostHooksFixed HF) ((mainOkCliExtOverB2NeedLocksPlacedAt_iff mpl mmpl (fun W => cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk_ghost libcAddr brkStart cliMainStk cliBudgetLimits).mp (mainOkCliExtOverB2NeedLocksPlacedAt_f3Fixed HF img RunEnv hKitFits hRunSub hrun)) @@ -805,9 +850,10 @@ theorem cliPqxdhElfCorrectStrictPlaced2_of_f3Fixed {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (H : CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnvPq RunEnvOver : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -842,7 +888,7 @@ theorem cliPqxdhElfCorrectStrictPlaced2_of_f3Fixed @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -857,7 +903,7 @@ theorem cliPqxdhElfCorrectStrictPlaced2_of_f3Fixed @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -881,9 +927,10 @@ theorem cliPqxdhElfCorrectPlaced_of_f3Fixed {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (H : CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnvPq RunEnvOver : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -918,7 +965,7 @@ theorem cliPqxdhElfCorrectPlaced_of_f3Fixed @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -933,7 +980,7 @@ theorem cliPqxdhElfCorrectPlaced_of_f3Fixed @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -959,9 +1006,10 @@ theorem hAlloc_of_f3Fixed {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (H : CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnvPq RunEnvOver : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -996,7 +1044,7 @@ theorem hAlloc_of_f3Fixed @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1011,7 +1059,7 @@ theorem hAlloc_of_f3Fixed @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1037,9 +1085,10 @@ theorem not_cliReachesOOMPlaced_of_f3Fixed {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (H : CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnvPq RunEnvOver : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -1074,7 +1123,7 @@ theorem not_cliReachesOOMPlaced_of_f3Fixed @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1089,7 +1138,7 @@ theorem not_cliReachesOOMPlaced_of_f3Fixed @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1117,16 +1166,16 @@ theorem cliPqxdhBinaryCorrectStrictPlaced2_of_f3Fixed (CodeOk_ghost CodeOk_real : Memory → Prop) (keep : BitVec 64 → Bool) (InvMem : Memory → Prop) (P_real P_sub : Program) (T : F3GhostEntryTargets) (hookStack : Nat) - (fMemset fMemcpy : Option (State → State)), + (fMemset fMemcpy : Option (State → State)) (extra : ExtraGhostTable), CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf ∧ MainOkCliF3PqB2NeedLocksPlacedAt mpl mmpl CodeOk_real libcAddr elf.brkStart cliMainStk ∧ MainOkCliF3OverB2NeedLocksPlacedAt mpl mmpl CodeOk_real libcAddr elf.brkStart cliMainStk ∧ F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) : + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) : CliPqxdhBinaryCorrectStrictPlaced2 bytes := by refine cliPqxdhBinaryCorrectStrictPlaced2_of_f3B2NeedLocks' hparse ?_ intro mpl mmpl hls hmng - obtain ⟨exitStk, libcAddr, _, CodeOk_real, _, _, _, _, _, _, _, _, H, hmain, hover, _⟩ := + obtain ⟨exitStk, libcAddr, _, CodeOk_real, _, _, _, _, _, _, _, _, _, H, hmain, hover, _⟩ := hAssump mpl mmpl hls hmng exact ⟨exitStk, libcAddr, cliMainStk, CodeOk_real, H, hmain, hover⟩ @@ -1141,16 +1190,16 @@ theorem cliPqxdhBinaryCorrectPlaced_of_f3Fixed (CodeOk_ghost CodeOk_real : Memory → Prop) (keep : BitVec 64 → Bool) (InvMem : Memory → Prop) (P_real P_sub : Program) (T : F3GhostEntryTargets) (hookStack : Nat) - (fMemset fMemcpy : Option (State → State)), + (fMemset fMemcpy : Option (State → State)) (extra : ExtraGhostTable), CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf ∧ MainOkCliF3PqB2NeedLocksPlacedAt mpl mmpl CodeOk_real libcAddr elf.brkStart cliMainStk ∧ MainOkCliF3OverB2NeedLocksPlacedAt mpl mmpl CodeOk_real libcAddr elf.brkStart cliMainStk ∧ F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) : + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) : CliPqxdhBinaryCorrectPlaced bytes := by refine cliPqxdhBinaryCorrectPlaced_of_f3B2NeedLocks' hparse ?_ intro mpl mmpl hls hmng - obtain ⟨exitStk, libcAddr, _, CodeOk_real, _, _, _, _, _, _, _, _, H, hmain, hover, _⟩ := + obtain ⟨exitStk, libcAddr, _, CodeOk_real, _, _, _, _, _, _, _, _, _, H, hmain, hover, _⟩ := hAssump mpl mmpl hls hmng exact ⟨exitStk, libcAddr, cliMainStk, CodeOk_real, H, hmain, hover⟩ @@ -1191,7 +1240,7 @@ abbrev canonOrFallbackRunEnvFixed (CanonicalOrFallbackPksmEnv FallbackEnv) (cliRunSemD2c_placed X W)) -/-- Ghost-externs `MainOkCliExtPqB2NeedLocksPlacedAt` with `hKitFits` discharged via +/-- Ghost-externs `MainOkCliExtPqB2NeedLocksPadPlacedAt` with `hKitFits` discharged via `CliKitEnvFits.realCliMainBinaryKitEnvOfFixed_fitsEnv_cliBudgetLimits`. -/ theorem mainOkCliExtPqB2NeedLocksPlacedAt_of_cliKitEnvFits {mpl mmpl : MultiPlacement} @@ -1200,8 +1249,9 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_of_cliKitEnvFits {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -1220,7 +1270,7 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_of_cliKitEnvFits @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1230,9 +1280,9 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_of_cliKitEnvFits (RunEnv X W γ tp) uuidTryParse (runRel (cliRunSemD2c_placed X W)) cliWrOk cliResStack)) : - MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl + MainOkCliExtPqB2NeedLocksPadPlacedAt mpl mmpl (fun W => cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk_ghost libcAddr brkStart cliMainStk cliBudgetLimits := mainOkCliExtPqB2NeedLocksPlacedAt_f3Fixed HF img RunEnv @@ -1242,7 +1292,7 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_of_cliKitEnvFits img (cliRunSemD2c_placed X W) X W i hi) hRunSub hrun -/-- Ghost-externs `MainOkCliExtOverB2NeedLocksPlacedAt` with `hKitFits` discharged via +/-- Ghost-externs `MainOkCliExtOverB2NeedLocksPadPlacedAt` with `hKitFits` discharged via `CliKitEnvFits.realCliMainBinaryKitEnvOfFixed_fitsEnv_cliBudgetLimits`. -/ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_cliKitEnvFits {mpl mmpl : MultiPlacement} @@ -1251,8 +1301,9 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_cliKitEnvFits {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -1271,7 +1322,7 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_cliKitEnvFits @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1281,9 +1332,9 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_cliKitEnvFits (RunEnv X W γ tp) uuidTryParse (runRel (cliRunSemD2c_placed X W)) cliWrOk cliResStack)) : - MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl + MainOkCliExtOverB2NeedLocksPadPlacedAt mpl mmpl (fun W => cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk_ghost libcAddr brkStart cliMainStk cliBudgetLimits := mainOkCliExtOverB2NeedLocksPlacedAt_f3Fixed HF img RunEnv @@ -1303,8 +1354,9 @@ theorem mainOkCliF3Pq_of_cliKitEnvFits {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -1323,7 +1375,7 @@ theorem mainOkCliF3Pq_of_cliKitEnvFits @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1351,8 +1403,9 @@ theorem mainOkCliF3Over_of_cliKitEnvFits {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -1371,7 +1424,7 @@ theorem mainOkCliF3Over_of_cliKitEnvFits @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1398,15 +1451,16 @@ theorem mainOkCliF3Pq_of_cliKitEnvFits_canonSlice {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (hrun : mpl.base 547 ≠ 0#64 → ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1436,15 +1490,16 @@ theorem mainOkCliF3Over_of_cliKitEnvFits_canonSlice {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (hrun : mpl.base 547 ≠ 0#64 → ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1473,16 +1528,17 @@ theorem mainOkCliF3Pq_of_cliKitEnvFits_canonOrFallback {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (FallbackEnv : PksmGhost → List AllocEvent → Prop) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (hrun : mpl.base 547 ≠ 0#64 → ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1512,16 +1568,17 @@ theorem mainOkCliF3Over_of_cliKitEnvFits_canonOrFallback {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (FallbackEnv : PksmGhost → List AllocEvent → Prop) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (hrun : mpl.base 547 ≠ 0#64 → ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1553,9 +1610,10 @@ theorem cliPqxdhElfCorrectStrictPlaced2_of_cliKitEnvFits {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (H : CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnvPq RunEnvOver : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -1584,7 +1642,7 @@ theorem cliPqxdhElfCorrectStrictPlaced2_of_cliKitEnvFits @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1599,7 +1657,7 @@ theorem cliPqxdhElfCorrectStrictPlaced2_of_cliKitEnvFits @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1624,16 +1682,17 @@ theorem cliPqxdhElfCorrectStrictPlaced2_of_cliKitEnvFits_canonSlice {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (H : CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (hrun : mpl.base 547 ≠ 0#64 → ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1658,9 +1717,10 @@ theorem cliPqxdhElfCorrectPlaced_of_cliKitEnvFits {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (H : CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnvPq RunEnvOver : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -1689,7 +1749,7 @@ theorem cliPqxdhElfCorrectPlaced_of_cliKitEnvFits @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1704,7 +1764,7 @@ theorem cliPqxdhElfCorrectPlaced_of_cliKitEnvFits @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1727,16 +1787,17 @@ theorem cliPqxdhElfCorrectPlaced_of_cliKitEnvFits_canonSlice {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (H : CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (hrun : mpl.base 547 ≠ 0#64 → ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1763,9 +1824,10 @@ theorem hAlloc_of_cliKitEnvFits {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (H : CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnvPq RunEnvOver : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -1794,7 +1856,7 @@ theorem hAlloc_of_cliKitEnvFits @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1809,7 +1871,7 @@ theorem hAlloc_of_cliKitEnvFits @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1836,16 +1898,17 @@ theorem hAlloc_of_cliKitEnvFits_canonSlice {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (H : CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (hrun : mpl.base 547 ≠ 0#64 → ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1870,9 +1933,10 @@ theorem not_cliReachesOOMPlaced_of_cliKitEnvFits {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (H : CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (RunEnvPq RunEnvOver : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → RunCall → List AllocEvent → Prop) @@ -1901,7 +1965,7 @@ theorem not_cliReachesOOMPlaced_of_cliKitEnvFits @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1916,7 +1980,7 @@ theorem not_cliReachesOOMPlaced_of_cliKitEnvFits @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1941,16 +2005,17 @@ theorem not_cliReachesOOMPlaced_of_cliKitEnvFits_canonSlice {keep : BitVec 64 → Bool} {InvMem : Memory → Prop} {P_real P_sub : Program} {T : F3GhostEntryTargets} {hookStack : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (H : CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy) + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra) (img : Image) (hrun : mpl.base 547 ≠ 0#64 → ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns - (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy) + (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -1979,17 +2044,17 @@ theorem cliPqxdhBinaryCorrectStrictPlaced2_of_cliKitEnvFits_canonSlice (CodeOk_ghost CodeOk_real : Memory → Prop) (keep : BitVec 64 → Bool) (InvMem : Memory → Prop) (P_real P_sub : Program) (T : F3GhostEntryTargets) (hookStack : Nat) - (fMemset fMemcpy : Option (State → State)) + (fMemset fMemcpy : Option (State → State)) (extra : ExtraGhostTable) (_H : CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy), + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra), mpl.base 547 ≠ 0#64 → ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits - hookStack fMemset fMemcpy) + hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -2003,7 +2068,7 @@ theorem cliPqxdhBinaryCorrectStrictPlaced2_of_cliKitEnvFits_canonSlice CliPqxdhBinaryCorrectStrictPlaced2 bytes := by refine cliPqxdhBinaryCorrectStrictPlaced2_of_f3B2NeedLocks' hparse ?_ intro mpl mmpl hls hmng - obtain ⟨exitStk, libcAddr, _, CodeOk_real, _, _, _, _, _, _, _, _, H, HF, hrun⟩ := + obtain ⟨exitStk, libcAddr, _, CodeOk_real, _, _, _, _, _, _, _, _, _, H, HF, hrun⟩ := hAssump mpl mmpl hls hmng exact ⟨exitStk, libcAddr, cliMainStk, CodeOk_real, H, mainOkCliF3Pq_of_cliKitEnvFits_canonSlice HF img hrun, @@ -2021,17 +2086,17 @@ theorem cliPqxdhBinaryCorrectPlaced_of_cliKitEnvFits_canonSlice (CodeOk_ghost CodeOk_real : Memory → Prop) (keep : BitVec 64 → Bool) (InvMem : Memory → Prop) (P_real P_sub : Program) (T : F3GhostEntryTargets) (hookStack : Nat) - (fMemset fMemcpy : Option (State → State)) + (fMemset fMemcpy : Option (State → State)) (extra : ExtraGhostTable) (_H : CliElfF3B2NeedLocksAssumptions mpl mmpl exitStk libcAddr cliMainStk CodeOk_real elf) (HF : F3FixedHookHyp mpl mmpl CodeOk_ghost CodeOk_real libcAddr elf.brkStart - keep InvMem P_real P_sub T hookStack fMemset fMemcpy), + keep InvMem P_real P_sub T hookStack fMemset fMemcpy extra), mpl.base 547 ≠ 0#64 → ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) (cliGhostExterns (@f3CliGhostHooksFixed (libsignalPlacementOf mpl HF.hblk HF.hext_nodup) keep P_real P_sub T mmpl elf.brkStart cliBudgetLimits - hookStack fMemset fMemcpy) + hookStack fMemset fMemcpy extra) (cliExternsPlaced mmpl W))) (mpl.base 579) (@runSpecTightPlaced @@ -2045,7 +2110,7 @@ theorem cliPqxdhBinaryCorrectPlaced_of_cliKitEnvFits_canonSlice CliPqxdhBinaryCorrectPlaced bytes := by refine cliPqxdhBinaryCorrectPlaced_of_f3B2NeedLocks' hparse ?_ intro mpl mmpl hls hmng - obtain ⟨exitStk, libcAddr, _, CodeOk_real, _, _, _, _, _, _, _, _, H, HF, hrun⟩ := + obtain ⟨exitStk, libcAddr, _, CodeOk_real, _, _, _, _, _, _, _, _, _, H, HF, hrun⟩ := hAssump mpl mmpl hls hmng exact ⟨exitStk, libcAddr, cliMainStk, CodeOk_real, H, mainOkCliF3Pq_of_cliKitEnvFits_canonSlice HF img hrun, diff --git a/LibsignalBinary/Proofs/PeakBudget/CliNoOomOfFitsEnv.lean b/LibsignalBinary/Proofs/PeakBudget/CliNoOomOfFitsEnv.lean index 2ea729a03..58301c1fc 100644 --- a/LibsignalBinary/Proofs/PeakBudget/CliNoOomOfFitsEnv.lean +++ b/LibsignalBinary/Proofs/PeakBudget/CliNoOomOfFitsEnv.lean @@ -46,10 +46,9 @@ open CryptoVerification.SignalSession lsFromUtf8Sym lsMemrchrSym memrchrHook stdinCapBytes strlenHook) open CryptoVerification.SignalSession.Cli (cliInputs loadState_fs_trace) open CryptoVerification.SignalSession.Cli.MainHops - (LsCodeInv RunCall cliExternsPlaced_strlen cliIo cliMainStk cliResStack cliWrOk + (LsCodeInv RunCall cliIo cliMainStk cliResStack cliWrOk inputOf lsHandleErrorSymMain mProgPlaced mainFrameSize parseArgs) open CryptoVerification.SignalSession.Cli.RunCompose (runRel) -open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) open CryptoVerification.SignalSession.Placed (cliProgPlacedSig cliTokenPatchPlaced) open LibsignalBinary.Heap (AllocEvent BudgetLimits FitsEnv FreeOnlyEvs SeqEnv) open LibsignalBinary.Heap.Fine (fineCostModel fineHookRustCliAllocBudget) @@ -61,15 +60,11 @@ open LibsignalBinary.Proofs.PeakBudget.CliSlotEnvelopeBridge (CliRunBinaryEnv RealCliMainBinaryEnvOf) open LibsignalBinary.Proofs.PeakBudget.CliTopBudgetReal (cliRealNinetyPctOneGiB) open LibsignalBinary.Proofs.PeakBudget.MainEntryBudgetFitsCapReal - (mainEntryBudgetFitsCapOf_cliBudgetLimits_of_kitEnvFits - mainEntryBudgetFitsCapOf_of_fitsEnv - mainEntryBudgetFitsCap_cliBudgetLimits_of_kitEnvFits - mainEntryBudgetFitsCap_of_fitsEnv + (mainEntryBudgetFitsCap_of_fitsEnv mainEntryBudgetFitsCap_of_realMainEnvFits_1GiB mainEntryBudgetFitsCap_of_realMainEnvFits_90pct mainEntryBudgetFitsCap_of_realMainEnvFits_cliBudgetLimits) -open LibsignalBinary.Proofs.PeakBudget.RealMainEnvAdapter - (BoundedReadFileEnv CliMainBoundedSetupEnv) +open LibsignalBinary.Proofs.PeakBudget.RealMainEnvAdapter (CliMainBoundedSetupEnv) open LibsignalBinary.Proofs.PeakBudget.SpqrDomainCapsAux (sessionCapBytes) open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) open LibsignalBinary.Proofs.SignalSession.Cli.M24.CliElfMallocngHarness @@ -85,23 +80,15 @@ open LibsignalBinary.Proofs.SignalSession.Cli.M24.M2ExternNoAllocFail (ExternPreservesNoAllocFailed externPreservesNoAllocFailed_cliExternsPlaced externPreservesNoAllocFailed_none externPreserves_map_abortOnPanic steps_preserves_no_allocFailed) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInst - (mainOkCliExtOverB2NeedLocksPlacedAt_cliExterns_of_runTight_and_budgetFitsCap - mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCap - mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf - mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap - mainOkCliExtPqB2NeedLocksPlacedAt_cliExterns_of_runTight_and_budgetFitsCap - mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCap - mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf + (mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced - (MainIoBoundedPlaced MainIoOfPlaced ReadStdinBoundedEnv) + (MainIoBoundedPlaced ReadStdinBoundedEnv) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainOkCliExtB2NeedLocksInst - (cliRunSemD2c_placed pqScopedRun) + (cliRunSemD2c_placed) open LibsignalBinary.Proofs.SignalSession.Cli.M24.PlacedOomRecovery (CliPqxdhAllocNeverFailsPlaced CliPqxdhElfCorrectStrictPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Main.HopsPlacedBudget (runSpecTightPlaced) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (CliGhostAllocHooks) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsFsPlaced MainIoPlaced) open VerifiedLibraries.Mallocng (mallocngAddrsOfPlacement) @@ -407,509 +394,6 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_kitEnvFits_and_runTight mainEntryBudgetFitsCap_of_fitsEnv hEarly (hMain h547 X W) (hRunSub h547 X W γ tp)) hrun -/-- `cliGhostExterns` specialization of `mainOkCliExtPqB2NeedLocksPlacedAt_of_kitEnvFits_and_runTight`. -/ -theorem mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_kitEnvFits_and_runTight - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} - (E : UnreachedPqxdhPrimitives → CliHooks → RunCall → CliRunCalleeEnvs) - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hEarly : ∀ argvLen : Nat, argvLen ≤ 1820 → - FitsEnv fineCostModel lim fineCostModel.init - (SeqEnv (CliMainBoundedSetupEnv argvLen) FreeOnlyEvs)) - (hMain : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (i : Inputs), - CliPqxdhInputs ⟨W.C, W.Q⟩ i → - FitsEnv fineCostModel lim fineCostModel.init (RealCliMainBinaryEnvOf (E X W) i)) - (hRunSub : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) - (g : RunCall), - CliPqxdhInputs ⟨W.C, W.Q⟩ g.i → - parseArgs uuidTryParse (g.i.argv.map bytesOfString) = some g.c → - (inputOf g.i g.c).length ≤ stdinCapBytes → - runRel (cliRunSemD2c_placed X W) g.i g.a → - ∀ evs : List AllocEvent, RunEnv X W γ tp g evs → - CliRunBinaryEnv cliIo.rd (E X W g) sessionCapBytes g evs) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk lim := - mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCap - hblk hext_nodup hCI ghOf RunEnv hlibc hG hio hioBounded hstk - (fun h547 X W γ tp => - mainEntryBudgetFitsCap_of_fitsEnv hEarly (hMain h547 X W) (hRunSub h547 X W γ tp)) - hrun - -/-- `cliGhostExterns` specialization of `mainOkCliExtOverB2NeedLocksPlacedAt_of_kitEnvFits_and_runTight`. -/ -theorem mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_kitEnvFits_and_runTight - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} - (E : UnreachedPqxdhPrimitives → CliHooks → RunCall → CliRunCalleeEnvs) - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hEarly : ∀ argvLen : Nat, argvLen ≤ 1820 → - FitsEnv fineCostModel lim fineCostModel.init - (SeqEnv (CliMainBoundedSetupEnv argvLen) FreeOnlyEvs)) - (hMain : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (i : Inputs), - CliPqxdhInputs ⟨W.C, W.Q⟩ i → - FitsEnv fineCostModel lim fineCostModel.init (RealCliMainBinaryEnvOf (E X W) i)) - (hRunSub : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) - (g : RunCall), - CliPqxdhInputs ⟨W.C, W.Q⟩ g.i → - parseArgs uuidTryParse (g.i.argv.map bytesOfString) = some g.c → - (inputOf g.i g.c).length ≤ stdinCapBytes → - runRel (cliRunSemD2c_placed X W) g.i g.a → - ∀ evs : List AllocEvent, RunEnv X W γ tp g evs → - CliRunBinaryEnv cliIo.rd (E X W g) sessionCapBytes g evs) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk lim := - mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCap - hblk hext_nodup hCI ghOf RunEnv hlibc hG hio hioBounded hstk - (fun h547 X W γ tp => - mainEntryBudgetFitsCap_of_fitsEnv hEarly (hMain h547 X W) (hRunSub h547 X W γ tp)) - hrun - -/-- `cliBudgetLimits` specialization of -`mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_kitEnvFits_and_runTight` with setup early-exit -`FitsEnv` discharged. -/ -theorem mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTight - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {hookStack : Nat} - (E : UnreachedPqxdhPrimitives → CliHooks → RunCall → CliRunCalleeEnvs) - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - cliBudgetLimits (ghOf W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hMain : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (i : Inputs), - CliPqxdhInputs ⟨W.C, W.Q⟩ i → - FitsEnv fineCostModel cliBudgetLimits fineCostModel.init - (RealCliMainBinaryEnvOf (E X W) i)) - (hRunSub : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) - (g : RunCall), - CliPqxdhInputs ⟨W.C, W.Q⟩ g.i → - parseArgs uuidTryParse (g.i.argv.map bytesOfString) = some g.c → - (inputOf g.i g.c).length ≤ stdinCapBytes → - runRel (cliRunSemD2c_placed X W) g.i g.a → - ∀ evs : List AllocEvent, RunEnv X W γ tp g evs → - CliRunBinaryEnv cliIo.rd (E X W g) sessionCapBytes g evs) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk cliBudgetLimits := - mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCap - hblk hext_nodup hCI ghOf RunEnv hlibc hG hio hioBounded hstk - (fun h547 X W γ tp => - mainEntryBudgetFitsCap_cliBudgetLimits_of_kitEnvFits - (hMain h547 X W) (hRunSub h547 X W γ tp)) - hrun - -/-- `cliBudgetLimits` specialization of -`mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_kitEnvFits_and_runTight`. -/ -theorem mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTight - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {hookStack : Nat} - (E : UnreachedPqxdhPrimitives → CliHooks → RunCall → CliRunCalleeEnvs) - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - cliBudgetLimits (ghOf W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hMain : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (i : Inputs), - CliPqxdhInputs ⟨W.C, W.Q⟩ i → - FitsEnv fineCostModel cliBudgetLimits fineCostModel.init - (RealCliMainBinaryEnvOf (E X W) i)) - (hRunSub : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) - (g : RunCall), - CliPqxdhInputs ⟨W.C, W.Q⟩ g.i → - parseArgs uuidTryParse (g.i.argv.map bytesOfString) = some g.c → - (inputOf g.i g.c).length ≤ stdinCapBytes → - runRel (cliRunSemD2c_placed X W) g.i g.a → - ∀ evs : List AllocEvent, RunEnv X W γ tp g evs → - CliRunBinaryEnv cliIo.rd (E X W g) sessionCapBytes g evs) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk cliBudgetLimits := - mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCap - hblk hext_nodup hCI ghOf RunEnv hlibc hG hio hioBounded hstk - (fun h547 X W γ tp => - mainEntryBudgetFitsCap_cliBudgetLimits_of_kitEnvFits - (hMain h547 X W) (hRunSub h547 X W γ tp)) - hrun - -/-- `ReadEnv`-parametric `MainOkCliExtPqB2NeedLocksPlacedAt` assembler for `MainIoOfPlaced` -and `cliGhostExterns`. -/ -theorem mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_kitEnvFits_and_runTightOf - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} - {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} - (E : UnreachedPqxdhPrimitives → CliHooks → RunCall → CliRunCalleeEnvs) - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack - ReadStdinBoundedEnv ReadEnv) - (hReadSub : ∀ (files : FsFiles) (path : List (BitVec 8)) (evs : List AllocEvent), - ReadEnv files path evs → BoundedReadFileEnv evs) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hEarly : ∀ argvLen : Nat, argvLen ≤ 1820 → - FitsEnv fineCostModel lim fineCostModel.init - (SeqEnv (CliMainBoundedSetupEnv argvLen) FreeOnlyEvs)) - (hMain : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (i : Inputs), - CliPqxdhInputs ⟨W.C, W.Q⟩ i → - FitsEnv fineCostModel lim fineCostModel.init (RealCliMainBinaryEnvOf (E X W) i)) - (hRunSub : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) - (g : RunCall), - CliPqxdhInputs ⟨W.C, W.Q⟩ g.i → - parseArgs uuidTryParse (g.i.argv.map bytesOfString) = some g.c → - (inputOf g.i g.c).length ≤ stdinCapBytes → - runRel (cliRunSemD2c_placed X W) g.i g.a → - ∀ evs : List AllocEvent, RunEnv X W γ tp g evs → - CliRunBinaryEnv cliIo.rd (E X W g) sessionCapBytes g evs) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk lim := - mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf - hblk hext_nodup hCI ghOf RunEnv hlibc hG hioOf hstk - (fun h547 X W γ tp => - mainEntryBudgetFitsCapOf_of_fitsEnv hReadSub hEarly (hMain h547 X W) (hRunSub h547 X W γ tp)) - hrun - -/-- `ReadEnv`-parametric `MainOkCliExtOverB2NeedLocksPlacedAt` assembler for `MainIoOfPlaced` -and `cliGhostExterns`. -/ -theorem mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_kitEnvFits_and_runTightOf - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} - {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} - (E : UnreachedPqxdhPrimitives → CliHooks → RunCall → CliRunCalleeEnvs) - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack - ReadStdinBoundedEnv ReadEnv) - (hReadSub : ∀ (files : FsFiles) (path : List (BitVec 8)) (evs : List AllocEvent), - ReadEnv files path evs → BoundedReadFileEnv evs) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hEarly : ∀ argvLen : Nat, argvLen ≤ 1820 → - FitsEnv fineCostModel lim fineCostModel.init - (SeqEnv (CliMainBoundedSetupEnv argvLen) FreeOnlyEvs)) - (hMain : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (i : Inputs), - CliPqxdhInputs ⟨W.C, W.Q⟩ i → - FitsEnv fineCostModel lim fineCostModel.init (RealCliMainBinaryEnvOf (E X W) i)) - (hRunSub : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) - (g : RunCall), - CliPqxdhInputs ⟨W.C, W.Q⟩ g.i → - parseArgs uuidTryParse (g.i.argv.map bytesOfString) = some g.c → - (inputOf g.i g.c).length ≤ stdinCapBytes → - runRel (cliRunSemD2c_placed X W) g.i g.a → - ∀ evs : List AllocEvent, RunEnv X W γ tp g evs → - CliRunBinaryEnv cliIo.rd (E X W g) sessionCapBytes g evs) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk lim := - mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf - hblk hext_nodup hCI ghOf RunEnv hlibc hG hioOf hstk - (fun h547 X W γ tp => - mainEntryBudgetFitsCapOf_of_fitsEnv hReadSub hEarly (hMain h547 X W) (hRunSub h547 X W γ tp)) - hrun - -/-- `cliBudgetLimits` specialization of -`mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_kitEnvFits_and_runTightOf`. -/ -theorem mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {hookStack : Nat} - {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} - (E : UnreachedPqxdhPrimitives → CliHooks → RunCall → CliRunCalleeEnvs) - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - cliBudgetLimits (ghOf W)) - (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack - ReadStdinBoundedEnv ReadEnv) - (hReadSub : ∀ (files : FsFiles) (path : List (BitVec 8)) (evs : List AllocEvent), - ReadEnv files path evs → BoundedReadFileEnv evs) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hMain : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (i : Inputs), - CliPqxdhInputs ⟨W.C, W.Q⟩ i → - FitsEnv fineCostModel cliBudgetLimits fineCostModel.init - (RealCliMainBinaryEnvOf (E X W) i)) - (hRunSub : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) - (g : RunCall), - CliPqxdhInputs ⟨W.C, W.Q⟩ g.i → - parseArgs uuidTryParse (g.i.argv.map bytesOfString) = some g.c → - (inputOf g.i g.c).length ≤ stdinCapBytes → - runRel (cliRunSemD2c_placed X W) g.i g.a → - ∀ evs : List AllocEvent, RunEnv X W γ tp g evs → - CliRunBinaryEnv cliIo.rd (E X W g) sessionCapBytes g evs) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk cliBudgetLimits := - mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf - hblk hext_nodup hCI ghOf RunEnv hlibc hG hioOf hstk - (fun h547 X W γ tp => - mainEntryBudgetFitsCapOf_cliBudgetLimits_of_kitEnvFits - hReadSub (hMain h547 X W) (hRunSub h547 X W γ tp)) - hrun - -/-- `cliBudgetLimits` specialization of -`mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_kitEnvFits_and_runTightOf`. -/ -theorem mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {hookStack : Nat} - {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} - (E : UnreachedPqxdhPrimitives → CliHooks → RunCall → CliRunCalleeEnvs) - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - cliBudgetLimits (ghOf W)) - (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack - ReadStdinBoundedEnv ReadEnv) - (hReadSub : ∀ (files : FsFiles) (path : List (BitVec 8)) (evs : List AllocEvent), - ReadEnv files path evs → BoundedReadFileEnv evs) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hMain : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (i : Inputs), - CliPqxdhInputs ⟨W.C, W.Q⟩ i → - FitsEnv fineCostModel cliBudgetLimits fineCostModel.init - (RealCliMainBinaryEnvOf (E X W) i)) - (hRunSub : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) - (g : RunCall), - CliPqxdhInputs ⟨W.C, W.Q⟩ g.i → - parseArgs uuidTryParse (g.i.argv.map bytesOfString) = some g.c → - (inputOf g.i g.c).length ≤ stdinCapBytes → - runRel (cliRunSemD2c_placed X W) g.i g.a → - ∀ evs : List AllocEvent, RunEnv X W γ tp g evs → - CliRunBinaryEnv cliIo.rd (E X W g) sessionCapBytes g evs) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk cliBudgetLimits := - mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf - hblk hext_nodup hCI ghOf RunEnv hlibc hG hioOf hstk - (fun h547 X W γ tp => - mainEntryBudgetFitsCapOf_cliBudgetLimits_of_kitEnvFits - hReadSub (hMain h547 X W) (hRunSub h547 X W γ tp)) - hrun - /-! ## `mkExistentialRealCalleeEnvs` Whole-Program `FitsEnv` Composition -/ /-- Concrete binary-exact `RunCall → List AllocEvent → Prop` envelope at `(mpl, img, X, W)`. -/ @@ -1240,188 +724,6 @@ theorem mainOkCliExtOver_of_realMainEnvFits (libsignalPlacementOf mpl hblk hext_nodup) img X W) hrun -/-- `cliGhostExterns` specialization of `mainOkCliExtPq_of_realMainEnvFits`. -/ -theorem mainOkCliExtPq_cliGhostExterns_of_realMainEnvFits - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {hookStack : Nat} - (img : Image) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - cliBudgetLimits (ghOf W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (realCliRunBinaryEnvOf hblk hext_nodup img X W) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk cliBudgetLimits := - mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCap - hblk hext_nodup hCI ghOf (fun X W _ _ => realCliRunBinaryEnvOf hblk hext_nodup img X W) - hlibc hG hio hioBounded hstk - (fun _ X W _ _ => - @mainEntryBudgetFitsCap_of_realMainEnvFits_cliBudgetLimits - (libsignalPlacementOf mpl hblk hext_nodup) img X W) - hrun - -/-- `cliGhostExterns` specialization of `mainOkCliExtOver_of_realMainEnvFits`. -/ -theorem mainOkCliExtOver_cliGhostExterns_of_realMainEnvFits - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {hookStack : Nat} - (img : Image) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - cliBudgetLimits (ghOf W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (realCliRunBinaryEnvOf hblk hext_nodup img X W) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk cliBudgetLimits := - mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCap - hblk hext_nodup hCI ghOf (fun X W _ _ => realCliRunBinaryEnvOf hblk hext_nodup img X W) - hlibc hG hio hioBounded hstk - (fun _ X W _ _ => - @mainEntryBudgetFitsCap_of_realMainEnvFits_cliBudgetLimits - (libsignalPlacementOf mpl hblk hext_nodup) img X W) - hrun - -/-- `cliExternsPlaced mmpl` specialization of `mainOkCliExtPq_of_realMainEnvFits`. -/ -theorem mainOkCliExtPq_f3_of_realMainEnvFits - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - {libcAddr brkStart : BitVec 64} {hookStack : Nat} - (img : Image) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hFs : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @AllocContractsFsPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (cliExternsPlaced mmpl W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (cliExternsPlaced mmpl W) - cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (cliExternsPlaced mmpl W) - cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliExternsPlaced mmpl W)) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (realCliRunBinaryEnvOf hblk hext_nodup img X W) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl (cliExternsPlaced mmpl) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk cliBudgetLimits := - mainOkCliExtPqB2NeedLocksPlacedAt_cliExterns_of_runTight_and_budgetFitsCap - hblk hext_nodup hCI (fun X W _ _ => realCliRunBinaryEnvOf hblk hext_nodup img X W) - hlibc hFs hio hioBounded hstk - (fun _ X W _ _ => - @mainEntryBudgetFitsCap_of_realMainEnvFits_cliBudgetLimits - (libsignalPlacementOf mpl hblk hext_nodup) img X W) - hrun - -/-- `cliExternsPlaced mmpl` specialization of `mainOkCliExtOver_of_realMainEnvFits`. -/ -theorem mainOkCliExtOver_f3_of_realMainEnvFits - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - {libcAddr brkStart : BitVec 64} {hookStack : Nat} - (img : Image) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hFs : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @AllocContractsFsPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (cliExternsPlaced mmpl W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (cliExternsPlaced mmpl W) - cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (cliExternsPlaced mmpl W) - cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliExternsPlaced mmpl W)) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (realCliRunBinaryEnvOf hblk hext_nodup img X W) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl (cliExternsPlaced mmpl) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk cliBudgetLimits := - mainOkCliExtOverB2NeedLocksPlacedAt_cliExterns_of_runTight_and_budgetFitsCap - hblk hext_nodup hCI (fun X W _ _ => realCliRunBinaryEnvOf hblk hext_nodup img X W) - hlibc hFs hio hioBounded hstk - (fun _ X W _ _ => - @mainEntryBudgetFitsCap_of_realMainEnvFits_cliBudgetLimits - (libsignalPlacementOf mpl hblk hext_nodup) img X W) - hrun - /-! ## Strict Placed ELF Correctness and Never-OOM Corollaries -/ /-- Strict placed ELF correctness (`CliPqxdhExtElfCorrectStrictPlacedAt`) from whole-`main` `FitsEnv`. -/ @@ -1521,53 +823,6 @@ theorem not_cliReachesOOMExtPlacedAt_of_realMainEnvFits hext H hlibc hFs hio hioBounded hstrlen hutf8 hmemrchr hpan hstk hrun) W hi -/-- `cliExternsPlaced mmpl` specialization: `¬ CliReachesOOMPlaced mpl mmpl elf W i` for every -`CliPqxdhInputs ⟨W.C, W.Q⟩ i`. -/ -theorem not_cliReachesOOMPlaced_f3_of_realMainEnvFits - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - {exitStk : Nat} {libcAddr : BitVec 64} {hookStack : Nat} {elf : ElfImage} - (img : Image) - (H : CliElfExtB2NeedLocksAssumptions mpl mmpl (cliExternsPlaced mmpl) 617 cliProcessInputs - exitStk libcAddr cliMainStk CodeOk cliBudgetLimits elf) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hFs : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @AllocContractsFsPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits (cliExternsPlaced mmpl W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits (cliExternsPlaced mmpl W) - cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits (cliExternsPlaced mmpl W) - cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliExternsPlaced mmpl W)) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits - (realCliRunBinaryEnvOf hblk hext_nodup img X W) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) - (W : CliHooks) {i : Inputs} (hi : CliPqxdhInputs ⟨W.C, W.Q⟩ i) : - ¬ CliReachesOOMPlaced mpl mmpl elf W i := by - rw [cliReachesOOMPlaced_eq_extPlacedAt_f3] - exact not_cliReachesOOMExtPlacedAt_of_strict - (cliPqxdhExtOnInputsElfCorrectStrictPlacedAt_of_b2NeedLocksAssumptions - (externPreservesNoAllocFailed_cliExternsPlaced mmpl) H - (mainOkCliExtPq_f3_of_realMainEnvFits hblk hext_nodup hCI img hlibc hFs hio hioBounded hstk hrun) - (mainOkCliExtOver_f3_of_realMainEnvFits hblk hext_nodup hCI img hlibc hFs hio hioBounded hstk hrun)) - W hi - /-- `CliPqxdhElfCorrectStrictPlaced` when `cliProgPlacedSig mpl mmpl W = cliProgExtPlacedSigAt mpl ext 617 W`. -/ theorem cliPqxdhElfCorrectStrictPlaced_of_realMainEnvFits @@ -1616,49 +871,6 @@ theorem cliPqxdhElfCorrectStrictPlaced_of_realMainEnvFits (cliPqxdhExtElfCorrectStrictPlacedAt_of_realMainEnvFits hblk hext_nodup hCI utf8Err img hext H hlibc hFs hio hioBounded hstrlen hutf8 hmemrchr hpan hstk hrun) -/-- `cliExternsPlaced mmpl` specialization of `cliPqxdhElfCorrectStrictPlaced_of_realMainEnvFits`. -/ -theorem cliPqxdhElfCorrectStrictPlaced_f3_of_realMainEnvFits - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - {exitStk : Nat} {libcAddr : BitVec 64} {hookStack : Nat} {elf : ElfImage} - (img : Image) - (H : CliElfExtB2NeedLocksAssumptions mpl mmpl (cliExternsPlaced mmpl) 617 cliProcessInputs - exitStk libcAddr cliMainStk CodeOk cliBudgetLimits elf) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hFs : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @AllocContractsFsPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits (cliExternsPlaced mmpl W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits (cliExternsPlaced mmpl W) - cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits (cliExternsPlaced mmpl W) - cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliExternsPlaced mmpl W)) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits - (realCliRunBinaryEnvOf hblk hext_nodup img X W) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - CliPqxdhElfCorrectStrictPlaced mpl mmpl elf := - cliPqxdhElfCorrectStrictPlaced_of_extProgEq (fun _ => rfl) - (cliPqxdhExtOnInputsElfCorrectStrictPlacedAt_of_b2NeedLocksAssumptions - (externPreservesNoAllocFailed_cliExternsPlaced mmpl) H - (mainOkCliExtPq_f3_of_realMainEnvFits hblk hext_nodup hCI img hlibc hFs hio hioBounded hstk hrun) - (mainOkCliExtOver_f3_of_realMainEnvFits hblk hext_nodup hCI img hlibc hFs hio hioBounded hstk hrun)) - /-- `CliPqxdhElfCorrectPlaced` when `cliProgPlacedSig mpl mmpl W = cliProgExtPlacedSigAt mpl ext 617 W`. -/ theorem cliPqxdhElfCorrectPlaced_of_realMainEnvFits @@ -1707,47 +919,4 @@ theorem cliPqxdhElfCorrectPlaced_of_realMainEnvFits (cliPqxdhExtElfCorrectStrictPlacedAt_of_realMainEnvFits hblk hext_nodup hCI utf8Err img hext H hlibc hFs hio hioBounded hstrlen hutf8 hmemrchr hpan hstk hrun) -/-- `cliExternsPlaced mmpl` specialization of `cliPqxdhElfCorrectPlaced_of_realMainEnvFits`. -/ -theorem cliPqxdhElfCorrectPlaced_f3_of_realMainEnvFits - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - {exitStk : Nat} {libcAddr : BitVec 64} {hookStack : Nat} {elf : ElfImage} - (img : Image) - (H : CliElfExtB2NeedLocksAssumptions mpl mmpl (cliExternsPlaced mmpl) 617 cliProcessInputs - exitStk libcAddr cliMainStk CodeOk cliBudgetLimits elf) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hFs : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @AllocContractsFsPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits (cliExternsPlaced mmpl W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits (cliExternsPlaced mmpl W) - cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits (cliExternsPlaced mmpl W) - cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliExternsPlaced mmpl W)) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits - (realCliRunBinaryEnvOf hblk hext_nodup img X W) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - CliPqxdhElfCorrectPlaced mpl mmpl elf := - cliPqxdhElfCorrectPlaced_of_extProgEq (fun _ => rfl) - (cliPqxdhExtOnInputsElfCorrectStrictPlacedAt_of_b2NeedLocksAssumptions - (externPreservesNoAllocFailed_cliExternsPlaced mmpl) H - (mainOkCliExtPq_f3_of_realMainEnvFits hblk hext_nodup hCI img hlibc hFs hio hioBounded hstk hrun) - (mainOkCliExtOver_f3_of_realMainEnvFits hblk hext_nodup hCI img hlibc hFs hio hioBounded hstk hrun)) - end LibsignalBinary.Proofs.PeakBudget.CliNoOomOfFitsEnv diff --git a/LibsignalBinary/Proofs/PeakBudget/CliNoOomOfFitsEnvGhostSat.lean b/LibsignalBinary/Proofs/PeakBudget/CliNoOomOfFitsEnvGhostSat.lean new file mode 100644 index 000000000..f54cef465 --- /dev/null +++ b/LibsignalBinary/Proofs/PeakBudget/CliNoOomOfFitsEnvGhostSat.lean @@ -0,0 +1,202 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import Arm64.Trusted.Spec.Hoare +public import LibsignalBinary.Proofs.PeakBudget.MainEntryBudgetFitsCapReal -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInstSat -- proof-setup: allow-public-import + +/-! +# `cliGhostExterns` `cliBudgetLimits` `MainOkCliExt{Pq,Over}B2NeedLocksPadPlacedAt` Assemblers + +**Checked by Lean.** + +SWAR-padded `HookSat` (`*Sat`) counterparts of +`CliNoOomOfFitsEnv.mainOkCliExt{Pq,Over}B2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf`, +routing through +`MainEntryBudgetFitsInstSat.mainOkCliExt{Pq,Over}B2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_via_sat`. +-/ + +public section + +set_option autoImplicit false +set_option linter.style.haveILetI false +set_option maxRecDepth 200000 + +namespace LibsignalBinary.Proofs.PeakBudget.CliNoOomOfFitsEnvGhostSat + +open Arm64 (GhostName Memory subroutine_ok) +open Arm64.Obj (MultiPlacement) +open Arm64.Process (bytesOfString) +open CryptoVerification (libsignalMutatedBlocks libsignalSessionExterns) +open CryptoVerification.E2E (UnreachedPqxdhPrimitives) +open CryptoVerification.LibsignalPublicApi.StoreKit (FsFiles) +open CryptoVerification.LibsignalTripleRatchet (extHookStack) +open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) +open CryptoVerification.SignalSession + (CliHooks CliPqxdhInputs Inputs cliExternsPlaced cliProcessInputs libsignalSessionLib + stdinCapBytes) +open CryptoVerification.SignalSession.Cli.MainHops + (LsCodeInv RunCall cliIo cliMainStk cliResStack cliWrOk inputOf mProgPlaced mainFrameSize + parseArgs) +open CryptoVerification.SignalSession.Cli.RunCompose (runRel) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) +open LibsignalBinary.Heap (AllocEvent FitsEnv) +open LibsignalBinary.Heap.Fine (fineCostModel fineHookRustCliAllocBudget) +open LibsignalBinary.Proofs.PeakBudget.CliFitsTraceArith (cliBudgetLimits) +open LibsignalBinary.Proofs.PeakBudget.CliRunArmsPeak (CliRunCalleeEnvs) +open LibsignalBinary.Proofs.PeakBudget.CliSlotEnvelopeBridge + (CliRunBinaryEnv RealCliMainBinaryEnvOf) +open LibsignalBinary.Proofs.PeakBudget.MainEntryBudgetFitsCapReal + (mainEntryBudgetFitsCapOf_cliBudgetLimits_of_kitEnvFits) +open LibsignalBinary.Proofs.PeakBudget.RealMainEnvAdapter (BoundedReadFileEnv) +open LibsignalBinary.Proofs.PeakBudget.SpqrDomainCapsAux (sessionCapBytes) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat + (MainOkCliExtOverB2NeedLocksPadPlacedAt MainOkCliExtPqB2NeedLocksPadPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInstSat + (mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_via_sat + mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_via_sat) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced + (MainIoOfPlaced ReadStdinBoundedEnv) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainOkCliExtB2NeedLocksInst (cliRunSemD2c_placed) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.HopsPlacedBudget (runSpecTightPlaced) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget + (CliGhostAllocHooks) +open VerifiedLibraries.Mallocng (mallocngAddrsOfPlacement) + +/-- `cliBudgetLimits` specialization of +`mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_via_sat`. -/ +theorem mainOkCliExtPqB2NeedLocksPadPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf + {mpl mmpl : MultiPlacement} + (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → + (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) + (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) + {CodeOk : Memory → Prop} + (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) + (ghOf : CliHooks → CliGhostHooks) + {libcAddr brkStart : BitVec 64} {hookStack : Nat} + {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} + (E : UnreachedPqxdhPrimitives → CliHooks → RunCall → CliRunCalleeEnvs) + (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → + RunCall → List AllocEvent → Prop) + (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) + (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel + (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (ghOf W)) + (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ + (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits + (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack + ReadStdinBoundedEnv ReadEnv) + (hReadSub : ∀ (files : FsFiles) (path : List (BitVec 8)) (evs : List AllocEvent), + ReadEnv files path evs → BoundedReadFileEnv evs) + (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) + (hMain : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (i : Inputs), + CliPqxdhInputs ⟨W.C, W.Q⟩ i → + FitsEnv fineCostModel cliBudgetLimits fineCostModel.init + (RealCliMainBinaryEnvOf (E X W) i)) + (hRunSub : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) + (g : RunCall), + CliPqxdhInputs ⟨W.C, W.Q⟩ g.i → + parseArgs uuidTryParse (g.i.argv.map bytesOfString) = some g.c → + (inputOf g.i g.c).length ≤ stdinCapBytes → + runRel (cliRunSemD2c_placed X W) g.i g.a → + ∀ evs : List AllocEvent, RunEnv X W γ tp g evs → + CliRunBinaryEnv cliIo.rd (E X W g) sessionCapBytes g evs) + (hrun : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @subroutine_ok _ + (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) + (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) + (mpl.base 579) + (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) + (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk + (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits + (RunEnv X W γ tp) uuidTryParse + (runRel (cliRunSemD2c_placed X W)) + cliWrOk cliResStack)) : + MainOkCliExtPqB2NeedLocksPadPlacedAt mpl mmpl + (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk + libcAddr brkStart cliMainStk cliBudgetLimits := + mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_via_sat + hblk hext_nodup hCI ghOf RunEnv hlibc hG hioOf hstk + (fun h547 X W γ tp => + mainEntryBudgetFitsCapOf_cliBudgetLimits_of_kitEnvFits + hReadSub (hMain h547 X W) (hRunSub h547 X W γ tp)) + hrun + +/-- `cliBudgetLimits` specialization of +`mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_via_sat`. -/ +theorem mainOkCliExtOverB2NeedLocksPadPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf + {mpl mmpl : MultiPlacement} + (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → + (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) + (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) + {CodeOk : Memory → Prop} + (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) + (ghOf : CliHooks → CliGhostHooks) + {libcAddr brkStart : BitVec 64} {hookStack : Nat} + {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} + (E : UnreachedPqxdhPrimitives → CliHooks → RunCall → CliRunCalleeEnvs) + (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → + RunCall → List AllocEvent → Prop) + (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) + (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel + (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (ghOf W)) + (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ + (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits + (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack + ReadStdinBoundedEnv ReadEnv) + (hReadSub : ∀ (files : FsFiles) (path : List (BitVec 8)) (evs : List AllocEvent), + ReadEnv files path evs → BoundedReadFileEnv evs) + (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) + (hMain : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (i : Inputs), + CliPqxdhInputs ⟨W.C, W.Q⟩ i → + FitsEnv fineCostModel cliBudgetLimits fineCostModel.init + (RealCliMainBinaryEnvOf (E X W) i)) + (hRunSub : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) + (g : RunCall), + CliPqxdhInputs ⟨W.C, W.Q⟩ g.i → + parseArgs uuidTryParse (g.i.argv.map bytesOfString) = some g.c → + (inputOf g.i g.c).length ≤ stdinCapBytes → + runRel (cliRunSemD2c_placed X W) g.i g.a → + ∀ evs : List AllocEvent, RunEnv X W γ tp g evs → + CliRunBinaryEnv cliIo.rd (E X W g) sessionCapBytes g evs) + (hrun : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @subroutine_ok _ + (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) + (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) + (mpl.base 579) + (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) + (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk + (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits + (RunEnv X W γ tp) uuidTryParse + (runRel (cliRunSemD2c_placed X W)) + cliWrOk cliResStack)) : + MainOkCliExtOverB2NeedLocksPadPlacedAt mpl mmpl + (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk + libcAddr brkStart cliMainStk cliBudgetLimits := + mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_via_sat + hblk hext_nodup hCI ghOf RunEnv hlibc hG hioOf hstk + (fun h547 X W γ tp => + mainEntryBudgetFitsCapOf_cliBudgetLimits_of_kitEnvFits + hReadSub (hMain h547 X W) (hRunSub h547 X W γ tp)) + hrun + +end LibsignalBinary.Proofs.PeakBudget.CliNoOomOfFitsEnvGhostSat diff --git a/LibsignalBinary/Proofs/PeakBudget/CliNoOomOfFitsEnvSat.lean b/LibsignalBinary/Proofs/PeakBudget/CliNoOomOfFitsEnvSat.lean index f18057e8d..f18ee7fb6 100644 --- a/LibsignalBinary/Proofs/PeakBudget/CliNoOomOfFitsEnvSat.lean +++ b/LibsignalBinary/Proofs/PeakBudget/CliNoOomOfFitsEnvSat.lean @@ -43,7 +43,7 @@ open CryptoVerification.LibsignalTripleRatchet (extHookStack) open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) open CryptoVerification.SignalSession (CliHooks CliPqxdhElfCorrectPlaced CliPqxdhInputs Inputs cliProcessInputs - libsignalSessionLib lsFromUtf8Sym lsMemrchrSym stdinCapBytes strlenHook) + libsignalSessionLib lsFromUtf8Sym lsMemrchrSym stdinCapBytes) open CryptoVerification.SignalSession.Cli.MainHops (LsCodeInv RunCall cliIo cliMainStk cliResStack cliWrOk fromUtf8AsciiSpec inputOf lsHandleErrorSymMain mProgPlaced mainFrameSize memrchrSpec parseArgs) @@ -120,7 +120,6 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_of_kitEnvFits_and_runTight_sat @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -165,7 +164,7 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_of_kitEnvFits_and_runTight_sat libcAddr brkStart cliMainStk lim := mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap_sat hblk hext_nodup hCI RunEnv hlibc hFs hio hioBounded - hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk + hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk (fun h547 X W γ tp => mainEntryBudgetFitsCap_of_fitsEnv hEarly (hMain h547 X W) (hRunSub h547 X W γ tp)) hrun @@ -195,7 +194,6 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_kitEnvFits_and_runTight_sat @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -240,7 +238,7 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_kitEnvFits_and_runTight_sat libcAddr brkStart cliMainStk lim := mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap_sat hblk hext_nodup hCI RunEnv hlibc hFs hio hioBounded - hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk + hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk (fun h547 X W γ tp => mainEntryBudgetFitsCap_of_fitsEnv hEarly (hMain h547 X W) (hRunSub h547 X W γ tp)) hrun @@ -272,7 +270,6 @@ theorem mainOkCliExtPq_of_realMainEnvFits_90pct_sat @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -302,7 +299,7 @@ theorem mainOkCliExtPq_of_realMainEnvFits_90pct_sat libcAddr brkStart cliMainStk lim := mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap_sat hblk hext_nodup hCI (fun X W _ _ => realCliRunBinaryEnvOf hblk hext_nodup img X W) - hlibc hFs hio hioBounded hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk + hlibc hFs hio hioBounded hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk (fun _ X W _ _ => @mainEntryBudgetFitsCap_of_realMainEnvFits_90pct (libsignalPlacementOf mpl hblk hext_nodup) lim henf hsb hsc hcap90 img X W) @@ -335,7 +332,6 @@ theorem mainOkCliExtOver_of_realMainEnvFits_90pct_sat @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -365,7 +361,7 @@ theorem mainOkCliExtOver_of_realMainEnvFits_90pct_sat libcAddr brkStart cliMainStk lim := mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap_sat hblk hext_nodup hCI (fun X W _ _ => realCliRunBinaryEnvOf hblk hext_nodup img X W) - hlibc hFs hio hioBounded hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk + hlibc hFs hio hioBounded hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk (fun _ X W _ _ => @mainEntryBudgetFitsCap_of_realMainEnvFits_90pct (libsignalPlacementOf mpl hblk hext_nodup) lim henf hsb hsc hcap90 img X W) @@ -398,7 +394,6 @@ theorem mainOkCliExtPq_of_realMainEnvFits_1GiB_sat @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -428,7 +423,7 @@ theorem mainOkCliExtPq_of_realMainEnvFits_1GiB_sat libcAddr brkStart cliMainStk lim := mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap_sat hblk hext_nodup hCI (fun X W _ _ => realCliRunBinaryEnvOf hblk hext_nodup img X W) - hlibc hFs hio hioBounded hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk + hlibc hFs hio hioBounded hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk (fun _ X W _ _ => @mainEntryBudgetFitsCap_of_realMainEnvFits_1GiB (libsignalPlacementOf mpl hblk hext_nodup) lim henf hsb hsc hcap1G img X W) @@ -461,7 +456,6 @@ theorem mainOkCliExtOver_of_realMainEnvFits_1GiB_sat @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -491,7 +485,7 @@ theorem mainOkCliExtOver_of_realMainEnvFits_1GiB_sat libcAddr brkStart cliMainStk lim := mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap_sat hblk hext_nodup hCI (fun X W _ _ => realCliRunBinaryEnvOf hblk hext_nodup img X W) - hlibc hFs hio hioBounded hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk + hlibc hFs hio hioBounded hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk (fun _ X W _ _ => @mainEntryBudgetFitsCap_of_realMainEnvFits_1GiB (libsignalPlacementOf mpl hblk hext_nodup) lim henf hsb hsc hcap1G img X W) @@ -520,7 +514,6 @@ theorem mainOkCliExtPq_of_realMainEnvFits_sat @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -550,7 +543,7 @@ theorem mainOkCliExtPq_of_realMainEnvFits_sat libcAddr brkStart cliMainStk cliBudgetLimits := mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap_sat hblk hext_nodup hCI (fun X W _ _ => realCliRunBinaryEnvOf hblk hext_nodup img X W) - hlibc hFs hio hioBounded hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk + hlibc hFs hio hioBounded hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk (fun _ X W _ _ => @mainEntryBudgetFitsCap_of_realMainEnvFits_cliBudgetLimits (libsignalPlacementOf mpl hblk hext_nodup) img X W) @@ -579,7 +572,6 @@ theorem mainOkCliExtOver_of_realMainEnvFits_sat @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -609,7 +601,7 @@ theorem mainOkCliExtOver_of_realMainEnvFits_sat libcAddr brkStart cliMainStk cliBudgetLimits := mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap_sat hblk hext_nodup hCI (fun X W _ _ => realCliRunBinaryEnvOf hblk hext_nodup img X W) - hlibc hFs hio hioBounded hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk + hlibc hFs hio hioBounded hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk (fun _ X W _ _ => @mainEntryBudgetFitsCap_of_realMainEnvFits_cliBudgetLimits (libsignalPlacementOf mpl hblk hext_nodup) img X W) @@ -642,7 +634,6 @@ theorem cliPqxdhExtElfCorrectStrictPlacedAt_of_realMainEnvFits_sat @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -671,9 +662,9 @@ theorem cliPqxdhExtElfCorrectStrictPlacedAt_of_realMainEnvFits_sat CliPqxdhExtElfCorrectStrictPlacedAt mpl mmpl ext 617 elf := cliPqxdhExtOnInputsElfCorrectStrictPlacedAt_of_b2NeedLocksPadAssumptions hext H (mainOkCliExtPq_of_realMainEnvFits_sat hblk hext_nodup hCI img hlibc hFs hio hioBounded - hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk hrun) + hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk hrun) (mainOkCliExtOver_of_realMainEnvFits_sat hblk hext_nodup hCI img hlibc hFs hio hioBounded - hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk hrun) + hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk hrun) /-- `HookSat` sibling of `not_cliReachesOOMExtPlacedAt_of_realMainEnvFits` (`CliNoOomOfFitsEnv.lean:1513`), dropping `utf8Err` and concluding token-identical @@ -702,7 +693,6 @@ theorem not_cliReachesOOMExtPlacedAt_of_realMainEnvFits_sat @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -732,7 +722,7 @@ theorem not_cliReachesOOMExtPlacedAt_of_realMainEnvFits_sat ¬ CliReachesOOMExtPlacedAt mpl ext 617 elf W i := not_cliReachesOOMExtPlacedAt_of_strict (cliPqxdhExtElfCorrectStrictPlacedAt_of_realMainEnvFits_sat hblk hext_nodup hCI img - hext H hlibc hFs hio hioBounded hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO + hext H hlibc hFs hio hioBounded hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk hrun) W hi @@ -764,7 +754,6 @@ theorem cliPqxdhElfCorrectStrictPlaced_of_realMainEnvFits_sat @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -793,7 +782,7 @@ theorem cliPqxdhElfCorrectStrictPlaced_of_realMainEnvFits_sat CliPqxdhElfCorrectStrictPlaced mpl mmpl elf := cliPqxdhElfCorrectStrictPlaced_of_extProgEq hprog (cliPqxdhExtElfCorrectStrictPlacedAt_of_realMainEnvFits_sat hblk hext_nodup hCI img - hext H hlibc hFs hio hioBounded hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO + hext H hlibc hFs hio hioBounded hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk hrun) /-- `HookSat` sibling of `cliPqxdhElfCorrectPlaced_of_realMainEnvFits` @@ -824,7 +813,6 @@ theorem cliPqxdhElfCorrectPlaced_of_realMainEnvFits_sat @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -853,7 +841,7 @@ theorem cliPqxdhElfCorrectPlaced_of_realMainEnvFits_sat CliPqxdhElfCorrectPlaced mpl mmpl elf := cliPqxdhElfCorrectPlaced_of_extProgEq hprog (cliPqxdhExtElfCorrectStrictPlacedAt_of_realMainEnvFits_sat hblk hext_nodup hCI img - hext H hlibc hFs hio hioBounded hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO + hext H hlibc hFs hio hioBounded hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk hrun) end LibsignalBinary.Proofs.PeakBudget.CliNoOomOfFitsEnvSat diff --git a/LibsignalBinary/Proofs/PeakBudget/D3MatchingPathBSeqFreeR.lean b/LibsignalBinary/Proofs/PeakBudget/D3MatchingPathBSeqFreeR.lean index 31d8cf540..cc8bd0a13 100644 --- a/LibsignalBinary/Proofs/PeakBudget/D3MatchingPathBSeqFreeR.lean +++ b/LibsignalBinary/Proofs/PeakBudget/D3MatchingPathBSeqFreeR.lean @@ -109,7 +109,7 @@ open CryptoVerification.LibsignalTripleRatchetRepr uuidTryParse vecResultAt) open CryptoVerification.RustHeap (RustAlloc) open CryptoVerification.SignalSession - (CliHooks cliExternsPlaced isCliPanicSymbolPlaced lsReadFileSym) + (CliHooks cliExternsPlaced lsReadFileSym) open CryptoVerification.SignalSession.Cli (StoresGhost cliIdentityVtSym cliKyberPreKeyVtSym cliPreKeyVtSym cliSessionVtSym cliSignedPreKeyVtSym dirAt) @@ -122,7 +122,7 @@ open CryptoVerification.SignalSession.Cli.Run.Placed (lsProg_579) open CryptoVerification.SignalSession.Cli.RunCompose (DecPkGhost RunNeeds RunSem decResAt dpPollNeed dpSlotArgsPlaced mkSlot slotOutTr) open CryptoVerification.SignalSession.Cli.RunGlue - (CliGhostHooks cliGhostExterns cliGhostExterns_other) + (CliGhostHooks cliGhostExterns withPanics_cliGhostExterns) open CryptoVerification.SignalSession.Cli.RunProofs (SessMatchesPm cliDecryptPrekeyNeed decPkDef dpCxAt dpFutDoneAt dpFutStartAt dpWrapFrame) open CryptoVerification.SignalSession.Cli.RunProofs.Poll @@ -2069,31 +2069,13 @@ private theorem e2c_toSkeletonRunHooks [LibsignalPlacement] {M : AllocCostModel} { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } private theorem e2c_withPanics_cliGhostExterns_eq (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : Rust.withPanics (cliGhostExterns gh (cliExternsPlaced mmpl W)) = - cliGhostExterns gh (cliExternsPlaced mmpl W) := by - funext name - by_cases hp : Rust.isPanicSymbol name = true - · have hother : cliGhostExterns gh (cliExternsPlaced mmpl W) name = cliExternsPlaced mmpl W name := - cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustDeallocSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustReallocSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocZeroedSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustNoAllocShimSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsReadFileSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsReadStdinSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemsetSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemcpySym] at hp) - unfold Rust.withPanics - rw [hother] - unfold cliExternsPlaced isCliPanicSymbolPlaced - simp [hp] - · simp [Rust.withPanics, hp] + cliGhostExterns gh (cliExternsPlaced mmpl W) := + withPanics_cliGhostExterns mmpl gh W /-- Parametric `SessionGhostValid`-strengthened Path-B `decrypt_prekey` slot envelope. -/ def DecPkD3MatchingPathBGvEnv [LibsignalPlacement] (A : RustAlloc) diff --git a/LibsignalBinary/Proofs/PeakBudget/DecPkD2cSlotOkLinkedAux.lean b/LibsignalBinary/Proofs/PeakBudget/DecPkD2cSlotOkLinkedAux.lean index dcf94f233..e8cd275b3 100644 --- a/LibsignalBinary/Proofs/PeakBudget/DecPkD2cSlotOkLinkedAux.lean +++ b/LibsignalBinary/Proofs/PeakBudget/DecPkD2cSlotOkLinkedAux.lean @@ -120,7 +120,7 @@ open CryptoVerification.SignalSession.Cli.MainHops open CryptoVerification.SignalSession.Cli.RunCompose (DecPkGhost RunSem decResAt dpPollNeed dpSlotArgsPlaced slotOutTr) open CryptoVerification.SignalSession.Cli.RunGlue - (CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other + (CliGhostHooks cliExternsPlaced_row cliExtraGhostSyms cliGhostExterns cliGhostExterns_other withPanics_cliGhostExterns) open CryptoVerification.SignalSession.Cli.RunProofs (DecPkOkD2c DecPkOk₀ SessMatchesPm decPkDef decPkDefD2c @@ -382,9 +382,12 @@ private theorem cliGhost_row_aux (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (h5 : sym ≠ lsRustNoAllocShimSymCli := by decide) (h6 : sym ≠ lsStringCloneSym := by decide) (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : cliExtraGhostSyms.contains sym = false ∨ g.extra.lookup sym = none := by + left; decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 hExtra).trans + (cliExternsPlaced_row mmpl W hrow) private theorem fmtWriteHook0_budget_ok_aux {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) : diff --git a/LibsignalBinary/Proofs/PeakBudget/RealCliDecPkSlotOk.lean b/LibsignalBinary/Proofs/PeakBudget/RealCliDecPkSlotOk.lean index 27b99e994..5d483f42f 100644 --- a/LibsignalBinary/Proofs/PeakBudget/RealCliDecPkSlotOk.lean +++ b/LibsignalBinary/Proofs/PeakBudget/RealCliDecPkSlotOk.lean @@ -57,7 +57,7 @@ open CryptoVerification.SignalSession ( lsRustNoAllocShimSymCli lsRustReallocSymCli lsStringCloneSym ) open CryptoVerification.SignalSession.Cli.RunGlue ( - CliGhostHooks IsFsC cliExternsPlaced_row cliGhostExterns cliGhostExterns_other + CliGhostHooks IsFsC cliExternsPlaced_row cliExtraGhostSyms cliGhostExterns cliGhostExterns_other ) open CryptoVerification.SignalSession.Cli.Slots ( aesDec_row_placed fmtWrite_row_placed formatInner_row_placed @@ -118,9 +118,11 @@ private theorem cliGhost_row_eq (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) (h9 : sym ≠ lsMemsetSym := by decide) - (h10 : sym ≠ lsMemcpySym := by decide) : + (h10 : sym ≠ lsMemcpySym := by decide) + (hExtra : cliExtraGhostSyms.contains sym = false ∨ gh.extra.lookup sym = none := by + left; decide) : cliGhostExterns gh (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other gh (cliExternsPlaced mmpl W) h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans + (cliGhostExterns_other gh (cliExternsPlaced mmpl W) h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 hExtra).trans (cliExternsPlaced_row mmpl W hrow) /-! ## 2. Closed Formatting & `mallocng` AES-CBC Hook Contracts on `cliGhostExterns` -/ diff --git a/LibsignalBinary/Proofs/PeakBudget/RealMainEnvNonVacSuccInit.lean b/LibsignalBinary/Proofs/PeakBudget/RealMainEnvNonVacSuccInit.lean index 7bdaaddd4..109da34f7 100644 --- a/LibsignalBinary/Proofs/PeakBudget/RealMainEnvNonVacSuccInit.lean +++ b/LibsignalBinary/Proofs/PeakBudget/RealMainEnvNonVacSuccInit.lean @@ -1015,13 +1015,6 @@ def succInitW0 : PEParams := ⟨succInitC0, succInitQ0⟩ def succInitCliHooks : CliHooks where C := succInitC0 Q := succInitQ0 - bcmp a b := if a = b then 0#64 else 1#64 - bcmp_ok a b _ := by - by_cases h : a = b - · simp [h] - · simp only [h, ↓reduceIte, iff_false] - decide - utf8Err _ := (0#64, 0#16) /-- Concrete Alice `PqParty` witness (`session = none`, `peerId = none`). -/ def succInitParty0 : PqParty where diff --git a/LibsignalBinary/Proofs/PeakBudget/RealMainEnvNonVacSuccSend.lean b/LibsignalBinary/Proofs/PeakBudget/RealMainEnvNonVacSuccSend.lean index 9cc65fa3a..ff795e326 100644 --- a/LibsignalBinary/Proofs/PeakBudget/RealMainEnvNonVacSuccSend.lean +++ b/LibsignalBinary/Proofs/PeakBudget/RealMainEnvNonVacSuccSend.lean @@ -3235,14 +3235,6 @@ theorem sendSuccBinaryKitMainEnv_sub_realCliMainBinaryEnvOf [LibsignalPlacement] private def sendWitnessCliHooks : CliHooks where C := CryptoVerification.SignalSession.NonVacuityPq.C0 Q := CryptoVerification.SignalSession.NonVacuityPq.Q0 - bcmp := fun a b => if a == b then 0#64 else 1#64 - bcmp_ok := by - intro a b _ - by_cases h : a = b - · subst h; simp - · have hbeq : (a == b) = false := beq_false_of_ne h - simp [hbeq, h] - utf8Err := fun _ => (0#64, 0#16) private def sendWitnessRunEncGhost : EncGhost where peer := nonVacSendAddrGhost nonVacSendPeer diff --git a/LibsignalBinary/Proofs/PeakBudget/RealMainEnvNonVacSuccWhisper.lean b/LibsignalBinary/Proofs/PeakBudget/RealMainEnvNonVacSuccWhisper.lean index 7e69cfb2f..d12afd0b6 100644 --- a/LibsignalBinary/Proofs/PeakBudget/RealMainEnvNonVacSuccWhisper.lean +++ b/LibsignalBinary/Proofs/PeakBudget/RealMainEnvNonVacSuccWhisper.lean @@ -1610,9 +1610,6 @@ theorem recvWhisperSuccMainEnv_sub_kit [LibsignalPlacement] def w0CliHooks : CliHooks where C := C0 Q := Q0 - bcmp a b := if a = b then 0#64 else 1#64 - bcmp_ok a b _ := by by_cases h : a = b <;> simp [h] - utf8Err _ := (0#64, 0#16) def w0Rec0 : SessionRecord (List (BitVec 8)) := toRecord (extrasOf fun _ => w0XA) ⟨.A, w0SA0, 0, [0]⟩ diff --git a/LibsignalBinary/Proofs/PeakBudget/W4RecvPrekeyCmkDom0.lean b/LibsignalBinary/Proofs/PeakBudget/W4RecvPrekeyCmkDom0.lean index 232d8543a..17ca1f914 100644 --- a/LibsignalBinary/Proofs/PeakBudget/W4RecvPrekeyCmkDom0.lean +++ b/LibsignalBinary/Proofs/PeakBudget/W4RecvPrekeyCmkDom0.lean @@ -903,14 +903,6 @@ def w4BinaryRecvPrekeyCmkDom0Of_singleSlotFineSpec {P : PEParams} {c : CallV} {i let W : CliHooks := { C := P.C Q := P.Q - bcmp := fun a b => if a = b then 0#64 else 1#64 - bcmp_ok := fun a b _ => by - split - · next h => exact ⟨fun _ => h, fun _ => by decide⟩ - · next h => - exact ⟨fun hz => False.elim ((by decide : (1#64).setWidth 32 ≠ 0#32) hz), - fun heq => False.elim (h heq)⟩ - utf8Err := fun _ => (0#64, 0#16) } refine ⟨fun evs ⟨w, hw4, henv⟩ => ?_, fun st0 {evs} ⟨w, hw4, henv⟩ => ?_⟩ · obtain ⟨hpv, hp40, hfiles, hrd, hd, htr⟩ := hw4 peerAddr rfl @@ -1065,14 +1057,6 @@ def w4BinaryRecvPrekeyCmkDom0Of_singleSlotFineSpec {P : PEParams} {c : CallV} {i let W : CliHooks := { C := P.C Q := P.Q - bcmp := fun a b => if a = b then 0#64 else 1#64 - bcmp_ok := fun a b _ => by - split - · next h => exact ⟨fun _ => h, fun _ => by decide⟩ - · next h => - exact ⟨fun hz => False.elim ((by decide : (1#64).setWidth 32 ≠ 0#32) hz), - fun heq => False.elim (h heq)⟩ - utf8Err := fun _ => (0#64, 0#16) } refine ⟨fun st0 {evs} ⟨w, hw4, henv⟩ => ?_⟩ obtain ⟨hpv, hp40, hfiles, hrd, hd, htr⟩ := hw4 peerAddr rfl diff --git a/LibsignalBinary/Proofs/PeakBudget/W4RecvPrekeyCmkDom0PostBob.lean b/LibsignalBinary/Proofs/PeakBudget/W4RecvPrekeyCmkDom0PostBob.lean index 721ef80d5..a0ffce52c 100644 --- a/LibsignalBinary/Proofs/PeakBudget/W4RecvPrekeyCmkDom0PostBob.lean +++ b/LibsignalBinary/Proofs/PeakBudget/W4RecvPrekeyCmkDom0PostBob.lean @@ -5926,14 +5926,6 @@ private theorem dom0p_allFixed_eq_localFixed {P : PEParams} {i : Inputs} private def dom0p_dummyCliHooks (P : PEParams) : CliHooks where C := P.C Q := P.Q - bcmp := fun a b => if a = b then 0#64 else 1#64 - bcmp_ok := fun a b _ => by - split - · next h => exact ⟨fun _ => h, fun _ => by decide⟩ - · next h => - exact ⟨fun hz => False.elim ((by decide : (1#64).setWidth 32 ≠ 0#32) hz), - fun heq => False.elim (h heq)⟩ - utf8Err := fun _ => (0#64, 0#16) /-- `SR`-parametric `maxOps`-parametric `SingleSlotFineSpec` for `Dom0'` (`W4BinaryRecvPrekeyDomCmk0'`). -/ def w4BinaryRecvPrekeyCmkDom0'Of_singleSlotFineSpec {P : PEParams} {c : CallV} {i : Inputs} diff --git a/LibsignalBinary/Proofs/Placed/SubsetA4cBudget.lean b/LibsignalBinary/Proofs/Placed/SubsetA4cBudget.lean index 66dc0f674..a100e7ad8 100644 --- a/LibsignalBinary/Proofs/Placed/SubsetA4cBudget.lean +++ b/LibsignalBinary/Proofs/Placed/SubsetA4cBudget.lean @@ -10,6 +10,7 @@ limitations under the License. module public import LibsignalBinary.Heap.SpecBudget +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.Placed.SubsetA4c public import LibsignalBinary.Proofs.SpqrV1.Chain.NextKeyInternalBudget public import LibsignalBinary.Proofs.SpqrV1.States.FromPb.DefsBudget @@ -40,6 +41,7 @@ open CryptoVerification.SpqrV1.States.RecvCt2Chunk (spqrMlkemDecapsSym) open CryptoVerification.SpqrV1.Unchunked open LibsignalBinary.Heap open LibsignalBinary.Heap.SpecBudget (libcruxHmacBudgetSpec withVmPreserved) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open LibsignalBinary.Proofs.SpqrV1.Chain.NextKeyInternalBudget (withAllocVmPreserved) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget open LibsignalBinary.Proofs.SpqrV1.States.FromPb.DefsBudget (StatesFromPbEnv) @@ -91,14 +93,16 @@ private theorem hookSat_sessionMemcpyBudget_of_region_any {H : String → Option private theorem hookSat_withAllocVmPreserved_memmove_of_zero {H : String → Option (State → State)} {sym : String} (hookStack : Nat) - (h : HookSat H sym (withAllocVmPreserved (sessionMemmoveSpec 0))) : - HookSat H sym (withAllocVmPreserved (sessionMemmoveSpec hookStack)) := by + (h : HookSat H sym (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) : + HookSat H sym (withAllocVmPreserved (sessionMemmoveBoundedSpec hookStack)) := by refine ProofLib.HookSat.mono h fun ⟨base, buf, dst, src, len⟩ R s0 hpre => ⟨(base, buf, dst, src, len), stackAt s0.sp hookStack ∗ R, ?_, fun sf hpost => ?_⟩ - · dsimp only [withAllocVmPreserved, sessionMemmoveSpec, libcMemmoveSpec, stackAt] at hpre ⊢ + · dsimp only [withAllocVmPreserved, sessionMemmoveBoundedSpec, + sessionMemmoveSpec, libcMemmoveSpec, stackAt] at hpre ⊢ simp only [ProofLib.memRegion_zero, sepConj_emp] ac_nf at hpre ⊢ - · dsimp only [withAllocVmPreserved, sessionMemmoveSpec, stackAt] at hpost ⊢ + · dsimp only [withAllocVmPreserved, sessionMemmoveBoundedSpec, + sessionMemmoveSpec, stackAt] at hpost ⊢ simp only [ProofLib.memRegion_zero, sepConj_emp] at hpost ac_nf at hpost ⊢ @@ -109,7 +113,7 @@ theorem statesPlacedSeams_of_hooks [LibsignalPlacement] [HkdfPlacedHooks F (Rust.withPanics ext)] (hA : RecvCt2PlacedAlloc M A lim ext) (hmemmove0 : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec 0))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hval_pk : HookSat (Rust.withPanics ext) "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes" diff --git a/LibsignalBinary/Proofs/Placed/SubsetA4cBudgetSat.lean b/LibsignalBinary/Proofs/Placed/SubsetA4cBudgetSat.lean index 809bce8db..630988af3 100644 --- a/LibsignalBinary/Proofs/Placed/SubsetA4cBudgetSat.lean +++ b/LibsignalBinary/Proofs/Placed/SubsetA4cBudgetSat.lean @@ -9,6 +9,7 @@ limitations under the License. module +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.Placed.SubsetA4cBudget -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpqrV1.States.Recv.TopPlacedBudgetSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat -- proof-setup: allow-public-import @@ -44,6 +45,7 @@ open CryptoVerification.SpqrV1.States.RecvCt2Chunk (spqrMlkemDecapsSym) open CryptoVerification.SpqrV1.Unchunked (spqrLibcruxHmacSym spqrMlkemEncaps2Sym) open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget allocMemcpyVmSpec) open LibsignalBinary.Heap.SpecBudget (libcruxHmacBudgetSpec withVmPreserved) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open LibsignalBinary.Proofs.SpqrV1.Alloc.ConcatBudgetAux (framelessMemcpyAcpSpec) open LibsignalBinary.Proofs.SpqrV1.Chain.NextKeyInternalBudget (withAllocVmPreserved) open LibsignalBinary.Proofs.SpqrV1.Poly.NextChunk.EpiloguePlacedBudget (AllocContractsPlaced) @@ -109,14 +111,16 @@ private theorem hookSat_sessionMemcpyBudget_of_region_any {H : String → Option private theorem hookSat_withAllocVmPreserved_memmove_of_zero {H : String → Option (State → State)} {sym : String} (hookStack : Nat) - (h : HookSat H sym (withAllocVmPreserved (sessionMemmoveSpec 0))) : - HookSat H sym (withAllocVmPreserved (sessionMemmoveSpec hookStack)) := by + (h : HookSat H sym (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) : + HookSat H sym (withAllocVmPreserved (sessionMemmoveBoundedSpec hookStack)) := by refine ProofLib.HookSat.mono h fun ⟨base, buf, dst, src, len⟩ R s0 hpre => ⟨(base, buf, dst, src, len), stackAt s0.sp hookStack ∗ R, ?_, fun sf hpost => ?_⟩ - · dsimp only [withAllocVmPreserved, sessionMemmoveSpec, libcMemmoveSpec, stackAt] at hpre ⊢ + · dsimp only [withAllocVmPreserved, sessionMemmoveBoundedSpec, + sessionMemmoveSpec, libcMemmoveSpec, stackAt] at hpre ⊢ simp only [ProofLib.memRegion_zero, sepConj_emp] ac_nf at hpre ⊢ - · dsimp only [withAllocVmPreserved, sessionMemmoveSpec, stackAt] at hpost ⊢ + · dsimp only [withAllocVmPreserved, sessionMemmoveBoundedSpec, + sessionMemmoveSpec, stackAt] at hpost ⊢ simp only [ProofLib.memRegion_zero, sepConj_emp] at hpost ac_nf at hpost ⊢ @@ -127,7 +131,7 @@ theorem statesPlacedSeams_of_hooks_sat [LibsignalPlacement] [HkdfPlacedHooksExactBudgetSat F (Rust.withPanics ext)] (hA : RecvCt2PlacedAlloc M A lim ext) (hmemmove0 : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec 0))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hval_pk : HookSat (Rust.withPanics ext) "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes" diff --git a/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/Adapters.lean b/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/Adapters.lean index 654a15763..e549a3686 100644 --- a/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/Adapters.lean +++ b/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/Adapters.lean @@ -203,9 +203,6 @@ structure Stage2ContractsA0Placed [LibsignalPlacement] (H : LibsignalHooks) : Pr memcpyROX : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], subroutine_ok callerProg (lsρ "memcpy") (withLsCl lsmpl sessionMemcpyROXSpec) - memmove : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], - subroutine_ok callerProg (lsρ "memmove") - (withLsCl lsmpl (sessionMemmoveSpec CryptoVerification.LibsignalTripleRatchet.extHookStack)) memset : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], subroutine_ok callerProg (lsρ "memset") (withLsCl lsmpl (sessionMemsetSpec CryptoVerification.LibsignalTripleRatchet.extHookStack)) @@ -233,8 +230,6 @@ theorem Stage2ContractsA0Placed.of_block0 [LibsignalPlacement] {H : LibsignalHoo (withLsCodeLoaded lsmpl (sessionMemcpySpec CryptoVerification.LibsignalTripleRatchet.extHookStack))) (hmemcpyROX : subroutine_ok blk0Prog (lsρ "memcpy") (withLsCodeLoaded lsmpl sessionMemcpyROXSpec)) - (hmemmove : subroutine_ok blk0Prog (lsρ "memmove") - (withLsCodeLoaded lsmpl (sessionMemmoveSpec CryptoVerification.LibsignalTripleRatchet.extHookStack))) (hmemset : subroutine_ok blk0Prog (lsρ "memset") (withLsCodeLoaded lsmpl (sessionMemsetSpec CryptoVerification.LibsignalTripleRatchet.extHookStack))) (hbcmp : subroutine_ok blk0Prog (lsρ "bcmp") @@ -249,7 +244,6 @@ theorem Stage2ContractsA0Placed.of_block0 [LibsignalPlacement] {H : LibsignalHoo shim := ls_subroutine_ok_cl_of_callee (j := 0) hshim memcpy := ls_subroutine_ok_cl_of_callee (j := 0) hmemcpy memcpyROX := ls_subroutine_ok_cl_of_callee (j := 0) hmemcpyROX - memmove := ls_subroutine_ok_cl_of_callee (j := 0) hmemmove memset := ls_subroutine_ok_cl_of_callee (j := 0) hmemset bcmp := ls_subroutine_ok_cl_of_callee (j := 0) hbcmp panic_handle_error := hpan_err @@ -264,8 +258,6 @@ theorem Stage2ContractsA0Placed.of_hooks [LibsignalPlacement] {H : LibsignalHook (hmemcpy : HookSat H "memcpy" (sessionMemcpySpec CryptoVerification.LibsignalTripleRatchet.extHookStack)) (hmemcpyROX : HookSat H "memcpy" sessionMemcpyROXSpec) - (hmemmove : HookSat H "memmove" - (sessionMemmoveSpec CryptoVerification.LibsignalTripleRatchet.extHookStack)) (hmemset : HookSat H "memset" (sessionMemsetSpec CryptoVerification.LibsignalTripleRatchet.extHookStack)) (hbcmp : HookSat H "bcmp" CryptoVerification.E2E.HooksE.e2eBcmpSpec) @@ -291,7 +283,6 @@ theorem Stage2ContractsA0Placed.of_hooks [LibsignalPlacement] {H : LibsignalHook exact subroutine_ok_withLsCl_withHookStack_mono (by decide) (by decide) h0 memcpy := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemcpy) memcpyROX := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemcpyROX) - memmove := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemmove) memset := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemset) bcmp := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hbcmp) panic_handle_error := hpan_err diff --git a/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/AdaptersBudget.lean b/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/AdaptersBudget.lean index 01169138b..a6b023f48 100644 --- a/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/AdaptersBudget.lean +++ b/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/AdaptersBudget.lean @@ -39,7 +39,7 @@ open CryptoVerification ( ) open CryptoVerification.LibsignalTripleRatchet ( extHookStack sessionShimSpec sessionMemcpySpec sessionMemcpyROXSpec - sessionMemmoveSpec sessionMemsetSpec + sessionMemsetSpec ls_hook_ok_of_caller ls_subroutine_ok_cl_of_plain_prog ls_subroutine_ok_cl_of_callee ) open Proofs.libsignal.Hooks2 ( @@ -191,9 +191,6 @@ structure Stage2ContractsPlaced [LibsignalPlacement] {M : AllocCostModel} memcpyROX : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], subroutine_ok callerProg (lsρ "memcpy") (withLsCl lsmpl (withVmPreserved sessionMemcpyROXSpec)) - memmove : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], - subroutine_ok callerProg (lsρ "memmove") - (withLsCl lsmpl (withVmPreserved (sessionMemmoveSpec extHookStack))) memset : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], subroutine_ok callerProg (lsρ "memset") (withLsCl lsmpl (withVmPreserved (sessionMemsetSpec extHookStack))) @@ -231,8 +228,6 @@ theorem Stage2ContractsPlaced.of_block0 [LibsignalPlacement] {M : AllocCostModel (withLsCodeLoaded lsmpl (withVmPreserved (sessionMemcpySpec extHookStack)))) (hmemcpyROX : subroutine_ok blk0Prog (lsρ "memcpy") (withLsCodeLoaded lsmpl (withVmPreserved sessionMemcpyROXSpec))) - (hmemmove : subroutine_ok blk0Prog (lsρ "memmove") - (withLsCodeLoaded lsmpl (withVmPreserved (sessionMemmoveSpec extHookStack)))) (hmemset : subroutine_ok blk0Prog (lsρ "memset") (withLsCodeLoaded lsmpl (withVmPreserved (sessionMemsetSpec extHookStack)))) (hbcmp : subroutine_ok blk0Prog (lsρ "bcmp") @@ -247,7 +242,6 @@ theorem Stage2ContractsPlaced.of_block0 [LibsignalPlacement] {M : AllocCostModel shim := ls_subroutine_ok_cl_of_callee (j := 0) hshim memcpy := ls_subroutine_ok_cl_of_callee (j := 0) hmemcpy memcpyROX := ls_subroutine_ok_cl_of_callee (j := 0) hmemcpyROX - memmove := ls_subroutine_ok_cl_of_callee (j := 0) hmemmove memset := ls_subroutine_ok_cl_of_callee (j := 0) hmemset bcmp := ls_subroutine_ok_cl_of_callee (j := 0) hbcmp panic_handle_error := hpan_err @@ -262,7 +256,6 @@ theorem Stage2ContractsPlaced.of_hooks [LibsignalPlacement] {M : AllocCostModel} (hshim : HookSat H lsRustNoAllocShimSym (withVmPreserved sessionShimSpec)) (hmemcpy : HookSat H "memcpy" (withVmPreserved (sessionMemcpySpec extHookStack))) (hmemcpyROX : HookSat H "memcpy" (withVmPreserved sessionMemcpyROXSpec)) - (hmemmove : HookSat H "memmove" (withVmPreserved (sessionMemmoveSpec extHookStack))) (hmemset : HookSat H "memset" (withVmPreserved (sessionMemsetSpec extHookStack))) (hbcmp : HookSat H "bcmp" e2eBcmpSpec) (hpan_err : H lsHandleErrorSym = some Rust.panicked) @@ -291,7 +284,6 @@ theorem Stage2ContractsPlaced.of_hooks [LibsignalPlacement] {M : AllocCostModel} exact subroutine_ok_withLsCl_withHookStack_mono (by decide) (by decide) h0 memcpy := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemcpy) memcpyROX := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemcpyROX) - memmove := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemmove) memset := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemset) bcmp := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hbcmp) panic_handle_error := hpan_err @@ -324,9 +316,6 @@ structure Stage2NoOomContractsPlaced [LibsignalPlacement] {M : AllocCostModel} memcpyROX : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], subroutine_ok callerProg (lsρ "memcpy") (withLsCl lsmpl (withVmPreserved sessionMemcpyROXSpec)) - memmove : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], - subroutine_ok callerProg (lsρ "memmove") - (withLsCl lsmpl (withVmPreserved (sessionMemmoveSpec extHookStack))) memset : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], subroutine_ok callerProg (lsρ "memset") (withLsCl lsmpl (withVmPreserved (sessionMemsetSpec extHookStack))) @@ -364,8 +353,6 @@ theorem Stage2NoOomContractsPlaced.of_block0 [LibsignalPlacement] {M : AllocCost (withLsCodeLoaded lsmpl (withVmPreserved (sessionMemcpySpec extHookStack)))) (hmemcpyROX : subroutine_ok blk0Prog (lsρ "memcpy") (withLsCodeLoaded lsmpl (withVmPreserved sessionMemcpyROXSpec))) - (hmemmove : subroutine_ok blk0Prog (lsρ "memmove") - (withLsCodeLoaded lsmpl (withVmPreserved (sessionMemmoveSpec extHookStack)))) (hmemset : subroutine_ok blk0Prog (lsρ "memset") (withLsCodeLoaded lsmpl (withVmPreserved (sessionMemsetSpec extHookStack)))) (hbcmp : subroutine_ok blk0Prog (lsρ "bcmp") @@ -380,7 +367,6 @@ theorem Stage2NoOomContractsPlaced.of_block0 [LibsignalPlacement] {M : AllocCost shim := ls_subroutine_ok_cl_of_callee (j := 0) hshim memcpy := ls_subroutine_ok_cl_of_callee (j := 0) hmemcpy memcpyROX := ls_subroutine_ok_cl_of_callee (j := 0) hmemcpyROX - memmove := ls_subroutine_ok_cl_of_callee (j := 0) hmemmove memset := ls_subroutine_ok_cl_of_callee (j := 0) hmemset bcmp := ls_subroutine_ok_cl_of_callee (j := 0) hbcmp panic_handle_error := hpan_err @@ -395,7 +381,6 @@ theorem Stage2NoOomContractsPlaced.of_hooks [LibsignalPlacement] {M : AllocCostM (hshim : HookSat H lsRustNoAllocShimSym (withVmPreserved sessionShimSpec)) (hmemcpy : HookSat H "memcpy" (withVmPreserved (sessionMemcpySpec extHookStack))) (hmemcpyROX : HookSat H "memcpy" (withVmPreserved sessionMemcpyROXSpec)) - (hmemmove : HookSat H "memmove" (withVmPreserved (sessionMemmoveSpec extHookStack))) (hmemset : HookSat H "memset" (withVmPreserved (sessionMemsetSpec extHookStack))) (hbcmp : HookSat H "bcmp" e2eBcmpSpec) (hpan_err : H lsHandleErrorSym = some Rust.panicked) @@ -427,7 +412,6 @@ theorem Stage2NoOomContractsPlaced.of_hooks [LibsignalPlacement] {M : AllocCostM exact subroutine_ok_withLsCl_withHookStack_mono (by decide) (by decide) h0 memcpy := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemcpy) memcpyROX := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemcpyROX) - memmove := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemmove) memset := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemset) bcmp := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hbcmp) panic_handle_error := hpan_err diff --git a/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/DoReserveExt.lean b/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/DoReserveExt.lean index ff289a3f5..24fc26a35 100644 --- a/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/DoReserveExt.lean +++ b/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/DoReserveExt.lean @@ -737,7 +737,6 @@ theorem allocContractsPlaced_of_stage2ContractsA0Placed [LibsignalPlacement] {H stackAt_externStack_split_allocHookStack'] at hpost ⊢ exact Satisfies.mono (Entails.of_eq (by ac_rfl)) hpost shim := hC.shim - session_memmove := hC.memmove panic_handle_error := hC.panic_handle_error panic_handle_alloc_error := hC.panic_handle_alloc_error diff --git a/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/DoReserveExtBudget.lean b/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/DoReserveExtBudget.lean index 78faf65b2..543103465 100644 --- a/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/DoReserveExtBudget.lean +++ b/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/DoReserveExtBudget.lean @@ -63,7 +63,7 @@ open LibsignalBinary.Heap.IfaceBudgetLemmas ( ) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget ( - sessionShimBudgetSpec sessionMemmoveBudgetSpec + sessionShimBudgetSpec ) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( FinishGrowEnv finishGrowEvents fitsEnv_finishGrow_iff reserveCap session2ShimBudgetSpecX @@ -205,7 +205,6 @@ theorem allocContractsPlaced_of_stage2ContractsPlaced [LibsignalPlacement] {M : rw [sepConj_assoc, sepConj_assoc, satisfies_pure_sepConj, satisfies_pure_sepConj] at hpost rw [sepConj_assoc, satisfies_pure_sepConj] exact ⟨⟨hpost.2.1, hpost.1⟩, hpost.2.2⟩ - session_memmove := hC.memmove /-! ## Block `13` (`do_reserve_and_handle`) verification -/ diff --git a/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/SerDefsX.lean b/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/SerDefsX.lean index f59f0c790..a916bcd7e 100644 --- a/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/SerDefsX.lean +++ b/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/SerDefsX.lean @@ -467,7 +467,7 @@ section Placed set_option maxRecDepth 2000000 /-- Relocatable `[LibsignalPlacement]` counterpart of `SerContractsX`: -allocator / shim / memmove / panic contracts (`Stage1X.AllocContractsPlaced`, at `extHookStack`) +allocator / shim / panic contracts (`Stage1X.AllocContractsPlaced`, at `extHookStack`) plus owned-source `memcpy` (`sessionMemcpySpec extHookStack`). -/ structure SerContractsXPlaced [LibsignalPlacement] (A : RustAlloc) (H : LibsignalHooks) : Prop where alloc : Stage1X.AllocContractsPlaced A H @@ -486,14 +486,12 @@ theorem SerContractsXPlaced.of_block0 [LibsignalPlacement] {A : RustAlloc} {H : (withLsCodeLoaded lsmpl (Proofs.libsignal.Stage1X.rustReallocExternSpecWithStack A Stage1X.extHookStack))) (hshim : subroutine_ok blk0Prog (lsρ lsRustNoAllocShimSym) (withLsCodeLoaded lsmpl Proofs.libsignal.Stage1X.session2ShimSpecX)) - (hmemmove : subroutine_ok blk0Prog (lsρ "memmove") - (withLsCodeLoaded lsmpl (sessionMemmoveSpec Stage1X.extHookStack))) (hmemcpy : subroutine_ok blk0Prog (lsρ lsMemcpySym) (withLsCodeLoaded lsmpl (sessionMemcpySpec CryptoVerification.LibsignalTripleRatchet.extHookStack))) (hpan_err : H lsHandleErrorSym = some Rust.panicked) (hpan_alloc : H "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" = some Rust.panicked) : SerContractsXPlaced A H where - alloc := Stage1X.AllocContractsPlaced.of_block0 halloc hdealloc hrealloc hshim hmemmove hpan_err hpan_alloc + alloc := Stage1X.AllocContractsPlaced.of_block0 halloc hdealloc hrealloc hshim hpan_err hpan_alloc memcpy := ls_subroutine_ok_cl_of_callee (j := 0) hmemcpy /-- Construct `SerContractsXPlaced A H` from `HookSat H` single-step hooks. -/ @@ -502,12 +500,11 @@ theorem SerContractsXPlaced.of_hooks [LibsignalPlacement] {A : RustAlloc} {H : L (hdealloc : HookSat H lsRustDeallocSym (rustDeallocSpec A)) (hrealloc : HookSat H lsRustReallocSym (rustReallocSpec A)) (hshim : HookSat H lsRustNoAllocShimSym sessionShimSpec) - (hmemmove : HookSat H "memmove" (sessionMemmoveSpec Stage1X.extHookStack)) (hmemcpy : HookSat H lsMemcpySym (sessionMemcpySpec CryptoVerification.LibsignalTripleRatchet.extHookStack)) (hpan_err : H lsHandleErrorSym = some Rust.panicked) (hpan_alloc : H "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" = some Rust.panicked) : SerContractsXPlaced A H where - alloc := Stage1X.AllocContractsPlaced.of_hooks halloc hdealloc hrealloc hshim hmemmove hpan_err hpan_alloc + alloc := Stage1X.AllocContractsPlaced.of_hooks halloc hdealloc hrealloc hshim hpan_err hpan_alloc memcpy := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemcpy) theorem serContractsXPlaced_of_stage2ContractsA0Placed [LibsignalPlacement] {H : LibsignalHooks} diff --git a/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/SerDefsXBudget.lean b/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/SerDefsXBudget.lean index 4b9581fbe..5bbf806af 100644 --- a/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/SerDefsXBudget.lean +++ b/LibsignalBinary/Proofs/SessionRecordAt/Hooks2/SerDefsXBudget.lean @@ -73,7 +73,7 @@ open LibsignalBinary.Heap.IfaceBudgetLemmas ( rustCliAllocNoOomSpecWithStack rustCliReallocNoOomExternSpecWithStack ) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget ( - sessionShimBudgetSpec sessionMemcpyBudgetSpec sessionMemmoveBudgetSpec + sessionShimBudgetSpec sessionMemcpyBudgetSpec ) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (session2ShimBudgetSpecX) open LibsignalBinary.Proofs.E2E.Record.Serialization.DefsBudget ( @@ -256,7 +256,7 @@ def serializeCanonSpecX (M : AllocCostModel) (A : RustCliAllocBudget M) /-! ## Relocatable `[LibsignalPlacement]` stub contracts (`SerContractsXPlaced`) -/ /-- Relocatable budget-threaded `[LibsignalPlacement]` counterpart of `SerContractsX`: -allocator / `shim` / `memmove` (`AllocContractsPlaced M A lim H` at `extHookStack`) plus +allocator / `shim` (`AllocContractsPlaced M A lim H` at `extHookStack`) plus `VmPreserved`-preserving owned-source `memcpy` (`sessionMemcpyBudgetSpec extHookStack`). -/ structure SerContractsXPlaced [LibsignalPlacement] (M : AllocCostModel) (A : RustCliAllocBudget M) (lim : BudgetLimits) (H : LibsignalHooks) : Prop where @@ -277,12 +277,10 @@ theorem SerContractsXPlaced.of_block0 [LibsignalPlacement] {M : AllocCostModel} (withLsCodeLoaded lsmpl (rustCliReallocBudgetExternSpecWithStack M A lim extHookStack))) (hshim : subroutine_ok blk0Prog (lsρ lsRustNoAllocShimSym) (withLsCodeLoaded lsmpl session2ShimBudgetSpecX)) - (hmemmove : subroutine_ok blk0Prog (lsρ "memmove") - (withLsCodeLoaded lsmpl (sessionMemmoveBudgetSpec extHookStack))) (hmemcpy : subroutine_ok blk0Prog (lsρ lsMemcpySym) (withLsCodeLoaded lsmpl (sessionMemcpyBudgetSpec extHookStack))) : SerContractsXPlaced M A lim H where - alloc := AllocContractsPlaced.of_block0 halloc hdealloc hrealloc hshim hmemmove + alloc := AllocContractsPlaced.of_block0 halloc hdealloc hrealloc hshim memcpy := ls_subroutine_ok_cl_of_callee (j := 0) hmemcpy /-- Construct `SerContractsXPlaced M A lim H` from `HookSat H` single-step hooks. -/ @@ -292,10 +290,9 @@ theorem SerContractsXPlaced.of_hooks [LibsignalPlacement] {M : AllocCostModel} (hdealloc : HookSat H lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hrealloc : HookSat H lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hshim : HookSat H lsRustNoAllocShimSym sessionShimBudgetSpec) - (hmemmove : HookSat H "memmove" (sessionMemmoveBudgetSpec extHookStack)) (hmemcpy : HookSat H lsMemcpySym (sessionMemcpyBudgetSpec extHookStack)) : SerContractsXPlaced M A lim H where - alloc := AllocContractsPlaced.of_hooks halloc hdealloc hrealloc hshim hmemmove + alloc := AllocContractsPlaced.of_hooks halloc hdealloc hrealloc hshim memcpy := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemcpy) theorem serContractsXPlaced_of_stage2ContractsPlaced [LibsignalPlacement] {M : AllocCostModel} diff --git a/LibsignalBinary/Proofs/SessionRecordAt/Stage1X/GrowOneX.lean b/LibsignalBinary/Proofs/SessionRecordAt/Stage1X/GrowOneX.lean index fef218a8d..baebfec2f 100644 --- a/LibsignalBinary/Proofs/SessionRecordAt/Stage1X/GrowOneX.lean +++ b/LibsignalBinary/Proofs/SessionRecordAt/Stage1X/GrowOneX.lean @@ -907,7 +907,7 @@ open Proofs.libsignal.Hooks2 (subroutine_ok_withLsCodeLoaded_map' subroutine_ok_withLsCl_map' subroutine_ok_withLsCl_withHookStack_mono subroutine_ok_withExternStackFromAlloc') -/-- Relocatable contract-form allocator + `memmove` + panic bundle at `extHookStack = 16384`. -/ +/-- Relocatable contract-form allocator + `shim` + panic bundle at `extHookStack = 16384`. -/ structure AllocContractsPlaced [LibsignalPlacement] (A : RustAlloc) (H : LibsignalHooks) : Prop where alloc : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], subroutine_ok callerProg (lsρ lsRustAllocSym) (withLsCl lsmpl (Proofs.libsignal.Stage1X.rustAllocSpecWithStack A extHookStack)) @@ -917,8 +917,6 @@ structure AllocContractsPlaced [LibsignalPlacement] (A : RustAlloc) (H : Libsign subroutine_ok callerProg (lsρ lsRustReallocSym) (withLsCl lsmpl (Proofs.libsignal.Stage1X.rustReallocExternSpecWithStack A extHookStack)) shim : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], subroutine_ok callerProg (lsρ lsRustNoAllocShimSym) (withLsCl lsmpl Proofs.libsignal.Stage1X.session2ShimSpecX) - session_memmove : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], - subroutine_ok callerProg (lsρ "memmove") (withLsCl lsmpl (sessionMemmoveSpec extHookStack)) panic_handle_error : H lsHandleErrorSym = some Rust.panicked panic_handle_alloc_error : H "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" = some Rust.panicked @@ -928,18 +926,16 @@ theorem AllocContractsPlaced.of_block0 [LibsignalPlacement] {A : RustAlloc} {H : (hdealloc : subroutine_ok blk0Prog (lsρ lsRustDeallocSym) (withLsCodeLoaded lsmpl (Proofs.libsignal.Stage1X.rustDeallocExternSpecWithStack A extHookStack))) (hrealloc : subroutine_ok blk0Prog (lsρ lsRustReallocSym) (withLsCodeLoaded lsmpl (Proofs.libsignal.Stage1X.rustReallocExternSpecWithStack A extHookStack))) (hshim : subroutine_ok blk0Prog (lsρ lsRustNoAllocShimSym) (withLsCodeLoaded lsmpl Proofs.libsignal.Stage1X.session2ShimSpecX)) - (hmemmove : subroutine_ok blk0Prog (lsρ "memmove") (withLsCodeLoaded lsmpl (sessionMemmoveSpec extHookStack))) (hpan_err : H lsHandleErrorSym = some Rust.panicked) (hpan_alloc : H "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" = some Rust.panicked) : AllocContractsPlaced A H := ⟨ls_subroutine_ok_cl_of_callee (j := 0) halloc, ls_subroutine_ok_cl_of_callee (j := 0) hdealloc, ls_subroutine_ok_cl_of_callee (j := 0) hrealloc, ls_subroutine_ok_cl_of_callee (j := 0) hshim, - ls_subroutine_ok_cl_of_callee (j := 0) hmemmove, hpan_err, hpan_alloc⟩ + hpan_err, hpan_alloc⟩ /-- Construct `AllocContractsPlaced A H` from `HookSat H` single-step hooks via `stackAt_split_bottom` slack framing. -/ theorem AllocContractsPlaced.of_hooks [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} (halloc : HookSat H lsRustAllocSym (rustAllocSpec A)) (hdealloc : HookSat H lsRustDeallocSym (rustDeallocSpec A)) (hrealloc : HookSat H lsRustReallocSym (rustReallocSpec A)) (hshim : HookSat H lsRustNoAllocShimSym sessionShimSpec) - (hmemmove : HookSat H "memmove" (sessionMemmoveSpec extHookStack)) (hpan_err : H lsHandleErrorSym = some Rust.panicked) (hpan_alloc : H "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" = some Rust.panicked) : AllocContractsPlaced A H where alloc := fun {callerProg callerBlk _} => by @@ -967,7 +963,6 @@ theorem AllocContractsPlaced.of_hooks [LibsignalPlacement] {A : RustAlloc} {H : · dsimp only [Spec.withHookStack] at hpre; exact Satisfies.mono (Entails.of_eq (by ac_rfl)) hpre · dsimp only [Spec.withHookStack]; exact Satisfies.mono (Entails.of_eq (by ac_rfl)) hpost exact subroutine_ok_withLsCl_withHookStack_mono (by decide) (by decide) h0 - session_memmove := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemmove) panic_handle_error := hpan_err panic_handle_alloc_error := hpan_alloc diff --git a/LibsignalBinary/Proofs/SessionRecordAt/Stage1X/GrowOneXBudget.lean b/LibsignalBinary/Proofs/SessionRecordAt/Stage1X/GrowOneXBudget.lean index 741b9f640..010fe81ac 100644 --- a/LibsignalBinary/Proofs/SessionRecordAt/Stage1X/GrowOneXBudget.lean +++ b/LibsignalBinary/Proofs/SessionRecordAt/Stage1X/GrowOneXBudget.lean @@ -81,7 +81,7 @@ open LibsignalBinary.Heap.IfaceBudgetLemmas ( ) open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (LsRetAddr624) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget ( - sessionShimBudgetSpec sessionMemmoveBudgetSpec + sessionShimBudgetSpec ) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( finishGrowEvents FinishGrowEnv fitsEnv_finishGrow_iff @@ -102,7 +102,7 @@ abbrev growOneChainName : String := Proofs.libsignal.Stage1X.growOneChainName /-! ## Budget-threaded `[LibsignalPlacement]` allocator contract bundle -/ -/-- Relocatable budget-threaded allocator + `shim` + `memmove` bundle at `extHookStack = 16384`. -/ +/-- Relocatable budget-threaded allocator + `shim` bundle at `extHookStack = 16384`. -/ structure AllocContractsPlaced [LibsignalPlacement] (M : AllocCostModel) (A : RustCliAllocBudget M) (lim : BudgetLimits) (H : LibsignalHooks) : Prop where alloc : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], @@ -117,9 +117,6 @@ structure AllocContractsPlaced [LibsignalPlacement] (M : AllocCostModel) shim : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], subroutine_ok callerProg (lsρ lsRustNoAllocShimSym) (withLsCl lsmpl session2ShimBudgetSpecX) - session_memmove : ∀ {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H], - subroutine_ok callerProg (lsρ "memmove") - (withLsCl lsmpl (sessionMemmoveBudgetSpec extHookStack)) /-- Construct `AllocContractsPlaced M A lim H` from block-0 `withLsCodeLoaded` contracts. -/ theorem AllocContractsPlaced.of_block0 [LibsignalPlacement] {M : AllocCostModel} @@ -132,15 +129,12 @@ theorem AllocContractsPlaced.of_block0 [LibsignalPlacement] {M : AllocCostModel} (hrealloc : subroutine_ok blk0Prog (lsρ lsRustReallocSym) (withLsCodeLoaded lsmpl (rustCliReallocBudgetExternSpecWithStack M A lim extHookStack))) (hshim : subroutine_ok blk0Prog (lsρ lsRustNoAllocShimSym) - (withLsCodeLoaded lsmpl session2ShimBudgetSpecX)) - (hmemmove : subroutine_ok blk0Prog (lsρ "memmove") - (withLsCodeLoaded lsmpl (sessionMemmoveBudgetSpec extHookStack))) : + (withLsCodeLoaded lsmpl session2ShimBudgetSpecX)) : AllocContractsPlaced M A lim H := ⟨ls_subroutine_ok_cl_of_callee (j := 0) halloc, ls_subroutine_ok_cl_of_callee (j := 0) hdealloc, ls_subroutine_ok_cl_of_callee (j := 0) hrealloc, - ls_subroutine_ok_cl_of_callee (j := 0) hshim, - ls_subroutine_ok_cl_of_callee (j := 0) hmemmove⟩ + ls_subroutine_ok_cl_of_callee (j := 0) hshim⟩ /-- Construct `AllocContractsPlaced M A lim H` from `HookSat H` single-step hooks. -/ theorem AllocContractsPlaced.of_hooks [LibsignalPlacement] {M : AllocCostModel} @@ -148,8 +142,7 @@ theorem AllocContractsPlaced.of_hooks [LibsignalPlacement] {M : AllocCostModel} (halloc : HookSat H lsRustAllocSym (rustCliAllocBudgetSpec M A lim false)) (hdealloc : HookSat H lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hrealloc : HookSat H lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) - (hshim : HookSat H lsRustNoAllocShimSym sessionShimBudgetSpec) - (hmemmove : HookSat H "memmove" (sessionMemmoveBudgetSpec extHookStack)) : + (hshim : HookSat H lsRustNoAllocShimSym sessionShimBudgetSpec) : AllocContractsPlaced M A lim H where alloc := ls_subroutine_ok_cl_of_plain_prog (subroutine_ok_rustCliAllocBudget_withStack (by decide) (by decide) (ls_hook_ok_of_caller halloc)) @@ -173,7 +166,6 @@ theorem AllocContractsPlaced.of_hooks [LibsignalPlacement] {M : AllocCostModel} rw [sepConj_assoc, sepConj_assoc, satisfies_pure_sepConj, satisfies_pure_sepConj] at hpost rw [sepConj_assoc, satisfies_pure_sepConj] exact ⟨⟨hpost.2.1, hpost.1⟩, hpost.2.2⟩ - session_memmove := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemmove) /-- `NoOom` specialization of `AllocContractsPlaced.alloc` at memory `m` with `LibsignalCodeLoaded`. -/ theorem AllocContractsPlaced.allocNoOom_call [LibsignalPlacement] {M : AllocCostModel} diff --git a/LibsignalBinary/Proofs/SessionRecordMin/Deserialize.lean b/LibsignalBinary/Proofs/SessionRecordMin/Deserialize.lean index 1eff05bf7..907c9a50a 100644 --- a/LibsignalBinary/Proofs/SessionRecordMin/Deserialize.lean +++ b/LibsignalBinary/Proofs/SessionRecordMin/Deserialize.lean @@ -858,12 +858,11 @@ theorem Stage2ContractsMinPlaced.of_hooks [LibsignalPlacement] {H : LibsignalHoo (hshim : HookSat H CryptoVerification.lsRustNoAllocShimSym sessionShimSpec) (hmemcpy : HookSat H "memcpy" (sessionMemcpySpec CryptoVerification.LibsignalTripleRatchet.extHookStack)) - (hmemmove : HookSat H "memmove" (sessionMemmoveSpec Stage1X.extHookStack)) (hpan_err : H CryptoVerification.lsHandleErrorSym = some Rust.panicked) (hpan_alloc : H "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" = some Rust.panicked) : Stage2ContractsMinPlaced H where alloc := Stage1X.AllocContractsPlaced.of_hooks - halloc hdealloc hrealloc hshim hmemmove hpan_err hpan_alloc + halloc hdealloc hrealloc hshim hpan_err hpan_alloc memcpy := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemcpy) /-- `SerContractsXPlaced` at `HooksE.A0` from `Stage2ContractsMinPlaced H`. -/ diff --git a/LibsignalBinary/Proofs/SessionRecordMin/DeserializeBudget.lean b/LibsignalBinary/Proofs/SessionRecordMin/DeserializeBudget.lean index 8baf6eab7..1e760e648 100644 --- a/LibsignalBinary/Proofs/SessionRecordMin/DeserializeBudget.lean +++ b/LibsignalBinary/Proofs/SessionRecordMin/DeserializeBudget.lean @@ -54,7 +54,7 @@ open LibsignalBinary.Heap.IfaceBudgetLemmas ( rustCliReallocBudgetExternSpecWithStack ) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget ( - sessionShimBudgetSpec sessionMemcpyBudgetSpec sessionMemmoveBudgetSpec + sessionShimBudgetSpec sessionMemcpyBudgetSpec ) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (session2ShimBudgetSpecX) open LibsignalBinary.Proofs.SessionRecordAt.Hooks2.AdaptersBudget (Stage2ContractsPlaced) @@ -71,7 +71,7 @@ open LibsignalBinary.Proofs.SessionRecordAt.Swarm.TRREF.B3DefsBudget ( /-- Minimal relocatable budget-threaded `[LibsignalPlacement]` contract bundle for `SessionRecord::deserialize` (and `SessionRecord::serialize`): -`AllocContractsPlaced M A lim H` (`alloc`, `dealloc`, `realloc`, `shim`, `memmove` at +`AllocContractsPlaced M A lim H` (`alloc`, `dealloc`, `realloc`, `shim` at `extHookStack`) plus `VmPreserved`-preserving owned-source `memcpy` at `extHookStack`. -/ structure Stage2ContractsMinPlaced [LibsignalPlacement] (M : AllocCostModel) (A : RustCliAllocBudget M) (lim : BudgetLimits) (H : LibsignalHooks) : Prop where @@ -93,11 +93,9 @@ theorem Stage2ContractsMinPlaced.of_block0 [LibsignalPlacement] {M : AllocCostMo (hshim : subroutine_ok blk0Prog (lsρ lsRustNoAllocShimSym) (withLsCodeLoaded lsmpl session2ShimBudgetSpecX)) (hmemcpy : subroutine_ok blk0Prog (lsρ lsMemcpySym) - (withLsCodeLoaded lsmpl (sessionMemcpyBudgetSpec extHookStack))) - (hmemmove : subroutine_ok blk0Prog (lsρ "memmove") - (withLsCodeLoaded lsmpl (sessionMemmoveBudgetSpec extHookStack))) : + (withLsCodeLoaded lsmpl (sessionMemcpyBudgetSpec extHookStack))) : Stage2ContractsMinPlaced M A lim H where - alloc := AllocContractsPlaced.of_block0 halloc hdealloc hrealloc hshim hmemmove + alloc := AllocContractsPlaced.of_block0 halloc hdealloc hrealloc hshim memcpy := ls_subroutine_ok_cl_of_callee (j := 0) hmemcpy /-- Construct `Stage2ContractsMinPlaced M A lim H` from `HookSat H` single-step budget hooks. -/ @@ -107,10 +105,9 @@ theorem Stage2ContractsMinPlaced.of_hooks [LibsignalPlacement] {M : AllocCostMod (hdealloc : HookSat H lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hrealloc : HookSat H lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hshim : HookSat H lsRustNoAllocShimSym sessionShimBudgetSpec) - (hmemcpy : HookSat H lsMemcpySym (sessionMemcpyBudgetSpec extHookStack)) - (hmemmove : HookSat H "memmove" (sessionMemmoveBudgetSpec extHookStack)) : + (hmemcpy : HookSat H lsMemcpySym (sessionMemcpyBudgetSpec extHookStack)) : Stage2ContractsMinPlaced M A lim H where - alloc := AllocContractsPlaced.of_hooks halloc hdealloc hrealloc hshim hmemmove + alloc := AllocContractsPlaced.of_hooks halloc hdealloc hrealloc hshim memcpy := ls_subroutine_ok_cl_of_plain_prog (ls_hook_ok_of_caller hmemcpy) /-- Forget the unused fields of `Stage2ContractsPlaced A lim H`. -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/AllocGhostLinkTransfer.lean b/LibsignalBinary/Proofs/SignalSession/Cli/AllocGhostLinkTransfer.lean index 294517623..1e9069832 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/AllocGhostLinkTransfer.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/AllocGhostLinkTransfer.lean @@ -86,23 +86,21 @@ open CryptoVerification.LibsignalTripleRatchet ( sessionMemsetRegionSpec sessionMemsetSpec sessionShim_hookOk ) open CryptoVerification.SignalSession ( - CliHooks cliExternsPlaced + CliHooks cliExternsPlaced cliPanicSymbolsPlaced lsAesDecSym lsAesEncSym lsFormatInnerSym lsFromUtf8Sym lsMemcpySym lsMemrchrSym lsMemsetSym lsReadFileSym lsReadStdinSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli lsStringCloneSym ) open CryptoVerification.SignalSession.Cli.MainHops ( - hookMemmove_fs hookNoop_fs + hookNoop_fs ) open CryptoVerification.SignalSession.Cli.RunGlue ( - FsTHooks IsFsC cliExternsPlaced_row cliGhostExterns_memcpy_some cliGhostExterns_memset_some + ExtraGhostTable FsTHooks IsFsC cliExtraGhostSyms cliGhostExternsWithExtra + cliGhostExterns_memcpy_some cliGhostExterns_memset_some fsTHooks_cliExternsPlaced fsTHooks_none fsT_externAt hookNoop_fsT panicked_fsT traceFsSound_of_fsTHooks ) -open CryptoVerification.SignalSession.Cli.Slots ( - memmove_row_placed -) open CryptoVerification.SignalSession.Cli.Store.PlacedCommon ( CliPanicHooksPlaced cliPanicHooksPlaced_cli ) @@ -153,10 +151,6 @@ open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget ( ) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( allocContractsFsPlaced_of_hookSat allocContractsXCliPlaced_of_hookSat - cliExternsPlaced_bcmp_budget_sat cliExternsPlaced_fromUtf8_budget_sat - cliExternsPlaced_memmove_budget_sat cliExternsPlaced_memrchr_budget_sat - cliExternsPlaced_noAllocShim_budget_sat - cliExternsPlaced_sessionMemmove_budget_sat cliExternsPlaced_shim_budget_sat cliGhostExterns_framelessMemcpy_budget_sat cliGhostExterns_memcpyRegionRO_budget_sat cliGhostExterns_memcpyRegion_budget_sat cliGhostExterns_memcpy_budget_sat cliGhostExterns_memsetRegion_budget_sat cliGhostExterns_memset_budget_sat @@ -2616,6 +2610,7 @@ export LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget CliGhostAllocHooks CliGhostSpqrAllocHooks ) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore (HookExactMemcpy) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (ExtraFullListSpecOk) /-- Construct `CliGhostSpqrAllocHooks` for a tuple of `linkedCallHook`s directly from `subroutine_ok` witnesses (`linkedGhostAllocEntries_thunks` + `linkedGhostAllocZeroed_thunk_ok`) and terminating @@ -2627,6 +2622,7 @@ theorem cliGhostSpqrAllocHooks_of_linked [LibsignalPlacement] {lim : BudgetLimits} {thunkAddrs : RustAllocAddrs} {allocZeroedAddr : BitVec 64} {fbAlloc fbDealloc fbRealloc fbAllocZeroed : State → State} + {extra : ExtraGhostTable} (hsvc_real : P_real.svc = Syscall.standard) (hsvc_sub : P_sub.svc = Syscall.standard) (hreal_no : ∀ pc, keep pc = true → P_real.externAt? pc = none) @@ -2673,7 +2669,8 @@ theorem cliGhostSpqrAllocHooks_of_linked [LibsignalPlacement] HookFsTraced IsFsC f) (hMemcpyExact : ∀ f, fMemcpy = some f → HookExactMemcpy f) (hMemsetAcp : ∀ f, fMemset = some f → - ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) : + ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) + (hExtraOk : ExtraFullListSpecOk extra) : let A := linkedGhostBudget allocLib allocMpl γ mmpl tp brkStart let spAlloc := rustCliAllocBudgetSpec fineCostModel A lim false let spDealloc := rustCliDeallocBudgetSpec fineCostModel A lim @@ -2687,7 +2684,8 @@ theorem cliGhostSpqrAllocHooks_of_linked [LibsignalPlacement] shim := hookNoop stringClone := strClone memset := fMemset - memcpy := fMemcpy } := by + memcpy := fMemcpy + extra := extra } := by dsimp only let A := linkedGhostBudget allocLib allocMpl γ mmpl tp brkStart have hEntriesP := hEntries.toPlaced @@ -2741,6 +2739,7 @@ theorem cliGhostSpqrAllocHooks_of_linked [LibsignalPlacement] memcpy := hMemcpy memcpy_exact := hMemcpyExact memset_acp := hMemsetAcp + extraOk := hExtraOk allocZeroed := linkedCallHook_ok hsvc_real hsvc_sub hreal_no hsub_no hZeroedP (specStripSInvariant_alloc allocLib allocMpl γ mmpl tp brkStart hKeepMallocng lim true) (specPreservesFsTrace_alloc A lim true) @@ -2759,7 +2758,7 @@ theorem fsTHooks_cliGhostExterns [LibsignalPlacement] {M : AllocCostModel} {A : (hBase : FsTHooks baseExt) : FsTHooks (cliGhostExterns g baseExt) := by intro sym f h - unfold cliGhostExterns at h + unfold cliGhostExterns cliGhostExternsWithExtra at h split at h · cases h; exact hG.alloc_fsT · split at h @@ -2794,7 +2793,17 @@ theorem fsTHooks_cliGhostExterns [LibsignalPlacement] {M : AllocCostModel} {A : · split at h · obtain ⟨fc, hfc, _, _, _, _, _, _, _, _, hfcT⟩ := hG.memcpy rw [hfc] at h; cases h; exact hfcT - · exact hBase sym f h + · cases hDom : cliExtraGhostSyms.contains sym + · rw [hDom] at h + simp only [Bool.false_eq_true, ↓reduceIte] at h + exact hBase sym f h + · rw [hDom] at h + simp only [↓reduceIte] at h + cases hex : g.extra.lookup sym with + | some fe => + rw [hex] at h; cases h; exact hG.extraOk.fsT sym f hDom hex + | none => + rw [hex] at h; exact hBase sym f h /-- `TraceFsSound` on any `IsLsBlockProg prog i (cliGhostExterns g baseExt)`. -/ theorem traceFsSound_lsProg_ghost [LibsignalPlacement] @@ -2820,12 +2829,6 @@ structure BaseHelperRows (mmpl : Obj.MultiPlacement) (W : CliHooks) (baseExt : L memrchr_eq : baseExt lsMemrchrSym = cliExternsPlaced mmpl W lsMemrchrSym panics : CliPanicHooksPlaced baseExt -theorem cliGhostExterns_memmove_eq (mmpl : Obj.MultiPlacement) (W : CliHooks) - {baseExt : LibsignalHooks} (g : CliGhostHooks) (hBase : BaseHelperRows mmpl W baseExt) : - cliGhostExterns g baseExt memmoveName = cliExternsPlaced mmpl W memmoveName := - (cliGhostExterns_other g baseExt (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans hBase.memmove_eq - theorem shim_budget_sat_of_eq (baseExt : LibsignalHooks) {g : CliGhostHooks} (hShim : g.shim = hookNoop) : HookSat (cliGhostExterns g baseExt) lsRustNoAllocShimSymCli sessionShimBudgetSpec := @@ -2853,13 +2856,17 @@ theorem cliGhostExterns_panics {baseExt : LibsignalHooks} (g : CliGhostHooks) have h8 : sym ≠ lsReadStdinSym := by intro he; subst he; exact nomatch hmem have h9 : sym ≠ lsMemsetSym := by intro he; subst he; exact nomatch hmem have h10 : sym ≠ lsMemcpySym := by intro he; subst he; exact nomatch hmem - rw [cliGhostExterns_other g baseExt h1 h2 h3 h4 h5 h6 h7 h8 h9 h10] + have hEx : cliExtraGhostSyms.contains sym = false := by + simp only [cliPanicSymbolsPlaced, List.mem_cons, List.not_mem_nil, or_false] at hmem + rcases hmem with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | + rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> decide + rw [cliGhostExterns_other g baseExt h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hEx)] exact hPan sym hmem theorem allocContractsXCliPlaced_of_ghost [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) (baseExt : LibsignalHooks) {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} - (g : CliGhostHooks) (hBase : BaseHelperRows mmpl W baseExt) + (g : CliGhostHooks) (_hBase : BaseHelperRows mmpl W baseExt) (hG : CliGhostAllocHooks M A lim g) : AllocContractsXCliPlaced A lim (cliGhostExterns g baseExt) := allocContractsXCliPlaced_of_hookSat @@ -2871,10 +2878,6 @@ theorem allocContractsXCliPlaced_of_ghost [LibsignalPlacement] (cliGhostExterns_sessionMemcpy_budget_sat baseExt hG) (cliGhostExterns_memcpyRegion_budget_sat baseExt hG) (cliGhostExterns_sessionMemcpyRegion_budget_sat baseExt hG) - (fun stk => hookSat_of_eq (cliGhostExterns_memmove_eq mmpl W g hBase) - (cliExternsPlaced_memmove_budget_sat mmpl W stk)) - (fun stk => hookSat_of_eq (cliGhostExterns_memmove_eq mmpl W g hBase) - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W stk)) (cliGhostExterns_memset_budget_sat baseExt hG) (cliGhostExterns_sessionMemset_budget_sat baseExt hG) (cliGhostExterns_memsetRegion_budget_sat baseExt hG) @@ -2883,7 +2886,7 @@ theorem allocContractsXCliPlaced_of_ghost [LibsignalPlacement] theorem allocContractsFsPlaced_of_ghost [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) (baseExt : LibsignalHooks) {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} - (g : CliGhostHooks) (hBase : BaseHelperRows mmpl W baseExt) + (g : CliGhostHooks) (_hBase : BaseHelperRows mmpl W baseExt) (hG : CliGhostAllocHooks M A lim g) : AllocContractsFsPlaced A lim (cliGhostExterns g baseExt) := by refine allocContractsFsPlaced_of_hookSat @@ -2896,10 +2899,6 @@ theorem allocContractsFsPlaced_of_ghost [LibsignalPlacement] (cliGhostExterns_memcpyRegion_budget_sat baseExt hG) (cliGhostExterns_sessionMemcpyRegion_budget_sat baseExt hG) (cliGhostExterns_memcpyRegionRO_budget_sat baseExt hG) - (fun stk => hookSat_of_eq (cliGhostExterns_memmove_eq mmpl W g hBase) - (cliExternsPlaced_memmove_budget_sat mmpl W stk)) - (fun stk => hookSat_of_eq (cliGhostExterns_memmove_eq mmpl W g hBase) - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W stk)) (cliGhostExterns_memset_budget_sat baseExt hG) (cliGhostExterns_sessionMemset_budget_sat baseExt hG) (cliGhostExterns_memsetRegion_budget_sat baseExt hG) @@ -2907,7 +2906,7 @@ theorem allocContractsFsPlaced_of_ghost [LibsignalPlacement] ?_ intro sym hmem f hf simp only [List.mem_cons, List.not_mem_nil, or_false] at hmem - rcases hmem with rfl | rfl | rfl | rfl | rfl | rfl | rfl + rcases hmem with rfl | rfl | rfl | rfl | rfl | rfl · rw [cliGhostExterns_alloc] at hf; cases hf; exact hG.alloc_fs · rw [cliGhostExterns_dealloc] at hf; cases hf; exact hG.dealloc_fs · rw [cliGhostExterns_realloc] at hf; cases hf; exact hG.realloc_fs @@ -2915,9 +2914,6 @@ theorem allocContractsFsPlaced_of_ghost [LibsignalPlacement] · obtain ⟨fc, hfc, _, _, _, _, _, _, _, hfs, _⟩ := hG.memcpy rw [cliGhostExterns_memcpy_some g baseExt hfc] at hf cases hf; exact hfs - · rw [cliGhostExterns_memmove_eq mmpl W g hBase, - cliExternsPlaced_row mmpl W (memmove_row_placed mmpl W)] at hf - cases hf; exact hookMemmove_fs · obtain ⟨fm, hfm, _, _, _, _, _, hfs, _⟩ := hG.memset rw [cliGhostExterns_memset_some g baseExt hfm] at hf cases hf; exact hfs @@ -2925,7 +2921,7 @@ theorem allocContractsFsPlaced_of_ghost [LibsignalPlacement] theorem stage2ContractsMinPlaced_of_ghost [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) (baseExt : LibsignalHooks) {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} - (g : CliGhostHooks) (hBase : BaseHelperRows mmpl W baseExt) + (g : CliGhostHooks) (_hBase : BaseHelperRows mmpl W baseExt) (hG : CliGhostAllocHooks M A lim g) : Stage2ContractsMinPlaced M A lim (cliGhostExterns g baseExt) := stage2ContractsMinPlaced_of_hookSat @@ -2934,8 +2930,6 @@ theorem stage2ContractsMinPlaced_of_ghost [LibsignalPlacement] ⟨g.realloc, cliGhostExterns_realloc g baseExt, hG.realloc⟩ (shim_budget_sat_of_eq baseExt hG.shim_eq) (cliGhostExterns_sessionMemcpy_budget_sat baseExt hG extHookStack) - (hookSat_of_eq (cliGhostExterns_memmove_eq mmpl W g hBase) - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W extHookStack)) theorem codecHooksPlaced_of_ghost [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) (baseExt : LibsignalHooks) {M : AllocCostModel} {A : RustCliAllocBudget M} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/CliElfProof.lean b/LibsignalBinary/Proofs/SignalSession/Cli/CliElfProof.lean index f0332f7a7..6a99ca5a6 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/CliElfProof.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/CliElfProof.lean @@ -27,7 +27,7 @@ set_option autoImplicit false **Checked by Lean. Untrusted (`Role::Proof`).** Discharges the concrete ELF parse, well-formedness, `brkStart`, segment geometry, and `CliElfMallocngLayout` obligations over the pinned from-source -stock `ld.lld` `libsignal-cli.elf` (`CliElf.cliElfBytes`, `617,448` B, SHA-256 `2f20c836…`) using +stock `ld.lld` `libsignal-cli.elf` (`CliElf.cliElfBytes`, `619,032` B, SHA-256 `50066cbd…`) using pure kernel reduction (`std3` axioms `{propext, Classical.choice, Quot.sound}` only; `0` `sorry`, `0` `native_decide`, `0` `bv_decide`). -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/CliExternsWitness.lean b/LibsignalBinary/Proofs/SignalSession/Cli/CliExternsWitness.lean index c52e08337..da3cc2759 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/CliExternsWitness.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/CliExternsWitness.lean @@ -67,7 +67,7 @@ theorem strlen_row (W : CliHooks) : ("strlen", strlenHook) ∈ cliHookTable W := List.mem_append_right _ (List.mem_of_getElem? (i := 9) rfl) theorem fromUtf8_row (W : CliHooks) : - ("core::str::converts::from_utf8", fromUtf8Hook W.utf8Err) ∈ cliHookTable W := + ("core::str::converts::from_utf8", fromUtf8Hook CryptoVerification.SignalSession.cliDefaultUtf8Err) ∈ cliHookTable W := List.mem_append_right _ (List.mem_of_getElem? (i := 15) rfl) theorem blackBox_row (W : CliHooks) : @@ -584,7 +584,7 @@ theorem hookMemset_fr : HookFr true hookMemset := by theorem hookMemcpy_fr : HookFr true hookMemcpy := by intro s; unfold hookMemcpy; fr_close theorem hookMemmove_fr : HookFr true hookMemmove := hookMemcpy_fr -theorem cliBcmpHook_fr : HookFr true (cliBcmpHook W.bcmp) := by +theorem cliBcmpHook_fr : HookFr true (cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp) := by intro s; unfold cliBcmpHook; fr_close theorem strlenHook_fr : HookFr true strlenHook := by intro s; unfold strlenHook unmodelled; fr_close @@ -598,7 +598,7 @@ theorem writeStdoutHook_fr : HookFr false writeStdoutHook := by intro s; unfold writeStdoutHook unitResult unmodelled; fr_close theorem memrchrHook_fr : HookFr true memrchrHook := by intro s; unfold memrchrHook unmodelled; fr_close -theorem fromUtf8Hook_fr : HookFr true (fromUtf8Hook W.utf8Err) := by +theorem fromUtf8Hook_fr : HookFr true (fromUtf8Hook CryptoVerification.SignalSession.cliDefaultUtf8Err) := by intro s; unfold fromUtf8Hook unmodelled; fr_close theorem stringCloneHook0_fr : HookFr true E2E.stringCloneHook0 := by intro s; unfold E2E.stringCloneHook0 E2E.returnFreshVecU8; fr_close @@ -698,8 +698,8 @@ theorem cliHookTable_fr (W : CliHooks) : HookFr.weak hookNoop_fr, HookFr.weak allocHook0_fr, HookFr.weak deallocHook_fr, HookFr.weak reallocHook0_fr, HookFr.weak allocZeroedHook0_fr, HookFr.weak hookMemset_fr, HookFr.weak hookMemmove_fr, - HookFr.weak hookMemcpy_fr, HookFr.weak (cliBcmpHook_fr W), HookFr.weak strlenHook_fr, - HookFr.weak readFileHook_fr, HookFr.weak memrchrHook_fr, HookFr.weak (fromUtf8Hook_fr W), + HookFr.weak hookMemcpy_fr, HookFr.weak cliBcmpHook_fr, HookFr.weak strlenHook_fr, + HookFr.weak readFileHook_fr, HookFr.weak memrchrHook_fr, HookFr.weak fromUtf8Hook_fr, HookFr.weak stringCloneHook0_fr, HookFr.weak fmtWriteHook0_fr, HookFr.weak formatInnerHook0_fr, HookFr.weak durationSinceExactHook_fr, HookFr.weak timeAddHook_fr, HookFr.weak blackBoxHook_fr, HookFr.weak (compress256Hook_fr W), @@ -783,7 +783,7 @@ theorem cliExterns_ok (W : CliHooks) : (fun _ _ => True) (fun _ => trivial) (Cli.MainHops.memrchrHook_ok extHookStack) (fun _ _ _ hp => hp) (fun _ _ _ _ _ _ hq => hq) (fun _ _ _ _ hq => hq) (fun _ _ _ _ _ hq => hq) (fun _ _ _ _ hq => hq)) - fromUtf8 := hookSat_row (fromUtf8_row W) (Cli.MainHops.fromUtf8Hook_ok extHookStack W.utf8Err) + fromUtf8 := hookSat_row (fromUtf8_row W) (Cli.MainHops.fromUtf8Hook_ok extHookStack CryptoVerification.SignalSession.cliDefaultUtf8Err) fmtWrite := hookSat_of_cliExterns (Cli.Slots.fmtWrite_row W) (Cli.Slots.cliExterns_fmtWrite W) formatInner := hookSat_of_cliExterns (Cli.Slots.formatInner_row W) (Cli.Slots.cliExterns_formatInner W) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectAuxPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectAuxPlacedBudget.lean index 6a31b9785..3c645e61a 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectAuxPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectAuxPlacedBudget.lean @@ -21,6 +21,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey. public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1Agree import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat import ProofLib.SepLogic.WPp import LibsignalBinary.Proofs.SignalSession.Cli.D3.Budget.D3BadKemP2TopPathAPlacedBudget import LibsignalBinary.Proofs.SignalSession.Cli.D3.Budget.D3BadKemP2TopPlacedBudget @@ -75,7 +76,7 @@ open CryptoVerification.SignalSession.Cli open CryptoVerification.SignalSession.Cli.MainHops (cliIo cliWrOk coinsInstalledPlaced storesAt) open CryptoVerification.SignalSession.Cli.RunCompose (DecPkGhost RunSem decResAt dpPollNeed) open CryptoVerification.SignalSession.Cli.RunGlue - (CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other) + (CliGhostHooks cliGhostExterns) open CryptoVerification.SignalSession.Cli.RunProofs (dpFutDoneAt) open CryptoVerification.SignalSession.Cli.RunProofs.Poll (LsTokenInit PathAEntryWords StageP1PostRegs calleeSavedPreserved_of_closure cliKitStk @@ -86,7 +87,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll signalMessageRestVerAt sp550P2V1RemAt spMidGapsAt sp_frame_sub_add stageP2PostP1At) open CryptoVerification.SignalSession.Cli.RunSkeleton (RunBudgets) open CryptoVerification.SignalSession.Cli.Slots - (EncodeInjOn FilesOkPeer blackBox_row_placed loadRec scopeIn scopeKit) + (EncodeInjOn FilesOkPeer loadRec scopeIn scopeKit) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FitsEnv FreeOnlyEvs RustCliAllocBudget SeqEnv) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) @@ -97,7 +98,7 @@ open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2DefsPlace open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Mid3PlacedBudget (P2Sub1To3Arm1Env P2Sub1To3Arm2Env P2Sub1To4Arm3Env P2Sub1To4Env P2Sub1To4OkEnv P2Sub4OkEnv) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget - (StageP2BaseCalleesPlaced4K.of_hooks isSameAccount_4k_placed_ok_on_stageP1) + (StageP2BaseCalleesPlaced4K.of_hooks) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Sub5DefsPlacedBudget (isSameAccountDistinctSpecExt_to_at_placed) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2V1PlacedBudget @@ -864,7 +865,7 @@ private theorem r20f_toSkeletonRunHooksPlaced [LibsignalPlacement] {M : AllocCos { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } private def r20a6w_dummyExtras : UnreachedPqxdhPrimitives := ⟨fun _ => [], fun _ _ _ => [], fun _ _ => [], fun _ _ => [], fun _ => ([], []), @@ -944,10 +945,8 @@ private theorem r20a6w_baseCalleesPlaced4K [LibsignalPlacement] hh.codecHooks.alloc hh.codecHooks.dealloc (r20a6w_hookSat_sessionMemcpyBudget allocHookStack hh.codecHooks.memcpy) - (isSameAccount_4k_placed_ok_on_stageP1 - ((cliGhostExterns_other gh _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W))) + (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat.isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) private theorem r20a6w_pureCalleesPlaced4K [LibsignalPlacement] @@ -1597,7 +1596,7 @@ private theorem r20a6w_stageP2_badKem_reject_body [LibsignalFullPlacement] have hPromMissAt := LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Over.StageP2DefsPlacedBudget.promoteMatchingMissAt_placed_of_gen (LibsignalBinary.Proofs.SignalSession.Cli.D3.Budget.D3PollRejectAuxPlacedBudget.cliPromoteMatchingMissGen_placed_d3 - A.repAlloc mmpl gh W) + A.repAlloc mmpl gh W hh.blackBox) y.fut g recG sess 4#8 (5#8 :: bytesToBv8 (mkBadKemHdr y.g.msg kp).ekAPk) (not_p2SessMatchesMsg_of_v4_badKem kp hv4 hnm) (by diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectAuxPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectAuxPlacedBudgetFd.lean index 8c029d94f..bdcc6e4bf 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectAuxPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectAuxPlacedBudgetFd.lean @@ -25,6 +25,7 @@ import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.St public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1Agree -- proof-setup: allow-public-import import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureCallees @@ -90,7 +91,7 @@ open CryptoVerification.SignalSession.Cli ( open CryptoVerification.SignalSession.Cli.MainHops (cliIo coinsInstalledPlaced storesAt) open CryptoVerification.SignalSession.Cli.RunCompose (DecPkGhost RunSem decResAt dpPollNeed) open CryptoVerification.SignalSession.Cli.RunGlue ( - CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other + CliGhostHooks cliGhostExterns ) open CryptoVerification.SignalSession.Cli.RunProofs (dpFutDoneAt) open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( @@ -103,7 +104,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( ) open CryptoVerification.SignalSession.Cli.RunSkeleton (RunBudgets) open CryptoVerification.SignalSession.Cli.Slots ( - EncodeInjOn FilesOkPeer blackBox_row_placed loadRec scopeIn scopeKit + EncodeInjOn FilesOkPeer loadRec scopeIn scopeKit ) open LibsignalBinary.Heap ( AllocCostModel AllocEvent BudgetLimits FitsEnv FreeOnlyEvs RustCliAllocBudget SeqEnv @@ -119,7 +120,7 @@ open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Mid3Place P2Sub1To4Arm3Env P2Sub1To4OkEnv P2Sub4OkEnv ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget ( - StageP2BaseCalleesPlaced4K.of_hooks isSameAccount_4k_placed_ok_on_stageP1 + StageP2BaseCalleesPlaced4K.of_hooks ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Sub5DefsPlacedBudget ( isSameAccountDistinctSpecExt_to_at_placed p2_stageP2bStack_le_bobV1 @@ -210,7 +211,7 @@ private theorem r20f_toSkeletonRunHooksPlaced [LibsignalPlacement] {M : AllocCos { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } private def r20a6w_dummyExtras : UnreachedPqxdhPrimitives := ⟨fun _ => [], fun _ _ _ => [], fun _ _ => [], fun _ _ => [], fun _ => ([], []), @@ -290,10 +291,8 @@ private theorem r20a6w_baseCalleesPlaced4K [LibsignalPlacement] hh.codecHooks.alloc hh.codecHooks.dealloc (r20a6w_hookSat_sessionMemcpyBudget allocHookStack hh.codecHooks.memcpy) - (isSameAccount_4k_placed_ok_on_stageP1 - ((cliGhostExterns_other gh _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W))) + (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat.isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) private theorem r20a6w_pureCalleesPlaced4K [LibsignalPlacement] @@ -935,7 +934,7 @@ private theorem r20a6w_stageP2_badKem_reject_body_of_kits [LibsignalFullPlacemen w.opkWord y.g.msg.baseKey B hfs1 have hPromMissAt := promoteMatchingMissAt_placed_of_gen - (cliPromoteMatchingMissGen_placed_d3 A.repAlloc mmpl gh W) + (cliPromoteMatchingMissGen_placed_d3 A.repAlloc mmpl gh W hh.blackBox) y.fut g recG sess 4#8 (5#8 :: bytesToBv8 (mkBadKemHdr y.g.msg kp).ekAPk) (not_p2SessMatchesMsg_of_v4_badKem kp hv4 hnm) (by diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectPlacedBudget.lean index fba866264..222dc49f5 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectPlacedBudget.lean @@ -118,7 +118,7 @@ private theorem toClosureRunHooksPlaced [LibsignalPlacement] {M : AllocCostModel { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } /-! ## 2. Poll Dispatch and Block-`520` Caller-Slot Reduction -/ @@ -258,7 +258,7 @@ private theorem r20m3_toSkeletonRunHooksPlaced [LibsignalPlacement] {M : AllocCo { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } private theorem r20m3_pollEnv_v3_sub [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {B : RunBudgets} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectPlacedBudgetFd.lean index 79dcff174..6ebd80916 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3BadKemRejectPlacedBudgetFd.lean @@ -125,7 +125,7 @@ private theorem toClosureRunHooksPlaced [LibsignalPlacement] {M : AllocCostModel { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } private theorem toSkeletonRunHooksPlaced [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : LibsignalHooks} @@ -135,7 +135,7 @@ private theorem toSkeletonRunHooksPlaced [LibsignalPlacement] {M : AllocCostMode { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } private theorem stageP2BadKemRejectEnv_nonempty [LibsignalPlacement] {A : CryptoVerification.RustHeap.RustAlloc} {B : RunBudgets} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3MatchingPathBKitsPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3MatchingPathBKitsPlacedBudgetFd.lean index 64d46cfa5..2a39a1080 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3MatchingPathBKitsPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3MatchingPathBKitsPlacedBudgetFd.lean @@ -83,7 +83,7 @@ open CryptoVerification.SignalSession.Cli.RunCompose ( DecPkGhost RunNeeds RunSem decResAt dpSlotArgsPlaced mkSlot slotOut slotTrace ) open CryptoVerification.SignalSession.Cli.RunGlue ( - CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other + CliGhostHooks cliGhostExterns ) open CryptoVerification.SignalSession.Cli.RunProofs (dpCxAt dpFutStartAt) open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( @@ -92,7 +92,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( ) open CryptoVerification.SignalSession.Cli.RunSkeleton (CalleeSlot.OkPlaced RunBudgets) open CryptoVerification.SignalSession.Cli.Slots ( - FilesOkPeer blackBox_row_placed scopeIn scopeKit + FilesOkPeer scopeIn scopeKit ) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FitsEnv RustCliAllocBudget) open LibsignalBinary.Proofs.PeakBudget.CliDpPollTrustedWideBridge (not_fitsEnv_top) @@ -132,7 +132,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.Stag cliPollIdBudgetEnv cliPollSessBudgetEnv cliPollSessSeqFreeBudgetEnv ) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Ratchet.DecryptLemmas.InnerInstPlacedBudgetFd ( - cliIdKitOkIE_of_dirGet cliSessKitOkSE_of_dirGet cliSessKitOkSE_seqFree_of_dirGet + cliIdKitOkIE_of_dirGet_sat cliSessKitOkSE_of_dirGet cliSessKitOkSE_seqFree_of_dirGet ) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Ratchet.DecryptLemmas.TopPlacedBudgetFd ( slotFramePlaced_withFds_enforced @@ -158,7 +158,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Store.SerSeqFreePlacedBudget ( serializeCanonSeqFree_placed_ok_of_serContractsX ) -/-! ## 1. `RunHooksPlaced` Bridge & `blackBox` Row Lookup -/ +/-! ## 1. `RunHooksPlaced` Bridge -/ theorem toSkeletonRunHooks [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : LibsignalHooks} @@ -167,16 +167,7 @@ theorem toSkeletonRunHooks [LibsignalPlacement] {M : AllocCostModel} { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } - -private theorem cliGhostExterns_blackBox_row (mmpl : Obj.MultiPlacement) - (gh : CliGhostHooks) (W : CliHooks) : - cliGhostExterns gh (cliExternsPlaced mmpl W) CryptoVerification.lsBlackBoxU8Sym = - some CryptoVerification.LibsignalSession.blackBoxHook := - (cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W)) + formatInner := hh.formatInner, blackBox := hh.blackBox } /-- Discharges the unused `_hread` hypothesis in `StageP2MatchedFramedCliPlacedStmt` (where `StageP2Matched` performs zero `read_file` calls and `ReadEnv` appears nowhere else in the @@ -243,7 +234,7 @@ theorem cliPollId_kitPlacedOkI_untrusted_of_dirGet [LibsignalPlacement] A.repAlloc F0 peer B ReadEnv) (cliGhostExterns gh (cliExternsPlaced mmpl W)) := cliIdKitPlacedOkI_full - (cliIdKitOkIE_of_dirGet hDropNz hh hGet (cliGhostExterns_blackBox_row mmpl gh W) + (cliIdKitOkIE_of_dirGet_sat hDropNz hh hGet hh.blackBox (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _)) theorem cliPollSess_kitPlacedOkSE_of_dirGet [LibsignalPlacement] {M : AllocCostModel} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3MatchingPathBPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3MatchingPathBPlacedBudget.lean index bf5360b97..06a51e853 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3MatchingPathBPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3MatchingPathBPlacedBudget.lean @@ -65,7 +65,7 @@ open CryptoVerification.LibsignalTripleRatchetRepr (AddrGhost SessionGhost uuidT open CryptoVerification.RustHeap (RustAlloc) open CryptoVerification.SignalSession (CliHooks CliPqxdhInputs Inputs PqParty PqxdhPartyInSpecDomain cliExternsPlaced - isCliPanicSymbolPlaced lsReadFileSym observe pqRecvInputs pqxdhExpectedOutcome) + lsReadFileSym observe pqRecvInputs pqxdhExpectedOutcome) open CryptoVerification.SignalSession.Cli (CommitOk MainResult StoresGhost cliStaticsPlaced) open CryptoVerification.SignalSession.Cli.MainHops (AddrV CallV RunCall cliIo cliMainStk cliRunBudgets_placed cliWrOk @@ -73,7 +73,8 @@ open CryptoVerification.SignalSession.Cli.MainHops open CryptoVerification.SignalSession.Cli.Run.Placed (lsProg_579) open CryptoVerification.SignalSession.Cli.RunCompose (DecPkGhost RunNeeds RunSem addrValOf dpPollNeed mkSlot runAns runFiles runRel) -open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns cliGhostExterns_other) +open CryptoVerification.SignalSession.Cli.RunGlue + (CliGhostHooks cliGhostExterns withPanics_cliGhostExterns) open CryptoVerification.SignalSession.Cli.RunProofs (DecPkOk₀ SessMatchesPm cliDecryptPrekeyNeed commitOk_pqRecvPrekey_decPkDef decPkDef dpWrapFrame) @@ -147,31 +148,13 @@ private theorem toSkeletonRunHooks [LibsignalPlacement] {M : AllocCostModel} { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } private theorem withPanics_cliGhostExterns_eq (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : Rust.withPanics (cliGhostExterns gh (cliExternsPlaced mmpl W)) = - cliGhostExterns gh (cliExternsPlaced mmpl W) := by - funext name - by_cases hp : Rust.isPanicSymbol name = true - · have hother : cliGhostExterns gh (cliExternsPlaced mmpl W) name = cliExternsPlaced mmpl W name := - cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustDeallocSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustReallocSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocZeroedSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustNoAllocShimSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsReadFileSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsReadStdinSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemsetSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemcpySym] at hp) - unfold Rust.withPanics - rw [hother] - unfold cliExternsPlaced isCliPanicSymbolPlaced - simp [hp] - · simp [Rust.withPanics, hp] + cliGhostExterns gh (cliExternsPlaced mmpl W) := + withPanics_cliGhostExterns mmpl gh W /-! ## 1. Matching-Session Path-B Semantics (`cliRunSemPathB`, `cliRunSemPathBFull`) & Envelopes -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3MatchingPathBPollPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3MatchingPathBPollPlacedBudgetFd.lean index a2bc2ffae..bc0a68606 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3MatchingPathBPollPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3MatchingPathBPollPlacedBudgetFd.lean @@ -81,9 +81,7 @@ open CryptoVerification.LibsignalTripleRatchet.FromRecordCallees (lsLogOff) open CryptoVerification.LibsignalTripleRatchetRepr (AddrGhost protocolAddressAt uuidTryParse) open CryptoVerification.RustHeap (RustAlloc) open CryptoVerification.SignalSession ( - CliHooks cliExternsPlaced isCliPanicSymbolPlaced lsReadFileSym lsReadStdinSym - lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli - lsRustReallocSymCli lsStringCloneSym + CliHooks cliExternsPlaced lsReadFileSym ) open CryptoVerification.SignalSession.Cli ( StoresGhost cliIdentityVtSym cliKyberPreKeyVtSym cliPreKeyVtSym cliSessionVtSym @@ -102,7 +100,7 @@ open CryptoVerification.SignalSession.Cli.RunCompose ( DecPkGhost RunNeeds RunSem decResAt dpPollNeed dpSlotArgsPlaced slotOut slotOutTr slotTrace ) open CryptoVerification.SignalSession.Cli.RunGlue ( - CliGhostHooks cliGhostExterns cliGhostExterns_other + CliGhostHooks cliGhostExterns withPanics_cliGhostExterns ) open CryptoVerification.SignalSession.Cli.RunProofs ( cliDecryptPrekeyNeed decPkDef dpCxAt dpFutDoneAt dpFutStartAt dpWrapFrame @@ -385,26 +383,8 @@ theorem sepWPp_bind_p1_false {prog : Program} {mid ret : BitVec 64} theorem withPanics_cliGhostExterns_eq (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : Rust.withPanics (cliGhostExterns gh (cliExternsPlaced mmpl W)) = - cliGhostExterns gh (cliExternsPlaced mmpl W) := by - funext name - by_cases hp : Rust.isPanicSymbol name = true - · have hother : cliGhostExterns gh (cliExternsPlaced mmpl W) name = cliExternsPlaced mmpl W name := - cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustDeallocSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustReallocSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocZeroedSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustNoAllocShimSymCli] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsReadFileSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsReadStdinSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemsetSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemcpySym] at hp) - unfold Rust.withPanics - rw [hother] - unfold cliExternsPlaced isCliPanicSymbolPlaced - simp [hp] - · simp [Rust.withPanics, hp] + cliGhostExterns gh (cliExternsPlaced mmpl W) := + withPanics_cliGhostExterns mmpl gh W private theorem hookSat_sessionMemcpyRegionBudget_of_codec {H : CryptoVerification.LibsignalHooks} (h : HookSat H CryptoVerification.LibsignalTripleRatchet.lsMemcpySym diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathAFullPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathAFullPlacedBudgetFd.lean index 44129558c..43c2fa905 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathAFullPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathAFullPlacedBudgetFd.lean @@ -36,6 +36,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget -- proo public import LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpqrV1.Top.InitialState.DefsPlacedBudget -- proof-setup: allow-public-import import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudgetAux @@ -455,18 +456,15 @@ private theorem cliStageP2BaseCalleesPlaced4K [LibsignalPlacement] {M : AllocCos hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_sessionMemcpyBudget_of_codec CryptoVerification.RustHeap.allocHookStack hh.codecHooks.memcpy) - (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget.isSameAccount_4k_placed_ok_on_stageP1 - ((CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExterns_other gh - (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_row mmpl W - (CryptoVerification.SignalSession.Cli.Slots.blackBox_row_placed mmpl W))) + (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat.isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudgetAux.uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) private theorem cliInitBobErrOwnedFrozen4K_ok [LibsignalFullPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (X : UnreachedPqxdhPrimitives) (mmpl : MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hG : CliGhostAllocHooks M A lim gh) (hh : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W))) : subroutine_ok (CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Kits.stageP1ProgPlaced @@ -488,7 +486,7 @@ private theorem cliInitBobErrOwnedFrozen4K_ok [LibsignalFullPlacement] {M : Allo (CryptoVerification.SignalSession.Cli.Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudget.cliExternsPlaced_torsionFree_budget_sat mmpl W X))) (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudget.cliPqxdhCalculateAgreement_placed_ok_of_hookSat - X mmpl gh W hh.codecHooks.alloc hh.codecHooks.dealloc + X mmpl gh W hG hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_noAllocShimBudget_of_withVmPreserved hh.codecHooks.shim)) (hookSat_noAllocShimBudget_of_withVmPreserved hh.codecHooks.shim) hh.codecHooks.alloc @@ -676,7 +674,7 @@ theorem stageP2PathAQpan_cli_d3_noRead_at_frozen_placed_of_seams_ofEnv [Libsigna (cliGhostExterns gh (cliExternsPlaced mmpl W)) (cliModelPrims_structural X W) (cliStageP2ClosureHooksPlaced mmpl gh W hh) (cliStageP2BaseCalleesPlaced4K mmpl gh W hh) - (cliInitBobErrOwnedFrozen4K_ok X mmpl gh W hh) + (cliInitBobErrOwnedFrozen4K_ok X mmpl gh W hG hh) (h10a_cliInitBobV1FrozenOkPlaced4K_ofEnv X mmpl gh W hG hh hSpqr) (cliPollIdKitPlaced A.repAlloc y.g.F y.g.peer (cliKitStk B)) (cliPollSelfKitPlaced A.repAlloc y.g.F y.g.peer (cliKitStk B)) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathAOfEnvPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathAOfEnvPlacedBudget.lean index 360ab2e87..4e950d122 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathAOfEnvPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathAOfEnvPlacedBudget.lean @@ -32,6 +32,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudgetAux @@ -329,18 +330,15 @@ private theorem cliStageP2BaseCalleesPlaced4K [LibsignalPlacement] {M : AllocCos hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_sessionMemcpyBudget_of_codec CryptoVerification.RustHeap.allocHookStack hh.codecHooks.memcpy) - (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget.isSameAccount_4k_placed_ok_on_stageP1 - ((CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExterns_other gh - (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_row mmpl W - (CryptoVerification.SignalSession.Cli.Slots.blackBox_row_placed mmpl W))) + (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat.isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudgetAux.uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) private theorem cliInitBobErrOwnedFrozen4K_ok [LibsignalFullPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hG : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.CliGhostAllocHooks M A lim gh) (hh : LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W))) : subroutine_ok @@ -363,7 +361,7 @@ private theorem cliInitBobErrOwnedFrozen4K_ok [LibsignalFullPlacement] {M : Allo (CryptoVerification.SignalSession.Cli.Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudget.cliExternsPlaced_torsionFree_budget_sat mmpl W X))) (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudget.cliPqxdhCalculateAgreement_placed_ok_of_hookSat - X mmpl gh W hh.codecHooks.alloc hh.codecHooks.dealloc + X mmpl gh W hG hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_noAllocShimBudget_of_withVmPreserved hh.codecHooks.shim)) (hookSat_noAllocShimBudget_of_withVmPreserved hh.codecHooks.shim) hh.codecHooks.alloc @@ -573,7 +571,7 @@ theorem stageP2PathAQpan_cli_d3_at_frozen_placed_of_seams_ofEnv [LibsignalFullPl (cliGhostExterns gh (cliExternsPlaced mmpl W)) (cliModelPrims_structural X W) (cliStageP2ClosureHooksPlaced mmpl gh W hh) (cliStageP2BaseCalleesPlaced4K mmpl gh W hh) - (cliInitBobErrOwnedFrozen4K_ok X mmpl gh W hh) + (cliInitBobErrOwnedFrozen4K_ok X mmpl gh W hG hh) (h10a_cliInitBobV1FrozenOkPlaced4K_ofEnv X mmpl gh W hG hh hSpqr) (cliPollIdKitPlaced A.repAlloc y.g.F y.g.peer (cliKitStk B)) (cliPollSelfKitPlaced A.repAlloc y.g.F y.g.peer (cliKitStk B)) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathAPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathAPlacedBudget.lean index 497c2c031..84df8d1ef 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathAPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathAPlacedBudget.lean @@ -31,6 +31,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudgetAux @@ -1315,12 +1316,8 @@ private theorem cliStageP2BaseCalleesPlaced4K [LibsignalPlacement] {M : AllocCos hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_sessionMemcpyBudget_of_codec CryptoVerification.RustHeap.allocHookStack hh.codecHooks.memcpy) - (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget.isSameAccount_4k_placed_ok_on_stageP1 - ((CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExterns_other gh - (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_row mmpl W - (CryptoVerification.SignalSession.Cli.Slots.blackBox_row_placed mmpl W))) + (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat.isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudgetAux.uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) @@ -1356,6 +1353,7 @@ private theorem cliInitBobV1FrozenOkPlaced4K [LibsignalFullPlacement] {M : Alloc private theorem cliInitBobErrOwnedFrozen4K_ok [LibsignalFullPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hG : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.CliGhostAllocHooks M A lim gh) (hh : LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W))) : subroutine_ok @@ -1378,7 +1376,7 @@ private theorem cliInitBobErrOwnedFrozen4K_ok [LibsignalFullPlacement] {M : Allo (CryptoVerification.SignalSession.Cli.Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudget.cliExternsPlaced_torsionFree_budget_sat mmpl W X))) (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudget.cliPqxdhCalculateAgreement_placed_ok_of_hookSat - X mmpl gh W hh.codecHooks.alloc hh.codecHooks.dealloc + X mmpl gh W hG hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_noAllocShimBudget_of_withVmPreserved hh.codecHooks.shim)) (hookSat_noAllocShimBudget_of_withVmPreserved hh.codecHooks.shim) hh.codecHooks.alloc @@ -1532,7 +1530,7 @@ theorem stageP2PathAQpan_cli_d3_at_full_placed_of_seams [LibsignalFullPlacement] (cliGhostExterns gh (cliExternsPlaced mmpl W)) (cliModelPrims_structural X W) (cliStageP2ClosureHooksPlaced mmpl gh W hh) (cliStageP2BaseCalleesPlaced4K mmpl gh W hh) - (cliInitBobErrOwnedFrozen4K_ok X mmpl gh W hh) + (cliInitBobErrOwnedFrozen4K_ok X mmpl gh W hG hh) (cliInitBobV1FrozenOkPlaced4K X mmpl gh W hG hh hSpqr) (cliPollIdKitPlaced A.repAlloc y.g.F y.g.peer (cliKitStk B)) (cliPollSelfKitPlaced A.repAlloc y.g.F y.g.peer (cliKitStk B)) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathCPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathCPlacedBudget.lean index 474b5b8e0..2afdfc3e4 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathCPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonStage2PathCPlacedBudget.lean @@ -32,6 +32,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlace public import LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.E2E.Record.Serialization.Canon @@ -533,7 +534,7 @@ theorem stageP2PathCOverQpan_cli_d3_placed_of_seams [LibsignalPlacement] {M : Al LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh0.alloc, hh0.allocFs, hh0.panics, hh0.memcpyRO, hh0.bcmp, hh0.fs, hh0.utf8, hh0.memrchr, - hh0.codecHooks, hh0.allocZeroed, hh0.stringClone, hh0.formatInner⟩ + hh0.codecHooks, hh0.allocZeroed, hh0.stringClone, hh0.formatInner, hh0.blackBox⟩ rcases hregs1 with ⟨hx8, hx9, hx10, hx11, hx12, hx13, hx14, hx15, hx16, _, hx19, _, hx22, hx23, hx24, _, _, hx29, hvregs1⟩ obtain ⟨m, _, hi, hpkToE, hdec0⟩ := hdecOk @@ -1286,12 +1287,8 @@ private theorem cliStageP2BaseCalleesPlaced4K [LibsignalPlacement] {M : AllocCos hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_sessionMemcpyBudget_of_codec CryptoVerification.RustHeap.allocHookStack hh.codecHooks.memcpy) - (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget.isSameAccount_4k_placed_ok_on_stageP1 - ((CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExterns_other gh - (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_row mmpl W - (CryptoVerification.SignalSession.Cli.Slots.blackBox_row_placed mmpl W))) + (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat.isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudgetAux.uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) @@ -1327,6 +1324,7 @@ private theorem cliInitBobV1FrozenOkPlaced4K [LibsignalFullPlacement] {M : Alloc private theorem cliInitBobErrOwnedFrozen4K_ok [LibsignalFullPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hG : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.CliGhostAllocHooks M A lim gh) (hh : LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W))) : subroutine_ok @@ -1349,7 +1347,7 @@ private theorem cliInitBobErrOwnedFrozen4K_ok [LibsignalFullPlacement] {M : Allo (CryptoVerification.SignalSession.Cli.Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudget.cliExternsPlaced_torsionFree_budget_sat mmpl W X))) (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudget.cliPqxdhCalculateAgreement_placed_ok_of_hookSat - X mmpl gh W hh.codecHooks.alloc hh.codecHooks.dealloc + X mmpl gh W hG hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_noAllocShimBudget_of_withVmPreserved hh.codecHooks.shim)) (hookSat_noAllocShimBudget_of_withVmPreserved hh.codecHooks.shim) hh.codecHooks.alloc @@ -1452,7 +1450,7 @@ theorem stageP2PathCOverQpan_cli_d3_at_full_placed_of_seams [LibsignalFullPlacem LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh0.alloc, hh0.allocFs, hh0.panics, hh0.memcpyRO, hh0.bcmp, hh0.fs, hh0.utf8, hh0.memrchr, - hh0.codecHooks, hh0.allocZeroed, hh0.stringClone, hh0.formatInner⟩ + hh0.codecHooks, hh0.allocZeroed, hh0.stringClone, hh0.formatInner, hh0.blackBox⟩ rcases hregs1 with ⟨hx8, hx9, hx10, hx11, hx12, hx13, hx14, hx15, hx16, _, hx19, _, hx22, hx23, hx24, _, _, hx29, hvregs1⟩ obtain ⟨m, _, hi, hpkToE, hdec0⟩ := hdecOk @@ -1543,7 +1541,7 @@ theorem stageP2PathCOverQpan_cli_d3_at_full_placed_of_seams [LibsignalFullPlacem (cliGhostExterns gh (cliExternsPlaced mmpl W)) (cliModelPrims_structural X W) (cliStageP2ClosureHooksPlaced mmpl gh W hh) (cliStageP2BaseCalleesPlaced4K mmpl gh W hh) - (cliInitBobErrOwnedFrozen4K_ok X mmpl gh W hh) + (cliInitBobErrOwnedFrozen4K_ok X mmpl gh W hG hh) (cliInitBobV1FrozenOkPlaced4K X mmpl gh W hG hh hSpqr) (cliPollIdKitPlaced A.repAlloc y.g.F y.g.peer (cliKitStk B)) (cliPollSelfKitPlaced A.repAlloc y.g.F y.g.peer (cliKitStk B)) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidMatchSlotPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidMatchSlotPlacedBudget.lean index b77d987b2..e38e9d0bd 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidMatchSlotPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidMatchSlotPlacedBudget.lean @@ -605,7 +605,8 @@ theorem decPk_d3_validMatch_poll_placedBudget [LibsignalPlacement] LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, - hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, + hh.blackBox⟩ let σ := cliKitStk B let pid := pmPreKeyId y.g.msg let sid := y.g.msg.signedPreKeyId diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidMatchUntrustedPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidMatchUntrustedPlacedBudget.lean index 921019edd..04604fc5f 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidMatchUntrustedPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidMatchUntrustedPlacedBudget.lean @@ -112,7 +112,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.IdentityKitOkPlacedBudget open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.SessionKitOkCliPlacedBudget (cliSessKitOkSE_placed cliSessionKitDefaultBudgetEnv) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.PollOverP4SpatialPlacedBudget (dpPollPost_of_slotTraceFT_placed) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStageDefsPlacedBudget (StageP1UntrustedEnv) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (cliExternsPlaced_sessionMemcpy_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemmove_budget_sat) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (cliExternsPlaced_sessionMemcpy_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.DecryptPrekeySlotPlacedBudget (DpPollGhostStateBudget dpPollSpecStateBudget dpSlotPollKStatePlaced) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsXCliPlaced readFileSpecPlaced sessDeserializeSpecPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Store.SerGlueXPlacedBudget (serializeCanonX_placed_ok_of_serContractsX) @@ -213,12 +213,6 @@ private theorem saveUpd_own_placed (rd : ReadRule) (F0 : FsFiles) (g : IdGhost) (CryptoVerification.SignalSession.Cli.IdGhost.saveUpd rd F0 g addr key).own = g.own := by unfold CryptoVerification.SignalSession.Cli.IdGhost.saveUpd; cases CryptoVerification.SignalSession.Cli.IdGhost.peer rd F0 g addr <;> rfl -private theorem cliGhostExterns_blackBox_local (mmpl : Obj.MultiPlacement) - (g : CliGhostHooks) (W : CliHooks) : - cliGhostExterns g (cliExternsPlaced mmpl W) lsBlackBoxU8Sym = - some CryptoVerification.LibsignalSession.blackBoxHook := - CryptoVerification.SignalSession.Cli.KitInst.IdKit.cliGhostExterns_blackBox mmpl g W - private theorem sepWPp_intro_stageP1VtablesPlacedAt [LibsignalPlacement] {A : RustAlloc} {prog : Program} {target : BitVec 64} {s0 : State} {kit : SessionStoreSpec A 0#64} {ikit : IdentityStoreSpec A 0#64} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOfEnvGlue.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOfEnvGlue.lean index c0997ee5c..4eb259103 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOfEnvGlue.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOfEnvGlue.lean @@ -246,9 +246,11 @@ private theorem d3glue_cliGhost_row (mmpl : Obj.MultiPlacement) (gh : CliGhostHo (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = false := by decide) : cliGhostExterns gh (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other gh _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other gh _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)).trans + (cliExternsPlaced_row mmpl W hrow) private theorem d3glue_fmtWriteHook0_budget_ok {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) : @@ -1015,7 +1017,8 @@ theorem decPk_d3_validMatch_poll_at_full_placedBudget [LibsignalPlacement] LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, - hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, + hh.blackBox⟩ let σ := cliKitStk B let pid := pmPreKeyId y.g.msg let sid := y.g.msg.signedPreKeyId diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPathCP4PlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPathCP4PlacedBudgetFd.lean index e7f53ec9f..aedd34136 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPathCP4PlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPathCP4PlacedBudgetFd.lean @@ -464,7 +464,7 @@ theorem closure_pathCOver_p4_d3_cont_at_b_placedBudget [LibsignalPlacement] LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, hh.utf8, hh.memrchr, - hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, hh.blackBox⟩ have hf' : s'.fs.files = y.g.F := (cliFiles_eq_of_trace_eq_placed hh hsteps2' (htr'.trans htr2.symm)).trans hfiles2 have hsub64 : dpClosSubStack B ≤ 2 ^ 64 := by diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPlacedBudgetFd.lean index 25582e6ad..e5262913d 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPlacedBudgetFd.lean @@ -624,7 +624,8 @@ theorem decPk_d3_validOver_poll_ofVerNe_at_b_of_kits [LibsignalPlacement] LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, - hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, + hh.blackBox⟩ let σ := cliKitStk B let pid := pmPreKeyId y.g.msg let sid := y.g.msg.signedPreKeyId diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPollAuxPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPollAuxPlacedBudget.lean index 3a86f9fac..4037524e4 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPollAuxPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPollAuxPlacedBudget.lean @@ -1798,7 +1798,7 @@ theorem closure_pathCOver_p4_d3_cont_at_placedBudget [LibsignalPlacement] {M : A LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, hh.utf8, hh.memrchr, - hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, hh.blackBox⟩ have hf' : s'.fs.files = y.g.F := (cliFiles_eq_of_trace_eq_placed hh hsteps2' (htr'.trans htr2.symm)).trans hfiles2 have hsub64 : dpClosSubStack B ≤ 2 ^ 64 := by diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPollPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPollPlacedBudget.lean index 9998811e7..634be5cb3 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPollPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverPollPlacedBudget.lean @@ -699,7 +699,8 @@ theorem decPk_d3_validOver_poll_placedBudget [LibsignalPlacement] LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, - hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, + hh.blackBox⟩ let σ := cliKitStk B let pid := pmPreKeyId y.g.msg let sid := y.g.msg.signedPreKeyId @@ -1024,7 +1025,8 @@ theorem decPk_d3_validOver_poll_full_placedBudget [LibsignalPlacement] LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, - hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, + hh.blackBox⟩ let σ := cliKitStk B let pid := pmPreKeyId y.g.msg let sid := y.g.msg.signedPreKeyId @@ -1275,7 +1277,8 @@ theorem decPk_d3_validOver_poll_at_full_placedBudget [LibsignalPlacement] LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, - hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, + hh.blackBox⟩ let σ := cliKitStk B let pid := pmPreKeyId y.g.msg let sid := y.g.msg.signedPreKeyId diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverStage2PlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverStage2PlacedBudget.lean index b7e1bf52a..015184996 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverStage2PlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverStage2PlacedBudget.lean @@ -439,6 +439,7 @@ theorem stageP2Over_qpan_cli_d3_placed_of_pathC [LibsignalPlacement] {M : AllocC DecPkGhost → SessionRecord (List (BitVec 8)) → List AllocEvent → Prop} (hPathC : StageP2PathCOverQpanCliD3InStmt A lim PromEnv P2OverErrEnv P2OverOkEnv) (hPromMiss : ∀ (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks), + RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) → PromoteMatchingMissGenPlacedProp A.repAlloc (cliGhostExterns gh (cliExternsPlaced mmpl W))) (hPromOver : ∀ (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks), RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) → @@ -451,7 +452,7 @@ theorem stageP2Over_qpan_cli_d3_placed_of_pathC [LibsignalPlacement] {M : AllocC have hr_scope : scopeIn r := hsub r (scope_of_loadRec_some hfPeer hload) exact hPathC X mmpl gh W B S Scope y st_b g1 r s_old s0 s1 sp rngPtr v_a8 v_b8 v_d0 Q Qpan - (hPromMiss mmpl gh W) (hPromOver mmpl gh W hh) hh hfits hcoins hd3False + (hPromMiss mmpl gh W hh) (hPromOver mmpl gh W hh) hh hfits hcoins hd3False hsub hfPeer hcur hr_scope hnot htrust hg1 hfs hCode1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 (fun sf Pf hpcf hrunf hstepsf hspf hcsf hvregsf hinvf @@ -477,11 +478,11 @@ theorem decPk_d3_validOver_stage2_placedBudget [LibsignalPlacement] {M : AllocCo (withLsCl lsmpl (growOneVecU8BudgetSpec M A lim))) : StageP2OverQpanCliD3PlacedBudgetStmt A lim P2OverErrEnv P2OverOkEnv := stageP2Over_qpan_cli_d3_placed_of_pathC hPathC - (cliPromoteMatchingMissGen_placed_ok A.repAlloc) + (fun mmpl gh W hh => cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W hh.blackBox) (fun mmpl gh W hh => cliPromoteOverGen_placed_ok mmpl gh W ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, hh.utf8, hh.memrchr, - hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, hh.blackBox⟩ (hGrow mmpl gh W) (hRaw mmpl gh W)) /-! ## 4. `[LibsignalFullPlacement]` / `LibsignalFrozen` Twins -/ @@ -752,6 +753,7 @@ theorem stageP2Over_qpan_cli_d3_full_placed_of_pathC [LibsignalPlacement] {M : A DecPkGhost → SessionRecord (List (BitVec 8)) → List AllocEvent → Prop} (hPathC : StageP2PathCOverQpanCliD3FrozenInStmt A lim PromEnv P2OverErrEnv P2OverOkEnv) (hPromMiss : ∀ (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks), + RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) → PromoteMatchingMissGenPlacedProp A.repAlloc (cliGhostExterns gh (cliExternsPlaced mmpl W))) (hPromOver : ∀ (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks), RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) → @@ -764,7 +766,7 @@ theorem stageP2Over_qpan_cli_d3_full_placed_of_pathC [LibsignalPlacement] {M : A have hr_scope : scopeIn r := hsub r (scope_of_loadRec_some hfPeer hload) exact hPathC X mmpl gh W B S Scope y st_b g1 r s_old s0 s1 sp rngPtr v_a8 v_b8 v_d0 Q Qpan - (hPromMiss mmpl gh W) (hPromOver mmpl gh W hh) hh hfits hcoins hd3False + (hPromMiss mmpl gh W hh) (hPromOver mmpl gh W hh) hh hfits hcoins hd3False hsub hfPeer hcur hr_scope hnot htrust hg1 hfs hCode1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 (fun sf Pf hpcf hrunf hstepsf hspf hcsf hvregsf hinvf @@ -788,11 +790,11 @@ theorem decPk_d3_validOver_stage2_full_placedBudget [LibsignalPlacement] {M : Al (withLsCl lsmpl (growOneVecU8BudgetSpec M A lim))) : StageP2OverQpanCliD3FrozenPlacedBudgetStmt A lim P2OverErrEnv P2OverOkEnv := stageP2Over_qpan_cli_d3_full_placed_of_pathC hPathC - (cliPromoteMatchingMissGen_placed_ok A.repAlloc) + (fun mmpl gh W hh => cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W hh.blackBox) (fun mmpl gh W hh => cliPromoteOverGen_placed_ok mmpl gh W ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, hh.utf8, hh.memrchr, - hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, hh.blackBox⟩ (hGrow mmpl gh W) (hRaw mmpl gh W)) /-! ## 5. Pointwise `(X, mmpl, gh, W)` `LibsignalFrozen` Twins -/ @@ -1067,8 +1069,9 @@ theorem stageP2Over_qpan_cli_d3_at_full_placed_of_pathC [LibsignalPlacement] {M DecPkGhost → SessionRecord (List (BitVec 8)) → List AllocEvent → Prop} (hPathC : StageP2PathCOverQpanCliD3FrozenAtInStmt A lim X mmpl gh W PromEnv P2OverErrEnv P2OverOkEnv) - (hPromMiss : PromoteMatchingMissGenPlacedProp A.repAlloc - (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (hPromMiss : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) → + PromoteMatchingMissGenPlacedProp A.repAlloc + (cliGhostExterns gh (cliExternsPlaced mmpl W))) (hPromOver : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) → PromoteOverGenPlacedWithEnvProp M A lim PromEnv (cliGhostExterns gh (cliExternsPlaced mmpl W))) : @@ -1079,7 +1082,7 @@ theorem stageP2Over_qpan_cli_d3_at_full_placed_of_pathC [LibsignalPlacement] {M have hr_scope : scopeIn r := hsub r (scope_of_loadRec_some hfPeer hload) exact hPathC B S Scope y st_b g1 r s_old s0 s1 sp rngPtr v_a8 v_b8 v_d0 Q Qpan - hPromMiss (hPromOver hh) hh hfits hcoins hd3False + (hPromMiss hh) (hPromOver hh) hh hfits hcoins hd3False hsub hfPeer hcur hr_scope hnot htrust hg1 hfs hCode1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 (fun sf Pf hpcf hrunf hstepsf hspf hcsf hvregsf hinvf @@ -1103,11 +1106,11 @@ theorem decPk_d3_validOver_stage2_at_full_placedBudget [LibsignalPlacement] {M : (lsmpl.base 621) (withLsCl lsmpl (growOneVecU8BudgetSpec M A lim))) : StageP2OverQpanCliD3FrozenAtPlacedBudgetStmt A lim X mmpl gh W P2OverErrEnv P2OverOkEnv := stageP2Over_qpan_cli_d3_at_full_placed_of_pathC hPathC - (cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W) + (fun hh => cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W hh.blackBox) (fun hh => cliPromoteOverGen_placed_ok mmpl gh W ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, hh.utf8, hh.memrchr, - hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, hh.blackBox⟩ hGrow hRaw) end LibsignalBinary.Proofs.SignalSession.Cli.D3.Budget.D3NonCanonValidOverStage2PlacedBudget diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverStage2PlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverStage2PlacedBudgetFd.lean index b0d81e564..f220e6652 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverStage2PlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverStage2PlacedBudgetFd.lean @@ -23,6 +23,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.KitInst.DecPkPollKitsFdsP public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1KitsPlacedBudgetAux -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpqrV1.Top.InitialState.DefsPlacedBudget -- proof-setup: allow-public-import +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.InitBobErrOwnedPlacedBudget @@ -86,7 +87,7 @@ open CryptoVerification.SignalSession.Cli.KitInst ( ) open CryptoVerification.SignalSession.Cli.MainHops (cliIo cliRunBudgets cliWrOk) open CryptoVerification.SignalSession.Cli.RunGlue ( - CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other + CliGhostHooks cliGhostExterns ) open CryptoVerification.SignalSession.Cli.RunProofs (pkStoreKeys pmOfE) open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( @@ -106,7 +107,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( x29_eq_sp0_sub_60 x29_eq_sp_add_c70 ) open CryptoVerification.SignalSession.Cli.Slots ( - blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced scopeIn + cliGhostExterns_sat_of_cliExternsPlaced scopeIn ) open LibsignalBinary.Heap ( AllocCostModel AllocEvent BudgetLimits FitsEnv FreeOnlyEvs RustCliAllocBudget SeqEnv @@ -122,7 +123,7 @@ open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Mid3Place ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget ( InitializeBobV1OptFieldsEnv StageP2BaseCalleesPlaced4K.of_hooks - initializeBobSession_ok_v1_of_env_4k_frozen_placed_on_stageP1 isSameAccount_4k_placed_ok_on_stageP1 + initializeBobSession_ok_v1_of_env_4k_frozen_placed_on_stageP1 p2_errOwned_frozen_to_defs4K_placed ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2V1PlacedBudget ( @@ -315,10 +316,8 @@ private theorem cliStageP2BaseCalleesPlaced4K [LibsignalPlacement] {M : AllocCos hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_p2Memcpy4K_of_vm hh.codecHooks.memcpy) - (isSameAccount_4k_placed_ok_on_stageP1 - ((cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W))) + (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat.isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) private theorem cliInitBobV1FrozenOkPlaced4K [LibsignalFullPlacement] {M : AllocCostModel} @@ -573,8 +572,8 @@ theorem h7ra_stageP2Over_archive_at_cliRunBudgets_frozen_of_kits [LibsignalFullP LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh0.alloc, hh0.allocFs, hh0.panics, hh0.memcpyRO, hh0.bcmp, hh0.fs, hh0.utf8, hh0.memrchr, - hh0.codecHooks, hh0.allocZeroed, hh0.stringClone, hh0.formatInner⟩ - have hPromMiss := cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + hh0.codecHooks, hh0.allocZeroed, hh0.stringClone, hh0.formatInner, hh0.blackBox⟩ + have hPromMiss := cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W hh.blackBox have hPromOver := cliPromoteOverGen_archive_placed_ok mmpl gh W hh hGrow hRaw subst hg1 rcases hregs1 with ⟨hx8, hx9, hx10, hx11, hx12, hx13, hx14, hx15, hx16, diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverStage4PlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverStage4PlacedBudget.lean index 6ba832145..8a3c617e3 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverStage4PlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3NonCanonValidOverStage4PlacedBudget.lean @@ -507,7 +507,7 @@ theorem closure_pathCOver_p4_d3_cont_placedBudget [LibsignalPlacement] {M : Allo LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, hh.utf8, hh.memrchr, - hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, hh.blackBox⟩ have hf' : s'.fs.files = y.g.F := (cliFiles_eq_of_trace_eq_placed hh hsteps2' (htr'.trans htr2.symm)).trans hfiles2 have hsub64 : dpClosSubStack B ≤ 2 ^ 64 := by diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3PollRejectAuxPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3PollRejectAuxPlacedBudget.lean index 11322b7af..ca70422a4 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3PollRejectAuxPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3PollRejectAuxPlacedBudget.lean @@ -13,6 +13,7 @@ public import LibsignalBinary.Heap.IfaceBudget public import LibsignalBinary.Heap.IfaceBudgetLemmas public import LibsignalBinary.Proofs.Common.SharedHelpers public meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.D3.PreKeyGeneralAux public import LibsignalBinary.Proofs.SignalSession.Cli.KitInst.IdentityKitOkCliPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.KitInst.IdentityKitOkPlacedBudget @@ -63,7 +64,7 @@ open CryptoVerification.LibsignalTripleRatchet (extHookStack noAllocShimSpec) open CryptoVerification.LibsignalTripleRatchet.FromRecordCallees (lsLogOff) open CryptoVerification.LibsignalTripleRatchetRepr (AddrGhost protocolAddressAt) open CryptoVerification.RustHeap (RustAlloc allocHookStack) -open CryptoVerification.SignalSession (CliHooks cliExternsPlaced lsReadFileSym) +open CryptoVerification.SignalSession (CliHooks cliExternsPlaced lsBlackBoxSym lsReadFileSym) open CryptoVerification.SignalSession.Cli (baseKeysName cliIdentityVtSym cliKyberPreKeyVtSym cliPreKeyVtSym cliSessionVtSym cliSignedPreKeyVtSym dirAt utf8) open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) open CryptoVerification.SignalSession.Cli.KitInst (CliPkInv CliSpkInv cliIdentityStoreSpec cliKyberPreKeyStoreSpecPlaced cliPreKeyStoreSpecPlaced cliSessionStoreSpec cliSignedPreKeyStoreSpecPlaced) @@ -299,9 +300,11 @@ theorem stageP1ProgPlaced_eq_dpPollProgPlaced [LibsignalPlacement] dpPollProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W)) := rfl theorem cliPromoteMatchingMissGen_placed_d3 [LibsignalPlacement] (A : RustAlloc) - (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : + (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hBb : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : PromoteMatchingMissGenPlacedProp A (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - cliPromoteMatchingMissGen_placed_ok A mmpl gh W + cliPromoteMatchingMissGen_placed_ok A mmpl gh W hBb theorem cliStageP2ClosureHooksPlaced_d3 [LibsignalPlacement] {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3StageP3Prev1PlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3StageP3Prev1PlacedBudget.lean index 031e8e432..66f904387 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3StageP3Prev1PlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3StageP3Prev1PlacedBudget.lean @@ -62,7 +62,7 @@ open CryptoVerification.E2E.Pqxdh.ResponderClosure (ClosureCalleeSaved) open CryptoVerification.E2E.Pqxdh.WireEntries (DistinctSid) open CryptoVerification.LibsignalPublicApi.StoreKit (LibsignalCodeRoLoaded withLsCodeRoLoaded) open CryptoVerification.LibsignalSpqrV1 (spqrV1) -open CryptoVerification.LibsignalTripleRatchet (SeedsLen32 SpqrModel extHookStack rootStack) +open CryptoVerification.LibsignalTripleRatchet (SeedsLen32 SpqrModel rootStack) open CryptoVerification.LibsignalTripleRatchet.Record (CloneRel) open CryptoVerification.LibsignalTripleRatchetRepr ( AddrGhost SessionGhost SignalMessageGhost UuidParser decryptDraws uuidTryParse @@ -78,7 +78,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( LsTokenInit dpPollEntryPlaced dpPollProgPlaced ) open CryptoVerification.SignalSession.Cli.Slots ( - cliGhostExterns_panic_handle_error cliGhostExterns_sat_of_cliExternsPlaced + cliGhostExterns_panic_handle_error ) open CryptoVerification.SignalSession.Coins (coinsAfterPlaced coinsAtPlaced) open LibsignalBinary.Heap ( @@ -135,7 +135,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_framelessMemcpy_budget_sat cliExternsPlaced_noAllocShim_budget_sat cliExternsPlaced_realloc_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat - cliExternsPlaced_sessionMemmove_budget_sat cliExternsPlaced_shim_budget_sat + cliExternsPlaced_shim_budget_sat ) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsXCliPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget (SpqrV1PlacedSeams) @@ -443,8 +443,6 @@ theorem cliVerNe1e04_placed_ok [LibsignalPlacement] ((show lsRustDeallocSymCli = lsRustDeallocSym by decide) ▸ cliExternsPlaced_dealloc_budget_sat mmpl gh W hG) (cli_framelessMemcpy_sat mmpl gh W hG) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W extHookStack)) (cliGhostExterns_panic_handle_error mmpl gh W) (chainMerge5CroPlacedOkExt_cli mmpl gh W hG) @@ -715,8 +713,6 @@ theorem cliVerNe1e04_full_placed_ok [LibsignalFullPlacement] ((show lsRustDeallocSymCli = lsRustDeallocSym by decide) ▸ cliExternsPlaced_dealloc_budget_sat mmpl gh W hG) (cli_framelessMemcpy_sat mmpl gh W hG) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W extHookStack)) (cliGhostExterns_panic_handle_error mmpl gh W) (chainMerge5CroPlacedOkExt_cli mmpl gh W hG) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3V3RejectPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3V3RejectPlacedBudget.lean index 17bfef2aa..a8e8b8b6d 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3V3RejectPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/D3V3RejectPlacedBudget.lean @@ -661,7 +661,7 @@ theorem stageP2_v3_reject_placedBudget [LibsignalPlacement] have hPromMissAt : LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Over.StageP2DefsPlacedBudget.PromoteMatchingMissAtPlacedProp A.repAlloc (cliGhostExterns gh (cliExternsPlaced mmpl W)) y.fut g recG sess 3#8 y.g.msg.baseKey.serialize := LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Over.StageP2DefsPlacedBudget.promoteMatchingMissAt_placed_of_gen - (cliPromoteMatchingMissGen_placed_d3 A.repAlloc mmpl gh W) + (cliPromoteMatchingMissGen_placed_d3 A.repAlloc mmpl gh W hh.blackBox) y.fut g recG sess 3#8 y.g.msg.baseKey.serialize (not_p2SessMatchesMsg_of_v3' hv3 hnm) (baseKey_serialize_length y.g.msg.baseKey) exact stageP2_over_v3_kits_placed diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/DecPkPollKitsStage2PlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/DecPkPollKitsStage2PlacedBudgetFd.lean index 0effb4cf8..c1a5d5180 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/DecPkPollKitsStage2PlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/DecPkPollKitsStage2PlacedBudgetFd.lean @@ -145,7 +145,7 @@ private theorem toSkeletonRunHooks [LibsignalPlacement] {M : AllocCostModel} { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } /-! ## 1. Shims (`606`, `608`, `611`) -/ @@ -804,7 +804,7 @@ theorem cliDecPkPollKitsPlacedOk_of_dirGet [LibsignalPlacement] {M : AllocCostMo memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } { sessOk := fun _ _ => cliPollSess_kitPlacedOkSE_untrusted_of_dirGet mmpl gh W hDropNz hh hGet hDeser idOk := fun _ _ => diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/DecPkPollKitsStage4PlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/DecPkPollKitsStage4PlacedBudgetFd.lean index 9279a1697..d779163fb 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/DecPkPollKitsStage4PlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/DecPkPollKitsStage4PlacedBudgetFd.lean @@ -110,7 +110,7 @@ private theorem toSkeletonRunHooks [LibsignalPlacement] {M : AllocCostModel} { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } private theorem cliPollKpk_markShim_rocl_of_hooks [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -163,7 +163,7 @@ private theorem cliPollKpk_markPoll_rocl_of_dirGet [LibsignalPlacement] {M : All (getProg := lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (getBlk := 589) (putProg := lsProg_570 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (putBlk := 570) (stk := (cliKitStk B).kpkMarkPoll) - hh.alloc hh.panics hh.bcmp hDecimal hGet hPut + hh.alloc hh.panics hh.bcmp.of_keepsFs hDecimal hGet hPut (hh.fs (lsProg_578 (cliGhostExterns gh (cliExternsPlaced mmpl W))) 578) (Nat.le_refl _) hblk let baseKit := cliKpkStoreSpecPlaced A.repAlloc cliIo.rd F0 cliWrOk kpkId spkId kbk diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/Stage4KitsPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/Stage4KitsPlacedBudgetFd.lean index 2025b87a2..bda2aaf17 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/Stage4KitsPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/Stage4KitsPlacedBudgetFd.lean @@ -178,7 +178,8 @@ theorem cliPollSess_seqFreeKitPlacedOkSE_of_kits [LibsignalPlacement] {M : Alloc { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, - stringClone := hh.stringClone, formatInner := hh.formatInner } + stringClone := hh.stringClone, formatInner := hh.formatInner, + blackBox := hh.blackBox } have hAddr := cliAddrText_placed_ok_of_sessHooks hhS have hPut := cliDirPut_placed_ok_of_sessHooks hhS have hSer := cliSerializeCanonSeqFree_placed_ok mmpl gh W hh diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/StageP3RawBodyPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/StageP3RawBodyPlacedBudget.lean index 99a44a7f0..15a23d164 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/StageP3RawBodyPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/Budget/StageP3RawBodyPlacedBudget.lean @@ -65,7 +65,7 @@ open CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.VerNe ( open CryptoVerification.CliHandshake.RespClosurePlaced (blkPl_518 instIsLsBlockProg_518 lsProg_518) open CryptoVerification.E2E.Pqxdh.ResponderClosure (ClosureCalleeSaved decryptPrekeySavedRegsAt) open CryptoVerification.LibsignalPublicApi.StoreKit (LibsignalCodeRoLoaded) -open CryptoVerification.LibsignalTripleRatchet (extHookStack rootStack) +open CryptoVerification.LibsignalTripleRatchet (rootStack) open CryptoVerification.LibsignalTripleRatchet.FromRecordCallees (growOneSpeStack) open CryptoVerification.LibsignalTripleRatchetRepr (SessionGhost sessionStateAt) open CryptoVerification.RustHeap (allocHookStack) @@ -77,7 +77,7 @@ open CryptoVerification.SignalSession.Cli.RunGlue ( CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_shim ) open CryptoVerification.SignalSession.Cli.Slots ( - cliGhostExterns_panic_handle_error cliGhostExterns_sat_of_cliExternsPlaced + cliGhostExterns_panic_handle_error ) open LibsignalBinary.Heap ( AllocCostModel AllocEvent BudgetLimits FitsEnv FreeOnlyEvs RustCliAllocBudget SeqEnv @@ -135,13 +135,11 @@ open LibsignalBinary.Proofs.SignalSession.Cli.D3.Budget.D3StageP3Prev1PlacedBudg open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_framelessMemcpy_budget_sat cliExternsPlaced_realloc_budget_sat - cliExternsPlaced_sessionMemmove_budget_sat ) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (framelessMemcpyBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.FromRecordCallees.DefsBudget ( dropSessionStructureLocal2Spec growOneSpeSpec ) -open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemmoveBudgetSpec) open Symbolic.Swarm.TRREF.B3Defs (DeserializeScopeP_Q NonEmptyV1Q) open Symbolic.Swarm.TRREF.B3DeserQ (prostSSGQAt ssgqOf) @@ -753,7 +751,6 @@ theorem overVerNe1e04CliAtFrozenPlacedBody_raw_of_hooks_chain5 [LibsignalFullPla (hrealloc_sat : HookSat ext lsRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hdealloc_sat : HookSat ext lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmc_sat : HookSat ext lsMemcpySym framelessMemcpyBudgetSpec) - (hmemmove_sat : HookSat ext "memmove" (sessionMemmoveBudgetSpec extHookStack)) (hpanic_raw : ext lsHandleErrorSym = some Rust.panicked) (hChain5 : b518x_ChainMerge5ExactCroPlacedOkExt' A lim ext) : OverVerNe1e04CliAtFrozenPlacedBody A lim PrevEncOK VerNeTightTopRawEnv ext := @@ -772,7 +769,7 @@ theorem overVerNe1e04CliAtFrozenPlacedBody_raw_of_hooks_chain5 [LibsignalFullPla (hookSat_verNeMemcpy_of_frameless allocHookStack hmc_sat)) (b518x_overPrevDecode_exact_cro_placed_of_hooks_chain5' (hookSat_noAllocShimBudget_of_rustAllocShimVm hshim_sat) - halloc_sat hrealloc_sat hdealloc_sat hmc_sat hmemmove_sat hpanic_raw hChain5) + halloc_sat hrealloc_sat hdealloc_sat hmc_sat hpanic_raw hChain5) st_init s0 s s1 coroPtr ctxPtr outPtr initErrsPtr prevCap prevPtr ud0 hinit_ne hcap msgVer hver_ne b_2c0 enc hEnc hfits G₁ recG st hfr1 hF1 hpc1 hrun1 hs1_sp hsp_align htr1 @@ -803,8 +800,6 @@ theorem cliVerNe1e04_full_placed_ok_raw [LibsignalFullPlacement] ((show lsRustDeallocSymCli = lsRustDeallocSym by decide) ▸ cliExternsPlaced_dealloc_budget_sat mmpl gh W hG) (rawbody_cli_framelessMemcpy_sat mmpl gh W hG) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W extHookStack)) (cliGhostExterns_panic_handle_error mmpl gh W) (c3x_chainMerge5ExactCroPlacedOkExt_cli mmpl gh W hG) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/D3BadKemRejectPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/D3BadKemRejectPlaced.lean index c277825fe..088c21846 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/D3BadKemRejectPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/D3BadKemRejectPlaced.lean @@ -79,7 +79,7 @@ open CryptoVerification.SignalSession.Cli.KitInst hiding open CryptoVerification.CodeLayout open CryptoVerification.CliHandshake.Placed CryptoVerification.CliHandshake.RespClosurePlaced open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer - (CliGhostHooks cliGhostExterns cliGhostExterns_other) + (CliGhostHooks cliGhostExterns) /-! ## 1. `v4` Bad-KEM Message Condition & Store-Kit Event Lemmas -/ @@ -589,18 +589,6 @@ theorem initializeBobSession_badKem_errOwned_placed_ok_on_stageP1 [LibsignalPlac rw [sepConj_assoc, satisfies_pure_sepConj] at hq exact hq.2) -theorem cliIsSameAccount_placed_ok_on_stageP1_d3 [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) : - subroutine_ok (stageP1ProgPlaced (cliGhostExterns g (cliExternsPlaced mmpl W))) - (lsmpl.base 17) - (withLsCodeLoaded lsmpl - (CryptoVerification.E2E.Pqxdh.WireEntries.isSameAccountDistinctSpec E2E.HooksE.A0 uuidTryParse)) := - Kits.isSameAccount_placed_ok_on_stageP1 - ((cliGhostExterns_other g (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (RunGlue.cliExternsPlaced_row mmpl W (Slots.blackBox_row_placed mmpl W))) - (cliUuidTryParse_placed_ok_d3 mmpl g W) - theorem badKemSpeWords_entails_decResAt_anyHeap (A : RustAlloc) (out errTag w2 w3 w4 w5 w6 : BitVec 64) (err : ApiError AddrVal Unit) : diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/D3PollRejectAuxPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/D3PollRejectAuxPlaced.lean index fc2451dc5..01178bb6f 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/D3PollRejectAuxPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/D3PollRejectAuxPlaced.lean @@ -38,6 +38,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.KitInst.SelfSpecPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.UuidFsPlaced import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBbSat import ProofLib.SepLogic.WPp import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP4 import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStmts @@ -103,7 +104,7 @@ open CryptoVerification.SignalSession.Cli.KitInst hiding cliPreKeyStoreSpecPlaced cliSignedPreKeyStoreSpecPlaced cliKyberPreKeyStoreSpecPlaced cliPreKeyStoreSpecPlaced_quiet cliSignedPreKeyStoreSpecPlaced_quiet open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer - (CliGhostHooks cliGhostExterns cliGhostExterns_other) + (CliGhostHooks cliGhostExterns) /-! ## 1. Pure Store & Message Rejection Predicates and Kit Invariant Projections -/ @@ -261,62 +262,6 @@ theorem stageP1ProgPlaced_eq_dpPollProgPlaced [LibsignalPlacement] Poll.dpPollProgPlaced (cliGhostExterns g (cliExternsPlaced mmpl W)) := rfl -private theorem cliGhostExterns_blackBox_placed - (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) : - cliGhostExterns g (cliExternsPlaced mmpl W) lsBlackBoxU8Sym = - some CryptoVerification.LibsignalSession.blackBoxHook := - (cliGhostExterns_other g (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (RunGlue.cliExternsPlaced_row mmpl W (Slots.blackBox_row_placed mmpl W)) - -private theorem subroutine_ok_withLsCl_of_spec_map [LibsignalPlacement] {α β : Type} - {prog : Program} {entry : BitVec 64} {specA : Spec α} {specB : Spec β} - (f : β → α) - (hpre : ∀ x s, specB.pre x s = specA.pre (f x) s) - (hpost : ∀ x s0 sf, specA.post (f x) s0 sf = specB.post x s0 sf) - (hpan : ∀ x s0 sf, specA.onPanic (f x) s0 sf = specB.onPanic x s0 sf) - (hexit : ∀ x code s0 sf, specA.onExit (f x) code s0 sf = specB.onExit x code s0 sf) - (hoom : ∀ x s0 sf, specA.onOom (f x) s0 sf = specB.onOom x s0 sf) - (hok : subroutine_ok prog entry (withLsCl lsmpl specA)) : - subroutine_ok prog entry (withLsCl lsmpl specB) := by - refine subroutine_ok_outcome_intro fun x R s0 hpc hrun hp halign => ?_ - have hp' : s0.mem ⊨ (withLsCl lsmpl specA).pre (f x) s0 ∗ R := by - dsimp only [withLsCl] at hp ⊢ - rwa [← hpre x s0] - refine hok.mono_outcome (f x) R s0 hpc hrun hp' halign ?_ - rintro sf (⟨hret, hcs, hq⟩ | ⟨hp1, hpa⟩ | ⟨code, he1, he2⟩ | ⟨ho1, hoo⟩) - · refine Or.inl ⟨hret, hcs, ?_⟩ - dsimp only [withLsCl] at hq ⊢ - rwa [← hpost x s0 sf] - · refine Or.inr (Or.inl ⟨hp1, ?_⟩) - dsimp only [withLsCl] at hpa ⊢; rwa [← hpan x s0 sf] - · refine Or.inr (Or.inr (Or.inl ⟨code, he1, ?_⟩)) - dsimp only [withLsCl] at he2 ⊢; rwa [← hexit x code s0 sf] - · refine Or.inr (Or.inr (Or.inr ⟨ho1, ?_⟩)) - dsimp only [withLsCl] at hoo ⊢; rwa [← hoom x s0 sf] - -private theorem promoteMatchingMissGen_placed_of_blackBox [LibsignalPlacement] {A : RustAlloc} - {ext : String → Option (State → State)} - (h_bb : ext lsBlackBoxU8Sym = some CryptoVerification.LibsignalSession.blackBoxHook) : - Over.PromoteMatchingMissGenPlacedProp A ext := by - have h50' : subroutine_ok (lsProg_518 ext) (lsmpl.base 50) - (withLsCl lsmpl (Over.promoteMatchingSessionMissSpec A)) := - ls_subroutine_ok_cl_of_callee (callerProg := lsProg_518 ext) - (Over.promote_matching_session_miss_placed_ok h_bb) - exact subroutine_ok_withLsCl_of_spec_map - (fun x : Over.P2PromoteMissGhost => - (⟨x.recPtr, x.msgVer, x.serPtr, x.serBytes, x.outPtr, x.g, x.r, x.s⟩ : - Over.PromoteMissGhost)) - (fun _ _ => rfl) (fun _ _ _ => rfl) (fun _ _ _ => rfl) - (fun _ _ _ _ => rfl) (fun _ _ _ => rfl) h50' - -theorem promoteMatchingMissGen_cli_placed [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) : - Over.PromoteMatchingMissGenPlacedProp E2E.HooksE.A0 - (cliGhostExterns g (cliExternsPlaced mmpl W)) := - promoteMatchingMissGen_placed_of_blackBox (cliGhostExterns_blackBox_placed mmpl g W) - theorem cliStageP2ClosureHooksPlaced_d3 [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 g) : @@ -352,6 +297,16 @@ theorem cliUuidTryParse_placed_ok_d3 [LibsignalPlacement] ⌜False⌝ from rfl, satisfies_pure_sepConj] at hpan exact False.elim hpan.1 +private theorem cliGhostExterns_blackBox_sat_d3 [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) + (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 g) : + HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) + lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat := + LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.hookSat_cliGhostExterns_of_extraOk + g (cliExternsPlaced mmpl W) hG.extraOk fun _ _ hRow => + hRow.blackBox_budget_ok (by decide : 16 ≤ 16) (by decide) + theorem cliStageP2BaseCalleesPlaced4K_d3 [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 g) : @@ -363,8 +318,8 @@ theorem cliStageP2BaseCalleesPlaced4K_d3 [LibsignalPlacement] (Slots.cliExternsPlaced_sessionMemcpy_sat mmpl g W hG allocHookStack) (Slots.cliGhostExterns_panic_handle_error mmpl g W) (Slots.cliGhostExterns_panic_handle_alloc_error mmpl g W) - (Kits.isSameAccount_4k_placed_ok_on_stageP1 - (cliGhostExterns_blackBox_placed mmpl g W) + (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBbSat.isSameAccount_4k_placed_ok_on_stageP1_sat + (cliGhostExterns_blackBox_sat_d3 mmpl g W hG) (cliUuidTryParse_placed_ok_d3 mmpl g W)) theorem cliStrToOwnedLocal2_placed_ok [LibsignalPlacement] diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/D3BinaryOomProofF3G.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/D3BinaryOomProofF3G.lean index 4f65bbffa..194ff3a26 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/D3BinaryOomProofF3G.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/D3BinaryOomProofF3G.lean @@ -17,6 +17,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 - public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2G -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Parity.F3.BundleInitElfF3 -- proof-setup: allow-public-import public import LibsignalBinary.Specifications.SignalSession.CliBinaryPq import Arm64.Trusted.Spec.Hoare @@ -33,7 +34,7 @@ import LibsignalBinary.Proofs.SpecLemmas.SignalSession.Process Route-2 (`w2_c12_route2_stmts.md` §3.2 `R2-D1..D4`) entry-guarded siblings of the D3 / flat-bundle `init` `MainOk*` arm specifications and whole-process `D3BinaryOomProofF3` / `ElfSlicesPqOomPlaced` constructors. Each `MainOk*G` predicate wraps the `b2MainSpecTightNeedLocksFineAt` subroutine - specification in `withEntryGuard (F3MemsetMemcpyEntryLrFalse mmpl)` and eliminates the guard + specification in `withEntryGuard (F3C2EntryGuard mpl mmpl)` and eliminates the guard internally at the process harness boundary via `CliStrictPlaced2G` (`R2-G4`), concluding the unchanged guard-free `cliRunPlacedSig = some …`, `OutcomeOrExcusedAbort …`, `≠ none`, `CliPqBinaryV2OomF3Placed`, `LibsignalCliPqBinaryV2OomF3PlacedAt`, and @@ -87,7 +88,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3UntypedElfF3 open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 (b2MainSpecTightNeedLocksFineAt cliBudgetLimits cliRunPlacedSig_eq_on_input_of_progEq2) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2G - (CliElfF3B2NeedLocksAssumptionsG F3MemsetMemcpyEntryLrFalse MainOkCliF3OverB2NeedLocksPlacedAtG + (CliElfF3B2NeedLocksAssumptionsG MainOkCliF3OverB2NeedLocksPlacedAtG MainOkCliF3PqB2NeedLocksPlacedAtG cliPqxdhElfCorrectPlaced_of_f3B2NeedLocksG cliRunExtOnInputsSigAt_of_strict_b2_needLocks_guarded_call_obs cliRunExtOnInputsSigAt_of_strict_b2_needLocks_guarded_call_pred @@ -99,6 +100,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.PlacedOomRecovery2 (outcomeOrExcusedAbort_of_eq) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG (withEntryGuard) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard (F3C2EntryGuard) open LibsignalBinary.Proofs.SignalSession.Cli.Parity (BundleReadWithinCap InputsEquivRaw fileStep_entries filesFold_entries_eq_or filesFold_eq_foldl_fileStep parseBundleDir) @@ -120,7 +122,7 @@ empty-or-matching session pre-key `recv` on arbitrary valid wire payloads `body` ∃ Run : Inputs → RunAnswer → Prop, (∀ (γ : GhostName) (tp : BitVec 64), subroutine_ok (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) (mpl.base 617) - (withEntryGuard (F3MemsetMemcpyEntryLrFalse mmpl) + (withEntryGuard (F3C2EntryGuard mpl mmpl) (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits fineCostModel.init stk (cliStaticsPlacedAt mpl) @@ -150,7 +152,7 @@ session pre-key `recv` on both arbitrary parsed wire payloads `body` (`validOver ∃ Run : Inputs → RunAnswer → Prop, (∀ (γ : GhostName) (tp : BitVec 64), subroutine_ok (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) (mpl.base 617) - (withEntryGuard (F3MemsetMemcpyEntryLrFalse mmpl) + (withEntryGuard (F3C2EntryGuard mpl mmpl) (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits fineCostModel.init stk (cliStaticsPlacedAt mpl) @@ -208,7 +210,7 @@ rejection (`R2-D1`). -/ ∃ Run : Inputs → RunAnswer → Prop, (∀ (γ : GhostName) (tp : BitVec 64), subroutine_ok (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) (mpl.base 617) - (withEntryGuard (F3MemsetMemcpyEntryLrFalse mmpl) + (withEntryGuard (F3C2EntryGuard mpl mmpl) (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits fineCostModel.init stk (cliStaticsPlacedAt mpl) @@ -228,7 +230,7 @@ private theorem mainOkParseNoneD3F3G_of_runSem (hS_pksm : ∀ W, (SOf W).pksmParse = pksmParse) (hmainS : mpl.base 547 ≠ 0#64 → ∀ W : CliHooks, ∀ (γ : GhostName) (tp : BitVec 64), subroutine_ok (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) (mpl.base 617) - (withEntryGuard (F3MemsetMemcpyEntryLrFalse mmpl) + (withEntryGuard (F3C2EntryGuard mpl mmpl) (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits fineCostModel.init stk (cliStaticsPlacedAt mpl) @@ -250,7 +252,7 @@ untyped / bad-KEM PreKey rejection (`R2-D1`). -/ ∀ W : CliHooks, ∀ (γ : GhostName) (tp : BitVec 64), subroutine_ok (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) (mpl.base 617) - (withEntryGuard (F3MemsetMemcpyEntryLrFalse mmpl) + (withEntryGuard (F3C2EntryGuard mpl mmpl) (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits fineCostModel.init stk (cliStaticsPlacedAt mpl) @@ -274,7 +276,7 @@ matching-session Path-B pre-key `recv` (`R2-D1`). -/ ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks), ∀ (γ : GhostName) (tp : BitVec 64), subroutine_ok (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) (mpl.base 617) - (withEntryGuard (F3MemsetMemcpyEntryLrFalse mmpl) + (withEntryGuard (F3C2EntryGuard mpl mmpl) (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits fineCostModel.init stk (cliStaticsPlacedAt mpl) @@ -291,7 +293,7 @@ matching-session Path-B pre-key `recv` (`R2-D1`). -/ InitRunSemOk S X ⟨W.C, W.Q⟩ ∧ ∀ (γ : GhostName) (tp : BitVec 64), subroutine_ok (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) (mpl.base 617) - (withEntryGuard (F3MemsetMemcpyEntryLrFalse mmpl) + (withEntryGuard (F3C2EntryGuard mpl mmpl) (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits fineCostModel.init stk (cliStaticsPlacedAt mpl) @@ -309,7 +311,7 @@ private theorem pqRecv_strict_obs_of_f3B2NeedLocksG (H : CliElfF3B2NeedLocksAssumptionsG mpl mmpl exitStk libcAddr stk CodeOk elf) (hmainW : ∀ (γ : GhostName) (tp : BitVec 64), subroutine_ok (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) (mpl.base 617) - (withEntryGuard (F3MemsetMemcpyEntryLrFalse mmpl) + (withEntryGuard (F3C2EntryGuard mpl mmpl) (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk (fineHookRustCliAllocBudget γ mmpl tp elf.brkStart) cliBudgetLimits fineCostModel.init stk (cliStaticsPlacedAt mpl) Run cliProcessInputs))) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/D3MainLiftGlueF3.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/D3MainLiftGlueF3.lean index 7a548186a..e84e654b5 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/D3MainLiftGlueF3.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/D3MainLiftGlueF3.lean @@ -34,6 +34,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Ratchet.Encryp public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.KemDeserializeSlotPlacedBudget import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInstSat import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.CommitOk import LibsignalBinary.Proofs.SignalSession.Cli.Run.Refine @@ -92,8 +93,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Pksm (pksmParse) open CryptoVerification.SignalSession.Cli.RunProofs.Poll (dpPollProgPlaced) open CryptoVerification.SignalSession.Cli.RunRefine (runBounds_pqRecv) open CryptoVerification.SignalSession.Cli.Slots ( - cliGhostExterns_fromUtf8_eq cliGhostExterns_memrchr_eq encodeInjOn_deserializeScopeP_Q - filesOk₀ runEncOk_pqRecv scopeIn scopeKit + encodeInjOn_deserializeScopeP_Q filesOk₀ runEncOk_pqRecv scopeIn scopeKit ) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits RustCliAllocBudget) open LibsignalBinary.Heap.Fine (fineCostModel fineHookRustCliAllocBudget) @@ -126,8 +126,10 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.M24L4BEquiv ( ) open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInst ( - MainEntryBudgetFitsCapOf b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_placed - cliGhostExterns_handleErrorMain cliGhostExterns_strlen domScopedRun + MainEntryBudgetFitsCapOf cliGhostExterns_handleErrorMain domScopedRun +) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInstSat ( + b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_placed_sat ) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced ( MainIoOfPlaced ReadStdinBoundedEnv @@ -193,6 +195,9 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.SkeletonPlacedBudget ( ) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( CliGhostAllocHooks allocContractsFsPlaced_of_hooks + cliGhostExterns_fromUtf8RO_budget_sat cliGhostExterns_fromUtf8_budget_sat + cliGhostExterns_memrchrRO_budget_sat cliGhostExterns_memrchr_budget_sat + cliGhostExterns_strlenRO_budget_sat ) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.KemDeserializeSlotPlacedBudget ( hc_kemDeserialize_placed @@ -457,16 +462,23 @@ theorem mainSubroutineD3F3_of_domScopedRunTight refine hTr W (domScopedRun Dom (runRel S)) fun γ tp => ?_ letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup have hM24 := - b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_placed + b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_placed_sat (ext := fun W' => cliGhostExterns ghFixed (cliExternsPlaced mmpl W')) (W := W) (lim := cliBudgetLimits) hblk hext_nodup hCI Dom S hlibc initFsState_cliProcessInputs_eq (allocContractsFsPlaced_of_hooks mmpl ghFixed W (hG γ tp)) (hioOf γ tp) - (cliGhostExterns_strlen mmpl ghFixed W) - (cliGhostExterns_fromUtf8_eq mmpl ghFixed W) - (cliGhostExterns_memrchr_eq mmpl ghFixed W) + (cliGhostExterns_strlenRO_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG γ tp).extraOk hookStack) + (cliGhostExterns_fromUtf8_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG γ tp).extraOk hookStack) + (cliGhostExterns_fromUtf8RO_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG γ tp).extraOk hookStack) + (cliGhostExterns_memrchr_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG γ tp).extraOk (Nat.le_refl extHookStack) (by decide)) + (cliGhostExterns_memrchrRO_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG γ tp).extraOk (Nat.le_refl extHookStack) (by decide)) (cliGhostExterns_handleErrorMain mmpl ghFixed W) hstk (hfitCap γ tp) (hrun γ tp) exact @@ -571,7 +583,7 @@ private theorem toClosureRunHooksPlaced [LibsignalPlacement] {M : AllocCostModel { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } /-- Establishes `MainOkPathBD3F3`, discharging slot `520` via `decPkPathBSlotOk_full_of_readEnv_placedBudget`. -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/D3MainLiftGlueOverF3.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/D3MainLiftGlueOverF3.lean index e1c3163be..ed99f3391 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/D3MainLiftGlueOverF3.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/D3MainLiftGlueOverF3.lean @@ -36,28 +36,18 @@ set_option maxRecDepth 200000 namespace LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3MainLiftGlueOverF3 -open Arm64 (GhostName Memory State subroutine_ok) +open Arm64 (GhostName Memory subroutine_ok) open Arm64.Obj (MultiPlacement) -open Arm64.Process (ProcessInputs bytesOfString initFsState) -open CryptoVerification (LibsignalPlacement libsignalMutatedBlocks libsignalSessionExterns) +open Arm64.Process (bytesOfString) open CryptoVerification.E2E (PEParams UnreachedPqxdhPrimitives wirePrekey) -open CryptoVerification.LibsignalPublicApi.StoreKit (LibsignalCodeRoLoaded) -open CryptoVerification.LibsignalTripleRatchet (extHookStack) open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) open CryptoVerification.SignalSession - (CliHooks Inputs cliExternsPlaced cliProcessInputs libsignalSessionLib pqRecvInputs strlenHook) -open CryptoVerification.SignalSession.Cli (CliInputsOk RunAnswer StoresGhost cliInputs) + (CliHooks Inputs cliExternsPlaced cliProcessInputs pqRecvInputs) +open CryptoVerification.SignalSession.Cli (RunAnswer) open CryptoVerification.SignalSession.Cli.MainHops - (CallV DomainArgv LsCodeInv RunCall cliIo cliMainStk cliResStack cliWrOk hparse_of_domains - mProgPlaced mainFrameSize parseArgs) + (DomainArgv hparse_of_domains parseArgs) open CryptoVerification.SignalSession.Cli.RunCompose (RunSem runAns runRel runRel_dom) -open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) -open LibsignalBinary.Heap (AllocEvent BudgetLimits FitsEvents rustAllocEvents) -open LibsignalBinary.Heap.Fine (FineBudget fineCostModel fineHookRustCliAllocBudget) -open LibsignalBinary.Proofs.PeakBudget.CliRunArmsPeak (CliRunCalleeEnvs) -open LibsignalBinary.Proofs.PeakBudget.MainResidualFitsEnv (mainSt4 mainSt5) -open LibsignalBinary.Proofs.PeakBudget.RealMainBinaryEnvAdapterD3 - (CliPqOrD3RecvDom mainSt01Dom_of_st0 mainSt0Dom mainSt1Dom mainSt2Dom mainSt3Dom) +open LibsignalBinary.Heap.Fine (fineCostModel fineHookRustCliAllocBudget) open LibsignalBinary.Proofs.SignalSession.Cli.D3.Budget.D3NonCanonValidOverPlacedBudget (cliRunSemOverV4 pqD3ScopedRun runRel_pqRecv_canonicalNoMatch runRel_pqRecv_validOver) open LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3NonCanonF3 @@ -67,26 +57,6 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 (MainOkCliF3OverB2NeedLocksPlacedAt b2MainSpecTightNeedLocksFineAt cliBudgetLimits) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt cliStaticsPlacedAt) -open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.M24L4BEquiv - (subroutine_ok_b2MainSpecTightNeedLocksFineAt_iff) -open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) -open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInst - (MainEntryBudgetFitsCap - b2MainSpecTightNeedLocksFineAt_cliExterns_of_runTight_and_budgetFitsCap_lsmpl - b2MainSpecTightNeedLocksFineAt_cliGhostExterns_of_runTight_and_budgetFitsCap_lsmpl - cliGhostExterns_strlen) -open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced - (MainIoBoundedPlaced ReadStdinBoundedEnv) -open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainOkCliExtB2NeedLocksInst - (B2MainRemainingHops b2MainSpecTightNeedLocksFineAt_of_runTight_lsmpl - initFsState_cliProcessInputs_eq) -open LibsignalBinary.Proofs.SignalSession.Cli.Main.HopsPlacedBudget (runSpecTightPlaced) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Compose.RunOkPlacedBudget (RunEnv) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (CliGhostAllocHooks allocContractsFsPlaced_of_hooks) -open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget - (AllocContractsFsPlaced MainIoPlaced) -open VerifiedLibraries.Mallocng (mallocngAddrsOfPlacement) /-! ## 1. Pure `pqD3ScopedRun` & `cliRunSemOverV4` Clauses -/ @@ -159,570 +129,4 @@ theorem mainOkCliF3Over_of_mainSubroutine MainOkCliF3OverB2NeedLocksPlacedAt mpl mmpl CodeOk libcAddr brkStart stk := mainOkCliF3Over_of_mainOkOverD3F3 (mainOkOverD3F3_of_mainSubroutine hmain) -/-! ## 2. Shared `[LibsignalPlacement]`-Free `(mpl, mmpl)` `579 → 617` Lifts into `F3.L4B` -/ - -/-- Block-`617` ghost-to-linked `cliExternsPlaced mmpl` transfer predicate. -/ -abbrev Block617GhostToLinkedAt - (mpl mmpl : MultiPlacement) (ghOf : CliHooks → CliGhostHooks) - (CodeOk : Memory → Prop) (libcAddr brkStart : BitVec 64) - (lim : BudgetLimits) (stk : Nat) (W : CliHooks) - (γ : GhostName) (tp : BitVec 64) - (Run : Inputs → RunAnswer → Prop) (inputsOf : Inputs → ProcessInputs) : Prop := - subroutine_ok - (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (ghOf W') (cliExternsPlaced mmpl W')) 617 W) - (mpl.base 617) - (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim fineCostModel.init stk (cliStaticsPlacedAt mpl) Run inputsOf) → - subroutine_ok (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) (mpl.base 617) - (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim fineCostModel.init stk (cliStaticsPlacedAt mpl) Run inputsOf) - -/-- Generic `[LibsignalPlacement]`-free `(mpl, mmpl)` `579 → 617` lift into -`b2MainSpecTightNeedLocksFineAt`. -/ -theorem b2MainSpecTightNeedLocksFineAt_f3_of_runTight_placed - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - {ext : CliHooks → String → Option (State → State)} - {W : CliHooks} {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} - {γ : GhostName} {tp : BitVec 64} - {St0 : Inputs → FineBudget → Prop} - {St1 : Inputs → FineBudget → Prop} - {St2 : Inputs → CallV → FineBudget → Prop} - {St3 : Inputs → CallV → FineBudget → Prop} - {St4 : Inputs → CallV → StoresGhost → FineBudget → Prop} - {St5 : Inputs → CallV → StoresGhost → Bool → FineBudget → Prop} - {RunEnv : RunCall → List AllocEvent → Prop} - {Run : Inputs → RunAnswer → Prop} {inputsOf : Inputs → ProcessInputs} - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hfs_eq : ∀ i : Inputs, initFsState (inputsOf i) = initFsState (cliInputs i)) - (hparse : ∀ i a, Run i a → (parseArgs uuidTryParse (i.argv.map bytesOfString)).isSome) - (hstrlen_row : ext W "strlen" = some strlenHook) - (hc_alloc : @AllocContractsFsPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W)) - (hSt0 : ∀ i : Inputs, CliInputsOk i → St0 i fineCostModel.init) - (hSt01 : ∀ {i : Inputs}, CliInputsOk i → St0 i fineCostModel.init → i.argv ≠ [] → - FitsEvents fineCostModel lim fineCostModel.init (rustAllocEvents (16 * i.argv.length) 8) ∧ - St1 i (fineCostModel.stepEvents (rustAllocEvents (16 * i.argv.length) 8) fineCostModel.init)) - (hrun : @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) (ext W)) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim RunEnv uuidTryParse Run - cliWrOk cliResStack)) - (hhops : @B2MainRemainingHops (libsignalPlacementOf mpl hblk hext_nodup) - CodeOk mmpl ext W brkStart lim γ tp St1 St2 St3 St4 St5 RunEnv Run) : - subroutine_ok (cliProgExtPlacedAt mpl ext 617 W) (mpl.base 617) - (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim fineCostModel.init cliMainStk (cliStaticsPlacedAt mpl) Run inputsOf) := by - letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup - letI : LsCodeInv CodeOk := hCI - exact (subroutine_ok_b2MainSpecTightNeedLocksFineAt_iff mpl ext 617 W (mpl.base 617) - libcAddr CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim fineCostModel.init - cliMainStk (cliStaticsPlacedAt mpl) Run inputsOf).mp - (b2MainSpecTightNeedLocksFineAt_of_runTight_lsmpl - hlibc hfs_eq hparse hstrlen_row hc_alloc hSt0 hSt01 hrun hhops) - -/-- Specializes `b2MainSpecTightNeedLocksFineAt_f3_of_runTight_placed` to -`mainSt0Dom..mainSt3Dom Dom E lim` and `mainSt4`/`mainSt5`. -/ -theorem b2MainSpecTightNeedLocksFineAt_f3_of_d3MainSt0Dom_placed - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - {ext : CliHooks → String → Option (State → State)} - {W : CliHooks} {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} - {γ : GhostName} {tp : BitVec 64} - (Dom : Inputs → Prop) (E : RunCall → CliRunCalleeEnvs) - {RunEnv : RunCall → List AllocEvent → Prop} - {Run : Inputs → RunAnswer → Prop} - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hparse : ∀ i a, Run i a → (parseArgs uuidTryParse (i.argv.map bytesOfString)).isSome) - (hstrlen_row : ext W "strlen" = some strlenHook) - (hc_alloc : @AllocContractsFsPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W)) - (hSt0 : ∀ i : Inputs, CliInputsOk i → mainSt0Dom Dom E lim i fineCostModel.init) - (hrun : @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) (ext W)) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim RunEnv uuidTryParse Run - cliWrOk cliResStack)) - (hhops : @B2MainRemainingHops (libsignalPlacementOf mpl hblk hext_nodup) - CodeOk mmpl ext W brkStart lim γ tp - (mainSt1Dom Dom E lim) (mainSt2Dom Dom E lim) (mainSt3Dom Dom E lim) - (mainSt4 lim) (mainSt5 lim) RunEnv Run) : - subroutine_ok (cliProgExtPlacedAt mpl ext 617 W) (mpl.base 617) - (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim fineCostModel.init cliMainStk (cliStaticsPlacedAt mpl) Run cliProcessInputs) := - b2MainSpecTightNeedLocksFineAt_f3_of_runTight_placed hblk hext_nodup hCI - hlibc initFsState_cliProcessInputs_eq hparse hstrlen_row hc_alloc hSt0 - (fun hok hst0 hne => mainSt01Dom_of_st0 hok hst0 hne) hrun hhops - -/-- Specializes `b2MainSpecTightNeedLocksFineAt_f3_of_d3MainSt0Dom_placed` to -`cliGhostExterns`, discharging `strlen` and allocator contracts from `CliGhostAllocHooks`. -/ -theorem b2MainSpecTightNeedLocksFineAt_f3_cliGhostExterns_of_d3MainSt0Dom_placed - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {W : CliHooks} {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} - {γ : GhostName} {tp : BitVec 64} - (Dom : Inputs → Prop) (E : RunCall → CliRunCalleeEnvs) - {RunEnv : RunCall → List AllocEvent → Prop} - {Run : Inputs → RunAnswer → Prop} - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hparse : ∀ i a, Run i a → (parseArgs uuidTryParse (i.argv.map bytesOfString)).isSome) - (hG : @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hSt0 : ∀ i : Inputs, CliInputsOk i → mainSt0Dom Dom E lim i fineCostModel.init) - (hrun : @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim RunEnv uuidTryParse Run - cliWrOk cliResStack)) - (hhops : @B2MainRemainingHops (libsignalPlacementOf mpl hblk hext_nodup) - CodeOk mmpl (fun W' => cliGhostExterns (ghOf W') (cliExternsPlaced mmpl W')) W - brkStart lim γ tp - (mainSt1Dom Dom E lim) (mainSt2Dom Dom E lim) (mainSt3Dom Dom E lim) - (mainSt4 lim) (mainSt5 lim) RunEnv Run) : - subroutine_ok - (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (ghOf W') (cliExternsPlaced mmpl W')) 617 W) - (mpl.base 617) - (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim fineCostModel.init cliMainStk (cliStaticsPlacedAt mpl) Run cliProcessInputs) := by - letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup - exact b2MainSpecTightNeedLocksFineAt_f3_of_d3MainSt0Dom_placed hblk hext_nodup hCI - Dom E hlibc hparse - (cliGhostExterns_strlen mmpl (ghOf W) W) - (allocContractsFsPlaced_of_hooks mmpl (ghOf W) W hG) - hSt0 hrun hhops - -theorem b2MainSpecTightNeedLocksFineAt_f3_cliGhostExterns_of_d3MainSt0Dom_linked_placed - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {W : CliHooks} {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} - {γ : GhostName} {tp : BitVec 64} - (Dom : Inputs → Prop) (E : RunCall → CliRunCalleeEnvs) - {RunEnv : RunCall → List AllocEvent → Prop} - {Run : Inputs → RunAnswer → Prop} - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hparse : ∀ i a, Run i a → (parseArgs uuidTryParse (i.argv.map bytesOfString)).isSome) - (hG : @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hSt0 : ∀ i : Inputs, CliInputsOk i → mainSt0Dom Dom E lim i fineCostModel.init) - (hrun : @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim RunEnv uuidTryParse Run - cliWrOk cliResStack)) - (hhops : @B2MainRemainingHops (libsignalPlacementOf mpl hblk hext_nodup) - CodeOk mmpl (fun W' => cliGhostExterns (ghOf W') (cliExternsPlaced mmpl W')) W - brkStart lim γ tp - (mainSt1Dom Dom E lim) (mainSt2Dom Dom E lim) (mainSt3Dom Dom E lim) - (mainSt4 lim) (mainSt5 lim) RunEnv Run) - (hTransfer617 : Block617GhostToLinkedAt mpl mmpl ghOf CodeOk libcAddr brkStart lim - cliMainStk W γ tp Run cliProcessInputs) : - subroutine_ok (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) (mpl.base 617) - (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim fineCostModel.init cliMainStk (cliStaticsPlacedAt mpl) Run cliProcessInputs) := - hTransfer617 - (b2MainSpecTightNeedLocksFineAt_f3_cliGhostExterns_of_d3MainSt0Dom_placed hblk hext_nodup hCI - ghOf Dom E hlibc hparse hG hSt0 hrun hhops) - -/-- Lifts a Block-`579` `runSpecTightPlaced` contract and `MainEntryBudgetFitsCap` on -`cliGhostExterns` to `b2MainSpecTightNeedLocksFineAt`. -/ -theorem b2MainSpecTightNeedLocksFineAt_f3_cliGhostExterns_of_budgetFitsCap_placed - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {W : CliHooks} {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} - {γ : GhostName} {tp : BitVec 64} {hookStack : Nat} - {RunEnv : RunCall → List AllocEvent → Prop} - {Run : Inputs → RunAnswer → Prop} - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hparse : ∀ i a, Run i a → (parseArgs uuidTryParse (i.argv.map bytesOfString)).isSome) - (hG : @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hio : @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack) - (hioBounded : @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : MainEntryBudgetFitsCap fineCostModel lim fineCostModel.init cliIo uuidTryParse - RunEnv Run) - (hrun : @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim RunEnv uuidTryParse Run - cliWrOk cliResStack)) : - subroutine_ok - (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (ghOf W') (cliExternsPlaced mmpl W')) 617 W) - (mpl.base 617) - (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim fineCostModel.init cliMainStk (cliStaticsPlacedAt mpl) Run cliProcessInputs) := by - letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup - letI : LsCodeInv CodeOk := hCI - exact (subroutine_ok_b2MainSpecTightNeedLocksFineAt_iff mpl - (fun W' => cliGhostExterns (ghOf W') (cliExternsPlaced mmpl W')) 617 W (mpl.base 617) - libcAddr CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim fineCostModel.init - cliMainStk (cliStaticsPlacedAt mpl) Run cliProcessInputs).mp - (b2MainSpecTightNeedLocksFineAt_cliGhostExterns_of_runTight_and_budgetFitsCap_lsmpl - mmpl ghOf W hlibc initFsState_cliProcessInputs_eq hparse hG hio hioBounded hstk hfitCap hrun) - -theorem b2MainSpecTightNeedLocksFineAt_f3_cliGhostExterns_of_budgetFitsCap_linked_placed - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {W : CliHooks} {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} - {γ : GhostName} {tp : BitVec 64} {hookStack : Nat} - {RunEnv : RunCall → List AllocEvent → Prop} - {Run : Inputs → RunAnswer → Prop} - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hparse : ∀ i a, Run i a → (parseArgs uuidTryParse (i.argv.map bytesOfString)).isSome) - (hG : @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hio : @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack) - (hioBounded : @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : MainEntryBudgetFitsCap fineCostModel lim fineCostModel.init cliIo uuidTryParse - RunEnv Run) - (hrun : @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim RunEnv uuidTryParse Run - cliWrOk cliResStack)) - (hTransfer617 : Block617GhostToLinkedAt mpl mmpl ghOf CodeOk libcAddr brkStart lim - cliMainStk W γ tp Run cliProcessInputs) : - subroutine_ok (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) (mpl.base 617) - (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim fineCostModel.init cliMainStk (cliStaticsPlacedAt mpl) Run cliProcessInputs) := - hTransfer617 - (b2MainSpecTightNeedLocksFineAt_f3_cliGhostExterns_of_budgetFitsCap_placed hblk hext_nodup hCI - ghOf hlibc hparse hG hio hioBounded hstk hfitCap hrun) - -theorem b2MainSpecTightNeedLocksFineAt_f3_cliExterns_of_budgetFitsCap_placed - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - {W : CliHooks} {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} - {γ : GhostName} {tp : BitVec 64} {hookStack : Nat} - {RunEnv : RunCall → List AllocEvent → Prop} - {Run : Inputs → RunAnswer → Prop} - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hparse : ∀ i a, Run i a → (parseArgs uuidTryParse (i.argv.map bytesOfString)).isSome) - (hFs : @AllocContractsFsPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliExternsPlaced mmpl W)) - (hio : @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliExternsPlaced mmpl W) cliIo hookStack) - (hioBounded : @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliExternsPlaced mmpl W) cliIo hookStack - ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : MainEntryBudgetFitsCap fineCostModel lim fineCostModel.init cliIo uuidTryParse - RunEnv Run) - (hrun : @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) (cliExternsPlaced mmpl W)) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim RunEnv uuidTryParse Run - cliWrOk cliResStack)) : - subroutine_ok (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) (mpl.base 617) - (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim fineCostModel.init cliMainStk (cliStaticsPlacedAt mpl) Run cliProcessInputs) := by - letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup - letI : LsCodeInv CodeOk := hCI - exact (subroutine_ok_b2MainSpecTightNeedLocksFineAt_iff mpl (cliExternsPlaced mmpl) 617 W - (mpl.base 617) libcAddr CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - fineCostModel.init cliMainStk (cliStaticsPlacedAt mpl) Run cliProcessInputs).mp - (b2MainSpecTightNeedLocksFineAt_cliExterns_of_runTight_and_budgetFitsCap_lsmpl - mmpl W hlibc initFsState_cliProcessInputs_eq hparse hFs hio hioBounded hstk hfitCap hrun) - -/-! ## 3. Concrete `MainOkOverD3F3` & `MainOkCliF3OverB2NeedLocksPlacedAt` Assemblers -/ - -/-- `CodeOk`-generic `MainOkOverD3F3` assembler from Block-`579` `hrun` and `mainSt0Dom`. -/ -theorem mainOkOverD3F3_of_hrun_and_d3MainSt0Dom - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} - (E : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → CliRunCalleeEnvs) - (RunEnvOf : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - cliBudgetLimits (ghOf W)) - (hSt0 : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) - (i : Inputs), - CliInputsOk i → - mainSt0Dom (CliPqOrD3RecvDom ⟨W.C, W.Q⟩) (E X W γ tp) cliBudgetLimits i - fineCostModel.init) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (RunEnvOf X W γ tp) uuidTryParse - (pqD3ScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemOverV4 X W))) - cliWrOk cliResStack)) - (hhops : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @B2MainRemainingHops (libsignalPlacementOf mpl hblk hext_nodup) - CodeOk mmpl (fun W' => cliGhostExterns (ghOf W') (cliExternsPlaced mmpl W')) W - brkStart cliBudgetLimits γ tp - (mainSt1Dom (CliPqOrD3RecvDom ⟨W.C, W.Q⟩) (E X W γ tp) cliBudgetLimits) - (mainSt2Dom (CliPqOrD3RecvDom ⟨W.C, W.Q⟩) (E X W γ tp) cliBudgetLimits) - (mainSt3Dom (CliPqOrD3RecvDom ⟨W.C, W.Q⟩) (E X W γ tp) cliBudgetLimits) - (mainSt4 cliBudgetLimits) (mainSt5 cliBudgetLimits) - (RunEnvOf X W γ tp) - (pqD3ScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemOverV4 X W)))) - (hTransfer617 : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - Block617GhostToLinkedAt mpl mmpl ghOf CodeOk libcAddr brkStart cliBudgetLimits - cliMainStk W γ tp (pqD3ScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemOverV4 X W))) - cliProcessInputs) : - MainOkOverD3F3 mpl mmpl CodeOk libcAddr brkStart cliMainStk := - mainOkOverD3F3_of_mainSubroutine fun h547 X W γ tp => - b2MainSpecTightNeedLocksFineAt_f3_cliGhostExterns_of_d3MainSt0Dom_linked_placed - hblk hext_nodup hCI ghOf (CliPqOrD3RecvDom ⟨W.C, W.Q⟩) (E X W γ tp) - hlibc pqD3ScopedRun_parse_isSome (hG W γ tp) - (hSt0 h547 X W γ tp) (hrun h547 X W γ tp) (hhops h547 X W γ tp) - (hTransfer617 h547 X W γ tp) - -theorem mainOkCliF3Over_of_hrun_and_d3MainSt0Dom - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} - (E : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → CliRunCalleeEnvs) - (RunEnvOf : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - cliBudgetLimits (ghOf W)) - (hSt0 : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) - (i : Inputs), - CliInputsOk i → - mainSt0Dom (CliPqOrD3RecvDom ⟨W.C, W.Q⟩) (E X W γ tp) cliBudgetLimits i - fineCostModel.init) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (RunEnvOf X W γ tp) uuidTryParse - (pqD3ScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemOverV4 X W))) - cliWrOk cliResStack)) - (hhops : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @B2MainRemainingHops (libsignalPlacementOf mpl hblk hext_nodup) - CodeOk mmpl (fun W' => cliGhostExterns (ghOf W') (cliExternsPlaced mmpl W')) W - brkStart cliBudgetLimits γ tp - (mainSt1Dom (CliPqOrD3RecvDom ⟨W.C, W.Q⟩) (E X W γ tp) cliBudgetLimits) - (mainSt2Dom (CliPqOrD3RecvDom ⟨W.C, W.Q⟩) (E X W γ tp) cliBudgetLimits) - (mainSt3Dom (CliPqOrD3RecvDom ⟨W.C, W.Q⟩) (E X W γ tp) cliBudgetLimits) - (mainSt4 cliBudgetLimits) (mainSt5 cliBudgetLimits) - (RunEnvOf X W γ tp) - (pqD3ScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemOverV4 X W)))) - (hTransfer617 : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - Block617GhostToLinkedAt mpl mmpl ghOf CodeOk libcAddr brkStart cliBudgetLimits - cliMainStk W γ tp (pqD3ScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemOverV4 X W))) - cliProcessInputs) : - MainOkCliF3OverB2NeedLocksPlacedAt mpl mmpl CodeOk libcAddr brkStart cliMainStk := - mainOkCliF3Over_of_mainOkOverD3F3 - (mainOkOverD3F3_of_hrun_and_d3MainSt0Dom hblk hext_nodup hCI ghOf E RunEnvOf - hlibc hG hSt0 hrun hhops hTransfer617) - -/-- `CodeOk`-generic `MainOkOverD3F3` assembler from Block-`579` `hrun` and -`MainEntryBudgetFitsCap`. -/ -theorem mainOkOverD3F3_of_hrun_and_budgetFitsCap - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {hookStack : Nat} - (RunEnvOf : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - cliBudgetLimits (ghOf W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - MainEntryBudgetFitsCap fineCostModel cliBudgetLimits fineCostModel.init cliIo uuidTryParse - (RunEnvOf X W γ tp) - (pqD3ScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemOverV4 X W)))) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (RunEnvOf X W γ tp) uuidTryParse - (pqD3ScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemOverV4 X W))) - cliWrOk cliResStack)) - (hTransfer617 : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - Block617GhostToLinkedAt mpl mmpl ghOf CodeOk libcAddr brkStart cliBudgetLimits - cliMainStk W γ tp (pqD3ScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemOverV4 X W))) - cliProcessInputs) : - MainOkOverD3F3 mpl mmpl CodeOk libcAddr brkStart cliMainStk := - mainOkOverD3F3_of_mainSubroutine fun h547 X W γ tp => - b2MainSpecTightNeedLocksFineAt_f3_cliGhostExterns_of_budgetFitsCap_linked_placed - hblk hext_nodup hCI ghOf hlibc pqD3ScopedRun_parse_isSome - (hG W γ tp) (hio W γ tp) (hioBounded W γ tp) hstk - (hfitCap h547 X W γ tp) (hrun h547 X W γ tp) (hTransfer617 h547 X W γ tp) - -theorem mainOkCliF3Over_of_hrun_and_budgetFitsCap - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {hookStack : Nat} - (RunEnvOf : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - cliBudgetLimits (ghOf W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - MainEntryBudgetFitsCap fineCostModel cliBudgetLimits fineCostModel.init cliIo uuidTryParse - (RunEnvOf X W γ tp) - (pqD3ScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemOverV4 X W)))) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (RunEnvOf X W γ tp) uuidTryParse - (pqD3ScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemOverV4 X W))) - cliWrOk cliResStack)) - (hTransfer617 : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - Block617GhostToLinkedAt mpl mmpl ghOf CodeOk libcAddr brkStart cliBudgetLimits - cliMainStk W γ tp (pqD3ScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemOverV4 X W))) - cliProcessInputs) : - MainOkCliF3OverB2NeedLocksPlacedAt mpl mmpl CodeOk libcAddr brkStart cliMainStk := - mainOkCliF3Over_of_mainOkOverD3F3 - (mainOkOverD3F3_of_hrun_and_budgetFitsCap hblk hext_nodup hCI ghOf RunEnvOf - hlibc hG hio hioBounded hstk hfitCap hrun hTransfer617) - end LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3MainLiftGlueOverF3 diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/H7OverD3SlotDom0BridgePostBobProducerAux.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/H7OverD3SlotDom0BridgePostBobProducerAux.lean index 02874cde0..04022f96f 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/H7OverD3SlotDom0BridgePostBobProducerAux.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/H7OverD3SlotDom0BridgePostBobProducerAux.lean @@ -827,7 +827,7 @@ private theorem h7pb_closure_pathCOver_p4_d3_cont_at_b_placedBudget [LibsignalPl LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, hh.utf8, hh.memrchr, - hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, hh.blackBox⟩ have hf' : s'.fs.files = y.g.F := (cliFiles_eq_of_trace_eq_placed hh hsteps2' (htr'.trans htr2.symm)).trans hfiles2 have hsub64 : dpClosSubStack B ≤ 2 ^ 64 := by @@ -2225,7 +2225,8 @@ theorem h7pb_decPk_d3_validOver_poll_ofVerNe_at_b_at_full_placedBudget' [Libsign LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, - hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, + hh.blackBox⟩ let σ := cliKitStk B let pid := pmPreKeyId y.g.msg let sid := y.g.msg.signedPreKeyId diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/H7RAVerNeRawSlot520.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/H7RAVerNeRawSlot520.lean index 88775a040..e31b4a52d 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/H7RAVerNeRawSlot520.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/H7RAVerNeRawSlot520.lean @@ -36,6 +36,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey. public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1KitsPlacedBudgetAux public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage4V1InstPlacedBudget public import LibsignalBinary.Proofs.SpqrV1.Top.InitialState.DefsPlacedBudget +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.InitBobErrOwnedPlacedBudget @@ -125,7 +126,7 @@ open CryptoVerification.SignalSession.Cli.MainHops ( open CryptoVerification.SignalSession.Cli.Run.Placed (lsProg_579) open CryptoVerification.SignalSession.Cli.RunCompose (DecPkGhost RunSem dpPollNeed) open CryptoVerification.SignalSession.Cli.RunGlue ( - CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other withPanics_cliGhostExterns + CliGhostHooks cliGhostExterns withPanics_cliGhostExterns ) open CryptoVerification.SignalSession.Cli.RunProofs ( SessMatchesPm cliDecryptPrekeyNeed dpWrapFrame pkStoreKeys pkToE? pmOfE @@ -149,7 +150,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( ) open CryptoVerification.SignalSession.Cli.RunSkeleton (CalleeSlot.OkPlaced RunBudgets) open CryptoVerification.SignalSession.Cli.Slots ( - FilesOkPeer blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced + FilesOkPeer cliGhostExterns_sat_of_cliExternsPlaced encodeInjOn_deserializeScopeP_Q loadRec scopeIn scopeKit ) open LibsignalBinary.Heap ( @@ -168,7 +169,7 @@ open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Mid3Place ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget ( InitializeBobV1OptFieldsEnv StageP2BaseCalleesPlaced4K.of_hooks - initializeBobSession_ok_v1_of_env_4k_frozen_placed_on_stageP1 isSameAccount_4k_placed_ok_on_stageP1 + initializeBobSession_ok_v1_of_env_4k_frozen_placed_on_stageP1 p2_errOwned_frozen_to_defs4K_placed ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2V1PlacedBudget ( @@ -603,10 +604,8 @@ private theorem h7ra_cliStageP2BaseCalleesPlaced4K [LibsignalPlacement] {M : All hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_p2Memcpy4K_of_vm hh.codecHooks.memcpy) - (isSameAccount_4k_placed_ok_on_stageP1 - ((cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W))) + (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat.isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) private theorem h7ra_cliInitBobV1FrozenOkPlaced4K [LibsignalFullPlacement] {M : AllocCostModel} @@ -781,8 +780,8 @@ theorem h7ra_stageP2Over_archive_at_cliRunBudgets_frozen_ok [LibsignalFullPlacem LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh0.alloc, hh0.allocFs, hh0.panics, hh0.memcpyRO, hh0.bcmp, hh0.fs, hh0.utf8, hh0.memrchr, - hh0.codecHooks, hh0.allocZeroed, hh0.stringClone, hh0.formatInner⟩ - have hPromMiss := cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + hh0.codecHooks, hh0.allocZeroed, hh0.stringClone, hh0.formatInner, hh0.blackBox⟩ + have hPromMiss := cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W hh.blackBox have hPromOver := cliPromoteOverGen_archive_placed_ok mmpl gh W hh hGrow hRaw subst hg1 rcases hregs1 with ⟨hx8, hx9, hx10, hx11, hx12, hx13, hx14, hx15, hx16, diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/H9PathBAssemblyG2.lean b/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/H9PathBAssemblyG2.lean index 359b1472a..55df03237 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/H9PathBAssemblyG2.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/D3/F3/H9PathBAssemblyG2.lean @@ -367,7 +367,7 @@ private theorem h9g_toClosureRunHooksPlaced [LibsignalPlacement] {M : AllocCostM { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } /-- Lifts `decPkPathBSlotOk_full_of_readEnv_placedBudget` to `(slotsOfSigPkFrozenPlaced …).decryptPrekey.OkPlaced` at `cliRunSemPathB X W`. -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/F3/HInit/CliInitSlotOkPlacedAt.lean b/LibsignalBinary/Proofs/SignalSession/Cli/F3/HInit/CliInitSlotOkPlacedAt.lean index fc40f3da3..6f498c9f0 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/F3/HInit/CliInitSlotOkPlacedAt.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/F3/HInit/CliInitSlotOkPlacedAt.lean @@ -20,6 +20,7 @@ public import LibsignalBinary.Specifications.SignalSession.CliBinaryPq public meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.Common.SharedHelpers import LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.ModelBridge +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat import LibsignalBinary.Proofs.SpecLemmas.SyscallReadWritev import Arm64.Trusted.Spec.Hoare @@ -92,7 +93,8 @@ open CryptoVerification.SignalSession.Cli.MainHops (cliIo cliRunBudgets cliWrOk) open CryptoVerification.SignalSession.Cli.Placed (lsProg_542 lsProg_543 lsProg_569 lsProg_586 lsProg_589) open CryptoVerification.SignalSession.Cli.Run.Placed (instIsLsBlockProg_579 lsProg_579) open CryptoVerification.SignalSession.Cli.RunCompose (InitGhost RunNeeds RunSem mkSlot) -open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks IsFsC cliGhostExterns) +open CryptoVerification.SignalSession.Cli.RunGlue + (CliGhostHooks IsFsC cliGhostExterns cliGhostExternsWithExtra) open CryptoVerification.SignalSession.Cli.RunProofs (InitOk₀ cliInitiateFrame cliInitiateNeed initDef padCoins) open CryptoVerification.SignalSession.Cli.RunProofs.Initiate @@ -113,6 +115,8 @@ open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudgetSat (expand_multi_info_placed_vm_ok_of_other_block_sat) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudget (pqxdhHkdfExpandMultiInfo_placed_ok pqxdhHkdfExtract_placed_ok) +open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat + (calculateAgreement_placed_ok_unconditional_sat) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat (extract_placed_vm_ok_of_other_block_sat pqxdhHkdfExpandMultiInfo_placed_ok_sat pqxdhHkdfExtract_placed_ok_sat) @@ -127,9 +131,9 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadFileBudgetPlaced open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.SessionKitOkCliPlacedBudget (cliAddrText_placed_ok cliDirGet_placed_ok cliGrowOneDir_placed_ok) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.CliSlotCalleesInstPlacedBudgetAux - (cliExistingStoreCalleesEnvs w3HkdfExtract40_cro_placed_ok w3IsSameAccount_placed_ok) + (cliExistingStoreCalleesEnvs w3HkdfExtract40_cro_placed_ok w3IsSameAccount_placed_ok_of_bb_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.CliSlotCalleesInstPlacedBudgetSeams - (CliSlotEnvs SpqrV1PlacedSeamsBudget cliDirPutStrNeedPlaced cliGhostExterns_blackBox_eq) + (CliSlotEnvs SpqrV1PlacedSeamsBudget cliDirPutStrNeedPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Compose.SemPlacedBudget (RunSlotEnvs slotsOfPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.AssemblyPlacedBudget @@ -176,11 +180,12 @@ open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (dirGetSpecPlaced dirPutSpecPlaced dirPutStrSpecPlaced readFileSpecPlaced sessDeserializeSpecPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePollPlacedBudget - (idSavePoll_placed_ok_of_deps) + (idSavePoll_placed_ok_of_deps_16) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSaveShimPlacedBudget (idSaveShim_placed_ok_of_deps) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudget - (idTrustPoll_placed_ok_of_deps identityKey_decode_placed_ok publicKeyEq_placed_ok_of_bb) + (idTrustPoll_placed_ok_of_deps_16 identityKey_decode_placed_ok + publicKeyEq_mem_placed_ok_of_bb_16_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustShimPlacedBudget (idTrustShim_placed_ok_of_deps) open LibsignalBinary.Proofs.SignalSession.Cli.Store.LoadPollPlacedBudget @@ -865,27 +870,16 @@ theorem tableNoAllocFailed_cliHookTablePlaced (mmpl : Obj.MultiPlacement) (W : C rcases hp with hpq | hcli · exact tableNoAllocFailed_cliPqxdhPlaced mmpl W.C W.Q p hpq · simp only [List.mem_cons, List.not_mem_nil, or_false] at hcli - rcases hcli with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | - rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl - · exact noAllocFailed_hookMemmove - · exact noAllocFailed_cliBcmpHook W.bcmp - · exact noAllocFailed_strlenHook + rcases hcli with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl · exact noAllocFailed_writeFileHook · exact noAllocFailed_writeStdoutHook - · exact noAllocFailed_memrchrHook - · exact noAllocFailed_fromUtf8Hook W.utf8Err · exact noAllocFailed_fmtWriteHook0 · exact fun _ => traceDeltaNoAllocFailed_of_eq rfl - · exact noAllocFailed_durationSinceExactHook - · exact noAllocFailed_timeAddHook - · exact noAllocFailed_blackBoxHook · exact fun _ => traceDeltaNoAllocFailed_of_eq rfl · exact aesEncHookMallocng_noAllocFailed mmpl W.C.E · exact aesDecHookMallocng_noAllocFailed mmpl W.C.D · exact fun _ => traceDeltaNoAllocFailed_of_eq rfl · exact fun _ => traceDeltaNoAllocFailed_of_eq rfl - · exact fun _ => traceDeltaNoAllocFailed_of_eq rfl - · exact fun _ => traceDeltaNoAllocFailed_of_eq rfl /-- Every hook in `cliExternsPlaced mmpl W` satisfies `HookNoAllocFailed`. -/ theorem externNoAllocFailed_cliExternsPlaced (mmpl : Obj.MultiPlacement) (W : CliHooks) : @@ -904,7 +898,7 @@ theorem cliGhostExterns_mem_or_base (gh : CliGhostHooks) (baseExt : LibsignalHoo (sym : String) (f : State → State) (h : cliGhostExterns gh baseExt sym = some f) : cliGhostExterns gh (fun _ => none) sym = some f ∨ baseExt sym = some f := by - unfold cliGhostExterns at h ⊢ + unfold cliGhostExterns cliGhostExternsWithExtra at h ⊢ repeat' split all_goals simp_all @@ -1062,7 +1056,7 @@ theorem w3Exist_placed_ok_of_ghost [LibsignalPlacement] {M : AllocCostModel} (fun _ hp => hp.2) hh hRead589 (by decide) (by decide) have hPutStr : subroutine_ok (lsProg_543 (cliGhostExterns gh' (cliExternsPlaced mmpl W))) (lsmpl.base 543) (dirPutStrSpecPlaced A lim DirPutStrEnv cliDirPutStrNeedPlaced) := - dirPutStr_placed_ok_of_deps hh.alloc hh.panics hh.memcpyRO hh.bcmp + dirPutStr_placed_ok_of_deps hh.alloc hh.panics hh.memcpyRO hh.bcmp.of_keepsFs (growProg := lsProg_586 (cliGhostExterns gh' (cliExternsPlaced mmpl W))) (jGrow := 586) (by decide) (by decide) (cliGrowOneDir_placed_ok hh.alloc hh.panics) (Nat.le_refl cliDirPutStrNeedPlaced) @@ -1070,11 +1064,11 @@ theorem w3Exist_placed_ok_of_ghost [LibsignalPlacement] {M : AllocCostModel} (lsmpl.base 542) (dirPutSpecPlaced A lim DirPutEnv cliDirPutStk) := dirPut_placed_caller_ok_of_deps (callerProg := lsProg_542 (cliGhostExterns gh' (cliExternsPlaced mmpl W))) (i := 542) - hh.alloc hh.bcmp + hh.alloc hh.bcmp.of_keepsFs (growProg := lsProg_586 (cliGhostExterns gh' (cliExternsPlaced mmpl W))) (jGrow := 586) (by decide) (by decide) (cliGrowOneDir_placed_ok hh.alloc hh.panics) (Nat.le_refl dirPutNeedPlaced) (by decide) - have hEq := publicKeyEq_placed_ok_of_bb (cliGhostExterns_blackBox_eq mmpl gh' W) + have hEq := publicKeyEq_mem_placed_ok_of_bb_16_sat hh.blackBox have hDec := identityKey_decode_placed_ok (A := A) (cliGhostExterns gh' (cliExternsPlaced mmpl W)) exact { dirGet := hGet @@ -1088,7 +1082,7 @@ theorem w3Exist_placed_ok_of_ghost [LibsignalPlacement] {M : AllocCostModel} have := stk_sub_ge_base hstk have := stk_sub_ge_dirGet hstk have : extHookStack ≤ 65536 := by decide - exact idTrustPoll_placed_ok_of_deps hh.alloc hGet hDec hEq (by omega) + exact idTrustPoll_placed_ok_of_deps_16 hh.alloc hGet hDec hEq (by omega) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) sessLoadShim := fun {stk} hstk => by have := stk_sub_ge_base hstk @@ -1111,7 +1105,7 @@ theorem w3Exist_placed_ok_of_ghost [LibsignalPlacement] {M : AllocCostModel} have : cliDirPutStrNeedPlaced ≤ 65536 := by decide have : publicKeySerializeStackX ≤ 65536 := by decide have : extHookStack ≤ 65536 := by decide - exact idSavePoll_placed_ok_of_deps hh.alloc hGet hPutStr hDec hEq (by omega) + exact idSavePoll_placed_ok_of_deps_16 hh.alloc hGet hPutStr hDec hEq (by omega) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) sessStoreShim := fun {stk} hstk => by @@ -1160,20 +1154,6 @@ private theorem transfer_tr_codeRoLoaded [LibsignalPlacement] {α : Type} (fun _ _ _ _ hq => hq) exact transfer_withLsCodeRoLoaded (callerProg := initProgPlaced mmpl g W) hcrl (by decide) hj hj_unmut -private theorem hookSat_of_keepsFs {α : Type} {H : LibsignalHooks} {sym : String} - {spec : Spec α} (h : HookSat H sym spec.keepsFs) : - HookSat H sym spec := by - rcases h with ⟨fn, hfn, hok⟩ - refine ⟨fn, hfn, fun x R s0 hrun hpre hsp => ?_⟩ - rcases hok x R s0 hrun hpre hsp with ⟨hkf, hsym, hout⟩ - refine ⟨hkf, hsym, ?_⟩ - rcases hout with ⟨hret, hcc, hpost⟩ | hrest - · refine Or.inl ⟨hret, hcc, ?_⟩ - dsimp only [Arm64.Spec.keepsFs] at hpost - rw [sepConj_assoc, satisfies_pure_sepConj] at hpost - exact hpost.2 - · exact Or.inr hrest - private theorem hookSat_withStack_keepsFs {α : Type} {H : LibsignalHooks} {sym : String} {spec : Spec α} (hsat : HookSat H sym spec.keepsFs) (stk : Nat) (hpan : ∀ x s0 sf, spec.onPanic x s0 sf = ⌜False⌝ := by intros; rfl) @@ -1205,13 +1185,10 @@ private theorem createChain40_cro_placed_ok [LibsignalPlacement] (createChainSpec M A lim W.C)) := by have : HkdfPlacedHooksExactSat W.C.F (cliGhostExterns g (cliExternsPlaced mmpl W)) := hh.hkdf have : HkdfPlacedHooksExactBudgetSat W.C.F (cliGhostExterns g (cliExternsPlaced mmpl W)) := - HkdfPlacedHooksExactBudgetSat.of_exactSat (hookSat_of_keepsFs hh.memsetRegionKeepsFs) - have hct207 := ct_eq_ro_placed_vm_ok_of_block - (callerProg := (blkPC_207).rebase (blkPl_207).base (cliGhostExterns g (cliExternsPlaced mmpl W))) - hh.blackBox (by decide) + HkdfPlacedHooksExactBudgetSat.of_exactSat hh.memsetRegionKeepsFs.of_keepsFs have hag40 := keys_ls_subroutine_ok_of_block_cro (callerProg := (blkPC_40).rebase (blkPl_40).base (cliGhostExterns g (cliExternsPlaced mmpl W))) - (calculateAgreement_placed_ok hh.dh hh.sharedDrop hct207 + (calculateAgreement_placed_ok_unconditional_sat hh.dh hh.sharedDrop hh.blackBox (hookSat_noAllocShimBudget_of_withVmPreserved hh.shim) hh.rawAlloc hh.staticDrop) have hext40 := extract_placed_vm_ok_of_other_block_sat W.C (callerProg := (blkPC_40).rebase (blkPl_40).base (cliGhostExterns g (cliExternsPlaced mmpl W))) @@ -1242,7 +1219,7 @@ theorem w3Local_placed_ok_of_seams [LibsignalPlacement] {M : AllocCostModel} InitLocalCalleesPlaced A lim InitStateEnv mmpl gh' W stk := by have : HkdfPlacedHooksExactSat W.C.F (cliGhostExterns gh' (cliExternsPlaced mmpl W)) := hh.hkdf have : HkdfPlacedHooksExactBudgetSat W.C.F (cliGhostExterns gh' (cliExternsPlaced mmpl W)) := - HkdfPlacedHooksExactBudgetSat.of_exactSat (hookSat_of_keepsFs hh.memsetRegionKeepsFs) + HkdfPlacedHooksExactBudgetSat.of_exactSat hh.memsetRegionKeepsFs.of_keepsFs have hcc40 := createChain40_cro_placed_ok mmpl gh' W hh exact { kemPubSerialize := kemPublicKeySerialize_local2_placed_ok mmpl gh' W hh (by @@ -1251,7 +1228,7 @@ theorem w3Local_placed_ok_of_seams [LibsignalPlacement] {M : AllocCostModel} omega) dropSessionStructure := dropSessionStructure_cli_placed_ok mmpl gh' W hh verifySignature := hVerifySig - isSameAccount := w3IsSameAccount_placed_ok mmpl gh' A.repAlloc W + isSameAccount := w3IsSameAccount_placed_ok_of_bb_sat mmpl gh' A.repAlloc W hh.blackBox calculateAgreement := calculateAgreement_cli_placed_ok mmpl gh' W hh derivePubKeyBytes := derivePubKeyBytes_cli_placed_ok mmpl gh' W hh handshakeDerive := fun X => diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/F3/HInit/CliInitSlotOkPlacedAtFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/F3/HInit/CliInitSlotOkPlacedAtFd.lean index 36c56154b..831502bf4 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/F3/HInit/CliInitSlotOkPlacedAtFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/F3/HInit/CliInitSlotOkPlacedAtFd.lean @@ -101,7 +101,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.SessionKitOkCliPlacedBudge open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.CliSlotCalleesInstPlacedBudgetAux (cliExistingStoreCalleesEnvs) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.CliSlotCalleesInstPlacedBudgetSeams - (cliDirPutStrNeedPlaced cliGhostExterns_blackBox_eq) + (cliDirPutStrNeedPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Compose.SemPlacedBudget (RunSlotEnvs slotsOfPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.AssemblyPlacedBudget @@ -115,16 +115,17 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.StoreCalleesPl open LibsignalBinary.Proofs.SignalSession.Cli.Run.SkeletonPlacedBudgetFd (slotWithPreFdsGe3Closed withPreFdsGe3Closed) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (CliGhostSpqrAllocHooks cliExternsPlaced_bcmp_budget_sat) + (CliGhostSpqrAllocHooks) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (dirGetSpecPlaced dirPutSpecPlaced dirPutStrSpecPlaced pathSpecPlaced readFileSpecPlaced sessDeserializeSpecPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePollPlacedBudget - (idSavePoll_placed_ok_of_deps) + (idSavePoll_placed_ok_of_deps_16) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSaveShimPlacedBudget (idSaveShim_placed_ok_of_deps) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudget - (idTrustPoll_placed_ok_of_deps identityKey_decode_placed_ok publicKeyEq_placed_ok_of_bb) + (idTrustPoll_placed_ok_of_deps_16 identityKey_decode_placed_ok + publicKeyEq_mem_placed_ok_of_bb_16_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustShimPlacedBudget (idTrustShim_placed_ok_of_deps) open LibsignalBinary.Proofs.SignalSession.Cli.Store.LoadPollPlacedBudget @@ -229,18 +230,6 @@ theorem dirGetSpecPlaced_withFds_of_withFdsGe3Closed [LibsignalPlacement] {M : A /-! ## `ExistingStoreCalleesPlaced (withFds A)` -/ -private theorem cliGhostExterns_bcmp_keepsFs_sat (mmpl : Obj.MultiPlacement) - (gh' : CliGhostHooks) (W : CliHooks) : - HookSat (cliGhostExterns gh' (cliExternsPlaced mmpl W)) cliBcmpName - (withVmPreserved cliBcmpSpec).keepsFs := by - refine cliGhostExterns_sat_of_cliExternsPlaced mmpl gh' W ?_ - rcases cliExternsPlaced_bcmp_budget_sat mmpl W with ⟨f, hf, hok⟩ - have hbcmp := CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_bcmp mmpl W - rw [hbcmp] at hf - injection hf with hfg - subst hfg - exact ⟨_, hbcmp, hok.keepsFs fun _ => rfl⟩ - private theorem sessDeserialize_false_placed_ok [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {prog : Program} : subroutine_ok prog (lsmpl.base 46) @@ -282,7 +271,7 @@ theorem w3Exist_withFds_placed_ok_of_hooks_fd [LibsignalPlacement] {M : AllocCos dirGet_placed_caller_ok_of_deps_fd (callerProg := lsProg_589 H) (i := 589) (pathProg := lsProg_589 H) (jPath := 589) - (fun _ hp => hp.2) hh0.allocFs (cliGhostExterns_bcmp_keepsFs_sat mmpl gh' W) + (fun _ hp => hp.2) hh0.allocFs hh0.bcmp (by decide) (by decide) hPath589_fds hReadSatFd (hh0.fs (lsProg_589 H) 589) (Nat.le_refl cliRunBudgets.dirGetNeed) @@ -294,7 +283,7 @@ theorem w3Exist_withFds_placed_ok_of_hooks_fd [LibsignalPlacement] {M : AllocCos have hAddr' := cliAddrText_placed_ok hh' have hPutStr' : subroutine_ok (lsProg_543 H) (lsmpl.base 543) (dirPutStrSpecPlaced (withFds A) lim DirPutStrEnv cliDirPutStrNeedPlaced) := - dirPutStr_placed_ok_of_deps hh'.alloc hh'.panics hh'.memcpyRO hh'.bcmp + dirPutStr_placed_ok_of_deps hh'.alloc hh'.panics hh'.memcpyRO hh'.bcmp.of_keepsFs (growProg := lsProg_586 H) (jGrow := 586) (by decide) (by decide) (cliGrowOneDir_placed_ok hh'.alloc hh'.panics) (Nat.le_refl cliDirPutStrNeedPlaced) @@ -302,11 +291,11 @@ theorem w3Exist_withFds_placed_ok_of_hooks_fd [LibsignalPlacement] {M : AllocCos (dirPutSpecPlaced (withFds A) lim DirPutEnv cliDirPutStk) := dirPut_placed_caller_ok_of_deps (callerProg := lsProg_542 H) (i := 542) - hh'.alloc hh'.bcmp + hh'.alloc hh'.bcmp.of_keepsFs (growProg := lsProg_586 H) (jGrow := 586) (by decide) (by decide) (cliGrowOneDir_placed_ok hh'.alloc hh'.panics) (Nat.le_refl dirPutNeedPlaced) (by decide) - have hEq := publicKeyEq_placed_ok_of_bb (cliGhostExterns_blackBox_eq mmpl gh' W) + have hEq := publicKeyEq_mem_placed_ok_of_bb_16_sat hh'.blackBox have hDec' := identityKey_decode_placed_ok (A := withFds A) H exact { dirGet := hGet' @@ -320,7 +309,7 @@ theorem w3Exist_withFds_placed_ok_of_hooks_fd [LibsignalPlacement] {M : AllocCos have := stk_sub_ge_base hstk have := stk_sub_ge_dirGet hstk have : extHookStack ≤ 65536 := by decide - exact idTrustPoll_placed_ok_of_deps hh'.alloc hGet' hDec' hEq (by omega) + exact idTrustPoll_placed_ok_of_deps_16 hh'.alloc hGet' hDec' hEq (by omega) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) sessLoadShim := fun {stk} hstk => by have := stk_sub_ge_base hstk @@ -342,7 +331,7 @@ theorem w3Exist_withFds_placed_ok_of_hooks_fd [LibsignalPlacement] {M : AllocCos have : cliDirPutStrNeedPlaced ≤ 65536 := by decide have : publicKeySerializeStackX ≤ 65536 := by decide have : extHookStack ≤ 65536 := by decide - exact idSavePoll_placed_ok_of_deps hh'.alloc hGet' hPutStr' hDec' hEq (by omega) + exact idSavePoll_placed_ok_of_deps_16 hh'.alloc hGet' hPutStr' hDec' hEq (by omega) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) sessStoreShim := fun {stk} hstk => by diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/F3/HRead/AgreesOutsideReadHooks.lean b/LibsignalBinary/Proofs/SignalSession/Cli/F3/HRead/AgreesOutsideReadHooks.lean index 6d6e0cd98..0dbed1b5b 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/F3/HRead/AgreesOutsideReadHooks.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/F3/HRead/AgreesOutsideReadHooks.lean @@ -49,7 +49,7 @@ open CryptoVerification.LibsignalPublicApi.StoreKit subroutine_ok_withLsCodeRoLoaded_of_plain withLsCodeRoLoaded withLsRoCl) open CryptoVerification.LibsignalTripleRatchet - (HkdfPlacedHooks extHookStack lsMemcpySym lsMemsetSym memcpyName memmoveName memsetName) + (HkdfPlacedHooks extHookStack lsMemcpySym lsMemsetSym memcpyName memsetName) open CryptoVerification.SignalSession (CliHooks cliExternsPlaced cliPanicSymbolsPlaced lsBlackBoxSym lsCompress256Sym lsDiffieHellmanSym lsDurationSinceSym lsFormatInnerSym lsFromUtf8Sym lsMemrchrSym @@ -58,20 +58,19 @@ open CryptoVerification.SignalSession lsStaticSecretDropSym lsStringCloneSym) open CryptoVerification.SignalSession.Cli (cliBcmpName) open CryptoVerification.SignalSession.Cli.MainHops - (cliIo cliRunBudgets cliWrOk hookMemmove_fs hookNoop_fs) + (cliIo cliRunBudgets cliWrOk hookNoop_fs) open CryptoVerification.SignalSession.Cli.Run.Placed (lsProg_579) open CryptoVerification.SignalSession.Cli.RunCompose (InitGhost RunNeeds RunSem) open CryptoVerification.SignalSession.Cli.RunGlue - (CliGhostHooks CliGhostHooksFs FsTHooks IsFsC cliExternsPlaced_row cliGhostExterns + (CliGhostHooks CliGhostHooksFs FsTHooks IsFsC cliGhostExterns cliGhostExternsWithExtra cliGhostExterns_alloc cliGhostExterns_dealloc cliGhostExterns_memcpy_some - cliGhostExterns_memset_some cliGhostExterns_other cliGhostExterns_realloc - cliGhostExterns_shim fsTHooks_cliExternsPlaced fsTHooks_cliGhostExterns_of_fs fsTHooks_none - fsT_externAt hookSat_of_eq panicked_fsT traceFsSound_of_fsTHooks) + cliGhostExterns_memset_some cliGhostExterns_realloc cliGhostExterns_shim + fsTHooks_cliExternsPlaced fsTHooks_cliGhostExterns_of_fs fsTHooks_none fsT_externAt + hookSat_of_eq panicked_fsT traceFsSound_of_fsTHooks) open CryptoVerification.SignalSession.Cli.RunProofs (InitOk₀ cliInitiateNeed initDef) open CryptoVerification.SignalSession.Cli.RunProofs.Initiate (lsKemEncapsSym) open CryptoVerification.SignalSession.Cli.RunSkeleton (CalleeSlot.OkPlaced) -open CryptoVerification.SignalSession.Cli.Slots - (cliGhostExterns_sat_of_cliExternsPlaced filesOk₀ memmove_row_placed scopeIn) +open CryptoVerification.SignalSession.Cli.Slots (filesOk₀ scopeIn) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits RustCliAllocBudget) open LibsignalBinary.Proofs.RecordCodecs.DepsBudget (CodecHooksPlaced) open LibsignalBinary.Proofs.SessionRecordAt.Hooks2.SerDefsXBudget (SerContractsXPlaced) @@ -86,10 +85,9 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks allocContractsFsPlaced_of_hookSat allocContractsXCliPlaced_of_hookSat cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_memcpyRegionRO_budget_sat cliExternsPlaced_memcpyRegion_budget_sat - cliExternsPlaced_memcpy_budget_sat cliExternsPlaced_memmove_budget_sat - cliExternsPlaced_memsetRegion_budget_sat cliExternsPlaced_memset_budget_sat - cliExternsPlaced_realloc_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat - cliExternsPlaced_sessionMemcpy_budget_sat cliExternsPlaced_sessionMemmove_budget_sat + cliExternsPlaced_memcpy_budget_sat cliExternsPlaced_memsetRegion_budget_sat + cliExternsPlaced_memset_budget_sat cliExternsPlaced_realloc_budget_sat + cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemcpy_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat cliExternsPlaced_sessionMemset_budget_sat cliExternsPlaced_shim_budget_sat) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget @@ -188,7 +186,7 @@ theorem agreesOutsideReadHooks_cliGhost_updateRead (mmpl : Obj.MultiPlacement) AgreesOutsideReadHooks mmpl gh W (cliGhostExterns { gh with readFile := rf, readStdin := rs } (cliExternsPlaced mmpl W)) := by intro s hFile hStdin - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra simp [beq_eq_false_iff_ne.mpr hFile, beq_eq_false_iff_ne.mpr hStdin] theorem AgreesOutsideReadHooks.hookSat {α : Type} {mmpl : Obj.MultiPlacement} {gh : CliGhostHooks} @@ -384,12 +382,6 @@ theorem allocContractsXCliPlaced_of_agreesOutsideReadHooks [LibsignalPlacement] (cliExternsPlaced_memcpyRegion_budget_sat mmpl gh W hG)) (hAgree.hookSat (cliExternsPlaced_sessionMemcpyRegion_budget_sat mmpl gh W hG)) - (fun stk => hAgree.hookSat - (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_memmove_budget_sat mmpl W stk))) - (fun stk => hAgree.hookSat - (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W stk))) (fun stk hpos => hAgree.hookSat (cliExternsPlaced_memset_budget_sat mmpl gh W hG stk hpos)) (fun stk hpos => hAgree.hookSat @@ -420,12 +412,6 @@ theorem allocContractsFsPlaced_of_agreesOutsideReadHooks [LibsignalPlacement] (cliExternsPlaced_sessionMemcpyRegion_budget_sat mmpl gh W hG)) (hAgree.hookSat (cliExternsPlaced_memcpyRegionRO_budget_sat mmpl gh W hG)) - (fun stk => hAgree.hookSat - (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_memmove_budget_sat mmpl W stk))) - (fun stk => hAgree.hookSat - (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W stk))) (fun stk hpos => hAgree.hookSat (cliExternsPlaced_memset_budget_sat mmpl gh W hG stk hpos)) (fun stk hpos => hAgree.hookSat @@ -437,7 +423,7 @@ theorem allocContractsFsPlaced_of_agreesOutsideReadHooks [LibsignalPlacement] (by intro sym hmem f hf s simp only [List.mem_cons, List.not_mem_nil, or_false] at hmem - rcases hmem with rfl | rfl | rfl | rfl | rfl | rfl | rfl + rcases hmem with rfl | rfl | rfl | rfl | rfl | rfl · rw [hAgree _ (by decide) (by decide), cliGhostExterns_alloc] at hf cases hf; exact hG.alloc_fs s · rw [hAgree _ (by decide) (by decide), cliGhostExterns_dealloc] at hf @@ -451,11 +437,6 @@ theorem allocContractsFsPlaced_of_agreesOutsideReadHooks [LibsignalPlacement] show memcpyName = lsMemcpySym from rfl, cliGhostExterns_memcpy_some gh _ hf₀] at hf cases hf; exact hfs₀ s - · rw [hAgree _ (by decide) (by decide), - cliGhostExterns_other gh _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide), - cliExternsPlaced_row mmpl W (memmove_row_placed mmpl W)] at hf - cases hf; exact hookMemmove_fs s · obtain ⟨f₀, hf₀, _, _, _, _, _, hfs₀, _⟩ := hG.memset rw [hAgree _ (by decide) (by decide), show memsetName = lsMemsetSym from rfl, @@ -487,9 +468,6 @@ theorem serContractsXPlaced_of_agreesOutsideReadHooks [LibsignalPlacement] (hAgree.hookSat (cliExternsPlaced_dealloc_budget_sat mmpl gh W hG)) (hAgree.hookSat (cliExternsPlaced_realloc_budget_sat mmpl gh W hG)) (hAgree.hookSat (cliExternsPlaced_shim_budget_sat mmpl gh W hG.shim_eq)) - (hAgree.hookSat - (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W extHookStack))) (hAgree.hookSat (cliExternsPlaced_sessionMemcpy_budget_sat mmpl gh W hG extHookStack)) @@ -531,11 +509,12 @@ theorem skeletonRunHooksPlaced_of_agreesOutsideReadHooks [LibsignalPlacement] {M bcmp := hAgree.hookSat h0.bcmp fs prog i hprog := @traceFsSound_of_fsTHooks_lsProg _ H hFs prog i hprog utf8 stk := hAgree.hookSat (h0.utf8 stk) - memrchr stk := hAgree.hookSat (h0.memrchr stk) + memrchr := hAgree.hookSat h0.memrchr codecHooks := codecHooksPlaced_of_agreesOutsideReadHooks hAgree h0.codecHooks allocZeroed := hAgree.hookSat h0.allocZeroed stringClone := hAgree.hookSat h0.stringClone formatInner := hAgree.hookSat h0.formatInner + blackBox := hAgree.hookSat h0.blackBox theorem w3RunHooksPlaced_of_agreesOutsideReadHooks [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -570,13 +549,13 @@ theorem w3RunHooksPlaced_of_agreesOutsideReadHooks [LibsignalPlacement] {M : All dh := hAgree.hookSat h0.dh sharedDrop := hAgree.hookSat h0.sharedDrop staticDrop := hAgree.hookSat h0.staticDrop - blackBox := (hAgree _ (by decide) (by decide)).trans h0.blackBox + blackBox := hAgree.hookSat h0.blackBox hkdf := let ⟨f, hf, hex⟩ := h0.hkdf.memcpy { memset := hAgree.hookSat h0.hkdf.memset memcpy := ⟨f, (hAgree _ (by decide) (by decide)).trans hf, hex⟩ compress256 := (hAgree _ (by decide) (by decide)).trans h0.hkdf.compress256 } kemEncaps := (hAgree _ (by decide) (by decide)).trans h0.kemEncaps - durationSince := (hAgree _ (by decide) (by decide)).trans h0.durationSince + durationSince := hAgree.hookSat h0.durationSince panic_alloc := (hAgree _ (by decide) (by decide)).trans h0.panic_alloc panic_raw := (hAgree _ (by decide) (by decide)).trans h0.panic_raw panic_sym := panic_of_mem_cliPanicSymbolsPlaced hAgree h0.panic_sym diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/F3/HRead/CryptoHookFds.lean b/LibsignalBinary/Proofs/SignalSession/Cli/F3/HRead/CryptoHookFds.lean index 56146af11..04fffb78a 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/F3/HRead/CryptoHookFds.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/F3/HRead/CryptoHookFds.lean @@ -44,12 +44,11 @@ open CryptoGames.LibsignalSession (aesCbcEncrypt) open CryptoVerification.E2E (aesDecFrameBytes aesDecHookMallocng aesEncFrameBytes aesEncHookMallocng libcruxHmacFrameBytes libcruxHmacHookMallocng mlkemEncaps1Hook restoreCallerRegs - stepRustAlloc1 stepRustDealloc1 timeAddHook) + stepRustAlloc1 stepRustDealloc1) open CryptoVerification.LibsignalSpqrV1 (LibcruxHmacCall) open CryptoVerification.LibsignalTripleRatchet (AesCall extHookStack) open CryptoVerification.SignalSession - (CliHooks cliExternsPlaced cliHookTablePlaced cliPqxdhHookTablePlaced durationSinceExactHook - fromUtf8Hook lsAesDecSym lsAesEncSym memrchrHook strlenHook) + (CliHooks cliExternsPlaced cliHookTablePlaced cliPqxdhHookTablePlaced lsAesDecSym lsAesEncSym) open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliExternsPlaced_row cliGhostExterns) open CryptoVerification.SignalSession.Cli.Slots @@ -1017,23 +1016,13 @@ theorem cliExternsPlaced_nonMallocngSym_preserves_fdsGe3Closed rcases hp with hpq | hcli · exact table_cliPqxdhPlaced_nonMallocng_fdsGe3Closed mmpl W hne_hmac hpq · simp only [List.mem_cons, List.not_mem_nil, or_false] at hcli - rcases hcli with h | h | h | h | h | h | h | h | h | h | h | h | h | h | h | h | h | h | h <;> + rcases hcli with h | h | h | h | h | h | h | h | h <;> first | (rcases Prod.mk.inj h with ⟨_, rfl⟩; exact fun _ hfs => hfs) | exact False.elim (hne_enc (Prod.mk.inj h).1) | exact False.elim (hne_dec (Prod.mk.inj h).1) | (rcases Prod.mk.inj h with ⟨_, rfl⟩; exact fun _ hfs => fdsGe3Closed_writeFileHook hfs) | (rcases Prod.mk.inj h with ⟨_, rfl⟩; exact fun _ hfs => fdsGe3Closed_writeStdoutHook hfs) - | (rcases Prod.mk.inj h with ⟨_, rfl⟩ - intro u hfs; unfold strlenHook; dsimp only; split <;> exact hfs) - | (rcases Prod.mk.inj h with ⟨_, rfl⟩ - intro u hfs; unfold memrchrHook; dsimp only; split <;> first | exact hfs | (split <;> exact hfs)) - | (rcases Prod.mk.inj h with ⟨_, rfl⟩ - intro u hfs; unfold fromUtf8Hook; dsimp only; split <;> first | exact hfs | (split <;> exact hfs)) - | (rcases Prod.mk.inj h with ⟨_, rfl⟩ - intro u hfs; unfold durationSinceExactHook; dsimp only; split <;> first | exact hfs | (split <;> exact hfs)) - | (rcases Prod.mk.inj h with ⟨_, rfl⟩ - intro u hfs; unfold timeAddHook; dsimp only; split <;> split <;> exact hfs) theorem cliExternsPlaced_nonMallocngSym_hookSat_withFdsGe3Closed {α : Type} (mmpl : Obj.MultiPlacement) (W : CliHooks) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/F3/HRead/ReadStdinBudgetPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/F3/HRead/ReadStdinBudgetPlaced.lean index 8e78c552f..55adc3093 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/F3/HRead/ReadStdinBudgetPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/F3/HRead/ReadStdinBudgetPlaced.lean @@ -45,7 +45,9 @@ open CryptoVerification.LibsignalPublicApi.StoreKit open CryptoVerification.LibsignalTripleRatchet (extHookStack memcpyName memmoveName memsetName) open CryptoVerification.SignalSession (CliHooks cliExternsPlaced cliHookTablePlaced cliPanicSymbolsPlaced isCliPanicSymbolPlaced - lsFromUtf8Sym lsMemrchrSym lsReadFileSym lsReadStdinSym lsWriteFileSym lsWriteStdoutSym + lsFromUtf8Sym lsMemcpySym lsMemrchrSym lsMemsetSym lsReadFileSym lsReadStdinSym + lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli + lsRustReallocSymCli lsStringCloneSym lsWriteFileSym lsWriteStdoutSym readStdinResult writeFileHook writeStdoutHook) open CryptoVerification.SignalSession.Cli (ReadFileGhost ioVecAt) open CryptoVerification.SignalSession.Cli.Main.Placed (lsProg_617) @@ -53,7 +55,8 @@ open CryptoVerification.SignalSession.Cli.MainHops (IoModel ReadFileLitGhost ReadStdinGhost cliExternsPlaced_writeFile cliExternsPlaced_writeStdout cliIo cliWrOk) open CryptoVerification.SignalSession.Cli.RunGlue - (CliGhostHooks FsTHooks IsFsC cliGhostExterns cliGhostExterns_other) + (CliGhostHooks FsTHooks IsFsC cliExtraGhostSyms cliGhostExterns cliGhostExternsWithExtra + cliGhostExterns_other) open CryptoVerification.SignalSession.CliExt (ReadFileCall bytesAt) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FitsEnv FitsEvents RustCliAllocBudget @@ -697,7 +700,7 @@ theorem no_new_hooks_ghost_to_real (mmpl : Obj.MultiPlacement) (W : CliHooks) withReadHooks rfh rsh (cliGhostExterns g (cliExternsPlaced mmpl W)) sym = none → cliExternsPlaced mmpl W sym = none := by refine no_new_hooks_withReadHooks fun sym hnone => ?_ - unfold cliGhostExterns at hnone + unfold cliGhostExterns cliGhostExternsWithExtra at hnone split at hnone · cases hnone · split at hnone @@ -728,7 +731,11 @@ theorem no_new_hooks_ghost_to_real (mmpl : Obj.MultiPlacement) (W : CliHooks) · cases hmc : g.memcpy with | some _ => rw [hmc] at hnone; cases hnone | none => rw [hmc] at hnone; exact hnone - · exact hnone + · split at hnone + · cases hex : g.extra.lookup sym with + | some _ => rw [hex] at hnone; cases hnone + | none => rw [hex] at hnone; exact hnone + · exact hnone theorem baseHelperRows_withReadHooks {mmpl : Obj.MultiPlacement} {W : CliHooks} {baseExt : LibsignalHooks} (rfh rsh : State → State) @@ -761,35 +768,37 @@ theorem withReadHooks_cliGhostExterns_comm_strip (rfh rsh : State → State) (g cliGhostExterns_readFile_of_none { g with readFile := none, readStdin := none } _ rfl, withReadHooks_readFile] · rw [withReadHooks_other rfh rsh _ h1 h2] - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra dsimp only - split - · rfl - · split - · rfl - · split - · rfl - · split - · rfl - · split - · rfl - · split - · cases g.stringClone with - | some _ => rfl - | none => exact (withReadHooks_other rfh rsh baseExt h1 h2).symm - · split - · exfalso; simp_all - · split - · exfalso; simp_all - · split - · cases g.memset with - | some _ => rfl - | none => exact (withReadHooks_other rfh rsh baseExt h1 h2).symm - · split + cases sym == lsRustAllocSymCli <;> simp only [Bool.false_eq_true, ↓reduceIte] + · cases sym == lsRustDeallocSymCli <;> simp only [Bool.false_eq_true, ↓reduceIte] + · cases sym == lsRustReallocSymCli <;> simp only [Bool.false_eq_true, ↓reduceIte] + · cases sym == lsRustAllocZeroedSymCli <;> simp only [Bool.false_eq_true, ↓reduceIte] + · cases sym == lsRustNoAllocShimSymCli <;> simp only [Bool.false_eq_true, ↓reduceIte] + · cases sym == lsStringCloneSym <;> simp only [Bool.false_eq_true, ↓reduceIte] + · cases hrf_eq : (sym == lsReadFileSym) <;> + simp only [Bool.false_eq_true, ↓reduceIte] + · cases hrs_eq : (sym == lsReadStdinSym) <;> + simp only [Bool.false_eq_true, ↓reduceIte] + · cases sym == lsMemsetSym <;> simp only [Bool.false_eq_true, ↓reduceIte] + · cases sym == lsMemcpySym <;> simp only [Bool.false_eq_true, ↓reduceIte] + · cases cliExtraGhostSyms.contains sym <;> + simp only [Bool.false_eq_true, ↓reduceIte] + · exact (withReadHooks_other rfh rsh baseExt h1 h2).symm + · cases g.extra.lookup sym with + | none => exact (withReadHooks_other rfh rsh baseExt h1 h2).symm + | some _ => rfl · cases g.memcpy with - | some _ => rfl | none => exact (withReadHooks_other rfh rsh baseExt h1 h2).symm - · exact (withReadHooks_other rfh rsh baseExt h1 h2).symm + | some _ => rfl + · cases g.memset with + | none => exact (withReadHooks_other rfh rsh baseExt h1 h2).symm + | some _ => rfl + · exact absurd (beq_iff_eq.mp hrs_eq) h1 + · exact absurd (beq_iff_eq.mp hrf_eq) h2 + · cases g.stringClone with + | none => exact (withReadHooks_other rfh rsh baseExt h1 h2).symm + | some _ => rfl theorem withReadHooks_cliGhostExterns_comm (rfh rsh : State → State) (g : CliGhostHooks) (baseExt : LibsignalHooks) @@ -814,7 +823,7 @@ theorem allocContractsFsPlaced_withReadHooks_ghost [LibsignalPlacement] (baseHelperRows_withReadHooks rfh rsh (cliExternsPlaced_baseHelperRows mmpl W)) ⟨hG.alloc, hG.dealloc, hG.realloc, hG.alloc_fs, hG.dealloc_fs, hG.realloc_fs, hG.alloc_fsT, hG.dealloc_fsT, hG.realloc_fsT, hG.shim_eq, hG.memset, hG.memcpy, - hG.memcpy_exact, hG.memset_acp⟩ + hG.memcpy_exact, hG.memset_acp, hG.extraOk⟩ theorem allocContractsXCliPlaced_withReadHooks_ghost [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) @@ -830,7 +839,7 @@ theorem allocContractsXCliPlaced_withReadHooks_ghost [LibsignalPlacement] (baseHelperRows_withReadHooks rfh rsh (cliExternsPlaced_baseHelperRows mmpl W)) ⟨hG.alloc, hG.dealloc, hG.realloc, hG.alloc_fs, hG.dealloc_fs, hG.realloc_fs, hG.alloc_fsT, hG.dealloc_fsT, hG.realloc_fsT, hG.shim_eq, hG.memset, hG.memcpy, - hG.memcpy_exact, hG.memset_acp⟩ + hG.memcpy_exact, hG.memset_acp, hG.extraOk⟩ theorem fsTHooks_withReadHooks {rfh rsh : State → State} {ext : LibsignalHooks} (hRfh : HookFsTraced IsFsC rfh) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/CliStrictPlaced2.lean b/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/CliStrictPlaced2.lean index 8fa5cd871..66c8d6cdd 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/CliStrictPlaced2.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/CliStrictPlaced2.lean @@ -12,6 +12,7 @@ module public import ProofLib.SepLogic.Stack public import ProofLib.StdStartup.Layout public import LibsignalBinary.Proofs.Common.SharedHelpers +public import LibsignalBinary.Proofs.HookDischarge.Libc.Strlen public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3ExternNoAllocFail public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.PlacedOomRecovery2 @@ -27,9 +28,13 @@ import LibsignalBinary.Proofs.SpecLemmas.SignalSession.RunProofDefs /-! # Two-Placement `NeedLocks` Strict Composer and Equality Bridges -Lifts the `NeedLocks` + `argvAtRO` + `inputsOf` strict (`0`-excused-abort) whole-process composer -to two placements `(mpl, mmpl : Obj.MultiPlacement)` over `Placed.CliElfCodeMatchesPlaced mpl mmpl elf` -and `Placed.cliRunPlacedSig mpl mmpl elf W`, with concrete `lim := cliBudgetLimits` specializations. +Lifts the `NeedLocks` + SWAR-padded `argvAtRO` + `inputsOf` strict (`0`-excused-abort) +whole-process composer to two placements `(mpl, mmpl : Obj.MultiPlacement)` over +`Placed.CliElfCodeMatchesPlaced mpl mmpl elf` and `Placed.cliRunPlacedSig mpl mmpl elf W`, with +concrete `lim := cliBudgetLimits` specializations. +Note: `F3.L4B.CliStrictPlaced2.cStrAtRO` / `argvAtRO` are SWAR-padded (`StrlenSwarPadBound`), +matching `M24.ArgvPad.cStrAtROPad` / `argvAtROPad`, whereas `M24.CliStrictPlaced.argvAtRO` and +`F3Relink.Startup.argvAtRO` remain unpadded. -/ @[expose] public section @@ -69,6 +74,7 @@ open CryptoVerification.SignalSession.Cli.MainHops (CallV cmdTag parseArgs parse open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget) open LibsignalBinary.Heap.Fine (CliElfMallocngLayout FineBudget StartupVmPreserved fineCostModel fineHookRustCliAllocBudget) +open LibsignalBinary.Proofs.HookDischarge.Libc.Strlen (StrlenSwarPadBound) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (CliElfTokenCellsPlacedAt CliRunsToExtOnInputsAt CliStackShape b2FineHookPool_of_needLocks cliProgExtPlacedAt cliProgExtPlacedSigAt cliProgExtPlacedSigAt_cliExternsPlaced_eq @@ -302,17 +308,22 @@ private theorem not_isStdinOverCap_pqInitInputs (W : PEParams) (st : PqParty) (b ¬ IsStdinOverCap (pqInitInputs W st b t) := not_isStdinOverCap_of_stdin_le (by simp [pqInitInputs, pqInputs]) -/-! ## `NeedLocks` + `argvAtRO` + `inputsOf` Per-Input Harness and Strict Outcome -/ +/-! ## `NeedLocks` + SWAR-padded `argvAtRO` + `inputsOf` Per-Input Harness and Strict Outcome -/ /-- Default enforced `1 GiB` `BudgetLimits`. -/ abbrev cliBudgetLimits : BudgetLimits := { staticCount := 64, staticBytes := 16 * 1024 * 1024, physCap := 2 ^ 30, enforced := true } -/-- Read-only NUL-terminated bytes of `s` at `p`. -/ +/-- SWAR-padded read-only NUL-terminated bytes of `s` at `p`, carrying trailing padding `pad` +satisfying `StrlenSwarPadBound p s pad` (`p ↦ᵣ (s ++ [0#8] ++ pad)`). +Note: `M24.CliStrictPlaced.cStrAtRO` and `F3Relink.Startup.cStrAtRO` stay unpadded; this `F3.L4B` +definition matches `M24.ArgvPad.cStrAtROPad`. -/ def cStrAtRO (p : BitVec 64) (s : List (BitVec 8)) : SepProp := - p ↦ᵣ (s ++ [0#8]) + ∃∗ pad : List (BitVec 8), ⌜StrlenSwarPadBound p s pad⌝ ∗ (p ↦ᵣ (s ++ [0#8] ++ pad)) -/-- Read-only C `argv` pointer table at `a`. -/ +/-- SWAR-padded read-only C `argv` pointer table at `a`. +Note: `M24.CliStrictPlaced.argvAtRO` and `F3Relink.Startup.argvAtRO` stay unpadded; this `F3.L4B` +definition matches `M24.ArgvPad.argvAtROPad`. -/ def argvAtRO : BitVec 64 → List (List (BitVec 8)) → SepProp | a, [] => a ↦₆₄ᵣ 0#64 | a, s :: ss => ∃∗ p, (a ↦₆₄ᵣ p) ∗ cStrAtRO p s ∗ argvAtRO (a + 8#64) ss @@ -321,7 +332,8 @@ def B2MainEntryFacts (inputsOf : Inputs → ProcessInputs) (i : Inputs) (s : Sta (s.readReg64 .x0).setWidth 32 = BitVec.ofNat 32 (i.argv.length + 1) ∧ s.fs = initFsState (inputsOf i) ∧ s.trace = [] -/-- Read-only-`argv` counterpart of `TopBudget.mainFrame`. -/ +/-- SWAR-padded read-only-`argv` counterpart of `TopBudget.mainFrame` (matching +`M24.ArgvPad.b2MainFrameFinePad`; `M24.CliStrictPlaced.b2MainFrameFine` stays unpadded). -/ def b2MainFrameFine {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (st : M.σ) (stk : Nat) (Statics : SepProp) (i : Inputs) (s : State) : SepProp := argvAtRO (s.readReg64 .x1) (("libsignal-cli" :: i.argv).map bytesOfString) ∗ @@ -365,7 +377,7 @@ theorem exit_frame_needLocks_n {m : Memory} {nl sp : BitVec 64} {n stk : Nat} {F exact sepConj_mono_right (sepConj_mono_right (sepConj_mono_right (entails_anyHeap _))) /-- Per-input `∃ (γ : GhostName)` whole-process harness parameterized by `exitStk`, `inputsOf`, -`argvAtRO`, and `__libc.need_locks`. -/ +SWAR-padded `argvAtRO`, and `__libc.need_locks`. -/ def MuslHarnessFineNeedLocksPerInput (exitStk : Nat) (libcAddr : BitVec 64) (elf : ElfImage) (P : Program) (mainPc : BitVec 64) (inputsOf : Inputs → ProcessInputs) @@ -871,7 +883,7 @@ theorem cliRunExtOnInputsSigAt_of_strict_b2_needLocks_call_pred /-! ## Uniform-`∀ γ tp` `MainOkCliExt*B2NeedLocks` Predicates -/ -/-- `NeedLocks` + `argvAtRO` 5-clause PQXDH `main` specification. -/ +/-- `NeedLocks` + SWAR-padded `argvAtRO` 5-clause PQXDH `main` specification. -/ def MainOkCliExtPqB2NeedLocksPlacedAt (mpl mmpl : Obj.MultiPlacement) (ext : CliHooks → String → Option (State → State)) @@ -918,7 +930,7 @@ def MainOkCliExtPqB2NeedLocksPlacedAt .exited 1 [] (filesOf (pqRecvInputs WP p c rc).files) ∧ CommitOk (pqRecvInputs WP p c rc) (MainResult.ofAnswer a)) -/-- `NeedLocks` + `argvAtRO` `NoMatch` `main` specification. -/ +/-- `NeedLocks` + SWAR-padded `argvAtRO` `NoMatch` `main` specification. -/ def MainOkCliExtOverB2NeedLocksPlacedAt (mpl mmpl : Obj.MultiPlacement) (ext : CliHooks → String → Option (State → State)) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/CliStrictPlaced2G.lean b/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/CliStrictPlaced2G.lean index 907305991..df4f5e870 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/CliStrictPlaced2G.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/CliStrictPlaced2G.lean @@ -15,6 +15,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3ExternNoAllocFai public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.PlacedOomRecovery2 -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyGhost -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhost -- proof-setup: allow-public-import import Arm64.Trusted.Spec.Hoare @@ -31,9 +32,9 @@ import ProofLib.ProgramReflection - **Role**: `Role::Proof` (outside the TCB). - **Overview**: - Route-2 (`w2_c12_route2_stmts.md` §3.2 `R2-G1..G8`) entry-guarded siblings of - `F3.L4B.CliStrictPlaced2` threading `F3MemsetMemcpyEntryLrFalse mmpl` from - `ElfMemsetEntryGuard.cliElf_f3MuslHarness_memsetMemcpyLrFalse_of_linkedAt` (`R2-G7`) + Route-2 (`w2_c12_route2_stmts.md` §3.2 `R2-G1..G8`, extended to Cutover 2B) entry-guarded + siblings of `F3.L4B.CliStrictPlaced2` threading `F3C2EntryGuard mpl mmpl` from + `ElfSlicesPqOomC2EntryGuardLr.cliElf_f3MuslHarness_c2EntryGuard_of_linkedAt` (`R2-G7`) and `Block617TransferFixedHypG` (`R2-G3`) into `CliStrictPlaced2.outcome_of_main_strict_b2_needLocks_guarded_perInput_at` (`R2-G4`), eliminating the entry guard internally at the process harness boundary so all whole-process @@ -90,6 +91,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.PlacedOomRecovery2 (CliPqxdhElfCorrectStrictPlaced2 cliPqxdhElfCorrectPlaced_of_strict2) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG (Block617TransferFixedHypG withEntryGuard) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard (F3C2EntryGuard) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyGhost (keepMemcpyBlk20) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhost (keepMemsetBlk21) @@ -554,32 +556,32 @@ theorem cliRunExtOnInputsSigAt_of_strict_b2_needLocks_guarded_call_pred CommitOk (pqRecvInputs WP st (wirePrekey :: m.bytes) rc) (MainResult.ofAnswer a) /-- F3 specialization of `MainOkCliExtPqB2NeedLocksPlacedAtG` at `ext := cliExternsPlaced mmpl`, -`mainIdx := 617`, `inputsOf := cliProcessInputs`, `EntryGuard := F3MemsetMemcpyEntryLrFalse mmpl`, +`mainIdx := 617`, `inputsOf := cliProcessInputs`, `EntryGuard := F3C2EntryGuard mpl mmpl`, and `lim := cliBudgetLimits` (`R2-G2`). -/ abbrev MainOkCliF3PqB2NeedLocksPlacedAtG (mpl mmpl : Obj.MultiPlacement) (CodeOk : Memory → Prop) (libcAddr brkStart : BitVec 64) (stk : Nat) : Prop := MainOkCliExtPqB2NeedLocksPlacedAtG mpl mmpl (cliExternsPlaced mmpl) 617 cliProcessInputs - (F3MemsetMemcpyEntryLrFalse mmpl) CodeOk libcAddr brkStart stk cliBudgetLimits + (F3C2EntryGuard mpl mmpl) CodeOk libcAddr brkStart stk cliBudgetLimits /-- F3 specialization of `MainOkCliExtOverB2NeedLocksPlacedAtG` at `ext := cliExternsPlaced mmpl`, -`mainIdx := 617`, `inputsOf := cliProcessInputs`, `EntryGuard := F3MemsetMemcpyEntryLrFalse mmpl`, +`mainIdx := 617`, `inputsOf := cliProcessInputs`, `EntryGuard := F3C2EntryGuard mpl mmpl`, and `lim := cliBudgetLimits` (`R2-G2`). -/ abbrev MainOkCliF3OverB2NeedLocksPlacedAtG (mpl mmpl : Obj.MultiPlacement) (CodeOk : Memory → Prop) (libcAddr brkStart : BitVec 64) (stk : Nat) : Prop := MainOkCliExtOverB2NeedLocksPlacedAtG mpl mmpl (cliExternsPlaced mmpl) 617 cliProcessInputs - (F3MemsetMemcpyEntryLrFalse mmpl) CodeOk libcAddr brkStart stk cliBudgetLimits + (F3C2EntryGuard mpl mmpl) CodeOk libcAddr brkStart stk cliBudgetLimits /-- Lift an unguarded ghost `MainOkCliExtPqB2NeedLocksPlacedAt` witness across -`Block617TransferFixedHypG` at `F3MemsetMemcpyEntryLrFalse mmpl` (`R2-G3`). -/ +`Block617TransferFixedHypG` at `F3C2EntryGuard mpl mmpl` (`R2-G3`). -/ theorem mainOkCliF3PqG_of_block617TransferFixedG {mpl mmpl : Obj.MultiPlacement} {EG : CliHooks → String → Option (State → State)} {CodeOk_ghost CodeOk_real : Memory → Prop} {libcAddr brkStart : BitVec 64} {stk : Nat} (hTr : Block617TransferFixedHypG mpl mmpl EG (cliExternsPlaced mmpl) - (F3MemsetMemcpyEntryLrFalse mmpl) CodeOk_ghost CodeOk_real libcAddr brkStart stk) + (F3C2EntryGuard mpl mmpl) CodeOk_ghost CodeOk_real libcAddr brkStart stk) (hGhost : MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl EG 617 cliProcessInputs CodeOk_ghost libcAddr brkStart stk cliBudgetLimits) : MainOkCliF3PqB2NeedLocksPlacedAtG mpl mmpl CodeOk_real libcAddr brkStart stk := by @@ -588,14 +590,14 @@ theorem mainOkCliF3PqG_of_block617TransferFixedG exact ⟨Run, hTr W Run hmainW, hclauses⟩ /-- Lift an unguarded ghost `MainOkCliExtOverB2NeedLocksPlacedAt` witness across -`Block617TransferFixedHypG` at `F3MemsetMemcpyEntryLrFalse mmpl` (`R2-G3`). -/ +`Block617TransferFixedHypG` at `F3C2EntryGuard mpl mmpl` (`R2-G3`). -/ theorem mainOkCliF3OverG_of_block617TransferFixedG {mpl mmpl : Obj.MultiPlacement} {EG : CliHooks → String → Option (State → State)} {CodeOk_ghost CodeOk_real : Memory → Prop} {libcAddr brkStart : BitVec 64} {stk : Nat} (hTr : Block617TransferFixedHypG mpl mmpl EG (cliExternsPlaced mmpl) - (F3MemsetMemcpyEntryLrFalse mmpl) CodeOk_ghost CodeOk_real libcAddr brkStart stk) + (F3C2EntryGuard mpl mmpl) CodeOk_ghost CodeOk_real libcAddr brkStart stk) (hGhost : MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl EG 617 cliProcessInputs CodeOk_ghost libcAddr brkStart stk cliBudgetLimits) : MainOkCliF3OverB2NeedLocksPlacedAtG mpl mmpl CodeOk_real libcAddr brkStart stk := by @@ -794,14 +796,14 @@ theorem CliElfExtB2NeedLocksAssumptions2G.toUnguarded exitStk libcAddr stk CodeOk lim elf := H.toCliElfExtB2NeedLocksAssumptions2 -/-- Concrete F3 `cliBudgetLimits` + `F3MemsetMemcpyEntryLrFalse mmpl` specialization of +/-- Concrete F3 `cliBudgetLimits` + `F3C2EntryGuard mpl mmpl` specialization of `CliElfExtB2NeedLocksAssumptions2G` (`R2-G6`). -/ abbrev CliElfF3B2NeedLocksAssumptionsG (mpl mmpl : Obj.MultiPlacement) (exitStk : Nat) (libcAddr : BitVec 64) (stk : Nat) (CodeOk : Memory → Prop) (elf : ElfImage) : Prop := CliElfExtB2NeedLocksAssumptions2G mpl mmpl (cliExternsPlaced mmpl) 617 cliProcessInputs - (F3MemsetMemcpyEntryLrFalse mmpl) exitStk libcAddr stk CodeOk cliBudgetLimits elf + (F3C2EntryGuard mpl mmpl) exitStk libcAddr stk CodeOk cliBudgetLimits elf /-- Guarded top strict 2-placement ELF theorem eliminating `EntryGuard` via `H.harnessG` (`R2-G8`). -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/F3AllocStdinGhostHooks.lean b/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/F3AllocStdinGhostHooks.lean index 0ef6aafb5..086834078 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/F3AllocStdinGhostHooks.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/F3AllocStdinGhostHooks.lean @@ -91,10 +91,12 @@ open CryptoVerification.SignalSession.Cli.MainHops ( ReadStdinGhost cliExternsPlaced_writeFile cliExternsPlaced_writeStdout cliIo cliWrOk hookNoop_fs ) open CryptoVerification.SignalSession.Cli.RunGlue ( - CliGhostHooks CliGhostHooksFs FsTHooks IsFsC cliGhostExterns cliGhostExterns_other - cliGhostExterns_readFile_some cliGhostExterns_readStdin_some cliGhostExterns_stringClone_some - fsTHooks_cliExternsPlaced fsTHooks_cliGhostExterns_of_fs hookNoop_fsT + CliGhostHooks CliGhostHooksFs ExtraGhostTable FsTHooks IsFsC cliExtraGhostSyms cliGhostExterns + cliGhostExterns_other cliGhostExterns_readFile_some cliGhostExterns_readStdin_some + cliGhostExterns_stringClone_some fsTHooks_cliExternsPlaced fsTHooks_cliGhostExterns_of_fs + hookNoop_fsT ) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (ExtraFullListSpecOk) open VerifiedLibraries.Mallocng ( IsPow2Align MallocngMaxAllocSize MaxAlignedAllocAlign alignedAllocAlignOk mallocngAddrsOfPlacement mallocngAlignedAllocOk mallocngAlignedEffSize @@ -3503,7 +3505,8 @@ noncomputable def f3CliGhostHooksFixed [LibsignalPlacement] (T : F3GhostEntryTargets) (mmpl : Obj.MultiPlacement) (brkStart : BitVec 64) (lim : BudgetLimits) (stk : Nat) - (fMemset fMemcpy : Option (State → State) := none) : CliGhostHooks where + (fMemset fMemcpy : Option (State → State) := none) + (extra : ExtraGhostTable := []) : CliGhostHooks where alloc := f3AllocGhostHookFine keep P_real P_sub T.alloc mmpl brkStart lim dealloc := f3DeallocGhostHookFine keep P_real P_sub T.dealloc mmpl brkStart lim realloc := f3ReallocGhostHookFine keep P_real P_sub T.realloc mmpl brkStart lim @@ -3514,6 +3517,7 @@ noncomputable def f3CliGhostHooksFixed [LibsignalPlacement] readStdin := some (f3ReadStdinGhostHookFineSub keep P_real P_sub T.readStdin mmpl brkStart lim stk) memset := fMemset memcpy := fMemcpy + extra := extra theorem cliGhostHooksFs_f3CliGhostHooksFixed [LibsignalPlacement] (keep : BitVec 64 → Bool) (P_real P_sub : Program) @@ -3521,10 +3525,15 @@ theorem cliGhostHooksFs_f3CliGhostHooksFixed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (brkStart : BitVec 64) (lim : BudgetLimits) (stk : Nat) (fMemset fMemcpy : Option (State → State)) + (extra : ExtraGhostTable := []) (hMsFsT : ∀ f, fMemset = some f → HookFsTraced IsFsC f := by intro _ h; cases h) - (hMcFsT : ∀ f, fMemcpy = some f → HookFsTraced IsFsC f := by intro _ h; cases h) : + (hMcFsT : ∀ f, fMemcpy = some f → HookFsTraced IsFsC f := by intro _ h; cases h) + (hExtraFsT : ∀ sym f, + cliExtraGhostSyms.contains sym = true → + extra.lookup sym = some f → + HookFsTraced IsFsC f := by intro _ _ _ h; cases h) : CliGhostHooksFs - (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy) where + (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy extra) where alloc_fsT := f3AllocGhostHookFine_fsT keep P_real P_sub T.alloc mmpl brkStart lim dealloc_fsT := f3DeallocGhostHookFine_fsT keep P_real P_sub T.dealloc mmpl brkStart lim realloc_fsT := f3ReallocGhostHookFine_fsT keep P_real P_sub T.realloc mmpl brkStart lim @@ -3538,6 +3547,7 @@ theorem cliGhostHooksFs_f3CliGhostHooksFixed [LibsignalPlacement] exact f3StringCloneGhostHookFine_fsT keep P_real P_sub T.stringClone mmpl brkStart lim memset_fsT := hMsFsT memcpy_fsT := hMcFsT + extra_fsT := hExtraFsT theorem fsTHooks_f3CliGhostHooksFixed [LibsignalPlacement] (keep : BitVec 64 → Bool) (P_real P_sub : Program) @@ -3545,15 +3555,20 @@ theorem fsTHooks_f3CliGhostHooksFixed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) (brkStart : BitVec 64) (lim : BudgetLimits) (stk : Nat) (fMemset fMemcpy : Option (State → State)) + (extra : ExtraGhostTable := []) (hMsFsT : ∀ f, fMemset = some f → HookFsTraced IsFsC f := by intro _ h; cases h) - (hMcFsT : ∀ f, fMemcpy = some f → HookFsTraced IsFsC f := by intro _ h; cases h) : + (hMcFsT : ∀ f, fMemcpy = some f → HookFsTraced IsFsC f := by intro _ h; cases h) + (hExtraFsT : ∀ sym f, + cliExtraGhostSyms.contains sym = true → + extra.lookup sym = some f → + HookFsTraced IsFsC f := by intro _ _ _ h; cases h) : FsTHooks (cliGhostExterns - (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy) + (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy extra) (cliExternsPlaced mmpl W)) := fsTHooks_cliGhostExterns_of_fs (cliGhostHooksFs_f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk - fMemset fMemcpy hMsFsT hMcFsT) + fMemset fMemcpy extra hMsFsT hMcFsT hExtraFsT) (fsTHooks_cliExternsPlaced mmpl W) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore (HookExactMemcpy) @@ -3564,6 +3579,7 @@ theorem cliGhostSpqrAllocHooks_f3CliGhostHooksFixed [LibsignalPlacement] {mmpl : Obj.MultiPlacement} {brkStart : BitVec 64} {lim : BudgetLimits} {stk : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (hsvc_real : P_real.svc = Syscall.standard) (hsvc_sub : P_sub.svc = Syscall.standard) (hreal_no : ∀ pc, keep pc = true → P_real.externAt? pc = none) @@ -3600,9 +3616,10 @@ theorem cliGhostSpqrAllocHooks_f3CliGhostHooksFixed [LibsignalPlacement] HookFsTraced IsFsC f) (hMemcpyExact : ∀ f, fMemcpy = some f → HookExactMemcpy f) (hMemsetAcp : ∀ f, fMemset = some f → - ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) : + ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) + (hExtraOk : ExtraFullListSpecOk extra) : CliGhostSpqrAllocHooks fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy) where + (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy extra) where alloc := f3AllocGhostHookFine_ok hsvc_real hsvc_sub hreal_no hsub_no hPl hKeepMallocng γ tp hAlloc dealloc := f3DeallocGhostHookFine_ok hsvc_real hsvc_sub hreal_no hsub_no hPl hKeepMallocng γ tp hDealloc realloc := f3ReallocGhostHookFine_ok hsvc_real hsvc_sub hreal_no hsub_no hPl hKeepMallocng γ tp hRealloc @@ -3617,6 +3634,7 @@ theorem cliGhostSpqrAllocHooks_f3CliGhostHooksFixed [LibsignalPlacement] memcpy := hMemcpy memcpy_exact := hMemcpyExact memset_acp := hMemsetAcp + extraOk := hExtraOk allocZeroed := f3AllocZeroedGhostHookFine_ok hsvc_real hsvc_sub hreal_no hsub_no hPl hKeepMallocng γ tp hAllocZeroed allocZeroed_fs := f3AllocZeroedGhostHookFine_fs keep P_real P_sub T.allocZeroed mmpl brkStart lim @@ -3628,6 +3646,7 @@ theorem cliGhostAllocHooks_f3CliGhostHooksFixed [LibsignalPlacement] {mmpl : Obj.MultiPlacement} {brkStart : BitVec 64} {lim : BudgetLimits} {stk : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (hsvc_real : P_real.svc = Syscall.standard) (hsvc_sub : P_sub.svc = Syscall.standard) (hreal_no : ∀ pc, keep pc = true → P_real.externAt? pc = none) @@ -3662,9 +3681,10 @@ theorem cliGhostAllocHooks_f3CliGhostHooksFixed [LibsignalPlacement] HookFsTraced IsFsC f) (hMemcpyExact : ∀ f, fMemcpy = some f → HookExactMemcpy f) (hMemsetAcp : ∀ f, fMemset = some f → - ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) : + ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) + (hExtraOk : ExtraFullListSpecOk extra) : CliGhostAllocHooks fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy) where + (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy extra) where alloc := f3AllocGhostHookFine_ok hsvc_real hsvc_sub hreal_no hsub_no hPl hKeepMallocng γ tp hAlloc dealloc := f3DeallocGhostHookFine_ok hsvc_real hsvc_sub hreal_no hsub_no hPl hKeepMallocng γ tp hDealloc realloc := f3ReallocGhostHookFine_ok hsvc_real hsvc_sub hreal_no hsub_no hPl hKeepMallocng γ tp hRealloc @@ -3679,6 +3699,7 @@ theorem cliGhostAllocHooks_f3CliGhostHooksFixed [LibsignalPlacement] memcpy := hMemcpy memcpy_exact := hMemcpyExact memset_acp := hMemsetAcp + extraOk := hExtraOk theorem stringClone_hookSat_f3CliGhostHooksFixed [LibsignalPlacement] {keep : BitVec 64 → Bool} {P_real P_sub : Program} @@ -3686,6 +3707,7 @@ theorem stringClone_hookSat_f3CliGhostHooksFixed [LibsignalPlacement] {mmpl : Obj.MultiPlacement} {brkStart : BitVec 64} {lim : BudgetLimits} {stk : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (baseExt : LibsignalHooks) (hsvc_real : P_real.svc = Syscall.standard) (hsvc_sub : P_sub.svc = Syscall.standard) @@ -3699,7 +3721,7 @@ theorem stringClone_hookSat_f3CliGhostHooksFixed [LibsignalPlacement] (stringCloneBudgetCondSpec fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim)) : HookSat (cliGhostExterns - (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy) baseExt) + (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy extra) baseExt) lsStringCloneSym (stringCloneBudgetSpec fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim) := ⟨f3StringCloneGhostHookFine keep P_real P_sub T.stringClone mmpl brkStart lim, @@ -3712,6 +3734,7 @@ theorem allocContractsXCliPlaced_f3CliGhostHooksFixed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) {brkStart : BitVec 64} {lim : BudgetLimits} {stk : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (hsvc_real : P_real.svc = Syscall.standard) (hsvc_sub : P_sub.svc = Syscall.standard) (hreal_no : ∀ pc, keep pc = true → P_real.externAt? pc = none) @@ -3746,14 +3769,15 @@ theorem allocContractsXCliPlaced_f3CliGhostHooksFixed [LibsignalPlacement] HookFsTraced IsFsC f) (hMemcpyExact : ∀ f, fMemcpy = some f → HookExactMemcpy f) (hMemsetAcp : ∀ f, fMemset = some f → - ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) : + ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) + (hExtraOk : ExtraFullListSpecOk extra) : AllocContractsXCliPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliGhostExterns - (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy) + (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy extra) (cliExternsPlaced mmpl W)) := allocContractsXCliPlaced_of_hooks mmpl _ W (cliGhostAllocHooks_f3CliGhostHooksFixed hsvc_real hsvc_sub hreal_no hsub_no - hPl hKeepMallocng γ tp hAlloc hDealloc hRealloc hMemset hMemcpy hMemcpyExact hMemsetAcp) + hPl hKeepMallocng γ tp hAlloc hDealloc hRealloc hMemset hMemcpy hMemcpyExact hMemsetAcp hExtraOk) theorem allocContractsFsPlaced_f3CliGhostHooksFixed [LibsignalPlacement] {keep : BitVec 64 → Bool} {P_real P_sub : Program} @@ -3761,6 +3785,7 @@ theorem allocContractsFsPlaced_f3CliGhostHooksFixed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) {brkStart : BitVec 64} {lim : BudgetLimits} {stk : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (hsvc_real : P_real.svc = Syscall.standard) (hsvc_sub : P_sub.svc = Syscall.standard) (hreal_no : ∀ pc, keep pc = true → P_real.externAt? pc = none) @@ -3795,14 +3820,15 @@ theorem allocContractsFsPlaced_f3CliGhostHooksFixed [LibsignalPlacement] HookFsTraced IsFsC f) (hMemcpyExact : ∀ f, fMemcpy = some f → HookExactMemcpy f) (hMemsetAcp : ∀ f, fMemset = some f → - ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) : + ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) + (hExtraOk : ExtraFullListSpecOk extra) : AllocContractsFsPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliGhostExterns - (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy) + (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy extra) (cliExternsPlaced mmpl W)) := allocContractsFsPlaced_of_hooks mmpl _ W (cliGhostAllocHooks_f3CliGhostHooksFixed hsvc_real hsvc_sub hreal_no hsub_no - hPl hKeepMallocng γ tp hAlloc hDealloc hRealloc hMemset hMemcpy hMemcpyExact hMemsetAcp) + hPl hKeepMallocng γ tp hAlloc hDealloc hRealloc hMemset hMemcpy hMemcpyExact hMemsetAcp hExtraOk) theorem stage2ContractsMinPlaced_f3CliGhostHooksFixed [LibsignalPlacement] {keep : BitVec 64 → Bool} {P_real P_sub : Program} @@ -3810,6 +3836,7 @@ theorem stage2ContractsMinPlaced_f3CliGhostHooksFixed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) {brkStart : BitVec 64} {lim : BudgetLimits} {stk : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (hsvc_real : P_real.svc = Syscall.standard) (hsvc_sub : P_sub.svc = Syscall.standard) (hreal_no : ∀ pc, keep pc = true → P_real.externAt? pc = none) @@ -3844,14 +3871,15 @@ theorem stage2ContractsMinPlaced_f3CliGhostHooksFixed [LibsignalPlacement] HookFsTraced IsFsC f) (hMemcpyExact : ∀ f, fMemcpy = some f → HookExactMemcpy f) (hMemsetAcp : ∀ f, fMemset = some f → - ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) : + ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) + (hExtraOk : ExtraFullListSpecOk extra) : Stage2ContractsMinPlaced fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliGhostExterns - (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy) + (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy extra) (cliExternsPlaced mmpl W)) := stage2ContractsMinPlaced_of_hooks mmpl _ W (cliGhostAllocHooks_f3CliGhostHooksFixed hsvc_real hsvc_sub hreal_no hsub_no - hPl hKeepMallocng γ tp hAlloc hDealloc hRealloc hMemset hMemcpy hMemcpyExact hMemsetAcp) + hPl hKeepMallocng γ tp hAlloc hDealloc hRealloc hMemset hMemcpy hMemcpyExact hMemsetAcp hExtraOk) theorem codecHooksPlaced_f3CliGhostHooksFixed [LibsignalPlacement] {keep : BitVec 64 → Bool} {P_real P_sub : Program} @@ -3859,6 +3887,7 @@ theorem codecHooksPlaced_f3CliGhostHooksFixed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) {brkStart : BitVec 64} {lim : BudgetLimits} {stk : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (hsvc_real : P_real.svc = Syscall.standard) (hsvc_sub : P_sub.svc = Syscall.standard) (hreal_no : ∀ pc, keep pc = true → P_real.externAt? pc = none) @@ -3893,14 +3922,15 @@ theorem codecHooksPlaced_f3CliGhostHooksFixed [LibsignalPlacement] HookFsTraced IsFsC f) (hMemcpyExact : ∀ f, fMemcpy = some f → HookExactMemcpy f) (hMemsetAcp : ∀ f, fMemset = some f → - ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) : + ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) + (hExtraOk : ExtraFullListSpecOk extra) : CodecHooksPlaced fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliGhostExterns - (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy) + (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy extra) (cliExternsPlaced mmpl W)) := codecHooksPlaced_of_hooks mmpl _ W (cliGhostAllocHooks_f3CliGhostHooksFixed hsvc_real hsvc_sub hreal_no hsub_no - hPl hKeepMallocng γ tp hAlloc hDealloc hRealloc hMemset hMemcpy hMemcpyExact hMemsetAcp) + hPl hKeepMallocng γ tp hAlloc hDealloc hRealloc hMemset hMemcpy hMemcpyExact hMemsetAcp hExtraOk) theorem publicApiDecHooksPlaced_f3CliGhostHooksFixed [LibsignalPlacement] {keep : BitVec 64 → Bool} {P_real P_sub : Program} @@ -3908,6 +3938,7 @@ theorem publicApiDecHooksPlaced_f3CliGhostHooksFixed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) {brkStart : BitVec 64} {lim : BudgetLimits} {stk : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (hsvc_real : P_real.svc = Syscall.standard) (hsvc_sub : P_sub.svc = Syscall.standard) (hreal_no : ∀ pc, keep pc = true → P_real.externAt? pc = none) @@ -3944,14 +3975,15 @@ theorem publicApiDecHooksPlaced_f3CliGhostHooksFixed [LibsignalPlacement] HookFsTraced IsFsC f) (hMemcpyExact : ∀ f, fMemcpy = some f → HookExactMemcpy f) (hMemsetAcp : ∀ f, fMemset = some f → - ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) : + ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle) + (hExtraOk : ExtraFullListSpecOk extra) : PublicApiDecHooksPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliGhostExterns - (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy) + (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy extra) (cliExternsPlaced mmpl W)) := publicApiDecHooksPlaced_of_hooks mmpl _ W (cliGhostAllocHooks_f3CliGhostHooksFixed hsvc_real hsvc_sub hreal_no hsub_no - hPl hKeepMallocng γ tp hAlloc hDealloc hRealloc hMemset hMemcpy hMemcpyExact hMemsetAcp) + hPl hKeepMallocng γ tp hAlloc hDealloc hRealloc hMemset hMemcpy hMemcpyExact hMemsetAcp hExtraOk) (stringClone_hookSat_f3CliGhostHooksFixed (cliExternsPlaced mmpl W) hsvc_real hsvc_sub hreal_no hsub_no hPl hKeepMallocng γ tp hStrClone) @@ -3970,6 +4002,7 @@ theorem mainIoOfPlaced_f3CliGhostHooksFixed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) {brkStart : BitVec 64} {lim : BudgetLimits} {stk : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} (hsvc_real : P_real.svc = Syscall.standard) (hsvc_sub : P_sub.svc = Syscall.standard) (hreal_no : ∀ pc, keep pc = true → P_real.externAt? pc = none) @@ -3985,7 +4018,7 @@ theorem mainIoOfPlaced_f3CliGhostHooksFixed [LibsignalPlacement] (γ : GhostName) (tp : BitVec 64) : MainIoOfPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliGhostExterns - (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy) + (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy extra) (cliExternsPlaced mmpl W)) cliIo stk ReadStdinBoundedEnv (ReadFileRuleEnvFixed cliIo.rd) where readStdin := ls_hook_617_rocl_ok @@ -4017,10 +4050,11 @@ theorem hReadFixed_of_f3CliGhostHooksFixed [LibsignalPlacement] {mmpl : Obj.MultiPlacement} {brkStart : BitVec 64} {lim : BudgetLimits} {stk : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} {baseExt : LibsignalHooks} {callerProg : Program} {i bi : Nat} [IsLsBlockProg callerProg i (cliGhostExterns - (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy) baseExt)] + (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy extra) baseExt)] [CryptoVerification.LsBlockBound bi] (hsvc_real : P_real.svc = Syscall.standard) (hsvc_sub : P_sub.svc = Syscall.standard) @@ -4048,11 +4082,12 @@ theorem hReadFixed_withPanics_of_f3CliGhostHooksFixed [LibsignalPlacement] {mmpl : Obj.MultiPlacement} {brkStart : BitVec 64} {lim : BudgetLimits} {stk : Nat} {fMemset fMemcpy : Option (State → State)} + {extra : ExtraGhostTable} {baseExt : LibsignalHooks} {callerProg : Program} {i bi : Nat} [IsLsBlockProg callerProg i (Rust.withPanics (cliGhostExterns - (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy) baseExt))] + (f3CliGhostHooksFixed keep P_real P_sub T mmpl brkStart lim stk fMemset fMemcpy extra) baseExt))] [CryptoVerification.LsBlockBound bi] (hsvc_real : P_real.svc = Syscall.standard) (hsvc_sub : P_sub.svc = Syscall.standard) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/F3ExternNoAllocFail.lean b/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/F3ExternNoAllocFail.lean index a2a68c1bb..35514d505 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/F3ExternNoAllocFail.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/F3ExternNoAllocFail.lean @@ -1330,27 +1330,16 @@ private theorem tablePreserves_cliHookTablePlaced (mmpl : Obj.MultiPlacement) (W rcases hp with hpq | hcli · exact tablePreserves_cliPqxdhPlaced mmpl W.C W.Q p hpq · simp only [List.mem_cons, List.not_mem_nil, or_false] at hcli - rcases hcli with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | - rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl - · exact preservesNoAllocFailed_hookMemmove - · exact preservesNoAllocFailed_cliBcmpHook W.bcmp - · exact preservesNoAllocFailed_strlenHook + rcases hcli with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl · exact preservesNoAllocFailed_writeFileHook · exact preservesNoAllocFailed_writeStdoutHook - · exact preservesNoAllocFailed_memrchrHook - · exact preservesNoAllocFailed_fromUtf8Hook W.utf8Err · exact preservesNoAllocFailed_fmtWriteHook0 · exact preservesNoAllocFailed_formatInnerHook0 - · exact preservesNoAllocFailed_durationSinceExactHook - · exact preservesNoAllocFailed_timeAddHook - · exact preservesNoAllocFailed_blackBoxHook · exact preservesNoAllocFailed_compress256Hook W.C.F · exact preservesNoAllocFailed_aesEncHookMallocng mmpl W.C.E · exact preservesNoAllocFailed_aesDecHookMallocng mmpl W.C.D · exact preservesNoAllocFailed_pubFromSecretHook W.C.pubKey · exact preservesNoAllocFailed_diffieHellmanHook W.C.X - · exact preservesNoAllocFailed_zeroizeSecretHook - · exact preservesNoAllocFailed_zeroizeSecretHook /-- Every hook in `cliExternsPlaced mmpl W` preserves `allocFailedEvent ∉ s.trace`. -/ theorem externPreservesNoAllocFailed_cliExternsPlaced diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/Ghost617Transfer.lean b/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/Ghost617Transfer.lean index 635b350cb..7bb946c18 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/Ghost617Transfer.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/Ghost617Transfer.lean @@ -44,18 +44,17 @@ open CryptoVerification.E2E fmtWriteHook0 formatInnerHook0 kemDecapsHook kemEncapsHook libcruxHmacHookMallocng mlkemDecapsHook mlkemEncaps1Hook mlkemEncaps2Hook mlkemFromSeedHook mlkemPk1Hook mlkemPk2Hook mlkemValidatePkHook restoreCallerRegs scalarModHook scalarWideHook stepRustAlloc1 - stepRustDealloc1 timeAddHook toEdwardsHook torsionFreeHook writeVecHeader) + stepRustDealloc1 toEdwardsHook torsionFreeHook writeVecHeader) open CryptoVerification.LibsignalAesCbc (returnToLinkRegister) open CryptoVerification.LibsignalHmac (compress256Hook) -open CryptoVerification.LibsignalSession (blackBoxHook) open CryptoVerification.LibsignalTripleRatchet - (diffieHellmanHook pubFromSecretHook zeroizeSecretHook) + (diffieHellmanHook pubFromSecretHook) open CryptoVerification.SignalSession - (CliHooks Inputs cliBcmpHook cliExternsPlaced cliHookTablePlaced cliPqxdhHookTablePlaced - cliProcessInputs durationSinceExactHook fromUtf8Hook isCliPanicSymbolPlaced libsignalSessionLib + (CliHooks Inputs cliExternsPlaced cliHookTablePlaced cliPqxdhHookTablePlaced + cliProcessInputs isCliPanicSymbolPlaced libsignalSessionLib lsReadFileSym lsReadStdinSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli - lsRustNoAllocShimSymCli lsRustReallocSymCli lsStringCloneSym memrchrHook strlenHook unitResult - unmodelled writeFileHook writeStdoutHook) + lsRustNoAllocShimSymCli lsRustReallocSymCli lsStringCloneSym unitResult + writeFileHook writeStdoutHook) open CryptoVerification.SignalSession.Placed (DirectOrBranchStub) open CryptoVerification.SignalSession.Cli (RunAnswer) open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) @@ -553,7 +552,9 @@ theorem stubReachesTargetOn_of_directOrBranchStub rw [hev] at hstep exact Steps.step hstep (Steps.refl _) -/-- Active symbol/hook pairs overridden by `ghFixed : CliGhostHooks` in `cliGhostExterns`. -/ +/-- Active symbol/hook pairs overridden by `ghFixed : CliGhostHooks` in `cliGhostExterns` + (10 named slots + domain-guarded Cutover-2 `ghFixed.extra` table; `rfl`-equal to + `ExtraGhostReplay.GhostSymActiveWithExtra ghFixed ghFixed.extra`). -/ def GhostSymActive (ghFixed : CliGhostHooks) (sym : String) (f : State → State) : Prop := (sym = lsRustAllocSymCli ∧ f = ghFixed.alloc) ∨ (sym = lsRustDeallocSymCli ∧ f = ghFixed.dealloc) ∨ @@ -564,14 +565,16 @@ def GhostSymActive (ghFixed : CliGhostHooks) (sym : String) (f : State → State (sym = lsReadFileSym ∧ ∃ h, ghFixed.readFile = some ⟨f, h⟩) ∨ (sym = lsReadStdinSym ∧ ∃ h, ghFixed.readStdin = some ⟨f, h⟩) ∨ (sym = CryptoVerification.SignalSession.lsMemsetSym ∧ ghFixed.memset = some f) ∨ - (sym = CryptoVerification.SignalSession.lsMemcpySym ∧ ghFixed.memcpy = some f) + (sym = CryptoVerification.SignalSession.lsMemcpySym ∧ ghFixed.memcpy = some f) ∨ + (CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym = true ∧ + ghFixed.extra.lookup sym = some f) /-- `cliGhostExterns ghFixed baseExt` only adds hooks: if it maps `sym` to `none`, so does `baseExt`. -/ theorem cliGhostExterns_none_imp {ghFixed : CliGhostHooks} {baseExt : String → Option (State → State)} {sym : String} (h : cliGhostExterns ghFixed baseExt sym = none) : baseExt sym = none := by - unfold cliGhostExterns at h + unfold cliGhostExterns CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExternsWithExtra at h split at h <;> try cases h split at h <;> try cases h split at h <;> try cases h @@ -597,7 +600,11 @@ theorem cliGhostExterns_none_imp · split at h · cases h · exact h - · exact h + · split at h + · split at h + · cases h + · exact h + · exact h private theorem findSome?_const_none {α β : Type} (xs : List α) (p : α → Bool) : (xs.findSome? fun x => if p x then (none : Option β) else none) = none := by @@ -648,7 +655,7 @@ private theorem cliGhostExterns_some_cases {sym : String} {f : State → State} (h : cliGhostExterns ghFixed baseExt sym = some f) : GhostSymActive ghFixed sym f ∨ baseExt sym = some f := by - unfold cliGhostExterns at h + unfold cliGhostExterns CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExternsWithExtra at h cases hc1 : (sym == lsRustAllocSymCli) with | true => simp only [hc1, ↓reduceIte] at h @@ -753,10 +760,24 @@ private theorem cliGhostExterns_some_cases rw [hmc] at h injection h with h subst h - exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr ⟨beq_iff_eq.mp hc10, hmc⟩))))))))) + exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inl ⟨beq_iff_eq.mp hc10, hmc⟩)))))))))) | false => simp only [hc10, Bool.false_eq_true, ↓reduceIte] at h - exact Or.inr h + cases hc11 : CryptoVerification.SignalSession.Cli.RunGlue.cliExtraGhostSyms.contains sym with + | true => + simp only [hc11, ↓reduceIte] at h + cases hex : ghFixed.extra.lookup sym with + | none => + rw [hex] at h + exact Or.inr h + | some g => + rw [hex] at h + injection h with h + subst h + exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr ⟨hc11, hex⟩)))))))))) + | false => + simp only [hc11, Bool.false_eq_true, ↓reduceIte] at h + exact Or.inr h private theorem findSome?_stubs_cliGhostExterns_cases (exts : List String) (ρ : String → BitVec 64) (base pc : BitVec 64) @@ -1490,11 +1511,7 @@ private theorem table_cliHookTablePlaced_execFrozen (mmpl : Obj.MultiPlacement) rcases hp with hpq | hcli · exact table_cliPqxdhPlaced_execFrozen mmpl W.C W.Q p hpq · simp only [List.mem_cons, List.not_mem_nil, or_false] at hcli - rcases hcli with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | - rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl - · intro u hfr; unfold hookMemmove hookMemcpy; rw [retHook_mem]; exact execFrozen_writeBytes hfr _ _ - · intro _ hfr; exact hfr - · intro u hfr; unfold strlenHook; dsimp only; split <;> exact hfr + rcases hcli with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl · intro u hfr unfold writeFileHook; dsimp only split @@ -1505,39 +1522,13 @@ private theorem table_cliHookTablePlaced_execFrozen (mmpl : Obj.MultiPlacement) · exact hfr · split <;> exact hfr · intro u hfr; unfold writeStdoutHook; dsimp only; split <;> exact hfr - · intro u hfr - unfold memrchrHook; dsimp only - split - · exact hfr - · split <;> exact hfr - · intro u hfr - unfold fromUtf8Hook; dsimp only - split - · exact hfr - · split - · rw [retHook_mem] - exact execFrozen_write64 (execFrozen_write64 (execFrozen_write64 hfr _ _) _ _) _ _ - · rw [retHook_mem] - exact execFrozen_write16 (execFrozen_write64 (execFrozen_write64 hfr _ _) _ _) _ _ · intro _ hfr; exact hfr · intro u hfr; unfold formatInnerHook0; rw [retHook_mem]; exact execFrozen_writeVecHeader hfr _ _ _ _ - · intro u hfr - unfold durationSinceExactHook; dsimp only - split - · exact hfr - · split - · rw [retHook_mem] - exact execFrozen_write32 (execFrozen_write64 (execFrozen_write64 hfr _ _) _ _) _ _ - · exact hfr - · intro u hfr; unfold timeAddHook; dsimp only; split <;> split <;> exact hfr - · intro _ hfr; exact hfr · intro u hfr; unfold compress256Hook; rw [returnToLinkRegister_mem]; exact execFrozen_writeBytes hfr _ _ · exact execFrozen_aesEncHookMallocng mmpl W.C.E · exact execFrozen_aesDecHookMallocng mmpl W.C.D · intro u hfr; unfold pubFromSecretHook; rw [retHook_mem]; exact execFrozen_writeBytes hfr _ _ · intro u hfr; unfold diffieHellmanHook; rw [retHook_mem]; exact execFrozen_writeBytes hfr _ _ - · intro u hfr; unfold zeroizeSecretHook; rw [retHook_mem]; exact execFrozen_writeBytes hfr _ _ - · intro u hfr; unfold zeroizeSecretHook; rw [retHook_mem]; exact execFrozen_writeBytes hfr _ _ /-- Every hook `f` in `cliExternsPlaced mmpl W` (`39` rows + `Rust.panicked`) preserves `ExecFrozen` unconditionally. -/ @@ -1595,11 +1586,7 @@ private theorem table_cliHookTablePlaced_fdsGe3Closed (mmpl : Obj.MultiPlacement rcases hp with hpq | hcli · exact table_cliPqxdhPlaced_fdsGe3Closed mmpl W p hpq · simp only [List.mem_cons, List.not_mem_nil, or_false] at hcli - rcases hcli with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | - rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl - · exact Or.inl (fun _ hfs => hfs) - · exact Or.inl (fun _ hfs => hfs) - · exact Or.inl (fun u hfs => by unfold strlenHook; dsimp only; split <;> exact hfs) + rcases hcli with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl · refine Or.inl (fun u hfs => ?_) unfold writeFileHook; dsimp only split @@ -1613,32 +1600,13 @@ private theorem table_cliHookTablePlaced_fdsGe3Closed (mmpl : Obj.MultiPlacement · exact hfs · exact fdsGe3Closed_setFile _ _ hfs · exact Or.inl (fun u hfs => by unfold writeStdoutHook; dsimp only; split <;> exact hfs) - · exact Or.inl (fun u hfs => by - unfold memrchrHook; dsimp only - split - · exact hfs - · split <;> exact hfs) - · exact Or.inl (fun u hfs => by - unfold fromUtf8Hook; dsimp only - split - · exact hfs - · split <;> exact hfs) - · exact Or.inl (fun _ hfs => hfs) · exact Or.inl (fun _ hfs => hfs) - · exact Or.inl (fun u hfs => by - unfold durationSinceExactHook; dsimp only - split - · exact hfs - · split <;> exact hfs) - · exact Or.inl (fun u hfs => by unfold timeAddHook; dsimp only; split <;> split <;> exact hfs) · exact Or.inl (fun _ hfs => hfs) · exact Or.inl (fun _ hfs => hfs) · exact Or.inr (Or.inl rfl) · exact Or.inr (Or.inr (Or.inl rfl)) · exact Or.inl (fun _ hfs => hfs) · exact Or.inl (fun _ hfs => hfs) - · exact Or.inl (fun _ hfs => hfs) - · exact Or.inl (fun _ hfs => hfs) /-- Every hook `f` in `cliExternsPlaced mmpl W` except the `3` `mallocng`-backed crypto hooks (`aesEncHookMallocng`, `aesDecHookMallocng`, `libcruxHmacHookMallocng`) preserves `FdsGe3Closed` diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/M24L4BEquiv.lean b/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/M24L4BEquiv.lean index d1789d6c2..3bf36d7c3 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/M24L4BEquiv.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/F3/L4B/M24L4BEquiv.lean @@ -12,18 +12,22 @@ module public import ProofLib.StdStartup.Layout public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced +public import LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad public import LibsignalBinary.Proofs.SignalSession.Cli.M24.CliElfMallocngHarness public import LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced +public import LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic /-! -# `M24` ↔ `F3.L4B` `NeedLocks` Specification Equivalences +# `M24` (SWAR-Padded) ↔ `F3.L4B` `NeedLocks` Specification Equivalences Establishes definitional and extensional equalities (`=`) and bi-implications (`↔`) between the -`NeedLocks`, `argvAtRO`, `cliProgExtPlacedAt`, `cliStaticsPlacedAt`, `MuslHarnessFineNeedLocksPerInput`, -and `MainOkCliExt*B2NeedLocksPlacedAt` definitions in `M24.{CliElfMallocngHarness,CliStrictPlaced}` -and `F3.L4B.{F3HarnessPlaced,CliStrictPlaced2}`. +SWAR-padded `NeedLocks`, `argvAtROPad`, `MuslHarnessFineNeedLocks{,Guarded}PadPerInput`, and +`MainOkCliExt*B2NeedLocksPadPlacedAt` definitions in +`M24.{ArgvPad,CliElfMallocngHarness,CliStrictPlaced,CliStrictPlacedPadSat}` and the SWAR-padded +`F3.L4B.{F3HarnessPlaced,CliStrictPlaced2}` definitions (`M24.CliStrictPlaced.argvAtRO` stays +unpadded). -/ @[expose] public section @@ -41,26 +45,26 @@ open LibsignalBinary.Heap.Fine (FineBudget) /-! ## `cStrAtRO`, `argvAtRO`, `B2MainEntryFacts`, and `b2MainSpecTightNeedLocksFineAt` -/ theorem cStrAtRO_eq (p : BitVec 64) (s : List (BitVec 8)) : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.cStrAtRO p s = + LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.cStrAtROPad p s = LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.cStrAtRO p s := rfl theorem cStrAtRO_fun_eq : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.cStrAtRO = + LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.cStrAtROPad = LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.cStrAtRO := rfl theorem argvAtRO_eq : ∀ (a : BitVec 64) (ss : List (List (BitVec 8))), - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.argvAtRO a ss = + LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.argvAtROPad a ss = LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.argvAtRO a ss | _, [] => rfl | a, s :: ss => by - simp only [LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.argvAtRO, + simp only [LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.argvAtROPad, LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.argvAtRO, cStrAtRO_eq, argvAtRO_eq (a + 8#64) ss] theorem argvAtRO_fun_eq : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.argvAtRO = + LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.argvAtROPad = LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.argvAtRO := by funext a ss exact argvAtRO_eq a ss @@ -82,22 +86,22 @@ theorem B2MainEntryFacts_fun_eq : theorem b2MainFrameFine_eq {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (st : M.σ) (stk : Nat) (Statics : SepProp) (i : Inputs) (s : State) : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.b2MainFrameFine + LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.b2MainFrameFinePad A lim st stk Statics i s = LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.b2MainFrameFine A lim st stk Statics i s := by - simp only [LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.b2MainFrameFine, + simp only [LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.b2MainFrameFinePad, LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.b2MainFrameFine, argvAtRO_eq] theorem b2MainEntryPreFine_eq (CodeOk : Memory → Prop) {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (st : M.σ) (stk : Nat) (Statics : SepProp) (i : Inputs) (s : State) : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.b2MainEntryPreFine + LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.b2MainEntryPreFinePad CodeOk A lim st stk Statics i s = LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.b2MainEntryPreFine CodeOk A lim st stk Statics i s := by - simp only [LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.b2MainEntryPreFine, + simp only [LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.b2MainEntryPreFinePad, LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.b2MainEntryPreFine, b2MainFrameFine_eq] @@ -105,11 +109,11 @@ theorem b2MainSpecTightNeedLocksFineAt_eq (libcAddr : BitVec 64) (CodeOk : Memor {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (st : M.σ) (stk : Nat) (Statics : SepProp) (Run : Inputs → RunAnswer → Prop) (inputsOf : Inputs → ProcessInputs) : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.b2MainSpecTightNeedLocksFineAt + LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.b2MainSpecTightNeedLocksFineAtPad libcAddr CodeOk A lim st stk Statics Run inputsOf = LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.b2MainSpecTightNeedLocksFineAt libcAddr CodeOk A lim st stk Statics Run inputsOf := by - unfold LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.b2MainSpecTightNeedLocksFineAt + unfold LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.b2MainSpecTightNeedLocksFineAtPad LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.b2MainSpecTightNeedLocksFineAt congr 1 funext g s @@ -204,7 +208,7 @@ theorem subroutine_ok_b2MainSpecTightNeedLocksFineAt_eq (LibsignalBinary.Proofs.SignalSession.Cli.M24.CliElfMallocngHarness.cliProgExtPlacedAt mpl ext idx W) pc - (LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.b2MainSpecTightNeedLocksFineAt + (LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.b2MainSpecTightNeedLocksFineAtPad libcAddr CodeOk A lim st stk Statics Run inputsOf) = subroutine_ok (LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced.cliProgExtPlacedAt @@ -225,7 +229,7 @@ theorem subroutine_ok_b2MainSpecTightNeedLocksFineAt_iff (LibsignalBinary.Proofs.SignalSession.Cli.M24.CliElfMallocngHarness.cliProgExtPlacedAt mpl ext idx W) pc - (LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.b2MainSpecTightNeedLocksFineAt + (LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.b2MainSpecTightNeedLocksFineAtPad libcAddr CodeOk A lim st stk Statics Run inputsOf) ↔ subroutine_ok (LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced.cliProgExtPlacedAt @@ -240,15 +244,16 @@ theorem muslHarnessFineNeedLocksPerInput_eq (inputsOf : Inputs → ProcessInputs) (mmpl : Obj.MultiPlacement) (lim : BudgetLimits) (st : FineBudget) (stk : Nat) (CodeOk : Memory → Prop) (Statics : SepProp) : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.MuslHarnessFineNeedLocksPerInput + LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat.MuslHarnessFineNeedLocksPadPerInput exitStk libcAddr elf P mainPc inputsOf mmpl lim st stk CodeOk Statics = LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.MuslHarnessFineNeedLocksPerInput exitStk libcAddr elf P mainPc inputsOf mmpl lim st stk CodeOk Statics := by - unfold LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.MuslHarnessFineNeedLocksPerInput + unfold + LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat.MuslHarnessFineNeedLocksPadPerInput LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.MuslHarnessFineNeedLocksPerInput - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.b2MainEntryPreFine + LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.b2MainEntryPreFinePad LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.b2MainEntryPreFine - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.b2MainFrameFine + LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.b2MainFrameFinePad LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.b2MainFrameFine simp only [argvAtRO_eq] @@ -257,7 +262,7 @@ theorem muslHarnessFineNeedLocksPerInput_iff (inputsOf : Inputs → ProcessInputs) (mmpl : Obj.MultiPlacement) (lim : BudgetLimits) (st : FineBudget) (stk : Nat) (CodeOk : Memory → Prop) (Statics : SepProp) : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.MuslHarnessFineNeedLocksPerInput + LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat.MuslHarnessFineNeedLocksPadPerInput exitStk libcAddr elf P mainPc inputsOf mmpl lim st stk CodeOk Statics ↔ LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.MuslHarnessFineNeedLocksPerInput exitStk libcAddr elf P mainPc inputsOf mmpl lim st stk CodeOk Statics := by @@ -278,16 +283,16 @@ theorem muslHarnessFineNeedLocksGuardedPerInput_eq (inputsOf : Inputs → ProcessInputs) (mmpl : Obj.MultiPlacement) (lim : BudgetLimits) (st : FineBudget) (stk : Nat) (CodeOk : Memory → Prop) (Statics : SepProp) (EntryGuard : State → Prop) : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.MuslHarnessFineNeedLocksGuardedPerInput + LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat.MuslHarnessFineNeedLocksGuardedPadPerInput exitStk libcAddr elf P mainPc inputsOf mmpl lim st stk CodeOk Statics EntryGuard = LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.MuslHarnessFineNeedLocksGuardedPerInput exitStk libcAddr elf P mainPc inputsOf mmpl lim st stk CodeOk Statics EntryGuard := by unfold - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.MuslHarnessFineNeedLocksGuardedPerInput + LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat.MuslHarnessFineNeedLocksGuardedPadPerInput LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.MuslHarnessFineNeedLocksGuardedPerInput - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.b2MainEntryPreFine + LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.b2MainEntryPreFinePad LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.b2MainEntryPreFine - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.b2MainFrameFine + LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad.b2MainFrameFinePad LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.b2MainFrameFine simp only [argvAtRO_eq] @@ -296,7 +301,7 @@ theorem muslHarnessFineNeedLocksGuardedPerInput_iff (inputsOf : Inputs → ProcessInputs) (mmpl : Obj.MultiPlacement) (lim : BudgetLimits) (st : FineBudget) (stk : Nat) (CodeOk : Memory → Prop) (Statics : SepProp) (EntryGuard : State → Prop) : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.MuslHarnessFineNeedLocksGuardedPerInput + LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat.MuslHarnessFineNeedLocksGuardedPadPerInput exitStk libcAddr elf P mainPc inputsOf mmpl lim st stk CodeOk Statics EntryGuard ↔ LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.MuslHarnessFineNeedLocksGuardedPerInput exitStk libcAddr elf P mainPc inputsOf mmpl lim st stk CodeOk Statics EntryGuard := by @@ -307,11 +312,11 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_eq (ext : CliHooks → String → Option (State → State)) (mainIdx : Nat) (inputsOf : Inputs → ProcessInputs) (CodeOk : Memory → Prop) (libcAddr brkStart : BitVec 64) (stk : Nat) (lim : BudgetLimits) : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.MainOkCliExtPqB2NeedLocksPlacedAt + LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat.MainOkCliExtPqB2NeedLocksPadPlacedAt mpl mmpl ext mainIdx inputsOf CodeOk libcAddr brkStart stk lim = LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl ext mainIdx inputsOf CodeOk libcAddr brkStart stk lim := by - simp only [LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.MainOkCliExtPqB2NeedLocksPlacedAt, + simp only [LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat.MainOkCliExtPqB2NeedLocksPadPlacedAt, LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.MainOkCliExtPqB2NeedLocksPlacedAt, cliProgExtPlacedAt_eq, b2MainSpecTightNeedLocksFineAt_eq, cliStaticsPlacedAt_eq] @@ -320,7 +325,7 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_iff (ext : CliHooks → String → Option (State → State)) (mainIdx : Nat) (inputsOf : Inputs → ProcessInputs) (CodeOk : Memory → Prop) (libcAddr brkStart : BitVec 64) (stk : Nat) (lim : BudgetLimits) : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.MainOkCliExtPqB2NeedLocksPlacedAt + LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat.MainOkCliExtPqB2NeedLocksPadPlacedAt mpl mmpl ext mainIdx inputsOf CodeOk libcAddr brkStart stk lim ↔ LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl ext mainIdx inputsOf CodeOk libcAddr brkStart stk lim := by @@ -331,11 +336,11 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_eq (ext : CliHooks → String → Option (State → State)) (mainIdx : Nat) (inputsOf : Inputs → ProcessInputs) (CodeOk : Memory → Prop) (libcAddr brkStart : BitVec 64) (stk : Nat) (lim : BudgetLimits) : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.MainOkCliExtOverB2NeedLocksPlacedAt + LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat.MainOkCliExtOverB2NeedLocksPadPlacedAt mpl mmpl ext mainIdx inputsOf CodeOk libcAddr brkStart stk lim = LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl ext mainIdx inputsOf CodeOk libcAddr brkStart stk lim := by - simp only [LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.MainOkCliExtOverB2NeedLocksPlacedAt, + simp only [LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat.MainOkCliExtOverB2NeedLocksPadPlacedAt, LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.MainOkCliExtOverB2NeedLocksPlacedAt, cliProgExtPlacedAt_eq, b2MainSpecTightNeedLocksFineAt_eq, cliStaticsPlacedAt_eq] @@ -344,7 +349,7 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_iff (ext : CliHooks → String → Option (State → State)) (mainIdx : Nat) (inputsOf : Inputs → ProcessInputs) (CodeOk : Memory → Prop) (libcAddr brkStart : BitVec 64) (stk : Nat) (lim : BudgetLimits) : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.MainOkCliExtOverB2NeedLocksPlacedAt + LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat.MainOkCliExtOverB2NeedLocksPadPlacedAt mpl mmpl ext mainIdx inputsOf CodeOk libcAddr brkStart stk lim ↔ LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl ext mainIdx inputsOf CodeOk libcAddr brkStart stk lim := by @@ -353,7 +358,7 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_iff theorem mainOkCliF3PqB2NeedLocksPlacedAt_iff (mpl mmpl : Obj.MultiPlacement) (CodeOk : Memory → Prop) (libcAddr brkStart : BitVec 64) (stk : Nat) : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.MainOkCliExtPqB2NeedLocksPlacedAt + LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat.MainOkCliExtPqB2NeedLocksPadPlacedAt mpl mmpl (cliExternsPlaced mmpl) 617 cliProcessInputs CodeOk libcAddr brkStart stk LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.cliBudgetLimits ↔ LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.MainOkCliF3PqB2NeedLocksPlacedAt @@ -365,7 +370,7 @@ theorem mainOkCliF3PqB2NeedLocksPlacedAt_iff theorem mainOkCliF3OverB2NeedLocksPlacedAt_iff (mpl mmpl : Obj.MultiPlacement) (CodeOk : Memory → Prop) (libcAddr brkStart : BitVec 64) (stk : Nat) : - LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced.MainOkCliExtOverB2NeedLocksPlacedAt + LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat.MainOkCliExtOverB2NeedLocksPadPlacedAt mpl mmpl (cliExternsPlaced mmpl) 617 cliProcessInputs CodeOk libcAddr brkStart stk LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.cliBudgetLimits ↔ LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.MainOkCliF3OverB2NeedLocksPlacedAt diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Heap/AllocWithFds.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Heap/AllocWithFds.lean index abc723472..cf2056e46 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Heap/AllocWithFds.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Heap/AllocWithFds.lean @@ -560,6 +560,7 @@ theorem cliGhostAllocHooks_withFds [LibsignalPlacement] {M : AllocCostModel} memcpy := h.memcpy memcpy_exact := h.memcpy_exact memset_acp := h.memset_acp + extraOk := h.extraOk theorem cliGhostSpqrAllocHooks_withFds [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {g : CliGhostHooks} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/BcmpCode.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/BcmpCode.lean index 69e34886d..6d914d10b 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/BcmpCode.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/BcmpCode.lean @@ -741,14 +741,14 @@ theorem hookBcmpFallback_vmPreserved (s : State) : cliBcmpHook_vmPreserved canonicalBcmp s /-- Corollary: `cliBcmpHook W.bcmp` satisfies `masterBcmpSpec` for every `W : CliHooks`. -/ -theorem hookBcmp_masterBcmp_ok (W : CliHooks) : - HookOk (cliBcmpHook W.bcmp) masterBcmpSpec := - hookBcmpOf_masterBcmp_ok W.bcmp W.bcmp_ok +theorem hookBcmp_masterBcmp_ok (_W : CliHooks) : + HookOk (cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp) masterBcmpSpec := + hookBcmpOf_masterBcmp_ok CryptoVerification.SignalSession.cliDefaultBcmp CryptoVerification.SignalSession.cliDefaultBcmp_ok /-- Corollary: `cliBcmpHook W.bcmp` satisfies `bcmpSpecK keep masterBcmpSpec` for every `W`. -/ -theorem hookBcmp_masterBcmpK_ok (keep : BitVec 64 → Bool) (W : CliHooks) : - HookOk (cliBcmpHook W.bcmp) (bcmpSpecK keep masterBcmpSpec) := - hookBcmpOf_masterBcmpK_ok keep W.bcmp W.bcmp_ok +theorem hookBcmp_masterBcmpK_ok (keep : BitVec 64 → Bool) (_W : CliHooks) : + HookOk (cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp) (bcmpSpecK keep masterBcmpSpec) := + hookBcmpOf_masterBcmpK_ok keep CryptoVerification.SignalSession.cliDefaultBcmp CryptoVerification.SignalSession.cliDefaultBcmp_ok /-! ## 4. Generic `HookOk` Consequence Lifts from `masterBcmpSpec` -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/BcmpGhostReplays.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/BcmpGhostReplays.lean new file mode 100644 index 000000000..ef5260e77 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/BcmpGhostReplays.lean @@ -0,0 +1,619 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.BcmpRowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpCode -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhost -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostK -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpLrTrap -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric -- proof-setup: allow-public-import + +/-! +# Card L1-c Pilot — `"bcmp"` Row Consumer Spec & Generic-`InvS` Ghost Replay (`HooksDehook.BcmpGhostReplays`) + +Pilot card **`c`** (`L1-c`) for `"bcmp"` in the `W2-C11` `CliGhostHooks.extra` framework +(`w2_c11_design_v2.md` §§1.2–1.3, §§6.1–6.2), delivering **Artifact 1** (`GhostRowSpecOk`) and +the generic-`InvS` **Artifact 2a** (`GhostRowReplayOn`) in the lightweight `Cli/HooksDehook` cone +(`0` `CliElfLib` / `ElfF3Relink` / C2 / trusted imports): + +1. **Row Anchor & `W`-Independent Ghost (`bcmpHullBase`, `keepR_bcmp`, `bcmpSubProg`, `bcmpGhost`):** + - `"bcmp"` is in `libsignalSessionLib`, whereas `"memcmp"` is unhooked and absent from + `libsignalSessionLib`. `bcmpHullBase mpl := libsignalSessionLib.resolve mpl "bcmp" - memcmpByteLen` + encodes the C2 `2C` stock `libc.a` layout convention that `memcmp` (`52` B = `13` words) sits + immediately before `bcmp` (`4` B = `1` word `b #-52`), giving the unconditional identity + `bcmpHullBase mpl + memcmpByteLen = libsignalSessionLib.resolve mpl "bcmp"`. Because this is a + pure definition (`0` premises), on any hypothetical layout where `memcmp` did not immediately + precede `bcmp`, the downstream `(bcmpSubProg mpl).CodeLoaded u.mem` hypothesis would simply be + undischargeable rather than unsound. + - `bcmpGhost mpl mmpl` wraps `BcmpGhostK.f3EmptyBcmpGhostHook` (`P_real := emptyStdProg`, + `fallback := hookBcmpFallback`), so it has **zero `W : CliHooks` dependence** (`REV-PILOT` Q1/N1) + and fits directly into `CliGhostHooks.extra : List (String × (State → State))`. +2. **Artifact 1 — Unconditional `GhostRowSpecOk "bcmp" (bcmpGhost mpl mmpl)` (`0` premises):** + - `bcmpGhost_rowSpecOk` proves `fs_eq`, `fsT : HookFsTraced IsFsC`, and `BcmpRowSpec` (all `6` + consumer arms: `cliBcmpSpec` and `bcmpVregsSpec`, plain, `withVmPreserved`, and `withAlloc A lim`) + unconditionally for every `(mpl, mmpl)` via `BcmpRowSpec.of_vm`. +3. **Artifact 2a — Generic-`InvS` `GhostRowReplayOn` (`F1` + `H1` compliant):** + - **F1 (`pc ≠ resolve mpl "bcmp"` exclusion on `P_ghost`, whole-hull on de-hooked `P_real`):** + `hRealHullNoExt` quantifies over all `keepR_bcmp mpl pc = true` **only** on the de-hooked real + program `P_real := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W` (post-Cutover-2, once + `"bcmp"` is dropped from `cliHookTablePlaced`, so neither `memcmp` nor `bcmp` carries an extern + hook on `P_real`). On the ghost program `P_ghost := cliProgExtPlacedAt mpl EG 617 W`, `stubPc := + libsignalSessionLib.resolve mpl "bcmp"` carries `some (bcmpGhost mpl mmpl)`, so `hGhostNoExtNe` + **strictly excludes `pc ≠ libsignalSessionLib.resolve mpl "bcmp"`** and routes through + `BcmpLrTrap.f3EmptyBcmpGhostHook_keepLr_false_after_hook_of_codeLoaded_u`. + - **H1 (`CodeLoaded u.mem` from `InvS u`):** `hCL` extracts `(bcmpSubProg mpl).CodeLoaded u.mem` + from `InvS u` at each intermediate call state `u` (never `s0.mem`). We also export + `bcmpSubProg_codeLoaded_stripExecOutside_iff` so `hCL` can equivalently be supplied in + `stripExecOutside (keepR_bcmp mpl) u.mem` form (matching STARTUP's + `Lib2LayoutFacts.f3CodeInv_rxWords_codeLoaded_strip`, `Lib2LayoutFacts.lean @a230f2671b:203-215`). + - Also supports the general `C4` interior-hook disjunct (`bcmpGhost_rowReplayOn_of_interior`, + matching `w2_c11_design_v2.md` §6.2 `:432–451` verbatim) and `K`-narrowed `bcmpGhostK`. +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays + +open Arm64 Arm64.Obj Arm64.Process ProofLib +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession (CliHooks cliExternsPlaced libsignalSessionLib) +open CryptoVerification.SignalSession.Cli.RunGlue (IsFsC) +open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer ( + ActiveRealPre ActiveRealRun ExecFrozen keepFsTrace linkedCallHook +) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.BcmpRowSpec ( + BcmpRowSpec +) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs ( + ExtraRowSpec GhostRowSpecOk +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay ( + GhostRowOk GhostRowReplayOn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhostK (emptyStdProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords ( + TrapHook +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpCode ( + memcmpByteLen bcmpHullWords pureWordsProg_bcmpHull_hasWords pureWordsProg_externAt_none + hookBcmpFallback +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostK ( + f3EmptyBcmpGhostHook f3EmptyBcmpGhostHookK + f3EmptyBcmpGhostHook_eq f3EmptyBcmpGhostHookK_eq + f3EmptyBcmpGhostHook_fs f3EmptyBcmpGhostHookK_fs + f3EmptyBcmpGhostHook_fsT f3EmptyBcmpGhostHookK_fsT + f3EmptyBcmpGhostHook_vmPreserved + f3EmptyBcmpGhostHook_dirCliBcmp_ok f3EmptyBcmpGhostHook_bcmpVregs_ok + f3EmptyBcmpGhostHook_visitedIn f3EmptyBcmpGhostHookK_visitedIn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpLrTrap ( + bcmpHullByteLen keepBcmpHull keepBcmpHull_iff keepBcmpHull_entry + bcmpHullWords_eq_canonical bcmpHull_codeLoaded_stripExecOutside + BcmpEntryGuard + bcmpHull_keepLr_false_after_hook_of_codeLoaded_u + bcmpHull_reg_ext_of_stub_excluded + trapHook_f3EmptyBcmpGhostHook_of_cover + f3EmptyBcmpGhostHook_keepLr_false_after_hook_of_codeLoaded_u + f3EmptyBcmpGhostHookK_keepLr_false_after_hook_of_codeLoaded_u +) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric ( + h2fsgen_steps_lift_of_visitedIn_noExtern +) + +/-! ## 1. Row Anchor Definitions, Algebraic Identities & `CodeLoaded` Bridges -/ + +/-- Computed base address of the contiguous 56-byte (`14`-word) `memcmp ++ bcmp` hull for placement + `mpl`, defined relative to `"bcmp"` (`resolve mpl "bcmp" - memcmpByteLen`) because `"memcmp"` is + unhooked and absent from `libsignalSessionLib`. + *Layout note (`HOOKS-PREP` M0 note 2):* Encodes the C2 `2C` stock `libc.a` layout where `13`-word + `memcmp` (`52` B) sits immediately before `1`-word `bcmp` (`b #-52` at `+52`). If a placement had + other bytes at `resolve mpl "bcmp" - 52#64`, `(bcmpSubProg mpl).CodeLoaded u.mem` would simply not + hold; no axiom or layout assumption is baked in. -/ +@[expose] def bcmpHullBase (mpl : Obj.MultiPlacement) : BitVec 64 := + libsignalSessionLib.resolve mpl "bcmp" - memcmpByteLen + +/-- Unconditional BitVec identity: `bcmpHullBase mpl + memcmpByteLen = resolve mpl "bcmp"`. -/ +theorem bcmpHullBase_add_memcmpByteLen (mpl : Obj.MultiPlacement) : + bcmpHullBase mpl + memcmpByteLen = libsignalSessionLib.resolve mpl "bcmp" := by + dsimp only [bcmpHullBase] + bv_omega + +/-- Kept-region byte predicate `[bcmpHullBase mpl, bcmpHullBase mpl + 56)` for `"bcmp"`. -/ +@[expose] def keepR_bcmp (mpl : Obj.MultiPlacement) : BitVec 64 → Bool := + keepBcmpHull (bcmpHullBase mpl) + +/-- `"bcmp"`'s resolved entry address lies inside `keepR_bcmp mpl`. -/ +theorem keepR_bcmp_entry (mpl : Obj.MultiPlacement) : + keepR_bcmp mpl (libsignalSessionLib.resolve mpl "bcmp") = true := by + dsimp only [keepR_bcmp] + rw [← bcmpHullBase_add_memcmpByteLen mpl] + exact keepBcmpHull_entry (bcmpHullBase mpl) + +/-- Pure 14-word (`56`-byte) sub-program holding `bcmpHullWords (bcmpHullBase mpl)` at + `bcmpHullBase mpl` (with default `resolve := fun _ => bcmpHullBase mpl`, so + `resolve "memcmp" = bcmpHullBase mpl` holds by `rfl`). -/ +@[expose] def bcmpSubProg (mpl : Obj.MultiPlacement) : Program := + pureWordsProg (bcmpHullBase mpl) (bcmpHullWords (bcmpHullBase mpl)) + +theorem bcmpSubProg_base (mpl : Obj.MultiPlacement) : + (bcmpSubProg mpl).base = bcmpHullBase mpl := rfl + +theorem bcmpSubProg_svc (mpl : Obj.MultiPlacement) : + (bcmpSubProg mpl).svc = Syscall.standard := rfl + +theorem bcmpSubProg_externAt_none (mpl : Obj.MultiPlacement) (pc : BitVec 64) : + (bcmpSubProg mpl).externAt? pc = none := + pureWordsProg_externAt_none (bcmpHullBase mpl) (bcmpHullWords (bcmpHullBase mpl)) pc + +theorem bcmpSubProg_hasWords (mpl : Obj.MultiPlacement) : + (bcmpSubProg mpl).hasWords (bcmpHullBase mpl) (bcmpHullWords (bcmpHullBase mpl)) := + pureWordsProg_bcmpHull_hasWords (bcmpHullBase mpl) + +theorem bcmpSubProg_code_length (mpl : Obj.MultiPlacement) : + (bcmpSubProg mpl).code.length = bcmpHullByteLen := by + dsimp only [bcmpSubProg, pureWordsProg, Program.ofWords] + rw [bcmpHullWords_eq_canonical (m := bcmpHullBase mpl) rfl] + rfl + +theorem keepR_bcmp_of_code_offset (mpl : Obj.MultiPlacement) {off : Nat} + (hoff : off < (bcmpSubProg mpl).code.length) : + keepR_bcmp mpl ((bcmpSubProg mpl).base + BitVec.ofNat 64 off) = true := by + rw [bcmpSubProg_code_length] at hoff + dsimp only [keepR_bcmp, bcmpSubProg_base] + rw [keepBcmpHull_iff] + have hsub : (bcmpHullBase mpl + BitVec.ofNat 64 off) - bcmpHullBase mpl = + BitVec.ofNat 64 off := by bv_omega + have hoff_lt : off < 2 ^ 64 := by + have hb : bcmpHullByteLen = 56 := rfl + omega + rw [hsub, BitVec.toNat_ofNat, Nat.mod_eq_of_lt hoff_lt] + exact hoff + +/-- Forward `CodeLoaded` projection onto `stripExecOutside (keepR_bcmp mpl) mem`. -/ +theorem bcmpSubProg_codeLoaded_stripExecOutside {mpl : Obj.MultiPlacement} {mem : Memory} + (hL : (bcmpSubProg mpl).CodeLoaded mem) : + (bcmpSubProg mpl).CodeLoaded (stripExecOutside (keepR_bcmp mpl) mem) := + bcmpHull_codeLoaded_stripExecOutside (fun _ hoff => keepR_bcmp_of_code_offset mpl hoff) hL + +/-- Reverse `CodeLoaded` projection from `stripExecOutside (keepR_bcmp mpl) mem` back to `mem` + (so STARTUP's `f3CodeInv_rxWords_codeLoaded_strip` `Lib2LayoutFacts.lean @a230f2671b:203-215` + directly discharges `H1`'s `(bcmpSubProg mpl).CodeLoaded u.mem` premise). -/ +theorem bcmpSubProg_codeLoaded_of_stripExecOutside {mpl : Obj.MultiPlacement} {mem : Memory} + (hL : (bcmpSubProg mpl).CodeLoaded (stripExecOutside (keepR_bcmp mpl) mem)) : + (bcmpSubProg mpl).CodeLoaded mem := by + refine Program.CodeLoaded.intro hL.aligned hL.no_wrap fun i hi => ?_ + have hk : keepR_bcmp mpl ((bcmpSubProg mpl).base + BitVec.ofNat 64 i) = true := + keepR_bcmp_of_code_offset mpl hi + have hbyte := hL.byte_eq i hi + have hperm := hL.perm_eq i hi + have hlf := hL.isLazyFree_eq i hi + rw [ProofLib.strip_read8] at hbyte + rw [ProofLib.strip_perm_of_keep hk] at hperm + rw [ProofLib.strip_isLazyFree] at hlf + exact ⟨hbyte, hperm, hlf⟩ + +theorem bcmpSubProg_codeLoaded_stripExecOutside_iff {mpl : Obj.MultiPlacement} {mem : Memory} : + (bcmpSubProg mpl).CodeLoaded (stripExecOutside (keepR_bcmp mpl) mem) ↔ + (bcmpSubProg mpl).CodeLoaded mem := + ⟨bcmpSubProg_codeLoaded_of_stripExecOutside, bcmpSubProg_codeLoaded_stripExecOutside⟩ + +/-- `W`-independent ghost hook for `"bcmp"` (`CliGhostHooks.extra` entry `("bcmp", bcmpGhost mpl mmpl)`). + Uses `BcmpGhostK.f3EmptyBcmpGhostHook` (`P_real := emptyStdProg`, `fallback := hookBcmpFallback`), + never capturing `W : CliHooks` (`REV-PILOT` Q1/N1). -/ +@[expose] noncomputable def bcmpGhost (mpl _mmpl : Obj.MultiPlacement) : State → State := + f3EmptyBcmpGhostHook (keepR_bcmp mpl) (bcmpSubProg mpl) + (bcmpHullBase mpl + memcmpByteLen) + +/-- `K`-narrowed `W`-independent ghost hook companion for `"bcmp"`. -/ +@[expose] noncomputable def bcmpGhostK (mpl _mmpl : Obj.MultiPlacement) : State → State := + f3EmptyBcmpGhostHookK (keepR_bcmp mpl) (bcmpSubProg mpl) + (bcmpHullBase mpl + memcmpByteLen) + +/-- Block-`617` entry-state `lr` guard for `"bcmp"` (`C11` §6.3): + `keepR_bcmp mpl (s0.readReg64 .lr) = false ∧ s0.readReg64 .lr ≠ resolve mpl "bcmp"`. -/ +@[expose] def bcmpEntryGuard (mpl : Obj.MultiPlacement) (s0 : State) : Prop := + BcmpEntryGuard (bcmpHullBase mpl) (libsignalSessionLib.resolve mpl "bcmp") s0 + +theorem bcmpEntryGuard_iff (mpl : Obj.MultiPlacement) (s0 : State) : + bcmpEntryGuard mpl s0 ↔ + keepR_bcmp mpl (s0.readReg64 .lr) = false ∧ + s0.readReg64 .lr ≠ libsignalSessionLib.resolve mpl "bcmp" := + Iff.rfl + +/-! ## 2. Artifact 1 — Unconditional `GhostRowSpecOk "bcmp" (bcmpGhost mpl mmpl)` -/ + +theorem bcmpGhost_fs (mpl mmpl : Obj.MultiPlacement) (s : State) : + (bcmpGhost mpl mmpl s).fs = s.fs := + f3EmptyBcmpGhostHook_fs (keepR_bcmp mpl) (bcmpSubProg mpl) + (bcmpHullBase mpl + memcmpByteLen) s + +theorem bcmpGhost_fsT (mpl mmpl : Obj.MultiPlacement) : + HookFsTraced IsFsC (bcmpGhost mpl mmpl) := + f3EmptyBcmpGhostHook_fsT (keepR_bcmp mpl) (bcmpSubProg mpl) + (bcmpHullBase mpl + memcmpByteLen) + +theorem bcmpGhost_vmPreserved (mpl mmpl : Obj.MultiPlacement) (s : State) : + LibsignalBinary.Heap.VmPreserved s (bcmpGhost mpl mmpl s) := + f3EmptyBcmpGhostHook_vmPreserved (bcmpSubProg_svc mpl) (bcmpSubProg_externAt_none mpl) + (bcmpSubProg_hasWords mpl) rfl s + +/-- Unconditional `BcmpRowSpec` for `bcmpGhost mpl mmpl` (`0` layout or memory premises). -/ +theorem bcmpGhost_bcmpRowSpec (mpl mmpl : Obj.MultiPlacement) : + BcmpRowSpec (bcmpGhost mpl mmpl) := + BcmpRowSpec.of_vm + (f3EmptyBcmpGhostHook_dirCliBcmp_ok (bcmpSubProg_svc mpl) (bcmpSubProg_externAt_none mpl) + (bcmpSubProg_hasWords mpl) rfl) + (f3EmptyBcmpGhostHook_bcmpVregs_ok (bcmpSubProg_svc mpl) (bcmpSubProg_externAt_none mpl) + (bcmpSubProg_hasWords mpl) rfl) + (bcmpGhost_vmPreserved mpl mmpl) + +/-- **Artifact 1 (`C11` §1.2, §6.1):** Unconditional `GhostRowSpecOk "bcmp" (bcmpGhost mpl mmpl)` + for all `(mpl, mmpl)` (`0` stock-side or layout premises). -/ +theorem bcmpGhost_rowSpecOk [LibsignalPlacement] (mpl mmpl : Obj.MultiPlacement) : + GhostRowSpecOk "bcmp" (bcmpGhost mpl mmpl) where + fs_eq := bcmpGhost_fs mpl mmpl + fsT := bcmpGhost_fsT mpl mmpl + rowSpec := by + change ExtraRowSpec "bcmp" (bcmpGhost mpl mmpl) + simpa [ExtraRowSpec] using bcmpGhost_bcmpRowSpec mpl mmpl + +/-! ## 3. `ExecFrozen` Preservation & Generic-`InvS` `GhostRowReplayOn` (Artifact 2a) -/ + +/-- `linkedCallHook` preserves `ExecFrozen` whenever `fallback` preserves `ExecFrozen` (`REV-PILOT` N4): + - On `ActiveRealPre ∧ ActiveRealRun`, `ActiveRealRun`'s witness carries `ExecFrozen sf.mem`; + - On `ActiveRealPre ∧ ¬ ActiveRealRun`, `keepFsTrace fallback u` has `.mem = (fallback u).mem`; + - On `¬ ActiveRealPre`, `.mem = u.mem`. -/ +theorem linkedCallHook_preserves_execFrozen {α : Type} + {keep : BitVec 64 → Bool} {P_real P_sub : Program} + {entryTarget : BitVec 64} {spec : Spec α} {fallback : State → State} + (hfb : ∀ s : State, ExecFrozen s.mem → ExecFrozen (fallback s).mem) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (linkedCallHook keep P_real P_sub entryTarget spec fallback u).mem := by + classical + unfold linkedCallHook + split + · split + · rename_i hReal + exact (Classical.choose_spec hReal.2.2.2).2.2.2.2 + · change ExecFrozen (fallback u).mem + exact hfb u hfr + · exact hfr + +theorem hookBcmpFallback_mem (s : State) : + (hookBcmpFallback s).mem = s.mem := rfl + +/-- `f3EmptyBcmpGhostHook` preserves `ExecFrozen` unconditionally (`REV-PILOT` N4). -/ +theorem f3EmptyBcmpGhostHook_preserves_execFrozen + (keepR : BitVec 64 → Bool) (P_sub : Program) (entryTarget : BitVec 64) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (f3EmptyBcmpGhostHook keepR P_sub entryTarget u).mem := by + rw [f3EmptyBcmpGhostHook_eq] + exact linkedCallHook_preserves_execFrozen + (fun s hs => by rw [hookBcmpFallback_mem]; exact hs) hfr + +/-- `f3EmptyBcmpGhostHookK` preserves `ExecFrozen` unconditionally. -/ +theorem f3EmptyBcmpGhostHookK_preserves_execFrozen + (keepR : BitVec 64 → Bool) (P_sub : Program) (entryTarget : BitVec 64) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (f3EmptyBcmpGhostHookK keepR P_sub entryTarget u).mem := by + rw [f3EmptyBcmpGhostHookK_eq] + exact linkedCallHook_preserves_execFrozen + (fun s hs => by rw [hookBcmpFallback_mem]; exact hs) hfr + +theorem bcmpGhost_preserves_execFrozen (mpl mmpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (bcmpGhost mpl mmpl u).mem := + f3EmptyBcmpGhostHook_preserves_execFrozen (keepR_bcmp mpl) (bcmpSubProg mpl) + (bcmpHullBase mpl + memcmpByteLen) hfr + +private theorem setPC_eq_self_of_pc_eq {u : State} {pc : BitVec 64} (hpc : u.pc = pc) : + u.setPC pc = u := by + cases u + dsimp only [State.setPC] at hpc ⊢ + subst hpc + rfl + +private theorem realProg617_svc (mpl mmpl : Obj.MultiPlacement) (W : CliHooks) : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).svc = Syscall.standard := + rfl + +private theorem emptyStdProg_svc : emptyStdProg.svc = Syscall.standard := + rfl + +private theorem emptyStdProg_externAt (pc : BitVec 64) : + emptyStdProg.externAt? pc = none := + rfl + +/-- **Artifact 2a (`C11` §1.3, §6.2) — Generic-`InvS` `GhostRowReplayOn` for `"bcmp"`:** + - **F1 compliance (`HOOKS-PREP` M0 note 3):** `hRealHullNoExt` quantifies over the whole 56 B + hull `keepR_bcmp mpl pc = true` **only** on the de-hooked real program + `cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W` (valid post-Cutover-2 once `"bcmp"` is + removed from `cliHookTablePlaced`). On the ghost program `cliProgExtPlacedAt mpl EG 617 W`, + `hGhostNoExtNe` **strictly excludes `pc ≠ libsignalSessionLib.resolve mpl "bcmp"`**, matching + STARTUP's `f3Row_ghostProg617_externAt_none_of_ne_entry` + (`Lib2LayoutFacts.lean @a230f2671b:368`). + - **H1 compliance (`HOOKS-PREP` M0 note 4):** `hCL` supplies `(bcmpSubProg mpl).CodeLoaded u.mem` + at the intermediate call state `u` from `InvS u` (never `s0.mem`). -/ +theorem bcmpGhost_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (bcmpSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "bcmp") = + some (bcmpGhost mpl mmpl)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_bcmp mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_bcmp mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl "bcmp" → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG "bcmp" (bcmpEntryGuard mpl) (bcmpGhost mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨bcmpGhost_preserves_execFrozen mpl mmpl hfr, bcmpGhost_fs mpl mmpl u⟩ + replay_at_stub := by + intro W s0 sf _ _ _ hEntry hRetPc hNoExSf hNotHaltSf + right + refine ⟨hRealHullNoExt W (keepR_bcmp_entry mpl), ?_⟩ + intro u _ hStepsAfter hpc hrun hnoex hkf hfr hInvU + have hCodeU : (bcmpSubProg mpl).CodeLoaded u.mem := hCL u hInvU + have hLrOut : keepR_bcmp mpl (u.readReg64 .lr) = false := + f3EmptyBcmpGhostHook_keepLr_false_after_hook_of_codeLoaded_u + (P_ghost := cliProgExtPlacedAt mpl EG 617 W) + (P_sub := bcmpSubProg mpl) + (keepR := keepR_bcmp mpl) + (m := bcmpHullBase mpl) + (stubPc := libsignalSessionLib.resolve mpl "bcmp") + (entryTarget := bcmpHullBase mpl + memcmpByteLen) + rfl + (bcmpSubProg_hasWords mpl) + (fun _ h => h) + (fun _ hk hne => hGhostNoExtNe W hk hne) + (hGhostAt W) + hEntry.1 + hRetPc + hNoExSf + hNotHaltSf + u + hCodeU + hStepsAfter + hrun + hkf + have hCodeStrip : (bcmpSubProg mpl).CodeLoaded (stripExecOutside (keepR_bcmp mpl) u.mem) := + bcmpSubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨_, _, hfr_fu, hfs_fu, hvis⟩ := + f3EmptyBcmpGhostHook_visitedIn + (keepR := keepR_bcmp mpl) + (P_sub := bcmpSubProg mpl) + (m := bcmpHullBase mpl) + (bcmpSubProg_svc mpl) + (bcmpSubProg_externAt_none mpl) + (bcmpSubProg_hasWords mpl) + rfl + hrun + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (bcmpHullBase mpl + memcmpByteLen)) + (bcmpGhost mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hSetPC : u.setPC (bcmpHullBase mpl + memcmpByteLen) = u := + setPC_eq_self_of_pc_eq (hpc.trans (bcmpHullBase_add_memcmpByteLen mpl).symm) + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (bcmpGhost mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- `C4` interior-stub signature wrapper for `bcmpGhost_rowReplayOn` (accepting split `hRealNone` + at `stubPc` + `hInteriorGhost` with the `Or.inr` `TrapHook` interior-stub disjunct on + `pc ≠ resolve mpl "bcmp"`). -/ +theorem bcmpGhost_rowReplayOn_of_interior + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (bcmpSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "bcmp") = + some (bcmpGhost mpl mmpl)) + (hRealNone : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl "bcmp") = none) + (hInteriorGhost : ∀ (W : CliHooks) (pc : BitVec 64), + keepR_bcmp mpl pc = true → pc ≠ libsignalSessionLib.resolve mpl "bcmp" → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none ∧ + ((cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ gStub, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some gStub ∧ + ∀ L : BitVec 64, keepR_bcmp mpl L = true → TrapHook L gStub)) : + GhostRowReplayOn mpl mmpl InvS EG "bcmp" (bcmpEntryGuard mpl) (bcmpGhost mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨bcmpGhost_preserves_execFrozen mpl mmpl hfr, bcmpGhost_fs mpl mmpl u⟩ + replay_at_stub := by + intro W s0 sf _ _ _ hEntry hRetPc hNoExSf hNotHaltSf + have hRealHullNoExt : ∀ {pc : BitVec 64}, + keepR_bcmp mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := by + intro pc hk + by_cases hEq : pc = libsignalSessionLib.resolve mpl "bcmp" + · rw [hEq]; exact hRealNone W + · exact (hInteriorGhost W pc hk hEq).1 + have hRegExt : ∀ pc : BitVec 64, keepBcmpHull (bcmpHullBase mpl) pc = true → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ f, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some f ∧ + ∀ L, keepBcmpHull (bcmpHullBase mpl) L = true → TrapHook L f := by + intro pc hk + by_cases hEq : pc = libsignalSessionLib.resolve mpl "bcmp" + · rw [hEq] + exact Or.inr ⟨bcmpGhost mpl mmpl, hGhostAt W, fun L hL => + trapHook_f3EmptyBcmpGhostHook_of_cover (bcmpSubProg mpl) + (bcmpHullBase mpl + memcmpByteLen) (fun _ h => h) hL⟩ + · rcases (hInteriorGhost W pc hk hEq).2 with hNone | ⟨gStub, hSome, hTrap⟩ + · exact Or.inl hNone + · exact Or.inr ⟨gStub, hSome, hTrap⟩ + right + refine ⟨hRealNone W, ?_⟩ + intro u _ hStepsAfter hpc hrun hnoex hkf hfr hInvU + have hCodeU : (bcmpSubProg mpl).CodeLoaded u.mem := hCL u hInvU + have hLrOut : keepR_bcmp mpl (u.readReg64 .lr) = false := + bcmpHull_keepLr_false_after_hook_of_codeLoaded_u + (P_ghost := cliProgExtPlacedAt mpl EG 617 W) + (P_sub := bcmpSubProg mpl) + (m := bcmpHullBase mpl) + (f_stub := bcmpGhost mpl mmpl) + rfl + (bcmpSubProg_hasWords mpl) + hRegExt + (fun _ hL => trapHook_f3EmptyBcmpGhostHook_of_cover (bcmpSubProg mpl) + (bcmpHullBase mpl + memcmpByteLen) (fun _ h => h) hL) + hEntry.1 + hRetPc + hNoExSf + hNotHaltSf + u + hCodeU + hStepsAfter + hrun + hkf + have hCodeStrip : (bcmpSubProg mpl).CodeLoaded (stripExecOutside (keepR_bcmp mpl) u.mem) := + bcmpSubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨_, _, hfr_fu, hfs_fu, hvis⟩ := + f3EmptyBcmpGhostHook_visitedIn + (keepR := keepR_bcmp mpl) + (P_sub := bcmpSubProg mpl) + (m := bcmpHullBase mpl) + (bcmpSubProg_svc mpl) + (bcmpSubProg_externAt_none mpl) + (bcmpSubProg_hasWords mpl) + rfl + hrun + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (bcmpHullBase mpl + memcmpByteLen)) + (bcmpGhost mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt hk) + hvis + have hSetPC : u.setPC (bcmpHullBase mpl + memcmpByteLen) = u := + setPC_eq_self_of_pc_eq (hpc.trans (bcmpHullBase_add_memcmpByteLen mpl).symm) + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (bcmpGhost mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- `K`-narrowed `bcmpGhostK` companion `GhostRowReplayOn` (requires **zero** entry `lr` guard: + `entryGuard := fun _ => True`, since `bcmpGhostK` transitions to `.Exception` if `lr ∈ keepR`). -/ +theorem bcmpGhostK_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (bcmpSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_bcmp mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG "bcmp" (fun _ => True) (bcmpGhostK mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨f3EmptyBcmpGhostHookK_preserves_execFrozen (keepR_bcmp mpl) (bcmpSubProg mpl) + (bcmpHullBase mpl + memcmpByteLen) hfr, + f3EmptyBcmpGhostHookK_fs (keepR_bcmp mpl) (bcmpSubProg mpl) + (bcmpHullBase mpl + memcmpByteLen) u⟩ + replay_at_stub := by + intro W _ _ _ _ _ _ _ _ _ + right + refine ⟨hRealHullNoExt W (keepR_bcmp_entry mpl), ?_⟩ + intro u _ _ hpc hrun hnoex hkf hfr hInvU + have hCodeStrip : (bcmpSubProg mpl).CodeLoaded (stripExecOutside (keepR_bcmp mpl) u.mem) := + bcmpSubProg_codeLoaded_stripExecOutside (hCL u hInvU) + obtain ⟨_, _, hfr_fu, hfs_fu, hvis⟩ := + f3EmptyBcmpGhostHookK_visitedIn + (keepR := keepR_bcmp mpl) + (P_sub := bcmpSubProg mpl) + (m := bcmpHullBase mpl) + (bcmpSubProg_svc mpl) + (bcmpSubProg_externAt_none mpl) + (bcmpSubProg_hasWords mpl) + rfl + hrun + hnoex + hfr + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (bcmpHullBase mpl + memcmpByteLen)) + (bcmpGhostK mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hSetPC : u.setPC (bcmpHullBase mpl + memcmpByteLen) = u := + setPC_eq_self_of_pc_eq (hpc.trans (bcmpHullBase_add_memcmpByteLen mpl).symm) + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (bcmpGhostK mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- Guard-strengthening adapter on `GhostRowReplayOn` (for `ExtraListReplaysOn` when `guardOf sym` + implies `entryGuard`). -/ +theorem ghostRowReplayOn_of_guard_imp + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + {EG : CliHooks → String → Option (State → State)} + {sym : String} {entryGuard guard' : State → Prop} {f : State → State} + (hRow : GhostRowReplayOn mpl mmpl InvS EG sym entryGuard f) + (hImp : ∀ s0 : State, guard' s0 → entryGuard s0) : + GhostRowReplayOn mpl mmpl InvS EG sym guard' f where + preserves_execFrozen := hRow.preserves_execFrozen + replay_at_stub := fun W s0 sf hG hRet hNoEx hNHalt => + hRow.replay_at_stub W s0 sf (hImp s0 hG) hRet hNoEx hNHalt + +/-- Full per-row `GhostRowOk` bundle (`GhostRowSpecOk` ∧ `GhostRowReplayOn`) for `"bcmp"`. -/ +theorem bcmpGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (bcmpSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "bcmp") = + some (bcmpGhost mpl mmpl)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_bcmp mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_bcmp mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl "bcmp" → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowOk mpl mmpl InvS EG "bcmp" (bcmpEntryGuard mpl) (bcmpGhost mpl mmpl) := + ⟨bcmpGhost_rowSpecOk mpl mmpl, + bcmpGhost_rowReplayOn mpl mmpl InvS EG hCL hInvKeep hGhostAt hRealHullNoExt hGhostNoExtNe⟩ + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/BlackBoxGhostReplays.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/BlackBoxGhostReplays.lean new file mode 100644 index 000000000..81e5410d6 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/BlackBoxGhostReplays.lean @@ -0,0 +1,605 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.BlackBoxRowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxCode -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhost -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxLrTrap -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric -- proof-setup: allow-public-import + +/-! +# Card CC-DALEK — `lsBlackBoxSym` Row Consumer Spec & Generic-`InvS` Ghost Replay (`HooksDehook.BlackBoxGhostReplays`) + +Cutover-2 `c`-card for `subtle::black_box::` (`lsBlackBoxSym`) in the `W2-C11` +`CliGhostHooks.extra` framework (`ccard_recipe.md` §2.2, §5 row 5), modeled directly on +`BcmpGhostReplays.lean` (`0` `CliElfLib` / `ElfF3Relink` / C2 / trusted imports): + +1. **Row Anchor & `W`-Independent Ghost (`keepR_blackBox`, `blackBoxSubProg`, `blackBoxGhost`):** + - Single-block 5-word (`20` B = `blackBoxByteLen`) region `blackBoxU8Words` anchored directly at + `libsignalSessionLib.resolve mpl lsBlackBoxSym`. + - `blackBoxGhost mpl mmpl` wraps `BlackBoxGhost.f3EmptyBlackBoxGhostHook` + (`P_real := emptyStdProg`, `fallback := blackBoxHook`), with **zero `W : CliHooks` + dependence**. +2. **Artifact 1 — Unconditional `GhostRowSpecOk lsBlackBoxSym (blackBoxGhost mpl mmpl)` (`0` premises):** + - `blackBoxGhost_rowSpecOk` proves `fs_eq`, `fsT : HookFsTraced IsFsC`, and `BlackBoxRowSpec` + (plain, `withVmPreserved`, and `withAlloc A lim` over all `16 ≤ stk ≤ 2 ^ 64`) unconditionally + via `BlackBoxRowSpec.of_vm`. +3. **Artifact 2a — Generic-`InvS` `GhostRowReplayOn` & `GhostRowOk` (`F1` + `H1` compliant):** + - **F1 (`pc ≠ resolve mpl lsBlackBoxSym` exclusion on `P_ghost`, whole-hull on de-hooked + `P_real`):** `hRealHullNoExt` quantifies over `keepR_blackBox mpl pc = true` on `P_real` only; + `hGhostNoExtNe` strictly excludes `pc ≠ libsignalSessionLib.resolve mpl lsBlackBoxSym` on + `P_ghost` and routes through + `BlackBoxLrTrap.f3EmptyBlackBoxGhostHook_keepLr_false_after_hook_of_codeLoaded_u`. + - **H1 (`CodeLoaded u.mem` from `InvS u`):** `hCL` supplies `(blackBoxSubProg mpl).CodeLoaded u.mem` + at intermediate call state `u` from `InvS u` (never `s0.mem`), accompanied by + `blackBoxSubProg_codeLoaded_stripExecOutside_iff`. + - Includes `C4` interior-stub wrapper `blackBoxGhost_rowReplayOn_of_interior`, `K`-narrowed spare + `blackBoxGhostK_rowReplayOn`, full `blackBoxGhost_rowOk`, and per-arm / singleton entry-guard + helpers `extraEntryGuard_blackBox_arm` / `extraEntryGuard_singleton_blackBox` (`.text.lib2` + layout instantiation belongs to the C2 layout / STARTUP seat per `02:28Z` split). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhostReplays + +open Arm64 Arm64.Obj Arm64.Process ProofLib +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession ( + CliHooks cliExternsPlaced libsignalSessionLib + lsBlackBoxSym lsDurationSinceSym lsFromUtf8Sym lsMemrchrSym lsTimeAddSym +) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks IsFsC) +open LibsignalBinary.Proofs.HookDischarge.Generics.BlackBoxU8 (blackBoxU8Words) +open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer (ExecFrozen) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.BlackBoxRowSpec ( + BlackBoxRowSpec +) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs ( + ExtraRowSpec GhostRowSpecOk +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay ( + ExtraEntryGuard GhostRowOk GhostRowReplayOn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetCode (pureWordsProg_externAt_none) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhostK (emptyStdProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords (TrapHook) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxCode ( + pureWordsProg_blackBoxU8_hasWords + subroutine_ok_processBlackBox_of_hasWords + hookOk_sessionBlackBox_of_master +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhost ( + f3EmptyBlackBoxGhostHook f3EmptyBlackBoxGhostHookK + f3EmptyBlackBoxGhostHook_fs f3EmptyBlackBoxGhostHookK_fs + f3EmptyBlackBoxGhostHook_fsT + f3EmptyBlackBoxGhostHook_preserves_execFrozen f3EmptyBlackBoxGhostHookK_preserves_execFrozen + f3EmptyBlackBoxGhostHook_master_ok_of_process + f3EmptyBlackBoxGhostHook_vmPreserved_of_process + f3EmptyBlackBoxGhostHook_visitedIn f3EmptyBlackBoxGhostHookK_visitedIn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxLrTrap ( + blackBoxByteLen keepBlackBox keepBlackBox_iff keepBlackBox_entry + blackBox_codeLoaded_stripExecOutside + BlackBoxEntryGuard + blackBox_keepLr_false_after_hook_of_codeLoaded_u + trapHook_f3EmptyBlackBoxGhostHook_of_cover + f3EmptyBlackBoxGhostHook_keepLr_false_after_hook_of_codeLoaded_u +) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric ( + h2fsgen_steps_lift_of_visitedIn_noExtern +) + +/-! ## 1. Row Anchor Definitions, Algebraic Identities & `CodeLoaded` Bridges -/ + +/-- Kept-region byte predicate `[resolve mpl lsBlackBoxSym, resolve mpl lsBlackBoxSym + 20)` + for `lsBlackBoxSym`. -/ +@[expose] def keepR_blackBox (mpl : Obj.MultiPlacement) : BitVec 64 → Bool := + keepBlackBox (libsignalSessionLib.resolve mpl lsBlackBoxSym) + +/-- `lsBlackBoxSym`'s resolved entry address lies inside `keepR_blackBox mpl`. -/ +theorem keepR_blackBox_entry (mpl : Obj.MultiPlacement) : + keepR_blackBox mpl (libsignalSessionLib.resolve mpl lsBlackBoxSym) = true := + keepBlackBox_entry (libsignalSessionLib.resolve mpl lsBlackBoxSym) + +/-- Pure 5-word (`20`-byte) sub-program holding `blackBoxU8Words` at + `libsignalSessionLib.resolve mpl lsBlackBoxSym`. -/ +@[expose] def blackBoxSubProg (mpl : Obj.MultiPlacement) : Program := + pureWordsProg (libsignalSessionLib.resolve mpl lsBlackBoxSym) blackBoxU8Words + +theorem blackBoxSubProg_base (mpl : Obj.MultiPlacement) : + (blackBoxSubProg mpl).base = libsignalSessionLib.resolve mpl lsBlackBoxSym := by + dsimp only [blackBoxSubProg, pureWordsProg, Program.ofWords] + +theorem blackBoxSubProg_svc (mpl : Obj.MultiPlacement) : + (blackBoxSubProg mpl).svc = Syscall.standard := rfl + +theorem blackBoxSubProg_externAt_none (mpl : Obj.MultiPlacement) (pc : BitVec 64) : + (blackBoxSubProg mpl).externAt? pc = none := + pureWordsProg_externAt_none (libsignalSessionLib.resolve mpl lsBlackBoxSym) blackBoxU8Words pc + +theorem blackBoxSubProg_hasWords (mpl : Obj.MultiPlacement) : + (blackBoxSubProg mpl).hasWords (libsignalSessionLib.resolve mpl lsBlackBoxSym) + blackBoxU8Words := + pureWordsProg_blackBoxU8_hasWords (libsignalSessionLib.resolve mpl lsBlackBoxSym) + +theorem blackBoxSubProg_code_length (mpl : Obj.MultiPlacement) : + (blackBoxSubProg mpl).code.length = blackBoxByteLen := rfl + +theorem keepR_blackBox_of_code_offset (mpl : Obj.MultiPlacement) {off : Nat} + (hoff : off < (blackBoxSubProg mpl).code.length) : + keepR_blackBox mpl ((blackBoxSubProg mpl).base + BitVec.ofNat 64 off) = true := by + rw [blackBoxSubProg_code_length] at hoff + rw [blackBoxSubProg_base] + dsimp only [keepR_blackBox] + rw [keepBlackBox_iff] + have hsub : + (libsignalSessionLib.resolve mpl lsBlackBoxSym + BitVec.ofNat 64 off) - + libsignalSessionLib.resolve mpl lsBlackBoxSym = + BitVec.ofNat 64 off := by bv_omega + have hoff_lt : off < 2 ^ 64 := by + have hb : blackBoxByteLen = 20 := rfl + omega + rw [hsub, BitVec.toNat_ofNat, Nat.mod_eq_of_lt hoff_lt] + exact hoff + +/-- Forward `CodeLoaded` projection onto `stripExecOutside (keepR_blackBox mpl) mem`. -/ +theorem blackBoxSubProg_codeLoaded_stripExecOutside {mpl : Obj.MultiPlacement} {mem : Memory} + (hL : (blackBoxSubProg mpl).CodeLoaded mem) : + (blackBoxSubProg mpl).CodeLoaded (stripExecOutside (keepR_blackBox mpl) mem) := + blackBox_codeLoaded_stripExecOutside (fun _ hoff => keepR_blackBox_of_code_offset mpl hoff) hL + +/-- Reverse `CodeLoaded` projection from `stripExecOutside (keepR_blackBox mpl) mem` back to `mem`. -/ +theorem blackBoxSubProg_codeLoaded_of_stripExecOutside {mpl : Obj.MultiPlacement} {mem : Memory} + (hL : (blackBoxSubProg mpl).CodeLoaded (stripExecOutside (keepR_blackBox mpl) mem)) : + (blackBoxSubProg mpl).CodeLoaded mem := by + refine Program.CodeLoaded.intro hL.aligned hL.no_wrap fun i hi => ?_ + have hk : keepR_blackBox mpl ((blackBoxSubProg mpl).base + BitVec.ofNat 64 i) = true := + keepR_blackBox_of_code_offset mpl hi + have hbyte := hL.byte_eq i hi + have hperm := hL.perm_eq i hi + have hlf := hL.isLazyFree_eq i hi + rw [ProofLib.strip_read8] at hbyte + rw [ProofLib.strip_perm_of_keep hk] at hperm + rw [ProofLib.strip_isLazyFree] at hlf + exact ⟨hbyte, hperm, hlf⟩ + +theorem blackBoxSubProg_codeLoaded_stripExecOutside_iff {mpl : Obj.MultiPlacement} {mem : Memory} : + (blackBoxSubProg mpl).CodeLoaded (stripExecOutside (keepR_blackBox mpl) mem) ↔ + (blackBoxSubProg mpl).CodeLoaded mem := + ⟨blackBoxSubProg_codeLoaded_of_stripExecOutside, blackBoxSubProg_codeLoaded_stripExecOutside⟩ + +/-- `W`-independent ghost hook for `lsBlackBoxSym` + (`CliGhostHooks.extra` entry `(lsBlackBoxSym, blackBoxGhost mpl mmpl)`). -/ +@[expose] noncomputable def blackBoxGhost (mpl _mmpl : Obj.MultiPlacement) : State → State := + f3EmptyBlackBoxGhostHook (keepR_blackBox mpl) (blackBoxSubProg mpl) + (libsignalSessionLib.resolve mpl lsBlackBoxSym) + +/-- `K`-narrowed `W`-independent ghost hook companion for `lsBlackBoxSym` (spare only; N2). -/ +@[expose] noncomputable def blackBoxGhostK (mpl _mmpl : Obj.MultiPlacement) : State → State := + f3EmptyBlackBoxGhostHookK (keepR_blackBox mpl) (blackBoxSubProg mpl) + (libsignalSessionLib.resolve mpl lsBlackBoxSym) + +/-- Block-`617` entry-state `lr` guard for `lsBlackBoxSym`: + `keepR_blackBox mpl (s0.readReg64 .lr) = false ∧ s0.readReg64 .lr ≠ resolve mpl lsBlackBoxSym`. -/ +@[expose] def blackBoxEntryGuard (mpl : Obj.MultiPlacement) (s0 : State) : Prop := + BlackBoxEntryGuard (libsignalSessionLib.resolve mpl lsBlackBoxSym) + (libsignalSessionLib.resolve mpl lsBlackBoxSym) s0 + +theorem blackBoxEntryGuard_iff (mpl : Obj.MultiPlacement) (s0 : State) : + blackBoxEntryGuard mpl s0 ↔ + keepR_blackBox mpl (s0.readReg64 .lr) = false ∧ + s0.readReg64 .lr ≠ libsignalSessionLib.resolve mpl lsBlackBoxSym := + Iff.rfl + +/-! ## 2. Artifact 1 — Unconditional `GhostRowSpecOk lsBlackBoxSym (blackBoxGhost mpl mmpl)` -/ + +theorem blackBoxGhost_fs (mpl mmpl : Obj.MultiPlacement) (s : State) : + (blackBoxGhost mpl mmpl s).fs = s.fs := + f3EmptyBlackBoxGhostHook_fs (keepR_blackBox mpl) (blackBoxSubProg mpl) + (libsignalSessionLib.resolve mpl lsBlackBoxSym) s + +theorem blackBoxGhost_fsT (mpl mmpl : Obj.MultiPlacement) : + HookFsTraced IsFsC (blackBoxGhost mpl mmpl) := + f3EmptyBlackBoxGhostHook_fsT (keepR_blackBox mpl) (blackBoxSubProg mpl) + (libsignalSessionLib.resolve mpl lsBlackBoxSym) + +theorem blackBoxGhost_vmPreserved (mpl mmpl : Obj.MultiPlacement) (s : State) : + LibsignalBinary.Heap.VmPreserved s (blackBoxGhost mpl mmpl s) := + f3EmptyBlackBoxGhostHook_vmPreserved_of_process + (blackBoxSubProg_svc mpl) + (blackBoxSubProg_externAt_none mpl) + (subroutine_ok_processBlackBox_of_hasWords (blackBoxSubProg_externAt_none mpl) + (blackBoxSubProg_hasWords mpl)) + s + +/-- Unconditional `BlackBoxRowSpec` for `blackBoxGhost mpl mmpl` (`0` layout or memory premises). -/ +theorem blackBoxGhost_blackBoxRowSpec (mpl mmpl : Obj.MultiPlacement) : + BlackBoxRowSpec (blackBoxGhost mpl mmpl) := + BlackBoxRowSpec.of_vm + (fun _ hlo hhi => + hookOk_sessionBlackBox_of_master ⟨hlo, hhi⟩ + (f3EmptyBlackBoxGhostHook_master_ok_of_process + (blackBoxSubProg_svc mpl) + (blackBoxSubProg_externAt_none mpl) + (subroutine_ok_processBlackBox_of_hasWords (blackBoxSubProg_externAt_none mpl) + (blackBoxSubProg_hasWords mpl)))) + (blackBoxGhost_vmPreserved mpl mmpl) + +/-- **Artifact 1 (`C11` §1.2, §6.1):** Unconditional + `GhostRowSpecOk lsBlackBoxSym (blackBoxGhost mpl mmpl)` for all `(mpl, mmpl)` + (`0` stock-side or layout premises). -/ +theorem blackBoxGhost_rowSpecOk [LibsignalPlacement] (mpl mmpl : Obj.MultiPlacement) : + GhostRowSpecOk lsBlackBoxSym (blackBoxGhost mpl mmpl) where + fs_eq := blackBoxGhost_fs mpl mmpl + fsT := blackBoxGhost_fsT mpl mmpl + rowSpec := by + have h1 : (lsBlackBoxSym == "bcmp") = false := by decide + have h2 : (lsBlackBoxSym == "strlen") = false := by decide + have h3 : (lsBlackBoxSym == "memmove") = false := by decide + have h4 : (lsBlackBoxSym == lsFromUtf8Sym) = false := by decide + have h5 : (lsBlackBoxSym == lsMemrchrSym) = false := by decide + have h6 : (lsBlackBoxSym == lsDurationSinceSym) = false := by decide + have h7 : (lsBlackBoxSym == lsTimeAddSym) = false := by decide + have h8 : (lsBlackBoxSym == lsBlackBoxSym) = true := by decide + dsimp only [ExtraRowSpec] + simp only [h1, h2, h3, h4, h5, h6, h7, h8, Bool.false_eq_true, ↓reduceIte] + exact blackBoxGhost_blackBoxRowSpec mpl mmpl + +/-! ## 3. `ExecFrozen` Preservation & Generic-`InvS` `GhostRowReplayOn` (Artifact 2a) -/ + +theorem blackBoxGhost_preserves_execFrozen (mpl mmpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (blackBoxGhost mpl mmpl u).mem := + f3EmptyBlackBoxGhostHook_preserves_execFrozen (keepR_blackBox mpl) (blackBoxSubProg mpl) + (libsignalSessionLib.resolve mpl lsBlackBoxSym) hfr + +theorem blackBoxGhostK_preserves_execFrozen (mpl mmpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (blackBoxGhostK mpl mmpl u).mem := + f3EmptyBlackBoxGhostHookK_preserves_execFrozen (keepR_blackBox mpl) (blackBoxSubProg mpl) + (libsignalSessionLib.resolve mpl lsBlackBoxSym) hfr + +private theorem setPC_eq_self_of_pc_eq {u : State} {pc : BitVec 64} (hpc : u.pc = pc) : + u.setPC pc = u := by + cases u + dsimp only [State.setPC] at hpc ⊢ + subst hpc + rfl + +private theorem realProg617_svc (mpl mmpl : Obj.MultiPlacement) (W : CliHooks) : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).svc = Syscall.standard := + rfl + +private theorem emptyStdProg_svc : emptyStdProg.svc = Syscall.standard := + rfl + +private theorem emptyStdProg_externAt (pc : BitVec 64) : + emptyStdProg.externAt? pc = none := + rfl + +/-- **Artifact 2a (`C11` §1.3, §6.2) — Generic-`InvS` `GhostRowReplayOn` for `lsBlackBoxSym`:** + - **F1 compliance:** `hRealHullNoExt` quantifies over `keepR_blackBox mpl pc = true` **only** on + the de-hooked real program `cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W` (post-Cutover-2). + On the ghost program `cliProgExtPlacedAt mpl EG 617 W`, `hGhostNoExtNe` strictly excludes + `pc ≠ libsignalSessionLib.resolve mpl lsBlackBoxSym`. + - **H1 compliance:** `hCL` supplies `(blackBoxSubProg mpl).CodeLoaded u.mem` at intermediate call + state `u` from `InvS u` (never `s0.mem`). -/ +theorem blackBoxGhost_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (blackBoxSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (libsignalSessionLib.resolve mpl lsBlackBoxSym) = some (blackBoxGhost mpl mmpl)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_blackBox mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_blackBox mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsBlackBoxSym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG lsBlackBoxSym + (blackBoxEntryGuard mpl) (blackBoxGhost mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨blackBoxGhost_preserves_execFrozen mpl mmpl hfr, blackBoxGhost_fs mpl mmpl u⟩ + replay_at_stub := by + intro W s0 sf _ _ _ hEntry hRetPc hNoExSf hNotHaltSf + right + refine ⟨hRealHullNoExt W (keepR_blackBox_entry mpl), ?_⟩ + intro u _ hStepsAfter hpc hrun hnoex hkf hfr hInvU + have hCodeU : (blackBoxSubProg mpl).CodeLoaded u.mem := hCL u hInvU + have hLrOut : keepR_blackBox mpl (u.readReg64 .lr) = false := + f3EmptyBlackBoxGhostHook_keepLr_false_after_hook_of_codeLoaded_u + (P_ghost := cliProgExtPlacedAt mpl EG 617 W) + (P_sub := blackBoxSubProg mpl) + (keepR := keepR_blackBox mpl) + (entry := libsignalSessionLib.resolve mpl lsBlackBoxSym) + (stubPc := libsignalSessionLib.resolve mpl lsBlackBoxSym) + (entryTarget := libsignalSessionLib.resolve mpl lsBlackBoxSym) + (blackBoxSubProg_hasWords mpl) + (fun _ h => h) + (fun _ hk hne => hGhostNoExtNe W hk hne) + (hGhostAt W) + hEntry.1 + hRetPc + hNoExSf + hNotHaltSf + u + hCodeU + hStepsAfter + hrun + hkf + have hCodeStrip : + (blackBoxSubProg mpl).CodeLoaded (stripExecOutside (keepR_blackBox mpl) u.mem) := + blackBoxSubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨hvis, hfr_fu, hfs_fu⟩ := + f3EmptyBlackBoxGhostHook_visitedIn + (keep := keepR_blackBox mpl) + (P_sub := blackBoxSubProg mpl) + (entryTarget := libsignalSessionLib.resolve mpl lsBlackBoxSym) + (blackBoxSubProg_svc mpl) + (blackBoxSubProg_externAt_none mpl) + (blackBoxSubProg_hasWords mpl) + hrun + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (libsignalSessionLib.resolve mpl lsBlackBoxSym)) + (blackBoxGhost mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_blackBox mpl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hSetPC : u.setPC (libsignalSessionLib.resolve mpl lsBlackBoxSym) = u := + setPC_eq_self_of_pc_eq hpc + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (blackBoxGhost mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- `C4` interior-stub signature wrapper for `blackBoxGhost_rowReplayOn` (accepting split + `hRealNone` at `stubPc` + `hInteriorGhost` with the `Or.inr` `TrapHook` interior-stub disjunct + on `pc ≠ resolve mpl lsBlackBoxSym`). -/ +theorem blackBoxGhost_rowReplayOn_of_interior + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (blackBoxSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (libsignalSessionLib.resolve mpl lsBlackBoxSym) = some (blackBoxGhost mpl mmpl)) + (hRealNone : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl lsBlackBoxSym) = none) + (hInteriorGhost : ∀ (W : CliHooks) (pc : BitVec 64), + keepR_blackBox mpl pc = true → pc ≠ libsignalSessionLib.resolve mpl lsBlackBoxSym → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none ∧ + ((cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ gStub, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some gStub ∧ + ∀ L : BitVec 64, keepR_blackBox mpl L = true → TrapHook L gStub)) : + GhostRowReplayOn mpl mmpl InvS EG lsBlackBoxSym + (blackBoxEntryGuard mpl) (blackBoxGhost mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨blackBoxGhost_preserves_execFrozen mpl mmpl hfr, blackBoxGhost_fs mpl mmpl u⟩ + replay_at_stub := by + intro W s0 sf _ _ _ hEntry hRetPc hNoExSf hNotHaltSf + have hRealHullNoExt : ∀ {pc : BitVec 64}, + keepR_blackBox mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := by + intro pc hk + by_cases hEq : pc = libsignalSessionLib.resolve mpl lsBlackBoxSym + · rw [hEq]; exact hRealNone W + · exact (hInteriorGhost W pc hk hEq).1 + have hRegExt : ∀ pc : BitVec 64, + keepBlackBox (libsignalSessionLib.resolve mpl lsBlackBoxSym) pc = true → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ f, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some f ∧ + ∀ L, keepBlackBox (libsignalSessionLib.resolve mpl lsBlackBoxSym) L = true → + TrapHook L f := by + intro pc hk + by_cases hEq : pc = libsignalSessionLib.resolve mpl lsBlackBoxSym + · rw [hEq] + exact Or.inr ⟨blackBoxGhost mpl mmpl, hGhostAt W, fun L hL => + trapHook_f3EmptyBlackBoxGhostHook_of_cover (blackBoxSubProg mpl) + (libsignalSessionLib.resolve mpl lsBlackBoxSym) (fun _ h => h) hL⟩ + · rcases (hInteriorGhost W pc hk hEq).2 with hNone | ⟨gStub, hSome, hTrap⟩ + · exact Or.inl hNone + · exact Or.inr ⟨gStub, hSome, hTrap⟩ + right + refine ⟨hRealNone W, ?_⟩ + intro u _ hStepsAfter hpc hrun hnoex hkf hfr hInvU + have hCodeU : (blackBoxSubProg mpl).CodeLoaded u.mem := hCL u hInvU + have hLrOut : keepR_blackBox mpl (u.readReg64 .lr) = false := + blackBox_keepLr_false_after_hook_of_codeLoaded_u + (P_ghost := cliProgExtPlacedAt mpl EG 617 W) + (P_sub := blackBoxSubProg mpl) + (entry := libsignalSessionLib.resolve mpl lsBlackBoxSym) + (f_stub := blackBoxGhost mpl mmpl) + (blackBoxSubProg_hasWords mpl) + hRegExt + (fun _ hL => trapHook_f3EmptyBlackBoxGhostHook_of_cover (blackBoxSubProg mpl) + (libsignalSessionLib.resolve mpl lsBlackBoxSym) (fun _ h => h) hL) + hEntry.1 + hRetPc + hNoExSf + hNotHaltSf + u + hCodeU + hStepsAfter + hrun + hkf + have hCodeStrip : + (blackBoxSubProg mpl).CodeLoaded (stripExecOutside (keepR_blackBox mpl) u.mem) := + blackBoxSubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨hvis, hfr_fu, hfs_fu⟩ := + f3EmptyBlackBoxGhostHook_visitedIn + (keep := keepR_blackBox mpl) + (P_sub := blackBoxSubProg mpl) + (entryTarget := libsignalSessionLib.resolve mpl lsBlackBoxSym) + (blackBoxSubProg_svc mpl) + (blackBoxSubProg_externAt_none mpl) + (blackBoxSubProg_hasWords mpl) + hrun + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (libsignalSessionLib.resolve mpl lsBlackBoxSym)) + (blackBoxGhost mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_blackBox mpl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt hk) + hvis + have hSetPC : u.setPC (libsignalSessionLib.resolve mpl lsBlackBoxSym) = u := + setPC_eq_self_of_pc_eq hpc + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (blackBoxGhost mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- `K`-narrowed `blackBoxGhostK` companion `GhostRowReplayOn` (`entryGuard := fun _ => True`; + spare only per N2). -/ +theorem blackBoxGhostK_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (blackBoxSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_blackBox mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG lsBlackBoxSym + (fun _ => True) (blackBoxGhostK mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨blackBoxGhostK_preserves_execFrozen mpl mmpl hfr, + f3EmptyBlackBoxGhostHookK_fs (keepR_blackBox mpl) (blackBoxSubProg mpl) + (libsignalSessionLib.resolve mpl lsBlackBoxSym) u⟩ + replay_at_stub := by + intro W _ _ _ _ _ _ _ _ _ + right + refine ⟨hRealHullNoExt W (keepR_blackBox_entry mpl), ?_⟩ + intro u _ _ hpc hrun hnoex hkf hfr hInvU + have hCodeStrip : + (blackBoxSubProg mpl).CodeLoaded (stripExecOutside (keepR_blackBox mpl) u.mem) := + blackBoxSubProg_codeLoaded_stripExecOutside (hCL u hInvU) + obtain ⟨hvis, hfr_fu, hfs_fu⟩ := + f3EmptyBlackBoxGhostHookK_visitedIn + (keep := keepR_blackBox mpl) + (P_sub := blackBoxSubProg mpl) + (entryTarget := libsignalSessionLib.resolve mpl lsBlackBoxSym) + (blackBoxSubProg_svc mpl) + (blackBoxSubProg_externAt_none mpl) + (blackBoxSubProg_hasWords mpl) + hrun + hnoex + hfr + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (libsignalSessionLib.resolve mpl lsBlackBoxSym)) + (blackBoxGhostK mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_blackBox mpl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hSetPC : u.setPC (libsignalSessionLib.resolve mpl lsBlackBoxSym) = u := + setPC_eq_self_of_pc_eq hpc + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (blackBoxGhostK mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- Guard-strengthening adapter on `GhostRowReplayOn` (for `ExtraListReplaysOn` when `guardOf sym` + implies `entryGuard`). -/ +theorem ghostRowReplayOn_of_guard_imp + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + {EG : CliHooks → String → Option (State → State)} + {sym : String} {entryGuard guard' : State → Prop} {f : State → State} + (hRow : GhostRowReplayOn mpl mmpl InvS EG sym entryGuard f) + (hImp : ∀ s0 : State, guard' s0 → entryGuard s0) : + GhostRowReplayOn mpl mmpl InvS EG sym guard' f where + preserves_execFrozen := hRow.preserves_execFrozen + replay_at_stub := fun W s0 sf hG hRet hNoEx hNHalt => + hRow.replay_at_stub W s0 sf (hImp s0 hG) hRet hNoEx hNHalt + +/-- Full per-row `GhostRowOk` bundle (`GhostRowSpecOk` ∧ `GhostRowReplayOn`) for `lsBlackBoxSym`. -/ +theorem blackBoxGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (blackBoxSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (libsignalSessionLib.resolve mpl lsBlackBoxSym) = some (blackBoxGhost mpl mmpl)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_blackBox mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_blackBox mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsBlackBoxSym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowOk mpl mmpl InvS EG lsBlackBoxSym + (blackBoxEntryGuard mpl) (blackBoxGhost mpl mmpl) := + ⟨blackBoxGhost_rowSpecOk mpl mmpl, + blackBoxGhost_rowReplayOn mpl mmpl InvS EG + hCL hInvKeep hGhostAt hRealHullNoExt hGhostNoExtNe⟩ + +/-! ## 4. Per-Arm & Singleton `ExtraEntryGuard` Helpers (`.text.lib2` Interface) -/ + +/-- Per-arm `lsBlackBoxSym` discharge for any `guardOf : String → State → Prop` agreeing with + `blackBoxEntryGuard mpl` on `lsBlackBoxSym`. -/ +theorem extraEntryGuard_blackBox_arm + {mpl : Obj.MultiPlacement} {guardOf : String → State → Prop} {s0 : State} + (hGuardEq : guardOf lsBlackBoxSym s0 ↔ blackBoxEntryGuard mpl s0) + (hBlackBoxGuard : blackBoxEntryGuard mpl s0) : + guardOf lsBlackBoxSym s0 := + hGuardEq.mpr hBlackBoxGuard + +/-- Table-level `ExtraEntryGuard guardOf g s0` discharge when `g.extra` carries the singleton + `lsBlackBoxSym` row `[(lsBlackBoxSym, blackBoxGhost mpl mmpl)]` (N3). -/ +theorem extraEntryGuard_singleton_blackBox + {mpl mmpl : Obj.MultiPlacement} {guardOf : String → State → Prop} + {g : CliGhostHooks} {s0 : State} + (hg : g.extra = [(lsBlackBoxSym, blackBoxGhost mpl mmpl)]) + (hGuardEq : guardOf lsBlackBoxSym s0 ↔ blackBoxEntryGuard mpl s0) + (hBlackBoxGuard : blackBoxEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := by + intro sym f _ hLook + rw [hg] at hLook + simp only [List.lookup] at hLook + by_cases hSym : (sym == lsBlackBoxSym) = true + · have hEq : sym = lsBlackBoxSym := eq_of_beq hSym + subst hEq + exact hGuardEq.mpr hBlackBoxGuard + · simp [hSym] at hLook + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhostReplays diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2EntryGuard.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2EntryGuard.lean new file mode 100644 index 000000000..bc6c7d933 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2EntryGuard.lean @@ -0,0 +1,88 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8GhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyGhost -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrExtraReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhost -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StaticSecretDropGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddGhostReplays -- proof-setup: allow-public-import + +/-! +# Canonical Cutover-2 Entry Guard Leaf (`HooksDehook.C2EntryGuard`) + +`CliElf`-free, `[LibsignalPlacement]`-free, `ghFixed`-free Cutover-2 entry-guard definitions +(`api_A.md` §5R.c + H-REV4 `§5R verdict` `C1`–`C3`): + +1. `c2GuardOf mpl sym s0`: canonical per-symbol entry guard over all 10 `cliExtraGhostSyms` rows. +2. `F3C2EntryGuard mpl mmpl s0`: conjoins the raw `keepMemsetBlk21` / `keepMemcpyBlk20` entry-`lr` + conjunct (`rfl`-equal to `F3MemsetMemcpyEntryLrFalse mmpl s0`, avoiding `CliStrictPlaced2G` + import cycles and `CliElf` closure bloat) with `c2GuardOf mpl sym s0` across `cliExtraGhostSyms`. +3. `f3C2EntryGuard_imp_and_extraEntryGuard`: contravariant `Block617TransferFixedHypG.mono_guard` + adapter into `ExtraEntryGuard (c2GuardOf mpl) gh s0` for arbitrary `gh : CliGhostHooks`. +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard + +open Arm64 Arm64.Obj +open CryptoVerification.SignalSession ( + lsBlackBoxSym lsDurationSinceSym lsFromUtf8Sym lsMemrchrSym + lsSharedSecretDropSym lsStaticSecretDropSym lsTimeAddSym +) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (cliExtraGhostSyms) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay (ExtraEntryGuard) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyGhost (keepMemcpyBlk20) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhost (keepMemsetBlk21) + +/-- Canonical per-symbol Cutover-2 entry guard over the 10 `cliExtraGhostSyms` rows. -/ +@[expose] def c2GuardOf (mpl : Obj.MultiPlacement) (sym : String) (s0 : State) : Prop := + if sym == "memmove" then MemmoveExtraReplays.memmoveEntryGuard mpl s0 + else if sym == "bcmp" then BcmpGhostReplays.bcmpEntryGuard mpl s0 + else if sym == "strlen" then StrlenGhostReplays.strlenEntryGuard mpl s0 + else if sym == lsMemrchrSym then MemrchrExtraReplays.memrchrEntryGuard mpl s0 + else if sym == lsFromUtf8Sym then FromUtf8GhostReplays.fromUtf8EntryGuard mpl s0 + else if sym == lsDurationSinceSym then DurationSinceGhostReplays.durationSinceEntryGuard mpl s0 + else if sym == lsTimeAddSym then TimeAddGhostReplays.timeAddEntryGuard mpl s0 + else if sym == lsBlackBoxSym then BlackBoxGhostReplays.blackBoxEntryGuard mpl s0 + else if sym == lsStaticSecretDropSym then StaticSecretDropGhostReplays.staticSecretDropEntryGuard mpl s0 + else if sym == lsSharedSecretDropSym then SharedSecretDropGhostReplays.sharedSecretDropEntryGuard mpl s0 + else True + +/-- `ghFixed`-free, `[LibsignalPlacement]`-free, `CliElf`-free Cutover-2 real-side entry guard for + F3 / Hole-2: conjoins raw `keepMemsetBlk21 mmpl (s0.readReg64 .lr) = false ∧ keepMemcpyBlk20 mmpl + (s0.readReg64 .lr) = false` (`rfl`-equal to `F3MemsetMemcpyEntryLrFalse mmpl s0`) with + `c2GuardOf mpl sym s0` across all 10 `cliExtraGhostSyms`. -/ +@[expose] def F3C2EntryGuard (mpl mmpl : Obj.MultiPlacement) (s0 : State) : Prop := + (keepMemsetBlk21 mmpl (s0.readReg64 .lr) = false ∧ + keepMemcpyBlk20 mmpl (s0.readReg64 .lr) = false) ∧ + ∀ sym : String, cliExtraGhostSyms.contains sym = true → c2GuardOf mpl sym s0 + +theorem f3C2EntryGuard_imp_and_extraEntryGuard + (mpl mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (s0 : State) + (h : F3C2EntryGuard mpl mmpl s0) : + (keepMemsetBlk21 mmpl (s0.readReg64 .lr) = false ∧ + keepMemcpyBlk20 mmpl (s0.readReg64 .lr) = false) ∧ + ExtraEntryGuard (c2GuardOf mpl) gh s0 := + ⟨h.1, fun sym _f hDom _hLook => h.2 sym hDom⟩ + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts.lean new file mode 100644 index 000000000..15b592a71 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts.lean @@ -0,0 +1,592 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.Dalek -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.DalekRows -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.DurCst16 -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.FromUtf8 -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.FromUtf8Row -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.LibcRows -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.MemmoveRow -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.MemrchrRow -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.Time -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.TimeAddPanic -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrExtraReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays -- proof-setup: allow-public-import + +/-! +# Cutover-2 (`C2`) Aggregate Layout-Fact Bundles & Per-Row `GhostRowOk` Re-Exports (`HooksDehook.C2RowLayoutFacts`) + +**Checked by Lean. Untrusted (`Role::Proof`).** + +Single canonical definition site (per GK6c 15:42Z / 15:47Z / 16:25Z rulings) for the two aggregate +Cutover-2 layout-fact bundles closed by `rfl_kernel` at T4: +1. **`C2ResolveFacts (mpl : Obj.MultiPlacement) : Prop`:** Symbol-resolved entry equalities + `libsignalSessionLib.resolve mpl = c2Addr` across all 10 de-hooked C2 rows + (`from_utf8`, `duration_since`, `SystemTime::add`, `memrchr`, `"strlen"`, `"bcmp"`, `"memmove"`, + and the 3 Dalek `.text.lib2` rows via `Dalek.C2DalekResolveFacts mpl`). +2. **`C2Lib2RxSliceFacts (mpl : Obj.MultiPlacement) : Prop`:** Linear byte-subslice checks + `CodeSubslice.checkProgCodeSubslice Tie.f3TrialRxProg = true` against the **exact** + `subProg` definition each row's replay and `GhostRowSpecOk` are proved over. +3. **Consumer-ready `GhostRowOk` one-liners across all 10 rows at `mpl := lsmpl` (`[LibsignalPlacement]`):** + Each row theorem instantiates `mpl := lsmpl` directly (`0` second `LinkedAt` witnesses, `0` + `mpl = lsmpl` assumptions) on `InvS := fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs` and + `EG := fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')` matching + `ExtraGhostReplay.ExtraListReplaysOn` / `ExtraOk`. +-/ + +public section + +set_option autoImplicit false + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts + +open Arm64 Arm64.Obj Arm64.Process +open CryptoVerification (LibsignalPlacement lsmpl) +open CryptoVerification.SignalSession + (CliHooks cliElfBytes cliExternsPlaced libsignalSessionLib lsBlackBoxSym lsDurationSinceSym + lsFromUtf8Sym lsMemrchrSym lsSharedSecretDropSym lsStaticSecretDropSym lsTimeAddSym) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays + (bcmpEntryGuard bcmpGhost bcmpSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhostReplays + (blackBoxEntryGuard blackBoxGhost blackBoxSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice + (checkProgCodeSubslice) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.Dalek + (C2DalekResolveFacts) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.FromUtf8Row + (c2_fromUtf8MplGhost_rowOk c2_fromUtf8MplGhost_rowOk_guardOf) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.Time + (c2TimeMpl c2_durationSinceGhost_rowOk_lsmpl_and_fs) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.TimeAddPanic + (c2_timeAddGhost_rowOk_lsmpl_extra c2_timeAddGhost_rowOk_lsmpl_guardOf) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhostReplays + (durationSinceEntryGuard durationSinceGhost durationSinceSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + (GhostRowOk GhostRowReplayOn) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8GhostReplays + (fromUtf8EntryGuard fromUtf8MplGhost fromUtf8SubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8SingleBlock (fromUtf8Placement) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays + (memmoveEntryGuard memmoveGhost memmoveSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrExtraReplays + (memrchrEntryGuard memrchrGhost memrchrSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness + (f3EmptyMemcpyGhostHookNarrow f3EmptyMemsetGhostHookNarrow) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropGhostReplays + (sharedSecretDropEntryGuard sharedSecretDropGhost sharedSecretDropSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StaticSecretDropGhostReplays + (staticSecretDropEntryGuard staticSecretDropGhost staticSecretDropSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays + (strlenEntryGuard strlenGhost strlenSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddGhostReplays + (timeAddEntryGuard timeAddGhost timeAddSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraGhostTable cliGhostExternsWithExtra) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + (C2ExternTableFacts C2RoSliceFacts) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics (F3CodeInv) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Tie (f3TrialRxProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen + (c2BcmpAddr c2BlackBoxAddr c2DurationSinceAddr c2FromUtf8Addr c2FromUtf8TableAddr c2MemmoveAddr + c2MemrchrAddr c2SharedSecretDropAddr c2StaticSecretDropAddr c2StrlenAddr c2TimeAddAddr) + +/-! ## 1. Aggregate Pending-Witness Bundles (`C2ResolveFacts`, `C2Lib2RxSliceFacts`) -/ + +/-- Aggregate Cutover-2 symbol-resolution witness across all 10 de-hooked rows (`37 → 27`), tied to + `mpl` (instantiated at `lsmpl` under `libsignalSessionLib.LinkedAt cliElfBytes lsmpl` and closed + by `rfl_kernel` at T4). Embeds `Dalek.C2DalekResolveFacts mpl` to avoid a second definition site + for the 3 Dalek equalities. -/ +structure C2ResolveFacts (mpl : Obj.MultiPlacement) : Prop where + fromUtf8_eq : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr + durationSince_eq : libsignalSessionLib.resolve mpl lsDurationSinceSym = c2DurationSinceAddr + timeAdd_eq : libsignalSessionLib.resolve mpl lsTimeAddSym = c2TimeAddAddr + memrchr_eq : libsignalSessionLib.resolve mpl lsMemrchrSym = c2MemrchrAddr + strlen_eq : libsignalSessionLib.resolve mpl "strlen" = c2StrlenAddr + bcmp_eq : libsignalSessionLib.resolve mpl "bcmp" = c2BcmpAddr + memmove_eq : libsignalSessionLib.resolve mpl "memmove" = c2MemmoveAddr + dalek : C2DalekResolveFacts mpl + +theorem C2ResolveFacts.blackBox_eq {mpl : Obj.MultiPlacement} (h : C2ResolveFacts mpl) : + libsignalSessionLib.resolve mpl lsBlackBoxSym = c2BlackBoxAddr := + h.dalek.blackBox_eq + +theorem C2ResolveFacts.sharedSecretDrop_eq {mpl : Obj.MultiPlacement} (h : C2ResolveFacts mpl) : + libsignalSessionLib.resolve mpl lsSharedSecretDropSym = c2SharedSecretDropAddr := + h.dalek.sharedSecretDrop_eq + +theorem C2ResolveFacts.staticSecretDrop_eq {mpl : Obj.MultiPlacement} (h : C2ResolveFacts mpl) : + libsignalSessionLib.resolve mpl lsStaticSecretDropSym = c2StaticSecretDropAddr := + h.dalek.staticSecretDrop_eq + +/-- Aggregate Cutover-2 RX byte-subslice witness across all 10 de-hooked rows (`37 → 27`), checked + against `Tie.f3TrialRxProg` using the **exact** `subProg` definition each row's replay and + `GhostRowSpecOk` are proved over (discharged by `rfl_kernel` at T4; `[M]` on + `stock-wp5-startup` @ `60a74fc348`: `rfl_kernel` on + `checkProgCodeSubslice f3TrialRxProg (durationSinceSubProg c2TimeMpl) = false` took `3.23s` + kernel / `0.00s` elab / `3.40 GiB` RSS, and a simulated non-short-circuiting + `f3TrialRxProg.code.drop` tail walk + 320-byte match took `3.17s` kernel / `3.41 GiB` RSS). -/ +structure C2Lib2RxSliceFacts (mpl : Obj.MultiPlacement) : Prop where + fromUtf8 : + checkProgCodeSubslice f3TrialRxProg + (fromUtf8SubProg (fromUtf8Placement c2FromUtf8Addr c2FromUtf8TableAddr)) = true + durationSince : + checkProgCodeSubslice f3TrialRxProg (durationSinceSubProg c2TimeMpl) = true + timeAdd : + checkProgCodeSubslice f3TrialRxProg (timeAddSubProg c2TimeMpl) = true + blackBox : + checkProgCodeSubslice f3TrialRxProg (blackBoxSubProg mpl) = true + sharedSecretDrop : + checkProgCodeSubslice f3TrialRxProg (sharedSecretDropSubProg mpl) = true + staticSecretDrop : + checkProgCodeSubslice f3TrialRxProg (staticSecretDropSubProg mpl) = true + memrchr : + checkProgCodeSubslice f3TrialRxProg (memrchrSubProg mpl) = true + strlen : + checkProgCodeSubslice f3TrialRxProg (strlenSubProg mpl) = true + bcmp : + checkProgCodeSubslice f3TrialRxProg (bcmpSubProg mpl) = true + memmove : + checkProgCodeSubslice f3TrialRxProg (memmoveSubProg mpl) = true + +/-! ## 2. Consumer-Shaped `GhostRowOk` One-Liners Across All 10 Rows at `mpl := lsmpl` -/ + +private theorem ghostRowReplayOn_of_true_guard + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + {EG : CliHooks → String → Option (State → State)} + {sym : String} {f : State → State} + (entryGuard : State → Prop) + (h : GhostRowReplayOn mpl mmpl InvS EG sym (fun _ => True) f) : + GhostRowReplayOn mpl mmpl InvS EG sym entryGuard f := + ⟨h.preserves_execFrozen, fun W s0 sf _ => h.replay_at_stub W s0 sf trivial⟩ + +/-- Cutover-2 `GhostRowOk` re-export for `lsFromUtf8Sym` (`core::str::converts::from_utf8`) at + `mpl := lsmpl`. -/ +theorem c2_fromUtf8Ghost_rowOk [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsFromUtf8Sym = + some (fromUtf8MplGhost lsmpl mmpl c2FromUtf8TableAddr)) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hRo : C2RoSliceFacts) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsFromUtf8Sym + (fromUtf8EntryGuard lsmpl) + (fromUtf8MplGhost lsmpl mmpl c2FromUtf8TableAddr) := + c2_fromUtf8MplGhost_rowOk lsmpl mmpl PredFs g extra hLook + hRo hExt hRx.fromUtf8 hRes.fromUtf8_eq hLs + +/-- `guardOf`-adapted Cutover-2 `GhostRowOk` re-export for `lsFromUtf8Sym` at `mpl := lsmpl`. -/ +theorem c2_fromUtf8Ghost_rowOk_guardOf [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsFromUtf8Sym = + some (fromUtf8MplGhost lsmpl mmpl c2FromUtf8TableAddr)) + (hGuard : ∀ s0 : State, guardOf lsFromUtf8Sym s0 → fromUtf8EntryGuard lsmpl s0) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hRo : C2RoSliceFacts) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsFromUtf8Sym + (guardOf lsFromUtf8Sym) + (fromUtf8MplGhost lsmpl mmpl c2FromUtf8TableAddr) := + c2_fromUtf8MplGhost_rowOk_guardOf lsmpl mmpl PredFs guardOf g extra hLook hGuard + hRo hExt hRx.fromUtf8 hRes.fromUtf8_eq hLs + +/-- Cutover-2 `GhostRowOk` re-export for `lsDurationSinceSym` (`SystemTime::duration_since`) at + `mpl := lsmpl`. -/ +theorem c2_durationSinceGhost_rowOk [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hRo : C2RoSliceFacts) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsDurationSinceSym + (durationSinceEntryGuard lsmpl) + (durationSinceGhost c2TimeMpl) := + c2_durationSinceGhost_rowOk_lsmpl_and_fs mmpl PredFs + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + hRo hExt hRx.durationSince hRes.durationSince_eq hLs + +/-- `guardOf`-adapted Cutover-2 `GhostRowOk` re-export for `lsDurationSinceSym` at `mpl := lsmpl` + (`0` `hGuard` premise needed because `durationSinceEntryGuard lsmpl` is `True`). -/ +theorem c2_durationSinceGhost_rowOk_guardOf [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hRo : C2RoSliceFacts) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsDurationSinceSym + (guardOf lsDurationSinceSym) + (durationSinceGhost c2TimeMpl) := by + have hRow := c2_durationSinceGhost_rowOk mmpl PredFs g extra hRes hRx hRo hExt hLs + exact ⟨hRow.1, ghostRowReplayOn_of_true_guard (guardOf lsDurationSinceSym) hRow.2⟩ + +/-- Cutover-2 `GhostRowOk` re-export for `lsTimeAddSym` (`>::add`) at + `mpl := lsmpl`. -/ +theorem c2_timeAddGhost_rowOk [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsTimeAddSym + (timeAddEntryGuard lsmpl) + (timeAddGhost c2TimeMpl) := + c2_timeAddGhost_rowOk_lsmpl_extra mmpl PredFs g extra + hExt hRx.timeAdd hRes.timeAdd_eq hLs + +/-- `guardOf`-adapted Cutover-2 `GhostRowOk` re-export for `lsTimeAddSym` at `mpl := lsmpl` + (`0` `hGuard` premise needed because `timeAddEntryGuard lsmpl` is `True`). -/ +theorem c2_timeAddGhost_rowOk_guardOf [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsTimeAddSym + (guardOf lsTimeAddSym) + (timeAddGhost c2TimeMpl) := + c2_timeAddGhost_rowOk_lsmpl_guardOf mmpl PredFs guardOf g extra + hExt hRx.timeAdd hRes.timeAdd_eq hLs + +/-- Cutover-2 `GhostRowOk` re-export for `lsBlackBoxSym` (`core::hint::black_box::<&[u8]>`) at + `mpl := lsmpl`. -/ +theorem c2_blackBoxGhost_rowOk [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsBlackBoxSym = some (blackBoxGhost lsmpl mmpl)) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsBlackBoxSym + (blackBoxEntryGuard lsmpl) + (blackBoxGhost lsmpl mmpl) := + DalekRows.c2_blackBoxGhost_rowOk lsmpl mmpl PredFs g extra hLook + hExt hRx.blackBox hRes.blackBox_eq hLs + +/-- `guardOf`-adapted Cutover-2 `GhostRowOk` re-export for `lsBlackBoxSym` at `mpl := lsmpl`. -/ +theorem c2_blackBoxGhost_rowOk_guardOf [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsBlackBoxSym = some (blackBoxGhost lsmpl mmpl)) + (hGuard : ∀ s0 : State, guardOf lsBlackBoxSym s0 → blackBoxEntryGuard lsmpl s0) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsBlackBoxSym + (guardOf lsBlackBoxSym) + (blackBoxGhost lsmpl mmpl) := + DalekRows.c2_blackBoxGhost_rowOk_guardOf lsmpl mmpl PredFs guardOf g extra hLook hGuard + hExt hRx.blackBox hRes.blackBox_eq hLs + +/-- Cutover-2 `GhostRowOk` re-export for `lsSharedSecretDropSym` (`SharedSecret::drop`) at + `mpl := lsmpl`. -/ +theorem c2_sharedSecretDropGhost_rowOk [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsSharedSecretDropSym = some (sharedSecretDropGhost lsmpl mmpl)) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsSharedSecretDropSym + (sharedSecretDropEntryGuard lsmpl) + (sharedSecretDropGhost lsmpl mmpl) := + DalekRows.c2_sharedSecretDropGhost_rowOk lsmpl mmpl PredFs g extra hLook + hExt hRx.sharedSecretDrop hRes.sharedSecretDrop_eq hLs + +/-- `guardOf`-adapted Cutover-2 `GhostRowOk` re-export for `lsSharedSecretDropSym` at + `mpl := lsmpl`. -/ +theorem c2_sharedSecretDropGhost_rowOk_guardOf [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsSharedSecretDropSym = some (sharedSecretDropGhost lsmpl mmpl)) + (hGuard : ∀ s0 : State, guardOf lsSharedSecretDropSym s0 → sharedSecretDropEntryGuard lsmpl s0) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsSharedSecretDropSym + (guardOf lsSharedSecretDropSym) + (sharedSecretDropGhost lsmpl mmpl) := + DalekRows.c2_sharedSecretDropGhost_rowOk_guardOf lsmpl mmpl PredFs guardOf g extra hLook hGuard + hExt hRx.sharedSecretDrop hRes.sharedSecretDrop_eq hLs + +/-- Cutover-2 `GhostRowOk` re-export for `lsStaticSecretDropSym` (`StaticSecret::drop`) at + `mpl := lsmpl`. -/ +theorem c2_staticSecretDropGhost_rowOk [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsStaticSecretDropSym = some (staticSecretDropGhost lsmpl mmpl)) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsStaticSecretDropSym + (staticSecretDropEntryGuard lsmpl) + (staticSecretDropGhost lsmpl mmpl) := + DalekRows.c2_staticSecretDropGhost_rowOk lsmpl mmpl PredFs g extra hLook + hExt hRx.staticSecretDrop hRes.staticSecretDrop_eq hLs + +/-- `guardOf`-adapted Cutover-2 `GhostRowOk` re-export for `lsStaticSecretDropSym` at + `mpl := lsmpl`. -/ +theorem c2_staticSecretDropGhost_rowOk_guardOf [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsStaticSecretDropSym = some (staticSecretDropGhost lsmpl mmpl)) + (hGuard : ∀ s0 : State, guardOf lsStaticSecretDropSym s0 → staticSecretDropEntryGuard lsmpl s0) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsStaticSecretDropSym + (guardOf lsStaticSecretDropSym) + (staticSecretDropGhost lsmpl mmpl) := + DalekRows.c2_staticSecretDropGhost_rowOk_guardOf lsmpl mmpl PredFs guardOf g extra hLook hGuard + hExt hRx.staticSecretDrop hRes.staticSecretDrop_eq hLs + +/-- Cutover-2 `GhostRowOk` re-export for Route-`R0` `lsMemrchrSym` (`slice::memchr::memrchr`) at + `mpl := lsmpl`. -/ +theorem c2_memrchrGhost_rowOk [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsMemrchrSym + (memrchrEntryGuard lsmpl) + (memrchrGhost lsmpl mmpl) := + MemrchrRow.c2_memrchrGhost_rowOk mmpl PredFs + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + hExt hRx.memrchr hRes.memrchr_eq hLs + +/-- `guardOf`-adapted Cutover-2 `GhostRowOk` re-export for `lsMemrchrSym` at `mpl := lsmpl` + (`0` `hGuard` premise needed because `memrchrEntryGuard lsmpl` is `True`). -/ +theorem c2_memrchrGhost_rowOk_guardOf [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsMemrchrSym + (guardOf lsMemrchrSym) + (memrchrGhost lsmpl mmpl) := by + have hRow := c2_memrchrGhost_rowOk mmpl PredFs g extra hRes hRx hExt hLs + exact ⟨hRow.1, ghostRowReplayOn_of_true_guard (guardOf lsMemrchrSym) hRow.2⟩ + +/-- Cutover-2 `GhostRowOk` re-export for `"strlen"` at `mpl := lsmpl`. -/ +theorem c2_strlenGhost_rowOk [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "strlen" = some (strlenGhost lsmpl mmpl)) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "strlen" + (strlenEntryGuard lsmpl) + (strlenGhost lsmpl mmpl) := + LibcRows.c2_strlenGhost_rowOk lsmpl mmpl PredFs g extra hLook + hExt hRx.strlen hRes.strlen_eq hLs + +/-- `guardOf`-adapted Cutover-2 `GhostRowOk` re-export for `"strlen"` at `mpl := lsmpl`. -/ +theorem c2_strlenGhost_rowOk_guardOf [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "strlen" = some (strlenGhost lsmpl mmpl)) + (hGuard : ∀ s0 : State, guardOf "strlen" s0 → strlenEntryGuard lsmpl s0) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "strlen" + (guardOf "strlen") + (strlenGhost lsmpl mmpl) := + LibcRows.c2_strlenGhost_rowOk_guardOf lsmpl mmpl PredFs guardOf g extra hLook hGuard + hExt hRx.strlen hRes.strlen_eq hLs + +/-- Cutover-2 `GhostRowOk` re-export for `"bcmp"` at `mpl := lsmpl`. -/ +theorem c2_bcmpGhost_rowOk [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "bcmp" = some (bcmpGhost lsmpl mmpl)) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "bcmp" + (bcmpEntryGuard lsmpl) + (bcmpGhost lsmpl mmpl) := + LibcRows.c2_bcmpGhost_rowOk lsmpl mmpl PredFs g extra hLook + hExt hRx.bcmp hRes.bcmp_eq hLs + +/-- `guardOf`-adapted Cutover-2 `GhostRowOk` re-export for `"bcmp"` at `mpl := lsmpl`. -/ +theorem c2_bcmpGhost_rowOk_guardOf [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "bcmp" = some (bcmpGhost lsmpl mmpl)) + (hGuard : ∀ s0 : State, guardOf "bcmp" s0 → bcmpEntryGuard lsmpl s0) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "bcmp" + (guardOf "bcmp") + (bcmpGhost lsmpl mmpl) := + LibcRows.c2_bcmpGhost_rowOk_guardOf lsmpl mmpl PredFs guardOf g extra hLook hGuard + hExt hRx.bcmp hRes.bcmp_eq hLs + +/-- Cutover-2 `GhostRowOk` re-export for `"memmove"` at `mpl := lsmpl` (`hGMemcpy` / `hGMemset` + consumer-discharged per GK6c ruling). -/ +theorem c2_memmoveGhost_rowOk [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "memmove" = some (memmoveGhost lsmpl mmpl)) + (hGMemcpy : g.memcpy = none ∨ g.memcpy = some (f3EmptyMemcpyGhostHookNarrow mmpl)) + (hGMemset : g.memset = none ∨ g.memset = some (f3EmptyMemsetGhostHookNarrow mmpl)) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "memmove" + (memmoveEntryGuard lsmpl) + (memmoveGhost lsmpl mmpl) := + MemmoveRow.c2_memmoveGhost_rowOk lsmpl mmpl PredFs g extra hLook hGMemcpy hGMemset + hExt hRx.memmove hRes.memmove_eq hLs + +/-- `guardOf`-adapted Cutover-2 `GhostRowOk` re-export for `"memmove"` at `mpl := lsmpl`. -/ +theorem c2_memmoveGhost_rowOk_guardOf [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "memmove" = some (memmoveGhost lsmpl mmpl)) + (hGuard : ∀ s0 : State, guardOf "memmove" s0 → memmoveEntryGuard lsmpl s0) + (hGMemcpy : g.memcpy = none ∨ g.memcpy = some (f3EmptyMemcpyGhostHookNarrow mmpl)) + (hGMemset : g.memset = none ∨ g.memset = some (f3EmptyMemsetGhostHookNarrow mmpl)) + (hRes : C2ResolveFacts lsmpl) + (hRx : C2Lib2RxSliceFacts lsmpl) + (hExt : C2ExternTableFacts lsmpl) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "memmove" + (guardOf "memmove") + (memmoveGhost lsmpl mmpl) := + MemmoveRow.c2_memmoveGhost_rowOk_guardOf lsmpl mmpl PredFs guardOf g extra hLook hGuard + hGMemcpy hGMemset hExt hRx.memmove hRes.memmove_eq hLs + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/CodeSubslice.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/CodeSubslice.lean new file mode 100644 index 000000000..07ed34d54 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/CodeSubslice.lean @@ -0,0 +1,95 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import ProofLib.Invariant -- proof-setup: allow-public-import + +/-! +# Linear `Program` Byte-Subslice Check & `CodeLoaded` Bridge (`C2RowLayoutFacts.CodeSubslice`) + +**Checked by Lean. Untrusted (`Role::Proof`).** + +Single canonical definition site for `checkProgCodeSubslice`, shared by `C2Lib2RxSliceFacts` and all +per-row Cutover-2 (`C2`) RX code-slice discharges (`Time`, `TimeAddPanic`, `FromUtf8Row`, and the +`RowCommon` rows): +- `checkProgCodeSubslice rxProg subProg` performs a single linear `O(off + subProg.code.length)` + byte-subslice comparison `(rxProg.code.drop off).take subProg.code.length` together with 4-byte + alignment and `2 ^ 64` no-wrap checks. +- `rxSubslice_of_checkProgCodeSubslice` extracts the alignment, no-wrap, and indexed byte-equality + bundle consumed by `Lib2LayoutFacts.f3CodeInv_rxWords_codeLoaded_strip`. +- `codeLoaded_of_checkProgCodeSubslice` derives `subProg.CodeLoaded m` directly from + `rxProg.CodeLoaded m` and `checkProgCodeSubslice rxProg subProg = true`. +-/ + +public section + +set_option autoImplicit false + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice + +open Arm64 ProofLib + +/-- Linear `O(off + subProg.code.length)` decidable byte-subslice witness certifying that + `subProg.base` is 4-byte aligned, `[subProg.base, subProg.base + subProg.code.length)` does not + wrap `2 ^ 64`, and `subProg.code` matches `rxProg.code` starting at byte offset + `(subProg.base - rxProg.base).toNat`. -/ +@[expose] def checkProgCodeSubslice (rxProg subProg : Program) : Bool := + let off := (subProg.base - rxProg.base).toNat + Nat.beq (subProg.base.toNat % 4) 0 && + Nat.ble (subProg.base.toNat + subProg.code.length) (2 ^ 64) && + decide (rxProg.base + BitVec.ofNat 64 off = subProg.base) && + Nat.ble (off + subProg.code.length) rxProg.code.length && + (subProg.code == (rxProg.code.drop off).take subProg.code.length) + +/-- Extract the exact alignment, no-wrap, and byte-subslice existential required by + `Lib2LayoutFacts.f3CodeInv_rxWords_codeLoaded_strip` from a single `checkProgCodeSubslice` + evaluation. -/ +theorem rxSubslice_of_checkProgCodeSubslice {rxProg subProg : Program} + (hchk : checkProgCodeSubslice rxProg subProg = true) : + subProg.base.toNat % 4 = 0 ∧ + subProg.base.toNat + subProg.code.length ≤ 2 ^ 64 ∧ + (∀ (i : Nat) (hi : i < subProg.code.length), + ∃ (j : Nat) (hj : j < rxProg.code.length), + subProg.base + BitVec.ofNat 64 i = rxProg.base + BitVec.ofNat 64 j ∧ + subProg.code[i] = rxProg.code[j]) := by + unfold checkProgCodeSubslice at hchk + dsimp only at hchk + simp only [Bool.and_eq_true, Nat.beq_eq, Nat.ble_eq, decide_eq_true_eq, beq_iff_eq] at hchk + rcases hchk with ⟨⟨⟨⟨hAlign, hNoWrap⟩, hBaseEq⟩, hBound⟩, hCodeEq⟩ + refine ⟨hAlign, hNoWrap, fun i hi => ?_⟩ + let off := (subProg.base - rxProg.base).toNat + have hj : off + i < rxProg.code.length := by omega + refine ⟨off + i, hj, ?_, ?_⟩ + · have hofNat : BitVec.ofNat 64 (off + i) = BitVec.ofNat 64 off + BitVec.ofNat 64 i := by + apply BitVec.eq_of_toNat_eq + rw [BitVec.toNat_ofNat, BitVec.toNat_add, BitVec.toNat_ofNat, BitVec.toNat_ofNat, + ← Nat.add_mod] + rw [hofNat, ← BitVec.add_assoc, hBaseEq] + · have hget? : + subProg.code[i]? = ((rxProg.code.drop off).take subProg.code.length)[i]? := + congrArg (fun l => l[i]?) hCodeEq + rw [List.getElem?_eq_getElem hi, List.getElem?_take_of_lt hi, List.getElem?_drop, + List.getElem?_eq_getElem hj] at hget? + exact Option.some.inj hget? + +/-- Direct `subProg.CodeLoaded m` derivation from `rxProg.CodeLoaded m` and + `checkProgCodeSubslice rxProg subProg = true` (independent of `subProg.externs`, covering both + `durationSinceSubProg` and `timeAddSubProg`). -/ +theorem codeLoaded_of_checkProgCodeSubslice {rxProg subProg : Program} {m : Memory} + (hRx : rxProg.CodeLoaded m) + (hchk : checkProgCodeSubslice rxProg subProg = true) : + subProg.CodeLoaded m := by + obtain ⟨hAlign, hNoWrap, hSub⟩ := rxSubslice_of_checkProgCodeSubslice hchk + refine Program.CodeLoaded.intro hAlign hNoWrap fun i hi => ?_ + obtain ⟨j, hj, haddr_eq, hbyte_eq⟩ := hSub i hi + rw [haddr_eq, hbyte_eq] + exact ⟨hRx.byte_eq j hj, hRx.perm_eq j hj, hRx.isLazyFree_eq j hj⟩ + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/Dalek.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/Dalek.lean new file mode 100644 index 000000000..cfcef5ab3 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/Dalek.lean @@ -0,0 +1,308 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StaticSecretDropGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts -- proof-setup: allow-public-import + +/-! +# Cutover-2 (`C2`) `.text.lib2` Dalek Entry-Guard Discharges (`C2RowLayoutFacts.Dalek`) + +Discharges GK6c §19(d) for the three `.text.lib2` Dalek/generics rows (`lsBlackBoxSym`, +`lsSharedSecretDropSym`, `lsStaticSecretDropSym`): +1. Keyed strictly by symbol name (`libsignalSessionLib.resolve mpl `) and generator-emitted + `Wp4LayoutGen` / `Lib2LayoutFacts` constants (`c2BlackBoxAddr`, `c2SharedSecretDropAddr`, + `c2StaticSecretDropAddr`, `c2Lib2TextLo`, `c2Lib2TextHi`, `f3StartupLrVal`), with zero hex + address literals. +2. Proves per-row hull inclusion `keepR_ mpl pc = true → keepLib2Text pc = true` on the C2 + placement (`C2DalekResolveFacts mpl`), then routes through unconditional + `Lib2LayoutFacts.f3Lib2EntryGuard_of_startupLr` + `C2ExternTableFacts.lib2InKeep` (and direct + `C2DalekResolveFacts`-only corollaries) to yield `blackBoxEntryGuard mpl s0`, + `sharedSecretDropEntryGuard mpl s0`, and `staticSecretDropEntryGuard mpl s0` in the exact shapes + consumed by `extraEntryGuard_{blackBox,sharedSecretDrop,staticSecretDrop}_arm` and + `extraEntryGuard_singleton_{blackBox,sharedSecretDrop,staticSecretDrop}`. +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.Dalek + +open Arm64 Arm64.Obj ProofLib.ProgramReflection +open CryptoVerification.SignalSession + (libsignalSessionLib lsBlackBoxSym lsSharedSecretDropSym lsStaticSecretDropSym) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Heap.Fine (f3StdLayout) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 (StdMainEntryLr) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay (ExtraEntryGuard) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxLrTrap + (blackBoxByteLen keepBlackBox keepBlackBox_iff) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhostReplays + (blackBoxEntryGuard blackBoxEntryGuard_iff blackBoxGhost extraEntryGuard_blackBox_arm + extraEntryGuard_singleton_blackBox keepR_blackBox) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeGhost (sharedSecretDropEntryOff) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeLrTrap + (keepSharedSecretDropHull keepSharedSecretDropHull_iff keepStaticSecretDrop + keepStaticSecretDrop_iff sharedSecretDropHullByteLen staticSecretDropByteLen) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropGhostReplays + (extraEntryGuard_sharedSecretDrop_arm extraEntryGuard_singleton_sharedSecretDrop + keepR_sharedSecretDrop sharedSecretDropEntryGuard sharedSecretDropEntryGuard_iff + sharedSecretDropGhost sharedSecretDropHullBase) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StaticSecretDropGhostReplays + (extraEntryGuard_singleton_staticSecretDrop extraEntryGuard_staticSecretDrop_arm + keepR_staticSecretDrop staticSecretDropEntryGuard staticSecretDropEntryGuard_iff + staticSecretDropGhost) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + (C2ExternTableFacts f3Lib2EntryGuard_of_startupLr f3Lib2_dehookedSym_in_keepLib2Text + f3StartupLrVal keepLib2Text) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen + (c2BlackBoxAddr c2Lib2DehookedSyms c2Lib2TextHi c2Lib2TextLo c2SharedSecretDropAddr + c2StaticSecretDropAddr) + +/-! ## 1. C2 Resolved-Address Witness & Symbol Membership in `c2Lib2DehookedSyms` -/ + +/-- C2 resolved-address witness for the 3 `.text.lib2` Dalek rows; closed at T4 on the C2-pinned + `cliElfBytes` from `cliElf_linkedAt_unique` + `rfl`. -/ +structure C2DalekResolveFacts (mpl : Obj.MultiPlacement) : Prop where + blackBox_eq : libsignalSessionLib.resolve mpl lsBlackBoxSym = c2BlackBoxAddr + sharedSecretDrop_eq : + libsignalSessionLib.resolve mpl lsSharedSecretDropSym = c2SharedSecretDropAddr + staticSecretDrop_eq : + libsignalSessionLib.resolve mpl lsStaticSecretDropSym = c2StaticSecretDropAddr + +theorem lsBlackBoxSym_mem_c2Lib2DehookedSyms : + lsBlackBoxSym ∈ c2Lib2DehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +theorem lsSharedSecretDropSym_mem_c2Lib2DehookedSyms : + lsSharedSecretDropSym ∈ c2Lib2DehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +theorem lsStaticSecretDropSym_mem_c2Lib2DehookedSyms : + lsStaticSecretDropSym ∈ c2Lib2DehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +/-! ## 2. Per-Row Hull Inclusion `keepR_ mpl pc = true → keepLib2Text pc = true` -/ + +private theorem keepLib2Text_of_sub_lt {base pc : BitVec 64} {len : Nat} + (hsub : (pc - base).toNat < len) + (hlo : c2Lib2TextLo.toNat ≤ base.toNat) + (hhi : base.toNat + len ≤ c2Lib2TextHi.toNat) : + keepLib2Text pc = true := by + unfold keepLib2Text + rw [decide_eq_true_eq] + have htop : c2Lib2TextHi.toNat < 2 ^ 64 := BitVec.isLt c2Lib2TextHi + generalize hd : pc - base = d at hsub + have hpc_eq : pc = base + d := by subst hd; bv_omega + have htoNat : pc.toNat = base.toNat + d.toNat := by + rw [hpc_eq, BitVec.toNat_add, Nat.mod_eq_of_lt (by omega)] + omega + +/-- Unconditional C2 hull inclusion for `keepBlackBox c2BlackBoxAddr`. -/ +theorem keepBlackBox_c2_sub_keepLib2Text {pc : BitVec 64} + (h : keepBlackBox c2BlackBoxAddr pc = true) : + keepLib2Text pc = true := by + rw [keepBlackBox_iff] at h + exact keepLib2Text_of_sub_lt h + (decide_eq_true_eq.mp (by rfl_kernel)) + (decide_eq_true_eq.mp (by rfl_kernel)) + +/-- Unconditional C2 hull inclusion for `keepSharedSecretDropHull (c2SharedSecretDropAddr - sharedSecretDropEntryOff)`. -/ +theorem keepSharedSecretDrop_c2_sub_keepLib2Text {pc : BitVec 64} + (h : keepSharedSecretDropHull (c2SharedSecretDropAddr - sharedSecretDropEntryOff) pc = true) : + keepLib2Text pc = true := by + rw [keepSharedSecretDropHull_iff] at h + exact keepLib2Text_of_sub_lt h + (decide_eq_true_eq.mp (by rfl_kernel)) + (decide_eq_true_eq.mp (by rfl_kernel)) + +/-- Unconditional C2 hull inclusion for `keepStaticSecretDrop c2StaticSecretDropAddr`. -/ +theorem keepStaticSecretDrop_c2_sub_keepLib2Text {pc : BitVec 64} + (h : keepStaticSecretDrop c2StaticSecretDropAddr pc = true) : + keepLib2Text pc = true := by + rw [keepStaticSecretDrop_iff] at h + exact keepLib2Text_of_sub_lt h + (decide_eq_true_eq.mp (by rfl_kernel)) + (decide_eq_true_eq.mp (by rfl_kernel)) + +theorem keepR_blackBox_sub_keepLib2Text {mpl : Obj.MultiPlacement} + (hRes : libsignalSessionLib.resolve mpl lsBlackBoxSym = c2BlackBoxAddr) + (pc : BitVec 64) (h : keepR_blackBox mpl pc = true) : + keepLib2Text pc = true := by + dsimp only [keepR_blackBox] at h + rw [hRes] at h + exact keepBlackBox_c2_sub_keepLib2Text h + +theorem keepR_sharedSecretDrop_sub_keepLib2Text {mpl : Obj.MultiPlacement} + (hRes : libsignalSessionLib.resolve mpl lsSharedSecretDropSym = c2SharedSecretDropAddr) + (pc : BitVec 64) (h : keepR_sharedSecretDrop mpl pc = true) : + keepLib2Text pc = true := by + dsimp only [keepR_sharedSecretDrop, sharedSecretDropHullBase] at h + rw [hRes] at h + exact keepSharedSecretDrop_c2_sub_keepLib2Text h + +theorem keepR_staticSecretDrop_sub_keepLib2Text {mpl : Obj.MultiPlacement} + (hRes : libsignalSessionLib.resolve mpl lsStaticSecretDropSym = c2StaticSecretDropAddr) + (pc : BitVec 64) (h : keepR_staticSecretDrop mpl pc = true) : + keepLib2Text pc = true := by + dsimp only [keepR_staticSecretDrop] at h + rw [hRes] at h + exact keepStaticSecretDrop_c2_sub_keepLib2Text h + +/-! ## 3. Per-Row Entry Guards (`blackBoxEntryGuard`, `sharedSecretDropEntryGuard`, `staticSecretDropEntryGuard`) -/ + +/-- `blackBoxEntryGuard mpl s0` from `C2ExternTableFacts` + `resolve = c2BlackBoxAddr` + startup `lr`, + routing directly through `Lib2LayoutFacts.f3Lib2EntryGuard_of_startupLr`. -/ +theorem f3BlackBoxEntryGuard_of_startupLr {mpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl lsBlackBoxSym = c2BlackBoxAddr) + {s0 : State} (hlr : s0.readReg64 .lr = f3StartupLrVal) : + blackBoxEntryGuard mpl s0 := + (blackBoxEntryGuard_iff mpl s0).mpr + (f3Lib2EntryGuard_of_startupLr hlr + (f3Lib2_dehookedSym_in_keepLib2Text hExt lsBlackBoxSym_mem_c2Lib2DehookedSyms) + (keepR_blackBox_sub_keepLib2Text hRes)) + +/-- `sharedSecretDropEntryGuard mpl s0` from `C2ExternTableFacts` + `resolve = c2SharedSecretDropAddr` + + startup `lr`, routing directly through `Lib2LayoutFacts.f3Lib2EntryGuard_of_startupLr`. -/ +theorem f3SharedSecretDropEntryGuard_of_startupLr {mpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl lsSharedSecretDropSym = c2SharedSecretDropAddr) + {s0 : State} (hlr : s0.readReg64 .lr = f3StartupLrVal) : + sharedSecretDropEntryGuard mpl s0 := + (sharedSecretDropEntryGuard_iff mpl s0).mpr + (f3Lib2EntryGuard_of_startupLr hlr + (f3Lib2_dehookedSym_in_keepLib2Text hExt lsSharedSecretDropSym_mem_c2Lib2DehookedSyms) + (keepR_sharedSecretDrop_sub_keepLib2Text hRes)) + +/-- `staticSecretDropEntryGuard mpl s0` from `C2ExternTableFacts` + `resolve = c2StaticSecretDropAddr` + + startup `lr`, routing directly through `Lib2LayoutFacts.f3Lib2EntryGuard_of_startupLr`. -/ +theorem f3StaticSecretDropEntryGuard_of_startupLr {mpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl lsStaticSecretDropSym = c2StaticSecretDropAddr) + {s0 : State} (hlr : s0.readReg64 .lr = f3StartupLrVal) : + staticSecretDropEntryGuard mpl s0 := + (staticSecretDropEntryGuard_iff mpl s0).mpr + (f3Lib2EntryGuard_of_startupLr hlr + (f3Lib2_dehookedSym_in_keepLib2Text hExt lsStaticSecretDropSym_mem_c2Lib2DehookedSyms) + (keepR_staticSecretDrop_sub_keepLib2Text hRes)) + +/-- `C2ExternTableFacts`-free companion for `blackBoxEntryGuard mpl s0` (`keepLib2Text` on entry + discharged directly from `hRes`). -/ +theorem c2BlackBoxEntryGuard_of_resolve {mpl : Obj.MultiPlacement} + (hRes : libsignalSessionLib.resolve mpl lsBlackBoxSym = c2BlackBoxAddr) + {s0 : State} (hlr : s0.readReg64 .lr = f3StartupLrVal) : + blackBoxEntryGuard mpl s0 := by + have hsym : keepLib2Text (libsignalSessionLib.resolve mpl lsBlackBoxSym) = true := by + rw [hRes]; exact decide_eq_true_eq.mp (by rfl_kernel) + exact (blackBoxEntryGuard_iff mpl s0).mpr + (f3Lib2EntryGuard_of_startupLr hlr hsym (keepR_blackBox_sub_keepLib2Text hRes)) + +/-- `C2ExternTableFacts`-free companion for `sharedSecretDropEntryGuard mpl s0`. -/ +theorem c2SharedSecretDropEntryGuard_of_resolve {mpl : Obj.MultiPlacement} + (hRes : libsignalSessionLib.resolve mpl lsSharedSecretDropSym = c2SharedSecretDropAddr) + {s0 : State} (hlr : s0.readReg64 .lr = f3StartupLrVal) : + sharedSecretDropEntryGuard mpl s0 := by + have hsym : keepLib2Text (libsignalSessionLib.resolve mpl lsSharedSecretDropSym) = true := by + rw [hRes]; exact decide_eq_true_eq.mp (by rfl_kernel) + exact (sharedSecretDropEntryGuard_iff mpl s0).mpr + (f3Lib2EntryGuard_of_startupLr hlr hsym (keepR_sharedSecretDrop_sub_keepLib2Text hRes)) + +/-- `C2ExternTableFacts`-free companion for `staticSecretDropEntryGuard mpl s0`. -/ +theorem c2StaticSecretDropEntryGuard_of_resolve {mpl : Obj.MultiPlacement} + (hRes : libsignalSessionLib.resolve mpl lsStaticSecretDropSym = c2StaticSecretDropAddr) + {s0 : State} (hlr : s0.readReg64 .lr = f3StartupLrVal) : + staticSecretDropEntryGuard mpl s0 := by + have hsym : keepLib2Text (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) = true := by + rw [hRes]; exact decide_eq_true_eq.mp (by rfl_kernel) + exact (staticSecretDropEntryGuard_iff mpl s0).mpr + (f3Lib2EntryGuard_of_startupLr hlr hsym (keepR_staticSecretDrop_sub_keepLib2Text hRes)) + +/-- `StdMainEntryLr f3StdLayout s0` bundle yielding all 3 Dalek entry guards simultaneously. -/ +theorem f3DalekEntryGuards_of_stdMainEntryLr {mpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (hDalek : C2DalekResolveFacts mpl) + {s0 : State} (hlr : StdMainEntryLr f3StdLayout s0) : + blackBoxEntryGuard mpl s0 ∧ + sharedSecretDropEntryGuard mpl s0 ∧ + staticSecretDropEntryGuard mpl s0 := + ⟨f3BlackBoxEntryGuard_of_startupLr hExt hDalek.blackBox_eq hlr, + f3SharedSecretDropEntryGuard_of_startupLr hExt hDalek.sharedSecretDrop_eq hlr, + f3StaticSecretDropEntryGuard_of_startupLr hExt hDalek.staticSecretDrop_eq hlr⟩ + +/-! ## 4. Direct Instantiations of `extraEntryGuard_*_arm` & `extraEntryGuard_singleton_*` -/ + +theorem c2_extraEntryGuard_blackBox_arm {mpl : Obj.MultiPlacement} + {guardOf : String → State → Prop} {s0 : State} + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl lsBlackBoxSym = c2BlackBoxAddr) + (hlr : StdMainEntryLr f3StdLayout s0) + (hGuardEq : guardOf lsBlackBoxSym s0 ↔ blackBoxEntryGuard mpl s0) : + guardOf lsBlackBoxSym s0 := + extraEntryGuard_blackBox_arm hGuardEq (f3BlackBoxEntryGuard_of_startupLr hExt hRes hlr) + +theorem c2_extraEntryGuard_sharedSecretDrop_arm {mpl : Obj.MultiPlacement} + {guardOf : String → State → Prop} {s0 : State} + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl lsSharedSecretDropSym = c2SharedSecretDropAddr) + (hlr : StdMainEntryLr f3StdLayout s0) + (hGuardEq : guardOf lsSharedSecretDropSym s0 ↔ sharedSecretDropEntryGuard mpl s0) : + guardOf lsSharedSecretDropSym s0 := + extraEntryGuard_sharedSecretDrop_arm hGuardEq + (f3SharedSecretDropEntryGuard_of_startupLr hExt hRes hlr) + +theorem c2_extraEntryGuard_staticSecretDrop_arm {mpl : Obj.MultiPlacement} + {guardOf : String → State → Prop} {s0 : State} + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl lsStaticSecretDropSym = c2StaticSecretDropAddr) + (hlr : StdMainEntryLr f3StdLayout s0) + (hGuardEq : guardOf lsStaticSecretDropSym s0 ↔ staticSecretDropEntryGuard mpl s0) : + guardOf lsStaticSecretDropSym s0 := + extraEntryGuard_staticSecretDrop_arm hGuardEq + (f3StaticSecretDropEntryGuard_of_startupLr hExt hRes hlr) + +theorem c2_extraEntryGuard_singleton_blackBox {mpl mmpl : Obj.MultiPlacement} + {guardOf : String → State → Prop} {g : CliGhostHooks} {s0 : State} + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl lsBlackBoxSym = c2BlackBoxAddr) + (hlr : StdMainEntryLr f3StdLayout s0) + (hg : g.extra = [(lsBlackBoxSym, blackBoxGhost mpl mmpl)]) + (hGuardEq : guardOf lsBlackBoxSym s0 ↔ blackBoxEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := + extraEntryGuard_singleton_blackBox hg hGuardEq + (f3BlackBoxEntryGuard_of_startupLr hExt hRes hlr) + +theorem c2_extraEntryGuard_singleton_sharedSecretDrop {mpl mmpl : Obj.MultiPlacement} + {guardOf : String → State → Prop} {g : CliGhostHooks} {s0 : State} + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl lsSharedSecretDropSym = c2SharedSecretDropAddr) + (hlr : StdMainEntryLr f3StdLayout s0) + (hg : g.extra = [(lsSharedSecretDropSym, sharedSecretDropGhost mpl mmpl)]) + (hGuardEq : guardOf lsSharedSecretDropSym s0 ↔ sharedSecretDropEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := + extraEntryGuard_singleton_sharedSecretDrop hg hGuardEq + (f3SharedSecretDropEntryGuard_of_startupLr hExt hRes hlr) + +theorem c2_extraEntryGuard_singleton_staticSecretDrop {mpl mmpl : Obj.MultiPlacement} + {guardOf : String → State → Prop} {g : CliGhostHooks} {s0 : State} + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl lsStaticSecretDropSym = c2StaticSecretDropAddr) + (hlr : StdMainEntryLr f3StdLayout s0) + (hg : g.extra = [(lsStaticSecretDropSym, staticSecretDropGhost mpl mmpl)]) + (hGuardEq : guardOf lsStaticSecretDropSym s0 ↔ staticSecretDropEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := + extraEntryGuard_singleton_staticSecretDrop hg hGuardEq + (f3StaticSecretDropEntryGuard_of_startupLr hExt hRes hlr) + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.Dalek diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/DalekRows.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/DalekRows.lean new file mode 100644 index 000000000..02fbab1cf --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/DalekRows.lean @@ -0,0 +1,316 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.Dalek -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.RowCommon -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StaticSecretDropGhostReplays -- proof-setup: allow-public-import + +/-! +# Cutover-2 (`C2`) Dalek `.text.lib2` Per-Row `GhostRowOk` Glue (`C2RowLayoutFacts.DalekRows`) + +Discharges the per-row `GhostRowOk` obligations at the Cutover-2 placement for the three Dalek +`.text.lib2` rows (`lsBlackBoxSym`, `lsSharedSecretDropSym`, `lsStaticSecretDropSym`). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.DalekRows + +open Arm64 Arm64.Obj ProofLib.ProgramReflection +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession + (CliHooks cliElfBytes cliExternsPlaced libsignalSessionLib lsBlackBoxSym + lsSharedSecretDropSym lsStaticSecretDropSym) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhostReplays + (blackBoxEntryGuard blackBoxGhost blackBoxGhost_rowOk blackBoxSubProg + ghostRowReplayOn_of_guard_imp keepR_blackBox) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxLrTrap (keepBlackBox) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.Dalek + (keepR_blackBox_sub_keepLib2Text keepR_sharedSecretDrop_sub_keepLib2Text + keepR_staticSecretDrop_sub_keepLib2Text) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.RowCommon + (c2_ghostAt_of_extraLookup c2_realHullNoExt_of_keepLib2Text checkProgCodeSubslice + f3CodeInv_and_fs_keepsFrozen f3CodeInv_codeLoaded_of_checkProgCodeSubslice + resolve_c2RxSym_eq_cliElf_rho) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay (GhostRowOk) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropGhostReplays + (keepR_sharedSecretDrop sharedSecretDropEntryGuard sharedSecretDropGhost + sharedSecretDropGhost_rowOk sharedSecretDropHullBase sharedSecretDropSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StaticSecretDropGhostReplays + (keepR_staticSecretDrop staticSecretDropEntryGuard staticSecretDropGhost + staticSecretDropGhost_rowOk staticSecretDropSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeGhost (sharedSecretDropEntryOff) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeLrTrap + (keepSharedSecretDropHull keepStaticSecretDrop) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraGhostTable cliGhostExternsWithExtra) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfPlaced (cliElfMultiPlacement) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + (C2ExternTableFacts f3Row_ghostProg617_externAt_none_of_ne_entry keepLib2Text_sub_rxProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics (F3CodeInv) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Tie (f3TrialRxProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen + (c2BlackBoxAddr c2RxDehookedSyms c2SharedSecretDropAddr c2StaticSecretDropAddr) + +/-! ## 1. `black_box` (`lsBlackBoxSym`) -/ + +private theorem lsBlackBoxSym_mem_c2RxDehookedSyms : + lsBlackBoxSym ∈ c2RxDehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +private theorem c2RxOther_outside_blackBox : + ((c2RxDehookedSyms.filter (· != lsBlackBoxSym)).all + (fun s => !(keepBlackBox c2BlackBoxAddr (cliElfMultiPlacement.ρ s)))) = true := by + rfl_kernel + +theorem c2_blackBox_hGhostNoExtNe + {mpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (hResBlackBox : libsignalSessionLib.resolve mpl lsBlackBoxSym = c2BlackBoxAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (EG : CliHooks → String → Option (State → State)) : + ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_blackBox mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsBlackBoxSym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none := by + intro W pc hkeep hne + refine f3Row_ghostProg617_externAt_none_of_ne_entry hExt EG W + (fun q hq => keepLib2Text_sub_rxProg (keepR_blackBox_sub_keepLib2Text hResBlackBox q hq)) + (fun s hs hs_ne => Or.inl ?_) hkeep hne + have hfilt : s ∈ c2RxDehookedSyms.filter (· != lsBlackBoxSym) := + List.mem_filter.mpr ⟨hs, bne_iff_ne.mpr hs_ne⟩ + have hout := List.all_eq_true.mp c2RxOther_outside_blackBox s hfilt + simp only [Bool.not_eq_true'] at hout + dsimp only [keepR_blackBox] + rw [hResBlackBox, resolve_c2RxSym_eq_cliElf_rho hLs hs] + exact hout + +/-- Cutover-2 `GhostRowOk` discharge for `lsBlackBoxSym` (`BlackBoxGhostReplays.blackBoxGhost_rowOk`). -/ +theorem c2_blackBoxGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsBlackBoxSym = some (blackBoxGhost mpl mmpl)) + (hExt : C2ExternTableFacts mpl) + (hRxBlackBox : checkProgCodeSubslice f3TrialRxProg (blackBoxSubProg mpl) = true) + (hResBlackBox : libsignalSessionLib.resolve mpl lsBlackBoxSym = c2BlackBoxAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsBlackBoxSym + (blackBoxEntryGuard mpl) + (blackBoxGhost mpl mmpl) := + blackBoxGhost_rowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + (f3CodeInv_codeLoaded_of_checkProgCodeSubslice hRxBlackBox) + (f3CodeInv_and_fs_keepsFrozen mpl mmpl PredFs) + (c2_ghostAt_of_extraLookup hExt g extra lsBlackBoxSym_mem_c2RxDehookedSyms (by decide) hLook) + (c2_realHullNoExt_of_keepLib2Text hExt (keepR_blackBox_sub_keepLib2Text hResBlackBox)) + (c2_blackBox_hGhostNoExtNe hExt hResBlackBox hLs _) + +/-- `guardOf`-adapted `GhostRowOk` for `lsBlackBoxSym`. -/ +theorem c2_blackBoxGhost_rowOk_guardOf [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsBlackBoxSym = some (blackBoxGhost mpl mmpl)) + (hGuard : ∀ s0 : State, guardOf lsBlackBoxSym s0 → blackBoxEntryGuard mpl s0) + (hExt : C2ExternTableFacts mpl) + (hRxBlackBox : checkProgCodeSubslice f3TrialRxProg (blackBoxSubProg mpl) = true) + (hResBlackBox : libsignalSessionLib.resolve mpl lsBlackBoxSym = c2BlackBoxAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsBlackBoxSym + (guardOf lsBlackBoxSym) + (blackBoxGhost mpl mmpl) := by + have hRow := c2_blackBoxGhost_rowOk mpl mmpl PredFs g extra hLook hExt hRxBlackBox hResBlackBox hLs + exact ⟨hRow.1, ghostRowReplayOn_of_guard_imp hRow.2 hGuard⟩ + +/-! ## 2. `SharedSecret::drop` (`lsSharedSecretDropSym`) -/ + +private theorem lsSharedSecretDropSym_mem_c2RxDehookedSyms : + lsSharedSecretDropSym ∈ c2RxDehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +private theorem c2RxOther_outside_sharedSecretDrop : + ((c2RxDehookedSyms.filter (· != lsSharedSecretDropSym)).all + (fun s => !(keepSharedSecretDropHull (c2SharedSecretDropAddr - sharedSecretDropEntryOff) + (cliElfMultiPlacement.ρ s)))) = true := by + rfl_kernel + +theorem c2_sharedSecretDrop_hGhostNoExtNe + {mpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (hResSharedDrop : libsignalSessionLib.resolve mpl lsSharedSecretDropSym = c2SharedSecretDropAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (EG : CliHooks → String → Option (State → State)) : + ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_sharedSecretDrop mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsSharedSecretDropSym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none := by + intro W pc hkeep hne + refine f3Row_ghostProg617_externAt_none_of_ne_entry hExt EG W + (fun q hq => keepLib2Text_sub_rxProg (keepR_sharedSecretDrop_sub_keepLib2Text hResSharedDrop q hq)) + (fun s hs hs_ne => Or.inl ?_) hkeep hne + have hfilt : s ∈ c2RxDehookedSyms.filter (· != lsSharedSecretDropSym) := + List.mem_filter.mpr ⟨hs, bne_iff_ne.mpr hs_ne⟩ + have hout := List.all_eq_true.mp c2RxOther_outside_sharedSecretDrop s hfilt + simp only [Bool.not_eq_true'] at hout + dsimp only [keepR_sharedSecretDrop, sharedSecretDropHullBase] + rw [hResSharedDrop, resolve_c2RxSym_eq_cliElf_rho hLs hs] + exact hout + +/-- Cutover-2 `GhostRowOk` discharge for `lsSharedSecretDropSym` + (`SharedSecretDropGhostReplays.sharedSecretDropGhost_rowOk`). -/ +theorem c2_sharedSecretDropGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsSharedSecretDropSym = some (sharedSecretDropGhost mpl mmpl)) + (hExt : C2ExternTableFacts mpl) + (hRxSharedDrop : checkProgCodeSubslice f3TrialRxProg (sharedSecretDropSubProg mpl) = true) + (hResSharedDrop : libsignalSessionLib.resolve mpl lsSharedSecretDropSym = c2SharedSecretDropAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsSharedSecretDropSym + (sharedSecretDropEntryGuard mpl) + (sharedSecretDropGhost mpl mmpl) := + sharedSecretDropGhost_rowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + (f3CodeInv_codeLoaded_of_checkProgCodeSubslice hRxSharedDrop) + (f3CodeInv_and_fs_keepsFrozen mpl mmpl PredFs) + (c2_ghostAt_of_extraLookup hExt g extra lsSharedSecretDropSym_mem_c2RxDehookedSyms + (by decide) hLook) + (c2_realHullNoExt_of_keepLib2Text hExt + (keepR_sharedSecretDrop_sub_keepLib2Text hResSharedDrop)) + (c2_sharedSecretDrop_hGhostNoExtNe hExt hResSharedDrop hLs _) + +/-- `guardOf`-adapted `GhostRowOk` for `lsSharedSecretDropSym`. -/ +theorem c2_sharedSecretDropGhost_rowOk_guardOf [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsSharedSecretDropSym = some (sharedSecretDropGhost mpl mmpl)) + (hGuard : ∀ s0 : State, guardOf lsSharedSecretDropSym s0 → sharedSecretDropEntryGuard mpl s0) + (hExt : C2ExternTableFacts mpl) + (hRxSharedDrop : checkProgCodeSubslice f3TrialRxProg (sharedSecretDropSubProg mpl) = true) + (hResSharedDrop : libsignalSessionLib.resolve mpl lsSharedSecretDropSym = c2SharedSecretDropAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsSharedSecretDropSym + (guardOf lsSharedSecretDropSym) + (sharedSecretDropGhost mpl mmpl) := by + have hRow := c2_sharedSecretDropGhost_rowOk mpl mmpl PredFs g extra hLook hExt + hRxSharedDrop hResSharedDrop hLs + exact ⟨hRow.1, ghostRowReplayOn_of_guard_imp hRow.2 hGuard⟩ + +/-! ## 3. `StaticSecret::drop` (`lsStaticSecretDropSym`) -/ + +private theorem lsStaticSecretDropSym_mem_c2RxDehookedSyms : + lsStaticSecretDropSym ∈ c2RxDehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +private theorem c2RxOther_outside_staticSecretDrop : + ((c2RxDehookedSyms.filter (· != lsStaticSecretDropSym)).all + (fun s => !(keepStaticSecretDrop c2StaticSecretDropAddr + (cliElfMultiPlacement.ρ s)))) = true := by + rfl_kernel + +theorem c2_staticSecretDrop_hGhostNoExtNe + {mpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (hResStaticDrop : libsignalSessionLib.resolve mpl lsStaticSecretDropSym = c2StaticSecretDropAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (EG : CliHooks → String → Option (State → State)) : + ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_staticSecretDrop mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsStaticSecretDropSym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none := by + intro W pc hkeep hne + refine f3Row_ghostProg617_externAt_none_of_ne_entry hExt EG W + (fun q hq => keepLib2Text_sub_rxProg (keepR_staticSecretDrop_sub_keepLib2Text hResStaticDrop q hq)) + (fun s hs hs_ne => Or.inl ?_) hkeep hne + have hfilt : s ∈ c2RxDehookedSyms.filter (· != lsStaticSecretDropSym) := + List.mem_filter.mpr ⟨hs, bne_iff_ne.mpr hs_ne⟩ + have hout := List.all_eq_true.mp c2RxOther_outside_staticSecretDrop s hfilt + simp only [Bool.not_eq_true'] at hout + dsimp only [keepR_staticSecretDrop] + rw [hResStaticDrop, resolve_c2RxSym_eq_cliElf_rho hLs hs] + exact hout + +/-- Cutover-2 `GhostRowOk` discharge for `lsStaticSecretDropSym` + (`StaticSecretDropGhostReplays.staticSecretDropGhost_rowOk`). -/ +theorem c2_staticSecretDropGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsStaticSecretDropSym = some (staticSecretDropGhost mpl mmpl)) + (hExt : C2ExternTableFacts mpl) + (hRxStaticDrop : checkProgCodeSubslice f3TrialRxProg (staticSecretDropSubProg mpl) = true) + (hResStaticDrop : libsignalSessionLib.resolve mpl lsStaticSecretDropSym = c2StaticSecretDropAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsStaticSecretDropSym + (staticSecretDropEntryGuard mpl) + (staticSecretDropGhost mpl mmpl) := + staticSecretDropGhost_rowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + (f3CodeInv_codeLoaded_of_checkProgCodeSubslice hRxStaticDrop) + (f3CodeInv_and_fs_keepsFrozen mpl mmpl PredFs) + (c2_ghostAt_of_extraLookup hExt g extra lsStaticSecretDropSym_mem_c2RxDehookedSyms + (by decide) hLook) + (c2_realHullNoExt_of_keepLib2Text hExt + (keepR_staticSecretDrop_sub_keepLib2Text hResStaticDrop)) + (c2_staticSecretDrop_hGhostNoExtNe hExt hResStaticDrop hLs _) + +/-- `guardOf`-adapted `GhostRowOk` for `lsStaticSecretDropSym`. -/ +theorem c2_staticSecretDropGhost_rowOk_guardOf [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsStaticSecretDropSym = some (staticSecretDropGhost mpl mmpl)) + (hGuard : ∀ s0 : State, guardOf lsStaticSecretDropSym s0 → staticSecretDropEntryGuard mpl s0) + (hExt : C2ExternTableFacts mpl) + (hRxStaticDrop : checkProgCodeSubslice f3TrialRxProg (staticSecretDropSubProg mpl) = true) + (hResStaticDrop : libsignalSessionLib.resolve mpl lsStaticSecretDropSym = c2StaticSecretDropAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsStaticSecretDropSym + (guardOf lsStaticSecretDropSym) + (staticSecretDropGhost mpl mmpl) := by + have hRow := c2_staticSecretDropGhost_rowOk mpl mmpl PredFs g extra hLook hExt + hRxStaticDrop hResStaticDrop hLs + exact ⟨hRow.1, ghostRowReplayOn_of_guard_imp hRow.2 hGuard⟩ + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.DalekRows diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/DurCst16.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/DurCst16.lean new file mode 100644 index 000000000..47fef68cb --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/DurCst16.lean @@ -0,0 +1,89 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.HookDischarge.RustStd.Common -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts -- proof-setup: allow-public-import + +/-! +# Cutover-2 (`C2`) `SystemTime::duration_since` `.rodata.cst16` Glue (`C2RowLayoutFacts.DurCst16`) + +Supplies GK §19(d) item 3 for `lsDurationSinceSym`: +1. `c2TimePlacedData0_eq_timePlacedData0`: byte identity between `Lib2LayoutFacts.c2TimePlacedData0` + and `VerifiedLibraries.RustStd.timePlacedData0`. +2. `f3CodeInv_roDataAt_timeCst16` and `durationSince_hRo_of_f3CodeInv`: derives the exact `hRo` + premise `∀ u : State, InvS u → RoDataAt u.mem (timeMpl.ρ timeRodataCst16Sym) timePlacedData0` + consumed by `DurationSinceGhostReplays.durationSinceGhost_rowReplayOn` and + `durationSinceGhost_rowOk` from `Lib2LayoutFacts.f3CodeInv_roDataAt_durationSinceCst16` + (`C2RoSliceFacts` remains a hypothesis until T4 swaps to the final C2 ELF). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.DurCst16 + +open Arm64 Arm64.Obj ProofLib.ProgramReflection +open VerifiedLibraries.RustStd (timePlacedData0 timeRodataCst16Sym) +open CryptoVerification.SignalSession (cliElfBytes libsignalSessionLib) +open LibsignalBinary.Proofs.HookDischarge.RustStd.Common (RoDataAt) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics (F3CodeInv) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + (C2RoSliceFacts c2TimePlacedData0 f3CodeInv_roDataAt_durationSinceCst16) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen (c2DurationSinceCst16Addr) + +/-- Canonical byte identity between `Lib2LayoutFacts.c2TimePlacedData0` and + `VerifiedLibraries.RustStd.timePlacedData0` (`1_u128` 16-byte mask). -/ +theorem c2TimePlacedData0_eq_timePlacedData0 : + c2TimePlacedData0 = timePlacedData0 := by + rfl_kernel + +/-- Memory-level `.rodata.cst16` `RoDataAt` bridge from `F3CodeInv` + `LinkedAt cliElfBytes mpl` + for any `timeMpl` resolving `timeRodataCst16Sym` to `c2DurationSinceCst16Addr`. -/ +theorem f3CodeInv_roDataAt_timeCst16 + (hRoSlice : C2RoSliceFacts) + {mpl mmpl timeMpl : Obj.MultiPlacement} {m : Memory} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hRho : timeMpl.ρ timeRodataCst16Sym = c2DurationSinceCst16Addr) + (hInv : F3CodeInv mpl mmpl m) : + RoDataAt m (timeMpl.ρ timeRodataCst16Sym) timePlacedData0 := by + have h0 : RoDataAt m c2DurationSinceCst16Addr c2TimePlacedData0 := + f3CodeInv_roDataAt_durationSinceCst16 hRoSlice hLs hInv + rw [hRho, ← c2TimePlacedData0_eq_timePlacedData0] + exact h0 + +/-- Exact `hRo` premise shape consumed by `DurationSinceGhostReplays.durationSinceGhost_rowReplayOn` + and `durationSinceGhost_rowOk`: + `∀ u : State, InvS u → RoDataAt u.mem (timeMpl.ρ timeRodataCst16Sym) timePlacedData0`. -/ +theorem durationSince_hRo_of_f3CodeInv + (hRoSlice : C2RoSliceFacts) + {mpl mmpl timeMpl : Obj.MultiPlacement} + {InvS : State → Prop} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hRho : timeMpl.ρ timeRodataCst16Sym = c2DurationSinceCst16Addr) + (hInv : ∀ u : State, InvS u → F3CodeInv mpl mmpl u.mem) : + ∀ u : State, InvS u → RoDataAt u.mem (timeMpl.ρ timeRodataCst16Sym) timePlacedData0 := + fun u hu => f3CodeInv_roDataAt_timeCst16 hRoSlice hLs hRho (hInv u hu) + +/-- Specialization of `durationSince_hRo_of_f3CodeInv` when `InvS u` is a conjunction headed by + `F3CodeInv mpl mmpl u.mem`. -/ +theorem durationSince_hRo_f3CodeInv_and + (hRoSlice : C2RoSliceFacts) + {mpl mmpl timeMpl : Obj.MultiPlacement} + {Pred : State → Prop} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hRho : timeMpl.ρ timeRodataCst16Sym = c2DurationSinceCst16Addr) : + ∀ u : State, (F3CodeInv mpl mmpl u.mem ∧ Pred u) → + RoDataAt u.mem (timeMpl.ρ timeRodataCst16Sym) timePlacedData0 := + durationSince_hRo_of_f3CodeInv hRoSlice hLs hRho (fun _ h => h.1) + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.DurCst16 diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/FromUtf8.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/FromUtf8.lean new file mode 100644 index 000000000..9f718ddf3 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/FromUtf8.lean @@ -0,0 +1,435 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8GhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts -- proof-setup: allow-public-import +import ProofLib.ProgramReflection +meta import ProofLib.ProgramReflection + +/-! +# Generic & Cutover-2 (`C2`) `Placeable`, `GhostRowSpecOk`, `RoDataAt`, & Entry-Guard Glue for `core::str::converts::from_utf8` (`C2RowLayoutFacts.FromUtf8`) + +**Checked by Lean. Untrusted (`Role::Proof`).** + +Discharges GK6c §19(d) item 1 (`hpl : fromUtf8Block.Placeable (fromUtf8MplPlacement mpl c2FromUtf8TableAddr relax1)` +for `FromUtf8GhostReplays.fromUtf8Ghost_rowSpecOk`, `fromUtf8MplGhost_rowSpecOk`, +`fromUtf8MplGhost_rowReplayOn`, and `fromUtf8MplGhost_rowOk`) plus the per-row `.rodata` +(`UTF8_CHAR_WIDTH`) and `.text.lib2` hull / startup-`lr` entry-guard obligations with zero hex +literals: + +1. **Generic $O(1)$ `Placeable` check (`checkFromUtf8Placeable`, `fromUtf8Block_placeable_of_check`, + `fromUtf8Block_placeable_of_check_allRelax`):** proves `fromUtf8Block.Placeable (fromUtf8Placement fnBase tbl relax1)` + from 4-byte alignment, 64-bit no-wrap, and `ADRP`/`ADR` range without unfolding `fromUtf8Block.code` + at consumer call sites. When `tbl` lies within `±1 MiB` of `fnBase + 24`, `Placeable` holds + simultaneously for **every** linker relaxation predicate `relax1 : Nat → Bool` (including the + default `fun _ => false` matching the unrelaxed `ADRP + ADD` pair in C2 ELF `50066cbd`). +2. **Concrete C2 `Placeable` & polymorphic-`[LibsignalPlacement]` `GhostRowSpecOk` instances + (`c2_fromUtf8Block_placeable`, `c2_fromUtf8Block_placeable_unrelaxed`, + `c2_fromUtf8Ghost_rowSpecOk`, `c2_fromUtf8MplGhost_rowSpecOk`, + `c2_fromUtf8MplGhost_rowSpecOk_unrelaxed`):** tied to `hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl` + with explicit `hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr`, + discharging `Placeable`, `relax1`, and `c2FromUtf8TableAddr`. +3. **C2 `.rodata` (`UTF8_CHAR_WIDTH`) & `.text.lib2` hull / `fromUtf8EntryGuard` helpers + (`c2CorePlacedData1_eq_corePlacedData1`, `f3CodeInv_roDataAt_coreUtf8Table`, + `c2_fromUtf8_hRo_of_f3CodeInv`, `keepR_fromUtf8Mpl_sub_keepLib2Text`, + `f3FromUtf8EntryGuard_of_startupLr`, `c2FromUtf8EntryGuard_of_resolve`):** ready for direct + assembly into `c2_fromUtf8Ghost_rowOk`. +-/ + +public section + +set_option autoImplicit false + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.FromUtf8 + +open Arm64 Arm64.Obj ProofLib.ProgramReflection +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession (cliElfBytes libsignalSessionLib lsFromUtf8Sym) +open VerifiedLibraries.RustStd (coreFromUtf8Sym corePlacedData1 coreUtf8CharWidthSym) +open LibsignalBinary.Proofs.HookDischarge.RustStd.Common (RoDataAt) +open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer (ExecFrozen) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.FromUtf8RowSpec + (FromUtf8RowSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (GhostRowSpecOk) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8SingleBlock + (fromUtf8Block fromUtf8Block_code_length fromUtf8Placement) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8Ghost (keepFromUtf8Block) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8LrTrap (keepFromUtf8Block_iff) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8GhostReplays + (fromUtf8EntryGuard fromUtf8EntryGuard_iff fromUtf8Ghost fromUtf8Ghost_fromUtf8RowSpec + fromUtf8Ghost_rowSpecOk fromUtf8MplGhost fromUtf8MplGhost_rowSpecOk fromUtf8MplPlacement + keepR_fromUtf8Mpl) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics (F3CodeInv) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + (C2ExternTableFacts C2RoSliceFacts c2CorePlacedData1 f3CodeInv_roDataAt_fromUtf8Table + f3Lib2EntryGuard_of_startupLr f3Lib2_dehookedSym_in_keepLib2Text f3StartupLrVal keepLib2Text) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen + (c2FromUtf8Addr c2FromUtf8TableAddr c2Lib2DehookedSyms c2Lib2TextHi c2Lib2TextLo) + +/-! ## 1. Constant Structural Facts on `fromUtf8Block` -/ + +private theorem fromUtf8Block_align_eq : fromUtf8Block.align = 4 := by + decide +kernel + +private theorem fromUtf8Block_symbols_eq : + fromUtf8Block.symbols = [(coreFromUtf8Sym, 0)] := by + decide +kernel + +private def fromUtf8Reloc0 : RelocEntry := + { off := 20, kind := .adrpHi21, sym := coreUtf8CharWidthSym, addend := 0 } + +private def fromUtf8Reloc1 : RelocEntry := + { off := 24, kind := .addLo12, sym := coreUtf8CharWidthSym, addend := 0 } + +private theorem fromUtf8Block_relocs_eq : + fromUtf8Block.relocs = [fromUtf8Reloc0, fromUtf8Reloc1] := by + decide +kernel + +private theorem lookup_table_symbols_none : + Obj.lookup coreUtf8CharWidthSym [(coreFromUtf8Sym, (0 : Nat))] = none := by + decide +kernel + +private theorem fromUtf8Block_externs_check : + (fromUtf8Block.externs.all fun e => + (Obj.lookup e fromUtf8Block.symbols).isNone && !(e == coreUtf8CharWidthSym)) = true := by + decide +kernel + +private theorem fromUtf8Block_resolve_table (fnBase tbl : BitVec 64) (relax1 : Nat → Bool) : + fromUtf8Block.resolve (fromUtf8Placement fnBase tbl relax1) coreUtf8CharWidthSym = tbl := by + unfold CodeBlock.resolve + rw [fromUtf8Block_symbols_eq, lookup_table_symbols_none] + simp [fromUtf8Placement] + +private theorem fromUtf8Block_relocAt?_some_iff {off : Nat} {r : RelocEntry} : + fromUtf8Block.relocAt? off = some r ↔ + (off = 20 ∧ r = fromUtf8Reloc0) ∨ (off = 24 ∧ r = fromUtf8Reloc1) := by + unfold CodeBlock.relocAt? + rw [fromUtf8Block_relocs_eq] + simp only [List.find?_cons, List.find?_nil, fromUtf8Reloc0, fromUtf8Reloc1] + by_cases h20 : off = 20 + · subst h20 + simp [eq_comm] + · have h20f : (20 == off) = false := beq_false_of_ne (Ne.symm h20) + rw [h20f] + by_cases h24 : off = 24 + · subst h24 + simp [eq_comm] + · have h24f : (24 == off) = false := beq_false_of_ne (Ne.symm h24) + rw [h24f] + simp [h20, h24] + +/-! ## 2. Generic Address-Free $O(1)$ Decidable `Placeable` Check & Soundness -/ + +/-- Pure $O(1)$ decidable side condition for `fromUtf8Block.Placeable (fromUtf8Placement fnBase tbl relax1)`: + - `fnBase` is 4-byte aligned and `[fnBase, fnBase + 624)` does not wrap `2 ^ 64`; + - `tbl` is within `ADRP` range (`±4 GiB` page offset) of `fnBase + 20`; + - when `relax20 = true` (`ADRP + ADD` at `+20/+24` relaxed to `NOP + ADR`), `tbl` is also + within `ADR` range (`±1 MiB`) of `fnBase + 24`. -/ +@[expose] def checkFromUtf8Placeable (fnBase tbl : BitVec 64) + (relax20 : Bool := false) : Bool := + Nat.beq (fnBase.toNat % 4) 0 && + Nat.ble (fnBase.toNat + 624) (2 ^ 64) && + Interned.sInRange (-4294967296) 4294967296 + (pageOf tbl - pageOf (fnBase + BitVec.ofNat 64 20)) && + (!relax20 || + Interned.sInRange (-1048576) 1048576 (tbl - (fnBase + BitVec.ofNat 64 24))) + +/-- Generic soundness of `checkFromUtf8Placeable`: for any `(fnBase, tbl, relax1)` satisfying + `checkFromUtf8Placeable fnBase tbl (relax1 20) = true`, `fromUtf8Block` is `Placeable` at + `fromUtf8Placement fnBase tbl relax1`. -/ +theorem fromUtf8Block_placeable_of_check {fnBase tbl : BitVec 64} + {relax1 : Nat → Bool} + (h : checkFromUtf8Placeable fnBase tbl (relax1 20) = true) : + fromUtf8Block.Placeable (fromUtf8Placement fnBase tbl relax1) := by + unfold checkFromUtf8Placeable at h + simp only [Bool.and_eq_true, Nat.beq_eq, Nat.ble_eq, Bool.or_eq_true, Bool.not_eq_true'] at h + rcases h with ⟨⟨⟨halign, hnowrap⟩, hadrp⟩, hadr_or⟩ + refine + { align_pos := by rw [fromUtf8Block_align_eq]; decide + base_aligned := by rw [fromUtf8Block_align_eq]; exact halign + no_wrap := by rw [fromUtf8Block_code_length]; exact hnowrap + len_aligned := by rw [fromUtf8Block_code_length] + relocs_nodup := by + rw [fromUtf8Block_relocs_eq] + decide + relocs_ok := ?_ + relaxed_ok := ?_ + symbols_ok := ?_ + externs_ok := ?_ } + · intro r hr + rw [fromUtf8Block_relocs_eq, List.mem_cons, List.mem_singleton] at hr + rcases hr with rfl | rfl + · refine ⟨by decide, by rw [fromUtf8Block_code_length]; decide, ?_⟩ + have htgt : + fromUtf8Block.relocTarget (fromUtf8Placement fnBase tbl relax1) 20 fromUtf8Reloc0 = tbl := by + change addSignedAddr + (fromUtf8Block.resolve (fromUtf8Placement fnBase tbl relax1) coreUtf8CharWidthSym) 0 = tbl + rw [fromUtf8Block_resolve_table] + rfl + change AdrpInRange (fnBase + BitVec.ofNat 64 20) + (fromUtf8Block.relocTarget (fromUtf8Placement fnBase tbl relax1) 20 fromUtf8Reloc0) + rw [htgt] + exact Interned.codeRelocInRange_of (kind := .adrpHi21) hadrp + · refine ⟨by decide, by rw [fromUtf8Block_code_length]; decide, ?_⟩ + trivial + · intro off r hrx hrel4 + unfold CodeBlock.relaxedAt at hrx + rw [Bool.and_eq_true] at hrx + rcases hrx with ⟨hrelaxable, hpl_relax⟩ + have hrel0_ex : ∃ r0, fromUtf8Block.relocAt? off = some r0 := by + unfold CodeBlock.relaxableAt at hrelaxable + rcases h0 : fromUtf8Block.relocAt? off with _ | r0 + · simp [h0] at hrelaxable + · exact ⟨r0, rfl⟩ + rcases hrel0_ex with ⟨r0, hrel0⟩ + have h0_cases := (fromUtf8Block_relocAt?_some_iff.mp hrel0) + have h4_cases := (fromUtf8Block_relocAt?_some_iff.mp hrel4) + have hoff20 : off = 20 ∧ r = fromUtf8Reloc1 := by + rcases h0_cases with ⟨rfl, _⟩ | ⟨rfl, _⟩ <;> + rcases h4_cases with ⟨h4, hr⟩ | ⟨h4, hr⟩ <;> + first | exact ⟨rfl, hr⟩ | omega + rcases hoff20 with ⟨rfl, rfl⟩ + have hrel1_true : relax1 20 = true := hpl_relax + rcases hadr_or with hrel1_false | hadr + · cases hrel1_false.symm.trans hrel1_true + · have htgt : + fromUtf8Block.target (fromUtf8Placement fnBase tbl relax1) fromUtf8Reloc1 = tbl := by + change addSignedAddr + (fromUtf8Block.resolve (fromUtf8Placement fnBase tbl relax1) coreUtf8CharWidthSym) 0 = tbl + rw [fromUtf8Block_resolve_table] + rfl + change AdrInRange (fnBase + BitVec.ofNat 64 24) + (fromUtf8Block.target (fromUtf8Placement fnBase tbl relax1) fromUtf8Reloc1) + rw [htgt] + exact Interned.adrInRange_of hadr + · intro s hs + rw [fromUtf8Block_symbols_eq, List.mem_singleton] at hs + subst hs + rw [fromUtf8Block_code_length] + decide + · intro e he + have hall := List.all_eq_true.mp fromUtf8Block_externs_check e he + simp only [Bool.and_eq_true, Option.isNone_iff_eq_none, Bool.not_eq_true'] at hall + refine ⟨hall.1, ?_⟩ + rw [fromUtf8Block_code_length] + have hρ : (fromUtf8Placement fnBase tbl relax1).ρ e = fnBase + BitVec.ofNat 64 4096 := by + change (if e == coreUtf8CharWidthSym then tbl else fnBase + BitVec.ofNat 64 4096) = + fnBase + BitVec.ofNat 64 4096 + rw [hall.2] + rfl + have hbase : (fromUtf8Placement fnBase tbl relax1).base = fnBase := rfl + have hsub : (fnBase + BitVec.ofNat 64 4096) - fnBase = BitVec.ofNat 64 4096 := by + bv_omega + rw [hρ, hbase, hsub] + decide + +/-- When `checkFromUtf8Placeable fnBase tbl true = true` (`tbl` within `±1 MiB` of `fnBase + 24`), + `fromUtf8Block.Placeable (fromUtf8Placement fnBase tbl relax1)` holds universally for **every** + linker relaxation predicate `relax1 : Nat → Bool` (including default `fun _ => false`). -/ +theorem fromUtf8Block_placeable_of_check_allRelax {fnBase tbl : BitVec 64} + (h : checkFromUtf8Placeable fnBase tbl true = true) + (relax1 : Nat → Bool := fun _ => false) : + fromUtf8Block.Placeable (fromUtf8Placement fnBase tbl relax1) := by + apply fromUtf8Block_placeable_of_check + unfold checkFromUtf8Placeable at h ⊢ + simp only [Bool.and_eq_true, Bool.or_eq_true, Bool.not_true, Bool.false_or] at h ⊢ + exact ⟨h.1, Or.inr h.2⟩ + +/-- Unrelaxed (`relax1 = fun _ => false`) specialization requiring only `±4 GiB` `ADRP` range. -/ +theorem fromUtf8Block_placeable_unrelaxed_of_check {fnBase tbl : BitVec 64} + (h : checkFromUtf8Placeable fnBase tbl false = true) : + fromUtf8Block.Placeable (fromUtf8Placement fnBase tbl) := + fromUtf8Block_placeable_of_check (relax1 := fun _ => false) h + +/-- `MultiPlacedLib.resolve`-indexed bridge: reduces `fromUtf8Placement (lib.resolve mpl sym) tbl relax1` + to `checkFromUtf8Placeable fnBase tbl true = true` along `lib.resolve mpl sym = fnBase`. -/ +theorem fromUtf8Block_placeable_of_resolve_eq + (lib : Obj.MultiPlacedLib) (mpl : Obj.MultiPlacement) (sym : String) + {fnBase tbl : BitVec 64} + (hRes : lib.resolve mpl sym = fnBase) + (h : checkFromUtf8Placeable fnBase tbl true = true) + (relax1 : Nat → Bool := fun _ => false) : + fromUtf8Block.Placeable (fromUtf8Placement (lib.resolve mpl sym) tbl relax1) := by + rw [hRes] + exact fromUtf8Block_placeable_of_check_allRelax h relax1 + +/-- Direct wrapper around engine `CodeBlock.checkPlaceable` for `fromUtf8Placement`. -/ +theorem fromUtf8Block_placeable_of_checkPlaceable {fnBase tbl : BitVec 64} + {relax1 : Nat → Bool} + (h : fromUtf8Block.checkPlaceable (fromUtf8Placement fnBase tbl relax1) = true) : + fromUtf8Block.Placeable (fromUtf8Placement fnBase tbl relax1) := + CodeBlock.placeable_of_checkPlaceable h + +/-! ## 3. Concrete Cutover-2 (`C2`) `Placeable` & `GhostRowSpecOk` Discharges -/ + +theorem c2_checkFromUtf8Placeable_ok : + checkFromUtf8Placeable c2FromUtf8Addr c2FromUtf8TableAddr true = true := by + decide +kernel + +/-- Concrete C2 `Placeable` at `(c2FromUtf8Addr, c2FromUtf8TableAddr)` for any `relax1`. -/ +theorem c2_fromUtf8Block_placeable_at_c2Addr {relax1 : Nat → Bool} : + fromUtf8Block.Placeable (fromUtf8Placement c2FromUtf8Addr c2FromUtf8TableAddr relax1) := + fromUtf8Block_placeable_of_check_allRelax c2_checkFromUtf8Placeable_ok relax1 + +/-- **Primary C2 `Placeable` discharge (`GK §19(d)` item 1):** for `mpl` tied to + `libsignalSessionLib.LinkedAt cliElfBytes mpl` resolving `lsFromUtf8Sym` to `c2FromUtf8Addr` + (`C2ResolveFacts` premise) and any `relax1 : Nat → Bool` (including the default + `fun _ => false`), `fromUtf8Block` is `Placeable` at + `fromUtf8MplPlacement mpl c2FromUtf8TableAddr relax1`. -/ +theorem c2_fromUtf8Block_placeable + {mpl : Obj.MultiPlacement} {relax1 : Nat → Bool} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) : + fromUtf8Block.Placeable (fromUtf8MplPlacement mpl c2FromUtf8TableAddr relax1) := by + let _ := hLs + unfold fromUtf8MplPlacement + exact fromUtf8Block_placeable_of_resolve_eq libsignalSessionLib mpl lsFromUtf8Sym + hRes c2_checkFromUtf8Placeable_ok relax1 + +/-- Default-`relax1` (`fun _ => false`) spelling of `c2_fromUtf8Block_placeable`. -/ +theorem c2_fromUtf8Block_placeable_unrelaxed + {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) : + fromUtf8Block.Placeable (fromUtf8MplPlacement mpl c2FromUtf8TableAddr) := + c2_fromUtf8Block_placeable hLs hRes + +/-- `FromUtf8RowSpec` at the C2 placement under `LinkedAt cliElfBytes mpl` + `hRes`. -/ +theorem c2_fromUtf8Ghost_fromUtf8RowSpec + {mpl : Obj.MultiPlacement} {relax1 : Nat → Bool} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) : + FromUtf8RowSpec (fromUtf8Ghost (fromUtf8MplPlacement mpl c2FromUtf8TableAddr relax1)) := + fromUtf8Ghost_fromUtf8RowSpec (c2_fromUtf8Block_placeable hLs hRes) + +/-- Polymorphic-`[LibsignalPlacement]` `GhostRowSpecOk` for `fromUtf8Ghost` at C2. -/ +theorem c2_fromUtf8Ghost_rowSpecOk [LibsignalPlacement] + {mpl : Obj.MultiPlacement} {relax1 : Nat → Bool} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) : + GhostRowSpecOk lsFromUtf8Sym + (fromUtf8Ghost (fromUtf8MplPlacement mpl c2FromUtf8TableAddr relax1)) := + fromUtf8Ghost_rowSpecOk (c2_fromUtf8Block_placeable hLs hRes) + +/-- Polymorphic-`[LibsignalPlacement]` `GhostRowSpecOk` for `fromUtf8MplGhost` at C2. -/ +theorem c2_fromUtf8MplGhost_rowSpecOk [LibsignalPlacement] + {mpl mmpl : Obj.MultiPlacement} {relax1 : Nat → Bool} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) : + GhostRowSpecOk lsFromUtf8Sym (fromUtf8MplGhost mpl mmpl c2FromUtf8TableAddr relax1) := + fromUtf8MplGhost_rowSpecOk mpl mmpl c2FromUtf8TableAddr relax1 + (c2_fromUtf8Block_placeable hLs hRes) + +/-- Default-`relax1` (`fun _ => false`) spelling of `c2_fromUtf8MplGhost_rowSpecOk`. -/ +theorem c2_fromUtf8MplGhost_rowSpecOk_unrelaxed [LibsignalPlacement] + {mpl mmpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) : + GhostRowSpecOk lsFromUtf8Sym (fromUtf8MplGhost mpl mmpl c2FromUtf8TableAddr) := + c2_fromUtf8MplGhost_rowSpecOk hLs hRes + +/-! ## 4. C2 `.rodata` (`UTF8_CHAR_WIDTH`) & `.text.lib2` Hull / Entry-Guard Bridges -/ + +/-- Canonical byte identity between `Lib2LayoutFacts.c2CorePlacedData1` and + `VerifiedLibraries.RustStd.corePlacedData1` (`256`-byte `UTF8_CHAR_WIDTH` table). -/ +theorem c2CorePlacedData1_eq_corePlacedData1 : + c2CorePlacedData1 = corePlacedData1 := by + rfl_kernel + +/-- Memory-level `.rodata` `RoDataAt` bridge at `c2FromUtf8TableAddr` from `F3CodeInv` + + `LinkedAt cliElfBytes mpl` under `C2RoSliceFacts`. -/ +theorem f3CodeInv_roDataAt_coreUtf8Table + (hRoSlice : C2RoSliceFacts) + {mpl mmpl : Obj.MultiPlacement} {m : Memory} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hInv : F3CodeInv mpl mmpl m) : + RoDataAt m c2FromUtf8TableAddr corePlacedData1 := by + have h0 : RoDataAt m c2FromUtf8TableAddr c2CorePlacedData1 := + f3CodeInv_roDataAt_fromUtf8Table hRoSlice hLs hInv + rw [← c2CorePlacedData1_eq_corePlacedData1] + exact h0 + +/-- Exact `hRo` premise shape consumed by `FromUtf8GhostReplays.fromUtf8MplGhost_rowReplayOn` + and `fromUtf8MplGhost_rowOk` at `tbl := c2FromUtf8TableAddr`. -/ +theorem c2_fromUtf8_hRo_of_f3CodeInv + (hRoSlice : C2RoSliceFacts) + {mpl mmpl : Obj.MultiPlacement} + {InvS : State → Prop} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hInv : ∀ u : State, InvS u → F3CodeInv mpl mmpl u.mem) : + ∀ u : State, ExecFrozen u.mem → InvS u → RoDataAt u.mem c2FromUtf8TableAddr corePlacedData1 := + fun u _ hu => f3CodeInv_roDataAt_coreUtf8Table hRoSlice hLs (hInv u hu) + +theorem lsFromUtf8Sym_mem_c2Lib2DehookedSyms : + lsFromUtf8Sym ∈ c2Lib2DehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +private theorem keepLib2Text_of_sub_lt {base pc : BitVec 64} {len : Nat} + (hsub : (pc - base).toNat < len) + (hlo : c2Lib2TextLo.toNat ≤ base.toNat) + (hhi : base.toNat + len ≤ c2Lib2TextHi.toNat) : + keepLib2Text pc = true := by + unfold keepLib2Text + rw [decide_eq_true_eq] + have htop : c2Lib2TextHi.toNat < 2 ^ 64 := BitVec.isLt c2Lib2TextHi + generalize hd : pc - base = d at hsub + have hpc_eq : pc = base + d := by subst hd; bv_omega + have htoNat : pc.toNat = base.toNat + d.toNat := by + rw [hpc_eq, BitVec.toNat_add, Nat.mod_eq_of_lt (by omega)] + omega + +/-- Unconditional C2 hull inclusion for `keepFromUtf8Block c2FromUtf8Addr`. -/ +theorem keepFromUtf8Block_c2_sub_keepLib2Text {pc : BitVec 64} + (h : keepFromUtf8Block c2FromUtf8Addr pc = true) : + keepLib2Text pc = true := by + rw [keepFromUtf8Block_iff] at h + exact keepLib2Text_of_sub_lt h + (decide_eq_true_eq.mp (by rfl_kernel)) + (decide_eq_true_eq.mp (by rfl_kernel)) + +/-- C2 hull inclusion `keepR_fromUtf8Mpl mpl pc = true → keepLib2Text pc = true` for `mpl` tied to + `LinkedAt cliElfBytes mpl` under `hRes`. -/ +theorem keepR_fromUtf8Mpl_sub_keepLib2Text {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) + (pc : BitVec 64) (h : keepR_fromUtf8Mpl mpl pc = true) : + keepLib2Text pc = true := by + let _ := hLs + dsimp only [keepR_fromUtf8Mpl] at h + rw [hRes] at h + exact keepFromUtf8Block_c2_sub_keepLib2Text h + +/-- `fromUtf8EntryGuard mpl s0` from `LinkedAt cliElfBytes mpl` + `C2ExternTableFacts` + `hRes` + + startup `lr`. -/ +theorem f3FromUtf8EntryGuard_of_startupLr {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) + {s0 : State} (hlr : s0.readReg64 .lr = f3StartupLrVal) : + fromUtf8EntryGuard mpl s0 := + (fromUtf8EntryGuard_iff mpl s0).mpr + (f3Lib2EntryGuard_of_startupLr hlr + (f3Lib2_dehookedSym_in_keepLib2Text hExt lsFromUtf8Sym_mem_c2Lib2DehookedSyms) + (keepR_fromUtf8Mpl_sub_keepLib2Text hLs hRes)) + +/-- `C2ExternTableFacts`-free companion for `fromUtf8EntryGuard mpl s0` (`keepLib2Text` on entry + discharged directly from `hRes`). -/ +theorem c2FromUtf8EntryGuard_of_resolve {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) + {s0 : State} (hlr : s0.readReg64 .lr = f3StartupLrVal) : + fromUtf8EntryGuard mpl s0 := by + have hsym : keepLib2Text (libsignalSessionLib.resolve mpl lsFromUtf8Sym) = true := by + rw [hRes]; exact decide_eq_true_eq.mp (by rfl_kernel) + exact (fromUtf8EntryGuard_iff mpl s0).mpr + (f3Lib2EntryGuard_of_startupLr hlr hsym (keepR_fromUtf8Mpl_sub_keepLib2Text hLs hRes)) + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.FromUtf8 diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/FromUtf8Row.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/FromUtf8Row.lean new file mode 100644 index 000000000..4706fc786 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/FromUtf8Row.lean @@ -0,0 +1,372 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.FromUtf8 -- proof-setup: allow-public-import +import ProofLib.ProgramReflection +meta import ProofLib.ProgramReflection + +/-! +# Cutover-2 (`C2`) Full `GhostRowOk` Discharge for `core::str::converts::from_utf8` (`C2RowLayoutFacts.FromUtf8Row`) + +**Checked by Lean. Untrusted (`Role::Proof`).** + +Supplies the full per-row `GhostRowOk` (`GhostRowSpecOk` ∧ `GhostRowReplayOn`) theorem +`c2_fromUtf8MplGhost_rowOk` for `lsFromUtf8Sym` consumed by `ExtraOk` / `ExtraListOk` +(`ExtraGhostReplay.lean:376-386, 437-456`) and `CliGhostA0Hooks.extraOk` +(`CliHookSatPlaced.lean:385`, `ExtraGhostSpecs.lean:313-321`), building directly on +`C2RowLayoutFacts.FromUtf8` in the lightweight `HooksDehook` + `Lib2LayoutFacts` import cone +(`0` `CliStrictPlaced2` / `Cli.Main` imports): + +1. **Consumer conclusions (`§3`):** + - `c2_fromUtf8MplGhost_rowOk`: `GhostRowOk mpl mmpl (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) lsFromUtf8Sym + (fromUtf8EntryGuard mpl) (fromUtf8MplGhost mpl mmpl c2FromUtf8TableAddr)`; + - `c2_fromUtf8MplGhost_rowOk_guardOf`: `guardOf`-adapted form for `ExtraListReplaysOn`; + - `c2_fromUtf8MplGhost_rowOk_startupLr`: `guardOf`-adapted form discharging `fromUtf8EntryGuard mpl` + directly via `FromUtf8.c2FromUtf8EntryGuard_of_resolve` from `s0.readReg64 .lr = f3StartupLrVal` + (`= f3StdLayout.libcStartMainStage2Addr + 56#64`, definitionally equal to `StdMainEntryLr f3StdLayout s0`); + - `c2FromUtf8EntryGuard_of_stage2Lr` / `f3FromUtf8EntryGuard_of_stage2Lr`: direct stage2+56 (`lr`) + corollaries matching `StdMainEntryLr f3StdLayout s0`. +2. **Internal premise discharges (`§2`, `0` hex literals):** + - `hpl`: `FromUtf8.c2_fromUtf8Block_placeable_unrelaxed hLs hRes`; + - `hTargetEq`: `rfl`; + - `hCL`: `c2_fromUtf8_hCL` (`codeLoaded_of_checkProgCodeSubslice` from `(hInv u hu).rxCode` + + `hRxUtf8` + `hRes`); + - `hRo`: `FromUtf8.c2_fromUtf8_hRo_of_f3CodeInv hRoSlice hLs` (keyed to `c2FromUtf8TableAddr`); + - `hInvKeep`: unconditional via `StartupStatics.F3CodeInv.of_keepsFrozen` + `v.fs = u.fs`; + - `hGhostAt`: `c2_fromUtf8_hGhostAt` (`f3RxSeg_ghostProg617_externAt_entry` + + `cliGhostExternsWithExtra_extra_some`); + - `hRealHullNoExt`: `c2_fromUtf8_hRealHullNoExt` (`f3RxSeg_realProg617_externAt_none` + + `keepLib2Text_sub_rxProg` + `FromUtf8.keepR_fromUtf8Mpl_sub_keepLib2Text`); + - `hGhostNoExtNe`: standalone `c2_fromUtf8_hGhostNoExtNe_of_linkedAt` + (`f3Row_ghostProg617_externAt_none_of_ne_entry` + interned extern `ρ` lookup on + `cliElfMultiPlacement` over generated `c2RxDehookedSyms`, holding both pre-T4 and post-T4 + with `0` extra `C2ResolveFacts` premises). +-/ + +public section + +set_option autoImplicit false + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.FromUtf8Row + +open Arm64 Arm64.Obj Arm64.Process ProofLib ProofLib.ProgramReflection ProofLib.StdStartup +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession + (CliHooks cliElfBytes cliExternsPlaced libsignalSessionLib lsFromUtf8Sym) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Heap.Fine (f3StdLayout) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraGhostTable cliGhostExternsWithExtra cliGhostExternsWithExtra_extra_some) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay (GhostRowOk) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8SingleBlock (fromUtf8Placement) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8Ghost (keepFromUtf8Block) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8GhostReplays + (fromUtf8EntryGuard fromUtf8MplGhost fromUtf8MplGhost_rowOk fromUtf8MplPlacement fromUtf8SubProg + ghostRowReplayOn_of_guard_imp keepR_fromUtf8Mpl) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice + (checkProgCodeSubslice codeLoaded_of_checkProgCodeSubslice) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.FromUtf8 + (c2FromUtf8EntryGuard_of_resolve c2_fromUtf8Block_placeable_unrelaxed + c2_fromUtf8_hRo_of_f3CodeInv f3FromUtf8EntryGuard_of_startupLr + keepR_fromUtf8Mpl_sub_keepLib2Text) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesData + (lsPlacedStubPairs lsPlacedStubPairs_eq ls_idsOk ls_sharedExterns_lt) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfPlaced + (cliElfMultiPlacement cliElf_linkedAt_unique lsInternedMultiLib lsSharedExterns + ls_names_nodup ls_toMultiPlacedLib_eq) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Tie (f3TrialRxProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics (F3CodeInv) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + (C2ExternTableFacts C2RoSliceFacts f3Row_ghostProg617_externAt_none_of_ne_entry + f3RxSeg_ghostProg617_externAt_entry f3RxSeg_realProg617_externAt_none f3StartupLrVal + keepLib2Text_sub_rxProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen + (c2FromUtf8Addr c2FromUtf8TableAddr c2RxDehookedSyms) + +/-! ## 1. `hInvKeep` & Fast Interned Extern `ρ` Lookup on `c2RxDehookedSyms` -/ + +-- DUP(RowCommon): unconditional `hInvKeep` on `F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs` +private theorem f3CodeInv_and_fs_hInvKeep (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) : + ∀ u v : State, (F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) → + u.mem.KeepsFrozen v.mem → v.fs = u.fs → + (F3CodeInv mpl mmpl v.mem ∧ PredFs v.fs) := by + intro _ _ ⟨hmem, hfs⟩ hkf hvfs + exact ⟨hmem.of_keepsFrozen hkf, hvfs ▸ hfs⟩ + +-- Fast interned-ID `resolve = cliElfMultiPlacement.ρ` on the 19 symbols in `c2RxDehookedSyms` +-- (via `ElfCodeMatchesData.lsPlacedStubPairs`, never unpacking `GeneratedLean.libsignalSessionExterns`). +private def findStubPosAux (target : String) : List (String × BitVec 64) → Nat → Nat + | [], acc => acc + | (nm, _) :: rest, acc => + if nm == target then acc else findStubPosAux target rest (acc + 1) + +private noncomputable def checkC2RxExternSym (s : String) : Bool := + let pos := findStubPosAux s lsPlacedStubPairs 0 + let idx := lsSharedExterns.getD pos 0 + let pair := lsPlacedStubPairs.getD pos ("", 0#64) + Nat.blt pos lsSharedExterns.length && + (pair.1 == s) && + (Obj.Interned.lookupBlockSymId idx lsInternedMultiLib.blocks == none) + +set_option maxRecDepth 400000 in +private theorem c2RxDehookedSyms_extern_ok : + c2RxDehookedSyms.all checkC2RxExternSym = true := by + rfl_kernel + +private theorem resolve_c2RxSym_eq_cliElf_rho {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + {s : String} (hs : s ∈ c2RxDehookedSyms) : + libsignalSessionLib.resolve mpl s = cliElfMultiPlacement.ρ s := by + have hchk := List.all_eq_true.mp c2RxDehookedSyms_extern_ok s hs + unfold checkC2RxExternSym at hchk + dsimp only at hchk + simp only [Bool.and_eq_true, Nat.blt_eq, beq_iff_eq] at hchk + rcases hchk with ⟨⟨hpos_lt, hpair_fst⟩, hblk_none⟩ + set pos := findStubPosAux s lsPlacedStubPairs 0 + set idx := lsSharedExterns.getD pos 0 + have hidx_eq : idx = lsSharedExterns[pos]'hpos_lt := + Obj.Interned.getD_of_lt hpos_lt + have hidx_lt : idx < lsInternedMultiLib.names.length := by + have hmem_ext : idx ∈ lsSharedExterns := by + rw [hidx_eq] + exact List.getElem_mem hpos_lt + exact Nat.blt_eq.mp (List.all_eq_true.mp ls_sharedExterns_lt idx hmem_ext) + have hname_eq : lsInternedMultiLib.names.getD idx "" = s := by + have hplen : pos < lsPlacedStubPairs.length := by + rw [lsPlacedStubPairs_eq, List.length_map] + exact hpos_lt + have hpair : + lsPlacedStubPairs.getD pos ("", 0#64) = + (lsInternedMultiLib.names.getD idx "", + LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesData.f3LsSymAddrs.getD + idx 0#64) := by + rw [Obj.Interned.getD_of_lt hplen] + simp only [lsPlacedStubPairs_eq, List.getElem_map, ← hidx_eq] + exact (congrArg Prod.fst hpair).symm.trans hpair_fst + have hs_mem : s ∈ lsInternedMultiLib.names := by + rw [← hname_eq, Obj.Interned.getD_of_lt hidx_lt] + exact List.getElem_mem hidx_lt + have hnone : Obj.lookupBlockSym s libsignalSessionLib.blocks = none := by + rw [← hname_eq, ls_toMultiPlacedLib_eq, + Obj.Interned.lookupBlockSym_toMultiPlacedLib ls_names_nodup ls_idsOk hidx_lt] + exact hblk_none + have huniq := (cliElf_linkedAt_unique hLs).2.1 s hs_mem + have hres_rho : libsignalSessionLib.resolve cliElfMultiPlacement s = cliElfMultiPlacement.ρ s := by + unfold MultiPlacedLib.resolve + rw [hnone] + exact huniq.trans hres_rho + +/-! ## 2. Per-Premise C2 `from_utf8` Discharges (`hCL`, `hRealHullNoExt`, `hGhostNoExtNe`, `hGhostAt`) -/ + +private theorem keepR_fromUtf8Mpl_sub_rxProg {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) + (pc : BitVec 64) (h : keepR_fromUtf8Mpl mpl pc = true) : + progKeep f3TrialRxProg pc = true := + keepLib2Text_sub_rxProg (keepR_fromUtf8Mpl_sub_keepLib2Text hLs hRes pc h) + +theorem lsFromUtf8Sym_mem_c2RxDehookedSyms : + lsFromUtf8Sym ∈ c2RxDehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +/-- Every symbol in generated `c2RxDehookedSyms` other than `lsFromUtf8Sym` resolves under + `cliElfMultiPlacement.ρ` outside `keepFromUtf8Block c2FromUtf8Addr` (holds by `rfl_kernel` + both pre-T4 and post-T4). -/ +private theorem c2RxOther_outside_fromUtf8Hull : + ((c2RxDehookedSyms.filter (· != lsFromUtf8Sym)).all fun s => + !(keepFromUtf8Block c2FromUtf8Addr (cliElfMultiPlacement.ρ s))) = true := by + rfl_kernel + +/-- Exact `hCL` premise of `fromUtf8MplGhost_rowOk` at `c2FromUtf8TableAddr` from `F3CodeInv`, + `hRes`, and `hRxUtf8`. -/ +theorem c2_fromUtf8_hCL + (hRxUtf8 : checkProgCodeSubslice f3TrialRxProg + (fromUtf8SubProg (fromUtf8Placement c2FromUtf8Addr c2FromUtf8TableAddr)) = true) + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) + (hInv : ∀ u : State, InvS u → F3CodeInv mpl mmpl u.mem) : + ∀ u : State, InvS u → + (fromUtf8SubProg (fromUtf8MplPlacement mpl c2FromUtf8TableAddr)).CodeLoaded u.mem := by + intro u hu + unfold fromUtf8MplPlacement + rw [hRes] + exact codeLoaded_of_checkProgCodeSubslice (hInv u hu).rxCode hRxUtf8 + +/-- Exact `hRealHullNoExt` premise of `fromUtf8MplGhost_rowOk` from `LinkedAt cliElfBytes mpl`, + `C2ExternTableFacts mpl`, and `hRes`. -/ +theorem c2_fromUtf8_hRealHullNoExt {mpl mmpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) : + ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_fromUtf8Mpl mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := + fun W {_} hkeep => + f3RxSeg_realProg617_externAt_none hExt W (keepR_fromUtf8Mpl_sub_rxProg hLs hRes _ hkeep) + +/-- Standalone `hGhostNoExtNe` discharge for `fromUtf8MplGhost_rowOk` (`cliElf_linkedAt_unique` + + `rfl_kernel` over generated `c2RxDehookedSyms`; `0` extra `C2ResolveFacts` premises). -/ +theorem c2_fromUtf8_hGhostNoExtNe_of_linkedAt {mpl : Obj.MultiPlacement} + (EG : CliHooks → String → Option (State → State)) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) : + ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_fromUtf8Mpl mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsFromUtf8Sym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none := by + intro W pc hkeep hne + refine f3Row_ghostProg617_externAt_none_of_ne_entry hExt EG W + (keepR_fromUtf8Mpl_sub_rxProg hLs hRes) ?_ hkeep hne + intro s hs hs_ne + left + dsimp only [keepR_fromUtf8Mpl] + rw [hRes, resolve_c2RxSym_eq_cliElf_rho hLs hs] + have hmem_filt : s ∈ c2RxDehookedSyms.filter (· != lsFromUtf8Sym) := by + rw [List.mem_filter] + exact ⟨hs, bne_iff_ne.mpr hs_ne⟩ + have hnot := List.all_eq_true.mp c2RxOther_outside_fromUtf8Hull s hmem_filt + simpa using hnot + +/-- Exact `hGhostAt` premise of `fromUtf8MplGhost_rowOk` for `EG := fun W' => + cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')` under `hLook`. -/ +theorem c2_fromUtf8_hGhostAt {mpl mmpl : Obj.MultiPlacement} + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hExt : C2ExternTableFacts mpl) + (hLook : extra.lookup lsFromUtf8Sym = + some (fromUtf8MplGhost mpl mmpl c2FromUtf8TableAddr)) : + ∀ W : CliHooks, + (cliProgExtPlacedAt mpl + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) 617 W).externAt? + (libsignalSessionLib.resolve mpl lsFromUtf8Sym) = + some (fromUtf8MplGhost mpl mmpl c2FromUtf8TableAddr) := by + intro W + rw [f3RxSeg_ghostProg617_externAt_entry hExt _ W lsFromUtf8Sym_mem_c2RxDehookedSyms] + exact cliGhostExternsWithExtra_extra_some g extra (cliExternsPlaced mmpl W) hLook + (by decide +kernel) + +/-! ## 3. Full Cutover-2 `GhostRowOk` & Startup Entry-Guard Discharges -/ + +/-- **Primary Cutover-2 `GhostRowOk` discharge for `lsFromUtf8Sym`:** matches `ExtraOk` / + `ExtraListOk` (`ExtraGhostReplay.lean:376-386, 437-456`) and `CliGhostA0Hooks.extraOk` + (`CliHookSatPlaced.lean:385`, `ExtraGhostSpecs.lean:313-321`) directly at + `InvS := fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs` and + `EG := fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')`. -/ +theorem c2_fromUtf8MplGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsFromUtf8Sym = + some (fromUtf8MplGhost mpl mmpl c2FromUtf8TableAddr)) + (hRoSlice : C2RoSliceFacts) + (hExt : C2ExternTableFacts mpl) + (hRxUtf8 : checkProgCodeSubslice f3TrialRxProg + (fromUtf8SubProg (fromUtf8Placement c2FromUtf8Addr c2FromUtf8TableAddr)) = true) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsFromUtf8Sym + (fromUtf8EntryGuard mpl) + (fromUtf8MplGhost mpl mmpl c2FromUtf8TableAddr) := + fromUtf8MplGhost_rowOk mpl mmpl c2FromUtf8TableAddr (fun _ => false) + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + (c2_fromUtf8Block_placeable_unrelaxed hLs hRes) + (c2_fromUtf8_hCL hRxUtf8 hRes (fun _ h => h.1)) + (c2_fromUtf8_hRo_of_f3CodeInv hRoSlice hLs (fun _ h => h.1)) + (f3CodeInv_and_fs_hInvKeep mpl mmpl PredFs) + (c2_fromUtf8_hGhostAt g extra hExt hLook) + (c2_fromUtf8_hRealHullNoExt hLs hExt hRes) + (c2_fromUtf8_hGhostNoExtNe_of_linkedAt + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) hLs hExt hRes) + +/-- `guardOf`-adapted `GhostRowOk` for direct arm dispatch in `ExtraListReplaysOn` / `ExtraListOk` + (`ExtraGhostReplay.lean:380-386`) when `guardOf lsFromUtf8Sym` implies `fromUtf8EntryGuard mpl`. -/ +theorem c2_fromUtf8MplGhost_rowOk_guardOf [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsFromUtf8Sym = + some (fromUtf8MplGhost mpl mmpl c2FromUtf8TableAddr)) + (hGuard : ∀ s0 : State, guardOf lsFromUtf8Sym s0 → fromUtf8EntryGuard mpl s0) + (hRoSlice : C2RoSliceFacts) + (hExt : C2ExternTableFacts mpl) + (hRxUtf8 : checkProgCodeSubslice f3TrialRxProg + (fromUtf8SubProg (fromUtf8Placement c2FromUtf8Addr c2FromUtf8TableAddr)) = true) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsFromUtf8Sym + (guardOf lsFromUtf8Sym) + (fromUtf8MplGhost mpl mmpl c2FromUtf8TableAddr) := by + have hRow := c2_fromUtf8MplGhost_rowOk mpl mmpl PredFs g extra hLook + hRoSlice hExt hRxUtf8 hRes hLs + exact ⟨hRow.1, ghostRowReplayOn_of_guard_imp hRow.2 hGuard⟩ + +/-- `guardOf`-adapted `GhostRowOk` discharging `fromUtf8EntryGuard mpl` directly via + `FromUtf8.c2FromUtf8EntryGuard_of_resolve` from `s0.readReg64 .lr = f3StartupLrVal` + (`= f3StdLayout.libcStartMainStage2Addr + 56#64`, definitionally equal to + `StdMainEntryLr f3StdLayout s0`). -/ +theorem c2_fromUtf8MplGhost_rowOk_startupLr [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsFromUtf8Sym = + some (fromUtf8MplGhost mpl mmpl c2FromUtf8TableAddr)) + (hGuardLr : ∀ s0 : State, guardOf lsFromUtf8Sym s0 → s0.readReg64 .lr = f3StartupLrVal) + (hRoSlice : C2RoSliceFacts) + (hExt : C2ExternTableFacts mpl) + (hRxUtf8 : checkProgCodeSubslice f3TrialRxProg + (fromUtf8SubProg (fromUtf8Placement c2FromUtf8Addr c2FromUtf8TableAddr)) = true) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsFromUtf8Sym + (guardOf lsFromUtf8Sym) + (fromUtf8MplGhost mpl mmpl c2FromUtf8TableAddr) := + c2_fromUtf8MplGhost_rowOk_guardOf mpl mmpl PredFs guardOf g extra hLook + (fun s0 hg => c2FromUtf8EntryGuard_of_resolve hLs hRes (hGuardLr s0 hg)) + hRoSlice hExt hRxUtf8 hRes hLs + +/-- Block-`617` startup `stage2 + 56` (`StdMainEntryLr f3StdLayout s0`) discharge of + `fromUtf8EntryGuard mpl s0` routing directly through `FromUtf8.c2FromUtf8EntryGuard_of_resolve` + without importing `CliStrictPlaced2`. -/ +theorem c2FromUtf8EntryGuard_of_stage2Lr {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) + {s0 : State} (hlr : s0.readReg64 .lr = f3StdLayout.libcStartMainStage2Addr + 56#64) : + fromUtf8EntryGuard mpl s0 := + c2FromUtf8EntryGuard_of_resolve hLs hRes hlr + +/-- Block-`617` startup `stage2 + 56` (`StdMainEntryLr f3StdLayout s0`) discharge of + `fromUtf8EntryGuard mpl s0` routing through `FromUtf8.f3FromUtf8EntryGuard_of_startupLr` + without importing `CliStrictPlaced2`. -/ +theorem f3FromUtf8EntryGuard_of_stage2Lr {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl lsFromUtf8Sym = c2FromUtf8Addr) + {s0 : State} (hlr : s0.readReg64 .lr = f3StdLayout.libcStartMainStage2Addr + 56#64) : + fromUtf8EntryGuard mpl s0 := + f3FromUtf8EntryGuard_of_startupLr hLs hExt hRes hlr + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.FromUtf8Row diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/LibcRows.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/LibcRows.lean new file mode 100644 index 000000000..113c7532c --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/LibcRows.lean @@ -0,0 +1,353 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Heap.Fine.F3LayoutData -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.RowCommon -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfBcmpEntryGuard -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfStrlenEntryGuard -- proof-setup: allow-public-import +import ProofLib.ProgramReflection +meta import ProofLib.ProgramReflection + +/-! +# Cutover-2 (`C2`) `.text.b_pre` `"strlen"` & `"bcmp"` Full `GhostRowOk` Glue (`C2RowLayoutFacts.LibcRows`) + +**Checked by Lean. Untrusted (`Role::Proof`).** + +Supplies the full Cutover-2 per-row `GhostRowOk` (`GhostRowSpecOk` ∧ `GhostRowReplayOn`) and +Block-`617` startup `StdMainEntryLr` entry-guard discharges for the `.text.b_pre` libc rows +`"strlen"` (`StrlenGhostReplays`, `ElfStrlenEntryGuard`) and `"bcmp"` (`BcmpGhostReplays`, +`ElfBcmpEntryGuard`), consumed by `ExtraOk` / `ExtraListOk` (`ExtraGhostReplay.lean:376-386, +437-456`) and `CliGhostA0Hooks.extraOk` (`CliHookSatPlaced.lean:385`, +`ExtraGhostSpecs.lean:313-321`) with zero hex literals: + +1. **`"strlen"` (`§1`):** + - `c2_strlenGhost_rowOk` and `c2_strlenGhost_rowOk_guardOf` (single `LinkedAt`, polymorphic + `[LibsignalPlacement]`, instantiating cleanly at `mpl := lsmpl`); + - `c2_strlen_hGhostNoExtNe_of_linkedAt` (`RowCommon.resolve_c2RxSym_eq_cliElf_rho` + `rfl_kernel` + over generated `c2RxDehookedSyms`; `0` extra `C2ResolveFacts` premises); + - `c2StrlenEntryGuard_of_stdMainEntryLr`, `c2_extraEntryGuard_strlen_arm`, and + `c2_extraEntryGuard_singleton_strlen` (via `ElfStrlenEntryGuard`). +2. **`"bcmp"` (`§2`):** + - `c2_bcmpGhost_rowOk` and `c2_bcmpGhost_rowOk_guardOf` (single `LinkedAt`, polymorphic + `[LibsignalPlacement]`, instantiating cleanly at `mpl := lsmpl`); + - `c2_bcmp_hGhostNoExtNe_of_linkedAt` (`RowCommon.resolve_c2RxSym_eq_cliElf_rho` + `rfl_kernel` + over generated `c2RxDehookedSyms`; `0` extra `C2ResolveFacts` premises); + - `c2BcmpEntryGuard_of_stdMainEntryLr`, `c2_extraEntryGuard_bcmp_arm`, and + `c2_extraEntryGuard_singleton_bcmp` (via `ElfBcmpEntryGuard`). +-/ + +public section + +set_option autoImplicit false + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.LibcRows + +open Arm64 Arm64.Obj Arm64.Process ProofLib.ProgramReflection +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession (CliHooks cliElfBytes cliExternsPlaced libsignalSessionLib) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Heap.Fine (f3StdLayout) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 (StdMainEntryLr) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpCode (memcmpByteLen) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays + (bcmpEntryGuard bcmpGhost bcmpGhost_rowOk bcmpHullBase bcmpSubProg keepR_bcmp) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpLrTrap + (bcmpHullByteLen keepBcmpHull keepBcmpHull_iff) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice + (checkProgCodeSubslice) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.RowCommon + (c2_ghostAt_of_extraLookup c2_keepTextBPre_of_sub_lt c2_realHullNoExt_of_keepTextBPre + f3CodeInv_and_fs_keepsFrozen f3CodeInv_codeLoaded_of_checkProgCodeSubslice + resolve_c2RxSym_eq_cliElf_rho) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + (ExtraEntryGuard GhostRowOk) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhost + (keepStrlenRange strlenByteLen) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays + (ghostRowReplayOn_of_guard_imp keepR_strlen strlenEntry strlenEntryGuard strlenGhost + strlenGhost_rowOk strlenSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenLrTrap (keepStrlenRange_iff) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraGhostTable cliGhostExternsWithExtra) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfBcmpEntryGuard + (extraEntryGuard_bcmp_arm extraEntryGuard_singleton_bcmp f3BcmpEntryGuard_of_stdMainEntryLr) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfPlaced (cliElfMultiPlacement) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + (C2ExternTableFacts f3Row_ghostProg617_externAt_none_of_ne_entry keepTextBPre + keepTextBPre_startupLr_false keepTextBPre_sub_rxProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics (F3CodeInv) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Tie (f3TrialRxProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfStrlenEntryGuard + (extraEntryGuard_singleton_strlen extraEntryGuard_strlen_arm f3StrlenEntryGuard_of_stdMainEntryLr) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen + (c2BcmpAddr c2RxDehookedSyms c2StrlenAddr c2TextBPreHi c2TextBPreLo) + +/-! ## 1. `"strlen"` (`StrlenGhostReplays` + `ElfStrlenEntryGuard`) -/ + +theorem strlen_mem_c2RxDehookedSyms : + "strlen" ∈ c2RxDehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +/-- `keepR_strlen mpl` (`[resolve mpl "strlen", resolve mpl "strlen" + 88)`) lies inside + `.text.b_pre` (`keepTextBPre`) at the Cutover-2 placement. -/ +theorem keepR_strlen_sub_keepTextBPre {mpl : Obj.MultiPlacement} + (hRes : libsignalSessionLib.resolve mpl "strlen" = c2StrlenAddr) : + ∀ pc : BitVec 64, keepR_strlen mpl pc = true → keepTextBPre pc = true := by + intro pc hkeep + dsimp only [keepR_strlen, strlenEntry] at hkeep + rw [hRes, keepStrlenRange_iff] at hkeep + exact c2_keepTextBPre_of_sub_lt hkeep + (decide_eq_true_eq.mp (by rfl_kernel)) + (decide_eq_true_eq.mp (by rfl_kernel)) + +private theorem c2RxOther_outside_strlen : + ((c2RxDehookedSyms.filter (· != "strlen")).all + (fun s => !(keepStrlenRange c2StrlenAddr (cliElfMultiPlacement.ρ s)))) = true := by + rfl_kernel + +/-- Standalone `hGhostNoExtNe` discharge for `"strlen"` (`cliElf_linkedAt_unique` + `rfl_kernel` + over generated `c2RxDehookedSyms`; `0` extra `C2ResolveFacts` premises). -/ +theorem c2_strlen_hGhostNoExtNe_of_linkedAt + {mpl : Obj.MultiPlacement} + (EG : CliHooks → String → Option (State → State)) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl "strlen" = c2StrlenAddr) : + ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_strlen mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl "strlen" → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none := by + intro W pc hkeep hne + refine f3Row_ghostProg617_externAt_none_of_ne_entry hExt EG W + (fun q hq => keepTextBPre_sub_rxProg (keepR_strlen_sub_keepTextBPre hRes q hq)) + (fun s hs hs_ne => Or.inl ?_) hkeep hne + have hfilt : s ∈ c2RxDehookedSyms.filter (· != "strlen") := + List.mem_filter.mpr ⟨hs, bne_iff_ne.mpr hs_ne⟩ + have hout := List.all_eq_true.mp c2RxOther_outside_strlen s hfilt + simp only [Bool.not_eq_true'] at hout + dsimp only [keepR_strlen, strlenEntry] + rw [hRes, resolve_c2RxSym_eq_cliElf_rho hLs hs] + exact hout + +/-- **Primary Cutover-2 `GhostRowOk` discharge for `"strlen"`** + (`StrlenGhostReplays.strlenGhost_rowOk`). -/ +theorem c2_strlenGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "strlen" = some (strlenGhost mpl mmpl)) + (hExt : C2ExternTableFacts mpl) + (hRx : checkProgCodeSubslice f3TrialRxProg (strlenSubProg mpl) = true) + (hRes : libsignalSessionLib.resolve mpl "strlen" = c2StrlenAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "strlen" + (strlenEntryGuard mpl) + (strlenGhost mpl mmpl) := + strlenGhost_rowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + (f3CodeInv_codeLoaded_of_checkProgCodeSubslice hRx) + (f3CodeInv_and_fs_keepsFrozen mpl mmpl PredFs) + (c2_ghostAt_of_extraLookup hExt g extra strlen_mem_c2RxDehookedSyms (by decide +kernel) hLook) + (c2_realHullNoExt_of_keepTextBPre hExt (keepR_strlen_sub_keepTextBPre hRes)) + (c2_strlen_hGhostNoExtNe_of_linkedAt _ hLs hExt hRes) + +/-- `guardOf`-adapted `GhostRowOk` for `"strlen"`. -/ +theorem c2_strlenGhost_rowOk_guardOf [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "strlen" = some (strlenGhost mpl mmpl)) + (hGuard : ∀ s0 : State, guardOf "strlen" s0 → strlenEntryGuard mpl s0) + (hExt : C2ExternTableFacts mpl) + (hRx : checkProgCodeSubslice f3TrialRxProg (strlenSubProg mpl) = true) + (hRes : libsignalSessionLib.resolve mpl "strlen" = c2StrlenAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "strlen" + (guardOf "strlen") + (strlenGhost mpl mmpl) := by + have hRow := c2_strlenGhost_rowOk mpl mmpl PredFs g extra hLook hExt hRx hRes hLs + exact ⟨hRow.1, ghostRowReplayOn_of_guard_imp hRow.2 hGuard⟩ + +/-- Block-`617` startup `StdMainEntryLr f3StdLayout s0` discharge of `strlenEntryGuard mpl s0` + from `hRes` (routing through `ElfStrlenEntryGuard.f3StrlenEntryGuard_of_stdMainEntryLr`). -/ +theorem c2StrlenEntryGuard_of_stdMainEntryLr + {mpl : Obj.MultiPlacement} + (hRes : libsignalSessionLib.resolve mpl "strlen" = c2StrlenAddr) + {s0 : State} (hlr : StdMainEntryLr f3StdLayout s0) : + strlenEntryGuard mpl s0 := + f3StrlenEntryGuard_of_stdMainEntryLr keepTextBPre hlr + keepTextBPre_startupLr_false + (by rw [hRes]; exact decide_eq_true_eq.mp (by rfl_kernel)) + (keepR_strlen_sub_keepTextBPre hRes) + +/-- Per-arm `"strlen"` `ExtraEntryGuard` discharge at Cutover-2. -/ +theorem c2_extraEntryGuard_strlen_arm + {mpl : Obj.MultiPlacement} {guardOf : String → State → Prop} {s0 : State} + (hRes : libsignalSessionLib.resolve mpl "strlen" = c2StrlenAddr) + (hlr : StdMainEntryLr f3StdLayout s0) + (hGuardEq : guardOf "strlen" s0 ↔ strlenEntryGuard mpl s0) : + guardOf "strlen" s0 := + extraEntryGuard_strlen_arm hGuardEq (c2StrlenEntryGuard_of_stdMainEntryLr hRes hlr) + +/-- Singleton `g.extra = [("strlen", strlenGhost mpl mmpl)]` `ExtraEntryGuard` discharge. -/ +theorem c2_extraEntryGuard_singleton_strlen + {mpl mmpl : Obj.MultiPlacement} {guardOf : String → State → Prop} + {g : CliGhostHooks} {s0 : State} + (hRes : libsignalSessionLib.resolve mpl "strlen" = c2StrlenAddr) + (hlr : StdMainEntryLr f3StdLayout s0) + (hg : g.extra = [("strlen", strlenGhost mpl mmpl)]) + (hGuardEq : guardOf "strlen" s0 ↔ strlenEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := + extraEntryGuard_singleton_strlen hg hGuardEq + (c2StrlenEntryGuard_of_stdMainEntryLr hRes hlr) + +/-! ## 2. `"bcmp"` (`BcmpGhostReplays` + `ElfBcmpEntryGuard`) -/ + +theorem bcmp_mem_c2RxDehookedSyms : + "bcmp" ∈ c2RxDehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +/-- `keepR_bcmp mpl` (`[resolve mpl "bcmp" - 52, resolve mpl "bcmp" + 4)`) lies inside + `.text.b_pre` (`keepTextBPre`) at the Cutover-2 placement. -/ +theorem keepR_bcmp_sub_keepTextBPre {mpl : Obj.MultiPlacement} + (hRes : libsignalSessionLib.resolve mpl "bcmp" = c2BcmpAddr) : + ∀ pc : BitVec 64, keepR_bcmp mpl pc = true → keepTextBPre pc = true := by + intro pc hkeep + dsimp only [keepR_bcmp, bcmpHullBase] at hkeep + rw [hRes, keepBcmpHull_iff] at hkeep + exact c2_keepTextBPre_of_sub_lt hkeep + (decide_eq_true_eq.mp (by rfl_kernel)) + (decide_eq_true_eq.mp (by rfl_kernel)) + +private theorem c2RxOther_outside_bcmp : + ((c2RxDehookedSyms.filter (· != "bcmp")).all + (fun s => !(keepBcmpHull (c2BcmpAddr - memcmpByteLen) (cliElfMultiPlacement.ρ s)))) = true := by + rfl_kernel + +/-- Standalone `hGhostNoExtNe` discharge for `"bcmp"` (`cliElf_linkedAt_unique` + `rfl_kernel` + over generated `c2RxDehookedSyms`; `0` extra `C2ResolveFacts` premises). -/ +theorem c2_bcmp_hGhostNoExtNe_of_linkedAt + {mpl : Obj.MultiPlacement} + (EG : CliHooks → String → Option (State → State)) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hExt : C2ExternTableFacts mpl) + (hRes : libsignalSessionLib.resolve mpl "bcmp" = c2BcmpAddr) : + ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_bcmp mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl "bcmp" → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none := by + intro W pc hkeep hne + refine f3Row_ghostProg617_externAt_none_of_ne_entry hExt EG W + (fun q hq => keepTextBPre_sub_rxProg (keepR_bcmp_sub_keepTextBPre hRes q hq)) + (fun s hs hs_ne => Or.inl ?_) hkeep hne + have hfilt : s ∈ c2RxDehookedSyms.filter (· != "bcmp") := + List.mem_filter.mpr ⟨hs, bne_iff_ne.mpr hs_ne⟩ + have hout := List.all_eq_true.mp c2RxOther_outside_bcmp s hfilt + simp only [Bool.not_eq_true'] at hout + dsimp only [keepR_bcmp, bcmpHullBase] + rw [hRes, resolve_c2RxSym_eq_cliElf_rho hLs hs] + exact hout + +/-- **Primary Cutover-2 `GhostRowOk` discharge for `"bcmp"`** + (`BcmpGhostReplays.bcmpGhost_rowOk`). -/ +theorem c2_bcmpGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "bcmp" = some (bcmpGhost mpl mmpl)) + (hExt : C2ExternTableFacts mpl) + (hRx : checkProgCodeSubslice f3TrialRxProg (bcmpSubProg mpl) = true) + (hRes : libsignalSessionLib.resolve mpl "bcmp" = c2BcmpAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "bcmp" + (bcmpEntryGuard mpl) + (bcmpGhost mpl mmpl) := + bcmpGhost_rowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + (f3CodeInv_codeLoaded_of_checkProgCodeSubslice hRx) + (f3CodeInv_and_fs_keepsFrozen mpl mmpl PredFs) + (c2_ghostAt_of_extraLookup hExt g extra bcmp_mem_c2RxDehookedSyms (by decide +kernel) hLook) + (c2_realHullNoExt_of_keepTextBPre hExt (keepR_bcmp_sub_keepTextBPre hRes)) + (c2_bcmp_hGhostNoExtNe_of_linkedAt _ hLs hExt hRes) + +/-- `guardOf`-adapted `GhostRowOk` for `"bcmp"`. -/ +theorem c2_bcmpGhost_rowOk_guardOf [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "bcmp" = some (bcmpGhost mpl mmpl)) + (hGuard : ∀ s0 : State, guardOf "bcmp" s0 → bcmpEntryGuard mpl s0) + (hExt : C2ExternTableFacts mpl) + (hRx : checkProgCodeSubslice f3TrialRxProg (bcmpSubProg mpl) = true) + (hRes : libsignalSessionLib.resolve mpl "bcmp" = c2BcmpAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "bcmp" + (guardOf "bcmp") + (bcmpGhost mpl mmpl) := by + have hRow := c2_bcmpGhost_rowOk mpl mmpl PredFs g extra hLook hExt hRx hRes hLs + exact ⟨hRow.1, ghostRowReplayOn_of_guard_imp hRow.2 hGuard⟩ + +/-- Block-`617` startup `StdMainEntryLr f3StdLayout s0` discharge of `bcmpEntryGuard mpl s0` + from `hRes` (routing through `ElfBcmpEntryGuard.f3BcmpEntryGuard_of_stdMainEntryLr`). -/ +theorem c2BcmpEntryGuard_of_stdMainEntryLr + {mpl : Obj.MultiPlacement} + (hRes : libsignalSessionLib.resolve mpl "bcmp" = c2BcmpAddr) + {s0 : State} (hlr : StdMainEntryLr f3StdLayout s0) : + bcmpEntryGuard mpl s0 := + f3BcmpEntryGuard_of_stdMainEntryLr keepTextBPre hlr + keepTextBPre_startupLr_false + (by rw [hRes]; exact decide_eq_true_eq.mp (by rfl_kernel)) + (keepR_bcmp_sub_keepTextBPre hRes) + +/-- Per-arm `"bcmp"` `ExtraEntryGuard` discharge at Cutover-2. -/ +theorem c2_extraEntryGuard_bcmp_arm + {mpl : Obj.MultiPlacement} {guardOf : String → State → Prop} {s0 : State} + (hRes : libsignalSessionLib.resolve mpl "bcmp" = c2BcmpAddr) + (hlr : StdMainEntryLr f3StdLayout s0) + (hGuardEq : guardOf "bcmp" s0 ↔ bcmpEntryGuard mpl s0) : + guardOf "bcmp" s0 := + extraEntryGuard_bcmp_arm hGuardEq (c2BcmpEntryGuard_of_stdMainEntryLr hRes hlr) + +/-- Singleton `g.extra = [("bcmp", bcmpGhost mpl mmpl)]` `ExtraEntryGuard` discharge. -/ +theorem c2_extraEntryGuard_singleton_bcmp + {mpl mmpl : Obj.MultiPlacement} {guardOf : String → State → Prop} + {g : CliGhostHooks} {s0 : State} + (hRes : libsignalSessionLib.resolve mpl "bcmp" = c2BcmpAddr) + (hlr : StdMainEntryLr f3StdLayout s0) + (hg : g.extra = [("bcmp", bcmpGhost mpl mmpl)]) + (hGuardEq : guardOf "bcmp" s0 ↔ bcmpEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := + extraEntryGuard_singleton_bcmp hg hGuardEq + (c2BcmpEntryGuard_of_stdMainEntryLr hRes hlr) + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.LibcRows diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/MemmoveRow.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/MemmoveRow.lean new file mode 100644 index 000000000..514b8ce42 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/MemmoveRow.lean @@ -0,0 +1,485 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.RowCommon -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts -- proof-setup: allow-public-import +import ProofLib.ProgramReflection +meta import ProofLib.ProgramReflection + +/-! +# Cutover-2 (`C2`) Full `GhostRowOk` Discharge for `"memmove"` (`C2RowLayoutFacts.MemmoveRow`) + +**Checked by Lean. Untrusted (`Role::Proof`).** + +Supplies the full Cutover-2 per-row `GhostRowOk` (`GhostRowSpecOk` ∧ `GhostRowReplayOn`) theorem +`c2_memmoveGhost_rowOk` (plus `c2_memmoveGhost_rowOk_guardOf`, `c2MemmoveEntryGuard_of_stdMainEntryLr`, +and `f3MemmoveEntryGuard_c2_of_stdMainEntryLr`) for `"memmove"` over the `956` B `.text.b_pre` hull +(`["memmove", "memcpy", "memset"]`), discharging `MemmoveExtraReplays.memmoveGhost_rowOk` +(`MemmoveExtraReplays.lean:546`) with zero hex literals: + +1. **`"memcpy"` / `"memset"` Resolution from `LinkedAt` Alone (`§1`):** + - Both `"memcpy"` and `"memset"` are already at their final `.text.b_pre` addresses + (`wp4MemcpyRealAddr` / `wp4MemsetRealAddr`) in `cliElfMultiPlacement.ρ` pre-T4 as well as + post-T4. Via `RowCommon.resolve_c2RxSym_eq_cliElf_rho`, + `libsignalSessionLib.resolve mpl "memcpy"` and `libsignalSessionLib.resolve mpl "memset"` are + resolved from `hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl` alone (`0` `hResMemcpy` / + `hResMemset` premises), discharging `hMemmoveOff` + (`memmoveEntry mpl = memcpyEntry mpl + bPreMemmoveByteOff`) from `hLs` + `hResMemmove`. +2. **`.text.b_pre` Hull Inclusion & `hGhostOffEntries` (`§2`):** + - `keepR_memmove_sub_keepTextBPre` embeds `keepR_memmove mpl` into `keepTextBPre` (and hence + `progKeep f3TrialRxProg`) from `hLs` alone, discharging `hRealHullNoExt`. + - `c2_memmove_hGhostOffEntries_of_linkedAt` discharges `hGhostOffEntries` via + `Lib2LayoutFacts.f3RowSyms_ghostProg617_externAt_none_of_ne_entries` (`rowSyms := + ["memmove", "memcpy", "memset"]`), `RowCommon.resolve_c2RxSym_eq_cliElf_rho`, and `rfl_kernel` + over the generated `c2RxDehookedSyms`. +3. **Named `g.memcpy` / `g.memset` `TrapHook` & `cliExternsPlaced = none` via `hExt` (`§3`):** + - On the `none` branch (`ElfSlicesPqOomH2KHooks.h2k_ghFixedK`, closed by `Or.inl rfl`), + `cliExternsPlaced mmpl W' "memcpy" = none` and `cliExternsPlaced mmpl W' "memset" = none` are + derived directly from `hExt : C2ExternTableFacts mpl` by equating + `hExt.ghostRxEntry (cliExternsPlaced mmpl) W'` with `hExt.realRxNoExtern mmpl W'` on + `keepTextBPre_sub_rxProg` (valid both pre-T4 and post-T4, never relying on `rfl` on the + pre-T4 37-row `cliExternsPlaced`). + - On the narrow Stage-A `R1` branch (`Or.inr rfl`, consumer-justified by + `NarrowF3R1Witness.f3EmptyMemcpyGhostHookNarrow_master_ok` at `NarrowF3R1Witness.lean:213` and + `NarrowF3R1Witness.f3EmptyMemsetGhostHookNarrow_master_ok` at `NarrowF3R1Witness.lean:149`), + universal-`L` `TrapHook L` holds via `MemmoveLrTrapBase.trapHook_f3EmptyMemcpyGhostHook` + (`MemmoveLrTrapBase.lean:759`) and `MemmoveLrTrapBase.trapHook_f3EmptyMemsetGhostHook` + (`MemmoveLrTrapBase.lean:825`). +-/ + +public section + +set_option autoImplicit false + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.MemmoveRow + +open Arm64 Arm64.Obj Arm64.Process ProofLib ProofLib.ProgramReflection ProofLib.StdStartup +open VerifiedLibraries.Mallocng (mallocngBlockProg) +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession + (CliHooks cliElfBytes cliExternsPlaced libsignalSessionLib lsMemcpySym lsMemsetSym + lsReadFileSym lsReadStdinSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli + lsRustNoAllocShimSymCli lsRustReallocSymCli lsStringCloneSym) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Heap.Fine (f3StdLayout) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 (StdMainEntryLr) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice + (checkProgCodeSubslice codeLoaded_of_checkProgCodeSubslice) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.RowCommon + (c2_keepTextBPre_of_sub_lt f3CodeInv_and_fs_keepsFrozen resolve_c2RxSym_eq_cliElf_rho) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay (GhostRowOk) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyCode + (mallocngBlockProg20_externAt_none mallocngBlockProg20_hasWords) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveCode (bPreMemmoveByteOff) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays + (ghostRowReplayOn_of_guard_imp keepR_memmove memcpyEntry memmoveEntry memmoveEntryGuard + memmoveEntryGuard_iff memmoveGhost memmoveGhost_rowOk memmoveSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveGhost (keepBPreHull) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveLrTrapBase + (trapHook_f3EmptyMemcpyGhostHook trapHook_f3EmptyMemsetGhostHook) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetCode + (mallocngBlockProg21_externAt_none mallocngBlockProg21_hasWords) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness + (f3EmptyMemcpyGhostHookNarrow f3EmptyMemsetGhostHookNarrow) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords (TrapHook) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraGhostTable cliGhostExternsWithExtra cliGhostExternsWithExtra_extra_some) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + (C2ExternTableFacts f3BatchLEntryGuard_of_startupLr f3BatchL_dehookedSym_in_keepTextBPre + f3RowSyms_ghostProg617_externAt_none_of_ne_entries f3RxSeg_realProg617_externAt_none + keepTextBPre keepTextBPre_sub_rxProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics (F3CodeInv) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Tie (f3TrialRxProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfPlaced (cliElfMultiPlacement) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen + (c2BatchLDehookedSyms c2MemmoveAddr c2RxDehookedSyms wp4MemcpyRealAddr wp4MemsetRealAddr) + +/-! ## 1. `c2RxDehookedSyms` Interned `ρ` Resolution & `"memcpy"` / `"memset"` / `hMemmoveOff` -/ + +theorem memmove_mem_c2RxDehookedSyms : "memmove" ∈ c2RxDehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +theorem memcpy_mem_c2RxDehookedSyms : "memcpy" ∈ c2RxDehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +theorem memset_mem_c2RxDehookedSyms : "memset" ∈ c2RxDehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +theorem memmove_mem_c2BatchLDehookedSyms : "memmove" ∈ c2BatchLDehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +/-- `"memcpy"` is already at its final `.text.b_pre` address `wp4MemcpyRealAddr` in + `cliElfMultiPlacement.ρ` both pre-T4 and post-T4 (`0` `hResMemcpy` premise needed). -/ +theorem resolve_memcpy_eq_wp4MemcpyRealAddr {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + libsignalSessionLib.resolve mpl "memcpy" = wp4MemcpyRealAddr := by + rw [resolve_c2RxSym_eq_cliElf_rho hLs memcpy_mem_c2RxDehookedSyms] + exact decide_eq_true_eq.mp (by rfl_kernel) + +/-- `"memset"` is already at its final `.text.b_pre` address `wp4MemsetRealAddr` in + `cliElfMultiPlacement.ρ` both pre-T4 and post-T4 (`0` `hResMemset` premise needed). -/ +theorem resolve_memset_eq_wp4MemsetRealAddr {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + libsignalSessionLib.resolve mpl "memset" = wp4MemsetRealAddr := by + rw [resolve_c2RxSym_eq_cliElf_rho hLs memset_mem_c2RxDehookedSyms] + exact decide_eq_true_eq.mp (by rfl_kernel) + +/-- Exact `hMemmoveOff` premise of `MemmoveExtraReplays.memmoveGhost_rowOk` from `hLs` and + `hResMemmove : libsignalSessionLib.resolve mpl "memmove" = c2MemmoveAddr`. -/ +theorem c2_memmove_hMemmoveOff {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hResMemmove : libsignalSessionLib.resolve mpl "memmove" = c2MemmoveAddr) : + memmoveEntry mpl = memcpyEntry mpl + bPreMemmoveByteOff := by + unfold memmoveEntry memcpyEntry + rw [hResMemmove, resolve_memcpy_eq_wp4MemcpyRealAddr hLs] + exact decide_eq_true_eq.mp (by rfl_kernel) + +/-! ## 2. `.text.b_pre` Hull Inclusion, `hCL`, `hRealHullNoExt`, `hGhostEntry`, & `hGhostOffEntries` -/ + +/-- Hull inclusion `keepR_memmove mpl ⊆ keepTextBPre` from `LinkedAt cliElfBytes mpl` alone. -/ +theorem keepR_memmove_sub_keepTextBPre {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + {pc : BitVec 64} (hk : keepR_memmove mpl pc = true) : + keepTextBPre pc = true := by + unfold keepR_memmove keepBPreHull at hk + rw [memcpyEntry, resolve_memcpy_eq_wp4MemcpyRealAddr hLs, decide_eq_true_eq] at hk + exact c2_keepTextBPre_of_sub_lt hk + (decide_eq_true_eq.mp (by rfl_kernel)) + (decide_eq_true_eq.mp (by rfl_kernel)) + +/-- Hull inclusion `keepR_memmove mpl ⊆ progKeep f3TrialRxProg` from `LinkedAt cliElfBytes mpl`. -/ +theorem keepR_memmove_sub_rxProg {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + {pc : BitVec 64} (hk : keepR_memmove mpl pc = true) : + progKeep f3TrialRxProg pc = true := + keepTextBPre_sub_rxProg (keepR_memmove_sub_keepTextBPre hLs hk) + +/-- Exact `hCL` premise of `memmoveGhost_rowOk` via `CodeSubslice.checkProgCodeSubslice`. -/ +theorem c2_memmove_hCL {mpl mmpl : Obj.MultiPlacement} + (hRxMemmove : checkProgCodeSubslice f3TrialRxProg (memmoveSubProg mpl) = true) + {InvS : State → Prop} + (hInv : ∀ u : State, InvS u → F3CodeInv mpl mmpl u.mem) : + ∀ u : State, InvS u → (memmoveSubProg mpl).CodeLoaded u.mem := + fun u hu => codeLoaded_of_checkProgCodeSubslice (hInv u hu).rxCode hRxMemmove + +/-- Exact `hRealHullNoExt` premise of `memmoveGhost_rowOk` from `LinkedAt` and `C2ExternTableFacts`. -/ +theorem c2_memmove_hRealHullNoExt {mpl mmpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hExt : C2ExternTableFacts mpl) : + ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memmove mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := + fun W {_} hk => f3RxSeg_realProg617_externAt_none hExt W (keepR_memmove_sub_rxProg hLs hk) + +/-- Exact `hGhostEntry` premise of `memmoveGhost_rowOk` over `["memmove", "memcpy", "memset"]`. -/ +theorem c2_memmove_hGhostEntry {mpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (EG : CliHooks → String → Option (State → State)) : + ∀ (W : CliHooks) {sym : String}, + sym ∈ ["memmove", "memcpy", "memset"] → + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl sym) = + EG W sym := by + intro W sym hsym + have hrx : sym ∈ c2RxDehookedSyms := by + simp only [List.mem_cons, List.not_mem_nil, or_false] at hsym + rcases hsym with rfl | rfl | rfl + · exact memmove_mem_c2RxDehookedSyms + · exact memcpy_mem_c2RxDehookedSyms + · exact memset_mem_c2RxDehookedSyms + exact hExt.ghostRxEntry EG W hrx + +/-- Every symbol in generated `c2RxDehookedSyms` outside `["memmove", "memcpy", "memset"]` resolves + under `cliElfMultiPlacement.ρ` outside `keepBPreHull wp4MemcpyRealAddr` (verified by + `rfl_kernel` both pre-T4 and post-T4). -/ +private theorem c2RxOther_outside_memmoveHull : + ((c2RxDehookedSyms.filter (fun s => !(["memmove", "memcpy", "memset"].contains s))).all + (fun s => !(keepBPreHull wp4MemcpyRealAddr (cliElfMultiPlacement.ρ s)))) = true := by + rfl_kernel + +/-- Exact `hGhostOffEntries` premise of `memmoveGhost_rowOk` (`cliElf_linkedAt_unique` + + `rfl_kernel` over generated `c2RxDehookedSyms`; `0` extra `C2ResolveFacts` premises). -/ +theorem c2_memmove_hGhostOffEntries_of_linkedAt {mpl : Obj.MultiPlacement} + (EG : CliHooks → String → Option (State → State)) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hExt : C2ExternTableFacts mpl) : + ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memmove mpl pc = true → + pc ∉ ["memmove", "memcpy", "memset"].map (libsignalSessionLib.resolve mpl) → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none := by + intro W pc hkeep hnotin + refine f3RowSyms_ghostProg617_externAt_none_of_ne_entries hExt EG W + (fun _ hk => keepR_memmove_sub_rxProg hLs hk) ?_ hkeep hnotin + intro s hs hs_notin + left + have hcontains_false : (["memmove", "memcpy", "memset"].contains s) = false := by + cases hc : ["memmove", "memcpy", "memset"].contains s + · rfl + · exact False.elim (hs_notin (List.contains_iff_mem.mp hc)) + have hmem_filt : + s ∈ c2RxDehookedSyms.filter (fun x => !(["memmove", "memcpy", "memset"].contains x)) := + List.mem_filter.mpr ⟨hs, by rw [hcontains_false]; rfl⟩ + have hnot := List.all_eq_true.mp c2RxOther_outside_memmoveHull s hmem_filt + dsimp only [keepR_memmove, memcpyEntry] + rw [resolve_memcpy_eq_wp4MemcpyRealAddr hLs, resolve_c2RxSym_eq_cliElf_rho hLs hs] + simpa using hnot + +/-! ## 3. `cliExternsPlaced = none` via `hExt` & `TrapHook L` on `g.memcpy` / `g.memset` -/ + +/-- Derive `cliExternsPlaced mmpl W "memcpy" = none` directly from `hExt : C2ExternTableFacts mpl` + and `hLs : LinkedAt cliElfBytes mpl` by equating `hExt.ghostRxEntry (cliExternsPlaced mmpl) W` + with `hExt.realRxNoExtern mmpl W` on `keepTextBPre_sub_rxProg` (never unfolding the pre-T4 + 37-row `cliExternsPlaced` definition). -/ +theorem c2_cliExternsPlaced_memcpy_none {mpl : Obj.MultiPlacement} (mmpl : Obj.MultiPlacement) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hExt : C2ExternTableFacts mpl) (W : CliHooks) : + cliExternsPlaced mmpl W "memcpy" = none := by + have hEntry := hExt.ghostRxEntry (cliExternsPlaced mmpl) W memcpy_mem_c2RxDehookedSyms + have hInBPre : keepTextBPre (libsignalSessionLib.resolve mpl "memcpy") = true := by + rw [resolve_memcpy_eq_wp4MemcpyRealAddr hLs] + exact decide_eq_true_eq.mp (by rfl_kernel) + have hReal := hExt.realRxNoExtern mmpl W (keepTextBPre_sub_rxProg hInBPre) + exact hEntry.symm.trans hReal + +/-- Derive `cliExternsPlaced mmpl W "memset" = none` directly from `hExt : C2ExternTableFacts mpl` + and `hLs : LinkedAt cliElfBytes mpl` by equating `hExt.ghostRxEntry (cliExternsPlaced mmpl) W` + with `hExt.realRxNoExtern mmpl W` on `keepTextBPre_sub_rxProg`. -/ +theorem c2_cliExternsPlaced_memset_none {mpl : Obj.MultiPlacement} (mmpl : Obj.MultiPlacement) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hExt : C2ExternTableFacts mpl) (W : CliHooks) : + cliExternsPlaced mmpl W "memset" = none := by + have hEntry := hExt.ghostRxEntry (cliExternsPlaced mmpl) W memset_mem_c2RxDehookedSyms + have hInBPre : keepTextBPre (libsignalSessionLib.resolve mpl "memset") = true := by + rw [resolve_memset_eq_wp4MemsetRealAddr hLs] + exact decide_eq_true_eq.mp (by rfl_kernel) + have hReal := hExt.realRxNoExtern mmpl W (keepTextBPre_sub_rxProg hInBPre) + exact hEntry.symm.trans hReal + +private theorem cliGhostExternsWithExtra_memcpy (g : CliGhostHooks) (extra : ExtraGhostTable) + (baseExt : String → Option (State → State)) : + cliGhostExternsWithExtra g extra baseExt "memcpy" = + match g.memcpy with | some f => some f | none => baseExt "memcpy" := by + unfold cliGhostExternsWithExtra + have h1 : ("memcpy" == lsRustAllocSymCli) = false := by decide + have h2 : ("memcpy" == lsRustDeallocSymCli) = false := by decide + have h3 : ("memcpy" == lsRustReallocSymCli) = false := by decide + have h4 : ("memcpy" == lsRustAllocZeroedSymCli) = false := by decide + have h5 : ("memcpy" == lsRustNoAllocShimSymCli) = false := by decide + have h6 : ("memcpy" == lsStringCloneSym) = false := by decide + have h7 : ("memcpy" == lsReadFileSym) = false := by decide + have h8 : ("memcpy" == lsReadStdinSym) = false := by decide + have h9 : ("memcpy" == lsMemsetSym) = false := by decide + have h10 : ("memcpy" == lsMemcpySym) = true := by decide + simp only [h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, Bool.false_eq_true, ↓reduceIte] + cases g.memcpy <;> rfl + +private theorem cliGhostExternsWithExtra_memset (g : CliGhostHooks) (extra : ExtraGhostTable) + (baseExt : String → Option (State → State)) : + cliGhostExternsWithExtra g extra baseExt "memset" = + match g.memset with | some f => some f | none => baseExt "memset" := by + unfold cliGhostExternsWithExtra + have h1 : ("memset" == lsRustAllocSymCli) = false := by decide + have h2 : ("memset" == lsRustDeallocSymCli) = false := by decide + have h3 : ("memset" == lsRustReallocSymCli) = false := by decide + have h4 : ("memset" == lsRustAllocZeroedSymCli) = false := by decide + have h5 : ("memset" == lsRustNoAllocShimSymCli) = false := by decide + have h6 : ("memset" == lsStringCloneSym) = false := by decide + have h7 : ("memset" == lsReadFileSym) = false := by decide + have h8 : ("memset" == lsReadStdinSym) = false := by decide + have h9 : ("memset" == lsMemsetSym) = true := by decide + simp only [h1, h2, h3, h4, h5, h6, h7, h8, h9, Bool.false_eq_true, ↓reduceIte] + cases g.memset <;> rfl + +/-- Universal-`L` `TrapHook L` for `f3EmptyMemcpyGhostHookNarrow mmpl` via + `MemmoveLrTrapBase.trapHook_f3EmptyMemcpyGhostHook` (`MemmoveLrTrapBase.lean:759`). -/ +theorem trapHook_f3EmptyMemcpyGhostHookNarrow (mmpl : Obj.MultiPlacement) (L : BitVec 64) : + TrapHook L (f3EmptyMemcpyGhostHookNarrow mmpl) := by + unfold f3EmptyMemcpyGhostHookNarrow + exact trapHook_f3EmptyMemcpyGhostHook + (show (mallocngBlockProg mmpl 20 Syscall.standard).svc = Syscall.standard from rfl) + (mallocngBlockProg20_externAt_none mmpl Syscall.standard) + (mallocngBlockProg20_hasWords mmpl Syscall.standard) + L + +/-- Universal-`L` `TrapHook L` for `f3EmptyMemsetGhostHookNarrow mmpl` via + `MemmoveLrTrapBase.trapHook_f3EmptyMemsetGhostHook` (`MemmoveLrTrapBase.lean:825`). -/ +theorem trapHook_f3EmptyMemsetGhostHookNarrow (mmpl : Obj.MultiPlacement) (L : BitVec 64) : + TrapHook L (f3EmptyMemsetGhostHookNarrow mmpl) := by + unfold f3EmptyMemsetGhostHookNarrow + exact trapHook_f3EmptyMemsetGhostHook + (show (mallocngBlockProg mmpl 21 Syscall.standard).svc = Syscall.standard from rfl) + (mallocngBlockProg21_externAt_none mmpl Syscall.standard) + (mallocngBlockProg21_hasWords mmpl Syscall.standard) + L + +/-- Exact `hMemcpyTrap` premise of `memmoveGhost_rowOk` under + `hGMemcpy : g.memcpy = none ∨ g.memcpy = some (f3EmptyMemcpyGhostHookNarrow mmpl)`. -/ +theorem c2_memmove_hMemcpyTrap {mpl mmpl : Obj.MultiPlacement} + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hGMemcpy : g.memcpy = none ∨ g.memcpy = some (f3EmptyMemcpyGhostHookNarrow mmpl)) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hExt : C2ExternTableFacts mpl) : + ∀ (W : CliHooks) (f : State → State), + cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W) "memcpy" = some f → + ∀ L : BitVec 64, TrapHook L f := by + intro W f hSome L + rw [cliGhostExternsWithExtra_memcpy] at hSome + rcases hGMemcpy with hNone | hNarrow + · rw [hNone, c2_cliExternsPlaced_memcpy_none mmpl hLs hExt W] at hSome + cases hSome + · rw [hNarrow] at hSome + cases hSome + exact trapHook_f3EmptyMemcpyGhostHookNarrow mmpl L + +/-- Exact `hMemsetTrap` premise of `memmoveGhost_rowOk` under + `hGMemset : g.memset = none ∨ g.memset = some (f3EmptyMemsetGhostHookNarrow mmpl)`. -/ +theorem c2_memmove_hMemsetTrap {mpl mmpl : Obj.MultiPlacement} + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hGMemset : g.memset = none ∨ g.memset = some (f3EmptyMemsetGhostHookNarrow mmpl)) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hExt : C2ExternTableFacts mpl) : + ∀ (W : CliHooks) (f : State → State), + cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W) "memset" = some f → + ∀ L : BitVec 64, TrapHook L f := by + intro W f hSome L + rw [cliGhostExternsWithExtra_memset] at hSome + rcases hGMemset with hNone | hNarrow + · rw [hNone, c2_cliExternsPlaced_memset_none mmpl hLs hExt W] at hSome + cases hSome + · rw [hNarrow] at hSome + cases hSome + exact trapHook_f3EmptyMemsetGhostHookNarrow mmpl L + +/-- Exact `hMemmoveExt` premise of `memmoveGhost_rowOk` from `hLook`. -/ +theorem c2_memmove_hMemmoveExt {mpl mmpl : Obj.MultiPlacement} + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "memmove" = some (memmoveGhost mpl mmpl)) : + ∀ W : CliHooks, + cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W) "memmove" = none ∨ + cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W) "memmove" = + some (memmoveGhost mpl mmpl) := + fun W => Or.inr (cliGhostExternsWithExtra_extra_some g extra (cliExternsPlaced mmpl W) hLook + (by decide +kernel)) + +/-! ## 4. Full Cutover-2 `GhostRowOk` & Block-`617` Startup Entry-Guard Discharges -/ + +/-- **Primary Cutover-2 `GhostRowOk` discharge for `"memmove"`** + (`MemmoveExtraReplays.memmoveGhost_rowOk`, `MemmoveExtraReplays.lean:546`), instantiating + cleanly at `mpl := lsmpl` with a single `hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl`. + + **GK6c `hGMemcpy` / `hGMemset` & `cliExternsPlaced` notes:** + - (a) Concrete `g` closing terms: + * Stage-B `H2K` (`ElfSlicesPqOomH2KHooks.h2k_ghFixedK`, `g.memcpy = none`, + `g.memset = none`): close `hGMemcpy` and `hGMemset` by `Or.inl rfl`. + * Stage-A `R1` (`ElfSlicesPqOomPlacedInst.hole2_ghFixed`, installing + `f3EmptyMemcpyGhostHookNarrow mmpl` and `f3EmptyMemsetGhostHookNarrow mmpl`): close + `hGMemcpy` and `hGMemset` by `Or.inr rfl`. + - (b) Stage-A `R1` narrow-hook consumer & `TrapHook` justifications: + * Consumer `HookOk` contracts: `NarrowF3R1Witness.f3EmptyMemcpyGhostHookNarrow_master_ok` + (`NarrowF3R1Witness.lean:213`) and + `NarrowF3R1Witness.f3EmptyMemsetGhostHookNarrow_master_ok` (`NarrowF3R1Witness.lean:149`). + * Universal-`L` `TrapHook L` contracts: `MemmoveLrTrapBase.trapHook_f3EmptyMemcpyGhostHook` + (`MemmoveLrTrapBase.lean:759`) and `MemmoveLrTrapBase.trapHook_f3EmptyMemsetGhostHook` + (`MemmoveLrTrapBase.lean:825`). + - (c) Base-table `cliExternsPlaced mmpl W' "memcpy" = none` and + `cliExternsPlaced mmpl W' "memset" = none` (`c2_cliExternsPlaced_memcpy_none` / + `c2_cliExternsPlaced_memset_none`): derived from `hExt : C2ExternTableFacts mpl` (and `hLs`) + by equating `hExt.ghostRxEntry (cliExternsPlaced mmpl) W'` with + `hExt.realRxNoExtern mmpl W'` on `keepTextBPre_sub_rxProg` (reflecting that `"memcpy"` and + `"memset"` are dehooked in C2's 27-row table, never unfolding pre-T4's 37-row table). -/ +theorem c2_memmoveGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "memmove" = some (memmoveGhost mpl mmpl)) + (hGMemcpy : g.memcpy = none ∨ g.memcpy = some (f3EmptyMemcpyGhostHookNarrow mmpl)) + (hGMemset : g.memset = none ∨ g.memset = some (f3EmptyMemsetGhostHookNarrow mmpl)) + (hExt : C2ExternTableFacts mpl) + (hRxMemmove : checkProgCodeSubslice f3TrialRxProg (memmoveSubProg mpl) = true) + (hResMemmove : libsignalSessionLib.resolve mpl "memmove" = c2MemmoveAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "memmove" + (memmoveEntryGuard mpl) + (memmoveGhost mpl mmpl) := + memmoveGhost_rowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + (c2_memmove_hMemmoveOff hLs hResMemmove) + (c2_memmove_hCL hRxMemmove (fun _ h => h.1)) + (f3CodeInv_and_fs_keepsFrozen mpl mmpl PredFs) + (c2_memmove_hRealHullNoExt hLs hExt) + (c2_memmove_hGhostOffEntries_of_linkedAt + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) hLs hExt) + (c2_memmove_hGhostEntry hExt + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W'))) + (c2_memmove_hMemmoveExt g extra hLook) + (c2_memmove_hMemcpyTrap g extra hGMemcpy hLs hExt) + (c2_memmove_hMemsetTrap g extra hGMemset hLs hExt) + +/-- `guardOf`-adapted `GhostRowOk` for direct `"memmove"` arm dispatch in `ExtraListReplaysOn` / + `ExtraListOk` (`ExtraGhostReplay.lean:380-386`) when `guardOf "memmove"` implies + `memmoveEntryGuard mpl`. -/ +theorem c2_memmoveGhost_rowOk_guardOf [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "memmove" = some (memmoveGhost mpl mmpl)) + (hGuard : ∀ s0 : State, guardOf "memmove" s0 → memmoveEntryGuard mpl s0) + (hGMemcpy : g.memcpy = none ∨ g.memcpy = some (f3EmptyMemcpyGhostHookNarrow mmpl)) + (hGMemset : g.memset = none ∨ g.memset = some (f3EmptyMemsetGhostHookNarrow mmpl)) + (hExt : C2ExternTableFacts mpl) + (hRxMemmove : checkProgCodeSubslice f3TrialRxProg (memmoveSubProg mpl) = true) + (hResMemmove : libsignalSessionLib.resolve mpl "memmove" = c2MemmoveAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "memmove" + (guardOf "memmove") + (memmoveGhost mpl mmpl) := by + have hRow := c2_memmoveGhost_rowOk mpl mmpl PredFs g extra hLook hGMemcpy hGMemset + hExt hRxMemmove hResMemmove hLs + exact ⟨hRow.1, ghostRowReplayOn_of_guard_imp hRow.2 hGuard⟩ + +/-- Block-`617` startup `StdMainEntryLr f3StdLayout s0` discharge of `memmoveEntryGuard mpl s0` + from `hLs` and `hResMemmove : libsignalSessionLib.resolve mpl "memmove" = c2MemmoveAddr` + (routing through `Lib2LayoutFacts.f3BatchLEntryGuard_of_startupLr`). -/ +theorem c2MemmoveEntryGuard_of_stdMainEntryLr {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hResMemmove : libsignalSessionLib.resolve mpl "memmove" = c2MemmoveAddr) + {s0 : State} (hlr : StdMainEntryLr f3StdLayout s0) : + memmoveEntryGuard mpl s0 := by + have hSymIn : keepTextBPre (libsignalSessionLib.resolve mpl "memmove") = true := by + rw [hResMemmove] + exact decide_eq_true_eq.mp (by rfl_kernel) + exact (memmoveEntryGuard_iff mpl s0).mpr + (f3BatchLEntryGuard_of_startupLr hlr hSymIn (fun _ hk => keepR_memmove_sub_keepTextBPre hLs hk)) + +/-- Block-`617` startup `StdMainEntryLr f3StdLayout s0` discharge of `memmoveEntryGuard mpl s0` + from `hLs` and `hExt : C2ExternTableFacts mpl` (via `f3BatchL_dehookedSym_in_keepTextBPre`). -/ +theorem f3MemmoveEntryGuard_c2_of_stdMainEntryLr {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hExt : C2ExternTableFacts mpl) + {s0 : State} (hlr : StdMainEntryLr f3StdLayout s0) : + memmoveEntryGuard mpl s0 := + (memmoveEntryGuard_iff mpl s0).mpr + (f3BatchLEntryGuard_of_startupLr hlr + (f3BatchL_dehookedSym_in_keepTextBPre hExt memmove_mem_c2BatchLDehookedSyms) + (fun _ hk => keepR_memmove_sub_keepTextBPre hLs hk)) + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.MemmoveRow diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/MemrchrRow.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/MemrchrRow.lean new file mode 100644 index 000000000..b0e9108b5 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/MemrchrRow.lean @@ -0,0 +1,160 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Heap.Fine.F3LayoutData -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.RowCommon -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrExtraReplays -- proof-setup: allow-public-import + +/-! +# Cutover-2 (`C2`) `memrchr` `.text.lib2` Per-Row `GhostRowOk` Glue (`C2RowLayoutFacts.MemrchrRow`) + +Discharges the per-row `GhostRowOk` obligations at the Cutover-2 placement (`mpl := lsmpl`) for +Route-`R0` (`withLsRet`) `lsMemrchrSym` (`MemrchrExtraReplays.memrchrGhost_rowOk`). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.MemrchrRow + +open Arm64 Arm64.Obj +open CryptoVerification (LibsignalPlacement lsmpl) +open CryptoVerification.SignalSession (CliHooks cliElfBytes libsignalSessionLib lsMemrchrSym) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Heap.Fine (f3StdLayout) +open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (LsRetAddr624) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 (StdMainEntryLr) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.RowCommon + (c2_keepLib2Text_of_sub_lt c2_realHullNoExt_of_keepLib2Text checkProgCodeSubslice + f3CodeInv_and_fs_keepsFrozen f3CodeInv_codeLoaded_of_checkProgCodeSubslice) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + (ExtraEntryGuard GhostRowOk GhostRowReplayOn) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrExtraReplays + (extraEntryGuard_memrchr_arm extraEntryGuard_singleton_memrchr keepR_memrchr + keepR_memrchr_entry memrchrEntryGuard memrchrGhost memrchrGhost_rowOk + memrchrHullByteLen memrchrSubProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + (C2ExternTableFacts f3LsRetAddr624_rxRegion_guard keepLib2Text) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics (F3CodeInv) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Tie (f3TrialRxProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen + (c2Lib2TextHi c2Lib2TextLo c2MemrchrAddr) + +/-! ## 1. Hull Inclusion & Caller `LsRetAddr624` Guard -/ + +/-- `keepR_memrchr mpl` (`[resolve mpl lsMemrchrSym, resolve mpl lsMemrchrSym + 260)`) lies inside + `.text.lib2` (`keepLib2Text`) at the Cutover-2 placement. -/ +theorem keepR_memrchr_sub_keepLib2Text {mpl : Obj.MultiPlacement} + (hResMemrchr : libsignalSessionLib.resolve mpl lsMemrchrSym = c2MemrchrAddr) : + ∀ pc : BitVec 64, keepR_memrchr mpl pc = true → keepLib2Text pc = true := by + intro pc hkeep + unfold keepR_memrchr at hkeep + rw [hResMemrchr, decide_eq_true_eq] at hkeep + exact c2_keepLib2Text_of_sub_lt hkeep + (by decide : c2Lib2TextLo.toNat ≤ c2MemrchrAddr.toNat) + (by decide : c2MemrchrAddr.toNat + memrchrHullByteLen ≤ c2Lib2TextHi.toNat) + +/-- Every crate return address `LsRetAddr624 lr` lies outside `keepR_memrchr lsmpl` at Cutover-2. -/ +theorem c2_memrchr_hKeep [LibsignalPlacement] + (hResMemrchr : libsignalSessionLib.resolve lsmpl lsMemrchrSym = c2MemrchrAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + ∀ lr : BitVec 64, LsRetAddr624 lr → keepR_memrchr lsmpl lr = false := + fun _ hRet => + (f3LsRetAddr624_rxRegion_guard hLs hRet + (Or.inr (keepR_memrchr_sub_keepLib2Text hResMemrchr _ (keepR_memrchr_entry lsmpl))) + (fun pc hpc => Or.inr (keepR_memrchr_sub_keepLib2Text hResMemrchr pc hpc))).1 + +/-! ## 2. Per-Row `GhostRowOk` Glue (`mpl := lsmpl`, Single `LinkedAt`) -/ + +private theorem ghostRowReplayOn_of_guard_imp + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + {EG : CliHooks → String → Option (State → State)} + {sym : String} {entryGuard guard' : State → Prop} {f : State → State} + (hRow : GhostRowReplayOn mpl mmpl InvS EG sym entryGuard f) + (hImp : ∀ s0 : State, guard' s0 → entryGuard s0) : + GhostRowReplayOn mpl mmpl InvS EG sym guard' f where + preserves_execFrozen := hRow.preserves_execFrozen + replay_at_stub := fun W s0 sf hG hRet hNoEx hNHalt => + hRow.replay_at_stub W s0 sf (hImp s0 hG) hRet hNoEx hNHalt + +/-- Cutover-2 `GhostRowOk` discharge for Route-`R0` `lsMemrchrSym` at `mpl := lsmpl` + (`MemrchrExtraReplays.memrchrGhost_rowOk`), polymorphic in `EG` with a single `LinkedAt` + hypothesis `hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl`. -/ +theorem c2_memrchrGhost_rowOk [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (EG : CliHooks → String → Option (State → State)) + (hExt : C2ExternTableFacts lsmpl) + (hRxMemrchr : checkProgCodeSubslice f3TrialRxProg (memrchrSubProg lsmpl) = true) + (hResMemrchr : libsignalSessionLib.resolve lsmpl lsMemrchrSym = c2MemrchrAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + EG + lsMemrchrSym + (memrchrEntryGuard lsmpl) + (memrchrGhost lsmpl mmpl) := + memrchrGhost_rowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + EG + (f3CodeInv_codeLoaded_of_checkProgCodeSubslice hRxMemrchr) + (f3CodeInv_and_fs_keepsFrozen lsmpl mmpl PredFs) + (c2_memrchr_hKeep hResMemrchr hLs) + (c2_realHullNoExt_of_keepLib2Text hExt (keepR_memrchr_sub_keepLib2Text hResMemrchr)) + +/-- `guardOf`-adapted `GhostRowOk` for `lsMemrchrSym` at `mpl := lsmpl`. -/ +theorem c2_memrchrGhost_rowOk_guardOf [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hGuard : ∀ s0 : State, guardOf lsMemrchrSym s0 → memrchrEntryGuard lsmpl s0) + (hExt : C2ExternTableFacts lsmpl) + (hRxMemrchr : checkProgCodeSubslice f3TrialRxProg (memrchrSubProg lsmpl) = true) + (hResMemrchr : libsignalSessionLib.resolve lsmpl lsMemrchrSym = c2MemrchrAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + EG + lsMemrchrSym + (guardOf lsMemrchrSym) + (memrchrGhost lsmpl mmpl) := by + have hRow := c2_memrchrGhost_rowOk mmpl PredFs EG hExt hRxMemrchr hResMemrchr hLs + exact ⟨hRow.1, ghostRowReplayOn_of_guard_imp hRow.2 hGuard⟩ + +/-! ## 3. Startup Entry-Guard Dischargers -/ + +/-- Trivial startup `StdMainEntryLr` discharge of `memrchrEntryGuard mpl s0` (`True`). -/ +theorem c2MemrchrEntryGuard_of_stdMainEntryLr + {mpl : Obj.MultiPlacement} {s0 : State} + (_hlr : StdMainEntryLr f3StdLayout s0) : + memrchrEntryGuard mpl s0 := + trivial + +/-- Per-arm `lsMemrchrSym` `ExtraEntryGuard` discharge at Cutover-2. -/ +theorem c2_extraEntryGuard_memrchr_arm + {mpl : Obj.MultiPlacement} {guardOf : String → State → Prop} {s0 : State} + (hGuardEq : guardOf lsMemrchrSym s0 ↔ memrchrEntryGuard mpl s0) : + guardOf lsMemrchrSym s0 := + extraEntryGuard_memrchr_arm hGuardEq + +/-- Singleton `g.extra = [(lsMemrchrSym, memrchrGhost mpl mmpl)]` `ExtraEntryGuard` discharge. -/ +theorem c2_extraEntryGuard_singleton_memrchr [LibsignalPlacement] + {mpl mmpl : Obj.MultiPlacement} {guardOf : String → State → Prop} + {g : CliGhostHooks} {s0 : State} + (hg : g.extra = [(lsMemrchrSym, memrchrGhost mpl mmpl)]) + (hGuardEq : guardOf lsMemrchrSym s0 ↔ memrchrEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := + extraEntryGuard_singleton_memrchr hg hGuardEq + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.MemrchrRow diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/RowCommon.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/RowCommon.lean new file mode 100644 index 000000000..445d4cf7e --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/RowCommon.lean @@ -0,0 +1,218 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts -- proof-setup: allow-public-import + +/-! +# Shared Cutover-2 (`C2`) Premise Dischargers (`C2RowLayoutFacts.RowCommon`) + +Generic layout-independent dischargers shared across per-row C2 `GhostRowOk` glue modules: +1. `checkProgCodeSubslice` and `codeLoaded_of_checkProgCodeSubslice` / + `f3CodeInv_codeLoaded_of_checkProgCodeSubslice` (`hCL`). +2. `f3CodeInv_and_fs_keepsFrozen` (`hInvKeep` on `fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs`). +3. `c2_ghostAt_of_extraLookup` (`hGhostAt` on `cliGhostExternsWithExtra` via + `C2ExternTableFacts.ghostRxEntry`). +4. `c2_realHullNoExt_of_keepLib2Text` / `c2_realHullNoExt_of_keepTextBPre` (`hRealHullNoExt`). +5. `c2_keepLib2Text_of_sub_lt` / `c2_keepTextBPre_of_sub_lt` (interval hull inclusions). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.RowCommon + +open Arm64 Arm64.Obj Arm64.Process ProofLib.ProgramReflection +open CryptoVerification (libsignalSessionExterns) +open CryptoVerification.SignalSession (CliHooks cliElfBytes cliExternsPlaced libsignalSessionLib) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice + (checkProgCodeSubslice codeLoaded_of_checkProgCodeSubslice rxSubslice_of_checkProgCodeSubslice) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesData (ls_idsOk) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfPlaced + (cliElfMultiPlacement cliElf_linkedAt_unique lsInternedMultiLib lsSharedExterns + ls_names_nodup ls_toMultiPlacedLib_eq) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics (F3CodeInv) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraGhostTable cliExtraGhostSyms cliGhostExternsWithExtra cliGhostExternsWithExtra_extra_some) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + (C2ExternTableFacts f3RxSeg_ghostProg617_externAt_entry f3RxSeg_realProg617_externAt_none + keepLib2Text keepLib2Text_sub_rxProg keepTextBPre keepTextBPre_sub_rxProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Tie (f3TrialRxProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen + (c2Lib2TextHi c2Lib2TextLo c2RxDehookedSyms c2TextBPreHi c2TextBPreLo) + +/-! ## 1. `hCL` Dischargers (via `C2RowLayoutFacts.CodeSubslice`) -/ + +export LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice + (checkProgCodeSubslice rxSubslice_of_checkProgCodeSubslice codeLoaded_of_checkProgCodeSubslice) + +/-- Discharge `hCL` on `InvS := fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs` from + `checkProgCodeSubslice f3TrialRxProg subProg = true`. -/ +theorem f3CodeInv_codeLoaded_of_checkProgCodeSubslice + {mpl mmpl : Obj.MultiPlacement} {PredFs : FsState → Prop} {subProg : Program} + (hSub : checkProgCodeSubslice f3TrialRxProg subProg = true) : + ∀ u : State, (F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) → subProg.CodeLoaded u.mem := + fun _ ⟨hCode, _⟩ => codeLoaded_of_checkProgCodeSubslice hCode.rxCode hSub + +/-- Pure-memory `hCL` companion on `InvS := fun u => F3CodeInv mpl mmpl u.mem`. -/ +theorem f3CodeInv_memOnly_codeLoaded_of_checkProgCodeSubslice + {mpl mmpl : Obj.MultiPlacement} {subProg : Program} + (hSub : checkProgCodeSubslice f3TrialRxProg subProg = true) : + ∀ u : State, F3CodeInv mpl mmpl u.mem → subProg.CodeLoaded u.mem := + fun _ hCode => codeLoaded_of_checkProgCodeSubslice hCode.rxCode hSub + +/-! ## 2. `hInvKeep` Dischargers on `F3CodeInv ∧ PredFs` and `F3CodeInv` -/ + +/-- Unconditional `KeepsFrozen` + `fs`-preservation lift for + `fun u : State => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs`. -/ +theorem f3CodeInv_and_fs_keepsFrozen + (mpl mmpl : Obj.MultiPlacement) (PredFs : FsState → Prop) : + ∀ u v : State, + (F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) → + u.mem.KeepsFrozen v.mem → + v.fs = u.fs → + (F3CodeInv mpl mmpl v.mem ∧ PredFs v.fs) := + fun _ _ ⟨hCode, hFs⟩ hkf hfs => ⟨F3CodeInv.of_keepsFrozen hCode hkf, hfs ▸ hFs⟩ + +/-- Unconditional `KeepsFrozen` lift for `fun u : State => F3CodeInv mpl mmpl u.mem`. -/ +theorem f3CodeInv_memOnly_keepsFrozen + (mpl mmpl : Obj.MultiPlacement) : + ∀ u v : State, + F3CodeInv mpl mmpl u.mem → + u.mem.KeepsFrozen v.mem → + v.fs = u.fs → + F3CodeInv mpl mmpl v.mem := + fun _ _ hCode hkf _ => F3CodeInv.of_keepsFrozen hCode hkf + +/-! ## 3. `hGhostAt` Discharger on `cliGhostExternsWithExtra` -/ + +/-- Discharge `hGhostAt` on `EG := fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')` + from `C2ExternTableFacts mpl` and `extra.lookup sym = some f`. -/ +theorem c2_ghostAt_of_extraLookup + {mpl mmpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (g : CliGhostHooks) (extra : ExtraGhostTable) + {sym : String} {f : State → State} + (hSymRx : sym ∈ c2RxDehookedSyms) + (hSymDom : cliExtraGhostSyms.contains sym = true) + (hLook : extra.lookup sym = some f) : + ∀ W : CliHooks, + (cliProgExtPlacedAt mpl + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) 617 W).externAt? + (libsignalSessionLib.resolve mpl sym) = some f := by + intro W + rw [f3RxSeg_ghostProg617_externAt_entry hExt _ W hSymRx] + exact cliGhostExternsWithExtra_extra_some g extra (cliExternsPlaced mmpl W) hLook hSymDom + +/-! ## 4. `hRealHullNoExt` Dischargers -/ + +/-- Discharge `hRealHullNoExt` for any `.text.lib2` hull `keepR ⊆ keepLib2Text`. -/ +theorem c2_realHullNoExt_of_keepLib2Text + {mpl mmpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + {keepR : BitVec 64 → Bool} + (hSub : ∀ pc : BitVec 64, keepR pc = true → keepLib2Text pc = true) : + ∀ (W : CliHooks) {pc : BitVec 64}, + keepR pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := + fun W {pc} hk => + f3RxSeg_realProg617_externAt_none hExt W (keepLib2Text_sub_rxProg (hSub pc hk)) + +/-- Discharge `hRealHullNoExt` for any `.text.b_pre` hull `keepR ⊆ keepTextBPre`. -/ +theorem c2_realHullNoExt_of_keepTextBPre + {mpl mmpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + {keepR : BitVec 64 → Bool} + (hSub : ∀ pc : BitVec 64, keepR pc = true → keepTextBPre pc = true) : + ∀ (W : CliHooks) {pc : BitVec 64}, + keepR pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := + fun W {pc} hk => + f3RxSeg_realProg617_externAt_none hExt W (keepTextBPre_sub_rxProg (hSub pc hk)) + +/-! ## 5. Interval Hull Inclusions into `keepLib2Text` and `keepTextBPre` -/ + +theorem c2_keepLib2Text_of_sub_lt {base pc : BitVec 64} {len : Nat} + (hsub : (pc - base).toNat < len) + (hlo : c2Lib2TextLo.toNat ≤ base.toNat) + (hhi : base.toNat + len ≤ c2Lib2TextHi.toNat) : + keepLib2Text pc = true := by + unfold keepLib2Text + rw [decide_eq_true_eq] + have htop : c2Lib2TextHi.toNat < 2 ^ 64 := BitVec.isLt c2Lib2TextHi + generalize hd : pc - base = d at hsub + have hpc_eq : pc = base + d := by subst hd; bv_omega + have htoNat : pc.toNat = base.toNat + d.toNat := by + rw [hpc_eq, BitVec.toNat_add, Nat.mod_eq_of_lt (by omega)] + omega + +theorem c2_keepTextBPre_of_sub_lt {base pc : BitVec 64} {len : Nat} + (hsub : (pc - base).toNat < len) + (hlo : c2TextBPreLo.toNat ≤ base.toNat) + (hhi : base.toNat + len ≤ c2TextBPreHi.toNat) : + keepTextBPre pc = true := by + unfold keepTextBPre + rw [decide_eq_true_eq] + have htop : c2TextBPreHi.toNat < 2 ^ 64 := BitVec.isLt c2TextBPreHi + generalize hd : pc - base = d at hsub + have hpc_eq : pc = base + d := by subst hd; bv_omega + have htoNat : pc.toNat = base.toNat + d.toNat := by + rw [hpc_eq, BitVec.toNat_add, Nat.mod_eq_of_lt (by omega)] + omega + +/-! ## 6. Fast Interned-ID `resolve = cliElfMultiPlacement.ρ` on `c2RxDehookedSyms` -/ + +set_option maxRecDepth 4000000 in +private theorem ls_sharedExterns_lookupId_ok : + libsignalSessionExterns = + lsSharedExterns.map (fun idx => lsInternedMultiLib.names.getD idx "") ∧ + (lsSharedExterns.all fun idx => + Nat.blt idx lsInternedMultiLib.names.length && + (Obj.Interned.lookupBlockSymId idx lsInternedMultiLib.blocks == none)) = true := + ⟨by rfl_kernel, by rfl_kernel⟩ + +theorem libsignalSessionExterns_resolve_eq_rho (mpl : Obj.MultiPlacement) : + ∀ e ∈ libsignalSessionExterns, libsignalSessionLib.resolve mpl e = mpl.ρ e := by + intro e he + rw [ls_sharedExterns_lookupId_ok.1, List.mem_map] at he + rcases he with ⟨idx, hidx, rfl⟩ + have hall := List.all_eq_true.mp ls_sharedExterns_lookupId_ok.2 idx hidx + simp only [Bool.and_eq_true, Nat.blt_eq, beq_iff_eq] at hall + have hnone : + Obj.lookupBlockSym (lsInternedMultiLib.names.getD idx "") libsignalSessionLib.blocks = + none := by + rw [ls_toMultiPlacedLib_eq, + Obj.Interned.lookupBlockSym_toMultiPlacedLib ls_names_nodup ls_idsOk hall.1] + exact hall.2 + unfold MultiPlacedLib.resolve + rw [hnone] + +private theorem c2RxDehookedSyms_sub_externs_and_names : + (c2RxDehookedSyms.all fun s => + libsignalSessionExterns.contains s && lsInternedMultiLib.names.contains s) = true := by + rfl_kernel + +/-- Any `s ∈ c2RxDehookedSyms` resolves under `hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl` + to `cliElfMultiPlacement.ρ s`. -/ +theorem resolve_c2RxSym_eq_cliElf_rho {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + {s : String} (hs : s ∈ c2RxDehookedSyms) : + libsignalSessionLib.resolve mpl s = cliElfMultiPlacement.ρ s := by + have hboth := List.all_eq_true.mp c2RxDehookedSyms_sub_externs_and_names s hs + simp only [Bool.and_eq_true, List.contains_iff_mem] at hboth + have huniq := (cliElf_linkedAt_unique hLs).2.1 s hboth.2 + exact huniq.trans (libsignalSessionExterns_resolve_eq_rho cliElfMultiPlacement s hboth.1) + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.RowCommon diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/T4Witness.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/T4Witness.lean new file mode 100644 index 000000000..a5f566c14 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/T4Witness.lean @@ -0,0 +1,824 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfPlaced -- proof-setup: allow-public-import +import LibsignalBinary.Proofs.HookDischarge.Generics.BlackBoxU8 +import LibsignalBinary.Proofs.HookDischarge.Generics.ZeroizeDrop +import LibsignalBinary.Proofs.HookDischarge.RustStd.MemrchrRO +import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpCode +import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.RowCommon +import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveCode +import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeCode +import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeGhost +import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesDataRefl4 +import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2StepsLiftR2 +import ProofLib.ProgramReflection +meta import ProofLib.ProgramReflection + +/-! +# Cutover-2 (`C2`) T4 Kernel-Closed Layout Witnesses (`C2RowLayoutFacts.T4Witness`) + +**Checked by Lean. Untrusted (`Role::Proof`, `CliElfLib`).** + +Closes all four Cutover-2 (`C2`, `37 → 27` hooks, `9 → 19` de-hooked symbols, `D-C2f = 2C`, +`50066cbd…98ce`) layout-fact bundles on `cliElfBytes`: +1. **`c2RoSliceFacts : C2RoSliceFacts`:** `rfl_kernel` `.rodata.lib2` segment-slice checks for + `c2FromUtf8TableAddr` (`UTF8_CHAR_WIDTH`, `256` B) and `c2DurationSinceCst16Addr` + (`1_u128`, `16` B) on `f3PatchedElf`. +2. **`c2ResolveFacts_of_linkedAt` / `_cliElf` / `_lsmpl`:** Symbol-resolved entry equalities across + all `10` de-hooked C2 rows under `libsignalSessionLib.LinkedAt cliElfBytes mpl`. +3. **`c2Lib2RxSliceFacts_of_linkedAt` / `_cliElf` / `_lsmpl`:** `rfl_kernel` linear byte-subslice + checks `checkProgCodeSubslice f3TrialRxProg = true` across all `10` de-hooked C2 + rows. +4. **`c2ExternTableFacts_of_linkedAt` / `_cliElf` / `_lsmpl`:** Block-`617` real & ghost `externAt?` + identities and `.text.lib2` / `.text.b_pre` hull memberships across `c2RxDehookedSyms`. +5. **Bundle-free per-row `GhostRowOk` corollaries (`c2_Ghost_rowOk[_guardOf]_of_linkedAt`):** + Direct `LinkedAt`-only `GhostRowOk` instantiations across all `10` de-hooked C2 rows at + `mpl := lsmpl`, eliminating every `C2*Facts` binder from consumer call sites. +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.T4Witness + +open Arm64 Arm64.Obj Arm64.Process ProofLib ProofLib.ProgramReflection ProofLib.StdStartup +open VerifiedLibraries.Musl (memmoveLibcaCalls memmoveLibcaWords) +open CryptoVerification (LibsignalPlacement libsignalSessionExterns lsmpl) +open CryptoVerification.SignalSession + (CliHooks cliElfBytes cliExternsPlaced libsignalSessionLib lsBlackBoxSym lsDurationSinceSym + lsFromUtf8Sym lsMemrchrSym lsSharedSecretDropSym lsStaticSecretDropSym lsTimeAddSym) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Heap.Fine (f3RxWordCount f3StdLayout) +open LibsignalBinary.Proofs.HookDischarge.Generics.BlackBoxU8 (blackBoxU8Words) +open LibsignalBinary.Proofs.HookDischarge.Generics.ZeroizeDrop (zeroize32Words) +open LibsignalBinary.Proofs.HookDischarge.RustStd.MemrchrRO (coreMemrchrWords) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpCode (bcmpHullWords memcmpByteLen) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays + (bcmpEntryGuard bcmpGhost bcmpHullBase bcmpSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhostReplays + (blackBoxEntryGuard blackBoxGhost blackBoxSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts + (C2Lib2RxSliceFacts C2ResolveFacts + c2_bcmpGhost_rowOk c2_bcmpGhost_rowOk_guardOf + c2_blackBoxGhost_rowOk c2_blackBoxGhost_rowOk_guardOf + c2_durationSinceGhost_rowOk c2_durationSinceGhost_rowOk_guardOf + c2_fromUtf8Ghost_rowOk c2_fromUtf8Ghost_rowOk_guardOf + c2_memmoveGhost_rowOk c2_memmoveGhost_rowOk_guardOf + c2_memrchrGhost_rowOk c2_memrchrGhost_rowOk_guardOf + c2_sharedSecretDropGhost_rowOk c2_sharedSecretDropGhost_rowOk_guardOf + c2_staticSecretDropGhost_rowOk c2_staticSecretDropGhost_rowOk_guardOf + c2_strlenGhost_rowOk c2_strlenGhost_rowOk_guardOf + c2_timeAddGhost_rowOk c2_timeAddGhost_rowOk_guardOf) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice + (checkProgCodeSubslice) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.RowCommon + (libsignalSessionExterns_resolve_eq_rho resolve_c2RxSym_eq_cliElf_rho) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.Time (c2TimeMpl) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.TimeAddPanic + (externAt?_cliProgExtPlacedAt_617 externAt?_cliProgExtPlacedAt_617_of_nodup_resolve + ls_block617_externs_eq_libsignalSessionExterns) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhostReplays + (durationSinceEntryGuard durationSinceGhost durationSinceSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay (GhostRowOk) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8GhostReplays + (fromUtf8EntryGuard fromUtf8MplGhost fromUtf8SubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8SingleBlock (fromUtf8Placement) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveCode + (bPreHullWords bPreMemmoveByteOff bPrePadWord) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays + (memcpyEntry memmoveEntryGuard memmoveGhost memmoveHullWords memmoveSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrExtraReplays + (memrchrEntryGuard memrchrGhost memrchrSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness + (f3EmptyMemcpyGhostHookNarrow f3EmptyMemsetGhostHookNarrow) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropGhostReplays + (sharedSecretDropEntryGuard sharedSecretDropGhost sharedSecretDropHullBase + sharedSecretDropSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StaticSecretDropGhostReplays + (staticSecretDropEntryGuard staticSecretDropGhost staticSecretDropSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays + (strlenEntry strlenEntryGuard strlenGhost strlenSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddGhostReplays + (timeAddEntryGuard timeAddGhost timeAddSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeCode (sharedSecretDropHullWords) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeGhost (sharedSecretDropEntryOff) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraGhostTable cliGhostExternsWithExtra) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesData (ls_idsOk) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + (C2ExternTableFacts C2RoSliceFacts c2CorePlacedData1 c2TimePlacedData0 keepLib2Text keepTextBPre) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics + (F3CodeInv f3PatchedElf) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Tie + (f3RxSegBase f3TrialRxProg f3TrialRxProg_base f3TrialRxWordTree_eq f3TrialRxWordTree_size) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfPlaced + (cliElfMultiPlacement cliElf_externs_nodup_of_linkedAt cliElf_linkedAt cliElf_linkedAt_unique + lsInternedMultiLib lsSharedExterns ls_names_nodup ls_toMultiPlacedLib_eq) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2StepsLiftR2 + (h2sl_realW_noExtern_keepSub) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomPlacedInst (hole2_keepSub) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen + (c2BatchLDehookedSyms c2BcmpAddr c2BlackBoxAddr c2DurationSinceAddr c2DurationSinceCst16Addr + c2FromUtf8Addr c2FromUtf8TableAddr c2Lib2DehookedSyms c2MemmoveAddr c2MemrchrAddr + c2RxDehookedSyms c2SharedSecretDropAddr c2StaticSecretDropAddr c2StrlenAddr c2TimeAddAddr + wp4MemcpyRealAddr) + +/-! ## 1. `.rodata.lib2` Slice Witness (`c2RoSliceFacts`) -/ + +set_option maxRecDepth 4000000 in +private theorem f3PatchedElf_roSegIdx_lt_bool : + Nat.blt f3StdLayout.roSegIdx f3PatchedElf.segments.length = true := by + rfl_kernel + +private theorem f3PatchedElf_roSegIdx_lt : + f3StdLayout.roSegIdx < f3PatchedElf.segments.length := + Nat.blt_eq.mp f3PatchedElf_roSegIdx_lt_bool + +private noncomputable def f3RoSeg := + f3PatchedElf.segments[f3StdLayout.roSegIdx]'f3PatchedElf_roSegIdx_lt + +set_option maxRecDepth 4000000 in +private theorem f3RoSeg_perm_eq : f3RoSeg.perm.rwx = Perm.ro := by + rfl_kernel + +set_option maxRecDepth 4000000 in +private theorem f3RoSeg_fromUtf8_ok : + checkSegSlice f3RoSeg f3RoSeg.bytes.length c2FromUtf8TableAddr c2CorePlacedData1 = true := by + rfl_kernel + +set_option maxRecDepth 4000000 in +private theorem f3RoSeg_durationSince_ok : + checkSegSlice f3RoSeg f3RoSeg.bytes.length c2DurationSinceCst16Addr c2TimePlacedData0 = true := by + rfl_kernel + +theorem c2RoSliceFacts : C2RoSliceFacts where + fromUtf8Slice := + ⟨f3RoSeg, List.getElem?_eq_getElem f3PatchedElf_roSegIdx_lt, + f3RoSeg_perm_eq, f3RoSeg_fromUtf8_ok⟩ + durationSinceSlice := + ⟨f3RoSeg, List.getElem?_eq_getElem f3PatchedElf_roSegIdx_lt, + f3RoSeg_perm_eq, f3RoSeg_durationSince_ok⟩ + +/-! ## 2. Symbol-Resolution Witness (`c2ResolveFacts_*`) -/ + +theorem c2ResolveFacts_of_linkedAt {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + C2ResolveFacts mpl where + fromUtf8_eq := + (resolve_c2RxSym_eq_cliElf_rho hLs (decide_eq_true_eq.mp (by rfl_kernel))).trans + (by rfl_kernel) + durationSince_eq := + (resolve_c2RxSym_eq_cliElf_rho hLs (decide_eq_true_eq.mp (by rfl_kernel))).trans + (by rfl_kernel) + timeAdd_eq := + (resolve_c2RxSym_eq_cliElf_rho hLs (decide_eq_true_eq.mp (by rfl_kernel))).trans + (by rfl_kernel) + memrchr_eq := + (resolve_c2RxSym_eq_cliElf_rho hLs (decide_eq_true_eq.mp (by rfl_kernel))).trans + (by rfl_kernel) + strlen_eq := + (resolve_c2RxSym_eq_cliElf_rho hLs (decide_eq_true_eq.mp (by rfl_kernel))).trans + (by rfl_kernel) + bcmp_eq := + (resolve_c2RxSym_eq_cliElf_rho hLs (decide_eq_true_eq.mp (by rfl_kernel))).trans + (by rfl_kernel) + memmove_eq := + (resolve_c2RxSym_eq_cliElf_rho hLs (decide_eq_true_eq.mp (by rfl_kernel))).trans + (by rfl_kernel) + dalek := + { blackBox_eq := + (resolve_c2RxSym_eq_cliElf_rho hLs (decide_eq_true_eq.mp (by rfl_kernel))).trans + (by rfl_kernel) + sharedSecretDrop_eq := + (resolve_c2RxSym_eq_cliElf_rho hLs (decide_eq_true_eq.mp (by rfl_kernel))).trans + (by rfl_kernel) + staticSecretDrop_eq := + (resolve_c2RxSym_eq_cliElf_rho hLs (decide_eq_true_eq.mp (by rfl_kernel))).trans + (by rfl_kernel) } + +theorem c2ResolveFacts_cliElf : C2ResolveFacts cliElfMultiPlacement := + c2ResolveFacts_of_linkedAt cliElf_linkedAt + +theorem c2ResolveFacts_lsmpl [LibsignalPlacement] + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + C2ResolveFacts lsmpl := + c2ResolveFacts_of_linkedAt hLs + +private theorem resolve_memcpy_eq_of_linkedAt {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + libsignalSessionLib.resolve mpl "memcpy" = wp4MemcpyRealAddr := + (resolve_c2RxSym_eq_cliElf_rho hLs (decide_eq_true_eq.mp (by rfl_kernel))).trans + (by rfl_kernel) + +/-! ## 3. RX Byte-Subslice Witness (`c2Lib2RxSliceFacts_*`) -/ + +private theorem patchCalls_memmoveLibcaCalls_congr + (words : List (BitVec 32)) (a : BitVec 64) + (r1 r2 : String → BitVec 64) (h : r1 "memcpy" = r2 "memcpy") : + Obj.patchCalls memmoveLibcaCalls words a r1 = + Obj.patchCalls memmoveLibcaCalls words a r2 := by + unfold Obj.patchCalls + refine congrArg (fun fn => words.mapIdx fn) (funext fun j => funext fun w => ?_) + cases hp : ((104 : Nat) == 4 * j) + · simp [List.find?, hp] + · simp [List.find?, hp, h] + +private theorem memmoveSubProg_eq_closed {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + memmoveSubProg mpl = + pureWordsProg wp4MemcpyRealAddr + (bPreHullWords wp4MemcpyRealAddr (fun _ => wp4MemcpyRealAddr) bPrePadWord) := by + have hm : libsignalSessionLib.resolve mpl "memcpy" = wp4MemcpyRealAddr := + resolve_memcpy_eq_of_linkedAt hLs + unfold memmoveSubProg memmoveHullWords memcpyEntry bPreHullWords + rw [hm, patchCalls_memmoveLibcaCalls_congr memmoveLibcaWords + (wp4MemcpyRealAddr + bPreMemmoveByteOff) (libsignalSessionLib.resolve mpl) + (fun _ => wp4MemcpyRealAddr) hm] + +set_option maxRecDepth 4000000 in +private theorem c2_rxSlice_fromUtf8_ok : + checkProgCodeSubslice f3TrialRxProg + (fromUtf8SubProg (fromUtf8Placement c2FromUtf8Addr c2FromUtf8TableAddr)) = true := by + rfl_kernel + +set_option maxRecDepth 4000000 in +private theorem c2_rxSlice_durationSince_ok : + checkProgCodeSubslice f3TrialRxProg (durationSinceSubProg c2TimeMpl) = true := by + rfl_kernel + +set_option maxRecDepth 4000000 in +private theorem c2_rxSlice_timeAdd_ok : + checkProgCodeSubslice f3TrialRxProg (timeAddSubProg c2TimeMpl) = true := by + rfl_kernel + +set_option maxRecDepth 4000000 in +private theorem c2_rxSlice_blackBox_ok : + checkProgCodeSubslice f3TrialRxProg (pureWordsProg c2BlackBoxAddr blackBoxU8Words) = true := by + rfl_kernel + +set_option maxRecDepth 4000000 in +private theorem c2_rxSlice_sharedSecretDrop_ok : + checkProgCodeSubslice f3TrialRxProg + (pureWordsProg (c2SharedSecretDropAddr - sharedSecretDropEntryOff) + sharedSecretDropHullWords) = true := by + rfl_kernel + +set_option maxRecDepth 4000000 in +private theorem c2_rxSlice_staticSecretDrop_ok : + checkProgCodeSubslice f3TrialRxProg + (pureWordsProg c2StaticSecretDropAddr zeroize32Words) = true := by + rfl_kernel + +set_option maxRecDepth 4000000 in +private theorem c2_rxSlice_memrchr_ok : + checkProgCodeSubslice f3TrialRxProg + (pureWordsProg c2MemrchrAddr coreMemrchrWords) = true := by + rfl_kernel + +set_option maxRecDepth 4000000 in +private theorem c2_rxSlice_strlen_ok : + checkProgCodeSubslice f3TrialRxProg + (pureWordsProg c2StrlenAddr muslStrlenWords) = true := by + rfl_kernel + +set_option maxRecDepth 4000000 in +private theorem c2_rxSlice_bcmp_ok : + checkProgCodeSubslice f3TrialRxProg + (pureWordsProg (c2BcmpAddr - memcmpByteLen) + (bcmpHullWords (c2BcmpAddr - memcmpByteLen))) = true := by + rfl_kernel + +set_option maxRecDepth 4000000 in +private theorem c2_rxSlice_memmove_ok : + checkProgCodeSubslice f3TrialRxProg + (pureWordsProg wp4MemcpyRealAddr + (bPreHullWords wp4MemcpyRealAddr (fun _ => wp4MemcpyRealAddr) bPrePadWord)) = true := by + rfl_kernel + +theorem c2Lib2RxSliceFacts_of_linkedAt {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + C2Lib2RxSliceFacts mpl := by + have hRes := c2ResolveFacts_of_linkedAt hLs + refine + { fromUtf8 := c2_rxSlice_fromUtf8_ok + durationSince := c2_rxSlice_durationSince_ok + timeAdd := c2_rxSlice_timeAdd_ok + blackBox := ?_ + sharedSecretDrop := ?_ + staticSecretDrop := ?_ + memrchr := ?_ + strlen := ?_ + bcmp := ?_ + memmove := ?_ } + · unfold blackBoxSubProg; rw [hRes.blackBox_eq]; exact c2_rxSlice_blackBox_ok + · unfold sharedSecretDropSubProg sharedSecretDropHullBase + rw [hRes.sharedSecretDrop_eq]; exact c2_rxSlice_sharedSecretDrop_ok + · unfold staticSecretDropSubProg; rw [hRes.staticSecretDrop_eq]; exact c2_rxSlice_staticSecretDrop_ok + · unfold memrchrSubProg; rw [hRes.memrchr_eq]; exact c2_rxSlice_memrchr_ok + · unfold strlenSubProg strlenEntry; rw [hRes.strlen_eq]; exact c2_rxSlice_strlen_ok + · unfold bcmpSubProg bcmpHullBase; rw [hRes.bcmp_eq]; exact c2_rxSlice_bcmp_ok + · rw [memmoveSubProg_eq_closed hLs]; exact c2_rxSlice_memmove_ok + +theorem c2Lib2RxSliceFacts_cliElf : C2Lib2RxSliceFacts cliElfMultiPlacement := + c2Lib2RxSliceFacts_of_linkedAt cliElf_linkedAt + +theorem c2Lib2RxSliceFacts_lsmpl [LibsignalPlacement] + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + C2Lib2RxSliceFacts lsmpl := + c2Lib2RxSliceFacts_of_linkedAt hLs + +/-! ## 4. Block-`617` Extern-Table & Hull Membership Witness (`c2ExternTableFacts_*`) -/ + +private theorem rxProg_code_len_eq : + f3TrialRxProg.code.length = 4 * f3RxWordCount := by + rw [f3TrialRxWordTree_eq, WordTree.length_toBytes_of_checkSize? f3TrialRxWordTree_size] + +private theorem progKeep_f3TrialRxProg_imp_hole2_keepSub {pc : BitVec 64} + (h : progKeep f3TrialRxProg pc = true) : + hole2_keepSub pc = true := by + unfold progKeep at h + rw [f3TrialRxProg_base, rxProg_code_len_eq, decide_eq_true_eq] at h + unfold hole2_keepSub + rw [decide_eq_true_eq] + have hbase : f3RxSegBase = 0x469000#64 := rfl + have hlen : 4 * f3RxWordCount = 0x6000 := rfl + rw [hbase, hlen] at h + generalize hd : pc - 0x469000#64 = d at h + have hpc_eq : pc = 0x469000#64 + d := by subst hd; bv_omega + have h9000 : (0x469000#64 : BitVec 64).toNat = 0x469000 := rfl + have htoNat : pc.toNat = 0x469000 + d.toNat := by + rw [hpc_eq, BitVec.toNat_add, h9000, Nat.mod_eq_of_lt (by omega)] + omega + +private theorem findSome?_eq_none_of_forall_ne {α β γ : Type} [BEq β] [LawfulBEq β] + {xs : List α} {f : α → β} (g : α → Option γ) {v : β} + (hne : ∀ e ∈ xs, f e ≠ v) : + (xs.findSome? fun e => if f e == v then g e else none) = none := by + induction xs with + | nil => rfl + | cons a rest ih => + have ha : (f a == v) = false := beq_eq_false_iff_ne.mpr (hne a (.head _)) + simp only [List.findSome?_cons, ha, Bool.false_eq_true, ↓reduceIte] + exact ih (fun e he => hne e (.tail _ he)) + +set_option maxRecDepth 4000000 in +private theorem sharedExterns_lookup_ok : + libsignalSessionExterns = + lsSharedExterns.map (fun idx => lsInternedMultiLib.names.getD idx "") ∧ + (lsSharedExterns.all fun idx => + Nat.blt idx lsInternedMultiLib.names.length && + (Obj.Interned.lookupBlockSymId idx lsInternedMultiLib.blocks == none)) = true := + ⟨by rfl_kernel, by rfl_kernel⟩ + +private theorem resolve_extern_eq_cliElf_rho {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + {e : String} (he : e ∈ libsignalSessionExterns) : + libsignalSessionLib.resolve mpl e = cliElfMultiPlacement.ρ e := by + have hres_rho := libsignalSessionExterns_resolve_eq_rho mpl e he + have huniq := (cliElf_linkedAt_unique hLs).2.2.1 + rw [sharedExterns_lookup_ok.1, List.mem_map] at he + rcases he with ⟨idx, hidx, rfl⟩ + have hall := List.all_eq_true.mp sharedExterns_lookup_ok.2 idx hidx + simp only [Bool.and_eq_true, Nat.blt_eq, beq_iff_eq] at hall + have hmem : lsInternedMultiLib.names.getD idx "" ∈ lsInternedMultiLib.names := by + rw [Obj.Interned.getD_of_lt hall.1] + exact List.getElem_mem hall.1 + have hnone : + Obj.lookupBlockSym (lsInternedMultiLib.names.getD idx "") libsignalSessionLib.blocks = + none := by + rw [ls_toMultiPlacedLib_eq, + Obj.Interned.lookupBlockSym_toMultiPlacedLib ls_names_nodup ls_idsOk hall.1] + exact hall.2 + exact hres_rho.trans (huniq _ hmem hnone) + +set_option maxRecDepth 4000000 in +private theorem externs_in_rx_sub_c2RxDehooked : + (libsignalSessionExterns.all fun e => + let a := (cliElfMultiPlacement.ρ e).toNat + !(Nat.ble 0x469000 a && Nat.blt a 0x46f000) || c2RxDehookedSyms.contains e) = true := by + rfl_kernel + +set_option maxRecDepth 4000000 in +private theorem c2RxDehookedSyms_sub_externs : + (c2RxDehookedSyms.all fun s => libsignalSessionExterns.contains s) = true := by + rfl_kernel + +set_option maxRecDepth 4000000 in +private theorem c2Lib2DehookedSyms_in_keepLib2Text : + (c2Lib2DehookedSyms.all fun s => + c2RxDehookedSyms.contains s && keepLib2Text (cliElfMultiPlacement.ρ s)) = true := by + rfl_kernel + +set_option maxRecDepth 4000000 in +private theorem c2BatchLDehookedSyms_in_keepTextBPre : + (c2BatchLDehookedSyms.all fun s => + c2RxDehookedSyms.contains s && keepTextBPre (cliElfMultiPlacement.ρ s)) = true := by + rfl_kernel + +theorem c2ExternTableFacts_of_linkedAt {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + C2ExternTableFacts mpl where + realRxNoExtern mmpl W {pc} hpc := + h2sl_realW_noExtern_keepSub hLs mmpl W pc (progKeep_f3TrialRxProg_imp_hole2_keepSub hpc) + ghostRxNoExternOffEntries extFn W {pc} hpc hnotin := by + have hk := progKeep_f3TrialRxProg_imp_hole2_keepSub hpc + unfold hole2_keepSub at hk + rw [decide_eq_true_eq] at hk + rw [externAt?_cliProgExtPlacedAt_617, ls_block617_externs_eq_libsignalSessionExterns] + refine findSome?_eq_none_of_forall_ne (extFn W) fun e he hres_eq => ?_ + have hrho : cliElfMultiPlacement.ρ e = pc := + (resolve_extern_eq_cliElf_rho hLs he).symm.trans hres_eq + have hall := List.all_eq_true.mp externs_in_rx_sub_c2RxDehooked e he + dsimp only at hall + rw [hrho, Nat.ble_eq.mpr hk.1, Nat.blt_eq.mpr hk.2] at hall + simp only [Bool.true_and, Bool.not_true, Bool.false_or, List.contains_iff_mem] at hall + exact hnotin (hres_eq ▸ List.mem_map_of_mem hall) + ghostRxEntry extFn W {sym} hsym := by + have hMemExt : sym ∈ libsignalSessionExterns := + List.contains_iff_mem.mp (List.all_eq_true.mp c2RxDehookedSyms_sub_externs sym hsym) + have hMem617 : sym ∈ (libsignalSessionLib.blockLib 617).text.externs := by + rwa [ls_block617_externs_eq_libsignalSessionExterns] + have hMapEq : + (libsignalSessionLib.blockLib 617).text.externs.map (libsignalSessionLib.resolve mpl) = + libsignalSessionExterns.map mpl.ρ := by + rw [ls_block617_externs_eq_libsignalSessionExterns] + exact List.map_congr_left (libsignalSessionExterns_resolve_eq_rho mpl) + have hNodup : + ((libsignalSessionLib.blockLib 617).text.externs.map + (libsignalSessionLib.resolve mpl)).Nodup := by + rw [hMapEq] + exact cliElf_externs_nodup_of_linkedAt hLs + exact externAt?_cliProgExtPlacedAt_617_of_nodup_resolve hMem617 hNodup W + lib2InKeep {sym} hsym := by + have hall := Bool.and_eq_true_iff.mp + (List.all_eq_true.mp c2Lib2DehookedSyms_in_keepLib2Text sym hsym) + have hmem : sym ∈ c2RxDehookedSyms := List.contains_iff_mem.mp hall.1 + rw [resolve_c2RxSym_eq_cliElf_rho hLs hmem] + exact hall.2 + batchLInKeep {sym} hsym := by + have hall := Bool.and_eq_true_iff.mp + (List.all_eq_true.mp c2BatchLDehookedSyms_in_keepTextBPre sym hsym) + have hmem : sym ∈ c2RxDehookedSyms := List.contains_iff_mem.mp hall.1 + rw [resolve_c2RxSym_eq_cliElf_rho hLs hmem] + exact hall.2 + +theorem c2ExternTableFacts_cliElf : C2ExternTableFacts cliElfMultiPlacement := + c2ExternTableFacts_of_linkedAt cliElf_linkedAt + +theorem c2ExternTableFacts_lsmpl [LibsignalPlacement] + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + C2ExternTableFacts lsmpl := + c2ExternTableFacts_of_linkedAt hLs + +/-! ## 5. Bundle-Free Per-Row `GhostRowOk` Corollaries at `mpl := lsmpl` -/ + +theorem c2_fromUtf8Ghost_rowOk_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsFromUtf8Sym = + some (fromUtf8MplGhost lsmpl mmpl c2FromUtf8TableAddr)) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsFromUtf8Sym + (fromUtf8EntryGuard lsmpl) + (fromUtf8MplGhost lsmpl mmpl c2FromUtf8TableAddr) := + c2_fromUtf8Ghost_rowOk mmpl PredFs g extra hLook + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) c2RoSliceFacts + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_fromUtf8Ghost_rowOk_guardOf_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsFromUtf8Sym = + some (fromUtf8MplGhost lsmpl mmpl c2FromUtf8TableAddr)) + (hGuard : ∀ s0 : State, guardOf lsFromUtf8Sym s0 → fromUtf8EntryGuard lsmpl s0) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsFromUtf8Sym + (guardOf lsFromUtf8Sym) + (fromUtf8MplGhost lsmpl mmpl c2FromUtf8TableAddr) := + c2_fromUtf8Ghost_rowOk_guardOf mmpl PredFs guardOf g extra hLook hGuard + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) c2RoSliceFacts + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_durationSinceGhost_rowOk_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsDurationSinceSym + (durationSinceEntryGuard lsmpl) + (durationSinceGhost c2TimeMpl) := + c2_durationSinceGhost_rowOk mmpl PredFs g extra + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) c2RoSliceFacts + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_durationSinceGhost_rowOk_guardOf_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsDurationSinceSym + (guardOf lsDurationSinceSym) + (durationSinceGhost c2TimeMpl) := + c2_durationSinceGhost_rowOk_guardOf mmpl PredFs guardOf g extra + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) c2RoSliceFacts + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_timeAddGhost_rowOk_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsTimeAddSym + (timeAddEntryGuard lsmpl) + (timeAddGhost c2TimeMpl) := + c2_timeAddGhost_rowOk mmpl PredFs g extra + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_timeAddGhost_rowOk_guardOf_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsTimeAddSym + (guardOf lsTimeAddSym) + (timeAddGhost c2TimeMpl) := + c2_timeAddGhost_rowOk_guardOf mmpl PredFs guardOf g extra + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_blackBoxGhost_rowOk_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsBlackBoxSym = some (blackBoxGhost lsmpl mmpl)) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsBlackBoxSym + (blackBoxEntryGuard lsmpl) + (blackBoxGhost lsmpl mmpl) := + c2_blackBoxGhost_rowOk mmpl PredFs g extra hLook + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_blackBoxGhost_rowOk_guardOf_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsBlackBoxSym = some (blackBoxGhost lsmpl mmpl)) + (hGuard : ∀ s0 : State, guardOf lsBlackBoxSym s0 → blackBoxEntryGuard lsmpl s0) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsBlackBoxSym + (guardOf lsBlackBoxSym) + (blackBoxGhost lsmpl mmpl) := + c2_blackBoxGhost_rowOk_guardOf mmpl PredFs guardOf g extra hLook hGuard + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_sharedSecretDropGhost_rowOk_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsSharedSecretDropSym = some (sharedSecretDropGhost lsmpl mmpl)) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsSharedSecretDropSym + (sharedSecretDropEntryGuard lsmpl) + (sharedSecretDropGhost lsmpl mmpl) := + c2_sharedSecretDropGhost_rowOk mmpl PredFs g extra hLook + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_sharedSecretDropGhost_rowOk_guardOf_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsSharedSecretDropSym = some (sharedSecretDropGhost lsmpl mmpl)) + (hGuard : ∀ s0 : State, guardOf lsSharedSecretDropSym s0 → sharedSecretDropEntryGuard lsmpl s0) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsSharedSecretDropSym + (guardOf lsSharedSecretDropSym) + (sharedSecretDropGhost lsmpl mmpl) := + c2_sharedSecretDropGhost_rowOk_guardOf mmpl PredFs guardOf g extra hLook hGuard + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_staticSecretDropGhost_rowOk_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsStaticSecretDropSym = some (staticSecretDropGhost lsmpl mmpl)) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsStaticSecretDropSym + (staticSecretDropEntryGuard lsmpl) + (staticSecretDropGhost lsmpl mmpl) := + c2_staticSecretDropGhost_rowOk mmpl PredFs g extra hLook + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_staticSecretDropGhost_rowOk_guardOf_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup lsStaticSecretDropSym = some (staticSecretDropGhost lsmpl mmpl)) + (hGuard : ∀ s0 : State, guardOf lsStaticSecretDropSym s0 → staticSecretDropEntryGuard lsmpl s0) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsStaticSecretDropSym + (guardOf lsStaticSecretDropSym) + (staticSecretDropGhost lsmpl mmpl) := + c2_staticSecretDropGhost_rowOk_guardOf mmpl PredFs guardOf g extra hLook hGuard + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_memrchrGhost_rowOk_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsMemrchrSym + (memrchrEntryGuard lsmpl) + (memrchrGhost lsmpl mmpl) := + c2_memrchrGhost_rowOk mmpl PredFs g extra + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_memrchrGhost_rowOk_guardOf_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsMemrchrSym + (guardOf lsMemrchrSym) + (memrchrGhost lsmpl mmpl) := + c2_memrchrGhost_rowOk_guardOf mmpl PredFs guardOf g extra + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_strlenGhost_rowOk_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "strlen" = some (strlenGhost lsmpl mmpl)) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "strlen" + (strlenEntryGuard lsmpl) + (strlenGhost lsmpl mmpl) := + c2_strlenGhost_rowOk mmpl PredFs g extra hLook + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_strlenGhost_rowOk_guardOf_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "strlen" = some (strlenGhost lsmpl mmpl)) + (hGuard : ∀ s0 : State, guardOf "strlen" s0 → strlenEntryGuard lsmpl s0) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "strlen" + (guardOf "strlen") + (strlenGhost lsmpl mmpl) := + c2_strlenGhost_rowOk_guardOf mmpl PredFs guardOf g extra hLook hGuard + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_bcmpGhost_rowOk_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "bcmp" = some (bcmpGhost lsmpl mmpl)) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "bcmp" + (bcmpEntryGuard lsmpl) + (bcmpGhost lsmpl mmpl) := + c2_bcmpGhost_rowOk mmpl PredFs g extra hLook + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_bcmpGhost_rowOk_guardOf_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "bcmp" = some (bcmpGhost lsmpl mmpl)) + (hGuard : ∀ s0 : State, guardOf "bcmp" s0 → bcmpEntryGuard lsmpl s0) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "bcmp" + (guardOf "bcmp") + (bcmpGhost lsmpl mmpl) := + c2_bcmpGhost_rowOk_guardOf mmpl PredFs guardOf g extra hLook hGuard + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_memmoveGhost_rowOk_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "memmove" = some (memmoveGhost lsmpl mmpl)) + (hGMemcpy : g.memcpy = none ∨ g.memcpy = some (f3EmptyMemcpyGhostHookNarrow mmpl)) + (hGMemset : g.memset = none ∨ g.memset = some (f3EmptyMemsetGhostHookNarrow mmpl)) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "memmove" + (memmoveEntryGuard lsmpl) + (memmoveGhost lsmpl mmpl) := + c2_memmoveGhost_rowOk mmpl PredFs g extra hLook hGMemcpy hGMemset + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +theorem c2_memmoveGhost_rowOk_guardOf_of_linkedAt [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hLook : extra.lookup "memmove" = some (memmoveGhost lsmpl mmpl)) + (hGuard : ∀ s0 : State, guardOf "memmove" s0 → memmoveEntryGuard lsmpl s0) + (hGMemcpy : g.memcpy = none ∨ g.memcpy = some (f3EmptyMemcpyGhostHookNarrow mmpl)) + (hGMemset : g.memset = none ∨ g.memset = some (f3EmptyMemsetGhostHookNarrow mmpl)) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + "memmove" + (guardOf "memmove") + (memmoveGhost lsmpl mmpl) := + c2_memmoveGhost_rowOk_guardOf mmpl PredFs guardOf g extra hLook hGuard hGMemcpy hGMemset + (c2ResolveFacts_lsmpl hLs) (c2Lib2RxSliceFacts_lsmpl hLs) + (c2ExternTableFacts_lsmpl hLs) hLs + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.T4Witness diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/Time.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/Time.lean new file mode 100644 index 000000000..f1c50d0ab --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/Time.lean @@ -0,0 +1,579 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import ProofLib.Placed.Multi -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.DurCst16 -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts -- proof-setup: allow-public-import +import ProofLib.ProgramReflection +meta import ProofLib.ProgramReflection + +/-! +# Generic & Cutover-2 (`C2`) `timeMultiLib` Placement and `duration_since` Row Glue (`C2RowLayoutFacts.Time`) + +**Checked by Lean. Untrusted (`Role::Proof`).** + +Owns the shared Cutover-2 `timeMultiLib` placement `c2TimeMpl : Obj.MultiPlacement` (used by both +`::duration_since` and `>::add`) and discharges +the GK6c §19(d) `duration_since` row premises from `DurationSinceGhostReplays`: + +1. **Generic `mkTimeMpl` & `Placeable` / `checkProgCodeSubslice` Combinators (§1–§2, zero C2 constants):** + - `mkTimeMpl` constructs an unrelaxed `Obj.MultiPlacement` for `timeMultiLib`'s 3 code blocks + (`Timespec::sub_timespec`, `SystemTime::duration_since`, `SystemTime::add`), 5 `.rodata` + symbols, and single panic extern `rustTimeExpectFailedSym`, with `rfl`/decidable projections + for `base 0..2`, `ρ timeRodataCst16Sym`, and `timeAddExpectFailedStubPc`. + - `checkProgCodeSubslice rxProg subProg` performs a single linear `O(off + len)` byte-subslice + comparison `(rxProg.code.drop off).take len`, discharging both direct `subProg.CodeLoaded m` + and `Lib2LayoutFacts.f3CodeInv_rxWords_codeLoaded_strip` (`hAlign`, `hNoWrap`, `hSub`). +2. **Concrete `c2TimeMpl : Obj.MultiPlacement` & Shared Time Facts (§3):** + - Keyed by symbol name (`libsignalSessionLib.resolve cliElfMultiPlacement lsExpectFailedSymC2`) + and generator-emitted `Wp4LayoutGen` constants (`c2SubTimespecAddr`, `c2DurationSinceAddr`, + `c2TimeAddAddr`, `c2DurationSinceCst16Addr`, `c2FromUtf8TableAddr`, `c2Lib2RoLo`), with a + single documented block of 4 named `.rodata.lib2` `abbrev`s for local `.Lanon`/`str1.1` data + symbols not present in `.symtab`. + - Proves unconditional (`0` pending hypotheses) `c2TimeMpl_placeable`, `c2TimeMpl_hb1`, + `c2TimeMpl_hRho`, `c2TimeMpl_expectFailedStubPc`, `c2TimeMpl_expectFailedStubPc_of_linkedAt`, + and `c2_durationSinceGhost_rowSpecOk`. +3. **Concrete `durationSinceGhost_rowOk` Premises & Combined Row Theorem (§4):** + - Discharges `hTargetEq`, `hCL` (via `Lib2LayoutFacts.f3CodeInv_rxWords_codeLoaded_strip` + + `durationSinceSubProg_codeLoaded_of_stripExecOutside`), `hRo` (via `DurCst16`), `hInvKeep` + (via `F3CodeInv.of_keepsFrozen`), `hKeep` (via `f3LsRetAddr624_lt_firstExternStub`), and + `hRealHullNoExt` (via `f3RxSeg_realProg617_externAt_none` + `keepLib2Text_sub_rxProg`), + leaving only the T4 `rfl_kernel`-closed premises (`C2RoSliceFacts`, `C2ExternTableFacts`, + `hRxDur : checkProgCodeSubslice Tie.f3TrialRxProg (durationSinceSubProg c2TimeMpl) = true`, + and `hResDur : libsignalSessionLib.resolve mpl lsDurationSinceSym = c2DurationSinceAddr`). +-/ + +public section + +set_option autoImplicit false + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.Time + +open Arm64 Arm64.Obj Arm64.Process ProofLib ProofLib.ProgramReflection ProofLib.StdStartup +open VerifiedLibraries.RustStd + (rustTimeExpectFailedSym timeAddSym timeMultiLib timePlacedData0 timeRodataCst16Sym) +open CryptoVerification (LibsignalPlacement lsmpl) +open CryptoVerification.SignalSession + (CliHooks cliElfBytes cliExternsPlaced libsignalSessionLib lsDurationSinceSym lsTimeAddSym) +open LibsignalBinary.Proofs.HookDischarge.RustStd.Common (RoDataAt) +open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (LsRetAddr624) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice + (checkProgCodeSubslice codeLoaded_of_checkProgCodeSubslice) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.DurCst16 + (durationSince_hRo_of_f3CodeInv) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceCode + (durationSinceHullProg durationSinceHullWords) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhost (subTimespecByteLen) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhostReplays + (durationSinceGhost durationSinceGhost_rowOk durationSinceGhost_rowSpecOk + durationSinceHullByteLen durationSinceSubProg durationSinceSubProg_base + durationSinceSubProg_code_length durationSinceSubProg_codeLoaded_of_stripExecOutside + keepR_durationSince keepR_durationSince_of_code_offset) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + (GhostRowOk GhostRowReplayOn) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddGhostReplays + (keepR_timeAdd timeAddSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddPanicGhost + (timeAddEntryAddr_eq_base2 timeAddExpectFailedStubPc) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (GhostRowSpecOk) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Tie (f3TrialRxProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + (C2ExternTableFacts C2RoSliceFacts f3CodeInv_rxWords_codeLoaded_strip + f3LsRetAddr624_lt_firstExternStub f3RxSeg_realProg617_externAt_none keepLib2Text + keepLib2Text_sub_rxProg lsExpectFailedSymC2) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics (F3CodeInv) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfPlaced + (cliElfMultiPlacement cliElf_linkedAt_unique lsInternedMultiLib) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen + (c2DurationSinceAddr c2DurationSinceCst16Addr c2FirstExternStubAddr c2FromUtf8TableAddr + c2Lib2DehookedSyms c2Lib2RoLo c2Lib2TextHi c2Lib2TextLo c2SubTimespecAddr c2TimeAddAddr) + +/-! ## 1. Generic `timeMultiLib` Placement Constructor & Projections -/ + +/-- Internal `timeMultiLib` read-only data symbol for `.rodata.str1.1+0x0` (`73` B, `align = 1`). -/ +abbrev rustTimeRoStr1Sym : String := "rust_time:.rodata.str1.1+0x0" + +/-- Internal `timeMultiLib` read-only data symbol for `.rodata..Lanon.148` (`25` B, `align = 1`). -/ +abbrev rustTimeRoLanon148Sym : String := "rust_time:.rodata..Lanon.148" + +/-- Internal `timeMultiLib` read-only data symbol for `.data.rel.ro..Lanon.150` (`24` B, `align = 8`). -/ +abbrev rustTimeDataRelRoLanon150Sym : String := "rust_time:.data.rel.ro..Lanon.150" + +/-- Internal `timeMultiLib` read-only data symbol for `.rodata..Lanon.678` (`45` B, `align = 1`). -/ +abbrev rustTimeRoLanon678Sym : String := "rust_time:.rodata..Lanon.678" + +/-- Generic unrelaxed `Obj.MultiPlacement` constructor for `VerifiedLibraries.RustStd.timeMultiLib` + from its 3 block bases (`sub_timespec`, `duration_since`, `SystemTime::add`), 5 RO data symbol + addresses, and single panic-extern address (`rustTimeExpectFailedSym`). -/ +@[expose] def mkTimeMpl + (subTimespecBase durEntry addEntry : BitVec 64) + (cst16Addr roStr1Addr roLanon148Addr dataRelRo150Addr roLanon678Addr : BitVec 64) + (expectFailedAddr : BitVec 64) : Obj.MultiPlacement where + base i := + match i with + | 0 => subTimespecBase + | 1 => durEntry + | 2 => addEntry + | _ => 0#64 + ρ sym := + if sym == timeRodataCst16Sym then cst16Addr + else if sym == rustTimeRoStr1Sym then roStr1Addr + else if sym == rustTimeRoLanon148Sym then roLanon148Addr + else if sym == rustTimeDataRelRoLanon150Sym then dataRelRo150Addr + else if sym == rustTimeRoLanon678Sym then roLanon678Addr + else if sym == rustTimeExpectFailedSym then expectFailedAddr + else 0#64 + relax _ _ := false + b2b _ _ := false + undefWeak _ := false + +theorem mkTimeMpl_base0 + (subTimespecBase durEntry addEntry : BitVec 64) + (cst16Addr roStr1Addr roLanon148Addr dataRelRo150Addr roLanon678Addr : BitVec 64) + (expectFailedAddr : BitVec 64) : + (mkTimeMpl subTimespecBase durEntry addEntry + cst16Addr roStr1Addr roLanon148Addr dataRelRo150Addr roLanon678Addr + expectFailedAddr).base 0 = subTimespecBase := + rfl + +theorem mkTimeMpl_base1 + (subTimespecBase durEntry addEntry : BitVec 64) + (cst16Addr roStr1Addr roLanon148Addr dataRelRo150Addr roLanon678Addr : BitVec 64) + (expectFailedAddr : BitVec 64) : + (mkTimeMpl subTimespecBase durEntry addEntry + cst16Addr roStr1Addr roLanon148Addr dataRelRo150Addr roLanon678Addr + expectFailedAddr).base 1 = durEntry := + rfl + +theorem mkTimeMpl_base2 + (subTimespecBase durEntry addEntry : BitVec 64) + (cst16Addr roStr1Addr roLanon148Addr dataRelRo150Addr roLanon678Addr : BitVec 64) + (expectFailedAddr : BitVec 64) : + (mkTimeMpl subTimespecBase durEntry addEntry + cst16Addr roStr1Addr roLanon148Addr dataRelRo150Addr roLanon678Addr + expectFailedAddr).base 2 = addEntry := + rfl + +theorem mkTimeMpl_rho_cst16 + (subTimespecBase durEntry addEntry : BitVec 64) + (cst16Addr roStr1Addr roLanon148Addr dataRelRo150Addr roLanon678Addr : BitVec 64) + (expectFailedAddr : BitVec 64) : + (mkTimeMpl subTimespecBase durEntry addEntry + cst16Addr roStr1Addr roLanon148Addr dataRelRo150Addr roLanon678Addr + expectFailedAddr).ρ timeRodataCst16Sym = cst16Addr := by + have h0 : (timeRodataCst16Sym == timeRodataCst16Sym) = true := beq_self_eq_true _ + unfold mkTimeMpl + dsimp only + rw [h0] + simp + +theorem mkTimeMpl_rho_expectFailed + (subTimespecBase durEntry addEntry : BitVec 64) + (cst16Addr roStr1Addr roLanon148Addr dataRelRo150Addr roLanon678Addr : BitVec 64) + (expectFailedAddr : BitVec 64) : + (mkTimeMpl subTimespecBase durEntry addEntry + cst16Addr roStr1Addr roLanon148Addr dataRelRo150Addr roLanon678Addr + expectFailedAddr).ρ rustTimeExpectFailedSym = expectFailedAddr := by + have h0 : (rustTimeExpectFailedSym == timeRodataCst16Sym) = false := by decide +kernel + have h1 : (rustTimeExpectFailedSym == rustTimeRoStr1Sym) = false := by decide +kernel + have h2 : (rustTimeExpectFailedSym == rustTimeRoLanon148Sym) = false := by decide +kernel + have h3 : (rustTimeExpectFailedSym == rustTimeDataRelRoLanon150Sym) = false := by decide +kernel + have h4 : (rustTimeExpectFailedSym == rustTimeRoLanon678Sym) = false := by decide +kernel + have h5 : (rustTimeExpectFailedSym == rustTimeExpectFailedSym) = true := beq_self_eq_true _ + unfold mkTimeMpl + dsimp only + rw [h0, h1, h2, h3, h4, h5] + simp + +private theorem lookupBlockSym_expectFailed_none : + Obj.lookupBlockSym rustTimeExpectFailedSym timeMultiLib.blocks = none := by + decide +kernel + +/-- Generic reduction of `timeAddExpectFailedStubPc timeMpl` to `timeMpl.ρ rustTimeExpectFailedSym` + for **any** `timeMpl : Obj.MultiPlacement` (`rustTimeExpectFailedSym` is external to all 3 + `timeMultiLib` blocks). -/ +theorem timeAddExpectFailedStubPc_eq_rho (timeMpl : Obj.MultiPlacement) : + timeAddExpectFailedStubPc timeMpl = timeMpl.ρ rustTimeExpectFailedSym := by + unfold timeAddExpectFailedStubPc MultiPlacedLib.blockPlacement MultiPlacedLib.resolve + dsimp only + rw [lookupBlockSym_expectFailed_none] + +theorem mkTimeMpl_expectFailedStubPc + (subTimespecBase durEntry addEntry : BitVec 64) + (cst16Addr roStr1Addr roLanon148Addr dataRelRo150Addr roLanon678Addr : BitVec 64) + (expectFailedAddr : BitVec 64) : + timeAddExpectFailedStubPc + (mkTimeMpl subTimespecBase durEntry addEntry + cst16Addr roStr1Addr roLanon148Addr dataRelRo150Addr roLanon678Addr + expectFailedAddr) = expectFailedAddr := by + rw [timeAddExpectFailedStubPc_eq_rho, mkTimeMpl_rho_expectFailed] + +/-! ## 2. Generic `Placeable` and Premise Combinators (`checkProgCodeSubslice` in `CodeSubslice`) -/ + +/-- Generic decidable `Placeable` bridge for `timeMultiLib`. -/ +theorem timeMultiLib_placeable_of_check {timeMpl : Obj.MultiPlacement} + (hchk : timeMultiLib.checkPlaceable timeMpl = true) : + timeMultiLib.Placeable timeMpl := + MultiPlacedLib.placeable_of_checkPlaceable hchk + +/-- Generic `GhostRowSpecOk` bridge for `lsDurationSinceSym` from decidable `checkPlaceable`. -/ +theorem durationSinceGhost_rowSpecOk_of_check [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hchk : timeMultiLib.checkPlaceable timeMpl = true) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) : + GhostRowSpecOk lsDurationSinceSym (durationSinceGhost timeMpl) := + durationSinceGhost_rowSpecOk timeMpl (timeMultiLib_placeable_of_check hchk) hb1 + +/-- Generic interval inclusion for `keepR_durationSince timeMpl`. -/ +theorem keepR_durationSince_sub_interval {timeMpl : Obj.MultiPlacement} + {lo hi pc : BitVec 64} + (hlo : lo.toNat ≤ (timeMpl.base 0).toNat) + (hhi : (timeMpl.base 0).toNat + durationSinceHullByteLen ≤ hi.toNat) + (hk : keepR_durationSince timeMpl pc = true) : + decide (lo.toNat ≤ pc.toNat ∧ pc.toNat < hi.toNat) = true := by + unfold keepR_durationSince at hk + rw [decide_eq_true_eq] at hk ⊢ + have htop : hi.toNat < 2 ^ 64 := BitVec.isLt hi + have hpc_eq : pc = timeMpl.base 0 + (pc - timeMpl.base 0) := by bv_omega + have htoNat : pc.toNat = (timeMpl.base 0).toNat + (pc - timeMpl.base 0).toNat := by + conv => lhs; rw [hpc_eq] + rw [BitVec.toNat_add, Nat.mod_eq_of_lt (by omega)] + omega + +/-- Generic `hInvKeep` combinator for `InvS u := InvMem u.mem`. -/ +theorem invS_mem_keepsFrozen {InvMem : Memory → Prop} + (hMemKeep : ∀ m1 m2 : Memory, InvMem m1 → m1.KeepsFrozen m2 → InvMem m2) : + ∀ u v : State, InvMem u.mem → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvMem v.mem := + fun u v hu hkf _ => hMemKeep u.mem v.mem hu hkf + +/-- Generic `hInvKeep` combinator for `InvS u := InvMem u.mem ∧ PredFs u.fs` + (matching `ExtraGhostReplay.block617TransferFixedG_of_extraRow`). -/ +theorem invS_mem_fs_keepsFrozen {InvMem : Memory → Prop} {PredFs : FsState → Prop} + (hMemKeep : ∀ m1 m2 : Memory, InvMem m1 → m1.KeepsFrozen m2 → InvMem m2) : + ∀ u v : State, (InvMem u.mem ∧ PredFs u.fs) → u.mem.KeepsFrozen v.mem → v.fs = u.fs → + (InvMem v.mem ∧ PredFs v.fs) := by + intro u v ⟨hmem, hfs⟩ hkf hvfs + exact ⟨hMemKeep u.mem v.mem hmem hkf, hvfs ▸ hfs⟩ + +/-! ## 3. Concrete Cutover-2 `c2TimeMpl` & Shared `timeMultiLib` Facts -/ + +/-! ### Cutover-2 `.rodata.lib2` Local Data-Symbol Offsets (Gate ELF `50066cbd…98ce`) + +The 4 anonymous/section-local `timeMultiLib` RO data symbols (`str1.1`, `.Lanon.148`, +`.Lanon.150`, `.Lanon.678`) are stripped from `.symtab` by `ld.lld` and therefore expressed +relative to the generator-emitted `.rodata.lib2` anchors (`c2FromUtf8TableAddr`, +`c2DurationSinceCst16Addr`, `c2Lib2RoLo`). Their encoded `adrp + add` / `ldr` words in `.text.lib2` +are kernel-verified against `Tie.f3TrialRxProg` via `checkProgCodeSubslice` (`hRxDur` / `hRxAdd`). -/ + +/-- `rust_time:.rodata.str1.1+0x0` (`73` B, `align = 1`): placed immediately before + `c2FromUtf8TableAddr` in `.rodata.lib2` on gate ELF `50066cbd`. Not referenced directly by + code instructions in blocks `0..2` (referenced only by `.data.rel.ro..Lanon.150` `+0` `abs64`). -/ +abbrev c2TimeRoStr1Addr : BitVec 64 := c2FromUtf8TableAddr - 73#64 + +/-- `rust_time:.rodata..Lanon.148` (`25` B, `align = 1`): placed immediately after the `16`-byte + `c2DurationSinceCst16Addr` mask in `.rodata.lib2` on gate ELF `50066cbd`. Encoded in block `0` + (`sub_timespec`, inside `durationSinceSubProg c2TimeMpl`) at `+216` (`adrpHi21`) and `+220` + (`addLo12`), pinned by `hRxDur`. -/ +abbrev c2TimeRoLanon148Addr : BitVec 64 := c2DurationSinceCst16Addr + 16#64 + +/-- `rust_time:.data.rel.ro..Lanon.150` (`24` B, `align = 8`, `abs64` reloc at `+0` to `str1.1`): + placed at `c2Lib2RoLo + 48` in `.rodata.lib2` on gate ELF `50066cbd`. Encoded in block `0` + (`sub_timespec`, inside `durationSinceSubProg c2TimeMpl`) at `+224` (`adrpHi21`) and `+228` + (`addLo12`), pinned by `hRxDur`. -/ +abbrev c2TimeDataRelRoLanon150Addr : BitVec 64 := c2Lib2RoLo + 48#64 + +/-- `rust_time:.rodata..Lanon.678` (`45` B, `align = 1`): placed immediately after `.Lanon.148` + (`+16 + 25 = +41` from `c2DurationSinceCst16Addr`, last in `.rodata.lib2`) on gate ELF + `50066cbd`. Encoded in block `2` (`SystemTime::add`, inside `timeAddSubProg c2TimeMpl`) at + `+76` (`adrpHi21`) and `+80` (`addLo12`), pinned by `hRxAdd`. -/ +abbrev c2TimeRoLanon678Addr : BitVec 64 := c2DurationSinceCst16Addr + 41#64 + +/-- Concrete Cutover-2 `Obj.MultiPlacement` for `VerifiedLibraries.RustStd.timeMultiLib` + (blocks: `Timespec::sub_timespec`, `SystemTime::duration_since`, `SystemTime::add`), shared by + the `duration_since` and `SystemTime::add` C2 glue modules. -/ +@[expose] noncomputable def c2TimeMpl : Obj.MultiPlacement := + mkTimeMpl + c2SubTimespecAddr c2DurationSinceAddr c2TimeAddAddr + c2DurationSinceCst16Addr + c2TimeRoStr1Addr c2TimeRoLanon148Addr c2TimeDataRelRoLanon150Addr c2TimeRoLanon678Addr + (libsignalSessionLib.resolve cliElfMultiPlacement lsExpectFailedSymC2) + +theorem c2TimeMpl_base0 : c2TimeMpl.base 0 = c2SubTimespecAddr := rfl + +theorem c2TimeMpl_base1 : c2TimeMpl.base 1 = c2DurationSinceAddr := rfl + +theorem c2TimeMpl_base2 : c2TimeMpl.base 2 = c2TimeAddAddr := rfl + +theorem c2TimeMpl_fnAddr_timeAdd : + timeMultiLib.fnAddr c2TimeMpl timeAddSym = c2TimeAddAddr := + timeAddEntryAddr_eq_base2 c2TimeMpl + +/-- Exact `hTargetEq` premise of `TimeAddGhostReplays.timeAddGhost_rowOk` at `c2TimeMpl` from + `hResAdd : libsignalSessionLib.resolve mpl lsTimeAddSym = c2TimeAddAddr`. -/ +theorem c2_timeAdd_hTargetEq {mpl : Obj.MultiPlacement} + (hResAdd : libsignalSessionLib.resolve mpl lsTimeAddSym = c2TimeAddAddr) : + libsignalSessionLib.resolve mpl lsTimeAddSym = + timeMultiLib.fnAddr c2TimeMpl timeAddSym := by + rw [hResAdd, c2TimeMpl_fnAddr_timeAdd] + +/-- Exact `hRho` premise consumed by `DurCst16.f3CodeInv_roDataAt_timeCst16` and + `DurCst16.durationSince_hRo_of_f3CodeInv`. -/ +theorem c2TimeMpl_hRho : + c2TimeMpl.ρ timeRodataCst16Sym = c2DurationSinceCst16Addr := + mkTimeMpl_rho_cst16 _ _ _ _ _ _ _ _ _ + +/-- Panic-stub target of `SystemTime::add` under `c2TimeMpl` equals `cliElfMultiPlacement`'s + resolution of `lsExpectFailedSymC2`. -/ +theorem c2TimeMpl_expectFailedStubPc : + timeAddExpectFailedStubPc c2TimeMpl = + libsignalSessionLib.resolve cliElfMultiPlacement lsExpectFailedSymC2 := + mkTimeMpl_expectFailedStubPc _ _ _ _ _ _ _ _ _ + +/-- For any `mpl` satisfying `libsignalSessionLib.LinkedAt cliElfBytes mpl`, + `timeAddExpectFailedStubPc c2TimeMpl` equals `libsignalSessionLib.resolve mpl lsExpectFailedSymC2` + (`0` pending C2 hypotheses — holds both pre-T4 and post-T4). -/ +theorem c2TimeMpl_expectFailedStubPc_of_linkedAt {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + timeAddExpectFailedStubPc c2TimeMpl = + libsignalSessionLib.resolve mpl lsExpectFailedSymC2 := by + have huniq := cliElf_linkedAt_unique hLs + have hmem : lsExpectFailedSymC2 ∈ lsInternedMultiLib.names := + decide_eq_true_eq.mp (by rfl_kernel) + exact c2TimeMpl_expectFailedStubPc.trans (huniq.2.1 lsExpectFailedSymC2 hmem).symm + +/-- Kernel-checked `timeMultiLib.checkPlaceable c2TimeMpl = true`. -/ +theorem c2TimeMpl_checkPlaceable : + timeMultiLib.checkPlaceable c2TimeMpl = true := by + rfl_kernel + +/-- Exact `hpl` premise consumed by `durationSinceGhost_rowSpecOk`, `durationSinceGhost_rowOk`, + `timeAddGhost_rowSpecOk`, and `timeAddGhost_rowOk` (`0` pending hypotheses). -/ +theorem c2TimeMpl_placeable : + timeMultiLib.Placeable c2TimeMpl := + timeMultiLib_placeable_of_check c2TimeMpl_checkPlaceable + +/-- Exact `hb1` premise consumed by `durationSinceGhost_rowSpecOk` and `durationSinceGhost_rowOk` + (`0` pending hypotheses). -/ +theorem c2TimeMpl_hb1 : + c2TimeMpl.base 1 = c2TimeMpl.base 0 + subTimespecByteLen := by + decide +kernel + +/-- Unconditional Cutover-2 `GhostRowSpecOk` discharge for `lsDurationSinceSym` at `c2TimeMpl` + (`0` pending hypotheses). -/ +theorem c2_durationSinceGhost_rowSpecOk [LibsignalPlacement] : + GhostRowSpecOk lsDurationSinceSym (durationSinceGhost c2TimeMpl) := + durationSinceGhost_rowSpecOk c2TimeMpl c2TimeMpl_placeable c2TimeMpl_hb1 + +/-! ## 4. Concrete Cutover-2 `durationSinceGhost_rowOk` Premises & Combined Row Theorem -/ + +theorem lsDurationSinceSym_mem_c2Lib2DehookedSyms : + lsDurationSinceSym ∈ c2Lib2DehookedSyms := + decide_eq_true_eq.mp (by rfl_kernel) + +/-- Exact `hTargetEq` premise of `durationSinceGhost_rowOk` at `c2TimeMpl` from + `hResDur : libsignalSessionLib.resolve mpl lsDurationSinceSym = c2DurationSinceAddr`. -/ +theorem c2_durationSince_hTargetEq {mpl : Obj.MultiPlacement} + (hResDur : libsignalSessionLib.resolve mpl lsDurationSinceSym = c2DurationSinceAddr) : + libsignalSessionLib.resolve mpl lsDurationSinceSym = + c2TimeMpl.base 0 + subTimespecByteLen := by + rw [hResDur, ← c2TimeMpl_base1, c2TimeMpl_hb1] + +/-- Unconditional hull inclusion `keepR_durationSince c2TimeMpl ⊆ keepLib2Text`. -/ +theorem keepR_durationSince_c2_sub_keepLib2Text {pc : BitVec 64} + (h : keepR_durationSince c2TimeMpl pc = true) : + keepLib2Text pc = true := + keepR_durationSince_sub_interval + (decide_eq_true_eq.mp (by rfl_kernel)) + (decide_eq_true_eq.mp (by rfl_kernel)) + h + +/-- Unconditional hull inclusion `keepR_durationSince c2TimeMpl ⊆ progKeep f3TrialRxProg`. -/ +theorem keepR_durationSince_c2_sub_rxProg {pc : BitVec 64} + (h : keepR_durationSince c2TimeMpl pc = true) : + progKeep f3TrialRxProg pc = true := + keepLib2Text_sub_rxProg (keepR_durationSince_c2_sub_keepLib2Text h) + +/-- Exact `hCL` premise of `durationSinceGhost_rowOk` at `c2TimeMpl` from `F3CodeInv` and the + per-row RX byte-slice premise `hRxDur` (closed by `rfl_kernel` at T4). -/ +theorem c2_durationSince_hCL + (hRxDur : checkProgCodeSubslice f3TrialRxProg (durationSinceSubProg c2TimeMpl) = true) + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + (hInv : ∀ u : State, InvS u → F3CodeInv mpl mmpl u.mem) : + ∀ u : State, InvS u → (durationSinceSubProg c2TimeMpl).CodeLoaded u.mem := + fun u hu => codeLoaded_of_checkProgCodeSubslice (hInv u hu).rxCode hRxDur + +/-- Exact `hCL` premise of `TimeAddGhostReplays.timeAddGhost_rowOk` at `c2TimeMpl` from `F3CodeInv` + and the per-row RX byte-slice premise `hRxAdd` (closed by `rfl_kernel` at T4). -/ +theorem c2_timeAdd_hCL + (hRxAdd : checkProgCodeSubslice f3TrialRxProg (timeAddSubProg c2TimeMpl) = true) + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + (hInv : ∀ u : State, InvS u → F3CodeInv mpl mmpl u.mem) : + ∀ u : State, InvS u → (timeAddSubProg c2TimeMpl).CodeLoaded u.mem := + fun u hu => codeLoaded_of_checkProgCodeSubslice (hInv u hu).rxCode hRxAdd + +/-- Exact `hInvKeep` premise of `durationSinceGhost_rowOk` for `InvS u := F3CodeInv mpl mmpl u.mem`. -/ +theorem c2_f3CodeInv_hInvKeep (mpl mmpl : Obj.MultiPlacement) : + ∀ u v : State, F3CodeInv mpl mmpl u.mem → u.mem.KeepsFrozen v.mem → v.fs = u.fs → + F3CodeInv mpl mmpl v.mem := + invS_mem_keepsFrozen (fun _ _ h hkf => h.of_keepsFrozen hkf) + +/-- Exact `hInvKeep` premise of `durationSinceGhost_rowOk` for + `InvS u := F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs` + (the state invariant shape of `ExtraGhostReplay.block617TransferFixedG_of_extraRow`). -/ +theorem c2_f3CodeInv_and_fs_hInvKeep (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) : + ∀ u v : State, (F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) → + u.mem.KeepsFrozen v.mem → v.fs = u.fs → + (F3CodeInv mpl mmpl v.mem ∧ PredFs v.fs) := + invS_mem_fs_keepsFrozen (fun _ _ h hkf => h.of_keepsFrozen hkf) + +/-- Exact `hKeep` premise of `durationSinceGhost_rowOk` at `c2TimeMpl` (`0` pending C2 hypotheses): + every caller return address `LsRetAddr624 lr` lies strictly below `c2FirstExternStubAddr ≤ + c2Lib2TextLo`, hence outside `keepR_durationSince c2TimeMpl`. -/ +theorem c2_durationSince_hKeep [LibsignalPlacement] + (hLsLsmpl : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + ∀ lr : BitVec 64, LsRetAddr624 lr → keepR_durationSince c2TimeMpl lr = false := by + intro lr hRet + have hlt := f3LsRetAddr624_lt_firstExternStub hLsLsmpl hRet + have hlo : c2FirstExternStubAddr.toNat ≤ c2Lib2TextLo.toNat := + decide_eq_true_eq.mp (by rfl_kernel) + cases hk : keepR_durationSince c2TimeMpl lr + · rfl + · have hlib2 := keepR_durationSince_c2_sub_keepLib2Text hk + unfold keepLib2Text at hlib2 + rw [decide_eq_true_eq] at hlib2 + omega + +/-- Exact `hRealHullNoExt` premise of `durationSinceGhost_rowOk` at `c2TimeMpl` from + `C2ExternTableFacts mpl`. -/ +theorem c2_durationSince_hRealHullNoExt {mpl mmpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) : + ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_durationSince c2TimeMpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := + fun W _ hkeep => + f3RxSeg_realProg617_externAt_none hExt W (keepR_durationSince_c2_sub_rxProg hkeep) + +/-- Combined Cutover-2 `GhostRowOk` discharge for `lsDurationSinceSym` at `c2TimeMpl` for any + `KeepsFrozen`/`fs`-stable `InvS` projecting to `F3CodeInv mpl mmpl u.mem`. -/ +theorem c2_durationSinceGhost_rowOk_of_inv [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hRoSlice : C2RoSliceFacts) + (hExt : C2ExternTableFacts mpl) + (hRxDur : checkProgCodeSubslice f3TrialRxProg (durationSinceSubProg c2TimeMpl) = true) + (hResDur : libsignalSessionLib.resolve mpl lsDurationSinceSym = c2DurationSinceAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hLsLsmpl : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) + (hInv : ∀ u : State, InvS u → F3CodeInv mpl mmpl u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) : + GhostRowOk mpl mmpl InvS EG lsDurationSinceSym (fun _ => True) + (durationSinceGhost c2TimeMpl) := + durationSinceGhost_rowOk mpl mmpl c2TimeMpl InvS EG + c2TimeMpl_placeable + c2TimeMpl_hb1 + (c2_durationSince_hTargetEq hResDur) + (c2_durationSince_hCL hRxDur hInv) + (durationSince_hRo_of_f3CodeInv hRoSlice hLs c2TimeMpl_hRho hInv) + hInvKeep + (c2_durationSince_hKeep hLsLsmpl) + (c2_durationSince_hRealHullNoExt hExt) + +/-- Combined Cutover-2 `GhostRowOk` discharge for `lsDurationSinceSym` at `c2TimeMpl` for + `InvS := fun u => F3CodeInv mpl mmpl u.mem`. -/ +theorem c2_durationSinceGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (EG : CliHooks → String → Option (State → State)) + (hRoSlice : C2RoSliceFacts) + (hExt : C2ExternTableFacts mpl) + (hRxDur : checkProgCodeSubslice f3TrialRxProg (durationSinceSubProg c2TimeMpl) = true) + (hResDur : libsignalSessionLib.resolve mpl lsDurationSinceSym = c2DurationSinceAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hLsLsmpl : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk mpl mmpl (fun u => F3CodeInv mpl mmpl u.mem) EG lsDurationSinceSym + (fun _ => True) (durationSinceGhost c2TimeMpl) := + c2_durationSinceGhost_rowOk_of_inv mpl mmpl (fun u => F3CodeInv mpl mmpl u.mem) EG + hRoSlice hExt hRxDur hResDur hLs hLsLsmpl + (fun _ h => h) + (c2_f3CodeInv_hInvKeep mpl mmpl) + +/-- Combined Cutover-2 `GhostRowOk` discharge for `lsDurationSinceSym` at `c2TimeMpl` for + `InvS := fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs` + (matching `ExtraGhostReplay.block617TransferFixedG_of_extraRow`). -/ +theorem c2_durationSinceGhost_rowOk_and_fs [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (EG : CliHooks → String → Option (State → State)) + (hRoSlice : C2RoSliceFacts) + (hExt : C2ExternTableFacts mpl) + (hRxDur : checkProgCodeSubslice f3TrialRxProg (durationSinceSubProg c2TimeMpl) = true) + (hResDur : libsignalSessionLib.resolve mpl lsDurationSinceSym = c2DurationSinceAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hLsLsmpl : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk mpl mmpl (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) EG lsDurationSinceSym + (fun _ => True) (durationSinceGhost c2TimeMpl) := + c2_durationSinceGhost_rowOk_of_inv mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) EG + hRoSlice hExt hRxDur hResDur hLs hLsLsmpl + (fun _ h => h.1) + (c2_f3CodeInv_and_fs_hInvKeep mpl mmpl PredFs) + +/-- Single-`LinkedAt` (`mpl := lsmpl`) specialization of `c2_durationSinceGhost_rowOk` for + `InvS := fun u => F3CodeInv lsmpl mmpl u.mem`. -/ +theorem c2_durationSinceGhost_rowOk_lsmpl [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (EG : CliHooks → String → Option (State → State)) + (hRoSlice : C2RoSliceFacts) + (hExt : C2ExternTableFacts lsmpl) + (hRxDur : checkProgCodeSubslice f3TrialRxProg (durationSinceSubProg c2TimeMpl) = true) + (hResDur : libsignalSessionLib.resolve lsmpl lsDurationSinceSym = c2DurationSinceAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl (fun u => F3CodeInv lsmpl mmpl u.mem) EG lsDurationSinceSym + (fun _ => True) (durationSinceGhost c2TimeMpl) := + c2_durationSinceGhost_rowOk lsmpl mmpl EG hRoSlice hExt hRxDur hResDur hLs hLs + +/-- Single-`LinkedAt` (`mpl := lsmpl`) specialization of `c2_durationSinceGhost_rowOk_and_fs` for + `InvS := fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs` + (matching `ExtraOk` / `ExtraGhostReplay.block617TransferFixedG_of_extraRow`). -/ +theorem c2_durationSinceGhost_rowOk_lsmpl_and_fs [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (EG : CliHooks → String → Option (State → State)) + (hRoSlice : C2RoSliceFacts) + (hExt : C2ExternTableFacts lsmpl) + (hRxDur : checkProgCodeSubslice f3TrialRxProg (durationSinceSubProg c2TimeMpl) = true) + (hResDur : libsignalSessionLib.resolve lsmpl lsDurationSinceSym = c2DurationSinceAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) EG lsDurationSinceSym + (fun _ => True) (durationSinceGhost c2TimeMpl) := + c2_durationSinceGhost_rowOk_and_fs lsmpl mmpl PredFs EG hRoSlice hExt hRxDur hResDur hLs hLs + +/-- `GhostRowReplayOn` projection of `c2_durationSinceGhost_rowOk_lsmpl_and_fs` for direct + `ExtraListReplaysOn` / `block617TransferFixedG_of_extraRow` consumption. -/ +theorem c2_durationSinceGhost_rowReplayOn_lsmpl_and_fs [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (EG : CliHooks → String → Option (State → State)) + (hRoSlice : C2RoSliceFacts) + (hExt : C2ExternTableFacts lsmpl) + (hRxDur : checkProgCodeSubslice f3TrialRxProg (durationSinceSubProg c2TimeMpl) = true) + (hResDur : libsignalSessionLib.resolve lsmpl lsDurationSinceSym = c2DurationSinceAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowReplayOn lsmpl mmpl (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) EG + lsDurationSinceSym (fun _ => True) (durationSinceGhost c2TimeMpl) := + (c2_durationSinceGhost_rowOk_lsmpl_and_fs mmpl PredFs EG hRoSlice hExt hRxDur hResDur hLs).2 + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.Time diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/TimeAddPanic.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/TimeAddPanic.lean new file mode 100644 index 000000000..fc40ad10a --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/C2RowLayoutFacts/TimeAddPanic.lean @@ -0,0 +1,689 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.Time -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesDataRefl4 -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts -- proof-setup: allow-public-import +import ProofLib.ProgramReflection +meta import ProofLib.ProgramReflection + +/-! +# Card `W-ADD` — `hPanReal` & `SystemTime::add` Cutover-2 (`C2`) Row Glue +(`HooksDehook.C2RowLayoutFacts.TimeAddPanic`) + +**Checked by Lean. Untrusted (`Role::Proof`).** + +Discharges GK6c §19(d) for the `>::add` (`lsTimeAddSym`) row from +`TimeAddGhostReplays` (`origin/hooks-prep/cc-r0`) at the shared Cutover-2 placement +`C2RowLayoutFacts.Time.c2TimeMpl`, with zero hex literals: + +1. **Panic-Stub PC & `cliExternsPlaced` / `libsignalSessionExterns` Bridge (`§1–§2`):** + - Reuses `C2RowLayoutFacts.Time.timeAddExpectFailedStubPc_eq_rho` and + `c2TimeMpl_expectFailedStubPc_of_linkedAt` to connect `timeAddExpectFailedStubPc c2TimeMpl` + (`rustTimeExpectFailedSym`, crate hash `Cs2kXlt…`) to + `libsignalSessionLib.resolve mpl lsExpectFailedSymC2` (crate hash `Cskxt…`). + - Proves `c2_timeAdd_hPanReal` with **`0` pending C2 hypotheses** (from + `libsignalSessionLib.LinkedAt cliElfBytes mpl` alone) via interned `lookupBlockSymId` + resolution, `ElfCodeMatchesData.ls_block617_externs_eq`, and + `ElfPlaced.cliElf_externs_nodup_of_linkedAt`. +2. **Generic Add-Row Premise Reductions (`§3`):** + - Layout-generic reductions for `hTargetEq`, `hkeep_stub`, `hlr_ne_stub`, `hKeep`, + `hRealHullNoExt`, and `hCL` (via `C2RowLayoutFacts.CodeSubslice.checkProgCodeSubslice`). +3. **Concrete Cutover-2 (`c2TimeMpl`) Row Theorems (`§4`):** + - `c2_timeAddGhost_rowSpecOk`: unconditional wrt C2 bundles (takes only + `libsignalSessionLib.LinkedAt cliElfBytes lsmpl`). + - `c2_timeAddGhost_rowOk_extra`, `c2_timeAddGhost_rowOk_guardOf`, + `c2_timeAddGhost_rowOk_lsmpl_extra`, `c2_timeAddGhost_rowOk_lsmpl_guardOf` (specialized to + `EG := fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')` and + `InvS := fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs` for direct `ExtraOk` consumption), + plus `EG`-polymorphic `c2_timeAddGhost_rowOk*`: discharges `hpl`, `hPanReal`, `hCL`, `hKeep`, + `hlr_ne_stub`, `hRealHullNoExt`, `hTargetEq`, and `hInvKeep` internally, leaving only + `hExt : C2ExternTableFacts mpl`, + `hRxAdd : checkProgCodeSubslice f3TrialRxProg (timeAddSubProg c2TimeMpl) = true` (which also + kernel-pins `.rodata..Lanon.678` at `add+0x4c/+0x50` `adrp + add` and the `bl` to + `expect_failed` at `add+0x5c`), + `hResAdd : libsignalSessionLib.resolve mpl lsTimeAddSym = c2TimeAddAddr`, and `LinkedAt`. +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.TimeAddPanic + +open Arm64 Arm64.Obj Arm64.Process ProofLib ProofLib.ProgramReflection +open VerifiedLibraries.RustStd (rustTimeExpectFailedSym timeAddSym timeMultiLib) +open CryptoVerification (LibsignalPlacement libsignalSessionExterns lsmpl) +open CryptoVerification.SignalSession + (CliHooks cliElfBytes cliExternsPlaced isCliPanicSymbolPlaced libsignalSessionLib lsTimeAddSym) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (LsRetAddr624) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.CodeSubslice + (checkProgCodeSubslice codeLoaded_of_checkProgCodeSubslice) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.Time + (c2_f3CodeInv_and_fs_hInvKeep c2_f3CodeInv_hInvKeep c2_timeAdd_hCL c2TimeMpl c2TimeMpl_base2 + c2TimeMpl_expectFailedStubPc c2TimeMpl_expectFailedStubPc_of_linkedAt c2TimeMpl_fnAddr_timeAdd + c2TimeMpl_placeable timeAddExpectFailedStubPc_eq_rho) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + (GhostRowOk GhostRowReplayOn) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddGhostReplays + (keepR_timeAdd timeAddEntryGuard timeAddGhost timeAddGhost_rowOk timeAddGhost_rowReplayOn + timeAddGhost_rowSpecOk timeAddSubProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddPanicGhost + (keepTimeAddBlk2 timeAddEntryAddr_eq_base2 timeAddExpectFailedStubPc) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraGhostTable GhostRowSpecOk cliGhostExternsWithExtra) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesData + (ls_block617_externs_eq ls_idsOk) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Tie (f3TrialRxProg) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + (C2ExternTableFacts f3LsRetAddr624_lt_firstExternStub f3LsRetAddr624_ne_panicStubs + f3RxSeg_realProg617_externAt_none keepLib2Text keepLib2Text_sub_rxProg lsExpectFailedSymC2) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics (F3CodeInv) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfPlaced + (cliElfMultiPlacement cliElf_externs_nodup_of_linkedAt lsInternedMultiLib lsSharedExterns + ls_names_nodup ls_toMultiPlacedLib_eq) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen + (c2FirstExternStubAddr c2Lib2TextLo c2TimeAddAddr) + +/-! ## 1. CLI `expect_failed` Symbol (`lsExpectFailedSymC2`) & `cliExternsPlaced` Membership -/ + +theorem isCliPanicSymbolPlaced_lsExpectFailedSymC2 : + isCliPanicSymbolPlaced lsExpectFailedSymC2 = true := by + decide + +theorem cliExternsPlaced_lsExpectFailedSymC2 (mmpl : Obj.MultiPlacement) (W : CliHooks) : + cliExternsPlaced mmpl W lsExpectFailedSymC2 = some Rust.panicked := by + unfold cliExternsPlaced + rw [isCliPanicSymbolPlaced_lsExpectFailedSymC2] + rfl + +theorem lsExpectFailedSymC2_mem_libsignalSessionExterns : + lsExpectFailedSymC2 ∈ libsignalSessionExterns := by + decide + +/-! ## 2. Block-`617` `externAt?` & Generic `hPanReal` Discharge -/ + +private theorem findSome?_eq_none_of_forall_ne {α β γ : Type} [BEq β] [LawfulBEq β] + {xs : List α} {f : α → β} (g : α → Option γ) {v : β} + (hne : ∀ e ∈ xs, f e ≠ v) : + (xs.findSome? fun e => if f e == v then g e else none) = none := by + induction xs with + | nil => rfl + | cons a rest ih => + have ha : (f a == v) = false := beq_eq_false_iff_ne.mpr (hne a (.head _)) + simp only [List.findSome?_cons, ha, Bool.false_eq_true, ↓reduceIte] + exact ih (fun e he => hne e (.tail _ he)) + +private theorem findSome?_eq_of_nodup_map {α β γ : Type} [BEq β] [LawfulBEq β] + {xs : List α} {f : α → β} (g : α → Option γ) {x : α} + (hMem : x ∈ xs) (hNodup : (xs.map f).Nodup) : + (xs.findSome? fun e => if f e == f x then g e else none) = g x := by + induction xs with + | nil => cases hMem + | cons a rest ih => + rw [List.map_cons, List.nodup_cons] at hNodup + rcases hNodup with ⟨ha_not_mem, hrest_nd⟩ + by_cases hax : f a == f x + · have heq_fa : f a = f x := beq_iff_eq.mp hax + rcases List.mem_cons.mp hMem with rfl | hx_rest + · simp only [List.findSome?_cons, beq_self_eq_true, ↓reduceIte] + have htail : + (rest.findSome? fun e => if f e == f x then g e else none) = none := + findSome?_eq_none_of_forall_ne g fun e he hfe => + ha_not_mem (hfe ▸ List.mem_map_of_mem he) + cases g x <;> simp [htail] + · exact absurd (heq_fa ▸ List.mem_map_of_mem hx_rest) ha_not_mem + · simp only [Bool.not_eq_true] at hax + rcases List.mem_cons.mp hMem with rfl | hx_rest + · simp at hax + · simp only [List.findSome?_cons, hax, Bool.false_eq_true, ↓reduceIte] + exact ih hx_rest hrest_nd + +/-- Characterize `(cliProgExtPlacedAt mpl ext 617 W).externAt? pc` via `findSome?` over + `(libsignalSessionLib.blockLib 617).text.externs` and `libsignalSessionLib.resolve mpl`. -/ +theorem externAt?_cliProgExtPlacedAt_617 + (mpl : Obj.MultiPlacement) + (ext : CliHooks → String → Option (State → State)) + (W : CliHooks) (pc : BitVec 64) : + (cliProgExtPlacedAt mpl ext 617 W).externAt? pc = + (libsignalSessionLib.blockLib 617).text.externs.findSome? fun e => + if libsignalSessionLib.resolve mpl e == pc then ext W e else none := by + have key : ∀ (b : BitVec 64) (e : String), + ((libsignalSessionLib.resolve mpl e - b).toNat == (pc - b).toNat) = + (libsignalSessionLib.resolve mpl e == pc) := by + intro b e + cases h : libsignalSessionLib.resolve mpl e == pc with + | true => + have heq := beq_iff_eq.mp h + subst heq + simp + | false => + rw [beq_eq_false_iff_ne] at h ⊢ + intro hnat + apply h + have hbv := BitVec.eq_of_toNat_eq hnat + have : (libsignalSessionLib.resolve mpl e - b) + b = (pc - b) + b := congrArg (· + b) hbv + simpa [BitVec.sub_add_cancel] using this + have h0 : ∀ L : List (String × Nat), + L.findSome? (fun _ => (none : Option (State → State))) = none := by + intro L; induction L <;> simp [*] + dsimp only [cliProgExtPlacedAt, MultiPlacedLib.blockProgram, Obj.PlacedLib.program, + MultiPlacedLib.blockPlacement, Program.externAt?, Program.hookAtOff?] + simp only [ite_self, h0, Option.or_none, List.findSome?_map, Function.comp_def, key] + +/-- Lookup `(cliProgExtPlacedAt mpl ext 617 W).externAt?` at `libsignalSessionLib.resolve mpl sym` + under pairwise distinctness of block `617`'s resolved extern addresses. -/ +theorem externAt?_cliProgExtPlacedAt_617_of_nodup_resolve + {mpl : Obj.MultiPlacement} + {ext : CliHooks → String → Option (State → State)} + {sym : String} + (hMem : sym ∈ (libsignalSessionLib.blockLib 617).text.externs) + (hNodup : ((libsignalSessionLib.blockLib 617).text.externs.map + (libsignalSessionLib.resolve mpl)).Nodup) + (W : CliHooks) : + (cliProgExtPlacedAt mpl ext 617 W).externAt? + (libsignalSessionLib.resolve mpl sym) = ext W sym := by + rw [externAt?_cliProgExtPlacedAt_617] + exact findSome?_eq_of_nodup_map (ext W) hMem hNodup + +/-- **Generic `hPanReal` discharge (form 1 — resolved block-`617` extern `Nodup`):** + Matches the `hPanReal` premise of `timeAddGhost_rowReplayOn` (`TimeAddGhostReplays.lean:362`) + and `timeAddGhost_rowOk` (`TimeAddGhostReplays.lean:514`) verbatim. -/ +theorem timeAdd_hPanReal_of_nodup_resolve + (mpl mmpl timeMpl : Obj.MultiPlacement) + (hStubEq : timeAddExpectFailedStubPc timeMpl = + libsignalSessionLib.resolve mpl lsExpectFailedSymC2) + (hMem : lsExpectFailedSymC2 ∈ (libsignalSessionLib.blockLib 617).text.externs) + (hNodup : ((libsignalSessionLib.blockLib 617).text.externs.map + (libsignalSessionLib.resolve mpl)).Nodup) : + ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (timeAddExpectFailedStubPc timeMpl) = some Rust.panicked := by + intro W + rw [hStubEq, + externAt?_cliProgExtPlacedAt_617_of_nodup_resolve hMem hNodup, + cliExternsPlaced_lsExpectFailedSymC2] + +/-- **Generic `hPanReal` discharge (form 2 — `libsignalSessionExterns` + `mpl.ρ` `Nodup`):** + Plugs directly into `ElfPlaced.cliElf_externs_nodup_of_linkedAt` and + `ElfCodeMatchesData.ls_block617_externs_eq` without re-evaluating block `617` in the kernel. -/ +theorem timeAdd_hPanReal_of_externs_eq_nodup_rho + (mpl mmpl timeMpl : Obj.MultiPlacement) + (hStubEq : timeAddExpectFailedStubPc timeMpl = + libsignalSessionLib.resolve mpl lsExpectFailedSymC2) + (hExt617 : (libsignalSessionLib.blockLib 617).text.externs = libsignalSessionExterns) + (hResolveEqRho : ∀ e ∈ libsignalSessionExterns, + libsignalSessionLib.resolve mpl e = mpl.ρ e) + (hNodupRho : (libsignalSessionExterns.map mpl.ρ).Nodup) : + ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (timeAddExpectFailedStubPc timeMpl) = some Rust.panicked := by + have hMem : lsExpectFailedSymC2 ∈ (libsignalSessionLib.blockLib 617).text.externs := by + rw [hExt617] + exact lsExpectFailedSymC2_mem_libsignalSessionExterns + have hMapEq : + (libsignalSessionLib.blockLib 617).text.externs.map (libsignalSessionLib.resolve mpl) = + libsignalSessionExterns.map mpl.ρ := by + rw [hExt617] + exact List.map_congr_left hResolveEqRho + have hNodup : + ((libsignalSessionLib.blockLib 617).text.externs.map + (libsignalSessionLib.resolve mpl)).Nodup := by + rwa [hMapEq] + exact timeAdd_hPanReal_of_nodup_resolve mpl mmpl timeMpl hStubEq hMem hNodup + +set_option maxRecDepth 4000000 in +private theorem ls_sharedExterns_lookupId_ok : + libsignalSessionExterns = + lsSharedExterns.map (fun idx => lsInternedMultiLib.names.getD idx "") ∧ + (lsSharedExterns.all fun idx => + Nat.blt idx lsInternedMultiLib.names.length && + (Obj.Interned.lookupBlockSymId idx lsInternedMultiLib.blocks == none)) = true := by + exact ⟨by rfl_kernel, by rfl_kernel⟩ + +theorem ls_block617_externs_eq_libsignalSessionExterns : + (libsignalSessionLib.blockLib 617).text.externs = libsignalSessionExterns := by + rw [ls_block617_externs_eq, ← ls_sharedExterns_lookupId_ok.1] + +/-- Every extern in `libsignalSessionExterns` is absent from `libsignalSessionLib.blocks`, so + `libsignalSessionLib.resolve mpl e = mpl.ρ e` for all `mpl` (proved via interned integer IDs). -/ +theorem libsignalSessionExterns_resolve_eq_rho (mpl : Obj.MultiPlacement) : + ∀ e ∈ libsignalSessionExterns, libsignalSessionLib.resolve mpl e = mpl.ρ e := by + intro e he + rw [ls_sharedExterns_lookupId_ok.1, List.mem_map] at he + rcases he with ⟨idx, hidx, rfl⟩ + have hall := List.all_eq_true.mp ls_sharedExterns_lookupId_ok.2 idx hidx + simp only [Bool.and_eq_true, Nat.blt_eq, beq_iff_eq] at hall + have hnone : + Obj.lookupBlockSym (lsInternedMultiLib.names.getD idx "") libsignalSessionLib.blocks = + none := by + rw [ls_toMultiPlacedLib_eq, + Obj.Interned.lookupBlockSym_toMultiPlacedLib ls_names_nodup ls_idsOk hall.1] + exact hall.2 + unfold MultiPlacedLib.resolve + rw [hnone] + +/-- **Generic `hPanReal` discharge from `LinkedAt cliElfBytes mpl`:** for any `timeMpl` whose + `timeAddExpectFailedStubPc` equals `libsignalSessionLib.resolve mpl lsExpectFailedSymC2`. -/ +theorem timeAdd_hPanReal_of_linkedAt + {mpl : Obj.MultiPlacement} (mmpl timeMpl : Obj.MultiPlacement) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hStubEq : timeAddExpectFailedStubPc timeMpl = + libsignalSessionLib.resolve mpl lsExpectFailedSymC2) : + ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (timeAddExpectFailedStubPc timeMpl) = some Rust.panicked := + timeAdd_hPanReal_of_externs_eq_nodup_rho mpl mmpl timeMpl hStubEq + ls_block617_externs_eq_libsignalSessionExterns + (libsignalSessionExterns_resolve_eq_rho mpl) + (cliElf_externs_nodup_of_linkedAt hLs) + +/-! ## 3. Generic Add-Row Premise Reductions (`hTargetEq`, `hCL`, `hkeep_stub`, `hlr_ne_stub`, `hKeep`, `hRealHullNoExt`) -/ + +/-- **Generic `hTargetEq` discharge:** matches `TimeAddGhostReplays.lean:353, 505` verbatim. -/ +theorem timeAdd_hTargetEq_of_base2 + {mpl timeMpl : Obj.MultiPlacement} + (hBase2 : libsignalSessionLib.resolve mpl lsTimeAddSym = timeMpl.base 2) : + libsignalSessionLib.resolve mpl lsTimeAddSym = + timeMultiLib.fnAddr timeMpl timeAddSym := by + rw [timeAddEntryAddr_eq_base2] + exact hBase2 + +/-- **Generic `hCL` discharge via `checkProgCodeSubslice`:** matches + `TimeAddGhostReplays.lean:355, 507` verbatim. -/ +theorem timeAdd_hCL_of_checkProgCodeSubslice + {rxProg : Program} {timeMpl : Obj.MultiPlacement} {InvS : State → Prop} + (hChk : checkProgCodeSubslice rxProg (timeAddSubProg timeMpl) = true) + (hInvRx : ∀ u : State, InvS u → rxProg.CodeLoaded u.mem) : + ∀ u : State, InvS u → (timeAddSubProg timeMpl).CodeLoaded u.mem := + fun u hu => codeLoaded_of_checkProgCodeSubslice (hInvRx u hu) hChk + +/-- Generic interval inclusion for `keepR_timeAdd timeMpl` (`96` bytes at `timeMpl.base 2`). -/ +theorem keepR_timeAdd_sub_interval {timeMpl : Obj.MultiPlacement} + {lo hi pc : BitVec 64} + (hlo : lo.toNat ≤ (timeMpl.base 2).toNat) + (hhi : (timeMpl.base 2).toNat + 96 ≤ hi.toNat) + (hk : keepR_timeAdd timeMpl pc = true) : + decide (lo.toNat ≤ pc.toNat ∧ pc.toNat < hi.toNat) = true := by + unfold keepR_timeAdd keepTimeAddBlk2 at hk + rw [decide_eq_true_eq] at hk ⊢ + have htop : hi.toNat < 2 ^ 64 := BitVec.isLt hi + generalize hd : pc - timeMpl.base 2 = d at hk + have hpc_eq : pc = timeMpl.base 2 + d := by subst hd; bv_omega + have htoNat : pc.toNat = (timeMpl.base 2).toNat + d.toNat := by + rw [hpc_eq, BitVec.toNat_add, Nat.mod_eq_of_lt (by omega)] + omega + +/-- **Generic `hkeep_stub` discharge:** matches `TimeAddGhostReplays.lean:380, 393` verbatim when + `timeAddExpectFailedStubPc timeMpl` sits strictly below `timeMpl.base 2`. -/ +theorem timeAdd_hkeep_stub_of_lt_base2 + {timeMpl : Obj.MultiPlacement} + (hNoWrap : (timeMpl.base 2).toNat + 96 ≤ 2 ^ 64) + (hLt : (timeAddExpectFailedStubPc timeMpl).toNat < (timeMpl.base 2).toNat) : + keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) = false := by + unfold keepR_timeAdd keepTimeAddBlk2 + rw [decide_eq_false_iff_not] + bv_omega + +/-- **Generic `hlr_ne_stub` discharge (via stub equality):** matches + `TimeAddGhostReplays.lean:358, 394, 510` verbatim. -/ +theorem timeAdd_hlr_ne_stub_of_stubEq [LibsignalPlacement] + {timeMpl : Obj.MultiPlacement} {stubPc : BitVec 64} + (hStubEq : timeAddExpectFailedStubPc timeMpl = stubPc) + (hNe : ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ stubPc) : + ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl := by + intro lr hlr + rw [hStubEq] + exact hNe lr hlr + +/-- **Generic `hKeep` discharge (subset form):** matches `TimeAddGhostReplays.lean:357, 509` + verbatim. -/ +theorem timeAdd_hKeep_of_subset [LibsignalPlacement] + {timeMpl : Obj.MultiPlacement} {keepCover : BitVec 64 → Bool} + (hSub : ∀ pc : BitVec 64, keepR_timeAdd timeMpl pc = true → keepCover pc = true) + (hCoverFalse : ∀ lr : BitVec 64, LsRetAddr624 lr → keepCover lr = false) : + ∀ lr : BitVec 64, LsRetAddr624 lr → keepR_timeAdd timeMpl lr = false := by + intro lr hlr + cases hk : keepR_timeAdd timeMpl lr + · rfl + · cases (hCoverFalse lr hlr).symm.trans (hSub lr hk) + +/-- **Generic `hRealHullNoExt` discharge (subset form):** matches `TimeAddGhostReplays.lean:359, 511` + verbatim. -/ +theorem timeAdd_hRealHullNoExt_of_subset + {mpl mmpl timeMpl : Obj.MultiPlacement} + {keepCover : BitVec 64 → Bool} + (hSub : ∀ pc : BitVec 64, keepR_timeAdd timeMpl pc = true → keepCover pc = true) + (hNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepCover pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_timeAdd timeMpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := + fun W {_} hk => hNoExt W (hSub _ hk) + +/-! ## 4. Concrete Cutover-2 (`c2TimeMpl`) Premise Discharges & Row Theorems -/ + +/-- **Cutover-2 `hPanReal` at `c2TimeMpl` (`0` pending C2 hypotheses):** + Matches `TimeAddGhostReplays.lean:362, 514` verbatim for any `mpl` satisfying + `libsignalSessionLib.LinkedAt cliElfBytes mpl` (valid both pre-T4 and post-T4). -/ +theorem c2_timeAdd_hPanReal {mpl : Obj.MultiPlacement} (mmpl : Obj.MultiPlacement) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : + ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (timeAddExpectFailedStubPc c2TimeMpl) = some Rust.panicked := + timeAdd_hPanReal_of_linkedAt mmpl c2TimeMpl hLs + (c2TimeMpl_expectFailedStubPc_of_linkedAt hLs) + +/-- Fast `ρ`-projection of `timeAddExpectFailedStubPc c2TimeMpl` avoiding 624-block string lookup. -/ +theorem c2TimeMpl_expectFailedStubPc_eq_cliElf_rho : + timeAddExpectFailedStubPc c2TimeMpl = + cliElfMultiPlacement.ρ lsExpectFailedSymC2 := + c2TimeMpl_expectFailedStubPc.trans + (libsignalSessionExterns_resolve_eq_rho cliElfMultiPlacement + lsExpectFailedSymC2 lsExpectFailedSymC2_mem_libsignalSessionExterns) + +/-- **Cutover-2 `hkeep_stub` at `c2TimeMpl` (`0` pending hypotheses):** + Matches `TimeAddGhostReplays.lean:380, 393` verbatim. -/ +theorem c2_timeAdd_hkeep_stub : + keepR_timeAdd c2TimeMpl (timeAddExpectFailedStubPc c2TimeMpl) = false := by + apply timeAdd_hkeep_stub_of_lt_base2 + · rw [c2TimeMpl_base2] + exact decide_eq_true_eq.mp (by rfl_kernel) + · rw [c2TimeMpl_base2, c2TimeMpl_expectFailedStubPc_eq_cliElf_rho] + exact decide_eq_true_eq.mp (by rfl_kernel) + +/-- **Cutover-2 `hlr_ne_stub` at `c2TimeMpl` (`0` pending C2 hypotheses):** + Matches `TimeAddGhostReplays.lean:358, 394, 510` verbatim. -/ +theorem c2_timeAdd_hlr_ne_stub [LibsignalPlacement] + (hLsLsmpl : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc c2TimeMpl := + timeAdd_hlr_ne_stub_of_stubEq + (c2TimeMpl_expectFailedStubPc_of_linkedAt hLsLsmpl) + (fun _ hRet => (f3LsRetAddr624_ne_panicStubs hLsLsmpl hRet).1) + +/-- **Cutover-2 `GhostRowSpecOk` for `lsTimeAddSym` at `c2TimeMpl` (`0` pending C2 hypotheses):** + Discharges `TimeAddGhostReplays.timeAddGhost_rowSpecOk` (`TimeAddGhostReplays.lean:390`). -/ +theorem c2_timeAddGhost_rowSpecOk [LibsignalPlacement] + (hLsLsmpl : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowSpecOk lsTimeAddSym (timeAddGhost c2TimeMpl) := + timeAddGhost_rowSpecOk c2TimeMpl + c2TimeMpl_placeable + c2_timeAdd_hkeep_stub + (c2_timeAdd_hlr_ne_stub hLsLsmpl) + +/-- **Cutover-2 `hTargetEq` at `c2TimeMpl`:** matches `TimeAddGhostReplays.lean:353, 505` verbatim + from `hResAdd : libsignalSessionLib.resolve mpl lsTimeAddSym = c2TimeAddAddr` + (`c2TimeMpl.base 2 = c2TimeAddAddr` by `rfl`). -/ +theorem c2_timeAdd_hTargetEq {mpl : Obj.MultiPlacement} + (hResAdd : libsignalSessionLib.resolve mpl lsTimeAddSym = c2TimeAddAddr) : + libsignalSessionLib.resolve mpl lsTimeAddSym = + timeMultiLib.fnAddr c2TimeMpl timeAddSym := by + rw [c2TimeMpl_fnAddr_timeAdd] + exact hResAdd + +/-- Unconditional hull inclusion `keepR_timeAdd c2TimeMpl ⊆ keepLib2Text`. -/ +theorem keepR_timeAdd_c2_sub_keepLib2Text {pc : BitVec 64} + (h : keepR_timeAdd c2TimeMpl pc = true) : + keepLib2Text pc = true := by + refine keepR_timeAdd_sub_interval ?_ ?_ h + · rw [c2TimeMpl_base2] + exact decide_eq_true_eq.mp (by rfl_kernel) + · rw [c2TimeMpl_base2] + exact decide_eq_true_eq.mp (by rfl_kernel) + +/-- Unconditional hull inclusion `keepR_timeAdd c2TimeMpl ⊆ progKeep f3TrialRxProg`. -/ +theorem keepR_timeAdd_c2_sub_rxProg {pc : BitVec 64} + (h : keepR_timeAdd c2TimeMpl pc = true) : + progKeep f3TrialRxProg pc = true := + keepLib2Text_sub_rxProg (keepR_timeAdd_c2_sub_keepLib2Text h) + +/-- **Cutover-2 `hKeep` at `c2TimeMpl` (`0` pending C2 hypotheses):** + Matches `TimeAddGhostReplays.lean:357, 509` verbatim. -/ +theorem c2_timeAdd_hKeep [LibsignalPlacement] + (hLsLsmpl : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + ∀ lr : BitVec 64, LsRetAddr624 lr → keepR_timeAdd c2TimeMpl lr = false := by + intro lr hRet + have hlt := f3LsRetAddr624_lt_firstExternStub hLsLsmpl hRet + have hlo : c2FirstExternStubAddr.toNat ≤ c2Lib2TextLo.toNat := + decide_eq_true_eq.mp (by rfl_kernel) + cases hk : keepR_timeAdd c2TimeMpl lr + · rfl + · have hlib2 := keepR_timeAdd_c2_sub_keepLib2Text hk + unfold keepLib2Text at hlib2 + rw [decide_eq_true_eq] at hlib2 + omega + +/-- **Cutover-2 `hRealHullNoExt` at `c2TimeMpl`:** matches `TimeAddGhostReplays.lean:359, 511` + verbatim from `C2ExternTableFacts mpl`. -/ +theorem c2_timeAdd_hRealHullNoExt {mpl mmpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) : + ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_timeAdd c2TimeMpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := + fun W {_} hkeep => + f3RxSeg_realProg617_externAt_none hExt W (keepR_timeAdd_c2_sub_rxProg hkeep) + +/-- Combined Cutover-2 `GhostRowReplayOn` discharge for `lsTimeAddSym` at `c2TimeMpl` for any + `KeepsFrozen`/`fs`-stable `InvS` projecting to `F3CodeInv mpl mmpl u.mem`. -/ +theorem c2_timeAddGhost_rowReplayOn_of_inv [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hExt : C2ExternTableFacts mpl) + (hRxAdd : checkProgCodeSubslice f3TrialRxProg (timeAddSubProg c2TimeMpl) = true) + (hResAdd : libsignalSessionLib.resolve mpl lsTimeAddSym = c2TimeAddAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hLsLsmpl : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) + (hInv : ∀ u : State, InvS u → F3CodeInv mpl mmpl u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) : + GhostRowReplayOn mpl mmpl InvS EG lsTimeAddSym (fun _ => True) + (timeAddGhost c2TimeMpl) := + timeAddGhost_rowReplayOn mpl mmpl c2TimeMpl InvS EG + c2TimeMpl_placeable + (c2_timeAdd_hTargetEq hResAdd) + (c2_timeAdd_hCL hRxAdd hInv) + hInvKeep + (c2_timeAdd_hKeep hLsLsmpl) + (c2_timeAdd_hlr_ne_stub hLsLsmpl) + (c2_timeAdd_hRealHullNoExt hExt) + (c2_timeAdd_hPanReal mmpl hLs) + +/-- Combined Cutover-2 `GhostRowOk` discharge for `lsTimeAddSym` at `c2TimeMpl` for any + `KeepsFrozen`/`fs`-stable `InvS` projecting to `F3CodeInv mpl mmpl u.mem`. -/ +theorem c2_timeAddGhost_rowOk_of_inv [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hExt : C2ExternTableFacts mpl) + (hRxAdd : checkProgCodeSubslice f3TrialRxProg (timeAddSubProg c2TimeMpl) = true) + (hResAdd : libsignalSessionLib.resolve mpl lsTimeAddSym = c2TimeAddAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hLsLsmpl : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) + (hInv : ∀ u : State, InvS u → F3CodeInv mpl mmpl u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) : + GhostRowOk mpl mmpl InvS EG lsTimeAddSym (fun _ => True) + (timeAddGhost c2TimeMpl) := + timeAddGhost_rowOk mpl mmpl c2TimeMpl InvS EG + c2TimeMpl_placeable + (c2_timeAdd_hTargetEq hResAdd) + (c2_timeAdd_hCL hRxAdd hInv) + hInvKeep + (c2_timeAdd_hKeep hLsLsmpl) + (c2_timeAdd_hlr_ne_stub hLsLsmpl) + (c2_timeAdd_hRealHullNoExt hExt) + (c2_timeAdd_hPanReal mmpl hLs) + +/-- Combined Cutover-2 `GhostRowOk` discharge for `lsTimeAddSym` at `c2TimeMpl` for + `InvS := fun u => F3CodeInv mpl mmpl u.mem`. -/ +theorem c2_timeAddGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (EG : CliHooks → String → Option (State → State)) + (hExt : C2ExternTableFacts mpl) + (hRxAdd : checkProgCodeSubslice f3TrialRxProg (timeAddSubProg c2TimeMpl) = true) + (hResAdd : libsignalSessionLib.resolve mpl lsTimeAddSym = c2TimeAddAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hLsLsmpl : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk mpl mmpl (fun u => F3CodeInv mpl mmpl u.mem) EG lsTimeAddSym + (fun _ => True) (timeAddGhost c2TimeMpl) := + c2_timeAddGhost_rowOk_of_inv mpl mmpl (fun u => F3CodeInv mpl mmpl u.mem) EG + hExt hRxAdd hResAdd hLs hLsLsmpl + (fun _ h => h) + (c2_f3CodeInv_hInvKeep mpl mmpl) + +/-- Combined Cutover-2 `GhostRowOk` discharge for `lsTimeAddSym` at `c2TimeMpl` for + `InvS := fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs` + (matching `ExtraGhostReplay.ExtraOk` / `block617TransferFixedG_of_extraRow`). -/ +theorem c2_timeAddGhost_rowOk_and_fs [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (EG : CliHooks → String → Option (State → State)) + (hExt : C2ExternTableFacts mpl) + (hRxAdd : checkProgCodeSubslice f3TrialRxProg (timeAddSubProg c2TimeMpl) = true) + (hResAdd : libsignalSessionLib.resolve mpl lsTimeAddSym = c2TimeAddAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hLsLsmpl : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk mpl mmpl (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) EG lsTimeAddSym + (fun _ => True) (timeAddGhost c2TimeMpl) := + c2_timeAddGhost_rowOk_of_inv mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) EG + hExt hRxAdd hResAdd hLs hLsLsmpl + (fun _ h => h.1) + (c2_f3CodeInv_and_fs_hInvKeep mpl mmpl PredFs) + +/-- Single-placement (`mpl := lsmpl`) specialization of `c2_timeAddGhost_rowOk_and_fs` taking a + single `hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl`. -/ +theorem c2_timeAddGhost_rowOk_lsmpl_and_fs [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (EG : CliHooks → String → Option (State → State)) + (hExt : C2ExternTableFacts lsmpl) + (hRxAdd : checkProgCodeSubslice f3TrialRxProg (timeAddSubProg c2TimeMpl) = true) + (hResAdd : libsignalSessionLib.resolve lsmpl lsTimeAddSym = c2TimeAddAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) EG lsTimeAddSym + (fun _ => True) (timeAddGhost c2TimeMpl) := + c2_timeAddGhost_rowOk_and_fs lsmpl mmpl PredFs EG hExt hRxAdd hResAdd hLs hLs + +/-- `GhostRowReplayOn` projection of `c2_timeAddGhost_rowOk_lsmpl_and_fs` for direct + `ExtraListReplaysOn` / `block617TransferFixedG_of_extraRow` consumption. -/ +theorem c2_timeAddGhost_rowReplayOn_lsmpl_and_fs [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (EG : CliHooks → String → Option (State → State)) + (hExt : C2ExternTableFacts lsmpl) + (hRxAdd : checkProgCodeSubslice f3TrialRxProg (timeAddSubProg c2TimeMpl) = true) + (hResAdd : libsignalSessionLib.resolve lsmpl lsTimeAddSym = c2TimeAddAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowReplayOn lsmpl mmpl (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) EG + lsTimeAddSym (fun _ => True) (timeAddGhost c2TimeMpl) := + (c2_timeAddGhost_rowOk_lsmpl_and_fs mmpl PredFs EG hExt hRxAdd hResAdd hLs).2 + +private theorem ghostRowReplayOn_of_true_guard + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + {EG : CliHooks → String → Option (State → State)} + {sym : String} {f : State → State} + (entryGuard : State → Prop) + (h : GhostRowReplayOn mpl mmpl InvS EG sym (fun _ => True) f) : + GhostRowReplayOn mpl mmpl InvS EG sym entryGuard f := + ⟨h.preserves_execFrozen, fun W s0 sf _ => h.replay_at_stub W s0 sf trivial⟩ + +/-- **Primary `ExtraOk`-shaped Cutover-2 `GhostRowOk` discharge for `lsTimeAddSym`:** + Matches `ExtraOk` / `ExtraListOk` (`ExtraGhostReplay.lean:376-386, 437-456`) directly at + `InvS := fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs`, + `EG := fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')`, and + `entryGuard := timeAddEntryGuard mpl` (`0` `hLook` or `C2RoSliceFacts` premises needed because + `timeAddGhost` is Route-`R0` + `K4` `linkedCallHook`, and `.rodata..Lanon.678` at + `add+0x4c/+0x50` `adrp + add` is kernel-pinned directly by `hRxAdd`). -/ +theorem c2_timeAddGhost_rowOk_extra [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hExt : C2ExternTableFacts mpl) + (hRxAdd : checkProgCodeSubslice f3TrialRxProg (timeAddSubProg c2TimeMpl) = true) + (hResAdd : libsignalSessionLib.resolve mpl lsTimeAddSym = c2TimeAddAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hLsLsmpl : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsTimeAddSym + (timeAddEntryGuard mpl) + (timeAddGhost c2TimeMpl) := + c2_timeAddGhost_rowOk_and_fs mpl mmpl PredFs + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + hExt hRxAdd hResAdd hLs hLsLsmpl + +/-- `guardOf`-specialized `GhostRowOk` for direct arm dispatch in `ExtraListReplaysOn` / + `ExtraListOk` (`ExtraGhostReplay.lean:380-386`) for arbitrary `guardOf : String → State → Prop` + (`0` `hGuard` premise required because `timeAddEntryGuard mpl` is `True`). -/ +theorem c2_timeAddGhost_rowOk_guardOf [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hExt : C2ExternTableFacts mpl) + (hRxAdd : checkProgCodeSubslice f3TrialRxProg (timeAddSubProg c2TimeMpl) = true) + (hResAdd : libsignalSessionLib.resolve mpl lsTimeAddSym = c2TimeAddAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hLsLsmpl : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk mpl mmpl + (fun u => F3CodeInv mpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsTimeAddSym + (guardOf lsTimeAddSym) + (timeAddGhost c2TimeMpl) := by + have hRow := c2_timeAddGhost_rowOk_extra mpl mmpl PredFs g extra + hExt hRxAdd hResAdd hLs hLsLsmpl + exact ⟨hRow.1, ghostRowReplayOn_of_true_guard (guardOf lsTimeAddSym) hRow.2⟩ + +/-- Single-placement (`mpl := lsmpl`) `ExtraOk`-shaped `GhostRowOk` for `lsTimeAddSym` taking a + single `hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl`. -/ +theorem c2_timeAddGhost_rowOk_lsmpl_extra [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hExt : C2ExternTableFacts lsmpl) + (hRxAdd : checkProgCodeSubslice f3TrialRxProg (timeAddSubProg c2TimeMpl) = true) + (hResAdd : libsignalSessionLib.resolve lsmpl lsTimeAddSym = c2TimeAddAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsTimeAddSym + (timeAddEntryGuard lsmpl) + (timeAddGhost c2TimeMpl) := + c2_timeAddGhost_rowOk_extra lsmpl mmpl PredFs g extra hExt hRxAdd hResAdd hLs hLs + +/-- Single-placement (`mpl := lsmpl`) `guardOf`-specialized `GhostRowOk` for `lsTimeAddSym` taking a + single `hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl`. -/ +theorem c2_timeAddGhost_rowOk_lsmpl_guardOf [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) + (PredFs : FsState → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) + (hExt : C2ExternTableFacts lsmpl) + (hRxAdd : checkProgCodeSubslice f3TrialRxProg (timeAddSubProg c2TimeMpl) = true) + (hResAdd : libsignalSessionLib.resolve lsmpl lsTimeAddSym = c2TimeAddAddr) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) : + GhostRowOk lsmpl mmpl + (fun u => F3CodeInv lsmpl mmpl u.mem ∧ PredFs u.fs) + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + lsTimeAddSym + (guardOf lsTimeAddSym) + (timeAddGhost c2TimeMpl) := + c2_timeAddGhost_rowOk_guardOf lsmpl mmpl PredFs guardOf g extra hExt hRxAdd hResAdd hLs hLs + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.TimeAddPanic diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/CliMemcpyRowSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/CliMemcpyRowSat.lean index 7bd70d751..04a824e97 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/CliMemcpyRowSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/CliMemcpyRowSat.lean @@ -57,7 +57,7 @@ open CryptoVerification.E2E.Pqxdh.Initiator (pqxdhMemcpyRegionSpec) open CryptoVerification.LibsignalPublicApi.MessageDecrypt (lsExpectFailedSym) open CryptoVerification.LibsignalPublicApi.StoreKit (withLsCodeRoLoaded) open CryptoVerification.LibsignalTripleRatchet ( - extHookStack framelessMemcpySpec memcpyName memcpyROExtSpec memmoveName memsetName + extHookStack framelessMemcpySpec memcpyName memcpyROExtSpec memsetName sessionMemcpyROXSpec sessionMemcpyRegionSpec sessionMemcpySpec sessionMemsetRegionSpec sessionMemsetSpec withStack ) @@ -72,20 +72,17 @@ open CryptoVerification.SignalSession ( ) open CryptoVerification.SignalSession.Cli.MainHops ( cliExternsPlaced_memcpy_none cliExternsPlaced_memset_none - hookMemcpy_fs hookMemmove_fs hookMemset_fs hookNoop_fs hookOk_withStack + hookMemcpy_fs hookMemset_fs hookNoop_fs hookOk_withStack ) open CryptoVerification.SignalSession.Cli.Run.Placed (lsProg_579) open CryptoVerification.SignalSession.Cli.RunCompose (PksmGhost RunSem) open CryptoVerification.SignalSession.Cli.RunGlue ( - CliGhostHooks IsFsC cliExternsPlaced_row cliGhostExterns cliGhostExterns_alloc + CliGhostHooks IsFsC cliGhostExterns cliGhostExterns_alloc cliGhostExterns_dealloc cliGhostExterns_memcpy_none cliGhostExterns_memcpy_some - cliGhostExterns_memset_none cliGhostExterns_memset_some cliGhostExterns_other - cliGhostExterns_realloc cliGhostExterns_shim hookMemcpy_fsT hookMemset_fsT hookSat_of_eq + cliGhostExterns_memset_none cliGhostExterns_memset_some + cliGhostExterns_realloc cliGhostExterns_shim hookMemcpy_fsT hookMemset_fsT ) open CryptoVerification.SignalSession.Cli.RunProofs.Pksm (pksmParse) -open CryptoVerification.SignalSession.Cli.Slots ( - memmove_row_placed -) open CryptoVerification.SignalSession.Cli.Store.PlacedCommon (CliPanicHooksPlaced) open CryptoVerification.SignalSession.CliExt (memcpyROSpec memcpySpec memsetSpec) open LibsignalBinary.Heap ( @@ -162,7 +159,6 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.PksmTryFromPlacedBudget ) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( allocContractsFsPlaced_of_hookSat allocContractsXCliPlaced_of_hookSat - cliExternsPlaced_memmove_budget_sat cliExternsPlaced_sessionMemmove_budget_sat codecHooksPlaced_of_hookSat publicApiDecHooksPlaced_of_hookSat stage2ContractsMinPlaced_of_hookSat ) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget ( @@ -239,13 +235,12 @@ theorem memcpyStripKeepsFrozen_memcpyGhostHookK HookFsTraced IsFsC f /-- Ghost-compatible `BaseHelperRows` counterpart: replaces `memcpy_eq` and `memset_eq` with -`GhostMemcpyRow` and `GhostMemsetRow` while keeping `memmove_eq`, `bcmp_eq`, `utf8_eq`, +`GhostMemcpyRow` and `GhostMemsetRow` while keeping `bcmp_eq`, `utf8_eq`, `memrchr_eq`, and `panics` unchanged. -/ structure BaseHelperRowsSat (mmpl : Obj.MultiPlacement) (W : CliHooks) (baseExt : LibsignalHooks) : Prop where memcpy_sat : GhostMemcpyRow baseExt memset_sat : GhostMemsetRow baseExt - memmove_eq : baseExt memmoveName = cliExternsPlaced mmpl W memmoveName bcmp_eq : baseExt "bcmp" = cliExternsPlaced mmpl W "bcmp" utf8_eq : baseExt lsFromUtf8Sym = cliExternsPlaced mmpl W lsFromUtf8Sym memrchr_eq : baseExt lsMemrchrSym = cliExternsPlaced mmpl W lsMemrchrSym @@ -308,13 +303,12 @@ theorem BaseHelperRows.toSat {mmpl : Obj.MultiPlacement} {W : CliHooks} BaseHelperRowsSat mmpl W baseExt where memcpy_sat := hMc memset_sat := hMs - memmove_eq := hBase.memmove_eq bcmp_eq := hBase.bcmp_eq utf8_eq := hBase.utf8_eq memrchr_eq := hBase.memrchr_eq panics := hBase.panics -/-- On the `37`-row `cliExternsPlaced mmpl W` (`cliExternsPlaced_memcpy_none`), `cliGhostExterns g` +/-- On the `27`-row `cliExternsPlaced mmpl W` (`cliExternsPlaced_memcpy_none`), `cliGhostExterns g` resolves `memcpyName` strictly to `g.memcpy`. -/ theorem cliGhostExterns_memcpy_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) (g : CliGhostHooks) : @@ -326,7 +320,7 @@ theorem cliGhostExterns_memcpy_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) | some f => exact cliGhostExterns_memcpy_some g (cliExternsPlaced mmpl W) hg -/-- On the `37`-row `cliExternsPlaced mmpl W` (`cliExternsPlaced_memset_none`), `cliGhostExterns g` +/-- On the `27`-row `cliExternsPlaced mmpl W` (`cliExternsPlaced_memset_none`), `cliGhostExterns g` resolves `memsetName` strictly to `g.memset`. -/ theorem cliGhostExterns_memset_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) (g : CliGhostHooks) : @@ -338,27 +332,6 @@ theorem cliGhostExterns_memset_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) | some f => exact cliGhostExterns_memset_some g (cliExternsPlaced mmpl W) hg -/-- Canonical `37`-row `BaseHelperRowsSat` witness for `cliGhostExterns g (cliExternsPlaced mmpl W)` -given `GhostMemcpyRow` and `GhostMemsetRow` on the overlaid extern map. -/ -theorem cliExternsPlaced_baseHelperRowsSat (mmpl : Obj.MultiPlacement) (W : CliHooks) - (g : CliGhostHooks) - (hMc : GhostMemcpyRow (cliGhostExterns g (cliExternsPlaced mmpl W))) - (hMs : GhostMemsetRow (cliGhostExterns g (cliExternsPlaced mmpl W))) : - BaseHelperRowsSat mmpl W (cliGhostExterns g (cliExternsPlaced mmpl W)) where - memcpy_sat := hMc - memset_sat := hMs - memmove_eq := cliGhostExterns_other g (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) - bcmp_eq := cliGhostExterns_other g (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) - utf8_eq := cliGhostExterns_other g (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) - memrchr_eq := cliGhostExterns_other g (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) - panics := cliGhostExterns_panics g - (LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer.cliExternsPlaced_baseHelperRows - mmpl W).panics - theorem GhostMemcpyRow.of_eq {ext₁ ext₂ : LibsignalHooks} (heq : ext₂ memcpyName = ext₁ memcpyName) (h : GhostMemcpyRow ext₁) : GhostMemcpyRow ext₂ := by @@ -383,29 +356,6 @@ theorem GhostMemsetRow.cliGhostExterns {baseExt : LibsignalHooks} (g : CliGhostH GhostMemsetRow (cliGhostExterns g baseExt) := h.of_eq (cliGhostExterns_memset_none g baseExt hNone) -theorem cliGhostExterns_memmove_eq_of_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) - {baseExt : LibsignalHooks} (g : CliGhostHooks) (hBase : BaseHelperRowsSat mmpl W baseExt) : - cliGhostExterns g baseExt memmoveName = cliExternsPlaced mmpl W memmoveName := - (cliGhostExterns_other g baseExt (sym := memmoveName) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans hBase.memmove_eq - -/-- `none`-slot pass-through only (`g.memcpy = none`, `g.memset = none`); not usable on the K or Narrow routes. -/ -theorem BaseHelperRowsSat.cliGhostExterns {mmpl : Obj.MultiPlacement} {W : CliHooks} - {baseExt : LibsignalHooks} (g : CliGhostHooks) - (hMcNone : g.memcpy = none) (hMsNone : g.memset = none) - (hBase : BaseHelperRowsSat mmpl W baseExt) : - BaseHelperRowsSat mmpl W (cliGhostExterns g baseExt) where - memcpy_sat := hBase.memcpy_sat.cliGhostExterns g hMcNone - memset_sat := hBase.memset_sat.cliGhostExterns g hMsNone - memmove_eq := cliGhostExterns_memmove_eq_of_sat mmpl W g hBase - bcmp_eq := (cliGhostExterns_other g baseExt (sym := "bcmp") - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans hBase.bcmp_eq - utf8_eq := (cliGhostExterns_other g baseExt (sym := lsFromUtf8Sym) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans hBase.utf8_eq - memrchr_eq := (cliGhostExterns_other g baseExt (sym := lsMemrchrSym) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans hBase.memrchr_eq - panics := cliGhostExterns_panics g hBase.panics - /-! ## 3. Generic & Contract-Specific `HookSat` Dischargers (`GhostMemcpyRow` & `GhostMemsetRow`) -/ theorem GhostMemcpyRow.hookSat_of_master {α : Type} {ext : LibsignalHooks} {spec : Spec α} @@ -773,10 +723,6 @@ theorem allocContractsXCliPlaced_of_ghost_sat [LibsignalPlacement] (fun stk => hMc.sessionMemcpy_budget_sat stk) hMc.memcpyRegion_budget_sat hMc.sessionMemcpyRegion_budget_sat - (fun stk => hookSat_of_eq hBase.memmove_eq - (cliExternsPlaced_memmove_budget_sat mmpl W stk)) - (fun stk => hookSat_of_eq hBase.memmove_eq - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W stk)) (fun stk _ => hMs.libcMemset_budget_sat stk) (fun stk _ => hMs.sessionMemset_budget_sat stk) hMs.memsetRegion_budget_sat @@ -800,10 +746,6 @@ theorem allocContractsFsPlaced_of_ghost_sat [LibsignalPlacement] hMc.memcpyRegion_budget_sat hMc.sessionMemcpyRegion_budget_sat hMc.sessionMemcpyRegionRO_budget_sat - (fun stk => hookSat_of_eq hBase.memmove_eq - (cliExternsPlaced_memmove_budget_sat mmpl W stk)) - (fun stk => hookSat_of_eq hBase.memmove_eq - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W stk)) (fun stk _ => hMs.libcMemset_budget_sat stk) (fun stk _ => hMs.sessionMemset_budget_sat stk) hMs.memsetRegion_budget_sat @@ -811,16 +753,13 @@ theorem allocContractsFsPlaced_of_ghost_sat [LibsignalPlacement] ?_ intro sym hmem f hf simp only [List.mem_cons, List.not_mem_nil, or_false] at hmem - rcases hmem with rfl | rfl | rfl | rfl | rfl | rfl | rfl + rcases hmem with rfl | rfl | rfl | rfl | rfl | rfl · rw [cliGhostExterns_alloc] at hf; cases hf; exact hG.alloc_fs · rw [cliGhostExterns_dealloc] at hf; cases hf; exact hG.dealloc_fs · rw [cliGhostExterns_realloc] at hf; cases hf; exact hG.realloc_fs · rw [cliGhostExterns_shim, hG.shim_eq] at hf; cases hf; exact hookNoop_fs · rcases hMc with ⟨f_mc, hrow_mc, _, _, hfs_mc, _, _, _⟩ rw [hrow_mc] at hf; cases hf; exact hfs_mc - · rw [hBase.memmove_eq, - cliExternsPlaced_row mmpl W (memmove_row_placed mmpl W)] at hf - cases hf; exact hookMemmove_fs · rcases hMs with ⟨f_ms, hrow_ms, _, _, hfs_ms, _⟩ rw [hrow_ms] at hf; cases hf; exact hfs_ms @@ -836,8 +775,6 @@ theorem stage2ContractsMinPlaced_of_ghost_sat [LibsignalPlacement] ⟨g.realloc, cliGhostExterns_realloc g baseExt, hG.realloc⟩ (shim_budget_sat_of_eq baseExt hG.shim_eq) (hBase.memcpy_sat.sessionMemcpy_budget_sat extHookStack) - (hookSat_of_eq hBase.memmove_eq - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W extHookStack)) theorem codecHooksPlaced_of_ghost_sat [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) (baseExt : LibsignalHooks) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/DurationSinceGhostReplays.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/DurationSinceGhostReplays.lean new file mode 100644 index 000000000..12f734ddd --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/DurationSinceGhostReplays.lean @@ -0,0 +1,628 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.HookDischarge.RustStd.TimeDurationSince -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceCode -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhost -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.LinkedCallHookG -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhostK -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric -- proof-setup: allow-public-import + +/-! +# Card `CC-R0` (Row 2) — `duration_since` Route-`R0` `GhostRowReplayOn` (`HooksDehook.DurationSinceGhostReplays`) + +Cutover-2 `c`-card for `lsDurationSinceSym` (`::duration_since`) on the +Route-`R0` (`WithLsRet.withLsRet` / `LsRetAddr624`) `.text.lib2` track: + +1. **Row Anchor & `W`-Independent Ghost (`keepR_durationSince`, `durationSinceSubProg`, `durationSinceGhost`):** + - `durationSinceSubProg timeMpl := durationSinceHullProg timeMpl` (`80` words = `320` B + contiguous hull at `timeMpl.base 0`: `Timespec::sub_timespec` `60` words at `+0` followed by + `SystemTime::duration_since` `20` words at `+240`). + - `durationSinceGhost timeMpl` wraps `DurationSinceGhostLs.f3EmptyDurationSinceHullGhostHookLs` + (`P_real := emptyStdProg`, `roTableGuard` on `timePlacedData0`, `fallback := durationSinceExactHook`), + so it has **zero `W : CliHooks` dependence**. +2. **State Preservation & `withLsRet` Consumer `HookOk` Arms:** + - Unconditional (`0` layout premises) `durationSinceGhost_fs`, `durationSinceGhost_fsT`, and + `durationSinceGhost_preserves_execFrozen`. + - Under `hpl : timeMultiLib.Placeable timeMpl` and + `hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen`, `durationSinceGhost_vmPreserved` + and `withLsRet` consumer `HookOk` arms matching `DurationSinceRowSpec` (`Slots.durationSinceBoundedSpec` + and bounded-stack `208 ≤ stk ≤ 2 ^ 64` `Slots.durationSinceEpochAtSpec`, plain, + `withVmPreserved`, and `withAlloc`). +3. **Generic-`InvS` `GhostRowReplayOn` (`entryGuard := fun _ => True`, `F1` + `H1` compliant):** + - `hCL` and `hRo` extract `(durationSinceSubProg timeMpl).CodeLoaded u.mem` and + `RoDataAt u.mem (timeMpl.ρ timeRodataCst16Sym) timePlacedData0` at each intermediate call + state `u` from `InvS u` (**H1**; never `s0.mem`). + - `hRealHullNoExt` requires `externAt? pc = none` on `keepR_durationSince timeMpl pc = true` + **only** on the de-hooked real program `cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W` + (**F1**; zero `P_ghost` hull premise). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhostReplays + +open Arm64 Arm64.Obj Arm64.Process ProofLib +open VerifiedLibraries.RustStd (timeMultiLib timePlacedData0 timeRodataCst16Sym) +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession + (CliHooks cliExternsPlaced durationSinceExactHook libsignalSessionLib + lsDurationSinceSym lsFromUtf8Sym lsMemrchrSym) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks IsFsC) +open CryptoVerification.SignalSession.Cli.Slots (durationSinceEpochAtSpec) +open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.HookDischarge.RustStd.Common (RoDataAt) +open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (LsRetAddr624) +open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer + (ExecFrozen keepFsTrace linkedCallHook) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.Ghost617Transfer (StubReachesTargetOn) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceCode + (durationSinceExactHook_vm durationSinceHullProg durationSinceHullProg_externAt_none + durationSinceHullProg_hasWords_durationSince durationSinceHullProg_hasWords_subTimespec + durationSinceHullProg_svc durationSinceHullWords_length) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhost + (durationSinceGhostFnLs durationSinceGhostFnLs_fs durationSinceGhostFnLs_fsT + durationSinceGhostFnLs_keepLr_false_of_noException durationSinceGhostFnLs_vmPreserved + durationSinceHullGhostFnLs durationSinceHullGhostFnLs_masterLs_ok hookOk_congr + hookOk_withLsRet_durationSinceBounded_of_master hookOk_withLsRet_durationSinceEpochAt_of_master + masterDurationSinceLs_outcome_setPC masterDurationSinceLs_pre_setPC + specPreservesFsTrace_masterDurationSinceLs specStripSInvariant_masterDurationSinceLs + subroutine_ok_masterDurationSinceLs_of_hasWords subTimespecByteLen withLsRet_withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + (ExtraEntryGuard GhostRowOk GhostRowReplayOn) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.LinkedCallHookG + (ghostExternReplaysOn_of_linkedCallHookG_roTable_liftVis linkedCallHookG roDataAt_of_keepsFrozen) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhostK + (emptyStdProg emptyStdProg_svc) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords + (codeLoaded_stripExecOutside_of_keep) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc + (hookOk_withAlloc_of_withVmPreserved withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraRowSpec GhostRowSpecOk) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.DurationSinceRowSpec + (DurationSinceRowSpec) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric + (h2fsgen_steps_lift_of_visitedIn_noExtern) + +/-! ## 1. Row Anchor Definitions & `CodeLoaded` `stripExecOutside` Equivalence -/ + +/-- Byte length (`320` B = `80` words) of `sub_timespec` (`240` B) ++ `duration_since` (`80` B). -/ +@[expose] def durationSinceHullByteLen : Nat := 320 + +/-- Kept-region byte predicate `[timeMpl.base 0, timeMpl.base 0 + 320)` covering the contiguous + `sub_timespec ++ duration_since` `.text.lib2` hull. -/ +@[expose] def keepR_durationSince (timeMpl : Obj.MultiPlacement) (pc : BitVec 64) : Bool := + decide ((pc - timeMpl.base 0).toNat < durationSinceHullByteLen) + +theorem keepR_durationSince_entry (timeMpl : Obj.MultiPlacement) : + keepR_durationSince timeMpl (timeMpl.base 0 + subTimespecByteLen) = true := by + unfold keepR_durationSince durationSinceHullByteLen subTimespecByteLen + have hsub : timeMpl.base 0 + 240#64 - timeMpl.base 0 = 240#64 := by bv_omega + rw [hsub] + decide + +/-- Pure `80`-word (`320`-byte) sub-program holding `durationSinceHullWords timeMpl` at + `timeMpl.base 0`. -/ +@[expose] def durationSinceSubProg (timeMpl : Obj.MultiPlacement) : Program := + durationSinceHullProg timeMpl + +theorem durationSinceSubProg_base (timeMpl : Obj.MultiPlacement) : + (durationSinceSubProg timeMpl).base = timeMpl.base 0 := rfl + +theorem durationSinceSubProg_code_length (timeMpl : Obj.MultiPlacement) : + (durationSinceSubProg timeMpl).code.length = durationSinceHullByteLen := by + unfold durationSinceSubProg durationSinceHullProg durationSinceHullByteLen + pureWordsProg Program.ofWords + rw [Program.length_flatMap_wordToBytesLE, durationSinceHullWords_length] + +theorem keepR_durationSince_of_code_offset (timeMpl : Obj.MultiPlacement) {off : Nat} + (hoff : off < (durationSinceSubProg timeMpl).code.length) : + keepR_durationSince timeMpl ((durationSinceSubProg timeMpl).base + BitVec.ofNat 64 off) = + true := by + rw [durationSinceSubProg_code_length] at hoff + rw [durationSinceSubProg_base] + unfold keepR_durationSince + have hsub : timeMpl.base 0 + BitVec.ofNat 64 off - timeMpl.base 0 = BitVec.ofNat 64 off := by + bv_omega + have hoff_lt : off < 2 ^ 64 := by + have hb : durationSinceHullByteLen = 320 := rfl + omega + rw [hsub, BitVec.toNat_ofNat, Nat.mod_eq_of_lt hoff_lt] + exact decide_eq_true hoff + +theorem durationSinceSubProg_codeLoaded_stripExecOutside {timeMpl : Obj.MultiPlacement} + {mem : Memory} + (hL : (durationSinceSubProg timeMpl).CodeLoaded mem) : + (durationSinceSubProg timeMpl).CodeLoaded + (stripExecOutside (keepR_durationSince timeMpl) mem) := + codeLoaded_stripExecOutside_of_keep + (fun _ hoff => keepR_durationSince_of_code_offset timeMpl hoff) hL + +theorem durationSinceSubProg_codeLoaded_of_stripExecOutside {timeMpl : Obj.MultiPlacement} + {mem : Memory} + (hL : (durationSinceSubProg timeMpl).CodeLoaded + (stripExecOutside (keepR_durationSince timeMpl) mem)) : + (durationSinceSubProg timeMpl).CodeLoaded mem := by + refine Program.CodeLoaded.intro hL.aligned hL.no_wrap fun i hi => ?_ + have hk : keepR_durationSince timeMpl + ((durationSinceSubProg timeMpl).base + BitVec.ofNat 64 i) = true := + keepR_durationSince_of_code_offset timeMpl hi + have hbyte := hL.byte_eq i hi + have hperm := hL.perm_eq i hi + have hlf := hL.isLazyFree_eq i hi + rw [ProofLib.strip_read8] at hbyte + rw [ProofLib.strip_perm_of_keep hk] at hperm + rw [ProofLib.strip_isLazyFree] at hlf + exact ⟨hbyte, hperm, hlf⟩ + +theorem durationSinceSubProg_codeLoaded_stripExecOutside_iff {timeMpl : Obj.MultiPlacement} + {mem : Memory} : + (durationSinceSubProg timeMpl).CodeLoaded + (stripExecOutside (keepR_durationSince timeMpl) mem) ↔ + (durationSinceSubProg timeMpl).CodeLoaded mem := + ⟨durationSinceSubProg_codeLoaded_of_stripExecOutside, + durationSinceSubProg_codeLoaded_stripExecOutside⟩ + +/-- Route-`R0` (`withLsRet`) `W`-independent ghost hook for `lsDurationSinceSym`. -/ +@[expose] noncomputable def durationSinceGhost [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) : State → State := + durationSinceHullGhostFnLs (keepR_durationSince timeMpl) emptyStdProg timeMpl (timeMpl.base 0) + +/-- Block-`617` entry-state guard for Route-`R0` `lsDurationSinceSym` (`True`: `LsRetAddr624` is + extracted directly from non-`.Exception` at each call step). -/ +@[expose] def durationSinceEntryGuard (_mpl : Obj.MultiPlacement) (_s0 : State) : Prop := + True + +/-! ## 2. State Preservation & `withLsRet` Consumer `HookOk` Arms -/ + +theorem durationSinceGhost_fs [LibsignalPlacement] (timeMpl : Obj.MultiPlacement) (s : State) : + (durationSinceGhost timeMpl s).fs = s.fs := + durationSinceGhostFnLs_fs (timeMpl.ρ timeRodataCst16Sym) + (keepR_durationSince timeMpl) emptyStdProg (durationSinceHullProg timeMpl) + (timeMpl.base 0 + subTimespecByteLen) s + +theorem durationSinceGhost_fsT [LibsignalPlacement] (timeMpl : Obj.MultiPlacement) : + HookFsTraced IsFsC (durationSinceGhost timeMpl) := + durationSinceGhostFnLs_fsT (timeMpl.ρ timeRodataCst16Sym) + (keepR_durationSince timeMpl) emptyStdProg (durationSinceHullProg timeMpl) + (timeMpl.base 0 + subTimespecByteLen) + +theorem durationSinceGhost_vmPreserved [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) + (s : State) : + VmPreserved s (durationSinceGhost timeMpl s) := by + unfold durationSinceGhost durationSinceHullGhostFnLs + rw [← hb1] + exact durationSinceGhostFnLs_vmPreserved hpl emptyStdProg_svc + (durationSinceHullProg_svc timeMpl) (fun _ _ => rfl) + (durationSinceHullProg_externAt_none timeMpl) + (durationSinceHullProg_hasWords_subTimespec timeMpl) + (hb1 ▸ durationSinceHullProg_hasWords_durationSince timeMpl) s + +theorem durationSinceGhost_masterLs_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) : + HookOk (durationSinceGhost timeMpl) + (withLsRet LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceCode.masterDurationSinceSpec) := + durationSinceHullGhostFnLs_masterLs_ok (timeMpl.base 0) hpl rfl hb1 emptyStdProg_svc + (fun _ _ => rfl) + +theorem durationSinceGhost_bounded_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) : + HookOk (durationSinceGhost timeMpl) + (withLsRet CryptoVerification.SignalSession.Cli.Slots.durationSinceBoundedSpec) := + hookOk_congr (rfl : withLsRet _ = withLsRet _) + (hookOk_withLsRet_durationSinceBounded_of_master + (durationSinceGhost_masterLs_ok timeMpl hpl hb1)) + +theorem durationSinceGhost_bounded_withVmPreserved_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) : + HookOk (durationSinceGhost timeMpl) + (withVmPreserved + (withLsRet CryptoVerification.SignalSession.Cli.Slots.durationSinceBoundedSpec)) := + hookOk_withVmPreserved (durationSinceGhost_bounded_ok timeMpl hpl hb1) + (durationSinceGhost_vmPreserved timeMpl hpl hb1) + +theorem durationSinceGhost_bounded_withAlloc_ls_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) : + HookOk (durationSinceGhost timeMpl) + (withAlloc A lim + (withLsRet CryptoVerification.SignalSession.Cli.Slots.durationSinceBoundedSpec)) := + hookOk_withAlloc_of_withVmPreserved A lim + (durationSinceGhost_bounded_withVmPreserved_ok timeMpl hpl hb1) + +theorem durationSinceGhost_bounded_withAlloc_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) : + HookOk (durationSinceGhost timeMpl) + (withLsRet + (withAlloc A lim CryptoVerification.SignalSession.Cli.Slots.durationSinceBoundedSpec)) := by + rw [withLsRet_withAlloc] + exact hookOk_withAlloc_of_withVmPreserved A lim + (hookOk_withVmPreserved (durationSinceGhost_bounded_ok timeMpl hpl hb1) + (durationSinceGhost_vmPreserved timeMpl hpl hb1)) + +theorem durationSinceGhost_epochAt_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) + (stk : Nat) (hlo : 208 ≤ stk) (hhi : stk ≤ 2 ^ 64) : + HookOk (durationSinceGhost timeMpl) (withLsRet (durationSinceEpochAtSpec stk)) := + hookOk_congr (rfl : withLsRet _ = withLsRet _) + (hookOk_withLsRet_durationSinceEpochAt_of_master + (durationSinceGhost_masterLs_ok timeMpl hpl hb1) ⟨hlo, hhi⟩) + +theorem durationSinceGhost_epochAt_withVmPreserved_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) + (stk : Nat) (hlo : 208 ≤ stk) (hhi : stk ≤ 2 ^ 64) : + HookOk (durationSinceGhost timeMpl) + (withVmPreserved (withLsRet (durationSinceEpochAtSpec stk))) := + hookOk_withVmPreserved (durationSinceGhost_epochAt_ok timeMpl hpl hb1 stk hlo hhi) + (durationSinceGhost_vmPreserved timeMpl hpl hb1) + +theorem durationSinceGhost_epochAt_withAlloc_ls_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) + (stk : Nat) (hlo : 208 ≤ stk) (hhi : stk ≤ 2 ^ 64) : + HookOk (durationSinceGhost timeMpl) + (withAlloc A lim (withLsRet (durationSinceEpochAtSpec stk))) := + hookOk_withAlloc_of_withVmPreserved A lim + (durationSinceGhost_epochAt_withVmPreserved_ok timeMpl hpl hb1 stk hlo hhi) + +theorem durationSinceGhost_epochAt_withAlloc_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) + (stk : Nat) (hlo : 208 ≤ stk) (hhi : stk ≤ 2 ^ 64) : + HookOk (durationSinceGhost timeMpl) + (withLsRet (withAlloc A lim (durationSinceEpochAtSpec stk))) := by + rw [withLsRet_withAlloc] + exact hookOk_withAlloc_of_withVmPreserved A lim + (hookOk_withVmPreserved (durationSinceGhost_epochAt_ok timeMpl hpl hb1 stk hlo hhi) + (durationSinceGhost_vmPreserved timeMpl hpl hb1)) + +/-! ## 3. `ExecFrozen` Preservation & Generic-`InvS` `GhostRowReplayOn` -/ + +private theorem linkedCallHook_preserves_execFrozen {α : Type} + {keep : BitVec 64 → Bool} {P_real P_sub : Program} + {entryTarget : BitVec 64} {spec : Spec α} {fallback : State → State} + (hfb : ∀ s : State, ExecFrozen s.mem → ExecFrozen (fallback s).mem) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (linkedCallHook keep P_real P_sub entryTarget spec fallback u).mem := by + classical + unfold linkedCallHook + split + · split + · rename_i hReal + exact (Classical.choose_spec hReal.2.2.2).2.2.2.2 + · change ExecFrozen (fallback u).mem + exact hfb u hfr + · exact hfr + +private theorem linkedCallHookG_preserves_execFrozen {α : Type} + {Guard : State → Prop} {keep : BitVec 64 → Bool} {P_real P_sub : Program} + {entryTarget : BitVec 64} {spec : Spec α} {fallback : State → State} + (hfb : ∀ s : State, ExecFrozen s.mem → ExecFrozen (fallback s).mem) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (linkedCallHookG Guard keep P_real P_sub entryTarget spec fallback u).mem := by + classical + unfold linkedCallHookG + split + · exact linkedCallHook_preserves_execFrozen hfb hfr + · split + · change ExecFrozen (fallback u).mem + exact hfb u hfr + · exact hfr + +theorem durationSinceGhost_preserves_execFrozen [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (durationSinceGhost timeMpl u).mem := by + unfold durationSinceGhost durationSinceHullGhostFnLs durationSinceGhostFnLs + exact linkedCallHookG_preserves_execFrozen + (fun s hs => ExecFrozen.of_perm_eq hs (durationSinceExactHook_vm s).perm_eq) hfr + +private theorem setPC_eq_self_of_pc_eq {u : State} {pc : BitVec 64} (hpc : u.pc = pc) : + u.setPC pc = u := by + cases u + dsimp only [State.setPC] at hpc ⊢ + subst hpc + rfl + +private theorem realProg617_svc (mpl mmpl : Obj.MultiPlacement) (W : CliHooks) : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).svc = Syscall.standard := + rfl + +private theorem emptyStdProg_externAt (pc : BitVec 64) : + emptyStdProg.externAt? pc = none := + rfl + +/-- Behind-stub (`StubReachesTargetOn`) `GhostRowReplayOn` for `lsDurationSinceSym` (`entryGuard := + fun _ => True`, `F1` + `H1` compliant). -/ +theorem durationSinceGhost_rowReplayOn_of_stub [LibsignalPlacement] + (mpl mmpl timeMpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) + (hCL : ∀ u : State, InvS u → (durationSinceSubProg timeMpl).CodeLoaded u.mem) + (hRo : ∀ u : State, InvS u → + RoDataAt u.mem (timeMpl.ρ timeRodataCst16Sym) timePlacedData0) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hKeep : ∀ lr : BitVec 64, LsRetAddr624 lr → keepR_durationSince timeMpl lr = false) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_durationSince timeMpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hRealStubNone : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl lsDurationSinceSym) = none) + (hStub : ∀ W : CliHooks, + StubReachesTargetOn + (fun m => (durationSinceSubProg timeMpl).CodeLoaded m ∧ + RoDataAt m (timeMpl.ρ timeRodataCst16Sym) timePlacedData0) + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (libsignalSessionLib.resolve mpl lsDurationSinceSym) + (timeMpl.base 0 + subTimespecByteLen)) : + GhostRowReplayOn mpl mmpl InvS EG lsDurationSinceSym (fun _ => True) + (durationSinceGhost timeMpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨durationSinceGhost_preserves_execFrozen timeMpl hfr, + durationSinceGhost_fs timeMpl u⟩ + replay_at_stub := by + intro W _ _ _ _ _ _ _ _ _ + right + have hStub1 : + StubReachesTargetOn + (fun m => (durationSinceSubProg timeMpl).CodeLoaded m ∧ + RoDataAt m (timeMpl.ρ timeRodataCst16Sym) timePlacedData0) + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (libsignalSessionLib.resolve mpl lsDurationSinceSym) + (timeMpl.base 1) := by + rw [hb1] + exact hStub W + have hRep := + ghostExternReplaysOn_of_linkedCallHookG_roTable_liftVis + (InvMem := fun m => (durationSinceSubProg timeMpl).CodeLoaded m ∧ + RoDataAt m (timeMpl.ρ timeRodataCst16Sym) timePlacedData0) + (keep := keepR_durationSince timeMpl) + (P_run := emptyStdProg) + (P_real := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (P_sub := durationSinceSubProg timeMpl) + (stubPc := libsignalSessionLib.resolve mpl lsDurationSinceSym) + (entryTarget := timeMpl.base 1) + (tbl := timeMpl.ρ timeRodataCst16Sym) + (bytes := timePlacedData0) + (fallback := durationSinceExactHook) + emptyStdProg_svc + (durationSinceHullProg_svc timeMpl) + (fun pc _ => emptyStdProg_externAt pc) + (durationSinceHullProg_externAt_none timeMpl) + (hRealStubNone W) + hStub1 + (fun _ _ _ _ _ hvis => + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_durationSince timeMpl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis) + (fun _ _ hInvM => durationSinceSubProg_codeLoaded_stripExecOutside hInvM.1) + (fun _ _ hInvM hkf => + ⟨hInvM.1.of_keepsFrozen hkf, roDataAt_of_keepsFrozen hInvM.2 hkf⟩) + (fun _ _ hInvM => hInvM.2) + (subroutine_ok_masterDurationSinceLs_of_hasWords hpl + (durationSinceHullProg_svc timeMpl) + (durationSinceHullProg_externAt_none timeMpl) + (durationSinceHullProg_hasWords_subTimespec timeMpl) + (hb1 ▸ durationSinceHullProg_hasWords_durationSince timeMpl)) + (specStripSInvariant_masterDurationSinceLs (keepR_durationSince timeMpl)) + specPreservesFsTrace_masterDurationSinceLs + masterDurationSinceLs_pre_setPC + masterDurationSinceLs_outcome_setPC + refine ⟨hRep.1, ?_⟩ + intro u _ _ hpc hrun hnoex hkf hfr hInvU + have hnoex1 : + ∀ msg, + (durationSinceGhostFnLs (timeMpl.ρ timeRodataCst16Sym) (keepR_durationSince timeMpl) + emptyStdProg (durationSinceSubProg timeMpl) (timeMpl.base 1) u).status ≠ + .Exception msg := by + rw [hb1] + exact hnoex + have hlr : keepR_durationSince timeMpl (u.readReg64 .lr) = false := + durationSinceGhostFnLs_keepLr_false_of_noException hKeep hnoex1 + obtain ⟨hSteps1, hfr1, _⟩ := + hRep.2 u hpc hrun hnoex1 hfr hlr ⟨hCL u hInvU, hRo u hInvU⟩ + have hEqGhost : + linkedCallHookG + (LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.LinkedCallHookG.roTableGuard + (timeMpl.ρ timeRodataCst16Sym) timePlacedData0) + (keepR_durationSince timeMpl) emptyStdProg (durationSinceSubProg timeMpl) + (timeMpl.base 1) + (withLsRet LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceCode.masterDurationSinceSpec) + durationSinceExactHook u = durationSinceGhost timeMpl u := by + change durationSinceGhostFnLs (timeMpl.ρ timeRodataCst16Sym) (keepR_durationSince timeMpl) + emptyStdProg (durationSinceHullProg timeMpl) (timeMpl.base 1) u = + durationSinceGhostFnLs (timeMpl.ρ timeRodataCst16Sym) (keepR_durationSince timeMpl) + emptyStdProg (durationSinceHullProg timeMpl) (timeMpl.base 0 + subTimespecByteLen) u + rw [hb1] + rw [hEqGhost] at hSteps1 hfr1 + exact ⟨hSteps1, hfr1, + hInvKeep u (durationSinceGhost timeMpl u) hInvU hkf (durationSinceGhost_fs timeMpl u)⟩ + +/-- **Artifact 2a (`CC-R0`, Row 2) — Direct `.text.lib2` `GhostRowReplayOn` for `lsDurationSinceSym`:** + Route `R0` (`entryGuard := fun _ => True`), discharging `hRealStubNone` and `hStub` directly + from `hTargetEq : libsignalSessionLib.resolve mpl lsDurationSinceSym = + timeMpl.base 0 + subTimespecByteLen` (`F1` + `H1` compliant). -/ +theorem durationSinceGhost_rowReplayOn [LibsignalPlacement] + (mpl mmpl timeMpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) + (hTargetEq : libsignalSessionLib.resolve mpl lsDurationSinceSym = + timeMpl.base 0 + subTimespecByteLen) + (hCL : ∀ u : State, InvS u → (durationSinceSubProg timeMpl).CodeLoaded u.mem) + (hRo : ∀ u : State, InvS u → + RoDataAt u.mem (timeMpl.ρ timeRodataCst16Sym) timePlacedData0) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hKeep : ∀ lr : BitVec 64, LsRetAddr624 lr → keepR_durationSince timeMpl lr = false) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_durationSince timeMpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG lsDurationSinceSym (fun _ => True) + (durationSinceGhost timeMpl) := + durationSinceGhost_rowReplayOn_of_stub mpl mmpl timeMpl InvS EG hpl hb1 hCL hRo hInvKeep + hKeep hRealHullNoExt + (fun W => by rw [hTargetEq]; exact hRealHullNoExt W (keepR_durationSince_entry timeMpl)) + (fun _ u hpc _ _ _ => by + rw [setPC_eq_self_of_pc_eq (hpc.trans hTargetEq)] + exact Steps.refl _) + +/-! ## 4. `DurationSinceRowSpec`, `GhostRowSpecOk`, `GhostRowOk` & `ExtraEntryGuard` Helpers -/ + +/-- `DurationSinceRowSpec` (`withLsRet` outermost) for `durationSinceGhost timeMpl`. -/ +theorem durationSinceGhost_durationSinceRowSpec [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) : + DurationSinceRowSpec (durationSinceGhost timeMpl) := + DurationSinceRowSpec.of_ls_vm + (durationSinceGhost_bounded_ok timeMpl hpl hb1) + (fun stk hlo hhi => durationSinceGhost_epochAt_ok timeMpl hpl hb1 stk hlo hhi) + (durationSinceGhost_vmPreserved timeMpl hpl hb1) + +/-- **Artifact 1 (`CC-R0`, Row 2):** `GhostRowSpecOk lsDurationSinceSym (durationSinceGhost timeMpl)` + under `timeMultiLib.Placeable timeMpl` and `timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen`. -/ +theorem durationSinceGhost_rowSpecOk [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) : + GhostRowSpecOk lsDurationSinceSym (durationSinceGhost timeMpl) where + fs_eq := durationSinceGhost_fs timeMpl + fsT := durationSinceGhost_fsT timeMpl + rowSpec := by + unfold ExtraRowSpec + have hd1 : (lsDurationSinceSym == "bcmp") = false := by decide + have hd2 : (lsDurationSinceSym == "strlen") = false := by decide + have hd3 : (lsDurationSinceSym == "memmove") = false := by decide + have hd4 : (lsDurationSinceSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsDurationSinceSym == lsMemrchrSym) = false := by decide + have hd6 : (lsDurationSinceSym == lsDurationSinceSym) = true := by decide + simp only [hd1, hd2, hd3, hd4, hd5, hd6, Bool.false_eq_true, ↓reduceIte] + exact durationSinceGhost_durationSinceRowSpec timeMpl hpl hb1 + +/-- Behind-stub `GhostRowOk` bundle (`GhostRowSpecOk` ∧ `GhostRowReplayOn`) for `lsDurationSinceSym`. -/ +theorem durationSinceGhost_rowOk_of_stub [LibsignalPlacement] + (mpl mmpl timeMpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) + (hCL : ∀ u : State, InvS u → (durationSinceSubProg timeMpl).CodeLoaded u.mem) + (hRo : ∀ u : State, InvS u → + RoDataAt u.mem (timeMpl.ρ timeRodataCst16Sym) timePlacedData0) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hKeep : ∀ lr : BitVec 64, LsRetAddr624 lr → keepR_durationSince timeMpl lr = false) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_durationSince timeMpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hRealStubNone : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl lsDurationSinceSym) = none) + (hStub : ∀ W : CliHooks, + StubReachesTargetOn + (fun m => + (durationSinceSubProg timeMpl).CodeLoaded m ∧ + RoDataAt m (timeMpl.ρ timeRodataCst16Sym) timePlacedData0) + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (libsignalSessionLib.resolve mpl lsDurationSinceSym) + (timeMpl.base 0 + subTimespecByteLen)) : + GhostRowOk mpl mmpl InvS EG lsDurationSinceSym (fun _ => True) + (durationSinceGhost timeMpl) := + ⟨durationSinceGhost_rowSpecOk timeMpl hpl hb1, + durationSinceGhost_rowReplayOn_of_stub mpl mmpl timeMpl InvS EG hpl hb1 hCL hRo hInvKeep + hKeep hRealHullNoExt hRealStubNone hStub⟩ + +/-- **Full per-row `GhostRowOk` bundle (`GhostRowSpecOk` ∧ `GhostRowReplayOn`)** for + `lsDurationSinceSym` (`entryGuard := fun _ => True`). -/ +theorem durationSinceGhost_rowOk [LibsignalPlacement] + (mpl mmpl timeMpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hpl : timeMultiLib.Placeable timeMpl) + (hb1 : timeMpl.base 1 = timeMpl.base 0 + subTimespecByteLen) + (hTargetEq : libsignalSessionLib.resolve mpl lsDurationSinceSym = + timeMpl.base 0 + subTimespecByteLen) + (hCL : ∀ u : State, InvS u → (durationSinceSubProg timeMpl).CodeLoaded u.mem) + (hRo : ∀ u : State, InvS u → + RoDataAt u.mem (timeMpl.ρ timeRodataCst16Sym) timePlacedData0) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hKeep : ∀ lr : BitVec 64, LsRetAddr624 lr → keepR_durationSince timeMpl lr = false) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_durationSince timeMpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowOk mpl mmpl InvS EG lsDurationSinceSym (fun _ => True) + (durationSinceGhost timeMpl) := + ⟨durationSinceGhost_rowSpecOk timeMpl hpl hb1, + durationSinceGhost_rowReplayOn mpl mmpl timeMpl InvS EG hpl hb1 hTargetEq hCL hRo hInvKeep + hKeep hRealHullNoExt⟩ + +theorem extraEntryGuard_durationSince_arm + {mpl : Obj.MultiPlacement} {guardOf : String → State → Prop} {s0 : State} + (hGuardEq : guardOf lsDurationSinceSym s0 ↔ durationSinceEntryGuard mpl s0) : + guardOf lsDurationSinceSym s0 := + hGuardEq.mpr trivial + +theorem extraEntryGuard_singleton_durationSince [LibsignalPlacement] + {mpl timeMpl : Obj.MultiPlacement} {guardOf : String → State → Prop} + {g : CliGhostHooks} {s0 : State} + (hg : g.extra = [(lsDurationSinceSym, durationSinceGhost timeMpl)]) + (hGuardEq : guardOf lsDurationSinceSym s0 ↔ durationSinceEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := by + intro sym _ _ hLook + rw [hg] at hLook + simp only [List.lookup] at hLook + by_cases hSym : (sym == lsDurationSinceSym) = true + · have hEq := eq_of_beq hSym + subst hEq + exact hGuardEq.mpr trivial + · simp [hSym] at hLook + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhostReplays diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/ExtraGhostReplay.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/ExtraGhostReplay.lean new file mode 100644 index 000000000..e5a190ede --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/ExtraGhostReplay.lean @@ -0,0 +1,730 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.Ghost617Transfer -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import + +/-! +# Per-Row `extra` Ghost Replay & `ExtraOk` Bundle (`Cli.HooksDehook.ExtraGhostReplay`) + +Untrusted (`Role::Proof`) Block-`617` trajectory replay layer for `#1255` Cutover 2 +(`CliGhostHooks.extra : List (String × (State → State))`), implementing the binding `H-REV2` +requirements (`rev_c11_design_v2.md` M1, M3, M4): + +1. **Row-internal `keepR` & parametric `entryGuard` (`GhostRowReplayOn`):** + `GhostRowReplayOn` is a pure `Prop` structure with **zero data fields**: each row's code-region + predicate `keepR : BitVec 64 → Bool` stays purely internal to that row's proof (never unioned + across `extra`), and `entryGuard : State → Prop` is passed as a parameter (`guardOf sym` in + `ExtraListEntryGuard` / `ExtraListReplaysOn`). +2. **Guarded trajectory-aware (`On`) per-row `ExtraListReplaysOn` / `ExtraReplaysOn`:** + Matches `GhostExternReplaysOn`'s behind-stub Arm 1 ∨ Arm 2 shape at `resolve mpl sym` without + requiring outer `hole2_keepSub (u.readReg64 .lr) = false`, and lifts directly into + `GhostExternReplaysOn keep_outer InvS` for any outer `keep_outer` (`fun _ => false` in + Cutover 2, per H-REV2 M3). +3. **Full per-row & table bundles (`GhostRowOk`, `ExtraListOk` / `ExtraOk`) + single-row transfer + companion (`block617TransferFixedG_of_extraRow`).** +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + +open Arm64 Arm64.Obj Arm64.Process ProofLib ProofLib.SepLogic +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession + (CliHooks Inputs cliExternsPlaced cliProcessInputs libsignalSessionLib + lsMemcpySym lsMemsetSym lsReadFileSym lsReadStdinSym lsRustAllocSymCli + lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli + lsStringCloneSym) +open CryptoVerification.SignalSession.Cli (RunAnswer) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Heap.Fine (fineCostModel fineHookRustCliAllocBudget) +open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer (ExecFrozen) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 + (b2MainSpecTightNeedLocksFineAt cliBudgetLimits) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced + (cliProgExtPlacedAt cliStaticsPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.Ghost617Transfer + (GhostExternReplaysOn GhostSymActive subroutine_ok_transfer_ghostS) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraGhostTable ExtraListSpecOk GhostRowSpecOk cliExtraGhostSyms + cliGhostExternsNamed cliGhostExternsWithExtra cliGhostExternsWithExtra_nil + named_eq_false_of_extra_contains) + +export LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (cliGhostExternsNamed cliGhostExternsWithExtra_nil) + +/-! ## 1. Extended `GhostSymActiveWithExtra` & Case-Analysis Lemmas -/ + +/-- 10-disjunct named-arm prefix of `GhostSymActive` / `GhostSymActiveWithExtra` + (excluding `cliExtraGhostSyms` / `extra`). -/ +@[expose] def GhostSymActiveNamed (ghFixed : CliGhostHooks) + (sym : String) (f : State → State) : Prop := + (sym = lsRustAllocSymCli ∧ f = ghFixed.alloc) ∨ + (sym = lsRustDeallocSymCli ∧ f = ghFixed.dealloc) ∨ + (sym = lsRustReallocSymCli ∧ f = ghFixed.realloc) ∨ + (sym = lsRustAllocZeroedSymCli ∧ f = ghFixed.allocZeroed) ∨ + (sym = lsRustNoAllocShimSymCli ∧ f = ghFixed.shim) ∨ + (sym = lsStringCloneSym ∧ ghFixed.stringClone = some f) ∨ + (sym = lsReadFileSym ∧ ∃ h, ghFixed.readFile = some ⟨f, h⟩) ∨ + (sym = lsReadStdinSym ∧ ∃ h, ghFixed.readStdin = some ⟨f, h⟩) ∨ + (sym = lsMemsetSym ∧ ghFixed.memset = some f) ∨ + (sym = lsMemcpySym ∧ ghFixed.memcpy = some f) + +/-- Extended 11-way `GhostSymActive` predicate over `(ghFixed, extra)`. In Commit 2B, + `GhostSymActive ghFixed sym f` becomes definitionally + `GhostSymActiveWithExtra ghFixed ghFixed.extra sym f`. -/ +@[expose] def GhostSymActiveWithExtra (ghFixed : CliGhostHooks) (extra : ExtraGhostTable) + (sym : String) (f : State → State) : Prop := + (sym = lsRustAllocSymCli ∧ f = ghFixed.alloc) ∨ + (sym = lsRustDeallocSymCli ∧ f = ghFixed.dealloc) ∨ + (sym = lsRustReallocSymCli ∧ f = ghFixed.realloc) ∨ + (sym = lsRustAllocZeroedSymCli ∧ f = ghFixed.allocZeroed) ∨ + (sym = lsRustNoAllocShimSymCli ∧ f = ghFixed.shim) ∨ + (sym = lsStringCloneSym ∧ ghFixed.stringClone = some f) ∨ + (sym = lsReadFileSym ∧ ∃ h, ghFixed.readFile = some ⟨f, h⟩) ∨ + (sym = lsReadStdinSym ∧ ∃ h, ghFixed.readStdin = some ⟨f, h⟩) ∨ + (sym = lsMemsetSym ∧ ghFixed.memset = some f) ∨ + (sym = lsMemcpySym ∧ ghFixed.memcpy = some f) ∨ + (cliExtraGhostSyms.contains sym = true ∧ extra.lookup sym = some f) + +/-- Definitional bridge `GhostSymActive gh = GhostSymActiveWithExtra gh gh.extra`. -/ +theorem GhostSymActive_eq_withExtra (gh : CliGhostHooks) : + GhostSymActive gh = GhostSymActiveWithExtra gh gh.extra := rfl + +/-- Decomposition of `GhostSymActiveWithExtra` into `GhostSymActiveNamed` ∨ 11th `extra` arm. -/ +theorem GhostSymActiveWithExtra_iff_named_or_extra + (gh : CliGhostHooks) (extra : ExtraGhostTable) + (sym : String) (f : State → State) : + GhostSymActiveWithExtra gh extra sym f ↔ + GhostSymActiveNamed gh sym f ∨ + (cliExtraGhostSyms.contains sym = true ∧ extra.lookup sym = some f) := by + unfold GhostSymActiveWithExtra GhostSymActiveNamed + simp only [or_assoc] + +/-- Decomposition of `GhostSymActive` into `GhostSymActiveNamed` ∨ 11th `gh.extra` arm. -/ +theorem GhostSymActive_iff_named_or_extra + (gh : CliGhostHooks) (sym : String) (f : State → State) : + GhostSymActive gh sym f ↔ + GhostSymActiveNamed gh sym f ∨ + (cliExtraGhostSyms.contains sym = true ∧ gh.extra.lookup sym = some f) := + GhostSymActiveWithExtra_iff_named_or_extra gh gh.extra sym f + +/-- Unconditional converse (`h2b2` / `h2ef` soundness check): holds for **arbitrary** `ghFixed` + and `extra` with **zero** freshness assumptions because the 11th disjunct carries + `cliExtraGhostSyms.contains sym = true` (which excludes all 10 named symbols). -/ +theorem cliGhostExternsWithExtra_eq_some_of_active + (ghFixed : CliGhostHooks) (extra : ExtraGhostTable) + (baseExt : String → Option (State → State)) {sym : String} {f : State → State} + (hAct : GhostSymActiveWithExtra ghFixed extra sym f) : + cliGhostExternsWithExtra ghFixed extra baseExt sym = some f := by + unfold cliGhostExternsWithExtra + rcases hAct with + ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | + ⟨rfl, hsc⟩ | ⟨rfl, ⟨_, hrf⟩⟩ | ⟨rfl, ⟨_, hrs⟩⟩ | ⟨rfl, hms⟩ | ⟨rfl, hmc⟩ | ⟨hDom, hLook⟩ + · simp + · have h1 : (lsRustDeallocSymCli == lsRustAllocSymCli) = false := by decide + simp [h1] + · have h1 : (lsRustReallocSymCli == lsRustAllocSymCli) = false := by decide + have h2 : (lsRustReallocSymCli == lsRustDeallocSymCli) = false := by decide + simp [h1, h2] + · have h1 : (lsRustAllocZeroedSymCli == lsRustAllocSymCli) = false := by decide + have h2 : (lsRustAllocZeroedSymCli == lsRustDeallocSymCli) = false := by decide + have h3 : (lsRustAllocZeroedSymCli == lsRustReallocSymCli) = false := by decide + simp [h1, h2, h3] + · have h1 : (lsRustNoAllocShimSymCli == lsRustAllocSymCli) = false := by decide + have h2 : (lsRustNoAllocShimSymCli == lsRustDeallocSymCli) = false := by decide + have h3 : (lsRustNoAllocShimSymCli == lsRustReallocSymCli) = false := by decide + have h4 : (lsRustNoAllocShimSymCli == lsRustAllocZeroedSymCli) = false := by decide + simp [h1, h2, h3, h4] + · have h1 : (lsStringCloneSym == lsRustAllocSymCli) = false := by decide + have h2 : (lsStringCloneSym == lsRustDeallocSymCli) = false := by decide + have h3 : (lsStringCloneSym == lsRustReallocSymCli) = false := by decide + have h4 : (lsStringCloneSym == lsRustAllocZeroedSymCli) = false := by decide + have h5 : (lsStringCloneSym == lsRustNoAllocShimSymCli) = false := by decide + simp [h1, h2, h3, h4, h5, hsc] + · have h1 : (lsReadFileSym == lsRustAllocSymCli) = false := by decide + have h2 : (lsReadFileSym == lsRustDeallocSymCli) = false := by decide + have h3 : (lsReadFileSym == lsRustReallocSymCli) = false := by decide + have h4 : (lsReadFileSym == lsRustAllocZeroedSymCli) = false := by decide + have h5 : (lsReadFileSym == lsRustNoAllocShimSymCli) = false := by decide + have h6 : (lsReadFileSym == lsStringCloneSym) = false := by decide + simp [h1, h2, h3, h4, h5, h6, hrf] + · have h1 : (lsReadStdinSym == lsRustAllocSymCli) = false := by decide + have h2 : (lsReadStdinSym == lsRustDeallocSymCli) = false := by decide + have h3 : (lsReadStdinSym == lsRustReallocSymCli) = false := by decide + have h4 : (lsReadStdinSym == lsRustAllocZeroedSymCli) = false := by decide + have h5 : (lsReadStdinSym == lsRustNoAllocShimSymCli) = false := by decide + have h6 : (lsReadStdinSym == lsStringCloneSym) = false := by decide + have h7' : (lsReadStdinSym == lsReadFileSym) = false := by decide + simp [h1, h2, h3, h4, h5, h6, h7', hrs] + · have h1 : (lsMemsetSym == lsRustAllocSymCli) = false := by decide + have h2 : (lsMemsetSym == lsRustDeallocSymCli) = false := by decide + have h3 : (lsMemsetSym == lsRustReallocSymCli) = false := by decide + have h4 : (lsMemsetSym == lsRustAllocZeroedSymCli) = false := by decide + have h5 : (lsMemsetSym == lsRustNoAllocShimSymCli) = false := by decide + have h6 : (lsMemsetSym == lsStringCloneSym) = false := by decide + have h7 : (lsMemsetSym == lsReadFileSym) = false := by decide + have h8 : (lsMemsetSym == lsReadStdinSym) = false := by decide + have h9 : (lsMemsetSym == lsMemsetSym) = true := rfl + simp only [h1, h2, h3, h4, h5, h6, h7, h8, h9, hms, Bool.false_eq_true, ↓reduceIte] + · have h1 : (lsMemcpySym == lsRustAllocSymCli) = false := by decide + have h2 : (lsMemcpySym == lsRustDeallocSymCli) = false := by decide + have h3 : (lsMemcpySym == lsRustReallocSymCli) = false := by decide + have h4 : (lsMemcpySym == lsRustAllocZeroedSymCli) = false := by decide + have h5 : (lsMemcpySym == lsRustNoAllocShimSymCli) = false := by decide + have h6 : (lsMemcpySym == lsStringCloneSym) = false := by decide + have h7 : (lsMemcpySym == lsReadFileSym) = false := by decide + have h8 : (lsMemcpySym == lsReadStdinSym) = false := by decide + have h9 : (lsMemcpySym == lsMemsetSym) = false := by decide + have h10 : (lsMemcpySym == lsMemcpySym) = true := rfl + simp only [h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, hmc, Bool.false_eq_true, ↓reduceIte] + · obtain ⟨h1, h2, h3, h4, h5, h6, h7, h8, h9, h10⟩ := named_eq_false_of_extra_contains hDom + simp only [h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, hDom, hLook, Bool.false_eq_true, + ↓reduceIte] + +/-- Every `GhostSymActiveNamed` pair evaluates to `some f` in `cliGhostExternsWithExtra gh [] b`. -/ +theorem cliGhostExternsWithExtra_nil_of_named + (gh : CliGhostHooks) (b : String → Option (State → State)) + {sym : String} {f : State → State} + (hNamed : GhostSymActiveNamed gh sym f) : + cliGhostExternsWithExtra gh [] b sym = some f := + cliGhostExternsWithExtra_eq_some_of_active gh [] b + ((GhostSymActiveWithExtra_iff_named_or_extra gh [] sym f).mpr (Or.inl hNamed)) + +/-- Equivalence of the two H-REV4 Step-3 formulations at `baseExt := fun _ => none`. -/ +theorem cliGhostExternsWithExtra_nil_none_iff + (gh : CliGhostHooks) {sym : String} {f : State → State} : + cliGhostExternsWithExtra gh [] (fun _ => none) sym = some f ↔ + cliExtraGhostSyms.contains sym = false ∧ + CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExterns gh (fun _ => none) sym = some f := by + constructor + · intro h + cases hc : cliExtraGhostSyms.contains sym with + | false => + refine ⟨rfl, ?_⟩ + unfold CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExterns cliGhostExternsWithExtra at h ⊢ + simp only [hc, Bool.false_eq_true, ↓reduceIte] at h ⊢ + exact h + | true => + rcases named_eq_false_of_extra_contains hc with + ⟨h1, h2, h3, h4, h5, h6, h7, h8, h9, h10⟩ + unfold cliGhostExternsWithExtra at h + simp only [List.lookup, hc, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, + Bool.false_eq_true, ↓reduceIte] at h + cases h + · rintro ⟨hc, h⟩ + unfold CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExterns at h + unfold cliGhostExternsWithExtra at h ⊢ + simp only [hc, Bool.false_eq_true, ↓reduceIte] at h ⊢ + exact h + +theorem cliGhostExternsWithExtra_none_imp + (ghFixed : CliGhostHooks) (extra : ExtraGhostTable) + (baseExt : String → Option (State → State)) {sym : String} + (h : cliGhostExternsWithExtra ghFixed extra baseExt sym = none) : + baseExt sym = none := by + unfold cliGhostExternsWithExtra at h + split at h <;> try cases h + split at h <;> try cases h + split at h <;> try cases h + split at h <;> try cases h + split at h <;> try cases h + split at h + · cases hg : ghFixed.stringClone <;> simp only [hg] at h <;> try cases h + exact h + · split at h + · cases hg : ghFixed.readFile with + | none => simp only [hg] at h; exact h + | some v => rcases v with ⟨f, hf⟩; simp only [hg] at h; cases h + · split at h + · cases hg : ghFixed.readStdin with + | none => simp only [hg] at h; exact h + | some v => rcases v with ⟨f, hf⟩; simp only [hg] at h; cases h + · split at h + · cases hg : ghFixed.memset <;> simp only [hg] at h <;> try cases h + exact h + · split at h + · cases hg : ghFixed.memcpy <;> simp only [hg] at h <;> try cases h + exact h + · split at h + · cases hg : extra.lookup sym <;> simp only [hg] at h <;> try cases h + exact h + · exact h + +theorem cliGhostExternsWithExtra_some_cases + (ghFixed : CliGhostHooks) (extra : ExtraGhostTable) + (baseExt : String → Option (State → State)) {sym : String} {f : State → State} + (h : cliGhostExternsWithExtra ghFixed extra baseExt sym = some f) : + GhostSymActiveWithExtra ghFixed extra sym f ∨ baseExt sym = some f := by + unfold cliGhostExternsWithExtra at h + by_cases h1 : sym == lsRustAllocSymCli + · simp only [h1, ↓reduceIte, Option.some.injEq] at h + exact Or.inl (Or.inl ⟨beq_iff_eq.mp h1, h.symm⟩) + · simp only [h1, Bool.false_eq_true, ↓reduceIte] at h + by_cases h2 : sym == lsRustDeallocSymCli + · simp only [h2, ↓reduceIte, Option.some.injEq] at h + exact Or.inl (Or.inr (Or.inl ⟨beq_iff_eq.mp h2, h.symm⟩)) + · simp only [h2, Bool.false_eq_true, ↓reduceIte] at h + by_cases h3 : sym == lsRustReallocSymCli + · simp only [h3, ↓reduceIte, Option.some.injEq] at h + exact Or.inl (Or.inr (Or.inr (Or.inl ⟨beq_iff_eq.mp h3, h.symm⟩))) + · simp only [h3, Bool.false_eq_true, ↓reduceIte] at h + by_cases h4 : sym == lsRustAllocZeroedSymCli + · simp only [h4, ↓reduceIte, Option.some.injEq] at h + exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inl ⟨beq_iff_eq.mp h4, h.symm⟩)))) + · simp only [h4, Bool.false_eq_true, ↓reduceIte] at h + by_cases h5 : sym == lsRustNoAllocShimSymCli + · simp only [h5, ↓reduceIte, Option.some.injEq] at h + exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inl ⟨beq_iff_eq.mp h5, h.symm⟩))))) + · simp only [h5, Bool.false_eq_true, ↓reduceIte] at h + by_cases h6 : sym == lsStringCloneSym + · simp only [h6, ↓reduceIte] at h + cases hg : ghFixed.stringClone with + | some g' => + rw [hg] at h; injection h with hf; subst hf + exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr + (Or.inl ⟨beq_iff_eq.mp h6, hg⟩)))))) + | none => rw [hg] at h; exact Or.inr h + · simp only [h6, Bool.false_eq_true, ↓reduceIte] at h + by_cases h7 : sym == lsReadFileSym + · simp only [h7, ↓reduceIte] at h + cases hg : ghFixed.readFile with + | some gh' => + rcases gh' with ⟨g', hg'⟩ + rw [hg] at h; injection h with hf; subst hf + exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr + (Or.inl ⟨beq_iff_eq.mp h7, hg', hg⟩))))))) + | none => rw [hg] at h; exact Or.inr h + · simp only [h7, Bool.false_eq_true, ↓reduceIte] at h + by_cases h8 : sym == lsReadStdinSym + · simp only [h8, ↓reduceIte] at h + cases hg : ghFixed.readStdin with + | some gh' => + rcases gh' with ⟨g', hg'⟩ + rw [hg] at h; injection h with hf; subst hf + exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr + (Or.inl ⟨beq_iff_eq.mp h8, hg', hg⟩)))))))) + | none => rw [hg] at h; exact Or.inr h + · simp only [h8, Bool.false_eq_true, ↓reduceIte] at h + by_cases h9 : sym == lsMemsetSym + · simp only [h9, ↓reduceIte] at h + cases hg : ghFixed.memset with + | some g' => + rw [hg] at h; injection h with hf; subst hf + exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr + (Or.inr (Or.inl ⟨beq_iff_eq.mp h9, hg⟩))))))))) + | none => rw [hg] at h; exact Or.inr h + · simp only [h9, Bool.false_eq_true, ↓reduceIte] at h + by_cases h10 : sym == lsMemcpySym + · simp only [h10, ↓reduceIte] at h + cases hg : ghFixed.memcpy with + | some g' => + rw [hg] at h; injection h with hf; subst hf + exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr + (Or.inr (Or.inr (Or.inl ⟨beq_iff_eq.mp h10, hg⟩)))))))))) + | none => rw [hg] at h; exact Or.inr h + · simp only [h10, Bool.false_eq_true, ↓reduceIte] at h + cases hDom : cliExtraGhostSyms.contains sym with + | false => + simp only [hDom, Bool.false_eq_true, ↓reduceIte] at h + exact Or.inr h + | true => + simp only [hDom, ↓reduceIte] at h + cases hLook : extra.lookup sym with + | some g' => + rw [hLook] at h; injection h with hf; subst hf + exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr + (Or.inr (Or.inr (Or.inr ⟨hDom, hLook⟩)))))))))) + | none => rw [hLook] at h; exact Or.inr h + +/-! ## 2. Per-Row `GhostRowReplayOn` (Parametric `entryGuard`, No Data Fields) & `ExtraReplaysOn` -/ + +/-- **Per-row behind-stub `On` replay obligation (`GhostRowReplayOn`):** + Takes THIS row's entry-state guard `entryGuard : State → Prop` as a parameter (so + `GhostRowReplayOn` is a pure `Prop` structure with zero data fields — H-REV2 M1) and keeps the + row's code-region predicate `keepR : BitVec 64 → Bool` purely internal to the row's proof + (never unioned across `extra`). Produces the exact behind-stub `GhostExternReplaysOn` + disjunction at `stubPc := libsignalSessionLib.resolve mpl sym` from the Block-`617` trajectory + endpoints `(s0, sf)` without requiring outer `keep_outer (u.readReg64 .lr) = false`. -/ +structure GhostRowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (sym : String) (entryGuard : State → Prop) (f : State → State) : Prop where + /-- `ExecFrozen` + `fs` preservation for `H2ExecFrozenWire` (`ghFixed_preserves_execFrozen`). -/ + preserves_execFrozen : + ∀ u : State, u.status = .Running → (∀ msg, (f u).status ≠ .Exception msg) → + ExecFrozen u.mem → ExecFrozen (f u).mem ∧ (f u).fs = u.fs + /-- Guarded trajectory-aware (`On`) behind-stub replay at `resolve mpl sym`. -/ + replay_at_stub : + ∀ (W : CliHooks) (s0 sf : State), + let stubPc := libsignalSessionLib.resolve mpl sym + let P_ghost := cliProgExtPlacedAt mpl EG 617 W + let P_real := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W + entryGuard s0 → + (sf.status = .Running → sf.pc = s0.readReg64 .lr) → + (∀ msg, sf.status ≠ .Exception msg) → + sf.status ≠ .Halted → + (P_real.externAt? stubPc = some f ∧ + ∀ u : State, + Steps P_ghost s0 u → Steps P_ghost (f u) sf → + u.pc = stubPc → u.status = .Running → + (∀ msg, (f u).status ≠ .Exception msg) → + u.mem.KeepsFrozen (f u).mem → ExecFrozen u.mem → InvS u → + ExecFrozen (f u).mem ∧ InvS (f u)) ∨ + (P_real.externAt? stubPc = none ∧ + ∀ u : State, + Steps P_ghost s0 u → Steps P_ghost (f u) sf → + u.pc = stubPc → u.status = .Running → + (∀ msg, (f u).status ≠ .Exception msg) → + u.mem.KeepsFrozen (f u).mem → ExecFrozen u.mem → InvS u → + Steps P_real u (f u) ∧ ExecFrozen (f u).mem ∧ InvS (f u)) + +/-- Lift `GhostRowReplayOn` into the exact `GhostExternReplaysOn keep_outer InvS` disjunction at + `pc = libsignalSessionLib.resolve mpl sym` for **any** outer `keep_outer` (`fun _ => false` in + Cutover 2, per H-REV2 M3). -/ +theorem ghostExternReplaysOn_arm_of_rowReplayOn + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + {EG : CliHooks → String → Option (State → State)} + {sym : String} {entryGuard : State → Prop} {f : State → State} + (keep_outer : BitVec 64 → Bool) + (hRow : GhostRowReplayOn mpl mmpl InvS EG sym entryGuard f) + {W : CliHooks} {s0 sf : State} {pc : BitVec 64} + (hpc_eq : pc = libsignalSessionLib.resolve mpl sym) + (hGuard0 : entryGuard s0) + (hret_pc : sf.status = .Running → sf.pc = s0.readReg64 .lr) + (hnoex_sf : ∀ msg, sf.status ≠ .Exception msg) + (hnhalt_sf : sf.status ≠ .Halted) : + let P_ghost := cliProgExtPlacedAt mpl EG 617 W + let P_real := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W + (P_real.externAt? pc = some f ∧ + ∀ u : State, + Steps P_ghost s0 u → Steps P_ghost (f u) sf → + u.pc = pc → u.status = .Running → + (∀ msg, (f u).status ≠ .Exception msg) → + u.mem.KeepsFrozen (f u).mem → ExecFrozen u.mem → InvS u → + ExecFrozen (f u).mem ∧ InvS (f u)) ∨ + (P_real.externAt? pc = none ∧ + ∀ u : State, + Steps P_ghost s0 u → Steps P_ghost (f u) sf → + u.pc = pc → u.status = .Running → + (∀ msg, (f u).status ≠ .Exception msg) → + u.mem.KeepsFrozen (f u).mem → ExecFrozen u.mem → + keep_outer (u.readReg64 .lr) = false → InvS u → + Steps P_real u (f u) ∧ ExecFrozen (f u).mem ∧ InvS (f u)) := by + subst hpc_eq + rcases hRow.replay_at_stub W s0 sf hGuard0 hret_pc hnoex_sf hnhalt_sf with + ⟨hreal_some, harm1⟩ | ⟨hreal_none, harm2⟩ + · exact Or.inl ⟨hreal_some, harm1⟩ + · exact Or.inr ⟨hreal_none, + fun u hs1 hs2 hpc hrun hnoex hkf hfr _hlr hinv => + harm2 u hs1 hs2 hpc hrun hnoex hkf hfr hinv⟩ + +/-- Combined Block-`617` entry guard across all active `(sym, f)` rows in `extra`, parameterized by + the **same** `guardOf : String → State → Prop` threaded into `ExtraListReplaysOn`. -/ +@[expose] def ExtraListEntryGuard + (guardOf : String → State → Prop) (extra : ExtraGhostTable) (s0 : State) : Prop := + ∀ sym f, + cliExtraGhostSyms.contains sym = true → + extra.lookup sym = some f → + guardOf sym s0 + +abbrev ExtraEntryGuard + (guardOf : String → State → Prop) (g : CliGhostHooks) (s0 : State) : Prop := + ExtraListEntryGuard guardOf g.extra s0 + +theorem ExtraListEntryGuard.nil (guardOf : String → State → Prop) (s0 : State) : + ExtraListEntryGuard guardOf [] s0 := + fun _ _ _ hLook => by cases hLook + +/-- Per-row `ExtraListReplaysOn` across all active `(sym, f)` entries in `extra`, tied to `guardOf` + so `ExtraListEntryGuard guardOf extra s0` feeds `hRow.replay_at_stub` directly (H-REV2 M1). -/ +@[expose] def ExtraListReplaysOn + (mpl mmpl : Obj.MultiPlacement) (InvS : State → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) : Prop := + ∀ sym f, + cliExtraGhostSyms.contains sym = true → + extra.lookup sym = some f → + GhostRowReplayOn mpl mmpl InvS + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) + sym (guardOf sym) f + +abbrev ExtraReplaysOn + (mpl mmpl : Obj.MultiPlacement) (InvS : State → Prop) + (guardOf : String → State → Prop) (g : CliGhostHooks) : Prop := + ExtraListReplaysOn mpl mmpl InvS guardOf g g.extra + +theorem ExtraListReplaysOn.nil + (mpl mmpl : Obj.MultiPlacement) (InvS : State → Prop) + (guardOf : String → State → Prop) (g : CliGhostHooks) : + ExtraListReplaysOn mpl mmpl InvS guardOf g [] := + fun _ _ _ hLook => by cases hLook + +/-- Direct WP4 replay-arm discharge combining `ExtraListEntryGuard guardOf extra s0` and + `ExtraListReplaysOn mpl mmpl InvS guardOf g extra` at any active `extra` stub `pc`. -/ +theorem extraListReplaysOn_arm + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + {guardOf : String → State → Prop} {g : CliGhostHooks} {extra : ExtraGhostTable} + (keep_outer : BitVec 64 → Bool) + (hReplays : ExtraListReplaysOn mpl mmpl InvS guardOf g extra) + {W : CliHooks} {s0 sf : State} + (hEntry : ExtraListEntryGuard guardOf extra s0) + {sym : String} {f : State → State} {pc : BitVec 64} + (hDom : cliExtraGhostSyms.contains sym = true) + (hLook : extra.lookup sym = some f) + (hpc_eq : pc = libsignalSessionLib.resolve mpl sym) + (hret_pc : sf.status = .Running → sf.pc = s0.readReg64 .lr) + (hnoex_sf : ∀ msg, sf.status ≠ .Exception msg) + (hnhalt_sf : sf.status ≠ .Halted) : + let EG := fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W') + let P_ghost := cliProgExtPlacedAt mpl EG 617 W + let P_real := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W + (P_real.externAt? pc = some f ∧ + ∀ u : State, + Steps P_ghost s0 u → Steps P_ghost (f u) sf → + u.pc = pc → u.status = .Running → + (∀ msg, (f u).status ≠ .Exception msg) → + u.mem.KeepsFrozen (f u).mem → ExecFrozen u.mem → InvS u → + ExecFrozen (f u).mem ∧ InvS (f u)) ∨ + (P_real.externAt? pc = none ∧ + ∀ u : State, + Steps P_ghost s0 u → Steps P_ghost (f u) sf → + u.pc = pc → u.status = .Running → + (∀ msg, (f u).status ≠ .Exception msg) → + u.mem.KeepsFrozen (f u).mem → ExecFrozen u.mem → + keep_outer (u.readReg64 .lr) = false → InvS u → + Steps P_real u (f u) ∧ ExecFrozen (f u).mem ∧ InvS (f u)) := + ghostExternReplaysOn_arm_of_rowReplayOn keep_outer + (hReplays sym f hDom hLook) hpc_eq (hEntry sym f hDom hLook) + hret_pc hnoex_sf hnhalt_sf + +/-- Full per-row bundle (`GhostRowSpecOk` consumer specs ∧ `GhostRowReplayOn` per-row replay). -/ +@[expose] def GhostRowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (sym : String) (entryGuard : State → Prop) (f : State → State) : Prop := + GhostRowSpecOk sym f ∧ GhostRowReplayOn mpl mmpl InvS EG sym entryGuard f + +/-- Complete `ExtraListOk` bundle combining `ExtraListSpecOk` (`FreshExtraKeysList` + `GhostRowSpecOk`) + and `ExtraListReplaysOn` under `guardOf`. -/ +structure ExtraListOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) (InvS : State → Prop) + (guardOf : String → State → Prop) + (g : CliGhostHooks) (extra : ExtraGhostTable) : Prop where + specOk : ExtraListSpecOk extra + replays : ExtraListReplaysOn mpl mmpl InvS guardOf g extra + +abbrev ExtraOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) (InvS : State → Prop) + (guardOf : String → State → Prop) (g : CliGhostHooks) : Prop := + ExtraListOk mpl mmpl InvS guardOf g g.extra + +theorem ExtraListOk.nil [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) (InvS : State → Prop) + (guardOf : String → State → Prop) (g : CliGhostHooks) : + ExtraListOk mpl mmpl InvS guardOf g [] := + ⟨ExtraListSpecOk.nil, ExtraListReplaysOn.nil mpl mmpl InvS guardOf g⟩ + +/-! ## 3. Monotonicity (`noNewHooks`) & Single-Row Transfer Companion (`block617TransferFixedG_of_extraRow`) -/ + +private theorem findSome?_stubs_none_of_ext_none_imp + (exts : List String) (ρ : String → BitVec 64) (base : BitVec 64) (off : Nat) + {E₁ E₂ : String → Option (State → State)} + (hImp : ∀ s : String, E₁ s = none → E₂ s = none) + (h : ((exts.map fun e => (e, (ρ e - base).toNat)).findSome? + fun (n, o) => if o == off then E₁ n else none) = none) : + ((exts.map fun e => (e, (ρ e - base).toNat)).findSome? + fun (n, o) => if o == off then E₂ n else none) = none := by + induction exts with + | nil => rfl + | cons e tl ih => + simp only [List.map_cons, List.findSome?_cons] at h ⊢ + cases hoo : ((ρ e - base).toNat == off) with + | false => + simp only [hoo, Bool.false_eq_true, ↓reduceIte] at h ⊢ + exact ih h + | true => + simp only [hoo, ↓reduceIte] at h ⊢ + cases he : E₁ e with + | none => + rw [he] at h + rw [hImp e he] + exact ih h + | some _ => + rw [he] at h + cases h + +private theorem findSome?_const_none {α β : Type} (xs : List α) (p : α → Bool) : + (xs.findSome? fun x => if p x then (none : Option β) else none) = none := by + induction xs with + | nil => rfl + | cons hd tl ih => + simp only [List.findSome?_cons] + cases p hd <;> exact ih + +/-- Monotonicity of `cliGhostExternsWithExtra` (`EG W sym = none → baseExt sym = none`) lifted to + `cliProgExtPlacedAt`. -/ +theorem noNewHooks_cliProgExtPlacedAt_withExtra + (mpl mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (extra : ExtraGhostTable) : + ∀ (W : CliHooks) (pc : BitVec 64), + (cliProgExtPlacedAt mpl + (fun W' => cliGhostExternsWithExtra g extra (cliExternsPlaced mmpl W')) 617 W).externAt? pc = + none → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := by + intro W pc h + unfold cliProgExtPlacedAt Obj.MultiPlacedLib.blockProgram Obj.PlacedLib.program + Program.externAt? Program.hookAtOff? at h ⊢ + dsimp only at h ⊢ + rw [findSome?_const_none, Option.or_none] at h ⊢ + exact findSome?_stubs_none_of_ext_none_imp + (libsignalSessionLib.blockLib 617).text.externs + (libsignalSessionLib.blockPlacement mpl 617).ρ + (libsignalSessionLib.blockPlacement mpl 617).base + (pc - (libsignalSessionLib.blockPlacement mpl 617).base).toNat + (fun _ hs => cliGhostExternsWithExtra_none_imp g extra (cliExternsPlaced mmpl W) hs) h + +/-- Prepend a pure entry-state guard `⌜Guard s⌝ ∗` to `spec.pre` while leaving `post`, `onPanic`, + `onExit`, and `onOom` definitionally unchanged (`rfl`-identical to + `Block617TransferG.withEntryGuard`). -/ +@[expose] def withExtraEntryGuard {α : Type} (Guard : State → Prop) (spec : Spec α) : Spec α := + { spec with pre := fun x s => ⌜Guard s⌝ ∗ spec.pre x s } + +/-- Generalized Block-`617` transfer hypothesis with real-side entry guard `Guard` (`rfl`-identical + to `Block617TransferG.Block617TransferFixedHypG`). -/ +@[expose] def ExtraBlock617TransferFixedHypG + (mpl mmpl : Obj.MultiPlacement) + (EG ER : CliHooks → String → Option (State → State)) + (Guard : State → Prop) + (CodeOk_ghost CodeOk_real : Memory → Prop) + (libcAddr brkStart : BitVec 64) (stk : Nat) : Prop := + ∀ (W : CliHooks) (Run : Inputs → RunAnswer → Prop), + (∀ (γ : GhostName) (tp : BitVec 64), + subroutine_ok + (cliProgExtPlacedAt mpl EG 617 W) + (mpl.base 617) + (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk_ghost + (fineHookRustCliAllocBudget γ mmpl tp brkStart) + cliBudgetLimits fineCostModel.init stk (cliStaticsPlacedAt mpl) Run cliProcessInputs)) → + ∀ (γ : GhostName) (tp : BitVec 64), + subroutine_ok + (cliProgExtPlacedAt mpl ER 617 W) + (mpl.base 617) + (withExtraEntryGuard Guard + (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk_real + (fineHookRustCliAllocBudget γ mmpl tp brkStart) + cliBudgetLimits fineCostModel.init stk (cliStaticsPlacedAt mpl) Run cliProcessInputs)) + +/-- Single-row `ExtraBlock617TransferFixedHypG` transfer combinator (`keep := fun _ => false`) for + any row `(sym, f)` carrying its own `GhostRowReplayOn` under `entryGuard` (when all other stubs + agree between `EG` and `cliExternsPlaced mmpl`). -/ +theorem block617TransferFixedG_of_extraRow + {mpl mmpl : Obj.MultiPlacement} + {EG : CliHooks → String → Option (State → State)} + {CodeOk_ghost CodeOk_real : Memory → Prop} + {libcAddr brkStart : BitVec 64} {stk : Nat} + {sym : String} {entryGuard : State → Prop} {f : State → State} + (InvMem : Memory → Prop) (PredFs : FsState → Prop) + (hRow : GhostRowReplayOn mpl mmpl (fun u => InvMem u.mem ∧ PredFs u.fs) EG sym entryGuard f) + (hCode : ∀ m : Memory, CodeOk_real m → CodeOk_ghost m) + (hGhostCL : ∀ (W : CliHooks) (m : Memory), CodeOk_ghost m → + (cliProgExtPlacedAt mpl EG 617 W).CodeLoaded m) + (hFr0 : ∀ m : Memory, CodeOk_real m → ExecFrozen m) + (hInv0 : ∀ m : Memory, CodeOk_real m → InvMem m) + (hInvStable : ∀ m m' : Memory, InvMem m → m.KeepsFrozen m' → InvMem m') + (hFs0 : ∀ i : Inputs, PredFs (initFsState (cliProcessInputs i))) + (hghost_stub : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl sym) = some f) + (hother : ∀ (W : CliHooks) (pc : BitVec 64), + pc ≠ libsignalSessionLib.resolve mpl sym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc) + (hreal_stub_none : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl sym) = none) + (hRealHooks : ∀ (W : CliHooks) (pc : BitVec 64) (gfn : State → State), + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = some gfn → + ∀ u : State, u.status = .Running → ExecFrozen u.mem → InvMem u.mem → PredFs u.fs → + ExecFrozen (gfn u).mem ∧ PredFs (gfn u).fs) + (hSvcFs : ∀ (W : CliHooks) (s0 sf z : State), + let P_ghost := cliProgExtPlacedAt mpl EG 617 W + Steps P_ghost s0 z → Steps P_ghost (Syscall.standard z) sf → + z.status = .Running → P_ghost.externAt? z.pc = none → + P_ghost.fetchMem z.mem z.pc = some (.system false 0#16) → + ExecFrozen z.mem → InvMem z.mem → PredFs z.fs → + PredFs (Syscall.standard z).fs) : + ExtraBlock617TransferFixedHypG mpl mmpl EG (cliExternsPlaced mmpl) entryGuard + CodeOk_ghost CodeOk_real libcAddr brkStart stk := by + let stubPc := libsignalSessionLib.resolve mpl sym + intro W Run hGhostOk γ tp + have hNoNewHooks : ∀ pc : BitVec 64, + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := by + intro pc hgn + by_cases hpc : pc = stubPc + · subst hpc; exact hreal_stub_none W + · rw [← hother W pc hpc]; exact hgn + refine subroutine_ok_transfer_ghostS (keep := fun _ => false) (InvMem := InvMem) (PredFs := PredFs) + rfl rfl hNoNewHooks hInvStable ?_ ?_ (hGhostOk γ tp) + · intro g R s0 hm _hpc _ _ + dsimp only [withExtraEntryGuard, b2MainSpecTightNeedLocksFineAt] at hm ⊢ + rw [sepConj_assoc, satisfies_pure_sepConj] at hm + obtain ⟨hGuard0, hm_real⟩ := hm + rw [sepConj_assoc, satisfies_pure_sepConj] at hm_real ⊢ + obtain ⟨⟨hReal0, hCase, hInpOk, hEntry, hStk⟩, hm_frame⟩ := hm_real + have hGhost0 : CodeOk_ghost s0.mem := hCode s0.mem hReal0 + have hFsInit : PredFs s0.fs := hEntry.2.1 ▸ hFs0 g.i + refine ⟨⟨⟨hGhost0, hCase, hInpOk, hEntry, hStk⟩, hm_frame⟩, + hGhostCL W s0.mem hGhost0, hFr0 s0.mem hReal0, hInv0 s0.mem hReal0, hFsInit, ?_⟩ + intro sf _hsteps hout + have hret_pc : sf.status = .Running → sf.pc = s0.readReg64 .lr := by + intro hrun + rcases hout with ⟨⟨hpc_sf, _, _⟩, _, _⟩ | ⟨hp, _⟩ | ⟨_, he, _⟩ | ⟨ho, _⟩ + · exact hpc_sf + · rw [hrun] at hp; cases hp + · rw [hrun] at he; cases he + · rw [hrun] at ho; cases ho + have hnoex_sf : ∀ msg, sf.status ≠ .Exception msg := by + intro msg hex + rcases hout with ⟨⟨_, _, hr⟩, _, _⟩ | ⟨hp, _⟩ | ⟨_, he, _⟩ | ⟨ho, _⟩ + · rw [hex] at hr; cases hr + · rw [hex] at hp; cases hp + · rw [hex] at he; cases he + · rw [hex] at ho; cases ho + have hnhalt_sf : sf.status ≠ .Halted := by + intro hh + rcases hout with ⟨⟨_, _, hr⟩, _, _⟩ | ⟨hp, _⟩ | ⟨_, he, _⟩ | ⟨ho, _⟩ + · rw [hh] at hr; cases hr + · rw [hh] at hp; cases hp + · rw [hh] at he; cases he + · rw [hh] at ho; cases ho + refine ⟨?_, hSvcFs W s0 sf, fun _ _ _ _ _ => rfl⟩ + intro pc gfn hgpc + by_cases hpc : pc = stubPc + · subst hpc + rw [hghost_stub W] at hgpc + injection hgpc with hfg; subst hfg + exact ghostExternReplaysOn_arm_of_rowReplayOn (fun _ => false) hRow rfl + hGuard0 hret_pc hnoex_sf hnhalt_sf + · have hreal_eq : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = some gfn := by + rw [← hother W pc hpc]; exact hgpc + refine Or.inl ⟨hreal_eq, ?_⟩ + intro u _ _ _ hrun _ hkf hfr ⟨hinv, hpfs⟩ + obtain ⟨hfr', hpfs'⟩ := hRealHooks W pc gfn hreal_eq u hrun hfr hinv hpfs + exact ⟨hfr', hInvStable u.mem (gfn u).mem hinv hkf, hpfs'⟩ + · intro _g _R _s0 _sf _ _ _ hout + exact hout + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/FromUtf8Ghost.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/FromUtf8Ghost.lean index 20d525667..9f1943610 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/FromUtf8Ghost.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/FromUtf8Ghost.lean @@ -72,9 +72,9 @@ When C11 Commit 2B wires the `lsFromUtf8Sym` row into `CliGhostHooks.extra`: `InvMem := F3CodeInv mpl mmpl` (preserved across real hooks via `linkedCallHookG_fs`), `hRoInv` from C2 §3 `f3CodeInv_roDataAt_*` for `corePlacedData1`, and `hLiftVis` from `h2sl_steps_realW_of_visitedIn_keepSub`. -- **C1 Activation Follow-Up (before flip 2):** Switch `#1328`'s raw - `cliGhostExterns_fromUtf8_eq` call sites (`ElfSlicesPqOomH2KD3MainLiftGlueSat.lean`, - `ElfSlicesPqOomH2KMainEntryFitsSat.lean`) to `hookSat_withExtra_of_base … hG.extraOk`. +- **C1 Activation Follow-Up (before flip 2):** Switch `#1328`'s former raw-eq + `from_utf8` call sites (`ElfSlicesPqOomH2KD3MainLiftGlueSat.lean`, + `ElfSlicesPqOomH2KMainEntryFitsSat.lean`) to `CliHookSatPlacedBudget.cliGhostExterns_fromUtf8{,RO}_budget_sat … hG.extraOk`. -/ set_option autoImplicit false diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/FromUtf8GhostReplays.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/FromUtf8GhostReplays.lean new file mode 100644 index 000000000..5f21874ff --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/FromUtf8GhostReplays.lean @@ -0,0 +1,847 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.FromUtf8RowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8SingleBlock -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8Code -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8Ghost -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8LrTrap -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric -- proof-setup: allow-public-import + +/-! +# Card `CC-FROMUTF8` — `lsFromUtf8Sym` Row Consumer Spec & Generic-`InvS` Ghost Replay (`HooksDehook.FromUtf8GhostReplays`) + +Card **`c`** (`CC-FROMUTF8`) for `core::str::converts::from_utf8` (`lsFromUtf8Sym`) in the +`W2-C11` `CliGhostHooks.extra` framework (`ccard_recipe.md` §§2–5 row 4, modeled 1:1 on pilot +`BcmpGhostReplays.lean`), delivering **Artifact 1** (`GhostRowSpecOk`) and generic-`InvS` +**Artifact 2a** (`GhostRowReplayOn` + `GhostRowOk`) in the lightweight `Cli/HooksDehook` cone +(`0` `CliElfLib` / `ElfF3Relink` / C2 / trusted imports): + +1. **Row Anchor & `W`-Independent Ghost (`fromUtf8MplPlacement`, `keepR_fromUtf8`, `fromUtf8SubProg`, + `fromUtf8Ghost`, `fromUtf8MplGhost`):** + - `fromUtf8Block` (`156` words = `624` B) is `VerifiedLibraries.RustStd.coreMultiLib.blockLib 1` + (musl sysroot `core` rlib `Cs2kXltWtc1W`); byte and `256` B `UTF8_CHAR_WIDTH` table identity + with the stock CLI ELF (`CskxtBwYRO61I`) is established at Cutover-2 / Card R1-a2 (`REV-S2` C1). + - `fromUtf8Ghost pl` wraps `FromUtf8Ghost.emptyFromUtf8GhostHook (keepR_fromUtf8 pl) pl` + (`P_run := emptyStdProg`, `fallback := realFromUtf8Fallback`), so it has **zero `W : CliHooks` + or `mmpl` dependence**. `fromUtf8MplPlacement mpl tbl relax1` specializes `pl.base` to + `libsignalSessionLib.resolve mpl lsFromUtf8Sym` (`rfl`) and `pl.ρ coreUtf8CharWidthSym` to `tbl`. +2. **Artifact 1 — `GhostRowSpecOk lsFromUtf8Sym` (`fromUtf8Ghost_rowSpecOk`):** + - Matches `FromUtf8RowSpec` as-is (all `6` consumer arms: `fromUtf8AsciiSpec stk` and + `fromUtf8AsciiSpecRO stk`, plain, `withVmPreserved`, and `withAlloc A lim`) via + `FromUtf8RowSpec.of_vm` under pure decidable `hpl : fromUtf8Block.Placeable pl` (`0` memory, + state, or `W` premises; `fs_eq` and `fsT` hold with `0` premises). +3. **Artifact 2a — Generic-`InvS` `GhostRowReplayOn` & `GhostRowOk` (`F1` + `H1` + `roTableGuard`):** + - **F1:** `hRealHullNoExt` quantifies over `keepR_fromUtf8 pl pc = true` **only** on the + de-hooked real program `P_real`. On `P_ghost`, `hGhostNoExtNe` **strictly excludes + `pc ≠ libsignalSessionLib.resolve mpl lsFromUtf8Sym`** (no single-stub `hother` premise). + - **H1 + `.rodata` guard:** `hCL` extracts `(fromUtf8SubProg pl).CodeLoaded u.mem` and `hRo` + extracts `RoDataAt u.mem (pl.ρ coreUtf8CharWidthSym) corePlacedData1` at the intermediate call + state `u` from `InvS u` (never `s0.mem`). + - **`.text.lib2` ownership split (`ccard_recipe.md` §2.1):** `from_utf8` is a `.text.lib2` row, + so C2 `Lib2LayoutFacts` instantiation belongs to the C2 layout / STARTUP seat; per-arm and + singleton `ExtraEntryGuard` helpers live directly in §5 below. + +## Disclosures (`REV-PILOT` `N1–N3`) +- **N1 (post-Cutover-2 only):** `hRealHullNoExt` requires `lsFromUtf8Sym` to be removed from + `cliHookTablePlaced` (`C2ExternTableFacts`, discharged by `rfl_kernel` at C2 rebase). On + pre-cutover `train`, `lsFromUtf8Sym` is still hooked on `P_real`, so replay Arm 2 is usable only + post-Cutover-2. +- **N2 (`K` replay has no spec partner):** `fromUtf8GhostK_rowReplayOn` is honest, but no + `GhostRowSpecOk lsFromUtf8Sym (fromUtf8GhostK …)` exists because `fromUtf8AsciiSpec.pre` has no + `lr ∉ keepR` conjunct while `fromUtf8GhostK` raises `.Exception` when `lr ∈ keepR`. The usable + `ExtraListOk` / `GhostRowOk` route is `fromUtf8Ghost` + `fromUtf8EntryGuard`; `*GhostK` replays + are spares only. +- **N3 (singleton helper covers 1 row):** `extraEntryGuard_singleton_fromUtf8` covers + `g.extra = [(lsFromUtf8Sym, …)]` only; multi-row C2 tables assemble `ExtraListEntryGuard` from + per-arm `extraEntryGuard_fromUtf8_arm` across all active rows. +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8GhostReplays + +open Arm64 Arm64.Obj Arm64.Process ProofLib +open VerifiedLibraries.RustStd (coreUtf8CharWidthSym corePlacedData1) +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession ( + CliHooks cliExternsPlaced libsignalSessionLib lsFromUtf8Sym +) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks IsFsC) +open LibsignalBinary.Proofs.HookDischarge.RustStd.Common (RoDataAt) +open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer ( + ActiveRealPre ActiveRealRun ExecFrozen keepFsTrace +) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.FromUtf8RowSpec ( + FromUtf8RowSpec +) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs ( + ExtraRowSpec GhostRowSpecOk +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay ( + ExtraEntryGuard GhostRowOk GhostRowReplayOn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.LinkedCallHookG ( + linkedCallHookG linkedCallHookG_activeRealPre_of_noException + linkedCallHookG_eq_conj linkedCallHookG_visitedIn roTableGuard roTableGuard_stripS +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetCode (pureWordsProg_externAt_none) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhostK (emptyStdProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords (TrapHook) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8SingleBlock ( + fromUtf8Block fromUtf8PatchedWords fromUtf8PatchedWords_length + fromUtf8Placement pureWordsProg_fromUtf8_hasWords +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8Code ( + fromUtf8Placement_rho_table fromUtf8SpecK masterFromUtf8K_outcome_setPC + masterFromUtf8K_pre_setPC realFromUtf8Fallback realFromUtf8Fallback_processFieldsPreserved + specPreservesFsTrace_masterFromUtf8K specStripSInvariant_masterFromUtf8K + subroutine_ok_masterFromUtf8K_of_hasWords +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8Ghost ( + emptyFromUtf8GhostHook emptyFromUtf8GhostHookK + emptyFromUtf8GhostHook_asciiRO_ok emptyFromUtf8GhostHook_ascii_ok + emptyFromUtf8GhostHook_fs emptyFromUtf8GhostHookK_fs + emptyFromUtf8GhostHook_fsT emptyFromUtf8GhostHook_vmPreserved + fromUtf8GhostHook fromUtf8GhostHookK fromUtf8GhostHookK_keepLr_false_of_noException + fromUtf8GhostHook_visitedIn keepCoversFromUtf8_keepFromUtf8Block keepFromUtf8Block +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8LrTrap ( + FromUtf8EntryGuard emptyFromUtf8GhostHook_keepLr_false_after_hook_of_outcome_post + fromUtf8ByteLen fromUtf8_codeLoaded_stripExecOutside + fromUtf8_keepLr_false_after_hook_of_outcome_post keepFromUtf8Block_entry + keepFromUtf8Block_iff trapHook_emptyFromUtf8GhostHook_of_cover +) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric ( + h2fsgen_StepsVisitedIn h2fsgen_steps_lift_of_visitedIn_noExtern +) + +/-! ## 1. Row Anchor Definitions, Algebraic Identities, & `CodeLoaded` Bridges -/ + +/-- Canonical single-block `Obj.Placement` for `lsFromUtf8Sym` under `mpl`, placing `fromUtf8Block` + at `libsignalSessionLib.resolve mpl lsFromUtf8Sym` and the `256`-byte `UTF8_CHAR_WIDTH` `.rodata` + table (`coreUtf8CharWidthSym`) at `tbl` with optional linker relaxation `relax1`. -/ +@[expose] def fromUtf8MplPlacement (mpl : Obj.MultiPlacement) (tbl : BitVec 64) + (relax1 : Nat → Bool := fun _ => false) : Obj.Placement := + fromUtf8Placement (libsignalSessionLib.resolve mpl lsFromUtf8Sym) tbl relax1 + +private theorem fromUtf8Placement_base (entry tbl : BitVec 64) + (relax1 : Nat → Bool := fun _ => false) : + (fromUtf8Placement entry tbl relax1).base = entry := + rfl + +theorem fromUtf8MplPlacement_base (mpl : Obj.MultiPlacement) (tbl : BitVec 64) + (relax1 : Nat → Bool := fun _ => false) : + (fromUtf8MplPlacement mpl tbl relax1).base = + libsignalSessionLib.resolve mpl lsFromUtf8Sym := + fromUtf8Placement_base (libsignalSessionLib.resolve mpl lsFromUtf8Sym) tbl relax1 + +theorem fromUtf8MplPlacement_rho_table (mpl : Obj.MultiPlacement) (tbl : BitVec 64) + (relax1 : Nat → Bool := fun _ => false) : + (fromUtf8MplPlacement mpl tbl relax1).ρ coreUtf8CharWidthSym = tbl := + fromUtf8Placement_rho_table (libsignalSessionLib.resolve mpl lsFromUtf8Sym) tbl relax1 + +/-- Kept-region byte predicate `[pl.base, pl.base + 624)` for a `from_utf8` placement `pl`. -/ +@[expose] def keepR_fromUtf8 (pl : Obj.Placement) : BitVec 64 → Bool := + keepFromUtf8Block pl.base + +/-- `MultiPlacement`-indexed kept-region byte predicate `[resolve mpl lsFromUtf8Sym, +624)`. -/ +@[expose] def keepR_fromUtf8Mpl (mpl : Obj.MultiPlacement) : BitVec 64 → Bool := + keepFromUtf8Block (libsignalSessionLib.resolve mpl lsFromUtf8Sym) + +private theorem keepR_fromUtf8_placement (entry tbl : BitVec 64) + (relax1 : Nat → Bool := fun _ => false) : + keepR_fromUtf8 (fromUtf8Placement entry tbl relax1) = keepFromUtf8Block entry := + rfl + +theorem keepR_fromUtf8_mplPlacement (mpl : Obj.MultiPlacement) (tbl : BitVec 64) + (relax1 : Nat → Bool := fun _ => false) : + keepR_fromUtf8 (fromUtf8MplPlacement mpl tbl relax1) = keepR_fromUtf8Mpl mpl := + keepR_fromUtf8_placement (libsignalSessionLib.resolve mpl lsFromUtf8Sym) tbl relax1 + +/-- `pl.base` lies inside `keepR_fromUtf8 pl`. -/ +theorem keepR_fromUtf8_entry (pl : Obj.Placement) : + keepR_fromUtf8 pl pl.base = true := + keepFromUtf8Block_entry pl.base + +theorem keepR_fromUtf8Mpl_entry (mpl : Obj.MultiPlacement) : + keepR_fromUtf8Mpl mpl (libsignalSessionLib.resolve mpl lsFromUtf8Sym) = true := + keepFromUtf8Block_entry (libsignalSessionLib.resolve mpl lsFromUtf8Sym) + +/-- Pure `156`-word (`624`-byte) sub-program holding `fromUtf8PatchedWords pl` at `pl.base`. -/ +@[expose] def fromUtf8SubProg (pl : Obj.Placement) : Program := + pureWordsProg pl.base (fromUtf8PatchedWords pl) + +theorem fromUtf8SubProg_base (pl : Obj.Placement) : + (fromUtf8SubProg pl).base = pl.base := + rfl + +theorem fromUtf8SubProg_svc (pl : Obj.Placement) : + (fromUtf8SubProg pl).svc = Syscall.standard := + rfl + +theorem fromUtf8SubProg_externAt_none (pl : Obj.Placement) (pc : BitVec 64) : + (fromUtf8SubProg pl).externAt? pc = none := + pureWordsProg_externAt_none pl.base (fromUtf8PatchedWords pl) pc + +theorem fromUtf8SubProg_hasWords (pl : Obj.Placement) : + (fromUtf8SubProg pl).hasWords pl.base (fromUtf8PatchedWords pl) := + pureWordsProg_fromUtf8_hasWords pl + +private theorem pureWordsProg_code_length_aux (base : BitVec 64) (ws : List (BitVec 32)) : + (pureWordsProg base ws).code.length = 4 * ws.length := by + change (ws.flatMap Program.wordToBytesLE).length = 4 * ws.length + induction ws with + | nil => rfl + | cons _ rest ih => + simp only [List.flatMap_cons, List.length_append, ih] + change 4 + 4 * rest.length = 4 * (rest.length + 1) + omega + +theorem fromUtf8SubProg_code_length (pl : Obj.Placement) : + (fromUtf8SubProg pl).code.length = fromUtf8ByteLen := by + dsimp only [fromUtf8SubProg, fromUtf8ByteLen] + rw [pureWordsProg_code_length_aux, fromUtf8PatchedWords_length] + +theorem keepR_fromUtf8_of_code_offset (pl : Obj.Placement) {off : Nat} + (hoff : off < (fromUtf8SubProg pl).code.length) : + keepR_fromUtf8 pl ((fromUtf8SubProg pl).base + BitVec.ofNat 64 off) = true := by + rw [fromUtf8SubProg_code_length] at hoff + dsimp only [keepR_fromUtf8, fromUtf8SubProg_base] + rw [keepFromUtf8Block_iff] + have hsub : (pl.base + BitVec.ofNat 64 off) - pl.base = BitVec.ofNat 64 off := by bv_omega + have hoff_lt : off < 2 ^ 64 := by + have hb : fromUtf8ByteLen = 624 := rfl + omega + rw [hsub, BitVec.toNat_ofNat, Nat.mod_eq_of_lt hoff_lt] + exact hoff + +/-- Forward `CodeLoaded` projection onto `stripExecOutside (keepR_fromUtf8 pl) mem`. -/ +theorem fromUtf8SubProg_codeLoaded_stripExecOutside {pl : Obj.Placement} {mem : Memory} + (hL : (fromUtf8SubProg pl).CodeLoaded mem) : + (fromUtf8SubProg pl).CodeLoaded (stripExecOutside (keepR_fromUtf8 pl) mem) := + fromUtf8_codeLoaded_stripExecOutside (keepCoversFromUtf8_keepFromUtf8Block pl.base) hL + +/-- Reverse `CodeLoaded` projection from `stripExecOutside (keepR_fromUtf8 pl) mem` back to `mem` + (so STARTUP's `f3CodeInv_rxWords_codeLoaded_strip` directly discharges `H1`'s + `(fromUtf8SubProg pl).CodeLoaded u.mem` premise). -/ +theorem fromUtf8SubProg_codeLoaded_of_stripExecOutside {pl : Obj.Placement} {mem : Memory} + (hL : (fromUtf8SubProg pl).CodeLoaded (stripExecOutside (keepR_fromUtf8 pl) mem)) : + (fromUtf8SubProg pl).CodeLoaded mem := by + refine Program.CodeLoaded.intro hL.aligned hL.no_wrap fun i hi => ?_ + have hk : keepR_fromUtf8 pl ((fromUtf8SubProg pl).base + BitVec.ofNat 64 i) = true := + keepR_fromUtf8_of_code_offset pl hi + have hbyte := hL.byte_eq i hi + have hperm := hL.perm_eq i hi + have hlf := hL.isLazyFree_eq i hi + rw [ProofLib.strip_read8] at hbyte + rw [ProofLib.strip_perm_of_keep hk] at hperm + rw [ProofLib.strip_isLazyFree] at hlf + exact ⟨hbyte, hperm, hlf⟩ + +theorem fromUtf8SubProg_codeLoaded_stripExecOutside_iff {pl : Obj.Placement} {mem : Memory} : + (fromUtf8SubProg pl).CodeLoaded (stripExecOutside (keepR_fromUtf8 pl) mem) ↔ + (fromUtf8SubProg pl).CodeLoaded mem := + ⟨fromUtf8SubProg_codeLoaded_of_stripExecOutside, fromUtf8SubProg_codeLoaded_stripExecOutside⟩ + +/-- `W`-independent ghost hook for `lsFromUtf8Sym` at placement `pl` + (`P_run := emptyStdProg`, `fallback := realFromUtf8Fallback`). -/ +@[expose] noncomputable def fromUtf8Ghost (pl : Obj.Placement) : State → State := + emptyFromUtf8GhostHook (keepR_fromUtf8 pl) pl + +/-- `K`-narrowed `W`-independent ghost hook spare for `lsFromUtf8Sym` at placement `pl` (`N2`). -/ +@[expose] noncomputable def fromUtf8GhostK (pl : Obj.Placement) : State → State := + emptyFromUtf8GhostHookK (keepR_fromUtf8 pl) pl + +/-- `(mpl, mmpl, tbl, relax1)`-indexed `W`-independent ghost hook for `CliGhostHooks.extra` entry + `(lsFromUtf8Sym, fromUtf8MplGhost mpl mmpl tbl relax1)`. -/ +@[expose] noncomputable def fromUtf8MplGhost (mpl _mmpl : Obj.MultiPlacement) (tbl : BitVec 64) + (relax1 : Nat → Bool := fun _ => false) : State → State := + fromUtf8Ghost (fromUtf8MplPlacement mpl tbl relax1) + +/-- `(mpl, mmpl, tbl, relax1)`-indexed `K`-narrowed ghost hook spare (`N2`). -/ +@[expose] noncomputable def fromUtf8MplGhostK (mpl _mmpl : Obj.MultiPlacement) (tbl : BitVec 64) + (relax1 : Nat → Bool := fun _ => false) : State → State := + fromUtf8GhostK (fromUtf8MplPlacement mpl tbl relax1) + +/-- Block-`617` entry-state `lr` guard for `lsFromUtf8Sym` (`C11` §6.3, `ccard_recipe.md` §2.2): + `keepR_fromUtf8Mpl mpl (s0.readReg64 .lr) = false ∧ s0.readReg64 .lr ≠ resolve mpl lsFromUtf8Sym`. -/ +@[expose] def fromUtf8EntryGuard (mpl : Obj.MultiPlacement) (s0 : State) : Prop := + FromUtf8EntryGuard (libsignalSessionLib.resolve mpl lsFromUtf8Sym) + (libsignalSessionLib.resolve mpl lsFromUtf8Sym) s0 + +theorem fromUtf8EntryGuard_iff (mpl : Obj.MultiPlacement) (s0 : State) : + fromUtf8EntryGuard mpl s0 ↔ + keepR_fromUtf8Mpl mpl (s0.readReg64 .lr) = false ∧ + s0.readReg64 .lr ≠ libsignalSessionLib.resolve mpl lsFromUtf8Sym := + Iff.rfl + +/-! ## 2. Artifact 1 — `GhostRowSpecOk lsFromUtf8Sym` -/ + +theorem fromUtf8Ghost_fs (pl : Obj.Placement) (s : State) : + (fromUtf8Ghost pl s).fs = s.fs := + emptyFromUtf8GhostHook_fs (keepR_fromUtf8 pl) pl s + +theorem fromUtf8Ghost_fsT (pl : Obj.Placement) : + HookFsTraced IsFsC (fromUtf8Ghost pl) := + emptyFromUtf8GhostHook_fsT (keepR_fromUtf8 pl) pl + +theorem fromUtf8Ghost_vmPreserved {pl : Obj.Placement} (hpl : fromUtf8Block.Placeable pl) + (s : State) : + LibsignalBinary.Heap.VmPreserved s (fromUtf8Ghost pl s) := + emptyFromUtf8GhostHook_vmPreserved (keepR_fromUtf8 pl) hpl s + +/-- `FromUtf8RowSpec` (all `6` consumer arms: RW/RO × plain/`withVmPreserved`/`withAlloc`) for + `fromUtf8Ghost pl` under pure decidable `hpl : fromUtf8Block.Placeable pl`. -/ +theorem fromUtf8Ghost_fromUtf8RowSpec {pl : Obj.Placement} (hpl : fromUtf8Block.Placeable pl) : + FromUtf8RowSpec (fromUtf8Ghost pl) := + FromUtf8RowSpec.of_vm + (fun stk => emptyFromUtf8GhostHook_ascii_ok (keepR_fromUtf8 pl) hpl stk) + (fun stk => emptyFromUtf8GhostHook_asciiRO_ok (keepR_fromUtf8 pl) hpl stk) + (fromUtf8Ghost_vmPreserved hpl) + +/-- **Artifact 1 (`C11` §1.2, §6.1):** `GhostRowSpecOk lsFromUtf8Sym (fromUtf8Ghost pl)` under pure + decidable `hpl : fromUtf8Block.Placeable pl` (`0` runtime/state/memory/`W` premises). -/ +theorem fromUtf8Ghost_rowSpecOk [LibsignalPlacement] {pl : Obj.Placement} (hpl : fromUtf8Block.Placeable pl) : + GhostRowSpecOk lsFromUtf8Sym (fromUtf8Ghost pl) where + fs_eq := fromUtf8Ghost_fs pl + fsT := fromUtf8Ghost_fsT pl + rowSpec := by + change ExtraRowSpec lsFromUtf8Sym (fromUtf8Ghost pl) + simpa [ExtraRowSpec, lsFromUtf8Sym] using fromUtf8Ghost_fromUtf8RowSpec hpl + +/-- `MultiPlacement`-indexed `GhostRowSpecOk lsFromUtf8Sym` for `fromUtf8MplGhost`. -/ +theorem fromUtf8MplGhost_rowSpecOk [LibsignalPlacement] (mpl mmpl : Obj.MultiPlacement) (tbl : BitVec 64) + (relax1 : Nat → Bool := fun _ => false) + (hpl : fromUtf8Block.Placeable (fromUtf8MplPlacement mpl tbl relax1)) : + GhostRowSpecOk lsFromUtf8Sym (fromUtf8MplGhost mpl mmpl tbl relax1) := + fromUtf8Ghost_rowSpecOk hpl + +/-! ## 3. `ExecFrozen` Preservation & `K`-Route `StepsVisitedIn` Helper -/ + +/-- `linkedCallHookG` preserves `ExecFrozen` unconditionally whenever `fallback` preserves + `ExecFrozen`: + - On `ActiveRealPre ∧ (Guard ∧ ActiveRealRun)`, `ActiveRealRun`'s witness carries + `ExecFrozen sf.mem`; + - On `ActiveRealPre ∧ ¬ (Guard ∧ ActiveRealRun)`, `(keepFsTrace fallback u).mem = (fallback u).mem`; + - On `¬ ActiveRealPre`, `.mem = u.mem`. -/ +theorem linkedCallHookG_preserves_execFrozen {α : Type} + {Guard : State → Prop} {keep : BitVec 64 → Bool} {P_real P_sub : Program} + {entryTarget : BitVec 64} {spec : Spec α} {fallback : State → State} + (hfb : ∀ s : State, ExecFrozen s.mem → ExecFrozen (fallback s).mem) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (linkedCallHookG Guard keep P_real P_sub entryTarget spec fallback u).mem := by + classical + rw [linkedCallHookG_eq_conj] + split + · split + · rename_i hReal + exact (Classical.choose_spec hReal.2.2.2.2).2.2.2.2 + · have hmem : (keepFsTrace fallback u).mem = (fallback u).mem := by + cases u; rfl + rw [hmem] + exact hfb u hfr + · exact hfr + +/-- `realFromUtf8Fallback` preserves `m.perm` pointwise (`realFromUtf8Fallback_processFieldsPreserved`), + so it preserves `ExecFrozen` unconditionally. -/ +theorem realFromUtf8Fallback_preserves_execFrozen {s : State} (hfr : ExecFrozen s.mem) : + ExecFrozen (realFromUtf8Fallback s).mem := + hfr.of_perm_eq (realFromUtf8Fallback_processFieldsPreserved s).2.2.2.2.2.2.2 + +theorem fromUtf8GhostHook_preserves_execFrozen + (tbl : BitVec 64) (keep : BitVec 64 → Bool) (P_real P_sub : Program) (entryTarget : BitVec 64) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (fromUtf8GhostHook tbl keep P_real P_sub entryTarget u).mem := + linkedCallHookG_preserves_execFrozen (fun _ hs => realFromUtf8Fallback_preserves_execFrozen hs) hfr + +theorem fromUtf8GhostHookK_preserves_execFrozen + (tbl : BitVec 64) (keep : BitVec 64 → Bool) (P_real P_sub : Program) (entryTarget : BitVec 64) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (fromUtf8GhostHookK tbl keep P_real P_sub entryTarget u).mem := + linkedCallHookG_preserves_execFrozen (fun _ hs => realFromUtf8Fallback_preserves_execFrozen hs) hfr + +theorem fromUtf8Ghost_preserves_execFrozen (pl : Obj.Placement) {u : State} + (hfr : ExecFrozen u.mem) : + ExecFrozen (fromUtf8Ghost pl u).mem := + fromUtf8GhostHook_preserves_execFrozen (pl.ρ coreUtf8CharWidthSym) (keepR_fromUtf8 pl) + emptyStdProg (fromUtf8SubProg pl) pl.base hfr + +theorem fromUtf8GhostK_preserves_execFrozen (pl : Obj.Placement) {u : State} + (hfr : ExecFrozen u.mem) : + ExecFrozen (fromUtf8GhostK pl u).mem := + fromUtf8GhostHookK_preserves_execFrozen (pl.ρ coreUtf8CharWidthSym) (keepR_fromUtf8 pl) + emptyStdProg (fromUtf8SubProg pl) pl.base hfr + +/-- `StepsVisitedIn` witness for `K`-narrowed `fromUtf8GhostHookK` (mirroring + `FromUtf8Ghost.fromUtf8GhostHook_visitedIn`). -/ +theorem fromUtf8GhostHookK_visitedIn + {keep : BitVec 64 → Bool} {P_run P_sub : Program} {pl : Obj.Placement} + (hpl : fromUtf8Block.Placeable pl) + (hsvc_run : P_run.svc = Syscall.standard) (hsvc_sub : P_sub.svc = Syscall.standard) + (hrun_no : ∀ pc, keep pc = true → P_run.externAt? pc = none) + (hsub_no : ∀ pc, P_sub.externAt? pc = none) + (hwords : P_sub.hasWords pl.base (fromUtf8PatchedWords pl)) {s0 : State} + (hG : roTableGuard (pl.ρ coreUtf8CharWidthSym) corePlacedData1 s0) + (hnoex : ∀ msg, + (fromUtf8GhostHookK (pl.ρ coreUtf8CharWidthSym) keep P_run P_sub pl.base s0).status ≠ + .Exception msg) + (hFr : ExecFrozen s0.mem) (hlr_out : keep (s0.readReg64 .lr) = false) + (hCodeSub : P_sub.CodeLoaded (stripExecOutside keep s0.mem)) : + h2fsgen_StepsVisitedIn keep P_run (s0.setPC pl.base) + (fromUtf8GhostHookK (pl.ρ coreUtf8CharWidthSym) keep P_run P_sub pl.base s0) ∧ + ExecFrozen (fromUtf8GhostHookK (pl.ρ coreUtf8CharWidthSym) keep P_run P_sub pl.base s0).mem := + linkedCallHookG_visitedIn hsvc_run hsvc_sub hrun_no hsub_no + (roTableGuard_stripS keep pl.base (pl.ρ coreUtf8CharWidthSym) corePlacedData1) + (subroutine_ok_masterFromUtf8K_of_hasWords keep hpl hsub_no hwords) + (specStripSInvariant_masterFromUtf8K keep) (specPreservesFsTrace_masterFromUtf8K keep) + (masterFromUtf8K_pre_setPC keep) (masterFromUtf8K_outcome_setPC keep) hG + (linkedCallHookG_activeRealPre_of_noException hnoex) hFr hlr_out hCodeSub + +/-! ## 4. Generic-`InvS` `GhostRowReplayOn` (Artifact 2a) & Full `GhostRowOk` -/ + +private theorem setPC_eq_self_of_pc_eq {u : State} {pc : BitVec 64} (hpc : u.pc = pc) : + u.setPC pc = u := by + cases u + dsimp only [State.setPC] at hpc ⊢ + subst hpc + rfl + +private theorem realProg617_svc (mpl mmpl : Obj.MultiPlacement) (W : CliHooks) : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).svc = Syscall.standard := + rfl + +private theorem emptyStdProg_svc_eq : emptyStdProg.svc = Syscall.standard := + rfl + +private theorem emptyStdProg_externAt (pc : BitVec 64) : + emptyStdProg.externAt? pc = none := + rfl + +/-- **Artifact 2a (`C11` §1.3, §6.2) — Generic-`InvS` `GhostRowReplayOn` for `lsFromUtf8Sym`:** + - **F1 compliance:** `hRealHullNoExt` quantifies over `keepR_fromUtf8 pl pc = true` **only** on + the de-hooked real program `cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W` (`N1`: + post-Cutover-2). On `P_ghost`, `hGhostNoExtNe` strictly excludes + `pc ≠ libsignalSessionLib.resolve mpl lsFromUtf8Sym`. + - **H1 + `.rodata` compliance:** `hCL` supplies `(fromUtf8SubProg pl).CodeLoaded u.mem` and + `hRo` supplies `RoDataAt u.mem (pl.ρ coreUtf8CharWidthSym) corePlacedData1` at the call state + `u` from `InvS u` (never `s0.mem`). -/ +theorem fromUtf8Ghost_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (pl : Obj.Placement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hpl : fromUtf8Block.Placeable pl) + (hTargetEq : libsignalSessionLib.resolve mpl lsFromUtf8Sym = pl.base) + (hCL : ∀ u : State, InvS u → (fromUtf8SubProg pl).CodeLoaded u.mem) + (hRo : ∀ u : State, ExecFrozen u.mem → InvS u → + RoDataAt u.mem (pl.ρ coreUtf8CharWidthSym) corePlacedData1) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (libsignalSessionLib.resolve mpl lsFromUtf8Sym) = some (fromUtf8Ghost pl)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_fromUtf8 pl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_fromUtf8 pl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsFromUtf8Sym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG lsFromUtf8Sym (fromUtf8EntryGuard mpl) (fromUtf8Ghost pl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨fromUtf8Ghost_preserves_execFrozen pl hfr, fromUtf8Ghost_fs pl u⟩ + replay_at_stub := by + intro W s0 sf _ _ _ hEntry hRetPc hNoExSf hNotHaltSf + right + have hRealStub : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl lsFromUtf8Sym) = none := by + rw [hTargetEq] + exact hRealHullNoExt W (keepR_fromUtf8_entry pl) + refine ⟨hRealStub, ?_⟩ + intro u _ hStepsAfter hpc hrun hnoex hkf hfr hInvU + have hCodeU : (fromUtf8SubProg pl).CodeLoaded u.mem := hCL u hInvU + have hGhostBase : + (cliProgExtPlacedAt mpl EG 617 W).externAt? pl.base = + some (emptyFromUtf8GhostHook (keepR_fromUtf8 pl) pl) := by + rw [← hTargetEq] + exact hGhostAt W + have hLrS0 : keepFromUtf8Block pl.base (s0.readReg64 .lr) = false := by + rw [← hTargetEq] + exact hEntry.1 + have hLrOut : keepR_fromUtf8 pl (u.readReg64 .lr) = false := + emptyFromUtf8GhostHook_keepLr_false_after_hook_of_outcome_post + (P_ghost := cliProgExtPlacedAt mpl EG 617 W) + (keepR := keepR_fromUtf8 pl) + (pl := pl) + (keepCoversFromUtf8_keepFromUtf8Block pl.base) + (fun _ hk hne => hGhostNoExtNe W hk (by rw [hTargetEq]; exact hne)) + (Or.inr hGhostBase) + hLrS0 + hRetPc + hNoExSf + hNotHaltSf + u + hStepsAfter + hrun + (hCodeU.of_keepsFrozen hkf) + have hCodeStrip : + (fromUtf8SubProg pl).CodeLoaded (stripExecOutside (keepR_fromUtf8 pl) u.mem) := + fromUtf8SubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨hvis, hfr_fu⟩ := + fromUtf8GhostHook_visitedIn + (keep := keepR_fromUtf8 pl) + (P_run := emptyStdProg) + (P_sub := fromUtf8SubProg pl) + (pl := pl) + hpl + emptyStdProg_svc_eq + (fromUtf8SubProg_svc pl) + (fun pc _ => emptyStdProg_externAt pc) + (fromUtf8SubProg_externAt_none pl) + (fromUtf8SubProg_hasWords pl) + (hRo u hfr hInvU) + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC pl.base) (fromUtf8Ghost pl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_fromUtf8 pl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc_eq.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hSetPC : u.setPC pl.base = u := + setPC_eq_self_of_pc_eq (hpc.trans hTargetEq) + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (fromUtf8Ghost pl u) hInvU hkf (fromUtf8Ghost_fs pl u)⟩ + +/-- `MultiPlacement`-indexed specialization of `fromUtf8Ghost_rowReplayOn` + (`hTargetEq` discharged by `fromUtf8MplPlacement_base`, `.rodata` table address normalized to `tbl`). -/ +theorem fromUtf8MplGhost_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) (tbl : BitVec 64) + (relax1 : Nat → Bool := fun _ => false) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hpl : fromUtf8Block.Placeable (fromUtf8MplPlacement mpl tbl relax1)) + (hCL : ∀ u : State, InvS u → (fromUtf8SubProg (fromUtf8MplPlacement mpl tbl relax1)).CodeLoaded u.mem) + (hRo : ∀ u : State, ExecFrozen u.mem → InvS u → RoDataAt u.mem tbl corePlacedData1) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (libsignalSessionLib.resolve mpl lsFromUtf8Sym) = + some (fromUtf8MplGhost mpl mmpl tbl relax1)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_fromUtf8Mpl mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_fromUtf8Mpl mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsFromUtf8Sym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG lsFromUtf8Sym (fromUtf8EntryGuard mpl) + (fromUtf8MplGhost mpl mmpl tbl relax1) := + fromUtf8Ghost_rowReplayOn mpl mmpl (fromUtf8MplPlacement mpl tbl relax1) InvS EG hpl + (fromUtf8MplPlacement_base mpl tbl relax1).symm hCL + (fun u hfr hInv => by + rw [fromUtf8MplPlacement_rho_table mpl tbl relax1] + exact hRo u hfr hInv) + hInvKeep hGhostAt + (fun W {_} hk => hRealHullNoExt W (keepR_fromUtf8_mplPlacement mpl tbl relax1 ▸ hk)) + (fun W {_} hk hne => hGhostNoExtNe W (keepR_fromUtf8_mplPlacement mpl tbl relax1 ▸ hk) hne) + +/-- `C4` interior-stub wrapper for `fromUtf8Ghost_rowReplayOn` (accepting split `hRealNone` at + `stubPc` + `hInteriorGhost` with the `Or.inr` `TrapHook` interior-stub disjunct on + `pc ≠ resolve mpl lsFromUtf8Sym`). -/ +theorem fromUtf8Ghost_rowReplayOn_of_interior + (mpl mmpl : Obj.MultiPlacement) + (pl : Obj.Placement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hpl : fromUtf8Block.Placeable pl) + (hTargetEq : libsignalSessionLib.resolve mpl lsFromUtf8Sym = pl.base) + (hCL : ∀ u : State, InvS u → (fromUtf8SubProg pl).CodeLoaded u.mem) + (hRo : ∀ u : State, ExecFrozen u.mem → InvS u → + RoDataAt u.mem (pl.ρ coreUtf8CharWidthSym) corePlacedData1) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (libsignalSessionLib.resolve mpl lsFromUtf8Sym) = some (fromUtf8Ghost pl)) + (hRealNone : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl lsFromUtf8Sym) = none) + (hInteriorGhost : ∀ (W : CliHooks) (pc : BitVec 64), + keepR_fromUtf8 pl pc = true → pc ≠ libsignalSessionLib.resolve mpl lsFromUtf8Sym → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none ∧ + ((cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ gStub, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some gStub ∧ + ∀ L : BitVec 64, keepR_fromUtf8 pl L = true → TrapHook L gStub)) : + GhostRowReplayOn mpl mmpl InvS EG lsFromUtf8Sym (fromUtf8EntryGuard mpl) (fromUtf8Ghost pl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨fromUtf8Ghost_preserves_execFrozen pl hfr, fromUtf8Ghost_fs pl u⟩ + replay_at_stub := by + intro W s0 sf _ _ _ hEntry hRetPc hNoExSf hNotHaltSf + have hRealHullNoExt : ∀ {pc : BitVec 64}, + keepR_fromUtf8 pl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := by + intro pc hk + by_cases hEq : pc = libsignalSessionLib.resolve mpl lsFromUtf8Sym + · rw [hEq]; exact hRealNone W + · exact (hInteriorGhost W pc hk hEq).1 + have hRegExt : ∀ pc : BitVec 64, keepFromUtf8Block pl.base pc = true → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ f, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some f ∧ + ∀ L : BitVec 64, keepFromUtf8Block pl.base L = true → TrapHook L f := by + intro pc hk + by_cases hEq : pc = libsignalSessionLib.resolve mpl lsFromUtf8Sym + · rw [hEq] + exact Or.inr ⟨fromUtf8Ghost pl, hGhostAt W, fun _ hL => + trapHook_emptyFromUtf8GhostHook_of_cover pl + (keepCoversFromUtf8_keepFromUtf8Block pl.base) hL⟩ + · rcases (hInteriorGhost W pc hk hEq).2 with hNone | ⟨gStub, hSome, hTrap⟩ + · exact Or.inl hNone + · exact Or.inr ⟨gStub, hSome, hTrap⟩ + right + refine ⟨hRealNone W, ?_⟩ + intro u _ hStepsAfter hpc hrun hnoex hkf hfr hInvU + have hCodeU : (fromUtf8SubProg pl).CodeLoaded u.mem := hCL u hInvU + have hLrS0 : keepFromUtf8Block pl.base (s0.readReg64 .lr) = false := by + rw [← hTargetEq] + exact hEntry.1 + have hLrOut : keepR_fromUtf8 pl (u.readReg64 .lr) = false := + fromUtf8_keepLr_false_after_hook_of_outcome_post + (P_ghost := cliProgExtPlacedAt mpl EG 617 W) + (P_sub := fromUtf8SubProg pl) + (pl := pl) + (f_stub := fromUtf8Ghost pl) + (fromUtf8SubProg_hasWords pl) + hRegExt + (fun _ hL => trapHook_emptyFromUtf8GhostHook_of_cover pl + (keepCoversFromUtf8_keepFromUtf8Block pl.base) hL) + hLrS0 + hRetPc + hNoExSf + hNotHaltSf + u + hStepsAfter + hrun + (hCodeU.of_keepsFrozen hkf) + have hCodeStrip : + (fromUtf8SubProg pl).CodeLoaded (stripExecOutside (keepR_fromUtf8 pl) u.mem) := + fromUtf8SubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨hvis, hfr_fu⟩ := + fromUtf8GhostHook_visitedIn + (keep := keepR_fromUtf8 pl) + (P_run := emptyStdProg) + (P_sub := fromUtf8SubProg pl) + (pl := pl) + hpl + emptyStdProg_svc_eq + (fromUtf8SubProg_svc pl) + (fun pc _ => emptyStdProg_externAt pc) + (fromUtf8SubProg_externAt_none pl) + (fromUtf8SubProg_hasWords pl) + (hRo u hfr hInvU) + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC pl.base) (fromUtf8Ghost pl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_fromUtf8 pl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc_eq.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt hk) + hvis + have hSetPC : u.setPC pl.base = u := + setPC_eq_self_of_pc_eq (hpc.trans hTargetEq) + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (fromUtf8Ghost pl u) hInvU hkf (fromUtf8Ghost_fs pl u)⟩ + +/-- `K`-narrowed `fromUtf8GhostK` spare `GhostRowReplayOn` (`entryGuard := fun _ => True`; + note `N2`: spare only, no `GhostRowSpecOk` partner). -/ +theorem fromUtf8GhostK_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (pl : Obj.Placement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hpl : fromUtf8Block.Placeable pl) + (hTargetEq : libsignalSessionLib.resolve mpl lsFromUtf8Sym = pl.base) + (hCL : ∀ u : State, InvS u → (fromUtf8SubProg pl).CodeLoaded u.mem) + (hRo : ∀ u : State, ExecFrozen u.mem → InvS u → + RoDataAt u.mem (pl.ρ coreUtf8CharWidthSym) corePlacedData1) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_fromUtf8 pl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG lsFromUtf8Sym (fun _ => True) (fromUtf8GhostK pl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨fromUtf8GhostK_preserves_execFrozen pl hfr, emptyFromUtf8GhostHookK_fs (keepR_fromUtf8 pl) pl u⟩ + replay_at_stub := by + intro W _ _ _ _ _ _ _ _ _ + right + have hRealStub : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl lsFromUtf8Sym) = none := by + rw [hTargetEq] + exact hRealHullNoExt W (keepR_fromUtf8_entry pl) + refine ⟨hRealStub, ?_⟩ + intro u _ _ hpc hrun hnoex hkf hfr hInvU + have hCodeStrip : + (fromUtf8SubProg pl).CodeLoaded (stripExecOutside (keepR_fromUtf8 pl) u.mem) := + fromUtf8SubProg_codeLoaded_stripExecOutside (hCL u hInvU) + have hLrOut : keepR_fromUtf8 pl (u.readReg64 .lr) = false := + fromUtf8GhostHookK_keepLr_false_of_noException hnoex + obtain ⟨hvis, hfr_fu⟩ := + fromUtf8GhostHookK_visitedIn + (keep := keepR_fromUtf8 pl) + (P_run := emptyStdProg) + (P_sub := fromUtf8SubProg pl) + (pl := pl) + hpl + emptyStdProg_svc_eq + (fromUtf8SubProg_svc pl) + (fun pc _ => emptyStdProg_externAt pc) + (fromUtf8SubProg_externAt_none pl) + (fromUtf8SubProg_hasWords pl) + (hRo u hfr hInvU) + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC pl.base) (fromUtf8GhostK pl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_fromUtf8 pl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc_eq.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hSetPC : u.setPC pl.base = u := + setPC_eq_self_of_pc_eq (hpc.trans hTargetEq) + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, + hInvKeep u (fromUtf8GhostK pl u) hInvU hkf (emptyFromUtf8GhostHookK_fs (keepR_fromUtf8 pl) pl u)⟩ + +/-- Guard-strengthening adapter on `GhostRowReplayOn` (for `ExtraListReplaysOn` when `guardOf sym` + implies `entryGuard`). -/ +theorem ghostRowReplayOn_of_guard_imp + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + {EG : CliHooks → String → Option (State → State)} + {sym : String} {entryGuard guard' : State → Prop} {f : State → State} + (hRow : GhostRowReplayOn mpl mmpl InvS EG sym entryGuard f) + (hImp : ∀ s0 : State, guard' s0 → entryGuard s0) : + GhostRowReplayOn mpl mmpl InvS EG sym guard' f where + preserves_execFrozen := hRow.preserves_execFrozen + replay_at_stub := fun W s0 sf hG hRet hNoEx hNHalt => + hRow.replay_at_stub W s0 sf (hImp s0 hG) hRet hNoEx hNHalt + +/-- Full per-row `GhostRowOk` bundle (`GhostRowSpecOk` ∧ `GhostRowReplayOn`) for `lsFromUtf8Sym`. -/ +theorem fromUtf8Ghost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (pl : Obj.Placement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hpl : fromUtf8Block.Placeable pl) + (hTargetEq : libsignalSessionLib.resolve mpl lsFromUtf8Sym = pl.base) + (hCL : ∀ u : State, InvS u → (fromUtf8SubProg pl).CodeLoaded u.mem) + (hRo : ∀ u : State, ExecFrozen u.mem → InvS u → + RoDataAt u.mem (pl.ρ coreUtf8CharWidthSym) corePlacedData1) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (libsignalSessionLib.resolve mpl lsFromUtf8Sym) = some (fromUtf8Ghost pl)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_fromUtf8 pl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_fromUtf8 pl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsFromUtf8Sym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowOk mpl mmpl InvS EG lsFromUtf8Sym (fromUtf8EntryGuard mpl) (fromUtf8Ghost pl) := + ⟨fromUtf8Ghost_rowSpecOk hpl, + fromUtf8Ghost_rowReplayOn mpl mmpl pl InvS EG hpl hTargetEq hCL hRo hInvKeep hGhostAt + hRealHullNoExt hGhostNoExtNe⟩ + +/-- `MultiPlacement`-indexed full `GhostRowOk` bundle for `fromUtf8MplGhost`. -/ +theorem fromUtf8MplGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) (tbl : BitVec 64) + (relax1 : Nat → Bool := fun _ => false) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hpl : fromUtf8Block.Placeable (fromUtf8MplPlacement mpl tbl relax1)) + (hCL : ∀ u : State, InvS u → (fromUtf8SubProg (fromUtf8MplPlacement mpl tbl relax1)).CodeLoaded u.mem) + (hRo : ∀ u : State, ExecFrozen u.mem → InvS u → RoDataAt u.mem tbl corePlacedData1) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (libsignalSessionLib.resolve mpl lsFromUtf8Sym) = + some (fromUtf8MplGhost mpl mmpl tbl relax1)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_fromUtf8Mpl mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_fromUtf8Mpl mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsFromUtf8Sym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowOk mpl mmpl InvS EG lsFromUtf8Sym (fromUtf8EntryGuard mpl) + (fromUtf8MplGhost mpl mmpl tbl relax1) := + ⟨fromUtf8MplGhost_rowSpecOk mpl mmpl tbl relax1 hpl, + fromUtf8MplGhost_rowReplayOn mpl mmpl tbl relax1 InvS EG hpl hCL hRo hInvKeep hGhostAt + hRealHullNoExt hGhostNoExtNe⟩ + +/-! ## 5. Per-Arm & Singleton `ExtraEntryGuard` Helpers (`ccard_recipe.md` §2.1, `N3`) -/ + +/-- Per-arm `lsFromUtf8Sym` discharge for any `guardOf : String → State → Prop` agreeing with + `fromUtf8EntryGuard mpl` on `lsFromUtf8Sym`. -/ +theorem extraEntryGuard_fromUtf8_arm + {mpl : Obj.MultiPlacement} {guardOf : String → State → Prop} {s0 : State} + (hGuardEq : guardOf lsFromUtf8Sym s0 ↔ fromUtf8EntryGuard mpl s0) + (hGuard : fromUtf8EntryGuard mpl s0) : + guardOf lsFromUtf8Sym s0 := + hGuardEq.mpr hGuard + +/-- Table-level `ExtraEntryGuard guardOf g s0` discharge when `g.extra` carries the singleton + `lsFromUtf8Sym` row `[(lsFromUtf8Sym, fRow)]` (`N3`: 1-row helper; multi-row C2 tables assemble + `ExtraListEntryGuard` from `extraEntryGuard_fromUtf8_arm`). -/ +theorem extraEntryGuard_singleton_fromUtf8 + {mpl : Obj.MultiPlacement} {guardOf : String → State → Prop} + {g : CliGhostHooks} {fRow : State → State} {s0 : State} + (hg : g.extra = [(lsFromUtf8Sym, fRow)]) + (hGuardEq : guardOf lsFromUtf8Sym s0 ↔ fromUtf8EntryGuard mpl s0) + (hGuard : fromUtf8EntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := by + intro sym f _ hLook + rw [hg] at hLook + simp only [List.lookup] at hLook + by_cases hSym : (sym == lsFromUtf8Sym) = true + · have hEq : sym = lsFromUtf8Sym := eq_of_beq hSym + subst hEq + exact hGuardEq.mpr hGuard + · simp [hSym] at hLook + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8GhostReplays diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/MemmoveCode.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/MemmoveCode.lean index 81d384234..862626ec9 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/MemmoveCode.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/MemmoveCode.lean @@ -717,14 +717,10 @@ theorem hookOk_memmoveSpecK_map_frame_pureAbort (keep : BitVec 64 → Bool) HookOk f (memmoveSpecK keep target) := MemcpyCode.hookOk_memcpySpecK_map_frame_pureAbort keep g F hh hpre hpost hpan hex hoom -/-- Bounded (`MemmoveArithBound`) counterpart of `VecDequeGrowBudgetAux.sessionMemmoveAcpSpec`: - same `AllocCallPreserved ∧ VmPreserved` postcondition, gated by `MemmoveArithBound base buf` - in `.pre` so real `libc.a` `memmove` satisfies it (`VecDequeGrowBudget` / `AddChunkCl1PlacedBudget` - / `SpqrChainPlacedInstBudget:1389`). -/ -@[expose] def sessionMemmoveBoundedAcpSpec (hookStack : Nat := 4096) : - Spec (BitVec 64 × List (BitVec 8) × Nat × Nat × Nat) := - { sessionMemmoveAcpSpec hookStack with - pre := (sessionMemmoveBoundedSpec hookStack).pre } +/- Bounded (`MemmoveArithBound`) counterpart of `VecDequeGrowBudgetAux.sessionMemmoveAcpSpec`: + moved to `VecDequeGrowBudgetAux` and re-exported here so `MemmoveGhost`/`MemmoveGhostK` + callers continue to resolve unchanged (`S2`). -/ +export LibsignalBinary.Proofs.SpqrV1.Alloc.VecDequeGrowBudgetAux (sessionMemmoveBoundedAcpSpec) private theorem bounded_pre_entails_master (stk : Nat) (x : BitVec 64 × List (BitVec 8) × Nat × Nat × Nat) (s0 : State) : diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/MemmoveExtraReplays.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/MemmoveExtraReplays.lean new file mode 100644 index 000000000..4c2b2471d --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/MemmoveExtraReplays.lean @@ -0,0 +1,763 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveCode -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveGhost -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveGhostK -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveGhostReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveLrTrap -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveLrTrapBase -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.MemmoveRowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric -- proof-setup: allow-public-import + +/-! +# Card CC-MEMMOVE (`memmove`) — `"memmove"` `CliGhostHooks.extra` Specs, `GhostRowSpecOk`, `GhostRowReplayOn`, & `GhostRowOk` (`HooksDehook.MemmoveExtraReplays`) + +Cutover-2 `c`-card assembly for the `libc.a` `"memmove"` row over the `239`-word (`956` B) +`.text.b_pre` hull `bPreHullWords` (`memcpy` at `m := resolve mpl "memcpy"`, 1-word `0#32` pad at +`m + 396`, `memset` at `m + 400`, `memmove` at `m + 660`), leaving the GO'd +`HooksDehook.MemmoveGhostReplays` module completely untouched: + +1. **`.text.b_pre` Hull Carrier, `keepR_memmove`, `W`-Independent `memmoveGhost`, & `GhostRowSpecOk` (`§1`–`§2`):** + - Defines `memcpyEntry mpl := libsignalSessionLib.resolve mpl "memcpy"`, + `memmoveEntry mpl := libsignalSessionLib.resolve mpl "memmove"`, + `keepR_memmove mpl := keepBPreHull (memcpyEntry mpl)`, + `memmoveHullWords mpl := bPreHullWords (memcpyEntry mpl) (libsignalSessionLib.resolve mpl) bPrePadWord`, + `memmoveSubProg mpl := pureWordsProg (memcpyEntry mpl) (memmoveHullWords mpl)`, and + `memmoveGhost mpl _mmpl := f3EmptyMemmoveGhostHook (keepR_memmove mpl) (memmoveSubProg mpl) + (memcpyEntry mpl + bPreMemmoveByteOff)` (`W`-free: `P_real := emptyStdProg`, + `fallback := hookMemmove`, definitionally equal to `f3PureMemmoveGhostHook`). + - Proves **unconditional** (`0` layout or memory premises) `memmoveGhost_vmPreserved`, + `memmoveGhost_allocCallPreserved`, `memmoveGhost_fs`, `memmoveGhost_fsT`, all `#1348` + `*BoundedSpec` `HookOk` arms (`libcMemmoveBoundedSpec`, `sessionMemmoveBoundedSpec`, + `sessionMemmoveBoundedBudgetSpec`, `withVmPreserved`, and `withAlloc`), + `memmoveGhost_memmoveRowSpec`, and **`memmoveGhost_rowSpecOk`** + (`GhostRowSpecOk "memmove" (memmoveGhost mpl mmpl)` against the `CC-ROWSPEC` narrowed + `MemmoveRowSpec`). +2. **3-Entry `.text.b_pre` Hull & Interior-`TrapHook` `GhostRowReplayOn` & `GhostRowOk` (`§3`):** + - Proves `memmoveGhost_rowReplayOn`, `memmoveGhost_rowOk`, + `memmoveGhost_rowReplayOn_of_interior`, and `memmoveGhost_rowOk_of_interior` over arbitrary + `InvS : State → Prop` using L3-d `MemmoveLrTrap`'s `hother`-free 3-entry `.text.b_pre` hull + (`["memmove", "memcpy", "memset"]`) `C4`+`F1`+`H1` closed-`lr` trap + (`bPreHull_keepLr_false_after_hook_of_codeLoaded_u` + `bPreHull_reg_ext_forall_of_entries`), + matching verbatim the premise shapes of `Lib2LayoutFacts.lean @ a230f2671b:392-402, :355-362` + (`f3RowSyms_ghostProg617_externAt_none_of_ne_entries` and `f3RxSeg_ghostProg617_externAt_entry`), + plus the `K`-narrowed spare `memmoveGhostK_rowReplayOn`. + +## Scope Disclosures (`REV-PILOT` N1–N3 + `L3-d`) +- **N1 (post-Cutover-2 only):** `hRealHullNoExt` (and `hRealRxNoExt` in `ElfMemmoveEntryGuard`) + requires `"memmove"` (alongside Stage A `"memcpy"` / `"memset"`) to be removed from + `cliHookTablePlaced` (`C2ExternTableFacts.realRxNoExtern`, `Lib2LayoutFacts.lean @ a230f2671b:317`, + discharged by `rfl_kernel` at C2 rebase). On pre-cutover `train`, `"memmove"` is still hooked on + `P_real`, so the replay arm is usable only post-Cutover-2. +- **N2 (`K` replay has no spec partner):** `memmoveGhostK_rowReplayOn` is honest, but no + `GhostRowSpecOk "memmove" (memmoveGhostK …)` exists because `*BoundedSpec.pre` has no + `lr ∉ keepR_memmove` conjunct while `memmoveGhostK` raises `.Exception` when + `lr ∈ keepR_memmove`. The usable `ExtraListOk` / `GhostRowOk` route for `"memmove"` is the + guarded `memmoveGhost` + `memmoveEntryGuard`; `memmoveGhostK` replays are spares only. +- **N3 (singleton helper covers 1 row):** `ElfMemmoveEntryGuard.extraEntryGuard_singleton_memmove` + covers `g.extra = [("memmove", memmoveGhost mpl mmpl)]` only. At Cutover 2, the multi-row + `g.extra` table assembles `ExtraListEntryGuard` from per-arm `extraEntryGuard_memmove_arm` + helpers across all active rows. +- **L3-d (`hother`-free multi-ghost route vs. single-stub `MemmoveGhostReplays`):** The earlier + GO'd `MemmoveGhostReplays` single-stub packagers retain single-stub `hother`, whereas + `MemmoveExtraReplays` and `ElfMemmoveEntryGuard` build strictly on L3-d `MemmoveLrTrap`'s + `hother`-free 3-entry (`["memmove", "memcpy", "memset"]`) `C4`+`F1`+`H1` corollaries. +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays + +open Arm64 Arm64.Obj Arm64.Process ProofLib +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession (CliHooks cliExternsPlaced libsignalSessionLib) +open CryptoVerification.SignalSession.Cli.RunGlue (IsFsC) +open LibsignalBinary.Heap + (AllocCallPreserved AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove + (libcMemmoveBoundedSpec sessionMemmoveBoundedBudgetSpec sessionMemmoveBoundedSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer (ExecFrozen) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay ( + GhostRowOk GhostRowReplayOn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveCode ( + bPreHullWords bPreHullWords_length bPreMemmoveByteOff bPrePadWord + masterMemmoveSpec memmoveSpecK pureWordsProg_bPreHull_hasWords +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveGhost ( + keepBPreHull keepBPreHull_memmoveEntry +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveGhostK ( + f3EmptyMemmoveGhostHook f3EmptyMemmoveGhostHookK + f3EmptyMemmoveGhostHook_allocCallPreserved + f3EmptyMemmoveGhostHook_fs f3EmptyMemmoveGhostHook_fsT + f3EmptyMemmoveGhostHook_libcBounded_budget_ok f3EmptyMemmoveGhostHook_libcBounded_ok + f3EmptyMemmoveGhostHook_libcBounded_withAlloc_ok + f3EmptyMemmoveGhostHook_master_ok + f3EmptyMemmoveGhostHook_sessionBoundedBudget_ok + f3EmptyMemmoveGhostHook_sessionBoundedBudget_withAlloc_ok + f3EmptyMemmoveGhostHook_sessionBounded_ok + f3EmptyMemmoveGhostHook_sessionBounded_withAlloc_ok + f3EmptyMemmoveGhostHook_vmPreserved + f3EmptyMemmoveGhostHookK_fs f3EmptyMemmoveGhostHookK_fsT + f3EmptyMemmoveGhostHookK_masterK_ok f3EmptyMemmoveGhostHookK_vmPreserved + f3PureMemmoveGhostHook f3PureMemmoveGhostHookK +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveGhostReplays ( + f3EmptyMemmoveGhostHook_visitedIn f3EmptyMemmoveGhostHookK_visitedIn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveLrTrap ( + bPreHull_keepLr_false_after_hook_of_codeLoaded_u bPreHull_reg_ext_forall_of_entries +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveLrTrapBase ( + MemmoveEntryGuard bPreHullByteLen codeLoaded_of_stripExecOutside + trapHook_f3EmptyMemmoveGhostHook +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetCode (pureWordsProg_externAt_none) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhostK (emptyStdProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords ( + TrapHook codeLoaded_stripExecOutside_of_keep +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc (withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs ( + ExtraRowSpec GhostRowSpecOk +) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.MemmoveRowSpec ( + MemmoveRowSpec +) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric ( + h2fsgen_steps_lift_of_visitedIn_noExtern +) + +/-! ## 1. `.text.b_pre` Hull Carrier, `keepR_memmove`, & `W`-Independent `memmoveGhost` -/ + +/-- Base address of the `956` B `.text.b_pre` hull (`libsignalSessionLib.resolve mpl "memcpy"`). -/ +@[expose] def memcpyEntry (mpl : Obj.MultiPlacement) : BitVec 64 := + libsignalSessionLib.resolve mpl "memcpy" + +/-- Resolved `"memmove"` symbol address (`= memcpyEntry mpl + bPreMemmoveByteOff` on C2 `2C`). -/ +@[expose] def memmoveEntry (mpl : Obj.MultiPlacement) : BitVec 64 := + libsignalSessionLib.resolve mpl "memmove" + +/-- `956` B (`239`-word) `.text.b_pre` hull code-region predicate `[memcpyEntry mpl, +956)`. -/ +@[expose] def keepR_memmove (mpl : Obj.MultiPlacement) : BitVec 64 → Bool := + keepBPreHull (memcpyEntry mpl) + +/-- `239`-word `.text.b_pre` hull word list patched against `libsignalSessionLib.resolve mpl`. -/ +@[expose] def memmoveHullWords (mpl : Obj.MultiPlacement) : List (BitVec 32) := + bPreHullWords (memcpyEntry mpl) (libsignalSessionLib.resolve mpl) bPrePadWord + +/-- Pure `239`-word `.text.b_pre` sub-program anchored at `memcpyEntry mpl`. -/ +@[expose] def memmoveSubProg (mpl : Obj.MultiPlacement) : Program := + pureWordsProg (memcpyEntry mpl) (memmoveHullWords mpl) + +theorem memmoveHullWords_length (mpl : Obj.MultiPlacement) : + (memmoveHullWords mpl).length = 239 := + bPreHullWords_length (memcpyEntry mpl) (libsignalSessionLib.resolve mpl) bPrePadWord + +theorem memmoveSubProg_base (mpl : Obj.MultiPlacement) : + (memmoveSubProg mpl).base = memcpyEntry mpl := by + dsimp only [memmoveSubProg, pureWordsProg, Program.ofWords] + +theorem memmoveSubProg_svc (mpl : Obj.MultiPlacement) : + (memmoveSubProg mpl).svc = Syscall.standard := by + dsimp only [memmoveSubProg, pureWordsProg, Program.ofWords] + +theorem memmoveSubProg_externAt_none (mpl : Obj.MultiPlacement) (pc : BitVec 64) : + (memmoveSubProg mpl).externAt? pc = none := + pureWordsProg_externAt_none (memcpyEntry mpl) (memmoveHullWords mpl) pc + +theorem memmoveSubProg_code_length (mpl : Obj.MultiPlacement) : + (memmoveSubProg mpl).code.length = bPreHullByteLen := by + have hwlen := memmoveHullWords_length mpl + change ((memmoveHullWords mpl).flatMap Program.wordToBytesLE).length = 956 + have hflat : ∀ ws : List (BitVec 32), (ws.flatMap Program.wordToBytesLE).length = 4 * ws.length := by + intro ws + induction ws with + | nil => rfl + | cons _ tl ih => + simp [Program.wordToBytesLE, ih] + omega + rw [hflat, hwlen] + +theorem memmoveSubProg_hasWords (mpl : Obj.MultiPlacement) : + (memmoveSubProg mpl).hasWords (memcpyEntry mpl) (memmoveHullWords mpl) := + pureWordsProg_bPreHull_hasWords (memcpyEntry mpl) (libsignalSessionLib.resolve mpl) bPrePadWord + +theorem resolve_memcpy_eq_memcpyEntry (mpl : Obj.MultiPlacement) : + libsignalSessionLib.resolve mpl "memcpy" = memcpyEntry mpl := by + dsimp only [memcpyEntry] + +theorem keepR_memmove_target (mpl : Obj.MultiPlacement) : + keepR_memmove mpl (memcpyEntry mpl + bPreMemmoveByteOff) = true := + keepBPreHull_memmoveEntry (memcpyEntry mpl) + +theorem keepR_memmove_entry {mpl : Obj.MultiPlacement} + (hMemmoveOff : memmoveEntry mpl = memcpyEntry mpl + bPreMemmoveByteOff) : + keepR_memmove mpl (memmoveEntry mpl) = true := by + rw [hMemmoveOff] + exact keepR_memmove_target mpl + +theorem keepR_memmove_of_code_offset {mpl : Obj.MultiPlacement} {i : Nat} + (hi : i < (memmoveSubProg mpl).code.length) : + keepR_memmove mpl ((memmoveSubProg mpl).base + BitVec.ofNat 64 i) = true := by + rw [memmoveSubProg_code_length] at hi + rw [memmoveSubProg_base] + dsimp only [keepR_memmove, keepBPreHull, TrapSafeWords.keepBlock, bPreHullByteLen] at hi ⊢ + have hsub : (memcpyEntry mpl + BitVec.ofNat 64 i) - memcpyEntry mpl = BitVec.ofNat 64 i := by + bv_omega + rw [hsub, BitVec.toNat_ofNat, Nat.mod_eq_of_lt (by omega)] + exact decide_eq_true hi + +theorem memmoveSubProg_codeLoaded_stripExecOutside {mpl : Obj.MultiPlacement} {m : Memory} + (hCL : (memmoveSubProg mpl).CodeLoaded m) : + (memmoveSubProg mpl).CodeLoaded (stripExecOutside (keepR_memmove mpl) m) := + codeLoaded_stripExecOutside_of_keep (fun _ hi => keepR_memmove_of_code_offset hi) hCL + +theorem memmoveSubProg_codeLoaded_of_stripExecOutside {mpl : Obj.MultiPlacement} {m : Memory} + (hCL : (memmoveSubProg mpl).CodeLoaded (stripExecOutside (keepR_memmove mpl) m)) : + (memmoveSubProg mpl).CodeLoaded m := + codeLoaded_of_stripExecOutside hCL + +theorem memmoveSubProg_codeLoaded_stripExecOutside_iff (mpl : Obj.MultiPlacement) (m : Memory) : + (memmoveSubProg mpl).CodeLoaded (stripExecOutside (keepR_memmove mpl) m) ↔ + (memmoveSubProg mpl).CodeLoaded m := + ⟨memmoveSubProg_codeLoaded_of_stripExecOutside, memmoveSubProg_codeLoaded_stripExecOutside⟩ + +/-- Canonical `W`-independent ghost `"memmove"` hook for `CliGhostHooks.extra`. -/ +@[expose] noncomputable def memmoveGhost (mpl _mmpl : Obj.MultiPlacement) : State → State := + f3EmptyMemmoveGhostHook (keepR_memmove mpl) (memmoveSubProg mpl) + (memcpyEntry mpl + bPreMemmoveByteOff) + +/-- `K`-narrowed companion ghost `"memmove"` hook (`lr ∉ keepR_memmove` enforced in `pre`). -/ +@[expose] noncomputable def memmoveGhostK (mpl _mmpl : Obj.MultiPlacement) : State → State := + f3EmptyMemmoveGhostHookK (keepR_memmove mpl) (memmoveSubProg mpl) + (memcpyEntry mpl + bPreMemmoveByteOff) + +theorem memmoveGhost_eq_f3Pure (mpl mmpl : Obj.MultiPlacement) : + memmoveGhost mpl mmpl = + f3PureMemmoveGhostHook (keepR_memmove mpl) (memcpyEntry mpl) + (libsignalSessionLib.resolve mpl) bPrePadWord := by + dsimp only [memmoveGhost, f3PureMemmoveGhostHook, memmoveSubProg, memmoveHullWords] + +theorem memmoveGhostK_eq_f3Pure (mpl mmpl : Obj.MultiPlacement) : + memmoveGhostK mpl mmpl = + f3PureMemmoveGhostHookK (keepR_memmove mpl) (memcpyEntry mpl) + (libsignalSessionLib.resolve mpl) bPrePadWord := by + dsimp only [memmoveGhostK, f3PureMemmoveGhostHookK, memmoveSubProg, memmoveHullWords] + +/-- Entry-state `lr` guard for `memmoveGhost` on Block `617`: `s0.lr` is outside the `956` B + `.text.b_pre` hull and unequal to the `"memmove"` entry (`rfl`-matching + `MemmoveLrTrapBase.MemmoveEntryGuard` and `Lib2LayoutFacts.f3BatchLEntryGuard_of_startupLr`). -/ +@[expose] def memmoveEntryGuard (mpl : Obj.MultiPlacement) (s0 : State) : Prop := + keepR_memmove mpl (s0.readReg64 .lr) = false ∧ + s0.readReg64 .lr ≠ libsignalSessionLib.resolve mpl "memmove" + +theorem memmoveEntryGuard_iff (mpl : Obj.MultiPlacement) (s0 : State) : + memmoveEntryGuard mpl s0 ↔ + (keepR_memmove mpl (s0.readReg64 .lr) = false ∧ + s0.readReg64 .lr ≠ libsignalSessionLib.resolve mpl "memmove") := + Iff.rfl + +theorem memmoveEntryGuard_eq_base (mpl : Obj.MultiPlacement) (s0 : State) : + memmoveEntryGuard mpl s0 = MemmoveEntryGuard (memcpyEntry mpl) (memmoveEntry mpl) s0 := by + dsimp only [memmoveEntryGuard, MemmoveEntryGuard, keepR_memmove, memmoveEntry] + +theorem memmoveEntryGuard_of_keepR_false {mpl : Obj.MultiPlacement} {s0 : State} + (hMemmoveOff : memmoveEntry mpl = memcpyEntry mpl + bPreMemmoveByteOff) + (h : keepR_memmove mpl (s0.readReg64 .lr) = false) : + memmoveEntryGuard mpl s0 := by + refine ⟨h, fun hEq => ?_⟩ + have hIn : keepR_memmove mpl (s0.readReg64 .lr) = true := by + rw [hEq] + exact keepR_memmove_entry hMemmoveOff + cases h.symm.trans hIn + +/-! ## 2. Unconditional `#1348` Bounded `HookOk` Suite (`0` Layout or Memory Premises) -/ + +theorem memmoveGhost_fs (mpl mmpl : Obj.MultiPlacement) (s : State) : + (memmoveGhost mpl mmpl s).fs = s.fs := + f3EmptyMemmoveGhostHook_fs (keepR_memmove mpl) (memmoveSubProg mpl) + (memcpyEntry mpl + bPreMemmoveByteOff) s + +theorem memmoveGhost_fsT (mpl mmpl : Obj.MultiPlacement) : + HookFsTraced IsFsC (memmoveGhost mpl mmpl) := + f3EmptyMemmoveGhostHook_fsT (keepR_memmove mpl) (memmoveSubProg mpl) + (memcpyEntry mpl + bPreMemmoveByteOff) + +theorem memmoveGhostK_fs (mpl mmpl : Obj.MultiPlacement) (s : State) : + (memmoveGhostK mpl mmpl s).fs = s.fs := + f3EmptyMemmoveGhostHookK_fs (keepR_memmove mpl) (memmoveSubProg mpl) + (memcpyEntry mpl + bPreMemmoveByteOff) s + +theorem memmoveGhostK_fsT (mpl mmpl : Obj.MultiPlacement) : + HookFsTraced IsFsC (memmoveGhostK mpl mmpl) := + f3EmptyMemmoveGhostHookK_fsT (keepR_memmove mpl) (memmoveSubProg mpl) + (memcpyEntry mpl + bPreMemmoveByteOff) + +theorem memmoveGhost_vmPreserved (mpl mmpl : Obj.MultiPlacement) (s : State) : + VmPreserved s (memmoveGhost mpl mmpl s) := + f3EmptyMemmoveGhostHook_vmPreserved (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) s + +theorem memmoveGhostK_vmPreserved (mpl mmpl : Obj.MultiPlacement) (s : State) : + VmPreserved s (memmoveGhostK mpl mmpl s) := + f3EmptyMemmoveGhostHookK_vmPreserved (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) s + +theorem memmoveGhost_allocCallPreserved (mpl mmpl : Obj.MultiPlacement) (s : State) : + AllocCallPreserved s (memmoveGhost mpl mmpl s) := + f3EmptyMemmoveGhostHook_allocCallPreserved (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) s + +theorem memmoveGhost_master_ok (mpl mmpl : Obj.MultiPlacement) : + HookOk (memmoveGhost mpl mmpl) masterMemmoveSpec := + f3EmptyMemmoveGhostHook_master_ok (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) + +theorem memmoveGhostK_masterK_ok (mpl mmpl : Obj.MultiPlacement) : + HookOk (memmoveGhostK mpl mmpl) (memmoveSpecK (keepR_memmove mpl) masterMemmoveSpec) := + f3EmptyMemmoveGhostHookK_masterK_ok (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) + +theorem memmoveGhost_libcBounded_ok (mpl mmpl : Obj.MultiPlacement) (stk : Nat) : + HookOk (memmoveGhost mpl mmpl) (libcMemmoveBoundedSpec stk) := + f3EmptyMemmoveGhostHook_libcBounded_ok (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) stk + +theorem memmoveGhost_libcBounded_budget_ok (mpl mmpl : Obj.MultiPlacement) (stk : Nat) : + HookOk (memmoveGhost mpl mmpl) (withVmPreserved (libcMemmoveBoundedSpec stk)) := + f3EmptyMemmoveGhostHook_libcBounded_budget_ok (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) stk + +theorem memmoveGhost_libcBounded_withAlloc_ok (mpl mmpl : Obj.MultiPlacement) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat) : + HookOk (memmoveGhost mpl mmpl) (withAlloc A lim (libcMemmoveBoundedSpec stk)) := + f3EmptyMemmoveGhostHook_libcBounded_withAlloc_ok (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) A lim stk + +theorem memmoveGhost_sessionBounded_ok (mpl mmpl : Obj.MultiPlacement) (stk : Nat) : + HookOk (memmoveGhost mpl mmpl) (sessionMemmoveBoundedSpec stk) := + f3EmptyMemmoveGhostHook_sessionBounded_ok (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) stk + +theorem memmoveGhost_sessionBoundedBudget_ok (mpl mmpl : Obj.MultiPlacement) (stk : Nat) : + HookOk (memmoveGhost mpl mmpl) (sessionMemmoveBoundedBudgetSpec stk) := + f3EmptyMemmoveGhostHook_sessionBoundedBudget_ok (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) stk + +theorem memmoveGhost_sessionBounded_withAlloc_ok (mpl mmpl : Obj.MultiPlacement) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat) : + HookOk (memmoveGhost mpl mmpl) (withAlloc A lim (sessionMemmoveBoundedSpec stk)) := + f3EmptyMemmoveGhostHook_sessionBounded_withAlloc_ok (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) A lim stk + +theorem memmoveGhost_sessionBoundedBudget_withAlloc_ok (mpl mmpl : Obj.MultiPlacement) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat) : + HookOk (memmoveGhost mpl mmpl) (withAlloc A lim (sessionMemmoveBoundedBudgetSpec stk)) := + f3EmptyMemmoveGhostHook_sessionBoundedBudget_withAlloc_ok (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) A lim stk + +theorem memmoveGhost_memmoveRowSpec (mpl mmpl : Obj.MultiPlacement) : + MemmoveRowSpec (memmoveGhost mpl mmpl) := + MemmoveRowSpec.of_vm + (memmoveGhost_libcBounded_ok mpl mmpl) + (memmoveGhost_sessionBounded_ok mpl mmpl) + (memmoveGhost_vmPreserved mpl mmpl) + (memmoveGhost_allocCallPreserved mpl mmpl) + +/-- Complete `GhostRowSpecOk "memmove" (memmoveGhost mpl mmpl)` (`0` layout or memory premises). -/ +theorem memmoveGhost_rowSpecOk [LibsignalPlacement] (mpl mmpl : Obj.MultiPlacement) : + GhostRowSpecOk "memmove" (memmoveGhost mpl mmpl) where + fs_eq := memmoveGhost_fs mpl mmpl + fsT := memmoveGhost_fsT mpl mmpl + rowSpec := by + change ExtraRowSpec "memmove" (memmoveGhost mpl mmpl) + simpa [ExtraRowSpec] using memmoveGhost_memmoveRowSpec mpl mmpl + +/-! ## 3. `ExecFrozen` Preservation, 3-Entry `.text.b_pre` `GhostRowReplayOn`, `GhostRowOk`, & `K` Spare -/ + +private theorem setPC_eq_self_of_pc_eq {u : State} {pc : BitVec 64} (h : u.pc = pc) : + u.setPC pc = u := by + cases u + simp_all [State.setPC] + +private theorem realProg617_svc (mpl mmpl : Obj.MultiPlacement) (W : CliHooks) : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).svc = Syscall.standard := + rfl + +private theorem emptyStdProg_svc : emptyStdProg.svc = Syscall.standard := + rfl + +private theorem emptyStdProg_externAt (pc : BitVec 64) : + emptyStdProg.externAt? pc = none := + rfl + +theorem memmoveGhost_preserves_execFrozen (mpl mmpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (memmoveGhost mpl mmpl u).mem := + hfr.of_perm_eq (memmoveGhost_vmPreserved mpl mmpl u).2.2.1 + +theorem memmoveGhostK_preserves_execFrozen (mpl mmpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (memmoveGhostK mpl mmpl u).mem := + hfr.of_perm_eq (memmoveGhostK_vmPreserved mpl mmpl u).2.2.1 + +/-- Generic-`InvS` `GhostRowReplayOn` for `memmoveGhost` over the 3-entry `.text.b_pre` hull + (`["memmove", "memcpy", "memset"]`), consuming L3-d's `hother`-free corollaries and matching + verbatim the 3-entry premise shapes of `Lib2LayoutFacts.lean @ a230f2671b:392-402, :355-362`: + - `hGhostOffEntries`: `f3RowSyms_ghostProg617_externAt_none_of_ne_entries` + - `hGhostEntry`: `f3RxSeg_ghostProg617_externAt_entry` + - `hMemmoveExt`, `hMemcpyTrap`, `hMemsetTrap`: per-entry `TrapHook` dispatch on `EG W`. -/ +theorem memmoveGhost_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hMemmoveOff : memmoveEntry mpl = memcpyEntry mpl + bPreMemmoveByteOff) + (hCL : ∀ u : State, InvS u → (memmoveSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memmove mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostOffEntries : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memmove mpl pc = true → + pc ∉ ["memmove", "memcpy", "memset"].map (libsignalSessionLib.resolve mpl) → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) + (hGhostEntry : ∀ (W : CliHooks) {sym : String}, + sym ∈ ["memmove", "memcpy", "memset"] → + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl sym) = EG W sym) + (hMemmoveExt : ∀ W : CliHooks, + EG W "memmove" = none ∨ EG W "memmove" = some (memmoveGhost mpl mmpl)) + (hMemcpyTrap : ∀ (W : CliHooks) (f : State → State), + EG W "memcpy" = some f → ∀ L, TrapHook L f) + (hMemsetTrap : ∀ (W : CliHooks) (f : State → State), + EG W "memset" = some f → ∀ L, TrapHook L f) : + GhostRowReplayOn mpl mmpl InvS EG "memmove" (memmoveEntryGuard mpl) + (memmoveGhost mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨memmoveGhost_preserves_execFrozen mpl mmpl hfr, + memmoveGhost_fs mpl mmpl u⟩ + replay_at_stub := by + intro W s0 sf _ _ _ hEntry hRetPc hNoExSf hNotHaltSf + right + refine ⟨hRealHullNoExt W (keepR_memmove_entry hMemmoveOff), ?_⟩ + intro u _ hStepsAfter hpc hrun hnoex hkf hfr hInvU + have hCodeU : (memmoveSubProg mpl).CodeLoaded u.mem := hCL u hInvU + have hRegExt := + bPreHull_reg_ext_forall_of_entries + (m := memcpyEntry mpl) + (P_ghost := cliProgExtPlacedAt mpl EG 617 W) + (resolve := libsignalSessionLib.resolve mpl) + (extOf := EG W) + (fun hkp hnotin => hGhostOffEntries W hkp hnotin) + (fun hsym => hGhostEntry W hsym) + (fun f hf _ hL => by + rcases hMemmoveExt W with hn | hs + · rw [hn] at hf + cases hf + · rw [hs] at hf + have hfeq : f = memmoveGhost mpl mmpl := (Option.some.inj hf).symm + rw [hfeq] + exact trapHook_f3EmptyMemmoveGhostHook (memmoveSubProg mpl) + (memcpyEntry mpl + bPreMemmoveByteOff) hL) + (hMemcpyTrap W) + (hMemsetTrap W) + have hLrOut : keepR_memmove mpl (u.readReg64 .lr) = false := + bPreHull_keepLr_false_after_hook_of_codeLoaded_u + (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) + hRegExt + (fun _ hL => trapHook_f3EmptyMemmoveGhostHook (memmoveSubProg mpl) + (memcpyEntry mpl + bPreMemmoveByteOff) hL) + hEntry.1 + hRetPc + hNoExSf + hNotHaltSf + u + hStepsAfter + hrun + hCodeU + hkf + have hCodeStrip : + (memmoveSubProg mpl).CodeLoaded (stripExecOutside (keepR_memmove mpl) u.mem) := + memmoveSubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨_, _, hfr_fu, hfs_fu, hvis⟩ := + f3EmptyMemmoveGhostHook_visitedIn + (keepR := keepR_memmove mpl) + (P_sub := memmoveSubProg mpl) + (m := memcpyEntry mpl) + (resolve := libsignalSessionLib.resolve mpl) + (padWord := bPrePadWord) + (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) + (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) + hrun + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (memcpyEntry mpl + bPreMemmoveByteOff)) + (memmoveGhost mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hpc_target : u.pc = memcpyEntry mpl + bPreMemmoveByteOff := by + have hpc' : u.pc = memmoveEntry mpl := hpc + exact hpc'.trans hMemmoveOff + rw [setPC_eq_self_of_pc_eq hpc_target] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (memmoveGhost mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- Full per-row bundle `GhostRowOk` (`GhostRowSpecOk ∧ GhostRowReplayOn`) for `"memmove"` over + the 3-entry `.text.b_pre` hull (`["memmove", "memcpy", "memset"]`). -/ +theorem memmoveGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hMemmoveOff : memmoveEntry mpl = memcpyEntry mpl + bPreMemmoveByteOff) + (hCL : ∀ u : State, InvS u → (memmoveSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memmove mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostOffEntries : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memmove mpl pc = true → + pc ∉ ["memmove", "memcpy", "memset"].map (libsignalSessionLib.resolve mpl) → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) + (hGhostEntry : ∀ (W : CliHooks) {sym : String}, + sym ∈ ["memmove", "memcpy", "memset"] → + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl sym) = EG W sym) + (hMemmoveExt : ∀ W : CliHooks, + EG W "memmove" = none ∨ EG W "memmove" = some (memmoveGhost mpl mmpl)) + (hMemcpyTrap : ∀ (W : CliHooks) (f : State → State), + EG W "memcpy" = some f → ∀ L, TrapHook L f) + (hMemsetTrap : ∀ (W : CliHooks) (f : State → State), + EG W "memset" = some f → ∀ L, TrapHook L f) : + GhostRowOk mpl mmpl InvS EG "memmove" (memmoveEntryGuard mpl) (memmoveGhost mpl mmpl) := + ⟨memmoveGhost_rowSpecOk mpl mmpl, + memmoveGhost_rowReplayOn mpl mmpl InvS EG hMemmoveOff hCL hInvKeep hRealHullNoExt + hGhostOffEntries hGhostEntry hMemmoveExt hMemcpyTrap hMemsetTrap⟩ + +/-- Entry-excluded interior-`TrapHook` variant of `memmoveGhost_rowReplayOn` (matching + `BcmpGhostReplays.bcmpGhost_rowReplayOn_of_interior` / + `StrlenGhostReplays.strlenGhost_rowReplayOn_of_interior`). -/ +theorem memmoveGhost_rowReplayOn_of_interior + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hMemmoveOff : memmoveEntry mpl = memcpyEntry mpl + bPreMemmoveByteOff) + (hCL : ∀ u : State, InvS u → (memmoveSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "memmove") = + some (memmoveGhost mpl mmpl)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memmove mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hInteriorGhost : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memmove mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl "memmove" → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ g, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some g ∧ + ∀ L : BitVec 64, keepR_memmove mpl L = true → TrapHook L g) : + GhostRowReplayOn mpl mmpl InvS EG "memmove" (memmoveEntryGuard mpl) + (memmoveGhost mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨memmoveGhost_preserves_execFrozen mpl mmpl hfr, + memmoveGhost_fs mpl mmpl u⟩ + replay_at_stub := by + intro W s0 sf _ _ _ hEntry hRetPc hNoExSf hNotHaltSf + have hRegExt : ∀ L : BitVec 64, keepR_memmove mpl L = true → + ∀ pc : BitVec 64, keepR_memmove mpl pc = true → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ g, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some g ∧ TrapHook L g := by + intro L hL pc hk + by_cases hEq : pc = libsignalSessionLib.resolve mpl "memmove" + · rw [hEq] + exact Or.inr ⟨memmoveGhost mpl mmpl, hGhostAt W, + trapHook_f3EmptyMemmoveGhostHook (memmoveSubProg mpl) + (memcpyEntry mpl + bPreMemmoveByteOff) hL⟩ + · rcases hInteriorGhost W hk hEq with hNone | ⟨gStub, hSome, hTrap⟩ + · exact Or.inl hNone + · exact Or.inr ⟨gStub, hSome, hTrap L hL⟩ + right + refine ⟨hRealHullNoExt W (keepR_memmove_entry hMemmoveOff), ?_⟩ + intro u _ hStepsAfter hpc hrun hnoex hkf hfr hInvU + have hCodeU : (memmoveSubProg mpl).CodeLoaded u.mem := hCL u hInvU + have hLrOut : keepR_memmove mpl (u.readReg64 .lr) = false := + bPreHull_keepLr_false_after_hook_of_codeLoaded_u + (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) + hRegExt + (fun _ hL => trapHook_f3EmptyMemmoveGhostHook (memmoveSubProg mpl) + (memcpyEntry mpl + bPreMemmoveByteOff) hL) + hEntry.1 + hRetPc + hNoExSf + hNotHaltSf + u + hStepsAfter + hrun + hCodeU + hkf + have hCodeStrip : + (memmoveSubProg mpl).CodeLoaded (stripExecOutside (keepR_memmove mpl) u.mem) := + memmoveSubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨_, _, hfr_fu, hfs_fu, hvis⟩ := + f3EmptyMemmoveGhostHook_visitedIn + (keepR := keepR_memmove mpl) + (P_sub := memmoveSubProg mpl) + (m := memcpyEntry mpl) + (resolve := libsignalSessionLib.resolve mpl) + (padWord := bPrePadWord) + (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) + (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) + hrun + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (memcpyEntry mpl + bPreMemmoveByteOff)) + (memmoveGhost mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hpc_target : u.pc = memcpyEntry mpl + bPreMemmoveByteOff := by + have hpc' : u.pc = memmoveEntry mpl := hpc + exact hpc'.trans hMemmoveOff + rw [setPC_eq_self_of_pc_eq hpc_target] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (memmoveGhost mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- Entry-excluded interior-`TrapHook` variant of `memmoveGhost_rowOk`. -/ +theorem memmoveGhost_rowOk_of_interior [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hMemmoveOff : memmoveEntry mpl = memcpyEntry mpl + bPreMemmoveByteOff) + (hCL : ∀ u : State, InvS u → (memmoveSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "memmove") = + some (memmoveGhost mpl mmpl)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memmove mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hInteriorGhost : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memmove mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl "memmove" → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ g, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some g ∧ + ∀ L : BitVec 64, keepR_memmove mpl L = true → TrapHook L g) : + GhostRowOk mpl mmpl InvS EG "memmove" (memmoveEntryGuard mpl) (memmoveGhost mpl mmpl) := + ⟨memmoveGhost_rowSpecOk mpl mmpl, + memmoveGhost_rowReplayOn_of_interior mpl mmpl InvS EG hMemmoveOff hCL hInvKeep hGhostAt + hRealHullNoExt hInteriorGhost⟩ + +/-- `K`-narrowed `memmoveGhostK` spare `GhostRowReplayOn` (`entryGuard := fun _ => True`). -/ +theorem memmoveGhostK_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hMemmoveOff : memmoveEntry mpl = memcpyEntry mpl + bPreMemmoveByteOff) + (hCL : ∀ u : State, InvS u → (memmoveSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memmove mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG "memmove" (fun _ => True) (memmoveGhostK mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨memmoveGhostK_preserves_execFrozen mpl mmpl hfr, + memmoveGhostK_fs mpl mmpl u⟩ + replay_at_stub := by + intro W _ _ _ _ _ _ _ _ _ + right + refine ⟨hRealHullNoExt W (keepR_memmove_entry hMemmoveOff), ?_⟩ + intro u _ _ hpc hrun hnoex hkf hfr hInvU + have hCodeStrip : + (memmoveSubProg mpl).CodeLoaded (stripExecOutside (keepR_memmove mpl) u.mem) := + memmoveSubProg_codeLoaded_stripExecOutside (hCL u hInvU) + obtain ⟨_, _, hfr_fu, hfs_fu, hvis⟩ := + f3EmptyMemmoveGhostHookK_visitedIn + (keepR := keepR_memmove mpl) + (P_sub := memmoveSubProg mpl) + (m := memcpyEntry mpl) + (resolve := libsignalSessionLib.resolve mpl) + (padWord := bPrePadWord) + (memmoveSubProg_svc mpl) + (memmoveSubProg_externAt_none mpl) + (memmoveSubProg_hasWords mpl) + (resolve_memcpy_eq_memcpyEntry mpl) + hrun + hnoex + hfr + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (memcpyEntry mpl + bPreMemmoveByteOff)) + (memmoveGhostK mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hpc_target : u.pc = memcpyEntry mpl + bPreMemmoveByteOff := by + have hpc' : u.pc = memmoveEntry mpl := hpc + exact hpc'.trans hMemmoveOff + rw [setPC_eq_self_of_pc_eq hpc_target] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (memmoveGhostK mpl mmpl u) hInvU hkf hfs_fu⟩ + +theorem ghostRowReplayOn_of_guard_imp + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + {EG : CliHooks → String → Option (State → State)} + {sym : String} {entryGuard guard' : State → Prop} {f : State → State} + (hRow : GhostRowReplayOn mpl mmpl InvS EG sym entryGuard f) + (hImp : ∀ s0 : State, guard' s0 → entryGuard s0) : + GhostRowReplayOn mpl mmpl InvS EG sym guard' f where + preserves_execFrozen := hRow.preserves_execFrozen + replay_at_stub := fun W s0 sf hG hRet hNoEx hNHalt => + hRow.replay_at_stub W s0 sf (hImp s0 hG) hRet hNoEx hNHalt + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/MemrchrExtraReplays.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/MemrchrExtraReplays.lean new file mode 100644 index 000000000..f403fc27e --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/MemrchrExtraReplays.lean @@ -0,0 +1,539 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrCode -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrGhost -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrGhostK -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrGhostReplaysOn -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric -- proof-setup: allow-public-import + +/-! +# Card `CC-R0` (Row 1) — `memrchr` Route-`R0` `GhostRowReplayOn` (`HooksDehook.MemrchrExtraReplays`) + +Cutover-2 `c`-card for `lsMemrchrSym` (`core::slice::memchr::memrchr`) on the Route-`R0` +(`WithLsRet.withLsRet` / `LsRetAddr624`) `.text.lib2` track (`MemrchrGhostReplaysOn.lean` stays +untouched): + +1. **Row Anchor & `W`-Independent Ghost (`keepR_memrchr`, `memrchrSubProg`, `memrchrGhost`):** + - `memrchrSubProg mpl := pureWordsProg (libsignalSessionLib.resolve mpl lsMemrchrSym) coreMemrchrWords` + (`65` words = `260` B hull; the `2` panic blocks at `+0x104`/`+0x118` are never fetched under + `masterMemrchrSpec.pre` and stay outside `keepR_memrchr`). + - `memrchrGhost mpl mmpl` wraps `MemrchrGhostK.f3PureMemrchrGhostHookLs` (`P_real := emptyStdProg`, + `fallback := memrchrHook`), so it has **zero `W : CliHooks` dependence**. +2. **State Preservation & `withLsRet` Consumer `HookOk` Arms (`0` layout premises):** + - Unconditional `memrchrGhost_fs`, `memrchrGhost_fsT`, `memrchrGhost_vmPreserved`, + `memrchrGhost_preserves_execFrozen`, and bounded-stack (`16 ≤ stk ≤ 2 ^ 64`) `withLsRet` + consumer `HookOk` arms (`MainHops.memrchrSpec` and `CalleesRO.memrchrSpecRO`, plain, + `withVmPreserved`, and `withAlloc`). +3. **Generic-`InvS` `GhostRowReplayOn` (`entryGuard := fun _ => True`, `F1` + `H1` compliant):** + - `hCL` supplies `(memrchrSubProg mpl).CodeLoaded u.mem` at each intermediate call state `u` + from `InvS u` (**H1**; never `s0.mem`), with `memrchrSubProg_codeLoaded_stripExecOutside_iff` + bridging to `stripExecOutside (keepR_memrchr mpl) u.mem`. + - `hRealHullNoExt` requires `externAt? pc = none` on `keepR_memrchr mpl pc = true` **only** on + the de-hooked real program `cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W` (**F1**; + zero `P_ghost` hull premise since `LsRetAddr624 (u.readReg64 .lr)` + `hKeep` discharges + `keepR_memrchr mpl (u.readReg64 .lr) = false` directly from non-`.Exception`). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrExtraReplays + +open Arm64 Arm64.Obj Arm64.Process ProofLib +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.LibsignalTripleRatchet (extHookStack) +open CryptoVerification.SignalSession + (CliHooks cliExternsPlaced libsignalSessionLib lsFromUtf8Sym lsMemrchrSym memrchrHook) +open CryptoVerification.SignalSession.Cli.MainHops (memrchrSpec) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks IsFsC) +open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.HookDischarge.RustStd.MemrchrRO (coreMemrchrWords) +open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (LsRetAddr624) +open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer + (ExecFrozen linkedCallHook) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + (ExtraEntryGuard GhostRowOk GhostRowReplayOn) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrCode + (coreMemrchrWords_length pureWordsProg_memrchr_hasWords) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrGhost + (withLsRet_withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrGhostK + (f3EmptyMemrchrGhostHookK_eq f3EmptyMemrchrGhostHookK_fs f3EmptyMemrchrGhostHookLs_eq + f3EmptyMemrchrGhostHookLs_fs f3EmptyMemrchrGhostHookLs_fsT + f3PureMemrchrGhostHookK f3PureMemrchrGhostHookLs + f3PureMemrchrGhostHookLs_mainHopsMemrchr_budget_ok + f3PureMemrchrGhostHookLs_mainHopsMemrchr_ok + f3PureMemrchrGhostHookLs_memrchrRO_budget_ok + f3PureMemrchrGhostHookLs_memrchrRO_ok + f3PureMemrchrGhostHookLs_vmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrGhostReplaysOn + (f3EmptyMemrchrGhostHookK_visitedIn f3EmptyMemrchrGhostHookLs_visitedIn) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetCode (pureWordsProg_externAt_none) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhostK (emptyStdProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords + (codeLoaded_stripExecOutside_of_keep) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc + (hookOk_withAlloc_of_withVmPreserved withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO (memrchrSpecRO) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraRowSpec GhostRowSpecOk) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.MemrchrRowSpec + (MemrchrRowSpec) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric + (h2fsgen_steps_lift_of_visitedIn_noExtern) + +/-! ## 1. Row Anchor Definitions & `CodeLoaded` `stripExecOutside` Equivalence -/ + +/-- Byte length (`260` B = `65` words) of the active `coreMemrchrWords` hull. -/ +@[expose] def memrchrHullByteLen : Nat := 260 + +/-- Kept-region byte predicate `[resolve mpl lsMemrchrSym, resolve mpl lsMemrchrSym + 260)`. -/ +@[expose] def keepR_memrchr (mpl : Obj.MultiPlacement) (pc : BitVec 64) : Bool := + decide ((pc - libsignalSessionLib.resolve mpl lsMemrchrSym).toNat < memrchrHullByteLen) + +theorem keepR_memrchr_entry (mpl : Obj.MultiPlacement) : + keepR_memrchr mpl (libsignalSessionLib.resolve mpl lsMemrchrSym) = true := by + unfold keepR_memrchr memrchrHullByteLen + have hsub : libsignalSessionLib.resolve mpl lsMemrchrSym - + libsignalSessionLib.resolve mpl lsMemrchrSym = 0#64 := by bv_omega + rw [hsub] + decide + +/-- Pure `65`-word (`260`-byte) sub-program holding `coreMemrchrWords` at + `libsignalSessionLib.resolve mpl lsMemrchrSym`. -/ +@[expose] def memrchrSubProg (mpl : Obj.MultiPlacement) : Program := + pureWordsProg (libsignalSessionLib.resolve mpl lsMemrchrSym) coreMemrchrWords + +private theorem pureWordsProg_base (entry : BitVec 64) (words : List (BitVec 32)) : + (pureWordsProg entry words).base = entry := rfl + +private theorem pureWordsProg_svc (entry : BitVec 64) (words : List (BitVec 32)) : + (pureWordsProg entry words).svc = Syscall.standard := rfl + +theorem memrchrSubProg_base (mpl : Obj.MultiPlacement) : + (memrchrSubProg mpl).base = libsignalSessionLib.resolve mpl lsMemrchrSym := + pureWordsProg_base (libsignalSessionLib.resolve mpl lsMemrchrSym) coreMemrchrWords + +theorem memrchrSubProg_svc (mpl : Obj.MultiPlacement) : + (memrchrSubProg mpl).svc = Syscall.standard := + pureWordsProg_svc (libsignalSessionLib.resolve mpl lsMemrchrSym) coreMemrchrWords + +theorem memrchrSubProg_externAt_none (mpl : Obj.MultiPlacement) (pc : BitVec 64) : + (memrchrSubProg mpl).externAt? pc = none := + pureWordsProg_externAt_none (libsignalSessionLib.resolve mpl lsMemrchrSym) coreMemrchrWords pc + +theorem memrchrSubProg_hasWords (mpl : Obj.MultiPlacement) : + (memrchrSubProg mpl).hasWords (libsignalSessionLib.resolve mpl lsMemrchrSym) coreMemrchrWords := + pureWordsProg_memrchr_hasWords (libsignalSessionLib.resolve mpl lsMemrchrSym) + +theorem memrchrSubProg_code_length (mpl : Obj.MultiPlacement) : + (memrchrSubProg mpl).code.length = memrchrHullByteLen := by + unfold memrchrSubProg memrchrHullByteLen pureWordsProg Program.ofWords + rw [Program.length_flatMap_wordToBytesLE, coreMemrchrWords_length] + +theorem keepR_memrchr_of_code_offset (mpl : Obj.MultiPlacement) {off : Nat} + (hoff : off < (memrchrSubProg mpl).code.length) : + keepR_memrchr mpl ((memrchrSubProg mpl).base + BitVec.ofNat 64 off) = true := by + rw [memrchrSubProg_code_length] at hoff + rw [memrchrSubProg_base] + unfold keepR_memrchr + have hsub : libsignalSessionLib.resolve mpl lsMemrchrSym + BitVec.ofNat 64 off - + libsignalSessionLib.resolve mpl lsMemrchrSym = BitVec.ofNat 64 off := by bv_omega + have hoff_lt : off < 2 ^ 64 := by + have hb : memrchrHullByteLen = 260 := rfl + omega + rw [hsub, BitVec.toNat_ofNat, Nat.mod_eq_of_lt hoff_lt] + exact decide_eq_true hoff + +theorem memrchrSubProg_codeLoaded_stripExecOutside {mpl : Obj.MultiPlacement} {mem : Memory} + (hL : (memrchrSubProg mpl).CodeLoaded mem) : + (memrchrSubProg mpl).CodeLoaded (stripExecOutside (keepR_memrchr mpl) mem) := + codeLoaded_stripExecOutside_of_keep (fun _ hoff => keepR_memrchr_of_code_offset mpl hoff) hL + +theorem memrchrSubProg_codeLoaded_of_stripExecOutside {mpl : Obj.MultiPlacement} {mem : Memory} + (hL : (memrchrSubProg mpl).CodeLoaded (stripExecOutside (keepR_memrchr mpl) mem)) : + (memrchrSubProg mpl).CodeLoaded mem := by + refine Program.CodeLoaded.intro hL.aligned hL.no_wrap fun i hi => ?_ + have hk : keepR_memrchr mpl ((memrchrSubProg mpl).base + BitVec.ofNat 64 i) = true := + keepR_memrchr_of_code_offset mpl hi + have hbyte := hL.byte_eq i hi + have hperm := hL.perm_eq i hi + have hlf := hL.isLazyFree_eq i hi + rw [ProofLib.strip_read8] at hbyte + rw [ProofLib.strip_perm_of_keep hk] at hperm + rw [ProofLib.strip_isLazyFree] at hlf + exact ⟨hbyte, hperm, hlf⟩ + +theorem memrchrSubProg_codeLoaded_stripExecOutside_iff {mpl : Obj.MultiPlacement} {mem : Memory} : + (memrchrSubProg mpl).CodeLoaded (stripExecOutside (keepR_memrchr mpl) mem) ↔ + (memrchrSubProg mpl).CodeLoaded mem := + ⟨memrchrSubProg_codeLoaded_of_stripExecOutside, memrchrSubProg_codeLoaded_stripExecOutside⟩ + +/-- Route-`R0` (`withLsRet`) `W`-independent ghost hook for `lsMemrchrSym`. -/ +@[expose] noncomputable def memrchrGhost [LibsignalPlacement] + (mpl _mmpl : Obj.MultiPlacement) : State → State := + f3PureMemrchrGhostHookLs (keepR_memrchr mpl) (libsignalSessionLib.resolve mpl lsMemrchrSym) + +/-- Spare `K`-narrowed (`memrchrSpecK`) `W`-independent ghost hook companion for `lsMemrchrSym`. -/ +@[expose] noncomputable def memrchrGhostK (mpl _mmpl : Obj.MultiPlacement) : State → State := + f3PureMemrchrGhostHookK (keepR_memrchr mpl) (libsignalSessionLib.resolve mpl lsMemrchrSym) + +/-- Block-`617` entry-state guard for Route-`R0` `lsMemrchrSym` (`True`: `LsRetAddr624` is extracted + directly from non-`.Exception` at each call step). -/ +@[expose] def memrchrEntryGuard (_mpl : Obj.MultiPlacement) (_s0 : State) : Prop := + True + +/-! ## 2. State Preservation & `withLsRet` Consumer `HookOk` Arms (`0` Layout Premises) -/ + +theorem memrchrGhost_fs [LibsignalPlacement] (mpl mmpl : Obj.MultiPlacement) (s : State) : + (memrchrGhost mpl mmpl s).fs = s.fs := + f3EmptyMemrchrGhostHookLs_fs (keepR_memrchr mpl) (memrchrSubProg mpl) + (libsignalSessionLib.resolve mpl lsMemrchrSym) s + +theorem memrchrGhost_fsT [LibsignalPlacement] (mpl mmpl : Obj.MultiPlacement) : + HookFsTraced IsFsC (memrchrGhost mpl mmpl) := + f3EmptyMemrchrGhostHookLs_fsT (keepR_memrchr mpl) (memrchrSubProg mpl) + (libsignalSessionLib.resolve mpl lsMemrchrSym) + +theorem memrchrGhost_vmPreserved [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) (s : State) : + VmPreserved s (memrchrGhost mpl mmpl s) := + f3PureMemrchrGhostHookLs_vmPreserved (keepR_memrchr mpl) + (libsignalSessionLib.resolve mpl lsMemrchrSym) s + +theorem memrchrGhost_mainHopsMemrchr_ok [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) (stk : Nat) + (hlo : 16 ≤ stk) (hhi : stk ≤ 2 ^ 64) : + HookOk (memrchrGhost mpl mmpl) (withLsRet (memrchrSpec stk)) := + f3PureMemrchrGhostHookLs_mainHopsMemrchr_ok (keepR_memrchr mpl) + (libsignalSessionLib.resolve mpl lsMemrchrSym) stk hlo hhi + +theorem memrchrGhost_mainHopsMemrchr_withVmPreserved_ok [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) (stk : Nat) + (hlo : 16 ≤ stk) (hhi : stk ≤ 2 ^ 64) : + HookOk (memrchrGhost mpl mmpl) (withVmPreserved (withLsRet (memrchrSpec stk))) := + hookOk_withVmPreserved (memrchrGhost_mainHopsMemrchr_ok mpl mmpl stk hlo hhi) + (memrchrGhost_vmPreserved mpl mmpl) + +theorem memrchrGhost_mainHopsMemrchr_withAlloc_ls_ok [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) {M : AllocCostModel} + (A : RustCliAllocBudget M) (lim : BudgetLimits) + (stk : Nat) (hlo : 16 ≤ stk) (hhi : stk ≤ 2 ^ 64) : + HookOk (memrchrGhost mpl mmpl) (withAlloc A lim (withLsRet (memrchrSpec stk))) := + hookOk_withAlloc_of_withVmPreserved A lim + (memrchrGhost_mainHopsMemrchr_withVmPreserved_ok mpl mmpl stk hlo hhi) + +theorem memrchrGhost_mainHopsMemrchr_budget_ok [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) (stk : Nat) + (hlo : 16 ≤ stk) (hhi : stk ≤ 2 ^ 64) : + HookOk (memrchrGhost mpl mmpl) (withLsRet (withVmPreserved (memrchrSpec stk))) := + f3PureMemrchrGhostHookLs_mainHopsMemrchr_budget_ok (keepR_memrchr mpl) + (libsignalSessionLib.resolve mpl lsMemrchrSym) stk hlo hhi + +theorem memrchrGhost_mainHopsMemrchr_withAlloc_ok [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) {M : AllocCostModel} + (A : RustCliAllocBudget M) (lim : BudgetLimits) + (stk : Nat) (hlo : 16 ≤ stk) (hhi : stk ≤ 2 ^ 64) : + HookOk (memrchrGhost mpl mmpl) (withLsRet (withAlloc A lim (memrchrSpec stk))) := by + rw [withLsRet_withAlloc] + exact memrchrGhost_mainHopsMemrchr_withAlloc_ls_ok mpl mmpl A lim stk hlo hhi + +theorem memrchrGhost_memrchrRO_ok [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) (stk : Nat) + (hlo : 16 ≤ stk) (hhi : stk ≤ 2 ^ 64) : + HookOk (memrchrGhost mpl mmpl) (withLsRet (memrchrSpecRO stk)) := + f3PureMemrchrGhostHookLs_memrchrRO_ok (keepR_memrchr mpl) + (libsignalSessionLib.resolve mpl lsMemrchrSym) stk hlo hhi + +theorem memrchrGhost_memrchrRO_withVmPreserved_ok [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) (stk : Nat) + (hlo : 16 ≤ stk) (hhi : stk ≤ 2 ^ 64) : + HookOk (memrchrGhost mpl mmpl) (withVmPreserved (withLsRet (memrchrSpecRO stk))) := + hookOk_withVmPreserved (memrchrGhost_memrchrRO_ok mpl mmpl stk hlo hhi) + (memrchrGhost_vmPreserved mpl mmpl) + +theorem memrchrGhost_memrchrRO_withAlloc_ls_ok [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) {M : AllocCostModel} + (A : RustCliAllocBudget M) (lim : BudgetLimits) + (stk : Nat) (hlo : 16 ≤ stk) (hhi : stk ≤ 2 ^ 64) : + HookOk (memrchrGhost mpl mmpl) (withAlloc A lim (withLsRet (memrchrSpecRO stk))) := + hookOk_withAlloc_of_withVmPreserved A lim + (memrchrGhost_memrchrRO_withVmPreserved_ok mpl mmpl stk hlo hhi) + +theorem memrchrGhost_memrchrRO_budget_ok [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) (stk : Nat) + (hlo : 16 ≤ stk) (hhi : stk ≤ 2 ^ 64) : + HookOk (memrchrGhost mpl mmpl) (withLsRet (withVmPreserved (memrchrSpecRO stk))) := + f3PureMemrchrGhostHookLs_memrchrRO_budget_ok (keepR_memrchr mpl) + (libsignalSessionLib.resolve mpl lsMemrchrSym) stk hlo hhi + +theorem memrchrGhost_memrchrRO_withAlloc_ok [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) {M : AllocCostModel} + (A : RustCliAllocBudget M) (lim : BudgetLimits) + (stk : Nat) (hlo : 16 ≤ stk) (hhi : stk ≤ 2 ^ 64) : + HookOk (memrchrGhost mpl mmpl) (withLsRet (withAlloc A lim (memrchrSpecRO stk))) := by + rw [withLsRet_withAlloc] + exact memrchrGhost_memrchrRO_withAlloc_ls_ok mpl mmpl A lim stk hlo hhi + +/-! ## 3. `ExecFrozen` Preservation & Generic-`InvS` `GhostRowReplayOn` -/ + +private theorem linkedCallHook_preserves_execFrozen {α : Type} + {keep : BitVec 64 → Bool} {P_real P_sub : Program} + {entryTarget : BitVec 64} {spec : Spec α} {fallback : State → State} + (hfb : ∀ s : State, ExecFrozen s.mem → ExecFrozen (fallback s).mem) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (linkedCallHook keep P_real P_sub entryTarget spec fallback u).mem := by + classical + unfold linkedCallHook + split + · split + · rename_i hReal + exact (Classical.choose_spec hReal.2.2.2).2.2.2.2 + · change ExecFrozen (fallback u).mem + exact hfb u hfr + · exact hfr + +private theorem memrchrHook_mem (s : State) : (memrchrHook s).mem = s.mem := by + have heq : memrchrHook s = + (if (!s.mem.canRead (s.readReg64 .x1) (s.readReg64 .x2).toNat) = true then + CryptoVerification.SignalSession.unmodelled "memrchr: unreadable bytes" s + else + match ((List.range (s.mem.readBytes (s.readReg64 .x1) (s.readReg64 .x2).toNat).length).filter + fun i => (s.mem.readBytes (s.readReg64 .x1) (s.readReg64 .x2).toNat)[i]? == + some ((s.readReg64 .x0).setWidth 8)).getLast? with + | some i => retHook (fun st => (st.writeReg64 .x0 1#64).writeReg64 .x1 (BitVec.ofNat 64 i)) s + | none => retHook (fun st => st.writeReg64 .x0 0#64) s) := rfl + rw [heq] + split + · rfl + · split <;> rfl + +theorem memrchrGhost_preserves_execFrozen [LibsignalPlacement] (mpl mmpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (memrchrGhost mpl mmpl u).mem := by + unfold memrchrGhost f3PureMemrchrGhostHookLs + rw [f3EmptyMemrchrGhostHookLs_eq] + exact linkedCallHook_preserves_execFrozen + (fun s hs => by rw [memrchrHook_mem]; exact hs) hfr + +theorem memrchrGhostK_preserves_execFrozen (mpl mmpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (memrchrGhostK mpl mmpl u).mem := by + unfold memrchrGhostK f3PureMemrchrGhostHookK + rw [f3EmptyMemrchrGhostHookK_eq] + exact linkedCallHook_preserves_execFrozen + (fun s hs => by rw [memrchrHook_mem]; exact hs) hfr + +private theorem setPC_eq_self_of_pc_eq {u : State} {pc : BitVec 64} (hpc : u.pc = pc) : + u.setPC pc = u := by + cases u + dsimp only [State.setPC] at hpc ⊢ + subst hpc + rfl + +private theorem realProg617_svc (mpl mmpl : Obj.MultiPlacement) (W : CliHooks) : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).svc = Syscall.standard := + rfl + +private theorem emptyStdProg_svc : emptyStdProg.svc = Syscall.standard := + rfl + +private theorem emptyStdProg_externAt (pc : BitVec 64) : + emptyStdProg.externAt? pc = none := + rfl + +/-- **Artifact 2a (`CC-R0`, Row 1) — Generic-`InvS` `GhostRowReplayOn` for `lsMemrchrSym`:** + Route `R0` (`entryGuard := fun _ => True`), extracting `LsRetAddr624 (u.readReg64 .lr)` from + non-`.Exception` at each call step and requiring `externAt? pc = none` on `keepR_memrchr mpl` + **only** on the de-hooked real program (`F1` + `H1` compliant). -/ +theorem memrchrGhost_rowReplayOn [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (memrchrSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hKeep : ∀ lr : BitVec 64, LsRetAddr624 lr → keepR_memrchr mpl lr = false) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memrchr mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG lsMemrchrSym (fun _ => True) + (memrchrGhost mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨memrchrGhost_preserves_execFrozen mpl mmpl hfr, memrchrGhost_fs mpl mmpl u⟩ + replay_at_stub := by + intro W _ _ _ _ _ _ _ _ _ + right + refine ⟨hRealHullNoExt W (keepR_memrchr_entry mpl), ?_⟩ + intro u _ _ hpc hrun hnoex hkf hfr hInvU + have hCodeStrip : + (memrchrSubProg mpl).CodeLoaded (stripExecOutside (keepR_memrchr mpl) u.mem) := + memrchrSubProg_codeLoaded_stripExecOutside (hCL u hInvU) + obtain ⟨_, _, hfr_fu, hfs_fu, hvis⟩ := + f3EmptyMemrchrGhostHookLs_visitedIn + (keepR := keepR_memrchr mpl) + (P_sub := memrchrSubProg mpl) + (entryTarget := libsignalSessionLib.resolve mpl lsMemrchrSym) + (memrchrSubProg_svc mpl) + (memrchrSubProg_externAt_none mpl) + (memrchrSubProg_hasWords mpl) + hKeep + hrun + hnoex + hfr + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (libsignalSessionLib.resolve mpl lsMemrchrSym)) + (memrchrGhost mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_memrchr mpl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + rw [setPC_eq_self_of_pc_eq hpc] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (memrchrGhost mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- Spare `K`-narrowed (`memrchrGhostK`) `GhostRowReplayOn` companion (`entryGuard := fun _ => True`, + zero `hKeep` premise; spare only per `REV-PILOT` N2). -/ +theorem memrchrGhostK_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (memrchrSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memrchr mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG lsMemrchrSym (fun _ => True) + (memrchrGhostK mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨memrchrGhostK_preserves_execFrozen mpl mmpl hfr, + f3EmptyMemrchrGhostHookK_fs (keepR_memrchr mpl) (memrchrSubProg mpl) + (libsignalSessionLib.resolve mpl lsMemrchrSym) u⟩ + replay_at_stub := by + intro W _ _ _ _ _ _ _ _ _ + right + refine ⟨hRealHullNoExt W (keepR_memrchr_entry mpl), ?_⟩ + intro u _ _ hpc hrun hnoex hkf hfr hInvU + have hCodeStrip : + (memrchrSubProg mpl).CodeLoaded (stripExecOutside (keepR_memrchr mpl) u.mem) := + memrchrSubProg_codeLoaded_stripExecOutside (hCL u hInvU) + obtain ⟨_, _, hfr_fu, hfs_fu, hvis⟩ := + f3EmptyMemrchrGhostHookK_visitedIn + (keepR := keepR_memrchr mpl) + (P_sub := memrchrSubProg mpl) + (entryTarget := libsignalSessionLib.resolve mpl lsMemrchrSym) + (memrchrSubProg_svc mpl) + (memrchrSubProg_externAt_none mpl) + (memrchrSubProg_hasWords mpl) + hrun + hnoex + hfr + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (libsignalSessionLib.resolve mpl lsMemrchrSym)) + (memrchrGhostK mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_memrchr mpl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + rw [setPC_eq_self_of_pc_eq hpc] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (memrchrGhostK mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-! ## 4. `MemrchrRowSpec`, `GhostRowSpecOk`, `GhostRowOk` & `ExtraEntryGuard` Helpers -/ + +/-- Unconditional `MemrchrRowSpec` (`withLsRet` outermost, `extHookStack ≤ stk ≤ 2 ^ 64`) for + `memrchrGhost mpl mmpl` (`0` layout or memory premises). -/ +theorem memrchrGhost_memrchrRowSpec [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) : + MemrchrRowSpec (memrchrGhost mpl mmpl) := + MemrchrRowSpec.of_ls_vm + (fun stk hlo hhi => + memrchrGhost_mainHopsMemrchr_ok mpl mmpl stk + (Nat.le_trans (by decide : 16 ≤ extHookStack) hlo) hhi) + (fun stk hlo hhi => + memrchrGhost_memrchrRO_ok mpl mmpl stk + (Nat.le_trans (by decide : 16 ≤ extHookStack) hlo) hhi) + (memrchrGhost_vmPreserved mpl mmpl) + +/-- **Artifact 1 (`CC-R0`, Row 1):** Unconditional `GhostRowSpecOk lsMemrchrSym (memrchrGhost mpl mmpl)` + for all `(mpl, mmpl)` (`0` layout or memory premises). -/ +theorem memrchrGhost_rowSpecOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) : + GhostRowSpecOk lsMemrchrSym (memrchrGhost mpl mmpl) where + fs_eq := memrchrGhost_fs mpl mmpl + fsT := memrchrGhost_fsT mpl mmpl + rowSpec := by + unfold ExtraRowSpec + have hd1 : (lsMemrchrSym == "bcmp") = false := by decide + have hd2 : (lsMemrchrSym == "strlen") = false := by decide + have hd3 : (lsMemrchrSym == "memmove") = false := by decide + have hd4 : (lsMemrchrSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsMemrchrSym == lsMemrchrSym) = true := by decide + simp only [hd1, hd2, hd3, hd4, hd5, Bool.false_eq_true, ↓reduceIte] + exact memrchrGhost_memrchrRowSpec mpl mmpl + +/-- **Full per-row `GhostRowOk` bundle (`GhostRowSpecOk` ∧ `GhostRowReplayOn`)** for `lsMemrchrSym` + (`entryGuard := fun _ => True`). -/ +theorem memrchrGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (memrchrSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hKeep : ∀ lr : BitVec 64, LsRetAddr624 lr → keepR_memrchr mpl lr = false) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memrchr mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowOk mpl mmpl InvS EG lsMemrchrSym (fun _ => True) + (memrchrGhost mpl mmpl) := + ⟨memrchrGhost_rowSpecOk mpl mmpl, + memrchrGhost_rowReplayOn mpl mmpl InvS EG hCL hInvKeep hKeep hRealHullNoExt⟩ + +theorem extraEntryGuard_memrchr_arm + {mpl : Obj.MultiPlacement} {guardOf : String → State → Prop} {s0 : State} + (hGuardEq : guardOf lsMemrchrSym s0 ↔ memrchrEntryGuard mpl s0) : + guardOf lsMemrchrSym s0 := + hGuardEq.mpr trivial + +theorem extraEntryGuard_singleton_memrchr [LibsignalPlacement] + {mpl mmpl : Obj.MultiPlacement} {guardOf : String → State → Prop} + {g : CliGhostHooks} {s0 : State} + (hg : g.extra = [(lsMemrchrSym, memrchrGhost mpl mmpl)]) + (hGuardEq : guardOf lsMemrchrSym s0 ↔ memrchrEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := by + intro sym _ _ hLook + rw [hg] at hLook + simp only [List.lookup] at hLook + by_cases hSym : (sym == lsMemrchrSym) = true + · have hEq := eq_of_beq hSym + subst hEq + exact hGuardEq.mpr trivial + · simp [hSym] at hLook + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrExtraReplays diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/SharedSecretDropGhostReplays.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/SharedSecretDropGhostReplays.lean new file mode 100644 index 000000000..b0e748574 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/SharedSecretDropGhostReplays.lean @@ -0,0 +1,691 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.SharedSecretDropRowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeCode -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeGhost -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeLrTrap -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropLrTrap -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric -- proof-setup: allow-public-import + +/-! +# Card CC-DALEK — `lsSharedSecretDropSym` Row Consumer Spec & Generic-`InvS` Ghost Replay (`HooksDehook.SharedSecretDropGhostReplays`) + +Cutover-2 `c`-card for `::drop` (`lsSharedSecretDropSym`) in +the `W2-C11` `CliGhostHooks.extra` framework (`ccard_recipe.md` §2.2, §5 row 7), modeled directly +on `BcmpGhostReplays.lean` (`0` `CliElfLib` / `ElfF3Relink` / C2 / trusted imports): + +1. **Row Anchor & `W`-Independent Ghost (`sharedSecretDropHullBase`, `keepR_sharedSecretDrop`, + `sharedSecretDropSubProg`, `sharedSecretDropGhost`):** + - `lsSharedSecretDropSym` (`b #-252`, `4` B = `1` word) is in `libsignalSessionLib`, whereas + `::zeroize` (`252` B = `63` words `zeroize32Words`) is unhooked + and absent from `libsignalSessionLib`. Following `BcmpGhostReplays.bcmpHullBase`, + `sharedSecretDropHullBase mpl := libsignalSessionLib.resolve mpl lsSharedSecretDropSym - + sharedSecretDropEntryOff` (`252#64`) encodes the contiguous `64`-word (`256` B) hull base + with the unconditional identity + `sharedSecretDropHullBase mpl + sharedSecretDropEntryOff = + libsignalSessionLib.resolve mpl lsSharedSecretDropSym` (`0` premises; if a hypothetical + layout placed other bytes at `- 252#64`, `(sharedSecretDropSubProg mpl).CodeLoaded u.mem` + would simply not hold rather than introducing any assumption). + - `sharedSecretDropGhost mpl mmpl` wraps `ZeroizeGhost.f3EmptySharedSecretDropGhostHook` + (`P_real := emptyStdProg`, `fallback := zeroizeSecretHook`), with **zero `W : CliHooks` + dependence**. +2. **Artifact 1 — Unconditional `GhostRowSpecOk lsSharedSecretDropSym (sharedSecretDropGhost mpl mmpl)` + (`0` premises):** + - `sharedSecretDropGhost_rowSpecOk` proves `fs_eq`, `fsT : HookFsTraced IsFsC`, and + `SharedSecretDropRowSpec` (`zeroizeSecretSpec`, plain, `withVmPreserved`, and `withAlloc A lim`) + unconditionally via `SharedSecretDropRowSpec.of_vm`. +3. **Artifact 2a — Generic-`InvS` `GhostRowReplayOn` & `GhostRowOk` (`F1` + `H1` compliant):** + - **F1 (`pc ≠ resolve mpl lsSharedSecretDropSym` exclusion ONLY on `P_ghost`, whole-hull on + de-hooked `P_real`):** `hRealHullNoExt` quantifies over all `256` B + `keepR_sharedSecretDrop mpl pc = true` on `P_real` only; `hGhostNoExtNe` strictly excludes + `pc ≠ libsignalSessionLib.resolve mpl lsSharedSecretDropSym` on `P_ghost` (unhooked `zeroize` + at `sharedSecretDropHullBase mpl` is NOT excluded!) and routes through + `SharedSecretDropLrTrap.f3EmptySharedSecretDropGhostHook_keepLr_false_after_hook_of_codeLoaded_u`. + - **H1 (`CodeLoaded u.mem` from `InvS u`):** `hCL` supplies + `(sharedSecretDropSubProg mpl).CodeLoaded u.mem` at intermediate call state `u` from `InvS u` + (never `s0.mem`), accompanied by `sharedSecretDropSubProg_codeLoaded_stripExecOutside_iff`. + - Includes `C4` interior-stub wrapper `sharedSecretDropGhost_rowReplayOn_of_interior`, + `K`-narrowed spare `sharedSecretDropGhostK_rowReplayOn`, full `sharedSecretDropGhost_rowOk`, + and per-arm / singleton entry-guard helpers `extraEntryGuard_sharedSecretDrop_arm` / + `extraEntryGuard_singleton_sharedSecretDrop` (`.text.lib2` layout instantiation belongs to the + C2 layout / STARTUP seat per `02:28Z` split). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropGhostReplays + +open Arm64 Arm64.Obj Arm64.Process ProofLib +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession ( + CliHooks cliExternsPlaced libsignalSessionLib + lsBlackBoxSym lsDurationSinceSym lsFromUtf8Sym lsMemrchrSym + lsSharedSecretDropSym lsStaticSecretDropSym lsTimeAddSym +) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks IsFsC) +open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer (ExecFrozen) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.SharedSecretDropRowSpec ( + SharedSecretDropRowSpec +) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs ( + ExtraRowSpec GhostRowSpecOk +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay ( + ExtraEntryGuard GhostRowOk GhostRowReplayOn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetCode (pureWordsProg_externAt_none) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhostK (emptyStdProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords (TrapHook) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeCode ( + sharedSecretDropHullWords + hookOk_zeroizeSecret_of_master +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeGhost ( + sharedSecretDropEntryOff + f3EmptySharedSecretDropGhostHook f3EmptySharedSecretDropGhostHookK + f3EmptyZeroizeGhostHook_fs f3EmptyZeroizeGhostHookK_fs + f3EmptyZeroizeGhostHook_fsT + f3EmptyZeroizeGhostHook_preserves_execFrozen f3EmptyZeroizeGhostHookK_preserves_execFrozen + subroutine_ok_sharedSecretHull_processZeroize_of_hasWords + f3EmptyZeroizeGhostHook_master_ok_of_process + f3EmptyZeroizeGhostHook_vmPreserved_of_process + f3EmptySharedSecretDropGhostHook_visitedIn f3EmptySharedSecretDropGhostHookK_visitedIn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeLrTrap ( + sharedSecretDropHullByteLen keepSharedSecretDropHull + keepSharedSecretDropHull_iff keepSharedSecretDropHull_entry + pureWordsProg_sharedSecretDropHull_hasWords + sharedSecretDropHull_codeLoaded_stripExecOutside + SharedSecretDropEntryGuard + trapHook_f3EmptySharedSecretDropGhostHook_of_cover +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropLrTrap ( + sharedSecretDropHull_keepLr_false_after_hook_of_codeLoaded_u + f3EmptySharedSecretDropGhostHook_keepLr_false_after_hook_of_codeLoaded_u +) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric ( + h2fsgen_steps_lift_of_visitedIn_noExtern +) + +/-! ## 1. Row Anchor Definitions, Algebraic Identities & `CodeLoaded` Bridges -/ + +/-- Computed base address of the contiguous 256-byte (`64`-word) + `zeroize32Words ++ [sharedSecretDropBackWord]` hull for placement `mpl`, defined relative to + `lsSharedSecretDropSym` (`resolve mpl lsSharedSecretDropSym - sharedSecretDropEntryOff`) + because `::zeroize` (`252` B) is unhooked and absent from + `libsignalSessionLib`. -/ +@[expose] def sharedSecretDropHullBase (mpl : Obj.MultiPlacement) : BitVec 64 := + libsignalSessionLib.resolve mpl lsSharedSecretDropSym - sharedSecretDropEntryOff + +/-- Unconditional BitVec identity: + `sharedSecretDropHullBase mpl + sharedSecretDropEntryOff = resolve mpl lsSharedSecretDropSym`. -/ +theorem sharedSecretDropHullBase_add_entryOff (mpl : Obj.MultiPlacement) : + sharedSecretDropHullBase mpl + sharedSecretDropEntryOff = + libsignalSessionLib.resolve mpl lsSharedSecretDropSym := by + dsimp only [sharedSecretDropHullBase] + bv_omega + +/-- Kept-region byte predicate `[sharedSecretDropHullBase mpl, sharedSecretDropHullBase mpl + 256)` + for `lsSharedSecretDropSym`. -/ +@[expose] def keepR_sharedSecretDrop (mpl : Obj.MultiPlacement) : BitVec 64 → Bool := + keepSharedSecretDropHull (sharedSecretDropHullBase mpl) + +/-- `lsSharedSecretDropSym`'s resolved entry address lies inside `keepR_sharedSecretDrop mpl`. -/ +theorem keepR_sharedSecretDrop_entry (mpl : Obj.MultiPlacement) : + keepR_sharedSecretDrop mpl (libsignalSessionLib.resolve mpl lsSharedSecretDropSym) = true := by + dsimp only [keepR_sharedSecretDrop] + rw [← sharedSecretDropHullBase_add_entryOff mpl] + exact keepSharedSecretDropHull_entry (sharedSecretDropHullBase mpl) + +/-- Pure 64-word (`256`-byte) sub-program holding `sharedSecretDropHullWords` at + `sharedSecretDropHullBase mpl`. -/ +@[expose] def sharedSecretDropSubProg (mpl : Obj.MultiPlacement) : Program := + pureWordsProg (sharedSecretDropHullBase mpl) sharedSecretDropHullWords + +theorem sharedSecretDropSubProg_base (mpl : Obj.MultiPlacement) : + (sharedSecretDropSubProg mpl).base = sharedSecretDropHullBase mpl := rfl + +theorem sharedSecretDropSubProg_svc (mpl : Obj.MultiPlacement) : + (sharedSecretDropSubProg mpl).svc = Syscall.standard := rfl + +theorem sharedSecretDropSubProg_externAt_none (mpl : Obj.MultiPlacement) (pc : BitVec 64) : + (sharedSecretDropSubProg mpl).externAt? pc = none := + pureWordsProg_externAt_none (sharedSecretDropHullBase mpl) sharedSecretDropHullWords pc + +theorem sharedSecretDropSubProg_hasWords (mpl : Obj.MultiPlacement) : + (sharedSecretDropSubProg mpl).hasWords + (sharedSecretDropHullBase mpl) sharedSecretDropHullWords := + pureWordsProg_sharedSecretDropHull_hasWords (sharedSecretDropHullBase mpl) + +private theorem flatMap_wordToBytesLE_length (ws : List (BitVec 32)) : + (ws.flatMap Program.wordToBytesLE).length = 4 * ws.length := by + induction ws with + | nil => rfl + | cons w tl ih => + simp only [List.flatMap_cons, List.length_append, List.length_cons, ih] + have hw : (Program.wordToBytesLE w).length = 4 := rfl + omega + +theorem sharedSecretDropSubProg_code_length (mpl : Obj.MultiPlacement) : + (sharedSecretDropSubProg mpl).code.length = sharedSecretDropHullByteLen := by + dsimp only [sharedSecretDropSubProg, pureWordsProg, Program.ofWords] + rw [flatMap_wordToBytesLE_length] + rfl + +theorem keepR_sharedSecretDrop_of_code_offset (mpl : Obj.MultiPlacement) {off : Nat} + (hoff : off < (sharedSecretDropSubProg mpl).code.length) : + keepR_sharedSecretDrop mpl + ((sharedSecretDropSubProg mpl).base + BitVec.ofNat 64 off) = true := by + rw [sharedSecretDropSubProg_code_length] at hoff + rw [sharedSecretDropSubProg_base] + dsimp only [keepR_sharedSecretDrop] + rw [keepSharedSecretDropHull_iff] + have hsub : + (sharedSecretDropHullBase mpl + BitVec.ofNat 64 off) - sharedSecretDropHullBase mpl = + BitVec.ofNat 64 off := by bv_omega + have hoff_lt : off < 2 ^ 64 := by + have hb : sharedSecretDropHullByteLen = 256 := rfl + omega + rw [hsub, BitVec.toNat_ofNat, Nat.mod_eq_of_lt hoff_lt] + exact hoff + +/-- Forward `CodeLoaded` projection onto `stripExecOutside (keepR_sharedSecretDrop mpl) mem`. -/ +theorem sharedSecretDropSubProg_codeLoaded_stripExecOutside + {mpl : Obj.MultiPlacement} {mem : Memory} + (hL : (sharedSecretDropSubProg mpl).CodeLoaded mem) : + (sharedSecretDropSubProg mpl).CodeLoaded + (stripExecOutside (keepR_sharedSecretDrop mpl) mem) := + sharedSecretDropHull_codeLoaded_stripExecOutside + (fun _ hoff => keepR_sharedSecretDrop_of_code_offset mpl hoff) hL + +/-- Reverse `CodeLoaded` projection from `stripExecOutside (keepR_sharedSecretDrop mpl) mem` back + to `mem`. -/ +theorem sharedSecretDropSubProg_codeLoaded_of_stripExecOutside + {mpl : Obj.MultiPlacement} {mem : Memory} + (hL : (sharedSecretDropSubProg mpl).CodeLoaded + (stripExecOutside (keepR_sharedSecretDrop mpl) mem)) : + (sharedSecretDropSubProg mpl).CodeLoaded mem := by + refine Program.CodeLoaded.intro hL.aligned hL.no_wrap fun i hi => ?_ + have hk : keepR_sharedSecretDrop mpl + ((sharedSecretDropSubProg mpl).base + BitVec.ofNat 64 i) = true := + keepR_sharedSecretDrop_of_code_offset mpl hi + have hbyte := hL.byte_eq i hi + have hperm := hL.perm_eq i hi + have hlf := hL.isLazyFree_eq i hi + rw [ProofLib.strip_read8] at hbyte + rw [ProofLib.strip_perm_of_keep hk] at hperm + rw [ProofLib.strip_isLazyFree] at hlf + exact ⟨hbyte, hperm, hlf⟩ + +theorem sharedSecretDropSubProg_codeLoaded_stripExecOutside_iff + {mpl : Obj.MultiPlacement} {mem : Memory} : + (sharedSecretDropSubProg mpl).CodeLoaded + (stripExecOutside (keepR_sharedSecretDrop mpl) mem) ↔ + (sharedSecretDropSubProg mpl).CodeLoaded mem := + ⟨sharedSecretDropSubProg_codeLoaded_of_stripExecOutside, + sharedSecretDropSubProg_codeLoaded_stripExecOutside⟩ + +/-- `W`-independent ghost hook for `lsSharedSecretDropSym` + (`CliGhostHooks.extra` entry `(lsSharedSecretDropSym, sharedSecretDropGhost mpl mmpl)`). -/ +@[expose] noncomputable def sharedSecretDropGhost (mpl _mmpl : Obj.MultiPlacement) : + State → State := + f3EmptySharedSecretDropGhostHook (keepR_sharedSecretDrop mpl) (sharedSecretDropSubProg mpl) + (sharedSecretDropHullBase mpl) + +/-- `K`-narrowed `W`-independent ghost hook companion for `lsSharedSecretDropSym` + (spare only; N2). -/ +@[expose] noncomputable def sharedSecretDropGhostK (mpl _mmpl : Obj.MultiPlacement) : + State → State := + f3EmptySharedSecretDropGhostHookK (keepR_sharedSecretDrop mpl) (sharedSecretDropSubProg mpl) + (sharedSecretDropHullBase mpl) + +/-- Block-`617` entry-state `lr` guard for `lsSharedSecretDropSym`: + `keepR_sharedSecretDrop mpl (s0.readReg64 .lr) = false ∧ s0.readReg64 .lr ≠ resolve mpl lsSharedSecretDropSym`. -/ +@[expose] def sharedSecretDropEntryGuard (mpl : Obj.MultiPlacement) (s0 : State) : Prop := + SharedSecretDropEntryGuard (sharedSecretDropHullBase mpl) + (libsignalSessionLib.resolve mpl lsSharedSecretDropSym) s0 + +theorem sharedSecretDropEntryGuard_iff (mpl : Obj.MultiPlacement) (s0 : State) : + sharedSecretDropEntryGuard mpl s0 ↔ + keepR_sharedSecretDrop mpl (s0.readReg64 .lr) = false ∧ + s0.readReg64 .lr ≠ libsignalSessionLib.resolve mpl lsSharedSecretDropSym := + Iff.rfl + +/-! ## 2. Artifact 1 — Unconditional `GhostRowSpecOk lsSharedSecretDropSym (sharedSecretDropGhost mpl mmpl)` -/ + +theorem sharedSecretDropGhost_fs (mpl mmpl : Obj.MultiPlacement) (s : State) : + (sharedSecretDropGhost mpl mmpl s).fs = s.fs := + f3EmptyZeroizeGhostHook_fs (keepR_sharedSecretDrop mpl) (sharedSecretDropSubProg mpl) + (sharedSecretDropHullBase mpl + sharedSecretDropEntryOff) s + +theorem sharedSecretDropGhost_fsT (mpl mmpl : Obj.MultiPlacement) : + HookFsTraced IsFsC (sharedSecretDropGhost mpl mmpl) := + f3EmptyZeroizeGhostHook_fsT (keepR_sharedSecretDrop mpl) (sharedSecretDropSubProg mpl) + (sharedSecretDropHullBase mpl + sharedSecretDropEntryOff) + +theorem sharedSecretDropGhost_vmPreserved (mpl mmpl : Obj.MultiPlacement) (s : State) : + LibsignalBinary.Heap.VmPreserved s (sharedSecretDropGhost mpl mmpl s) := + f3EmptyZeroizeGhostHook_vmPreserved_of_process + (sharedSecretDropSubProg_svc mpl) + (sharedSecretDropSubProg_externAt_none mpl) + (subroutine_ok_sharedSecretHull_processZeroize_of_hasWords + (sharedSecretDropSubProg_externAt_none mpl) + (sharedSecretDropSubProg_hasWords mpl)) + s + +/-- Unconditional `SharedSecretDropRowSpec` for `sharedSecretDropGhost mpl mmpl` + (`0` layout or memory premises). -/ +theorem sharedSecretDropGhost_sharedSecretDropRowSpec (mpl mmpl : Obj.MultiPlacement) : + SharedSecretDropRowSpec (sharedSecretDropGhost mpl mmpl) := + SharedSecretDropRowSpec.of_vm + (hookOk_zeroizeSecret_of_master + (f3EmptyZeroizeGhostHook_master_ok_of_process + (sharedSecretDropSubProg_svc mpl) + (sharedSecretDropSubProg_externAt_none mpl) + (subroutine_ok_sharedSecretHull_processZeroize_of_hasWords + (sharedSecretDropSubProg_externAt_none mpl) + (sharedSecretDropSubProg_hasWords mpl)))) + (sharedSecretDropGhost_vmPreserved mpl mmpl) + +/-- **Artifact 1 (`C11` §1.2, §6.1):** Unconditional + `GhostRowSpecOk lsSharedSecretDropSym (sharedSecretDropGhost mpl mmpl)` for all `(mpl, mmpl)` + (`0` stock-side or layout premises). -/ +theorem sharedSecretDropGhost_rowSpecOk [LibsignalPlacement] (mpl mmpl : Obj.MultiPlacement) : + GhostRowSpecOk lsSharedSecretDropSym (sharedSecretDropGhost mpl mmpl) where + fs_eq := sharedSecretDropGhost_fs mpl mmpl + fsT := sharedSecretDropGhost_fsT mpl mmpl + rowSpec := by + have h1 : (lsSharedSecretDropSym == "bcmp") = false := by decide + have h2 : (lsSharedSecretDropSym == "strlen") = false := by decide + have h3 : (lsSharedSecretDropSym == "memmove") = false := by decide + have h4 : (lsSharedSecretDropSym == lsFromUtf8Sym) = false := by decide + have h5 : (lsSharedSecretDropSym == lsMemrchrSym) = false := by decide + have h6 : (lsSharedSecretDropSym == lsDurationSinceSym) = false := by decide + have h7 : (lsSharedSecretDropSym == lsTimeAddSym) = false := by decide + have h8 : (lsSharedSecretDropSym == lsBlackBoxSym) = false := by decide + have h9 : (lsSharedSecretDropSym == lsStaticSecretDropSym) = false := by decide + have h10 : (lsSharedSecretDropSym == lsSharedSecretDropSym) = true := by decide + dsimp only [ExtraRowSpec] + simp only [h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, Bool.false_eq_true, ↓reduceIte] + exact sharedSecretDropGhost_sharedSecretDropRowSpec mpl mmpl + +/-! ## 3. `ExecFrozen` Preservation & Generic-`InvS` `GhostRowReplayOn` (Artifact 2a) -/ + +theorem sharedSecretDropGhost_preserves_execFrozen (mpl mmpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (sharedSecretDropGhost mpl mmpl u).mem := + f3EmptyZeroizeGhostHook_preserves_execFrozen (keepR_sharedSecretDrop mpl) + (sharedSecretDropSubProg mpl) + (sharedSecretDropHullBase mpl + sharedSecretDropEntryOff) hfr + +theorem sharedSecretDropGhostK_preserves_execFrozen (mpl mmpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (sharedSecretDropGhostK mpl mmpl u).mem := + f3EmptyZeroizeGhostHookK_preserves_execFrozen (keepR_sharedSecretDrop mpl) + (sharedSecretDropSubProg mpl) + (sharedSecretDropHullBase mpl + sharedSecretDropEntryOff) hfr + +private theorem setPC_eq_self_of_pc_eq {u : State} {pc : BitVec 64} (hpc : u.pc = pc) : + u.setPC pc = u := by + cases u + dsimp only [State.setPC] at hpc ⊢ + subst hpc + rfl + +private theorem realProg617_svc (mpl mmpl : Obj.MultiPlacement) (W : CliHooks) : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).svc = Syscall.standard := + rfl + +private theorem emptyStdProg_svc : emptyStdProg.svc = Syscall.standard := + rfl + +private theorem emptyStdProg_externAt (pc : BitVec 64) : + emptyStdProg.externAt? pc = none := + rfl + +/-- **Artifact 2a (`C11` §1.3, §6.2) — Generic-`InvS` `GhostRowReplayOn` for + `lsSharedSecretDropSym`:** + - **F1 compliance:** `hRealHullNoExt` quantifies over all `256` B + `keepR_sharedSecretDrop mpl pc = true` **only** on the de-hooked real program + `cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W` (post-Cutover-2, once + `lsSharedSecretDropSym` is dropped from `cliHookTablePlaced`, so neither `zeroize` nor + `SharedSecret::drop` carries an extern hook on `P_real`). On the ghost program + `cliProgExtPlacedAt mpl EG 617 W`, `hGhostNoExtNe` strictly excludes + `pc ≠ libsignalSessionLib.resolve mpl lsSharedSecretDropSym` ONLY (unhooked `zeroize` at + `sharedSecretDropHullBase mpl` is NOT excluded). + - **H1 compliance:** `hCL` supplies `(sharedSecretDropSubProg mpl).CodeLoaded u.mem` at + intermediate call state `u` from `InvS u` (never `s0.mem`). -/ +theorem sharedSecretDropGhost_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (sharedSecretDropSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (libsignalSessionLib.resolve mpl lsSharedSecretDropSym) = + some (sharedSecretDropGhost mpl mmpl)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_sharedSecretDrop mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_sharedSecretDrop mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsSharedSecretDropSym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG lsSharedSecretDropSym + (sharedSecretDropEntryGuard mpl) (sharedSecretDropGhost mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨sharedSecretDropGhost_preserves_execFrozen mpl mmpl hfr, + sharedSecretDropGhost_fs mpl mmpl u⟩ + replay_at_stub := by + intro W s0 sf _ _ _ hEntry hRetPc hNoExSf hNotHaltSf + have hGhostAtEntry : + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (sharedSecretDropHullBase mpl + sharedSecretDropEntryOff) = + some (sharedSecretDropGhost mpl mmpl) := by + rw [sharedSecretDropHullBase_add_entryOff mpl] + exact hGhostAt W + right + refine ⟨hRealHullNoExt W (keepR_sharedSecretDrop_entry mpl), ?_⟩ + intro u _ hStepsAfter hpc hrun hnoex hkf hfr hInvU + have hCodeU : (sharedSecretDropSubProg mpl).CodeLoaded u.mem := hCL u hInvU + have hLrOut : keepR_sharedSecretDrop mpl (u.readReg64 .lr) = false := + f3EmptySharedSecretDropGhostHook_keepLr_false_after_hook_of_codeLoaded_u + (P_ghost := cliProgExtPlacedAt mpl EG 617 W) + (P_sub := sharedSecretDropSubProg mpl) + (keepR := keepR_sharedSecretDrop mpl) + (m := sharedSecretDropHullBase mpl) + (sharedSecretDropSubProg_hasWords mpl) + (fun _ h => h) + (fun _ hk hne => + hGhostNoExtNe W hk (fun hEq => + hne (hEq.trans (sharedSecretDropHullBase_add_entryOff mpl).symm))) + hGhostAtEntry + hEntry.1 + hRetPc + hNoExSf + hNotHaltSf + u + hCodeU + hStepsAfter + hrun + hkf + have hCodeStrip : + (sharedSecretDropSubProg mpl).CodeLoaded + (stripExecOutside (keepR_sharedSecretDrop mpl) u.mem) := + sharedSecretDropSubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨hvis, hfr_fu, hfs_fu⟩ := + f3EmptySharedSecretDropGhostHook_visitedIn + (keep := keepR_sharedSecretDrop mpl) + (P_sub := sharedSecretDropSubProg mpl) + (m := sharedSecretDropHullBase mpl) + (sharedSecretDropSubProg_svc mpl) + (sharedSecretDropSubProg_externAt_none mpl) + (sharedSecretDropSubProg_hasWords mpl) + hrun + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (sharedSecretDropHullBase mpl + sharedSecretDropEntryOff)) + (sharedSecretDropGhost mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_sharedSecretDrop mpl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hSetPC : u.setPC (sharedSecretDropHullBase mpl + sharedSecretDropEntryOff) = u := + setPC_eq_self_of_pc_eq (hpc.trans (sharedSecretDropHullBase_add_entryOff mpl).symm) + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (sharedSecretDropGhost mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- `C4` interior-stub signature wrapper for `sharedSecretDropGhost_rowReplayOn` (accepting split + `hRealNone` at `stubPc` + `hInteriorGhost` with the `Or.inr` `TrapHook` interior-stub disjunct + on `pc ≠ resolve mpl lsSharedSecretDropSym`). -/ +theorem sharedSecretDropGhost_rowReplayOn_of_interior + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (sharedSecretDropSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (libsignalSessionLib.resolve mpl lsSharedSecretDropSym) = + some (sharedSecretDropGhost mpl mmpl)) + (hRealNone : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl lsSharedSecretDropSym) = none) + (hInteriorGhost : ∀ (W : CliHooks) (pc : BitVec 64), + keepR_sharedSecretDrop mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsSharedSecretDropSym → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none ∧ + ((cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ gStub, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some gStub ∧ + ∀ L : BitVec 64, keepR_sharedSecretDrop mpl L = true → TrapHook L gStub)) : + GhostRowReplayOn mpl mmpl InvS EG lsSharedSecretDropSym + (sharedSecretDropEntryGuard mpl) (sharedSecretDropGhost mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨sharedSecretDropGhost_preserves_execFrozen mpl mmpl hfr, + sharedSecretDropGhost_fs mpl mmpl u⟩ + replay_at_stub := by + intro W s0 sf _ _ _ hEntry hRetPc hNoExSf hNotHaltSf + have hRealHullNoExt : ∀ {pc : BitVec 64}, + keepR_sharedSecretDrop mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := by + intro pc hk + by_cases hEq : pc = libsignalSessionLib.resolve mpl lsSharedSecretDropSym + · rw [hEq]; exact hRealNone W + · exact (hInteriorGhost W pc hk hEq).1 + have hRegExt : ∀ pc : BitVec 64, + keepSharedSecretDropHull (sharedSecretDropHullBase mpl) pc = true → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ f, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some f ∧ + ∀ L, keepSharedSecretDropHull (sharedSecretDropHullBase mpl) L = true → + TrapHook L f := by + intro pc hk + by_cases hEq : pc = libsignalSessionLib.resolve mpl lsSharedSecretDropSym + · rw [hEq] + exact Or.inr ⟨sharedSecretDropGhost mpl mmpl, hGhostAt W, fun L hL => + trapHook_f3EmptySharedSecretDropGhostHook_of_cover + (sharedSecretDropSubProg mpl) (fun _ h => h) hL⟩ + · rcases (hInteriorGhost W pc hk hEq).2 with hNone | ⟨gStub, hSome, hTrap⟩ + · exact Or.inl hNone + · exact Or.inr ⟨gStub, hSome, hTrap⟩ + right + refine ⟨hRealNone W, ?_⟩ + intro u _ hStepsAfter hpc hrun hnoex hkf hfr hInvU + have hCodeU : (sharedSecretDropSubProg mpl).CodeLoaded u.mem := hCL u hInvU + have hLrOut : keepR_sharedSecretDrop mpl (u.readReg64 .lr) = false := + sharedSecretDropHull_keepLr_false_after_hook_of_codeLoaded_u + (P_ghost := cliProgExtPlacedAt mpl EG 617 W) + (P_sub := sharedSecretDropSubProg mpl) + (m := sharedSecretDropHullBase mpl) + (f_stub := sharedSecretDropGhost mpl mmpl) + (sharedSecretDropSubProg_hasWords mpl) + hRegExt + (fun _ hL => trapHook_f3EmptySharedSecretDropGhostHook_of_cover + (sharedSecretDropSubProg mpl) (fun _ h => h) hL) + hEntry.1 + hRetPc + hNoExSf + hNotHaltSf + u + hCodeU + hStepsAfter + hrun + hkf + have hCodeStrip : + (sharedSecretDropSubProg mpl).CodeLoaded + (stripExecOutside (keepR_sharedSecretDrop mpl) u.mem) := + sharedSecretDropSubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨hvis, hfr_fu, hfs_fu⟩ := + f3EmptySharedSecretDropGhostHook_visitedIn + (keep := keepR_sharedSecretDrop mpl) + (P_sub := sharedSecretDropSubProg mpl) + (m := sharedSecretDropHullBase mpl) + (sharedSecretDropSubProg_svc mpl) + (sharedSecretDropSubProg_externAt_none mpl) + (sharedSecretDropSubProg_hasWords mpl) + hrun + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (sharedSecretDropHullBase mpl + sharedSecretDropEntryOff)) + (sharedSecretDropGhost mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_sharedSecretDrop mpl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt hk) + hvis + have hSetPC : u.setPC (sharedSecretDropHullBase mpl + sharedSecretDropEntryOff) = u := + setPC_eq_self_of_pc_eq (hpc.trans (sharedSecretDropHullBase_add_entryOff mpl).symm) + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (sharedSecretDropGhost mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- `K`-narrowed `sharedSecretDropGhostK` companion `GhostRowReplayOn` + (`entryGuard := fun _ => True`; spare only per N2). -/ +theorem sharedSecretDropGhostK_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (sharedSecretDropSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_sharedSecretDrop mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG lsSharedSecretDropSym + (fun _ => True) (sharedSecretDropGhostK mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨sharedSecretDropGhostK_preserves_execFrozen mpl mmpl hfr, + f3EmptyZeroizeGhostHookK_fs (keepR_sharedSecretDrop mpl) (sharedSecretDropSubProg mpl) + (sharedSecretDropHullBase mpl + sharedSecretDropEntryOff) u⟩ + replay_at_stub := by + intro W _ _ _ _ _ _ _ _ _ + right + refine ⟨hRealHullNoExt W (keepR_sharedSecretDrop_entry mpl), ?_⟩ + intro u _ _ hpc hrun hnoex hkf hfr hInvU + have hCodeStrip : + (sharedSecretDropSubProg mpl).CodeLoaded + (stripExecOutside (keepR_sharedSecretDrop mpl) u.mem) := + sharedSecretDropSubProg_codeLoaded_stripExecOutside (hCL u hInvU) + obtain ⟨hvis, hfr_fu, hfs_fu⟩ := + f3EmptySharedSecretDropGhostHookK_visitedIn + (keep := keepR_sharedSecretDrop mpl) + (P_sub := sharedSecretDropSubProg mpl) + (m := sharedSecretDropHullBase mpl) + (sharedSecretDropSubProg_svc mpl) + (sharedSecretDropSubProg_externAt_none mpl) + (sharedSecretDropSubProg_hasWords mpl) + hrun + hnoex + hfr + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (sharedSecretDropHullBase mpl + sharedSecretDropEntryOff)) + (sharedSecretDropGhostK mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_sharedSecretDrop mpl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hSetPC : u.setPC (sharedSecretDropHullBase mpl + sharedSecretDropEntryOff) = u := + setPC_eq_self_of_pc_eq (hpc.trans (sharedSecretDropHullBase_add_entryOff mpl).symm) + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (sharedSecretDropGhostK mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- Guard-strengthening adapter on `GhostRowReplayOn`. -/ +theorem ghostRowReplayOn_of_guard_imp + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + {EG : CliHooks → String → Option (State → State)} + {sym : String} {entryGuard guard' : State → Prop} {f : State → State} + (hRow : GhostRowReplayOn mpl mmpl InvS EG sym entryGuard f) + (hImp : ∀ s0 : State, guard' s0 → entryGuard s0) : + GhostRowReplayOn mpl mmpl InvS EG sym guard' f where + preserves_execFrozen := hRow.preserves_execFrozen + replay_at_stub := fun W s0 sf hG hRet hNoEx hNHalt => + hRow.replay_at_stub W s0 sf (hImp s0 hG) hRet hNoEx hNHalt + +/-- Full per-row `GhostRowOk` bundle (`GhostRowSpecOk` ∧ `GhostRowReplayOn`) for + `lsSharedSecretDropSym`. -/ +theorem sharedSecretDropGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (sharedSecretDropSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (libsignalSessionLib.resolve mpl lsSharedSecretDropSym) = + some (sharedSecretDropGhost mpl mmpl)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_sharedSecretDrop mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_sharedSecretDrop mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsSharedSecretDropSym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowOk mpl mmpl InvS EG lsSharedSecretDropSym + (sharedSecretDropEntryGuard mpl) (sharedSecretDropGhost mpl mmpl) := + ⟨sharedSecretDropGhost_rowSpecOk mpl mmpl, + sharedSecretDropGhost_rowReplayOn mpl mmpl InvS EG + hCL hInvKeep hGhostAt hRealHullNoExt hGhostNoExtNe⟩ + +/-! ## 4. Per-Arm & Singleton `ExtraEntryGuard` Helpers (`.text.lib2` Interface) -/ + +/-- Per-arm `lsSharedSecretDropSym` discharge for any `guardOf : String → State → Prop` agreeing + with `sharedSecretDropEntryGuard mpl` on `lsSharedSecretDropSym`. -/ +theorem extraEntryGuard_sharedSecretDrop_arm + {mpl : Obj.MultiPlacement} {guardOf : String → State → Prop} {s0 : State} + (hGuardEq : guardOf lsSharedSecretDropSym s0 ↔ sharedSecretDropEntryGuard mpl s0) + (hDropGuard : sharedSecretDropEntryGuard mpl s0) : + guardOf lsSharedSecretDropSym s0 := + hGuardEq.mpr hDropGuard + +/-- Table-level `ExtraEntryGuard guardOf g s0` discharge when `g.extra` carries the singleton + `lsSharedSecretDropSym` row `[(lsSharedSecretDropSym, sharedSecretDropGhost mpl mmpl)]` (N3). -/ +theorem extraEntryGuard_singleton_sharedSecretDrop + {mpl mmpl : Obj.MultiPlacement} {guardOf : String → State → Prop} + {g : CliGhostHooks} {s0 : State} + (hg : g.extra = [(lsSharedSecretDropSym, sharedSecretDropGhost mpl mmpl)]) + (hGuardEq : guardOf lsSharedSecretDropSym s0 ↔ sharedSecretDropEntryGuard mpl s0) + (hDropGuard : sharedSecretDropEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := by + intro sym f _ hLook + rw [hg] at hLook + simp only [List.lookup] at hLook + by_cases hSym : (sym == lsSharedSecretDropSym) = true + · have hEq : sym = lsSharedSecretDropSym := eq_of_beq hSym + subst hEq + exact hGuardEq.mpr hDropGuard + · simp [hSym] at hLook + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropGhostReplays diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/StaticSecretDropGhostReplays.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/StaticSecretDropGhostReplays.lean new file mode 100644 index 000000000..3d774d801 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/StaticSecretDropGhostReplays.lean @@ -0,0 +1,651 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.StaticSecretDropRowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeCode -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeGhost -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeLrTrap -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric -- proof-setup: allow-public-import + +/-! +# Card CC-DALEK — `lsStaticSecretDropSym` Row Consumer Spec & Generic-`InvS` Ghost Replay (`HooksDehook.StaticSecretDropGhostReplays`) + +Cutover-2 `c`-card for `::drop` (`lsStaticSecretDropSym`) in +the `W2-C11` `CliGhostHooks.extra` framework (`ccard_recipe.md` §2.2, §5 row 6), modeled directly +on `BcmpGhostReplays.lean` (`0` `CliElfLib` / `ElfF3Relink` / C2 / trusted imports): + +1. **Row Anchor & `W`-Independent Ghost (`keepR_staticSecretDrop`, `staticSecretDropSubProg`, + `staticSecretDropGhost`):** + - Single-block 63-word (`252` B = `staticSecretDropByteLen`) region `zeroize32Words` anchored + directly at `libsignalSessionLib.resolve mpl lsStaticSecretDropSym`. + - `staticSecretDropGhost mpl mmpl` wraps `ZeroizeGhost.f3EmptyZeroizeGhostHook` + (`P_real := emptyStdProg`, `fallback := zeroizeSecretHook`), with **zero `W : CliHooks` + dependence**. +2. **Artifact 1 — Unconditional `GhostRowSpecOk lsStaticSecretDropSym (staticSecretDropGhost mpl mmpl)` + (`0` premises):** + - `staticSecretDropGhost_rowSpecOk` proves `fs_eq`, `fsT : HookFsTraced IsFsC`, and + `StaticSecretDropRowSpec` (`zeroizeSecretSpec`, plain, `withVmPreserved`, and `withAlloc A lim`) + unconditionally via `StaticSecretDropRowSpec.of_vm`. +3. **Artifact 2a — Generic-`InvS` `GhostRowReplayOn` & `GhostRowOk` (`F1` + `H1` compliant):** + - **F1 (`pc ≠ resolve mpl lsStaticSecretDropSym` exclusion on `P_ghost`, whole-hull on de-hooked + `P_real`):** `hRealHullNoExt` quantifies over `keepR_staticSecretDrop mpl pc = true` on + `P_real` only; `hGhostNoExtNe` strictly excludes + `pc ≠ libsignalSessionLib.resolve mpl lsStaticSecretDropSym` on `P_ghost` and routes through + `ZeroizeLrTrap.f3EmptyStaticSecretDropGhostHook_keepLr_false_after_hook_of_codeLoaded_u`. + - **H1 (`CodeLoaded u.mem` from `InvS u`):** `hCL` supplies + `(staticSecretDropSubProg mpl).CodeLoaded u.mem` at intermediate call state `u` from `InvS u` + (never `s0.mem`), accompanied by `staticSecretDropSubProg_codeLoaded_stripExecOutside_iff`. + - Includes `C4` interior-stub wrapper `staticSecretDropGhost_rowReplayOn_of_interior`, + `K`-narrowed spare `staticSecretDropGhostK_rowReplayOn`, full `staticSecretDropGhost_rowOk`, + and per-arm / singleton entry-guard helpers `extraEntryGuard_staticSecretDrop_arm` / + `extraEntryGuard_singleton_staticSecretDrop` (`.text.lib2` layout instantiation belongs to the + C2 layout / STARTUP seat per `02:28Z` split). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StaticSecretDropGhostReplays + +open Arm64 Arm64.Obj Arm64.Process ProofLib +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession ( + CliHooks cliExternsPlaced libsignalSessionLib + lsBlackBoxSym lsDurationSinceSym lsFromUtf8Sym lsMemrchrSym lsStaticSecretDropSym lsTimeAddSym +) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks IsFsC) +open LibsignalBinary.Proofs.HookDischarge.Generics.ZeroizeDrop (zeroize32Words) +open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer (ExecFrozen) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.StaticSecretDropRowSpec ( + StaticSecretDropRowSpec +) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs ( + ExtraRowSpec GhostRowSpecOk +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay ( + ExtraEntryGuard GhostRowOk GhostRowReplayOn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetCode (pureWordsProg_externAt_none) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhostK (emptyStdProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords (TrapHook) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeCode ( + pureWordsProg_zeroize32_hasWords + subroutine_ok_processZeroize_of_hasWords + hookOk_zeroizeSecret_of_master +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeGhost ( + f3EmptyZeroizeGhostHook f3EmptyZeroizeGhostHookK + f3EmptyZeroizeGhostHook_fs f3EmptyZeroizeGhostHookK_fs + f3EmptyZeroizeGhostHook_fsT + f3EmptyZeroizeGhostHook_preserves_execFrozen f3EmptyZeroizeGhostHookK_preserves_execFrozen + f3EmptyZeroizeGhostHook_master_ok_of_process + f3EmptyZeroizeGhostHook_vmPreserved_of_process + f3EmptyZeroizeGhostHook_visitedIn f3EmptyZeroizeGhostHookK_visitedIn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeLrTrap ( + staticSecretDropByteLen keepStaticSecretDrop keepStaticSecretDrop_iff keepStaticSecretDrop_entry + staticSecretDrop_codeLoaded_stripExecOutside + StaticSecretDropEntryGuard + staticSecretDrop_keepLr_false_after_hook_of_codeLoaded_u + trapHook_f3EmptyZeroizeGhostHook_of_cover_static + f3EmptyStaticSecretDropGhostHook_keepLr_false_after_hook_of_codeLoaded_u +) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric ( + h2fsgen_steps_lift_of_visitedIn_noExtern +) + +/-! ## 1. Row Anchor Definitions, Algebraic Identities & `CodeLoaded` Bridges -/ + +/-- Kept-region byte predicate `[resolve mpl lsStaticSecretDropSym, resolve mpl lsStaticSecretDropSym + 252)` + for `lsStaticSecretDropSym`. -/ +@[expose] def keepR_staticSecretDrop (mpl : Obj.MultiPlacement) : BitVec 64 → Bool := + keepStaticSecretDrop (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) + +/-- `lsStaticSecretDropSym`'s resolved entry address lies inside `keepR_staticSecretDrop mpl`. -/ +theorem keepR_staticSecretDrop_entry (mpl : Obj.MultiPlacement) : + keepR_staticSecretDrop mpl (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) = true := + keepStaticSecretDrop_entry (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) + +/-- Pure 63-word (`252`-byte) sub-program holding `zeroize32Words` at + `libsignalSessionLib.resolve mpl lsStaticSecretDropSym`. -/ +@[expose] def staticSecretDropSubProg (mpl : Obj.MultiPlacement) : Program := + pureWordsProg (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) zeroize32Words + +theorem staticSecretDropSubProg_base (mpl : Obj.MultiPlacement) : + (staticSecretDropSubProg mpl).base = + libsignalSessionLib.resolve mpl lsStaticSecretDropSym := by + dsimp only [staticSecretDropSubProg, pureWordsProg, Program.ofWords] + +theorem staticSecretDropSubProg_svc (mpl : Obj.MultiPlacement) : + (staticSecretDropSubProg mpl).svc = Syscall.standard := rfl + +theorem staticSecretDropSubProg_externAt_none (mpl : Obj.MultiPlacement) (pc : BitVec 64) : + (staticSecretDropSubProg mpl).externAt? pc = none := + pureWordsProg_externAt_none + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) zeroize32Words pc + +theorem staticSecretDropSubProg_hasWords (mpl : Obj.MultiPlacement) : + (staticSecretDropSubProg mpl).hasWords + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) zeroize32Words := + pureWordsProg_zeroize32_hasWords (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) + +private theorem flatMap_wordToBytesLE_length (ws : List (BitVec 32)) : + (ws.flatMap Program.wordToBytesLE).length = 4 * ws.length := by + induction ws with + | nil => rfl + | cons w tl ih => + simp only [List.flatMap_cons, List.length_append, List.length_cons, ih] + have hw : (Program.wordToBytesLE w).length = 4 := rfl + omega + +theorem staticSecretDropSubProg_code_length (mpl : Obj.MultiPlacement) : + (staticSecretDropSubProg mpl).code.length = staticSecretDropByteLen := by + dsimp only [staticSecretDropSubProg, pureWordsProg, Program.ofWords] + rw [flatMap_wordToBytesLE_length] + rfl + +theorem keepR_staticSecretDrop_of_code_offset (mpl : Obj.MultiPlacement) {off : Nat} + (hoff : off < (staticSecretDropSubProg mpl).code.length) : + keepR_staticSecretDrop mpl + ((staticSecretDropSubProg mpl).base + BitVec.ofNat 64 off) = true := by + rw [staticSecretDropSubProg_code_length] at hoff + rw [staticSecretDropSubProg_base] + dsimp only [keepR_staticSecretDrop] + rw [keepStaticSecretDrop_iff] + have hsub : + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym + BitVec.ofNat 64 off) - + libsignalSessionLib.resolve mpl lsStaticSecretDropSym = + BitVec.ofNat 64 off := by bv_omega + have hoff_lt : off < 2 ^ 64 := by + have hb : staticSecretDropByteLen = 252 := rfl + omega + rw [hsub, BitVec.toNat_ofNat, Nat.mod_eq_of_lt hoff_lt] + exact hoff + +/-- Forward `CodeLoaded` projection onto `stripExecOutside (keepR_staticSecretDrop mpl) mem`. -/ +theorem staticSecretDropSubProg_codeLoaded_stripExecOutside + {mpl : Obj.MultiPlacement} {mem : Memory} + (hL : (staticSecretDropSubProg mpl).CodeLoaded mem) : + (staticSecretDropSubProg mpl).CodeLoaded + (stripExecOutside (keepR_staticSecretDrop mpl) mem) := + staticSecretDrop_codeLoaded_stripExecOutside + (fun _ hoff => keepR_staticSecretDrop_of_code_offset mpl hoff) hL + +/-- Reverse `CodeLoaded` projection from `stripExecOutside (keepR_staticSecretDrop mpl) mem` back + to `mem`. -/ +theorem staticSecretDropSubProg_codeLoaded_of_stripExecOutside + {mpl : Obj.MultiPlacement} {mem : Memory} + (hL : (staticSecretDropSubProg mpl).CodeLoaded + (stripExecOutside (keepR_staticSecretDrop mpl) mem)) : + (staticSecretDropSubProg mpl).CodeLoaded mem := by + refine Program.CodeLoaded.intro hL.aligned hL.no_wrap fun i hi => ?_ + have hk : keepR_staticSecretDrop mpl + ((staticSecretDropSubProg mpl).base + BitVec.ofNat 64 i) = true := + keepR_staticSecretDrop_of_code_offset mpl hi + have hbyte := hL.byte_eq i hi + have hperm := hL.perm_eq i hi + have hlf := hL.isLazyFree_eq i hi + rw [ProofLib.strip_read8] at hbyte + rw [ProofLib.strip_perm_of_keep hk] at hperm + rw [ProofLib.strip_isLazyFree] at hlf + exact ⟨hbyte, hperm, hlf⟩ + +theorem staticSecretDropSubProg_codeLoaded_stripExecOutside_iff + {mpl : Obj.MultiPlacement} {mem : Memory} : + (staticSecretDropSubProg mpl).CodeLoaded + (stripExecOutside (keepR_staticSecretDrop mpl) mem) ↔ + (staticSecretDropSubProg mpl).CodeLoaded mem := + ⟨staticSecretDropSubProg_codeLoaded_of_stripExecOutside, + staticSecretDropSubProg_codeLoaded_stripExecOutside⟩ + +/-- `W`-independent ghost hook for `lsStaticSecretDropSym` + (`CliGhostHooks.extra` entry `(lsStaticSecretDropSym, staticSecretDropGhost mpl mmpl)`). -/ +@[expose] noncomputable def staticSecretDropGhost (mpl _mmpl : Obj.MultiPlacement) : + State → State := + f3EmptyZeroizeGhostHook (keepR_staticSecretDrop mpl) (staticSecretDropSubProg mpl) + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) + +/-- `K`-narrowed `W`-independent ghost hook companion for `lsStaticSecretDropSym` + (spare only; N2). -/ +@[expose] noncomputable def staticSecretDropGhostK (mpl _mmpl : Obj.MultiPlacement) : + State → State := + f3EmptyZeroizeGhostHookK (keepR_staticSecretDrop mpl) (staticSecretDropSubProg mpl) + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) + +/-- Block-`617` entry-state `lr` guard for `lsStaticSecretDropSym`: + `keepR_staticSecretDrop mpl (s0.readReg64 .lr) = false ∧ s0.readReg64 .lr ≠ resolve mpl lsStaticSecretDropSym`. -/ +@[expose] def staticSecretDropEntryGuard (mpl : Obj.MultiPlacement) (s0 : State) : Prop := + StaticSecretDropEntryGuard (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) s0 + +theorem staticSecretDropEntryGuard_iff (mpl : Obj.MultiPlacement) (s0 : State) : + staticSecretDropEntryGuard mpl s0 ↔ + keepR_staticSecretDrop mpl (s0.readReg64 .lr) = false ∧ + s0.readReg64 .lr ≠ libsignalSessionLib.resolve mpl lsStaticSecretDropSym := + Iff.rfl + +/-! ## 2. Artifact 1 — Unconditional `GhostRowSpecOk lsStaticSecretDropSym (staticSecretDropGhost mpl mmpl)` -/ + +theorem staticSecretDropGhost_fs (mpl mmpl : Obj.MultiPlacement) (s : State) : + (staticSecretDropGhost mpl mmpl s).fs = s.fs := + f3EmptyZeroizeGhostHook_fs (keepR_staticSecretDrop mpl) (staticSecretDropSubProg mpl) + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) s + +theorem staticSecretDropGhost_fsT (mpl mmpl : Obj.MultiPlacement) : + HookFsTraced IsFsC (staticSecretDropGhost mpl mmpl) := + f3EmptyZeroizeGhostHook_fsT (keepR_staticSecretDrop mpl) (staticSecretDropSubProg mpl) + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) + +theorem staticSecretDropGhost_vmPreserved (mpl mmpl : Obj.MultiPlacement) (s : State) : + LibsignalBinary.Heap.VmPreserved s (staticSecretDropGhost mpl mmpl s) := + f3EmptyZeroizeGhostHook_vmPreserved_of_process + (staticSecretDropSubProg_svc mpl) + (staticSecretDropSubProg_externAt_none mpl) + (subroutine_ok_processZeroize_of_hasWords (staticSecretDropSubProg_externAt_none mpl) + (staticSecretDropSubProg_hasWords mpl)) + s + +/-- Unconditional `StaticSecretDropRowSpec` for `staticSecretDropGhost mpl mmpl` + (`0` layout or memory premises). -/ +theorem staticSecretDropGhost_staticSecretDropRowSpec (mpl mmpl : Obj.MultiPlacement) : + StaticSecretDropRowSpec (staticSecretDropGhost mpl mmpl) := + StaticSecretDropRowSpec.of_vm + (hookOk_zeroizeSecret_of_master + (f3EmptyZeroizeGhostHook_master_ok_of_process + (staticSecretDropSubProg_svc mpl) + (staticSecretDropSubProg_externAt_none mpl) + (subroutine_ok_processZeroize_of_hasWords (staticSecretDropSubProg_externAt_none mpl) + (staticSecretDropSubProg_hasWords mpl)))) + (staticSecretDropGhost_vmPreserved mpl mmpl) + +/-- **Artifact 1 (`C11` §1.2, §6.1):** Unconditional + `GhostRowSpecOk lsStaticSecretDropSym (staticSecretDropGhost mpl mmpl)` for all `(mpl, mmpl)` + (`0` stock-side or layout premises). -/ +theorem staticSecretDropGhost_rowSpecOk [LibsignalPlacement] (mpl mmpl : Obj.MultiPlacement) : + GhostRowSpecOk lsStaticSecretDropSym (staticSecretDropGhost mpl mmpl) where + fs_eq := staticSecretDropGhost_fs mpl mmpl + fsT := staticSecretDropGhost_fsT mpl mmpl + rowSpec := by + have h1 : (lsStaticSecretDropSym == "bcmp") = false := by decide + have h2 : (lsStaticSecretDropSym == "strlen") = false := by decide + have h3 : (lsStaticSecretDropSym == "memmove") = false := by decide + have h4 : (lsStaticSecretDropSym == lsFromUtf8Sym) = false := by decide + have h5 : (lsStaticSecretDropSym == lsMemrchrSym) = false := by decide + have h6 : (lsStaticSecretDropSym == lsDurationSinceSym) = false := by decide + have h7 : (lsStaticSecretDropSym == lsTimeAddSym) = false := by decide + have h8 : (lsStaticSecretDropSym == lsBlackBoxSym) = false := by decide + have h9 : (lsStaticSecretDropSym == lsStaticSecretDropSym) = true := by decide + dsimp only [ExtraRowSpec] + simp only [h1, h2, h3, h4, h5, h6, h7, h8, h9, Bool.false_eq_true, ↓reduceIte] + exact staticSecretDropGhost_staticSecretDropRowSpec mpl mmpl + +/-! ## 3. `ExecFrozen` Preservation & Generic-`InvS` `GhostRowReplayOn` (Artifact 2a) -/ + +theorem staticSecretDropGhost_preserves_execFrozen (mpl mmpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (staticSecretDropGhost mpl mmpl u).mem := + f3EmptyZeroizeGhostHook_preserves_execFrozen (keepR_staticSecretDrop mpl) + (staticSecretDropSubProg mpl) + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) hfr + +theorem staticSecretDropGhostK_preserves_execFrozen (mpl mmpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (staticSecretDropGhostK mpl mmpl u).mem := + f3EmptyZeroizeGhostHookK_preserves_execFrozen (keepR_staticSecretDrop mpl) + (staticSecretDropSubProg mpl) + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) hfr + +private theorem setPC_eq_self_of_pc_eq {u : State} {pc : BitVec 64} (hpc : u.pc = pc) : + u.setPC pc = u := by + cases u + dsimp only [State.setPC] at hpc ⊢ + subst hpc + rfl + +private theorem realProg617_svc (mpl mmpl : Obj.MultiPlacement) (W : CliHooks) : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).svc = Syscall.standard := + rfl + +private theorem emptyStdProg_svc : emptyStdProg.svc = Syscall.standard := + rfl + +private theorem emptyStdProg_externAt (pc : BitVec 64) : + emptyStdProg.externAt? pc = none := + rfl + +/-- **Artifact 2a (`C11` §1.3, §6.2) — Generic-`InvS` `GhostRowReplayOn` for + `lsStaticSecretDropSym`:** + - **F1 compliance:** `hRealHullNoExt` quantifies over `keepR_staticSecretDrop mpl pc = true` + **only** on the de-hooked real program `cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W` + (post-Cutover-2). On the ghost program `cliProgExtPlacedAt mpl EG 617 W`, `hGhostNoExtNe` + strictly excludes `pc ≠ libsignalSessionLib.resolve mpl lsStaticSecretDropSym`. + - **H1 compliance:** `hCL` supplies `(staticSecretDropSubProg mpl).CodeLoaded u.mem` at + intermediate call state `u` from `InvS u` (never `s0.mem`). -/ +theorem staticSecretDropGhost_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (staticSecretDropSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) = + some (staticSecretDropGhost mpl mmpl)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_staticSecretDrop mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_staticSecretDrop mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsStaticSecretDropSym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG lsStaticSecretDropSym + (staticSecretDropEntryGuard mpl) (staticSecretDropGhost mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨staticSecretDropGhost_preserves_execFrozen mpl mmpl hfr, + staticSecretDropGhost_fs mpl mmpl u⟩ + replay_at_stub := by + intro W s0 sf _ _ _ hEntry hRetPc hNoExSf hNotHaltSf + right + refine ⟨hRealHullNoExt W (keepR_staticSecretDrop_entry mpl), ?_⟩ + intro u _ hStepsAfter hpc hrun hnoex hkf hfr hInvU + have hCodeU : (staticSecretDropSubProg mpl).CodeLoaded u.mem := hCL u hInvU + have hLrOut : keepR_staticSecretDrop mpl (u.readReg64 .lr) = false := + f3EmptyStaticSecretDropGhostHook_keepLr_false_after_hook_of_codeLoaded_u + (P_ghost := cliProgExtPlacedAt mpl EG 617 W) + (P_sub := staticSecretDropSubProg mpl) + (keepR := keepR_staticSecretDrop mpl) + (entry := libsignalSessionLib.resolve mpl lsStaticSecretDropSym) + (stubPc := libsignalSessionLib.resolve mpl lsStaticSecretDropSym) + (entryTarget := libsignalSessionLib.resolve mpl lsStaticSecretDropSym) + (staticSecretDropSubProg_hasWords mpl) + (fun _ h => h) + (fun _ hk hne => hGhostNoExtNe W hk hne) + (hGhostAt W) + hEntry.1 + hRetPc + hNoExSf + hNotHaltSf + u + hCodeU + hStepsAfter + hrun + hkf + have hCodeStrip : + (staticSecretDropSubProg mpl).CodeLoaded + (stripExecOutside (keepR_staticSecretDrop mpl) u.mem) := + staticSecretDropSubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨hvis, hfr_fu, hfs_fu⟩ := + f3EmptyZeroizeGhostHook_visitedIn + (keep := keepR_staticSecretDrop mpl) + (P_sub := staticSecretDropSubProg mpl) + (entryTarget := libsignalSessionLib.resolve mpl lsStaticSecretDropSym) + (staticSecretDropSubProg_svc mpl) + (staticSecretDropSubProg_externAt_none mpl) + (staticSecretDropSubProg_hasWords mpl) + hrun + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (libsignalSessionLib.resolve mpl lsStaticSecretDropSym)) + (staticSecretDropGhost mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_staticSecretDrop mpl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hSetPC : u.setPC (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) = u := + setPC_eq_self_of_pc_eq hpc + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (staticSecretDropGhost mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- `C4` interior-stub signature wrapper for `staticSecretDropGhost_rowReplayOn` (accepting split + `hRealNone` at `stubPc` + `hInteriorGhost` with the `Or.inr` `TrapHook` interior-stub disjunct + on `pc ≠ resolve mpl lsStaticSecretDropSym`). -/ +theorem staticSecretDropGhost_rowReplayOn_of_interior + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (staticSecretDropSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) = + some (staticSecretDropGhost mpl mmpl)) + (hRealNone : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) = none) + (hInteriorGhost : ∀ (W : CliHooks) (pc : BitVec 64), + keepR_staticSecretDrop mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsStaticSecretDropSym → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none ∧ + ((cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ gStub, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some gStub ∧ + ∀ L : BitVec 64, keepR_staticSecretDrop mpl L = true → TrapHook L gStub)) : + GhostRowReplayOn mpl mmpl InvS EG lsStaticSecretDropSym + (staticSecretDropEntryGuard mpl) (staticSecretDropGhost mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨staticSecretDropGhost_preserves_execFrozen mpl mmpl hfr, + staticSecretDropGhost_fs mpl mmpl u⟩ + replay_at_stub := by + intro W s0 sf _ _ _ hEntry hRetPc hNoExSf hNotHaltSf + have hRealHullNoExt : ∀ {pc : BitVec 64}, + keepR_staticSecretDrop mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := by + intro pc hk + by_cases hEq : pc = libsignalSessionLib.resolve mpl lsStaticSecretDropSym + · rw [hEq]; exact hRealNone W + · exact (hInteriorGhost W pc hk hEq).1 + have hRegExt : ∀ pc : BitVec 64, + keepStaticSecretDrop (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) pc = true → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ f, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some f ∧ + ∀ L, keepStaticSecretDrop + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) L = true → + TrapHook L f := by + intro pc hk + by_cases hEq : pc = libsignalSessionLib.resolve mpl lsStaticSecretDropSym + · rw [hEq] + exact Or.inr ⟨staticSecretDropGhost mpl mmpl, hGhostAt W, fun L hL => + trapHook_f3EmptyZeroizeGhostHook_of_cover_static (staticSecretDropSubProg mpl) + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) (fun _ h => h) hL⟩ + · rcases (hInteriorGhost W pc hk hEq).2 with hNone | ⟨gStub, hSome, hTrap⟩ + · exact Or.inl hNone + · exact Or.inr ⟨gStub, hSome, hTrap⟩ + right + refine ⟨hRealNone W, ?_⟩ + intro u _ hStepsAfter hpc hrun hnoex hkf hfr hInvU + have hCodeU : (staticSecretDropSubProg mpl).CodeLoaded u.mem := hCL u hInvU + have hLrOut : keepR_staticSecretDrop mpl (u.readReg64 .lr) = false := + staticSecretDrop_keepLr_false_after_hook_of_codeLoaded_u + (P_ghost := cliProgExtPlacedAt mpl EG 617 W) + (P_sub := staticSecretDropSubProg mpl) + (entry := libsignalSessionLib.resolve mpl lsStaticSecretDropSym) + (f_stub := staticSecretDropGhost mpl mmpl) + (staticSecretDropSubProg_hasWords mpl) + hRegExt + (fun _ hL => trapHook_f3EmptyZeroizeGhostHook_of_cover_static + (staticSecretDropSubProg mpl) + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) (fun _ h => h) hL) + hEntry.1 + hRetPc + hNoExSf + hNotHaltSf + u + hCodeU + hStepsAfter + hrun + hkf + have hCodeStrip : + (staticSecretDropSubProg mpl).CodeLoaded + (stripExecOutside (keepR_staticSecretDrop mpl) u.mem) := + staticSecretDropSubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨hvis, hfr_fu, hfs_fu⟩ := + f3EmptyZeroizeGhostHook_visitedIn + (keep := keepR_staticSecretDrop mpl) + (P_sub := staticSecretDropSubProg mpl) + (entryTarget := libsignalSessionLib.resolve mpl lsStaticSecretDropSym) + (staticSecretDropSubProg_svc mpl) + (staticSecretDropSubProg_externAt_none mpl) + (staticSecretDropSubProg_hasWords mpl) + hrun + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (libsignalSessionLib.resolve mpl lsStaticSecretDropSym)) + (staticSecretDropGhost mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_staticSecretDrop mpl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt hk) + hvis + have hSetPC : u.setPC (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) = u := + setPC_eq_self_of_pc_eq hpc + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (staticSecretDropGhost mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- `K`-narrowed `staticSecretDropGhostK` companion `GhostRowReplayOn` + (`entryGuard := fun _ => True`; spare only per N2). -/ +theorem staticSecretDropGhostK_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (staticSecretDropSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_staticSecretDrop mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG lsStaticSecretDropSym + (fun _ => True) (staticSecretDropGhostK mpl mmpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨staticSecretDropGhostK_preserves_execFrozen mpl mmpl hfr, + f3EmptyZeroizeGhostHookK_fs (keepR_staticSecretDrop mpl) (staticSecretDropSubProg mpl) + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) u⟩ + replay_at_stub := by + intro W _ _ _ _ _ _ _ _ _ + right + refine ⟨hRealHullNoExt W (keepR_staticSecretDrop_entry mpl), ?_⟩ + intro u _ _ hpc hrun hnoex hkf hfr hInvU + have hCodeStrip : + (staticSecretDropSubProg mpl).CodeLoaded + (stripExecOutside (keepR_staticSecretDrop mpl) u.mem) := + staticSecretDropSubProg_codeLoaded_stripExecOutside (hCL u hInvU) + obtain ⟨hvis, hfr_fu, hfs_fu⟩ := + f3EmptyZeroizeGhostHookK_visitedIn + (keep := keepR_staticSecretDrop mpl) + (P_sub := staticSecretDropSubProg mpl) + (entryTarget := libsignalSessionLib.resolve mpl lsStaticSecretDropSym) + (staticSecretDropSubProg_svc mpl) + (staticSecretDropSubProg_externAt_none mpl) + (staticSecretDropSubProg_hasWords mpl) + hrun + hnoex + hfr + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (libsignalSessionLib.resolve mpl lsStaticSecretDropSym)) + (staticSecretDropGhostK mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (D := keepR_staticSecretDrop mpl) + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hSetPC : u.setPC (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) = u := + setPC_eq_self_of_pc_eq hpc + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (staticSecretDropGhostK mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- Guard-strengthening adapter on `GhostRowReplayOn`. -/ +theorem ghostRowReplayOn_of_guard_imp + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + {EG : CliHooks → String → Option (State → State)} + {sym : String} {entryGuard guard' : State → Prop} {f : State → State} + (hRow : GhostRowReplayOn mpl mmpl InvS EG sym entryGuard f) + (hImp : ∀ s0 : State, guard' s0 → entryGuard s0) : + GhostRowReplayOn mpl mmpl InvS EG sym guard' f where + preserves_execFrozen := hRow.preserves_execFrozen + replay_at_stub := fun W s0 sf hG hRet hNoEx hNHalt => + hRow.replay_at_stub W s0 sf (hImp s0 hG) hRet hNoEx hNHalt + +/-- Full per-row `GhostRowOk` bundle (`GhostRowSpecOk` ∧ `GhostRowReplayOn`) for + `lsStaticSecretDropSym`. -/ +theorem staticSecretDropGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (staticSecretDropSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? + (libsignalSessionLib.resolve mpl lsStaticSecretDropSym) = + some (staticSecretDropGhost mpl mmpl)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_staticSecretDrop mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_staticSecretDrop mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl lsStaticSecretDropSym → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowOk mpl mmpl InvS EG lsStaticSecretDropSym + (staticSecretDropEntryGuard mpl) (staticSecretDropGhost mpl mmpl) := + ⟨staticSecretDropGhost_rowSpecOk mpl mmpl, + staticSecretDropGhost_rowReplayOn mpl mmpl InvS EG + hCL hInvKeep hGhostAt hRealHullNoExt hGhostNoExtNe⟩ + +/-! ## 4. Per-Arm & Singleton `ExtraEntryGuard` Helpers (`.text.lib2` Interface) -/ + +/-- Per-arm `lsStaticSecretDropSym` discharge for any `guardOf : String → State → Prop` agreeing + with `staticSecretDropEntryGuard mpl` on `lsStaticSecretDropSym`. -/ +theorem extraEntryGuard_staticSecretDrop_arm + {mpl : Obj.MultiPlacement} {guardOf : String → State → Prop} {s0 : State} + (hGuardEq : guardOf lsStaticSecretDropSym s0 ↔ staticSecretDropEntryGuard mpl s0) + (hDropGuard : staticSecretDropEntryGuard mpl s0) : + guardOf lsStaticSecretDropSym s0 := + hGuardEq.mpr hDropGuard + +/-- Table-level `ExtraEntryGuard guardOf g s0` discharge when `g.extra` carries the singleton + `lsStaticSecretDropSym` row `[(lsStaticSecretDropSym, staticSecretDropGhost mpl mmpl)]` (N3). -/ +theorem extraEntryGuard_singleton_staticSecretDrop + {mpl mmpl : Obj.MultiPlacement} {guardOf : String → State → Prop} + {g : CliGhostHooks} {s0 : State} + (hg : g.extra = [(lsStaticSecretDropSym, staticSecretDropGhost mpl mmpl)]) + (hGuardEq : guardOf lsStaticSecretDropSym s0 ↔ staticSecretDropEntryGuard mpl s0) + (hDropGuard : staticSecretDropEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := by + intro sym f _ hLook + rw [hg] at hLook + simp only [List.lookup] at hLook + by_cases hSym : (sym == lsStaticSecretDropSym) = true + · have hEq : sym = lsStaticSecretDropSym := eq_of_beq hSym + subst hEq + exact hGuardEq.mpr hDropGuard + · simp [hSym] at hLook + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StaticSecretDropGhostReplays diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/StrlenGhostReplays.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/StrlenGhostReplays.lean new file mode 100644 index 000000000..f41f30d2f --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/StrlenGhostReplays.lean @@ -0,0 +1,673 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenCode -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhost -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostK -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenLrTrap -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric -- proof-setup: allow-public-import + +/-! +# Card CC-LIBC (`strlen`) — `"strlen"` `CliGhostHooks.extra` SWAR-Padded Specs & `GhostRowReplayOn` (`HooksDehook.StrlenGhostReplays`) + +Cutover-2 `c`-card assembly for the `libc.a` `"strlen"` row (`22` words = `88` B `muslStrlenWords` +directly at `strlenEntry mpl := libsignalSessionLib.resolve mpl "strlen"`), modeled on the `L1-c` +pilot (`HooksDehook.BcmpGhostReplays`): + +1. **`W`-Independent Ghost Hook & SWAR-Padded `HookOk` Suite (`§1`–`§2`):** + - Defines `strlenEntry mpl`, `keepR_strlen mpl := keepStrlenRange (strlenEntry mpl)`, + `strlenSubProg mpl := pureWordsProg (strlenEntry mpl) muslStrlenWords`, and + `strlenGhost mpl _mmpl := f3EmptyStrlenGhostHook (keepR_strlen mpl) (strlenSubProg mpl) + (strlenEntry mpl)` (`W`-free: `P_real := emptyStdProg`, `fallback := strlenHook`). + - Discharges `haddr : (strlenEntry mpl).toNat + strlenByteLen ≤ 2 ^ 64` internally via case-split + against `(strlenSubProg mpl).CodeLoaded.no_wrap`, yielding **unconditional** (`0` layout or + memory premises) `strlenGhost_vmPreserved`, `strlenGhost_fs`, `strlenGhost_fsT`, and all 7 + `withStrlenPadRO` (`= ArgvPad.strlenSpecROSat` under `withVmPreserved` by `rfl`) `HookOk` + arms matching the `CC-ROWSPEC` narrowed `StrlenRowSpec`. +2. **`ExecFrozen` Preservation & Generic-`InvS` `GhostRowReplayOn` (`§3`):** + - Proves `strlenGhost_rowReplayOn` over arbitrary `InvS : State → Prop` (`hCL` at intermediate + call state `u` per `H1`; entry-excluded `pc ≠ strlenEntry mpl` ghost-program premise per `F1`; + derives `haddr` directly from `hCodeU.no_wrap`), plus the `C4` interior-stub variant + `strlenGhost_rowReplayOn_of_interior` and `K`-narrowed spare `strlenGhostK_rowReplayOn`. + +## Scope Disclosures (`REV-PILOT` N1–N3) +- **N1 (post-Cutover-2 only):** `hRealHullNoExt` requires `"strlen"` to be removed from + `cliHookTablePlaced` (`C2ExternTableFacts.realRxNoExtern`, `Lib2LayoutFacts.lean @a230f2671b:317`). +- **N2 (`K` replay spare):** `strlenGhostK_rowReplayOn` is an unguarded `K`-route spare; the + Cutover-2 `ExtraListOk` route uses `strlenGhost` + `strlenEntryGuard`. +- **N3 (singleton vs. multi-row guard):** `ElfStrlenEntryGuard.extraEntryGuard_singleton_strlen` + covers singleton `g.extra`; multi-row `g.extra` uses `extraEntryGuard_strlen_arm` per row. +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays + +open Arm64 Arm64.Obj Arm64.Process ProofLib +open ProofLib.StdStartup (muslStrlenWords) +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession (CliHooks cliExternsPlaced libsignalSessionLib strlenHook) +open CryptoVerification.SignalSession.Cli.MainHops (strlenSpec) +open CryptoVerification.SignalSession.Cli.RunGlue (IsFsC) +open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.Fine (strlenHook_vmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.HookDischarge.Libc.Strlen (withStrlenPadRO) +open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer ( + ActiveRealPre ActiveRealRun ExecFrozen keepFsTrace linkedCallHook +) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay ( + GhostRowOk GhostRowReplayOn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhostK (emptyStdProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenCode ( + hookOk_mainStrlen_padRO_of_master hookOk_strlenSpecRO_padRO_of_master + masterStrlenSpec pureWordsProg_strlen_hasWords +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhost ( + KeepCoversStrlen keepCoversStrlen_keepStrlenRange keepFsTrace_strlenHook_eq + keepFsTrace_strlenHook_master_ok keepStrlenRange strlenByteLen strlenByteLen_eq + strlenGhostHook +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostK ( + f3EmptyStrlenGhostHook f3EmptyStrlenGhostHookK + f3EmptyStrlenGhostHook_eq + f3EmptyStrlenGhostHook_fs f3EmptyStrlenGhostHookK_fs + f3EmptyStrlenGhostHook_fsT f3EmptyStrlenGhostHookK_fsT + f3EmptyStrlenGhostHook_master_ok + f3EmptyStrlenGhostHook_preserves_execFrozen f3EmptyStrlenGhostHookK_preserves_execFrozen + f3EmptyStrlenGhostHook_visitedIn f3EmptyStrlenGhostHookK_visitedIn + f3EmptyStrlenGhostHook_vmPreserved +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenLrTrap ( + StrlenEntryGuard + f3EmptyStrlenGhostHook_keepLr_false_after_hook_of_codeLoaded_u + keepStrlenRange_entry keepStrlenRange_iff + strlen_codeLoaded_stripExecOutside_of_prog + strlen_keepLr_false_after_hook_of_codeLoaded_u + trapHook_f3EmptyStrlenGhostHook_of_cover +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords (TrapHook) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc ( + hookOk_withAlloc_of_withVmPreserved hookOk_withAlloc_withVmPreserved withAlloc +) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO (strlenSpecRO) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs ( + ExtraRowSpec GhostRowSpecOk +) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.StrlenRowSpec (StrlenRowSpec) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric ( + h2fsgen_steps_lift_of_visitedIn_noExtern +) + +/-! ## 1. `"strlen"` Sub-Program, Kept Hull, `CodeLoaded` Strip Equivalence & Entry Guard -/ + +/-- Placed entry address of `"strlen"` in `libsignalSessionLib` (the 22-word `muslStrlenWords` block + starts directly at `strlenEntry mpl`, with zero leading fallthrough prefix). -/ +@[expose] def strlenEntry (mpl : Obj.MultiPlacement) : BitVec 64 := + libsignalSessionLib.resolve mpl "strlen" + +/-- Kept-region byte predicate `[strlenEntry mpl, strlenEntry mpl + 88)` for `"strlen"`. -/ +@[expose] def keepR_strlen (mpl : Obj.MultiPlacement) : BitVec 64 → Bool := + keepStrlenRange (strlenEntry mpl) + +/-- `"strlen"`'s resolved entry address lies inside `keepR_strlen mpl`. -/ +theorem keepR_strlen_entry (mpl : Obj.MultiPlacement) : + keepR_strlen mpl (libsignalSessionLib.resolve mpl "strlen") = true := + keepStrlenRange_entry (strlenEntry mpl) + +theorem keepCoversStrlen_keepR_strlen (mpl : Obj.MultiPlacement) : + KeepCoversStrlen (keepR_strlen mpl) (strlenEntry mpl) := + keepCoversStrlen_keepStrlenRange (strlenEntry mpl) + +/-- Pure 22-word (`88`-byte) sub-program holding `muslStrlenWords` at `strlenEntry mpl`. -/ +@[expose] def strlenSubProg (mpl : Obj.MultiPlacement) : Program := + pureWordsProg (strlenEntry mpl) muslStrlenWords + +theorem strlenSubProg_base (mpl : Obj.MultiPlacement) : + (strlenSubProg mpl).base = strlenEntry mpl := by + dsimp only [strlenSubProg, pureWordsProg, Program.ofWords] + +theorem strlenSubProg_svc (mpl : Obj.MultiPlacement) : + (strlenSubProg mpl).svc = Syscall.standard := by + dsimp only [strlenSubProg, pureWordsProg, Program.ofWords] + +theorem strlenSubProg_externAt_none (mpl : Obj.MultiPlacement) (pc : BitVec 64) : + (strlenSubProg mpl).externAt? pc = none := by + dsimp only [strlenSubProg, pureWordsProg, Program.ofWords] + rfl + +theorem strlenSubProg_hasWords (mpl : Obj.MultiPlacement) : + (strlenSubProg mpl).hasWords (strlenEntry mpl) muslStrlenWords := + pureWordsProg_strlen_hasWords (strlenEntry mpl) + +theorem strlenSubProg_code_length (mpl : Obj.MultiPlacement) : + (strlenSubProg mpl).code.length = strlenByteLen := by + dsimp only [strlenSubProg, pureWordsProg, Program.ofWords] + rfl + +/-- Any `CodeLoaded` witness for `strlenSubProg mpl` immediately implies the 64-bit non-wrap bound + `(strlenEntry mpl).toNat + strlenByteLen ≤ 2 ^ 64`. -/ +theorem strlenEntry_no_wrap_of_codeLoaded {mpl : Obj.MultiPlacement} {mem : Memory} + (hL : (strlenSubProg mpl).CodeLoaded mem) : + (strlenEntry mpl).toNat + strlenByteLen ≤ 2 ^ 64 := by + have h := hL.no_wrap + rwa [strlenSubProg_base, strlenSubProg_code_length] at h + +theorem keepR_strlen_of_code_offset (mpl : Obj.MultiPlacement) {off : Nat} + (hoff : off < (strlenSubProg mpl).code.length) : + keepR_strlen mpl ((strlenSubProg mpl).base + BitVec.ofNat 64 off) = true := by + rw [strlenSubProg_code_length] at hoff + rw [strlenSubProg_base] + dsimp only [keepR_strlen] + rw [keepStrlenRange_iff] + have hsub : (strlenEntry mpl + BitVec.ofNat 64 off) - strlenEntry mpl = + BitVec.ofNat 64 off := by bv_omega + have hoff_lt : off < 2 ^ 64 := by + rw [strlenByteLen_eq] at hoff + omega + rw [hsub, BitVec.toNat_ofNat, Nat.mod_eq_of_lt hoff_lt] + exact hoff + +/-- Forward `CodeLoaded` projection onto `stripExecOutside (keepR_strlen mpl) mem`. -/ +theorem strlenSubProg_codeLoaded_stripExecOutside {mpl : Obj.MultiPlacement} {mem : Memory} + (hL : (strlenSubProg mpl).CodeLoaded mem) : + (strlenSubProg mpl).CodeLoaded (stripExecOutside (keepR_strlen mpl) mem) := + strlen_codeLoaded_stripExecOutside_of_prog (fun _ hoff => keepR_strlen_of_code_offset mpl hoff) hL + +/-- Reverse `CodeLoaded` projection from `stripExecOutside (keepR_strlen mpl) mem` back to `mem` + (bridging `Lib2LayoutFacts.f3CodeInv_rxWords_codeLoaded_strip` `@a230f2671b:203-215` to `H1`'s + `(strlenSubProg mpl).CodeLoaded u.mem`). -/ +theorem strlenSubProg_codeLoaded_of_stripExecOutside {mpl : Obj.MultiPlacement} {mem : Memory} + (hL : (strlenSubProg mpl).CodeLoaded (stripExecOutside (keepR_strlen mpl) mem)) : + (strlenSubProg mpl).CodeLoaded mem := by + refine Program.CodeLoaded.intro hL.aligned hL.no_wrap fun i hi => ?_ + have hk : keepR_strlen mpl ((strlenSubProg mpl).base + BitVec.ofNat 64 i) = true := + keepR_strlen_of_code_offset mpl hi + have hbyte := hL.byte_eq i hi + have hperm := hL.perm_eq i hi + have hlf := hL.isLazyFree_eq i hi + rw [ProofLib.strip_read8] at hbyte + rw [ProofLib.strip_perm_of_keep hk] at hperm + rw [ProofLib.strip_isLazyFree] at hlf + exact ⟨hbyte, hperm, hlf⟩ + +theorem strlenSubProg_codeLoaded_stripExecOutside_iff {mpl : Obj.MultiPlacement} {mem : Memory} : + (strlenSubProg mpl).CodeLoaded (stripExecOutside (keepR_strlen mpl) mem) ↔ + (strlenSubProg mpl).CodeLoaded mem := + ⟨strlenSubProg_codeLoaded_of_stripExecOutside, strlenSubProg_codeLoaded_stripExecOutside⟩ + +/-- `W`-independent ghost hook for `"strlen"` (`CliGhostHooks.extra` entry + `("strlen", strlenGhost mpl mmpl)`). Uses `StrlenGhostK.f3EmptyStrlenGhostHook` + (`P_real := emptyStdProg`, `fallback := strlenHook`), never capturing `W : CliHooks`. -/ +@[expose] noncomputable def strlenGhost (mpl _mmpl : Obj.MultiPlacement) : State → State := + f3EmptyStrlenGhostHook (keepR_strlen mpl) (strlenSubProg mpl) (strlenEntry mpl) + +/-- `K`-narrowed `W`-independent ghost hook companion for `"strlen"`. -/ +@[expose] noncomputable def strlenGhostK (mpl _mmpl : Obj.MultiPlacement) : State → State := + f3EmptyStrlenGhostHookK (keepR_strlen mpl) (strlenSubProg mpl) (strlenEntry mpl) + +/-- Block-`617` entry-state `lr` guard for `"strlen"`: + `keepR_strlen mpl (s0.readReg64 .lr) = false ∧ s0.readReg64 .lr ≠ resolve mpl "strlen"`. -/ +@[expose] def strlenEntryGuard (mpl : Obj.MultiPlacement) (s0 : State) : Prop := + StrlenEntryGuard (strlenEntry mpl) (libsignalSessionLib.resolve mpl "strlen") s0 + +theorem strlenEntryGuard_iff (mpl : Obj.MultiPlacement) (s0 : State) : + strlenEntryGuard mpl s0 ↔ + keepR_strlen mpl (s0.readReg64 .lr) = false ∧ + s0.readReg64 .lr ≠ libsignalSessionLib.resolve mpl "strlen" := + Iff.rfl + +/-! ## 2. Unconditional `VmPreserved`, `fs`/`HookFsTraced` & SWAR-Padded `HookOk` Suite -/ + +private theorem not_activeRealRun_of_not_no_wrap {mpl : Obj.MultiPlacement} + (hn : ¬ ((strlenEntry mpl).toNat + strlenByteLen ≤ 2 ^ 64)) (u : State) : + ¬ ActiveRealRun (keepR_strlen mpl) emptyStdProg (strlenSubProg mpl) (strlenEntry mpl) u := + fun hReal => hn (strlenEntry_no_wrap_of_codeLoaded hReal.2.2.1) + +theorem strlenGhost_fs (mpl mmpl : Obj.MultiPlacement) (s : State) : + (strlenGhost mpl mmpl s).fs = s.fs := + f3EmptyStrlenGhostHook_fs (keepR_strlen mpl) (strlenSubProg mpl) (strlenEntry mpl) s + +theorem strlenGhost_fsT (mpl mmpl : Obj.MultiPlacement) : + HookFsTraced IsFsC (strlenGhost mpl mmpl) := + f3EmptyStrlenGhostHook_fsT (keepR_strlen mpl) (strlenSubProg mpl) (strlenEntry mpl) + +theorem strlenGhostK_fs (mpl mmpl : Obj.MultiPlacement) (s : State) : + (strlenGhostK mpl mmpl s).fs = s.fs := + f3EmptyStrlenGhostHookK_fs (keepR_strlen mpl) (strlenSubProg mpl) (strlenEntry mpl) s + +theorem strlenGhostK_fsT (mpl mmpl : Obj.MultiPlacement) : + HookFsTraced IsFsC (strlenGhostK mpl mmpl) := + f3EmptyStrlenGhostHookK_fsT (keepR_strlen mpl) (strlenSubProg mpl) (strlenEntry mpl) + +/-- Unconditional pointwise `VmPreserved` for `strlenGhost mpl mmpl` (`0` address-wrap premises: + if `(strlenEntry mpl).toNat + 88 > 2 ^ 64`, `ActiveRealRun` is impossible by `CodeLoaded.no_wrap` + and `strlenGhost` falls back to `strlenHook`). -/ +theorem strlenGhost_vmPreserved (mpl mmpl : Obj.MultiPlacement) (s0 : State) : + VmPreserved s0 (strlenGhost mpl mmpl s0) := by + by_cases haddr : (strlenEntry mpl).toNat + strlenByteLen ≤ 2 ^ 64 + · exact f3EmptyStrlenGhostHook_vmPreserved + (strlenSubProg_svc mpl) (strlenSubProg_externAt_none mpl) + (strlenSubProg_hasWords mpl) haddr s0 + · classical + dsimp only [strlenGhost] + rw [f3EmptyStrlenGhostHook_eq] + unfold strlenGhostHook linkedCallHook + split + · have hnReal := not_activeRealRun_of_not_no_wrap haddr s0 + simp only [hnReal, ↓reduceDIte, keepFsTrace_strlenHook_eq] + exact strlenHook_vmPreserved s0 + · exact VmPreserved.refl s0 + +/-- Unconditional `HookOk (strlenGhost mpl mmpl) masterStrlenSpec` (`0` address-wrap premises). -/ +theorem strlenGhost_master_ok (mpl mmpl : Obj.MultiPlacement) : + HookOk (strlenGhost mpl mmpl) masterStrlenSpec := by + by_cases haddr : (strlenEntry mpl).toNat + strlenByteLen ≤ 2 ^ 64 + · exact f3EmptyStrlenGhostHook_master_ok + (strlenSubProg_svc mpl) (strlenSubProg_externAt_none mpl) + (strlenSubProg_hasWords mpl) haddr + · intro x R s0 hrun hpre hsp + classical + have hActPre : ActiveRealPre masterStrlenSpec s0 := ⟨hrun, hsp, x, R, hpre⟩ + have hnReal := not_activeRealRun_of_not_no_wrap haddr s0 + have heq : strlenGhost mpl mmpl s0 = keepFsTrace strlenHook s0 := by + dsimp only [strlenGhost] + rw [f3EmptyStrlenGhostHook_eq] + unfold strlenGhostHook linkedCallHook + simp only [hActPre, hnReal, ↓reduceDIte] + rw [heq] + exact keepFsTrace_strlenHook_master_ok x R s0 hrun hpre hsp + +theorem strlenGhost_mainStrlen_padRO_ok (mpl mmpl : Obj.MultiPlacement) (stk : Nat := 4096) : + HookOk (strlenGhost mpl mmpl) (withStrlenPadRO (strlenSpec stk)) := + hookOk_mainStrlen_padRO_of_master (strlenGhost_master_ok mpl mmpl) stk + +theorem strlenGhost_mainStrlen_padRO_budget_ok (mpl mmpl : Obj.MultiPlacement) (stk : Nat := 4096) : + HookOk (strlenGhost mpl mmpl) (withVmPreserved (withStrlenPadRO (strlenSpec stk))) := + hookOk_withVmPreserved (strlenGhost_mainStrlen_padRO_ok mpl mmpl stk) + (strlenGhost_vmPreserved mpl mmpl) + +theorem strlenGhost_mainStrlen_padRO_withAlloc_ok (mpl mmpl : Obj.MultiPlacement) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat := 4096) : + HookOk (strlenGhost mpl mmpl) (withAlloc A lim (withStrlenPadRO (strlenSpec stk))) := + hookOk_withAlloc_of_withVmPreserved A lim (strlenGhost_mainStrlen_padRO_budget_ok mpl mmpl stk) + +theorem strlenGhost_strlenSpecRO_padRO_ok (mpl mmpl : Obj.MultiPlacement) (stk : Nat := 4096) : + HookOk (strlenGhost mpl mmpl) (withStrlenPadRO (strlenSpecRO stk)) := + hookOk_strlenSpecRO_padRO_of_master (strlenGhost_master_ok mpl mmpl) stk + +/-- `withVmPreserved (withStrlenPadRO (strlenSpecRO stk))` is definitionally (`rfl`) identical to + `ArgvPad.strlenSpecROSat stk`. -/ +theorem strlenGhost_strlenSpecRO_padRO_budget_ok (mpl mmpl : Obj.MultiPlacement) + (stk : Nat := 4096) : + HookOk (strlenGhost mpl mmpl) (withVmPreserved (withStrlenPadRO (strlenSpecRO stk))) := + hookOk_withVmPreserved (strlenGhost_strlenSpecRO_padRO_ok mpl mmpl stk) + (strlenGhost_vmPreserved mpl mmpl) + +theorem strlenGhost_strlenSpecRO_padRO_withAlloc_ok (mpl mmpl : Obj.MultiPlacement) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat := 4096) : + HookOk (strlenGhost mpl mmpl) (withAlloc A lim (withStrlenPadRO (strlenSpecRO stk))) := + hookOk_withAlloc_of_withVmPreserved A lim (strlenGhost_strlenSpecRO_padRO_budget_ok mpl mmpl stk) + +theorem strlenGhost_strlenSpecROSat_withAlloc_ok (mpl mmpl : Obj.MultiPlacement) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat := 4096) : + HookOk (strlenGhost mpl mmpl) + (withAlloc A lim (withVmPreserved (withStrlenPadRO (strlenSpecRO stk)))) := + hookOk_withAlloc_withVmPreserved A lim (strlenGhost_strlenSpecRO_padRO_budget_ok mpl mmpl stk) + +theorem strlenGhost_strlenRowSpec (mpl mmpl : Obj.MultiPlacement) : + StrlenRowSpec (strlenGhost mpl mmpl) := + StrlenRowSpec.of_vm + (fun stk => strlenGhost_mainStrlen_padRO_ok mpl mmpl stk) + (fun stk => strlenGhost_strlenSpecRO_padRO_ok mpl mmpl stk) + (strlenGhost_vmPreserved mpl mmpl) + +theorem strlenGhost_rowSpecOk [LibsignalPlacement] (mpl mmpl : Obj.MultiPlacement) : + GhostRowSpecOk "strlen" (strlenGhost mpl mmpl) where + fs_eq := strlenGhost_fs mpl mmpl + fsT := strlenGhost_fsT mpl mmpl + rowSpec := by + change ExtraRowSpec "strlen" (strlenGhost mpl mmpl) + simpa [ExtraRowSpec] using strlenGhost_strlenRowSpec mpl mmpl + +/-! ## 3. `ExecFrozen` Preservation & Generic-`InvS` `GhostRowReplayOn` (Artifact 2a) -/ + +theorem strlenGhost_preserves_execFrozen (mpl mmpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (strlenGhost mpl mmpl u).mem ∧ (strlenGhost mpl mmpl u).fs = u.fs := + f3EmptyStrlenGhostHook_preserves_execFrozen + (keepR_strlen mpl) (strlenSubProg mpl) (strlenEntry mpl) hfr + +theorem strlenGhostK_preserves_execFrozen (mpl mmpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (strlenGhostK mpl mmpl u).mem ∧ (strlenGhostK mpl mmpl u).fs = u.fs := + f3EmptyStrlenGhostHookK_preserves_execFrozen + (keepR_strlen mpl) (strlenSubProg mpl) (strlenEntry mpl) hfr + +private theorem setPC_eq_self_of_pc_eq {u : State} {pc : BitVec 64} (hpc : u.pc = pc) : + u.setPC pc = u := by + cases u + dsimp only [State.setPC] at hpc ⊢ + subst hpc + rfl + +private theorem realProg617_svc (mpl mmpl : Obj.MultiPlacement) (W : CliHooks) : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).svc = Syscall.standard := + rfl + +private theorem emptyStdProg_svc : emptyStdProg.svc = Syscall.standard := + rfl + +private theorem emptyStdProg_externAt (pc : BitVec 64) : + emptyStdProg.externAt? pc = none := + rfl + +/-- **Artifact 2a (`C11` §1.3, §6.2) — Generic-`InvS` `GhostRowReplayOn` for `"strlen"`:** + - **F1 compliance:** `hRealHullNoExt` quantifies over `keepR_strlen mpl pc = true` **only** on + the de-hooked real program `cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W`. On the + ghost program `cliProgExtPlacedAt mpl EG 617 W`, `hGhostNoExtNe` strictly excludes + `pc ≠ libsignalSessionLib.resolve mpl "strlen"`, matching STARTUP's + `f3Row_ghostProg617_externAt_none_of_ne_entry` (`Lib2LayoutFacts.lean @a230f2671b:368`). + - **H1 compliance:** `hCL` supplies `(strlenSubProg mpl).CodeLoaded u.mem` at the intermediate + call state `u` from `InvS u` (never `s0.mem`), which also automatically discharges + `haddr : (strlenEntry mpl).toNat + strlenByteLen ≤ 2 ^ 64` via `hCodeU.no_wrap`. -/ +theorem strlenGhost_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (strlenSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "strlen") = + some (strlenGhost mpl mmpl)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_strlen mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_strlen mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl "strlen" → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG "strlen" (strlenEntryGuard mpl) (strlenGhost mpl mmpl) where + preserves_execFrozen := fun _ _ _ hfr => strlenGhost_preserves_execFrozen mpl mmpl hfr + replay_at_stub := by + intro W s0 sf _ _ _ hEntry hRetPc hNoExSf hNotHaltSf + right + refine ⟨hRealHullNoExt W (keepR_strlen_entry mpl), ?_⟩ + intro u _ hStepsAfter hpc hrun hnoex hkf hfr hInvU + have hCodeU : (strlenSubProg mpl).CodeLoaded u.mem := hCL u hInvU + have hLrOut : keepR_strlen mpl (u.readReg64 .lr) = false := + f3EmptyStrlenGhostHook_keepLr_false_after_hook_of_codeLoaded_u + (P_ghost := cliProgExtPlacedAt mpl EG 617 W) + (P_sub := strlenSubProg mpl) + (keepR := keepR_strlen mpl) + (entryTarget := strlenEntry mpl) + (strlenSubProg_hasWords mpl) + (keepCoversStrlen_keepR_strlen mpl) + (fun _ hk hne => hGhostNoExtNe W hk hne) + (Or.inr (hGhostAt W)) + hEntry.1 + hRetPc + hNoExSf + hNotHaltSf + u + hCodeU + hStepsAfter + hrun + hkf + have hCodeStrip : + (strlenSubProg mpl).CodeLoaded (stripExecOutside (keepR_strlen mpl) u.mem) := + strlenSubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨hvis, _, hfr_fu, hfs_fu⟩ := + f3EmptyStrlenGhostHook_visitedIn + (keep := keepR_strlen mpl) + (P_sub := strlenSubProg mpl) + (entryTarget := strlenEntry mpl) + (strlenSubProg_svc mpl) + (strlenSubProg_externAt_none mpl) + (strlenSubProg_hasWords mpl) + (strlenEntry_no_wrap_of_codeLoaded hCodeU) + hrun + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (strlenEntry mpl)) + (strlenGhost mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hSetPC : u.setPC (strlenEntry mpl) = u := setPC_eq_self_of_pc_eq hpc + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (strlenGhost mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- `C4` interior-stub signature wrapper for `strlenGhost_rowReplayOn` (accepting split `hRealNone` + at `stubPc` + `hInteriorGhost` with the `Or.inr` `TrapHook` interior-stub disjunct on + `pc ≠ resolve mpl "strlen"`). -/ +theorem strlenGhost_rowReplayOn_of_interior + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (strlenSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "strlen") = + some (strlenGhost mpl mmpl)) + (hRealNone : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl "strlen") = none) + (hInteriorGhost : ∀ (W : CliHooks) (pc : BitVec 64), + keepR_strlen mpl pc = true → pc ≠ libsignalSessionLib.resolve mpl "strlen" → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none ∧ + ((cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ gStub, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some gStub ∧ + ∀ L : BitVec 64, keepR_strlen mpl L = true → TrapHook L gStub)) : + GhostRowReplayOn mpl mmpl InvS EG "strlen" (strlenEntryGuard mpl) (strlenGhost mpl mmpl) where + preserves_execFrozen := fun _ _ _ hfr => strlenGhost_preserves_execFrozen mpl mmpl hfr + replay_at_stub := by + intro W s0 sf _ _ _ hEntry hRetPc hNoExSf hNotHaltSf + have hRealHullNoExt : ∀ {pc : BitVec 64}, + keepR_strlen mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := by + intro pc hk + by_cases hEq : pc = libsignalSessionLib.resolve mpl "strlen" + · rw [hEq]; exact hRealNone W + · exact (hInteriorGhost W pc hk hEq).1 + have hRegExt : ∀ pc : BitVec 64, keepStrlenRange (strlenEntry mpl) pc = true → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ f, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some f ∧ + ∀ L, keepStrlenRange (strlenEntry mpl) L = true → TrapHook L f := by + intro pc hk + by_cases hEq : pc = libsignalSessionLib.resolve mpl "strlen" + · rw [hEq] + exact Or.inr ⟨strlenGhost mpl mmpl, hGhostAt W, fun _ hL => + trapHook_f3EmptyStrlenGhostHook_of_cover (strlenSubProg mpl) + (keepCoversStrlen_keepR_strlen mpl) hL⟩ + · rcases (hInteriorGhost W pc hk hEq).2 with hNone | ⟨gStub, hSome, hTrap⟩ + · exact Or.inl hNone + · exact Or.inr ⟨gStub, hSome, hTrap⟩ + right + refine ⟨hRealNone W, ?_⟩ + intro u _ hStepsAfter hpc hrun hnoex hkf hfr hInvU + have hCodeU : (strlenSubProg mpl).CodeLoaded u.mem := hCL u hInvU + have hLrOut : keepR_strlen mpl (u.readReg64 .lr) = false := + strlen_keepLr_false_after_hook_of_codeLoaded_u + (P_ghost := cliProgExtPlacedAt mpl EG 617 W) + (P_sub := strlenSubProg mpl) + (entryTarget := strlenEntry mpl) + (f_stub := strlenGhost mpl mmpl) + (strlenSubProg_hasWords mpl) + hRegExt + (fun _ hL => trapHook_f3EmptyStrlenGhostHook_of_cover (strlenSubProg mpl) + (keepCoversStrlen_keepR_strlen mpl) hL) + hEntry.1 + hRetPc + hNoExSf + hNotHaltSf + u + hCodeU + hStepsAfter + hrun + hkf + have hCodeStrip : + (strlenSubProg mpl).CodeLoaded (stripExecOutside (keepR_strlen mpl) u.mem) := + strlenSubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨hvis, _, hfr_fu, hfs_fu⟩ := + f3EmptyStrlenGhostHook_visitedIn + (keep := keepR_strlen mpl) + (P_sub := strlenSubProg mpl) + (entryTarget := strlenEntry mpl) + (strlenSubProg_svc mpl) + (strlenSubProg_externAt_none mpl) + (strlenSubProg_hasWords mpl) + (strlenEntry_no_wrap_of_codeLoaded hCodeU) + hrun + hnoex + hfr + hLrOut + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (strlenEntry mpl)) + (strlenGhost mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt hk) + hvis + have hSetPC : u.setPC (strlenEntry mpl) = u := setPC_eq_self_of_pc_eq hpc + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (strlenGhost mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- `K`-narrowed `strlenGhostK` companion `GhostRowReplayOn` (requires **zero** entry `lr` guard: + `entryGuard := fun _ => True`, since `strlenGhostK` transitions to `.Exception` if + `lr ∈ keepR_strlen mpl`). -/ +theorem strlenGhostK_rowReplayOn + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (strlenSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_strlen mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl InvS EG "strlen" (fun _ => True) (strlenGhostK mpl mmpl) where + preserves_execFrozen := fun _ _ _ hfr => strlenGhostK_preserves_execFrozen mpl mmpl hfr + replay_at_stub := by + intro W _ _ _ _ _ _ _ _ _ + right + refine ⟨hRealHullNoExt W (keepR_strlen_entry mpl), ?_⟩ + intro u _ _ hpc hrun hnoex hkf hfr hInvU + have hCodeU : (strlenSubProg mpl).CodeLoaded u.mem := hCL u hInvU + have hCodeStrip : + (strlenSubProg mpl).CodeLoaded (stripExecOutside (keepR_strlen mpl) u.mem) := + strlenSubProg_codeLoaded_stripExecOutside hCodeU + obtain ⟨hvis, _, hfr_fu, hfs_fu⟩ := + f3EmptyStrlenGhostHookK_visitedIn + (keep := keepR_strlen mpl) + (P_sub := strlenSubProg mpl) + (entryTarget := strlenEntry mpl) + (strlenSubProg_svc mpl) + (strlenSubProg_externAt_none mpl) + (strlenSubProg_hasWords mpl) + (strlenEntry_no_wrap_of_codeLoaded hCodeU) + hrun + hnoex + hfr + hCodeStrip + have hStepsSetPC : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (u.setPC (strlenEntry mpl)) + (strlenGhostK mpl mmpl u) := + h2fsgen_steps_lift_of_visitedIn_noExtern + (P1 := emptyStdProg) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (emptyStdProg_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => emptyStdProg_externAt pc) + (fun _ hk => hRealHullNoExt W hk) + hvis + have hSetPC : u.setPC (strlenEntry mpl) = u := setPC_eq_self_of_pc_eq hpc + rw [hSetPC] at hStepsSetPC + exact ⟨hStepsSetPC, hfr_fu, hInvKeep u (strlenGhostK mpl mmpl u) hInvU hkf hfs_fu⟩ + +/-- Combined `GhostRowOk` (`GhostRowSpecOk` + `GhostRowReplayOn`) for `"strlen"`. -/ +theorem strlenGhost_rowOk [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (strlenSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "strlen") = + some (strlenGhost mpl mmpl)) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_strlen mpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_strlen mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl "strlen" → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowOk mpl mmpl InvS EG "strlen" (strlenEntryGuard mpl) (strlenGhost mpl mmpl) := + ⟨strlenGhost_rowSpecOk mpl mmpl, + strlenGhost_rowReplayOn mpl mmpl InvS EG hCL hInvKeep hGhostAt hRealHullNoExt hGhostNoExtNe⟩ + +/-- Combined `GhostRowOk` (`C4` interior-stub variant) for `"strlen"`. -/ +theorem strlenGhost_rowOk_of_interior [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hCL : ∀ u : State, InvS u → (strlenSubProg mpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "strlen") = + some (strlenGhost mpl mmpl)) + (hRealNone : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl "strlen") = none) + (hInteriorGhost : ∀ (W : CliHooks) (pc : BitVec 64), + keepR_strlen mpl pc = true → pc ≠ libsignalSessionLib.resolve mpl "strlen" → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none ∧ + ((cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none ∨ + ∃ gStub, (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = some gStub ∧ + ∀ L : BitVec 64, keepR_strlen mpl L = true → TrapHook L gStub)) : + GhostRowOk mpl mmpl InvS EG "strlen" (strlenEntryGuard mpl) (strlenGhost mpl mmpl) := + ⟨strlenGhost_rowSpecOk mpl mmpl, + strlenGhost_rowReplayOn_of_interior mpl mmpl InvS EG hCL hInvKeep hGhostAt hRealNone + hInteriorGhost⟩ + +/-- Guard-strengthening adapter on `GhostRowReplayOn` (for `ExtraListReplaysOn` when `guardOf sym` + implies `entryGuard`). -/ +theorem ghostRowReplayOn_of_guard_imp + {mpl mmpl : Obj.MultiPlacement} {InvS : State → Prop} + {EG : CliHooks → String → Option (State → State)} + {sym : String} {entryGuard guard' : State → Prop} {f : State → State} + (hRow : GhostRowReplayOn mpl mmpl InvS EG sym entryGuard f) + (hImp : ∀ s0 : State, guard' s0 → entryGuard s0) : + GhostRowReplayOn mpl mmpl InvS EG sym guard' f where + preserves_execFrozen := hRow.preserves_execFrozen + replay_at_stub := fun W s0 sf hG hRet hNoEx hNHalt => + hRow.replay_at_stub W s0 sf (hImp s0 hG) hRet hNoEx hNHalt + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/TimeAddGhostReplays.lean b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/TimeAddGhostReplays.lean new file mode 100644 index 000000000..4ba0bc4c4 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/HooksDehook/TimeAddGhostReplays.lean @@ -0,0 +1,537 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Heap.Fine.SpecBudgetHelpersFine -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddPanicGhost -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddPanicGhostK -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import + +/-! +# Card `CC-R0` (Row 3) — `time add` Route-`R0` + `K4` `GhostRowReplayOn` (`HooksDehook.TimeAddGhostReplays`) + +Cutover-2 `c`-card for `lsTimeAddSym` (`>::add`) on the +Route-`R0` (`WithLsRet.withLsRet` / `LsRetAddr624`) + `K4` panic-extern strip `.text.lib2` track: + +1. **Row Anchor & `W`-Independent Ghost (`keepR_timeAdd`, `timeAddSubProg`, `timeAddGhost`):** + - `timeAddPanicExterns` maps `rustTimeExpectFailedSym` (`core::option::expect_failed`) to + `some Rust.panicked` and every other symbol to `none`. + - `timeAddSubProg timeMpl := timeAddBlk2Prog timeMpl timeAddPanicExterns` (`24` words = `96` B + at `timeMpl.base 2`, with `timeMultiLib.fnAddr timeMpl timeAddSym = timeMpl.base 2`). + - `timeAddGhost timeMpl` wraps `TimeAddPanicGhostK.timeAddGhostHookExternOnlyLsRet` + (`externOnlyStdProg`, `fallback := CryptoVerification.E2E.timeAddHook`), so it has **zero + `W : CliHooks` dependence**. +2. **State Preservation & `withLsRet` Consumer `HookOk` Arms:** + - Unconditional (`0` layout premises) `timeAddGhost_fs`, `timeAddGhost_fsT`, and + `timeAddGhost_preserves_execFrozen`. + - Under `hpl : timeMultiLib.Placeable timeMpl`, + `hkeep_stub : keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) = false`, and + `hlr_ne_stub : ∀ lr, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl`, + `timeAddGhost_vmPreserved` and `withLsRet` consumer `HookOk` arms matching `TimeAddRowSpec` + (`LibsignalPublicApi.timeAddSpec`, `withVmPreserved` / `timeAddBudgetSpec`, `withAlloc`, and + `E2E.HooksE.timeAddSpec`). +3. **Generic-`InvS` `GhostRowReplayOn` (`entryGuard := fun _ => True`, `F1` + `H1` compliant):** + - `hCL` extracts `(timeAddSubProg timeMpl).CodeLoaded u.mem` at each intermediate call state `u` + from `InvS u` (**H1**; never `s0.mem`). + - `hRealHullNoExt` requires `externAt? pc = none` on `keepR_timeAdd timeMpl pc = true` **only** + on the de-hooked real program `cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W`, and + `hPanReal` witnesses `externAt? (timeAddExpectFailedStubPc timeMpl) = some Rust.panicked` on + `P_real` (**F1**; zero `P_ghost` hull premise). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddGhostReplays + +open Arm64 Arm64.Obj Arm64.Process ProofLib +open VerifiedLibraries.RustStd (rustTimeExpectFailedSym timeAddSym timeMultiLib) +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession + (CliHooks cliExternsPlaced libsignalSessionLib + lsDurationSinceSym lsFromUtf8Sym lsMemrchrSym lsTimeAddSym) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks IsFsC) +open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.Fine (timeAddHook_vmPreserved) +open LibsignalBinary.Heap.SpecBudget (timeAddBudgetSpec withVmPreserved) +open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (LsRetAddr624) +open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer + (ExecFrozen linkedCallHook) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.Ghost617Transfer (StubReachesTargetOn) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + (ExtraEntryGuard GhostRowOk GhostRowReplayOn) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddPanicGhost + (codeLoaded_stripExecOutside_timeAddBlk2 keepCoversTimeAddBlk2_keepTimeAddBlk2 + keepTimeAddBlk2 timeAddBlk2Prog timeAddBlk2Prog_base timeAddBlk2Prog_code_length + timeAddEntryAddr_eq_base2 timeAddExpectFailedStubPc) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddPanicGhostK + (timeAddGhostHookExternOnly_eq timeAddGhostHookExternOnly_fs timeAddGhostHookExternOnly_fsT + timeAddGhostHookExternOnly_vmPreserved timeAddGhostHookExternOnlyLsRet + timeAddGhostHookExternOnlyLsRet_e2eTimeAddSpec_ok + timeAddGhostHookExternOnlyLsRet_replaysOn + timeAddGhostHookExternOnlyLsRet_timeAddBudgetSpec_ok + timeAddGhostHookExternOnlyLsRet_timeAddSpec_ok + timeAddGhostHookExternOnlyLsRet_timeAddSpec_withAlloc_ok) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc + (hookOk_withAlloc_of_withVmPreserved withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraRowSpec GhostRowSpecOk) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.TimeAddRowSpec + (TimeAddRowSpec) + +/-! ## 1. Row Anchor Definitions & `CodeLoaded` `stripExecOutside` Equivalence -/ + +/-- Closed `W`-independent panic-extern map for `timeMultiLib` block `2` (`SystemTime::add`): + maps `rustTimeExpectFailedSym` (`core::option::expect_failed`) to `some Rust.panicked`. -/ +@[expose] def timeAddPanicExterns (sym : String) : Option (State → State) := + if sym == rustTimeExpectFailedSym then some Rust.panicked else none + +theorem timeAddPanicExterns_expectFailed : + timeAddPanicExterns rustTimeExpectFailedSym = some Rust.panicked := by + simp [timeAddPanicExterns] + +/-- Kept-region byte predicate `[timeMpl.base 2, timeMpl.base 2 + 96)` retaining the `24`-word + (`96`-byte) `SystemTime::add` `.text.lib2` block. -/ +@[expose] def keepR_timeAdd (timeMpl : Obj.MultiPlacement) (pc : BitVec 64) : Bool := + keepTimeAddBlk2 timeMpl pc + +theorem keepR_timeAdd_entry (timeMpl : Obj.MultiPlacement) : + keepR_timeAdd timeMpl (timeMultiLib.fnAddr timeMpl timeAddSym) = true := by + rw [timeAddEntryAddr_eq_base2] + simpa [keepR_timeAdd] using keepCoversTimeAddBlk2_keepTimeAddBlk2 timeMpl 0 (by decide) + +/-- `24`-word (`96`-byte) `timeMultiLib` block-`2` sub-program paired with `timeAddPanicExterns`. -/ +@[expose] def timeAddSubProg (timeMpl : Obj.MultiPlacement) : Program := + timeAddBlk2Prog timeMpl timeAddPanicExterns + +theorem timeAddSubProg_base (timeMpl : Obj.MultiPlacement) : + (timeAddSubProg timeMpl).base = timeMpl.base 2 := + timeAddBlk2Prog_base timeMpl timeAddPanicExterns + +theorem timeAddSubProg_code_length (timeMpl : Obj.MultiPlacement) : + (timeAddSubProg timeMpl).code.length = 96 := + timeAddBlk2Prog_code_length timeMpl timeAddPanicExterns + +theorem timeAddSubProg_codeLoaded_stripExecOutside {timeMpl : Obj.MultiPlacement} {mem : Memory} + (hL : (timeAddSubProg timeMpl).CodeLoaded mem) : + (timeAddSubProg timeMpl).CodeLoaded (stripExecOutside (keepR_timeAdd timeMpl) mem) := + codeLoaded_stripExecOutside_timeAddBlk2 (keepCoversTimeAddBlk2_keepTimeAddBlk2 timeMpl) hL + +theorem timeAddSubProg_codeLoaded_of_stripExecOutside {timeMpl : Obj.MultiPlacement} {mem : Memory} + (hL : (timeAddSubProg timeMpl).CodeLoaded (stripExecOutside (keepR_timeAdd timeMpl) mem)) : + (timeAddSubProg timeMpl).CodeLoaded mem := by + refine Program.CodeLoaded.intro hL.aligned hL.no_wrap fun i hi => ?_ + have hi96 : i < 96 := by + rw [timeAddSubProg_code_length] at hi + exact hi + have hk : keepR_timeAdd timeMpl ((timeAddSubProg timeMpl).base + BitVec.ofNat 64 i) = true := by + rw [timeAddSubProg_base] + exact keepCoversTimeAddBlk2_keepTimeAddBlk2 timeMpl i hi96 + have hbyte := hL.byte_eq i hi + have hperm := hL.perm_eq i hi + have hlf := hL.isLazyFree_eq i hi + rw [ProofLib.strip_read8] at hbyte + rw [ProofLib.strip_perm_of_keep hk] at hperm + rw [ProofLib.strip_isLazyFree] at hlf + exact ⟨hbyte, hperm, hlf⟩ + +theorem timeAddSubProg_codeLoaded_stripExecOutside_iff {timeMpl : Obj.MultiPlacement} + {mem : Memory} : + (timeAddSubProg timeMpl).CodeLoaded (stripExecOutside (keepR_timeAdd timeMpl) mem) ↔ + (timeAddSubProg timeMpl).CodeLoaded mem := + ⟨timeAddSubProg_codeLoaded_of_stripExecOutside, timeAddSubProg_codeLoaded_stripExecOutside⟩ + +/-- Route-`R0` + `K4` (`withLsRet` + `externOnlyStdProg`) `W`-independent ghost hook for + `lsTimeAddSym`. -/ +@[expose] noncomputable def timeAddGhost [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) : State → State := + timeAddGhostHookExternOnlyLsRet (keepR_timeAdd timeMpl) timeMpl timeAddPanicExterns + +/-- Block-`617` entry-state guard for Route-`R0` `lsTimeAddSym` (`True`: `LsRetAddr624` is + extracted directly from non-`.Exception` at each call step). -/ +@[expose] def timeAddEntryGuard (_mpl : Obj.MultiPlacement) (_s0 : State) : Prop := + True + +/-! ## 2. State Preservation & `withLsRet` Consumer `HookOk` Arms -/ + +theorem timeAddGhost_fs [LibsignalPlacement] (timeMpl : Obj.MultiPlacement) (s : State) : + (timeAddGhost timeMpl s).fs = s.fs := + timeAddGhostHookExternOnly_fs LsRetAddr624 (keepR_timeAdd timeMpl) timeMpl timeAddPanicExterns s + +theorem timeAddGhost_fsT [LibsignalPlacement] (timeMpl : Obj.MultiPlacement) : + HookFsTraced IsFsC (timeAddGhost timeMpl) := + timeAddGhostHookExternOnly_fsT LsRetAddr624 (keepR_timeAdd timeMpl) timeMpl timeAddPanicExterns + +theorem timeAddGhost_vmPreserved [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hkeep_stub : keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) = false) + (hlr_ne_stub : ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl) + (s : State) : + VmPreserved s (timeAddGhost timeMpl s) := + timeAddGhostHookExternOnly_vmPreserved hpl hkeep_stub timeAddPanicExterns_expectFailed + hlr_ne_stub s + +theorem timeAddGhost_timeAddSpec_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hkeep_stub : keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) = false) + (hlr_ne_stub : ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl) : + HookOk (timeAddGhost timeMpl) + (withLsRet CryptoVerification.LibsignalPublicApi.timeAddSpec) := + timeAddGhostHookExternOnlyLsRet_timeAddSpec_ok hpl hkeep_stub + timeAddPanicExterns_expectFailed hlr_ne_stub + +theorem timeAddGhost_timeAddSpec_withVmPreserved_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hkeep_stub : keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) = false) + (hlr_ne_stub : ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl) : + HookOk (timeAddGhost timeMpl) + (withVmPreserved (withLsRet CryptoVerification.LibsignalPublicApi.timeAddSpec)) := + hookOk_withVmPreserved + (timeAddGhost_timeAddSpec_ok timeMpl hpl hkeep_stub hlr_ne_stub) + (timeAddGhost_vmPreserved timeMpl hpl hkeep_stub hlr_ne_stub) + +theorem timeAddGhost_timeAddSpec_withAlloc_ls_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hkeep_stub : keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) = false) + (hlr_ne_stub : ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) : + HookOk (timeAddGhost timeMpl) + (withAlloc A lim (withLsRet CryptoVerification.LibsignalPublicApi.timeAddSpec)) := + hookOk_withAlloc_of_withVmPreserved A lim + (timeAddGhost_timeAddSpec_withVmPreserved_ok timeMpl hpl hkeep_stub hlr_ne_stub) + +theorem timeAddGhost_timeAddBudgetSpec_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hkeep_stub : keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) = false) + (hlr_ne_stub : ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl) : + HookOk (timeAddGhost timeMpl) (withLsRet timeAddBudgetSpec) := + timeAddGhostHookExternOnlyLsRet_timeAddBudgetSpec_ok hpl hkeep_stub + timeAddPanicExterns_expectFailed hlr_ne_stub + +theorem timeAddGhost_timeAddSpec_withAlloc_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hkeep_stub : keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) = false) + (hlr_ne_stub : ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) : + HookOk (timeAddGhost timeMpl) + (withLsRet (withAlloc A lim CryptoVerification.LibsignalPublicApi.timeAddSpec)) := + timeAddGhostHookExternOnlyLsRet_timeAddSpec_withAlloc_ok hpl hkeep_stub + timeAddPanicExterns_expectFailed hlr_ne_stub A lim + +theorem timeAddGhost_e2eTimeAddSpec_ok [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hkeep_stub : keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) = false) + (hlr_ne_stub : ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl) : + HookOk (timeAddGhost timeMpl) (withLsRet CryptoVerification.E2E.HooksE.timeAddSpec) := + timeAddGhostHookExternOnlyLsRet_e2eTimeAddSpec_ok hpl hkeep_stub + timeAddPanicExterns_expectFailed hlr_ne_stub + +/-! ## 3. `ExecFrozen` Preservation & Generic-`InvS` `GhostRowReplayOn` -/ + +private theorem linkedCallHook_preserves_execFrozen {α : Type} + {keep : BitVec 64 → Bool} {P_real P_sub : Program} + {entryTarget : BitVec 64} {spec : Spec α} {fallback : State → State} + (hfb : ∀ s : State, ExecFrozen s.mem → ExecFrozen (fallback s).mem) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (linkedCallHook keep P_real P_sub entryTarget spec fallback u).mem := by + classical + unfold linkedCallHook + split + · split + · rename_i hReal + exact (Classical.choose_spec hReal.2.2.2).2.2.2.2 + · change ExecFrozen (fallback u).mem + exact hfb u hfr + · exact hfr + +theorem timeAddGhost_preserves_execFrozen [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + {u : State} (hfr : ExecFrozen u.mem) : + ExecFrozen (timeAddGhost timeMpl u).mem := by + unfold timeAddGhost timeAddGhostHookExternOnlyLsRet + rw [timeAddGhostHookExternOnly_eq] + exact linkedCallHook_preserves_execFrozen + (fun s hs => ExecFrozen.of_perm_eq hs (timeAddHook_vmPreserved s).perm_eq) hfr + +private theorem setPC_eq_self_of_pc_eq {u : State} {pc : BitVec 64} (hpc : u.pc = pc) : + u.setPC pc = u := by + cases u + dsimp only [State.setPC] at hpc ⊢ + subst hpc + rfl + +private theorem realProg617_svc (mpl mmpl : Obj.MultiPlacement) (W : CliHooks) : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).svc = Syscall.standard := + rfl + +/-- Behind-stub (`StubReachesTargetOn`) `GhostRowReplayOn` for `lsTimeAddSym` (`entryGuard := + fun _ => True`, `F1` + `H1` compliant). -/ +theorem timeAddGhost_rowReplayOn_of_stub [LibsignalPlacement] + (mpl mmpl timeMpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hpl : timeMultiLib.Placeable timeMpl) + (hCL : ∀ u : State, InvS u → (timeAddSubProg timeMpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hKeep : ∀ lr : BitVec 64, LsRetAddr624 lr → keepR_timeAdd timeMpl lr = false) + (hlr_ne_stub : ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_timeAdd timeMpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hPanReal : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (timeAddExpectFailedStubPc timeMpl) = some Rust.panicked) + (hRealStubNone : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl lsTimeAddSym) = none) + (hStub : ∀ W : CliHooks, + StubReachesTargetOn + (fun m => (timeAddSubProg timeMpl).CodeLoaded m) + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (libsignalSessionLib.resolve mpl lsTimeAddSym) + (timeMultiLib.fnAddr timeMpl timeAddSym)) : + GhostRowReplayOn mpl mmpl InvS EG lsTimeAddSym (fun _ => True) + (timeAddGhost timeMpl) where + preserves_execFrozen := fun u _ _ hfr => + ⟨timeAddGhost_preserves_execFrozen timeMpl hfr, + timeAddGhost_fs timeMpl u⟩ + replay_at_stub := by + intro W _ _ _ _ _ _ _ _ _ + right + have hRep := + timeAddGhostHookExternOnlyLsRet_replaysOn + (InvMem := fun m => (timeAddSubProg timeMpl).CodeLoaded m) + (keep := keepR_timeAdd timeMpl) + (P_real := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (stubPc := libsignalSessionLib.resolve mpl lsTimeAddSym) + (timeMpl := timeMpl) + (externs := timeAddPanicExterns) + hpl + (realProg617_svc mpl mmpl W) + (fun _ hk => hRealHullNoExt W hk) + timeAddPanicExterns_expectFailed + (hPanReal W) + hKeep + hlr_ne_stub + (hRealStubNone W) + (hStub W) + (fun _ _ hInvM => timeAddSubProg_codeLoaded_stripExecOutside hInvM) + (fun _ _ hInvM hkf => hInvM.of_keepsFrozen hkf) + refine ⟨hRep.1, ?_⟩ + intro u _ _ hpc hrun hnoex hkf hfr hInvU + obtain ⟨hSteps, hfr_fu, _, hfs_fu⟩ := hRep.2 u hpc hrun hnoex hfr (hCL u hInvU) + exact ⟨hSteps, hfr_fu, hInvKeep u (timeAddGhost timeMpl u) hInvU hkf hfs_fu⟩ + +/-- **Artifact 2a (`CC-R0`, Row 3) — Direct `.text.lib2` `GhostRowReplayOn` for `lsTimeAddSym`:** + Route `R0` + `K4` (`entryGuard := fun _ => True`), discharging `hRealStubNone` and `hStub` + directly from `hTargetEq : libsignalSessionLib.resolve mpl lsTimeAddSym = + timeMultiLib.fnAddr timeMpl timeAddSym` (`F1` + `H1` compliant). -/ +theorem timeAddGhost_rowReplayOn [LibsignalPlacement] + (mpl mmpl timeMpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hpl : timeMultiLib.Placeable timeMpl) + (hTargetEq : libsignalSessionLib.resolve mpl lsTimeAddSym = + timeMultiLib.fnAddr timeMpl timeAddSym) + (hCL : ∀ u : State, InvS u → (timeAddSubProg timeMpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hKeep : ∀ lr : BitVec 64, LsRetAddr624 lr → keepR_timeAdd timeMpl lr = false) + (hlr_ne_stub : ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_timeAdd timeMpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hPanReal : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (timeAddExpectFailedStubPc timeMpl) = some Rust.panicked) : + GhostRowReplayOn mpl mmpl InvS EG lsTimeAddSym (fun _ => True) + (timeAddGhost timeMpl) := + timeAddGhost_rowReplayOn_of_stub mpl mmpl timeMpl InvS EG hpl hCL hInvKeep hKeep + hlr_ne_stub hRealHullNoExt hPanReal + (fun W => by rw [hTargetEq]; exact hRealHullNoExt W (keepR_timeAdd_entry timeMpl)) + (fun _ u hpc _ _ _ => by + rw [setPC_eq_self_of_pc_eq (hpc.trans hTargetEq)] + exact Steps.refl _) + +/-! ## 4. `TimeAddRowSpec`, `GhostRowSpecOk`, `GhostRowOk` & `ExtraEntryGuard` Helpers -/ + +/-- `TimeAddRowSpec` (`withLsRet` outermost) for `timeAddGhost timeMpl`. -/ +theorem timeAddGhost_timeAddRowSpec [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hkeep_stub : keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) = false) + (hlr_ne_stub : ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl) : + TimeAddRowSpec (timeAddGhost timeMpl) := + TimeAddRowSpec.of_ls_vm + (timeAddGhost_timeAddSpec_ok timeMpl hpl hkeep_stub hlr_ne_stub) + (timeAddGhost_vmPreserved timeMpl hpl hkeep_stub hlr_ne_stub) + +/-- **Artifact 1 (`CC-R0`, Row 3):** `GhostRowSpecOk lsTimeAddSym (timeAddGhost timeMpl)` under + `timeMultiLib.Placeable timeMpl`, `keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) = + false`, and `∀ lr, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl`. -/ +theorem timeAddGhost_rowSpecOk [LibsignalPlacement] + (timeMpl : Obj.MultiPlacement) + (hpl : timeMultiLib.Placeable timeMpl) + (hkeep_stub : keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) = false) + (hlr_ne_stub : ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl) : + GhostRowSpecOk lsTimeAddSym (timeAddGhost timeMpl) where + fs_eq := timeAddGhost_fs timeMpl + fsT := timeAddGhost_fsT timeMpl + rowSpec := by + unfold ExtraRowSpec + have hd1 : (lsTimeAddSym == "bcmp") = false := by decide + have hd2 : (lsTimeAddSym == "strlen") = false := by decide + have hd3 : (lsTimeAddSym == "memmove") = false := by decide + have hd4 : (lsTimeAddSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsTimeAddSym == lsMemrchrSym) = false := by decide + have hd6 : (lsTimeAddSym == lsDurationSinceSym) = false := by decide + have hd7 : (lsTimeAddSym == lsTimeAddSym) = true := by decide + simp only [hd1, hd2, hd3, hd4, hd5, hd6, hd7, Bool.false_eq_true, ↓reduceIte] + exact timeAddGhost_timeAddRowSpec timeMpl hpl hkeep_stub hlr_ne_stub + +private noncomputable def dummyCliHooks : CliHooks := by + classical + exact { + C := { + F := fun s _ => s + E := fun _ b => b + D := fun _ b => b + X := fun k _ => k + pubKey := fun k => k + } + Q := { + F512 := fun s _ => s + montToEd := fun _ _ => none + compress := fun _ => List.Vector.replicate 32 0#8 + edNeg := fun p => p + isTorsionFree := fun _ => false + dsmb := fun _ p _ => p + scalarMod := fun s => s + scalarWide := fun _ => List.Vector.replicate 32 0#8 + encaps := fun pk c => (pk, c) + decaps := fun _ _ => List.Vector.replicate 32 0#8 + K := { + keyPair := fun _ => List.Vector.replicate 2400 0#8 + encaps1 := fun _ _ => none + encaps2 := fun _ _ => List.Vector.replicate 128 0#8 + decaps := fun _ _ _ => List.Vector.replicate 32 0#8 + validPk := fun _ _ => false + } + } + } + +private theorem keepR_timeAdd_expectFailed_false + {mpl mmpl timeMpl : Obj.MultiPlacement} + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_timeAdd timeMpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hPanReal : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (timeAddExpectFailedStubPc timeMpl) = some Rust.panicked) : + keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) = false := by + cases hk : keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) + · rfl + · have hnone := hRealHullNoExt dummyCliHooks hk + rw [hPanReal dummyCliHooks] at hnone + cases hnone + +/-- Behind-stub `GhostRowOk` bundle (`GhostRowSpecOk` ∧ `GhostRowReplayOn`) for `lsTimeAddSym`, + deriving `keepR_timeAdd timeMpl (timeAddExpectFailedStubPc timeMpl) = false` from + `hRealHullNoExt` + `hPanReal` (`TimeAddPanicGhostK.lean:539`). -/ +theorem timeAddGhost_rowOk_of_stub [LibsignalPlacement] + (mpl mmpl timeMpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hpl : timeMultiLib.Placeable timeMpl) + (hCL : ∀ u : State, InvS u → (timeAddSubProg timeMpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hKeep : ∀ lr : BitVec 64, LsRetAddr624 lr → keepR_timeAdd timeMpl lr = false) + (hlr_ne_stub : ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_timeAdd timeMpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hPanReal : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (timeAddExpectFailedStubPc timeMpl) = some Rust.panicked) + (hRealStubNone : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl lsTimeAddSym) = none) + (hStub : ∀ W : CliHooks, + StubReachesTargetOn + (fun m => (timeAddSubProg timeMpl).CodeLoaded m) + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (libsignalSessionLib.resolve mpl lsTimeAddSym) + (timeMultiLib.fnAddr timeMpl timeAddSym)) : + GhostRowOk mpl mmpl InvS EG lsTimeAddSym (fun _ => True) + (timeAddGhost timeMpl) := + ⟨timeAddGhost_rowSpecOk timeMpl hpl + (keepR_timeAdd_expectFailed_false hRealHullNoExt hPanReal) hlr_ne_stub, + timeAddGhost_rowReplayOn_of_stub mpl mmpl timeMpl InvS EG hpl hCL hInvKeep hKeep + hlr_ne_stub hRealHullNoExt hPanReal hRealStubNone hStub⟩ + +/-- **Full per-row `GhostRowOk` bundle (`GhostRowSpecOk` ∧ `GhostRowReplayOn`)** for `lsTimeAddSym` + (`entryGuard := fun _ => True`), deriving `hkeep_stub` from `hRealHullNoExt` + `hPanReal`. -/ +theorem timeAddGhost_rowOk [LibsignalPlacement] + (mpl mmpl timeMpl : Obj.MultiPlacement) + (InvS : State → Prop) + (EG : CliHooks → String → Option (State → State)) + (hpl : timeMultiLib.Placeable timeMpl) + (hTargetEq : libsignalSessionLib.resolve mpl lsTimeAddSym = + timeMultiLib.fnAddr timeMpl timeAddSym) + (hCL : ∀ u : State, InvS u → (timeAddSubProg timeMpl).CodeLoaded u.mem) + (hInvKeep : ∀ u v : State, InvS u → u.mem.KeepsFrozen v.mem → v.fs = u.fs → InvS v) + (hKeep : ∀ lr : BitVec 64, LsRetAddr624 lr → keepR_timeAdd timeMpl lr = false) + (hlr_ne_stub : ∀ lr : BitVec 64, LsRetAddr624 lr → lr ≠ timeAddExpectFailedStubPc timeMpl) + (hRealHullNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_timeAdd timeMpl pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hPanReal : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (timeAddExpectFailedStubPc timeMpl) = some Rust.panicked) : + GhostRowOk mpl mmpl InvS EG lsTimeAddSym (fun _ => True) + (timeAddGhost timeMpl) := + ⟨timeAddGhost_rowSpecOk timeMpl hpl + (keepR_timeAdd_expectFailed_false hRealHullNoExt hPanReal) hlr_ne_stub, + timeAddGhost_rowReplayOn mpl mmpl timeMpl InvS EG hpl hTargetEq hCL hInvKeep hKeep + hlr_ne_stub hRealHullNoExt hPanReal⟩ + +theorem extraEntryGuard_timeAdd_arm + {mpl : Obj.MultiPlacement} {guardOf : String → State → Prop} {s0 : State} + (hGuardEq : guardOf lsTimeAddSym s0 ↔ timeAddEntryGuard mpl s0) : + guardOf lsTimeAddSym s0 := + hGuardEq.mpr trivial + +theorem extraEntryGuard_singleton_timeAdd [LibsignalPlacement] + {mpl timeMpl : Obj.MultiPlacement} {guardOf : String → State → Prop} + {g : CliGhostHooks} {s0 : State} + (hg : g.extra = [(lsTimeAddSym, timeAddGhost timeMpl)]) + (hGuardEq : guardOf lsTimeAddSym s0 ↔ timeAddEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := by + intro sym _ _ hLook + rw [hg] at hLook + simp only [List.lookup] at hLook + by_cases hSym : (sym == lsTimeAddSym) = true + · have hEq := eq_of_beq hSym + subst hEq + exact hGuardEq.mpr trivial + · simp [hSym] at hLook + +end LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddGhostReplays diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/DecPkPollKitsInstPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/DecPkPollKitsInstPlacedBudgetFd.lean index afbf84088..942cd4db2 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/DecPkPollKitsInstPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/DecPkPollKitsInstPlacedBudgetFd.lean @@ -28,6 +28,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.KemDeserializeS public import LibsignalBinary.Proofs.SignalSession.Cli.Store.DropSpeWordPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePollPlacedBudgetFd public import LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudgetFd +import LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudgetFdSat public import LibsignalBinary.Proofs.SignalSession.Cli.Store.KpkGetPollPlacedBudgetFd public import LibsignalBinary.Proofs.SignalSession.Cli.Store.KpkMarkPollPlacedBudgetFd public import LibsignalBinary.Proofs.SignalSession.Cli.Store.LoadPollPlacedBudgetFd @@ -66,7 +67,6 @@ open CryptoVerification.LibsignalPublicApi.StoreKit open CryptoVerification.LibsignalTripleRatchet (doReserveStackX) open CryptoVerification.RecordCodecs.Placed (lsProg_65 lsProg_84 lsProg_595) open CryptoVerification.SignalSession (CliHooks cliExternsPlaced lsReadFileSym) -open CryptoVerification.SignalSession.Cli.KitInst.IdKit (cliGhostExterns_blackBox) open CryptoVerification.SignalSession.Cli.MainHops (cliIo cliRunBudgets cliWrOk handleErrorSymCli) open CryptoVerification.SignalSession.Cli.Placed (lsProg_543 lsProg_553 lsProg_565 lsProg_566 lsProg_567 lsProg_568 lsProg_569 lsProg_570 @@ -132,9 +132,9 @@ open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget dropSpeWordSpecPlaced readFileSpecPlaced sessDeserializeSpecPlaced sessStorePollSpecPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Store.DropSpeWordPlacedBudget (dropSpeWord_placed_ok) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePollPlacedBudgetFd - (idSavePoll_placed_ok_of_get_put_bb_fd) -open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudgetFd - (idTrustPoll_placed_ok_of_get_bb_fd) + (idSavePoll_placed_ok_of_get_put_bb_fd_sat) +open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudgetFdSat + (idTrustPoll_placed_ok_of_get_bb_fd_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Store.KpkGetPollPlacedBudgetFd (kpkGetPoll_placed_fs_ok_of_deps_fd) open LibsignalBinary.Proofs.SignalSession.Cli.Store.KpkMarkPollPlacedBudgetFd @@ -175,7 +175,7 @@ theorem sessKitHooksPlaced_withFds_of_runHooks [LibsignalPlacement] {M : AllocCo { alloc := halloc panics := hh.panics memcpyRO := hh.memcpyRO - bcmp := hh.bcmp + bcmp := hh.bcmp.of_keepsFs fs := hh.fs reserve := fun hstk hi => hres hstk hi path := fun hstk hi => @@ -547,22 +547,6 @@ theorem subroutine_ok_decodeSignedPreKey_withFdsGe3Closed_of_withFds [LibsignalP /-! ## Top-Level `CliDecPkPollKitsPlacedOkFds` Dischargers -/ -private theorem cliGhostExterns_bcmp_keepsFs_sat (mmpl : Obj.MultiPlacement) - (g : CliGhostHooks) (W : CliHooks) : - HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) - CryptoVerification.SignalSession.Cli.cliBcmpName - (LibsignalBinary.Heap.SpecBudget.withVmPreserved - CryptoVerification.SignalSession.Cli.cliBcmpSpec).keepsFs := by - refine CryptoVerification.SignalSession.Cli.Slots.cliGhostExterns_sat_of_cliExternsPlaced - mmpl g W ?_ - rcases LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_bcmp_budget_sat - mmpl W with ⟨f, hf, hok⟩ - have hbcmp := CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_bcmp mmpl W - rw [hbcmp] at hf - injection hf with hfg - subst hfg - exact ⟨_, hbcmp, hok.keepsFs fun _ => rfl⟩ - /-- Parametric `B : RunBudgets` and `DeserEnv` discharger for `CliDecPkPollKitsPlacedOkFds` from `RunHooksPlaced`, `withLsRetAddr624AndFds` `read_file` `HookSat`, `sessDeserialize` (block 46), and `serializeCanonSpecX` (block 52) at `withFds A`. -/ @@ -593,8 +577,8 @@ theorem cliDecPkPollKitsPlacedOkFds_of_deps [LibsignalPlacement] let H := cliGhostExterns g (cliExternsPlaced mmpl W) have hsh := sessKitHooksPlaced_withFds_of_runHooks hh have hc := codecHooksPlaced_withFds hh.codecHooks - have hBcmpFs := cliGhostExterns_bcmp_keepsFs_sat mmpl g W - have hBb := cliGhostExterns_blackBox mmpl g W + have hBcmpFs := hh.bcmp + have hBb := hh.blackBox have hPath596 := path_placed_caller_ok_of_allocFs_fd (callerProg := lsProg_596 H) (i := 596) (resStack := doReserveStackX) hh.allocFs (by decide) (Nat.le_refl pathNeed) @@ -635,10 +619,10 @@ theorem cliDecPkPollKitsPlacedOkFds_of_deps [LibsignalPlacement] hsh.alloc hAddr594_wf hSer hPut542_wf (Nat.le_refl _) (by decide) (by decide) hSerBlk hSerUnmut (by decide) (by decide) have h570 := subroutine_ok_sessStorePoll_withFdsGe3Closed_of_withFds henf h570_wf - have h566 := idTrustPoll_placed_ok_of_get_bb_fd + have h566 := idTrustPoll_placed_ok_of_get_bb_fd_sat (getProg := lsProg_589 H) (getBlk := 589) hh.allocFs hGet589 hBb (Nat.le_refl _) (by decide) (by decide) - have h565 := idSavePoll_placed_ok_of_get_put_bb_fd + have h565 := idSavePoll_placed_ok_of_get_put_bb_fd_sat (getProg := lsProg_589 H) (getBlk := 589) (putProg := lsProg_543 H) (putBlk := 543) hh.allocFs hGet589 hPutStr543 hBb (Nat.le_refl _) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkCliPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkCliPlaced.lean index ade8a5bc6..4af010113 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkCliPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkCliPlaced.lean @@ -9,8 +9,10 @@ limitations under the License. module +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat public import LibsignalBinary.Proofs.SignalSession.Cli.KitInst.IdentityKitOkPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.Run.ReadFileHookPlaced +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs /-! # Placed CLI Instantiation of `IdentityStoreKitPlacedOkI` @@ -38,21 +40,14 @@ open CryptoVerification.SignalSession CryptoVerification.SignalSession.Cli open CryptoVerification.SignalSession.Cli.MainHops open CryptoVerification.SignalSession.Cli.RunGlue -theorem blackBox_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : - (lsBlackBoxU8Sym, CryptoVerification.LibsignalSession.blackBoxHook) ∈ - cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 11) rfl) - -theorem cliExternsPlaced_blackBox (mmpl : Obj.MultiPlacement) (W : CliHooks) : - cliExternsPlaced mmpl W lsBlackBoxU8Sym = - some CryptoVerification.LibsignalSession.blackBoxHook := - cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W) - -theorem cliGhostExterns_blackBox (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) : - cliGhostExterns g (cliExternsPlaced mmpl W) lsBlackBoxU8Sym = - some CryptoVerification.LibsignalSession.blackBoxHook := - (cliGhostExterns_other g _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans (cliExternsPlaced_blackBox mmpl W) +theorem cliGhostExterns_blackBox_sat [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) + (hOk : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.ExtraSpecOk g) : + HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat := + LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.hookSat_cliGhostExterns_of_extraOk + g (cliExternsPlaced mmpl W) hOk + (fun _ _ h => h.findReceiverBlackBox_budget_ok (by decide) (by decide)) theorem cliIdentityVtablesCli_placed [LibsignalPlacement] {F0 : FsFiles} {peer : AddrGhost} {s1 s2 s3 s4 : Nat} (hDropNz : lsmpl.base 547 ≠ 0#64) : @@ -61,8 +56,70 @@ theorem cliIdentityVtablesCli_placed [LibsignalPlacement] {F0 : FsFiles} {peer : cliIdentityVtRoSym) := cliIdentityKitSpecPlaced_vtables hDropNz -/-- `IdentityStoreKitPlacedRoClOkI` for CLI `IdentityFiles` at +/-- `HookSat`-backed `IdentityStoreKitPlacedRoClOkI` for CLI `IdentityFiles` at +`cliGhostExterns g (cliExternsPlaced mmpl W)`. -/ +theorem cliIdKitRoClOkIE_cli_placed_sat [LibsignalPlacement] (mmpl : Obj.MultiPlacement) + (g : CliGhostHooks) (W : CliHooks) {F0 : FsFiles} + {peer : AddrGhost} {readStk s1 s2 s3 s4 : Nat} + {vtSym : String} {readProg : Program} {jRead : Nat} + [IsLsBlockProg readProg jRead (cliGhostExterns g (cliExternsPlaced mmpl W))] + (hDropNz : lsmpl.base 547 ≠ 0#64) + (hOk : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.ExtraSpecOk g) + (hh : RunSkeleton.RunHooksPlaced E2E.HooksE.A0 + (cliGhostExterns g (cliExternsPlaced mmpl W))) + (hRead : subroutine_ok readProg (lsρ lsReadFileSym) + (readFileSpecPlaced cliIo.rd cliWrOk E2E.HooksE.A0 readStk)) + (hs1 : trustShimNeedPlaced ≤ s1) (hs2 : trustPollNeedPlaced readStk ≤ s2) + (hs3 : saveShimNeedPlaced ≤ s3) (hs4 : savePollNeedPlaced readStk ≤ s4) + (hjRead : jRead < 619 := by decide) + (hjRead_unmut : (jRead ∈ libsignalMutatedBlocks) = false := by decide) : + IdentityStoreKitPlacedRoClOkI + (cliIdentityKitSpecPlaced E2E.HooksE.A0 cliIo.rd F0 cliWrOk peer s1 s2 s3 s4 vtSym) + (cliGhostExterns g (cliExternsPlaced mmpl W)) := + cliIdKitRoClOkIE_placed_sat + (readProg := readProg) + (jRead := jRead) + hDropNz + (fun _ hp => hp.2) + hh + (RunSkeleton.cliReadFilePlaced_rocl_ok mmpl g W readStk hRead) + (cliGhostExterns_blackBox_sat mmpl g W hOk) + hs1 hs2 hs3 hs4 + hjRead hjRead_unmut + +/-- `HookSat`-backed `IdentityStoreKitPlacedOkI` for CLI `IdentityFiles` at `cliGhostExterns g (cliExternsPlaced mmpl W)`. -/ +theorem cliIdKitOkIE_cli_placed_sat [LibsignalPlacement] (mmpl : Obj.MultiPlacement) + (g : CliGhostHooks) (W : CliHooks) {F0 : FsFiles} + {peer : AddrGhost} {readStk s1 s2 s3 s4 : Nat} + {vtSym : String} {readProg : Program} {jRead : Nat} + [IsLsBlockProg readProg jRead (cliGhostExterns g (cliExternsPlaced mmpl W))] + (hDropNz : lsmpl.base 547 ≠ 0#64) + (hOk : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.ExtraSpecOk g) + (hh : RunSkeleton.RunHooksPlaced E2E.HooksE.A0 + (cliGhostExterns g (cliExternsPlaced mmpl W))) + (hRead : subroutine_ok readProg (lsρ lsReadFileSym) + (readFileSpecPlaced cliIo.rd cliWrOk E2E.HooksE.A0 readStk)) + (hs1 : trustShimNeedPlaced ≤ s1) (hs2 : trustPollNeedPlaced readStk ≤ s2) + (hs3 : saveShimNeedPlaced ≤ s3) (hs4 : savePollNeedPlaced readStk ≤ s4) + (hjRead : jRead < 619 := by decide) + (hjRead_unmut : (jRead ∈ libsignalMutatedBlocks) = false := by decide) : + IdentityStoreKitPlacedOkI + (cliIdentityKitSpecPlaced E2E.HooksE.A0 cliIo.rd F0 cliWrOk peer s1 s2 s3 s4 vtSym) + (cliGhostExterns g (cliExternsPlaced mmpl W)) := + cliIdKitOkIE_placed_sat + (readProg := readProg) + (jRead := jRead) + hDropNz + (fun _ hp => hp.2) + hh + (RunSkeleton.cliReadFilePlaced_rocl_ok mmpl g W readStk hRead) + (cliGhostExterns_blackBox_sat mmpl g W hOk) + hs1 hs2 hs3 hs4 + hjRead hjRead_unmut + +/-- `IdentityStoreKitPlacedRoClOkI` for CLI `IdentityFiles` at +`cliGhostExterns g (cliExternsPlaced mmpl W)` (via `hh.blackBox`). -/ theorem cliIdKitRoClOkIE_cli_placed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) {F0 : FsFiles} {peer : AddrGhost} {readStk s1 s2 s3 s4 : Nat} @@ -80,19 +137,19 @@ theorem cliIdKitRoClOkIE_cli_placed [LibsignalPlacement] (mmpl : Obj.MultiPlacem IdentityStoreKitPlacedRoClOkI (cliIdentityKitSpecPlaced E2E.HooksE.A0 cliIo.rd F0 cliWrOk peer s1 s2 s3 s4 vtSym) (cliGhostExterns g (cliExternsPlaced mmpl W)) := - cliIdKitRoClOkIE_placed + cliIdKitRoClOkIE_placed_sat (readProg := readProg) (jRead := jRead) hDropNz (fun _ hp => hp.2) hh (RunSkeleton.cliReadFilePlaced_rocl_ok mmpl g W readStk hRead) - (cliGhostExterns_blackBox mmpl g W) + hh.blackBox hs1 hs2 hs3 hs4 hjRead hjRead_unmut /-- `IdentityStoreKitPlacedOkI` for CLI `IdentityFiles` at -`cliGhostExterns g (cliExternsPlaced mmpl W)`. -/ +`cliGhostExterns g (cliExternsPlaced mmpl W)` (via `hh.blackBox`). -/ theorem cliIdKitOkIE_cli_placed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) {F0 : FsFiles} {peer : AddrGhost} {readStk s1 s2 s3 s4 : Nat} @@ -110,14 +167,14 @@ theorem cliIdKitOkIE_cli_placed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) IdentityStoreKitPlacedOkI (cliIdentityKitSpecPlaced E2E.HooksE.A0 cliIo.rd F0 cliWrOk peer s1 s2 s3 s4 vtSym) (cliGhostExterns g (cliExternsPlaced mmpl W)) := - cliIdKitOkIE_placed + cliIdKitOkIE_placed_sat (readProg := readProg) (jRead := jRead) hDropNz (fun _ hp => hp.2) hh (RunSkeleton.cliReadFilePlaced_rocl_ok mmpl g W readStk hRead) - (cliGhostExterns_blackBox mmpl g W) + hh.blackBox hs1 hs2 hs3 hs4 hjRead hjRead_unmut @@ -125,7 +182,8 @@ end CryptoVerification.SignalSession.Cli.KitInst.IdKit namespace CryptoVerification.SignalSession.Cli.KitInst -export IdKit (cliExternsPlaced_blackBox cliGhostExterns_blackBox cliIdentityVtablesCli_placed +export IdKit (cliGhostExterns_blackBox_sat cliIdentityVtablesCli_placed + cliIdKitRoClOkIE_cli_placed_sat cliIdKitOkIE_cli_placed_sat cliIdKitRoClOkIE_cli_placed cliIdKitOkIE_cli_placed) end CryptoVerification.SignalSession.Cli.KitInst diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkCliPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkCliPlacedBudget.lean index bb8a12e24..906cceeeb 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkCliPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkCliPlacedBudget.lean @@ -38,7 +38,7 @@ open CryptoVerification.LibsignalTripleRatchetRepr (AddrGhost) open CryptoVerification.RustHeap (RustAlloc) open CryptoVerification.SignalSession (CliHooks cliExternsPlaced lsReadFileSym) open CryptoVerification.SignalSession.Cli (ReadRule) -open CryptoVerification.SignalSession.Cli.KitInst (cliGhostExterns_blackBox cliIdentityVtRoSym) +open CryptoVerification.SignalSession.Cli.KitInst (cliIdentityVtRoSym) open CryptoVerification.SignalSession.Cli.KitInst.IdKit (cliIdentityKitSpecPlaced cliIdentityKitSpecPlaced_vtables dirPutStrNeedPlaced savePollNeedPlaced saveShimNeedPlaced trustPollNeedPlaced trustShimNeedPlaced) @@ -61,15 +61,18 @@ open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.SessionKitOkCliPlacedBudge (SessKitHooksPlaced cliDirGet_placed_ok_of_sessHooks) open LibsignalBinary.Proofs.SignalSession.Cli.Run.ReadFileHookPlacedBudget (cliReadFilePlaced_rocl_ok cliReadFilePlaced_rocl_ok_of_hookSat) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat (blackBoxSpecSat) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget + (CliGhostAllocHooks cliGhostExterns_blackBoxSat_budget_sat) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (dirPutStrSpecPlaced idSavePollSpecPlaced readFileSpecPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.BranchesPlacedBudget (CliIdSavePollEnv publicKeySerialize_lscro_of_cli) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.SymPlacedBudget - (idSavePoll_placed_ok_of_deps_core) + (idSavePoll_placed_ok_of_deps_core idSavePoll_placed_ok_of_deps_core_16) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudget - (idTrustPoll_placed_ok_of_deps identityKey_decode_placed_ok publicKeyEq_placed_ok_of_bb) + (idTrustPoll_placed_ok_of_deps idTrustPoll_placed_ok_of_deps_16 identityKey_decode_placed_ok + publicKeyEq_mem_placed_ok_of_bb_16_sat publicKeyEq_placed_ok_of_bb) theorem cliDirPutStr_placed_ok_of_sessHooks [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} @@ -147,6 +150,73 @@ theorem cliIdKitRoClOkIE_placed_of_sessHooks [LibsignalPlacement] {M : AllocCost cliIdKitOkIE_placed_of_sessHooks hDropNz hpathLen hh hRead h_bb hs1 hs2 hs3 hs4 hjRead hjRead_unmut +theorem cliIdKitOkIE_placed_of_sessHooks_sat [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} + {readStk s1 s2 s3 s4 : Nat} {vtSym : String} + {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} + {readProg : Program} {jRead : Nat} [IsLsBlockProg readProg jRead H] + (hDropNz : lsmpl.base 547 ≠ 0#64) + (hpathLen : ∀ p, pathOk p → p.length < 2 ^ 32) + (hh : SessKitHooksPlaced A lim H) + (hRead : subroutine_ok readProg (lsρ lsReadFileSym) + (withLsCodeRoLoaded lsmpl (readFileSpecPlaced rd pathOk A lim readStk ReadEnv))) + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) + (hs1 : trustShimNeedPlaced ≤ s1) (hs2 : trustPollNeedPlaced readStk ≤ s2) + (hs3 : saveShimNeedPlaced ≤ s3) (hs4 : savePollNeedPlaced readStk ≤ s4) + (hjRead : jRead < 619 := by decide) + (hjRead_unmut : (jRead ∈ libsignalMutatedBlocks) = false := by decide) : + IdentityStoreKitPlacedOkI A lim + (cliIdentityKitSpecPlaced A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym) + (cliIdentityKitDefaultBudgetEnv A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym ReadEnv) + H := by + have hGet := cliDirGet_placed_ok_of_sessHooks hpathLen hh hRead hjRead hjRead_unmut + have hPut := cliDirPutStr_placed_ok_of_sessHooks hh + have hEq := publicKeyEq_mem_placed_ok_of_bb_16_sat h_bb + have h566 := idTrustPoll_placed_ok_of_deps_16 hh.alloc hGet + (identityKey_decode_placed_ok (A := A) H) hEq hs2 + (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) + have hSer := publicKeySerialize_lscro_of_cli + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hh.alloc (by decide) + have hGet' := ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hGet (by decide) (by decide) (by decide) + have hPut' := ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hPut (by decide) (by decide) (by decide) + have hDec' := ls_transfer_cl_to_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + (identityKey_decode_placed_ok (A := A) H) (by decide) (by decide) (by decide) + have hEq' := ls_transfer_cl_to_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hEq (by decide) (by decide) (by decide) + have h565 : subroutine_ok (lsProg_565 H) (lsmpl.base 565) + (idSavePollSpecPlaced rd pathOk A lim + (CliIdSavePollEnv rd (DirGetEnv PathEnv ReadEnv rd) DirPutStrEnv) s4) := + idSavePoll_placed_ok_of_deps_core_16 hh.alloc hSer hGet' hPut' hDec' hEq' hs4 + exact cliIdKitOkIE_placed_of_polls hDropNz hh.alloc h566 h565 hs1 hs3 + +theorem cliIdKitRoClOkIE_placed_of_sessHooks_sat [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} + {readStk s1 s2 s3 s4 : Nat} {vtSym : String} + {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} + {readProg : Program} {jRead : Nat} [IsLsBlockProg readProg jRead H] + (hDropNz : lsmpl.base 547 ≠ 0#64) + (hpathLen : ∀ p, pathOk p → p.length < 2 ^ 32) + (hh : SessKitHooksPlaced A lim H) + (hRead : subroutine_ok readProg (lsρ lsReadFileSym) + (withLsCodeRoLoaded lsmpl (readFileSpecPlaced rd pathOk A lim readStk ReadEnv))) + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) + (hs1 : trustShimNeedPlaced ≤ s1) (hs2 : trustPollNeedPlaced readStk ≤ s2) + (hs3 : saveShimNeedPlaced ≤ s3) (hs4 : savePollNeedPlaced readStk ≤ s4) + (hjRead : jRead < 619 := by decide) + (hjRead_unmut : (jRead ∈ libsignalMutatedBlocks) = false := by decide) : + IdentityStoreKitPlacedRoClOkI A lim + (cliIdentityKitSpecPlaced A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym) + (cliIdentityKitDefaultBudgetEnv A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym ReadEnv) + H := + cliIdKitOkIE_placed_of_sessHooks_sat hDropNz hpathLen hh hRead h_bb hs1 hs2 hs3 hs4 + hjRead hjRead_unmut + theorem cliIdentityVtablesCli_placed [LibsignalPlacement] {A : RustAlloc} {F0 : FsFiles} {peer : AddrGhost} {s1 s2 s3 s4 : Nat} (hDropNz : lsmpl.base 547 ≠ 0#64) : IdentityVtablesPlacedOk @@ -178,9 +248,10 @@ theorem cliIdKitOkIE_cli_placed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (cliIdentityKitSpecPlaced A.repAlloc cliIo.rd F0 cliWrOk peer s1 s2 s3 s4 vtSym) (cliIdentityKitDefaultBudgetEnv A.repAlloc cliIo.rd F0 cliWrOk peer s1 s2 s3 s4 vtSym ReadEnv) (cliGhostExterns g (cliExternsPlaced mmpl W)) := - cliIdKitOkIE_placed_of_sessHooks hDropNz (fun _ hp => hp.2) + cliIdKitOkIE_placed_of_sessHooks_sat hDropNz (fun _ hp => hp.2) (SessKitHooksPlaced.cli mmpl g W hG hAzFsT hStrFsT) - hRead (cliGhostExterns_blackBox mmpl g W) hs1 hs2 hs3 hs4 hjRead hjRead_unmut + hRead (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) + hs1 hs2 hs3 hs4 hjRead hjRead_unmut theorem cliIdKitRoClOkIE_cli_placed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkPlaced.lean index 36e2c0640..e641c42ab 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkPlaced.lean @@ -9,6 +9,7 @@ limitations under the License. module +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat public import LibsignalBinary.Proofs.PublicApi.StoreKit.Placed public import LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.KitInst.IdentitySpecPlaced @@ -219,31 +220,19 @@ theorem cliDirGet_placed_ok [LibsignalPlacement] {A : RustAlloc} {H : LibsignalH hjRead hjRead_unmut hRead (hh.fs (lsProg_589 H) 589) (Nat.le_refl (RunSkeleton.RunBudgets.dirGetNeed ⟨readStk⟩)) -theorem cliIdTrustPoll_rocl_placed_ok [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} +private theorem cliIdTrustPoll_rocl_placed_ok_of_566 [LibsignalPlacement] + {A : RustAlloc} {H : LibsignalHooks} {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} - {readStk s1 s2 s3 s4 : Nat} {vtSym : String} - {callerProg getProg eqProg : Program} {callerBlk getBlk eqBlk : Nat} - [IsLsBlockProg callerProg callerBlk H] - [IsLsBlockProg getProg getBlk H] - [IsLsBlockProg eqProg eqBlk H] - (hC : AllocContractsXCliPlaced A H) - (hGet : subroutine_ok getProg (lsmpl.base 589) - (dirGetSpecPlaced rd pathOk A (RunSkeleton.RunBudgets.dirGetNeed ⟨readStk⟩))) - (hEq : subroutine_ok eqProg (lsmpl.base 212) (withLsCodeLoaded lsmpl Getters.publicKeyEqSpec)) - (hs2 : trustPollNeedPlaced readStk ≤ s2) - (hCallerBlk : callerBlk < 619 := by decide) - (hGetBlk : getBlk < 619 := by decide) - (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) - (hEqBlk : eqBlk < 619 := by decide) - (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + {s1 s2 s3 s4 : Nat} {vtSym : String} + {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H] + (h566 : subroutine_ok (lsProg_566 H) (lsmpl.base 566) + (idTrustPollSpecPlaced rd pathOk A s2)) + (hCallerBlk : callerBlk < 619 := by decide) : subroutine_ok callerProg (0#64 + (cliIdentityKitSpecPlaced A rd F0 pathOk peer s1 s2 s3 s4 vtSym).trustPollOff) (withLsRoCl lsmpl (kitTrustPollPlacedSpecI (cliIdentityKitSpecPlaced A rd F0 pathOk peer s1 s2 s3 s4 vtSym))) := by - have h566 := Store.IdTrustPoll.idTrustPoll_placed_ok_of_deps hC hGet - (RecordCodecsBinary.IdentityKeyDecode.identityKey_decode_placed_ok H) - hEq hs2 hGetBlk hGetUnmut (by decide) (by decide) hEqBlk hEqUnmut have h566_kit : subroutine_ok (lsProg_566 H) (lsmpl.base 566) (withLsCodeRoLoaded lsmpl (kitTrustPollPlacedSpecI @@ -338,6 +327,64 @@ theorem cliIdTrustPoll_rocl_placed_ok [LibsignalPlacement] {A : RustAlloc} {H : exact ls_subroutine_ok_rocl_of_block (callerProg := callerProg) (j := 566) h566_kit hCallerBlk (by decide) (by decide) +theorem cliIdTrustPoll_rocl_placed_ok [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} + {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} + {readStk s1 s2 s3 s4 : Nat} {vtSym : String} + {callerProg getProg eqProg : Program} {callerBlk getBlk eqBlk : Nat} + [IsLsBlockProg callerProg callerBlk H] + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg eqProg eqBlk H] + (hC : AllocContractsXCliPlaced A H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A (RunSkeleton.RunBudgets.dirGetNeed ⟨readStk⟩))) + (hEq : subroutine_ok eqProg (lsmpl.base 212) (withLsCodeLoaded lsmpl Getters.publicKeyEqSpec)) + (hs2 : trustPollNeedPlaced readStk ≤ s2) + (hCallerBlk : callerBlk < 619 := by decide) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok callerProg + (0#64 + (cliIdentityKitSpecPlaced A rd F0 pathOk peer s1 s2 s3 s4 vtSym).trustPollOff) + (withLsRoCl lsmpl + (kitTrustPollPlacedSpecI + (cliIdentityKitSpecPlaced A rd F0 pathOk peer s1 s2 s3 s4 vtSym))) := + cliIdTrustPoll_rocl_placed_ok_of_566 + (Store.IdTrustPoll.idTrustPoll_placed_ok_of_deps hC hGet + (RecordCodecsBinary.IdentityKeyDecode.identityKey_decode_placed_ok H) + hEq hs2 hGetBlk hGetUnmut (by decide) (by decide) hEqBlk hEqUnmut) + hCallerBlk + +theorem cliIdTrustPoll_rocl_placed_ok_16 [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} + {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} + {readStk s1 s2 s3 s4 : Nat} {vtSym : String} + {callerProg getProg eqProg : Program} {callerBlk getBlk eqBlk : Nat} + [IsLsBlockProg callerProg callerBlk H] + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg eqProg eqBlk H] + (hC : AllocContractsXCliPlaced A H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A (RunSkeleton.RunBudgets.dirGetNeed ⟨readStk⟩))) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)) + (hs2 : trustPollNeedPlaced readStk ≤ s2) + (hCallerBlk : callerBlk < 619 := by decide) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok callerProg + (0#64 + (cliIdentityKitSpecPlaced A rd F0 pathOk peer s1 s2 s3 s4 vtSym).trustPollOff) + (withLsRoCl lsmpl + (kitTrustPollPlacedSpecI + (cliIdentityKitSpecPlaced A rd F0 pathOk peer s1 s2 s3 s4 vtSym))) := + cliIdTrustPoll_rocl_placed_ok_of_566 + (Store.IdTrustPoll.idTrustPoll_placed_ok_of_deps_16 hC hGet + (RecordCodecsBinary.IdentityKeyDecode.identityKey_decode_placed_ok H) + hEq hs2 hGetBlk hGetUnmut (by decide) (by decide) hEqBlk hEqUnmut) + hCallerBlk + /-! ## `idSavePoll` and kit bundles -/ theorem cliGrowOneDir_placed_ok [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} @@ -360,37 +407,19 @@ theorem cliDirPutStr_placed_ok [LibsignalPlacement] {A : RustAlloc} {H : Libsign (cliGrowOneDir_placed_ok hh.alloc hh.panics) (Nat.le_refl dirPutStrNeedPlaced) -theorem cliIdSavePoll_rocl_placed_ok [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} +private theorem cliIdSavePoll_rocl_placed_ok_of_565 [LibsignalPlacement] + {A : RustAlloc} {H : LibsignalHooks} {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} - {readStk s1 s2 s3 s4 : Nat} {vtSym : String} - {callerProg getProg putProg eqProg : Program} {callerBlk getBlk putBlk eqBlk : Nat} - [IsLsBlockProg callerProg callerBlk H] - [IsLsBlockProg getProg getBlk H] - [IsLsBlockProg putProg putBlk H] - [IsLsBlockProg eqProg eqBlk H] - (hC : AllocContractsXCliPlaced A H) - (hpan : Store.PlacedCommon.CliPanicHooksPlaced H) - (hGet : subroutine_ok getProg (lsmpl.base 589) - (dirGetSpecPlaced rd pathOk A (RunSkeleton.RunBudgets.dirGetNeed ⟨readStk⟩))) - (hPut : subroutine_ok putProg (lsmpl.base 543) - (dirPutStrSpecPlaced A dirPutStrNeedPlaced)) - (hEq : subroutine_ok eqProg (lsmpl.base 212) (withLsCodeLoaded lsmpl Getters.publicKeyEqSpec)) - (hs4 : savePollNeedPlaced readStk ≤ s4) - (hCallerBlk : callerBlk < 619 := by decide) - (hGetBlk : getBlk < 619 := by decide) - (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) - (hPutBlk : putBlk < 619 := by decide) - (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) - (hEqBlk : eqBlk < 619 := by decide) - (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + {s1 s2 s3 s4 : Nat} {vtSym : String} + {callerProg : Program} {callerBlk : Nat} [IsLsBlockProg callerProg callerBlk H] + (h565 : subroutine_ok (lsProg_565 H) (lsmpl.base 565) + (idSavePollSpecPlaced rd pathOk A s4)) + (hCallerBlk : callerBlk < 619 := by decide) : subroutine_ok callerProg (0#64 + (cliIdentityKitSpecPlaced A rd F0 pathOk peer s1 s2 s3 s4 vtSym).savePollOff) (withLsRoCl lsmpl (kitSavePollPlacedSpecI (cliIdentityKitSpecPlaced A rd F0 pathOk peer s1 s2 s3 s4 vtSym))) := by - have h565 := Store.IdSavePoll.idSavePoll_placed_ok_of_deps hC hpan hGet hPut - (RecordCodecsBinary.IdentityKeyDecode.identityKey_decode_placed_ok H) - hEq hs4 hGetBlk hGetUnmut hPutBlk hPutUnmut (by decide) (by decide) hEqBlk hEqUnmut have h565_kit : subroutine_ok (lsProg_565 H) (lsmpl.base 565) (withLsCodeRoLoaded lsmpl (kitSavePollPlacedSpecI @@ -503,6 +532,76 @@ theorem cliIdSavePoll_rocl_placed_ok [LibsignalPlacement] {A : RustAlloc} {H : L exact ls_subroutine_ok_rocl_of_block (callerProg := callerProg) (j := 565) h565_kit hCallerBlk (by decide) (by decide) +theorem cliIdSavePoll_rocl_placed_ok [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} + {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} + {readStk s1 s2 s3 s4 : Nat} {vtSym : String} + {callerProg getProg putProg eqProg : Program} {callerBlk getBlk putBlk eqBlk : Nat} + [IsLsBlockProg callerProg callerBlk H] + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + [IsLsBlockProg eqProg eqBlk H] + (hC : AllocContractsXCliPlaced A H) + (hpan : Store.PlacedCommon.CliPanicHooksPlaced H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A (RunSkeleton.RunBudgets.dirGetNeed ⟨readStk⟩))) + (hPut : subroutine_ok putProg (lsmpl.base 543) + (dirPutStrSpecPlaced A dirPutStrNeedPlaced)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) (withLsCodeLoaded lsmpl Getters.publicKeyEqSpec)) + (hs4 : savePollNeedPlaced readStk ≤ s4) + (hCallerBlk : callerBlk < 619 := by decide) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok callerProg + (0#64 + (cliIdentityKitSpecPlaced A rd F0 pathOk peer s1 s2 s3 s4 vtSym).savePollOff) + (withLsRoCl lsmpl + (kitSavePollPlacedSpecI + (cliIdentityKitSpecPlaced A rd F0 pathOk peer s1 s2 s3 s4 vtSym))) := + cliIdSavePoll_rocl_placed_ok_of_565 + (Store.IdSavePoll.idSavePoll_placed_ok_of_deps hC hpan hGet hPut + (RecordCodecsBinary.IdentityKeyDecode.identityKey_decode_placed_ok H) + hEq hs4 hGetBlk hGetUnmut hPutBlk hPutUnmut (by decide) (by decide) hEqBlk hEqUnmut) + hCallerBlk + +theorem cliIdSavePoll_rocl_placed_ok_16 [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} + {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} + {readStk s1 s2 s3 s4 : Nat} {vtSym : String} + {callerProg getProg putProg eqProg : Program} {callerBlk getBlk putBlk eqBlk : Nat} + [IsLsBlockProg callerProg callerBlk H] + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + [IsLsBlockProg eqProg eqBlk H] + (hC : AllocContractsXCliPlaced A H) + (hpan : Store.PlacedCommon.CliPanicHooksPlaced H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A (RunSkeleton.RunBudgets.dirGetNeed ⟨readStk⟩))) + (hPut : subroutine_ok putProg (lsmpl.base 543) + (dirPutStrSpecPlaced A dirPutStrNeedPlaced)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)) + (hs4 : savePollNeedPlaced readStk ≤ s4) + (hCallerBlk : callerBlk < 619 := by decide) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok callerProg + (0#64 + (cliIdentityKitSpecPlaced A rd F0 pathOk peer s1 s2 s3 s4 vtSym).savePollOff) + (withLsRoCl lsmpl + (kitSavePollPlacedSpecI + (cliIdentityKitSpecPlaced A rd F0 pathOk peer s1 s2 s3 s4 vtSym))) := + cliIdSavePoll_rocl_placed_ok_of_565 + (Store.IdSavePoll.idSavePoll_placed_ok_of_deps_16 hC hpan hGet hPut + (RecordCodecsBinary.IdentityKeyDecode.identityKey_decode_placed_ok H) + hEq hs4 hGetBlk hGetUnmut hPutBlk hPutUnmut (by decide) (by decide) hEqBlk hEqUnmut) + hCallerBlk + /-- Relocatable `IdentityStoreKitOkI` bundle carrying `withLsRoCl lsmpl` across all six callbacks. -/ structure IdentityStoreKitPlacedRoClOkI [LibsignalPlacement] {A : RustAlloc} @@ -591,4 +690,69 @@ theorem cliIdKitOkIE_placed [LibsignalPlacement] {A : RustAlloc} {H : LibsignalH savePoll := hrocl.savePoll saveFutDrop := hrocl.saveFutDrop } +/-- `HookSat`-backed sibling of `cliIdKitRoClOkIE_placed`. -/ +theorem cliIdKitRoClOkIE_placed_sat [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} + {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} + {readStk s1 s2 s3 s4 : Nat} {vtSym : String} + {readProg : Program} {jRead : Nat} [IsLsBlockProg readProg jRead H] + (hDropNz : lsmpl.base 547 ≠ 0#64) + (hpathLen : ∀ p, pathOk p → p.length < 2 ^ 32) + (hh : RunSkeleton.RunHooksPlaced A H) + (hRead : subroutine_ok readProg (lsρ lsReadFileSym) + (withLsCodeRoLoaded lsmpl (readFileSpecPlaced rd pathOk A readStk))) + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) + (hs1 : trustShimNeedPlaced ≤ s1) (hs2 : trustPollNeedPlaced readStk ≤ s2) + (hs3 : saveShimNeedPlaced ≤ s3) (hs4 : savePollNeedPlaced readStk ≤ s4) + (hjRead : jRead < 619 := by decide) + (hjRead_unmut : (jRead ∈ libsignalMutatedBlocks) = false := by decide) : + IdentityStoreKitPlacedRoClOkI + (cliIdentityKitSpecPlaced A rd F0 pathOk peer s1 s2 s3 s4 vtSym) H := by + have hGet := cliDirGet_placed_ok hpathLen hh hRead hjRead hjRead_unmut + have hPut := cliDirPutStr_placed_ok hh + have hEq := Store.IdTrustPoll.publicKeyEq_mem_placed_ok_of_bb_16_sat h_bb + exact + { trustShim := fun hblk => cliIdTrustShim_rocl_placed_ok hh.alloc hh.panics hs1 hblk + trustPoll := fun hblk => cliIdTrustPoll_rocl_placed_ok_16 hh.alloc hGet hEq hs2 hblk + trustFutDrop := fun hblk => by + dsimp only [cliIdentityKitSpecPlaced] + rw [lsDropOffPlaced_eq hDropNz] + exact cliIdFutDrop_rocl_placed_ok hblk + saveShim := fun hblk => cliIdSaveShim_rocl_placed_ok hh.alloc hh.panics hs3 hblk + savePoll := fun hblk => cliIdSavePoll_rocl_placed_ok_16 hh.alloc hh.panics hGet hPut hEq hs4 hblk + saveFutDrop := fun hblk => by + dsimp only [cliIdentityKitSpecPlaced] + rw [lsDropOffPlaced_eq hDropNz] + exact cliIdFutDrop_rocl_placed_ok hblk } + +/-- `HookSat`-backed sibling of `cliIdKitOkIE_placed`. -/ +theorem cliIdKitOkIE_placed_sat [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} + {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} + {readStk s1 s2 s3 s4 : Nat} {vtSym : String} + {readProg : Program} {jRead : Nat} [IsLsBlockProg readProg jRead H] + (hDropNz : lsmpl.base 547 ≠ 0#64) + (hpathLen : ∀ p, pathOk p → p.length < 2 ^ 32) + (hh : RunSkeleton.RunHooksPlaced A H) + (hRead : subroutine_ok readProg (lsρ lsReadFileSym) + (withLsCodeRoLoaded lsmpl (readFileSpecPlaced rd pathOk A readStk))) + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) + (hs1 : trustShimNeedPlaced ≤ s1) (hs2 : trustPollNeedPlaced readStk ≤ s2) + (hs3 : saveShimNeedPlaced ≤ s3) (hs4 : savePollNeedPlaced readStk ≤ s4) + (hjRead : jRead < 619 := by decide) + (hjRead_unmut : (jRead ∈ libsignalMutatedBlocks) = false := by decide) : + IdentityStoreKitPlacedOkI + (cliIdentityKitSpecPlaced A rd F0 pathOk peer s1 s2 s3 s4 vtSym) H := by + have hrocl := cliIdKitRoClOkIE_placed_sat + (A := A) (H := H) (rd := rd) (F0 := F0) (pathOk := pathOk) (peer := peer) + (s1 := s1) (s2 := s2) (s3 := s3) (s4 := s4) (vtSym := vtSym) + hDropNz hpathLen hh hRead h_bb hs1 hs2 hs3 hs4 hjRead hjRead_unmut + exact + { trustShim := hrocl.trustShim + trustPoll := hrocl.trustPoll + trustFutDrop := hrocl.trustFutDrop + saveShim := hrocl.saveShim + savePoll := hrocl.savePoll + saveFutDrop := hrocl.saveFutDrop } + end CryptoVerification.SignalSession.Cli.KitInst.IdKit diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkPlacedBudget.lean index 94932e059..6061ea886 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/IdentityKitOkPlacedBudget.lean @@ -105,13 +105,16 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustShimPlacedBudget (idTrustShim_placed_ok_of_deps) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSaveShimPlacedBudget (idSaveShim_placed_ok_of_deps) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat + (blackBoxSpecSat publicKeyEqMemSpec16) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudget - (CliIdTrustPollEnv idTrustPoll_placed_ok_of_deps identityKey_decode_placed_ok + (CliIdTrustPollEnv idTrustPoll_placed_ok_of_deps idTrustPoll_placed_ok_of_deps_16 + identityKey_decode_placed_ok publicKeyEq_mem_placed_ok_of_bb_16_sat publicKeyEq_placed_ok_of_bb) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.BranchesPlacedBudget (CliIdSavePollEnv CliIdSaveTailEnv publicKeySerialize_lscro_of_cli) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.SymPlacedBudget - (idSavePoll_placed_ok_of_deps_core) + (idSavePoll_placed_ok_of_deps_core idSavePoll_placed_ok_of_deps_core_16) /-! ## Poll allocation envelopes -/ @@ -283,7 +286,7 @@ theorem cliDirGet_placed_ok [LibsignalPlacement] {M : AllocCostModel} subroutine_ok (lsProg_589 H) (lsmpl.base 589) (dirGetSpecPlaced rd pathOk A lim (DirGetEnv PathEnv ReadEnv rd) (RunBudgets.dirGetNeed ⟨readStk⟩)) := - dirGet_placed_ok_of_deps hpathLen hh.alloc hh.memcpyRO hh.bcmp + dirGet_placed_ok_of_deps hpathLen hh.alloc hh.memcpyRO hh.bcmp.of_keepsFs (jPath := 589) (by decide) (by decide) (path_placed_ok (callerProg := lsProg_589 H) (i := 589) hh (Nat.le_refl pathNeed) (by decide)) @@ -308,7 +311,7 @@ theorem cliDirPutStr_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hh : RunHooksPlaced A lim H) : subroutine_ok (lsProg_543 H) (lsmpl.base 543) (dirPutStrSpecPlaced A lim DirPutStrEnv dirPutStrNeedPlaced) := - dirPutStr_placed_ok_of_deps hh.alloc hh.panics hh.memcpyRO hh.bcmp + dirPutStr_placed_ok_of_deps hh.alloc hh.panics hh.memcpyRO hh.bcmp.of_keepsFs (jGrow := 586) (by decide) (by decide) (cliGrowOneDir_placed_ok hh.alloc hh.panics) (Nat.le_refl dirPutStrNeedPlaced) @@ -796,4 +799,148 @@ theorem cliIdKitRoClOkIE_placed [LibsignalPlacement] {M : AllocCostModel} H := cliIdKitOkIE_placed hDropNz hpathLen hh hRead h_bb hs1 hs2 hs3 hs4 hjRead hjRead_unmut +theorem cliIdTrustPoll_rocl_placed_ok_16 [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} + {readStk s1 s2 s3 s4 : Nat} {vtSym : String} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {callerProg getProg eqProg : Program} {callerBlk getBlk eqBlk : Nat} + [IsLsBlockProg callerProg callerBlk H] + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg eqProg eqBlk H] + (hC : AllocContractsXCliPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv (RunBudgets.dirGetNeed ⟨readStk⟩))) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl (withVmPreserved publicKeyEqMemSpec16))) + (hs2 : trustPollNeedPlaced readStk ≤ s2) + (hCallerBlk : callerBlk < 619 := by decide) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok callerProg + (0#64 + (cliIdentityKitSpecPlaced A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym).trustPollOff) + (withLsRoCl lsmpl + (kitTrustPollPlacedSpecI M A lim + (cliIdentityKitSpecPlaced A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym) + (cliIdentityKitBudgetEnv A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 GetEnv PutStrEnv vtSym))) := by + have h566 := idTrustPoll_placed_ok_of_deps_16 hC hGet + (identityKey_decode_placed_ok (A := A) H) hEq hs2 + hGetBlk hGetUnmut (by decide) (by decide) hEqBlk hEqUnmut + exact cliIdTrustPoll_rocl_placed_ok_of_poll h566 hCallerBlk + +theorem cliIdSavePoll_rocl_placed_ok_16 [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} + {readStk s1 s2 s3 s4 : Nat} {vtSym : String} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {callerProg getProg putProg eqProg : Program} {callerBlk getBlk putBlk eqBlk : Nat} + [IsLsBlockProg callerProg callerBlk H] + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + [IsLsBlockProg eqProg eqBlk H] + (hC : AllocContractsXCliPlaced A lim H) + (_hpan : CliPanicHooksPlaced H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv (RunBudgets.dirGetNeed ⟨readStk⟩))) + (hPut : subroutine_ok putProg (lsmpl.base 543) + (dirPutStrSpecPlaced A lim PutStrEnv dirPutStrNeedPlaced)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl (withVmPreserved publicKeyEqMemSpec16))) + (hs4 : savePollNeedPlaced readStk ≤ s4) + (hCallerBlk : callerBlk < 619 := by decide) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok callerProg + (0#64 + (cliIdentityKitSpecPlaced A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym).savePollOff) + (withLsRoCl lsmpl + (kitSavePollPlacedSpecI M A lim + (cliIdentityKitSpecPlaced A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym) + (cliIdentityKitBudgetEnv A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 GetEnv PutStrEnv vtSym))) := by + have hSer := publicKeySerialize_lscro_of_cli + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hC (by decide) + have hGet' := ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hGet (by decide) hGetBlk hGetUnmut + have hPut' := ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hPut (by decide) hPutBlk hPutUnmut + have hDec' := ls_transfer_cl_to_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + (identityKey_decode_placed_ok (A := A) H) (by decide) (by decide) (by decide) + have hEq' := ls_transfer_cl_to_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hEq (by decide) hEqBlk hEqUnmut + have h565 : subroutine_ok (lsProg_565 H) (lsmpl.base 565) + (idSavePollSpecPlaced rd pathOk A lim (CliIdSavePollEnv rd GetEnv PutStrEnv) s4) := + idSavePoll_placed_ok_of_deps_core_16 hC hSer hGet' hPut' hDec' hEq' hs4 + exact cliIdSavePoll_rocl_placed_ok_of_poll h565 hCallerBlk + +theorem cliIdKitOkIE_placed_sat [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} + {readStk s1 s2 s3 s4 : Nat} {vtSym : String} + {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} + {readProg : Program} {jRead : Nat} [IsLsBlockProg readProg jRead H] + (hDropNz : lsmpl.base 547 ≠ 0#64) + (hpathLen : ∀ p, pathOk p → p.length < 2 ^ 32) + (hh : RunHooksPlaced A lim H) + (hRead : subroutine_ok readProg (lsρ lsReadFileSym) + (withLsCodeRoLoaded lsmpl (readFileSpecPlaced rd pathOk A lim readStk ReadEnv))) + (h_bb : HookSat H lsBlackBoxU8Sym blackBoxSpecSat) + (hs1 : trustShimNeedPlaced ≤ s1) (hs2 : trustPollNeedPlaced readStk ≤ s2) + (hs3 : saveShimNeedPlaced ≤ s3) (hs4 : savePollNeedPlaced readStk ≤ s4) + (hjRead : jRead < 619 := by decide) + (hjRead_unmut : (jRead ∈ libsignalMutatedBlocks) = false := by decide) : + IdentityStoreKitPlacedOkI A lim + (cliIdentityKitSpecPlaced A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym) + (cliIdentityKitDefaultBudgetEnv A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym ReadEnv) + H := by + have hGet := cliDirGet_placed_ok hpathLen hh hRead hjRead hjRead_unmut + have hPut := cliDirPutStr_placed_ok hh + have hEq := publicKeyEq_mem_placed_ok_of_bb_16_sat h_bb + have h566 := idTrustPoll_placed_ok_of_deps_16 hh.alloc hGet + (identityKey_decode_placed_ok (A := A) H) hEq hs2 + (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) + have hSer := publicKeySerialize_lscro_of_cli + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hh.alloc (by decide) + have hGet' := ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hGet (by decide) (by decide) (by decide) + have hPut' := ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hPut (by decide) (by decide) (by decide) + have hDec' := ls_transfer_cl_to_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + (identityKey_decode_placed_ok (A := A) H) (by decide) (by decide) (by decide) + have hEq' := ls_transfer_cl_to_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hEq (by decide) (by decide) (by decide) + have h565 : subroutine_ok (lsProg_565 H) (lsmpl.base 565) + (idSavePollSpecPlaced rd pathOk A lim + (CliIdSavePollEnv rd (DirGetEnv PathEnv ReadEnv rd) DirPutStrEnv) s4) := + idSavePoll_placed_ok_of_deps_core_16 hh.alloc hSer hGet' hPut' hDec' hEq' hs4 + exact cliIdKitOkIE_placed_of_polls hDropNz hh.alloc h566 h565 hs1 hs3 + +theorem cliIdKitRoClOkIE_placed_sat [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} + {readStk s1 s2 s3 s4 : Nat} {vtSym : String} + {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} + {readProg : Program} {jRead : Nat} [IsLsBlockProg readProg jRead H] + (hDropNz : lsmpl.base 547 ≠ 0#64) + (hpathLen : ∀ p, pathOk p → p.length < 2 ^ 32) + (hh : RunHooksPlaced A lim H) + (hRead : subroutine_ok readProg (lsρ lsReadFileSym) + (withLsCodeRoLoaded lsmpl (readFileSpecPlaced rd pathOk A lim readStk ReadEnv))) + (h_bb : HookSat H lsBlackBoxU8Sym blackBoxSpecSat) + (hs1 : trustShimNeedPlaced ≤ s1) (hs2 : trustPollNeedPlaced readStk ≤ s2) + (hs3 : saveShimNeedPlaced ≤ s3) (hs4 : savePollNeedPlaced readStk ≤ s4) + (hjRead : jRead < 619 := by decide) + (hjRead_unmut : (jRead ∈ libsignalMutatedBlocks) = false := by decide) : + IdentityStoreKitPlacedRoClOkI A lim + (cliIdentityKitSpecPlaced A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym) + (cliIdentityKitDefaultBudgetEnv A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym ReadEnv) + H := + cliIdKitOkIE_placed_sat hDropNz hpathLen hh hRead h_bb hs1 hs2 hs3 hs4 hjRead hjRead_unmut + end LibsignalBinary.Proofs.SignalSession.Cli.KitInst.IdentityKitOkPlacedBudget diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/SessionKitOkCliPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/SessionKitOkCliPlaced.lean index 3722a0ffe..be23df59d 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/SessionKitOkCliPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/SessionKitOkCliPlaced.lean @@ -654,8 +654,6 @@ theorem serContractsX_of_runHooks [LibsignalPlacement] (mmpl : Obj.MultiPlacemen hh.codecHooks.dealloc hh.codecHooks.realloc hh.codecHooks.shim - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (Slots.cliExternsPlaced_sessionMemmove_sat mmpl W _)) (hookSat_sessionMemcpy_of_frameless _ hh.codecHooks.memcpy) (Slots.cliGhostExterns_panic_handle_error mmpl g W) (Slots.cliGhostExterns_panic_handle_alloc_error mmpl g W) @@ -672,8 +670,6 @@ theorem stage2ContractsMinPlaced_of_runHooks [LibsignalPlacement] (mmpl : Obj.Mu hh.codecHooks.realloc hh.codecHooks.shim (hookSat_sessionMemcpy_of_frameless _ hh.codecHooks.memcpy) - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (Slots.cliExternsPlaced_sessionMemmove_sat mmpl W _)) (Slots.cliGhostExterns_panic_handle_error mmpl g W) (Slots.cliGhostExterns_panic_handle_alloc_error mmpl g W) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/SessionKitOkCliPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/SessionKitOkCliPlacedBudget.lean index dc65536d6..c09b89c88 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/SessionKitOkCliPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/KitInst/SessionKitOkCliPlacedBudget.lean @@ -134,8 +134,8 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.SkeletonPlacedBudget (RunHooksPlaced path_placed_ok reserve_placed_ok) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliAllocHooks CliGhostAllocHooks CliGhostSpqrAllocHooks allocContractsXCliPlaced_of_hooks - bumpGhost cliExternsPlaced_bcmp_budget_sat cliExternsPlaced_memcpyRegionRO_budget_sat - cliGhostAllocHooks_bumpGhost) + bumpGhost cliExternsPlaced_memcpyRegionRO_budget_sat cliGhostAllocHooks_bumpGhost + cliGhostExterns_bcmp_budget_sat) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsXCliPlaced ReadFileRuleEnv addrTextSpecPlaced decimalSpecPlaced dirGetSpecPlaced dirPutSpecPlaced growOneDirSpecPlaced pathSpecPlaced readFileSpecPlaced @@ -382,7 +382,7 @@ theorem SessKitHooksPlaced.of_runHooks [LibsignalPlacement] {M : AllocCostModel} alloc := hh.alloc panics := hh.panics memcpyRO := hh.memcpyRO - bcmp := hh.bcmp + bcmp := hh.bcmp.of_keepsFs fs := hh.fs reserve := fun hstk hi => reserve_placed_ok hh hstk hi path := fun hstk hi => path_placed_ok hh hstk hi @@ -416,16 +416,21 @@ theorem SessKitHooksPlaced.cli [LibsignalPlacement] (mmpl : Obj.MultiPlacement) { alloc := halloc panics := hpan memcpyRO := hro - bcmp := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_bcmp_budget_sat mmpl W) + bcmp := cliGhostExterns_bcmp_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk fs := fun _ _ => traceFsSound_lsProg_cli_ghost mmpl g W - ⟨hG.alloc_fsT, hG.dealloc_fsT, hG.realloc_fsT, hAzFsT, hG.shim_eq ▸ hookNoop_fsT, hStrFsT, - by - obtain ⟨f₀, hf₀, _, _, _, _, _, _, hfsT⟩ := hG.memset - intro f hf; cases hf₀.symm.trans hf; exact hfsT, - by - obtain ⟨f₀, hf₀, _, _, _, _, _, _, _, _, hfsT⟩ := hG.memcpy - intro f hf; cases hf₀.symm.trans hf; exact hfsT⟩ + { alloc_fsT := hG.alloc_fsT + dealloc_fsT := hG.dealloc_fsT + realloc_fsT := hG.realloc_fsT + allocZeroed_fsT := hAzFsT + shim_fsT := hG.shim_eq ▸ hookNoop_fsT + stringClone_fsT := hStrFsT + memset_fsT := by + obtain ⟨f₀, hf₀, _, _, _, _, _, _, hfsT⟩ := hG.memset + intro f hf; cases hf₀.symm.trans hf; exact hfsT + memcpy_fsT := by + obtain ⟨f₀, hf₀, _, _, _, _, _, _, _, _, hfsT⟩ := hG.memcpy + intro f hf; cases hf₀.symm.trans hf; exact hfsT + extra_fsT := hG.extraOk.fsT } reserve := fun hstk hi => hres hstk hi path := fun hstk hi => path_placed_caller_ok_of_deps diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/M24/AddressRoA1PlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/M24/AddressRoA1PlacedBudget.lean index b9b0b35bf..7b86cb549 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/M24/AddressRoA1PlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/M24/AddressRoA1PlacedBudget.lean @@ -35,10 +35,8 @@ open CryptoVerification.LibsignalPublicApi.StoreKit (withLsRoCl) open CryptoVerification.LibsignalTripleRatchet (extHookStack) open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) open CryptoVerification.SignalSession - (CliHooks cliExternsPlaced fromUtf8Hook lsFromUtf8Sym lsMemrchrSym memrchrHook strlenHook) + (fromUtf8Hook lsFromUtf8Sym lsMemrchrSym memrchrHook strlenHook) open CryptoVerification.SignalSession.Cli.Main.Placed (lsProg_617) -open CryptoVerification.SignalSession.Cli.MainHops - (cliExternsPlaced_fromUtf8 cliExternsPlaced_memrchr cliExternsPlaced_strlen) open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget) open LibsignalBinary.Proofs.SignalSession.Cli.M24.AddressRoPlacedBudget (address_ro_placed_ok address_ro_placed_ok_rocl) @@ -72,40 +70,19 @@ theorem address_ro_placed_ok_a1_rocl_of_hooks [LibsignalPlacement] {prog : Progr address_ro_placed_ok_rocl (prog := prog) (i := i) hFs (memrchr_ro_blk580_ok_of_hooks hext) hres hres64 hi -theorem address_ro_placed_ok_a1 [LibsignalPlacement] - {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} - (mmpl : Obj.MultiPlacement) (W : CliHooks) - (hFs : AllocContractsFsPlaced A lim (cliExternsPlaced mmpl W)) - {resStack : Nat} - (hres : 0xB0 + extHookStack ≤ resStack) (hres64 : resStack ≤ 2 ^ 63) : - subroutine_ok (lsProg_617 (cliExternsPlaced mmpl W)) (lsmpl.base 580) - (withLsRoCl lsmpl (addressSpecRO A lim uuidTryParse resStack)) := - address_ro_placed_ok_a1_of_hooks hFs (cliExternsPlaced_memrchr mmpl W) hres hres64 - -/-- Derive `MainCalleesROBlk617` from `MainCalleesBlk617` and the `strlen`, `from_utf8`, and +/-- Derive `MainCalleesROBlk617` from `MainCalleesBlk617` and the `from_utf8` and `memrchr` hook entries. -/ theorem mainCalleesROBlk617_of_mainCalleesBlk617_and_hooks [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} {hookStack resStack : Nat} {err : List (BitVec 8) → BitVec 64 × BitVec 16} (hc : MainCalleesBlk617 A lim H uuidTryParse hookStack resStack) - (hstrlen : H "strlen" = some strlenHook) + (_hstrlen : H "strlen" = some strlenHook) (hutf8 : H lsFromUtf8Sym = some (fromUtf8Hook err)) (hmemrchr : H lsMemrchrSym = some memrchrHook) (hres : 0xB0 + extHookStack ≤ resStack) (hres64 : resStack ≤ 2 ^ 63) : MainCalleesROBlk617 A lim H uuidTryParse hookStack resStack := - mainCalleesROBlk617_of_mainCalleesBlk617_and_addr hc hstrlen hutf8 + mainCalleesROBlk617_of_mainCalleesBlk617_and_addr hc hutf8 (address_ro_placed_ok_a1_of_hooks hc.allocFs hmemrchr hres hres64) -theorem mainCalleesROBlk617_of_mainCalleesBlk617_cliExterns [LibsignalPlacement] - {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} - (mmpl : Obj.MultiPlacement) (W : CliHooks) {hookStack resStack : Nat} - (hc : MainCalleesBlk617 A lim (cliExternsPlaced mmpl W) uuidTryParse hookStack resStack) - (hres : 0xB0 + extHookStack ≤ resStack) (hres64 : resStack ≤ 2 ^ 63) : - MainCalleesROBlk617 A lim (cliExternsPlaced mmpl W) uuidTryParse hookStack resStack := - mainCalleesROBlk617_of_mainCalleesBlk617_and_hooks hc - (cliExternsPlaced_strlen mmpl W) (cliExternsPlaced_fromUtf8 mmpl W) - (cliExternsPlaced_memrchr mmpl W) - hres hres64 - end LibsignalBinary.Proofs.SignalSession.Cli.M24.AddressRoA1PlacedBudget diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/M24/AddressRoA1PlacedBudgetSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/M24/AddressRoA1PlacedBudgetSat.lean index 911e08853..1838a3852 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/M24/AddressRoA1PlacedBudgetSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/M24/AddressRoA1PlacedBudgetSat.lean @@ -35,7 +35,7 @@ open CryptoVerification open CryptoVerification.LibsignalPublicApi.StoreKit (withLsRoCl) open CryptoVerification.LibsignalTripleRatchet (extHookStack) open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) -open CryptoVerification.SignalSession (lsFromUtf8Sym lsMemrchrSym strlenHook) +open CryptoVerification.SignalSession (lsFromUtf8Sym lsMemrchrSym) open CryptoVerification.SignalSession.Cli.Main.Placed (lsProg_617) open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) @@ -80,12 +80,11 @@ theorem mainCalleesROBlk617_of_mainCalleesBlk617_and_hooks_sat [LibsignalPlaceme {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} {hookStack resStack : Nat} (hc : MainCalleesBlk617 A lim H uuidTryParse hookStack resStack) - (hstrlen : H "strlen" = some strlenHook) (hutf8 : HookSat H lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) (hmemrchr : HookSat H lsMemrchrSym (withLsRet (withVmPreserved (memrchrSpecRO extHookStack)))) (hres : 0xB0 + extHookStack ≤ resStack) (hres64 : resStack ≤ 2 ^ 63) : MainCalleesROBlk617 A lim H uuidTryParse hookStack resStack := - mainCalleesROBlk617_of_mainCalleesBlk617_and_addr_sat hc hstrlen hutf8 + mainCalleesROBlk617_of_mainCalleesBlk617_and_addr_sat hc hutf8 (address_ro_placed_ok_a1_of_hooks_sat hc.allocFs hmemrchr hres hres64) end LibsignalBinary.Proofs.SignalSession.Cli.M24.AddressRoA1PlacedBudgetSat diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/M24/ArgvPad.lean b/LibsignalBinary/Proofs/SignalSession/Cli/M24/ArgvPad.lean index dcacaa9cb..4fb6147ad 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/M24/ArgvPad.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/M24/ArgvPad.lean @@ -46,11 +46,10 @@ open CryptoVerification.LibsignalPublicApi.StoreKit (subroutine_ok_rocl_of_withLsCodeRoLoaded subroutine_ok_withLsCodeRoLoaded_of_plain withLsRoCl) open CryptoVerification.RustHeap (allocFailedIn) open CryptoVerification.SignalSession - (CliHooks Inputs cliExternsPlaced strlenHook) + (Inputs strlenHook) open CryptoVerification.SignalSession.Cli (CliInputsOk IsSendOverCap IsStdinOverCap MainCaseB2 MainGhost MainPost MainResult RunAnswer) open CryptoVerification.SignalSession.Cli.Main.Placed (blkPC_617 blkPl_617 lsProg_617) -open CryptoVerification.SignalSession.Cli.MainHops (cliExternsPlaced_strlen) open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) @@ -485,6 +484,18 @@ theorem strlenHook_ro_sat_ok (hookStack : Nat) : HookOk strlenHook (strlenSpecRO · exact False.elim (not_satisfies_false_sepConj he) · exact False.elim (not_satisfies_false_sepConj ho) +/-- Strengthening `spec.pre` with `withStrlenPadRO` preserves `HookOk` (since `withStrlenPadRO` +only adjoins a read-only pad witness to `pre`, leaving `post`, `onPanic`, `onExit`, and `onOom` +definitionally identical). -/ +theorem hookOk_withStrlenPadRO_of_hookOk {f : State → State} + {spec : Spec (BitVec 64 × List (BitVec 8))} + (hf : HookOk f spec) : + HookOk f (withStrlenPadRO spec) := by + intro ⟨p, s⟩ R s0 hrun hpre hsp + dsimp only [withStrlenPadRO] at hpre + rw [sepConj_assoc] at hpre + exact hf (p, s) R s0 hrun (Satisfies.of_sep_right hpre) hsp + /-- Exact-to-`HookSat` bridge (`toSat`): `H "strlen" = some strlenHook` implies `HookSat H "strlen" (strlenSpecROSat hookStack)`. -/ theorem hookSat_strlenHook_ro_sat {H : LibsignalHooks} {hookStack : Nat} @@ -492,11 +503,6 @@ theorem hookSat_strlenHook_ro_sat {H : LibsignalHooks} {hookStack : Nat} HookSat H "strlen" (strlenSpecROSat hookStack) := ⟨strlenHook, hext, strlenHook_ro_sat_ok hookStack⟩ -theorem hookSat_strlenHook_ro_sat_cliExterns - (mmpl : Obj.MultiPlacement) (W : CliHooks) (hookStack : Nat) : - HookSat (cliExternsPlaced mmpl W) "strlen" (strlenSpecROSat hookStack) := - hookSat_strlenHook_ro_sat (cliExternsPlaced_strlen mmpl W) - private theorem subroutine_ok_rocl_of_plain [LibsignalPlacement] {α : Type} {prog : Program} {entry : BitVec 64} {spec : Spec α} (h : subroutine_ok prog entry spec) : @@ -522,12 +528,6 @@ theorem strlen_ro_sat_placed_ok_of_hooks [LibsignalPlacement] (withLsRoCl lsmpl (strlenSpecROSat hookStack)) := strlen_ro_sat_placed_ok_of_sat (hookSat_strlenHook_ro_sat hext) -theorem strlen_ro_sat_placed_ok_cliExterns [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (W : CliHooks) (hookStack : Nat) : - subroutine_ok (lsProg_617 (cliExternsPlaced mmpl W)) (lsρ "strlen") - (withLsRoCl lsmpl (strlenSpecROSat hookStack)) := - strlen_ro_sat_placed_ok_of_hooks (cliExternsPlaced_strlen mmpl W) - /-- Real `musl` / `rustc 1.98.1` `libc.a` AArch64 `strlen` words (`muslStrlenWords`, 22 words = 88 bytes) satisfy `strlenSpecROSat hookStack` on any hook-free program (re-exported from `HookDischarge.Libc.Strlen.strlen_strlenSpecRO_padRO_withVmPreserved_ok`). -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/M24/CalleesRO.lean b/LibsignalBinary/Proofs/SignalSession/Cli/M24/CalleesRO.lean index 50e9f69ec..e84f1b4e4 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/M24/CalleesRO.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/M24/CalleesRO.lean @@ -44,12 +44,12 @@ open CryptoVerification.LibsignalPublicApi.StoreKit (subroutine_ok_rocl_of_withLsCodeRoLoaded subroutine_ok_withLsCodeRoLoaded_of_plain withLsRoCl) open CryptoVerification.LibsignalTripleRatchetRepr (AddrGhost UuidParser protocolAddressAt) open CryptoVerification.SignalSession - (CliHooks Utf8Ok cliExternsPlaced fromUtf8Hook lsFromUtf8Sym lsMemrchrSym memrchrHook + (Utf8Ok fromUtf8Hook lsFromUtf8Sym lsMemrchrSym memrchrHook strlenHook unmodelled) open CryptoVerification.SignalSession.Cli.Main.Placed (blkPC_617 blkPl_617 lsProg_617) open CryptoVerification.SignalSession.Cli.MainHops - (AddressCall MemrchrCall addrParse cliExternsPlaced_fromUtf8 cliExternsPlaced_memrchr - cliExternsPlaced_strlen lsHandleErrorSymMain memrchrIdx utf8Ok_of_ascii) + (AddressCall MemrchrCall addrParse + lsHandleErrorSymMain memrchrIdx utf8Ok_of_ascii) open CryptoVerification.SignalSession.Cli.Placed (lsProg_580) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FitsEnv RustCliAllocBudget VmPreserved) @@ -125,8 +125,6 @@ structure MainCalleesROBlk617 [LibsignalPlacement] {M : AllocCostModel} (uuidParse : UuidParser) (hookStack resStack : Nat) : Prop where alloc : AllocContractsXCliPlaced A lim H allocFs : AllocContractsFsPlaced A lim H - strlen : subroutine_ok (lsProg_617 H) (lsρ "strlen") - (withLsRoCl lsmpl (withVmPreserved (strlenSpecRO hookStack))) fromUtf8 : subroutine_ok (lsProg_617 H) (lsρ lsFromUtf8Sym) (withLsRoCl lsmpl (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) address : subroutine_ok (lsProg_617 H) (lsmpl.base 580) @@ -150,14 +148,6 @@ theorem main_panic_handle_error_ro_placed [LibsignalPlacement] {M : AllocCostMod some Rust.panicked := hc.handleErrorPanic -theorem main_strlen_ro_placed_ok [LibsignalPlacement] {M : AllocCostModel} - {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} - {uuidParse : UuidParser} {hookStack resStack : Nat} - (hc : MainCalleesROBlk617 A lim H uuidParse hookStack resStack) : - subroutine_ok ((blkPC_617).rebase (blkPl_617).base H) (lsρ "strlen") - (withLsRoCl lsmpl (withVmPreserved (strlenSpecRO hookStack))) := - hc.strlen - theorem main_fromUtf8_ro_placed_ok [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} {uuidParse : UuidParser} {hookStack resStack : Nat} @@ -584,12 +574,6 @@ theorem strlen_ro_placed_ok_of_hooks [LibsignalPlacement] exact subroutine_ok_rocl_of_plain (ls_hook_ok_ultra_of_mem (prog := lsProg_617 H) (i := 617) hsat_vm (by decide)) -theorem strlen_ro_placed_ok_cliExterns [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (W : CliHooks) (hookStack : Nat) : - subroutine_ok (lsProg_617 (cliExternsPlaced mmpl W)) (lsρ "strlen") - (withLsRoCl lsmpl (withVmPreserved (strlenSpecRO hookStack))) := - strlen_ro_placed_ok_of_hooks (cliExternsPlaced_strlen mmpl W) - theorem fromUtf8Ascii_ro_placed_ok_of_hooks [LibsignalPlacement] {H : LibsignalHooks} {hookStack : Nat} {err : List (BitVec 8) → BitVec 64 × BitVec 16} @@ -605,12 +589,6 @@ theorem fromUtf8Ascii_ro_placed_ok_of_hooks [LibsignalPlacement] exact subroutine_ok_rocl_of_plain (ls_hook_ok_ultra_of_mem (prog := lsProg_617 H) (i := 617) hsat_vm (by decide)) -theorem fromUtf8Ascii_ro_placed_ok_cliExterns [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (W : CliHooks) (hookStack : Nat) : - subroutine_ok (lsProg_617 (cliExternsPlaced mmpl W)) (lsρ lsFromUtf8Sym) - (withLsRoCl lsmpl (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) := - fromUtf8Ascii_ro_placed_ok_of_hooks (cliExternsPlaced_fromUtf8 mmpl W) - theorem memrchr_ro_blk580_ok_of_hooks [LibsignalPlacement] {H : LibsignalHooks} {stk : Nat} (hext : H lsMemrchrSym = some memrchrHook) : @@ -628,12 +606,6 @@ theorem memrchr_ro_blk580_ok_of_hooks [LibsignalPlacement] exact ls_hook_ok_ultra_of_mem hsat_vm (by decide) exact subroutine_ok_rocl_of_plain hplain -theorem memrchr_ro_blk580_ok_cliExterns [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (W : CliHooks) (stk : Nat) : - subroutine_ok (lsProg_580 (cliExternsPlaced mmpl W)) (lsρ lsMemrchrSym) - (withLsRoCl lsmpl (withVmPreserved (memrchrSpecRO stk))) := - memrchr_ro_blk580_ok_of_hooks (cliExternsPlaced_memrchr mmpl W) - /-! ## `MainCalleesROBlk617` assembly -/ theorem mainCalleesROBlk617_of_mainCalleesBlk617_and_addr [LibsignalPlacement] @@ -641,14 +613,12 @@ theorem mainCalleesROBlk617_of_mainCalleesBlk617_and_addr [LibsignalPlacement] {H : LibsignalHooks} {uuidParse : UuidParser} {hookStack resStack : Nat} {err : List (BitVec 8) → BitVec 64 × BitVec 16} (hc : MainCalleesBlk617 A lim H uuidParse hookStack resStack) - (hstrlen : H "strlen" = some strlenHook) (hutf8 : H lsFromUtf8Sym = some (fromUtf8Hook err)) (haddr : subroutine_ok (lsProg_617 H) (lsmpl.base 580) (withLsRoCl lsmpl (addressSpecRO A lim uuidParse resStack))) : MainCalleesROBlk617 A lim H uuidParse hookStack resStack where alloc := hc.alloc allocFs := hc.allocFs - strlen := strlen_ro_placed_ok_of_hooks hstrlen fromUtf8 := fromUtf8Ascii_ro_placed_ok_of_hooks hutf8 address := haddr reserve16 := hc.reserve16 diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/M24/CalleesROSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/M24/CalleesROSat.lean index 66ee209d1..9a66984c5 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/M24/CalleesROSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/M24/CalleesROSat.lean @@ -39,7 +39,7 @@ open CryptoVerification.LibsignalPublicApi.StoreKit (subroutine_ok_rocl_of_withLsCodeRoLoaded subroutine_ok_withLsCodeRoLoaded_of_plain withLsRoCl) open CryptoVerification.LibsignalTripleRatchetRepr (UuidParser) open CryptoVerification.SignalSession - (fromUtf8Hook lsFromUtf8Sym lsMemrchrSym memrchrHook strlenHook) + (fromUtf8Hook lsFromUtf8Sym lsMemrchrSym memrchrHook) open CryptoVerification.SignalSession.Cli.Main.Placed (lsProg_617) open CryptoVerification.SignalSession.Cli.Placed (lsProg_580) open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget) @@ -48,8 +48,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (hookSat_withLsRet withLsRet) open LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO (MainCalleesROBlk617 addressSpecRO fromUtf8AsciiSpecRO fromUtf8Hook_ro_ok - fromUtf8Hook_vmPreserved memrchrHook_ro_ok memrchrHook_vmPreserved memrchrSpecRO - strlen_ro_placed_ok_of_hooks) + fromUtf8Hook_vmPreserved memrchrHook_ro_ok memrchrHook_vmPreserved memrchrSpecRO) open LibsignalBinary.Proofs.SignalSession.Cli.Main.HopsPlacedBudget (MainCalleesBlk617) private theorem subroutine_ok_rocl_of_plain [LibsignalPlacement] {α : Type} @@ -108,20 +107,18 @@ theorem memrchr_ro_blk580_ok_of_hooks_sat [LibsignalPlacement] exact ls_hook_ok_ultra_of_mem hext (by decide) exact subroutine_ok_rocl_of_plain hplain -/-- `HookSat` sibling of `mainCalleesROBlk617_of_mainCalleesBlk617_and_addr` (`CalleesRO.lean:653`), +/-- `HookSat` sibling of `mainCalleesROBlk617_of_mainCalleesBlk617_and_addr` (`CalleesRO.lean`), replacing `hutf8` with `HookSat` and dropping `err`. -/ theorem mainCalleesROBlk617_of_mainCalleesBlk617_and_addr_sat [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} {uuidParse : UuidParser} {hookStack resStack : Nat} (hc : MainCalleesBlk617 A lim H uuidParse hookStack resStack) - (hstrlen : H "strlen" = some strlenHook) (hutf8 : HookSat H lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) (haddr : subroutine_ok (lsProg_617 H) (lsmpl.base 580) (withLsRoCl lsmpl (addressSpecRO A lim uuidParse resStack))) : MainCalleesROBlk617 A lim H uuidParse hookStack resStack where alloc := hc.alloc allocFs := hc.allocFs - strlen := strlen_ro_placed_ok_of_hooks hstrlen fromUtf8 := fromUtf8Ascii_ro_placed_ok_of_hooks_sat hutf8 address := haddr reserve16 := hc.reserve16 diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/M24/CliStrictPlacedPadSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/M24/CliStrictPlacedPadSat.lean index 626664fcf..124fb479e 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/M24/CliStrictPlacedPadSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/M24/CliStrictPlacedPadSat.lean @@ -104,7 +104,7 @@ open VerifiedLibraries.Mallocng (MallocngAuxvAt mallocngAddrsOfPlacement) /-! ## 1. SWAR-Padded `MainOkCliExt{Pq,Over}B2NeedLocksPadPlacedAt` & Top Constructors -/ /-- Route-B2 `NeedLocks` + `argvAtROPad` 5-clause PQXDH `main` specification. -/ -def MainOkCliExtPqB2NeedLocksPadPlacedAt +@[expose] def MainOkCliExtPqB2NeedLocksPadPlacedAt (mpl mmpl : Obj.MultiPlacement) (ext : CliHooks → String → Option (State → State)) (mainIdx : Nat) (inputsOf : Inputs → ProcessInputs) (CodeOk : Memory → Prop) @@ -151,7 +151,7 @@ def MainOkCliExtPqB2NeedLocksPadPlacedAt CommitOk (pqRecvInputs WP p c rc) (MainResult.ofAnswer a)) /-- Route-B2 `NeedLocks` + `argvAtROPad` `NoMatch` `main` specification. -/ -def MainOkCliExtOverB2NeedLocksPadPlacedAt +@[expose] def MainOkCliExtOverB2NeedLocksPadPlacedAt (mpl mmpl : Obj.MultiPlacement) (ext : CliHooks → String → Option (State → State)) (mainIdx : Nat) (inputsOf : Inputs → ProcessInputs) (CodeOk : Memory → Prop) @@ -417,7 +417,7 @@ theorem mainOkCliExtOverB2NeedLocksPadPlacedAt_of_runTight_and_hops_sat /-- SWAR-padded sibling of `CliStrictPlaced.MuslHarnessFineNeedLocksPerInput`, supplying `b2MainEntryPreFinePad` (`argvAtROPad`) at `mainPc`. -/ -def MuslHarnessFineNeedLocksPadPerInput (exitStk : Nat) (libcAddr : BitVec 64) +@[expose] def MuslHarnessFineNeedLocksPadPerInput (exitStk : Nat) (libcAddr : BitVec 64) (elf : ElfImage) (P : Program) (mainPc : BitVec 64) (inputsOf : Inputs → ProcessInputs) (mmpl : Obj.MultiPlacement) (lim : BudgetLimits) (st : FineBudget) @@ -524,7 +524,7 @@ theorem muslHarnessFineNeedLocksPadPerInput_of_startup exact ⟨s0, sm, Fr, γ, hload, hsteps, hpc, hrun, hal, hfs, htr, hx0, hEntry, hexit⟩ /-- Guarded twin of `MuslHarnessFineNeedLocksPadPerInput`. -/ -def MuslHarnessFineNeedLocksGuardedPadPerInput (exitStk : Nat) (libcAddr : BitVec 64) +@[expose] def MuslHarnessFineNeedLocksGuardedPadPerInput (exitStk : Nat) (libcAddr : BitVec 64) (elf : ElfImage) (P : Program) (mainPc : BitVec 64) (inputsOf : Inputs → ProcessInputs) (mmpl : Obj.MultiPlacement) (lim : BudgetLimits) (st : FineBudget) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/M24/M2ExternNoAllocFail.lean b/LibsignalBinary/Proofs/SignalSession/Cli/M24/M2ExternNoAllocFail.lean index 2935cc12f..b5f58c615 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/M24/M2ExternNoAllocFail.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/M24/M2ExternNoAllocFail.lean @@ -1297,12 +1297,12 @@ noncomputable def cliM2HookTablePlaced (mmpl : Obj.MultiPlacement) (W : CliHooks ("memset", hookMemset), ("memmove", hookMemmove), ("memcpy", hookMemcpy), - ("bcmp", cliBcmpHook W.bcmp), + ("bcmp", cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp), ("strlen", strlenHook), (lsWriteFileSym, writeFileHook), (lsWriteStdoutSym, writeStdoutHook), (lsMemrchrSym, memrchrHook), - (lsFromUtf8Sym, fromUtf8Hook W.utf8Err), + (lsFromUtf8Sym, fromUtf8Hook CryptoVerification.SignalSession.cliDefaultUtf8Err), (lsFmtWriteSym, fmtWriteHook0), (lsFormatInnerSym, formatInnerHook0), (lsDurationSinceSym, durationSinceExactHook), @@ -1419,12 +1419,12 @@ private theorem tablePreserves_cliM2 (mmpl : Obj.MultiPlacement) (W : CliHooks) · exact preservesNoAllocFailed_hookMemset · exact preservesNoAllocFailed_hookMemmove · exact preservesNoAllocFailed_hookMemcpy - · exact preservesNoAllocFailed_cliBcmpHook W.bcmp + · exact preservesNoAllocFailed_cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp · exact preservesNoAllocFailed_strlenHook · exact preservesNoAllocFailed_writeFileHook · exact preservesNoAllocFailed_writeStdoutHook · exact preservesNoAllocFailed_memrchrHook - · exact preservesNoAllocFailed_fromUtf8Hook W.utf8Err + · exact preservesNoAllocFailed_fromUtf8Hook CryptoVerification.SignalSession.cliDefaultUtf8Err · exact preservesNoAllocFailed_fmtWriteHook0 · exact preservesNoAllocFailed_formatInnerHook0 · exact preservesNoAllocFailed_durationSinceExactHook @@ -1514,27 +1514,16 @@ private theorem tablePreserves_cliF3 (mmpl : Obj.MultiPlacement) (W : CliHooks) rcases hp with hpq | hcli · exact tablePreserves_cliM2Pqxdh mmpl W.C W.Q p hpq · simp only [List.mem_cons, List.not_mem_nil, or_false] at hcli - rcases hcli with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | - rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl - · exact preservesNoAllocFailed_hookMemmove - · exact preservesNoAllocFailed_cliBcmpHook W.bcmp - · exact preservesNoAllocFailed_strlenHook + rcases hcli with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl · exact preservesNoAllocFailed_writeFileHook · exact preservesNoAllocFailed_writeStdoutHook - · exact preservesNoAllocFailed_memrchrHook - · exact preservesNoAllocFailed_fromUtf8Hook W.utf8Err · exact preservesNoAllocFailed_fmtWriteHook0 · exact preservesNoAllocFailed_formatInnerHook0 - · exact preservesNoAllocFailed_durationSinceExactHook - · exact preservesNoAllocFailed_timeAddHook - · exact preservesNoAllocFailed_blackBoxHook · exact preservesNoAllocFailed_compress256Hook W.C.F · exact preservesNoAllocFailed_aesEncHookMallocng mmpl W.C.E · exact preservesNoAllocFailed_aesDecHookMallocng mmpl W.C.D · exact preservesNoAllocFailed_pubFromSecretHook W.C.pubKey · exact preservesNoAllocFailed_diffieHellmanHook W.C.X - · exact preservesNoAllocFailed_zeroizeSecretHook - · exact preservesNoAllocFailed_zeroizeSecretHook theorem externPreservesNoAllocFailed_cliExternsPlaced (mmpl : Obj.MultiPlacement) (W : CliHooks) : diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/M24/MainEntryBudgetFitsInst.lean b/LibsignalBinary/Proofs/SignalSession/Cli/M24/MainEntryBudgetFitsInst.lean index bbf55e4e6..9d4a03f0f 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/M24/MainEntryBudgetFitsInst.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/M24/MainEntryBudgetFitsInst.lean @@ -78,17 +78,15 @@ open CryptoVerification.SignalSession.Cli open CryptoVerification.SignalSession.Cli.Placed (lsProg_588) open CryptoVerification.SignalSession.Cli.Main.Placed (lsProg_617) open CryptoVerification.SignalSession.Cli.MainHops - (CallV DomainArgv IoModel LsCodeInv RunCall cliExternsPlaced_fromUtf8 cliExternsPlaced_memrchr - cliExternsPlaced_strlen cliExternsPlaced_writeFile cliExternsPlaced_writeStdout cliIo - cliMainStk cliResStack cliWrOk cli_hstk64 cli_resStack_callees + (CallV DomainArgv IoModel LsCodeInv RunCall cliExternsPlaced_writeFile cliExternsPlaced_writeStdout + cliIo cliMainStk cliResStack cliWrOk cli_hstk64 cli_resStack_callees fromUtf8Hook_ok hparse_of_domains inputOf lsHandleErrorSymMain mProgPlaced mainFrameSize - namedWrites parseArgs strlenHook_ok) + namedWrites parseArgs) open CryptoVerification.SignalSession.Cli.RunCompose (RunSem runRel runRel_dom) open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns cliGhostExterns_other) open CryptoVerification.SignalSession.Cli.Slots - (cliExternsPlaced_panic_all cliGhostExterns_fromUtf8_eq cliGhostExterns_memrchr_eq - cliGhostExterns_panic_all) + (cliExternsPlaced_panic_all cliGhostExterns_panic_all) open CryptoVerification.SpqrV1.Alloc (reserveCapStride) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FitsEnv FitsEvents FreeOnlyEvs RustCliAllocBudget SeqEnv @@ -97,7 +95,7 @@ open LibsignalBinary.Heap.Fine (FineBudget FineScale FineStepBound_mono_meta Guaranteed63Threshold MmapThresholdReq fineCostModel fineFootprint fineHookRustCliAllocBudget fineMaxDynIvs fineMaxGroups fineMaxMetaAreas finePeak63Bytes finePeak63Count fineStepReserve fromUtf8Hook_vmPreserved - strlenHook_vmPreserved toFineEvent) + toFineEvent) open LibsignalBinary.Heap.SpecBudget (hookSat_withVmPreserved vmPreserved_writeFileHook vmPreserved_writeStdoutHook writeFileEnv_nil writeStdoutEnv_nil) @@ -141,8 +139,6 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.Reserve11PlacedBudget (allocNoOomExtern_fs_rocl reserve16_placed_ok reserve1_placed_ok) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.TryAllocateIn3PlacedBudget (tryAllocateIn3_placed_okFs_of_hooks_at) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (CliGhostAllocHooks allocContractsFsPlaced_of_hooks) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsFsPlaced MainIoPlaced ReadFileRuleEnv readFileLitSpecPlaced readStdinSpecPlaced writeFileSpecPlaced writeStdoutSpecPlaced) @@ -337,7 +333,7 @@ theorem mainCalleesBlk617_of_allocFs_and_hooks [LibsignalPlacement] {H : LibsignalHooks} {hookStack resStack : Nat} {err : List (BitVec 8) → BitVec 64 × BitVec 16} (hFs : AllocContractsFsPlaced A lim H) - (hstrlen : H "strlen" = some strlenHook) + (_hstrlen : H "strlen" = some strlenHook) (hutf8 : H lsFromUtf8Sym = some (fromUtf8Hook err)) (hmemrchr : H lsMemrchrSym = some memrchrHook) (hpan : H lsHandleErrorSymMain = some Rust.panicked) @@ -348,11 +344,6 @@ theorem mainCalleesBlk617_of_allocFs_and_hooks [LibsignalPlacement] MainCalleesBlk617 A lim H uuidTryParse hookStack resStack where alloc := allocContractsFsPlaced_toAllocContractsX hFs allocFs := hFs - strlen := ls_hook_placed_rocl_ok_local <| - hookSat_withVmPreserved ⟨strlenHook, hstrlen, strlenHook_ok hookStack⟩ - (fun f hf s => by - cases hstrlen.symm.trans hf - exact strlenHook_vmPreserved s) fromUtf8 := ls_hook_placed_rocl_ok_local <| hookSat_withVmPreserved ⟨fromUtf8Hook err, hutf8, fromUtf8Hook_ok hookStack err⟩ (fun f hf s => by @@ -1202,11 +1193,6 @@ theorem cliExternsPlaced_handleErrorMain (mmpl : Obj.MultiPlacement) (W : CliHoo cliExternsPlaced mmpl W lsHandleErrorSymMain = some Rust.panicked := cliExternsPlaced_panic_all mmpl W lsHandleErrorSymMain (by decide) -theorem cliGhostExterns_strlen (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : - cliGhostExterns gh (cliExternsPlaced mmpl W) "strlen" = some strlenHook := - (cliGhostExterns_other gh _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans (cliExternsPlaced_strlen mmpl W) - theorem cliGhostExterns_writeFile (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : cliGhostExterns gh (cliExternsPlaced mmpl W) lsWriteFileSym = some writeFileHook := @@ -1379,375 +1365,6 @@ theorem mainIoBoundedPlaced_cliGhostExterns_of_readSubroutines [LibsignalPlaceme writeFile := writeFile_budget_rocl_ok_of_lookup stk (cliGhostExterns_writeFile mmpl gh W) writeStdout := writeStdout_budget_rocl_ok_of_lookup stk (cliGhostExterns_writeStdout mmpl gh W) -theorem mainCalleesBlk617_cliGhostExterns_of_hooks [LibsignalPlacement] - {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {hookStack : Nat} - (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) - (hG : CliGhostAllocHooks M A lim gh) : - MainCalleesBlk617 A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) - uuidTryParse hookStack cliResStack := - mainCalleesBlk617_of_allocFs_and_hooks_cliResStack - (allocContractsFsPlaced_of_hooks mmpl gh W hG) - (cliGhostExterns_strlen mmpl gh W) - (cliGhostExterns_fromUtf8_eq mmpl gh W) - (cliGhostExterns_memrchr_eq mmpl gh W) - (cliGhostExterns_handleErrorMain mmpl gh W) - -theorem mainCalleesBlk617_cliExterns_of_allocFs [LibsignalPlacement] - {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {hookStack : Nat} - (mmpl : Obj.MultiPlacement) (W : CliHooks) - (hFs : AllocContractsFsPlaced A lim (cliExternsPlaced mmpl W)) : - MainCalleesBlk617 A lim (cliExternsPlaced mmpl W) uuidTryParse hookStack cliResStack := - mainCalleesBlk617_of_allocFs_and_hooks_cliResStack hFs - (cliExternsPlaced_strlen mmpl W) - (cliExternsPlaced_fromUtf8 mmpl W) - (cliExternsPlaced_memrchr mmpl W) - (cliExternsPlaced_handleErrorMain mmpl W) - -theorem b2MainRemainingHopsCap_cliGhostExterns_of_hooks [LibsignalPlacement] - {CodeOk : Memory → Prop} [LsCodeInv CodeOk] - (mmpl : Obj.MultiPlacement) (ghOf : CliHooks → CliGhostHooks) (W : CliHooks) - {brkStart : BitVec 64} {lim : BudgetLimits} {γ : GhostName} {tp : BitVec 64} - {hookStack : Nat} - {RunEnv : RunCall → List AllocEvent → Prop} - {Run : Inputs → RunAnswer → Prop} - (hG : CliGhostAllocHooks fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hio : MainIoPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack) - (hioBounded : MainIoBoundedPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) : - B2MainRemainingHops CodeOk mmpl - (fun W' => cliGhostExterns (ghOf W') (cliExternsPlaced mmpl W')) W brkStart lim γ tp - (B2St1Cap fineCostModel lim cliIo uuidTryParse RunEnv Run) - (B2St2Cap fineCostModel lim cliIo RunEnv Run) - (B2St3Cap fineCostModel lim cliIo RunEnv Run) - (B2St4Cap fineCostModel lim) - (B2St5Cap fineCostModel lim) - RunEnv Run := - b2MainRemainingHopsCap_of_allocFs_and_io - (allocContractsFsPlaced_of_hooks mmpl (ghOf W) W hG) - hio hioBounded - (cliGhostExterns_strlen mmpl (ghOf W) W) - (cliGhostExterns_fromUtf8_eq mmpl (ghOf W) W) - (cliGhostExterns_memrchr_eq mmpl (ghOf W) W) - (cliGhostExterns_handleErrorMain mmpl (ghOf W) W) - hstk - -theorem b2MainRemainingHopsCap_cliExterns_of_allocFs_and_io [LibsignalPlacement] - {CodeOk : Memory → Prop} [LsCodeInv CodeOk] - (mmpl : Obj.MultiPlacement) (W : CliHooks) - {brkStart : BitVec 64} {lim : BudgetLimits} {γ : GhostName} {tp : BitVec 64} - {hookStack : Nat} - {RunEnv : RunCall → List AllocEvent → Prop} - {Run : Inputs → RunAnswer → Prop} - (hFs : AllocContractsFsPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliExternsPlaced mmpl W)) - (hio : MainIoPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliExternsPlaced mmpl W) cliIo hookStack) - (hioBounded : MainIoBoundedPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliExternsPlaced mmpl W) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) : - B2MainRemainingHops CodeOk mmpl (cliExternsPlaced mmpl) W brkStart lim γ tp - (B2St1Cap fineCostModel lim cliIo uuidTryParse RunEnv Run) - (B2St2Cap fineCostModel lim cliIo RunEnv Run) - (B2St3Cap fineCostModel lim cliIo RunEnv Run) - (B2St4Cap fineCostModel lim) - (B2St5Cap fineCostModel lim) - RunEnv Run := - b2MainRemainingHopsCap_of_allocFs_and_io hFs hio hioBounded - (cliExternsPlaced_strlen mmpl W) - (cliExternsPlaced_fromUtf8 mmpl W) - (cliExternsPlaced_memrchr mmpl W) - (cliExternsPlaced_handleErrorMain mmpl W) - hstk - -theorem b2MainSpecTightNeedLocksFineAt_cliGhostExterns_of_runTight_and_budgetFitsCap_lsmpl - [LibsignalPlacement] - {CodeOk : Memory → Prop} [LsCodeInv CodeOk] - (mmpl : Obj.MultiPlacement) (ghOf : CliHooks → CliGhostHooks) (W : CliHooks) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} - {γ : GhostName} {tp : BitVec 64} {hookStack : Nat} - {RunEnv : RunCall → List AllocEvent → Prop} - {Run : Inputs → RunAnswer → Prop} - {inputsOf : Inputs → ProcessInputs} - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hfs_eq : ∀ i : Inputs, initFsState (inputsOf i) = initFsState (cliInputs i)) - (hparse : ∀ i a, Run i a → (parseArgs uuidTryParse (i.argv.map bytesOfString)).isSome) - (hG : CliGhostAllocHooks fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hio : MainIoPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack) - (hioBounded : MainIoBoundedPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : MainEntryBudgetFitsCap fineCostModel lim fineCostModel.init cliIo uuidTryParse - RunEnv Run) - (hrun : subroutine_ok - (mProgPlaced (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) (lsmpl.base 579) - (runSpecTightPlaced CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim RunEnv uuidTryParse Run cliWrOk cliResStack)) : - subroutine_ok - (cliProgExtPlacedAt lsmpl - (fun W' => cliGhostExterns (ghOf W') (cliExternsPlaced mmpl W')) 617 W) - (lsmpl.base 617) - (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim fineCostModel.init cliMainStk (cliStaticsPlacedAt lsmpl) Run inputsOf) := - b2MainSpecTightNeedLocksFineAt_of_runTight_and_budgetFitsCap_lsmpl - hlibc hfs_eq hparse - (allocContractsFsPlaced_of_hooks mmpl (ghOf W) W hG) - hio hioBounded - (cliGhostExterns_strlen mmpl (ghOf W) W) - (cliGhostExterns_fromUtf8_eq mmpl (ghOf W) W) - (cliGhostExterns_memrchr_eq mmpl (ghOf W) W) - (cliGhostExterns_handleErrorMain mmpl (ghOf W) W) - hstk hfitCap hrun - -theorem b2MainSpecTightNeedLocksFineAt_cliExterns_of_runTight_and_budgetFitsCap_lsmpl - [LibsignalPlacement] - {CodeOk : Memory → Prop} [LsCodeInv CodeOk] - (mmpl : Obj.MultiPlacement) (W : CliHooks) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} - {γ : GhostName} {tp : BitVec 64} {hookStack : Nat} - {RunEnv : RunCall → List AllocEvent → Prop} - {Run : Inputs → RunAnswer → Prop} - {inputsOf : Inputs → ProcessInputs} - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hfs_eq : ∀ i : Inputs, initFsState (inputsOf i) = initFsState (cliInputs i)) - (hparse : ∀ i a, Run i a → (parseArgs uuidTryParse (i.argv.map bytesOfString)).isSome) - (hFs : AllocContractsFsPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliExternsPlaced mmpl W)) - (hio : MainIoPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliExternsPlaced mmpl W) cliIo hookStack) - (hioBounded : MainIoBoundedPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliExternsPlaced mmpl W) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : MainEntryBudgetFitsCap fineCostModel lim fineCostModel.init cliIo uuidTryParse - RunEnv Run) - (hrun : subroutine_ok (mProgPlaced (cliExternsPlaced mmpl W)) (lsmpl.base 579) - (runSpecTightPlaced CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim RunEnv uuidTryParse Run cliWrOk cliResStack)) : - subroutine_ok (cliProgExtPlacedAt lsmpl (cliExternsPlaced mmpl) 617 W) (lsmpl.base 617) - (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim fineCostModel.init cliMainStk (cliStaticsPlacedAt lsmpl) Run inputsOf) := - b2MainSpecTightNeedLocksFineAt_of_runTight_and_budgetFitsCap_lsmpl - hlibc hfs_eq hparse hFs hio hioBounded - (cliExternsPlaced_strlen mmpl W) - (cliExternsPlaced_fromUtf8 mmpl W) - (cliExternsPlaced_memrchr mmpl W) - (cliExternsPlaced_handleErrorMain mmpl W) - hstk hfitCap hrun - -theorem mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCap - {mpl mmpl : Obj.MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - MainEntryBudgetFitsCap fineCostModel lim fineCostModel.init cliIo uuidTryParse - (RunEnv X W γ tp) - (pqScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemD2c_placed X W)))) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk lim := - mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap - hblk hext_nodup hCI CliHooks.utf8Err RunEnv hlibc - (fun W γ tp => by - letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup - exact allocContractsFsPlaced_of_hooks mmpl (ghOf W) W (hG W γ tp)) - hio hioBounded - (fun W => cliGhostExterns_strlen mmpl (ghOf W) W) - (fun W => cliGhostExterns_fromUtf8_eq mmpl (ghOf W) W) - (fun W => cliGhostExterns_memrchr_eq mmpl (ghOf W) W) - (fun W => cliGhostExterns_handleErrorMain mmpl (ghOf W) W) - hstk hfitCap hrun - -theorem mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCap - {mpl mmpl : Obj.MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - MainEntryBudgetFitsCap fineCostModel lim fineCostModel.init cliIo uuidTryParse - (RunEnv X W γ tp) - (pqScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemD2c_placed X W)))) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk lim := - mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap - hblk hext_nodup hCI CliHooks.utf8Err RunEnv hlibc - (fun W γ tp => by - letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup - exact allocContractsFsPlaced_of_hooks mmpl (ghOf W) W (hG W γ tp)) - hio hioBounded - (fun W => cliGhostExterns_strlen mmpl (ghOf W) W) - (fun W => cliGhostExterns_fromUtf8_eq mmpl (ghOf W) W) - (fun W => cliGhostExterns_memrchr_eq mmpl (ghOf W) W) - (fun W => cliGhostExterns_handleErrorMain mmpl (ghOf W) W) - hstk hfitCap hrun - -theorem mainOkCliExtPqB2NeedLocksPlacedAt_cliExterns_of_runTight_and_budgetFitsCap - {mpl mmpl : Obj.MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hFs : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @AllocContractsFsPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliExternsPlaced mmpl W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliExternsPlaced mmpl W) - cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliExternsPlaced mmpl W) - cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - MainEntryBudgetFitsCap fineCostModel lim fineCostModel.init cliIo uuidTryParse - (RunEnv X W γ tp) - (pqScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemD2c_placed X W)))) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliExternsPlaced mmpl W)) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl (cliExternsPlaced mmpl) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk lim := - mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap - hblk hext_nodup hCI CliHooks.utf8Err RunEnv hlibc - hFs hio hioBounded - (cliExternsPlaced_strlen mmpl) - (cliExternsPlaced_fromUtf8 mmpl) - (cliExternsPlaced_memrchr mmpl) - (cliExternsPlaced_handleErrorMain mmpl) - hstk hfitCap hrun - -theorem mainOkCliExtOverB2NeedLocksPlacedAt_cliExterns_of_runTight_and_budgetFitsCap - {mpl mmpl : Obj.MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hFs : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @AllocContractsFsPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliExternsPlaced mmpl W)) - (hio : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliExternsPlaced mmpl W) - cliIo hookStack) - (hioBounded : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliExternsPlaced mmpl W) - cliIo hookStack ReadStdinBoundedEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - MainEntryBudgetFitsCap fineCostModel lim fineCostModel.init cliIo uuidTryParse - (RunEnv X W γ tp) - (pqScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemD2c_placed X W)))) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliExternsPlaced mmpl W)) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl (cliExternsPlaced mmpl) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk lim := - mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap - hblk hext_nodup hCI CliHooks.utf8Err RunEnv hlibc - hFs hio hioBounded - (cliExternsPlaced_strlen mmpl) - (cliExternsPlaced_fromUtf8 mmpl) - (cliExternsPlaced_memrchr mmpl) - (cliExternsPlaced_handleErrorMain mmpl) - hstk hfitCap hrun - /-! ## `MainIoOfPlaced` and `MainEntryBudgetFitsCapOf` specializations -/ theorem mainIoOfPlaced_cliExterns_of_readSubroutines [LibsignalPlacement] {M : AllocCostModel} @@ -2011,275 +1628,4 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf (hstrlen W) (hutf8 W) (hmemrchr W) (hpan W) hstk (hfitCap h547 X W γ tp) (hrun h547 X W γ tp) -theorem b2MainRemainingHopsCapOf_cliGhostExterns_of_hooks [LibsignalPlacement] - {CodeOk : Memory → Prop} [LsCodeInv CodeOk] - (mmpl : Obj.MultiPlacement) (ghOf : CliHooks → CliGhostHooks) (W : CliHooks) - {brkStart : BitVec 64} {lim : BudgetLimits} {γ : GhostName} {tp : BitVec 64} - {hookStack : Nat} - {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} - {RunEnv : RunCall → List AllocEvent → Prop} - {Run : Inputs → RunAnswer → Prop} - (hG : CliGhostAllocHooks fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hioOf : MainIoOfPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack - ReadStdinBoundedEnv ReadEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) : - B2MainRemainingHops CodeOk mmpl - (fun W' => cliGhostExterns (ghOf W') (cliExternsPlaced mmpl W')) W brkStart lim γ tp - (B2St1CapOf fineCostModel lim cliIo ReadEnv uuidTryParse RunEnv Run) - (B2St2CapOf fineCostModel lim cliIo ReadEnv RunEnv Run) - (B2St3Cap fineCostModel lim cliIo RunEnv Run) - (B2St4Cap fineCostModel lim) - (B2St5Cap fineCostModel lim) - RunEnv Run := - b2MainRemainingHopsCapOf_of_allocFs_and_io - (allocContractsFsPlaced_of_hooks mmpl (ghOf W) W hG) - hioOf - (cliGhostExterns_strlen mmpl (ghOf W) W) - (cliGhostExterns_fromUtf8_eq mmpl (ghOf W) W) - (cliGhostExterns_memrchr_eq mmpl (ghOf W) W) - (cliGhostExterns_handleErrorMain mmpl (ghOf W) W) - hstk - -theorem b2MainSpecTightNeedLocksFineAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_lsmpl - [LibsignalPlacement] - {CodeOk : Memory → Prop} [LsCodeInv CodeOk] - (mmpl : Obj.MultiPlacement) (ghOf : CliHooks → CliGhostHooks) (W : CliHooks) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} - {γ : GhostName} {tp : BitVec 64} {hookStack : Nat} - {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} - {RunEnv : RunCall → List AllocEvent → Prop} - {Run : Inputs → RunAnswer → Prop} - {inputsOf : Inputs → ProcessInputs} - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hfs_eq : ∀ i : Inputs, initFsState (inputsOf i) = initFsState (cliInputs i)) - (hparse : ∀ i a, Run i a → (parseArgs uuidTryParse (i.argv.map bytesOfString)).isSome) - (hG : CliGhostAllocHooks fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hioOf : MainIoOfPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack - ReadStdinBoundedEnv ReadEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : MainEntryBudgetFitsCapOf fineCostModel lim fineCostModel.init cliIo ReadEnv - uuidTryParse RunEnv Run) - (hrun : subroutine_ok - (mProgPlaced (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) (lsmpl.base 579) - (runSpecTightPlaced CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim RunEnv uuidTryParse Run cliWrOk cliResStack)) : - subroutine_ok - (cliProgExtPlacedAt lsmpl - (fun W' => cliGhostExterns (ghOf W') (cliExternsPlaced mmpl W')) 617 W) - (lsmpl.base 617) - (b2MainSpecTightNeedLocksFineAt libcAddr CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim fineCostModel.init cliMainStk (cliStaticsPlacedAt lsmpl) Run inputsOf) := - b2MainSpecTightNeedLocksFineAt_of_runTight_and_budgetFitsCapOf_lsmpl - hlibc hfs_eq hparse - (allocContractsFsPlaced_of_hooks mmpl (ghOf W) W hG) - hioOf - (cliGhostExterns_strlen mmpl (ghOf W) W) - (cliGhostExterns_fromUtf8_eq mmpl (ghOf W) W) - (cliGhostExterns_memrchr_eq mmpl (ghOf W) W) - (cliGhostExterns_handleErrorMain mmpl (ghOf W) W) - hstk hfitCap hrun - -theorem mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf - {mpl mmpl : Obj.MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} - {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack - ReadStdinBoundedEnv ReadEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - MainEntryBudgetFitsCapOf fineCostModel lim fineCostModel.init cliIo ReadEnv uuidTryParse - (RunEnv X W γ tp) - (pqScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemD2c_placed X W)))) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk lim := - mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf - hblk hext_nodup hCI CliHooks.utf8Err RunEnv hlibc - (fun W γ tp => by - letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup - exact allocContractsFsPlaced_of_hooks mmpl (ghOf W) W (hG W γ tp)) - hioOf - (fun W => cliGhostExterns_strlen mmpl (ghOf W) W) - (fun W => cliGhostExterns_fromUtf8_eq mmpl (ghOf W) W) - (fun W => cliGhostExterns_memrchr_eq mmpl (ghOf W) W) - (fun W => cliGhostExterns_handleErrorMain mmpl (ghOf W) W) - hstk hfitCap hrun - -theorem mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf - {mpl mmpl : Obj.MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} - {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel (fineHookRustCliAllocBudget γ mmpl tp brkStart) - lim (ghOf W)) - (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack - ReadStdinBoundedEnv ReadEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - MainEntryBudgetFitsCapOf fineCostModel lim fineCostModel.init cliIo ReadEnv uuidTryParse - (RunEnv X W γ tp) - (pqScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemD2c_placed X W)))) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk lim := - mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf - hblk hext_nodup hCI CliHooks.utf8Err RunEnv hlibc - (fun W γ tp => by - letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup - exact allocContractsFsPlaced_of_hooks mmpl (ghOf W) W (hG W γ tp)) - hioOf - (fun W => cliGhostExterns_strlen mmpl (ghOf W) W) - (fun W => cliGhostExterns_fromUtf8_eq mmpl (ghOf W) W) - (fun W => cliGhostExterns_memrchr_eq mmpl (ghOf W) W) - (fun W => cliGhostExterns_handleErrorMain mmpl (ghOf W) W) - hstk hfitCap hrun - -theorem mainOkCliExtPqB2NeedLocksPlacedAt_cliExterns_of_runTight_and_budgetFitsCapOf - {mpl mmpl : Obj.MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} - {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hFs : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @AllocContractsFsPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliExternsPlaced mmpl W)) - (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliExternsPlaced mmpl W) - cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - MainEntryBudgetFitsCapOf fineCostModel lim fineCostModel.init cliIo ReadEnv uuidTryParse - (RunEnv X W γ tp) - (pqScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemD2c_placed X W)))) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliExternsPlaced mmpl W)) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl (cliExternsPlaced mmpl) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk lim := - mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf - hblk hext_nodup hCI CliHooks.utf8Err RunEnv hlibc - hFs hioOf - (cliExternsPlaced_strlen mmpl) - (cliExternsPlaced_fromUtf8 mmpl) - (cliExternsPlaced_memrchr mmpl) - (cliExternsPlaced_handleErrorMain mmpl) - hstk hfitCap hrun - -theorem mainOkCliExtOverB2NeedLocksPlacedAt_cliExterns_of_runTight_and_budgetFitsCapOf - {mpl mmpl : Obj.MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} - {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hFs : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @AllocContractsFsPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliExternsPlaced mmpl W)) - (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (cliExternsPlaced mmpl W) - cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - MainEntryBudgetFitsCapOf fineCostModel lim fineCostModel.init cliIo ReadEnv uuidTryParse - (RunEnv X W γ tp) - (pqScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemD2c_placed X W)))) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliExternsPlaced mmpl W)) - (mpl.base 579) - (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl (cliExternsPlaced mmpl) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk lim := - mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf - hblk hext_nodup hCI CliHooks.utf8Err RunEnv hlibc - hFs hioOf - (cliExternsPlaced_strlen mmpl) - (cliExternsPlaced_fromUtf8 mmpl) - (cliExternsPlaced_memrchr mmpl) - (cliExternsPlaced_handleErrorMain mmpl) - hstk hfitCap hrun - end LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInst diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/M24/MainEntryBudgetFitsInstSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/M24/MainEntryBudgetFitsInstSat.lean index 572d3849c..5821ddb23 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/M24/MainEntryBudgetFitsInstSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/M24/MainEntryBudgetFitsInstSat.lean @@ -17,6 +17,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat public import LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInst -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AddressA1PlacedBudgetSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.M2PlacedBudgetSat -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget -- proof-setup: allow-public-import import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic @@ -52,20 +53,21 @@ open CryptoVerification.LibsignalTripleRatchet (doReserveStackX extHookStack finishGrowStackX) open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) open CryptoVerification.SignalSession - (CliHooks CliPqxdhInputs Inputs cliProcessInputs fromUtf8Hook libsignalSessionLib + (CliHooks CliPqxdhInputs Inputs cliExternsPlaced cliProcessInputs fromUtf8Hook libsignalSessionLib lsFromUtf8Sym lsMemrchrSym strlenHook) open CryptoVerification.SignalSession.Cli (RunAnswer cliInputs) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) open CryptoVerification.SignalSession.Cli.Placed (lsProg_588) open CryptoVerification.SignalSession.Cli.Main.Placed (lsProg_617) open CryptoVerification.SignalSession.Cli.MainHops (LsCodeInv RunCall cliIo cliMainStk cliResStack cliWrOk cli_hstk64 cli_resStack_callees fromUtf8AsciiSpec fromUtf8Hook_ok lsHandleErrorSymMain mProgPlaced mainFrameSize - memrchrSpec parseArgs strlenHook_ok) + memrchrSpec parseArgs) open CryptoVerification.SignalSession.Cli.RunCompose (RunSem runRel) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits RustCliAllocBudget) open LibsignalBinary.Heap.Fine - (fineCostModel fineHookRustCliAllocBudget fromUtf8Hook_vmPreserved strlenHook_vmPreserved) + (fineCostModel fineHookRustCliAllocBudget fromUtf8Hook_vmPreserved) open LibsignalBinary.Heap.SpecBudget (hookSat_withVmPreserved withVmPreserved) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) open LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad @@ -86,7 +88,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInst (B2St1Cap B2St1CapOf B2St2Cap B2St2CapOf B2St3Cap B2St4Cap B2St5Cap MainEntryBudgetFitsCap MainEntryBudgetFitsCapOf b2St0Cap_init b2St01_of_mainEntryBudgetFitsCap b2St01_of_mainEntryBudgetFitsCapOf - domScopedRun) + cliGhostExterns_handleErrorMain domScopedRun) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced (MainIoBoundedPlaced MainIoOfPlaced ReadStdinBoundedEnv) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainOkCliExtB2NeedLocksInst @@ -113,6 +115,11 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.Reserve11PlacedBudget (allocNoOomExtern_fs_rocl reserve16_placed_ok reserve1_placed_ok) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.TryAllocateIn3PlacedBudget (tryAllocateIn3_placed_okFs_of_hooks_at) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget + (CliGhostAllocHooks allocContractsFsPlaced_of_hooks + cliGhostExterns_fromUtf8RO_budget_sat cliGhostExterns_fromUtf8_budget_sat + cliGhostExterns_memrchrRO_budget_sat cliGhostExterns_memrchr_budget_sat + cliGhostExterns_strlenRO_budget_sat) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsFsPlaced MainIoPlaced) open VerifiedLibraries.Mallocng (mallocngAddrsOfPlacement) @@ -142,12 +149,11 @@ theorem hookSat_strlenRO_of_eq {H : LibsignalHooks} (hookStack : Nat) hookSat_strlenHook_ro_sat hstrlen /-- `HookSat` sibling of `mainCalleesBlk617_of_allocFs_and_hooks` - (`MainEntryBudgetFitsInst.lean:353`), dropping unused `err`. -/ + (`MainEntryBudgetFitsInst.lean:353`), dropping unused `err` and dead `hstrlen`. -/ theorem mainCalleesBlk617_of_allocFs_and_hooks_sat [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} {hookStack resStack : Nat} (hFs : AllocContractsFsPlaced A lim H) - (hstrlen : H "strlen" = some strlenHook) (hutf8 : HookSat H lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hmemrchr : HookSat H lsMemrchrSym (withLsRet (withVmPreserved (memrchrSpec extHookStack)))) (hpan : H lsHandleErrorSymMain = some Rust.panicked) @@ -158,11 +164,6 @@ theorem mainCalleesBlk617_of_allocFs_and_hooks_sat [LibsignalPlacement] MainCalleesBlk617 A lim H uuidTryParse hookStack resStack where alloc := allocContractsFsPlaced_toAllocContractsX hFs allocFs := hFs - strlen := ls_hook_placed_rocl_ok_local <| - hookSat_withVmPreserved ⟨strlenHook, hstrlen, strlenHook_ok hookStack⟩ - (fun f hf s => by - cases hstrlen.symm.trans hf - exact strlenHook_vmPreserved s) fromUtf8 := ls_hook_placed_rocl_ok_local hutf8 address := address_placed_ok_a1_of_hooks_sat hFs hmemrchr haddr hres64 reserve16 := reserve16_placed_ok hFs hdr hpan @@ -182,12 +183,11 @@ theorem mainCalleesBlk617_of_allocFs_and_hooks_cliResStack_sat [LibsignalPlaceme {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} {hookStack : Nat} (hFs : AllocContractsFsPlaced A lim H) - (hstrlen : H "strlen" = some strlenHook) (hutf8 : HookSat H lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hmemrchr : HookSat H lsMemrchrSym (withLsRet (withVmPreserved (memrchrSpec extHookStack)))) (hpan : H lsHandleErrorSymMain = some Rust.panicked) : MainCalleesBlk617 A lim H uuidTryParse hookStack cliResStack := - mainCalleesBlk617_of_allocFs_and_hooks_sat hFs hstrlen hutf8 hmemrchr hpan + mainCalleesBlk617_of_allocFs_and_hooks_sat hFs hutf8 hmemrchr hpan cli_resStack_callees.1 cli_resStack_callees.2.1 cli_resStack_callees.2.2.1 cli_resStack_callees.2.2.2 @@ -204,7 +204,6 @@ theorem b2MainRemainingHopsCap_of_allocFs_and_io_sat [LibsignalPlacement] (hio : MainIoPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack) (hioBounded : MainIoBoundedPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ext W "strlen" = some strlenHook) (hutf8 : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hutf8RO : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) (hmemrchr : HookSat (ext W) lsMemrchrSym (withLsRet (withVmPreserved (memrchrSpec extHookStack)))) @@ -218,9 +217,9 @@ theorem b2MainRemainingHopsCap_of_allocFs_and_io_sat [LibsignalPlacement] (B2St4Cap fineCostModel lim) (B2St5Cap fineCostModel lim) RunEnv Run := - let hc := mainCalleesBlk617_of_allocFs_and_hooks_cliResStack_sat hFs hstrlen hutf8 hmemrchr hpan + let hc := mainCalleesBlk617_of_allocFs_and_hooks_cliResStack_sat hFs hutf8 hmemrchr hpan { step2 := - b2_step2_pool_placed_of_hooks_sat hc hstrlen hutf8RO hmemrchrRO + b2_step2_pool_placed_of_hooks_sat hc hutf8RO hmemrchrRO cli_resStack_callees.2.2.1 cli_resStack_callees.2.2.2 hstk cli_hstk64 (fun hst1 _ _ => hst1.1) (fun hst1 _ _ hevs_c hvcap hp => hst1.2 _ _ _ hevs_c hvcap hp) @@ -271,7 +270,6 @@ theorem b2MainRemainingHopsCapOf_of_allocFs_and_io_sat [LibsignalPlacement] (hFs : AllocContractsFsPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W)) (hioOf : MainIoOfPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstrlen : ext W "strlen" = some strlenHook) (hutf8 : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hutf8RO : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) (hmemrchr : HookSat (ext W) lsMemrchrSym (withLsRet (withVmPreserved (memrchrSpec extHookStack)))) @@ -285,9 +283,9 @@ theorem b2MainRemainingHopsCapOf_of_allocFs_and_io_sat [LibsignalPlacement] (B2St4Cap fineCostModel lim) (B2St5Cap fineCostModel lim) RunEnv Run := - let hc := mainCalleesBlk617_of_allocFs_and_hooks_cliResStack_sat hFs hstrlen hutf8 hmemrchr hpan + let hc := mainCalleesBlk617_of_allocFs_and_hooks_cliResStack_sat hFs hutf8 hmemrchr hpan { step2 := - b2_step2_pool_placed_of_hooks_sat hc hstrlen hutf8RO hmemrchrRO + b2_step2_pool_placed_of_hooks_sat hc hutf8RO hmemrchrRO cli_resStack_callees.2.2.1 cli_resStack_callees.2.2.2 hstk cli_hstk64 (fun hst1 _ _ => hst1.1) (fun hst1 _ _ hevs_c hvcap hp => hst1.2 _ _ _ hevs_c hvcap hp) @@ -329,8 +327,7 @@ theorem b2MainRemainingHopsCapOf_of_allocFs_and_io_sat [LibsignalPlacement] /-- `HookSat` sibling of `b2MainSpecTightNeedLocksFineAt_of_runTight_and_budgetFitsCap_lsmpl` (`MainEntryBudgetFitsInst.lean:962`), routing `step1` through `HookSat … strlenSpecROSat` - into SWAR-padded `b2MainSpecTightNeedLocksFineAtPad` while retaining dead `hstrlen` for - `MainCalleesBlk617.strlen`. -/ + into SWAR-padded `b2MainSpecTightNeedLocksFineAtPad`. -/ theorem b2MainSpecTightNeedLocksFineAt_of_runTight_and_budgetFitsCap_lsmpl_sat [LibsignalPlacement] {CodeOk : Memory → Prop} [LsCodeInv CodeOk] {mmpl : Obj.MultiPlacement} {ext : CliHooks → String → Option (State → State)} @@ -346,7 +343,6 @@ theorem b2MainSpecTightNeedLocksFineAt_of_runTight_and_budgetFitsCap_lsmpl_sat [ (hio : MainIoPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack) (hioBounded : MainIoBoundedPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ext W "strlen" = some strlenHook) (hstrlenRO : HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hutf8RO : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) @@ -369,7 +365,7 @@ theorem b2MainSpecTightNeedLocksFineAt_of_runTight_and_budgetFitsCap_lsmpl_sat [ (b2St01_of_mainEntryBudgetFitsCap hfitCap) hrun (b2MainRemainingHopsCap_of_allocFs_and_io_sat - hFs hio hioBounded hstrlen hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk) + hFs hio hioBounded hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk) /-- `HookSat` sibling of `b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCap_lsmpl` (`MainEntryBudgetFitsInst.lean:1043`). -/ @@ -388,7 +384,6 @@ theorem b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCap_lsmp (hio : MainIoPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack) (hioBounded : MainIoBoundedPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ext W "strlen" = some strlenHook) (hstrlenRO : HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hutf8RO : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) @@ -412,7 +407,7 @@ theorem b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCap_lsmp (b2St01_of_mainEntryBudgetFitsCap hfitCap) hrun (b2MainRemainingHopsCap_of_allocFs_and_io_sat - hFs hio hioBounded hstrlen hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk) + hFs hio hioBounded hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk) /-- `HookSat` sibling of `b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCap_placed` (`MainEntryBudgetFitsInst.lean:1083`). -/ @@ -438,7 +433,6 @@ theorem b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCap_plac (hioBounded : @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ext W "strlen" = some strlenHook) (hstrlenRO : HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hutf8RO : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) @@ -466,7 +460,7 @@ theorem b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCap_plac letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup letI : LsCodeInv CodeOk := hCI exact b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCap_lsmpl_sat Dom S - hlibc hfs_eq hFs hio hioBounded hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan + hlibc hfs_eq hFs hio hioBounded hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk hfitCap hrun /-- `HookSat` sibling of `mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap` @@ -494,7 +488,6 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap_sat @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -534,7 +527,7 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap_sat (cliRunSemD2c_placed X W) hlibc initFsState_cliProcessInputs_eq (hFs W γ tp) (hio W γ tp) (hioBounded W γ tp) - (hstrlen W) (hstrlenRO W) (hutf8 W) (hutf8RO W) (hmemrchr W) (hmemrchrRO W) (hpan W) hstk + (hstrlenRO W) (hutf8 W) (hutf8RO W) (hmemrchr W) (hmemrchrRO W) (hpan W) hstk (hfitCap h547 X W γ tp) (hrun h547 X W γ tp) /-- `HookSat` sibling of `mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap` @@ -562,7 +555,6 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap_sat @MainIoBoundedPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -602,7 +594,7 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCap_sat (cliRunSemD2c_placed X W) hlibc initFsState_cliProcessInputs_eq (hFs W γ tp) (hio W γ tp) (hioBounded W γ tp) - (hstrlen W) (hstrlenRO W) (hutf8 W) (hutf8RO W) (hmemrchr W) (hmemrchrRO W) (hpan W) hstk + (hstrlenRO W) (hutf8 W) (hutf8RO W) (hmemrchr W) (hmemrchrRO W) (hpan W) hstk (hfitCap h547 X W γ tp) (hrun h547 X W γ tp) /-- `HookSat` sibling of `b2MainSpecTightNeedLocksFineAt_of_runTight_and_budgetFitsCapOf_lsmpl` @@ -622,7 +614,6 @@ theorem b2MainSpecTightNeedLocksFineAt_of_runTight_and_budgetFitsCapOf_lsmpl_sat (hFs : AllocContractsFsPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W)) (hioOf : MainIoOfPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstrlen : ext W "strlen" = some strlenHook) (hstrlenRO : HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hutf8RO : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) @@ -645,7 +636,7 @@ theorem b2MainSpecTightNeedLocksFineAt_of_runTight_and_budgetFitsCapOf_lsmpl_sat (b2St01_of_mainEntryBudgetFitsCapOf hfitCap) hrun (b2MainRemainingHopsCapOf_of_allocFs_and_io_sat - hFs hioOf hstrlen hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk) + hFs hioOf hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk) /-- `HookSat` sibling of `b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_lsmpl` (`MainEntryBudgetFitsInst.lean:1929`). -/ @@ -664,7 +655,6 @@ theorem b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_ls (hFs : AllocContractsFsPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W)) (hioOf : MainIoOfPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstrlen : ext W "strlen" = some strlenHook) (hstrlenRO : HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hutf8RO : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) @@ -688,7 +678,7 @@ theorem b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_ls (b2St01_of_mainEntryBudgetFitsCapOf hfitCap) hrun (b2MainRemainingHopsCapOf_of_allocFs_and_io_sat - hFs hioOf hstrlen hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk) + hFs hioOf hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk) /-- `HookSat` sibling of `b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_placed` (`MainEntryBudgetFitsInst.lean:1969`). -/ @@ -713,7 +703,6 @@ theorem b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_pl (hioOf : @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstrlen : ext W "strlen" = some strlenHook) (hstrlenRO : HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hutf8RO : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) @@ -741,7 +730,7 @@ theorem b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_pl letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup letI : LsCodeInv CodeOk := hCI exact b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_lsmpl_sat Dom S - hlibc hfs_eq hFs hioOf hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk hfitCap hrun + hlibc hfs_eq hFs hioOf hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk hfitCap hrun /-- `HookSat` sibling of `mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf` (`MainEntryBudgetFitsInst.lean:2016`), dropping `errOf` and re-anchoring to @@ -766,7 +755,6 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_sat @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -806,7 +794,7 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_sat (cliRunSemD2c_placed X W) hlibc initFsState_cliProcessInputs_eq (hFs W γ tp) (hioOf W γ tp) - (hstrlen W) (hstrlenRO W) (hutf8 W) (hutf8RO W) (hmemrchr W) (hmemrchrRO W) (hpan W) hstk + (hstrlenRO W) (hutf8 W) (hutf8RO W) (hmemrchr W) (hmemrchrRO W) (hpan W) hstk (hfitCap h547 X W γ tp) (hrun h547 X W γ tp) /-- `HookSat` sibling of `mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf` @@ -832,7 +820,6 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_sat @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -872,7 +859,153 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_sat (cliRunSemD2c_placed X W) hlibc initFsState_cliProcessInputs_eq (hFs W γ tp) (hioOf W γ tp) - (hstrlen W) (hstrlenRO W) (hutf8 W) (hutf8RO W) (hmemrchr W) (hmemrchrRO W) (hpan W) hstk + (hstrlenRO W) (hutf8 W) (hutf8RO W) (hmemrchr W) (hmemrchrRO W) (hpan W) hstk (hfitCap h547 X W γ tp) (hrun h547 X W γ tp) +/-- `toSat` bridge for `mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf` + (`MainEntryBudgetFitsInst.lean:2087`), discharging `strlen`, `from_utf8`, and `memrchr` via + `ExtraSpecOk` and re-anchoring to `MainOkCliExtPqB2NeedLocksPadPlacedAt`. -/ +theorem mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_via_sat + {mpl mmpl : Obj.MultiPlacement} + (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → + (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) + (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) + {CodeOk : Memory → Prop} + (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) + (ghOf : CliHooks → CliGhostHooks) + {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} + {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} + (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → + RunCall → List AllocEvent → Prop) + (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) + (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel + (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ghOf W)) + (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ + (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim + (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack + ReadStdinBoundedEnv ReadEnv) + (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) + (hfitCap : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + MainEntryBudgetFitsCapOf fineCostModel lim fineCostModel.init cliIo ReadEnv uuidTryParse + (RunEnv X W γ tp) + (pqScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemD2c_placed X W)))) + (hrun : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @subroutine_ok _ + (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) + (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) + (mpl.base 579) + (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) + (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk + (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse + (runRel (cliRunSemD2c_placed X W)) + cliWrOk cliResStack)) : + MainOkCliExtPqB2NeedLocksPadPlacedAt mpl mmpl + (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk + libcAddr brkStart cliMainStk lim := + mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_sat + hblk hext_nodup hCI RunEnv hlibc + (fun W γ tp => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact allocContractsFsPlaced_of_hooks mmpl (ghOf W) W (hG W γ tp)) + hioOf + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_strlenRO_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk hookStack) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_fromUtf8_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk hookStack) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_fromUtf8RO_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk hookStack) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_memrchr_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk (Nat.le_refl extHookStack) (by decide)) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_memrchrRO_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk (Nat.le_refl extHookStack) (by decide)) + (fun W => cliGhostExterns_handleErrorMain mmpl (ghOf W) W) + hstk hfitCap hrun + +/-- `toSat` bridge for `mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf` + (`MainEntryBudgetFitsInst.lean:2140`), discharging `strlen`, `from_utf8`, and `memrchr` via + `ExtraSpecOk` and re-anchoring to `MainOkCliExtOverB2NeedLocksPadPlacedAt`. -/ +theorem mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_via_sat + {mpl mmpl : Obj.MultiPlacement} + (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → + (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) + (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) + {CodeOk : Memory → Prop} + (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) + (ghOf : CliHooks → CliGhostHooks) + {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} + {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} + (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → + RunCall → List AllocEvent → Prop) + (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) + (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel + (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ghOf W)) + (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @MainIoOfPlaced (libsignalPlacementOf mpl hblk hext_nodup) _ + (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim + (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack + ReadStdinBoundedEnv ReadEnv) + (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) + (hfitCap : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + MainEntryBudgetFitsCapOf fineCostModel lim fineCostModel.init cliIo ReadEnv uuidTryParse + (RunEnv X W γ tp) + (pqScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemD2c_placed X W)))) + (hrun : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @subroutine_ok _ + (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) + (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) + (mpl.base 579) + (@runSpecTightPlaced (libsignalPlacementOf mpl hblk hext_nodup) + (libsignalPlacementOf mpl hblk hext_nodup) _ CodeOk + (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse + (runRel (cliRunSemD2c_placed X W)) + cliWrOk cliResStack)) : + MainOkCliExtOverB2NeedLocksPadPlacedAt mpl mmpl + (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk + libcAddr brkStart cliMainStk lim := + mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_sat + hblk hext_nodup hCI RunEnv hlibc + (fun W γ tp => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact allocContractsFsPlaced_of_hooks mmpl (ghOf W) W (hG W γ tp)) + hioOf + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_strlenRO_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk hookStack) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_fromUtf8_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk hookStack) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_fromUtf8RO_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk hookStack) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_memrchr_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk (Nat.le_refl extHookStack) (by decide)) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_memrchrRO_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk (Nat.le_refl extHookStack) (by decide)) + (fun W => cliGhostExterns_handleErrorMain mmpl (ghOf W) W) + hstk hfitCap hrun + end LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInstSat diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/HopsPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/HopsPlacedBudget.lean index 4691f7a19..60e8589e6 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/HopsPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/HopsPlacedBudget.lean @@ -36,7 +36,7 @@ open CryptoVerification.SignalSession.Cli (RunAnswer) open CryptoVerification.SignalSession.Cli.Main.Placed (lsProg_617) open CryptoVerification.SignalSession.Cli.MainHops (AtRetPlaced RunCall fromUtf8AsciiSpec lsHandleErrorSymMain mProgPlaced mainFrameSize mainOom - mainSaved strlenSpec) + mainSaved) namespace LibsignalBinary.Proofs.SignalSession.Cli.Main.HopsPlacedBudget @@ -70,8 +70,6 @@ structure MainCalleesBlk617 [LibsignalPlacement] {M : AllocCostModel} (uuidParse : UuidParser) (hookStack resStack : Nat) : Prop where alloc : AllocContractsXCliPlaced A lim H allocFs : AllocContractsFsPlaced A lim H - strlen : subroutine_ok (lsProg_617 H) (lsρ "strlen") - (withLsRoCl lsmpl (withVmPreserved (strlenSpec hookStack))) fromUtf8 : subroutine_ok (lsProg_617 H) (lsρ lsFromUtf8Sym) (withLsRoCl lsmpl (withVmPreserved (fromUtf8AsciiSpec hookStack))) address : subroutine_ok (lsProg_617 H) (lsmpl.base 580) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/IoHooksPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/IoHooksPlaced.lean index 314b7bc01..0427be7d7 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/IoHooksPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/IoHooksPlaced.lean @@ -257,17 +257,12 @@ theorem readStdinHook_ok_placed (stk : Nat) : theorem cliExternsPlaced_writeFile (mmpl : Obj.MultiPlacement) (W : CliHooks) : cliExternsPlaced mmpl W lsWriteFileSym = some writeFileHook := main_cliExternsPlaced_row mmpl W - (List.mem_append_right _ (List.mem_of_getElem? (i := 3) rfl)) + (List.mem_append_right _ (List.mem_of_getElem? (i := 0) rfl)) theorem cliExternsPlaced_writeStdout (mmpl : Obj.MultiPlacement) (W : CliHooks) : cliExternsPlaced mmpl W lsWriteStdoutSym = some writeStdoutHook := main_cliExternsPlaced_row mmpl W - (List.mem_append_right _ (List.mem_of_getElem? (i := 4) rfl)) - -theorem cliExternsPlaced_memrchr (mmpl : Obj.MultiPlacement) (W : CliHooks) : - cliExternsPlaced mmpl W lsMemrchrSym = some memrchrHook := - main_cliExternsPlaced_row mmpl W - (List.mem_append_right _ (List.mem_of_getElem? (i := 5) rfl)) + (List.mem_append_right _ (List.mem_of_getElem? (i := 1) rfl)) theorem writeFile_rocl_ok_of_lookup [LibsignalPlacement] {H : LibsignalHooks} (stk : Nat) (hLookup : H lsWriteFileSym = some writeFileHook) : diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AddressA1Placed.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AddressA1Placed.lean index 1be7a901a..8554da78a 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AddressA1Placed.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AddressA1Placed.lean @@ -77,19 +77,4 @@ theorem address_placed_ok_a1_of_hooks [LibsignalPlacement] {A : RustAlloc} exact ls_hook_ok_ultra_of_mem hsat (by decide) exact subroutine_ok_rocl_of_plain hplain -theorem address_placed_ok_a1 [LibsignalPlacement] {A : RustAlloc} - (mmpl : Obj.MultiPlacement) (W : CliHooks) - (hFs : AllocContractsFsPlaced A (cliExternsPlaced mmpl W)) {resStack : Nat} - (hres : 0xB0 + extHookStack ≤ resStack) (hres64 : resStack ≤ 2 ^ 63) : - subroutine_ok (lsProg_617 (cliExternsPlaced mmpl W)) (lsmpl.base 580) - (withLsRoCl lsmpl (addressSpec A uuidTryParse resStack)) := - address_placed_ok_a1_of_hooks - hFs - (by - simp only [cliExternsPlaced, lsHandleErrorSym580, isCliPanicSymbolPlaced, - cliPanicSymbolsPlaced, List.contains_cons, beq_self_eq_true, Bool.true_or, Bool.or_true, - ↓reduceIte]) - (cliExternsPlaced_memrchr mmpl W) - hres hres64 - end CryptoVerification.SignalSession.Cli.MainHops diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AddressA1PlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AddressA1PlacedBudget.lean index b8bc68f2e..3b668ebb5 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AddressA1PlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AddressA1PlacedBudget.lean @@ -45,11 +45,11 @@ open CryptoVerification.LibsignalTripleRatchet (extHookStack) open CryptoVerification.LibsignalPublicApi.StoreKit (subroutine_ok_rocl_of_withLsCodeRoLoaded subroutine_ok_withLsCodeRoLoaded_of_plain withLsRoCl) open CryptoVerification.SignalSession - (CliHooks cliExternsPlaced lsMemrchrSym memrchrHook unmodelled) + (lsMemrchrSym memrchrHook unmodelled) open CryptoVerification.SignalSession.Cli.Placed (lsProg_580) open CryptoVerification.SignalSession.Cli.Main.Placed (lsProg_617) open CryptoVerification.SignalSession.Cli.MainHops - (cliExternsPlaced_memrchr memrchrHook_ok memrchrSpec) + (memrchrHook_ok memrchrSpec) open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) open LibsignalBinary.Heap.SpecBudget (hookSat_withVmPreserved withVmPreserved) open LibsignalBinary.Proofs.Placed.BudgetVmSteps @@ -130,14 +130,4 @@ theorem address_placed_ok_a1_rocl_of_hooks [LibsignalPlacement] {prog : Program} exact ls_hook_ok_ultra_of_mem hsat_vm (by decide) exact subroutine_ok_rocl_of_plain hplain -theorem address_placed_ok_a1 [LibsignalPlacement] - {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} - (mmpl : Obj.MultiPlacement) (W : CliHooks) - (hFs : AllocContractsFsPlaced A lim (cliExternsPlaced mmpl W)) - {resStack : Nat} - (hres : 0xB0 + extHookStack ≤ resStack) (hres64 : resStack ≤ 2 ^ 63) : - subroutine_ok (lsProg_617 (cliExternsPlaced mmpl W)) (lsmpl.base 580) - (withLsRoCl lsmpl (addressSpec A lim uuidTryParse resStack)) := - address_placed_ok_a1_of_hooks hFs (cliExternsPlaced_memrchr mmpl W) hres hres64 - end LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AddressA1PlacedBudget diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsA1Placed.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsA1Placed.lean index 8515ce401..b222972da 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsA1Placed.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsA1Placed.lean @@ -37,7 +37,7 @@ open CryptoVerification.LibsignalTripleRatchetRepr CryptoVerification.LibsignalT open CryptoVerification.SignalSession CryptoVerification.SignalSession.Cli open CryptoVerification.SignalSession.Cli.Main.Placed -/-! ## `cliExternsPlaced` Row Lookups (`37` rows) and Block-`617` Stub Plumbing -/ +/-! ## `cliExternsPlaced` Row Lookups (`27` rows) and Block-`617` Stub Plumbing -/ private def mainHookKeysPlaced : List String := ["_RNvNtCsbvWyylYiyxg_4sha26sha51211compress512", @@ -58,25 +58,15 @@ private def mainHookKeysPlaced : List String := "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental26decapsulate_compressed_key", "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes", "_RNvCs65XVORQObL2_12libcrux_hmac4hmac", - "memmove", - "bcmp", - "strlen", lsWriteFileSym, lsWriteStdoutSym, - lsMemrchrSym, - lsFromUtf8Sym, lsFmtWriteSym, lsFormatInnerSym, - lsDurationSinceSym, - lsTimeAddSym, - lsBlackBoxSym, lsCompress256Sym, lsAesEncSym, lsAesDecSym, lsPubFromSecretSym, - lsDiffieHellmanSym, - lsStaticSecretDropSym, - lsSharedSecretDropSym] + lsDiffieHellmanSym] private theorem mainHookKeysPlaced_eq (mmpl : Obj.MultiPlacement) (W : CliHooks) : (cliHookTablePlaced mmpl W).map Prod.fst = mainHookKeysPlaced := rfl @@ -131,10 +121,6 @@ theorem cliExternsPlaced_memset_none (mmpl : Obj.MultiPlacement) (W : CliHooks) exact lookup_eq_none_of_not_mem_main _ memsetName (by rw [mainHookKeysPlaced_eq mmpl W]; decide) -theorem cliExternsPlaced_memmove (mmpl : Obj.MultiPlacement) (W : CliHooks) : - cliExternsPlaced mmpl W memmoveName = some hookMemmove := - main_cliExternsPlaced_row mmpl W (List.mem_append_right _ (List.mem_of_getElem? (i := 0) rfl)) - theorem cliExternsPlaced_memcpy_none (mmpl : Obj.MultiPlacement) (W : CliHooks) : cliExternsPlaced mmpl W memcpyName = none := by unfold cliExternsPlaced @@ -171,7 +157,6 @@ theorem AllocContractsFsPlaced.of_hooks [LibsignalPlacement] {A : RustAlloc} {H (hdealloc : H lsRustDeallocSymCli = some E2E.deallocHook) (hrealloc : H lsRustReallocSymCli = some E2E.reallocHook0) (hmemset : H memsetName = some hookMemset) - (hmemmove : H memmoveName = some hookMemmove) (hmemcpy : H memcpyName = some hookMemcpy) : AllocContractsFsPlaced A H where alloc := hook_stub_placed_ok halloc <| @@ -193,10 +178,6 @@ theorem AllocContractsFsPlaced.of_hooks [LibsignalPlacement] {A : RustAlloc} {H (hookOk_withStack hookMemcpy_region_ok stk).keepsFs hookMemcpy_fs session_memcpy_region stk _ _ := hook_stub_placed_ok hmemcpy <| (hookOk_withStack hookMemcpy_region_trace_ok stk).keepsFs hookMemcpy_fs - memmove stk _ _ := hook_stub_placed_ok hmemmove <| - (hookMemmove_ok stk).keepsFs hookMemmove_fs - session_memmove stk _ _ := hook_stub_placed_ok hmemmove <| - (hookMemmove_trace_ok stk).keepsFs hookMemmove_fs memset stk hle _ := hook_stub_placed_ok hmemset <| (hookMemset_ok stk (pos_of_extHookStack_le hle)).keepsFs hookMemset_fs session_memset stk hle _ := hook_stub_placed_ok hmemset <| @@ -217,7 +198,6 @@ theorem AllocContractsXCliPlaced.of_hooks [LibsignalPlacement] {A : RustAlloc} { (hdealloc : H lsRustDeallocSymCli = some E2E.deallocHook) (hrealloc : H lsRustReallocSymCli = some E2E.reallocHook0) (hmemset : H memsetName = some hookMemset) - (hmemmove : H memmoveName = some hookMemmove) (hmemcpy : H memcpyName = some hookMemcpy) : AllocContractsXCliPlaced A H where alloc := hook_stub_placed_ok halloc <| @@ -239,10 +219,6 @@ theorem AllocContractsXCliPlaced.of_hooks [LibsignalPlacement] {A : RustAlloc} { hookOk_withStack hookMemcpy_region_ok stk session_memcpy_region stk _ _ := hook_stub_placed_ok hmemcpy <| hookOk_withStack hookMemcpy_region_trace_ok stk - memmove stk _ _ := hook_stub_placed_ok hmemmove <| - hookMemmove_ok stk - session_memmove stk _ _ := hook_stub_placed_ok hmemmove <| - hookMemmove_trace_ok stk memset stk hle _ := hook_stub_placed_ok hmemset <| hookMemset_ok stk (pos_of_extHookStack_le hle) session_memset stk hle _ := hook_stub_placed_ok hmemset <| @@ -281,8 +257,6 @@ theorem AllocContractsFsPlaced.toAllocContractsX [LibsignalPlacement] {A : RustA memcpy_region stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.memcpy_region stk h1 h2) session_memcpy_region stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.session_memcpy_region stk h1 h2) - memmove stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.memmove stk h1 h2) - session_memmove stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.session_memmove stk h1 h2) memset stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.memset stk h1 h2) session_memset stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.session_memset stk h1 h2) memset_region stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.memset_region stk h1 h2) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsA1PlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsA1PlacedBudget.lean index cfd50a34b..2a4f669bf 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsA1PlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsA1PlacedBudget.lean @@ -38,31 +38,31 @@ open CryptoVerification.E2E (allocHook0 deallocHook reallocHook0) open CryptoVerification.LibsignalPublicApi.StoreKit (subroutine_ok_withLsCodeRoLoaded_of_plain withLsCodeRoLoaded) open CryptoVerification.LibsignalTripleRatchet - (extHookStack memcpyName memmoveName memsetName withStack) + (extHookStack memcpyName memsetName withStack) open CryptoVerification.SignalSession ( lsRustAllocSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli) open CryptoVerification.SignalSession.Cli.Main.Placed (lsProg_617) open CryptoVerification.SignalSession.Cli.MainHops (allocHook0_fs allocHookStack_le_extHookStack deallocHook_fs - extHookStack_le hookMemcpy_fs hookMemmove_fs hookMemset_fs hookNoop_fs hook_stub_placed_ok + extHookStack_le hookMemcpy_fs hookMemset_fs hookNoop_fs hook_stub_placed_ok pos_of_extHookStack_le reallocHook0_fs subroutine_ok_withLsCodeRoLoaded_of_keepsFs) open CryptoVerification.SpqrV1.Alloc (sessionMemcpyRegionROSpec) open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AllocFsA1Budget (CliAllocHooks hookMemcpy_region_ro_vm_ok hookMemcpy_region_vm_ok hookMemcpy_vm_ok - hookMemmove_vm_ok hookMemset_region_vm_ok hookMemset_vm_ok) + hookMemset_region_vm_ok hookMemset_vm_ok) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_rustAllocWithStack hookOk_rustDeallocExternWithStack hookOk_rustReallocExternWithStack hookOk_withStack) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsFsPlaced AllocContractsXCliPlaced) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget - (sessionMemcpyBudget_hookOk sessionMemcpyRegionBudget_hookOk sessionMemmoveBudget_hookOk + (sessionMemcpyBudget_hookOk sessionMemcpyRegionBudget_hookOk sessionMemsetBudget_hookOk sessionMemsetRegionBudget_hookOk sessionShimBudget_hookOk) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget - (sessionMemcpyBudgetSpec sessionMemcpyRegionBudgetSpec sessionMemmoveBudgetSpec + (sessionMemcpyBudgetSpec sessionMemcpyRegionBudgetSpec sessionMemsetBudgetSpec sessionMemsetRegionBudgetSpec sessionShimBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Hooks2Budget (rustAllocSpecWithStack rustDeallocExternSpecWithStack rustReallocExternSpecWithStack) @@ -92,9 +92,6 @@ theorem allocContractsFsPlaced_toAllocContractsX [LibsignalPlacement] {M : Alloc subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.memcpy_region stk h1 h2) session_memcpy_region stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.session_memcpy_region stk h1 h2) - memmove stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.memmove stk h1 h2) - session_memmove stk h1 h2 := - subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.session_memmove stk h1 h2) memset stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.memset stk h1 h2) session_memset stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.session_memset stk h1 h2) @@ -121,10 +118,6 @@ theorem allocContractsFsPlaced_of_hookSat [LibsignalPlacement] {M : AllocCostMod HookSat H memcpyName (withStack (withVmPreserved memcpyRegionSpec) stk).keepsFs) (hsmemcpyR : ∀ stk, extHookStack ≤ stk → stk ≤ 2 ^ 64 → HookSat H memcpyName (withStack sessionMemcpyRegionBudgetSpec stk).keepsFs) - (hmemmove : ∀ stk, extHookStack ≤ stk → stk ≤ 2 ^ 64 → - HookSat H memmoveName (withVmPreserved (libcMemmoveSpec stk)).keepsFs) - (hsmemmove : ∀ stk, extHookStack ≤ stk → stk ≤ 2 ^ 64 → - HookSat H memmoveName (sessionMemmoveBudgetSpec stk).keepsFs) (hmemset : ∀ stk, extHookStack ≤ stk → stk ≤ 2 ^ 64 → HookSat H memsetName (withVmPreserved (libcMemsetSpec stk)).keepsFs) (hsmemset : ∀ stk, extHookStack ≤ stk → stk ≤ 2 ^ 64 → @@ -144,8 +137,6 @@ theorem allocContractsFsPlaced_of_hookSat [LibsignalPlacement] {M : AllocCostMod session_memcpy stk h1 h2 := ls_hook_placed_ok (hsmemcpy stk h1 h2) memcpy_region stk h1 h2 := ls_hook_placed_ok (hmemcpyR stk h1 h2) session_memcpy_region stk h1 h2 := ls_hook_placed_ok (hsmemcpyR stk h1 h2) - memmove stk h1 h2 := ls_hook_placed_ok (hmemmove stk h1 h2) - session_memmove stk h1 h2 := ls_hook_placed_ok (hsmemmove stk h1 h2) memset stk h1 h2 := ls_hook_placed_ok (hmemset stk h1 h2) session_memset stk h1 h2 := ls_hook_placed_ok (hsmemset stk h1 h2) memset_region stk h1 h2 := ls_hook_placed_ok (hmemsetR stk h1 h2) @@ -168,10 +159,6 @@ theorem allocContractsXCliPlaced_of_hookSat [LibsignalPlacement] {M : AllocCostM HookSat H memcpyName (withStack (withVmPreserved memcpyRegionSpec) stk)) (hsmemcpyR : ∀ stk, extHookStack ≤ stk → stk ≤ 2 ^ 64 → HookSat H memcpyName (withStack sessionMemcpyRegionBudgetSpec stk)) - (hmemmove : ∀ stk, extHookStack ≤ stk → stk ≤ 2 ^ 64 → - HookSat H memmoveName (withVmPreserved (libcMemmoveSpec stk))) - (hsmemmove : ∀ stk, extHookStack ≤ stk → stk ≤ 2 ^ 64 → - HookSat H memmoveName (sessionMemmoveBudgetSpec stk)) (hmemset : ∀ stk, extHookStack ≤ stk → stk ≤ 2 ^ 64 → HookSat H memsetName (withVmPreserved (libcMemsetSpec stk))) (hsmemset : ∀ stk, extHookStack ≤ stk → stk ≤ 2 ^ 64 → @@ -189,8 +176,6 @@ theorem allocContractsXCliPlaced_of_hookSat [LibsignalPlacement] {M : AllocCostM session_memcpy stk h1 h2 := ls_hook_placed_ok (hsmemcpy stk h1 h2) memcpy_region stk h1 h2 := ls_hook_placed_ok (hmemcpyR stk h1 h2) session_memcpy_region stk h1 h2 := ls_hook_placed_ok (hsmemcpyR stk h1 h2) - memmove stk h1 h2 := ls_hook_placed_ok (hmemmove stk h1 h2) - session_memmove stk h1 h2 := ls_hook_placed_ok (hsmemmove stk h1 h2) memset stk h1 h2 := ls_hook_placed_ok (hmemset stk h1 h2) session_memset stk h1 h2 := ls_hook_placed_ok (hsmemset stk h1 h2) memset_region stk h1 h2 := ls_hook_placed_ok (hmemsetR stk h1 h2) @@ -207,7 +192,6 @@ theorem allocContractsFsPlaced_of_hooks [LibsignalPlacement] (hdealloc : H lsRustDeallocSymCli = some deallocHook) (hrealloc : H lsRustReallocSymCli = some reallocHook0) (hmemset : H memsetName = some hookMemset) - (hmemmove : H memmoveName = some hookMemmove) (hmemcpy : H memcpyName = some hookMemcpy) : AllocContractsFsPlaced A lim H where alloc := hook_stub_placed_ok halloc <| @@ -229,10 +213,6 @@ theorem allocContractsFsPlaced_of_hooks [LibsignalPlacement] (hookOk_withStack hookMemcpy_region_vm_ok stk).keepsFs hookMemcpy_fs session_memcpy_region stk _ _ := hook_stub_placed_ok hmemcpy <| (hookOk_withStack sessionMemcpyRegionBudget_hookOk stk).keepsFs hookMemcpy_fs - memmove stk _ _ := hook_stub_placed_ok hmemmove <| - (hookMemmove_vm_ok stk).keepsFs hookMemmove_fs - session_memmove stk _ _ := hook_stub_placed_ok hmemmove <| - (sessionMemmoveBudget_hookOk stk).keepsFs hookMemmove_fs memset stk hle _ := hook_stub_placed_ok hmemset <| (hookMemset_vm_ok stk (pos_of_extHookStack_le hle)).keepsFs hookMemset_fs session_memset stk hle _ := hook_stub_placed_ok hmemset <| @@ -253,11 +233,10 @@ theorem allocContractsXCliPlaced_of_hooks [LibsignalPlacement] (hdealloc : H lsRustDeallocSymCli = some deallocHook) (hrealloc : H lsRustReallocSymCli = some reallocHook0) (hmemset : H memsetName = some hookMemset) - (hmemmove : H memmoveName = some hookMemmove) (hmemcpy : H memcpyName = some hookMemcpy) : AllocContractsXCliPlaced A lim H := allocContractsFsPlaced_toAllocContractsX - (allocContractsFsPlaced_of_hooks hA hshim halloc hdealloc hrealloc hmemset hmemmove hmemcpy) + (allocContractsFsPlaced_of_hooks hA hshim halloc hdealloc hrealloc hmemset hmemcpy) /-- Any extern map mapping `memcpyName` to `hookMemcpy` meets `withVmPreserved sessionMemcpyRegionROSpec`. -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsA1PlacedBudgetSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsA1PlacedBudgetSat.lean index f71bd0f40..753eb2368 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsA1PlacedBudgetSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsA1PlacedBudgetSat.lean @@ -34,19 +34,19 @@ open Arm64 ProofLib open CryptoVerification (LibsignalHooks LibsignalPlacement) open CryptoVerification.E2E (allocHook0 deallocHook reallocHook0) open CryptoVerification.LibsignalTripleRatchet - (extHookStack memcpyName memmoveName memsetName withStack) + (extHookStack memcpyName memsetName withStack) open CryptoVerification.SignalSession (lsRustAllocSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli) open CryptoVerification.SignalSession.Cli.MainHops (allocHook0_fs allocHookStack_le_extHookStack deallocHook_fs extHookStack_le hookMemcpy_fs - hookMemmove_fs hookMemset_fs hookNoop_fs hook_stub_placed_ok pos_of_extHookStack_le + hookMemset_fs hookNoop_fs hook_stub_placed_ok pos_of_extHookStack_le reallocHook0_fs) open CryptoVerification.SpqrV1.Alloc (sessionMemcpyRegionROSpec) open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AllocFsA1Budget (CliAllocHooks hookMemcpy_region_ro_vm_ok hookMemcpy_region_vm_ok hookMemcpy_vm_ok - hookMemmove_vm_ok hookMemset_region_vm_ok hookMemset_vm_ok) + hookMemset_region_vm_ok hookMemset_vm_ok) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AllocFsA1PlacedBudget (ls_hook_placed_ok) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget @@ -55,10 +55,10 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsFsPlaced AllocContractsXCliPlaced) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget - (sessionMemcpyBudget_hookOk sessionMemcpyRegionBudget_hookOk sessionMemmoveBudget_hookOk + (sessionMemcpyBudget_hookOk sessionMemcpyRegionBudget_hookOk sessionMemsetBudget_hookOk sessionMemsetRegionBudget_hookOk sessionShimBudget_hookOk) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget - (sessionMemcpyBudgetSpec sessionMemcpyRegionBudgetSpec sessionMemmoveBudgetSpec + (sessionMemcpyBudgetSpec sessionMemcpyRegionBudgetSpec sessionMemsetBudgetSpec sessionMemsetRegionBudgetSpec sessionShimBudgetSpec) /-- `HookSat` bundle for the 4 `.keepsFs` `memset` contracts consumed by @@ -110,7 +110,7 @@ theorem MemsetContractsBudgetSat.of_hookMemset_eq {H : LibsignalHooks} session_memset_region stk _ _ := ⟨hookMemset, hmemset, hookOk_withStack sessionMemsetRegionBudget_hookOk stk⟩ -/-- `HookSat` sibling of `AllocFsA1PlacedBudget.allocContractsFsPlaced_of_hooks` (`:218`). -/ +/-- `HookSat` sibling of `AllocFsA1PlacedBudget.allocContractsFsPlaced_of_hooks`. -/ theorem allocContractsFsPlaced_of_hooks_sat [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} (hA : CliAllocHooks A lim) @@ -119,7 +119,6 @@ theorem allocContractsFsPlaced_of_hooks_sat [LibsignalPlacement] (hdealloc : H lsRustDeallocSymCli = some deallocHook) (hrealloc : H lsRustReallocSymCli = some reallocHook0) (hmemset : MemsetContractsFsBudgetSat H) - (hmemmove : H memmoveName = some hookMemmove) (hmemcpy : H memcpyName = some hookMemcpy) : AllocContractsFsPlaced A lim H where alloc := hook_stub_placed_ok halloc <| @@ -141,10 +140,6 @@ theorem allocContractsFsPlaced_of_hooks_sat [LibsignalPlacement] (hookOk_withStack hookMemcpy_region_vm_ok stk).keepsFs hookMemcpy_fs session_memcpy_region stk _ _ := hook_stub_placed_ok hmemcpy <| (hookOk_withStack sessionMemcpyRegionBudget_hookOk stk).keepsFs hookMemcpy_fs - memmove stk _ _ := hook_stub_placed_ok hmemmove <| - (hookMemmove_vm_ok stk).keepsFs hookMemmove_fs - session_memmove stk _ _ := hook_stub_placed_ok hmemmove <| - (sessionMemmoveBudget_hookOk stk).keepsFs hookMemmove_fs memset stk h1 h2 := ls_hook_placed_ok (hmemset.memset stk h1 h2) session_memset stk h1 h2 := ls_hook_placed_ok (hmemset.session_memset stk h1 h2) memset_region stk h1 h2 := ls_hook_placed_ok (hmemset.memset_region stk h1 h2) @@ -152,7 +147,7 @@ theorem allocContractsFsPlaced_of_hooks_sat [LibsignalPlacement] session_memcpy_region_ro stk _ _ := hook_stub_placed_ok hmemcpy <| (hookOk_withStack hookMemcpy_region_ro_vm_ok stk).keepsFs hookMemcpy_fs -/-- `HookSat` sibling of `AllocFsA1PlacedBudget.allocContractsXCliPlaced_of_hooks` (`:264`). -/ +/-- `HookSat` sibling of `AllocFsA1PlacedBudget.allocContractsXCliPlaced_of_hooks`. -/ theorem allocContractsXCliPlaced_of_hooks_sat [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} (hA : CliAllocHooks A lim) @@ -161,7 +156,6 @@ theorem allocContractsXCliPlaced_of_hooks_sat [LibsignalPlacement] (hdealloc : H lsRustDeallocSymCli = some deallocHook) (hrealloc : H lsRustReallocSymCli = some reallocHook0) (hmemset : MemsetContractsBudgetSat H) - (hmemmove : H memmoveName = some hookMemmove) (hmemcpy : H memcpyName = some hookMemcpy) : AllocContractsXCliPlaced A lim H where alloc := hook_stub_placed_ok halloc <| @@ -180,8 +174,6 @@ theorem allocContractsXCliPlaced_of_hooks_sat [LibsignalPlacement] memcpy_region stk _ _ := hook_stub_placed_ok hmemcpy (hookOk_withStack hookMemcpy_region_vm_ok stk) session_memcpy_region stk _ _ := hook_stub_placed_ok hmemcpy (hookOk_withStack sessionMemcpyRegionBudget_hookOk stk) - memmove stk _ _ := hook_stub_placed_ok hmemmove (hookMemmove_vm_ok stk) - session_memmove stk _ _ := hook_stub_placed_ok hmemmove (sessionMemmoveBudget_hookOk stk) memset stk h1 h2 := ls_hook_placed_ok (hmemset.memset stk h1 h2) session_memset stk h1 h2 := ls_hook_placed_ok (hmemset.session_memset stk h1 h2) memset_region stk h1 h2 := ls_hook_placed_ok (hmemset.memset_region stk h1 h2) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsSitesPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsSitesPlaced.lean index 920754b4d..d4e3f9e9e 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsSitesPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsSitesPlaced.lean @@ -102,20 +102,6 @@ theorem session_memcpy_region_ro_rocl (hA : AllocContractsFsPlaced A H) (stk : N LibsignalPublicApi.StoreKit.ls_subroutine_ok_rocl_of_block (i := i) (j := 617) (hA.session_memcpy_region_ro stk h1 h2) hi -theorem memmove_rocl (hA : AllocContractsFsPlaced A H) (stk : Nat := extHookStack) - (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) - (hi : i < 619 := by decide) : - subroutine_ok prog (lsρ memmoveName) - (LibsignalPublicApi.StoreKit.withLsRoCl lsmpl (libcMemmoveSpec stk).keepsFs) := - LibsignalPublicApi.StoreKit.ls_subroutine_ok_rocl_of_block (i := i) (j := 617) (hA.memmove stk h1 h2) hi - -theorem session_memmove_rocl (hA : AllocContractsFsPlaced A H) (stk : Nat := extHookStack) - (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) - (hi : i < 619 := by decide) : - subroutine_ok prog (lsρ memmoveName) - (LibsignalPublicApi.StoreKit.withLsRoCl lsmpl (sessionMemmoveSpec stk).keepsFs) := - LibsignalPublicApi.StoreKit.ls_subroutine_ok_rocl_of_block (i := i) (j := 617) (hA.session_memmove stk h1 h2) hi - theorem memset_rocl (hA : AllocContractsFsPlaced A H) (stk : Nat := extHookStack) (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) (hi : i < 619 := by decide) : @@ -239,20 +225,6 @@ theorem session_memcpy_region_rocl (hA : AllocContractsXCliPlaced A H) (stk : Na LibsignalPublicApi.StoreKit.ls_subroutine_ok_rocl_of_block (i := i) (j := 617) (hA.session_memcpy_region stk h1 h2) hi -theorem memmove_rocl (hA : AllocContractsXCliPlaced A H) (stk : Nat := extHookStack) - (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) - (hi : i < 619 := by decide) : - subroutine_ok prog (lsρ memmoveName) - (LibsignalPublicApi.StoreKit.withLsRoCl lsmpl (libcMemmoveSpec stk)) := - LibsignalPublicApi.StoreKit.ls_subroutine_ok_rocl_of_block (i := i) (j := 617) (hA.memmove stk h1 h2) hi - -theorem session_memmove_rocl (hA : AllocContractsXCliPlaced A H) (stk : Nat := extHookStack) - (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) - (hi : i < 619 := by decide) : - subroutine_ok prog (lsρ memmoveName) - (LibsignalPublicApi.StoreKit.withLsRoCl lsmpl (sessionMemmoveSpec stk)) := - LibsignalPublicApi.StoreKit.ls_subroutine_ok_rocl_of_block (i := i) (j := 617) (hA.session_memmove stk h1 h2) hi - theorem memset_rocl (hA : AllocContractsXCliPlaced A H) (stk : Nat := extHookStack) (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) (hi : i < 619 := by decide) : diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsSitesPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsSitesPlacedBudget.lean index 1bf831a8c..d343531d3 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsSitesPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/AllocFsSitesPlacedBudget.lean @@ -34,7 +34,7 @@ open Arm64 ProofLib open CryptoVerification (IsLsBlockProg LibsignalHooks LibsignalPlacement lsmpl lsρ) open CryptoVerification.LibsignalPublicApi.StoreKit (ls_subroutine_ok_rocl_of_block withLsRoCl) open CryptoVerification.LibsignalTripleRatchet - (extHookStack memcpyName memmoveName memsetName sessionMemcpyRegionSpec sessionShimSpec withStack) + (extHookStack memcpyName memsetName sessionMemcpyRegionSpec sessionShimSpec withStack) open CryptoVerification.SpqrV1.Alloc (sessionMemcpyRegionROSpec) open CryptoVerification.SignalSession (lsRustAllocSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli) @@ -43,7 +43,7 @@ open LibsignalBinary.Heap.SpecBudget (withVmPreserved) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (session2MemcpyBudgetSpecX session2ShimBudgetSpecX) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget - (sessionMemcpyBudgetSpec sessionMemcpyRegionBudgetSpec sessionMemmoveBudgetSpec + (sessionMemcpyBudgetSpec sessionMemcpyRegionBudgetSpec sessionMemsetBudgetSpec sessionMemsetRegionBudgetSpec sessionShimBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Hooks2Budget (rustAllocSpecWithStack rustDeallocExternSpecWithStack rustReallocExternSpecWithStack) @@ -116,20 +116,6 @@ theorem session_memcpy_region_ro_rocl (hA : AllocContractsFsPlaced A lim H) (stk (withLsRoCl lsmpl (withStack (withVmPreserved sessionMemcpyRegionROSpec) stk).keepsFs) := ls_subroutine_ok_rocl_of_block (i := i) (j := 617) (hA.session_memcpy_region_ro stk h1 h2) hi -theorem memmove_rocl (hA : AllocContractsFsPlaced A lim H) (stk : Nat := extHookStack) - (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) - (hi : i < 619 := by decide) : - subroutine_ok prog (lsρ memmoveName) - (withLsRoCl lsmpl (withVmPreserved (libcMemmoveSpec stk)).keepsFs) := - ls_subroutine_ok_rocl_of_block (i := i) (j := 617) (hA.memmove stk h1 h2) hi - -theorem session_memmove_rocl (hA : AllocContractsFsPlaced A lim H) (stk : Nat := extHookStack) - (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) - (hi : i < 619 := by decide) : - subroutine_ok prog (lsρ memmoveName) - (withLsRoCl lsmpl (sessionMemmoveBudgetSpec stk).keepsFs) := - ls_subroutine_ok_rocl_of_block (i := i) (j := 617) (hA.session_memmove stk h1 h2) hi - theorem memset_rocl (hA : AllocContractsFsPlaced A lim H) (stk : Nat := extHookStack) (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) (hi : i < 619 := by decide) : @@ -283,20 +269,6 @@ theorem memcpy2_rocl (hA : AllocContractsXCliPlaced A lim H) (hi : i < 619 := by rcases hq with ⟨hro, hvm, ⟨hx0, htr⟩, hrest⟩ exact ⟨hro, ⟨hx0, htr, hvm⟩, hrest⟩ -theorem memmove_rocl (hA : AllocContractsXCliPlaced A lim H) (stk : Nat := extHookStack) - (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) - (hi : i < 619 := by decide) : - subroutine_ok prog (lsρ memmoveName) - (withLsRoCl lsmpl (withVmPreserved (libcMemmoveSpec stk))) := - ls_subroutine_ok_rocl_of_block (i := i) (j := 617) (hA.memmove stk h1 h2) hi - -theorem session_memmove_rocl (hA : AllocContractsXCliPlaced A lim H) (stk : Nat := extHookStack) - (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) - (hi : i < 619 := by decide) : - subroutine_ok prog (lsρ memmoveName) - (withLsRoCl lsmpl (sessionMemmoveBudgetSpec stk)) := - ls_subroutine_ok_rocl_of_block (i := i) (j := 617) (hA.session_memmove stk h1 h2) hi - theorem memset_rocl (hA : AllocContractsXCliPlaced A lim H) (stk : Nat := extHookStack) (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) (hi : i < 619 := by decide) : diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CallSitesPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CallSitesPlacedBudget.lean index 8ab73d304..d398397e1 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CallSitesPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CallSitesPlacedBudget.lean @@ -37,7 +37,7 @@ open CryptoVerification.SignalSession (lsFromUtf8Sym lsRustAllocSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli) open CryptoVerification.SignalSession.Cli.Main.Placed (blkPC_617 blkPl_617 lsProg_617) open CryptoVerification.SignalSession.Cli.MainHops - (fromUtf8AsciiSpec lsHandleErrorSymMain strlenSpec) + (fromUtf8AsciiSpec lsHandleErrorSymMain) open CryptoVerification.SpqrV1.Alloc (sessionMemcpyRegionROSpec) namespace LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.CallSitesPlacedBudget @@ -149,14 +149,6 @@ theorem main_session_memcpy_ro_fs_placed_ok [LibsignalPlacement] {M : AllocCostM AllocFsSitesPlacedBudget.AllocContractsFsPlaced.session_memcpy_region_ro_rocl hC (prog := lsProg_617 H) (i := 617) stk hstk h64 -theorem main_strlen_placed_ok [LibsignalPlacement] {M : AllocCostModel} - {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} - {uuidParse : UuidParser} {hookStack resStack : Nat} - (hc : MainCalleesBlk617 A lim H uuidParse hookStack resStack) : - subroutine_ok ((blkPC_617).rebase (blkPl_617).base H) (lsρ "strlen") - (withLsRoCl lsmpl (withVmPreserved (strlenSpec hookStack))) := - hc.strlen - theorem main_fromUtf8_placed_ok [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} {uuidParse : UuidParser} {hookStack resStack : Nat} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlaced.lean index a0f953bfd..9521fbe44 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlaced.lean @@ -38,8 +38,11 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.SpqrV1Empty public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.UuidFsPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.ParseSidFsPlaced public import LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlaced +public import LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedSat public import LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlaced +public import LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedSat public import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlaced +public import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedSat public import LibsignalBinary.Proofs.TripleRatchet.ChainKey.MessageKeys public import LibsignalBinary.Proofs.TripleRatchet.ChainKey.NextChainKey public import LibsignalBinary.Proofs.TripleRatchet.Keys.GenerateKeys @@ -101,9 +104,11 @@ private theorem cliGhostExterns_row_eq (mmpl : Obj.MultiPlacement) (gh : CliGhos (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) (h9 : sym ≠ lsMemsetSym := by decide) - (h10 : sym ≠ lsMemcpySym := by decide) : + (h10 : sym ≠ lsMemcpySym := by decide) + (h11 : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.cliExtraGhostSyms.contains sym = false ∨ + gh.extra.lookup sym = none := by left; decide) : cliGhostExterns gh (cliExternsPlaced mmpl W) sym = some f := - (RunGlue.cliGhostExterns_other gh _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans + (RunGlue.cliGhostExterns_other gh _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 h11).trans (RunGlue.cliExternsPlaced_row mmpl W hrow) /-! ## Placed Store Kits and Vtable Witnesses -/ @@ -168,12 +173,6 @@ theorem dirPutStrPlacedOk_cli [LibsignalPlacement] /-! ## Inner Decrypt (`w2_inner_placed_ok_of_region`) -/ -private theorem cliExternsPlaced_blackBox_eq - (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : - cliGhostExterns gh (cliExternsPlaced mmpl W) lsBlackBoxU8Sym = - some CryptoVerification.LibsignalSession.blackBoxHook := - cliGhostExterns_row_eq mmpl gh W (Slots.blackBox_row_placed mmpl W) - /-- Proves `InnerDecryptPlacedOk` on Block `463` from `hDropNz` and the Block-`463` `region_ok` hypothesis `hreg`. -/ theorem w2_inner_placed_ok_of_region [LibsignalPlacement] @@ -235,10 +234,8 @@ theorem publicApiEncHooksPlaced_cli [LibsignalPlacement] realloc := Slots.cliExternsPlaced_realloc_sat mmpl gh W hG memcpy := Slots.cliExternsPlaced_sessionMemcpyRegion_sat mmpl gh W hG stringClone := hStrClone - timeAdd := Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_timeAdd_sat mmpl W) - durationSince := Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_durationSinceBounded_sat mmpl W) + timeAdd := Slots.cliGhostExterns_timeAdd_sat gh (cliExternsPlaced mmpl W) hG.extraOk + durationSince := Slots.cliGhostExterns_durationSinceBounded_sat gh (cliExternsPlaced mmpl W) hG.extraOk handleError := Slots.cliGhostExterns_panic_handle_error mmpl gh W handleAllocError := Slots.cliGhostExterns_panic_handle_alloc_error mmpl gh W expectFailed := Slots.cliGhostExterns_panic_option_expect_failed mmpl gh W @@ -652,8 +649,7 @@ theorem w3Hooks_placed_ok [LibsignalPlacement] sessionMemcpyRegion := Slots.cliExternsPlaced_sessionMemcpyRegion_sat mmpl gh W hG memcpyRO := hh.memcpyRO bcmp := hh.bcmp - e2eBcmp := Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_e2eBcmp_sat mmpl W) + e2eBcmp := Slots.cliGhostExterns_e2eBcmp_sat gh (cliExternsPlaced mmpl W) hG.extraOk allocZeroed := hh.allocZeroed stringClone := hh.stringClone formatInner := hh.formatInner @@ -661,14 +657,12 @@ theorem w3Hooks_placed_ok [LibsignalPlacement] (Slots.cliExternsPlaced_derivePublicKeyBytes_sat mmpl W) dh := Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W (Slots.cliExternsPlaced_diffieHellman_sat mmpl W) - sharedDrop := Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_sharedSecretDrop_sat mmpl W) - staticDrop := Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_staticSecretDrop_sat mmpl W) - blackBox := cliExternsPlaced_blackBox_eq mmpl gh W + sharedDrop := Slots.cliGhostExterns_sharedSecretDrop_sat gh (cliExternsPlaced mmpl W) hG.extraOk + staticDrop := Slots.cliGhostExterns_staticSecretDrop_sat gh (cliExternsPlaced mmpl W) hG.extraOk + blackBox := hh.blackBox hkdf := instHkdfPlacedHooks_cli mmpl gh W hMs hMc kemEncaps := cliGhostExterns_row_eq mmpl gh W (Slots.kemEncaps_row_placed mmpl W) - durationSince := cliGhostExterns_row_eq mmpl gh W (Slots.durationSince_row_placed mmpl W) + durationSince := Slots.cliGhostExterns_durationSinceEpochAlloc_sat gh (cliExternsPlaced mmpl W) hG.extraOk panic_alloc := hh.panics "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" (by decide) panic_raw := hh.panics "_RNvNtCs69KKACWg7bl_5alloc7raw_vec12handle_error" (by decide) panic_sym := hh.panics @@ -714,7 +708,7 @@ theorem w3Exist_placed_ok_of_putStr [LibsignalPlacement] have hPutStr' : subroutine_ok (Placed.lsProg_543 H) (lsmpl.base 543) (dirPutStrSpecPlaced E2E.HooksE.A0 Initiate.cliDirPutStrStk) := dirPutStrPlacedOk_cli mmpl gh W hh - have hEq := Store.IdTrustPoll.publicKeyEq_placed_ok_of_bb (cliExternsPlaced_blackBox_eq mmpl gh W) + have hEq := Store.IdTrustPoll.publicKeyEq_mem_placed_ok_of_bb_16_sat hh.blackBox have hDec := RecordCodecsBinary.IdentityKeyDecode.identityKey_decode_placed_ok (A := E2E.HooksE.A0) H exact @@ -729,7 +723,7 @@ theorem w3Exist_placed_ok_of_putStr [LibsignalPlacement] have := Initiate.stk_sub_ge_base hstk have := Initiate.stk_sub_ge_dirGet hstk have : extHookStack ≤ 65536 := by decide - exact Store.IdTrustPoll.idTrustPoll_placed_ok_of_deps hh.alloc hGet hDec hEq (by omega) + exact Store.IdTrustPoll.idTrustPoll_placed_ok_of_deps_16 hh.alloc hGet hDec hEq (by omega) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) sessLoadShim := fun {stk} hstk => by have := Initiate.stk_sub_ge_base hstk @@ -751,7 +745,7 @@ theorem w3Exist_placed_ok_of_putStr [LibsignalPlacement] have : Initiate.cliDirPutStrStk ≤ 65536 := by decide have : publicKeySerializeStackX ≤ 65536 := by decide have : extHookStack ≤ 65536 := by decide - exact Store.IdSavePoll.idSavePoll_placed_ok_of_deps hh.alloc hh.panics hGet hPutStr' + exact Store.IdSavePoll.idSavePoll_placed_ok_of_deps_16 hh.alloc hh.panics hGet hPutStr' hDec hEq (by omega) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) @@ -782,18 +776,17 @@ theorem setUnackEpochPlacedOk_cli [LibsignalPlacement] (Slots.cliExternsPlaced_dealloc_sat mmpl gh W hG) (Slots.cliExternsPlaced_sessionMemcpyRegion_sat mmpl gh W hG) (Slots.cliGhostExterns_panic_handle_error mmpl gh W) - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_durationSinceEpochAlloc_sat mmpl W)) + (Slots.cliGhostExterns_durationSinceEpochAlloc_sat gh (cliExternsPlaced mmpl W) hG.extraOk) -private theorem w3VerifySigHooks_cli +private theorem w3VerifySigHooks_cli [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) (X : UnreachedPqxdhPrimitives) (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) : - E2E.Pqxdh.Shared.VerifySignaturePlacedHooks + LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedASat.VerifySignaturePlacedHooksSat (E2E.modelPrims X ⟨W.C, W.Q⟩) (cliGhostExterns gh (cliExternsPlaced mmpl W)) := { memcpy := Slots.cliExternsPlaced_sessionMemcpyRegion_sat mmpl gh W hG memset := Slots.cliExternsPlaced_sessionMemset_sat mmpl gh W hG E2E.Pqxdh.Shared.pqxdhHookStack (by decide) - blackBox := cliExternsPlaced_blackBox_eq mmpl gh W + blackBox := KitInst.cliGhostExterns_blackBox_sat mmpl gh W hG.extraOk montToEd := Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W (Slots.cliExternsPlaced_toEdwards_sat mmpl W X (img := default)) compress := Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W @@ -816,11 +809,12 @@ private theorem w3VerifySignature_placed_ok [LibsignalPlacement] subroutine_ok (Initiate.initProgPlaced mmpl gh W) (lsmpl.base 203) (StoreKit.withLsCodeRoLoaded lsmpl (Initiate.verifySignatureInnerSpec (E2E.modelPrims X ⟨W.C, W.Q⟩))) := by - have hv := E2E.Pqxdh.Shared.verifySignature_placed_ok_of_block - (callerProg := Initiate.initProgPlaced mmpl gh W) - (E2E.Pqxdh.Shared.VerifySignaturePrims.of_structuralPrims - (E2E.Pqxdh.Initiator.structuralPrims_initiatorModelPrims X ⟨W.C, W.Q⟩)) - (w3VerifySigHooks_cli mmpl gh W X hG) (by decide) + have hv := + LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedSat.verifySignature_placed_ok_of_block_sat + (callerProg := Initiate.initProgPlaced mmpl gh W) + (E2E.Pqxdh.Shared.VerifySignaturePrims.of_structuralPrims + (E2E.Pqxdh.Initiator.structuralPrims_initiatorModelPrims X ⟨W.C, W.Q⟩)) + (w3VerifySigHooks_cli mmpl gh W X hG) (by decide) refine subroutine_ok_map hv (fun g R s0 hp => ⟨{ pkPtr := g.pkPtr, msgPtr := g.msgPtr, sigPtr := g.sigPtr, pk := g.pk, m := g.m, sig := g.sig }, R, ?_, fun _ hq => hq⟩) @@ -834,7 +828,8 @@ private theorem w3VerifySignature_placed_ok [LibsignalPlacement] exact Eq.mp (congrArg (s0.mem ⊨ ·) (by ac_rfl)) h1 private theorem w3IsSameAccount_placed_ok [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : + (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) : subroutine_ok (Initiate.initProgPlaced mmpl gh W) (lsmpl.base 17) (StoreKit.withLsCodeRoLoaded lsmpl (E2E.Pqxdh.WireEntries.isSameAccountDistinctSpec E2E.HooksE.A0 uuidTryParse)) := by @@ -845,9 +840,10 @@ private theorem w3IsSameAccount_placed_ok [LibsignalPlacement] (fun _ _ _ hp => hp) (fun _ _ _ _ hq => ?_) dsimp only [withLsCodeLoaded, Spec.keepsFs] at hq ⊢ rw [sepConj_assoc, satisfies_pure_sepConj] at hq; exact hq.2 - have hisa := E2E.Pqxdh.WireEntries.isSameAccountEqDistinct_placed_ok_at E2E.HooksE.A0 - (callerProg := Initiate.initProgPlaced mmpl gh W) - (cliExternsPlaced_blackBox_eq mmpl gh W) huuid (by decide) + have hisa := + LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedSat.isSameAccountEqDistinct_placed_ok_at_sat + E2E.HooksE.A0 (callerProg := Initiate.initProgPlaced mmpl gh W) + (KitInst.cliGhostExterns_blackBox_sat mmpl gh W hG.extraOk) huuid (by decide) refine subroutine_ok_mono hisa (fun x R s0 hp => ?_) (fun _ _ _ _ hq => hq) obtain ⟨hc, hpre⟩ := StoreKit.extract_withLsCodeRoLoaded hp dsimp only [withLsCodeLoaded] @@ -863,19 +859,18 @@ private theorem w3CalculateAgreement_placed_ok [LibsignalPlacement] subroutine_ok (Initiate.initProgPlaced mmpl gh W) (lsmpl.base 207) (StoreKit.withLsCodeRoLoaded lsmpl (Initiate.pqxdhCalculateAgreementPlacedInnerSpec (E2E.modelPrims X ⟨W.C, W.Q⟩) E2E.HooksE.A0)) := by - have hca := E2E.Pqxdh.ResponderCore.pqxdhCalculateAgreement_placed_ok_of_block - (callerProg := Initiate.initProgPlaced mmpl gh W) - (E2E.Pqxdh.ResponderCore.primitivesMatchCrypto_modelPrims X ⟨W.C, W.Q⟩) - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_diffieHellman_sat mmpl W)) - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_sharedSecretDrop_sat mmpl W)) - (cliExternsPlaced_blackBox_eq mmpl gh W) - (Slots.cliExternsPlaced_noAllocShim_sat mmpl gh W hG.shim_eq) - (Slots.cliExternsPlaced_alloc_sat mmpl gh W hG) - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_staticSecretDrop_sat mmpl W)) - (Slots.cliGhostExterns_panic_handle_alloc_error mmpl gh W) (by decide) + have hca := + LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedSat.pqxdhCalculateAgreement_placed_ok_of_block_sat + (callerProg := Initiate.initProgPlaced mmpl gh W) + (E2E.Pqxdh.ResponderCore.primitivesMatchCrypto_modelPrims X ⟨W.C, W.Q⟩) + (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W + (Slots.cliExternsPlaced_diffieHellman_sat mmpl W)) + (Slots.cliGhostExterns_sharedSecretDrop_sat gh (cliExternsPlaced mmpl W) hG.extraOk) + (KitInst.cliGhostExterns_blackBox_sat mmpl gh W hG.extraOk) + (Slots.cliExternsPlaced_noAllocShim_sat mmpl gh W hG.shim_eq) + (Slots.cliExternsPlaced_alloc_sat mmpl gh W hG) + (Slots.cliGhostExterns_staticSecretDrop_sat gh (cliExternsPlaced mmpl W) hG.extraOk) + (Slots.cliGhostExterns_panic_handle_alloc_error mmpl gh W) (by decide) refine subroutine_ok_mono hca (fun x R s0 hp => ?_) (fun _ _ _ _ hq => hq) obtain ⟨hc, hpre⟩ := StoreKit.extract_withLsCodeRoLoaded hp dsimp only [LibsignalTripleRatchet.withLsCodeRoLoaded] @@ -897,10 +892,9 @@ theorem w3A4_placed_ok [LibsignalPlacement] let H := cliGhostExterns gh (cliExternsPlaced mmpl W) have _ := instHkdfPlacedHooks_cli mmpl gh W hMs hMc have _ := CryptoVerification.instIsLsBlockProg_59 H - have _ := CryptoVerification.instIsLsBlockProg_207 H exact { verifySignature := fun X => w3VerifySignature_placed_ok mmpl gh W X hG - isSameAccount := w3IsSameAccount_placed_ok mmpl gh W + isSameAccount := w3IsSameAccount_placed_ok mmpl gh W hG calculateAgreement := fun X => w3CalculateAgreement_placed_ok mmpl gh W X hG spqrInitialState := hSpqr.spqrInitialState_initProg setUnackPreKeyMsg := setUnackEpochPlacedOk_cli mmpl gh W hG @@ -908,10 +902,6 @@ theorem w3A4_placed_ok [LibsignalPlacement] (E2E.Pqxdh.ResponderCore.primitivesMatchCrypto_modelPrims X ⟨W.C, W.Q⟩) pqxdhHkdfExpand := fun X => E2E.Pqxdh.ResponderCore.pqxdhHkdfExpandMultiInfo_placed_ok (E2E.Pqxdh.ResponderCore.primitivesMatchCrypto_modelPrims X ⟨W.C, W.Q⟩) - ctEqSliceRO := ls_subroutine_ok_of_block - (callerProg := (CryptoVerification.blkPC_207).rebase (CryptoVerification.blkPl_207).base H) - (ConsumeMessageKeyTransfer.ct_eq_ro_placed_ok_withLsCodeLoaded - (cliExternsPlaced_blackBox_eq mmpl gh W)) newFromSlice := new_from_slice_54_cro_ok mmpl gh W hMs hMc } /-- Block-`618` `coinsFillSpecPlacedW3` contract obligation for `cliCoinsFillStack ≤ cStk`. -/ @@ -1007,7 +997,7 @@ theorem cliSlotCallees_placed_of_region [LibsignalPlacement] w3Stage2 := w3Stage2_placed_ok mmpl gh X W hG w3Stage3 := w3Stage3_placed_ok mmpl gh X W hG } --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost /-- Assembles `CliSlotCalleesPlaced mmpl gh X W` from `SpqrV1PlacedSeams` and the Block-`462` `logClosurePlacedSpec` seam `hLog462`. -/ theorem cliSlotCallees_placed_of_seams [LibsignalPlacement] @@ -1016,6 +1006,7 @@ theorem cliSlotCallees_placed_of_seams [LibsignalPlacement] (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hh : RunSkeleton.RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (hRead589 : subroutine_ok (Placed.lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsρ lsReadFileSym) @@ -1035,7 +1026,7 @@ theorem cliSlotCallees_placed_of_seams [LibsignalPlacement] { w1Inner := w1_inner_placed_ok mmpl gh W hDropNz hG hMs hMc hh hRead589 hAesEnc hSpqr w2SessVt := w2SessVt_placed_ok cliRunBudgets_placed hDropNz w2IdVt := w2IdVt_placed_ok cliRunBudgets_placed hDropNz - w2Inner := DecryptLemmas.w2_inner_placed_ok mmpl gh W hDropNz hG hh hRead589 hAesDec hSpqr hLog462 + w2Inner := DecryptLemmas.w2_inner_placed_ok mmpl gh W hDropNz hG hMv hh hRead589 hAesDec hSpqr hLog462 w3Hooks := w3Hooks_placed_ok mmpl gh W hG hMs hMc hh w3Exist := w3Exist_placed_ok_of_putStr mmpl gh W hh hRead589 w3A4 := w3A4_placed_ok mmpl gh W hG hMs hMc hSpqr @@ -1079,7 +1070,7 @@ theorem cliSlotCallees_full_placed_of_region [LibsignalFullPlacement] w3Stage2 := w3Stage2_placed_ok mmpl gh X W hG w3Stage3 := w3Stage3_placed_ok mmpl gh X W hG } --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost /-- Closed `[LibsignalFullPlacement]` assembly of `CliSlotCalleesFullPlaced mmpl gh X W` from `SpqrV1PlacedSeams` and `A0` hooks (`w2Inner` discharged via `w2_inner_full_placed_ok`). -/ theorem cliSlotCallees_full_placed_of_seams [LibsignalFullPlacement] @@ -1089,6 +1080,7 @@ theorem cliSlotCallees_full_placed_of_seams [LibsignalFullPlacement] (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hh : RunSkeleton.RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (hRead589 : subroutine_ok (Placed.lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsρ lsReadFileSym) @@ -1102,7 +1094,7 @@ theorem cliSlotCallees_full_placed_of_seams [LibsignalFullPlacement] { w1Inner := w1_inner_placed_ok mmpl gh W hDropNz hG hMs hMc hh hRead589 hAesEnc hSpqr w2SessVt := w2SessVt_placed_ok cliRunBudgets_placed hDropNz w2IdVt := w2IdVt_placed_ok cliRunBudgets_placed hDropNz - w2Inner := DecryptLemmas.w2_inner_full_placed_ok mmpl gh W hDropNz hG hh hRead589 hAesDec hSpqr + w2Inner := DecryptLemmas.w2_inner_full_placed_ok mmpl gh W hDropNz hG hMv hh hRead589 hAesDec hSpqr w3Hooks := w3Hooks_placed_ok mmpl gh W hG hMs hMc hh w3Exist := w3Exist_placed_ok_of_putStr mmpl gh W hh hRead589 w3A4 := w3A4_placed_ok mmpl gh W hG hMs hMc hSpqr diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetAux.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetAux.lean index e35c318a1..650a019e8 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetAux.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetAux.lean @@ -35,7 +35,9 @@ public import LibsignalBinary.Proofs.TripleRatchet.Keys.CreateChainBudget public meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.Common.SharedHelpers import LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.ModelBridge +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat +import LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedBudgetSat import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic @@ -79,7 +81,7 @@ open CryptoVerification.LibsignalTripleRatchet ( noAllocShimSpec publicKeySerializeStackX region_ok ) open CryptoVerification.LibsignalTripleRatchetRepr (AddrGhost uuidTryParse) -open CryptoVerification.SignalSession (CliHooks cliExternsPlaced) +open CryptoVerification.SignalSession (CliHooks cliExternsPlaced lsDurationSinceSym) open CryptoVerification.SignalSession.Cli.KitInst ( rodata_cliIdentity_kpSlot_placed rodata_cliIdentity_regIdSlot_placed rodata_cliIdentity_saveSlot_placed rodata_cliIdentity_trustSlot_placed @@ -125,6 +127,9 @@ open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudgetSat open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudget ( extract_placed_vm_ok_of_other_block pqxdhHkdfExpandMultiInfo_placed_ok pqxdhHkdfExtract_placed_ok ) +open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat ( + calculateAgreement_placed_ok_unconditional_sat +) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat ( extract_placed_vm_ok_of_other_block_sat pqxdhHkdfExpandMultiInfo_placed_ok_sat pqxdhHkdfExtract_placed_ok_sat @@ -132,8 +137,8 @@ open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat open LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountBudget ( isSameAccountDistinctSpec ) -open LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedBudget ( - isSameAccountEqDistinct_placed_ok_at +open LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedBudgetSat ( + isSameAccountEqDistinct_placed_ok_at_sat ) open LibsignalBinary.Proofs.SignalSession.Cli.Dir.AddressText.PlacedBudget (AddrTextEnv) open LibsignalBinary.Proofs.SignalSession.Cli.Dir.Decimal.ExecPlacedBudget (DecimalEnv) @@ -149,7 +154,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.CliSlotCalleesInstPlac ) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.CliSlotCalleesInstPlacedBudgetSeams ( CliSlotAllocHooks CliSlotEnvs SpqrV1PlacedSeamsBudget cliDirPutStrNeedPlaced - cliGhostExterns_blackBox_eq decIdKitBudgetEnv decSessKitBudgetEnv dirPutStrPlacedOk_cli + decIdKitBudgetEnv decSessKitBudgetEnv dirPutStrPlacedOk_cli skeletonHooks_of_slotHooks w1IdKitBudgetEnv w1IdKitPlaced_okIE w1SessKitBudgetEnv w1SessKitPlaced_okSE w3DirPut_placed_ok ) @@ -179,26 +184,29 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Ratchet.DecryptLemmas.S open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Ratchet.EncryptLemmas.SlotOfInnerPlacedBudget ( w1IdKitPlaced w1SessKitPlaced ) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( CliGhostAllocHooks cliExternsPlaced_sessionMemsetRegion_budget_sat + cliGhostExterns_blackBoxSat_budget_sat cliGhostExterns_durationSinceEpochAlloc_budget_sat ) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat (HkdfPlacedHooksExactBudgetSat) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat (HkdfPlacedHooksExactSat) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.SetUnackEpochPlacedBudget ( - setUnackPreKeyMsgExactStackEpochSpecPlaced setUnackPreKeyMsg_exact_stack_epoch_placed_ok_cli + durationSinceEpochAllocBudgetSpec setUnackPreKeyMsgExactStackEpochSpecPlaced + setUnackPreKeyMsg_exact_stack_epoch_placed_ok_cli_sat ) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget ( dirGetSpecPlaced sessDeserializeSpecPlaced ) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePollPlacedBudget ( - CliIdSavePollEnv idSavePoll_placed_ok_of_deps + CliIdSavePollEnv idSavePoll_placed_ok_of_deps_16 ) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSaveShimPlacedBudget ( idSaveShim_placed_ok_of_deps ) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudget ( - CliIdTrustPollEnv idTrustPoll_placed_ok_of_deps identityKey_decode_placed_ok - publicKeyEq_placed_ok_of_bb + CliIdTrustPollEnv idTrustPoll_placed_ok_of_deps_16 identityKey_decode_placed_ok + publicKeyEq_mem_placed_ok_of_bb_16_sat ) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustShimPlacedBudget ( idTrustShim_placed_ok_of_deps @@ -369,7 +377,7 @@ theorem w3Exist_placed_ok_of_putStr [LibsignalPlacement] {M : AllocCostModel} (readProg := lsProg_589 (cliGhostExterns g (cliExternsPlaced mmpl W))) (jRead := 589) (fun _ hp => hp.2) hh (hH.readFile cliRunBudgets.readFile) (by decide) (by decide) have hPutStr := dirPutStrPlacedOk_cli mmpl g W A lim hH - have hEq := publicKeyEq_placed_ok_of_bb (cliGhostExterns_blackBox_eq mmpl g W) + have hEq := publicKeyEq_mem_placed_ok_of_bb_16_sat hh.blackBox have hDec := identityKey_decode_placed_ok (A := A) (cliGhostExterns g (cliExternsPlaced mmpl W)) exact { dirGet := hGet @@ -383,7 +391,7 @@ theorem w3Exist_placed_ok_of_putStr [LibsignalPlacement] {M : AllocCostModel} have := stk_sub_ge_base hstk have := stk_sub_ge_dirGet hstk have : extHookStack ≤ 65536 := by decide - exact idTrustPoll_placed_ok_of_deps hh.alloc hGet hDec hEq (by omega) + exact idTrustPoll_placed_ok_of_deps_16 hh.alloc hGet hDec hEq (by omega) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) sessLoadShim := fun {stk} hstk => by have := stk_sub_ge_base hstk @@ -406,7 +414,7 @@ theorem w3Exist_placed_ok_of_putStr [LibsignalPlacement] {M : AllocCostModel} have : cliDirPutStrNeedPlaced ≤ 65536 := by decide have : publicKeySerializeStackX ≤ 65536 := by decide have : extHookStack ≤ 65536 := by decide - exact idSavePoll_placed_ok_of_deps hh.alloc hGet hPutStr hDec hEq (by omega) + exact idSavePoll_placed_ok_of_deps_16 hh.alloc hGet hPutStr hDec hEq (by omega) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) sessStoreShim := fun {stk} hstk => by @@ -427,14 +435,26 @@ def SetUnackEpochPlacedOk [LibsignalPlacement] {M : AllocCostModel} subroutine_ok (initProgPlaced mmpl g W) (lsmpl.base 33) (setUnackPreKeyMsgExactStackEpochSpecPlaced A lim) +theorem setUnackEpochPlacedOk_cli_of_sat [LibsignalPlacement] {M : AllocCostModel} + (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) + (A : RustCliAllocBudget M) (lim : BudgetLimits) + {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} + (hH : CliSlotAllocHooks mmpl g W A lim ReadEnv) + (hTime : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsDurationSinceSym + (withLsRet durationSinceEpochAllocBudgetSpec)) : + SetUnackEpochPlacedOk mmpl g W A lim := + setUnackPreKeyMsg_exact_stack_epoch_placed_ok_cli_sat mmpl g W hH.alloc.toCliGhostAllocHooks + hTime (by decide) + theorem setUnackEpochPlacedOk_cli [LibsignalPlacement] {M : AllocCostModel} (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) (A : RustCliAllocBudget M) (lim : BudgetLimits) {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} (hH : CliSlotAllocHooks mmpl g W A lim ReadEnv) : SetUnackEpochPlacedOk mmpl g W A lim := - setUnackPreKeyMsg_exact_stack_epoch_placed_ok_cli mmpl g W hH.alloc.toCliGhostAllocHooks - (by decide) + setUnackEpochPlacedOk_cli_of_sat mmpl g W A lim hH + (cliGhostExterns_durationSinceEpochAlloc_budget_sat g (cliExternsPlaced mmpl W) + hH.alloc.toCliGhostAllocHooks.extraOk) /-- Budget-threaded (`VmPreserved`) Block-`618` `coinsFillSpecPlacedW3` contract obligation. -/ def CoinsFillCliPlacedOk [LibsignalPlacement] @@ -450,13 +470,16 @@ theorem coinsFillCliPlacedOk_cli [LibsignalPlacement] CoinsFillCliPlacedOk mmpl g W := fun {_cStk} hstk hstk64 => signal_session_coins_fill_vm_placed_ok_at_init mmpl g W hG hstk hstk64 -theorem w3IsSameAccount_placed_ok [LibsignalPlacement] +theorem w3IsSameAccount_placed_ok_of_bb_sat [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) - (A : CryptoVerification.RustHeap.RustAlloc) (W : CliHooks) : + (A : CryptoVerification.RustHeap.RustAlloc) (W : CliHooks) + (hBb : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) + CryptoVerification.lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : subroutine_ok (initProgPlaced mmpl g W) (lsmpl.base 17) (withLsCodeRoLoaded lsmpl (isSameAccountDistinctSpec A uuidTryParse)) := by - have hisa := isSameAccountEqDistinct_placed_ok_at A - (callerProg := initProgPlaced mmpl g W) (cliGhostExterns_blackBox_eq mmpl g W) + have hisa := isSameAccountEqDistinct_placed_ok_at_sat A + (callerProg := initProgPlaced mmpl g W) hBb (uuidTryParse_252_vm_placed_ok (cliGhostExterns g (cliExternsPlaced mmpl W))) (by decide) refine subroutine_ok_mono hisa (fun x R s0 hp => ?_) (fun _ _ _ _ hq => hq) obtain ⟨hc, hpre⟩ := extract_withLsCodeRoLoaded hp @@ -466,6 +489,15 @@ theorem w3IsSameAccount_placed_ok [LibsignalPlacement] rw [satisfies_pure_sepConj]; exact ⟨hc.1, hpre⟩ exact Eq.mp (congrArg (s0.mem ⊨ ·) (by sep_ac_rfl)) h1 +theorem w3IsSameAccount_placed_ok_sat [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) + (A : CryptoVerification.RustHeap.RustAlloc) (W : CliHooks) + (hOk : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.ExtraSpecOk g) : + subroutine_ok (initProgPlaced mmpl g W) (lsmpl.base 17) + (withLsCodeRoLoaded lsmpl (isSameAccountDistinctSpec A uuidTryParse)) := + w3IsSameAccount_placed_ok_of_bb_sat mmpl g A W + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hOk) + /-- Block-`54` `extractBudgetSpec W.C.F` contract on Block `40` under `withLsCodeRoLoaded lsmpl` from `CliGhostAllocHooks`. -/ theorem w3HkdfExtract40_cro_placed_ok [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) @@ -526,7 +558,7 @@ theorem w3A4_placed_ok [LibsignalPlacement] {M : AllocCostModel} (cliExternsPlaced_sessionMemsetRegion_budget_sat mmpl g W hG) exact { verifySignature := hSpqr.verifySignature - isSameAccount := w3IsSameAccount_placed_ok mmpl g A.repAlloc W + isSameAccount := w3IsSameAccount_placed_ok_sat mmpl g A.repAlloc W hG.extraOk spqrInitialState := hSpqr.spqrInitialState_initProg pqxdhHkdfExtract := fun X => pqxdhHkdfExtract_placed_ok_sat (primitivesMatchCrypto_modelPrims X ⟨W.C, W.Q⟩) @@ -569,20 +601,6 @@ private theorem transfer_tr_codeRoLoaded [LibsignalPlacement] {α : Type} (fun _ _ _ _ hq => hq) exact transfer_withLsCodeRoLoaded (callerProg := initProgPlaced mmpl g W) hcrl (by decide) hj hj_unmut -private theorem hookSat_of_keepsFs {α : Type} {H : LibsignalHooks} {sym : String} - {spec : Spec α} (h : HookSat H sym spec.keepsFs) : - HookSat H sym spec := by - rcases h with ⟨fn, hfn, hok⟩ - refine ⟨fn, hfn, fun x R s0 hrun hpre hsp => ?_⟩ - rcases hok x R s0 hrun hpre hsp with ⟨hkf, hsym, hout⟩ - refine ⟨hkf, hsym, ?_⟩ - rcases hout with ⟨hret, hcc, hpost⟩ | hrest - · refine Or.inl ⟨hret, hcc, ?_⟩ - dsimp only [Arm64.Spec.keepsFs] at hpost - rw [sepConj_assoc, satisfies_pure_sepConj] at hpost - exact hpost.2 - · exact Or.inr hrest - private theorem createChain40_cro_placed_ok [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) @@ -594,13 +612,10 @@ private theorem createChain40_cro_placed_ok [LibsignalPlacement] (createChainSpec M A lim W.C)) := by have : HkdfPlacedHooksExactSat W.C.F (cliGhostExterns g (cliExternsPlaced mmpl W)) := hh.hkdf have : HkdfPlacedHooksExactBudgetSat W.C.F (cliGhostExterns g (cliExternsPlaced mmpl W)) := - HkdfPlacedHooksExactBudgetSat.of_exactSat (hookSat_of_keepsFs hh.memsetRegionKeepsFs) - have hct207 := ct_eq_ro_placed_vm_ok_of_block - (callerProg := (blkPC_207).rebase (blkPl_207).base (cliGhostExterns g (cliExternsPlaced mmpl W))) - hh.blackBox (by decide) + HkdfPlacedHooksExactBudgetSat.of_exactSat hh.memsetRegionKeepsFs.of_keepsFs have hag40 := keys_ls_subroutine_ok_of_block_cro (callerProg := (blkPC_40).rebase (blkPl_40).base (cliGhostExterns g (cliExternsPlaced mmpl W))) - (calculateAgreement_placed_ok hh.dh hh.sharedDrop hct207 + (calculateAgreement_placed_ok_unconditional_sat hh.dh hh.sharedDrop hh.blackBox (hookSat_noAllocShimBudget_of_withVmPreserved hh.shim) hh.rawAlloc hh.staticDrop) have hext40 := extract_placed_vm_ok_of_other_block_sat W.C (callerProg := (blkPC_40).rebase (blkPl_40).base (cliGhostExterns g (cliExternsPlaced mmpl W))) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetAuxSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetAuxSat.lean index e028c675c..bd3b311be 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetAuxSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetAuxSat.lean @@ -14,6 +14,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.CliSlotCallee public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.HooksPlacedBudget -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.LocalCalleesPlacedBudgetSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget -- proof-setup: allow-public-import import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic @@ -21,6 +22,7 @@ import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.ModelBridge import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudgetSat +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat @@ -71,10 +73,10 @@ open LibsignalBinary.Heap.SpecBudget (withVmPreserved) open LibsignalBinary.Proofs.Cli.PublicApi.MessageDecrypt.WithStoresVT.CorePlacedBudget (recordDecryptPlacedSpecTPTight) open LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.HandshakeDeriveBudget (handshakeKeysDerive_placed_ok) -open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudget - (ct_eq_ro_placed_vm_ok_of_block) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudgetSat (expand_multi_info_placed_vm_ok_of_other_block_sat) +open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat + (calculateAgreement_placed_ok_unconditional_sat) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat (extract_placed_vm_ok_of_other_block_sat pqxdhHkdfExpandMultiInfo_placed_ok_sat pqxdhHkdfExtract_placed_ok_sat) @@ -97,11 +99,11 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.StoreCalleesPl open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Ratchet.DecryptLemmas.SpecPlacedBudget (InnerDecryptPlacedOk decIdKitPlaced decSessKitPlaced withStoresDecPlacedSpecVTP) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (ExtraSpecOk) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (noAllocShimBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat (HkdfPlacedHooksExactBudgetSat) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat (HkdfPlacedHooksExactSat) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemsetRegionBudgetSpec) -open LibsignalBinary.Proofs.TripleRatchet.Keys.AgreeBudget (calculateAgreement_placed_ok) open LibsignalBinary.Proofs.TripleRatchet.Keys.CreateChainBudget (createChain_placed_ok_of_contracts extractBudgetSpec subroutine_ok_createChainSpecX_of_createChainSpec) @@ -204,14 +206,15 @@ theorem coinsFillCliPlacedOk_cli [LibsignalPlacement] LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.CliSlotCalleesInstPlacedBudgetAux.coinsFillCliPlacedOk_cli mmpl g W hG -/-- Unconditional Block-`17` `isSameAccountDistinctSpec` contract on `initProgPlaced mmpl g W`. -/ -theorem w3IsSameAccount_placed_ok [LibsignalPlacement] +/-- Block-`17` `isSameAccountDistinctSpec` contract on `initProgPlaced mmpl g W` from `ExtraSpecOk g`. -/ +theorem w3IsSameAccount_placed_ok_sat [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) - (A : CryptoVerification.RustHeap.RustAlloc) (W : CliHooks) : + (A : CryptoVerification.RustHeap.RustAlloc) (W : CliHooks) + (hOk : ExtraSpecOk g) : subroutine_ok (initProgPlaced mmpl g W) (lsmpl.base 17) (withLsCodeRoLoaded lsmpl (isSameAccountDistinctSpec A uuidTryParse)) := - LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.CliSlotCalleesInstPlacedBudgetAux.w3IsSameAccount_placed_ok - mmpl g A W + LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.CliSlotCalleesInstPlacedBudgetAux.w3IsSameAccount_placed_ok_sat + mmpl g A W hOk /-- Block-`54` `extractBudgetSpec W.C.F` contract on Block `40` under `LibsignalTripleRatchet.withLsCodeRoLoaded lsmpl` from `CliGhostAllocHooks` and `hMs`. -/ @@ -250,7 +253,7 @@ theorem w3A4_placed_ok [LibsignalPlacement] {M : AllocCostModel} HkdfPlacedHooksExactBudgetSat.of_exactSat hMs exact { verifySignature := hSpqr.verifySignature - isSameAccount := w3IsSameAccount_placed_ok mmpl g A.repAlloc W + isSameAccount := w3IsSameAccount_placed_ok_sat mmpl g A.repAlloc W hG.extraOk spqrInitialState := hSpqr.spqrInitialState_initProg pqxdhHkdfExtract := fun X => pqxdhHkdfExtract_placed_ok_sat (primitivesMatchCrypto_modelPrims X ⟨W.C, W.Q⟩) @@ -315,12 +318,9 @@ private theorem createChain40_cro_placed_ok [LibsignalPlacement] have : HkdfPlacedHooksExactSat W.C.F (cliGhostExterns g (cliExternsPlaced mmpl W)) := hh.hkdf have : HkdfPlacedHooksExactBudgetSat W.C.F (cliGhostExterns g (cliExternsPlaced mmpl W)) := HkdfPlacedHooksExactBudgetSat.of_exactSat (hookSat_of_keepsFs hh.memsetRegionKeepsFs) - have hct207 := ct_eq_ro_placed_vm_ok_of_block - (callerProg := (blkPC_207).rebase (blkPl_207).base (cliGhostExterns g (cliExternsPlaced mmpl W))) - hh.blackBox (by decide) have hag40 := keys_ls_subroutine_ok_of_block_cro (callerProg := (blkPC_40).rebase (blkPl_40).base (cliGhostExterns g (cliExternsPlaced mmpl W))) - (calculateAgreement_placed_ok hh.dh hh.sharedDrop hct207 + (calculateAgreement_placed_ok_unconditional_sat hh.dh hh.sharedDrop hh.blackBox (hookSat_noAllocShimBudget_of_withVmPreserved hh.shim) hh.rawAlloc hh.staticDrop) have hext40 := extract_placed_vm_ok_of_other_block_sat W.C (callerProg := (blkPC_40).rebase (blkPl_40).base (cliGhostExterns g (cliExternsPlaced mmpl W))) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetCallees.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetCallees.lean index 7927067c6..25c8884cf 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetCallees.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetCallees.lean @@ -151,11 +151,11 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Ratchet.EncryptLemmas.I ) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_compress256Multi_budget_sat - cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_durationSinceBounded_budget_sat - cliExternsPlaced_exactMemcpy_sat cliExternsPlaced_framelessMemcpy_budget_sat - cliExternsPlaced_noAllocShim_budget_sat cliExternsPlaced_realloc_budget_sat - cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat - cliExternsPlaced_shim_budget_sat cliExternsPlaced_timeAdd_budget_sat + cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_exactMemcpy_sat + cliExternsPlaced_framelessMemcpy_budget_sat cliExternsPlaced_noAllocShim_budget_sat + cliExternsPlaced_realloc_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat + cliExternsPlaced_sessionMemsetRegion_budget_sat cliExternsPlaced_shim_budget_sat + cliGhostExterns_durationSinceBounded_budget_sat cliGhostExterns_timeAdd_budget_sat ) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (noAllocShimBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Alloc.PublicKeySerializeBudget ( @@ -261,10 +261,12 @@ theorem publicApiEncHooksBudget_cli [LibsignalPlacement] {M : AllocCostModel} realloc := cliExternsPlaced_realloc_budget_sat mmpl g W hH.alloc.toCliGhostAllocHooks memcpy := cliExternsPlaced_sessionMemcpyRegion_budget_sat mmpl g W hH.alloc.toCliGhostAllocHooks stringClone := hH.stringCloneEnc - timeAdd := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_timeAdd_budget_sat mmpl W) - durationSince := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_durationSinceBounded_budget_sat mmpl W) + timeAdd := + cliGhostExterns_timeAdd_budget_sat g (cliExternsPlaced mmpl W) + hH.alloc.toCliGhostAllocHooks.extraOk + durationSince := + cliGhostExterns_durationSinceBounded_budget_sat g (cliExternsPlaced mmpl W) + hH.alloc.toCliGhostAllocHooks.extraOk handleError := cliGhostExterns_panic_handle_error mmpl g W handleAllocError := cliGhostExterns_panic_handle_alloc_error mmpl g W expectFailed := cliGhostExterns_panic_option_expect_failed mmpl g W diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetSeams.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetSeams.lean index da78a4f73..16a55bcde 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetSeams.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/CliSlotCalleesInstPlacedBudgetSeams.lean @@ -44,7 +44,7 @@ set_option linter.dupNamespace false namespace LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.CliSlotCalleesInstPlacedBudgetSeams -open Arm64 Arm64.Obj Arm64.Process ProofLib +open Arm64 Arm64.Obj Arm64.Process ProofLib SepProp open CryptoGames.LibsignalSession (Crypto) open CryptoGames.LibsignalSessionApi (SessionRecord) open CryptoVerification (LibsignalHooks LibsignalPlacement lsBlackBoxU8Sym lsmpl lsρ) @@ -64,7 +64,7 @@ open CryptoVerification.SignalSession ( lsRustAllocZeroedSymCli lsStringCloneSym ) open CryptoVerification.SignalSession.Cli.KitInst ( - cliGhostExterns_blackBox cliIdentityVtRoSym cliIdentityVtablesPlacedOk cliSessionVtRoSym + cliIdentityVtRoSym cliIdentityVtablesPlacedOk cliSessionVtRoSym ) open CryptoVerification.SignalSession.Cli.KitInst.IdKit ( savePollNeed saveShimNeed trustPollNeed trustShimNeed @@ -106,7 +106,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Dir.Put.PlacedBudgetAux (DirPutEnv open LibsignalBinary.Proofs.SignalSession.Cli.Dir.PutStr.PlacedBudget (dirPutStr_placed_ok_of_deps) open LibsignalBinary.Proofs.SignalSession.Cli.Dir.PutStr.PlacedBudgetAux (DirPutStrEnv) open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.IdentityKitOkPlacedBudget ( - cliIdKitOkIE_placed cliIdentityKitDefaultBudgetEnv + cliIdKitOkIE_placed_sat cliIdentityKitDefaultBudgetEnv ) open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.SessionKitOkCliPlacedBudget ( cliGrowOneDir_placed_ok cliSessKitOkSE_cli_scopeKit_placed cliSessionKitDefaultBudgetEnv @@ -248,12 +248,6 @@ theorem skeletonHooks_of_slotHooks [LibsignalPlacement] {M : AllocCostModel} RunHooksPlaced A lim (cliGhostExterns g (cliExternsPlaced mmpl W)) := RunHooksPlaced.of_hooks mmpl g W hH.alloc hH.strClone_fsT hH.stringClone hH.formatInner -theorem cliGhostExterns_blackBox_eq (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) - (W : CliHooks) : - cliGhostExterns g (cliExternsPlaced mmpl W) lsBlackBoxU8Sym = - some CryptoVerification.LibsignalSession.blackBoxHook := - cliGhostExterns_blackBox mmpl g W - noncomputable abbrev w1SessKitBudgetEnv [LibsignalPlacement] (A : CryptoVerification.RustHeap.RustAlloc) (B : RunBudgets) (DeserEnv : SessionRecord (List (BitVec 8)) → List AllocEvent → Prop) @@ -346,7 +340,7 @@ theorem w1IdKitPlaced_okIE [LibsignalPlacement] {M : AllocCostModel} IdentityStoreKitPlacedOkI A lim (w1IdKitPlaced A.repAlloc B F0 peer) (w1IdKitBudgetEnv A.repAlloc B ReadEnv F0 peer) (cliGhostExterns g (cliExternsPlaced mmpl W)) := - cliIdKitOkIE_placed + cliIdKitOkIE_placed_sat (rd := cliIo.rd) (F0 := F0) (pathOk := cliWrOk) (peer := peer) (readStk := B.readFile) (s1 := trustShimNeed) (s2 := trustPollNeed B.readFile) @@ -354,7 +348,7 @@ theorem w1IdKitPlaced_okIE [LibsignalPlacement] {M : AllocCostModel} (vtSym := cliIdentityVtRoSym) (readProg := lsProg_589 (cliGhostExterns g (cliExternsPlaced mmpl W))) (jRead := 589) hDropNz (fun _ hp => hp.2) (skeletonHooks_of_slotHooks hH) (hH.readFile B.readFile) - (cliGhostExterns_blackBox_eq mmpl g W) + (skeletonHooks_of_slotHooks hH).blackBox (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (by decide) (by decide) @@ -377,7 +371,7 @@ theorem dirPutStrPlacedOk_cli [LibsignalPlacement] {M : AllocCostModel} (hH : CliSlotAllocHooks mmpl g W A lim ReadEnv) : DirPutStrPlacedOk mmpl g W A lim := let hh := skeletonHooks_of_slotHooks hH - dirPutStr_placed_ok_of_deps hh.alloc hh.panics hh.memcpyRO hh.bcmp + dirPutStr_placed_ok_of_deps hh.alloc hh.panics hh.memcpyRO hh.bcmp.of_keepsFs (growProg := lsProg_586 (cliGhostExterns g (cliExternsPlaced mmpl W))) (jGrow := 586) (by decide) (by decide) (cliGrowOneDir_placed_ok hh.alloc hh.panics) (Nat.le_refl cliDirPutStrNeedPlaced) @@ -394,7 +388,7 @@ theorem w3DirPut_placed_ok [LibsignalPlacement] {M : AllocCostModel} let hh := skeletonHooks_of_slotHooks hH dirPut_placed_caller_ok_of_deps (callerProg := lsProg_542 (cliGhostExterns g (cliExternsPlaced mmpl W))) (i := 542) - hh.alloc hh.bcmp + hh.alloc hh.bcmp.of_keepsFs (growProg := lsProg_586 (cliGhostExterns g (cliExternsPlaced mmpl W))) (jGrow := 586) (by decide) (by decide) (cliGrowOneDir_placed_ok hh.alloc hh.panics) (Nat.le_refl dirPutNeedPlaced) (by decide) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/KeepsFs.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/KeepsFs.lean index edb212a42..e548d9d01 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/KeepsFs.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/KeepsFs.lean @@ -43,6 +43,28 @@ theorem _root_.Arm64.HookOk.keepsFs {α : Type} {h : State → State} {spec : Sp · exact Or.inr (Or.inr (Or.inl hex)) · exact Or.inr (Or.inr (Or.inr hoom)) +/-- Drop `.keepsFs` from any `HookOk h spec.keepsFs`. -/ +theorem _root_.Arm64.HookOk.of_keepsFs {α : Type} {h : State → State} {spec : Spec α} + (hh : HookOk h spec.keepsFs) : HookOk h spec := by + intro x R s0 hrun hpre hsp + obtain ⟨hkf, hsym, hout⟩ := hh x R s0 hrun hpre hsp + refine ⟨hkf, hsym, ?_⟩ + rcases hout with ⟨hret, hcc, hpost⟩ | hpan | hex | hoom + · refine Or.inl ⟨hret, hcc, ?_⟩ + dsimp only [Arm64.Spec.keepsFs] at hpost + rw [sepConj_assoc, satisfies_pure_sepConj] at hpost + exact hpost.2 + · exact Or.inr (Or.inl hpan) + · exact Or.inr (Or.inr (Or.inl hex)) + · exact Or.inr (Or.inr (Or.inr hoom)) + +/-- Drop `.keepsFs` from any `HookSat hooks name spec.keepsFs`. -/ +theorem _root_.Arm64.HookSat.of_keepsFs {α : Type} {hooks : String → Option (State → State)} + {name : String} {spec : Spec α} (hh : HookSat hooks name spec.keepsFs) : + HookSat hooks name spec := by + obtain ⟨f, hfn, hok⟩ := hh + exact ⟨f, hfn, hok.of_keepsFs⟩ + /-- `retHook f` keeps `fs` when `f` does (`setPC` does not touch `fs`). -/ theorem retHook_fs {f : State → State} (hf : ∀ s, (f s).fs = s.fs) : ∀ s, (retHook f s).fs = s.fs := by diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/M2PlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/M2PlacedBudget.lean index 113b9c94f..87fabc1d4 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/M2PlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/M2PlacedBudget.lean @@ -42,7 +42,7 @@ open CryptoVerification.LibsignalTripleRatchet (extHookStack) open CryptoVerification.LibsignalTripleRatchetRepr (UuidParser uuidTryParse) open CryptoVerification.RustHeap (allocFailedIn) open CryptoVerification.SignalSession - (CliHooks Inputs cliExternsPlaced fromUtf8Hook lsFromUtf8Sym lsMemrchrSym memrchrHook strlenHook) + (Inputs fromUtf8Hook lsFromUtf8Sym lsMemrchrSym memrchrHook strlenHook) open CryptoVerification.SignalSession.Cli (CliInputsOk) open CryptoVerification.SignalSession.Cli.MainHops (AtCallPlaced AtM1EndPlaced CallV CallW LsCodeInv argsBuf callCellsPlaced callHeap locals @@ -51,8 +51,7 @@ open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FitsEnv FitsEvents OomPreserved RustCliAllocBudget SeqEnv rustAllocEvents rustDeallocEvents) open LibsignalBinary.Proofs.SignalSession.Cli.M24.AddressRoA1PlacedBudget - (mainCalleesROBlk617_of_mainCalleesBlk617_and_hooks - mainCalleesROBlk617_of_mainCalleesBlk617_cliExterns) + (mainCalleesROBlk617_of_mainCalleesBlk617_and_hooks) open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (argvAtROP) open LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO (MainCalleesROBlk617) open LibsignalBinary.Proofs.SignalSession.Cli.Main.HopsPlacedBudget @@ -407,53 +406,6 @@ theorem main_m2_pool_placed_of_hooks [LibsignalPlacement] {CodeOk : Memory → P (mainCalleesROBlk617_of_mainCalleesBlk617_and_hooks hc hstrlen hutf8 hmemrchr hres hres64) hstk hstk64 hok hne hps hfit hs hexit hnext -/-- Specialization of `main_m2_pool_placed_of_hooks` to `cliExternsPlaced mmpl W` via -`AddressRoA1PlacedBudget.mainCalleesROBlk617_of_mainCalleesBlk617_cliExterns`. -/ -theorem main_m2_pool_placed_cliExterns [LibsignalPlacement] {CodeOk : Memory → Prop} - [LsCodeInv CodeOk] {M : AllocCostModel} (mmpl : Obj.MultiPlacement) (W : CliHooks) - {A : RustCliAllocBudget M} {lim : BudgetLimits} {st : M.σ} - {i : Inputs} {s0 s : State} {stk hookStack resStack : Nat} - {buf p0 : BitVec 64} {ps : List (BitVec 64 × List (BitVec 8))} - {Statics : SepProp} {Q Qp : State → SepProp → Prop} {oom : State → SepProp} - (hc : MainCalleesBlk617 A lim (cliExternsPlaced mmpl W) uuidTryParse hookStack resStack) - (hres : 0xB0 + extHookStack ≤ resStack) (hres64 : resStack ≤ 2 ^ 63) - (hstk : mainFrameSize + max (max extHookStack hookStack) resStack ≤ stk) - (hstk64 : stk ≤ 2 ^ 63) - (hok : CliInputsOk i) (hne : i.argv ≠ []) - (hps : ps.map (·.2) = i.argv.map bytesOfString) - (hfit : FitsEnv M lim st (M2PreDeallocEnv uuidTryParse (i.argv.map bytesOfString))) - (hs : AtM1EndPlaced CodeOk s0 s i.argv.length buf) - (hexit : ExitKPoolPlaced CodeOk (cliExternsPlaced mmpl W) A lim s0 stk - (fun code s' => code = 2 ∧ parseArgs uuidTryParse (i.argv.map bytesOfString) = none ∧ - s'.trace = s0.trace ∧ s'.fs = s0.fs) Q Qp) - (hnext : ∀ (s' : State) (vcap : BitVec 64) (evs_c : List AllocEvent) (w : CallW) (c : CallV), - M2CollectEnv i.argv.length evs_c → - vcap ≠ 0#64 → - parseArgs uuidTryParse (i.argv.map bytesOfString) = some c → - AtCallPlaced CodeOk s0 s' w i.argv.length buf → - ProofLib.SepWPp (mProgPlaced (cliExternsPlaced mmpl W)) (s0.readReg64 .lr) s' - (callHeap A.repAlloc w c ∗ argsBuf A.repAlloc (BitVec.ofNat 64 i.argv.length) buf ps ∗ - argvAtROP (s0.readReg64 .x1) ((p0, bytesOfString "libsignal-cli") :: ps) ∗ - mainSaved s0 ∗ locals (s0.sp - BitVec.ofNat 64 mainFrameSize) - (callCellsPlaced (s0.sp - BitVec.ofNat 64 mainFrameSize) w) ∗ - stackAt (s0.sp - BitVec.ofNat 64 mainFrameSize) (stk - mainFrameSize) ∗ - A.pool lim - (M.stepEvents (rustDeallocEvents (vcap.toNat * 16) 8) - (M.stepEvents (m2DispatchEvents uuidTryParse (i.argv.map bytesOfString)) - (M.stepEvents evs_c st))) s' ∗ - Statics) - Q Qp oom) : - ProofLib.SepWPp (mProgPlaced (cliExternsPlaced mmpl W)) (s0.readReg64 .lr) s - (argsBuf A.repAlloc (BitVec.ofNat 64 i.argv.length) buf ps ∗ - argvAtROP (s0.readReg64 .x1) ((p0, bytesOfString "libsignal-cli") :: ps) ∗ - mainSaved s0 ∗ locals (s0.sp - BitVec.ofNat 64 mainFrameSize) [] ∗ - stackAt (s0.sp - BitVec.ofNat 64 mainFrameSize) (stk - mainFrameSize) ∗ - A.pool lim st s ∗ Statics) - Q Qp oom := - main_m2_pool_placed_proof - (mainCalleesROBlk617_of_mainCalleesBlk617_cliExterns mmpl W hc hres hres64) - hstk hstk64 hok hne hps hfit hs hexit hnext - /-- Ready-made `step2` discharge for `B2MainFrameComposeBudget.b2MainSpecTightNeedLocksFineAt_of_steps` over any `H : LibsignalHooks` satisfying `MainCalleesBlk617` and the three hook equalities. -/ theorem b2_step2_pool_placed_of_hooks [LibsignalPlacement] {CodeOk : Memory → Prop} @@ -515,60 +467,4 @@ theorem b2_step2_pool_placed_of_hooks [LibsignalPlacement] {CodeOk : Memory → fun s' vcap evs_c w c hevs_c hvcap hp ha => hnext s' w c _ (hst2 hst1 hok hne hevs_c hvcap hp) hp ha -/-- Ready-made `step2` discharge specialized to `cliExternsPlaced mmpl W`. -/ -theorem b2_step2_pool_placed_cliExterns [LibsignalPlacement] {CodeOk : Memory → Prop} - [LsCodeInv CodeOk] {M : AllocCostModel} (mmpl : Obj.MultiPlacement) (W : CliHooks) - {A : RustCliAllocBudget M} {lim : BudgetLimits} - {stk hookStack resStack : Nat} - {St1 : Inputs → M.σ → Prop} {St2 : Inputs → CallV → M.σ → Prop} - (hc : MainCalleesBlk617 A lim (cliExternsPlaced mmpl W) uuidTryParse hookStack resStack) - (hres : 0xB0 + extHookStack ≤ resStack) (hres64 : resStack ≤ 2 ^ 63) - (hstk : mainFrameSize + max (max extHookStack hookStack) resStack ≤ stk) - (hstk64 : stk ≤ 2 ^ 63) - (hfit_st1 : ∀ {i : Inputs} {st1 : M.σ}, St1 i st1 → CliInputsOk i → i.argv ≠ [] → - FitsEnv M lim st1 (M2PreDeallocEnv uuidTryParse (i.argv.map bytesOfString))) - (hst2 : ∀ {i : Inputs} {c : CallV} {st1 : M.σ} {vcap : BitVec 64} {evs_c : List AllocEvent}, - St1 i st1 → CliInputsOk i → i.argv ≠ [] → - M2CollectEnv i.argv.length evs_c → vcap ≠ 0#64 → - parseArgs uuidTryParse (i.argv.map bytesOfString) = some c → - St2 i c - (M.stepEvents (rustDeallocEvents (vcap.toNat * 16) 8) - (M.stepEvents (m2DispatchEvents uuidTryParse (i.argv.map bytesOfString)) - (M.stepEvents evs_c st1)))) : - ∀ {i : Inputs} {s0 s : State} {buf p0 : BitVec 64} - {ps : List (BitVec 64 × List (BitVec 8))} {st1 : M.σ} {Statics : SepProp} - {Q Qp : State → SepProp → Prop} {oom : State → SepProp}, - St1 i st1 → - CliInputsOk i → i.argv ≠ [] → - ps.map (·.2) = i.argv.map bytesOfString → - AtM1EndPlaced CodeOk s0 s i.argv.length buf → - (∀ sf Pf, allocFailedIn s0 sf → Qp sf Pf) → - ExitKPoolPlaced CodeOk (cliExternsPlaced mmpl W) A lim s0 stk - (fun code s' => code = 2 ∧ parseArgs uuidTryParse (i.argv.map bytesOfString) = none ∧ - s'.trace = s0.trace ∧ s'.fs = s0.fs) Q Qp → - (∀ (s' : State) (w : CallW) (c : CallV) (st2 : M.σ), - St2 i c st2 → - parseArgs uuidTryParse (i.argv.map bytesOfString) = some c → - AtCallPlaced CodeOk s0 s' w i.argv.length buf → - ProofLib.SepWPp (mProgPlaced (cliExternsPlaced mmpl W)) (s0.readReg64 .lr) s' - (callHeap A.repAlloc w c ∗ argsBuf A.repAlloc (BitVec.ofNat 64 i.argv.length) buf ps ∗ - argvAtROP (s0.readReg64 .x1) ((p0, bytesOfString "libsignal-cli") :: ps) ∗ - mainSaved s0 ∗ locals (s0.sp - BitVec.ofNat 64 mainFrameSize) - (callCellsPlaced (s0.sp - BitVec.ofNat 64 mainFrameSize) w) ∗ - stackAt (s0.sp - BitVec.ofNat 64 mainFrameSize) (stk - mainFrameSize) ∗ - A.pool lim st2 s' ∗ Statics) - Q Qp oom) → - ProofLib.SepWPp (mProgPlaced (cliExternsPlaced mmpl W)) (s0.readReg64 .lr) s - (argsBuf A.repAlloc (BitVec.ofNat 64 i.argv.length) buf ps ∗ - argvAtROP (s0.readReg64 .x1) ((p0, bytesOfString "libsignal-cli") :: ps) ∗ - mainSaved s0 ∗ locals (s0.sp - BitVec.ofNat 64 mainFrameSize) [] ∗ - stackAt (s0.sp - BitVec.ofNat 64 mainFrameSize) (stk - mainFrameSize) ∗ - A.pool lim st1 s ∗ Statics) - Q Qp oom := - fun hst1 hok hne hps hs _hpanic hexit hnext => - main_m2_pool_placed_cliExterns mmpl W hc hres hres64 hstk hstk64 hok hne hps - (hfit_st1 hst1 hok hne) hs hexit - fun s' vcap evs_c w c hevs_c hvcap hp ha => - hnext s' w c _ (hst2 hst1 hok hne hevs_c hvcap hp) hp ha - end LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.M2PlacedBudget diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/M2PlacedBudgetSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/M2PlacedBudgetSat.lean index c5545953d..7552b784f 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/M2PlacedBudgetSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/M2PlacedBudgetSat.lean @@ -36,7 +36,7 @@ open CryptoVerification.LibsignalTripleRatchet (extHookStack) open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) open CryptoVerification.RustHeap (allocFailedIn) open CryptoVerification.SignalSession - (Inputs lsFromUtf8Sym lsMemrchrSym strlenHook) + (Inputs lsFromUtf8Sym lsMemrchrSym) open CryptoVerification.SignalSession.Cli (CliInputsOk) open CryptoVerification.SignalSession.Cli.MainHops (AtCallPlaced AtM1EndPlaced CallV CallW LsCodeInv argsBuf callCellsPlaced callHeap locals @@ -68,7 +68,6 @@ theorem main_m2_pool_placed_of_hooks_sat [LibsignalPlacement] {CodeOk : Memory {buf p0 : BitVec 64} {ps : List (BitVec 64 × List (BitVec 8))} {Statics : SepProp} {Q Qp : State → SepProp → Prop} {oom : State → SepProp} (hc : MainCalleesBlk617 A lim H uuidTryParse hookStack resStack) - (hstrlen : H "strlen" = some strlenHook) (hutf8 : HookSat H lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) (hmemrchr : HookSat H lsMemrchrSym (withLsRet (withVmPreserved (memrchrSpecRO extHookStack)))) (hres : 0xB0 + extHookStack ≤ resStack) (hres64 : resStack ≤ 2 ^ 63) @@ -106,7 +105,7 @@ theorem main_m2_pool_placed_of_hooks_sat [LibsignalPlacement] {CodeOk : Memory A.pool lim st s ∗ Statics) Q Qp oom := main_m2_pool_placed_proof - (mainCalleesROBlk617_of_mainCalleesBlk617_and_hooks_sat hc hstrlen hutf8 hmemrchr hres hres64) + (mainCalleesROBlk617_of_mainCalleesBlk617_and_hooks_sat hc hutf8 hmemrchr hres hres64) hstk hstk64 hok hne hps hfit hs hexit hnext /-- `HookSat` sibling of `b2_step2_pool_placed_of_hooks` (`M2PlacedBudget.lean:475`), weakening @@ -117,7 +116,6 @@ theorem b2_step2_pool_placed_of_hooks_sat [LibsignalPlacement] {CodeOk : Memory {stk hookStack resStack : Nat} {St1 : Inputs → M.σ → Prop} {St2 : Inputs → CallV → M.σ → Prop} (hc : MainCalleesBlk617 A lim H uuidTryParse hookStack resStack) - (hstrlen : H "strlen" = some strlenHook) (hutf8 : HookSat H lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) (hmemrchr : HookSat H lsMemrchrSym (withLsRet (withVmPreserved (memrchrSpecRO extHookStack)))) (hres : 0xB0 + extHookStack ≤ resStack) (hres64 : resStack ≤ 2 ^ 63) @@ -164,7 +162,7 @@ theorem b2_step2_pool_placed_of_hooks_sat [LibsignalPlacement] {CodeOk : Memory A.pool lim st1 s ∗ Statics) Q Qp oom := fun hst1 hok hne hps hs _hpanic hexit hnext => - main_m2_pool_placed_of_hooks_sat hc hstrlen hutf8 hmemrchr hres hres64 hstk hstk64 hok hne hps + main_m2_pool_placed_of_hooks_sat hc hutf8 hmemrchr hres hres64 hstk hstk64 hok hne hps (hfit_st1 hst1 hok hne) hs hexit fun s' vcap evs_c w c hevs_c hvcap hp ha => hnext s' w c _ (hst2 hst1 hok hne hevs_c hvcap hp) hp ha diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainAllocExtPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainAllocExtPlaced.lean index f2f107375..276b381bd 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainAllocExtPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainAllocExtPlaced.lean @@ -104,21 +104,6 @@ private theorem hookOk_sessionMemcpyRegionRO_of_cliExt {f : State → State} dsimp only [withStack, CryptoVerification.SpqrV1.Alloc.sessionMemcpyRegionROSpec, CliExt.memcpyROSpec, CliExt.withStack] at hpost ⊢ rw [hsp]; simp only [sepConj_assoc, satisfies_pure_sepConj] at hpost ⊢ exact ⟨hpost.1, by have h2 := hpost.2; ac_nf at h2 ⊢⟩⟩ -private theorem hookOk_sessionMemmove_of_cliExt {f : State → State} - (hh : HookOk f CliExt.memmoveSpec) (stk : Nat) (hle : extHookStack ≤ stk) (hmax : stk ≤ 2 ^ 64) : - HookOk f (sessionMemmoveSpec stk) := by - refine hookOk_conseq hh fun ⟨base, buf, dst, src, len⟩ R s0 hpre => ?_ - have hsp := stackAt_split_ge (sp := s0.sp) (memHookStack_le_of_ext hle) hmax - refine ⟨(base, buf, dst, src, len), memRegion (s0.sp - BitVec.ofNat 64 stk) (stk - CliExt.memHookStack), - by dsimp only [sessionMemmoveSpec, CliExt.memmoveSpec, libcMemmoveSpec] at hpre ⊢; rw [hsp] at hpre; ac_nf at hpre ⊢, - fun sf hpost => by dsimp only [sessionMemmoveSpec, CliExt.memmoveSpec] at hpost ⊢; rw [hsp]; ac_nf at hpost ⊢⟩ -private theorem hookOk_libcMemmove_of_cliExt {f : State → State} - (hh : HookOk f CliExt.memmoveSpec) (stk : Nat) (hle : extHookStack ≤ stk) (hmax : stk ≤ 2 ^ 64) : - HookOk f (libcMemmoveSpec stk) := - hookOk_conseq (hookOk_sessionMemmove_of_cliExt hh stk hle hmax) fun x R s0 hpre => ⟨x, emp, - by simpa [sessionMemmoveSpec, libcMemmoveSpec, emp_sepConj] using hpre, fun sf hpost => by - dsimp only [sessionMemmoveSpec, libcMemmoveSpec] at hpost ⊢ - simp only [emp_sepConj, sepConj_assoc, satisfies_pure_sepConj] at hpost ⊢; exact ⟨hpost.1.1, hpost.2⟩⟩ private theorem hookOk_sessionMemset_of_cliExt {f : State → State} (hh : HookOk f CliExt.memsetSpec) (stk : Nat) (hle : extHookStack ≤ stk) (hmax : stk ≤ 2 ^ 64) : HookOk f (sessionMemsetSpec stk) := by @@ -193,8 +178,6 @@ theorem allocContractsFsPlaced_of_lookup [LibsignalPlacement] session_memcpy stk hle hmax := ext_stub_fs_placed_ok hOk hL.memcpy hOk.memcpy notIo_of_ne fun h => hookOk_sessionMemcpy_of_cliExt h stk hle hmax memcpy_region stk hle hmax := ext_stub_fs_placed_ok hOk hL.memcpy hOk.memcpy notIo_of_ne fun h => hookOk_memcpyRegion_of_cliExt h stk hle hmax session_memcpy_region stk hle hmax := ext_stub_fs_placed_ok hOk hL.memcpy hOk.memcpy notIo_of_ne fun h => hookOk_sessionMemcpyRegion_of_cliExt h stk hle hmax - memmove stk hle hmax := ext_stub_fs_placed_ok hOk hL.memmove hOk.memmove notIo_of_ne fun h => hookOk_libcMemmove_of_cliExt h stk hle hmax - session_memmove stk hle hmax := ext_stub_fs_placed_ok hOk hL.memmove hOk.memmove notIo_of_ne fun h => hookOk_sessionMemmove_of_cliExt h stk hle hmax memset stk hle hmax := ext_stub_fs_placed_ok hOk hL.memset hOk.memset notIo_of_ne fun h => hookOk_libcMemset_of_cliExt h stk hle hmax session_memset stk hle hmax := ext_stub_fs_placed_ok hOk hL.memset hOk.memset notIo_of_ne fun h => hookOk_sessionMemset_of_cliExt h stk hle hmax memset_region stk hle hmax := ext_stub_fs_placed_ok hOk hL.memset hOk.memset notIo_of_ne fun h => hookOk_memsetRegion_of_cliExt h stk hle hmax diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainInstAllPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainInstAllPlaced.lean index 80a1a5ea9..f0f001a60 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainInstAllPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainInstAllPlaced.lean @@ -86,6 +86,7 @@ theorem pksmSlotOkPlaced_cli [LibsignalPlacement] theorem cliTryDecryptPqV1_placed_of_spqr [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hAesDec : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsAesDecSym (aesDecSpec W.C.D E2E.HooksE.A0)) (hSpqr : SpqrV1PlacedSeams mmpl gh W) : @@ -93,7 +94,7 @@ theorem cliTryDecryptPqV1_placed_of_spqr [LibsignalPlacement] fun ctl => CryptoVerification.LibsignalTripleRatchet.DecryptPq.tryDecryptPqV1_placed_ok_PTight_cli_at_block (callerProg := Poll.dpPollProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 518) - mmpl gh W ctl hG hAesDec hSpqr (by decide) + mmpl gh W ctl hG hMv hAesDec hSpqr (by decide) /-- Assembles `RunProofs.DecPkD2cSlotOkPlaced mmpl gh W` from `RunProofs.Poll.decPkD2cSlotOk_placed_of_seams` and `cliTryDecryptPqV1_placed_of_spqr`. -/ @@ -101,6 +102,7 @@ theorem decPkD2cSlotOk_placed_of_seams [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) (hDropNz : lsmpl.base 547 ≠ 0#64) (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hRunA0 : CliA0RunHooks mmpl gh W) (hRead518 : subroutine_ok (Poll.dpPollProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsρ lsReadFileSym) @@ -123,7 +125,7 @@ theorem decPkD2cSlotOk_placed_of_seams [LibsignalPlacement] RunProofs.Poll.decPkD2cSlotOk_placed_of_seams mmpl gh W hRunA0.runHooks hRead518 (Slots.stage2ContractsMinPlaced_cli mmpl gh W hG) hDropNz hSpqr h_accept h_accept_err hLog519 - (cliTryDecryptPqV1_placed_of_spqr mmpl gh W hG hAesDec hSpqr) + (cliTryDecryptPqV1_placed_of_spqr mmpl gh W hG hMv hAesDec hSpqr) /-- Specializes `RunProofs.DecPkD2cSlotOkPlaced mmpl gh W` at `X := defaultModelExtras_placed` to witness `MainHops.CliDecPkSlotExistsPlaced mmpl gh W` @@ -141,7 +143,7 @@ theorem cliDecPkSlotExistsPlaced_of_d2c [LibsignalPlacement] /-! ## 2. Top-Level `MainOk*Placed` Theorems Parameterized Over Pre-Key & SPQR/Log Seams -/ --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost /-- Assembles `MainOkPqAllTightPlaced mmpl gh` (all 5 `CliSpecPqxdh` clauses + Clause 6 `NoMatch` under `mainSpecTightPlaced`) from `hDecPk`, `hSpqr`, and `hLog462`. -/ theorem main_ok_cli_pq_all_tight_placed_of_w4 [LibsignalPlacement] @@ -149,6 +151,7 @@ theorem main_ok_cli_pq_all_tight_placed_of_w4 [LibsignalPlacement] (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead589 : ∀ W : CliHooks, @@ -176,18 +179,19 @@ theorem main_ok_cli_pq_all_tight_placed_of_w4 [LibsignalPlacement] hMainHooks (fun W => RunCompose.cliPubCallees_placed_ok mmpl gh W (hRunHooks W)) (fun X W => - MainHops.cliSlotCallees_placed_of_seams mmpl gh X W hDropNz hG hMs hMc + MainHops.cliSlotCallees_placed_of_seams mmpl gh X W hDropNz hG hMs hMc hMv (hRunHooks W).runHooks (hRead589 W) (hAesEnc W) (hAesDec W) (hSpqr W) (hLog462 W)) (hDecPk hDropNz) (fun W => pksmSlotOkPlaced_cli mmpl gh W hG) hDropNz --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost theorem main_ok_cli_pq_all_placed_of_w4 [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead589 : ∀ W : CliHooks, @@ -210,15 +214,16 @@ theorem main_ok_cli_pq_all_placed_of_w4 [LibsignalPlacement] (withLsCodeLoaded lsmpl CryptoVerification.LibsignalTripleRatchet.FromRecordCallees.logClosurePlacedSpec)) : MainOkPqAllPlaced mmpl gh := - (main_ok_cli_pq_all_tight_placed_of_w4 mmpl gh hG hMs hMc hMainHooks hRunHooks hRead589 hAesEnc hAesDec + (main_ok_cli_pq_all_tight_placed_of_w4 mmpl gh hG hMs hMc hMv hMainHooks hRunHooks hRead589 hAesEnc hAesDec hDecPk hSpqr hLog462).toMainOkPqAllPlaced --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost theorem main_ok_cli_pq_tight_placed_of_w4 [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead589 : ∀ W : CliHooks, @@ -241,15 +246,16 @@ theorem main_ok_cli_pq_tight_placed_of_w4 [LibsignalPlacement] (withLsCodeLoaded lsmpl CryptoVerification.LibsignalTripleRatchet.FromRecordCallees.logClosurePlacedSpec)) : MainOkCliPqTightPlaced mmpl gh := - (main_ok_cli_pq_all_tight_placed_of_w4 mmpl gh hG hMs hMc hMainHooks hRunHooks hRead589 hAesEnc hAesDec + (main_ok_cli_pq_all_tight_placed_of_w4 mmpl gh hG hMs hMc hMv hMainHooks hRunHooks hRead589 hAesEnc hAesDec hDecPk hSpqr hLog462).toMainOkCliPqTightPlaced --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost theorem main_ok_cli_pq_placed_of_w4 [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead589 : ∀ W : CliHooks, @@ -272,15 +278,16 @@ theorem main_ok_cli_pq_placed_of_w4 [LibsignalPlacement] (withLsCodeLoaded lsmpl CryptoVerification.LibsignalTripleRatchet.FromRecordCallees.logClosurePlacedSpec)) : MainOkCliPqPlaced mmpl gh := - (main_ok_cli_pq_all_placed_of_w4 mmpl gh hG hMs hMc hMainHooks hRunHooks hRead589 hAesEnc hAesDec + (main_ok_cli_pq_all_placed_of_w4 mmpl gh hG hMs hMc hMv hMainHooks hRunHooks hRead589 hAesEnc hAesDec hDecPk hSpqr hLog462).toMainOkCliPqPlaced --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost theorem main_ok_over_tight_placed_of_w4 [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead589 : ∀ W : CliHooks, @@ -303,15 +310,16 @@ theorem main_ok_over_tight_placed_of_w4 [LibsignalPlacement] (withLsCodeLoaded lsmpl CryptoVerification.LibsignalTripleRatchet.FromRecordCallees.logClosurePlacedSpec)) : MainOkOverTightPlaced mmpl gh := - (main_ok_cli_pq_all_tight_placed_of_w4 mmpl gh hG hMs hMc hMainHooks hRunHooks hRead589 hAesEnc hAesDec + (main_ok_cli_pq_all_tight_placed_of_w4 mmpl gh hG hMs hMc hMv hMainHooks hRunHooks hRead589 hAesEnc hAesDec hDecPk hSpqr hLog462).toMainOkOverNormTightPlaced --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost theorem main_ok_over_placed_of_w4 [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead589 : ∀ W : CliHooks, @@ -334,15 +342,16 @@ theorem main_ok_over_placed_of_w4 [LibsignalPlacement] (withLsCodeLoaded lsmpl CryptoVerification.LibsignalTripleRatchet.FromRecordCallees.logClosurePlacedSpec)) : MainOkOverPlaced mmpl gh := - (main_ok_over_tight_placed_of_w4 mmpl gh hG hMs hMc hMainHooks hRunHooks hRead589 hAesEnc hAesDec + (main_ok_over_tight_placed_of_w4 mmpl gh hG hMs hMc hMv hMainHooks hRunHooks hRead589 hAesEnc hAesDec hDecPk hSpqr hLog462).toMainOkOverPlaced --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost theorem main_ok_no_match_tight_placed_of_w4 [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead589 : ∀ W : CliHooks, @@ -365,15 +374,16 @@ theorem main_ok_no_match_tight_placed_of_w4 [LibsignalPlacement] (withLsCodeLoaded lsmpl CryptoVerification.LibsignalTripleRatchet.FromRecordCallees.logClosurePlacedSpec)) : MainOkNoMatchTightPlaced mmpl gh := - (main_ok_cli_pq_all_tight_placed_of_w4 mmpl gh hG hMs hMc hMainHooks hRunHooks hRead589 hAesEnc hAesDec + (main_ok_cli_pq_all_tight_placed_of_w4 mmpl gh hG hMs hMc hMv hMainHooks hRunHooks hRead589 hAesEnc hAesDec hDecPk hSpqr hLog462).toMainOkNoMatchTightPlaced --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost theorem main_ok_no_match_placed_of_w4 [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead589 : ∀ W : CliHooks, @@ -396,16 +406,17 @@ theorem main_ok_no_match_placed_of_w4 [LibsignalPlacement] (withLsCodeLoaded lsmpl CryptoVerification.LibsignalTripleRatchet.FromRecordCallees.logClosurePlacedSpec)) : MainOkNoMatchPlaced mmpl gh := - (main_ok_cli_pq_all_placed_of_w4 mmpl gh hG hMs hMc hMainHooks hRunHooks hRead589 hAesEnc hAesDec + (main_ok_cli_pq_all_placed_of_w4 mmpl gh hG hMs hMc hMv hMainHooks hRunHooks hRead589 hAesEnc hAesDec hDecPk hSpqr hLog462).toMainOkNoMatchPlaced --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost /-- Tightened SM-domain `MainOkCliSmTightPlaced mmpl gh` assembled via `main_ok_cli_sm_tight_placed`. -/ theorem main_ok_cli_sm_tight_placed_of_w4 [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead589 : ∀ W : CliHooks, @@ -432,18 +443,19 @@ theorem main_ok_cli_sm_tight_placed_of_w4 [LibsignalPlacement] main_ok_cli_sm_tight_placed mmpl gh W (hMainHooks W) (RunCompose.cliPubCallees_placed_ok mmpl gh W (hRunHooks W)) - (MainHops.cliSlotCallees_placed_of_seams mmpl gh defaultModelExtras_placed W hDropNz hG hMs hMc + (MainHops.cliSlotCallees_placed_of_seams mmpl gh defaultModelExtras_placed W hDropNz hG hMs hMc hMv (hRunHooks W).runHooks (hRead589 W) (hAesEnc W) (hAesDec W) (hSpqr W) (hLog462 W)) (MainHops.cliPksmSlotExistsPlaced mmpl gh W hG) (cliDecPkSlotExistsPlaced_of_d2c mmpl gh W (hDecPk hDropNz W)) --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost /-- Non-tight SM-domain `MainOkCliSmPlaced mmpl gh` assembled via `main_ok_cli_sm_placed`. -/ theorem main_ok_cli_sm_placed_of_w4 [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead589 : ∀ W : CliHooks, @@ -470,12 +482,12 @@ theorem main_ok_cli_sm_placed_of_w4 [LibsignalPlacement] main_ok_cli_sm_placed mmpl gh W (hMainHooks W) (RunCompose.cliPubCallees_placed_ok mmpl gh W (hRunHooks W)) - (MainHops.cliSlotCallees_placed_of_seams mmpl gh defaultModelExtras_placed W hDropNz hG hMs hMc + (MainHops.cliSlotCallees_placed_of_seams mmpl gh defaultModelExtras_placed W hDropNz hG hMs hMc hMv (hRunHooks W).runHooks (hRead589 W) (hAesEnc W) (hAesDec W) (hSpqr W) (hLog462 W)) (MainHops.cliPksmSlotExistsPlaced mmpl gh W hG) (cliDecPkSlotExistsPlaced_of_d2c mmpl gh W (hDecPk hDropNz W)) --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost /-- Assembles `MainOkPqAllTightPlaced mmpl gh` with `hDecPk` discharged via `decPkD2cSlotOk_placed_of_seams`. -/ theorem main_ok_cli_pq_all_tight_placed_of_poll_seams [LibsignalPlacement] @@ -483,6 +495,7 @@ theorem main_ok_cli_pq_all_tight_placed_of_poll_seams [LibsignalPlacement] (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead518 : ∀ W : CliHooks, @@ -519,13 +532,13 @@ theorem main_ok_cli_pq_all_tight_placed_of_poll_seams [LibsignalPlacement] (withLsCodeLoaded lsmpl CryptoVerification.LibsignalTripleRatchet.FromRecordCallees.logClosurePlacedSpec)) : MainOkPqAllTightPlaced mmpl gh := - main_ok_cli_pq_all_tight_placed_of_w4 mmpl gh hG hMs hMc hMainHooks hRunHooks hRead589 hAesEnc hAesDec + main_ok_cli_pq_all_tight_placed_of_w4 mmpl gh hG hMs hMc hMv hMainHooks hRunHooks hRead589 hAesEnc hAesDec (fun hDropNz W => - SignalSession.decPkD2cSlotOk_placed_of_seams mmpl gh W hDropNz hG (hRunHooks W) (hRead518 W) + SignalSession.decPkD2cSlotOk_placed_of_seams mmpl gh W hDropNz hG hMv (hRunHooks W) (hRead518 W) (hAesDec W) (hSpqr W) (fun X => h_accept X W) (fun X => h_accept_err X W) hLog519) hSpqr hLog462 --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost /-- Assembles `MainOkCliSmTightPlaced mmpl gh` with `hDecPk` discharged via `decPkD2cSlotOk_placed_of_seams`. -/ theorem main_ok_cli_sm_tight_placed_of_poll_seams [LibsignalPlacement] @@ -533,6 +546,7 @@ theorem main_ok_cli_sm_tight_placed_of_poll_seams [LibsignalPlacement] (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead518 : ∀ W : CliHooks, @@ -569,15 +583,15 @@ theorem main_ok_cli_sm_tight_placed_of_poll_seams [LibsignalPlacement] (withLsCodeLoaded lsmpl CryptoVerification.LibsignalTripleRatchet.FromRecordCallees.logClosurePlacedSpec)) : MainOkCliSmTightPlaced mmpl gh := - main_ok_cli_sm_tight_placed_of_w4 mmpl gh hG hMs hMc hMainHooks hRunHooks hRead589 hAesEnc hAesDec + main_ok_cli_sm_tight_placed_of_w4 mmpl gh hG hMs hMc hMv hMainHooks hRunHooks hRead589 hAesEnc hAesDec (fun hDropNz W => - SignalSession.decPkD2cSlotOk_placed_of_seams mmpl gh W hDropNz hG (hRunHooks W) (hRead518 W) + SignalSession.decPkD2cSlotOk_placed_of_seams mmpl gh W hDropNz hG hMv (hRunHooks W) (hRead518 W) (hAesDec W) (hSpqr W) (fun X => h_accept X W) (fun X => h_accept_err X W) hLog519) hSpqr hLog462 /-! ## 3. Closed `[LibsignalFullPlacement]` `main`-Level Theorems (`0` Mutated-Callee Seam Premises) -/ --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost /-- Closed `[LibsignalFullPlacement]` assembly of `RunProofs.DecPkD2cSlotOkFrozenPlaced mmpl gh W` (`SpqrV1PlacedSeams` is discharged via `spqrV1PlacedSeams_ok` and `h_accept` / `h_accept_err` / `hLog519` are discharged inside `decPkD2cSlotOk_full_placed_of_seams`). -/ @@ -587,6 +601,7 @@ theorem decPkD2cSlotOk_frozen_placed [LibsignalFullPlacement] (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hRunA0 : CliA0RunHooks mmpl gh W) (hRead518 : subroutine_ok (Poll.dpPollProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsρ lsReadFileSym) @@ -598,11 +613,11 @@ theorem decPkD2cSlotOk_frozen_placed [LibsignalFullPlacement] RunProofs.DecPkD2cSlotOkFrozenPlaced mmpl gh W := let hSpqr := LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsInst.spqrV1PlacedSeams_ok - mmpl gh W hG hMs hMc hHmac + mmpl gh W hG hMs hMc hMv hHmac RunProofs.Poll.decPkD2cSlotOk_full_placed_of_seams mmpl gh W hRunA0.runHooks hRead518 (Slots.stage2ContractsMinPlaced_cli mmpl gh W hG) hDropNz hG hSpqr - (cliTryDecryptPqV1_placed_of_spqr mmpl gh W hG hAesDec hSpqr) + (cliTryDecryptPqV1_placed_of_spqr mmpl gh W hG hMv hAesDec hSpqr) /-- Specializes `RunProofs.DecPkD2cSlotOkFrozenPlaced mmpl gh W` at `X := defaultModelExtras_placed` to witness `MainHops.CliDecPkSlotExistsFrozenPlaced mmpl gh W`. -/ @@ -617,7 +632,7 @@ theorem cliDecPkSlotExistsFrozenPlaced_of_d2c [LibsignalPlacement] fun S needs hfiles hdec hok hneed => h defaultModelExtras_placed S needs hfiles hdec hok hneed⟩ --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost /-- Closed `[LibsignalFullPlacement]` 6-clause PQXDH + `NoMatch` `main` theorem with zero mutated-callee seam premises. -/ theorem main_ok_cli_pq_all_tight_frozen_placed [LibsignalFullPlacement] @@ -625,6 +640,7 @@ theorem main_ok_cli_pq_all_tight_frozen_placed [LibsignalFullPlacement] (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead518 : ∀ W : CliHooks, @@ -649,17 +665,17 @@ theorem main_ok_cli_pq_all_tight_frozen_placed [LibsignalFullPlacement] hMainHooks (fun W => RunCompose.cliPubCallees_frozen_placed_ok mmpl gh W (hRunHooks W)) (fun X W => - MainHops.cliSlotCallees_full_placed_of_seams mmpl gh X W hDropNz hG hMs hMc + MainHops.cliSlotCallees_full_placed_of_seams mmpl gh X W hDropNz hG hMs hMc hMv (hRunHooks W).runHooks (hRead589 W) (hAesEnc W) (hAesDec W) (LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsInst.spqrV1PlacedSeams_ok - mmpl gh W hG hMs hMc (hHmac W))) + mmpl gh W hG hMs hMc hMv (hHmac W))) (fun W => - decPkD2cSlotOk_frozen_placed mmpl gh W hDropNz hG hMs hMc (hRunHooks W) (hRead518 W) (hAesDec W) + decPkD2cSlotOk_frozen_placed mmpl gh W hDropNz hG hMs hMc hMv (hRunHooks W) (hRead518 W) (hAesDec W) (hHmac W)) (fun W => pksmSlotOkPlaced_cli mmpl gh W hG) hDropNz --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost /-- Closed `[LibsignalFullPlacement]` 5-clause PQXDH `main` theorem with zero mutated-callee seam premises. -/ theorem main_ok_cli_pq_tight_frozen_placed [LibsignalFullPlacement] @@ -667,6 +683,7 @@ theorem main_ok_cli_pq_tight_frozen_placed [LibsignalFullPlacement] (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead518 : ∀ W : CliHooks, @@ -686,10 +703,10 @@ theorem main_ok_cli_pq_tight_frozen_placed [LibsignalFullPlacement] (hHmac : ∀ W : CliHooks, HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0)) : MainOkCliPqTightFrozenPlaced mmpl gh := - (main_ok_cli_pq_all_tight_frozen_placed mmpl gh hG hMs hMc hMainHooks hRunHooks hRead518 hRead589 hAesEnc + (main_ok_cli_pq_all_tight_frozen_placed mmpl gh hG hMs hMc hMv hMainHooks hRunHooks hRead518 hRead589 hAesEnc hAesDec hHmac).toMainOkCliPqTightFrozenPlaced --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost /-- Closed `[LibsignalFullPlacement]` `MainOkOverTightFrozenPlaced` theorem with zero mutated-callee seam premises. -/ theorem main_ok_over_tight_frozen_placed [LibsignalFullPlacement] @@ -697,6 +714,7 @@ theorem main_ok_over_tight_frozen_placed [LibsignalFullPlacement] (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead518 : ∀ W : CliHooks, @@ -716,10 +734,10 @@ theorem main_ok_over_tight_frozen_placed [LibsignalFullPlacement] (hHmac : ∀ W : CliHooks, HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0)) : MainOkOverTightFrozenPlaced mmpl gh := - (main_ok_cli_pq_all_tight_frozen_placed mmpl gh hG hMs hMc hMainHooks hRunHooks hRead518 hRead589 hAesEnc + (main_ok_cli_pq_all_tight_frozen_placed mmpl gh hG hMs hMc hMv hMainHooks hRunHooks hRead518 hRead589 hAesEnc hAesDec hHmac).toMainOkOverTightFrozenPlaced --- A2'' D1: A0 island, hMs/hMc discharged at a0Ghost +-- A2'' D1 / 2B MV: A0 island, hMs/hMc/hMv discharged at a0Ghost /-- Closed `[LibsignalFullPlacement]` standalone `NoMatch` `main` theorem with zero mutated-callee seam premises. -/ theorem main_ok_no_match_tight_frozen_placed [LibsignalFullPlacement] @@ -727,6 +745,7 @@ theorem main_ok_no_match_tight_frozen_placed [LibsignalFullPlacement] (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some CryptoVerification.LibsignalAesCbc.memsetHook) (hMc : gh.memcpy = some CryptoVerification.LibsignalAesCbc.memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hMainHooks : ∀ W : CliHooks, CliA0MainHooks mmpl gh W) (hRunHooks : ∀ W : CliHooks, CliA0RunHooks mmpl gh W) (hRead518 : ∀ W : CliHooks, @@ -746,7 +765,7 @@ theorem main_ok_no_match_tight_frozen_placed [LibsignalFullPlacement] (hHmac : ∀ W : CliHooks, HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0)) : MainOkNoMatchTightFrozenPlaced mmpl gh := - (main_ok_cli_pq_all_tight_frozen_placed mmpl gh hG hMs hMc hMainHooks hRunHooks hRead518 hRead589 hAesEnc + (main_ok_cli_pq_all_tight_frozen_placed mmpl gh hG hMs hMc hMv hMainHooks hRunHooks hRead518 hRead589 hAesEnc hAesDec hHmac).toMainOkNoMatchTightFrozenPlaced end CryptoVerification.SignalSession diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainOkA1Placed.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainOkA1Placed.lean index 25ab8e8b7..29db190da 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainOkA1Placed.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainOkA1Placed.lean @@ -21,6 +21,9 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.Reserve11Plac public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.TryAllocateIn3Placed public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AddressA1Placed public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.MainOkProofPlaced +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs +import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AddressA1PlacedSat +import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.StrlenUtf8A1PlacedSat import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic @@ -49,6 +52,12 @@ open CryptoVerification.LibsignalPublicApi.StoreKit open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer (CliGhostHooks cliGhostExterns cliGhostExterns_alloc cliGhostExterns_dealloc cliGhostExterns_other cliGhostExterns_realloc cliGhostExterns_shim) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AddressA1PlacedSat + (address_placed_ok_a1_of_hooks_sat) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.StrlenUtf8A1PlacedSat + (fromUtf8Ascii_ok_placed_sat) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraSpecOk cliExtraGhostSyms) private theorem cliGhostExterns_other_decide (g : CliGhostHooks) (baseExt : LibsignalHooks) {sym : String} @@ -61,9 +70,17 @@ private theorem cliGhostExterns_other_decide (g : CliGhostHooks) (baseExt : Libs (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ lsMemsetSym := by decide) - (h10 : sym ≠ lsMemcpySym := by decide) : + (h10 : sym ≠ lsMemcpySym := by decide) + (h11 : cliExtraGhostSyms.contains sym = false ∨ g.extra.lookup sym = none := by left; decide) : cliGhostExterns g baseExt sym = baseExt sym := - cliGhostExterns_other g baseExt h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 + cliGhostExterns_other g baseExt h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 h11 + +private theorem strlen_ok_placed_of_hookSat [LibsignalPlacement] {H : LibsignalHooks} + {hookStack : Nat} (hext : HookSat H "strlen" (strlenSpec hookStack)) : + subroutine_ok (lsProg_617 H) (lsρ "strlen") + (withLsRoCl lsmpl (strlenSpec hookStack)) := + subroutine_ok_rocl_of_plain <| + ls_hook_ok_ultra_of_mem (prog := lsProg_617 H) (i := 617) hext (by decide) /-- Legacy `A0` bump-allocator ghost-hook assignment on `CliGhostHooks`. -/ def CliGhostHooksA0 (g : CliGhostHooks) : Prop := @@ -121,11 +138,14 @@ theorem mainIo_of_hookSat_placed [LibsignalPlacement] {A : RustAlloc} /-- `MainCalleesBlk617` at `A0 / cliGhostExterns g (cliExternsPlaced mmpl W) / cliResStack` from `hAllocFs : AllocContractsFsPlaced E2E.HooksE.A0 (cliGhostExterns g (cliExternsPlaced mmpl W))`, -with `address` as a hypothesis. -/ +`hExtra : ExtraSpecOk g`, and `hStrlen`, with `address` as a hypothesis. -/ theorem mainA1_callees_of_addr_placed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) (hookStack : Nat) (hAllocFs : AllocContractsFsPlaced E2E.HooksE.A0 (cliGhostExterns g (cliExternsPlaced mmpl W))) + (hExtra : ExtraSpecOk g) + (hStrlen : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) "strlen" + (strlenSpec hookStack)) (haddr : subroutine_ok (lsProg_617 (cliGhostExterns g (cliExternsPlaced mmpl W))) (lsmpl.base 580) (withLsRoCl lsmpl (addressSpec E2E.HooksE.A0 uuidTryParse cliResStack))) : @@ -142,12 +162,9 @@ theorem mainA1_callees_of_addr_placed [LibsignalPlacement] (mmpl : Obj.MultiPlac (cliGhostExterns_other_decide g (cliExternsPlaced mmpl W)).trans hpanBase { alloc := hAllocFs.toAllocContractsX allocFs := hAllocFs - strlen := strlen_ok_placed - ((cliGhostExterns_other_decide g (cliExternsPlaced mmpl W)).trans - (cliExternsPlaced_strlen mmpl W)) - fromUtf8 := fromUtf8Ascii_ok_placed (err := W.utf8Err) - ((cliGhostExterns_other_decide g (cliExternsPlaced mmpl W)).trans - (cliExternsPlaced_fromUtf8 mmpl W)) + strlen := strlen_ok_placed_of_hookSat hStrlen + fromUtf8 := fromUtf8Ascii_ok_placed_sat + (Slots.cliGhostExterns_fromUtf8_sat g (cliExternsPlaced mmpl W) hExtra hookStack) address := haddr reserve16 := reserve16_placed_ok hAllocFs cli_resStack_callees.2.1 hpan reserve1 := reserve1_placed_ok hAllocFs cli_resStack_callees.2.1 hpan @@ -159,11 +176,14 @@ theorem mainA1_callees_of_addr_placed [LibsignalPlacement] (mmpl : Obj.MultiPlac (by decide)).trans hpan } /-- All `MainCalleesBlk617` fields at `A0 / cliGhostExterns g (cliExternsPlaced mmpl W) / cliResStack`; -`address` discharged via `address_placed_ok_a1_of_hooks`. -/ +`address` discharged via `address_placed_ok_a1_of_hooks_sat`. -/ theorem mainA1_callees_placed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) (hookStack : Nat) (hAllocFs : AllocContractsFsPlaced E2E.HooksE.A0 - (cliGhostExterns g (cliExternsPlaced mmpl W))) : + (cliGhostExterns g (cliExternsPlaced mmpl W))) + (hExtra : ExtraSpecOk g) + (hStrlen : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) "strlen" + (strlenSpec hookStack)) : MainCalleesBlk617 E2E.HooksE.A0 (cliGhostExterns g (cliExternsPlaced mmpl W)) uuidTryParse hookStack cliResStack := have hpan580 : @@ -173,10 +193,10 @@ theorem mainA1_callees_placed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) simp only [cliExternsPlaced, Address.Helpers.lsHandleErrorSym580, isCliPanicSymbolPlaced, cliPanicSymbolsPlaced, List.contains_cons, beq_self_eq_true, Bool.true_or, Bool.or_true, ↓reduceIte]) - mainA1_callees_of_addr_placed mmpl g W hookStack hAllocFs - (address_placed_ok_a1_of_hooks hAllocFs hpan580 - ((cliGhostExterns_other_decide g (cliExternsPlaced mmpl W)).trans - (cliExternsPlaced_memrchr mmpl W)) + mainA1_callees_of_addr_placed mmpl g W hookStack hAllocFs hExtra hStrlen + (address_placed_ok_a1_of_hooks_sat hAllocFs hpan580 + (Slots.cliGhostExterns_memrchr_sat g (cliExternsPlaced mmpl W) hExtra + (Nat.le_refl extHookStack)) cli_resStack_callees.2.2.1 cli_resStack_callees.2.2.2) /-- Tightened `main`'s contract (`mainSpecTightPlaced`) at @@ -186,6 +206,9 @@ theorem main_ok_a1_tight_placed [LibsignalPlacement] {CodeOk : Memory → Prop} {Run : Inputs → RunAnswer → Prop} (hAllocFs : AllocContractsFsPlaced E2E.HooksE.A0 (cliGhostExterns g (cliExternsPlaced mmpl W))) + (hExtra : ExtraSpecOk g) + (hStrlen : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) "strlen" + (strlenSpec cliHookStack)) (hReadStdin : subroutine_ok (lsProg_617 (cliGhostExterns g (cliExternsPlaced mmpl W))) (lsρ lsReadStdinSym) (withLsRoCl lsmpl (readStdinSpecPlaced cliIo E2E.HooksE.A0 cliHookStack))) (hReadFile : subroutine_ok (lsProg_617 (cliGhostExterns g (cliExternsPlaced mmpl W))) @@ -197,7 +220,7 @@ theorem main_ok_a1_tight_placed [LibsignalPlacement] {CodeOk : Memory → Prop} (hdom : ∀ i a, Run i a → DomainArgv i) : subroutine_ok (mProgPlaced (cliGhostExterns g (cliExternsPlaced mmpl W))) (lsmpl.base 617) (mainSpecTightPlaced CodeOk E2E.HooksE.A0 cliMainStk cliStaticsPlaced Run) := - main_ok_tight_placed_proof (mainA1_callees_placed mmpl g W cliHookStack hAllocFs) + main_ok_tight_placed_proof (mainA1_callees_placed mmpl g W cliHookStack hAllocFs hExtra hStrlen) (mainIo_of_cliGhostExterns_placed mmpl g W cliHookStack hReadStdin hReadFile) ⟨cliIo_stdin, cliIo_coinsPath, cliIo_coins, cliIo_commit⟩ hrun (hparse_of_domains hdom) cli_hstk cli_hstk64 @@ -207,6 +230,9 @@ theorem main_ok_a1_tight_placed_of_hookSat [LibsignalPlacement] {CodeOk : Memory {Run : Inputs → RunAnswer → Prop} (hAllocFs : AllocContractsFsPlaced E2E.HooksE.A0 (cliGhostExterns g (cliExternsPlaced mmpl W))) + (hExtra : ExtraSpecOk g) + (hStrlen : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) "strlen" + (strlenSpec cliHookStack)) (hReadStdin : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsReadStdinSym (readStdinSpecPlaced cliIo E2E.HooksE.A0 cliHookStack)) (hReadFile : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsReadFileSym @@ -218,7 +244,7 @@ theorem main_ok_a1_tight_placed_of_hookSat [LibsignalPlacement] {CodeOk : Memory (hdom : ∀ i a, Run i a → DomainArgv i) : subroutine_ok (mProgPlaced (cliGhostExterns g (cliExternsPlaced mmpl W))) (lsmpl.base 617) (mainSpecTightPlaced CodeOk E2E.HooksE.A0 cliMainStk cliStaticsPlaced Run) := - main_ok_a1_tight_placed mmpl g W hAllocFs + main_ok_a1_tight_placed mmpl g W hAllocFs hExtra hStrlen (readStdin_rocl_ok_of_hookSat hReadStdin) (readFile_rocl_ok_of_hookSat hReadFile) hrun hdom @@ -230,6 +256,9 @@ theorem main_ok_a1_placed [LibsignalPlacement] {CodeOk : Memory → Prop} [LsCod {Run : Inputs → RunAnswer → Prop} (hAllocFs : AllocContractsFsPlaced E2E.HooksE.A0 (cliGhostExterns g (cliExternsPlaced mmpl W))) + (hExtra : ExtraSpecOk g) + (hStrlen : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) "strlen" + (strlenSpec cliHookStack)) (hReadStdin : subroutine_ok (lsProg_617 (cliGhostExterns g (cliExternsPlaced mmpl W))) (lsρ lsReadStdinSym) (withLsRoCl lsmpl (readStdinSpecPlaced cliIo E2E.HooksE.A0 cliHookStack))) (hReadFile : subroutine_ok (lsProg_617 (cliGhostExterns g (cliExternsPlaced mmpl W))) @@ -241,7 +270,7 @@ theorem main_ok_a1_placed [LibsignalPlacement] {CodeOk : Memory → Prop} [LsCod (hdom : ∀ i a, Run i a → DomainArgv i) : subroutine_ok (mProgPlaced (cliGhostExterns g (cliExternsPlaced mmpl W))) (lsmpl.base 617) (mainSpecPlaced CodeOk E2E.HooksE.A0 cliMainStk cliStaticsPlaced Run) := - main_ok_placed_proof (mainA1_callees_placed mmpl g W cliHookStack hAllocFs) + main_ok_placed_proof (mainA1_callees_placed mmpl g W cliHookStack hAllocFs hExtra hStrlen) (mainIo_of_cliGhostExterns_placed mmpl g W cliHookStack hReadStdin hReadFile) ⟨cliIo_stdin, cliIo_coinsPath, cliIo_coins, cliIo_commit⟩ hrun (hparse_of_domains hdom) cli_hstk cli_hstk64 @@ -251,6 +280,9 @@ theorem main_ok_a1_placed_of_hookSat [LibsignalPlacement] {CodeOk : Memory → P {Run : Inputs → RunAnswer → Prop} (hAllocFs : AllocContractsFsPlaced E2E.HooksE.A0 (cliGhostExterns g (cliExternsPlaced mmpl W))) + (hExtra : ExtraSpecOk g) + (hStrlen : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) "strlen" + (strlenSpec cliHookStack)) (hReadStdin : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsReadStdinSym (readStdinSpecPlaced cliIo E2E.HooksE.A0 cliHookStack)) (hReadFile : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsReadFileSym @@ -262,7 +294,7 @@ theorem main_ok_a1_placed_of_hookSat [LibsignalPlacement] {CodeOk : Memory → P (hdom : ∀ i a, Run i a → DomainArgv i) : subroutine_ok (mProgPlaced (cliGhostExterns g (cliExternsPlaced mmpl W))) (lsmpl.base 617) (mainSpecPlaced CodeOk E2E.HooksE.A0 cliMainStk cliStaticsPlaced Run) := - main_ok_a1_placed mmpl g W hAllocFs + main_ok_a1_placed mmpl g W hAllocFs hExtra hStrlen (readStdin_rocl_ok_of_hookSat hReadStdin) (readFile_rocl_ok_of_hookSat hReadFile) hrun hdom diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainOkA1PlacedSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainOkA1PlacedSat.lean index 2d8bebf45..650f1658b 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainOkA1PlacedSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/MainOkA1PlacedSat.lean @@ -12,6 +12,7 @@ module public import LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Main.IoHooksPlacedSat -- proof-setup: allow-public-import import LibsignalBinary.Proofs.SignalSession.Cli.Main.IoHonestSpecsHook +import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs /-! # `HookSat`-Backed `MainIoPlacedSat` on `cliGhostExterns` (`MainOkA1PlacedSat`) @@ -53,6 +54,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Main.IoHooksPlacedSat (mainIo_of_lookup_placed_sat writeFile_rocl_ok_of_hookSat writeStdout_rocl_ok_of_hookSat) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (readFileLitSpecPlaced readStdinSpecPlaced) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (cliExtraGhostSyms) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudgetSat (MainIoPlacedSat) private theorem hookSat_cliGhostExterns_other {α : Type} (g : CliGhostHooks) @@ -67,10 +69,11 @@ private theorem hookSat_cliGhostExterns_other {α : Type} (g : CliGhostHooks) (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) (h9 : sym ≠ lsMemsetSym := by decide) - (h10 : sym ≠ lsMemcpySym := by decide) : + (h10 : sym ≠ lsMemcpySym := by decide) + (h11 : cliExtraGhostSyms.contains sym = false ∨ g.extra.lookup sym = none := by left; decide) : HookSat (cliGhostExterns g H0) sym spec := by rcases hsat with ⟨f, hf, hok⟩ - exact ⟨f, (cliGhostExterns_other g H0 h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans hf, hok⟩ + exact ⟨f, (cliGhostExterns_other g H0 h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 h11).trans hf, hok⟩ /-- `MainIoPlacedSat` on `cliGhostExterns g H0` from `readStdin`/`readFile` `subroutine_ok` hypotheses and `HookSat H0 lsWrite*Sym (write*SpecPlacedSat …)` write hypotheses. -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/RunInstPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/RunInstPlaced.lean index 3ee3ef716..5447b906e 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/RunInstPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/RunInstPlaced.lean @@ -18,6 +18,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Pub.BundleRead.Placed public import LibsignalBinary.Proofs.SignalSession.Cli.Pub.SplitId.Placed public import LibsignalBinary.Proofs.SignalSession.Cli.Pub.SplitSigned.Placed public import LibsignalBinary.Proofs.SignalSession.Cli.Pub.DropSpe.ProofPlaced +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.KemDeserializeSlot @@ -55,12 +56,16 @@ open CryptoVerification.SignalSession.Cli.RunRefine open CryptoVerification.SignalSession.Cli.RunProofs open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer (CliGhostHooks cliGhostExterns) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (ExtraSpecOk) /-- Hook bundle for `main` (Block `617`) under `cliHookTablePlaced mmpl W` and `CliGhostHooks`. -/ structure CliA0MainHooks [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : Prop where allocFs : AllocContractsFsPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W)) + extraOk : ExtraSpecOk gh + strlen : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) "strlen" + (strlenSpec cliHookStack) readStdin : subroutine_ok (lsProg_617 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsρ lsReadStdinSym) (withLsRoCl lsmpl (readStdinSpecPlaced cliIo E2E.HooksE.A0 cliHookStack)) @@ -72,12 +77,16 @@ theorem CliA0MainHooks.of_hookSat [LibsignalPlacement] (mmpl : Obj.MultiPlacemen (gh : CliGhostHooks) (W : CliHooks) (hAllocFs : AllocContractsFsPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (hExtra : ExtraSpecOk gh) + (hStrlen : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) "strlen" + (strlenSpec cliHookStack)) (hReadStdin : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsReadStdinSym (readStdinSpecPlaced cliIo E2E.HooksE.A0 cliHookStack)) (hReadFile : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsReadFileSym (readFileLitSpecPlaced cliIo E2E.HooksE.A0 cliHookStack)) : CliA0MainHooks mmpl gh W := - ⟨hAllocFs, readStdin_rocl_ok_of_hookSat hReadStdin, readFile_rocl_ok_of_hookSat hReadFile⟩ + ⟨hAllocFs, hExtra, hStrlen, readStdin_rocl_ok_of_hookSat hReadStdin, + readFile_rocl_ok_of_hookSat hReadFile⟩ /-- Hook and `read_file` bundle for `run` (Block `579`) under `cliHookTablePlaced mmpl W` and `CliGhostHooks`. -/ structure CliA0RunHooks [LibsignalPlacement] (mmpl : Obj.MultiPlacement) @@ -626,8 +635,8 @@ theorem main_ok_cli_placed_of_runTight [LibsignalPlacement] subroutine_ok (mProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsmpl.base 617) (mainSpecTightPlaced CodeOk E2E.HooksE.A0 cliMainStk cliStaticsPlaced (runRel (cliRunSem_placed X W decPk decPkOk pksmParse))) := - main_ok_a1_tight_placed mmpl gh W hMainHooks.allocFs hMainHooks.readStdin hMainHooks.readFile - hrun (fun _ _ hr => RunCompose.runRel_dom hr) + main_ok_a1_tight_placed mmpl gh W hMainHooks.allocFs hMainHooks.extraOk hMainHooks.strlen + hMainHooks.readStdin hMainHooks.readFile hrun (fun _ _ hr => RunCompose.runRel_dom hr) /-- Tightened `main` subroutine contract on Block `617` instantiated with `hrun_cli_placed`. -/ theorem main_ok_cli_tight_placed [LibsignalPlacement] (mmpl : Obj.MultiPlacement) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/StrlenUtf8A1.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/StrlenUtf8A1.lean index b8a030e39..3db979cd8 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/StrlenUtf8A1.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/StrlenUtf8A1.lean @@ -232,7 +232,7 @@ theorem fromUtf8Ascii_ok_cliExterns {img : Obj.Image} {hookStack : Nat} (W : Cli subroutine_ok (mProg img (cliExterns W)) ((mProg img (cliExterns W)).fnAddr "core::str::converts::from_utf8") ((fromUtf8AsciiSpec hookStack).inImage img) := - fromUtf8Ascii_ok (err := W.utf8Err) (cliExterns_row W (List.mem_append_right _ (by simp))) + fromUtf8Ascii_ok (err := CryptoVerification.SignalSession.cliDefaultUtf8Err) (cliExterns_row W (List.mem_append_right _ (by simp))) section MainCalleesCheck open CryptoGames.LibsignalSession CryptoVerification.RustHeap diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/StrlenUtf8A1Placed.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/StrlenUtf8A1Placed.lean index afa551f90..f019213f8 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/StrlenUtf8A1Placed.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Main/Proofs/StrlenUtf8A1Placed.lean @@ -36,18 +36,6 @@ open CryptoVerification.SignalSession CryptoVerification.SignalSession.Cli open CryptoVerification.SignalSession.Cli.Main.Placed open CryptoVerification.LibsignalPublicApi.StoreKit -theorem cliExternsPlaced_strlen (mmpl : Obj.MultiPlacement) (W : CliHooks) : - cliExternsPlaced mmpl W "strlen" = some strlenHook := - main_cliExternsPlaced_row mmpl W - (List.mem_append_right _ (List.mem_of_getElem? (i := 2) rfl)) - (by simp [isCliPanicSymbolPlaced, cliPanicSymbolsPlaced, Rust.isPanicSymbol]) - -theorem cliExternsPlaced_fromUtf8 (mmpl : Obj.MultiPlacement) (W : CliHooks) : - cliExternsPlaced mmpl W lsFromUtf8Sym = some (fromUtf8Hook W.utf8Err) := - main_cliExternsPlaced_row mmpl W - (List.mem_append_right _ (List.mem_of_getElem? (i := 6) rfl)) - (by simp [isCliPanicSymbolPlaced, cliPanicSymbolsPlaced, Rust.isPanicSymbol, lsFromUtf8Sym]) - /-- `strlen` satisfies `withLsRoCl lsmpl (strlenSpec hookStack)` at `lsρ "strlen"` on Block `617`. -/ theorem strlen_ok_placed [LibsignalPlacement] {H : LibsignalHooks} {hookStack : Nat} (hext : H "strlen" = some strlenHook) : @@ -67,16 +55,4 @@ theorem fromUtf8Ascii_ok_placed [LibsignalPlacement] {H : LibsignalHooks} {hookS ls_hook_ok_ultra_of_mem (prog := lsProg_617 H) (i := 617) ⟨fromUtf8Hook err, hext, fromUtf8Hook_ok hookStack err⟩ (by decide) -theorem strlen_ok_cliExterns_placed [LibsignalPlacement] {hookStack : Nat} - (mmpl : Obj.MultiPlacement) (W : CliHooks) : - subroutine_ok (lsProg_617 (cliExternsPlaced mmpl W)) (lsρ "strlen") - (withLsRoCl lsmpl (strlenSpec hookStack)) := - strlen_ok_placed (cliExternsPlaced_strlen mmpl W) - -theorem fromUtf8Ascii_ok_cliExterns_placed [LibsignalPlacement] {hookStack : Nat} - (mmpl : Obj.MultiPlacement) (W : CliHooks) : - subroutine_ok (lsProg_617 (cliExternsPlaced mmpl W)) (lsρ lsFromUtf8Sym) - (withLsRoCl lsmpl (fromUtf8AsciiSpec hookStack)) := - fromUtf8Ascii_ok_placed (err := W.utf8Err) (cliExternsPlaced_fromUtf8 mmpl W) - end CryptoVerification.SignalSession.Cli.MainHops diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Compose/Arms/AllPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Compose/Arms/AllPlacedBudget.lean index ae0665f55..ab45353c2 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Compose/Arms/AllPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Compose/Arms/AllPlacedBudget.lean @@ -195,7 +195,7 @@ theorem cliPubCalleesAt_of_arms_placed [LibsignalPlacement] {M : AllocCostModel} (callerProg := lsProg_579 H) (i := 579) (pathProg := lsProg_589 H) (jPath := 589) (readProg := lsProg_579 H) (jRead := 579) - (fun _ hp => hp.2) hh.alloc hh.memcpyRO hh.bcmp + (fun _ hp => hp.2) hh.alloc hh.memcpyRO hh.bcmp.of_keepsFs (by decide) (by decide) (path_placed_ok (callerProg := lsProg_589 H) (i := 589) hh (Nat.le_refl pathNeed) (by decide)) @@ -524,7 +524,7 @@ theorem cliPubCalleesAt_of_arms_frozen_placed [LibsignalPlacement] {M : AllocCos (callerProg := lsProg_579 H) (i := 579) (pathProg := lsProg_589 H) (jPath := 589) (readProg := lsProg_579 H) (jRead := 579) - (fun _ hp => hp.2) hh.alloc hh.memcpyRO hh.bcmp + (fun _ hp => hp.2) hh.alloc hh.memcpyRO hh.bcmp.of_keepsFs (by decide) (by decide) (path_placed_ok (callerProg := lsProg_589 H) (i := 589) hh (Nat.le_refl pathNeed) (by decide)) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Compose/RunOkNoMatchPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Compose/RunOkNoMatchPlacedBudget.lean index 4b14aa68e..7da58bcd4 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Compose/RunOkNoMatchPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Compose/RunOkNoMatchPlacedBudget.lean @@ -245,7 +245,7 @@ theorem cliPubCallees_of_arms_placed [LibsignalPlacement] (callerProg := lsProg_579 H) (i := 579) (pathProg := lsProg_589 H) (jPath := 589) (readProg := lsProg_579 H) (jRead := 579) - (fun _ hp => hp.2) hh.alloc hh.memcpyRO hh.bcmp + (fun _ hp => hp.2) hh.alloc hh.memcpyRO hh.bcmp.of_keepsFs (by decide) (by decide) (path_placed_ok (callerProg := lsProg_589 H) (i := 589) hh (Nat.le_refl pathNeed) (by decide)) @@ -711,7 +711,7 @@ theorem cliPubCallees_of_arms_frozen_placed [LibsignalPlacement] (callerProg := lsProg_579 H) (i := 579) (pathProg := lsProg_589 H) (jPath := 589) (readProg := lsProg_579 H) (jRead := 579) - (fun _ hp => hp.2) hh.alloc hh.memcpyRO hh.bcmp + (fun _ hp => hp.2) hh.alloc hh.memcpyRO hh.bcmp.of_keepsFs (by decide) (by decide) (path_placed_ok (callerProg := lsProg_589 H) (i := 589) hh (Nat.le_refl pathNeed) (by decide)) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Compose/RunOkNoMatchPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Compose/RunOkNoMatchPlacedBudgetFd.lean index 6129942cb..0a2d5160a 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Compose/RunOkNoMatchPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Compose/RunOkNoMatchPlacedBudgetFd.lean @@ -247,22 +247,6 @@ structure CliPubCalleesPlacedFd [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (cliGhostExterns g (cliExternsPlaced mmpl W)) cliRunBudgets S (cliRunNeeds decPkNeed) cliResStack -private theorem cliGhostExterns_bcmp_keepsFs_sat (mmpl : Obj.MultiPlacement) - (g : CliGhostHooks) (W : CliHooks) : - HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) - CryptoVerification.SignalSession.Cli.cliBcmpName - (LibsignalBinary.Heap.SpecBudget.withVmPreserved - CryptoVerification.SignalSession.Cli.cliBcmpSpec).keepsFs := by - refine CryptoVerification.SignalSession.Cli.Slots.cliGhostExterns_sat_of_cliExternsPlaced - mmpl g W ?_ - rcases LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_bcmp_budget_sat - mmpl W with ⟨f, hf, hok⟩ - have hbcmp := CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_bcmp mmpl W - rw [hbcmp] at hf - injection hf with hfg - subst hfg - exact ⟨_, hbcmp, hok.keepsFs fun _ => rfl⟩ - /-- Discharges `dirGet`, `splitId`, `splitSigned`, `dropSpeX`, and `dropSpe` of `CliPubCalleesPlacedFd` at `cliRunCalleesEnvs ReadEnv` from `CliRunHooksBundleFd` and `hPath589`, leaving `bundleRead` and `arms`. -/ @@ -291,7 +275,7 @@ theorem cliPubCallees_of_arms_placed_fd [LibsignalPlacement] dirGet_placed_caller_ok_of_deps_fd (callerProg := lsProg_579 H) (i := 579) (pathProg := lsProg_589 H) (jPath := 589) - (fun _ hp => hp.2) hh.allocFs (cliGhostExterns_bcmp_keepsFs_sat mmpl g W) + (fun _ hp => hp.2) hh.allocFs hh.bcmp (by decide) (by decide) hPath589 hHooks.readFileSat @@ -590,7 +574,7 @@ theorem cliPubCallees_of_arms_frozen_placed_fd [LibsignalPlacement] dirGet_placed_caller_ok_of_deps_fd (callerProg := lsProg_579 H) (i := 579) (pathProg := lsProg_589 H) (jPath := 589) - (fun _ hp => hp.2) hh.allocFs (cliGhostExterns_bcmp_keepsFs_sat mmpl g W) + (fun _ hp => hp.2) hh.allocFs hh.bcmp (by decide) (by decide) hPath589 hHooks.readFileSat diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Glue/BcmpHook.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Glue/BcmpHook.lean index 482e2416e..8204b5c34 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Glue/BcmpHook.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Glue/BcmpHook.lean @@ -32,11 +32,11 @@ namespace CryptoVerification.SignalSession.Cli.RunGlue open Arm64 ProofLib CryptoVerification.SignalSession /-- The `bcmp` row of `cliHookTable` (index 8 of its own rows). -/ -theorem bcmp_row (W : CliHooks) : (cliBcmpName, cliBcmpHook W.bcmp) ∈ cliHookTable W := +theorem bcmp_row (W : CliHooks) : (cliBcmpName, cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp) ∈ cliHookTable W := List.mem_append_right _ (List.mem_of_getElem? (i := 8) rfl) /-- `cliExterns W` maps `bcmp` to `cliBcmpHook W.bcmp`. -/ -theorem cliExterns_bcmp (W : CliHooks) : cliExterns W cliBcmpName = some (cliBcmpHook W.bcmp) := +theorem cliExterns_bcmp (W : CliHooks) : cliExterns W cliBcmpName = some (cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp) := cliExterns_row W (bcmp_row W) /-- Either permission of `ChainProofs.bytesAt ro p bs` fixes the bytes read at `p`. -/ @@ -51,7 +51,7 @@ theorem bytesAt_readBytes {ro : Bool} {p : BitVec 64} {bs : List (BitVec 8)} {m /-- `cliBcmpHook W.bcmp` meets `cliBcmpSpec` (for any `ro` on either side): memory is unchanged, `x0 := W.bcmp bsA bsB`, and `W.bcmp_ok` gives `w0 = 0 ↔ bsA = bsB`. -/ -theorem cliBcmpHook_ok (W : CliHooks) : HookOk (cliBcmpHook W.bcmp) cliBcmpSpec := by +theorem cliBcmpHook_ok (_W : CliHooks) : HookOk (cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp) cliBcmpSpec := by refine retHook_ok fun x R s0 hrun hpre _hsp => ?_ simp only [cliBcmpSpec, sepConj_assoc, satisfies_pure_sepConj] at hpre rcases hpre with ⟨⟨hx0, hx1, hx2, hlen⟩, hmem⟩ @@ -71,11 +71,11 @@ theorem cliBcmpHook_ok (W : CliHooks) : HookOk (cliBcmpHook W.bcmp) cliBcmpSpec dsimp only [cliBcmpSpec, cliBcmpHook, retHook] rw [hx0, hx1, hx2, hreadA, hreadB] simp only [sepConj_assoc, satisfies_pure_sepConj] - exact ⟨⟨W.bcmp_ok x.bsA x.bsB hlen.symm, rfl⟩, hmem⟩ + exact ⟨⟨CryptoVerification.SignalSession.cliDefaultBcmp_ok x.bsA x.bsB hlen.symm, rfl⟩, hmem⟩ /-- `HookSat (cliExterns W) cliBcmpName cliBcmpSpec`. -/ theorem cli_hookSat_bcmp (W : CliHooks) : HookSat (cliExterns W) cliBcmpName cliBcmpSpec := - ⟨cliBcmpHook W.bcmp, cliExterns_bcmp W, cliBcmpHook_ok W⟩ + ⟨cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp, cliExterns_bcmp W, cliBcmpHook_ok W⟩ /-! ## Contract-backed `bcmp` (`CliExternsOk`) -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Glue/BcmpHookPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Glue/BcmpHookPlaced.lean index c9d3b26ad..7a141ee9f 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Glue/BcmpHookPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Glue/BcmpHookPlaced.lean @@ -48,7 +48,7 @@ open CryptoVerification open CryptoVerification.SignalSession open CryptoVerification.SignalSession.Cli -/-- The `37` mangled symbol names of `cliHookTablePlaced mmpl W` (independent of `mmpl` and `W`). -/ +/-- The `27` mangled symbol names of `cliHookTablePlaced mmpl W` (independent of `mmpl` and `W`). -/ def cliHookNamesPlaced : List String := ["_RNvNtCsbvWyylYiyxg_4sha26sha51211compress512", "_RNvMs5_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPoint10to_edwards", @@ -68,25 +68,15 @@ def cliHookNamesPlaced : List String := "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental26decapsulate_compressed_key", "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes", "_RNvCs65XVORQObL2_12libcrux_hmac4hmac", - "memmove", - "bcmp", - "strlen", lsWriteFileSym, lsWriteStdoutSym, - lsMemrchrSym, - lsFromUtf8Sym, lsFmtWriteSym, lsFormatInnerSym, - lsDurationSinceSym, - lsTimeAddSym, - lsBlackBoxSym, lsCompress256Sym, lsAesEncSym, lsAesDecSym, lsPubFromSecretSym, - lsDiffieHellmanSym, - lsStaticSecretDropSym, - lsSharedSecretDropSym] + lsDiffieHellmanSym] theorem cliHookNamesPlaced_eq (mmpl : Obj.MultiPlacement) (W : CliHooks) : (cliHookTablePlaced mmpl W).map Prod.fst = cliHookNamesPlaced := rfl @@ -100,15 +90,12 @@ theorem cliHookNamesPlaced_notPanic : rw [List.all_eq_true] intro n hn simp only [cliHookNamesPlaced, lsWriteFileSym, lsWriteStdoutSym, - lsMemrchrSym, lsFromUtf8Sym, lsFmtWriteSym, lsFormatInnerSym, - lsDurationSinceSym, lsTimeAddSym, lsBlackBoxSym, lsCompress256Sym, + lsFmtWriteSym, lsFormatInnerSym, lsCompress256Sym, lsAesEncSym, lsAesDecSym, lsPubFromSecretSym, lsDiffieHellmanSym, - lsStaticSecretDropSym, lsSharedSecretDropSym, List.mem_cons, List.not_mem_nil, or_false] at hn rcases hn with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | - rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | - rfl <;> + rfl | rfl | rfl <;> simp [isCliPanicSymbolPlaced, cliPanicSymbolsPlaced, Rust.isPanicSymbol] private theorem lookup_of_mem_nodup_placed {α : Type} : @@ -174,35 +161,72 @@ theorem withPanics_cliExternsPlaced (mmpl : Obj.MultiPlacement) (W : CliHooks) : simp [hp] · simp [Rust.withPanics, hp] -/-- The `"bcmp"` row of `cliHookTablePlaced mmpl W` (index 1 of its right rows). -/ -theorem bcmp_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : - ("bcmp", cliBcmpHook W.bcmp) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 1) rfl) - -/-- `cliExternsPlaced mmpl W` maps `"bcmp"` (`cliBcmpName`) to `cliBcmpHook W.bcmp`. -/ -theorem cliExternsPlaced_bcmp (mmpl : Obj.MultiPlacement) (W : CliHooks) : - cliExternsPlaced mmpl W "bcmp" = some (cliBcmpHook W.bcmp) := - cliExternsPlaced_row mmpl W (bcmp_row_placed mmpl W) - -/-- `HookSat (cliExternsPlaced mmpl W) "bcmp" cliBcmpSpec`. -/ -theorem cli_hookSat_bcmp_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) "bcmp" cliBcmpSpec := - ⟨cliBcmpHook W.bcmp, cliExternsPlaced_bcmp mmpl W, cliBcmpHook_ok W⟩ - -/-- Block-level `subroutine_ok` form of `cli_hookSat_bcmp_placed` on any unmutated block `i < 619`. -/ -theorem cliBcmpPlaced_ok [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) - {prog : Program} {i : Nat} [IsLsBlockProg prog i (cliExternsPlaced mmpl W)] - (hi : i < 619 := by decide) - (hunmut : (i ∈ libsignalMutatedBlocks) = false := by decide) : - subroutine_ok prog (lsρ "bcmp") cliBcmpSpec := - ls_hook_ok_ultra_of_mem (cli_hookSat_bcmp_placed mmpl W) (by decide) hi hunmut - /-! ## Ghost-Hook Overlay (`CliGhostHooks` & `cliGhostExterns`) -/ -/-- Ghost-hook functions for the five allocator symbols (`lsRustNoAllocShimSymCli`, -`lsRustAllocSymCli`, `lsRustDeallocSymCli`, `lsRustReallocSymCli`, `lsRustAllocZeroedSymCli`), plus -optional ghost hooks for `lsStringCloneSym`, `lsReadFileSym`, and `lsReadStdinSym`, plus optional -ghost-hook slots `memset` and `memcpy` (default `none`, wired into `cliGhostExterns` dispatch in `#1255` Stage A / WP6c). -/ +/-- Type alias for the generic Cutover-2 ghost hook association list. -/ +abbrev ExtraGhostTable : Type := List (String × (State → State)) + +/-- The 10 named `CliGhostHooks` dispatch symbols (5 F3 alloc + 3 F3 optional + Stage A + `lsMemsetSym` / `lsMemcpySym`). -/ +def cliNamedGhostSyms : List String := + [lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, + lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, + lsStringCloneSym, lsReadFileSym, lsReadStdinSym, + lsMemsetSym, lsMemcpySym] + +/-- The 10 Cutover-2 symbols eligible for `CliGhostHooks.extra` dispatch. -/ +def cliExtraGhostSyms : List String := + ["memmove", "bcmp", "strlen", + lsMemrchrSym, lsFromUtf8Sym, lsDurationSinceSym, lsTimeAddSym, + lsBlackBoxSym, lsStaticSecretDropSym, lsSharedSecretDropSym] + +theorem cliExtraGhostSyms_disjoint_named : + (cliExtraGhostSyms.all fun s => !(cliNamedGhostSyms.contains s)) = true := by + decide + +theorem cliExtraGhostSyms_not_named {sym : String} + (h : cliExtraGhostSyms.contains sym = true) : + cliNamedGhostSyms.contains sym = false := by + have hmem : sym ∈ cliExtraGhostSyms := List.contains_iff_mem.mp h + have hall := List.all_eq_true.mp cliExtraGhostSyms_disjoint_named sym hmem + cases hc : cliNamedGhostSyms.contains sym + · rfl + · rw [hc] at hall; cases hall + +theorem named_eq_false_of_extra_contains {sym : String} + (h : cliExtraGhostSyms.contains sym = true) : + (sym == lsRustAllocSymCli) = false ∧ + (sym == lsRustDeallocSymCli) = false ∧ + (sym == lsRustReallocSymCli) = false ∧ + (sym == lsRustAllocZeroedSymCli) = false ∧ + (sym == lsRustNoAllocShimSymCli) = false ∧ + (sym == lsStringCloneSym) = false ∧ + (sym == lsReadFileSym) = false ∧ + (sym == lsReadStdinSym) = false ∧ + (sym == lsMemsetSym) = false ∧ + (sym == lsMemcpySym) = false := by + have hnn := cliExtraGhostSyms_not_named h + have hnot_mem : sym ∉ cliNamedGhostSyms := by + intro hm + have hc : cliNamedGhostSyms.contains sym = true := List.contains_iff_mem.mpr hm + rw [hc] at hnn; cases hnn + dsimp only [cliNamedGhostSyms] at hnot_mem + simp only [List.mem_cons, List.not_mem_nil, or_false, not_or] at hnot_mem + obtain ⟨h1, h2, h3, h4, h5, h6, h7, h8, h9, h10⟩ := hnot_mem + exact ⟨beq_eq_false_iff_ne.mpr h1, beq_eq_false_iff_ne.mpr h2, + beq_eq_false_iff_ne.mpr h3, beq_eq_false_iff_ne.mpr h4, + beq_eq_false_iff_ne.mpr h5, beq_eq_false_iff_ne.mpr h6, + beq_eq_false_iff_ne.mpr h7, beq_eq_false_iff_ne.mpr h8, + beq_eq_false_iff_ne.mpr h9, beq_eq_false_iff_ne.mpr h10⟩ + +/-- Ghost-hook functions for the 5 bump-allocator symbols removed in F3 (`lsRustNoAllocShimSymCli`, + `lsRustAllocSymCli`, `lsRustDeallocSymCli`, `lsRustReallocSymCli`, `lsRustAllocZeroedSymCli`), + plus an optional ghost hook for `lsStringCloneSym` (when replaying Block `623` or + `stringCloneHookMallocng` via `HookSat`) and optional `HookFsTraced IsFsC`-bundled ghost hooks + for `lsReadFileSym` and `lsReadStdinSym` (replaying Blocks `618` / `620` via `GhostExternReplays`), + plus optional ghost-hook slots `memset` and `memcpy` (default `none`; wired into + `cliGhostExterns` dispatch in `#1255` Stage A / WP6c), and a generic `extra` association-list + slot (default `[]`; `#1255` Cutover-2 extra ghost hooks). -/ structure CliGhostHooks where alloc : State → State dealloc : State → State @@ -214,53 +238,120 @@ structure CliGhostHooks where readStdin : Option { f : State → State // HookFsTraced IsFsC f } := none memset : Option (State → State) := none memcpy : Option (State → State) := none - -/-- Overlays `g : CliGhostHooks` onto a base extern map `baseExt : LibsignalHooks`. -/ + extra : List (String × (State → State)) := [] + +/-- Pre-2B 10-way named-slot dispatch of `cliGhostExterns` (without `extra`). -/ +def cliGhostExternsNamed (g : CliGhostHooks) + (baseExt : String → Option (State → State)) (sym : String) : + Option (State → State) := + if sym == lsRustAllocSymCli then some g.alloc + else if sym == lsRustDeallocSymCli then some g.dealloc + else if sym == lsRustReallocSymCli then some g.realloc + else if sym == lsRustAllocZeroedSymCli then some g.allocZeroed + else if sym == lsRustNoAllocShimSymCli then some g.shim + else if sym == lsStringCloneSym then + match g.stringClone with | some f => some f | none => baseExt sym + else if sym == lsReadFileSym then + match g.readFile with | some ⟨f, _⟩ => some f | none => baseExt sym + else if sym == lsReadStdinSym then + match g.readStdin with | some ⟨f, _⟩ => some f | none => baseExt sym + else if sym == lsMemsetSym then + match g.memset with | some f => some f | none => baseExt sym + else if sym == lsMemcpySym then + match g.memcpy with | some f => some f | none => baseExt sym + else baseExt sym + +/-- Full 10-named + domain-guarded `extra` extern dispatcher. -/ +def cliGhostExternsWithExtra (g : CliGhostHooks) (extra : ExtraGhostTable) + (baseExt : String → Option (State → State)) (sym : String) : + Option (State → State) := + if sym == lsRustAllocSymCli then some g.alloc + else if sym == lsRustDeallocSymCli then some g.dealloc + else if sym == lsRustReallocSymCli then some g.realloc + else if sym == lsRustAllocZeroedSymCli then some g.allocZeroed + else if sym == lsRustNoAllocShimSymCli then some g.shim + else if sym == lsStringCloneSym then + match g.stringClone with | some f => some f | none => baseExt sym + else if sym == lsReadFileSym then + match g.readFile with | some ⟨f, _⟩ => some f | none => baseExt sym + else if sym == lsReadStdinSym then + match g.readStdin with | some ⟨f, _⟩ => some f | none => baseExt sym + else if sym == lsMemsetSym then + match g.memset with | some f => some f | none => baseExt sym + else if sym == lsMemcpySym then + match g.memcpy with | some f => some f | none => baseExt sym + else if cliExtraGhostSyms.contains sym then + match extra.lookup sym with | some f => some f | none => baseExt sym + else baseExt sym + +@[simp] theorem cliGhostExternsWithExtra_extra_some (g : CliGhostHooks) (extra : ExtraGhostTable) + (baseExt : String → Option (State → State)) {sym : String} {f : State → State} + (hLook : extra.lookup sym = some f) + (hDom : cliExtraGhostSyms.contains sym = true := by decide) : + cliGhostExternsWithExtra g extra baseExt sym = some f := by + obtain ⟨h1, h2, h3, h4, h5, h6, h7, h8, h9, h10⟩ := named_eq_false_of_extra_contains hDom + unfold cliGhostExternsWithExtra + simp only [h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, hDom, hLook, Bool.false_eq_true, ↓reduceIte] + +theorem cliGhostExternsWithExtra_other (g : CliGhostHooks) (extra : ExtraGhostTable) + (baseExt : String → Option (State → State)) {sym : String} + (h1 : sym ≠ lsRustAllocSymCli) + (h2 : sym ≠ lsRustDeallocSymCli) + (h3 : sym ≠ lsRustReallocSymCli) + (h4 : sym ≠ lsRustAllocZeroedSymCli) + (h5 : sym ≠ lsRustNoAllocShimSymCli) + (h6 : sym ≠ lsStringCloneSym) + (h7 : sym ≠ lsReadFileSym := by decide) + (h8 : sym ≠ lsReadStdinSym := by decide) + (h9 : sym ≠ lsMemsetSym := by decide) + (h10 : sym ≠ lsMemcpySym := by decide) + (hExtra : cliExtraGhostSyms.contains sym = false ∨ extra.lookup sym = none := by + left; decide) : + cliGhostExternsWithExtra g extra baseExt sym = baseExt sym := by + unfold cliGhostExternsWithExtra + simp only [beq_eq_false_iff_ne.mpr h1, beq_eq_false_iff_ne.mpr h2, + beq_eq_false_iff_ne.mpr h3, beq_eq_false_iff_ne.mpr h4, + beq_eq_false_iff_ne.mpr h5, beq_eq_false_iff_ne.mpr h6, + beq_eq_false_iff_ne.mpr h7, beq_eq_false_iff_ne.mpr h8, + beq_eq_false_iff_ne.mpr h9, beq_eq_false_iff_ne.mpr h10, Bool.false_eq_true, ↓reduceIte] + rcases hExtra with hDomF | hLookN + · simp only [hDomF, Bool.false_eq_true, ↓reduceIte] + · cases hDom : cliExtraGhostSyms.contains sym + · simp only [Bool.false_eq_true, ↓reduceIte] + · simp only [↓reduceIte, hLookN] + +/-- Overlays `g : CliGhostHooks` onto a base extern map `baseExt : LibsignalHooks` + (10 named ghost slots + domain-guarded Cutover-2 `g.extra` table). -/ def cliGhostExterns (g : CliGhostHooks) (baseExt : LibsignalHooks) : LibsignalHooks := - fun sym => - if sym == lsRustAllocSymCli then some g.alloc - else if sym == lsRustDeallocSymCli then some g.dealloc - else if sym == lsRustReallocSymCli then some g.realloc - else if sym == lsRustAllocZeroedSymCli then some g.allocZeroed - else if sym == lsRustNoAllocShimSymCli then some g.shim - else if sym == lsStringCloneSym then - match g.stringClone with - | some f => some f - | none => baseExt sym - else if sym == lsReadFileSym then - match g.readFile with - | some ⟨f, _⟩ => some f - | none => baseExt sym - else if sym == lsReadStdinSym then - match g.readStdin with - | some ⟨f, _⟩ => some f - | none => baseExt sym - else if sym == lsMemsetSym then - match g.memset with - | some f => some f - | none => baseExt sym - else if sym == lsMemcpySym then - match g.memcpy with - | some f => some f - | none => baseExt sym - else baseExt sym + cliGhostExternsWithExtra g g.extra baseExt + +/-- Definitional bridge `cliGhostExterns g = cliGhostExternsWithExtra g g.extra`. -/ +theorem cliGhostExterns_eq_withExtra (g : CliGhostHooks) : + cliGhostExterns g = cliGhostExternsWithExtra g g.extra := rfl + +@[simp] theorem cliGhostExterns_extra_some (g : CliGhostHooks) (baseExt : LibsignalHooks) + {sym : String} {f : State → State} + (hLook : g.extra.lookup sym = some f) + (hDom : cliExtraGhostSyms.contains sym = true := by decide) : + cliGhostExterns g baseExt sym = some f := + cliGhostExternsWithExtra_extra_some g g.extra baseExt hLook hDom @[simp] theorem cliGhostExterns_alloc (g : CliGhostHooks) (baseExt : LibsignalHooks) : cliGhostExterns g baseExt lsRustAllocSymCli = some g.alloc := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsRustAllocSymCli == lsRustAllocSymCli) = true := by decide simp only [h1, ↓reduceIte] @[simp] theorem cliGhostExterns_dealloc (g : CliGhostHooks) (baseExt : LibsignalHooks) : cliGhostExterns g baseExt lsRustDeallocSymCli = some g.dealloc := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsRustDeallocSymCli == lsRustAllocSymCli) = false := by decide have h2 : (lsRustDeallocSymCli == lsRustDeallocSymCli) = true := by decide simp only [h1, h2, Bool.false_eq_true, ↓reduceIte] @[simp] theorem cliGhostExterns_realloc (g : CliGhostHooks) (baseExt : LibsignalHooks) : cliGhostExterns g baseExt lsRustReallocSymCli = some g.realloc := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsRustReallocSymCli == lsRustAllocSymCli) = false := by decide have h2 : (lsRustReallocSymCli == lsRustDeallocSymCli) = false := by decide have h3 : (lsRustReallocSymCli == lsRustReallocSymCli) = true := by decide @@ -268,7 +359,7 @@ def cliGhostExterns (g : CliGhostHooks) (baseExt : LibsignalHooks) : LibsignalHo @[simp] theorem cliGhostExterns_allocZeroed (g : CliGhostHooks) (baseExt : LibsignalHooks) : cliGhostExterns g baseExt lsRustAllocZeroedSymCli = some g.allocZeroed := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsRustAllocZeroedSymCli == lsRustAllocSymCli) = false := by decide have h2 : (lsRustAllocZeroedSymCli == lsRustDeallocSymCli) = false := by decide have h3 : (lsRustAllocZeroedSymCli == lsRustReallocSymCli) = false := by decide @@ -277,7 +368,7 @@ def cliGhostExterns (g : CliGhostHooks) (baseExt : LibsignalHooks) : LibsignalHo @[simp] theorem cliGhostExterns_shim (g : CliGhostHooks) (baseExt : LibsignalHooks) : cliGhostExterns g baseExt lsRustNoAllocShimSymCli = some g.shim := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsRustNoAllocShimSymCli == lsRustAllocSymCli) = false := by decide have h2 : (lsRustNoAllocShimSymCli == lsRustDeallocSymCli) = false := by decide have h3 : (lsRustNoAllocShimSymCli == lsRustReallocSymCli) = false := by decide @@ -288,7 +379,7 @@ def cliGhostExterns (g : CliGhostHooks) (baseExt : LibsignalHooks) : LibsignalHo theorem cliGhostExterns_stringClone_some (g : CliGhostHooks) (baseExt : LibsignalHooks) {f : State → State} (hf : g.stringClone = some f) : cliGhostExterns g baseExt lsStringCloneSym = some f := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsStringCloneSym == lsRustAllocSymCli) = false := by decide have h2 : (lsStringCloneSym == lsRustDeallocSymCli) = false := by decide have h3 : (lsStringCloneSym == lsRustReallocSymCli) = false := by decide @@ -300,7 +391,7 @@ theorem cliGhostExterns_stringClone_some (g : CliGhostHooks) (baseExt : Libsigna theorem cliGhostExterns_stringClone_none (g : CliGhostHooks) (baseExt : LibsignalHooks) (hf : g.stringClone = none) : cliGhostExterns g baseExt lsStringCloneSym = baseExt lsStringCloneSym := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsStringCloneSym == lsRustAllocSymCli) = false := by decide have h2 : (lsStringCloneSym == lsRustDeallocSymCli) = false := by decide have h3 : (lsStringCloneSym == lsRustReallocSymCli) = false := by decide @@ -312,7 +403,7 @@ theorem cliGhostExterns_stringClone_none (g : CliGhostHooks) (baseExt : Libsigna theorem cliGhostExterns_readFile_some (g : CliGhostHooks) (baseExt : LibsignalHooks) {f : State → State} {hfsT : HookFsTraced IsFsC f} (hf : g.readFile = some ⟨f, hfsT⟩) : cliGhostExterns g baseExt lsReadFileSym = some f := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsReadFileSym == lsRustAllocSymCli) = false := by decide have h2 : (lsReadFileSym == lsRustDeallocSymCli) = false := by decide have h3 : (lsReadFileSym == lsRustReallocSymCli) = false := by decide @@ -325,7 +416,7 @@ theorem cliGhostExterns_readFile_some (g : CliGhostHooks) (baseExt : LibsignalHo theorem cliGhostExterns_readFile_none (g : CliGhostHooks) (baseExt : LibsignalHooks) (hf : g.readFile = none) : cliGhostExterns g baseExt lsReadFileSym = baseExt lsReadFileSym := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsReadFileSym == lsRustAllocSymCli) = false := by decide have h2 : (lsReadFileSym == lsRustDeallocSymCli) = false := by decide have h3 : (lsReadFileSym == lsRustReallocSymCli) = false := by decide @@ -338,7 +429,7 @@ theorem cliGhostExterns_readFile_none (g : CliGhostHooks) (baseExt : LibsignalHo theorem cliGhostExterns_readStdin_some (g : CliGhostHooks) (baseExt : LibsignalHooks) {f : State → State} {hfsT : HookFsTraced IsFsC f} (hf : g.readStdin = some ⟨f, hfsT⟩) : cliGhostExterns g baseExt lsReadStdinSym = some f := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsReadStdinSym == lsRustAllocSymCli) = false := by decide have h2 : (lsReadStdinSym == lsRustDeallocSymCli) = false := by decide have h3 : (lsReadStdinSym == lsRustReallocSymCli) = false := by decide @@ -352,7 +443,7 @@ theorem cliGhostExterns_readStdin_some (g : CliGhostHooks) (baseExt : LibsignalH theorem cliGhostExterns_readStdin_none (g : CliGhostHooks) (baseExt : LibsignalHooks) (hf : g.readStdin = none) : cliGhostExterns g baseExt lsReadStdinSym = baseExt lsReadStdinSym := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsReadStdinSym == lsRustAllocSymCli) = false := by decide have h2 : (lsReadStdinSym == lsRustDeallocSymCli) = false := by decide have h3 : (lsReadStdinSym == lsRustReallocSymCli) = false := by decide @@ -366,7 +457,7 @@ theorem cliGhostExterns_readStdin_none (g : CliGhostHooks) (baseExt : LibsignalH theorem cliGhostExterns_memset_some (g : CliGhostHooks) (baseExt : LibsignalHooks) {f : State → State} (hf : g.memset = some f) : cliGhostExterns g baseExt lsMemsetSym = some f := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsMemsetSym == lsRustAllocSymCli) = false := by decide have h2 : (lsMemsetSym == lsRustDeallocSymCli) = false := by decide have h3 : (lsMemsetSym == lsRustReallocSymCli) = false := by decide @@ -381,7 +472,7 @@ theorem cliGhostExterns_memset_some (g : CliGhostHooks) (baseExt : LibsignalHook theorem cliGhostExterns_memset_none (g : CliGhostHooks) (baseExt : LibsignalHooks) (hf : g.memset = none) : cliGhostExterns g baseExt lsMemsetSym = baseExt lsMemsetSym := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsMemsetSym == lsRustAllocSymCli) = false := by decide have h2 : (lsMemsetSym == lsRustDeallocSymCli) = false := by decide have h3 : (lsMemsetSym == lsRustReallocSymCli) = false := by decide @@ -396,7 +487,7 @@ theorem cliGhostExterns_memset_none (g : CliGhostHooks) (baseExt : LibsignalHook theorem cliGhostExterns_memcpy_some (g : CliGhostHooks) (baseExt : LibsignalHooks) {f : State → State} (hf : g.memcpy = some f) : cliGhostExterns g baseExt lsMemcpySym = some f := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsMemcpySym == lsRustAllocSymCli) = false := by decide have h2 : (lsMemcpySym == lsRustDeallocSymCli) = false := by decide have h3 : (lsMemcpySym == lsRustReallocSymCli) = false := by decide @@ -412,7 +503,7 @@ theorem cliGhostExterns_memcpy_some (g : CliGhostHooks) (baseExt : LibsignalHook theorem cliGhostExterns_memcpy_none (g : CliGhostHooks) (baseExt : LibsignalHooks) (hf : g.memcpy = none) : cliGhostExterns g baseExt lsMemcpySym = baseExt lsMemcpySym := by - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra have h1 : (lsMemcpySym == lsRustAllocSymCli) = false := by decide have h2 : (lsMemcpySym == lsRustDeallocSymCli) = false := by decide have h3 : (lsMemcpySym == lsRustReallocSymCli) = false := by decide @@ -435,15 +526,11 @@ theorem cliGhostExterns_other (g : CliGhostHooks) (baseExt : LibsignalHooks) {sy (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) (h9 : sym ≠ lsMemsetSym := by decide) - (h10 : sym ≠ lsMemcpySym := by decide) : - cliGhostExterns g baseExt sym = baseExt sym := by - unfold cliGhostExterns - simp only [beq_eq_false_iff_ne.mpr h1, beq_eq_false_iff_ne.mpr h2, - beq_eq_false_iff_ne.mpr h3, beq_eq_false_iff_ne.mpr h4, - beq_eq_false_iff_ne.mpr h5, beq_eq_false_iff_ne.mpr h6, - beq_eq_false_iff_ne.mpr h7, beq_eq_false_iff_ne.mpr h8, - beq_eq_false_iff_ne.mpr h9, beq_eq_false_iff_ne.mpr h10, - Bool.false_eq_true, ↓reduceIte] + (h10 : sym ≠ lsMemcpySym := by decide) + (hExtra : cliExtraGhostSyms.contains sym = false ∨ g.extra.lookup sym = none := by + left; decide) : + cliGhostExterns g baseExt sym = baseExt sym := + cliGhostExternsWithExtra_other g g.extra baseExt h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 hExtra /-- `ext`-parametric `lsReadFileSym` hook overlay (`rfl`-equal to `ReadFileBudgetPlaced.withReadFileHook`). -/ @@ -466,7 +553,7 @@ theorem withReadFileHook_cliGhostExterns (g : CliGhostHooks) (baseExt : Libsigna exact (cliGhostExterns_readFile_some _ baseExt rfl).symm · have hrf_b : (sym == lsReadFileSym) = false := beq_eq_false_iff_ne.mpr hrf simp only [withReadFileHook, hrf_b, Bool.false_eq_true, ↓reduceIte] - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra simp only [hrf_b, Bool.false_eq_true, ↓reduceIte] theorem withReadStdinHook_cliGhostExterns (g : CliGhostHooks) (baseExt : LibsignalHooks) @@ -481,7 +568,7 @@ theorem withReadStdinHook_cliGhostExterns (g : CliGhostHooks) (baseExt : Libsign exact (cliGhostExterns_readStdin_some _ baseExt rfl).symm · have hrs_b : (sym == lsReadStdinSym) = false := beq_eq_false_iff_ne.mpr hrs simp only [withReadStdinHook, hrs_b, Bool.false_eq_true, ↓reduceIte] - unfold cliGhostExterns + unfold cliGhostExterns cliGhostExternsWithExtra simp only [hrs_b, Bool.false_eq_true, ↓reduceIte] theorem withReadStdinHook_withReadFileHook_cliGhostExterns (g : CliGhostHooks) @@ -499,6 +586,16 @@ theorem hookSat_of_eq {α : Type} {H₁ H₂ : String → Option (State → Stat rcases h with ⟨f, hf, hok⟩ exact ⟨f, heq.trans hf, hok⟩ +private theorem extra_isPanicSymbol_false : + (cliExtraGhostSyms.all fun s => !(Rust.isPanicSymbol s)) = true := by + rw [List.all_eq_true] + intro s hs + simp only [cliExtraGhostSyms, lsMemrchrSym, lsFromUtf8Sym, lsDurationSinceSym, lsTimeAddSym, + lsBlackBoxSym, lsStaticSecretDropSym, lsSharedSecretDropSym, + List.mem_cons, List.not_mem_nil, or_false] at hs + rcases hs with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> + simp [Rust.isPanicSymbol] + theorem cliGhostExterns_panic_of_mem (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) {n : String} (hn : n ∈ cliPanicSymbolsPlaced) : cliGhostExterns g (cliExternsPlaced mmpl W) n = some Rust.panicked := by @@ -512,7 +609,15 @@ theorem cliGhostExterns_panic_of_mem (mmpl : Obj.MultiPlacement) (g : CliGhostHo have h8 : n ≠ lsReadStdinSym := by intro he; subst he; exact nomatch hn have h9 : n ≠ lsMemsetSym := by intro he; subst he; exact nomatch hn have h10 : n ≠ lsMemcpySym := by intro he; subst he; exact nomatch hn - rw [cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10] + have hExtra : cliExtraGhostSyms.contains n = false := by + cases hc : cliExtraGhostSyms.contains n + · rfl + · have hm := List.contains_iff_mem.mp hc + dsimp only [cliExtraGhostSyms] at hm + simp only [List.mem_cons, List.not_mem_nil, or_false] at hm + rcases hm with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> + exact nomatch hn + rw [cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)] exact cliExternsPlaced_panic_of_mem mmpl W hn @[simp] @@ -561,31 +666,18 @@ theorem withPanics_cliGhostExterns (mmpl : Obj.MultiPlacement) (g : CliGhostHook intro he; subst he have hf : Rust.isPanicSymbol lsMemcpySym = false := by simp [lsMemcpySym, Rust.isPanicSymbol] exact Bool.false_ne_true (hf.symm.trans hp) + have hExtra : cliExtraGhostSyms.contains n = false := by + cases hc : cliExtraGhostSyms.contains n + · rfl + · have hall := List.all_eq_true.mp extra_isPanicSymbol_false n (List.contains_iff_mem.mp hc) + rw [hp] at hall; cases hall unfold Rust.withPanics simp only [hp, ↓reduceIte] - rw [cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10] + rw [cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 (Or.inl hExtra)] unfold cliExternsPlaced isCliPanicSymbolPlaced simp [hp] · simp [Rust.withPanics, hp] -theorem cliGhostExterns_bcmp (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) : - cliGhostExterns g (cliExternsPlaced mmpl W) "bcmp" = some (cliBcmpHook W.bcmp) := by - rw [cliGhostExterns_other g _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)] - exact cliExternsPlaced_bcmp mmpl W - -theorem cli_hookSat_bcmp_ghost (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) : - HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) "bcmp" cliBcmpSpec := - ⟨cliBcmpHook W.bcmp, cliGhostExterns_bcmp mmpl g W, cliBcmpHook_ok W⟩ - -theorem cliBcmpGhost_ok [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) - (W : CliHooks) {prog : Program} {i : Nat} - [IsLsBlockProg prog i (cliGhostExterns g (cliExternsPlaced mmpl W))] - (hi : i < 619 := by decide) - (hunmut : (i ∈ libsignalMutatedBlocks) = false := by decide) : - subroutine_ok prog (lsρ "bcmp") cliBcmpSpec := - ls_hook_ok_ultra_of_mem (cli_hookSat_bcmp_ghost mmpl g W) (by decide) hi hunmut - end CryptoVerification.SignalSession.Cli.RunGlue namespace CryptoVerification.SignalSession.Cli diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Glue/FsTracedPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Glue/FsTracedPlaced.lean index 90db8ac67..b2075782b 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Glue/FsTracedPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Glue/FsTracedPlaced.lean @@ -201,7 +201,7 @@ theorem libcruxHmacHookMallocng_fsT (mpl : Obj.MultiPlacement) apply stepRustAlloc1_fsT; intro _ _ exact FsTraced.of_eq rfl rfl -/-- Every row of the `37`-row `cliHookTablePlaced mmpl W` satisfies `HookFsTraced IsFsC`. -/ +/-- Every row of the `27`-row `cliHookTablePlaced mmpl W` satisfies `HookFsTraced IsFsC`. -/ theorem cliHookTablePlaced_fsT (mmpl : Obj.MultiPlacement) (W : CliHooks) : ∀ p ∈ cliHookTablePlaced mmpl W, HookFsTraced IsFsC p.2 := by simp only [cliHookTablePlaced, cliPqxdhHookTablePlaced, List.cons_append, @@ -211,12 +211,10 @@ theorem cliHookTablePlaced_fsT (mmpl : Obj.MultiPlacement) (W : CliHooks) : kemEncapsHook_fsT, kemDecapsHook_fsT, mlkemFromSeedHook_fsT, mlkemPk1Hook_fsT, mlkemPk2Hook_fsT, mlkemEncaps1Hook_fsT, mlkemEncaps2Hook_fsT, mlkemDecapsHook_fsT, mlkemValidatePkHook_fsT, libcruxHmacHookMallocng_fsT, - hookMemmove_fsT, cliBcmpHook_fsT, strlenHook_fsT, writeFileHook_fsT, writeStdoutHook_fsT, - memrchrHook_fsT, fromUtf8Hook_fsT, fmtWriteHook0_fsT, - formatInnerHook0_fsT, durationSinceExactHook_fsT, timeAddHook_fsT, blackBoxHook_fsT, + fmtWriteHook0_fsT, formatInnerHook0_fsT, compress256Hook_fsT, aesEncHookMallocng_fsT, aesDecHookMallocng_fsT, pubFromSecretHook_fsT, - diffieHellmanHook_fsT, zeroizeSecretHook_fsT] + diffieHellmanHook_fsT] /-- Every extern hook of `cliExternsPlaced mmpl W` satisfies `HookFsTraced IsFsC`. -/ theorem fsTHooks_cliExternsPlaced (mmpl : Obj.MultiPlacement) (W : CliHooks) : @@ -268,12 +266,17 @@ structure CliGhostHooksFs (g : CliGhostHooks) : Prop where stringClone_fsT : ∀ f, g.stringClone = some f → HookFsTraced IsFsC f memset_fsT : ∀ f, g.memset = some f → HookFsTraced IsFsC f := by intro _ h; cases h memcpy_fsT : ∀ f, g.memcpy = some f → HookFsTraced IsFsC f := by intro _ h; cases h + extra_fsT : ∀ sym f, + cliExtraGhostSyms.contains sym = true → + g.extra.lookup sym = some f → + HookFsTraced IsFsC f := by + intro _ _ _ h; cases h theorem fsTHooks_cliGhostExterns_of_fs {g : CliGhostHooks} {baseExt : LibsignalHooks} (hFs : CliGhostHooksFs g) (hBase : FsTHooks baseExt) : FsTHooks (cliGhostExterns g baseExt) := by intro sym f h - unfold cliGhostExterns at h + unfold cliGhostExterns cliGhostExternsWithExtra at h split at h · cases h; exact hFs.alloc_fsT · split at h @@ -314,7 +317,17 @@ theorem fsTHooks_cliGhostExterns_of_fs {g : CliGhostHooks} {baseExt : LibsignalH rw [hmc] at h; cases h; exact hFs.memcpy_fsT f hmc | none => rw [hmc] at h; exact hBase sym f h - · exact hBase sym f h + · cases hDom : cliExtraGhostSyms.contains sym + · rw [hDom] at h + simp only [Bool.false_eq_true, ↓reduceIte] at h + exact hBase sym f h + · rw [hDom] at h + simp only [↓reduceIte] at h + cases hex : g.extra.lookup sym with + | some ex => + rw [hex] at h; cases h; exact hFs.extra_fsT sym f hDom hex + | none => + rw [hex] at h; exact hBase sym f h theorem traceFsSound_lsProg_ghost_of_fs [LibsignalPlacement] {g : CliGhostHooks} {baseExt : LibsignalHooks} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonKitsPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonKitsPlacedBudgetFd.lean index df47b6011..787645ffd 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonKitsPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonKitsPlacedBudgetFd.lean @@ -204,7 +204,7 @@ private theorem toSkeletonRunHooks [LibsignalPlacement] {M : AllocCostModel} { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } /-- Upgrades `SessionOnlyKitPlacedOkSE` from `cliPollSessBudgetEnv` (`hKits.sessOk`) to SeqFree `cliPollSessSeqFreeBudgetEnv` with no `hRead` / `hDeser` premises. -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonPollPathBPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonPollPathBPlacedBudgetFd.lean index e4201995d..62596e403 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonPollPathBPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonPollPathBPlacedBudgetFd.lean @@ -10,6 +10,7 @@ limitations under the License. module public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedBudget +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedBudgetSat public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.DecPkD2cCanonKitsPlacedBudgetFd public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.DecPkD2cCanonPollPathBP4PlacedBudgetFd public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.DecPkD2cCanonStage3Prev1PlacedBudgetFd @@ -81,10 +82,7 @@ open CryptoVerification.CliHandshake.RespClosurePlaced (lsProg_518) open scoped CryptoVerification.CliHandshake.RespClosurePlaced open CryptoVerification.SignalSession.Cli.RunGlue ( - CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other withPanics_cliGhostExterns -) -open CryptoVerification.SignalSession.Cli.Slots ( - blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced + CliGhostHooks cliGhostExterns withPanics_cliGhostExterns ) open LibsignalBinary.Heap ( AllocCostModel AllocEvent BudgetLimits FitsEnv FreeOnlyEvs RustCliAllocBudget SeqEnv @@ -114,7 +112,10 @@ open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TailPlacedB str_to_owned_local2_placed_ok_at ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedBudget ( - StageP2MatchedEnv StageP2MatchedMismatchEnv stageP2_matched_ok_framed_placed + StageP2MatchedEnv StageP2MatchedMismatchEnv +) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedBudgetSat ( + stageP2_matched_ok_framed_placed_sat ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.GenP3.ChainClone3ExtPlacedBudget ( chainClone3_placed_ok_of_hooks senderChainClone3_placed_ok_of_hooks @@ -204,15 +205,6 @@ private theorem hookSat_noAllocShimBudget_of_withVmPreserved_p4 {H : String → exact ⟨⟨hpost.2.1, hpost.1⟩, hpost.2.2⟩ · exact Or.inr hrest -private theorem cliExternsPlaced_blackBox_withPanics_p4 (mmpl : Obj.MultiPlacement) - (gh : CliGhostHooks) (W : CliHooks) : - Rust.withPanics (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsBlackBoxU8Sym = - some blackBoxHook := by - rw [withPanics_cliGhostExterns mmpl gh W, - cliGhostExterns_other gh _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)] - exact cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W) - private theorem cliPublicKeySerialize_placed_ok_p4 [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) @@ -411,11 +403,11 @@ private theorem stageP2Matched_noRead_framed_cli_placed_ok [LibsignalPlacement] sep_ac_rfl rw [hpre_assoc] refine sepWPp_entails_post ?_ - exact stageP2_matched_ok_framed_placed + exact stageP2_matched_ok_framed_placed_sat (cliPublicKeySerialize_placed_ok_p4 mmpl gh W hh) (cliStrToOwnedLocal2_placed_ok_p4 mmpl gh W hh) (cliDealloc_placed_ok_p4 mmpl gh W hh) - (cliExternsPlaced_blackBox_withPanics_p4 mmpl gh W) + (hookSat_withPanics_placed_p4 mmpl gh W hh.blackBox) (cliDropSessionStructureLocal2_placed_ok_p4 mmpl gh W hh) st_b s0 s1 sp y.fut y.out y.g.msgA y.g.peerA y.g.meA diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonStage2OverBPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonStage2OverBPlacedBudgetFd.lean index 6ada3a8cf..340037538 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonStage2OverBPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonStage2OverBPlacedBudgetFd.lean @@ -259,8 +259,10 @@ theorem stageP2Over_qpan_cli_memInv_placed_at_B_of_pathC {Φ : Memory → Prop} (hPathC : StageP2PathCOverQpanCliMemInvPlacedAtStmt Φ A lim PromEnv X mmpl gh W B P2OverErrEnv P2OverOkEnv) - (hPromMiss : PromoteMatchingMissGenPlacedProp A.repAlloc - (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (hPromMiss : + RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) → + PromoteMatchingMissGenPlacedProp A.repAlloc + (cliGhostExterns gh (cliExternsPlaced mmpl W))) (hPromOver : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) → PromoteOverGenPlacedWithEnvProp M A lim PromEnv @@ -271,10 +273,10 @@ theorem stageP2Over_qpan_cli_memInv_placed_at_B_of_pathC {Φ : Memory → Prop} hfs hCode1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 herr hok have hh' : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, hh.utf8, hh.memrchr, - hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, hh.blackBox⟩ have hr_scope : scopeIn r := hsub r (scope_of_loadRec_some hfPeer hload) exact hPathC S Scope y st_b g1 r s_old s0 s1 sp rngPtr v_a8 v_b8 v_d0 Q Qpan - hPromMiss (hPromOver hh') hh' hfits hcoins hdecOk.toDecPkOk₀_emptyScope + (hPromMiss hh') (hPromOver hh') hh' hfits hcoins hdecOk.toDecPkOk₀_emptyScope hsub hfPeer hcur hr_scope hnot htrust hg1 hfs hCode1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 (fun sf Pf hpcf hrunf hstepsf hspf hcsf hvregsf hinvf @@ -374,8 +376,10 @@ theorem stageP2Over_qpan_cli_regErr_placed_at_of_pathC {Φ : Memory → Prop} [L (hPathC : StageP2PathCOverQpanCliRegErrMemInvPlacedAtStmt Φ A lim PromEnv X mmpl gh W B P2OverErrEnv) - (hPromMiss : PromoteMatchingMissGenPlacedProp A.repAlloc - (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (hPromMiss : + RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) → + PromoteMatchingMissGenPlacedProp A.repAlloc + (cliGhostExterns gh (cliExternsPlaced mmpl W))) (hPromOver : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) → PromoteOverGenPlacedWithEnvProp M A lim PromEnv @@ -386,10 +390,10 @@ theorem stageP2Over_qpan_cli_regErr_placed_at_of_pathC {Φ : Memory → Prop} [L hfs hCode1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 herr have hh' : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, hh.utf8, hh.memrchr, - hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, hh.blackBox⟩ have hr_scope : scopeIn r := hsub r (scope_of_loadRec_some hfPeer hload) exact hPathC S Scope y hRegErr st_b g1 r s_old s0 s1 sp rngPtr v_a8 v_b8 v_d0 Q Qpan - hPromMiss (hPromOver hh') hh' hfits hcoins hdecOk.toDecPkOk₀_emptyScope + (hPromMiss hh') (hPromOver hh') hh' hfits hcoins hdecOk.toDecPkOk₀_emptyScope hsub hfPeer hcur hr_scope hnot htrust hg1 hfs hCode1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 (fun sf Pf hpcf hrunf hstepsf hspf hcsf hvregsf hinvf @@ -479,7 +483,7 @@ theorem stageP2Over_qpan_cli_archive_frozen_at_B_of_init75_and_kits [LibsignalFu stageP2Over_qpan_cli_memInv_placed_at_B_of_pathC (stageP2PathCOver_qpan_cli_archive_frozen_of_init75_and_kits A lim X mmpl gh W B hDropNz hG hInit75 hErrEnv hOkEnv hFitsSplit hSelfKit hSpkKit hKpkKit hPkKit) - (cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W) + (fun hh => cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W hh.blackBox) (fun hh => cliPromoteOverGen_archive_placed_ok mmpl gh W hh hGrow hRaw) theorem stageP2Over_qpan_cli_archive_regErr_frozen_at_B_of_init75_and_kits [LibsignalFullPlacement] @@ -540,7 +544,7 @@ theorem stageP2Over_qpan_cli_archive_regErr_frozen_at_B_of_init75_and_kits [Libs stageP2Over_qpan_cli_regErr_placed_at_of_pathC (stageP2PathCOver_qpan_cli_archive_regErr_placed_at_of_init75_and_kits A lim X mmpl gh W B hErrEnv hFitsErr hDropNz hG hInit75 hSelfKit hSpkKit hKpkKit hPkKit) - (cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W) + (fun hh => cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W hh.blackBox) (fun hh => cliPromoteOverGen_archive_placed_ok mmpl gh W hh hGrow hRaw) end LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.DecPkD2cCanonStage2OverBPlacedBudgetFd diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonStage2OverPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonStage2OverPlacedBudgetFd.lean index 6f87c0184..af44ef13a 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonStage2OverPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonStage2OverPlacedBudgetFd.lean @@ -114,7 +114,8 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( stageP2PostP1At stageP3CoroFrameAt stageP3StackFrameAt x29_eq_sp0_sub_60 x29_eq_sp_add_c70 ) open CryptoVerification.SignalSession.Cli.Slots (FilesOkPeer scopeIn scopeKit) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget + (CliGhostAllocHooks cliGhostExterns_blackBoxSat_budget_sat) open LibsignalBinary.Heap ( AllocCostModel AllocEvent BudgetLimits FitsEnv FreeOnlyEvs RustCliAllocBudget SeqEnv ) @@ -916,7 +917,8 @@ theorem stageP2Over_qpan_cli_archive_frozen_of_init75_and_kits [LibsignalFullPla stageP2PathCOver_qpan_cli_archive_frozen_of_init75_and_kits A lim X mmpl gh W B hDropNz hG hInit75 (hErrEnv X B) (hOkEnv X B) (hFitsSplit X B) (hSelfKit B) (hSpkKit B) (hKpkKit B) (hPkKit B)) - (cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W) + (cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + (cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hG.extraOk)) (fun hh => cliPromoteOverGen_archive_placed_ok mmpl gh W hh hGrow hRaw) end LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.DecPkD2cCanonStage2OverPlacedBudgetFd diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonStage2PathAPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonStage2PathAPlacedBudgetFd.lean index e6d05d4d0..2ba4d9a22 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonStage2PathAPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cCanonStage2PathAPlacedBudgetFd.lean @@ -37,9 +37,12 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.DecryptPrekeySl public import LibsignalBinary.Proofs.SpqrV1.Top.InitialState.DefsPlacedBudget public import LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudget +import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudgetSat +import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetBbSat import ProofLib import ProofLib.SepLogic.WPp @@ -127,7 +130,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( ) open CryptoVerification.SignalSession.Cli.RunSkeleton (RunBudgets) open CryptoVerification.SignalSession.Cli.Slots ( - FilesOkPeer blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced loadRec scopeIn scopeKit + FilesOkPeer loadRec scopeIn scopeKit ) open LibsignalBinary.Heap ( AllocCostModel AllocEvent BudgetLimits FitsEnv FreeOnlyEvs RustCliAllocBudget SeqEnv @@ -142,7 +145,7 @@ open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Mid3Place ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget ( InitializeBobV1OptFieldsEnv initializeBobSession_ok_v1_of_env_4k_frozen_placed_on_stageP1 - isSameAccount_4k_placed_ok_on_stageP1 p2_errOwned_frozen_to_defs4K_placed + p2_errOwned_frozen_to_defs4K_placed stageP2BaseCalleesPlaced4K_of_hooks ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2V1PlacedBudget ( @@ -173,10 +176,6 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.Clos open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget ( RunHooksPlaced StageP2PathAEnv StageP2PathAErrPlaced ) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudget ( - pqxdhAccept_err_owned_responder_full_placed_ok_of_block - pqxdhAccept_opt_fields_responder_full_placed_ok_of_block -) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1AgreePlacedBudget ( cliPollKpk_wf_of_preKeysWf_placed cliPollPk_wf_of_preKeysWf_placed cliPollSpk_wf_of_preKeysWf_placed p2BobInitSessionV1_eq_pathAInitState @@ -188,7 +187,6 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.Stag cliPollPk_getErr_entails_decResAt_anyHeap_placed cliPollSelf_kpErr_entails_decResAt_err_placed cliPollSelf_regIdErr_entails_decResAt_err_placed cliPollSpk_getErr_entails_decResAt_anyHeap_placed cliPollStageP2_fsAt_stages_placed - cliResponderPqxdhHookContractsPlaced_of_hookSat ) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1FoldsPlacedBudget ( p2ErrFrame_fold_pathA_placed_rep pathAInnerFramePlaced stageP2PreAt_dup_kyberPtr_placed @@ -413,10 +411,8 @@ theorem cliStageP2BaseCalleesPlaced4K [LibsignalPlacement] {M : AllocCostModel} hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_sessionMemcpyBudget_of_vm allocHookStack hh.codecHooks.memcpy) - (isSameAccount_4k_placed_ok_on_stageP1 - ((cliGhostExterns_other gh _ - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W))) + (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat.isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) theorem cliInitBobV1FrozenOkPlaced4K_of_init75 [LibsignalFullPlacement] @@ -437,12 +433,15 @@ theorem cliInitBobV1FrozenOkPlaced4K_of_init75 [LibsignalFullPlacement] hh.codecHooks.alloc hh.codecHooks.dealloc (cliExternsPlaced_sessionMemcpyRegion_budget_sat mmpl gh W hG) - (pqxdhAccept_opt_fields_responder_full_placed_ok_of_block + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudgetSat.pqxdhAccept_opt_fields_responder_full_placed_ok_of_block_bb_sat (callerProg := lsProg_75 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 75) (cliModelPrims_structural X W) (cliModelPrims_matchCrypto X W) - (cliResponderPqxdhHookContractsPlaced_of_hookSat - X mmpl gh W hG hh.codecHooks.alloc hh.codecHooks.dealloc + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetBbSat.cliResponderPqxdhHookContractsPlaced_of_hookSat_bb_sat + X mmpl gh W hG + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_sessionMemsetRegion_budget_sat + mmpl gh W hG) + hh.blackBox hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_noAllocShimBudget_of_withVmPreserved hh.codecHooks.shim)) (hookSat_framelessMemcpy_of_vm (cliExternsPlaced_framelessMemcpy_budget_sat mmpl gh W hG))) @@ -463,12 +462,15 @@ theorem cliInitBobErrOwnedFrozen4K_ok [LibsignalFullPlacement] (AcceptOptFieldsEnv (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)))) := by have h75 := initializeBobSession_err_owned_frozen_placed_ok_of_accept - (pqxdhAccept_err_owned_responder_full_placed_ok_of_block + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudgetSat.pqxdhAccept_err_owned_responder_full_placed_ok_of_block_bb_sat (callerProg := lsProg_75 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 75) (cliModelPrims_structural X W) (cliModelPrims_matchCrypto X W) - (cliResponderPqxdhHookContractsPlaced_of_hookSat - X mmpl gh W hG hh.codecHooks.alloc hh.codecHooks.dealloc + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetBbSat.cliResponderPqxdhHookContractsPlaced_of_hookSat_bb_sat + X mmpl gh W hG + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_sessionMemsetRegion_budget_sat + mmpl gh W hG) + hh.blackBox hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_noAllocShimBudget_of_withVmPreserved hh.codecHooks.shim)) (hookSat_framelessMemcpy_of_vm (cliExternsPlaced_framelessMemcpy_budget_sat mmpl gh W hG))) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cSlotOkAtPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cSlotOkAtPlacedBudget.lean index 1be09183a..f02a85af6 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cSlotOkAtPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/DecPkD2cSlotOkAtPlacedBudget.lean @@ -200,7 +200,8 @@ open CryptoVerification.SignalSession ( open CryptoVerification.SignalSession.Cli.MainHops (cliIo cliRunBudgets cliWrOk) open CryptoVerification.SignalSession.Cli.RunCompose (DecPkGhost) open CryptoVerification.SignalSession.Cli.RunGlue ( - CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other withPanics_cliGhostExterns + CliGhostHooks cliExternsPlaced_row cliExtraGhostSyms cliGhostExterns cliGhostExterns_other + withPanics_cliGhostExterns ) open CryptoVerification.SignalSession.Cli.RunProofs.Poll (cliKitStk dpPollProgPlaced) open CryptoVerification.SignalSession.Cli.RunSkeleton (RunBudgets) @@ -293,9 +294,11 @@ private theorem cliGhost_row_eq (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.LibsignalTripleRatchet.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.LibsignalTripleRatchet.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.LibsignalTripleRatchet.lsMemcpySym := by decide) + (hExtra : cliExtraGhostSyms.contains sym = false ∨ gh.extra.lookup sym = none := by + left; decide) : cliGhostExterns gh (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other gh (cliExternsPlaced mmpl W) h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans + (cliGhostExterns_other gh (cliExternsPlaced mmpl W) h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 hExtra).trans (cliExternsPlaced_row mmpl W hrow) /-- Closed `formatInnerBudgetSpec` `HookSat` on `cliGhostExterns gh (cliExternsPlaced mmpl W)`. -/ @@ -4999,7 +5002,8 @@ open CryptoVerification.SignalSession ( open CryptoVerification.SignalSession.Cli.MainHops (cliIo cliRunBudgets cliWrOk) open CryptoVerification.SignalSession.Cli.RunCompose (DecPkGhost) open CryptoVerification.SignalSession.Cli.RunGlue ( - CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other withPanics_cliGhostExterns + CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other + withPanics_cliGhostExterns ) open CryptoVerification.SignalSession.Cli.RunProofs.Poll (cliKitStk dpPollProgPlaced) open CryptoVerification.SignalSession.Cli.RunSkeleton (RunBudgets) @@ -5241,7 +5245,7 @@ theorem decPkD2cSlotOk_full_placed_at_X_of_tryDec [LibsignalFullPlacement] LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1KitsPlacedBudgetAux.cliPollPk_kitPlacedOk mmpl gh W B F0 opkWord hDropNz hh_sk (hRead B))) (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok - A.repAlloc mmpl gh W) + A.repAlloc mmpl gh W hh.blackBox) (fun hh_sk => LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteOverGen_placed_ok mmpl gh W hh_sk (cliGrowOneVecU8_lsProg51_withLsCl_ok mmpl gh W hG) hRaw)) @@ -5331,7 +5335,7 @@ theorem decPkD2cSlotOk_full_placed_at_X_archive_of_tryDec [LibsignalFullPlacemen LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1KitsPlacedBudgetAux.cliPollPk_kitPlacedOk mmpl gh W B F0 opkWord hDropNz hh_sk (hRead B))) (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok - A.repAlloc mmpl gh W) + A.repAlloc mmpl gh W hh.blackBox) (fun hh_sk => LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteOverGen_archive_placed_ok mmpl gh W hh_sk (cliGrowOneVecU8_lsProg51_withLsCl_ok mmpl gh W hG) hRaw)) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage2OverInstPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage2OverInstPlaced.lean index 11d0ff93f..3aac48224 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage2OverInstPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage2OverInstPlaced.lean @@ -17,6 +17,8 @@ public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Over.StageP2 public import LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeams public import LibsignalBinary.Proofs.SignalSession.Cli.Store.SerGlueXCliPlaced public import LibsignalBinary.Proofs.PublicApi.StoreKit.Over.MatchCallee +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat -- proof-setup: allow-public-import +import LibsignalBinary.Proofs.PublicApi.StoreKit.Over.MatchCalleeSat public import LibsignalBinary.Proofs.PublicApi.StoreKit.Over.ArchivePromote public import LibsignalBinary.Proofs.SignalSession.Cli.KitInst.IdentityKitOkCliPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.KitInst.PreKeySpecsPlaced @@ -31,6 +33,7 @@ import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.Cl import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureSpeOwned import LibsignalBinary.Proofs.SpqrV1.Kdf.HkdfToSliceExtract import LibsignalBinary.Proofs.TripleRatchet.Alloc.Defs +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBbSat /-! # Relocatable CLI Poll Stage P2 Over-Path (`Path C`) Instantiation @@ -87,6 +90,8 @@ open CryptoVerification.SignalSession.Cli.RunCompose hiding Bytes open CryptoVerification.SignalSession.Cli.RunProofs open CryptoVerification.SignalSession.Cli.KitInst open CryptoVerification.CliHandshake.RespClosurePlaced +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBbSat + (isSameAccount_4k_placed_ok_on_stageP1_sat) /-! ## 1. Placed Stage P2 Over-Path (`Path C`) Error & Kit Event Simplifications -/ @@ -1036,12 +1041,13 @@ private theorem subroutine_ok_withLsCl_of_spec_map [LibsignalPlacement] {α β : /-- Relocatable `PromoteMatchingMissGenPlacedProp` (`lsmpl.base 50`) from `h_bb` on `ext`. -/ theorem promoteMatchingMissGen_placed_of_blackBox [LibsignalPlacement] {A : RustAlloc} {ext : String → Option (State → State)} - (h_bb : ext lsBlackBoxU8Sym = some CryptoVerification.LibsignalSession.blackBoxHook) : + (h_bb : HookSat ext lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : Over.PromoteMatchingMissGenPlacedProp A ext := by have h50' : subroutine_ok (lsProg_518 ext) (lsmpl.base 50) (withLsCl lsmpl (Over.promoteMatchingSessionMissSpec A)) := ls_subroutine_ok_cl_of_callee (callerProg := lsProg_518 ext) - (Over.promote_matching_session_miss_placed_ok h_bb) + (LibsignalBinary.Proofs.PublicApi.StoreKit.Over.MatchCalleeSat.promote_matching_session_miss_placed_ok_sat h_bb) exact subroutine_ok_withLsCl_of_spec_map (fun x : Over.P2PromoteMissGhost => (⟨x.recPtr, x.msgVer, x.serPtr, x.serBytes, x.outPtr, x.g, x.r, x.s⟩ : @@ -1052,11 +1058,12 @@ theorem promoteMatchingMissGen_placed_of_blackBox [LibsignalPlacement] {A : Rust /-- Relocatable `PromoteMatchingMissGenPlacedProp` (`lsmpl.base 50`) at `cliGhostExterns gh (cliExternsPlaced mmpl W)`. -/ theorem cliPromoteMatchingMissGen_placed_ok [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : + (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hBb : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : Over.PromoteMatchingMissGenPlacedProp E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - promoteMatchingMissGen_placed_of_blackBox - (IdKit.cliGhostExterns_blackBox mmpl gh W) + promoteMatchingMissGen_placed_of_blackBox hBb /-- Relocatable `PromoteOverGenPlacedProp` (`lsmpl.base 47`) from `SerContractsXPlaced` and a Block `51`→`621` `grow_one` contract. -/ @@ -1107,8 +1114,6 @@ theorem cliPromoteOverGen_placed_ok [LibsignalPlacement] hh.codecHooks.dealloc hh.codecHooks.realloc (noAllocShimSpec_eq_sessionShimSpec_over ▸ hh.codecHooks.shim) - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_sessionMemmove_sat mmpl W _)) (hookSat_sessionMemcpy_of_codec _ hh.codecHooks.memcpy) (Slots.cliGhostExterns_panic_handle_error mmpl gh W) (Slots.cliGhostExterns_panic_handle_alloc_error mmpl gh W)) @@ -1177,8 +1182,8 @@ private theorem cliStageP2PureCalleesPlaced4K_over_of_seams [LibsignalPlacement] (hookSat_sessionMemcpy_of_codec allocHookStack hh.codecHooks.memcpy) (Slots.cliGhostExterns_panic_handle_error mmpl gh W) (Slots.cliGhostExterns_panic_handle_alloc_error mmpl gh W) - (Kits.isSameAccount_4k_placed_ok_on_stageP1 - (IdKit.cliGhostExterns_blackBox mmpl gh W) + (isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (cliUuidTryParse_placed_ok_over mmpl gh W)) h_accept hS.initialStateMemInv_lsProg75 @@ -1324,62 +1329,85 @@ private theorem cliStageP2BaseCalleesPlaced4K_over [LibsignalPlacement] (hookSat_sessionMemcpy_of_codec allocHookStack hh.codecHooks.memcpy) (Slots.cliGhostExterns_panic_handle_error mmpl gh W) (Slots.cliGhostExterns_panic_handle_alloc_error mmpl gh W) - (Kits.isSameAccount_4k_placed_ok_on_stageP1 - (IdKit.cliGhostExterns_blackBox mmpl gh W) + (isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (cliUuidTryParse_placed_ok_over mmpl gh W)) +private theorem cliDalekMontToEd_placed_sat_over (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) + (W : CliHooks) (X : UnreachedPqxdhPrimitives) : + HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) ResponderCore.lsDalekMontToEdSym + (ResponderCore.dalekMontToEdStubSpec (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩))) := by + rcases Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W + (Slots.cliExternsPlaced_toEdwards_sat mmpl W X (img := default)) with ⟨f, hrow, hok⟩ + exact ⟨f, hrow, fun g R s0 hrun hpre hsp => + hok ⟨g.inBytes, g.signBit, g.inPtr, g.outPtr⟩ R s0 hrun hpre hsp⟩ + +private theorem cliDalekTorsionFree_placed_sat_over (mmpl : Obj.MultiPlacement) + (gh : CliGhostHooks) (W : CliHooks) (X : UnreachedPqxdhPrimitives) : + HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) ResponderCore.lsDalekTorsionFreeSym + (Initiator.cryptoBoolRegStubSpec + (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)).isTorsionFree 160) := by + rcases Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W + (Slots.cliExternsPlaced_torsionFree_sat mmpl W X (img := default)) with ⟨f, hrow, hok⟩ + exact ⟨f, hrow, fun g R s0 hrun hpre hsp => + hok ⟨g.inPtr, g.inBytes⟩ R s0 hrun hpre hsp⟩ + private theorem pqxdhAccept_opt_fields_exactSat_over [LibsignalFullPlacement] - {callerProg : Program} {i : Nat} - {P : Initiator.Primitives} {C : Crypto} {A : RustAlloc} {H : LibsignalHooks} - [IsLsBlockProg callerProg i H] - (hWF : Initiator.StructuralPrims P) - (hP : ResponderCore.PrimitivesMatchCrypto P C) - (hH : LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoPlacedSat.PqxdhPlacedHookContractsExactSat - P C A H) - (h_memcpy : HookSat H lsMemcpySym framelessMemcpySpec) : - subroutine_ok callerProg (lsmpl.base 79) - (ResponderCore.pqxdhAcceptOptFieldsFrozenPlacedSpec P A) := - ResponderCore.pqxdhAccept_opt_fields_placed_ok_of_block hWF - (ResponderCore.ecPubKeyIsCanonical_placed_ok_cl hWF hH.dalekMontToEd hH.dalekTorsionFree) - (hH.calculateAgreement_ok hP) - (CryptoVerification.E2E.Pqxdh.Shared.vecAppendElements_fast_placed_ok_cl h_memcpy) - (hH.hkdfExtract_ok hP) - (hH.hkdfExpandMultiInfo_ok hP) - hH.noAllocShim hH.alloc hH.dealloc h_memcpy hH.kyberDecaps - hH.handleError hH.handleAllocError + (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hh : RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) : + subroutine_ok (lsProg_75 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsmpl.base 79) + (ResponderCore.pqxdhAcceptOptFieldsFrozenPlacedSpec + (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) E2E.HooksE.A0) := + ResponderCore.pqxdhAccept_opt_fields_placed_ok_of_block + (cliModelPrims_structural X W) + (ResponderCore.ecPubKeyIsCanonical_placed_ok_cl (cliModelPrims_structural X W) + (cliDalekMontToEd_placed_sat_over mmpl gh W X) + (cliDalekTorsionFree_placed_sat_over mmpl gh W X)) + (cliPqxdhCalculateAgreement_placed_ok + X mmpl gh W hG hh) + (CryptoVerification.E2E.Pqxdh.Shared.vecAppendElements_fast_placed_ok_cl hh.codecHooks.memcpy) + (cliPqxdhHkdfExtract_placed_ok + X mmpl gh W hG hh) + (cliPqxdhHkdfExpandMultiInfo_placed_ok + X mmpl gh W hG hh) + hh.codecHooks.shim hh.codecHooks.alloc hh.codecHooks.dealloc hh.codecHooks.memcpy + (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W + (Slots.cliExternsPlaced_kemDecaps_sat mmpl W X)) + (Slots.cliGhostExterns_panic_handle_error mmpl gh W) + (Slots.cliGhostExterns_panic_handle_alloc_error mmpl gh W) private theorem pqxdhAccept_err_owned_exactSat_over [LibsignalFullPlacement] - {callerProg : Program} {i : Nat} - {P : Initiator.Primitives} {C : Crypto} {A : RustAlloc} {H : LibsignalHooks} - [IsLsBlockProg callerProg i H] - (hWF : Initiator.StructuralPrims P) - (hP : ResponderCore.PrimitivesMatchCrypto P C) - (hH : LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoPlacedSat.PqxdhPlacedHookContractsExactSat - P C A H) - (h_memcpy : HookSat H lsMemcpySym framelessMemcpySpec) : - subroutine_ok callerProg (lsmpl.base 79) - (ResponderCore.pqxdhAcceptErrOwnedFrozenPlacedSpec P A) := - ResponderCore.pqxdhAccept_err_owned_placed_ok_of_block hWF - (ResponderCore.ecPubKeyIsCanonical_placed_ok_cl hWF hH.dalekMontToEd hH.dalekTorsionFree) - (hH.calculateAgreement_ok hP) - hH.noAllocShim hH.alloc hH.dealloc h_memcpy hH.handleError + (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hh : RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) : + subroutine_ok (lsProg_75 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsmpl.base 79) + (ResponderCore.pqxdhAcceptErrOwnedFrozenPlacedSpec + (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) E2E.HooksE.A0) := + ResponderCore.pqxdhAccept_err_owned_placed_ok_of_block + (cliModelPrims_structural X W) + (ResponderCore.ecPubKeyIsCanonical_placed_ok_cl (cliModelPrims_structural X W) + (cliDalekMontToEd_placed_sat_over mmpl gh W X) + (cliDalekTorsionFree_placed_sat_over mmpl gh W X)) + (cliPqxdhCalculateAgreement_placed_ok + X mmpl gh W hG hh) + hh.codecHooks.shim hh.codecHooks.alloc hh.codecHooks.dealloc hh.codecHooks.memcpy + (Slots.cliGhostExterns_panic_handle_error mmpl gh W) private theorem initBobErrOwned_4k_exactSat_over [LibsignalFullPlacement] - {P : Initiator.Primitives} {C : Crypto} {A : RustAlloc} - {ext : String → Option (State → State)} - (hWF : Initiator.StructuralPrims P) - (hP : ResponderCore.PrimitivesMatchCrypto P C) - (hH : LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoPlacedSat.PqxdhPlacedHookContractsExactSat - P C A ext) - (h_memcpy : HookSat ext lsMemcpySym framelessMemcpySpec) : - subroutine_ok (stageP1ProgPlaced ext) (lsmpl.base 75) - (Sub5Placed.initializeBobSessionErrOwnedFrozen4KPlacedSpec P A) := + (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hh : RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) : + subroutine_ok (stageP1ProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsmpl.base 75) + (Sub5Placed.initializeBobSessionErrOwnedFrozen4KPlacedSpec + (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) E2E.HooksE.A0) := Sub5Placed.of_responderCore_errOwned_to_4K_frozen_placed <| by have hbase := ResponderCore.ls_subroutine_ok_withLsFrozen_of_block - (callerProg := stageP1ProgPlaced ext) (calleeProg := lsProg_75 ext) (i := 518) (j := 75) + (callerProg := stageP1ProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (calleeProg := lsProg_75 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 518) (j := 75) (ResponderCore.initializeBobSession_err_owned_frozen_placed_ok_of_accept - (pqxdhAccept_err_owned_exactSat_over hWF hP hH h_memcpy)) + (pqxdhAccept_err_owned_exactSat_over X mmpl gh W hG hh)) refine subroutine_ok_map_panic hbase ?_ (fun _ _ _ _ _ _ he => by dsimp only [ResponderCore.initializeBobSessionErrOwnedFrozenPlacedSpec, @@ -1398,25 +1426,27 @@ private theorem initBobErrOwned_4k_exactSat_over [LibsignalFullPlacement] exact hpre.2 private theorem initBobOkV1_4k_exactSat_over [LibsignalFullPlacement] - {P : Initiator.Primitives} {C : Crypto} {A : RustAlloc} {F : ShaCompress} - {ext : String → Option (State → State)} - (hWF : Initiator.StructuralPrims P) - (hP : ResponderCore.PrimitivesMatchCrypto P C) - (hH : LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoPlacedSat.PqxdhPlacedHookContractsExactSat - P C A ext) - (h_memcpy : HookSat ext lsMemcpySym framelessMemcpySpec) - (hMemcpySess : HookSat ext lsMemcpySym sessionMemcpyRegionSpec) + (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hh : RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (hinit : CryptoVerification.Cli.E2E.V1.InitialStateMemInvPlacedOk - (LibsignalPublicApi.StoreKit.LibsignalCodeRoLoaded lsmpl) A F ext) : - Kits.InitializeBobV1FrozenOkPlaced4K P A F ext := + (LibsignalPublicApi.StoreKit.LibsignalCodeRoLoaded lsmpl) E2E.HooksE.A0 W.C.F + (cliGhostExterns gh (cliExternsPlaced mmpl W))) : + Kits.InitializeBobV1FrozenOkPlaced4K + (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) E2E.HooksE.A0 W.C.F + (cliGhostExterns gh (cliExternsPlaced mmpl W)) := Kits.InitializeBobV1MemInvOkPlaced.to_4K fun s0 inp ikBPk spkBPk argPtr pqskPtr ctSlicePtr ctBufPtr ratchetKeyPairPtr outPtr drKey Frame hfr hrun hpc hsp hpqr hx0 hx1 hx8 htr hrep hopk hwell hik hspk hacc => - Kits.ls_sepWPp_of_block (callerProg := stageP1ProgPlaced ext) (calleeProg := lsProg_75 ext) + Kits.ls_sepWPp_of_block + (callerProg := stageP1ProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (calleeProg := lsProg_75 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 518) (j := 75) (LibsignalCodeLoaded.of_codeLoaded hfr.2) (CryptoVerification.Cli.E2E.V1.initializeBobSession_ok_v1_frozen_placed_of_accept - hWF hH.noAllocShim hH.alloc hH.dealloc hMemcpySess hH.handleError - (pqxdhAccept_opt_fields_exactSat_over hWF hP hH h_memcpy) + (cliModelPrims_structural X W) hh.codecHooks.shim hh.codecHooks.alloc hh.codecHooks.dealloc + (hookSat_sessionMemcpyRegion_of_codec hh.codecHooks.memcpy) + (Slots.cliGhostExterns_panic_handle_error mmpl gh W) + (pqxdhAccept_opt_fields_exactSat_over X mmpl gh W hG hh) (CryptoVerification.Cli.E2E.V1.initialStateMemInvPlacedOk_mono (fun _ h => ⟨LibsignalCodeLoaded.of_codeLoaded h.2, h.1⟩) hinit) s0 inp ikBPk spkBPk argPtr pqskPtr ctSlicePtr ctBufPtr ratchetKeyPairPtr outPtr drKey Frame @@ -1470,16 +1500,8 @@ theorem stageP2PathCOver_qpan_cli_full_placed_of_seams [LibsignalFullPlacement] (cliModelPrims_structural X W) (cliStageP2ClosureHooksPlaced_over mmpl gh W hh) (cliStageP2BaseCalleesPlaced4K_over mmpl gh W hh) - (initBobErrOwned_4k_exactSat_over - (cliModelPrims_structural X W) (cliModelPrims_matchCrypto X W) - (cliResponderPqxdhHookContractsPlaced X mmpl gh W hG hh) - hh.codecHooks.memcpy) - (initBobOkV1_4k_exactSat_over - (cliModelPrims_structural X W) (cliModelPrims_matchCrypto X W) - (cliResponderPqxdhHookContractsPlaced X mmpl gh W hG hh) - hh.codecHooks.memcpy - (hookSat_sessionMemcpyRegion_of_codec hh.codecHooks.memcpy) - hSpqr.initialStateMemInv_lsProg75) + (initBobErrOwned_4k_exactSat_over X mmpl gh W hG hh) + (initBobOkV1_4k_exactSat_over X mmpl gh W hG hh hSpqr.initialStateMemInv_lsProg75) (cliPollIdKitPlaced E2E.HooksE.A0 F0 peer (cliKitStk B)) (cliPollSelfKitPlaced E2E.HooksE.A0 F0 peer (cliKitStk B)) (cliPollSelf_vtablesPlacedOk F0 peer (cliKitStk B) hDropNz) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage2OverInstPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage2OverInstPlacedBudget.lean index a104361d4..9b66ac423 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage2OverInstPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage2OverInstPlacedBudget.lean @@ -28,7 +28,9 @@ public import LibsignalBinary.Proofs.PublicApi.StoreKit.KyberPreKeyStoreKitBudge public import LibsignalBinary.Proofs.PublicApi.StoreKit.Over.ArchiveAuxBudget public import LibsignalBinary.Proofs.PublicApi.StoreKit.Over.ArchiveDefsBudget public import LibsignalBinary.Proofs.PublicApi.StoreKit.Over.ArchivePromoteBudget +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.PublicApi.StoreKit.Over.MatchCalleeBudget +import LibsignalBinary.Proofs.PublicApi.StoreKit.Over.MatchCalleeBudgetSat public import LibsignalBinary.Proofs.PublicApi.StoreKit.PlacedBudget public import LibsignalBinary.Proofs.PublicApi.StoreKit.PreKeyStoreKitBudget public import LibsignalBinary.Proofs.PublicApi.StoreKit.SignedPreKeyStoreKitBudget @@ -81,7 +83,7 @@ open CryptoGames.LibsignalSession ( ) open CryptoGames.LibsignalSessionApi (ApiError Session SessionRecord) open CryptoVerification ( - LibsignalFrozen LibsignalFullPlacement LibsignalPlacement lsBlackBoxU8Sym lsProg_51 lsProg_75 + LibsignalFrozen LibsignalFullPlacement LibsignalPlacement lsProg_51 lsProg_75 lsmpl lsρ withLsCl ) open CryptoVerification.RustHeap (RustAlloc) @@ -119,13 +121,12 @@ open CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Kits ( open CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Over ( clearPending stageP2OverV1CallStack4K stageP3Sub5ExtraPrePrev1 ) -open CryptoVerification.SignalSession (CliHooks cliExternsPlaced) +open CryptoVerification.SignalSession (CliHooks cliExternsPlaced lsBlackBoxSym) open CryptoVerification.SignalSession.Cli ( CliGhostHooks StoresGhost cliGhostExterns cliIdentityVtSym cliKyberPreKeyVtSym cliPreKeyVtSym cliSessionVtSym cliSignedPreKeyVtSym ) open CryptoVerification.SignalSession.Cli.MainHops (cliIo coinsInstalledPlaced storesAt) -open CryptoVerification.SignalSession.Cli.RunGlue (cliExternsPlaced_row cliGhostExterns_other) open CryptoVerification.SignalSession.Cli.RunSkeleton (RunBudgets) open CryptoVerification.SignalSession.Cli.RunCompose (DecPkGhost RunSem decResAt) open CryptoVerification.SignalSession.Cli.RunProofs ( @@ -138,7 +139,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( stageP2PostP1At stageP3CoroFrameAt stageP3StackFrameAt ) open CryptoVerification.SignalSession.Cli.Slots ( - FilesOkPeer blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced scopeIn scopeKit + FilesOkPeer scopeIn scopeKit ) open LibsignalBinary.Heap ( AllocCostModel AllocEvent BudgetLimits FitsEnv FreeOnlyEvs @@ -199,7 +200,9 @@ open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Over.StageP2V1PlacedB stageP2_over_v1_kits_ext_placed stageP2_over_v1_kits_ext_placed_ofEnv ) open LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget (SpqrV1PlacedSeams) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( + CliGhostAllocHooks cliGhostExterns_blackBoxSat_budget_sat +) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.DecryptPrekeySlotPlacedBudget ( DpPollGhostStateBudget dpSlotPollKStatePlaced ) @@ -601,7 +604,8 @@ private theorem subroutine_ok_withLsCl_of_spec_map [LibsignalPlacement] {α β : /-- Relocatable `VmPreserved` `PromoteMatchingMissGenPlacedProp` (`lsmpl.base 50`) from `h_bb`. -/ theorem promoteMatchingMissGen_placed_of_blackBox [LibsignalPlacement] {A : RustAlloc} {ext : String → Option (State → State)} - (h_bb : ext lsBlackBoxU8Sym = some CryptoVerification.LibsignalSession.blackBoxHook) : + (h_bb : HookSat ext lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : PromoteMatchingMissGenPlacedProp A ext := by have h50' : subroutine_ok (CryptoVerification.CliHandshake.RespClosurePlaced.lsProg_518 ext) (lsmpl.base 50) @@ -609,7 +613,7 @@ theorem promoteMatchingMissGen_placed_of_blackBox [LibsignalPlacement] {A : Rust (LibsignalBinary.Proofs.PublicApi.StoreKit.Over.MatchDefsBudget.promoteMatchingSessionMissSpec A)) := CryptoVerification.LibsignalTripleRatchet.ls_subroutine_ok_cl_of_callee (callerProg := CryptoVerification.CliHandshake.RespClosurePlaced.lsProg_518 ext) - (LibsignalBinary.Proofs.PublicApi.StoreKit.Over.MatchCalleeBudget.promote_matching_session_miss_placed_ok h_bb) + (LibsignalBinary.Proofs.PublicApi.StoreKit.Over.MatchCalleeBudgetSat.promote_matching_session_miss_placed_ok_sat h_bb) exact subroutine_ok_withLsCl_of_spec_map (fun x : CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Over.P2PromoteMissGhost => (⟨x.recPtr, x.msgVer, x.serPtr, x.serBytes, x.outPtr, x.g, x.r, x.s⟩ : @@ -620,12 +624,11 @@ theorem promoteMatchingMissGen_placed_of_blackBox [LibsignalPlacement] {A : Rust /-- Relocatable `VmPreserved` `PromoteMatchingMissGenPlacedProp` (`lsmpl.base 50`) at `cliGhostExterns gh (cliExternsPlaced mmpl W)`. -/ theorem cliPromoteMatchingMissGen_placed_ok [LibsignalPlacement] (A : RustAlloc) - (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : + (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hBb : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : PromoteMatchingMissGenPlacedProp A (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - promoteMatchingMissGen_placed_of_blackBox - ((cliGhostExterns_other gh _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W))) + promoteMatchingMissGen_placed_of_blackBox hBb private theorem boundedRustEvs_rustAlloc_one (n : Nat) (hn : n < 2 ^ 32) : BoundedRustEvs 1 (max n 16) (LibsignalBinary.Heap.rustAllocEvents n 1) := by @@ -803,9 +806,6 @@ theorem cliPromoteOverGen_placed_ok [LibsignalPlacement] {M : AllocCostModel} hh.codecHooks.dealloc hh.codecHooks.realloc ((show withVmPreserved noAllocShimSpec = sessionShimBudgetSpec from rfl) ▸ hh.codecHooks.shim) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_sessionMemmove_budget_sat - mmpl W CryptoVerification.LibsignalTripleRatchet.extHookStack)) (hookSat_sessionMemcpyBudget_of_codec CryptoVerification.LibsignalTripleRatchet.extHookStack hh.codecHooks.memcpy)) hGrow hRaw @@ -1015,6 +1015,7 @@ theorem stageP2Over_qpan_cli_placed_of_pathC [LibsignalPlacement] {M : AllocCost DecPkGhost → SessionRecord (List (BitVec 8)) → List AllocEvent → Prop} (hPathC : StageP2PathCOverQpanCliPlacedStmt A lim PromEnv P2OverErrEnv P2OverOkEnv) (hPromMiss : ∀ (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks), + RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) → PromoteMatchingMissGenPlacedProp A.repAlloc (cliGhostExterns gh (cliExternsPlaced mmpl W))) (hPromOver : ∀ (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks), RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) → @@ -1025,11 +1026,11 @@ theorem stageP2Over_qpan_cli_placed_of_pathC [LibsignalPlacement] {M : AllocCost hfs hCode1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 herr hok have hh' : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, hh.utf8, hh.memrchr, - hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, hh.blackBox⟩ have hr_scope : scopeIn r := hsub r (CryptoVerification.SignalSession.Cli.RunProofs.Poll.scope_of_loadRec_some hfPeer hload) exact hPathC X mmpl gh W B S Scope y st_b g1 r s_old s0 s1 sp rngPtr v_a8 v_b8 v_d0 Q Qpan - (hPromMiss mmpl gh W) (hPromOver mmpl gh W hh') hh' hfits hcoins hdecOk.toDecPkOk₀_emptyScope + (hPromMiss mmpl gh W hh') (hPromOver mmpl gh W hh') hh' hfits hcoins hdecOk.toDecPkOk₀_emptyScope hsub hfPeer hcur hr_scope hnot htrust hg1 hfs hCode1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 (fun sf Pf hpcf hrunf hstepsf hspf hcsf hvregsf hinvf @@ -1139,7 +1140,7 @@ theorem stageP2Over_qpan_cli_placed_of_seams [LibsignalPlacement] {M : AllocCost stageP2Over_qpan_cli_placed_of_pathC (stageP2PathCOver_qpan_cli_placed_of_seams A lim hErrEnv hOkEnv hFitsSplit hDropNz hSpqr h_accept_ok h_accept_err h_accept_err_owned hSelfKit hSpkKit hKpkKit hPkKit) - (cliPromoteMatchingMissGen_placed_ok A.repAlloc) + (fun mmpl gh W hh => cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W hh.blackBox) (fun mmpl gh W hh => cliPromoteOverGen_placed_ok mmpl gh W hh (hGrow mmpl gh W) (hRaw mmpl gh W)) /-! ## 5. Tight `ArchiveCoreEnv` Envelopes & `[LibsignalFullPlacement]` `withLsFrozen` Variants -/ @@ -1244,9 +1245,6 @@ theorem cliPromoteOverGen_archive_placed_ok [LibsignalPlacement] {M : AllocCostM hh.codecHooks.dealloc hh.codecHooks.realloc ((show withVmPreserved noAllocShimSpec = sessionShimBudgetSpec from rfl) ▸ hh.codecHooks.shim) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_sessionMemmove_budget_sat - mmpl W CryptoVerification.LibsignalTripleRatchet.extHookStack)) (hookSat_sessionMemcpyBudget_of_codec CryptoVerification.LibsignalTripleRatchet.extHookStack hh.codecHooks.memcpy)) hGrow hRaw @@ -1552,7 +1550,7 @@ theorem stageP2Over_qpan_cli_memInv_placed_of_pathC {Φ : Memory → Prop} [Libs hfs hCode1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 herr hok have hh' : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, hh.utf8, hh.memrchr, - hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, hh.blackBox⟩ have hr_scope : scopeIn r := hsub r (CryptoVerification.SignalSession.Cli.RunProofs.Poll.scope_of_loadRec_some hfPeer hload) exact hPathC X mmpl gh W B S Scope y st_b g1 r s_old s0 s1 sp rngPtr v_a8 v_b8 v_d0 Q Qpan @@ -1852,7 +1850,9 @@ theorem stageP2Over_qpan_cli_full_placed_of_seams [LibsignalFullPlacement] {M : stageP2Over_qpan_cli_full_placed_of_pathC (stageP2PathCOver_qpan_cli_full_placed_of_seams A lim hErrEnv hOkEnv hFitsSplit hDropNz hG hSpqr hSelfKit hSpkKit hKpkKit hPkKit) - (cliPromoteMatchingMissGen_placed_ok A.repAlloc) + (fun mmpl gh W => + cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + (cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) (hG gh).extraOk)) (fun mmpl gh W hh => cliPromoteOverGen_placed_ok mmpl gh W hh (hGrow mmpl gh W) (hRaw mmpl gh W)) /-- Direct seam-to-`StageP2OverQpanCliFrozenPlacedStmt` corollary at tight @@ -1934,7 +1934,9 @@ theorem stageP2Over_qpan_cli_archive_full_placed_of_seams [LibsignalFullPlacemen stageP2Over_qpan_cli_full_placed_of_pathC (stageP2PathCOver_qpan_cli_archive_full_placed_of_seams A lim hErrEnv hOkEnv hFitsSplit hDropNz hG hSpqr hSelfKit hSpkKit hKpkKit hPkKit) - (cliPromoteMatchingMissGen_placed_ok A.repAlloc) + (fun mmpl gh W => + cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + (cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) (hG gh).extraOk)) (fun mmpl gh W hh => cliPromoteOverGen_archive_placed_ok mmpl gh W hh (hGrow mmpl gh W) (hRaw mmpl gh W)) @@ -2123,7 +2125,7 @@ theorem stageP2Over_qpan_cli_memInv_placed_at_of_pathC {Φ : Memory → Prop} [L hfs hCode1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 herr hok have hh' : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, hh.utf8, hh.memrchr, - hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, hh.blackBox⟩ have hr_scope : scopeIn r := hsub r (CryptoVerification.SignalSession.Cli.RunProofs.Poll.scope_of_loadRec_some hfPeer hload) exact hPathC B S Scope y st_b g1 r s_old s0 s1 sp rngPtr v_a8 v_b8 v_d0 Q Qpan @@ -2420,7 +2422,8 @@ theorem stageP2Over_qpan_cli_full_placed_at_of_seams [LibsignalFullPlacement] {M stageP2PathCOver_qpan_cli_full_placed_at_of_seams A lim X mmpl gh W B (hErrEnv X B) (hOkEnv X B) (hFitsSplit X B) hDropNz hG hSpqr (hSelfKit B) (hSpkKit B) (hKpkKit B) (hPkKit B)) - (cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W) + (cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + (cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hG.extraOk)) (fun hh => cliPromoteOverGen_placed_ok mmpl gh W hh hGrow hRaw) /-- Pointwise per-`(mmpl, gh, W)` seam-to-`StageP2OverQpanCliFrozenPlacedAtStmt` corollary at tight @@ -2500,7 +2503,8 @@ theorem stageP2Over_qpan_cli_archive_full_placed_at_of_seams [LibsignalFullPlace stageP2PathCOver_qpan_cli_archive_full_placed_at_of_seams A lim X mmpl gh W B (hErrEnv X B) (hOkEnv X B) (hFitsSplit X B) hDropNz hG hSpqr (hSelfKit B) (hSpkKit B) (hKpkKit B) (hPkKit B)) - (cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W) + (cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + (cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hG.extraOk)) (fun hh => cliPromoteOverGen_archive_placed_ok mmpl gh W hh hGrow hRaw) end LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage2OverInstPlacedBudgetAux.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage2OverInstPlacedBudgetAux.lean index 304371c81..3ca6973c2 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage2OverInstPlacedBudgetAux.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage2OverInstPlacedBudgetAux.lean @@ -37,6 +37,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlace public import LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.E2E.Record.Serialization.Canon @@ -47,6 +48,8 @@ import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.UuidFsPlaced import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosurePathBMain import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureSpeOwned import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudget +import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudgetSat +import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetBbSat import LibsignalBinary.Proofs.TripleRatchet.InImage.UuidTryParse.ParserTryParse import ProofLib.Placed.OpcodeExclusion import ProofLib.SepLogic.WP.Apply @@ -166,7 +169,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( stageP2PostP1At stageP3CoroFrameAt stageP3StackFrameAt x29_eq_sp0_sub_60 x29_eq_sp_add_c70 ) open CryptoVerification.SignalSession.Cli.Slots ( - FilesOkPeer blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced scopeIn scopeKit + FilesOkPeer scopeIn scopeKit ) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (noAllocShimBudgetSpec) open LibsignalBinary.Heap ( @@ -387,10 +390,8 @@ theorem cliStageP2PureCalleesPlaced4K [LibsignalPlacement] {M : AllocCostModel} hh.codecHooks.dealloc (hookSat_sessionMemcpyRegionBudget_of_codec hh.codecHooks.memcpy) (hookSat_sessionMemcpyBudget_of_codec allocHookStack hh.codecHooks.memcpy) - (isSameAccount_4k_placed_ok_on_stageP1 - ((cliGhostExterns_other gh _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W))) + (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat.isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) h_accept_ok h_accept_err @@ -1664,10 +1665,8 @@ theorem stageP2PathCOver_qpan_cli_full_placed_at_of_seams_aux [LibsignalFullPlac hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_sessionMemcpyBudget_of_codec allocHookStack hh.codecHooks.memcpy) - (isSameAccount_4k_placed_ok_on_stageP1 - ((cliGhostExterns_other gh _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W))) + (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat.isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) have hMemcpyVm := hh.codecHooks.memcpy have hMemcpyFrame : @@ -1687,16 +1686,19 @@ theorem stageP2PathCOver_qpan_cli_full_placed_at_of_seams_aux [LibsignalFullPlac exact ⟨⟨hpost.2.1.1, hpost.2.1.2, hpost.1⟩, hpost.2.2⟩ · exact ⟨hkf, hsym, Or.inr hrest⟩ have hRespContracts := - LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudget.cliResponderPqxdhHookContractsPlaced_of_hookSat - X mmpl gh W hG hh.codecHooks.alloc hh.codecHooks.dealloc hShim + LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetBbSat.cliResponderPqxdhHookContractsPlaced_of_hookSat_bb_sat + X mmpl gh W hG + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_sessionMemsetRegion_budget_sat + mmpl gh W hG) + hh.blackBox hh.codecHooks.alloc hh.codecHooks.dealloc hShim have hAcceptOk := - LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudget.pqxdhAccept_opt_fields_responder_full_placed_ok_of_block + LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudgetSat.pqxdhAccept_opt_fields_responder_full_placed_ok_of_block_bb_sat (callerProg := lsProg_75 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 75) (cliModelPrims_structural X W) (CryptoVerification.SignalSession.Cli.RunProofs.Poll.cliModelPrims_matchCrypto X W) hRespContracts hMemcpyFrame have hAcceptErrOwned := - LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudget.pqxdhAccept_err_owned_responder_full_placed_ok_of_block + LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudgetSat.pqxdhAccept_err_owned_responder_full_placed_ok_of_block_bb_sat (callerProg := lsProg_75 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 75) (cliModelPrims_structural X W) (CryptoVerification.SignalSession.Cli.RunProofs.Poll.cliModelPrims_matchCrypto X W) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage4OverInstPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage4OverInstPlaced.lean index b89566b2e..989a496c6 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage4OverInstPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage4OverInstPlaced.lean @@ -275,11 +275,11 @@ theorem stageP4Prev1_placed_inst [LibsignalPlacement] (hDropNz : lsmpl.base 547 cliPollSess_prev1VtablesPlacedOk F0 peer σ hDropNz have hIkit : IdentityStoreKitPlacedOkI ikit (cliGhostExterns gh (cliExternsPlaced mmpl W)) := cliIdKitPlacedOkI_full - (IdKit.cliIdKitOkIE_placed + (IdKit.cliIdKitOkIE_placed_sat (readProg := dpPollProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) (jRead := 518) hDropNz (fun _ hp => hp.2) hh (StoreKit.subroutine_ok_withLsCodeRoLoaded_of_plain hread) - (cliGhostExterns_blackBox mmpl gh W) + hh.blackBox (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (by decide) (by decide)) have hIvt : IdentityVtablesPlacedOk ikit := cliPollId_vtablesPlacedOk F0 peer σ hDropNz diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage4OverInstPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage4OverInstPlacedBudget.lean index 8b8a95497..9d2ad03fc 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage4OverInstPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/Stage4OverInstPlacedBudget.lean @@ -138,7 +138,7 @@ private theorem toSkeletonRunHooks [LibsignalPlacement] {M : AllocCostModel} { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } /-- Caller-block-polymorphic `withLsCodeRoLoaded` form of `serializePrev1BodySpecX` at `cliGhostExterns gh (cliExternsPlaced mmpl W)` discharged from `RunHooksPlaced`. -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/StagesOverInstPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/StagesOverInstPlaced.lean index 41326af23..c8c85e0e9 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/StagesOverInstPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Over/StagesOverInstPlaced.lean @@ -1009,7 +1009,7 @@ theorem stageP2Over_qpan_cli_placed_of_pathC [LibsignalPlacement] hfs hro1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 hpan herr hok have hr_scope : Slots.scopeIn r := hsub r (scope_of_loadRec_some hfPeer hload) exact hP2 X B S Scope y g1 r s_old s0 s1 sp rngPtr v_a8 v_b8 v_d0 Q Qpan - (cliPromoteMatchingMissGen_placed_ok mmpl gh W) + (cliPromoteMatchingMissGen_placed_ok mmpl gh W hh.blackBox) (cliPromoteOverGen_placed_ok mmpl gh W hh) hh hread hcoins hdecOk.toDecPkOk₀_emptyScope hsub hfPeer hcur hr_scope hnot htrust hg1 @@ -1577,7 +1577,7 @@ theorem stageP2Over_qpan_cli_frozen_placed_of_pathC [LibsignalPlacement] hfs hfr1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 hpan herr hok have hr_scope : Slots.scopeIn r := hsub r (scope_of_loadRec_some hfPeer hload) exact hP2 X B S Scope y g1 r s_old s0 s1 sp rngPtr v_a8 v_b8 v_d0 Q Qpan - (cliPromoteMatchingMissGen_placed_ok mmpl gh W) + (cliPromoteMatchingMissGen_placed_ok mmpl gh W hh.blackBox) (cliPromoteOverGen_placed_ok mmpl gh W hh) hh hread hcoins hdecOk.toDecPkOk₀_emptyScope hsub hfPeer hcur hr_scope hnot htrust hg1 diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosurePlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosurePlaced.lean index 994f80ce9..b4bed61fa 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosurePlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosurePlaced.lean @@ -61,33 +61,14 @@ open CryptoVerification.SignalSession.Cli.RunProofs open CryptoVerification.SignalSession.Cli.KitInst open CryptoVerification.SignalSession.Coins.Placed open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer ( - CliGhostHooks cliGhostExterns cliGhostExterns_other + CliGhostHooks cliGhostExterns ) -set_option linter.unusedSimpArgs false in private theorem withPanics_cliGhostExterns_eq (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : Rust.withPanics (cliGhostExterns gh (cliExternsPlaced mmpl W)) = - cliGhostExterns gh (cliExternsPlaced mmpl W) := by - funext n - by_cases hp : Rust.isPanicSymbol n = true - · have hother : cliGhostExterns gh (cliExternsPlaced mmpl W) n = cliExternsPlaced mmpl W n := - cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsReadFileSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsReadStdinSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemsetSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemcpySym] at hp) - unfold Rust.withPanics - rw [hother] - unfold cliExternsPlaced isCliPanicSymbolPlaced - simp [hp] - · simp [Rust.withPanics, hp] + cliGhostExterns gh (cliExternsPlaced mmpl W) := + CryptoVerification.SignalSession.Cli.RunGlue.withPanics_cliGhostExterns mmpl gh W attribute [-arm64_norm] CryptoVerification.SpqrV1.Kdf.HkdfToSliceProof.sp_sub_688_eq_hsp diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosureStagesStmtPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosureStagesStmtPlacedBudget.lean index 1724962c4..070348c6a 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosureStagesStmtPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosureStagesStmtPlacedBudget.lean @@ -14,6 +14,7 @@ public import LibsignalBinary.Heap.IfaceBudgetLemmas public import LibsignalBinary.Heap.RustStdAllocBudgetBridge public import LibsignalBinary.Proofs.PublicApi.StoreKit.PlacedBudget public import LibsignalBinary.Proofs.RecordCodecs.DepsBudget +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStageDefsPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStageP2DefsPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlaced @@ -99,6 +100,7 @@ open LibsignalBinary.Proofs.PublicApi.StoreKit.SessionStoreKitBudget open LibsignalBinary.Proofs.PublicApi.StoreKit.IdentityStoreKitBudget (IdentityStoreBudgetEnv SaveStepEnv retagIdentityStore) open LibsignalBinary.Proofs.RecordCodecs.DepsBudget (CodecHooksPlaced) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.DecryptPrekeySlotPlacedBudget (DpPollGhostStateBudget dpSlotPollKStatePlaced) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget @@ -132,14 +134,16 @@ structure RunHooksPlaced [LibsignalPlacement] {M : AllocCostModel} allocFs : AllocContractsFsPlaced A lim ext panics : CliPanicHooksPlaced ext memcpyRO : HookSat ext LibsignalTripleRatchet.lsMemcpySym (withVmPreserved sessionMemcpyRegionROSpec) - bcmp : HookSat ext "bcmp" (withVmPreserved cliBcmpSpec) + bcmp : HookSat ext "bcmp" (withVmPreserved cliBcmpSpec).keepsFs fs : ∀ (prog : Program) (i : Nat), [IsLsBlockProg prog i ext] → TraceFsSound prog utf8 : ∀ stk : Nat, HookSat ext lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec stk)) - memrchr : ∀ stk : Nat, HookSat ext lsMemrchrSym (withVmPreserved (memrchrSpec stk)) + memrchr : HookSat ext lsMemrchrSym (withLsRet (withVmPreserved (memrchrSpec extHookStack))) codecHooks : CodecHooksPlaced M A lim ext allocZeroed : HookSat ext lsRustAllocZeroedSymCli (rustCliAllocBudgetSpec M A lim true) stringClone : HookSat ext SignalSession.lsStringCloneSym (stringCloneBudgetSpec M A lim) formatInner : HookSat ext lsFormatInnerSym (formatInnerBudgetSpec M A lim) + blackBox : HookSat ext SignalSession.lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat /-! ## 1. Path B Stage P4 (`M4`) Envelopes, Spatial Entry/Exit & Three-Way Outcome (`StageP4MatchedBranchPlaced`) -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosureTrustedP1PlacedBudgetAux.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosureTrustedP1PlacedBudgetAux.lean index 66e17429f..aebaf0034 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosureTrustedP1PlacedBudgetAux.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosureTrustedP1PlacedBudgetAux.lean @@ -136,7 +136,7 @@ open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedBu StageP2MatchedEnv ) open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer ( - CliGhostHooks cliGhostExterns cliGhostExterns_other + CliGhostHooks cliGhostExterns ) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureEntryPlacedBudget ( dpPollEntrySpatialPlaced dpPollPre_unpack_placed @@ -649,26 +649,8 @@ theorem closure_trusted_branch_placed_ok_at [LibsignalPlacement] private theorem withPanics_cliGhostExterns_eq (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : Rust.withPanics (cliGhostExterns gh (cliExternsPlaced mmpl W)) = - cliGhostExterns gh (cliExternsPlaced mmpl W) := by - funext s - by_cases hp : Rust.isPanicSymbol s = true - · have hother : cliGhostExterns gh (cliExternsPlaced mmpl W) s = cliExternsPlaced mmpl W s := - cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocSymCli, CryptoVerification.SignalSession.lsRustDeallocSymCli, CryptoVerification.SignalSession.lsRustReallocSymCli, CryptoVerification.SignalSession.lsRustAllocZeroedSymCli, CryptoVerification.SignalSession.lsRustNoAllocShimSymCli, CryptoVerification.SignalSession.lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocSymCli, CryptoVerification.SignalSession.lsRustDeallocSymCli, CryptoVerification.SignalSession.lsRustReallocSymCli, CryptoVerification.SignalSession.lsRustAllocZeroedSymCli, CryptoVerification.SignalSession.lsRustNoAllocShimSymCli, CryptoVerification.SignalSession.lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocSymCli, CryptoVerification.SignalSession.lsRustDeallocSymCli, CryptoVerification.SignalSession.lsRustReallocSymCli, CryptoVerification.SignalSession.lsRustAllocZeroedSymCli, CryptoVerification.SignalSession.lsRustNoAllocShimSymCli, CryptoVerification.SignalSession.lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocSymCli, CryptoVerification.SignalSession.lsRustDeallocSymCli, CryptoVerification.SignalSession.lsRustReallocSymCli, CryptoVerification.SignalSession.lsRustAllocZeroedSymCli, CryptoVerification.SignalSession.lsRustNoAllocShimSymCli, CryptoVerification.SignalSession.lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocSymCli, CryptoVerification.SignalSession.lsRustDeallocSymCli, CryptoVerification.SignalSession.lsRustReallocSymCli, CryptoVerification.SignalSession.lsRustAllocZeroedSymCli, CryptoVerification.SignalSession.lsRustNoAllocShimSymCli, CryptoVerification.SignalSession.lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocSymCli, CryptoVerification.SignalSession.lsRustDeallocSymCli, CryptoVerification.SignalSession.lsRustReallocSymCli, CryptoVerification.SignalSession.lsRustAllocZeroedSymCli, CryptoVerification.SignalSession.lsRustNoAllocShimSymCli, CryptoVerification.SignalSession.lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsReadFileSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsReadStdinSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemsetSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemcpySym] at hp) - unfold Rust.withPanics - rw [hother] - unfold cliExternsPlaced isCliPanicSymbolPlaced - simp [hp] - · simp [Rust.withPanics, hp] + cliGhostExterns gh (cliExternsPlaced mmpl W) := + CryptoVerification.SignalSession.Cli.RunGlue.withPanics_cliGhostExterns mmpl gh W /-- Full budget-threaded `[LibsignalPlacement]` `decrypt_prekey` poll closure (`dpPollEntryPlaced`) at fixed `(mmpl, gh, W, X, B, S, Scope)` accepting pointwise `StageP2PathAQpanCliPlacedAtStmt`. -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosureUntrustedPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosureUntrustedPlacedBudget.lean index 9cbfd74de..d8ac04119 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosureUntrustedPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/ClosureUntrustedPlacedBudget.lean @@ -127,9 +127,9 @@ open LibsignalBinary.Proofs.PublicApi.StoreKit.SessionStoreKitBudget (SessionSto open LibsignalBinary.Proofs.SessionRecordAt.Hooks2.SerDefsXBudget (SerContractsXPlaced serializeCanonSpecX) open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer - (CliGhostHooks cliGhostExterns cliGhostExterns_other) + (CliGhostHooks cliGhostExterns) open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.IdentityKitOkPlacedBudget - (cliIdKitOkIE_placed cliIdentityKitDefaultBudgetEnv) + (cliIdKitOkIE_placed_sat cliIdentityKitDefaultBudgetEnv) open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.SessionKitOkCliPlacedBudget (cliSessKitOkSE_placed cliSessionKitDefaultBudgetEnv) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.PollOverP4SpatialPlacedBudget @@ -137,8 +137,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Poll open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStageDefsPlacedBudget (StageP1UntrustedEnv) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (cliExternsPlaced_sessionMemcpy_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat - cliExternsPlaced_sessionMemmove_budget_sat) + (cliExternsPlaced_sessionMemcpy_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.DecryptPrekeySlotPlacedBudget (DpPollGhostStateBudget dpPollSpecStateBudget dpSlotPollKStatePlaced) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget @@ -172,6 +171,7 @@ theorem runHooks_to_stages [LibsignalPlacement] {M : AllocCostModel} allocZeroed := hh.allocZeroed stringClone := hh.stringClone formatInner := hh.formatInner + blackBox := hh.blackBox /-- Convert `ClosureStagesStmtPlacedBudget.RunHooksPlaced` to `SkeletonPlacedBudget.RunHooksPlaced` (`PollStmtPlacedBudget.RunHooksPlaced`). -/ @@ -192,6 +192,7 @@ theorem runHooks_of_stages [LibsignalPlacement] {M : AllocCostModel} allocZeroed := hh.allocZeroed stringClone := hh.stringClone formatInner := hh.formatInner + blackBox := hh.blackBox /-! ## 2. Budget-Threaded Trace, `FsAt`, & Exit Postcondition Packagers -/ @@ -398,12 +399,6 @@ abbrev cliPollIdBudgetEnv [LibsignalPlacement] (A : RustAlloc) (cliKitStk B).idSaveShim (cliKitStk B).idSavePoll cliIdentityVtSym ReadEnv) -private theorem cliGhostExterns_blackBox_local (mmpl : Obj.MultiPlacement) - (g : CliGhostHooks) (W : CliHooks) : - cliGhostExterns g (cliExternsPlaced mmpl W) lsBlackBoxU8Sym = - some CryptoVerification.LibsignalSession.blackBoxHook := - CryptoVerification.SignalSession.Cli.KitInst.IdKit.cliGhostExterns_blackBox mmpl g W - private theorem hookSat_sessionMemcpyRegionBudget_of_codec {H : LibsignalHooks} (h : HookSat H CryptoVerification.lsMemcpySym (withVmPreserved framelessMemcpySpec)) : HookSat H CryptoVerification.lsMemcpySym sessionMemcpyRegionBudgetSpec := @@ -434,9 +429,6 @@ theorem serContractsX_of_runHooks [LibsignalPlacement] (mmpl : Obj.MultiPlacemen hh.codecHooks.dealloc hh.codecHooks.realloc ((show withVmPreserved noAllocShimSpec = sessionShimBudgetSpec from rfl) ▸ hh.codecHooks.shim) - (let ⟨f, hf, hok⟩ := cliExternsPlaced_sessionMemmove_budget_sat mmpl W extHookStack - ⟨f, (cliGhostExterns_other g (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans hf, hok⟩) (hookSat_sessionMemcpyBudget_of_codec extHookStack hh.codecHooks.memcpy) /-- Full `SessionOnlyKitPlacedOkSE` instance for `cliPollSessKitPlaced` extracted directly from @@ -488,13 +480,13 @@ theorem cliPollId_kitPlacedOkI [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (cliPollIdBudgetEnv A.repAlloc F0 peer B ReadEnv) (cliGhostExterns g (cliExternsPlaced mmpl W)) := cliIdKitPlacedOkI_full - (cliIdKitOkIE_placed + (cliIdKitOkIE_placed_sat (readProg := dpPollProgPlaced (cliGhostExterns g (cliExternsPlaced mmpl W))) (jRead := 518) hDropNz (fun _ hp => hp.2) hh (subroutine_ok_withLsCodeRoLoaded_of_plain hRead) - (cliGhostExterns_blackBox_local mmpl g W) + hh.blackBox (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (by decide) (by decide)) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/MatchedInstPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/MatchedInstPlaced.lean index 793808af0..b0222d8e4 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/MatchedInstPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/MatchedInstPlaced.lean @@ -21,6 +21,7 @@ import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Proofs.TripleRatchet.Alloc.PublicKeySerialize import LibsignalBinary.Proofs.SpqrV1.Kdf.HkdfToSliceExtract import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.GenP3.DropSs3Ext +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedSat /-! # Relocatable `[LibsignalPlacement]` Poll Path B Stage P2 Instantiation @@ -63,7 +64,9 @@ open CryptoVerification.SignalSession.Cli.RunCompose hiding Bytes open CryptoVerification.SignalSession.Cli.RunProofs open CryptoVerification.SignalSession.Cli.KitInst open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer - (CliGhostHooks cliGhostExterns cliGhostExterns_other) + (CliGhostHooks cliGhostExterns) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedSat + (stageP2_matched_ok_framed_placed_sat) attribute [-arm64_norm] CryptoVerification.SpqrV1.Kdf.HkdfToSliceProof.sp_sub_688_eq_hsp @@ -76,27 +79,8 @@ set_option linter.unusedSimpArgs false private theorem withPanics_cliGhostExterns_eq (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : Rust.withPanics (cliGhostExterns gh (cliExternsPlaced mmpl W)) = - cliGhostExterns gh (cliExternsPlaced mmpl W) := by - funext name - by_cases hp : Rust.isPanicSymbol name = true - · have hother : - cliGhostExterns gh (cliExternsPlaced mmpl W) name = cliExternsPlaced mmpl W name := - cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsReadFileSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsReadStdinSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemsetSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemcpySym] at hp) - unfold Rust.withPanics - rw [hother] - unfold cliExternsPlaced isCliPanicSymbolPlaced - simp [hp] - · simp [Rust.withPanics, hp] + cliGhostExterns gh (cliExternsPlaced mmpl W) := + CryptoVerification.SignalSession.Cli.RunGlue.withPanics_cliGhostExterns mmpl gh W private theorem dpPollProgPlaced_eq_withPanics [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : @@ -113,16 +97,6 @@ private theorem hookSat_withPanics_placed (mmpl : Obj.MultiPlacement) rw [withPanics_cliGhostExterns_eq mmpl gh W] exact hsat -private theorem cliExternsPlaced_blackBox_withPanics (mmpl : Obj.MultiPlacement) - (gh : CliGhostHooks) (W : CliHooks) : - Rust.withPanics (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsBlackBoxU8Sym = - some CryptoVerification.LibsignalSession.blackBoxHook := by - rw [withPanics_cliGhostExterns_eq mmpl gh W] - exact (cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_row mmpl W - (List.mem_append_right _ (List.mem_of_getElem? (i := 11) rfl))) - private theorem cliExternsPlaced_panic_alloc_withPanics [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) (hh : RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) : @@ -222,11 +196,11 @@ theorem stageP2Matched_framed_cli_placed_ok [LibsignalPlacement] : ac_rfl rw [hpre_assoc] refine sepWPp_entails_post ?_ - exact stageP2_matched_ok_framed_placed + exact stageP2_matched_ok_framed_placed_sat (cliPublicKeySerialize_placed_ok mmpl gh W hh) (cliStrToOwnedLocal2_placed_ok mmpl gh W hh) (cliDealloc_placed_ok mmpl gh W hh) - (cliExternsPlaced_blackBox_withPanics mmpl gh W) + (hookSat_withPanics_placed mmpl gh W hh.blackBox) (cliDropSessionStructureLocal2_placed_ok mmpl gh W hh) s0 s1 sp y.fut y.out y.g.msgA y.g.peerA y.g.meA diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/MatchedInstPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/MatchedInstPlacedBudget.lean index b7e160fd4..ebc9048cf 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/MatchedInstPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/MatchedInstPlacedBudget.lean @@ -10,6 +10,7 @@ limitations under the License. module public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedBudget +public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedBudgetSat public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureCalleesPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosurePathBMainPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.MatchedMatchFoldPlacedBudget @@ -48,20 +49,17 @@ open CryptoVerification.CliHandshake.Placed (lsProg_530) open scoped CryptoVerification.CliHandshake.Placed open CryptoVerification.CliHandshake.RespClosurePlaced (lsProg_518) open scoped CryptoVerification.CliHandshake.RespClosurePlaced -open CryptoVerification.LibsignalSession (blackBoxHook) open CryptoVerification.LibsignalTripleRatchet (noAllocShimSpec) open CryptoVerification.LibsignalTripleRatchet.FromRecordCallees (lsLogOff) open CryptoVerification.SignalSession (CliHooks cliExternsPlaced) open CryptoVerification.SignalSession.Cli (CliGhostHooks cliGhostExterns cliIdentityVtSym cliKyberPreKeyVtSym cliPreKeyVtSym cliSignedPreKeyVtSym) -open CryptoVerification.SignalSession.Cli.RunGlue - (cliExternsPlaced_row cliGhostExterns_other withPanics_cliGhostExterns) +open CryptoVerification.SignalSession.Cli.RunGlue (withPanics_cliGhostExterns) open CryptoVerification.SignalSession.Cli.RunProofs.Poll (dpPollProgPlaced preKeyMsgAt_eq_base_idKey_sep preKeyMsgRemBaseIdKeyAt sepWPp_conseq_pre sepWPp_entails_post sepWPp_lift_entails_post x29_eq_sp0_sub_60 x29_eq_sp_add_c70) -open CryptoVerification.SignalSession.Cli.Slots (blackBox_row_placed) open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget rustCliDeallocBudgetSpec) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) @@ -71,8 +69,8 @@ open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2StepsBBudge (strToOwnedLocal2Spec) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TailPlacedBudget (str_to_owned_local2_placed_ok_at) -open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedBudget - (stageP2_matched_ok_framed_placed) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Matched.M2TopPlacedBudgetSat + (stageP2_matched_ok_framed_placed_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosurePathBMainPlacedBudget (StageP2MatchedFramedCliPlacedStmt) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget @@ -126,15 +124,6 @@ private theorem hookSat_noAllocShimBudget_of_withVmPreserved {H : String → Opt exact ⟨⟨hpost.2.1, hpost.1⟩, hpost.2.2⟩ · exact Or.inr hrest -private theorem cliExternsPlaced_blackBox_withPanics (mmpl : Obj.MultiPlacement) - (gh : CliGhostHooks) (W : CliHooks) : - Rust.withPanics (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsBlackBoxU8Sym = - some blackBoxHook := by - rw [withPanics_cliGhostExterns mmpl gh W, - cliGhostExterns_other gh _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)] - exact cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W) - private theorem cliPublicKeySerialize_placed_ok [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) @@ -236,11 +225,11 @@ theorem stageP2Matched_framed_cli_placed_ok [LibsignalPlacement] : sep_ac_rfl rw [hpre_assoc] refine sepWPp_entails_post ?_ - exact stageP2_matched_ok_framed_placed + exact stageP2_matched_ok_framed_placed_sat (cliPublicKeySerialize_placed_ok mmpl gh W hh) (cliStrToOwnedLocal2_placed_ok mmpl gh W hh) (cliDealloc_placed_ok mmpl gh W hh) - (cliExternsPlaced_blackBox_withPanics mmpl gh W) + (hookSat_withPanics_placed mmpl gh W hh.blackBox) (cliDropSessionStructureLocal2_placed_ok mmpl gh W hh) st_b s0 s1 sp y.fut y.out y.g.msgA y.g.peerA y.g.meA diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/ResponderCanonicalPlacedBudgetSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/ResponderCanonicalPlacedBudgetSat.lean index a1e444cde..d180c5d09 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/ResponderCanonicalPlacedBudgetSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/ResponderCanonicalPlacedBudgetSat.lean @@ -10,6 +10,7 @@ limitations under the License. module public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetBbSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget -- proof-setup: allow-public-import import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.AcceptErrOwnedPlacedBudget @@ -164,4 +165,99 @@ public theorem cliPqxdhAccept_err_owned_full_placed_ok_sat [LibsignalFullPlaceme (hookSat_framelessMemcpy_of_vm_local (cliExternsPlaced_framelessMemcpy_budget_sat mmpl gh W hG)) +/-- Closed `[LibsignalFullPlacement]` budget-threaded contract for `Pqxdh::accept` (Block `79`) +from `ResponderPqxdhPlacedHookContractsBbSat` and `HookSat H lsMemcpySym framelessMemcpySpec`. -/ +public theorem pqxdhAccept_opt_fields_responder_full_placed_ok_of_block_bb_sat + [LibsignalFullPlacement] + {callerProg : Program} {i : Nat} {M : AllocCostModel} + {P : Primitives} {C : Crypto} {A : RustCliAllocBudget M} {lim : BudgetLimits} + {H : LibsignalHooks} [IsLsBlockProg callerProg i H] + (hWF : StructuralPrims P) + (hP : PrimitivesMatchCrypto P C) + (hH : + LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetBbSat.ResponderPqxdhPlacedHookContractsBbSat + M P C A lim H) + (h_memcpy : HookSat H lsMemcpySym framelessMemcpySpec) : + subroutine_ok callerProg (lsmpl.base 79) + (pqxdhAcceptOptFieldsFrozenPlacedSpec P A lim (AcceptOptFieldsEnv P)) := + pqxdhAccept_opt_fields_placed_ok_of_block hWF + (ecPubKeyIsCanonical_responder_placed_ok_cl hWF hH.dalekMontToEd hH.dalekTorsionFree) + (hH.calculateAgreement_ok hP) + (vecAppendElements_fast_placed_ok_cl h_memcpy) + (hH.hkdfExtract_ok hP) + (hH.hkdfExpandMultiInfo_ok hP) + hH.noAllocShim hH.alloc hH.dealloc h_memcpy hH.kyberDecaps + +/-- Closed `[LibsignalFullPlacement]` budget-threaded owned-error rejecting contract for +`Pqxdh::accept` (Block `79`) from `ResponderPqxdhPlacedHookContractsBbSat`. -/ +public theorem pqxdhAccept_err_owned_responder_full_placed_ok_of_block_bb_sat + [LibsignalFullPlacement] + {callerProg : Program} {i : Nat} {M : AllocCostModel} + {P : Primitives} {C : Crypto} {A : RustCliAllocBudget M} {lim : BudgetLimits} + {H : LibsignalHooks} [IsLsBlockProg callerProg i H] + (hWF : StructuralPrims P) + (hP : PrimitivesMatchCrypto P C) + (hH : + LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetBbSat.ResponderPqxdhPlacedHookContractsBbSat + M P C A lim H) + (h_memcpy : HookSat H lsMemcpySym framelessMemcpySpec) : + subroutine_ok callerProg (lsmpl.base 79) + (pqxdhAcceptErrOwnedFrozenPlacedSpec P A lim (AcceptOptFieldsEnv P)) := + pqxdhAccept_err_owned_placed_ok_of_block hWF + (ecPubKeyIsCanonical_responder_placed_ok_cl hWF hH.dalekMontToEd hH.dalekTorsionFree) + (hH.calculateAgreement_ok hP) + hH.noAllocShim hH.alloc hH.dealloc h_memcpy + +/-- Closed `[LibsignalFullPlacement]` `pqxdhAcceptOptFieldsFrozenPlacedSpec` at +`cliGhostExterns gh (cliExternsPlaced mmpl W)` from `CliGhostAllocHooks M A lim gh`, `hMs`, and `hBb`. -/ +public theorem cliPqxdhAccept_opt_fields_full_placed_ok_bb_sat [LibsignalFullPlacement] + {callerProg : Program} {i : Nat} {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} + (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + [IsLsBlockProg callerProg i (cliGhostExterns gh (cliExternsPlaced mmpl W))] + (hG : CliGhostAllocHooks M A lim gh) + (hMs : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsMemsetSym + sessionMemsetRegionBudgetSpec) + (hBb : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) + CryptoVerification.lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : + subroutine_ok callerProg (lsmpl.base 79) + (pqxdhAcceptOptFieldsFrozenPlacedSpec + (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) + A lim + (AcceptOptFieldsEnv (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)))) := + pqxdhAccept_opt_fields_responder_full_placed_ok_of_block_bb_sat + (cliModelPrims_structural X W) + (cliModelPrims_matchCrypto X W) + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetBbSat.cliResponderPqxdhHookContractsPlaced_bb_sat + X mmpl gh W hG hMs hBb) + (hookSat_framelessMemcpy_of_vm_local + (cliExternsPlaced_framelessMemcpy_budget_sat mmpl gh W hG)) + +/-- Closed `[LibsignalFullPlacement]` `pqxdhAcceptErrOwnedFrozenPlacedSpec` at +`cliGhostExterns gh (cliExternsPlaced mmpl W)` from `CliGhostAllocHooks M A lim gh`, `hMs`, and `hBb`. -/ +public theorem cliPqxdhAccept_err_owned_full_placed_ok_bb_sat [LibsignalFullPlacement] + {callerProg : Program} {i : Nat} {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} + (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + [IsLsBlockProg callerProg i (cliGhostExterns gh (cliExternsPlaced mmpl W))] + (hG : CliGhostAllocHooks M A lim gh) + (hMs : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsMemsetSym + sessionMemsetRegionBudgetSpec) + (hBb : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) + CryptoVerification.lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : + subroutine_ok callerProg (lsmpl.base 79) + (pqxdhAcceptErrOwnedFrozenPlacedSpec + (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) + A lim + (AcceptOptFieldsEnv (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)))) := + pqxdhAccept_err_owned_responder_full_placed_ok_of_block_bb_sat + (cliModelPrims_structural X W) + (cliModelPrims_matchCrypto X W) + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetBbSat.cliResponderPqxdhHookContractsPlaced_bb_sat + X mmpl gh W hG hMs hBb) + (hookSat_framelessMemcpy_of_vm_local + (cliExternsPlaced_framelessMemcpy_budget_sat mmpl gh W hG)) + end LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudgetSat diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage1InstPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage1InstPlaced.lean index 2e07affff..b0bba7716 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage1InstPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage1InstPlaced.lean @@ -172,11 +172,11 @@ private theorem cliPollId_kitPlacedOkI_a0 [LibsignalPlacement] (cliPollIdKitPlaced E2E.HooksE.A0 F0 peer (cliKitStk B)) (cliGhostExterns gh (cliExternsPlaced mmpl W)) := cliIdKitPlacedOkI_full - (IdKit.cliIdKitOkIE_placed + (IdKit.cliIdKitOkIE_placed_sat (readProg := dpPollProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) (jRead := 518) hDropNz (fun _ hp => hp.2) hh (StoreKit.subroutine_ok_withLsCodeRoLoaded_of_plain hread) - (cliGhostExterns_blackBox mmpl gh W) + hh.blackBox (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (by decide) (by decide)) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlaced.lean index 0db19229c..0f0f61cd7 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlaced.lean @@ -23,6 +23,8 @@ public import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoPlacedSat -- public import LibsignalBinary.Proofs.E2E.Pqxdh.Reloc.DropSpe2Placed import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedSat import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureSpeOwned import LibsignalBinary.Proofs.TripleRatchet.Alloc.PublicKeySerialize @@ -188,13 +190,65 @@ theorem instHkdfPlacedHooks_cli_poll (mmpl : Obj.MultiPlacement) (gh : CliGhostH (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans (Slots.cliExternsPlaced_compress256 mmpl W) -/-- `PqxdhPlacedHookContractsExactSat` at `cliGhostExterns gh (cliExternsPlaced mmpl W)` +private structure PqxdhPlacedHookContractsExactBbSat (P : Initiator.Primitives) (C : Crypto) + (A : RustAlloc) (H : LibsignalHooks) : Prop where + hkdf : LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat.HkdfPlacedHooksExactSat C.F H + dh : HookSat H CryptoVerification.LibsignalTripleRatchet.Keys.lsDhSym (diffieHellmanSpec C.X) + sharedDrop : HookSat H CryptoVerification.LibsignalTripleRatchet.Keys.lsSharedDropSym zeroizeSecretSpec + staticDrop : HookSat H CryptoVerification.LibsignalTripleRatchet.Keys.lsStaticDropSym zeroizeSecretSpec + blackBox : HookSat H CryptoVerification.SignalSession.lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat + noAllocShim : HookSat H CryptoVerification.LibsignalTripleRatchet.Keys.lsRustNoAllocShimSym noAllocShimSpec + alloc : HookSat H CryptoVerification.LibsignalTripleRatchet.Keys.lsRustAllocSym (rustAllocSpec A) + dealloc : HookSat H lsRustDeallocSym (rustDeallocSpec A) + handleAllocError : H CryptoVerification.LibsignalTripleRatchet.Keys.lsHandleAllocErrorSym = some Rust.panicked + handleError : H CryptoVerification.E2E.Pqxdh.ResponderCore.lsHandleErrorSym = some Rust.panicked + kyberDecaps : HookSat H ResponderCore.lsKyberDecapsSym (Initiator.kyberDecapsStubSpec P) + dalekMontToEd : HookSat H ResponderCore.lsDalekMontToEdSym + (CryptoVerification.E2E.Pqxdh.ResponderCore.dalekMontToEdStubSpec P) + dalekTorsionFree : HookSat H ResponderCore.lsDalekTorsionFreeSym + (Initiator.cryptoBoolRegStubSpec P.isTorsionFree 160) + +private theorem PqxdhPlacedHookContractsExactBbSat.calculateAgreement_ok [LibsignalPlacement] + {callerProg : Program} {i : Nat} + {P : Initiator.Primitives} {C : Crypto} {A : RustAlloc} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hH : PqxdhPlacedHookContractsExactBbSat P C A H) + (hP : ResponderCore.PrimitivesMatchCrypto P C) + (hi : i < 619 := by decide) : + ResponderCore.PqxdhCalculateAgreementPlacedOk P A callerProg := + LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedSat.pqxdhCalculateAgreement_placed_ok_of_block_sat + hP hH.dh hH.sharedDrop hH.blackBox hH.noAllocShim hH.alloc hH.staticDrop hH.handleAllocError hi + +private theorem PqxdhPlacedHookContractsExactBbSat.hkdfExtract_ok [LibsignalPlacement] + {callerProg : Program} {i : Nat} + {P : Initiator.Primitives} {C : Crypto} {A : RustAlloc} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hH : PqxdhPlacedHookContractsExactBbSat P C A H) + (hP : ResponderCore.PrimitivesMatchCrypto P C) + (hi : i < 619 := by decide) : + Initiator.PqxdhHkdfExtractPlacedOk P callerProg := by + have _ : LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat.HkdfPlacedHooksExactSat C.F H := hH.hkdf + exact LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoPlacedSat.pqxdhHkdfExtract_placed_ok_sat hP hi + +private theorem PqxdhPlacedHookContractsExactBbSat.hkdfExpandMultiInfo_ok [LibsignalPlacement] + {callerProg : Program} {i : Nat} + {P : Initiator.Primitives} {C : Crypto} {A : RustAlloc} {H : LibsignalHooks} + [IsLsBlockProg callerProg i H] + (hH : PqxdhPlacedHookContractsExactBbSat P C A H) + (hP : ResponderCore.PrimitivesMatchCrypto P C) + (hi : i < 619 := by decide) : + Initiator.PqxdhHkdfExpandMultiInfoPlacedOk P callerProg := by + have _ : LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat.HkdfPlacedHooksExactSat C.F H := hH.hkdf + exact LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoPlacedSat.pqxdhHkdfExpandMultiInfo_placed_ok_sat hP hi + +/-- `PqxdhPlacedHookContractsExactBbSat` at `cliGhostExterns gh (cliExternsPlaced mmpl W)` and `E2E.HooksE.A0` from `CliGhostA0Hooks E2E.HooksE.A0 gh` and `RunHooksPlaced`. -/ -theorem cliResponderPqxdhHookContractsPlaced [LibsignalPlacement] +private theorem cliResponderPqxdhHookContractsPlaced [LibsignalPlacement] (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (hh : RunSkeleton.RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) : - LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoPlacedSat.PqxdhPlacedHookContractsExactSat + PqxdhPlacedHookContractsExactBbSat (ResponderCore.ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) W.C E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W)) := by refine @@ -207,14 +261,11 @@ theorem cliResponderPqxdhHookContractsPlaced [LibsignalPlacement] (Slots.cliExternsPlaced_compress256 mmpl W) } dh := Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W (Slots.cliExternsPlaced_diffieHellman_sat mmpl W) - sharedDrop := Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_sharedSecretDrop_sat mmpl W) - staticDrop := Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_staticSecretDrop_sat mmpl W) - blackBox := - (cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (Slots.blackBox_row_placed mmpl W)) + sharedDrop := Slots.cliGhostExterns_sharedSecretDrop_sat gh (cliExternsPlaced mmpl W) + hG.extraOk + staticDrop := Slots.cliGhostExterns_staticSecretDrop_sat gh (cliExternsPlaced mmpl W) + hG.extraOk + blackBox := hh.blackBox noAllocShim := hh.codecHooks.shim alloc := hh.codecHooks.alloc dealloc := hh.codecHooks.dealloc @@ -281,6 +332,7 @@ theorem cliPublicKeySerialize_placed_ok_at [LibsignalPlacement] (mmpl : Obj.Mult `cliGhostExterns gh (cliExternsPlaced mmpl W)`. -/ theorem cliPqxdhCalculateAgreement_placed_ok [LibsignalPlacement] (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (hh : RunSkeleton.RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) {callerProg : Program} {i : Nat} [IsLsBlockProg callerProg i (cliGhostExterns gh (cliExternsPlaced mmpl W))] @@ -288,21 +340,8 @@ theorem cliPqxdhCalculateAgreement_placed_ok [LibsignalPlacement] (X : Unreached ResponderCore.PqxdhCalculateAgreementPlacedOk (ResponderCore.ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) E2E.HooksE.A0 callerProg := - ResponderCore.pqxdhCalculateAgreement_placed_ok_of_block - (cliModelPrims_matchCrypto X W) - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_diffieHellman_sat mmpl W)) - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_sharedSecretDrop_sat mmpl W)) - ((cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (Slots.blackBox_row_placed mmpl W))) - hh.codecHooks.shim - hh.codecHooks.alloc - (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_staticSecretDrop_sat mmpl W)) - (Slots.cliGhostExterns_panic_handle_alloc_error mmpl gh W) - hi + (cliResponderPqxdhHookContractsPlaced X mmpl gh W hG hh).calculateAgreement_ok + (cliModelPrims_matchCrypto X W) hi /-- `PqxdhHkdfExtractPlacedOk` on any caller block `i < 619` at `cliGhostExterns gh (cliExternsPlaced mmpl W)` from `CliGhostA0Hooks E2E.HooksE.A0 gh`. -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlacedBudget.lean index 0d510a14c..18b03e1bd 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlacedBudget.lean @@ -12,6 +12,7 @@ module public import LibsignalBinary.Heap.IfaceBudget public import LibsignalBinary.Heap.IfaceBudgetLemmas public import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.GenP3.DropSs3ExtPlacedBudget +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.HandshakeDeriveBudget public import LibsignalBinary.Proofs.E2E.Pqxdh.Reloc.DropSpe2PlacedBudget public import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudget @@ -33,6 +34,7 @@ public import LibsignalBinary.Proofs.TripleRatchet.Keys.DefsBudget import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureSpeOwned +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat @@ -89,7 +91,7 @@ open CryptoVerification.LibsignalTripleRatchet.Keys ( ) open CryptoVerification.LibsignalTripleRatchetRepr (AddrGhost) open CryptoVerification.RustHeap (RustAlloc) -open CryptoVerification.SignalSession (CliHooks cliExternsPlaced cliHookTablePlaced) +open CryptoVerification.SignalSession (CliHooks cliExternsPlaced cliHookTablePlaced lsBlackBoxSym) open CryptoVerification.SignalSession.Cli.RunCompose (decResAt) open CryptoVerification.SignalSession.Cli.RunGlue ( CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_memcpy_some @@ -103,7 +105,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( ) open CryptoVerification.SignalSession.Cli.RunSkeleton (RunBudgets) open CryptoVerification.SignalSession.Cli.Slots ( - blackBox_row_placed cliExternsPlaced_compress256 cliExternsPlaced_kemDecaps_sat + cliExternsPlaced_compress256 cliExternsPlaced_kemDecaps_sat cliExternsPlaced_toEdwards_sat cliExternsPlaced_torsionFree_sat cliGhostExterns_sat_of_cliExternsPlaced kemDecaps_row_placed toEdwards_row_placed torsionFree_row_placed @@ -120,6 +122,7 @@ open LibsignalBinary.Heap.SpecBudget (hookSat_withVmPreserved withVmPreserved) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.GenP3.DropSs3ExtPlacedBudget ( drop_session_structure4_placed_cl_ok_at drop_session_structure4_placed_ok_at ) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat (blackBoxSpecSat) open LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.HandshakeDeriveBudget ( PqxdhHkdfExpandMultiInfoPlacedOk PqxdhHkdfExtractPlacedOk handshakeKeysDerivePlacedBaseSpec handshakeKeysDerivePlacedVmSpec @@ -139,8 +142,8 @@ open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudget ( ) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat - cliExternsPlaced_diffieHellman_budget_sat - cliExternsPlaced_sharedSecretDrop_budget_sat cliExternsPlaced_staticSecretDrop_budget_sat + cliExternsPlaced_diffieHellman_budget_sat cliGhostExterns_blackBoxSat_budget_sat + cliGhostExterns_sharedSecretDrop_budget_sat cliGhostExterns_staticSecretDrop_budget_sat ) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( noAllocShimBudgetSpec noAllocShim_hookOk publicKeySerializeSpec publicKeySerializeSpecX @@ -604,7 +607,7 @@ structure ResponderPqxdhPlacedHookContractsExactSat [LibsignalPlacement] dh : HookSat H lsDhSym (withVmPreserved (diffieHellmanSpec C.X)) sharedDrop : HookSat H lsSharedDropSym (withVmPreserved zeroizeSecretSpec) staticDrop : HookSat H lsStaticDropSym (withVmPreserved zeroizeSecretSpec) - blackBox : H lsBlackBoxU8Sym = some blackBoxHook + blackBox : HookSat H lsBlackBoxSym blackBoxSpecSat noAllocShim : HookSat H lsRustNoAllocShimSym noAllocShimBudgetSpec alloc : HookSat H lsRustAllocSym (rustCliAllocBudgetSpec M A lim false) dealloc : HookSat H lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim) @@ -622,8 +625,8 @@ theorem ResponderPqxdhPlacedHookContractsExactSat.calculateAgreement_ok [Libsign (hP : PrimitivesMatchCrypto P C) (hi : i < 619 := by decide) : PqxdhCalculateAgreementPlacedOk M P A lim callerProg := - pqxdhCalculateAgreement_placed_ok_of_block hP hH.dh hH.sharedDrop hH.blackBox - hH.noAllocShim hH.alloc hH.staticDrop hi + LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat.pqxdhCalculateAgreement_placed_ok_of_block_sat + hP hH.dh hH.sharedDrop hH.blackBox hH.noAllocShim hH.alloc hH.staticDrop hi /-- Bundle projection: `PqxdhCalculateAgreementPlacedFrozenOk` on any caller block `i < 619`. -/ theorem ResponderPqxdhPlacedHookContractsExactSat.calculateAgreement_frozen_ok [LibsignalPlacement] @@ -635,8 +638,8 @@ theorem ResponderPqxdhPlacedHookContractsExactSat.calculateAgreement_frozen_ok [ (hP : PrimitivesMatchCrypto P C) (hi : i < 619 := by decide) : PqxdhCalculateAgreementPlacedFrozenOk M P A lim callerProg := - pqxdhCalculateAgreement_placed_frozen_ok_of_block hP hH.dh hH.sharedDrop hH.blackBox - hH.noAllocShim hH.alloc hH.staticDrop hi + LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat.pqxdhCalculateAgreement_placed_frozen_ok_of_block_sat + hP hH.dh hH.sharedDrop hH.blackBox hH.noAllocShim hH.alloc hH.staticDrop hi /-- Bundle projection: `HandshakeDeriveBudget.PqxdhHkdfExtractPlacedOk` on any caller block `i < 619`. -/ theorem ResponderPqxdhPlacedHookContractsExactSat.hkdfExtract_ok [LibsignalPlacement] @@ -706,13 +709,11 @@ theorem cliResponderPqxdhHookContractsPlaced_of_hookSat [LibsignalPlacement] {M memsetBudget := hExactB.memset dh := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W (cliExternsPlaced_diffieHellman_budget_sat mmpl W) - sharedDrop := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sharedSecretDrop_budget_sat mmpl W) - staticDrop := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W) - blackBox := (cliGhostExterns_other g (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W)) + sharedDrop := cliGhostExterns_sharedSecretDrop_budget_sat g (cliExternsPlaced mmpl W) + hG.extraOk + staticDrop := cliGhostExterns_staticSecretDrop_budget_sat g (cliExternsPlaced mmpl W) + hG.extraOk + blackBox := cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk noAllocShim := hnoAllocShim alloc := halloc dealloc := hdealloc @@ -881,10 +882,11 @@ theorem cliPublicKeySerialize_placed_ok_at [LibsignalPlacement] {M : AllocCostMo (cliExternsPlaced_noAllocShimBudget_sat mmpl g W hG.shim_eq) hi /-- `PqxdhCalculateAgreementPlacedOk` on any caller block `i < 619` at -`cliGhostExterns g (cliExternsPlaced mmpl W)` from `halloc` and `hdealloc`. -/ +`cliGhostExterns g (cliExternsPlaced mmpl W)` from `CliGhostAllocHooks`, `halloc`, and `hdealloc`. -/ theorem cliPqxdhCalculateAgreement_placed_ok_of_hookSat [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) + (hG : CliGhostAllocHooks M A lim g) {callerProg : Program} {i : Nat} [IsLsBlockProg callerProg i (cliGhostExterns g (cliExternsPlaced mmpl W))] (halloc : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsRustAllocSym @@ -892,32 +894,20 @@ theorem cliPqxdhCalculateAgreement_placed_ok_of_hookSat [LibsignalPlacement] {M (hdealloc : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hnoAllocShim : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsRustNoAllocShimSym - noAllocShimBudgetSpec := by exact cliExternsPlaced_noAllocShimBudget_sat mmpl g W) + noAllocShimBudgetSpec := by exact cliExternsPlaced_noAllocShimBudget_sat mmpl g W hG.shim_eq) (hi : i < 619 := by decide) : PqxdhCalculateAgreementPlacedOk M (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) A lim callerProg := - let _ := hdealloc - pqxdhCalculateAgreement_placed_ok_of_block - (cliModelPrims_matchCrypto X W) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_diffieHellman_budget_sat mmpl W)) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sharedSecretDrop_budget_sat mmpl W)) - ((cliGhostExterns_other g (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W))) - hnoAllocShim - halloc - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W)) - hi + (cliResponderPqxdhHookContractsPlaced_of_hookSat X mmpl g W hG halloc hdealloc + hnoAllocShim).calculateAgreement_ok (cliModelPrims_matchCrypto X W) hi /-- `PqxdhCalculateAgreementPlacedFrozenOk` on any caller block `i < 619` at -`cliGhostExterns g (cliExternsPlaced mmpl W)` from `halloc` and `hdealloc`. -/ +`cliGhostExterns g (cliExternsPlaced mmpl W)` from `CliGhostAllocHooks`, `halloc`, and `hdealloc`. -/ theorem cliPqxdhCalculateAgreement_frozen_placed_ok_of_hookSat [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) + (hG : CliGhostAllocHooks M A lim g) {callerProg : Program} {i : Nat} [IsLsBlockProg callerProg i (cliGhostExterns g (cliExternsPlaced mmpl W))] (halloc : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsRustAllocSym @@ -925,26 +915,13 @@ theorem cliPqxdhCalculateAgreement_frozen_placed_ok_of_hookSat [LibsignalPlaceme (hdealloc : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hnoAllocShim : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsRustNoAllocShimSym - noAllocShimBudgetSpec := by exact cliExternsPlaced_noAllocShimBudget_sat mmpl g W) + noAllocShimBudgetSpec := by exact cliExternsPlaced_noAllocShimBudget_sat mmpl g W hG.shim_eq) (hi : i < 619 := by decide) : PqxdhCalculateAgreementPlacedFrozenOk M (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) A lim callerProg := - let _ := hdealloc - pqxdhCalculateAgreement_placed_frozen_ok_of_block - (cliModelPrims_matchCrypto X W) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_diffieHellman_budget_sat mmpl W)) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sharedSecretDrop_budget_sat mmpl W)) - ((cliGhostExterns_other g (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W))) - hnoAllocShim - halloc - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W)) - hi + (cliResponderPqxdhHookContractsPlaced_of_hookSat X mmpl g W hG halloc hdealloc + hnoAllocShim).calculateAgreement_frozen_ok (cliModelPrims_matchCrypto X W) hi /-- `PqxdhCalculateAgreementPlacedOk` on any caller block `i < 619` at `cliGhostExterns g (cliExternsPlaced mmpl W)` from `CliGhostAllocHooks M A lim g`. -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlacedBudgetBbSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlacedBudgetBbSat.lean index 93e991435..37ba692d8 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlacedBudgetBbSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlacedBudgetBbSat.lean @@ -59,8 +59,7 @@ open CryptoVerification.SignalSession.Cli.Slots (cliGhostExterns_sat_of_cliExter open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget rustCliAllocBudgetSpec rustCliDeallocBudgetSpec) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) -open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat - (blackBoxSpecSat hookSat_blackBox_of_eq) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat (blackBoxSpecSat) open LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.HandshakeDeriveBudget (PqxdhHkdfExpandMultiInfoPlacedOk PqxdhHkdfExtractPlacedOk handshakeKeysDerivePlacedBaseSpec handshakeKeysDerivePlacedVmSpec) @@ -82,12 +81,11 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.Stag cliExternsPlaced_noAllocShimBudget_sat cliExternsPlaced_toEdwards_budget_sat cliExternsPlaced_torsionFree_budget_sat dalekMontToEdResponderBudgetSpec) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetSat - (ResponderPqxdhPlacedHookContractsSat cliResponderPqxdhHookContractsPlaced_of_hookSat_sat - cliResponderPqxdhHookContractsPlaced_of_runHooks_sat cliResponderPqxdhHookContractsPlaced_sat) + (ResponderPqxdhPlacedHookContractsSat) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat - cliExternsPlaced_diffieHellman_budget_sat cliExternsPlaced_sharedSecretDrop_budget_sat - cliExternsPlaced_staticSecretDrop_budget_sat) + cliExternsPlaced_diffieHellman_budget_sat cliGhostExterns_blackBoxSat_budget_sat + cliGhostExterns_sharedSecretDrop_budget_sat cliGhostExterns_staticSecretDrop_budget_sat) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (noAllocShimBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat (HkdfPlacedHooksExactBudgetSat) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat (HkdfPlacedHooksExactSat) @@ -143,7 +141,7 @@ theorem ResponderPqxdhPlacedHookContractsSat.toBbSat [LibsignalPlacement] dh := h.dh sharedDrop := h.sharedDrop staticDrop := h.staticDrop - blackBox := hookSat_blackBox_of_eq h.blackBox + blackBox := h.blackBox noAllocShim := h.noAllocShim alloc := h.alloc dealloc := h.dealloc @@ -306,10 +304,8 @@ theorem cliResponderPqxdhHookContractsPlaced_of_hookSat_bb_sat [LibsignalPlaceme memsetBudget := hMs dh := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W (cliExternsPlaced_diffieHellman_budget_sat mmpl W) - sharedDrop := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sharedSecretDrop_budget_sat mmpl W) - staticDrop := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W) + sharedDrop := cliGhostExterns_sharedSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk + staticDrop := cliGhostExterns_staticSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk blackBox := hBb noAllocShim := hnoAllocShim alloc := halloc @@ -369,8 +365,9 @@ theorem cliResponderPqxdhHookContractsPlaced_of_hookSat_sat_toBbSat [LibsignalPl ResponderPqxdhPlacedHookContractsBbSat M (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) W.C A lim (cliGhostExterns g (cliExternsPlaced mmpl W)) := - ResponderPqxdhPlacedHookContractsSat.toBbSat - (cliResponderPqxdhHookContractsPlaced_of_hookSat_sat X mmpl g W hG hMs halloc hdealloc hnoAllocShim) + cliResponderPqxdhHookContractsPlaced_of_hookSat_bb_sat X mmpl g W hG hMs + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) + halloc hdealloc hnoAllocShim theorem cliResponderPqxdhHookContractsPlaced_sat_toBbSat [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -381,8 +378,8 @@ theorem cliResponderPqxdhHookContractsPlaced_sat_toBbSat [LibsignalPlacement] {M ResponderPqxdhPlacedHookContractsBbSat M (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) W.C A lim (cliGhostExterns g (cliExternsPlaced mmpl W)) := - ResponderPqxdhPlacedHookContractsSat.toBbSat - (cliResponderPqxdhHookContractsPlaced_sat X mmpl g W hG hMs) + cliResponderPqxdhHookContractsPlaced_bb_sat X mmpl g W hG hMs + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) theorem cliResponderPqxdhHookContractsPlaced_of_runHooks_sat_toBbSat [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -395,7 +392,7 @@ theorem cliResponderPqxdhHookContractsPlaced_of_runHooks_sat_toBbSat [LibsignalP ResponderPqxdhPlacedHookContractsBbSat M (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) W.C A lim (cliGhostExterns g (cliExternsPlaced mmpl W)) := - ResponderPqxdhPlacedHookContractsSat.toBbSat - (cliResponderPqxdhHookContractsPlaced_of_runHooks_sat X mmpl g W hG hh hMs) + cliResponderPqxdhHookContractsPlaced_of_runHooks_bb_sat X mmpl g W hG hh hMs + (cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk) end LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetBbSat diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlacedBudgetSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlacedBudgetSat.lean index c452a2474..5c0141847 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlacedBudgetSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1BasePlacedBudgetSat.lean @@ -9,11 +9,15 @@ limitations under the License. module +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudget -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget -- proof-setup: allow-public-import +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudgetSat +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat +import LibsignalBinary.Proofs.TripleRatchet.Keys.CreateChainBudget /-! # `HookSat` Sibling of `Stage2V1BasePlacedBudget` (`Stage2V1BasePlacedBudgetSat`) @@ -34,43 +38,48 @@ open Arm64 ProofLib ProofLib.ObjectLoad ProofLib.ProgramReflection SepProp open CryptoGames.LibsignalSession (Crypto) open CryptoVerification (IsLsBlockProg LibsignalHooks LibsignalPlacement - lsBlackBoxU8Sym lsRustDeallocSym lsRustNoAllocShimSym lsmpl) + lsRustDeallocSym lsRustNoAllocShimSym lsmpl) open CryptoVerification.E2E (UnreachedPqxdhPrimitives modelPrims) open CryptoVerification.E2E.Pqxdh.Initiator (Primitives StructuralPrims) open CryptoVerification.E2E.Pqxdh.ResponderCore (PrimitivesMatchCrypto lsDalekMontToEdSym lsDalekTorsionFreeSym lsKyberDecapsSym ofSignalPqxdhPrimitives) -open CryptoVerification.LibsignalSession (blackBoxHook) open CryptoVerification.LibsignalTripleRatchet - (diffieHellmanSpec lsMemsetSym withLsCodeRoLoaded zeroizeSecretSpec) + (diffieHellmanSpec keys_ls_hook_ok_of_mem keys_ls_subroutine_ok_of_block_cro lsMemsetSym + withLsCodeRoLoaded zeroizeSecretSpec) open CryptoVerification.LibsignalTripleRatchet.Keys (lsDhSym lsRustAllocSym lsSharedDropSym lsStaticDropSym) -open CryptoVerification.SignalSession (CliHooks cliExternsPlaced) -open CryptoVerification.SignalSession.Cli.RunGlue - (CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other) +open CryptoVerification.SignalSession (CliHooks cliExternsPlaced lsBlackBoxSym) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) open CryptoVerification.SignalSession.Cli.RunProofs.Poll (cliModelPrims_matchCrypto) -open CryptoVerification.SignalSession.Cli.Slots - (blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced) +open CryptoVerification.SignalSession.Cli.Slots (cliGhostExterns_sat_of_cliExternsPlaced) open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget rustCliAllocBudgetSpec rustCliDeallocBudgetSpec) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat + (blackBoxSpecSat hookSat_blackBox_of_eq) open LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.HandshakeDeriveBudget (PqxdhHkdfExpandMultiInfoPlacedOk PqxdhHkdfExtractPlacedOk handshakeKeysDerivePlacedBaseSpec handshakeKeysDerivePlacedVmSpec) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudget - (PqxdhCalculateAgreementPlacedFrozenOk PqxdhCalculateAgreementPlacedOk - pqxdhCalculateAgreement_placed_frozen_ok_of_block pqxdhCalculateAgreement_placed_ok_of_block) + (PqxdhCalculateAgreementPlacedFrozenOk PqxdhCalculateAgreementPlacedOk) +open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudgetSat + (expand_multi_info_placed_vm_ok_of_other_block_sat) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudget (cryptoBoolRegStubBudgetSpec kyberDecapsStubBudgetSpec) +open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat + (calculateAgreement_placed_ok_unconditional_sat + pqxdhCalculateAgreement_placed_frozen_ok_of_block_sat + pqxdhCalculateAgreement_placed_ok_of_block_sat) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat - (createChain_placed_ok_of_block_sat createChain_placed_ok_x_of_block_sat + (extract_placed_vm_ok_of_other_block_sat handshakeKeysDerive_placed_ok_of_block_sat handshakeKeysDerive_placed_vm_ok_of_block_sat pqxdhHkdfExpandMultiInfo_placed_ok_sat pqxdhHkdfExtract_placed_ok_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat - cliExternsPlaced_diffieHellman_budget_sat - cliExternsPlaced_sharedSecretDrop_budget_sat cliExternsPlaced_staticSecretDrop_budget_sat) + cliExternsPlaced_diffieHellman_budget_sat cliGhostExterns_blackBoxSat_budget_sat + cliGhostExterns_sharedSecretDrop_budget_sat cliGhostExterns_staticSecretDrop_budget_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudget (ResponderPqxdhPlacedHookContracts cliExternsPlaced_kemDecaps_budget_sat cliExternsPlaced_noAllocShimBudget_sat cliExternsPlaced_toEdwards_budget_sat @@ -80,6 +89,8 @@ open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat (HkdfPlacedHooks.toBudgetSat HkdfPlacedHooks.toExactBudgetSat HkdfPlacedHooksExactBudgetSat) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat (HkdfPlacedHooksExactSat) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemsetRegionBudgetSpec) +open LibsignalBinary.Proofs.TripleRatchet.Keys.CreateChainBudget + (createChain_placed_ok_of_contracts subroutine_ok_createChainSpecX_of_createChainSpec) open LibsignalBinary.Proofs.TripleRatchet.Keys.DefsBudget (createChainSpec createChainSpecX) private theorem hookSat_noAllocShimBudget_of_withVmPreserved_local {H : LibsignalHooks} @@ -132,7 +143,7 @@ public structure ResponderPqxdhPlacedHookContractsSat [LibsignalPlacement] dh : HookSat H lsDhSym (withVmPreserved (diffieHellmanSpec C.X)) sharedDrop : HookSat H lsSharedDropSym (withVmPreserved zeroizeSecretSpec) staticDrop : HookSat H lsStaticDropSym (withVmPreserved zeroizeSecretSpec) - blackBox : H lsBlackBoxU8Sym = some blackBoxHook + blackBox : HookSat H lsBlackBoxSym blackBoxSpecSat noAllocShim : HookSat H lsRustNoAllocShimSym noAllocShimBudgetSpec alloc : HookSat H lsRustAllocSym (rustCliAllocBudgetSpec M A lim false) dealloc : HookSat H lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim) @@ -152,7 +163,7 @@ public theorem ResponderPqxdhPlacedHookContracts.toSat [LibsignalPlacement] dh := hH.dh sharedDrop := hH.sharedDrop staticDrop := hH.staticDrop - blackBox := hH.blackBox + blackBox := hookSat_blackBox_of_eq hH.blackBox noAllocShim := hH.noAllocShim alloc := hH.alloc dealloc := hH.dealloc @@ -170,7 +181,7 @@ public theorem ResponderPqxdhPlacedHookContractsSat.calculateAgreement_ok [Libsi (hP : PrimitivesMatchCrypto P C) (hi : i < 619 := by decide) : PqxdhCalculateAgreementPlacedOk M P A lim callerProg := - pqxdhCalculateAgreement_placed_ok_of_block hP hH.dh hH.sharedDrop hH.blackBox + pqxdhCalculateAgreement_placed_ok_of_block_sat hP hH.dh hH.sharedDrop hH.blackBox hH.noAllocShim hH.alloc hH.staticDrop hi /-- Bundle projection: `PqxdhCalculateAgreementPlacedFrozenOk` on any caller block `i < 619`. -/ @@ -183,7 +194,7 @@ public theorem ResponderPqxdhPlacedHookContractsSat.calculateAgreement_frozen_ok (hP : PrimitivesMatchCrypto P C) (hi : i < 619 := by decide) : PqxdhCalculateAgreementPlacedFrozenOk M P A lim callerProg := - pqxdhCalculateAgreement_placed_frozen_ok_of_block hP hH.dh hH.sharedDrop hH.blackBox + pqxdhCalculateAgreement_placed_frozen_ok_of_block_sat hP hH.dh hH.sharedDrop hH.blackBox hH.noAllocShim hH.alloc hH.staticDrop hi /-- Bundle projection: `HandshakeDeriveBudget.PqxdhHkdfExtractPlacedOk` on any caller block `i < 619`. -/ @@ -263,11 +274,16 @@ public theorem ResponderPqxdhPlacedHookContractsSat.createChain_ok [LibsignalPla (hi : i < 619 := by decide) : subroutine_ok callerProg (lsmpl.base 40) (withLsCodeRoLoaded lsmpl (createChainSpec M A lim C)) := by - have : HkdfPlacedHooksExactSat C.F H := hH.hkdf - have : HkdfPlacedHooksExactBudgetSat C.F H := - HkdfPlacedHooksExactBudgetSat.of_exactSat hH.memsetBudget - exact createChain_placed_ok_of_block_sat hH.dh hH.sharedDrop hH.blackBox - hH.noAllocShim hH.alloc hH.staticDrop hH.dealloc hi + have _ : HkdfPlacedHooksExactBudgetSat C.F H := + @HkdfPlacedHooksExactBudgetSat.of_exactSat C.F H hH.memsetBudget hH.hkdf + have h40 := createChain_placed_ok_of_contracts + (keys_ls_subroutine_ok_of_block_cro + (calculateAgreement_placed_ok_unconditional_sat hH.dh hH.sharedDrop hH.blackBox + hH.noAllocShim hH.alloc hH.staticDrop)) + (extract_placed_vm_ok_of_other_block_sat C H) + (expand_multi_info_placed_vm_ok_of_other_block_sat C H) + (keys_ls_hook_ok_of_mem hH.dealloc) + exact keys_ls_subroutine_ok_of_block_cro h40 hi (by decide) (by decide) /-- Bundle projection: `::create_chain` at `createChainStackX` (Block `40`) on any caller block `i < 619`. -/ @@ -280,11 +296,17 @@ public theorem ResponderPqxdhPlacedHookContractsSat.createChain_x_ok [LibsignalP (hi : i < 619 := by decide) : subroutine_ok callerProg (lsmpl.base 40) (withLsCodeRoLoaded lsmpl (createChainSpecX M A lim C)) := by - have : HkdfPlacedHooksExactSat C.F H := hH.hkdf - have : HkdfPlacedHooksExactBudgetSat C.F H := - HkdfPlacedHooksExactBudgetSat.of_exactSat hH.memsetBudget - exact createChain_placed_ok_x_of_block_sat hH.dh hH.sharedDrop hH.blackBox - hH.noAllocShim hH.alloc hH.staticDrop hH.dealloc hi + have _ : HkdfPlacedHooksExactBudgetSat C.F H := + @HkdfPlacedHooksExactBudgetSat.of_exactSat C.F H hH.memsetBudget hH.hkdf + have h40 := subroutine_ok_createChainSpecX_of_createChainSpec + (createChain_placed_ok_of_contracts + (keys_ls_subroutine_ok_of_block_cro + (calculateAgreement_placed_ok_unconditional_sat hH.dh hH.sharedDrop hH.blackBox + hH.noAllocShim hH.alloc hH.staticDrop)) + (extract_placed_vm_ok_of_other_block_sat C H) + (expand_multi_info_placed_vm_ok_of_other_block_sat C H) + (keys_ls_hook_ok_of_mem hH.dealloc)) + exact keys_ls_subroutine_ok_of_block_cro h40 hi (by decide) (by decide) /-- `ResponderPqxdhPlacedHookContractsSat` at `cliGhostExterns g (cliExternsPlaced mmpl W)` from `CliGhostAllocHooks M A lim g`, `hMs`, and `HookSat` contracts for `alloc`, `dealloc`, and @@ -308,13 +330,9 @@ public theorem cliResponderPqxdhHookContractsPlaced_of_hookSat_sat [LibsignalPla memsetBudget := hMs dh := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W (cliExternsPlaced_diffieHellman_budget_sat mmpl W) - sharedDrop := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sharedSecretDrop_budget_sat mmpl W) - staticDrop := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W) - blackBox := (cliGhostExterns_other g (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W)) + sharedDrop := cliGhostExterns_sharedSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk + staticDrop := cliGhostExterns_staticSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk + blackBox := cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk noAllocShim := hnoAllocShim alloc := halloc dealloc := hdealloc diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1InstPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1InstPlaced.lean index 3b540f8fb..5aae132b3 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1InstPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1InstPlaced.lean @@ -44,6 +44,7 @@ import LibsignalBinary.Proofs.SpqrV1.Kdf.HkdfToSliceExtract import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderClosure.Fetch import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.AcceptPlacedB import LibsignalBinary.Proofs.E2E.Pqxdh.Shared.AllocAndVecPlaced +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBbSat /-! # Relocatable `[LibsignalPlacement]` CLI Poll Stage P2 V1 Instantiation @@ -102,6 +103,8 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Initiate open CryptoVerification.SignalSession.Cli.KitInst hiding cliPreKeyStoreSpecPlaced cliSignedPreKeyStoreSpecPlaced cliKyberPreKeyStoreSpecPlaced cliPreKeyStoreSpecPlaced_quiet cliSignedPreKeyStoreSpecPlaced_quiet +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBbSat + (isSameAccount_4k_placed_ok_on_stageP1_sat isSameAccount_placed_ok_on_stageP1_sat) attribute [-arm64_norm] CryptoVerification.SpqrV1.Kdf.HkdfToSliceProof.sp_sub_688_eq_hsp @@ -584,11 +587,11 @@ private theorem cliUuidTryParse_placed_ok [LibsignalPlacement] ⌜False⌝ from rfl, satisfies_pure_sepConj] at hpan; exact False.elim hpan.1 private theorem cliIsSameAccount_placed_ok_on_stageP1 [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : + (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hh : RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) : subroutine_ok (stageP1ProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsmpl.base 17) (withLsCodeLoaded lsmpl (WireEntries.isSameAccountDistinctSpec E2E.HooksE.A0 uuidTryParse)) := - Kits.isSameAccount_placed_ok_on_stageP1 - (IdKit.cliGhostExterns_blackBox mmpl gh W) (cliUuidTryParse_placed_ok mmpl gh W) + isSameAccount_placed_ok_on_stageP1_sat hh.blackBox (cliUuidTryParse_placed_ok mmpl gh W) theorem cliStageP2PureCalleesPlaced_of_seams [LibsignalPlacement] (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) @@ -608,7 +611,7 @@ theorem cliStageP2PureCalleesPlaced_of_seams [LibsignalPlacement] (hookSat_sessionMemcpy_of_frameless allocHookStack hh.codecHooks.memcpy) (Slots.cliGhostExterns_panic_handle_error mmpl gh W) (Slots.cliGhostExterns_panic_handle_alloc_error mmpl gh W) - (cliIsSameAccount_placed_ok_on_stageP1 mmpl gh W) h_accept hS.initialStateMemInv_lsProg75 + (cliIsSameAccount_placed_ok_on_stageP1 mmpl gh W hh) h_accept hS.initialStateMemInv_lsProg75 theorem cliStageP2PureCalleesPlaced4K_of_seams [LibsignalPlacement] (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) @@ -626,8 +629,8 @@ theorem cliStageP2PureCalleesPlaced4K_of_seams [LibsignalPlacement] (hookSat_sessionMemcpy_of_frameless allocHookStack hh.codecHooks.memcpy) (Slots.cliGhostExterns_panic_handle_error mmpl gh W) (Slots.cliGhostExterns_panic_handle_alloc_error mmpl gh W) - (Kits.isSameAccount_4k_placed_ok_on_stageP1 - (IdKit.cliGhostExterns_blackBox mmpl gh W) (cliUuidTryParse_placed_ok mmpl gh W)) + (isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (cliUuidTryParse_placed_ok mmpl gh W)) h_accept hS.initialStateMemInv_lsProg75 private theorem cliPollSpk_getShim_rocl [LibsignalPlacement] @@ -1152,31 +1155,55 @@ theorem cliStageP2BaseCalleesPlaced4K [LibsignalPlacement] (hookSat_sessionMemcpy_of_frameless allocHookStack hh.codecHooks.memcpy) (Slots.cliGhostExterns_panic_handle_error mmpl gh W) (Slots.cliGhostExterns_panic_handle_alloc_error mmpl gh W) - (Kits.isSameAccount_4k_placed_ok_on_stageP1 - (IdKit.cliGhostExterns_blackBox mmpl gh W) + (isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (cliUuidTryParse_placed_ok mmpl gh W)) +private theorem cliDalekMontToEd_placed_sat (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) + (W : CliHooks) (X : UnreachedPqxdhPrimitives) : + HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) ResponderCore.lsDalekMontToEdSym + (ResponderCore.dalekMontToEdStubSpec (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩))) := by + rcases Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W + (Slots.cliExternsPlaced_toEdwards_sat mmpl W X (img := default)) with ⟨f, hrow, hok⟩ + exact ⟨f, hrow, fun g R s0 hrun hpre hsp => + hok ⟨g.inBytes, g.signBit, g.inPtr, g.outPtr⟩ R s0 hrun hpre hsp⟩ + +private theorem cliDalekTorsionFree_placed_sat (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) + (W : CliHooks) (X : UnreachedPqxdhPrimitives) : + HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) ResponderCore.lsDalekTorsionFreeSym + (Initiator.cryptoBoolRegStubSpec + (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)).isTorsionFree 160) := by + rcases Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W + (Slots.cliExternsPlaced_torsionFree_sat mmpl W X (img := default)) with ⟨f, hrow, hok⟩ + exact ⟨f, hrow, fun g R s0 hrun hpre hsp => + hok ⟨g.inPtr, g.inBytes⟩ R s0 hrun hpre hsp⟩ + private theorem initializeBobSession_err_owned_exactSat_full_placed_ok_on_stageP1 [LibsignalFullPlacement] - {P : Initiator.Primitives} {C : Crypto} {A : RustAlloc} - {ext : String → Option (State → State)} - (hWF : Initiator.StructuralPrims P) - (hP : ResponderCore.PrimitivesMatchCrypto P C) - (hH : LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoPlacedSat.PqxdhPlacedHookContractsExactSat - P C A ext) - (h_memcpy : HookSat ext lsMemcpySym framelessMemcpySpec) : - subroutine_ok (stageP1ProgPlaced ext) (lsmpl.base 75) + (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hh : RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) : + subroutine_ok (stageP1ProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsmpl.base 75) (StoreKit.withLsCodeRoLoaded lsmpl - (ResponderCore.initializeBobSessionErrOwnedFrozenPlacedSpec P A)) := by - have h_acc_err : subroutine_ok (lsProg_75 ext) (lsmpl.base 79) - (ResponderCore.pqxdhAcceptErrOwnedFrozenPlacedSpec P A) := - ResponderCore.pqxdhAccept_err_owned_placed_ok_of_block hWF - (ResponderCore.ecPubKeyIsCanonical_placed_ok_cl hWF hH.dalekMontToEd hH.dalekTorsionFree) - (hH.calculateAgreement_ok hP) - hH.noAllocShim hH.alloc hH.dealloc h_memcpy hH.handleError + (ResponderCore.initializeBobSessionErrOwnedFrozenPlacedSpec + (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) E2E.HooksE.A0)) := by + have h_acc_err : subroutine_ok (lsProg_75 (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (lsmpl.base 79) + (ResponderCore.pqxdhAcceptErrOwnedFrozenPlacedSpec + (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) E2E.HooksE.A0) := + ResponderCore.pqxdhAccept_err_owned_placed_ok_of_block + (cliModelPrims_structural X W) + (ResponderCore.ecPubKeyIsCanonical_placed_ok_cl (cliModelPrims_structural X W) + (cliDalekMontToEd_placed_sat mmpl gh W X) + (cliDalekTorsionFree_placed_sat mmpl gh W X)) + (cliPqxdhCalculateAgreement_placed_ok + X mmpl gh W hG hh) + hh.codecHooks.shim hh.codecHooks.alloc hh.codecHooks.dealloc hh.codecHooks.memcpy + (Slots.cliGhostExterns_panic_handle_error mmpl gh W) have hbase := ResponderCore.ls_subroutine_ok_withLsFrozen_of_block - (callerProg := stageP1ProgPlaced ext) (calleeProg := lsProg_75 ext) (i := 518) (j := 75) + (callerProg := stageP1ProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (calleeProg := lsProg_75 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 518) (j := 75) (ResponderCore.initializeBobSession_err_owned_frozen_placed_ok_of_accept h_acc_err) refine subroutine_ok_map_panic hbase ?_ (fun _ _ _ _ _ _ he => by @@ -1195,33 +1222,46 @@ private theorem initializeBobSession_err_owned_exactSat_full_placed_ok_on_stageP private theorem initializeBobSession_ok_v1_exactSat_full_placed_on_stageP1 [LibsignalFullPlacement] - {P : Initiator.Primitives} {C : Crypto} {A : RustAlloc} {F : ShaCompress} - {ext : String → Option (State → State)} - (hWF : Initiator.StructuralPrims P) - (hP : ResponderCore.PrimitivesMatchCrypto P C) - (hH : LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoPlacedSat.PqxdhPlacedHookContractsExactSat - P C A ext) - (h_memcpy : HookSat ext lsMemcpySym framelessMemcpySpec) - (hMemcpySess : HookSat ext lsMemcpySym sessionMemcpyRegionSpec) + (X : UnreachedPqxdhPrimitives) (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hh : RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (hinit : CryptoVerification.Cli.E2E.V1.InitialStateMemInvPlacedOk - (StoreKit.LibsignalCodeRoLoaded lsmpl) A F ext) : - Kits.InitializeBobV1FrozenOkPlaced P A F ext := by - have h_acc : subroutine_ok (lsProg_75 ext) (lsmpl.base 79) - (ResponderCore.pqxdhAcceptOptFieldsFrozenPlacedSpec P A) := - ResponderCore.pqxdhAccept_opt_fields_placed_ok_of_block hWF - (ResponderCore.ecPubKeyIsCanonical_placed_ok_cl hWF hH.dalekMontToEd hH.dalekTorsionFree) - (hH.calculateAgreement_ok hP) - (CryptoVerification.E2E.Pqxdh.Shared.vecAppendElements_fast_placed_ok_cl h_memcpy) - (hH.hkdfExtract_ok hP) - (hH.hkdfExpandMultiInfo_ok hP) - hH.noAllocShim hH.alloc hH.dealloc h_memcpy hH.kyberDecaps - hH.handleError hH.handleAllocError + (StoreKit.LibsignalCodeRoLoaded lsmpl) E2E.HooksE.A0 W.C.F + (cliGhostExterns gh (cliExternsPlaced mmpl W))) : + Kits.InitializeBobV1FrozenOkPlaced + (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) E2E.HooksE.A0 W.C.F + (cliGhostExterns gh (cliExternsPlaced mmpl W)) := by + have h_acc : subroutine_ok (lsProg_75 (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (lsmpl.base 79) + (ResponderCore.pqxdhAcceptOptFieldsFrozenPlacedSpec + (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)) E2E.HooksE.A0) := + ResponderCore.pqxdhAccept_opt_fields_placed_ok_of_block + (cliModelPrims_structural X W) + (ResponderCore.ecPubKeyIsCanonical_placed_ok_cl (cliModelPrims_structural X W) + (cliDalekMontToEd_placed_sat mmpl gh W X) + (cliDalekTorsionFree_placed_sat mmpl gh W X)) + (cliPqxdhCalculateAgreement_placed_ok + X mmpl gh W hG hh) + (CryptoVerification.E2E.Pqxdh.Shared.vecAppendElements_fast_placed_ok_cl hh.codecHooks.memcpy) + (cliPqxdhHkdfExtract_placed_ok + X mmpl gh W hG hh) + (cliPqxdhHkdfExpandMultiInfo_placed_ok + X mmpl gh W hG hh) + hh.codecHooks.shim hh.codecHooks.alloc hh.codecHooks.dealloc hh.codecHooks.memcpy + (Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W + (Slots.cliExternsPlaced_kemDecaps_sat mmpl W X)) + (Slots.cliGhostExterns_panic_handle_error mmpl gh W) + (Slots.cliGhostExterns_panic_handle_alloc_error mmpl gh W) intro s0 inp ikBPk spkBPk argPtr pqskPtr ctSlicePtr ctBufPtr ratchetKeyPairPtr outPtr drKey Frame hfr hrun hpc hsp hpqr hx0 hx1 hx8 htr hrep hopk hwell hik hspk hacc - exact ls_sepWPp_of_block (callerProg := stageP1ProgPlaced ext) (calleeProg := lsProg_75 ext) + exact ls_sepWPp_of_block + (callerProg := stageP1ProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (calleeProg := lsProg_75 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 518) (j := 75) (LibsignalCodeLoaded.of_codeLoaded hfr.2) (CryptoVerification.Cli.E2E.V1.initializeBobSession_ok_v1_frozen_placed_of_accept - hWF hH.noAllocShim hH.alloc hH.dealloc hMemcpySess hH.handleError + (cliModelPrims_structural X W) hh.codecHooks.shim hh.codecHooks.alloc hh.codecHooks.dealloc + (framelessMemcpySpec_eq_sessionMemcpyRegionSpec ▸ hh.codecHooks.memcpy) + (Slots.cliGhostExterns_panic_handle_error mmpl gh W) h_acc (CryptoVerification.Cli.E2E.V1.initialStateMemInvPlacedOk_mono (fun _ h => ⟨LibsignalCodeLoaded.of_codeLoaded h.2, h.1⟩) hinit) @@ -1259,16 +1299,9 @@ theorem stageP2PathA_qpan_cli_full_placed_of_seams [LibsignalFullPlacement] (cliGhostExterns gh (cliExternsPlaced mmpl W)) (cliModelPrims_structural X W) (cliStageP2ClosureHooksPlaced mmpl gh W hh) (cliStageP2BaseCalleesPlaced4K mmpl gh W hh) - (cliIsSameAccount_placed_ok_on_stageP1 mmpl gh W) - (initializeBobSession_err_owned_exactSat_full_placed_ok_on_stageP1 - (cliModelPrims_structural X W) (cliModelPrims_matchCrypto X W) - (cliResponderPqxdhHookContractsPlaced X mmpl gh W hG hh) - hh.codecHooks.memcpy) - (initializeBobSession_ok_v1_exactSat_full_placed_on_stageP1 - (cliModelPrims_structural X W) (cliModelPrims_matchCrypto X W) - (cliResponderPqxdhHookContractsPlaced X mmpl gh W hG hh) - hh.codecHooks.memcpy - (framelessMemcpySpec_eq_sessionMemcpyRegionSpec ▸ hh.codecHooks.memcpy) + (cliIsSameAccount_placed_ok_on_stageP1 mmpl gh W hh) + (initializeBobSession_err_owned_exactSat_full_placed_ok_on_stageP1 X mmpl gh W hG hh) + (initializeBobSession_ok_v1_exactSat_full_placed_on_stageP1 X mmpl gh W hG hh hSpqr.initialStateMemInv_lsProg75) (cliPollIdKitPlaced E2E.HooksE.A0 F0 peer (cliKitStk B)) (cliPollSelfKitPlaced E2E.HooksE.A0 F0 peer (cliKitStk B)) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1InstPlacedBudgetAux.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1InstPlacedBudgetAux.lean index a2db251a4..18926a0c7 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1InstPlacedBudgetAux.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1InstPlacedBudgetAux.lean @@ -39,12 +39,15 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlace public import LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureSpeOwned import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStmts import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.InitInv import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudget +import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudgetSat +import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetBbSat import ProofLib.SepLogic.WPp /-! @@ -1412,11 +1415,8 @@ private theorem cliStageP2BaseCalleesPlaced4K [LibsignalPlacement] {M : AllocCos hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_sessionMemcpyBudget_of_codec CryptoVerification.RustHeap.allocHookStack hh.codecHooks.memcpy) - (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget.isSameAccount_4k_placed_ok_on_stageP1 - ((CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExterns_other gh _ - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_row mmpl W - (CryptoVerification.SignalSession.Cli.Slots.blackBox_row_placed mmpl W))) + (LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat.isSameAccount_4k_placed_ok_on_stageP1_sat + hh.blackBox (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudgetAux.uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) @@ -1438,12 +1438,15 @@ private theorem cliInitBobV1FrozenOkPlaced4K [LibsignalFullPlacement] {M : Alloc hh.codecHooks.dealloc (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_sessionMemcpyRegion_budget_sat mmpl gh W hG) - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudget.pqxdhAccept_opt_fields_responder_full_placed_ok_of_block + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudgetSat.pqxdhAccept_opt_fields_responder_full_placed_ok_of_block_bb_sat (callerProg := lsProg_75 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 75) (cliModelPrims_structural X W) (CryptoVerification.SignalSession.Cli.RunProofs.Poll.cliModelPrims_matchCrypto X W) - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudget.cliResponderPqxdhHookContractsPlaced_of_hookSat - X mmpl gh W hG hh.codecHooks.alloc hh.codecHooks.dealloc + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetBbSat.cliResponderPqxdhHookContractsPlaced_of_hookSat_bb_sat + X mmpl gh W hG + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_sessionMemsetRegion_budget_sat + mmpl gh W hG) + hh.blackBox hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_noAllocShimBudget_of_withVmPreserved hh.codecHooks.shim)) (hookSat_framelessMemcpy_of_vm (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_framelessMemcpy_budget_sat @@ -1466,12 +1469,15 @@ private theorem cliInitBobErrOwnedFrozen4K_ok [LibsignalFullPlacement] {M : Allo (AcceptOptFieldsEnv (ofSignalPqxdhPrimitives (modelPrims X ⟨W.C, W.Q⟩)))) := by have h75 := LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.InitBobErrOwnedPlacedBudget.initializeBobSession_err_owned_frozen_placed_ok_of_accept - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudget.pqxdhAccept_err_owned_responder_full_placed_ok_of_block + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudgetSat.pqxdhAccept_err_owned_responder_full_placed_ok_of_block_bb_sat (callerProg := lsProg_75 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 75) (cliModelPrims_structural X W) (CryptoVerification.SignalSession.Cli.RunProofs.Poll.cliModelPrims_matchCrypto X W) - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudget.cliResponderPqxdhHookContractsPlaced_of_hookSat - X mmpl gh W hG hh.codecHooks.alloc hh.codecHooks.dealloc + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.Stage2V1BasePlacedBudgetBbSat.cliResponderPqxdhHookContractsPlaced_of_hookSat_bb_sat + X mmpl gh W hG + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_sessionMemsetRegion_budget_sat + mmpl gh W hG) + hh.blackBox hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_noAllocShimBudget_of_withVmPreserved hh.codecHooks.shim)) (hookSat_framelessMemcpy_of_vm (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_framelessMemcpy_budget_sat diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1KitsPlacedBudgetAux.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1KitsPlacedBudgetAux.lean index 54179fcce..84ecae146 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1KitsPlacedBudgetAux.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage2V1KitsPlacedBudgetAux.lean @@ -200,7 +200,7 @@ private theorem toSkeletonRunHooks [LibsignalPlacement] {M : AllocCostModel} { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } /-- Disjunction envelope for `decode_signed_pre_key` / `decode_kyber_pre_key` (Block `595`). -/ def CliSpkDecodeEnv (bs : List (BitVec 8)) (evs : List AllocEvent) : Prop := diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage3GenInstPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage3GenInstPlacedBudget.lean index b2c72a88d..3010640cf 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage3GenInstPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage3GenInstPlacedBudget.lean @@ -1153,14 +1153,14 @@ open CryptoVerification ( open CryptoVerification.CliHandshake.RespClosurePlaced (instIsLsBlockProg_518) open CryptoVerification.E2E.Pqxdh.WireEntries (DistinctSid) open CryptoVerification.LibsignalPublicApiRepr (RecordGhost) -open CryptoVerification.LibsignalTripleRatchet (SeedsLen32 SpqrModel extHookStack) +open CryptoVerification.LibsignalTripleRatchet (SeedsLen32 SpqrModel) open CryptoVerification.LibsignalTripleRatchetRepr (UuidParser) open CryptoVerification.SignalSession ( lsRustAllocSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli ) open CryptoVerification.SignalSession.Cli.RunGlue (cliExternsPlaced_row cliGhostExterns_shim) open CryptoVerification.SignalSession.Cli.Slots ( - cliGhostExterns_panic_handle_error cliGhostExterns_sat_of_cliExternsPlaced + cliGhostExterns_panic_handle_error ) open LibsignalBinary.Heap ( rustCliAllocBudgetSpec rustCliDeallocBudgetSpec rustCliReallocBudgetSpec @@ -1201,7 +1201,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.Stag open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_framelessMemcpy_budget_sat cliExternsPlaced_realloc_budget_sat - cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemmove_budget_sat + cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_shim_budget_sat ) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (framelessMemcpyBudgetSpec) @@ -2285,8 +2285,6 @@ theorem cliVerNe1e04_full_placed_ok [LibsignalFullPlacement] ((show lsRustDeallocSymCli = lsRustDeallocSym by decide) ▸ cliExternsPlaced_dealloc_budget_sat mmpl gh W hG) (cli_framelessMemcpy_sat_frz mmpl gh W hG) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W extHookStack)) (cliGhostExterns_panic_handle_error mmpl gh W) (chainMerge5CroPlacedOkExt_cli mmpl gh W hG) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage4V1InstPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage4V1InstPlaced.lean index da125ea23..df6282ea8 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage4V1InstPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage4V1InstPlaced.lean @@ -65,7 +65,7 @@ open CryptoVerification.SignalSession.Cli.KitInst hiding cliPreKeyStoreSpecPlaced cliSignedPreKeyStoreSpecPlaced cliKyberPreKeyStoreSpecPlaced cliPreKeyStoreSpecPlaced_quiet cliSignedPreKeyStoreSpecPlaced_quiet open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer - (CliGhostHooks cliGhostExterns cliGhostExterns_other) + (CliGhostHooks cliGhostExterns) private theorem panic_absorb_extra_placed {φ : Prop} {extra R : SepProp} {m : Memory} (h : m ⊨ (⌜φ⌝ ∗ anyHeap) ∗ (extra ∗ R)) : m ⊨ (⌜φ⌝ ∗ anyHeap) ∗ R := by @@ -125,39 +125,11 @@ theorem cliIdKitPlacedOkI_full [LibsignalPlacement] {A : RustAlloc} {H : Libsign simp only [sepExists_sepConj_left, sepExists_sepConj_right, satisfies_sepExists] at hpost ⊢ obtain ⟨ans, hm⟩ := hpost; rw [saveUpd_own_placed]; exact ⟨ans, Eq.mp (congrArg (sf.mem ⊨ ·) (by ac_rfl)) hm⟩ -set_option linter.unusedSimpArgs false in private theorem withPanics_cliGhostExterns_eq (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : Rust.withPanics (cliGhostExterns gh (cliExternsPlaced mmpl W)) = - cliGhostExterns gh (cliExternsPlaced mmpl W) := by - funext n - by_cases hp : Rust.isPanicSymbol n = true - · have hother : cliGhostExterns gh (cliExternsPlaced mmpl W) n = cliExternsPlaced mmpl W n := - cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, lsRustAllocZeroedSymCli, lsRustNoAllocShimSymCli, lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsReadFileSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsReadStdinSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemsetSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemcpySym] at hp) - unfold Rust.withPanics - rw [hother] - unfold cliExternsPlaced isCliPanicSymbolPlaced - simp [hp] - · simp [Rust.withPanics, hp] - -theorem cliGhostExterns_blackBox (mmpl : Obj.MultiPlacement) - (gh : CliGhostHooks) (W : CliHooks) : - cliGhostExterns gh (cliExternsPlaced mmpl W) lsBlackBoxU8Sym = - some CryptoVerification.LibsignalSession.blackBoxHook := - (cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_row mmpl W - (List.mem_append_right _ (List.mem_of_getElem? (i := 11) rfl))) + cliGhostExterns gh (cliExternsPlaced mmpl W) := + CryptoVerification.SignalSession.Cli.RunGlue.withPanics_cliGhostExterns mmpl gh W theorem cliSerContractsX_placed_ok [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) @@ -171,11 +143,6 @@ theorem cliSerContractsX_placed_ok [LibsignalPlacement] (mmpl : Obj.MultiPlaceme ((show CryptoVerification.LibsignalTripleRatchet.noAllocShimSpec = CryptoVerification.LibsignalTripleRatchet.sessionShimSpec from rfl) ▸ hh.codecHooks.shim) - ⟨hookMemmove, - (cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_memmove mmpl W), - hookMemmove_trace_ok Proofs.libsignal.Stage1X.extHookStack⟩ (by refine ProofLib.HookSat.mono hh.codecHooks.memcpy fun ⟨dst, src, bs⟩ R s0 hpre => ⟨(dst, src, bs), stackAt s0.sp extHookStack ∗ R, ?_, fun sf hpost => ?_⟩ @@ -252,11 +219,11 @@ theorem stageP4Matched_placed_inst [LibsignalPlacement] (hDropNz : lsmpl.base 54 have hSvt : SessionOnlyVtablesPlacedOk kit := cliPollSess_vtablesPlacedOk F0 Slots.scopeKit peer σ hDropNz have hIkit : IdentityStoreKitPlacedOkI ikit (cliGhostExterns gh (cliExternsPlaced mmpl W)) := cliIdKitPlacedOkI_full - (IdKit.cliIdKitOkIE_placed + (IdKit.cliIdKitOkIE_placed_sat (readProg := dpPollProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) (jRead := 518) hDropNz (fun _ hp => hp.2) hh (StoreKit.subroutine_ok_withLsCodeRoLoaded_of_plain hread) - (cliGhostExterns_blackBox mmpl gh W) + hh.blackBox (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (by decide) (by decide)) have hIvt : IdentityVtablesPlacedOk ikit := cliPollId_vtablesPlacedOk F0 peer σ hDropNz @@ -1303,11 +1270,11 @@ theorem stageP4PathA_placed_inst [LibsignalPlacement] (hDropNz : lsmpl.base 547 have hSvt : SessionOnlyVtablesPlacedOk kit := cliPollSess_vtablesPlacedOk F0 Slots.scopeKit peer σ hDropNz have hIkit : IdentityStoreKitPlacedOkI ikit (cliGhostExterns gh (cliExternsPlaced mmpl W)) := cliIdKitPlacedOkI_full - (IdKit.cliIdKitOkIE_placed + (IdKit.cliIdKitOkIE_placed_sat (readProg := dpPollProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) (jRead := 518) hDropNz (fun _ hp => hp.2) hh (StoreKit.subroutine_ok_withLsCodeRoLoaded_of_plain hread) - (cliGhostExterns_blackBox mmpl gh W) + hh.blackBox (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (by decide) (by decide)) have hIvt : IdentityVtablesPlacedOk ikit := cliPollId_vtablesPlacedOk F0 peer σ hDropNz diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage4V1InstPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage4V1InstPlacedBudget.lean index b6962275a..457a9de81 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage4V1InstPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/DecryptPrekey/Poll/StagesInst/Stage4V1InstPlacedBudget.lean @@ -56,7 +56,7 @@ open Arm64 Arm64.Obj Arm64.Process ProofLib SepProp open CryptoGames.LibsignalSession (IdentityKey PublicKey) open CryptoGames.LibsignalSessionApi (IdentityChange Session SessionRecord) open CryptoVerification - (IsLsBlockProg LibsignalHooks LibsignalPlacement libsignalMutatedBlocks lsBlackBoxU8Sym + (IsLsBlockProg LibsignalHooks LibsignalPlacement libsignalMutatedBlocks ls_hook_ok_ultra_of_mem lsmpl lsρ withLsCodeLoaded) open CryptoVerification.RustHeap (RustAlloc) open CryptoVerification.E2E.Record (encodeRecord) @@ -66,8 +66,7 @@ open CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Kits (SessionExtraRel stageP4CallStack stageP4EnvOk stageP4Quiet) open CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Matched (stageP4MatchedCallStack) open CryptoVerification.LibsignalTripleRatchet - (doReserveStackX extHookStack hookMemcpy_trace_ok hookMemmove_trace_ok - noAllocShimSpec sessionMemcpySpec sessionMemmoveSpec) + (doReserveStackX extHookStack noAllocShimSpec sessionMemcpySpec) open CryptoVerification.LibsignalTripleRatchetRepr (AddrGhost SessionGhost) open CryptoVerification.LibsignalPublicApiRepr (AddrVal RecordGhost) open CryptoVerification.LibsignalPublicApi.StoreKit @@ -83,8 +82,7 @@ open CryptoVerification.SignalSession.Cli (DirGhost IdGhost KpkMarkPollGhost KyberGhost PkPollGhost ReadRule cliIdentityVtSym cliSessionVtSym dirAt keyName kpkMarkBoxAt kpkMarkOf pkBoxAt pkRemoveFutVtSym pkRemoveOf pkRemoveOutAt) -open CryptoVerification.SignalSession.Cli.MainHops - (cliExternsPlaced_memmove cliIo cliWrOk main_cliExternsPlaced_row) +open CryptoVerification.SignalSession.Cli.MainHops (cliIo cliWrOk) open CryptoVerification.SignalSession.Cli.Placed (lsProg_570 lsProg_575 lsProg_578 lsProg_589 lsProg_597 lsProg_610) open CryptoVerification.SignalSession.Cli.RunSkeleton (RunBudgets) @@ -102,7 +100,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll cliPollPk_vtablesPlacedOk cliPollSessKitPlaced cliPollSess_vtablesPlacedOk dpPollEntryPlaced dpPollProgPlaced) open LibsignalBinary.Heap - (AllocCostModel AllocEvent BudgetLimits FitsEnv FreeOnlyEvs RustCliAllocBudget SeqEnv VmPreserved + (AllocCostModel AllocEvent BudgetLimits FitsEnv FreeOnlyEvs RustCliAllocBudget SeqEnv rustCliDeallocBudgetSpec) open LibsignalBinary.Proofs.PublicApi.StoreKit.PreKeyStoreKitBudget (BoxAllocEnv PreKeyStoreBudgetEnv kitPreKeyRemovePollSpec kitPreKeyRemovePollSpecE @@ -127,11 +125,10 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Dir.Decimal.ExecPlacedBudget (Deci open LibsignalBinary.Proofs.SignalSession.Cli.Dir.Get.PlacedBudgetAux1a (DirGetEnv) open LibsignalBinary.Proofs.SignalSession.Cli.Dir.Path.PlacedBudget (PathEnv) open LibsignalBinary.Proofs.SignalSession.Cli.Dir.Put.PlacedBudgetAux (DirPutEnv) -open LibsignalBinary.Heap.SpecBudget (hookSat_withVmPreserved withVmPreserved) -open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget - (sessionMemcpyBudgetSpec sessionMemmoveBudgetSpec sessionShimBudgetSpec) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionShimBudgetSpec) open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer - (CliGhostHooks cliGhostExterns cliGhostExterns_other) + (CliGhostHooks cliGhostExterns) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsXCliPlaced ReadFileRuleEnv pkRemovePollSpecPlaced pkShimSpecPlaced readFileSpecPlaced sessDeserializeSpecPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Store.PkShimsPlacedBudget (pkRemoveShim_placed_ok_of_deps) @@ -146,7 +143,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.SessionKitOkCliPlacedBudge cliSessKitOkSE_placed cliSessKitOkSE_seqFree_placed cliSessionKitDefaultBudgetEnv cliSessionKitSeqFreeBudgetEnv) open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.IdentityKitOkPlacedBudget - (cliIdFutDrop_rocl_placed_ok cliIdKitOkIE_placed cliIdentityKitDefaultBudgetEnv) + (cliIdFutDrop_rocl_placed_ok cliIdKitOkIE_placed_sat cliIdentityKitDefaultBudgetEnv) open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.KyberMarkFitPlacedBudget (cliKpkMarkShim_placed_ok cliKpkStoreBudgetEnvPlaced cliKpkStoreSpecPlaced_markPoll_of_env) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget @@ -163,15 +160,7 @@ private theorem toSkeletonRunHooks [LibsignalPlacement] {M : AllocCostModel} { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } - -private theorem hookMemcpy_vm_local (s : State) : VmPreserved s (hookMemcpy s) := - ⟨⟨rfl, rfl, rfl⟩, rfl, - fun a => congrFun (LibsignalBinary.Heap.IfaceBudgetLemmas.perm_writeBytes_norm _ _ _) a, - fun _ _ _ => rfl⟩ - -private theorem hookMemmove_vm_local (s : State) : VmPreserved s (hookMemmove s) := - hookMemcpy_vm_local s + formatInner := hh.formatInner, blackBox := hh.blackBox } theorem cliSerContractsX_placed_ok [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -180,16 +169,6 @@ theorem cliSerContractsX_placed_ok [LibsignalPlacement] {M : AllocCostModel} SerContractsXPlaced M A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := SerContractsXPlaced.of_hooks hh.codecHooks.alloc hh.codecHooks.dealloc hh.codecHooks.realloc ((show withVmPreserved noAllocShimSpec = sessionShimBudgetSpec from rfl) ▸ hh.codecHooks.shim) - (by - let hlookup : cliGhostExterns gh (cliExternsPlaced mmpl W) "memmove" = some hookMemmove := - (cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_memmove mmpl W) - exact (show withVmPreserved (sessionMemmoveSpec extHookStack) = - sessionMemmoveBudgetSpec extHookStack from rfl) ▸ - hookSat_withVmPreserved ⟨hookMemmove, hlookup, hookMemmove_trace_ok extHookStack⟩ - fun f hf s => by - rw [hlookup] at hf; injection hf with hfg; subst hfg; exact hookMemmove_vm_local s) (by refine ProofLib.HookSat.mono hh.codecHooks.memcpy fun ⟨dst, src, bs⟩ R s0 hpre => ⟨(dst, src, bs), stackAt s0.sp extHookStack ∗ R, ?_, fun sf hpost => ?_⟩ @@ -230,35 +209,8 @@ private theorem saveUpd_own_placed (rd : ReadRule) (F0 : FsFiles) (g : IdGhost) private theorem withPanics_cliGhostExterns_eq (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : Rust.withPanics (cliGhostExterns gh (cliExternsPlaced mmpl W)) = - cliGhostExterns gh (cliExternsPlaced mmpl W) := by - funext name - by_cases hp : Rust.isPanicSymbol name = true - · have hother : cliGhostExterns gh (cliExternsPlaced mmpl W) name = cliExternsPlaced mmpl W name := - cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocSymCli, CryptoVerification.SignalSession.lsRustDeallocSymCli, CryptoVerification.SignalSession.lsRustReallocSymCli, CryptoVerification.SignalSession.lsRustAllocZeroedSymCli, CryptoVerification.SignalSession.lsRustNoAllocShimSymCli, CryptoVerification.SignalSession.lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocSymCli, CryptoVerification.SignalSession.lsRustDeallocSymCli, CryptoVerification.SignalSession.lsRustReallocSymCli, CryptoVerification.SignalSession.lsRustAllocZeroedSymCli, CryptoVerification.SignalSession.lsRustNoAllocShimSymCli, CryptoVerification.SignalSession.lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocSymCli, CryptoVerification.SignalSession.lsRustDeallocSymCli, CryptoVerification.SignalSession.lsRustReallocSymCli, CryptoVerification.SignalSession.lsRustAllocZeroedSymCli, CryptoVerification.SignalSession.lsRustNoAllocShimSymCli, CryptoVerification.SignalSession.lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocSymCli, CryptoVerification.SignalSession.lsRustDeallocSymCli, CryptoVerification.SignalSession.lsRustReallocSymCli, CryptoVerification.SignalSession.lsRustAllocZeroedSymCli, CryptoVerification.SignalSession.lsRustNoAllocShimSymCli, CryptoVerification.SignalSession.lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocSymCli, CryptoVerification.SignalSession.lsRustDeallocSymCli, CryptoVerification.SignalSession.lsRustReallocSymCli, CryptoVerification.SignalSession.lsRustAllocZeroedSymCli, CryptoVerification.SignalSession.lsRustNoAllocShimSymCli, CryptoVerification.SignalSession.lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsRustAllocSymCli, CryptoVerification.SignalSession.lsRustDeallocSymCli, CryptoVerification.SignalSession.lsRustReallocSymCli, CryptoVerification.SignalSession.lsRustAllocZeroedSymCli, CryptoVerification.SignalSession.lsRustNoAllocShimSymCli, CryptoVerification.SignalSession.lsStringCloneSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsReadFileSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsReadStdinSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemsetSym] at hp) - (fun h => by subst h; simp [Rust.isPanicSymbol, CryptoVerification.SignalSession.lsMemcpySym] at hp) - unfold Rust.withPanics - rw [hother] - unfold cliExternsPlaced isCliPanicSymbolPlaced - simp [hp] - · simp [Rust.withPanics, hp] - -theorem cliGhostExterns_blackBox (mmpl : Obj.MultiPlacement) - (gh : CliGhostHooks) (W : CliHooks) : - cliGhostExterns gh (cliExternsPlaced mmpl W) lsBlackBoxU8Sym = - some CryptoVerification.LibsignalSession.blackBoxHook := - (cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_row mmpl W - (List.mem_append_right _ (List.mem_of_getElem? (i := 11) rfl))) + cliGhostExterns gh (cliExternsPlaced mmpl W) := + CryptoVerification.SignalSession.Cli.RunGlue.withPanics_cliGhostExterns mmpl gh W /-- Retag `IdentityStoreBudgetEnv` from `cliIdentityKitSpecPlaced` to `cliIdStoreSpecFullPlaced`. -/ def fullIdKitBudgetEnv [LibsignalPlacement] {A : RustAlloc} @@ -475,11 +427,11 @@ theorem cliPollId_kitPlacedOkI [LibsignalPlacement] {M : AllocCostModel} (cliPollIdBudgetEnv A.repAlloc F0 peer (cliKitStk B) ReadEnv) (cliGhostExterns gh (cliExternsPlaced mmpl W)) := cliIdKitPlacedOkI_full - (cliIdKitOkIE_placed + (cliIdKitOkIE_placed_sat (readProg := dpPollProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) (jRead := 518) hDropNz (fun _ hp => hp.2) (toSkeletonRunHooks hh) (subroutine_ok_withLsCodeRoLoaded_of_plain hRead) - (cliGhostExterns_blackBox mmpl gh W) + hh.blackBox (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (by decide) (by decide)) @@ -535,7 +487,7 @@ private theorem cliPollKpk_markPoll_rocl [LibsignalPlacement] {M : AllocCostMode (getProg := lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (getBlk := 589) (putProg := lsProg_570 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (putBlk := 570) (stk := (cliKitStk B).kpkMarkPoll) - hh.alloc hh.panics hh.bcmp hDecimal hGet hPut + hh.alloc hh.panics hh.bcmp.of_keepsFs hDecimal hGet hPut (hh.fs (lsProg_578 (cliGhostExterns gh (cliExternsPlaced mmpl W))) 578) (Nat.le_refl _) hblk let baseKit := cliKpkStoreSpecPlaced A.repAlloc cliIo.rd F0 cliWrOk kpkId spkId kbk diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlaced.lean index 8fd014f43..ca2be61e4 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlaced.lean @@ -14,8 +14,10 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Glue.BcmpHook public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Glue.BcmpHookPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Glue.FsTraced public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Glue.FsTracedPlaced +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSat public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlaced +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat public import LibsignalBinary.Proofs.RecordCodecs.Assembly public import LibsignalBinary.Proofs.SessionRecordAt.Hooks2.Ser.HSerX public import LibsignalBinary.Proofs.TripleRatchet.Hkdf.Extract @@ -58,6 +60,8 @@ open CryptoVerification.SignalSession.Cli.RunGlue open CryptoVerification.SignalSession.Cli.RunSkeleton open CryptoVerification.SignalSession.Cli.RunCompose open CryptoVerification.SignalSession.Cli.RunProofs +open CryptoVerification.SignalSession.Cli.Slots (durationSinceEpochAllocSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) /-! ## `SepWPp` / `SepWP` `LibsignalCodeRoLoaded` combinator -/ @@ -106,14 +110,6 @@ theorem traceFsSound_cliGhostPlaced [LibsignalPlacement] (mmpl : MultiPlacement) TraceFsSound prog := RunGlue.traceFsSound_lsProg_cli_ghost mmpl g W hFs -theorem bcmp_row_placed (mmpl : MultiPlacement) (W : CliHooks) : - (cliBcmpName, cliBcmpHook W.bcmp) ∈ cliHookTablePlaced mmpl W := - RunGlue.bcmp_row_placed mmpl W - -theorem cli_hookSat_bcmp_placed (mmpl : MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) cliBcmpName cliBcmpSpec := - RunGlue.cli_hookSat_bcmp_placed mmpl W - /-! ## KEM encapsulate symbol and `RunHooksPlaced` bundle -/ /-- Mangled symbol name of `libcrux_ml_kem::mlkem1024::kyber::encapsulate`. -/ @@ -143,10 +139,12 @@ structure RunHooksPlaced [LibsignalPlacement] (W : CliHooks) (A : RustAlloc) dh : HookSat H lsDiffieHellmanSym (diffieHellmanSpec W.C.X) sharedDrop : HookSat H lsSharedSecretDropSym zeroizeSecretSpec staticDrop : HookSat H lsStaticSecretDropSym zeroizeSecretSpec - blackBox : H lsBlackBoxSym = some CryptoVerification.LibsignalSession.blackBoxHook + blackBox : + HookSat H lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat hkdf : HkdfPlacedHooks W.C.F H kemEncaps : H lsKemEncapsSym = some (E2E.kemEncapsHook W.Q.encaps) - durationSince : H lsDurationSinceSym = some durationSinceExactHook + durationSince : HookSat H lsDurationSinceSym (withLsRet durationSinceEpochAllocSpec) panic_alloc : H "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" = some Rust.panicked panic_raw : H "_RNvNtCs69KKACWg7bl_5alloc7raw_vec12handle_error" = some Rust.panicked panic_sym : ∀ s, s ∈ cliPanicSymbolsPlaced → H s = some Rust.panicked diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlacedBudget.lean index 58a8bc3da..b4fea716e 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlacedBudget.lean @@ -11,12 +11,14 @@ module public import LibsignalBinary.Heap.RustStdAllocBudgetBridge public import LibsignalBinary.Heap.SpecBudget +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat public import LibsignalBinary.Proofs.RecordCodecs.AssemblyBudget public import LibsignalBinary.Proofs.SessionRecordAt.Hooks2.Ser.HSerXBudget public import LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.HooksPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.Run.SkeletonPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.SetUnackEpochPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget public import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat import Arm64.Trusted.Spec.Hoare @@ -55,7 +57,7 @@ open CryptoVerification.LibsignalTripleRatchet zeroizeSecretSpec) open CryptoVerification.RecordCodecs.Placed (blkPl_18 blkPl_65 blkPl_84 lsProg_18 lsProg_65 lsProg_84) open CryptoVerification.SignalSession - (CliHooks cliExternsPlaced cliPanicSymbolsPlaced durationSinceExactHook lsBlackBoxSym + (CliHooks cliExternsPlaced cliPanicSymbolsPlaced lsBlackBoxSym lsCompress256Sym lsDiffieHellmanSym lsDurationSinceSym lsFormatInnerSym lsFromUtf8Sym lsMemcpySym lsMemrchrSym lsMemsetSym lsPubFromSecretSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli @@ -70,9 +72,9 @@ open CryptoVerification.SignalSession.Cli.RunGlue open CryptoVerification.SignalSession.Cli.RunProofs.Initiate (lsKemEncapsSym traceFsSound_cliGhostPlaced) open CryptoVerification.SignalSession.Cli.Slots - (blackBox_row_placed cliGhostExterns_panic_all cliGhostExterns_panic_handle_alloc_error + (cliGhostExterns_panic_all cliGhostExterns_panic_handle_alloc_error cliGhostExterns_panic_handle_error cliGhostExterns_sat_of_cliExternsPlaced - compress256_row_placed durationSince_row_placed kemEncaps_row_placed) + compress256_row_placed kemEncaps_row_placed) open CryptoVerification.SpqrV1.Alloc (sessionMemcpyRegionROSpec) open LibsignalBinary.Heap (AllocCallPreserved AllocCostModel AllocEvent BudgetLimits RustCliAllocBudget VmPreserved @@ -97,26 +99,32 @@ open LibsignalBinary.Proofs.SessionRecordAt.Hooks2.Ser.RecordSerializeExtBudget open LibsignalBinary.Proofs.SessionRecordAt.Hooks2.SerDefsXBudget (SerContractsXPlaced SerializeEnvX encodeRawSpecX serializeSpecX) open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer - (BaseHelperRows cliExternsPlaced_baseHelperRows - cliGhostExterns_memmove_eq shim_budget_sat_of_eq) + (BaseHelperRows cliExternsPlaced_baseHelperRows shim_budget_sat_of_eq) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (hookSat_cliGhostExterns_of_extraOk) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks CliGhostSpqrAllocHooks allocContractsFsPlaced_of_hooks allocContractsXCliPlaced_of_hooks cliExternsPlaced_allocMemcpyVm_budget_sat - cliExternsPlaced_alloc_budget_sat - cliExternsPlaced_bcmp_budget_sat cliExternsPlaced_dealloc_budget_sat + cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_derivePublicKeyBytes_budget_sat cliExternsPlaced_diffieHellman_budget_sat - cliExternsPlaced_e2eBcmp_budget_sat cliExternsPlaced_framelessMemcpy_budget_sat + cliExternsPlaced_framelessMemcpy_budget_sat cliExternsPlaced_memcpyRegionRO_budget_sat cliExternsPlaced_noAllocShim_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemcpy_budget_sat - cliExternsPlaced_sessionMemmove_budget_sat cliExternsPlaced_sharedSecretDrop_budget_sat - cliExternsPlaced_staticSecretDrop_budget_sat cliGhostExterns_sessionMemcpy_budget_sat + cliGhostExterns_bcmp_keepsFs_budget_sat cliGhostExterns_blackBoxSat_budget_sat + cliGhostExterns_e2eBcmp_budget_sat + cliGhostExterns_sessionMemcpy_budget_sat + cliGhostExterns_sharedSecretDrop_budget_sat cliGhostExterns_staticSecretDrop_budget_sat codecHooksPlaced_of_hooks) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsFsPlaced AllocContractsXCliPlaced) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat (HkdfPlacedHooksExactSat) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemcpyRegionBudgetSpec sessionMemsetRegionBudgetSpec sessionShimBudgetSpec) +open LibsignalBinary.Proofs.HookDischarge.Libc.Common (keepsFs) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.SetUnackEpochPlacedBudget + (durationSinceEpochAllocBudgetSpec) /-! ## Auxiliary `HkdfPlacedHooks` and memory-hook instances -/ @@ -215,7 +223,7 @@ theorem cliExternsPlaced_allocMemcpyVm_sat {H : LibsignalHooks} theorem serContractsXPlaced_of_ghost [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (W : CliHooks) (baseExt : LibsignalHooks) {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} - (g : CliGhostHooks) (hBase : BaseHelperRows mmpl W baseExt) + (g : CliGhostHooks) (_hBase : BaseHelperRows mmpl W baseExt) (hG : CliGhostAllocHooks M A lim g) : SerContractsXPlaced M A lim (cliGhostExterns g baseExt) := SerContractsXPlaced.of_hooks @@ -223,8 +231,6 @@ theorem serContractsXPlaced_of_ghost [LibsignalPlacement] ⟨g.dealloc, cliGhostExterns_dealloc g baseExt, hG.dealloc⟩ ⟨g.realloc, cliGhostExterns_realloc g baseExt, hG.realloc⟩ (shim_budget_sat_of_eq baseExt hG.shim_eq) - (hookSat_of_eq (cliGhostExterns_memmove_eq mmpl W g hBase) - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W extHookStack)) (cliGhostExterns_sessionMemcpy_budget_sat baseExt hG extHookStack) theorem serContractsXPlaced_of_hooks [LibsignalPlacement] (mmpl : Obj.MultiPlacement) @@ -254,7 +260,7 @@ structure RunHooksPlaced [LibsignalPlacement] (W : CliHooks) {M : AllocCostModel memsetRegionKeepsFs : HookSat H memsetName sessionMemsetRegionBudgetSpec.keepsFs allocMemcpyVm : HookSat H memcpyName allocMemcpyVmSpec memcpyRO : HookSat H memcpyName (withVmPreserved sessionMemcpyRegionROSpec) - bcmp : HookSat H cliBcmpName (withVmPreserved cliBcmpSpec) + bcmp : HookSat H cliBcmpName (withVmPreserved cliBcmpSpec).keepsFs e2eBcmp : HookSat H bcmpName (withVmPreserved e2eBcmpSpec) allocZeroed : HookSat H lsRustAllocZeroedSymCli (rustCliAllocBudgetSpec M A lim true) stringClone : HookSat H lsStringCloneSym (stringCloneBudgetSpec M A lim) @@ -263,10 +269,12 @@ structure RunHooksPlaced [LibsignalPlacement] (W : CliHooks) {M : AllocCostModel dh : HookSat H lsDiffieHellmanSym (withVmPreserved (diffieHellmanSpec W.C.X)) sharedDrop : HookSat H lsSharedSecretDropSym (withVmPreserved zeroizeSecretSpec) staticDrop : HookSat H lsStaticSecretDropSym (withVmPreserved zeroizeSecretSpec) - blackBox : H lsBlackBoxSym = some blackBoxHook + blackBox : + HookSat H lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat hkdf : HkdfPlacedHooksExactSat W.C.F H kemEncaps : H lsKemEncapsSym = some (kemEncapsHook W.Q.encaps) - durationSince : H lsDurationSinceSym = some durationSinceExactHook + durationSince : HookSat H lsDurationSinceSym (withLsRet (keepsFs durationSinceEpochAllocBudgetSpec)) panic_alloc : H "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" = some Rust.panicked panic_raw : H "_RNvNtCs69KKACWg7bl_5alloc7raw_vec12handle_error" = some Rust.panicked panic_sym : ∀ s, s ∈ cliPanicSymbolsPlaced → H s = some Rust.panicked @@ -306,10 +314,8 @@ theorem RunHooksPlaced.of_hooks [LibsignalPlacement] exact ⟨f, cliGhostExterns_memset_some g _ hf, (hookOk_withVmPreserved hReg hVm).keepsFs hFs⟩ allocMemcpyVm := cliExternsPlaced_allocMemcpyVm_budget_sat mmpl g W hG.toCliGhostAllocHooks memcpyRO := cliExternsPlaced_memcpyRegionRO_budget_sat mmpl g W hG.toCliGhostAllocHooks - bcmp := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_bcmp_budget_sat mmpl W) - e2eBcmp := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_e2eBcmp_budget_sat mmpl W) + bcmp := cliGhostExterns_bcmp_keepsFs_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk + e2eBcmp := cliGhostExterns_e2eBcmp_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk allocZeroed := ⟨g.allocZeroed, cliGhostExterns_allocZeroed g _, hG.allocZeroed⟩ stringClone := hStrClone formatInner := hFmtInner @@ -317,20 +323,25 @@ theorem RunHooksPlaced.of_hooks [LibsignalPlacement] (cliExternsPlaced_derivePublicKeyBytes_budget_sat mmpl W) dh := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W (cliExternsPlaced_diffieHellman_budget_sat mmpl W) - sharedDrop := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sharedSecretDrop_budget_sat mmpl W) - staticDrop := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W) - blackBox := (cliGhostExterns_other g _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W)) + sharedDrop := cliGhostExterns_sharedSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk + staticDrop := cliGhostExterns_staticSecretDrop_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk + blackBox := cliGhostExterns_blackBoxSat_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk hkdf := HkdfPlacedHooksExactSat.of_allocHooks hG.toCliGhostAllocHooks kemEncaps := (cliGhostExterns_other g _ (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)).trans (cliExternsPlaced_row mmpl W (kemEncaps_row_placed mmpl W)) - durationSince := (cliGhostExterns_other g _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (durationSince_row_placed mmpl W)) + durationSince := + hookSat_cliGhostExterns_of_extraOk g (cliExternsPlaced mmpl W) hG.extraOk + fun f _ hRow x R s0 hrun hpre hsp => by + obtain ⟨hkf, hsym, hout⟩ := + hRow.durationSinceEpochAlloc_budget_ok x R s0 hrun hpre hsp + refine ⟨hkf, hsym, ?_⟩ + rcases hout with ⟨hr, hc, hp⟩ | hrest + · refine Or.inl ⟨hr, hc, ?_⟩ + dsimp only [withLsRet, keepsFs] + rw [sepConj_assoc, satisfies_pure_sepConj] + exact ⟨hRow.fs_eq s0, hp⟩ + · exact Or.inr hrest panic_alloc := cliGhostExterns_panic_handle_alloc_error mmpl g W panic_raw := cliGhostExterns_panic_handle_error mmpl g W panic_sym := cliGhostExterns_panic_all mmpl g W @@ -342,7 +353,8 @@ theorem RunHooksPlaced.of_hooks [LibsignalPlacement] intro f hf; cases hf₀.symm.trans hf; exact hfsT, by obtain ⟨f₀, hf₀, _, _, _, _, _, _, _, _, hfsT⟩ := hG.memcpy - intro f hf; cases hf₀.symm.trans hf; exact hfsT⟩ + intro f hf; cases hf₀.symm.trans hf; exact hfsT, + hG.extraOk.fsT⟩ } theorem RunHooksPlaced.sessionShim [LibsignalPlacement] {W : CliHooks} {M : AllocCostModel} @@ -361,7 +373,10 @@ theorem RunHooksPlaced.toSkeletonRunHooksPlaced [LibsignalPlacement] {W : CliHoo {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} (hh : RunHooksPlaced W A lim H) (hUtf8 : ∀ stk : Nat, HookSat H lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec stk))) - (hMemrchr : ∀ stk : Nat, HookSat H lsMemrchrSym (withVmPreserved (memrchrSpec stk))) : + (hMemrchr : HookSat H lsMemrchrSym + (LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet.withLsRet + (withVmPreserved + (memrchrSpec CryptoVerification.LibsignalTripleRatchet.extHookStack)))) : LibsignalBinary.Proofs.SignalSession.Cli.Run.SkeletonPlacedBudget.RunHooksPlaced A lim H where alloc := hh.alloc allocFs := hh.allocFs @@ -375,6 +390,7 @@ theorem RunHooksPlaced.toSkeletonRunHooksPlaced [LibsignalPlacement] {W : CliHoo allocZeroed := hh.allocZeroed stringClone := hh.stringClone formatInner := hh.formatInner + blackBox := hh.blackBox theorem RunHooksPlaced.portDepsPlaced [LibsignalPlacement] {W : CliHooks} {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlacedBudgetBbSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlacedBudgetBbSat.lean index 5d8d561c8..8ae57a4d6 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlacedBudgetBbSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlacedBudgetBbSat.lean @@ -48,7 +48,7 @@ open CryptoVerification.LibsignalTripleRatchet noAllocShimSpec zeroizeSecretSpec) open CryptoVerification.RecordCodecs.Placed (blkPl_18 blkPl_65 blkPl_84 lsProg_18 lsProg_65 lsProg_84) open CryptoVerification.SignalSession - (CliHooks cliExternsPlaced cliPanicSymbolsPlaced durationSinceExactHook lsBlackBoxSym + (CliHooks cliExternsPlaced cliPanicSymbolsPlaced lsBlackBoxSym lsDiffieHellmanSym lsDurationSinceSym lsFormatInnerSym lsFromUtf8Sym lsMemrchrSym lsPubFromSecretSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli lsSharedSecretDropSym lsStaticSecretDropSym @@ -56,14 +56,9 @@ open CryptoVerification.SignalSession open CryptoVerification.SignalSession.Cli (cliBcmpName cliBcmpSpec) open CryptoVerification.SignalSession.Cli.MainHops (fromUtf8AsciiSpec memrchrSpec) open CryptoVerification.SignalSession.Cli.RunGlue - (CliGhostHooks IsFsC cliExternsPlaced_row cliGhostExterns cliGhostExterns_allocZeroed - cliGhostExterns_memcpy_some cliGhostExterns_memset_some cliGhostExterns_other hookNoop_fsT) + (CliGhostHooks IsFsC cliGhostExterns) open CryptoVerification.SignalSession.Cli.RunProofs.Initiate - (lsKemEncapsSym traceFsSound_cliGhostPlaced) -open CryptoVerification.SignalSession.Cli.Slots - (blackBox_row_placed cliGhostExterns_panic_all cliGhostExterns_panic_handle_alloc_error - cliGhostExterns_panic_handle_error cliGhostExterns_sat_of_cliExternsPlaced - durationSince_row_placed kemEncaps_row_placed) + (lsKemEncapsSym) open CryptoVerification.SpqrV1.Alloc (sessionMemcpyRegionROSpec) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits RustCliAllocBudget rustCliAllocBudgetSpec @@ -72,7 +67,8 @@ open LibsignalBinary.Heap.RustStdAllocBudgetBridge (allocMemcpyVmSpec rustAllocShimVmSpec stringCloneBudgetSpec) open LibsignalBinary.Heap.SpecBudget (formatInnerBudgetSpec withVmPreserved) open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat - (blackBoxSpecSat hookSat_blackBox_of_eq) + (blackBoxSpecSat) +open LibsignalBinary.Proofs.HookDischarge.Libc.Common (keepsFs) open LibsignalBinary.Proofs.RecordCodecs.AssemblyBudget (hookSat_sessionShimBudget_of_withVmPreserved identityKeyPair_tryFrom_placed_ok_of_hooks identityKey_decode_placed_ok_of_hooks portDepsPlaced_of_hooks @@ -88,18 +84,13 @@ open LibsignalBinary.Proofs.SessionRecordAt.Hooks2.Ser.RecordSerializeExtBudget (recordSerializeEnvSpecX recordSerializeSpecX) open LibsignalBinary.Proofs.SessionRecordAt.Hooks2.SerDefsXBudget (SerContractsXPlaced SerializeEnvX encodeRawSpecX serializeSpecX) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.HooksPlacedBudget - (RunHooksPlaced cliExternsPlaced_rustAllocShimVm_sat serContractsXPlaced_of_hooks) + (RunHooksPlaced) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.SetUnackEpochPlacedBudget + (durationSinceEpochAllocBudgetSpec) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (CliGhostSpqrAllocHooks allocContractsFsPlaced_of_hooks allocContractsXCliPlaced_of_hooks - cliExternsPlaced_allocMemcpyVm_budget_sat cliExternsPlaced_alloc_budget_sat - cliExternsPlaced_bcmp_budget_sat cliExternsPlaced_dealloc_budget_sat - cliExternsPlaced_derivePublicKeyBytes_budget_sat cliExternsPlaced_diffieHellman_budget_sat - cliExternsPlaced_e2eBcmp_budget_sat cliExternsPlaced_framelessMemcpy_budget_sat - cliExternsPlaced_memcpyRegionRO_budget_sat cliExternsPlaced_noAllocShim_budget_sat - cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat - cliExternsPlaced_sharedSecretDrop_budget_sat cliExternsPlaced_staticSecretDrop_budget_sat - codecHooksPlaced_of_hooks) + (CliGhostSpqrAllocHooks) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsFsPlaced AllocContractsXCliPlaced) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat (HkdfPlacedHooksExactSat) @@ -124,7 +115,7 @@ structure RunHooksPlacedBbSat [LibsignalPlacement] (W : CliHooks) {M : AllocCost memsetRegionKeepsFs : HookSat H memsetName sessionMemsetRegionBudgetSpec.keepsFs allocMemcpyVm : HookSat H memcpyName allocMemcpyVmSpec memcpyRO : HookSat H memcpyName (withVmPreserved sessionMemcpyRegionROSpec) - bcmp : HookSat H cliBcmpName (withVmPreserved cliBcmpSpec) + bcmp : HookSat H cliBcmpName (withVmPreserved cliBcmpSpec).keepsFs e2eBcmp : HookSat H bcmpName (withVmPreserved e2eBcmpSpec) allocZeroed : HookSat H lsRustAllocZeroedSymCli (rustCliAllocBudgetSpec M A lim true) stringClone : HookSat H lsStringCloneSym (stringCloneBudgetSpec M A lim) @@ -136,7 +127,7 @@ structure RunHooksPlacedBbSat [LibsignalPlacement] (W : CliHooks) {M : AllocCost blackBox : HookSat H lsBlackBoxSym blackBoxSpecSat hkdf : HkdfPlacedHooksExactSat W.C.F H kemEncaps : H lsKemEncapsSym = some (kemEncapsHook W.Q.encaps) - durationSince : H lsDurationSinceSym = some durationSinceExactHook + durationSince : HookSat H lsDurationSinceSym (withLsRet (keepsFs durationSinceEpochAllocBudgetSpec)) panic_alloc : H "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" = some Rust.panicked panic_raw : H "_RNvNtCs69KKACWg7bl_5alloc7raw_vec12handle_error" = some Rust.panicked panic_sym : ∀ s, s ∈ cliPanicSymbolsPlaced → H s = some Rust.panicked @@ -170,7 +161,7 @@ theorem RunHooksPlaced.toBbSat [LibsignalPlacement] {W : CliHooks} {M : AllocCos dh := h.dh sharedDrop := h.sharedDrop staticDrop := h.staticDrop - blackBox := hookSat_blackBox_of_eq h.blackBox + blackBox := h.blackBox hkdf := h.hkdf kemEncaps := h.kemEncaps durationSince := h.durationSince @@ -193,67 +184,39 @@ theorem RunHooksPlacedBbSat.of_hooks_bb_sat [LibsignalPlacement] (stringCloneBudgetSpec M A lim)) (hFmtInner : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsFormatInnerSym (formatInnerBudgetSpec M A lim)) : - RunHooksPlacedBbSat W A lim (cliGhostExterns g (cliExternsPlaced mmpl W)) where - alloc := allocContractsXCliPlaced_of_hooks mmpl g W hG.toCliGhostAllocHooks - allocFs := allocContractsFsPlaced_of_hooks mmpl g W hG.toCliGhostAllocHooks - codec := codecHooksPlaced_of_hooks mmpl g W hG.toCliGhostAllocHooks - ser := serContractsXPlaced_of_hooks mmpl g W hG.toCliGhostAllocHooks - shim := cliExternsPlaced_noAllocShim_budget_sat mmpl g W hG.shim_eq - shimVm := cliExternsPlaced_rustAllocShimVm_sat mmpl g W hG.shim_eq - rawAlloc := cliExternsPlaced_alloc_budget_sat mmpl g W hG.toCliGhostAllocHooks - rawDealloc := cliExternsPlaced_dealloc_budget_sat mmpl g W hG.toCliGhostAllocHooks - framelessMemcpy := cliExternsPlaced_framelessMemcpy_budget_sat mmpl g W hG.toCliGhostAllocHooks - sessionMemcpyRegion := - cliExternsPlaced_sessionMemcpyRegion_budget_sat mmpl g W hG.toCliGhostAllocHooks - memcpyRegionKeepsFs := by - rcases cliExternsPlaced_sessionMemcpyRegion_budget_sat mmpl g W hG.toCliGhostAllocHooks with - ⟨f, hf, hok⟩ - obtain ⟨f₀, hf₀, _, _, _, _, _, _, _, hfs₀, _⟩ := hG.memcpy - cases (cliGhostExterns_memcpy_some g (cliExternsPlaced mmpl W) hf₀).symm.trans hf - exact ⟨f, hf, hok.keepsFs hfs₀⟩ - memsetRegionKeepsFs := by - rcases cliExternsPlaced_sessionMemsetRegion_budget_sat mmpl g W hG.toCliGhostAllocHooks with - ⟨f, hf, hok⟩ - obtain ⟨f₀, hf₀, _, _, _, _, _, hfs₀, _⟩ := hG.memset - cases (cliGhostExterns_memset_some g (cliExternsPlaced mmpl W) hf₀).symm.trans hf - exact ⟨f, hf, hok.keepsFs hfs₀⟩ - allocMemcpyVm := cliExternsPlaced_allocMemcpyVm_budget_sat mmpl g W hG.toCliGhostAllocHooks - memcpyRO := cliExternsPlaced_memcpyRegionRO_budget_sat mmpl g W hG.toCliGhostAllocHooks - bcmp := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_bcmp_budget_sat mmpl W) - e2eBcmp := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_e2eBcmp_budget_sat mmpl W) - allocZeroed := ⟨g.allocZeroed, cliGhostExterns_allocZeroed g _, hG.allocZeroed⟩ - stringClone := hStrClone - formatInner := hFmtInner - pubFromSecret := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_derivePublicKeyBytes_budget_sat mmpl W) - dh := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_diffieHellman_budget_sat mmpl W) - sharedDrop := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sharedSecretDrop_budget_sat mmpl W) - staticDrop := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_staticSecretDrop_budget_sat mmpl W) - blackBox := hBb - hkdf := HkdfPlacedHooksExactSat.of_allocHooks hG.toCliGhostAllocHooks - kemEncaps := (cliGhostExterns_other g _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (kemEncaps_row_placed mmpl W)) - durationSince := (cliGhostExterns_other g _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (durationSince_row_placed mmpl W)) - panic_alloc := cliGhostExterns_panic_handle_alloc_error mmpl g W - panic_raw := cliGhostExterns_panic_handle_error mmpl g W - panic_sym := cliGhostExterns_panic_all mmpl g W - fs := traceFsSound_cliGhostPlaced mmpl g W - ⟨hG.alloc_fsT, hG.dealloc_fsT, hG.realloc_fsT, hG.allocZeroed_fsT, - hG.shim_eq ▸ hookNoop_fsT, hStrFsT, - by - obtain ⟨f₀, hf₀, _, _, _, _, _, _, hfsT⟩ := hG.memset - intro f hf; cases hf₀.symm.trans hf; exact hfsT, - by - obtain ⟨f₀, hf₀, _, _, _, _, _, _, _, _, hfsT⟩ := hG.memcpy - intro f hf; cases hf₀.symm.trans hf; exact hfsT⟩ + RunHooksPlacedBbSat W A lim (cliGhostExterns g (cliExternsPlaced mmpl W)) := + let h := RunHooksPlaced.of_hooks mmpl g W hG hStrFsT hStrClone hFmtInner + { alloc := h.alloc + allocFs := h.allocFs + codec := h.codec + ser := h.ser + shim := h.shim + shimVm := h.shimVm + rawAlloc := h.rawAlloc + rawDealloc := h.rawDealloc + framelessMemcpy := h.framelessMemcpy + sessionMemcpyRegion := h.sessionMemcpyRegion + memcpyRegionKeepsFs := h.memcpyRegionKeepsFs + memsetRegionKeepsFs := h.memsetRegionKeepsFs + allocMemcpyVm := h.allocMemcpyVm + memcpyRO := h.memcpyRO + bcmp := h.bcmp + e2eBcmp := h.e2eBcmp + allocZeroed := h.allocZeroed + stringClone := h.stringClone + formatInner := h.formatInner + pubFromSecret := h.pubFromSecret + dh := h.dh + sharedDrop := h.sharedDrop + staticDrop := h.staticDrop + blackBox := hBb + hkdf := h.hkdf + kemEncaps := h.kemEncaps + durationSince := h.durationSince + panic_alloc := h.panic_alloc + panic_raw := h.panic_raw + panic_sym := h.panic_sym + fs := h.fs } /-- Construct `RunHooksPlacedBbSat W A lim (cliGhostExterns g (cliExternsPlaced mmpl W))` from `CliGhostSpqrAllocHooks M A lim g` and `HookSat` witnesses for `String::clone` and `format_inner`. -/ @@ -267,12 +230,7 @@ theorem RunHooksPlacedBbSat.of_hooks [LibsignalPlacement] (hFmtInner : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsFormatInnerSym (formatInnerBudgetSpec M A lim)) : RunHooksPlacedBbSat W A lim (cliGhostExterns g (cliExternsPlaced mmpl W)) := - RunHooksPlacedBbSat.of_hooks_bb_sat mmpl g W hG - (hookSat_blackBox_of_eq - ((cliGhostExterns_other g _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W)))) - hStrFsT hStrClone hFmtInner + RunHooksPlaced.toBbSat (RunHooksPlaced.of_hooks mmpl g W hG hStrFsT hStrClone hFmtInner) /-- Project `sessionShimBudgetSpec` out of `RunHooksPlacedBbSat.shim`. -/ theorem RunHooksPlacedBbSat.sessionShim [LibsignalPlacement] {W : CliHooks} {M : AllocCostModel} @@ -293,7 +251,10 @@ theorem RunHooksPlacedBbSat.toSkeletonRunHooksPlaced [LibsignalPlacement] {W : C {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} (hh : RunHooksPlacedBbSat W A lim H) (hUtf8 : ∀ stk : Nat, HookSat H lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec stk))) - (hMemrchr : ∀ stk : Nat, HookSat H lsMemrchrSym (withVmPreserved (memrchrSpec stk))) : + (hMemrchr : HookSat H lsMemrchrSym + (LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet.withLsRet + (withVmPreserved + (memrchrSpec CryptoVerification.LibsignalTripleRatchet.extHookStack)))) : LibsignalBinary.Proofs.SignalSession.Cli.Run.SkeletonPlacedBudget.RunHooksPlaced A lim H where alloc := hh.alloc allocFs := hh.allocFs @@ -307,6 +268,7 @@ theorem RunHooksPlacedBbSat.toSkeletonRunHooksPlaced [LibsignalPlacement] {W : C allocZeroed := hh.allocZeroed stringClone := hh.stringClone formatInner := hh.formatInner + blackBox := hh.blackBox /-- Project `PortDepsPlaced M A lim H` (`RecordCodecs.AssemblyBudget`, incl. E4PORT) from `RunHooksPlacedBbSat`. -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlacedSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlacedSat.lean index 85847d489..c442113d2 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlacedSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/HooksPlacedSat.lean @@ -39,7 +39,7 @@ open CryptoVerification.RecordCodecsBinary (CodecHooksPlaced) open CryptoVerification.RustHeap (RustAlloc rustAllocSpec rustDeallocSpec) open CryptoVerification.SignalSession - (CliHooks cliPanicSymbolsPlaced durationSinceExactHook lsBlackBoxSym lsDiffieHellmanSym + (CliHooks cliPanicSymbolsPlaced lsBlackBoxSym lsDiffieHellmanSym lsDurationSinceSym lsFormatInnerSym lsPubFromSecretSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsSharedSecretDropSym lsStaticSecretDropSym lsStringCloneSym) @@ -47,9 +47,11 @@ open CryptoVerification.SignalSession.Cli (cliBcmpName cliBcmpSpec) open CryptoVerification.SignalSession.Cli.MainHops (AllocContractsFsPlaced AllocContractsXCliPlaced) open CryptoVerification.SignalSession.Cli.RunProofs.Initiate (RunHooksPlaced lsKemEncapsSym) +open CryptoVerification.SignalSession.Cli.Slots (durationSinceEpochAllocSpec) open CryptoVerification.SpqrV1.Alloc (sessionMemcpyRegionROSpec) open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat - (blackBoxSpecSat hookSat_blackBox_of_eq) + (blackBoxSpecSat) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) open Proofs.libsignal.Hooks2 (SerContractsXPlaced) /-- `HookSat` `black_box` sibling of `Initiate.RunHooksPlaced` (`HooksPlaced.lean:138`), @@ -78,13 +80,13 @@ structure RunHooksPlacedSat [LibsignalPlacement] (W : CliHooks) (A : RustAlloc) blackBox : HookSat H lsBlackBoxSym blackBoxSpecSat hkdf : HkdfPlacedHooks W.C.F H kemEncaps : H lsKemEncapsSym = some (kemEncapsHook W.Q.encaps) - durationSince : H lsDurationSinceSym = some durationSinceExactHook + durationSince : HookSat H lsDurationSinceSym (withLsRet durationSinceEpochAllocSpec) panic_alloc : H "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" = some Rust.panicked panic_raw : H "_RNvNtCs69KKACWg7bl_5alloc7raw_vec12handle_error" = some Rust.panicked panic_sym : ∀ s, s ∈ cliPanicSymbolsPlaced → H s = some Rust.panicked fs : ∀ {prog : Program} {i : Nat} [IsLsBlockProg prog i H], TraceFsSound prog -/-- Coercion `RunHooksPlaced → RunHooksPlacedSat` via `hookSat_blackBox_of_eq`. -/ +/-- Identity coercion `RunHooksPlaced → RunHooksPlacedSat`. -/ theorem RunHooksPlaced.toSat [LibsignalPlacement] {W : CliHooks} {A : RustAlloc} {H : LibsignalHooks} (h : RunHooksPlaced W A H) : RunHooksPlacedSat W A H where @@ -107,7 +109,7 @@ theorem RunHooksPlaced.toSat [LibsignalPlacement] {W : CliHooks} {A : RustAlloc} dh := h.dh sharedDrop := h.sharedDrop staticDrop := h.staticDrop - blackBox := hookSat_blackBox_of_eq h.blackBox + blackBox := h.blackBox hkdf := h.hkdf kemEncaps := h.kemEncaps durationSince := h.durationSince diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/LocalCalleesPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/LocalCalleesPlaced.lean index 929ef1809..2db940779 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/LocalCalleesPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/LocalCalleesPlaced.lean @@ -23,6 +23,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.ModelBridge +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedSat import LibsignalBinary.Proofs.TripleRatchet.Alloc.DerivePublicKeyBytes /-! @@ -199,12 +200,6 @@ structure SubsetA4InitCalleesPlaced [LibsignalPlacement] (A : RustAlloc) (mmpl : pqxdhHkdfExpand : ∀ (X : UnreachedPqxdhPrimitives), Pqxdh.Initiator.PqxdhHkdfExpandMultiInfoPlacedOk (modelPrims X ⟨W.C, W.Q⟩) ((CryptoVerification.blkPC_59).rebase (CryptoVerification.blkPl_59).base (cliGhostExterns gh (cliExternsPlaced mmpl W))) - ctEqSliceRO : - subroutine_ok - ((CryptoVerification.blkPC_207).rebase - (CryptoVerification.blkPl_207).base (cliGhostExterns gh (cliExternsPlaced mmpl W))) - (lsmpl.base 213) - (withLsCodeLoaded lsmpl ctEqSliceROSpec) newFromSlice : subroutine_ok ((CryptoVerification.LibsignalTripleRatchet.blkPC_54).rebase @@ -375,8 +370,8 @@ theorem rootKeyCreateChain_cli_placed_ok [LibsignalPlacement] {A : RustAlloc} (m (calleeProg := CryptoVerification.lsProg_40 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (Keys.createChain_placed_ok_of_contracts (keys_ls_subroutine_ok_of_block_cro - (Keys.calculateAgreement_placed_ok hh.dh hh.sharedDrop ha4.ctEqSliceRO hh.shim hh.rawAlloc - hh.staticDrop hh.panic_alloc)) + (LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedSat.calculateAgreement_placed_ok_unconditional_sat + hh.dh hh.sharedDrop hh.blackBox hh.shim hh.rawAlloc hh.staticDrop hh.panic_alloc)) hext40 (CryptoVerification.LibsignalTripleRatchet.subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded hexp40) (keys_ls_hook_ok_of_mem hh.rawDealloc)) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/LocalCalleesPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/LocalCalleesPlacedBudget.lean index 9367ffe67..4f9cd26cf 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/LocalCalleesPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/LocalCalleesPlacedBudget.lean @@ -34,7 +34,9 @@ import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.ModelBridge import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudgetAuxSat +import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderStore.SessionRecordCallees +import LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedBudgetSat import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat import ProofLib.SepLogic.WP.Apply @@ -81,7 +83,8 @@ open CryptoVerification.LibsignalPublicApi.StoreKit subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded withLsCodeRoLoaded) open CryptoVerification.LibsignalSpqrV1 (Params) open CryptoVerification.LibsignalTripleRatchet - (HkdfPlacedHooks extHookStack framelessMemcpySpec noAllocShimSpec uuidTryParseCodeSpec) + (HkdfPlacedHooks extHookStack framelessMemcpySpec keys_ls_hook_ok_of_mem + keys_ls_subroutine_ok_of_block_cro noAllocShimSpec uuidTryParseCodeSpec) open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) open CryptoVerification.SignalSession (CliHooks cliExternsPlaced) open CryptoVerification.SignalSession.Cli.RunProofs (cliInitiateFrame cliInitiateNeed) @@ -105,16 +108,17 @@ open LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.SmallCalleesBudget (setKyberCiphertextNoneBudgetSpec setKyberCiphertext_none_placed_ok setUnackKyberPreKeyIdBudgetSpec setUnackKyberPreKeyId_placed_ok) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudget - (ct_eq_ro_placed_vm_ok_of_block expand_multi_info_placed_vm_ok - pqxdhCalculateAgreementPlacedBaseSpec pqxdhCalculateAgreement_placed_ok_of_block) + (pqxdhCalculateAgreementPlacedBaseSpec) open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudgetAuxSat (expand_multi_info_placed_vm_ok_sat) +open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetBbSat + (calculateAgreement_placed_ok_unconditional_sat pqxdhCalculateAgreement_placed_ok_of_block_sat) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat (HkdfPlacedHooksExactBudgetSat) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat (HkdfPlacedHooksExactSat) open LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountBudget (isSameAccountDistinctSpec) -open LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedBudget - (isSameAccountEqDistinct_placed_ok_at) +open LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedBudgetSat + (isSameAccountEqDistinct_placed_ok_at_sat) open LibsignalBinary.Proofs.Placed.BudgetPoolSync (hooksException sepWP_seg_ls_vm) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.DropSessionStructureLocal5PlacedBudget (drop_session_structure5_placed_ok) @@ -127,7 +131,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.Stage4Lemmas.S open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.Stage5Lemmas.ScratchAndStoreCallsPlacedBudget (promoteStateEmptyBudgetSpec) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.SetUnackEpochPlacedBudget - (cliExternsPlaced_durationSinceEpochAlloc_budget_sat setUnackPreKeyMsgEpochInnerSpec + (hookSat_withLsRet_drop_keepsFs setUnackPreKeyMsgEpochInnerSpec setUnackPreKeyMsg_exact_stack_epoch_placed_at_block) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (derivePublicKeyBytesSpec noAllocShimBudgetSpec @@ -137,7 +141,8 @@ open LibsignalBinary.Proofs.TripleRatchet.Alloc.DerivePublicKeyBytesBudget open LibsignalBinary.Proofs.TripleRatchet.FromRecordCallees.DefsBudget (dropSessionStructureLocal2Spec) open LibsignalBinary.Proofs.TripleRatchet.Keys.CreateChainBudget - (createChain_placed_ok createChain_placed_ok_x expandMultiInfoBudgetSpec extractBudgetSpec) + (createChain_placed_ok_of_contracts expandMultiInfoBudgetSpec extractBudgetSpec + subroutine_ok_createChainSpecX_of_createChainSpec) open LibsignalBinary.Proofs.TripleRatchet.Keys.DefsBudget (createChainSpec createChainSpecX) open Arm64.Obj (MultiPlacement) open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer @@ -460,7 +465,7 @@ theorem isSameAccount_cli_placed_ok_of_uuidTryParse [LibsignalPlacement] subroutine_ok (initProgPlaced mmpl gh W) (lsmpl.base 17) (withLsCodeRoLoaded lsmpl (isSameAccountDistinctSpec A.repAlloc uuidTryParse)) := subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded - (isSameAccountEqDistinct_placed_ok_at A.repAlloc (callerProg := initProgPlaced mmpl gh W) + (isSameAccountEqDistinct_placed_ok_at_sat A.repAlloc (callerProg := initProgPlaced mmpl gh W) hh.blackBox huuid) /-- `::calculate_agreement` (block `207`) on `initProgPlaced`. -/ @@ -472,7 +477,7 @@ theorem calculateAgreement_cli_placed_ok [LibsignalPlacement] subroutine_ok (initProgPlaced mmpl gh W) (lsmpl.base 207) (withLsCodeRoLoaded lsmpl (pqxdhCalculateAgreementPlacedInnerSpec (modelPrims X ⟨W.C, W.Q⟩) A lim)) := by - have h207 := pqxdhCalculateAgreement_placed_ok_of_block + have h207 := pqxdhCalculateAgreement_placed_ok_of_block_sat (callerProg := initProgPlaced mmpl gh W) (i := 521) (primitivesMatchCrypto_modelPrims X ⟨W.C, W.Q⟩) hh.dh hh.sharedDrop hh.blackBox @@ -552,10 +557,10 @@ theorem rootKeyCreateChain_cli_placed_ok [LibsignalPlacement] have : HkdfPlacedHooksExactSat W.C.F (cliGhostExterns gh (cliExternsPlaced mmpl W)) := hh.hkdf have : HkdfPlacedHooksExactBudgetSat W.C.F (cliGhostExterns gh (cliExternsPlaced mmpl W)) := HkdfPlacedHooksExactBudgetSat.of_exactSat (hookSat_of_keepsFs hh.memsetRegionKeepsFs) - have hct207 := ct_eq_ro_placed_vm_ok_of_block - (callerProg := (CryptoVerification.blkPC_207).rebase - (CryptoVerification.blkPl_207).base (cliGhostExterns gh (cliExternsPlaced mmpl W))) - hh.blackBox (by decide) + have hag40 := keys_ls_subroutine_ok_of_block_cro + (callerProg := (blkPC_40).rebase (blkPl_40).base (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (calculateAgreement_placed_ok_unconditional_sat hh.dh hh.sharedDrop hh.blackBox + (hookSat_noAllocShimBudget_of_withVmPreserved hh.shim) hh.rawAlloc hh.staticDrop) have hexp53 : subroutine_ok (CryptoVerification.LibsignalTripleRatchet.lsProg_53 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsmpl.base 53) @@ -567,11 +572,17 @@ theorem rootKeyCreateChain_cli_placed_ok [LibsignalPlacement] (withLsCodeLoaded lsmpl (expandMultiInfoBudgetSpec W.C.F)) := ls_subroutine_ok_of_block (callerProg := lsProg_40 (cliGhostExterns gh (cliExternsPlaced mmpl W))) hexp53 (by decide) (by decide) (by decide) + have hdealloc40 := keys_ls_hook_ok_of_mem + (prog := (blkPC_40).rebase (blkPl_40).base (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (i := 40) hh.rawDealloc exact transfer_tr_codeRoLoaded (calleeProg := lsProg_40 (cliGhostExterns gh (cliExternsPlaced mmpl W))) - (createChain_placed_ok hh.dh hh.sharedDrop hct207 - (hookSat_noAllocShimBudget_of_withVmPreserved hh.shim) - hh.rawAlloc hh.staticDrop ha4.hkdfExtract40 hexp40 hh.rawDealloc) + (createChain_placed_ok_of_contracts (C := W.C) hag40 + (CryptoVerification.LibsignalTripleRatchet.subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded + ha4.hkdfExtract40) + (CryptoVerification.LibsignalTripleRatchet.subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded + hexp40) + hdealloc40) /-- `::create_chain` (block `40`) at `createChainStackX` on `initProgPlaced`. -/ theorem rootKeyCreateChainX_cli_placed_ok [LibsignalPlacement] @@ -585,10 +596,10 @@ theorem rootKeyCreateChainX_cli_placed_ok [LibsignalPlacement] have : HkdfPlacedHooksExactSat W.C.F (cliGhostExterns gh (cliExternsPlaced mmpl W)) := hh.hkdf have : HkdfPlacedHooksExactBudgetSat W.C.F (cliGhostExterns gh (cliExternsPlaced mmpl W)) := HkdfPlacedHooksExactBudgetSat.of_exactSat (hookSat_of_keepsFs hh.memsetRegionKeepsFs) - have hct207 := ct_eq_ro_placed_vm_ok_of_block - (callerProg := (CryptoVerification.blkPC_207).rebase - (CryptoVerification.blkPl_207).base (cliGhostExterns gh (cliExternsPlaced mmpl W))) - hh.blackBox (by decide) + have hag40 := keys_ls_subroutine_ok_of_block_cro + (callerProg := (blkPC_40).rebase (blkPl_40).base (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (calculateAgreement_placed_ok_unconditional_sat hh.dh hh.sharedDrop hh.blackBox + (hookSat_noAllocShimBudget_of_withVmPreserved hh.shim) hh.rawAlloc hh.staticDrop) have hexp53 : subroutine_ok (CryptoVerification.LibsignalTripleRatchet.lsProg_53 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsmpl.base 53) @@ -600,11 +611,18 @@ theorem rootKeyCreateChainX_cli_placed_ok [LibsignalPlacement] (withLsCodeLoaded lsmpl (expandMultiInfoBudgetSpec W.C.F)) := ls_subroutine_ok_of_block (callerProg := lsProg_40 (cliGhostExterns gh (cliExternsPlaced mmpl W))) hexp53 (by decide) (by decide) (by decide) + have hdealloc40 := keys_ls_hook_ok_of_mem + (prog := (blkPC_40).rebase (blkPl_40).base (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (i := 40) hh.rawDealloc exact transfer_tr_codeRoLoaded (calleeProg := lsProg_40 (cliGhostExterns gh (cliExternsPlaced mmpl W))) - (createChain_placed_ok_x hh.dh hh.sharedDrop hct207 - (hookSat_noAllocShimBudget_of_withVmPreserved hh.shim) - hh.rawAlloc hh.staticDrop ha4.hkdfExtract40 hexp40 hh.rawDealloc) + (subroutine_ok_createChainSpecX_of_createChainSpec + (createChain_placed_ok_of_contracts (C := W.C) hag40 + (CryptoVerification.LibsignalTripleRatchet.subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded + ha4.hkdfExtract40) + (CryptoVerification.LibsignalTripleRatchet.subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded + hexp40) + hdealloc40)) /-- `spqr_chain_params` (block `74`) on `initProgPlaced`. -/ theorem spqrChainParams_cli_placed_ok [LibsignalPlacement] (mmpl : MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : @@ -664,8 +682,7 @@ theorem setUnackPreKeyMsg_cli_placed_ok [LibsignalPlacement] (withLsCodeRoLoaded lsmpl (setUnackPreKeyMsgEpochInnerSpec A lim)) := setUnackPreKeyMsg_exact_stack_epoch_placed_at_block (callerProg := initProgPlaced mmpl gh W) (i := 521) hh.sessionShim hh.rawAlloc hh.rawDealloc hh.sessionMemcpyRegion - (CryptoVerification.SignalSession.Cli.Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_durationSinceEpochAlloc_budget_sat mmpl W)) (by decide) + (hookSat_withLsRet_drop_keepsFs hh.durationSince) (by decide) /-- `::set_unacknowledged_kyber_pre_key_id` (block `34`) on `initProgPlaced`. -/ theorem setUnackKyberId_cli_placed_ok [LibsignalPlacement] (mmpl : MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/LocalCalleesPlacedBudgetSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/LocalCalleesPlacedBudgetSat.lean index 0b3c321f6..2a5f0660c 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/LocalCalleesPlacedBudgetSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/LocalCalleesPlacedBudgetSat.lean @@ -88,14 +88,8 @@ open LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.SessionStateCalleesBudget withReceiverChain_empty_placed_ok withSenderChainNonePlacedSpec withSenderChain_none_placed_ok) open LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.SmallCalleesBudget (setKyberCiphertextNoneBudgetSpec setUnackKyberPreKeyIdBudgetSpec) -open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudget - (ct_eq_ro_placed_vm_ok_of_block pqxdhCalculateAgreement_placed_ok_of_block) -open LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudgetAuxSat - (expand_multi_info_placed_vm_ok_sat) open LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountBudget (isSameAccountDistinctSpec) -open LibsignalBinary.Proofs.E2E.Pqxdh.WireEntries.RecvWireSameAccountPlacedBudget - (isSameAccountEqDistinct_placed_ok_at) open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer (CliGhostHooks cliGhostExterns) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.DropSessionStructureLocal5PlacedBudget @@ -113,7 +107,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.Stage4Lemmas.S open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.Stage5Lemmas.ScratchAndStoreCallsPlacedBudget (promoteStateEmptyBudgetSpec) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.SetUnackEpochPlacedBudget - (cliExternsPlaced_durationSinceEpochAlloc_budget_sat setUnackPreKeyMsgEpochInnerSpec + (hookSat_withLsRet_drop_keepsFs setUnackPreKeyMsgEpochInnerSpec setUnackPreKeyMsg_exact_stack_epoch_placed_at_block) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (derivePublicKeyBytesSpec noAllocShimBudgetSpec @@ -125,8 +119,6 @@ open LibsignalBinary.Proofs.TripleRatchet.FromRecordCallees.DefsBudget open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat (HkdfPlacedHooksExactBudgetSat) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat (HkdfPlacedHooksExactSat) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemcpyRegionBudgetSpec) -open LibsignalBinary.Proofs.TripleRatchet.Keys.CreateChainBudget - (createChain_placed_ok createChain_placed_ok_x expandMultiInfoBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Keys.DefsBudget (createChainSpec createChainSpecX) /-! ## 1. Internal `RunHooksPlaced` Helper for Block `523` (`kem::Key::serialize [local#1]`) -/ @@ -376,7 +368,7 @@ theorem dropSessionStructure_cli_placed_ok [LibsignalPlacement] (drop_session_structure5_placed_ok hh.rawDealloc) /-- Row 3 helper: discharge `isSameAccount` (Block `17`) on `initProgPlaced mmpl gh W` from a Block-`252` -`uuidTryParse` witness via `RecvWireSameAccountPlacedBudget.isSameAccountEqDistinct_placed_ok_at`. -/ +`uuidTryParse` witness via `LocalCalleesPlacedBudget.isSameAccount_cli_placed_ok_of_uuidTryParse`. -/ theorem isSameAccount_cli_placed_ok_of_uuidTryParse [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (mmpl : MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) @@ -385,12 +377,10 @@ theorem isSameAccount_cli_placed_ok_of_uuidTryParse [LibsignalPlacement] (blkPl_252).base (withLsCodeLoaded lsmpl (withVmPreserved (uuidTryParseCodeSpec uuidTryParse)))) : subroutine_ok (initProgPlaced mmpl gh W) (lsmpl.base 17) (withLsCodeRoLoaded lsmpl (isSameAccountDistinctSpec A.repAlloc uuidTryParse)) := - subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded - (isSameAccountEqDistinct_placed_ok_at A.repAlloc (callerProg := initProgPlaced mmpl gh W) - hh.blackBox huuid) + LocalCalleesPlacedBudget.isSameAccount_cli_placed_ok_of_uuidTryParse mmpl gh W hh huuid /-- Row 3b: `::calculate_agreement` (Block `207`), proved unconditionally from -`CryptoBridgePlacedBudget.pqxdhCalculateAgreement_placed_ok_of_block`. -/ +`LocalCalleesPlacedBudget.calculateAgreement_cli_placed_ok`. -/ theorem calculateAgreement_cli_placed_ok [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (mmpl : MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) @@ -398,20 +388,8 @@ theorem calculateAgreement_cli_placed_ok [LibsignalPlacement] (X : UnreachedPqxdhPrimitives) : subroutine_ok (initProgPlaced mmpl gh W) (lsmpl.base 207) (withLsCodeRoLoaded lsmpl - (pqxdhCalculateAgreementPlacedInnerSpec (modelPrims X ⟨W.C, W.Q⟩) A lim)) := by - have h207 := pqxdhCalculateAgreement_placed_ok_of_block - (callerProg := initProgPlaced mmpl gh W) (i := 521) - (primitivesMatchCrypto_modelPrims X ⟨W.C, W.Q⟩) - hh.dh hh.sharedDrop hh.blackBox - (hookSat_noAllocShimBudget_of_withVmPreserved hh.shim) - hh.rawAlloc hh.staticDrop (by decide) - exact subroutine_ok_mono h207 - (fun _ _ _ hp => by - obtain ⟨hc, hpre⟩ := extract_withLsCodeRoLoaded hp - dsimp only [CryptoVerification.LibsignalTripleRatchet.withLsCodeRoLoaded] - rw [sepConj_assoc, sepConj_left_comm, satisfies_pure_sepConj] - exact ⟨⟨hc.1, hc.2⟩, hpre⟩) - (fun _ _ _ _ hq => hq) + (pqxdhCalculateAgreementPlacedInnerSpec (modelPrims X ⟨W.C, W.Q⟩) A lim)) := + LocalCalleesPlacedBudget.calculateAgreement_cli_placed_ok mmpl gh W hh X /-- Row 4: `::derive_public_key_bytes` (Block `200`). -/ theorem derivePubKeyBytes_cli_placed_ok [LibsignalPlacement] @@ -449,16 +427,6 @@ theorem kemCtSerialize_cli_placed_ok [LibsignalPlacement] (calleeProg := lsProg_71 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (kemCiphertextSerialize_placed_ok hh.shimVm hh.rawAlloc hh.allocMemcpyVm) -private theorem hookSat_of_keepsFs {α : Type} {H : LibsignalHooks} {sym : String} - {spec : Spec α} (h : HookSat H sym spec.keepsFs) : HookSat H sym spec := by - rcases h with ⟨f, hf, hok⟩ - refine ⟨f, hf, fun x R s0 hrun hpre hsp => ?_⟩ - rcases hok x R s0 hrun hpre hsp with ⟨hkf, hsym, ⟨hret, hcc, hpost⟩ | hrest⟩ - · dsimp only [Spec.keepsFs] at hpost - rw [sepConj_assoc, satisfies_pure_sepConj] at hpost - exact ⟨hkf, hsym, Or.inl ⟨hret, hcc, hpost.2⟩⟩ - · exact ⟨hkf, hsym, Or.inr hrest⟩ - /-- Row 7: `::create_chain` (Block `40`) at `createChainStack`. -/ theorem rootKeyCreateChain_cli_placed_ok [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -467,30 +435,8 @@ theorem rootKeyCreateChain_cli_placed_ok [LibsignalPlacement] (hh : RunHooksPlaced W A lim (cliGhostExterns gh (cliExternsPlaced mmpl W))) (ha4 : SubsetA4InitCalleesPlaced A lim InitStateEnv mmpl gh W) : subroutine_ok (initProgPlaced mmpl gh W) (lsmpl.base 40) - (withLsCodeRoLoaded lsmpl (createChainSpec M A lim W.C)) := by - have : HkdfPlacedHooksExactSat W.C.F (cliGhostExterns gh (cliExternsPlaced mmpl W)) := hh.hkdf - have : HkdfPlacedHooksExactBudgetSat W.C.F (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - HkdfPlacedHooksExactBudgetSat.of_exactSat (hookSat_of_keepsFs hh.memsetRegionKeepsFs) - have hct207 := ct_eq_ro_placed_vm_ok_of_block - (callerProg := (CryptoVerification.blkPC_207).rebase - (CryptoVerification.blkPl_207).base (cliGhostExterns gh (cliExternsPlaced mmpl W))) - hh.blackBox (by decide) - have hexp53 : subroutine_ok - (CryptoVerification.LibsignalTripleRatchet.lsProg_53 (cliGhostExterns gh (cliExternsPlaced mmpl W))) - (lsmpl.base 53) - (withLsCodeLoaded lsmpl (expandMultiInfoBudgetSpec W.C.F)) := - expand_multi_info_placed_vm_ok_sat W.C (cliGhostExterns gh (cliExternsPlaced mmpl W)) - have hexp40 : subroutine_ok - ((blkPC_40).rebase (blkPl_40).base (cliGhostExterns gh (cliExternsPlaced mmpl W))) - (lsmpl.base 53) - (withLsCodeLoaded lsmpl (expandMultiInfoBudgetSpec W.C.F)) := - ls_subroutine_ok_of_block (callerProg := lsProg_40 (cliGhostExterns gh (cliExternsPlaced mmpl W))) - hexp53 (by decide) (by decide) (by decide) - exact transfer_tr_codeRoLoaded - (calleeProg := lsProg_40 (cliGhostExterns gh (cliExternsPlaced mmpl W))) - (createChain_placed_ok hh.dh hh.sharedDrop hct207 - (hookSat_noAllocShimBudget_of_withVmPreserved hh.shim) - hh.rawAlloc hh.staticDrop ha4.hkdfExtract40 hexp40 hh.rawDealloc) + (withLsCodeRoLoaded lsmpl (createChainSpec M A lim W.C)) := + LocalCalleesPlacedBudget.rootKeyCreateChain_cli_placed_ok mmpl gh W hh ha4 /-- Row 7b: `::create_chain` (Block `40`) at `createChainStackX`. -/ theorem rootKeyCreateChainX_cli_placed_ok [LibsignalPlacement] @@ -500,30 +446,8 @@ theorem rootKeyCreateChainX_cli_placed_ok [LibsignalPlacement] (hh : RunHooksPlaced W A lim (cliGhostExterns gh (cliExternsPlaced mmpl W))) (ha4 : SubsetA4InitCalleesPlaced A lim InitStateEnv mmpl gh W) : subroutine_ok (initProgPlaced mmpl gh W) (lsmpl.base 40) - (withLsCodeRoLoaded lsmpl (createChainSpecX M A lim W.C)) := by - have : HkdfPlacedHooksExactSat W.C.F (cliGhostExterns gh (cliExternsPlaced mmpl W)) := hh.hkdf - have : HkdfPlacedHooksExactBudgetSat W.C.F (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - HkdfPlacedHooksExactBudgetSat.of_exactSat (hookSat_of_keepsFs hh.memsetRegionKeepsFs) - have hct207 := ct_eq_ro_placed_vm_ok_of_block - (callerProg := (CryptoVerification.blkPC_207).rebase - (CryptoVerification.blkPl_207).base (cliGhostExterns gh (cliExternsPlaced mmpl W))) - hh.blackBox (by decide) - have hexp53 : subroutine_ok - (CryptoVerification.LibsignalTripleRatchet.lsProg_53 (cliGhostExterns gh (cliExternsPlaced mmpl W))) - (lsmpl.base 53) - (withLsCodeLoaded lsmpl (expandMultiInfoBudgetSpec W.C.F)) := - expand_multi_info_placed_vm_ok_sat W.C (cliGhostExterns gh (cliExternsPlaced mmpl W)) - have hexp40 : subroutine_ok - ((blkPC_40).rebase (blkPl_40).base (cliGhostExterns gh (cliExternsPlaced mmpl W))) - (lsmpl.base 53) - (withLsCodeLoaded lsmpl (expandMultiInfoBudgetSpec W.C.F)) := - ls_subroutine_ok_of_block (callerProg := lsProg_40 (cliGhostExterns gh (cliExternsPlaced mmpl W))) - hexp53 (by decide) (by decide) (by decide) - exact transfer_tr_codeRoLoaded - (calleeProg := lsProg_40 (cliGhostExterns gh (cliExternsPlaced mmpl W))) - (createChain_placed_ok_x hh.dh hh.sharedDrop hct207 - (hookSat_noAllocShimBudget_of_withVmPreserved hh.shim) - hh.rawAlloc hh.staticDrop ha4.hkdfExtract40 hexp40 hh.rawDealloc) + (withLsCodeRoLoaded lsmpl (createChainSpecX M A lim W.C)) := + LocalCalleesPlacedBudget.rootKeyCreateChainX_cli_placed_ok mmpl gh W hh ha4 /-- Row 8: `spqr_chain_params` (Block `74`). -/ theorem spqrChainParams_cli_placed_ok [LibsignalPlacement] (mmpl : MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : @@ -580,8 +504,7 @@ theorem setUnackPreKeyMsg_cli_placed_ok [LibsignalPlacement] (withLsCodeRoLoaded lsmpl (setUnackPreKeyMsgEpochInnerSpec A lim)) := setUnackPreKeyMsg_exact_stack_epoch_placed_at_block (callerProg := initProgPlaced mmpl gh W) (i := 521) hh.sessionShim hh.rawAlloc hh.rawDealloc hh.sessionMemcpyRegion - (CryptoVerification.SignalSession.Cli.Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_durationSinceEpochAlloc_budget_sat mmpl W)) (by decide) + (hookSat_withLsRet_drop_keepsFs hh.durationSince) (by decide) /-- Row 15: `::set_unacknowledged_kyber_pre_key_id` (Block `34`). -/ theorem setUnackKyberId_cli_placed_ok [LibsignalPlacement] (mmpl : MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/SetUnackEpochPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/SetUnackEpochPlacedBudgetFd.lean index 45d089450..0f3fd1787 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/SetUnackEpochPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/SetUnackEpochPlacedBudgetFd.lean @@ -53,14 +53,13 @@ open CryptoVerification.E2E.Pqxdh.Initiator ( sp_setMem_setPC_pre sp_setPC_pre stackAt_split_top vecU8 ) open CryptoVerification.SignalSession ( - CliHooks cliExternsPlaced durationSinceExactHook lsDurationSinceSym + CliHooks cliExternsPlaced lsDurationSinceSym ) open CryptoVerification.SignalSession.Cli.RunGlue ( - CliGhostHooks cliExternsPlaced_row cliGhostExterns + CliGhostHooks cliGhostExterns ) open CryptoVerification.SignalSession.Cli.Slots ( - cliGhostExterns_sat_of_cliExternsPlaced - durationSinceEpochAllocSpec durationSinceEpochAtSpec durationSince_row_placed + durationSinceEpochAllocSpec durationSinceEpochAtSpec ) open LibsignalBinary.Heap ( AllocCallPreserved AllocCostModel BudgetLimits FitsEvent FitsEvents RustCliAllocBudget @@ -81,17 +80,19 @@ open LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.SessionStateCalleesBudget ( rustDeallocBytesSpec setUnackPreKeyMsgEvents ) open LibsignalBinary.Proofs.HookDischarge.Libc.Common (keepsFs) +open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (LsRetAddr624 lsRetAddr624_blockPlacement_base_add) open LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.FdThreadKit ( - hookSat_keepsFs_of_fs_eq subroutine_ok_withLsCodeRoLoaded_withFdsGe3Closed_of_keepsFs + subroutine_ok_withLsCodeRoLoaded_withFdsGe3Closed_of_keepsFs ) open LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadFileBudgetPlaced ( withFdsGe3Closed ) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.HooksPlacedBudget ( RunHooksPlaced ) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.SetUnackEpochPlacedBudget ( - cliExternsPlaced_durationSinceEpochAlloc_budget_sat durationSinceEpochAllocBudgetSpec + durationSinceEpochAllocBudgetSpec setUnackPreKeyMsgEpochEvents setUnackPreKeyMsgEpochInnerSpec setUnackPreKeyMsgExactStackEpochSpecPlaced ) @@ -99,30 +100,6 @@ open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget ( sessionMemcpyRegionBudgetSpec sessionShimBudgetSpec ) -/-! ## `durationSinceExactHook` preserves `State.fs` -/ - -private theorem durationSinceExactHook_fs_local (s : State) : - (durationSinceExactHook s).fs = s.fs := by - unfold durationSinceExactHook; try dsimp only - split - · rfl - · try dsimp only - split - · rfl - · rfl - -theorem cliExternsPlaced_durationSinceEpochAlloc_budget_keepsFs_sat (mmpl : Obj.MultiPlacement) - (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) lsDurationSinceSym - (keepsFs durationSinceEpochAllocBudgetSpec) := by - rcases cliExternsPlaced_durationSinceEpochAlloc_budget_sat mmpl W with ⟨g, hg, hok⟩ - have hfeq : cliExternsPlaced mmpl W lsDurationSinceSym = some durationSinceExactHook := - cliExternsPlaced_row mmpl W (durationSince_row_placed mmpl W) - rw [hfeq] at hg - injection hg with hfg - subst hfg - exact hookSat_keepsFs_of_fs_eq hfeq durationSinceExactHook_fs_local hok - /-! ## Block `33` `.keepsFs` and `withFdsGe3Closed` proofs -/ attribute [local irreducible] Program.fetch Program.externAt? Program.fnAddr Program.fnOff FitsEvent @@ -235,7 +212,7 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_keepsFs_placed_cl_ok [LibsignalPlace (halloc : HookSat H lsRustAllocSym (rustCliAllocBudgetSpec M A lim false)) (hdealloc : HookSat H lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat H lsMemcpySym (keepsFs sessionMemcpyRegionBudgetSpec)) - (hTime : HookSat H lsDurationSinceSym (keepsFs durationSinceEpochAllocBudgetSpec)) : + (hTime : HookSat H lsDurationSinceSym (withLsRet (keepsFs durationSinceEpochAllocBudgetSpec))) : subroutine_ok ((blkPC_33).rebase (blkPl_33).base H) (blkPl_33).base (withLsCodeLoaded lsmpl (keepsFs (setUnackPreKeyMsgEpochInnerSpec A lim))) := by unfold withLsCodeLoaded keepsFs setUnackPreKeyMsgEpochInnerSpec @@ -258,7 +235,7 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_keepsFs_placed_cl_ok [LibsignalPlace have hmemcpy' : subroutine_ok ((blkPC_33).rebase (blkPl_33).base H) (lsρ lsMemcpySym) (keepsFs sessionMemcpyRegionBudgetSpec) := ls_hook_ok_of_mem hmemcpy have htime' : subroutine_ok ((blkPC_33).rebase (blkPl_33).base H) - (lsρ lsDurationSinceSym) (keepsFs durationSinceEpochAllocBudgetSpec) := + (lsρ lsDurationSinceSym) (withLsRet (keepsFs durationSinceEpochAllocBudgetSpec)) := ls_hook_ok_of_mem hTime dsimp only [keepsFs, sessionShimBudgetSpec, CryptoVerification.LibsignalTripleRatchet.sessionShimSpec] at hshim' @@ -267,7 +244,7 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_keepsFs_placed_cl_ok [LibsignalPlace dsimp only [keepsFs, rustDeallocBytesSpec] at hdealloc' dsimp only [keepsFs, sessionMemcpyRegionBudgetSpec, CryptoVerification.LibsignalTripleRatchet.sessionMemcpyRegionSpec, memcpyRegionSpec] at hmemcpy' - dsimp only [keepsFs, durationSinceEpochAllocBudgetSpec, withVmPreserved, + dsimp only [withLsRet, keepsFs, durationSinceEpochAllocBudgetSpec, withVmPreserved, durationSinceEpochAllocSpec, durationSinceEpochAtSpec] at htime' wp_init x s0 rcases x with ⟨⟨statePtr, optOpkTag, optOpkVal, spkId, baseKeyPtr, baseKeyBytes⟩, st⟩ @@ -340,6 +317,8 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_keepsFs_placed_cl_ok [LibsignalPlace apply SepWP.replace_pre (by sep_focus) (h120_8 ▸ h120_16 ▸ pointsTo64_triple_entails_memRegion24_epoch_placed_fd (s0.sp - 120#64) _ _ _) have hsp3 : sf_3.sp = s0.sp - 144#64 := by simp only [*, arm64_norm] + have hlr_ds : LsRetAddr624 ((blkPl_33).base + 160#64) := + lsRetAddr624_blockPlacement_base_add 33 160#64 (by decide) (by decide) wp_call htime' (s0.sp - 136#64, s0.sp - 120#64) refine SepWP.transport_budgetPool ‹VmPreserved _ sf_4› (hnext := ?_) rw [memRegion_16_split_64_epoch_placed_fd (s0.sp - 136#64), h136_eq] @@ -366,7 +345,7 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_keepsFs_placed_ok [LibsignalPlacemen (halloc : HookSat H lsRustAllocSym (rustCliAllocBudgetSpec M A lim false)) (hdealloc : HookSat H lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat H lsMemcpySym (keepsFs sessionMemcpyRegionBudgetSpec)) - (hTime : HookSat H lsDurationSinceSym (keepsFs durationSinceEpochAllocBudgetSpec)) : + (hTime : HookSat H lsDurationSinceSym (withLsRet (keepsFs durationSinceEpochAllocBudgetSpec))) : subroutine_ok ((blkPC_33).rebase (blkPl_33).base H) (blkPl_33).base (setUnackPreKeyMsgExactStackEpochSpecPlaced A lim).keepsFs := subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded @@ -380,7 +359,7 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_keepsFs_placed_at_block [LibsignalPl (halloc : HookSat H lsRustAllocSym (rustCliAllocBudgetSpec M A lim false)) (hdealloc : HookSat H lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat H lsMemcpySym (keepsFs sessionMemcpyRegionBudgetSpec)) - (hTime : HookSat H lsDurationSinceSym (keepsFs durationSinceEpochAllocBudgetSpec)) + (hTime : HookSat H lsDurationSinceSym (withLsRet (keepsFs durationSinceEpochAllocBudgetSpec))) (hi : i < 619 := by decide) : subroutine_ok callerProg (blkPl_33).base (setUnackPreKeyMsgExactStackEpochSpecPlaced A lim).keepsFs := by @@ -412,8 +391,7 @@ theorem setUnackPreKeyMsg_cli_keepsFs_placed_ok [LibsignalPlacement] hh.rawAlloc hh.rawDealloc (hookSat_sessionMemcpyRegionBudget_keepsFs_of_allocMemcpyVm hh.allocMemcpyVm) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_durationSinceEpochAlloc_budget_keepsFs_sat mmpl W)) + hh.durationSince hi theorem setUnackPreKeyMsg_cli_fds_placed_ok [LibsignalPlacement] diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/Stage5Lemmas/EntryAndRegIdPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/Stage5Lemmas/EntryAndRegIdPlacedBudget.lean index fb97fedf1..8be56cd82 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/Stage5Lemmas/EntryAndRegIdPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Initiate/Stage5Lemmas/EntryAndRegIdPlacedBudget.lean @@ -87,7 +87,7 @@ open LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.SmallCalleesBudget open LibsignalBinary.Proofs.PublicApi.StoreKit.PreKeyStoreKitBudget (BoxAllocEnv futDropBudgetSpec) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.SetUnackEpochPlacedBudget (SetUnackPreKeyMsgEpochEnv setUnackPreKeyMsgEpochEvents setUnackPreKeyMsgEpochInnerSpec - cliExternsPlaced_durationSinceEpochAlloc_budget_sat + hookSat_withLsRet_drop_keepsFs setUnackPreKeyMsg_exact_stack_epoch_placed_at_block setUnackPreKeyMsg_exact_stack_epoch_placed_ok_cli) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsXCliPlaced idOwnShimSpecPlaced idRegIdPollSpecPlaced @@ -165,8 +165,7 @@ theorem s5_setUnackMsg_ok_at_placed [LibsignalPlacement] {M : AllocCostModel} setUnackPreKeyMsg_exact_stack_epoch_placed_at_block (callerProg := initProgPlaced mmpl gh W) (i := 521) hh.sessionShim hh.rawAlloc hh.rawDealloc hh.sessionMemcpyRegion - (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_durationSinceEpochAlloc_budget_sat mmpl W)) (by decide) + (hookSat_withLsRet_drop_keepsFs hh.durationSince) (by decide) theorem s5_setUnackMsg_ok_of_cliAllocHooks [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/InnerInstPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/InnerInstPlaced.lean index 63f1d50e3..39aef3785 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/InnerInstPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/InnerInstPlaced.lean @@ -92,9 +92,9 @@ theorem w2_inner_placed_ok_of_region [LibsignalPlacement] (by decide) (Nat.le_refl _) (by decide) (by decide) have hId : IdentityStoreKitPlacedOkI (EncryptLemmas.w1IdKitPlaced B F0 peer) (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - KitInst.cliIdKitOkIE_cli_placed mmpl gh W (F0 := F0) (peer := peer) (readStk := B.readFile) + KitInst.cliIdKitOkIE_cli_placed_sat mmpl gh W (F0 := F0) (peer := peer) (readStk := B.readFile) (readProg := lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (jRead := 589) - hDropNz hh hRead + hDropNz hG.extraOk hh hRead (by decide) (Nat.le_refl _) (by decide) (Nat.le_refl _) have hq : (EncryptLemmas.w1SessKitPlaced B F0 peer).Quiet ∧ (EncryptLemmas.w1IdKitPlaced B F0 peer).Quiet := @@ -144,6 +144,7 @@ theorem w2_inner_placed_ok [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) {B : RunBudgets} (hDropNz : lsmpl.base 547 ≠ 0#64) (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hh : RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (hRead : subroutine_ok (lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsρ lsReadFileSym) (readFileSpecPlaced cliIo.rd cliWrOk E2E.HooksE.A0 B.readFile)) @@ -156,7 +157,7 @@ theorem w2_inner_placed_ok [LibsignalPlacement] w2_inner_placed_ok_of_region mmpl gh W hDropNz hG hh hRead (region_ok_restrictPre_true (CryptoVerification.Cli.LibsignalSpqrV1.recordDecryptV1_placed_region_vregs_ok_PTight_cli - mmpl gh W 0#64 hG hAesDec hSpqr hclosure)) + mmpl gh W 0#64 hG hMv hAesDec hSpqr hclosure)) /-- Reduces `InnerDecryptFrozenPlacedOk` on Block `463` to the `withLsFrozen`-guarded `recordDecryptPlacedSpecTPTight` region obligation. -/ @@ -186,9 +187,9 @@ theorem w2_inner_frozen_placed_ok_of_region [LibsignalPlacement] (by decide) (Nat.le_refl _) (by decide) (by decide) have hId : IdentityStoreKitPlacedOkI (EncryptLemmas.w1IdKitPlaced B F0 peer) (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - KitInst.cliIdKitOkIE_cli_placed mmpl gh W (F0 := F0) (peer := peer) (readStk := B.readFile) + KitInst.cliIdKitOkIE_cli_placed_sat mmpl gh W (F0 := F0) (peer := peer) (readStk := B.readFile) (readProg := lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (jRead := 589) - hDropNz hh hRead + hDropNz hG.extraOk hh hRead (by decide) (Nat.le_refl _) (by decide) (Nat.le_refl _) have hq : (EncryptLemmas.w1SessKitPlaced B F0 peer).Quiet ∧ (EncryptLemmas.w1IdKitPlaced B F0 peer).Quiet := @@ -241,6 +242,7 @@ theorem w2_inner_full_placed_ok [LibsignalFullPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) {B : RunBudgets} (hDropNz : lsmpl.base 547 ≠ 0#64) (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hh : RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (hRead : subroutine_ok (lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsρ lsReadFileSym) (readFileSpecPlaced cliIo.rd cliWrOk E2E.HooksE.A0 B.readFile)) @@ -251,6 +253,6 @@ theorem w2_inner_full_placed_ok [LibsignalFullPlacement] w2_inner_frozen_placed_ok_of_region mmpl gh W hDropNz hG hh hRead (region_ok_restrictPre_true (CryptoVerification.Cli.LibsignalSpqrV1.recordDecryptV1_full_placed_region_vregs_ok_PTight_cli - mmpl gh W 0#64 hG hAesDec hSpqr)) + mmpl gh W 0#64 hG hMv hAesDec hSpqr)) end CryptoVerification.SignalSession.Cli.RunProofs.DecryptLemmas diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/InnerInstPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/InnerInstPlacedBudget.lean index 19f8296f3..425b78c15 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/InnerInstPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/InnerInstPlacedBudget.lean @@ -66,7 +66,6 @@ open CryptoVerification.SignalSession ( CliHooks cliExternsPlaced lsFmtWriteSym lsFormatInnerSym lsReadFileSym ) open CryptoVerification.SignalSession.Cli (StoresGhost cliIdentityVtSym cliSessionVtSym) -open CryptoVerification.SignalSession.Cli.KitInst (cliGhostExterns_blackBox) open CryptoVerification.SignalSession.Cli.RunGlue ( CliGhostHooks CliGhostHooksFs cliGhostExterns ) @@ -114,7 +113,7 @@ open LibsignalBinary.Proofs.SessionRecordAt.Hooks2.DeserBudget.SessionDeserializ sessDeserEvents ) open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.IdentityKitOkPlacedBudget ( - cliIdKitOkIE_placed cliIdentityKitDefaultBudgetEnv + cliIdKitOkIE_placed_sat cliIdentityKitDefaultBudgetEnv ) open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.SessionKitOkCliPlacedBudget ( cliSessionKitDefaultBudgetEnv @@ -192,7 +191,7 @@ theorem w2_inner_placed_ok_of_region_ofEnv [LibsignalPlacement] have hId : IdentityStoreKitPlacedOkI A lim (decIdKitPlaced A.repAlloc F0 peer B) (w2IdKitBudgetEnv A.repAlloc B ReadEnv F0 peer) (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - cliIdKitOkIE_placed + cliIdKitOkIE_placed_sat (readProg := lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (jRead := 589) (vtSym := cliIdentityVtSym) hDropNz @@ -202,7 +201,7 @@ theorem w2_inner_placed_ok_of_region_ofEnv [LibsignalPlacement] (ls_hook_ok_ultra_of_mem (prog := lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 589) hReadHook (by decide) (by decide) (by decide))) - (cliGhostExterns_blackBox mmpl gh W) + hh.blackBox (by decide) (Nat.le_refl _) (by decide) (Nat.le_refl _) have hq : (decSessKitPlaced A.repAlloc F0 peer B).Quiet ∧ (decIdKitPlaced A.repAlloc F0 peer B).Quiet := @@ -370,7 +369,7 @@ theorem w2_inner_frozen_placed_ok_of_region_ofEnv [LibsignalPlacement] have hId : IdentityStoreKitPlacedOkI A lim (decIdKitPlaced A.repAlloc F0 peer B) (w2IdKitBudgetEnv A.repAlloc B ReadEnv F0 peer) (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - cliIdKitOkIE_placed + cliIdKitOkIE_placed_sat (readProg := lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (jRead := 589) (vtSym := cliIdentityVtSym) hDropNz @@ -380,7 +379,7 @@ theorem w2_inner_frozen_placed_ok_of_region_ofEnv [LibsignalPlacement] (ls_hook_ok_ultra_of_mem (prog := lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 589) hReadHook (by decide) (by decide) (by decide))) - (cliGhostExterns_blackBox mmpl gh W) + hh.blackBox (by decide) (Nat.le_refl _) (by decide) (Nat.le_refl _) have hq : (decSessKitPlaced A.repAlloc F0 peer B).Quiet ∧ (decIdKitPlaced A.repAlloc F0 peer B).Quiet := diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/InnerInstPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/InnerInstPlacedBudgetFd.lean index df944ed7f..d7d3dbe70 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/InnerInstPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/InnerInstPlacedBudgetFd.lean @@ -76,7 +76,7 @@ open CryptoVerification.SignalSession.Cli ( DirGetGhost DirGhost ReadRule StoresGhost dirAt getResultAt pathOf ) open CryptoVerification.SignalSession.Cli.KitInst ( - cliGhostExterns_blackBox cliIdentityVtRoSym cliSessionKitSpecPlaced + cliIdentityVtRoSym cliSessionKitSpecPlaced ) open CryptoVerification.SignalSession.Cli.KitInst.IdKit ( cliIdentityKitSpecPlaced cliIdentityKitSpecPlaced_quiet savePollNeedPlaced saveShimNeedPlaced @@ -159,7 +159,9 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Ratchet.DecryptLemmas.S withStoresDecFrozenPlacedSpecVTP withStoresDecPlacedSpecVTP ) open LibsignalBinary.Proofs.SignalSession.Cli.Run.SkeletonPlacedBudget (RunHooksPlaced) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( + CliGhostAllocHooks cliGhostExterns_blackBoxSat_budget_sat +) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget ( dirGetSpecPlaced idSavePollSpecPlaced sessDeserializeSpecPlaced ) @@ -168,10 +170,11 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.BranchesPlacedBud CliIdSavePollEnv publicKeySerialize_lscro_of_cli ) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.SymPlacedBudget ( - idSavePoll_placed_ok_of_deps_core + idSavePoll_placed_ok_of_deps_core idSavePoll_placed_ok_of_deps_core_16 ) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudget ( - idTrustPoll_placed_ok_of_deps identityKey_decode_placed_ok publicKeyEq_placed_ok_of_bb + idTrustPoll_placed_ok_of_deps idTrustPoll_placed_ok_of_deps_16 identityKey_decode_placed_ok + publicKeyEq_mem_placed_ok_of_bb_16_sat publicKeyEq_placed_ok_of_bb ) open LibsignalBinary.Proofs.SignalSession.Cli.Store.LoadPollRecordDeser ( sessDeserialize_cli_dcan_byBytes_placed_ok @@ -374,6 +377,47 @@ theorem cliIdKitOkIE_of_dirGet [LibsignalPlacement] {M : AllocCostModel} idSavePoll_placed_ok_of_deps_core hh.alloc hSer hGet' hPut' hDec' hEq' hs4 exact cliIdKitOkIE_placed_of_polls hDropNz hh.alloc h566 h565 hs1 hs3 +/-- `HookSat` (`blackBoxSpecSat` / `80`-byte `publicKeyEqMemSpec16`) sibling of +`cliIdKitOkIE_of_dirGet`. -/ +theorem cliIdKitOkIE_of_dirGet_sat [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {rd : ReadRule} {F0 : FsFiles} {pathOk : List (BitVec 8) → Prop} {peer : AddrGhost} + {readStk s1 s2 s3 s4 : Nat} {vtSym : String} + {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} + (hDropNz : lsmpl.base 547 ≠ 0#64) + (hh : RunHooksPlaced A lim H) + (hGet : subroutine_ok (lsProg_589 H) (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim (DirGetEnv PathEnv ReadEnv rd) + (RunBudgets.dirGetNeed ⟨readStk⟩))) + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) + (hs1 : trustShimNeedPlaced ≤ s1) (hs2 : trustPollNeedPlaced readStk ≤ s2) + (hs3 : saveShimNeedPlaced ≤ s3) (hs4 : savePollNeedPlaced readStk ≤ s4) : + IdentityStoreKitPlacedOkI A lim + (cliIdentityKitSpecPlaced A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym) + (cliIdentityKitDefaultBudgetEnv A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym ReadEnv) + H := by + have hPut := cliDirPutStr_placed_ok hh + have hEq := publicKeyEq_mem_placed_ok_of_bb_16_sat h_bb + have h566 := idTrustPoll_placed_ok_of_deps_16 hh.alloc hGet + (identityKey_decode_placed_ok (A := A) H) hEq hs2 + (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) + have hSer := publicKeySerialize_lscro_of_cli + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hh.alloc (by decide) + have hGet' := ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hGet (by decide) (by decide) (by decide) + have hPut' := ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hPut (by decide) (by decide) (by decide) + have hDec' := ls_transfer_cl_to_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + (identityKey_decode_placed_ok (A := A) H) (by decide) (by decide) (by decide) + have hEq' := ls_transfer_cl_to_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hEq (by decide) (by decide) (by decide) + have h565 : subroutine_ok (lsProg_565 H) (lsmpl.base 565) + (idSavePollSpecPlaced rd pathOk A lim + (CliIdSavePollEnv rd (DirGetEnv PathEnv ReadEnv rd) DirPutStrEnv) s4) := + idSavePoll_placed_ok_of_deps_core_16 hh.alloc hSer hGet' hPut' hDec' hEq' hs4 + exact cliIdKitOkIE_placed_of_polls hDropNz hh.alloc h566 h565 hs1 hs3 + /-! ## Fixed-kit inner instantiation -/ theorem w2_decBinarySessKitPlacedFixed_okSE_of_dirGet [LibsignalPlacement] @@ -402,12 +446,13 @@ theorem w2_decBinarySessKitPlacedFixed_okSE_of_dirGet [LibsignalPlacement] (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (by decide) (by decide) (by decide) (by decide) -theorem w2_decBinaryIdKitPlacedFixed_okIE_of_dirGet [LibsignalPlacement] +theorem w2_decBinaryIdKitPlacedFixed_okIE_of_dirGet_sat [LibsignalPlacement] {M : AllocCostModel} (mmpl : MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) (A : RustCliAllocBudget M) (lim : BudgetLimits) (B : RunBudgets) (F0 : FsFiles) (peer : AddrGhost) (hDropNz : lsmpl.base 547 ≠ 0#64) + (hOk : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.ExtraSpecOk gh) (hh : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W))) (hGet : subroutine_ok (lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (lsmpl.base 589) @@ -418,10 +463,10 @@ theorem w2_decBinaryIdKitPlacedFixed_okIE_of_dirGet [LibsignalPlacement] (decIdKitPlaced A.repAlloc F0 peer B) (decBinaryIdKitPlacedBudgetFixed A.repAlloc B F0 peer) (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - cliIdKitOkIE_of_dirGet + cliIdKitOkIE_of_dirGet_sat (vtSym := cliIdentityVtRoSym) hDropNz hh hGet - (cliGhostExterns_blackBox mmpl gh W) + (cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hOk) (by decide) (Nat.le_refl _) (by decide) (Nat.le_refl _) theorem w2_inner_binaryKitFixed_frozen_placed_ok_of_dirGet_and_region [LibsignalPlacement] @@ -449,8 +494,8 @@ theorem w2_inner_binaryKitFixed_frozen_placed_ok_of_dirGet_and_region [Libsignal intro F0 peer hPeer have hSess := w2_decBinarySessKitPlacedFixed_okSE_of_dirGet mmpl gh W A lim B F0 peer hDropNz hG hh hGet - have hId := w2_decBinaryIdKitPlacedFixed_okIE_of_dirGet mmpl gh W A lim B F0 peer - hDropNz hh hGet + have hId := w2_decBinaryIdKitPlacedFixed_okIE_of_dirGet_sat mmpl gh W A lim B F0 peer + hDropNz hG.extraOk hh hGet have hq : (decSessKitPlaced A.repAlloc F0 peer B).Quiet ∧ (decIdKitPlaced A.repAlloc F0 peer B).Quiet := ⟨cliSessionKitSpecPlaced_quiet, cliIdentityKitSpecPlaced_quiet⟩ @@ -512,9 +557,11 @@ private theorem cliGhost_row_other (mmpl : MultiPlacement) (gh : CliGhostHooks) (hne7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (hne8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (hne9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (hne10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (hne10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hne11 : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.cliExtraGhostSyms.contains sym = false ∨ + gh.extra.lookup sym = none := by left; decide) : cliGhostExterns gh (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other gh _ hne1 hne2 hne3 hne4 hne5 hne6 hne7 hne8 hne9 hne10).trans + (cliGhostExterns_other gh _ hne1 hne2 hne3 hne4 hne5 hne6 hne7 hne8 hne9 hne10 hne11).trans (cliExternsPlaced_row mmpl W hrow) private theorem fmtWrite_hookSat {M : AllocCostModel} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/Top.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/Top.lean index 3b1be1d38..6a573ea34 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/Top.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/Top.lean @@ -536,10 +536,6 @@ theorem idPollStack_covers_publicKeyEq_with_extHookStack : private def cliHooksOfPEParams (P : E2E.PEParams) : CliHooks where C := P.C Q := P.Q - bcmp a b := if a = b then 0#64 else 1#64 - bcmp_ok a b _ := by - by_cases h : a = b <;> simp [h] - utf8Err _ := (0#64, 0#16) theorem decIdKitExt_traceOfWith_nil (A : RustAlloc) (img : Obj.Image) (F : FsFiles) (peer : AddrGhost) (B : RunBudgets) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/TopPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/TopPlacedBudget.lean index d7f1ee28b..abb274cec 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/TopPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/DecryptLemmas/TopPlacedBudget.lean @@ -216,10 +216,6 @@ private theorem retag_decIdKitPlaced_traceOfWith_nil [LibsignalPlacement] (A A' private def dummyCliHooks (P : PEParams) : CliHooks where C := P.C Q := P.Q - bcmp := fun a b => if a = b then 0#64 else 1#64 - bcmp_ok := fun a b _ => by - by_cases h : a = b <;> simp [h] - utf8Err := fun _ => (0#64, 0#16) /-! ## Slot allocation envelope -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/EncryptSlotWithFds.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/EncryptSlotWithFds.lean index 55f144884..a9cbe330a 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/EncryptSlotWithFds.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Proofs/Ratchet/EncryptSlotWithFds.lean @@ -24,6 +24,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Ratchet.Encryp public import LibsignalBinary.Proofs.SignalSession.Cli.Run.SkeletonPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePollPlacedBudgetFd public import LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudgetFd +public import LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudgetFdSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Store.LoadPollPlacedBudgetFd public import LibsignalBinary.Proofs.SignalSession.Cli.Store.LoadPollRecordDeser public import LibsignalBinary.Proofs.SignalSession.Cli.Store.SerGlueXCliPlacedBudget @@ -96,10 +97,13 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Ratchet.EncryptLemmas.S open LibsignalBinary.Proofs.SignalSession.Cli.Run.SkeletonPlacedBudget (RunHooksPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (dirGetSpecPlaced sessDeserializeSpecPlaced) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat (blackBoxSpecSat) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePollPlacedBudgetFd - (idSavePoll_placed_ok_of_get_put_bb_fd) + (idSavePoll_placed_ok_of_get_put_bb_fd idSavePoll_placed_ok_of_get_put_bb_fd_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudgetFd (idTrustPoll_placed_ok_of_get_bb_fd) +open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudgetFdSat + (idTrustPoll_placed_ok_of_get_bb_fd_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Store.LoadPollPlacedBudgetFd (sessLoadPoll_placed_ok_of_deps_fd) open LibsignalBinary.Proofs.SignalSession.Cli.Store.LoadPollRecordDeser (ofBytesEnv) @@ -261,4 +265,33 @@ theorem w1BinaryIdKitPlaced_withFds_okIE [LibsignalPlacement] {M : AllocCostMode (Nat.le_refl trustShimNeed) (Nat.le_refl saveShimNeed) exact identityStoreKitPlacedOkI_withFds_of_fds henf hIdFds +theorem w1BinaryIdKitPlaced_withFds_okIE_sat [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + (henf : lim.enforced = true) + (B : RunBudgets) (F0 : FsFiles) (peer : AddrGhost) + (hDropNz : lsmpl.base 547 ≠ 0#64) + (hh : RunHooksPlaced A lim H) + (hhWf : RunHooksPlaced (withFds A) lim H) + (hGet589 : subroutine_ok (lsProg_589 H) (lsmpl.base 589) + (withFdsGe3Closed + (dirGetSpecPlaced cliIo.rd cliWrOk A lim + (DirGetEnv PathEnv (ReadFileRuleEnvFixed cliIo.rd) cliIo.rd) + (RunBudgets.dirGetNeed ⟨B.readFile⟩)))) + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : + IdentityStoreKitPlacedOkI (withFds A) lim + (w1IdKitPlaced (withFds A).repAlloc B F0 peer) + (w1BinaryIdKitPlacedBudgetFixed (withFds A).repAlloc B F0 peer) H := by + have hPut543Wf := cliDirPutStr_placed_ok hhWf + have hPut543Fd := subroutine_ok_dirPutStr_withFdsGe3Closed_of_withFds henf hPut543Wf + have h566Fd := idTrustPoll_placed_ok_of_get_bb_fd_sat hh.allocFs hGet589 h_bb + (Nat.le_refl _) (by decide) (by decide) + have h565Fd := idSavePoll_placed_ok_of_get_put_bb_fd_sat hh.allocFs hGet589 hPut543Fd h_bb + (Nat.le_refl _) (by decide) (by decide) (by decide) (by decide) + have hIdFds := cliIdKitOkIE_fds_placed_direct_of_polls + (F0 := F0) (peer := peer) (vtSym := cliIdentityVtRoSym) + hDropNz hh.allocFs h566Fd h565Fd + (Nat.le_refl trustShimNeed) (Nat.le_refl saveShimNeed) + exact identityStoreKitPlacedOkI_withFds_of_fds henf hIdFds + end LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Ratchet.EncryptSlotWithFds diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Skeleton.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Skeleton.lean index f589490cc..e7e6dc2b1 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Skeleton.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Skeleton.lean @@ -307,7 +307,7 @@ theorem RunHooks.cli (W : CliHooks) (img : Obj.Image) : memcpyRO := cli_hookSat_memcpy_region_ro W bcmp := RunGlue.cli_hookSat_bcmp W fs := RunGlue.traceFsSound_cli W img.base - utf8 := ⟨W.utf8Err, cliExterns_row W (List.mem_append_right _ (by simp))⟩ + utf8 := ⟨CryptoVerification.SignalSession.cliDefaultUtf8Err, cliExterns_row W (List.mem_append_right _ (by simp))⟩ memrchr := cliExterns_memrchr W allocHooks := Slots.cliExterns_allocHooks W allocZeroed := Slots.cliExterns_allocZeroed W diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/SkeletonPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/SkeletonPlaced.lean index abe329b39..52a77ff51 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/SkeletonPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/SkeletonPlaced.lean @@ -29,6 +29,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.TryAllocateIn public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.Reserve11Placed public import LibsignalBinary.Proofs.SignalSession.Cli.Dir.Path.Placed public import LibsignalBinary.Proofs.RecordCodecs.IdentityKeyDecode +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.Deserialize public import LibsignalBinary.Proofs.TripleRatchet.Wire.TryFromHooks import all Arm64.Trusted.Spec.Hoare @@ -88,6 +89,9 @@ structure RunHooksPlaced [LibsignalPlacement] (A : RustAlloc) allocZeroed : HookSat ext lsRustAllocZeroedSymCli (rustAllocZeroedSpec A) stringClone : HookSat ext lsStringCloneSym (LibsignalPublicApi.stringCloneSpec A) formatInner : HookSat ext lsFormatInnerSym (LibsignalTripleRatchet.formatInnerSpec A) + blackBox : + HookSat ext lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat /-- Relocatable `[LibsignalPlacement]` callee contracts for `signal_session::run` (Block `579`, `lsProg_579 ext`). -/ structure RunCalleesPlaced [LibsignalPlacement] (A : RustAlloc) @@ -368,27 +372,4 @@ theorem pkDeserializeFull_placed_ok [LibsignalPlacement] {callerProg : Program} rw [sepConj_assoc, satisfies_pure_sepConj] at hpost exact hpost.2 -/-- Instantiates `RunHooksPlaced` at `cliGhostExterns g (cliExternsPlaced mmpl W)` and `E2E.HooksE.A0`. -/ -theorem RunHooksPlaced.cli [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) - (hG : CliGhostA0Hooks E2E.HooksE.A0 g) - (hStrFsT : ∀ f, g.stringClone = some f → HookFsTraced IsFsC f) - (hStrClone : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsStringCloneSym - (LibsignalPublicApi.stringCloneSpec E2E.HooksE.A0)) - (hFmtInner : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsFormatInnerSym - (LibsignalTripleRatchet.formatInnerSpec E2E.HooksE.A0)) : - RunHooksPlaced E2E.HooksE.A0 (cliGhostExterns g (cliExternsPlaced mmpl W)) where - alloc := allocContractsXCliPlaced_cli mmpl g W hG - allocFs := allocContractsFsPlaced_cli mmpl g W hG - panics := fun _ hmem => cliGhostExterns_panic_of_mem mmpl g W hmem - memcpyRO := cliExternsPlaced_memcpyRegionRO_sat mmpl g W hG - bcmp := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W (cli_hookSat_bcmp_placed mmpl W) - fs := fun _ _ => traceFsSound_lsProg_cli_ghost mmpl g W (cliGhostA0Hooks_to_fs hG hStrFsT) - utf8 := ⟨W.utf8Err, cliGhostExterns_fromUtf8_eq mmpl g W⟩ - memrchr := cliGhostExterns_memrchr_eq mmpl g W - codecHooks := codecHooksPlaced_cli mmpl g W hG - allocZeroed := cliExternsPlaced_allocZeroed_sat mmpl g W hG - stringClone := hStrClone - formatInner := hFmtInner - end CryptoVerification.SignalSession.Cli.RunSkeleton diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/SkeletonPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/SkeletonPlacedBudget.lean index d85e65a3b..bbf02a1fe 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/SkeletonPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/SkeletonPlacedBudget.lean @@ -12,6 +12,7 @@ module public import LibsignalBinary.Heap.RustStdAllocBudgetBridge public import LibsignalBinary.Proofs.RecordCodecs.DepsBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Dir.Path.PlacedBudget +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AddressPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AllocFsSitesPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.Reserve11PlacedBudget @@ -64,7 +65,7 @@ open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) open CryptoVerification.RecordCodecs.Placed (blkPC_18 blkPl_18 instIsLsBlockProg_18) open CryptoVerification.RecordCodecsBinary.IdentityKeyDecode (identityKey_decode_placed_ok) open CryptoVerification.SignalSession - (CliHooks cliExternsPlaced lsFormatInnerSym lsFromUtf8Sym lsMemrchrSym lsReadFileSym + (CliHooks cliExternsPlaced lsBlackBoxSym lsFormatInnerSym lsFromUtf8Sym lsMemrchrSym lsReadFileSym lsRustAllocZeroedSymCli lsStringCloneSym) open CryptoVerification.SignalSession.Cli (DirGhost cliBcmpSpec) open CryptoVerification.SignalSession.Cli.MainHops (cliIo cliWrOk fromUtf8AsciiSpec memrchrSpec) @@ -88,9 +89,11 @@ open LibsignalBinary.Heap.SpecBudget (formatInnerBudgetSpec withVmPreserved) open LibsignalBinary.Proofs.RecordCodecs.DepsBudget (CodecHooksPlaced identityKeyDecodeRawSpec) open LibsignalBinary.Proofs.SignalSession.Cli.Dir.Path.PlacedBudget (PathEnv path_placed_caller_ok_of_deps) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet + (hookSat_withLsRet withLsRet) open LibsignalBinary.Proofs.SignalSession.Cli.Main.CalleesBudget (addressSpec) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AddressPlacedBudget - (address_placed_ok_rocl) + (address_placed_ok_rocl_ls) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AllocFsSitesPlacedBudget (AllocContractsFsPlaced.shim2_rocl) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.Reserve11PlacedBudget @@ -118,9 +121,9 @@ open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliAllocHooks CliGhostAllocHooks CliGhostSpqrAllocHooks allocContractsFsPlaced_of_hooks allocContractsXCliPlaced_of_hooks - cliExternsPlaced_bcmp_budget_sat cliExternsPlaced_fromUtf8_budget_sat - cliExternsPlaced_memrchr_budget_sat cliGhostExterns_memcpyRegionRO_budget_sat - codecHooksPlaced_of_hooks) + cliGhostExterns_bcmp_keepsFs_budget_sat cliGhostExterns_blackBoxSat_budget_sat + cliGhostExterns_fromUtf8_budget_sat cliGhostExterns_memcpyRegionRO_budget_sat + cliGhostExterns_memrchr_budget_sat codecHooksPlaced_of_hooks) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsFsPlaced AllocContractsXCliPlaced bundleReadSpecPlaced dirGetSpecPlaced pathSpecPlaced readFileSpecPlaced splitIdSpecPlaced splitSignedSpecPlaced) @@ -137,14 +140,16 @@ structure RunHooksPlaced [LibsignalPlacement] {M : AllocCostModel} allocFs : AllocContractsFsPlaced A lim ext panics : CliPanicHooksPlaced ext memcpyRO : HookSat ext lsMemcpySym (withVmPreserved sessionMemcpyRegionROSpec) - bcmp : HookSat ext "bcmp" (withVmPreserved cliBcmpSpec) + bcmp : HookSat ext "bcmp" (withVmPreserved cliBcmpSpec).keepsFs fs : ∀ (prog : Program) (i : Nat), [IsLsBlockProg prog i ext] → TraceFsSound prog utf8 : ∀ stk : Nat, HookSat ext lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec stk)) - memrchr : ∀ stk : Nat, HookSat ext lsMemrchrSym (withVmPreserved (memrchrSpec stk)) + memrchr : HookSat ext lsMemrchrSym (withLsRet (withVmPreserved (memrchrSpec extHookStack))) codecHooks : CodecHooksPlaced M A lim ext allocZeroed : HookSat ext lsRustAllocZeroedSymCli (rustCliAllocBudgetSpec M A lim true) stringClone : HookSat ext lsStringCloneSym (stringCloneBudgetSpec M A lim) formatInner : HookSat ext lsFormatInnerSym (formatInnerBudgetSpec M A lim) + blackBox : HookSat ext lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat /-- Allocation-event envelopes for the non-slot callees of `RunCalleesPlaced` (`read_file`, `Dir::get`, `read_bundle::{closure#0}`, `split_id`, `split_signed`). -/ @@ -222,13 +227,13 @@ theorem runAddress_placed_ok [LibsignalPlacement] {callerProg : Program} {i : Na subroutine_ok callerProg (lsmpl.base 580) (withLsCodeRoLoaded lsmpl (addressSpec A lim uuidTryParse resStack)) := by have hmemrchr : subroutine_ok (lsProg_580 ext) (lsρ lsMemrchrSym) - (withLsRoCl lsmpl (withVmPreserved (memrchrSpec extHookStack))) := by + (withLsRoCl lsmpl (withLsRet (withVmPreserved (memrchrSpec extHookStack)))) := by have hplain : subroutine_ok (lsProg_580 ext) (lsρ lsMemrchrSym) - (withVmPreserved (memrchrSpec extHookStack)) := by + (withLsRet (withVmPreserved (memrchrSpec extHookStack))) := by dsimp only [lsProg_580] - exact ls_hook_ok_ultra_of_mem (hh.memrchr extHookStack) (by decide) + exact ls_hook_ok_ultra_of_mem hh.memrchr (by decide) exact subroutine_ok_rocl_of_plain hplain - have hrocl := address_placed_ok_rocl (prog := callerProg) (i := i) + have hrocl := address_placed_ok_rocl_ls (prog := callerProg) (i := i) hh.allocFs hmemrchr hres hres64 hi refine subroutine_ok_mono hrocl (fun _ _ _ h => h) ?_ (fun _ _ _ _ hp => hp) intro x R s0 sf hpost @@ -450,23 +455,15 @@ theorem RunHooksPlaced.of_ghost [LibsignalPlacement] allocFs := allocContractsFsPlaced_of_ghost mmpl W baseExt g hBase hG.toCliGhostAllocHooks panics := cliGhostExterns_panics g hBase.panics memcpyRO := cliGhostExterns_memcpyRegionRO_budget_sat baseExt hG.toCliGhostAllocHooks - bcmp := hookSat_of_eq - ((cliGhostExterns_other g baseExt (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans hBase.bcmp_eq) - (cliExternsPlaced_bcmp_budget_sat mmpl W) + bcmp := cliGhostExterns_bcmp_keepsFs_budget_sat g baseExt hG.extraOk fs prog i _ := traceFsSound_lsProg_ghost hG hStrFsT hFsBase prog i - utf8 stk := hookSat_of_eq - ((cliGhostExterns_other g baseExt (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans hBase.utf8_eq) - (cliExternsPlaced_fromUtf8_budget_sat mmpl W stk) - memrchr stk := hookSat_of_eq - ((cliGhostExterns_other g baseExt (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans hBase.memrchr_eq) - (cliExternsPlaced_memrchr_budget_sat mmpl W stk) + utf8 stk := cliGhostExterns_fromUtf8_budget_sat g baseExt hG.extraOk stk + memrchr := cliGhostExterns_memrchr_budget_sat g baseExt hG.extraOk (Nat.le_refl _) codecHooks := codecHooksPlaced_of_ghost mmpl W baseExt g hBase hG.toCliGhostAllocHooks allocZeroed := ⟨g.allocZeroed, cliGhostExterns_allocZeroed g baseExt, hG.allocZeroed⟩ stringClone := hStrClone formatInner := hFmt + blackBox := cliGhostExterns_blackBoxSat_budget_sat g baseExt hG.extraOk /-- Constructs `RunHooksPlaced A lim (cliGhostExterns g (cliExternsPlaced mmpl W))` from `CliGhostSpqrAllocHooks` and `HookSat` witnesses for `String::clone` and `format_inner`. -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/CliHookSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/CliHookSat.lean index a2355843c..c5f79663d 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/CliHookSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/CliHookSat.lean @@ -162,8 +162,8 @@ theorem cliExterns_timeAdd (W : CliHooks) : ⟨E2E.timeAddHook, cliExterns_row W (timeAdd_row W), E2E.HooksE.timeAddHook_ok⟩ theorem cliExterns_bcmp (W : CliHooks) : HookSat (cliExterns W) cliBcmpName cliBcmpSpec := RunGlue.cli_hookSat_bcmp W -theorem cliBcmpHook_vregs_ok (W : CliHooks) : - HookOk (cliBcmpHook W.bcmp) E2E.HooksE.bcmpVregsSpec := by +theorem cliBcmpHook_vregs_ok (_W : CliHooks) : + HookOk (cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp) E2E.HooksE.bcmpVregsSpec := by refine retHook_ok fun x R s0 hrun hpre _hsp => ?_ simp only [E2E.HooksE.bcmpVregsSpec, sepConj_assoc, satisfies_pure_sepConj] at hpre rcases hpre with ⟨⟨hx0, hx1, hx2, hlen⟩, hmem⟩ @@ -179,13 +179,13 @@ theorem cliBcmpHook_vregs_ok (W : CliHooks) : rw [hx0, hx1, hx2, hreadA, hreadB] try rw [CryptoVerification.LibsignalSession.NonVacuityWitness.readReg64_setPC_writeReg64_x0] simp only [sepConj_assoc, satisfies_pure_sepConj] - exact ⟨⟨W.bcmp_ok x.bsA x.bsB hlen.symm, rfl, rfl⟩, hmem⟩ + exact ⟨⟨CryptoVerification.SignalSession.cliDefaultBcmp_ok x.bsA x.bsB hlen.symm, rfl, rfl⟩, hmem⟩ theorem cliExterns_bcmpVregs (W : CliHooks) : HookSat (cliExterns W) E2E.bcmpName E2E.HooksE.bcmpVregsSpec := - ⟨cliBcmpHook W.bcmp, cliExterns_row W (RunGlue.bcmp_row W), cliBcmpHook_vregs_ok W⟩ + ⟨cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp, cliExterns_row W (RunGlue.bcmp_row W), cliBcmpHook_vregs_ok W⟩ theorem cliExterns_e2eBcmp (W : CliHooks) : HookSat (cliExterns W) E2E.bcmpName E2E.HooksE.e2eBcmpSpec := - ⟨cliBcmpHook W.bcmp, cliExterns_row W (RunGlue.bcmp_row W), + ⟨cliBcmpHook CryptoVerification.SignalSession.cliDefaultBcmp, cliExterns_row W (RunGlue.bcmp_row W), E2E.HooksE.hookOk_bcmpSpec_of_vregs (cliBcmpHook_vregs_ok W)⟩ theorem cliExterns_memcpyRegionRO (W : CliHooks) : HookSat (cliExterns W) memcpyName CryptoVerification.SpqrV1.Alloc.sessionMemcpyRegionROSpec := diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/CliHookSatPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/CliHookSatPlaced.lean index a46c09bed..51f799fbc 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/CliHookSatPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/CliHookSatPlaced.lean @@ -15,10 +15,13 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Glue.BcmpHookPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Glue.FsTracedPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.Run.ReadFileHookPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSat +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.StrlenUtf8A1 public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AddressA1 public import LibsignalBinary.Proofs.TripleRatchet.Hooks public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEq +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.ConsumeMessageKey.HmacProofs.Defs public import LibsignalBinary.Proofs.SessionRecordMin.Deserialize public import LibsignalBinary.Proofs.RecordCodecs.Deps @@ -57,6 +60,8 @@ open CryptoVerification.LibsignalTripleRatchet CryptoVerification.LibsignalPubli open CryptoVerification.LibsignalPublicApi.StoreKit open CryptoVerification.LibsignalSession CryptoVerification.LibsignalSpqrV1 open CryptoVerification.SignalSession CryptoVerification.SignalSession.Cli +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraSpecOk GhostRowSpecOk hookSat_cliGhostExterns_of_extraOk) open CryptoVerification.SignalSession.Cli.Main.Placed (lsProg_617 instIsLsBlockProg_617) open CryptoVerification.SignalSession.Cli.MainHops open CryptoVerification.SignalSession.Cli.RunGlue @@ -167,84 +172,36 @@ theorem libcruxHmac_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : (lsLibcruxHmacSymCli, E2E.libcruxHmacHookMallocng mmpl W.C.F) ∈ cliHookTablePlaced mmpl W := List.mem_append_left _ (List.mem_of_getElem? (i := 17) rfl) --- Right `19` rows (`18 + 19 = 37` rows): -theorem memmove_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : - ("memmove", hookMemmove) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 0) rfl) --- index 1 is `RunGlue.bcmp_row_placed` -theorem strlen_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : - ("strlen", strlenHook) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 2) rfl) +-- Right `9` rows (`18 + 9 = 27` rows): theorem writeFile_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : (lsWriteFileSym, writeFileHook) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 3) rfl) + List.mem_append_right _ (List.mem_of_getElem? (i := 0) rfl) theorem writeStdout_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : (lsWriteStdoutSym, writeStdoutHook) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 4) rfl) -theorem memrchr_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : - (lsMemrchrSym, memrchrHook) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 5) rfl) -theorem fromUtf8_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : - (lsFromUtf8Sym, fromUtf8Hook W.utf8Err) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 6) rfl) + List.mem_append_right _ (List.mem_of_getElem? (i := 1) rfl) theorem fmtWrite_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : (lsFmtWriteSym, E2E.fmtWriteHook0) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 7) rfl) + List.mem_append_right _ (List.mem_of_getElem? (i := 2) rfl) theorem formatInner_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : (lsFormatInnerSym, E2E.formatInnerHook0) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 8) rfl) -theorem durationSince_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : - (lsDurationSinceSym, durationSinceExactHook) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 9) rfl) -theorem timeAdd_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : - (lsTimeAddSym, E2E.timeAddHook) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 10) rfl) -theorem blackBox_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : - (lsBlackBoxSym, LibsignalSession.blackBoxHook) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 11) rfl) + List.mem_append_right _ (List.mem_of_getElem? (i := 3) rfl) theorem compress256_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : (lsCompress256Sym, LibsignalHmac.compress256Hook W.C.F) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 12) rfl) + List.mem_append_right _ (List.mem_of_getElem? (i := 4) rfl) theorem aesEnc_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : (lsAesEncSym, E2E.aesEncHookMallocng mmpl W.C.E) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 13) rfl) + List.mem_append_right _ (List.mem_of_getElem? (i := 5) rfl) theorem aesDec_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : (lsAesDecSym, E2E.aesDecHookMallocng mmpl W.C.D) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 14) rfl) + List.mem_append_right _ (List.mem_of_getElem? (i := 6) rfl) theorem pubFromSecret_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : (lsPubFromSecretSym, LibsignalTripleRatchet.pubFromSecretHook W.C.pubKey) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 15) rfl) + List.mem_append_right _ (List.mem_of_getElem? (i := 7) rfl) theorem diffieHellman_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : (lsDiffieHellmanSym, LibsignalTripleRatchet.diffieHellmanHook W.C.X) ∈ cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 16) rfl) -theorem staticSecretDrop_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : - (lsStaticSecretDropSym, LibsignalTripleRatchet.zeroizeSecretHook) ∈ - cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 17) rfl) -theorem sharedSecretDrop_row_placed (mmpl : Obj.MultiPlacement) (W : CliHooks) : - (lsSharedSecretDropSym, LibsignalTripleRatchet.zeroizeSecretHook) ∈ - cliHookTablePlaced mmpl W := - List.mem_append_right _ (List.mem_of_getElem? (i := 18) rfl) - -theorem cliExternsPlaced_fromUtf8_eq (mmpl : Obj.MultiPlacement) (W : CliHooks) : - cliExternsPlaced mmpl W lsFromUtf8Sym = some (fromUtf8Hook W.utf8Err) := - cliExternsPlaced_row mmpl W (fromUtf8_row_placed mmpl W) - -theorem cliExternsPlaced_memrchr_eq (mmpl : Obj.MultiPlacement) (W : CliHooks) : - cliExternsPlaced mmpl W lsMemrchrSym = some memrchrHook := - cliExternsPlaced_row mmpl W (memrchr_row_placed mmpl W) - -theorem cliGhostExterns_fromUtf8_eq (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) : - cliGhostExterns g (cliExternsPlaced mmpl W) lsFromUtf8Sym = some (fromUtf8Hook W.utf8Err) := - (cliGhostExterns_other g _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans (cliExternsPlaced_fromUtf8_eq mmpl W) - -theorem cliGhostExterns_memrchr_eq (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) : - cliGhostExterns g (cliExternsPlaced mmpl W) lsMemrchrSym = some memrchrHook := - (cliGhostExterns_other g _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans (cliExternsPlaced_memrchr_eq mmpl W) + List.mem_append_right _ (List.mem_of_getElem? (i := 8) rfl) /-! ## 3. Panic symbols of `cliPanicSymbolsPlaced` -/ @@ -380,6 +337,9 @@ structure CliGhostA0Hooks (A : RustAlloc) (g : CliGhostHooks) : Prop where (∀ s : State, (f s).fs = s.fs) ∧ HookFsTraced IsFsC f memcpy_exact : ∀ f, g.memcpy = some f → HookExactMemcpy f + extraOk : + ∀ [LibsignalPlacement], + LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.ExtraSpecOk g /-- Canonical `E2E.HooksE.A0` instantiation of `CliGhostHooks` (no replay obligation). -/ noncomputable def a0Ghost : CliGhostHooks where @@ -391,6 +351,7 @@ noncomputable def a0Ghost : CliGhostHooks where stringClone := some E2E.stringCloneHook0 memset := some hookMemset memcpy := some hookMemcpy + extra := LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts.pureExtraGhosts theorem cliGhostA0Hooks_a0Ghost : CliGhostA0Hooks E2E.HooksE.A0 a0Ghost where alloc := E2E.HooksE.allocHook0_ok @@ -414,6 +375,8 @@ theorem cliGhostA0Hooks_a0Ghost : CliGhostA0Hooks E2E.HooksE.A0 a0Ghost where CryptoVerification.LibsignalTripleRatchet.framelessMemcpy_hookOk, CryptoVerification.SpqrV1.Alloc.hookMemcpy_region_ro_trace_ok, hookMemcpy_fs, hookMemcpy_fsT⟩ memcpy_exact := fun f hf => by cases hf; exact hookMemcpy_exact + extraOk := fun [_] => + LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts.pureExtraGhosts_specOk theorem cliGhostExterns_a0_exactMemcpy_sat (baseExt : LibsignalHooks) {A : RustAlloc} {g : CliGhostHooks} (hG : CliGhostA0Hooks A g) : @@ -462,7 +425,7 @@ theorem _root_.LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat.HkdfPlacedHoo exact ⟨f, (hExt lsMemcpySym (by decide)).trans hf, hex⟩ · exact (hExt lsCompress256Sym (by decide)).trans hBase.compress256 -theorem cliGhostA0Hooks_to_fs {A : RustAlloc} {g : CliGhostHooks} +theorem cliGhostA0Hooks_to_fs [LibsignalPlacement] {A : RustAlloc} {g : CliGhostHooks} (hG : CliGhostA0Hooks A g) (hStrFsT : ∀ f, g.stringClone = some f → HookFsTraced IsFsC f) : CliGhostHooksFs g where @@ -482,6 +445,7 @@ theorem cliGhostA0Hooks_to_fs {A : RustAlloc} {g : CliGhostHooks} intro f hf cases hf₀.symm.trans hf exact hfsT + extra_fsT := hG.extraOk.fsT theorem a0Ghost_stringClone_fsT : ∀ f, a0Ghost.stringClone = some f → HookFsTraced IsFsC f := by @@ -509,9 +473,11 @@ theorem cliGhostExterns_sat_of_cliExternsPlaced {α : Type} (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) (h9 : sym ≠ lsMemsetSym := by decide) - (h10 : sym ≠ lsMemcpySym := by decide) : + (h10 : sym ≠ lsMemcpySym := by decide) + (hExtra : cliExtraGhostSyms.contains sym = false ∨ g.extra.lookup sym = none := by + left; decide) : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) sym spec := - hookSat_of_eq (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10) hsat + hookSat_of_eq (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 hExtra) hsat theorem cliGhostExterns_readFile_sat {α : Type} (g : CliGhostHooks) (baseExt : LibsignalHooks) {rfh : State → State} {hrfh : HookFsTraced IsFsC rfh} {spec : Spec α} @@ -588,14 +554,6 @@ theorem cliExternsPlaced_sessionMemsetRegion_sat (mmpl : Obj.MultiPlacement) (g obtain ⟨f, hf, _, _, _, hok, _, _⟩ := hG.memset exact ⟨f, cliGhostExterns_memset_some g _ hf, hok⟩ -theorem cliExternsPlaced_memmove_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) (stk : Nat) : - HookSat (cliExternsPlaced mmpl W) "memmove" (libcMemmoveSpec stk) := - ⟨hookMemmove, cliExternsPlaced_row mmpl W (memmove_row_placed mmpl W), hookMemmove_ok stk⟩ - -theorem cliExternsPlaced_sessionMemmove_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) (stk : Nat) : - HookSat (cliExternsPlaced mmpl W) "memmove" (sessionMemmoveSpec stk) := - ⟨hookMemmove, cliExternsPlaced_row mmpl W (memmove_row_placed mmpl W), hookMemmove_trace_ok stk⟩ - theorem cliExternsPlaced_memcpy_sat (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) {A : RustAlloc} (hG : CliGhostA0Hooks A g) (stk : Nat) : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) "memcpy" (libcMemcpySpec stk) := by @@ -634,31 +592,67 @@ theorem cliExternsPlaced_memcpyRegionRO_sat (mmpl : Obj.MultiPlacement) (g : Cli obtain ⟨f, hf, _, _, _, _, _, hok, _, _⟩ := hG.memcpy exact ⟨f, cliGhostExterns_memcpy_some g _ hf, hok⟩ -theorem cliExternsPlaced_bcmp_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) "bcmp" cliBcmpSpec := - RunGlue.cli_hookSat_bcmp_placed mmpl W - -theorem cliExternsPlaced_bcmpVregs_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) "bcmp" E2E.HooksE.bcmpVregsSpec := - ⟨cliBcmpHook W.bcmp, cliExternsPlaced_bcmp mmpl W, cliBcmpHook_vregs_ok W⟩ - -theorem cliExternsPlaced_e2eBcmp_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) "bcmp" E2E.HooksE.e2eBcmpSpec := - ⟨cliBcmpHook W.bcmp, cliExternsPlaced_bcmp mmpl W, - E2E.HooksE.hookOk_bcmpSpec_of_vregs (cliBcmpHook_vregs_ok W)⟩ - -theorem cliExternsPlaced_strlen_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) (stk : Nat) : - HookSat (cliExternsPlaced mmpl W) "strlen" (strlenSpec stk) := - ⟨strlenHook, cliExternsPlaced_row mmpl W (strlen_row_placed mmpl W), strlenHook_ok stk⟩ - -theorem cliExternsPlaced_memrchr_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) (stk : Nat) : - HookSat (cliExternsPlaced mmpl W) lsMemrchrSym (memrchrSpec stk) := - ⟨memrchrHook, cliExternsPlaced_row mmpl W (memrchr_row_placed mmpl W), memrchrHook_ok stk⟩ - -theorem cliExternsPlaced_fromUtf8_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) (stk : Nat) : - HookSat (cliExternsPlaced mmpl W) lsFromUtf8Sym (fromUtf8AsciiSpec stk) := - ⟨fromUtf8Hook W.utf8Err, cliExternsPlaced_row mmpl W (fromUtf8_row_placed mmpl W), - fromUtf8Hook_ok stk W.utf8Err⟩ +theorem cliGhostExterns_bcmp_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) "bcmp" cliBcmpSpec := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.bcmp_ok + +theorem cliGhostExterns_bcmpVregs_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) "bcmp" E2E.HooksE.bcmpVregsSpec := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.bcmpVregs_ok + +theorem cliGhostExterns_e2eBcmp_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) "bcmp" E2E.HooksE.e2eBcmpSpec := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.e2eBcmp_ok + +theorem cliGhostExterns_strlen_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) (stk : Nat) : + HookSat (cliGhostExterns g baseExt) "strlen" + (LibsignalBinary.Proofs.HookDischarge.Libc.Strlen.withStrlenPadRO + (strlenSpec stk)) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.strlen_ok stk + +theorem cliGhostExterns_strlenRO_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) (stk : Nat) : + HookSat (cliGhostExterns g baseExt) "strlen" + (LibsignalBinary.Proofs.HookDischarge.Libc.Strlen.withStrlenPadRO + (LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO.strlenSpecRO stk)) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.strlenRO_ok stk + +theorem cliGhostExterns_memrchr_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) {stk : Nat} + (hstk : extHookStack ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookSat (cliGhostExterns g baseExt) lsMemrchrSym (withLsRet (memrchrSpec stk)) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.memrchr_ok hstk hstk_ub + +theorem cliGhostExterns_memrchrRO_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) {stk : Nat} + (hstk : extHookStack ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookSat (cliGhostExterns g baseExt) lsMemrchrSym + (withLsRet (LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO.memrchrSpecRO stk)) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.memrchrRO_ok hstk hstk_ub + +theorem cliGhostExterns_fromUtf8_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) (stk : Nat) : + HookSat (cliGhostExterns g baseExt) lsFromUtf8Sym (fromUtf8AsciiSpec stk) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.fromUtf8_ok stk + +theorem cliGhostExterns_fromUtf8RO_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) (stk : Nat) : + HookSat (cliGhostExterns g baseExt) lsFromUtf8Sym + (LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO.fromUtf8AsciiSpecRO stk) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.fromUtf8RO_ok stk theorem cliExternsPlaced_readFile_sat (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) (stk : Nat) @@ -971,30 +965,35 @@ theorem cliExternsPlaced_formatInner_sat (mmpl : Obj.MultiPlacement) (W : CliHoo ⟨E2E.formatInnerHook0, cliExternsPlaced_row mmpl W (formatInner_row_placed mmpl W), E2E.HooksE.formatInnerHook0_ok⟩ -theorem cliExternsPlaced_durationSinceEpoch_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) lsDurationSinceSym durationSinceEpochSpec := - ⟨durationSinceExactHook, cliExternsPlaced_row mmpl W (durationSince_row_placed mmpl W), - durationSinceExactHook_epoch_ok⟩ - -theorem cliExternsPlaced_durationSinceEpochAlloc_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) lsDurationSinceSym durationSinceEpochAllocSpec := - ⟨durationSinceExactHook, cliExternsPlaced_row mmpl W (durationSince_row_placed mmpl W), - durationSinceExactHook_epoch_alloc_ok⟩ - -theorem cliExternsPlaced_durationSinceBounded_sat [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) lsDurationSinceSym +theorem cliGhostExterns_durationSinceEpoch_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) {stk : Nat} + (hstk : 208 ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookSat (cliGhostExterns g baseExt) lsDurationSinceSym + (withLsRet (durationSinceEpochAtSpec stk)) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => + hRow.durationSinceEpochAt_ok hstk hstk_ub + +theorem cliGhostExterns_durationSinceEpochAlloc_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) lsDurationSinceSym + (withLsRet durationSinceEpochAllocSpec) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => + hRow.durationSinceEpochAt_ok (by decide : 208 ≤ allocHookStack) (by decide) + +theorem cliGhostExterns_durationSinceBounded_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) lsDurationSinceSym (withLsRet durationSinceBoundedSpec) := - hookSat_withLsRet ⟨durationSinceExactHook, - cliExternsPlaced_row mmpl W (durationSince_row_placed mmpl W), - durationSinceExactHook_bounded_ok⟩ + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.durationSinceBounded_ok -theorem cliExternsPlaced_timeAdd_sat [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) lsTimeAddSym (withLsRet timeAddSpec) := - hookSat_withLsRet ⟨E2E.timeAddHook, - cliExternsPlaced_row mmpl W (timeAdd_row_placed mmpl W), - E2E.HooksE.timeAddHook_ok⟩ +theorem cliGhostExterns_timeAdd_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) lsTimeAddSym (withLsRet timeAddSpec) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.publicApiTimeAdd_ok theorem blackBoxHook_ok : HookOk LibsignalSession.blackBoxHook LibsignalSession.FindReceiverChainIndex.blackBoxSpec := by @@ -1005,11 +1004,23 @@ theorem blackBoxHook_ok : cases hf exact hok -theorem cliExternsPlaced_blackBox_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) lsBlackBoxSym - LibsignalSession.FindReceiverChainIndex.blackBoxSpec := - ⟨LibsignalSession.blackBoxHook, cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W), - blackBoxHook_ok⟩ +theorem cliGhostExterns_blackBox_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) {stk : Nat} + (hstk : 16 ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookSat (cliGhostExterns g baseExt) lsBlackBoxSym + (CryptoVerification.LibsignalTripleRatchet.withStack + LibsignalSession.FindReceiverChainIndex.blackBoxSpec stk) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => + hRow.findReceiverBlackBox_ok hstk hstk_ub + +theorem cliGhostExterns_blackBox16_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpec16 := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => + hRow.blackBox_ok (by decide : 16 ≤ 16) (by decide) -- AES-CBC & X25519: theorem cliExternsPlaced_aesEnc_sat (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) @@ -1041,15 +1052,17 @@ theorem cliExternsPlaced_diffieHellman_sat (mmpl : Obj.MultiPlacement) (W : CliH ⟨LibsignalTripleRatchet.diffieHellmanHook W.C.X, cliExternsPlaced_row mmpl W (diffieHellman_row_placed mmpl W), diffieHellmanHook_ok W.C.X⟩ -theorem cliExternsPlaced_staticSecretDrop_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) lsStaticSecretDropSym zeroizeSecretSpec := - ⟨LibsignalTripleRatchet.zeroizeSecretHook, - cliExternsPlaced_row mmpl W (staticSecretDrop_row_placed mmpl W), zeroizeSecretHook_ok⟩ +theorem cliGhostExterns_staticSecretDrop_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) lsStaticSecretDropSym zeroizeSecretSpec := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.staticSecretDrop_ok -theorem cliExternsPlaced_sharedSecretDrop_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) lsSharedSecretDropSym zeroizeSecretSpec := - ⟨LibsignalTripleRatchet.zeroizeSecretHook, - cliExternsPlaced_row mmpl W (sharedSecretDrop_row_placed mmpl W), zeroizeSecretHook_ok⟩ +theorem cliGhostExterns_sharedSecretDrop_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) lsSharedSecretDropSym zeroizeSecretSpec := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.sharedSecretDrop_ok -- PQXDH & SPQR (`18` left rows): theorem cliExternsPlaced_compress512_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) @@ -1193,12 +1206,14 @@ private theorem cli_row_ghost_rocl_ok [LibsignalPlacement] {α : Type} (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) (h9 : sym ≠ lsMemsetSym := by decide) - (h10 : sym ≠ lsMemcpySym := by decide) : + (h10 : sym ≠ lsMemcpySym := by decide) + (hExtra : cliExtraGhostSyms.contains sym = false ∨ g.extra.lookup sym = none := by + left; decide) : subroutine_ok (lsProg_617 (cliGhostExterns g (cliExternsPlaced mmpl W))) (lsρ sym) (StoreKit.withLsCodeRoLoaded lsmpl spec) := ghost_stub_placed_rocl_ok (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W ⟨f, cliExternsPlaced_row mmpl W hrow, hh⟩ - h1 h2 h3 h4 h5 h6 h7 h8 h9 h10) + h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 hExtra) hmem theorem allocContractsXCliPlaced_of_hooks [LibsignalPlacement] (mmpl : Obj.MultiPlacement) @@ -1227,9 +1242,6 @@ theorem allocContractsXCliPlaced_of_hooks [LibsignalPlacement] (mmpl : Obj.Multi memcpy_region stk _ _ := ghost_stub_placed_rocl_ok ⟨fMc, hMcEq, hookOk_withStack hMcReg stk⟩ session_memcpy_region stk _ _ := ghost_stub_placed_rocl_ok ⟨fMc, hMcEq, hookOk_withStack hMcSessReg stk⟩ - memmove stk _ _ := cli_row_ghost_rocl_ok mmpl g W (memmove_row_placed mmpl W) (hookMemmove_ok stk) - session_memmove stk _ _ := cli_row_ghost_rocl_ok mmpl g W (memmove_row_placed mmpl W) - (hookMemmove_trace_ok stk) memset stk hle _ := ghost_stub_placed_rocl_ok ⟨fMs, hMsEq, hMsLibc stk (pos_of_extHookStack_le hle)⟩ session_memset stk hle _ := ghost_stub_placed_rocl_ok @@ -1274,10 +1286,6 @@ theorem allocContractsFsPlaced_of_hooks [LibsignalPlacement] (mmpl : Obj.MultiPl ⟨fMc, hMcEq, (hookOk_withStack hMcReg stk).keepsFs hMcFs⟩ session_memcpy_region stk _ _ := ghost_stub_placed_rocl_ok ⟨fMc, hMcEq, (hookOk_withStack hMcSessReg stk).keepsFs hMcFs⟩ - memmove stk _ _ := cli_row_ghost_rocl_ok mmpl g W (memmove_row_placed mmpl W) <| - (hookMemmove_ok stk).keepsFs hookMemmove_fs - session_memmove stk _ _ := cli_row_ghost_rocl_ok mmpl g W (memmove_row_placed mmpl W) <| - (hookMemmove_trace_ok stk).keepsFs hookMemmove_fs memset stk hle _ := ghost_stub_placed_rocl_ok ⟨fMs, hMsEq, (hMsLibc stk (pos_of_extHookStack_le hle)).keepsFs hMsFs⟩ session_memset stk hle _ := ghost_stub_placed_rocl_ok @@ -1308,7 +1316,6 @@ theorem stage2ContractsMinPlaced_cli [LibsignalPlacement] (mmpl : Obj.MultiPlace (cliExternsPlaced_realloc_sat mmpl g W hG) (cliExternsPlaced_shim_sat mmpl g W hG.shim_eq) (cliExternsPlaced_sessionMemcpy_sat mmpl g W hG _) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W (cliExternsPlaced_sessionMemmove_sat mmpl W _)) (cliGhostExterns_panic_handle_error mmpl g W) (cliGhostExterns_panic_handle_alloc_error mmpl g W) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/CliHookSatPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/CliHookSatPlacedBudget.lean index e7f25b43d..4e6d74eac 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/CliHookSatPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/CliHookSatPlacedBudget.lean @@ -16,6 +16,7 @@ public import LibsignalBinary.Proofs.SessionRecordMin.DeserializeBudget public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlaced +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget public import LibsignalBinary.Proofs.SpqrV1.Alloc.ConcatBudgetAux public import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat @@ -43,11 +44,11 @@ open scoped CryptoVerification.RustHeap CryptoVerification.LibsignalTripleRatche open CryptoVerification (LibsignalHooks LibsignalPlacement libsignalSessionExterns lsHandleErrorSym ls_hook_ok_ultra_of_mem lsmpl lsρ) open CryptoVerification.LibsignalTripleRatchet (derivePublicKeyBytesSpec diffieHellmanSpec extHookStack framelessMemcpySpec framelessMemcpy_hookOk hookMemcpy_region_trace_ok hookMemcpy_trace_ok hookMemmove_trace_ok hookMemset_region_trace_ok hookMemset_trace_ok memcpyName memmoveName memsetName noAllocShimSpec noAllocShim_hookOk pubFromSecretSpec sessionMemcpyRegionSpec sessionMemcpySpec sessionMemsetRegionSpec sessionMemsetSpec sessionShim_hookOk withStack zeroizeSecretSpec) open CryptoVerification.RustHeap (allocHookStack) -open CryptoVerification.SignalSession (CliHooks cliBcmpHook cliExternsPlaced cliHookTablePlaced durationSinceExactHook fromUtf8Hook lsBlackBoxSym lsDurationSinceSym lsFromUtf8Sym lsMemcpySym lsMemrchrSym lsMemsetSym lsReadFileSym lsReadStdinSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli lsStringCloneSym lsTimeAddSym lsWriteFileSym lsWriteStdoutSym memrchrHook strlenHook writeFileHook writeStdoutHook) +open CryptoVerification.SignalSession (CliHooks cliExternsPlaced cliHookTablePlaced lsBlackBoxSym lsDurationSinceSym lsFromUtf8Sym lsMemcpySym lsMemrchrSym lsMemsetSym lsReadFileSym lsReadStdinSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli lsStringCloneSym lsTimeAddSym lsWriteFileSym lsWriteStdoutSym writeFileHook writeStdoutHook) open CryptoVerification.SignalSession.Cli (cliBcmpSpec) open CryptoVerification.SignalSession.Cli.MainHops (allocHook0_fs cliIo deallocHook_fs extHookStack_le fromUtf8AsciiSpec hookMemcpy_fs hookMemmove_fs hookMemset_fs hookNoop_fs hookOk_withStack memrchrSpec pos_of_extHookStack_le reallocHook0_fs strlenSpec) -open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks IsFsC allocHook0_fsT cliExternsPlaced_row cliGhostExterns cliGhostExterns_alloc cliGhostExterns_allocZeroed cliGhostExterns_dealloc cliGhostExterns_memcpy_some cliGhostExterns_memset_some cliGhostExterns_other cliGhostExterns_realloc cliGhostExterns_shim deallocHook_fsT hookMemcpy_fsT hookMemset_fsT hookSat_of_eq reallocHook0_fsT) -open CryptoVerification.SignalSession.Cli.Slots (blackBox_row_placed cliExternsPlaced_bcmpVregs_sat cliExternsPlaced_bcmp_sat cliExternsPlaced_blackBox_sat cliExternsPlaced_compress256Multi_sat cliExternsPlaced_compress256_sat cliExternsPlaced_derivePublicKeyBytes_sat cliExternsPlaced_diffieHellman_sat cliExternsPlaced_durationSinceBounded_sat cliExternsPlaced_durationSinceEpoch_sat cliExternsPlaced_e2eBcmp_sat cliExternsPlaced_fromUtf8_sat cliExternsPlaced_memmove_sat cliExternsPlaced_memrchr_sat cliExternsPlaced_pubFromSecret_sat cliExternsPlaced_sessionMemmove_sat cliExternsPlaced_sharedSecretDrop_sat cliExternsPlaced_staticSecretDrop_sat cliExternsPlaced_strlen_sat cliExternsPlaced_timeAdd_sat cliExternsPlaced_writeFile_sat cliExternsPlaced_writeStdout_sat cliGhostExterns_panic_handle_alloc_error cliGhostExterns_panic_handle_error cliGhostExterns_panic_option_expect_failed cliGhostExterns_sat_of_cliExternsPlaced compress256SingleSpec compress256_row_placed diffieHellman_row_placed durationSinceBoundedSpec durationSince_row_placed fromUtf8_row_placed memmove_row_placed memrchr_row_placed pubFromSecret_row_placed sharedSecretDrop_row_placed staticSecretDrop_row_placed strlen_row_placed timeAdd_row_placed writeFile_row_placed writeStdout_row_placed) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks IsFsC allocHook0_fsT cliExternsPlaced_row cliExtraGhostSyms cliGhostExterns cliGhostExterns_alloc cliGhostExterns_allocZeroed cliGhostExterns_dealloc cliGhostExterns_memcpy_some cliGhostExterns_memset_some cliGhostExterns_other cliGhostExterns_realloc cliGhostExterns_shim deallocHook_fsT hookMemcpy_fsT hookMemset_fsT hookSat_of_eq reallocHook0_fsT) +open CryptoVerification.SignalSession.Cli.Slots (cliExternsPlaced_compress256Multi_sat cliExternsPlaced_compress256_sat cliExternsPlaced_derivePublicKeyBytes_sat cliExternsPlaced_diffieHellman_sat cliExternsPlaced_pubFromSecret_sat cliExternsPlaced_writeFile_sat cliExternsPlaced_writeStdout_sat cliGhostExterns_panic_handle_alloc_error cliGhostExterns_panic_handle_error cliGhostExterns_panic_option_expect_failed cliGhostExterns_sat_of_cliExternsPlaced compress256SingleSpec compress256_row_placed diffieHellman_row_placed durationSinceBoundedSpec durationSinceEpochAllocSpec pubFromSecret_row_placed writeFile_row_placed writeStdout_row_placed) namespace LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget @@ -64,13 +65,18 @@ open LibsignalBinary.Proofs.RecordCodecs.DepsBudget (CodecHooksPlaced) open LibsignalBinary.Proofs.SessionRecordMin.DeserializeBudget (Stage2ContractsMinPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore (HookExactMemcpy HookSatExactMemcpy hookMemcpy_exact) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved hookOk_rustAllocWithStack hookOk_rustDeallocExternWithStack hookOk_rustReallocExternWithStack) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraListSpecOk ExtraSpecOk GhostRowSpecOk hookSat_cliGhostExterns_of_extraOk) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts + (pureExtraGhosts pureExtraGhosts_specOk) open LibsignalBinary.Proofs.SpqrV1.Alloc.ConcatBudgetAux (framelessMemcpyAcpSpec) open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat (HkdfPlacedHooksExactSat) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget - (sessionMemcpyBudgetSpec sessionMemcpyRegionBudgetSpec sessionMemmoveBudgetSpec + (sessionMemcpyBudgetSpec sessionMemcpyRegionBudgetSpec sessionMemsetBudgetSpec sessionMemsetRegionBudgetSpec sessionShimBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Hooks2Budget (rustAllocSpecWithStack rustDeallocExternSpecWithStack rustReallocExternSpecWithStack) @@ -108,36 +114,6 @@ private theorem hookMemset_vm (s : State) : VmPreserved s (hookMemset s) := private theorem hookMemcpy_vm (s : State) : VmPreserved s (hookMemcpy s) := retHook_vm (setMem_vm s (writeBytes_perm_eq _ _ _)) -private theorem hookMemmove_vm (s : State) : VmPreserved s (hookMemmove s) := - hookMemcpy_vm s - -private theorem cliBcmpHook_vm (W : CliHooks) (s : State) : VmPreserved s (cliBcmpHook W.bcmp s) := - LibsignalBinary.Heap.VmPreserved.refl s - -private theorem strlenHook_vm (s : State) : VmPreserved s (strlenHook s) := by - unfold strlenHook; try dsimp only - split <;> exact LibsignalBinary.Heap.VmPreserved.refl s - -private theorem memrchrHook_vm (s : State) : VmPreserved s (memrchrHook s) := by - unfold memrchrHook; try dsimp only - split - · exact LibsignalBinary.Heap.VmPreserved.refl s - · try dsimp only - split <;> exact LibsignalBinary.Heap.VmPreserved.refl s - -private theorem fromUtf8Hook_vm (W : CliHooks) (s : State) : - VmPreserved s (fromUtf8Hook W.utf8Err s) := by - unfold fromUtf8Hook; try dsimp only - split - · exact LibsignalBinary.Heap.VmPreserved.refl s - · try dsimp only - split - · refine retHook_vm (setMem_vm s fun a => ?_) - simp only [LibsignalBinary.Heap.IfaceBudgetLemmas.perm_write64_norm] - · refine retHook_vm (setMem_vm s fun a => ?_) - simp only [LibsignalBinary.Heap.IfaceBudgetLemmas.perm_write16_norm, - LibsignalBinary.Heap.IfaceBudgetLemmas.perm_write64_norm] - private theorem writeStdoutHook_vm (s : State) : VmPreserved s (writeStdoutHook s) := by unfold writeStdoutHook; try dsimp only split <;> exact LibsignalBinary.Heap.VmPreserved.refl s @@ -145,27 +121,6 @@ private theorem writeStdoutHook_vm (s : State) : VmPreserved s (writeStdoutHook private theorem writeFileHook_vm (s : State) : VmPreserved s (writeFileHook s) := LibsignalBinary.Heap.SpecBudget.vmPreserved_writeFileHook s -private theorem durationSinceExactHook_vm (s : State) : - VmPreserved s (durationSinceExactHook s) := by - unfold durationSinceExactHook; try dsimp only - split - · exact LibsignalBinary.Heap.VmPreserved.refl s - · try dsimp only - split - · refine retHook_vm (setMem_vm s fun a => ?_) - simp only [LibsignalBinary.Heap.IfaceBudgetLemmas.perm_write32_norm, - LibsignalBinary.Heap.IfaceBudgetLemmas.perm_write64_norm] - · exact LibsignalBinary.Heap.VmPreserved.refl s - -private theorem timeAddHook_vm (s : State) : VmPreserved s (CryptoVerification.E2E.timeAddHook s) := by - unfold CryptoVerification.E2E.timeAddHook - try dsimp only - split <;> (split <;> exact LibsignalBinary.Heap.VmPreserved.refl s) - -private theorem blackBoxHook_vm (s : State) : - VmPreserved s (CryptoVerification.LibsignalSession.blackBoxHook s) := - LibsignalBinary.Heap.VmPreserved.refl s - private theorem compress256Hook_vm (W : CliHooks) (s : State) : VmPreserved s (CryptoVerification.LibsignalHmac.compress256Hook W.C.F s) := by unfold CryptoVerification.LibsignalHmac.compress256Hook CryptoVerification.LibsignalAesCbc.returnToLinkRegister @@ -179,10 +134,6 @@ private theorem diffieHellmanHook_vm (W : CliHooks) (s : State) : VmPreserved s (CryptoVerification.LibsignalTripleRatchet.diffieHellmanHook W.C.X s) := retHook_vm (setMem_vm s (writeBytes_perm_eq _ _ _)) -private theorem zeroizeSecretHook_vm (s : State) : - VmPreserved s (CryptoVerification.LibsignalTripleRatchet.zeroizeSecretHook s) := - retHook_vm (setMem_vm s (writeBytes_perm_eq _ _ _)) - /-! ## 2. Budget and `VmPreserved` `HookSat` for non-allocating symbols -/ theorem cliExternsPlaced_shim_budget_sat (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) @@ -199,51 +150,101 @@ theorem cliExternsPlaced_noAllocShim_budget_sat (mmpl : Obj.MultiPlacement) (g : ⟨hookNoop, (cliGhostExterns_shim g _).trans (congrArg some hShim), hookOk_withVmPreserved noAllocShim_hookOk hookNoop_vm⟩ -theorem cliExternsPlaced_memmove_budget_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) (stk : Nat) : - HookSat (cliExternsPlaced mmpl W) "memmove" (withVmPreserved (libcMemmoveSpec stk)) := - hookSat_cli_vm mmpl W (memmove_row_placed mmpl W) - (cliExternsPlaced_memmove_sat mmpl W stk) hookMemmove_vm - -theorem cliExternsPlaced_sessionMemmove_budget_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) - (stk : Nat) : - HookSat (cliExternsPlaced mmpl W) "memmove" (sessionMemmoveBudgetSpec stk) := - hookSat_cli_vm mmpl W (memmove_row_placed mmpl W) - (cliExternsPlaced_sessionMemmove_sat mmpl W stk) hookMemmove_vm - -theorem cliExternsPlaced_bcmp_budget_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) "bcmp" (withVmPreserved cliBcmpSpec) := - hookSat_withVmPreserved (cliExternsPlaced_bcmp_sat mmpl W) fun g hg s => by - rw [CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_bcmp mmpl W] at hg - injection hg with hfg; subst hfg; exact cliBcmpHook_vm W s - -theorem cliExternsPlaced_bcmpVregs_budget_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) "bcmp" +theorem cliGhostExterns_sessionMemmove_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) (stk : Nat) : + HookSat (cliGhostExterns g baseExt) "memmove" + (LibsignalBinary.Proofs.HookDischarge.Libc.Memmove.sessionMemmoveBoundedBudgetSpec stk) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => + hRow.sessionMemmove_budget_ok stk + +theorem cliGhostExterns_bcmp_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) "bcmp" (withVmPreserved cliBcmpSpec) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.bcmp_budget_ok + +theorem cliGhostExterns_bcmp_keepsFs_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) "bcmp" (withVmPreserved cliBcmpSpec).keepsFs := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => + (hRow.bcmp_budget_ok).keepsFs hRow.fs_eq + +theorem cliGhostExterns_bcmpVregs_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) "bcmp" (withVmPreserved CryptoVerification.E2E.HooksE.bcmpVregsSpec) := - hookSat_withVmPreserved (cliExternsPlaced_bcmpVregs_sat mmpl W) fun g hg s => by - rw [CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_bcmp mmpl W] at hg - injection hg with hfg; subst hfg; exact cliBcmpHook_vm W s + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.bcmpVregs_budget_ok -theorem cliExternsPlaced_e2eBcmp_budget_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) "bcmp" +theorem cliGhostExterns_e2eBcmp_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) "bcmp" (withVmPreserved CryptoVerification.E2E.HooksE.e2eBcmpSpec) := - hookSat_withVmPreserved (cliExternsPlaced_e2eBcmp_sat mmpl W) fun g hg s => by - rw [CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_bcmp mmpl W] at hg - injection hg with hfg; subst hfg; exact cliBcmpHook_vm W s - -theorem cliExternsPlaced_strlen_budget_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) (stk : Nat) : - HookSat (cliExternsPlaced mmpl W) "strlen" (withVmPreserved (strlenSpec stk)) := - hookSat_cli_vm mmpl W (strlen_row_placed mmpl W) - (cliExternsPlaced_strlen_sat mmpl W stk) strlenHook_vm - -theorem cliExternsPlaced_memrchr_budget_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) (stk : Nat) : - HookSat (cliExternsPlaced mmpl W) lsMemrchrSym (withVmPreserved (memrchrSpec stk)) := - hookSat_cli_vm mmpl W (memrchr_row_placed mmpl W) - (cliExternsPlaced_memrchr_sat mmpl W stk) memrchrHook_vm - -theorem cliExternsPlaced_fromUtf8_budget_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) (stk : Nat) : - HookSat (cliExternsPlaced mmpl W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec stk)) := - hookSat_cli_vm mmpl W (fromUtf8_row_placed mmpl W) - (cliExternsPlaced_fromUtf8_sat mmpl W stk) (fromUtf8Hook_vm W) + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow x R s0 hrun hpre hsp => by + obtain ⟨hkf, hst, hout⟩ := hRow.bcmpVregs_budget_ok x R s0 hrun hpre hsp + refine ⟨hkf, hst, ?_⟩ + rcases hout with ⟨hret, habi, hpost⟩ | hrest + · refine Or.inl ⟨hret, habi, ?_⟩ + dsimp only [withVmPreserved, CryptoVerification.E2E.HooksE.bcmpVregsSpec, + CryptoVerification.E2E.HooksE.e2eBcmpSpec] at hpost ⊢ + simp only [sepConj_assoc, satisfies_pure_sepConj] at hpost ⊢ + exact ⟨hpost.1, ⟨hpost.2.1.1, hpost.2.1.2.2⟩, hpost.2.2⟩ + · exact Or.inr hrest + +theorem cliGhostExterns_strlen_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) (stk : Nat) : + HookSat (cliGhostExterns g baseExt) "strlen" + (withVmPreserved + (LibsignalBinary.Proofs.HookDischarge.Libc.Strlen.withStrlenPadRO + (strlenSpec stk))) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.strlen_budget_ok stk + +theorem cliGhostExterns_strlenRO_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) (stk : Nat) : + HookSat (cliGhostExterns g baseExt) "strlen" + (withVmPreserved + (LibsignalBinary.Proofs.HookDischarge.Libc.Strlen.withStrlenPadRO + (LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO.strlenSpecRO stk))) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.strlenRO_budget_ok stk + +theorem cliGhostExterns_memrchr_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) {stk : Nat} + (hstk : extHookStack ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookSat (cliGhostExterns g baseExt) lsMemrchrSym + (withLsRet (withVmPreserved (memrchrSpec stk))) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => + hRow.memrchr_budget_ok hstk hstk_ub + +theorem cliGhostExterns_memrchrRO_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) {stk : Nat} + (hstk : extHookStack ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookSat (cliGhostExterns g baseExt) lsMemrchrSym + (withLsRet (withVmPreserved + (LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO.memrchrSpecRO stk))) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => + hRow.memrchrRO_budget_ok hstk hstk_ub + +theorem cliGhostExterns_fromUtf8_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) (stk : Nat) : + HookSat (cliGhostExterns g baseExt) lsFromUtf8Sym + (withVmPreserved (fromUtf8AsciiSpec stk)) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.fromUtf8_budget_ok stk + +theorem cliGhostExterns_fromUtf8RO_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) (stk : Nat) : + HookSat (cliGhostExterns g baseExt) lsFromUtf8Sym + (withVmPreserved + (LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO.fromUtf8AsciiSpecRO stk)) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.fromUtf8RO_budget_ok stk theorem cliExternsPlaced_writeFile_vm_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) (stk : Nat) : HookSat (cliExternsPlaced mmpl W) lsWriteFileSym @@ -351,32 +352,54 @@ theorem cliExternsPlaced_writeStdout_budget_sat {M : AllocCostModel} (A : RustCl · dsimp only [CryptoVerification.SignalSession.Cli.MainHops.writeStdoutSpecPlaced] at hoom rw [satisfies_pure_sepConj] at hoom; exact False.elim hoom.1 -theorem cliExternsPlaced_durationSinceEpoch_budget_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) lsDurationSinceSym durationSinceEpochBudgetSpec := - hookSat_cli_vm mmpl W (durationSince_row_placed mmpl W) - (cliExternsPlaced_durationSinceEpoch_sat mmpl W) durationSinceExactHook_vm - -theorem cliExternsPlaced_durationSinceBounded_budget_sat [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) lsDurationSinceSym - (LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet.withLsRet - (withVmPreserved durationSinceBoundedSpec)) := - hookSat_cli_vm mmpl W (durationSince_row_placed mmpl W) - (cliExternsPlaced_durationSinceBounded_sat mmpl W) durationSinceExactHook_vm - -theorem cliExternsPlaced_timeAdd_budget_sat [LibsignalPlacement] - (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) lsTimeAddSym - (LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet.withLsRet - timeAddBudgetSpec) := - hookSat_cli_vm mmpl W (timeAdd_row_placed mmpl W) - (cliExternsPlaced_timeAdd_sat mmpl W) timeAddHook_vm - -theorem cliExternsPlaced_blackBox_budget_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) lsBlackBoxSym - (withVmPreserved CryptoVerification.LibsignalSession.FindReceiverChainIndex.blackBoxSpec) := - hookSat_cli_vm mmpl W (blackBox_row_placed mmpl W) - (cliExternsPlaced_blackBox_sat mmpl W) blackBoxHook_vm +theorem cliGhostExterns_durationSinceEpoch_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) lsDurationSinceSym + (withLsRet durationSinceEpochBudgetSpec) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.durationSinceEpoch_budget_ok + +theorem cliGhostExterns_durationSinceEpochAlloc_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) lsDurationSinceSym + (withLsRet (withVmPreserved durationSinceEpochAllocSpec)) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => + hRow.durationSinceEpochAlloc_budget_ok + +theorem cliGhostExterns_durationSinceBounded_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) lsDurationSinceSym + (withLsRet (withVmPreserved durationSinceBoundedSpec)) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => + hRow.durationSinceBounded_budget_ok + +theorem cliGhostExterns_timeAdd_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) lsTimeAddSym + (withLsRet timeAddBudgetSpec) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => hRow.timeAdd_budget_ok + +theorem cliGhostExterns_blackBox_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) {stk : Nat} + (hstk : 16 ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookSat (cliGhostExterns g baseExt) lsBlackBoxSym + (withVmPreserved + (CryptoVerification.LibsignalTripleRatchet.withStack + CryptoVerification.LibsignalSession.FindReceiverChainIndex.blackBoxSpec stk)) := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => + hRow.findReceiverBlackBox_budget_ok hstk hstk_ub + +theorem cliGhostExterns_blackBoxSat_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat := + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => + hRow.blackBox_budget_ok (by decide : 16 ≤ 16) (by decide) theorem cliExternsPlaced_compress256Multi_budget_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : HookSat (cliExternsPlaced mmpl W) CryptoVerification.SignalSession.lsCompress256Sym @@ -409,17 +432,21 @@ theorem cliExternsPlaced_diffieHellman_budget_sat (mmpl : Obj.MultiPlacement) (W hookSat_cli_vm mmpl W (diffieHellman_row_placed mmpl W) (cliExternsPlaced_diffieHellman_sat mmpl W) (diffieHellmanHook_vm W) -theorem cliExternsPlaced_staticSecretDrop_budget_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) CryptoVerification.SignalSession.lsStaticSecretDropSym +theorem cliGhostExterns_staticSecretDrop_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) CryptoVerification.SignalSession.lsStaticSecretDropSym (withVmPreserved zeroizeSecretSpec) := - hookSat_cli_vm mmpl W (staticSecretDrop_row_placed mmpl W) - (cliExternsPlaced_staticSecretDrop_sat mmpl W) zeroizeSecretHook_vm + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => + hRow.staticSecretDrop_budget_ok -theorem cliExternsPlaced_sharedSecretDrop_budget_sat (mmpl : Obj.MultiPlacement) (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) CryptoVerification.SignalSession.lsSharedSecretDropSym +theorem cliGhostExterns_sharedSecretDrop_budget_sat [LibsignalPlacement] + (g : CliGhostHooks) (baseExt : LibsignalHooks) + (hOk : ExtraSpecOk g) : + HookSat (cliGhostExterns g baseExt) CryptoVerification.SignalSession.lsSharedSecretDropSym (withVmPreserved zeroizeSecretSpec) := - hookSat_cli_vm mmpl W (sharedSecretDrop_row_placed mmpl W) - (cliExternsPlaced_sharedSecretDrop_sat mmpl W) zeroizeSecretHook_vm + hookSat_cliGhostExterns_of_extraOk g baseExt hOk fun _ _ hRow => + hRow.sharedSecretDrop_budget_ok /-! ## 3. `HookOk` helpers and `CliGhostAllocHooks` -/ @@ -494,6 +521,7 @@ structure CliGhostAllocHooks [LibsignalPlacement] (M : AllocCostModel) (A : Rust memcpy_exact : ∀ f, g.memcpy = some f → HookExactMemcpy f memset_acp : ∀ f, g.memset = some f → ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle + extraOk : ExtraSpecOk g /-- Extends `CliGhostAllocHooks` with `g.allocZeroed` (`rustCliAllocBudgetSpec M A lim true`) and `HookFsTraced IsFsC g.allocZeroed`. -/ @@ -513,6 +541,7 @@ noncomputable def bumpGhost : CliGhostHooks where stringClone := none memset := some hookMemset memcpy := some hookMemcpy + extra := pureExtraGhosts theorem cliGhostAllocHooks_bumpGhost [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (hA : CliAllocHooks M A lim) : @@ -536,6 +565,7 @@ theorem cliGhostAllocHooks_bumpGhost [LibsignalPlacement] {M : AllocCostModel} { hookMemcpy_vm, hookMemcpy_fs, hookMemcpy_fsT⟩ memcpy_exact := fun f hf => by cases hf; exact hookMemcpy_exact memset_acp := fun f hf s => by cases hf; exact ⟨rfl, rfl⟩ + extraOk := pureExtraGhosts_specOk theorem cliGhostExterns_memset_budget_sat [LibsignalPlacement] (baseExt : LibsignalHooks) {g : CliGhostHooks} {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -966,12 +996,14 @@ private theorem cli_row_ghost_rocl_ok [LibsignalPlacement] {α : Type} (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) (h9 : sym ≠ lsMemsetSym := by decide) - (h10 : sym ≠ lsMemcpySym := by decide) : + (h10 : sym ≠ lsMemcpySym := by decide) + (hExtra : cliExtraGhostSyms.contains sym = false ∨ g.extra.lookup sym = none := by + left; decide) : subroutine_ok (lsProg_617 (cliGhostExterns g (cliExternsPlaced mmpl W))) (lsρ sym) (CryptoVerification.LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl spec) := hook_placed_rocl_ok (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W ⟨f, cliExternsPlaced_row mmpl W hrow, hh⟩ - h1 h2 h3 h4 h5 h6 h7 h8 h9 h10) + h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 hExtra) hmem theorem allocContractsXCliPlaced_of_hooks [LibsignalPlacement] (mmpl : Obj.MultiPlacement) @@ -998,10 +1030,6 @@ theorem allocContractsXCliPlaced_of_hooks [LibsignalPlacement] (mmpl : Obj.Multi (hookSat_withStack_of_hookSat (cliExternsPlaced_memcpyRegion_budget_sat mmpl g W hG) stk) session_memcpy_region stk _ _ := hook_placed_rocl_ok (hookSat_withStack_of_hookSat (cliExternsPlaced_sessionMemcpyRegion_budget_sat mmpl g W hG) stk) - memmove stk _ _ := cli_row_ghost_rocl_ok mmpl g W (memmove_row_placed mmpl W) - (hookOk_withVmPreserved (hookMemmove_ok stk) hookMemmove_vm) - session_memmove stk _ _ := cli_row_ghost_rocl_ok mmpl g W (memmove_row_placed mmpl W) - (hookOk_withVmPreserved (hookMemmove_trace_ok stk) hookMemmove_vm) memset stk hle _ := hook_placed_rocl_ok (cliExternsPlaced_memset_budget_sat mmpl g W hG stk (pos_of_extHookStack_le hle)) session_memset stk hle _ := hook_placed_rocl_ok @@ -1045,10 +1073,6 @@ theorem allocContractsFsPlaced_of_hooks [LibsignalPlacement] (mmpl : Obj.MultiPl ⟨fMc, hMcEq, (hookOk_withStack (hookOk_withVmPreserved hMcReg hMcVm) stk).keepsFs hMcFs⟩ session_memcpy_region stk _ _ := hook_placed_rocl_ok ⟨fMc, hMcEq, (hookOk_withStack (hookOk_withVmPreserved hMcSessReg hMcVm) stk).keepsFs hMcFs⟩ - memmove stk _ _ := cli_row_ghost_rocl_ok mmpl g W (memmove_row_placed mmpl W) <| - (hookOk_withVmPreserved (hookMemmove_ok stk) hookMemmove_vm).keepsFs hookMemmove_fs - session_memmove stk _ _ := cli_row_ghost_rocl_ok mmpl g W (memmove_row_placed mmpl W) <| - (hookOk_withVmPreserved (hookMemmove_trace_ok stk) hookMemmove_vm).keepsFs hookMemmove_fs memset stk hle _ := hook_placed_rocl_ok ⟨fMs, hMsEq, (hookOk_withVmPreserved (hMsLibc stk (pos_of_extHookStack_le hle)) hMsVm).keepsFs hMsFs⟩ @@ -1075,8 +1099,6 @@ theorem allocContractsXCliPlaced_of_hookSat [LibsignalPlacement] {M : AllocCostM (hsessMemcpy : ∀ stk : Nat, HookSat H memcpyName (sessionMemcpyBudgetSpec stk)) (hmemcpyReg : HookSat H memcpyName (withVmPreserved memcpyRegionSpec)) (hsessMemcpyReg : HookSat H memcpyName sessionMemcpyRegionBudgetSpec) - (hmemmove : ∀ stk : Nat, HookSat H memmoveName (withVmPreserved (libcMemmoveSpec stk))) - (hsessMemmove : ∀ stk : Nat, HookSat H memmoveName (sessionMemmoveBudgetSpec stk)) (hmemset : ∀ stk : Nat, 0 < stk → HookSat H memsetName (withVmPreserved (libcMemsetSpec stk))) (hsessMemset : ∀ stk : Nat, 0 < stk → HookSat H memsetName (sessionMemsetBudgetSpec stk)) (hmemsetReg : HookSat H memsetName (withVmPreserved memsetRegionSpec)) @@ -1099,8 +1121,6 @@ theorem allocContractsXCliPlaced_of_hookSat [LibsignalPlacement] {M : AllocCostM session_memcpy stk _ _ := hook_placed_rocl_ok (hsessMemcpy stk) memcpy_region stk _ _ := hook_placed_rocl_ok (hookSat_withStack_of_hookSat hmemcpyReg stk) session_memcpy_region stk _ _ := hook_placed_rocl_ok (hookSat_withStack_of_hookSat hsessMemcpyReg stk) - memmove stk _ _ := hook_placed_rocl_ok (hmemmove stk) - session_memmove stk _ _ := hook_placed_rocl_ok (hsessMemmove stk) memset stk hle _ := hook_placed_rocl_ok (hmemset stk (pos_of_extHookStack_le hle)) session_memset stk hle _ := hook_placed_rocl_ok (hsessMemset stk (pos_of_extHookStack_le hle)) memset_region stk _ _ := hook_placed_rocl_ok (hookSat_withStack_of_hookSat hmemsetReg stk) @@ -1120,14 +1140,12 @@ theorem allocContractsFsPlaced_of_hookSat [LibsignalPlacement] {M : AllocCostMod (hsessMemcpyReg : HookSat H memcpyName sessionMemcpyRegionBudgetSpec) (hsessMemcpyRO : HookSat H memcpyName (withVmPreserved CryptoVerification.SpqrV1.Alloc.sessionMemcpyRegionROSpec)) - (hmemmove : ∀ stk : Nat, HookSat H memmoveName (withVmPreserved (libcMemmoveSpec stk))) - (hsessMemmove : ∀ stk : Nat, HookSat H memmoveName (sessionMemmoveBudgetSpec stk)) (hmemset : ∀ stk : Nat, 0 < stk → HookSat H memsetName (withVmPreserved (libcMemsetSpec stk))) (hsessMemset : ∀ stk : Nat, 0 < stk → HookSat H memsetName (sessionMemsetBudgetSpec stk)) (hmemsetReg : HookSat H memsetName (withVmPreserved memsetRegionSpec)) (hsessMemsetReg : HookSat H memsetName sessionMemsetRegionBudgetSpec) (hfs : ∀ sym ∈ [lsRustAllocSymCli, lsRustDeallocSymCli, lsRustReallocSymCli, - lsRustNoAllocShimSymCli, memcpyName, memmoveName, memsetName], + lsRustNoAllocShimSymCli, memcpyName, memsetName], ∀ f, H sym = some f → ∀ s : State, (f s).fs = s.fs) : LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget.AllocContractsFsPlaced A lim H where alloc := by @@ -1158,10 +1176,6 @@ theorem allocContractsFsPlaced_of_hookSat [LibsignalPlacement] {M : AllocCostMod session_memcpy_region stk _ _ := hook_placed_rocl_ok <| hookSat_keepsFs_of_hookSat (hookSat_withStack_of_hookSat hsessMemcpyReg stk) (hfs memcpyName (by decide)) - memmove stk _ _ := hook_placed_rocl_ok <| - hookSat_keepsFs_of_hookSat (hmemmove stk) (hfs memmoveName (by decide)) - session_memmove stk _ _ := hook_placed_rocl_ok <| - hookSat_keepsFs_of_hookSat (hsessMemmove stk) (hfs memmoveName (by decide)) memset stk hle _ := hook_placed_rocl_ok <| hookSat_keepsFs_of_hookSat (hmemset stk (pos_of_extHookStack_le hle)) (hfs memsetName (by decide)) @@ -1190,8 +1204,6 @@ theorem stage2ContractsMinPlaced_of_hooks [LibsignalPlacement] (mmpl : Obj.Multi (cliExternsPlaced_realloc_budget_sat mmpl g W hG) (cliExternsPlaced_shim_budget_sat mmpl g W hG.shim_eq) (cliExternsPlaced_sessionMemcpy_budget_sat mmpl g W hG extHookStack) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W extHookStack)) theorem codecHooksPlaced_of_hooks [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -1225,10 +1237,9 @@ theorem stage2ContractsMinPlaced_of_hookSat [LibsignalPlacement] {M : AllocCostM (hdealloc : HookSat H lsRustDeallocSymCli (rustCliDeallocBudgetSpec M A lim)) (hrealloc : HookSat H lsRustReallocSymCli (rustCliReallocBudgetSpec M A lim)) (hshim : HookSat H lsRustNoAllocShimSymCli sessionShimBudgetSpec) - (hmemcpy : HookSat H memcpyName (sessionMemcpyBudgetSpec extHookStack)) - (hmemmove : HookSat H memmoveName (sessionMemmoveBudgetSpec extHookStack)) : + (hmemcpy : HookSat H memcpyName (sessionMemcpyBudgetSpec extHookStack)) : Stage2ContractsMinPlaced M A lim H := - LibsignalBinary.Proofs.SessionRecordMin.DeserializeBudget.Stage2ContractsMinPlaced.of_hooks halloc hdealloc hrealloc hshim hmemcpy hmemmove + LibsignalBinary.Proofs.SessionRecordMin.DeserializeBudget.Stage2ContractsMinPlaced.of_hooks halloc hdealloc hrealloc hshim hmemcpy theorem codecHooksPlaced_of_hookSat [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraGhostSpecs.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraGhostSpecs.lean new file mode 100644 index 000000000..e24fca0ca --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraGhostSpecs.lean @@ -0,0 +1,859 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEq -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.E2E.HooksE.Common -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.HookDischarge.Libc.Strlen -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.PublicApi.StoreKit.Placed -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Glue.BcmpHookPlaced -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSat -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.BcmpRowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.BlackBoxRowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.DurationSinceRowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.FromUtf8RowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.MemmoveRowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.MemrchrRowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.SharedSecretDropRowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.StaticSecretDropRowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.StrlenRowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.TimeAddRowSpec -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Specifications.LibsignalPublicApi -- proof-setup: allow-public-import + +/-! +# Generic `extra` Ghost Table Consumer Contracts (`Cli.Run.Slots.ExtraGhostSpecs`) + +Untrusted (`Role::Proof`) consumer-spec (`HookOk` / `HookSat` / `VmPreserved` / `withAlloc` / +`HookFsTraced`) layer for `#1255` Cutover 2 (`CliGhostHooks.extra : List (String × (State → State))`): + +1. **Symbol partition & key freshness (`cliNamedGhostSyms`, `cliExtraGhostSyms`, `FreshExtraKeysList`):** + Partitions the 10 named ghost slots (5 F3 alloc + 3 F3 optional + Stage A `lsMemsetSym` / + `lsMemcpySym` from `BcmpHookPlaced`) from the 10 Cutover-2 `extra` symbols (`"memmove"`, `"bcmp"`, + `"strlen"`, `lsMemrchrSym`, `lsFromUtf8Sym`, `lsDurationSinceSym`, `lsTimeAddSym`, `lsBlackBoxSym`, + `lsStaticSecretDropSym`, `lsSharedSecretDropSym`), with kernel-decidable disjointness + (`cliExtraGhostSyms_disjoint_named`). +2. **Domain-guarded `extra` dispatch (`cliGhostExternsWithExtra`):** + Checks the 10 named `CliGhostHooks` arms first, then dispatches `extra.lookup sym` **only** when + `cliExtraGhostSyms.contains sym = true`. All panic/crypto/write/fmt symbols pass through to + `baseExt sym` unconditionally (`by left; decide`) with zero bundle hypotheses. + In Commit 2B, `cliGhostExterns g baseExt sym` is redefined as (or proved `rfl`-equal to) + `cliGhostExternsWithExtra g g.extra baseExt sym`. +3. **Per-row consumer `HookOk` table (`ExtraRowSpec`, `GhostRowSpecOk`, `ExtraListSpecOk`, + `ExtraSpecOk`):** + Imports the 10 row-owned `ExtraRowSpecs.*RowSpec` leaf modules and bundles `FreshExtraKeysList` + + per-row `GhostRowSpecOk` into `ExtraSpecOk g` (`ExtraListSpecOk g.extra`) for the R1 bundles + (`CliGhostA0Hooks`, `CliGhostAllocHooks`, `CliGhostSpqrAllocHooks`). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + +open Arm64 Arm64.Obj ProofLib +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.E2E.HooksE (bcmpVregsSpec e2eBcmpSpec hookOk_bcmpSpec_of_vregs) +open CryptoVerification.LibsignalPublicApi.StoreKit (extract_withLsRoCl withLsRoCl) +open CryptoVerification.LibsignalTripleRatchet + (blackBoxSpec extHookStack withStack zeroizeSecretSpec) +open CryptoVerification.RustHeap (allocHookStack) +open CryptoVerification.SignalSession + (lsBlackBoxSym lsDurationSinceSym lsFromUtf8Sym lsMemcpySym lsMemrchrSym lsMemsetSym + lsReadFileSym lsReadStdinSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli + lsRustNoAllocShimSymCli lsRustReallocSymCli lsSharedSecretDropSym lsStaticSecretDropSym + lsStringCloneSym lsTimeAddSym) +open CryptoVerification.SignalSession.Cli (cliBcmpSpec) +open CryptoVerification.SignalSession.Cli.MainHops + (fromUtf8AsciiSpec memrchrSpec strlenSpec) +open CryptoVerification.SignalSession.Cli.RunGlue + (CliGhostHooks ExtraGhostTable IsFsC cliExtraGhostSyms cliExtraGhostSyms_disjoint_named + cliExtraGhostSyms_not_named cliGhostExterns cliGhostExternsNamed cliGhostExternsWithExtra + cliGhostExternsWithExtra_extra_some cliGhostExternsWithExtra_other cliNamedGhostSyms + named_eq_false_of_extra_contains) +open CryptoVerification.SignalSession.Cli.Slots + (durationSinceEpochAllocSpec durationSinceEpochAtSpec) +open LibsignalBinary.Heap + (AllocCallPreserved AllocCostModel BudgetLimits RustCliAllocBudget) +open LibsignalBinary.Heap.SpecBudget + (durationSinceEpochBudgetSpec timeAddBudgetSpec withVmPreserved) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove + (libcMemmoveBoundedSpec sessionMemmoveBoundedBudgetSpec sessionMemmoveBoundedSpec) +open LibsignalBinary.Proofs.HookDischarge.Libc.Strlen (withStrlenPadRO) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc (withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO + (fromUtf8AsciiSpecRO memrchrSpecRO strlenSpecRO) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.BcmpRowSpec (BcmpRowSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.BlackBoxRowSpec + (BlackBoxRowSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.DurationSinceRowSpec + (DurationSinceRowSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.FromUtf8RowSpec + (FromUtf8RowSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.MemmoveRowSpec + (MemmoveRowSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.MemrchrRowSpec + (MemrchrRowSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.SharedSecretDropRowSpec + (SharedSecretDropRowSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.StaticSecretDropRowSpec + (StaticSecretDropRowSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.StrlenRowSpec (StrlenRowSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.TimeAddRowSpec + (TimeAddRowSpec) + +export LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.BcmpRowSpec (BcmpRowSpec) +export LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.BlackBoxRowSpec + (BlackBoxRowSpec) +export LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.DurationSinceRowSpec + (DurationSinceRowSpec) +export LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.FromUtf8RowSpec + (FromUtf8RowSpec) +export LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.MemmoveRowSpec + (MemmoveRowSpec) +export LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.MemrchrRowSpec + (MemrchrRowSpec) +export LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.SharedSecretDropRowSpec + (SharedSecretDropRowSpec) +export LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.StaticSecretDropRowSpec + (StaticSecretDropRowSpec) +export LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.StrlenRowSpec (StrlenRowSpec) +export LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.TimeAddRowSpec + (TimeAddRowSpec) + +/-! ## 1. Named vs. Extra Ghost Symbol Lists & Key Freshness -/ + +export CryptoVerification.SignalSession.Cli.RunGlue + (ExtraGhostTable cliNamedGhostSyms cliExtraGhostSyms cliExtraGhostSyms_disjoint_named + cliExtraGhostSyms_not_named) +export CryptoVerification.SignalSession.Cli.RunGlue + (named_eq_false_of_extra_contains cliGhostExternsNamed cliGhostExternsWithExtra + cliGhostExternsWithExtra_extra_some cliGhostExternsWithExtra_other) + +/-- At `extra = []`, `cliGhostExternsWithExtra` collapses to the pre-2B 10-way `cliGhostExternsNamed` + (using `named_eq_false_of_extra_contains` on the `cliExtraGhostSyms.contains sym = true` branch, + where `[].lookup sym = none` falls back to `b sym`). -/ +theorem cliGhostExternsWithExtra_nil (gh : CliGhostHooks) + (b : String → Option (State → State)) : + cliGhostExternsWithExtra gh [] b = cliGhostExternsNamed gh b := by + funext sym + unfold cliGhostExternsWithExtra cliGhostExternsNamed + cases hc : cliExtraGhostSyms.contains sym with + | false => simp only [Bool.false_eq_true, ↓reduceIte] + | true => + rcases named_eq_false_of_extra_contains hc with + ⟨h1, h2, h3, h4, h5, h6, h7, h8, h9, h10⟩ + simp only [List.lookup, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, Bool.false_eq_true, ↓reduceIte] + +/-- Key-only projection that never inspects (potentially `noncomputable`) `State → State` values. -/ +@[expose] def cliGhostExtraKeys {V : Type} : List (String × V) → List String + | [] => [] + | (k, _) :: tl => k :: cliGhostExtraKeys tl + +@[simp] theorem cliGhostExtraKeys_eq_map_fst {V : Type} (l : List (String × V)) : + cliGhostExtraKeys l = l.map Prod.fst := by + induction l with + | nil => rfl + | cons hd tl ih => simp [cliGhostExtraKeys, ih] + +/-- Kernel-`rfl`-reducible key freshness check: keys are pairwise distinct (`Nodup`), drawn from + `cliExtraGhostSyms`, and disjoint from `cliNamedGhostSyms`. -/ +@[expose] def freshExtraKeysListB {V : Type} (extra : List (String × V)) : Bool := + let ks := cliGhostExtraKeys extra + ks.Pairwise (· != ·) && + ks.all (fun k => cliExtraGhostSyms.contains k && !(cliNamedGhostSyms.contains k)) + +/-- Propositional key freshness side condition (`Nodup` + inside `cliExtraGhostSyms` + disjoint + from `cliNamedGhostSyms`). Decidable even when paired `State → State` values are noncomputable. -/ +abbrev FreshExtraKeysList {V : Type} (extra : List (String × V)) : Prop := + (extra.map Prod.fst).Nodup ∧ + ∀ k ∈ extra.map Prod.fst, k ∈ cliExtraGhostSyms ∧ k ∉ cliNamedGhostSyms + +abbrev FreshExtraKeys (g : CliGhostHooks) : Prop := + FreshExtraKeysList g.extra + +theorem FreshExtraKeysList.nil {V : Type} : FreshExtraKeysList ([] : List (String × V)) := + ⟨List.nodup_nil, fun _ h => nomatch h⟩ + +/-- Key-completeness predicate: every symbol in `cliExtraGhostSyms` is bound in `extra`. + Uses `extra.map Prod.fst` so `by decide` closes concrete 10-row tables without inspecting + noncomputable `State → State` functions. -/ +abbrev CompleteExtraKeysList {V : Type} (extra : List (String × V)) : Prop := + ∀ sym ∈ cliExtraGhostSyms, sym ∈ extra.map Prod.fst + +private theorem lookup_isSome_of_mem_map_fst {V : Type} {l : List (String × V)} {sym : String} + (hmem : sym ∈ l.map Prod.fst) : + (l.lookup sym).isSome = true := by + induction l with + | nil => cases hmem + | cons hd tl ih => + rcases hd with ⟨k, v⟩ + by_cases hsk : sym = k + · subst hsk + simp [List.lookup] + · simp only [List.map_cons, List.mem_cons] at hmem + rcases hmem with hsk' | htl + · exact absurd hsk' hsk + · have hbeq : (sym == k) = false := beq_eq_false_iff_ne.mpr hsk + simp [List.lookup, hbeq, ih htl] + +/-- Extract `(extra.lookup sym).isSome = true` from `CompleteExtraKeysList extra` and + `cliExtraGhostSyms.contains sym = true`. -/ +theorem CompleteExtraKeysList.lookup_isSome {V : Type} {extra : List (String × V)} + (hComp : CompleteExtraKeysList extra) {sym : String} + (hDom : cliExtraGhostSyms.contains sym = true) : + (extra.lookup sym).isSome = true := + lookup_isSome_of_mem_map_fst (hComp sym (List.contains_iff_mem.mp hDom)) + +/-! ## 3. `ExtraRowSpec`, `GhostRowSpecOk`, `ExtraListSpecOk` & `ExtraSpecOk` -/ + +/-- Row-specific `HookOk` dispatcher (`ExtraRowSpec` per H-REV2 §6(b2)/M4) routing each of the + 10 Cutover-2 symbols to its row-owned `*RowSpec` leaf predicate. -/ +@[expose] def ExtraRowSpec [LibsignalPlacement] (sym : String) (f : State → State) : Prop := + if sym == "bcmp" then BcmpRowSpec f + else if sym == "strlen" then StrlenRowSpec f + else if sym == "memmove" then MemmoveRowSpec f + else if sym == lsFromUtf8Sym then FromUtf8RowSpec f + else if sym == lsMemrchrSym then MemrchrRowSpec f + else if sym == lsDurationSinceSym then DurationSinceRowSpec f + else if sym == lsTimeAddSym then TimeAddRowSpec f + else if sym == lsBlackBoxSym then BlackBoxRowSpec f + else if sym == lsStaticSecretDropSym then StaticSecretDropRowSpec f + else if sym == lsSharedSecretDropSym then SharedSecretDropRowSpec f + else False + +/-- Complete consumer-side obligation for a Cutover-2 ghost hook `(sym, f)`: + 1. `fs_eq` (`(f s).fs = s.fs`), + 2. `fsT` (`HookFsTraced IsFsC f`), + 3. `rowSpec` (`ExtraRowSpec sym f` — covers plain, RO, `withVmPreserved`, and `withAlloc` + consumer specs; `withLsRoCl` follows generically via `hookOk_withLsRoCl`). -/ +structure GhostRowSpecOk [LibsignalPlacement] (sym : String) (f : State → State) : Prop where + fs_eq : ∀ s : State, (f s).fs = s.fs + fsT : HookFsTraced IsFsC f + rowSpec : ExtraRowSpec sym f + +/-- R1 bundle predicate over an `extra` table: key freshness + `GhostRowSpecOk` for every entry. -/ +structure ExtraListSpecOk [LibsignalPlacement] (extra : ExtraGhostTable) : Prop where + fresh : FreshExtraKeysList extra := by decide + rowOk : ∀ sym f, extra.lookup sym = some f → GhostRowSpecOk sym f := by + intro _ _ h; cases h + +theorem ExtraListSpecOk.nil [LibsignalPlacement] : ExtraListSpecOk [] := + ⟨FreshExtraKeysList.nil, fun _ _ h => by cases h⟩ + +theorem ExtraListSpecOk.fsT [LibsignalPlacement] {extra : ExtraGhostTable} + (hOk : ExtraListSpecOk extra) : + ∀ sym f, cliExtraGhostSyms.contains sym = true → + extra.lookup sym = some f → HookFsTraced IsFsC f := + fun sym f _ hLook => (hOk.rowOk sym f hLook).fsT + +/-- Complete R1 consumer spec bundle over a populated 10-row `extra` table + (`ExtraListSpecOk` + `CompleteExtraKeysList`). -/ +structure ExtraFullListSpecOk [LibsignalPlacement] (extra : ExtraGhostTable) : Prop + extends ExtraListSpecOk extra where + complete : CompleteExtraKeysList extra := by decide + +/-- R1 bundle field predicate (`extraOk : ExtraSpecOk g`) on `CliGhostHooks` in Cutover 2B: + guarantees key freshness, `GhostRowSpecOk` on every row, and completeness across all 10 + `cliExtraGhostSyms`. -/ +abbrev ExtraSpecOk [LibsignalPlacement] (g : CliGhostHooks) : Prop := + ExtraFullListSpecOk g.extra + +/-- Direct `(extra.lookup sym).isSome = true` projection on `ExtraFullListSpecOk` / `ExtraSpecOk` + so callers of `hookSat_withExtra_of_isSome` can pass `(hSome := hG.extraOk.lookup_isSome)`. -/ +theorem ExtraFullListSpecOk.lookup_isSome [LibsignalPlacement] {extra : ExtraGhostTable} + (hOk : ExtraFullListSpecOk extra) {sym : String} + (hDom : cliExtraGhostSyms.contains sym = true := by decide) : + (extra.lookup sym).isSome = true := + hOk.complete.lookup_isSome hDom + +/-- `HookFsTraced` projection on `ExtraFullListSpecOk` / `ExtraSpecOk`. -/ +theorem ExtraFullListSpecOk.fsT [LibsignalPlacement] {extra : ExtraGhostTable} + (hOk : ExtraFullListSpecOk extra) : + ∀ sym f, cliExtraGhostSyms.contains sym = true → + extra.lookup sym = some f → HookFsTraced IsFsC f := + hOk.toExtraListSpecOk.fsT + +/-! ## 4. Generic Framing (`withLsRoCl`, Twin Congruence) & `HookSat` Lift Combinators -/ + +/-- Congruence transfer between duplicate `Spec α` definitions with identical fields (e.g. + `LibsignalTripleRatchet.blackBoxSpec` ↔ `FindReceiverChainIndex.blackBoxSpec`, or + `withVmPreserved LibsignalPublicApi.timeAddSpec` ↔ `timeAddBudgetSpec`). -/ +theorem hookOk_congr {α : Type} {f : State → State} {spec₁ spec₂ : Spec α} + (h : HookOk f spec₁) + (hpre : spec₁.pre = spec₂.pre := by rfl) + (hpost : spec₁.post = spec₂.post := by rfl) + (hpan : spec₁.onPanic = spec₂.onPanic := by rfl) + (hexit : spec₁.onExit = spec₂.onExit := by rfl) + (hoom : spec₁.onOom = spec₂.onOom := by rfl) : + HookOk f spec₂ := by + cases spec₁; cases spec₂ + dsimp at hpre hpost hpan hexit hoom + subst hpre hpost hpan hexit hoom + exact h + +/-- Any `HookOk f spec` automatically satisfies `StoreKit.withLsRoCl pl spec` via `KeepsFrozen`. -/ +theorem hookOk_withLsRoCl {α : Type} {f : State → State} (pl : MultiPlacement) {spec : Spec α} + (h : HookOk f spec) : + HookOk f (withLsRoCl pl spec) := by + intro x R s0 hrun hpre hsp + have ⟨hcrl0, hpre'⟩ := extract_withLsRoCl hpre + rcases h x R s0 hrun hpre' hsp with ⟨hkeep, hsym, hout⟩ + have hcrlf := hcrl0.of_keepsFrozen hkeep + refine ⟨hkeep, hsym, ?_⟩ + rcases hout with ⟨hret, hcc, hpost⟩ | hrest + · refine Or.inl ⟨hret, hcc, ?_⟩ + dsimp only [withLsRoCl] + rw [sepConj_assoc, satisfies_pure_sepConj] + exact ⟨hcrlf, hpost⟩ + · exact Or.inr hrest + +/-- Lift `HookSat hooks sym spec` to `HookSat hooks sym (StoreKit.withLsRoCl pl spec)`. -/ +theorem hookSat_withLsRoCl {α : Type} {hooks : String → Option (State → State)} + (pl : MultiPlacement) {sym : String} {spec : Spec α} + (h : HookSat hooks sym spec) : + HookSat hooks sym (withLsRoCl pl spec) := by + rcases h with ⟨f, hf, hok⟩ + exact ⟨f, hf, hookOk_withLsRoCl pl hok⟩ + +/-- Generic `HookSat` lift over `cliGhostExternsWithExtra`: covers both pre-cutover (`lookup = none`, + delegating to `hBase`) and post-cutover (`lookup = some f`, extracting from `hOk`). + Stable public API consumed by `HOOKS-PREP` (`EX-MEMRCHR`, `EX-STRLEN-PAD`). -/ +theorem hookSat_withExtra_of_base [LibsignalPlacement] {α : Type} + (g : CliGhostHooks) {extra : ExtraGhostTable} + (baseExt : String → Option (State → State)) + {sym : String} {spec : Spec α} + (hDom : cliExtraGhostSyms.contains sym = true) + (hRow : ∀ f, extra.lookup sym = some f → GhostRowSpecOk sym f → HookOk f spec) + (hOk : ExtraListSpecOk extra) + (hBase : HookSat baseExt sym spec) : + HookSat (cliGhostExternsWithExtra g extra baseExt) sym spec := by + obtain ⟨h1, h2, h3, h4, h5, h6, h7, h8, h9, h10⟩ := named_eq_false_of_extra_contains hDom + cases hLook : extra.lookup sym with + | some f => + exact ⟨f, cliGhostExternsWithExtra_extra_some g extra baseExt hLook hDom, + hRow f hLook (hOk.rowOk sym f hLook)⟩ + | none => + have heq : cliGhostExternsWithExtra g extra baseExt sym = baseExt sym := by + unfold cliGhostExternsWithExtra + simp only [h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, hDom, hLook, Bool.false_eq_true, + ↓reduceIte] + rcases hBase with ⟨fb, hfb, hokb⟩ + exact ⟨fb, heq.trans hfb, hokb⟩ + +/-- `cliGhostExterns`-targeted companion to `hookSat_withExtra_of_base`: identical argument + order (`g`, `baseExt`, `hDom`, `hRow`, `hOk : ExtraSpecOk g`, `hBase`), concluding + `HookSat (cliGhostExterns g baseExt) sym spec` directly. + - In Commit 2A (before `cliGhostExterns` dispatches `g.extra`), `named_eq_false_of_extra_contains` + rewrites `cliGhostExterns g baseExt sym = baseExt sym`. + - In Commit 2B (once `cliGhostExterns g baseExt sym := cliGhostExternsWithExtra g g.extra + baseExt sym`), the **identical signature** delegates in 1 line to + `hookSat_withExtra_of_base g baseExt hDom hRow hOk hBase`, allowing `HOOKS-PREP` (`EX-MEMRCHR`, + `EX-STRLEN-PAD`) to switch `#1328`'s `*Sat` bridges immediately on Commit 2A with zero + re-editing at Commit 2B. -/ +theorem hookSat_cliGhostExterns_of_base [LibsignalPlacement] {α : Type} + (g : CliGhostHooks) + (baseExt : String → Option (State → State)) + {sym : String} {spec : Spec α} + (hDom : cliExtraGhostSyms.contains sym = true) + (hRow : ∀ f, g.extra.lookup sym = some f → GhostRowSpecOk sym f → HookOk f spec) + (hOk : ExtraSpecOk g) + (hBase : HookSat baseExt sym spec) : + HookSat (cliGhostExterns g baseExt) sym spec := + hookSat_withExtra_of_base g baseExt hDom hRow hOk.toExtraListSpecOk hBase + +/-- Post-cutover `HookSat` lift requiring **no** `baseExt` hypothesis when `sym` is populated in + `extra` (`(extra.lookup sym).isSome = true`, closed by `rfl`/`decide` on concrete tables). -/ +theorem hookSat_withExtra_of_isSome [LibsignalPlacement] {α : Type} + (g : CliGhostHooks) {extra : ExtraGhostTable} + (baseExt : String → Option (State → State)) + {sym : String} {spec : Spec α} + (hRow : ∀ f, extra.lookup sym = some f → GhostRowSpecOk sym f → HookOk f spec) + (hOk : ExtraListSpecOk extra) + (hDom : cliExtraGhostSyms.contains sym = true := by decide) + (hSome : (extra.lookup sym).isSome = true := by decide) : + HookSat (cliGhostExternsWithExtra g extra baseExt) sym spec := by + cases hLook : extra.lookup sym with + | none => rw [hLook] at hSome; cases hSome + | some f => + exact ⟨f, cliGhostExternsWithExtra_extra_some g extra baseExt hLook hDom, + hRow f hLook (hOk.rowOk sym f hLook)⟩ + +/-- Table-parametric companion to `hookSat_cliGhostExterns_of_extraOk` on + `cliGhostExternsWithExtra g extra baseExt`. -/ +theorem hookSat_withExtra_of_fullOk [LibsignalPlacement] {α : Type} + (g : CliGhostHooks) {extra : ExtraGhostTable} + (baseExt : String → Option (State → State)) + {sym : String} {spec : Spec α} + (hOk : ExtraFullListSpecOk extra) + (hRow : ∀ f, extra.lookup sym = some f → GhostRowSpecOk sym f → HookOk f spec) + (hDom : cliExtraGhostSyms.contains sym = true := by decide) : + HookSat (cliGhostExternsWithExtra g extra baseExt) sym spec := + hookSat_withExtra_of_isSome g baseExt hRow hOk.toExtraListSpecOk hDom (hOk.lookup_isSome hDom) + +/-- **Primary 2B R1 consumer lift (baseExt-free):** derive `HookSat (cliGhostExterns g baseExt) sym spec` + for any `sym ∈ cliExtraGhostSyms` directly from `hOk : ExtraSpecOk g` (`hG.extraOk`) with NO + `baseExt` hypothesis. -/ +theorem hookSat_cliGhostExterns_of_extraOk [LibsignalPlacement] {α : Type} + (g : CliGhostHooks) (baseExt : String → Option (State → State)) + {sym : String} {spec : Spec α} + (hOk : ExtraSpecOk g) + (hRow : ∀ f, g.extra.lookup sym = some f → GhostRowSpecOk sym f → HookOk f spec) + (hDom : cliExtraGhostSyms.contains sym = true := by decide) : + HookSat (cliGhostExterns g baseExt) sym spec := + hookSat_withExtra_of_fullOk g baseExt hOk hRow hDom + +/-! ## 5. Per-Row Plain, RO, `withVmPreserved`, & `withAlloc` Extractors from `GhostRowSpecOk` -/ + +theorem GhostRowSpecOk.bcmp_row [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "bcmp" f) : BcmpRowSpec f := by + have hp := h.rowSpec; dsimp only [ExtraRowSpec] at hp; exact hp + +theorem GhostRowSpecOk.bcmp_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "bcmp" f) : HookOk f cliBcmpSpec := + h.bcmp_row.1 + +theorem GhostRowSpecOk.bcmp_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "bcmp" f) : HookOk f (withVmPreserved cliBcmpSpec) := + h.bcmp_row.2.1 + +theorem GhostRowSpecOk.bcmp_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "bcmp" f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) : + HookOk f (withAlloc A lim cliBcmpSpec) := + h.bcmp_row.2.2.1 A lim + +theorem GhostRowSpecOk.bcmpVregs_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "bcmp" f) : HookOk f bcmpVregsSpec := + h.bcmp_row.2.2.2.1 + +theorem GhostRowSpecOk.bcmpVregs_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "bcmp" f) : HookOk f (withVmPreserved bcmpVregsSpec) := + h.bcmp_row.2.2.2.2.1 + +theorem GhostRowSpecOk.bcmpVregs_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "bcmp" f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) : + HookOk f (withAlloc A lim bcmpVregsSpec) := + h.bcmp_row.2.2.2.2.2 A lim + +theorem GhostRowSpecOk.e2eBcmp_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "bcmp" f) : HookOk f e2eBcmpSpec := + hookOk_bcmpSpec_of_vregs h.bcmpVregs_ok + +theorem GhostRowSpecOk.strlen_row [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "strlen" f) : StrlenRowSpec f := by + have hp := h.rowSpec; dsimp only [ExtraRowSpec] at hp; exact hp + +theorem GhostRowSpecOk.strlen_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "strlen" f) (stk : Nat) : + HookOk f (withStrlenPadRO (strlenSpec stk)) := + h.strlen_row.1 stk + +theorem GhostRowSpecOk.strlen_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "strlen" f) (stk : Nat) : + HookOk f (withVmPreserved (withStrlenPadRO (strlenSpec stk))) := + h.strlen_row.2.1 stk + +theorem GhostRowSpecOk.strlen_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "strlen" f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat) : + HookOk f (withAlloc A lim (withStrlenPadRO (strlenSpec stk))) := + h.strlen_row.2.2.1 A lim stk + +theorem GhostRowSpecOk.strlenRO_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "strlen" f) (stk : Nat) : + HookOk f (withStrlenPadRO (strlenSpecRO stk)) := + h.strlen_row.2.2.2.1 stk + +theorem GhostRowSpecOk.strlenRO_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "strlen" f) (stk : Nat) : + HookOk f (withVmPreserved (withStrlenPadRO (strlenSpecRO stk))) := + h.strlen_row.2.2.2.2.1 stk + +theorem GhostRowSpecOk.strlenRO_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "strlen" f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat) : + HookOk f (withAlloc A lim (withStrlenPadRO (strlenSpecRO stk))) := + h.strlen_row.2.2.2.2.2.1 A lim stk + +theorem GhostRowSpecOk.strlenROSat_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "strlen" f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat) : + HookOk f (withAlloc A lim (withVmPreserved (withStrlenPadRO (strlenSpecRO stk)))) := + h.strlen_row.2.2.2.2.2.2 A lim stk + +theorem GhostRowSpecOk.memmove_row [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "memmove" f) : MemmoveRowSpec f := by + have hp := h.rowSpec; dsimp only [ExtraRowSpec] at hp; exact hp + +theorem GhostRowSpecOk.memmove_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "memmove" f) (stk : Nat) : + HookOk f (libcMemmoveBoundedSpec stk) := + h.memmove_row.1 stk + +theorem GhostRowSpecOk.memmove_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "memmove" f) (stk : Nat) : + HookOk f (withVmPreserved (libcMemmoveBoundedSpec stk)) := + h.memmove_row.2.1 stk + +theorem GhostRowSpecOk.memmove_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "memmove" f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat) : + HookOk f (withAlloc A lim (libcMemmoveBoundedSpec stk)) := + h.memmove_row.2.2.1 A lim stk + +theorem GhostRowSpecOk.sessionMemmove_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "memmove" f) (stk : Nat) : + HookOk f (sessionMemmoveBoundedSpec stk) := + h.memmove_row.2.2.2.1 stk + +theorem GhostRowSpecOk.sessionMemmove_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "memmove" f) (stk : Nat) : + HookOk f (sessionMemmoveBoundedBudgetSpec stk) := + h.memmove_row.2.2.2.2.1 stk + +theorem GhostRowSpecOk.sessionMemmove_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "memmove" f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat) : + HookOk f (withAlloc A lim (sessionMemmoveBoundedSpec stk)) := + h.memmove_row.2.2.2.2.2.1 A lim stk + +theorem GhostRowSpecOk.memmove_allocCallPreserved [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk "memmove" f) : + ∀ s : State, AllocCallPreserved s (f s) := + h.memmove_row.2.2.2.2.2.2 + +theorem GhostRowSpecOk.fromUtf8_row [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsFromUtf8Sym f) : FromUtf8RowSpec f := by + have hp := h.rowSpec + unfold ExtraRowSpec at hp + have hd1 : (lsFromUtf8Sym == "bcmp") = false := by decide + have hd2 : (lsFromUtf8Sym == "strlen") = false := by decide + have hd3 : (lsFromUtf8Sym == "memmove") = false := by decide + have hd4 : (lsFromUtf8Sym == lsFromUtf8Sym) = true := by decide + simp only [hd1, hd2, hd3, hd4, Bool.false_eq_true, ↓reduceIte] at hp + exact hp + +theorem GhostRowSpecOk.fromUtf8_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsFromUtf8Sym f) (stk : Nat) : + HookOk f (fromUtf8AsciiSpec stk) := + h.fromUtf8_row.1 stk + +theorem GhostRowSpecOk.fromUtf8_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsFromUtf8Sym f) (stk : Nat) : + HookOk f (withVmPreserved (fromUtf8AsciiSpec stk)) := + h.fromUtf8_row.2.1 stk + +theorem GhostRowSpecOk.fromUtf8_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsFromUtf8Sym f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat) : + HookOk f (withAlloc A lim (fromUtf8AsciiSpec stk)) := + h.fromUtf8_row.2.2.1 A lim stk + +theorem GhostRowSpecOk.fromUtf8RO_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsFromUtf8Sym f) (stk : Nat) : + HookOk f (fromUtf8AsciiSpecRO stk) := + h.fromUtf8_row.2.2.2.1 stk + +theorem GhostRowSpecOk.fromUtf8RO_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsFromUtf8Sym f) (stk : Nat) : + HookOk f (withVmPreserved (fromUtf8AsciiSpecRO stk)) := + h.fromUtf8_row.2.2.2.2.1 stk + +theorem GhostRowSpecOk.fromUtf8RO_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsFromUtf8Sym f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat) : + HookOk f (withAlloc A lim (fromUtf8AsciiSpecRO stk)) := + h.fromUtf8_row.2.2.2.2.2 A lim stk + +theorem GhostRowSpecOk.memrchr_row [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsMemrchrSym f) : MemrchrRowSpec f := by + have hp := h.rowSpec + unfold ExtraRowSpec at hp + have hd1 : (lsMemrchrSym == "bcmp") = false := by decide + have hd2 : (lsMemrchrSym == "strlen") = false := by decide + have hd3 : (lsMemrchrSym == "memmove") = false := by decide + have hd4 : (lsMemrchrSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsMemrchrSym == lsMemrchrSym) = true := by decide + simp only [hd1, hd2, hd3, hd4, hd5, Bool.false_eq_true, ↓reduceIte] at hp + exact hp + +theorem GhostRowSpecOk.memrchr_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsMemrchrSym f) {stk : Nat} + (hstk : extHookStack ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookOk f (withLsRet (memrchrSpec stk)) := + h.memrchr_row.1 stk hstk hstk_ub + +theorem GhostRowSpecOk.memrchr_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsMemrchrSym f) {stk : Nat} + (hstk : extHookStack ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookOk f (withLsRet (withVmPreserved (memrchrSpec stk))) := + h.memrchr_row.2.1 stk hstk hstk_ub + +theorem GhostRowSpecOk.memrchr_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsMemrchrSym f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) {stk : Nat} + (hstk : extHookStack ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookOk f (withLsRet (withAlloc A lim (memrchrSpec stk))) := + h.memrchr_row.2.2.1 A lim stk hstk hstk_ub + +theorem GhostRowSpecOk.memrchrRO_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsMemrchrSym f) {stk : Nat} + (hstk : extHookStack ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookOk f (withLsRet (memrchrSpecRO stk)) := + h.memrchr_row.2.2.2.1 stk hstk hstk_ub + +theorem GhostRowSpecOk.memrchrRO_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsMemrchrSym f) {stk : Nat} + (hstk : extHookStack ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookOk f (withLsRet (withVmPreserved (memrchrSpecRO stk))) := + h.memrchr_row.2.2.2.2.1 stk hstk hstk_ub + +theorem GhostRowSpecOk.memrchrRO_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsMemrchrSym f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) {stk : Nat} + (hstk : extHookStack ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookOk f (withLsRet (withAlloc A lim (memrchrSpecRO stk))) := + h.memrchr_row.2.2.2.2.2 A lim stk hstk hstk_ub + +theorem GhostRowSpecOk.durationSince_row [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsDurationSinceSym f) : DurationSinceRowSpec f := by + have hp := h.rowSpec + unfold ExtraRowSpec at hp + have hd1 : (lsDurationSinceSym == "bcmp") = false := by decide + have hd2 : (lsDurationSinceSym == "strlen") = false := by decide + have hd3 : (lsDurationSinceSym == "memmove") = false := by decide + have hd4 : (lsDurationSinceSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsDurationSinceSym == lsMemrchrSym) = false := by decide + have hd6 : (lsDurationSinceSym == lsDurationSinceSym) = true := by decide + simp only [hd1, hd2, hd3, hd4, hd5, hd6, Bool.false_eq_true, ↓reduceIte] at hp + exact hp + +theorem GhostRowSpecOk.durationSinceBounded_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsDurationSinceSym f) : + HookOk f (withLsRet CryptoVerification.SignalSession.Cli.Slots.durationSinceBoundedSpec) := + h.durationSince_row.1 + +theorem GhostRowSpecOk.durationSinceBounded_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsDurationSinceSym f) : + HookOk f (withLsRet (withVmPreserved + CryptoVerification.SignalSession.Cli.Slots.durationSinceBoundedSpec)) := + h.durationSince_row.2.1 + +theorem GhostRowSpecOk.durationSinceBounded_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsDurationSinceSym f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) : + HookOk f (withLsRet (withAlloc A lim + CryptoVerification.SignalSession.Cli.Slots.durationSinceBoundedSpec)) := + h.durationSince_row.2.2.1 A lim + +theorem GhostRowSpecOk.durationSinceEpochAt_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsDurationSinceSym f) {stk : Nat} + (hstk : 208 ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookOk f (withLsRet (durationSinceEpochAtSpec stk)) := + h.durationSince_row.2.2.2.1 stk hstk hstk_ub + +theorem GhostRowSpecOk.durationSinceEpochAt_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsDurationSinceSym f) {stk : Nat} + (hstk : 208 ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookOk f (withLsRet (withVmPreserved (durationSinceEpochAtSpec stk))) := + h.durationSince_row.2.2.2.2.1 stk hstk hstk_ub + +theorem GhostRowSpecOk.durationSinceEpochAt_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsDurationSinceSym f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) {stk : Nat} + (hstk : 208 ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookOk f (withLsRet (withAlloc A lim (durationSinceEpochAtSpec stk))) := + h.durationSince_row.2.2.2.2.2 A lim stk hstk hstk_ub + +theorem GhostRowSpecOk.durationSinceEpoch_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsDurationSinceSym f) : + HookOk f (withLsRet durationSinceEpochBudgetSpec) := + h.durationSinceEpochAt_budget_ok (by decide : 208 ≤ extHookStack) (by decide) + +theorem GhostRowSpecOk.durationSinceEpochAlloc_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsDurationSinceSym f) : + HookOk f (withLsRet (withVmPreserved durationSinceEpochAllocSpec)) := + h.durationSinceEpochAt_budget_ok (by decide : 208 ≤ allocHookStack) (by decide) + +theorem GhostRowSpecOk.timeAdd_row [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsTimeAddSym f) : TimeAddRowSpec f := by + have hp := h.rowSpec + unfold ExtraRowSpec at hp + have hd1 : (lsTimeAddSym == "bcmp") = false := by decide + have hd2 : (lsTimeAddSym == "strlen") = false := by decide + have hd3 : (lsTimeAddSym == "memmove") = false := by decide + have hd4 : (lsTimeAddSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsTimeAddSym == lsMemrchrSym) = false := by decide + have hd6 : (lsTimeAddSym == lsDurationSinceSym) = false := by decide + have hd7 : (lsTimeAddSym == lsTimeAddSym) = true := by decide + simp only [hd1, hd2, hd3, hd4, hd5, hd6, hd7, Bool.false_eq_true, ↓reduceIte] at hp + exact hp + +theorem GhostRowSpecOk.publicApiTimeAdd_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsTimeAddSym f) : + HookOk f (withLsRet CryptoVerification.LibsignalPublicApi.timeAddSpec) := + h.timeAdd_row.1 + +theorem GhostRowSpecOk.e2eTimeAdd_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsTimeAddSym f) : + HookOk f (withLsRet CryptoVerification.E2E.HooksE.timeAddSpec) := + hookOk_congr h.publicApiTimeAdd_ok + +theorem GhostRowSpecOk.publicApiTimeAdd_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsTimeAddSym f) : + HookOk f (withLsRet (withVmPreserved CryptoVerification.LibsignalPublicApi.timeAddSpec)) := + h.timeAdd_row.2.1 + +theorem GhostRowSpecOk.timeAdd_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsTimeAddSym f) : + HookOk f (withLsRet timeAddBudgetSpec) := + hookOk_congr h.publicApiTimeAdd_budget_ok + +theorem GhostRowSpecOk.publicApiTimeAdd_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsTimeAddSym f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) : + HookOk f (withLsRet (withAlloc A lim CryptoVerification.LibsignalPublicApi.timeAddSpec)) := + h.timeAdd_row.2.2 A lim + +theorem GhostRowSpecOk.blackBox_row [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsBlackBoxSym f) : BlackBoxRowSpec f := by + have hp := h.rowSpec + unfold ExtraRowSpec at hp + have hd1 : (lsBlackBoxSym == "bcmp") = false := by decide + have hd2 : (lsBlackBoxSym == "strlen") = false := by decide + have hd3 : (lsBlackBoxSym == "memmove") = false := by decide + have hd4 : (lsBlackBoxSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsBlackBoxSym == lsMemrchrSym) = false := by decide + have hd6 : (lsBlackBoxSym == lsDurationSinceSym) = false := by decide + have hd7 : (lsBlackBoxSym == lsTimeAddSym) = false := by decide + have hd8 : (lsBlackBoxSym == lsBlackBoxSym) = true := by decide + simp only [hd1, hd2, hd3, hd4, hd5, hd6, hd7, hd8, Bool.false_eq_true, ↓reduceIte] at hp + exact hp + +theorem GhostRowSpecOk.blackBox_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsBlackBoxSym f) {stk : Nat} + (hstk : 16 ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookOk f (withStack blackBoxSpec stk) := + h.blackBox_row.1 stk hstk hstk_ub + +theorem GhostRowSpecOk.blackBox_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsBlackBoxSym f) {stk : Nat} + (hstk : 16 ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookOk f (withVmPreserved (withStack blackBoxSpec stk)) := + h.blackBox_row.2.1 stk hstk hstk_ub + +theorem GhostRowSpecOk.blackBox_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsBlackBoxSym f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) {stk : Nat} + (hstk : 16 ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookOk f (withAlloc A lim (withStack blackBoxSpec stk)) := + h.blackBox_row.2.2 A lim stk hstk hstk_ub + +theorem GhostRowSpecOk.findReceiverBlackBox_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsBlackBoxSym f) {stk : Nat} + (hstk : 16 ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookOk f (withStack CryptoVerification.LibsignalSession.FindReceiverChainIndex.blackBoxSpec stk) := + hookOk_congr (h.blackBox_ok hstk hstk_ub) + +theorem GhostRowSpecOk.findReceiverBlackBox_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsBlackBoxSym f) {stk : Nat} + (hstk : 16 ≤ stk) (hstk_ub : stk ≤ 2 ^ 64 := by decide) : + HookOk f (withVmPreserved + (withStack CryptoVerification.LibsignalSession.FindReceiverChainIndex.blackBoxSpec stk)) := + hookOk_congr (h.blackBox_budget_ok hstk hstk_ub) + +theorem GhostRowSpecOk.staticSecretDrop_row [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsStaticSecretDropSym f) : StaticSecretDropRowSpec f := by + have hp := h.rowSpec + unfold ExtraRowSpec at hp + have hd1 : (lsStaticSecretDropSym == "bcmp") = false := by decide + have hd2 : (lsStaticSecretDropSym == "strlen") = false := by decide + have hd3 : (lsStaticSecretDropSym == "memmove") = false := by decide + have hd4 : (lsStaticSecretDropSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsStaticSecretDropSym == lsMemrchrSym) = false := by decide + have hd6 : (lsStaticSecretDropSym == lsDurationSinceSym) = false := by decide + have hd7 : (lsStaticSecretDropSym == lsTimeAddSym) = false := by decide + have hd8 : (lsStaticSecretDropSym == lsBlackBoxSym) = false := by decide + have hd9 : (lsStaticSecretDropSym == lsStaticSecretDropSym) = true := by decide + simp only [hd1, hd2, hd3, hd4, hd5, hd6, hd7, hd8, hd9, Bool.false_eq_true, ↓reduceIte] at hp + exact hp + +theorem GhostRowSpecOk.staticSecretDrop_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsStaticSecretDropSym f) : + HookOk f zeroizeSecretSpec := + h.staticSecretDrop_row.1 + +theorem GhostRowSpecOk.staticSecretDrop_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsStaticSecretDropSym f) : + HookOk f (withVmPreserved zeroizeSecretSpec) := + h.staticSecretDrop_row.2.1 + +theorem GhostRowSpecOk.staticSecretDrop_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsStaticSecretDropSym f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) : + HookOk f (withAlloc A lim zeroizeSecretSpec) := + h.staticSecretDrop_row.2.2 A lim + +theorem GhostRowSpecOk.sharedSecretDrop_row [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsSharedSecretDropSym f) : SharedSecretDropRowSpec f := by + have hp := h.rowSpec + unfold ExtraRowSpec at hp + have hd1 : (lsSharedSecretDropSym == "bcmp") = false := by decide + have hd2 : (lsSharedSecretDropSym == "strlen") = false := by decide + have hd3 : (lsSharedSecretDropSym == "memmove") = false := by decide + have hd4 : (lsSharedSecretDropSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsSharedSecretDropSym == lsMemrchrSym) = false := by decide + have hd6 : (lsSharedSecretDropSym == lsDurationSinceSym) = false := by decide + have hd7 : (lsSharedSecretDropSym == lsTimeAddSym) = false := by decide + have hd8 : (lsSharedSecretDropSym == lsBlackBoxSym) = false := by decide + have hd9 : (lsSharedSecretDropSym == lsStaticSecretDropSym) = false := by decide + have hd10 : (lsSharedSecretDropSym == lsSharedSecretDropSym) = true := by decide + simp only [hd1, hd2, hd3, hd4, hd5, hd6, hd7, hd8, hd9, hd10, Bool.false_eq_true, + ↓reduceIte] at hp + exact hp + +theorem GhostRowSpecOk.sharedSecretDrop_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsSharedSecretDropSym f) : + HookOk f zeroizeSecretSpec := + h.sharedSecretDrop_row.1 + +theorem GhostRowSpecOk.sharedSecretDrop_budget_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsSharedSecretDropSym f) : + HookOk f (withVmPreserved zeroizeSecretSpec) := + h.sharedSecretDrop_row.2.1 + +theorem GhostRowSpecOk.sharedSecretDrop_withAlloc_ok [LibsignalPlacement] {f : State → State} + (h : GhostRowSpecOk lsSharedSecretDropSym f) + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) : + HookOk f (withAlloc A lim zeroizeSecretSpec) := + h.sharedSecretDrop_row.2.2 A lim + +/-! ## 6. Kernel Reduction Smoke Checks on `List.lookup` & `FreshExtraKeysList` -/ + +theorem extra_lookup_hit_smoke (f : State → State) : + ({ alloc := id, dealloc := id, realloc := id, allocZeroed := id, + extra := [("memmove", f)] } : CliGhostHooks).extra.lookup "memmove" = some f := + rfl + +theorem extra_lookup_miss_smoke (f : State → State) : + ({ alloc := id, dealloc := id, realloc := id, allocZeroed := id, + extra := [("memmove", f)] } : CliGhostHooks).extra.lookup "memset" = none := + rfl + +end LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/BcmpRowSpec.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/BcmpRowSpec.lean new file mode 100644 index 000000000..e9a046259 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/BcmpRowSpec.lean @@ -0,0 +1,58 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.E2E.HooksE.Common -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget -- proof-setup: allow-public-import + +/-! +# `bcmp` Consumer `HookOk` Row Arm (`ExtraRowSpecs.BcmpRowSpec`) + +Row-owned consumer-contract leaf module for `"bcmp"` in `ExtraGhostSpecs.ExtraRowSpec`. +-/ + +set_option autoImplicit false +set_option linter.dupNamespace false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.BcmpRowSpec + +open Arm64 ProofLib +open CryptoVerification.E2E.HooksE (bcmpVregsSpec) +open CryptoVerification.SignalSession.Cli (cliBcmpSpec) +open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc + (hookOk_withAlloc_of_withVmPreserved withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) + +/-- `bcmp` consumer `HookOk` arm (`cliBcmpSpec` + `bcmpVregsSpec`, plain, `withVmPreserved`, and + `withAlloc`; `e2eBcmpSpec` follows via `hookOk_bcmpSpec_of_vregs`). -/ +@[expose] def BcmpRowSpec (f : State → State) : Prop := + HookOk f cliBcmpSpec ∧ + HookOk f (withVmPreserved cliBcmpSpec) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits), + HookOk f (withAlloc A lim cliBcmpSpec)) ∧ + HookOk f bcmpVregsSpec ∧ + HookOk f (withVmPreserved bcmpVregsSpec) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits), + HookOk f (withAlloc A lim bcmpVregsSpec)) + +theorem BcmpRowSpec.of_vm {f : State → State} + (h1 : HookOk f cliBcmpSpec) (h2 : HookOk f bcmpVregsSpec) + (hvm : ∀ s : State, VmPreserved s (f s)) : BcmpRowSpec f := + let h1v := hookOk_withVmPreserved h1 hvm + let h2v := hookOk_withVmPreserved h2 hvm + ⟨h1, h1v, fun A lim => hookOk_withAlloc_of_withVmPreserved A lim h1v, + h2, h2v, fun A lim => hookOk_withAlloc_of_withVmPreserved A lim h2v⟩ + +end LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.BcmpRowSpec diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/BlackBoxRowSpec.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/BlackBoxRowSpec.lean new file mode 100644 index 000000000..6fe5e27e2 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/BlackBoxRowSpec.lean @@ -0,0 +1,58 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget -- proof-setup: allow-public-import + +/-! +# `core::hint::black_box<*const u8>` Consumer `HookOk` Row Arm (`ExtraRowSpecs.BlackBoxRowSpec`) + +Row-owned consumer-contract leaf module for `lsBlackBoxSym` in `ExtraGhostSpecs.ExtraRowSpec`. +Uses bounded stack frames (`16 ≤ stk → stk ≤ 2 ^ 64`) matching `BlackBoxCode` (`0c1b7e2b2a`). +-/ + +set_option autoImplicit false +set_option linter.dupNamespace false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.BlackBoxRowSpec + +open Arm64 ProofLib +open CryptoVerification.LibsignalTripleRatchet (blackBoxSpec withStack) +open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc + (hookOk_withAlloc_of_withVmPreserved withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) + +/-- `core::hint::black_box<*const u8>` (`lsBlackBoxSym`) consumer `HookOk` arm with bounded stack + size `16 ≤ stk → stk ≤ 2 ^ 64` (plain, `withVmPreserved`, and `withAlloc`). + Note: `CryptoVerification.LibsignalTripleRatchet.blackBoxSpec` and + `CryptoVerification.LibsignalSession.FindReceiverChainIndex.blackBoxSpec` have definitionally + identical fields (`rfl` via `hookOk_congr`). -/ +@[expose] def BlackBoxRowSpec (f : State → State) : Prop := + (∀ stk : Nat, 16 ≤ stk → stk ≤ 2 ^ 64 → HookOk f (withStack blackBoxSpec stk)) ∧ + (∀ stk : Nat, 16 ≤ stk → stk ≤ 2 ^ 64 → + HookOk f (withVmPreserved (withStack blackBoxSpec stk))) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat), + 16 ≤ stk → stk ≤ 2 ^ 64 → HookOk f (withAlloc A lim (withStack blackBoxSpec stk))) + +theorem BlackBoxRowSpec.of_vm {f : State → State} + (h1 : ∀ stk : Nat, 16 ≤ stk → stk ≤ 2 ^ 64 → HookOk f (withStack blackBoxSpec stk)) + (hvm : ∀ s : State, VmPreserved s (f s)) : BlackBoxRowSpec f := + ⟨h1, + fun stk hlo hhi => hookOk_withVmPreserved (h1 stk hlo hhi) hvm, + fun A lim stk hlo hhi => + hookOk_withAlloc_of_withVmPreserved A lim (hookOk_withVmPreserved (h1 stk hlo hhi) hvm)⟩ + +end LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.BlackBoxRowSpec diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/DurationSinceRowSpec.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/DurationSinceRowSpec.lean new file mode 100644 index 000000000..188752658 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/DurationSinceRowSpec.lean @@ -0,0 +1,87 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSat -- proof-setup: allow-public-import + +/-! +# `SystemTime::duration_since` Consumer `HookOk` Row Arm (`ExtraRowSpecs.DurationSinceRowSpec`) + +Row-owned consumer-contract leaf module for `lsDurationSinceSym` in `ExtraGhostSpecs.ExtraRowSpec`. +-/ + +set_option autoImplicit false +set_option linter.dupNamespace false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.DurationSinceRowSpec + +open Arm64 ProofLib +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession.Cli.Slots (durationSinceEpochAtSpec) +open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc + (hookOk_withAlloc_of_withVmPreserved withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (hookOk_withLsRet withLsRet) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) + +/-- `::duration_since` consumer `HookOk` arm narrowed with outermost + `withLsRet` (`Slots.durationSinceBoundedSpec` + bounded-stack `durationSinceEpochAtSpec stk` + for `208 ≤ stk → stk ≤ 2 ^ 64`, plain, `withVmPreserved`, and `withAlloc`). -/ +@[expose] def DurationSinceRowSpec [LibsignalPlacement] (f : State → State) : Prop := + HookOk f (withLsRet CryptoVerification.SignalSession.Cli.Slots.durationSinceBoundedSpec) ∧ + HookOk f + (withLsRet + (withVmPreserved CryptoVerification.SignalSession.Cli.Slots.durationSinceBoundedSpec)) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits), + HookOk f + (withLsRet + (withAlloc A lim CryptoVerification.SignalSession.Cli.Slots.durationSinceBoundedSpec))) ∧ + (∀ stk : Nat, 208 ≤ stk → stk ≤ 2 ^ 64 → HookOk f (withLsRet (durationSinceEpochAtSpec stk))) ∧ + (∀ stk : Nat, 208 ≤ stk → stk ≤ 2 ^ 64 → + HookOk f (withLsRet (withVmPreserved (durationSinceEpochAtSpec stk)))) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat), + 208 ≤ stk → stk ≤ 2 ^ 64 → HookOk f (withLsRet (withAlloc A lim (durationSinceEpochAtSpec stk)))) + +private theorem hookOk_withLsRet_withAlloc_of_ls [LibsignalPlacement] {α : Type} + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) + {f : State → State} {spec : Spec α} + (hh : HookOk f (withVmPreserved (withLsRet spec))) : + HookOk f (withLsRet (withAlloc A lim spec)) := by + intro ⟨x, st⟩ R s0 hrun hpre hsp + exact hookOk_withAlloc_of_withVmPreserved A lim hh ⟨x, st⟩ R s0 hrun + (by dsimp only [withLsRet, withAlloc] at hpre ⊢; simpa only [sepConj_assoc] using hpre) hsp + +theorem DurationSinceRowSpec.of_ls_vm [LibsignalPlacement] {f : State → State} + (h1 : HookOk f (withLsRet CryptoVerification.SignalSession.Cli.Slots.durationSinceBoundedSpec)) + (h2 : ∀ stk : Nat, 208 ≤ stk → stk ≤ 2 ^ 64 → HookOk f (withLsRet (durationSinceEpochAtSpec stk))) + (hvm : ∀ s : State, VmPreserved s (f s)) : DurationSinceRowSpec f := + let h1v := hookOk_withVmPreserved h1 hvm + ⟨h1, h1v, fun A lim => hookOk_withLsRet_withAlloc_of_ls A lim h1v, + h2, + fun stk hlo hhi => hookOk_withVmPreserved (h2 stk hlo hhi) hvm, + fun A lim stk hlo hhi => + hookOk_withLsRet_withAlloc_of_ls A lim (hookOk_withVmPreserved (h2 stk hlo hhi) hvm)⟩ + +theorem DurationSinceRowSpec.of_vm [LibsignalPlacement] {f : State → State} + (h1 : HookOk f CryptoVerification.SignalSession.Cli.Slots.durationSinceBoundedSpec) + (h2 : ∀ stk : Nat, 208 ≤ stk → stk ≤ 2 ^ 64 → HookOk f (durationSinceEpochAtSpec stk)) + (hvm : ∀ s : State, VmPreserved s (f s)) : DurationSinceRowSpec f := + DurationSinceRowSpec.of_ls_vm + (hookOk_withLsRet h1) + (fun stk hlo hhi => hookOk_withLsRet (h2 stk hlo hhi)) + hvm + +end LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.DurationSinceRowSpec diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/FromUtf8RowSpec.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/FromUtf8RowSpec.lean new file mode 100644 index 000000000..ae0c0dfde --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/FromUtf8RowSpec.lean @@ -0,0 +1,61 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget -- proof-setup: allow-public-import + +/-! +# `core::str::converts::from_utf8` Consumer `HookOk` Row Arm (`ExtraRowSpecs.FromUtf8RowSpec`) + +Row-owned consumer-contract leaf module for `lsFromUtf8Sym` in `ExtraGhostSpecs.ExtraRowSpec`. +-/ + +set_option autoImplicit false +set_option linter.dupNamespace false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.FromUtf8RowSpec + +open Arm64 ProofLib +open CryptoVerification.SignalSession.Cli.MainHops (fromUtf8AsciiSpec) +open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc + (hookOk_withAlloc_of_withVmPreserved withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO (fromUtf8AsciiSpecRO) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) + +/-- `core::str::converts::from_utf8` consumer `HookOk` arm (`fromUtf8AsciiSpec` + RO twin, + plain, `withVmPreserved`, and `withAlloc`). -/ +@[expose] def FromUtf8RowSpec (f : State → State) : Prop := + (∀ stk : Nat, HookOk f (fromUtf8AsciiSpec stk)) ∧ + (∀ stk : Nat, HookOk f (withVmPreserved (fromUtf8AsciiSpec stk))) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat), + HookOk f (withAlloc A lim (fromUtf8AsciiSpec stk))) ∧ + (∀ stk : Nat, HookOk f (fromUtf8AsciiSpecRO stk)) ∧ + (∀ stk : Nat, HookOk f (withVmPreserved (fromUtf8AsciiSpecRO stk))) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat), + HookOk f (withAlloc A lim (fromUtf8AsciiSpecRO stk))) + +theorem FromUtf8RowSpec.of_vm {f : State → State} + (h1 : ∀ stk : Nat, HookOk f (fromUtf8AsciiSpec stk)) + (h2 : ∀ stk : Nat, HookOk f (fromUtf8AsciiSpecRO stk)) + (hvm : ∀ s : State, VmPreserved s (f s)) : FromUtf8RowSpec f := + ⟨h1, + fun stk => hookOk_withVmPreserved (h1 stk) hvm, + fun A lim stk => hookOk_withAlloc_of_withVmPreserved A lim (hookOk_withVmPreserved (h1 stk) hvm), + h2, + fun stk => hookOk_withVmPreserved (h2 stk) hvm, + fun A lim stk => hookOk_withAlloc_of_withVmPreserved A lim (hookOk_withVmPreserved (h2 stk) hvm)⟩ + +end LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.FromUtf8RowSpec diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/MemmoveRowSpec.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/MemmoveRowSpec.lean new file mode 100644 index 000000000..7f1071fe7 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/MemmoveRowSpec.lean @@ -0,0 +1,67 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget -- proof-setup: allow-public-import + +/-! +# `memmove` Consumer `HookOk` Row Arm (`ExtraRowSpecs.MemmoveRowSpec`) + +Row-owned consumer-contract leaf module for `"memmove"` in `ExtraGhostSpecs.ExtraRowSpec`. +-/ + +set_option autoImplicit false +set_option linter.dupNamespace false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.MemmoveRowSpec + +open Arm64 ProofLib +open LibsignalBinary.Heap + (AllocCallPreserved AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove + (libcMemmoveBoundedSpec sessionMemmoveBoundedBudgetSpec sessionMemmoveBoundedSpec) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc + (hookOk_withAlloc_of_withVmPreserved withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) + +/-- `memmove` consumer `HookOk` arm narrowed to `#1348` `MemmoveArithBound`-guarded + `libcMemmoveBoundedSpec` + `sessionMemmoveBoundedSpec` (plain, `withVmPreserved` / + `sessionMemmoveBoundedBudgetSpec`, `withAlloc`, and `AllocCallPreserved`). -/ +@[expose] def MemmoveRowSpec (f : State → State) : Prop := + (∀ stk : Nat, HookOk f (libcMemmoveBoundedSpec stk)) ∧ + (∀ stk : Nat, HookOk f (withVmPreserved (libcMemmoveBoundedSpec stk))) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat), + HookOk f (withAlloc A lim (libcMemmoveBoundedSpec stk))) ∧ + (∀ stk : Nat, HookOk f (sessionMemmoveBoundedSpec stk)) ∧ + (∀ stk : Nat, HookOk f (sessionMemmoveBoundedBudgetSpec stk)) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat), + HookOk f (withAlloc A lim (sessionMemmoveBoundedSpec stk))) ∧ + (∀ s : State, AllocCallPreserved s (f s)) + +theorem MemmoveRowSpec.of_vm {f : State → State} + (h1 : ∀ stk : Nat, HookOk f (libcMemmoveBoundedSpec stk)) + (h2 : ∀ stk : Nat, HookOk f (sessionMemmoveBoundedSpec stk)) + (hvm : ∀ s : State, VmPreserved s (f s)) + (hacp : ∀ s : State, AllocCallPreserved s (f s)) : MemmoveRowSpec f := + ⟨h1, + fun stk => hookOk_withVmPreserved (h1 stk) hvm, + fun A lim stk => hookOk_withAlloc_of_withVmPreserved A lim (hookOk_withVmPreserved (h1 stk) hvm), + h2, + fun stk => hookOk_withVmPreserved (h2 stk) hvm, + fun A lim stk => hookOk_withAlloc_of_withVmPreserved A lim (hookOk_withVmPreserved (h2 stk) hvm), + hacp⟩ + +end LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.MemmoveRowSpec diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/MemrchrRowSpec.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/MemrchrRowSpec.lean new file mode 100644 index 000000000..eef2e0fe7 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/MemrchrRowSpec.lean @@ -0,0 +1,91 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget -- proof-setup: allow-public-import + +/-! +# `core::slice::memchr::memrchr` Consumer `HookOk` Row Arm (`ExtraRowSpecs.MemrchrRowSpec`) + +Row-owned consumer-contract leaf module for `lsMemrchrSym` in `ExtraGhostSpecs.ExtraRowSpec`. +Uses bounded stack frames (`extHookStack ≤ stk → stk ≤ 2 ^ 64`) per `HOOKS-PREP` / `HOOKS-LEAD` +`03:43Z` decision (`stackAt_shrink` requirement on real-code lifts; instantiated at `extHookStack = +16384` by `decide`). +-/ + +set_option autoImplicit false +set_option linter.dupNamespace false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.MemrchrRowSpec + +open Arm64 ProofLib +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.LibsignalTripleRatchet (extHookStack) +open CryptoVerification.SignalSession.Cli.MainHops (memrchrSpec) +open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc + (hookOk_withAlloc_of_withVmPreserved withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (hookOk_withLsRet withLsRet) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO (memrchrSpecRO) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) + +/-- `core::slice::memchr::memrchr` (`lsMemrchrSym`) consumer `HookOk` arm narrowed with outermost + `withLsRet` and bounded stack `extHookStack ≤ stk → stk ≤ 2 ^ 64` (`MainHops.memrchrSpec` + + `CalleesRO.memrchrSpecRO`, plain, `withVmPreserved`, and `withAlloc`). -/ +@[expose] def MemrchrRowSpec [LibsignalPlacement] (f : State → State) : Prop := + (∀ stk : Nat, extHookStack ≤ stk → stk ≤ 2 ^ 64 → HookOk f (withLsRet (memrchrSpec stk))) ∧ + (∀ stk : Nat, extHookStack ≤ stk → stk ≤ 2 ^ 64 → + HookOk f (withLsRet (withVmPreserved (memrchrSpec stk)))) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat), + extHookStack ≤ stk → stk ≤ 2 ^ 64 → HookOk f (withLsRet (withAlloc A lim (memrchrSpec stk)))) ∧ + (∀ stk : Nat, extHookStack ≤ stk → stk ≤ 2 ^ 64 → HookOk f (withLsRet (memrchrSpecRO stk))) ∧ + (∀ stk : Nat, extHookStack ≤ stk → stk ≤ 2 ^ 64 → + HookOk f (withLsRet (withVmPreserved (memrchrSpecRO stk)))) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat), + extHookStack ≤ stk → stk ≤ 2 ^ 64 → HookOk f (withLsRet (withAlloc A lim (memrchrSpecRO stk)))) + +private theorem hookOk_withLsRet_withAlloc_of_ls [LibsignalPlacement] {α : Type} + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) + {f : State → State} {spec : Spec α} + (hh : HookOk f (withVmPreserved (withLsRet spec))) : + HookOk f (withLsRet (withAlloc A lim spec)) := by + intro ⟨x, st⟩ R s0 hrun hpre hsp + exact hookOk_withAlloc_of_withVmPreserved A lim hh ⟨x, st⟩ R s0 hrun + (by dsimp only [withLsRet, withAlloc] at hpre ⊢; simpa only [sepConj_assoc] using hpre) hsp + +theorem MemrchrRowSpec.of_ls_vm [LibsignalPlacement] {f : State → State} + (h1 : ∀ stk : Nat, extHookStack ≤ stk → stk ≤ 2 ^ 64 → HookOk f (withLsRet (memrchrSpec stk))) + (h2 : ∀ stk : Nat, extHookStack ≤ stk → stk ≤ 2 ^ 64 → HookOk f (withLsRet (memrchrSpecRO stk))) + (hvm : ∀ s : State, VmPreserved s (f s)) : MemrchrRowSpec f := + ⟨h1, + fun stk hlo hhi => hookOk_withVmPreserved (h1 stk hlo hhi) hvm, + fun A lim stk hlo hhi => + hookOk_withLsRet_withAlloc_of_ls A lim (hookOk_withVmPreserved (h1 stk hlo hhi) hvm), + h2, + fun stk hlo hhi => hookOk_withVmPreserved (h2 stk hlo hhi) hvm, + fun A lim stk hlo hhi => + hookOk_withLsRet_withAlloc_of_ls A lim (hookOk_withVmPreserved (h2 stk hlo hhi) hvm)⟩ + +theorem MemrchrRowSpec.of_vm [LibsignalPlacement] {f : State → State} + (h1 : ∀ stk : Nat, extHookStack ≤ stk → stk ≤ 2 ^ 64 → HookOk f (memrchrSpec stk)) + (h2 : ∀ stk : Nat, extHookStack ≤ stk → stk ≤ 2 ^ 64 → HookOk f (memrchrSpecRO stk)) + (hvm : ∀ s : State, VmPreserved s (f s)) : MemrchrRowSpec f := + MemrchrRowSpec.of_ls_vm + (fun stk hlo hhi => hookOk_withLsRet (h1 stk hlo hhi)) + (fun stk hlo hhi => hookOk_withLsRet (h2 stk hlo hhi)) + hvm + +end LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.MemrchrRowSpec diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/SharedSecretDropRowSpec.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/SharedSecretDropRowSpec.lean new file mode 100644 index 000000000..fd9be4102 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/SharedSecretDropRowSpec.lean @@ -0,0 +1,51 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget -- proof-setup: allow-public-import + +/-! +# `::drop` Consumer `HookOk` Row Arm (`ExtraRowSpecs.SharedSecretDropRowSpec`) + +Row-owned consumer-contract leaf module for `lsSharedSecretDropSym` in `ExtraGhostSpecs.ExtraRowSpec`. +-/ + +set_option autoImplicit false +set_option linter.dupNamespace false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.SharedSecretDropRowSpec + +open Arm64 ProofLib +open CryptoVerification.LibsignalTripleRatchet (zeroizeSecretSpec) +open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc + (hookOk_withAlloc_of_withVmPreserved withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) + +/-- `::drop` consumer `HookOk` arm (`zeroizeSecretSpec`, + plain, `withVmPreserved`, and `withAlloc`). -/ +@[expose] def SharedSecretDropRowSpec (f : State → State) : Prop := + HookOk f zeroizeSecretSpec ∧ + HookOk f (withVmPreserved zeroizeSecretSpec) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits), + HookOk f (withAlloc A lim zeroizeSecretSpec)) + +theorem SharedSecretDropRowSpec.of_vm {f : State → State} + (h1 : HookOk f zeroizeSecretSpec) + (hvm : ∀ s : State, VmPreserved s (f s)) : SharedSecretDropRowSpec f := + let hv := hookOk_withVmPreserved h1 hvm + ⟨h1, hv, fun A lim => hookOk_withAlloc_of_withVmPreserved A lim hv⟩ + +end LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.SharedSecretDropRowSpec diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/StaticSecretDropRowSpec.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/StaticSecretDropRowSpec.lean new file mode 100644 index 000000000..c5e27de96 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/StaticSecretDropRowSpec.lean @@ -0,0 +1,51 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget -- proof-setup: allow-public-import + +/-! +# `::drop` Consumer `HookOk` Row Arm (`ExtraRowSpecs.StaticSecretDropRowSpec`) + +Row-owned consumer-contract leaf module for `lsStaticSecretDropSym` in `ExtraGhostSpecs.ExtraRowSpec`. +-/ + +set_option autoImplicit false +set_option linter.dupNamespace false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.StaticSecretDropRowSpec + +open Arm64 ProofLib +open CryptoVerification.LibsignalTripleRatchet (zeroizeSecretSpec) +open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc + (hookOk_withAlloc_of_withVmPreserved withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) + +/-- `::drop` consumer `HookOk` arm (`zeroizeSecretSpec`, + plain, `withVmPreserved`, and `withAlloc`). -/ +@[expose] def StaticSecretDropRowSpec (f : State → State) : Prop := + HookOk f zeroizeSecretSpec ∧ + HookOk f (withVmPreserved zeroizeSecretSpec) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits), + HookOk f (withAlloc A lim zeroizeSecretSpec)) + +theorem StaticSecretDropRowSpec.of_vm {f : State → State} + (h1 : HookOk f zeroizeSecretSpec) + (hvm : ∀ s : State, VmPreserved s (f s)) : StaticSecretDropRowSpec f := + let hv := hookOk_withVmPreserved h1 hvm + ⟨h1, hv, fun A lim => hookOk_withAlloc_of_withVmPreserved A lim hv⟩ + +end LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.StaticSecretDropRowSpec diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/StrlenRowSpec.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/StrlenRowSpec.lean new file mode 100644 index 000000000..548f60323 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/StrlenRowSpec.lean @@ -0,0 +1,70 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.HookDischarge.Libc.Strlen -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget -- proof-setup: allow-public-import + +/-! +# `strlen` Consumer `HookOk` Row Arm (`ExtraRowSpecs.StrlenRowSpec`) + +Row-owned consumer-contract leaf module for `"strlen"` in `ExtraGhostSpecs.ExtraRowSpec`. + +Narrowed to `HookDischarge.Libc.Strlen.withStrlenPadRO` (`musl` 88 B SWAR `strlen` on +`origin/stockhooks/train` `5e7c7addc7`); `withVmPreserved (withStrlenPadRO (strlenSpecRO stk))` is +definitionally (`rfl`) identical to `ArgvPad.strlenSpecROSat stk`. +-/ + +set_option autoImplicit false +set_option linter.dupNamespace false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.StrlenRowSpec + +open Arm64 ProofLib +open CryptoVerification.SignalSession.Cli.MainHops (strlenSpec) +open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.HookDischarge.Libc.Strlen (withStrlenPadRO) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc + (hookOk_withAlloc_of_withVmPreserved hookOk_withAlloc_withVmPreserved withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO (strlenSpecRO) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) + +/-- `strlen` consumer `HookOk` arm narrowed to SWAR-padded `withStrlenPadRO` (`strlenSpec` + + `strlenSpecRO`, plain, `withVmPreserved` = `ArgvPad.strlenSpecROSat` by `rfl`, and `withAlloc`). -/ +@[expose] def StrlenRowSpec (f : State → State) : Prop := + (∀ stk : Nat, HookOk f (withStrlenPadRO (strlenSpec stk))) ∧ + (∀ stk : Nat, HookOk f (withVmPreserved (withStrlenPadRO (strlenSpec stk)))) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat), + HookOk f (withAlloc A lim (withStrlenPadRO (strlenSpec stk)))) ∧ + (∀ stk : Nat, HookOk f (withStrlenPadRO (strlenSpecRO stk))) ∧ + (∀ stk : Nat, HookOk f (withVmPreserved (withStrlenPadRO (strlenSpecRO stk)))) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat), + HookOk f (withAlloc A lim (withStrlenPadRO (strlenSpecRO stk)))) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (stk : Nat), + HookOk f (withAlloc A lim (withVmPreserved (withStrlenPadRO (strlenSpecRO stk))))) + +theorem StrlenRowSpec.of_vm {f : State → State} + (h1 : ∀ stk : Nat, HookOk f (withStrlenPadRO (strlenSpec stk))) + (h2 : ∀ stk : Nat, HookOk f (withStrlenPadRO (strlenSpecRO stk))) + (hvm : ∀ s : State, VmPreserved s (f s)) : StrlenRowSpec f := + ⟨h1, + fun stk => hookOk_withVmPreserved (h1 stk) hvm, + fun A lim stk => hookOk_withAlloc_of_withVmPreserved A lim (hookOk_withVmPreserved (h1 stk) hvm), + h2, + fun stk => hookOk_withVmPreserved (h2 stk) hvm, + fun A lim stk => hookOk_withAlloc_of_withVmPreserved A lim (hookOk_withVmPreserved (h2 stk) hvm), + fun A lim stk => hookOk_withAlloc_withVmPreserved A lim (hookOk_withVmPreserved (h2 stk) hvm)⟩ + +end LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.StrlenRowSpec diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/TimeAddRowSpec.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/TimeAddRowSpec.lean new file mode 100644 index 000000000..0105be026 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/ExtraRowSpecs/TimeAddRowSpec.lean @@ -0,0 +1,68 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget -- proof-setup: allow-public-import +public import LibsignalBinary.Specifications.LibsignalPublicApi -- proof-setup: allow-public-import + +/-! +# `SystemTime::add` Consumer `HookOk` Row Arm (`ExtraRowSpecs.TimeAddRowSpec`) + +Row-owned consumer-contract leaf module for `lsTimeAddSym` in `ExtraGhostSpecs.ExtraRowSpec`. +-/ + +set_option autoImplicit false +set_option linter.dupNamespace false + +public section + +namespace LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.TimeAddRowSpec + +open Arm64 ProofLib +open CryptoVerification (LibsignalPlacement) +open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithAlloc + (hookOk_withAlloc_of_withVmPreserved withAlloc) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (hookOk_withLsRet withLsRet) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget (hookOk_withVmPreserved) + +/-- `>::add` consumer `HookOk` arm narrowed with outermost + `withLsRet` (`LibsignalPublicApi.timeAddSpec`, `withLsRet (withVmPreserved ...)` = + `withLsRet timeAddBudgetSpec` by `rfl`, and `withLsRet (withAlloc ...)`). -/ +@[expose] def TimeAddRowSpec [LibsignalPlacement] (f : State → State) : Prop := + HookOk f (withLsRet CryptoVerification.LibsignalPublicApi.timeAddSpec) ∧ + HookOk f (withLsRet (withVmPreserved CryptoVerification.LibsignalPublicApi.timeAddSpec)) ∧ + (∀ {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits), + HookOk f (withLsRet (withAlloc A lim CryptoVerification.LibsignalPublicApi.timeAddSpec))) + +private theorem hookOk_withLsRet_withAlloc_of_ls [LibsignalPlacement] {α : Type} + {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) + {f : State → State} {spec : Spec α} + (hh : HookOk f (withVmPreserved (withLsRet spec))) : + HookOk f (withLsRet (withAlloc A lim spec)) := by + intro ⟨x, st⟩ R s0 hrun hpre hsp + exact hookOk_withAlloc_of_withVmPreserved A lim hh ⟨x, st⟩ R s0 hrun + (by dsimp only [withLsRet, withAlloc] at hpre ⊢; simpa only [sepConj_assoc] using hpre) hsp + +theorem TimeAddRowSpec.of_ls_vm [LibsignalPlacement] {f : State → State} + (h1 : HookOk f (withLsRet CryptoVerification.LibsignalPublicApi.timeAddSpec)) + (hvm : ∀ s : State, VmPreserved s (f s)) : TimeAddRowSpec f := + let hv := hookOk_withVmPreserved h1 hvm + ⟨h1, hv, fun A lim => hookOk_withLsRet_withAlloc_of_ls A lim hv⟩ + +theorem TimeAddRowSpec.of_vm [LibsignalPlacement] {f : State → State} + (h1 : HookOk f CryptoVerification.LibsignalPublicApi.timeAddSpec) + (hvm : ∀ s : State, VmPreserved s (f s)) : TimeAddRowSpec f := + TimeAddRowSpec.of_ls_vm (hookOk_withLsRet h1) hvm + +end LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraRowSpecs.TimeAddRowSpec diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/PureExtraGhosts.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/PureExtraGhosts.lean new file mode 100644 index 000000000..1e33dccc1 --- /dev/null +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/PureExtraGhosts.lean @@ -0,0 +1,612 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.E2E.HooksE.WrapperHooksCommon -- proof-setup: allow-public-import +import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove +import LibsignalBinary.Proofs.HookDischarge.Libc.Strlen +import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet +import LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO +import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AddressA1 +import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFs +import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.StrlenUtf8A1 +import LibsignalBinary.Proofs.SignalSession.Cli.Run.Glue.BcmpHook +import LibsignalBinary.Proofs.SignalSession.Cli.Run.Glue.FsTraced +import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSat +import LibsignalBinary.Proofs.SpecLemmas.SignalSession.CliRun +import LibsignalBinary.Proofs.TripleRatchet.Hooks +import ProofLib.SepLogic.WP.StateNorm + +/-! +# Pure / Unplaced 10-Row `extra` Ghost Witness (`Cli.Run.Slots.PureExtraGhosts`) + +Constructs the `W`-free, placement-free 10-row `pureExtraGhosts : ExtraGhostTable` witness for +Cutover 2B's unplaced/pure ghost hook bundles (`a0Ghost`, `bumpGhost`, and `hole2_ghFixed`), +together with: +- `pureBcmpFn` / `pureBcmpFn_ok` and `pureUtf8Err`, +- `pureExtraGhosts_specOk : ExtraFullListSpecOk pureExtraGhosts`, +- `pureExtraGhosts_fsT` (`HookFsTraced IsFsC` for `CliGhostHooksFs.extra_fsT`), +- `pureExtraGhosts_trace_eq` and `pureExtraGhosts_noAllocFailed` (for `ExternNoAllocFailed`), +- `pureExtraGhosts_vmPreserved`, `pureExtraGhosts_perm_eq`, and + `pureExtraGhosts_preserves_execFrozen` (for `h2ef_hole2_ghFixed_preserves_execFrozen`). +-/ + +public section + +set_option autoImplicit false + +namespace LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts + +open Arm64 ProofLib +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.E2E (timeAddHook) +open CryptoVerification.E2E.HooksE (bcmpVregsSpec timeAddHook_ok) +open CryptoVerification.LibsignalAesCbc (returnToLinkRegister) +open CryptoVerification.LibsignalPublicApi (timeAddSpec) +open CryptoVerification.LibsignalSession (blackBoxHook) +open CryptoVerification.SpqrV1.ChainProofs (bytesAt) +open CryptoVerification.LibsignalTripleRatchet + (blackBoxHook_ok blackBoxSpec extHookStack withStack zeroizeSecretHook zeroizeSecretHook_ok + zeroizeSecretSpec) +open CryptoVerification.RustHeap (allocFailedEvent) +open CryptoVerification.SignalSession + (cliBcmpHook durationSinceExactHook fromUtf8Hook lsBlackBoxSym lsDurationSinceSym lsFromUtf8Sym + lsMemrchrSym lsSharedSecretDropSym lsStaticSecretDropSym lsTimeAddSym memrchrHook strlenHook + unmodelled) +open CryptoVerification.SignalSession.Cli (cliBcmpSpec) +open CryptoVerification.SignalSession.Cli.MainHops + (fromUtf8AsciiSpec fromUtf8Hook_ok hookMemmove_fs hookOk_withStack memrchrHook_ok memrchrSpec + strlenHook_ok strlenSpec) +open CryptoVerification.SignalSession.Cli.RunGlue + (IsFsC blackBoxHook_fsT bytesAt_readBytes cliBcmpHook_fsT durationSinceExactHook_fsT + fromUtf8Hook_fsT hookMemmove_fsT memrchrHook_fsT strlenHook_fsT timeAddHook_fsT + zeroizeSecretHook_fsT) +open CryptoVerification.SignalSession.Cli.Slots + (durationSinceBoundedSpec durationSinceEpochAtSpec durationSinceExactHook_bounded_ok + durationSinceExactHook_epoch_at_ok) +open LibsignalBinary.Heap (AllocCallPreserved VmPreserved) +open LibsignalBinary.Heap.IfaceBudgetLemmas + (perm_write32_norm perm_write64_norm perm_writeBytes_norm) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove + (hookMemmove_bounded_ok hookMemmove_sessionBounded_ok) +open LibsignalBinary.Proofs.HookDischarge.Libc.Strlen (withStrlenPadRO) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO + (fromUtf8Hook_ro_ok fromUtf8Hook_vmPreserved memrchrHook_ro_ok memrchrHook_vmPreserved + strlenHook_ro_ok strlenHook_vmPreserved) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (BcmpRowSpec BlackBoxRowSpec CompleteExtraKeysList DurationSinceRowSpec ExtraFullListSpecOk + ExtraGhostTable ExtraListSpecOk ExtraRowSpec FreshExtraKeysList FromUtf8RowSpec GhostRowSpecOk + MemmoveRowSpec MemrchrRowSpec SharedSecretDropRowSpec StaticSecretDropRowSpec StrlenRowSpec + TimeAddRowSpec cliExtraGhostSyms) + +/-! ## 1. Pure `bcmp` & `from_utf8` Value Helpers and 10-Row `pureExtraGhosts` Table -/ + +/-- Pure `W`-free `bcmp` return-value function (`0` iff equal, `1` otherwise). -/ +@[expose] def pureBcmpFn (a b : List (BitVec 8)) : BitVec 64 := + if a = b then 0#64 else 1#64 + +theorem pureBcmpFn_ok : + ∀ a b : List (BitVec 8), a.length = b.length → + ((pureBcmpFn a b).setWidth 32 = 0#32 ↔ a = b) := by + intro a b _ + unfold pureBcmpFn + by_cases hab : a = b <;> simp [hab] + +/-- Pure `W`-free `from_utf8` error payload function. -/ +@[expose] def pureUtf8Err (_ : List (BitVec 8)) : BitVec 64 × BitVec 16 := + (0#64, 0#16) + +/-- 10-row pure/unplaced `ExtraGhostTable` in canonical `cliExtraGhostSyms` key order, binding + `"memmove"` at index `0` to `ProofLib.hookMemmove`. -/ +@[expose] noncomputable def pureExtraGhosts : ExtraGhostTable := + [ ("memmove", hookMemmove) + , ("bcmp", cliBcmpHook pureBcmpFn) + , ("strlen", strlenHook) + , (lsMemrchrSym, memrchrHook) + , (lsFromUtf8Sym, fromUtf8Hook pureUtf8Err) + , (lsDurationSinceSym, durationSinceExactHook) + , (lsTimeAddSym, timeAddHook) + , (lsBlackBoxSym, blackBoxHook) + , (lsStaticSecretDropSym, zeroizeSecretHook) + , (lsSharedSecretDropSym, zeroizeSecretHook) + ] + +/-- `pureExtraGhosts.lookup "memmove"` reduces definitionally to `some hookMemmove` by `rfl`. -/ +theorem pureExtraGhosts_lookup_memmove : + pureExtraGhosts.lookup "memmove" = some hookMemmove := + rfl + +theorem pureExtraGhosts_fresh : FreshExtraKeysList pureExtraGhosts := by + decide + +theorem pureExtraGhosts_complete : CompleteExtraKeysList pureExtraGhosts := by + decide + +private theorem pureExtraGhosts_lookup_cases {sym : String} {f : State → State} + (hLook : pureExtraGhosts.lookup sym = some f) : + (sym = "memmove" ∧ f = hookMemmove) ∨ + (sym = "bcmp" ∧ f = cliBcmpHook pureBcmpFn) ∨ + (sym = "strlen" ∧ f = strlenHook) ∨ + (sym = lsMemrchrSym ∧ f = memrchrHook) ∨ + (sym = lsFromUtf8Sym ∧ f = fromUtf8Hook pureUtf8Err) ∨ + (sym = lsDurationSinceSym ∧ f = durationSinceExactHook) ∨ + (sym = lsTimeAddSym ∧ f = timeAddHook) ∨ + (sym = lsBlackBoxSym ∧ f = blackBoxHook) ∨ + (sym = lsStaticSecretDropSym ∧ f = zeroizeSecretHook) ∨ + (sym = lsSharedSecretDropSym ∧ f = zeroizeSecretHook) := by + dsimp only [pureExtraGhosts, List.lookup] at hLook + by_cases h1 : sym = "memmove" + · subst h1; simp at hLook; exact Or.inl ⟨rfl, hLook.symm⟩ + · simp only [beq_eq_false_iff_ne.mpr h1] at hLook + by_cases h2 : sym = "bcmp" + · subst h2; simp at hLook; exact Or.inr (Or.inl ⟨rfl, hLook.symm⟩) + · simp only [beq_eq_false_iff_ne.mpr h2] at hLook + by_cases h3 : sym = "strlen" + · subst h3; simp at hLook; exact Or.inr (Or.inr (Or.inl ⟨rfl, hLook.symm⟩)) + · simp only [beq_eq_false_iff_ne.mpr h3] at hLook + by_cases h4 : sym = lsMemrchrSym + · subst h4; simp at hLook + exact Or.inr (Or.inr (Or.inr (Or.inl ⟨rfl, hLook.symm⟩))) + · simp only [beq_eq_false_iff_ne.mpr h4] at hLook + by_cases h5 : sym = lsFromUtf8Sym + · subst h5; simp at hLook + exact Or.inr (Or.inr (Or.inr (Or.inr (Or.inl ⟨rfl, hLook.symm⟩)))) + · simp only [beq_eq_false_iff_ne.mpr h5] at hLook + by_cases h6 : sym = lsDurationSinceSym + · subst h6; simp at hLook + exact Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inl ⟨rfl, hLook.symm⟩))))) + · simp only [beq_eq_false_iff_ne.mpr h6] at hLook + by_cases h7 : sym = lsTimeAddSym + · subst h7; simp at hLook + exact Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inl ⟨rfl, hLook.symm⟩)))))) + · simp only [beq_eq_false_iff_ne.mpr h7] at hLook + by_cases h8 : sym = lsBlackBoxSym + · subst h8; simp at hLook + exact Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr + (Or.inl ⟨rfl, hLook.symm⟩))))))) + · simp only [beq_eq_false_iff_ne.mpr h8] at hLook + by_cases h9 : sym = lsStaticSecretDropSym + · subst h9; simp at hLook + exact Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr + (Or.inl ⟨rfl, hLook.symm⟩)))))))) + · simp only [beq_eq_false_iff_ne.mpr h9] at hLook + by_cases h10 : sym = lsSharedSecretDropSym + · subst h10; simp at hLook + exact Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr + (Or.inr ⟨rfl, hLook.symm⟩)))))))) + · simp only [beq_eq_false_iff_ne.mpr h10] at hLook + cases hLook + +/-! ## 2. Private Per-Row `HookOk`, `VmPreserved`, `fs_eq`, and `trace_eq` Lemmas -/ + +private theorem hookOk_withStrlenPadRO_of_hookOk {f : State → State} + {spec : Spec (BitVec 64 × List (BitVec 8))} + (hf : HookOk f spec) : + HookOk f (withStrlenPadRO spec) := by + intro ⟨p, s⟩ R s0 hrun hpre hsp + dsimp only [withStrlenPadRO] at hpre + rw [sepConj_assoc] at hpre + exact hf (p, s) R s0 hrun (Satisfies.of_sep_right hpre) hsp + +private theorem setMem_vm (s : State) {m' : Memory} (hp : ∀ a, m'.perm a = s.mem.perm a) : + VmPreserved s (s.setMem m') := + ⟨⟨rfl, rfl, rfl⟩, rfl, hp, fun _ _ _ => rfl⟩ + +private theorem retHook_vm {g : State → State} {s : State} (hg : VmPreserved s (g s)) : + VmPreserved s (retHook g s) := by + unfold retHook + exact hg + +private theorem returnToLr_vm {s0 s : State} (hs : VmPreserved s0 s) : + VmPreserved s0 (returnToLinkRegister s) := by + unfold returnToLinkRegister + exact hs + +private theorem hookMemmove_vm (s : State) : VmPreserved s (hookMemmove s) := by + unfold hookMemmove hookMemcpy + exact retHook_vm (setMem_vm s fun a => congrFun (perm_writeBytes_norm _ _ _) a) + +private theorem hookMemmove_acp (s : State) : AllocCallPreserved s (hookMemmove s) := by + unfold hookMemmove hookMemcpy retHook + exact ⟨rfl, rfl, rfl, rfl, rfl, rfl, rfl⟩ + +private theorem pureBcmpHook_ok : HookOk (cliBcmpHook pureBcmpFn) cliBcmpSpec := by + refine retHook_ok fun x R s0 hrun hpre _hsp => ?_ + simp only [cliBcmpSpec, sepConj_assoc, satisfies_pure_sepConj] at hpre + rcases hpre with ⟨⟨hx0, hx1, hx2, hlen⟩, hmem⟩ + have hlenA : x.bsA.length ≤ 2 ^ 64 := by + have := (s0.readReg64 .x2).isLt + omega + have hreadA := bytesAt_readBytes hmem hlenA + have hmemB : s0.mem ⊨ bytesAt x.bRo x.b x.bsB ∗ + (bytesAt x.aRo x.a x.bsA ∗ (stackAt s0.sp extHookStack ∗ R)) := by + rwa [← sepConj_assoc, sepConj_comm (bytesAt x.aRo x.a x.bsA), sepConj_assoc] at hmem + have hreadB := bytesAt_readBytes hmemB (by omega) + rw [hlen] at hreadB + refine ⟨Memory.KeepsFrozen.refl s0.mem, rfl, hrun, + ⟨rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl⟩, ?_⟩ + dsimp only [cliBcmpSpec, cliBcmpHook, retHook] + rw [hx0, hx1, hx2, hreadA, hreadB] + simp only [sepConj_assoc, satisfies_pure_sepConj] + exact ⟨⟨pureBcmpFn_ok x.bsA x.bsB hlen.symm, rfl⟩, hmem⟩ + +private theorem pureBcmpHook_vregs_ok : HookOk (cliBcmpHook pureBcmpFn) bcmpVregsSpec := by + refine retHook_ok fun x R s0 hrun hpre _hsp => ?_ + simp only [bcmpVregsSpec, sepConj_assoc, satisfies_pure_sepConj] at hpre + rcases hpre with ⟨⟨hx0, hx1, hx2, hlen⟩, hmem⟩ + have hreadA : s0.mem.readBytes x.a x.bsA.length = x.bsA := + ((IsBlock.pointsToBytes x.a x.bsA).read hmem).2 + have hmemB : s0.mem ⊨ (x.b ↦ₛ x.bsB) ∗ ((x.a ↦ₛ x.bsA) ∗ (stackAt s0.sp extHookStack ∗ R)) := by + ac_nf at hmem ⊢ + have hreadB : s0.mem.readBytes x.b x.bsA.length = x.bsB := by + rw [← hlen]; exact ((IsBlock.pointsToBytes x.b x.bsB).read hmemB).2 + refine ⟨Memory.KeepsFrozen.refl s0.mem, rfl, hrun, + ⟨rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl⟩, ?_⟩ + dsimp only [bcmpVregsSpec, cliBcmpHook, retHook] + rw [hx0, hx1, hx2, hreadA, hreadB] + simp only [sepConj_assoc, satisfies_pure_sepConj] + exact ⟨⟨pureBcmpFn_ok x.bsA x.bsB hlen.symm, rfl, rfl⟩, hmem⟩ + +private theorem pureBcmpHook_vm (s : State) : VmPreserved s (cliBcmpHook pureBcmpFn s) := + VmPreserved.refl s + +private theorem durationSinceExactHook_vm (s : State) : + VmPreserved s (durationSinceExactHook s) := by + unfold durationSinceExactHook; try dsimp only + split + · exact VmPreserved.refl s + · try dsimp only + split + · refine retHook_vm (setMem_vm s fun a => ?_) + simp only [perm_write32_norm, perm_write64_norm] + · exact VmPreserved.refl s + +private theorem timeAddHook_vm (s : State) : VmPreserved s (timeAddHook s) := by + unfold timeAddHook + try dsimp only + split <;> (split <;> exact VmPreserved.refl s) + +private theorem blackBoxHook_vm (s : State) : VmPreserved s (blackBoxHook s) := + VmPreserved.refl s + +private theorem zeroizeSecretHook_vm (s : State) : VmPreserved s (zeroizeSecretHook s) := by + unfold zeroizeSecretHook + exact returnToLr_vm (setMem_vm s fun a => congrFun (perm_writeBytes_norm _ _ _) a) + +private theorem fromUtf8Hook_fs (s : State) : (fromUtf8Hook pureUtf8Err s).fs = s.fs := by + unfold fromUtf8Hook; dsimp only + split + · rfl + · split <;> rfl + +private theorem durationSinceExactHook_fs (s : State) : + (durationSinceExactHook s).fs = s.fs := by + unfold durationSinceExactHook; dsimp only + split + · rfl + · split <;> rfl + +private theorem timeAddHook_fs (s : State) : (timeAddHook s).fs = s.fs := by + unfold timeAddHook; dsimp only + split <;> (split <;> rfl) + +private theorem memrchrHook_fs (s : State) : (memrchrHook s).fs = s.fs := by + unfold memrchrHook + change (if (!s.mem.canRead (s.readReg64 .x1) (s.readReg64 .x2).toNat) = true then + unmodelled "memrchr: unreadable bytes" s + else + match ((List.range (s.mem.readBytes (s.readReg64 .x1) (s.readReg64 .x2).toNat).length).filter + fun i => (s.mem.readBytes (s.readReg64 .x1) (s.readReg64 .x2).toNat)[i]? == + some ((s.readReg64 .x0).setWidth 8)).getLast? with + | some i => retHook (fun s => (s.writeReg64 .x0 1#64).writeReg64 .x1 (BitVec.ofNat 64 i)) s + | none => retHook (fun s => s.writeReg64 .x0 0#64) s).fs = s.fs + split + · rfl + · split <;> rfl + +private theorem strlenHook_fs (s : State) : (strlenHook s).fs = s.fs := by + unfold strlenHook; dsimp only + split <;> rfl + +private theorem hookMemmove_trace (s : State) : (hookMemmove s).trace = s.trace := + rfl + +private theorem strlenHook_trace (s : State) : (strlenHook s).trace = s.trace := by + unfold strlenHook; dsimp only + split <;> rfl + +private theorem memrchrHook_trace (s : State) : (memrchrHook s).trace = s.trace := by + unfold memrchrHook + change (if (!s.mem.canRead (s.readReg64 .x1) (s.readReg64 .x2).toNat) = true then + unmodelled "memrchr: unreadable bytes" s + else + match ((List.range (s.mem.readBytes (s.readReg64 .x1) (s.readReg64 .x2).toNat).length).filter + fun i => (s.mem.readBytes (s.readReg64 .x1) (s.readReg64 .x2).toNat)[i]? == + some ((s.readReg64 .x0).setWidth 8)).getLast? with + | some i => retHook (fun s => (s.writeReg64 .x0 1#64).writeReg64 .x1 (BitVec.ofNat 64 i)) s + | none => retHook (fun s => s.writeReg64 .x0 0#64) s).trace = s.trace + split + · rfl + · split <;> rfl + +private theorem fromUtf8Hook_trace (s : State) : (fromUtf8Hook pureUtf8Err s).trace = s.trace := by + unfold fromUtf8Hook; dsimp only + split + · rfl + · split <;> rfl + +private theorem durationSinceExactHook_trace (s : State) : + (durationSinceExactHook s).trace = s.trace := by + unfold durationSinceExactHook; dsimp only + split + · rfl + · split <;> rfl + +private theorem timeAddHook_trace (s : State) : (timeAddHook s).trace = s.trace := by + unfold timeAddHook; dsimp only + split <;> (split <;> rfl) + +/-! ## 3. Per-Row `GhostRowSpecOk` & Table-Level `ExtraFullListSpecOk` -/ + +private theorem memmove_ghostRowSpecOk [LibsignalPlacement] : + GhostRowSpecOk "memmove" hookMemmove := by + refine ⟨hookMemmove_fs, hookMemmove_fsT, ?_⟩ + change MemmoveRowSpec hookMemmove + exact MemmoveRowSpec.of_vm (fun stk => hookMemmove_bounded_ok stk) + (fun stk => hookMemmove_sessionBounded_ok stk) hookMemmove_vm hookMemmove_acp + +private theorem bcmp_ghostRowSpecOk [LibsignalPlacement] : + GhostRowSpecOk "bcmp" (cliBcmpHook pureBcmpFn) := by + refine ⟨fun _ => rfl, cliBcmpHook_fsT pureBcmpFn, ?_⟩ + change BcmpRowSpec (cliBcmpHook pureBcmpFn) + exact BcmpRowSpec.of_vm pureBcmpHook_ok pureBcmpHook_vregs_ok pureBcmpHook_vm + +private theorem strlen_ghostRowSpecOk [LibsignalPlacement] : + GhostRowSpecOk "strlen" strlenHook := by + refine ⟨strlenHook_fs, strlenHook_fsT, ?_⟩ + change StrlenRowSpec strlenHook + exact StrlenRowSpec.of_vm + (fun stk => hookOk_withStrlenPadRO_of_hookOk (strlenHook_ok stk)) + (fun stk => hookOk_withStrlenPadRO_of_hookOk (strlenHook_ro_ok stk)) + strlenHook_vmPreserved + +private theorem memrchr_ghostRowSpecOk [LibsignalPlacement] : + GhostRowSpecOk lsMemrchrSym memrchrHook := by + refine ⟨memrchrHook_fs, memrchrHook_fsT, ?_⟩ + have hd1 : (lsMemrchrSym == "bcmp") = false := by decide + have hd2 : (lsMemrchrSym == "strlen") = false := by decide + have hd3 : (lsMemrchrSym == "memmove") = false := by decide + have hd4 : (lsMemrchrSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsMemrchrSym == lsMemrchrSym) = true := by decide + unfold ExtraRowSpec + simp only [hd1, hd2, hd3, hd4, hd5, Bool.false_eq_true, ↓reduceIte] + exact MemrchrRowSpec.of_vm (fun stk _ _ => memrchrHook_ok stk) + (fun stk _ _ => memrchrHook_ro_ok stk) memrchrHook_vmPreserved + +private theorem fromUtf8_ghostRowSpecOk [LibsignalPlacement] : + GhostRowSpecOk lsFromUtf8Sym (fromUtf8Hook pureUtf8Err) := by + refine ⟨fromUtf8Hook_fs, fromUtf8Hook_fsT pureUtf8Err, ?_⟩ + have hd1 : (lsFromUtf8Sym == "bcmp") = false := by decide + have hd2 : (lsFromUtf8Sym == "strlen") = false := by decide + have hd3 : (lsFromUtf8Sym == "memmove") = false := by decide + have hd4 : (lsFromUtf8Sym == lsFromUtf8Sym) = true := by decide + unfold ExtraRowSpec + simp only [hd1, hd2, hd3, hd4, Bool.false_eq_true, ↓reduceIte] + exact FromUtf8RowSpec.of_vm (fun stk => fromUtf8Hook_ok stk pureUtf8Err) + (fun stk => fromUtf8Hook_ro_ok stk pureUtf8Err) (fromUtf8Hook_vmPreserved pureUtf8Err) + +private theorem durationSince_ghostRowSpecOk [LibsignalPlacement] : + GhostRowSpecOk lsDurationSinceSym durationSinceExactHook := by + refine ⟨durationSinceExactHook_fs, durationSinceExactHook_fsT, ?_⟩ + have hd1 : (lsDurationSinceSym == "bcmp") = false := by decide + have hd2 : (lsDurationSinceSym == "strlen") = false := by decide + have hd3 : (lsDurationSinceSym == "memmove") = false := by decide + have hd4 : (lsDurationSinceSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsDurationSinceSym == lsMemrchrSym) = false := by decide + have hd6 : (lsDurationSinceSym == lsDurationSinceSym) = true := by decide + unfold ExtraRowSpec + simp only [hd1, hd2, hd3, hd4, hd5, hd6, Bool.false_eq_true, ↓reduceIte] + exact DurationSinceRowSpec.of_vm durationSinceExactHook_bounded_ok + (fun stk _ _ => durationSinceExactHook_epoch_at_ok stk) durationSinceExactHook_vm + +private theorem timeAdd_ghostRowSpecOk [LibsignalPlacement] : + GhostRowSpecOk lsTimeAddSym timeAddHook := by + refine ⟨timeAddHook_fs, timeAddHook_fsT, ?_⟩ + have hd1 : (lsTimeAddSym == "bcmp") = false := by decide + have hd2 : (lsTimeAddSym == "strlen") = false := by decide + have hd3 : (lsTimeAddSym == "memmove") = false := by decide + have hd4 : (lsTimeAddSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsTimeAddSym == lsMemrchrSym) = false := by decide + have hd6 : (lsTimeAddSym == lsDurationSinceSym) = false := by decide + have hd7 : (lsTimeAddSym == lsTimeAddSym) = true := by decide + unfold ExtraRowSpec + simp only [hd1, hd2, hd3, hd4, hd5, hd6, hd7, Bool.false_eq_true, ↓reduceIte] + exact TimeAddRowSpec.of_vm timeAddHook_ok timeAddHook_vm + +private theorem blackBox_ghostRowSpecOk [LibsignalPlacement] : + GhostRowSpecOk lsBlackBoxSym blackBoxHook := by + refine ⟨fun _ => rfl, blackBoxHook_fsT, ?_⟩ + have hd1 : (lsBlackBoxSym == "bcmp") = false := by decide + have hd2 : (lsBlackBoxSym == "strlen") = false := by decide + have hd3 : (lsBlackBoxSym == "memmove") = false := by decide + have hd4 : (lsBlackBoxSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsBlackBoxSym == lsMemrchrSym) = false := by decide + have hd6 : (lsBlackBoxSym == lsDurationSinceSym) = false := by decide + have hd7 : (lsBlackBoxSym == lsTimeAddSym) = false := by decide + have hd8 : (lsBlackBoxSym == lsBlackBoxSym) = true := by decide + unfold ExtraRowSpec + simp only [hd1, hd2, hd3, hd4, hd5, hd6, hd7, hd8, Bool.false_eq_true, ↓reduceIte] + exact BlackBoxRowSpec.of_vm (fun stk _ _ => hookOk_withStack blackBoxHook_ok stk) + blackBoxHook_vm + +private theorem staticSecretDrop_ghostRowSpecOk [LibsignalPlacement] : + GhostRowSpecOk lsStaticSecretDropSym zeroizeSecretHook := by + refine ⟨fun _ => rfl, zeroizeSecretHook_fsT, ?_⟩ + have hd1 : (lsStaticSecretDropSym == "bcmp") = false := by decide + have hd2 : (lsStaticSecretDropSym == "strlen") = false := by decide + have hd3 : (lsStaticSecretDropSym == "memmove") = false := by decide + have hd4 : (lsStaticSecretDropSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsStaticSecretDropSym == lsMemrchrSym) = false := by decide + have hd6 : (lsStaticSecretDropSym == lsDurationSinceSym) = false := by decide + have hd7 : (lsStaticSecretDropSym == lsTimeAddSym) = false := by decide + have hd8 : (lsStaticSecretDropSym == lsBlackBoxSym) = false := by decide + have hd9 : (lsStaticSecretDropSym == lsStaticSecretDropSym) = true := by decide + unfold ExtraRowSpec + simp only [hd1, hd2, hd3, hd4, hd5, hd6, hd7, hd8, hd9, Bool.false_eq_true, ↓reduceIte] + exact StaticSecretDropRowSpec.of_vm zeroizeSecretHook_ok zeroizeSecretHook_vm + +private theorem sharedSecretDrop_ghostRowSpecOk [LibsignalPlacement] : + GhostRowSpecOk lsSharedSecretDropSym zeroizeSecretHook := by + refine ⟨fun _ => rfl, zeroizeSecretHook_fsT, ?_⟩ + have hd1 : (lsSharedSecretDropSym == "bcmp") = false := by decide + have hd2 : (lsSharedSecretDropSym == "strlen") = false := by decide + have hd3 : (lsSharedSecretDropSym == "memmove") = false := by decide + have hd4 : (lsSharedSecretDropSym == lsFromUtf8Sym) = false := by decide + have hd5 : (lsSharedSecretDropSym == lsMemrchrSym) = false := by decide + have hd6 : (lsSharedSecretDropSym == lsDurationSinceSym) = false := by decide + have hd7 : (lsSharedSecretDropSym == lsTimeAddSym) = false := by decide + have hd8 : (lsSharedSecretDropSym == lsBlackBoxSym) = false := by decide + have hd9 : (lsSharedSecretDropSym == lsStaticSecretDropSym) = false := by decide + have hd10 : (lsSharedSecretDropSym == lsSharedSecretDropSym) = true := by decide + unfold ExtraRowSpec + simp only [hd1, hd2, hd3, hd4, hd5, hd6, hd7, hd8, hd9, hd10, Bool.false_eq_true, ↓reduceIte] + exact SharedSecretDropRowSpec.of_vm zeroizeSecretHook_ok zeroizeSecretHook_vm + +theorem pureExtraGhosts_listSpecOk [LibsignalPlacement] : + ExtraListSpecOk pureExtraGhosts where + fresh := pureExtraGhosts_fresh + rowOk := by + intro sym f hLook + rcases pureExtraGhosts_lookup_cases hLook with + ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | + ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ + · exact memmove_ghostRowSpecOk + · exact bcmp_ghostRowSpecOk + · exact strlen_ghostRowSpecOk + · exact memrchr_ghostRowSpecOk + · exact fromUtf8_ghostRowSpecOk + · exact durationSince_ghostRowSpecOk + · exact timeAdd_ghostRowSpecOk + · exact blackBox_ghostRowSpecOk + · exact staticSecretDrop_ghostRowSpecOk + · exact sharedSecretDrop_ghostRowSpecOk + +/-- Complete 10-row consumer spec bundle (`ExtraFullListSpecOk`) for `pureExtraGhosts` + (`0` `LinkedAt` / `MultiPlacement` hypotheses). -/ +theorem pureExtraGhosts_specOk [LibsignalPlacement] : + ExtraFullListSpecOk pureExtraGhosts where + toExtraListSpecOk := pureExtraGhosts_listSpecOk + complete := pureExtraGhosts_complete + +/-! ## 4. Placement-Free `fsT`, `noAllocFailed`, `VmPreserved`, and `ExecFrozen` Helpers -/ + +theorem pureExtraGhosts_lookup_fsT {sym : String} {f : State → State} + (hLook : pureExtraGhosts.lookup sym = some f) : + HookFsTraced IsFsC f := by + rcases pureExtraGhosts_lookup_cases hLook with + ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | + ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ + · exact hookMemmove_fsT + · exact cliBcmpHook_fsT pureBcmpFn + · exact strlenHook_fsT + · exact memrchrHook_fsT + · exact fromUtf8Hook_fsT pureUtf8Err + · exact durationSinceExactHook_fsT + · exact timeAddHook_fsT + · exact blackBoxHook_fsT + · exact zeroizeSecretHook_fsT + · exact zeroizeSecretHook_fsT + +/-- `CliGhostHooksFs.extra_fsT` companion for `pureExtraGhosts` (placement-free). -/ +theorem pureExtraGhosts_fsT : + ∀ sym f, + cliExtraGhostSyms.contains sym = true → + pureExtraGhosts.lookup sym = some f → + HookFsTraced IsFsC f := + fun _ _ _ hLook => pureExtraGhosts_lookup_fsT hLook + +theorem pureExtraGhosts_fs_eq {sym : String} {f : State → State} + (hLook : pureExtraGhosts.lookup sym = some f) (s : State) : + (f s).fs = s.fs := by + rcases pureExtraGhosts_lookup_cases hLook with + ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | + ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ + · exact hookMemmove_fs s + · rfl + · exact strlenHook_fs s + · exact memrchrHook_fs s + · exact fromUtf8Hook_fs s + · exact durationSinceExactHook_fs s + · exact timeAddHook_fs s + · rfl + · rfl + · rfl + +theorem pureExtraGhosts_trace_eq {sym : String} {f : State → State} + (hLook : pureExtraGhosts.lookup sym = some f) (s : State) : + (f s).trace = s.trace := by + rcases pureExtraGhosts_lookup_cases hLook with + ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | + ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ + · exact hookMemmove_trace s + · rfl + · exact strlenHook_trace s + · exact memrchrHook_trace s + · exact fromUtf8Hook_trace s + · exact durationSinceExactHook_trace s + · exact timeAddHook_trace s + · rfl + · rfl + · rfl + +/-- Every hook in `pureExtraGhosts` leaves `s.trace` unchanged, hence satisfies + `CliInitSlotOkPlacedAt.HookNoAllocFailed f` definitionally. -/ +theorem pureExtraGhosts_noAllocFailed {sym : String} {f : State → State} + (hLook : pureExtraGhosts.lookup sym = some f) (s : State) : + ∃ d : List TraceEvent, (f s).trace = s.trace ++ d ∧ allocFailedEvent ∉ d := + ⟨[], by rw [pureExtraGhosts_trace_eq hLook s, List.append_nil]; exact ⟨rfl, fun h => nomatch h⟩⟩ + +theorem pureExtraGhosts_vmPreserved {sym : String} {f : State → State} + (hLook : pureExtraGhosts.lookup sym = some f) (s : State) : + VmPreserved s (f s) := by + rcases pureExtraGhosts_lookup_cases hLook with + ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | + ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ + · exact hookMemmove_vm s + · exact pureBcmpHook_vm s + · exact strlenHook_vmPreserved s + · exact memrchrHook_vmPreserved s + · exact fromUtf8Hook_vmPreserved pureUtf8Err s + · exact durationSinceExactHook_vm s + · exact timeAddHook_vm s + · exact blackBoxHook_vm s + · exact zeroizeSecretHook_vm s + · exact zeroizeSecretHook_vm s + +theorem pureExtraGhosts_perm_eq {sym : String} {f : State → State} + (hLook : pureExtraGhosts.lookup sym = some f) (u : State) (a : BitVec 64) : + (f u).mem.perm a = u.mem.perm a := + (pureExtraGhosts_vmPreserved hLook u).2.2.1 a + +/-- Every hook in `pureExtraGhosts` preserves `AllocGhostLinkTransfer.ExecFrozen` + (`∀ a, (m.perm a).x = true → (m.perm a).r = true ∧ (m.perm a).w = false`), matching + `ExecFrozen u.mem → ExecFrozen (f u).mem` definitionally. -/ +theorem pureExtraGhosts_preserves_execFrozen {sym : String} {f : State → State} + (hLook : pureExtraGhosts.lookup sym = some f) (u : State) + (hfr : ∀ a : BitVec 64, + (u.mem.perm a).x = true → (u.mem.perm a).r = true ∧ (u.mem.perm a).w = false) : + ∀ a : BitVec 64, + ((f u).mem.perm a).x = true → ((f u).mem.perm a).r = true ∧ ((f u).mem.perm a).w = false := by + intro a hx + rw [pureExtraGhosts_perm_eq hLook u a] at hx ⊢ + exact hfr a hx + +end LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/SetUnackEpochPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/SetUnackEpochPlaced.lean index 49e536b3f..064687482 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/SetUnackEpochPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/SetUnackEpochPlaced.lean @@ -13,6 +13,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Glue.BcmpHookPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlaced public import LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.SessionStateCallees public import LibsignalBinary.Proofs.E2E.Pqxdh.TopLevel.SessionInitiateACommon +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSat import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic @@ -49,6 +50,8 @@ open CryptoVerification.E2E.Pqxdh.Initiator open CryptoVerification.E2E.Pqxdh.TopLevel open CryptoVerification.SignalSession CryptoVerification.SignalSession.Cli open CryptoVerification.SignalSession.Cli.MainHops +open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (LsRetAddr624 lsRetAddr624_blockPlacement_base_add) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) private abbrev allocHookStack : Nat := 4096 @@ -277,7 +280,7 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_placed_cl_ok [LibsignalPlacement] (hdealloc : HookSat H lsRustDeallocSym (rustDeallocSpec A)) (hmemcpy : HookSat H lsMemcpySym sessionMemcpyRegionSpec) (hpanic : H lsHandleErrorSym = some Rust.panicked) - (hTime : HookSat H lsDurationSinceSym durationSinceEpochAllocSpec) : + (hTime : HookSat H lsDurationSinceSym (withLsRet durationSinceEpochAllocSpec)) : subroutine_ok ((blkPC_33).rebase (blkPl_33).base H) (blkPl_33).base (withLsCodeLoaded lsmpl (setUnackPreKeyMsgEpochInnerSpec A)) := by have hshim' : subroutine_ok ((blkPC_33).rebase (blkPl_33).base H) @@ -287,7 +290,8 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_placed_cl_ok [LibsignalPlacement] have hmemcpy' : subroutine_ok ((blkPC_33).rebase (blkPl_33).base H) (lsρ lsMemcpySym) sessionMemcpyRegionSpec := ls_hook_ok_of_mem hmemcpy have htime' : subroutine_ok ((blkPC_33).rebase (blkPl_33).base H) - (lsρ lsDurationSinceSym) durationSinceEpochAllocSpec := ls_hook_ok_of_mem hTime + (lsρ lsDurationSinceSym) (withLsRet durationSinceEpochAllocSpec) := ls_hook_ok_of_mem hTime + dsimp only [withLsRet] at htime' have hdealloc' : subroutine_ok ((blkPC_33).rebase (blkPl_33).base H) (lsρ lsRustDeallocSym) (rustDeallocSpec A) := ls_hook_ok_of_mem hdealloc have hpanic' : ((blkPC_33).rebase (blkPl_33).base H).externAt? (lsρ lsHandleErrorSym) = @@ -388,6 +392,8 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_placed_cl_ok [LibsignalPlacement] (h120_8 ▸ h120_16 ▸ pointsTo64_triple_entails_memRegion24_epoch_placed (s0.sp - 120#64) _ _ _) have hsp2 : sf_2.sp = s0.sp - 144#64 := by rw [‹sf_2.sp = sf_1.sp›, ‹sf_1.sp = sf.sp›, ‹sf.sp = sm.sp›, hspm] + have hlr_ds : LsRetAddr624 ((blkPl_33).base + 160#64) := + lsRetAddr624_blockPlacement_base_add 33 160#64 (by decide) (by decide) rw [‹sf.sp = sm.sp›, hspm] wp_call htime' (s0.sp - 136#64, s0.sp - 120#64) rw [hsp2] @@ -415,7 +421,7 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_placed_ok [LibsignalPlacement] (hdealloc : HookSat H lsRustDeallocSym (rustDeallocSpec A)) (hmemcpy : HookSat H lsMemcpySym sessionMemcpyRegionSpec) (hpanic : H lsHandleErrorSym = some Rust.panicked) - (hTime : HookSat H lsDurationSinceSym durationSinceEpochAllocSpec) : + (hTime : HookSat H lsDurationSinceSym (withLsRet durationSinceEpochAllocSpec)) : subroutine_ok ((blkPC_33).rebase (blkPl_33).base H) (blkPl_33).base (setUnackPreKeyMsgExactStackEpochSpecPlaced A) := LibsignalPublicApi.StoreKit.subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded @@ -430,7 +436,7 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_placed_at_block [LibsignalPlacement] (hdealloc : HookSat H lsRustDeallocSym (rustDeallocSpec A)) (hmemcpy : HookSat H lsMemcpySym sessionMemcpyRegionSpec) (hpanic : H lsHandleErrorSym = some Rust.panicked) - (hTime : HookSat H lsDurationSinceSym durationSinceEpochAllocSpec) + (hTime : HookSat H lsDurationSinceSym (withLsRet durationSinceEpochAllocSpec)) (hi : i < 619 := by decide) : subroutine_ok callerProg (blkPl_33).base (setUnackPreKeyMsgExactStackEpochSpecPlaced A) := by @@ -467,7 +473,7 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_placed_ok_cli [LibsignalPlacement] lsHandleErrorSym = some Rust.panicked) (hTime : HookSat (CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExterns g (cliExternsPlaced mmpl W)) - lsDurationSinceSym durationSinceEpochAllocSpec) + lsDurationSinceSym (withLsRet durationSinceEpochAllocSpec)) (hi : i < 619 := by decide) : subroutine_ok callerProg (blkPl_33).base (setUnackPreKeyMsgExactStackEpochSpecPlaced E2E.HooksE.A0) := diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/SetUnackEpochPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/SetUnackEpochPlacedBudget.lean index df0d81247..b15cace0f 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/SetUnackEpochPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Run/Slots/SetUnackEpochPlacedBudget.lean @@ -18,6 +18,8 @@ public import LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.SessionStateCalleesBudg public import LibsignalBinary.Proofs.E2E.Pqxdh.TopLevel.SessionInitiateACommon public import LibsignalBinary.Proofs.Placed.BudgetPoolSync public meta import LibsignalBinary.Proofs.Placed.BudgetPoolSync -- shake: keep +public import LibsignalBinary.Proofs.HookDischarge.Libc.Common +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.SetUnackEpochPlaced public import LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget @@ -62,12 +64,11 @@ open CryptoVerification.E2E.Pqxdh.Initiator ( ) open CryptoVerification.E2E.Pqxdh.TopLevel (SetUnackExactGhost) open CryptoVerification.SignalSession ( - CliHooks cliExternsPlaced durationSinceExactHook lsDurationSinceSym + CliHooks cliExternsPlaced lsDurationSinceSym ) -open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliExternsPlaced_row cliGhostExterns) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) open CryptoVerification.SignalSession.Cli.Slots ( - cliExternsPlaced_durationSinceEpochAlloc_sat cliGhostExterns_sat_of_cliExternsPlaced - durationSinceEpochAllocSpec durationSinceEpochAtSpec durationSince_row_placed + durationSinceEpochAllocSpec durationSinceEpochAtSpec ) open LibsignalBinary.Heap ( AllocCostModel AllocEvent BudgetLimits FitsEnv FitsEvent FitsEvents FitsStep RustCliAllocBudget @@ -76,9 +77,9 @@ open LibsignalBinary.Heap ( subroutine_ok_allocNoOom_of_budget ) open LibsignalBinary.Heap.IfaceBudgetLemmas ( - perm_write32_norm perm_write64_norm subroutine_ok_rustCliAllocNoOom_externWithStack + subroutine_ok_rustCliAllocNoOom_externWithStack ) -open LibsignalBinary.Heap.SpecBudget (hookSat_withVmPreserved withVmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) open LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.SessionStateCalleesBudget ( dealloc_bytes_placed_ok ecPubKeySerializeAllocEvents ecPubKeySerializeRawPlacedSpec ecPubKeySerializeRaw_placed_ok_of_session rustDeallocBytesSpec setUnackPreKeyMsgEvents @@ -91,6 +92,9 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget ( sessionMemcpyRegionBudgetSpec sessionShimBudgetSpec ) +open LibsignalBinary.Proofs.HookDischarge.Libc.Common (keepsFs) +open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (LsRetAddr624 lsRetAddr624_blockPlacement_base_add) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet (withLsRet) /-! ## 1. Allocator event envelope and non-vacuity check -/ @@ -123,35 +127,27 @@ example : def durationSinceEpochAllocBudgetSpec : Spec (BitVec 64 × BitVec 64) := withVmPreserved durationSinceEpochAllocSpec -private theorem retHook_vm_local {f : State → State} {s : State} (h : VmPreserved s (f s)) : - VmPreserved s (retHook f s) := h - -private theorem setMem_vm_local (s : State) {m : Memory} - (hp : ∀ a : BitVec 64, m.perm a = s.mem.perm a) : - VmPreserved s (s.setMem m) := - ⟨⟨rfl, rfl, rfl⟩, rfl, hp, fun _ _ _ => rfl⟩ - -private theorem durationSinceExactHook_vm_local (s : State) : - VmPreserved s (durationSinceExactHook s) := by - unfold durationSinceExactHook; try dsimp only - split - · exact VmPreserved.refl s - · try dsimp only - split - · refine retHook_vm_local (setMem_vm_local s fun a => ?_) - simp only [perm_write32_norm, perm_write64_norm] - · exact VmPreserved.refl s - -theorem cliExternsPlaced_durationSinceEpochAlloc_budget_sat (mmpl : Obj.MultiPlacement) - (W : CliHooks) : - HookSat (cliExternsPlaced mmpl W) lsDurationSinceSym durationSinceEpochAllocBudgetSpec := by - refine hookSat_withVmPreserved (cliExternsPlaced_durationSinceEpochAlloc_sat mmpl W) fun g hg s => ?_ - have hfeq : cliExternsPlaced mmpl W lsDurationSinceSym = some durationSinceExactHook := - cliExternsPlaced_row mmpl W (durationSince_row_placed mmpl W) - rw [hfeq] at hg - injection hg with hfg - subst hfg - exact durationSinceExactHook_vm_local s +/-- Strip `keepsFs` from `HookSat H sym (keepsFs spec)`. -/ +theorem hookSat_drop_keepsFs {α : Type} {H : LibsignalHooks} {sym : String} {spec : Spec α} + (h : HookSat H sym (keepsFs spec)) : + HookSat H sym spec := by + rcases h with ⟨f, hf, hok⟩ + refine ⟨f, hf, fun x R s0 hrun hpre hsp => ?_⟩ + obtain ⟨hkf, hsym, hout⟩ := hok x R s0 hrun hpre hsp + refine ⟨hkf, hsym, ?_⟩ + rcases hout with ⟨hr, hc, hp⟩ | hrest + · refine Or.inl ⟨hr, hc, ?_⟩ + dsimp only [keepsFs] at hp + rw [sepConj_assoc, satisfies_pure_sepConj] at hp + exact hp.2 + · exact Or.inr hrest + +/-- Strip `keepsFs` under `withLsRet` (`withLsRet (keepsFs spec) = keepsFs (withLsRet spec)` by `rfl`). -/ +theorem hookSat_withLsRet_drop_keepsFs [LibsignalPlacement] {α : Type} + {H : LibsignalHooks} {sym : String} {spec : Spec α} + (h : HookSat H sym (withLsRet (keepsFs spec))) : + HookSat H sym (withLsRet spec) := + hookSat_drop_keepsFs (spec := withLsRet spec) h /-! ## 3. Budget-threaded `[LibsignalPlacement]` specifications -/ @@ -299,7 +295,7 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_placed_cl_ok [LibsignalPlacement] {M (halloc : HookSat H lsRustAllocSym (rustCliAllocBudgetSpec M A lim false)) (hdealloc : HookSat H lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat H lsMemcpySym sessionMemcpyRegionBudgetSpec) - (hTime : HookSat H lsDurationSinceSym durationSinceEpochAllocBudgetSpec) : + (hTime : HookSat H lsDurationSinceSym (withLsRet durationSinceEpochAllocBudgetSpec)) : subroutine_ok ((blkPC_33).rebase (blkPl_33).base H) (blkPl_33).base (withLsCodeLoaded lsmpl (setUnackPreKeyMsgEpochInnerSpec A lim)) := by unfold withLsCodeLoaded setUnackPreKeyMsgEpochInnerSpec @@ -321,7 +317,7 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_placed_cl_ok [LibsignalPlacement] {M have hmemcpy' : subroutine_ok ((blkPC_33).rebase (blkPl_33).base H) (lsρ lsMemcpySym) sessionMemcpyRegionBudgetSpec := ls_hook_ok_of_mem hmemcpy have htime' : subroutine_ok ((blkPC_33).rebase (blkPl_33).base H) - (lsρ lsDurationSinceSym) durationSinceEpochAllocBudgetSpec := + (lsρ lsDurationSinceSym) (withLsRet durationSinceEpochAllocBudgetSpec) := ls_hook_ok_of_mem hTime dsimp only [sessionShimBudgetSpec, CryptoVerification.LibsignalTripleRatchet.sessionShimSpec] at hshim' dsimp only [rustCliAllocNoOomExternSpecWithStack, @@ -331,7 +327,7 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_placed_cl_ok [LibsignalPlacement] {M dsimp only [rustDeallocBytesSpec] at hdealloc' dsimp only [sessionMemcpyRegionBudgetSpec, CryptoVerification.LibsignalTripleRatchet.sessionMemcpyRegionSpec, memcpyRegionSpec] at hmemcpy' - dsimp only [durationSinceEpochAllocBudgetSpec, withVmPreserved, + dsimp only [withLsRet, durationSinceEpochAllocBudgetSpec, withVmPreserved, durationSinceEpochAllocSpec, durationSinceEpochAtSpec] at htime' wp_init x s0 rcases x with ⟨⟨statePtr, optOpkTag, optOpkVal, spkId, baseKeyPtr, baseKeyBytes⟩, st⟩ @@ -402,6 +398,8 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_placed_cl_ok [LibsignalPlacement] {M apply SepWP.replace_pre (by sep_focus) (h120_8 ▸ h120_16 ▸ pointsTo64_triple_entails_memRegion24_epoch_placed_budget (s0.sp - 120#64) _ _ _) have hsp3 : sf_3.sp = s0.sp - 144#64 := by simp only [*, arm64_norm] + have hlr_ds : LsRetAddr624 ((blkPl_33).base + 160#64) := + lsRetAddr624_blockPlacement_base_add 33 160#64 (by decide) (by decide) wp_call htime' (s0.sp - 136#64, s0.sp - 120#64) refine SepWP.transport_budgetPool ‹VmPreserved _ sf_4› (hnext := ?_) rw [memRegion_16_split_64_epoch_placed_budget (s0.sp - 136#64), h136_eq] @@ -428,7 +426,7 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_placed_ok [LibsignalPlacement] {M : (halloc : HookSat H lsRustAllocSym (rustCliAllocBudgetSpec M A lim false)) (hdealloc : HookSat H lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat H lsMemcpySym sessionMemcpyRegionBudgetSpec) - (hTime : HookSat H lsDurationSinceSym durationSinceEpochAllocBudgetSpec) : + (hTime : HookSat H lsDurationSinceSym (withLsRet durationSinceEpochAllocBudgetSpec)) : subroutine_ok ((blkPC_33).rebase (blkPl_33).base H) (blkPl_33).base (setUnackPreKeyMsgExactStackEpochSpecPlaced A lim) := subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded @@ -443,7 +441,7 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_placed_at_block [LibsignalPlacement] (halloc : HookSat H lsRustAllocSym (rustCliAllocBudgetSpec M A lim false)) (hdealloc : HookSat H lsRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat H lsMemcpySym sessionMemcpyRegionBudgetSpec) - (hTime : HookSat H lsDurationSinceSym durationSinceEpochAllocBudgetSpec) + (hTime : HookSat H lsDurationSinceSym (withLsRet durationSinceEpochAllocBudgetSpec)) (hi : i < 619 := by decide) : subroutine_ok callerProg (blkPl_33).base (setUnackPreKeyMsgExactStackEpochSpecPlaced A lim) := by @@ -458,11 +456,17 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_placed_at_block [LibsignalPlacement] rw [sepConj_assoc, satisfies_pure_sepConj] at hpost exact hpost.2 -theorem setUnackPreKeyMsg_exact_stack_epoch_placed_ok_cli [LibsignalPlacement] + +/-- `HookSat`-parameterized specialization of `setUnackPreKeyMsg_exact_stack_epoch_placed_at_block` +at `cliGhostExterns g (cliExternsPlaced mmpl W)` from `CliGhostAllocHooks M A lim g` and explicit +`hTime : HookSat ... (withLsRet durationSinceEpochAllocBudgetSpec)` (for C2 ghost-hook swap). -/ +theorem setUnackPreKeyMsg_exact_stack_epoch_placed_ok_cli_sat [LibsignalPlacement] {callerProg : Program} {i : Nat} (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) (W : CliHooks) {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} [IsLsBlockProg callerProg i (cliGhostExterns g (cliExternsPlaced mmpl W))] (hG : CliGhostAllocHooks M A lim g) + (hTime : HookSat (cliGhostExterns g (cliExternsPlaced mmpl W)) lsDurationSinceSym + (withLsRet durationSinceEpochAllocBudgetSpec)) (hi : i < 619 := by decide) : subroutine_ok callerProg (blkPl_33).base (setUnackPreKeyMsgExactStackEpochSpecPlaced A lim) := @@ -471,8 +475,20 @@ theorem setUnackPreKeyMsg_exact_stack_epoch_placed_ok_cli [LibsignalPlacement] (cliExternsPlaced_alloc_budget_sat mmpl g W hG) (cliExternsPlaced_dealloc_budget_sat mmpl g W hG) (cliExternsPlaced_sessionMemcpyRegion_budget_sat mmpl g W hG) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_durationSinceEpochAlloc_budget_sat mmpl W)) + hTime + hi + +theorem setUnackPreKeyMsg_exact_stack_epoch_placed_ok_cli [LibsignalPlacement] + {callerProg : Program} {i : Nat} (mmpl : Obj.MultiPlacement) (g : CliGhostHooks) + (W : CliHooks) {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} + [IsLsBlockProg callerProg i (cliGhostExterns g (cliExternsPlaced mmpl W))] + (hG : CliGhostAllocHooks M A lim g) + (hi : i < 619 := by decide) : + subroutine_ok callerProg (blkPl_33).base + (setUnackPreKeyMsgExactStackEpochSpecPlaced A lim) := + setUnackPreKeyMsg_exact_stack_epoch_placed_ok_cli_sat mmpl g W hG + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_durationSinceEpochAlloc_budget_sat + g (cliExternsPlaced mmpl W) hG.extraOk) hi end LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.SetUnackEpochPlacedBudget diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/SpecsPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/SpecsPlaced.lean index 5132029b3..08dda00c8 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/SpecsPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/SpecsPlaced.lean @@ -851,7 +851,7 @@ def mainLitsPlaced [LibsignalPlacement] : SepProp := (lsρ coinsLitSym ↦ᵣ utf8 "coins") ∗ (dirLitsPlaced.foldr (fun l P => (lsρ l.1 ↦ᵣ utf8 l.2) ∗ P) emp) -/-- Relocatable 14-field allocator and `libc` memory contract bundle on `lsProg_617 H` (`withLsCodeRoLoaded`). -/ +/-- Relocatable 12-field allocator and `libc` memory contract bundle on `lsProg_617 H` (`withLsCodeRoLoaded`). -/ structure AllocContractsXCliPlaced [LibsignalPlacement] (A : RustAlloc) (H : LibsignalHooks) : Prop where alloc : subroutine_ok (lsProg_617 H) (lsρ lsRustAllocSymCli) @@ -875,12 +875,6 @@ structure AllocContractsXCliPlaced [LibsignalPlacement] (A : RustAlloc) session_memcpy_region : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → subroutine_ok (lsProg_617 H) (lsρ memcpyName) (LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (withStack sessionMemcpyRegionSpec stk)) - memmove : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → - subroutine_ok (lsProg_617 H) (lsρ memmoveName) - (LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (libcMemmoveSpec stk)) - session_memmove : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → - subroutine_ok (lsProg_617 H) (lsρ memmoveName) - (LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (sessionMemmoveSpec stk)) memset : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → subroutine_ok (lsProg_617 H) (lsρ memsetName) (LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (libcMemsetSpec stk)) @@ -894,7 +888,7 @@ structure AllocContractsXCliPlaced [LibsignalPlacement] (A : RustAlloc) subroutine_ok (lsProg_617 H) (lsρ memsetName) (LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (withStack sessionMemsetRegionSpec stk)) -/-- Relocatable 15-field `.keepsFs` allocator and `libc` memory contract bundle on `lsProg_617 H`. -/ +/-- Relocatable 13-field `.keepsFs` allocator and `libc` memory contract bundle on `lsProg_617 H`. -/ structure AllocContractsFsPlaced [LibsignalPlacement] (A : RustAlloc) (H : LibsignalHooks) : Prop where alloc : subroutine_ok (lsProg_617 H) (lsρ lsRustAllocSymCli) @@ -918,12 +912,6 @@ structure AllocContractsFsPlaced [LibsignalPlacement] (A : RustAlloc) session_memcpy_region : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → subroutine_ok (lsProg_617 H) (lsρ memcpyName) (LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (withStack sessionMemcpyRegionSpec stk).keepsFs) - memmove : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → - subroutine_ok (lsProg_617 H) (lsρ memmoveName) - (LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (libcMemmoveSpec stk).keepsFs) - session_memmove : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → - subroutine_ok (lsProg_617 H) (lsρ memmoveName) - (LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (sessionMemmoveSpec stk).keepsFs) memset : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → subroutine_ok (lsProg_617 H) (lsρ memsetName) (LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (libcMemsetSpec stk).keepsFs) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/SpecsPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/SpecsPlacedBudget.lean index 9988d9fba..582ee6a15 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/SpecsPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/SpecsPlacedBudget.lean @@ -47,7 +47,7 @@ open CryptoVerification.E2E.Record.DeserializeGeneral (DeserializeGenGhost) open CryptoVerification.E2E.Record.Serialization (CanonRecord) open CryptoVerification.LibsignalPublicApi.StoreSession (StoreShimCall) open CryptoVerification.LibsignalPublicApiRepr (RecordGhost sessionRecordAt) -open CryptoVerification.LibsignalTripleRatchet (extHookStack lsLogOff memcpyName memmoveName memsetName withStack) +open CryptoVerification.LibsignalTripleRatchet (extHookStack lsLogOff memcpyName memsetName withStack) open CryptoVerification.LibsignalTripleRatchet.Getters (dropSpeStackX) open CryptoVerification.LibsignalTripleRatchetRepr (AddrGhost UuidParser protocolAddressAt speWord) open CryptoVerification.RecordCodecs (IdentityKeyPair KyberPreKeyRecord) @@ -78,7 +78,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Main.CalleesBudget open LibsignalBinary.Proofs.SignalSession.Cli.Main.TopBudget (mainFrame) open LibsignalBinary.Proofs.SpqrV1.Varint.EncodeVarintPlacedCommonBudget (doReserveSpecOf) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget - (sessionMemcpyBudgetSpec sessionMemcpyRegionBudgetSpec sessionMemmoveBudgetSpec + (sessionMemcpyBudgetSpec sessionMemcpyRegionBudgetSpec sessionMemsetBudgetSpec sessionMemsetRegionBudgetSpec sessionShimBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Hooks2Budget (rustAllocSpecWithStack rustDeallocExternSpecWithStack rustReallocExternSpecWithStack) @@ -914,12 +914,6 @@ structure AllocContractsXCliPlaced [LibsignalPlacement] {M : AllocCostModel} session_memcpy_region : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → subroutine_ok (lsProg_617 H) (lsρ memcpyName) (CryptoVerification.LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (withStack sessionMemcpyRegionBudgetSpec stk)) - memmove : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → - subroutine_ok (lsProg_617 H) (lsρ memmoveName) - (CryptoVerification.LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (withVmPreserved (libcMemmoveSpec stk))) - session_memmove : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → - subroutine_ok (lsProg_617 H) (lsρ memmoveName) - (CryptoVerification.LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (sessionMemmoveBudgetSpec stk)) memset : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → subroutine_ok (lsProg_617 H) (lsρ memsetName) (CryptoVerification.LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (withVmPreserved (libcMemsetSpec stk))) @@ -933,7 +927,7 @@ structure AllocContractsXCliPlaced [LibsignalPlacement] {M : AllocCostModel} subroutine_ok (lsProg_617 H) (lsρ memsetName) (CryptoVerification.LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (withStack sessionMemsetRegionBudgetSpec stk)) -/-- Budget-threaded 15-field `.keepsFs` allocator and `libc` memory contract bundle on `lsProg_617 H`. -/ +/-- Budget-threaded 13-field `.keepsFs` allocator and `libc` memory contract bundle on `lsProg_617 H`. -/ structure AllocContractsFsPlaced [LibsignalPlacement] {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (H : LibsignalHooks) : Prop where alloc : subroutine_ok (lsProg_617 H) (lsρ lsRustAllocSymCli) @@ -957,12 +951,6 @@ structure AllocContractsFsPlaced [LibsignalPlacement] {M : AllocCostModel} session_memcpy_region : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → subroutine_ok (lsProg_617 H) (lsρ memcpyName) (CryptoVerification.LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (withStack sessionMemcpyRegionBudgetSpec stk).keepsFs) - memmove : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → - subroutine_ok (lsProg_617 H) (lsρ memmoveName) - (CryptoVerification.LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (withVmPreserved (libcMemmoveSpec stk)).keepsFs) - session_memmove : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → - subroutine_ok (lsProg_617 H) (lsρ memmoveName) - (CryptoVerification.LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (sessionMemmoveBudgetSpec stk).keepsFs) memset : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → subroutine_ok (lsProg_617 H) (lsρ memsetName) (CryptoVerification.LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (withVmPreserved (libcMemsetSpec stk)).keepsFs) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrChainPlacedInst.lean b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrChainPlacedInst.lean index 90d9460ee..9369109f0 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrChainPlacedInst.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrChainPlacedInst.lean @@ -158,6 +158,7 @@ theorem cliSpqrSend_chainFromPb_ok [LibsignalPlacement] (hG : CliGhostA0Hooks A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F A0)) : subroutine_ok (spqrSendPlacedProg (cliGhostExterns gh (cliExternsPlaced mmpl W))) @@ -165,7 +166,7 @@ theorem cliSpqrSend_chainFromPb_ok [LibsignalPlacement] (CryptoVerification.LibsignalTripleRatchet.withLsCodeRoLoaded lsmpl (chainFromPbSpecX CryptoVerification.E2E.HooksE.A0)) := by have : CliSpqrExt W (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - cliSpqrExt_self mmpl gh W hG hMs hMc hHmac + cliSpqrExt_self mmpl gh W hG hMs hMc hMv hHmac exact cliSpqrSend_chainFromPb_ok_ext W theorem cliSpqrSend_chainIntoPb_ok [LibsignalPlacement] @@ -173,6 +174,7 @@ theorem cliSpqrSend_chainIntoPb_ok [LibsignalPlacement] (hG : CliGhostA0Hooks A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F A0)) : subroutine_ok (spqrSendPlacedProg (cliGhostExterns gh (cliExternsPlaced mmpl W))) @@ -180,7 +182,7 @@ theorem cliSpqrSend_chainIntoPb_ok [LibsignalPlacement] (CryptoVerification.LibsignalTripleRatchet.withLsCodeRoLoaded lsmpl (chainIntoPbSpecX CryptoVerification.E2E.HooksE.A0)) := by have : CliSpqrExt W (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - cliSpqrExt_self mmpl gh W hG hMs hMc hHmac + cliSpqrExt_self mmpl gh W hG hMs hMc hMv hHmac exact cliSpqrSend_chainIntoPb_ok_ext W /-- Specializes `cliSpqrSendCoins_placed_ok` by discharging `hChainFromPb` (Block `364`) and `hChainIntoPb` (Block `365`). -/ @@ -189,6 +191,7 @@ theorem cliSpqrSendCoins_placed_ok_of_decode_intoPb [LibsignalPlacement] (hG : CliGhostA0Hooks A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F A0)) (hDecodeState : subroutine_ok @@ -211,9 +214,9 @@ theorem cliSpqrSendCoins_placed_ok_of_decode_intoPb [LibsignalPlacement] (CryptoVerification.LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (spqrSendCoinsPlacedSpecT CryptoVerification.E2E.HooksE.A0 0#64 (pqxdhSpqrModel ⟨W.C, W.Q⟩))) := - cliSpqrSendCoins_placed_ok mmpl gh W hG hMs hMc hHmac - (cliSpqrSend_chainFromPb_ok mmpl gh W hG hMs hMc hHmac) - (cliSpqrSend_chainIntoPb_ok mmpl gh W hG hMs hMc hHmac) + cliSpqrSendCoins_placed_ok mmpl gh W hG hMs hMc hMv hHmac + (cliSpqrSend_chainFromPb_ok mmpl gh W hG hMs hMc hMv hHmac) + (cliSpqrSend_chainIntoPb_ok mmpl gh W hG hMs hMc hMv hHmac) hDecodeState hStatesIntoPb /-! ## `spqrRecvPlacedProg` contracts (`SpqrRecvPlacedContracts`) -/ @@ -270,13 +273,14 @@ theorem cliSpqrRecv_chainFromPb_ok_trTrap [LibsignalPlacement] (hG : CliGhostA0Hooks A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F A0)) : subroutine_ok (spqrRecvPlacedProg (trTrapExternsPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W)))) (lsmpl.base 364) (withLsCodeRoLoaded lsmpl (chainFromPbSpecX A0)) := by have : CliSpqrExt W (trTrapExternsPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) := - cliSpqrExt_trTrap mmpl gh W hG hMs hMc hHmac + cliSpqrExt_trTrap mmpl gh W hG hMs hMc hMv hHmac exact cliSpqrRecv_chainFromPb_ok W theorem cliSpqrRecv_chainIntoPb_ok_trTrap [LibsignalPlacement] @@ -284,13 +288,14 @@ theorem cliSpqrRecv_chainIntoPb_ok_trTrap [LibsignalPlacement] (hG : CliGhostA0Hooks A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F A0)) : subroutine_ok (spqrRecvPlacedProg (trTrapExternsPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W)))) (lsmpl.base 365) (withLsCodeRoLoaded lsmpl (chainIntoPbSpecX A0)) := by have : CliSpqrExt W (trTrapExternsPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) := - cliSpqrExt_trTrap mmpl gh W hG hMs hMc hHmac + cliSpqrExt_trTrap mmpl gh W hG hMs hMc hMv hHmac exact cliSpqrRecv_chainIntoPb_ok W theorem cliSpqrRecv_chainFrom_ok_trTrap [LibsignalPlacement] @@ -298,13 +303,14 @@ theorem cliSpqrRecv_chainFrom_ok_trTrap [LibsignalPlacement] (hG : CliGhostA0Hooks A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F A0)) : subroutine_ok (spqrRecvPlacedProg (trTrapExternsPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W)))) (lsmpl.base 323) (withLsCodeRoLoaded lsmpl (chainFromSpecX (spqrHkdfWith W.C.F) A0)) := by have : CliSpqrExt W (trTrapExternsPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) := - cliSpqrExt_trTrap mmpl gh W hG hMs hMc hHmac + cliSpqrExt_trTrap mmpl gh W hG hMs hMc hMv hHmac exact cliSpqrRecv_chainFrom_ok W end LibsignalBinary.Proofs.SignalSession.Cli.SpqrChainPlacedInst diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrChainPlacedInstBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrChainPlacedInstBudget.lean index d03b269df..e403961dd 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrChainPlacedInstBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrChainPlacedInstBudget.lean @@ -10,9 +10,12 @@ limitations under the License. module public import LibsignalBinary.Proofs.Cli.SpqrV1.Top.Send.ContractsPlacedBudget +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.SpqrChainPlacedInst public import LibsignalBinary.Proofs.SpqrV1.Alloc.VecDequeGrowBudget +public import LibsignalBinary.Proofs.SpqrV1.Alloc.VecDequeGrowBudgetAux -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpqrV1.Chain.FromPbClPlacedBudget public import LibsignalBinary.Proofs.SpqrV1.Chain.IntoPbClPlacedBudget public import LibsignalBinary.Proofs.SpqrV1.Chain.NewBudget @@ -22,6 +25,7 @@ public import LibsignalBinary.Proofs.SpqrV1.Kdf.HkdfToSliceOkBudget public import LibsignalBinary.Proofs.SpqrV1.Top.ChainFrom.ProofPlacedBudget public import LibsignalBinary.Proofs.SpqrV1.Top.ChainFromVersionNegotiation.ProofPlacedBudget public import LibsignalBinary.Proofs.SpqrV1.Top.Recv.DefsPlacedBudget +import LibsignalBinary.Heap.SpecBudget import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.ConsumeMessageKey.HmacProofs.CompressAndDigest @@ -33,6 +37,7 @@ import LibsignalBinary.Proofs.SpqrV1.Kdf.HkdfToSliceOkBudgetSat import LibsignalBinary.Proofs.SpqrV1.Kdf.NewFromSliceGen import LibsignalBinary.Proofs.SpqrV1.Poly.EncodeBytes.DefsBudget import LibsignalBinary.Proofs.SpqrV1.Top.Recv.ContractsPlacedBudget +import LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget import ProofLib.OpcodeExclusion import VerifiedLibraries.RustStd.Proofs.ExecSegSym @@ -53,7 +58,7 @@ set_option maxRecDepth 200000 namespace LibsignalBinary.Proofs.SignalSession.Cli.SpqrChainPlacedInstBudget -open Arm64 Arm64.Obj ProofLib +open Arm64 Arm64.Obj ProofLib SepProp open CryptoGames.HKDF (hkdfExpand) open CryptoGames.LibsignalSession (Crypto) open CryptoVerification @@ -74,7 +79,8 @@ open CryptoVerification.LibsignalTripleRatchet (CalleeSaved CallingConventionPreserved_of_calleeSaved Frame HkdfPlacedHooks RunsTo TraceEq extHookStack extract_withLsCodeRoLoaded hookMemcpy_eq_memcpyHook hookMemset_eq_memsetHook keys_ls_subroutine_ok_of_block_cro - lsCompress256Sym lsMemcpySym lsMemsetSym ro_outside_rw_shared_lb withLsCodeRoLoaded) + lsCompress256Sym lsMemcpySym lsMemsetSym ro_outside_rw_shared_lb sessionMemmoveSpec + withLsCodeRoLoaded) open CryptoVerification.LibsignalTripleRatchet.Expand (KeepsFrozenNoAnon t1_length t2_length t3_length) open CryptoVerification.SignalSession @@ -87,7 +93,7 @@ open CryptoVerification.SignalSession.Cli.RunGlue cliGhostExterns_other cliGhostExterns_shim hookSat_of_eq withPanics_cliGhostExterns) open CryptoVerification.SignalSession.Cli.Slots (cliGhostExterns_panic_handle_error cliGhostExterns_sat_of_cliExternsPlaced - lsRngFillSym memmove_row_placed trTrapExternsPlaced) + lsRngFillSym trTrapExternsPlaced) open CryptoVerification.SpqrV1.Alloc (growOneStack spqr_hook_ok_of_mem) open CryptoVerification.SpqrV1.ChainProofs (bytesAt hkdfToSliceSpec hkdfToSliceSpqrSpec) open CryptoVerification.SpqrV1.ChainProofs.NextKeyInternalFacts @@ -126,6 +132,9 @@ open LibsignalBinary.Heap (AllocCallPreserved AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved rustCliAllocBudgetSpec rustCliDeallocBudgetSpec) open LibsignalBinary.Heap.RustStdAllocBudgetBridge (rustAllocShimVmSpec) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove + (sessionMemmoveBoundedBudgetSpec sessionMemmoveBoundedSpec) open LibsignalBinary.Proofs.Placed.BudgetVmSteps (vmPreserved_refl_iff vmPreserved_setMem_writeBytes vmPreserved_setPC) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget @@ -134,11 +143,13 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_framelessMemcpyAcp_budget_sat cliExternsPlaced_realloc_budget_sat) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraSpecOk hookSat_cliGhostExterns_of_extraOk) open LibsignalBinary.Proofs.SpqrV1.Alloc.ConcatBudgetAux (framelessMemcpyAcpSpec hookMemcpy_framelessMemcpyAcp_ok hookNoop_rustAllocShimVm_ok) open LibsignalBinary.Proofs.SpqrV1.Alloc.VecDequeGrowBudget (vec_deque_grow_spec_placed_ok) open LibsignalBinary.Proofs.SpqrV1.Alloc.VecDequeGrowBudgetAux - (hookMemmove_sessionMemmoveAcp_ok sessionMemmoveAcpSpec) + (sessionMemmoveAcpSpec sessionMemmoveBoundedAcpSpec) open LibsignalBinary.Proofs.SpqrV1.Chain.DefsBudget (chainNewSpecX vecDequeGrowSpec) open LibsignalBinary.Proofs.SpqrV1.Chain.FromPbClPlacedBudget (chain_from_pb_cl_placed_ok) open LibsignalBinary.Proofs.SpqrV1.Chain.IntoPbClPlacedBudget (chain_into_pb_cl_placed_ok_X) @@ -160,6 +171,7 @@ open LibsignalBinary.Proofs.SpqrV1.Top.ChainFromVersionNegotiation.DefsBudget (chainFromVersionNegotiationSpecX) open LibsignalBinary.Proofs.SpqrV1.Top.ChainFromVersionNegotiation.ProofPlacedBudget (chainFromVersionNegotiation_placed_ok_of_contracts_x) +open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemmoveBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Hooks2Budget (rustAllocSpecWithStack subroutine_ok_withStack_of_subroutine_ok withStack) @@ -1348,12 +1360,27 @@ theorem cliExternsPlaced_framelessMemcpyAcp_sat [LibsignalPlacement] HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) "memcpy" framelessMemcpyAcpSpec := cliExternsPlaced_framelessMemcpyAcp_budget_sat mmpl gh W hA -theorem cliExternsPlaced_sessionMemmoveAcp_sat - (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) (stk : Nat := 4096) : - HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) "memmove" (sessionMemmoveAcpSpec stk) := - cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - ⟨hookMemmove, cliExternsPlaced_row mmpl W (memmove_row_placed mmpl W), - hookMemmove_sessionMemmoveAcp_ok stk⟩ +theorem cliExternsPlaced_sessionMemmoveAcp_sat [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hOk : ExtraSpecOk gh) (stk : Nat := 4096) : + HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) "memmove" + (sessionMemmoveBoundedAcpSpec stk) := + hookSat_cliGhostExterns_of_extraOk gh (cliExternsPlaced mmpl W) hOk fun _ _ hRow => by + have h := hRow.sessionMemmove_budget_ok stk + intro x R s0 hrun hpre hsp + have hpre' : s0.mem ⊨ (sessionMemmoveBoundedBudgetSpec stk).pre x s0 ∗ R := hpre + rcases h x R s0 hrun hpre' hsp with ⟨hkeep, hsym, hout⟩ + refine ⟨hkeep, hsym, ?_⟩ + rcases hout with ⟨hret, hcc, hpost⟩ | hrest + · refine Or.inl ⟨hret, hcc, ?_⟩ + rcases x with ⟨base, buf, dst, src, len⟩ + dsimp only [sessionMemmoveBoundedBudgetSpec, sessionMemmoveBudgetSpec, withVmPreserved, + sessionMemmoveSpec, sessionMemmoveBoundedAcpSpec, sessionMemmoveAcpSpec] at hpost ⊢ + rw [sepConj_assoc, satisfies_pure_sepConj, sepConj_assoc, sepConj_assoc, + satisfies_pure_sepConj] at hpost + rw [sepConj_assoc, sepConj_assoc, satisfies_pure_sepConj] + exact ⟨⟨hpost.2.1.1, hRow.memmove_allocCallPreserved s0, hpost.1⟩, hpost.2.2⟩ + · exact Or.inr hrest theorem cliExternsPlaced_alloc_budget_withStack_sat [LibsignalPlacement] (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) {M : AllocCostModel} @@ -1526,7 +1553,7 @@ theorem cliVecDequeGrow_placed_ok [LibsignalPlacement] (hookSat_of_eq (hExt "memcpy" (by decide)) (cliExternsPlaced_framelessMemcpyAcp_sat mmpl gh W hA)) (hookSat_of_eq (hExt "memmove" (by decide)) - (cliExternsPlaced_sessionMemmoveAcp_sat mmpl gh W growOneStack)) + (cliExternsPlaced_sessionMemmoveAcp_sat mmpl gh W hA.extraOk growOneStack)) private theorem cliExternsPlaced_sessionMemsetRegion_allocVm_sat [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrDecodeStatePlacedInst.lean b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrDecodeStatePlacedInst.lean index f309705c7..daf39be22 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrDecodeStatePlacedInst.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrDecodeStatePlacedInst.lean @@ -288,6 +288,7 @@ theorem cliSpqrDecodeState_sendCoins_ok [LibsignalPlacement] (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) Slots.lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0)) (hDrop267 : subroutine_ok (libsignalSessionLib.blockProgram lsmpl 267 (Rust.withPanics (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)))) @@ -341,7 +342,7 @@ theorem cliSpqrDecodeState_sendCoins_ok [LibsignalPlacement] (CryptoVerification.SpqrV1.Top.DecodeState.decodeStatePlacedSpecX canonicalV1InnerHeap E2E.HooksE.A0)) := by have : CliSpqrExt W (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) := - cliSpqrExt_self mmpl gh W hG hMs hMc hHmac + cliSpqrExt_self mmpl gh W hG hMs hMc hMv hHmac exact cliSpqrDecodeState_cl W hDrop267 hDrop270 hDrop281 hDrop282 hPush257 hFrom261 hSkip263 hBytes290 hVarint291 hChainParams294 hEpochDir299 @@ -419,6 +420,7 @@ theorem cliSpqrDecodeState_recv_trTrap_ok [LibsignalPlacement] (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) Slots.lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0)) (hDrop267 : subroutine_ok (libsignalSessionLib.blockProgram lsmpl 267 (Rust.withPanics (Slots.trTrapExternsPlaced (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))))) @@ -470,7 +472,7 @@ theorem cliSpqrDecodeState_recv_trTrap_ok [LibsignalPlacement] (LibsignalTripleRatchet.withLsCodeRoLoaded lsmpl (decodeStatePlacedSpecX canonicalV1InnerHeap E2E.HooksE.A0)) := by have : CliSpqrExt W (Slots.trTrapExternsPlaced (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) := - cliSpqrExt_trTrap mmpl gh W hG hMs hMc hHmac + cliSpqrExt_trTrap mmpl gh W hG hMs hMc hMv hHmac exact cliSpqrDecodeState_recv_ok W hDrop267 hDrop270 hDrop281 hDrop282 hPush257 hFrom261 hSkip263 hBytes290 hVarint291 hChainParams294 hEpochDir299 diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrInitialStatePlacedInst.lean b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrInitialStatePlacedInst.lean index 946019e9a..f2eec7e8a 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrInitialStatePlacedInst.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrInitialStatePlacedInst.lean @@ -687,6 +687,7 @@ theorem cliSpqrInitialState_placed_ok_closed [LibsignalPlacement] (hG : CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0)) : subroutine_ok @@ -697,7 +698,7 @@ theorem cliSpqrInitialState_placed_ok_closed [LibsignalPlacement] let _ := CryptoVerification.SpqrV1.Top.Placed.instIsLsBlockProg_327 (Rust.withPanics (cliGhostExterns gh (cliExternsPlaced mmpl W))) have : CliSpqrExt W (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - cliSpqrExt_self mmpl gh W hG hMs hMc hHmac + cliSpqrExt_self mmpl gh W hG hMs hMc hMv hHmac have hv1 := initialState_v1_callInv_placed_ok (A := A0) (F := W.C.F) (ext := cliGhostExterns gh (cliExternsPlaced mmpl W)) ((congrFun (withPanics_cliGhostExterns mmpl gh W) spqrHandleErrorSym).trans diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrSendCoinsPlacedInst.lean b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrSendCoinsPlacedInst.lean index 8c5ed19a8..50d8c374a 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrSendCoinsPlacedInst.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrSendCoinsPlacedInst.lean @@ -90,9 +90,12 @@ private theorem cliGhostExterns_eq_of_base (mmpl : Obj.MultiPlacement) (gh : Run (h7 : sym ≠ CryptoVerification.SignalSession.lsReadFileSym := by decide) (h8 : sym ≠ CryptoVerification.SignalSession.lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : RunGlue.cliExtraGhostSyms.contains sym = false ∨ gh.extra.lookup sym = none := by + left; decide) : RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W) sym = v := - (RunGlue.cliGhostExterns_other gh (cliExternsPlaced mmpl W) h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans h + (RunGlue.cliGhostExterns_other gh (cliExternsPlaced mmpl W) + h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 hExtra).trans h theorem spqrCoinsFillSpecPlaced_eq_coinsFillSpecPlaced [LibsignalPlacement] : CryptoVerification.Cli.SpqrV1.Top.Send.spqrCoinsFillSpecPlaced = @@ -182,6 +185,7 @@ theorem cliStatesPlacedSeams [LibsignalPlacement] (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) Slots.lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0)) : CryptoVerification.SpqrV1.StatesPlacedSeams E2E.HooksE.A0 W.C.F W.Q.K @@ -191,8 +195,8 @@ theorem cliStatesPlacedSeams [LibsignalPlacement] (cliRecvCt2PlacedAlloc mmpl gh W hG) (by rw [RunGlue.withPanics_cliGhostExterns mmpl gh W] - exact Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_sessionMemmove_sat mmpl W 0)) + exact ⟨hookMemmove, RunGlue.cliGhostExterns_extra_some gh (cliExternsPlaced mmpl W) hMv, + CryptoVerification.LibsignalTripleRatchet.hookMemmove_trace_ok 0⟩) (by rw [RunGlue.withPanics_cliGhostExterns mmpl gh W] exact Slots.cliExternsPlaced_sessionMemsetRegion_sat mmpl gh W hG) @@ -217,6 +221,7 @@ theorem cliSpqrSendPeerSeams_of_peers [LibsignalPlacement] (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) Slots.lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0)) (hDecodeState : subroutine_ok @@ -247,7 +252,7 @@ theorem cliSpqrSendPeerSeams_of_peers [LibsignalPlacement] (lsmpl.base 352) (LibsignalTripleRatchet.withLsCodeRoLoaded lsmpl (messageSerializeSpecX spqrPolyApi E2E.HooksE.A0))) : CliSpqrSendPeerSeams E2E.HooksE.A0 W.C (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) := - let hS := cliStatesPlacedSeams mmpl gh W hG hMs hMc hHmac + let hS := cliStatesPlacedSeams mmpl gh W hG hMs hMc hMv hHmac { decodeState_ok := hDecodeState encodeVarint_ok := hEncodeVarint chainFromVn_ok := hChainFromVn @@ -546,6 +551,7 @@ theorem spqrSendCoins_placed_seam_of_peer_contracts [LibsignalPlacement] (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) Slots.lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0)) (hChainFromPb : subroutine_ok @@ -610,12 +616,12 @@ theorem spqrSendCoins_placed_seam_of_peer_contracts [LibsignalPlacement] hChainFromPb hChainAddEpoch hChainSendKey hChainIntoPb hAuthMacHdr hAuthUpdate hHkdfToVec (cliEncodeBytesPlacedOkX mmpl gh W hG) (cliPolyNextChunkPlacedOkX mmpl gh W hG) - (cliSpqrSendPeerSeams_of_peers mmpl gh W hG hMs hMc hHmac + (cliSpqrSendPeerSeams_of_peers mmpl gh W hG hMs hMc hMv hHmac hDecodeState hEncodeVarint hChainFromVn hStatesIntoPb hMessageSerialize)) (spqrSendExtraContractsPlaced_of_cli mmpl gh W hG hHmac hMacHdrPinned) /-- External hook table class matching `RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)` on all -non-RNG symbols for some `(mmpl, gh)` satisfying `CliGhostA0Hooks`, stock `memset`/`memcpy` hooks, +non-RNG symbols for some `(mmpl, gh)` satisfying `CliGhostA0Hooks`, stock `memset`/`memcpy`/`memmove` hooks, and the `libcrux_hmac` contract (satisfied by both `RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)` and its `trTrapExternsPlaced` wrap, while keeping `[CliSpqrExt W ext]` 2-argument for downstream SPQR modules). -/ class CliSpqrExt (W : CliHooks) (ext : String → Option (State → State)) : Prop where @@ -624,6 +630,7 @@ class CliSpqrExt (W : CliHooks) (ext : String → Option (State → State)) : Pr Slots.CliGhostA0Hooks E2E.HooksE.A0 gh ∧ gh.memset = some memsetHook ∧ gh.memcpy = some memcpyHook ∧ + gh.extra.lookup "memmove" = some hookMemmove ∧ HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) Slots.lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0) ∧ ∀ sym : String, sym ≠ "libsignal_session_rng_fill" → @@ -633,27 +640,29 @@ theorem cliSpqrExt_self (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) Slots.lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0)) : CliSpqrExt W (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) := - ⟨⟨mmpl, gh, hG, hMs, hMc, hHmac, fun _ _ => rfl⟩⟩ + ⟨⟨mmpl, gh, hG, hMs, hMc, hMv, hHmac, fun _ _ => rfl⟩⟩ theorem cliSpqrExt_trTrap (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks) (W : CliHooks) (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) Slots.lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0)) : CliSpqrExt W (Slots.trTrapExternsPlaced (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) := - ⟨⟨mmpl, gh, hG, hMs, hMc, hHmac, fun sym hne => by + ⟨⟨mmpl, gh, hG, hMs, hMc, hMv, hHmac, fun sym hne => by simp [Slots.trTrapExternsPlaced, Slots.lsRngFillSym, trapAt, hne]⟩⟩ instance instCliSpqrExtWithPanics (W : CliHooks) {ext : String → Option (State → State)} [CliSpqrExt W ext] : CliSpqrExt W (Rust.withPanics ext) where exists_ghost := by - obtain ⟨mmpl, gh, hG, hMs, hMc, hHmac, heq⟩ := CliSpqrExt.exists_ghost (W := W) (ext := ext) - refine ⟨mmpl, gh, hG, hMs, hMc, hHmac, fun sym hne => ?_⟩ + obtain ⟨mmpl, gh, hG, hMs, hMc, hMv, hHmac, heq⟩ := CliSpqrExt.exists_ghost (W := W) (ext := ext) + refine ⟨mmpl, gh, hG, hMs, hMc, hMv, hHmac, fun sym hne => ?_⟩ have h1 : Rust.withPanics ext sym = Rust.withPanics (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) sym := by simp only [Rust.withPanics, heq sym hne] @@ -669,7 +678,7 @@ private theorem cliSpqrExt_hookSat_of_ghost (W : CliHooks) Slots.lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0) → HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) sym spec) : HookSat ext sym spec := by - obtain ⟨mmpl, gh, hG, _, _, hHmac, heq⟩ := CliSpqrExt.exists_ghost (W := W) (ext := ext) + obtain ⟨mmpl, gh, hG, _, _, _, hHmac, heq⟩ := CliSpqrExt.exists_ghost (W := W) (ext := ext) exact RunGlue.hookSat_of_eq (heq sym hne) (hf mmpl gh hG hHmac) private theorem cliSpqrExt_eq_of_ghost (W : CliHooks) @@ -679,7 +688,7 @@ private theorem cliSpqrExt_eq_of_ghost (W : CliHooks) (hf : ∀ (mmpl : Obj.MultiPlacement) (gh : RunGlue.CliGhostHooks), RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W) sym = v) : ext sym = v := by - obtain ⟨mmpl, gh, _, _, _, _, heq⟩ := CliSpqrExt.exists_ghost (W := W) (ext := ext) + obtain ⟨mmpl, gh, _, _, _, _, _, heq⟩ := CliSpqrExt.exists_ghost (W := W) (ext := ext) exact (heq sym hne).trans (hf mmpl gh) theorem cliSpqrExt_shim_sat (W : CliHooks) @@ -750,10 +759,11 @@ theorem cliSpqrExt_memcpyRegionRO_sat (W : CliHooks) theorem cliSpqrExt_sessionMemmove_sat (W : CliHooks) (stk : Nat) {ext : String → Option (State → State)} [CliSpqrExt W ext] : - HookSat ext "memmove" (sessionMemmoveSpec stk) := - cliSpqrExt_hookSat_of_ghost W (by decide) fun mmpl gh _ _ => - Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (Slots.cliExternsPlaced_sessionMemmove_sat mmpl W stk) + HookSat ext "memmove" (sessionMemmoveSpec stk) := by + obtain ⟨mmpl, gh, _, _, _, hMv, _, heq⟩ := CliSpqrExt.exists_ghost (W := W) (ext := ext) + exact RunGlue.hookSat_of_eq (heq "memmove" (by decide)) + ⟨hookMemmove, RunGlue.cliGhostExterns_extra_some gh (cliExternsPlaced mmpl W) hMv, + CryptoVerification.LibsignalTripleRatchet.hookMemmove_trace_ok stk⟩ theorem cliSpqrExt_sessionMemsetRegion_sat (W : CliHooks) {ext : String → Option (State → State)} [CliSpqrExt W ext] : @@ -876,13 +886,13 @@ private theorem instHkdfPlacedHooks_cliExt (W : CliHooks) {H : String → Option (State → State)} [CliSpqrExt W H] : HkdfPlacedHooks W.C.F H where memset := by - obtain ⟨mmpl, gh, _, hMs, hMc, _, heq⟩ := CliSpqrExt.exists_ghost (W := W) (ext := H) + obtain ⟨mmpl, gh, _, hMs, hMc, _, _, heq⟩ := CliSpqrExt.exists_ghost (W := W) (ext := H) exact (heq _ (by decide)).trans (instHkdfPlacedHooks_cli mmpl gh W hMs hMc).memset memcpy := by - obtain ⟨mmpl, gh, _, hMs, hMc, _, heq⟩ := CliSpqrExt.exists_ghost (W := W) (ext := H) + obtain ⟨mmpl, gh, _, hMs, hMc, _, _, heq⟩ := CliSpqrExt.exists_ghost (W := W) (ext := H) exact (heq _ (by decide)).trans (instHkdfPlacedHooks_cli mmpl gh W hMs hMc).memcpy compress256 := by - obtain ⟨mmpl, gh, _, hMs, hMc, _, heq⟩ := CliSpqrExt.exists_ghost (W := W) (ext := H) + obtain ⟨mmpl, gh, _, hMs, hMc, _, _, heq⟩ := CliSpqrExt.exists_ghost (W := W) (ext := H) exact (heq _ (by decide)).trans (instHkdfPlacedHooks_cli mmpl gh W hMs hMc).compress256 theorem cliRecvCt2PlacedAllocExt [LibsignalPlacement] (W : CliHooks) @@ -1402,6 +1412,7 @@ theorem cliSpqrSendCoins_placed_ok [LibsignalPlacement] (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) Slots.lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0)) (hChainFromPb : subroutine_ok @@ -1431,8 +1442,8 @@ theorem cliSpqrSendCoins_placed_ok [LibsignalPlacement] (LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (spqrSendCoinsPlacedSpecT E2E.HooksE.A0 0#64 (E2E.pqxdhSpqrModel ⟨W.C, W.Q⟩))) := by have : CliSpqrExt W (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) := - cliSpqrExt_self mmpl gh W hG hMs hMc hHmac - exact spqrSendCoins_placed_seam_of_peer_contracts mmpl gh W hG hMs hMc hHmac + cliSpqrExt_self mmpl gh W hG hMs hMc hMv hHmac + exact spqrSendCoins_placed_seam_of_peer_contracts mmpl gh W hG hMs hMc hMv hHmac hChainFromPb (keys_ls_subroutine_ok_of_block_cro (i := 427) (j := 368) (CryptoVerification.SpqrV1.States.Leaves.subroutine_ok_withLsCodeRoLoaded_of_withLsCallInv @@ -1457,6 +1468,7 @@ theorem cliSpqrInitialState_placed_ok [LibsignalPlacement] (hG : Slots.CliGhostA0Hooks E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) Slots.lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F E2E.HooksE.A0)) (hInitInner : @@ -1476,7 +1488,7 @@ theorem cliSpqrInitialState_placed_ok [LibsignalPlacement] (LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (CryptoVerification.Cli.E2E.V1.spqrInitialStatePlacedInnerSpec E2E.HooksE.A0 W.C.F)) := by have : CliSpqrExt W (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W)) := - cliSpqrExt_self mmpl gh W hG hMs hMc hHmac + cliSpqrExt_self mmpl gh W hG hMs hMc hMv hHmac have := CryptoVerification.SpqrV1.Top.Placed.instIsLsBlockProg_327 (Rust.withPanics (RunGlue.cliGhostExterns gh (cliExternsPlaced mmpl W))) exact CryptoVerification.SpqrV1.Top.InitialState.initial_state_placed_ok_blockProgram_ext diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrSendCoinsPlacedInstBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrSendCoinsPlacedInstBudget.lean index 5f5129daf..16a207c80 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrSendCoinsPlacedInstBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrSendCoinsPlacedInstBudget.lean @@ -13,7 +13,9 @@ public import LibsignalBinary.Heap.Fine.SpecBudgetHelpersFine public import LibsignalBinary.Proofs.Cli.SpqrV1.Top.Send.StatesSendKeysUnsampledPlacedBudget public import LibsignalBinary.Proofs.Cli.SpqrV1.Top.Send.TopPlacedBudget public import LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhStepCoinsFillBridgePlacedBudget +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.Placed.SubsetA4cBudget +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.SpqrChainPlacedInstBudget public import LibsignalBinary.Proofs.SignalSession.Cli.SpqrChunkedMergePlacedInstBudget public import LibsignalBinary.Proofs.SignalSession.Cli.SpqrInitialStatePlacedInstBudget @@ -103,8 +105,8 @@ open CryptoVerification.SignalSession lsStringCloneSym) open CryptoVerification.SignalSession.Coins.Placed (instIsLsBlockProg_618) open CryptoVerification.SignalSession.Cli.RunGlue - (CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other hookSat_of_eq - withPanics_cliGhostExterns) + (CliGhostHooks cliExternsPlaced_row cliExtraGhostSyms cliGhostExterns cliGhostExterns_other + hookSat_of_eq withPanics_cliGhostExterns) open CryptoVerification.SignalSession.Cli.Slots (cliExternsPlaced_panic_add_overflow cliExternsPlaced_panic_assert_jj cliExternsPlaced_panic_assert_yy cliExternsPlaced_panic_bounds_check @@ -113,7 +115,7 @@ open CryptoVerification.SignalSession.Cli.Slots cliGhostExterns_panic_handle_error cliGhostExterns_sat_of_cliExternsPlaced formatInner_row_placed lsMlkemEncaps1SymCli lsMlkemFromSeedSymCli lsMlkemPk1SymCli lsMlkemPk2SymCli - lsMlkemValidatePkSymCli memmove_row_placed + lsMlkemValidatePkSymCli mlkemDecaps_row_placed mlkemEncaps1_row_placed mlkemEncaps2_row_placed mlkemFromSeed_row_placed mlkemPk1_row_placed mlkemPk2_row_placed mlkemValidatePk_row_placed) open CryptoVerification.SpqrV1.Alloc @@ -178,6 +180,7 @@ open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhStep433PlacedBudgetAux (coinsFillBudgetSpecPlaced) open LibsignalBinary.Proofs.Cli.TripleRatchet.Decrypt.DhStepCoinsFillBridgePlacedBudget (cliCoinsFillBudgetPlaced_ok) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open LibsignalBinary.Proofs.Placed.SubsetA4cBudget (statesPlacedSeams_of_hooks) open LibsignalBinary.Proofs.Placed.SubsetA4cBudgetSat (statesPlacedSeams_of_hooks_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget @@ -185,6 +188,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_noAllocShim_budget_sat cliExternsPlaced_realloc_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat cliExternsPlaced_shim_budget_sat) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (ExtraSpecOk) open LibsignalBinary.Proofs.SignalSession.Cli.SpqrChainPlacedInstBudget (cliChainFromVn_placed_ok cliDeallocBudget_at_block cliExternsPlaced_sessionMemmoveAcp_sat cliSpqrSend_chainFromPb_ok cliSpqrSend_chainFromVn_ok cliSpqrSend_chainIntoPb_ok @@ -206,7 +210,7 @@ open LibsignalBinary.Proofs.SpqrV1.Alloc.DoReserveBudget open LibsignalBinary.Proofs.SpqrV1.Alloc.VecDequeGrowBudgetAux (finishGrow8NeCellsAcpSpecG finishGrow8ZeroCellsAcpSpecG finish_grow_8_ne_cells_acp_placed_ok_of_hooks finish_grow_8_zero_cells_acp_placed_ok_of_hooks - sessionMemmoveAcpSpec) + sessionMemmoveAcpSpec sessionMemmoveBoundedAcpSpec) open LibsignalBinary.Proofs.SpqrV1.Auth.MacHdrBudget (authMacHdrPinned_placed_ok authMacHdrSpec authMacHdr_placed_ok) open LibsignalBinary.Proofs.SpqrV1.Auth.UpdateBudget (authUpdateSpec) @@ -279,9 +283,11 @@ private theorem r1sc_cliGhostExterns_eq_of_base (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) (h9 : sym ≠ lsMemsetSym := by decide) - (h10 : sym ≠ lsMemcpySym := by decide) : + (h10 : sym ≠ lsMemcpySym := by decide) + (hExtra : cliExtraGhostSyms.contains sym = false ∨ gh.extra.lookup sym = none := + by left; decide) : cliGhostExterns gh (cliExternsPlaced mmpl W) sym = v := - (cliGhostExterns_other gh (cliExternsPlaced mmpl W) h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans h + (cliGhostExterns_other gh (cliExternsPlaced mmpl W) h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 hExtra).trans h private theorem r1sc_hExt_id (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : @@ -328,13 +334,16 @@ theorem cliSpqrSend_coinsFill_ok_cli [LibsignalPlacement] spqrCoinsFillSpecPlaced_eq_coinsFillBudgetSpecPlaced] exact cliCoinsFillBudgetPlaced_ok mmpl gh W hA spqrSendCalleeStack (by decide) (by decide) -theorem cliExternsPlaced_sessionMemmove_allocVm_sat - (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : +theorem cliExternsPlaced_sessionMemmove_allocVm_sat [LibsignalPlacement] + (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) + (hOk : ExtraSpecOk gh) : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec 0)) := by - refine HookSat.mono (cliExternsPlaced_sessionMemmoveAcp_sat mmpl gh W 0) fun x R s0 hpre => + (withAllocVmPreserved (sessionMemmoveBoundedSpec 0)) := by + refine HookSat.mono (cliExternsPlaced_sessionMemmoveAcp_sat mmpl gh W hOk 0) fun x R s0 hpre => ⟨x, R, hpre, fun sf hpost => ?_⟩ - dsimp only [sessionMemmoveAcpSpec, withAllocVmPreserved, sessionMemmoveSpec] at hpost ⊢ + rcases x with ⟨base, buf, dst, src, len⟩ + dsimp only [sessionMemmoveBoundedAcpSpec, sessionMemmoveAcpSpec, withAllocVmPreserved, + sessionMemmoveBoundedSpec, sessionMemmoveSpec] at hpost ⊢ rw [sepConj_assoc, satisfies_pure_sepConj] at hpost rcases hpost with ⟨⟨hx0, hacp, hvm⟩, hm⟩ rw [sepConj_assoc, satisfies_pure_sepConj] @@ -504,7 +513,7 @@ theorem cliStatesPlacedSeamsExt [LibsignalPlacement] exact statesPlacedSeams_of_hooks_sat (cliRecvCt2PlacedAllocExt mmpl gh W hA hExt) (hookSat_of_eq (r1sc_hExt_withPanics mmpl gh W hExt _ (by decide)) - (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W)) + (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W hA.extraOk)) hmemset_wp (hookSat_of_eq (r1sc_hExt_withPanics mmpl gh W hExt _ (by decide)) (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrSendCoinsPlacedInstBudgetSat.lean b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrSendCoinsPlacedInstBudgetSat.lean index 05b61cea6..fff49e0dd 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrSendCoinsPlacedInstBudgetSat.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrSendCoinsPlacedInstBudgetSat.lean @@ -69,8 +69,8 @@ open CryptoVerification.SignalSession lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli lsStringCloneSym) open CryptoVerification.SignalSession.Cli.RunGlue - (CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_other hookSat_of_eq - withPanics_cliGhostExterns) + (CliGhostHooks cliExternsPlaced_row cliExtraGhostSyms cliGhostExterns cliGhostExterns_other + hookSat_of_eq withPanics_cliGhostExterns) open CryptoVerification.SignalSession.Cli.Slots (cliExternsPlaced_panic_add_overflow cliExternsPlaced_panic_assert_jj cliExternsPlaced_panic_panic cliExternsPlaced_panic_result_unwrap_failed @@ -190,9 +190,11 @@ private theorem r1sc_cliGhostExterns_eq_of_base (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) (h9 : sym ≠ lsMemsetSym := by decide) - (h10 : sym ≠ lsMemcpySym := by decide) : + (h10 : sym ≠ lsMemcpySym := by decide) + (hExtra : cliExtraGhostSyms.contains sym = false ∨ gh.extra.lookup sym = none := by + left; decide) : cliGhostExterns gh (cliExternsPlaced mmpl W) sym = v := - (cliGhostExterns_other gh (cliExternsPlaced mmpl W) h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans h + (cliGhostExterns_other gh (cliExternsPlaced mmpl W) h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 hExtra).trans h private theorem r1sc_hExt_id (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : @@ -298,7 +300,7 @@ theorem cliStatesPlacedSeamsExt_sat [LibsignalPlacement] exact statesPlacedSeams_of_hooks_sat (cliRecvCt2PlacedAllocExt mmpl gh W hA hExt) (hookSat_of_eq (hExtWP _ (by decide)) - (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W)) + (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W hA.extraOk)) (hookSat_sessionMemsetRegionBudget_of_allocVm hAllocVm.memset) (hookSat_of_eq (hExtWP _ (by decide)) (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrStatesFromPbGateU2Bridge.lean b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrStatesFromPbGateU2Bridge.lean index a477d2594..e70fed555 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrStatesFromPbGateU2Bridge.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrStatesFromPbGateU2Bridge.lean @@ -78,7 +78,7 @@ open CryptoVerification.LibsignalSpqrV1 (Bytes Message MlKem PqRatchetState States V1State spqrAuthApi spqrDecodeState spqrHkdfWith spqrPolyApi spqrV1 spqrV1Recv) open CryptoVerification.LibsignalTripleRatchet - (LibsignalCodeRoLoaded SendCall VecArg sessionMemmoveSpec spqrRecvStack withLsCodeRoLoaded) + (LibsignalCodeRoLoaded SendCall VecArg spqrRecvStack withLsCodeRoLoaded) open CryptoVerification.LibsignalTripleRatchet.FromRecordCallees (lsLogOff) open CryptoVerification.SignalSession (CliHooks cliExternsPlaced) open CryptoVerification.SignalSession.Cli.RunGlue @@ -351,7 +351,7 @@ theorem gu2b_statesFromPb_placed_okX_exact_cliExt [LibsignalPlacement] e2b_states_from_pb_ok_x_placed_exact (gu2b_fromPbAllocHooksBudget_cliExt mmpl gh W hA hExt) (hookSat_of_eq (gu2b_hExt_withPanics mmpl gh W hExt _ (by decide)) - (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W)) + (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W hA.extraOk)) /-- Relocatable `Block 333` `StatesFromPbPlacedOkXOfEnv` producer at domain-split `e2b_StatesFromPbGuardedTightEnv`. -/ @@ -366,7 +366,7 @@ theorem gu2b_statesFromPb_placed_okX_guardedTight_cliExt [LibsignalPlacement] e2b_states_from_pb_ok_x_placed_guardedTight (gu2b_fromPbAllocHooksBudget_cliExt mmpl gh W hA hExt) (hookSat_of_eq (gu2b_hExt_withPanics mmpl gh W hExt _ (by decide)) - (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W)) + (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W hA.extraOk)) /-- Relocatable `Block 333` `StatesFromPbPlacedOkXOfEnv` producer at implication-guarded `e2b_StatesFromPbImpTightEnv`. -/ @@ -381,7 +381,7 @@ theorem gu2b_statesFromPb_placed_okX_impTight_cliExt [LibsignalPlacement] e2b_states_from_pb_ok_x_placed_impTight (gu2b_fromPbAllocHooksBudget_cliExt mmpl gh W hA hExt) (hookSat_of_eq (gu2b_hExt_withPanics mmpl gh W hExt _ (by decide)) - (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W)) + (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W hA.extraOk)) /-- Envelope-monotonic lift of `StatesFromPbPlacedOkXOfEnv` along any pointwise inclusion `∀ pb evs, Env₁ pb evs → Env₂ pb evs`. -/ diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrStatesIntoPbPlacedInst.lean b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrStatesIntoPbPlacedInst.lean index b0f9c4f3a..66d0ee681 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrStatesIntoPbPlacedInst.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrStatesIntoPbPlacedInst.lean @@ -299,6 +299,7 @@ theorem cliStatesIntoPb_sendCoins_ok [LibsignalPlacement] (hG : CliGhostA0Hooks A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F A0)) : subroutine_ok @@ -308,7 +309,7 @@ theorem cliStatesIntoPb_sendCoins_ok [LibsignalPlacement] (withLsCodeRoLoaded lsmpl (CryptoVerification.Cli.SpqrV1.Top.Send.statesIntoPbPlacedSpecX A0 W.C.F)) := by have : CliSpqrExt W (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - cliSpqrExt_self mmpl gh W hG hMs hMc hHmac + cliSpqrExt_self mmpl gh W hG hMs hMc hMv hHmac exact cliStatesIntoPb_334_cro_ok_x W (ext := cliGhostExterns gh (cliExternsPlaced mmpl W)) /-- Block `427` (`cliSpqrSendCoins_placed_ok`) with `hStatesIntoPb` discharged directly by @@ -318,6 +319,7 @@ theorem cliSpqrSendCoins_with_statesIntoPb [LibsignalPlacement] (hG : CliGhostA0Hooks A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F A0)) (hChainFromPb : subroutine_ok @@ -345,8 +347,8 @@ theorem cliSpqrSendCoins_with_statesIntoPb [LibsignalPlacement] (CryptoVerification.LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (spqrSendCoinsPlacedSpecT A0 0#64 (CryptoVerification.E2E.pqxdhSpqrModel ⟨W.C, W.Q⟩))) := - cliSpqrSendCoins_placed_ok mmpl gh W hG hMs hMc hHmac hChainFromPb hChainIntoPb hDecodeState - (cliStatesIntoPb_sendCoins_ok mmpl gh W hG hMs hMc hHmac) + cliSpqrSendCoins_placed_ok mmpl gh W hG hMs hMc hMv hHmac hChainFromPb hChainIntoPb hDecodeState + (cliStatesIntoPb_sendCoins_ok mmpl gh W hG hMs hMc hMv hHmac) /-- `spqr: :recv` (`Block 329`) caller form: exact `statesIntoPb_ok` field type of `SpqrRecvPlacedContracts`, generic in `[CliSpqrExt W ext]`. -/ @@ -367,6 +369,7 @@ theorem cliStatesIntoPb_recv_trTrap_ok [LibsignalPlacement] (hG : CliGhostA0Hooks A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F A0)) : subroutine_ok @@ -375,7 +378,7 @@ theorem cliStatesIntoPb_recv_trTrap_ok [LibsignalPlacement] (withLsCodeRoLoaded lsmpl (CryptoVerification.SpqrV1.Top.Recv.statesIntoPbPlacedSpecX A0 W.C.F)) := by have : CliSpqrExt W (trTrapExternsPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) := - cliSpqrExt_trTrap mmpl gh W hG hMs hMc hHmac + cliSpqrExt_trTrap mmpl gh W hG hMs hMc hMv hHmac exact cliStatesIntoPb_recv_ok W (ext := trTrapExternsPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrV1PlacedSeamsInst.lean b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrV1PlacedSeamsInst.lean index 7ead3a40a..fd82ff71f 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/SpqrV1PlacedSeamsInst.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/SpqrV1PlacedSeamsInst.lean @@ -150,6 +150,7 @@ theorem cliSpqrDecodeState_sendCoins_ok_closed [LibsignalPlacement] (hG : CliGhostA0Hooks CryptoVerification.E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F CryptoVerification.E2E.HooksE.A0)) : subroutine_ok @@ -160,8 +161,8 @@ theorem cliSpqrDecodeState_sendCoins_ok_closed [LibsignalPlacement] (CryptoVerification.SpqrV1.Top.DecodeState.decodeStatePlacedSpecX CryptoVerification.SpqrV1.Top.DecodeState.canonicalV1InnerHeap CryptoVerification.E2E.HooksE.A0)) := by have : CliSpqrExt W (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - cliSpqrExt_self mmpl gh W hG hMs hMc hHmac - exact cliSpqrDecodeState_sendCoins_ok mmpl gh W hG hMs hMc hHmac + cliSpqrExt_self mmpl gh W hG hMs hMc hMv hHmac + exact cliSpqrDecodeState_sendCoins_ok mmpl gh W hG hMs hMc hMv hHmac (cliDrop_267_cl W) (cliDrop_270_cl W) (cliDrop_281_cl W) (cliDrop_282_cl W) (cliDecodeErrorPush_blockProgram_cl W) (cliDecodeErrorFrom_blockProgram_cl W) @@ -229,6 +230,7 @@ theorem cliSpqrDecodeState_recv_trTrap_ok_closed [LibsignalPlacement] (hG : CliGhostA0Hooks CryptoVerification.E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F CryptoVerification.E2E.HooksE.A0)) : subroutine_ok @@ -238,8 +240,8 @@ theorem cliSpqrDecodeState_recv_trTrap_ok_closed [LibsignalPlacement] (decodeStatePlacedSpecX CryptoVerification.SpqrV1.Top.DecodeState.canonicalV1InnerHeap CryptoVerification.E2E.HooksE.A0)) := by have : CliSpqrExt W (trTrapExternsPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) := - cliSpqrExt_trTrap mmpl gh W hG hMs hMc hHmac - exact cliSpqrDecodeState_recv_trTrap_ok mmpl gh W hG hMs hMc hHmac + cliSpqrExt_trTrap mmpl gh W hG hMs hMc hMv hHmac + exact cliSpqrDecodeState_recv_trTrap_ok mmpl gh W hG hMs hMc hMv hHmac (cliDrop_267_cl W) (cliDrop_270_cl W) (cliDrop_281_cl W) (cliDrop_282_cl W) (cliDecodeErrorPush_blockProgram_cl W) (cliDecodeErrorFrom_blockProgram_cl W) @@ -309,6 +311,7 @@ theorem cliSpqrSendCoins_placed_ok_closed [LibsignalPlacement] (hG : CliGhostA0Hooks CryptoVerification.E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F CryptoVerification.E2E.HooksE.A0)) : subroutine_ok @@ -318,11 +321,11 @@ theorem cliSpqrSendCoins_placed_ok_closed [LibsignalPlacement] (lsmpl.base 427) (CryptoVerification.LibsignalPublicApi.StoreKit.withLsCodeRoLoaded lsmpl (spqrSendCoinsPlacedSpecT CryptoVerification.E2E.HooksE.A0 0#64 (CryptoVerification.E2E.pqxdhSpqrModel ⟨W.C, W.Q⟩))) := - cliSpqrSendCoins_placed_ok mmpl gh W hG hMs hMc hHmac - (cliSpqrSend_chainFromPb_ok mmpl gh W hG hMs hMc hHmac) - (cliSpqrSend_chainIntoPb_ok mmpl gh W hG hMs hMc hHmac) - (cliSpqrDecodeState_sendCoins_ok_closed mmpl gh W hG hMs hMc hHmac) - (cliStatesIntoPb_sendCoins_ok mmpl gh W hG hMs hMc hHmac) + cliSpqrSendCoins_placed_ok mmpl gh W hG hMs hMc hMv hHmac + (cliSpqrSend_chainFromPb_ok mmpl gh W hG hMs hMc hMv hHmac) + (cliSpqrSend_chainIntoPb_ok mmpl gh W hG hMs hMc hMv hHmac) + (cliSpqrDecodeState_sendCoins_ok_closed mmpl gh W hG hMs hMc hMv hHmac) + (cliStatesIntoPb_sendCoins_ok mmpl gh W hG hMs hMc hMv hHmac) /-! ### 4. Closed `SpqrRecvPlacedContracts` & `spqr::recv` (`Block 329`) -/ @@ -378,6 +381,7 @@ theorem cliSpqrRecvPlacedContracts [LibsignalPlacement] (hG : CliGhostA0Hooks CryptoVerification.E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F CryptoVerification.E2E.HooksE.A0)) : SpqrRecvPlacedContracts @@ -385,7 +389,7 @@ theorem cliSpqrRecvPlacedContracts [LibsignalPlacement] CryptoVerification.E2E.HooksE.A0 W.C.F W.Q.K (trTrapExternsPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) := by let extTrap := trTrapExternsPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W)) - have : CliSpqrExt W extTrap := cliSpqrExt_trTrap mmpl gh W hG hMs hMc hHmac + have : CliSpqrExt W extTrap := cliSpqrExt_trTrap mmpl gh W hG hMs hMc hMv hHmac exact { dealloc_ok := cliDealloc_at_block W (i := 329) memcpy_ok := cliFramelessMemcpy_at_block W (i := 329) @@ -401,7 +405,7 @@ theorem cliSpqrRecvPlacedContracts [LibsignalPlacement] lift_blockProgram_cl_to_recv (j := 270) (hcallee := cliDrop_270_cl W) dropStates_ok := lift_blockProgram_cl_to_recv (j := 273) (hcallee := cliDrop_273_cl W) - decodeState_ok := cliSpqrDecodeState_recv_trTrap_ok_closed mmpl gh W hG hMs hMc hHmac + decodeState_ok := cliSpqrDecodeState_recv_trTrap_ok_closed mmpl gh W hG hMs hMc hMv hHmac initInner_ok := by have h0 := cliInitInner_callInv_placed_ok W (ext := extTrap) conv at h0 => arg 2; rw [ls_blockPlacement_base (i := 324)] @@ -414,8 +418,8 @@ theorem cliSpqrRecvPlacedContracts [LibsignalPlacement] initInnerPlacedSpecX] at hpre ⊢ exact hpre) (fun _ _ _ _ hpost => hpost) - chainFrom_ok := cliSpqrRecv_chainFrom_ok_trTrap mmpl gh W hG hMs hMc hHmac - chainFromPb_ok := cliSpqrRecv_chainFromPb_ok_trTrap mmpl gh W hG hMs hMc hHmac + chainFrom_ok := cliSpqrRecv_chainFrom_ok_trTrap mmpl gh W hG hMs hMc hMv hHmac + chainFromPb_ok := cliSpqrRecv_chainFromPb_ok_trTrap mmpl gh W hG hMs hMc hMv hHmac chainNew_ok := by have h0 := cliChainNew_placed_ok W (H := Rust.withPanics extTrap) conv at h0 => arg 2; rw [ls_blockPlacement_base (i := 363)] @@ -434,7 +438,7 @@ theorem cliSpqrRecvPlacedContracts [LibsignalPlacement] exact ls_subroutine_ok_cro_of_callInv (callerProg := spqrRecvPlacedProg extTrap) (i := 329) (j := 366) h0 - chainIntoPb_ok := cliSpqrRecv_chainIntoPb_ok_trTrap mmpl gh W hG hMs hMc hHmac + chainIntoPb_ok := cliSpqrRecv_chainIntoPb_ok_trTrap mmpl gh W hG hMs hMc hMv hHmac messageDeserialize_ok := by let _ := instIsLsBlockProg_351 (Rust.withPanics extTrap) have h0 := cliMessageDeserialize_placed_ok W (ext := extTrap) @@ -446,7 +450,7 @@ theorem cliSpqrRecvPlacedContracts [LibsignalPlacement] (cliStatesPlacedSeamsExt W (ext := extTrap)).statesFromPb_on statesRecv_ok := (cliStatesPlacedSeamsExt W (ext := extTrap)).statesRecv_on - statesIntoPb_ok := cliStatesIntoPb_recv_trTrap_ok mmpl gh W hG hMs hMc hHmac + statesIntoPb_ok := cliStatesIntoPb_recv_trTrap_ok mmpl gh W hG hMs hMc hMv hHmac encodeToVec_ok := by have h0 := cliEncodeToVec_placed_ok W (ext := extTrap) dsimp only [CryptoVerification.SpqrV1.Prost.EncodeToVec.PqRatchetStateEncodeToVecPlacedOkExt] at h0 @@ -473,6 +477,7 @@ theorem cliSpqrRecv_placed_ok_closed [LibsignalPlacement] (hG : CliGhostA0Hooks CryptoVerification.E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F CryptoVerification.E2E.HooksE.A0)) : subroutine_ok @@ -483,7 +488,7 @@ theorem cliSpqrRecv_placed_ok_closed [LibsignalPlacement] (spqrRecvPlacedInnerSpecXT CryptoVerification.E2E.HooksE.A0 (spqrV1Recv W.C.F W.Q.K))) := by have hok := spqr_recv_placed_ok_blockProgram_ext_of_contracts (trTrapExternsPlaced_isPanic mmpl gh W) - (cliSpqrRecvPlacedContracts mmpl gh W hG hMs hMc hHmac) + (cliSpqrRecvPlacedContracts mmpl gh W hG hMs hMc hMv hHmac) have heq_cro (m : Memory) : CryptoVerification.LibsignalPublicApi.StoreKit.LibsignalCodeRoLoaded lsmpl m = LibsignalCodeRoLoaded lsmpl m := @@ -514,11 +519,12 @@ theorem spqrV1PlacedSeams_ok [LibsignalPlacement] (hG : CliGhostA0Hooks CryptoVerification.E2E.HooksE.A0 gh) (hMs : gh.memset = some memsetHook) (hMc : gh.memcpy = some memcpyHook) + (hMv : gh.extra.lookup "memmove" = some hookMemmove) (hHmac : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsLibcruxHmacSymCli (libcruxHmacSpec W.C.F CryptoVerification.E2E.HooksE.A0)) : SpqrV1PlacedSeams mmpl gh W := - { spqrInitialState := cliSpqrInitialState_placed_ok_closed mmpl gh W hG hMs hMc hHmac - spqrRecv := cliSpqrRecv_placed_ok_closed mmpl gh W hG hMs hMc hHmac - spqrSendCoins := cliSpqrSendCoins_placed_ok_closed mmpl gh W hG hMs hMc hHmac } + { spqrInitialState := cliSpqrInitialState_placed_ok_closed mmpl gh W hG hMs hMc hMv hHmac + spqrRecv := cliSpqrRecv_placed_ok_closed mmpl gh W hG hMs hMc hMv hHmac + spqrSendCoins := cliSpqrSendCoins_placed_ok_closed mmpl gh W hG hMs hMc hMv hHmac } end LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsInst diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/BranchesPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/BranchesPlaced.lean index e96f4466f..3ce149c5c 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/BranchesPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/BranchesPlaced.lean @@ -9,6 +9,7 @@ limitations under the License. module +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat public import LibsignalBinary.Proofs.SignalSession.Cli.CliSessionCodeSymA public import LibsignalBinary.Proofs.TripleRatchet.Alloc.AllocCodeSym public import LibsignalBinary.Proofs.SignalSession.Cli.Store.ShimCommonPlaced @@ -370,6 +371,47 @@ theorem ispoll_call_publicKeyEq_placed [LibsignalPlacement] {prog : Program} exact sepWPp_conseq (Entails.of_eq (by ac_rfl)) (hnext sm hpcm hrunm hspm hcsm hinvm hx0m htrm) +theorem ispoll_call_publicKeyEq16_placed [LibsignalPlacement] {prog : Program} + {callee ret_pc ret : BitVec 64} + (hcall : subroutine_ok prog callee + (StoreKit.withLsCodeRoLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)) + (p1 : BitVec 64) (pk1 : PublicKey) (p2 : BitVec 64) (pk2 : PublicKey) (F : SepProp) + {s0 s : State} {P : SepProp} {Q Qp : State → SepProp → Prop} + (hpc : s.pc = callee) (hrun : s.status = .Running) (hsp_align : s.spAligned = true) + (hlr : s.readReg64 Reg.lr = ret_pc) (htr : s.trace = s0.trace) + (hinv : StoreKit.LibsignalCodeRoLoaded lsmpl s.mem) + (hx0 : s.readReg64 .x0 = p1) (hx1 : s.readReg64 .x1 = p2) + (hpan : ∀ sf P_f, (allocFailedIn s0 sf ∧ s0.trace <+: sf.trace) → Qp sf P_f) + (hpre : P ⊢ ((p1 ↦ₛ pk1.bytes.toList) ∗ (p2 ↦ₛ pk2.bytes.toList) ∗ stackAt s.sp 80) ∗ F) + (hnext : ∀ sm : State, + sm.pc = ret_pc → sm.status = .Running → + sm.sp = s.sp → CalleeSavedPreserved s sm → StoreKit.LibsignalCodeRoLoaded lsmpl sm.mem → + sm.readReg64 .x0 = (if pk1 == pk2 then 1#64 else 0#64) → sm.trace = s.trace → + SepWPp prog ret sm + (((p1 ↦ₛ pk1.bytes.toList) ∗ (p2 ↦ₛ pk2.bytes.toList) ∗ stackAt s.sp 80) ∗ F) Q Qp) : + SepWPp prog ret s P Q Qp := by + refine ispoll_call_panicking_raw_placed hcall (p1, pk1, p2, pk2, s.sp) F + hpc hrun hsp_align hlr htr hinv hpan ?_ ?_ ?_ ?_ ?_ + · refine Entails.trans hpre ?_ + dsimp only [LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16, + stackAt] + simp only [sepConj_assoc] + exact Entails.pure_right ⟨hx0, hx1, trivial⟩ (Entails.refl _) + · intro sm R' hpost + exact (not_satisfies_false_sepConj hpost).elim + · intro code sm R' hpost + exact not_satisfies_false_sepConj hpost + · intro sm R' hpost + exact not_satisfies_false_sepConj hpost + · intro sm hpcm hrunm hspm hcsm hinvm + dsimp only [LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16, + stackAt] + simp only [sepConj_assoc] + refine SepWPp.pure_elim fun ⟨hx0m, htrm⟩ => ?_ + exact sepWPp_conseq (Entails.of_eq (by dsimp only [stackAt]; ac_rfl)) + (hnext sm hpcm hrunm hspm hcsm hinvm hx0m htrm) + theorem ispoll_call_serialize_placed [LibsignalPlacement] {prog : Program} {A : RustAlloc} {callee ret_pc ret : BitVec 64} (hcall : subroutine_ok prog callee (StoreKit.withLsCodeRoLoaded lsmpl (publicKeySerializeSpecX A))) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/BranchesPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/BranchesPlacedBudget.lean index 1d5356f77..acebafef5 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/BranchesPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/BranchesPlacedBudget.lean @@ -437,6 +437,54 @@ theorem ispoll_call_publicKeyEq_placed [LibsignalPlacement] {prog : Program} {M exact sepWPp_conseq (Entails.of_eq (by sep_ac_rfl)) (hnext sm hpcm hrunm hspm hcsm hinvm hx0m htrm) +theorem ispoll_call_publicKeyEq16_placed [LibsignalPlacement] {prog : Program} {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} + {callee ret_pc ret : BitVec 64} + (hcall : subroutine_ok prog callee + (withLsCodeRoLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16))) + (p1 : BitVec 64) (pk1 : PublicKey) (p2 : BitVec 64) (pk2 : PublicKey) + (st : M.σ) (F : SepProp) + {s : State} {P : SepProp} {Q Qp : State → SepProp → Prop} + (hpc : s.pc = callee) (hrun : s.status = .Running) (hsp_align : s.spAligned = true) + (hlr : s.readReg64 Reg.lr = ret_pc) + (hinv : LibsignalCodeRoLoaded lsmpl s.mem) + (hx0 : s.readReg64 .x0 = p1) (hx1 : s.readReg64 .x1 = p2) + (hpre : P ⊢ ((p1 ↦ₛ pk1.bytes.toList) ∗ (p2 ↦ₛ pk2.bytes.toList) ∗ + A.pool lim st s ∗ stackAt s.sp 80) ∗ F) + (hnext : ∀ sm : State, + sm.pc = ret_pc → sm.status = .Running → + sm.sp = s.sp → CalleeSavedPreserved s sm → LibsignalCodeRoLoaded lsmpl sm.mem → + sm.readReg64 .x0 = (if pk1 == pk2 then 1#64 else 0#64) → sm.trace = s.trace → + SepWPp prog ret sm + (((p1 ↦ₛ pk1.bytes.toList) ∗ (p2 ↦ₛ pk2.bytes.toList) ∗ + A.pool lim st sm ∗ stackAt s.sp 80) ∗ F) Q Qp) : + SepWPp prog ret s P Q Qp := by + refine ispoll_call_total_raw_placed hcall (p1, pk1, p2, pk2, s.sp) (A.pool lim st s ∗ F) + hpc hrun hsp_align hlr hinv ?_ ?_ ?_ ?_ ?_ + · refine Entails.trans hpre ?_ + dsimp only [withVmPreserved, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16, + stackAt] + simp only [sepConj_assoc] + exact Entails.pure_right ⟨hx0, hx1, trivial⟩ (Entails.of_eq (by sep_ac_rfl)) + · intro sm R' hpost + exact not_satisfies_false_sepConj hpost + · intro code sm R' hpost + exact not_satisfies_false_sepConj hpost + · intro sm R' hpost + exact not_satisfies_false_sepConj hpost + · intro sm hpcm hrunm hspm hcsm hinvm + dsimp only [withVmPreserved, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16, + stackAt] + simp only [sepConj_assoc] + refine SepWPp.pure_elim fun hvm => SepWPp.pure_elim fun ⟨hx0m, htrm⟩ => ?_ + rw [← A.pool_transport lim st s sm hvm] + exact sepWPp_conseq (Entails.of_eq (by dsimp only [stackAt]; sep_ac_rfl)) + (hnext sm hpcm hrunm hspm hcsm hinvm hx0m htrm) + theorem ispoll_call_serialize_placed [LibsignalPlacement] {prog : Program} {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {callee ret_pc ret : BitVec 64} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/BranchesPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/BranchesPlacedBudgetFd.lean index 6ef39f077..a6411147b 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/BranchesPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/BranchesPlacedBudgetFd.lean @@ -432,6 +432,65 @@ theorem ispoll_call_publicKeyEq_placed_fd [LibsignalPlacement] {prog : Program} exact sepWPp_conseq (Entails.of_eq (by sep_ac_rfl)) (hnext sm hpcm hrunm hspm hcsm hinvm hfdsm hx0m htrm) +theorem ispoll_call_publicKeyEq16_placed_fd [LibsignalPlacement] {prog : Program} + {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} + {callee ret_pc ret : BitVec 64} + (hcall : subroutine_ok prog callee + (withLsCodeRoLoaded lsmpl + (withFdsGe3Closed + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)))) + (p1 : BitVec 64) (pk1 : PublicKey) (p2 : BitVec 64) (pk2 : PublicKey) + (st : M.σ) (F : SepProp) + {s : State} {P : SepProp} {Q Qp : State → SepProp → Prop} + (hpc : s.pc = callee) (hrun : s.status = .Running) (hsp_align : s.spAligned = true) + (hlr : s.readReg64 Reg.lr = ret_pc) + (hinv : LibsignalCodeRoLoaded lsmpl s.mem) + (hfds : FdsGe3Closed s.fs) + (hx0 : s.readReg64 .x0 = p1) (hx1 : s.readReg64 .x1 = p2) + (hpre : P ⊢ ((p1 ↦ₛ pk1.bytes.toList) ∗ (p2 ↦ₛ pk2.bytes.toList) ∗ + A.pool lim st s ∗ stackAt s.sp 80) ∗ F) + (hnext : ∀ sm : State, + sm.pc = ret_pc → sm.status = .Running → + sm.sp = s.sp → CalleeSavedPreserved s sm → LibsignalCodeRoLoaded lsmpl sm.mem → + FdsGe3Closed sm.fs → + sm.readReg64 .x0 = (if pk1 == pk2 then 1#64 else 0#64) → sm.trace = s.trace → + SepWPp prog ret sm + (((p1 ↦ₛ pk1.bytes.toList) ∗ (p2 ↦ₛ pk2.bytes.toList) ∗ + A.pool lim st sm ∗ stackAt s.sp 80) ∗ F) Q Qp) : + SepWPp prog ret s P Q Qp := by + refine ispoll_call_total_raw_placed hcall (p1, pk1, p2, pk2, s.sp) (A.pool lim st s ∗ F) + hpc hrun hsp_align hlr hinv ?_ ?_ ?_ ?_ ?_ + · refine Entails.trans hpre ?_ + dsimp only [withFdsGe3Closed, withVmPreserved, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16, + stackAt] + simp only [sepConj_assoc] + exact Entails.pure_right hfds + (Entails.pure_right ⟨hx0, hx1, trivial⟩ (Entails.of_eq (by sep_ac_rfl))) + · intro sm R' hpost + dsimp only [withFdsGe3Closed, withVmPreserved, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hpost + exact not_satisfies_false_sepConj hpost + · intro code sm R' hpost + dsimp only [withFdsGe3Closed, withVmPreserved, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hpost + exact not_satisfies_false_sepConj hpost + · intro sm R' hpost + dsimp only [withFdsGe3Closed, withVmPreserved, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hpost + exact not_satisfies_false_sepConj hpost + · intro sm hpcm hrunm hspm hcsm hinvm + dsimp only [withFdsGe3Closed, withVmPreserved, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16, + stackAt] + simp only [sepConj_assoc] + refine SepWPp.pure_elim fun hfdsm => + SepWPp.pure_elim fun hvm => SepWPp.pure_elim fun ⟨hx0m, htrm⟩ => ?_ + rw [← A.pool_transport lim st s sm hvm] + exact sepWPp_conseq (Entails.of_eq (by dsimp only [stackAt]; sep_ac_rfl)) + (hnext sm hpcm hrunm hspm hcsm hinvm hfdsm hx0m htrm) + theorem ispoll_call_serialize_placed_fd [LibsignalPlacement] {prog : Program} {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {callee ret_pc ret : BitVec 64} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/Layout.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/Layout.lean index ec9b37440..77e21ec68 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/Layout.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/Layout.lean @@ -53,6 +53,9 @@ theorem decStk_le_saveSubMax (getStk putStk : Nat) : 0x60 ≤ saveSubMax getStk theorem eqStk_le_saveSubMax (getStk putStk : Nat) : 64 ≤ saveSubMax getStk putStk := by unfold saveSubMax; omega +theorem eqStk16_le_saveSubMax (getStk putStk : Nat) : 80 ≤ saveSubMax getStk putStk := by + unfold saveSubMax; omega + theorem serStk_le_saveSubMax (getStk putStk : Nat) : publicKeySerializeStackX ≤ saveSubMax getStk putStk := by unfold saveSubMax; omega diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/SymPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/SymPlaced.lean index 4ba9ac43d..a681e54e3 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/SymPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/SymPlaced.lean @@ -226,6 +226,23 @@ private theorem abstract_state_p {prog : Program} {ret : BitVec 64} {s : State} SepWPp prog ret s P Q Qp := k s rfl +private theorem publicKeyEqMem16_lscro_of_publicKeyEq [LibsignalPlacement] {prog : Program} + {callee : BitVec 64} + (hEq : subroutine_ok prog callee (StoreKit.withLsCodeRoLoaded lsmpl Getters.publicKeyEqSpec)) : + subroutine_ok prog callee + (StoreKit.withLsCodeRoLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16) := by + refine subroutine_ok_refine_frame hEq fun ⟨p1, pk1, p2, pk2, sp⟩ R s0 hp => + ⟨(p1, pk1, p2, pk2, sp), stackAt (sp - 64#64) 16, ?_, fun sf hq => ?_⟩ + · dsimp only [StoreKit.withLsCodeRoLoaded, Getters.publicKeyEqSpec, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hp ⊢ + rw [LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.memRegion_80_eq_publicKeyEqFrame_16 sp] at hp + exact Satisfies.mono (Entails.of_eq (by simp only [sepConj_assoc]; rw [sepConj_left_comm (stackAt (sp - 64#64) 16)])) hp + · dsimp only [StoreKit.withLsCodeRoLoaded, Getters.publicKeyEqSpec, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hq ⊢ + rw [LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.memRegion_80_eq_publicKeyEqFrame_16 sp] + exact Satisfies.mono (Entails.of_eq (by simp only [sepConj_assoc])) hq + private theorem ispoll_branch_ok_some_220_placed [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} @@ -234,7 +251,8 @@ private theorem ispoll_branch_ok_some_220_placed [LibsignalPlacement] {A : RustA (hPut : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 543) (dirPutStrSpecPlaced A putStk)) (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) - (StoreKit.withLsCodeRoLoaded lsmpl Getters.publicKeyEqSpec)) + (StoreKit.withLsCodeRoLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)) (hstk : saveMinStk getStk putStk ≤ stk) (hhi : stk ≤ 2 ^ 64) {s0 s : State} (x : IdPollGhost) (k : IdentityKey) @@ -331,9 +349,9 @@ private theorem ispoll_branch_ok_some_220_placed [LibsignalPlacement] {A : RustA ispoll_rw_pre hrew_pk conv => arg 4 - rw [stackAt_sub_split (s0.sp - 0xd0#64) (eqStk_le_saveSubMax getStk putStk) hsub_hi] + rw [stackAt_sub_split (s0.sp - 0xd0#64) (eqStk16_le_saveSubMax getStk putStk) hsub_hi] simp only [sepConj_assoc] - refine ispoll_call_publicKeyEq_placed (ret_pc := (blkPl_565).base + offAfterEq) + refine ispoll_call_publicKeyEq16_placed (ret_pc := (blkPl_565).base + offAfterEq) hEq (s0.sp - 0x90#64) k.publicKey x.call.call.keyA x.call.call.key.publicKey ?ispollF3 (by wp_norm_goal) (by wp_norm_lhs) (by wp_norm_lhs) (by wp_norm_goal) (by wp_norm_goal) hinv_eq @@ -349,7 +367,7 @@ private theorem ispoll_branch_ok_some_220_placed [LibsignalPlacement] {A : RustA simp only [State.spAligned] at hsp_align ⊢ rwa [hsp3, ← hsp] conv => arg 4; simp only [State.sp, wp_norm, arm64_norm, hsp, hsp3] - ispoll_rw_pre (stackAt_sub_split (s0.sp - 0xd0#64) (eqStk_le_saveSubMax getStk putStk) hsub_hi).symm + ispoll_rw_pre (stackAt_sub_split (s0.sp - 0xd0#64) (eqStk16_le_saveSubMax getStk putStk) hsub_hi).symm ispoll_fold_pre (slot90_bytes32_16_collapse s0.sp k.publicKey.bytes.toList_length) ispoll_fold_pre (s48_byte7_entails_memRegion16 s0.sp d5 b6 (s56w.extractLsb' 8 8) (s56w.extractLsb' 16 8) (s56w.extractLsb' 24 8) @@ -392,7 +410,7 @@ private theorem ispoll_branch_ok_some_220_placed [LibsignalPlacement] {A : RustA hx19_4 hx20_4 hx24_4 hx26_4 hx29_4 hc4 hnlen hclen hgr hans) exact Entails.of_eq (by unfold idSaveBoxAt; ispoll_ac_rfl) -theorem ispoll_branch_ok_some_placed [LibsignalPlacement] {A : RustAlloc} +theorem ispoll_branch_ok_some_placed_16 [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} (hC : AllocContractsXCliPlaced A H) @@ -403,7 +421,8 @@ theorem ispoll_branch_ok_some_placed [LibsignalPlacement] {A : RustAlloc} (hDec : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 18) (StoreKit.withLsCodeRoLoaded lsmpl (RecordCodecsBinary.identityKeyDecodeRawSpec A))) (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) - (StoreKit.withLsCodeRoLoaded lsmpl Getters.publicKeyEqSpec)) + (StoreKit.withLsCodeRoLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)) (hstk : saveMinStk getStk putStk ≤ stk) (hhi : stk ≤ 2 ^ 64) {s0 s : State} (x : IdPollGhost) (k : IdentityKey) {bs : List (BitVec 8)} @@ -561,6 +580,69 @@ theorem ispoll_branch_ok_some_placed [LibsignalPlacement] {A : RustAlloc} hnlen hclen hgr hans) exact Entails.of_eq (by ispoll_ac_rfl) +theorem ispoll_branch_ok_some_placed [LibsignalPlacement] {A : RustAlloc} + {H : LibsignalHooks} {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} + {getStk putStk stk : Nat} + (hC : AllocContractsXCliPlaced A H) + (hSer : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 205) + (StoreKit.withLsCodeRoLoaded lsmpl (publicKeySerializeSpecX A))) + (hPut : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 543) + (dirPutStrSpecPlaced A putStk)) + (hDec : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 18) + (StoreKit.withLsCodeRoLoaded lsmpl (RecordCodecsBinary.identityKeyDecodeRawSpec A))) + (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) + (StoreKit.withLsCodeRoLoaded lsmpl Getters.publicKeyEqSpec)) + (hstk : saveMinStk getStk putStk ≤ stk) + (hhi : stk ≤ 2 ^ 64) + {s0 s : State} (x : IdPollGhost) (k : IdentityKey) {bs : List (BitVec 8)} + (c1 c2 c3 c4 c5 c6 c7 c15 : BitVec 8) + (s16 : BitVec 64) (s24 : BitVec 8) (s32 : BitVec 64) (s40 : BitVec 8) + (s48 s56w : BitVec 64) + (hpc : s.pc = (blkPl_565).base + offAfterGet) + (hrun : s.status = .Running) + (hsp : s.sp = s0.sp - 0xd0#64) + (hsp_align : s.spAligned = true) + (hvregs : calleeSavedVRegs s = calleeSavedVRegs s0) + (htr : s.trace = s0.trace) + (hinv : StoreKit.LibsignalCodeRoLoaded lsmpl s.mem) + (hx19 : s.readReg64 .x19 = x.call.fut) + (hx20 : s.readReg64 .x20 = x.call.out) + (hx24 : s.readReg64 .x24 = x.self) + (hx29 : s.readReg64 .x29 = s0.sp - 0x60#64) + (hnlen : x.call.call.addr.name.bytes.length < 2 ^ 32) + (hclen : x.peers.changed.length < 2 ^ 32) + (hser : k.serialize = bs) + (hgr : Except.ok bs = x.peers.get rd s0.fs.files x.call.call.addr.val.name) : + SepWPp ((blkPC_565).rebase (blkPl_565).base H) (s0.readReg64 .lr) s + (getResultAt A (s0.sp - 0x90#64) (.ok bs) ∗ + dirAt A (x.self + 0x28#64) x.peers ∗ + memRegion x.call.out 48 ∗ + idSaveBoxAt x.call.fut x.self x.call.call.addrA x.call.call.keyA 0#8 ∗ + protocolAddressAt A x.call.call.addr x.call.call.addrA ∗ + (x.call.call.keyA ↦ₛ x.call.call.key.publicKey.bytes.toList) ∗ + FromRecordCallees.lsLogOff ∗ A.pool ∗ + memRegion (s0.sp - BitVec.ofNat 64 stk) (stk - saveMinStk getStk putStk) ∗ + stackAt (s0.sp - 0xd0#64) (saveSubMax getStk putStk) ∗ + memRegion (s0.sp - 0xd0#64) 8 ∗ + overlap7View1 (s0.sp - 0xc8#64) c1 c2 c3 c4 c5 c6 c7 ∗ + ((s0.sp - 0xc1#64) ↦₈ c15) ∗ + ((s0.sp - 0xc0#64) ↦₆₄ s16) ∗ + ((s0.sp - 0xb8#64) ↦₈ s24) ∗ + memRegion (s0.sp - 0xb7#64) 7 ∗ + ((s0.sp - 0xb0#64) ↦₆₄ s32) ∗ + ((s0.sp - 0xa8#64) ↦₈ s40) ∗ + memRegion (s0.sp - 0xa7#64) 7 ∗ + ((s0.sp - 0xa0#64) ↦₆₄ s48) ∗ + ((s0.sp - 0x98#64) ↦₆₄ s56w) ∗ + savedCalleeSlots s0) + (fun sf P_f => sf.sp = s0.sp ∧ CalleeSavedPreserved s0 sf ∧ + (P_f ⊢ (idSavePollSpecPlaced rd pathOk A stk).post x s0 sf)) + (fun sf P_f => P_f ⊢ (idSavePollSpecPlaced rd pathOk A stk).onPanic x s0 sf) := + ispoll_branch_ok_some_placed_16 (pathOk := pathOk) hC hSer hPut hDec + (publicKeyEqMem16_lscro_of_publicKeyEq hEq) hstk hhi x k + c1 c2 c3 c4 c5 c6 c7 c15 s16 s24 s32 s40 s48 s56w + hpc hrun hsp hsp_align hvregs htr hinv hx19 hx20 hx24 hx29 hnlen hclen hser hgr + private theorem sepWPp_post_mono_p {prog : Program} {ret : BitVec 64} {s : State} {P : SepProp} {Q1 Q2 Qp1 Qp2 : State → SepProp → Prop} (hQ : ∀ sf P_f, Q1 sf P_f → Q2 sf P_f) @@ -572,8 +654,9 @@ private theorem sepWPp_post_mono_p {prog : Program} {ret : BitVec 64} {s : State · exact ⟨sf, hsteps, Or.inr (Or.inl ⟨hst, P_f, hm_f, hQp sf P_f hqp⟩)⟩ · exact ⟨sf, hsteps, Or.inr (Or.inr hoom)⟩ -/-- Core relocatable `[LibsignalPlacement]` verification of `save_identity::{closure#0}` (Block `565`). -/ -theorem idSavePoll_placed_ok_of_deps_core [LibsignalPlacement] {A : RustAlloc} +/-- Core relocatable `[LibsignalPlacement]` verification of `save_identity::{closure#0}` (Block `565`) +on `publicKeyEqMemSpec16` (`80` B). -/ +theorem idSavePoll_placed_ok_of_deps_core_16 [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} (hC : AllocContractsXCliPlaced A H) @@ -586,7 +669,8 @@ theorem idSavePoll_placed_ok_of_deps_core [LibsignalPlacement] {A : RustAlloc} (hDec : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 18) (StoreKit.withLsCodeRoLoaded lsmpl (RecordCodecsBinary.identityKeyDecodeRawSpec A))) (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) - (StoreKit.withLsCodeRoLoaded lsmpl Getters.publicKeyEqSpec)) + (StoreKit.withLsCodeRoLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)) (hstk : saveMinStk getStk putStk ≤ stk) : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (blkPl_565).base (idSavePollSpecPlaced rd pathOk A stk) := by @@ -723,11 +807,32 @@ theorem idSavePoll_placed_ok_of_deps_core [LibsignalPlacement] {A : RustAlloc} c1 c2 c3 c4 c5 c6 c7 c15 s16 s24 s32 s40 s48 s56w hpc1 hrun1 hsp1 hsp_al1 hvregs_1 htr1 hinv1 hx19_1 hx20_1 hx24_1 hx29_1 hnlen hclen hgr_eq - · exact ispoll_branch_ok_some_placed (pathOk := pathOk) hC hSer hPut hDec hEq hstk hhi x k + · exact ispoll_branch_ok_some_placed_16 (pathOk := pathOk) hC hSer hPut hDec hEq hstk hhi x k c1 c2 c3 c4 c5 c6 c7 c15 s16 s24 s32 s40 s48 s56w hpc1 hrun1 hsp1 hsp_al1 hvregs_1 htr1 hinv1 hx19_1 hx20_1 hx24_1 hx29_1 hnlen hclen hser hgr_eq +/-- Core relocatable `[LibsignalPlacement]` verification of `save_identity::{closure#0}` (Block `565`). -/ +theorem idSavePoll_placed_ok_of_deps_core [LibsignalPlacement] {A : RustAlloc} + {H : LibsignalHooks} {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} + {getStk putStk stk : Nat} + (hC : AllocContractsXCliPlaced A H) + (hSer : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 205) + (StoreKit.withLsCodeRoLoaded lsmpl (publicKeySerializeSpecX A))) + (hGet : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A getStk)) + (hPut : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 543) + (dirPutStrSpecPlaced A putStk)) + (hDec : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 18) + (StoreKit.withLsCodeRoLoaded lsmpl (RecordCodecsBinary.identityKeyDecodeRawSpec A))) + (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) + (StoreKit.withLsCodeRoLoaded lsmpl Getters.publicKeyEqSpec)) + (hstk : saveMinStk getStk putStk ≤ stk) : + subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (blkPl_565).base + (idSavePollSpecPlaced rd pathOk A stk) := + idSavePoll_placed_ok_of_deps_core_16 (pathOk := pathOk) hC hSer hGet hPut hDec + (publicKeyEqMem16_lscro_of_publicKeyEq hEq) hstk + end Placed end CryptoVerification.SignalSession.Cli.Store.IdSavePoll.Helpers diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/SymPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/SymPlacedBudget.lean index e3aa86862..101e11d90 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/SymPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/SymPlacedBudget.lean @@ -52,15 +52,16 @@ open CryptoVerification.SignalSession.Cli open CryptoVerification.SignalSession.Cli.Placed (blkPC_565 blkPl_565) open CryptoVerification.SignalSession.Cli.Store.IdSavePoll.Helpers (calleeSavedVRegs_writeVReg128_0 decStk_le_saveSubMax eor_publicKey_eq_idSaveOf - eqStk_le_saveSubMax fs_advancePC fs_applyWriteback fs_setMem fs_setPC fs_setPState fs_writeReg - fs_writeReg32 fs_writeReg64 fs_writeVReg128 getResultAt_ok_unpack getStk_le_saveSubMax - hookStk_le_saveSubMax ispoll_sp_eqs layoutOk_u8_of_ne_zero memRegion_32_eq_pkChunksAt - memRegion_bound_of_pointsTo64 offAfterDecode offAfterDealloc offAfterEq offAfterGet offOkTail - overlap7View1 pkChunksAt pk_pack_hi8 pk_pack_lo32 pk_pack_mid16 pointsToBytes_32_exists_pkChunksAt - protocolAddressAt_borrow s48_byte7_entails_memRegion16 s48_split_byte7 saveMinStk - savePollFrameSlots saveSubMax savedCalleeSlots sepWPp_conseq slot90_bytes32_16_collapse - slot90_pk88_to_32_16 slot90_words4_collapse spAligned_sub_d0 stackAt_savePoll_eq - stackAt_sub_split vecU8Tail vecU8_free_ne vecU8_free_zero) + eqStk16_le_saveSubMax eqStk_le_saveSubMax fs_advancePC fs_applyWriteback fs_setMem fs_setPC + fs_setPState fs_writeReg fs_writeReg32 fs_writeReg64 fs_writeVReg128 getResultAt_ok_unpack + getStk_le_saveSubMax hookStk_le_saveSubMax ispoll_sp_eqs layoutOk_u8_of_ne_zero + memRegion_32_eq_pkChunksAt memRegion_bound_of_pointsTo64 offAfterDecode offAfterDealloc + offAfterEq offAfterGet offOkTail overlap7View1 pkChunksAt pk_pack_hi8 pk_pack_lo32 + pk_pack_mid16 pointsToBytes_32_exists_pkChunksAt protocolAddressAt_borrow + s48_byte7_entails_memRegion16 s48_split_byte7 saveMinStk savePollFrameSlots saveSubMax + savedCalleeSlots sepWPp_conseq slot90_bytes32_16_collapse slot90_pk88_to_32_16 + slot90_words4_collapse spAligned_sub_d0 stackAt_savePoll_eq stackAt_sub_split vecU8Tail + vecU8_free_ne vecU8_free_zero) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FitsEnv FitsEvents FreeOnlyEvs RustCliAllocBudget RustLayoutOk rustDeallocEvents) @@ -73,8 +74,8 @@ open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget open LibsignalBinary.Proofs.SignalSession.Cli.Store.ShimCommonPlacedBudget (dealloc_lscro_of_cli) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.BranchesPlacedBudget (CliIdSavePollEnv CliIdSaveTailEnv ispoll_branch_err_placed ispoll_call_dealloc_placed - ispoll_call_decode_placed ispoll_call_dirGet_placed ispoll_call_publicKeyEq_placed - ispoll_ok_tail_190_placed) + ispoll_call_decode_placed ispoll_call_dirGet_placed ispoll_call_publicKeyEq16_placed + ispoll_call_publicKeyEq_placed ispoll_ok_tail_190_placed) export LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.BranchesPlacedBudget (CliIdSaveTailEnv CliIdSavePollEnv) @@ -281,6 +282,35 @@ private theorem abstract_state_p {prog : Program} {ret : BitVec 64} {s : State} SepWPp prog ret s P Q Qp := k s rfl +private theorem publicKeyEqMem16_lscro_vm_of_publicKeyEq [LibsignalPlacement] {prog : Program} + {callee : BitVec 64} + (hEq : subroutine_ok prog callee + (withLsCodeRoLoaded lsmpl (withVmPreserved publicKeyEqSpec))) : + subroutine_ok prog callee + (withLsCodeRoLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)) := by + refine subroutine_ok_refine_frame hEq + (fun ⟨p1, pk1, p2, pk2, sp⟩ R s0 hp => + ⟨(p1, pk1, p2, pk2, sp), stackAt (sp - 64#64) 16, ?_, fun sf hq => ?_⟩) + (fun _ _ _ _ hp => by + dsimp only [withLsCodeRoLoaded, withVmPreserved, publicKeyEqSpec] at hp + exact not_satisfies_false_sepConj hp) + (fun _ _ _ _ _ he => by + dsimp only [withLsCodeRoLoaded, withVmPreserved, publicKeyEqSpec] at he + exact not_satisfies_false_sepConj he) + (fun _ _ _ _ _ _ ho => by + dsimp only [withLsCodeRoLoaded, withVmPreserved, publicKeyEqSpec] at ho + exact False.elim (not_satisfies_false_sepConj ho)) + · dsimp only [withLsCodeRoLoaded, withVmPreserved, publicKeyEqSpec, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hp ⊢ + rw [LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.memRegion_80_eq_publicKeyEqFrame_16 sp] at hp + exact Satisfies.mono (Entails.of_eq (by sep_ac_rfl)) hp + · dsimp only [withLsCodeRoLoaded, withVmPreserved, publicKeyEqSpec, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hq ⊢ + rw [LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.memRegion_80_eq_publicKeyEqFrame_16 sp] + exact Satisfies.mono (Entails.of_eq (by sep_ac_rfl)) hq + private theorem ispoll_branch_ok_some_220_placed [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} @@ -292,7 +322,9 @@ private theorem ispoll_branch_ok_some_220_placed [LibsignalPlacement] {M : Alloc (hPut : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 543) (dirPutStrSpecPlaced A lim PutStrEnv putStk)) (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) - (withLsCodeRoLoaded lsmpl (withVmPreserved publicKeyEqSpec))) + (withLsCodeRoLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16))) (hstk : saveMinStk getStk putStk ≤ stk) (hhi : stk ≤ 2 ^ 64) {s0 s : State} (x : IdPollGhost) (st0 : M.σ) (evsPre : List AllocEvent) (k : IdentityKey) @@ -392,9 +424,9 @@ private theorem ispoll_branch_ok_some_220_placed [LibsignalPlacement] {M : Alloc ispoll_rw_pre hrew_pk conv => arg 4 - rw [stackAt_sub_split (s0.sp - 0xd0#64) (eqStk_le_saveSubMax getStk putStk) hsub_hi] + rw [stackAt_sub_split (s0.sp - 0xd0#64) (eqStk16_le_saveSubMax getStk putStk) hsub_hi] simp only [sepConj_assoc] - refine ispoll_call_publicKeyEq_placed (A := A) (lim := lim) + refine ispoll_call_publicKeyEq16_placed (A := A) (lim := lim) (ret_pc := (blkPl_565).base + offAfterEq) hEq (s0.sp - 0x90#64) k.publicKey x.call.call.keyA x.call.call.key.publicKey (M.stepEvents evsPre st0) ?ispollF3 @@ -412,7 +444,7 @@ private theorem ispoll_branch_ok_some_220_placed [LibsignalPlacement] {M : Alloc simp only [State.spAligned] at hsp_align ⊢ rwa [hsp3, ← hsp] conv => arg 4; simp only [State.sp, wp_norm, arm64_norm, hsp, hsp3] - ispoll_rw_pre (stackAt_sub_split (s0.sp - 0xd0#64) (eqStk_le_saveSubMax getStk putStk) hsub_hi).symm + ispoll_rw_pre (stackAt_sub_split (s0.sp - 0xd0#64) (eqStk16_le_saveSubMax getStk putStk) hsub_hi).symm ispoll_fold_pre (slot90_bytes32_16_collapse s0.sp k.publicKey.bytes.toList_length) ispoll_fold_pre (s48_byte7_entails_memRegion16 s0.sp d5 b6 (s56w.extractLsb' 8 8) (s56w.extractLsb' 16 8) (s56w.extractLsb' 24 8) @@ -457,7 +489,7 @@ private theorem ispoll_branch_ok_some_220_placed [LibsignalPlacement] {M : Alloc hFitSer hFitPut hSaveEvs) exact Entails.of_eq (by unfold idSaveBoxAt; ispoll_ac_rfl) -theorem ispoll_branch_ok_some_placed [LibsignalPlacement] {M : AllocCostModel} +theorem ispoll_branch_ok_some_placed_16 [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} {SaveEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} @@ -471,7 +503,9 @@ theorem ispoll_branch_ok_some_placed [LibsignalPlacement] {M : AllocCostModel} (hDec : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 18) (withLsCodeRoLoaded lsmpl (withVmPreserved (identityKeyDecodeRawSpec A)))) (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) - (withLsCodeRoLoaded lsmpl (withVmPreserved publicKeyEqSpec))) + (withLsCodeRoLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16))) (hstk : saveMinStk getStk putStk ≤ stk) (hhi : stk ≤ 2 ^ 64) {s0 s : State} (x : IdPollGhost) (st0 : M.σ) (evsGet : List AllocEvent) @@ -640,6 +674,82 @@ theorem ispoll_branch_ok_some_placed [LibsignalPlacement] {M : AllocCostModel} (hFitSer _ hfo) (hFitPut _ hfo) (hSaveEvs _ · hfo)) exact Entails.of_eq (by ispoll_ac_rfl) +theorem ispoll_branch_ok_some_placed [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {SaveEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} + {H : LibsignalHooks} {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} + {getStk putStk stk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hSer : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 205) + (withLsCodeRoLoaded lsmpl (publicKeySerializeSpecX M A lim))) + (hPut : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 543) + (dirPutStrSpecPlaced A lim PutStrEnv putStk)) + (hDec : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 18) + (withLsCodeRoLoaded lsmpl (withVmPreserved (identityKeyDecodeRawSpec A)))) + (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) + (withLsCodeRoLoaded lsmpl (withVmPreserved publicKeyEqSpec))) + (hstk : saveMinStk getStk putStk ≤ stk) + (hhi : stk ≤ 2 ^ 64) + {s0 s : State} (x : IdPollGhost) (st0 : M.σ) (evsGet : List AllocEvent) + (k : IdentityKey) {bs : List (BitVec 8)} + (c1 c2 c3 c4 c5 c6 c7 c15 : BitVec 8) + (s16 : BitVec 64) (s24 : BitVec 8) (s32 : BitVec 64) (s40 : BitVec 8) + (s48 s56w : BitVec 64) + (hpc : s.pc = (blkPl_565).base + offAfterGet) + (hrun : s.status = .Running) + (hsp : s.sp = s0.sp - 0xd0#64) + (hsp_align : s.spAligned = true) + (hvregs : calleeSavedVRegs s = calleeSavedVRegs s0) + (htr : s.trace = s0.trace) + (hinv : LibsignalCodeRoLoaded lsmpl s.mem) + (hx19 : s.readReg64 .x19 = x.call.fut) + (hx20 : s.readReg64 .x20 = x.call.out) + (hx24 : s.readReg64 .x24 = x.self) + (hx29 : s.readReg64 .x29 = s0.sp - 0x60#64) + (hnlen : x.call.call.addr.name.bytes.length < 2 ^ 32) + (hclen : x.peers.changed.length < 2 ^ 32) + (hser : k.serialize = bs) + (hgr : Except.ok bs = x.peers.get rd s0.fs.files x.call.call.addr.val.name) + (hFitSer : ∀ evsFree, FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents (evsGet ++ evsFree) st0) PublicKeySerializeEnv) + (hFitPut : ∀ evsFree, FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents ((evsGet ++ evsFree) ++ publicKeySerializeEvents) st0) + (PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize)) + (hSaveEvs : ∀ evsFree evsPut, FreeOnlyEvs evsFree → + PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize evsPut → + SaveEnv s0.fs.files x ((evsGet ++ evsFree) ++ publicKeySerializeEvents ++ evsPut)) : + SepWPp ((blkPC_565).rebase (blkPl_565).base H) (s0.readReg64 .lr) s + (getResultAt A.repAlloc (s0.sp - 0x90#64) (.ok bs) ∗ + dirAt A.repAlloc (x.self + 0x28#64) x.peers ∗ + memRegion x.call.out 48 ∗ + idSaveBoxAt x.call.fut x.self x.call.call.addrA x.call.call.keyA 0#8 ∗ + protocolAddressAt A.repAlloc x.call.call.addr x.call.call.addrA ∗ + (x.call.call.keyA ↦ₛ x.call.call.key.publicKey.bytes.toList) ∗ + lsLogOff ∗ A.pool lim (M.stepEvents evsGet st0) s ∗ + memRegion (s0.sp - BitVec.ofNat 64 stk) (stk - saveMinStk getStk putStk) ∗ + stackAt (s0.sp - 0xd0#64) (saveSubMax getStk putStk) ∗ + memRegion (s0.sp - 0xd0#64) 8 ∗ + overlap7View1 (s0.sp - 0xc8#64) c1 c2 c3 c4 c5 c6 c7 ∗ + ((s0.sp - 0xc1#64) ↦₈ c15) ∗ + ((s0.sp - 0xc0#64) ↦₆₄ s16) ∗ + ((s0.sp - 0xb8#64) ↦₈ s24) ∗ + memRegion (s0.sp - 0xb7#64) 7 ∗ + ((s0.sp - 0xb0#64) ↦₆₄ s32) ∗ + ((s0.sp - 0xa8#64) ↦₈ s40) ∗ + memRegion (s0.sp - 0xa7#64) 7 ∗ + ((s0.sp - 0xa0#64) ↦₆₄ s48) ∗ + ((s0.sp - 0x98#64) ↦₆₄ s56w) ∗ + savedCalleeSlots s0) + (fun sf P_f => sf.sp = s0.sp ∧ CalleeSavedPreserved s0 sf ∧ + (P_f ⊢ (idSavePollSpecPlaced rd pathOk A lim SaveEnv stk).post (x, st0) s0 sf)) + (fun sf P_f => P_f ⊢ (idSavePollSpecPlaced rd pathOk A lim SaveEnv stk).onPanic (x, st0) s0 sf) := + ispoll_branch_ok_some_placed_16 (pathOk := pathOk) hC hSer hPut hDec + (publicKeyEqMem16_lscro_vm_of_publicKeyEq hEq) hstk hhi x st0 evsGet k + c1 c2 c3 c4 c5 c6 c7 c15 s16 s24 s32 s40 s48 s56w + hpc hrun hsp hsp_align hvregs htr hinv hx19 hx20 hx24 hx29 + hnlen hclen hser hgr hFitSer hFitPut hSaveEvs + private theorem sepWPp_post_mono_p {prog : Program} {ret : BitVec 64} {s : State} {P : SepProp} {Q1 Q2 Qp1 Qp2 : State → SepProp → Prop} (hQ : ∀ sf P_f, Q1 sf P_f → Q2 sf P_f) @@ -652,8 +762,8 @@ private theorem sepWPp_post_mono_p {prog : Program} {ret : BitVec 64} {s : State · exact ⟨sf, hsteps, Or.inr (Or.inr hoom)⟩ /-- Generic-envelope relocatable `[LibsignalPlacement]` verification of `save_identity::{closure#0}` -(Block `565`). -/ -theorem idSavePoll_placed_ok_of_deps_core_gen [LibsignalPlacement] {M : AllocCostModel} +(Block `565`) on `publicKeyEqMemSpec16` (`80` B). -/ +theorem idSavePoll_placed_ok_of_deps_core_gen_16 [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} @@ -670,7 +780,9 @@ theorem idSavePoll_placed_ok_of_deps_core_gen [LibsignalPlacement] {M : AllocCos (hDec : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 18) (withLsCodeRoLoaded lsmpl (withVmPreserved (identityKeyDecodeRawSpec A)))) (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) - (withLsCodeRoLoaded lsmpl (withVmPreserved publicKeyEqSpec))) + (withLsCodeRoLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16))) (hFitGet : ∀ F0 x st0, FitsEnv M lim st0 (SaveEnv F0 x) → FitsEnv M lim st0 (GetEnv F0 x.peers x.call.call.addr.name.bytes)) (hSaveErr : ∀ F0 x evsGet, @@ -844,7 +956,7 @@ theorem idSavePoll_placed_ok_of_deps_core_gen [LibsignalPlacement] {M : AllocCos (fun evsFree evsPut hfo hPutEv => by simpa only [List.append_assoc] using hSaveOk s0.fs.files x [] evsGet evsFree evsPut hgr_eq.symm hGetEvs hfo hPutEv) - · exact ispoll_branch_ok_some_placed (pathOk := pathOk) hC hSer hPut hDec hEq hstk hhi x st0 evsGet k + · exact ispoll_branch_ok_some_placed_16 (pathOk := pathOk) hC hSer hPut hDec hEq hstk hhi x st0 evsGet k c1 c2 c3 c4 c5 c6 c7 c15 s16 s24 s32 s40 s48 s56w hpc1 hrun1 hsp1 hsp_al1 hvregs_1 htr1 hinv1 hx19_1 hx20_1 hx24_1 hx29_1 hnlen hclen hser hgr_eq @@ -856,6 +968,90 @@ theorem idSavePoll_placed_ok_of_deps_core_gen [LibsignalPlacement] {M : AllocCos simpa only [List.append_assoc] using hSaveOk s0.fs.files x bs evsGet evsFree evsPut hgr_eq.symm hGetEvs hfo hPutEv) +/-- Generic-envelope relocatable `[LibsignalPlacement]` verification of `save_identity::{closure#0}` +(Block `565`). -/ +theorem idSavePoll_placed_ok_of_deps_core_gen [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {SaveEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} + {getStk putStk stk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hSer : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 205) + (withLsCodeRoLoaded lsmpl (publicKeySerializeSpecX M A lim))) + (hGet : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (hPut : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 543) + (dirPutStrSpecPlaced A lim PutStrEnv putStk)) + (hDec : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 18) + (withLsCodeRoLoaded lsmpl (withVmPreserved (identityKeyDecodeRawSpec A)))) + (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) + (withLsCodeRoLoaded lsmpl (withVmPreserved publicKeyEqSpec))) + (hFitGet : ∀ F0 x st0, FitsEnv M lim st0 (SaveEnv F0 x) → + FitsEnv M lim st0 (GetEnv F0 x.peers x.call.call.addr.name.bytes)) + (hSaveErr : ∀ F0 x evsGet, + x.peers.get rd F0 x.call.call.addr.val.name = .error () → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + SaveEnv F0 x evsGet) + (hFitSer : ∀ F0 x bs st0 evsGet evsFree, + FitsEnv M lim st0 (SaveEnv F0 x) → + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents (evsGet ++ evsFree) st0) PublicKeySerializeEnv) + (hFitPut : ∀ F0 x bs st0 evsGet evsFree, + FitsEnv M lim st0 (SaveEnv F0 x) → + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents ((evsGet ++ evsFree) ++ publicKeySerializeEvents) st0) + (PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize)) + (hSaveOk : ∀ F0 x bs evsGet evsFree evsPut, + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize evsPut → + SaveEnv F0 x ((evsGet ++ evsFree) ++ publicKeySerializeEvents ++ evsPut)) + (hstk : saveMinStk getStk putStk ≤ stk) : + subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (blkPl_565).base + (idSavePollSpecPlaced rd pathOk A lim SaveEnv stk) := + idSavePoll_placed_ok_of_deps_core_gen_16 hC hSer hGet hPut hDec + (publicKeyEqMem16_lscro_vm_of_publicKeyEq hEq) + hFitGet hSaveErr hFitSer hFitPut hSaveOk hstk + +/-- Core relocatable `[LibsignalPlacement]` verification of `save_identity::{closure#0}` (Block `565`) +under the canonical composite envelope `CliIdSavePollEnv rd GetEnv PutStrEnv` on `publicKeyEqMemSpec16` (`80` B). -/ +theorem idSavePoll_placed_ok_of_deps_core_16 [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} + {getStk putStk stk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hSer : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 205) + (withLsCodeRoLoaded lsmpl (publicKeySerializeSpecX M A lim))) + (hGet : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (hPut : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 543) + (dirPutStrSpecPlaced A lim PutStrEnv putStk)) + (hDec : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 18) + (withLsCodeRoLoaded lsmpl (withVmPreserved (identityKeyDecodeRawSpec A)))) + (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) + (withLsCodeRoLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16))) + (hstk : saveMinStk getStk putStk ≤ stk) : + subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (blkPl_565).base + (idSavePollSpecPlaced rd pathOk A lim (CliIdSavePollEnv rd GetEnv PutStrEnv) stk) := + idSavePoll_placed_ok_of_deps_core_gen_16 hC hSer hGet hPut hDec hEq + (fun _ _ _ hFit => hFit.seq_left) + (fun _ _ _ _ hGetEv => CliIdSavePollEnv.of_get_err hGetEv) + (fun _ _ _ _ _ _ => CliIdSavePollEnv.fits_ser_of_freeOnly) + (fun _ _ _ _ _ _ => CliIdSavePollEnv.fits_put_of_freeOnly) + (fun _ _ _ _ _ _ => CliIdSavePollEnv.of_get_ser_put) + hstk + /-- Core relocatable `[LibsignalPlacement]` verification of `save_identity::{closure#0}` (Block `565`) under the canonical composite envelope `CliIdSavePollEnv rd GetEnv PutStrEnv`. -/ theorem idSavePoll_placed_ok_of_deps_core [LibsignalPlacement] {M : AllocCostModel} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/SymPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/SymPlacedBudgetFd.lean index 97b93e458..f7c6bb7fd 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/SymPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePoll/SymPlacedBudgetFd.lean @@ -52,15 +52,16 @@ open CryptoVerification.SignalSession.Cli open CryptoVerification.SignalSession.Cli.Placed (blkPC_565 blkPl_565) open CryptoVerification.SignalSession.Cli.Store.IdSavePoll.Helpers (calleeSavedVRegs_writeVReg128_0 decStk_le_saveSubMax eor_publicKey_eq_idSaveOf - eqStk_le_saveSubMax fs_advancePC fs_applyWriteback fs_setMem fs_setPC fs_setPState fs_writeReg - fs_writeReg32 fs_writeReg64 fs_writeVReg128 getResultAt_ok_unpack getStk_le_saveSubMax - hookStk_le_saveSubMax ispoll_sp_eqs layoutOk_u8_of_ne_zero memRegion_32_eq_pkChunksAt - memRegion_bound_of_pointsTo64 offAfterDecode offAfterDealloc offAfterEq offAfterGet offOkTail - overlap7View1 pkChunksAt pk_pack_hi8 pk_pack_lo32 pk_pack_mid16 pointsToBytes_32_exists_pkChunksAt - protocolAddressAt_borrow s48_byte7_entails_memRegion16 s48_split_byte7 saveMinStk - savePollFrameSlots saveSubMax savedCalleeSlots sepWPp_conseq slot90_bytes32_16_collapse - slot90_pk88_to_32_16 slot90_words4_collapse spAligned_sub_d0 stackAt_savePoll_eq - stackAt_sub_split vecU8Tail vecU8_free_ne vecU8_free_zero) + eqStk16_le_saveSubMax eqStk_le_saveSubMax fs_advancePC fs_applyWriteback fs_setMem fs_setPC + fs_setPState fs_writeReg fs_writeReg32 fs_writeReg64 fs_writeVReg128 getResultAt_ok_unpack + getStk_le_saveSubMax hookStk_le_saveSubMax ispoll_sp_eqs layoutOk_u8_of_ne_zero + memRegion_32_eq_pkChunksAt memRegion_bound_of_pointsTo64 offAfterDecode offAfterDealloc + offAfterEq offAfterGet offOkTail overlap7View1 pkChunksAt pk_pack_hi8 pk_pack_lo32 + pk_pack_mid16 pointsToBytes_32_exists_pkChunksAt protocolAddressAt_borrow + s48_byte7_entails_memRegion16 s48_split_byte7 saveMinStk savePollFrameSlots saveSubMax + savedCalleeSlots sepWPp_conseq slot90_bytes32_16_collapse slot90_pk88_to_32_16 + slot90_words4_collapse spAligned_sub_d0 stackAt_savePoll_eq stackAt_sub_split vecU8Tail + vecU8_free_ne vecU8_free_zero) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FitsEnv FitsEvents FreeOnlyEvs RustCliAllocBudget RustLayoutOk rustDeallocEvents) @@ -79,7 +80,8 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.BranchesPlacedBud (CliIdSavePollEnv CliIdSaveTailEnv) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.BranchesPlacedBudgetFd (ispoll_branch_err_placed_fd ispoll_call_dealloc_placed_fd ispoll_call_decode_placed_fd - ispoll_call_dirGet_placed_fd ispoll_call_publicKeyEq_placed_fd ispoll_ok_tail_190_placed_fd) + ispoll_call_dirGet_placed_fd ispoll_call_publicKeyEq16_placed_fd + ispoll_call_publicKeyEq_placed_fd ispoll_ok_tail_190_placed_fd) section Placed @@ -295,6 +297,36 @@ private theorem abstract_state_p {prog : Program} {ret : BitVec 64} {s : State} SepWPp prog ret s P Q Qp := k s rfl +private theorem publicKeyEqMem16_lscro_fd_of_publicKeyEq [LibsignalPlacement] {prog : Program} + {callee : BitVec 64} + (hEq : subroutine_ok prog callee + (withLsCodeRoLoaded lsmpl (withFdsGe3Closed (withVmPreserved publicKeyEqSpec)))) : + subroutine_ok prog callee + (withLsCodeRoLoaded lsmpl + (withFdsGe3Closed + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16))) := by + refine subroutine_ok_refine_frame hEq + (fun ⟨p1, pk1, p2, pk2, sp⟩ R s0 hp => + ⟨(p1, pk1, p2, pk2, sp), stackAt (sp - 64#64) 16, ?_, fun sf hq => ?_⟩) + (fun _ _ _ _ hp => by + dsimp only [withLsCodeRoLoaded, withFdsGe3Closed, withVmPreserved, publicKeyEqSpec] at hp + exact not_satisfies_false_sepConj hp) + (fun _ _ _ _ _ he => by + dsimp only [withLsCodeRoLoaded, withFdsGe3Closed, withVmPreserved, publicKeyEqSpec] at he + exact not_satisfies_false_sepConj he) + (fun _ _ _ _ _ _ ho => by + dsimp only [withLsCodeRoLoaded, withFdsGe3Closed, withVmPreserved, publicKeyEqSpec] at ho + exact False.elim (not_satisfies_false_sepConj ho)) + · dsimp only [withLsCodeRoLoaded, withFdsGe3Closed, withVmPreserved, publicKeyEqSpec, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hp ⊢ + rw [LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.memRegion_80_eq_publicKeyEqFrame_16 sp] at hp + exact Satisfies.mono (Entails.of_eq (by sep_ac_rfl)) hp + · dsimp only [withLsCodeRoLoaded, withFdsGe3Closed, withVmPreserved, publicKeyEqSpec, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hq ⊢ + rw [LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.memRegion_80_eq_publicKeyEqFrame_16 sp] + exact Satisfies.mono (Entails.of_eq (by sep_ac_rfl)) hq + private theorem ispoll_branch_ok_some_220_placed_fd [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} @@ -306,7 +338,10 @@ private theorem ispoll_branch_ok_some_220_placed_fd [LibsignalPlacement] {M : Al (hPut : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 543) (withFdsGe3Closed (dirPutStrSpecPlaced A lim PutStrEnv putStk))) (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) - (withLsCodeRoLoaded lsmpl (withFdsGe3Closed (withVmPreserved publicKeyEqSpec)))) + (withLsCodeRoLoaded lsmpl + (withFdsGe3Closed + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)))) (hstk : saveMinStk getStk putStk ≤ stk) (hhi : stk ≤ 2 ^ 64) {s0 s : State} (x : IdPollGhost) (st0 : M.σ) (evsPre : List AllocEvent) (k : IdentityKey) @@ -410,9 +445,9 @@ private theorem ispoll_branch_ok_some_220_placed_fd [LibsignalPlacement] {M : Al ispoll_rw_pre hrew_pk conv => arg 4 - rw [stackAt_sub_split (s0.sp - 208#64) (eqStk_le_saveSubMax getStk putStk) hsub_hi] + rw [stackAt_sub_split (s0.sp - 208#64) (eqStk16_le_saveSubMax getStk putStk) hsub_hi] simp only [sepConj_assoc] - refine ispoll_call_publicKeyEq_placed_fd (A := A) (lim := lim) + refine ispoll_call_publicKeyEq16_placed_fd (A := A) (lim := lim) (ret_pc := (blkPl_565).base + offAfterEq) hEq (s0.sp - 144#64) k.publicKey x.call.call.keyA x.call.call.key.publicKey (M.stepEvents evsPre st0) ?ispollF3 @@ -431,7 +466,7 @@ private theorem ispoll_branch_ok_some_220_placed_fd [LibsignalPlacement] {M : Al simp only [State.spAligned] at hsp_align ⊢ rwa [hsp3, ← hsp] conv => arg 4; simp only [State.sp, wp_norm, arm64_norm, hsp, hsp3] - ispoll_rw_pre (stackAt_sub_split (s0.sp - 208#64) (eqStk_le_saveSubMax getStk putStk) hsub_hi).symm + ispoll_rw_pre (stackAt_sub_split (s0.sp - 208#64) (eqStk16_le_saveSubMax getStk putStk) hsub_hi).symm ispoll_fold_pre (slot90_bytes32_16_collapse s0.sp k.publicKey.bytes.toList_length) ispoll_fold_pre (s48_byte7_entails_memRegion16 s0.sp d5 b6 (s56w.extractLsb' 8 8) (s56w.extractLsb' 16 8) (s56w.extractLsb' 24 8) @@ -478,7 +513,7 @@ private theorem ispoll_branch_ok_some_220_placed_fd [LibsignalPlacement] {M : Al hFitSer hFitPut hSaveEvs) exact Entails.of_eq (by unfold idSaveBoxAt; ispoll_ac_rfl) -theorem ispoll_branch_ok_some_placed_fd [LibsignalPlacement] {M : AllocCostModel} +theorem ispoll_branch_ok_some_placed_16_fd [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} {SaveEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} @@ -492,7 +527,10 @@ theorem ispoll_branch_ok_some_placed_fd [LibsignalPlacement] {M : AllocCostModel (hDec : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 18) (withLsCodeRoLoaded lsmpl (withFdsGe3Closed (withVmPreserved (identityKeyDecodeRawSpec A))))) (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) - (withLsCodeRoLoaded lsmpl (withFdsGe3Closed (withVmPreserved publicKeyEqSpec)))) + (withLsCodeRoLoaded lsmpl + (withFdsGe3Closed + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)))) (hstk : saveMinStk getStk putStk ≤ stk) (hhi : stk ≤ 2 ^ 64) {s0 s : State} (x : IdPollGhost) (st0 : M.σ) (evsGet : List AllocEvent) @@ -670,6 +708,86 @@ theorem ispoll_branch_ok_some_placed_fd [LibsignalPlacement] {M : AllocCostModel (hFitSer _ hfo) (hFitPut _ hfo) (hSaveEvs _ · hfo)) exact Entails.of_eq (by ispoll_ac_rfl) +theorem ispoll_branch_ok_some_placed_fd [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {SaveEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} + {H : LibsignalHooks} {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} + {getStk putStk stk : Nat} + (hFs : AllocContractsFsPlaced A lim H) + (hSer : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 205) + (withLsCodeRoLoaded lsmpl (withFdsGe3Closed (publicKeySerializeSpecX M A lim)))) + (hPut : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 543) + (withFdsGe3Closed (dirPutStrSpecPlaced A lim PutStrEnv putStk))) + (hDec : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 18) + (withLsCodeRoLoaded lsmpl (withFdsGe3Closed (withVmPreserved (identityKeyDecodeRawSpec A))))) + (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) + (withLsCodeRoLoaded lsmpl (withFdsGe3Closed (withVmPreserved publicKeyEqSpec)))) + (hstk : saveMinStk getStk putStk ≤ stk) + (hhi : stk ≤ 2 ^ 64) + {s0 s : State} (x : IdPollGhost) (st0 : M.σ) (evsGet : List AllocEvent) + (k : IdentityKey) {bs : List (BitVec 8)} + (c1 c2 c3 c4 c5 c6 c7 c15 : BitVec 8) + (s16 : BitVec 64) (s24 : BitVec 8) (s32 : BitVec 64) (s40 : BitVec 8) + (s48 s56w : BitVec 64) + (hpc : s.pc = (blkPl_565).base + offAfterGet) + (hrun : s.status = .Running) + (hsp : s.sp = s0.sp - 208#64) + (hsp_align : s.spAligned = true) + (hvregs : calleeSavedVRegs s = calleeSavedVRegs s0) + (htr : s.trace = s0.trace) + (hinv : LibsignalCodeRoLoaded lsmpl s.mem) + (hfds : FdsGe3Closed s.fs) + (hx19 : s.readReg64 .x19 = x.call.fut) + (hx20 : s.readReg64 .x20 = x.call.out) + (hx24 : s.readReg64 .x24 = x.self) + (hx29 : s.readReg64 .x29 = s0.sp - 96#64) + (hnlen : x.call.call.addr.name.bytes.length < 2 ^ 32) + (hclen : x.peers.changed.length < 2 ^ 32) + (hser : k.serialize = bs) + (hgr : Except.ok bs = x.peers.get rd s0.fs.files x.call.call.addr.val.name) + (hFitSer : ∀ evsFree, FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents (evsGet ++ evsFree) st0) PublicKeySerializeEnv) + (hFitPut : ∀ evsFree, FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents ((evsGet ++ evsFree) ++ publicKeySerializeEvents) st0) + (PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize)) + (hSaveEvs : ∀ evsFree evsPut, FreeOnlyEvs evsFree → + PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize evsPut → + SaveEnv s0.fs.files x ((evsGet ++ evsFree) ++ publicKeySerializeEvents ++ evsPut)) : + SepWPp ((blkPC_565).rebase (blkPl_565).base H) (s0.readReg64 .lr) s + (getResultAt A.repAlloc (s0.sp - 144#64) (.ok bs) ∗ + dirAt A.repAlloc (x.self + 40#64) x.peers ∗ + memRegion x.call.out 48 ∗ + idSaveBoxAt x.call.fut x.self x.call.call.addrA x.call.call.keyA 0#8 ∗ + protocolAddressAt A.repAlloc x.call.call.addr x.call.call.addrA ∗ + (x.call.call.keyA ↦ₛ x.call.call.key.publicKey.bytes.toList) ∗ + lsLogOff ∗ A.pool lim (M.stepEvents evsGet st0) s ∗ + memRegion (s0.sp - BitVec.ofNat 64 stk) (stk - saveMinStk getStk putStk) ∗ + stackAt (s0.sp - 208#64) (saveSubMax getStk putStk) ∗ + memRegion (s0.sp - 208#64) 8 ∗ + overlap7View1 (s0.sp - 200#64) c1 c2 c3 c4 c5 c6 c7 ∗ + ((s0.sp - 193#64) ↦₈ c15) ∗ + ((s0.sp - 192#64) ↦₆₄ s16) ∗ + ((s0.sp - 184#64) ↦₈ s24) ∗ + memRegion (s0.sp - 183#64) 7 ∗ + ((s0.sp - 176#64) ↦₆₄ s32) ∗ + ((s0.sp - 168#64) ↦₈ s40) ∗ + memRegion (s0.sp - 167#64) 7 ∗ + ((s0.sp - 160#64) ↦₆₄ s48) ∗ + ((s0.sp - 152#64) ↦₆₄ s56w) ∗ + savedCalleeSlots s0) + (fun sf P_f => sf.sp = s0.sp ∧ CalleeSavedPreserved s0 sf ∧ + (P_f ⊢ (withFdsGe3Closed (idSavePollSpecPlaced rd pathOk A lim SaveEnv stk)).post + (x, st0) s0 sf)) + (fun sf P_f => + P_f ⊢ (withFdsGe3Closed (idSavePollSpecPlaced rd pathOk A lim SaveEnv stk)).onPanic + (x, st0) s0 sf) := + ispoll_branch_ok_some_placed_16_fd (pathOk := pathOk) hFs hSer hPut hDec + (publicKeyEqMem16_lscro_fd_of_publicKeyEq hEq) hstk hhi x st0 evsGet k + c1 c2 c3 c4 c5 c6 c7 c15 s16 s24 s32 s40 s48 s56w + hpc hrun hsp hsp_align hvregs htr hinv hfds hx19 hx20 hx24 hx29 + hnlen hclen hser hgr hFitSer hFitPut hSaveEvs + private theorem sepWPp_post_mono_p {prog : Program} {ret : BitVec 64} {s : State} {P : SepProp} {Q1 Q2 Qp1 Qp2 : State → SepProp → Prop} (hQ : ∀ sf P_f, Q1 sf P_f → Q2 sf P_f) @@ -682,8 +800,8 @@ private theorem sepWPp_post_mono_p {prog : Program} {ret : BitVec 64} {s : State · exact ⟨sf, hsteps, Or.inr (Or.inr hoom)⟩ /-- Generic-envelope `withFdsGe3Closed`-threaded relocatable `[LibsignalPlacement]` verification -of `save_identity::{closure#0}` (Block `565`). -/ -theorem idSavePoll_placed_ok_of_deps_core_gen_fd [LibsignalPlacement] {M : AllocCostModel} +of `save_identity::{closure#0}` (Block `565`) on `publicKeyEqMemSpec16` (`80` B). -/ +theorem idSavePoll_placed_ok_of_deps_core_gen_16_fd [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} @@ -700,7 +818,10 @@ theorem idSavePoll_placed_ok_of_deps_core_gen_fd [LibsignalPlacement] {M : Alloc (hDec : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 18) (withLsCodeRoLoaded lsmpl (withFdsGe3Closed (withVmPreserved (identityKeyDecodeRawSpec A))))) (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) - (withLsCodeRoLoaded lsmpl (withFdsGe3Closed (withVmPreserved publicKeyEqSpec)))) + (withLsCodeRoLoaded lsmpl + (withFdsGe3Closed + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)))) (hFitGet : ∀ F0 x st0, FitsEnv M lim st0 (SaveEnv F0 x) → FitsEnv M lim st0 (GetEnv F0 x.peers x.call.call.addr.name.bytes)) (hSaveErr : ∀ F0 x evsGet, @@ -877,7 +998,7 @@ theorem idSavePoll_placed_ok_of_deps_core_gen_fd [LibsignalPlacement] {M : Alloc (fun evsFree evsPut hfo hPutEv => by simpa only [List.append_assoc] using hSaveOk s0.fs.files x [] evsGet evsFree evsPut hgr_eq.symm hGetEvs hfo hPutEv) - · exact ispoll_branch_ok_some_placed_fd (pathOk := pathOk) hFs hSer hPut hDec hEq hstk hhi x st0 evsGet k + · exact ispoll_branch_ok_some_placed_16_fd (pathOk := pathOk) hFs hSer hPut hDec hEq hstk hhi x st0 evsGet k c1 c2 c3 c4 c5 c6 c7 c15 s16 s24 s32 s40 s48 s56w hpc1 hrun1 hsp1 hsp_al1 hvregs_1 htr1 hinv1 hfds1 hx19_1 hx20_1 hx24_1 hx29_1 hnlen hclen hser hgr_eq @@ -889,6 +1010,93 @@ theorem idSavePoll_placed_ok_of_deps_core_gen_fd [LibsignalPlacement] {M : Alloc simpa only [List.append_assoc] using hSaveOk s0.fs.files x bs evsGet evsFree evsPut hgr_eq.symm hGetEvs hfo hPutEv) +/-- Generic-envelope `withFdsGe3Closed`-threaded relocatable `[LibsignalPlacement]` verification +of `save_identity::{closure#0}` (Block `565`). -/ +theorem idSavePoll_placed_ok_of_deps_core_gen_fd [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {SaveEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} + {getStk putStk stk : Nat} + (hFs : AllocContractsFsPlaced A lim H) + (hSer : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 205) + (withLsCodeRoLoaded lsmpl (withFdsGe3Closed (publicKeySerializeSpecX M A lim)))) + (hGet : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 589) + (withFdsGe3Closed (dirGetSpecPlaced rd pathOk A lim GetEnv getStk))) + (hPut : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 543) + (withFdsGe3Closed (dirPutStrSpecPlaced A lim PutStrEnv putStk))) + (hDec : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 18) + (withLsCodeRoLoaded lsmpl (withFdsGe3Closed (withVmPreserved (identityKeyDecodeRawSpec A))))) + (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) + (withLsCodeRoLoaded lsmpl (withFdsGe3Closed (withVmPreserved publicKeyEqSpec)))) + (hFitGet : ∀ F0 x st0, FitsEnv M lim st0 (SaveEnv F0 x) → + FitsEnv M lim st0 (GetEnv F0 x.peers x.call.call.addr.name.bytes)) + (hSaveErr : ∀ F0 x evsGet, + x.peers.get rd F0 x.call.call.addr.val.name = .error () → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + SaveEnv F0 x evsGet) + (hFitSer : ∀ F0 x bs st0 evsGet evsFree, + FitsEnv M lim st0 (SaveEnv F0 x) → + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents (evsGet ++ evsFree) st0) PublicKeySerializeEnv) + (hFitPut : ∀ F0 x bs st0 evsGet evsFree, + FitsEnv M lim st0 (SaveEnv F0 x) → + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents ((evsGet ++ evsFree) ++ publicKeySerializeEvents) st0) + (PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize)) + (hSaveOk : ∀ F0 x bs evsGet evsFree evsPut, + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize evsPut → + SaveEnv F0 x ((evsGet ++ evsFree) ++ publicKeySerializeEvents ++ evsPut)) + (hstk : saveMinStk getStk putStk ≤ stk) : + subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (blkPl_565).base + (withFdsGe3Closed (idSavePollSpecPlaced rd pathOk A lim SaveEnv stk)) := + idSavePoll_placed_ok_of_deps_core_gen_16_fd hFs hSer hGet hPut hDec + (publicKeyEqMem16_lscro_fd_of_publicKeyEq hEq) + hFitGet hSaveErr hFitSer hFitPut hSaveOk hstk + +/-- Core `withFdsGe3Closed`-threaded relocatable `[LibsignalPlacement]` verification of +`save_identity::{closure#0}` (Block `565`) under `CliIdSavePollEnv rd GetEnv PutStrEnv` +on `publicKeyEqMemSpec16` (`80` B). -/ +theorem idSavePoll_placed_ok_of_deps_core_16_fd [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} + {getStk putStk stk : Nat} + (hFs : AllocContractsFsPlaced A lim H) + (hSer : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 205) + (withLsCodeRoLoaded lsmpl (withFdsGe3Closed (publicKeySerializeSpecX M A lim)))) + (hGet : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 589) + (withFdsGe3Closed (dirGetSpecPlaced rd pathOk A lim GetEnv getStk))) + (hPut : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 543) + (withFdsGe3Closed (dirPutStrSpecPlaced A lim PutStrEnv putStk))) + (hDec : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 18) + (withLsCodeRoLoaded lsmpl (withFdsGe3Closed (withVmPreserved (identityKeyDecodeRawSpec A))))) + (hEq : subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (lsmpl.base 212) + (withLsCodeRoLoaded lsmpl + (withFdsGe3Closed + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)))) + (hstk : saveMinStk getStk putStk ≤ stk) : + subroutine_ok ((blkPC_565).rebase (blkPl_565).base H) (blkPl_565).base + (withFdsGe3Closed + (idSavePollSpecPlaced rd pathOk A lim (CliIdSavePollEnv rd GetEnv PutStrEnv) stk)) := + idSavePoll_placed_ok_of_deps_core_gen_16_fd hFs hSer hGet hPut hDec hEq + (fun _ _ _ hFit => hFit.seq_left) + (fun _ _ _ _ hGetEv => CliIdSavePollEnv.of_get_err hGetEv) + (fun _ _ _ _ _ _ => CliIdSavePollEnv.fits_ser_of_freeOnly) + (fun _ _ _ _ _ _ => CliIdSavePollEnv.fits_put_of_freeOnly) + (fun _ _ _ _ _ _ => CliIdSavePollEnv.of_get_ser_put) + hstk + /-- Core `withFdsGe3Closed`-threaded relocatable `[LibsignalPlacement]` verification of `save_identity::{closure#0}` (Block `565`) under `CliIdSavePollEnv rd GetEnv PutStrEnv`. -/ theorem idSavePoll_placed_ok_of_deps_core_fd [LibsignalPlacement] {M : AllocCostModel} diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePollPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePollPlaced.lean index 4c95f340b..39b27a9ba 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePollPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePollPlaced.lean @@ -152,6 +152,114 @@ theorem idSavePoll_placed_caller_ok_of_deps [LibsignalPlacement] {A : RustAlloc} (idSavePoll_placed_ok_of_deps hC hpan hGet hPut hDec hEq hstk hGetBlk hGetUnmut hPutBlk hPutUnmut hDecBlk hDecUnmut hEqBlk hEqUnmut) hCallerBlk +theorem publicKeyEq_mem_placed_ok_of_bb_16_sat [LibsignalPlacement] {H : LibsignalHooks} + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : + subroutine_ok ((blkPC_212).rebase (blkPl_212).base H) + (lsmpl.base 212) + (withLsCodeLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16) := + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKey_eq_mem_placed_ok_16_sat h_bb + +theorem idSavePoll_placed_ok_of_deps_16 [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} + {getProg putProg decProg eqProg : Program} {getBlk putBlk decBlk eqBlk : Nat} + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} + (hC : AllocContractsXCliPlaced A H) + (hpan : CliPanicHooksPlaced H) + (hGet : subroutine_ok getProg (lsmpl.base 589) (dirGetSpecPlaced rd pathOk A getStk)) + (hPut : subroutine_ok putProg (lsmpl.base 543) (dirPutStrSpecPlaced A putStk)) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (RecordCodecsBinary.identityKeyDecodePlacedSpec A)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)) + (hstk : 0xd0 + max (max (max getStk putStk) (max 0x60 64)) + (max publicKeySerializeStackX extHookStack) ≤ stk) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok (lsProg_565 H) (lsmpl.base 565) + (idSavePollSpecPlaced rd pathOk A stk) := by + have hSer := Helpers.publicKeySerialize_lscro_of_cli + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hC hpan (by decide) + have hGet' := ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hGet (by decide) hGetBlk hGetUnmut + have hPut' := ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hPut (by decide) hPutBlk hPutUnmut + have hDec' := ls_transfer_cl_to_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hDec (by decide) hDecBlk hDecUnmut + have hEq' := ls_transfer_cl_to_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hEq (by decide) hEqBlk hEqUnmut + exact Helpers.idSavePoll_placed_ok_of_deps_core_16 hC hSer hGet' hPut' hDec' hEq' hstk + +theorem idSavePoll_placed_ok_of_get_put_bb_sat [LibsignalPlacement] {A : RustAlloc} + {H : LibsignalHooks} + {getProg putProg : Program} {getBlk putBlk : Nat} + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} + (hC : AllocContractsXCliPlaced A H) + (hpan : CliPanicHooksPlaced H) + (hGet : subroutine_ok getProg (lsmpl.base 589) (dirGetSpecPlaced rd pathOk A getStk)) + (hPut : subroutine_ok putProg (lsmpl.base 543) (dirPutStrSpecPlaced A putStk)) + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) + (hstk : 0xd0 + max (max (max getStk putStk) (max 0x60 64)) + (max publicKeySerializeStackX extHookStack) ≤ stk) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok (lsProg_565 H) (lsmpl.base 565) + (idSavePollSpecPlaced rd pathOk A stk) := + idSavePoll_placed_ok_of_deps_16 hC hpan hGet hPut + (RecordCodecsBinary.IdentityKeyDecode.identityKey_decode_placed_ok H) + (publicKeyEq_mem_placed_ok_of_bb_16_sat h_bb) hstk hGetBlk hGetUnmut hPutBlk hPutUnmut + +theorem idSavePoll_placed_caller_ok_of_deps_16 [LibsignalPlacement] {A : RustAlloc} + {H : LibsignalHooks} {callerProg getProg putProg decProg eqProg : Program} + {callerBlk getBlk putBlk decBlk eqBlk : Nat} + [IsLsBlockProg callerProg callerBlk H] + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} + (hC : AllocContractsXCliPlaced A H) + (hpan : CliPanicHooksPlaced H) + (hGet : subroutine_ok getProg (lsmpl.base 589) (dirGetSpecPlaced rd pathOk A getStk)) + (hPut : subroutine_ok putProg (lsmpl.base 543) (dirPutStrSpecPlaced A putStk)) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (RecordCodecsBinary.identityKeyDecodePlacedSpec A)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)) + (hstk : 0xd0 + max (max (max getStk putStk) (max 0x60 64)) + (max publicKeySerializeStackX extHookStack) ≤ stk) + (hCallerBlk : callerBlk < 619 := by decide) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok callerProg (lsmpl.base 565) + (idSavePollSpecPlaced rd pathOk A stk) := + ls_transfer_lscro (callerProg := callerProg) (j := 565) + (idSavePoll_placed_ok_of_deps_16 hC hpan hGet hPut hDec hEq hstk + hGetBlk hGetUnmut hPutBlk hPutUnmut hDecBlk hDecUnmut hEqBlk hEqUnmut) hCallerBlk + end Placed end CryptoVerification.SignalSession.Cli.Store.IdSavePoll diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePollPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePollPlacedBudget.lean index edd483684..283b4bf22 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePollPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePollPlacedBudget.lean @@ -51,16 +51,21 @@ open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsXCliPlaced dirGetSpecPlaced dirPutStrSpecPlaced idSavePollSpecPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.BranchesPlacedBudget (publicKeySerialize_lscro_of_cli) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat + (blackBoxSpecSat publicKeyEqMemSpec16) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.SymPlacedBudget (CliIdSavePollEnv CliIdSaveTailEnv idSavePoll_placed_ok_of_deps_core - idSavePoll_placed_ok_of_deps_core_gen) + idSavePoll_placed_ok_of_deps_core_16 idSavePoll_placed_ok_of_deps_core_gen + idSavePoll_placed_ok_of_deps_core_gen_16) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudget - (identityKeyDecodePlacedBudgetSpec identityKey_decode_placed_ok publicKeyEq_placed_ok_of_bb) + (identityKeyDecodePlacedBudgetSpec identityKey_decode_placed_ok + publicKeyEq_mem_placed_ok_of_bb_16_sat publicKeyEq_placed_ok_of_bb) export LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.SymPlacedBudget (CliIdSaveTailEnv CliIdSavePollEnv) export LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudget - (publicKeyEq_placed_ok_of_bb identityKeyDecodePlacedBudgetSpec identityKey_decode_placed_ok) + (publicKeyEq_placed_ok_of_bb publicKeyEq_mem_placed_ok_of_bb_16_sat + identityKeyDecodePlacedBudgetSpec identityKey_decode_placed_ok) section Placed @@ -313,6 +318,248 @@ theorem idSavePoll_placed_caller_ok_of_deps [LibsignalPlacement] {M : AllocCostM (idSavePoll_placed_ok_of_deps hC hGet hPut hDec hEq hstk hGetBlk hGetUnmut hPutBlk hPutUnmut hDecBlk hDecUnmut hEqBlk hEqUnmut) hCallerBlk +theorem idSavePoll_placed_ok_of_deps_gen_16 [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {SaveEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} + {getProg putProg decProg eqProg : Program} {getBlk putBlk decBlk eqBlk : Nat} + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (hPut : subroutine_ok putProg (lsmpl.base 543) + (dirPutStrSpecPlaced A lim PutStrEnv putStk)) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (identityKeyDecodePlacedBudgetSpec A)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl (withVmPreserved publicKeyEqMemSpec16))) + (hFitGet : ∀ F0 x st0, FitsEnv M lim st0 (SaveEnv F0 x) → + FitsEnv M lim st0 (GetEnv F0 x.peers x.call.call.addr.name.bytes)) + (hSaveErr : ∀ F0 x evsGet, + x.peers.get rd F0 x.call.call.addr.val.name = .error () → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + SaveEnv F0 x evsGet) + (hFitSer : ∀ F0 x bs st0 evsGet evsFree, + FitsEnv M lim st0 (SaveEnv F0 x) → + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents (evsGet ++ evsFree) st0) PublicKeySerializeEnv) + (hFitPut : ∀ F0 x bs st0 evsGet evsFree, + FitsEnv M lim st0 (SaveEnv F0 x) → + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents ((evsGet ++ evsFree) ++ publicKeySerializeEvents) st0) + (PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize)) + (hSaveOk : ∀ F0 x bs evsGet evsFree evsPut, + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize evsPut → + SaveEnv F0 x ((evsGet ++ evsFree) ++ publicKeySerializeEvents ++ evsPut)) + (hstk : 0xd0 + max (max (max getStk putStk) (max 0x60 64)) + (max publicKeySerializeStackX extHookStack) ≤ stk) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok (lsProg_565 H) (lsmpl.base 565) + (idSavePollSpecPlaced rd pathOk A lim SaveEnv stk) := by + have hSer := publicKeySerialize_lscro_of_cli + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hC (by decide) + have hGet' := ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hGet (by decide) hGetBlk hGetUnmut + have hPut' := ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hPut (by decide) hPutBlk hPutUnmut + have hDec' := ls_transfer_cl_to_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hDec (by decide) hDecBlk hDecUnmut + have hEq' := ls_transfer_cl_to_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hEq (by decide) hEqBlk hEqUnmut + exact idSavePoll_placed_ok_of_deps_core_gen_16 hC hSer hGet' hPut' hDec' hEq' + hFitGet hSaveErr hFitSer hFitPut hSaveOk hstk + +theorem idSavePoll_placed_ok_of_deps_16 [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {getProg putProg decProg eqProg : Program} {getBlk putBlk decBlk eqBlk : Nat} + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (hPut : subroutine_ok putProg (lsmpl.base 543) + (dirPutStrSpecPlaced A lim PutStrEnv putStk)) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (identityKeyDecodePlacedBudgetSpec A)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl (withVmPreserved publicKeyEqMemSpec16))) + (hstk : 0xd0 + max (max (max getStk putStk) (max 0x60 64)) + (max publicKeySerializeStackX extHookStack) ≤ stk) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok (lsProg_565 H) (lsmpl.base 565) + (idSavePollSpecPlaced rd pathOk A lim (CliIdSavePollEnv rd GetEnv PutStrEnv) stk) := by + have hSer := publicKeySerialize_lscro_of_cli + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hC (by decide) + have hGet' := ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hGet (by decide) hGetBlk hGetUnmut + have hPut' := ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hPut (by decide) hPutBlk hPutUnmut + have hDec' := ls_transfer_cl_to_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hDec (by decide) hDecBlk hDecUnmut + have hEq' := ls_transfer_cl_to_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) + hEq (by decide) hEqBlk hEqUnmut + exact idSavePoll_placed_ok_of_deps_core_16 hC hSer hGet' hPut' hDec' hEq' hstk + +theorem idSavePoll_placed_ok_of_get_put_bb_sat [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {getProg putProg : Program} {getBlk putBlk : Nat} + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (hPut : subroutine_ok putProg (lsmpl.base 543) + (dirPutStrSpecPlaced A lim PutStrEnv putStk)) + (h_bb : HookSat H lsBlackBoxU8Sym blackBoxSpecSat) + (hstk : 0xd0 + max (max (max getStk putStk) (max 0x60 64)) + (max publicKeySerializeStackX extHookStack) ≤ stk) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok (lsProg_565 H) (lsmpl.base 565) + (idSavePollSpecPlaced rd pathOk A lim (CliIdSavePollEnv rd GetEnv PutStrEnv) stk) := + idSavePoll_placed_ok_of_deps_16 hC hGet hPut + (identityKey_decode_placed_ok H) + (publicKeyEq_mem_placed_ok_of_bb_16_sat h_bb) hstk hGetBlk hGetUnmut hPutBlk hPutUnmut + +theorem idSavePoll_placed_caller_ok_of_deps_gen_16 [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {SaveEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} + {callerProg getProg putProg decProg eqProg : Program} + {callerBlk getBlk putBlk decBlk eqBlk : Nat} + [IsLsBlockProg callerProg callerBlk H] + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (hPut : subroutine_ok putProg (lsmpl.base 543) + (dirPutStrSpecPlaced A lim PutStrEnv putStk)) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (identityKeyDecodePlacedBudgetSpec A)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl (withVmPreserved publicKeyEqMemSpec16))) + (hFitGet : ∀ F0 x st0, FitsEnv M lim st0 (SaveEnv F0 x) → + FitsEnv M lim st0 (GetEnv F0 x.peers x.call.call.addr.name.bytes)) + (hSaveErr : ∀ F0 x evsGet, + x.peers.get rd F0 x.call.call.addr.val.name = .error () → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + SaveEnv F0 x evsGet) + (hFitSer : ∀ F0 x bs st0 evsGet evsFree, + FitsEnv M lim st0 (SaveEnv F0 x) → + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents (evsGet ++ evsFree) st0) PublicKeySerializeEnv) + (hFitPut : ∀ F0 x bs st0 evsGet evsFree, + FitsEnv M lim st0 (SaveEnv F0 x) → + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents ((evsGet ++ evsFree) ++ publicKeySerializeEvents) st0) + (PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize)) + (hSaveOk : ∀ F0 x bs evsGet evsFree evsPut, + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize evsPut → + SaveEnv F0 x ((evsGet ++ evsFree) ++ publicKeySerializeEvents ++ evsPut)) + (hstk : 0xd0 + max (max (max getStk putStk) (max 0x60 64)) + (max publicKeySerializeStackX extHookStack) ≤ stk) + (hCallerBlk : callerBlk < 619 := by decide) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok callerProg (lsmpl.base 565) + (idSavePollSpecPlaced rd pathOk A lim SaveEnv stk) := + ls_transfer_lscro (callerProg := callerProg) (j := 565) + (idSavePoll_placed_ok_of_deps_gen_16 hC hGet hPut hDec hEq + hFitGet hSaveErr hFitSer hFitPut hSaveOk hstk + hGetBlk hGetUnmut hPutBlk hPutUnmut hDecBlk hDecUnmut hEqBlk hEqUnmut) hCallerBlk + +theorem idSavePoll_placed_caller_ok_of_deps_16 [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {callerProg getProg putProg decProg eqProg : Program} + {callerBlk getBlk putBlk decBlk eqBlk : Nat} + [IsLsBlockProg callerProg callerBlk H] + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (hPut : subroutine_ok putProg (lsmpl.base 543) + (dirPutStrSpecPlaced A lim PutStrEnv putStk)) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (identityKeyDecodePlacedBudgetSpec A)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl (withVmPreserved publicKeyEqMemSpec16))) + (hstk : 0xd0 + max (max (max getStk putStk) (max 0x60 64)) + (max publicKeySerializeStackX extHookStack) ≤ stk) + (hCallerBlk : callerBlk < 619 := by decide) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok callerProg (lsmpl.base 565) + (idSavePollSpecPlaced rd pathOk A lim (CliIdSavePollEnv rd GetEnv PutStrEnv) stk) := + ls_transfer_lscro (callerProg := callerProg) (j := 565) + (idSavePoll_placed_ok_of_deps_16 hC hGet hPut hDec hEq hstk + hGetBlk hGetUnmut hPutBlk hPutUnmut hDecBlk hDecUnmut hEqBlk hEqUnmut) hCallerBlk + end Placed end LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePollPlacedBudget diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePollPlacedBudgetFd.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePollPlacedBudgetFd.lean index 8d9feffed..9e2061f5c 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePollPlacedBudgetFd.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdSavePollPlacedBudgetFd.lean @@ -12,6 +12,7 @@ module public import LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePollPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.SymPlacedBudgetFd public import LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudgetFd +public import LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudgetFdSat -- proof-setup: allow-public-import import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic @@ -54,13 +55,18 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.BranchesPlacedBud (CliIdSavePollEnv) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.BranchesPlacedBudgetFd (publicKeySerialize_lscro_of_fs) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat + (blackBoxSpecSat publicKeyEqMemSpec16) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.SymPlacedBudgetFd - (idSavePoll_placed_ok_of_deps_core_fd idSavePoll_placed_ok_of_deps_core_gen_fd) + (idSavePoll_placed_ok_of_deps_core_fd idSavePoll_placed_ok_of_deps_core_16_fd + idSavePoll_placed_ok_of_deps_core_gen_fd idSavePoll_placed_ok_of_deps_core_gen_16_fd) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudget (identityKeyDecodePlacedBudgetSpec) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudgetFd (identityKey_decode_placed_ok_fd ls_transfer_withFdsGe3Closed_cl_to_lscro publicKeyEq_placed_ok_of_bb_fd) +open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudgetFdSat + (publicKeyEq_mem_placed_ok_of_bb_16_fd_sat) section Placed @@ -317,6 +323,251 @@ theorem idSavePoll_placed_caller_ok_of_deps_fd [LibsignalPlacement] {M : AllocCo (idSavePoll_placed_ok_of_deps_fd hFs hGet hPut hDec hEq hstk hGetBlk hGetUnmut hPutBlk hPutUnmut hDecBlk hDecUnmut hEqBlk hEqUnmut) hCallerBlk +theorem idSavePoll_placed_ok_of_deps_gen_16_fd [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {SaveEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} + {getProg putProg decProg eqProg : Program} {getBlk putBlk decBlk eqBlk : Nat} + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} + (hFs : AllocContractsFsPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (withFdsGe3Closed (dirGetSpecPlaced rd pathOk A lim GetEnv getStk))) + (hPut : subroutine_ok putProg (lsmpl.base 543) + (withFdsGe3Closed (dirPutStrSpecPlaced A lim PutStrEnv putStk))) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (withFdsGe3Closed (identityKeyDecodePlacedBudgetSpec A))) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withFdsGe3Closed (withLsCodeLoaded lsmpl (withVmPreserved publicKeyEqMemSpec16)))) + (hFitGet : ∀ F0 x st0, FitsEnv M lim st0 (SaveEnv F0 x) → + FitsEnv M lim st0 (GetEnv F0 x.peers x.call.call.addr.name.bytes)) + (hSaveErr : ∀ F0 x evsGet, + x.peers.get rd F0 x.call.call.addr.val.name = .error () → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + SaveEnv F0 x evsGet) + (hFitSer : ∀ F0 x bs st0 evsGet evsFree, + FitsEnv M lim st0 (SaveEnv F0 x) → + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents (evsGet ++ evsFree) st0) PublicKeySerializeEnv) + (hFitPut : ∀ F0 x bs st0 evsGet evsFree, + FitsEnv M lim st0 (SaveEnv F0 x) → + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents ((evsGet ++ evsFree) ++ publicKeySerializeEvents) st0) + (PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize)) + (hSaveOk : ∀ F0 x bs evsGet evsFree evsPut, + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize evsPut → + SaveEnv F0 x ((evsGet ++ evsFree) ++ publicKeySerializeEvents ++ evsPut)) + (hstk : 208 + max (max (max getStk putStk) (max 96 64)) + (max publicKeySerializeStackX extHookStack) ≤ stk) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok (lsProg_565 H) (lsmpl.base 565) + (withFdsGe3Closed (idSavePollSpecPlaced rd pathOk A lim SaveEnv stk)) := by + have hSer := publicKeySerialize_lscro_of_fs + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hFs (by decide) + have hGet' := ls_transfer_withFdsGe3Closed_lscro + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hGet (by decide) hGetBlk hGetUnmut + have hPut' := ls_transfer_withFdsGe3Closed_lscro + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hPut (by decide) hPutBlk hPutUnmut + have hDec' := ls_transfer_withFdsGe3Closed_cl_to_lscro + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hDec (by decide) hDecBlk hDecUnmut + have hEq' := ls_transfer_withFdsGe3Closed_cl_to_lscro + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hEq (by decide) hEqBlk hEqUnmut + exact idSavePoll_placed_ok_of_deps_core_gen_16_fd hFs hSer hGet' hPut' hDec' hEq' + hFitGet hSaveErr hFitSer hFitPut hSaveOk hstk + +theorem idSavePoll_placed_ok_of_deps_16_fd [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {getProg putProg decProg eqProg : Program} {getBlk putBlk decBlk eqBlk : Nat} + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} + (hFs : AllocContractsFsPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (withFdsGe3Closed (dirGetSpecPlaced rd pathOk A lim GetEnv getStk))) + (hPut : subroutine_ok putProg (lsmpl.base 543) + (withFdsGe3Closed (dirPutStrSpecPlaced A lim PutStrEnv putStk))) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (withFdsGe3Closed (identityKeyDecodePlacedBudgetSpec A))) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withFdsGe3Closed (withLsCodeLoaded lsmpl (withVmPreserved publicKeyEqMemSpec16)))) + (hstk : 208 + max (max (max getStk putStk) (max 96 64)) + (max publicKeySerializeStackX extHookStack) ≤ stk) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok (lsProg_565 H) (lsmpl.base 565) + (withFdsGe3Closed + (idSavePollSpecPlaced rd pathOk A lim (CliIdSavePollEnv rd GetEnv PutStrEnv) stk)) := by + have hSer := publicKeySerialize_lscro_of_fs + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hFs (by decide) + have hGet' := ls_transfer_withFdsGe3Closed_lscro + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hGet (by decide) hGetBlk hGetUnmut + have hPut' := ls_transfer_withFdsGe3Closed_lscro + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hPut (by decide) hPutBlk hPutUnmut + have hDec' := ls_transfer_withFdsGe3Closed_cl_to_lscro + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hDec (by decide) hDecBlk hDecUnmut + have hEq' := ls_transfer_withFdsGe3Closed_cl_to_lscro + (callerProg := (blkPC_565).rebase (blkPl_565).base H) hEq (by decide) hEqBlk hEqUnmut + exact idSavePoll_placed_ok_of_deps_core_16_fd hFs hSer hGet' hPut' hDec' hEq' hstk + +theorem idSavePoll_placed_ok_of_get_put_bb_fd_sat [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {getProg putProg : Program} {getBlk putBlk : Nat} + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} + (hFs : AllocContractsFsPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (withFdsGe3Closed (dirGetSpecPlaced rd pathOk A lim GetEnv getStk))) + (hPut : subroutine_ok putProg (lsmpl.base 543) + (withFdsGe3Closed (dirPutStrSpecPlaced A lim PutStrEnv putStk))) + (h_bb : HookSat H lsBlackBoxU8Sym blackBoxSpecSat) + (hstk : 208 + max (max (max getStk putStk) (max 96 64)) + (max publicKeySerializeStackX extHookStack) ≤ stk) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok (lsProg_565 H) (lsmpl.base 565) + (withFdsGe3Closed + (idSavePollSpecPlaced rd pathOk A lim (CliIdSavePollEnv rd GetEnv PutStrEnv) stk)) := + idSavePoll_placed_ok_of_deps_16_fd hFs hGet hPut + (identityKey_decode_placed_ok_fd H) + (publicKeyEq_mem_placed_ok_of_bb_16_fd_sat h_bb) hstk hGetBlk hGetUnmut hPutBlk hPutUnmut + +theorem idSavePoll_placed_caller_ok_of_deps_gen_16_fd [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {SaveEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} + {callerProg getProg putProg decProg eqProg : Program} + {callerBlk getBlk putBlk decBlk eqBlk : Nat} + [IsLsBlockProg callerProg callerBlk H] + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} + (hFs : AllocContractsFsPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (withFdsGe3Closed (dirGetSpecPlaced rd pathOk A lim GetEnv getStk))) + (hPut : subroutine_ok putProg (lsmpl.base 543) + (withFdsGe3Closed (dirPutStrSpecPlaced A lim PutStrEnv putStk))) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (withFdsGe3Closed (identityKeyDecodePlacedBudgetSpec A))) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withFdsGe3Closed (withLsCodeLoaded lsmpl (withVmPreserved publicKeyEqMemSpec16)))) + (hFitGet : ∀ F0 x st0, FitsEnv M lim st0 (SaveEnv F0 x) → + FitsEnv M lim st0 (GetEnv F0 x.peers x.call.call.addr.name.bytes)) + (hSaveErr : ∀ F0 x evsGet, + x.peers.get rd F0 x.call.call.addr.val.name = .error () → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + SaveEnv F0 x evsGet) + (hFitSer : ∀ F0 x bs st0 evsGet evsFree, + FitsEnv M lim st0 (SaveEnv F0 x) → + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents (evsGet ++ evsFree) st0) PublicKeySerializeEnv) + (hFitPut : ∀ F0 x bs st0 evsGet evsFree, + FitsEnv M lim st0 (SaveEnv F0 x) → + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + FitsEnv M lim (M.stepEvents ((evsGet ++ evsFree) ++ publicKeySerializeEvents) st0) + (PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize)) + (hSaveOk : ∀ F0 x bs evsGet evsFree evsPut, + x.peers.get rd F0 x.call.call.addr.val.name = .ok bs → + GetEnv F0 x.peers x.call.call.addr.name.bytes evsGet → + FreeOnlyEvs evsFree → + PutStrEnv x.peers x.call.call.addr.name.bytes x.call.call.key.serialize evsPut → + SaveEnv F0 x ((evsGet ++ evsFree) ++ publicKeySerializeEvents ++ evsPut)) + (hstk : 208 + max (max (max getStk putStk) (max 96 64)) + (max publicKeySerializeStackX extHookStack) ≤ stk) + (hCallerBlk : callerBlk < 619 := by decide) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok callerProg (lsmpl.base 565) + (withFdsGe3Closed (idSavePollSpecPlaced rd pathOk A lim SaveEnv stk)) := + ls_transfer_withFdsGe3Closed_lscro (callerProg := callerProg) (j := 565) + (idSavePoll_placed_ok_of_deps_gen_16_fd hFs hGet hPut hDec hEq + hFitGet hSaveErr hFitSer hFitPut hSaveOk hstk + hGetBlk hGetUnmut hPutBlk hPutUnmut hDecBlk hDecUnmut hEqBlk hEqUnmut) hCallerBlk + +theorem idSavePoll_placed_caller_ok_of_deps_16_fd [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {PutStrEnv : DirGhost → List (BitVec 8) → List (BitVec 8) → List AllocEvent → Prop} + {callerProg getProg putProg decProg eqProg : Program} + {callerBlk getBlk putBlk decBlk eqBlk : Nat} + [IsLsBlockProg callerProg callerBlk H] + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg putProg putBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk putStk stk : Nat} + (hFs : AllocContractsFsPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (withFdsGe3Closed (dirGetSpecPlaced rd pathOk A lim GetEnv getStk))) + (hPut : subroutine_ok putProg (lsmpl.base 543) + (withFdsGe3Closed (dirPutStrSpecPlaced A lim PutStrEnv putStk))) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (withFdsGe3Closed (identityKeyDecodePlacedBudgetSpec A))) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withFdsGe3Closed (withLsCodeLoaded lsmpl (withVmPreserved publicKeyEqMemSpec16)))) + (hstk : 208 + max (max (max getStk putStk) (max 96 64)) + (max publicKeySerializeStackX extHookStack) ≤ stk) + (hCallerBlk : callerBlk < 619 := by decide) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hPutBlk : putBlk < 619 := by decide) + (hPutUnmut : (putBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok callerProg (lsmpl.base 565) + (withFdsGe3Closed + (idSavePollSpecPlaced rd pathOk A lim (CliIdSavePollEnv rd GetEnv PutStrEnv) stk)) := + ls_transfer_withFdsGe3Closed_lscro (callerProg := callerProg) (j := 565) + (idSavePoll_placed_ok_of_deps_16_fd hFs hGet hPut hDec hEq hstk + hGetBlk hGetUnmut hPutBlk hPutUnmut hDecBlk hDecUnmut hEqBlk hEqUnmut) hCallerBlk + end Placed end LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePollPlacedBudgetFd diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPoll/SymPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPoll/SymPlaced.lean index 66c17f055..7a4e55fc8 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPoll/SymPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPoll/SymPlaced.lean @@ -14,6 +14,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPoll public import LibsignalBinary.Proofs.SignalSession.Cli.CliSessionCodeSymB public import LibsignalBinary.Proofs.RecordCodecs.IdentityKeyDecode public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEq +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat public meta import ProofLib public meta import LibsignalBinary.Proofs.Common.InImageKit public meta import LibsignalBinary.Proofs.SignalSession.Cli.Store.ShimCommonPlaced @@ -401,6 +402,55 @@ theorem pkEq_cells_placed_ok [LibsignalPlacement] {prog : Program} {calleeStk : · dsimp only [StoreKit.withLsCodeRoLoaded, Getters.publicKeyEqSpec] at hq exact (not_satisfies_false_sepConj hq).elim +theorem pkEq_cells_placed_ok_16 [LibsignalPlacement] {prog : Program} {calleeStk : Nat} + (hEq : subroutine_ok prog (lsmpl.base 212) + (StoreKit.withLsCodeRoLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)) + (hle : 80 ≤ calleeStk) (hhi : calleeStk ≤ 2 ^ 64) : + subroutine_ok prog (lsmpl.base 212) + (StoreKit.withLsCodeRoLoaded lsmpl (pkEqCellsSpec calleeStk)) := by + apply subroutine_ok.of_codeLoaded + intro ⟨p1, ik1, p2, ik2, fsp⟩ R s0 hpc hrun hpre hsp hcl + rcases StoreKit.extract_withLsCodeRoLoaded hpre with ⟨hcrl, hpre⟩ + simp only [pkEqCellsSpec, sepConj_assoc, satisfies_pure_sepConj] at hpre + rcases hpre with ⟨⟨hx0, hx1, hfsp⟩, hmem⟩ + subst hfsp + rw [stackAt_sub_split s0.sp hle hhi] at hmem + let stkRem := memRegion (s0.sp - BitVec.ofNat 64 calleeStk) (calleeStk - 80) + have hpre0 : s0.mem ⊨ + (StoreKit.withLsCodeRoLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16).pre + (p1, ik1.publicKey, p2, ik2.publicKey, s0.sp) s0 ∗ (stkRem ∗ R) := by + refine satisfies_lscro_pre hcrl ?_ + dsimp only [LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] + rw [sepConj_assoc, satisfies_pure_sepConj] + refine ⟨⟨hx0, hx1, rfl⟩, ?_⟩ + dsimp only [stackAt, stkRem] at hmem ⊢ + convert hmem using 1; ac_rfl + rcases hEq.no_fault_before_outcome (p1, ik1.publicKey, p2, ik2.publicKey, s0.sp) + (stkRem ∗ R) s0 hpc hrun hpre0 hsp hcl with + ⟨sf, hsteps, ⟨hret, hcc, hq⟩ | ⟨_hpan, hq⟩ | ⟨_code, _hex, hq⟩ | ⟨_hoom, hq⟩, -⟩ + · refine reaches_outcome_steps hsteps (reaches_outcome.of_outcome (Or.inl ⟨hret, hcc, ?_⟩)) + dsimp only [StoreKit.withLsCodeRoLoaded, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16, + pkEqCellsSpec] at hq ⊢ + rw [sepConj_assoc, satisfies_pure_sepConj] at hq ⊢ + rcases hq with ⟨⟨hr0, htr⟩, hq⟩ + rw [publicKey_beq_eq_decide] at hr0 + refine ⟨⟨hr0, htr⟩, ?_⟩ + rw [stackAt_sub_split s0.sp hle hhi] + dsimp only [stackAt, stkRem] at hq ⊢ + convert hq using 1; ac_rfl + · dsimp only [StoreKit.withLsCodeRoLoaded, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hq + exact (not_satisfies_false_sepConj hq).elim + · dsimp only [StoreKit.withLsCodeRoLoaded, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hq + exact (not_satisfies_false_sepConj hq).elim + · dsimp only [StoreKit.withLsCodeRoLoaded, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hq + exact (not_satisfies_false_sepConj hq).elim + /-! ## 2. Inner Spec & Outer Wrapper (`idTrustPoll_placed_of_inner`) -/ def cliIdTrustPollInnerSpecPlaced [LibsignalPlacement] (rd : ReadRule) @@ -818,15 +868,17 @@ private theorem cliIdTrustPollExpandedSpecPlaced_eq [LibsignalPlacement] (rd : R set_option pp.deepTerms false in set_option pp.maxSteps 1000000 in set_option maxHeartbeats 3200000 in -theorem idTrustPollInner_placed_ok [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} +private theorem idTrustPollInner_placed_ok_of_eqCells [LibsignalPlacement] + {A : RustAlloc} {H : LibsignalHooks} {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk : Nat} (hC : AllocContractsXCliPlaced A H) (hGet : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 589) (dirGetSpecPlaced rd pathOk A getStk)) (hDec : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 18) (StoreKit.withLsCodeRoLoaded lsmpl (RecordCodecsBinary.identityKeyDecodeRawSpec A))) - (hEq : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 212) - (StoreKit.withLsCodeRoLoaded lsmpl Getters.publicKeyEqSpec)) + (hEqCells : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 212) + (StoreKit.withLsCodeRoLoaded lsmpl + (pkEqCellsSpec (max (max getStk 0x60) (max 64 extHookStack))))) (hhi : max (max getStk 0x60) (max 64 extHookStack) ≤ 2 ^ 64) : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (blkPl_566).base (StoreKit.withLsCodeRoLoaded lsmpl @@ -841,8 +893,7 @@ theorem idTrustPollInner_placed_ok [LibsignalPlacement] {A : RustAlloc} {H : Lib have hDecCells := ikDecode_cells_placed_ok (calleeStk := calleeStk) hDec (by omega) hhi have hDeallocCells := deallocVecBuf_placed_ok (prog := (blkPC_566).rebase (blkPl_566).base H) (i := 566) (calleeStk := calleeStk) hC (by omega) hhi - have hEqCells := pkEq_cells_placed_ok (calleeStk := calleeStk) hEq (by omega) hhi - clear hGet hDec hEq hC + clear hGet hDec hC wpp_init x s0 have hcrl0 : StoreKit.LibsignalCodeRoLoaded lsmpl s0.mem := by assumption @@ -1042,6 +1093,45 @@ theorem idTrustPollInner_placed_ok [LibsignalPlacement] {A : RustAlloc} {H : Lib · exact ⟨⟨hget, by simp only [wp_norm, arm64_norm, *]⟩, ⟨ik, rfl, hser⟩⟩ wp_done +theorem idTrustPollInner_placed_ok [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk : Nat} + (hC : AllocContractsXCliPlaced A H) + (hGet : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A getStk)) + (hDec : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 18) + (StoreKit.withLsCodeRoLoaded lsmpl (RecordCodecsBinary.identityKeyDecodeRawSpec A))) + (hEq : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 212) + (StoreKit.withLsCodeRoLoaded lsmpl Getters.publicKeyEqSpec)) + (hhi : max (max getStk 0x60) (max 64 extHookStack) ≤ 2 ^ 64) : + subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (blkPl_566).base + (StoreKit.withLsCodeRoLoaded lsmpl + (cliIdTrustPollInnerSpecPlaced rd pathOk A + (max (max getStk 0x60) (max 64 extHookStack)))) := + idTrustPollInner_placed_ok_of_eqCells hC hGet hDec + (pkEq_cells_placed_ok (calleeStk := max (max getStk 0x60) (max 64 extHookStack)) + hEq (by omega) hhi) + hhi + +theorem idTrustPollInner_placed_ok_16 [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk : Nat} + (hC : AllocContractsXCliPlaced A H) + (hGet : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A getStk)) + (hDec : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 18) + (StoreKit.withLsCodeRoLoaded lsmpl (RecordCodecsBinary.identityKeyDecodeRawSpec A))) + (hEq : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 212) + (StoreKit.withLsCodeRoLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)) + (hhi : max (max getStk 0x60) (max 64 extHookStack) ≤ 2 ^ 64) : + subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (blkPl_566).base + (StoreKit.withLsCodeRoLoaded lsmpl + (cliIdTrustPollInnerSpecPlaced rd pathOk A + (max (max getStk 0x60) (max 64 extHookStack)))) := + idTrustPollInner_placed_ok_of_eqCells hC hGet hDec + (pkEq_cells_placed_ok_16 (calleeStk := max (max getStk 0x60) (max 64 extHookStack)) + hEq (by omega) hhi) + hhi + end Placed end CryptoVerification.SignalSession.Cli.Store.IdTrustPoll.Helpers diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPoll/SymPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPoll/SymPlacedBudget.lean index 506b963de..1ba9649fa 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPoll/SymPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPoll/SymPlacedBudget.lean @@ -11,6 +11,7 @@ module public import LibsignalBinary.Proofs.Common.SharedHelpers public meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat public import LibsignalBinary.Proofs.Placed.BudgetPoolSync public meta import LibsignalBinary.Proofs.Placed.BudgetPoolSync -- shake: keep public import LibsignalBinary.Proofs.RecordCodecs.DepsBudget @@ -411,6 +412,60 @@ theorem pkEq_cells_placed_ok [LibsignalPlacement] {prog : Program} {M : AllocCos · dsimp only [withLsCodeRoLoaded, withVmPreserved, publicKeyEqSpec] at hq exact (not_satisfies_false_sepConj hq).elim +theorem pkEq_cells_placed_ok_16 [LibsignalPlacement] {prog : Program} {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {calleeStk : Nat} + (hEq : subroutine_ok prog (lsmpl.base 212) + (withLsCodeRoLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16))) + (hle : 80 ≤ calleeStk) (hhi : calleeStk ≤ 2 ^ 64) : + subroutine_ok prog (lsmpl.base 212) + (withLsCodeRoLoaded lsmpl (pkEqCellsSpecPlaced A lim calleeStk)) := by + apply subroutine_ok.of_codeLoaded + intro ⟨⟨p1, ik1, p2, ik2, fsp⟩, st⟩ R s0 hpc hrun hpre hsp hcl + rcases extract_withLsCodeRoLoaded hpre with ⟨hcrl, hpre⟩ + simp only [pkEqCellsSpecPlaced, sepConj_assoc, satisfies_pure_sepConj] at hpre + rcases hpre with ⟨⟨hx0, hx1, hfsp⟩, hmem⟩ + subst hfsp + rw [stackAt_sub_split s0.sp hle hhi] at hmem + let stkRem := memRegion (s0.sp - BitVec.ofNat 64 calleeStk) (calleeStk - 80) + have hpre0 : s0.mem ⊨ + (withLsCodeRoLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)).pre + (p1, ik1.publicKey, p2, ik2.publicKey, s0.sp) s0 ∗ (A.pool lim st s0 ∗ stkRem ∗ R) := by + refine satisfies_lscro_pre hcrl ?_ + dsimp only [withVmPreserved, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] + rw [sepConj_assoc, satisfies_pure_sepConj] + refine ⟨⟨hx0, hx1, rfl⟩, ?_⟩ + dsimp only [stackAt, stkRem] at hmem ⊢ + convert hmem using 1; sep_ac_rfl + rcases hEq.no_fault_before_outcome (p1, ik1.publicKey, p2, ik2.publicKey, s0.sp) + (A.pool lim st s0 ∗ stkRem ∗ R) s0 hpc hrun hpre0 hsp hcl with + ⟨sf, hsteps, ⟨hret, hcc, hq⟩ | ⟨_hpan, hq⟩ | ⟨_code, _hex, hq⟩ | ⟨_hoom, hq⟩, -⟩ + · refine reaches_outcome_steps hsteps (reaches_outcome.of_outcome (Or.inl ⟨hret, hcc, ?_⟩)) + dsimp only [withLsCodeRoLoaded, withVmPreserved, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16, + pkEqCellsSpecPlaced] at hq ⊢ + simp only [sepConj_assoc, satisfies_pure_sepConj] at hq ⊢ + rcases hq with ⟨hvm, ⟨hr0, htr⟩, hq⟩ + rw [publicKey_beq_eq_decide] at hr0 + rw [← A.pool_transport lim st s0 sf hvm] at hq + refine ⟨⟨hr0, htr⟩, ?_⟩ + rw [stackAt_sub_split s0.sp hle hhi] + dsimp only [stackAt, stkRem] at hq ⊢ + convert hq using 1; sep_ac_rfl + · dsimp only [withLsCodeRoLoaded, withVmPreserved, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hq + exact (not_satisfies_false_sepConj hq).elim + · dsimp only [withLsCodeRoLoaded, withVmPreserved, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hq + exact (not_satisfies_false_sepConj hq).elim + · dsimp only [withLsCodeRoLoaded, withVmPreserved, + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16] at hq + exact (not_satisfies_false_sepConj hq).elim + /-! ## 2. Inner Spec & Outer Wrapper (`idTrustPoll_placed_of_inner`) -/ def cliIdTrustPollInnerSpecPlaced [LibsignalPlacement] {M : AllocCostModel} (rd : ReadRule) @@ -796,7 +851,7 @@ private theorem cliIdTrustPollExpandedSpecPlaced_eq [LibsignalPlacement] {M : Al set_option pp.deepTerms false in set_option pp.maxSteps 1000000 in set_option maxHeartbeats 3200000 in -theorem idTrustPollInner_placed_ok [LibsignalPlacement] {M : AllocCostModel} +private theorem idTrustPollInner_placed_ok_of_eqCells [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} {TrustEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} @@ -806,8 +861,9 @@ theorem idTrustPollInner_placed_ok [LibsignalPlacement] {M : AllocCostModel} (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) (hDec : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 18) (withLsCodeRoLoaded lsmpl (withVmPreserved (identityKeyDecodeRawSpec A)))) - (hEq : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 212) - (withLsCodeRoLoaded lsmpl (withVmPreserved publicKeyEqSpec))) + (hEqCells : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 212) + (withLsCodeRoLoaded lsmpl + (pkEqCellsSpecPlaced A lim (max (max getStk 0x60) (max 64 extHookStack))))) (hFitGet : ∀ F0 x st, FitsEnv M lim st (TrustEnv F0 x) → FitsEnv M lim st (GetEnv F0 x.peers x.call.call.addr.name.bytes)) (hTrustGet : ∀ F0 x evs, GetEnv F0 x.peers x.call.call.addr.name.bytes evs → @@ -830,9 +886,7 @@ theorem idTrustPollInner_placed_ok [LibsignalPlacement] {M : AllocCostModel} hDec (by omega) hhi have hDeallocCells := deallocVecBuf_placed_ok (prog := (blkPC_566).rebase (blkPl_566).base H) (i := 566) (calleeStk := calleeStk) hC (by omega) hhi - have hEqCells := pkEq_cells_placed_ok (A := A) (lim := lim) (calleeStk := calleeStk) - hEq (by omega) hhi - clear hGet hDec hEq hC + clear hGet hDec hC wpp_init xs s0 obtain ⟨x, st⟩ := xs dsimp only at * @@ -1095,6 +1149,66 @@ theorem idTrustPollInner_placed_ok [LibsignalPlacement] {M : AllocCostModel} hget_evs (FreeOnlyEvs.singleton 1 bCap.toNat)⟩ wp_done +theorem idTrustPollInner_placed_ok [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {TrustEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hGet : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (hDec : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 18) + (withLsCodeRoLoaded lsmpl (withVmPreserved (identityKeyDecodeRawSpec A)))) + (hEq : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 212) + (withLsCodeRoLoaded lsmpl (withVmPreserved publicKeyEqSpec))) + (hFitGet : ∀ F0 x st, FitsEnv M lim st (TrustEnv F0 x) → + FitsEnv M lim st (GetEnv F0 x.peers x.call.call.addr.name.bytes)) + (hTrustGet : ∀ F0 x evs, GetEnv F0 x.peers x.call.call.addr.name.bytes evs → + TrustEnv F0 x evs) + (hTrustGetFree : ∀ F0 x evs₁ evs₂, + GetEnv F0 x.peers x.call.call.addr.name.bytes evs₁ → FreeOnlyEvs evs₂ → + TrustEnv F0 x (evs₁ ++ evs₂)) + (hhi : max (max getStk 0x60) (max 64 extHookStack) ≤ 2 ^ 64) : + subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (blkPl_566).base + (withLsCodeRoLoaded lsmpl + (cliIdTrustPollInnerSpecPlaced rd pathOk A lim TrustEnv + (max (max getStk 0x60) (max 64 extHookStack)))) := + idTrustPollInner_placed_ok_of_eqCells hC hGet hDec + (pkEq_cells_placed_ok (A := A) (lim := lim) + (calleeStk := max (max getStk 0x60) (max 64 extHookStack)) hEq (by omega) hhi) + hFitGet hTrustGet hTrustGetFree hhi + +theorem idTrustPollInner_placed_ok_16 [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {TrustEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hGet : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (hDec : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 18) + (withLsCodeRoLoaded lsmpl (withVmPreserved (identityKeyDecodeRawSpec A)))) + (hEq : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 212) + (withLsCodeRoLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16))) + (hFitGet : ∀ F0 x st, FitsEnv M lim st (TrustEnv F0 x) → + FitsEnv M lim st (GetEnv F0 x.peers x.call.call.addr.name.bytes)) + (hTrustGet : ∀ F0 x evs, GetEnv F0 x.peers x.call.call.addr.name.bytes evs → + TrustEnv F0 x evs) + (hTrustGetFree : ∀ F0 x evs₁ evs₂, + GetEnv F0 x.peers x.call.call.addr.name.bytes evs₁ → FreeOnlyEvs evs₂ → + TrustEnv F0 x (evs₁ ++ evs₂)) + (hhi : max (max getStk 0x60) (max 64 extHookStack) ≤ 2 ^ 64) : + subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (blkPl_566).base + (withLsCodeRoLoaded lsmpl + (cliIdTrustPollInnerSpecPlaced rd pathOk A lim TrustEnv + (max (max getStk 0x60) (max 64 extHookStack)))) := + idTrustPollInner_placed_ok_of_eqCells hC hGet hDec + (pkEq_cells_placed_ok_16 (A := A) (lim := lim) + (calleeStk := max (max getStk 0x60) (max 64 extHookStack)) hEq (by omega) hhi) + hFitGet hTrustGet hTrustGetFree hhi + theorem idTrustPollInner_env_placed_ok [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} @@ -1117,6 +1231,30 @@ theorem idTrustPollInner_env_placed_ok [LibsignalPlacement] {M : AllocCostModel} (fun _ _ _ _ => CliIdTrustPollEnv.of_get_freeOnly) hhi +theorem idTrustPollInner_env_placed_ok_16 [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hGet : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (hDec : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 18) + (withLsCodeRoLoaded lsmpl (withVmPreserved (identityKeyDecodeRawSpec A)))) + (hEq : subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (lsmpl.base 212) + (withLsCodeRoLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16))) + (hhi : max (max getStk 0x60) (max 64 extHookStack) ≤ 2 ^ 64) : + subroutine_ok ((blkPC_566).rebase (blkPl_566).base H) (blkPl_566).base + (withLsCodeRoLoaded lsmpl + (cliIdTrustPollInnerSpecPlaced rd pathOk A lim (CliIdTrustPollEnv GetEnv) + (max (max getStk 0x60) (max 64 extHookStack)))) := + idTrustPollInner_placed_ok_16 hC hGet hDec hEq + (fun _ _ _ => CliIdTrustPollEnv.fits_get) + (fun _ _ _ => CliIdTrustPollEnv.of_get) + (fun _ _ _ _ => CliIdTrustPollEnv.of_get_freeOnly) + hhi + end Placed end LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPoll.SymPlacedBudget diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPollPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPollPlaced.lean index ce5482aa1..c08a5170a 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPollPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPollPlaced.lean @@ -9,6 +9,7 @@ limitations under the License. module +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat public import LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPoll public import LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPoll.SymPlaced import Arm64.Trusted.Spec.Hoare @@ -127,6 +128,106 @@ theorem idTrustPoll_placed_caller_ok_of_deps [LibsignalPlacement] {A : RustAlloc (idTrustPoll_placed_ok_of_deps hC hGet hDec hEq hstk hGetBlk hGetUnmut hDecBlk hDecUnmut hEqBlk hEqUnmut) hCallerBlk +/-- `::eq` (Block `212`) on `publicKeyEqSpec16` (`80 = 64 + 16` B) +under `HookSat H lsBlackBoxU8Sym blackBoxSpecSat`. -/ +theorem publicKeyEq_placed_ok_of_bb_16_sat [LibsignalPlacement] {H : LibsignalHooks} + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : + subroutine_ok ((blkPC_212).rebase (blkPl_212).base H) + (lsmpl.base 212) + (withLsCodeLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqSpec16) := + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKey_eq_placed_ok_16_sat h_bb + +/-- `::eq` (Block `212`) on `publicKeyEqMemSpec16` (`80 = 64 + 16` B) +under `HookSat H lsBlackBoxU8Sym blackBoxSpecSat`. -/ +theorem publicKeyEq_mem_placed_ok_of_bb_16_sat [LibsignalPlacement] {H : LibsignalHooks} + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : + subroutine_ok ((blkPC_212).rebase (blkPl_212).base H) + (lsmpl.base 212) + (withLsCodeLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16) := + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKey_eq_mem_placed_ok_16_sat h_bb + +/-- `80`-byte `publicKeyEqMemSpec16` sibling of `idTrustPoll_placed_ok_of_deps` (identical `hstk`!). -/ +theorem idTrustPoll_placed_ok_of_deps_16 [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} + {getProg decProg eqProg : Program} {getBlk decBlk eqBlk : Nat} + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk stk : Nat} + (hC : AllocContractsXCliPlaced A H) + (hGet : subroutine_ok getProg (lsmpl.base 589) (dirGetSpecPlaced rd pathOk A getStk)) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (RecordCodecsBinary.identityKeyDecodePlacedSpec A)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)) + (hstk : 0xc0 + max (max getStk 0x60) (max 64 extHookStack) ≤ stk) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok (lsProg_566 H) (lsmpl.base 566) + (idTrustPollSpecPlaced rd pathOk A stk) := by + have hGet' := ls_transfer_lscro (callerProg := (blkPC_566).rebase (blkPl_566).base H) + hGet (by decide) hGetBlk hGetUnmut + have hDec' := ls_transfer_cl_to_lscro (callerProg := (blkPC_566).rebase (blkPl_566).base H) + hDec (by decide) hDecBlk hDecUnmut + have hEq' := ls_transfer_cl_to_lscro (callerProg := (blkPC_566).rebase (blkPl_566).base H) + hEq (by decide) hEqBlk hEqUnmut + exact Helpers.idTrustPoll_placed_of_inner + (fun hhi => Helpers.idTrustPollInner_placed_ok_16 hC hGet' hDec' hEq' hhi) hstk + +/-- `HookSat`-backed sibling of `idTrustPoll_placed_ok_of_get_bb`. -/ +theorem idTrustPoll_placed_ok_of_get_bb_sat [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} + {getProg : Program} {getBlk : Nat} [IsLsBlockProg getProg getBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk stk : Nat} + (hC : AllocContractsXCliPlaced A H) + (hGet : subroutine_ok getProg (lsmpl.base 589) (dirGetSpecPlaced rd pathOk A getStk)) + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) + (hstk : 0xc0 + max (max getStk 0x60) (max 64 extHookStack) ≤ stk) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok (lsProg_566 H) (lsmpl.base 566) + (idTrustPollSpecPlaced rd pathOk A stk) := + idTrustPoll_placed_ok_of_deps_16 hC hGet + (RecordCodecsBinary.IdentityKeyDecode.identityKey_decode_placed_ok H) + (publicKeyEq_mem_placed_ok_of_bb_16_sat h_bb) hstk hGetBlk hGetUnmut + +theorem idTrustPoll_placed_caller_ok_of_deps_16 [LibsignalPlacement] {A : RustAlloc} + {H : LibsignalHooks} {callerProg getProg decProg eqProg : Program} + {callerBlk getBlk decBlk eqBlk : Nat} + [IsLsBlockProg callerProg callerBlk H] + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk stk : Nat} + (hC : AllocContractsXCliPlaced A H) + (hGet : subroutine_ok getProg (lsmpl.base 589) (dirGetSpecPlaced rd pathOk A getStk)) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (RecordCodecsBinary.identityKeyDecodePlacedSpec A)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)) + (hstk : 0xc0 + max (max getStk 0x60) (max 64 extHookStack) ≤ stk) + (hCallerBlk : callerBlk < 619 := by decide) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok callerProg (lsmpl.base 566) + (idTrustPollSpecPlaced rd pathOk A stk) := + ls_transfer_lscro (callerProg := callerProg) (j := 566) + (idTrustPoll_placed_ok_of_deps_16 hC hGet hDec hEq hstk + hGetBlk hGetUnmut hDecBlk hDecUnmut hEqBlk hEqUnmut) hCallerBlk + end Placed end CryptoVerification.SignalSession.Cli.Store.IdTrustPoll diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPollPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPollPlacedBudget.lean index c3500f264..cea43ab6f 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPollPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/IdTrustPollPlacedBudget.lean @@ -13,6 +13,7 @@ public import LibsignalBinary.Proofs.Common.SharedHelpers public meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep public import LibsignalBinary.Proofs.Placed.BudgetPoolSync public meta import LibsignalBinary.Proofs.Placed.BudgetPoolSync -- shake: keep +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.LoopBudget public import LibsignalBinary.Proofs.TripleRatchet.Getters.IdentityBudget public import LibsignalBinary.Proofs.RecordCodecs.IdentityKeyDecode @@ -438,6 +439,206 @@ theorem idTrustPoll_placed_caller_ok_of_deps [LibsignalPlacement] {M : AllocCost (idTrustPoll_placed_ok_of_deps hC hGet hDec hEq hstk hGetBlk hGetUnmut hDecBlk hDecUnmut hEqBlk hEqUnmut) hCallerBlk +/-- `::eq` (Block `212`) on `withVmPreserved publicKeyEqSpec16` +(`80 = 64 + 16` B) under `HookSat H lsBlackBoxU8Sym blackBoxSpecSat`. -/ +theorem publicKeyEq_placed_ok_of_bb_16_sat [LibsignalPlacement] {H : LibsignalHooks} + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : + subroutine_ok ((blkPC_212).rebase (blkPl_212).base H) + (lsmpl.base 212) + (withLsCodeLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqSpec16)) := + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKey_eq_placed_vm_ok_16_sat h_bb + +/-- `::eq` (Block `212`) on `withVmPreserved publicKeyEqMemSpec16` +(`80 = 64 + 16` B) under `HookSat H lsBlackBoxU8Sym blackBoxSpecSat`. -/ +theorem publicKeyEq_mem_placed_ok_of_bb_16_sat [LibsignalPlacement] {H : LibsignalHooks} + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) : + subroutine_ok ((blkPC_212).rebase (blkPl_212).base H) + (lsmpl.base 212) + (withLsCodeLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16)) := + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKey_eq_mem_placed_vm_ok_16_sat h_bb + +theorem idTrustPoll_placed_ok_of_deps_gen_16 [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {TrustEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} + {getProg decProg eqProg : Program} {getBlk decBlk eqBlk : Nat} + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk stk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (identityKeyDecodePlacedBudgetSpec A)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16))) + (hFitGet : ∀ F0 x st, FitsEnv M lim st (TrustEnv F0 x) → + FitsEnv M lim st (GetEnv F0 x.peers x.call.call.addr.name.bytes)) + (hTrustGet : ∀ F0 x evs, GetEnv F0 x.peers x.call.call.addr.name.bytes evs → + TrustEnv F0 x evs) + (hTrustGetFree : ∀ F0 x evs₁ evs₂, + GetEnv F0 x.peers x.call.call.addr.name.bytes evs₁ → FreeOnlyEvs evs₂ → + TrustEnv F0 x (evs₁ ++ evs₂)) + (hstk : 0xc0 + max (max getStk 0x60) (max 64 extHookStack) ≤ stk) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok (lsProg_566 H) (lsmpl.base 566) + (idTrustPollSpecPlaced rd pathOk A lim TrustEnv stk) := by + have hGet' := ls_transfer_lscro (callerProg := lsProg_566 H) + hGet (by decide) hGetBlk hGetUnmut + have hDec' := ls_transfer_cl_to_lscro (callerProg := lsProg_566 H) + hDec (by decide) hDecBlk hDecUnmut + have hEq' := ls_transfer_cl_to_lscro (callerProg := lsProg_566 H) + hEq (by decide) hEqBlk hEqUnmut + exact idTrustPoll_placed_of_inner + (fun hhi => + LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPoll.SymPlacedBudget.idTrustPollInner_placed_ok_16 + hC hGet' hDec' hEq' hFitGet hTrustGet hTrustGetFree hhi) hstk + +theorem idTrustPoll_placed_ok_of_deps_16 [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {getProg decProg eqProg : Program} {getBlk decBlk eqBlk : Nat} + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk stk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (identityKeyDecodePlacedBudgetSpec A)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16))) + (hstk : 0xc0 + max (max getStk 0x60) (max 64 extHookStack) ≤ stk) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok (lsProg_566 H) (lsmpl.base 566) + (idTrustPollSpecPlaced rd pathOk A lim (CliIdTrustPollEnv GetEnv) stk) := by + have hGet' := ls_transfer_lscro (callerProg := lsProg_566 H) + hGet (by decide) hGetBlk hGetUnmut + have hDec' := ls_transfer_cl_to_lscro (callerProg := lsProg_566 H) + hDec (by decide) hDecBlk hDecUnmut + have hEq' := ls_transfer_cl_to_lscro (callerProg := lsProg_566 H) + hEq (by decide) hEqBlk hEqUnmut + exact idTrustPoll_placed_of_inner + (fun hhi => + LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPoll.SymPlacedBudget.idTrustPollInner_env_placed_ok_16 + hC hGet' hDec' hEq' hhi) hstk + +theorem idTrustPoll_placed_ok_of_get_bb_sat [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {getProg : Program} {getBlk : Nat} [IsLsBlockProg getProg getBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk stk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (h_bb : HookSat H lsBlackBoxU8Sym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat) + (hstk : 0xc0 + max (max getStk 0x60) (max 64 extHookStack) ≤ stk) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok (lsProg_566 H) (lsmpl.base 566) + (idTrustPollSpecPlaced rd pathOk A lim (CliIdTrustPollEnv GetEnv) stk) := + idTrustPoll_placed_ok_of_deps_16 hC hGet + (identityKey_decode_placed_ok H) + (publicKeyEq_mem_placed_ok_of_bb_16_sat h_bb) hstk hGetBlk hGetUnmut + +theorem idTrustPoll_placed_caller_ok_of_deps_gen_16 [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {TrustEnv : FsFiles → IdPollGhost → List AllocEvent → Prop} + {callerProg getProg decProg eqProg : Program} + {callerBlk getBlk decBlk eqBlk : Nat} + [IsLsBlockProg callerProg callerBlk H] + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk stk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (identityKeyDecodePlacedBudgetSpec A)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16))) + (hFitGet : ∀ F0 x st, FitsEnv M lim st (TrustEnv F0 x) → + FitsEnv M lim st (GetEnv F0 x.peers x.call.call.addr.name.bytes)) + (hTrustGet : ∀ F0 x evs, GetEnv F0 x.peers x.call.call.addr.name.bytes evs → + TrustEnv F0 x evs) + (hTrustGetFree : ∀ F0 x evs₁ evs₂, + GetEnv F0 x.peers x.call.call.addr.name.bytes evs₁ → FreeOnlyEvs evs₂ → + TrustEnv F0 x (evs₁ ++ evs₂)) + (hstk : 0xc0 + max (max getStk 0x60) (max 64 extHookStack) ≤ stk) + (hCallerBlk : callerBlk < 619 := by decide) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok callerProg (lsmpl.base 566) + (idTrustPollSpecPlaced rd pathOk A lim TrustEnv stk) := + ls_transfer_lscro (callerProg := callerProg) (j := 566) + (idTrustPoll_placed_ok_of_deps_gen_16 hC hGet hDec hEq + hFitGet hTrustGet hTrustGetFree hstk + hGetBlk hGetUnmut hDecBlk hDecUnmut hEqBlk hEqUnmut) hCallerBlk + +theorem idTrustPoll_placed_caller_ok_of_deps_16 [LibsignalPlacement] {M : AllocCostModel} + {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} + {GetEnv : FsFiles → DirGhost → List (BitVec 8) → List AllocEvent → Prop} + {callerProg getProg decProg eqProg : Program} + {callerBlk getBlk decBlk eqBlk : Nat} + [IsLsBlockProg callerProg callerBlk H] + [IsLsBlockProg getProg getBlk H] + [IsLsBlockProg decProg decBlk H] + [IsLsBlockProg eqProg eqBlk H] + {rd : ReadRule} {pathOk : List (BitVec 8) → Prop} {getStk stk : Nat} + (hC : AllocContractsXCliPlaced A lim H) + (hGet : subroutine_ok getProg (lsmpl.base 589) + (dirGetSpecPlaced rd pathOk A lim GetEnv getStk)) + (hDec : subroutine_ok decProg (lsmpl.base 18) + (identityKeyDecodePlacedBudgetSpec A)) + (hEq : subroutine_ok eqProg (lsmpl.base 212) + (withLsCodeLoaded lsmpl + (withVmPreserved + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.publicKeyEqMemSpec16))) + (hstk : 0xc0 + max (max getStk 0x60) (max 64 extHookStack) ≤ stk) + (hCallerBlk : callerBlk < 619 := by decide) + (hGetBlk : getBlk < 619 := by decide) + (hGetUnmut : (getBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hDecBlk : decBlk < 619 := by decide) + (hDecUnmut : (decBlk ∈ libsignalMutatedBlocks) = false := by decide) + (hEqBlk : eqBlk < 619 := by decide) + (hEqUnmut : (eqBlk ∈ libsignalMutatedBlocks) = false := by decide) : + subroutine_ok callerProg (lsmpl.base 566) + (idTrustPollSpecPlaced rd pathOk A lim (CliIdTrustPollEnv GetEnv) stk) := + ls_transfer_lscro (callerProg := callerProg) (j := 566) + (idTrustPoll_placed_ok_of_deps_16 hC hGet hDec hEq hstk + hGetBlk hGetUnmut hDecBlk hDecUnmut hEqBlk hEqUnmut) hCallerBlk + end Placed end LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudget diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/SerGlueXCliPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/SerGlueXCliPlaced.lean index 4eaec3f7a..40c4d9ba0 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/SerGlueXCliPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/SerGlueXCliPlaced.lean @@ -38,8 +38,7 @@ open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns open CryptoVerification.SignalSession.Cli.Slots (CliGhostA0Hooks a0Ghost cliGhostA0Hooks_a0Ghost cliExternsPlaced_alloc_sat cliExternsPlaced_dealloc_sat cliExternsPlaced_realloc_sat - cliExternsPlaced_shim_sat cliExternsPlaced_sessionMemmove_sat cliExternsPlaced_sessionMemcpy_sat - cliGhostExterns_sat_of_cliExternsPlaced + cliExternsPlaced_shim_sat cliExternsPlaced_sessionMemcpy_sat cliGhostExterns_panic_handle_error cliGhostExterns_panic_handle_alloc_error) section Placed @@ -56,8 +55,6 @@ theorem serContractsX_placed_of_cliHooks [LibsignalPlacement] (mmpl : Obj.MultiP (cliExternsPlaced_dealloc_sat mmpl g W hG) (cliExternsPlaced_realloc_sat mmpl g W hG) (cliExternsPlaced_shim_sat mmpl g W hG.shim_eq) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sessionMemmove_sat mmpl W _)) (cliExternsPlaced_sessionMemcpy_sat mmpl g W hG _) (cliGhostExterns_panic_handle_error mmpl g W) (cliGhostExterns_panic_handle_alloc_error mmpl g W) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/SerGlueXCliPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/SerGlueXCliPlacedBudget.lean index 17013a2ff..66ee11ec1 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/SerGlueXCliPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/SerGlueXCliPlacedBudget.lean @@ -41,7 +41,6 @@ open CryptoVerification.LibsignalPublicApiRepr (RecordGhost) open CryptoVerification.LibsignalTripleRatchet (extHookStack) open CryptoVerification.SignalSession (CliHooks cliExternsPlaced) open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) -open CryptoVerification.SignalSession.Cli.Slots (cliGhostExterns_sat_of_cliExternsPlaced) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits RustCliAllocBudget) open LibsignalBinary.Proofs.PublicApi.StoreKit.Over.ArchiveAuxBudget (EncodeRawPreallocPlacedOkX encodeRawPreallocSpecX) @@ -54,7 +53,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks bumpGhost cliGhostAllocHooks_bumpGhost cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_realloc_budget_sat cliExternsPlaced_sessionMemcpy_budget_sat - cliExternsPlaced_sessionMemmove_budget_sat cliExternsPlaced_shim_budget_sat) + cliExternsPlaced_shim_budget_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Store.SerGlueXPlacedBudget (hSerEnv_placed_cl_of_serContractsX hSerEnv_placed_lscro_of_serContractsX hSerEnv_placed_ok_of_serContractsX hSer_placed_cl_of_serContractsX @@ -110,8 +109,6 @@ theorem serContractsX_cli_placed [LibsignalPlacement] (mmpl : Obj.MultiPlacement (cliExternsPlaced_dealloc_budget_sat mmpl g W hG) (cliExternsPlaced_realloc_budget_sat mmpl g W hG) (cliExternsPlaced_shim_budget_sat mmpl g W hG.shim_eq) - (cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_sessionMemmove_budget_sat mmpl W extHookStack)) (cliExternsPlaced_sessionMemcpy_budget_sat mmpl g W hG extHookStack) /-- `serializeSpecX M A lim` on Block `52` at `cliGhostExterns g (cliExternsPlaced mmpl W)` diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/ShimCommonPlaced.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/ShimCommonPlaced.lean index 6d3977243..f32eda2f3 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/ShimCommonPlaced.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/ShimCommonPlaced.lean @@ -243,24 +243,6 @@ theorem session_memcpy_region_lscro_of_cli [LibsignalPlacement] {A : RustAlloc} (StoreKit.withLsCodeRoLoaded lsmpl (withStack sessionMemcpyRegionSpec stk)) := ls_transfer_lscro (callerProg := callerProg) (j := 617) (hC.session_memcpy_region stk h1 h2) hi -theorem memmove_lscro_of_cli [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} - {callerProg : Program} {i : Nat} [IsLsBlockProg callerProg i H] - (hC : AllocContractsXCliPlaced A H) - {stk : Nat} (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) - (hi : i < 619 := by decide) : - subroutine_ok callerProg (lsρ memmoveName) - (StoreKit.withLsCodeRoLoaded lsmpl (libcMemmoveSpec stk)) := - ls_transfer_lscro (callerProg := callerProg) (j := 617) (hC.memmove stk h1 h2) hi - -theorem session_memmove_lscro_of_cli [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} - {callerProg : Program} {i : Nat} [IsLsBlockProg callerProg i H] - (hC : AllocContractsXCliPlaced A H) - {stk : Nat} (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) - (hi : i < 619 := by decide) : - subroutine_ok callerProg (lsρ memmoveName) - (StoreKit.withLsCodeRoLoaded lsmpl (sessionMemmoveSpec stk)) := - ls_transfer_lscro (callerProg := callerProg) (j := 617) (hC.session_memmove stk h1 h2) hi - theorem memset_lscro_of_cli [LibsignalPlacement] {A : RustAlloc} {H : LibsignalHooks} {callerProg : Program} {i : Nat} [IsLsBlockProg callerProg i H] (hC : AllocContractsXCliPlaced A H) diff --git a/LibsignalBinary/Proofs/SignalSession/Cli/Store/ShimCommonPlacedBudget.lean b/LibsignalBinary/Proofs/SignalSession/Cli/Store/ShimCommonPlacedBudget.lean index 1e3006bd2..2f56e9362 100644 --- a/LibsignalBinary/Proofs/SignalSession/Cli/Store/ShimCommonPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SignalSession/Cli/Store/ShimCommonPlacedBudget.lean @@ -35,7 +35,7 @@ namespace LibsignalBinary.Proofs.SignalSession.Cli.Store.ShimCommonPlacedBudget open Arm64 Arm64.Obj ProofLib open CryptoVerification (IsLsBlockProg LibsignalHooks LibsignalPlacement lsmpl lsρ) open CryptoVerification.LibsignalTripleRatchet - (extHookStack memcpyName memmoveName memsetName withStack) + (extHookStack memcpyName memsetName withStack) open CryptoVerification.LibsignalPublicApi.StoreKit (LibsignalCodeRoLoaded extract_withLsCodeRoLoaded withLsCodeRoLoaded) open CryptoVerification.SignalSession @@ -52,7 +52,7 @@ open LibsignalBinary.Heap.IfaceBudgetLemmas open LibsignalBinary.Heap.SpecBudget (withVmPreserved) open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (LsRetAddr624) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget - (sessionMemcpyBudgetSpec sessionMemcpyRegionBudgetSpec sessionMemmoveBudgetSpec + (sessionMemcpyBudgetSpec sessionMemcpyRegionBudgetSpec sessionMemsetBudgetSpec sessionMemsetRegionBudgetSpec sessionShimBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Hooks2Budget (rustAllocNoOomExternSpecWithStack rustAllocNoOomSpecWithStack rustAllocSpecWithStack @@ -136,9 +136,6 @@ theorem AllocContractsFsPlaced.toAllocContractsX [LibsignalPlacement] {M : Alloc memcpy_region stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.memcpy_region stk h1 h2) session_memcpy_region stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.session_memcpy_region stk h1 h2) - memmove stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.memmove stk h1 h2) - session_memmove stk h1 h2 := - subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.session_memmove stk h1 h2) memset stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.memset stk h1 h2) session_memset stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.session_memset stk h1 h2) memset_region stk h1 h2 := subroutine_ok_withLsCodeRoLoaded_of_keepsFs (hA.memset_region stk h1 h2) @@ -396,26 +393,6 @@ theorem session_memcpy_region_lscro_of_cli [LibsignalPlacement] {M : AllocCostMo (withLsCodeRoLoaded lsmpl (withStack sessionMemcpyRegionBudgetSpec stk)) := ls_transfer_lscro (callerProg := callerProg) (j := 617) (hC.session_memcpy_region stk h1 h2) hi -theorem memmove_lscro_of_cli [LibsignalPlacement] {M : AllocCostModel} - {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} - {callerProg : Program} {i : Nat} [IsLsBlockProg callerProg i H] - (hC : AllocContractsXCliPlaced A lim H) - {stk : Nat} (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) - (hi : i < 619 := by decide) : - subroutine_ok callerProg (lsρ memmoveName) - (withLsCodeRoLoaded lsmpl (withVmPreserved (libcMemmoveSpec stk))) := - ls_transfer_lscro (callerProg := callerProg) (j := 617) (hC.memmove stk h1 h2) hi - -theorem session_memmove_lscro_of_cli [LibsignalPlacement] {M : AllocCostModel} - {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} - {callerProg : Program} {i : Nat} [IsLsBlockProg callerProg i H] - (hC : AllocContractsXCliPlaced A lim H) - {stk : Nat} (h1 : extHookStack ≤ stk := by decide) (h2 : stk ≤ 2 ^ 64 := by decide) - (hi : i < 619 := by decide) : - subroutine_ok callerProg (lsρ memmoveName) - (withLsCodeRoLoaded lsmpl (sessionMemmoveBudgetSpec stk)) := - ls_transfer_lscro (callerProg := callerProg) (j := 617) (hC.session_memmove stk h1 h2) hi - theorem memset_lscro_of_cli [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {H : LibsignalHooks} {callerProg : Program} {i : Nat} [IsLsBlockProg callerProg i H] diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/CliRunFixed.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/CliRunFixed.lean index 875e217e9..0e2f521e0 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/CliRunFixed.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/CliRunFixed.lean @@ -36,6 +36,21 @@ def readStdinName : String := "libsignal_cli_io::read_stdin" def writeStdoutName : String := "libsignal_cli_io::write_stdout" +/-- Canonical byte-slice equality comparator replacing the retired `CliHooks.bcmp` field (`D-C2b`). -/ +def cliDefaultBcmp (a b : List (BitVec 8)) : BitVec 64 := + if a == b then 0#64 else 1#64 + +theorem cliDefaultBcmp_ok (a b : List (BitVec 8)) (_hlen : a.length = b.length) : + (cliDefaultBcmp a b).setWidth 32 = 0#32 ↔ a = b := by + unfold cliDefaultBcmp + by_cases h : a = b + · simp [h] + · have hb : (a == b) = false := beq_eq_false_iff_ne.mpr h + simp [hb, h] + +/-- Canonical invalid-UTF-8 error witness replacing the retired `CliHooks.utf8Err` field (`D-C2b`). -/ +def cliDefaultUtf8Err : List (BitVec 8) → BitVec 64 × BitVec 16 := + fun _ => (0#64, 0#16) /-- Fixed-image `(stubName, hook)` table combining the 18 PQXDH/SPQR hooks of `E2E.pqxdhHookTable W.C W.Q` with the 28 allocator, libc, I/O, `core`/`std`, and session-crypto @@ -52,7 +67,7 @@ noncomputable def cliHookTable (W : CliHooks) : List (String × (State → State ("memset", hookMemset), ("memmove", hookMemmove), ("memcpy", hookMemcpy), - ("bcmp", cliBcmpHook W.bcmp), + ("bcmp", cliBcmpHook cliDefaultBcmp), ("strlen", strlenHook), -- I/O crate. (readFileName, readFileHook), @@ -61,7 +76,7 @@ noncomputable def cliHookTable (W : CliHooks) : List (String × (State → State (writeStdoutName, writeStdoutHook), -- `core` / `std`. ("core::slice::memchr::memrchr", memrchrHook), - ("core::str::converts::from_utf8", fromUtf8Hook W.utf8Err), + ("core::str::converts::from_utf8", fromUtf8Hook cliDefaultUtf8Err), ("core::fmt::write", E2E.fmtWriteHook0), ("alloc::fmt::format::format_inner", E2E.formatInnerHook0), ("::duration_since", durationSinceExactHook), diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/CliSymtabGhost.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/CliSymtabGhost.lean index 59f38fd3f..39d29ac3a 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/CliSymtabGhost.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/CliSymtabGhost.lean @@ -300,10 +300,10 @@ theorem cliHookTable_symtabFree (W : CliHooks) : ∀ p ∈ cliHookTable W, Symta libcruxHmacHook_symtabFree W.C.F, hookNoop_symtabFree, allocHook0_symtabFree, deallocHook_symtabFree, reallocHook0_symtabFree, allocZeroedHook0_symtabFree, hookMemset_symtabFree, - hookMemmove_symtabFree, hookMemcpy_symtabFree, cliBcmpHook_symtabFree W.bcmp, + hookMemmove_symtabFree, hookMemcpy_symtabFree, cliBcmpHook_symtabFree CryptoVerification.SignalSession.cliDefaultBcmp, strlenHook_symtabFree, readFileHook_symtabFree, writeFileHook_symtabFree, readStdinHook_symtabFree, writeStdoutHook_symtabFree, memrchrHook_symtabFree, - fromUtf8Hook_symtabFree W.utf8Err, fmtWriteHook0_symtabFree, + fromUtf8Hook_symtabFree CryptoVerification.SignalSession.cliDefaultUtf8Err, fmtWriteHook0_symtabFree, formatInnerHook0_symtabFree, durationSinceExactHook_symtabFree, timeAddHook_symtabFree, blackBoxHook_symtabFree, compress256Hook_symtabFree W.C.F, aesEncHook0_symtabFree W.C.E, aesDecHook0_symtabFree W.C.D, pubFromSecretHook_symtabFree W.C.pubKey, diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfBcmpEntryGuard.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfBcmpEntryGuard.lean new file mode 100644 index 000000000..0eb46254b --- /dev/null +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfBcmpEntryGuard.lean @@ -0,0 +1,314 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Heap.Fine.F3LayoutData -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays -- proof-setup: allow-public-import + +/-! +# Card L1-c Pilot — `F3CodeInv` / `rxProg` Replay Wrappers & Block-`617` `"bcmp"` Entry Guards (`ElfBcmpEntryGuard`) + +Pilot card **`c`** (`L1-c`) companion to `Cli.HooksDehook.BcmpGhostReplays` (parallel to +`ElfMemsetEntryGuard`, while staying in the default `LibsignalBinary` target with `0` `CliElfLib`, +C2, or trusted imports): + +1. **Artifact 2b — `F3CodeInv` / `rxProg` `GhostRowReplayOn` Wrappers (`§1`):** + - Parameterized over `(CodeInv : Memory → Prop)` (`:= StartupStatics.F3CodeInv mpl mmpl` at C2) + and `(rxProg : Program)` (`:= Tie.f3TrialRxProg` at C2), taking STARTUP's stock-side facts as + verbatim premises matching `Lib2LayoutFacts.lean` (`origin/stock-lld/c2-startup-dnm` @ + `a230f2671b`: `:114`, `:203`, `:271`, `:316`, `:317`, `:326`, `:338`, `:355`, `:368`, `:374`, + `:428`, `:444`) so C2 assembly discharges every premise with plain `exact`. + - Provides both `bcmpGhost_rowReplayOn_f3CodeInv_of_strip` (taking `hStripCL` verbatim from + `f3CodeInv_rxWords_codeLoaded_strip` `:203–215`) and `bcmpGhost_rowReplayOn_f3CodeInv` (taking + the 3 slice premises `hAlign`/`hNoWrap`/`hSubSlice` `:208–213` directly on `rxProg` — with + `hAlign : (bcmpHullBase mpl).toNat % 4 = 0` matching `Program.CodeLoaded.intro` — and + discharging `hKeep` `:214` automatically via `keepR_bcmp_of_code_offset`). +2. **Artifact 3 — Block-`617` Startup `lr` (`bcmpEntryGuard` / `ExtraEntryGuard`) Discharge (`§2`):** + - Parameterized over `(keepBPre : BitVec 64 → Bool)` (`:= Lib2LayoutFacts.keepTextBPre` at C2), + taking `keepTextBPre_startupLr_false` (`:104`), `C2ExternTableFacts.batchLInKeep` (`:334` / `:419`), + and hull inclusion (`:485` `f3BatchLEntryGuard_of_startupLr`) as verbatim premises at the + concrete startup return address `f3StdLayout.libcStartMainStage2Addr + 56#64` (`= StdMainEntryLr + f3StdLayout s0`, `rfl`-equal to `Lib2LayoutFacts.f3StartupLrVal` `:99`). + - Supplies table-level `ExtraEntryGuard` arm helpers (`extraEntryGuard_bcmp_arm` and + `extraEntryGuard_singleton_bcmp`). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfBcmpEntryGuard + +open Arm64 Arm64.Obj Arm64.Process ProofLib ProofLib.StdStartup +open CryptoVerification.SignalSession (CliHooks cliExternsPlaced libsignalSessionLib) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Heap.Fine (f3StdLayout) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 (StdMainEntryLr) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpCode (bcmpHullWords) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay ( + ExtraEntryGuard GhostRowReplayOn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays ( + bcmpHullBase keepR_bcmp bcmpSubProg bcmpSubProg_base bcmpSubProg_code_length + keepR_bcmp_of_code_offset bcmpSubProg_codeLoaded_of_stripExecOutside + bcmpGhost bcmpGhostK bcmpEntryGuard bcmpEntryGuard_iff + bcmpGhost_rowReplayOn bcmpGhostK_rowReplayOn +) + +/-! ## 1. Artifact 2b — `F3CodeInv` / `rxProg` `GhostRowReplayOn` Wrappers (Verbatim C2 Premises) -/ + +/-- Default-target sub-slice `CodeLoaded (stripExecOutside (keepR_bcmp mpl) m)` projection from + `rxProg.CodeLoaded m` (`:= hInv.rxCode` at `rxProg := Tie.f3TrialRxProg`), mirroring + `Lib2LayoutFacts.lean @a230f2671b:203-215` (`f3CodeInv_rxWords_codeLoaded_strip`; cf. `:271` + `hasWords_subslice_of_hasWords` for contiguous multi-block `hasWords` sub-slices) while + discharging `:214` (`hKeep`) automatically via `keepR_bcmp_of_code_offset`. -/ +theorem bcmpSubProg_codeLoaded_strip_of_rxProg + {mpl : Obj.MultiPlacement} {rxProg : Program} {m : Memory} + (hRx : rxProg.CodeLoaded m) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :208] f3CodeInv_rxWords_codeLoaded_strip: + (hAlign : (bcmpHullBase mpl).toNat % 4 = 0) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :209] f3CodeInv_rxWords_codeLoaded_strip: + (hNoWrap : + (bcmpHullBase mpl).toNat + 4 * (bcmpHullWords (bcmpHullBase mpl)).length ≤ 2 ^ 64) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :210-213] f3CodeInv_rxWords_codeLoaded_strip + -- (cf. Lib2LayoutFacts.lean @a230f2671b:271 hasWords_subslice_of_hasWords): + (hSubSlice : ∀ (i : Nat) (hi : i < (bcmpSubProg mpl).code.length), + ∃ (j : Nat) (hj : j < rxProg.code.length), + bcmpHullBase mpl + BitVec.ofNat 64 i = rxProg.base + BitVec.ofNat 64 j ∧ + (bcmpSubProg mpl).code[i] = rxProg.code[j]) : + (bcmpSubProg mpl).CodeLoaded (stripExecOutside (keepR_bcmp mpl) m) := by + have hLen4 : 4 * (bcmpHullWords (bcmpHullBase mpl)).length = (bcmpSubProg mpl).code.length := by + rw [bcmpSubProg_code_length] + exact LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpLrTrap.four_mul_bcmpHullWords_length + (bcmpHullBase mpl) (fun _ => bcmpHullBase mpl) + have hAlignBase : (bcmpSubProg mpl).base.toNat % 4 = 0 := hAlign + refine Program.CodeLoaded.intro hAlignBase (by rw [bcmpSubProg_base, ← hLen4]; exact hNoWrap) ?_ + intro i hi + obtain ⟨j, hj, haddr_eq, hbyte_eq⟩ := hSubSlice i hi + have hk_i : keepR_bcmp mpl ((bcmpSubProg mpl).base + BitVec.ofNat 64 i) = true := + keepR_bcmp_of_code_offset mpl hi + dsimp only [bcmpSubProg_base] at hk_i ⊢ + have hr_rx := hRx.byte_eq j hj + have hp_rx := hRx.perm_eq j hj + have hlf_rx := hRx.isLazyFree_eq j hj + rw [ProofLib.strip_read8, ProofLib.strip_perm_of_keep hk_i, ProofLib.strip_isLazyFree] + rw [haddr_eq, hr_rx, hbyte_eq, hp_rx, hlf_rx] + exact ⟨rfl, rfl, rfl⟩ + +/-- **Artifact 2b (direct `hStripCL` form):** `GhostRowReplayOn` over + `(fun u => CodeInv u.mem ∧ PredFs u.fs)` (`CodeInv := StartupStatics.F3CodeInv mpl mmpl`, + `rxProg := Tie.f3TrialRxProg`), consuming `f3CodeInv_rxWords_codeLoaded_strip`'s conclusion + (`Lib2LayoutFacts.lean @a230f2671b:203-215`) directly alongside `:114`, `:316`/`:317`/`:338` + (cf. `:428` `StepsVisitedIn`, `:444` `f3RxSeg_steps_realW_of_visitedIn`), `:326`/`:355`, and + `:368`/`:374`. -/ +theorem bcmpGhost_rowReplayOn_f3CodeInv_of_strip + (mpl mmpl : Obj.MultiPlacement) + (CodeInv : Memory → Prop) + (PredFs : FsState → Prop) + (rxProg : Program) + (EG : CliHooks → String → Option (State → State)) + (hInvKf : ∀ m m' : Memory, CodeInv m → m.KeepsFrozen m' → CodeInv m') + -- [Lib2LayoutFacts.lean @a230f2671b:203-215] f3CodeInv_rxWords_codeLoaded_strip + -- (cf. Lib2LayoutFacts.lean @a230f2671b:271 hasWords_subslice_of_hasWords): + (hStripCL : ∀ m : Memory, CodeInv m → + (bcmpSubProg mpl).CodeLoaded (stripExecOutside (keepR_bcmp mpl) m)) + -- [Lib2LayoutFacts.lean @a230f2671b:114] keepTextBPre_sub_rxProg (composed with keepR_bcmp ⊆ keepTextBPre): + (hSubRx : ∀ {pc : BitVec 64}, keepR_bcmp mpl pc = true → progKeep rxProg pc = true) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :317, :338] C2ExternTableFacts.realRxNoExtern / + -- f3RxSeg_realProg617_externAt_none (cf. :428 StepsVisitedIn, :444 f3RxSeg_steps_realW_of_visitedIn): + (hRealRxNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + progKeep rxProg pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :326, :355] C2ExternTableFacts.ghostRxEntry / + -- f3RxSeg_ghostProg617_externAt_entry: + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "bcmp") = + some (bcmpGhost mpl mmpl)) + -- [Lib2LayoutFacts.lean @a230f2671b:368, :374] f3Row_ghostProg617_externAt_none_of_ne_entry + -- (sym = "bcmp", with hOther :374: memmove ends at m, strlen starts at m + 56): + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_bcmp mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl "bcmp" → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) + EG "bcmp" (bcmpEntryGuard mpl) (bcmpGhost mpl mmpl) := + bcmpGhost_rowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) EG + (fun u ⟨hCode, _⟩ => bcmpSubProg_codeLoaded_of_stripExecOutside (hStripCL u.mem hCode)) + (fun u v ⟨hCode, hFs⟩ hkf hfs => ⟨hInvKf u.mem v.mem hCode hkf, hfs ▸ hFs⟩) + hGhostAt + (fun W {_} hk => hRealRxNoExt W (hSubRx hk)) + hGhostNoExtNe + +/-- **Artifact 2b (slice-premise form):** `GhostRowReplayOn` over + `(fun u => CodeInv u.mem ∧ PredFs u.fs)` (`CodeInv := StartupStatics.F3CodeInv mpl mmpl`, + `rxProg := Tie.f3TrialRxProg`), taking the verbatim slice premises (`:208–213`) of + `Lib2LayoutFacts.f3CodeInv_rxWords_codeLoaded_strip` (`:203`) + `hInvRx : ∀ m, CodeInv m → + rxProg.CodeLoaded m` (`:= fun _ h => h.rxCode`). -/ +theorem bcmpGhost_rowReplayOn_f3CodeInv + (mpl mmpl : Obj.MultiPlacement) + (CodeInv : Memory → Prop) + (PredFs : FsState → Prop) + (rxProg : Program) + (EG : CliHooks → String → Option (State → State)) + (hInvRx : ∀ m : Memory, CodeInv m → rxProg.CodeLoaded m) + (hInvKf : ∀ m m' : Memory, CodeInv m → m.KeepsFrozen m' → CodeInv m') + -- [Lib2LayoutFacts.lean @a230f2671b:203, :208] f3CodeInv_rxWords_codeLoaded_strip: + (hAlign : (bcmpHullBase mpl).toNat % 4 = 0) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :209] f3CodeInv_rxWords_codeLoaded_strip: + (hNoWrap : + (bcmpHullBase mpl).toNat + 4 * (bcmpHullWords (bcmpHullBase mpl)).length ≤ 2 ^ 64) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :210-213] f3CodeInv_rxWords_codeLoaded_strip + -- (cf. Lib2LayoutFacts.lean @a230f2671b:271 hasWords_subslice_of_hasWords): + (hSubSlice : ∀ (i : Nat) (hi : i < (bcmpSubProg mpl).code.length), + ∃ (j : Nat) (hj : j < rxProg.code.length), + bcmpHullBase mpl + BitVec.ofNat 64 i = rxProg.base + BitVec.ofNat 64 j ∧ + (bcmpSubProg mpl).code[i] = rxProg.code[j]) + -- [Lib2LayoutFacts.lean @a230f2671b:114] keepTextBPre_sub_rxProg (composed with keepR_bcmp ⊆ keepTextBPre): + (hSubRx : ∀ {pc : BitVec 64}, keepR_bcmp mpl pc = true → progKeep rxProg pc = true) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :317, :338] C2ExternTableFacts.realRxNoExtern / + -- f3RxSeg_realProg617_externAt_none (cf. :428 StepsVisitedIn, :444 f3RxSeg_steps_realW_of_visitedIn): + (hRealRxNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + progKeep rxProg pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :326, :355] C2ExternTableFacts.ghostRxEntry / + -- f3RxSeg_ghostProg617_externAt_entry: + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "bcmp") = + some (bcmpGhost mpl mmpl)) + -- [Lib2LayoutFacts.lean @a230f2671b:368, :374] f3Row_ghostProg617_externAt_none_of_ne_entry + -- (sym = "bcmp", with hOther :374: memmove ends at m, strlen starts at m + 56): + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_bcmp mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl "bcmp" → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) + EG "bcmp" (bcmpEntryGuard mpl) (bcmpGhost mpl mmpl) := + bcmpGhost_rowReplayOn_f3CodeInv_of_strip mpl mmpl CodeInv PredFs rxProg EG hInvKf + (fun m hCode => + bcmpSubProg_codeLoaded_strip_of_rxProg (hInvRx m hCode) hAlign hNoWrap hSubSlice) + hSubRx hRealRxNoExt hGhostAt hGhostNoExtNe + +/-- `K`-narrowed companion to `bcmpGhost_rowReplayOn_f3CodeInv_of_strip` (requiring zero ghost-table + or entry-`lr` premises). -/ +theorem bcmpGhostK_rowReplayOn_f3CodeInv_of_strip + (mpl mmpl : Obj.MultiPlacement) + (CodeInv : Memory → Prop) + (PredFs : FsState → Prop) + (rxProg : Program) + (EG : CliHooks → String → Option (State → State)) + (hInvKf : ∀ m m' : Memory, CodeInv m → m.KeepsFrozen m' → CodeInv m') + -- [Lib2LayoutFacts.lean @a230f2671b:203-215] f3CodeInv_rxWords_codeLoaded_strip: + (hStripCL : ∀ m : Memory, CodeInv m → + (bcmpSubProg mpl).CodeLoaded (stripExecOutside (keepR_bcmp mpl) m)) + -- [Lib2LayoutFacts.lean @a230f2671b:114] keepTextBPre_sub_rxProg: + (hSubRx : ∀ {pc : BitVec 64}, keepR_bcmp mpl pc = true → progKeep rxProg pc = true) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :317, :338] C2ExternTableFacts.realRxNoExtern / + -- f3RxSeg_realProg617_externAt_none: + (hRealRxNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + progKeep rxProg pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) + EG "bcmp" (fun _ => True) (bcmpGhostK mpl mmpl) := + bcmpGhostK_rowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) EG + (fun u ⟨hCode, _⟩ => bcmpSubProg_codeLoaded_of_stripExecOutside (hStripCL u.mem hCode)) + (fun u v ⟨hCode, hFs⟩ hkf hfs => ⟨hInvKf u.mem v.mem hCode hkf, hfs ▸ hFs⟩) + (fun W {_} hk => hRealRxNoExt W (hSubRx hk)) + +/-! ## 2. Artifact 3 — Block-`617` Startup `lr` (`bcmpEntryGuard` / `ExtraEntryGuard`) Discharge -/ + +/-- Concrete startup return address entering `main` (`block 617`), `rfl`-identical to + `Lib2LayoutFacts.f3StartupLrVal` (`Lib2LayoutFacts.lean @a230f2671b:99`) and proved equal to + `sm.readReg64 .lr` by `StartupStatics.cliElf_f3MuslHarnessLr_of_linkedAt`. -/ +@[expose] def f3StartupLrVal : BitVec 64 := + f3StdLayout.libcStartMainStage2Addr + 56#64 + +/-- Direct adapter from `Lib2LayoutFacts.f3BatchLEntryGuard_of_startupLr` + (`Lib2LayoutFacts.lean @a230f2671b:485-492`) into `bcmpEntryGuard mpl s0` (`Iff.rfl`). -/ +theorem f3BcmpEntryGuard_of_batchLEntryGuard + {mpl : Obj.MultiPlacement} {s0 : State} + -- [Lib2LayoutFacts.lean @a230f2671b:485-492] f3BatchLEntryGuard_of_startupLr: + (hGuard : keepR_bcmp mpl (s0.readReg64 .lr) = false ∧ + s0.readReg64 .lr ≠ libsignalSessionLib.resolve mpl "bcmp") : + bcmpEntryGuard mpl s0 := + (bcmpEntryGuard_iff mpl s0).mpr hGuard + +/-- **Artifact 3 (`C11` §6.3):** Block-`617` `bcmpEntryGuard mpl s0` discharge from startup `lr` + (`s0.readReg64 .lr = f3StdLayout.libcStartMainStage2Addr + 56#64`), parameterized over + `keepBPre : BitVec 64 → Bool` (`:= Lib2LayoutFacts.keepTextBPre` at C2) so zero C2-only + constants are imported while every premise matches `Lib2LayoutFacts.lean @a230f2671b` verbatim. -/ +theorem f3BcmpEntryGuard_of_startupLr + {mpl : Obj.MultiPlacement} {s0 : State} + (keepBPre : BitVec 64 → Bool) + -- [StartupStatics.cliElf_f3MuslHarnessLr_of_linkedAt; rfl-equal to Lib2LayoutFacts.f3StartupLrVal @a230f2671b:99]: + (hlr : s0.readReg64 .lr = f3StdLayout.libcStartMainStage2Addr + 56#64) + -- [Lib2LayoutFacts.lean @a230f2671b:104] keepTextBPre_startupLr_false: + (hLrOut : keepBPre (f3StdLayout.libcStartMainStage2Addr + 56#64) = false) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :334, :419] C2ExternTableFacts.batchLInKeep / + -- f3BatchL_dehookedSym_in_keepTextBPre (at sym = "bcmp"): + (hSymIn : keepBPre (libsignalSessionLib.resolve mpl "bcmp") = true) + -- [Lib2LayoutFacts.lean @a230f2671b:485, :490] f3BatchLEntryGuard_of_startupLr (`hsub` premise): + (hHullSub : ∀ pc : BitVec 64, keepR_bcmp mpl pc = true → keepBPre pc = true) : + bcmpEntryGuard mpl s0 := by + rw [bcmpEntryGuard_iff, hlr] + refine ⟨?_, ?_⟩ + · cases hk : keepR_bcmp mpl (f3StdLayout.libcStartMainStage2Addr + 56#64) + · rfl + · cases hLrOut.symm.trans (hHullSub _ hk) + · intro hEq + rw [hEq] at hLrOut + cases hLrOut.symm.trans hSymIn + +/-- `StdMainEntryLr f3StdLayout s0` wrapper around `f3BcmpEntryGuard_of_startupLr` (matching + `ElfMemsetEntryGuard.f3MemsetEntryGuard_of_startupLr` / `StartupStatics`). -/ +theorem f3BcmpEntryGuard_of_stdMainEntryLr + {mpl : Obj.MultiPlacement} {s0 : State} + (keepBPre : BitVec 64 → Bool) + (hlr : StdMainEntryLr f3StdLayout s0) + -- [Lib2LayoutFacts.lean @a230f2671b:104] keepTextBPre_startupLr_false: + (hLrOut : keepBPre (f3StdLayout.libcStartMainStage2Addr + 56#64) = false) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :334, :419] C2ExternTableFacts.batchLInKeep / + -- f3BatchL_dehookedSym_in_keepTextBPre (at sym = "bcmp"): + (hSymIn : keepBPre (libsignalSessionLib.resolve mpl "bcmp") = true) + -- [Lib2LayoutFacts.lean @a230f2671b:485, :490] f3BatchLEntryGuard_of_startupLr (`hsub` premise): + (hHullSub : ∀ pc : BitVec 64, keepR_bcmp mpl pc = true → keepBPre pc = true) : + bcmpEntryGuard mpl s0 := + f3BcmpEntryGuard_of_startupLr keepBPre hlr hLrOut hSymIn hHullSub + +/-- Per-arm `"bcmp"` discharge for any `guardOf : String → State → Prop` agreeing with + `bcmpEntryGuard mpl` on `"bcmp"`. -/ +theorem extraEntryGuard_bcmp_arm + {mpl : Obj.MultiPlacement} {guardOf : String → State → Prop} {s0 : State} + (hGuardEq : guardOf "bcmp" s0 ↔ bcmpEntryGuard mpl s0) + (hBcmpGuard : bcmpEntryGuard mpl s0) : + guardOf "bcmp" s0 := + hGuardEq.mpr hBcmpGuard + +/-- Table-level `ExtraEntryGuard guardOf g s0` discharge when `g.extra` carries the singleton + `"bcmp"` row `[("bcmp", bcmpGhost mpl mmpl)]`. -/ +theorem extraEntryGuard_singleton_bcmp + {mpl mmpl : Obj.MultiPlacement} {guardOf : String → State → Prop} + {g : CliGhostHooks} {s0 : State} + (hg : g.extra = [("bcmp", bcmpGhost mpl mmpl)]) + (hGuardEq : guardOf "bcmp" s0 ↔ bcmpEntryGuard mpl s0) + (hBcmpGuard : bcmpEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := by + intro sym f _ hLook + rw [hg] at hLook + simp only [List.lookup] at hLook + by_cases hSym : (sym == "bcmp") = true + · have hEq : sym = "bcmp" := eq_of_beq hSym + subst hEq + exact hGuardEq.mpr hBcmpGuard + · simp [hSym] at hLook + +end LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfBcmpEntryGuard diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfF3Relink/Lib2LayoutFacts.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfF3Relink/Lib2LayoutFacts.lean new file mode 100644 index 000000000..53870606a --- /dev/null +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfF3Relink/Lib2LayoutFacts.lean @@ -0,0 +1,604 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.Placed.ElfLsRetAddr -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen -- proof-setup: allow-public-import +import ProofLib.ProgramReflection +meta import ProofLib.ProgramReflection + +/-! +# Cutover-2 (`C2`) `.text.lib2` / `.rodata.lib2` & `.text.b_pre` Layout Bridges (`ElfF3Relink.Lib2LayoutFacts`) + +Supplies the untrusted layout and `F3CodeInv` bridges for Cutover-2 (`D-C2f = 2C` + `lib2` de-hook, +reference ELF `50066cbd…98ce`) without adding any fields to `F3CodeInv` or modifying +`StartupStatics.lean`: +1. `.rodata.lib2` `RoDataAt` derivation from `hInv.fromLoad` + `LinkedAt cliElfBytes mpl` + (`holdsBytes_of_checkSegSlice` at `f3StdLayout.roSegIdx = 0` + `KeepsFrozen` + `holdsBytes_ro`). +2. `rxCode` sub-slice `CodeLoaded` on `stripExecOutside` & contiguous multi-block `hasWords` + sub-slice projection (covering `bcmp + memcmp`, `duration_since + sub_timespec`, + `SharedSecret::drop + zeroize32`, and `memcpy .. memmove`). +3. Unified `rxSeg` real & ghost `externAt?` lemmas + `Steps` lift over any `keepR_row ⊆ rxProg`. +4. Unconditional startup `s0.lr` (`ExtraEntryGuard`) and caller `LsRetAddr624` return-address guards + (covering both `.text.lib2` R0 `β′` / trap-safe rows and `.text.b_pre` Batch L rows, plus K3/K4 + panic-stub exclusion). +-/ + +public section + +set_option autoImplicit false + +namespace LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + +open Arm64 Arm64.Obj Arm64.Process ProofLib ProofLib.ProgramReflection ProofLib.StdStartup +open CryptoVerification (LibsignalPlacement lsmpl) +open CryptoVerification.SignalSession + (CliHooks cliElfBytes cliElfImage cliElf_parse cliExternsPlaced libsignalSessionLib) +open CryptoVerification.SignalSession.Placed (cliProgPlacedSig) +open LibsignalBinary.Heap.Fine (f3RxWordCount f3StdLayout) +open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (LsRetAddr624 lsLen) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced + (cliProgExtPlacedAt externAt?_cliProgExtPlacedSigAt_eq_none patchElfTokensPlacedAt) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfPlaced + (cliElfBlockBases cliElfMultiPlacement cliElf_linkedAt_unique) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric + (h2fsgen_StepsVisitedIn h2fsgen_steps_lift_of_visitedIn_noExtern) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics + (F3CodeInv f3PatchedElf f3PatchedElf_eq_of_linkedAt) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen + (c2BatchLDehookedSyms c2DurationSinceCst16Addr c2FirstExternStubAddr c2FromUtf8TableAddr + c2Lib2DehookedSyms c2Lib2RoHi c2Lib2RoLo c2Lib2TextHi c2Lib2TextLo c2RxDehookedSyms + c2StartupLrLit c2TextBPreDehookedSyms c2TextBPreHi c2TextBPreLo) + +/-! ## 0. Panic-Stub Symbols & `.rodata.lib2` Byte Constants -/ + +abbrev lsExpectFailedSymC2 : String := "_RNvNtCskxtBwYRO61I_4core6option13expect_failed" +abbrev lsSliceIndexFailSymC2 : String := "_RNvNtNtCskxtBwYRO61I_4core5slice5index16slice_index_fail" + +/-- Canonical 256-byte `core::str::converts::UTF8_CHAR_WIDTH` table (`rfl`-identical to + `VerifiedLibraries.RustStd.corePlacedData1`). -/ +@[expose] def c2CorePlacedData1 : List (BitVec 8) := + List.replicate 128 0x01#8 ++ + List.replicate 66 0x00#8 ++ + List.replicate 30 0x02#8 ++ + List.replicate 16 0x03#8 ++ + List.replicate 5 0x04#8 ++ + List.replicate 11 0x00#8 + +/-- Canonical 16-byte `1_u128` mask in `Timespec::sub_timespec` (`rfl`-identical to + `VerifiedLibraries.RustStd.timePlacedData0`). -/ +@[expose] def c2TimePlacedData0 : List (BitVec 8) := + 0x01#8 :: List.replicate 15 0x00#8 + +/-- Definitional (`rfl`) alias matching `HookDischarge.RustStd.Common.RoDataAt`. -/ +abbrev RoDataAt (m : Memory) (addr : BitVec 64) (bytes : List (BitVec 8)) : Prop := + m.RO addr bytes.length ∧ m.readBytes addr bytes.length = bytes + +/-! ## 1. `.text.b_pre` / `.text.lib2` Interval Predicates & Startup `lr` Value -/ + +/-- Half-open `.text.b_pre` interval `[c2TextBPreLo, c2TextBPreHi)` inside `rxSeg`. -/ +@[expose] def keepTextBPre (pc : BitVec 64) : Bool := + decide (c2TextBPreLo.toNat ≤ pc.toNat ∧ pc.toNat < c2TextBPreHi.toNat) + +/-- Half-open `.text.lib2` interval `[c2Lib2TextLo, c2Lib2TextHi)` inside `rxSeg`. + Invariant under internal `.text.lib2` symbol reordering and valid for both 7-row and 6-row ELFs. -/ +@[expose] def keepLib2Text (pc : BitVec 64) : Bool := + decide (c2Lib2TextLo.toNat ≤ pc.toNat ∧ pc.toNat < c2Lib2TextHi.toNat) + +/-- Concrete startup return address entering `main` (`block 617`), proved equal to `sm.readReg64 .lr` + by `StartupStatics.cliElf_f3MuslHarnessLr_of_linkedAt`. -/ +@[expose] def f3StartupLrVal : BitVec 64 := + f3StdLayout.libcStartMainStage2Addr + 56#64 + +theorem f3StartupLrVal_eq : f3StartupLrVal = c2StartupLrLit := rfl + +theorem keepTextBPre_startupLr_false : keepTextBPre f3StartupLrVal = false := by + decide + +theorem keepLib2Text_startupLr_false : keepLib2Text f3StartupLrVal = false := by + decide + +private theorem rxProg_code_len_eq : + Tie.f3TrialRxProg.code.length = 4 * f3RxWordCount := by + rw [Tie.f3TrialRxWordTree_eq, WordTree.length_toBytes_of_checkSize? Tie.f3TrialRxWordTree_size] + +theorem keepTextBPre_sub_rxProg {pc : BitVec 64} (h : keepTextBPre pc = true) : + progKeep Tie.f3TrialRxProg pc = true := by + unfold keepTextBPre at h + rw [decide_eq_true_eq] at h + simp only [progKeep, Tie.f3TrialRxProg_base, rxProg_code_len_eq, decide_eq_true_eq] + have hrx : Tie.f3RxSegBase = c2TextBPreLo := rfl + have hbound : c2TextBPreHi.toNat - c2TextBPreLo.toNat ≤ 4 * f3RxWordCount := by decide + have hlo : c2TextBPreLo.toNat ≤ pc.toNat := h.1 + have hhi : pc.toNat < c2TextBPreHi.toNat := h.2 + have hsub : (pc - Tie.f3RxSegBase).toNat = pc.toNat - c2TextBPreLo.toNat := by + rw [hrx]; bv_omega + omega + +theorem keepLib2Text_sub_rxProg {pc : BitVec 64} (h : keepLib2Text pc = true) : + progKeep Tie.f3TrialRxProg pc = true := by + unfold keepLib2Text at h + rw [decide_eq_true_eq] at h + simp only [progKeep, Tie.f3TrialRxProg_base, rxProg_code_len_eq, decide_eq_true_eq] + have hge : Tie.f3RxSegBase.toNat ≤ c2Lib2TextLo.toNat := by decide + have hbound : c2Lib2TextHi.toNat - Tie.f3RxSegBase.toNat ≤ 4 * f3RxWordCount := by decide + have hlo : c2Lib2TextLo.toNat ≤ pc.toNat := h.1 + have hhi : pc.toNat < c2Lib2TextHi.toNat := h.2 + have hsub : (pc - Tie.f3RxSegBase).toNat = pc.toNat - Tie.f3RxSegBase.toNat := by + bv_omega + omega + +/-! ## 2. `.rodata.lib2` `RoDataAt` Bridges from `F3CodeInv` (`0` New Fields) -/ + +set_option maxRecDepth 4000000 in +theorem f3PatchedElf_wellFormed : f3PatchedElf.WellFormed = true := by + rfl_kernel + +/-- Generic `.rodata` slice bridge from `F3CodeInv` + `LinkedAt` into `RoDataAt`. -/ +theorem f3CodeInv_roDataAt_of_checkSegSlice + {mpl mmpl : Obj.MultiPlacement} {m : Memory} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hInv : F3CodeInv mpl mmpl m) + (addr : BitVec 64) (bytes : List (BitVec 8)) + (hSlice : ∃ seg, f3PatchedElf.segments[f3StdLayout.roSegIdx]? = some seg ∧ + seg.perm.rwx = Perm.ro ∧ + checkSegSlice seg seg.bytes.length addr bytes = true) : + RoDataAt m addr bytes := by + obtain ⟨inputs, sLoad, hload, hkf⟩ := hInv.fromLoad + rw [f3PatchedElf_eq_of_linkedAt hLs] at hload + obtain ⟨seg, hseg, hperm, hsl⟩ := hSlice + obtain ⟨hhb0, _, _⟩ := + holdsBytes_of_checkSegSlice f3PatchedElf_wellFormed hload hseg hsl + have hhb_ro0 : Obj.HoldsBytes sLoad.mem addr bytes (fun _ => Perm.ro) := by + simpa [hperm] using hhb0 + exact holdsBytes_ro (holdsBytes_ro_of_keepsFrozen hhb_ro0 hkf) + +/-- Pending 2-field `rfl_kernel` `.rodata.lib2` witness on the C2-pinned `cliElfImage` + (`50066cbd…98ce`); closed by `⟨⟨_, rfl, rfl, by rfl_kernel⟩, ⟨_, rfl, rfl, by rfl_kernel⟩⟩` + once C2 rebases onto the C2 ELF. -/ +structure C2RoSliceFacts : Prop where + fromUtf8Slice : + ∃ seg, f3PatchedElf.segments[f3StdLayout.roSegIdx]? = some seg ∧ + seg.perm.rwx = Perm.ro ∧ + checkSegSlice seg seg.bytes.length c2FromUtf8TableAddr c2CorePlacedData1 = true + durationSinceSlice : + ∃ seg, f3PatchedElf.segments[f3StdLayout.roSegIdx]? = some seg ∧ + seg.perm.rwx = Perm.ro ∧ + checkSegSlice seg seg.bytes.length c2DurationSinceCst16Addr c2TimePlacedData0 = true + +theorem f3CodeInv_roDataAt_fromUtf8Table + (hRo : C2RoSliceFacts) + {mpl mmpl : Obj.MultiPlacement} {m : Memory} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hInv : F3CodeInv mpl mmpl m) : + RoDataAt m c2FromUtf8TableAddr c2CorePlacedData1 := + f3CodeInv_roDataAt_of_checkSegSlice hLs hInv c2FromUtf8TableAddr c2CorePlacedData1 + hRo.fromUtf8Slice + +theorem f3CodeInv_roDataAt_durationSinceCst16 + (hRo : C2RoSliceFacts) + {mpl mmpl : Obj.MultiPlacement} {m : Memory} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hInv : F3CodeInv mpl mmpl m) : + RoDataAt m c2DurationSinceCst16Addr c2TimePlacedData0 := + f3CodeInv_roDataAt_of_checkSegSlice hLs hInv c2DurationSinceCst16Addr c2TimePlacedData0 + hRo.durationSinceSlice + +/-! ## 3. `rxCode` Sub-Slice `CodeLoaded` on `stripExecOutside` & Multi-Block `hasWords` -/ + +/-- Restrict `hInv.rxCode` (`Tie.f3TrialRxProg.CodeLoaded m`) to any 4-byte-aligned word slice + `(addr, words)` inside `Tie.f3TrialRxProg` on `stripExecOutside keepR m`. + Covers single-block and contiguous multi-block rows across `.text.b_pre` and `.text.lib2` + (`strlen`, `bcmp + memcmp`, `memcpy .. memmove`, `memrchr`, `from_utf8`, `duration_since + + sub_timespec`, `black_box`, `SharedSecret::drop + zeroize32`, `StaticSecret::drop`, `add`). -/ +theorem f3CodeInv_rxWords_codeLoaded_strip + {mpl mmpl : Obj.MultiPlacement} {m : Memory} + (hInv : F3CodeInv mpl mmpl m) + (addr : BitVec 64) (words : List (BitVec 32)) + (keepR : BitVec 64 → Bool) + (hAlign : addr.toNat % 4 = 0) + (hNoWrap : addr.toNat + 4 * words.length ≤ 2 ^ 64) + (hSub : ∀ (i : Nat) (hi : i < (pureWordsProg addr words).code.length), + ∃ (j : Nat) (hj : j < Tie.f3TrialRxProg.code.length), + addr + BitVec.ofNat 64 i = Tie.f3TrialRxProg.base + BitVec.ofNat 64 j ∧ + (pureWordsProg addr words).code[i] = Tie.f3TrialRxProg.code[j]) + (hKeep : ∀ i < 4 * words.length, keepR (addr + BitVec.ofNat 64 i) = true) : + (pureWordsProg addr words).CodeLoaded (stripExecOutside keepR m) := by + have hLen : (pureWordsProg addr words).code.length = 4 * words.length := + Program.length_flatMap_wordToBytesLE words + have hc := hInv.rxCode + have hNoWrap' : (pureWordsProg addr words).base.toNat + + (pureWordsProg addr words).code.length ≤ 2 ^ 64 := by + change addr.toNat + (pureWordsProg addr words).code.length ≤ 2 ^ 64 + rw [hLen] + exact hNoWrap + refine Program.CodeLoaded.intro hAlign hNoWrap' ?_ + intro i hi + obtain ⟨j, hj, haddr_eq, hbyte_eq⟩ := hSub i hi + have hi4 : i < 4 * words.length := hLen ▸ hi + have hk_i : keepR (addr + BitVec.ofNat 64 i) = true := hKeep i hi4 + have hr_rx := hc.byte_eq j hj + have hp_rx := hc.perm_eq j hj + have hlf_rx := hc.isLazyFree_eq j hj + change (stripExecOutside keepR m).read8 (addr + BitVec.ofNat 64 i) = + (pureWordsProg addr words).code[i] ∧ + (stripExecOutside keepR m).perm (addr + BitVec.ofNat 64 i) = some Perm.rx ∧ + (stripExecOutside keepR m).isLazyFree (addr + BitVec.ofNat 64 i) = false + refine ⟨?_, ?_, ?_⟩ + · rw [strip_read8, haddr_eq, hr_rx, hbyte_eq] + · rw [strip_perm, hk_i, haddr_eq, hp_rx] + rfl + · rw [strip_isLazyFree, haddr_eq, hlf_rx] + +private theorem hookFree_subslice {prog : Program} {off len off' len' : Nat} + (h : prog.hookFree off len) (hlo : off ≤ off') (hhi : off' + len' ≤ off + len) : + prog.hookFree off' len' := by + rcases h with ⟨h1, h2⟩ + refine ⟨List.all_eq_true.mpr ?_, List.all_eq_true.mpr ?_⟩ + · intro ⟨n, o⟩ hp + have hp0 := List.all_eq_true.mp h1 (n, o) hp + change (!(decide (off ≤ o) && decide (o < off + len)) || (prog.externs n).isNone) = true at hp0 + change (!(decide (off' ≤ o) && decide (o < off' + len')) || (prog.externs n).isNone) = true + simp only [Bool.or_eq_true, Bool.not_eq_true', Bool.and_eq_false_iff, + decide_eq_false_iff_not] at hp0 ⊢ + rcases hp0 with (hleft | hright) | hpred + · exact Or.inl (Or.inl (by omega)) + · exact Or.inl (Or.inr (by omega)) + · exact Or.inr hpred + · intro ⟨n, o⟩ hp + have hp0 := List.all_eq_true.mp h2 (n, o) hp + change (!(decide (off ≤ o) && decide (o < off + len)) || (prog.overrides n).isNone) = true at hp0 + change (!(decide (off' ≤ o) && decide (o < off' + len')) || (prog.overrides n).isNone) = true + simp only [Bool.or_eq_true, Bool.not_eq_true', Bool.and_eq_false_iff, + decide_eq_false_iff_not] at hp0 ⊢ + rcases hp0 with (hleft | hright) | hpred + · exact Or.inl (Or.inl (by omega)) + · exact Or.inl (Or.inr (by omega)) + · exact Or.inr hpred + +/-- Project `prog.hasWords (base + 4*k) sub` out of a contiguous multi-block `prog.hasWords base words` + witness (covering `bcmp + memcmp`, `duration_since + sub_timespec`, `SharedSecret::drop + + zeroize32`, and `memcpy .. memmove`). -/ +theorem hasWords_subslice_of_hasWords {prog : Program} {base : BitVec 64} + {words sub : List (BitVec 32)} {k : Nat} + (hw : prog.hasWords base words) + (hk_end : k + sub.length ≤ words.length) + (hbnd : (base - prog.base).toNat + 4 * k < 2 ^ 64) + (_hbase_ge : prog.base.toNat ≤ base.toNat) + (_hbase_k : base.toNat + 4 * k < 2 ^ 64) + (hsub : ∀ i (hi : i < sub.length), sub[i] = words[k + i]'(by omega)) : + prog.hasWords (base + BitVec.ofNat 64 (4 * k)) sub := by + unfold Program.hasWords Program.hasWordsOff at hw ⊢ + obtain ⟨hlen_w, hread_w, hrest⟩ := hw + have hoff_eq : ((base + BitVec.ofNat 64 (4 * k)) - prog.base).toNat = + (base - prog.base).toNat + 4 * k := by + bv_omega + rw [hoff_eq] + refine ⟨by omega, fun i hi => ?_, hookFree_subslice hrest (by omega) (by omega)⟩ + have hki : k + i < words.length := by omega + have hr := hread_w (k + i) hki + have harr : (base - prog.base).toNat + 4 * k + 4 * i = + (base - prog.base).toNat + 4 * (k + i) := by omega + rw [harr, hr] + exact congrArg some (hsub i hi).symm + +/-! ## 4. Unified `rxSeg` Real & Ghost `externAt?` & `Steps` Lift (`T1`, `T2` + `2C`) -/ + +private def lookupAddrTagNatC2 (tbl : List (Nat × UInt8)) (pc : Nat) : Option UInt8 := + match tbl with + | [] => none + | (a, t) :: rest => if Nat.beq a pc then some t else lookupAddrTagNatC2 rest pc + +private theorem lookupAddrTagNatC2_none_of_all_lt (tbl : List (Nat × UInt8)) (pc : Nat) + (hall : (tbl.all fun p => Nat.blt p.1 pc) = true) : + lookupAddrTagNatC2 tbl pc = none := by + induction tbl with + | nil => rfl + | cons hd xs ih => + rcases hd with ⟨a, t⟩ + simp only [List.all_cons, Bool.and_eq_true, Nat.blt_eq] at hall + have hne : Nat.beq a pc = false := by + rw [Bool.eq_false_iff, Ne, Nat.beq_eq]; omega + simp only [lookupAddrTagNatC2, hne, Bool.false_eq_true, ↓reduceIte] + exact ih hall.2 + +/-- Pending C2 placement/table lookup witnesses on the C2-rekeyed `cliExternsPlaced` / + `ElfCodeMatchesData` (`50066cbd…98ce`); discharged by `rfl_kernel` at C2 rebase. -/ +structure C2ExternTableFacts (mpl : Obj.MultiPlacement) : Prop where + realRxNoExtern : + ∀ (mmpl : Obj.MultiPlacement) (W : CliHooks) {pc : BitVec 64}, + progKeep Tie.f3TrialRxProg pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none + ghostRxNoExternOffEntries : + ∀ (extFn : CliHooks → String → Option (State → State)) (W : CliHooks) {pc : BitVec 64}, + progKeep Tie.f3TrialRxProg pc = true → + pc ∉ c2RxDehookedSyms.map (libsignalSessionLib.resolve mpl) → + (cliProgExtPlacedAt mpl extFn 617 W).externAt? pc = none + ghostRxEntry : + ∀ (extFn : CliHooks → String → Option (State → State)) (W : CliHooks) {sym : String}, + sym ∈ c2RxDehookedSyms → + (cliProgExtPlacedAt mpl extFn 617 W).externAt? (libsignalSessionLib.resolve mpl sym) = + extFn W sym + lib2InKeep : + ∀ {sym : String}, sym ∈ c2Lib2DehookedSyms → + keepLib2Text (libsignalSessionLib.resolve mpl sym) = true + batchLInKeep : + ∀ {sym : String}, sym ∈ c2BatchLDehookedSyms → + keepTextBPre (libsignalSessionLib.resolve mpl sym) = true + +theorem f3RxSeg_realProg617_externAt_none + {mpl mmpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (W : CliHooks) {pc : BitVec 64} + (hpc : progKeep Tie.f3TrialRxProg pc = true) : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none := + hExt.realRxNoExtern mmpl W hpc + +theorem f3RxSeg_ghostProg617_externAt_none_of_ne_entries + {mpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (extFn : CliHooks → String → Option (State → State)) (W : CliHooks) + {pc : BitVec 64} (hpc : progKeep Tie.f3TrialRxProg pc = true) + (hne : pc ∉ c2RxDehookedSyms.map (libsignalSessionLib.resolve mpl)) : + (cliProgExtPlacedAt mpl extFn 617 W).externAt? pc = none := + hExt.ghostRxNoExternOffEntries extFn W hpc hne + +theorem f3RxSeg_ghostProg617_externAt_entry + {mpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (extFn : CliHooks → String → Option (State → State)) (W : CliHooks) + {sym : String} (hsym : sym ∈ c2RxDehookedSyms) : + (cliProgExtPlacedAt mpl extFn 617 W).externAt? + (libsignalSessionLib.resolve mpl sym) = extFn W sym := + hExt.ghostRxEntry extFn W hsym + +/-- Per-row entry-excluded `externAt? = none` on `P_ghost_W` (`cliProgExtPlacedAt mpl extFn 617 W`): + for any row `(sym, keepR_row)` inside `rxSeg` whose `keepR_row` avoids other `c2RxDehookedSyms` + entries (or where `extFn W s = none`, e.g. `"memcpy"`/`"memset"` inside `memmove + memcpy`), + every non-entry `pc` in `keepR_row` has `externAt? pc = none`. -/ +theorem f3Row_ghostProg617_externAt_none_of_ne_entry + {mpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (extFn : CliHooks → String → Option (State → State)) (W : CliHooks) + {sym : String} {keepR_row : BitVec 64 → Bool} + (hSub : ∀ pc, keepR_row pc = true → progKeep Tie.f3TrialRxProg pc = true) + (hOther : ∀ s ∈ c2RxDehookedSyms, s ≠ sym → + keepR_row (libsignalSessionLib.resolve mpl s) = false ∨ extFn W s = none) + {pc : BitVec 64} (hkeep : keepR_row pc = true) + (hne : pc ≠ libsignalSessionLib.resolve mpl sym) : + (cliProgExtPlacedAt mpl extFn 617 W).externAt? pc = none := by + by_cases hmem : pc ∈ c2RxDehookedSyms.map (libsignalSessionLib.resolve mpl) + · obtain ⟨s, hs_mem, hs_eq⟩ := List.mem_map.mp hmem + have hs_ne : s ≠ sym := by + intro h_eq; subst h_eq; exact hne hs_eq.symm + rcases hOther s hs_mem hs_ne with hfalse | hnone + · rw [hs_eq] at hfalse; cases hkeep.symm.trans hfalse + · rw [← hs_eq, hExt.ghostRxEntry extFn W hs_mem, hnone] + · exact hExt.ghostRxNoExternOffEntries extFn W (hSub pc hkeep) hmem + +/-- Multi-entry generalization of `f3Row_ghostProg617_externAt_none_of_ne_entry` for hulls + containing multiple active ghost entries (e.g. `rowSyms := ["memmove", "memcpy", "memset"]` on + `memmove`'s 956 B hull when `g.memcpy`/`g.memset` are simultaneously active in `extFn W`): + every `pc` in `keepR_row` outside `rowSyms.map (resolve mpl)` has `externAt? pc = none`. -/ +theorem f3RowSyms_ghostProg617_externAt_none_of_ne_entries + {mpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (extFn : CliHooks → String → Option (State → State)) (W : CliHooks) + {rowSyms : List String} {keepR_row : BitVec 64 → Bool} + (hSub : ∀ pc, keepR_row pc = true → progKeep Tie.f3TrialRxProg pc = true) + (hOther : ∀ s ∈ c2RxDehookedSyms, s ∉ rowSyms → + keepR_row (libsignalSessionLib.resolve mpl s) = false ∨ extFn W s = none) + {pc : BitVec 64} (hkeep : keepR_row pc = true) + (hne : pc ∉ rowSyms.map (libsignalSessionLib.resolve mpl)) : + (cliProgExtPlacedAt mpl extFn 617 W).externAt? pc = none := by + by_cases hmem : pc ∈ c2RxDehookedSyms.map (libsignalSessionLib.resolve mpl) + · obtain ⟨s, hs_mem, hs_eq⟩ := List.mem_map.mp hmem + have hs_notin : s ∉ rowSyms := by + intro hs_in + exact hne (hs_eq ▸ List.mem_map.mpr ⟨s, hs_in, rfl⟩) + rcases hOther s hs_mem hs_notin with hfalse | hnone + · rw [hs_eq] at hfalse; cases hkeep.symm.trans hfalse + · rw [← hs_eq, hExt.ghostRxEntry extFn W hs_mem, hnone] + · exact hExt.ghostRxNoExternOffEntries extFn W (hSub pc hkeep) hmem + +theorem f3Lib2_dehookedSym_in_keepLib2Text + {mpl : Obj.MultiPlacement} (hExt : C2ExternTableFacts mpl) + {sym : String} (hsym : sym ∈ c2Lib2DehookedSyms) : + keepLib2Text (libsignalSessionLib.resolve mpl sym) = true := + hExt.lib2InKeep hsym + +theorem f3BatchL_dehookedSym_in_keepTextBPre + {mpl : Obj.MultiPlacement} (hExt : C2ExternTableFacts mpl) + {sym : String} (hsym : sym ∈ c2BatchLDehookedSyms) : + keepTextBPre (libsignalSessionLib.resolve mpl sym) = true := + hExt.batchLInKeep hsym + +/-- Definitional (`rfl`) alias of `ElfSlicesPqOomH2FirstStopGeneric.h2fsgen_StepsVisitedIn`, + for lifting hook-free `Program.ofSvc Syscall.standard` (`hole2_emptyProg`) runs on `keepR_row` + to `Steps P_real_W`. -/ +abbrev StepsVisitedIn : (BitVec 64 → Bool) → Program → State → State → Prop := + h2fsgen_StepsVisitedIn + +private theorem ofSvc_standard_svc : (Program.ofSvc Syscall.standard).svc = Syscall.standard := + rfl + +private theorem realProg617_svc (mpl mmpl : Obj.MultiPlacement) (W : CliHooks) : + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).svc = Syscall.standard := + rfl + +private theorem ofSvc_standard_externAt (pc : BitVec 64) : + (Program.ofSvc Syscall.standard).externAt? pc = none := + rfl + +/-- Direct `rxSeg` analogue of `H2StepsLiftR2.h2sl_steps_realW_of_visitedIn_keepSub` (`:954`) for + ANY row predicate `keepR_row ⊆ progKeep Tie.f3TrialRxProg`. -/ +theorem f3RxSeg_steps_realW_of_visitedIn + {mpl : Obj.MultiPlacement} + (hExt : C2ExternTableFacts mpl) + (mmpl : Obj.MultiPlacement) (W : CliHooks) + {keepR_row : BitVec 64 → Bool} + (hSub : ∀ pc, keepR_row pc = true → progKeep Tie.f3TrialRxProg pc = true) + {s sf : State} + (hvis : StepsVisitedIn keepR_row (Program.ofSvc Syscall.standard) s sf) : + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) s sf := + h2fsgen_steps_lift_of_visitedIn_noExtern + (P1 := Program.ofSvc Syscall.standard) + (P2 := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (ofSvc_standard_svc.trans (realProg617_svc mpl mmpl W).symm) + (fun pc _ => ofSvc_standard_externAt pc) + (fun pc hkeep => hExt.realRxNoExtern mmpl W (hSub pc hkeep)) + hvis + +/-! ## 5. Unconditional Startup `s0.lr` (`ExtraEntryGuard`) & Caller `LsRetAddr624` Guards -/ + +/-- Startup `s0.lr` (`ExtraEntryGuard` for `LinkedCallHookG`) on `.text.lib2` rows (`6` or `7` rows, + order-independent). Unconditional (`0` pending C2 hypotheses). -/ +theorem f3Lib2EntryGuard_of_startupLr + {mpl : Obj.MultiPlacement} + {s0 : State} (hlr : s0.readReg64 .lr = f3StartupLrVal) + {sym : String} (hsym : keepLib2Text (libsignalSessionLib.resolve mpl sym) = true) + {keepR : BitVec 64 → Bool} + (hsub : ∀ pc, keepR pc = true → keepLib2Text pc = true) : + keepR (s0.readReg64 .lr) = false ∧ + s0.readReg64 .lr ≠ libsignalSessionLib.resolve mpl sym := by + rw [hlr] + have hfalse : keepLib2Text f3StartupLrVal = false := keepLib2Text_startupLr_false + refine ⟨?_, ?_⟩ + · cases hk : keepR f3StartupLrVal + · rfl + · cases hfalse.symm.trans (hsub f3StartupLrVal hk) + · intro heq + rw [heq] at hfalse + cases hfalse.symm.trans hsym + +/-- Startup `s0.lr` (`ExtraEntryGuard`) on `.text.b_pre` Batch L rows (`memmove + memcpy`, + `bcmp + memcmp`, `strlen`). Unconditional (`0` pending C2 hypotheses). -/ +theorem f3BatchLEntryGuard_of_startupLr + {mpl : Obj.MultiPlacement} + {s0 : State} (hlr : s0.readReg64 .lr = f3StartupLrVal) + {sym : String} (hsym : keepTextBPre (libsignalSessionLib.resolve mpl sym) = true) + {keepR : BitVec 64 → Bool} + (hsub : ∀ pc, keepR pc = true → keepTextBPre pc = true) : + keepR (s0.readReg64 .lr) = false ∧ + s0.readReg64 .lr ≠ libsignalSessionLib.resolve mpl sym := by + rw [hlr] + have hfalse : keepTextBPre f3StartupLrVal = false := keepTextBPre_startupLr_false + refine ⟨?_, ?_⟩ + · cases hk : keepR f3StartupLrVal + · rfl + · cases hfalse.symm.trans (hsub f3StartupLrVal hk) + · intro heq + rw [heq] at hfalse + cases hfalse.symm.trans hsym + +section LsRetAddr624Kernel +set_option maxRecDepth 400000 + +/-- Kernel check across all `624` crate blocks (`0 .. 623` in `.text.crate`): every block end + `cliElfBlockBases[j] + lsLen j` sits at or below `c2FirstExternStubAddr`, and the + two K3/K4 panic stubs sit at or above `c2FirstExternStubAddr`. -/ +noncomputable def c2CheckLsRetAddr624BoundsB : Bool := + Nat.beq libsignalSessionLib.blocks.length 624 && + Nat.beq cliElfBlockBases.length 624 && + (List.range 624).all (fun j => + Nat.ble ((cliElfBlockBases.getD j 0#64).toNat + lsLen j) c2FirstExternStubAddr.toNat) && + Nat.ble c2FirstExternStubAddr.toNat + (libsignalSessionLib.resolve cliElfMultiPlacement lsExpectFailedSymC2).toNat && + Nat.ble c2FirstExternStubAddr.toNat + (libsignalSessionLib.resolve cliElfMultiPlacement lsSliceIndexFailSymC2).toNat + +theorem c2CheckLsRetAddr624Bounds_ok : c2CheckLsRetAddr624BoundsB = true := by + rfl_kernel + +end LsRetAddr624Kernel + +/-- Unconditional upper bound for every `LsRetAddr624 lr`: `lr.toNat < c2FirstExternStubAddr.toNat` + (strictly below all extern/retired stubs in `:text_a`, `.text.b_pre`, and + `.text.lib2`). Callers bridge `lsmpl ↔ mpl` via + `ElfCodeMatchesPlaced.f3CliElf_libsignal_linkedAt_unique`. -/ +theorem f3LsRetAddr624_lt_firstExternStub [LibsignalPlacement] + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) + {lr : BitVec 64} (hRet : LsRetAddr624 lr) : + lr.toNat < c2FirstExternStubAddr.toNat := by + rcases hRet with ⟨j, hj, o, ho, rfl⟩ + have hok := c2CheckLsRetAddr624Bounds_ok + unfold c2CheckLsRetAddr624BoundsB at hok + simp only [Bool.and_eq_true, Nat.beq_eq, Nat.ble_eq] at hok + have hjlen : j < libsignalSessionLib.blocks.length := by + rw [hok.1.1.1.1]; exact hj + have hbase_eq : lsmpl.base j = cliElfMultiPlacement.base j := + (cliElf_linkedAt_unique hLs).1 j hjlen + have hdef : cliElfMultiPlacement.base j = cliElfBlockBases.getD j 0#64 := rfl + have hbnd : (cliElfBlockBases.getD j 0#64).toNat + lsLen j ≤ c2FirstExternStubAddr.toNat := by + have hall := List.all_eq_true.mp hok.1.1.2 j (List.mem_range.mpr hj) + rwa [Nat.ble_eq] at hall + rw [hbase_eq, hdef] + have hstub_lt : c2FirstExternStubAddr.toNat < 2 ^ 64 := BitVec.isLt c2FirstExternStubAddr + have hadd : ((cliElfBlockBases.getD j 0#64) + BitVec.ofNat 64 o).toNat = + (cliElfBlockBases.getD j 0#64).toNat + o := by + have ho' : (BitVec.ofNat 64 o).toNat = o := by + rw [BitVec.toNat_ofNat, Nat.mod_eq_of_lt (by omega)] + rw [BitVec.toNat_add, ho', Nat.mod_eq_of_lt (by omega)] + omega + +/-- Unconditional K3/K4 panic-stub exclusion (`expect_failed`, `slice_index_fail`) for any caller + `LsRetAddr624 lr` (`T6`). -/ +theorem f3LsRetAddr624_ne_panicStubs [LibsignalPlacement] + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) + {lr : BitVec 64} (hRet : LsRetAddr624 lr) : + lr ≠ libsignalSessionLib.resolve lsmpl lsExpectFailedSymC2 ∧ + lr ≠ libsignalSessionLib.resolve lsmpl lsSliceIndexFailSymC2 := by + have hlt := f3LsRetAddr624_lt_firstExternStub hLs hRet + have hok := c2CheckLsRetAddr624Bounds_ok + unfold c2CheckLsRetAddr624BoundsB at hok + simp only [Bool.and_eq_true, Nat.ble_eq] at hok + have huniq := cliElf_linkedAt_unique hLs + rw [huniq.2.1 lsExpectFailedSymC2 (decide_eq_true_eq.mp (by rfl_kernel)), + huniq.2.1 lsSliceIndexFailSymC2 (decide_eq_true_eq.mp (by rfl_kernel))] + refine ⟨?_, ?_⟩ <;> intro heq <;> rw [heq] at hlt <;> omega + +/-- Unconditional caller `LsRetAddr624` guard for R0 `β′` K-narrowed `lib2` rows (`memrchr`, + `duration_since`, and `SystemTime::add` in the 7-row layout; `add` stays hooked in the 6-row + layout) and `.text.b_pre` Batch L rows (`T6`, `T7`). -/ +theorem f3LsRetAddr624_rxRegion_guard [LibsignalPlacement] + (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) + {lr : BitVec 64} (hRet : LsRetAddr624 lr) + {sym : String} + (hsym : keepTextBPre (libsignalSessionLib.resolve lsmpl sym) = true ∨ + keepLib2Text (libsignalSessionLib.resolve lsmpl sym) = true) + {keepR : BitVec 64 → Bool} + (hsub : ∀ pc, keepR pc = true → keepTextBPre pc = true ∨ keepLib2Text pc = true) : + keepR lr = false ∧ lr ≠ libsignalSessionLib.resolve lsmpl sym := by + have hlt := f3LsRetAddr624_lt_firstExternStub hLs hRet + have hbpre_false : keepTextBPre lr = false := by + unfold keepTextBPre + rw [decide_eq_false_iff_not] + have hlo : c2FirstExternStubAddr.toNat ≤ c2TextBPreLo.toNat := by decide + omega + have hlib2_false : keepLib2Text lr = false := by + unfold keepLib2Text + rw [decide_eq_false_iff_not] + have hlo : c2FirstExternStubAddr.toNat ≤ c2Lib2TextLo.toNat := by decide + omega + refine ⟨?_, ?_⟩ + · cases hk : keepR lr + · rfl + · rcases hsub lr hk with hb | hl + · cases hbpre_false.symm.trans hb + · cases hlib2_false.symm.trans hl + · intro heq + rw [← heq] at hsym + rcases hsym with hb | hl + · cases hbpre_false.symm.trans hb + · cases hlib2_false.symm.trans hl + +end LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfF3Relink/StartupStatics.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfF3Relink/StartupStatics.lean index 1c49bad27..f12f12d48 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfF3Relink/StartupStatics.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfF3Relink/StartupStatics.lean @@ -16,6 +16,7 @@ public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Inst public import ProofLib.ProgramReflection public meta import ProofLib.ProgramReflection import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.HookDischarge.Libc.Strlen /-! # Concrete Startup Framing, `F3CodeOk`, and `CliElfF3B2NeedLocksAssumptions` @@ -53,9 +54,10 @@ open LibsignalBinary.Heap (BudgetLimits) open LibsignalBinary.Heap.Fine (CliElfMallocngLayout StartupVmPreserved f3MallocngMpl f3SegByteSum f3SegCount f3StdLayout fineCostModel fineHookRustCliAllocBudget) +open LibsignalBinary.Proofs.HookDischarge.Libc.Strlen (StrlenSwarPadBound) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 (CliElfF3B2NeedLocksAssumptions MuslHarnessFineNeedLocksGuardedPerInput - MuslHarnessFineNeedLocksPerInput StdMainEntryLr cliBudgetLimits + MuslHarnessFineNeedLocksPerInput StdMainEntryLr argvAtRO cStrAtRO cliBudgetLimits muslHarnessFineNeedLocksGuardedPerInput_of_startup) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (CliElfTokenCellsPlacedAt cliElfMallocngLayout_iff_patchElfTokensPlacedAt cliProgExtPlacedAt @@ -64,7 +66,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced externAt?_cliProgExtPlacedSigAt_eq_none loadState_patchElfTokensPlacedAt lsLogOffAt patchElfTokensPlacedAt tokenInitPlacedAtMpl) open LibsignalBinary.Proofs.SignalSession.Cli.F3Relink.Startup - (F3StartupCode argvAtRO cStrAtRO f3StartupExtraChunks f3StartupMainPre + (F3StartupCode f3StartupExtraChunks f3StartupMainPre f3StartupMainPreNeedLocks f3StartupResidual steps_lift_setTidOnly) open LibsignalBinary.Proofs.SignalSession.Cli.F3Relink.TlsZero (F3BssGlobals F3DataGlobals F3InitGlobals F3LayoutImageFacts F3RoConstants F3TlsState @@ -904,14 +906,6 @@ private theorem s0_satisfies_f3InitAllSep_and_statics {mpl : Obj.MultiPlacement} (sepConj_mono_left rwAtomListSep_f3CliStaticsAtoms_entails)))) ?_ sep_entail -private theorem absorb_ro_pad {U C Pad : SepProp} - (hdup : (U ∗ (C ∗ Pad)) = U) (hc : (C ∗ C) = C) : - U ⊢ C ∗ U := by - refine Entails.trans (Entails.of_eq hdup.symm) ?_ - refine Entails.trans (sepConj_mono_right (sepConj_mono_left (Entails.of_eq hc.symm))) ?_ - refine Entails.trans (Q := C ∗ (U ∗ (C ∗ Pad))) (by sep_entail) ?_ - exact sepConj_mono_right (Entails.of_eq hdup) - private theorem argvTable_dup_argvAtRO {img : ElfImage} {inputs : ProcessInputs} {s0 : State} (hinfo : InitialStackInfo img inputs s0) (hargs : ArgsValid inputs) : let sl := StackLayout.of img inputs @@ -922,6 +916,7 @@ private theorem argvTable_dup_argvAtRO {img : ElfImage} {inputs : ProcessInputs} dsimp only let sl := StackLayout.of img inputs have hlen : sl.argvAddrs.length = inputs.argv.length := hinfo.argvAddrs_length + have htop48 : inputs.init.stackTop.toNat ≤ 2 ^ 48 := hinfo.stackTop_align.2.2 suffices hgen : ∀ (k : Nat), k ≤ inputs.argv.length → (((sl.argvTableAddr + BitVec.ofNat 64 (8 * k)) ↦₆₄ᵣ* (sl.argvAddrs.drop k ++ [0#64])) ∗ (sl.argvBase ↦ᵣ sl.upperStrBytes)) ⊢ @@ -953,19 +948,22 @@ private theorem argvTable_dup_argvAtRO {img : ElfImage} {inputs : ProcessInputs} rw [BitVec.add_assoc, show (8#64 : BitVec 64) = BitVec.ofNat 64 8 from rfl, ← BitVec.ofNat_add] exact congrArg (sl.argvTableAddr + BitVec.ofNat 64 ·) (by omega) rw [hstep_addr] - obtain ⟨pad, _, _, _, _, hdup_str⟩ := hinfo.dup_argv_cstr_padded hargs hk_lt + obtain ⟨pad, _hno0, _hpad8, hswar, htop, hdup_str⟩ := hinfo.dup_argv_cstr_padded hargs hk_lt + have h48_lt : (2 ^ 48 : Nat) < 2 ^ 64 := by decide + have hpad_ok : StrlenSwarPadBound sl.argvAddrs[k] inputs.argv[k] pad := + ⟨hswar, by dsimp only [sl]; omega⟩ have habs_str : (sl.argvBase ↦ᵣ sl.upperStrBytes) ⊢ - (sl.argvAddrs[k] ↦ᵣ (inputs.argv[k] ++ [0#8])) ∗ (sl.argvBase ↦ᵣ sl.upperStrBytes) := by - have hdup_str' : ((sl.argvBase ↦ᵣ sl.upperStrBytes) ∗ - ((sl.argvAddrs[k] ↦ᵣ (inputs.argv[k] ++ [0#8])) ∗ - ((sl.argvAddrs[k] + BitVec.ofNat 64 (inputs.argv[k] ++ [0#8]).length) ↦ᵣ pad))) = - (sl.argvBase ↦ᵣ sl.upperStrBytes) := by - dsimp only [sl]; rw [← pointsToBytesRO_append]; exact hdup_str - exact absorb_ro_pad hdup_str' (pointsToBytesRO_dup _ _) + cStrAtRO sl.argvAddrs[k] inputs.argv[k] ∗ (sl.argvBase ↦ᵣ sl.upperStrBytes) := by + have hdup' : (sl.argvBase ↦ᵣ sl.upperStrBytes) = + (sl.argvAddrs[k] ↦ᵣ (inputs.argv[k] ++ [0#8] ++ pad)) ∗ + (sl.argvBase ↦ᵣ sl.upperStrBytes) := by + dsimp only [sl] + exact hdup_str.symm.trans (sepConj_comm _ _) + exact Entails.trans (Entails.of_eq hdup') + (sepConj_mono_left (Entails.sepExists_right pad (Entails.pure_right hpad_ok (Entails.refl _)))) have hih := ih (k + 1) (by omega) (by omega) refine Entails.trans ?_ (sepConj_mono_left (Entails.sepExists_right sl.argvAddrs[k] (Entails.refl _))) - dsimp only [cStrAtRO] refine Entails.trans (sepConj_mono_left (sepConj_mono_left (Entails.of_eq (pointsTo64RO_dup _ _).symm))) ?_ refine Entails.trans @@ -973,24 +971,23 @@ private theorem argvTable_dup_argvAtRO {img : ElfImage} {inputs : ProcessInputs} ((sl.argvTableAddr + BitVec.ofNat 64 (8 * k)) ↦₆₄ᵣ sl.argvAddrs[k]) ∗ (((sl.argvTableAddr + BitVec.ofNat 64 (8 * (k + 1))) ↦₆₄ᵣ* (sl.argvAddrs.drop (k + 1) ++ [0#64])) ∗ - ((sl.argvAddrs[k] ↦ᵣ (inputs.argv[k] ++ [0#8])) ∗ + (cStrAtRO sl.argvAddrs[k] inputs.argv[k] ∗ (sl.argvBase ↦ᵣ sl.upperStrBytes)))) - (Entails.trans (by sep_entail) - (sepConj_mono_right (sepConj_mono_right (sepConj_mono_right - habs_str)))) + (Entails.trans (Entails.of_eq (by sep_ac_rfl)) + (sepConj_mono_right (sepConj_mono_right (sepConj_mono_right habs_str)))) ?_ refine Entails.trans (Q := ((sl.argvTableAddr + BitVec.ofNat 64 (8 * k)) ↦₆₄ᵣ sl.argvAddrs[k]) ∗ - (sl.argvAddrs[k] ↦ᵣ (inputs.argv[k] ++ [0#8])) ∗ + cStrAtRO sl.argvAddrs[k] inputs.argv[k] ∗ ((sl.argvTableAddr + BitVec.ofNat 64 (8 * k)) ↦₆₄ᵣ sl.argvAddrs[k]) ∗ (((sl.argvTableAddr + BitVec.ofNat 64 (8 * (k + 1))) ↦₆₄ᵣ* (sl.argvAddrs.drop (k + 1) ++ [0#64])) ∗ (sl.argvBase ↦ᵣ sl.upperStrBytes))) - (by sep_entail) + (Entails.of_eq (by sep_ac_rfl)) ?_ exact Entails.trans (sepConj_mono_right (sepConj_mono_right (sepConj_mono_right hih))) - (by sep_entail) + (Entails.of_eq (by sep_ac_rfl)) private theorem pointsToBytes_flatMap_u64 {a : BitVec 64} (ws : List (BitVec 64)) (hal : a.toNat % 8 = 0) (hbnd : a.toNat + 8 * ws.length ≤ 2 ^ 48) : @@ -1605,16 +1602,6 @@ theorem cliElf_f3MallocngLayout : CliElfMallocngLayout cliElfImage cliBudgetLimi cliBudgetLimits_layout_bounds.2.1 cliBudgetLimits_layout_bounds.2.2 -private theorem startup_argvAtRO_eq_strict_argvAtRO (a : BitVec 64) (xs : List (List (BitVec 8))) : - argvAtRO a xs = - LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.argvAtRO a xs := by - induction xs generalizing a with - | nil => rfl - | cons s ss ih => - simp only [argvAtRO, cStrAtRO, - LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.argvAtRO, - LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2.cStrAtRO, ih] - set_option maxHeartbeats 4000000 in set_option maxRecDepth 4000000 in /-- `MuslHarnessFineNeedLocksGuardedPerInput` at `StdMainEntryLr f3StdLayout` on @@ -1971,7 +1958,7 @@ theorem cliElf_f3MuslHarnessLr_of_linkedAt {mpl mmpl : Obj.MultiPlacement} (sm.readReg64 .x1) (("libsignal-cli" :: i.argv).map bytesOfString) ∗ stackAt sm.sp cliMainStk ∗ cliStaticsPlacedAt mpl ∗ Fr) := by have hargv_eq : inputs0.argv = ("libsignal-cli" :: i.argv).map bytesOfString := rfl - rw [hlibc_mmpl, htp_sm, hx1_sm, hsp_sm, ← startup_argvAtRO_eq_strict_argvAtRO, ← hargv_eq] + rw [hlibc_mmpl, htp_sm, hx1_sm, hsp_sm, ← hargv_eq] refine Satisfies.mono ?_ hm_sm_post dsimp only [Fr] refine Entails.trans diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfFob2W2InnerLinked.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfFob2W2InnerLinked.lean index e58d29fb9..cbb43415a 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfFob2W2InnerLinked.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfFob2W2InnerLinked.lean @@ -71,14 +71,14 @@ open CryptoVerification.SignalSession lsReadStdinSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli) open CryptoVerification.SignalSession.Cli (StoresGhost) -open CryptoVerification.SignalSession.Cli.KitInst - (cliGhostExterns_blackBox cliIdentityVtRoSym) +open CryptoVerification.SignalSession.Cli.KitInst (cliIdentityVtRoSym) open CryptoVerification.SignalSession.Cli.KitInst.IdKit (cliIdentityKitSpecPlaced_quiet) open CryptoVerification.SignalSession.Cli.KitInst.SessKit (cliSessionKitSpecPlaced_quiet) open CryptoVerification.SignalSession.Cli.MainHops (cliIo cliRunBudgets cliWrOk) open CryptoVerification.SignalSession.Cli.Placed (lsProg_589) open CryptoVerification.SignalSession.Cli.RunGlue - (CliGhostHooks CliGhostHooksFs cliExternsPlaced_row cliGhostExterns cliGhostExterns_other) + (CliGhostHooks CliGhostHooksFs cliExternsPlaced_row cliExtraGhostSyms cliGhostExterns + cliGhostExterns_other) open CryptoVerification.SignalSession.Cli.RunSkeleton (RunBudgets) open CryptoVerification.SignalSession.Cli.Slots (cliDecModelRecOkAt_opened fmtWrite_row_placed formatInner_row_placed libcruxHmac_row_placed @@ -123,7 +123,7 @@ open LibsignalBinary.Proofs.SessionRecordMin.DeserializeCancelBudget (RecordDeserializeCancelEnv sessDeserEvents_mem_recordDeserializeCancelEnv) open LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadFileBudgetPlaced (ReadFileRuleEnvFixed) open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.IdentityKitOkPlacedBudget - (cliIdKitOkIE_placed) + (cliIdKitOkIE_placed_sat) open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.SessionKitOkCliPlacedBudget (cliSessKitOkSE_seqFree_placed) open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) @@ -201,9 +201,12 @@ private theorem fob2_cliGhost_row_aux (mmpl : MultiPlacement) (g : CliGhostHooks (h5 : sym ≠ lsRustNoAllocShimSymCli := by decide) (h6 : sym ≠ lsStringCloneSym := by decide) (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : cliExtraGhostSyms.contains sym = false ∨ g.extra.lookup sym = none := by + left; decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 hExtra).trans + (cliExternsPlaced_row mmpl W hrow) private theorem fob2_fmtWriteHook0_budget_ok {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) : @@ -300,7 +303,7 @@ theorem fob2_decBinaryIdKitPlacedFixed_okIE [LibsignalPlacement] (decIdKitPlaced A.repAlloc F0 peer B) (decBinaryIdKitPlacedBudgetFixed A.repAlloc B F0 peer) (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - cliIdKitOkIE_placed + cliIdKitOkIE_placed_sat (readProg := lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (jRead := 589) (vtSym := cliIdentityVtRoSym) hDropNz (fun _ hp => hp.2) hh @@ -308,7 +311,7 @@ theorem fob2_decBinaryIdKitPlacedFixed_okIE [LibsignalPlacement] (ls_hook_ok_ultra_of_mem (prog := lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 589) hReadHook (by decide) (by decide) (by decide))) - (cliGhostExterns_blackBox mmpl gh W) + hh.blackBox (by decide) (Nat.le_refl _) (by decide) (Nat.le_refl _) /-! ## `InnerDecryptFrozenPlacedOk` Producers for `decryptSignal` -/ diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfMemmoveEntryGuard.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfMemmoveEntryGuard.lean new file mode 100644 index 000000000..e1907a406 --- /dev/null +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfMemmoveEntryGuard.lean @@ -0,0 +1,335 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Heap.Fine.F3LayoutData -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveCode -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords -- proof-setup: allow-public-import + +/-! +# Card CC-MEMMOVE (`memmove`) — `F3CodeInv` / `rxProg` Replay Wrappers & Block-`617` `"memmove"` Entry Guards (`ElfMemmoveEntryGuard`) + +Cutover-2 `c`-card companion to `Cli.HooksDehook.MemmoveExtraReplays` (modeled on +`ElfBcmpEntryGuard` @ `1583e332c6` and `ElfStrlenEntryGuard` @ `138b2e4236`, staying in the default +`LibsignalBinary` target with `0` `CliElfLib`, C2, or trusted imports): + +1. **Artifact 2b — `F3CodeInv` / `rxProg` `GhostRowReplayOn` Wrappers (`§1`):** + - Parameterized over `(CodeInv : Memory → Prop)` (`:= StartupStatics.F3CodeInv mpl mmpl` at C2) + and `(rxProg : Program)` (`:= Tie.f3TrialRxProg` at C2), taking STARTUP's stock-side facts as + verbatim premises matching `Lib2LayoutFacts.lean` (`origin/stock-lld/c2-startup-dnm` @ + `a230f2671b`: `:114`, `:203`, `:208–215`, `:271`, `:316`, `:317`, `:338`, `:355–362`, + `:392–402`, `:428`, `:444`) so C2 assembly discharges every premise with plain `exact`. + - Uses the 3-entry `.text.b_pre` hull (`rowSyms := ["memmove", "memcpy", "memset"]`, + `Lib2LayoutFacts.lean @ a230f2671b:392-402` `f3RowSyms_ghostProg617_externAt_none_of_ne_entries` + + `:355-362` `f3RxSeg_ghostProg617_externAt_entry`) so Stage A `"memcpy"` and `"memset"` ghosts + may remain simultaneously active in `EG W` (`hother`-free L3-d multi-ghost route). +2. **Artifact 3 — Block-`617` Startup `lr` (`memmoveEntryGuard` / `ExtraEntryGuard`) Discharge (`§2`):** + - Parameterized over `(keepBPre : BitVec 64 → Bool)` (`:= Lib2LayoutFacts.keepTextBPre` at C2), + taking `keepTextBPre_startupLr_false` (`:104`), `C2ExternTableFacts.batchLInKeep` (`:334` / `:419` + at `sym = "memmove"`), and hull inclusion (`:485` `f3BatchLEntryGuard_of_startupLr`) as verbatim + premises at `f3StdLayout.libcStartMainStage2Addr + 56#64` (`= StdMainEntryLr f3StdLayout s0`, + `rfl`-equal to `Lib2LayoutFacts.f3StartupLrVal` `:99`). + - Supplies table-level `ExtraEntryGuard` arm helpers (`extraEntryGuard_memmove_arm` and + `extraEntryGuard_singleton_memmove`). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfMemmoveEntryGuard + +open Arm64 Arm64.Obj Arm64.Process ProofLib ProofLib.StdStartup +open CryptoVerification.SignalSession (CliHooks cliExternsPlaced libsignalSessionLib) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Heap.Fine (f3StdLayout) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 (StdMainEntryLr) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay ( + ExtraEntryGuard GhostRowReplayOn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveCode (bPreMemmoveByteOff) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays ( + keepR_memmove keepR_memmove_of_code_offset + memcpyEntry memmoveEntry memmoveEntryGuard memmoveEntryGuard_iff + memmoveGhost memmoveGhost_rowReplayOn memmoveGhostK memmoveGhostK_rowReplayOn + memmoveHullWords memmoveHullWords_length + memmoveSubProg memmoveSubProg_base memmoveSubProg_code_length + memmoveSubProg_codeLoaded_of_stripExecOutside +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TrapSafeWords (TrapHook) + +/-! ## 1. Artifact 2b — `F3CodeInv` / `rxProg` `GhostRowReplayOn` Wrappers (Verbatim C2 Premises) -/ + +/-- Default-target sub-slice `CodeLoaded (stripExecOutside (keepR_memmove mpl) m)` projection from + `rxProg.CodeLoaded m` (`:= hInv.rxCode` at `rxProg := Tie.f3TrialRxProg`), mirroring + `Lib2LayoutFacts.lean @a230f2671b:203-215` (`f3CodeInv_rxWords_codeLoaded_strip`; cf. `:271` + `hasWords_subslice_of_hasWords`) while discharging `:214` (`hKeep`) automatically via + `keepR_memmove_of_code_offset`. -/ +theorem memmoveSubProg_codeLoaded_strip_of_rxProg + {mpl : Obj.MultiPlacement} {rxProg : Program} {m : Memory} + (hRx : rxProg.CodeLoaded m) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :208] f3CodeInv_rxWords_codeLoaded_strip: + (hAlign : (memcpyEntry mpl).toNat % 4 = 0) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :209] f3CodeInv_rxWords_codeLoaded_strip: + (hNoWrap : (memcpyEntry mpl).toNat + 4 * (memmoveHullWords mpl).length ≤ 2 ^ 64) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :210-213] f3CodeInv_rxWords_codeLoaded_strip + -- (cf. Lib2LayoutFacts.lean @a230f2671b:271 hasWords_subslice_of_hasWords): + (hSubSlice : ∀ (i : Nat) (hi : i < (memmoveSubProg mpl).code.length), + ∃ (j : Nat) (hj : j < rxProg.code.length), + memcpyEntry mpl + BitVec.ofNat 64 i = rxProg.base + BitVec.ofNat 64 j ∧ + (memmoveSubProg mpl).code[i] = rxProg.code[j]) : + (memmoveSubProg mpl).CodeLoaded (stripExecOutside (keepR_memmove mpl) m) := by + have hLen4 : 4 * (memmoveHullWords mpl).length = (memmoveSubProg mpl).code.length := by + rw [memmoveHullWords_length, memmoveSubProg_code_length] + rfl + have hAlignBase : (memmoveSubProg mpl).base.toNat % 4 = 0 := by + rw [memmoveSubProg_base] + exact hAlign + refine Program.CodeLoaded.intro hAlignBase (by rw [memmoveSubProg_base, ← hLen4]; exact hNoWrap) ?_ + intro i hi + obtain ⟨j, hj, haddr_eq, hbyte_eq⟩ := hSubSlice i hi + have hk_i : keepR_memmove mpl ((memmoveSubProg mpl).base + BitVec.ofNat 64 i) = true := + keepR_memmove_of_code_offset hi + rw [memmoveSubProg_base] at hk_i ⊢ + have hr_rx := hRx.byte_eq j hj + have hp_rx := hRx.perm_eq j hj + have hlf_rx := hRx.isLazyFree_eq j hj + rw [ProofLib.strip_read8, ProofLib.strip_perm_of_keep hk_i, ProofLib.strip_isLazyFree] + rw [haddr_eq, hr_rx, hbyte_eq, hp_rx, hlf_rx] + exact ⟨rfl, rfl, rfl⟩ + +/-- **Artifact 2b (direct `hStripCL` form):** `GhostRowReplayOn` over + `(fun u => CodeInv u.mem ∧ PredFs u.fs)` (`CodeInv := StartupStatics.F3CodeInv mpl mmpl`, + `rxProg := Tie.f3TrialRxProg`), consuming `f3CodeInv_rxWords_codeLoaded_strip`'s conclusion + (`Lib2LayoutFacts.lean @a230f2671b:203-215`) directly alongside `:114`, `:316`/`:317`/`:338` + (cf. `:428` `StepsVisitedIn`, `:444` `f3RxSeg_steps_realW_of_visitedIn`), `:355–362`, and + `:392–402` (`rowSyms := ["memmove", "memcpy", "memset"]`). -/ +theorem memmoveGhost_rowReplayOn_f3CodeInv_of_strip + (mpl mmpl : Obj.MultiPlacement) + (CodeInv : Memory → Prop) + (PredFs : FsState → Prop) + (rxProg : Program) + (EG : CliHooks → String → Option (State → State)) + (hMemmoveOff : memmoveEntry mpl = memcpyEntry mpl + bPreMemmoveByteOff) + (hInvKf : ∀ m m' : Memory, CodeInv m → m.KeepsFrozen m' → CodeInv m') + -- [Lib2LayoutFacts.lean @a230f2671b:203-215] f3CodeInv_rxWords_codeLoaded_strip + -- (cf. Lib2LayoutFacts.lean @a230f2671b:271 hasWords_subslice_of_hasWords): + (hStripCL : ∀ m : Memory, CodeInv m → + (memmoveSubProg mpl).CodeLoaded (stripExecOutside (keepR_memmove mpl) m)) + -- [Lib2LayoutFacts.lean @a230f2671b:114] keepTextBPre_sub_rxProg (composed with keepR_memmove ⊆ keepTextBPre): + (hSubRx : ∀ {pc : BitVec 64}, keepR_memmove mpl pc = true → progKeep rxProg pc = true) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :317, :338] C2ExternTableFacts.realRxNoExtern / + -- f3RxSeg_realProg617_externAt_none (cf. :428 StepsVisitedIn, :444 f3RxSeg_steps_realW_of_visitedIn): + (hRealRxNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + progKeep rxProg pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + -- [Lib2LayoutFacts.lean @a230f2671b:392-402] f3RowSyms_ghostProg617_externAt_none_of_ne_entries + -- (rowSyms := ["memmove", "memcpy", "memset"]): + (hGhostOffEntries : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memmove mpl pc = true → + pc ∉ ["memmove", "memcpy", "memset"].map (libsignalSessionLib.resolve mpl) → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) + -- [Lib2LayoutFacts.lean @a230f2671b:355-362] f3RxSeg_ghostProg617_externAt_entry: + (hGhostEntry : ∀ (W : CliHooks) {sym : String}, + sym ∈ ["memmove", "memcpy", "memset"] → + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl sym) = EG W sym) + (hMemmoveExt : ∀ W : CliHooks, + EG W "memmove" = none ∨ EG W "memmove" = some (memmoveGhost mpl mmpl)) + (hMemcpyTrap : ∀ (W : CliHooks) (f : State → State), + EG W "memcpy" = some f → ∀ L, TrapHook L f) + (hMemsetTrap : ∀ (W : CliHooks) (f : State → State), + EG W "memset" = some f → ∀ L, TrapHook L f) : + GhostRowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) + EG "memmove" (memmoveEntryGuard mpl) (memmoveGhost mpl mmpl) := + memmoveGhost_rowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) EG + hMemmoveOff + (fun u ⟨hCode, _⟩ => memmoveSubProg_codeLoaded_of_stripExecOutside (hStripCL u.mem hCode)) + (fun u v ⟨hCode, hFs⟩ hkf hfs => ⟨hInvKf u.mem v.mem hCode hkf, hfs ▸ hFs⟩) + (fun W {_} hk => hRealRxNoExt W (hSubRx hk)) + hGhostOffEntries + hGhostEntry + hMemmoveExt + hMemcpyTrap + hMemsetTrap + +/-- **Artifact 2b (slice-premise form):** `GhostRowReplayOn` over + `(fun u => CodeInv u.mem ∧ PredFs u.fs)` (`CodeInv := StartupStatics.F3CodeInv mpl mmpl`, + `rxProg := Tie.f3TrialRxProg`), taking the verbatim slice premises (`:208–213`) of + `Lib2LayoutFacts.f3CodeInv_rxWords_codeLoaded_strip` (`:203`) + `hInvRx : ∀ m, CodeInv m → + rxProg.CodeLoaded m` (`:= fun _ h => h.rxCode`). -/ +theorem memmoveGhost_rowReplayOn_f3CodeInv + (mpl mmpl : Obj.MultiPlacement) + (CodeInv : Memory → Prop) + (PredFs : FsState → Prop) + (rxProg : Program) + (EG : CliHooks → String → Option (State → State)) + (hMemmoveOff : memmoveEntry mpl = memcpyEntry mpl + bPreMemmoveByteOff) + (hInvRx : ∀ m : Memory, CodeInv m → rxProg.CodeLoaded m) + (hInvKf : ∀ m m' : Memory, CodeInv m → m.KeepsFrozen m' → CodeInv m') + -- [Lib2LayoutFacts.lean @a230f2671b:203, :208] f3CodeInv_rxWords_codeLoaded_strip: + (hAlign : (memcpyEntry mpl).toNat % 4 = 0) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :209] f3CodeInv_rxWords_codeLoaded_strip: + (hNoWrap : (memcpyEntry mpl).toNat + 4 * (memmoveHullWords mpl).length ≤ 2 ^ 64) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :210-213] f3CodeInv_rxWords_codeLoaded_strip + -- (cf. Lib2LayoutFacts.lean @a230f2671b:271 hasWords_subslice_of_hasWords): + (hSubSlice : ∀ (i : Nat) (hi : i < (memmoveSubProg mpl).code.length), + ∃ (j : Nat) (hj : j < rxProg.code.length), + memcpyEntry mpl + BitVec.ofNat 64 i = rxProg.base + BitVec.ofNat 64 j ∧ + (memmoveSubProg mpl).code[i] = rxProg.code[j]) + -- [Lib2LayoutFacts.lean @a230f2671b:114] keepTextBPre_sub_rxProg (composed with keepR_memmove ⊆ keepTextBPre): + (hSubRx : ∀ {pc : BitVec 64}, keepR_memmove mpl pc = true → progKeep rxProg pc = true) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :317, :338] C2ExternTableFacts.realRxNoExtern / + -- f3RxSeg_realProg617_externAt_none (cf. :428 StepsVisitedIn, :444 f3RxSeg_steps_realW_of_visitedIn): + (hRealRxNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + progKeep rxProg pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + -- [Lib2LayoutFacts.lean @a230f2671b:392-402] f3RowSyms_ghostProg617_externAt_none_of_ne_entries: + (hGhostOffEntries : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_memmove mpl pc = true → + pc ∉ ["memmove", "memcpy", "memset"].map (libsignalSessionLib.resolve mpl) → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) + -- [Lib2LayoutFacts.lean @a230f2671b:355-362] f3RxSeg_ghostProg617_externAt_entry: + (hGhostEntry : ∀ (W : CliHooks) {sym : String}, + sym ∈ ["memmove", "memcpy", "memset"] → + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl sym) = EG W sym) + (hMemmoveExt : ∀ W : CliHooks, + EG W "memmove" = none ∨ EG W "memmove" = some (memmoveGhost mpl mmpl)) + (hMemcpyTrap : ∀ (W : CliHooks) (f : State → State), + EG W "memcpy" = some f → ∀ L, TrapHook L f) + (hMemsetTrap : ∀ (W : CliHooks) (f : State → State), + EG W "memset" = some f → ∀ L, TrapHook L f) : + GhostRowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) + EG "memmove" (memmoveEntryGuard mpl) (memmoveGhost mpl mmpl) := + memmoveGhost_rowReplayOn_f3CodeInv_of_strip mpl mmpl CodeInv PredFs rxProg EG + hMemmoveOff hInvKf + (fun m hCode => + memmoveSubProg_codeLoaded_strip_of_rxProg (hInvRx m hCode) hAlign hNoWrap hSubSlice) + hSubRx hRealRxNoExt hGhostOffEntries hGhostEntry hMemmoveExt hMemcpyTrap hMemsetTrap + +/-- `K`-narrowed companion to `memmoveGhost_rowReplayOn_f3CodeInv_of_strip` (requiring zero + ghost-table or entry-`lr` premises). -/ +theorem memmoveGhostK_rowReplayOn_f3CodeInv_of_strip + (mpl mmpl : Obj.MultiPlacement) + (CodeInv : Memory → Prop) + (PredFs : FsState → Prop) + (rxProg : Program) + (EG : CliHooks → String → Option (State → State)) + (hMemmoveOff : memmoveEntry mpl = memcpyEntry mpl + bPreMemmoveByteOff) + (hInvKf : ∀ m m' : Memory, CodeInv m → m.KeepsFrozen m' → CodeInv m') + -- [Lib2LayoutFacts.lean @a230f2671b:203-215] f3CodeInv_rxWords_codeLoaded_strip: + (hStripCL : ∀ m : Memory, CodeInv m → + (memmoveSubProg mpl).CodeLoaded (stripExecOutside (keepR_memmove mpl) m)) + -- [Lib2LayoutFacts.lean @a230f2671b:114] keepTextBPre_sub_rxProg: + (hSubRx : ∀ {pc : BitVec 64}, keepR_memmove mpl pc = true → progKeep rxProg pc = true) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :317, :338] C2ExternTableFacts.realRxNoExtern / + -- f3RxSeg_realProg617_externAt_none: + (hRealRxNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + progKeep rxProg pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) + EG "memmove" (fun _ => True) (memmoveGhostK mpl mmpl) := + memmoveGhostK_rowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) EG + hMemmoveOff + (fun u ⟨hCode, _⟩ => memmoveSubProg_codeLoaded_of_stripExecOutside (hStripCL u.mem hCode)) + (fun u v ⟨hCode, hFs⟩ hkf hfs => ⟨hInvKf u.mem v.mem hCode hkf, hfs ▸ hFs⟩) + (fun W {_} hk => hRealRxNoExt W (hSubRx hk)) + +/-! ## 2. Artifact 3 — Block-`617` Startup `lr` (`memmoveEntryGuard` / `ExtraEntryGuard`) Discharge -/ + +/-- Concrete startup return address entering `main` (`block 617`), `rfl`-identical to + `Lib2LayoutFacts.f3StartupLrVal` (`Lib2LayoutFacts.lean @a230f2671b:99`) and proved equal to + `sm.readReg64 .lr` by `StartupStatics.cliElf_f3MuslHarnessLr_of_linkedAt`. -/ +@[expose] def f3StartupLrVal : BitVec 64 := + f3StdLayout.libcStartMainStage2Addr + 56#64 + +/-- Direct adapter from `Lib2LayoutFacts.f3BatchLEntryGuard_of_startupLr` + (`Lib2LayoutFacts.lean @a230f2671b:485-492`) into `memmoveEntryGuard mpl s0` (`Iff.rfl`). -/ +theorem f3MemmoveEntryGuard_of_batchLEntryGuard + {mpl : Obj.MultiPlacement} {s0 : State} + -- [Lib2LayoutFacts.lean @a230f2671b:485-492] f3BatchLEntryGuard_of_startupLr: + (hGuard : keepR_memmove mpl (s0.readReg64 .lr) = false ∧ + s0.readReg64 .lr ≠ libsignalSessionLib.resolve mpl "memmove") : + memmoveEntryGuard mpl s0 := + (memmoveEntryGuard_iff mpl s0).mpr hGuard + +/-- **Artifact 3 (`C11` §6.3):** Block-`617` `memmoveEntryGuard mpl s0` discharge from startup `lr` + (`s0.readReg64 .lr = f3StdLayout.libcStartMainStage2Addr + 56#64`), parameterized over + `keepBPre : BitVec 64 → Bool` (`:= Lib2LayoutFacts.keepTextBPre` at C2) so zero C2-only + constants are imported while every premise matches `Lib2LayoutFacts.lean @a230f2671b` verbatim. -/ +theorem f3MemmoveEntryGuard_of_startupLr + {mpl : Obj.MultiPlacement} {s0 : State} + (keepBPre : BitVec 64 → Bool) + -- [StartupStatics.cliElf_f3MuslHarnessLr_of_linkedAt; rfl-equal to Lib2LayoutFacts.f3StartupLrVal @a230f2671b:99]: + (hlr : s0.readReg64 .lr = f3StdLayout.libcStartMainStage2Addr + 56#64) + -- [Lib2LayoutFacts.lean @a230f2671b:104] keepTextBPre_startupLr_false: + (hLrOut : keepBPre (f3StdLayout.libcStartMainStage2Addr + 56#64) = false) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :334, :419] C2ExternTableFacts.batchLInKeep / + -- f3BatchL_dehookedSym_in_keepTextBPre (at sym = "memmove"): + (hSymIn : keepBPre (libsignalSessionLib.resolve mpl "memmove") = true) + -- [Lib2LayoutFacts.lean @a230f2671b:485, :490] f3BatchLEntryGuard_of_startupLr (`hsub` premise): + (hHullSub : ∀ pc : BitVec 64, keepR_memmove mpl pc = true → keepBPre pc = true) : + memmoveEntryGuard mpl s0 := by + rw [memmoveEntryGuard_iff, hlr] + refine ⟨?_, ?_⟩ + · cases hk : keepR_memmove mpl (f3StdLayout.libcStartMainStage2Addr + 56#64) + · rfl + · cases hLrOut.symm.trans (hHullSub _ hk) + · intro hEq + rw [hEq] at hLrOut + cases hLrOut.symm.trans hSymIn + +/-- `StdMainEntryLr f3StdLayout s0` wrapper around `f3MemmoveEntryGuard_of_startupLr` (matching + `ElfMemsetEntryGuard.f3MemsetEntryGuard_of_startupLr` / `StartupStatics`). -/ +theorem f3MemmoveEntryGuard_of_stdMainEntryLr + {mpl : Obj.MultiPlacement} {s0 : State} + (keepBPre : BitVec 64 → Bool) + (hlr : StdMainEntryLr f3StdLayout s0) + -- [Lib2LayoutFacts.lean @a230f2671b:104] keepTextBPre_startupLr_false: + (hLrOut : keepBPre (f3StdLayout.libcStartMainStage2Addr + 56#64) = false) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :334, :419] C2ExternTableFacts.batchLInKeep / + -- f3BatchL_dehookedSym_in_keepTextBPre (at sym = "memmove"): + (hSymIn : keepBPre (libsignalSessionLib.resolve mpl "memmove") = true) + -- [Lib2LayoutFacts.lean @a230f2671b:485, :490] f3BatchLEntryGuard_of_startupLr (`hsub` premise): + (hHullSub : ∀ pc : BitVec 64, keepR_memmove mpl pc = true → keepBPre pc = true) : + memmoveEntryGuard mpl s0 := + f3MemmoveEntryGuard_of_startupLr keepBPre hlr hLrOut hSymIn hHullSub + +/-- Per-arm `"memmove"` discharge for any `guardOf : String → State → Prop` agreeing with + `memmoveEntryGuard mpl` on `"memmove"`. -/ +theorem extraEntryGuard_memmove_arm + {mpl : Obj.MultiPlacement} {guardOf : String → State → Prop} {s0 : State} + (hGuardEq : guardOf "memmove" s0 ↔ memmoveEntryGuard mpl s0) + (hMemmoveGuard : memmoveEntryGuard mpl s0) : + guardOf "memmove" s0 := + hGuardEq.mpr hMemmoveGuard + +/-- Table-level `ExtraEntryGuard guardOf g s0` discharge when `g.extra` carries the singleton + `"memmove"` row `[("memmove", memmoveGhost mpl mmpl)]`. -/ +theorem extraEntryGuard_singleton_memmove + {mpl mmpl : Obj.MultiPlacement} {guardOf : String → State → Prop} + {g : CliGhostHooks} {s0 : State} + (hg : g.extra = [("memmove", memmoveGhost mpl mmpl)]) + (hGuardEq : guardOf "memmove" s0 ↔ memmoveEntryGuard mpl s0) + (hMemmoveGuard : memmoveEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := by + intro sym f _ hLook + rw [hg] at hLook + simp only [List.lookup] at hLook + by_cases hSym : (sym == "memmove") = true + · have hEq : sym = "memmove" := eq_of_beq hSym + subst hEq + exact hGuardEq.mpr hMemmoveGuard + · simp [hSym] at hLook + +end LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfMemmoveEntryGuard diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomC2EntryGuardLr.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomC2EntryGuardLr.lean new file mode 100644 index 000000000..209ad0b5f --- /dev/null +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomC2EntryGuardLr.lean @@ -0,0 +1,397 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Heap.Fine.F3LayoutData -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesData -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesPlaced -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfMemsetEntryGuard -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KHooks -- proof-setup: allow-public-import +public import ProofLib.ProgramReflection -- proof-setup: allow-public-import + +/-! +# Startup `StdMainEntryLr` Dischargers & Guarded-Harness Producer for `F3C2EntryGuard` (`ElfSlicesPqOomC2EntryGuardLr`) + +Delivers `api_A.md` §5R.c + H-REV4 `§5R verdict` (`C4`–`C6`) with `0` hex literals and `0` imports +from `C2RowLayoutFacts.Dalek` or `T4Witness` (resolving all 8 external symbols directly from +`ElfCodeMatchesPlaced.f3CliElf_libsignal_linkedAt_unique` and `lsPlacedStubPairs`): + +1. `f3FromUtf8EntryGuard_of_stdMainEntryLr` (`C5`): derives `resolve mpl lsFromUtf8Sym` from `hLs` + and `s0.readReg64 .lr = f3StdLayout.libcStartMainStage2Addr + 56#64` directly from + `hlr : StdMainEntryLr f3StdLayout s0`. +2. `c2GuardOf_of_stdMainEntryLr`, `extraEntryGuard_c2GuardOf_of_stdMainEntryLr`, + `extraEntryGuard_h2k_of_stdMainEntryLr`, and `f3C2EntryGuard_of_stdMainEntryLr`. +3. `cliElf_f3MuslHarness_c2EntryGuard_of_linkedAt` (`C6`): drop-in guarded-harness producer for + `ElfSlicesPqOomPlacedG.cliElf_f3B2NeedLocksAssumptionsG` (`ElfSlicesPqOomPlacedG.lean:63`), + ensuring zero new assumptions reach any headline theorem. +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomC2EntryGuardLr + +open Arm64 Arm64.Obj ProofLib.ProgramReflection +open VerifiedLibraries (mallocngLib) +open VerifiedLibraries.Mallocng (mallocngAddrsOfPlacement) +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession ( + CliHooks cliElfBytes cliElfImage cliExternsPlaced cliProcessInputs libsignalSessionLib + lsBlackBoxSym lsFromUtf8Sym lsSharedSecretDropSym lsStaticSecretDropSym +) +open CryptoVerification.SignalSession.Cli.MainHops (cliMainStk) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Heap.Fine (f3StdLayout fineCostModel) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 ( + MuslHarnessFineNeedLocksGuardedPerInput StdMainEntryLr cliBudgetLimits +) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced ( + cliProgExtPlacedAt cliStaticsPlacedAt patchElfTokensPlacedAt +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpCode (memcmpByteLen) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpLrTrap (BcmpEntryGuard keepBcmpHull) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxLrTrap ( + BlackBoxEntryGuard keepBlackBox +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard ( + F3C2EntryGuard c2GuardOf +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay (ExtraEntryGuard) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8Ghost (keepFromUtf8Block) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8LrTrap (FromUtf8EntryGuard) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveGhost (keepBPreHull) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhost (keepStrlenRange) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenLrTrap (StrlenEntryGuard) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeGhost (sharedSecretDropEntryOff) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ZeroizeLrTrap ( + SharedSecretDropEntryGuard StaticSecretDropEntryGuard + keepSharedSecretDropHull keepStaticSecretDrop +) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesData ( + f3LsSymAddrs lsInternedMultiLib lsPlacedStubPairs lsPlacedStubPairs_eq lsSharedExterns + ls_idsOk ls_names_nodup ls_sharedExterns_lt ls_toMultiPlacedLib_eq +) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesPlaced ( + f3CliElf_libsignal_linkedAt_unique f3LsMpl +) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics ( + F3CodeOk cliElf_f3MuslHarnessLr_of_linkedAt +) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfMemsetEntryGuard ( + f3MemsetMemcpyEntryLrFalse_of_stdMainEntryLr +) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KHooks (h2k_ghFixedK) + +noncomputable section + +private def findStubPosAux (target : String) : List (String × BitVec 64) → Nat → Nat + | [], acc => acc + | (nm, _) :: rest, acc => + if nm == target then acc else findStubPosAux target rest (acc + 1) + +private def stubPosOf (s : String) : Nat := + findStubPosAux s lsPlacedStubPairs 0 + +private def stubAddrOf (s : String) : BitVec 64 := + (lsPlacedStubPairs.getD (stubPosOf s) ("", 0#64)).2 + +private def f3StartupLrVal : BitVec 64 := + f3StdLayout.libcStartMainStage2Addr + 56#64 + +private def checkStubSymB (s : String) : Bool := + let pos := stubPosOf s + let idx := lsSharedExterns.getD pos 0 + let pair := lsPlacedStubPairs.getD pos ("", 0#64) + Nat.blt pos lsSharedExterns.length && + (pair.1 == s) && + (Obj.Interned.lookupBlockSymId idx lsInternedMultiLib.blocks == none) + +private def checkC2PinsB : Bool := + checkStubSymB "memcpy" && + checkStubSymB "memmove" && + checkStubSymB "bcmp" && + checkStubSymB "strlen" && + checkStubSymB lsFromUtf8Sym && + checkStubSymB lsBlackBoxSym && + checkStubSymB lsStaticSecretDropSym && + checkStubSymB lsSharedSecretDropSym + +private def checkC2LrDisjointB : Bool := + (!keepBPreHull (stubAddrOf "memcpy") f3StartupLrVal) && + !(f3StartupLrVal == stubAddrOf "memmove") && + (!keepBcmpHull (stubAddrOf "bcmp" - memcmpByteLen) f3StartupLrVal) && + !(f3StartupLrVal == stubAddrOf "bcmp") && + (!keepStrlenRange (stubAddrOf "strlen") f3StartupLrVal) && + !(f3StartupLrVal == stubAddrOf "strlen") && + (!keepFromUtf8Block (stubAddrOf lsFromUtf8Sym) f3StartupLrVal) && + !(f3StartupLrVal == stubAddrOf lsFromUtf8Sym) && + (!keepBlackBox (stubAddrOf lsBlackBoxSym) f3StartupLrVal) && + !(f3StartupLrVal == stubAddrOf lsBlackBoxSym) && + (!keepStaticSecretDrop (stubAddrOf lsStaticSecretDropSym) f3StartupLrVal) && + !(f3StartupLrVal == stubAddrOf lsStaticSecretDropSym) && + (!keepSharedSecretDropHull (stubAddrOf lsSharedSecretDropSym - sharedSecretDropEntryOff) f3StartupLrVal) && + !(f3StartupLrVal == stubAddrOf lsSharedSecretDropSym) + +set_option maxRecDepth 400000 in +private theorem checkC2PinsB_ok : checkC2PinsB = true := by + rfl_kernel + +set_option maxRecDepth 400000 in +private theorem checkC2LrDisjointB_ok : checkC2LrDisjointB = true := by + rfl_kernel + +private theorem stubAddrOf_def (s : String) : + stubAddrOf s = (lsPlacedStubPairs.getD (stubPosOf s) ("", 0#64)).2 := + rfl + +private theorem toMultiPlacement_rho_eq (mly : Obj.Interned.MultiLayout) (names : List String) + (s : String) : + (mly.toMultiPlacement names).ρ s = mly.addrs.getD (names.idxOf s) 0#64 := + rfl + +private theorem resolve_eq_stubAddrOf {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + {s : String} (hok : checkStubSymB s = true) : + libsignalSessionLib.resolve mpl s = stubAddrOf s := by + have hc : + (Nat.blt (stubPosOf s) lsSharedExterns.length && + ((lsPlacedStubPairs.getD (stubPosOf s) ("", 0#64)).1 == s) && + (Obj.Interned.lookupBlockSymId (lsSharedExterns.getD (stubPosOf s) 0) + lsInternedMultiLib.blocks == none)) = true := + hok + simp only [Bool.and_eq_true, Nat.blt_eq, beq_iff_eq] at hc + rcases hc with ⟨⟨hpos_lt, hpair_fst⟩, hblk_none⟩ + set pos := stubPosOf s + set idx := lsSharedExterns.getD pos 0 + have hidx_eq : idx = lsSharedExterns[pos]'hpos_lt := + Obj.Interned.getD_of_lt hpos_lt + have hidx_lt : idx < lsInternedMultiLib.names.length := by + have hmem_ext : idx ∈ lsSharedExterns := by + rw [hidx_eq] + exact List.getElem_mem hpos_lt + exact Nat.blt_eq.mp (List.all_eq_true.mp ls_sharedExterns_lt idx hmem_ext) + have hplen : pos < lsPlacedStubPairs.length := by + rw [lsPlacedStubPairs_eq, List.length_map] + exact hpos_lt + have hpair : + lsPlacedStubPairs.getD pos ("", 0#64) = + (lsInternedMultiLib.names.getD idx "", f3LsSymAddrs.getD idx 0#64) := by + rw [Obj.Interned.getD_of_lt hplen] + simp only [lsPlacedStubPairs_eq, List.getElem_map, ← hidx_eq] + have hname_eq : lsInternedMultiLib.names.getD idx "" = s := + (congrArg Prod.fst hpair).symm.trans hpair_fst + have haddr_eq : f3LsSymAddrs.getD idx 0#64 = stubAddrOf s := by + rw [stubAddrOf_def] + exact (congrArg Prod.snd hpair).symm + have hs_mem : s ∈ lsInternedMultiLib.names := by + rw [← hname_eq, Obj.Interned.getD_of_lt hidx_lt] + exact List.getElem_mem hidx_lt + have hnone : Obj.lookupBlockSym s libsignalSessionLib.blocks = none := by + rw [← hname_eq, ls_toMultiPlacedLib_eq, + Obj.Interned.lookupBlockSym_toMultiPlacedLib ls_names_nodup ls_idsOk hidx_lt] + exact hblk_none + have hres_mpl : libsignalSessionLib.resolve mpl s = mpl.ρ s := by + unfold Obj.MultiPlacedLib.resolve + rw [hnone] + have hρ_eq : mpl.ρ s = f3LsMpl.ρ s := + (f3CliElf_libsignal_linkedAt_unique hLs).2.2.1 s hs_mem hnone + have hidxOf : lsInternedMultiLib.names.idxOf s = idx := by + rw [← hname_eq] + exact Obj.Interned.idxOf_getD ls_names_nodup hidx_lt + have hρ_f3 : f3LsMpl.ρ s = f3LsSymAddrs.getD idx 0#64 := by + unfold f3LsMpl LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesData.f3LsMpl + rw [toMultiPlacement_rho_eq, hidxOf] + rfl + exact hres_mpl.trans (hρ_eq.trans (hρ_f3.trans haddr_eq)) + +private theorem c2Pins_parts : + checkStubSymB "memcpy" = true ∧ + checkStubSymB "memmove" = true ∧ + checkStubSymB "bcmp" = true ∧ + checkStubSymB "strlen" = true ∧ + checkStubSymB lsFromUtf8Sym = true ∧ + checkStubSymB lsBlackBoxSym = true ∧ + checkStubSymB lsStaticSecretDropSym = true ∧ + checkStubSymB lsSharedSecretDropSym = true := by + have h : + (checkStubSymB "memcpy" && + checkStubSymB "memmove" && + checkStubSymB "bcmp" && + checkStubSymB "strlen" && + checkStubSymB lsFromUtf8Sym && + checkStubSymB lsBlackBoxSym && + checkStubSymB lsStaticSecretDropSym && + checkStubSymB lsSharedSecretDropSym) = true := + checkC2PinsB_ok + simp only [Bool.and_eq_true] at h + exact ⟨h.1.1.1.1.1.1.1, h.1.1.1.1.1.1.2, h.1.1.1.1.1.2, h.1.1.1.1.2, + h.1.1.1.2, h.1.1.2, h.1.2, h.2⟩ + +private theorem c2LrDisjoint_parts : + (keepBPreHull (stubAddrOf "memcpy") f3StartupLrVal = false ∧ + f3StartupLrVal ≠ stubAddrOf "memmove") ∧ + (keepBcmpHull (stubAddrOf "bcmp" - memcmpByteLen) f3StartupLrVal = false ∧ + f3StartupLrVal ≠ stubAddrOf "bcmp") ∧ + (keepStrlenRange (stubAddrOf "strlen") f3StartupLrVal = false ∧ + f3StartupLrVal ≠ stubAddrOf "strlen") ∧ + (keepFromUtf8Block (stubAddrOf lsFromUtf8Sym) f3StartupLrVal = false ∧ + f3StartupLrVal ≠ stubAddrOf lsFromUtf8Sym) ∧ + (keepBlackBox (stubAddrOf lsBlackBoxSym) f3StartupLrVal = false ∧ + f3StartupLrVal ≠ stubAddrOf lsBlackBoxSym) ∧ + (keepStaticSecretDrop (stubAddrOf lsStaticSecretDropSym) f3StartupLrVal = false ∧ + f3StartupLrVal ≠ stubAddrOf lsStaticSecretDropSym) ∧ + (keepSharedSecretDropHull (stubAddrOf lsSharedSecretDropSym - sharedSecretDropEntryOff) f3StartupLrVal = false ∧ + f3StartupLrVal ≠ stubAddrOf lsSharedSecretDropSym) := by + have h : + ((!keepBPreHull (stubAddrOf "memcpy") f3StartupLrVal) && + !(f3StartupLrVal == stubAddrOf "memmove") && + (!keepBcmpHull (stubAddrOf "bcmp" - memcmpByteLen) f3StartupLrVal) && + !(f3StartupLrVal == stubAddrOf "bcmp") && + (!keepStrlenRange (stubAddrOf "strlen") f3StartupLrVal) && + !(f3StartupLrVal == stubAddrOf "strlen") && + (!keepFromUtf8Block (stubAddrOf lsFromUtf8Sym) f3StartupLrVal) && + !(f3StartupLrVal == stubAddrOf lsFromUtf8Sym) && + (!keepBlackBox (stubAddrOf lsBlackBoxSym) f3StartupLrVal) && + !(f3StartupLrVal == stubAddrOf lsBlackBoxSym) && + (!keepStaticSecretDrop (stubAddrOf lsStaticSecretDropSym) f3StartupLrVal) && + !(f3StartupLrVal == stubAddrOf lsStaticSecretDropSym) && + (!keepSharedSecretDropHull (stubAddrOf lsSharedSecretDropSym - sharedSecretDropEntryOff) f3StartupLrVal) && + !(f3StartupLrVal == stubAddrOf lsSharedSecretDropSym)) = true := + checkC2LrDisjointB_ok + simp only [Bool.and_eq_true, Bool.not_eq_true', beq_eq_false_iff_ne] at h + exact ⟨⟨h.1.1.1.1.1.1.1.1.1.1.1.1.1, h.1.1.1.1.1.1.1.1.1.1.1.1.2⟩, + ⟨h.1.1.1.1.1.1.1.1.1.1.1.2, h.1.1.1.1.1.1.1.1.1.1.2⟩, + ⟨h.1.1.1.1.1.1.1.1.1.2, h.1.1.1.1.1.1.1.1.2⟩, + ⟨h.1.1.1.1.1.1.1.2, h.1.1.1.1.1.1.2⟩, + ⟨h.1.1.1.1.1.2, h.1.1.1.1.2⟩, + ⟨h.1.1.1.2, h.1.1.2⟩, + ⟨h.1.2, h.2⟩⟩ + +attribute [local irreducible] stubPosOf stubAddrOf + +private theorem hlr_eq_startupLrVal {s0 : State} (hlr : StdMainEntryLr f3StdLayout s0) : + s0.readReg64 .lr = f3StartupLrVal := + hlr + +/-- Explicit `(C5)` discharger: derives `libsignalSessionLib.resolve mpl lsFromUtf8Sym = stubAddrOf lsFromUtf8Sym` + from `hLs` (`f3CliElf_libsignal_linkedAt_unique`) and `s0.readReg64 .lr = stage2 + 56#64` + directly from `hlr : StdMainEntryLr f3StdLayout s0`, closing `FromUtf8GhostReplays.fromUtf8EntryGuard`. -/ +theorem f3FromUtf8EntryGuard_of_stdMainEntryLr {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + {s0 : State} (hlr : StdMainEntryLr f3StdLayout s0) : + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8GhostReplays.fromUtf8EntryGuard + mpl s0 := by + unfold LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8GhostReplays.fromUtf8EntryGuard + FromUtf8EntryGuard + rw [resolve_eq_stubAddrOf hLs c2Pins_parts.2.2.2.2.1, hlr_eq_startupLrVal hlr] + exact c2LrDisjoint_parts.2.2.2.1 + +/-- Every `cliExtraGhostSyms` entry guard holds at `StdMainEntryLr f3StdLayout s0`. -/ +theorem c2GuardOf_of_stdMainEntryLr {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + {sym : String} {s0 : State} + (hlr : StdMainEntryLr f3StdLayout s0) : + c2GuardOf mpl sym s0 := by + unfold c2GuardOf + split + · unfold LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays.memmoveEntryGuard + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays.keepR_memmove + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays.memcpyEntry + rw [resolve_eq_stubAddrOf hLs c2Pins_parts.1, + resolve_eq_stubAddrOf hLs c2Pins_parts.2.1, + hlr_eq_startupLrVal hlr] + exact c2LrDisjoint_parts.1 + · split + · unfold LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays.bcmpEntryGuard + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays.bcmpHullBase + BcmpEntryGuard + rw [resolve_eq_stubAddrOf hLs c2Pins_parts.2.2.1, hlr_eq_startupLrVal hlr] + exact c2LrDisjoint_parts.2.1 + · split + · unfold LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays.strlenEntryGuard + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays.strlenEntry + StrlenEntryGuard + rw [resolve_eq_stubAddrOf hLs c2Pins_parts.2.2.2.1, hlr_eq_startupLrVal hlr] + exact c2LrDisjoint_parts.2.2.1 + · split + · trivial + · split + · exact f3FromUtf8EntryGuard_of_stdMainEntryLr hLs hlr + · split + · trivial + · split + · trivial + · split + · unfold LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhostReplays.blackBoxEntryGuard + BlackBoxEntryGuard + rw [resolve_eq_stubAddrOf hLs c2Pins_parts.2.2.2.2.2.1, hlr_eq_startupLrVal hlr] + exact c2LrDisjoint_parts.2.2.2.2.1 + · split + · unfold LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StaticSecretDropGhostReplays.staticSecretDropEntryGuard + StaticSecretDropEntryGuard + rw [resolve_eq_stubAddrOf hLs c2Pins_parts.2.2.2.2.2.2.1, hlr_eq_startupLrVal hlr] + exact c2LrDisjoint_parts.2.2.2.2.2.1 + · split + · unfold LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropGhostReplays.sharedSecretDropEntryGuard + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropGhostReplays.sharedSecretDropHullBase + SharedSecretDropEntryGuard + rw [resolve_eq_stubAddrOf hLs c2Pins_parts.2.2.2.2.2.2.2, hlr_eq_startupLrVal hlr] + exact c2LrDisjoint_parts.2.2.2.2.2.2 + · trivial + +/-- Generic `ExtraEntryGuard (c2GuardOf mpl) gh s0` startup discharge for ANY `gh : CliGhostHooks`. -/ +theorem extraEntryGuard_c2GuardOf_of_stdMainEntryLr {mpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (gh : CliGhostHooks) {s0 : State} + (hlr : StdMainEntryLr f3StdLayout s0) : + ExtraEntryGuard (c2GuardOf mpl) gh s0 := + fun _sym _f _hDom _hLook => c2GuardOf_of_stdMainEntryLr hLs hlr + +/-- Exact H-REV4 requested specialization at `gh := h2k_ghFixedK mpl mmpl`. -/ +theorem extraEntryGuard_h2k_of_stdMainEntryLr [LibsignalPlacement] + {mpl : Obj.MultiPlacement} (mmpl : Obj.MultiPlacement) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + {s0 : State} (hlr : StdMainEntryLr f3StdLayout s0) : + ExtraEntryGuard (c2GuardOf mpl) (h2k_ghFixedK mpl mmpl) s0 := + extraEntryGuard_c2GuardOf_of_stdMainEntryLr hLs (h2k_ghFixedK mpl mmpl) hlr + +/-- Combined `F3C2EntryGuard mpl mmpl s0` startup discharge (drop-in replacement at every + `f3MemsetMemcpyEntryLrFalse_of_stdMainEntryLr` call site). -/ +theorem f3C2EntryGuard_of_stdMainEntryLr {mpl mmpl : Obj.MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hMm : mallocngLib.LinkedAt cliElfBytes mmpl) + {s0 : State} (hlr : StdMainEntryLr f3StdLayout s0) : + F3C2EntryGuard mpl mmpl s0 := + ⟨f3MemsetMemcpyEntryLrFalse_of_stdMainEntryLr hMm hlr, + fun _sym _hDom => c2GuardOf_of_stdMainEntryLr hLs hlr⟩ + +/-- `(C6)` `W`-independent `F3C2EntryGuard mpl mmpl` guarded harness directly from + `StartupStatics.cliElf_f3MuslHarnessLr_of_linkedAt` (drop-in producer replacement for + `ElfMemsetEntryGuard.cliElf_f3MuslHarness_memsetMemcpyLrFalse_of_linkedAt` at + `ElfSlicesPqOomPlacedG.lean:63`). -/ +theorem cliElf_f3MuslHarness_c2EntryGuard_of_linkedAt {mpl mmpl : Obj.MultiPlacement} + (hls : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hmng : mallocngLib.LinkedAt cliElfBytes mmpl) + (W : CliHooks) : + MuslHarnessFineNeedLocksGuardedPerInput 80 + (mallocngAddrsOfPlacement mmpl).libc + (patchElfTokensPlacedAt mpl cliElfImage) + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) + (mpl.base 617) cliProcessInputs mmpl cliBudgetLimits fineCostModel.init cliMainStk + (F3CodeOk mpl mmpl) (cliStaticsPlacedAt mpl) + (F3C2EntryGuard mpl mmpl) := + (cliElf_f3MuslHarnessLr_of_linkedAt hls hmng W).mono_guard + (fun _ hlr => f3C2EntryGuard_of_stdMainEntryLr hls hmng hlr) + +end + +end LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomC2EntryGuardLr diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2Asm.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2Asm.lean index f90bdb4d2..a210abb58 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2Asm.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2Asm.lean @@ -12,11 +12,14 @@ module public import LibsignalBinary.Specifications.SignalSession.CliElf public import LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3BinaryOomProofF3G public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2G +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomPlaced public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomPlacedInst public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KHooks public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2ExecFrozenWire public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2Branch2 +import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2ExecFrozenWireExtra import LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3MatchingPathBF3 import LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3NonCanonF3 import LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3ParseRejectF3 @@ -112,15 +115,17 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadFileBudgetPlaced open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 (MainOkCliExtPqB2NeedLocksPlacedAt b2MainSpecTightNeedLocksFineAt cliBudgetLimits) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2G - (F3MemsetMemcpyEntryLrFalse MainOkCliF3PqB2NeedLocksPlacedAtG - mainOkCliF3PqG_of_block617TransferFixedG) + (MainOkCliF3PqB2NeedLocksPlacedAtG mainOkCliF3PqG_of_block617TransferFixedG) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3AllocStdinGhostHooks (ActiveF3CallPre f3LinkedCallHook) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt cliStaticsPlacedAt) -open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.Ghost617Transfer (GhostSymActive) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG (Block617TransferFixedHypG) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard + (F3C2EntryGuard c2GuardOf f3C2EntryGuard_imp_and_extraEntryGuard) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + (GhostSymActiveNamed GhostSymActive_iff_named_or_extra) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyCode (mallocngBlockProg20_externAt_none mallocngBlockProg20_hasWords masterMemcpySpec subroutine_ok_masterMemcpy_of_hasWords) @@ -152,17 +157,16 @@ open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2Branch2 (h2b2_realW_externAt_none_of_ghostSymActive h2b2_shim_branch2 h2b2_stub_alloc h2b2_stub_allocZeroed h2b2_stub_dealloc h2b2_stub_readFile h2b2_stub_readStdin h2b2_stub_realloc) -open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2ExecFrozenWire - (h2ef_block617TransferFixedG_of_steps_to_stepsAll_codeOnly - h2ef_block617TransferFixedG_replaysOn_false_codeOnly) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2ExecFrozenWireExtra + (block617TransferFixedG_replaysOn_false_codeOnly_withExtra) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopGeneric (h2fsgen_StepsVisitedIn h2fsgen_real_subroutine_run_visitedIn_of_stripS h2fsgen_stepsUntil_det) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KHooks - (h2k_CliGhostAllocHooksK h2k_CliGhostSpqrAllocHooksK h2k_CliRunHooksBundleK h2k_MainIoOfPlacedK - h2k_fds_of_noException h2k_ghFixedK h2k_hole2_hFsK h2k_hole2_hGSpqrK h2k_hole2_hHooksBundleK - h2k_hole2_hReadSatK h2k_hole2_hghNoAllocK h2k_hole2_hioOfK - h2k_keepSubLr_false_of_noException h2k_readFileFixedGhostHookFineSubK h2k_readFileSpecK - h2k_readStdinGhostHookFineSubK) + (c2_extraReplaysOn_h2k h2k_CliGhostAllocHooksK h2k_CliGhostSpqrAllocHooksK + h2k_CliRunHooksBundleK h2k_MainIoOfPlacedK h2k_fds_of_noException h2k_ghFixedK h2k_hole2_hFsK + h2k_hole2_hGSpqrK h2k_hole2_hHooksBundleK h2k_hole2_hReadSatK h2k_hole2_hghNoAllocK + h2k_hole2_hioOfK h2k_keepSubLr_false_of_noException h2k_readFileFixedGhostHookFineSubK + h2k_readFileSpecK h2k_readStdinGhostHookFineSubK) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMemcpy (h2k_ghFixedK_blk20TrapHook h2k_keepSub_covers_blk20) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMemset @@ -476,7 +480,7 @@ theorem h2asm_memcpyNarrow_replay617 (h2asm_stepsVisitedIn_mono (h2k_keepSub_covers_blk20 hMm) hvis) rwa [hsetpc] at hBody -/-- 10-way `GhostSymActive (h2k_ghFixedK mpl mmpl)` replay dispatcher closing +/-- 10-way `GhostSymActiveNamed (h2k_ghFixedK mpl mmpl)` replay dispatcher closing `lsRustNoAllocShimSymCli` via `h2b2_shim_branch2`, `lsStringCloneSym` via `hne_sc`, `lsMemsetSym` via `h2asm_memsetNarrow_replay617`, `lsMemcpySym` via `h2asm_memcpyNarrow_replay617`, and the remaining six hooks via `hBranch2`. -/ @@ -491,7 +495,7 @@ theorem h2asm_ghostReplay_of_branch2K ∀ (W : CliHooks) (sym : String) (f : State → State), sym ∈ (libsignalSessionLib.blockLib 617).text.externs → sym ≠ lsStringCloneSym → - GhostSymActive (h2k_ghFixedK mpl mmpl) sym f → + GhostSymActiveNamed (h2k_ghFixedK mpl mmpl) sym f → ∀ u : State, u.pc = libsignalSessionLib.resolve mpl sym → u.status = .Running → @@ -540,7 +544,7 @@ theorem h2asm_ghostReplay_of_branch2K /-! ## `Block617TransferFixedHypG` at `h2k_ghFixedK` -/ /-- Proves `Block617TransferFixedHypG` at `h2k_ghFixedK mpl mmpl` (`C3e-10G`) from `hF3Frozen` and -`hBranch2` via `h2ef_block617TransferFixedG_replaysOn_false_codeOnly`, `h2k_ghFixedK_blk{21,20}TrapHook` (`C3e-5/6`), and `h2k_ghFixedK_blk{21,20}_ext_trap` (`R2-T1`). -/ +`hBranch2` via `block617TransferFixedG_replaysOn_false_codeOnly_withExtra`, `h2k_ghFixedK_blk{21,20}TrapHook` (`C3e-5/6`), `h2k_ghFixedK_blk{21,20}_ext_trap` (`R2-T1`), and `c2_extraReplaysOn_h2k`. -/ theorem h2asm_hole2_hTrFrozenKG_of_f3Frozen (mpl mmpl : MultiPlacement) (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) @@ -552,20 +556,24 @@ theorem h2asm_hole2_hTrFrozenKG_of_f3Frozen letI : LibsignalPlacement := libsignalPlacementOf mpl (hole2_hblk mpl hLs) (hole2_hext_nodup mpl hLs) Block617TransferFixedHypG mpl mmpl (fun W => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W)) - (cliExternsPlaced mmpl) (F3MemsetMemcpyEntryLrFalse mmpl) + (cliExternsPlaced mmpl) (F3C2EntryGuard mpl mmpl) (LibsignalFrozen mpl) (F3CodeOk mpl mmpl) (mallocngAddrsOfPlacement mmpl).libc cliElfImage.brkStart cliMainStk := by letI : LibsignalPlacement := libsignalPlacementOf mpl (hole2_hblk mpl hLs) (hole2_hext_nodup mpl hLs) - exact h2ef_block617TransferFixedG_replaysOn_false_codeOnly mpl mmpl hF3Frozen - (fun W _sym _f hsym_ext hAct => - h2b2_realW_externAt_none_of_ghostSymActive hLs (h2k_ghFixedK mpl mmpl) W hsym_ext hAct) - (h2asm_ghostReplay_of_branch2K hLs hMm hBranch2) - (@h2k_keepSubLr_false_of_noException _ mpl mmpl) - (@h2k_fds_of_noException _ mpl mmpl) - (fun hext hnoShim => h2k_ghFixedK_blk21TrapHook mpl hMm hext hnoShim) - (fun hext hnoShim => h2k_ghFixedK_blk20TrapHook mpl hMm hext hnoShim) - (h2k_ghFixedK_blk21_ext_trap hLs hMm) - (h2k_ghFixedK_blk20_ext_trap hLs hMm) + exact Block617TransferFixedHypG.mono_guard + (f3C2EntryGuard_imp_and_extraEntryGuard mpl mmpl (h2k_ghFixedK mpl mmpl)) + (block617TransferFixedG_replaysOn_false_codeOnly_withExtra mpl mmpl (c2GuardOf mpl) hF3Frozen + (fun W sym f hsym_ext hAct => + h2b2_realW_externAt_none_of_ghostSymActive hLs (h2k_ghFixedK mpl mmpl) W hsym_ext + ((GhostSymActive_iff_named_or_extra (h2k_ghFixedK mpl mmpl) sym f).mpr (Or.inl hAct))) + (h2asm_ghostReplay_of_branch2K hLs hMm hBranch2) + (@h2k_keepSubLr_false_of_noException _ mpl mmpl) + (@h2k_fds_of_noException _ mpl mmpl) + (fun hext hnoShim => h2k_ghFixedK_blk21TrapHook mpl hMm hext hnoShim) + (fun hext hnoShim => h2k_ghFixedK_blk20TrapHook mpl hMm hext hnoShim) + (h2k_ghFixedK_blk21_ext_trap hLs hMm) + (h2k_ghFixedK_blk20_ext_trap hLs hMm) + (c2_extraReplaysOn_h2k mpl mmpl hLs)) /-- Proves `Block617TransferFixedHypG` at `h2k_ghFixedK mpl mmpl` from `hBranch2`, discharging `hF3Frozen` via `hole_gap3_f3CodeOk_to_libsignalFrozen`. -/ @@ -579,7 +587,7 @@ theorem h2asm_hole2_hTrFrozenKG letI : LibsignalPlacement := libsignalPlacementOf mpl (hole2_hblk mpl hLs) (hole2_hext_nodup mpl hLs) Block617TransferFixedHypG mpl mmpl (fun W => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W)) - (cliExternsPlaced mmpl) (F3MemsetMemcpyEntryLrFalse mmpl) + (cliExternsPlaced mmpl) (F3C2EntryGuard mpl mmpl) (LibsignalFrozen mpl) (F3CodeOk mpl mmpl) (mallocngAddrsOfPlacement mmpl).libc cliElfImage.brkStart cliMainStk := letI : LibsignalPlacement := libsignalPlacementOf mpl (hole2_hblk mpl hLs) (hole2_hext_nodup mpl hLs) @@ -587,8 +595,8 @@ theorem h2asm_hole2_hTrFrozenKG (fun _m hCO => hole_gap3_f3CodeOk_to_libsignalFrozen hLs hCO) hBranch2 -/-- Plain-`Steps` route to `Block617TransferFixedHypG` at `h2k_ghFixedK` via -`h2ef_block617TransferFixedG_of_steps_to_stepsAll_codeOnly`. -/ +/-- Plain-`Steps` route to `Block617TransferFixedHypG` at `h2k_ghFixedK` (delegating to +`h2asm_hole2_hTrFrozenKG`). -/ theorem h2asm_hole2_hTrFrozenKG_steps (mpl mmpl : MultiPlacement) (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) @@ -599,21 +607,10 @@ theorem h2asm_hole2_hTrFrozenKG_steps letI : LibsignalPlacement := libsignalPlacementOf mpl (hole2_hblk mpl hLs) (hole2_hext_nodup mpl hLs) Block617TransferFixedHypG mpl mmpl (fun W => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W)) - (cliExternsPlaced mmpl) (F3MemsetMemcpyEntryLrFalse mmpl) + (cliExternsPlaced mmpl) (F3C2EntryGuard mpl mmpl) (LibsignalFrozen mpl) (F3CodeOk mpl mmpl) - (mallocngAddrsOfPlacement mmpl).libc cliElfImage.brkStart cliMainStk := by - letI : LibsignalPlacement := libsignalPlacementOf mpl (hole2_hblk mpl hLs) (hole2_hext_nodup mpl hLs) - exact h2ef_block617TransferFixedG_of_steps_to_stepsAll_codeOnly mpl mmpl - (fun _m hCO => hole_gap3_f3CodeOk_to_libsignalFrozen hLs hCO) - (fun W _sym _f hsym_ext hAct => - h2b2_realW_externAt_none_of_ghostSymActive hLs (h2k_ghFixedK mpl mmpl) W hsym_ext hAct) - (h2asm_ghostReplay_of_branch2K hLs hMm hBranch2) - (@h2k_keepSubLr_false_of_noException _ mpl mmpl) - (@h2k_fds_of_noException _ mpl mmpl) - (fun hext hnoShim => h2k_ghFixedK_blk21TrapHook mpl hMm hext hnoShim) - (fun hext hnoShim => h2k_ghFixedK_blk20TrapHook mpl hMm hext hnoShim) - (h2k_ghFixedK_blk21_ext_trap hLs hMm) - (h2k_ghFixedK_blk20_ext_trap hLs hMm) + (mallocngAddrsOfPlacement mmpl).libc cliElfImage.brkStart cliMainStk := + h2asm_hole2_hTrFrozenKG mpl mmpl hLs hMm hBranch2 /-! ## K-Pinned Witness Carrier and 6-Arm `MainOk*G` Assembly -/ @@ -628,7 +625,7 @@ structure h2asm_F3CliElfGhostWitnessK (mpl mmpl : MultiPlacement) where letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup Block617TransferFixedHypG mpl mmpl (fun W => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W)) - (cliExternsPlaced mmpl) (F3MemsetMemcpyEntryLrFalse mmpl) + (cliExternsPlaced mmpl) (F3C2EntryGuard mpl mmpl) (LibsignalFrozen mpl) (F3CodeOk mpl mmpl) (mallocngAddrsOfPlacement mmpl).libc cliElfImage.brkStart cliMainStk hGSpqr : diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2Branch2.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2Branch2.lean index 15b120085..3a6c02f46 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2Branch2.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2Branch2.lean @@ -38,6 +38,9 @@ public import LibsignalBinary.Specifications.SignalSession.CliElf public import ProofLib public import ProofLib.Placed.Multi public import ProofLib.ProgramReflection +import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.T4Witness +import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay +import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopAlloc import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopDealloc import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopReads @@ -80,11 +83,12 @@ open VerifiedLibraries (mallocngLib) open CryptoVerification (LibsignalPlacement) open CryptoVerification.SignalSession (CliHooks cliDehookedSymsPlaced cliElfBytes cliElfImage cliElf_staticOk cliExternsPlaced - libsignalSessionLib lsReadFileSym lsReadStdinSym lsRustAllocSymCli lsRustAllocZeroedSymCli - lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli lsStringCloneSym) + libsignalSessionLib lsBlackBoxSym lsDurationSinceSym lsFromUtf8Sym lsMemrchrSym lsReadFileSym + lsReadStdinSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli + lsRustNoAllocShimSymCli lsRustReallocSymCli lsSharedSecretDropSym lsStaticSecretDropSym + lsStringCloneSym lsTimeAddSym) open CryptoVerification.SignalSession.Cli.MainHops (cliIo) -open CryptoVerification.SignalSession.Cli.RunGlue - (CliGhostHooks IsFsC cliGhostExterns cliGhostExterns_memcpy_some cliGhostExterns_memset_some) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks IsFsC cliGhostExterns) open CryptoVerification.SignalSession.Placed (DirectOrBranchStub) open LibsignalBinary.Heap (rustCliAllocBudgetSpec rustCliDeallocBudgetSpec) open LibsignalBinary.Heap.Fine @@ -107,13 +111,21 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt loadState_patchElfTokensPlacedAt) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.Ghost617Transfer (GhostSymActive StubReachesTargetOn stubReachesTargetOn_of_directOrBranchStub) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.T4Witness + (c2ExternTableFacts_of_linkedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + (cliGhostExternsWithExtra_eq_some_of_active cliGhostExternsWithExtra_nil_of_named) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced (ReadStdinBoundedEnv readStdinSpecOfPlaced) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (cliExtraGhostSyms cliGhostExternsWithExtra) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesData (cliDehookedSymsPlaced_eq_entries f3DehookedEntries lsInternedMultiLib lsSharedExterns ls_block617_externs_eq ls_idsOk ls_names_nodup ls_sharedExterns_lt ls_toMultiPlacedLib_eq) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesPlaced (f3TrialElfSymChars f3TrialElfSyms_eq) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Lib2LayoutFacts + (keepLib2Text_sub_rxProg keepTextBPre_sub_rxProg) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics (F3CodeInv cliElf_tokenCellsPlacedAt_of_linkedAt keepsFrozen_cliTokenPatchPlacedAt) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Tie @@ -141,7 +153,9 @@ open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2StepsLiftR2 open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomPlacedInst (hole2_emptyProg hole2_hookStack hole2_keep hole2_keepSub hole2_targets) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen - (wp4MemcpyRealAddr wp4MemsetRealAddr) + (c2BatchLDehookedSyms c2BcmpAddr c2BlackBoxAddr c2DurationSinceAddr c2FromUtf8Addr + c2Lib2DehookedSyms c2MemmoveAddr c2MemrchrAddr c2SharedSecretDropAddr c2StaticSecretDropAddr + c2StrlenAddr c2TimeAddAddr wp4MemcpyRealAddr wp4MemsetRealAddr) /-! ## Unpatched Raw ELF Load Bridge -/ @@ -171,11 +185,14 @@ theorem h2b2_unpatched_load {mpl mmpl : MultiPlacement} {m : Memory} /-! ## Dehooked Symbol Resolution and `.symtab` Target-VA Table -/ -/-- Expected `(symbol, targetVa)` pairs for the `9` symbols in `cliDehookedSymsPlaced`: +/-- Expected `(symbol, targetVa)` pairs for the `19` symbols in `cliDehookedSymsPlaced`: `shim` (`f3NoShimV2Addr = 0x469640#64`), the `4` `rdl_shim.S` allocator thunk entries (`f3StubAddrs.{alloc,dealloc,realloc}`, `f3StubAzAddr`), the `2` IO entries - (`readFile` at `0x4691b4#64`, `readStdin` at `0x469000#64`), and - `memcpy` (`wp4MemcpyRealAddr`), `memset` (`wp4MemsetRealAddr`). -/ + (`readFile` at `0x4691b4#64`, `readStdin` at `0x469000#64`), + `memcpy` (`wp4MemcpyRealAddr`), `memset` (`wp4MemsetRealAddr`), and the `10` Cutover-2 + (`C2`) de-hooked entries (`memmove`, `bcmp`, `strlen`, `memrchr`, `from_utf8`, + `duration_since`, `SystemTime::add`, `black_box`, `StaticSecret::drop`, + `SharedSecret::drop`). -/ def h2b2_dehookedTargetPairs : List (String × BitVec 64) := [ (lsRustNoAllocShimSymCli, f3NoShimV2Addr), (lsRustAllocSymCli, f3StubAddrs.alloc), @@ -185,7 +202,17 @@ def h2b2_dehookedTargetPairs : List (String × BitVec 64) := (lsReadFileSym, 0x4691b4#64), (lsReadStdinSym, 0x469000#64), ("memcpy", wp4MemcpyRealAddr), - ("memset", wp4MemsetRealAddr) ] + ("memset", wp4MemsetRealAddr), + ("memmove", c2MemmoveAddr), + ("bcmp", c2BcmpAddr), + ("strlen", c2StrlenAddr), + (lsMemrchrSym, c2MemrchrAddr), + (lsFromUtf8Sym, c2FromUtf8Addr), + (lsDurationSinceSym, c2DurationSinceAddr), + (lsTimeAddSym, c2TimeAddAddr), + (lsBlackBoxSym, c2BlackBoxAddr), + (lsStaticSecretDropSym, c2StaticSecretDropAddr), + (lsSharedSecretDropSym, c2SharedSecretDropAddr) ] private theorem h2b2_f3DehookedEntries_pairs_eq : (f3DehookedEntries.map fun e => (String.ofList e.2.1, e.2.2.2)) = h2b2_dehookedTargetPairs := by @@ -566,28 +593,8 @@ theorem h2b2_cliGhostExterns_eq_some_of_active (g : CliGhostHooks) (baseExt : String → Option (State → State)) {sym : String} {f : State → State} (hAct : GhostSymActive g sym f) : - cliGhostExterns g baseExt sym = some f := by - rcases hAct with - ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | - ⟨rfl, hsc⟩ | ⟨rfl, hg, hrf⟩ | ⟨rfl, hg, hrs⟩ | ⟨rfl, hms⟩ | ⟨rfl, hmc⟩ - · unfold cliGhostExterns lsRustAllocSymCli; simp - · unfold cliGhostExterns lsRustDeallocSymCli lsRustAllocSymCli; simp - · unfold cliGhostExterns lsRustReallocSymCli lsRustAllocSymCli lsRustDeallocSymCli; simp - · unfold cliGhostExterns lsRustAllocZeroedSymCli lsRustAllocSymCli lsRustDeallocSymCli - lsRustReallocSymCli; simp - · unfold cliGhostExterns lsRustNoAllocShimSymCli lsRustAllocSymCli lsRustDeallocSymCli - lsRustReallocSymCli lsRustAllocZeroedSymCli; simp - · unfold cliGhostExterns lsStringCloneSym lsRustAllocSymCli lsRustDeallocSymCli - lsRustReallocSymCli lsRustAllocZeroedSymCli lsRustNoAllocShimSymCli; simp [hsc] - · unfold cliGhostExterns lsReadFileSym lsRustAllocSymCli lsRustDeallocSymCli - lsRustReallocSymCli lsRustAllocZeroedSymCli lsRustNoAllocShimSymCli lsStringCloneSym - simp [hrf] - · unfold cliGhostExterns lsReadStdinSym lsRustAllocSymCli lsRustDeallocSymCli - lsRustReallocSymCli lsRustAllocZeroedSymCli lsRustNoAllocShimSymCli lsStringCloneSym - lsReadFileSym - simp [hrs] - · exact cliGhostExterns_memset_some g baseExt hms - · exact cliGhostExterns_memcpy_some g baseExt hmc + cliGhostExterns g baseExt sym = some f := + cliGhostExternsWithExtra_eq_some_of_active g g.extra baseExt hAct /-- On every active ghost symbol, `cliGhostExterns g (cliExternsPlaced mmpl W) sym` equals `cliGhostExterns g (fun _ => none) sym`. -/ @@ -613,7 +620,7 @@ theorem h2b2_realW_externAt_none_of_ghostSymActive (libsignalSessionLib.resolve mpl sym) = none := by rcases hAct with ⟨rfl, _⟩ | ⟨rfl, _⟩ | ⟨rfl, _⟩ | ⟨rfl, _⟩ | ⟨rfl, _⟩ | - ⟨rfl, _⟩ | ⟨rfl, _⟩ | ⟨rfl, _⟩ | ⟨rfl, _⟩ | ⟨rfl, _⟩ + ⟨rfl, _⟩ | ⟨rfl, _⟩ | ⟨rfl, _⟩ | ⟨rfl, _⟩ | ⟨rfl, _⟩ | ⟨hDom, _⟩ · exact (h2b2_dehooked_stubReachesTargetOn hLs (tgt := f3StubAddrs.alloc) (by simp [h2b2_dehookedTargetPairs]) W).1 · exact (h2b2_dehooked_stubReachesTargetOn hLs (tgt := f3StubAddrs.dealloc) @@ -633,6 +640,25 @@ theorem h2b2_realW_externAt_none_of_ghostSymActive (by simp [h2b2_dehookedTargetPairs]) W).1 · exact (h2b2_dehooked_stubReachesTargetOn hLs (tgt := wp4MemcpyRealAddr) (by simp [h2b2_dehookedTargetPairs]) W).1 + · have hExt := c2ExternTableFacts_of_linkedAt hLs + have hSplit : ∀ s ∈ cliExtraGhostSyms, + s ∈ c2BatchLDehookedSyms ∨ s ∈ c2Lib2DehookedSyms := by + intro s hs + simp only [cliExtraGhostSyms, List.mem_cons, List.not_mem_nil, or_false] at hs + rcases hs with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl + · exact Or.inl (.head _) + · exact Or.inl (.tail _ (.head _)) + · exact Or.inl (.tail _ (.tail _ (.head _))) + · exact Or.inr (.head _) + · exact Or.inr (.tail _ (.head _)) + · exact Or.inr (.tail _ (.tail _ (.head _))) + · exact Or.inr (.tail _ (.tail _ (.tail _ (.tail _ (.tail _ (.tail _ (.head _))))))) + · exact Or.inr (.tail _ (.tail _ (.tail _ (.head _)))) + · exact Or.inr (.tail _ (.tail _ (.tail _ (.tail _ (.tail _ (.head _)))))) + · exact Or.inr (.tail _ (.tail _ (.tail _ (.tail _ (.head _))))) + rcases hSplit sym (List.contains_iff_mem.mp hDom) with hBL | hL2 + · exact hExt.realRxNoExtern mmpl W (keepTextBPre_sub_rxProg (hExt.batchLInKeep hBL)) + · exact hExt.realRxNoExtern mmpl W (keepLib2Text_sub_rxProg (hExt.lib2InKeep hL2)) /-! ## Non-`.Exception` Guard Extraction and First-Stop Bundle -/ @@ -684,7 +710,7 @@ private theorem h2b2_activeF3CallPre_of_f3LinkedCallHook_noException {α : Type} theorem h2b2_keepLr_false_of_noException [LibsignalPlacement] (mpl mmpl : MultiPlacement) {sym : String} {f : State → State} {a : State} - (hext : cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f) + (hext : cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) sym = some f) (hnoShim : sym ≠ lsRustNoAllocShimSymCli) (hnoex : ∀ msg, (f a).status ≠ .Exception msg) (hnoMs : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) @@ -697,7 +723,7 @@ theorem h2b2_keepLr_false_of_noException [LibsignalPlacement] theorem h2b2_keepSubLr_false_of_noException [LibsignalPlacement] (mpl mmpl : MultiPlacement) {sym : String} {f : State → State} {a : State} - (hext : cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f) + (hext : cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) sym = some f) (hnoShim : sym ≠ lsRustNoAllocShimSymCli) (hnoex : ∀ msg, (f a).status ≠ .Exception msg) (hnoMs : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) @@ -920,9 +946,10 @@ theorem h2b2_branch2_alloc_kHook_perPc [LibsignalPlacement] {mpl mmpl : MultiPla F3CodeInv mpl mmpl ((h2k_ghFixedK mpl mmpl).alloc u).mem ∧ ((h2k_ghFixedK mpl mmpl).alloc u).fs = u.fs := by have hext0 : - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) lsRustAllocSymCli = + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) lsRustAllocSymCli = some (h2k_ghFixedK mpl mmpl).alloc := - h2b2_cliGhostExterns_eq_some_of_active (h2k_ghFixedK mpl mmpl) (fun _ => none) (Or.inl ⟨rfl, rfl⟩) + cliGhostExternsWithExtra_nil_of_named (h2k_ghFixedK mpl mmpl) (fun _ => none) + (Or.inl ⟨rfl, rfl⟩) have hlr : hole2_keepSub (u.readReg64 .lr) = false := h2k_keepSubLr_false_of_noException mpl mmpl hext0 (by decide) hnoex exact h2b2_branch2_alloc_explicitLr_perPc hLs hMm W hpc hrun hnoex hFr hlr hInv @@ -963,9 +990,9 @@ theorem h2b2_branch2_allocZeroed_kHook_perPc [LibsignalPlacement] {mpl mmpl : Mu F3CodeInv mpl mmpl ((h2k_ghFixedK mpl mmpl).allocZeroed u).mem ∧ ((h2k_ghFixedK mpl mmpl).allocZeroed u).fs = u.fs := by have hext0 : - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) lsRustAllocZeroedSymCli = + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) lsRustAllocZeroedSymCli = some (h2k_ghFixedK mpl mmpl).allocZeroed := - h2b2_cliGhostExterns_eq_some_of_active (h2k_ghFixedK mpl mmpl) (fun _ => none) + cliGhostExternsWithExtra_nil_of_named (h2k_ghFixedK mpl mmpl) (fun _ => none) (Or.inr (Or.inr (Or.inr (Or.inl ⟨rfl, rfl⟩)))) have hlr : hole2_keepSub (u.readReg64 .lr) = false := h2k_keepSubLr_false_of_noException mpl mmpl hext0 (by decide) hnoex @@ -1007,9 +1034,9 @@ theorem h2b2_branch2_dealloc_kHook_perPc [LibsignalPlacement] {mpl mmpl : MultiP F3CodeInv mpl mmpl ((h2k_ghFixedK mpl mmpl).dealloc u).mem ∧ ((h2k_ghFixedK mpl mmpl).dealloc u).fs = u.fs := by have hext0 : - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) lsRustDeallocSymCli = + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) lsRustDeallocSymCli = some (h2k_ghFixedK mpl mmpl).dealloc := - h2b2_cliGhostExterns_eq_some_of_active (h2k_ghFixedK mpl mmpl) (fun _ => none) + cliGhostExternsWithExtra_nil_of_named (h2k_ghFixedK mpl mmpl) (fun _ => none) (Or.inr (Or.inl ⟨rfl, rfl⟩)) have hlr : hole2_keepSub (u.readReg64 .lr) = false := h2k_keepSubLr_false_of_noException mpl mmpl hext0 (by decide) hnoex @@ -1052,9 +1079,9 @@ theorem h2b2_branch2_realloc_kHook_perPc [LibsignalPlacement] {mpl mmpl : MultiP F3CodeInv mpl mmpl ((h2k_ghFixedK mpl mmpl).realloc u).mem ∧ ((h2k_ghFixedK mpl mmpl).realloc u).fs = u.fs := by have hext0 : - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) lsRustReallocSymCli = + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) lsRustReallocSymCli = some (h2k_ghFixedK mpl mmpl).realloc := - h2b2_cliGhostExterns_eq_some_of_active (h2k_ghFixedK mpl mmpl) (fun _ => none) + cliGhostExternsWithExtra_nil_of_named (h2k_ghFixedK mpl mmpl) (fun _ => none) (Or.inr (Or.inr (Or.inl ⟨rfl, rfl⟩))) have hlr : hole2_keepSub (u.readReg64 .lr) = false := h2k_keepSubLr_false_of_noException mpl mmpl hext0 (by decide) hnoex @@ -1143,6 +1170,15 @@ theorem h2b2_branch2_readFile_kHook_perPc [LibsignalPlacement] {mpl mmpl : Multi F3CodeInv mpl mmpl (f u).mem ∧ (f u).fs = u.fs := by have hext0 : + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) lsReadFileSym = + some (h2k_readFileFixedGhostHookFineK hole2_keepSub hole2_emptyProg f3TrialRxProg + (hole2_targets mpl).readFile mmpl cliElfImage.brkStart cliBudgetLimits hole2_hookStack) := + cliGhostExternsWithExtra_nil_of_named (h2k_ghFixedK mpl mmpl) (fun _ => none) + (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inl ⟨rfl, + (h2k_readFileFixedGhostHookFineSubK hole2_keepSub hole2_emptyProg f3TrialRxProg + (hole2_targets mpl).readFile mmpl cliElfImage.brkStart cliBudgetLimits hole2_hookStack).2, + rfl⟩))))))) + have hext_fds : cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) lsReadFileSym = some (h2k_readFileFixedGhostHookFineK hole2_keepSub hole2_emptyProg f3TrialRxProg (hole2_targets mpl).readFile mmpl cliElfImage.brkStart cliBudgetLimits hole2_hookStack) := @@ -1154,7 +1190,7 @@ theorem h2b2_branch2_readFile_kHook_perPc [LibsignalPlacement] {mpl mmpl : Multi have hlr : hole2_keepSub (u.readReg64 .lr) = false := h2k_keepSubLr_false_of_noException mpl mmpl hext0 (by decide) hnoex have hFds : FdsGe3Closed u.fs := - h2k_fds_of_noException mpl mmpl hext0 hnoex + h2k_fds_of_noException mpl mmpl hext_fds hnoex exact h2b2_branch2_readFile_explicitLr_perPc hLs hMm W hpc hrun hnoex hFr hlr hFds hInv /-- Stock-clean explicit-`lr` `readStdin` branch-2 replay on `h2k_readStdinGhostHookFineK`. -/ @@ -1238,10 +1274,10 @@ theorem h2b2_branch2_readStdin_kHook_perPc [LibsignalPlacement] {mpl mmpl : Mult F3CodeInv mpl mmpl (f u).mem ∧ (FdsGe3Closed u.fs → FdsGe3Closed (f u).fs) := by have hext0 : - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) lsReadStdinSym = + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) lsReadStdinSym = some (h2k_readStdinGhostHookFineK hole2_keepSub hole2_emptyProg f3TrialRxProg (hole2_targets mpl).readStdin mmpl cliElfImage.brkStart cliBudgetLimits hole2_hookStack) := - h2b2_cliGhostExterns_eq_some_of_active (h2k_ghFixedK mpl mmpl) (fun _ => none) + cliGhostExternsWithExtra_nil_of_named (h2k_ghFixedK mpl mmpl) (fun _ => none) (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inl ⟨rfl, (h2k_readStdinGhostHookFineSubK hole2_keepSub hole2_emptyProg f3TrialRxProg (hole2_targets mpl).readStdin mmpl cliElfImage.brkStart cliBudgetLimits hole2_hookStack).2, diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2ExecFrozenWire.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2ExecFrozenWire.lean index 2b6023689..39f877851 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2ExecFrozenWire.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2ExecFrozenWire.lean @@ -10,12 +10,14 @@ limitations under the License. module public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfMemsetEntryGuard public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KHooks public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomPlacedInst import LibsignalBinary.Specifications.LibsignalE2E.HooksMallocng import LibsignalBinary.Proofs.HookDischarge.CryptoMallocngBudgetBase import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness +import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts import ProofLib.Hoare.MultiCodeROHook import ProofLib.MallocngBridge meta import ProofLib.ProgramReflection @@ -82,6 +84,13 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG (Block617TransferFixedHypG block617TransferFixedG_of_replaysOn subroutineOutcome_running_pc_and_noFault withEntryGuard) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + (ExtraListReplaysOn GhostRowReplayOn GhostSymActiveNamed GhostSymActiveWithExtra + GhostSymActiveWithExtra_iff_named_or_extra GhostSymActive_iff_named_or_extra + cliGhostExternsWithExtra_eq_some_of_active cliGhostExternsWithExtra_some_cases) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs (ExtraGhostTable) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts + (pureExtraGhosts pureExtraGhosts_preserves_execFrozen) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyGhost (keepMemcpyBlk20) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyLrTrapRet (Blk20TrapHook blk20_lr_trap_after_hook_ret) @@ -744,55 +753,59 @@ theorem h2ef_hole2_ghFixed_preserves_execFrozen [LibsignalPlacement] (hAct : GhostSymActive (hole2_ghFixed mpl mmpl) sym f) : ∀ u : State, ExecFrozen u.mem → ExecFrozen (f u).mem := by intro u hfr - rcases hAct with - ⟨_, rfl⟩ | ⟨_, rfl⟩ | ⟨_, rfl⟩ | ⟨_, rfl⟩ | ⟨_, rfl⟩ | - ⟨_, hsc⟩ | ⟨_, _, hrf⟩ | ⟨_, _, hrs⟩ | ⟨_, hms⟩ | ⟨_, hmc⟩ - · exact execFrozen_f3LinkedCallHook _ _ _ _ _ _ (execFrozen_f3AllocFallback mmpl false) u hfr - · exact execFrozen_f3LinkedCallHook _ _ _ _ _ _ (execFrozen_f3DeallocFallback mmpl) u hfr - · exact execFrozen_f3LinkedCallHook _ _ _ _ _ _ (execFrozen_f3ReallocFallback mmpl) u hfr - · exact execFrozen_f3LinkedCallHook _ _ _ _ _ _ (execFrozen_f3AllocFallback mmpl true) u hfr - · exact hfr - · dsimp only [hole2_ghFixed] at hsc - injection hsc with hfeq; subst hfeq - classical - unfold hole2_strCloneGhostHook - split - · split - · rename_i hReal - exact (Classical.choose_spec hReal.2.2.2.2).2.2.2.2 - · exact execFrozen_keepFsTrace (execFrozen_f3StringCloneFallback mmpl u hfr) - · exact hfr - · dsimp only [hole2_ghFixed, f3CliGhostHooksFixed] at hrf - injection hrf with hsubeq - have hfeq := (congrArg Subtype.val hsubeq).symm - subst hfeq - classical - dsimp only [f3ReadFileFixedGhostHookFineSub, f3ReadFileFixedGhostHookSub, - f3ReadFileFixedGhostHook, f3ReadFileLinkedHook] - split - · split - · rename_i hReal - exact (Classical.choose_spec hReal.2.2.2.2).2.2.2.2 - · exact execFrozen_keepFsTrace (execFrozen_f3ReadFileFallback mmpl u hfr) + rcases (GhostSymActive_iff_named_or_extra (hole2_ghFixed mpl mmpl) sym f).mp hAct with + hNamed | ⟨_, hLook⟩ + · rcases hNamed with + ⟨_, rfl⟩ | ⟨_, rfl⟩ | ⟨_, rfl⟩ | ⟨_, rfl⟩ | ⟨_, rfl⟩ | + ⟨_, hsc⟩ | ⟨_, _, hrf⟩ | ⟨_, _, hrs⟩ | ⟨_, hms⟩ | ⟨_, hmc⟩ + · exact execFrozen_f3LinkedCallHook _ _ _ _ _ _ (execFrozen_f3AllocFallback mmpl false) u hfr + · exact execFrozen_f3LinkedCallHook _ _ _ _ _ _ (execFrozen_f3DeallocFallback mmpl) u hfr + · exact execFrozen_f3LinkedCallHook _ _ _ _ _ _ (execFrozen_f3ReallocFallback mmpl) u hfr + · exact execFrozen_f3LinkedCallHook _ _ _ _ _ _ (execFrozen_f3AllocFallback mmpl true) u hfr · exact hfr - · dsimp only [hole2_ghFixed, f3CliGhostHooksFixed] at hrs - injection hrs with hsubeq - have hfeq := (congrArg Subtype.val hsubeq).symm - subst hfeq - classical - dsimp only [f3ReadStdinGhostHookFineSub, f3ReadStdinGhostHookSub, f3ReadStdinGhostHook] - split - · split - · rename_i hReal - exact (Classical.choose_spec hReal.2.2.2).2.2.2.2.2 - · exact execFrozen_keepFilesTrace (execFrozen_f3ReadStdinFallback mmpl u hfr) - · exact hfr - · dsimp only [hole2_ghFixed, f3CliGhostHooksFixed] at hms - injection hms with hfeq; subst hfeq - exact f3EmptyMemsetGhostHookNarrow_execFrozen mmpl u hfr - · dsimp only [hole2_ghFixed, f3CliGhostHooksFixed] at hmc - injection hmc with hfeq; subst hfeq - exact f3EmptyMemcpyGhostHookNarrow_execFrozen mmpl u hfr + · dsimp only [hole2_ghFixed] at hsc + injection hsc with hfeq; subst hfeq + classical + unfold hole2_strCloneGhostHook + split + · split + · rename_i hReal + exact (Classical.choose_spec hReal.2.2.2.2).2.2.2.2 + · exact execFrozen_keepFsTrace (execFrozen_f3StringCloneFallback mmpl u hfr) + · exact hfr + · dsimp only [hole2_ghFixed, f3CliGhostHooksFixed] at hrf + injection hrf with hsubeq + have hfeq := (congrArg Subtype.val hsubeq).symm + subst hfeq + classical + dsimp only [f3ReadFileFixedGhostHookFineSub, f3ReadFileFixedGhostHookSub, + f3ReadFileFixedGhostHook, f3ReadFileLinkedHook] + split + · split + · rename_i hReal + exact (Classical.choose_spec hReal.2.2.2.2).2.2.2.2 + · exact execFrozen_keepFsTrace (execFrozen_f3ReadFileFallback mmpl u hfr) + · exact hfr + · dsimp only [hole2_ghFixed, f3CliGhostHooksFixed] at hrs + injection hrs with hsubeq + have hfeq := (congrArg Subtype.val hsubeq).symm + subst hfeq + classical + dsimp only [f3ReadStdinGhostHookFineSub, f3ReadStdinGhostHookSub, f3ReadStdinGhostHook] + split + · split + · rename_i hReal + exact (Classical.choose_spec hReal.2.2.2).2.2.2.2.2 + · exact execFrozen_keepFilesTrace (execFrozen_f3ReadStdinFallback mmpl u hfr) + · exact hfr + · dsimp only [hole2_ghFixed, f3CliGhostHooksFixed] at hms + injection hms with hfeq; subst hfeq + exact f3EmptyMemsetGhostHookNarrow_execFrozen mmpl u hfr + · dsimp only [hole2_ghFixed, f3CliGhostHooksFixed] at hmc + injection hmc with hfeq; subst hfeq + exact f3EmptyMemcpyGhostHookNarrow_execFrozen mmpl u hfr + · change pureExtraGhosts.lookup sym = some f at hLook + exact pureExtraGhosts_preserves_execFrozen hLook u hfr private theorem findSome?_table_exists (tbl : List (String × Nat)) {ext : String → Option (State → State)} (off : Nat) {f : State → State} @@ -831,91 +844,8 @@ private theorem cliGhostExterns_some_cases {ghFixed : CliGhostHooks} {baseExt : String → Option (State → State)} {sym : String} {f : State → State} (h : cliGhostExterns ghFixed baseExt sym = some f) : - GhostSymActive ghFixed sym f ∨ baseExt sym = some f := by - unfold cliGhostExterns at h - cases hc1 : (sym == lsRustAllocSymCli) with - | true => - simp only [hc1, ↓reduceIte] at h; injection h with h - exact Or.inl (Or.inl ⟨beq_iff_eq.mp hc1, h.symm⟩) - | false => - simp only [hc1, Bool.false_eq_true, ↓reduceIte] at h - cases hc2 : (sym == lsRustDeallocSymCli) with - | true => - simp only [hc2, ↓reduceIte] at h; injection h with h - exact Or.inl (Or.inr (Or.inl ⟨beq_iff_eq.mp hc2, h.symm⟩)) - | false => - simp only [hc2, Bool.false_eq_true, ↓reduceIte] at h - cases hc3 : (sym == lsRustReallocSymCli) with - | true => - simp only [hc3, ↓reduceIte] at h; injection h with h - exact Or.inl (Or.inr (Or.inr (Or.inl ⟨beq_iff_eq.mp hc3, h.symm⟩))) - | false => - simp only [hc3, Bool.false_eq_true, ↓reduceIte] at h - cases hc4 : (sym == lsRustAllocZeroedSymCli) with - | true => - simp only [hc4, ↓reduceIte] at h; injection h with h - exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inl ⟨beq_iff_eq.mp hc4, h.symm⟩)))) - | false => - simp only [hc4, Bool.false_eq_true, ↓reduceIte] at h - cases hc5 : (sym == lsRustNoAllocShimSymCli) with - | true => - simp only [hc5, ↓reduceIte] at h; injection h with h - exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inl ⟨beq_iff_eq.mp hc5, h.symm⟩))))) - | false => - simp only [hc5, Bool.false_eq_true, ↓reduceIte] at h - cases hc6 : (sym == lsStringCloneSym) with - | true => - simp only [hc6, ↓reduceIte] at h - cases hsc : ghFixed.stringClone with - | none => rw [hsc] at h; exact Or.inr h - | some g => - rw [hsc] at h; injection h with h; subst h - exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inl ⟨beq_iff_eq.mp hc6, hsc⟩)))))) - | false => - simp only [hc6, Bool.false_eq_true, ↓reduceIte] at h - cases hc7 : (sym == lsReadFileSym) with - | true => - simp only [hc7, ↓reduceIte] at h - cases hrf : ghFixed.readFile with - | none => rw [hrf] at h; exact Or.inr h - | some gh => - rcases gh with ⟨g, hg⟩ - rw [hrf] at h; injection h with h; subst h - exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inl ⟨beq_iff_eq.mp hc7, hg, hrf⟩))))))) - | false => - simp only [hc7, Bool.false_eq_true, ↓reduceIte] at h - cases hc8 : (sym == lsReadStdinSym) with - | true => - simp only [hc8, ↓reduceIte] at h - cases hrs : ghFixed.readStdin with - | none => rw [hrs] at h; exact Or.inr h - | some gh => - rcases gh with ⟨g, hg⟩ - rw [hrs] at h; injection h with h; subst h - exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inl ⟨beq_iff_eq.mp hc8, hg, hrs⟩)))))))) - | false => - simp only [hc8, Bool.false_eq_true, ↓reduceIte] at h - cases hc9 : (sym == CryptoVerification.SignalSession.lsMemsetSym) with - | true => - simp only [hc9, ↓reduceIte] at h - cases hms : ghFixed.memset with - | none => rw [hms] at h; exact Or.inr h - | some g => - rw [hms] at h; injection h with h; subst h - exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inl ⟨beq_iff_eq.mp hc9, hms⟩))))))))) - | false => - simp only [hc9, Bool.false_eq_true, ↓reduceIte] at h - cases hc10 : (sym == CryptoVerification.SignalSession.lsMemcpySym) with - | true => - simp only [hc10, ↓reduceIte] at h - cases hmc : ghFixed.memcpy with - | none => rw [hmc] at h; exact Or.inr h - | some g => - rw [hmc] at h; injection h with h; subst h - exact Or.inl (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr (Or.inr ⟨beq_iff_eq.mp hc10, hmc⟩))))))))) - | false => - simp only [hc10, Bool.false_eq_true, ↓reduceIte] at h - exact Or.inr h + GhostSymActive ghFixed sym f ∨ baseExt sym = some f := + cliGhostExternsWithExtra_some_cases ghFixed ghFixed.extra baseExt h /-- Every extern hook `f` in `P_ghost` (`hole2_ghFixed mpl mmpl` overlaid on `cliExternsPlaced mmpl W`) at any block `idx` preserves `ExecFrozen` unconditionally. -/ @@ -1837,59 +1767,8 @@ theorem h2ef_cliGhostExterns_of_ghostSymActive_base (gh : CliGhostHooks) (baseExt : String → Option (State → State)) {sym : String} {f : State → State} (hAct : GhostSymActive gh sym f) : - cliGhostExterns gh baseExt sym = some f := by - rcases hAct with - ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | - ⟨rfl, hsc⟩ | ⟨rfl, _, hrf⟩ | ⟨rfl, _, hrs⟩ | ⟨rfl, hms⟩ | ⟨rfl, hmc⟩ - · have h1 : (lsRustAllocSymCli == lsRustAllocSymCli) = true := by decide - unfold cliGhostExterns; simp only [h1, ↓reduceIte] - · have h1 : (lsRustDeallocSymCli == lsRustAllocSymCli) = false := by decide - have h2 : (lsRustDeallocSymCli == lsRustDeallocSymCli) = true := by decide - unfold cliGhostExterns; simp only [h1, h2, Bool.false_eq_true, ↓reduceIte] - · have h1 : (lsRustReallocSymCli == lsRustAllocSymCli) = false := by decide - have h2 : (lsRustReallocSymCli == lsRustDeallocSymCli) = false := by decide - have h3 : (lsRustReallocSymCli == lsRustReallocSymCli) = true := by decide - unfold cliGhostExterns; simp only [h1, h2, h3, Bool.false_eq_true, ↓reduceIte] - · have h1 : (lsRustAllocZeroedSymCli == lsRustAllocSymCli) = false := by decide - have h2 : (lsRustAllocZeroedSymCli == lsRustDeallocSymCli) = false := by decide - have h3 : (lsRustAllocZeroedSymCli == lsRustReallocSymCli) = false := by decide - have h4 : (lsRustAllocZeroedSymCli == lsRustAllocZeroedSymCli) = true := by decide - unfold cliGhostExterns; simp only [h1, h2, h3, h4, Bool.false_eq_true, ↓reduceIte] - · have h1 : (lsRustNoAllocShimSymCli == lsRustAllocSymCli) = false := by decide - have h2 : (lsRustNoAllocShimSymCli == lsRustDeallocSymCli) = false := by decide - have h3 : (lsRustNoAllocShimSymCli == lsRustReallocSymCli) = false := by decide - have h4 : (lsRustNoAllocShimSymCli == lsRustAllocZeroedSymCli) = false := by decide - have h5 : (lsRustNoAllocShimSymCli == lsRustNoAllocShimSymCli) = true := by decide - unfold cliGhostExterns; simp only [h1, h2, h3, h4, h5, Bool.false_eq_true, ↓reduceIte] - · have h1 : (lsStringCloneSym == lsRustAllocSymCli) = false := by decide - have h2 : (lsStringCloneSym == lsRustDeallocSymCli) = false := by decide - have h3 : (lsStringCloneSym == lsRustReallocSymCli) = false := by decide - have h4 : (lsStringCloneSym == lsRustAllocZeroedSymCli) = false := by decide - have h5 : (lsStringCloneSym == lsRustNoAllocShimSymCli) = false := by decide - have h6 : (lsStringCloneSym == lsStringCloneSym) = true := by decide - unfold cliGhostExterns - simp only [h1, h2, h3, h4, h5, h6, Bool.false_eq_true, ↓reduceIte, hsc] - · have h1 : (lsReadFileSym == lsRustAllocSymCli) = false := by decide - have h2 : (lsReadFileSym == lsRustDeallocSymCli) = false := by decide - have h3 : (lsReadFileSym == lsRustReallocSymCli) = false := by decide - have h4 : (lsReadFileSym == lsRustAllocZeroedSymCli) = false := by decide - have h5 : (lsReadFileSym == lsRustNoAllocShimSymCli) = false := by decide - have h6 : (lsReadFileSym == lsStringCloneSym) = false := by decide - have h7 : (lsReadFileSym == lsReadFileSym) = true := by decide - unfold cliGhostExterns - simp only [h1, h2, h3, h4, h5, h6, h7, Bool.false_eq_true, ↓reduceIte, hrf] - · have h1 : (lsReadStdinSym == lsRustAllocSymCli) = false := by decide - have h2 : (lsReadStdinSym == lsRustDeallocSymCli) = false := by decide - have h3 : (lsReadStdinSym == lsRustReallocSymCli) = false := by decide - have h4 : (lsReadStdinSym == lsRustAllocZeroedSymCli) = false := by decide - have h5 : (lsReadStdinSym == lsRustNoAllocShimSymCli) = false := by decide - have h6 : (lsReadStdinSym == lsStringCloneSym) = false := by decide - have h7 : (lsReadStdinSym == lsReadFileSym) = false := by decide - have h8 : (lsReadStdinSym == lsReadStdinSym) = true := by decide - unfold cliGhostExterns - simp only [h1, h2, h3, h4, h5, h6, h7, h8, Bool.false_eq_true, ↓reduceIte, hrs] - · exact CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExterns_memset_some gh baseExt hms - · exact CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExterns_memcpy_some gh baseExt hmc + cliGhostExterns gh baseExt sym = some f := + cliGhostExternsWithExtra_eq_some_of_active gh gh.extra baseExt hAct /-- Active ghost symbols resolve to `some f` in `cliGhostExterns gh (fun _ => none)`. -/ theorem h2ef_cliGhostExterns_of_ghostSymActive @@ -1898,10 +1777,10 @@ theorem h2ef_cliGhostExterns_of_ghostSymActive cliGhostExterns gh (fun _ => none) sym = some f := h2ef_cliGhostExterns_of_ghostSymActive_base gh (fun _ => none) hAct -/-- Unconditional `ExecFrozen` preservation for all 8 active ghost hooks of `h2k_ghFixedK`. -/ +/-- Unconditional `ExecFrozen` preservation for all 10 named ghost slots of `h2k_ghFixedK`. -/ theorem h2ef_h2k_ghFixedK_preserves_execFrozen [LibsignalPlacement] (mpl mmpl : MultiPlacement) {sym : String} {f : State → State} - (hAct : GhostSymActive (h2k_ghFixedK mpl mmpl) sym f) : + (hAct : GhostSymActiveNamed (h2k_ghFixedK mpl mmpl) sym f) : ∀ u : State, ExecFrozen u.mem → ExecFrozen (f u).mem := by intro u hfr rcases hAct with @@ -1959,6 +1838,23 @@ theorem h2ef_h2k_ghFixedK_preserves_execFrozen [LibsignalPlacement] injection hmc with hfeq; subst hfeq exact f3EmptyMemcpyGhostHookNarrow_execFrozen mmpl u hfr +/-- 11-way `ExecFrozen` preservation across `GhostSymActiveWithExtra (h2k_ghFixedK mpl mmpl) extra` + under `ExtraListReplaysOn`. -/ +theorem h2ef_h2k_ghFixedK_withExtra_preserves_execFrozen [LibsignalPlacement] + (mpl mmpl : MultiPlacement) {InvS : State → Prop} + {guardOf : String → State → Prop} {extra : ExtraGhostTable} + (hExtraReplays : ExtraListReplaysOn mpl mmpl InvS guardOf (h2k_ghFixedK mpl mmpl) extra) + {sym : String} {f : State → State} + (hAct : GhostSymActiveWithExtra (h2k_ghFixedK mpl mmpl) extra sym f) + (u : State) (hrun : u.status = .Running) + (hnoex : ∀ msg, (f u).status ≠ .Exception msg) + (hfr : ExecFrozen u.mem) : + ExecFrozen (f u).mem := by + rcases (GhostSymActiveWithExtra_iff_named_or_extra _ _ _ _).mp hAct with + hActNamed | ⟨hDom, hLook⟩ + · exact h2ef_h2k_ghFixedK_preserves_execFrozen mpl mmpl hActNamed u hfr + · exact ((hExtraReplays sym f hDom hLook).preserves_execFrozen u hrun hnoex hfr).1 + /-- Block-`617` `P_ghost.CodeLoaded` at `h2k_ghFixedK` from `LibsignalFrozen mpl m`. -/ theorem h2ef_pGhost617K_codeLoaded_of_libsignalFrozen [LibsignalPlacement] (mpl mmpl : MultiPlacement) (W : CliHooks) (m : Memory) @@ -1976,470 +1872,5 @@ theorem h2ef_pGhost617K_codeLoaded_of_libsignalFrozen [LibsignalPlacement] exact Arm64.Program.CodeLoaded.intro hc.aligned hc.no_wrap fun i hi => ⟨hc.byte_eq i hi, hc.perm_eq i hi, hc.isLazyFree_eq i hi⟩ -private theorem steps_codeOnly_transfer_pGhost617KG_aux [LibsignalPlacement] - (mpl mmpl : MultiPlacement) (W : CliHooks) - (hGhostReplay : ∀ (sym : String) (f : State → State), - sym ∈ (libsignalSessionLib.blockLib 617).text.externs → - sym ≠ lsStringCloneSym → - GhostSymActive (h2k_ghFixedK mpl mmpl) sym f → - ∀ u : State, - u.pc = libsignalSessionLib.resolve mpl sym → - u.status = .Running → - (∀ msg, (f u).status ≠ .Exception msg) → - u.mem.KeepsFrozen (f u).mem → - ExecFrozen u.mem → - (sym ≠ lsRustNoAllocShimSymCli → sym ≠ lsMemsetSym → sym ≠ lsMemcpySym → - hole2_keepSub (u.readReg64 .lr) = false) → - (sym = lsMemsetSym → keepMemsetBlk21 mmpl (u.readReg64 .lr) = false) → - (sym = lsMemcpySym → keepMemcpyBlk20 mmpl (u.readReg64 .lr) = false) → - F3CodeInv mpl mmpl u.mem → - (sym = lsReadFileSym → FdsGe3Closed u.fs) → - Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) u (f u)) - (hNoExLr : ∀ {sym : String} {f : State → State} {a : State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f → - sym ≠ lsRustNoAllocShimSymCli → - (∀ msg, (f a).status ≠ .Exception msg) → - sym ≠ lsMemsetSym → - sym ≠ lsMemcpySym → - hole2_keepSub (a.readReg64 .lr) = false) - (hNoExFds : ∀ {baseExt : String → Option (State → State)} {f : State → State} {a : State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) baseExt lsReadFileSym = some f → - (∀ msg, (f a).status ≠ .Exception msg) → - FdsGe3Closed a.fs) - (hTrap21 : ∀ {sym : String} {f : State → State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f → - sym ≠ lsRustNoAllocShimSymCli → - ∀ L : BitVec 64, keepMemsetBlk21 mmpl L = true → Blk21TrapHook L f) - (hTrap20 : ∀ {sym : String} {f : State → State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f → - sym ≠ lsRustNoAllocShimSymCli → - ∀ L : BitVec 64, keepMemcpyBlk20 mmpl L = true → Blk20TrapHook L f) - (hBlk21Ext : ∀ pc, keepMemsetBlk21 mmpl pc = true → - (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = none ∨ - ∃ f, (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = some f ∧ - ∀ L : BitVec 64, keepMemsetBlk21 mmpl L = true → Blk21TrapHook L f) - (hBlk20Ext : ∀ pc, keepMemcpyBlk20 mmpl pc = true → - (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = none ∨ - ∃ f, (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = some f ∧ - ∀ L : BitVec 64, keepMemcpyBlk20 mmpl L = true → Blk20TrapHook L f) - {u sf : State} - (hsteps : Steps - (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) 617 W) - u sf) - (hrun_sf21 : sf.status = .Running → keepMemsetBlk21 mmpl sf.pc = false) - (hrun_sf20 : sf.status = .Running → keepMemcpyBlk20 mmpl sf.pc = false) - (hnoex : ∀ msg, sf.status ≠ .Exception msg) - (hnhalt : sf.status ≠ .Halted) - (hfr_u : ExecFrozen u.mem) - (hinv_u : F3CodeInv mpl mmpl u.mem) : - Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) u sf ∧ - ExecFrozen sf.mem ∧ F3CodeInv mpl mmpl sf.mem := by - let P_real := cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W - have hmng20 : (20 : Nat) < mallocngLib.blocks.length := by decide - have hmng21 : (21 : Nat) < mallocngLib.blocks.length := by decide - induction hsteps with - | refl s => exact ⟨Steps.refl s, hfr_u, hinv_u⟩ - | @step a b c h1 hrest ih => - cases h1 with - | halt_unmapped _ _ _ => - exact False.elim (hnhalt (steps_preserves_halted hrest rfl)) - | extern_fault _ _ _ => - exact False.elim (hnoex _ (steps_preserves_exception hrest rfl)) - | @exec inst hrun hfm => - unfold Program.fetchMem at hfm - cases heg : - (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? a.pc with - | some _ => simp [heg] at hfm - | none => - have her : P_real.externAt? a.pc = none := - blockProgram_cliGhostExterns_no_new_hooks libsignalSessionLib mpl 617 - (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W) a.pc heg - have hfm_real : P_real.fetchMem a.mem a.pc = some inst := by - unfold Program.fetchMem - simpa [heg, her] using hfm - by_cases hsvc0 : inst.isSvc0 = true - · have hinst : inst = .system false 0#16 := by - cases inst <;> simp [Instr.isSvc0] at hsvc0 - rcases hsvc0 with ⟨rfl, rfl⟩; rfl - subst hinst - have hsvc_g : (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).svc = Syscall.standard := rfl - have hsvc_r : P_real.svc = Syscall.standard := rfl - have hev_g : (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).evalInst (.system false 0#16) a = Syscall.standard a := by - simp [Program.evalInst, execInstWithSvc, hsvc_g] - have hev_r : P_real.evalInst (.system false 0#16) a = Syscall.standard a := by - simp [Program.evalInst, execInstWithSvc, hsvc_r] - have hstep1_r : Step P_real a (Syscall.standard a) := hev_r ▸ Step.exec hrun hfm_real - obtain ⟨_, hfr_b⟩ := standard_stripS (keep := fun _ => false) hfr_u - rw [hev_g] at hrest ih - have hinv_b : F3CodeInv mpl mmpl (Syscall.standard a).mem := - hinv_u.of_keepsFrozen hstep1_r.keepsFrozen - obtain ⟨hrest_r, hfr_c, hinv_c⟩ := ih hrun_sf21 hrun_sf20 hnoex hnhalt hfr_b hinv_b - exact ⟨Steps.step hstep1_r hrest_r, hfr_c, hinv_c⟩ - · have hnsvc0 : inst.isSvc0 = false := Bool.eq_false_iff.mpr hsvc0 - have hev_g : (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).evalInst inst a = execInst inst a := - evalInst_eq_execInst_of_not_isSvc0 _ hnsvc0 a - have hev_r : P_real.evalInst inst a = execInst inst a := - evalInst_eq_execInst_of_not_isSvc0 P_real hnsvc0 a - have hstep1_r : Step P_real a (execInst inst a) := hev_r ▸ Step.exec hrun hfm_real - obtain ⟨hfr_b, _⟩ := execInst_preserves_execFrozen_and_fs hnsvc0 hfr_u - rw [hev_g] at hrest ih - have hinv_b : F3CodeInv mpl mmpl (execInst inst a).mem := - hinv_u.of_keepsFrozen hstep1_r.keepsFrozen - obtain ⟨hrest_r, hfr_c, hinv_c⟩ := ih hrun_sf21 hrun_sf20 hnoex hnhalt hfr_b hinv_b - exact ⟨Steps.step hstep1_r hrest_r, hfr_c, hinv_c⟩ - | @extern f hrun heg hkf hsym => - have hnoex_fa : ∀ msg, (f a).status ≠ .Exception msg := fun msg hex => - hnoex msg (steps_preserves_exception hrest hex) - have hinv_b : F3CodeInv mpl mmpl (f a).mem := hinv_u.of_keepsFrozen hkf - rcases blockProgram_cliGhostExterns_externAt?_mem_cases - (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W) heg with - her | ⟨sym, hsym_ext, hAct, hpc_eq⟩ - · obtain ⟨sym, hsym_real⟩ := blockProgram_externAt?_some_exists her - have hstep1_r : Step P_real a (f a) := Step.extern hrun her hkf hsym - have hfr_b : ExecFrozen (f a).mem := - cliExternsPlaced_preserves_execFrozen mmpl W hsym_real a hfr_u - obtain ⟨hrest_r, hfr_c, hinv_c⟩ := ih hrun_sf21 hrun_sf20 hnoex hnhalt hfr_b hinv_b - exact ⟨Steps.step hstep1_r hrest_r, hfr_c, hinv_c⟩ - · have hne_sc : sym ≠ lsStringCloneSym := fun heq => - h2ef_strClone_not_mem_ext617 (heq ▸ hsym_ext) - have hext0 : cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f := - h2ef_cliGhostExterns_of_ghostSymActive (h2k_ghFixedK mpl mmpl) hAct - have hlr_sub : sym ≠ lsRustNoAllocShimSymCli → sym ≠ lsMemsetSym → sym ≠ lsMemcpySym → - hole2_keepSub (a.readReg64 .lr) = false := - fun hnoShim hnoMs hnoMc => hNoExLr hext0 hnoShim hnoex_fa hnoMs hnoMc - have hlr_blk21 : sym = lsMemsetSym → keepMemsetBlk21 mmpl (a.readReg64 .lr) = false := - fun hms => blk21_lr_trap_after_hook_ret - (hTrap21 hext0 (by subst hms; decide)) hBlk21Ext - (hinv_b.mngBlockCodeLoaded 21 hmng21 _ _ Syscall.standard) - hrest hrun hrun_sf21 hnoex hnhalt - have hlr_blk20 : sym = lsMemcpySym → keepMemcpyBlk20 mmpl (a.readReg64 .lr) = false := - fun hmc => blk20_lr_trap_after_hook_ret - (hTrap20 hext0 (by subst hmc; decide)) hBlk20Ext - (hinv_b.mngBlockCodeLoaded 20 hmng20 _ _ Syscall.standard) - hrest hrun hrun_sf20 hnoex hnhalt - have hread_fds : sym = lsReadFileSym → FdsGe3Closed a.fs := - fun hrd => hNoExFds (hrd ▸ hext0) hnoex_fa - have hfr_b : ExecFrozen (f a).mem := - h2ef_h2k_ghFixedK_preserves_execFrozen mpl mmpl hAct a hfr_u - have hst_r : Steps P_real a (f a) := - hGhostReplay sym f hsym_ext hne_sc hAct a hpc_eq hrun hnoex_fa hkf hfr_u - hlr_sub hlr_blk21 hlr_blk20 hinv_u hread_fds - obtain ⟨hrest_r, hfr_c, hinv_c⟩ := ih hrun_sf21 hrun_sf20 hnoex hnhalt hfr_b hinv_b - exact ⟨hst_r.trans hrest_r, hfr_c, hinv_c⟩ - -/-- Code-only trajectory `Block617TransferFixedHypG` reduction at `h2k_ghFixedK` (`C3e-8G`), deriving -`hlr_sub` (`sym ∉ {shim, ms, mc}`), `FdsGe3Closed`, and `hlr_blk{21,20}` via `blk{21,20}_lr_trap_after_hook_ret` and `F3MemsetMemcpyEntryLrFalse`. -/ -theorem h2ef_block617TransferFixedG_of_traj_codeOnly [LibsignalPlacement] - (mpl mmpl : MultiPlacement) - {libcAddr brkStart : BitVec 64} {stk : Nat} - (hF3Frozen : ∀ m : Memory, F3CodeOk mpl mmpl m → LibsignalFrozen mpl m) - (hGhostCL : ∀ (W : CliHooks) (m : Memory), LibsignalFrozen mpl m → - (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).CodeLoaded m) - (hRealNone : ∀ (W : CliHooks) (sym : String) (f : State → State), - sym ∈ (libsignalSessionLib.blockLib 617).text.externs → - GhostSymActive (h2k_ghFixedK mpl mmpl) sym f → - (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? - (libsignalSessionLib.resolve mpl sym) = none) - (hGhostReplay : ∀ (W : CliHooks) (sym : String) (f : State → State), - sym ∈ (libsignalSessionLib.blockLib 617).text.externs → - sym ≠ lsStringCloneSym → - GhostSymActive (h2k_ghFixedK mpl mmpl) sym f → - ∀ u : State, - u.pc = libsignalSessionLib.resolve mpl sym → - u.status = .Running → - (∀ msg, (f u).status ≠ .Exception msg) → - u.mem.KeepsFrozen (f u).mem → - ExecFrozen u.mem → - (sym ≠ lsRustNoAllocShimSymCli → sym ≠ lsMemsetSym → sym ≠ lsMemcpySym → - hole2_keepSub (u.readReg64 .lr) = false) → - (sym = lsMemsetSym → keepMemsetBlk21 mmpl (u.readReg64 .lr) = false) → - (sym = lsMemcpySym → keepMemcpyBlk20 mmpl (u.readReg64 .lr) = false) → - F3CodeInv mpl mmpl u.mem → - (sym = lsReadFileSym → FdsGe3Closed u.fs) → - Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) u (f u)) - (hNoExLr : ∀ {sym : String} {f : State → State} {a : State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f → - sym ≠ lsRustNoAllocShimSymCli → - (∀ msg, (f a).status ≠ .Exception msg) → - sym ≠ lsMemsetSym → - sym ≠ lsMemcpySym → - hole2_keepSub (a.readReg64 .lr) = false) - (hNoExFds : ∀ {baseExt : String → Option (State → State)} {f : State → State} {a : State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) baseExt lsReadFileSym = some f → - (∀ msg, (f a).status ≠ .Exception msg) → - FdsGe3Closed a.fs) - (hTrap21 : ∀ {sym : String} {f : State → State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f → - sym ≠ lsRustNoAllocShimSymCli → - ∀ L : BitVec 64, keepMemsetBlk21 mmpl L = true → Blk21TrapHook L f) - (hTrap20 : ∀ {sym : String} {f : State → State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f → - sym ≠ lsRustNoAllocShimSymCli → - ∀ L : BitVec 64, keepMemcpyBlk20 mmpl L = true → Blk20TrapHook L f) - (hBlk21Ext : ∀ (W : CliHooks) (pc : BitVec 64), keepMemsetBlk21 mmpl pc = true → - (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = none ∨ - ∃ f, (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = some f ∧ - ∀ L : BitVec 64, keepMemsetBlk21 mmpl L = true → Blk21TrapHook L f) - (hBlk20Ext : ∀ (W : CliHooks) (pc : BitVec 64), keepMemcpyBlk20 mmpl pc = true → - (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = none ∨ - ∃ f, (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = some f ∧ - ∀ L : BitVec 64, keepMemcpyBlk20 mmpl L = true → Blk20TrapHook L f) : - Block617TransferFixedHypG mpl mmpl - (fun W => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W)) - (cliExternsPlaced mmpl) - (F3MemsetMemcpyEntryLrFalse mmpl) - (LibsignalFrozen mpl) (F3CodeOk mpl mmpl) libcAddr brkStart stk := by - have _ := hRealNone - intro W Run hGhostOk γ tp - apply subroutine_ok_of_steps_outcome - intro g R s0 hpc hrun hm hsp _ - have hm_unfold := hm - dsimp only [withEntryGuard, b2MainSpecTightNeedLocksFineAt] at hm_unfold - rw [sepConj_assoc, satisfies_pure_sepConj] at hm_unfold - obtain ⟨hGuard0, hm_real⟩ := hm_unfold - rw [sepConj_assoc, satisfies_pure_sepConj] at hm_real - obtain ⟨⟨hReal0, hCase, hInpOk, hEntry, hStk⟩, hm_frame⟩ := hm_real - have hGhost0 : LibsignalFrozen mpl s0.mem := hF3Frozen s0.mem hReal0 - have hm_ghost : s0.mem ⊨ (b2MainSpecTightNeedLocksFineAt libcAddr (LibsignalFrozen mpl) - (fineHookRustCliAllocBudget γ mmpl tp brkStart) - cliBudgetLimits fineCostModel.init stk (cliStaticsPlacedAt mpl) Run cliProcessInputs).pre g s0 ∗ R := by - dsimp only [b2MainSpecTightNeedLocksFineAt] - rw [sepConj_assoc, satisfies_pure_sepConj] - exact ⟨⟨hGhost0, hCase, hInpOk, hEntry, hStk⟩, hm_frame⟩ - have hCL : (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).CodeLoaded s0.mem := hGhostCL W s0.mem hGhost0 - obtain ⟨sf, hsteps, hout⟩ := - subroutine_ok_elim_steps_outcome (hGhostOk γ tp) g R s0 hpc hrun hm_ghost hsp hCL - obtain ⟨hret_pc, hnoex, hnhalt⟩ := subroutineOutcome_running_pc_and_noFault hout - have hrun_sf21 : sf.status = .Running → keepMemsetBlk21 mmpl sf.pc = false := - fun hrs => hret_pc hrs ▸ hGuard0.1 - have hrun_sf20 : sf.status = .Running → keepMemcpyBlk20 mmpl sf.pc = false := - fun hrs => hret_pc hrs ▸ hGuard0.2 - obtain ⟨hsteps_real, _, _⟩ := - steps_codeOnly_transfer_pGhost617KG_aux mpl mmpl W (hGhostReplay W) - hNoExLr hNoExFds hTrap21 hTrap20 (hBlk21Ext W) (hBlk20Ext W) - hsteps hrun_sf21 hrun_sf20 hnoex hnhalt hReal0.2 hReal0.1 - exact ⟨sf, hsteps_real, hout⟩ - -/-- Code-only `Steps → h2ef_StepsAll` `Block617TransferFixedHypG` reduction at `h2k_ghFixedK`. -/ -theorem h2ef_block617TransferFixedG_of_steps_to_stepsAll_codeOnly [LibsignalPlacement] - (mpl mmpl : MultiPlacement) - {libcAddr brkStart : BitVec 64} {stk : Nat} - (hF3Frozen : ∀ m : Memory, F3CodeOk mpl mmpl m → LibsignalFrozen mpl m) - (hRealNone : ∀ (W : CliHooks) (sym : String) (f : State → State), - sym ∈ (libsignalSessionLib.blockLib 617).text.externs → - GhostSymActive (h2k_ghFixedK mpl mmpl) sym f → - (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? - (libsignalSessionLib.resolve mpl sym) = none) - (hGhostReplay : ∀ (W : CliHooks) (sym : String) (f : State → State), - sym ∈ (libsignalSessionLib.blockLib 617).text.externs → - sym ≠ lsStringCloneSym → - GhostSymActive (h2k_ghFixedK mpl mmpl) sym f → - ∀ u : State, - u.pc = libsignalSessionLib.resolve mpl sym → - u.status = .Running → - (∀ msg, (f u).status ≠ .Exception msg) → - u.mem.KeepsFrozen (f u).mem → - ExecFrozen u.mem → - (sym ≠ lsRustNoAllocShimSymCli → sym ≠ lsMemsetSym → sym ≠ lsMemcpySym → - hole2_keepSub (u.readReg64 .lr) = false) → - (sym = lsMemsetSym → keepMemsetBlk21 mmpl (u.readReg64 .lr) = false) → - (sym = lsMemcpySym → keepMemcpyBlk20 mmpl (u.readReg64 .lr) = false) → - F3CodeInv mpl mmpl u.mem → - (sym = lsReadFileSym → FdsGe3Closed u.fs) → - Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) u (f u)) - (hNoExLr : ∀ {sym : String} {f : State → State} {a : State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f → - sym ≠ lsRustNoAllocShimSymCli → - (∀ msg, (f a).status ≠ .Exception msg) → - sym ≠ lsMemsetSym → - sym ≠ lsMemcpySym → - hole2_keepSub (a.readReg64 .lr) = false) - (hNoExFds : ∀ {baseExt : String → Option (State → State)} {f : State → State} {a : State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) baseExt lsReadFileSym = some f → - (∀ msg, (f a).status ≠ .Exception msg) → - FdsGe3Closed a.fs) - (hTrap21 : ∀ {sym : String} {f : State → State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f → - sym ≠ lsRustNoAllocShimSymCli → - ∀ L : BitVec 64, keepMemsetBlk21 mmpl L = true → Blk21TrapHook L f) - (hTrap20 : ∀ {sym : String} {f : State → State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f → - sym ≠ lsRustNoAllocShimSymCli → - ∀ L : BitVec 64, keepMemcpyBlk20 mmpl L = true → Blk20TrapHook L f) - (hBlk21Ext : ∀ (W : CliHooks) (pc : BitVec 64), keepMemsetBlk21 mmpl pc = true → - (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = none ∨ - ∃ f, (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = some f ∧ - ∀ L : BitVec 64, keepMemsetBlk21 mmpl L = true → Blk21TrapHook L f) - (hBlk20Ext : ∀ (W : CliHooks) (pc : BitVec 64), keepMemcpyBlk20 mmpl pc = true → - (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = none ∨ - ∃ f, (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = some f ∧ - ∀ L : BitVec 64, keepMemcpyBlk20 mmpl L = true → Blk20TrapHook L f) : - Block617TransferFixedHypG mpl mmpl - (fun W => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W)) - (cliExternsPlaced mmpl) - (F3MemsetMemcpyEntryLrFalse mmpl) - (LibsignalFrozen mpl) (F3CodeOk mpl mmpl) libcAddr brkStart stk := - h2ef_block617TransferFixedG_of_traj_codeOnly mpl mmpl hF3Frozen - (h2ef_pGhost617K_codeLoaded_of_libsignalFrozen mpl mmpl) - hRealNone hGhostReplay hNoExLr hNoExFds hTrap21 hTrap20 hBlk21Ext hBlk20Ext - -/-- `Block617TransferFixedHypG` reduction at `h2k_ghFixedK` via -`Block617TransferG.block617TransferFixedG_of_replaysOn` with `keep := fun _ => false` and `PredFs := fun _ => True`. -/ -theorem h2ef_block617TransferFixedG_replaysOn_false_codeOnly [LibsignalPlacement] - (mpl mmpl : MultiPlacement) - {libcAddr brkStart : BitVec 64} {stk : Nat} - (hF3Frozen : ∀ m : Memory, F3CodeOk mpl mmpl m → LibsignalFrozen mpl m) - (hRealNone : ∀ (W : CliHooks) (sym : String) (f : State → State), - sym ∈ (libsignalSessionLib.blockLib 617).text.externs → - GhostSymActive (h2k_ghFixedK mpl mmpl) sym f → - (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? - (libsignalSessionLib.resolve mpl sym) = none) - (hGhostReplay : ∀ (W : CliHooks) (sym : String) (f : State → State), - sym ∈ (libsignalSessionLib.blockLib 617).text.externs → - sym ≠ lsStringCloneSym → - GhostSymActive (h2k_ghFixedK mpl mmpl) sym f → - ∀ u : State, - u.pc = libsignalSessionLib.resolve mpl sym → - u.status = .Running → - (∀ msg, (f u).status ≠ .Exception msg) → - u.mem.KeepsFrozen (f u).mem → - ExecFrozen u.mem → - (sym ≠ lsRustNoAllocShimSymCli → sym ≠ lsMemsetSym → sym ≠ lsMemcpySym → - hole2_keepSub (u.readReg64 .lr) = false) → - (sym = lsMemsetSym → keepMemsetBlk21 mmpl (u.readReg64 .lr) = false) → - (sym = lsMemcpySym → keepMemcpyBlk20 mmpl (u.readReg64 .lr) = false) → - F3CodeInv mpl mmpl u.mem → - (sym = lsReadFileSym → FdsGe3Closed u.fs) → - Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) u (f u)) - (hNoExLr : ∀ {sym : String} {f : State → State} {a : State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f → - sym ≠ lsRustNoAllocShimSymCli → - (∀ msg, (f a).status ≠ .Exception msg) → - sym ≠ lsMemsetSym → - sym ≠ lsMemcpySym → - hole2_keepSub (a.readReg64 .lr) = false) - (hNoExFds : ∀ {baseExt : String → Option (State → State)} {f : State → State} {a : State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) baseExt lsReadFileSym = some f → - (∀ msg, (f a).status ≠ .Exception msg) → - FdsGe3Closed a.fs) - (hTrap21 : ∀ {sym : String} {f : State → State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f → - sym ≠ lsRustNoAllocShimSymCli → - ∀ L : BitVec 64, keepMemsetBlk21 mmpl L = true → Blk21TrapHook L f) - (hTrap20 : ∀ {sym : String} {f : State → State}, - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f → - sym ≠ lsRustNoAllocShimSymCli → - ∀ L : BitVec 64, keepMemcpyBlk20 mmpl L = true → Blk20TrapHook L f) - (hBlk21Ext : ∀ (W : CliHooks) (pc : BitVec 64), keepMemsetBlk21 mmpl pc = true → - (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = none ∨ - ∃ f, (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = some f ∧ - ∀ L : BitVec 64, keepMemsetBlk21 mmpl L = true → Blk21TrapHook L f) - (hBlk20Ext : ∀ (W : CliHooks) (pc : BitVec 64), keepMemcpyBlk20 mmpl pc = true → - (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = none ∨ - ∃ f, (cliProgExtPlacedAt mpl - (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) - 617 W).externAt? pc = some f ∧ - ∀ L : BitVec 64, keepMemcpyBlk20 mmpl L = true → Blk20TrapHook L f) : - Block617TransferFixedHypG mpl mmpl - (fun W => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W)) - (cliExternsPlaced mmpl) - (F3MemsetMemcpyEntryLrFalse mmpl) - (LibsignalFrozen mpl) (F3CodeOk mpl mmpl) libcAddr brkStart stk := by - have hmng20 : (20 : Nat) < mallocngLib.blocks.length := by decide - have hmng21 : (21 : Nat) < mallocngLib.blocks.length := by decide - refine block617TransferFixedG_of_replaysOn - (fun _ => false) (F3CodeInv mpl mmpl) (fun _ => True) - (fun W pc heg => - blockProgram_cliGhostExterns_no_new_hooks libsignalSessionLib mpl 617 - (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W) pc heg) - hF3Frozen (h2ef_pGhost617K_codeLoaded_of_libsignalFrozen mpl mmpl) - (fun _ h => h.2) (fun _ h => h.1) (fun _ _ h hkf => h.of_keepsFrozen hkf) - (fun _ => trivial) ?_ - intro W _i s0 sf - dsimp only - intro hGuard0 _hReal0 _hpc0 _hfs0 _htr0 _hsteps hret_pc hnoex hnhalt - have hrun_sf21 : sf.status = .Running → keepMemsetBlk21 mmpl sf.pc = false := - fun hrs => hret_pc hrs ▸ hGuard0.1 - have hrun_sf20 : sf.status = .Running → keepMemcpyBlk20 mmpl sf.pc = false := - fun hrs => hret_pc hrs ▸ hGuard0.2 - refine ⟨?_, fun _ _ _ _ _ _ _ _ _ => trivial, fun _ _ _ _ _ => rfl⟩ - intro pc f heg - rcases blockProgram_cliGhostExterns_externAt?_mem_cases - (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W) heg with - her | ⟨sym, hsym_ext, hAct, hpc_eq⟩ - · obtain ⟨sym, hsym⟩ := blockProgram_externAt?_some_exists her - refine Or.inl ⟨her, fun u _ _ _ _ _ hkf hfr ⟨hinv, _⟩ => ?_⟩ - exact ⟨cliExternsPlaced_preserves_execFrozen mmpl W hsym u hfr, - hinv.of_keepsFrozen hkf, trivial⟩ - · refine Or.inr ⟨hpc_eq ▸ hRealNone W sym f hsym_ext hAct, - fun u _ hrest hpc hrun hnoex_fu hkf hfr _ ⟨hinv, _⟩ => ?_⟩ - have hne_sc : sym ≠ lsStringCloneSym := fun heq => - h2ef_strClone_not_mem_ext617 (heq ▸ hsym_ext) - have hext0 : cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f := - h2ef_cliGhostExterns_of_ghostSymActive (h2k_ghFixedK mpl mmpl) hAct - have hinv_fu : F3CodeInv mpl mmpl (f u).mem := hinv.of_keepsFrozen hkf - have hlr_sub : sym ≠ lsRustNoAllocShimSymCli → sym ≠ lsMemsetSym → sym ≠ lsMemcpySym → - hole2_keepSub (u.readReg64 .lr) = false := - fun hnoShim hnoMs hnoMc => hNoExLr hext0 hnoShim hnoex_fu hnoMs hnoMc - have hlr_blk21 : sym = lsMemsetSym → keepMemsetBlk21 mmpl (u.readReg64 .lr) = false := - fun hms => blk21_lr_trap_after_hook_ret - (hTrap21 hext0 (by subst hms; decide)) (hBlk21Ext W) - (hinv_fu.mngBlockCodeLoaded 21 hmng21 _ _ Syscall.standard) - hrest hrun hrun_sf21 hnoex hnhalt - have hlr_blk20 : sym = lsMemcpySym → keepMemcpyBlk20 mmpl (u.readReg64 .lr) = false := - fun hmc => blk20_lr_trap_after_hook_ret - (hTrap20 hext0 (by subst hmc; decide)) (hBlk20Ext W) - (hinv_fu.mngBlockCodeLoaded 20 hmng20 _ _ Syscall.standard) - hrest hrun hrun_sf20 hnoex hnhalt - have hread_fds : sym = lsReadFileSym → FdsGe3Closed u.fs := - fun hrd => hNoExFds (hrd ▸ hext0) hnoex_fu - have hst_r : Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) u (f u) := - hGhostReplay W sym f hsym_ext hne_sc hAct u (hpc.trans hpc_eq) hrun hnoex_fu hkf hfr - hlr_sub hlr_blk21 hlr_blk20 hinv hread_fds - exact ⟨hst_r, h2ef_h2k_ghFixedK_preserves_execFrozen mpl mmpl hAct u hfr, - hinv_fu, trivial⟩ end LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2ExecFrozenWire diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2ExecFrozenWireExtra.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2ExecFrozenWireExtra.lean new file mode 100644 index 000000000..8132376e1 --- /dev/null +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2ExecFrozenWireExtra.lean @@ -0,0 +1,411 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfMemsetEntryGuard -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2ExecFrozenWire -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KHooks -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen -- proof-setup: allow-public-import + +/-! +# Multi-Ghost `codeOnly` Block-`617` Transfer (`ElfSlicesPqOomH2ExecFrozenWireExtra`) + +Implements frozen **R5.3** (`block617TransferFixedG_replaysOn_false_codeOnly_withExtra`, +`scratch/2b/api_A.md` §5R.b & `rev_api_A.md` §5R GO) plus `cliExtraGhostSyms_sub_c2Rx`: + +1. `cliExtraGhostSyms_sub_c2Rx`: `∀ s ∈ cliExtraGhostSyms, s ∈ c2RxDehookedSyms`. +2. `block617TransferFixedG_replaysOn_false_codeOnly_extraList` (arbitrary `extra : ExtraGhostTable`) + and `block617TransferFixedG_replaysOn_false_codeOnly_withExtra` (exact §5R.b L930–999 signature, + using `ElfSlicesPqOomH2ExecFrozenWire.h2ef_h2k_ghFixedK_withExtra_preserves_execFrozen`). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2ExecFrozenWireExtra + +open Arm64 Arm64.Obj Arm64.Process ProofLib ProofLib.SepLogic +open CryptoVerification (LibsignalFrozen LibsignalPlacement) +open CryptoVerification.SignalSession + (CliHooks cliExternsPlaced libsignalSessionLib lsMemcpySym lsMemsetSym lsReadFileSym + lsRustNoAllocShimSymCli lsStringCloneSym) +open CryptoVerification.SignalSession.Cli.RunGlue + (CliGhostHooks cliGhostExterns cliGhostExterns_eq_withExtra) +open LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer (ExecFrozen) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadFileBudgetPlaced (FdsGe3Closed) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.Ghost617Transfer + (cliExternsPlaced_preserves_execFrozen) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG + (Block617TransferFixedHypG block617TransferFixedG_of_replaysOn + noNewHooks_cliProgExtPlacedAt_of_ext_none_imp) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + (ExtraEntryGuard ExtraListEntryGuard ExtraListReplaysOn ExtraReplaysOn GhostSymActiveNamed + GhostSymActiveWithExtra GhostSymActiveWithExtra_iff_named_or_extra + cliGhostExternsWithExtra_eq_some_of_active cliGhostExternsWithExtra_nil_of_named + cliGhostExternsWithExtra_none_imp cliGhostExternsWithExtra_some_cases extraListReplaysOn_arm) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyGhost (keepMemcpyBlk20) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyLrTrapRet + (Blk20TrapHook blk20_lr_trap_after_hook_ret) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhost (keepMemsetBlk21) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetLrTrapRet + (Blk21TrapHook blk21_lr_trap_after_hook_ret) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs + (ExtraGhostTable cliExtraGhostSyms cliGhostExternsWithExtra) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesData + (f3LsBlocksLen libsignalBlocks_len) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics + (F3CodeInv F3CodeOk) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfMemsetEntryGuard + (F3MemsetMemcpyEntryLrFalse) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2ExecFrozenWire + (h2ef_h2k_ghFixedK_withExtra_preserves_execFrozen h2ef_strClone_not_mem_ext617) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KHooks (h2k_ghFixedK) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomPlacedInst (hole2_keepSub) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen (c2RxDehookedSyms) +open VerifiedLibraries (mallocngLib) + +/-- Domain inclusion discharging `hSymRx` of `C2RowLayoutFacts.RowCommon.c2_ghostAt_of_extraLookup`. -/ +theorem cliExtraGhostSyms_sub_c2Rx : + ∀ s ∈ cliExtraGhostSyms, s ∈ c2RxDehookedSyms := by decide + +/-! ### Internal `externAt?` & `CodeLoaded` Helpers -/ + +private theorem findSome?_const_none {α β : Type} (l : List α) : + (l.findSome? fun _ => (none : Option β)) = none := by + induction l with + | nil => rfl + | cons _ tl ih => exact ih + +private theorem findSome?_table_exists (tbl : List (String × Nat)) + {ext : String → Option (State → State)} (off : Nat) {f : State → State} + (h : (tbl.findSome? fun (n, o) => if o == off then ext n else none) = some f) : + ∃ sym : String, ext sym = some f := by + induction tbl with + | nil => simp at h + | cons hd tl ih => + rcases hd with ⟨n, o⟩ + simp only [List.findSome?_cons] at h + cases hoo : (o == off) with + | false => + simp only [hoo, Bool.false_eq_true, ↓reduceIte] at h + exact ih h + | true => + simp only [hoo, ↓reduceIte] at h + cases he : ext n with + | none => rw [he] at h; exact ih h + | some g => + rw [he] at h + injection h with hgf + subst hgf + exact ⟨n, he⟩ + +private theorem blockProgram_externAt?_some_exists + {lib : Obj.MultiPlacedLib} {mpl : Obj.MultiPlacement} {idx : Nat} + {ext : String → Option (State → State)} {pc : BitVec 64} {f : State → State} + (h : (lib.blockProgram mpl idx ext).externAt? pc = some f) : + ∃ sym : String, ext sym = some f := by + unfold Obj.MultiPlacedLib.blockProgram Obj.PlacedLib.program Program.externAt? Program.hookAtOff? at h + simp only [ite_self] at h + rw [findSome?_const_none, Option.or_none] at h + exact findSome?_table_exists _ _ h + +private theorem findSome?_stubs_cliGhostExternsWithExtra_mem_cases + (exts : List String) (ρ : String → BitVec 64) (base pc : BitVec 64) + (ghFixed : CliGhostHooks) (extra : ExtraGhostTable) + (baseExt : String → Option (State → State)) {f : State → State} + (h : ((exts.map fun e => (e, (ρ e - base).toNat)).findSome? + fun (n, o) => + if o == (pc - base).toNat then cliGhostExternsWithExtra ghFixed extra baseExt n + else none) = some f) : + ((exts.map fun e => (e, (ρ e - base).toNat)).findSome? + fun (n, o) => if o == (pc - base).toNat then baseExt n else none) = some f ∨ + ∃ sym : String, sym ∈ exts ∧ GhostSymActiveWithExtra ghFixed extra sym f ∧ pc = ρ sym := by + induction exts with + | nil => simp at h + | cons e tl ih => + simp only [List.map_cons, List.findSome?_cons] at h ⊢ + cases hoo : ((ρ e - base).toNat == (pc - base).toNat) with + | false => + simp only [hoo, Bool.false_eq_true, ↓reduceIte] at h ⊢ + rcases ih h with hL | ⟨sym, hmem, hAct, hpc⟩ + · exact Or.inl hL + · exact Or.inr ⟨sym, List.mem_cons_of_mem _ hmem, hAct, hpc⟩ + | true => + simp only [hoo, ↓reduceIte] at h ⊢ + cases he : cliGhostExternsWithExtra ghFixed extra baseExt e with + | none => + rw [he] at h + rw [cliGhostExternsWithExtra_none_imp ghFixed extra baseExt he] + rcases ih h with hL | ⟨sym, hmem, hAct, hpc⟩ + · exact Or.inl hL + · exact Or.inr ⟨sym, List.mem_cons_of_mem _ hmem, hAct, hpc⟩ + | some g => + rw [he] at h + injection h with hgf + subst hgf + rcases cliGhostExternsWithExtra_some_cases ghFixed extra baseExt he with hAct | hBase + · have heq : ρ e - base = pc - base := BitVec.eq_of_toNat_eq (beq_iff_eq.mp hoo) + have hpc_eq : pc = ρ e := by + have h1 := congrArg (· + base) heq.symm + simpa only [BitVec.sub_add_cancel] using h1 + exact Or.inr ⟨e, List.Mem.head _, hAct, hpc_eq⟩ + · rw [hBase] + exact Or.inl rfl + +private theorem blockProgram_cliGhostExternsWithExtra_externAt?_mem_cases + {lib : Obj.MultiPlacedLib} {mpl : Obj.MultiPlacement} {idx : Nat} + (ghFixed : CliGhostHooks) (extra : ExtraGhostTable) + (baseExt : String → Option (State → State)) + {pc : BitVec 64} {f : State → State} + (h : (lib.blockProgram mpl idx (cliGhostExternsWithExtra ghFixed extra baseExt)).externAt? pc = + some f) : + (lib.blockProgram mpl idx baseExt).externAt? pc = some f ∨ + ∃ sym : String, sym ∈ (lib.blockLib idx).text.externs ∧ + GhostSymActiveWithExtra ghFixed extra sym f ∧ pc = lib.resolve mpl sym := by + unfold Obj.MultiPlacedLib.blockProgram Obj.PlacedLib.program Program.externAt? Program.hookAtOff? at h ⊢ + simp only [ite_self] at h ⊢ + rw [findSome?_const_none, Option.or_none] at h ⊢ + exact findSome?_stubs_cliGhostExternsWithExtra_mem_cases + (lib.blockLib idx).text.externs (lib.blockPlacement mpl idx).ρ + (lib.blockPlacement mpl idx).base pc ghFixed extra baseExt h + +private theorem pGhost617_codeLoaded_of_libsignalFrozen_anyExt + (mpl : Obj.MultiPlacement) (EG : CliHooks → String → Option (State → State)) + (W : CliHooks) (m : Memory) (hFrz : LibsignalFrozen mpl m) : + (cliProgExtPlacedAt mpl EG 617 W).CodeLoaded m := by + have h617 : 617 < libsignalSessionLib.blocks.length := by + have hlen := Nat.beq_eq.mp libsignalBlocks_len + have hge : 618 ≤ f3LsBlocksLen := by decide + omega + have hc := hFrz.2 617 h617 + exact Arm64.Program.CodeLoaded.intro hc.aligned hc.no_wrap fun i hi => + ⟨hc.byte_eq i hi, hc.perm_eq i hi, hc.isLazyFree_eq i hi⟩ + +/-! ### (R5.3) Combined 10-Named + 10-Extra `codeOnly` Transfer at `h2k_ghFixedK` -/ + +/-- Table-parametric core of **R5.3** over arbitrary `extra : ExtraGhostTable`. -/ +theorem block617TransferFixedG_replaysOn_false_codeOnly_extraList [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + {libcAddr brkStart : BitVec 64} {stk : Nat} + (extra : ExtraGhostTable) + (guardOf : String → State → Prop) + (hF3Frozen : ∀ m : Memory, F3CodeOk mpl mmpl m → LibsignalFrozen mpl m) + (hRealNone : ∀ (W : CliHooks) (sym : String) (f : State → State), + sym ∈ (libsignalSessionLib.blockLib 617).text.externs → + GhostSymActiveNamed (h2k_ghFixedK mpl mmpl) sym f → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl sym) = none) + (hGhostReplay : ∀ (W : CliHooks) (sym : String) (f : State → State), + sym ∈ (libsignalSessionLib.blockLib 617).text.externs → + sym ≠ lsStringCloneSym → + GhostSymActiveNamed (h2k_ghFixedK mpl mmpl) sym f → + ∀ u : State, + u.pc = libsignalSessionLib.resolve mpl sym → + u.status = .Running → + (∀ msg, (f u).status ≠ .Exception msg) → + u.mem.KeepsFrozen (f u).mem → + ExecFrozen u.mem → + (sym ≠ lsRustNoAllocShimSymCli → sym ≠ lsMemsetSym → sym ≠ lsMemcpySym → + hole2_keepSub (u.readReg64 .lr) = false) → + (sym = lsMemsetSym → keepMemsetBlk21 mmpl (u.readReg64 .lr) = false) → + (sym = lsMemcpySym → keepMemcpyBlk20 mmpl (u.readReg64 .lr) = false) → + F3CodeInv mpl mmpl u.mem → + (sym = lsReadFileSym → FdsGe3Closed u.fs) → + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) u (f u)) + (hNoExLr : ∀ {sym : String} {f : State → State} {a : State}, + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) sym = some f → + sym ≠ lsRustNoAllocShimSymCli → + (∀ msg, (f a).status ≠ .Exception msg) → + sym ≠ lsMemsetSym → + sym ≠ lsMemcpySym → + hole2_keepSub (a.readReg64 .lr) = false) + (hNoExFds : ∀ {baseExt : String → Option (State → State)} {f : State → State} {a : State}, + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) extra baseExt lsReadFileSym = some f → + (∀ msg, (f a).status ≠ .Exception msg) → + FdsGe3Closed a.fs) + (hTrap21 : ∀ {sym : String} {f : State → State}, + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) sym = some f → + sym ≠ lsRustNoAllocShimSymCli → + ∀ L : BitVec 64, keepMemsetBlk21 mmpl L = true → Blk21TrapHook L f) + (hTrap20 : ∀ {sym : String} {f : State → State}, + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) sym = some f → + sym ≠ lsRustNoAllocShimSymCli → + ∀ L : BitVec 64, keepMemcpyBlk20 mmpl L = true → Blk20TrapHook L f) + (hBlk21Ext : ∀ (W : CliHooks) (pc : BitVec 64), keepMemsetBlk21 mmpl pc = true → + (cliProgExtPlacedAt mpl + (fun W' => cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) extra (cliExternsPlaced mmpl W')) + 617 W).externAt? pc = none ∨ + ∃ f, (cliProgExtPlacedAt mpl + (fun W' => cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) extra (cliExternsPlaced mmpl W')) + 617 W).externAt? pc = some f ∧ + ∀ L : BitVec 64, keepMemsetBlk21 mmpl L = true → Blk21TrapHook L f) + (hBlk20Ext : ∀ (W : CliHooks) (pc : BitVec 64), keepMemcpyBlk20 mmpl pc = true → + (cliProgExtPlacedAt mpl + (fun W' => cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) extra (cliExternsPlaced mmpl W')) + 617 W).externAt? pc = none ∨ + ∃ f, (cliProgExtPlacedAt mpl + (fun W' => cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) extra (cliExternsPlaced mmpl W')) + 617 W).externAt? pc = some f ∧ + ∀ L : BitVec 64, keepMemcpyBlk20 mmpl L = true → Blk20TrapHook L f) + (hExtraReplays : ExtraListReplaysOn mpl mmpl + (fun u : State => F3CodeInv mpl mmpl u.mem ∧ True) guardOf (h2k_ghFixedK mpl mmpl) extra) : + Block617TransferFixedHypG mpl mmpl + (fun W => cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) extra (cliExternsPlaced mmpl W)) + (cliExternsPlaced mmpl) + (fun s0 => F3MemsetMemcpyEntryLrFalse mmpl s0 ∧ ExtraListEntryGuard guardOf extra s0) + (LibsignalFrozen mpl) (F3CodeOk mpl mmpl) libcAddr brkStart stk := by + have hmng20 : (20 : Nat) < mallocngLib.blocks.length := by decide + have hmng21 : (21 : Nat) < mallocngLib.blocks.length := by decide + refine block617TransferFixedG_of_replaysOn + (fun _ => false) (F3CodeInv mpl mmpl) (fun _ => True) + (noNewHooks_cliProgExtPlacedAt_of_ext_none_imp mpl 617 + (fun W _sym h => + cliGhostExternsWithExtra_none_imp (h2k_ghFixedK mpl mmpl) extra (cliExternsPlaced mmpl W) h)) + hF3Frozen + (pGhost617_codeLoaded_of_libsignalFrozen_anyExt mpl _) + (fun _ h => h.2) (fun _ h => h.1) (fun _ _ h hkf => h.of_keepsFrozen hkf) + (fun _ => trivial) ?_ + intro W _i s0 sf + dsimp only + intro hGuard0 _hReal0 _hpc0 _hfs0 _htr0 _hsteps hret_pc hnoex hnhalt + have hrun_sf21 : sf.status = .Running → keepMemsetBlk21 mmpl sf.pc = false := + fun hrs => hret_pc hrs ▸ hGuard0.1.1 + have hrun_sf20 : sf.status = .Running → keepMemcpyBlk20 mmpl sf.pc = false := + fun hrs => hret_pc hrs ▸ hGuard0.1.2 + refine ⟨?_, fun _ _ _ _ _ _ _ _ _ => trivial, fun _ _ _ _ _ => rfl⟩ + intro pc f heg + rcases blockProgram_cliGhostExternsWithExtra_externAt?_mem_cases + (h2k_ghFixedK mpl mmpl) extra (cliExternsPlaced mmpl W) heg with + her | ⟨sym, hsym_ext, hAct, hpc_eq⟩ + · obtain ⟨sym, hsym⟩ := blockProgram_externAt?_some_exists her + refine Or.inl ⟨her, fun u _ _ _ _ _ hkf hfr ⟨hinv, _⟩ => ?_⟩ + exact ⟨cliExternsPlaced_preserves_execFrozen mmpl W hsym u hfr, + hinv.of_keepsFrozen hkf, trivial⟩ + · rcases (GhostSymActiveWithExtra_iff_named_or_extra _ _ _ _).mp hAct with + hActNamed | ⟨hDom, hLook⟩ + · refine Or.inr ⟨hpc_eq ▸ hRealNone W sym f hsym_ext hActNamed, + fun u _ hrest hpc hrun hnoex_fu hkf hfr _ ⟨hinv, _⟩ => ?_⟩ + have hne_sc : sym ≠ lsStringCloneSym := fun heq => + h2ef_strClone_not_mem_ext617 (heq ▸ hsym_ext) + have hext_nil : + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) sym = some f := + cliGhostExternsWithExtra_nil_of_named (h2k_ghFixedK mpl mmpl) (fun _ => none) hActNamed + have hext_extra : + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) extra (fun _ => none) sym = some f := + cliGhostExternsWithExtra_eq_some_of_active (h2k_ghFixedK mpl mmpl) extra (fun _ => none) hAct + have hinv_fu : F3CodeInv mpl mmpl (f u).mem := hinv.of_keepsFrozen hkf + have hlr_sub : sym ≠ lsRustNoAllocShimSymCli → sym ≠ lsMemsetSym → sym ≠ lsMemcpySym → + hole2_keepSub (u.readReg64 .lr) = false := + fun hnoShim hnoMs hnoMc => hNoExLr hext_nil hnoShim hnoex_fu hnoMs hnoMc + have hlr_blk21 : sym = lsMemsetSym → keepMemsetBlk21 mmpl (u.readReg64 .lr) = false := + fun hms => blk21_lr_trap_after_hook_ret + (hTrap21 hext_nil (by subst hms; decide)) (hBlk21Ext W) + (hinv_fu.mngBlockCodeLoaded 21 hmng21 _ _ Syscall.standard) + hrest hrun hrun_sf21 hnoex hnhalt + have hlr_blk20 : sym = lsMemcpySym → keepMemcpyBlk20 mmpl (u.readReg64 .lr) = false := + fun hmc => blk20_lr_trap_after_hook_ret + (hTrap20 hext_nil (by subst hmc; decide)) (hBlk20Ext W) + (hinv_fu.mngBlockCodeLoaded 20 hmng20 _ _ Syscall.standard) + hrest hrun hrun_sf20 hnoex hnhalt + have hread_fds : sym = lsReadFileSym → FdsGe3Closed u.fs := + fun hrd => hNoExFds (hrd ▸ hext_extra) hnoex_fu + have hst_r : Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) u (f u) := + hGhostReplay W sym f hsym_ext hne_sc hActNamed u (hpc.trans hpc_eq) hrun hnoex_fu hkf hfr + hlr_sub hlr_blk21 hlr_blk20 hinv hread_fds + exact ⟨hst_r, + h2ef_h2k_ghFixedK_withExtra_preserves_execFrozen mpl mmpl hExtraReplays hAct u hrun hnoex_fu hfr, + hinv_fu, trivial⟩ + · exact extraListReplaysOn_arm (W := W) (fun _ => false) hExtraReplays hGuard0.2 + hDom hLook hpc_eq hret_pc hnoex hnhalt + +/-- **(R5.3)** Direct Cutover-2 generalization of + `H2ExecFrozenWire.h2ef_block617TransferFixedG_replaysOn_false_codeOnly` + (`ElfSlicesPqOomH2ExecFrozenWire.lean:2325–2390`), following H-REV4 `rev_api_A.md` steps 1–6 + and `api_A.md` §5R.b L930–999 verbatim (`keep := fun _ => false`, `PredFs := fun _ => True`). -/ +theorem block617TransferFixedG_replaysOn_false_codeOnly_withExtra [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + {libcAddr brkStart : BitVec 64} {stk : Nat} + (guardOf : String → State → Prop) + (hF3Frozen : ∀ m : Memory, F3CodeOk mpl mmpl m → LibsignalFrozen mpl m) + (hRealNone : ∀ (W : CliHooks) (sym : String) (f : State → State), + sym ∈ (libsignalSessionLib.blockLib 617).text.externs → + GhostSymActiveNamed (h2k_ghFixedK mpl mmpl) sym f → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? + (libsignalSessionLib.resolve mpl sym) = none) + (hGhostReplay : ∀ (W : CliHooks) (sym : String) (f : State → State), + sym ∈ (libsignalSessionLib.blockLib 617).text.externs → + sym ≠ lsStringCloneSym → + GhostSymActiveNamed (h2k_ghFixedK mpl mmpl) sym f → + ∀ u : State, + u.pc = libsignalSessionLib.resolve mpl sym → + u.status = .Running → + (∀ msg, (f u).status ≠ .Exception msg) → + u.mem.KeepsFrozen (f u).mem → + ExecFrozen u.mem → + (sym ≠ lsRustNoAllocShimSymCli → sym ≠ lsMemsetSym → sym ≠ lsMemcpySym → + hole2_keepSub (u.readReg64 .lr) = false) → + (sym = lsMemsetSym → keepMemsetBlk21 mmpl (u.readReg64 .lr) = false) → + (sym = lsMemcpySym → keepMemcpyBlk20 mmpl (u.readReg64 .lr) = false) → + F3CodeInv mpl mmpl u.mem → + (sym = lsReadFileSym → FdsGe3Closed u.fs) → + Steps (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) u (f u)) + (hNoExLr : ∀ {sym : String} {f : State → State} {a : State}, + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) sym = some f → + sym ≠ lsRustNoAllocShimSymCli → + (∀ msg, (f a).status ≠ .Exception msg) → + sym ≠ lsMemsetSym → + sym ≠ lsMemcpySym → + hole2_keepSub (a.readReg64 .lr) = false) + (hNoExFds : ∀ {baseExt : String → Option (State → State)} {f : State → State} {a : State}, + cliGhostExterns (h2k_ghFixedK mpl mmpl) baseExt lsReadFileSym = some f → + (∀ msg, (f a).status ≠ .Exception msg) → + FdsGe3Closed a.fs) + (hTrap21 : ∀ {sym : String} {f : State → State}, + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) sym = some f → + sym ≠ lsRustNoAllocShimSymCli → + ∀ L : BitVec 64, keepMemsetBlk21 mmpl L = true → Blk21TrapHook L f) + (hTrap20 : ∀ {sym : String} {f : State → State}, + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) sym = some f → + sym ≠ lsRustNoAllocShimSymCli → + ∀ L : BitVec 64, keepMemcpyBlk20 mmpl L = true → Blk20TrapHook L f) + (hBlk21Ext : ∀ (W : CliHooks) (pc : BitVec 64), keepMemsetBlk21 mmpl pc = true → + (cliProgExtPlacedAt mpl + (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) + 617 W).externAt? pc = none ∨ + ∃ f, (cliProgExtPlacedAt mpl + (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) + 617 W).externAt? pc = some f ∧ + ∀ L : BitVec 64, keepMemsetBlk21 mmpl L = true → Blk21TrapHook L f) + (hBlk20Ext : ∀ (W : CliHooks) (pc : BitVec 64), keepMemcpyBlk20 mmpl pc = true → + (cliProgExtPlacedAt mpl + (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) + 617 W).externAt? pc = none ∨ + ∃ f, (cliProgExtPlacedAt mpl + (fun W' => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W')) + 617 W).externAt? pc = some f ∧ + ∀ L : BitVec 64, keepMemcpyBlk20 mmpl L = true → Blk20TrapHook L f) + (hExtraReplays : ExtraReplaysOn mpl mmpl + (fun u : State => F3CodeInv mpl mmpl u.mem ∧ True) guardOf (h2k_ghFixedK mpl mmpl)) : + Block617TransferFixedHypG mpl mmpl + (fun W => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W)) + (cliExternsPlaced mmpl) + (fun s0 => F3MemsetMemcpyEntryLrFalse mmpl s0 ∧ + ExtraEntryGuard guardOf (h2k_ghFixedK mpl mmpl) s0) + (LibsignalFrozen mpl) (F3CodeOk mpl mmpl) libcAddr brkStart stk := by + rw [cliGhostExterns_eq_withExtra (h2k_ghFixedK mpl mmpl)] at hNoExFds hBlk21Ext hBlk20Ext ⊢ + exact block617TransferFixedG_replaysOn_false_codeOnly_extraList + mpl mmpl (h2k_ghFixedK mpl mmpl).extra guardOf hF3Frozen hRealNone hGhostReplay + hNoExLr hNoExFds hTrap21 hTrap20 hBlk21Ext hBlk20Ext hExtraReplays + +end LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2ExecFrozenWireExtra diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KAssembly.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KAssembly.lean index 473a12eee..26eb1d2b5 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KAssembly.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KAssembly.lean @@ -12,12 +12,15 @@ module public import LibsignalBinary.Specifications.SignalSession.CliElf public import LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3BinaryOomProofF3G public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2G +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomPlaced public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomPlacedInst public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KHooks public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2ExecFrozenWire public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2Branch2 public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2Asm +import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2ExecFrozenWireExtra import LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer import LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3MatchingPathBF3 import LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3ParseRejectF3 @@ -72,7 +75,7 @@ open ProofLib (stripExecOutside) open VerifiedLibraries (mallocngLib) open VerifiedLibraries.Mallocng (mallocngAddrsOfPlacement) open CryptoGames.LibsignalSessionApi (PreKeySignalMessage) -open CryptoVerification (LibsignalFrozen LibsignalPlacement) +open CryptoVerification (LibsignalFrozen LibsignalPlacement lsmpl) open CryptoVerification.E2E (PEParams PreKeyMessageFields UnreachedPqxdhPrimitives wirePrekey) open CryptoVerification.SignalSession @@ -104,14 +107,16 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadStdinBudgetPlaced open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 (MainOkCliExtPqB2NeedLocksPlacedAt b2MainSpecTightNeedLocksFineAt cliBudgetLimits) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2G - (F3MemsetMemcpyEntryLrFalse MainOkCliF3PqB2NeedLocksPlacedAtG - mainOkCliF3PqG_of_block617TransferFixedG) + (MainOkCliF3PqB2NeedLocksPlacedAtG mainOkCliF3PqG_of_block617TransferFixedG) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3AllocStdinGhostHooks (ActiveF3CallPre) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt cliStaticsPlacedAt) -open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.Ghost617Transfer (GhostSymActive) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG (Block617TransferFixedHypG) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard + (F3C2EntryGuard c2GuardOf f3C2EntryGuard_imp_and_extraEntryGuard) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay + (GhostSymActiveNamed GhostSymActive_iff_named_or_extra) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyGhost (keepMemcpyBlk20) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhost (keepMemsetBlk21) open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) @@ -134,9 +139,9 @@ open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2Branch2 h2b2_branch2_realloc_explicitLr_perPc h2b2_realW_externAt_none_of_ghostSymActive h2b2_shim_branch2) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2ExecFrozenWire - (h2ef_block617TransferFixedG_of_steps_to_stepsAll_codeOnly - h2ef_block617TransferFixedG_replaysOn_false_codeOnly - h2ef_h2k_ghFixedK_preserves_execFrozen h2ef_pGhost617K_codeLoaded_of_libsignalFrozen) + (h2ef_pGhost617K_codeLoaded_of_libsignalFrozen) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2ExecFrozenWireExtra + (block617TransferFixedG_replaysOn_false_codeOnly_withExtra) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopAlloc (h2fsalloc_alloc_activeRealRun_keepSub h2fsalloc_allocZeroed_activeRealRun_keepSub) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopDealloc @@ -144,11 +149,11 @@ open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopDe open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2FirstStopReads (h2fsreads_readFile_activeRealRun_keepSub h2fsreads_readStdin_activeRealRun_keepSub) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KHooks - (h2k_CliGhostAllocHooksK h2k_CliGhostSpqrAllocHooksK h2k_CliRunHooksBundleK - h2k_MainIoOfPlacedK h2k_fds_of_noException h2k_ghFixedK h2k_hole2_hFsK h2k_hole2_hGK - h2k_hole2_hGSpqrK h2k_hole2_hHooksBundleK h2k_hole2_hReadSatK h2k_hole2_hghNoAllocK - h2k_hole2_hioOfK h2k_keepSubLr_false_of_noException h2k_readFileFixedGhostHookFineSubK - h2k_readFileSpecK h2k_readStdinGhostHookFineSubK) + (c2_extraReplaysOn_h2k h2k_CliGhostAllocHooksK h2k_CliGhostSpqrAllocHooksK + h2k_CliRunHooksBundleK h2k_MainIoOfPlacedK h2k_fds_of_noException h2k_ghFixedK h2k_hole2_hFsK + h2k_hole2_hGK h2k_hole2_hGSpqrK h2k_hole2_hHooksBundleK h2k_hole2_hReadSatK + h2k_hole2_hghNoAllocK h2k_hole2_hioOfK h2k_keepSubLr_false_of_noException + h2k_readFileFixedGhostHookFineSubK h2k_readFileSpecK h2k_readStdinGhostHookFineSubK) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMemcpy (h2k_ghFixedK_blk20TrapHook) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMemset @@ -258,13 +263,13 @@ theorem h2ka_hole2_hTrFrozenKG letI : LibsignalPlacement := libsignalPlacementOf mpl (hole2_hblk mpl hLs) (hole2_hext_nodup mpl hLs) Block617TransferFixedHypG mpl mmpl (fun W => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W)) - (cliExternsPlaced mmpl) (F3MemsetMemcpyEntryLrFalse mmpl) + (cliExternsPlaced mmpl) (F3C2EntryGuard mpl mmpl) (LibsignalFrozen mpl) (F3CodeOk mpl mmpl) (mallocngAddrsOfPlacement mmpl).libc cliElfImage.brkStart cliMainStk := h2asm_hole2_hTrFrozenKG mpl mmpl hLs hMm (h2ka_branch2HookReplaysK mpl mmpl hLs hMm) -/-- 10-way `GhostSymActive (h2k_ghFixedK mpl mmpl)` Block-`617` replay dispatcher. -/ +/-- 10-way `GhostSymActiveNamed (h2k_ghFixedK mpl mmpl)` Block-`617` replay dispatcher. -/ theorem h2ka_ghostReplay617K [LibsignalPlacement] (mpl mmpl : MultiPlacement) (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) @@ -272,7 +277,7 @@ theorem h2ka_ghostReplay617K [LibsignalPlacement] (W : CliHooks) (sym : String) (f : State → State) (_hmem : sym ∈ (libsignalSessionLib.blockLib 617).text.externs) (hne_sc : sym ≠ lsStringCloneSym) - (hAct : GhostSymActive (h2k_ghFixedK mpl mmpl) sym f) + (hAct : GhostSymActiveNamed (h2k_ghFixedK mpl mmpl) sym f) (u : State) (hpc : u.pc = libsignalSessionLib.resolve mpl sym) (hrun : u.status = .Running) @@ -324,57 +329,47 @@ theorem h2ka_ghostReplay617K [LibsignalPlacement] exact h2asm_memcpyNarrow_replay617 hLs hMm W u hpc hrun hnoex hfr (hlr_mc rfl) hinv /-- `Block617TransferFixedHypG` at `h2k_ghFixedK` via -`h2ef_block617TransferFixedG_replaysOn_false_codeOnly`. -/ +`block617TransferFixedG_replaysOn_false_codeOnly_withExtra`. -/ theorem h2ka_hole2_hTrFrozenKG_via_replaysOn [LibsignalPlacement] (mpl mmpl : MultiPlacement) (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) - (hMm : mallocngLib.LinkedAt cliElfBytes mmpl) : + (hMm : mallocngLib.LinkedAt cliElfBytes mmpl) + (hMpl : lsmpl = mpl := by rfl) : Block617TransferFixedHypG mpl mmpl (fun W => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W)) - (cliExternsPlaced mmpl) (F3MemsetMemcpyEntryLrFalse mmpl) + (cliExternsPlaced mmpl) (F3C2EntryGuard mpl mmpl) (LibsignalFrozen mpl) (F3CodeOk mpl mmpl) - (mallocngAddrsOfPlacement mmpl).libc cliElfImage.brkStart cliMainStk := - h2ef_block617TransferFixedG_replaysOn_false_codeOnly mpl mmpl - (fun _m hCO => hole_gap3_f3CodeOk_to_libsignalFrozen hLs hCO) - (fun W _sym _f hmem hAct => - h2b2_realW_externAt_none_of_ghostSymActive hLs (h2k_ghFixedK mpl mmpl) W hmem hAct) - (h2ka_ghostReplay617K mpl mmpl hLs hMm) - (@h2k_keepSubLr_false_of_noException _ mpl mmpl) - (@h2k_fds_of_noException _ mpl mmpl) - (fun hext hnoShim => h2k_ghFixedK_blk21TrapHook mpl hMm hext hnoShim) - (fun hext hnoShim => h2k_ghFixedK_blk20TrapHook mpl hMm hext hnoShim) - (h2k_ghFixedK_blk21_ext_trap hLs hMm) - (h2k_ghFixedK_blk20_ext_trap hLs hMm) - -/-- `Block617TransferFixedHypG` at `h2k_ghFixedK` via -`h2ef_block617TransferFixedG_of_steps_to_stepsAll_codeOnly`. -/ + (mallocngAddrsOfPlacement mmpl).libc cliElfImage.brkStart cliMainStk := by + subst hMpl + exact Block617TransferFixedHypG.mono_guard + (f3C2EntryGuard_imp_and_extraEntryGuard lsmpl mmpl (h2k_ghFixedK lsmpl mmpl)) + (block617TransferFixedG_replaysOn_false_codeOnly_withExtra lsmpl mmpl (c2GuardOf lsmpl) + (fun _m hCO => hole_gap3_f3CodeOk_to_libsignalFrozen hLs hCO) + (fun W sym f hmem hAct => + h2b2_realW_externAt_none_of_ghostSymActive hLs (h2k_ghFixedK lsmpl mmpl) W hmem + ((GhostSymActive_iff_named_or_extra (h2k_ghFixedK lsmpl mmpl) sym f).mpr (Or.inl hAct))) + (h2ka_ghostReplay617K lsmpl mmpl hLs hMm) + (@h2k_keepSubLr_false_of_noException _ lsmpl mmpl) + (@h2k_fds_of_noException _ lsmpl mmpl) + (fun hext hnoShim => h2k_ghFixedK_blk21TrapHook lsmpl hMm hext hnoShim) + (fun hext hnoShim => h2k_ghFixedK_blk20TrapHook lsmpl hMm hext hnoShim) + (h2k_ghFixedK_blk21_ext_trap hLs hMm) + (h2k_ghFixedK_blk20_ext_trap hLs hMm) + (c2_extraReplaysOn_h2k lsmpl mmpl hLs)) + +/-- `Block617TransferFixedHypG` at `h2k_ghFixedK` (delegating to +`h2ka_hole2_hTrFrozenKG_via_replaysOn`). -/ theorem h2ka_hole2_hTrFrozenKG_via_execfzSec5 [LibsignalPlacement] (mpl mmpl : MultiPlacement) (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) - (hMm : mallocngLib.LinkedAt cliElfBytes mmpl) : + (hMm : mallocngLib.LinkedAt cliElfBytes mmpl) + (hMpl : lsmpl = mpl := by rfl) : Block617TransferFixedHypG mpl mmpl (fun W => cliGhostExterns (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W)) - (cliExternsPlaced mmpl) (F3MemsetMemcpyEntryLrFalse mmpl) + (cliExternsPlaced mmpl) (F3C2EntryGuard mpl mmpl) (LibsignalFrozen mpl) (F3CodeOk mpl mmpl) (mallocngAddrsOfPlacement mmpl).libc cliElfImage.brkStart cliMainStk := - h2ef_block617TransferFixedG_of_steps_to_stepsAll_codeOnly mpl mmpl - (fun _m hCO => hole_gap3_f3CodeOk_to_libsignalFrozen hLs hCO) - (fun W _sym _f hmem hAct => - h2b2_realW_externAt_none_of_ghostSymActive hLs (h2k_ghFixedK mpl mmpl) W hmem hAct) - (h2ka_ghostReplay617K mpl mmpl hLs hMm) - (@h2k_keepSubLr_false_of_noException _ mpl mmpl) - (@h2k_fds_of_noException _ mpl mmpl) - (fun hext hnoShim => h2k_ghFixedK_blk21TrapHook mpl hMm hext hnoShim) - (fun hext hnoShim => h2k_ghFixedK_blk20TrapHook mpl hMm hext hnoShim) - (h2k_ghFixedK_blk21_ext_trap hLs hMm) - (h2k_ghFixedK_blk20_ext_trap hLs hMm) - -/-- `ExecFrozen` preservation across active hooks of `h2k_ghFixedK`. -/ -theorem h2ka_ghFixedK_preserves_execFrozen [LibsignalPlacement] - (mpl mmpl : MultiPlacement) {sym : String} {f : State → State} - (hAct : GhostSymActive (h2k_ghFixedK mpl mmpl) sym f) : - ∀ u : State, ExecFrozen u.mem → ExecFrozen (f u).mem := - h2ef_h2k_ghFixedK_preserves_execFrozen mpl mmpl hAct + h2ka_hole2_hTrFrozenKG_via_replaysOn mpl mmpl hLs hMm hMpl theorem h2ka_pGhost617K_codeLoaded_of_libsignalFrozen [LibsignalPlacement] (mpl mmpl : MultiPlacement) (W : CliHooks) (m : Memory) @@ -397,7 +392,7 @@ structure h2ka_F3CliElfGhostWitnessK ghFixed = h2k_ghFixedK mpl mmpl hTrFrozen : Block617TransferFixedHypG mpl mmpl (fun W => cliGhostExterns ghFixed (cliExternsPlaced mmpl W)) - (cliExternsPlaced mmpl) (F3MemsetMemcpyEntryLrFalse mmpl) + (cliExternsPlaced mmpl) (F3C2EntryGuard mpl mmpl) (LibsignalFrozen mpl) (F3CodeOk mpl mmpl) (mallocngAddrsOfPlacement mmpl).libc cliElfImage.brkStart cliMainStk hFs : CliGhostHooksFs ghFixed diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KBridges.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KBridges.lean index e1ae3c355..0c686e15e 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KBridges.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KBridges.lean @@ -41,7 +41,7 @@ to plain (`h2k_withKeepLrFalse`-free) `HookSat` contracts for the six non-`readF 2. Plain `HookSat` bridges at `cliGhostExterns (h2k_ghFixedK mpl mmpl) base` for `alloc`, `dealloc`, `realloc`, `allocZeroed`, `readStdin`, and `stringClone` (`NoOom` and `Budget`). 3. Closed non-`readFile` fields of `F3CliElfGhostWitness` (`hGSpqr`, `hFs`, `hghNoAlloc`, - 12-field `RunHooksPlaced`, and non-`readFile` `MainIoOfPlaced`) plus split constructors + 13-field `RunHooksPlaced`, and non-`readFile` `MainIoOfPlaced`) plus split constructors assembling `F3CliElfGhostWitness` from the remaining `readFile` and transfer obligations. -/ @@ -649,6 +649,7 @@ theorem h2kb_hole2_hGSpqr memcpy := hK.memcpy memcpy_exact := hK.memcpy_exact memset_acp := hK.memset_acp + extraOk := hK.extraOk allocZeroed := h2kb_hookOk_allocZeroed_of_sat mpl mmpl hLs hMm γ tp allocZeroed_fs := hK.allocZeroed_fs allocZeroed_fsT := hK.allocZeroed_fsT } @@ -681,7 +682,7 @@ theorem h2kb_hole2_hghNoAlloc ExternNoAllocFailed (cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none)) := h2k_hole2_hghNoAllocK mpl mmpl hLs hMm -/-- Closes the 12-field `RunHooksPlaced` half of `CliRunHooksBundle` at `h2k_ghFixedK`. -/ +/-- Closes the 13-field `RunHooksPlaced` half of `CliRunHooksBundle` at `h2k_ghFixedK`. -/ theorem h2kb_hole2_runHooksPlaced (mpl mmpl : MultiPlacement) (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KCliNoOom.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KCliNoOom.lean index a1f12b031..db439071d 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KCliNoOom.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KCliNoOom.lean @@ -16,183 +16,13 @@ public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KM /-! # Pre-`FdsGe3Closed` `cliBudgetLimits` `MainOkCliExt{Pq,Over}B2NeedLocksPlacedAt` Assemblers -**Checked by Lean.** - -`MainIoOfPlacedFd` and `runSpecTightPlacedPreFd` counterparts of -`CliNoOomOfFitsEnv.mainOkCliExt{Pq,Over}B2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf`. +Superseded by SWAR-padded `HookSat` assemblers in `ElfSlicesPqOomH2KCliNoOomSat`. -/ @[expose] public section set_option autoImplicit false -set_option linter.style.haveILetI false -set_option maxRecDepth 200000 namespace LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KCliNoOom -open Arm64 (GhostName Memory subroutine_ok) -open Arm64.Obj (MultiPlacement) -open Arm64.Process (bytesOfString) -open CryptoVerification (libsignalMutatedBlocks libsignalSessionExterns) -open CryptoVerification.E2E (UnreachedPqxdhPrimitives) -open CryptoVerification.LibsignalPublicApi.StoreKit (FsFiles) -open CryptoVerification.LibsignalTripleRatchet (extHookStack) -open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) -open CryptoVerification.SignalSession - (CliHooks CliPqxdhInputs Inputs cliExternsPlaced cliProcessInputs libsignalSessionLib - stdinCapBytes) -open CryptoVerification.SignalSession.Cli.MainHops - (LsCodeInv RunCall cliIo cliMainStk cliResStack cliWrOk inputOf mProgPlaced mainFrameSize - parseArgs) -open CryptoVerification.SignalSession.Cli.RunCompose (runRel) -open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) -open LibsignalBinary.Heap (AllocEvent FitsEnv) -open LibsignalBinary.Heap.Fine (fineCostModel fineHookRustCliAllocBudget) -open LibsignalBinary.Proofs.PeakBudget.CliFitsTraceArith (cliBudgetLimits) -open LibsignalBinary.Proofs.PeakBudget.CliRunArmsPeak (CliRunCalleeEnvs) -open LibsignalBinary.Proofs.PeakBudget.CliSlotEnvelopeBridge - (CliRunBinaryEnv RealCliMainBinaryEnvOf) -open LibsignalBinary.Proofs.PeakBudget.MainEntryBudgetFitsCapReal - (mainEntryBudgetFitsCapOf_cliBudgetLimits_of_kitEnvFits) -open LibsignalBinary.Proofs.PeakBudget.RealMainEnvAdapter (BoundedReadFileEnv) -open LibsignalBinary.Proofs.PeakBudget.SpqrDomainCapsAux (sessionCapBytes) -open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) -open LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced - (MainOkCliExtOverB2NeedLocksPlacedAt MainOkCliExtPqB2NeedLocksPlacedAt) -open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced (ReadStdinBoundedEnv) -open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainOkCliExtB2NeedLocksInst (cliRunSemD2c_placed) -open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.M3PlacedBudgetFd (MainIoOfPlacedFd) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (CliGhostAllocHooks) -open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KIfaces - (runSpecTightPlacedPreFd) -open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMainEntryFits - (mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd - mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd) -open VerifiedLibraries.Mallocng (mallocngAddrsOfPlacement) - -/-- `cliBudgetLimits` specialization of -`mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd`. -/ -theorem mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf_preFd - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {hookStack : Nat} - {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} - (E : UnreachedPqxdhPrimitives → CliHooks → RunCall → CliRunCalleeEnvs) - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (ghOf W)) - (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoOfPlacedFd (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack - ReadStdinBoundedEnv ReadEnv) - (hReadSub : ∀ (files : FsFiles) (path : List (BitVec 8)) (evs : List AllocEvent), - ReadEnv files path evs → BoundedReadFileEnv evs) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hMain : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (i : Inputs), - CliPqxdhInputs ⟨W.C, W.Q⟩ i → - FitsEnv fineCostModel cliBudgetLimits fineCostModel.init - (RealCliMainBinaryEnvOf (E X W) i)) - (hRunSub : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) - (g : RunCall), - CliPqxdhInputs ⟨W.C, W.Q⟩ g.i → - parseArgs uuidTryParse (g.i.argv.map bytesOfString) = some g.c → - (inputOf g.i g.c).length ≤ stdinCapBytes → - runRel (cliRunSemD2c_placed X W) g.i g.a → - ∀ evs : List AllocEvent, RunEnv X W γ tp g evs → - CliRunBinaryEnv cliIo.rd (E X W g) sessionCapBytes g evs) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlacedPreFd (libsignalPlacementOf mpl hblk hext_nodup) _ - CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk cliBudgetLimits := - mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd - hblk hext_nodup hCI ghOf RunEnv hlibc hG hioOf hstk - (fun h547 X W γ tp => - mainEntryBudgetFitsCapOf_cliBudgetLimits_of_kitEnvFits - hReadSub (hMain h547 X W) (hRunSub h547 X W γ tp)) - hrun - -/-- `cliBudgetLimits` specialization of -`mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd`. -/ -theorem mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf_preFd - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {hookStack : Nat} - {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} - (E : UnreachedPqxdhPrimitives → CliHooks → RunCall → CliRunCalleeEnvs) - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (ghOf W)) - (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoOfPlacedFd (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack - ReadStdinBoundedEnv ReadEnv) - (hReadSub : ∀ (files : FsFiles) (path : List (BitVec 8)) (evs : List AllocEvent), - ReadEnv files path evs → BoundedReadFileEnv evs) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hMain : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (i : Inputs), - CliPqxdhInputs ⟨W.C, W.Q⟩ i → - FitsEnv fineCostModel cliBudgetLimits fineCostModel.init - (RealCliMainBinaryEnvOf (E X W) i)) - (hRunSub : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) - (g : RunCall), - CliPqxdhInputs ⟨W.C, W.Q⟩ g.i → - parseArgs uuidTryParse (g.i.argv.map bytesOfString) = some g.c → - (inputOf g.i g.c).length ≤ stdinCapBytes → - runRel (cliRunSemD2c_placed X W) g.i g.a → - ∀ evs : List AllocEvent, RunEnv X W γ tp g evs → - CliRunBinaryEnv cliIo.rd (E X W g) sessionCapBytes g evs) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlacedPreFd (libsignalPlacementOf mpl hblk hext_nodup) _ - CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits - (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk cliBudgetLimits := - mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd - hblk hext_nodup hCI ghOf RunEnv hlibc hG hioOf hstk - (fun h547 X W γ tp => - mainEntryBudgetFitsCapOf_cliBudgetLimits_of_kitEnvFits - hReadSub (hMain h547 X W) (hRunSub h547 X W γ tp)) - hrun - end LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KCliNoOom diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KCliNoOomSat.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KCliNoOomSat.lean new file mode 100644 index 000000000..f50ffd468 --- /dev/null +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KCliNoOomSat.lean @@ -0,0 +1,201 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import Arm64.Trusted.Spec.Hoare +public import LibsignalBinary.Proofs.PeakBudget.CliNoOomOfFitsEnv -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMainEntryFitsSat -- proof-setup: allow-public-import + +/-! +# Pre-`FdsGe3Closed` `cliBudgetLimits` `MainOkCliExt{Pq,Over}B2NeedLocksPadPlacedAt` Assemblers + +**Checked by Lean.** + +SWAR-padded `HookSat` (`*Sat`) counterparts of +`ElfSlicesPqOomH2KCliNoOom.mainOkCliExt{Pq,Over}B2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf_preFd`, +routing through +`ElfSlicesPqOomH2KMainEntryFitsSat.mainOkCliExt{Pq,Over}B2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd_via_sat`. +-/ + +public section + +set_option autoImplicit false +set_option linter.style.haveILetI false +set_option maxRecDepth 200000 + +namespace LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KCliNoOomSat + +open Arm64 (GhostName Memory subroutine_ok) +open Arm64.Obj (MultiPlacement) +open Arm64.Process (bytesOfString) +open CryptoVerification (libsignalMutatedBlocks libsignalSessionExterns) +open CryptoVerification.E2E (UnreachedPqxdhPrimitives) +open CryptoVerification.LibsignalPublicApi.StoreKit (FsFiles) +open CryptoVerification.LibsignalTripleRatchet (extHookStack) +open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) +open CryptoVerification.SignalSession + (CliHooks CliPqxdhInputs Inputs cliExternsPlaced cliProcessInputs libsignalSessionLib + stdinCapBytes) +open CryptoVerification.SignalSession.Cli.MainHops + (LsCodeInv RunCall cliIo cliMainStk cliResStack cliWrOk inputOf mProgPlaced mainFrameSize + parseArgs) +open CryptoVerification.SignalSession.Cli.RunCompose (runRel) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) +open LibsignalBinary.Heap (AllocEvent FitsEnv) +open LibsignalBinary.Heap.Fine (fineCostModel fineHookRustCliAllocBudget) +open LibsignalBinary.Proofs.PeakBudget.CliFitsTraceArith (cliBudgetLimits) +open LibsignalBinary.Proofs.PeakBudget.CliRunArmsPeak (CliRunCalleeEnvs) +open LibsignalBinary.Proofs.PeakBudget.CliSlotEnvelopeBridge + (CliRunBinaryEnv RealCliMainBinaryEnvOf) +open LibsignalBinary.Proofs.PeakBudget.MainEntryBudgetFitsCapReal + (mainEntryBudgetFitsCapOf_cliBudgetLimits_of_kitEnvFits) +open LibsignalBinary.Proofs.PeakBudget.RealMainEnvAdapter (BoundedReadFileEnv) +open LibsignalBinary.Proofs.PeakBudget.SpqrDomainCapsAux (sessionCapBytes) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat + (MainOkCliExtOverB2NeedLocksPadPlacedAt MainOkCliExtPqB2NeedLocksPadPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced (ReadStdinBoundedEnv) +open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainOkCliExtB2NeedLocksInst (cliRunSemD2c_placed) +open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.M3PlacedBudgetFd (MainIoOfPlacedFd) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget + (CliGhostAllocHooks) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KIfaces + (runSpecTightPlacedPreFd) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMainEntryFitsSat + (mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd_via_sat + mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd_via_sat) +open VerifiedLibraries.Mallocng (mallocngAddrsOfPlacement) + +/-- `cliBudgetLimits` specialization of +`mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd_via_sat`. -/ +theorem mainOkCliExtPqB2NeedLocksPadPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf_preFd + {mpl mmpl : MultiPlacement} + (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → + (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) + (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) + {CodeOk : Memory → Prop} + (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) + (ghOf : CliHooks → CliGhostHooks) + {libcAddr brkStart : BitVec 64} {hookStack : Nat} + {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} + (E : UnreachedPqxdhPrimitives → CliHooks → RunCall → CliRunCalleeEnvs) + (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → + RunCall → List AllocEvent → Prop) + (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) + (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel + (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (ghOf W)) + (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @MainIoOfPlacedFd (libsignalPlacementOf mpl hblk hext_nodup) _ + (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits + (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack + ReadStdinBoundedEnv ReadEnv) + (hReadSub : ∀ (files : FsFiles) (path : List (BitVec 8)) (evs : List AllocEvent), + ReadEnv files path evs → BoundedReadFileEnv evs) + (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) + (hMain : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (i : Inputs), + CliPqxdhInputs ⟨W.C, W.Q⟩ i → + FitsEnv fineCostModel cliBudgetLimits fineCostModel.init + (RealCliMainBinaryEnvOf (E X W) i)) + (hRunSub : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) + (g : RunCall), + CliPqxdhInputs ⟨W.C, W.Q⟩ g.i → + parseArgs uuidTryParse (g.i.argv.map bytesOfString) = some g.c → + (inputOf g.i g.c).length ≤ stdinCapBytes → + runRel (cliRunSemD2c_placed X W) g.i g.a → + ∀ evs : List AllocEvent, RunEnv X W γ tp g evs → + CliRunBinaryEnv cliIo.rd (E X W g) sessionCapBytes g evs) + (hrun : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @subroutine_ok _ + (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) + (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) + (mpl.base 579) + (@runSpecTightPlacedPreFd (libsignalPlacementOf mpl hblk hext_nodup) _ + CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits + (RunEnv X W γ tp) uuidTryParse + (runRel (cliRunSemD2c_placed X W)) + cliWrOk cliResStack)) : + MainOkCliExtPqB2NeedLocksPadPlacedAt mpl mmpl + (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk + libcAddr brkStart cliMainStk cliBudgetLimits := + mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd_via_sat + hblk hext_nodup hCI ghOf RunEnv hlibc hG hioOf hstk + (fun h547 X W γ tp => + mainEntryBudgetFitsCapOf_cliBudgetLimits_of_kitEnvFits + hReadSub (hMain h547 X W) (hRunSub h547 X W γ tp)) + hrun + +/-- `cliBudgetLimits` specialization of +`mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd_via_sat`. -/ +theorem mainOkCliExtOverB2NeedLocksPadPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf_preFd + {mpl mmpl : MultiPlacement} + (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → + (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) + (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) + {CodeOk : Memory → Prop} + (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) + (ghOf : CliHooks → CliGhostHooks) + {libcAddr brkStart : BitVec 64} {hookStack : Nat} + {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} + (E : UnreachedPqxdhPrimitives → CliHooks → RunCall → CliRunCalleeEnvs) + (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → + RunCall → List AllocEvent → Prop) + (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) + (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel + (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (ghOf W)) + (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @MainIoOfPlacedFd (libsignalPlacementOf mpl hblk hext_nodup) _ + (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits + (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack + ReadStdinBoundedEnv ReadEnv) + (hReadSub : ∀ (files : FsFiles) (path : List (BitVec 8)) (evs : List AllocEvent), + ReadEnv files path evs → BoundedReadFileEnv evs) + (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) + (hMain : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (i : Inputs), + CliPqxdhInputs ⟨W.C, W.Q⟩ i → + FitsEnv fineCostModel cliBudgetLimits fineCostModel.init + (RealCliMainBinaryEnvOf (E X W) i)) + (hRunSub : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64) + (g : RunCall), + CliPqxdhInputs ⟨W.C, W.Q⟩ g.i → + parseArgs uuidTryParse (g.i.argv.map bytesOfString) = some g.c → + (inputOf g.i g.c).length ≤ stdinCapBytes → + runRel (cliRunSemD2c_placed X W) g.i g.a → + ∀ evs : List AllocEvent, RunEnv X W γ tp g evs → + CliRunBinaryEnv cliIo.rd (E X W g) sessionCapBytes g evs) + (hrun : mpl.base 547 ≠ 0#64 → + ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), + @subroutine_ok _ + (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) + (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) + (mpl.base 579) + (@runSpecTightPlacedPreFd (libsignalPlacementOf mpl hblk hext_nodup) _ + CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits + (RunEnv X W γ tp) uuidTryParse + (runRel (cliRunSemD2c_placed X W)) + cliWrOk cliResStack)) : + MainOkCliExtOverB2NeedLocksPadPlacedAt mpl mmpl + (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk + libcAddr brkStart cliMainStk cliBudgetLimits := + mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd_via_sat + hblk hext_nodup hCI ghOf RunEnv hlibc hG hioOf hstk + (fun h547 X W γ tp => + mainEntryBudgetFitsCapOf_cliBudgetLimits_of_kitEnvFits + hReadSub (hMain h547 X W) (hRunSub h547 X W γ tp)) + hrun + +end LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KCliNoOomSat diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KD3MainLiftGlue.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KD3MainLiftGlue.lean index ef7b1194a..2d4a9f4e2 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KD3MainLiftGlue.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KD3MainLiftGlue.lean @@ -12,6 +12,7 @@ module public import Arm64.Trusted.Spec.Hoare public import LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3MainLiftGlueF3 public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMainEntryFits +import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMainEntryFitsSat /-! # Arbitrary-Domain D3 Block-`579 → 617 → Real Externs` Lift (`ElfSlicesPqOomH2KD3MainLiftGlue`) @@ -44,8 +45,6 @@ open CryptoVerification.SignalSession.Cli.MainHops (LsCodeInv RunCall cliIo cliMainStk cliResStack cliWrOk mProgPlaced mainFrameSize) open CryptoVerification.SignalSession.Cli.RunCompose (RunSem runRel) open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) -open CryptoVerification.SignalSession.Cli.Slots - (cliGhostExterns_fromUtf8_eq cliGhostExterns_memrchr_eq) open LibsignalBinary.Heap (AllocEvent) open LibsignalBinary.Heap.Fine (fineCostModel fineHookRustCliAllocBudget) open LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3MainLiftGlueF3 (Block617TransferFixedHyp) @@ -57,17 +56,20 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.M24L4BEquiv (subroutine_ok_b2MainSpecTightNeedLocksFineAt_iff) open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInst - (MainEntryBudgetFitsCapOf cliGhostExterns_handleErrorMain cliGhostExterns_strlen domScopedRun) + (MainEntryBudgetFitsCapOf cliGhostExterns_handleErrorMain domScopedRun) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced (ReadStdinBoundedEnv) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainOkCliExtB2NeedLocksInst (initFsState_cliProcessInputs_eq) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.M3PlacedBudgetFd (MainIoOfPlacedFd) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (CliGhostAllocHooks allocContractsFsPlaced_of_hooks) + (CliGhostAllocHooks allocContractsFsPlaced_of_hooks + cliGhostExterns_fromUtf8RO_budget_sat cliGhostExterns_fromUtf8_budget_sat + cliGhostExterns_memrchrRO_budget_sat cliGhostExterns_memrchr_budget_sat + cliGhostExterns_strlenRO_budget_sat) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KIfaces (runSpecTightPlacedPreFd) -open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMainEntryFits - (b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_placed_preFd) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMainEntryFitsSat + (b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_placed_preFd_sat) open VerifiedLibraries.Mallocng (mallocngAddrsOfPlacement) /-- Lifts Block-`579` `runSpecTightPlacedPreFd` and `MainEntryBudgetFitsCapOf` on @@ -118,16 +120,23 @@ theorem ghostMainSubroutineD3_of_domScopedRunTight_preFd intro γ tp letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup have hM24 := - b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_placed_preFd + b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_placed_preFd_sat (ext := fun W' => cliGhostExterns ghFixed (cliExternsPlaced mmpl W')) (W := W) (lim := cliBudgetLimits) hblk hext_nodup hCI Dom S hlibc initFsState_cliProcessInputs_eq (allocContractsFsPlaced_of_hooks mmpl ghFixed W (hG γ tp)) (hioOf γ tp) - (cliGhostExterns_strlen mmpl ghFixed W) - (cliGhostExterns_fromUtf8_eq mmpl ghFixed W) - (cliGhostExterns_memrchr_eq mmpl ghFixed W) + (cliGhostExterns_strlenRO_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG γ tp).extraOk hookStack) + (cliGhostExterns_fromUtf8_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG γ tp).extraOk hookStack) + (cliGhostExterns_fromUtf8RO_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG γ tp).extraOk hookStack) + (cliGhostExterns_memrchr_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG γ tp).extraOk (Nat.le_refl extHookStack) (by decide)) + (cliGhostExterns_memrchrRO_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG γ tp).extraOk (Nat.le_refl extHookStack) (by decide)) (cliGhostExterns_handleErrorMain mmpl ghFixed W) hstk (hfitCap γ tp) (hrun γ tp) exact diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KD3MainLiftGlueSat.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KD3MainLiftGlueSat.lean index 73ee9ae41..7ff6badd0 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KD3MainLiftGlueSat.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KD3MainLiftGlueSat.lean @@ -14,7 +14,6 @@ public import ProofLib.SepLogic.WPp public import LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3MainLiftGlueF3 -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMainEntryFitsSat -- proof-setup: allow-public-import -public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KD3MainLiftGlue -- proof-setup: allow-public-import /-! # `HookSat` Sibling of `ElfSlicesPqOomH2KD3MainLiftGlue` (`ElfSlicesPqOomH2KD3MainLiftGlueSat`) @@ -44,15 +43,13 @@ open CryptoVerification.LibsignalTripleRatchet (extHookStack) open CryptoVerification.LibsignalTripleRatchetRepr (uuidTryParse) open CryptoVerification.SignalSession (CliHooks Inputs cliExternsPlaced cliProcessInputs libsignalSessionLib - lsFromUtf8Sym lsMemrchrSym strlenHook) + lsFromUtf8Sym lsMemrchrSym) open CryptoVerification.SignalSession.Cli (RunAnswer) open CryptoVerification.SignalSession.Cli.MainHops (LsCodeInv RunCall cliIo cliMainStk cliResStack cliWrOk fromUtf8AsciiSpec lsHandleErrorSymMain mProgPlaced mainFrameSize memrchrSpec) open CryptoVerification.SignalSession.Cli.RunCompose (RunSem runRel) open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) -open CryptoVerification.SignalSession.Cli.Slots - (cliGhostExterns_fromUtf8_eq cliGhostExterns_memrchr_eq) open LibsignalBinary.Heap (AllocEvent) open LibsignalBinary.Heap.Fine (fineCostModel fineHookRustCliAllocBudget) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) @@ -67,20 +64,17 @@ open LibsignalBinary.Proofs.SignalSession.Cli.M24.ArgvPad open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) open LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO (fromUtf8AsciiSpecRO memrchrSpecRO) -open LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesROSat - (hookSat_fromUtf8ROVm_of_eq hookSat_memrchrROVm_ls_of_eq) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInst - (MainEntryBudgetFitsCapOf cliGhostExterns_handleErrorMain cliGhostExterns_strlen domScopedRun) -open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInstSat - (hookSat_fromUtf8Vm_of_eq hookSat_strlenRO_of_eq) + (MainEntryBudgetFitsCapOf cliGhostExterns_handleErrorMain domScopedRun) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced (ReadStdinBoundedEnv) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainOkCliExtB2NeedLocksInst (initFsState_cliProcessInputs_eq) -open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AddressA1PlacedBudgetSat - (hookSat_memrchrVm_ls_of_eq) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.M3PlacedBudgetFd (MainIoOfPlacedFd) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (CliGhostAllocHooks allocContractsFsPlaced_of_hooks) + (CliGhostAllocHooks allocContractsFsPlaced_of_hooks + cliGhostExterns_fromUtf8RO_budget_sat cliGhostExterns_fromUtf8_budget_sat + cliGhostExterns_memrchrRO_budget_sat cliGhostExterns_memrchr_budget_sat + cliGhostExterns_strlenRO_budget_sat) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsFsPlaced) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KIfaces (runSpecTightPlacedPreFd) @@ -135,7 +129,6 @@ theorem extMainSubroutineD3_of_domScopedRunTight_preFd_sat @MainIoOfPlacedFd (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) cliBudgetLimits (ext W) cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstrlen : ext W "strlen" = some strlenHook) (hstrlenRO : HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hutf8RO : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) @@ -170,7 +163,7 @@ theorem extMainSubroutineD3_of_domScopedRunTight_preFd_sat hblk hext_nodup hCI Dom S hlibc initFsState_cliProcessInputs_eq (hFs γ tp) (hioOf γ tp) - hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan + hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk (hfitCap γ tp) (hrun γ tp) rw [← cliProgExtPlacedAt_eq, ← cliStaticsPlacedAt_eq] exact hM24 @@ -229,14 +222,26 @@ theorem ghostMainSubroutineD3_of_domScopedRunTight_preFd_via_sat letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup exact allocContractsFsPlaced_of_hooks mmpl ghFixed W (hG γ tp)) hioOf - (cliGhostExterns_strlen mmpl ghFixed W) - (hookSat_strlenRO_of_eq hookStack (cliGhostExterns_strlen mmpl ghFixed W)) - (hookSat_fromUtf8Vm_of_eq hookStack (cliGhostExterns_fromUtf8_eq mmpl ghFixed W)) - (hookSat_fromUtf8ROVm_of_eq hookStack (cliGhostExterns_fromUtf8_eq mmpl ghFixed W)) - (@hookSat_memrchrVm_ls_of_eq (libsignalPlacementOf mpl hblk hext_nodup) _ - (cliGhostExterns_memrchr_eq mmpl ghFixed W)) - (@hookSat_memrchrROVm_ls_of_eq (libsignalPlacementOf mpl hblk hext_nodup) _ extHookStack - (cliGhostExterns_memrchr_eq mmpl ghFixed W)) + (by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_strlenRO_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG 0 0#64).extraOk hookStack) + (by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_fromUtf8_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG 0 0#64).extraOk hookStack) + (by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_fromUtf8RO_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG 0 0#64).extraOk hookStack) + (by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_memrchr_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG 0 0#64).extraOk (Nat.le_refl extHookStack) (by decide)) + (by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_memrchrRO_budget_sat ghFixed (cliExternsPlaced mmpl W) + (hG 0 0#64).extraOk (Nat.le_refl extHookStack) (by decide)) (cliGhostExterns_handleErrorMain mmpl ghFixed W) hstk hfitCap hrun diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KHooks.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KHooks.lean index 36eeca64f..3c020b16b 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KHooks.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KHooks.lean @@ -15,6 +15,8 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPla public import LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.F3ReadFileGhostHook public import LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadFileCliIoInst public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3AllocStdinGhostHooks +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness public import LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced @@ -29,6 +31,9 @@ public import ProofLib.FsTrace import LibsignalBinary.Proofs.Common.SharedHelpers import LibsignalBinary.Proofs.PeakBudget.RealCliDecPkSlotOk import LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.AgreesOutsideReadHooks +import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.T4Witness +import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.LinkedCallHookG +import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StripRunPanicExterns import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFsBudget import LibsignalBinary.Proofs.SignalSession.Cli.Run.Glue.FsTracedPlaced import ProofLib.Process.OracleEq @@ -64,8 +69,7 @@ namespace LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KHooks open Arm64 (FsTraced GhostName HookFsTraced HookOk HookSat Memory Program Reg SepProp Spec State SubroutineOutcome subroutine_ok) open Arm64.Obj (MultiPlacement) -open ProofLib (hookNoop libcMemcpySpec libcMemmoveSpec libcMemsetSpec memcpyRegionSpec - memsetRegionSpec) +open ProofLib (hookNoop libcMemcpySpec libcMemsetSpec memcpyRegionSpec memsetRegionSpec) open VerifiedLibraries (mallocngLib) open CryptoVerification (IsLsBlockProg LibsignalHooks LibsignalPlacement lsHandleErrorSym lsRustAllocSym lsRustDeallocSym lsRustNoAllocShimSym lsRustReallocSym lsmpl lsρ) @@ -73,20 +77,21 @@ open CryptoVerification.LibsignalPublicApi.StoreKit (FsFiles TraceFsSound withLs withLsRoCl) open CryptoVerification.LibsignalSessionRepr (VecGhost) open CryptoVerification.LibsignalTripleRatchet (extHookStack framelessMemcpySpec lsMemcpySym - memcpyName memmoveName memsetName noAllocShimSpec sessionMemcpyRegionSpec sessionMemcpySpec + memcpyName memsetName noAllocShimSpec sessionMemcpyRegionSpec sessionMemcpySpec sessionMemsetRegionSpec sessionMemsetSpec withStack) open CryptoVerification.LibsignalTripleRatchet.Prost (lsHandleAllocErrorSym) open CryptoVerification.SignalSession (CliHooks cliElfBytes cliElfImage cliExternsPlaced - libsignalSessionLib lsFormatInnerSym lsFromUtf8Sym lsMemrchrSym lsReadFileSym lsReadStdinSym - lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli - lsRustReallocSymCli lsStringCloneSym lsWriteFileSym lsWriteStdoutSym) + libsignalSessionLib lsBlackBoxSym lsDurationSinceSym lsFormatInnerSym lsFromUtf8Sym lsMemrchrSym + lsReadFileSym lsReadStdinSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli + lsRustNoAllocShimSymCli lsRustReallocSymCli lsSharedSecretDropSym lsStaticSecretDropSym + lsStringCloneSym lsTimeAddSym lsWriteFileSym lsWriteStdoutSym) open CryptoVerification.SignalSession.Cli (ReadFileGhost ReadRule cliBcmpSpec) open CryptoVerification.SignalSession.Cli.Main.Placed (lsProg_617) open CryptoVerification.SignalSession.Cli.MainHops (IoModel ReadFileLitGhost ReadStdinGhost cliIo cliRunBudgets cliWrOk fromUtf8AsciiSpec hookOk_withStack memrchrSpec) open CryptoVerification.SignalSession.Cli.Run.Placed (lsProg_579) open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks CliGhostHooksFs IsFsC - cliGhostExterns) + cliGhostExterns cliGhostExternsWithExtra) open CryptoVerification.SignalSession.Cli.Store.PlacedCommon (CliPanicHooksPlaced) open CryptoVerification.SignalSession.CliExt (ReadFileCall) open CryptoVerification.SpqrV1.Alloc (sessionMemcpyRegionROSpec) @@ -108,13 +113,48 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadStdinBudgetPlaced ( open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3AllocStdinGhostHooks (ActiveF3CallPre f3AllocFallback f3DeallocFallback f3LinkedCallHook f3LinkedCallHook_fs f3LinkedCallHook_fsT f3ReadStdinFallback f3ReallocFallback f3StringCloneFallback) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays (bcmpGhost) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhostReplays (blackBoxGhost) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard (c2GuardOf) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts ( + c2_bcmpGhost_rowOk_guardOf c2_blackBoxGhost_rowOk_guardOf c2_durationSinceGhost_rowOk_guardOf + c2_fromUtf8Ghost_rowOk_guardOf c2_memmoveGhost_rowOk_guardOf c2_memrchrGhost_rowOk_guardOf + c2_sharedSecretDropGhost_rowOk_guardOf c2_staticSecretDropGhost_rowOk_guardOf + c2_strlenGhost_rowOk_guardOf c2_timeAddGhost_rowOk_guardOf) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.T4Witness ( + c2ExternTableFacts_lsmpl c2Lib2RxSliceFacts_lsmpl c2ResolveFacts_lsmpl c2RoSliceFacts) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.Time (c2TimeMpl) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.DurationSinceGhostReplays ( + durationSinceGhost) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay ( + ExtraReplaysOn GhostRowOk) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8GhostReplays (fromUtf8MplGhost) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.LinkedCallHookG (linkedCallHookG) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore (HookExactMemcpy) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays (memmoveGhost) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemrchrExtraReplays (memrchrGhost) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhostK (emptyStdProg) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness ( f3EmptyMemcpyGhostHookNarrow f3EmptyMemcpyGhostHookNarrow_exact f3EmptyMemcpyGhostHookNarrow_fsT f3EmptyMemcpyGhostHookNarrow_noAllocFailed f3EmptyMemcpyGhostHookNarrow_r1_allocWitness f3EmptyMemsetGhostHookNarrow f3EmptyMemsetGhostHookNarrow_eq_narrow f3EmptyMemsetGhostHookNarrow_fsT f3EmptyMemsetGhostHookNarrow_noAllocFailed f3EmptyMemsetGhostHookNarrow_r1_allocWitness) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropGhostReplays ( + sharedSecretDropGhost) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StaticSecretDropGhostReplays ( + staticSecretDropGhost) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays (strlenGhost) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StripRunPanicExterns (externOnlyStdProg) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddGhostReplays ( + timeAddGhost timeAddPanicExterns) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.TimeAddPanicGhostK ( + timeAddGhostHookExternOnlyLsRet timeAddGhostHookExternOnly_eq) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs ( + CompleteExtraKeysList ExtraFullListSpecOk ExtraGhostTable ExtraSpecOk FreshExtraKeysList + cliExtraGhostSyms) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics (F3CodeInv) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen (c2FromUtf8TableAddr) open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced (ReadStdinBoundedEnv readStdinSpecOfPlaced) @@ -126,8 +166,8 @@ open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomPlacedInst ( hole2_ActiveStrCloneRun hole2_emptyProg hole2_hblk hole2_hext_nodup hole2_hookStack hole2_keep hole2_keepSub hole2_targets) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemcpyBudgetSpec - sessionMemcpyRegionBudgetSpec sessionMemmoveBudgetSpec sessionMemsetBudgetSpec - sessionMemsetRegionBudgetSpec sessionShimBudgetSpec) + sessionMemcpyRegionBudgetSpec sessionMemsetBudgetSpec sessionMemsetRegionBudgetSpec + sessionShimBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Hooks2Budget (rustAllocSpecWithStack rustDeallocExternSpecWithStack rustReallocExternSpecWithStack) @@ -255,6 +295,8 @@ structure h2k_CliGhostAllocHooksK [LibsignalPlacement] (M : AllocCostModel) (A : HookFsTraced IsFsC f memcpy_exact : ∀ f, g.memcpy = some f → HookExactMemcpy f memset_acp : ∀ f, g.memset = some f → ∀ s : State, (f s).sigActions = s.sigActions ∧ (f s).oracle = s.oracle + extraOk : + LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.ExtraSpecOk g /-- K-twin of `CliGhostSpqrAllocHooks` extending `h2k_CliGhostAllocHooksK` with `h2k_allocZeroedSpecK`. -/ @@ -300,12 +342,6 @@ structure h2k_AllocContractsXCliPlacedK [LibsignalPlacement] {M : AllocCostModel session_memcpy_region : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → subroutine_ok (lsProg_617 H) (lsρ memcpyName) (withLsCodeRoLoaded lsmpl (withStack sessionMemcpyRegionBudgetSpec stk)) - memmove : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → - subroutine_ok (lsProg_617 H) (lsρ memmoveName) - (withLsCodeRoLoaded lsmpl (withVmPreserved (libcMemmoveSpec stk))) - session_memmove : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → - subroutine_ok (lsProg_617 H) (lsρ memmoveName) - (withLsCodeRoLoaded lsmpl (sessionMemmoveBudgetSpec stk)) memset : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → subroutine_ok (lsProg_617 H) (lsρ memsetName) (withLsCodeRoLoaded lsmpl (withVmPreserved (libcMemsetSpec stk))) @@ -344,12 +380,6 @@ structure h2k_AllocContractsFsPlacedK [LibsignalPlacement] {M : AllocCostModel} session_memcpy_region : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → subroutine_ok (lsProg_617 H) (lsρ memcpyName) (withLsCodeRoLoaded lsmpl (withStack sessionMemcpyRegionBudgetSpec stk).keepsFs) - memmove : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → - subroutine_ok (lsProg_617 H) (lsρ memmoveName) - (withLsCodeRoLoaded lsmpl (withVmPreserved (libcMemmoveSpec stk)).keepsFs) - session_memmove : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → - subroutine_ok (lsProg_617 H) (lsρ memmoveName) - (withLsCodeRoLoaded lsmpl (sessionMemmoveBudgetSpec stk).keepsFs) memset : ∀ (stk : Nat), extHookStack ≤ stk → stk ≤ 2 ^ 64 → subroutine_ok (lsProg_617 H) (lsρ memsetName) (withLsCodeRoLoaded lsmpl (withVmPreserved (libcMemsetSpec stk)).keepsFs) @@ -373,14 +403,18 @@ structure h2k_RunHooksPlacedK [LibsignalPlacement] {M : AllocCostModel} allocFs : h2k_AllocContractsFsPlacedK A lim ext panics : CliPanicHooksPlaced ext memcpyRO : HookSat ext lsMemcpySym (withVmPreserved sessionMemcpyRegionROSpec) - bcmp : HookSat ext "bcmp" (withVmPreserved cliBcmpSpec) + bcmp : HookSat ext "bcmp" (withVmPreserved cliBcmpSpec).keepsFs fs : ∀ (prog : Program) (i : Nat), [IsLsBlockProg prog i ext] → TraceFsSound prog utf8 : ∀ stk : Nat, HookSat ext lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec stk)) - memrchr : ∀ stk : Nat, HookSat ext lsMemrchrSym (withVmPreserved (memrchrSpec stk)) + memrchr : HookSat ext lsMemrchrSym + (LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.WithLsRet.withLsRet + (withVmPreserved (memrchrSpec extHookStack))) codecHooks : h2k_CodecHooksPlacedK M A lim ext allocZeroed : HookSat ext lsRustAllocZeroedSymCli (h2k_allocZeroedSpecK M A lim) stringClone : HookSat ext lsStringCloneSym (h2k_stringCloneBudgetSpecK M A lim) formatInner : HookSat ext lsFormatInnerSym (formatInnerBudgetSpec M A lim) + blackBox : HookSat ext lsBlackBoxSym + LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat.blackBoxSpecSat /-- K-twin of `CliRunHooksBundle` combining `h2k_RunHooksPlacedK` with `lsReadFileSym` `subroutine_ok` at `h2k_readFileSpecK`. -/ @@ -561,7 +595,24 @@ noncomputable def h2k_readStdinGhostHookFineSubK [LibsignalPlacement] ⟨h2k_readStdinGhostHookFineK keep P_real P_sub entry_io mmpl brkStart lim stk, h2k_readStdinGhostHookFineK_fsT keep P_real P_sub entry_io mmpl brkStart lim stk⟩ -/-- K ghost-hook tuple instantiating `hole2_ghFixed` at the seven `h2k_*SpecK` specs. -/ +/-- Canonical 10-row ELF-linked Cutover-2 `ExtraGhostTable` for `h2k_ghFixedK` at ambient `lsmpl` + (canonical `cliExtraGhostSyms` order, `"memmove"` first). -/ +noncomputable def c2LinkedExtraGhosts [LibsignalPlacement] (mmpl : MultiPlacement) : + ExtraGhostTable := + [ ("memmove", memmoveGhost lsmpl mmpl) + , ("bcmp", bcmpGhost lsmpl mmpl) + , ("strlen", strlenGhost lsmpl mmpl) + , (lsMemrchrSym, memrchrGhost lsmpl mmpl) + , (lsFromUtf8Sym, fromUtf8MplGhost lsmpl mmpl c2FromUtf8TableAddr) + , (lsDurationSinceSym, durationSinceGhost c2TimeMpl) + , (lsTimeAddSym, timeAddGhost c2TimeMpl) + , (lsBlackBoxSym, blackBoxGhost lsmpl mmpl) + , (lsStaticSecretDropSym, staticSecretDropGhost lsmpl mmpl) + , (lsSharedSecretDropSym, sharedSecretDropGhost lsmpl mmpl) + ] + +/-- K ghost-hook tuple instantiating `hole2_ghFixed` at the seven `h2k_*SpecK` specs and the + 10 Cutover-2 `c2LinkedExtraGhosts` rows. -/ noncomputable def h2k_ghFixedK [LibsignalPlacement] (mpl mmpl : MultiPlacement) : CliGhostHooks where alloc := h2k_allocGhostHookFineK hole2_keepSub hole2_emptyProg f3TrialRxProg (hole2_targets mpl).alloc mmpl cliElfImage.brkStart cliBudgetLimits @@ -579,12 +630,254 @@ noncomputable def h2k_ghFixedK [LibsignalPlacement] (mpl mmpl : MultiPlacement) (hole2_targets mpl).readStdin mmpl cliElfImage.brkStart cliBudgetLimits hole2_hookStack) memset := some (f3EmptyMemsetGhostHookNarrow mmpl) memcpy := some (f3EmptyMemcpyGhostHookNarrow mmpl) + extra := c2LinkedExtraGhosts mmpl /-- Per-symbol `keepSet` selector (`hole2_keep` on `lsStringCloneSym`, `hole2_keepSub` on the six allocator / I/O hooks). -/ def h2k_keepSetForSym (sym : String) : BitVec 64 → Bool := if sym == lsStringCloneSym then hole2_keep else hole2_keepSub +/-! ## Cutover-2 `c2LinkedExtraGhosts` Row-Ok, `ExtraSpecOk`, and `ExtraReplaysOn` -/ + +private theorem h2k_lookup_cons_some {V : Type} {sym k : String} {v f : V} + {tl : List (String × V)} {P : String → V → Prop} + (hLook : ((k, v) :: tl).lookup sym = some f) + (hv : P k v) (htl : tl.lookup sym = some f → P sym f) : P sym f := by + simp only [List.lookup] at hLook + cases h : (sym == k) with + | true => + rw [h] at hLook + injection hLook with hf + subst hf + rw [beq_iff_eq.mp h] + exact hv + | false => + rw [h] at hLook + exact htl hLook + +private theorem h2k_lookup_here {V : Type} (k : String) (v : V) (tl : List (String × V)) : + ((k, v) :: tl).lookup k = some v := by + simp [List.lookup] + +private theorem h2k_lookup_there {V : Type} {k sym : String} (v : V) (tl : List (String × V)) + (hne : (sym == k) = false := by decide) : + ((k, v) :: tl).lookup sym = tl.lookup sym := by + simp [List.lookup, hne] + +private theorem h2k_extra_lookup_memmove [LibsignalPlacement] (mpl mmpl : MultiPlacement) : + (h2k_ghFixedK mpl mmpl).extra.lookup "memmove" = some (memmoveGhost lsmpl mmpl) := + h2k_lookup_here _ _ _ + +private theorem h2k_extra_lookup_bcmp [LibsignalPlacement] (mpl mmpl : MultiPlacement) : + (h2k_ghFixedK mpl mmpl).extra.lookup "bcmp" = some (bcmpGhost lsmpl mmpl) := + (h2k_lookup_there _ _).trans (h2k_lookup_here _ _ _) + +private theorem h2k_extra_lookup_strlen [LibsignalPlacement] (mpl mmpl : MultiPlacement) : + (h2k_ghFixedK mpl mmpl).extra.lookup "strlen" = some (strlenGhost lsmpl mmpl) := + (h2k_lookup_there _ _).trans <| (h2k_lookup_there _ _).trans (h2k_lookup_here _ _ _) + +private theorem h2k_extra_lookup_fromUtf8 [LibsignalPlacement] (mpl mmpl : MultiPlacement) : + (h2k_ghFixedK mpl mmpl).extra.lookup lsFromUtf8Sym = + some (fromUtf8MplGhost lsmpl mmpl c2FromUtf8TableAddr) := + (h2k_lookup_there _ _).trans <| (h2k_lookup_there _ _).trans <| + (h2k_lookup_there _ _).trans <| (h2k_lookup_there _ _).trans (h2k_lookup_here _ _ _) + +private theorem h2k_extra_lookup_blackBox [LibsignalPlacement] (mpl mmpl : MultiPlacement) : + (h2k_ghFixedK mpl mmpl).extra.lookup lsBlackBoxSym = some (blackBoxGhost lsmpl mmpl) := + (h2k_lookup_there _ _).trans <| (h2k_lookup_there _ _).trans <| + (h2k_lookup_there _ _).trans <| (h2k_lookup_there _ _).trans <| + (h2k_lookup_there _ _).trans <| (h2k_lookup_there _ _).trans <| + (h2k_lookup_there _ _).trans (h2k_lookup_here _ _ _) + +private theorem h2k_extra_lookup_staticSecretDrop [LibsignalPlacement] (mpl mmpl : MultiPlacement) : + (h2k_ghFixedK mpl mmpl).extra.lookup lsStaticSecretDropSym = + some (staticSecretDropGhost lsmpl mmpl) := + (h2k_lookup_there _ _).trans <| (h2k_lookup_there _ _).trans <| + (h2k_lookup_there _ _).trans <| (h2k_lookup_there _ _).trans <| + (h2k_lookup_there _ _).trans <| (h2k_lookup_there _ _).trans <| + (h2k_lookup_there _ _).trans <| (h2k_lookup_there _ _).trans (h2k_lookup_here _ _ _) + +private theorem h2k_extra_lookup_sharedSecretDrop [LibsignalPlacement] (mpl mmpl : MultiPlacement) : + (h2k_ghFixedK mpl mmpl).extra.lookup lsSharedSecretDropSym = + some (sharedSecretDropGhost lsmpl mmpl) := + (h2k_lookup_there _ _).trans <| (h2k_lookup_there _ _).trans <| + (h2k_lookup_there _ _).trans <| (h2k_lookup_there _ _).trans <| + (h2k_lookup_there _ _).trans <| (h2k_lookup_there _ _).trans <| + (h2k_lookup_there _ _).trans <| (h2k_lookup_there _ _).trans <| + (h2k_lookup_there _ _).trans (h2k_lookup_here _ _ _) + +private theorem h2k_guardOf_memmove (mpl : MultiPlacement) (s0 : State) + (h : c2GuardOf mpl "memmove" s0) : + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemmoveExtraReplays.memmoveEntryGuard mpl s0 := by + unfold c2GuardOf at h + have h0 : ("memmove" == "memmove") = true := by decide + simpa only [h0, ↓reduceIte] using h + +private theorem h2k_guardOf_bcmp (mpl : MultiPlacement) (s0 : State) + (h : c2GuardOf mpl "bcmp" s0) : + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BcmpGhostReplays.bcmpEntryGuard mpl s0 := by + unfold c2GuardOf at h + have h0 : ("bcmp" == "memmove") = false := by decide + have h1 : ("bcmp" == "bcmp") = true := by decide + simpa only [h0, h1, Bool.false_eq_true, ↓reduceIte] using h + +private theorem h2k_guardOf_strlen (mpl : MultiPlacement) (s0 : State) + (h : c2GuardOf mpl "strlen" s0) : + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays.strlenEntryGuard mpl s0 := by + unfold c2GuardOf at h + have h0 : ("strlen" == "memmove") = false := by decide + have h1 : ("strlen" == "bcmp") = false := by decide + have h2 : ("strlen" == "strlen") = true := by decide + simpa only [h0, h1, h2, Bool.false_eq_true, ↓reduceIte] using h + +private theorem h2k_guardOf_fromUtf8 (mpl : MultiPlacement) (s0 : State) + (h : c2GuardOf mpl lsFromUtf8Sym s0) : + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.FromUtf8GhostReplays.fromUtf8EntryGuard mpl s0 := by + unfold c2GuardOf at h + have h0 : (lsFromUtf8Sym == "memmove") = false := by decide + have h1 : (lsFromUtf8Sym == "bcmp") = false := by decide + have h2 : (lsFromUtf8Sym == "strlen") = false := by decide + have h3 : (lsFromUtf8Sym == lsMemrchrSym) = false := by decide + have h4 : (lsFromUtf8Sym == lsFromUtf8Sym) = true := by decide + simpa only [h0, h1, h2, h3, h4, Bool.false_eq_true, ↓reduceIte] using h + +private theorem h2k_guardOf_blackBox (mpl : MultiPlacement) (s0 : State) + (h : c2GuardOf mpl lsBlackBoxSym s0) : + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.BlackBoxGhostReplays.blackBoxEntryGuard mpl s0 := by + unfold c2GuardOf at h + have h0 : (lsBlackBoxSym == "memmove") = false := by decide + have h1 : (lsBlackBoxSym == "bcmp") = false := by decide + have h2 : (lsBlackBoxSym == "strlen") = false := by decide + have h3 : (lsBlackBoxSym == lsMemrchrSym) = false := by decide + have h4 : (lsBlackBoxSym == lsFromUtf8Sym) = false := by decide + have h5 : (lsBlackBoxSym == lsDurationSinceSym) = false := by decide + have h6 : (lsBlackBoxSym == lsTimeAddSym) = false := by decide + have h7 : (lsBlackBoxSym == lsBlackBoxSym) = true := by decide + simpa only [h0, h1, h2, h3, h4, h5, h6, h7, Bool.false_eq_true, ↓reduceIte] using h + +private theorem h2k_guardOf_staticSecretDrop (mpl : MultiPlacement) (s0 : State) + (h : c2GuardOf mpl lsStaticSecretDropSym s0) : + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StaticSecretDropGhostReplays.staticSecretDropEntryGuard + mpl s0 := by + unfold c2GuardOf at h + have h0 : (lsStaticSecretDropSym == "memmove") = false := by decide + have h1 : (lsStaticSecretDropSym == "bcmp") = false := by decide + have h2 : (lsStaticSecretDropSym == "strlen") = false := by decide + have h3 : (lsStaticSecretDropSym == lsMemrchrSym) = false := by decide + have h4 : (lsStaticSecretDropSym == lsFromUtf8Sym) = false := by decide + have h5 : (lsStaticSecretDropSym == lsDurationSinceSym) = false := by decide + have h6 : (lsStaticSecretDropSym == lsTimeAddSym) = false := by decide + have h7 : (lsStaticSecretDropSym == lsBlackBoxSym) = false := by decide + have h8 : (lsStaticSecretDropSym == lsStaticSecretDropSym) = true := by decide + simpa only [h0, h1, h2, h3, h4, h5, h6, h7, h8, Bool.false_eq_true, ↓reduceIte] using h + +private theorem h2k_guardOf_sharedSecretDrop (mpl : MultiPlacement) (s0 : State) + (h : c2GuardOf mpl lsSharedSecretDropSym s0) : + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.SharedSecretDropGhostReplays.sharedSecretDropEntryGuard + mpl s0 := by + unfold c2GuardOf at h + have h0 : (lsSharedSecretDropSym == "memmove") = false := by decide + have h1 : (lsSharedSecretDropSym == "bcmp") = false := by decide + have h2 : (lsSharedSecretDropSym == "strlen") = false := by decide + have h3 : (lsSharedSecretDropSym == lsMemrchrSym) = false := by decide + have h4 : (lsSharedSecretDropSym == lsFromUtf8Sym) = false := by decide + have h5 : (lsSharedSecretDropSym == lsDurationSinceSym) = false := by decide + have h6 : (lsSharedSecretDropSym == lsTimeAddSym) = false := by decide + have h7 : (lsSharedSecretDropSym == lsBlackBoxSym) = false := by decide + have h8 : (lsSharedSecretDropSym == lsStaticSecretDropSym) = false := by decide + have h9 : (lsSharedSecretDropSym == lsSharedSecretDropSym) = true := by decide + simpa only [h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, Bool.false_eq_true, ↓reduceIte] using h + +private theorem h2k_extraRowOk [LibsignalPlacement] + (mpl mmpl : MultiPlacement) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hlsmpl : lsmpl = mpl := by rfl) + {sym : String} {f : State → State} + (hLook : (h2k_ghFixedK mpl mmpl).extra.lookup sym = some f) : + GhostRowOk lsmpl mmpl + (fun u : State => F3CodeInv lsmpl mmpl u.mem ∧ True) + (fun W' => cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) + (h2k_ghFixedK mpl mmpl).extra (cliExternsPlaced mmpl W')) + sym + (c2GuardOf lsmpl sym) + f := by + have hLs' : libsignalSessionLib.LinkedAt cliElfBytes lsmpl := hlsmpl ▸ hLs + have hRo := c2RoSliceFacts + have hRes := c2ResolveFacts_lsmpl hLs' + have hRx := c2Lib2RxSliceFacts_lsmpl hLs' + have hExt := c2ExternTableFacts_lsmpl hLs' + let g := h2k_ghFixedK mpl mmpl + let RowP : String → (State → State) → Prop := fun s gHook => + GhostRowOk lsmpl mmpl + (fun u : State => F3CodeInv lsmpl mmpl u.mem ∧ True) + (fun W' => cliGhostExternsWithExtra g g.extra (cliExternsPlaced mmpl W')) + s (c2GuardOf lsmpl s) gHook + have hLook' : (c2LinkedExtraGhosts mmpl).lookup sym = some f := hLook + refine h2k_lookup_cons_some (P := RowP) hLook' ?_ fun hLook' => ?_ + · exact c2_memmoveGhost_rowOk_guardOf mmpl (fun _ => True) (c2GuardOf lsmpl) g g.extra + (h2k_extra_lookup_memmove mpl mmpl) (h2k_guardOf_memmove lsmpl) (Or.inr rfl) (Or.inr rfl) + hRes hRx hExt hLs' + · refine h2k_lookup_cons_some (P := RowP) hLook' ?_ fun hLook' => ?_ + · exact c2_bcmpGhost_rowOk_guardOf mmpl (fun _ => True) (c2GuardOf lsmpl) g g.extra + (h2k_extra_lookup_bcmp mpl mmpl) (h2k_guardOf_bcmp lsmpl) hRes hRx hExt hLs' + · refine h2k_lookup_cons_some (P := RowP) hLook' ?_ fun hLook' => ?_ + · exact c2_strlenGhost_rowOk_guardOf mmpl (fun _ => True) (c2GuardOf lsmpl) g g.extra + (h2k_extra_lookup_strlen mpl mmpl) (h2k_guardOf_strlen lsmpl) hRes hRx hExt hLs' + · refine h2k_lookup_cons_some (P := RowP) hLook' ?_ fun hLook' => ?_ + · exact c2_memrchrGhost_rowOk_guardOf mmpl (fun _ => True) (c2GuardOf lsmpl) g g.extra + hRes hRx hExt hLs' + · refine h2k_lookup_cons_some (P := RowP) hLook' ?_ fun hLook' => ?_ + · exact c2_fromUtf8Ghost_rowOk_guardOf mmpl (fun _ => True) (c2GuardOf lsmpl) g g.extra + (h2k_extra_lookup_fromUtf8 mpl mmpl) (h2k_guardOf_fromUtf8 lsmpl) + hRes hRx hRo hExt hLs' + · refine h2k_lookup_cons_some (P := RowP) hLook' ?_ fun hLook' => ?_ + · exact c2_durationSinceGhost_rowOk_guardOf mmpl (fun _ => True) (c2GuardOf lsmpl) + g g.extra hRes hRx hRo hExt hLs' + · refine h2k_lookup_cons_some (P := RowP) hLook' ?_ fun hLook' => ?_ + · exact c2_timeAddGhost_rowOk_guardOf mmpl (fun _ => True) (c2GuardOf lsmpl) + g g.extra hRes hRx hExt hLs' + · refine h2k_lookup_cons_some (P := RowP) hLook' ?_ fun hLook' => ?_ + · exact c2_blackBoxGhost_rowOk_guardOf mmpl (fun _ => True) (c2GuardOf lsmpl) + g g.extra (h2k_extra_lookup_blackBox mpl mmpl) (h2k_guardOf_blackBox lsmpl) + hRes hRx hExt hLs' + · refine h2k_lookup_cons_some (P := RowP) hLook' ?_ fun hLook' => ?_ + · exact c2_staticSecretDropGhost_rowOk_guardOf mmpl (fun _ => True) + (c2GuardOf lsmpl) g g.extra (h2k_extra_lookup_staticSecretDrop mpl mmpl) + (h2k_guardOf_staticSecretDrop lsmpl) hRes hRx hExt hLs' + · refine h2k_lookup_cons_some (P := RowP) hLook' ?_ fun hLook' => nomatch hLook' + exact c2_sharedSecretDropGhost_rowOk_guardOf mmpl (fun _ => True) + (c2GuardOf lsmpl) g g.extra (h2k_extra_lookup_sharedSecretDrop mpl mmpl) + (h2k_guardOf_sharedSecretDrop lsmpl) hRes hRx hExt hLs' + +/-- Full Cutover-2 `ExtraSpecOk` bundle for `h2k_ghFixedK` across all 10 `c2LinkedExtraGhosts` + rows. -/ +theorem h2k_extraSpecOk [LibsignalPlacement] + (mpl mmpl : MultiPlacement) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hlsmpl : lsmpl = mpl := by rfl) : + ExtraSpecOk (h2k_ghFixedK mpl mmpl) := + { fresh := by + dsimp only [FreshExtraKeysList, h2k_ghFixedK, c2LinkedExtraGhosts, List.map] + decide + rowOk := fun _sym _f hLook => (h2k_extraRowOk mpl mmpl hLs hlsmpl hLook).1 + complete := by + dsimp only [CompleteExtraKeysList, h2k_ghFixedK, c2LinkedExtraGhosts, List.map] + decide } + +/-- Full Cutover-2 `ExtraReplaysOn` witness for `h2k_ghFixedK` across all 10 `c2LinkedExtraGhosts` + rows (feeds `R5.3` `block617TransferFixedG_replaysOn_false_codeOnly_withExtra` at + `ElfSlicesPqOomH2Asm` / `ElfSlicesPqOomH2KAssembly`). -/ +theorem c2_extraReplaysOn_h2k [LibsignalPlacement] + (mpl mmpl : MultiPlacement) + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hlsmpl : lsmpl = mpl := by rfl) : + ExtraReplaysOn mpl mmpl + (fun u : State => F3CodeInv mpl mmpl u.mem ∧ True) + (c2GuardOf mpl) (h2k_ghFixedK mpl mmpl) := by + subst hlsmpl + intro _sym _f _hDom hLook + exact (h2k_extraRowOk lsmpl mmpl hLs rfl hLook).2 + /-! ## Hook Closure Lemmas and Non-`.Exception` Guard Extraction -/ /-- Spec-free `CliGhostHooksFs` companion for `h2k_ghFixedK`. -/ @@ -595,7 +888,6 @@ theorem h2k_hole2_hFsK letI : LibsignalPlacement := libsignalPlacementOf mpl (hole2_hblk mpl hLs) (hole2_hext_nodup mpl hLs) CliGhostHooksFs (h2k_ghFixedK mpl mmpl) := by letI : LibsignalPlacement := libsignalPlacementOf mpl (hole2_hblk mpl hLs) (hole2_hext_nodup mpl hLs) - have _ := hLs have _ := hMm refine { alloc_fsT := f3LinkedCallHook_fsT _ _ _ _ _ _ @@ -605,7 +897,8 @@ theorem h2k_hole2_hFsK shim_fsT := CryptoVerification.SignalSession.Cli.RunGlue.hookNoop_fsT stringClone_fsT := ?_ memset_fsT := ?_ - memcpy_fsT := ?_ } + memcpy_fsT := ?_ + extra_fsT := (h2k_extraSpecOk mpl mmpl hLs).fsT } · intro f hf dsimp only [h2k_ghFixedK] at hf injection hf with hfeq @@ -735,6 +1028,150 @@ private theorem h2k_readStdinGhostHookFineK_noAllocFailed [LibsignalPlacement] · exact LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.traceDeltaNoAllocFailed_of_eq rfl · exact LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.traceDeltaNoAllocFailed_of_eq rfl +private theorem h2k_emptyStdProg_steps_noAllocFailed {s0 sf : State} {entry : BitVec 64} + (h : Arm64.Steps emptyStdProg (s0.setPC entry) sf) : + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.TraceDeltaNoAllocFailed + s0 sf := + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.traceDeltaNoAllocFailed_trans + (s1 := s0.setPC entry) + (LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.traceDeltaNoAllocFailed_of_eq rfl) + (LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.steps_traceDeltaNoAllocFailed + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.execSyscall_noAllocFailed + (fun pc _ he => nomatch (rfl : emptyStdProg.externAt? pc = none).symm.trans he) + h) + +private theorem h2k_f3LinkedCallHook_emptyStdProg_noAllocFailed {α : Type} + (keep : BitVec 64 → Bool) (P_sub : Program) (entryTarget : BitVec 64) + (specOf : GhostName → BitVec 64 → Spec α) (fallback : State → State) : + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed + (f3LinkedCallHook keep emptyStdProg P_sub entryTarget specOf fallback) := by + classical + intro s0 + unfold f3LinkedCallHook + split + · split + · rename_i hReal + exact h2k_emptyStdProg_steps_noAllocFailed (Classical.choose_spec hReal.2.2.2).1.toSteps + · exact LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.traceDeltaNoAllocFailed_of_eq rfl + · exact LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.traceDeltaNoAllocFailed_of_eq rfl + +private theorem h2k_linkedCallHook_noAllocFailed_of_svc_ext {α : Type} + (keep : BitVec 64 → Bool) (P_real P_sub : Program) (entryTarget : BitVec 64) + (spec : Spec α) (fallback : State → State) + (hSvc : P_real.svc = emptyStdProg.svc) + (hExt : ∀ pc f, P_real.externAt? pc = some f → + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed f) : + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed + (LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer.linkedCallHook + keep P_real P_sub entryTarget spec fallback) := by + classical + intro s0 + unfold LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer.linkedCallHook + split + · split + · rename_i hReal + exact LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.traceDeltaNoAllocFailed_trans + (s1 := s0.setPC entryTarget) + (LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.traceDeltaNoAllocFailed_of_eq rfl) + (LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.steps_traceDeltaNoAllocFailed + (hSvc ▸ LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.execSyscall_noAllocFailed) + hExt (Classical.choose_spec hReal.2.2.2).1.toSteps) + · exact LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.traceDeltaNoAllocFailed_of_eq rfl + · exact LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.traceDeltaNoAllocFailed_of_eq rfl + +private theorem h2k_linkedCallHookG_emptyStdProg_noAllocFailed {α : Type} + (Guard : State → Prop) (keep : BitVec 64 → Bool) (P_sub : Program) + (entryTarget : BitVec 64) (spec : Spec α) (fallback : State → State) : + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed + (linkedCallHookG Guard keep emptyStdProg P_sub entryTarget spec fallback) := by + classical + intro s0 + unfold linkedCallHookG + split + · exact h2k_linkedCallHook_noAllocFailed_of_svc_ext keep emptyStdProg P_sub entryTarget spec + fallback rfl (fun pc _ he => nomatch (rfl : emptyStdProg.externAt? pc = none).symm.trans he) s0 + · split + · exact LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.traceDeltaNoAllocFailed_of_eq rfl + · exact LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.traceDeltaNoAllocFailed_of_eq rfl + +private theorem h2k_timeAddPanicExterns_noAllocFailed : + ExternNoAllocFailed timeAddPanicExterns := by + intro sym f hf + unfold timeAddPanicExterns at hf + split at hf + · injection hf with hfeq + subst hfeq + exact LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.hookNoAllocFailed_of_trace_eq + _ (fun _ => rfl) + · cases hf + +private theorem h2k_timeAddGhost_noAllocFailed [LibsignalPlacement] (timeMpl : MultiPlacement) : + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed + (timeAddGhost timeMpl) := by + rw [timeAddGhost, timeAddGhostHookExternOnlyLsRet, timeAddGhostHookExternOnly_eq] + exact h2k_linkedCallHook_noAllocFailed_of_svc_ext _ _ _ _ _ _ rfl + (LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.externAt_noAllocFailed_of_externs + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.externNoAllocFailed_none + h2k_timeAddPanicExterns_noAllocFailed) + +/-- Every row in `c2LinkedExtraGhosts` preserves `HookNoAllocFailed`. -/ +theorem c2LinkedExtraGhosts_noAllocFailed [LibsignalPlacement] + (mmpl : MultiPlacement) {sym : String} {f : State → State} + (hLook : (c2LinkedExtraGhosts mmpl).lookup sym = some f) : + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed f := by + refine h2k_lookup_cons_some (P := fun _ g => + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed g) + hLook ?_ fun hLook => ?_ + · exact h2k_f3LinkedCallHook_emptyStdProg_noAllocFailed _ _ _ _ _ + · refine h2k_lookup_cons_some (P := fun _ g => + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed g) + hLook ?_ fun hLook => ?_ + · exact h2k_f3LinkedCallHook_emptyStdProg_noAllocFailed _ _ _ _ _ + · refine h2k_lookup_cons_some (P := fun _ g => + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed g) + hLook ?_ fun hLook => ?_ + · rw [strlenGhost, + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostK.f3EmptyStrlenGhostHook_eq, + LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhost.strlenGhostHook] + exact h2k_linkedCallHook_noAllocFailed_of_svc_ext _ _ _ _ _ _ rfl + (fun pc _ he => nomatch (rfl : emptyStdProg.externAt? pc = none).symm.trans he) + · refine h2k_lookup_cons_some (P := fun _ g => + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed g) + hLook ?_ fun hLook => ?_ + · exact h2k_f3LinkedCallHook_emptyStdProg_noAllocFailed _ _ _ _ _ + · refine h2k_lookup_cons_some (P := fun _ g => + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed g) + hLook ?_ fun hLook => ?_ + · exact h2k_linkedCallHookG_emptyStdProg_noAllocFailed _ _ _ _ _ _ + · refine h2k_lookup_cons_some (P := fun _ g => + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed g) + hLook ?_ fun hLook => ?_ + · exact h2k_linkedCallHookG_emptyStdProg_noAllocFailed _ _ _ _ _ _ + · refine h2k_lookup_cons_some (P := fun _ g => + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed g) + hLook ?_ fun hLook => ?_ + · exact h2k_timeAddGhost_noAllocFailed c2TimeMpl + · refine h2k_lookup_cons_some (P := fun _ g => + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed g) + hLook ?_ fun hLook => ?_ + · exact h2k_f3LinkedCallHook_emptyStdProg_noAllocFailed _ _ _ _ _ + · refine h2k_lookup_cons_some (P := fun _ g => + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed g) + hLook ?_ fun hLook => ?_ + · exact h2k_f3LinkedCallHook_emptyStdProg_noAllocFailed _ _ _ _ _ + · refine h2k_lookup_cons_some (P := fun _ g => + LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.HookNoAllocFailed g) + hLook ?_ fun hLook => nomatch hLook + exact h2k_f3LinkedCallHook_emptyStdProg_noAllocFailed _ _ _ _ _ + +private theorem h2k_if_bool_false {α : Type} {c : Bool} {t e : α} (h : c = false) : + (if c = true then t else e) = e := by + rw [h]; rfl + +private theorem h2k_if_bool_true {α : Type} {c : Bool} {t e : α} (h : c = true) : + (if c = true then t else e) = t := by + rw [h]; rfl + /-- Spec-free `ExternNoAllocFailed` companion for `h2k_ghFixedK`. -/ theorem h2k_hole2_hghNoAllocK (mpl mmpl : MultiPlacement) @@ -746,38 +1183,73 @@ theorem h2k_hole2_hghNoAllocK have _ := hLs have _ := hMm intro name f h - unfold cliGhostExterns at h + unfold cliGhostExterns cliGhostExternsWithExtra at h dsimp only [h2k_ghFixedK, h2k_allocGhostHookFineK, h2k_deallocGhostHookFineK, h2k_reallocGhostHookFineK, h2k_allocZeroedGhostHookFineK, h2k_readFileFixedGhostHookFineSubK, h2k_readStdinGhostHookFineSubK] at h - split at h - · injection h with hfeq; subst hfeq; exact h2k_linkedCallHook_noAllocFailed _ _ _ - · split at h - · injection h with hfeq; subst hfeq; exact h2k_linkedCallHook_noAllocFailed _ _ _ - · split at h - · injection h with hfeq; subst hfeq; exact h2k_linkedCallHook_noAllocFailed _ _ _ - · split at h - · injection h with hfeq; subst hfeq; exact h2k_linkedCallHook_noAllocFailed _ _ _ - · split at h - · injection h with hfeq; subst hfeq + cases hc1 : (name == lsRustAllocSymCli) + · rw [h2k_if_bool_false hc1] at h + cases hc2 : (name == lsRustDeallocSymCli) + · rw [h2k_if_bool_false hc2] at h + cases hc3 : (name == lsRustReallocSymCli) + · rw [h2k_if_bool_false hc3] at h + cases hc4 : (name == lsRustAllocZeroedSymCli) + · rw [h2k_if_bool_false hc4] at h + cases hc5 : (name == lsRustNoAllocShimSymCli) + · rw [h2k_if_bool_false hc5] at h + cases hc6 : (name == lsStringCloneSym) + · rw [h2k_if_bool_false hc6] at h + cases hc7 : (name == lsReadFileSym) + · rw [h2k_if_bool_false hc7] at h + cases hc8 : (name == lsReadStdinSym) + · rw [h2k_if_bool_false hc8] at h + cases hc9 : (name == CryptoVerification.SignalSession.lsMemsetSym) + · rw [h2k_if_bool_false hc9] at h + cases hc10 : (name == CryptoVerification.SignalSession.lsMemcpySym) + · rw [h2k_if_bool_false hc10] at h + cases hDom : cliExtraGhostSyms.contains name + · rw [h2k_if_bool_false hDom] at h + cases h + · rw [h2k_if_bool_true hDom] at h + cases hex : (c2LinkedExtraGhosts mmpl).lookup name with + | none => + rw [hex] at h + cases h + | some ex => + rw [hex] at h + injection h with hfeq; subst hfeq + exact c2LinkedExtraGhosts_noAllocFailed mmpl hex + · rw [h2k_if_bool_true hc10] at h + injection h with hfeq; subst hfeq + exact f3EmptyMemcpyGhostHookNarrow_noAllocFailed mmpl + · rw [h2k_if_bool_true hc9] at h + injection h with hfeq; subst hfeq + exact f3EmptyMemsetGhostHookNarrow_noAllocFailed mmpl + · rw [h2k_if_bool_true hc8] at h + injection h with hfeq; subst hfeq + exact h2k_readStdinGhostHookFineK_noAllocFailed _ _ _ _ _ _ _ _ + · rw [h2k_if_bool_true hc7] at h + injection h with hfeq; subst hfeq + exact h2k_readFileFixedGhostHookFineK_noAllocFailed _ _ _ _ _ _ _ _ + · rw [h2k_if_bool_true hc6] at h + injection h with hfeq; subst hfeq + exact h2k_strCloneGhostHookK_noAllocFailed mpl mmpl + · rw [h2k_if_bool_true hc5] at h + injection h with hfeq; subst hfeq exact LibsignalBinary.Proofs.SignalSession.Cli.F3.HInit.CliInitSlotOkPlacedAt.hookNoAllocFailed_of_trace_eq _ (fun _ => rfl) - · split at h - · injection h with hfeq; subst hfeq - exact h2k_strCloneGhostHookK_noAllocFailed mpl mmpl - · split at h - · injection h with hfeq; subst hfeq - exact h2k_readFileFixedGhostHookFineK_noAllocFailed _ _ _ _ _ _ _ _ - · split at h - · injection h with hfeq; subst hfeq - exact h2k_readStdinGhostHookFineK_noAllocFailed _ _ _ _ _ _ _ _ - · split at h - · injection h with hfeq; subst hfeq - exact f3EmptyMemsetGhostHookNarrow_noAllocFailed mmpl - · split at h - · injection h with hfeq; subst hfeq - exact f3EmptyMemcpyGhostHookNarrow_noAllocFailed mmpl - · cases h + · rw [h2k_if_bool_true hc4] at h + injection h with hfeq; subst hfeq + exact h2k_linkedCallHook_noAllocFailed _ _ _ + · rw [h2k_if_bool_true hc3] at h + injection h with hfeq; subst hfeq + exact h2k_linkedCallHook_noAllocFailed _ _ _ + · rw [h2k_if_bool_true hc2] at h + injection h with hfeq; subst hfeq + exact h2k_linkedCallHook_noAllocFailed _ _ _ + · rw [h2k_if_bool_true hc1] at h + injection h with hfeq; subst hfeq + exact h2k_linkedCallHook_noAllocFailed _ _ _ private theorem h2k_hookOk_of_eq_on_pre {α : Type} {P : State → Prop} {f_K f_orig : State → State} {spec : Spec α} @@ -887,6 +1359,7 @@ theorem h2k_hole2_hGSpqrK injection hf with hfeq subst hfeq exact h2k_f3EmptyMemsetGhostHookNarrow_acp mmpl s + extraOk := h2k_extraSpecOk mpl mmpl hLs allocZeroed := h2k_hookOk_linkedCallHook_of_orig hOrig.allocZeroed allocZeroed_fs := f3LinkedCallHook_fs _ _ _ _ _ _ allocZeroed_fsT := f3LinkedCallHook_fsT _ _ _ _ _ _ } @@ -1177,13 +1650,6 @@ private def h2k_dummyQ0 : CryptoVerification.E2E.PqxdhPrims where private def h2k_dummyCliHooks : CliHooks where C := h2k_dummyC0 Q := h2k_dummyQ0 - bcmp a b := if a = b then 0#64 else 1#64 - bcmp_ok a b _ := by - by_cases h : a = b - · simp [h] - · simp only [h, ↓reduceIte, iff_false] - decide - utf8Err _ := (0#64, 0#16) private theorem h2k_strClone_sat_of_bundle [LibsignalPlacement] {mmpl : MultiPlacement} {g : CliGhostHooks} {W : CliHooks} @@ -1252,18 +1718,6 @@ theorem h2k_segc_strCloneGhostHook_okK private theorem h2k_hookNoop_vm (s : State) : LibsignalBinary.Heap.VmPreserved s (hookNoop s) := LibsignalBinary.Heap.VmPreserved.refl s -private theorem h2k_writeBytes_perm_eq (m : Memory) (p : BitVec 64) (bs : List (BitVec 8)) - (a : BitVec 64) : (m.writeBytes p bs).perm a = m.perm a := - congrFun (LibsignalBinary.Heap.IfaceBudgetLemmas.perm_writeBytes_norm m p bs) a - -private theorem h2k_hookMemcpy_vm (s : State) : - LibsignalBinary.Heap.VmPreserved s (ProofLib.hookMemcpy s) := - ⟨⟨rfl, rfl, rfl⟩, rfl, h2k_writeBytes_perm_eq _ _ _, fun _ _ _ => rfl⟩ - -private theorem h2k_hookMemmove_vm (s : State) : - LibsignalBinary.Heap.VmPreserved s (ProofLib.hookMemmove s) := - h2k_hookMemcpy_vm s - private theorem h2k_hook_placed_rocl_ok [LibsignalPlacement] {α : Type} {H : LibsignalHooks} {sym : String} {spec : Spec α} (hsat : HookSat H sym spec) @@ -1272,51 +1726,14 @@ private theorem h2k_hook_placed_rocl_ok [LibsignalPlacement] {α : Type} {H : Li CryptoVerification.LibsignalPublicApi.StoreKit.subroutine_ok_withLsCodeRoLoaded_of_plain (CryptoVerification.ls_hook_ok_ultra_of_mem hsat hmem) -private theorem h2k_cli_row_ghost_rocl_ok [LibsignalPlacement] {α : Type} - (mmpl : MultiPlacement) (g : CliGhostHooks) (W : CliHooks) - {sym : String} {f : State → State} {spec : Spec α} - (hrow : (sym, f) ∈ CryptoVerification.SignalSession.cliHookTablePlaced mmpl W) - (hh : HookOk f spec) - (hmem : sym ∈ CryptoVerification.libsignalSessionExterns) - (h1 : sym ≠ lsRustAllocSymCli := by decide) - (h2 : sym ≠ lsRustDeallocSymCli := by decide) - (h3 : sym ≠ lsRustReallocSymCli := by decide) - (h4 : sym ≠ lsRustAllocZeroedSymCli := by decide) - (h5 : sym ≠ lsRustNoAllocShimSymCli := by decide) - (h6 : sym ≠ lsStringCloneSym := by decide) - (h7 : sym ≠ lsReadFileSym := by decide) - (h8 : sym ≠ lsReadStdinSym := by decide) - (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : - subroutine_ok (lsProg_617 (cliGhostExterns g (cliExternsPlaced mmpl W))) (lsρ sym) - (withLsCodeRoLoaded lsmpl spec) := - h2k_hook_placed_rocl_ok - (CryptoVerification.SignalSession.Cli.Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - ⟨f, CryptoVerification.SignalSession.Cli.RunGlue.cliExternsPlaced_row mmpl W hrow, hh⟩ - h1 h2 h3 h4 h5 h6 h7 h8 h9 h10) - hmem - set_option maxRecDepth 200000 in private theorem h2k_memcpy_mem : memcpyName ∈ CryptoVerification.libsignalSessionExterns := by decide -set_option maxRecDepth 200000 in -private theorem h2k_memmove_mem : memmoveName ∈ CryptoVerification.libsignalSessionExterns := by - decide - set_option maxRecDepth 200000 in private theorem h2k_memset_mem : memsetName ∈ CryptoVerification.libsignalSessionExterns := by decide -private theorem h2k_memmove_ghost_rocl_ok [LibsignalPlacement] {α : Type} - (mmpl : MultiPlacement) (g : CliGhostHooks) (W : CliHooks) - {f : State → State} {spec : Spec α} - (hrow : (memmoveName, f) ∈ CryptoVerification.SignalSession.cliHookTablePlaced mmpl W) - (hh : HookOk f spec) : - subroutine_ok (lsProg_617 (cliGhostExterns g (cliExternsPlaced mmpl W))) (lsρ memmoveName) - (withLsCodeRoLoaded lsmpl spec) := - h2k_cli_row_ghost_rocl_ok mmpl g W hrow hh h2k_memmove_mem - private theorem h2k_stackAt_split_ext (sp : BitVec 64) : ProofLib.stackAt sp extHookStack = Arm64.memRegion (sp - BitVec.ofNat 64 extHookStack) @@ -1495,13 +1912,6 @@ private theorem h2k_hole2_hHooksBundleK_at [LibsignalPlacement] ⟨fMc, hMcEq, hookOk_withStack (hookOk_withVmPreserved hMcReg hMcVm) stk⟩ h2k_memcpy_mem session_memcpy_region := fun stk _ _ => h2k_hook_placed_rocl_ok ⟨fMc, hMcEq, hookOk_withStack (hookOk_withVmPreserved hMcSessReg hMcVm) stk⟩ h2k_memcpy_mem - memmove := fun stk _ _ => h2k_memmove_ghost_rocl_ok mmpl g W - (CryptoVerification.SignalSession.Cli.Slots.memmove_row_placed mmpl W) - (hookOk_withVmPreserved (ProofLib.hookMemmove_ok stk) h2k_hookMemmove_vm) - session_memmove := fun stk _ _ => h2k_memmove_ghost_rocl_ok mmpl g W - (CryptoVerification.SignalSession.Cli.Slots.memmove_row_placed mmpl W) - (hookOk_withVmPreserved (CryptoVerification.LibsignalTripleRatchet.hookMemmove_trace_ok stk) - h2k_hookMemmove_vm) memset := fun stk hle _ => h2k_hook_placed_rocl_ok ⟨fMs, hMsEq, hookOk_withVmPreserved @@ -1545,14 +1955,6 @@ private theorem h2k_hole2_hHooksBundleK_at [LibsignalPlacement] session_memcpy_region := fun stk _ _ => h2k_hook_placed_rocl_ok ⟨fMc, hMcEq, (hookOk_withStack (hookOk_withVmPreserved hMcSessReg hMcVm) stk).keepsFs hMcFs⟩ h2k_memcpy_mem - memmove := fun stk _ _ => h2k_memmove_ghost_rocl_ok mmpl g W - (CryptoVerification.SignalSession.Cli.Slots.memmove_row_placed mmpl W) <| - (hookOk_withVmPreserved (ProofLib.hookMemmove_ok stk) h2k_hookMemmove_vm).keepsFs - CryptoVerification.SignalSession.Cli.MainHops.hookMemmove_fs - session_memmove := fun stk _ _ => h2k_memmove_ghost_rocl_ok mmpl g W - (CryptoVerification.SignalSession.Cli.Slots.memmove_row_placed mmpl W) <| - (hookOk_withVmPreserved (CryptoVerification.LibsignalTripleRatchet.hookMemmove_trace_ok stk) - h2k_hookMemmove_vm).keepsFs CryptoVerification.SignalSession.Cli.MainHops.hookMemmove_fs memset := fun stk hle _ => h2k_hook_placed_rocl_ok ⟨fMs, hMsEq, (hookOk_withVmPreserved @@ -1599,20 +2001,17 @@ private theorem h2k_hole2_hHooksBundleK_at [LibsignalPlacement] g hBase.panics memcpyRO := ⟨fMc, hMcEq, hookOk_withVmPreserved hMcRO hMcVm⟩ bcmp := - CryptoVerification.SignalSession.Cli.Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_bcmp_budget_sat - mmpl W) + LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_bcmp_keepsFs_budget_sat + g (cliExternsPlaced mmpl W) hGSpqr.extraOk fs := fun _ _ _ => CryptoVerification.SignalSession.Cli.RunGlue.traceFsSound_lsProg_cli_ghost mmpl g W (h2k_hole2_hFsK mpl mmpl hLs hMm) utf8 := fun stk => - CryptoVerification.SignalSession.Cli.Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_fromUtf8_budget_sat - mmpl W stk) - memrchr := fun stk => - CryptoVerification.SignalSession.Cli.Slots.cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_memrchr_budget_sat - mmpl W stk) + LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_fromUtf8_budget_sat + g (cliExternsPlaced mmpl W) hGSpqr.extraOk stk + memrchr := + LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_memrchr_budget_sat + g (cliExternsPlaced mmpl W) hGSpqr.extraOk (Nat.le_refl extHookStack) codecHooks := hCodec allocZeroed := ⟨g.allocZeroed, CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExterns_allocZeroed g _, @@ -1621,7 +2020,10 @@ private theorem h2k_hole2_hHooksBundleK_at [LibsignalPlacement] CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExterns_stringClone_some g _ rfl, h2k_segc_strCloneGhostHook_okK mpl mmpl hLs hMm γ tp⟩ formatInner := - LibsignalBinary.Proofs.PeakBudget.RealCliDecPkSlotOk.cliFormatInner_budget_sat mmpl g W } + LibsignalBinary.Proofs.PeakBudget.RealCliDecPkSlotOk.cliFormatInner_budget_sat mmpl g W + blackBox := + LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_blackBoxSat_budget_sat + g (cliExternsPlaced mmpl W) hGSpqr.extraOk } readFile579 := CryptoVerification.ls_hook_ok_ultra_of_mem (prog := lsProg_579 (cliGhostExterns g (cliExternsPlaced mmpl W))) (i := 579) @@ -1674,88 +2076,45 @@ private theorem h2k_keepSub_false_of_keep_false {x : BitVec 64} (h : hole2_keep theorem h2k_keepLr_false_of_noException [LibsignalPlacement] (mpl mmpl : MultiPlacement) {sym : String} {f : State → State} {a : State} - (hext : cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f) + (hext : cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) sym = some f) (hnoShim : sym ≠ lsRustNoAllocShimSymCli) (hnoex : ∀ msg, (f a).status ≠ .Exception msg) (hnoMs : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) (hnoMc : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : h2k_keepSetForSym sym (a.readReg64 .lr) = false := by classical - unfold cliGhostExterns at hext + unfold cliGhostExternsWithExtra at hext dsimp only [h2k_ghFixedK, h2k_readFileFixedGhostHookFineSubK, - h2k_readStdinGhostHookFineSubK] at hext - split at hext - · rename_i hc - have hsym := beq_iff_eq.mp hc - subst hsym - injection hext with hfeq; subst hfeq - have hne : (lsRustAllocSymCli == lsStringCloneSym) = false := by decide - simp only [h2k_keepSetForSym, hne, Bool.false_eq_true, ↓reduceIte] - unfold h2k_allocGhostHookFineK f3LinkedCallHook at hnoex - have hAct := h2k_activeCallPre_of_dite_noException hnoex - dsimp only [h2k_allocSpecK, h2k_withKeepLrFalse] at hAct - exact h2k_pure_of_activeCallPre hAct - · split at hext - · rename_i _ hc - have hsym := beq_iff_eq.mp hc - subst hsym - injection hext with hfeq; subst hfeq - have hne : (lsRustDeallocSymCli == lsStringCloneSym) = false := by decide - simp only [h2k_keepSetForSym, hne, Bool.false_eq_true, ↓reduceIte] - unfold h2k_deallocGhostHookFineK f3LinkedCallHook at hnoex - have hAct := h2k_activeCallPre_of_dite_noException hnoex - dsimp only [h2k_deallocSpecK, h2k_withKeepLrFalse] at hAct - exact h2k_pure_of_activeCallPre hAct - · split at hext - · rename_i _ _ hc - have hsym := beq_iff_eq.mp hc - subst hsym - injection hext with hfeq; subst hfeq - have hne : (lsRustReallocSymCli == lsStringCloneSym) = false := by decide - simp only [h2k_keepSetForSym, hne, Bool.false_eq_true, ↓reduceIte] - unfold h2k_reallocGhostHookFineK f3LinkedCallHook at hnoex - have hAct := h2k_activeCallPre_of_dite_noException hnoex - dsimp only [h2k_reallocSpecK, h2k_withKeepLrFalse] at hAct - exact h2k_pure_of_activeCallPre hAct - · split at hext - · rename_i _ _ _ hc - have hsym := beq_iff_eq.mp hc - subst hsym - injection hext with hfeq; subst hfeq - have hne : (lsRustAllocZeroedSymCli == lsStringCloneSym) = false := by decide - simp only [h2k_keepSetForSym, hne, Bool.false_eq_true, ↓reduceIte] - unfold h2k_allocZeroedGhostHookFineK f3LinkedCallHook at hnoex - have hAct := h2k_activeCallPre_of_dite_noException hnoex - dsimp only [h2k_allocZeroedSpecK, h2k_withKeepLrFalse] at hAct - exact h2k_pure_of_activeCallPre hAct - · split at hext - · rename_i _ _ _ _ hc - exact False.elim (hnoShim (beq_iff_eq.mp hc)) - · split at hext - · rename_i _ _ _ _ _ hc - have hsym := beq_iff_eq.mp hc - subst hsym - injection hext with hfeq; subst hfeq - have heq : (lsStringCloneSym == lsStringCloneSym) = true := by decide - simp only [h2k_keepSetForSym, heq, ↓reduceIte] - unfold h2k_strCloneGhostHookK at hnoex - have hAct := h2k_activeCallPre_of_dite_noException hnoex - dsimp only [h2k_stringCloneSpecK, h2k_withKeepLrFalse] at hAct - exact h2k_pure_of_activeCallPre hAct - · split at hext - · rename_i _ _ _ _ _ _ hc - have hsym := beq_iff_eq.mp hc - subst hsym - injection hext with hfeq; subst hfeq - have hne : (lsReadFileSym == lsStringCloneSym) = false := by decide - simp only [h2k_keepSetForSym, hne, Bool.false_eq_true, ↓reduceIte] - unfold h2k_readFileFixedGhostHookFineK at hnoex - have hAct := h2k_activeCallPre_of_dite_noException hnoex - dsimp only [h2k_readFileAnySpecK, h2k_withKeepLrAndFds] at hAct - exact (h2k_pure_of_activeCallPre hAct).1 - · split at hext - · rename_i _ _ _ _ _ _ _ hc - have hsym := beq_iff_eq.mp hc + h2k_readStdinGhostHookFineSubK, List.lookup] at hext + cases hc1 : (sym == lsRustAllocSymCli) + · rw [h2k_if_bool_false hc1] at hext + cases hc2 : (sym == lsRustDeallocSymCli) + · rw [h2k_if_bool_false hc2] at hext + cases hc3 : (sym == lsRustReallocSymCli) + · rw [h2k_if_bool_false hc3] at hext + cases hc4 : (sym == lsRustAllocZeroedSymCli) + · rw [h2k_if_bool_false hc4] at hext + cases hc5 : (sym == lsRustNoAllocShimSymCli) + · rw [h2k_if_bool_false hc5] at hext + cases hc6 : (sym == lsStringCloneSym) + · rw [h2k_if_bool_false hc6] at hext + cases hc7 : (sym == lsReadFileSym) + · rw [h2k_if_bool_false hc7] at hext + cases hc8 : (sym == lsReadStdinSym) + · rw [h2k_if_bool_false hc8] at hext + cases hc9 : (sym == CryptoVerification.SignalSession.lsMemsetSym) + · rw [h2k_if_bool_false hc9] at hext + cases hc10 : (sym == CryptoVerification.SignalSession.lsMemcpySym) + · rw [h2k_if_bool_false hc10] at hext + cases hDom : cliExtraGhostSyms.contains sym + · rw [h2k_if_bool_false hDom] at hext + cases hext + · rw [h2k_if_bool_true hDom] at hext + cases hext + · exact False.elim (hnoMc (beq_iff_eq.mp hc10)) + · exact False.elim (hnoMs (beq_iff_eq.mp hc9)) + · rw [h2k_if_bool_true hc8] at hext + have hsym := beq_iff_eq.mp hc8 subst hsym injection hext with hfeq; subst hfeq have hne : (lsReadStdinSym == lsStringCloneSym) = false := by decide @@ -1764,13 +2123,67 @@ theorem h2k_keepLr_false_of_noException [LibsignalPlacement] have hAct := h2k_activeCallPre_of_dite_noException hnoex dsimp only [h2k_readStdinSpecK, h2k_withKeepLrFalse] at hAct exact h2k_pure_of_activeCallPre hAct - · split at hext - · rename_i _ _ _ _ _ _ _ _ hc - exact False.elim (hnoMs (beq_iff_eq.mp hc)) - · split at hext - · rename_i _ _ _ _ _ _ _ _ _ hc - exact False.elim (hnoMc (beq_iff_eq.mp hc)) - · cases hext + · rw [h2k_if_bool_true hc7] at hext + have hsym := beq_iff_eq.mp hc7 + subst hsym + injection hext with hfeq; subst hfeq + have hne : (lsReadFileSym == lsStringCloneSym) = false := by decide + simp only [h2k_keepSetForSym, hne, Bool.false_eq_true, ↓reduceIte] + unfold h2k_readFileFixedGhostHookFineK at hnoex + have hAct := h2k_activeCallPre_of_dite_noException hnoex + dsimp only [h2k_readFileAnySpecK, h2k_withKeepLrAndFds] at hAct + exact (h2k_pure_of_activeCallPre hAct).1 + · rw [h2k_if_bool_true hc6] at hext + have hsym := beq_iff_eq.mp hc6 + subst hsym + injection hext with hfeq; subst hfeq + have heq : (lsStringCloneSym == lsStringCloneSym) = true := by decide + simp only [h2k_keepSetForSym, heq, ↓reduceIte] + unfold h2k_strCloneGhostHookK at hnoex + have hAct := h2k_activeCallPre_of_dite_noException hnoex + dsimp only [h2k_stringCloneSpecK, h2k_withKeepLrFalse] at hAct + exact h2k_pure_of_activeCallPre hAct + · exact False.elim (hnoShim (beq_iff_eq.mp hc5)) + · rw [h2k_if_bool_true hc4] at hext + have hsym := beq_iff_eq.mp hc4 + subst hsym + injection hext with hfeq; subst hfeq + have hne : (lsRustAllocZeroedSymCli == lsStringCloneSym) = false := by decide + simp only [h2k_keepSetForSym, hne, Bool.false_eq_true, ↓reduceIte] + unfold h2k_allocZeroedGhostHookFineK f3LinkedCallHook at hnoex + have hAct := h2k_activeCallPre_of_dite_noException hnoex + dsimp only [h2k_allocZeroedSpecK, h2k_withKeepLrFalse] at hAct + exact h2k_pure_of_activeCallPre hAct + · rw [h2k_if_bool_true hc3] at hext + have hsym := beq_iff_eq.mp hc3 + subst hsym + injection hext with hfeq; subst hfeq + have hne : (lsRustReallocSymCli == lsStringCloneSym) = false := by decide + simp only [h2k_keepSetForSym, hne, Bool.false_eq_true, ↓reduceIte] + unfold h2k_reallocGhostHookFineK f3LinkedCallHook at hnoex + have hAct := h2k_activeCallPre_of_dite_noException hnoex + dsimp only [h2k_reallocSpecK, h2k_withKeepLrFalse] at hAct + exact h2k_pure_of_activeCallPre hAct + · rw [h2k_if_bool_true hc2] at hext + have hsym := beq_iff_eq.mp hc2 + subst hsym + injection hext with hfeq; subst hfeq + have hne : (lsRustDeallocSymCli == lsStringCloneSym) = false := by decide + simp only [h2k_keepSetForSym, hne, Bool.false_eq_true, ↓reduceIte] + unfold h2k_deallocGhostHookFineK f3LinkedCallHook at hnoex + have hAct := h2k_activeCallPre_of_dite_noException hnoex + dsimp only [h2k_deallocSpecK, h2k_withKeepLrFalse] at hAct + exact h2k_pure_of_activeCallPre hAct + · rw [h2k_if_bool_true hc1] at hext + have hsym := beq_iff_eq.mp hc1 + subst hsym + injection hext with hfeq; subst hfeq + have hne : (lsRustAllocSymCli == lsStringCloneSym) = false := by decide + simp only [h2k_keepSetForSym, hne, Bool.false_eq_true, ↓reduceIte] + unfold h2k_allocGhostHookFineK f3LinkedCallHook at hnoex + have hAct := h2k_activeCallPre_of_dite_noException hnoex + dsimp only [h2k_allocSpecK, h2k_withKeepLrFalse] at hAct + exact h2k_pure_of_activeCallPre hAct /-- Corollary of `h2k_keepLr_false_of_noException`: since `hole2_keepSub ⊆ hole2_keep`, every non-`.Exception` call to any of the 7 replayed ghost hooks in `h2k_ghFixedK` satisfies @@ -1778,7 +2191,7 @@ theorem h2k_keepLr_false_of_noException [LibsignalPlacement] theorem h2k_keepSubLr_false_of_noException [LibsignalPlacement] (mpl mmpl : MultiPlacement) {sym : String} {f : State → State} {a : State} - (hext : cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f) + (hext : cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) sym = some f) (hnoShim : sym ≠ lsRustNoAllocShimSymCli) (hnoex : ∀ msg, (f a).status ≠ .Exception msg) (hnoMs : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMainEntryFits.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMainEntryFits.lean index 2fd6f3ab9..de8db921a 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMainEntryFits.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMainEntryFits.lean @@ -49,7 +49,7 @@ open CryptoVerification.LibsignalTripleRatchet (extHookStack) open CryptoVerification.LibsignalTripleRatchetRepr (UuidParser uuidTryParse) open CryptoVerification.RustHeap (allocFailedIn) open CryptoVerification.SignalSession - (CliHooks CliPqxdhInputs Inputs cliExternsPlaced cliProcessInputs fromUtf8Hook + (CliHooks CliPqxdhInputs Inputs cliProcessInputs fromUtf8Hook libsignalSessionLib lsFromUtf8Sym lsMemrchrSym memrchrHook stdinCapBytes strlenHook) open CryptoVerification.SignalSession.Cli (CliInputsOk CoinsReadable IsSendOverCap MainPost MainResult RunAnswer StoresGhost @@ -65,9 +65,6 @@ open CryptoVerification.SignalSession.Cli.MainHops open CryptoVerification.SignalSession.Cli.MainHops.MainOkPlacedHelpers (panic_of_mem traceStreamBytes_nil) open CryptoVerification.SignalSession.Cli.RunCompose (RunSem runRel) -open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) -open CryptoVerification.SignalSession.Cli.Slots - (cliGhostExterns_fromUtf8_eq cliGhostExterns_memrchr_eq) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FitsEvents RustCliAllocBudget rustAllocEvents) open LibsignalBinary.Heap.Fine @@ -84,8 +81,8 @@ open LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced cliStaticsPlacedAt_eq_cliStaticsPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInst (B2St1CapOf B2St2CapOf B2St3Cap B2St4Cap B2St5Cap MainEntryBudgetFitsCapOf b2St0Cap_init - b2St01_of_mainEntryBudgetFitsCapOf cliGhostExterns_handleErrorMain cliGhostExterns_strlen - domScopedRun domScopedRun_dom mainCalleesBlk617_of_allocFs_and_hooks_cliResStack) + b2St01_of_mainEntryBudgetFitsCapOf domScopedRun domScopedRun_dom + mainCalleesBlk617_of_allocFs_and_hooks_cliResStack) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced (ReadStdinBoundedEnv) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainOkCliExtB2NeedLocksInst (cliRunSemD2c_placed initFsState_cliProcessInputs_eq mainFrameSize_le_cliMainStk @@ -107,8 +104,6 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.M5PlacedBudget open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.M6PlacedBudget (main_m6_of_m6Env_pool_proof_placed) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.RetPlacedBudget (ExitKPoolPlaced) -open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (CliGhostAllocHooks allocContractsFsPlaced_of_hooks) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsFsPlaced runSpecPlaced) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KIfaces @@ -1437,112 +1432,4 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_preF (hstrlen W) (hutf8 W) (hmemrchr W) (hpan W) hstk (hfitCap h547 X W γ tp) (hrun h547 X W γ tp) -/-- `cliGhostExterns` specialization of -`mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_preFd`. -/ -theorem mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} - {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ghOf W)) - (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoOfPlacedFd (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack - ReadStdinBoundedEnv ReadEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - MainEntryBudgetFitsCapOf fineCostModel lim fineCostModel.init cliIo ReadEnv uuidTryParse - (RunEnv X W γ tp) - (pqScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemD2c_placed X W)))) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlacedPreFd (libsignalPlacementOf mpl hblk hext_nodup) _ - CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtPqB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk lim := - mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_preFd - hblk hext_nodup hCI CliHooks.utf8Err RunEnv hlibc - (fun W γ tp => by - letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup - exact allocContractsFsPlaced_of_hooks mmpl (ghOf W) W (hG W γ tp)) - hioOf - (fun W => cliGhostExterns_strlen mmpl (ghOf W) W) - (fun W => cliGhostExterns_fromUtf8_eq mmpl (ghOf W) W) - (fun W => cliGhostExterns_memrchr_eq mmpl (ghOf W) W) - (fun W => cliGhostExterns_handleErrorMain mmpl (ghOf W) W) - hstk hfitCap hrun - -/-- `cliGhostExterns` specialization of -`mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_preFd`. -/ -theorem mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd - {mpl mmpl : MultiPlacement} - (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → - (libsignalSessionLib.blockLib i).Placeable (libsignalSessionLib.blockPlacement mpl i)) - (hext_nodup : (libsignalSessionExterns.map mpl.ρ).Nodup) - {CodeOk : Memory → Prop} - (hCI : @LsCodeInv (libsignalPlacementOf mpl hblk hext_nodup) CodeOk) - (ghOf : CliHooks → CliGhostHooks) - {libcAddr brkStart : BitVec 64} {lim : BudgetLimits} {hookStack : Nat} - {ReadEnv : FsFiles → List (BitVec 8) → List AllocEvent → Prop} - (RunEnv : UnreachedPqxdhPrimitives → CliHooks → GhostName → BitVec 64 → - RunCall → List AllocEvent → Prop) - (hlibc : libcAddr = (mallocngAddrsOfPlacement mmpl).libc) - (hG : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @CliGhostAllocHooks (libsignalPlacementOf mpl hblk hext_nodup) fineCostModel - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ghOf W)) - (hioOf : ∀ (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @MainIoOfPlacedFd (libsignalPlacementOf mpl hblk hext_nodup) _ - (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) cliIo hookStack - ReadStdinBoundedEnv ReadEnv) - (hstk : mainFrameSize + max (max extHookStack hookStack) cliResStack ≤ cliMainStk := by decide) - (hfitCap : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - MainEntryBudgetFitsCapOf fineCostModel lim fineCostModel.init cliIo ReadEnv uuidTryParse - (RunEnv X W γ tp) - (pqScopedRun ⟨W.C, W.Q⟩ (runRel (cliRunSemD2c_placed X W)))) - (hrun : mpl.base 547 ≠ 0#64 → - ∀ (X : UnreachedPqxdhPrimitives) (W : CliHooks) (γ : GhostName) (tp : BitVec 64), - @subroutine_ok _ - (@mProgPlaced (libsignalPlacementOf mpl hblk hext_nodup) - (cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W))) - (mpl.base 579) - (@runSpecTightPlacedPreFd (libsignalPlacementOf mpl hblk hext_nodup) _ - CodeOk (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (RunEnv X W γ tp) uuidTryParse - (runRel (cliRunSemD2c_placed X W)) - cliWrOk cliResStack)) : - MainOkCliExtOverB2NeedLocksPlacedAt mpl mmpl - (fun W => cliGhostExterns (ghOf W) (cliExternsPlaced mmpl W)) 617 cliProcessInputs CodeOk - libcAddr brkStart cliMainStk lim := - mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_preFd - hblk hext_nodup hCI CliHooks.utf8Err RunEnv hlibc - (fun W γ tp => by - letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup - exact allocContractsFsPlaced_of_hooks mmpl (ghOf W) W (hG W γ tp)) - hioOf - (fun W => cliGhostExterns_strlen mmpl (ghOf W) W) - (fun W => cliGhostExterns_fromUtf8_eq mmpl (ghOf W) W) - (fun W => cliGhostExterns_memrchr_eq mmpl (ghOf W) W) - (fun W => cliGhostExterns_handleErrorMain mmpl (ghOf W) W) - hstk hfitCap hrun - end LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMainEntryFits diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMainEntryFitsSat.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMainEntryFitsSat.lean index fb41fb751..d283f5fba 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMainEntryFitsSat.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMainEntryFitsSat.lean @@ -55,7 +55,7 @@ open CryptoVerification.LibsignalTripleRatchetRepr (UuidParser uuidTryParse) open CryptoVerification.RustHeap (allocFailedIn) open CryptoVerification.SignalSession (CliHooks CliPqxdhInputs Inputs cliExternsPlaced cliProcessInputs - libsignalSessionLib lsFromUtf8Sym lsMemrchrSym stdinCapBytes strlenHook) + libsignalSessionLib lsFromUtf8Sym lsMemrchrSym stdinCapBytes) open CryptoVerification.SignalSession.Cli (CliInputsOk CoinsReadable IsSendOverCap MainPost MainResult RunAnswer StoresGhost cliInputs cliStaticsPlaced utf8) @@ -71,8 +71,6 @@ open CryptoVerification.SignalSession.Cli.MainHops.MainOkPlacedHelpers (panic_of_mem traceStreamBytes_nil) open CryptoVerification.SignalSession.Cli.RunCompose (RunSem runRel) open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) -open CryptoVerification.SignalSession.Cli.Slots - (cliGhostExterns_fromUtf8_eq cliGhostExterns_memrchr_eq) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FitsEvents RustCliAllocBudget rustAllocEvents) open LibsignalBinary.Heap.Fine @@ -89,8 +87,6 @@ open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudgetSat (sepWPp_argvAtROPPad_to_unpadded_needLocks sepWPp_b2MainFrameFinePad_mainLitsPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesRO (fromUtf8AsciiSpecRO memrchrSpecRO) -open LibsignalBinary.Proofs.SignalSession.Cli.M24.CalleesROSat - (hookSat_fromUtf8ROVm_of_eq hookSat_memrchrROVm_ls_of_eq) open LibsignalBinary.Proofs.SignalSession.Cli.M24.CliElfMallocngHarness (cliProgExtPlacedAt) open LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlaced (B2MainEntryFacts cliStaticsPlacedAt cliStaticsPlacedAt_eq_cliStaticsPlaced) @@ -101,15 +97,12 @@ open LibsignalBinary.Proofs.SignalSession.Cli.M24.CliStrictPlacedPadSat open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInst (B2St1CapOf B2St2CapOf B2St3Cap B2St4Cap B2St5Cap MainEntryBudgetFitsCapOf b2St0Cap_init b2St01_of_mainEntryBudgetFitsCapOf - cliGhostExterns_handleErrorMain cliGhostExterns_strlen domScopedRun domScopedRun_dom) + cliGhostExterns_handleErrorMain domScopedRun domScopedRun_dom) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInstSat - (hookSat_fromUtf8Vm_of_eq hookSat_strlenRO_of_eq - mainCalleesBlk617_of_allocFs_and_hooks_cliResStack_sat) + (mainCalleesBlk617_of_allocFs_and_hooks_cliResStack_sat) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced (ReadStdinBoundedEnv) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainOkCliExtB2NeedLocksInst (cliRunSemD2c_placed initFsState_cliProcessInputs_eq mainFrameSize_le_cliMainStk pqScopedRun) -open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.AddressA1PlacedBudgetSat - (hookSat_memrchrVm_ls_of_eq) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.M1PlacedRoBudgetSat (main_m1_ro_pool_placed_step1_of_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.M2PlacedBudgetSat @@ -126,7 +119,10 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.M6PlacedBudget (main_m6_of_m6Env_pool_proof_placed) open LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.RetPlacedBudget (ExitKPoolPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (CliGhostAllocHooks allocContractsFsPlaced_of_hooks) + (CliGhostAllocHooks allocContractsFsPlaced_of_hooks + cliGhostExterns_fromUtf8RO_budget_sat cliGhostExterns_fromUtf8_budget_sat + cliGhostExterns_memrchrRO_budget_sat cliGhostExterns_memrchr_budget_sat + cliGhostExterns_strlenRO_budget_sat) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsFsPlaced) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KIfaces @@ -157,7 +153,6 @@ theorem b2MainRemainingHopsCapOf_of_allocFs_and_io_preFd_sat [LibsignalPlacement (hFs : AllocContractsFsPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W)) (hioOf : MainIoOfPlacedFd (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstrlen : ext W "strlen" = some strlenHook) (hutf8 : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hutf8RO : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) (hmemrchr : HookSat (ext W) lsMemrchrSym (withLsRet (withVmPreserved (memrchrSpec extHookStack)))) @@ -171,9 +166,9 @@ theorem b2MainRemainingHopsCapOf_of_allocFs_and_io_preFd_sat [LibsignalPlacement (B2St4Cap fineCostModel lim) (B2St5Cap fineCostModel lim) RunEnv Run := - let hc := mainCalleesBlk617_of_allocFs_and_hooks_cliResStack_sat hFs hstrlen hutf8 hmemrchr hpan + let hc := mainCalleesBlk617_of_allocFs_and_hooks_cliResStack_sat hFs hutf8 hmemrchr hpan { step2 := - b2_step2_pool_placed_of_hooks_sat hc hstrlen hutf8RO hmemrchrRO + b2_step2_pool_placed_of_hooks_sat hc hutf8RO hmemrchrRO cli_resStack_callees.2.2.1 cli_resStack_callees.2.2.2 hstk cli_hstk64 (fun hst1 _ _ => hst1.1) (fun hst1 _ _ hevs_c hvcap hp => hst1.2 _ _ _ hevs_c hvcap hp) @@ -739,7 +734,6 @@ theorem b2MainSpecTightNeedLocksFineAt_of_runTight_and_budgetFitsCapOf_lsmpl_pre (hFs : AllocContractsFsPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W)) (hioOf : MainIoOfPlacedFd (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstrlen : ext W "strlen" = some strlenHook) (hstrlenRO : HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hutf8RO : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) @@ -762,7 +756,7 @@ theorem b2MainSpecTightNeedLocksFineAt_of_runTight_and_budgetFitsCapOf_lsmpl_pre (b2St01_of_mainEntryBudgetFitsCapOf hfitCap) hrun (b2MainRemainingHopsCapOf_of_allocFs_and_io_preFd_sat - hFs hioOf hstrlen hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk) + hFs hioOf hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk) /-- `HookSat` sibling of `b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_lsmpl_preFd` (`ElfSlicesPqOomH2KMainEntryFits.lean:1260`), dropping unused `err`. -/ @@ -781,7 +775,6 @@ theorem b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_ls (hFs : AllocContractsFsPlaced (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W)) (hioOf : MainIoOfPlacedFd (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstrlen : ext W "strlen" = some strlenHook) (hstrlenRO : HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hutf8RO : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) @@ -805,7 +798,7 @@ theorem b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_ls (b2St01_of_mainEntryBudgetFitsCapOf hfitCap) hrun (b2MainRemainingHopsCapOf_of_allocFs_and_io_preFd_sat - hFs hioOf hstrlen hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk) + hFs hioOf hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk) /-- `HookSat` sibling of `b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_placed_preFd` (`ElfSlicesPqOomH2KMainEntryFits.lean:1301`), dropping unused `err`. -/ @@ -830,7 +823,6 @@ theorem b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_pl (hioOf : @MainIoOfPlacedFd (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstrlen : ext W "strlen" = some strlenHook) (hstrlenRO : HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) (hutf8RO : HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpecRO hookStack))) @@ -857,7 +849,7 @@ theorem b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_pl letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup letI : LsCodeInv CodeOk := hCI exact b2MainSpecTightNeedLocksFineAt_of_domScopedRunSem_and_budgetFitsCapOf_lsmpl_preFd_sat Dom S - hlibc hfs_eq hFs hioOf hstrlen hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk hfitCap + hlibc hfs_eq hFs hioOf hstrlenRO hutf8 hutf8RO hmemrchr hmemrchrRO hpan hstk hfitCap hrun /-- `HookSat` sibling of `mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_preFd` @@ -883,7 +875,6 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_preFd_ @MainIoOfPlacedFd (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -922,7 +913,7 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_preFd_ (cliRunSemD2c_placed X W) hlibc initFsState_cliProcessInputs_eq (hFs W γ tp) (hioOf W γ tp) - (hstrlen W) (hstrlenRO W) (hutf8 W) (hutf8RO W) (hmemrchr W) (hmemrchrRO W) (hpan W) hstk + (hstrlenRO W) (hutf8 W) (hutf8RO W) (hmemrchr W) (hmemrchrRO W) (hpan W) hstk (hfitCap h547 X W γ tp) (hrun h547 X W γ tp) /-- `HookSat` sibling of `mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_preFd` @@ -948,7 +939,6 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_preF @MainIoOfPlacedFd (libsignalPlacementOf mpl hblk hext_nodup) _ (fineHookRustCliAllocBudget γ mmpl tp brkStart) lim (ext W) cliIo hookStack ReadStdinBoundedEnv ReadEnv) - (hstrlen : ∀ W : CliHooks, ext W "strlen" = some strlenHook) (hstrlenRO : ∀ W : CliHooks, HookSat (ext W) "strlen" (strlenSpecROSat hookStack)) (hutf8 : ∀ W : CliHooks, HookSat (ext W) lsFromUtf8Sym (withVmPreserved (fromUtf8AsciiSpec hookStack))) @@ -987,12 +977,12 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_of_runTight_and_budgetFitsCapOf_preF (cliRunSemD2c_placed X W) hlibc initFsState_cliProcessInputs_eq (hFs W γ tp) (hioOf W γ tp) - (hstrlen W) (hstrlenRO W) (hutf8 W) (hutf8RO W) (hmemrchr W) (hmemrchrRO W) (hpan W) hstk + (hstrlenRO W) (hutf8 W) (hutf8RO W) (hmemrchr W) (hmemrchrRO W) (hpan W) hstk (hfitCap h547 X W γ tp) (hrun h547 X W γ tp) /-- `toSat` bridge for `mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd` - (`ElfSlicesPqOomH2KMainEntryFits.lean:1456`), discharging `hstrlenRO` via `hookSat_strlenRO_of_eq` - and re-anchoring to `MainOkCliExtPqB2NeedLocksPadPlacedAt`. -/ + (`ElfSlicesPqOomH2KMainEntryFits.lean:1456`), discharging `strlen`, `from_utf8`, and `memrchr` + via `ExtraSpecOk` and re-anchoring to `MainOkCliExtPqB2NeedLocksPadPlacedAt`. -/ theorem mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd_via_sat {mpl mmpl : MultiPlacement} (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → @@ -1039,20 +1029,32 @@ theorem mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budget letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup exact allocContractsFsPlaced_of_hooks mmpl (ghOf W) W (hG W γ tp)) hioOf - (fun W => cliGhostExterns_strlen mmpl (ghOf W) W) - (fun W => hookSat_strlenRO_of_eq hookStack (cliGhostExterns_strlen mmpl (ghOf W) W)) - (fun W => hookSat_fromUtf8Vm_of_eq hookStack (cliGhostExterns_fromUtf8_eq mmpl (ghOf W) W)) - (fun W => hookSat_fromUtf8ROVm_of_eq hookStack (cliGhostExterns_fromUtf8_eq mmpl (ghOf W) W)) - (fun W => @hookSat_memrchrVm_ls_of_eq (libsignalPlacementOf mpl hblk hext_nodup) _ - (cliGhostExterns_memrchr_eq mmpl (ghOf W) W)) - (fun W => @hookSat_memrchrROVm_ls_of_eq (libsignalPlacementOf mpl hblk hext_nodup) _ - extHookStack (cliGhostExterns_memrchr_eq mmpl (ghOf W) W)) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_strlenRO_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk hookStack) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_fromUtf8_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk hookStack) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_fromUtf8RO_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk hookStack) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_memrchr_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk (Nat.le_refl extHookStack) (by decide)) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_memrchrRO_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk (Nat.le_refl extHookStack) (by decide)) (fun W => cliGhostExterns_handleErrorMain mmpl (ghOf W) W) hstk hfitCap hrun /-- `toSat` bridge for `mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd` - (`ElfSlicesPqOomH2KMainEntryFits.lean:1511`), discharging `hstrlenRO` via `hookSat_strlenRO_of_eq` - and re-anchoring to `MainOkCliExtOverB2NeedLocksPadPlacedAt`. -/ + (`ElfSlicesPqOomH2KMainEntryFits.lean:1511`), discharging `strlen`, `from_utf8`, and `memrchr` + via `ExtraSpecOk` and re-anchoring to `MainOkCliExtOverB2NeedLocksPadPlacedAt`. -/ theorem mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budgetFitsCapOf_preFd_via_sat {mpl mmpl : MultiPlacement} (hblk : ∀ i, i < libsignalSessionLib.blocks.length → (i ∈ libsignalMutatedBlocks) = false → @@ -1099,14 +1101,26 @@ theorem mainOkCliExtOverB2NeedLocksPlacedAt_cliGhostExterns_of_runTight_and_budg letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup exact allocContractsFsPlaced_of_hooks mmpl (ghOf W) W (hG W γ tp)) hioOf - (fun W => cliGhostExterns_strlen mmpl (ghOf W) W) - (fun W => hookSat_strlenRO_of_eq hookStack (cliGhostExterns_strlen mmpl (ghOf W) W)) - (fun W => hookSat_fromUtf8Vm_of_eq hookStack (cliGhostExterns_fromUtf8_eq mmpl (ghOf W) W)) - (fun W => hookSat_fromUtf8ROVm_of_eq hookStack (cliGhostExterns_fromUtf8_eq mmpl (ghOf W) W)) - (fun W => @hookSat_memrchrVm_ls_of_eq (libsignalPlacementOf mpl hblk hext_nodup) _ - (cliGhostExterns_memrchr_eq mmpl (ghOf W) W)) - (fun W => @hookSat_memrchrROVm_ls_of_eq (libsignalPlacementOf mpl hblk hext_nodup) _ - extHookStack (cliGhostExterns_memrchr_eq mmpl (ghOf W) W)) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_strlenRO_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk hookStack) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_fromUtf8_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk hookStack) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_fromUtf8RO_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk hookStack) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_memrchr_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk (Nat.le_refl extHookStack) (by decide)) + (fun W => by + letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup + exact cliGhostExterns_memrchrRO_budget_sat (ghOf W) (cliExternsPlaced mmpl W) + (hG W 0 0#64).extraOk (Nat.le_refl extHookStack) (by decide)) (fun W => cliGhostExterns_handleErrorMain mmpl (ghOf W) W) hstk hfitCap hrun diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMemcpy.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMemcpy.lean index 044cd8981..1a60c676f 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMemcpy.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMemcpy.lean @@ -53,7 +53,7 @@ open LibsignalBinary.Proofs.TripleRatchet.Wire.NewPureBudget (framelessMemcpyBud open CryptoVerification.SignalSession ( CliHooks cliElfBytes cliExternsPlaced libsignalSessionLib lsRustNoAllocShimSymCli ) -open CryptoVerification.SignalSession.Cli.RunGlue (IsFsC cliGhostExterns) +open CryptoVerification.SignalSession.Cli.RunGlue (IsFsC) open CryptoVerification.SignalSession.CliExt (memcpyROSpec memcpySpec) open LibsignalBinary.Heap (OomPreserved PoolPreserved VmPreserved allocMemcpyVmSpec) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) @@ -81,6 +81,9 @@ open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhostK ( open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetLrTrapRet ( Blk21TrapHook blk21TrapHook_of_exception_on_keepLr ) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs ( + cliGhostExternsWithExtra +) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyCode ( mallocngBlockProg20_externAt_none mallocngBlockProg20_hasWords masterMemcpySpec memcpySpecK @@ -1647,26 +1650,27 @@ private theorem f3EmptyMemsetGhostHookNarrow_blk20TrapHook (mmpl : MultiPlacemen LibsignalBinary.Proofs.SignalSession.Cli.AllocGhostLinkTransfer.linkedCallHook simp [hAct] -/-- **Concrete `(A2)` mixed-pass `Blk20TrapHook` theorem for all 7 K-narrowed F3 ghosts in +/-- **Concrete `(A2)` mixed-pass `Blk20TrapHook` theorem for all 9 non-shim F3 ghosts in `h2k_ghFixedK`:** - Every non-shim ghost hook `f` in `cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none)` + Every non-shim named ghost hook `f` in + `cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none)` satisfies `∀ L, keepMemcpyBlk20 mmpl L = true → Blk20TrapHook L f`. -/ theorem h2k_ghFixedK_blk20TrapHook [LibsignalPlacement] (mpl : MultiPlacement) {mmpl : MultiPlacement} (hMm : mallocngLib.LinkedAt cliElfBytes mmpl) {sym : String} {f : State → State} - (hext : cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f) + (hext : cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) sym = some f) (hnoShim : sym ≠ lsRustNoAllocShimSymCli) : ∀ L : BitVec 64, keepMemcpyBlk20 mmpl L = true → Blk20TrapHook L f := by intro L hL by_cases hmc : sym = CryptoVerification.SignalSession.lsMemcpySym · subst hmc have hsome : - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) CryptoVerification.SignalSession.lsMemcpySym = some (LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness.f3EmptyMemcpyGhostHookNarrow - mmpl) := by - simp (config := { decide := true }) only [cliGhostExterns, h2k_ghFixedK, ↓reduceIte] + mmpl) := + rfl rw [hsome] at hext injection hext with hfeq subst hfeq @@ -1677,11 +1681,11 @@ theorem h2k_ghFixedK_blk20TrapHook [LibsignalPlacement] · by_cases hms : sym = CryptoVerification.SignalSession.lsMemsetSym · subst hms have hsome : - cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) + cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) CryptoVerification.SignalSession.lsMemsetSym = some (LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness.f3EmptyMemsetGhostHookNarrow - mmpl) := by - simp (config := { decide := true }) only [cliGhostExterns, h2k_ghFixedK, ↓reduceIte] + mmpl) := + rfl rw [hsome] at hext injection hext with hfeq subst hfeq diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMemset.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMemset.lean index c7e02e127..f55682424 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMemset.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KMemset.lean @@ -126,6 +126,9 @@ open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetLrTrapRet ( Blk21TrapHook blk21TrapHook_memsetGhostHook blk21TrapHook_of_exception_on_keepLr blk21_lr_trap_after_hook_ret ) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs ( + ExtraGhostTable cliExtraGhostSyms cliGhostExternsWithExtra +) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhostK ( activeF3CallPre_const_iff emptyStdProg f3EmptyMemsetGhostHook f3EmptyMemsetGhostHookK f3EmptyMemsetGhostHook_any_memsetSpecK_ok @@ -1301,19 +1304,20 @@ private theorem c3e5_f3EmptyMemcpyGhostHookNarrow_blk21TrapHook /-- **Concrete `(A2)` mixed-pass `Blk21TrapHook` theorem for all 9 non-shim F3 ghosts in `h2k_ghFixedK`:** - Every non-shim ghost hook `f` in `cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none)` + Every non-shim named ghost hook `f` in + `cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none)` satisfies `∀ L, keepMemsetBlk21 mmpl L = true → Blk21TrapHook L f`. -/ theorem h2k_ghFixedK_blk21TrapHook [LibsignalPlacement] (mpl : MultiPlacement) {mmpl : MultiPlacement} (hMm : mallocngLib.LinkedAt cliElfBytes mmpl) {sym : String} {f : State → State} - (hext : cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) sym = some f) + (hext : cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) sym = some f) (hnoShim : sym ≠ lsRustNoAllocShimSymCli) : ∀ L : BitVec 64, keepMemsetBlk21 mmpl L = true → Blk21TrapHook L f := by intro L hL by_cases hms : sym = CryptoVerification.SignalSession.lsMemsetSym · subst hms - have heq : cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) + have heq : cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) CryptoVerification.SignalSession.lsMemsetSym = some (LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness.f3EmptyMemsetGhostHookNarrow mmpl) := rfl @@ -1323,7 +1327,7 @@ theorem h2k_ghFixedK_blk21TrapHook [LibsignalPlacement] (mallocngBlockProg mmpl 21 Syscall.standard) (mmpl.base 21) hL · by_cases hmc : sym = CryptoVerification.SignalSession.lsMemcpySym · subst hmc - have heq : cliGhostExterns (h2k_ghFixedK mpl mmpl) (fun _ => none) + have heq : cliGhostExternsWithExtra (h2k_ghFixedK mpl mmpl) [] (fun _ => none) CryptoVerification.SignalSession.lsMemcpySym = some (LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness.f3EmptyMemcpyGhostHookNarrow mmpl) := rfl @@ -1537,57 +1541,117 @@ theorem h2k_shimStub_not_in_blk21 {mpl mmpl : MultiPlacement} · rfl · rw [hb] at hpred; cases hpred.2 -private theorem cliGhostExterns_some_cases (g : CliGhostHooks) - (baseExt : String → Option (State → State)) {sym : String} {f : State → State} - (hext : cliGhostExterns g baseExt sym = some f) : - sym = lsRustNoAllocShimSymCli ∨ - (sym ≠ lsRustNoAllocShimSymCli ∧ cliGhostExterns g (fun _ => none) sym = some f) ∨ +private theorem mem_of_contains_true {l : List String} {s : String} + (h : l.contains s = true) : s ∈ l := by + induction l with + | nil => cases h + | cons hd tl ih => + simp only [List.contains, List.elem] at h + split at h + · rename_i heq; exact (beq_iff_eq.mp heq) ▸ List.Mem.head _ + · exact List.Mem.tail _ (ih h) + +private noncomputable def h2k_extraDisjointBlk21B : Bool := + cliExtraGhostSyms.all fun sym => + lsSharedExterns.any fun idx => + (lsInternedMultiLib.names.getD idx "" == sym) && + !(keepMemsetBlk21 f3MallocngMpl (f3LsSymAddrs.getD idx 0#64)) + +set_option maxRecDepth 4000000 in +private theorem h2k_extraDisjointBlk21_ok : h2k_extraDisjointBlk21B = true := by rfl_kernel + +/-- Every Cutover-2 `cliExtraGhostSyms` stub PC lies outside `keepMemsetBlk21 mmpl`. -/ +theorem h2k_extraStub_not_in_blk21 {mpl mmpl : MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hMm : mallocngLib.LinkedAt cliElfBytes mmpl) + {sym : String} (hsym : cliExtraGhostSyms.contains sym = true) : + keepMemsetBlk21 mmpl (libsignalSessionLib.resolve mpl sym) = false := by + obtain ⟨idx, hidx, hpred⟩ := + List.any_eq_true.mp (List.all_eq_true.mp h2k_extraDisjointBlk21_ok sym (mem_of_contains_true hsym)) + simp only [Bool.and_eq_true, beq_iff_eq] at hpred + rw [keepMemsetBlk21_eq_f3 hMm, ← hpred.1, resolve_idx_of_linkedAt hLs hidx] + cases hb : keepMemsetBlk21 f3MallocngMpl (f3LsSymAddrs.getD idx 0#64) + · rfl + · rw [hb] at hpred; cases hpred.2 + +private theorem cliGhostExternsWithExtra_some_cases_nil (g : CliGhostHooks) + (extra : ExtraGhostTable) (baseExt : String → Option (State → State)) + {sym : String} {f : State → State} + (hext : cliGhostExternsWithExtra g extra baseExt sym = some f) : + (cliExtraGhostSyms.contains sym = true ∧ extra.lookup sym = some f) ∨ + sym = lsRustNoAllocShimSymCli ∨ + (sym ≠ lsRustNoAllocShimSymCli ∧ + cliGhostExternsWithExtra g [] (fun _ => none) sym = some f) ∨ baseExt sym = some f := by by_cases h5 : sym = lsRustNoAllocShimSymCli - · exact Or.inl h5 - · refine Or.inr ?_ - unfold cliGhostExterns at hext ⊢ + · exact Or.inr (Or.inl h5) + · unfold cliGhostExternsWithExtra at hext ⊢ + dsimp only [List.lookup] + simp only [ite_self] by_cases h1 : sym == lsRustAllocSymCli - · simp only [h1, ↓reduceIte] at hext ⊢; exact Or.inl ⟨h5, hext⟩ + · simp only [h1, ↓reduceIte] at hext ⊢; exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · by_cases h2 : sym == lsRustDeallocSymCli - · simp only [h1, h2, Bool.false_eq_true, ↓reduceIte] at hext ⊢; exact Or.inl ⟨h5, hext⟩ + · simp only [h1, h2, Bool.false_eq_true, ↓reduceIte] at hext ⊢ + exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · by_cases h3 : sym == lsRustReallocSymCli - · simp only [h1, h2, h3, Bool.false_eq_true, ↓reduceIte] at hext ⊢; exact Or.inl ⟨h5, hext⟩ + · simp only [h1, h2, h3, Bool.false_eq_true, ↓reduceIte] at hext ⊢ + exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · by_cases h4 : sym == lsRustAllocZeroedSymCli · simp only [h1, h2, h3, h4, Bool.false_eq_true, ↓reduceIte] at hext ⊢ - exact Or.inl ⟨h5, hext⟩ + exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · have h5b : (sym == lsRustNoAllocShimSymCli) = false := beq_eq_false_iff_ne.mpr h5 simp only [h1, h2, h3, h4, h5b, Bool.false_eq_true, ↓reduceIte] at hext ⊢ by_cases h6 : sym == lsStringCloneSym · cases hsc : g.stringClone <;> simp only [h6, hsc, ↓reduceIte] at hext ⊢ - · exact Or.inr hext - · exact Or.inl ⟨h5, hext⟩ + · exact Or.inr (Or.inr (Or.inr hext)) + · exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · by_cases h7 : sym == lsReadFileSym · cases hrf : g.readFile <;> simp only [h6, h7, hrf, Bool.false_eq_true, ↓reduceIte] at hext ⊢ - · exact Or.inr hext - · exact Or.inl ⟨h5, hext⟩ + · exact Or.inr (Or.inr (Or.inr hext)) + · exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · by_cases h8 : sym == lsReadStdinSym · cases hrs : g.readStdin <;> simp only [h6, h7, h8, hrs, Bool.false_eq_true, ↓reduceIte] at hext ⊢ - · exact Or.inr hext - · exact Or.inl ⟨h5, hext⟩ + · exact Or.inr (Or.inr (Or.inr hext)) + · exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · by_cases h9 : sym == CryptoVerification.SignalSession.lsMemsetSym · cases hms : g.memset <;> simp only [h6, h7, h8, h9, hms, Bool.false_eq_true, ↓reduceIte] at hext ⊢ - · exact Or.inr hext - · exact Or.inl ⟨h5, hext⟩ + · exact Or.inr (Or.inr (Or.inr hext)) + · exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · by_cases h10 : sym == CryptoVerification.SignalSession.lsMemcpySym · cases hmc : g.memcpy <;> simp only [h6, h7, h8, h9, h10, hmc, Bool.false_eq_true, ↓reduceIte] at hext ⊢ - · exact Or.inr hext - · exact Or.inl ⟨h5, hext⟩ + · exact Or.inr (Or.inr (Or.inr hext)) + · exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · simp only [h6, h7, h8, h9, h10, Bool.false_eq_true, ↓reduceIte] at hext - exact Or.inr hext + cases hex : cliExtraGhostSyms.contains sym + · simp only [hex, Bool.false_eq_true, ↓reduceIte] at hext + exact Or.inr (Or.inr (Or.inr hext)) + · simp only [hex, ↓reduceIte] at hext + cases hlk : extra.lookup sym with + | some f' => + rw [hlk] at hext; injection hext with hfeq; subst hfeq + exact Or.inl ⟨rfl, rfl⟩ + | none => + rw [hlk] at hext + exact Or.inr (Or.inr (Or.inr hext)) + +private theorem cliGhostExterns_some_cases (g : CliGhostHooks) + (baseExt : String → Option (State → State)) {sym : String} {f : State → State} + (hext : cliGhostExterns g baseExt sym = some f) : + (cliExtraGhostSyms.contains sym = true ∧ g.extra.lookup sym = some f) ∨ + sym = lsRustNoAllocShimSymCli ∨ + (sym ≠ lsRustNoAllocShimSymCli ∧ + cliGhostExternsWithExtra g [] (fun _ => none) sym = some f) ∨ + baseExt sym = some f := + cliGhostExternsWithExtra_some_cases_nil g g.extra baseExt hext /-- **Compositional ghost-side `hblk21_ext` (`rev_c6` F3):** combines `h2k_ghFixedK_blk21TrapHook` - (7 K ghosts), `h2k_memsetGhostHookNarrow_blk21TrapHook` (`memset`), `h2k_shimStub_not_in_blk21` - (`shim`), and `h2sl_realW_noExtern_keepSub` on any base map `baseExt ⊆ cliExternsPlaced mmpl`. -/ + (9 non-shim named ghosts), `h2k_memsetGhostHookNarrow_blk21TrapHook` (`memset`), + `h2k_shimStub_not_in_blk21` (`shim`), `h2k_extraStub_not_in_blk21` (`cliExtraGhostSyms`), and + `h2sl_realW_noExtern_keepSub` on any base map `baseExt ⊆ cliExternsPlaced mmpl`. -/ theorem h2k_cliGhostExterns_ghFixedK_blk21_ext [LibsignalPlacement] {mpl mmpl : MultiPlacement} (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) @@ -1620,7 +1684,9 @@ theorem h2k_cliGhostExterns_ghFixedK_blk21_ext [LibsignalPlacement] exact h2k_memsetGhostHookNarrow_blk21TrapHook mmpl · simp only [hms, Bool.false_eq_true, ↓reduceIte] at hsym_ite rcases cliGhostExterns_some_cases (h2k_ghFixedK mpl mmpl) (baseExt W) hsym_ite with - rfl | ⟨hne, hgh⟩ | hbase + ⟨hex, _⟩ | rfl | ⟨hne, hgh⟩ | hbase + · exfalso; have hns := h2k_extraStub_not_in_blk21 hLs hMm hex + rw [hres, hpc] at hns; exact Bool.noConfusion hns · exfalso; have hns := h2k_shimStub_not_in_blk21 hLs hMm rw [hres, hpc] at hns; exact Bool.noConfusion hns · exact h2k_ghFixedK_blk21TrapHook mpl hMm hgh hne diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KNarrowR1.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KNarrowR1.lean index 4ea58a75e..b882a3a87 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KNarrowR1.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KNarrowR1.lean @@ -92,6 +92,9 @@ open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness ( open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowMemOpsR1 ( narrowMemcpyGhostHook narrowMemsetGhostHook ) +open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs ( + ExtraGhostTable cliExtraGhostSyms cliGhostExternsWithExtra +) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfCodeMatchesData ( f3LsSymAddrs lsInternedMultiLib lsSharedExterns ls_blockSymsMatch_ok ls_idsOk ls_names_nodup ls_sharedExterns_lt ls_toMultiPlacedLib_eq @@ -106,8 +109,8 @@ open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMemcpy ( h2k_memcpyGhostHookNarrow_blk20TrapHook h2k_memcpyGhostHookNarrow_stub_replayOn_of_trap_ret ) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMemset ( - h2k_ghFixedK_blk21TrapHook h2k_keepSub_covers_blk21 h2k_memsetGhostHookNarrow - h2k_shimStub_not_in_blk21 + h2k_extraStub_not_in_blk21 h2k_ghFixedK_blk21TrapHook h2k_keepSub_covers_blk21 + h2k_memsetGhostHookNarrow h2k_shimStub_not_in_blk21 ) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2StepsLiftR2 ( h2sl_realW_noExtern_keepSub @@ -423,53 +426,112 @@ theorem h2k_memsetStub_not_in_blk20 {mpl mmpl : MultiPlacement} · rfl · rw [hb] at hpred; cases hpred.2 -private theorem cliGhostExterns_some_cases (g : CliGhostHooks) - (baseExt : String → Option (State → State)) {sym : String} {f : State → State} - (hext : cliGhostExterns g baseExt sym = some f) : - sym = lsRustNoAllocShimSymCli ∨ - (sym ≠ lsRustNoAllocShimSymCli ∧ cliGhostExterns g (fun _ => none) sym = some f) ∨ +private theorem mem_of_contains_true {l : List String} {s : String} + (h : l.contains s = true) : s ∈ l := by + induction l with + | nil => cases h + | cons hd tl ih => + simp only [List.contains, List.elem] at h + split at h + · rename_i heq; exact (beq_iff_eq.mp heq) ▸ List.Mem.head _ + · exact List.Mem.tail _ (ih h) + +private noncomputable def h2k_extraDisjointBlk20B : Bool := + cliExtraGhostSyms.all fun sym => + lsSharedExterns.any fun idx => + (lsInternedMultiLib.names.getD idx "" == sym) && + !(keepMemcpyBlk20 f3MallocngMpl (f3LsSymAddrs.getD idx 0#64)) + +set_option maxRecDepth 4000000 in +private theorem h2k_extraDisjointBlk20_ok : h2k_extraDisjointBlk20B = true := by rfl_kernel + +/-- Every Cutover-2 `cliExtraGhostSyms` stub PC lies outside `keepMemcpyBlk20 mmpl`. -/ +theorem h2k_extraStub_not_in_blk20 {mpl mmpl : MultiPlacement} + (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) + (hMm : mallocngLib.LinkedAt cliElfBytes mmpl) + {sym : String} (hsym : cliExtraGhostSyms.contains sym = true) : + keepMemcpyBlk20 mmpl (libsignalSessionLib.resolve mpl sym) = false := by + obtain ⟨idx, hidx, hpred⟩ := + List.any_eq_true.mp (List.all_eq_true.mp h2k_extraDisjointBlk20_ok sym (mem_of_contains_true hsym)) + simp only [Bool.and_eq_true, beq_iff_eq] at hpred + rw [keepMemcpyBlk20_eq_f3 hMm, ← hpred.1, resolve_idx_of_linkedAt hLs hidx] + cases hb : keepMemcpyBlk20 f3MallocngMpl (f3LsSymAddrs.getD idx 0#64) + · rfl + · rw [hb] at hpred; cases hpred.2 + +private theorem cliGhostExternsWithExtra_some_cases_nil (g : CliGhostHooks) + (extra : ExtraGhostTable) (baseExt : String → Option (State → State)) + {sym : String} {f : State → State} + (hext : cliGhostExternsWithExtra g extra baseExt sym = some f) : + (cliExtraGhostSyms.contains sym = true ∧ extra.lookup sym = some f) ∨ + sym = lsRustNoAllocShimSymCli ∨ + (sym ≠ lsRustNoAllocShimSymCli ∧ + cliGhostExternsWithExtra g [] (fun _ => none) sym = some f) ∨ baseExt sym = some f := by by_cases h5 : sym = lsRustNoAllocShimSymCli - · exact Or.inl h5 - · refine Or.inr ?_ - unfold cliGhostExterns at hext ⊢ + · exact Or.inr (Or.inl h5) + · unfold cliGhostExternsWithExtra at hext ⊢ + dsimp only [List.lookup] + simp only [ite_self] by_cases h1 : sym == lsRustAllocSymCli - · simp only [h1, ↓reduceIte] at hext ⊢; exact Or.inl ⟨h5, hext⟩ + · simp only [h1, ↓reduceIte] at hext ⊢; exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · by_cases h2 : sym == lsRustDeallocSymCli - · simp only [h1, h2, Bool.false_eq_true, ↓reduceIte] at hext ⊢; exact Or.inl ⟨h5, hext⟩ + · simp only [h1, h2, Bool.false_eq_true, ↓reduceIte] at hext ⊢ + exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · by_cases h3 : sym == lsRustReallocSymCli - · simp only [h1, h2, h3, Bool.false_eq_true, ↓reduceIte] at hext ⊢; exact Or.inl ⟨h5, hext⟩ + · simp only [h1, h2, h3, Bool.false_eq_true, ↓reduceIte] at hext ⊢ + exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · by_cases h4 : sym == lsRustAllocZeroedSymCli · simp only [h1, h2, h3, h4, Bool.false_eq_true, ↓reduceIte] at hext ⊢ - exact Or.inl ⟨h5, hext⟩ + exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · have h5b : (sym == lsRustNoAllocShimSymCli) = false := beq_eq_false_iff_ne.mpr h5 simp only [h1, h2, h3, h4, h5b, Bool.false_eq_true, ↓reduceIte] at hext ⊢ by_cases h6 : sym == lsStringCloneSym · cases hsc : g.stringClone <;> simp only [h6, hsc, ↓reduceIte] at hext ⊢ - · exact Or.inr hext - · exact Or.inl ⟨h5, hext⟩ + · exact Or.inr (Or.inr (Or.inr hext)) + · exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · by_cases h7 : sym == lsReadFileSym · cases hrf : g.readFile <;> simp only [h6, h7, hrf, Bool.false_eq_true, ↓reduceIte] at hext ⊢ - · exact Or.inr hext - · exact Or.inl ⟨h5, hext⟩ + · exact Or.inr (Or.inr (Or.inr hext)) + · exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · by_cases h8 : sym == lsReadStdinSym · cases hrs : g.readStdin <;> simp only [h6, h7, h8, hrs, Bool.false_eq_true, ↓reduceIte] at hext ⊢ - · exact Or.inr hext - · exact Or.inl ⟨h5, hext⟩ + · exact Or.inr (Or.inr (Or.inr hext)) + · exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · by_cases h9 : sym == lsMemsetSym · cases hms : g.memset <;> simp only [h6, h7, h8, h9, hms, Bool.false_eq_true, ↓reduceIte] at hext ⊢ - · exact Or.inr hext - · exact Or.inl ⟨h5, hext⟩ + · exact Or.inr (Or.inr (Or.inr hext)) + · exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · by_cases h10 : sym == lsMemcpySym · cases hmc : g.memcpy <;> simp only [h6, h7, h8, h9, h10, hmc, Bool.false_eq_true, ↓reduceIte] at hext ⊢ - · exact Or.inr hext - · exact Or.inl ⟨h5, hext⟩ + · exact Or.inr (Or.inr (Or.inr hext)) + · exact Or.inr (Or.inr (Or.inl ⟨h5, hext⟩)) · simp only [h6, h7, h8, h9, h10, Bool.false_eq_true, ↓reduceIte] at hext - exact Or.inr hext + cases hex : cliExtraGhostSyms.contains sym + · simp only [hex, Bool.false_eq_true, ↓reduceIte] at hext + exact Or.inr (Or.inr (Or.inr hext)) + · simp only [hex, ↓reduceIte] at hext + cases hlk : extra.lookup sym with + | some f' => + rw [hlk] at hext; injection hext with hfeq; subst hfeq + exact Or.inl ⟨rfl, rfl⟩ + | none => + rw [hlk] at hext + exact Or.inr (Or.inr (Or.inr hext)) + +private theorem cliGhostExterns_some_cases (g : CliGhostHooks) + (baseExt : String → Option (State → State)) {sym : String} {f : State → State} + (hext : cliGhostExterns g baseExt sym = some f) : + (cliExtraGhostSyms.contains sym = true ∧ g.extra.lookup sym = some f) ∨ + sym = lsRustNoAllocShimSymCli ∨ + (sym ≠ lsRustNoAllocShimSymCli ∧ + cliGhostExternsWithExtra g [] (fun _ => none) sym = some f) ∨ + baseExt sym = some f := + cliGhostExternsWithExtra_some_cases_nil g g.extra baseExt hext /-- **Closed `P_ghost` `blk21` trap-or-`none` discharger for `h2k_ghFixedK` (`R2-T1`):** for every `pc` with `keepMemsetBlk21 mmpl pc = true`, the Block-617 ghost program @@ -504,7 +566,9 @@ theorem h2k_ghFixedK_blk21_ext_trap [LibsignalPlacement] rw [hres_eq] at hsym_ite; simp only [↓reduceIte] at hsym_ite have hres : libsignalSessionLib.resolve mpl sym = pc := beq_iff_eq.mp hres_eq rcases cliGhostExterns_some_cases (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W) hsym_ite with - rfl | ⟨hne, hgh⟩ | hbase + ⟨hex, _⟩ | rfl | ⟨hne, hgh⟩ | hbase + · exfalso; have hns := h2k_extraStub_not_in_blk21 hLs hMm hex + rw [hres, hpc] at hns; exact Bool.noConfusion hns · exfalso; have hns := h2k_shimStub_not_in_blk21 hLs hMm rw [hres, hpc] at hns; exact Bool.noConfusion hns · exact h2k_ghFixedK_blk21TrapHook mpl hMm hgh hne @@ -548,7 +612,9 @@ theorem h2k_ghFixedK_blk20_ext_trap [LibsignalPlacement] rw [hres_eq] at hsym_ite; simp only [↓reduceIte] at hsym_ite have hres : libsignalSessionLib.resolve mpl sym = pc := beq_iff_eq.mp hres_eq rcases cliGhostExterns_some_cases (h2k_ghFixedK mpl mmpl) (cliExternsPlaced mmpl W) hsym_ite with - rfl | ⟨hne, hgh⟩ | hbase + ⟨hex, _⟩ | rfl | ⟨hne, hgh⟩ | hbase + · exfalso; have hns := h2k_extraStub_not_in_blk20 hLs hMm hex + rw [hres, hpc] at hns; exact Bool.noConfusion hns · exfalso; have hns := h2k_shimStub_not_in_blk20 hLs hMm rw [hres, hpc] at hns; exact Bool.noConfusion hns · exact h2k_ghFixedK_blk20TrapHook mpl hMm hgh hne @@ -560,8 +626,9 @@ theorem h2k_ghFixedK_blk20_ext_trap [LibsignalPlacement] rw [hres_eq, hbase] at hcell; cases hcell /-- **Compositional ghost-side `hblk20_ext` on 39-row `cliElfBytes`:** combines - `h2k_ghFixedK_blk20TrapHook` (7 K ghosts), `h2k_memcpyGhostHookNarrow_blk20TrapHook` + `h2k_ghFixedK_blk20TrapHook` (9 non-shim named ghosts), `h2k_memcpyGhostHookNarrow_blk20TrapHook` (`"memcpy"`), `h2k_memsetStub_not_in_blk20` (`"memset"`), `h2k_shimStub_not_in_blk20` (`shim`), + `h2k_extraStub_not_in_blk20` (`cliExtraGhostSyms`), and `h2sl_realW_noExtern_keepSub` on any base map `baseExt ⊆ cliExternsPlaced mmpl` (proof shape intended to carry over to 37-row stock-lld where `resolve mpl "memcpy" = mmpl.base 20`; re-proved at re-key). -/ @@ -605,7 +672,9 @@ theorem h2k_cliGhostExterns_ghFixedK_blk20_ext [LibsignalPlacement] rw [hres, hpc] at hns; exact Bool.noConfusion hns · simp only [hms, Bool.false_eq_true, ↓reduceIte] at hsym_ite rcases cliGhostExterns_some_cases (h2k_ghFixedK mpl mmpl) (baseExt W) hsym_ite with - rfl | ⟨hne, hgh⟩ | hbase + ⟨hex, _⟩ | rfl | ⟨hne, hgh⟩ | hbase + · exfalso; have hns := h2k_extraStub_not_in_blk20 hLs hMm hex + rw [hres, hpc] at hns; exact Bool.noConfusion hns · exfalso; have hns := h2k_shimStub_not_in_blk20 hLs hMm rw [hres, hpc] at hns; exact Bool.noConfusion hns · exact h2k_ghFixedK_blk20TrapHook mpl hMm hgh hne diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot463.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot463.lean index c339961b3..0b938e82f 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot463.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot463.lean @@ -53,6 +53,7 @@ public import LibsignalBinary.Proofs.SpqrV1.Top.InitialState.DefsPlacedBudget public import LibsignalBinary.Proofs.TripleRatchet.Record.DefsBudget public meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.Common.SharedHelpers +import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.KeepsFs import LibsignalBinary.Proofs.SignalSession.Cli.Run.Glue.BcmpHookPlaced import LibsignalBinary.Proofs.SpqrV1.States.Recv.TopPlacedBudgetSat @@ -94,18 +95,16 @@ open CryptoVerification.LibsignalTripleRatchet (SendCall extHookStack) open CryptoVerification.LibsignalTripleRatchetRepr (signalMessageAt uuidTryParse) open CryptoVerification.RustHeap (vecU8) open CryptoVerification.SignalSession ( - CliHooks cliBcmpHook cliElfBytes cliElfImage cliExternsPlaced libsignalSessionLib lsReadFileSym + CliHooks cliElfBytes cliElfImage cliExternsPlaced libsignalSessionLib lsReadFileSym ) -open CryptoVerification.SignalSession.Cli (PathGhost StoresGhost cliBcmpSpec) +open CryptoVerification.SignalSession.Cli (PathGhost StoresGhost) open CryptoVerification.SignalSession.Cli.MainHops (cliIo cliRunBudgets cliRunNeeds cliWrOk) open CryptoVerification.SignalSession.Cli.Placed (blkPl_589 lsProg_589) open CryptoVerification.SignalSession.Cli.Run.Placed (lsProg_579) open CryptoVerification.SignalSession.Cli.RunCompose ( DecSigGhost RunSem idVtPlaced mkSlot sessVtPlaced withCodeOk ) -open CryptoVerification.SignalSession.Cli.RunGlue ( - CliGhostHooks cliExternsPlaced_bcmp cliGhostExterns cliGhostExterns_bcmp -) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) open CryptoVerification.SignalSession.Cli.RunProofs (cliDecryptPrekeyNeed cliDecryptSignalNeed) open CryptoVerification.SignalSession.Cli.RunProofs.DecryptLemmas (toDecryptGhost) open CryptoVerification.SignalSession.Cli.RunSkeleton (RunBudgets pathNeed) @@ -116,7 +115,7 @@ open CryptoVerification.SpqrV1.ChainProofs (bytesAt) open CryptoVerification.SpqrV1.Top.InitialState (InitialStateGhost) open LibsignalBinary.Heap (AllocCostModel AllocEvent BudgetLimits FitsEnv RustCliAllocBudget SeqEnv) open LibsignalBinary.Heap.Fine (fineCostModel fineHookRustCliAllocBudget) -open LibsignalBinary.Heap.SpecBudget (FmtWriteEnv FormatInnerEnv aesDecBudgetSpec withVmPreserved) +open LibsignalBinary.Heap.SpecBudget (FmtWriteEnv FormatInnerEnv aesDecBudgetSpec) open LibsignalBinary.Proofs.PeakBudget.CliFitsTraceArith (cliBudgetLimits) open LibsignalBinary.Proofs.PeakBudget.RealCliRunEnvMemFixed ( decBinaryIdKitPlacedBudgetFixed decBinarySessKitPlacedBudgetFixed @@ -165,7 +164,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Ratchet.DecryptSignalPl ) open LibsignalBinary.Proofs.SignalSession.Cli.Run.SkeletonPlacedBudget (RunHooksPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( - CliGhostAllocHooks CliGhostSpqrAllocHooks cliExternsPlaced_bcmp_budget_sat + CliGhostAllocHooks CliGhostSpqrAllocHooks ) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget ( AllocContractsFsPlaced dirGetSpecPlaced pathSpecPlaced @@ -252,12 +251,6 @@ theorem h2k463_dirGet_withFds_ok [LibsignalPlacement] (RunBudgets.dirGetNeed ⟨cliRunBudgets.readFile⟩)) := by let H := cliGhostExterns gh (cliExternsPlaced mmpl W) have hsh := SessKitHooksPlaced.of_runHooks hhWithFds - have hbcmp : HookSat H "bcmp" (withVmPreserved cliBcmpSpec).keepsFs := by - obtain ⟨f, hf_eq, hf_ok⟩ := cliExternsPlaced_bcmp_budget_sat mmpl W - have hf : f = cliBcmpHook W.bcmp := - Option.some.inj (hf_eq.symm.trans (cliExternsPlaced_bcmp mmpl W)) - subst hf - exact ⟨cliBcmpHook W.bcmp, cliGhostExterns_bcmp mmpl gh W, hf_ok.keepsFs (fun _ => rfl)⟩ have hPathPool : subroutine_ok (lsProg_589 H) (lsmpl.base 596) (pathSpecPlaced (withFds A) lim PathEnv pathNeed) := hsh.path (callerProg := lsProg_589 H) (i := 589) (Nat.le_refl pathNeed) (by decide) @@ -274,7 +267,7 @@ theorem h2k463_dirGet_withFds_ok [LibsignalPlacement] (RunBudgets.dirGetNeed ⟨cliRunBudgets.readFile⟩))) := dirGet_placed_ok_of_h2k_fd (pathProg := lsProg_589 H) (jPath := 589) - (fun _ hp => hp.2) hAllocFs hbcmp (by decide) (by decide) + (fun _ hp => hp.2) hAllocFs hhWithFds.bcmp (by decide) (by decide) hPathFd hReadSatFd hlr (hhWithFds.fs (lsProg_589 H) 589) (Nat.le_refl (RunBudgets.dirGetNeed ⟨cliRunBudgets.readFile⟩)) (fun _ _ _ _ h => h) @@ -611,7 +604,8 @@ open CryptoVerification.SignalSession (cliHookTablePlaced lsReadStdinSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli lsStringCloneSym) open CryptoVerification.SignalSession.Cli.RunGlue - (cliExternsPlaced_row cliGhostExterns_other hookSat_of_eq withPanics_cliGhostExterns) + (cliExternsPlaced_row cliExtraGhostSyms cliGhostExterns_other hookSat_of_eq + withPanics_cliGhostExterns) open CryptoVerification.SignalSession.Cli.Slots (cliGhostExterns_sat_of_cliExternsPlaced compress256_row_placed trTrapExternsPlaced) open CryptoVerification.SpqrV1.Alloc (growOneStack) @@ -630,6 +624,7 @@ open CryptoVerification.SpqrV1Sync.SendTotal (BOkTight isEkSide st_bCodec st_bRecvCt_tight st_bRecvEk_tight st_bSize_tight) open CryptoVerification.SpqrV1Sync.TopSync (topPb) open LibsignalBinary.Heap.SpecBudget (libcruxHmacBudgetSpec) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open LibsignalBinary.Proofs.PeakBudget.DecPkD2cSlotOkLinkedAux (spqrRecvPlacedInnerSpecXTOfEnv_of_placedSpecXT) open LibsignalBinary.Proofs.PeakBudget.SpqrBoundedCredit (StatesIntoPbTightEnv) @@ -714,9 +709,11 @@ private theorem h2k463_cliGhost_row_aux (mmpl : MultiPlacement) (g : CliGhostHoo (h5 : sym ≠ lsRustNoAllocShimSymCli := by decide) (h6 : sym ≠ lsStringCloneSym := by decide) (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : cliExtraGhostSyms.contains sym = false ∨ g.extra.lookup sym = none := by + left; decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 hExtra).trans (cliExternsPlaced_row mmpl W hrow) private def h2k463_FromPbStateGuard (F : ShaCompress) (pb : V1State) : Prop := @@ -913,14 +910,16 @@ private theorem h2k463_spqrRecv_topStateGuarded_seam_of_contracts [LibsignalPlac private theorem h2k463_hookSat_withAllocVmPreserved_memmove_of_zero {H : String → Option (State → State)} {sym : String} (hookStack : Nat) - (h : HookSat H sym (withAllocVmPreserved (sessionMemmoveSpec 0))) : - HookSat H sym (withAllocVmPreserved (sessionMemmoveSpec hookStack)) := by + (h : HookSat H sym (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) : + HookSat H sym (withAllocVmPreserved (sessionMemmoveBoundedSpec hookStack)) := by refine ProofLib.HookSat.mono h fun ⟨base, buf, dst, src, len⟩ R s0 hpre => ⟨(base, buf, dst, src, len), stackAt s0.sp hookStack ∗ R, ?_, fun sf hpost => ?_⟩ - · dsimp only [withAllocVmPreserved, sessionMemmoveSpec, libcMemmoveSpec, stackAt] at hpre ⊢ + · dsimp only [withAllocVmPreserved, sessionMemmoveBoundedSpec, sessionMemmoveSpec, + libcMemmoveSpec, stackAt] at hpre ⊢ simp only [ProofLib.memRegion_zero, sepConj_emp] ac_nf at hpre ⊢ - · dsimp only [withAllocVmPreserved, sessionMemmoveSpec, stackAt] at hpost ⊢ + · dsimp only [withAllocVmPreserved, sessionMemmoveBoundedSpec, sessionMemmoveSpec, + stackAt] at hpost ⊢ simp only [ProofLib.memRegion_zero, sepConj_emp] at hpost ac_nf at hpost ⊢ @@ -953,7 +952,7 @@ private theorem h2k463_statesRecv_recv_exactTight_ok [LibsignalPlacement] (cliRecvCt2PlacedAllocExt mmpl gh W hA hExt) (h2k463_hookSat_withAllocVmPreserved_memmove_of_zero growOneStack (hookSat_of_eq (hExt_wp _ (by decide)) - (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W))) + (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W hA.extraOk))) hmemset_wp (hookSat_of_eq (hExt_wp _ (by decide)) (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot464.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot464.lean index 5f1b042de..aefedfd43 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot464.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot464.lean @@ -58,26 +58,22 @@ open CryptoVerification.LibsignalPublicApi.StoreKit (FsFiles ls_subroutine_ok_rocl_of_block subroutine_ok_withLsCodeRoLoaded_of_rocl) open CryptoVerification.LibsignalTripleRatchetRepr (AddrGhost) open CryptoVerification.SignalSession - (CliHooks cliBcmpHook cliElfBytes cliElfImage cliExternsPlaced libsignalSessionLib lsAesEncSym + (CliHooks cliElfBytes cliElfImage cliExternsPlaced libsignalSessionLib lsAesEncSym lsReadFileSym lsStringCloneSym) -open CryptoVerification.SignalSession.Cli (cliBcmpSpec) -open CryptoVerification.SignalSession.Cli.KitInst (cliGhostExterns_blackBox) +open CryptoVerification.SignalSession.Cli.KitInst (cliGhostExterns_blackBox_sat) open CryptoVerification.SignalSession.Cli.MainHops (cliIo cliRunBudgets cliRunNeeds cliWrOk) open CryptoVerification.SignalSession.Cli.Placed (blkPl_589 lsProg_569 lsProg_589) open CryptoVerification.SignalSession.Cli.Run.Placed (lsProg_579) open CryptoVerification.SignalSession.Cli.RunCompose (mkSlot) -open CryptoVerification.SignalSession.Cli.RunGlue - (CliGhostHooks cliExternsPlaced_bcmp cliGhostExterns cliGhostExterns_other) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliGhostExterns) open CryptoVerification.SignalSession.Cli.RunProofs (cliDecryptPrekeyNeed) open CryptoVerification.SignalSession.Cli.RunSkeleton (RunBudgets pathNeed) -open CryptoVerification.SignalSession.Cli.Slots - (cliGhostExterns_sat_of_cliExternsPlaced scopeKit) +open CryptoVerification.SignalSession.Cli.Slots (scopeKit) open CryptoVerification.SpqrV1.Top.DecodeState (canonicalV1InnerHeap) open CryptoVerification.SpqrV1.Unchunked (spqrLibcruxHmacSym) open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget) open LibsignalBinary.Heap.Fine (fineCostModel fineHookRustCliAllocBudget) -open LibsignalBinary.Heap.SpecBudget - (aesEncBudgetSpec libcruxHmacBudgetSpec withVmPreserved) +open LibsignalBinary.Heap.SpecBudget (aesEncBudgetSpec libcruxHmacBudgetSpec) open LibsignalBinary.Proofs.PeakBudget.CliFitsTraceArith (cliBudgetLimits) open LibsignalBinary.Proofs.PeakBudget.RealCliDecPkSlotOk (cliRunHooksPlaced_of_ghost) open LibsignalBinary.Proofs.PeakBudget.RealCliRunEnvMemFixed @@ -98,12 +94,12 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Compose.SemPlacedBudget (encSl open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Ratchet.EncryptLemmas.SlotOfInnerPlacedBudget (w1IdKitPlaced w1SessKitPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Ratchet.EncryptSlotWithFds - (subroutine_ok_encSlot_withFdsGe3Closed_of_withFds w1BinaryIdKitPlaced_withFds_okIE + (subroutine_ok_encSlot_withFdsGe3Closed_of_withFds w1BinaryIdKitPlaced_withFds_okIE_sat w1BinarySessKitPlaced_withFds_okSE) open LibsignalBinary.Proofs.SignalSession.Cli.Run.SkeletonPlacedBudget (RunHooksPlaced path_placed_ok) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (CliGhostAllocHooks CliGhostSpqrAllocHooks cliExternsPlaced_bcmp_budget_sat) + (CliGhostAllocHooks CliGhostSpqrAllocHooks) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (dirGetSpecPlaced pathSpecPlaced sessDeserializeSpecPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.Store.LoadPollRecordDeser @@ -145,27 +141,7 @@ open LibsignalBinary.Proofs.SpqrV1.Top.DecodeState.DecodeStateSubMergesCountedR open LibsignalBinary.Proofs.SpqrV1.Top.DecodeState.E2aTightDecodeStatePlacedBudget (e2a_decodeState_cl_placed_ok_of_v1Merge_109) -/-! ## `bcmp` `.keepsFs` and `ghFixed`-Parametric Slot-`464` Producer -/ - -/-- `cliGhostExterns gh (cliExternsPlaced mmpl W)` satisfies `(withVmPreserved cliBcmpSpec).keepsFs` -at `"bcmp"` (`cliBcmpName`), since `cliBcmpHook` leaves `.fs` unchanged. -/ -theorem cliGhostExterns_bcmp_keepsFs_sat - (mmpl : MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : - HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) "bcmp" - (withVmPreserved cliBcmpSpec).keepsFs := by - have hsat := - cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W - (cliExternsPlaced_bcmp_budget_sat mmpl W) - rcases hsat with ⟨fn, hfn, hok⟩ - have hlookup : - cliGhostExterns gh (cliExternsPlaced mmpl W) "bcmp" = some (cliBcmpHook W.bcmp) := by - rw [cliGhostExterns_other gh (cliExternsPlaced mmpl W) - (by decide) (by decide) (by decide) (by decide) (by decide) (by decide)] - exact cliExternsPlaced_bcmp mmpl W - rw [hlookup] at hfn - injection hfn with hfn_eq - subst hfn_eq - exact ⟨cliBcmpHook W.bcmp, hlookup, hok.keepsFs (fun _ => rfl)⟩ +/-! ## `ghFixed`-Parametric Slot-`464` Producer -/ /-- `ghFixed`-parametric producer for `h2ki_EncryptSlot464OkAtPreFd` via `AllocWithFds.withFds` and `dirGet_placed_ok_of_h2k_fd` on Block `589`. -/ @@ -229,7 +205,7 @@ theorem h2k_encryptSlot464OkAtPreFd_of_gh (pathProg := lsProg_589 H) (jPath := 589) (fun _ hp => hp.2) hh.allocFs - (cliGhostExterns_bcmp_keepsFs_sat mmpl ghFixed W) + hh.bcmp (by decide) (by decide) hPathFd hReadSat @@ -264,8 +240,8 @@ theorem h2k_encryptSlot464OkAtPreFd_of_gh (w1IdKitPlaced (withFds A0).repAlloc cliRunBudgets F peer) (w1BinaryIdKitPlacedBudgetFixed (withFds A0).repAlloc cliRunBudgets F peer) H := fun F peer => - w1BinaryIdKitPlaced_withFds_okIE rfl cliRunBudgets F peer h547 - hh hhWf hGet589 (cliGhostExterns_blackBox mmpl ghFixed W) + w1BinaryIdKitPlaced_withFds_okIE_sat rfl cliRunBudgets F peer h547 + hh hhWf hGet589 (cliGhostExterns_blackBox_sat mmpl ghFixed W hGWf.extraOk) have hc325 := w1t_decodeStateCalleeContractsClPlacedX_cli mmpl ghFixed W hGWf have h325Wf := e2a_decodeState_cl_placed_ok_of_v1Merge_109 (F := W.C.F) (K := W.Q.K) hc325 @@ -377,6 +353,7 @@ theorem cliGhostSpqrAllocHooks_of_h2k [LibsignalPlacement] memcpy := hK.memcpy memcpy_exact := hK.memcpy_exact memset_acp := hK.memset_acp + extraOk := hK.extraOk allocZeroed := h2kb_hookOk_of_withKeepLrFalse hK.allocZeroed (h2kb_alloc_pre_keepSub_false hlink) allocZeroed_fs := hK.allocZeroed_fs diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot464Cal.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot464Cal.lean index 63a56f5e1..64171a1eb 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot464Cal.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot464Cal.lean @@ -156,12 +156,11 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.SkeletonPlacedBudget (RunHooks open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget (CliGhostAllocHooks CliGhostSpqrAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_compress256Multi_budget_sat - cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_durationSinceBounded_budget_sat - cliExternsPlaced_exactMemcpy_sat + cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_exactMemcpy_sat cliExternsPlaced_framelessMemcpy_budget_sat cliExternsPlaced_noAllocShim_budget_sat cliExternsPlaced_realloc_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat cliExternsPlaced_shim_budget_sat - cliExternsPlaced_timeAdd_budget_sat) + cliGhostExterns_durationSinceBounded_budget_sat cliGhostExterns_timeAdd_budget_sat) open LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget (spqrSendCoinsPlacedSpecTOfEnv) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Hole3W1InnerTight (w1t_SendGuardedBytesEnv w1t_SendGuardedEnv w1t_SendTightBytesEnv @@ -424,10 +423,9 @@ private theorem publicApiEncHooks_of_ghost [LibsignalPlacement] {M : AllocCostMo realloc := cliExternsPlaced_realloc_budget_sat mmpl g W hG memcpy := cliExternsPlaced_sessionMemcpyRegion_budget_sat mmpl g W hG stringClone := hh.stringClone - timeAdd := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_timeAdd_budget_sat mmpl W) - durationSince := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_durationSinceBounded_budget_sat mmpl W) + timeAdd := cliGhostExterns_timeAdd_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk + durationSince := + cliGhostExterns_durationSinceBounded_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk handleError := cliGhostExterns_panic_handle_error mmpl g W handleAllocError := cliGhostExterns_panic_handle_alloc_error mmpl g W expectFailed := cliGhostExterns_panic_option_expect_failed mmpl g W diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot464Send.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot464Send.lean index ee0e6e16a..eda113f40 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot464Send.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot464Send.lean @@ -14,6 +14,7 @@ public meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import Arm64.Trusted.Spec.Hoare import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Proofs.Common.SharedHelpers +import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove /-! # `{A}`-Generic Block-`427` (`spqr::send::`) Guarded-Tight Seam (`ElfSlicesPqOomH2KSlot464Send`) @@ -76,6 +77,7 @@ open LibsignalBinary.Proofs.Cli.SpqrV1.Top.Send.DefsPlacedBudget open LibsignalBinary.Proofs.Cli.SpqrV1.Top.Send.SeamSpecsPlacedBudget (decodeStatePlacedSpecXOfEnv spqrSendCoinsPlacedSpecOfEnv spqrSendCoinsPlacedSpecTOfEnv statesFromPbPlacedSpecXOfEnv) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open LibsignalBinary.Proofs.PeakBudget.SpqrCodecPeakSpec (StatesFromPbTightEnv) open LibsignalBinary.Proofs.PeakBudget.SpqrTightLeafBridges (tlb_DecodeStateGuardedEnv tlb_DecodeStateTightEnv @@ -305,9 +307,9 @@ private theorem cliSpqrSend_statesFromPb_exact_on [LibsignalPlacement] memcpy := hookSat_allocMemcpyVm_of_framelessAcp hRecv.memcpy } have hmemmove0 : HookSat (Rust.withPanics H) spqrMemmoveSym - (withAllocVmPreserved (CryptoVerification.LibsignalTripleRatchet.sessionMemmoveSpec 0)) := + (withAllocVmPreserved (sessionMemmoveBoundedSpec 0)) := hookSat_of_eq (hExt_withPanics_id mmpl gh W _ (by decide)) - (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W) + (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W hA.extraOk) have hok333 := e2b_states_from_pb_ok_x_placed_exact (F := W.C.F) hFromPbHooks hmemmove0 have hok : subroutine_ok (spqrSendPlacedProg H) (lsmpl.base 333) (withLsCodeRoLoaded lsmpl diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot520Canon.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot520Canon.lean index cbe3ef560..39dd37cf8 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot520Canon.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot520Canon.lean @@ -93,6 +93,7 @@ public import LibsignalBinary.Specifications.SignalSession.CliElf public import VerifiedLibraries.Mallocng.Spec public meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.Common.SharedHelpers +import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove import LibsignalBinary.Proofs.SpqrV1.States.Recv.TopPlacedBudgetSat import LibsignalBinary.Proofs.SpqrV1Sync.Codec.PbState import LibsignalBinary.Proofs.SpqrV1Sync.SendTotal.BraidCodec @@ -120,7 +121,7 @@ open Arm64 Arm64.Obj Arm64.Process ProofLib SepProp open CryptoGames.LibsignalSession (SessionState ShaCompress SignalMessage) open CryptoGames.LibsignalSessionApi (SessionRecord) open CryptoVerification (IsLsBlockProg LibsignalFullPlacement LibsignalHooks LibsignalPlacement - libsignalMutatedBlocks libsignalSessionExterns lsBlackBoxU8Sym lsProg_51 ls_blockPlacement_base + libsignalMutatedBlocks libsignalSessionExterns lsProg_51 ls_blockPlacement_base lsmpl withLsCl withLsCodeLoaded) open CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Kits (stageP1ProgPlaced) open CryptoVerification.Cli.E2E.Pqxdh.ResponderClosure.Over (OverPrevEncOK) @@ -136,7 +137,7 @@ open CryptoVerification.LibsignalTripleRatchet.Record (CloneRel) open CryptoVerification.LibsignalTripleRatchetRepr (AddrGhost SessionGhost SignalMessageGhost) open CryptoVerification.RecordCodecs.Placed (lsProg_65 lsProg_595) open CryptoVerification.RustHeap (RustAlloc vecU8) -open CryptoVerification.SignalSession (CliHooks cliBcmpHook cliElfBytes cliElfImage cliExternsPlaced +open CryptoVerification.SignalSession (CliHooks cliElfBytes cliElfImage cliExternsPlaced cliHookTablePlaced libsignalSessionLib lsDropOffPlaced_eq lsReadFileSym lsReadStdinSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli lsStringCloneSym) @@ -150,12 +151,13 @@ open CryptoVerification.SignalSession.Cli.MainHops (cliIo cliRunBudgets cliWrOk) open CryptoVerification.SignalSession.Cli.Placed (blkPC_565 blkPl_565 blkPl_589 lsProg_553 lsProg_565 lsProg_569 lsProg_570 lsProg_571 lsProg_573 lsProg_575 lsProg_576 lsProg_578 lsProg_589 lsProg_597) open CryptoVerification.SignalSession.Cli.RunCompose (DecPkGhost) -open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliExternsPlaced_row cliGhostExterns - cliGhostExterns_bcmp cliGhostExterns_other cliGhostExterns_shim hookSat_of_eq withPanics_cliGhostExterns) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks cliExternsPlaced_row + cliExtraGhostSyms cliGhostExterns cliGhostExterns_other cliGhostExterns_shim hookSat_of_eq + withPanics_cliGhostExterns) open CryptoVerification.SignalSession.Cli.RunProofs.Poll (cliKitStk cliPollKpkKitPlaced cliPollPkKitPlaced cliPollSpkKitPlaced dpPollProgPlaced) open CryptoVerification.SignalSession.Cli.RunSkeleton (CalleeSlot RunBudgets pathNeed) -open CryptoVerification.SignalSession.Cli.Slots (blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced +open CryptoVerification.SignalSession.Cli.Slots (cliGhostExterns_sat_of_cliExternsPlaced compress256_row_placed scopeIn scopeKit trTrapExternsPlaced) open CryptoVerification.SignalSession.Cli.Store.PlacedCommon (ls_transfer_cl_to_lscro ls_transfer_lscro) open CryptoVerification.SpqrV1.Alloc (growOneStack) @@ -183,6 +185,7 @@ open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Over.StageP3PlacedBud open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Over.StageP3PlacedBudgetAux (StageP3Prev1Env) open LibsignalBinary.Proofs.CliCBudget (signedHooksPlaced_of_codecHooks signedPortDepsPlaced_ok) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open LibsignalBinary.Proofs.PeakBudget.CliDpPollTrustedWideBridgeX (dpx_deserEnv dpx_p2OverErrEnv dpx_p2OverOkEnv) open LibsignalBinary.Proofs.PeakBudget.CliFitsTraceArith (cliBudgetLimits) @@ -282,9 +285,9 @@ open LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudgetInst open LibsignalBinary.Proofs.SignalSession.Cli.Store.DropSpeWordPlacedBudget (dropSpeWord_placed_ok) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.BranchesPlacedBudget (CliIdSavePollEnv publicKeySerialize_lscro_of_cli) -open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.SymPlacedBudget (idSavePoll_placed_ok_of_deps_core) +open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdSavePoll.SymPlacedBudget (idSavePoll_placed_ok_of_deps_core_16) open LibsignalBinary.Proofs.SignalSession.Cli.Store.IdTrustPollPlacedBudget - (idTrustPoll_placed_ok_of_deps identityKey_decode_placed_ok publicKeyEq_placed_ok_of_bb) + (idTrustPoll_placed_ok_of_deps_16 identityKey_decode_placed_ok publicKeyEq_mem_placed_ok_of_bb_16_sat) open LibsignalBinary.Proofs.SignalSession.Cli.Store.KpkGetPollPlacedBudgetFd (kpkGetPoll_placed_fs_ok_of_deps_fd) open LibsignalBinary.Proofs.SignalSession.Cli.Store.KpkMarkPollPlacedBudgetFd (kpkMarkPoll_placed_ok_of_deps_fd) open LibsignalBinary.Proofs.SignalSession.Cli.Store.LoadPollRecordDeser @@ -450,13 +453,6 @@ private theorem subroutine_ok_dirGet_withFds [LibsignalPlacement] {M : AllocCost rcases hpost with ⟨hClosedF, hpostRest⟩ simpa only [withFds_pool_eq_of_fds henf hClosedF] using hpostRest -private theorem cliBcmp_keepsFs_sat (mmpl : MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) - (hBcmp : HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) cliBcmpName (withVmPreserved cliBcmpSpec)) : - HookSat (cliGhostExterns gh (cliExternsPlaced mmpl W)) cliBcmpName (withVmPreserved cliBcmpSpec).keepsFs := by - rcases hBcmp with ⟨f, hf, hok⟩ - cases Option.some.inj (hf.symm.trans (cliGhostExterns_bcmp mmpl gh W)) - exact ⟨cliBcmpHook W.bcmp, hf, hok.keepsFs fun _ => rfl⟩ - private theorem dirGet_fd_ok [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (henf : lim.enforced = true) {H : LibsignalHooks} (hLs : libsignalSessionLib.LinkedAt cliElfBytes lsmpl) (hAllocFs : AllocContractsFsPlaced A lim H) @@ -596,17 +592,16 @@ private theorem cliIdKitOkIE_of_dirGet [LibsignalPlacement] {M : AllocCostModel} (hDropNz : lsmpl.base 547 ≠ 0#64) (hh : RunHooksPlaced A lim H) (hGet : subroutine_ok (lsProg_589 H) (lsmpl.base 589) (dirGetSpecPlaced rd pathOk A lim (DirGetEnv PathEnv ReadEnv rd) (RunBudgets.dirGetNeed ⟨readStk⟩))) - (h_bb : H lsBlackBoxU8Sym = some CryptoVerification.LibsignalSession.blackBoxHook) (hs1 : trustShimNeedPlaced ≤ s1) (hs2 : trustPollNeedPlaced readStk ≤ s2) (hs3 : saveShimNeedPlaced ≤ s3) (hs4 : savePollNeedPlaced readStk ≤ s4) : IdentityStoreKitPlacedOkI A lim (cliIdentityKitSpecPlaced A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym) (cliIdentityKitDefaultBudgetEnv A.repAlloc rd F0 pathOk peer s1 s2 s3 s4 vtSym ReadEnv) H := by - have hEq := publicKeyEq_placed_ok_of_bb h_bb - have h566 := idTrustPoll_placed_ok_of_deps hh.alloc hGet (identityKey_decode_placed_ok (A := A) H) hEq hs2 + have hEq := publicKeyEq_mem_placed_ok_of_bb_16_sat hh.blackBox + have h566 := idTrustPoll_placed_ok_of_deps_16 hh.alloc hGet (identityKey_decode_placed_ok (A := A) H) hEq hs2 (by decide) (by decide) (by decide) (by decide) (by decide) (by decide) have h565 : subroutine_ok (lsProg_565 H) (lsmpl.base 565) (idSavePollSpecPlaced rd pathOk A lim (CliIdSavePollEnv rd (DirGetEnv PathEnv ReadEnv rd) DirPutStrEnv) s4) := - idSavePoll_placed_ok_of_deps_core hh.alloc + idSavePoll_placed_ok_of_deps_core_16 hh.alloc (publicKeySerialize_lscro_of_cli (callerProg := (blkPC_565).rebase (blkPl_565).base H) hh.alloc (by decide)) (ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) hGet (by decide) (by decide) (by decide)) (ls_transfer_lscro (callerProg := (blkPC_565).rebase (blkPl_565).base H) @@ -634,9 +629,6 @@ private theorem canonPollKitsPlacedOk_of_dirGet [LibsignalPlacement] {M : AllocC CanonPollKitsPlacedOk (withFds A) lim B ReadEnv DeserEnv (cliGhostExterns gh (cliExternsPlaced mmpl W)) := by let H := cliGhostExterns gh (cliExternsPlaced mmpl W) have hsh := SessKitHooksPlaced.of_runHooks hh; have hc := hh.codecHooks - have hBb : H lsBlackBoxU8Sym = some CryptoVerification.LibsignalSession.blackBoxHook := - (cliGhostExterns_other gh (cliExternsPlaced mmpl W) (by decide) (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide) (by decide)).trans (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W)) have hDec597 := subroutine_ok_decimal_fd henf (cliDecimal_placed_ok_of_sessHooks hsh) have hPut542 := subroutine_ok_dirPut_fd henf (cliDirPut_placed_ok_of_sessHooks hsh) have hDrop553 := subroutine_ok_dropSpeWord_fd henf (dropSpeWord_placed_ok hsh.alloc) @@ -655,7 +647,7 @@ private theorem canonPollKitsPlacedOk_of_dirGet [LibsignalPlacement] {M : AllocC (fun _ _ => Or.inl) (fun _ _ => Or.inr) have h578 := kpkMarkPoll_placed_ok_of_deps_fd (decProg := lsProg_597 H) (decBlk := 597) (getProg := lsProg_589 H) (getBlk := 589) (putProg := lsProg_570 H) (putBlk := 570) - hAllocFs hh.panics (cliBcmp_keepsFs_sat mmpl gh W hsh.bcmp) hDec597 hGetFd hPut542 + hAllocFs hh.panics hh.bcmp hDec597 hGetFd hPut542 (hh.fs (lsProg_578 H) 578) (Nat.le_refl (cliKitStk B).kpkMarkPoll) have h573 := pkGetPoll_placed_fs_ok_of_deps_fd (decProg := lsProg_597 H) (decBlk := 597) (getProg := lsProg_589 H) (getBlk := 589) (pkDecProg := lsProg_65 H) (pkDecBlk := 65) @@ -671,7 +663,7 @@ private theorem canonPollKitsPlacedOk_of_dirGet [LibsignalPlacement] {M : AllocC (serializeCanonX_placed_ok_of_serContractsX (serContractsX_of_runHooks mmpl gh W hh)) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (by decide) (by decide) (by decide) (by decide) idOk := fun F0 peer => cliIdKitPlacedOkI_full - (cliIdKitOkIE_of_dirGet hDropNz hh hGetPool hBb (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _)) + (cliIdKitOkIE_of_dirGet hDropNz hh hGetPool (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _)) selfOk := fun F0 peer => cliPollSelf_kitPlacedOk_of_dirGet mmpl gh W B F0 peer hDropNz hh hGetPool spkOk := fun F0 sid => spkKitFds_toWithFds henf rfl (cliSpkKitPlacedOkFds_of_poll (kitEnv := cliPollSpkFullBudgetEnv A.repAlloc F0 sid (cliKitStk B) ReadEnv) @@ -702,9 +694,10 @@ private theorem spqr_cliGhost_row_aux (mmpl : MultiPlacement) (g : CliGhostHooks (h5 : sym ≠ lsRustNoAllocShimSymCli := by decide) (h6 : sym ≠ lsStringCloneSym := by decide) (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) (h9 : sym ≠ CryptoVerification.SignalSession.lsMemsetSym := by decide) - (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) : + (h10 : sym ≠ CryptoVerification.SignalSession.lsMemcpySym := by decide) + (hExtra : cliExtraGhostSyms.contains sym = false ∨ g.extra.lookup sym = none := by left; decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 hExtra).trans (cliExternsPlaced_row mmpl W hrow) private def SpqrFromPbStateGuard (F : ShaCompress) (pb : V1State) : Prop := (∃ st : States spqrPolyApi (spqrAuthApi F), BOkTight st ∧ pb = st.into_pb) ∧ rawV1State pb ≤ 46880 ∧ ValidV1PtsAt 640 pb @@ -840,13 +833,15 @@ private theorem spqr_recv_topStateGuarded_seam_of_contracts [LibsignalPlacement] private theorem spqr_hookSat_withAllocVmPreserved_memmove_of_zero {H : String → Option (State → State)} {sym : String} (hookStack : Nat) - (h : HookSat H sym (withAllocVmPreserved (sessionMemmoveSpec 0))) : - HookSat H sym (withAllocVmPreserved (sessionMemmoveSpec hookStack)) := by + (h : HookSat H sym (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) : + HookSat H sym (withAllocVmPreserved (sessionMemmoveBoundedSpec hookStack)) := by refine ProofLib.HookSat.mono h fun ⟨base, buf, dst, src, len⟩ R s0 hpre => ⟨(base, buf, dst, src, len), stackAt s0.sp hookStack ∗ R, ?_, fun sf hpost => ?_⟩ - · dsimp only [withAllocVmPreserved, sessionMemmoveSpec, libcMemmoveSpec, stackAt] at hpre ⊢ + · dsimp only [withAllocVmPreserved, sessionMemmoveBoundedSpec, sessionMemmoveSpec, + libcMemmoveSpec, stackAt] at hpre ⊢ simp only [ProofLib.memRegion_zero, sepConj_emp]; ac_nf at hpre ⊢ - · dsimp only [withAllocVmPreserved, sessionMemmoveSpec, libcMemmoveSpec, stackAt] at hpost ⊢ + · dsimp only [withAllocVmPreserved, sessionMemmoveBoundedSpec, sessionMemmoveSpec, + libcMemmoveSpec, stackAt] at hpost ⊢ simp only [ProofLib.memRegion_zero, sepConj_emp] at hpost; ac_nf at hpost ⊢ private theorem spqr_statesRecv_recv_exactTight_ok [LibsignalPlacement] @@ -870,7 +865,7 @@ private theorem spqr_statesRecv_recv_exactTight_ok [LibsignalPlacement] (spqr_cliGhost_row_aux mmpl gh W (compress256_row_placed mmpl W)) } have hC := statesRecvPlacedContracts_of_ro_leaves_sat (cliRecvCt2PlacedAllocExt mmpl gh W hA hExt) (spqr_hookSat_withAllocVmPreserved_memmove_of_zero growOneStack - (hookSat_of_eq (hExt_wp _ (by decide)) (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W))) + (hookSat_of_eq (hExt_wp _ (by decide)) (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W hA.extraOk))) hmemset_wp (hookSat_of_eq (hExt_wp _ (by decide)) (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W (cliExternsPlaced_mlkemValidatePk_budget_sat mmpl W))) @@ -1084,8 +1079,7 @@ theorem h2k520c_w4DecPkCanonSlot520OkAt_of_seams {mpl mmpl : MultiPlacement} have hGWf : CliGhostAllocHooks fineCostModel (withFds A) cliBudgetLimits ghFixed := cliGhostAllocHooks_withFds (hG γ tp) have hhP := hhWithFds W γ tp - have hGetFd := dirGet_fd_ok rfl hLs (hAllocFs W γ tp) (cliBcmp_keepsFs_sat mmpl ghFixed W hhP.bcmp) - hhP (hReadSatFd W γ tp) + have hGetFd := dirGet_fd_ok rfl hLs (hAllocFs W γ tp) hhP.bcmp hhP (hReadSatFd W γ tp) have hGetPool : subroutine_ok (lsProg_589 H) (lsmpl.base 589) (dirGetSpecPlaced cliIo.rd cliWrOk (withFds A) cliBudgetLimits (DirGetEnv PathEnv (ReadFileRuleEnvFixed cliIo.rd) cliIo.rd) cliRunBudgets.dirGetNeed) := diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot520PathB.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot520PathB.lean index d01dd6d08..b49ae3eb9 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot520PathB.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot520PathB.lean @@ -388,7 +388,7 @@ theorem h2k520pb_w4PathBSlot520OkAt_of_seams memcpyRO := hhP.memcpyRO, bcmp := hhP.bcmp, fs := hhP.fs, utf8 := hhP.utf8, memrchr := hhP.memrchr, codecHooks := hhP.codecHooks, allocZeroed := hhP.allocZeroed, stringClone := hhP.stringClone, - formatInner := hhP.formatInner } + formatInner := hhP.formatInner, blackBox := hhP.blackBox } have hGetPool : subroutine_ok (lsProg_589 H) (lsmpl.base 589) (dirGetSpecPlaced cliIo.rd cliWrOk (withFds A) cliBudgetLimits diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot520VmPoll.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot520VmPoll.lean index e87940666..59ea334a1 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot520VmPoll.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSlot520VmPoll.lean @@ -296,7 +296,8 @@ theorem h2k520vm_decPk_d3_validMatch_seqFree_poll_frozen_kits_placedBudget [Libs LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, - hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, + hh.blackBox⟩ let σ := cliKitStk B let pid := pmPreKeyId y.g.msg let sid := y.g.msg.signedPreKeyId diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSpineA.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSpineA.lean index 5d9b650ea..369dacb57 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSpineA.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSpineA.lean @@ -15,6 +15,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3BinaryOomProofF3G public import LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.FdThreadKit public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2G public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Proofs.M3PlacedBudgetFd public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KBridges public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KCliNoOom @@ -28,6 +29,7 @@ import LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadStdinBudgetPlaced import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3AllocStdinGhostHooks import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.M24L4BEquiv import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Tie +import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KCliNoOomSat import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2LsRetAddrKeep import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfTopJoinKit import ProofLib.SepLogic @@ -115,8 +117,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadStdinBudgetPlaced (ke open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 (MainOkCliExtPqB2NeedLocksPlacedAt b2MainSpecTightNeedLocksFineAt) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2G - (F3MemsetMemcpyEntryLrFalse MainOkCliF3PqB2NeedLocksPlacedAtG - mainOkCliF3PqG_of_block617TransferFixedG) + (MainOkCliF3PqB2NeedLocksPlacedAtG mainOkCliF3PqG_of_block617TransferFixedG) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3AllocStdinGhostHooks (ActiveF3CallPre f3ReadStdinFallback_fs) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced @@ -124,6 +125,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.M24L4BEquiv (mainOkCliExtPqB2NeedLocksPlacedAt_iff) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG (withEntryGuard) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard (F3C2EntryGuard) open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainEntryBudgetFitsInst (MainEntryBudgetFitsCapOf domScopedRun) @@ -151,8 +153,8 @@ open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KBridges (h2kb_alloc_pre_keepSub_false h2kb_dealloc_pre_keepSub_false h2kb_hole2_hG h2kb_hole2_hioOf_writeFile h2kb_hole2_hioOf_writeStdout h2kb_hookOk_of_withKeepLrFalse h2kb_readStdin_okK h2kb_readStdin_pre_keepSub_false h2kb_realloc_pre_keepSub_false) -open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KCliNoOom - (mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf_preFd) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KCliNoOomSat + (mainOkCliExtPqB2NeedLocksPadPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf_preFd) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KD3MainLiftGlue (ghostMainSubroutineD3_of_domScopedRunTight_preFd) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KHooks @@ -212,7 +214,8 @@ theorem F3CliElfGhostWitnessK.hGSpqr {mpl mmpl : MultiPlacement} memset := hGK.memset memcpy := hGK.memcpy memcpy_exact := hGK.memcpy_exact - memset_acp := hGK.memset_acp } + memset_acp := hGK.memset_acp + extraOk := hGK.extraOk } /-- Lift `w.hGK` (`h2k_CliGhostAllocHooksK`) to plain `CliGhostAllocHooks` via `LsRetAddr624 lr → hole2_keepSub lr = false`. -/ @@ -791,7 +794,7 @@ theorem h2k_ghost_hmain_of_witnessK 617 cliProcessInputs (LibsignalFrozen mpl) (mallocngAddrsOfPlacement mmpl).libc cliElfImage.brkStart cliMainStk cliBudgetLimits).mp ?_ exact - mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf_preFd + mainOkCliExtPqB2NeedLocksPadPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf_preFd w.hblk w.hext_nodup (@instLsCodeInvFrozen (libsignalPlacementOf mpl w.hblk w.hext_nodup)) (fun _ => w.ghFixed) @@ -909,7 +912,7 @@ theorem h2k_d3MainSubroutine_of_witnessK (h547 : mpl.base 547 ≠ 0#64) (W : CliHooks) : ∀ (γ : GhostName) (tp : BitVec 64), subroutine_ok (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W) (mpl.base 617) - (withEntryGuard (F3MemsetMemcpyEntryLrFalse mmpl) + (withEntryGuard (F3C2EntryGuard mpl mmpl) (b2MainSpecTightNeedLocksFineAt (mallocngAddrsOfPlacement mmpl).libc (F3CodeOk mpl mmpl) (fineHookRustCliAllocBudget γ mmpl tp cliElfImage.brkStart) cliBudgetLimits fineCostModel.init cliMainStk (cliStaticsPlacedAt mpl) @@ -998,7 +1001,7 @@ theorem h2k_ghost_hmain_cliElfK (mallocngAddrsOfPlacement mmpl).libc cliElfImage.brkStart cliMainStk cliBudgetLimits).mp ?_ have hG := h2kb_hole2_hG mpl mmpl hLs hMm exact - mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf_preFd + mainOkCliExtPqB2NeedLocksPadPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf_preFd (hole2_hblk mpl hLs) (hole2_hext_nodup mpl hLs) (@instLsCodeInvFrozen (libsignalPlacementOf mpl (hole2_hblk mpl hLs) (hole2_hext_nodup mpl hLs))) diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSpineB.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSpineB.lean index ac67ef7a7..61df0400c 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSpineB.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KSpineB.lean @@ -159,7 +159,8 @@ theorem h2ksb_witness_hGSpqr {mpl mmpl : MultiPlacement} memset := hGK.memset memcpy := hGK.memcpy memcpy_exact := hGK.memcpy_exact - memset_acp := hGK.memset_acp } + memset_acp := hGK.memset_acp + extraOk := hGK.extraOk } /-- Lift `w.hGK` (`h2k_CliGhostAllocHooksK`) to plain `CliGhostAllocHooks`. -/ theorem h2ksb_witness_hG {mpl mmpl : MultiPlacement} diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KWitness.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KWitness.lean index 6e3a5bdc5..be10053f6 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KWitness.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomH2KWitness.lean @@ -13,6 +13,7 @@ public import LibsignalBinary.Specifications.SignalSession.CliElf public import LibsignalBinary.Proofs.SignalSession.Cli.D3.F3.D3BinaryOomProofF3G public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2G public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomPlaced public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomPlacedInst public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KHooks @@ -82,12 +83,12 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadFileBudgetPlaced (Rea open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 (MainOkCliExtPqB2NeedLocksPlacedAt b2MainSpecTightNeedLocksFineAt cliBudgetLimits) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2G - (F3MemsetMemcpyEntryLrFalse MainOkCliF3PqB2NeedLocksPlacedAtG - mainOkCliF3PqG_of_block617TransferFixedG) + (MainOkCliF3PqB2NeedLocksPlacedAtG mainOkCliF3PqG_of_block617TransferFixedG) open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt cliStaticsPlacedAt) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.Block617TransferG (Block617TransferFixedHypG) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2EntryGuard (F3C2EntryGuard) open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainIoBoundedPlaced (ReadStdinBoundedEnv) open LibsignalBinary.Proofs.SignalSession.Cli.Parity.F3.BundleInitElfF3 @@ -121,7 +122,7 @@ structure F3CliElfGhostWitnessK (mpl mmpl : MultiPlacement) where letI : LibsignalPlacement := libsignalPlacementOf mpl hblk hext_nodup Block617TransferFixedHypG mpl mmpl (fun W => cliGhostExterns ghFixed (cliExternsPlaced mmpl W)) - (cliExternsPlaced mmpl) (F3MemsetMemcpyEntryLrFalse mmpl) + (cliExternsPlaced mmpl) (F3C2EntryGuard mpl mmpl) (LibsignalFrozen mpl) (F3CodeOk mpl mmpl) (mallocngAddrsOfPlacement mmpl).libc cliElfImage.brkStart cliMainStk hGSpqrK : diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomPlacedG.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomPlacedG.lean index e07ed383a..23aceed69 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomPlacedG.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomPlacedG.lean @@ -15,7 +15,7 @@ public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Startu public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomPlaced -- proof-setup: allow-public-import public import LibsignalBinary.Specifications.SignalSession.CliElf public import VerifiedLibraries.Mallocng.Spec -import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfMemsetEntryGuard +import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomC2EntryGuardLr /-! # Concrete `cliElfBytes` Guarded Route-2 Constructors (`ElfSlicesPqOomPlacedG`) @@ -45,22 +45,22 @@ open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2G (CliElfF3B2NeedLocksAssumptionsG MainOkCliF3PqB2NeedLocksPlacedAtG) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.StartupStatics (F3CodeOk cliElf_f3B2NeedLocksAssumptions) -open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfMemsetEntryGuard - (cliElf_f3MuslHarness_memsetMemcpyLrFalse_of_linkedAt) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomC2EntryGuardLr + (cliElf_f3MuslHarness_c2EntryGuard_of_linkedAt) open LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomPlaced (CliPqBinaryV2OomF3BytesPlaced) open VerifiedLibraries.Mallocng (mallocngAddrsOfPlacement) /-- Closed guarded F3 assumption bundle on `cliElfImage` for arbitrary `LinkedAt cliElfBytes` placements `(mpl, mmpl)`, discharging `harnessG` internally via -`ElfMemsetEntryGuard.cliElf_f3MuslHarness_memsetMemcpyLrFalse_of_linkedAt` (`R2-G7`). -/ +`ElfSlicesPqOomC2EntryGuardLr.cliElf_f3MuslHarness_c2EntryGuard_of_linkedAt` (`R2-G7` / C2). -/ theorem cliElf_f3B2NeedLocksAssumptionsG {mpl mmpl : Obj.MultiPlacement} (hls : libsignalSessionLib.LinkedAt cliElfBytes mpl) (hmng : VerifiedLibraries.mallocngLib.LinkedAt cliElfBytes mmpl) : CliElfF3B2NeedLocksAssumptionsG mpl mmpl 80 (mallocngAddrsOfPlacement mmpl).libc cliMainStk (F3CodeOk mpl mmpl) cliElfImage := { toCliElfExtB2NeedLocksAssumptions2 := cliElf_f3B2NeedLocksAssumptions hls hmng - harnessG := cliElf_f3MuslHarness_memsetMemcpyLrFalse_of_linkedAt hls hmng } + harnessG := cliElf_f3MuslHarness_c2EntryGuard_of_linkedAt hls hmng } /-- Guarded twin of `ElfSlicesPqOomPlaced.cliPqBinaryV2OomF3BytesPlaced_cliElf_of_main` concluding the unchanged `CliPqBinaryV2OomF3BytesPlaced cliElfBytes` (`R2-D4`). -/ diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomPlacedInst.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomPlacedInst.lean index 392feacee..b1e6ea1d5 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomPlacedInst.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfSlicesPqOomPlacedInst.lean @@ -36,6 +36,7 @@ public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Wit public import LibsignalBinary.Proofs.SignalSession.Cli.Main.Callees public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Compose.RunOkNoMatchPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Glue.FsTracedPlaced +public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.SpqrExactEnvDefs public import LibsignalBinary.Proofs.SignalSession.Cli.SpqrSendCoinsTightCliInst @@ -51,6 +52,7 @@ public import LibsignalBinary.Specifications.SignalSession.CliElf public import ProofLib.FsTrace public import LibsignalBinary.Heap.IfaceBudgetBase import LibsignalBinary.Heap.IfaceBudgetBaseBridges +import LibsignalBinary.Proofs.PeakBudget.CliNoOomOfFitsEnvGhostSat import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemsetGhostAcp import LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadStdinCliIoInst import LibsignalBinary.Proofs.SignalSession.Cli.F3Relink.TieSpec @@ -137,8 +139,8 @@ open LibsignalBinary.Proofs.PeakBudget.CliF3MainOkBridge open LibsignalBinary.Proofs.PeakBudget.CliFitsTraceArith (cliBudgetLimits) open LibsignalBinary.Proofs.PeakBudget.CliKitEnvFits (realCliMainBinaryKitEnvOfFixed_fitsEnv_cliBudgetLimits) -open LibsignalBinary.Proofs.PeakBudget.CliNoOomOfFitsEnv - (mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf) +open LibsignalBinary.Proofs.PeakBudget.CliNoOomOfFitsEnvGhostSat + (mainOkCliExtPqB2NeedLocksPadPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf) open LibsignalBinary.Proofs.PeakBudget.CliRunArmsPeak (CliRunCalleeEnvs) open LibsignalBinary.Proofs.PeakBudget.CliSlotEnvelopeBridge (cliMainArmEnvs cliRunCalleesEnvs) open LibsignalBinary.Proofs.PeakBudget.D3MainEntryBudgetFitsCapFixed @@ -377,7 +379,8 @@ noncomputable def hole2_ghFixed [LibsignalPlacement] (mpl mmpl : MultiPlacement) LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Tie.f3TrialRxProg (hole2_targets mpl) mmpl cliElfImage.brkStart cliBudgetLimits hole2_hookStack (some (LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness.f3EmptyMemsetGhostHookNarrow mmpl)) - (some (LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness.f3EmptyMemcpyGhostHookNarrow mmpl))) + (some (LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness.f3EmptyMemcpyGhostHookNarrow mmpl)) + LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts.pureExtraGhosts) with stringClone := some (hole2_strCloneGhostHook mpl mmpl) } theorem hole2_hblk (mpl : MultiPlacement) (hLs : libsignalSessionLib.LinkedAt cliElfBytes mpl) : @@ -700,6 +703,7 @@ private theorem hole2_spqrAllocHooks [LibsignalPlacement] (mpl mmpl : MultiPlace hole2_keepSub hole2_emptyProg LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfF3Relink.Tie.f3TrialRxProg LibsignalBinary.Heap.Fine.f3RdlAzAddr mmpl cliElfImage.brkStart cliBudgetLimits + extraOk := LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts.pureExtraGhosts_specOk theorem hole2_hGSpqr (mpl mmpl : MultiPlacement) @@ -770,7 +774,8 @@ theorem hole2_hFs shim_fsT := CryptoVerification.SignalSession.Cli.RunGlue.hookNoop_fsT stringClone_fsT := ?_ memset_fsT := ?_ - memcpy_fsT := ?_ } + memcpy_fsT := ?_ + extra_fsT := LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts.pureExtraGhosts_fsT } · intro f hf dsimp only [hole2_ghFixed] at hf injection hf with hfeq @@ -2380,7 +2385,7 @@ theorem hole2_hghNoAlloc letI : LibsignalPlacement := libsignalPlacementOf mpl (hole2_hblk mpl hLs) (hole2_hext_nodup mpl hLs) have _ := hMm intro name f h - unfold cliGhostExterns at h + unfold cliGhostExterns CryptoVerification.SignalSession.Cli.RunGlue.cliGhostExternsWithExtra at h dsimp only [hole2_ghFixed, LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3AllocStdinGhostHooks.f3CliGhostHooksFixed, LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.F3ReadFileGhostHook.f3ReadFileFixedGhostHookFineSub, @@ -2430,7 +2435,19 @@ theorem hole2_hghNoAlloc subst hfeq exact LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.NarrowF3R1Witness.f3EmptyMemcpyGhostHookNarrow_noAllocFailed mmpl - · cases h + · split at h + · cases hex : + LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts.pureExtraGhosts.lookup name with + | none => + rw [hex] at h + cases h + | some ex => + rw [hex] at h + injection h with hfeq + subst hfeq + exact + LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.PureExtraGhosts.pureExtraGhosts_noAllocFailed hex + · cases h section Hole2SegcloneIoHelpers @@ -7913,7 +7930,7 @@ theorem hole_gap4_untyped_slot520 { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } hRead hDeser (cliRunSemD3 W) (binaryKitRunSlotEnvsExact W (fineHookRustCliAllocBudget γ mmpl tp brkStart) @@ -7998,7 +8015,7 @@ theorem hmain_cliElf 617 cliProcessInputs (LibsignalFrozen mpl) (mallocngAddrsOfPlacement mmpl).libc cliElfImage.brkStart cliMainStk cliBudgetLimits).mp ?_ exact - mainOkCliExtPqB2NeedLocksPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf + mainOkCliExtPqB2NeedLocksPadPlacedAt_cliGhostExterns_cliBudgetLimits_of_kitEnvFits_and_runTightOf w.hblk w.hext_nodup (@instLsCodeInvFrozen (libsignalPlacementOf mpl w.hblk w.hext_nodup)) (fun _ => w.ghFixed) diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfStrlenEntryGuard.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfStrlenEntryGuard.lean new file mode 100644 index 000000000..e7af3dcb2 --- /dev/null +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfStrlenEntryGuard.lean @@ -0,0 +1,371 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Heap.Fine.F3LayoutData -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays -- proof-setup: allow-public-import + +/-! +# Card CC-LIBC (`strlen`) — `F3CodeInv` / `rxProg` Replay Wrappers & Block-`617` `"strlen"` Entry Guards (`ElfStrlenEntryGuard`) + +Cutover-2 `c`-card companion to `Cli.HooksDehook.StrlenGhostReplays` (modeled on +`ElfBcmpEntryGuard` @ `1583e332c6`, staying in the default `LibsignalBinary` target with `0` +`CliElfLib`, C2, or trusted imports): + +1. **Artifact 2b — `F3CodeInv` / `rxProg` `GhostRowReplayOn` Wrappers (`§1`):** + - Parameterized over `(CodeInv : Memory → Prop)` (`:= StartupStatics.F3CodeInv mpl mmpl` at C2) + and `(rxProg : Program)` (`:= Tie.f3TrialRxProg` at C2), taking STARTUP's stock-side facts as + verbatim premises matching `Lib2LayoutFacts.lean` (`origin/stock-lld/c2-startup-dnm` @ + `a230f2671b`: `:114`, `:203`, `:271`, `:316`, `:317`, `:326`, `:338`, `:355`, `:368`, `:374`, + `:428`, `:444`) so C2 assembly discharges every premise with plain `exact`. + - Provides both `strlenGhost_rowReplayOn_f3CodeInv_of_strip` (consuming `hStripCL` verbatim from + `f3CodeInv_rxWords_codeLoaded_strip` `:203–215`) and `strlenGhost_rowReplayOn_f3CodeInv` + (consuming the 3 slice premises `hAlign`/`hNoWrap`/`hSubSlice` `:208–213` directly on `rxProg` + with `hAlign : (strlenEntry mpl).toNat % 4 = 0` and discharging `hKeep` `:214` automatically + via `keepR_strlen_of_code_offset`). +2. **Artifact 3 — Block-`617` Startup `lr` (`strlenEntryGuard` / `ExtraEntryGuard`) Discharge (`§2`):** + - Parameterized over `(keepBPre : BitVec 64 → Bool)` (`:= Lib2LayoutFacts.keepTextBPre` at C2), + taking `keepTextBPre_startupLr_false` (`:104`), `C2ExternTableFacts.batchLInKeep` (`:334` / `:419`), + and hull inclusion (`:485` `f3BatchLEntryGuard_of_startupLr`) as verbatim premises at the + concrete startup return address `f3StdLayout.libcStartMainStage2Addr + 56#64` (`= StdMainEntryLr + f3StdLayout s0`, `rfl`-equal to `Lib2LayoutFacts.f3StartupLrVal` `:99`). + - Supplies table-level `ExtraEntryGuard` arm helpers (`extraEntryGuard_strlen_arm` and + `extraEntryGuard_singleton_strlen`). +-/ + +set_option autoImplicit false + +public section + +namespace LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfStrlenEntryGuard + +open Arm64 Arm64.Obj Arm64.Process ProofLib ProofLib.StdStartup +open CryptoVerification (LibsignalPlacement) +open CryptoVerification.SignalSession (CliHooks cliExternsPlaced libsignalSessionLib) +open CryptoVerification.SignalSession.Cli.RunGlue (CliGhostHooks) +open LibsignalBinary.Heap.Fine (f3StdLayout) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.CliStrictPlaced2 (StdMainEntryLr) +open LibsignalBinary.Proofs.SignalSession.Cli.F3.L4B.F3HarnessPlaced (cliProgExtPlacedAt) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.ExtraGhostReplay ( + ExtraEntryGuard GhostRowOk GhostRowReplayOn +) +open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.StrlenGhostReplays ( + strlenEntry keepR_strlen strlenSubProg strlenSubProg_base strlenSubProg_code_length + keepR_strlen_of_code_offset strlenSubProg_codeLoaded_of_stripExecOutside + strlenGhost strlenGhostK strlenEntryGuard strlenEntryGuard_iff + strlenGhost_rowReplayOn strlenGhost_rowSpecOk strlenGhostK_rowReplayOn +) + +/-! ## 1. Artifact 2b — `F3CodeInv` / `rxProg` `GhostRowReplayOn` Wrappers (Verbatim C2 Premises) -/ + +/-- Default-target sub-slice `CodeLoaded (stripExecOutside (keepR_strlen mpl) m)` projection from + `rxProg.CodeLoaded m` (`:= hInv.rxCode` at `rxProg := Tie.f3TrialRxProg`), mirroring + `Lib2LayoutFacts.lean @a230f2671b:203-215` (`f3CodeInv_rxWords_codeLoaded_strip`; cf. `:271` + `hasWords_subslice_of_hasWords`) while discharging `:214` (`hKeep`) automatically via + `keepR_strlen_of_code_offset`. -/ +theorem strlenSubProg_codeLoaded_strip_of_rxProg + {mpl : Obj.MultiPlacement} {rxProg : Program} {m : Memory} + (hRx : rxProg.CodeLoaded m) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :208] f3CodeInv_rxWords_codeLoaded_strip: + (hAlign : (strlenEntry mpl).toNat % 4 = 0) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :209] f3CodeInv_rxWords_codeLoaded_strip: + (hNoWrap : (strlenEntry mpl).toNat + 4 * muslStrlenWords.length ≤ 2 ^ 64) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :210-213] f3CodeInv_rxWords_codeLoaded_strip + -- (cf. Lib2LayoutFacts.lean @a230f2671b:271 hasWords_subslice_of_hasWords): + (hSubSlice : ∀ (i : Nat) (hi : i < (strlenSubProg mpl).code.length), + ∃ (j : Nat) (hj : j < rxProg.code.length), + strlenEntry mpl + BitVec.ofNat 64 i = rxProg.base + BitVec.ofNat 64 j ∧ + (strlenSubProg mpl).code[i] = rxProg.code[j]) : + (strlenSubProg mpl).CodeLoaded (stripExecOutside (keepR_strlen mpl) m) := by + have hLen4 : 4 * muslStrlenWords.length = (strlenSubProg mpl).code.length := by + rw [strlenSubProg_code_length] + rfl + have hAlignBase : (strlenSubProg mpl).base.toNat % 4 = 0 := by + rw [strlenSubProg_base] + exact hAlign + refine Program.CodeLoaded.intro hAlignBase (by rw [strlenSubProg_base, ← hLen4]; exact hNoWrap) ?_ + intro i hi + obtain ⟨j, hj, haddr_eq, hbyte_eq⟩ := hSubSlice i hi + have hk_i : keepR_strlen mpl ((strlenSubProg mpl).base + BitVec.ofNat 64 i) = true := + keepR_strlen_of_code_offset mpl hi + rw [strlenSubProg_base] at hk_i ⊢ + have hr_rx := hRx.byte_eq j hj + have hp_rx := hRx.perm_eq j hj + have hlf_rx := hRx.isLazyFree_eq j hj + rw [ProofLib.strip_read8, ProofLib.strip_perm_of_keep hk_i, ProofLib.strip_isLazyFree] + rw [haddr_eq, hr_rx, hbyte_eq, hp_rx, hlf_rx] + exact ⟨rfl, rfl, rfl⟩ + +/-- **Artifact 2b (direct `hStripCL` form):** `GhostRowReplayOn` over + `(fun u => CodeInv u.mem ∧ PredFs u.fs)` (`CodeInv := StartupStatics.F3CodeInv mpl mmpl`, + `rxProg := Tie.f3TrialRxProg`), consuming `f3CodeInv_rxWords_codeLoaded_strip`'s conclusion + (`Lib2LayoutFacts.lean @a230f2671b:203-215`) directly alongside `:114`, `:316`/`:317`/`:338` + (cf. `:428` `StepsVisitedIn`, `:444` `f3RxSeg_steps_realW_of_visitedIn`), `:326`/`:355`, and + `:368`/`:374`. -/ +theorem strlenGhost_rowReplayOn_f3CodeInv_of_strip + (mpl mmpl : Obj.MultiPlacement) + (CodeInv : Memory → Prop) + (PredFs : FsState → Prop) + (rxProg : Program) + (EG : CliHooks → String → Option (State → State)) + (hInvKf : ∀ m m' : Memory, CodeInv m → m.KeepsFrozen m' → CodeInv m') + -- [Lib2LayoutFacts.lean @a230f2671b:203-215] f3CodeInv_rxWords_codeLoaded_strip + -- (cf. Lib2LayoutFacts.lean @a230f2671b:271 hasWords_subslice_of_hasWords): + (hStripCL : ∀ m : Memory, CodeInv m → + (strlenSubProg mpl).CodeLoaded (stripExecOutside (keepR_strlen mpl) m)) + -- [Lib2LayoutFacts.lean @a230f2671b:114] keepTextBPre_sub_rxProg (composed with keepR_strlen ⊆ keepTextBPre): + (hSubRx : ∀ {pc : BitVec 64}, keepR_strlen mpl pc = true → progKeep rxProg pc = true) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :317, :338] C2ExternTableFacts.realRxNoExtern / + -- f3RxSeg_realProg617_externAt_none (cf. :428 StepsVisitedIn, :444 f3RxSeg_steps_realW_of_visitedIn): + (hRealRxNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + progKeep rxProg pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :326, :355] C2ExternTableFacts.ghostRxEntry / + -- f3RxSeg_ghostProg617_externAt_entry: + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "strlen") = + some (strlenGhost mpl mmpl)) + -- [Lib2LayoutFacts.lean @a230f2671b:368, :374] f3Row_ghostProg617_externAt_none_of_ne_entry + -- (sym = "strlen", with hOther :374): + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_strlen mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl "strlen" → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) + EG "strlen" (strlenEntryGuard mpl) (strlenGhost mpl mmpl) := + strlenGhost_rowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) EG + (fun u ⟨hCode, _⟩ => strlenSubProg_codeLoaded_of_stripExecOutside (hStripCL u.mem hCode)) + (fun u v ⟨hCode, hFs⟩ hkf hfs => ⟨hInvKf u.mem v.mem hCode hkf, hfs ▸ hFs⟩) + hGhostAt + (fun W {_} hk => hRealRxNoExt W (hSubRx hk)) + hGhostNoExtNe + +/-- **Artifact 2b (slice-premise form):** `GhostRowReplayOn` over + `(fun u => CodeInv u.mem ∧ PredFs u.fs)` (`CodeInv := StartupStatics.F3CodeInv mpl mmpl`, + `rxProg := Tie.f3TrialRxProg`), taking the verbatim slice premises (`:208–213`) of + `Lib2LayoutFacts.f3CodeInv_rxWords_codeLoaded_strip` (`:203`) + `hInvRx : ∀ m, CodeInv m → + rxProg.CodeLoaded m` (`:= fun _ h => h.rxCode`). -/ +theorem strlenGhost_rowReplayOn_f3CodeInv + (mpl mmpl : Obj.MultiPlacement) + (CodeInv : Memory → Prop) + (PredFs : FsState → Prop) + (rxProg : Program) + (EG : CliHooks → String → Option (State → State)) + (hInvRx : ∀ m : Memory, CodeInv m → rxProg.CodeLoaded m) + (hInvKf : ∀ m m' : Memory, CodeInv m → m.KeepsFrozen m' → CodeInv m') + -- [Lib2LayoutFacts.lean @a230f2671b:203, :208] f3CodeInv_rxWords_codeLoaded_strip: + (hAlign : (strlenEntry mpl).toNat % 4 = 0) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :209] f3CodeInv_rxWords_codeLoaded_strip: + (hNoWrap : (strlenEntry mpl).toNat + 4 * muslStrlenWords.length ≤ 2 ^ 64) + -- [Lib2LayoutFacts.lean @a230f2671b:203, :210-213] f3CodeInv_rxWords_codeLoaded_strip + -- (cf. Lib2LayoutFacts.lean @a230f2671b:271 hasWords_subslice_of_hasWords): + (hSubSlice : ∀ (i : Nat) (hi : i < (strlenSubProg mpl).code.length), + ∃ (j : Nat) (hj : j < rxProg.code.length), + strlenEntry mpl + BitVec.ofNat 64 i = rxProg.base + BitVec.ofNat 64 j ∧ + (strlenSubProg mpl).code[i] = rxProg.code[j]) + -- [Lib2LayoutFacts.lean @a230f2671b:114] keepTextBPre_sub_rxProg (composed with keepR_strlen ⊆ keepTextBPre): + (hSubRx : ∀ {pc : BitVec 64}, keepR_strlen mpl pc = true → progKeep rxProg pc = true) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :317, :338] C2ExternTableFacts.realRxNoExtern / + -- f3RxSeg_realProg617_externAt_none (cf. :428 StepsVisitedIn, :444 f3RxSeg_steps_realW_of_visitedIn): + (hRealRxNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + progKeep rxProg pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :326, :355] C2ExternTableFacts.ghostRxEntry / + -- f3RxSeg_ghostProg617_externAt_entry: + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "strlen") = + some (strlenGhost mpl mmpl)) + -- [Lib2LayoutFacts.lean @a230f2671b:368, :374] f3Row_ghostProg617_externAt_none_of_ne_entry: + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_strlen mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl "strlen" → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) + EG "strlen" (strlenEntryGuard mpl) (strlenGhost mpl mmpl) := + strlenGhost_rowReplayOn_f3CodeInv_of_strip mpl mmpl CodeInv PredFs rxProg EG hInvKf + (fun m hCode => + strlenSubProg_codeLoaded_strip_of_rxProg (hInvRx m hCode) hAlign hNoWrap hSubSlice) + hSubRx hRealRxNoExt hGhostAt hGhostNoExtNe + +/-- Combined `GhostRowOk` (`hStripCL` form) over `(fun u => CodeInv u.mem ∧ PredFs u.fs)`. -/ +theorem strlenGhost_rowOk_f3CodeInv_of_strip [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (CodeInv : Memory → Prop) + (PredFs : FsState → Prop) + (rxProg : Program) + (EG : CliHooks → String → Option (State → State)) + (hInvKf : ∀ m m' : Memory, CodeInv m → m.KeepsFrozen m' → CodeInv m') + (hStripCL : ∀ m : Memory, CodeInv m → + (strlenSubProg mpl).CodeLoaded (stripExecOutside (keepR_strlen mpl) m)) + (hSubRx : ∀ {pc : BitVec 64}, keepR_strlen mpl pc = true → progKeep rxProg pc = true) + (hRealRxNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + progKeep rxProg pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "strlen") = + some (strlenGhost mpl mmpl)) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_strlen mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl "strlen" → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowOk mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) + EG "strlen" (strlenEntryGuard mpl) (strlenGhost mpl mmpl) := + ⟨strlenGhost_rowSpecOk mpl mmpl, + strlenGhost_rowReplayOn_f3CodeInv_of_strip mpl mmpl CodeInv PredFs rxProg EG hInvKf hStripCL + hSubRx hRealRxNoExt hGhostAt hGhostNoExtNe⟩ + +/-- Combined `GhostRowOk` (slice-premise form) over `(fun u => CodeInv u.mem ∧ PredFs u.fs)`. -/ +theorem strlenGhost_rowOk_f3CodeInv [LibsignalPlacement] + (mpl mmpl : Obj.MultiPlacement) + (CodeInv : Memory → Prop) + (PredFs : FsState → Prop) + (rxProg : Program) + (EG : CliHooks → String → Option (State → State)) + (hInvRx : ∀ m : Memory, CodeInv m → rxProg.CodeLoaded m) + (hInvKf : ∀ m m' : Memory, CodeInv m → m.KeepsFrozen m' → CodeInv m') + (hAlign : (strlenEntry mpl).toNat % 4 = 0) + (hNoWrap : (strlenEntry mpl).toNat + 4 * muslStrlenWords.length ≤ 2 ^ 64) + (hSubSlice : ∀ (i : Nat) (hi : i < (strlenSubProg mpl).code.length), + ∃ (j : Nat) (hj : j < rxProg.code.length), + strlenEntry mpl + BitVec.ofNat 64 i = rxProg.base + BitVec.ofNat 64 j ∧ + (strlenSubProg mpl).code[i] = rxProg.code[j]) + (hSubRx : ∀ {pc : BitVec 64}, keepR_strlen mpl pc = true → progKeep rxProg pc = true) + (hRealRxNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + progKeep rxProg pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) + (hGhostAt : ∀ W : CliHooks, + (cliProgExtPlacedAt mpl EG 617 W).externAt? (libsignalSessionLib.resolve mpl "strlen") = + some (strlenGhost mpl mmpl)) + (hGhostNoExtNe : ∀ (W : CliHooks) {pc : BitVec 64}, + keepR_strlen mpl pc = true → + pc ≠ libsignalSessionLib.resolve mpl "strlen" → + (cliProgExtPlacedAt mpl EG 617 W).externAt? pc = none) : + GhostRowOk mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) + EG "strlen" (strlenEntryGuard mpl) (strlenGhost mpl mmpl) := + ⟨strlenGhost_rowSpecOk mpl mmpl, + strlenGhost_rowReplayOn_f3CodeInv mpl mmpl CodeInv PredFs rxProg EG hInvRx hInvKf hAlign + hNoWrap hSubSlice hSubRx hRealRxNoExt hGhostAt hGhostNoExtNe⟩ + +/-- `K`-narrowed companion to `strlenGhost_rowReplayOn_f3CodeInv_of_strip` (requiring zero + ghost-table or entry-`lr` premises). -/ +theorem strlenGhostK_rowReplayOn_f3CodeInv_of_strip + (mpl mmpl : Obj.MultiPlacement) + (CodeInv : Memory → Prop) + (PredFs : FsState → Prop) + (rxProg : Program) + (EG : CliHooks → String → Option (State → State)) + (hInvKf : ∀ m m' : Memory, CodeInv m → m.KeepsFrozen m' → CodeInv m') + -- [Lib2LayoutFacts.lean @a230f2671b:203-215] f3CodeInv_rxWords_codeLoaded_strip: + (hStripCL : ∀ m : Memory, CodeInv m → + (strlenSubProg mpl).CodeLoaded (stripExecOutside (keepR_strlen mpl) m)) + -- [Lib2LayoutFacts.lean @a230f2671b:114] keepTextBPre_sub_rxProg: + (hSubRx : ∀ {pc : BitVec 64}, keepR_strlen mpl pc = true → progKeep rxProg pc = true) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :317, :338] C2ExternTableFacts.realRxNoExtern / + -- f3RxSeg_realProg617_externAt_none: + (hRealRxNoExt : ∀ (W : CliHooks) {pc : BitVec 64}, + progKeep rxProg pc = true → + (cliProgExtPlacedAt mpl (cliExternsPlaced mmpl) 617 W).externAt? pc = none) : + GhostRowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) + EG "strlen" (fun _ => True) (strlenGhostK mpl mmpl) := + strlenGhostK_rowReplayOn mpl mmpl (fun u => CodeInv u.mem ∧ PredFs u.fs) EG + (fun u ⟨hCode, _⟩ => strlenSubProg_codeLoaded_of_stripExecOutside (hStripCL u.mem hCode)) + (fun u v ⟨hCode, hFs⟩ hkf hfs => ⟨hInvKf u.mem v.mem hCode hkf, hfs ▸ hFs⟩) + (fun W {_} hk => hRealRxNoExt W (hSubRx hk)) + +/-! ## 2. Artifact 3 — Block-`617` Startup `lr` (`strlenEntryGuard` / `ExtraEntryGuard`) Discharge -/ + +/-- Concrete startup return address entering `main` (`block 617`), `rfl`-identical to + `Lib2LayoutFacts.f3StartupLrVal` (`Lib2LayoutFacts.lean @a230f2671b:99`) and proved equal to + `sm.readReg64 .lr` by `StartupStatics.cliElf_f3MuslHarnessLr_of_linkedAt`. -/ +@[expose] def f3StartupLrVal : BitVec 64 := + f3StdLayout.libcStartMainStage2Addr + 56#64 + +/-- Direct adapter from `Lib2LayoutFacts.f3BatchLEntryGuard_of_startupLr` + (`Lib2LayoutFacts.lean @a230f2671b:485-492`) into `strlenEntryGuard mpl s0` (`Iff.rfl`). -/ +theorem f3StrlenEntryGuard_of_batchLEntryGuard + {mpl : Obj.MultiPlacement} {s0 : State} + -- [Lib2LayoutFacts.lean @a230f2671b:485-492] f3BatchLEntryGuard_of_startupLr: + (hGuard : keepR_strlen mpl (s0.readReg64 .lr) = false ∧ + s0.readReg64 .lr ≠ libsignalSessionLib.resolve mpl "strlen") : + strlenEntryGuard mpl s0 := + (strlenEntryGuard_iff mpl s0).mpr hGuard + +/-- **Artifact 3 (`C11` §6.3):** Block-`617` `strlenEntryGuard mpl s0` discharge from startup `lr` + (`s0.readReg64 .lr = f3StdLayout.libcStartMainStage2Addr + 56#64`), parameterized over + `keepBPre : BitVec 64 → Bool` (`:= Lib2LayoutFacts.keepTextBPre` at C2) so zero C2-only + constants are imported while every premise matches `Lib2LayoutFacts.lean @a230f2671b` verbatim. -/ +theorem f3StrlenEntryGuard_of_startupLr + {mpl : Obj.MultiPlacement} {s0 : State} + (keepBPre : BitVec 64 → Bool) + -- [StartupStatics.cliElf_f3MuslHarnessLr_of_linkedAt; rfl-equal to Lib2LayoutFacts.f3StartupLrVal @a230f2671b:99]: + (hlr : s0.readReg64 .lr = f3StdLayout.libcStartMainStage2Addr + 56#64) + -- [Lib2LayoutFacts.lean @a230f2671b:104] keepTextBPre_startupLr_false: + (hLrOut : keepBPre (f3StdLayout.libcStartMainStage2Addr + 56#64) = false) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :334, :419] C2ExternTableFacts.batchLInKeep / + -- f3BatchL_dehookedSym_in_keepTextBPre (at sym = "strlen"): + (hSymIn : keepBPre (libsignalSessionLib.resolve mpl "strlen") = true) + -- [Lib2LayoutFacts.lean @a230f2671b:485, :490] f3BatchLEntryGuard_of_startupLr (`hsub` premise): + (hHullSub : ∀ pc : BitVec 64, keepR_strlen mpl pc = true → keepBPre pc = true) : + strlenEntryGuard mpl s0 := by + rw [strlenEntryGuard_iff, hlr] + refine ⟨?_, ?_⟩ + · cases hk : keepR_strlen mpl (f3StdLayout.libcStartMainStage2Addr + 56#64) + · rfl + · cases hLrOut.symm.trans (hHullSub _ hk) + · intro hEq + rw [hEq] at hLrOut + cases hLrOut.symm.trans hSymIn + +/-- `StdMainEntryLr f3StdLayout s0` wrapper around `f3StrlenEntryGuard_of_startupLr` (matching + `ElfMemsetEntryGuard.f3MemsetEntryGuard_of_startupLr` / `StartupStatics`). -/ +theorem f3StrlenEntryGuard_of_stdMainEntryLr + {mpl : Obj.MultiPlacement} {s0 : State} + (keepBPre : BitVec 64 → Bool) + (hlr : StdMainEntryLr f3StdLayout s0) + -- [Lib2LayoutFacts.lean @a230f2671b:104] keepTextBPre_startupLr_false: + (hLrOut : keepBPre (f3StdLayout.libcStartMainStage2Addr + 56#64) = false) + -- [Lib2LayoutFacts.lean @a230f2671b:316, :334, :419] C2ExternTableFacts.batchLInKeep / + -- f3BatchL_dehookedSym_in_keepTextBPre (at sym = "strlen"): + (hSymIn : keepBPre (libsignalSessionLib.resolve mpl "strlen") = true) + -- [Lib2LayoutFacts.lean @a230f2671b:485, :490] f3BatchLEntryGuard_of_startupLr (`hsub` premise): + (hHullSub : ∀ pc : BitVec 64, keepR_strlen mpl pc = true → keepBPre pc = true) : + strlenEntryGuard mpl s0 := + f3StrlenEntryGuard_of_startupLr keepBPre hlr hLrOut hSymIn hHullSub + +/-- Per-arm `"strlen"` discharge for any `guardOf : String → State → Prop` agreeing with + `strlenEntryGuard mpl` on `"strlen"`. -/ +theorem extraEntryGuard_strlen_arm + {mpl : Obj.MultiPlacement} {guardOf : String → State → Prop} {s0 : State} + (hGuardEq : guardOf "strlen" s0 ↔ strlenEntryGuard mpl s0) + (hStrlenGuard : strlenEntryGuard mpl s0) : + guardOf "strlen" s0 := + hGuardEq.mpr hStrlenGuard + +/-- Table-level `ExtraEntryGuard guardOf g s0` discharge when `g.extra` carries the singleton + `"strlen"` row `[("strlen", strlenGhost mpl mmpl)]`. -/ +theorem extraEntryGuard_singleton_strlen + {mpl mmpl : Obj.MultiPlacement} {guardOf : String → State → Prop} + {g : CliGhostHooks} {s0 : State} + (hg : g.extra = [("strlen", strlenGhost mpl mmpl)]) + (hGuardEq : guardOf "strlen" s0 ↔ strlenEntryGuard mpl s0) + (hStrlenGuard : strlenEntryGuard mpl s0) : + ExtraEntryGuard guardOf g s0 := by + intro sym f _ hLook + rw [hg] at hLook + simp only [List.lookup] at hLook + by_cases hSym : (sym == "strlen") = true + · have hEq : sym = "strlen" := eq_of_beq hSym + subst hEq + exact hGuardEq.mpr hStrlenGuard + · simp [hSym] at hLook + +end LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfStrlenEntryGuard diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfTopJoinPathB.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfTopJoinPathB.lean index 1ee5ecc6c..d29e22e00 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfTopJoinPathB.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ElfTopJoinPathB.lean @@ -2155,7 +2155,7 @@ private theorem h8pb_toSkeletonRunHooks [LibsignalPlacement] {M : AllocCostModel { alloc := hh.alloc, allocFs := hh.allocFs, panics := hh.panics, memcpyRO := hh.memcpyRO, bcmp := hh.bcmp, fs := hh.fs, utf8 := hh.utf8, memrchr := hh.memrchr, codecHooks := hh.codecHooks, allocZeroed := hh.allocZeroed, stringClone := hh.stringClone, - formatInner := hh.formatInner } + formatInner := hh.formatInner, blackBox := hh.blackBox } private theorem h8pb_withPanics_cliGhostExterns_eq (mmpl : Obj.MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) : @@ -2540,7 +2540,7 @@ theorem hole_m24slot_pathB_assembly_closed memcpyRO := hHooksP.memcpyRO, bcmp := hHooksP.bcmp, fs := hHooksP.fs, utf8 := hHooksP.utf8, memrchr := hHooksP.memrchr, codecHooks := hHooksP.codecHooks, allocZeroed := hHooksP.allocZeroed, stringClone := hHooksP.stringClone, - formatInner := hHooksP.formatInner } + formatInner := hHooksP.formatInner, blackBox := hHooksP.blackBox } have hAesDec := fineAesDec_budget_hookOk γ tp cliElfImage.brkStart cliBudgetLimits hPl_mng W.C.D have hSpqrTop := diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W1InnerTight.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W1InnerTight.lean index 7b757da9d..73b08dd01 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W1InnerTight.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W1InnerTight.lean @@ -175,6 +175,7 @@ import LibsignalBinary.Proofs.ConsumeMessageKey.AssemblyBudgetAux import LibsignalBinary.Proofs.ConsumeMessageKey.HmacProofs.NewFromSliceSecondHalf import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoBridgePlacedBudgetSat import LibsignalBinary.Proofs.E2E.Pqxdh.ResponderCore.CryptoCalleesPlacedBudgetSat +import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove import LibsignalBinary.Proofs.PeakBudget.SpqrSendTieLemmas import LibsignalBinary.Proofs.SpqrV1.Top.Send.Pure import LibsignalBinary.Proofs.SpqrV1.Top.Send.Top @@ -372,6 +373,7 @@ open LibsignalBinary.Proofs.SpqrV1.States.FromPb.TopPlacedTightBudgetR open LibsignalBinary.Proofs.SpqrV1.States.FromPb.Variant2aPlacedBudgetAux (FromPbAllocHooksBudget) open CryptoVerification.SpqrV1.Alloc (spqrMemmoveSym) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open LibsignalBinary.Proofs.SpqrV1.Chain.NextKeyInternalBudget (withAllocVmPreserved) open CryptoVerification.SpqrV1.Top.DecodeState.Placed (blkPC_325 blkPl_325) open CryptoVerification (ls_blockPlacement_base) @@ -1263,9 +1265,9 @@ private theorem w1t_cliSpqrSend_statesFromPb_exact_on [LibsignalPlacement] memcpy := w1t_hookSat_allocMemcpyVm_of_framelessAcp hRecv.memcpy } have hmemmove0 : HookSat (Rust.withPanics H) spqrMemmoveSym - (withAllocVmPreserved (CryptoVerification.LibsignalTripleRatchet.sessionMemmoveSpec 0)) := + (withAllocVmPreserved (sessionMemmoveBoundedSpec 0)) := hookSat_of_eq (w1t_s427_hExt_withPanics_id mmpl gh W _ (by decide)) - (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W) + (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W hA.extraOk) have hok333 := e2b_states_from_pb_ok_x_placed_exact (F := W.C.F) hFromPbHooks hmemmove0 have hok : subroutine_ok (spqrSendPlacedProg H) (lsmpl.base 333) (withLsCodeRoLoaded lsmpl @@ -3387,7 +3389,7 @@ open CryptoVerification.SignalSession ( ) open CryptoVerification.SignalSession.Cli (StoresGhost) open CryptoVerification.SignalSession.Cli.KitInst ( - cliGhostExterns_blackBox cliIdentityVtRoSym + cliGhostExterns_blackBox_sat cliIdentityVtRoSym ) open CryptoVerification.SignalSession.Cli.KitInst.IdKit ( savePollNeed saveShimNeed trustPollNeed trustShimNeed @@ -3458,7 +3460,7 @@ open LibsignalBinary.Proofs.PublicApi.MessageEncrypt.Seg.SegTrustCommonPlacedBud ) open LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadFileBudgetPlaced (ReadFileRuleEnvFixed) open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.IdentityKitOkPlacedBudget ( - cliIdKitOkIE_placed + cliIdKitOkIE_placed_sat ) open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) open LibsignalBinary.Proofs.SignalSession.Cli.M24.MainOkCliExtB2NeedLocksInst (cliRunSemD2c_placed) @@ -3488,12 +3490,11 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.SkeletonPlacedBudget (RunHooks open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( CliGhostAllocHooks CliGhostSpqrAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_compress256Multi_budget_sat - cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_durationSinceBounded_budget_sat - cliExternsPlaced_exactMemcpy_sat + cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_exactMemcpy_sat cliExternsPlaced_framelessMemcpy_budget_sat cliExternsPlaced_noAllocShim_budget_sat cliExternsPlaced_realloc_budget_sat cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemsetRegion_budget_sat cliExternsPlaced_shim_budget_sat - cliExternsPlaced_timeAdd_budget_sat + cliGhostExterns_durationSinceBounded_budget_sat cliGhostExterns_timeAdd_budget_sat ) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (readFileSpecPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget (spqrSendCoinsPlacedSpecTOfEnv) @@ -3771,10 +3772,9 @@ private theorem w1t_publicApiEncHooks [LibsignalPlacement] {M : AllocCostModel} realloc := cliExternsPlaced_realloc_budget_sat mmpl g W hG memcpy := cliExternsPlaced_sessionMemcpyRegion_budget_sat mmpl g W hG stringClone := hh.stringClone - timeAdd := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_timeAdd_budget_sat mmpl W) - durationSince := cliGhostExterns_sat_of_cliExternsPlaced mmpl g W - (cliExternsPlaced_durationSinceBounded_budget_sat mmpl W) + timeAdd := cliGhostExterns_timeAdd_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk + durationSince := + cliGhostExterns_durationSinceBounded_budget_sat g (cliExternsPlaced mmpl W) hG.extraOk handleError := cliGhostExterns_panic_handle_error mmpl g W handleAllocError := cliGhostExterns_panic_handle_alloc_error mmpl g W expectFailed := cliGhostExterns_panic_option_expect_failed mmpl g W @@ -4034,7 +4034,7 @@ theorem w1t_w1Inner_of_sendCoins [LibsignalFullPlacement] intro F peer hok exact withStores_placed_okVT_fs_cli hhooks (w1BinarySessKitPlacedFixed_okSE cliRunBudgets F peer h547 hh hRead589 hDeser569 hSer52) - (cliIdKitOkIE_placed + (cliIdKitOkIE_placed_sat (rd := cliIo.rd) (F0 := F) (pathOk := cliWrOk) (peer := peer) (readStk := cliRunBudgets.readFile) (s1 := trustShimNeed) (s2 := trustPollNeed cliRunBudgets.readFile) @@ -4042,7 +4042,7 @@ theorem w1t_w1Inner_of_sendCoins [LibsignalFullPlacement] (vtSym := cliIdentityVtRoSym) (readProg := lsProg_589 H) (jRead := 589) h547 (fun _ hp => hp.2) hh hRead589 - (cliGhostExterns_blackBox mmpl ghFixed W) + (cliGhostExterns_blackBox_sat mmpl ghFixed W hG.extraOk) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (Nat.le_refl _) (by decide) (by decide)) hOtrT hOtrEmpty diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W2InnerTight.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W2InnerTight.lean index da9f5bde3..ff615ece5 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W2InnerTight.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W2InnerTight.lean @@ -69,6 +69,7 @@ public import LibsignalBinary.Proofs.SpqrV1.Top.Recv.FinalPlacedBudget public import LibsignalBinary.Specifications.SignalSession.CliElf public meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.Common.SharedHelpers +import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove import LibsignalBinary.Proofs.SpqrV1.States.Recv.TopPlacedBudgetSat import LibsignalBinary.Proofs.SpqrV1Sync.Codec.PbState import LibsignalBinary.Proofs.SpqrV1Sync.SendTotal.BraidCodec @@ -125,8 +126,7 @@ open CryptoVerification.SignalSession lsFmtWriteSym lsFormatInnerSym lsReadFileSym lsReadStdinSym lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli) open CryptoVerification.SignalSession.Cli (StoresGhost) -open CryptoVerification.SignalSession.Cli.KitInst - (cliGhostExterns_blackBox cliIdentityVtRoSym) +open CryptoVerification.SignalSession.Cli.KitInst (cliIdentityVtRoSym) open CryptoVerification.SignalSession.Cli.KitInst.IdKit (cliIdentityKitSpecPlaced_quiet) open CryptoVerification.SignalSession.Cli.KitInst.SessKit (cliSessionKitSpecPlaced_quiet) open CryptoVerification.SignalSession.Cli.MainHops @@ -136,8 +136,8 @@ open CryptoVerification.SignalSession.Cli.Run.Placed (lsProg_579) open CryptoVerification.SignalSession.Cli.RunCompose (DecSigGhost RunSem idVtPlaced mkSlot sessVtPlaced withCodeOk) open CryptoVerification.SignalSession.Cli.RunGlue - (CliGhostHooks CliGhostHooksFs cliExternsPlaced_row cliGhostExterns cliGhostExterns_other - hookSat_of_eq withPanics_cliGhostExterns) + (CliGhostHooks CliGhostHooksFs cliExternsPlaced_row cliExtraGhostSyms cliGhostExterns + cliGhostExterns_other hookSat_of_eq withPanics_cliGhostExterns) open CryptoVerification.SignalSession.Cli.RunProofs (cliDecryptPrekeyNeed cliDecryptSignalNeed) open CryptoVerification.SignalSession.Cli.RunProofs.DecryptLemmas (toDecryptGhost) open CryptoVerification.SignalSession.Cli.RunSkeleton (RunBudgets) @@ -180,6 +180,7 @@ open LibsignalBinary.Proofs.Cli.SpqrV1.M4.RecordDecryptPV1TrapPlacedBudget (recordDecryptV1_full_placed_region_vregs_ok_PTight_cli_of_tdEnv) open LibsignalBinary.Proofs.Cli.SpqrV1.M4.TryDecryptPV1TrapPlacedBudget (TryDecryptCliEnvOf) open LibsignalBinary.Proofs.HookDischarge.CryptoMallocngBudget (aesDecHookMallocng_budget_ok) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open LibsignalBinary.Proofs.PeakBudget.CliFitsTraceArith (cliBudgetLimits) open LibsignalBinary.Proofs.PeakBudget.DecPkD2cSlotOkLinked (TryDecryptCliEnvOfPure tryDecryptCmkSeg4Env tryDecryptEnvArgsToGhost) @@ -212,7 +213,7 @@ open LibsignalBinary.Proofs.PublicApi.StoreKit.PlacedBudget open LibsignalBinary.Proofs.SessionRecordAt.Hooks2.DeserBudget.FineCredit (HasFineReallocCredit) open LibsignalBinary.Proofs.SignalSession.Cli.F3.HRead.ReadFileBudgetPlaced (ReadFileRuleEnvFixed) open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.IdentityKitOkPlacedBudget - (cliIdKitOkIE_placed) + (cliIdKitOkIE_placed_sat) open LibsignalBinary.Proofs.SignalSession.Cli.KitInst.SessionKitOkCliPlacedBudget (cliSessKitOkSE_seqFree_placed) open LibsignalBinary.Proofs.SignalSession.Cli.M24.B2MainFrameComposeBudget (libsignalPlacementOf) @@ -344,9 +345,12 @@ private theorem w2t_cliGhost_row_aux (mmpl : MultiPlacement) (g : CliGhostHooks) (h3 : sym ≠ lsRustReallocSymCli := by decide) (h4 : sym ≠ lsRustAllocZeroedSymCli := by decide) (h5 : sym ≠ lsRustNoAllocShimSymCli := by decide) (h6 : sym ≠ lsStringCloneSym := by decide) (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) - (h9 : sym ≠ "memset" := by decide) (h10 : sym ≠ "memcpy" := by decide) : + (h9 : sym ≠ "memset" := by decide) (h10 : sym ≠ "memcpy" := by decide) + (hExtra : cliExtraGhostSyms.contains sym = false ∨ g.extra.lookup sym = none := by + left; decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 hExtra).trans + (cliExternsPlaced_row mmpl W hrow) private theorem w2t_fmtWriteHook0_budget_ok {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) : @@ -432,7 +436,7 @@ private theorem w2t_decBinaryIdKitPlacedFixed_okIE [LibsignalPlacement] (decIdKitPlaced A.repAlloc F0 peer B) (decBinaryIdKitPlacedBudgetFixed A.repAlloc B F0 peer) (cliGhostExterns gh (cliExternsPlaced mmpl W)) := - cliIdKitOkIE_placed + cliIdKitOkIE_placed_sat (readProg := lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (jRead := 589) (vtSym := cliIdentityVtRoSym) hDropNz (fun _ hp => hp.2) hh @@ -440,7 +444,7 @@ private theorem w2t_decBinaryIdKitPlacedFixed_okIE [LibsignalPlacement] (ls_hook_ok_ultra_of_mem (prog := lsProg_589 (cliGhostExterns gh (cliExternsPlaced mmpl W))) (i := 589) hReadHook (by decide) (by decide) (by decide))) - (cliGhostExterns_blackBox mmpl gh W) + hh.blackBox (by decide) (Nat.le_refl _) (by decide) (Nat.le_refl _) private theorem w2t_w2_inner_binaryKitFixed_frozen_placed_ok_of_region [LibsignalPlacement] @@ -1122,14 +1126,16 @@ private theorem w2t_spqrRecv_topStateGuarded_seam_of_contracts [LibsignalPlaceme private theorem w2t_hookSat_withAllocVmPreserved_memmove_of_zero {H : String → Option (State → State)} {sym : String} (hookStack : Nat) - (h : HookSat H sym (withAllocVmPreserved (sessionMemmoveSpec 0))) : - HookSat H sym (withAllocVmPreserved (sessionMemmoveSpec hookStack)) := by + (h : HookSat H sym (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) : + HookSat H sym (withAllocVmPreserved (sessionMemmoveBoundedSpec hookStack)) := by refine ProofLib.HookSat.mono h fun ⟨base, buf, dst, src, len⟩ R s0 hpre => ⟨(base, buf, dst, src, len), stackAt s0.sp hookStack ∗ R, ?_, fun sf hpost => ?_⟩ - · dsimp only [withAllocVmPreserved, sessionMemmoveSpec, libcMemmoveSpec, stackAt] at hpre ⊢ + · dsimp only [withAllocVmPreserved, sessionMemmoveBoundedSpec, sessionMemmoveSpec, + libcMemmoveSpec, stackAt] at hpre ⊢ simp only [ProofLib.memRegion_zero, sepConj_emp] ac_nf at hpre ⊢ - · dsimp only [withAllocVmPreserved, sessionMemmoveSpec, stackAt] at hpost ⊢ + · dsimp only [withAllocVmPreserved, sessionMemmoveBoundedSpec, sessionMemmoveSpec, + stackAt] at hpost ⊢ simp only [ProofLib.memRegion_zero, sepConj_emp] at hpost ac_nf at hpost ⊢ @@ -1159,7 +1165,7 @@ private theorem w2t_statesRecv_recv_exactTight_ok [LibsignalPlacement] (cliRecvCt2PlacedAllocExt mmpl gh W hA hExt) (w2t_hookSat_withAllocVmPreserved_memmove_of_zero growOneStack (hookSat_of_eq (hExt_wp _ (by decide)) - (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W))) + (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W hA.extraOk))) hMemset_wp (hookSat_of_eq (hExt_wp _ (by decide)) (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W3VerifySigAux.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W3VerifySigAux.lean index 74586d6ee..9be474ac1 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W3VerifySigAux.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W3VerifySigAux.lean @@ -14,13 +14,18 @@ public import LibsignalBinary.Heap.IfaceBudgetLemmas public import LibsignalBinary.Heap.SpecBudget public import LibsignalBinary.Proofs.E2E.Pqxdh.Initiator.ModelBridge public import LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlaced +public import LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedASat public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.LocalCalleesPlacedBudget public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlaced public import LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget import Arm64.Trusted.Spec.SepLogic +import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat +import LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedSat import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore +import LibsignalBinary.Proofs.SpecLemmas.SignalSession.Hole3W3VerifySigBbSat import LibsignalBinary.Proofs.SpqrV1.Poly.EncodeBytes.DefsBudget import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat +import LibsignalBinary.Proofs.TripleRatchet.Hooks.Defs import ProofLib.SepLogic.Fresh import ProofLib.SepLogic.HeapIntro @@ -53,10 +58,10 @@ open CryptoVerification.E2E readSha512State readVecN scalarModHook scalarWideHook toEdwardsHook) open CryptoVerification.E2E.Pqxdh.Initiator (structuralPrims_initiatorModelPrims) open CryptoVerification.E2E.Pqxdh.Shared - (VerifySignaturePlacedGhost VerifySignaturePlacedHooks VerifySignaturePrims + (VerifySignaturePlacedGhost VerifySignaturePrims lsDalekCompressSym lsDalekDoubleMulSym lsDalekEdNegSym lsDalekScalarModSym lsDalekScalarWideSym lsSha512CompressSym lsVerifyMemsetSym lsVerifyMontToEdSym - pqxdhHookStack verifySignatureCallSpec verifySignature_placed_ok) + pqxdhHookStack verifySignatureCallSpec) open CryptoVerification.LibsignalAesCbc (returnToLinkRegister) open CryptoVerification.LibsignalPublicApi.StoreKit (extract_withLsCodeRoLoaded withLsCodeRoLoaded) open CryptoVerification.LibsignalSession (blackBoxHook) @@ -65,31 +70,39 @@ open CryptoVerification.SignalSession lsRustAllocSymCli lsRustAllocZeroedSymCli lsRustDeallocSymCli lsRustNoAllocShimSymCli lsRustReallocSymCli lsStringCloneSym) open CryptoVerification.SignalSession.Cli.RunGlue - (CliGhostHooks cliExternsPlaced_row cliGhostExterns cliGhostExterns_memcpy_some - cliGhostExterns_memset_some cliGhostExterns_other) + (CliGhostHooks cliExternsPlaced_row cliExtraGhostSyms cliGhostExterns + cliGhostExterns_memcpy_some cliGhostExterns_memset_some cliGhostExterns_other) open CryptoVerification.SignalSession.Cli.RunProofs.Initiate (initProgPlaced transfer_withLsCodeRoLoaded) open CryptoVerification.SignalSession.Cli.Slots - (blackBox_row_placed cliExternsPlaced_compress512_sat cliExternsPlaced_compress_sat + (cliExternsPlaced_compress512_sat cliExternsPlaced_compress_sat cliExternsPlaced_dsmb_sat cliExternsPlaced_edNeg_sat cliExternsPlaced_scalarMod_sat cliExternsPlaced_scalarWide_sat cliExternsPlaced_toEdwards_sat cliGhostExterns_sat_of_cliExternsPlaced compress512_row_placed compress_row_placed dsmb_row_placed edNeg_row_placed scalarMod_row_placed scalarWide_row_placed toEdwards_row_placed) open CryptoVerification.LibsignalTripleRatchet - (RW hookMemset_region_trace_ok sessionMemcpyRegionSpec sessionMemsetRegionSpec - sessionMemsetSpec truncate8_truncate32) + (RW blackBoxSpec hookMemset_region_trace_ok sessionMemcpyRegionSpec sessionMemsetRegionSpec + sessionMemsetSpec truncate8_truncate32 withStack) open CryptoVerification.LibsignalTripleRatchet.Extract (S2Frame disjoint_fullComplementHeap fullComplementHeap matches_fullComplementHeap) open LibsignalBinary.Heap (AllocCostModel BudgetLimits RustCliAllocBudget VmPreserved) open LibsignalBinary.Heap.MuslMemOpsRunsTo (applyMemcpyClobber) open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat + (blackBoxHook_ok_sat blackBoxSpec16 blackBoxSpecSat) +open LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedASat + (VerifySignaturePlacedHooksSat) +open LibsignalBinary.Proofs.E2E.Pqxdh.Shared.VerifySignaturePlacedSat + (verifySignature_placed_ok_sat) open LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.MemcpyExactCore (HookExactMemcpy hookMemcpy_exact) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.Initiate.LocalCalleesPlacedBudget (verifySignatureInnerSpec) open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget - (CliGhostAllocHooks) + (CliGhostAllocHooks cliGhostExterns_blackBoxSat_budget_sat) +open LibsignalBinary.Proofs.SpecLemmas.SignalSession.Hole3W3VerifySigBbSat + (hookOk_blackBoxSpecSat_elim) open LibsignalBinary.Proofs.SpqrV1.Poly.EncodeBytes.DefsBudget (calleeSavedPreserved_of_stripS_right checkBlockSafeVm checkBytesSafeVm isTotalTrapHooks_vmTrapHooks placedLib_rebase_allInstrs_safeVm stripS_pc stripS_readReg64 @@ -104,9 +117,12 @@ private theorem cliGhost_row (mmpl : MultiPlacement) (g : CliGhostHooks) (W : Cl (h3 : sym ≠ lsRustReallocSymCli := by decide) (h4 : sym ≠ lsRustAllocZeroedSymCli := by decide) (h5 : sym ≠ lsRustNoAllocShimSymCli := by decide) (h6 : sym ≠ lsStringCloneSym := by decide) (h7 : sym ≠ lsReadFileSym := by decide) (h8 : sym ≠ lsReadStdinSym := by decide) - (h9 : sym ≠ "memset" := by decide) (h10 : sym ≠ "memcpy" := by decide) : + (h9 : sym ≠ "memset" := by decide) (h10 : sym ≠ "memcpy" := by decide) + (h11 : cliExtraGhostSyms.contains sym = false ∨ g.extra.lookup sym = none := by + left; decide) : cliGhostExterns g (cliExternsPlaced mmpl W) sym = some f := - (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10).trans (cliExternsPlaced_row mmpl W hrow) + (cliGhostExterns_other g _ h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 h11).trans + (cliExternsPlaced_row mmpl W hrow) private theorem hookSat_of_eq {α : Type} {H H' : LibsignalHooks} {sym : String} {spec : Spec α} (heq : H' sym = H sym) (hs : HookSat H sym spec) : HookSat H' sym spec := by @@ -130,7 +146,7 @@ private theorem w3VerifySigHooks_vsigOnly [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (hG : CliGhostAllocHooks M A lim gh) (Y : UnreachedPqxdhPrimitives) : - VerifySignaturePlacedHooks (modelPrims Y ⟨W.C, W.Q⟩) + VerifySignaturePlacedHooksSat (modelPrims Y ⟨W.C, W.Q⟩) (vsigOnlyHooks (cliGhostExterns gh (cliExternsPlaced mmpl W))) where memcpy := by obtain ⟨f, hf, _, _, _, hok, _, _, _, _, _⟩ := hG.memcpy @@ -146,10 +162,11 @@ private theorem w3VerifySigHooks_vsigOnly [LibsignalPlacement] cliGhostExterns gh (cliExternsPlaced mmpl W) "memset" by simp [vsigOnlyHooks, vsigKeepSym, lsVerifyMemsetSym]).trans (cliGhostExterns_memset_some gh (cliExternsPlaced mmpl W) hf) - blackBox := (show vsigOnlyHooks (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsBlackBoxU8Sym = - cliGhostExterns gh (cliExternsPlaced mmpl W) lsBlackBoxU8Sym by - simp [vsigOnlyHooks, vsigKeepSym]).trans - (cliGhost_row mmpl gh W (blackBox_row_placed mmpl W)) + blackBox := hookSat_of_eq + (show vsigOnlyHooks (cliGhostExterns gh (cliExternsPlaced mmpl W)) lsBlackBoxU8Sym = + cliGhostExterns gh (cliExternsPlaced mmpl W) lsBlackBoxU8Sym by + simp [vsigOnlyHooks, vsigKeepSym]) + (cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hG.extraOk) montToEd := hookSat_of_eq (by simp [vsigOnlyHooks, vsigKeepSym]) (cliGhostExterns_sat_of_cliExternsPlaced mmpl gh W (cliExternsPlaced_toEdwards_sat mmpl W Y (img := default))) @@ -1056,6 +1073,150 @@ private theorem hookOk_shadowMemcpy [LibsignalPlacement] (tr0 : List State) exact hpost.2 · exact ⟨hkf, hsym, Or.inr hrest⟩ +private theorem stripWx_s2Frame_one_block [LibsignalPlacement] + {m0 m1 : Memory} {dst : BitVec 64} {len : Nat} + {P_post R' : SepProp} + (hp_pts : P_post (regionHeap dst len (stripWx m1))) + (hmem' : stripWx m0 ⊨ memRegion dst len ∗ R') + (hu_rw : m0.RW dst len) + (hkf_u : m0.KeepsFrozen m1) + (hperm_u : ∀ a, m1.perm a = m0.perm a) + (hs2_u : S2Frame m0 m1 [(dst, len)]) : + stripWx m1 ⊨ P_post ∗ R' := by + let h_pts : Heap := regionHeap dst len (stripWx m1) + have hrw_f_swx : (stripWx m1).RW dst len := + (stripWx_rw_iff m1 dst len).mpr fun a ha => hs2_u.2.1.1.1 a (hu_rw a ha) + have hm_pts_swx : h_pts.Matches (stripWx m1) := + IsBlock.regionHeap_matches dst len (stripWx m1) hrw_f_swx + obtain ⟨h_reg, h_R', hdisj', hp_reg, hp_R', hm_both'⟩ := Satisfies.sepConj_elim hmem' + have hm_R' : h_R'.Matches (stripWx m0) := Heap.Matches.of_union_right hdisj' hm_both' + obtain ⟨m_r, _, h_reg_eq⟩ := ((IsBlock.memRegion dst len).iff h_reg).mp hp_reg + have hdisj_new : h_pts.Disjoint h_R' := by + unfold Heap.Disjoint at hdisj' ⊢ + refine ⟨fun a => ?_, + fun _ _ => Or.inl (by simp [h_pts, regionHeap]), + fun _ _ => Or.inl (by simp [h_pts, regionHeap]), + (fun _ _ _ _ h => by rcases h with ⟨h0, _⟩ | ⟨_, h0⟩ <;> simp [h_pts, regionHeap] at h0), + fun _ => Or.inl (by simp [h_pts, regionHeap])⟩ + by_cases hin : InRegion dst len a + · have hr_some : h_reg.phys a = some (.rw (m_r.read8 a)) := by + rw [h_reg_eq]; simp [regionHeap, hin] + rcases hdisj'.1 a with h1 | h2 | ⟨_, h3, _⟩ + · rw [hr_some] at h1; cases h1 + · exact Or.inr (Or.inl h2) + · rw [hr_some] at h3; cases h3 + · exact Or.inl (by dsimp [h_pts]; simp [regionHeap, hin]) + have hm_R'_swx : h_R'.Matches (stripWx m1) := by + unfold Heap.Disjoint at hdisj' + unfold Heap.Matches at hm_R' ⊢ + rcases hs2_u with ⟨hs2_rd, ⟨⟨_, _⟩, ⟨hs2_anon, hs2_pn⟩⟩, hs2_r⟩ + have hperm_swx : ∀ a, (stripWx m1).perm a = (stripWx m0).perm a := + fun a => stripWx_perm_congr (hperm_u a) + refine ⟨fun a c hc => ?_, hm_R'.2.1, fun a hma => ?_⟩ + · have hout : OutsideRegion dst len a := by + by_cases hin : InRegion dst len a + · have hr_some : h_reg.phys a = some (.rw (m_r.read8 a)) := by + rw [h_reg_eq]; simp [regionHeap, hin] + rcases hdisj'.1 a with h1 | h2 | ⟨_, h3, _⟩ + · rw [hr_some] at h1; cases h1 + · rw [hc] at h2; cases h2 + · rw [hr_some] at h3; cases h3 + · exact (outsideRegion_iff_not_inRegion dst len a).mpr hin + have hout_l : ∀ r ∈ [(dst, len)], OutsideRegion r.1 r.2 a := by + intro r hr_m; simp only [List.mem_cons, List.not_mem_nil, or_false] at hr_m + subst hr_m; exact hout + have hcell := hm_R'.1 a c hc + cases c with + | rw b => + have hp_sw : (stripWx m0).permNoLazy a = some Perm.rw := + Memory.permNoLazy_eq_some_rw_iff.mpr ⟨hcell.2.1, hcell.2.2⟩ + obtain ⟨hpu, hlfu⟩ := + Memory.permNoLazy_eq_some_rw_iff.mp ((stripWx_permNoLazy_rw_iff m0 a).mp hp_sw) + have hru : (m0.perm a).r = true := by rw [hpu]; rfl + have hrd' : m1.read8 a = m0.read8 a := hs2_rd a hru hlfu hout_l + have hlf' : m1.isLazyFree a = false := (hs2_r a hru hlfu).2 + have hpu' : m1.perm a = some Perm.rw := (hperm_u a).trans hpu + obtain ⟨hp_f, hlf_f⟩ := Memory.permNoLazy_eq_some_rw_iff.mp + ((stripWx_permNoLazy_rw_iff m1 a).mpr + (Memory.permNoLazy_eq_some_rw_iff.mpr ⟨hpu', hlf'⟩)) + exact ⟨(stripWx_read8 _ a).trans (hrd'.trans ((stripWx_read8 m0 a).symm.trans hcell.1)), + hp_f, hlf_f⟩ + | ro b => + have hmap_sw : ((stripWx m0).perm a).mapped = true := by + cases hpx : (stripWx m0).perm a with + | none => rw [hpx] at hcell; cases hcell.2.1 + | some _ => rfl + obtain ⟨_, hlf_eq, _⟩ := stripWx_mapped_props hmap_sw + have hlfu : m0.isLazyFree a = false := hlf_eq.symm.trans hcell.2.2 + have hru : (m0.perm a).r = true := by + have h1 := hcell.2.1 + unfold stripWx at h1 + rw [(ProofLib.strip_perm_props keepLs (hideWx m0) a).1, hideWx_perm] at h1 + revert h1 + rcases m0.perm a with _ | ⟨r, w, x, _, _⟩ <;> intro h1 + · cases h1 + · cases r <;> cases w <;> cases x <;> simp [Perm.protNone, Option.r] at h1 ⊢ + have hrd' : m1.read8 a = m0.read8 a := hs2_rd a hru hlfu hout_l + have hlf' : m1.isLazyFree a = false := (hs2_r a hru hlfu).2 + have hmap_sw' : ((stripWx m1).perm a).mapped = true := by + rw [hperm_swx a]; exact hmap_sw + obtain ⟨_, hlf_eq', _⟩ := stripWx_mapped_props hmap_sw' + exact ⟨(stripWx_read8 _ a).trans (hrd'.trans ((stripWx_read8 m0 a).symm.trans hcell.1)), + by rw [hperm_swx a]; exact hcell.2.1, hlf_eq'.trans hlf'⟩ + | protNone b => + have hmap_sw : ((stripWx m0).perm a).mapped = true := by rw [hcell.2.1]; rfl + obtain ⟨_, hlf_eq, _⟩ := stripWx_mapped_props hmap_sw + have hlfu : m0.isLazyFree a = false := hlf_eq.symm.trans hcell.2.2 + have hmap_sw' : ((stripWx m1).perm a).mapped = true := by + rw [hperm_swx a]; exact hmap_sw + obtain ⟨_, hlf_eq', _⟩ := stripWx_mapped_props hmap_sw' + have ⟨hrd', hlf'⟩ : + m1.read8 a = m0.read8 a ∧ m1.isLazyFree a = false := by + have hpn_sw := hcell.2.1 + unfold stripWx at hpn_sw + rw [ProofLib.strip_perm, hideWx_perm] at hpn_sw + cases hpu : m0.perm a with + | none => rw [hpu] at hpn_sw; cases hpn_sw + | some p => + have ⟨hlf_p, han_p⟩ : p.lazyFree = false ∧ p.anon = true := by + have hpu0 := hpu + dsimp only [Memory.perm, Perm.rwx] at hpu0 + revert hpu0 + rcases m0.cells a with _ | ⟨_ | _, _⟩ <;> intro hpu0 <;> simp at hpu0 + subst hpu0; exact ⟨rfl, rfl⟩ + rw [hpu] at hpn_sw + rcases p with ⟨r, w, x, lf, an⟩ + dsimp only at hlf_p han_p; subst hlf_p han_p + cases r <;> cases w <;> cases x + · exact (hs2_pn a hpu hout_l).2 hlfu + · have hfz_u : m0.Frozen a := by unfold Memory.Frozen; rw [hpu]; rfl + obtain ⟨hrd0, _, hlf0, _⟩ := hkf_u a hfz_u + exact ⟨hrd0, hlf0.trans hlfu⟩ + · generalize keepLs a = ic at hpn_sw + cases ic <;> simp [ProofLib.stripPerm, Perm.protNone] at hpn_sw + · simp at hpn_sw + · generalize keepLs a = ic at hpn_sw + cases ic <;> simp [ProofLib.stripPerm, Perm.protNone] at hpn_sw + · generalize keepLs a = ic at hpn_sw + cases ic <;> simp [ProofLib.stripPerm, Perm.protNone] at hpn_sw + · generalize keepLs a = ic at hpn_sw + cases ic <;> simp [ProofLib.stripPerm, Perm.protNone] at hpn_sw + · have hru : (m0.perm a).r = true := by rw [hpu] + exact ⟨hs2_rd a hru hlfu hout_l, (hs2_r a hru hlfu).2⟩ + exact ⟨(stripWx_read8 _ a).trans (hrd'.trans ((stripWx_read8 m0 a).symm.trans hcell.1)), + (hperm_swx a).trans hcell.2.1, hlf_eq'.trans hlf'⟩ + | lazy => rw [hperm_swx a]; exact hcell + | protNoneLazy => rw [hperm_swx a]; exact hcell + · have hm0 := hm_R'.2.2 a hma + obtain ⟨hmap_u, _, han_eq⟩ := stripWx_mapped_props hm0.1 + have han_u' : m1.isAnon a = true := (hs2_anon a ⟨hmap_u, han_eq.symm.trans hm0.2⟩).2 + have hmap_swx' : ((stripWx m1).perm a).mapped = true := by + rw [hperm_swx a]; exact hm0.1 + obtain ⟨_, _, han_eq'⟩ := stripWx_mapped_props hmap_swx' + exact ⟨hmap_swx', han_eq'.trans han_u'⟩ + exact ProofLib.Satisfies.sepConj_intro hdisj_new hp_pts hp_R' + (Heap.Matches.union hm_pts_swx hm_R'_swx) + private theorem hookOk_shadowMemset_region [LibsignalPlacement] (tr0 : List State) {f_ms : State → State} (hf_ms_reg : HookOk f_ms sessionMemsetRegionSpec) (hvm_ms : ∀ s, VmPreserved s (f_ms s)) : @@ -1101,145 +1262,13 @@ private theorem hookOk_shadowMemset_region [LibsignalPlacement] (tr0 : List Stat refine ⟨⟨by rw [stripWxS_readReg64]; exact hx0_ret, by rw [stripWxS_trace, stripWxS_trace]; exact htr_u⟩, ?_⟩ rw [stripWxS_mem] - let h_pts : Heap := regionHeap dst len (stripWx (f_ms u).mem) have hrep_len : (List.replicate len val).length = len := List.length_replicate have hb_post := IsBlock.pointsToBytes_len (a := dst) hrep_len - have hp_pts : (dst ↦ₛ List.replicate len val) h_pts := - (hb_post.iff h_pts).mpr ⟨stripWx (f_ms u).mem, + have hp_pts : (dst ↦ₛ List.replicate len val) (regionHeap dst len (stripWx (f_ms u).mem)) := + (hb_post.iff _).mpr ⟨stripWx (f_ms u).mem, ⟨by rw [hrep_len]; exact hlen, by rw [hrep_len, stripWx_readBytes]; exact hread_u⟩, rfl⟩ - have hrw_f_swx : (stripWx (f_ms u).mem).RW dst len := - (stripWx_rw_iff (f_ms u).mem dst len).mpr fun a ha => hs2_u.2.1.1.1 a (hu_rw a ha) - have hm_pts_swx : h_pts.Matches (stripWx (f_ms u).mem) := - IsBlock.regionHeap_matches dst len (stripWx (f_ms u).mem) hrw_f_swx - obtain ⟨h_reg, h_R', hdisj', hp_reg, hp_R', hm_both'⟩ := Satisfies.sepConj_elim hmem' - have hm_R' : h_R'.Matches (stripWx u.mem) := Heap.Matches.of_union_right hdisj' hm_both' - obtain ⟨m_r, _, h_reg_eq⟩ := ((IsBlock.memRegion dst len).iff h_reg).mp hp_reg - have hdisj_new : h_pts.Disjoint h_R' := by - unfold Heap.Disjoint at hdisj' ⊢ - refine ⟨fun a => ?_, - fun _ _ => Or.inl (by simp [h_pts, regionHeap]), - fun _ _ => Or.inl (by simp [h_pts, regionHeap]), - (fun _ _ _ _ h => by rcases h with ⟨h0, _⟩ | ⟨_, h0⟩ <;> simp [h_pts, regionHeap] at h0), - fun _ => Or.inl (by simp [h_pts, regionHeap])⟩ - by_cases hin : InRegion dst len a - · have hr_some : h_reg.phys a = some (.rw (m_r.read8 a)) := by - rw [h_reg_eq]; simp [regionHeap, hin] - rcases hdisj'.1 a with h1 | h2 | ⟨_, h3, _⟩ - · rw [hr_some] at h1; cases h1 - · exact Or.inr (Or.inl h2) - · rw [hr_some] at h3; cases h3 - · exact Or.inl (by dsimp [h_pts]; simp [regionHeap, hin]) - have hm_R'_swx : h_R'.Matches (stripWx (f_ms u).mem) := by - unfold Heap.Disjoint at hdisj' - unfold Heap.Matches at hm_R' ⊢ - rcases hs2_u with ⟨hs2_rd, ⟨⟨_, _⟩, ⟨hs2_anon, hs2_pn⟩⟩, hs2_r⟩ - have hperm_swx : ∀ a, (stripWx (f_ms u).mem).perm a = (stripWx u.mem).perm a := - fun a => stripWx_perm_congr (hperm_u a) - refine ⟨fun a c hc => ?_, hm_R'.2.1, fun a hma => ?_⟩ - · have hout : OutsideRegion dst len a := by - by_cases hin : InRegion dst len a - · have hr_some : h_reg.phys a = some (.rw (m_r.read8 a)) := by - rw [h_reg_eq]; simp [regionHeap, hin] - rcases hdisj'.1 a with h1 | h2 | ⟨_, h3, _⟩ - · rw [hr_some] at h1; cases h1 - · rw [hc] at h2; cases h2 - · rw [hr_some] at h3; cases h3 - · exact (outsideRegion_iff_not_inRegion dst len a).mpr hin - have hout_l : ∀ r ∈ [(dst, len)], OutsideRegion r.1 r.2 a := by - intro r hr_m; simp only [List.mem_cons, List.not_mem_nil, or_false] at hr_m - subst hr_m; exact hout - have hcell := hm_R'.1 a c hc - cases c with - | rw b => - have hp_sw : (stripWx u.mem).permNoLazy a = some Perm.rw := - Memory.permNoLazy_eq_some_rw_iff.mpr ⟨hcell.2.1, hcell.2.2⟩ - obtain ⟨hpu, hlfu⟩ := - Memory.permNoLazy_eq_some_rw_iff.mp ((stripWx_permNoLazy_rw_iff u.mem a).mp hp_sw) - have hru : (u.mem.perm a).r = true := by rw [hpu]; rfl - have hrd' : (f_ms u).mem.read8 a = u.mem.read8 a := hs2_rd a hru hlfu hout_l - have hlf' : (f_ms u).mem.isLazyFree a = false := (hs2_r a hru hlfu).2 - have hpu' : (f_ms u).mem.perm a = some Perm.rw := (hperm_u a).trans hpu - obtain ⟨hp_f, hlf_f⟩ := Memory.permNoLazy_eq_some_rw_iff.mp - ((stripWx_permNoLazy_rw_iff (f_ms u).mem a).mpr - (Memory.permNoLazy_eq_some_rw_iff.mpr ⟨hpu', hlf'⟩)) - exact ⟨(stripWx_read8 _ a).trans (hrd'.trans ((stripWx_read8 u.mem a).symm.trans hcell.1)), - hp_f, hlf_f⟩ - | ro b => - have hmap_sw : ((stripWx u.mem).perm a).mapped = true := by - cases hpx : (stripWx u.mem).perm a with - | none => rw [hpx] at hcell; cases hcell.2.1 - | some _ => rfl - obtain ⟨_, hlf_eq, _⟩ := stripWx_mapped_props hmap_sw - have hlfu : u.mem.isLazyFree a = false := hlf_eq.symm.trans hcell.2.2 - have hru : (u.mem.perm a).r = true := by - have h1 := hcell.2.1 - unfold stripWx at h1 - rw [(ProofLib.strip_perm_props keepLs (hideWx u.mem) a).1, hideWx_perm] at h1 - revert h1 - rcases u.mem.perm a with _ | ⟨r, w, x, _, _⟩ <;> intro h1 - · cases h1 - · cases r <;> cases w <;> cases x <;> simp [Perm.protNone, Option.r] at h1 ⊢ - have hrd' : (f_ms u).mem.read8 a = u.mem.read8 a := hs2_rd a hru hlfu hout_l - have hlf' : (f_ms u).mem.isLazyFree a = false := (hs2_r a hru hlfu).2 - have hmap_sw' : ((stripWx (f_ms u).mem).perm a).mapped = true := by - rw [hperm_swx a]; exact hmap_sw - obtain ⟨_, hlf_eq', _⟩ := stripWx_mapped_props hmap_sw' - exact ⟨(stripWx_read8 _ a).trans (hrd'.trans ((stripWx_read8 u.mem a).symm.trans hcell.1)), - by rw [hperm_swx a]; exact hcell.2.1, hlf_eq'.trans hlf'⟩ - | protNone b => - have hmap_sw : ((stripWx u.mem).perm a).mapped = true := by rw [hcell.2.1]; rfl - obtain ⟨_, hlf_eq, _⟩ := stripWx_mapped_props hmap_sw - have hlfu : u.mem.isLazyFree a = false := hlf_eq.symm.trans hcell.2.2 - have hmap_sw' : ((stripWx (f_ms u).mem).perm a).mapped = true := by - rw [hperm_swx a]; exact hmap_sw - obtain ⟨_, hlf_eq', _⟩ := stripWx_mapped_props hmap_sw' - have ⟨hrd', hlf'⟩ : - (f_ms u).mem.read8 a = u.mem.read8 a ∧ (f_ms u).mem.isLazyFree a = false := by - have hpn_sw := hcell.2.1 - unfold stripWx at hpn_sw - rw [ProofLib.strip_perm, hideWx_perm] at hpn_sw - cases hpu : u.mem.perm a with - | none => rw [hpu] at hpn_sw; cases hpn_sw - | some p => - have ⟨hlf_p, han_p⟩ : p.lazyFree = false ∧ p.anon = true := by - have hpu0 := hpu - dsimp only [Memory.perm, Perm.rwx] at hpu0 - revert hpu0 - rcases u.mem.cells a with _ | ⟨_ | _, _⟩ <;> intro hpu0 <;> simp at hpu0 - subst hpu0; exact ⟨rfl, rfl⟩ - rw [hpu] at hpn_sw - rcases p with ⟨r, w, x, lf, an⟩ - dsimp only at hlf_p han_p; subst hlf_p han_p - cases r <;> cases w <;> cases x - · exact (hs2_pn a hpu hout_l).2 hlfu - · have hfz_u : u.mem.Frozen a := by unfold Memory.Frozen; rw [hpu]; rfl - obtain ⟨hrd0, _, hlf0, _⟩ := hkf_u a hfz_u - exact ⟨hrd0, hlf0.trans hlfu⟩ - · generalize keepLs a = ic at hpn_sw - cases ic <;> simp [ProofLib.stripPerm, Perm.protNone] at hpn_sw - · simp at hpn_sw - · generalize keepLs a = ic at hpn_sw - cases ic <;> simp [ProofLib.stripPerm, Perm.protNone] at hpn_sw - · generalize keepLs a = ic at hpn_sw - cases ic <;> simp [ProofLib.stripPerm, Perm.protNone] at hpn_sw - · generalize keepLs a = ic at hpn_sw - cases ic <;> simp [ProofLib.stripPerm, Perm.protNone] at hpn_sw - · have hru : (u.mem.perm a).r = true := by rw [hpu] - exact ⟨hs2_rd a hru hlfu hout_l, (hs2_r a hru hlfu).2⟩ - exact ⟨(stripWx_read8 _ a).trans (hrd'.trans ((stripWx_read8 u.mem a).symm.trans hcell.1)), - (hperm_swx a).trans hcell.2.1, hlf_eq'.trans hlf'⟩ - | lazy => rw [hperm_swx a]; exact hcell - | protNoneLazy => rw [hperm_swx a]; exact hcell - · have hm0 := hm_R'.2.2 a hma - obtain ⟨hmap_u, _, han_eq⟩ := stripWx_mapped_props hm0.1 - have han_u' : (f_ms u).mem.isAnon a = true := (hs2_anon a ⟨hmap_u, han_eq.symm.trans hm0.2⟩).2 - have hmap_swx' : ((stripWx (f_ms u).mem).perm a).mapped = true := by - rw [hperm_swx a]; exact hm0.1 - obtain ⟨_, _, han_eq'⟩ := stripWx_mapped_props hmap_swx' - exact ⟨hmap_swx', han_eq'.trans han_u'⟩ - exact ProofLib.Satisfies.sepConj_intro hdisj_new hp_pts hp_R' - (Heap.Matches.union hm_pts_swx hm_R'_swx) + exact stripWx_s2Frame_one_block hp_pts hmem' hu_rw hkf_u hperm_u hs2_u private theorem hookOk_shadowMemset [LibsignalPlacement] (tr0 : List State) {f_ms : State → State} (hf_ms_reg : HookOk f_ms sessionMemsetRegionSpec) @@ -1267,10 +1296,82 @@ private theorem hookOk_shadowMemset [LibsignalPlacement] (tr0 : List State) · exact False.elim (not_satisfies_false_sepConj he) · exact False.elim (not_satisfies_false_sepConj ho) +private noncomputable def shadowBlackBox [LibsignalPlacement] (tr0 : List State) + (f_bb : State → State) (s' : State) : State := + match findState tr0 s' with + | none => blackBoxHook s' + | some u => + @ite State + (s'.status = .Running ∧ s'.spAligned = true ∧ s'.mem.RW (s'.sp - 16#64) 16) + (Classical.propDecidable _) + (stripWxS (f_bb u)) + (s'.setStatus (.Exception "ext")) + +private theorem stripWxS_sp [LibsignalPlacement] (s : State) : + (stripWxS s).sp = s.sp := by cases s; rfl + +private theorem stripWxS_vmPreserved [LibsignalPlacement] {s1 s2 : State} + (h : VmPreserved s1 s2) : + VmPreserved (stripWxS s1) (stripWxS s2) := by + refine ⟨?_, ?_, fun a => ?_, ?_⟩ + · cases s1; cases s2; exact h.1 + · cases s1; cases s2; exact h.2.1 + · rw [stripWxS_mem, stripWxS_mem]; exact stripWx_perm_congr (h.2.2.1 a) + · cases s1; cases s2; exact h.2.2.2 + +private theorem hookOk_shadowBlackBox [LibsignalPlacement] (tr0 : List State) + {f_bb : State → State} (hf_bb : HookOk f_bb blackBoxSpecSat) : + HookOk (shadowBlackBox tr0 f_bb) blackBoxSpecSat := by + intro v R' s' hrun' hpre' hsp' + unfold shadowBlackBox + cases hfs : findState tr0 s' with + | none => exact blackBoxHook_ok_sat v R' s' hrun' hpre' hsp' + | some u => + have hus : stripWxS u = s' := findState_some_stripWxS hfs + have hpre_open := hpre' + dsimp only [blackBoxSpecSat, blackBoxSpec16, withVmPreserved, withStack, blackBoxSpec, + stackAt] at hpre_open + rw [sepConj_assoc, satisfies_pure_sepConj] at hpre_open + rcases hpre_open with ⟨hx0', hmem'⟩ + have hrw' : s'.mem.RW (s'.sp - 16#64) 16 := + (IsBlock.memRegion (s'.sp - 16#64) 16).rw hmem' + have hcond : s'.status = .Running ∧ s'.spAligned = true ∧ s'.mem.RW (s'.sp - 16#64) 16 := + ⟨hrun', hsp', hrw'⟩ + dsimp only [] + simp only [hcond, and_self, ↓reduceIte] + subst hus + have hu_run : u.status = .Running := by cases u; exact hrun' + have hu_sp : u.spAligned = true := by cases u; exact hsp' + have hu_x0 : u.readReg64 .x0 = v := by cases u; exact hx0' + rw [stripWxS_mem, stripWxS_sp] at hrw' hmem' + have hu_rw : u.mem.RW (u.sp - 16#64) 16 := + (stripWx_rw_iff u.mem (u.sp - 16#64) 16).mp hrw' + obtain ⟨hkf_u, hsym_u, hret_u, hcc_u, hvm_u, hx0_ret, htr_u, hs2_u⟩ := + hookOk_blackBoxSpecSat_elim hf_bb hu_run hu_x0 hu_sp hu_rw + have hkf' : (stripWxS u).mem.KeepsFrozen (stripWxS (f_bb u)).mem := by + rw [stripWxS_mem, stripWxS_mem]; exact stripWx_keepsFrozen hkf_u + have hsym' : (stripWxS (f_bb u)).symtab = (stripWxS u).symtab := by + rw [stripWxS_symtab, stripWxS_symtab]; exact hsym_u + refine ⟨hkf', hsym', Or.inl ⟨stripWxS_returned hret_u, stripWxS_ccPreserved hcc_u, ?_⟩⟩ + dsimp only [blackBoxSpecSat, blackBoxSpec16, withVmPreserved, withStack, blackBoxSpec, + stackAt] + rw [sepConj_assoc, satisfies_pure_sepConj] + refine ⟨stripWxS_vmPreserved hvm_u, ?_⟩ + rw [sepConj_assoc, satisfies_pure_sepConj] + refine ⟨⟨by rw [stripWxS_readReg64]; exact hx0_ret, + by rw [stripWxS_trace, stripWxS_trace]; exact htr_u⟩, ?_⟩ + rw [stripWxS_mem, stripWxS_sp] + have hb_post := IsBlock.memRegion (u.sp - 16#64) 16 + have hp_pts : + (memRegion (u.sp - 16#64) 16) (regionHeap (u.sp - 16#64) 16 (stripWx (f_bb u).mem)) := + (hb_post.iff _).mpr ⟨stripWx (f_bb u).mem, trivial, rfl⟩ + exact stripWx_s2Frame_one_block hp_pts hmem' hu_rw hkf_u hvm_u.perm_eq hs2_u + private noncomputable def shadowVsigHooks [LibsignalPlacement] (tr0 : List State) (H : LibsignalHooks) (n : String) : Option (State → State) := if n == lsMemcpySym then (H n).map (shadowMemcpy tr0) else if n == lsVerifyMemsetSym then (H n).map (shadowMemset tr0) + else if n == lsBlackBoxU8Sym then (H n).map (shadowBlackBox tr0) else vsigOnlyHooks H n private theorem shadowVsigHooks_memcpy [LibsignalPlacement] (tr0 : List State) @@ -1284,25 +1385,33 @@ private theorem shadowVsigHooks_memset [LibsignalPlacement] (tr0 : List State) have h1 : (lsVerifyMemsetSym == lsMemcpySym) = false := by decide simp [shadowVsigHooks, h1] +private theorem shadowVsigHooks_blackBox [LibsignalPlacement] (tr0 : List State) + (H : LibsignalHooks) : + shadowVsigHooks tr0 H lsBlackBoxU8Sym = (H lsBlackBoxU8Sym).map (shadowBlackBox tr0) := by + have h1 : (lsBlackBoxU8Sym == lsMemcpySym) = false := by decide + have h2 : (lsBlackBoxU8Sym == lsVerifyMemsetSym) = false := by decide + simp [shadowVsigHooks, h1, h2] + private theorem shadowVsigHooks_other [LibsignalPlacement] (tr0 : List State) (H : LibsignalHooks) {n : String} (h1 : (n == lsMemcpySym) = false := by decide) - (h2 : (n == lsVerifyMemsetSym) = false := by decide) : + (h2 : (n == lsVerifyMemsetSym) = false := by decide) + (h3 : (n == lsBlackBoxU8Sym) = false := by decide) : shadowVsigHooks tr0 H n = vsigOnlyHooks H n := by - simp [shadowVsigHooks, h1, h2] + simp [shadowVsigHooks, h1, h2, h3] private theorem w3VerifySigHooks_shadow [LibsignalPlacement] (tr0 : List State) (mmpl : MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (hG : CliGhostAllocHooks M A lim gh) (Y : UnreachedPqxdhPrimitives) : - VerifySignaturePlacedHooks (modelPrims Y ⟨W.C, W.Q⟩) + VerifySignaturePlacedHooksSat (modelPrims Y ⟨W.C, W.Q⟩) (shadowVsigHooks tr0 (cliGhostExterns gh (cliExternsPlaced mmpl W))) := by have hv := w3VerifySigHooks_vsigOnly mmpl gh W hG Y let H := cliGhostExterns gh (cliExternsPlaced mmpl W) refine { memcpy := ?_ memset := ?_ - blackBox := (shadowVsigHooks_other tr0 H).trans hv.blackBox + blackBox := ?_ montToEd := hookSat_of_eq (shadowVsigHooks_other tr0 H) hv.montToEd compress := hookSat_of_eq (shadowVsigHooks_other tr0 H) hv.compress edNeg := hookSat_of_eq (shadowVsigHooks_other tr0 H) hv.edNeg @@ -1319,6 +1428,11 @@ private theorem w3VerifySigHooks_shadow [LibsignalPlacement] (tr0 : List State) cliGhostExterns_memset_some gh (cliExternsPlaced mmpl W) hf exact ⟨shadowMemset tr0 f, by rw [shadowVsigHooks_memset (H := H), hH]; rfl, hookOk_shadowMemset tr0 hreg hvm pqxdhHookStack⟩ + · have hbb_sat : HookSat H lsBlackBoxU8Sym blackBoxSpecSat := + cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hG.extraOk + obtain ⟨f, hH, hok⟩ := hbb_sat + exact ⟨shadowBlackBox tr0 f, by rw [shadowVsigHooks_blackBox (H := H), hH]; rfl, + hookOk_shadowBlackBox tr0 hok⟩ /-! ### `isAnon` Preservation & Shadow Lockstep -/ @@ -1559,14 +1673,28 @@ private theorem shadowVsigHooks_findSome?_active [LibsignalPlacement] (tr0 : Lis exact ⟨f, rfl, rfl, rfl, hvm_ms s, fun a hm ha => (hs2.2.1.2.1 a ⟨hm, ha⟩).2⟩ · simp only [hcond, ↓reduceIte, status_setStatus] at hrun; cases hrun · -- lsBlackBoxU8Sym - have hrow : H lsBlackBoxU8Sym = some blackBoxHook := - cliGhost_row mmpl gh W (blackBox_row_placed mmpl W) - have hsh : shadowVsigHooks tr0 H lsBlackBoxU8Sym = some blackBoxHook := - (shadowVsigHooks_other tr0 H).trans (hk_v.trans hrow) + have hbb_sat : HookSat H lsBlackBoxU8Sym blackBoxSpecSat := + cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hG.extraOk + obtain ⟨f, hH, hok⟩ := hbb_sat + have hsh : shadowVsigHooks tr0 H lsBlackBoxU8Sym = some (shadowBlackBox tr0 f) := by + rw [shadowVsigHooks_blackBox, hH]; rfl rw [hsh] at h; injection h with hf'; subst hf' - rw [hrow]; refine ⟨blackBoxHook, rfl, rfl, by cases s; rfl, ?_, fun _ _ ha => ha⟩ - unfold blackBoxHook - exact ⟨⟨rfl, rfl, rfl⟩, rfl, fun _ => rfl, fun _ _ _ => rfl⟩ + unfold shadowBlackBox at hrun ⊢ + rw [hfs] at hrun ⊢; dsimp only [] at hrun ⊢ + by_cases hcond : (stripWxS s).status = .Running ∧ (stripWxS s).spAligned = true ∧ + (stripWxS s).mem.RW ((stripWxS s).sp - 16#64) 16 + · simp only [hcond, and_self, ↓reduceIte] + rcases hcond with ⟨hr_s', hsp_s', hrw_s'⟩ + have hu_run : s.status = .Running := by cases s; exact hr_s' + have hu_sp : s.spAligned = true := by cases s; exact hsp_s' + rw [stripWxS_mem, stripWxS_sp] at hrw_s' + have hu_rw : s.mem.RW (s.sp - 16#64) 16 := + (stripWx_rw_iff s.mem _ _).mp hrw_s' + obtain ⟨_, _, _, _, hvm, _, _, hs2⟩ := + hookOk_blackBoxSpecSat_elim hok hu_run rfl hu_sp hu_rw + rw [hH] + exact ⟨f, rfl, rfl, rfl, hvm, fun a hm ha => (hs2.2.1.2.1 a ⟨hm, ha⟩).2⟩ + · simp only [hcond, ↓reduceIte, status_setStatus] at hrun; cases hrun · -- lsVerifyMontToEdSym have hrow : H lsVerifyMontToEdSym = some (toEdwardsHook W.Q.montToEd) := cliGhost_row mmpl gh W (toEdwards_row_placed mmpl W) @@ -1677,8 +1805,12 @@ private theorem shadowVsigHooks_findSome?_active [LibsignalPlacement] (tr0 : Lis by_cases hc : (n == lsVerifyMemsetSym) = true · rw [beq_iff_eq] at hc; subst hc; simp [vsigKeepSym] at hn · simpa using hc + have hn_bb : (n == lsBlackBoxU8Sym) = false := by + by_cases hc : (n == lsBlackBoxU8Sym) = true + · rw [beq_iff_eq] at hc; subst hc; simp [vsigKeepSym] at hn + · simpa using hc have hsh_eq : shadowVsigHooks tr0 H n = vsigOnlyHooks H n := by - simp [shadowVsigHooks, hn_mc, hn_ms] + simp [shadowVsigHooks, hn_mc, hn_ms, hn_bb] rw [hsh_eq] at h cases hHn : H n with | none => @@ -1700,7 +1832,9 @@ private theorem shadowVsigHooks_isSome_eq [LibsignalPlacement] (tr0 : List State · simp [h1] · by_cases h2 : (n == lsVerifyMemsetSym) = true · simp [h1, h2] - · simp [h1, h2] + · by_cases h3 : (n == lsBlackBoxU8Sym) = true + · simp [h1, h2, h3] + · simp [h1, h2, h3] private theorem shadowVsigHooks_findSome?_isSome [LibsignalPlacement] (tr0 : List State) (H : LibsignalHooks) : @@ -2264,7 +2398,7 @@ private theorem verifySignature_203_vm_ok [LibsignalPlacement] let H := cliGhostExterns ghFixed (cliExternsPlaced mmpl W) let P := modelPrims Y ⟨W.C, W.Q⟩ have hprims := VerifySignaturePrims.of_structuralPrims (structuralPrims_initiatorModelPrims Y ⟨W.C, W.Q⟩) - have hbase0 := verifySignature_placed_ok (H := vsigOnlyHooks H) hprims + have hbase0 := verifySignature_placed_ok_sat (H := vsigOnlyHooks H) hprims (w3VerifySigHooks_vsigOnly mmpl ghFixed W hG Y) refine subroutine_ok_outcome_intro fun g R s0 hpc hrun hpre_cro hsp => ?_ obtain ⟨⟨hcl, hro⟩, hpre_vs⟩ := extract_withLsCodeRoLoaded hpre_cro @@ -2304,7 +2438,7 @@ private theorem verifySignature_203_vm_ok [LibsignalPlacement] rcases hbase0.no_fault_before_outcome g' R s0 hpc hrun hpre_P hsp hL0 with ⟨sf0, hsteps0, ⟨hret0, hcc0, hpost0⟩ | ⟨_, hp⟩ | ⟨_, _, he⟩ | ⟨_, ho⟩, _⟩ · obtain ⟨tr0, htr0⟩ := steps_to_stepsList hsteps0 - have hbase_sh := verifySignature_placed_ok (H := shadowVsigHooks tr0 H) hprims + have hbase_sh := verifySignature_placed_ok_sat (H := shadowVsigHooks tr0 H) hprims (w3VerifySigHooks_shadow tr0 mmpl ghFixed W hG Y) have hLQ : ((blkPC_203).rebase (blkPl_203).base (shadowVsigHooks tr0 H)).CodeLoaded (stripWxS s0).mem := by diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W3VerifySigBbSat.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W3VerifySigBbSat.lean new file mode 100644 index 000000000..4b34fec2e --- /dev/null +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W3VerifySigBbSat.lean @@ -0,0 +1,101 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat -- proof-setup: allow-public-import +public import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat -- proof-setup: allow-public-import +import LibsignalBinary.Proofs.TripleRatchet.Hooks.Defs +import ProofLib.SepLogic.HeapIntro + +/-! +# `HookOk` Elimination Helper for `blackBoxSpecSat` (`Hole3W3VerifySigBbSat`) + +Provides `hookOk_blackBoxSpecSat_elim`, eliminating `HookOk f blackBoxSpecSat` on any `.Running` +state `s` with `s.spAligned = true` and `s.mem.RW (s.sp - 16#64) 16` into concrete state-level +postconditions (`KeepsFrozen`, `symtab`, `Returned`, `CallingConventionPreserved`, `VmPreserved`, +`x0 = (v.setWidth 8).zeroExtend 64`, `trace`, and `S2Frame s.mem (f s).mem [(s.sp - 16#64, 16)]`). + +Used by `Hole3W3VerifySigAux` (`shadowBlackBox`, `hookOk_shadowBlackBox`, and +`shadowVsigHooks_findSome?_active`) so `w3m_verifySignature_vm_ok` discharges `lsBlackBoxU8Sym` +from `HookSat H lsBlackBoxU8Sym blackBoxSpecSat` without requiring `H lsBlackBoxU8Sym = some blackBoxHook` +or any extra `GhostRowSpecOk` field. +-/ + +public section + +set_option autoImplicit false + +namespace LibsignalBinary.Proofs.SpecLemmas.SignalSession.Hole3W3VerifySigBbSat + +open Arm64 ProofLib +open CryptoVerification.LibsignalTripleRatchet (blackBoxSpec withStack) +open CryptoVerification.LibsignalTripleRatchet.Extract + (S2Frame disjoint_fullComplementHeap fullComplementHeap matches_fullComplementHeap) +open LibsignalBinary.Heap (VmPreserved) +open LibsignalBinary.Heap.SpecBudget (withVmPreserved) +open LibsignalBinary.Proofs.ConsumeMessageKey.FindIndexProofs.CtEqSat + (blackBoxSpec16 blackBoxSpecSat) +open LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonSat (isBlock_one_s2frame) + +/-- Execute a `HookOk f blackBoxSpecSat` hook on a state `s` with `s.mem.RW (s.sp - 16#64) 16`, +yielding `KeepsFrozen`, `symtab`, `Returned`, `CallingConventionPreserved`, `VmPreserved`, +`s'.readReg64 .x0 = (v.setWidth 8).zeroExtend 64`, `s'.trace = s.trace`, and +`S2Frame s.mem s'.mem [(s.sp - 16#64, 16)]`. -/ +public theorem hookOk_blackBoxSpecSat_elim {f : State → State} + (hf : HookOk f blackBoxSpecSat) + {s : State} {v : BitVec 64} + (hrun : s.status = .Running) + (hx0 : s.readReg64 .x0 = v) + (hsp_al : s.spAligned = true) + (hrw : s.mem.RW (s.sp - 16#64) 16) : + let s' := f s + s.mem.KeepsFrozen s'.mem ∧ + s'.symtab = s.symtab ∧ + Returned s s' ∧ + CallingConventionPreserved s s' ∧ + VmPreserved s s' ∧ + s'.readReg64 .x0 = (v.setWidth 8).zeroExtend 64 ∧ + s'.trace = s.trace ∧ + S2Frame s.mem s'.mem [(s.sp - 16#64, 16)] := by + let dst := s.sp - 16#64 + have hb_pre := IsBlock.memRegion dst 16 + let hP : Heap := regionHeap dst 16 s.mem + have hpP : (memRegion dst 16) hP := (hb_pre.iff hP).mpr ⟨s.mem, trivial, rfl⟩ + have hmP : hP.Matches s.mem := IsBlock.regionHeap_matches dst 16 s.mem hrw + let R_comp : SepProp := ⟨fun h => h = fullComplementHeap hP s.mem⟩ + have hsep_pre : s.mem ⊨ memRegion dst 16 ∗ R_comp := + Satisfies.sepConj_intro (disjoint_fullComplementHeap hP s.mem) hpP rfl + (Heap.Matches.union hmP (matches_fullComplementHeap hP s.mem)) + have hpre_full : s.mem ⊨ blackBoxSpecSat.pre v s ∗ R_comp := by + dsimp only [blackBoxSpecSat, blackBoxSpec16, withVmPreserved, withStack, blackBoxSpec, stackAt] + rw [sepConj_assoc, satisfies_pure_sepConj] + exact ⟨hx0, hsep_pre⟩ + obtain ⟨hkf, hsym, hout⟩ := hf v R_comp s hrun hpre_full hsp_al + rcases hout with ⟨hret, hcc, hpost⟩ | ⟨_, hp⟩ | ⟨_, _, he⟩ | ⟨_, ho⟩ + · dsimp only [blackBoxSpecSat, blackBoxSpec16, withVmPreserved, withStack, blackBoxSpec, stackAt] + at hpost + rw [sepConj_assoc, satisfies_pure_sepConj] at hpost + obtain ⟨hvm, hpost1⟩ := hpost + rw [sepConj_assoc, satisfies_pure_sepConj] at hpost1 + obtain ⟨⟨hx0', htr'⟩, hsep_post⟩ := hpost1 + have hpost_R : (f s).mem ⊨ R_comp ∗ memRegion dst 16 := by + rwa [sepConj_comm] at hsep_post + have hm_post : (fullComplementHeap hP s.mem).Matches (f s).mem := by + obtain ⟨hc', _, _, hR_hc', _, hmatch⟩ := Satisfies.sepConj_elim hpost_R + cases hR_hc' + exact Heap.Matches.of_union_left hmatch + have hs2 : S2Frame s.mem (f s).mem [(dst, 16)] := + isBlock_one_s2frame hb_pre hb_pre hpP hmP hsep_post hm_post + exact ⟨hkf, hsym, hret, hcc, hvm, hx0', htr', hs2⟩ + · exact False.elim (not_satisfies_false_sepConj hp) + · exact False.elim (not_satisfies_false_sepConj he) + · exact False.elim (not_satisfies_false_sepConj ho) + +end LibsignalBinary.Proofs.SpecLemmas.SignalSession.Hole3W3VerifySigBbSat diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W4DecPkR2.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W4DecPkR2.lean index 825cd3101..87ce3b029 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W4DecPkR2.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W4DecPkR2.lean @@ -66,6 +66,7 @@ import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2DefsBud import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2DefsPlacedBudget import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Mid3PlacedBudget import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Sub2 import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Sub5AuxPlacedBudget import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Sub5DefsPlacedBudget @@ -2434,7 +2435,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( stageP2PostP1At stageP3CoroFrameAt stageP3StackFrameAt x29_eq_sp0_sub_60 x29_eq_sp_add_c70 ) open CryptoVerification.SignalSession.Cli.Slots ( - FilesOkPeer blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced scopeIn scopeKit + FilesOkPeer cliGhostExterns_sat_of_cliExternsPlaced scopeIn scopeKit ) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (noAllocShimBudgetSpec) open LibsignalBinary.Heap ( @@ -2480,7 +2481,10 @@ open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2DefsPlace ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget ( InitializeBobV1OptFieldsEnv initializeBobSession_err_owned_4k_placed_ok_on_stageP1 - isSameAccount_4k_placed_ok_on_stageP1 stageP2PureCalleesPlaced4K_of_hooks + stageP2PureCalleesPlaced4K_of_hooks +) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat ( + isSameAccount_4k_placed_ok_on_stageP1_sat ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Mid3PlacedBudget ( P2Sub1To4Arm3Env P2Sub1To4Env P2Sub1To4OkEnv P2Sub4OkEnv @@ -2894,10 +2898,9 @@ private theorem stageP2PathCOver_qpan_cli_regErr_full_placed_at_of_seams_aux_pri hh.codecHooks.alloc hh.codecHooks.dealloc (cliExternsPlaced_sessionMemcpy_budget_sat mmpl gh W hG allocHookStack) - (isSameAccount_4k_placed_ok_on_stageP1 - ((cliGhostExterns_other gh _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W))) + (isSameAccount_4k_placed_ok_on_stageP1_sat + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_blackBoxSat_budget_sat + gh (cliExternsPlaced mmpl W) hG.extraOk) (uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) have hMemcpyVm := LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_framelessMemcpy_budget_sat @@ -3347,7 +3350,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( stageP2PostP1At stageP3CoroFrameAt stageP3StackFrameAt ) open CryptoVerification.SignalSession.Cli.Slots ( - FilesOkPeer blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced scopeIn scopeKit + FilesOkPeer cliGhostExterns_sat_of_cliExternsPlaced scopeIn scopeKit ) open LibsignalBinary.Heap ( AllocCostModel AllocEvent BudgetLimits FitsEnv FreeOnlyEvs @@ -3581,7 +3584,7 @@ private theorem stageP2Over_qpan_cli_memInv_placed_at_B_of_pathC_priv {Φ : Memo hfs hCode1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 herr hok have hh' : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, hh.utf8, hh.memrchr, - hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, hh.blackBox⟩ have hr_scope : scopeIn r := hsub r (CryptoVerification.SignalSession.Cli.RunProofs.Poll.scope_of_loadRec_some hfPeer hload) exact hPathC S Scope y st_b g1 r s_old s0 s1 sp rngPtr v_a8 v_b8 v_d0 Q Qpan @@ -3698,7 +3701,7 @@ private theorem stageP2Over_qpan_cli_regErr_placed_at_of_pathC_priv {Φ : Memory hfs hCode1 htr01 hsp1 hsp0 hsp_sub hpc1 hrun1 halign1 hregs1 herr have hh' : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, hh.utf8, hh.memrchr, - hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, hh.blackBox⟩ have hr_scope : scopeIn r := hsub r (CryptoVerification.SignalSession.Cli.RunProofs.Poll.scope_of_loadRec_some hfPeer hload) exact hPathC S Scope y hRegErr st_b g1 r s_old s0 s1 sp rngPtr v_a8 v_b8 v_d0 Q Qpan @@ -4005,8 +4008,7 @@ open LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.Clos open LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget ( CliGhostAllocHooks cliExternsPlaced_alloc_budget_sat cliExternsPlaced_dealloc_budget_sat cliExternsPlaced_noAllocShim_budget_sat cliExternsPlaced_realloc_budget_sat - cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_sessionMemmove_budget_sat - cliExternsPlaced_shim_budget_sat + cliExternsPlaced_sessionMemcpyRegion_budget_sat cliExternsPlaced_shim_budget_sat ) open LibsignalBinary.Proofs.SignalSession.Cli.SpecsPlacedBudget (AllocContractsXCliPlaced) open LibsignalBinary.Proofs.SignalSession.Cli.SpqrV1PlacedSeamsBudget (SpqrV1PlacedSeams) @@ -9525,7 +9527,8 @@ theorem w4r2_poll_d2c_customP3_seqFree_frozen_at [LibsignalFullPlacement] (PromEnv := PromoteOverArchiveEnv) (w4r2_stageP2PathCOver_archive_frozen_at_cliRunBudgets A lim ReadEnv X mmpl gh W hDropNz hG hSpqr hRead (fun _ _ _ h => h) (fun _ _ _ h => h) (fun _ _ _ h => h)) - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W) + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hG.extraOk)) (fun hh' => LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteOverGen_archive_placed_ok mmpl gh W hh' (cliGrowOneVecU8_lsProg51_withLsCl_ok_w4r2priv mmpl gh W hG) hRaw) @@ -9549,7 +9552,8 @@ theorem w4r2_poll_d2c_customP3_seqFree_frozen_at [LibsignalFullPlacement] cliPollKpk_kitPlacedOk mmpl gh W cliRunBudgets F0 kpkId spkId kbk hDropNz hh_sk hRead) (fun F0 _ _ _ opkWord _ hh_sk => cliPollPk_kitPlacedOk mmpl gh W cliRunBudgets F0 opkWord hDropNz hh_sk hRead)) - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W) + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hG.extraOk)) (fun hh' => LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteOverGen_archive_placed_ok mmpl gh W hh' (cliGrowOneVecU8_lsProg51_withLsCl_ok_w4r2priv mmpl gh W hG) hRaw) @@ -9876,7 +9880,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( stageP2PostP1At stageP3CoroFrameAt stageP3StackFrameAt x29_eq_sp0_sub_60 x29_eq_sp_add_c70 ) open CryptoVerification.SignalSession.Cli.Slots ( - FilesOkPeer blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced scopeIn scopeKit + FilesOkPeer cliGhostExterns_sat_of_cliExternsPlaced scopeIn scopeKit ) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (noAllocShimBudgetSpec) open LibsignalBinary.Heap ( @@ -9922,7 +9926,10 @@ open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2DefsPlace ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget ( InitializeBobV1OptFieldsEnv initializeBobSession_err_owned_4k_placed_ok_on_stageP1 - isSameAccount_4k_placed_ok_on_stageP1 stageP2PureCalleesPlaced4K_of_hooks + stageP2PureCalleesPlaced4K_of_hooks +) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat ( + isSameAccount_4k_placed_ok_on_stageP1_sat ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Mid3PlacedBudget ( P2Sub1To4Arm3Env P2Sub1To4Env P2Sub1To4OkEnv P2Sub4OkEnv @@ -10159,10 +10166,9 @@ private theorem stageP2PathCOver_qpan_cli_regErr_full_placed_at_of_init75_aux_pr hh.codecHooks.alloc hh.codecHooks.dealloc (cliExternsPlaced_sessionMemcpy_budget_sat mmpl gh W hG allocHookStack) - (isSameAccount_4k_placed_ok_on_stageP1 - ((cliGhostExterns_other gh _ (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W))) + (isSameAccount_4k_placed_ok_on_stageP1_sat + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_blackBoxSat_budget_sat + gh (cliExternsPlaced mmpl W) hG.extraOk) (uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) have hMemcpyVm := LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliExternsPlaced_framelessMemcpy_budget_sat @@ -10612,7 +10618,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( stageP2PostP1At stageP3CoroFrameAt stageP3StackFrameAt ) open CryptoVerification.SignalSession.Cli.Slots ( - FilesOkPeer blackBox_row_placed cliGhostExterns_sat_of_cliExternsPlaced scopeIn scopeKit + FilesOkPeer cliGhostExterns_sat_of_cliExternsPlaced scopeIn scopeKit ) open LibsignalBinary.Heap ( AllocCostModel AllocEvent BudgetLimits FitsEnv FreeOnlyEvs @@ -12499,7 +12505,8 @@ theorem w4r2_poll_d2c_customP3_seqFree_frozen_at_of_init75 [LibsignalFullPlaceme stageP2Over_qpan_cli_memInv_placed_at_B_of_pathC_priv (PromEnv := PromoteOverArchiveEnv) hP2Over_pathC - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W) + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hG.extraOk)) (fun hh' => LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteOverGen_archive_placed_ok mmpl gh W hh' (cliGrowOneVecU8_lsProg51_withLsCl_ok_w4r2priv mmpl gh W hG) hRaw) @@ -12523,7 +12530,8 @@ theorem w4r2_poll_d2c_customP3_seqFree_frozen_at_of_init75 [LibsignalFullPlaceme cliPollKpk_kitPlacedOk mmpl gh W cliRunBudgets F0 kpkId spkId kbk hDropNz hh_sk hRead) (fun F0 _ _ _ opkWord _ hh_sk => cliPollPk_kitPlacedOk mmpl gh W cliRunBudgets F0 opkWord hDropNz hh_sk hRead)) - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W) + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hG.extraOk)) (fun hh' => LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteOverGen_archive_placed_ok mmpl gh W hh' (cliGrowOneVecU8_lsProg51_withLsCl_ok_w4r2priv mmpl gh W hG) hRaw) @@ -17820,7 +17828,8 @@ theorem w4r2_poll_d2c_customP3_gvSeqFree_frozen_at [LibsignalFullPlacement] (PromEnv := PromoteOverArchiveEnv) (w4r2_stageP2PathCOver_archive_frozen_at_cliRunBudgets A lim ReadEnv X mmpl gh W hDropNz hG hSpqr hRead (fun _ _ _ h => h) (fun _ _ _ h => h) (fun _ _ _ h => h)) - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W) + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hG.extraOk)) (fun hh' => LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteOverGen_archive_placed_ok mmpl gh W hh' (cliGrowOneVecU8_lsProg51_withLsCl_ok_w4r2priv mmpl gh W hG) hRaw) @@ -17844,7 +17853,8 @@ theorem w4r2_poll_d2c_customP3_gvSeqFree_frozen_at [LibsignalFullPlacement] cliPollKpk_kitPlacedOk mmpl gh W cliRunBudgets F0 kpkId spkId kbk hDropNz hh_sk hRead) (fun F0 _ _ _ opkWord _ hh_sk => cliPollPk_kitPlacedOk mmpl gh W cliRunBudgets F0 opkWord hDropNz hh_sk hRead)) - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W) + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hG.extraOk)) (fun hh' => LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteOverGen_archive_placed_ok mmpl gh W hh' (cliGrowOneVecU8_lsProg51_withLsCl_ok_w4r2priv mmpl gh W hG) hRaw) @@ -18044,7 +18054,8 @@ theorem w4r2_poll_d2c_customP3_gvSeqFree_frozen_at_of_init75 [LibsignalFullPlace stageP2Over_qpan_cli_memInv_placed_at_B_of_pathC_priv (PromEnv := PromoteOverArchiveEnv) hP2Over_pathC - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W) + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hG.extraOk)) (fun hh' => LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteOverGen_archive_placed_ok mmpl gh W hh' (cliGrowOneVecU8_lsProg51_withLsCl_ok_w4r2priv mmpl gh W hG) hRaw) @@ -18068,7 +18079,8 @@ theorem w4r2_poll_d2c_customP3_gvSeqFree_frozen_at_of_init75 [LibsignalFullPlace cliPollKpk_kitPlacedOk mmpl gh W cliRunBudgets F0 kpkId spkId kbk hDropNz hh_sk hRead) (fun F0 _ _ _ opkWord _ hh_sk => cliPollPk_kitPlacedOk mmpl gh W cliRunBudgets F0 opkWord hDropNz hh_sk hRead)) - (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W) + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteMatchingMissGen_placed_ok A.repAlloc mmpl gh W + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_blackBoxSat_budget_sat gh (cliExternsPlaced mmpl W) hG.extraOk)) (fun hh' => LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Over.Stage2OverInstPlacedBudget.cliPromoteOverGen_archive_placed_ok mmpl gh W hh' (cliGrowOneVecU8_lsProg51_withLsCl_ok_w4r2priv mmpl gh W hG) hRaw) diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W4DecPkWire.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W4DecPkWire.lean index 70fa800cc..f46515f33 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W4DecPkWire.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W4DecPkWire.lean @@ -18,6 +18,7 @@ public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.Hole3W4DecPkFresh import Arm64.Trusted.Spec.SepLogic import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep +import LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat import LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.StagesInst.ResponderCanonicalPlacedBudget import ProofLib import ProofLib.SepLogic.WPp @@ -126,7 +127,7 @@ open CryptoVerification.SignalSession.Cli.RunProofs.Poll ( ) open CryptoVerification.SignalSession.Cli.RunSkeleton (RunBudgets) open CryptoVerification.SignalSession.Cli.Slots ( - FilesOkPeer blackBox_row_placed scopeIn scopeKit + FilesOkPeer scopeIn scopeKit ) open CryptoVerification.SpqrV1.Top.InitialState (InitialStateGhost) open LibsignalBinary.Heap ( @@ -143,9 +144,12 @@ open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2Mid3Place ) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudget ( InitializeBobV1OptFieldsEnv initializeBobSession_ok_v1_of_env_4k_frozen_placed_on_stageP1 - isSameAccount_4k_placed_ok_on_stageP1 p2_errOwned_frozen_to_defs4K_placed + p2_errOwned_frozen_to_defs4K_placed stageP2BaseCalleesPlaced4K_of_hooks ) +open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2PurePlacedBudgetSat ( + isSameAccount_4k_placed_ok_on_stageP1_sat +) open LibsignalBinary.Proofs.Cli.E2E.Pqxdh.ResponderClosure.Kits.StageP2V1PlacedBudget ( P2Sub6Env P2V1Arm4Env P2V1Arm5EnvOfAcceptErr P2V1Arm6EnvOfBob P2V1OkEnvOfBob stageP2_v1_kits_frozen_ext_defs_placed_ofEnv @@ -397,18 +401,17 @@ private theorem hookSat_sessionMemcpyBudget_of_vm_w4wire private theorem cliStageP2BaseCalleesPlaced4K_w4wire [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} (mmpl : MultiPlacement) (gh : CliGhostHooks) (W : CliHooks) - (hh : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W))) : + (hh : RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W))) + (hOk : LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.ExtraGhostSpecs.ExtraSpecOk gh) : StageP2BaseCalleesPlaced4K A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := stageP2BaseCalleesPlaced4K_of_hooks (hookSat_noAllocShimBudget_of_withVmPreserved_w4wire hh.codecHooks.shim) hh.codecHooks.alloc hh.codecHooks.dealloc (hookSat_sessionMemcpyBudget_of_vm_w4wire allocHookStack hh.codecHooks.memcpy) - (isSameAccount_4k_placed_ok_on_stageP1 - ((cliGhostExterns_other gh _ (sym := CryptoVerification.lsBlackBoxU8Sym) - (by decide) (by decide) (by decide) (by decide) (by decide) - (by decide) (by decide) (by decide) (by decide) (by decide)).trans - (cliExternsPlaced_row mmpl W (blackBox_row_placed mmpl W))) + (isSameAccount_4k_placed_ok_on_stageP1_sat + (LibsignalBinary.Proofs.SignalSession.Cli.Run.Slots.CliHookSatPlacedBudget.cliGhostExterns_blackBoxSat_budget_sat + gh (cliExternsPlaced mmpl W) hOk) (uuidTryParse_placed_vm_code_ok (cliGhostExterns gh (cliExternsPlaced mmpl W)))) private theorem cliInitBobV1FrozenOkPlaced4K_of_init75_w4wire [LibsignalFullPlacement] @@ -707,7 +710,7 @@ private theorem stageP2PathA_qpan_cli_full_placed_at_of_init75_w4wire [Libsignal (Qp := fun sf Pf => Steps (dpPollProgPlaced (cliGhostExterns gh (cliExternsPlaced mmpl W))) s1 sf → Qpan sf Pf) (cliGhostExterns gh (cliExternsPlaced mmpl W)) (cliModelPrims_structural X W) (cliStageP2ClosureHooksPlaced mmpl gh W hh) - (cliStageP2BaseCalleesPlaced4K_w4wire mmpl gh W hh) + (cliStageP2BaseCalleesPlaced4K_w4wire mmpl gh W hh hG.extraOk) (cliInitBobErrOwnedFrozen4K_ok_w4wire X mmpl gh W hh hG) (cliInitBobV1FrozenOkPlaced4K_of_init75_w4wire X mmpl gh W hh hG hInit75) (cliPollIdKitPlaced A.repAlloc y.g.F y.g.peer (cliKitStk B)) @@ -1194,7 +1197,7 @@ private theorem stageP2PathCOver_qpan_cli_full_placed_at_of_init75_aux_w4wire [L let err0 : ApiError AddrVal Unit := .protocol .invalidKeyAgreement have herr0_p : err0 ≠ .panic := by nofun have herr0_s : err0 ≠ .store () := by nofun - have hPure4K := cliStageP2BaseCalleesPlaced4K_w4wire mmpl gh W hh + have hPure4K := cliStageP2BaseCalleesPlaced4K_w4wire mmpl gh W hh hG.extraOk have hInitBobErrOwned := cliInitBobErrOwnedFrozen4K_ok_w4wire X mmpl gh W hh hG exact stageP2_over_v1_kits_frozen_ext_defs_placed_ofEnv (M := M) diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W4DecPkWireStep2.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W4DecPkWireStep2.lean index eaa2b53fc..dc41fc0bd 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W4DecPkWireStep2.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Hole3W4DecPkWireStep2.lean @@ -59,6 +59,7 @@ public import LibsignalBinary.Proofs.SpqrV1.Top.Recv.DefsPlacedBudget public import LibsignalBinary.Proofs.SpqrV1.Top.Recv.FinalPlacedBudget public meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep import LibsignalBinary.Proofs.Common.SharedHelpers +import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove import LibsignalBinary.Proofs.SpqrV1.States.Recv.TopPlacedBudgetSat import LibsignalBinary.Proofs.SpqrV1Sync.Codec.PbState import LibsignalBinary.Proofs.SpqrV1Sync.SendTotal.BraidCodec @@ -131,6 +132,7 @@ open LibsignalBinary.Heap open LibsignalBinary.Heap.Fine (fineCostModel fineHookRustCliAllocBudget) open LibsignalBinary.Heap.SpecBudget (FmtWriteEnv FormatInnerEnv) open LibsignalBinary.Proofs.Cli.SpqrV1.M4.TryDecryptPV1TrapPlacedBudget (TryDecryptCliEnvOf) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open LibsignalBinary.Proofs.PeakBudget.CliFitsTraceArith (cliBudgetLimits) open LibsignalBinary.Proofs.PeakBudget.DecPkD2cSlotOkLinked (TryDecryptCliEnvOfPure tryDecryptCmkSeg4Env tryDecryptEnvArgsToGhost) @@ -549,14 +551,16 @@ private theorem w4s2_spqrRecv_topStateGuarded_seam_of_contracts [LibsignalPlacem private theorem w4s2_hookSat_withAllocVmPreserved_memmove_of_zero {H : String → Option (State → State)} {sym : String} (hookStack : Nat) - (h : HookSat H sym (withAllocVmPreserved (sessionMemmoveSpec 0))) : - HookSat H sym (withAllocVmPreserved (sessionMemmoveSpec hookStack)) := by + (h : HookSat H sym (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) : + HookSat H sym (withAllocVmPreserved (sessionMemmoveBoundedSpec hookStack)) := by refine ProofLib.HookSat.mono h fun ⟨base, buf, dst, src, len⟩ R s0 hpre => ⟨(base, buf, dst, src, len), stackAt s0.sp hookStack ∗ R, ?_, fun sf hpost => ?_⟩ - · dsimp only [withAllocVmPreserved, sessionMemmoveSpec, libcMemmoveSpec, stackAt] at hpre ⊢ + · dsimp only [withAllocVmPreserved, sessionMemmoveBoundedSpec, + sessionMemmoveSpec, libcMemmoveSpec, stackAt] at hpre ⊢ simp only [ProofLib.memRegion_zero, sepConj_emp] ac_nf at hpre ⊢ - · dsimp only [withAllocVmPreserved, sessionMemmoveSpec, stackAt] at hpost ⊢ + · dsimp only [withAllocVmPreserved, sessionMemmoveBoundedSpec, + sessionMemmoveSpec, stackAt] at hpost ⊢ simp only [ProofLib.memRegion_zero, sepConj_emp] at hpost ac_nf at hpost ⊢ @@ -587,7 +591,7 @@ private theorem w4s2_statesRecv_recv_exactTight_ok [LibsignalPlacement] (cliRecvCt2PlacedAllocExt mmpl gh W hA hExt) (w4s2_hookSat_withAllocVmPreserved_memmove_of_zero growOneStack (hookSat_of_eq (hExt_wp _ (by decide)) - (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W))) + (cliExternsPlaced_sessionMemmove_allocVm_sat mmpl gh W hA.extraOk))) hmemset_wp (hookSat_of_eq (hExt_wp _ (by decide)) (hookSat_of_eq (cliGhostExterns_other gh _ diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ValidMatchDecPkSlot.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ValidMatchDecPkSlot.lean index 4e09bc348..aad37185b 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ValidMatchDecPkSlot.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ValidMatchDecPkSlot.lean @@ -1334,7 +1334,8 @@ theorem s2pv_decPk_d3_validMatch_poll_frozen_placedBudget [LibsignalFullPlacemen LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, - hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, + hh.blackBox⟩ let σ := cliKitStk B let pid := pmPreKeyId y.g.msg let sid := y.g.msg.signedPreKeyId diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ValidMatchDecPkSlotSeqFree.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ValidMatchDecPkSlotSeqFree.lean index 0323f99b7..8f19354a7 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ValidMatchDecPkSlotSeqFree.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/ValidMatchDecPkSlotSeqFree.lean @@ -2239,7 +2239,8 @@ theorem h10b_decPk_d3_validMatch_seqFree_poll_frozen_placedBudget [LibsignalFull LibsignalBinary.Proofs.SignalSession.Cli.Run.Proofs.DecryptPrekey.Poll.ClosureStagesStmtPlacedBudget.RunHooksPlaced A lim (cliGhostExterns gh (cliExternsPlaced mmpl W)) := ⟨hh.alloc, hh.allocFs, hh.panics, hh.memcpyRO, hh.bcmp, hh.fs, - hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner⟩ + hh.utf8, hh.memrchr, hh.codecHooks, hh.allocZeroed, hh.stringClone, hh.formatInner, + hh.blackBox⟩ let σ := cliKitStk B let pid := pmPreKeyId y.g.msg let sid := y.g.msg.signedPreKeyId diff --git a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Wp4LayoutGen.lean b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Wp4LayoutGen.lean index 6a7707001..6d8f202b8 100644 --- a/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Wp4LayoutGen.lean +++ b/LibsignalBinary/Proofs/SpecLemmas/SignalSession/Wp4LayoutGen.lean @@ -16,7 +16,7 @@ public import Arm64 **Checked by Lean. Untrusted (`Role::Proof`).** Auto-generated by `scripts/stock-pin/regen_layout.py --emit-wp4-defs-lean` (`mode = stock`, -`sha256 = 2f20c836342437a882b5882c34eab604e4f23b2b388c2b2a0696eeda51cddc7e`). +`sha256 = 50066cbd732256eb5f19f93d1d98800914336b7926225de3ebfa0bb37eca98ce`). Emits the concrete `hole2_keepSub` (interval minus the 5 hooked `.text` symbol ranges on stock), `hole2_keep`, `h2sl_keepExec`, `hole2_str1Prog` tail, stub-range & block-621..623 bounds, @@ -74,10 +74,7 @@ abbrev wp4HandleErrorAddr : BitVec 64 := 0x468964#64 (`memmove`, `bcmp`, `strlen`, `write_file`, `write_stdout`). -/ def wp4HookedText5Ranges : List (String × String × Nat × Nat) := [ ("write_file", "_RNvCs9Xul1Kjr0QF_16libsignal_cli_io10write_file", 0x468724, 0x468854), - ("write_stdout", "_RNvCs9Xul1Kjr0QF_16libsignal_cli_io12write_stdout", 0x468854, 0x46890c), - ("memmove", "memmove", 0x468a4c, 0x468b74), - ("bcmp", "bcmp", 0x468ba8, 0x468bac), - ("strlen", "strlen", 0x468bac, 0x468c04) + ("write_stdout", "_RNvCs9Xul1Kjr0QF_16libsignal_cli_io12write_stdout", 0x468854, 0x46890c) ] /-- Disjoint `[lo, hi)` intervals of `hole2_keepSub` after subtracting the 5 hooked `.text` ranges. -/ @@ -87,10 +84,7 @@ def hole2_keepSub (a : BitVec 64) : Bool := decide ( (0x469000 ≤ a.toNat ∧ a.toNat < 0x46f000) ∧ ¬ ((0x468724 ≤ a.toNat ∧ a.toNat < 0x468854) ∨ - (0x468854 ≤ a.toNat ∧ a.toNat < 0x46890c) ∨ - (0x468a4c ≤ a.toNat ∧ a.toNat < 0x468b74) ∨ - (0x468ba8 ≤ a.toNat ∧ a.toNat < 0x468bac) ∨ - (0x468bac ≤ a.toNat ∧ a.toNat < 0x468c04))) + (0x468854 ≤ a.toNat ∧ a.toNat < 0x46890c))) /-- Disjoint-interval form of `hole2_keepSub` (extensionally equal to `hole2_keepSub`). -/ def hole2_keepSubByIntervals (a : BitVec 64) : Bool := @@ -104,10 +98,7 @@ def h2sl_keepExec (a : BitVec 64) : Bool := (0x4686a0 ≤ a.toNat ∧ a.toNat < 0x468724) ∨ ((0x469000 ≤ a.toNat ∧ a.toNat < 0x46f000) ∧ ¬ ((0x468724 ≤ a.toNat ∧ a.toNat < 0x468854) ∨ - (0x468854 ≤ a.toNat ∧ a.toNat < 0x46890c) ∨ - (0x468a4c ≤ a.toNat ∧ a.toNat < 0x468b74) ∨ - (0x468ba8 ≤ a.toNat ∧ a.toNat < 0x468bac) ∨ - (0x468bac ≤ a.toNat ∧ a.toNat < 0x468c04)))) + (0x468854 ≤ a.toNat ∧ a.toNat < 0x46890c)))) /-- Appended `.img.text` branch-stub bytes after block `623` (`8` B on snapshot; `[]` on stock `--no-relax`). -/ def hole2_str1TailBytes : List (BitVec 8) := @@ -156,7 +147,7 @@ def h2fsreads_muslFullMpl : MultiPlacement where /-- Complete `139`-row `(snapstubName, externSym, stockProviderKind, resolvedVa)` mapping table. -/ def wp4SnapstubToStockTable : List (String × String × String × BitVec 64) := [ - ("extern_0", "_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek", "extern_stubs_clean_udf0", 0x46890c#64), + ("extern_0", "_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek", "dehooked_lib2_rx_b", 0x46ea94#64), ("extern_1", "_RINvNtCskxtBwYRO61I_4core9panicking13assert_failedjjEB4_", "extern_stubs_clean_udf0", 0x468910#64), ("extern_2", "_RINvNtCskxtBwYRO61I_4core9panicking13assert_failedyyEB4_", "extern_stubs_clean_udf0", 0x468914#64), ("extern_3", "_RNvCs1njKG4L9aB3_7___rustc12___rust_alloc", "rdl_shim_thunk", 0x469630#64), @@ -176,7 +167,7 @@ def wp4SnapstubToStockTable : List (String × String × String × BitVec 64) := ("extern_17", "_RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes9from_seed", "extern_stubs_clean_udf0", 0x46892c#64), ("extern_18", "_RNvMs0_NtNtNtNtCsfr5T3GFabw_3std3sys4sync4once5futexNtB5_4Once4call", "extern_stubs_clean_udf0", 0x468930#64), ("extern_19", "_RNvMs5_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPoint10to_edwards", "extern_stubs_clean_udf0", 0x468934#64), - ("extern_20", "_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since", "extern_stubs_clean_udf0", 0x468938#64), + ("extern_20", "_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since", "dehooked_lib2_rx_b", 0x46ea44#64), ("extern_21", "_RNvMs6_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecret14diffie_hellman", "extern_stubs_clean_udf0", 0x46893c#64), ("extern_22", "_RNvMsa_NtCskxtBwYRO61I_4core3fmtNtB5_9Formatter25debug_tuple_field1_finish", "extern_stubs_clean_udf0", 0x468940#64), ("extern_23", "_RNvMsa_NtCskxtBwYRO61I_4core3fmtNtB5_9Formatter26debug_struct_field2_finish", "extern_stubs_clean_udf0", 0x468944#64), @@ -209,9 +200,9 @@ def wp4SnapstubToStockTable : List (String × String × String × BitVec 64) := ("extern_50", "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber11encapsulate", "extern_stubs_clean_udf0", 0x4689b0#64), ("extern_51", "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber17generate_key_pair", "extern_stubs_clean_udf0", 0x4689b4#64), ("extern_52", "_RNvNtNtCsfr5T3GFabw_3std4sync9lazy_lock14panic_poisoned", "extern_stubs_clean_udf0", 0x4689b8#64), - ("extern_53", "_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8", "extern_stubs_clean_udf0", 0x4689bc#64), + ("extern_53", "_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8", "dehooked_lib2_rx_b", 0x46e6e4#64), ("extern_54", "_RNvNtNtCskxtBwYRO61I_4core5slice5index16slice_index_fail", "extern_stubs_clean_udf0", 0x4689c0#64), - ("extern_55", "_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr", "extern_stubs_clean_udf0", 0x4689c4#64), + ("extern_55", "_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr", "dehooked_lib2_rx_b", 0x46e5bc#64), ("extern_56", "_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_add_overflow", "extern_stubs_clean_udf0", 0x4689c8#64), ("extern_57", "_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_mul_overflow", "extern_stubs_clean_udf0", 0x4689cc#64), ("extern_58", "_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_shl_overflow", "extern_stubs_clean_udf0", 0x4689d0#64), @@ -221,7 +212,7 @@ def wp4SnapstubToStockTable : List (String × String × String × BitVec 64) := ("extern_62", "_RNvNvNtCs69KKACWg7bl_5alloc3fmt6format12format_inner", "extern_stubs_clean_udf0", 0x4689e0#64), ("extern_63", "_RNvXNtNtNtCskxtBwYRO61I_4core3fmt3num3imphNtB6_7Display3fmt", "extern_stubs_clean_udf0", 0x4689e4#64), ("extern_64", "_RNvXs0_NtCs4Dv7yoBiUx4_3log13___private_apiNtB5_12GlobalLoggerNtB7_3Log3log", "extern_stubs_clean_udf0", 0x4689e8#64), - ("extern_65", "_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add", "extern_stubs_clean_udf0", 0x4689ec#64), + ("extern_65", "_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add", "dehooked_lib2_rx_b", 0x46eca4#64), ("extern_66", "_RNvXs6_NtNtCskxtBwYRO61I_4core3fmt3numjNtB7_8LowerHex3fmt", "extern_stubs_clean_udf0", 0x4689f0#64), ("extern_67", "_RNvXs8_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_9PublicKeyINtNtCskxtBwYRO61I_4core7convert4FromRNtB5_12StaticSecretE4from", "extern_stubs_clean_udf0", 0x4689f4#64), ("extern_68", "_RNvXs8_NtNtCskxtBwYRO61I_4core3fmt3numjNtB7_8UpperHex3fmt", "extern_stubs_clean_udf0", 0x4689f8#64), @@ -229,9 +220,9 @@ def wp4SnapstubToStockTable : List (String × String × String × BitVec 64) := ("extern_70", "_RNvXsX_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsRNtNtB7_6scalar6ScalarINtNtNtCskxtBwYRO61I_4core3ops5arith3MulRNtB5_21EdwardsBasepointTableE3mul", "extern_stubs_clean_udf0", 0x468a00#64), ("extern_71", "_RNvXs_CsdZv6vxPi7MZ_3hexNtB4_15BytesToHexCharsNtNtNtNtCskxtBwYRO61I_4core4iter6traits8iterator8Iterator4next", "extern_stubs_clean_udf0", 0x468a04#64), ("extern_72", "_RNvXs_CsdZv6vxPi7MZ_3hexNtB4_15BytesToHexCharsNtNtNtNtCskxtBwYRO61I_4core4iter6traits8iterator8Iterator9size_hint", "extern_stubs_clean_udf0", 0x468a08#64), - ("extern_73", "_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", "extern_stubs_clean_udf0", 0x468a0c#64), + ("extern_73", "_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", "dehooked_lib2_rx_b", 0x46eba8#64), ("extern_74", "_RNvXsd_NtNtNtCskxtBwYRO61I_4core3fmt3num3impyNtB9_7Display3fmt", "extern_stubs_clean_udf0", 0x468a10#64), - ("extern_75", "_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", "extern_stubs_clean_udf0", 0x468a14#64), + ("extern_75", "_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", "dehooked_lib2_rx_b", 0x46eba4#64), ("extern_76", "_RNvXse_NtNtCskxtBwYRO61I_4core3fmt3numhNtB7_8LowerHex3fmt", "extern_stubs_clean_udf0", 0x468a18#64), ("extern_77", "_RNvXsg_NtNtCskxtBwYRO61I_4core3fmt3numhNtB7_8UpperHex3fmt", "extern_stubs_clean_udf0", 0x468a1c#64), ("extern_78", "_RNvXsh_NtCskxtBwYRO61I_4core3fmteNtB5_5Debug3fmt", "extern_stubs_clean_udf0", 0x468a20#64), @@ -244,12 +235,87 @@ def wp4SnapstubToStockTable : List (String × String × String × BitVec 64) := ("extern_85", "__aarch64_cas8_acq_rel", "atomic_udf0_stub", 0x468a3c#64), ("extern_86", "__aarch64_ldadd8_rel", "atomic_udf0_stub", 0x468a40#64), ("extern_87", "__aarch64_ldadd8_relax", "atomic_udf0_stub", 0x468a44#64), - ("extern_88", "bcmp", "hooked_libc_string", 0x468ba8#64), + ("extern_88", "bcmp", "dehooked_libc_mem", 0x469a40#64), ("extern_89", "libsignal_session_rng_fill", "extern_stubs_clean_udf0", 0x468a48#64), ("extern_90", "memcpy", "dehooked_libc_mem", 0x469650#64), - ("extern_91", "memmove", "hooked_libc_string", 0x468a4c#64), + ("extern_91", "memmove", "dehooked_libc_mem", 0x4698e4#64), ("extern_92", "memset", "dehooked_libc_mem", 0x4697e0#64), - ("extern_93", "strlen", "hooked_libc_string", 0x468bac#64) + ("extern_93", "strlen", "dehooked_libc_mem", 0x469a44#64) ] +/-! ### Cutover-2 (`C2`) Section Bounds, Dehooked Symbol Lists & `.rodata.lib2` Addresses -/ + +abbrev c2TextBPreLo : BitVec 64 := 0x469000#64 +abbrev c2TextBPreHi : BitVec 64 := 0x469a9c#64 +abbrev c2Lib2TextLo : BitVec 64 := 0x46e5bc#64 +abbrev c2Lib2TextHi : BitVec 64 := 0x46ed04#64 +abbrev c2Lib2RoLo : BitVec 64 := 0x409550#64 +abbrev c2Lib2RoHi : BitVec 64 := 0x409796#64 +abbrev c2FirstExternStubAddr : BitVec 64 := 0x46890c#64 +abbrev c2StartupLrLit : BitVec 64 := 0x46b750#64 + +def c2TextBPreDehookedSyms : List String := [ + "_RNvCs9Xul1Kjr0QF_16libsignal_cli_io10read_stdin", + "_RNvCs9Xul1Kjr0QF_16libsignal_cli_io9read_file", + "_RNvCs1njKG4L9aB3_7___rustc12___rust_alloc", + "_RNvCs1njKG4L9aB3_7___rustc14___rust_dealloc", + "_RNvCs1njKG4L9aB3_7___rustc14___rust_realloc", + "_RNvCs1njKG4L9aB3_7___rustc19___rust_alloc_zeroed", + "_RNvCs1njKG4L9aB3_7___rustc35___rust_no_alloc_shim_is_unstable_v2", + "memcpy", + "memset", + "memmove", + "bcmp", + "strlen" +] + +def c2BatchLDehookedSyms : List String := [ + "memmove", + "bcmp", + "strlen" +] + +def c2Lib2DehookedSyms : List String := [ + "_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr", + "_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8", + "_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since", + "_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek", + "_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + "_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + "_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add" +] + +def c2RxDehookedSyms : List String := + c2TextBPreDehookedSyms ++ c2Lib2DehookedSyms + +abbrev c2MemrchrAddr : BitVec 64 := 0x46e5bc#64 +abbrev c2MemrchrByteLen : Nat := 296 +abbrev c2FromUtf8Addr : BitVec 64 := 0x46e6e4#64 +abbrev c2FromUtf8ByteLen : Nat := 624 +abbrev c2DurationSinceAddr : BitVec 64 := 0x46ea44#64 +abbrev c2DurationSinceByteLen : Nat := 80 +abbrev c2TimeAddAddr : BitVec 64 := 0x46eca4#64 +abbrev c2TimeAddByteLen : Nat := 96 +abbrev c2BlackBoxAddr : BitVec 64 := 0x46ea94#64 +abbrev c2BlackBoxByteLen : Nat := 20 +abbrev c2SharedSecretDropAddr : BitVec 64 := 0x46eba4#64 +abbrev c2SharedSecretDropByteLen : Nat := 4 +abbrev c2StaticSecretDropAddr : BitVec 64 := 0x46eba8#64 +abbrev c2StaticSecretDropByteLen : Nat := 252 +abbrev c2SubTimespecAddr : BitVec 64 := 0x46e954#64 +abbrev c2SubTimespecByteLen : Nat := 240 +abbrev c2Zeroize32Addr : BitVec 64 := 0x46eaa8#64 +abbrev c2Zeroize32ByteLen : Nat := 252 +abbrev c2MemmoveAddr : BitVec 64 := 0x4698e4#64 +abbrev c2MemmoveByteLen : Nat := 296 +abbrev c2MemcmpAddr : BitVec 64 := 0x469a0c#64 +abbrev c2MemcmpByteLen : Nat := 52 +abbrev c2BcmpAddr : BitVec 64 := 0x469a40#64 +abbrev c2BcmpByteLen : Nat := 4 +abbrev c2StrlenAddr : BitVec 64 := 0x469a44#64 +abbrev c2StrlenByteLen : Nat := 88 + +abbrev c2FromUtf8TableAddr : BitVec 64 := 0x409632#64 +abbrev c2DurationSinceCst16Addr : BitVec 64 := 0x409740#64 + end LibsignalBinary.Proofs.SpecLemmas.SignalSession.Wp4LayoutGen diff --git a/LibsignalBinary/Proofs/SpqrV1/Alloc/VecDequeGrowBudget.lean b/LibsignalBinary/Proofs/SpqrV1/Alloc/VecDequeGrowBudget.lean index fa88cc135..01c510478 100644 --- a/LibsignalBinary/Proofs/SpqrV1/Alloc/VecDequeGrowBudget.lean +++ b/LibsignalBinary/Proofs/SpqrV1/Alloc/VecDequeGrowBudget.lean @@ -139,6 +139,10 @@ theorem hookMemmove_sessionMemmoveAcp_ok (hookStack : Nat := 4096) : HookOk hookMemmove (sessionMemmoveAcpSpec hookStack) := VecDequeGrowBudgetAux.hookMemmove_sessionMemmoveAcp_ok hookStack +export LibsignalBinary.Proofs.SpqrV1.Alloc.VecDequeGrowBudgetAux ( + sessionMemmoveBoundedAcpSpec hookMemmove_sessionMemmoveBoundedAcp_ok +) + abbrev finishGrow8ZeroCellsAcpSpecG := VecDequeGrowBudgetAux.finishGrow8ZeroCellsAcpSpecG abbrev finishGrow8NeCellsAcpSpecG := VecDequeGrowBudgetAux.finishGrow8NeCellsAcpSpecG abbrev growOneChainEpochBsAcpSpecWithStack := @@ -416,9 +420,21 @@ private theorem grow_one_chain_epoch_call_acp_placed_ok_of_bs [LibsignalPlacemen exact ⟨⟨hq.2.1.1, hq.2.1.2, hq.1⟩, hq.2.2⟩ · exact Or.inr hfail -private def sessionMemmoveFrontToEndCallAcpSpec (hookStack : Nat) : - Spec (BitVec 64 × List (BitVec 8) × Nat × BitVec 64) where - pre := fun (base, bs_front, uninitLen, gsp) s0 => +private theorem live_noWrap {M : AllocCostModel} (A : RustCliAllocBudget M) + (p : BitVec 64) (n al : Nat) : + A.live p n al ⊢ ⌜p.toNat + n < 2 ^ 64⌝ ∗ A.live p n al := by + refine Entails.trans (A.block_valid p n al) ?_ + apply Entails.pure_left + rintro ⟨_, _, hnw, _⟩ + exact Entails.pure_right hnw (Entails.refl _) + +private structure NoWrapFact (p : BitVec 64) (sz : Nat) : Prop where + out : p.toNat + sz < 2 ^ 64 + +private def sessionMemmoveFrontToEndCallAcpSpec + (base : BitVec 64) (bs_front : List (BitVec 8)) (uninitLen : Nat) (gsp : BitVec 64) + (hookStack : Nat) : Spec Unit where + pre := fun () s0 => ⌜s0.readReg64 .x0 = base + BitVec.ofNat 64 uninitLen ∧ s0.readReg64 .x1 = base ∧ (s0.readReg64 .x2).toNat = bs_front.length ∧ @@ -426,7 +442,7 @@ private def sessionMemmoveFrontToEndCallAcpSpec (hookStack : Nat) : (base ↦ₛ bs_front) ∗ memRegion (base + BitVec.ofNat 64 bs_front.length) uninitLen ∗ stackAt gsp hookStack - post := fun (base, bs_front, uninitLen, gsp) s0 sf => + post := fun () s0 sf => ⌜sf.readReg64 .x0 = base + BitVec.ofNat 64 uninitLen ∧ AllocCallPreserved s0 sf ∧ VmPreserved s0 sf⌝ ∗ memRegion base uninitLen ∗ @@ -434,10 +450,14 @@ private def sessionMemmoveFrontToEndCallAcpSpec (hookStack : Nat) : stackAt gsp hookStack private theorem session_memmove_front_to_end_call_acp_ok {prog : Program} {addr : BitVec 64} - {hookStack : Nat} (hmm : subroutine_ok prog addr (sessionMemmoveAcpSpec hookStack)) : - subroutine_ok prog addr (sessionMemmoveFrontToEndCallAcpSpec hookStack) := by + {hookStack : Nat} (hmm : subroutine_ok prog addr (sessionMemmoveBoundedAcpSpec hookStack)) + (base : BitVec 64) (bs_front : List (BitVec 8)) (uninitLen : Nat) (gsp : BitVec 64) + (hnw : base.toNat + bs_front.length + uninitLen ≤ 2 ^ 64) + (hlt63 : bs_front.length + uninitLen < 2 ^ 63) : + subroutine_ok prog addr + (sessionMemmoveFrontToEndCallAcpSpec base bs_front uninitLen gsp hookStack) := by have hfe := session_memmove_front_to_end_acp_ok hmm - refine subroutine_ok_outcome_intro fun ⟨base, bs_front, uninitLen, gsp⟩ R s0 hpc hrun hpre hsp => ?_ + refine subroutine_ok_outcome_intro fun () R s0 hpc hrun hpre hsp => ?_ simp only [sessionMemmoveFrontToEndCallAcpSpec, sepConj_assoc, satisfies_pure_sepConj] at hpre rcases hpre with ⟨⟨hx0, hx1, hx2, hgsp, huninit⟩, hmem⟩ subst hgsp @@ -446,7 +466,7 @@ private theorem session_memmove_front_to_end_call_acp_ok {prog : Program} {addr (base, bs_front, uninitLen) s0 ∗ R := by simp only [VecDequeGrowBudgetAux.sessionMemmoveFrontToEndAcpSpec, sepConj_assoc, satisfies_pure_sepConj] - exact ⟨⟨hx0, hx1, hx2, huninit⟩, hmem⟩ + exact ⟨⟨hx0, hx1, hx2, huninit, hnw, hlt63⟩, hmem⟩ exact hfe.mono_outcome (base, bs_front, uninitLen) R s0 hpc hrun hpre' hsp fun _ hout => hout private def growOneChainEpochFullCallAcpSpecG (M : AllocCostModel) (A : RustCliAllocBudget M) @@ -491,6 +511,75 @@ private theorem grow_one_chain_epoch_full_call_acp_placed_ok_of_bs [LibsignalPla exact ⟨⟨hx0, hgsp, Nat.le_refl _, hptr, hmax, hfits⟩, hmem⟩ exact hg.mono_outcome (v, cap, ptr, bs, gsp, st) R s0 hpc hrun hpre' hsp fun _ hout => hout +private def growOneChainEpochFullNwCallAcpSpecG (M : AllocCostModel) (A : RustCliAllocBudget M) + (lim : BudgetLimits) : + Spec (BitVec 64 × BitVec 64 × BitVec 64 × List (BitVec 8) × BitVec 64 × M.σ) := + { growOneChainEpochFullCallAcpSpecG M A lim with + post := fun (v, cap, _ptr, bs, gsp, st) s0 sf => + ∃∗ p' : BitVec 64, + ⌜p' ≠ 0#64 ∧ p'.toNat % 8 = 0 ∧ AllocCallPreserved s0 sf ∧ + NoWrapFact p' (max (2 * cap.toNat) 4 * 112)⌝ ∗ + (v ↦₆₄ BitVec.ofNat 64 (max (2 * cap.toNat) 4)) ∗ ((v + 8#64) ↦₆₄ p') ∗ + A.live p' (max (2 * cap.toNat) 4 * 112) 8 ∗ (p' ↦ₛ bs) ∗ + memRegion (p' + BitVec.ofNat 64 bs.length) (max (2 * cap.toNat) 4 * 112 - bs.length) ∗ + A.pool lim (M.stepEvents (growOneStrideEvents cap 112 8) st) sf ∗ + stackAt gsp growOneStack } + +private theorem grow_one_chain_epoch_full_nw_call_acp_placed_ok_of_bs [LibsignalPlacement] + {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} + {P : Program} {addr : BitVec 64} + (hbs : subroutine_ok P addr + (withLsCodeLoaded lsmpl (growOneChainEpochBsAcpSpec M A lim))) : + subroutine_ok P addr + (withLsCodeLoaded lsmpl (growOneChainEpochFullNwCallAcpSpecG M A lim)) := by + have hf := grow_one_chain_epoch_full_call_acp_placed_ok_of_bs hbs + refine subroutine_ok_outcome_intro fun x R s0 hpc hrun hpre hsp => ?_ + refine hf.mono_outcome x R s0 hpc hrun hpre hsp fun sf hout => ?_ + rcases hout with ⟨hret, hcc, hq⟩ | hfail + · refine Or.inl ⟨hret, hcc, ?_⟩ + rcases x with ⟨v, cap, ptr, bs, gsp, st⟩ + simp only [growOneChainEpochFullCallAcpSpecG, + growOneChainEpochFullNwCallAcpSpecG, + sepExists_sepConj_left, satisfies_sepExists] at hq ⊢ + rcases hq with ⟨p', hq⟩ + refine ⟨p', ?_⟩ + have hent : + (⌜p' ≠ 0#64 ∧ p'.toNat % 8 = 0 ∧ AllocCallPreserved s0 sf⌝ ∗ + (v ↦₆₄ BitVec.ofNat 64 (max (2 * cap.toNat) 4)) ∗ ((v + 8#64) ↦₆₄ p') ∗ + A.live p' (max (2 * cap.toNat) 4 * 112) 8 ∗ (p' ↦ₛ bs) ∗ + memRegion (p' + BitVec.ofNat 64 bs.length) (max (2 * cap.toNat) 4 * 112 - bs.length) ∗ + A.pool lim (M.stepEvents (growOneStrideEvents cap 112 8) st) sf ∗ + stackAt gsp growOneStack) ⊢ + (⌜p' ≠ 0#64 ∧ p'.toNat % 8 = 0 ∧ AllocCallPreserved s0 sf ∧ + NoWrapFact p' (max (2 * cap.toNat) 4 * 112)⌝ ∗ + (v ↦₆₄ BitVec.ofNat 64 (max (2 * cap.toNat) 4)) ∗ ((v + 8#64) ↦₆₄ p') ∗ + A.live p' (max (2 * cap.toNat) 4 * 112) 8 ∗ (p' ↦ₛ bs) ∗ + memRegion (p' + BitVec.ofNat 64 bs.length) (max (2 * cap.toNat) 4 * 112 - bs.length) ∗ + A.pool lim (M.stepEvents (growOneStrideEvents cap 112 8) st) sf ∗ + stackAt gsp growOneStack) := by + apply Entails.pure_left + rintro ⟨hp1, hp2, hp3⟩ + refine Entails.trans + (sepConj_mono_right (sepConj_mono_right (sepConj_mono_left + (live_noWrap A p' (max (2 * cap.toNat) 4 * 112) 8)))) ?_ + rw [show ((v ↦₆₄ BitVec.ofNat 64 (max (2 * cap.toNat) 4)) ∗ ((v + 8#64) ↦₆₄ p') ∗ + (⌜p'.toNat + max (2 * cap.toNat) 4 * 112 < 2 ^ 64⌝ ∗ + A.live p' (max (2 * cap.toNat) 4 * 112) 8) ∗ (p' ↦ₛ bs) ∗ + memRegion (p' + BitVec.ofNat 64 bs.length) (max (2 * cap.toNat) 4 * 112 - bs.length) ∗ + A.pool lim (M.stepEvents (growOneStrideEvents cap 112 8) st) sf ∗ + stackAt gsp growOneStack) = + ⌜p'.toNat + max (2 * cap.toNat) 4 * 112 < 2 ^ 64⌝ ∗ + ((v ↦₆₄ BitVec.ofNat 64 (max (2 * cap.toNat) 4)) ∗ ((v + 8#64) ↦₆₄ p') ∗ + A.live p' (max (2 * cap.toNat) 4 * 112) 8 ∗ (p' ↦ₛ bs) ∗ + memRegion (p' + BitVec.ofNat 64 bs.length) (max (2 * cap.toNat) 4 * 112 - bs.length) ∗ + A.pool lim (M.stepEvents (growOneStrideEvents cap 112 8) st) sf ∗ + stackAt gsp growOneStack) by sep_ac_rfl] + apply Entails.pure_left + intro hnw + exact Entails.pure_right ⟨hp1, hp2, hp3, ⟨hnw⟩⟩ (Entails.refl _) + exact Satisfies.mono (sepConj_mono_left hent) hq + · exact Or.inr hfail + /-- Block 353 meets `withLsCodeLoaded lsmpl (vecDequeGrowNonwrapBsSpec M A lim)`. -/ theorem vec_deque_grow_nonwrap_bs_placed_ok_of_grow [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -684,6 +773,99 @@ theorem vec_deque_grow_wrap_memcpy_bs_placed_ok [LibsignalPlacement] {M : AllocC (grow_one_chain_epoch_bs_acp_placed_ok h_panic hshim halloc hrealloc) (spqr_hook_ok_of_mem hmc) +private theorem wrap_mm_sub_head (cap head : BitVec 64) : cap - (cap - head) = head := by bv_arith + +private theorem wrap_mm_sub_newHead {cap head : BitVec 64} + (hhead_lt : head.toNat < cap.toNat) + (hmax : max (2 * cap.toNat) 4 * 112 + 8 ≤ 2 ^ 63) : + BitVec.ofNat 64 (max (2 * cap.toNat) 4) - (cap - head) = + BitVec.ofNat 64 (max (2 * cap.toNat) 4 - (cap.toNat - head.toNat)) := by + have hnc : (BitVec.ofNat 64 (max (2 * cap.toNat) 4)).toNat = max (2 * cap.toNat) 4 := by + rw [BitVec.toNat_ofNat, Nat.mod_eq_of_lt (by omega)] + have hch : (cap - head).toNat = cap.toNat - head.toNat := + BitVec.toNat_sub_of_le (by rw [BitVec.le_def]; omega) + have hle_nc : cap - head ≤ BitVec.ofNat 64 (max (2 * cap.toNat) 4) := by + rw [BitVec.le_def, hch, hnc]; omega + apply BitVec.eq_of_toNat_eq + rw [BitVec.toNat_sub_of_le hle_nc, hnc, hch, + BitVec.toNat_ofNat, Nat.mod_eq_of_lt (by omega)] + +private theorem wrap_mm_shift_front {cap head : BitVec 64} + (hhead_lt : head.toNat < cap.toNat) + (hmax : max (2 * cap.toNat) 4 * 112 + 8 ≤ 2 ^ 63) : + ((cap - head) <<< 7 - (cap - head) <<< 4).toNat = (cap.toNat - head.toNat) * 112 := by + have hch : (cap - head).toNat = cap.toNat - head.toNat := + BitVec.toNat_sub_of_le (by rw [BitVec.le_def]; omega) + rw [← hch] + exact shift_128_sub_16_toNat (by omega) + +private theorem wrap_mm_madd_newHead (v0 cap head : BitVec 64) + (hhead_lt : head.toNat < cap.toNat) + (hmax : max (2 * cap.toNat) 4 * 112 + 8 ≤ 2 ^ 63) : + v0 + BitVec.ofNat 64 (max (2 * cap.toNat) 4 - (cap.toNat - head.toNat)) * 112#64 = + v0 + BitVec.ofNat 64 (head.toNat * 112) + + BitVec.ofNat 64 ((max (2 * cap.toNat) 4 - cap.toNat) * 112) := by + have h1 := madd_112_eq v0 + (BitVec.ofNat 64 (max (2 * cap.toNat) 4 - (cap.toNat - head.toNat))) (by + rw [BitVec.toNat_ofNat, Nat.mod_eq_of_lt (by omega)]; omega) + rw [h1, BitVec.toNat_ofNat, Nat.mod_eq_of_lt (by omega), + BitVec.add_assoc, ← BitVec.ofNat_add, ← Nat.add_mul] + congr 2; omega + +private theorem wrap_mm_reg_eq (v0 cap head : BitVec 64) (bs_back bs_front : List (BitVec 8)) + (hhead_lt : head.toNat < cap.toNat) + (hbs_back : bs_back.length = head.toNat * 112) + (hbs_front : bs_front.length = (cap.toNat - head.toNat) * 112) : + memRegion (v0 + BitVec.ofNat 64 (bs_back ++ bs_front).length) + (max (2 * cap.toNat) 4 * 112 - (bs_back ++ bs_front).length) = + memRegion (v0 + BitVec.ofNat 64 (head.toNat * 112) + BitVec.ofNat 64 bs_front.length) + ((max (2 * cap.toNat) 4 - cap.toNat) * 112) := by + have hbs_len : (bs_back ++ bs_front).length = cap.toNat * 112 := by + rw [List.length_append, hbs_back, hbs_front]; omega + rw [hbs_len, hbs_front, ← Nat.sub_mul, BitVec.add_assoc, ← BitVec.ofNat_add, ← Nat.add_mul] + congr 3; omega + +private theorem wrap_mm_base_nw (w cap head : BitVec 64) (bs_front : List (BitVec 8)) + (hhead_lt : head.toNat < cap.toNat) + (hbs_front : bs_front.length = (cap.toNat - head.toNat) * 112) + (hmax : max (2 * cap.toNat) 4 * 112 + 8 ≤ 2 ^ 63) + (hnw : NoWrapFact w (max (2 * cap.toNat) 4 * 112)) : + (w + BitVec.ofNat 64 (head.toNat * 112)).toNat + bs_front.length + + (max (2 * cap.toNat) 4 - cap.toNat) * 112 ≤ 2 ^ 64 := by + have hnw_buf := hnw.out + have hsplit_max : + head.toNat * 112 + (cap.toNat - head.toNat) * 112 + + (max (2 * cap.toNat) 4 - cap.toNat) * 112 = max (2 * cap.toNat) 4 * 112 := by + have h1 : head.toNat * 112 + (cap.toNat - head.toNat) * 112 = cap.toNat * 112 := by + rw [← Nat.add_mul]; exact congrArg (· * 112) (by omega) + rw [h1, ← Nat.add_mul]; exact congrArg (· * 112) (by omega) + have hmod1 : head.toNat * 112 < 2 ^ 64 := by omega + have hmod2 : w.toNat + head.toNat * 112 < 2 ^ 64 := by omega + have hw_add : + (w + BitVec.ofNat 64 (head.toNat * 112)).toNat = w.toNat + head.toNat * 112 := by + rw [BitVec.toNat_add, BitVec.toNat_ofNat, Nat.mod_eq_of_lt hmod1, Nat.mod_eq_of_lt hmod2] + rw [hw_add, hbs_front]; omega + +private theorem wrap_mm_len_lt63 (cap head : BitVec 64) (bs_front : List (BitVec 8)) + (hhead_lt : head.toNat < cap.toNat) + (hbs_front : bs_front.length = (cap.toNat - head.toNat) * 112) + (hmax : max (2 * cap.toNat) 4 * 112 + 8 ≤ 2 ^ 63) : + bs_front.length + (max (2 * cap.toNat) 4 - cap.toNat) * 112 < 2 ^ 63 := by + have hsplit_max : + head.toNat * 112 + (cap.toNat - head.toNat) * 112 + + (max (2 * cap.toNat) 4 - cap.toNat) * 112 = max (2 * cap.toNat) 4 * 112 := by + have h1 : head.toNat * 112 + (cap.toNat - head.toNat) * 112 = cap.toNat * 112 := by + rw [← Nat.add_mul]; exact congrArg (· * 112) (by omega) + rw [h1, ← Nat.add_mul]; exact congrArg (· * 112) (by omega) + rw [hbs_front]; omega + +private theorem wrap_mm_off_nh (v0 cap head : BitVec 64) (hhead_lt : head.toNat < cap.toNat) : + v0 + BitVec.ofNat 64 (head.toNat * 112) + + BitVec.ofNat 64 ((max (2 * cap.toNat) 4 - cap.toNat) * 112) = + v0 + BitVec.ofNat 64 ((max (2 * cap.toNat) 4 - (cap.toNat - head.toNat)) * 112) := by + rw [BitVec.add_assoc, ← BitVec.ofNat_add, ← Nat.add_mul] + congr 2; omega + /-- Block 353 meets `withLsCodeLoaded lsmpl (vecDequeGrowWrapMemmoveBsSpec M A lim)`. -/ theorem vec_deque_grow_wrap_memmove_bs_placed_ok_of_grow [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} @@ -691,11 +873,10 @@ theorem vec_deque_grow_wrap_memmove_bs_placed_ok_of_grow [LibsignalPlacement] {M (hgrow : subroutine_ok ((blkPC_356).rebase (blkPl_356).base H) (blkPl_356).base (withLsCodeLoaded lsmpl (growOneChainEpochBsAcpSpec M A lim))) (hmm : subroutine_ok ((blkPC_353).rebase (blkPl_353).base H) - (lsρ spqrMemmoveSym) (sessionMemmoveAcpSpec growOneStack)) : + (lsρ spqrMemmoveSym) (sessionMemmoveBoundedAcpSpec growOneStack)) : subroutine_ok ((blkPC_353).rebase (blkPl_353).base H) (blkPl_353).base (withLsCodeLoaded lsmpl (vecDequeGrowWrapMemmoveBsSpec M A lim)) := by - have hmm_fe := session_memmove_front_to_end_call_acp_ok hmm unfold withLsCodeLoaded vecDequeGrowWrapMemmoveBsSpec simp only [stackAt_vecDequeGrow, sepExists_sepConj_left, sepExists_sepConj_right] cells_unfold @@ -715,73 +896,45 @@ theorem vec_deque_grow_wrap_memmove_bs_placed_ok_of_grow [LibsignalPlacement] {M rw [List.length_append, hbs_back, hbs_front]; omega have hule1 := vec_deque_wrap_ule_false (cap := cap) hhead_pos have hule2 := vec_deque_memmove_branch hhead_lt hbranch - have hsub_head : cap - (cap - head) = head := by bv_arith - have hnc : (BitVec.ofNat 64 (max (2 * cap.toNat) 4)).toNat = max (2 * cap.toNat) 4 := by - rw [BitVec.toNat_ofNat, Nat.mod_eq_of_lt (by omega)] - have hch : (cap - head).toNat = cap.toNat - head.toNat := - BitVec.toNat_sub_of_le (by rw [BitVec.le_def]; omega) - have hle_nc : cap - head ≤ BitVec.ofNat 64 (max (2 * cap.toNat) 4) := by - rw [BitVec.le_def, hch, hnc]; omega - have hsub_newHead : - BitVec.ofNat 64 (max (2 * cap.toNat) 4) - (cap - head) = - BitVec.ofNat 64 (max (2 * cap.toNat) 4 - (cap.toNat - head.toNat)) := by - apply BitVec.eq_of_toNat_eq - rw [BitVec.toNat_sub_of_le hle_nc, hnc, hch, - BitVec.toNat_ofNat, Nat.mod_eq_of_lt (by omega)] - have hshift_front : ((cap - head) <<< 7 - (cap - head) <<< 4).toNat = - (cap.toNat - head.toNat) * 112 := by - rw [← hch] - exact shift_128_sub_16_toNat (by omega) + have hsub_head := wrap_mm_sub_head cap head + have hsub_newHead := wrap_mm_sub_newHead hhead_lt hmax + have hshift_front := wrap_mm_shift_front hhead_lt hmax apply sepWP_seq_lscl hcl (mid := lsmpl.base 356) wp_steps_sync_pool (lsmpl.base 356) simp only [State.setMem_setMem] refine SepWP.done (by wp_norm_lhs) (by wp_norm_lhs) ?_ intro hcl_m have hgrow_call := lscall_blk_cl (callerProg := (blkPC_353).rebase (blkPl_353).base H) - (grow_one_chain_epoch_full_call_acp_placed_ok_of_bs hgrow) hcl_m + (grow_one_chain_epoch_full_nw_call_acp_placed_ok_of_bs hgrow) hcl_m wp_call hgrow_call (d, cap, ptr, bs_back ++ bs_front, s0.sp - 32#64, st) let v0 := w + have hnw_w : NoWrapFact w (max (2 * cap.toNat) 4 * 112) := by assumption have hacp_sm : AllocCallPreserved s0 sf := acp_chain_acp ‹AllocCallPreserved _ sf› (by simp only [arm64_norm, wp_norm, allocCallPreserved_self]) have hmadd_head : v0 + head * 112#64 = v0 + BitVec.ofNat 64 (head.toNat * 112) := madd_112_eq v0 head (by omega) - have hmadd_newHead : - v0 + BitVec.ofNat 64 (max (2 * cap.toNat) 4 - (cap.toNat - head.toNat)) * 112#64 = - v0 + BitVec.ofNat 64 (head.toNat * 112) + - BitVec.ofNat 64 ((max (2 * cap.toNat) 4 - cap.toNat) * 112) := by - have h1 := madd_112_eq v0 - (BitVec.ofNat 64 (max (2 * cap.toNat) 4 - (cap.toNat - head.toNat))) (by - rw [BitVec.toNat_ofNat, Nat.mod_eq_of_lt (by omega)]; omega) - rw [h1, BitVec.toNat_ofNat, Nat.mod_eq_of_lt (by omega), - BitVec.add_assoc, ← BitVec.ofNat_add, ← Nat.add_mul] - congr 2; omega + have hmadd_newHead := wrap_mm_madd_newHead v0 cap head hhead_lt hmax have hsplit_bs : (v0 ↦ₛ (bs_back ++ bs_front)) = (v0 ↦ₛ bs_back) ∗ ((v0 + BitVec.ofNat 64 (head.toNat * 112)) ↦ₛ bs_front) := by rw [pointsToBytes_append, hbs_back] - have hreg_eq : - memRegion (v0 + BitVec.ofNat 64 (bs_back ++ bs_front).length) - (max (2 * cap.toNat) 4 * 112 - (bs_back ++ bs_front).length) = - memRegion (v0 + BitVec.ofNat 64 (head.toNat * 112) + BitVec.ofNat 64 bs_front.length) - ((max (2 * cap.toNat) 4 - cap.toNat) * 112) := by - rw [hbs_len, hbs_front, ← Nat.sub_mul, BitVec.add_assoc, ← BitVec.ofNat_add, ← Nat.add_mul] - congr 3; omega + have hreg_eq := wrap_mm_reg_eq v0 cap head bs_back bs_front hhead_lt hbs_back hbs_front wp_conv_pre => rw [hsplit_bs, hreg_eq] wp_steps_sync_pool (lsρ spqrMemmoveSym) simp only [State.setMem_setMem] - wp_call hmm_fe (v0 + BitVec.ofNat 64 (head.toNat * 112), bs_front, - (max (2 * cap.toNat) 4 - cap.toNat) * 112, s0.sp - 32#64) + have hmm_fe := session_memmove_front_to_end_call_acp_ok hmm + (v0 + BitVec.ofNat 64 (head.toNat * 112)) bs_front + ((max (2 * cap.toNat) 4 - cap.toNat) * 112) (s0.sp - 32#64) + (wrap_mm_base_nw w cap head bs_front hhead_lt hbs_front hmax hnw_w) + (wrap_mm_len_lt63 cap head bs_front hhead_lt hbs_front hmax) + wp_call hmm_fe () + clear hnw_w hmm_fe have hacp_sf1 : AllocCallPreserved s0 sf_1 := acp_chain_acp ‹AllocCallPreserved _ sf_1› (by simp only [arm64_norm, wp_norm, hacp_sm]) have htr_sf1 : sf_1.trace = s0.trace := hacp_sf1.2.1 rcases hacp_sf1 with ⟨_, _, _, _, _, _, _⟩ rw [← A.pool_of_vmPreserved ‹VmPreserved _ sf_1›] - have hoff_nh : - v0 + BitVec.ofNat 64 (head.toNat * 112) + - BitVec.ofNat 64 ((max (2 * cap.toNat) 4 - cap.toNat) * 112) = - v0 + BitVec.ofNat 64 ((max (2 * cap.toNat) 4 - (cap.toNat - head.toNat)) * 112) := by - rw [BitVec.add_assoc, ← BitVec.ofNat_add, ← Nat.add_mul] - congr 2; omega + have hoff_nh := wrap_mm_off_nh v0 cap head hhead_lt wp_conv_pre => rw [hoff_nh] wp_steps_sync_pool (s0.readReg64 (Reg.gpr 30#5)) simp only [State.setMem_setMem] @@ -794,7 +947,7 @@ theorem vec_deque_grow_wrap_memmove_bs_placed_ok [LibsignalPlacement] {M : Alloc (hshim : HookSat H spqrRustNoAllocShimSym rustAllocShimVmSpec) (halloc : HookSat H spqrRustAllocSym (rustCliAllocBudgetSpec M A lim false)) (hrealloc : HookSat H spqrRustReallocSym (rustCliReallocBudgetSpec M A lim)) - (hmm : HookSat H spqrMemmoveSym (sessionMemmoveAcpSpec growOneStack)) : + (hmm : HookSat H spqrMemmoveSym (sessionMemmoveBoundedAcpSpec growOneStack)) : subroutine_ok ((blkPC_353).rebase (blkPl_353).base H) (blkPl_353).base (withLsCodeLoaded lsmpl (vecDequeGrowWrapMemmoveBsSpec M A lim)) := @@ -989,7 +1142,7 @@ theorem vec_deque_grow_spec_placed_ok [LibsignalPlacement] {M : AllocCostModel} (halloc : HookSat H spqrRustAllocSym (rustCliAllocBudgetSpec M A lim false)) (hrealloc : HookSat H spqrRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hmc : HookSat H spqrMemcpySym framelessMemcpyAcpSpec) - (hmm : HookSat H spqrMemmoveSym (sessionMemmoveAcpSpec growOneStack)) : + (hmm : HookSat H spqrMemmoveSym (sessionMemmoveBoundedAcpSpec growOneStack)) : subroutine_ok ((blkPC_353).rebase (blkPl_353).base H) (blkPl_353).base (withLsCodeLoaded lsmpl (vecDequeGrowSpec M A lim)) := diff --git a/LibsignalBinary/Proofs/SpqrV1/Alloc/VecDequeGrowBudgetAux.lean b/LibsignalBinary/Proofs/SpqrV1/Alloc/VecDequeGrowBudgetAux.lean index fd5b27f71..905766c67 100644 --- a/LibsignalBinary/Proofs/SpqrV1/Alloc/VecDequeGrowBudgetAux.lean +++ b/LibsignalBinary/Proofs/SpqrV1/Alloc/VecDequeGrowBudgetAux.lean @@ -14,6 +14,7 @@ public import LibsignalBinary.Proofs.SpqrV1.Alloc.GrowOneBudget public import LibsignalBinary.Proofs.SpqrV1.Alloc.ConcatBudgetAux public import LibsignalBinary.Proofs.SpqrV1.Chain.DefsBudget public import LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Heap.IfaceBudgetLemmas public import LibsignalBinary.Heap.RustStdAllocBudgetBridge public import LibsignalBinary.Proofs.Placed.BudgetPoolSync @@ -84,6 +85,9 @@ open LibsignalBinary.Heap.IfaceBudgetLemmas ( ) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget (sessionMemmoveBudget_hookOk) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemmoveBudgetSpec) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove ( + MemmoveArithBound sessionMemmoveBoundedSpec +) open LibsignalBinary.Proofs.SpqrV1.Alloc.GrowOneBudget ( FG8CellsGhost GrowOneStrideEnv fitsEnv_growOneStride_iff growOneStrideEvents ) @@ -254,13 +258,32 @@ theorem hookMemmove_sessionMemmoveAcp_ok (hookStack : Nat := 4096) : exact ⟨rfl, rfl, rfl, rfl, rfl, rfl, rfl⟩ · exact Or.inr hrest +/-- Bounded (`MemmoveArithBound`) counterpart of `sessionMemmoveAcpSpec`: + same `AllocCallPreserved ∧ VmPreserved` postcondition, gated by `MemmoveArithBound base buf` + in `.pre` so real `libc.a` `memmove` satisfies it (`VecDequeGrowBudget` / + `AddChunkCl1PlacedBudget` / `SpqrChainPlacedInstBudget`). -/ +def sessionMemmoveBoundedAcpSpec (hookStack : Nat := 4096) : + Spec (BitVec 64 × List (BitVec 8) × Nat × Nat × Nat) := + { sessionMemmoveAcpSpec hookStack with + pre := (sessionMemmoveBoundedSpec hookStack).pre } + +theorem hookMemmove_sessionMemmoveBoundedAcp_ok (hookStack : Nat := 4096) : + HookOk hookMemmove (sessionMemmoveBoundedAcpSpec hookStack) := by + have h := hookMemmove_sessionMemmoveAcp_ok hookStack + intro x R s0 hrun hpre hsp + dsimp only [sessionMemmoveBoundedAcpSpec, sessionMemmoveBoundedSpec] at hpre + rw [sepConj_assoc, satisfies_pure_sepConj] at hpre + exact h x R s0 hrun hpre.2 hsp + def sessionMemmoveFrontToEndAcpSpec (hookStack : Nat) : Spec (BitVec 64 × List (BitVec 8) × Nat) where pre := fun (base, bs_front, uninitLen) s0 => ⌜s0.readReg64 .x0 = base + BitVec.ofNat 64 uninitLen ∧ s0.readReg64 .x1 = base ∧ (s0.readReg64 .x2).toNat = bs_front.length ∧ - uninitLen ≤ 2 ^ 64⌝ ∗ + uninitLen ≤ 2 ^ 64 ∧ + base.toNat + bs_front.length + uninitLen ≤ 2 ^ 64 ∧ + bs_front.length + uninitLen < 2 ^ 63⌝ ∗ (base ↦ₛ bs_front) ∗ memRegion (base + BitVec.ofNat 64 bs_front.length) uninitLen ∗ stackAt s0.sp hookStack @@ -272,11 +295,11 @@ def sessionMemmoveFrontToEndAcpSpec (hookStack : Nat) : stackAt s0.sp hookStack theorem session_memmove_front_to_end_acp_ok {prog : Program} {addr : BitVec 64} - {hookStack : Nat} (hmm : subroutine_ok prog addr (sessionMemmoveAcpSpec hookStack)) : + {hookStack : Nat} (hmm : subroutine_ok prog addr (sessionMemmoveBoundedAcpSpec hookStack)) : subroutine_ok prog addr (sessionMemmoveFrontToEndAcpSpec hookStack) := by refine subroutine_ok_outcome_intro fun ⟨base, bs_front, uninitLen⟩ R s0 hpc hrun hpre hsp => ?_ simp only [sessionMemmoveFrontToEndAcpSpec, sepConj_assoc, satisfies_pure_sepConj] at hpre - rcases hpre with ⟨⟨hx0, hx1, hx2, huninit_le⟩, hmem⟩ + rcases hpre with ⟨⟨hx0, hx1, hx2, huninit_le, hnw, hlt63⟩, hmem⟩ rw [memRegion_eq_exists_bytes (base + BitVec.ofNat 64 bs_front.length) uninitLen huninit_le, sepExists_sepConj_left, sepExists_sepConj_right] at hmem rw [satisfies_sepExists] at hmem @@ -289,20 +312,24 @@ theorem session_memmove_front_to_end_acp_ok {prog : Program} {addr : BitVec 64} rw [satisfies_pure_sepConj] at hmem1 rcases hmem1 with ⟨hbs_uninit, hmem1⟩ have hpre' : s0.mem ⊨ - (sessionMemmoveAcpSpec hookStack).pre + (sessionMemmoveBoundedAcpSpec hookStack).pre (base, bs_front ++ bs_uninit, uninitLen, 0, bs_front.length) s0 ∗ R := by - dsimp only [sessionMemmoveAcpSpec, sessionMemmoveSpec, libcMemmoveSpec] - rw [sepConj_assoc, satisfies_pure_sepConj] - refine ⟨⟨hx0, by rw [BitVec.add_zero]; exact hx1, hx2, - by rw [List.length_append, hbs_uninit]; omega, - by rw [List.length_append]; omega⟩, ?_⟩ + dsimp only [sessionMemmoveBoundedAcpSpec, sessionMemmoveBoundedSpec, MemmoveArithBound, + sessionMemmoveSpec, libcMemmoveSpec] + rw [sepConj_assoc, satisfies_pure_sepConj, sepConj_assoc, satisfies_pure_sepConj] + refine ⟨⟨by rw [List.length_append, hbs_uninit]; omega, + by rw [List.length_append, hbs_uninit]; omega⟩, + ⟨hx0, by rw [BitVec.add_zero]; exact hx1, hx2, + by rw [List.length_append, hbs_uninit]; omega, + by rw [List.length_append]; omega⟩, ?_⟩ rw [pointsToBytes_append, sepConj_assoc] exact Satisfies.mono (Entails.of_eq (by sep_ac_rfl)) hmem1 refine hmm.mono_outcome (base, bs_front ++ bs_uninit, uninitLen, 0, bs_front.length) R s0 hpc hrun hpre' hsp fun sf hout => ?_ rcases hout with ⟨hret, hcc, hpost⟩ | hfail · refine Or.inl ⟨hret, hcc, ?_⟩ - dsimp only [sessionMemmoveAcpSpec, sessionMemmoveFrontToEndAcpSpec] at hpost ⊢ + dsimp only [sessionMemmoveBoundedAcpSpec, sessionMemmoveAcpSpec, + sessionMemmoveFrontToEndAcpSpec] at hpost ⊢ simp only [sepConj_assoc, satisfies_pure_sepConj] at hpost ⊢ refine ⟨hpost.1, ?_⟩ have hent := pointsToBytes_listMove_append_entails base bs_front bs_uninit diff --git a/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/LoopPlacedBudget.lean b/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/LoopPlacedBudget.lean index 4f05d8153..d1cb613a6 100644 --- a/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/LoopPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/LoopPlacedBudget.lean @@ -11,6 +11,7 @@ module public import LibsignalBinary.Heap.IfaceBudgetLemmas public import LibsignalBinary.Heap.SpecBudget +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.Placed.BudgetPoolSync public meta import LibsignalBinary.Proofs.Placed.BudgetPoolSync -- shake: keep public import LibsignalBinary.Proofs.Placed.BudgetVmSteps @@ -48,7 +49,9 @@ open scoped CryptoVerification.SpqrV1.Poly.AddChunk.AddChunkNorm open CryptoVerification (LibsignalPlacement blkPC_419 blkPl_419 lsmpl lsρ) open CryptoVerification.RustHeap (arrayAt) open CryptoVerification.LibsignalSpqrV1 (Chunk PolyDecoder Pt) -open CryptoVerification.LibsignalTripleRatchet (sessionMemmoveSpec) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove ( + MemmoveArithBound sessionMemmoveBoundedSpec +) open CryptoVerification.SpqrV1.Alloc (growOneStack spqrMemmoveSym spqr_hook_ok_of_mem) open CryptoVerification.SpqrV1.Poly (ptAt ptSliceAt sortedSetPtOf) open CryptoVerification.SpqrV1.Poly.AddChunk ( @@ -284,13 +287,33 @@ theorem bsearchLoop_placed_sepWP [LibsignalPlacement] {ext : String → Option ( /-! ## Placed `memmove` Insertion & `grow_one` Calls -/ +private theorem live_noWrap {M : AllocCostModel} (A : RustCliAllocBudget M) + (p : BitVec 64) (n al : Nat) : + A.live p n al ⊢ ⌜p.toNat + n < 2 ^ 64⌝ ∗ A.live p n al := by + refine Entails.trans (A.block_valid p n al) ?_ + apply Entails.pure_left + rintro ⟨_, _, hnw, _⟩ + exact Entails.pure_right hnw (Entails.refl _) + +private theorem sepWP_live_noWrap {M : AllocCostModel} (A : RustCliAllocBudget M) + (ptr : BitVec 64) (size align : Nat) + {prog : Program} {target_pc : BitVec 64} {s : State} {P F : SepProp} + {post : State → SepProp → Prop} {oom : State → SepProp} + (hf : P = A.live ptr size align ∗ F := by sep_focus) + (hnext : ptr.toNat + size < 2 ^ 64 → SepWP prog target_pc s P post oom) : + SepWP prog target_pc s P post oom := by + refine SepWP.weaken_pre (P' := ⌜ptr.toNat + size < 2 ^ 64⌝ ∗ P) ?_ (SepWP.focus_pure rfl hnext) + rw [hf] + exact Entails.trans (sepConj_mono_left (live_noWrap A ptr size align)) + (Entails.of_eq (by sep_ac_rfl)) + private theorem bsearch_memmove_insert_gen_placed_sepWP [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {ext : String → Option (State → State)} {Inv : State → State → Prop} (hof_acp : ∀ {a b}, AllocCallPreserved a b → Inv a b) (htrans : ∀ {a b c}, Inv a b → Inv b c → Inv a c) (hmemmove : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) - (lsρ spqrMemmoveSym) (withInvVmSpec Inv (sessionMemmoveSpec growOneStack))) + (lsρ spqrMemmoveSym) (withInvVmSpec Inv (sessionMemmoveBoundedSpec growOneStack))) (v cap ptr lenOld : BitVec 64) (vec : List Pt) (insertIdx : Nat) (pt : Pt) (hins : insertIdx < vec.length) (hlt : vec.length < cap.toNat) (hcap : cap.toNat * 4 < 2 ^ 63) (hptr : ptr ≠ 0#64) @@ -355,8 +378,22 @@ private theorem bsearch_memmove_insert_gen_placed_sepWP [LibsignalPlacement] 4 * (vec.length - insertIdx) + 4 := by rw [List.length_append, ptListBytes_length, List.length_drop, hslot] wp_steps 4 + refine sepWP_live_noWrap A ptr (cap.toNat * 4) 2 (by sep_focus) fun hptr_nw => ?_ + have hsplit_cap : 4 * insertIdx + (4 * (vec.length - insertIdx) + 4) ≤ cap.toNat * 4 := by + omega + have hbound : MemmoveArithBound (ptr + BitVec.ofNat 64 (4 * insertIdx)) + (ptListBytes (vec.drop insertIdx) ++ slotBs) := by + have hmod1 : 4 * insertIdx < 2 ^ 64 := by omega + have hmod2 : ptr.toNat + 4 * insertIdx < 2 ^ 64 := by omega + have hptr_add : + (ptr + BitVec.ofNat 64 (4 * insertIdx)).toNat = ptr.toNat + 4 * insertIdx := by + rw [BitVec.toNat_add, BitVec.toNat_ofNat, Nat.mod_eq_of_lt hmod1, Nat.mod_eq_of_lt hmod2] + exact ⟨by rw [hptr_add, hbuf_len]; omega, by rw [hbuf_len]; omega⟩ + have hbound_nw := hbound.1 + have hbound_lt := hbound.2 wp_call hmemmove (ptr + BitVec.ofNat 64 (4 * insertIdx), ptListBytes (vec.drop insertIdx) ++ slotBs, 4, 0, 4 * (vec.length - insertIdx)) + clear hptr_nw hsplit_cap hbound hbound_nw hbound_lt have hvm_call : VmPreserved s sf := vm_step_trans ‹VmPreserved _ sf› (by simp [wp_norm, arm64_norm]) have hinv_call : Inv s sf := @@ -409,7 +446,7 @@ private theorem bsearch_memmove_insert_gen_placed_sepWP [LibsignalPlacement] theorem bsearch_memmove_insert_placed_sepWP [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withVmPreserved (sessionMemmoveSpec growOneStack))) + (withVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (v cap ptr lenOld : BitVec 64) (vec : List Pt) (insertIdx : Nat) (pt : Pt) (hins : insertIdx < vec.length) (hlt : vec.length < cap.toNat) (hcap : cap.toNat * 4 < 2 ^ 63) (hptr : ptr ≠ 0#64) @@ -443,7 +480,7 @@ theorem bsearch_memmove_insert_placed_sepWP [LibsignalPlacement] theorem bsearch_memmove_insert_acp_placed_sepWP [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (v cap ptr lenOld : BitVec 64) (vec : List Pt) (insertIdx : Nat) (pt : Pt) (hins : insertIdx < vec.length) (hlt : vec.length < cap.toNat) (hcap : cap.toNat * 4 < 2 ^ 63) (hptr : ptr ≠ 0#64) @@ -592,7 +629,7 @@ private theorem bsearch_insert_at_336_gen_placed_sepWP [LibsignalPlacement] (hof_acp : ∀ {a b}, AllocCallPreserved a b → Inv a b) (htrans : ∀ {a b c}, Inv a b → Inv b c → Inv a c) (hmemmove : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) - (lsρ spqrMemmoveSym) (withInvVmSpec Inv (sessionMemmoveSpec growOneStack))) + (lsρ spqrMemmoveSym) (withInvVmSpec Inv (sessionMemmoveBoundedSpec growOneStack))) (v cap ptr lenOld : BitVec 64) (vec : List Pt) (insertIdx : Nat) (pt : Pt) (hins : insertIdx ≤ vec.length) (hlt : vec.length < cap.toNat) (hcap : cap.toNat * 4 < 2 ^ 63) (hptr : ptr ≠ 0#64) @@ -679,7 +716,7 @@ private theorem bsearch_insert_at_336_gen_placed_sepWP [LibsignalPlacement] theorem bsearch_insert_at_336_placed_sepWP [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withVmPreserved (sessionMemmoveSpec growOneStack))) + (withVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (v cap ptr lenOld : BitVec 64) (vec : List Pt) (insertIdx : Nat) (pt : Pt) (hins : insertIdx ≤ vec.length) (hlt : vec.length < cap.toNat) (hcap : cap.toNat * 4 < 2 ^ 63) (hptr : ptr ≠ 0#64) @@ -711,7 +748,7 @@ theorem bsearch_insert_at_336_placed_sepWP [LibsignalPlacement] theorem bsearch_insert_at_336_acp_placed_sepWP [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (v cap ptr lenOld : BitVec 64) (vec : List Pt) (insertIdx : Nat) (pt : Pt) (hins : insertIdx ≤ vec.length) (hlt : vec.length < cap.toNat) (hcap : cap.toNat * 4 < 2 ^ 63) (hptr : ptr ≠ 0#64) @@ -745,7 +782,7 @@ private theorem bsearch_insert_at_452_gen_placed_sepWP [LibsignalPlacement] (hof_acp : ∀ {a b}, AllocCallPreserved a b → Inv a b) (htrans : ∀ {a b c}, Inv a b → Inv b c → Inv a c) (hmemmove : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) - (lsρ spqrMemmoveSym) (withInvVmSpec Inv (sessionMemmoveSpec growOneStack))) + (lsρ spqrMemmoveSym) (withInvVmSpec Inv (sessionMemmoveBoundedSpec growOneStack))) (v : BitVec 64) (vec : List Pt) (insertIdx : Nat) (pt : Pt) (hins : insertIdx ≤ vec.length) (s : State) (P : SepProp) (post : State → SepProp → Prop) (hpc : s.pc = (blkPl_419).base + 452#64) (hstat : s.status = .Running) (hsp_align : s.spAligned = true) @@ -833,7 +870,7 @@ private theorem bsearch_insert_at_452_gen_placed_sepWP [LibsignalPlacement] theorem bsearch_insert_at_452_placed_sepWP [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withVmPreserved (sessionMemmoveSpec growOneStack))) + (withVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (v : BitVec 64) (vec : List Pt) (insertIdx : Nat) (pt : Pt) (hins : insertIdx ≤ vec.length) (s : State) (P : SepProp) (post : State → SepProp → Prop) (hpc : s.pc = (blkPl_419).base + 452#64) (hstat : s.status = .Running) (hsp_align : s.spAligned = true) @@ -861,7 +898,7 @@ theorem bsearch_insert_at_452_placed_sepWP [LibsignalPlacement] theorem bsearch_insert_at_452_acp_placed_sepWP [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (v : BitVec 64) (vec : List Pt) (insertIdx : Nat) (pt : Pt) (hins : insertIdx ≤ vec.length) (s : State) (P : SepProp) (post : State → SepProp → Prop) (hpc : s.pc = (blkPl_419).base + 452#64) (hstat : s.status = .Running) (hsp_align : s.spAligned = true) diff --git a/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/ProofPlacedBudget.lean b/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/ProofPlacedBudget.lean index 391e5131a..6d55763f0 100644 --- a/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/ProofPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/ProofPlacedBudget.lean @@ -9,6 +9,7 @@ limitations under the License. module +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpqrV1.Poly.AddChunk.ProofPlacedBudgetAux import LibsignalBinary.Proofs.SpqrV1.Poly.EncoderIntoPb.Defs import ProofLib.SepLogic.WPp @@ -35,7 +36,7 @@ open scoped CryptoVerification.CodeLayout open scoped CryptoVerification.SpqrV1.Poly.AddChunk.AddChunkNorm open CryptoVerification (LibsignalPlacement blkPC_419 blkPl_419 lsmpl) open CryptoVerification.LibsignalSpqrV1 (Chunk GF16 NUM_POLYS PolyDecoder Pt SortedSetPt) -open CryptoVerification.LibsignalTripleRatchet (sessionMemmoveSpec) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open CryptoVerification.SpqrV1.Alloc (growOneStack spqrMemmoveSym) open CryptoVerification.SpqrV1.Poly ( boolByte chunkAt chunkIndexOff polyDecoderAt polyDecoderIsCompleteOff @@ -127,7 +128,7 @@ theorem addChunk_body_placed_wpp [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (lsmpl.base 357) (withAllocCallPreserved (growOnePtFullSpec M A lim))) (hgrow_empty : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) @@ -310,7 +311,7 @@ theorem addChunk_loop_placed_wpp [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (lsmpl.base 357) (withAllocCallPreserved (growOnePtFullSpec M A lim))) (hgrow_empty : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) @@ -542,7 +543,7 @@ theorem add_chunk_bsearch_placed_ok_ext [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (lsmpl.base 357) (withAllocCallPreserved (growOnePtFullSpec M A lim))) (hgrow_empty : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) @@ -598,7 +599,7 @@ theorem add_chunk_placed_ok_ext [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (lsmpl.base 357) (withAllocCallPreserved (growOnePtFullSpec M A lim))) (hgrow_empty : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) @@ -662,7 +663,7 @@ theorem add_chunk_placed_ok_x [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (lsmpl.base 357) (withAllocCallPreserved (growOnePtFullSpec M A lim))) (hgrow_empty : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) diff --git a/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/ProofPlacedBudgetAux.lean b/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/ProofPlacedBudgetAux.lean index 987f1d888..ba7f032c6 100644 --- a/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/ProofPlacedBudgetAux.lean +++ b/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/ProofPlacedBudgetAux.lean @@ -11,6 +11,7 @@ module public import LibsignalBinary.Heap.IfaceBudgetLemmas public import LibsignalBinary.Heap.SpecBudget +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.Placed.BudgetPoolSync public meta import LibsignalBinary.Proofs.Placed.BudgetPoolSync -- shake: keep public import LibsignalBinary.Proofs.Placed.BudgetVmSteps @@ -46,7 +47,7 @@ open scoped CryptoVerification.CodeLayout open scoped CryptoVerification.SpqrV1.Poly.AddChunk.AddChunkNorm open CryptoVerification (LibsignalPlacement blkPC_419 blkPl_419 lsmpl) open CryptoVerification.LibsignalSpqrV1 (Pt SortedSetPt) -open CryptoVerification.LibsignalTripleRatchet (sessionMemmoveSpec) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open CryptoVerification.SpqrV1.Alloc (growOneStack spqrMemmoveSym) open CryptoVerification.SpqrV1.Poly (ptAt ptSliceAt sortedSetPtOf) open CryptoVerification.SpqrV1.Poly.AddChunk ( @@ -123,7 +124,7 @@ theorem bsearchReplace_placed_wpp [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (lsmpl.base 357) (withAllocCallPreserved (growOnePtFullSpec M A lim))) {target_pc : BitVec 64} {s0 st : State} @@ -455,7 +456,7 @@ theorem bsearchPush_placed_wpp [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (lsmpl.base 357) (withAllocCallPreserved (growOnePtFullSpec M A lim))) (hgrow_empty : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) diff --git a/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/ProofXBudget.lean b/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/ProofXBudget.lean index 89fb64070..91fc084ca 100644 --- a/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/ProofXBudget.lean +++ b/LibsignalBinary/Proofs/SpqrV1/Poly/AddChunk/ProofXBudget.lean @@ -15,7 +15,7 @@ public import LibsignalBinary.Proofs.SpqrV1.Poly.AddChunk.ProofPlacedBudget /-! # Budget-Threaded Extended-Stack Wrapper for `::add_chunk` -Re-exports `addChunkSpecX_of_addChunkSpec` and `add_chunk_placed_ok_x` under `RustCliAllocBudget M` +Re-exports `addChunkSpecX_of_addChunkSpec` under `RustCliAllocBudget M` for Block `419`. -/ @@ -26,23 +26,11 @@ set_option autoImplicit false namespace LibsignalBinary.Proofs.SpqrV1.Poly.AddChunk.ProofXBudget open Arm64 ProofLib -open CryptoVerification (LibsignalPlacement blkPC_419 blkPl_419 lsmpl) -open CryptoVerification.LibsignalTripleRatchet (sessionMemmoveSpec) -open CryptoVerification.SpqrV1.Alloc (growOneStack spqrMemmoveSym) open LibsignalBinary.Heap ( AllocCostModel BudgetLimits RustCliAllocBudget ) -open LibsignalBinary.Proofs.SpqrV1.Poly.AddChunk.LoopPlacedBudget ( - withAllocCallPreserved -) -open LibsignalBinary.Proofs.SpqrV1.Alloc.GrowOneBudget ( - growOnePtFullSpec growOnePtSpec -) -open LibsignalBinary.Proofs.SpqrV1.Chain.NextKeyInternalBudget ( - withAllocVmPreserved -) open LibsignalBinary.Proofs.SpqrV1.Poly.AddChunk.DefsBudget ( - AddChunkPlacedOkX addChunkSpec addChunkSpecX + addChunkSpec addChunkSpecX ) /-- `addChunkSpec M A lim` entails `addChunkSpecX M A lim` by framing the unused bottom stack region. -/ @@ -52,17 +40,4 @@ theorem addChunkSpecX_of_addChunkSpec {P : Program} {addr : BitVec 64} subroutine_ok P addr (addChunkSpecX M A lim) := LibsignalBinary.Proofs.SpqrV1.Poly.AddChunk.ProofPlacedBudget.addChunkSpecX_of_addChunkSpec h -theorem add_chunk_placed_ok_x [LibsignalPlacement] - {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} - {ext : String → Option (State → State)} - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) - (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) - (lsmpl.base 357) (withAllocCallPreserved (growOnePtFullSpec M A lim))) - (hgrow_empty : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) - (lsmpl.base 357) (withAllocCallPreserved (growOnePtSpec M A lim))) : - AddChunkPlacedOkX M A lim ext := - LibsignalBinary.Proofs.SpqrV1.Poly.AddChunk.ProofPlacedBudget.add_chunk_placed_ok_x - hmemmove_sat hgrow_full hgrow_empty - end LibsignalBinary.Proofs.SpqrV1.Poly.AddChunk.ProofXBudget diff --git a/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbExitPlacedBudget.lean b/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbExitPlacedBudget.lean index 0b4786f36..f3867bef7 100644 --- a/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbExitPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbExitPlacedBudget.lean @@ -84,7 +84,9 @@ open LibsignalBinary.Proofs.SpqrV1.Drop.SortedSetPtBudget (dropGlueSortedSetPt16 open LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbDefsBudget ( fromPbDecLoopAllocEvents fromPbDecSlotEvents ) -open LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbInnerPlacedBudget (sessionMemmoveVmAcpSpec) +open LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbInnerPlacedBudget ( + sessionMemmoveBoundedVmAcpSpec +) open LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbOuterPlacedBudget ( fromPb_outer_alloc_and_push_placed_wpp_of_hookSat fromPb_outer_invalid_mod4_placed_wpp ) @@ -173,7 +175,7 @@ theorem fromPb_outer_loop_placed_wpp [LibsignalPlacement] {ext : String → Option (State → State)} (hshim_sat : HookSat (Rust.withPanics ext) spqrRustNoAllocShimSym rustAllocShimVmSpec) (halloc_sat : HookSat (Rust.withPanics ext) spqrRustAllocSym (rustCliAllocBudgetSpec M A lim false)) - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) {Q Qp : State → SepProp → Prop} (s0 : State) (fsp ptsPtr : BitVec 64) (hfsp_align : (fsp &&& 15#64 == 0#64) = true) : diff --git a/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbInnerPlacedBudget.lean b/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbInnerPlacedBudget.lean index e6b48bd28..89f934261 100644 --- a/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbInnerPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbInnerPlacedBudget.lean @@ -10,6 +10,7 @@ limitations under the License. module public import LibsignalBinary.Heap.IfaceBudgetLemmas +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.Placed.BudgetVmSteps public meta import LibsignalBinary.Proofs.Placed.BudgetVmSteps -- shake: keep public import LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbInnerPlaced @@ -68,6 +69,9 @@ open CryptoVerification.SpqrV1.Poly.DecoderPb ( truncate16_truncate32 uxth32_of_truncate16_64 ) open LibsignalBinary.Heap (AllocCallPreserved VmPreserved) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove ( + MemmoveArithBound sessionMemmoveBoundedSpec +) open scoped CryptoVerification.SpqrV1.Poly.AddChunk CryptoVerification.SpqrV1.Poly.AddChunk.AddChunkNorm attribute [local irreducible] Program.fetch Program.externAt? Program.fnOff @@ -94,6 +98,14 @@ def sessionMemmoveVmAcpSpec (hookStack : Nat := 4096) : AllocCallPreserved s0 sf ∧ VmPreserved s0 sf⌝ ∗ (base ↦ₛ listMove buf dst src len) ∗ stackAt s0.sp hookStack +/-- Bounded (`MemmoveArithBound`) counterpart of `sessionMemmoveVmAcpSpec`: + same `AllocCallPreserved ∧ VmPreserved` postcondition, gated by `MemmoveArithBound base buf` + in `.pre` so real `libc.a` `memmove` satisfies it (`::from_pb`). -/ +def sessionMemmoveBoundedVmAcpSpec (hookStack : Nat := 4096) : + Spec (BitVec 64 × List (BitVec 8) × Nat × Nat × Nat) := + { sessionMemmoveVmAcpSpec hookStack with + pre := (sessionMemmoveBoundedSpec hookStack).pre } + private theorem seq_vm_clean {P : Program} {b : BitVec 64} {Hk : String → Option (State → State)} {mid target : BitVec 64} {s : State} {Pre P_mid : SepProp} {Q : State → Prop} {post : State → SepProp → Prop} @@ -331,10 +343,10 @@ theorem fromPb_bsearch_to_492_placed_sepWP [LibsignalPlacement] {ext : String theorem fromPb_bsearch_memmove_insert_placed_sepWP [LibsignalPlacement] {A : RustAlloc} {ext : String → Option (State → State)} {target_pc : BitVec 64} (hmemmove : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) - (lsρ spqrMemmoveSym) (sessionMemmoveVmAcpSpec 0)) + (lsρ spqrMemmoveSym) (sessionMemmoveBoundedVmAcpSpec 0)) (fsp cap ptr : BitVec 64) (vec : List Pt) (insertIdx : Nat) (pt : Pt) (hins : insertIdx < vec.length) (hlt : vec.length < cap.toNat) - (hcap : cap.toNat * 4 < 2 ^ 63) + (hcap : cap.toNat * 4 < 2 ^ 63) (hptr_nw : ptr.toNat + cap.toNat * 4 < 2 ^ 64) (s : State) (P : SepProp) (post : State → SepProp → Prop) (hpc : s.pc = (blkPl_376).base + 544#64) (hstat : s.status = .Running) @@ -369,6 +381,8 @@ theorem fromPb_bsearch_memmove_insert_placed_sepWP [LibsignalPlacement] {A : Rus SepWP ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) target_pc s (tempVecPtAt A fsp cap ptr { vec := vec } ∗ stackAt s.sp 0 ∗ P) post := by + dsimp only [sessionMemmoveBoundedVmAcpSpec, sessionMemmoveVmAcpSpec, + sessionMemmoveBoundedSpec, sessionMemmoveSpec, libcMemmoveSpec] at hmemmove refine SepWP.weaken_pre (sepConj_mono_left (tempVecPtAt_prepare_memmove A fsp cap ptr vec insertIdx hins hlt hcap)) ?_ rw [sepExists_sepConj_left] apply SepWP.exists_left; intro slotBs @@ -385,8 +399,21 @@ theorem fromPb_bsearch_memmove_insert_placed_sepWP [LibsignalPlacement] {A : Rus 4 * (vec.length - insertIdx) + 4 := by rw [List.length_append, ptListBytes_length, List.length_drop, hslot] wp_steps 4 + have hsplit_cap : 4 * insertIdx + (4 * (vec.length - insertIdx) + 4) ≤ cap.toNat * 4 := by + omega + have hbound : MemmoveArithBound (ptr + BitVec.ofNat 64 (4 * insertIdx)) + (ptListBytes (vec.drop insertIdx) ++ slotBs) := by + have hmod1 : 4 * insertIdx < 2 ^ 64 := by omega + have hmod2 : ptr.toNat + 4 * insertIdx < 2 ^ 64 := by omega + have hptr_add : + (ptr + BitVec.ofNat 64 (4 * insertIdx)).toNat = ptr.toNat + 4 * insertIdx := by + rw [BitVec.toNat_add, BitVec.toNat_ofNat, Nat.mod_eq_of_lt hmod1, Nat.mod_eq_of_lt hmod2] + exact ⟨by rw [hptr_add, hbuf_len]; omega, by rw [hbuf_len]; omega⟩ + have hbound_nw := hbound.1 + have hbound_lt := hbound.2 wp_call hmemmove (ptr + BitVec.ofNat 64 (4 * insertIdx), ptListBytes (vec.drop insertIdx) ++ slotBs, 4, 0, 4 * (vec.length - insertIdx)) + clear hptr_nw hsplit_cap hbound hbound_nw hbound_lt have hvm_call : VmPreserved s sf := by simpa [wp_norm, arm64_norm] using ‹VmPreserved _ sf› have hacp_call : AllocCallPreserved s sf := ‹AllocCallPreserved s sf› @@ -507,10 +534,10 @@ theorem fromPb_bsearch_end_insert_placed_sepWP [LibsignalPlacement] {A : RustAll theorem fromPb_bsearch_insert_at_532_placed_sepWP [LibsignalPlacement] {A : RustAlloc} {ext : String → Option (State → State)} {target_pc : BitVec 64} (hmemmove : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) - (lsρ spqrMemmoveSym) (sessionMemmoveVmAcpSpec 0)) + (lsρ spqrMemmoveSym) (sessionMemmoveBoundedVmAcpSpec 0)) (fsp cap ptr : BitVec 64) (vec : List Pt) (insertIdx : Nat) (pt : Pt) (hins : insertIdx ≤ vec.length) (hlt : vec.length < cap.toNat) - (hcap : cap.toNat * 4 < 2 ^ 63) + (hcap : cap.toNat * 4 < 2 ^ 63) (hptr_nw : ptr.toNat + cap.toNat * 4 < 2 ^ 64) (s : State) (P : SepProp) (post : State → SepProp → Prop) (hpc : s.pc = (blkPl_376).base + 532#64) (hstat : s.status = .Running) @@ -582,7 +609,7 @@ theorem fromPb_bsearch_insert_at_532_placed_sepWP [LibsignalPlacement] {A : Rust · simpa [wp_norm, arm64_norm] using hvregs_f · have hle_f : ¬ vec.length ≤ insertIdx := by omega simp only [hle_f, decide_false, Bool.false_eq_true, ↓reduceIte] - refine hmem hins_lt hlt hcap _ P post + refine hmem hins_lt hlt hcap hptr_nw _ P post (by simp [wp_norm, arm64_norm]) (by simp [wp_norm, arm64_norm, hstat]) (by simpa [wp_norm, arm64_norm] using hsp_align) @@ -612,10 +639,10 @@ theorem fromPb_bsearch_insert_at_532_placed_sepWP [LibsignalPlacement] {A : Rust theorem fromPb_bsearchReplace_placed_sepWP [LibsignalPlacement] {A : RustAlloc} {ext : String → Option (State → State)} {target_pc : BitVec 64} (hmemmove : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) - (lsρ spqrMemmoveSym) (sessionMemmoveVmAcpSpec 0)) + (lsρ spqrMemmoveSym) (sessionMemmoveBoundedVmAcpSpec 0)) (fsp cap ptr : BitVec 64) (s : SortedSetPt) (pt : Pt) (h1 : 1 ≤ s.vec.length) (hlt_cap : s.vec.length < cap.toNat) - (hcap : cap.toNat * 4 < 2 ^ 63) + (hcap : cap.toNat * 4 < 2 ^ 63) (hptr_nw : ptr.toNat + cap.toNat * 4 < 2 ^ 64) (st : State) (P : SepProp) (post : State → SepProp → Prop) (hpc : st.pc = (blkPl_376).base + 432#64) (hrun : st.status = .Running) @@ -676,7 +703,8 @@ theorem fromPb_bsearchReplace_placed_sepWP [LibsignalPlacement] {A : RustAlloc} dsimp only at hnext rw [hb_get] at hnext by_cases heq : ((s.vec[base]'hb_lt).x.value == pt.x.value) = true - · simp only [heq, ↓reduceIte] at hnext + · clear hptr_nw + simp only [heq, ↓reduceIte] at hnext have hbaseX_eq : (s.vec[base]'hb_lt).x.value = pt.x.value := beq_iff_eq.mp heq rw [ptSliceAt_focus s.vec base ptr hb_lt] unfold ptAt @@ -733,7 +761,7 @@ theorem fromPb_bsearchReplace_placed_sepWP [LibsignalPlacement] {A : RustAlloc} rw [← ptSliceAt_focus s.vec base ptr hb_lt] sep_ac_rfl have hins532 := @fromPb_bsearch_insert_at_532_placed_sepWP _ A ext target_pc hmemmove fsp cap ptr - s.vec insertIdx pt hins_le hlt_cap hcap + s.vec insertIdx pt hins_le hlt_cap hcap hptr_nw rw [ptSliceAt_focus s.vec base ptr hb_lt] unfold ptAt wp_steps 4 @@ -857,9 +885,10 @@ theorem fromPb_bsearch_push_empty_at_400_placed_sepWP [LibsignalPlacement] {A : theorem fromPb_bsearchPush_at_320_placed_sepWP [LibsignalPlacement] {A : RustAlloc} {ext : String → Option (State → State)} {target_pc : BitVec 64} (hmemmove : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) - (lsρ spqrMemmoveSym) (sessionMemmoveVmAcpSpec 0)) + (lsρ spqrMemmoveSym) (sessionMemmoveBoundedVmAcpSpec 0)) (fsp cap ptr : BitVec 64) (s : SortedSetPt) (pt : Pt) (hlt_cap : s.vec.length < cap.toNat) (hcap : cap.toNat * 4 < 2 ^ 63) + (hptr_nw : ptr.toNat + cap.toNat * 4 < 2 ^ 64) (hlen : s.vec.length ≤ 65536) (st : State) (P : SepProp) (post : State → SepProp → Prop) (hpc : st.pc = (blkPl_376).base + 320#64) @@ -909,6 +938,7 @@ theorem fromPb_bsearchPush_at_320_placed_sepWP [LibsignalPlacement] {A : RustAll dsimp only at hnext cases hcmp : Pt.cmp pt lastPt with | eq => + clear hptr_nw rw [hcmp] at hnext dsimp only at hnext have hset_eq : s.vec.dropLast ++ [pt] = s.vec.set lastIdx pt := @@ -968,7 +998,7 @@ theorem fromPb_bsearchPush_at_320_placed_sepWP [LibsignalPlacement] {A : RustAll (BitVec.zeroExtend 32 (s.vec[lastIdx]'hlast_lt).x.value).ule (BitVec.zeroExtend 32 pt.x.value) = false := by rw [bv32_ule_zeroExtend16, decide_eq_false_iff_not]; omega - have hrep := @fromPb_bsearchReplace_placed_sepWP _ A ext target_pc hmemmove fsp cap ptr s pt h1 hlt_cap hcap + have hrep := @fromPb_bsearchReplace_placed_sepWP _ A ext target_pc hmemmove fsp cap ptr s pt h1 hlt_cap hcap hptr_nw unfold tempVecPtAt rw [ptSliceAt_focus s.vec lastIdx ptr hlast_lt] unfold ptAt @@ -1010,6 +1040,7 @@ theorem fromPb_bsearchPush_at_320_placed_sepWP [LibsignalPlacement] {A : RustAll · exact hx29_f · simpa [wp_norm, arm64_norm] using hvregs_f | gt => + clear hptr_nw rw [hcmp] at hnext dsimp only at hnext have hcmp' : (s.vec[lastIdx]'hlast_lt).x.value.toNat < pt.x.value.toNat := @@ -1108,9 +1139,10 @@ theorem fromPb_bsearchPush_at_320_placed_sepWP [LibsignalPlacement] {A : RustAll theorem fromPb_bsearchPush_at_320_placed_sepWP_of_hookSat [LibsignalPlacement] {A : RustAlloc} {ext : String → Option (State → State)} {target_pc : BitVec 64} - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) (fsp cap ptr : BitVec 64) (s : SortedSetPt) (pt : Pt) (hlt_cap : s.vec.length < cap.toNat) (hcap : cap.toNat * 4 < 2 ^ 63) + (hptr_nw : ptr.toNat + cap.toNat * 4 < 2 ^ 64) (hlen : s.vec.length ≤ 65536) (st : State) (P : SepProp) (post : State → SepProp → Prop) (hpc : st.pc = (blkPl_376).base + 320#64) @@ -1145,6 +1177,6 @@ theorem fromPb_bsearchPush_at_320_placed_sepWP_of_hookSat [LibsignalPlacement] { (tempVecPtAt A fsp cap ptr s ∗ stackAt st.sp 0 ∗ P) post := fromPb_bsearchPush_at_320_placed_sepWP (spqr_hook_ok_of_mem hmemmove_sat) fsp cap ptr s pt - hlt_cap hcap hlen st P post hpc hrun hsp_al hx19 hx20 hx22 hx26 hx27 hx29 hnext + hlt_cap hcap hptr_nw hlen st P post hpc hrun hsp_al hx19 hx20 hx22 hx26 hx27 hx29 hnext end LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbInnerPlacedBudget diff --git a/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbOuterPlacedBudget.lean b/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbOuterPlacedBudget.lean index a7ec4a06b..156cae59a 100644 --- a/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbOuterPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbOuterPlacedBudget.lean @@ -80,7 +80,7 @@ open LibsignalBinary.Heap ( open LibsignalBinary.Heap.RustStdAllocBudgetBridge (rustAllocShimVmSpec) open LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbDefsBudget (fromPbDecSlotEvents) open LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbInnerPlacedBudget ( - fromPb_bsearchPush_at_320_placed_sepWP sessionMemmoveVmAcpSpec + fromPb_bsearchPush_at_320_placed_sepWP sessionMemmoveBoundedVmAcpSpec ) open scoped CryptoVerification.SpqrV1.Poly.AddChunk CryptoVerification.SpqrV1.Poly.AddChunk.AddChunkNorm @@ -106,15 +106,31 @@ private theorem sepWP_swap_vm {prog : Program} {tgt : BitVec 64} {s : State} SepWP prog tgt s Pre (fun sm Pm => Ent Pm ∧ VmPreserved s sm ∧ Rest sm) := SepWP.mono h fun _ _ _ _ ⟨hvm, hent, hr⟩ => ⟨hent, hvm, hr⟩ +private theorem tempVecPtAt_noWrap {M : AllocCostModel} (A : RustCliAllocBudget M) + (fsp cap ptr : BitVec 64) (s : SortedSetPt) : + tempVecPtAt A.repAlloc fsp cap ptr s ⊢ + ⌜ptr.toNat + cap.toNat * 4 < 2 ^ 64⌝ ∗ tempVecPtAt A.repAlloc fsp cap ptr s := by + have hbv : A.repAlloc.live ptr (cap.toNat * 4) 2 ⊢ + ⌜ptr.toNat + cap.toNat * 4 < 2 ^ 64⌝ ∗ A.repAlloc.live ptr (cap.toNat * 4) 2 := by + refine Entails.trans (A.block_valid ptr (cap.toNat * 4) 2) ?_ + apply Entails.pure_left + rintro ⟨_, _, hnw, _⟩ + exact Entails.pure_right hnw (Entails.refl _) + unfold tempVecPtAt + exact Entails.trans + (sepConj_mono_right (sepConj_mono_right (sepConj_mono_right (sepConj_mono_left hbv)))) + (Entails.of_eq (by sep_ac_rfl)) + /-! ## Placed 4-Byte Big-Endian Point Decoding and Inner Loop (`+304 -> +672`) -/ theorem fromPb_inner_step_placed_sepWP [LibsignalPlacement] {A : RustAlloc} {ext : String → Option (State → State)} {target_pc : BitVec 64} (hmemmove : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) - (lsρ spqrMemmoveSym) (sessionMemmoveVmAcpSpec 0)) + (lsρ spqrMemmoveSym) (sessionMemmoveBoundedVmAcpSpec 0)) (fsp cap ptr chunkPtr : BitVec 64) (b0 b1 b2 b3 : BitVec 8) (rest : List (BitVec 8)) (s : SortedSetPt) (hlt_cap : s.vec.length < cap.toNat) (hcap : cap.toNat * 4 < 2 ^ 63) + (hptr_nw : ptr.toNat + cap.toNat * 4 < 2 ^ 64) (hlen : s.vec.length ≤ 65536) (st : State) (P : SepProp) (post : State → SepProp → Prop) (hpc : st.pc = (blkPl_376).base + 304#64) @@ -155,7 +171,7 @@ theorem fromPb_inner_step_placed_sepWP [LibsignalPlacement] {A : RustAlloc} post := by let pt : Pt := { x := GF16.new (u16FromBeBytes b0 b1), y := GF16.new (u16FromBeBytes b2 b3) } have hpush := @fromPb_bsearchPush_at_320_placed_sepWP _ A ext target_pc hmemmove fsp cap ptr s pt - hlt_cap hcap hlen + hlt_cap hcap hptr_nw hlen rw [pointsToBytes_four_cons chunkPtr b0 b1 b2 b3 rest] wp_steps 4 refine SepWP.weaken_pre (Entails.of_eq (by sep_ac_rfl)) @@ -192,9 +208,10 @@ theorem fromPb_inner_step_placed_sepWP [LibsignalPlacement] {A : RustAlloc} theorem fromPb_inner_loop_placed_sepWP [LibsignalPlacement] {A : RustAlloc} {ext : String → Option (State → State)} {target_pc : BitVec 64} (hmemmove : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) - (lsρ spqrMemmoveSym) (sessionMemmoveVmAcpSpec 0)) + (lsρ spqrMemmoveSym) (sessionMemmoveBoundedVmAcpSpec 0)) (fsp cap ptr : BitVec 64) - (hcap : cap.toNat * 4 < 2 ^ 63) : + (hcap : cap.toNat * 4 < 2 ^ 63) + (hptr_nw : ptr.toNat + cap.toNat * 4 < 2 ^ 64) : ∀ (n : Nat) (rem : List (BitVec 8)) (chunkPtr : BitVec 64) (s : SortedSetPt) (st : State) (P : SepProp) (post : State → SepProp → Prop), rem.length = 4 * (n + 1) → @@ -251,7 +268,7 @@ theorem fromPb_inner_loop_placed_sepWP [LibsignalPlacement] {A : RustAlloc} have hlen : s.vec.length ≤ 65536 := ptListStrictSorted_length_le hsort rw [hpush_eq] at hnext refine fromPb_inner_step_placed_sepWP hmemmove fsp cap ptr chunkPtr b0 b1 b2 b3 [] s - (by omega) hcap hlen st P post hpc hrun hsp_al hx19 hx22 hx26 hx28 hx29 ?_ + (by omega) hcap hptr_nw hlen st P post hpc hrun hsp_al hx19 hx22 hx26 hx28 hx29 ?_ intro s1 hpc1 hrun1 hsp1 htr1 hvm1 hacp1 hx19_1 hx21_1 hx22_1 hx24_1 hx25_1 hx26_1 hx28_1 hx29_1 hvregs_1 have hx21_s1 : s1.readReg64 (Reg.gpr 21#5) = 4#64 := hx21_1.trans hx21 wp_steps 2 @@ -289,7 +306,7 @@ theorem fromPb_inner_loop_placed_sepWP [LibsignalPlacement] {A : RustAlloc} have hlen : s.vec.length ≤ 65536 := ptListStrictSorted_length_le hsort rw [hpush_step] at hnext refine fromPb_inner_step_placed_sepWP hmemmove fsp cap ptr chunkPtr b0 b1 b2 b3 rest s - (by omega) hcap hlen st P post hpc hrun hsp_al hx19 hx22 hx26 hx28 hx29 ?_ + (by omega) hcap hptr_nw hlen st P post hpc hrun hsp_al hx19 hx22 hx26 hx28 hx29 ?_ intro s1 hpc1 hrun1 hsp1 htr1 hvm1 hacp1 hx19_1 hx21_1 hx22_1 hx24_1 hx25_1 hx26_1 hx28_1 hx29_1 hvregs_1 have hsub4 : BitVec.ofNat 64 (4 * (n + 1 + 1)) - 4#64 = BitVec.ofNat 64 (4 * (n + 1)) := bv64_mul4_succ_sub_four (n + 1) @@ -501,7 +518,7 @@ theorem fromPb_outer_alloc_and_push_placed_wpp [LibsignalPlacement] (halloc : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) (lsρ spqrRustAllocSym) (rustCliAllocBudgetSpec M A lim false)) (hmemmove : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) - (lsρ spqrMemmoveSym) (sessionMemmoveVmAcpSpec 0)) + (lsρ spqrMemmoveSym) (sessionMemmoveBoundedVmAcpSpec 0)) {Q Qp : State → SepProp → Prop} (s0 : State) (fsp ptsPtr : BitVec 64) (hfsp_align : (fsp &&& 15#64 == 0#64) = true) @@ -810,8 +827,11 @@ theorem fromPb_outer_alloc_and_push_placed_wpp [LibsignalPlacement] rw [hsp1_0] have hsort_nil : SortedSetPtStrictSorted { vec := [] } := by simp [SortedSetPtStrictSorted, PtListStrictSorted] + refine SepWP.weaken_pre + (sepConj_mono_left (tempVecPtAt_noWrap A fsp (BitVec.ofNat 64 (n + 1)) ptr_tmp { vec := [] })) ?_ + refine SepWP.focus_pure (sepConj_assoc _ _ _) fun hptr_nw => ?_ refine fromPb_inner_loop_placed_sepWP hmemmove fsp (BitVec.ofNat 64 (n + 1)) ptr_tmp - (by rw [htoNat_cap]; omega) n pts ptr_u8 { vec := [] } s1 _ _ + (by rw [htoNat_cap]; omega) hptr_nw n pts ptr_u8 { vec := [] } s1 _ _ hn_eq (by rw [htoNat_cap]; simp) hsort_nil hpc1 hrun1 hsp_al1 hx19_1 hx21_1 hx22_1 hx26_1 hx28_1 hx29_1 ?_ intro sf_l hpc_f hrun_f hsp_f htr_f hvm_f hacp_f _ _ hx24_f hx25_f _ hx29_f hvregs_f @@ -875,7 +895,7 @@ theorem fromPb_outer_alloc_and_push_placed_wpp_of_hookSat [LibsignalPlacement] {ext : String → Option (State → State)} (hshim_sat : HookSat (Rust.withPanics ext) spqrRustNoAllocShimSym rustAllocShimVmSpec) (halloc_sat : HookSat (Rust.withPanics ext) spqrRustAllocSym (rustCliAllocBudgetSpec M A lim false)) - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) {Q Qp : State → SepProp → Prop} (s0 : State) (fsp ptsPtr : BitVec 64) (hfsp_align : (fsp &&& 15#64 == 0#64) = true) diff --git a/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbProofBudget.lean b/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbProofBudget.lean index 3eaf0a74f..4cb4f11c4 100644 --- a/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbProofBudget.lean +++ b/LibsignalBinary/Proofs/SpqrV1/Poly/DecoderPb/FromPbProofBudget.lean @@ -82,7 +82,9 @@ open LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbExitPlacedBudget ( fromPb_error_exit_712_placed_sepWP fromPb_error_exit_740_placed_sepWP fromPb_outer_loop_placed_wpp ) -open LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbInnerPlacedBudget (sessionMemmoveVmAcpSpec) +open LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbInnerPlacedBudget ( + sessionMemmoveBoundedVmAcpSpec +) open LibsignalBinary.Proofs.SpqrV1.States.FromPb.DefsBudget (decoderFromPbSpec) attribute [local irreducible] Program.fetch Program.externAt? Program.fnOff @@ -392,7 +394,7 @@ theorem fromPbDec_placed_ok_core [LibsignalPlacement] (hshim_sat : HookSat (Rust.withPanics ext) spqrRustNoAllocShimSym rustAllocShimVmSpec) (hdealloc_sat : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy_sat : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyVmAcpSpec) - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) (hdrop : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) (lsmpl.base 264) (dropGlueSortedSetPt16Spec M A lim)) : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) @@ -600,7 +602,7 @@ theorem fromPbDec_placed_ok_ext [LibsignalPlacement] (hshim_sat : HookSat (Rust.withPanics ext) spqrRustNoAllocShimSym rustAllocShimVmSpec) (hdealloc_sat : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy_sat : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyVmAcpSpec) - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) (hdrop : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) (lsmpl.base 264) (dropGlueSortedSetPt16Spec M A lim)) : FromPbDecPlacedOkExt M A lim ext := @@ -614,7 +616,7 @@ theorem fromPbDec_placed_ok_stack1056 [LibsignalPlacement] (hshim_sat : HookSat (Rust.withPanics ext) spqrRustNoAllocShimSym rustAllocShimVmSpec) (hdealloc_sat : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy_sat : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyVmAcpSpec) - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) (hdrop : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) (lsmpl.base 264) (dropGlueSortedSetPt16Spec M A lim)) : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) @@ -647,7 +649,7 @@ theorem decoder_from_pb_placed_ok_ext [LibsignalPlacement] (hshim_sat : HookSat (Rust.withPanics ext) spqrRustNoAllocShimSym rustAllocShimVmSpec) (hdealloc_sat : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy_sat : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyVmAcpSpec) - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) (hdrop : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) (lsmpl.base 264) (dropGlueSortedSetPt16Spec M A lim)) : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) @@ -663,7 +665,7 @@ theorem fromPbDec_placed_ok_x [LibsignalPlacement] (hshim_sat : HookSat (Rust.withPanics ext) spqrRustNoAllocShimSym rustAllocShimVmSpec) (hdealloc_sat : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy_sat : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyVmAcpSpec) - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) (hdrop : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) (lsmpl.base 264) (dropGlueSortedSetPt16Spec M A lim)) : FromPbDecPlacedOkX M A lim ext := @@ -677,7 +679,7 @@ theorem decoder_from_pb_placed_ok_x [LibsignalPlacement] (hshim_sat : HookSat (Rust.withPanics ext) spqrRustNoAllocShimSym rustAllocShimVmSpec) (hdealloc_sat : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy_sat : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyVmAcpSpec) - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) (hdrop : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) (lsmpl.base 264) (dropGlueSortedSetPt16Spec M A lim)) : FromPbDecPlacedOkX M A lim ext := diff --git a/LibsignalBinary/Proofs/SpqrV1/States/FromPb/DecoderFromPbClPlacedBudget.lean b/LibsignalBinary/Proofs/SpqrV1/States/FromPb/DecoderFromPbClPlacedBudget.lean index 8bf46df99..9e1e0c1d7 100644 --- a/LibsignalBinary/Proofs/SpqrV1/States/FromPb/DecoderFromPbClPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SpqrV1/States/FromPb/DecoderFromPbClPlacedBudget.lean @@ -98,7 +98,9 @@ open LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbExitPlacedBudget ( fromPb_drop_vec_u8_776_placed_sepWP fromPb_error_exit_712_placed_sepWP fromPb_outer_loop_placed_wpp fromPb_tail_820_placed_sepWP ) -open LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbInnerPlacedBudget (sessionMemmoveVmAcpSpec) +open LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbInnerPlacedBudget ( + sessionMemmoveBoundedVmAcpSpec +) open LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbProofBudget ( fromPbDecSpecWithStack fromPb_header_err_placed_vm_sepWP fromPb_header_ok_placed_vm_sepWP fromPb_init_empty_headers_placed_vm_sepWP fromPb_save_regs_placed_vm_sepWP @@ -413,7 +415,7 @@ theorem fromPbDec_cl_placed_ok_core [LibsignalPlacement] (hshim_sat : HookSat (Rust.withPanics ext) spqrRustNoAllocShimSym rustAllocShimVmSpec) (hdealloc_sat : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy_sat : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyVmAcpSpec) - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) : + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) : subroutine_ok ((blkPC_376).rebase (blkPl_376).base (Rust.withPanics ext)) (blkPl_376).base (withLsCodeLoaded lsmpl (fromPbDecSpecWithStack M A lim fromPbCoreStack)) := by @@ -715,7 +717,7 @@ theorem decoder_from_pb_cl_placed_ok_ext [LibsignalPlacement] (hshim_sat : HookSat (Rust.withPanics ext) spqrRustNoAllocShimSym rustAllocShimVmSpec) (hdealloc_sat : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy_sat : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyVmAcpSpec) - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) : + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) : subroutine_ok (lsProg_376 (Rust.withPanics ext)) (lsmpl.base 376) (withLsCodeLoaded lsmpl (DefsBudget.decoderFromPbSpec M A lim)) := by @@ -731,7 +733,7 @@ theorem decoder_from_pb_cl_blockProgram [LibsignalPlacement] (hshim_sat : HookSat (Rust.withPanics ext) spqrRustNoAllocShimSym rustAllocShimVmSpec) (hdealloc_sat : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy_sat : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyVmAcpSpec) - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) : + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) : subroutine_ok (libsignalSessionLib.blockProgram lsmpl 376 (Rust.withPanics ext)) (lsmpl.base 376) (withLsCodeLoaded lsmpl (DefsBudget.decoderFromPbSpec M A lim)) := @@ -745,7 +747,7 @@ theorem decoder_from_pb_cl_on [LibsignalPlacement] (hshim_sat : HookSat (Rust.withPanics ext) spqrRustNoAllocShimSym rustAllocShimVmSpec) (hdealloc_sat : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy_sat : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyVmAcpSpec) - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) (hidx : idx < 619 := by decide) : subroutine_ok callerProg (lsmpl.base 376) (withLsCodeLoaded lsmpl (DefsBudget.decoderFromPbSpec M A lim)) := @@ -760,7 +762,7 @@ theorem decoder_from_pb_mem_on [LibsignalPlacement] (hshim_sat : HookSat (Rust.withPanics ext) spqrRustNoAllocShimSym rustAllocShimVmSpec) (hdealloc_sat : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy_sat : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyVmAcpSpec) - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) (hcl : LibsignalCodeLoaded lsmpl m) (hidx : idx < 619 := by decide) : subroutine_ok callerProg (lsmpl.base 376) (withMemEq m (DefsBudget.decoderFromPbSpec M A lim)) := @@ -776,7 +778,7 @@ theorem decoder_from_pb_on_333_placed_ok_ext [LibsignalPlacement] (hshim_sat : HookSat (Rust.withPanics ext) spqrRustNoAllocShimSym rustAllocShimVmSpec) (hdealloc_sat : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy_sat : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyVmAcpSpec) - (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveVmAcpSpec 0)) : + (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym (sessionMemmoveBoundedVmAcpSpec 0)) : DefsBudget.DecoderFromPbPlacedOkExt M A lim ext := decoder_from_pb_cl_on (callerProg := lsProg_333 (Rust.withPanics ext)) halloc_sat hshim_sat hdealloc_sat hmemcpy_sat hmemmove_sat diff --git a/LibsignalBinary/Proofs/SpqrV1/States/FromPb/TopPlacedBudget.lean b/LibsignalBinary/Proofs/SpqrV1/States/FromPb/TopPlacedBudget.lean index 61814c093..c11027069 100644 --- a/LibsignalBinary/Proofs/SpqrV1/States/FromPb/TopPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SpqrV1/States/FromPb/TopPlacedBudget.lean @@ -10,6 +10,7 @@ limitations under the License. module public import LibsignalBinary.Heap.SpecBudget +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove public import LibsignalBinary.Proofs.SpqrV1.Chain.NextKeyInternalBudget public import LibsignalBinary.Proofs.SpqrV1.States.FromPb.DefsPlacedBudget public import LibsignalBinary.Proofs.SpqrV1.States.FromPb.TopPlaced @@ -62,6 +63,7 @@ open CryptoVerification.SpqrV1.Unchunked open CryptoVerification.SpqrV1.ProtoRepr open CryptoVerification.SpqrV1.States.FromPb open LibsignalBinary.Heap +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open LibsignalBinary.Proofs.SpqrV1.Chain.NextKeyInternalBudget (withAllocVmPreserved) open LibsignalBinary.Proofs.SpqrV1.States.FromPb.DefsBudget open LibsignalBinary.Proofs.SpqrV1.States.FromPb.Variant2aPlacedBudgetAux @@ -71,9 +73,9 @@ private theorem hookSat_sessionMemmoveVmAcp_of_withAllocVmPreserved {H : String → Option (State → State)} (hookStack : Nat := 0) (h : HookSat H spqrMemmoveSym (LibsignalBinary.Proofs.SpqrV1.Chain.NextKeyInternalBudget.withAllocVmPreserved - (sessionMemmoveSpec hookStack))) : + (sessionMemmoveBoundedSpec hookStack))) : HookSat H spqrMemmoveSym - (LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbInnerPlacedBudget.sessionMemmoveVmAcpSpec + (LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbInnerPlacedBudget.sessionMemmoveBoundedVmAcpSpec hookStack) := by rcases h with ⟨fn, hfn, hbody⟩ refine ⟨fn, hfn, fun (base, buf, dst, src, len) R s0 hrun hpre hal => ?_⟩ @@ -82,12 +84,13 @@ private theorem hookSat_sessionMemmoveVmAcp_of_withAllocVmPreserved rcases hout with ⟨hret, hcc, hpost⟩ | ⟨_, hpan⟩ | ⟨_, _, hex⟩ | ⟨_, hoom⟩ · refine Or.inl ⟨hret, hcc, ?_⟩ dsimp only [LibsignalBinary.Proofs.SpqrV1.Chain.NextKeyInternalBudget.withAllocVmPreserved, - sessionMemmoveSpec] at hpost + sessionMemmoveBoundedSpec, sessionMemmoveSpec] at hpost rw [sepConj_assoc, satisfies_pure_sepConj] at hpost rcases hpost with ⟨⟨hacp, hvm⟩, hpost⟩ rw [sepConj_assoc, sepConj_assoc, satisfies_pure_sepConj] at hpost rcases hpost with ⟨⟨hx0, htr⟩, hrest⟩ - dsimp only [LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbInnerPlacedBudget.sessionMemmoveVmAcpSpec] + dsimp only [LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbInnerPlacedBudget.sessionMemmoveBoundedVmAcpSpec, + LibsignalBinary.Proofs.SpqrV1.Poly.DecoderPb.FromPbInnerPlacedBudget.sessionMemmoveVmAcpSpec] rw [sepConj_assoc, sepConj_assoc, satisfies_pure_sepConj] exact ⟨⟨hx0, htr, hacp, hvm⟩, hrest⟩ · exact (not_satisfies_false_sepConj hpan).elim @@ -105,7 +108,7 @@ theorem decoder_from_pb_ok_of_alloc_placed [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hA : FromPbAllocHooksBudget M A lim ext) - (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym (withAllocVmPreserved (sessionMemmoveSpec 0))) : + (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) : DefsBudget.DecoderFromPbPlacedOkExt M A lim ext := DecoderFromPbClPlacedBudget.decoder_from_pb_on_333_placed_ok_ext hA.alloc hA.shim hA.dealloc @@ -170,7 +173,7 @@ theorem states_from_pb_branch_proof_placed [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {F : ShaCompress} {ext : String → Option (State → State)} (hA : FromPbAllocHooksBudget M A lim ext) - (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym (withAllocVmPreserved (sessionMemmoveSpec 0))) + (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) (pb : V1State) : subroutine_ok (lsProg_333 (Rust.withPanics ext)) (lsmpl.base 333) @@ -199,7 +202,7 @@ theorem states_from_pb_ok_ext_placed [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {F : ShaCompress} {ext : String → Option (State → State)} (hA : FromPbAllocHooksBudget M A lim ext) - (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym (withAllocVmPreserved (sessionMemmoveSpec 0))) : + (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) : DefsBudget.StatesFromPbPlacedOkExt M A lim F ext := ProofPlacedBudget.states_from_pb_ok_of_forall_pb_placed (states_from_pb_branch_proof_placed hA hmemmove) @@ -207,7 +210,7 @@ theorem states_from_pb_ok_placed [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {F : ShaCompress} {ext : String → Option (State → State)} (hA : FromPbAllocHooksBudget M A lim ext) - (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym (withAllocVmPreserved (sessionMemmoveSpec 0))) : + (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) : DefsBudget.StatesFromPbPlacedOkExt M A lim F ext := states_from_pb_ok_ext_placed hA hmemmove @@ -215,7 +218,7 @@ theorem states_from_pb_ok_x_placed [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {F : ShaCompress} {ext : String → Option (State → State)} (hA : FromPbAllocHooksBudget M A lim ext) - (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym (withAllocVmPreserved (sessionMemmoveSpec 0))) : + (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) : StatesPlacedSeamsBudget.StatesFromPbPlacedOkX M A lim F ext := ProofPlacedBudget.states_from_pb_okX_of_ok_ext_placed (states_from_pb_ok_ext_placed hA hmemmove) diff --git a/LibsignalBinary/Proofs/SpqrV1/States/FromPb/TopPlacedTightBudgetR.lean b/LibsignalBinary/Proofs/SpqrV1/States/FromPb/TopPlacedTightBudgetR.lean index 584a516f6..b881efbbc 100644 --- a/LibsignalBinary/Proofs/SpqrV1/States/FromPb/TopPlacedTightBudgetR.lean +++ b/LibsignalBinary/Proofs/SpqrV1/States/FromPb/TopPlacedTightBudgetR.lean @@ -10,6 +10,7 @@ limitations under the License. module public import LibsignalBinary.Heap.SpecBudget +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove public import LibsignalBinary.Proofs.PeakBudget.SpqrCodecPeakSpec public import LibsignalBinary.Proofs.PeakBudget.SpqrTrialDomainLiftAux public import LibsignalBinary.Proofs.SpqrV1.Chain.NextKeyInternalBudget @@ -66,7 +67,7 @@ open CryptoVerification.LibsignalSpqrV1 (Bytes MlKem PolynomialDecoder PolynomialEncoder PqRatchetState ProtoAuthenticator States V1State spqrAuthApi spqrDecodeState spqrPolyApi) open CryptoVerification.LibsignalTripleRatchet - (extract_withLsCodeRoLoaded sessionMemmoveSpec withLsCodeRoLoaded) + (extract_withLsCodeRoLoaded withLsCodeRoLoaded) open CryptoVerification.SpqrV1.Alloc (spqrMemmoveSym) open CryptoVerification.SpqrV1Sync.InSync (St) open CryptoVerification.SpqrV1Sync.SendTotal (BOkTight) @@ -78,6 +79,7 @@ open LibsignalBinary.Proofs.PeakBudget.SpqrCodecPeakSpec ekSentCt1ReceivedFromPbPostEnv_tight encoderFromPbEnv_tight) open LibsignalBinary.Proofs.PeakBudget.SpqrTightCapsAux (ValidOptEncPbPtsAt ValidV1PtsAt) open LibsignalBinary.Proofs.SpqrV1.Auth.FromPbBudget (authFromPbEvents authKeyCloneEvents) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open LibsignalBinary.Proofs.SpqrV1.Chain.NextKeyInternalBudget (withAllocVmPreserved) open LibsignalBinary.Proofs.SpqrV1.States.FromPb.DefsBudget (StatesFromPbEnv statesFromPbPlacedRoFreeSpecXOfEnv statesFromPbPlacedSpecXOfEnv @@ -1044,7 +1046,7 @@ theorem e2b_states_from_pb_branch_proof_placed_exact [LibsignalPlacement] {F : ShaCompress} {ext : String → Option (State → State)} (hA : FromPbAllocHooksBudget M A lim ext) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec 0))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) (pb : V1State) : subroutine_ok (lsProg_333 (Rust.withPanics ext)) (lsmpl.base 333) @@ -1092,7 +1094,7 @@ theorem e2b_states_from_pb_branch_proof_placed_tight [LibsignalPlacement] {F : ShaCompress} {ext : String → Option (State → State)} (hA : FromPbAllocHooksBudget M A lim ext) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec 0))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) {pb : V1State} (hDom : e2b_StatesFromPbTightDom pb) : subroutine_ok (lsProg_333 (Rust.withPanics ext)) (lsmpl.base 333) @@ -1108,7 +1110,7 @@ theorem e2b_states_from_pb_ok_x_placed_exact [LibsignalPlacement] {F : ShaCompress} {ext : String → Option (State → State)} (hA : FromPbAllocHooksBudget M A lim ext) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec 0))) : + (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) : StatesFromPbPlacedOkXOfEnv M A lim F ext (e2b_StatesFromPbExactEnv F) := ProofPlacedBudget.states_from_pb_okX_of_ok_ext_placed_of_env (ProofPlacedBudget.states_from_pb_ok_of_forall_pb_placed_of_env @@ -1122,7 +1124,7 @@ theorem e2b_states_from_pb_branch_proof_placed_guardedTight [LibsignalPlacement] {F : ShaCompress} {ext : String → Option (State → State)} (hA : FromPbAllocHooksBudget M A lim ext) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec 0))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) (pb : V1State) : subroutine_ok (lsProg_333 (Rust.withPanics ext)) (lsmpl.base 333) @@ -1143,7 +1145,7 @@ theorem e2b_states_from_pb_ok_x_placed_guardedTight [LibsignalPlacement] {F : ShaCompress} {ext : String → Option (State → State)} (hA : FromPbAllocHooksBudget M A lim ext) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec 0))) : + (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) : StatesFromPbPlacedOkXOfEnv M A lim F ext e2b_StatesFromPbGuardedTightEnv := ProofPlacedBudget.states_from_pb_okX_of_ok_ext_placed_of_env (ProofPlacedBudget.states_from_pb_ok_of_forall_pb_placed_of_env @@ -1156,7 +1158,7 @@ theorem e2b_states_from_pb_ok_x_placed_impTight [LibsignalPlacement] {F : ShaCompress} {ext : String → Option (State → State)} (hA : FromPbAllocHooksBudget M A lim ext) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec 0))) : + (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) : StatesFromPbPlacedOkXOfEnv M A lim F ext e2b_StatesFromPbImpTightEnv := ProofPlacedBudget.states_from_pb_okX_of_ok_ext_placed_of_env (ProofPlacedBudget.states_from_pb_ok_of_forall_pb_placed_of_env fun pb => @@ -1171,7 +1173,7 @@ theorem e2b_states_from_pb_roFree_ok_x_placed_guardedTight [LibsignalPlacement] {F : ShaCompress} {ext : String → Option (State → State)} (hA : FromPbAllocHooksBudget M A lim ext) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec 0))) : + (withAllocVmPreserved (sessionMemmoveBoundedSpec 0))) : subroutine_ok (libsignalSessionLib.blockProgram lsmpl 333 (Rust.withPanics ext)) (lsmpl.base 333) (withLsCodeRoLoaded lsmpl diff --git a/LibsignalBinary/Proofs/SpqrV1/States/Leaves/AddChunkCl1PlacedBudget.lean b/LibsignalBinary/Proofs/SpqrV1/States/Leaves/AddChunkCl1PlacedBudget.lean index b2c82f368..11161a75c 100644 --- a/LibsignalBinary/Proofs/SpqrV1/States/Leaves/AddChunkCl1PlacedBudget.lean +++ b/LibsignalBinary/Proofs/SpqrV1/States/Leaves/AddChunkCl1PlacedBudget.lean @@ -9,6 +9,7 @@ limitations under the License. module +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpqrV1.States.Leaves.AddChunkCl1PlacedBudgetAux import LibsignalBinary.Proofs.Common.SharedHelpers meta import LibsignalBinary.Proofs.Common.SharedHelpers -- shake: keep @@ -68,10 +69,13 @@ open LibsignalBinary.Heap ( rustCliAllocBudgetSpec rustCliReallocBudgetSpec ) open LibsignalBinary.Heap.RustStdAllocBudgetBridge (rustAllocShimVmSpec) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open LibsignalBinary.Proofs.SpqrV1.Alloc.GrowOneBudget ( growOnePtFullSpec growOnePtSpec ) -open LibsignalBinary.Proofs.SpqrV1.Alloc.VecDequeGrowBudgetAux (sessionMemmoveAcpSpec) +open LibsignalBinary.Proofs.SpqrV1.Alloc.VecDequeGrowBudgetAux ( + sessionMemmoveAcpSpec sessionMemmoveBoundedAcpSpec +) open LibsignalBinary.Proofs.SpqrV1.Chain.NextKeyInternalBudget ( allocCallPreserved_trans withAllocVmPreserved ) @@ -145,7 +149,7 @@ theorem addChunk_body_cl_placed_wpp [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (lsmpl.base 357) (withLsCodeLoaded lsmpl (withAllocCallPreserved (growOnePtFullSpec M A lim)))) (hgrow_empty : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) @@ -330,7 +334,7 @@ theorem addChunk_loop_cl_placed_wpp [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (lsmpl.base 357) (withLsCodeLoaded lsmpl (withAllocCallPreserved (growOnePtFullSpec M A lim)))) (hgrow_empty : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) @@ -566,7 +570,7 @@ theorem add_chunk_bsearch_cl_placed_ok_ext [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (lsmpl.base 357) (withLsCodeLoaded lsmpl (withAllocCallPreserved (growOnePtFullSpec M A lim)))) (hgrow_empty : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) @@ -628,7 +632,7 @@ theorem add_chunk_cl_placed_ok_ext [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (lsmpl.base 357) (withLsCodeLoaded lsmpl (withAllocCallPreserved (growOnePtFullSpec M A lim)))) (hgrow_empty : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) @@ -704,7 +708,7 @@ theorem add_chunk_cl_placed_ok_x_ext [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (lsmpl.base 357) (withLsCodeLoaded lsmpl (withAllocCallPreserved (growOnePtFullSpec M A lim)))) (hgrow_empty : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) @@ -716,19 +720,20 @@ theorem add_chunk_cl_placed_ok_x_ext [LibsignalPlacement] /-! ## 3. Closed `[LibsignalPlacement]` `HookSat` Corollaries (`withLsCodeLoaded` & `withLsCodeRoLoaded`) -/ -/-- Bridge `HookSat H sym (sessionMemmoveAcpSpec stk)` to - `HookSat H sym (withAllocVmPreserved (sessionMemmoveSpec stk))`. -/ +/-- Bridge `HookSat H sym (sessionMemmoveBoundedAcpSpec stk)` to + `HookSat H sym (withAllocVmPreserved (sessionMemmoveBoundedSpec stk))`. -/ theorem hookSat_memmove_withAllocVmPreserved_of_acp {H : String → Option (State → State)} {sym : String} {stk : Nat} - (h : HookSat H sym (sessionMemmoveAcpSpec stk)) : - HookSat H sym (withAllocVmPreserved (sessionMemmoveSpec stk)) := by + (h : HookSat H sym (sessionMemmoveBoundedAcpSpec stk)) : + HookSat H sym (withAllocVmPreserved (sessionMemmoveBoundedSpec stk)) := by rcases h with ⟨fn, hfn, hok⟩ refine ⟨fn, hfn, fun x R s0 hrun hpre hsp => ?_⟩ rcases hok x R s0 hrun hpre hsp with ⟨hkf, hsym, hout⟩ refine ⟨hkf, hsym, ?_⟩ rcases hout with ⟨hret, hcc, hpost⟩ | hfail · refine Or.inl ⟨hret, hcc, ?_⟩ - dsimp only [sessionMemmoveAcpSpec, withAllocVmPreserved, sessionMemmoveSpec] at hpost ⊢ + dsimp only [sessionMemmoveBoundedAcpSpec, sessionMemmoveAcpSpec, + withAllocVmPreserved, sessionMemmoveBoundedSpec, sessionMemmoveSpec] at hpost ⊢ simp only [sepConj_assoc, satisfies_pure_sepConj] at hpost ⊢ exact ⟨hpost.1.2, ⟨hpost.1.1, hpost.1.2.1.2.1⟩, hpost.2⟩ · exact Or.inr hfail @@ -744,7 +749,7 @@ theorem add_chunk_cl_placed_ok [LibsignalPlacement] (halloc : HookSat (Rust.withPanics ext) spqrRustAllocSym (rustCliAllocBudgetSpec M A lim false)) (hrealloc : HookSat (Rust.withPanics ext) spqrRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) : + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (blkPl_419).base (withLsCodeLoaded lsmpl (addChunkSpec M A lim)) := add_chunk_cl_placed_ok_ext hmemmove_sat @@ -763,7 +768,7 @@ theorem add_chunk_cl_placed_ok_x [LibsignalPlacement] (halloc : HookSat (Rust.withPanics ext) spqrRustAllocSym (rustCliAllocBudgetSpec M A lim false)) (hrealloc : HookSat (Rust.withPanics ext) spqrRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) : + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (blkPl_419).base (withLsCodeLoaded lsmpl (addChunkSpecX M A lim)) := addChunkSpecX_cl_of_addChunkSpec_cl @@ -779,7 +784,7 @@ theorem add_chunk_cro_placed_ok [LibsignalPlacement] (halloc : HookSat (Rust.withPanics ext) spqrRustAllocSym (rustCliAllocBudgetSpec M A lim false)) (hrealloc : HookSat (Rust.withPanics ext) spqrRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) : + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (blkPl_419).base (withLsCodeRoLoaded lsmpl (addChunkSpec M A lim)) := subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded @@ -795,7 +800,7 @@ theorem add_chunk_cro_placed_ok_x [LibsignalPlacement] (halloc : HookSat (Rust.withPanics ext) spqrRustAllocSym (rustCliAllocBudgetSpec M A lim false)) (hrealloc : HookSat (Rust.withPanics ext) spqrRustReallocSym (rustCliReallocBudgetSpec M A lim)) (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) : + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (blkPl_419).base (withLsCodeRoLoaded lsmpl (addChunkSpecX M A lim)) := subroutine_ok_withLsCodeRoLoaded_of_withLsCodeLoaded diff --git a/LibsignalBinary/Proofs/SpqrV1/States/Leaves/AddChunkCl1PlacedBudgetAux.lean b/LibsignalBinary/Proofs/SpqrV1/States/Leaves/AddChunkCl1PlacedBudgetAux.lean index d2c0e9270..e44b1a2eb 100644 --- a/LibsignalBinary/Proofs/SpqrV1/States/Leaves/AddChunkCl1PlacedBudgetAux.lean +++ b/LibsignalBinary/Proofs/SpqrV1/States/Leaves/AddChunkCl1PlacedBudgetAux.lean @@ -9,6 +9,7 @@ limitations under the License. module +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpqrV1.Alloc.VecDequeGrowBudgetAux public import LibsignalBinary.Proofs.SpqrV1.Poly.AddChunk.LoopPlacedBudget public import LibsignalBinary.Proofs.SpqrV1.Poly.AddChunk.ProofPlacedBudgetAux @@ -54,7 +55,7 @@ open CryptoVerification ( ) open CryptoVerification.RustHeap (allocHookStack) open CryptoVerification.LibsignalSpqrV1 (Pt SortedSetPt) -open CryptoVerification.LibsignalTripleRatchet (sessionMemmoveSpec) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open CryptoVerification.SpqrV1.Alloc ( GrowGhost growOneStack spqrHandleErrorSym spqrMemmoveSym spqrRustAllocSym spqrRustNoAllocShimSym spqrRustReallocSym @@ -556,7 +557,7 @@ theorem bsearchReplace_cl_placed_wpp [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (lsmpl.base 357) (withLsCodeLoaded lsmpl (withAllocCallPreserved (growOnePtFullSpec M A lim)))) {target_pc : BitVec 64} {s0 st : State} @@ -805,7 +806,7 @@ theorem bsearchPush_cl_placed_wpp [LibsignalPlacement] {M : AllocCostModel} {A : RustCliAllocBudget M} {lim : BudgetLimits} {ext : String → Option (State → State)} (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hgrow_full : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) (lsmpl.base 357) (withLsCodeLoaded lsmpl (withAllocCallPreserved (growOnePtFullSpec M A lim)))) (hgrow_empty : subroutine_ok ((blkPC_419).rebase (blkPl_419).base (Rust.withPanics ext)) diff --git a/LibsignalBinary/Proofs/SpqrV1/States/Leaves/LeavesTopPlacedBudget.lean b/LibsignalBinary/Proofs/SpqrV1/States/Leaves/LeavesTopPlacedBudget.lean index 6d3597dd7..b7abe3b58 100644 --- a/LibsignalBinary/Proofs/SpqrV1/States/Leaves/LeavesTopPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SpqrV1/States/Leaves/LeavesTopPlacedBudget.lean @@ -9,6 +9,7 @@ limitations under the License. module +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpqrV1.Poly.NextChunk.EpiloguePlacedBudget public import LibsignalBinary.Proofs.SpqrV1.States.Leaves.AddChunkCl1PlacedBudget public import LibsignalBinary.Proofs.SpqrV1.States.Leaves.Batch2DefsPlacedBudget @@ -56,7 +57,8 @@ open CryptoVerification (LibsignalPlacement blkPC_347 blkPC_418 blkPC_419 blkPl_ open CryptoVerification.LibsignalSpqrV1 (MlKem SortedSetPt mlkemDecapsSpec mlkemEncaps2Spec mlkemValidatePkSpec) open CryptoVerification.LibsignalTripleRatchet (HkdfPlacedHooks keys_ls_subroutine_ok_of_block_cro - memsetName sessionMemcpyRegionSpec sessionMemmoveSpec withLsCodeRoLoaded) + memsetName sessionMemcpyRegionSpec withLsCodeRoLoaded) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open CryptoVerification.SpqrV1.Alloc (growOneStack spqrHandleErrorSym spqrMemcpySym spqrMemmoveSym spqrPanicConstAddOverflowSym spqrRustAllocSym spqrRustNoAllocShimSym spqrRustReallocSym) open CryptoVerification.SpqrV1.Kdf (spqrRustAllocZeroedSym) @@ -540,7 +542,7 @@ theorem keys_sampled_recv_ct1_chunk_placed_ok_x_ofPrePostEnv [LibsignalPlacement (hdealloc : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) : + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) : KeysSampledRecvCt1ChunkPlacedOkXOfPrePostEnv M A lim F PreEnv PostEnv ext := keys_sampled_recv_ct1_chunk_placed_cl_ext_of_sessionShim_ofPrePostEnv hPre hPost (hookSat_sessionShimBudget_of_rustAllocShimVm hshim) halloc hdealloc hmemcpy @@ -562,7 +564,7 @@ theorem keys_sampled_recv_ct1_chunk_placed_ok_x_ofEnv [LibsignalPlacement] (hdealloc : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) : + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) : KeysSampledRecvCt1ChunkPlacedOkXOfEnv M A lim F Env ext := keys_sampled_recv_ct1_chunk_placed_ok_x_ofPrePostEnv hPre hPost h_panic hshim halloc hrealloc hdealloc hmemcpy hmemmove @@ -577,7 +579,7 @@ theorem keys_sampled_recv_ct1_chunk_placed_ok_x [LibsignalPlacement] (hdealloc : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) : + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) : KeysSampledRecvCt1ChunkPlacedOkX M A lim F ext := keys_sampled_recv_ct1_chunk_placed_cl_ext_of_sessionShim (hookSat_sessionShimBudget_of_rustAllocShimVm hshim) halloc hdealloc hmemcpy @@ -602,7 +604,7 @@ theorem header_sent_recv_ct1_chunk_placed_ok_x_ofPrePostEnv [LibsignalPlacement] (hdealloc : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) : HeaderSentRecvCt1ChunkPlacedOkXOfPrePostEnv M A lim F PreEnv PostEnv ext := header_sent_recv_ct1_chunk_placed_cl_ext_ofPrePostEnv hPre hPost hdealloc hmemcpy @@ -629,7 +631,7 @@ theorem header_sent_recv_ct1_chunk_placed_ok_x_ofEnv [LibsignalPlacement] (hdealloc : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) : HeaderSentRecvCt1ChunkPlacedOkXOfEnv M A lim F Env ext := header_sent_recv_ct1_chunk_placed_ok_x_ofPrePostEnv @@ -645,7 +647,7 @@ theorem header_sent_recv_ct1_chunk_placed_ok_x [LibsignalPlacement] (hdealloc : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) : HeaderSentRecvCt1ChunkPlacedOkX M A lim F ext := header_sent_recv_ct1_chunk_placed_cl_ext hdealloc hmemcpy @@ -671,7 +673,7 @@ theorem ct1_received_recv_ct2_chunk_placed_ok_x_ofPrePostEnv [LibsignalPlacement (hdealloc : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) : + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) : Ct1ReceivedRecvCt2ChunkPlacedOkXOfPrePostEnv M A lim F PreEnv PostEnv ext := ct1_received_recv_ct2_chunk_placed_cl_ext_ofPrePostEnv hpre_sub hpost_sub hdealloc hmemcpy (ls_subroutine_ok_of_block (i := 346) (j := 419) @@ -689,7 +691,7 @@ theorem ct1_received_recv_ct2_chunk_placed_ok_x_ofEnv [LibsignalPlacement] (hdealloc : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) : + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) : Ct1ReceivedRecvCt2ChunkPlacedOkXOfEnv M A lim F Env ext := ct1_received_recv_ct2_chunk_placed_cl_ext_ofEnv hpost_sub hdealloc hmemcpy (ls_subroutine_ok_of_block (i := 346) (j := 419) @@ -705,7 +707,7 @@ theorem ct1_received_recv_ct2_chunk_placed_ok_x [LibsignalPlacement] (hdealloc : HookSat (Rust.withPanics ext) spqrRustDeallocSym (rustCliDeallocBudgetSpec M A lim)) (hmemcpy : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) : + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) : Ct1ReceivedRecvCt2ChunkPlacedOkX M A lim F ext := ct1_received_recv_ct2_chunk_placed_cl_ext hdealloc hmemcpy (ls_subroutine_ok_of_block (i := 346) (j := 419) @@ -804,7 +806,7 @@ theorem ct1_acknowledged_recv_ek_chunk_placed_closed_ok_x_ofPrePostEnv [Libsigna (hmemcpy : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionBudgetSpec) (hmemcpy_ro : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionROSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hval_pk : HookSat (Rust.withPanics ext) "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes" @@ -843,7 +845,7 @@ theorem ct1_acknowledged_recv_ek_chunk_placed_closed_ok_x_ofEnv [LibsignalPlacem (hmemcpy : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionBudgetSpec) (hmemcpy_ro : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionROSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hval_pk : HookSat (Rust.withPanics ext) "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes" @@ -880,7 +882,7 @@ theorem ct1_acknowledged_recv_ek_chunk_placed_closed_ok_x [LibsignalPlacement] (hmemcpy : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionBudgetSpec) (hmemcpy_ro : HookSat (Rust.withPanics ext) "memcpy" sessionMemcpyRegionROSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hval_pk : HookSat (Rust.withPanics ext) "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes" @@ -921,7 +923,7 @@ theorem noHeaderReceived_recv_hdr_chunk_placed_closed_okX_ofPrePostEnv [Libsigna (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hRO : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionROSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym (libcruxHmacBudgetSpec F M A lim)) (h_handle_error : (Rust.withPanics ext) spqrHandleErrorSym = some Rust.panicked) @@ -951,7 +953,7 @@ theorem noHeaderReceived_recv_hdr_chunk_placed_closed_okX_ofEnv [LibsignalPlacem (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hRO : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionROSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym (libcruxHmacBudgetSpec F M A lim)) (h_handle_error : (Rust.withPanics ext) spqrHandleErrorSym = some Rust.panicked) @@ -974,7 +976,7 @@ theorem noHeaderReceived_recv_hdr_chunk_placed_closed_okX [LibsignalPlacement] (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hRO : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionROSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym (libcruxHmacBudgetSpec F M A lim)) (h_handle_error : (Rust.withPanics ext) spqrHandleErrorSym = some Rust.panicked) @@ -1001,7 +1003,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_x_ofPrePostEnv [LibsignalP (hA : RecvCt2PlacedAlloc M A lim ext) (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -1021,7 +1023,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_x_ofEnv [LibsignalPlacemen (hA : RecvCt2PlacedAlloc M A lim ext) (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -1039,7 +1041,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_x [LibsignalPlacement] (hA : RecvCt2PlacedAlloc M A lim ext) (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -1056,7 +1058,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_x_of_alloc [LibsignalPlace {ext : String → Option (State → State)} [HkdfPlacedHooks F (Rust.withPanics ext)] (hA : RecvCt2PlacedAlloc M A lim ext) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -1076,7 +1078,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_x_of_hooks [LibsignalPlace (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hRO : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionROSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) @@ -1105,7 +1107,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_ext_ofPrePostEnv [Libsigna (hA : RecvCt2PlacedAlloc M A lim ext) (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -1125,7 +1127,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_ext_ofEnv [LibsignalPlacem (hA : RecvCt2PlacedAlloc M A lim ext) (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -1143,7 +1145,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_ext [LibsignalPlacement] (hA : RecvCt2PlacedAlloc M A lim ext) (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -1160,7 +1162,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_ext_of_alloc [LibsignalPla {ext : String → Option (State → State)} [HkdfPlacedHooks F (Rust.withPanics ext)] (hA : RecvCt2PlacedAlloc M A lim ext) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -1180,7 +1182,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_ext_of_hooks [LibsignalPla (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hRO : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionROSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) diff --git a/LibsignalBinary/Proofs/SpqrV1/States/Leaves/LeavesTopPlacedBudgetSat.lean b/LibsignalBinary/Proofs/SpqrV1/States/Leaves/LeavesTopPlacedBudgetSat.lean index 43d8af45b..1febc5c55 100644 --- a/LibsignalBinary/Proofs/SpqrV1/States/Leaves/LeavesTopPlacedBudgetSat.lean +++ b/LibsignalBinary/Proofs/SpqrV1/States/Leaves/LeavesTopPlacedBudgetSat.lean @@ -9,6 +9,7 @@ limitations under the License. module +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpqrV1.States.Leaves.LeavesTopPlacedBudget -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpqrV1.States.RecvCt2Chunk.ProofPlacedBudgetSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat -- proof-setup: allow-public-import @@ -33,7 +34,8 @@ open Arm64 ProofLib open CryptoGames.LibsignalSession (ShaCompress) open CryptoVerification (LibsignalPlacement) open CryptoVerification.LibsignalSpqrV1 (MlKem mlkemDecapsSpec) -open CryptoVerification.LibsignalTripleRatchet (memsetName sessionMemmoveSpec) +open CryptoVerification.LibsignalTripleRatchet (memsetName) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open CryptoVerification.SpqrV1.Alloc ( growOneStack spqrHandleErrorSym spqrMemcpySym spqrMemmoveSym spqrPanicConstAddOverflowSym spqrRustAllocSym spqrRustNoAllocShimSym spqrRustReallocSym @@ -90,7 +92,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_x_ofPrePostEnv_sat [Libsig (hA : RecvCt2PlacedAlloc M A lim ext) (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -110,7 +112,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_x_ofEnv_sat [LibsignalPlac (hA : RecvCt2PlacedAlloc M A lim ext) (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -128,7 +130,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_x_sat [LibsignalPlacement] (hA : RecvCt2PlacedAlloc M A lim ext) (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -145,7 +147,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_x_of_alloc_sat [LibsignalP {ext : String → Option (State → State)} [HkdfPlacedHooksExactBudgetSat F (Rust.withPanics ext)] (hA : RecvCt2PlacedAlloc M A lim ext) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -165,7 +167,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_x_of_hooks_sat [LibsignalP (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hRO : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionROSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) @@ -194,7 +196,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_ext_ofPrePostEnv_sat [Libs (hA : RecvCt2PlacedAlloc M A lim ext) (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -214,7 +216,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_ext_ofEnv_sat [LibsignalPl (hA : RecvCt2PlacedAlloc M A lim ext) (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -232,7 +234,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_ext_sat [LibsignalPlacemen (hA : RecvCt2PlacedAlloc M A lim ext) (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -249,7 +251,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_ext_of_alloc_sat [Libsigna {ext : String → Option (State → State)} [HkdfPlacedHooksExactBudgetSat F (Rust.withPanics ext)] (hA : RecvCt2PlacedAlloc M A lim ext) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) : @@ -269,7 +271,7 @@ theorem ek_sent_ct1_received_recv_ct2_chunk_placed_ok_ext_of_hooks_sat [Libsigna (hmemcpy : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionBudgetSpec) (hRO : HookSat (Rust.withPanics ext) spqrMemcpySym sessionMemcpyRegionROSpec) (hmemmove : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hdecaps : HookSat (Rust.withPanics ext) spqrMlkemDecapsSym (withVmPreserved (mlkemDecapsSpec K))) (hhmac : HookSat (Rust.withPanics ext) spqrLibcruxHmacSym' (libcruxHmacBudgetSpec F M A lim)) diff --git a/LibsignalBinary/Proofs/SpqrV1/States/Recv/TopPlacedBudget.lean b/LibsignalBinary/Proofs/SpqrV1/States/Recv/TopPlacedBudget.lean index b7cc659ea..fc6137181 100644 --- a/LibsignalBinary/Proofs/SpqrV1/States/Recv/TopPlacedBudget.lean +++ b/LibsignalBinary/Proofs/SpqrV1/States/Recv/TopPlacedBudget.lean @@ -10,6 +10,7 @@ limitations under the License. module public import LibsignalBinary.Heap.SpecBudget +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpqrV1.Chain.NextKeyInternalBudget public import LibsignalBinary.Proofs.SpqrV1.States.Leaves.LeavesTopPlacedBudget public import LibsignalBinary.Proofs.SpqrV1.States.Recv.ArmCt1Acknowledged3PlacedBudget @@ -60,6 +61,7 @@ open CryptoVerification.SpqrV1.States.RecvCt2Chunk (spqrMlkemDecapsSym) open CryptoVerification.SpqrV1.Unchunked (spqrLibcruxHmacSym spqrMlkemEncaps2Sym) open LibsignalBinary.Heap open LibsignalBinary.Heap.SpecBudget (libcruxHmacBudgetSpec withVmPreserved) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open LibsignalBinary.Proofs.SpqrV1.Chain.NextKeyInternalBudget (withAllocVmPreserved) open LibsignalBinary.Proofs.SpqrV1.Top.InitInner.DefsPlacedBudget (SpqrBoundedEvs) open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget @@ -209,7 +211,7 @@ theorem statesRecvPlacedContracts_of_ro_leaves [LibsignalPlacement] [HkdfPlacedHooks F (Rust.withPanics ext)] (hA : RecvCt2PlacedAlloc M A lim ext) (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset_sat : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hval_pk_sat : HookSat (Rust.withPanics ext) "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes" @@ -285,7 +287,7 @@ theorem states_recv_placed_ok_x_closed [LibsignalPlacement] [HkdfPlacedHooks F (Rust.withPanics ext)] (hA : RecvCt2PlacedAlloc M A lim ext) (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset_sat : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hval_pk_sat : HookSat (Rust.withPanics ext) "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes" diff --git a/LibsignalBinary/Proofs/SpqrV1/States/Recv/TopPlacedBudgetSat.lean b/LibsignalBinary/Proofs/SpqrV1/States/Recv/TopPlacedBudgetSat.lean index 20ed4ab83..77a052d35 100644 --- a/LibsignalBinary/Proofs/SpqrV1/States/Recv/TopPlacedBudgetSat.lean +++ b/LibsignalBinary/Proofs/SpqrV1/States/Recv/TopPlacedBudgetSat.lean @@ -9,6 +9,7 @@ limitations under the License. module +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpqrV1.States.Leaves.LeavesTopPlacedBudgetSat -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.SpqrV1.States.Recv.TopPlacedBudget -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.TripleRatchet.Hkdf.CommonBudgetSat -- proof-setup: allow-public-import @@ -35,8 +36,9 @@ open CryptoVerification.LibsignalSpqrV1 ( MlKem mlkemDecapsSpec mlkemEncaps2Spec mlkemValidatePkSpec ) open CryptoVerification.LibsignalTripleRatchet ( - keys_ls_subroutine_ok_of_block_cro memsetName sessionMemmoveSpec + keys_ls_subroutine_ok_of_block_cro memsetName ) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedSpec) open CryptoVerification.SpqrV1.Alloc (growOneStack spqrMemmoveSym) open CryptoVerification.SpqrV1.States.RecvCt2Chunk (spqrMlkemDecapsSym) open CryptoVerification.SpqrV1.Unchunked (spqrLibcruxHmacSym spqrMlkemEncaps2Sym) @@ -86,7 +88,7 @@ theorem statesRecvPlacedContracts_of_ro_leaves_sat [LibsignalPlacement] [HkdfPlacedHooksExactBudgetSat F (Rust.withPanics ext)] (hA : RecvCt2PlacedAlloc M A lim ext) (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset_sat : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hval_pk_sat : HookSat (Rust.withPanics ext) "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes" @@ -161,7 +163,7 @@ theorem states_recv_placed_ok_x_closed_sat [LibsignalPlacement] [HkdfPlacedHooksExactBudgetSat F (Rust.withPanics ext)] (hA : RecvCt2PlacedAlloc M A lim ext) (hmemmove_sat : HookSat (Rust.withPanics ext) spqrMemmoveSym - (withAllocVmPreserved (sessionMemmoveSpec growOneStack))) + (withAllocVmPreserved (sessionMemmoveBoundedSpec growOneStack))) (hmemset_sat : HookSat (Rust.withPanics ext) memsetName sessionMemsetRegionBudgetSpec) (hval_pk_sat : HookSat (Rust.withPanics ext) "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes" diff --git a/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhCommitMainBudget.lean b/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhCommitMainBudget.lean index 340c3fa4d..f154dd47f 100644 --- a/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhCommitMainBudget.lean +++ b/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhCommitMainBudget.lean @@ -59,6 +59,7 @@ open LibsignalBinary.Heap ( rustCliAllocBudgetSpec rustCliAllocNoOomSpec rustCliDeallocBudgetSpec subroutine_ok_allocNoOom_of_budget ) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedBudgetSpec) open LibsignalBinary.Proofs.SessionRecordAt.Stage1X.GrowOneXBudget (growOneChainSpecX) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( chainKeyToPbSpec chainKeyToPbSpecX framelessMemcpyBudgetSpec noAllocShimBudgetSpec @@ -71,7 +72,6 @@ open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhCommitStep3Budget (growOneSp open LibsignalBinary.Proofs.TripleRatchet.Getters.DefsBudget ( dropChainSpec dropChainSpecX ) -open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemmoveBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhCommitMainBudgetCore ( DhCommitBlockVmWp dhCommitBlockVmWp_159 dhCommitBlockVmWp_549 @@ -191,7 +191,7 @@ theorem dhCommit_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) (x : TryDecryptGhost) (trG : TrGhost) (tr : TripleRatchet (List (BitVec 8))) (st1 : SessionState (List (BitVec 8))) (sc : SenderChain) (receiverChainKey : ChainKey) (newSenderKey : KeyPair) @@ -304,7 +304,7 @@ theorem dhCommit_x_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) (x : TryDecryptGhost) (trG : TrGhost) (tr : TripleRatchet (List (BitVec 8))) (st1 : SessionState (List (BitVec 8))) (sc : SenderChain) (receiverChainKey : ChainKey) (newSenderKey : KeyPair) @@ -418,7 +418,7 @@ theorem s3_commit_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) (hlr_alloc : LsRetAddr624 (entry + 0xa00#64) := by first | assumption @@ -455,7 +455,7 @@ theorem s3_commit_budget_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocBudgetSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) (hlr_alloc : LsRetAddr624 (entry + 0xa00#64) := by first | assumption @@ -488,7 +488,7 @@ theorem s3_commit_x_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) (hlr_alloc : LsRetAddr624 (entry + 0xa00#64) := by first | assumption @@ -527,7 +527,7 @@ theorem s3_commit_x_budget_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocBudgetSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) (hlr_alloc : LsRetAddr624 (entry + 0xa00#64) := by first | assumption @@ -565,7 +565,7 @@ theorem s3_commit_159_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3CommitSeamPlaced ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.base 131) C A lim ctl uuidTryParse S s3CommitDefaultEnv := s3_commit_placed_ok (dhCommitBlockVmWp_159 H) C A lim ctl uuidTryParse S @@ -594,7 +594,7 @@ theorem s3_commit_159_x_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) : S3CommitSeamXPlaced ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.base 131) C decFn A lim ctl uuidTryParse S s3CommitDefaultEnv := s3_commit_x_placed_ok (dhCommitBlockVmWp_159 H) C decFn A lim ctl uuidTryParse S @@ -621,7 +621,7 @@ theorem s3_commit_549_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3CommitSeamPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S s3CommitDefaultEnv := s3_commit_placed_ok (dhCommitBlockVmWp_549 H) C A lim ctl uuidTryParse S @@ -650,7 +650,7 @@ theorem s3_commit_549_x_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) : S3CommitSeamXPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C decFn A lim ctl uuidTryParse S s3CommitDefaultEnv := s3_commit_x_placed_ok (dhCommitBlockVmWp_549 H) C decFn A lim ctl uuidTryParse S diff --git a/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhCommitMainBudgetCore.lean b/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhCommitMainBudgetCore.lean index 169e90ef9..98fc462cf 100644 --- a/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhCommitMainBudgetCore.lean +++ b/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhCommitMainBudgetCore.lean @@ -74,6 +74,7 @@ open LibsignalBinary.Heap ( AllocCostModel AllocEvent BudgetLimits FitsEnv FitsEvents FreeOnlyEvs RustCliAllocBudget SeqEnv fitsEvents_append rustCliAllocNoOomSpec rustCliDeallocBudgetSpec ) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( chainKeyToPbSpecWithStack framelessMemcpyBudgetSpec noAllocShimBudgetSpec publicKeySerializeSpecWithStack @@ -94,7 +95,6 @@ open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhCommitStep3Budget ( dhCommitStep3Events dhCommitStep3aEvents dhCommit_step3_of_wp fitsEvents_dhCommitStep3a_of_step3 growOneSpecWithStack ) -open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemmoveBudgetSpec) set_option maxRecDepth 200000 set_option maxHeartbeats 400000 @@ -175,7 +175,7 @@ theorem dhCommit_withStack_env_of_wp [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropStk)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropStk)) (x : TryDecryptGhost) (trG : TrGhost) (tr : TripleRatchet (List (BitVec 8))) (st1 : SessionState (List (BitVec 8))) (sc : SenderChain) (receiverChainKey : ChainKey) (newSenderKey : KeyPair) diff --git a/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhCommitMainBudgetStep4.lean b/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhCommitMainBudgetStep4.lean index 89cc42338..2969c6847 100644 --- a/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhCommitMainBudgetStep4.lean +++ b/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhCommitMainBudgetStep4.lean @@ -9,6 +9,7 @@ limitations under the License. module +public import LibsignalBinary.Proofs.HookDischarge.Libc.Memmove -- proof-setup: allow-public-import public import LibsignalBinary.Proofs.Placed.BudgetVmSteps public import LibsignalBinary.Proofs.Placed.ElfLsRetAddr public import LibsignalBinary.Proofs.TripleRatchet.Decrypt.DecryptCodeSym130 @@ -72,6 +73,9 @@ open CryptoVerification.LibsignalTripleRatchet.Decrypt.DhCommit.DhCommitFacts ( open LibsignalBinary.Heap ( AllocCostModel AllocEvent BudgetLimits FreeOnlyEvs RustCliAllocBudget VmPreserved ) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove ( + MemmoveArithBound sessionMemmoveBoundedBudgetSpec +) open LibsignalBinary.Proofs.Placed.ElfLsRetAddr (LsRetAddr624 lsLen) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhCommitEvictBudget ( evictActive evictActiveX @@ -483,6 +487,15 @@ theorem steps_of_call_no_panic {α : Type} {prog : Program} {s : State} set_option maxRecDepth 200000 set_option maxHeartbeats 400000 +private theorem repAlloc_live_noWrap {M : AllocCostModel} (A : RustCliAllocBudget M) + (p : BitVec 64) (n al : Nat) : + A.repAlloc.live p n al ⊢ ⌜p.toNat + n < 2 ^ 64⌝ ∗ A.repAlloc.live p n al := by + simp only [RustCliAllocBudget.repAlloc_live] + refine Entails.trans (A.block_valid p n al) ?_ + apply Entails.pure_left + rintro ⟨_, _, hnw, _⟩ + exact Entails.pure_right hnw (Entails.refl _) + /-- Single iteration of the receiver-chain eviction loop (`+0xb04 → +0xb8c`) for `gc₀ :: gcs`, yielding `FreeOnlyEvs evs` with zero `FitsEnv` preconditions. -/ theorem dhCommit_evict_one_of_wp [LibsignalPlacement] @@ -490,7 +503,7 @@ theorem dhCommit_evict_one_of_wp [LibsignalPlacement] {stk : Nat} {M : AllocCostModel} (A : RustCliAllocBudget M) (lim : BudgetLimits) (st : M.σ) (hwp_pre : CommitStep4bPreMemmoveVmWp prog entry memmoveEntry) (hwp_post : CommitStep4bPostMemmoveVmWp prog entry dropChainEntry) - (hMemmove : subroutine_ok prog memmoveEntry (sessionMemmoveBudgetSpec stk)) + (hMemmove : subroutine_ok prog memmoveEntry (sessionMemmoveBoundedBudgetSpec stk)) (hDrop : subroutine_ok prog dropChainEntry (dropChainSpecWithStack stk M A lim)) (R Frame : SepProp) (s0 s : State) (sp chainsCap chainsPtr : BitVec 64) @@ -554,6 +567,12 @@ theorem dhCommit_evict_one_of_wp [LibsignalPlacement] rcases hexp_pull with ⟨bs_rest, hexp_pull⟩ rw [sepConj_assoc, satisfies_pure_sepConj] at hexp_pull rcases hexp_pull with ⟨⟨hpad₀, hrest, hbs_len, hcap_le, hcap_lt, hptr, _hcap_ne⟩, hm0⟩ + have hnw : chainsPtr.toNat + chainsCap.toNat * 104 < 2 ^ 64 := by + have h := Satisfies.mono + (sepConj_mono_left (sepConj_mono_left + (repAlloc_live_noWrap A chainsPtr (chainsCap.toNat * 104) 8))) hm0 + simp only [sepConj_assoc, satisfies_pure_sepConj] at h + exact h.1 have hsrk_pull : s.mem ⊨ chainHeap A.repAlloc gc₀ ∗ (A.repAlloc.live chainsPtr (chainsCap.toNat * 104) 8 ∗ @@ -672,9 +691,13 @@ theorem dhCommit_evict_one_of_wp [LibsignalPlacement] have hx2_toNat : (s1.readReg64 .x2).toNat = gcs.length * 104 := by rw [hx2_1, List.length_cons] exact memmove_len_toNat hlen_lt + have hbound : MemmoveArithBound chainsPtr (b₀ ++ bs_rest) := by + have hmul : (gcs.length + 1) * 104 ≤ chainsCap.toNat * 104 := + Nat.mul_le_mul_right 104 hcap_le + refine ⟨?_, ?_⟩ <;> rw [List.length_append, hb₀_len, hbs_len] <;> omega have hm_memmove : s1.mem ⊨ - (sessionMemmoveBudgetSpec stk).pre (chainsPtr, b₀ ++ bs_rest, 0, 104, gcs.length * 104) s1 ∗ + (sessionMemmoveBoundedBudgetSpec stk).pre (chainsPtr, b₀ ++ bs_rest, 0, 104, gcs.length * 104) s1 ∗ ((((sp + 0x40#64) ↦₆₄ chainsPtr) ∗ ((sp + 0x48#64) ↦₆₄ BitVec.ofNat 64 (gc₀ :: gcs).length) ∗ memRegion (sp + 0x190#64) 104 ∗ @@ -689,6 +712,9 @@ theorem dhCommit_evict_one_of_wp [LibsignalPlacement] chainHeaps A.repAlloc gcs ∗ A.pool lim st s1 ∗ Frame) ∗ R) := by + dsimp only [sessionMemmoveBoundedBudgetSpec] + rw [sepConj_assoc, satisfies_pure_sepConj] + refine ⟨hbound, ?_⟩ dsimp only [sessionMemmoveBudgetSpec, sessionMemmoveSpec, libcMemmoveSpec] have hpre_pure : s1.readReg64 .x0 = chainsPtr + BitVec.ofNat 64 0 ∧ @@ -707,7 +733,7 @@ theorem dhCommit_evict_one_of_wp [LibsignalPlacement] refine steps_of_call_no_panic hMemmove hpc1 hrun1 hsp_align1 hx30_1 hm_memmove hL1 (by intro _; rfl) (by intros; rfl) (by intro _; rfl) ?_ intro s2 hpc2 hrun2 hsp2 hsp_align2 hcs2 hL2 hm_s2 - dsimp only [sessionMemmoveBudgetSpec, sessionMemmoveSpec] at hm_s2 + dsimp only [sessionMemmoveBoundedBudgetSpec, sessionMemmoveBudgetSpec, sessionMemmoveSpec] at hm_s2 rw [hsp1, sepConj_assoc, satisfies_pure_sepConj] at hm_s2 rcases hm_s2 with ⟨hvm2, hm_s2⟩ rw [sepConj_assoc, satisfies_pure_sepConj] at hm_s2 diff --git a/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhStepBudget.lean b/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhStepBudget.lean index f91a1e1b9..b837a80f3 100644 --- a/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhStepBudget.lean +++ b/LibsignalBinary/Proofs/TripleRatchet/Decrypt/DhStepBudget.lean @@ -82,6 +82,7 @@ open LibsignalBinary.Heap ( rustAllocEvents rustCliAllocBudgetSpec rustCliAllocNoOomSpec rustCliDeallocBudgetSpec rustDeallocEvents subroutine_ok_allocNoOom_of_budget ) +open LibsignalBinary.Proofs.HookDischarge.Libc.Memmove (sessionMemmoveBoundedBudgetSpec) open LibsignalBinary.Proofs.SessionRecordAt.Stage1X.GrowOneXBudget (growOneChainSpecX) open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( chainKeyToPbSpec chainKeyToPbSpecX derivePublicKeyBytesBudgetSpec @@ -90,7 +91,6 @@ open LibsignalBinary.Proofs.TripleRatchet.Alloc.DefsBudget ( ) open LibsignalBinary.Proofs.TripleRatchet.Decrypt.DhCommitStep3Budget (growOneSpec) open LibsignalBinary.Proofs.TripleRatchet.Getters.DefsBudget (dropChainSpec dropChainSpecX) -open LibsignalBinary.Proofs.TripleRatchet.Hooks.DefsBudget (sessionMemmoveBudgetSpec) open LibsignalBinary.Proofs.TripleRatchet.Keys.DefsBudget ( CreateChainEnv createChainEvents createChainSpec createChainSpecWithStack createChainSpecX ) @@ -312,7 +312,7 @@ theorem dhStep_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) (x : TryDecryptGhost) (trG : TrGhost) (tr : TripleRatchet (List (BitVec 8))) (st1 : SessionState (List (BitVec 8))) (R : SepProp) (s0 s : State) (hfrom : Mut.exec TripleRatchet.fromSessionState x.st = (.ok tr, st1)) @@ -378,7 +378,7 @@ theorem dhStep_x_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) (x : TryDecryptGhost) (trG : TrGhost) (tr : TripleRatchet (List (BitVec 8))) (st1 : SessionState (List (BitVec 8))) (R : SepProp) (s0 s : State) (hfrom : Mut.exec TripleRatchet.fromSessionState x.st = (.ok tr, st1)) @@ -661,7 +661,7 @@ theorem s3_total_x_placed_okT [LibsignalPlacement] {M : AllocCostModel} (hAlloc : subroutine_ok prog (lsmpl.ρ lsRustAllocSym) (rustCliAllocNoOomSpec M A lim false)) (hDealloc : subroutine_ok prog (lsmpl.ρ lsRustDeallocSym) (rustCliDeallocBudgetSpec M A lim)) (hMemcpy : subroutine_ok prog (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) - (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) + (hMemmove : subroutine_ok prog (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) (hlr_alloc : LsRetAddr624 (entry + 0xa00#64) := by first | assumption @@ -720,7 +720,7 @@ theorem s3_159_placed_okT [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3SeamTightPlaced ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.base 131) C A lim ctl uuidTryParse S (s3DefaultEnv C) := s3_placed_okT (dhStepBlockVmWp_159 H) C A lim ctl S hcc hdpk hrng hsd @@ -757,7 +757,7 @@ theorem s3_159_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3SeamPlaced ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.base 131) C A lim ctl uuidTryParse S (s3DefaultEnv C) := (s3_159_placed_okT H C A lim ctl S hcc hdpk hrng hsd @@ -793,7 +793,7 @@ theorem s3_159_budget_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3SeamPlaced ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.base 131) C A lim ctl uuidTryParse S (s3DefaultEnv C) := s3_159_placed_ok H C A lim ctl S hcc hdpk hrng hsd hPkSer hToPb hGrowOne hDropChain @@ -831,7 +831,7 @@ theorem s3_159_x_placed_okT [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) : S3SeamTightXPlaced ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.base 131) C decFn A lim ctl uuidTryParse S (s3DefaultEnv C) := s3_total_x_placed_okT (dhStepBlockVmWp_159 H) (dhCommitBlockVmWp_159 H) @@ -870,7 +870,7 @@ theorem s3_159_x_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) : S3SeamXPlaced ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.base 131) C decFn A lim ctl uuidTryParse S (s3DefaultEnv C) := (s3_159_x_placed_okT H C decFn A lim ctl S hcc hdpk hrng hsd @@ -908,7 +908,7 @@ theorem s3_159_x_budget_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_131).rebase (blkPl_131).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) : S3SeamXPlaced ((blkPC_131).rebase (blkPl_131).base H) (lsmpl.base 131) C decFn A lim ctl uuidTryParse S (s3DefaultEnv C) := s3_159_x_placed_ok H C decFn A lim ctl S hcc hdpk hrng hsd hPkSer hToPb hGrowOne hDropChain @@ -944,7 +944,7 @@ theorem s3_549_placed_okT [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3SeamTightPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S (s3DefaultEnv C) := s3_placed_okT (dhStepBlockVmWp_549 H) C A lim ctl S hcc hdpk hrng hsd @@ -981,7 +981,7 @@ theorem s3_549_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3SeamPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S (s3DefaultEnv C) := (s3_549_placed_okT H C A lim ctl S hcc hdpk hrng hsd @@ -1017,7 +1017,7 @@ theorem s3_549_budget_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStack)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStack)) : S3SeamPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C A lim ctl uuidTryParse S (s3DefaultEnv C) := s3_549_placed_ok H C A lim ctl S hcc hdpk hrng hsd hPkSer hToPb hGrowOne hDropChain @@ -1055,7 +1055,7 @@ theorem s3_549_x_placed_okT [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) : S3SeamTightXPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C decFn A lim ctl uuidTryParse S (s3DefaultEnv C) := s3_total_x_placed_okT (dhStepBlockVmWp_549 H) (dhCommitBlockVmWp_549 H) @@ -1094,7 +1094,7 @@ theorem s3_549_x_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) : S3SeamXPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C decFn A lim ctl uuidTryParse S (s3DefaultEnv C) := (s3_549_x_placed_okT H C decFn A lim ctl S hcc hdpk hrng hsd @@ -1132,7 +1132,7 @@ theorem s3_549_x_budget_placed_ok [LibsignalPlacement] {M : AllocCostModel} (hMemcpy : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.ρ "memcpy") framelessMemcpyBudgetSpec) (hMemmove : subroutine_ok ((blkPC_434).rebase (blkPl_434).base H) - (lsmpl.ρ "memmove") (sessionMemmoveBudgetSpec dropChainStackX)) : + (lsmpl.ρ "memmove") (sessionMemmoveBoundedBudgetSpec dropChainStackX)) : S3SeamXPlaced ((blkPC_434).rebase (blkPl_434).base H) (lsmpl.base 434) C decFn A lim ctl uuidTryParse S (s3DefaultEnv C) := s3_549_x_placed_ok H C decFn A lim ctl S hcc hdpk hrng hsd hPkSer hToPb hGrowOne hDropChain diff --git a/LibsignalBinary/Specifications/LibsignalSession.lean b/LibsignalBinary/Specifications/LibsignalSession.lean index 1d8217129..1ab29b46b 100644 --- a/LibsignalBinary/Specifications/LibsignalSession.lean +++ b/LibsignalBinary/Specifications/LibsignalSession.lean @@ -16,9 +16,11 @@ public import ProofLib.Hoare.LibcHooks /-! # Session Image Extern Hooks (`LibsignalSession`) -**Trusted in part.** `Computational/Theorems/Main.lean` unfolds `blackBoxHook` (installed in -`cliHookTablePlaced`); `sessionExterns` and `logFilterAddr` belong to the non-ELF session-image -harness. See `Computational/docs/TRUSTED_BASE.md`. +**Checked by Lean.** No theorem of `Computational/Theorems/` unfolds a definition of this file, and +Lean's kernel checks every proof in it: you do not need to read it to trust those theorems. +`blackBoxHook` was a row of `cliHookTablePlaced` until the second stock `ld.lld` cutover (C2) +de-hooked `subtle::black_box`, whose compiled code now runs; `sessionExterns` and `logFilterAddr` +belong to the non-ELF session-image harness. See `Computational/docs/TRUSTED_BASE.md`. Extern hook table for the loaded session image: * `blackBoxHook` models `subtle::black_box::` as the identity on the low byte of `x0`. diff --git a/LibsignalBinary/Specifications/LibsignalSpqrV1/Guards.lean b/LibsignalBinary/Specifications/LibsignalSpqrV1/Guards.lean index 321d16b44..9c21543af 100644 --- a/LibsignalBinary/Specifications/LibsignalSpqrV1/Guards.lean +++ b/LibsignalBinary/Specifications/LibsignalSpqrV1/Guards.lean @@ -56,7 +56,7 @@ What the guards establish: from `libsignalSessionImage.stubs`. Not covered: that the SPQR V1 `Once::call` sites address these cells is a property of the code. On -the pinned stock `ld.lld` CLI ELF (`2f20c8363424…`, where `--gc-sections` retains `10` `bl 0x468930` +the pinned stock `ld.lld` CLI ELF (`50066cbd7322…`, where `--gc-sections` retains `10` `bl 0x468930` `::call` sites in `.text.crate`, all in `spqr::encoding::*`, and places `STORAGE.0` at `0x46f000` and `TOKEN` at `0x46f008` in `.data.crate`, anchored on the placed route by `CliProbeLabelsAnchored` and `Placed.cliTokenPatchPlaced`), `llvm-objdump -d -C` on diff --git a/LibsignalBinary/Specifications/LibsignalTripleRatchet.lean b/LibsignalBinary/Specifications/LibsignalTripleRatchet.lean index 390f93c1c..907c8f78e 100644 --- a/LibsignalBinary/Specifications/LibsignalTripleRatchet.lean +++ b/LibsignalBinary/Specifications/LibsignalTripleRatchet.lean @@ -24,11 +24,11 @@ import all Init.Data.String.TakeDrop from this file (see `Computational/docs/TRUSTED_BASE.md`): - The SPQR interface: the structure `SpqrModel` and its fields `send`, `recv`, `sendPanics`, `recvPanics` (the PQXDH-mode and SPQR V1 theorems). -- Concrete hooks and a helper: `pubFromSecretHook`, `diffieHellmanHook`, `zeroizeSecretHook`, - `readVec32` (rows of the CLI's hook table `cliHookTablePlaced`, `SignalSession/CliRun.lean`, - which the statements about the CLI's ELF use). -Everything else here, the layered program `tripleRatchetProg` / `tripleRatchetExterns`, -`entryOf` and `rngFillHook` included, is checked by Lean. +- Concrete hooks and a helper: `pubFromSecretHook`, `diffieHellmanHook`, `readVec32` (rows of the + CLI's hook table `cliHookTablePlaced` in `SignalSession/CliBinaryPq.lean`, used by ELF theorems). +Everything else here, `tripleRatchetProg` / `tripleRatchetExterns`, `entryOf`, `rngFillHook` and +`zeroizeSecretHook` (no row since the second stock `ld.lld` cutover de-hooked x25519-dalek's +`StaticSecret` / `SharedSecret` destructors) included, is checked by Lean. This file states what the compiled AArch64 code of libsignal's triple ratchet (the Double Ratchet combined with the post-quantum SPQR ratchet) does, in terms of the pure session model diff --git a/LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean b/LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean index fbf4c45c0..b81b7d75a 100644 --- a/LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean +++ b/LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean @@ -48,9 +48,9 @@ and `CliSpecPqxdhNoMatch` (`PqDirNoMatch.lean`, DEV-CLI11) at `⟨W.C, W.Q⟩`. placements `mpl` (`libsignalSessionLib.LinkedAt bytes mpl`) and `mmpl` (`VerifiedLibraries.mallocngLib.LinkedAt bytes mmpl`, `Placed.CliElfCodeMatchesPlaced mpl mmpl elf`) places code and data where `elf` maps them (for the pinned non-PIE ELF `cliElfBytes`, linked with -stock `ld.lld` under `cli-elf/stock.ld` at load base `0x400000`). The process gets an 8 MiB stack -with its top at `0x7fff_ffff_0000` (DEV-CLI7), the engine's default auxiliary vector (`AT_RANDOM` = -16 zero bytes, `AT_HWCAP` = `0x3`), `mmap` slots from `0x6000_0000_0000` +stock `ld.lld` under `cli-elf/stock/stock_c2.ld` at load base `0x400000`). The process gets an +8 MiB stack with its top at `0x7fff_ffff_0000` (DEV-CLI7), the engine's default auxiliary vector +(`AT_RANDOM` = 16 zero bytes, `AT_HWCAP` = `0x3`), `mmap` slots from `0x6000_0000_0000` (`SignalSession/Process.lean`), and `brk` starting at `elf.brkStart`. A real kernel places the stack, `brk`, and the `mmap` area at random addresses. Effect: out of scope: no claim for another stack/`mmap`/`brk` layout. @@ -60,7 +60,7 @@ pinned by SHA-256 in `CliElf.lean` (`cliElfBytes`): libsignal v0.105.4's `libsig from source by `scripts/cli-elf-stock --stdbin --build` from `third_party/libsignal/libsignal-session/cli-elf/stock/inputs_stock_stdbin.lock` (rustc 1.98.1 and its `aarch64-unknown-linux-musl` `self-contained/` CRT objects and `libc.a`, stock LLVM `ld.lld` -22.1.8 `--no-relax` under `cli-elf/stock.ld`, zig 0.16.0 for `rdl_shim.S`, `std-main`, and +22.1.8 `--no-relax` under `cli-elf/stock/stock_c2.ld`, zig 0.16.0 for `rdl_shim.S`, `std-main`, and `libsignal-session/translation.toml` plus `cli/io/translation.toml`, with the software AES and SHA-2 backends). Effect: out of scope: production builds, other compilers and other flags are not covered. @@ -71,8 +71,8 @@ processes. **DEV-E1 (machine model): hooks write only their outputs.** Under AAPCS64 a callee may clobber caller-saved registers (`x0`–`x18`, SIMD/FP, NZCV), whereas each hook in `cliHookTablePlaced` -updates only its specified output registers/memory (`cliBcmpHook` writes `x0`; -`durationSinceExactHook` writes its 24-byte result). Unhooked zero stubs halt and are forbidden by +updates only its specified output registers/memory (e.g. `writeStdoutHook` writes `x0` and the +trace). Unhooked zero stubs halt and are forbidden by `Placed.CliRunsToPlaced`. Effect: w.l.o.g., argued for standard compiler code generation. **DEV-E7 (machine model): the ELF aborts where the model panics.** Protocol-model panics map to @@ -128,9 +128,16 @@ abbrev lsStaticSecretDropSym : String := abbrev lsSharedSecretDropSym : String := "_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop" -/-- The `9` extern symbols de-hooked so the linked ELF bytes execute. Stock `ld.lld` cutover: `memcpy` -and `memset`, whose `.symtab` definitions in the stock link are `VerifiedLibraries.mallocngLib` -blocks `20` / `21`. Earlier F3 + IO.6b allocator/IO cutover: `7` mangled symbols, +/-- The `19` extern symbols de-hooked so the linked ELF bytes execute. Second stock `ld.lld` cutover +(C2, `10` symbols): the musl `libc.a` routines `memmove`, `bcmp` and `strlen` (`bcmp` tail-calls +`memcmp`, which needs no row), and `7` compiled Rust functions: +`core::slice::memchr::memrchr`, `core::str::converts::from_utf8`, +`SystemTime::duration_since`, `>::add`, +`subtle::black_box::`, +and the `Drop` impls of x25519-dalek's `StaticSecret` and `SharedSecret`. First stock `ld.lld` +cutover: `memcpy` and `memset`, whose `.symtab` definitions in the stock link are +`VerifiedLibraries.mallocngLib` blocks `20` / `21`. +Earlier F3 + IO.6b allocator/IO cutover: `7` mangled symbols, the `5` Rust global-allocator symbols (`rdl_shim.S` → `VerifiedLibraries.mallocngLib`) and `read_file` / `read_stdin` (`libsignal_cli_io`). (`::clone` becomes an intra-library `libsignalSessionLib` block under SC-1 route `(I)`.) -/ @@ -143,7 +150,17 @@ def cliDehookedSymsPlaced : List String := lsReadFileSym, lsReadStdinSym, "memcpy", - "memset"] + "memset", + "memmove", + "bcmp", + "strlen", + lsMemrchrSym, + lsFromUtf8Sym, + lsDurationSinceSym, + lsTimeAddSym, + lsBlackBoxSym, + lsStaticSecretDropSym, + lsSharedSecretDropSym] /-- Mangled-symbol PQXDH and SPQR primitive rows (`18` rows) matching `libsignalSessionMultiLib`, with `libcrux_hmac::hmac` wired over shared `mallocng` at placement `mmpl`. -/ @@ -184,33 +201,25 @@ noncomputable def cliPqxdhHookTablePlaced (mmpl : Obj.MultiPlacement) (C : Crypt mlkemValidatePkHook Q.K), ("_RNvCs65XVORQObL2_12libcrux_hmac4hmac", libcruxHmacHookMallocng mmpl C.F)] -/-- Mangled-symbol CLI hook table (`37` rows) matching `libsignalSessionMultiLib` after the F3 + IO.6b +/-- Mangled-symbol CLI hook table (`27` rows) matching `libsignalSessionMultiLib` after the F3 + IO.6b allocator/IO cutover (`5` `__rust_*` allocator rows, `::clone`, `read_file`, and `read_stdin` removed so the linked ELF bytes execute; `aes_256_cbc_{encrypt,decrypt}` and -`libcrux_hmac::hmac` wired over `VerifiedLibraries.mallocngLib` at placement `mmpl`) and the stock -`ld.lld` cutover (`memset` and `memcpy` removed: they run as `mallocngLib` blocks `21` / `20`). -/ +`libcrux_hmac::hmac` wired over `VerifiedLibraries.mallocngLib` at placement `mmpl`) and the two +stock `ld.lld` cutovers (`memset` and `memcpy` removed: they run as `mallocngLib` blocks `21` / `20`; then +C2: the `10` symbols that are the last `10` entries of `cliDehookedSymsPlaced` removed: their +linked code runs). -/ noncomputable def cliHookTablePlaced (mmpl : Obj.MultiPlacement) (W : CliHooks) : List (String × (State → State)) := cliPqxdhHookTablePlaced mmpl W.C W.Q ++ [ - ("memmove", hookMemmove), - ("bcmp", cliBcmpHook W.bcmp), - ("strlen", strlenHook), (lsWriteFileSym, writeFileHook), (lsWriteStdoutSym, writeStdoutHook), - (lsMemrchrSym, memrchrHook), - (lsFromUtf8Sym, fromUtf8Hook W.utf8Err), (lsFmtWriteSym, fmtWriteHook0), (lsFormatInnerSym, formatInnerHook0), - (lsDurationSinceSym, durationSinceExactHook), - (lsTimeAddSym, timeAddHook), - (lsBlackBoxSym, LibsignalSession.blackBoxHook), (lsCompress256Sym, LibsignalHmac.compress256Hook W.C.F), (lsAesEncSym, aesEncHookMallocng mmpl W.C.E), (lsAesDecSym, aesDecHookMallocng mmpl W.C.D), (lsPubFromSecretSym, LibsignalTripleRatchet.pubFromSecretHook W.C.pubKey), - (lsDiffieHellmanSym, LibsignalTripleRatchet.diffieHellmanHook W.C.X), - (lsStaticSecretDropSym, LibsignalTripleRatchet.zeroizeSecretHook), - (lsSharedSecretDropSym, LibsignalTripleRatchet.zeroizeSecretHook)] + (lsDiffieHellmanSym, LibsignalTripleRatchet.diffieHellmanHook W.C.X)] /-- The `18` mangled panic extern symbols of `libsignalSessionMultiLib` mapped to `Rust.panicked`. -/ def cliPanicSymbolsPlaced : List String := @@ -308,7 +317,7 @@ def DirectOrBranchStub (elf : ElfImage) (stubVa targetVa : BitVec 64) : Prop := 2. `VerifiedLibraries.mallocngLib` placement, in-ELF match, and writable-data disjointness (`mmpl`); 3. K3(a): cross-library code-block and writable-data disjointness plus `externAt? = none` across all `mallocngLib` code bytes and at every de-hooked resolution `mpl.ρ sym`; -4. K3(b): every `sym ∈ cliDehookedSymsPlaced` (the `9` external de-hooked symbols) resolves to a +4. K3(b): every `sym ∈ cliDehookedSymsPlaced` (the `19` external de-hooked symbols) resolves to a unique defined `STT_FUNC` `.symtab` entry `targetVa` in `elf` (`DirectOrBranchStub elf (mpl.ρ sym) targetVa`) with `externAt? targetVa = none`. -/ def CliElfCodeMatchesPlaced (mpl mmpl : Obj.MultiPlacement) (elf : ElfImage) : Prop := diff --git a/LibsignalBinary/Specifications/SignalSession/CliElf.lean b/LibsignalBinary/Specifications/SignalSession/CliElf.lean index ef341839c..a8276d72c 100644 --- a/LibsignalBinary/Specifications/SignalSession/CliElf.lean +++ b/LibsignalBinary/Specifications/SignalSession/CliElf.lean @@ -25,7 +25,7 @@ set_option autoImplicit false **Where the file comes from.** It is not committed (`.GeneratedLean/` is gitignored). `scripts/cli-elf-stock --stdbin --build` builds it from source with stock LLVM `ld.lld` (`-static -no-pie --no-relax --gc-sections`, linker script -`third_party/libsignal/libsignal-session/cli-elf/stock.ld`, load base `0x400000`), with the +`third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld`, base `0x400000`), with the `libsignal` revision, `rustc` `1.98.1` (and its `aarch64-unknown-linux-musl` `self-contained/` CRT objects and `libc.a`), `zig` (for `rdl_shim.S`), `ld.lld` version prefix, `std-main` entry crate, and `arm64-semantics` commit pinned in @@ -54,7 +54,7 @@ contains it, and the binary-level verification claim refers to a `main` commit S The pin is the only place where a byte of the ELF is named. Every address the statement uses comes from the ELF itself (`ElfImage.parse`, `loadState`) or from `libsignalSessionLib` and `VerifiedLibraries.mallocngLib` under kernel-checked `MultiPlacement`s `mpl` and `mmpl` -(`CliBinaryPq.lean`, stock `ld.lld` link under `stock.ld` at base `0x400000`; name labels: +(`CliBinaryPq.lean`, stock `ld.lld` link under `stock/stock_c2.ld` at base `0x400000`; name labels: `CliLabelsFromObjects` (`CliLabels.lean`)). ## Main definitions @@ -70,6 +70,6 @@ set_option maxRecDepth 4000000 in pinned digest by `file_bytes%`. -/ noncomputable def cliElfBytes : List (BitVec 8) := file_bytes% "../../../.GeneratedLean/cli-elf/libsignal-cli.elf" - sha256 "2f20c836342437a882b5882c34eab604e4f23b2b388c2b2a0696eeda51cddc7e" + sha256 "50066cbd732256eb5f19f93d1d98800914336b7926225de3ebfa0bb37eca98ce" end CryptoVerification.SignalSession diff --git a/LibsignalBinary/Specifications/SignalSession/CliRun.lean b/LibsignalBinary/Specifications/SignalSession/CliRun.lean index 36796d688..72701a109 100644 --- a/LibsignalBinary/Specifications/SignalSession/CliRun.lean +++ b/LibsignalBinary/Specifications/SignalSession/CliRun.lean @@ -24,16 +24,18 @@ set_option autoImplicit false (`libsignal_cli_pq_secure_elf_binary_placed` and `libsignal_cli_pq_binary_correct_placed`, see `Computational/docs/TRUSTED_BASE.md`), together with the symbolic binary headlines `signal_session_secure_placed` (`Symbolic/Theorems/Security.lean`) and `comp_refines_cli_placed` -(`Symbolic/Theorems/Refinement.lean`), use `17` of the `22` definitions in this file via the -`37`-row relocatable hook table `cliHookTablePlaced` and `Placed.cliRunPlacedSig` -(`CliBinaryPq.lean`): `CliHooks`, `PathOk`, `Utf8Ok`, `ancestors`, `blockingAncestor?`, -`cliBcmpHook`, `durationSinceExactHook`, `fromUtf8Hook`, `isUnmodelledPathComponent`, `memrchrHook`, -`pathComps`, `readPath`, `strlenHook`, `unitResult`, `unmodelled`, `writeFileHook`, and -`writeStdoutHook`. The remaining `5` definitions—`readFileHook`, `readStdinHook`, `vecEmptyOk`, -`vecErr`, and `vecOk`—left the headline closure when F3 + IO.6b de-hooked `lsReadFileSym` and -`lsReadStdinSym` (`cliDehookedSymsPlaced` in `CliBinaryPq.lean`) so the linked `libsignal-cli-io` -ELF code executes; they are kept here outside the headline cone for fixed-image/legacy proofs and -read-loop correspondence. A reader who trusts those theorems trusts, from here: +(`Symbolic/Theorems/Refinement.lean`), use `11` of the `22` definitions in this file via the +`27`-row relocatable hook table `cliHookTablePlaced` and `Placed.cliRunPlacedSig` +(`CliBinaryPq.lean`): `CliHooks`, `PathOk`, `ancestors`, `blockingAncestor?`, +`isUnmodelledPathComponent`, `pathComps`, `readPath`, `unitResult`, `unmodelled`, `writeFileHook`, +and `writeStdoutHook`. The remaining `11` definitions left the headline closure when their rows were +de-hooked (`cliDehookedSymsPlaced` in `CliBinaryPq.lean`) so the linked ELF code executes: +`readFileHook`, `readStdinHook`, `vecEmptyOk`, `vecErr`, and `vecOk` when F3 + IO.6b de-hooked +`lsReadFileSym` and `lsReadStdinSym` (`libsignal-cli-io`), and `strlenHook`, `memrchrHook`, +`fromUtf8Hook`, `Utf8Ok`, `durationSinceExactHook`, and `cliBcmpHook` when the second stock +`ld.lld` cutover (C2) de-hooked `strlen`, `memrchr`, `from_utf8`, `duration_since`, and `bcmp`. +They are kept here outside the headline cone for fixed-image/legacy proofs and read-loop +correspondence. A reader who trusts those theorems trusts, from here: * `PathOk` (with `readPath`, `pathComps`, `isUnmodelledPathComponent`, `ancestors`, `blockingAncestor?`): the file paths the I/O specifications model (relative, canonical, no NUL, @@ -46,8 +48,9 @@ read-loop correspondence. A reader who trusts those theorems trusts, from here: headline closure, kept for fixed-image/legacy proofs): the contracts of the four I/O functions of `libsignal-cli-io`. * `strlenHook`, `memrchrHook`, `fromUtf8Hook` (with `Utf8Ok`), `durationSinceExactHook`, - `cliBcmpHook`: the other CLI-specific extern contracts. -* `CliHooks`: what a run is quantified over: the abstract primitives and two unobservable choices. + `cliBcmpHook`: the other CLI-specific extern contracts (de-hooked at C2, outside the headline + closure, kept for fixed-image/legacy proofs). +* `CliHooks`: what a run is quantified over: the abstract primitives. ## How hooks are found @@ -147,34 +150,36 @@ their compiled blocks. Paths outside the modelled set (`PathOk`: non-canonical, a NUL byte, a component that `fsView` hides) and -caller buffers that are not readable / writable make the hooks fail closed (`.Exception`), as do -the other CLI-specific hooks on bad inputs. The shared hooks (`memmove`, `bcmp`, the primitives) -check no permissions. +caller buffers that are not readable / writable make the two write hooks fail closed +(`.Exception`); since the second stock `ld.lld` cutover (C2) they are the only CLI-specific rows of +`cliHookTablePlaced`. The shared hooks (the primitives) check no permissions. ## Free choices -`W : CliHooks` holds the abstract primitives (`C`, `Q`) and two -free choices that the CLI cannot observe: `bcmp`'s nonzero value and `from_utf8`'s `Err` payload. -The binary theorem must show that the exit code, stdout and files do not depend on them; the CLI -tests only `w0 = 0` after `bcmp`, and only `is_ok` after `from_utf8` (argv parsing: `.ok()`; the -`address` file: `map_err`). +`W : CliHooks` holds the abstract primitives (`C`, `Q`). Its two former free choices, `bcmp`'s +nonzero value (with C's contract `bcmp_ok`) and `from_utf8`'s `Err` payload (`utf8Err`), were +removed once the second stock `ld.lld` cutover (C2) de-hooked `bcmp` and `from_utf8` and no row read +them: the run executes the linked musl `bcmp` and the compiled `from_utf8`. (`cliBcmpHook` and +`fromUtf8Hook` above take these as explicit arguments, for fixed-image/legacy proofs.) ## Notable rows of `cliHookTablePlaced` (`CliBinaryPq.lean`) * not hooked: `std::sys::random::linux::hashmap_random_keys` (the CLI builds no `HashMap`) and `libsignal_session_rng_fill` (the CLI's coins are plain Rust, `cli/src/coins.rs`); reaching either halts (fail closed by design); -* not hooked since the stock `ld.lld` cutover: `memset` and `memcpy` (in `cliDehookedSymsPlaced`; - the run executes the linked `VerifiedLibraries.mallocngLib` blocks `21` / `20`). `memmove` is - still hooked: its row is `hookMemmove`, an `abbrev` of `hookMemcpy` - (`ProofLib/Hoare/LibcHooks.lean`), so `hookMemcpy` stays trusted through that row; -* `duration_since`: the exact `std` result (`durationSinceExactHook`), not a free choice; - the CLI's clock is the constant `SystemTime::UNIX_EPOCH` (`cli/src/lib.rs`), so the stored - `pending_pre_key.timestamp` is determined; -* `bcmp`: `cliBcmpHook W.bcmp`, the `bcmp` hook with its nonzero value taken from `W`; -* CLI-specific: `strlen` (argv), `core::slice::memchr::memrchr` (`rsplit_once('.')` on an address), - `core::str::converts::from_utf8` (argv; the `address` file), and `write_file` / `write_stdout` - (above; `read_file` and `read_stdin` are de-hooked in `cliDehookedSymsPlaced`). +* not hooked since the first stock `ld.lld` cutover: `memset` and `memcpy` (in + `cliDehookedSymsPlaced`; the run executes the linked `VerifiedLibraries.mallocngLib` blocks + `21` / `20`); +* not hooked since the second stock `ld.lld` cutover (C2): the musl routines + `memmove`, `bcmp` (with the `memcmp` it tail-calls) and `strlen`, and the compiled Rust functions + `memrchr`, `from_utf8`, `duration_since`, + `>::add`, `subtle::black_box` and the + x25519-dalek `StaticSecret` / `SharedSecret` destructors (all in `cliDehookedSymsPlaced`; the run + executes their linked code). With `memmove` de-hooked no row is `hookMemmove` (an `abbrev` of + `hookMemcpy`, `ProofLib/Hoare/LibcHooks.lean`), so neither `hookMemmove` nor `hookMemcpy` is + trusted any more; +* CLI-specific: `write_file` / `write_stdout` (above; `read_file` and `read_stdin` are de-hooked in + `cliDehookedSymsPlaced`). * `core::fmt::write` (`Ok`, nothing written) and `format_inner` (an empty `String`). Their results reach no stdout byte, path or file of the CLI: the CLI's own code (`cli/src/`, the I/O crate) uses no `format!` / `write!` / `to_string` (it builds decimal @@ -466,19 +471,12 @@ def durationSinceExactHook (s : State) : State := /-! ## The free choices and the table -/ /-- **What a CLI run is quantified over** (the `W` of `cliRunOf elf W` and `cliRunAbortOnPanic elf W`): the -abstract primitives and two results the CLI cannot observe. -/ +abstract primitives. -/ structure CliHooks where /-- SHA-256 compression, AES-256-CBC, X25519 (`CryptoGames.LibsignalSession.Crypto`). -/ C : CryptoGames.LibsignalSession.Crypto /-- SHA-512, the Ed25519 curve core, Kyber1024, SPQR's ML-KEM-768 (`E2E.PqxdhPrims`). -/ Q : E2E.PqxdhPrims - /-- `bcmp`'s `x0` on the two compared byte strings. -/ - bcmp : List (BitVec 8) → List (BitVec 8) → BitVec 64 - /-- On equal lengths, the low 32 bits are zero exactly when the strings are equal (C's - contract). -/ - bcmp_ok : ∀ a b, a.length = b.length → ((bcmp a b).setWidth 32 = 0#32 ↔ a = b) - /-- `from_utf8`'s `Err` payload `(valid_up_to, error_len)` on ill-formed bytes. -/ - utf8Err : List (BitVec 8) → BitVec 64 × BitVec 16 /-- `bcmp(a = x0, b = x1, n = x2) -> int`: `x0 := bcmp (n bytes at a) (n bytes at b)`, return: the function-level (C-ABI) `bcmp` contract with the value function `bcmp`. Unlike the diff --git a/Symbolic/BugInjection/Disproofs/Impl/MutantLink/WalkSpecAnyOrder.lean b/Symbolic/BugInjection/Disproofs/Impl/MutantLink/WalkSpecAnyOrder.lean new file mode 100644 index 000000000..8574d11f7 --- /dev/null +++ b/Symbolic/BugInjection/Disproofs/Impl/MutantLink/WalkSpecAnyOrder.lean @@ -0,0 +1,144 @@ +/- +Copyright 2026 Google LLC + +All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and +limitations under the License. +-/ + +module + +public import Arm64 +public import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfMultiHelpers +public import ProofLib.Placed.Multi +public import ProofLib.ProgramReflection + +/-! +# Order-Independent Multi-Block Placement Combiner for Stock Mutant `mallocngLib` + +In the stock `ld.lld` link (`stock_c2.ld`), `mallocngMultiL` blocks `20` (`memcpy`) and `21` +(`memset`) are placed in `.text.b_pre` ahead of blocks `0..19` in `.text`, so `mly.bases` are not +monotonically increasing by block index. `checkMultiMetaCoreAnyOrderB` and +`checkMultiSplitAnyOrder_spec` mirror `ElfMallocngPlaced` by falling back from `rangesSorted` to +pairwise `checkRangesDisjoint`. +-/ + +@[expose] public section + +set_option autoImplicit false + +namespace Symbolic.BugInjection.Disproofs.Impl.MutantLink.WalkSpecAnyOrder + +open Arm64 Arm64.Obj Arm64.Obj.Interned Arm64.Process +open ProofLib ProofLib.ObjectLoad ProofLib.ProgramReflection + +/-- Like `Obj.Interned.checkMultiMetaCoreFastB`, but falls back from `rangesSorted` to pairwise + `checkRangesDisjoint` when blocks are laid out out-of-index-order in the stock `ld.lld` ELF. -/ +def checkMultiMetaCoreAnyOrderB (ML : Obj.Interned.MultiLib) + (mly : Obj.Interned.MultiLayout) (nameChars : List (List Char)) : Bool := + Nat.blt mly.bases.length 1048576 && + Nat.blt mly.addrs.length 1048576 && + Nat.blt mly.relax.length 1048576 && + Nat.blt mly.b2b.length 1048576 && + Nat.blt nameChars.length 1048576 && + Obj.Interned.namesNodup nameChars && + Obj.Interned.multiIdsOkFast ML && + Obj.Interned.withVecTree 0#64 mly.bases fun tBase => + Obj.Interned.withVecTree 0#64 mly.addrs fun tAddr => + Obj.Interned.withNat ML.names.length fun nNames => + match Obj.Interned.insertAllBlocks 0 ML.blocks (Obj.Interned.mkNoneTree 20 nNames) with + | none => false + | some tSym => + match Obj.Interned.insertBlockSyms 0 (ML.data.map fun d => (d.sym, 0)) tSym with + | none => false + | some _ => + Obj.Interned.blockSymsMatchTree ML tBase tAddr && + Obj.Interned.textPlaceableTreeMulti ML tBase tAddr && + (rangesSorted (Obj.Interned.blockRanges tBase 0 ML.blocks) || + Obj.allIdx (fun i b1 => + Obj.allIdx (fun j b2 => + !Nat.blt i j || + checkRangesDisjoint (mly.bases.getD i 0#64).toNat b1.code.length + (mly.bases.getD j 0#64).toNat b2.code.length) + 0 ML.blocks) 0 ML.blocks) + +/-- Combines order-independent metadata, data-walk, and text-walk checks into + `Placeable ∧ InElf ∧ DataDisjoint`. -/ +theorem checkMultiSplitAnyOrder_spec {lib : Obj.MultiPlacedLib} + {ML : Obj.Interned.MultiLib} {mly : Obj.Interned.MultiLayout} + {nameChars : List (List Char)} {img : ElfImage} {symChars : List (List Char × BitVec 64)} + (hlib : lib = ML.toMultiPlacedLib) + (hnames : ML.names = nameChars.map String.ofList) + (hsyms : img.symbols = toStringAssoc symChars) + (hcore : checkMultiMetaCoreAnyOrderB ML mly nameChars = true) + (hdata : Obj.Interned.checkMultiMetaDataFastB ML mly = true) + (hexp : Obj.Interned.checkMultiMetaExportsFastB ML mly nameChars symChars = true) + (hdwalk : Obj.Interned.checkMultiDataWalkFastB ML mly img = true) + (htwalk : Obj.Interned.checkMultiTextWalkFastB ML mly img = true) : + let mpl := mly.toMultiPlacement ML.names + lib.Placeable mpl ∧ lib.InElf img mpl ∧ lib.DataDisjoint mpl := by + subst hlib + unfold checkMultiMetaCoreAnyOrderB at hcore + unfold Obj.Interned.checkMultiMetaDataFastB at hdata + unfold Obj.Interned.checkMultiMetaExportsFastB at hexp + unfold Obj.Interned.checkMultiDataWalkFastB at hdwalk + unfold Obj.Interned.checkMultiTextWalkFastB at htwalk + simp only [withVecTree_eq, withRegionsWithLen_eq, buildEncSymTable_eq, withNat_eq, + multiIdsOkFast_eq, Bool.and_eq_true, Nat.blt_eq] at hcore hdata hexp hdwalk htwalk + obtain ⟨⟨⟨⟨⟨⟨⟨hb, ha⟩, hrx⟩, hb2b⟩, hnc⟩, hnn⟩, hids⟩, hrest⟩ := hcore + cases hsym : insertAllBlocks 0 ML.blocks (mkNoneTree 20 ML.names.length) with + | none => rw [hsym] at hrest; nomatch hrest + | some tSym => + rw [hsym] at hrest hexp + dsimp only at hrest hexp + cases hdsym : insertBlockSyms 0 (ML.data.map fun d => (d.sym, 0)) tSym with + | none => rw [hdsym] at hrest; nomatch hrest + | some tSymData => + rw [hdsym] at hrest + dsimp only at hrest + simp only [Bool.and_eq_true] at hrest + obtain ⟨⟨hmatch, htp⟩, hdisj_or⟩ := hrest + have hdisj' : Obj.allIdx (fun i b1 => + Obj.allIdx (fun j b2 => + !Nat.blt i j || + checkRangesDisjoint (mly.bases.getD i 0#64).toNat b1.code.length + (mly.bases.getD j 0#64).toNat b2.code.length) + 0 ML.blocks) 0 ML.blocks = true := by + rw [Bool.or_eq_true] at hdisj_or + rcases hdisj_or with hsorted | hpw + · exact blocksDisjoint_of_rangesSorted hb hsorted + · exact hpw + obtain ⟨hnd_syms, _, hget_sym⟩ := insertAllBlocks_spec 0 ML.blocks _ tSym hsym + obtain ⟨hnd_data_raw, hnone_data_raw, _⟩ := + insertBlockSyms_spec 0 (ML.data.map fun d => (d.sym, 0)) tSym tSymData hdsym + have hmap_data : ((ML.data.map fun d => (d.sym, 0)).map (·.1)) = ML.data.map (·.sym) := by + simp [List.map_map, Function.comp_def] + rw [hmap_data] at hnd_data_raw hnone_data_raw + have hlookup : ∀ q, tSym.getD none q = lookupBlockSymId q ML.blocks := by + intro q + rw [hget_sym q, getD_mkNoneTree] + rfl + rw [blockSymsMatchTree_eq ML mly hb ha] at hmatch + rw [textPlaceableTreeMulti_eq ML mly hb ha] at htp + have hnd_b : natNodupFast ((ML.blocks.flatMap (·.symbols)).map (·.1)) = true := by + simp [natNodupFast, natNodup_of_nodup hnd_syms] + have hdp' := dataPlaceableTreeMulti_imp ML mly ha hnd_data_raw hdata.1 + have hdnone' : (ML.data.all fun d => (lookupBlockSymId d.sym ML.blocks).isNone) = true := by + rw [List.all_eq_true] + intro d hd + have hnone := hnone_data_raw d.sym (List.mem_map_of_mem hd) + rw [hlookup d.sym] at hnone + simp [hnone] + rw [multiTextWalkTree_eq ML mly hb ha hrx hb2b] at htwalk + rw [dataWalkTreeMulti_eq ML mly ha] at hdwalk + rw [multiExportsOkTree_eq ML mly nameChars _ tSym hb hnc hlookup] at hexp + have hddisj' := multiDataDisjointTree_imp ha hdata.2 + have hmp : multiPlaceableB ML mly = true := by + simp only [multiPlaceableB, Bool.and_eq_true] + exact ⟨⟨⟨⟨htp, (Bool.or_eq_true _ _).mpr (Or.inr hdisj')⟩, hnd_b⟩, hdp'⟩, hdnone'⟩ + apply checkMultiDisjoint_spec hnames hsyms + simp only [checkMultiDisjoint, checkMulti, Bool.and_eq_true] + exact ⟨⟨⟨⟨⟨⟨⟨hnn, hids⟩, hmatch⟩, hmp⟩, htwalk⟩, hdwalk⟩, hexp⟩, hddisj'⟩ + +end Symbolic.BugInjection.Disproofs.Impl.MutantLink.WalkSpecAnyOrder diff --git a/Symbolic/BugInjection/Disproofs/Impl/MutantLink/WeakStateMallocng.lean b/Symbolic/BugInjection/Disproofs/Impl/MutantLink/WeakStateMallocng.lean index ef7aed912..e8ab11af6 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/MutantLink/WeakStateMallocng.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/MutantLink/WeakStateMallocng.lean @@ -20,7 +20,7 @@ public import ProofLib.ProgramReflection public meta import ProofLib.ProgramReflection public import Symbolic.BugInjection.Disproofs.Impl.MutantParse public import Symbolic.BugInjection.Disproofs.Impl.MutantLink.MutantSymChars -public import Symbolic.BugInjection.Disproofs.Impl.MutantLink.WalkSpec +public import Symbolic.BugInjection.Disproofs.Impl.MutantLink.WalkSpecAnyOrder public import Symbolic.BugInjection.Disproofs.Impl.WeakState.MutantLinkData public import VerifiedLibraries.Mallocng.Proofs.PlacedInterned @@ -28,7 +28,7 @@ public import VerifiedLibraries.Mallocng.Proofs.PlacedInterned # `mallocngLib.LinkedAt` Proof for `cheval26-weak-state` Proves `VerifiedLibraries.mallocngLib.LinkedAt mutantCliElfBytes mutantMmpl` for the -`cheval26-weak-state` mutant ELF via `checkMultiVarSliced_spec` and kernel-reduced slice checks. +`cheval26-weak-state` stock-linked mutant ELF via `checkMultiSplitAnyOrder_spec`. -/ @[expose] public section @@ -45,8 +45,8 @@ open Symbolic.BugInjection.Disproofs.Impl.MutantParse (mutantCliElf_parse) open Symbolic.BugInjection.Disproofs.Impl.MutantLink.MutantSymChars ( mutantCliElfSymChars mutantCliElf_symbols_eq ) -open Symbolic.BugInjection.Disproofs.Impl.MutantLink.WalkSpec ( - SlicesTextVarOk checkMultiVarSliced_spec +open Symbolic.BugInjection.Disproofs.Impl.MutantLink.WalkSpecAnyOrder ( + checkMultiMetaCoreAnyOrderB checkMultiSplitAnyOrder_spec ) open VerifiedLibraries.Mallocng.Proofs ( mallocngMultiL mallocngMultiL_names mallocngMultiL_toMultiPlacedLib mallocngNameChars @@ -55,7 +55,7 @@ open VerifiedLibraries.Mallocng.Proofs ( #guard CryptoVerification.BugInjection.mutant == "cheval26-weak-state" theorem mutant_mallocng_metaCore_ok : - Obj.Interned.checkMultiMetaCoreFastB mallocngMultiL f3MallocngMly + checkMultiMetaCoreAnyOrderB mallocngMultiL f3MallocngMly mallocngNameChars = true := by rfl_kernel @@ -68,38 +68,31 @@ theorem mutant_mallocng_metaExports_ok : mallocngNameChars mutantCliElfSymChars = true := by rfl_kernel -theorem mutant_mallocng_meta_ok : - Obj.Interned.checkMultiMetaFastB mallocngMultiL f3MallocngMly - mallocngNameChars mutantCliElfSymChars = true := - Obj.Interned.checkMultiMetaFastB_of_parts - mutant_mallocng_metaCore_ok mutant_mallocng_metaData_ok mutant_mallocng_metaExports_ok - theorem mutant_mallocng_dataWalk_ok : Obj.Interned.checkMultiDataWalkFastB mallocngMultiL f3MallocngMly mutantCliElfImage = true := by rfl_kernel -theorem mutant_mallocng_blocks_bound : - Nat.ble mallocngMultiL.blocks.length 24 = true := by - rfl_kernel - -theorem mutant_mallocng_textWalk_00 : - Obj.Interned.checkMultiTextSliceB mallocngMultiL f3MallocngMly - mutantCliElfImage 0 24 = true := by +theorem mutant_mallocng_textWalk_ok : + Obj.Interned.checkMultiTextWalkFastB mallocngMultiL f3MallocngMly + mutantCliElfImage = true := by rfl_kernel -theorem mutant_mallocng_slicesTextVarOk : - SlicesTextVarOk mallocngMultiL f3MallocngMly mutantCliElfImage 24 := - SlicesTextVarOk.zero.step mutant_mallocng_textWalk_00 - theorem mutant_mallocng_placed : VerifiedLibraries.mallocngLib.Placeable mutantMmpl ∧ VerifiedLibraries.mallocngLib.InElf mutantCliElfImage mutantMmpl ∧ - VerifiedLibraries.mallocngLib.DataDisjoint mutantMmpl := - checkMultiVarSliced_spec mallocngMultiL_toMultiPlacedLib.symm - mallocngMultiL_names mutantCliElf_symbols_eq - mutant_mallocng_meta_ok mutant_mallocng_dataWalk_ok - mutant_mallocng_blocks_bound mutant_mallocng_slicesTextVarOk + VerifiedLibraries.mallocngLib.DataDisjoint mutantMmpl := by + have h : + VerifiedLibraries.mallocngLib.Placeable (f3MallocngMly.toMultiPlacement mallocngMultiL.names) ∧ + VerifiedLibraries.mallocngLib.InElf mutantCliElfImage (f3MallocngMly.toMultiPlacement mallocngMultiL.names) ∧ + VerifiedLibraries.mallocngLib.DataDisjoint (f3MallocngMly.toMultiPlacement mallocngMultiL.names) := + checkMultiSplitAnyOrder_spec mallocngMultiL_toMultiPlacedLib.symm + mallocngMultiL_names mutantCliElf_symbols_eq + mutant_mallocng_metaCore_ok mutant_mallocng_metaData_ok + mutant_mallocng_metaExports_ok mutant_mallocng_dataWalk_ok + mutant_mallocng_textWalk_ok + have h_eq : mutantMmpl = f3MallocngMly.toMultiPlacement mallocngMultiL.names := rfl + rwa [h_eq] /-- `VerifiedLibraries.mallocngLib` is linked at `mutantMmpl` in the `cheval26-weak-state` mutant ELF. -/ theorem mutant_linkedAt_mg : diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseData.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseData.lean index 70a33fbae..576309cfb 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseData.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseData.lean @@ -27,24 +27,21 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def baseHooks : BinTree String := ckpt_hooks [ - "BBBBBBBEBH4641;48;_RNvCs9Xul1Kjr0QF_16libsignal_cli_io10write_fileH4640;76;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_mul_overflowH18564;123;_RNvXs8_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_9PublicKeyINtNtCskxtBwYRO61I", - "_4core7convert4FromRNtB5_12StaticSecretE4fromH37126;47;_RNvNtCskxtBwYRO61I_4core6option13unwrap_failedBBEBH9282;76;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_shl_overflowH9281;108;_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6", - "x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4dropH37128;103;_RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes9from_seedBBH37129;80;_RNvMs6_NtCscSWoUTnaXmu_12x25519_dalek6x25519", - "NtB5_12StaticSecret14diffie_hellmanBH18563;52;_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_errorH18564;37;_RNvCs65XVORQObL2_12libcrux_hmac4hmacBBH18563;47;_RNvNtCskxtBwYRO61I_4core6result13unwrap_failedH18563;115;_RNvXs6_NtCsfr5T3GFabw_3s", - "td4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3addH37128;74;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental12encapsulate1BBBBH18563;76;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24", - "panic_const_sub_overflowH18564;112;_RNvXso_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPointNtNtNtCskxtBwYRO61I_4core3ops5arith3Neg3negBH18563;4;bcmpBH9282;57;_RINvNtCskxtBwYRO61I_4core9panicking13assert_failedyyEB4_H9281;67;_RN", - "vNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber11decapsulateBBH18563;45;_RNvNtCskxtBwYRO61I_4core9panicking9panic_fmtH18563;65;_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_sinceBBH9282;97;_RNvMs0_NtNtCs1mK0QScfTrZ_14libcr", - "ux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes3pk2H9281;57;_RNvNtNtCskxtBwYRO61I_4core5slice5index16slice_index_failEBBH37126;45;_RNvNtCsbvWyylYiyxg_4sha26sha51211compress512BH18563;70;_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2", - "wR8L9wiBdT_16curve25519_dalekH18564;57;_RINvNtCskxtBwYRO61I_4core9panicking13assert_failedjjEB4_BEBBH9282;64;_RNvNtCsbKnPy0UR4Ui_13signal_crypto7aes_cbc19aes_256_cbc_decryptH9281;70;_RNvNvMs_NtCs69KKACWg7bl_5alloc3vecINtB6_3VecppE6remove13a", - "ssert_failedBBH4641;6;strlenH4640;7;memmoveEBBBBBBEBH4641;50;_RNvCs9Xul1Kjr0QF_16libsignal_cli_io12write_stdoutH4640;55;_RNvNtCskxtBwYRO61I_4core9panicking18panic_bounds_checkH18564;88;_RNvMs5_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryN", - "tB5_15MontgomeryPoint10to_edwardsEBH37126;48;_RNvNtCs69KKACWg7bl_5alloc7raw_vec12handle_errorBBH9282;97;_RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes3pk1H9281;35;_RNvNtCskxtBwYRO61I_4core3fmt5", - "writeEBBBEBH9282;108;_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4dropH9281;78;_RNvMsg_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint8compressH37129;74;_RNvNtNtCs1mK0", - "QScfTrZ_14libcrux_ml_kem8mlkem76811incremental12encapsulate2BH37127;41;_RNvNtCskxtBwYRO61I_4core9panicking5panicBBH9282;64;_RNvNtCsbKnPy0UR4Ui_13signal_crypto7aes_cbc19aes_256_cbc_encryptH9281;47;_RNvNtCskxtBwYRO61I_4core6option13expect_fai", - "ledH18564;48;_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchrBBBBEBH9282;106;_RNvMsw_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint35vartime_double_scalar_mul_basepointH9281;80;_RNvMNtCs2wR8L9wiBdT_16curve25519_dalek6scalarNt", - "B2_6Scalar20from_bytes_mod_orderBH18563;80;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const28panic_const_async_fn_resumedH18564;79;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytesBBH18563;50;_RNvNtNtCskxtBwY", - "RO61I_4core3str8converts9from_utf8H18563;53;_RNvNvNtCs69KKACWg7bl_5alloc3fmt6format12format_innerH37129;67;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber11encapsulateBBH37126;85;_RNvMNtCs2wR8L9wiBdT_16curve25519_dalek6scalarNtB2_6Sc", - "alar25from_bytes_mod_order_wideH37129;88;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental26decapsulate_compressed_keyBH37127;45;_RNvNtCsbvWyylYiyxg_4sha26sha25611compress256BH18564;56;_RNvNtCskxtBwYRO61I_4core9panicking19assert_", - "failed_innerH18562;76;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_add_overflow" + "BBBBBBH18055;80;_RNvMs6_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecret14diffie_hellmanH18055;57;_RNvNtNtCskxtBwYRO61I_4core5slice5index16slice_index_failH36110;47;_RNvNtCskxtBwYRO61I_4core6option13unwrap_failedBBH18055;52;_RNvNtCs", + "69KKACWg7bl_5alloc5alloc18handle_alloc_errorH18055;53;_RNvNvNtCs69KKACWg7bl_5alloc3fmt6format12format_innerBH18055;74;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental12encapsulate2H18054;80;_RNvMNtCs2wR8L9wiBdT_16curve25519_dale", + "k6scalarNtB2_6Scalar20from_bytes_mod_orderBBH36111;76;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_shl_overflowH36110;41;_RNvNtCskxtBwYRO61I_4core9panicking5panicBH36110;45;_RNvNtCsbvWyylYiyxg_4sha26sha25611compress256BH1", + "8055;67;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber11encapsulateH18054;103;_RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes9from_seedBBBH36111;76;_RNvNtNtCskxtBwYRO61I_4core9panicking1", + "1panic_const24panic_const_add_overflowH36110;55;_RNvNtCskxtBwYRO61I_4core9panicking18panic_bounds_checkBH36110;64;_RNvNtCsbKnPy0UR4Ui_13signal_crypto7aes_cbc19aes_256_cbc_decryptBH18055;88;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811in", + "cremental26decapsulate_compressed_keyBBH4513;48;_RNvCs9Xul1Kjr0QF_16libsignal_cli_io10write_fileH4513;97;_RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes3pk1EBBBBH9027;50;_RNvCs9Xul1Kjr0QF_16libs", + "ignal_cli_io12write_stdoutH9027;78;_RNvMsg_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint8compressH18055;80;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const28panic_const_async_fn_resumedH36109;57;_RINvNtCskxtBwYRO61I_4core9", + "panicking13assert_failedyyEB4_BH36110;35;_RNvNtCskxtBwYRO61I_4core3fmt5writeH36109;88;_RNvMs5_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPoint10to_edwardsBBBH72221;47;_RNvNtCskxtBwYRO61I_4core6result13unwrap_failedBH3611", + "0;48;_RNvNtCs69KKACWg7bl_5alloc7raw_vec12handle_errorBH18055;79;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytesH18054;85;_RNvMNtCs2wR8L9wiBdT_16curve25519_dalek6scalarNtB2_6Scalar25from_bytes_mod_order_wideBB", + "H36111;76;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_sub_overflowBH18055;45;_RNvNtCskxtBwYRO61I_4core9panicking9panic_fmtH18054;57;_RINvNtCskxtBwYRO61I_4core9panicking13assert_failedjjEB4_BBH18055;45;_RNvNtCsbvWyylYiyxg", + "_4sha26sha51211compress512H18055;123;_RNvXs8_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_9PublicKeyINtNtCskxtBwYRO61I_4core7convert4FromRNtB5_12StaticSecretE4fromEBBBH36111;76;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_mu", + "l_overflowH36110;56;_RNvNtCskxtBwYRO61I_4core9panicking19assert_failed_innerBH36110;64;_RNvNtCsbKnPy0UR4Ui_13signal_crypto7aes_cbc19aes_256_cbc_encryptBH18055;67;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber11decapsulateBH9027;97;_", + "RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes3pk2H9027;112;_RNvXso_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPointNtNtNtCskxtBwYRO61I_4core3ops5arith3Neg3negBBBH18055;106;_RNvMsw_", + "NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint35vartime_double_scalar_mul_basepointH18055;70;_RNvNvMs_NtCs69KKACWg7bl_5alloc3vecINtB6_3VecppE6remove13assert_failedBH18055;74;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811in", + "cremental12encapsulate1H18054;37;_RNvCs65XVORQObL2_12libcrux_hmac4hmacH72220;47;_RNvNtCskxtBwYRO61I_4core6option13expect_failed" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseData diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseFull.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseFull.lean index bdccdc8b6..97b972e52 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseFull.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseFull.lean @@ -56,18 +56,18 @@ open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines14 (sub14) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines15 (sub15) def ssSpec : ElfFullSpecPlaced := - { entry := 0x49c010#64 -- layout-bypass: concrete-mutant-trace-checkpoint - phdrVaddr := 0x3ff040#64 -- layout-bypass: concrete-mutant-trace-checkpoint - phnum := 11 - brkStart := 0x4a4000#64 -- layout-bypass: concrete-mutant-trace-checkpoint - tokStorageAddr := 0x49a038#64 -- layout-bypass: concrete-mutant-trace-checkpoint - tokOnceAddr := 0x49a040#64 -- layout-bypass: concrete-mutant-trace-checkpoint - callocAddr := 0x49e418#64 -- layout-bypass: concrete-mutant-trace-checkpoint - callocSentinel := 0x49e419#64 -- layout-bypass: concrete-mutant-trace-checkpoint - mallocAddr := 0x49e4fc#64 -- layout-bypass: concrete-mutant-trace-checkpoint - mallocSentinel := 0x49e4fd#64 -- layout-bypass: concrete-mutant-trace-checkpoint - freeAddr := 0x49e4f8#64 -- layout-bypass: concrete-mutant-trace-checkpoint - freeSentinel := 0x49e4f9#64 -- layout-bypass: concrete-mutant-trace-checkpoint + { entry := 0x46a000#64 -- layout-bypass: concrete-mutant-trace-checkpoint + phdrVaddr := 0x400040#64 -- layout-bypass: concrete-mutant-trace-checkpoint + phnum := 7 + brkStart := 0x471000#64 -- layout-bypass: concrete-mutant-trace-checkpoint + tokStorageAddr := 0x46f000#64 -- layout-bypass: concrete-mutant-trace-checkpoint + tokOnceAddr := 0x46f008#64 -- layout-bypass: concrete-mutant-trace-checkpoint + callocAddr := 0x46bbfc#64 -- layout-bypass: concrete-mutant-trace-checkpoint + callocSentinel := 0x46bbfd#64 -- layout-bypass: concrete-mutant-trace-checkpoint + mallocAddr := 0x46bce0#64 -- layout-bypass: concrete-mutant-trace-checkpoint + mallocSentinel := 0x46bce1#64 -- layout-bypass: concrete-mutant-trace-checkpoint + freeAddr := 0x46bcdc#64 -- layout-bypass: concrete-mutant-trace-checkpoint + freeSentinel := 0x46bcdd#64 -- layout-bypass: concrete-mutant-trace-checkpoint hooks := baseHooks baseLines := mkDepth3 (.branch sub0 sub8) (.branch sub1 sub9) (.branch sub2 sub10) (.branch sub3 sub11) diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines0.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines0.lean index f034b41ef..772c93b5a 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines0.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines0.lean @@ -27,362 +27,253 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub0 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF0900018beb031faa210900b4cc0400d08c8101910dd08252ea0300aa0b000014cb111a33ea090091ee030b2acb2500514f010fcb7f150071eb01088b02030054L4;FF29412891c000009000542391e8a700a9a82300d1c200009042a03d91e1230091e8a701a9c1200094c00000900000", - "2791b6200094c000009000e03c91b3200094L8;FFf50b40f9fd7bc3a8c0035fd60001805201058052cf2001948002009000601591b72001948002009000c01591b4200194010440f918010014ffc301d1fd7b03a9BBL4;FFfa031baabf060031a024005448008052e0c30191e3830091e1031aaae20319aa", - "24008052e8830039b8020094ada001940004805221008052aba00194a02800b4L4;FFc0035fd6abf8ff97e10300aa82018052000080d2220000b9f35341a9f8ffff1704805fb8e1ff9f529f00016badfdff54816c1c53e301809261c021cb0300018bL8;FF82008052e40313aaa8831ff806a1009406a100", - "94f44f43a9fd7b42a9ff030191c0035fd6000040f9a6040014000040f9f01b0014ff0301d1fd7b02a9f44f03a9BBBL4;FF00030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb438d00541803008bf9feffb50f0000141f0400b1a18c0054L4;FB612044697", - "3706c617920696d706c656d656e746174696f6e2072657475726e656420616e206572726f7220756e65787065637465646c7900c2fe480000000000L8;FFe9979f1aeb2b11a90b294ea929219f5a291d0072eba300f90b4953a9ea1300f9112951a9607700543f05007141f50054890080520a008092790a", - "00f969220039BL8;FFf40301aaf50300aab66001940006805201018052b4600194400100b4155000a9e10200d021600891130800f91fa00039f44f42a9f50b40f9fd7bc3a8c0035fd6L8;FFa0031df8210100d021843a91230100d063f83a91a0c300d1420180528400805223000014a0031df8210100d02", - "1843a91230100d063f03a91a0c300d142018052BBBBL4;FF00a8200e0b00669e6b01c0da6b11c0da6bfd43d32c696b38ddffff17000400f000a01291ca00029420008052e10315aabd00029420008052e10318aaba000294L4;FF190115cbc3000094620215cb8002158be1031f2ab5000094d82a00f9f92", - "e00f9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6ff0301d1fd7b02a9L8;FF6b710d8b8c00f8b761e10c8b2b0180520a0000144d254039bf0500f1c80100548c1900126ce10c8b81fd0daa3f000beb030500544b018052e0031faa4a010b8bBL8;FF21742191e0230091a32300d142028052", - "e40313aab4831ff80381019488620091010300d021bc2191a32300d142038052e40313aaa8831ff8fb80019488220191L8;FF1f0101eb40850054e81340f9490480522a040091e00316aaea1700f909692138e16300912e80ff97f81740f9e80f40f9080118cbdf0208eb88840054e81340f9BBBL4;FF220", - "08052bbc00194e18340f93f0400f18b000054e08740f922008052b5c00194e19b40f914008092f48300f93f0400f18b000054e09f40f922008052adc00194L4;FB64696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a2073686f756c64206e6f742062", - "65207573696e672044L8;FFe81302f9ea1f02f94083813cb70000b4e00318aae10317aa22008052b5c00094f7830291e10314aae00202917f140094e0e202918142089171160094e00fc13dBL8;FF760080520800001400010039b402148ba08300d1f40f00f9c94001941f040031400700541f000271620", - "0005435008052070000141f0020716200005455008052L8;FF1730889ae0db04a9f70400b4150340f9f60300aa080014eb23100054ff0208eb09010054e0e30091e10317aa22008052c01eff97f42344a91f0114eb23100054BBBBBL4;FF96feff17e90b41b2e9a300a994feff17880080d20800f0f20801", - "40b28ffeff17880080d2e00b00f90800f0f20e000014880080d2b7831df80800f0f219000014L4;FFe02b01b9a04700d17bc2ff97e02301b9a04700d178c2ff97e01f01b9a04700d175c2ff97e01301b9a04700d172c2ff97e00b01b9a04700d16fc2ff97e00301b9L8;FFfd430191082440a9f30301aae0", - "630091e1030091e2031f2a080dc0da290dc0dae92300a9cbfdff97e90f40f9e83740b9aa058052e1630091e00313aa82048052BL8;FF980300b4341340f9b6900194e00318aa21008052b4900194402000b4e10314aae20318aafa0300aaba9001943b2340f9f54700f97b0200b4341f40f9a9900194L8;F", - "F29513491eaa300a9a84300d1e91700f9620100d042481191e9a301a9e3430091d1900094fd7b44a9ff430191c0035fd608040091200440a9a94300d1eaffff90BBBL4;FFe8270ba948008052a90300f029993b91eac30291a04700d1a8273aa9a80300b008992291e82a05a92a068052e8038052bf2737a", - "9a90300b029151d91a92b39a9L4;FBa4aae8600b70f9ef08d994ca63628cac268b711645dd061128ea31f8f897dfcbda279d1878f1a28c1ee803560000a338555bbb2f39fc95452cdbd73b3e26877cL8;FFecab40f9e0c7833deda757a9e1f7803de8f301f9280200d008b140f9eacf40f91f0900f1e9030", - "054a801009008110f9129038052e86705f9e80100d008012791BL8;FFe84301912900009029912891a82734a928008052c90200d029c13f91aa0303d1a04700d1e8a711a9c80200d008c92b91e8ab13a98a06805248048052ffa70ea9L8;FF208757adf7e342f9a00302d1e1031faaa80315b8e8e742f9e2", - "031f2aea1700f9e80f00f9e8d345b9e93700b9e82700b9e8031691400707adbb0318f8b58318b8BBBBL4;FF06000014090180d2f8031faae8031faa0900f0f229017fb20a1f4092e10740f908010aaae9a200a929008052e9020039810000b4e00b40f922008052adf00194L4;FB736765745f73656e6465", - "725f636861696e5f6b65795f62797465736765745f72656365697665725f636861696e5f6b657900000000000000ea98480000000000L8;FF1f0116eb29050054e00313aaa3efff9740fd073728fc60d3e80400b5200840921f1800f102050054217c0353210500343f040071e00100543f0c007161fdff5", - "4BL8;FF7f6a00b9f44f42a9f50b40f9fd7bc3a8c0035fd6ff8300d1fd7b01a9fd430091080040b9a01300d1a8c31fb800710194fd7b41a9ff830091c0035fd6ff4301d1L8;FFca230094e14316917c0d0094e0ab49f9800100b4e1d342f9e8cb42f91f0101ebe0660054e8cf42f9090180522a0400910969", - "2138e1431691ead302f96f0d0094BBBL4;FFe86b40b969c20339a98350b8600603ade08b45ad68be0339a8c3507869120fb8e93f40f9600a04ade043c03d68520f78e883443969720ff8e98f40f96002803dL4;FFfd7bbfa9fd030091fd7bc1a8c0035fd61d0080d21e0080d2e003009121dbff902100009", - "11fec7c9201000014e20300aa240000f0230000f0200000f0849040f9L8;FFfd7bc6a8c0035fd637008052b5b000940008805221008052b3b0009420eaffb52000805201088052bfb00094e0031f2ae1080094a1835bf8fa03002a81f7ffb5BL8;FFfa830291810000b4e0ff42f922008052b8300194e8c3", - "17910081009134e6ff97c80080d20800f0f21c450091a7000014e85746f9e95b46f9800200d000603291L8;FF088d2891e95b05f9290080d2e87305f9c80480526944c0f2ea7705f90a078052001f813dff4b05f9e85305f9ff5705f9ea5f05f9e86b05f9e96f05f9b9300094BBBBBBL4;FF135041a98802", - "40f9680000b4e00313aa00013fd6810640f9c10000b4820a40f9e00313aaf44f41a9fd7bc2a8b1180214f44f41a9fd7bc2a8c0035fd6fd7bbea9L4;FFc80adc9a08d91c9b080600b5f8e700a9b8835ef8760c00b4f50b40f9f90316aa04000014390317cbb502178bb90b00b49f0319eb9733999a9f0319e", - "b48ffff54L8;FFf50301aaf30308aa4a0140f9e10309aa40013fd68a0a40f94a0115eb230400548b0640f9750a00f96b01158b8baa00a9f44f45a9f52340f9fd7b43a9ff830191BBL4;FF6814f837a0c300d18e010094a8035db8c8210037a8035ef82a0340f9490108ebc32b00544a0340f9b4835df8480", - "1088b480300f9290300f988fe60d3281c00b5L4;FBf8cb490000000000180000000000000008000000000000000ccc49000000000088cc49000000000098cd490000000000002f6465762f6e756c6c001443616e6eL8;FF6901084aab335738a91317384901084aaa435738a92317386901084aab535738a", - "93317384901084aaa635738a94317386901084aab735738a95317384901084aBBBL4;FF22008052bbd80194e8e3009100c10091c6bfff97e00314aae10313aa022b8052bcd80194f44f56a9fc9340f9f65755a9f85f54a9fa6753a9fd7b51a9ffc30591L4;FB636865742d62353864376635366533363435", - "6363642f303639353962342f7372632f76312f6368756e6b65642f73656e645f656b2e7273002f636172676f2d67L8;FFea8345f9eb8f45f9faab45f9f7af45f9e84700f9e86745f9e1cf45f9fbd745f9f8df45f9f9e345f9e86b00f9e86b45f9ece745f9eff345f9fcf745f9f4fb45f9BL8;FF60b70054e", - "b074091e8cf42f92a0400916b810991490380526001029109692138ead302f9e71b0094e1431691641100949f0a00b1e10b0054e1ffc33de8d342f9L8;FFe03b833da00b7cade13f833d7f0208ebe02b833da0077dade22f833de137833de033833da1efff5400230191208ffe977affff17e81f46f91f05", - "00b1e1000054BBBBL4;FF800600ad820a803d68920039f44f49a9f65748a9f85f47a9fd7b46a9ff830291c0035fd60001805201038052c9f80194000400b000401991c5f80194ff8302d1L4;FB2073657373696f6e207769746820646973747269627574696f6e20494420c0000c73657373696f6e20666f", - "7220c01d2068617320696e76616c69642072656769L8;FFe20313aac1f6ff97800500b5e1031faae8ffff17e10314aae20313aabbf6ff97800500b5e1031faae2ffff17400600b5e00313aa99f7ff97e80301aa80000036BL8;FFb12f7629ad8357f83f0400b1ac0359f8bb8313f880040054f28304a9a02", - "303d1f14700b9ec4302a9ef3b0629ed1f00f9eb2b0229e9230329e12f00f9f760ff97L8;FFf5170af9e8130af908048152e91b0af9e9eb4df9e81f0af9e8270af908788052e82b0af9e8330af988230f91f8230af9fb2f0af9f6370af90001803de91f0bf9BBBL4;FF00018052e10319aac7b80194800300", - "9000401691bab80194800300b000402991b7b80194800300d000e01191b4b801948203009042c03291e10303aab2b80194L4;FDd4074300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000L8;FF6b1d", - "0091eefeff378e04f8374b8500917f0103eb280400542bfd50d3eb0300b54a0500d14a000a8b4b2140b84c0d40794091c03c4121c13c4a214039ab431eb8BL8;FFc1fdff54f40314abe2020054688e48f81f0500b140020054e00313aa84ffff97080040b20811c0da081540d2080d088b0825019109fd46", - "d30800098b08050091L8;FFf40316aafc432a91e8031aaa58fd60d3fa6740f9f6fe60d3e85700f915fd48d3b6000014fb4b40f9ea5f40f9f40317aafa6740f9fc432a9159000014e8974ab9BBBBBL4;FFe00318aae30319aa2801088be90b40f9e82a00a928fd60d3880a00b5280940921f1900f1220b005", - "4217d0353c10b00343f080071ac0100543f040071e0030054L4;FFe10314aae20315aa0001168bc1080094e003c03de10f40f9c802158be80b00f96002803d680a00f9210100b4e00314aa22008052f44f46a9f65745a9f85f44a9L8;FFe92b01a9ea080194fd7b42a9ffc30091c0035fd6080840f988010", - "0b4090140b22911c0da291540d2290d098b2925019129fd46d30801098b000500911f0009ebBL8;FF291540d2290d098b2925019129fd46d329050091340108ab63010054db000014e8031faa690a40f989faffb5691640f9e803088b69fbffb5e1ffff17f40308abL8;FF4000805241018052c788009440", - "008052e10313aac488009440008052c1008052c188009440008052e10318aabe8800940001805201098052bb88009400018052BBBL4;FF110000145f2800f1880000542800028b08f1df38e80bf837e003029189310094e88340b9c80d0037e84b40f9ea0240f9490108eb633c00540a0340f9fa4740f9L4", - ";FB0b021b02ce0146023b013602bb0000007b0000003c00c800e700a4002501660031003d00135a6852842b003b362c0b1640315f756f31061e110d0d0000000000L8;FFc4c80094ed031aaafa031caa11000014350080527a0400b4fc031aaab1c80094e0031aaa21008052afc80094c0bb00b4e17740f9", - "e2031caae05f00f9b5c80094BL8;FFff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f090071e1010054e00302aaf40302aaf30301aad2000094e80300aae00301aa08020037L8;FF6b0d0b8b6b25019129194b8b2905009129010aabc20600542a0140b24a11c0da4a1540d24a0d0", - "a8b4a2501914afd46d329010a8b290500913f010aebe9050054BBBBL4;FFc90300f029d50591692902a9290080d2691bc0f2687d01a9682504a9c1e80194fc9740b9f47f40b9880280d249008052dc5202290800f0f2c90200b9080540b2L4;FB3c204000000000003000000000000000080000000000000", - "0d098400000000000902040000000000030000000000000000800000000000000009a400000000000L8;FFa083d63ca183d13ce20318ada083d23ce10316ad002100b4f40300aae0030b91a0e2ff97e00314aa342300b458010014a2c303d1830c805242e1ff97802200b4BL8;FFe82b00f9e83700f9e843", - "00f9e84f00f9f36300f9b36801942000805221008052b1680194600a00b4680240b2091880522a0080520811c0da09000039e9f77fb2L8;FFfc2740f99f1b00f103050054f8430691fb0c8092e02340f9080d8052826f089b0080c23c1a0040f901a00191e00a803d0080c33ce00e803d0080c43ce012803", - "dBBBL4;FFe2031baa2300805224008052289bff97b9035cf8a8035bf8080119cb7f0308eb69ddff54a04301d1e10319aae2031baa23008052240080521d9bff97b9035cf8L4;FF080c80d200e00791612a00b9010000d4240000b0e30300aa62e20191210000b0840041f9212007910000805273ce00a964", - "0e00f9632200b9623e00f9614e00f9L8;FFbaf31438c3a80094a8f35438f90b40f9290080521ffd0071ba0218cbe803082ae9830039a1faff5409088052e1830091220108cba9c303d12001088bb5a80094BL8;FFe80740b9e0830c916002c23c61f2c23ce8ff0c39a84302d1e0cb803de1f2803cdb28019", - "4e8830c91e0030c91e1430691a24302d116290194a84302d1e0830c91L8;FFc10640f9810000b4c20a40f9e00317aab82800945f0b00b101110054e8e342f9e29340f9e07b40f9e16b40f91b5501b9e8a74fa9299940b9e9b305b9081540f9BBBBBBBL4;FF620d40ad010101ad020d00adbbfaffb5210000", - "14090180520801098b292100910801148a206b68fc00a8200e0a00669e0afcffb5f9ffff17200340fd00a8200eL4;FF370080523900809248ff70d349ff60d3990200f997220039883e0039e80340f989d20078e9234039881200f9a81b40b989a20039a9b341b8889202b828008052L8;FFa20700d16105", - "8052ca1c0194600200f000801391630200f063001391640200f084202491a20700d161058052c11c019408fcdfc8a8000037080940f91f0500f1BBL4;FFe8e31291eab304b9a9b33a29f19c0194eaeb5239fcbb5339940600f1eb0f5339ec4f5339fedf5339ea730729eaef5239e8e35239fcbf5339e9e75", - "239ea730829L4;FFe00304aa480c80d2011080d2030080d2010000d41f9800b140feff5480fc5f8880feff3585fc0088a0ffff3520008052c0035fd600008052feffff17fd7bbfa9L8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9030054200108ab220", - "10054fd7bc1a8c0035fd6e8031faa091c40f9BBBL4;FF08d30039e8a7442909d7003908db0039e8a7432909df003908e30039e8a7422909e7003908eb0039e8a7412909ef003908f30039e9a3402908f70039e85341b9L4;FB2d72656769737472792f696e6465782e6372617465732e696f2d3139343963", - "66386336623562353537662f70726f73742d302e31342e342f7372632f656e636fL8;FFeca300f9f86742f9f98742f9e9231fa9e80f42f9e90742f9ec8b42f9f19f42f9f0a742f9e8cf00f9e81342f9e5ab42f9e4af42f9e6b342f9edb742f9e8b300f9BL8;FFe91f0bf9f6230bf9ba5c0194f43349f9e04", - "306918123009102738052bd5c0194e083c53d89630f91e187c53de8436c79f5174bf9fb1b4bf9e01b843d2001c03dL8;FFf40301aaff8701a9f5db02a9f73b00b9ca5c0094a2035ef8a20a00b5a08300d1b4573ea9b6031ff8b7831fb8c45c00941f04003180080054f40f40f976008052BBBBL4;FF08fd0", - "a9b5903088b280306d1080140f9ff0208eb81010054282306d1e00316aae20317aa010140f9c8fc0194c000003528e305d1e92f40b9080140393f01086bL4;FB00001b1b1b1b1b1b1b1b1b1b001b1b1b1b1b00131b1b001b000007000082775f19328d6db5d6cb6d0b4c24000000c3009d00ad0057000001", - "2401bb004d017300L8;FF2a0700910001803d090900f98a0a00f9beffff17800400b5e00313aa9ffbff97e80301aa40010036e80400b5e1031faab6ffff17e20313aa230c805241f5ff97BL8;FF4a0d0a8b4a25019129194a8b29050091280108ab8300005414000014e80308ab42020054092440f93f050", - "0b1a0010054092c40f92a0140b24a11c0da4a1540d2L8;FFe20315aa0001178bc27c0094e802158be81700f97f0600b1a086ff5480220491e16300911f90ff9731fcff17e06300912200805223008052240080528c92ff97BBBL4;FFe00318aae10317aa08000014990640f9b2ffff17e10740f928008092", - "686a00a9810000b4e00316aa22008052b1bc0194880600d11f0d00b1a8f8ff54e00315aaL4;FB14f647000000000010000000000000000800000000000000501148000000000014f6470000000000180000000000000008000000000000008412480000000000L8;FFe8030191e00316aae10314aa32bd00", - "94b4bc00940010805221008052b2bc0094c00f00b4e00744adfb0300aa000402ade00b45ad000803ade10342ad010000adBL8;FF8a0000102b6968384a090b8b40011fd6088c40f81f0900b1411d0054e8031faa73010014e80300aa098d40f83f0500b140250054f30300aae00308aa69040094L8;FF606", - "601f9616a01f986ffff17776a41f900c3c73c01c3c83ce90f44b9f6eb43b9756641f9e80240f9208706ade90303b9680000b4e00315aa00013fd6e10640f9BBBBBL4;FF6b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0500912801088b49010b8be10313aa0001098b1ef8ff97380200351c000014e", - "8031faa978640f9d7fbffb5L4;FF2000805201c48052d20c009420008052018c8152cf0c00942000805221c48052c10c0094800000f000403491b40c0094ff8301d1fd7b02a9f85f03a9f65704a9L8;FF3fe9007161040054091040393fd5017101040054091440393fd50171a1030054091840393fa5017", - "141030054091c40393f910171e1020054092040393fe90071BL8;FFf30308aae00700f9e8630091e11300b9e0230091e1031faae2031f2ae38c0194e80f40f91f0500f1e10000547f06003968020039fd7b43a9f32340f9ff430191L8;FF41008052b88c0094607c00b4f40300aab48c0094400080524100", - "8052b28c0094a07b00b4f70300aaae8c00944000805241008052ac8c0094e07a00b4f80300aaBBBL4;FF2f00805202000014ef031faa292100912001158b15000d8ac96975fc208d282e0800669e19c101f2c1f9ff54e7ffff1780077fad28008052810240f968020039L4;FBf4c5ffd5e2e5e9f580058b1", - "596259d35ac45a755ba65b1756395688575b57ea54fd544c559f552e53b1530052d35262517551c4501750a65aea4a5b4b884b394L8;FFf4030aaabbcc0094ea0314aa355800b4e0030aaae10315aa22008052b5cc00945b008052da0400147caf45a9773740f974a740a96d3f40f96ae341a99f0700b1BL", - "8;FFe012803d0080c53ce016803d0080c03ce002803d0080c13ce006803db74c0194810700d15f0700b1e12700f9800b0054e00641ade0430691facb00f90083823cL8;FF00c01591be4c0094000100b000203691bb4c0094080040f9090100d029411f91e00301aa08014039227968f8090100d029a11f9", - "1287968f8e10308aaeb4c0014BBBBL4;FFb8ec0194008c815221008052b6ec0194200400b481060091028c8152f30300aa148c8152bbec019428008092b3d200a9a80200f9f44f42a9f50b40f9fd7bc3a8L4;FB646572536572766572436572746966696361746549644261644b454d4b657954797065000", - "0000000000000000000000001000000000000000100000000000000L8;FF48050091680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd6f50300aae00313aa22008052230080522400805290020094610a40f9e00315aacaffff17f50300aaBL8;FFc1620091a20301d1e055ff97e0f6ffb438000014e83f40", - "f91f0500b140020054e1e30191a20301d1d855ff97e0f5ffb453000014a20301d1830c8052be52ff97L8;FFe83b40f9490100b029793b91e003c63c682602a9e8008052e90741b2681a00f9080080926006803d682600a93c000014680100b008b140f9480300b4e8430191BBBL4;FF20031c8be10318aae", - "20317aac1ac01948803170be8ff0039170500b52b000014080280d20800f0f2681200a9f0000014e80317aaf90318aa1c020034e8030091L4;FF680240f994fe41d3080115cb9f0208eba8020054b40000b4680640f9e20314aa0001158b130e0094e0031f2aa802148b680a00f902000014e0031f2af44f", - "47a9L8;FF490b00f9e00a005408031c8b53008052150940f9d50800b4b5080037130540f9b0ac0094e00315aa41008052aeac0094800e00b4a8fe41d3fa031faa9c630091BL8;FF18630091e000005401835ff881ffffb4000340f922008052b62c0194f8ffff17e88b40f9c80000b40805088be00314aa0", - "201805201f17dd3ae2c0194400745adL8;FFe04b823d4004c03de04f823d210140ade173823de077823d210140ad190540f9e1df813de0e3813db90100b4140140f9ac2c0094e00319aa21008052aa2c0094BBBBBBL4;FF1f2900f1880000542a01088b4af1df384a03f837e0030091e10309aae20308aa8", - "87d0094e80340b9c8000036e00740f9f44f44a9fd7b43a9ff430191c0035fd6L4;FF4083853c4183863ccab8ff97e0431391c2f2ff97e89341f91f0d00b1801200541f0900b101110054e89741f9e0cfc03d1f0500b1e0e3803da0110054e0e3c03dL8;FF286000f1830d00548a008052690080526aa200a", - "908038052690200b949640091696a28f8f44f44a9f65743a9fd7b42a9ff430191c0035fd61fb6007181010054BBL4;FFf70300aa08fbff54960100b48002158be10317aae20316aabe940194b502168be00317aae10316aa22008052f50f00f9b094019402000014f50f00f9e0030391L4;FD84d04900000", - "00000d0c049000000000058c049000000000018304a00000000000000020000000000050000000000000000000000000000000000000000000000L8;FFfd7b01a9f31300f9fd430091e90301aaf30300aa610100f021681b91e8030091e00309aac2018052fe940094610100f021101591840100d0840028", - "91e0030091BBBL4;FF22010014a0a302d13fd50094e80300aae00301aae8de0736401600b5f5031faa71feff17a0a302d137d50094e80300aae00301aa48e8073660fbffb483000014L4;FB57070000050000008b1a4900000000004e0000000000000058070000050000009120490000000000560000000", - "000000057000000090000009120490000000000L8;FFef4700f9fe9b42f9e09f42f9e8df00f9e83742f9f8a342f9fba742f9f6ab42f9e5af42f9e8af00f9e83b42f9eeb342f9e4b742f9edbb42f9e1bf42f9e87300f9BL8;FF6f0d0094df0600b18000005480020391e1431691951000941f0700b1e080ff", - "54802202916c010014e8031faa00011aab42690054e1431691610d0094df0600b1L8;FFe87306f9e97706f9c6540094e1fb44f9810000b4e0ff44f922008052b554009468b240f9080700b4e1f342f9e2f742f9e8833291e0db42f9e44b40f943030291BBBBL4;FF110000145f2800f1880000542800028b", - "08f1df38e806f837a0e300d1895d0094a8835cb8480f0037a8835df8ea0240f9490108ebe32700544a0340f9b4035df8L4;FB20636f6e7461696e2044656372797074696f6e4572726f724d6573736167650a25080212210539450d63ebd0752c0fd4038b9d07a916f5e174b756d409b5ca79L8;FF60fbff", - "543f100071c100005481620091e20313aabdf2ff9720fbffb452000014e20313aa230c805246edff97e10300aad4ffff17800c00b5e00313aa97f3ff97BL8;FFf15eff9720faffb4890000143f0c0071600200543f10007101f9ff54e84740f91f0500b1c0020054e1620091a20301d1d65dff97a0f8ffb4", - "62000014e83b40f9L8;FFead302f97d110094e8d352b91f050071c1000054e1d752b9e2db52b9e3431691c0008052501400949f0e00b140020054e1d342f9e8cb42f91f0101eb60b70054BBBL4;FFa1120094e85342a9f56343a91f0500f14101005408008092756201a9685200a9f44f47a9f65746a9f85", - "f45a9fd7b44a9ff030291c0035fd6e0830091e10317aaL4;FB10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L8;FF08011c8b11e10091480600912082c13c321640f98cc101f122025ff82", - "102de3ca081813c2082dc3cb28102f832825df8c28102f8220a40f9e017803d2002c03dBL8;FF81fbffb47a01001401e30191a22302d1fcebff97e0faffb449010014e8eb45f91f0500b1801c005401430291a22302d15aeeff97e0f9ffb453010014e83746f9L8;FFe81745f91f0500b1e1000054ff1705", - "f9f81b05f9ff1f05f9ff430ab9ff2705f9ff530ab91f0800f1212a0054a02302d18df4ff9700080036c1eeffb4d9010014BBBBBL4;FF2bc1cbca4901098b6801088b2abdcaca2981c9930badcbca4801088b6901098b0acdcaca0881c8932bc1cbca4901098b6801088b2c81c99329bdcaca0badcbcaL4;F", - "F14ef7cd33f0100f1820248faa9000054f5031faae00315aae10314aac2040094940900b4f70301aaf90300aaad040094e00314aa0101805215018052aa040094L8;FFfd7bc2a8bd00001460220091d700009460220291f30b40f9fd7bc2a8b2fdff17610640f9810000b4600a40f922008052b004019461", - "1240f9a10800b4601640f9BL8;FF0880009109200091020300f042bc0191e82700a9e803009109000090296136912f000014202040a9210300b021b02891030d40f9a2038052fd7b43a9ff030191L8;FF4831889affc300d1fd7b02a9fd8300914a0100d04a352291e90301aa8b0000104c6968386b090c8", - "b60011fd608200091410100f021001a91e80300f9e8230091BBBL4;FFff7e07a9fa3b02f9f84702f9fffe08a9f85302f9ff5702f9f55b02f9f58f02f9f5a702f9ff7e16a91f0800f1011e0054b4835df8820640f9621f00b4810240f9L4;FB470100000a0000007375636365737366756c6c792064656372", - "79707465643b206d757374206861766520612072656d6f7465206964656e74697479206b657900L8;FF28a108aae18314ade09fc13deaa301f9ea7740f9e1d342f9080118aae90743f9e28fc13de3a3c13de187c13de48315ade08bc13debaf00b9eb6740f9ea5300f9BL8;FF42018052440080521a00001", - "4a0031df8c102009021240e91c3020090634c0e91a0c300d1420180524401805211000014c80080d2a0831d38a0c300d10800f0f2L8;FFfc030b9160838e3c2083c83c61838f3c2183c93c6083883c2083ca3c6183893c2183cb3c60838a3c2083c43c61838b3c2183c53ce85301f9c86a40b9e00704adBB", - "BBL4;FFff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb230d01541803008bf9feffb50f0000141f0400b1L4;FB6f6c3a3a747269706c655f72617463686574696e76616c696420726563656976657220636861696e206d657373616765206b", - "6579735369676e616c5f5051434bL8;FFfa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9ff830cd1290840f9f30308aaa90700b4280500f1e00600542b0440f91f2900f14c018052BL8;FFff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aac10200f021382f91e8230091e", - "00309aaa2028052fd64019468c20091c10200f021102891c40200f0L8;FF080117cbbf0208eb09fcff54e00313aae10317aae20315aacd070094770a40f9daffff17f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6ff8303d1BBBL4;FF0801c0da0811c0da08fd43d3e00308aafd7bc1a8c003", - "5fd6600300b000c01391b7a40194600300b000201191b4a40194fd7bbba9fa6701a9f85f02a9f65703a9L4;FFdeffff17fd7bbaa9fd030091f76303a9177c4093f55b02a936000090c3021091f96b04a9f90301aae12a0091f50317aa627861f8421200b4401840b9800e0035L8;FFa90100d029d90d9121", - "118a9af7a40014fd7bbca9f85f01a9f65702a9f44f03a9fd030091080040f9f30300aa1f0500b160000054e00313aa09a2ff97764240f9BL8;FF0101003926000014e00313aaf603012ae10314aae20315aa94faff97e103162a680640f9df0202710801148ba3feff54e90f80123f002071ea0f80122914", - "0033BL4;FF3a8300911bed7cd3040000147bc300f15ac30091c003005448035ff81f0117eb61ffff5440835ef8e10313aae20317aac6240094c0feff35f6031aaac18e5ff8L3;FB7f454c460201010300000000000000000200b7000100000010c0490000000000400000000000000030f30e00000000000", - "0000000400038000b00400014001200BBBBBBBBL4;FFbf1e02946004009000201191bc1e02946004009000801191b91e0294ff8302d1fd7b04a9fc6f05a9fa6706a9f85f07a9f65708a9f44f09a9fd030191150c40f9L4;FFa2e300d137fdff9720fbffb42b00001401c30091a2e300d132fdff9780faffb", - "420000014c00500b5a0e300d111feff9700010036c1f9ffb431000014a2e300d1L8;FFf65701a9f44f02a9fd030091160040f9f30301aa20008052f40302aaf50308aac1420091201f01942001f8b78802009008011c91b45a01a9a84e00a9f44f42a9BBL4;FF880100b42a0940f929610091086100d1550", - "115ab63ffff54400300d000a01a91420300d042801b91a1068052d29e01949509f8b6f9031faae00319aae10315aaL4;FFe08702a9e21f00f9a6ffff97e0c30191e5830191e3008012e00304a9e52b00f9e37f0b29e01740f9e10b43a9e43740f9e7ffff17fd7bbea9fd030091f35301a9L8;FF810100d02", - "19c1591a40100b084200b91a363009182008052b30f00f9029f0094029f0094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9BBBL4;FF80020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300eb434d00541803008b060000141f0400b1c", - "14c0054d0de0194L4;FB400f440000000000c41444000000000050164400000000001815440000000000d417440000000000601444000000000045024900000000004e00000000000000L8;FF2c2c4fa9081d00121f050071288840f9e82700f9288c40f9e80b00f9289040f9e83b00f9289440f9e84300f", - "9289840f9e82300f9289c40f9e83700f928a040f9BL8;FFf65704a9f44f05a9fd030091ff0740d1ff0300f9ff833cd1e8074091f30300aafa07409108810991e00301aaf5074091ff0300f95a830991b58209918b750094L8;FF090180522a040091e00317aa6a0a00f909692138e10313aa78fbff975603", - "00b4610a40f9680240f9b70640f91f0101eb80080054680640f9490280522a040091BBBBL4;FF32c201f2a00100545102c0da3112c0da110e518b31020b8a31fe0e9b5101118b20025ab8df02006ba0030054510600d1320212eaa1feff54ff0500f100010054L4;ZFL8;FF81020054e1031faae00301aaf", - "44f45a9f65744a9fd7b43a9ff830191c0035fd6c80080d2e10700f90800f0f2080900d1b7ffff17e80b41b2e00700f9b4ffff17BL8;FF212031915e000014092000912103009021a03e91a9831ff82403009084a030916d01001409200091210300b0211c0291240300b08460019126030090c6803291L8;", - "FF0825019109fd46d30800098b080500911f0109eb2816005458000014f6031faa958640f9bf0600b1401700548022049124eeff97080040b20811c0da081540d2BBBL4;FFe8bb40f9080114cbbf0208eb49faff54e0c30591e10314aae20315aa230080522400805222b1ff97f4c340f9caffff17e05fc0", - "3de8c340f929008092ff0600b1L4;FB6769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f62797465732d312e31322e312f7372632f62797465735f6dL8;FF000480522100805219bf0094800300b40804805221008052e85700a9958e40a9e02302a9e003", - "0091e82301a9e20315aa16000094e00740ade20bc03d810240f9BL8;FF4a2501914afd46d329010a8b290500913f010aebe9050054280108ab8300005426000014e80308ab82040054090840f9090100b42a0140b24a11c0da4a1540d2L8;FF430c805207f9ff97e10300aaa10a00b5680240f9080540f91", - "f0119ebe9030054e00313aa90feff97c009003728fc60d3a80600b5200840921f1800f182070054BBBBBL4;FF480f0054680640f9e10316aae20315aa0001178bbf0e0294e802158b680a00f9951640f9350300b4610a40f9680240f9961240f91f0101ebe00f0054680640f9L4;FFc40e0094e28753a9e0", - "431391fa8b00f9be040094e96f42f9e86b42f9e9bf00f9e97342f91f0900b1e8af00f9e9a300f921050054e0431391e1031caa22008052L8;FFf50300aae80700f9083041b8e1230091e92b0229090c40f9e81b00b9082040b9a05300d1e9c301f8e82700b98efcff97a8c35e3888010036a8d35ef8a9535", - "ff8BL8;FF5a1f40f9fc0300f9fb0f00b9f96301a9f75b02a9f54f03a9937e089bb18e0194e00313aa01018052af8e0194a0831df8201100b4080d8052b3835df8fc031faaL8;FFfd7b41a9ffc30091c0035fd6ff8300d1fd7b01a9fd430091e00301aa810100b021003291e8030091e2008052fd8e0094e0", - "030091fd8e0094fd7b41a9ff830091BBBL4;FFe81f40f9080118cbdf0208eb481e0054e82340f9e10317aae20316aa0001188bbcce01940803168be82700f9a80a40f9480f00b4a90640f919e97bd333610091L4;FB40508d60a1644ed5151b26d3654b4a93a242c8b33943df5d95600f26341bda8b07e91", - "c6d4a2c7a47a1b3d7a7539ac0e0f1fbd1a00da647de446fa28cd20aeaedL8;FFf4b344a9f57b40f9e80309aaebbf46a9f10308aaea6341a9f9fb42a9e8030eaafc0748a9ee0311aae69f43a9f1031baae4a74ba9ed0740f9e56f40f9f03340f9BL8;FF6082803c680e00f9f50000b4f30314aae00313aa52", - "050094b50600f173a2019181ffff54e81f40f9c80000b4090d8052e00314aa02018052017d099bad4e0194L8;FF41050054e8630191ea9740f9e93342f908e10c91f6bb41f9fbbf41f9000545ad5f0500b10231c03df5c341f9f7c741f9e95305f9400705ad000543ad4233803dBBBBL4;FFe20316aaf703", - "00aac2ee01940600001435008052f61640f93a00805256feffb537008052090340b2e8031faa7f0a00b12911c0dafa630629291540d2f35700a9L4;FB000000000000000004000000000000000400000000000000ecc24200000000007475706c65207374727563742054696d657374616d705072656b657", - "94d657373L8;FF63881591e003009122028052a4008052e80300f912000014e00300f9210200d021701e91230200d0639c1591e0030091220280528400805209000014e00300f9BL8;FFfa6704a9f85f05a9f65706a9f44f07a9fd830091170040b9b70d0034f30301aaf80200f018032a91f7000037b701", - "0837b702103728008052f70700b9b70a0035L8;FFe1031caae2031aaad1110094fcd342f9e8cb42f908011ccb5f0308eb492aff54e0431691e1031caae2031aaac8110094fcd342f94cf9ff17e043169122008052BBBL4;FFe8d34278eabf4039e19342b83f8100f1a8c31b78aae31b38e1060054486f40f", - "9e0031aaa1f0500b1c0130054087440f91f8100f1e11300540c7040f9e8134139L4;FFb4835ef8e6ffff17155300a91c0b00f909000014f60315aa08008092080300f9b60000b4e00314aae10316aa220080524cfeff97e003132a1e11009403000014L8;FF0821094a095d10534801084ae95a697808010", - "94a68020079f30318aa03f5ff54e96f43a9b3035df8730a00d13f0114eb7b0700d1c1f1ff54040000141f000079BL8;FF17ffff17e04bc13de14fc13de84345b9b47e085372ffff17f46f41f9e8c31791e91f46b900c1c03c01c1c13cf5fb45b9880240f9f36b41f9e97305b9e057813dL8;FFff030b39a8", - "a33aa9bf831bf829f1ff97a8835cf81f0d00b181010054680200f9e8034b391f1500710d0200541f190071800200541f1d0071400200541f210071BBBBBBL4;FF1f2900f1880000542900088b29f1df388918f837e0230091e20308aa897f0094e80b40b908010036e00b40f9f44f4da9f6574ca9f85f4ba", - "9fd7b4aa9ff830391L4;FF4083c33c61838a3c4183c43c6083833c4083c53c6183843c4183c63c6083853cc082c03c6183863cc182c13c6083803cc082c23c6183813c6083823cec2f0054L8;FFf65744a9f85f43a9fd7b41a9ff830191c0035fd6ff8300d1fd7b01a9fd43009108a440a9e0030091e8270", - "0a950fcff97fd7b41a9ff830091c0035fd6e00301aaBBL4;FF2a2080390871098bca01f8b708e10a8b2a01805208a800a91f0000f9fd7b44a9ff430191c0035fd6400300d000901991420300d042a01a9161088052de960194L4;ZBL8;FF29c921918a0000102b6968384a090b8b40011fd6088c40f81f09", - "00b1411d0054e8031faa73010014e80300aa098d40f83f0500b140250054f30300aae00308aaBBBL4;FF600640a9ca0300904a61199109040091400540ad690200f9000500ad000502a9f44f41a9fd7bc2a8c0035fd6f40308aac1d60194e80314aa29008052610600f9L4;FB8d00000011000000361b490", - "0000000005500000000000000ce0000000100000056315374617465696e6e65725f73746174655071526174636865745374617465L8;FFe8ab03a929a855a9e97b00f929a056a9ea230ca92ba058a9e9d300f929a857a9eb6f00f9e85f00f92ba059a9eaa30aa92aa05ba9ebe300f9e83300f928ec5ca9BL", - "8;FFf87f49f9780300b4e1d342f9e8cb42f9f97b49f91f0101eb208d0054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9610f0094fad342f9L8;FFe15346f9e15306f9e0833291210100902120379102028052230100b063000491e4018052144bff97f55346f9e0833291e1032d9", - "1022b8052b6560094e0833291BBBBL4;FF1f0d00b1e1020054880200f96800805227000014765e40a9f50301aab1f601940003805201018052aff60194e00400b4080400f008013a91e10315aa165c00a9L4;FB65745f7374617465696e76616c696420726f6f74206b657976616c6964205072697661746", - "54b657953656e6465726b65794d657373616765506c61696e746578L8;FFf65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6370080521800809219018052a80640f91f0116eb090f0054e00313aa99f5ff9700fe073728fc60d3BL8;FF0103009021742591040300f084401091a3630091820180", - "52a80f00f902770194688201910103009021a42591040300f084c01091a3630091e2018052a80f00f9L8;FFe0074091e14306910274805200800991f807409118830991be760094e0074091e843169100800991f1b3ff97e08741ade217c03de8eb46f9f94b09f9e2a3843dBBBL4;FF0a0c00910a250ba90", - "a1000910a250ea90a1400910a2511a90aa10591000500ad008501ad000503ad008504ad000506ad008507ad400500ad0ba518a9f44f42a9L4;ZDL8;FF140d0094e12340f9810000b4e00315aa22008052b7b60094e00740ad800600ade00b41ad6042803c6242813c760200b9f44f4aa9f65749a9fd7b48a", - "9ffc30291BL8;FF21008052b8360194c01101b4e10313aae20316aae00f00f9be360194e82b41f9e80700f9e83341f9f93f00b91f0500b1a00b0054f33b41f9e87b42b9e81700b9L8;FFe10315aae20318aaf70300aac136009402000014370080527ac240f9fa0100b4fc031baa7bbe40f9ae360094e003", - "1aaa21008052ac360094a0de00b4e1031baaBBBBBL4;FF1f0002716200005435008052070000141f0020716200005455008052030000141f404071d536969ae80740f9080114cbbf0208eb28040054e80b40f91f000271L4;FFf40300aab70600940002805201018052b5060094200100b4140000f981000", - "0f021800291130800b91f300039f44f41a9fd7bc2a8c0035fd60001805201028052L8;FFa80000b4608a40f901f57ed342008052b8060194689240f9a80000b4609640f901f57ed342008052b2060194689e40f9a80000b460a240f901f57ed342008052BL8;FF880480520900f0d2880201a9881200f908", - "008092000400ad882600a9dcffff17b0860194800380522100805297038052ad860194200e00b4280300b008150a91L8;FF0811008b150540f9f50a00b41b0140f9b7fa7fd3b3860094e00317aa41008052b1860094002900b4f80300aab5833ba9a0c300d1e1031baae20315aabf831cf8BBBL4;FFf6570", - "4a9f44f05a9fd030091ff0307d1171c0012f503042af603032af403002afa0302aaf90301aaff1a0071fc0308aae51f00f9ac000054ff0a0071c0000054L4;FB65722f7472616974732f616363756d2e7273001a73657373696f6e20737461746520636f727275707420666f7220c0023a20c0002f636172", - "676f2d7461726765L8;FFf9f342f9e3c7803decb704a9028544ade89342f9e85300f9e89b42f9e28717ada182cf3ca282ce3ce82b0ba9e8a342f9ea9f42f9e18315ada182ca3ca082cb3cBL8;FFe0030daa47000014e10300a9e00301aae10309aa22008052f4030daabd050094e10340a9ed0314aa2aa04", - "0a9536928380cfc71d308050091290040f9280800f9L8;FF226968f8090100b029612191286968f8e10308aaf546001408a440a9e20301aae00308aae10309aaec460014fd7bbfa9fd030091083040f9080100b4080140b2BBBBL4;FF22008052bbe60194e13740f9810000b4e02740f922008052b6e6019", - "4e15340f9810000b4e05740f922008052b1e60194880280d2b40e00f90800f0f2a8ce00a9L4;FB2f303639353962342f7372632f696e6372656d656e74616c5f6d6c6b656d3736382e7273002f636172676f2d72656769737472792f696e6465782e6372617465L8;FF800640f901e97bd302018052b9e60", - "094e00314aa0109805202018052b5e60094280080927f220039680200f9ff431491f44f45a9f65744a9f85f43a9fa6742a9BL8;FF84203391a363009122018052b30f00f90567019468a20091e102009021142f91e40200f084a03391a363009122018052a80f00f9fc660194fc660194fd7b41a9L8;FF01", - "f97fd342008052ba660094684240f9a80000b4604640f901f97fd342008052b4660094684e40f9a80000b4605240f901f97fd342008052ae660094685a40f9BBBL4;FF6d15003309f101f8290080920c2100390a7101f80d9d0039090100f9c0035fd6090500f9290180d20900f0f2090100f9c0035fd6ff", - "c301d1fd7b02a9fa6703a9L4;FFbfffff17630a40f9620c40f2600000543f000039007d20d460c05f3861d05f3864e05f782110001200010034640000345f000039007d20d464805fb8e0ff9f52L8;FFfd7b01a9f51300f9f44f03a9fd430091f30300aae8030091e00301aaf8a60094680240f9090940f9", - "c90100b42905098b150540f9b30100f073e2049134f17dd3BL8;FFe3430091e90f00f9d7260194fd7b42a9ffc30091c0035fd6ff0301d1fd7b03a9fdc30091080040391f0500714c010054c8030035202040a9810200b0213c3d91L8;FFe10318aac826009420008052e10316aac526009420008052e1031", - "5aac226009400018052e10313aabf260094080040f9e20301aa002140a9e10308aaf8260014BBBBBBBL4;FF699284d248f07dd32949b2f28924c9f24992e4f2097dc99b080109cb2805488b0900809208fd42d3080500d10811c0da2825c89a17050091287cd79bff0308ebL4;FFe11f40f9810000b4e003", - "16aa22008052b81a00941a0080921d0000141a008092e00bc03de007803de017803db70000b4e00318aae10317aa22008052ad1a0094L8;FFe02300a9200440a9620200f042900b91e3030091e92301a9d31a0194fd7b42a9ffc30091c0035fd60b0c40f92b0200b4090040f9080840f91f0109ebea33899", - "aBBL4;FF5f0100f91f410ff181ffff54ffb304b9e8430391ffa304b909510f91ffa704b90a0540b2ffab04b909610f91ffaf04b909710f91ff43033909017fb2ff470339L4;ZFL8;FFf31300f9fd430091e90301aaf30300aa810100b021001a91e8030091e00309aaa2018052ff9a009468c20091810100", - "b021881591a401009084a00a91e0030091BBBL4;FFf44f07a9fd8300915c2040b9f60302aaf80301aaf30300aaf40308aab1da01940004805221008052afda0194e00d00b4c00640adf50300aa000400ade00318aaL4;FB03144900000000001b14490000000000220036000561663b870a0e001a0004263", - "41e55080042202c094c5836701464000000a901ab0015012100fd011f026601L8;FFe82b42f9ea3b42f9e9a309a9e82f42f9e93342f9e8df00f9e83742f9e8af15a9e84342f9eb3f42f9e8b700f9e84742f9eaa318a9e84b42f9ea4f42f9e8eb00f9BL8;FFe2a3843de267c33de09b843de06bc33de19f84", - "3de16fc33d4083843ce073c33d4183853ce197c13d4083863ce09bc13d4283833ce293c13dfa3349f9e0ef843dL8;FF48fd60d3fcfb42f9e9231839b47e0853e0c2c13ce1c2c03ce8a305b9e067813de163813d8607001435008052f6b340f9d6e9ffb53a008052fcbf40f9fceaffb5BBBBL4;FF775a40a9", - "f50301aab6fa01940003805201018052b4fa0194000500b4e8c20391e10315aa1f400039085800a92804009008412991602201a9090d40f9e8030091L4;FB726f746f636f6c2f7372632f73746174652f6b796265725f7072656b65792e7273003c5472696d6d696e6720657863657373697665207265636", - "5697665725f63L8;FFe18341ade18308ade28342ade28309ade18340ade18307ada02100b4e0c3039147f7ff9707010014e1430091e20313aafb1f00f9f70b00f9d2080094e08741adBL8;FFbc7a019448008052680a00f9f44f41a9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aa", - "1f1800b93f0400f18b000054600640f922008052L8;FF00403c91be7a00946001009000602c91bb7a00946001009000a01d91b87a00946001009000e00891b57a0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9BBBL4;FF06a3ff9708068052ff1300f9f82300a90800001428008052f40318aaff0", - "700f9e81300f9f32b40f9fc1b40f938008052aaae8cd22b4c8ed2a06301d1e8274ca9L4;ZBL8;FF08a1319129048052e1831391e87302f90801805242008052000400ada0e300d1bc0314f8e97702f9f47b02f9e87f02f913140094ba537da9aaba009400048052BL8;FFa00200d000401691bd3a0194a00", - "200d000801991ba3a0194a00200d000002b91b73a0194fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e0030054L8;FFe84740f91f0900b1c13c0054682a43f9e0830f9161e21391022b8052175501b9683642f9754242f908e940b9684a06b9b83a0094e1830f91e00315aa1577fe97BBBBBL", - "4;FF22008052230080522400805228fdff97610a40f9e00318aa1bfeff17ffc303d1fd7b0aa9f95b00f9f85f0ca9f6570da9f44f0ea9fd830291280400511f390071L4;FFb90a0094a00000b528008052750600f904000014e00315aae8031faa600600f90a028052e90314aa696a2af8680200f9f44f42a", - "9f50b40f9fd7bc3a8c0035fd6L8;FFeb0a0194fd7b42a9ffc30091c0035fd6080040f9e20301aa00a140a9e10308aaff0a0114080040f96902009029c11e91e00301aa08014039227968f869020090BL8;FF0900809268d200a9690200f900010014170040395a0080d2f50300aa1a00f0f2ffc200718200", - "0054e87e0453490b009105000014ff3e0171e9000054e87e0453L8;FF9f0600f161000054f3031faad7000014a87a1f53a9661a53f80316aa5a008052720100f052e23b91e8e300b9a8761e53f63b00f9e8db00b9a8721d53f44700f9BBBL4;FF230080522400805229bdff97b7035ef8ba035df817ffff1", - "7a0c300d1e1031aaa22008052230080522400805220bdff97b7035ef818ffff17a0c300d1e10317aaL4;FB00000000000000000800000000000000080000000000000058fd45000000000000000000000000000800000000000000080000000000000078fe450000000000L8;FFc4ca00941a0500143f050", - "0b180200054600742ade0831d9168234039e1c30391e97b00f9e08709ad600b43ade8e30339680f40f9e08b0aad610341ade18308adBL8;FF685a40f9a80000b4605e40f901f97fd342008052b74a0194686640f9a80000b4606a40f901f97fd342008052b14a0194687240f9a80000b4607640f901f97fd", - "3L8;FF0800098b080500911f0109ebe81b00541401001497010094080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f0008eb29210054BBBBL4;FFfa7316a9fb5317a9610205adf86718a9f55f19a908010054e14340f960020191bcea0194e80f40b9f9c30891e87f07392", - "0000014f44340f92800805260020291L4;FB08000000000000000800000000000000fc7d420000000000000000000000000008000000000000000800000000000000607e4200000000000000000000000000L8;FFe802158b680a00f9951640f9550300b4610a40f9680240f9961240f91f0101ebe00b005", - "4680640f9490480522a040091e00315aa6a0a00f909692138e10313aaBL8;FFe1031faa680200b42a6961385ff1017180020054210400911f0101eb61ffff54e0031faa810217cb1f0400f10002005419000014a102178b820217cb800f8052L8;FF8041883c8021c03de95343b9811d803d8182823c8082", - "833ce98b01b98082c23c8112c03de8bf40f97a0200f98002803df45744a9e8ab00f9610a803d6082803cBBBL4;FFe8a3009160030090005c2691e82704a9680300f008a10c9189038052e1c30091e82705a9e343019142008052e82706a9680300f008410c91e83b00f9a890ff97L4;FFf8018052090000f", - "9087000f8e00315aa3a030094760000b4e00314aa37030094f60318aae00317aadf0600b1c0c5ff54760000b4e00313aa30030094e8031faaL8;FFe000005461825ff881ffffb4600240f922008052b7aa0094f8ffff17880240f9280d00b40805088be00315aa0201805201f17dd3ff030791f44f45a9f6", - "5744a9BL8;FFe00316aa00013fd6010740f9810000b4020b40f9e00316aab62a01947f0b00b181040054e91f40f9e14341f9e0031691ffa71139200545ad286140f9e82303f9L8;FFf0290094e80356b9e00740918100805200001891ff0316b9e80b00b9e9290094e0074091f90356b9810080520000189", - "1ff0316b9e3290094e0074091f60356b9BBBBBBL4;FF490108eb630a0054ea0240f9e00740f94801088be82600a908fc60d3e80400b5080840921f1900f102050054017c0353210500343f04007101fbff54890240f9L4;FF7dc4ff97e02b01b9a04700d17ac4ff97e02301b9a04700d177c4ff97e01f01b", - "9a04700d174c4ff97e01301b9a04700d171c4ff97e00b01b9a04700d16ec4ff97L8;FFbf25007129c100110b819f1adf7d02710914003949c100110a819f1a0918003969010d0b4a114e0b29c10011cb0d00122c144039091c003949c100117f250071BBL4;FFfd830091f40300aa081440f9f30301aa00a", - "440a9811240f995620091360108eb2231889acf920194087c40931f000071c802889ae800f8b7600640a968000090L4;ZDL8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8bBBBL4;FFf", - "90304aaae4302d1e73f00f9e65300f9e10f0d29e2af00b9560f00b47aa340a9f703022afb6709a9f9031faaf56b08a9f5c302911f0114ebe933949a0a0109cbL4;FB4c69aaefa9449d928f4307a6ff0d3c7cf8dc1cf32b6e3c339a56f9154dcaedd571644007d877e3ee71395db1c30e3743d71cd11b0100", - "744059e124d3e459e459L8;FFe8d742f9e84b00f9e8e342f9e9a30fa9c0d20094eb1b43a9ed031caae0bf46a9f00314aaf16740f9f5ef40f9ec031baaea0b40f9e72340f9fe031aaafa0317aaBL8;FF22008052c3110094e1d342f956f9ff17e043169122008052be110094e1d342f95ff9ff17e04316912", - "2008052b9110094e1d342f98dfbff17e043169122008052L8;FFe82303b9e00758ad955e1833e82343b97c0300f9750b00b960c3803c61c3813c682f00b9ff033a91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8BBBBL4;FF08011091890280524b000014a8935cb88a5e40f9a9c35cb8b8a", - "f7da9b9035df85f8100f1a88317b8a8835e38a9b317b8ab031af8a8831a3881070054885a40f9L4;FB756e77726170282960206f6e20616e2060457272602076616c75650000000000182440000000000030000000000000000800000000000000bc87420000000000L8;FF7cffff17c80080d20800f0f20", - "80500d170ffff17c80080d2e10700f90800f0f2080900d107000014e80b41b2e00700f904000014c80080d20800f0f2080500d1BL8;FFabe35838a9c31838a9f358384a01084ac00640adaad318386a01084a2801084aaae31838e10300ada8f31838a0073eade3720194a9035538480d8052aa135538L8;", - "FFe8cf42f9090180522a04009109692138e1431691ead302f9780f0094e88349f91f0500b1c0000054e8074091e143169108810991008102919b120094f87f49f9BBBL4;FF3c9dff97a1637ba9800600b4a10a00b4f90300aae00318aa22008052b5b20194e00319aa99ebffb46d000014a88358f81f0d00", - "b1e902005428008052a14301d1L4;ZBL8;FF960a40f9e8a700a9e8031baa05000014e8031baa9c0700d19f0700f1a9050054a8ffffb4e9af40a90a0e8052c9260a9bca0600911b0500d15f010bebeb338b9aBL8;FF4c000014e80f41b2e0833291e85306f9d7270094e10300aa3e000014c80080d2e0a332", - "39e08332910800f0f2ffa73239e85306f9ce270094e80300aae85306f9L8;FFc80240f9a80000b4c00640f901e97bd302018052b7320094e00316aa0109805202018052b3320094e0831591e1831a9102288052b7320094e0831f91e1831591BBBBBL4;FFf30300aaa80e40f9080a00b4a00642a9e20318a", - "a65fdff9708fc79d3e1e7076f0a634039ba6640a9eb031faa080d010e09ef40a91c00198a496b7cfc208d282eL4;FF20838c3c99420091e18247ade00319aae8eb01f9c8620491eaff01f9eac740f9e007813de103813d010140ade99b01f9e98341f9a8620491ea1302f9ea7f41f9L8;FF04000014b5060", - "0f1d6620091e0000054c1825ff881ffffb4c00240f922008052b4020194f8ffff17340100b48806148be00313aa01f17dd302018052f44f42a9BL8;FFe80700f9fd820194fd7b41a9ff830091c0035fd6010300f02170299182008052f2820114080040f9e00301aa090140f93f0500b1e0010054ff8300d", - "1fd7b01a9L8;FFbf820094600100d000001c91bc820094400100f000001491b9820094ff4302d1fd7b04a9f92b00f9f85f06a9f65707a9f44f08a9fd03019137fc4039f40301aaBBBL4;FFf44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd6eaa343b8efe34039890240b2f07f4079f12f44a94a", - "bd70d32d4d4078e82108aaec434139ee1343b8L4;FBc876490000000000da76490000000000f86d490000000000ed764900000000000700000000000000060000000000000000000000000000000000000000000000L8;FFf44f05a9fd030091ff4316d1ff0300f9f30308aabc8302d1080040f9fa431091", - "fb830291f40300aa090900d11f0500f1e80080522881889ac90100d029712191BL8;FF2a040091e00316aa6a0a00f909692138e10313aa6afbff97780a40f9680240f9080118cbdf0208eb88070054680640f9e10317aae20316aa0001188bb5420194L8;FF1a0380d2000100900034269108210091e1430", - "691ea2f19a9e90702f91a00f0f2e3420094e81f40b9e8030639e10740f9c1f7ffb527feff173c008052e8430691BBBBL4;FFdfe201941f10003121ce0054f9ffff17dce20194f70300aa1f0400b141fdff54e043059181008052d7e2019400cd0035e85341b9e8b700b957ffdfc8d70200b4L4;FB5400000", - "00000000079000000050000002aea48000000000054000000000000007f000000050000002aea48000000000054000000000000008d00000014000000L8;FF90000014e8db43f9e0ebc13de9030b912003029128710ff8680e00f90800809220718e3c6082803c680200f99ddcff9763000014e32740b9f6", - "432d917f040071BL8;FF08630194c10200f021e01e91e40200d084003c91e0030091a363009102028052b30f00f90063019468620091c10200f021201f91e40200d084803c91a3630091L8;FF290040f90dfc6ad35369283808050091280800f90dfeffb43f0108eb7361193220010054536928380cfc71d", - "308050091290040f9280800f94c0200b5e0030daaBBBL4;FF240080522a95ff97f82b40f9b4ffff17e00301912200805223008052240080522395ff97e12b40f9b9ffff17e0030191e10318aae20316aa2300805224008052L4;FF42308b1a3fc122eb23e9ff5422010034436c1c53e403801204d01f3802", - "e01f7800c0238b1fc01f38e40840f984400091040004cb211c001201d01f38030100cbL8;FF82008052e80700f9fca20094fd7b41a9ff830091c0035fd6080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091810100f0210c1691BL8;FFa82300d1090000f029912391a10f00f", - "9800200b000bc0691e8a701a9a8630091820200b042c01091e1630091e8a702a9be220194a90f00f9a82300d1090000f0BL4;FFf3ffff17682a40f9c80000b40805088be00314aa0201805201ed7cd3b522009460e20191a2ffff9774564da9350200b49682009104000014b50600f1d6c20091L3;ZBBBBB", - "BBBBBL4;FF726a2f383ffe037112220039200300546f7a68f8707a6df86f7a2df8707a28f8c8815ff81f0103ebe3f9ff54d9000014600240fd00a8200e0f00669eef01c0daL4;FF2aa040a9536928380cfc5cd308050091290040f9280800f90cfeffb40a7c15533f0108eb53611932200100542a0440f90", - "bfc63d35369283808050091280800f9L8;FF68020054c80215ab42030054e0030091680600f9cb050094f44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd6e00315aaf44f46a9f72340f9f65745a9BBL4;FF490300f029a10d91ea830091a02700d1e8270aa9480300b008f52a91e82b0ca94a068", - "05208048052ff2707a9490300b029d52891e92b09a9290080d2e1c30191L4;FF58f7ff3562fd9fd22200a0f27f0002eb6890829abf0208ebc80a0054a10e00913f7c02f121fc44d322040011c90300542104009129c59c5269eda072020000d0L8;FF21101591a40100b084c01891e0030091a3630091420", - "08052b30f00f902a0009402a00094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9BBBL4;FF606e0035e85341b9e85b00b957ffdfc8770000b5dbdf0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1L4;FB7d004900000000", - "004a0000000000000015020000090000007d004900000000004a000000000000008c020000090000007d004900000000004a00000000000000L8;FF0dec40f9ed4b00f9e08400541f050071401200542c050014280441f9140340f99f0208ebe8979f1a08219f5a081d0072e0ab00541f050071611701548", - "9008052BL8;FFe10315aae2031caaa0733ea9c15f0194380b40f9380100b53c0000143b008052281f40f91f0500b121fcff54a8831ff8380b40f9b80600b4f41700f9340740f9L8;FFc45f0094c802148b680a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6e8031faa74f7ffb5e00308ab43f8ff", - "54200100f000c01591b15f0094e00313aaBBBBL4;FFdf02006ba0030054510600d1320212eaa1feff54ff0500f10001005443a8200e6c00669e6c0100b48c01c0da8c11c0da0c0e4c8b8c010b8a428c212e42a8302eL4;ZFL8;FF9b150094e10340a9ec0314aa2aa040a9536928380bfc71d308050091290", - "040f9280800f94bf2ffb4ddffff17e10300a9e00301aae10308aa2200805223008052BL8;FFff030191c0035fd6080040f9e20301aa080140f900a140a9e10308aa00800114080040f9e20301aa002140a9e10308aafb7f0114090040f9281040b9200140f9L8;FF08fd46d30900088b37050091ff0208eb", - "a822005459010014e11740f9e80f40f91f0101eb20710054e81340f92a040091e00315aa49088052ea1700f909692138BBBL4;FFe183843cc0020054e02348a91f8100f14108005408084079091840390a7040f8190040b918f040f8e823007957fd68d3087041f8e94b0039097c4039ea3301f8L4;FB657", - "92049446d697373696e672070712063697068657274657874000000000000147d4900000000002d000000000000009f00000009000000147d490000000000L8;FF80864dade0c309918276c03de10314aa02328052e08610ad81824cade28e803de1820fadbbbf0094e1c30991e00313aa026e8052b7bf00", - "94ff831791f44f43a9BL8;FFff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191350840f9fa0301aaf30300aa750500b4540740f9ab3f0194e00315aa21008052L8;FF4b018052e0031faa4a010b8b29010bcb0a2500a9fd7b43a9ff030191c0035fd6e80741b2e0030091e80", - "300f9d034ff97e10300aa20008052fd7b43a9ff030191BBBBBL4;FF140100b4680640f9e10315aae20314aa0001168bbf0f0294c802148b680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e0031faae10313aaf44f42a9f65741a9L4;FF0ae5003909e90039e92b48290aed003909f10039e8431391dc0f", - "0094e0074091e1431391028c815200401d91b90f0094e00b4091e843139102c4805200c00e91L8;FFa2058052ea9300f8ab2b7d29e9470039e83b00b9eb2301b8ab035fb8ea7301b8aa435ff8e95b0039e96f0039eb1f00b9e9830039ea1302f8e89302b8eb0f0194BL8;FFfa6759a9fc6f58a9fd7b57a9f", - "f430791c0035fd620008052e10315aac28f019420008052e10318aabf8f019420008052e1031baabc8f019400018052e10314aaL8;FF08e1403960024079210040791f05007181040054e2031f2a8ce8ff9709fc78d38801009008e13b910afc60d3097969784921094a2a5d105308596a780001094aBBBL", - "4;FF018102ad028d01ada8c201911f0117eb01fdff54fb1340f99f0216ebc0010054f50314aaf70316aaf40308aaf60308aae0e30091e10315aaba6f00945f031bebL4;FB9ea9a28c9c835fa4aad583e90000baf52c8912bf6024cb6d8e4645aa04a478a45732a17fe142e672185dd2a9fd84b312de084da", - "140c5774f26232f0583d81434L8;FFe8ab03f9e80100d008a12891fa0310aaf4030eaae9a703f9e9af03f9e8b303f932c8ff97f19f55a9e1031baaedc340f9e21740f9ee0314aaeb2b40f9e61f40f9BL8;FFf52340f9fd7b43a9ff830191c0035fd6f503012a74040051e00313aad7070094e80300aae003", - "01aa28fc073708fc60d3c80100b5080840921f1900f102020054L8;FF00013fd6e03b02f9e8031691e13f02f9290c40f9e103129120013fd6fbc342f97f0f00b1a106005488008052f43f42f9e8a3113929008092f53b42f9690200f9BBBBL4;FF28008052e90300f029d52691680a00b928038052692201", - "a908008092680200f9f44f46a9f52b40f9fd7b44a9ffc30191c0035fd6e83b40b9f55342a9e00b40f9L4;FB696e76616c6964206d657373616765204956696e76616c6964206d657373616765204d4143206b6579696e76616c6964206d6573736167652063697068657220L8;FFe00700f90800f0f20809", - "00d163ffff17e90b41b2e92300a968ffff17c80080d20800f0f2080500d15cffff17c80080d2e10700f90800f0f2080900d107000014BL8;FF8b6d1c320a0500390b010039a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091150840f9080040", - "f9L8;FF1dfbff17e8031faa000119ab224e0054e1431691790c0094f90b40f91f0700b1c00e0054e1d342f9e8cb42f91f0101eb402a0054e8cf42f92a040091c0220291BBBL4;FF890a00b4e85300a9e80300916903009029110f91ea430091e82701a9e8230091e82702a928008052690300d029b11491e", - "82706a9680300b008e50a91e82b08a9L4;FFfd7bc6a8c0035fd6f60315aa08008092680200f996feffb4e00314aae10316aa22008052ff074091ff830091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L8;FF087b68782821084a095d1053095b69782001084afa0f40f9e80740f95f0308ebe1fbff5", - "4fb03002ae02300916cf8ff97e0031b2adaffff17e80100d008010191BL8;FFe12f833dc82c0036e8830291e02bc33de12fc33d13210891e0a350a9600600ade17740f9e20313aa23008052081940f900013fd6e06b01f9e8c31791e16f01f9L8;FFe000009000200791d12f009420008052e1031aaac42f", - "009420008052e10318aac12f0094e16b40f920008052be2f009400018052e10315aabb2f009420008052BBBBBBL4;FFf30b40f9fd7bc2a8ba170214f30b40f9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091010040f968028052290041d23f8d00f12831889a1f6d00f148040054L4;FF22008052ff0b", - "4091ffc32791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8b3170014e86f42f9fb031aaafa0315aaf50308aae0074091e1031aaaL8;FFd4040037890240b274d600a9680200d008811f91690e00f9680200f9f44f42a9f65741a9fd7bc3a8c0035fd6ad1701940003805201018052ab17019", - "4000400b4BBL4;FFe8d300f9a8d370a9e0070cadc082c93cc182ca3ce9bb00f91f0900b1e0870aadc082c53cc182c63ce08708adc082c73cc182c43ce08b09adc082c33ce08707adL4;ZBL8;FF602640f922008052ba970094750240f928008092681600f9bf0600b18002005474da40a9960100b4972200", - "9104000014d60600f1f7620091e0000054e1825ff8BBBL4;FFddd70194fd7bbea9f44f01a9fd030091017c40f9f30300aa3f0400f18b000054608240f922008052b2d70194619640f914008092747e00f93f0400f18b000054L4;FB3a20c0000f53657269616c697a6174696f6e3a20c0000a4b6579206a7", - "56d703a20c003202d20c0000d4b6579207472696d6d65643a20c000174b657920616c72L8;FFe86304f9e85f40f9e86704f9e8e340f9e86b04f9e85b40f9e86f04f9e83f40f9e87704f9e8f340f9e87b04f9e83340f9e87f04f9e8f740f9e88304f9e82f40f9BL8;FFb50600f1d6620091000b0054c1825f", - "f881ffffb4c00240f922008052b5570194f8ffff17e17749f93f0800b1e0adff543f0400b1a0adff54810000b4e07b49f9L8;FFe85306f9da4cff97e10300aae15306f9e0833291210100902120379102028052230100b063940491a4028052fe000014e05306f9e08332912101009021203791BBBBL4;FF", - "f76b00f9f6570ea9f44f0fa9fd03039109704039f30300aaf40308aaa90100343f0d00712109005460a240a9090d40f9e823009120013fd6e80740f91f0900b1L4;FB6d697373696e672073656e64657220636861696e00000000000000000000000008000000000000000800000000000000687e4200000", - "000000000000000000000L8;FF750240f9a80640f9160100eb62020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e0030091cdecff97f44f47a9BL8;FF6182863ce10347ad681e0339c87e045369f20bf8e91f40b96282853c6082843c6182833c600608a9", - "7c6609a96a261d2968c20339da0500b531000014e08744adL8;FFe8036179e1833791023f8052e057813de15b813de8e30a79be770094380080527400805215008092e8d342f9e067c13de94306912081009102708052e8a302f9BBBL4;FF49058052ea1f00f90969343825a3ff97f41f40f9fc1740f9880", - "314cb7f0308eb880e00543b0200b4f51b40f9e10b40f9e2031baaa002148bb6b7019494021b8bL4;ZDL8;FF02328052c3b70094e1630691e00313aa02398052bfb70094ff830d91fc4f41a9fd7bc2a8c0035fd6ff8300d1fd7b01a9fd43009129e040f9e20300f93f0500b1BL8;FF00602991be370194a00", - "200b000c00991bb370194a002009000403b91e1031faac0035fd6c0035fd6e30302aae20301aaa10200b021602791cb370114fd7bbaa9L8;FF4ac141391f0500b1e96b0aa909018052686100d1eabb00b9e9eb01f9eb2308a9ffef01f920380054698640f9684242b9e87f00b9e96b00f9a90a00b4758240", - "f9BBBBBL4;FF8b0100b46b01c0da6b11c0dacb0d4b8b6b010a8ae2e7076f218c222e21a8302e2d00261e0d0c00372d00805202000014ed031faa8c21009180010e8bdbffff17L4;FF6002148be20315aac2070094e80316aa8902158be90f00f9e083c03ce90f40f90001803d090900f9f44f45a9f65744a", - "9f85f43a9fd7b42a9ff830191c0035fd6L8;FF21ffff54e0030091ff070194f44f43a9f51340f9fd7b41a9ff030191c0035fd608a440a9e20301aae00308aae10309aafb070114ffc300d1fd7b02a9fd830091BL8;FF607240f922008052ba87019460020391c66eff97685645a909008092694a00f97f2e", - "00f9350300b414c1009106000014e00314aabd6eff97b50600f194a20191L8;FFf30300aa6101009021081d91e8030091e00309aa42018052028800946101009021101591640100f084c03491e0030091a363009142008052b30f00f9fa870094BBBL4;FFe00317aae10316aa22008052b9c70194c5ffff1", - "7e05f06a9fa0301aaee4f00b9ed2b00f9ec2703a9f51700f9750080520b000014ee4f00b9ed2b00f9ec2703a9L4;FB7365206b657920c0012900c0000a64656372797074656420c00e206d6573736167652066726f6d20c02720776974682050524556494f55532073657373696f6eL8;FF217b00b4e0474", - "0f922008052b9c70094fb031faaf0ffff17e8b743f929d34b78eb031c912093ce3ce133c23df80316aae86b00f9e8ff5e39e6030991e237c23dBL8;FF811140516b00f8376b008052430000143f004871030b00544b0dc0396c1d00122c540c0b810148516b00f8378b0080523a0000142b7c1c534b0a003", - "44d11c039L8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8bBBBBL4;FFf80301aab7e701940004805221008052b5e70194c02300b4e00745adf60300aa1f0317eb000400ad822500540", - "80d80521353089b94070011612640f93f0400f1L4;FB00000000000000001000000000000000100000000000000036c848000000000009aa480000000000000000000000000000000000000000000000000000000000L8;FFa01900b5a0c303d1a4e6ff97e80301aac000003688f9ffb4cd000014e1031fa", - "ae88701b9c9ffff17e1031faae88b01b9c6ffff17a083db3ca183dc3ca283de3cBL8;FFfd7bc3a8c0035fd6ea1741b2092100390a0100f9f44f42a9f50b40f9fd7bc3a8c0035fd6290480d20900f0f2090500a9f44f42a9f50b40f9fd7bc3a8c0035fd6L8;FF611240f9810000b4600e40f922008052b867", - "0094b40000b4600640f9e10314aa22008052b3670094602e40f9a00000b4613240f9610000b422008052ad670094BBBL4;FFe8040035e90f41b22e000014e89340b8e90f40b9eba34039ea2341b8ec234079680a00b9e82f407969b200b8e91340f9a83b0079a9031ff8e90f40f968520178L4;FFacffff9", - "7e10300aaf303134b00008092330000b9f8ffff17fd7bbda9fd030091f35301a9610000b4027cc19b220400b5337c009be00313aa31000094f40300aaL8;FF08e140391f050071a10500548f00009409fc78d30a7c1853a80100d008e13b910bfc60d3097969780a596a786921094a0a200a4a2b5d10534c", - "5d10530b596b78BL8;FF4900805209010039fd7b43a9f32340f9ff430191c0035fd6e043c13c2800805268020039e003803d6012803cfd7b43a9f32340f9ff430191c0035fd6ff0301d1L8;FFf50300aab7270094e00313aa2100805236008052b4270094c0feffb40801805208000039f40000b4f60300a", - "a00040091e10315aae20314aab6270094e00316aaBBBBBBBL4;FF821700940800148a206b68fc00a8200e0a00669e0a0300b44901c0da2911c0da080d498b0801148a296be8386903f836092100d10afc79d3eb0336aa2901148aL4;FFf6570ba9f44f0ca9fd83029109604039a9050037150440a9f30300", - "aae0230091f40308aac3120094600a40f9e8030191535cfe97f62340f9e083c43ce82f40f9L8;FFe1000037e00314aae30313aaf44f42a9f65741a9fd7bc3a830feff1735f87f92480015cb160113ab62010054e00315aae10302aae20313aab01b0194965600a9BBL4;FFea424039e93a0039e946403908", - "01154ae83e0039e84a40394a01014a2901024aea420039ea4e4039e9460039e95240390801034ae84a0039e85640394a01044aL4;ZFL8;FFae0140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191ad194e8bbf010ceb830500546b0500f1ec030daa81feff54a90109abe300005423000014e8031faa", - "BBBL4;FFe2930eade21bc83de423c83de10f883de38b0bade21fc83de2930cad46c1ff9761ba40f9e8430591a08303d1d9db0194a80303d1e0430591d7db0194e10348adL4;FB6f7570456e6447726f75706578706563746564726571756972656454686972747954776f4269744465636f64654572726f7", - "2000000000000ec53440000000000L8;FFf86305f9f60306aaf8030caaf5ef00f9e9a703f9e9af03f9e8b303f9e46700f9feaf02a9fa8700f9e76f04a9fb030eaaf03b00f9f21f00f9ed0700f92bd4ff97BL8;FFe8a302f9e843169101610091e04f813dc05b0194e063c13de8a342f9e907409129c13591", - "f73340f9e157c13de0f3863de05bc13dea670291e8d700f928e341f8L8;FFbc5b009408090014f7c31791e82746b9f50346b9e042c13ce142c23ce0a30c91fcff42f961e2009102278052e01b813de11f813de88304b9b65b0094f66f41f9BBBBL4;FFf44f4da9f6574ca9f85f4ba9fa674aa9fc6f49a9fd", - "7b48a9e923476dff830391c0035fd6000400d000401691c8fb0194ff4306d1e923126dfd7b13a9fc6f14a9L4;FB62353537662f70726f73742d302e31342e342f7372632f656e636f64696e672e727300c0002f636172676f2d72656769737472792f696e6465782e6372617465L8;FFe20313aa75060094", - "f50300aa0d0200143f0900b1a0200054880080d20800f0f2080500913f0108eb0120005481220091e20313aad3090094f50300aa01020014BL8;FF0a7c0194f44f43a9f51340f9fd7b41a9ff030191c0035fd6fd7bbca9f85f01a9f65702a9f44f03a9fd030091160440f9d30600b102050054b300f8b6f8", - "031faaL8;FF9b91ff97e11740f9e00313aab7fbff17e06300912200805223008052240080529391ff97e11740f9c4fbff17e0630091e10317aae20315aa2300805224008052BBBL4;FF9f0208eb235f0054b5035bf8e00315aa8ab000948c0200eb03540054a8fe60d3a80100b4480080d20800f0f209008", - "092692200a9f44f5ea9f6575da9f85f5ca9L4;ZBL8;FFe8630891e023029151340094e80f41f91f0500b140080054e0431291e1030091e3630891e20315aa19fcff97e84b42f9e9670e9120f1cf3ce95742f91f0500b1BL8;FF090140b22911c0da291540d2290d098b2925019129fd46d30801098b13050", - "0917f0209eb890f0054088c5df81f0500b1c00c00547e020094080040b20811c0daL8;FF703202f9694a02f96c4e02f96e5202f9775602f9f15300f97fca13393f00001448431c2afa0316aaf65f40f9ea6b40f9eb5740f9f9430891088308aafc432a91BBBBBL4;FFc0035fd6f50300aae00313aa220080", - "52230080522400805225feff97610a40f9e00315aa53feff17e00313aa2200805223008052240080521dfeff97610a40f9L4;FF22008052bb0b009428008092680200f9afffff17800000f000203891b80b009420008052e10319aaca0b009420008052e1031caabc0b0094ffc303d1fd7b0ba9L8;FF1f2d", - "00f142000054c0035fd661020054810100b4fd7bbea9f30b00f9fd030091080440f9f30300aa22008052e00308aab00b0194e00313aaf30b40f9fd7bc2a8BL8;FFe00702a9ff7f04a9a80f00f9010800b4e20301aa16210091f5c30091f783009109000014a1620091a2630091d774ff97601800b5b70f40", - "f9f60317aac28e40f8L8;FF0009805241008052b78b0094005d00b4a00641adca0600d1e94b41f9a82240f9000401ada10240ad5f0109eb082000f9010000ad01fdff54f30300aae0430a91BBBL4;FFba035df8480317cb1f0308eb681a0054180100b4a8835df8e1031caae20318aa0001178bbbcb0194f", - "702188bb7031ef85f0317eba01b0054a8835df8ea060091L4;FB00000000000000000800000000000000080000000000000088f94500000000008b1a4900000000004e00000000000000f9040000190000008b1a490000000000L8;FFe87340f9fcc301f9f79b03b9f7831d91e8d301f935200094e5b343f", - "9bf0400b120bc0054e9831d916013c83ce8e200912181cf3c2281ce3c2381cc3ce0d7803dBL8;FFbc4b0194611a40f9810000b4601640f922008052b74b0194614640f9e10400b408108052606a68f822008052f44f41a9fd7bc2a8af4b0114611640f9810000b4L8;FFc2030054280108ab420400540914", - "40f9090300b40a1040f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191BBBBL4;FFf83f0439c3eb019442000014410341ad28008052420f40ad60020291e143029122008052fc03162ae0238c3c54fb019176fb01d1e1238b3ce3238a3ce223893cL4;", - "FB0800000000000000304b420000000000000000000000000008000000000000000800000000000000304b42000000000000000000000000000800000000000000L8;FFe00313aa22008052230080522400805297010094610a40f9b5ffff17e00313aae10316aae20314aa23008052240080528f0100947", - "60a40f9680240f9080116cbBL8;FFfb074239e86300b9e8634239e93306b8e92348b8ea2700f9ea0f4179e8430139e95b00b9eabb00791e7fff97000600b4e86340b9e9bb4079e00fc03d786600a9L8;FF06000014e00313aaeb070094e80300aae00301aaa8fe0737680240f9090540f91f0009eb290600", - "54e80f41b2e80300f9e0030091ce60ff97f44f45a9f52340f9BBBL4;FFfd7b59a9ffc30791c0035fd6600300f000400b91630300d063401e91640300f084e00b91a24700d1c1048052c1ab0194ff0302d1fd7b04a9f72b00f9f65706a9L4;FF1004a0726b010aaa0c380e530a128e9a0ed074d31f004ef24", - "f010baae903891aaa018d9a6b018f9acd01096a6e0168b26f0569b270096ab2ce118b9abf010072L8;FFe00315aa21008052b7ab0094200600b4f58303a9750740f9e1031faaff2700f9e81f40f9bb264078080101cb1f0500f1090100546807c05a0868217821080091BL8;FFe8031691f56704f9f76b04", - "f9428309ade90300f9475fff97e8c342f9200bc03dfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1c082873ce9a304f980150054L8;FF090180d20900f0f23a017fb2e91f4092fb0309aaa1035df8615800b5c60200141f09007101050054090180d208df78920900f0f23a0140b2091f40921b0109aaB", - "BBBBBL4;FF2300805224008052f4030baa28060094e10340a9eb0314aa2ca040a9290040f90afc78d39369283808050091280800f96af3ffb4d4ffff17e10300a9e00301aaL4;FF3a1400b4b7130094e0031aaa21008052b5130094f8db40f9c0dd00b4e1d340f9e2031aaaf60300aaba130094280080529", - "7000014ab130094c002805221008052L8;FFa91b00b9aab301b8a81b40b9e007803de81302b8ea2700b9dbfdff97fd7b43a9f32340f9ff430191c0035fd6e003c03d08008012680200b96042803cfd7b43a9BBL4;FFe083c53ce83740f9e30340f9e007803de81300f9e80b40f9bac301d11f0500b1a3f3f", - "fb5e0060054e81340f9e92300912a0300b04ac10d91200300d0001c2f91L4;ZDL8;FFf44f42a9f50b40f9fd7bc3a8c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aa610100f021ac1b91e8230091e00309aaa2008052f9930094BBBL4;FF6a3500f94ac301915f0118eb4a830391608", - "1853c6281843c6181833cc1f9ff543bffff17e003009167090094e82741a9f70340a9e3ffff17890080d2e0a30039L4;FB3f8dc4ce7f41060177d62f226b023393c80edefa5788cdc1dab2eacc85377a8be8b5beb2cebd33236d7fcfe1221e893d1ef33c3308ae05b60000e32f536492baL8;FFed6b40f9e", - "13b00f9e10308aaeea713a9e99b40f9ea9300f9eabb40f9e87740f9e9a700f9e9eb40f9e03340f9ed2b1fa9eab740f9e99b00f9e9cb40f9fbef00f9BL8;FFc02202914901805209692138ead302f9d6140094e1431691690c0094e0b349f9800100b4e1d342f9e8cb42f91f0101eb20390054e8cf42f9090", - "180522a040091L8;FF76000014e89340f9e82000b40805088be00313aa0201805201f17dd3f9f7ff17f96f41f9eac31791f5e3573940c1c03cf7ef573941c1c13ce91f46b9280340f9BBBBL4;FF22008052e00308aabaf30194e00317aaf71740f9bedbff970800809223000014f70345a9ff0a00b140fff", - "f54e9234d29ea3340f9ff0600b1bc831cf8e0020054L4;FB7265646465766963655f69642069732072657175697265649a9648000000000033000000000000005c000000050000009a964800000000003300000000000000L8;FFe1031faadcffff17e1031faa881a00f9d9ffff17a10a0054e0031faab0f", - "fff1721050054e0031faa9effff17c80080d2e10700f90800f0f2080900d10f000014BL8;FF0001178b08108052e21640d2a0873aadf81640d2a303973c08140038b37301941f1f00f1a8010054a0877aada10301d1e00314aa22008052a0073eada08b7badL8;FFf8ffff1760020291b10b0094e8074091", - "0881099100010491740b0094f4cf49f99f0600b100b0ff54f5d749f9f3d349f9b50b00b47622009104000014b50600f1BBBL4;FF1d000014680b0091b40313f805000014e80b41b2a00313f802000014680f0091a06303d1a88312f8d1a80094f40300aaa1035bf8b5db7ca93f0400f18b000054L4;ZBL8;", - "FF840000145f01007109fa805237018a1a0901172be21a00549f02096b49000054df3200f91f05003160180054f82300910b0000140043c03c2901088b2001803dBL8;FF0809009101010014c80080d2f55706f90800f0f2080900d107000014e05706f9e80b41b204000014c80080d20800f0f2080500d1", - "e0833291e85306f9cc280094L8;FFc80080d20800f0f2e84b05f9d828ff9770000014e04b05f9e0432a91e10000b021e0029102028052e30000b063c0099184018052e3000014e04b05f9e0432a91BBBBBL4;FF48fc089b290140f9200540a94801088b024106d165feff17080c8052090040f92a0040f94", - "8fc089b290140f9200540a94801088b028101d1bbfeff17080040f9L4;FF800700540b1140396bc100517f250071a8570054292d0c1b5f1500f1f6030daae1030eaaef0310aa400600540b1540396bc100517f25007168560054292d0c1bL8;FFf30300aa810000b4600640f922008052b8030194610e40f", - "9810000b4601240f922008052b3030194611a40f9c10000b4601e40f922008052f30b40f9fd7bc2a8BL8;FF020300f042380191e82700a9e8030091090000b029e11991200440a9e82701a9e8230091e82702a9e3430091ce830194fd7b43a9ff030191c0035fd608200091L8;FF82008052b30f00f90784", - "009407840094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa410100f021441e91BBBL4;FFa3ffff17e003163948008052c90a0091e0e31591e8071639e9bf02f9d4b800940b000014e80741b298ffff17a1035ef8e10000b4a8835ef8f40300aa2200", - "8052L4;FB4d6573736167654c656e6774684576656e4d6573736167654c656e677468546f6f4c6f6e6753657269616c697a6174696f6e496e76616c696400000000000000L8;FF22008052bbc30094e1ab42f9610e00b4e0af42f922008052b6c300946f00001428008052e86700f9fcfb41f9f4f741f97c", - "0100b4abc30094e0031caa21008052BL8;FFe00313aa22008052c2020094610a40f9a1ffff17e00313aa22008052bd020094610a40f9bdffff17e00313aae10318aae20316aab7020094780a40f9680240f9L8;FFe11b40f9e21340f9e843069163a303916423039185830091e00316aa060480524098fe9", - "7facb40f9e86346395f0b00b161100054f7430f9108150036c08641a9BBBBL4;FFe043059181008052dfe3019400ee0035e85341b9e8d700b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd6L4;FB2076616c69643b206d75737420686176652072656", - "d6f7465206964656e74697479206b657900000073e84800000000003800000000000000490000000a000000L8;FF00010291a7ddff97ff074091ff830c91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6f9c30d39390200343f070071e0010054e8c30d91BL8;FFf40301aaf50300", - "aab66301940004805201018052b4630194400100b4155000a9e10200d021803a91130800f91f600039f44f42a9f50b40f9fd7bc3a8c0035fd6L8;FF6bf1df388b0cf8374b05c0396c1d00128c6119538c01210b810102516b00f8374b0080524c0000143f104071c30b00544b09c0396c1d00122c380c0b8", - "1114051BBBL4;FF61040054f2180094f96344a93f0700b1601a0054e08745a9e083c73cf6df46a9e183c83cfaef49a9e00701ad610000b422008052afa30194b90000b4e00318aaL4;FFe10a0054ff000071421046fa430b00547b7f349b9f1e0071830400d1fa0180925a031bcba1000052e0c79f1a7b43", - "00915a03038a1f00016a5a031b8b610d0054L8;FFe80700f9fda30094fd7b41a9ff830091c0035fd6810100f021fc159182008052f2a30014080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9BL8;FF1f0109eb0881899a090180521f2100f11481899ae30314aa77010094e80740f91", - "f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6BL4;FF8006803de017c03de11bc03de21fc03de313c03d8312803d821e803d811a803d8016803de82700a9480dc0da690dc0dae82701a9880dc0daa90dc0dae82702a9L3;ZBBBBBBBBBL4;FFe00314aaf44f4aa9f65749a9f", - "85f48a9fa6747a9fc6f46a9fd7b45a9ffc30291c0035fd6e92341a9ea0740f9480108cb395100a9280900f936feffb408328052L4;FFe003c03d28008052955e01a9986600a9800a803d68420039f44f49a9fb2b40f9f65748a9f85f47a9fa6746a9fd7b44a9ff830291c0035fd6f9ef41a9e00fc03dL8;F", - "F0811c0da280108cbe90080521f1d00f10831899a29008052360908aa11000014b01d01940005805201018052ae1d0194800200b4c81242d3f60300aa185400a9BBL4;FFb5164092e20000b4e83340f9e0020191e10314aa0801028be83300f9e89d0194e00300918102188be20315aaf5ff0039b89d0194", - "e00743adf4430291e223c03dL4;FFa100060b80fc5f88bf00006b41ffff5481fc008880ffff35e1ffff17e30300aa000040b94000f837c0035fd60400b01261fc5f882000040b60fc0288a2ffff35L8;FF290100b43f0500f1e1020054a80100b008210c91e00301aae10308aa82028052f29d0014ffc300", - "d1fd7b02a9fd830091200440a90900009029c13291e80700f9BBBL4;FFad000054390300eb432e00541803008b060000141f0400b1c12d0054d8dd01941f100031412d005439feffb505000014e043059181008052d3dd0194802c0035L4;FB1800000000000000890949000000000049000000000000009", - "b0000001e000000890949000000000049000000000000009c000000200000008909490000000000L8;FF07a44fa9e8eb00f9e8979f1aeb2702a90ba450a908219f5a081d0072e9af04a90fa451a9e93b00f90ba452a9eb4300f9e92300f90ba454a9e97b00f909b440f9BL8;FFe8074091f6a745f9002300", - "9108810991f40740919482099101a00094e1074091e0431691023f805221800991b95d019488e2079178008052b4008052000540adL8;FFe10316aae20315aad1000094760a40f9680240f9080116cbbf0208ebe9f8ff54e00313aae10316aae20315aac8000094760a40f9c1ffff17fd7bbca9f70b00f9B", - "BBBL4;FFa90600910815158b000500ad2800809229831ff8e9018052882600a9680080528882003928008052802601a968620039f44f46a9f91b40f9f65745a9f85f44a9L4;ZFL8;FFa6fcff97e80301aaa0050036e80900b5e1031faadaffff17e20313aa230c805248f6ff97e10300aaa0faffb4caffff", - "17e00900b5e00313aa98fcff97e80301aaBL8;FF030300d063902991a92300d126030090c6a02e912a018052070300d0e7142f9105200091e00308aac202805284008052e9af00a9ea0300f9f47d0194fd7b42a9L8;FF09692138e1630091357dff97e00314aa088c4bf81f0500b160000054e16300911b9", - "0ff97964e40f9560300b4e11740f9e80f40f9974a40f91f0101eb00430054BBBL4;FFe8ab03a9280080d2f60300aa6850c0f2a02700d1f70301aae1630091e9ff02a9e9a305a9bfbd0194e8534039e10317aae00316aa1f090071820400545a0080d2L4;FBa00100000500000018f6470000000000280000", - "000000000008000000000000008c66480000000000dc66480000000000acf64700000000005000000000000000L8;FFe00313aa02428052c2bd0094ff830e91fc4f41a9fd7bc2a8c0035fd6fd7bbea9fc4f01a9fd030091ff430ed100844eade9a70991f30308aa08f840f9e10300aaBL8;FFe9031faa0a2", - "440f9aaf9ffb50a3040f9e903098b8afaffb5daffff17a00200f000602591b63d0194a00200f000c00991b33d0194fd7bbfa9fd030091081840f9L8;FF0101009021a003910301009063880491e0230091a2008052840180521632ff97e00740f941feff17c80080d20800f0f20809009147ffff17ff0301", - "d1fd7b02a9BBBBBL4;FF2b000094770a40f96afeff17e00313aa22008052230080522400805224000094610a40f971feff17e00313aa2200805223008052240080521d000094610a40f9L4;FF22008052bb0d0094e15341f90130ffb4e05741f97cf9ff17e90b4091ea074091e007409129c10e914a411d9", - "100401d912081c03c2181c13ce9ef51f9e8ab0bf9L8;FFe9b301b8ea7f0039eb1300f9e82b00b9f60d0194fd7b44a9f32b40f9ff830191c0035fd6ff8301d1fd7b05a9fd430191080040b91f0d0071ed0100541f150071BL8;FFc0035fd6210300d021702991e00308aa82008052fd7b41a9ff830091f38d", - "0114ff8300d1fd7b01a9fd430091090040f9e80301aa2a4540b85f01007129119f9aL8;FF3f010aeb29030054280108ab8300005410000014e80308abc2010054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091BBBL4;FFe0e30091e10318aae20316aa2300805", - "22400805226c0ff97f82740f9fdfeff17e9e340a9e82740f9e083c33ce81b00f9280d00f928008092f50318aae00b803dL4;FB700200004500000073686f756c642062652065786163746c79203332206279746573000000000000de194900000000005700000000000000dc02000012000000L8;FF22008", - "052f6030caabacd0094ec0316aab50000b4e0030caae10315aa22008052b4cd00945a008052b9040014e0031baa088c40f809204039155048a9164840f9BL8;FF01048052e002803de9cf40f9ea9741b980c38d3c800fc03d821f803d4047803d801fc03df81f00b98043813c00e4006fa80319b889430df", - "8aa0312b8a8c313b8L8;FFb84d0094e00316aa21008052b64d0094000c00b4e10314aae20316aaf70300aabc4d0094591740f9b7831ff8190400b4541340f9ab4d0094e00319aa21008052BBBBL4;FFa082009160c60094f50f40f9f5feffb7f80b40f9950900b4b2ed0194e00315aa2100805239008052a", - "fed019400feffb4e10318aae20315aaf60300aab5ed0194L4;FB4b000000000000003901000024000000a1a14800000000004b000000000000002f0100001f000000000000000000000008000000000000000800000000000000L8;FFe003088be10313aa35edff9775fdff34610a40f9680240f91f0101e", - "ba0020054680640f9090180522a040091e003152a6a0a00f909692138e10313aa28edff97BL8;FFa203df3c7f0319eb08011a8b000502ada0877cad0219803d000500ada08b7dade93b40f9000901ad28050091e83b00f9a00600541f0314eb390700915ac30191L8;FF3ffeff17e043169122008052d010", - "0094e1d342f948feff17e0431691e1031aaae20318aaca100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691BBBL4;FFe90340b908048052964e01b9885603a93f050071882200f941010054e803009100017eb219850094f50301aa6107f8b6f7031faae00317aae10315aabaad0194L4;F", - "F000440f93d060014c0035fd6fd7bbda9f65701a9f44f02a9fd030091150840f9080040f9f40302aaf30300aa080115cb5f0008eba8010054b40000b4680640f9L8;FFff3701f9f53301f9ff3b01f9f53f01f9ff4f01f9f54b01f9ff5301f9f55701f9ff6701f9f56301f9ff6b01f9f56f01f9ff7f01f9f5", - "7b01f9ff8301f9f58701f9BL8;FFf68740f91f0700b1e014005420afc03de82344f9f4630191e9c7009180c20391e1e31b9120f18f3c8942039102278052f86f11a9f55f12a9e92b00f9e8a300f9L8;FF94021891290c40f9e163179120013fd6f6034bf9df0e00b18104005488008052a2ffff17f46b40f", - "9e807409108011891e00314aa8a2d009488624039fb034bf9BBBBBBL4;FFff430191c0035fd6530040f9680640f9a80100b4690240f9200180398001f8b729050091080500d1692200a9200000b9e0031faaf44f44a9fd7b43a9ff430191L4;FF9c080014010700d1e8431391e0060091ad9bfe97e96b42f", - "9e03bc13de13fc13dea8342f9e86f42f93f0500b1e00715adea6301f9202800544083cb3c4183cc3cL8;FFfd7b42a9ff430191c0035fd6e08740a9830600f1c9424039c9010054a80240391fed017161010054a86a63381ff5017101010054ea031f2a3f0d007168008052BBL4;FF89264039ea674039e86", - "300394801094a892a4039ea6b4039e86700394801094a892e4039ea6f4039e86b00394801094a89324039ea734039e86f00394801094aL4;ZBL8;FFe00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb890f0054088c5df81f0500b1c00c0054220500940", - "80040b2BBBL4;FFc7020014a2a302d1e003082a430c8052c9bbff97603600b5bc8355f8820740f95f0015eb891b0054810340f9200080398000f8b728040091490400d111000014L4;FB7f520e518c68059babd9831f19cde05b5369676e616c5f5051434b415f56315f4d4c4b454d3736383a656b686561", - "646572000000000000009120490000000000L8;FFe8b743f9e82b17a9e8bb43f9eac343f9e9231fa9e8c743f9e9bf43f9e8cf00f9e8cf43f9e8c300f9e8d343f9e8ab00f9e8d743f9e92312a9e8db43f9e9df43f9BL8;FFead302f96e0e00949f0600b160a1ff54c0220291e14316919411009407fdff178", - "0c20291c11d0094080040b20811c0da081540d2080d088b0825019108fd46d3L8;FFe06302f91c490091280280520000803dfc5b02f9e85f02f9e86702f9e94313396501001428008052e80f00f9e82b41f9e80700f9e83341f9f93f00b91f0500b1BBBBL4;FF80fcff5475da42a9e08740adc80240f9a08", - "73eade00fc03da0039f3c680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aaaef50194a0877eadL4;FB796265725072654b65797075626c696370726976617465556e6964656e74696669656453656e6465724d657373616765656e637279707465645f6d6573736167L8;FFf40301aaa", - "5f4ff9720020037750240f9a80640f9160101eba2020054e80f41b207000014890080d248008052e02300390900f0f2e827003928017fb2e0030091BL8;FF09760194686200910103009021282391040300f084c01791a3630091e2008052a80f00f900760194684201910103009021a02891040300f0844", - "01891a3630091L8;FF80100054e0431691e1031faa22008052cf180094e8d342f9e0cf42f9490180520968283808050091fa3b49f9e8d302f9fafcffb5e8031faaf98792b939010034BBBL4;FF08050091683300f9edb50194f80340f9ffff0139f9031caa22ff46d3e20000b4683340f960030191e10318", - "aa0801028b683300f9e2b5019428e37a9222174092L4;ZDL8;FF53000014e90300f9180100b4e00315aae10318aa22008052f5030caab5b50094ab835ff8ec0315aa1b0100b4e0031caae1031baa22008052f5030caaadb50094BL8;FFe1833291022b8052c235019440030291e1c317913072ff973c0080", - "92ab050014c80080d2a10200b0217805910800f0f2e0031791e3833291e4c31791e2008052L8;FFa88317f8ca1000b5e0831f91a162009102288052bf350094e0831a91e1831f9102288052bb350094e0831591e1831a9102288052b7350094fc031faaf7031faaBBBBBL4;FF53000014e91b40f98162009", - "1a2630091e003082a3f0900b129119fdae91b00f999f2ff97c0f8ffb440000014a2630091e003082a830c8052bfebff9700f8ffb4L4;FFe20317aa0001198bc20500942803178be80f00f9560300b4e10f40f9e80740f9b71240f91f0101eba00d0054e80b40f9490380522a040091e00316aaea0f00f9L8", - ";FF090d48f83f0500b1a0000054f30300aae00308aaae000094e00313aa145c40f99f0600b1c0f4ff5413544ca9950100b47622009104000014b50600f1d6620091BL8;FF60825df822008052ba85019461825ef8810000b460025ff822008052b5850194610240f9810000b4600640f922008052b085019", - "4610e40f9a1fdffb4601240f9L8;FFab000054e09740f901f97fd342008052b8850094e89f40f91f0500f1ab000054e0a340f901f97fd342008052b1850094e8ab40f91f0500f1ab000054e0af40f9BBBL4;FF2a040091e00313aaaa031ff809692138a18300d123b1ff97b6035ff8a8035ef8080116cb7f", - "0208eb48110054a8835ef8e10b40f9e20313aa0001168bb5c50194L4;FB3c0000000d0000007375636365737366756c206465637279707420616c776179732068617320612076616c69642062617365206b657900008b63490000000000L8;FF810000b4e0031caa22008052b9c50094e16f40f9f44f40f9", - "810000b4e04740f922008052b3c50094b40000b4e04b40f9e10314aa22008052aec50094e14340f9BL8;FF200840921f1800f102110054217c0353211300343f0800718d0100543f0c0071600200543f100071c00200543f14007141040054c1220191e20313aaf1fcff97L8;FFffa700a929008052eaff0", - "1a9e9230a29c4450094fd7b47a9ff030291c0035fd6ff8301d1fd7b03a9f52300f9f44f05a9fdc3009143010034081c0012f30302aaBBBBL4;FF08e379d3f90303aa221116cbf60300aa131118cb2000138bb8e50194c80218cb160e8052e00314aa0151169be20313aab2e50194e152169ba8e279d32053", - "169bL4;FB6c665f73657373696f6e3a20c000124661696c656420746f206465637279707420c01b206d65737361676520776974682072617463686574206b65793a20c00eL8;FF750a00f998faffb4680240f9f9621932bf0208eb61000054e00313aa07e50094680640f997fe78d319693538d51e009175", - "0a00f937fbffb4680240f918631932BL8;FFff3300f9c1420091a20301d1e003082ade4eff97a0f6ffb468000014a00301d139660094e80300aae00301aa68f907361500001401008092280400d129008052L8;FF810000b4601640f922008052b965009460020191f30b40f9fd7bc2a871feff17610640f", - "9810000b4600a40f922008052b0650094611240f9810000b4601640f9BBBL4;FFe00316aaea0f00f909692138e12300912491ff97f80f40f9e80740f9080118cbdf0208ebc8070054e80b40f9e10317aae20316aa0001188bb6a501940803168bL4;FF1f00066b60020054e00c4039a200040b1f1c007260", - "0100546072009103fc5f889f00036b2101005402fc038883ffff35f35341a9f51340f9fd7bc3a8c0035fd6L8;FF26000014e80308ab82040054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab22030054091440f9090100b4BL8;FF69164039f503002", - "a1f01096be0179f1ad2250194881a4039691a4039b502000a1f01096be0179f1acc250194881e4039691e4039aa02000ad6020a0a1f01096bL8;FFff2701f9ff2301f9e10301ade00710ad000941adc81f8052e803063908008092e20300ade00b11ade00742ad281300f8289300f8281301f8e8cf00f9e0", - "070dadBBBBBBBL4;FFc10240f9200080398000f8b728040091490400d1110000145f2800f1880000542800028b08f1df388803f837e003009184820094e80340b9a8070037e80b40f9L4;FFbc190094e15740f9810000b4e00315aa22008052b7190094e0a30291e103192a83110094f50f4ba9a08301d10", - "1a30091e20315aa320f0094b6035af8df0a00b1L8;FFf91300f9f85f03a9f65704a9f44f05a9fd430091160840f9760200b4335040a9380200f018331091170440f9b9730091750200f0b5e21891e8164038e3030091BBL4;FFfd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff830", - "ad1f30308aae8630491f40301aaf50300aafb6304911b070094e81b41b91f050071L4;ZFL8;FF2901084aabe31538ab135638a9f31538a92356384a01084a6b01084aaa031638aa3356382901084aab131638ab435638a9231638a95356384a01084a6b01084aBBBL4;FFf34340f9ff430291c0035fd61f0", - "9007181010054aa035ef8090180d20900f0f248dd7892290140b20a000014aa935d38090180d2e8031faa0900f0f205000014L4;FB6972656374696f6e20c0002173707172206e65676f74696174696e672076657273696f6e20646f776e20746f20c0002f636172676f2d72656769737472792f69L8;FFe", - "8a702f9e86f40f9e8ab02f9e8274ba9e8b702f9e83f40f9e9af02f9e8bf02f9e8f340f9e8c302f9e83340f9e8c702f9e8f740f9e8cb02f9e82f40f9e8cf02f9BL8;FF39010034290340b22911c0da291540d2290d098b2925019129fd46d32905009102000014e9031faaf88b92b9380100340a0340b24a1", - "1c0da4a1540d24a0d0a8bL8;FF89ab40a9ffa305f9f6a705f9f6b305f90001803d08018052e8cb05f9e8672a9100f18f3ce8c32c91e99b05f9ea9f05f90003813c0083823cf6bf05f9e0e3823dBBBBL4;FFe183c33ce82740f9e08703ade083c13ce183c03ce84b00f9c80240f9e18302ad680000b4e0031", - "5aa00013fd6c10640f9810000b4c20a40f9e00315aaadf90194L4;FB657373696f6e20c0223a2063616e6e6f742067657420726563656976657220636861696e20696e666f2028c00129001243616e6469646174652073657373696fL8;FFe00314aae80700f9a6f3ff970800f0d2965e02a9886200a9e80", - "740f9992201a9e8c303910081c23c8002833cf8031baaf9c303913b0080921600f0d217008092BL8;FF034900548a0340f9b8835cf84801088b880300f9490300f908ff60d3880d00b5000b40921f1800f1820d0054017f0353a10d00343f1000712c0200543f080071L8;FFe1074091e0431691026e8052", - "21800991c0790094e077c53de17bc53d58008052e8e36b799400805215008092e057813de15b813de8e30a79fc010014e8074091BBBL4;FFe9f6ff5418010014e00317aae10318aae20315aa430080528400805224acff97f80a40f9a2ffff17200140fd00a8200e0a00669e4a01c0da4a11c0da4afd43d3", - "L4;ZBL8;FFff2f01f988f200f8e07f803de07fc03d88f240f8e123813dff2b01f9e09b803d88f207f808008092e09bc03dff7702f9ff7302f96012813ce023c13dbf7f34a9BL8;FFb40000b4680640f9e20314aa0001158bc0390194a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6", - "e00313aaf60301aae10315aae20314aaL8;FFc4010014e8ff41f9788242f9fadf09a9f6f741f9f7fb41f9fa0742f9f5230ba9e80342f9e90b42f9f40f42f9757e42f9e86b00f9080340f9e94b00f9680000b4BBBBBL4;FFe90700f961000014c90080d248008052a0c300d10900f0f2a2831d38a8931d38a", - "9031df8d2fe0094e00700f9210400b021a01f91230400b063843591c9000014L4;FFd4090094fd7bbda9f65701a9f44f02a9fd030091330400b182030054b300f8b6f6031faae00316aae10313aabe090094f40301aaf50300aaaa090094e00313aaL8;FF227968f86902009029811f91287968f8e10308a", - "af5090114ffc300d1fd7b02a9fd830091490200f029c13e910a0000904ae12491400200f000803f91e92b00a9BL8;FFc371ff9708008092686a00a9f44f5ba9f6575aa9f85f59a9fa6758a9fc6f57a9fd7b56a9ff030791c0035fd6eb6f40f9f86340f93f0400b1ea7b40f9e98740f9L8;FF08e14039c07a", - "73781f05007120fcff5498e2ff97c07a3378e14340f9f45341f9f3031faaf50301aa09000014e84f41f9c97a73780a7973784901094a09793378BBBL4;FF050e805229f87fd33f1100f13481889ae30314aa74000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c003", - "5fd6e00741a9L4;FB61696c61626c650025194900000000006a000000000000000e00000026000000000000000000000008000000000000000800000000000000e8fd450000000000L8;FFe00314aa0201805201f17dd3b9c900949b0400145c008052d4000014fc031f2ae0031baa080c48f81f0500b140", - "000054a7c4ff97df0600b18002005474674ca9BL8;FF601640f922008052ba490194611e40f9810000b4602240f922008052b549019460620191f30b40f9fd7bc2a85efeff1761ce40f9810000b460d240f922008052L8;FF080113aba3010054000100d000600d91bb490094e8031faa080113abe300005", - "4000100d000201691b5490094e8031faa080113abc2010054090140b22911c0daBBBBL4;FFdae90194e30300d063a02791e0031faa01048052e2031baad4e901942000805201048052c0e90194fd7bbca9f70b00f9f65702a9f44f03a9fd030091090c40f9L4;FB204c42000000000000000000000000000", - "8000000000000000800000000000000204c420000000000000000000000000008000000000000000800000000000000L8;FF420200b4432440b97f040071e8020054481840b9a8030037e801805214000014e003c03de80b40f9090080926082803c680e00f9690200f9fd7b47a9f34340f9BL8;FFa20000", - "54fd7bc1a8c0035fd6e00308aba3ffff540003009000e02891b8690194fd7bbea9f44f01a9fd030091010c40f9f30300aa1f6800b93f0400f18b000054L8;FF72ffff17480100b008a12a9189028052e86301f9e96701f9f2feff172143c23c2007c03dfc430f912283c33ce8b341b9e0430691810f803de", - "bc741b901048052BBBL4;FFf66740f9fa2700f9df0600b140030054a8035bf8fc6b4da91f0119eb40210054a8835bf82a070091a14301d1e0031aaa4906805209693938aa031cf81995ff97L4;FF7306001100013fd600ffff3420008052f44f44a9f65743a9f85f42a9fa6741a9fd7bc5a8c0035fd6e003", - "1f2af9ffff17ff0301d1fd7b02a9f44f03a9fd830091L8;FFe60300aae5031baae4031aaae80319aae30318aae20317aae10316aae00315aa0200001426008052131900a9e70313aa130900f9f44f45a9fb0b40f9f65744a9BL8;FFe10b00a9e10300912200805204000094fd7b41a9ff830091c0035fd69", - "f0001f1e1210054fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091L8;FFc94202f8cac202f8f98ffe972800c0d229008052e01316b9e80f0bf9e8032491e0074091e92316b90904805200001891e8030bf9e8833f91f6074091e9070bf9BBBBBBL4;FFe20640f9423100b4e10240f92", - "0008039000ef8b728040091490400d17d0000145f2800f1880000542800028b08f1df38281cf837a0c300d1827a0094a8035db8L4;FFe0074091e1431391028c815200401d91c0110094e00b4091e843139102c4805200c00e9101813191ba110094ad11009400c4805221008052ab110094209e00b4L8;F", - "F284840391fb50071e1040054285c40391fb5007181040054ff8301d1fd7b04a9f44f05a9fd030191280040f9299040b8f30300aa2ae040b8f40301aaa05300d1BBL4;FFd68200910104805222008052010100adf60f00f9b791019400e4006fe0830091e1031faae30314aae40316aae0b6843de0b2843d", - "e0ae843de0aa843de0a6843dL4;ZDL8;FF22008052bb910094612640f9810000b4602a40f922008052b6910094b40000b4600640f9e10314aa22008052b1910094610e40f9810000b4601240f922008052BBBL4;FFe18242ade212c03da303da3ce38901ade18102ad03f9ff540400001428050091df0208", - "ebc986899a3f011ceb000800549f0316ebc2070054680b40f9f94f00f9L4;FB87b21a2b5a6c0f0a035f86ec4d14e8bc2cfe6a12b8bec41f23695c3f3db95a978f187637506e0d61ed3ea28c3f90a8ea0000136ad750c24776c7543c9f1d48f2L8;FFe9ff00f90aa543a9e9db00f9092540f9e9cf00f90929", - "40f9e9b300f9092d40f9e9c300f9093140f9e9ab00f9093540f9ea2712a90a2547a9ead700f9e94f00f9BL8;FFe0431691e1031aaae20318aac1100094fad342f9fc0740919c83019144feff17e043169122008052ba100094e1d342f94efeff17e0431691e1031aaae20318aaL8;FF2183c43ce9b304f94", - "00902ad2083c33cc282c93ce93304f9400500ad2a0080528083ce3ceaa71139eacf42f902f18f3ce803169122b7803d6001803dea5301f9BBBBL4;FFe96740b97af204f868ae0239884e41b9775e013969221729e86340b96a4a01796802033947ffff17e8031faae93200d103000014e8031faae92a00d1", - "4a1d4092L4;FB5f636861696e5f6b65792063616c6c656420666f72206e6f6e2d6578697374656e7420636861696e759148000000000034000000000000006e0100000e000000L8;FFf44f47a9f65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6170080923800805219018052a80640f91f0116", - "eb890c0054e00313aa98f0ff97e80300aaBL8;FFa3630091e2018052a80f00f906720194e10200f021003891040300d084801b91a363009122028052b30f00f9fe710194fe710194fd7b41a9f31340f9ffc30091L8;FFead302f99f250094e14316917b0e0094e08f49f9800100b4e1d342f9e8cb42f91f0", - "101ebe0840054e8cf42f9090180522a04009109692138e1431691ead302f9BBBL4;FFbb8312f8ea2302a9049aff979f0700f181070054a06303d1bb8312f8ff99ff97fc2b40f93f0b00b1bb8312f8c107005408008092f6031f2a686e00a933008052L4;ZBL8;FF01048052c8b100942000805201098052c", - "5b10094a00100f000403c91b8b10094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4318d1BL8;FF1f090071200500ad2209803de2f702f9e083ff541f0d0071f3c31291c16c0054e80200f008b140f9880500b4e0db42f9e44b40f9e8c31791430302915a92ff97L8;FF090000", - "f029212c91e8bb02f9080000f008512b91e85703f9e8830e91ea0000904aa13e91e85b03f9080000f008012191e96703f9e9831a91e85f03f9e8831591BBBBBL4;FFe00642a9e2330091c7fcff9708fc79d3e0e7076fea031faa010d010ee92240a90b00088a22696bfc438c212e6c00669e8cc101f28001", - "00548d01c0daad11c0daL4;FFd70000b4e806178be00316aa0201805201ed7cd3b7010094f71f40f936008052ff2200f18018005408058052fa0317aaf766089bf5d240a9340200b4b9820091L8;FF490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b415", - "0340f9f60300aa080014ebe3100054ff0208eb09010054BL8;FFa01300d109014039281040b9a9c31f38c800c8372801d037e8810194fd7b41a9ff830091c0035fd6f9810194fd7b41a9ff830091c0035fd6f6810194fd7b41a9L8;FF2100805238008052b7810094e0feffb43f0700b1f78301a9ff1700f", - "9e0130054e8031faa990a40f94901805209683f3808050091e81700f9390800b4280340b2BBBL4;FF00040054e00317aae10316aa22008052b8c10194e00313aadb000094680e40f91f0500b160000054e00740f962aaff9760820091e1430691022a80527c0e00f9L4;FB6f73742d7175616e74756d2072", - "617463686574206572726f723a20c000224661696c656420746f2064657465726d696e652073656c665f73657373696f6e3a20L8;FFe10305ade31307ad6383c63ca00b3aad6283c53c6083c43ca103933c6183c33ce08b01ad6083c83ce10b803d6183c73ce84300f9e10303ade317803d6e000014BL8;F", - "Ff70b00f9f65702a9f44f03a9fd030091f30301aa210840f9f40300aa680240f91f0101eb600e0054680640f92a040091e00314aa490180526a0a00f909692138L8;FFf50b40f9fd7bc3a8ba410014010040f9810000b4000440f922008052b5410014c0035fd6fd7bbea9f44f01a9fd030091010040f968", - "028052290041d23f8d00f1BBBBL4;FFcd000054390300eb43ae00541803008bf9feffb50f0000141f0400b1a1ad0054d7e101941f10003121ad0054f9ffff17d4e10194f70300aa1f0400b141fdff54L4;FB190000001c0000001ced4800000000006a00000000000000e30000002e0000001ced48000000", - "00006a00000000000000800000002e0000005768697370657250L8;FFe00313aa21008052b7e10094c00300b4e10316aae20313aaf50300aabde10094f61640f9f60100b4f81240f9ade10094e00316aa21008052abe10094a00200b4BL8;FF21742a91e40200d084602791a32300d122018052a8831ff80", - "362019403620194f44f43a9fd7b42a9ff030191c0035fd6fd7bbea9f44f01a9fd030091f303012aL8;FFe0031faa9effff17680240f9080540f9190101eb031e0054680240f9080540f91f0119eb690d0054e00313aae2fdff972024003728fc60d3681000b520084092BBBL4;FFb6831ff808010aaa0ad4", - "9052284108aa2a00a072097dd59b28a10a9be90f40f9e9a301a9a8df3ea9cfa10194c00b0037883e403989424039410300f021203e91L4;FFe10315aae00313aa0b030094000080d2f35341a9f55b42a9f76343a9f92340f95800001400430891b70300947bffff17e10314aae003132af3fcff97f703002", - "aL8;FF2202805207a20094b30100d073a20b9188620091810100f0217c1d91e0230091a32300d142018052e40313aaa8831ff8fda1009488720091810100f021901a91BL8;FF63020054800200b000801691bc210194e80f0036a80202abc2130054ca0215abe21300546b0240f93f0009ebe80f00f96b01", - "15cbeaaf00a9880f00546901158bBL4;FF601640f922008052ba210094614640f9c10000b4604240f922008052f30b40f9fd7bc2a8b3210014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091L3;ZB" + "BBBBBBBBBL8;FB7f454c460201010300000000000000000200b7000100000000a04600000000004000000000000000e06b09000000000000000000400038000700400012001100L8;FF81028052cea1009402feffb04240399125feff90a5802d91e1230091e0031f2ae3031faaaca1009423feff9063c02", + "c91e0120091e10314aae20315aad1a10094BL8;FFfd7bc3a8c0035fd6fd7bbea9f30b00f9fd030091090040f9e8008052f30300aa2a0900d13f0500f14881889a1f2500f14810005409ffffd029e13f918a000010L8;FF29318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f6", + "0300aa080014ebe3100054ff0208eb09010054e0e30091e10317aa22008052BBL8;FF21008052390080528a650194c0feffb4e1031aaae20317aaf80300aaf9031aaa8c650194e8630091e0230091e1031faae2031f2a847a0194faef41a9e00319aaL8;FFc009003728fc60d3a80600b5200840921f1800", + "f182070054217c0353010800343f040071000100543f08007141fdff5481220191e20313aaacfcff97000100b4BL8;FFc1ffff17ff0302d1fd7b03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf40301aa3bf2ff97e80300aaL8;FD68a84600000", + "00000d0a046000000000058a046000000000018004700000000000000020000000000050000000000000000000000000000000000000000000000BBBL8;FB18000000000000000800000000000000a0644500000000008463450000000000f46c4500000000006120446973706c617920696d706c656d656", + "e746174696f6eL8;FFea031faa9a1a40b95f07007160faff542801088b49011f8be16300910001098bd292ff97990100b5280000144b0080528cfaff35ec031faa8b010b8b2801088bBL8;FF5f150071e1060054298400d13f8100b122070054490500b42a0200f04a1140f95f0900f1c3040054ff8302d1", + "fd7b08a9f44f09a9fd030291e90300f9e9030091L8;FF39c300918001005421035ef8810000b420835ef8220080528705009421835ff8e1feffb4200340f92200805282050094f3ffff17e85240f9c80000b40805088bBBL8;FF08050091690a40f9c90500b42a0140b24a11c0da4a1540d24a0d0a8b4a25", + "019129194a8b2a050091691640f94801088b090100b42a0140b24a11c0da4a1540d2L8;FF3f0400f18b000054608240f92200805289450094619640f93f0400f18b000054609a40f92200805283450094613240f9810000b4603640f9220080527e450094L16;FFe81742f9f4c742f9e0f3803de8c300f9e", + "81b42f9e8ab00f9e81f42f9e92312a9e82342f9e92742f9e8ab1aa9e82b42f9ea3f42f9e9a309a9e82f42f9e93b42f9BBBBL8;FB5707000005000000ef104000000000004e000000000000005807000005000000ef104000000000004e00000000000000aa02000020000000ef10400000000000L8;FFa1c", + "302d1ab2315382901084aab535538a93315384901084aaa635538a94315386901084aab735538a95315384901084aaa835538a96315386901084aab935538BL8;FFc2010054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035", + "fd6e0fefff000203191L8;FF48fd60d338fd78d3eb7b42f9ed7f42f9fb0309aae903172ae1ab40f9ef7e0853dc7d1853f003182ae9c700f9f703082ad2030014d8fd78d3e9031aaa3a7f0853BBL8;FF39008052bbf8ffb537008052df0600b1a1f9ff54e0031faa030000148655019420008052e81740f91", + "b5f00a91b6701a9000540ad136b02a9e92344291c1b00f9L8;FF29610d912283c53cea670a91200500ad2083c63c414fc03de8bf01f90800f0d2220101ada90359f841f18f3ce9d701f9fbc301f9f5c701f9f7cb01f9e8bb01f9L16;FF20160054e8430f910183009102708052008100918fd50094e0d3c2", + "3de1dfc13de9670b91e8c343f9f89b45f9f99f45f9e0f3803d21f18f3ce8f701f9f7eb01f9BBBL8;FFe10313aa79fbff97770a40f9680240f9080117cbbf0208eb480f0054680640f9e10316aae20315aa0001178b89750194e802158b680a00f9952e40f9d5f2ffb4L8;FF00c30391bd290094080040b20", + "811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb481700545f000014fa031faaf9b749f9f8074091BL8;FF612640f9810000b4602a40f92200805289f50094b40000b4600640f9e10314aa2200805284f50094610e40f9810000b4601240f9220080527ff50094688e46f8L8;", + "FF61d05f3864e05f782110001200010034640000345f000039007d20d464805fb8e0ff9f529f00006b6dffff54826c1c53e001809200c022cb6500008b606860f8BBL8;FF80000054e8c3009100c10091b00e0094ff074091ff833c91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd", + "6e067c13de8d342f933ffff17L8;FFe9830e910a0000d04a712991e99b04f9e9831f91e8f303f96800009008a11f91e9a304f969fdff9029a11391e8a704f928008052a04700d1e96705f9e1432a91L16;FFe00b18ade213c23d699145b8ea6300b9eaa35f39e417c23d3b8108aae18b14ade11bc23deccb", + "43f9e97344f96b1147f8eaaf00b9e00bc23de31fc23de203c23dBBBBBL8;FB795f70726976617465636861696e5f6b65796d6573736167655f6b6579730000ef104000000000004e0000000000000064020000130000005369676e616c4d65L8;FF5f213b6b6100005434050079caffff17a9035ef813258", + "89a5f0309eb40030054d70a138b480313eba900005402f57ed3e0120091e10317aa2b9e00945a070091BL8;FF800100b4610a40f9680240f91f0101ebc0090054680640f9090180522a0400916a0a00f909692138e10313aae6faff97e00314aa080c43f81f0500b160000054L8;FFe1030091e2630091e0", + "0315aa76f4ff972800809229008052880200f969520039f44f45a9f65744a9fd7b43a9ff830191c0035fd620fdffd000203991d7190094BBL8;FFe0c30591e1031faa220080522300805224008052f8e8ff97e0a357a97cffff1780ffff9000600a91d859019480ffff9000203991d559019460fffff0002", + "03c91L8;FFe233833d09fdff97f3f742f9e8ef42f97f0208eb61000054e0631791bafbfe97e8f342f909068052e02fc13d6822099be133c13de237c13d18000014c80080d2L16;FF550300b4610a40f9680240f9941240f91f0101eb80080054680640f9490480522a040091e00315aa6a0a00f909692138", + "e10313aacdeaff97760a40f9680240f9BBBL8;FFff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052L8;FF0183c13c0283c23cf6d344f9e0074091fbcf44f9f9c744f900802f91f5cb44f9010", + "48052e01b843de11f843de223843df6ef07f9e3ff863de3fb863d63780094BL8;FF490109cbea0080523f1d00f129318a9a2a0080525f0014eb570909aaa0000054c9fe7bd3a90000b5f716168b10000014f30315aa11000014f80308aa81fd0094L8;FF1d0080d21e0080d2e0030091a1dcffd021000091", + "1fec7c9201000014e20300aa240000d0230000d0200000d0849040f9050080d2639440f9009840f9418440f8BBL8;FFab231538ab535538a9331538a96355384a01084a6b01084aaa431538aa7355382901084aab531538ab835538a9631538a99355384a01084a6b01084aaa731538L8;FFf5031faaea03", + "1faa5700805234008092ff5700f959010014e8cb43b9f6c30d916b7e0e91c9b245b86a621e91740102f9689a07b9e85f40f9f84f40f9493100b8L16;FFe2f3c13dee6344f9e96300f9e9734ff8ed6f44f9e18b14ade1fbc13de0ebc13de8bb01f9e87344f9e3ffc13da97202f8e2e3c13de23744f9e48715", + "ade1e7c13dBBBBL8;FB233fab8ad5a05f8bd566a27c2d97cce9733a9e4aa29aadaeace7eb39784a9e12a28c2bf9abb41e0d428b000097756460c5accfeb824580d679cbd3e4be0fe17bL8;FF8c8d0094605200b4e8fdffd008793a91a96d8252080140f909100079138304a9080000f9132f00f9868d0094", + "40018052410080527f8d0094c05000b488ad8752BL8;FFe86306f908078052e97b06f9e9c32291e86706f9280080d2e97f06f9c9048052683bc0f2ff5306f9e95b06f9ff5f06f9e97306f9e87706f9dc090194f3f742f9L8;FFfd7b43a9ff830191c0035fd620008052c1018052c4090094ff8301d1fd7b0", + "3a9f52300f9f44f05a9fdc300915f0c00f1f30300aa89040054f50302aaf40301aaBBL8;FF81fbff54f4031f2ae82f40f9490700d13f0108eba1fbff54e0630191eeebff97fc3340f9d9ffff17e083c53ce83740f9e30340f9e007803de81300f9e80b40f9L8;FF2925019129fd46d329050091280108aba", + "2060054694240b93f0500716102005469aa4829c9030034290140b22911c0da291540d2290d098b2925019129fd46d3L16;FFe85740f9e85f04f9e86f40f9e86304f9e85f40f9e86704f9e8e340f9e86b04f9e85b40f9e86f04f9e80740f9e87304f9e83f40f9e87704f9e9235ea9e88304f9BBBL8;FFed6", + "700b96c6a0094a8835c38aa135d381f050071e1000054a8035d381f0500718c030054c8120035e90f41b299000014a8f35c38e00314aae82b00b9a8d35c78L8;FF4a5105911a0380d280fdffd00090199108210091e1c30e91e9db01f91a00f0f2eadf01f9df690094e81f40b9e8c306394d0000142093c1", + "3ce9df40f9e8a30539BL8;FF1f0500b160000054e0c30391b7f8ff97f7bb40f9ff0600b160350054fb0318aaf6e357a9b82100b4d922009104000014180700f1396300910021005421835ff8L8;FFe52b00f9e37f0b29e01740f9e10b43a9e43740f9e7ffff17fd7bbea9fd030091f35301a9f40300aaf30", + "301aa96ffff97e00314aae10313aae81a80d2010000d4BBL8;FFe1031aaae20318aa44110094fad342f9fc0740919c83019190fbff17f60300aae0431691220080523c110094e1d342f9e00316aacafdff17e043169122008052L8;FFe0f9ff54f6030291e1c31d9102248052c06210918f2d00942800805", + "2f43302f9d4820f91e8e71639880000b0fa3702f9fb3b02f9f93f02f9fc4302f9f84702f9L16;FFd71f00b48fad0094e00317aa210080523800805287ad009480fcffb4a1020291e20317aae01b00f98aad009485ad009400108052210080527ead0094c01e00b4BBBBBBL8;FB6f632f7372632f73747269", + "6e672e7273002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d6235386437663536653336L8;FF01030054e103192ae2031f2ad807009408fc60d33d000014680100d008210091a94300d1e00f00b900210091a22300d12100805203fefff063400c9104fefff0B", + "L8;FFc90080d248008052e04300390900f0f2e8470039e90700f9e0230091bf270094f44f4ea9f95b40f9f6574da9f85f4ca9fd7b4aa9ffc30391c0035fd6f6230091L8;FF57faffb5d5ffff17fa031f2a688240a915d940a9621dff97a1033da900a30091a3c300d1a1031ef8e10315aae20316aab6f8ff", + "97390080929a220129e80b40f9BBL8;FF3f1100f13481889ae30314aa0c000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9bb5d0194fd7bbda9L8;FF1f0101eba00a0054680640f9490480522a040091e00315aa6a0a00f909692138e10313aa20", + "faff97770a40f9680240f9080117cbbf0208eba8090054680640f9L16;FF21e40e9183fefff063280f91e003009122028052a400805209000014e00300f981fefff021e40e9183fefff063440f91e0030091220280524400805246e7ff97BBBL8;FB696d652d6b796265722d7072652d6b6579736c617374", + "2d7265736f72742d6b796265722d7072652d6b6579736964656e746974792d6b65796964656e74697469L8;FFd9ecff97e1630091d88eff97806a40f9800100b4e11740f9e80f40f91f0101ebc03f0054e81340f9090180522a040091ea1700f909692138e1630091cb8eff97BL8;FFfd7bc2a8c0035fd6d", + "30100b48d010194e00313aa2100805286010194400100b528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd6L8;FFfd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff071ef83b008052f30308aaf5031faaf9031faa34008052180082521a02", + "a052BBL8;FF290d098b292501910819498b08050091096040b93f050071e103005409a84c29290140b22911c0da291540d2290d098b2925019129fd46d3290500912801088bL8;FFc10c005448008092480300f9e80080524b0d001468b30135680640a96082c23c69aa43a96082893c6082c43c680607a9", + "680241a960828b3c6082c53c69aa0aa9L16;FF97f6ff17e8ff40f9f0f340f9e10315aaf16f1ea9f10305aaeabf40f9e89300f9e85b40f9f50316aae65b00f9e65f40f9fb0307aae80700f9ee234da9e9e740f9BBBBL8;FB045484954f2d782971ba62157026a08ce8baee34a28c5e8bd2aa000067bc8ee26", + "7ce5d4bcb6e039a74ec24e695ad626d6783b22610fd8b1b3c336a5c5bf0b0d6L8;FF21980791c2028052c28d0014fd7bbfa9fd030091083040f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091091840f93f0500b1BL8;FFf98306f9e8b70db9e80740f9e9b30db9e93f40", + "b9e8df06f9e82740b93f010071e9eb0db9e8c30db9e80340f9fb8706f9e8eb06f9e81740b9f98b06f9e8e30db9L8;FFfcdf5aa9ea0316aaf0031aaaed0318aaec0319aae1cf40f9610300b4e0d340f9e2c700f922008052f6030baaf9030caaf8030daaf5df1aa9f7030eaafa031caaBBL8;FF8d51011420", + "00805201c48052c54d019420008052018c8152c24d0194fd7bbda9f65701a9f44f02a9fd030091140440f9930600b162030054b300f8b6f6031faaL8;FFc94d009420008052e10318aac64d009420008052e10316aac34d009420008052e10315aac04d009400018052e10313aabd4d0094fd7bbfa9fd030", + "091083c40f9L16;FF810000b4e07345f9220080528ad10094e8032b9100e1009156d8ff97a9100014e0031d9121200091023c805289d10094e9c743f9080340f91f0109eb892f0054BBBL8;FFc4018052ac01001401300591e003022ae20303aadff6ff97203500b4a1ffff9021203f91a3ffff9063e03c9", + "1e00700f90b00001401e00191e003022ae20303aaL8;FFc96d00942000805201048052c66d009420008052012c8152c36d00942000805221058052c06d0094c0fdfff000400291d66d0094c0fdffd000003b91d36d0094BL8;FF4b05c0394c0900912e0900d10c3900a96d190012211c0daa6bfdff363f09", + "00f1e0fdff544b09c0394c0d00912e0d00d10c3900a96d19001221380daa4bfcff36L8;FF02e01f7800c0238b1fc01f38e40840f984400091040004cb211c001201d01f38030100cb84fc44d304e01f786500056b20010054e103054bbf1000711fc92138BBL8;FF3f0308eb681f005431010014e1d342f9", + "e8cb42f91f0101eb00750054e8cf42f949068052f4074091948209910969213828040091f68b49f9e8d302f9df0a00b1L8;FFf6eb12a9f5620891fbe713a9e087853de083853d6d2c0094f4833f910a088052e0833f9189fe5839888258392a15003308111d1288821839e86208918afe1839L16;FF8db10", + "094613240f9410500b4603640f922008052f44f4aa9f65749a9fd7b48a9ffc3029184b10014612640f9080080921f200039080000f93f0400b140010054BBBBBL8;FB842b007c494c059ea36eca27c5003b362c0b1640315f756f31061e110d0d000000000000000000000d00000000000d1100000d000d0", + "d160d617373657274696fL8;FFe4c3841aef150a0a52220a0a21380e13a5300a0a2901044a6b010c4a00240a0a08350a0a29010b4aab010e4a0c02114a4d00034a2a380a0a6b010f4a8c01124aBL8;FF1f0500b1000b0054083040b9e80b0034080140b20811c0da081540d2080d088b0825019108fd46d3", + "08050091090840f9290b00b42a0140b24a11c0da4a1540d2L8;FFe16f813de46b813de067813deb0300f987e6ff97e043139165f3ff9785000014c022009116f3ff9708008092880200f9b50000b4e0031caae10315aa22008052BBL8;FFe0031baa220080528b59019475f2ffb4e0031aaae10315aa2200", + "8052865901948effff1738008052fc6740b98559019400048052210080527e59019460fdffb5L8;FFe87306f9e97706f9e8550094e1bb43f9810000b4e0bf43f92200805286590094e0833291e1032d91022b805289590094e1fb42f9f39b45f93f0400b100010054L16;FF4900001448008052e0230b39e", + "8270b39f56301f945000014e06301f981feffb021a8189183feffb0632c19914700001448008052e0230b39e8270b39f56301f9BBBL8;FFf44f42a9fd7b41a9ffc30091c0035fd6f30300aae00301aaf40301aae10309aa220080522300805224008052f2040094880a40f9e00313aae10314aaedffff17L", + "8;FFe8cb42f908011ccb5f0308ebe8d40054e8cf42f9e10316aae2031aaa00011c8b8c79009488031a8bfc074091f60740b99c830191e8d302f9b9010034e1d342f9BL8;FF000180521d000014280180d20800f0f2081d00d11e0000141f150071000200541f11007141040054280180d20800f0f2170000", + "14e00313aa3b060094e80300aaL8;FF37030094f60318aae00317aadf0600b1c0c5ff54760000b4e00313aa30030094e8031faae1031faa4cffff17fd7bbba9fa6701a9f85f02a9f65703a9f44f04a9BBL8;FF210080528b390194c09701b4a10241adf40300aaa20e40ad010001ad020c00ade007409100", + "800991b1350194f70300aa8439019400908052210080527d390194L8;FFe00640ad09068052e8eb41f9e20ac03dc822099bc9060091e0c32491000500ad0209803de9ef01f9cdf3ff97e86b40f97b6300915a0700917f0308ebe1eeff54L16;FFfca35d3921830091e0e3803d022e8052e8f203f8e8c3159", + "1f7430d91008100918cb90094e0e3c03de8f243f8df0600b1e9c31391f40b00f9f4bb02f9fce31539BBBBL8;FB69616c697a6174696f6e496e76616c6964000000000000003d0f4000000000004a00000000000000b60200000900000042024000000000006a00000000000000L8;FFb58338a9bf8319f83", + "81e00b4f7031faaf6031faa19038052fa23019108000014a80359f8d6060091f70a0091df0218eb15693338b78319f8e01a0054c00e4092BL8;FFe10313aac805019420008052e10319aac505019420008052e10313aac20501942000805221028052bf050194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65", + "704a9L8;FFe0230091e10318aae20316aa230080522400805223e6ff97f80f40f9e80740f9080118cbdf0208eb09f2ff54e0230091e10318aae20316aa2300805224008052BBL8;FF1f0500b121fdff5419008092542340f9b4031df8f40e00b4080d80525a1f40f9fc0300f9fb0f00b9f96301a9f75b02a", + "9f54f03a9937e089b82490194e00313aaL8;FF081100d1d7ffff173f00156b81f7ff54680240f9e0031faa090540f90a0140f9290100cb4a01008be0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191L16;FFf1df00f9f0cf00f9e6fb00f9f29710a9f6f300f9f6030daae4af00f9f51300f9f7ef", + "13a9fa2300f9e7fb16a989c90094e72340f9e31340f9f70314aafb031caaBBBL8;FFa90302d1290140f9ef2f40b9f01340f9f11f40b9f20b40f94bfd68d34a631baa7f0a007180cdff54c9aa00a9697d1053ac835778ada35738aa035738d33e0029L8;FF220080528c690094612640f9810000b4602a40f", + "92200805287690094613240f9c10000b4603640f922008052f30b40f9fd7bc2a880690014f30b40f9fd7bc2a8BL8;FF480600b5200840921f1800f182060054217c0353a10600343f040071c00100543f08007161fdff54888243f81f0500b1810000549fe203a99ffe04a998fe05a9L8;FD000000000000", + "00008030440000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000BBL8;FF808506ade083cb3cc1e20091e2430e91fa030b91808907ade3838b3ce3838c3c21c5ff97e89341b9080e00362007c03de9b341b92143c23ce8c74", + "1b9a6000014L8;FFe0030e91c5250094e00741ad9ffe00f1f8430a91ffaf01f9ffab01f9e18318ade00740ade18319ade08753ade08714ade2034bade28315ad0801005400030191L16;FF0b00f0d2f50304aa6b0104cb9f020bebe8020054010100b4a17c019be00302aae20315aae30314aa84a9009480", + "0100b507000014340100b482a90094e00314aaBBBBBBBL8;FB696f6e20c00f20616e6420646972656374696f6e20c0001b737071722076312e73656e645f63742e726563762065706f636820c01a3a2043743153616d706c65L8;FFf70315aa760a00b4a0835cf8480701d11f0008eba9110054e0031f2ae", + "80316aae90317aaea031caa2b154038080500f14c1540388b010b4a6001002a61ffff54BL8;FFb7031ff8140117ebe3070054b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcb9f0208eba8040054340100b4680640f9L8;FFe4ffff17e10300a9e00301aae10308", + "aa220080522300805224008052f4030aaa20000094e10340a9ea0314aa2ba040a9290040f900fc78d37369283808050091BBL8;FFf80f40f9f703192af903142afa0315aa28008052020000143a008052f52b40b9e85f1829e9534929f60309a9e8571a29e82f40b9e00b00f9e0830191e9231b29L8;FFe1", + "0313aa28fcff97801e40b980010034610a40f9680240f91f0101eb20050054680640f9090280522a0400916a0a00f909692138e10313aa1bfcff97818a40a9BL8;FF81a20091e20313aae2f2ff97000100b45d000014600900b5e00313aa42f0ff97e80301aa80000036c80900b5e1031faadcffff17e103", + "1faa882e00f9d9ffff17L8;ZDBBBL8;FB726f746f6275660073104000000000002d00000000000000370000003800000058334448206e6f206c6f6e67657220737570706f727465646a7573742070726fL8;FF0969213828040091df0600b1e81700f9601c005480220291d3eeff97080040b20811c0da08", + "1540d2080d088b0825019108fd46d30900088b37050091ff0208ebBL8;FFf74b00f9f6570aa9f44f0ba9fd030291210a00b4f30300aa691640383f1500f1e1090054298400d13f8100b1e2090054e90400b42a0200f04a1140f95f0900f1L8;ZFBBL8;FFe3430091cd3f0194fd7b43a9ff030191c0035fd6", + "202040a941ffffd021d43191030d40f942038052fd7b43a9ff03019160001fd608200091200440a9e9230091L8;FF1f1900f1a21a0054017c0353c11a00343f0800716c0100543f040071600700543f0800716106005481620091e003082ae20313aa4efeff97200700b4fa000014L16;FFebab05a9e8830", + "0f9e8430f9100610091e94b00f98fc30094e0233391e1430f91022f8052fa430f918ac3009448e30591ff0200f1e9b742f9000540ade8079f1aBBBBL8;FB5401000019000000d30940000000000055000000000000006e01000025000000d30940000000000055000000000000006b01000021000000d309", + "400000000000L8;FF3f0500b1e0120054f30300aae00308aaa9faff97e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209ebBL8;FF2905009129010aab620500542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913", + "f010aeb89040054280108ab830000541b000014L8;FF94edff97e8e340f9880000b4e0875ba9220080528813009428008052ff0701f9e80b01f9ff0f01f9b70000b4e0db40f9e10317aa220080527f130094e0431391BBL8;FFc94f019436008052e8230091e0820091e54f0094f70f40f9f7feffb7f80b4", + "0f9770300b487530194e00317aa210080523a0080527f53019400feffb4e10318aaL8;FFe16340f9e22340f9081540f900013fd6e03b02f9e8031691e13f02f9290c40f9e103129120013fd6fbc342f97f0f00b1410a0054a8008052a8ffff17404fc03dL16;FF22008052ff074091ffc30091f44f45a9f6", + "5744a9f85f43a9fa6742a9fc6f41a9fd7bc6a884d30014e80301aa190340f90aa5c0a90b7142a90e3156a9143555a9BBBL8;FF680640f9490280522a040091e00317aa6a0a00f909692138e10313aa73f9ff97790a40f9680240f9080119cbff0208eb48300054680640f9e10318aae20317aaL8;FFfad34", + "2f9e8cb42f908011acb1f0308eba8350054e8cf42f9e10319aae20318aa00011a8b8b7300944803188be8d302f9f89749f9f90b40f9780300b4e1d342f9BL8;FFf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a9d0f1ff97e0230091f7a700a9cdf1ff97e00313aae1031fa", + "ae20314aa23008052L8;FFc3020e91f96b04a9f90301aae12a0091f50317aa627861f8421200b4401840b9800e0035f35301a9fb7305a9441c40b9400440f9a40200355f0000eb20020054BBL8;FFf47749f9e1d302f99f0a00b1e14a0054e8cb42f91f0101eb00ba0054e8cf42f9290400911f692138e9d", + "302f985ffff17f37749f97f0600b1e0020054e18f49f9L8;FFe90f80121f00207109140033c20000540a7c0653090500394a051a320a010039e0ffff17ea0f80120b7c10530a2c0633eb0000350b7c0c530a05003909090039L16;FF390080528bb3009460fdffb4e10318aae20315aaf60300aa8eb30094", + "7000001436008052e007c13de10bc13de20fc13d882640f9893240f9a0073ead8082c33cBBBBBL8;FB73656e64657220726174636865742070726976617465206b6579696e76616c69642073656e6465722072617463686574207075626c6963206b65795768697370L8;FFbcc303d1e083853cf50340f9e", + "83700f9a85701d1e183843ce18f48ade08b42adbf8200f1e92300f909088052b8328a9ae10f01ad08050091a00b3cade213c03dBL8;FF29f11c91f52705a9e96300912a0200d04af11e91a80319b8080000d008c11d910b0000906b813f91e92306a9a9630091a07f0091e92b07a90900009029213f91L8;", + "FF82018052e06f02f960620491e17302f921fdfff021b00091bcf2ff97891b00948000805221008052821b0094404d01b488008052e06f02f921fdffd021a03391BBL8;FFf4a30091090140b90a3140b80c7141f8167140f815f140f87f0500b1a98318b8097d40398a320fb8ac8317f8a9031838c003005", + "4f903012a098449a9fa0300aaL8;FF21203f9102028052a3fdffb063b43191a4028052af000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f9ba61ff97e10300aae15306f9e0833291L16;FF28008052a8831ff8e08700ada083de3ce87f04a948008052e87f05a9ff2306a9e87f08a9ff23", + "09a9e87f0ba9ff230ca9e87f0ea9ff230fa9e87f11a9ff2312a9BBBL8;FFf85f4ba9fd7b4aa9ff830391c0035fd6e80f40f98a0640f9490108eb631700548a0240f9e00b40f9e20315aa4801088b882600a9580040f9080740f91f0100ebL8;FFe07b833de07fc33df4179f1ae383833de37bc33de183c33", + "d2083853ce08bc33de8cb02f92183863c2283873c2083883c2383843c20010054e0f3c63de1074091BL8;FFdf7d02710944003949c100110a819f1a0948003969010d0b4a114e0b29c10011cb0d00122c2c4039094c003949c100117f2500710950003909819f1a9f7d0271L8;FFe20314aa0001158b92fb", + "ff97e0031f2aa802148b680a00f902000014e0031f2af44f47a9fb1b40f9f65746a9f85f45a9fa6744a9fd7b42a9ff030291c0035fd6BBL8;FFb50200b4d80a40f9f8feffb4da0640f98c3b0194e00318aa21008052853b0194c00200b4e1031aaae20318aaf90300aa883b01949c0700d1d6620091b5620", + "0d1L8;FFa142813ca8f5ff972c07001437008052789240f9f6c32491980100b4758e40f9883b0094e00318aa21008052813b009440f300b4e10315aae20318aaf90300aaL16;FFe13340f9e3b7803de20713adec2b4ba9e8a301f9a8008052e0a3803ddb020014f60301aa9f0700b1f70318aa6002005494", + "0100b4f522009104000014940600f1BBBBL8;FB0000c8c5defb7d6bdb1a0000ce4611267d9401f6bd6d9daa2c3f52493c29d65aa68e00000000000000002d1a9e71c85c02bc0000000000000000000000000000L8;FF840c0054e8f77fb2ff0208eb280c0054770100b48b8b0094e00317aa41008052848b", + "0094e80300aa40008052e87300f9080b00b4f66f00f90300001448008052BL8;FFe86702f9e943133919000014e033c33de1d3c23de9c31291e8ab45f9fc5b02f9e037813d2181803ce86702f910000014c80080d2fb4340f9fa8302910800f0f2L8;FFf30b00f9fd030091f30300aa8d0b0094000280520", + "1018052860b0094000100b401fdfff021800991130000f91f200039f30b40f9fd7bc2a8c0035fd600018052BBL8;FF030c8052d8020191e82702a9e036833de08742ade23a833de213c03de01e833de122833de08743ade21a833de026833de12a833d04eeff9700e4006fe00301adL8;FF0800403969fdf", + "f9029011091e00301aa227968f889fdffd029210c91287968f8e10308aabb470014fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1L16;FFfc0305aafa0302aae4e300f9e50314aaf40310aae29349a9f80309aaf0a74ba928a00791fbbb4ca9e03340f90001c03d08008092f9030faaf60312a", + "aed5b00f9BBBL8;FFf80740f9080319cb7f0208eb69efff54e0230091e10319aae20313aa2300805224008052f4f6ff97f90f40f9f80740f972ffff1720008052e10319aaba670194L8;FFc0825ef8220080528b6b0094c10240f93f0400b1e0fdff54810000b4c00640f922008052846b0094c10e40f921", + "fdffb4c01240f9220080527f6b0094e5ffff17BL8;FF880200f9898207f88182803c8082813ca18379ad8182823c8082833cacffff17e08742ade00314aae21fc03da0873aade08740ada203973ca08738ade08b41adL8;FFbfd1037141020054dfc50131ed02005441000014cd091b12bf810271e004005", + "43d000014cd410251bfc10071e301005439000014af850351ff31007102030054BBL8;FFfd030091350440f9f30300aad50100b4340840f9370040b9340200b4892b0194e00314aa21008052822b0194800200b4e10315aae20314aaf60300aa852b0194L8;FF937e089b8f2b0094e00313aa01018052882", + "b0094a0831df8201100b4080d8052b3835df8fc031faa887e089bfb0314aaa8031ef81100001436008052a9835ef8L16;FFea031faa8c318d9a4d040091ae696a384a0500915f010cebcf194092ce1d0013ef21cb9ae90109aa220800546b1d0091eefeff373e0000141f15007121050054BBBBBBL8;FB6c", + "6964204d4143206b6579206c656e677468203cc0013e00196d6573736167652077697468206f6c6420636f756e74657220c003202f20c0001b737071722076L8;FF410080528b9f0094801800b4fb0300aa8c9f00944000805241008052859f0094c01700b4e9ab42a928008052e8531ea9fc031faaf6031", + "faaff231fa9ea0301f9BL8;FF75fdff34610a40f9680240f91f0101eb60020054680640f9090180522a040091e003152a6a0a00f909692138e10313aae5fcff97f4fbff35f44f42a9f50b40f9L8;FFe00f803de14740f9810000b4e00316aa22008052881f00941a0080920a0000141a008092e01fc03de0", + "13803da003983cb7fbffb5e0ffff17d90180d21900f0f2BBL8;FFf85f03a9f65704a9f44f05a9fd030091ff0311d1ff0300f9fb0300aaf40303aa698f41f8f803012af70308aae21b00f93f0500b160050054086041b949008052L8;FFe20314aaf50300aa925f0094f6b340f9961600b4f3af40f98a5f00", + "94e00316aa21008052835f0094c01d01b4e10313aae20316aafa0300aa865f0094fcbf40f9L16;FFe10317aae20316aa0001188b91df00940803168b680a00f9540300b4610a40f9680240f9b51240f91f0101eb40080054680640f9490280522a040091e00314aaBBBL8;ZBL8;FFe20316aa23008052240", + "080523ba3ff97f71740f9defdff17f60300aae063009122008052230080522400805233a3ff97e11740f9e00316aafbfdff17e0630091BL8;FF280108cbe90080521f1d00f10831899a29008052ff0215eb360908aa8008005428ff7bd3480600b5d616198b3b000014b309f8b7530200b482ff0094e0031", + "3aaL8;FF010000f981801ff8c0035fd61f2003d582001036010000b981c01fb8c0035fd6820000b4010000394200083681e01f78c0035fd60000803dc200303780009f3cBBL8;FFa82303d1fd390094a883533808060036a80354381f0500718c090054e80d0035e90f41b273000014880700d1090080921", + "f0d00b1696e00a9a8000054e00319aaL8;FFf6fe60d30800f0f258fd60d314390091fa0000b4e00315aae1031aaa22008052f5030aaa843f0094ea0315aafa6740f9ff5700f9f5031faaf94308914f030014L16;FF6183c03ce083813d6083c23ce15f813d6183c43cf4bb42f9e27f813d6283c33ce06781", + "3d6083c53c9f0600b1e26b813de16f813de073813de363813d205e0054BBBBL8;FB6c15a88a5511296483e2513ecce93c95a29a53dfeb393c25a28cffa88b8c0000c40d1af1e6e32b5021934ee3f2840f0cf92f73b041c24580f2af1be7031f2e0dL8;FF156300911602805208000014e87b40f9940a0091", + "d60600f1b562009113693738f47f00f900880054a0867fa9e2031b2af5ecff97f47f40f9e87740f9f303002aBL8;FFe1ffff17e1031faae8830cb9deffff17e18b0cb940ffff17a88357f8080540f9150101eb232c0054a88357f8080540f91f0115eb290b0054a02302d151ecff97L8;FFfd7b47a9ff830", + "291c0035fd6a003df3ce10bc03de91b40f9e10740f9680200f9600a803d6182803c690e00f961feffb4e00b40f9220080527f0f0094f44f49a9BBL8;FFea2f5b29f7c3023980a20191a14301d10809c05a2909c05adf9202f8e82712294809c05a6b09c05ae92b5c29e82f132922008052df1202f82809c0", + "5a4a09c05aL8;FF290500913f010aeb29030054280108ab8300005410000014e80308abc2010054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8bL16;FFf60310aaed0304aae40301aae1030eaaee031baaf00311aaf70306aafb6b4aa9e61f40f9e9474ca9ec9f00f9ec0", + "312aa520e0014092340393f190071a1cf0054BBBL8;FF091041b949000037168800f9f70300aa01500491e003082ae20303aaf80303aadcf4ff97200100b460000014f70300aa01800491e003082ae20303aaf80303aaL8;FFf50301aab70302d1f4030591f807ff97e84346391f05007180020054881245", + "b8e99741b9e00315aaeb2b5aa9a80318b8e8c34639e93200b8e9cf40f9e8631139BL8;FFe08300910800f0f2ffa70039e81300f9c2f5ff97e80300aaa1fefff021181591a3fefff0635c1591e08300912202805244018052e81300f92b000014c80080d2L8;FFf8ffff1704805fb8e1ff9f529f00016badf", + "dff54816c1c53e301809261c021cb0300018b016861f8260840f97f0006eb80000054000080d21f000039007d20d4BBL8;FFf90b40f9fa0740915a830991e8d302f9f88b49f9b80300b4e1d342f9e8cb42f9f98749f91f0101eb40430054e8cf42f9490480522a040091e00318aa09692138L8;FFe80356b", + "9e00740918100805200001891ff0316b9e86b00b96c2a0094e80356b9e00740918100805200001891ff0316b9e86300b9652a0094e80356b9e0074091L16;FF4800805249feffb029912991e82707a948feffb008f92991ea0d8052ff2704a929feff9029d12591e82b09a90a0b8052e92b06a9290080d24", + "80380528910c0f2BBBBBL8;FB6c656420746f206465636f64652070726576696f75732073657373696f6e2070726f746f62756600000000000000000010000000000000000800000000000000L8;FF6b2501914a194b8b4a050091490109abc20400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914a", + "fd46d329010a8b290500913f010aebe9030054200108abBL8;FF080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb28170054e4000014080c43f81f0900b1010b0054f3031faa64000014L8;FF1f05007141890054e86353391f050071ac99005448b70035e90f41b", + "2c2050014eabb40f938fd78d35a7c085348fc60d35cfc78d3ebfcfff06b31029157fd60d3BBL8;FFa56c0194080f4039f703002a1f615a6be0179f1aa06c019408134039e902000a1f01336b7303090ae0179f1a9a6c019408174039f703002a1f01396be0179f1aL8;FFf35306f9f45b06f9e9ff02f9e90", + "703f9e80b03f955e7ff97e1a345f9810000b4e0a745f92200805283570094f37740f9e8c31791e00313aa0b53009468624039L16;FF687e01a92c000014960240f939008052950100b48bd70094e00315aa210080523800805283d7009420feffb4e10316aae20315aaf70300aa86d7009402000014BBBL8", + ";FFe93740f9093100f9e9060091e083c03c892200f90001803de083c13c0005803de083c23c0009803d12ffff1780c20091cf150094e9ffff17e00313aad5850094L8;FFe10313aa220080528b770094f49f49f99f0600b1e0a5ff54f5a749f9f3a349f9950100b47622009104000014b50600f1d6620091", + "e0000054c1825ff881ffffb4BL8;FFf44f02a9fd030091090c40f9160040f9f30300aa490100b4680a40f91f0116ebea33969a08010acbca0208cb34010aebc9000054e90316aa06000014f4031faaL8;FF210000b084dc43f921001e910000805273ce00a9640e00f9632200b9623e00f9614e00f9f30b4", + "0f9fd7bc2a8c0035fd600008012fcffff17fd7bbba9fd030091BBL8;FF680200f9ff0600f1cacbff54fb010014f7e74df9e80740910103198be00317aa08812f91acac0094e8f34df91f0900f160220154e0074091e107409102328052L8;FF46000014e04b05f9e0432a9121fdffd021203f91020280522", + "3fdffd063003a91040180528700001448008052e0632a39e8672a39c80080d20800f0f229000014L16;FFe8c702f900350054e8435039f7430d91e91742f9e012cc3ce0831d91e1e31c91e8031d39e81342f9f69f03f9f6831d912013843ce8ab03f9e9af03f974190094BBBBL8;FBbb1240000000000038", + "00000000000000b80100001d00000064656372797074696f6e206661696c6564696e7465726e616c206572726f723a20656e7465726564L8;FFe6ffff17f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0fdffb000003591db83009408a440a9e20301aae00308aae10309aae9830", + "014BL8;FF295541b9e91700b9081140f9fb2740f91f0900f1c9040054e23740b9a08302d1e103182ab58302d1b8dbff97c8fffff008213f91090200b029411f91e8c702f9L8;FF8d070094e80600d1fb0316aaf62f40f91f0900b15a008052a2000054e02b40f9e10317aa2200805283070094542500b49f", + "0600f1e0230054e10316aa9f0a00f1BBL8;FFc7ffff17a0031df841fffff02180059143fffff063e40491a0c300d1020380524401805209000014a0031df841fffff02180059143fffff0630c0591a0c300d1L8;FF808702ade95c0094e8430691a08303d1c1e200910283009123e3fe97e89341b91f0500", + "71610600542007c03de9b341b92143c23ce8c741b9f81f40b94003803dL16;FF08cf41f9f8c341a9ea0312aaedcb40a9e30317aae4031baaec0b45a9e95f4ca9fb0314aafadb4aa9e10315aae72f44a9ee031caae0bf46a9f40304aafe1b43a9BBBL8;FFf30308aae8030091e00309aa6a640094e9034039", + "e82740393f050071e1000054e92340393f050071cc020054a9030035ea0f41b223000014e9a340b868260039L8;FFe0031faa4a010b8b29010bcb0a2500a9fd7b43a9ff030191c0035fd6e80741b2e0030091e80300f9bc6dff97e10300aa20008052fd7b43a9ff030191c0035fd6BL8;FFb2ffff1788008", + "0d20800f0f208110091aeffff17e00300f9a1feffb021241691a3feffb063b01591e0030091620180524401805209000014e00300f9a1feffb0L8;ZDBBL8;FF220080528c270194f8ffff17d50000b4a806158be00314aa0201805201f17dd385270194745642a9950100b49622009104000014b50600f1d", + "6620091e0000054L8;FFe0031faa090540f90a0140f9290100cb4a01008be0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6c0035fd6fd7bbda9f65701a9f44f02a9L16;FF9cffff17ff8304d1fd7b0ca9fc6f0da9fa670ea9f85f0fa9f65710a9f44f11a9fd030391190c40f9892489", + "d24992a4f22ae379d32949d2f28924e0f2571119cbBBBBBBBBL8;FB353962342f7372632f76312f756e6368756e6b65642f73656e645f656b2e727300636c692f7372632f6c69622e727300083c6572726f723a20c0013e002f6361L8;FF000400ad8fa40094000980522100805288a40094c00800b4f803", + "00aa89a40094000480522100805282a40094a00700b43f030071a80e40f9a90240f96a139a9aBL8;FF810000b4c00640f9220080528a240194c10e40f9a1fdffb4c01240f92200805285240194e9ffff17681a40f9280100b4090d8052e00314aa017d099b02018052L8;FF2b0180520a0000144d254039b", + "f0500f1c80100548c1900126ce10c8b81fd0daa3f000beb030500544b018052e0031faa4a010b8b29010bcb0a2500a9fd7b43a9BBL8;FF680e00f9000400ad742200b9750200b9f44f44a9f51b40f9fd7b42a9ff430191c0035fd62000805201048052be600194ff4301d1fd7b03a9f44f04a9fdc30091L8", + ";FFc80080d20800f0f20809009147ffff17fd7bbda9f50b00f9f44f02a9fd03009148008052f503012ae10303aa000d002af30303aaf403022a1bfdff9795040034BL8;FFb3ffff17ff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091081c00121f09007181010054e00302aaf30302a", + "af40301aa3bf1ff9720020037L8;ZDBBBL8;FB73656e64657220636861696e000000009f1b400000000000340000000000000037010000220000004d414320766572696669636174696f6e206661696c656400L8;FFe81340f9938248f84901805209692138210400917f0a00b1e11700f961260054e80f4", + "0f91f0101eb00900054e81340f929040091e91700f91f692138d7ffff17BL8;FFe0031bade0e3803d48d776d3e0075badea03162a29dbda93a14302d1080d0aaae00314aa22008052a0873dade00759ad290dc0da080dc0dae9cb01f9e8cf01f9L8;FFe20315aae30314aa8c040094800100b50700001434", + "0100b48a040094e00314aae10315aa83040094a00000b528008052750600f904000014e00315aae8031faaBBL8;FFddffff1740ffffd000600691df40019440ffffd000600a91dc40019440ffffd000402f91d940019440ffffb000203c91d6400194fd7bbda9f65701a9f44f02a9L8;FFf7a700a9d742ff", + "97e00313aae1031faae20314aaa9020094770a40f9680240f9080117cb9f0208eba9fbff54e00313aae10317aae20314aaa0020094770a40f9L16;FFeb2b40f9e83357a9f8ef53a9e2c35da9e8ff00f9e8275ca9ed1b4ba9e02b44a9ec2717a9e9174ca9ef6741a9e9d300f9e97b43a9e97b00f9e9fb40f9", + "e9e700f9BBBBL8;FB6976696e675f656b43743253656e7443743253616d706c656473656e64696e675f63743200000000ef104000000000004e000000000000006402000013000000L8;FF4afd46d329010a8b290500913f010aeb29030054280108ab8300005410000014e80308abc2010054090840f909", + "0100b42a0140b24a11c0da4a1540d24a0d0a8bBL8;FF09050034290140b22911c0da291540d2290d098b2925019129fd46d3290500910a0840f94a0400b40b0440f9ed031faaec030aaa6b4100916e8541f8cf0140b2L8;FFa04700d127c2ff97f803002aa04700d124c2ff97e06700b9a04700d121c2ff9", + "7e06300b9a04700d11ec2ff97e05f00b9a04700d11bc2ff97e04f00b9a04700d1BBL8;FF680200f9fd7b44a9f32b40f9ff830191c0035fd61f09007181010054ea0f40f9090180d20900f0f248dd7892290140b20a000014ea474039090180d2e8031faaL8;FFe91700b9081140f9fb2740f91f0900f1c90", + "40054e23740b9a08302d1e103182ab58302d1f1e3ff97080000b008c10b91a900009029411f91e8c702f9080000d0L16;FFe1d7c23de01b823de0dbc23df9cb03f9e217823de107823de00b823d1b4e0094e8b345f9e0d7c23da8031ef8a0039d3c6002803d680a00f9980000b475da01a9BBBL8;FFfd830", + "091480001ab42030054010840a9e50304aa0a018052e40303aaf30300aae023009129f87fd31f0109eb0881899abf0400f1890080524901899a1f0109ebL8;FFe8cf42f92a040091c02202914901805209692138ead302f966280094e1431691210d0094e0a749f9800100b4e1d342f9e8cb42f91f0101eb", + "20460054e8cf42f9BL8;FFa10400b4fd7bbea9f44f01a9fd030091f30301aa14e0009104000014730600f194c201914003005481825cf83f0400b140010054810000b480025df822008052L8;FF03fc5f889f00036b2101005402fc038883ffff35f35341a9f51340f9fd7bc3a8c0035fd6621e00b9fbfff", + "f17bf3b03d5e3ffff172000009000201d9135000090BBL8;FF6b8109914902805260c1009109692138ead302f9ef1d0094e1431691ea110094e0df92b980010034e1d342f9e8cb42f91f0101eba0c60054e8cf42f909018052L8;FFe84701f9e0432a91d5eeff97f7ef41f9f6eb41f9f70000b4f50316aae", + "00315aaa1eeff97f70600f1b5c2009181ffff54e8e741f9c80000b40805088be00316aaL16;FFe007813d807ac03da98318f889565fa94083813ca2837bade81302f9e883029100a10191a103963ce91f02f9e01b813de217813de113813dc5150094e20fc13dBBBBBL8;FB1200000000000000130000000", + "00000001000000000000000160000000000000076657273696f6e20646f6573206e6f742066697420696e2075386d6964203e20L8;FF4901005448431b2a390700f1b51200910809c05a086821b821100091a1831ff861feff540a000014a06300d182008052230080522400805230c0ff97a0077fa9BL8;", + "FF46000094610a40f98affff17f50300aae00313aa2200805240000094610a40f9e00315aa92ffff17e00313aa220080523a000094610a40f9a1ffff17e00313aaL8;FF40a30091e1030191e2a30091e92304a9e80740f9e82b00f938ffff17e00301914201805223008052240080521df9ff97e12b40f9e", + "82340f9e81300f950ffff17BBL8;FF683300f9cb58019428e37a9222174092e00301910103088be2ff01398d5c0194fc03019123000014e10b40f9020308cb8003088b188100d13500028b855c0194L8;FFe1031faae8830cb9deffff17e18b0cb940ffff17a88357f8080540f9150101eb232c0054a8835", + "7f8080540f91f0115eb290b0054a02302d18af4ff97a0330037L16;FFbf0208eba9f3ff54e00313aae10317aae20315aa230080522400805237000094770a40f995ffff17e00313aa22008052230080522400805230000094610a40f9BBBL8;FFe00313aa017d099b02018052f44f42a9f65741a9fd7bc3a", + "8877c0114f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd03009113d440a9L8;FFfc074091f94315919c8301919f0600b1a0050054b8008052af000014e8074091f68f45f90023009108810991f40740919482099124d2ff97e1074091e0431691BL8;FF94fc0094b40a00f96182", + "00910000809274820091fbf800941f0400f1010300549ffedfc8610240f9810000b4600640f92200805280fc0094e00313aa01058052L8;FF150840f9080040f9f40302aaf30300aa080115cb5f0008eba8010054b40000b4680640f9e20314aa0001158b89fcff97a802148be0031f2a680a00f9f44f42a", + "9BBL8;FFab735638a95316384901084aaa835638a96316386901084aab935638a97316384901084aaaa35638a98316386901084aabb35638a99316384901084aaac35638L8;FFe00314aae1031baa220080528a3c0094ea5348a9fb0318aaf56b00f9c8fe60d3e95740f9f703162a35fd48d3f603082a500", + "00014e8e743b9ebc30d91ea0f42f9L16;FFfa031faa1f000014f4031faae8fb42f91f0500b180000054e8c31591000102914ec5ff9708008092740600f9687201a9e8fbff175b0080521e020014ea6700f9BBBBL8;FBf8a2296006a897900b70265932f53743a28ce620feb611bd363f000081ebda9d4950", + "a269a4d10129996f60636a2a0576d286d9af5166a96b08796ed2d1356d5bL8;FF6c7c8c0a8e7c8e0a0821094a690a0353af7c8f0acd7c8d0a701e08534a010b4a497c890a6b220953ce010f4acd010d4a6e320d53f07c900a29010c4a6c260a53BL8;FFea6306f9e87306f9e97706f9e7080194e1bb43f98", + "10000b4e0bf43f922008052850c0194e0833291e1032d91022b8052880c0194e1fb42f9f39b45f93f0400b1L8;FFf65745a9f85f44a9fd7b42a9ffc30191c0035fd6e0230091e10316aae20314aa23008052240080521ee9ff97f60f40f9e8ffff17ff4301d1fd7b02a9f51b00f9BBL8;FF2000805261028", + "052c748019420008052e1031aaac4480194082440a9e20301aae00308aae10309aaef480114fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9L8;FF7eebff97e103162a680640f9df0202710801148ba3feff54e90f80123f002071ea0f801229140033c20000542a7c0653090500394a051a320a010039", + "12000014L16;FFe0fb01f9e0031d91e8ef01f9e8fb40f9f21b02f9e8f301f9e8bb40f9f73302f9e8ff01f9e8ff40f9fa3f02f9e80302f9e89340f9ed4b02f9e80702f9e8db40f9BBBL8;FF8d6c01946002c03d680a40f98002803d880a00f9f44f47a9f65746a9f85f45a9fa6744a9fc6f43a9fd7b42a9ff", + "030291c0035fd62000805201048052ba680194L8;FFe90f02f949048052e82719a9e1031091e3430691e8271aa9c8fdffb008c11a9142008052e8db00f966fcff970a0380d2c8fdffb008a91b91690480520a00f0f2BL8;FFe08742ade267803de8531aa9e08709ade28343ade2830aade18340ade18307a", + "de28341ade28308ad002300b4e87b40f91f0500b160000054e0c30391abf7ff97L8;FFfd030091f30b00f9f30300aa018c40b9a102f836611640f9601e40f93f0000ebc0000054632640f9e00313aa020080d2010080d260003fd6618240a93f0000ebBBL8;FFe9234fa9e082c33c00630291e82703a9f62", + "351a9e95750a9a0839d3ca8031df8e8a30391e92700f9dec7ff97e8630191e0a30391a1c300d1f46301912edaff97L8;FF8101005408018052baffff17a0c300d101048052e2031baaf70315aaf50314aaf40316aaa5eaff97b9db7da90bfcff17f6e742f9fb074bf9f90b4bf9fc0f4bf9L16;FF90ac0094", + "001080522100805289ac009480e1ffb52000805201108052c2a80094e0031f2a2d120094e17342f9fa03002ae1f4ffb5a9ffff17c80600b1e2160054BBBBBBL8;FB7468207072654b657949643a20c00020636970686572746578742076657273696f6e2077617320746f6f206f6c64203cc0013e001e756", + "e7265636f676e697a65L8;FF680100d008210091a22300d10021009121008052e3031aaa04fefff084e00c91e80b00f9bc831ff8b39c009468034039a0024079e103132a1f050071e1f5ff54BL8;FFe10b00f90800f0f2080900d10f000014c80080d2a1831df80800f0f2080900d11a000014e80b41b2e0", + "0b00f907000014e80b41b2a0831df814000014c80080d2L8;FF8c200094800400b448fdff9008fd0391f60300aa090140f9086140f8090000f9086000f8b70000b4e00315aae10317aa2200805280200094ca018052e9031f2aBBL8;FFa5000014a0a300d1e26e0094f40301aac0ed07363d000014a0a300", + "d1dd6e0094e80300aae00301aa68f8073680f5ffb420000014f5031faaf7031faa18008092L8;FFf44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd6e0230091e1031faa76ffff97a9ffff17ff0306d1fd7b14a9fcab00f9f65716a9f44f17a9fd030591L16;FF3f08007121040054888244f81f0", + "500b1810000549fde04a99ffe05a997fe06a981220191e20313aadaefff97400900b5e1031faad6ffff17e10314aae20313aaBBBL8;FBdca346000000000018000000000000000800000000000000f0a34600000000006ca44600000000007ca54600000000006877636170206e6f7420666f756e642fL8;", + "FFe0630091e1031baae20319aa230080522400805239a4ff97fb1740f9e80f40f908011bcb3f0308ebe963ff54e0630091e1031baae20319aa2300805224008052BL8;FFc0feff9000803991c2fefff04220039121028052d0fc0094c0fefff000000291dafc0094c0fefff000600291dafc0094ffc300d1", + "fd7b01a9f44f02a9fd430091L8;FF2301f8b7f30303aac10100b4e00302aa22008052e30313aa88000094000300b50e00001428008052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6BBL8;FF3f1800716c0300543f140071e00500543f18007161080054a8835ab848000037b9831af8e1d2", + "0191a22301d1d9c5ff97e0f7ffb4660000143f0c007160050054L8;FF69d20391e83342b960620491e16303910227805276f200b960428f3c681601b92105803d8b40009424000014e8030d9114000014687240f9481600b40805088bL16;FF1f2d00f1f5c31591edc3139108318a9a4afefff04ac10a91c", + "b0000104c7968786b090c8bf7430d91fb0300aa60011fd6760740f9df0a00b1c03a0054df0600b1BBBBL8;FB0b00bfd78bf5c716bfc7d674adae2be49ebf5e8bd71c0000efa3893d5195177804010a82858c137a8600c502a9ff2ee5a4198354eacc567290a06a1d2a78c564L8;FFc0035fd608100091200", + "440a9a94300d1eaffffd04a811a91a8031ff8c2fdfff042142c91e92b01a9e3430091c38c0094fd7b44a9ff430191c0035fd608feffd0BL8;FFe12f833de233833dd0f4ff97f3f742f9e8ef42f97f0208eb61000054e0631791b9aeff97e8f342f909068052e02fc13d6822099be133c13de237c13d18000", + "014L8;FF745a00a9740a00f978620039f44f45a9f65744a9f85f43a9fd7b42a9ff830191c0035fd6ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9BBL8;FFf53f00f9935001943f0700b1f94702f960000054ff5f08a904000014e84b42f9e94f42f9e82708a9e0230091e2030291e", + "10315aae30314aa8e020094e84742f9L8;FF0a2440f9aa0600b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4b0500910a3040f96901098b0a0100b44b0140b26b11c0da6b1540d26b0d0b8bL16;FFe85740f9e85f04f9e86f40f9e86304f9e85f40f9e86704f9e8e340f9e86b04f9e85b40", + "f9e86f04f9e80740f9e87304f9e83f40f9e87704f9e9235ea9e97b04f9BBBL8;FFe083c13c2005803de083c23c2009803dab000014e80741b29b000014f403042af60303aaf50300aa5f2800f1880000542800028b08f1df38682ef837e0230091L8;FFe102005428008052c9fdffd029e13f91ff2300a90", + "8048052a06300910800ac72e1630091a21b00b9e92302a9e8030091ff2301a9a926ff9740030035e003c03dBL8;FFe10300aae00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6e20313aa030c8052eaf6ff97e10300aac0feffb5a80640f91f0116eb69030054e00313aaL8;FFf92340f9580000", + "1400231f91110300947bffff17e10314aae003132af3fcff97f703002ae000f83720030e91f57e409302cc338b130c40b9562840f9a0ffff17BBL8;FF8017005440c30391af170094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb2816005426000014fa031fa", + "af69f49f9L8;FF20a10b91b02cff97e8034bf9fc074bf9fb0b4bf91f0500f121010054881f00121f0500718c030054c80900359b1f4092fa0f41b2e8031baa540000147f8702f1L16;FFfdc30191280441f9f30301aae20300f95f0008eb81040054f60300aae023009161420691b3000094f58b44a9e003", + "16aaf7e345a9e083c03ce8d343a9e183c13cBBBBBL8;FBac2f420000000000a1104000000000004d00000000000000e802000005000000a1104000000000004d000000000000005303000009000000a110400000000000L8;FFc0035fd600fefff000603b91df94009420feff9000e00391dc94009400fef", + "fb000a00d91d9940094090040b9e80301aa0afefff04a713d91e00308aa42008052BL8;FFe80301aae00700f901ffff9021602c9104ffff9084e02b91e3230091e00308aa62028052b8140194fd7b41a9ff830091c0035fd6fd7bbfa9fd030091082440f9L8;FFb50000b4e0031caae10315aa2200805289", + "180094e19341f9810000b4e09741f92200805284180094e0431391e10313aa0228805287180094e8270491e1431391BBL8;FF17020034e8030091e10314aa9802028b0001178b8f580194e83340f980030191e10300912200805208050091e83300f9c0540194ffff0039f50316aaf40318aaL8;FFe94313", + "3919000014e033c33de1d3c23de9c31291e8ab45f9fc5b02f9e037813d2181803ce86702f910000014c80080d2fb4340f9fa8302910800f0f21c450091L16;FF2401805244ffff17e06301f981feffb0218c139183feffb063341491e0030b91a2008052c40080523bffff1781feffb021c8119163fefff0", + "63400291a08311f8BBBL8;FF7c0240f9ff6b00b9ffeb00a93f7f01a93fff02a9fa1700f9fa2300f93f7f04a9faff05a9820740f9423500b4810340f9370080395704f8b728040091490400d1L8;FF1f2500f128230054e9fdff9029b112918a0000102b7968784a090b8b40011fd6f37749f97f0600b1e00", + "20054e18f49f93f0400b140010054810000b4e09349f9BL8;FFa80000b4607240f901f97fd34200805289f80094687a40f9a80000b4607e40f901f97fd34200805283f80094688640f9a80000b4608a40f901f97fd342008052L8;FFfa6741a9fd7bc5a8c0035fd6e0031f2af9ffff17ff0301d1fd7b02a9", + "f44f03a9fd8300913f0440b1e2020054080840a92a044091f30300aae023009109f97fd3BBL8;FFfb1300f9010140b2923801948d380194200580522100805286380194007901b449ffff9029150991280f8052200540ad08800039c80ec0dafc0300aa01048052L8;FF6c0100543f040071600300543f08", + "007161020054a1e20391a22302d154f3ff97802a00b5e1031faae7ffff173f0c0071800300543f10007121010054e02c00b5L16;FF681e08a9e8f240f8699207f8e9af40b9685200f9e8a341f960828d3ce0afc03d688a18a9e87740f9022980526942023978a21aa9e85340f960828f3ce08b53adBBBBL8", + ";FB6c3544000000000054727946726f6d536c6963654572726f720000000000000042024000000000006a00000000000000f30000002e0000004202400000000000L8;FFe83f40f91f0500f1ab000054e04340f901f97fd34200805287880094e84b40f91f0500f1ab000054e04f40f901f97fd342008052", + "80880094e85740f91f0500f1BL8;FF2183c43c29610d912283c53cea670a91200500ad2083c63c414fc03de8bf01f90800f0d2220101ada90359f841f18f3ce9d701f9fbc301f9f5c701f9f7cb01f9L8;FF1fb500710018005458000014880240f929cd8d52298dae72080140b91f01096b01480054810a4", + "1a9e0e306919b6a42a987f7ff97f9df40f93f0700b120470054BBL8;FFc0020054e0430591e1030091022880529048019417000014880080d2e00700f90800f0f207000014e80b41b2e20700f904000014880080d20800f0f2080140b2L8;FFe89741b92083c13cec030b918033803da10900548031c03de", + "8c302b98b4100f8204b803d8ac100f8204bc03de8d342b989fdffb029c12b918101c03de01b40f9L16;FF21400891e19f833de2a7833de0ab833d90c80094e0032b91012b009183400094e8e33b91e0032b917c3e0094e87f47f91f0500b1004d0054e0031d91e1c33991BBBL8;FF6d4a00396a6a0039ea6", + "340396c5e00396b32007969b201f86a8e0039f44f44a9f51b40f9fd7b42a9ff430191c0035fd67f0200b9f44f44a9f51b40f9fd7b42a9L8;FFe0db04a9f70400b4150340f9f60300aa080014eb23100054ff0208eb09010054e0e30091e10317aa220080520d67ff97f42344a91f0114eb23100054e81f40", + "f9BL8;FFc2070054217c0353e10700343f040071a00200543f080071000100543f0c007100fdff54e20313aa230c8052e8eeff97e10300aae8ffff17888241f81f0500b1L8;ZDBBL8;FFc01c00b428ffff90084107911a0380d20001c03d08f140f8e90280521a00f0f2e98316a90000803d08f000f8e9bf", + "00f9e81f40b9e8030639e10740f961cdffb4L8;FFff0208eb20020054080680528002c03d890a40f9e862089bea060091ca0a00f9135500a9130900f90081813c091500f9f44f44a9f65743a9f85f42a9fa6741a9L16;FF600b0054e96e41a9fc1240f9f50640f93ff97af2a10800549f0600b120060054f", + "62640f9dffa7af2010e0054f5a600a9e91640f9ea3240b939c30191fbf201a9BBBBBBBL8;FB3a20c0001b737071722076312e73656e645f656b2e726563762065706f636820c0022d3ec0273a20456b53656e744374315265636569766564202d3e204e6f48L8;FFd19e0094ff4302d1fd7b03a9fc6f04a9", + "fa6705a9f85f06a9f65707a9f44f08a9fdc30091f503022af40301aaf30300aac11300b496fa7fd382a20094e00316aaBL8;FF280800f90202005400fc47d3c7000014e10300a9e00301aae10308aa220080523e060094e10340a92aa040a9290040f91f1040f15369283808050091280800f9L8;FFe1031", + "4aa220080528b220094f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6090345f80003c43c680200a9e81f40f9745603a9692a00f9e91340f9BBL8;FF8d620194b80000b4e0031caae10318aa2200805288620194b60000b4e00b40f9e10316aa22008052836201949b0100b4e00314aae1031b", + "aa22008052f44f56a9L8;FFe00313aae10318aae20316aa7b010094780a40f9680240f9080118cbdf0208eba9f7ff54e00313aae10318aae20316aa72010094780a40f9b7ffff17e00313aaBL8;FF49efff97e80300aae00301aa08020037750240f9a80640f9160100eb62020054e80f41b2e80300f9070", + "00014c90080d248008052e02300390900f0f2e8270039L8;ZDBBBL8;FB8b8b40000000000000001b1b1b1b1b1b1b1b1b1b001b1b1b1b1b00131b1b001b0000070000000000000000000000000008c9bcf367e6096a3ba7ca8485ae67bbL8;FF0811c0da081540d2080d088b0825019109fd46d30800098b0", + "80500911f0109eb28260054e0fdff9000a00d91d77e0094e8031faa000117ab02720054e1630091BL8;FFa5170194882e4039692e4039aa02000ad6020a0a1f01096be0179f1a9e1701948832403969324039f503002a1f01096be0179f1a981701948836403969364039L8;ZFBBL8;FFfd7b43a9ff03019", + "160001fd608200091200440a9e92300910a0000904a213f91e8a700a942ffffd0421c3191ea0f00f9e3430091c13e0194fd7b43a9ff030191L8;FFa7000014c80080d20800f0f2080500d1a0c300d1a8031df8c048ff97e10300aa7a000014e00700f981fdff902120179183fdff90637c1791e0230091a2", + "008052L16;FFe8270ea9fadb4aa9ef3b47a9e03740f9f88f41a9f57b40f9fc0748a9e45f40f9f7ef49a9e8174da9f9fb42a9ebb344a9edab40a9e69f43a9e9474ca94f010014BBBBL8;FB49000000000000000f010000140000003d04400000000000490000000000000018010000100000005369676e616", + "c205051205261746368657420563120436861L8;FF280108aba2060054694240b93f0500716102005469aa4829c9030034290140b22911c0da291540d2290d098b2925019129fd46d3290d00910a0300344a0140b2BL8;FFe10313aae20314aaf50300aa91120194f6b340f9961600b4f3af40f989120194", + "e00316aa2100805282120194c01d01b4e10313aae20316aafa0300aa85120194L8;FFe8fb0379e8a34c39eafb01b9e8c30739e8ab40f9e9f700f9a80000b4e09740f9e1ab40f92200805283120094e8bb40f9880000b4e08756a9220080527e120094BBL8;FFc0035fd6e0230091e1031faa220080522300", + "805224008052f7ddff97e02341a9a1ffff17e0230091220080522300805224008052f0ddff97e10f40f9b7ffff17L8;FFf30303aac10100b4e00302aa22008052e30313aa89520094000300b50e00001428008052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6d30100b4L16;FF09a0c0a90", + "a0c41a90078c03d043c4da9e94700f912184ea9e86b00f9092042a9e0b3823d101452a9e8bb00f9087043a9ea231fa90a2044a9e8cf00f90b2045a9BBBL8;FF2300805224008052fbfdff97770a40f9680240f9080117cbbf0208eba9cbff54e00313aae10317aae20315aa2300805224008052f0fdff977", + "70a40f955feff17L8;FF220080527d110094e1d342f9fdfdff17e04316912200805278110094e1d342f963feff17e04316912200805273110094e1d342f9abfeff17e043169122008052BL8;FF4b692838080500911f0048f1280800f9a202005400fc4ed354000014e00700f9e00301aaf30301aae10309", + "aa220080522300805224008052f4030b2a2f160094L8;FFfa0180925a031bcba1000052e0c79f1a7b4300915a03038a1f00016a5a031b8b610d0054e1031aaa050080d2040080124304805262008052000080d293040094BBL8;FF810000b4e0ab49f9220080528a320194b30000b4e07b49f9e10313aa22", + "00805285320194e18349f9810000b4e08749f92200805280320194e18f49f9810000b4L8;FFf44f42a9fc5741a9fd7bc3a8c0035fd6e8434e391f110071c00100541f0d007101f9ff54f4d341f9f3cf41f9880240f9680000b4e00313aa00013fd6810640f9L16;FFff8317d1ff0300f9f40301aa28ec40f", + "9e20700f95f0008ebe10a005480064dadf50302aa8366c03df30300aae0a301918182079102328052f60303aae00701adBBBBBL8;FB63757272656e744b7962657231303234206b657970726f746f62756620656e636f64696e672077617320696e76616c69646e6f206b6579207479706520696465L8;FF", + "a80317f8cb96009428e37a92b9f31438a0c303d18102088be20319aaf90b40f98c9a0094a8f354380c088052fc03082a82011ccb350302eb62f8ff54b5c303d1BL8;FF59fcffb535008052572340f9b6831ef8b8431fb877fdffb534008052582f40f9f8f6ffb4532b40f9861a0194e00318aa210080527f", + "1a0194200500b4e10313aaL8;FFe1031aaac30d0094fb6f42f9e17342f9e807409108411d91e0031baa66190094f7ab4bf9ff0600b140240054e8af4bf9f9b34bf92c008092f7a319a92c010014BBL8;FFe083ca3ce183cb3ce283cc3c77ca00b968ea00b9a8835af869da0179a9035b78a8031cf8a9831c", + "78e9a341a9600604ade083c63ce183c73c622a803de283c93cL8;FF08078052e97b06f9e9c32291e86706f9280080d2e97f06f9c9048052683bc0f2ff5306f9e95b06f9ff5f06f9e97306f9e87706f9dd560094f3f742f9e8ef42f9L16;FF404000b5e1031faabaffff17603a00b5a0c303d144e7ff97e80", + "301aa00040036883a00b5e1031faab2ffff17c1220191a2c303d158e6ff97603d00b5e1031faaBBBL8;FFf44f44a9fd7b43a9ff430191c0035fd6e80741b2e9ffff17f40301aa1f2900f1880000542a01088b4af1df384a03f837e0030091e10309aae20308aadd2b0094L8;FF4a1540d24a0d0a8b4a2501", + "914afd46d34a05009102000014ea031faaeb7b52b97f05007181010054eb7f52b9ec8352b98b0700346b0140b26b11c0da6b1540d2BL8;FFe10313aaf40308aa4cffff97e82340391f050071e1030054e093c03ce81f80528002803d88420039f44f45a9fd7b44a9ff830191c0035fd6690240393fed0171", + "L8;FFe903891aaa018d9a6b018f9acd01096a6e0168b26f0569b270096ab2ce118b9abf010072ed118b9a0b128b9a1f004af20f781753ab018b9a1f004bf2cb018b9aBBL8;FF46ffff90c6e03b912a01805247ffff90e78c3c91e00308aa6201805204018052e9af00a9ea0300f9b8360194fd7b42a9ffc3", + "0091c0035fd6ff4302d1fd7b04a9L8;FFe6031f2a10f1ff97e83b41f9fa6740f9f94308911f0900b181830054a80000b0081140f91f0d00f143070054e8830f91e0432a91a0d4fe97e8f341f91f0500b1L16;FFe0bf43f9e3035e39e4c743f9e5cb43f9e7d743f9ed5300f9ed6f40f9e25b44f9f66344f9f", + "86744f9fa7744f9fe030daaf94740f9e3b7803de87700f9e8008052BBBBL8;FB1d1c400000000000540000000000000079000000050000001d1c40000000000054000000000000007f000000050000001d1c4000000000005400000000000000L8;FF8c8a0094401000b4f70300aa8d8a0094e00315aa410", + "08052868a0094800f00b4f80300aa878a0094e00315aa41008052808a0094c00e00b4f90300aa818a0094BL8;FF42008052f35306f9f45b06f9e9ff02f9e90703f9e80b03f91cdfff97e1a345f9810000b4e0a745f922008052820a0194f37740f9e8c31791e00313aa0a060194L8;FFf65741a9fd7bc3a8", + "c0035fd60001805201048052c3060094281040b96800c8376800d037f1060014e2060014e3060014ff0302d1fd7b02a9fb1b00f9fa6704a9BBL8;FF400300543c8740f9371341b9381741b9282341b9e82f00b9fc0300b4348340f9884a0194e0031caa21008052814a0194e01400b4e10314aae2031caae", + "01300f9L8;FF080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0daL16;FFf5bf03f9e8b703f9e8ff40f9facb03f9e8bb03f9e8db40f9fbd303f9e8c303f9e8cf40f9f1d703f9e8c703f9e8c340", + "f9e4df03f9e8cf03f9e8d740f9f4e303f9BBBL8;FF08c93191682b05a98a068052480480527f2700a989fffff0297d2e91692b02a9290080d2c91dc0f2687f01a9682704a9de660194f47f40b99f03146bf63b00f9L8;FF810000b4601240f9220080528a6a0094611a40f9810000b4601e40f9220080528", + "56a0094e00313aa080c49f81f0500b14000005404010094745a45a9f60000b4BL8;FF1f09007181010054e00302aaf30302aaf40301aa44f7ff9720020037750240f9a80640f9160101eba2020054e80f41b207000014890080d248008052e0230039L8;FFe90300aa1fbd00383fcd0038e80300aae90300", + "aa1fdd00383fed0038e80300aae90300aa1ffd00383f0d0138e80300aae90300aa1f1d01383f2d0138e80300aaBBL8;FFa949c0f2e87f1aa9e8271da9e7260194e80342f9e92350391f0100f1e8179f1a0101090a24000014e1031f2a22000014882245b8e92f4379eb4746398c9246f8L8;FF2c7c10532b", + "2c0633ec0000352a7c0c530b050039090900394a091b320a010039080000142c7c12532a440c330b090039090d00398b6d1c320a0500390b010039L16;FFe0ffff17e023009102048052230080522400805239ceff97e10f40f9e5ffff172000805201058052bfa60094fd7bbea9f44f01a9fd0300911400", + "40f9f30300aaBBBBBBL8;FB3938352f6c6962726172792f616c6c6f632f7372632f7374722e7273002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934L8;FFfc1700f9800d0054e85a199b1b0940f975fb7fd39b0400b41c0540f9899e0094e00315aa21008052829e", + "0094400e00b4e1031faab5833ea9bf831ff8a8835ef8BL8;FF2200805245020094610a40f9680240f9deffff17e00313aae10308aa220080523e02009469aa40a9dfffff17fd7bbda9f50b00f9f44f02a9fd030091f30301aaL8;FFf40308aae103172a0b120094b50f7fa9e0630091e10316aae20315aab", + "f0f0094fae341a9f9ef42a95f0b00b1e1020054db0300b4b80000b4e00319aae10318aaBBL8;FFe00314aa2100805235008052895e0194600000b5f6ffff1720008052b4833ea9e0230091a16300d1b5c300d1bf831ff814eaff97680240f9a083de3ca9835ff8L8;FFe8b70db9e80740f9e9b30db9e93f4", + "0b9e8df06f9e82740b93f010071e9eb0db9e8c30db9e80340f9fb8706f9e8eb06f9e81740b9f98b06f9e8e30db948008052L16;FF23008052240080523c020094610a40f9e00315aadfffff17fd7bbca9f85f01a9f65702a9f44f03a9fd03009148008052f50301aae10302aa000d002af30302aaBBBL8;Z", + "BL8;FF9c830191f9431591927e0094e8a344f9e04fc23d890a00d19f0600f1ea008052eb672191e8b704f928818a9ae9fdffd029011291f4ab04f960f18f3c8a000010BL8;FFa20700d161058052cffa0094ffc300d1fd7b01a9f44f02a9fd430091f30300aa93020037614200910000809274420091f4fa", + "00941f0400f1010300549ffedfc8L8;ZFBBL8;FF000940ad0109c03d08e142f80108803d08e002f8c8068052680201a9681200f96800805268a2003908008092000800ad682600a90e000014e08745ad08008092L8;FF220080528c3e0094fc432a91b50000b4e00314aae10315aa22008052863e0094753", + "642f9b60e49f8863e0094a0028052210080527f3e0094405501b468fdfff0L16;FFe1031aaa220080528bbe0094e1cf41f9810000b4e0d341f92200805286be0094e1db41f9810000b4e0df41f92200805281be0094e8031faae9031faa291d4092BBBBL8;FB816f443e29147616b47240e1051b0595e833", + "0bdda28c749d80e100009519f91165044fb8612e25ec7d294fe76f6a0a95624a3943df5d95600f26e72afff0c709L8;FF5f21296b2905009140ffff54670300143f1300f1f93300f9ed0600543f8700f1330080528c0d00543f1700f1801800543f7b00f1c1130054f70314aa818e0094BL8;FFe1feff902", + "1203f9102028052e3feffd063941e91a4028052af000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f9b9140094e10300aae15306f9L8;FF21008052370080528a0e0094e0feffb4e10316aae20314aaf50300aa8d0e00940c0000143500805228008092755201a9685200a9f44f46a9f657", + "45a9f85f44a9BBL8;FF08010251e900f8374a00805208a800a91f0000f9fd7b44a9ff430191c0035fd61f114071c30f00542908c0392a1d001208390a0b08114051e900f8376a008052L8;FF5a000014e80300aa098d40f83f0500b1e0120054f30300aae00308aa06fdff97e80300aae00313aa090140b2", + "2911c0da291540d2290d098b2925019129fd46d3L16;FFea2318a9e84742f9ea4342f9e8b700f9e84b42f9ea2711a9e99b42f9eabb42f9e8cb00f9e84f42f9e8eb00f9a8a20791f5a742f90001c03de85f42f9e82f14a9BBBL8;FF680a00f9f44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd6ff", + "4301d1fd7b02a9f65703a9f44f04a9fd830091f40301aae10302aaf30303aaa26b0094L8;FFa0420035fbef41f9e6f341f9e8430691e32b40b9fceb41f9e0e30091c1e20091e2830b91e403182ae5031baaf81f00b93903ff97f89341b91f0b0071a1070054BL8;FFf30300aa22008052e00308aa8aee009", + "4e00313aae01300f9a1fefff021541291a3fefff063a41291e0830091220280526400805248f4ff97e11340f94cffff17L8;FFa10e00913f7c02f121fc44d322040011c90300542104009129c59c5269eda072e2fcff90207c0253424014910004412ae7fcff90e8a011910008402a0010402aBBL8;FFe20", + "7409125ffffd0a520039142800991e0031f2ae3031faa340a0094e0431691220080523d120094e1d342f9f2f9ff1748074039e207409120ffffd000980991L8;FFe80356b9e8ff3f39e807409108011891d82a0094e1074091e0833f9102c48052210018918b2e0094e00bc73de10fc73da0873dad832e00", + "940004805221008052L16;FF18000014611a40f9080080921f200039080000f93f0400b140010054810000b4601e40f92200805283ae0094612640f9810000b4602a40f9220080527eae0094BBBBBL8;FB42024000000000006a00000000000000020100002e00000042024000000000006a000000000000", + "00440100001c00000042024000000000006a00000000000000L8;FF22008052080d17aaa0073ead080dc0daa88318f8a2837bada2033fadc592009400e4006fbff31838b0c302d1a8277229aa2f7329ac377429a0033ead0809c05aBL8;FF080d088b0825019108fd46d315050091681a40f9080a00b4080", + "140b20811c0da081540d2080d088b0825019108fd46d316050091770a40f9570900b4740640f9L8;FFe06b00b9a04700d126c4ff97e06700b9a04700d123c4ff97e06300b9a04700d120c4ff97e05f00b9a04700d11dc4ff97fa03002aa04700d11ac4ff97f603002aBBL8;FFb400f8b6f7031faae00317a", + "ae10314aac5520194f75b04298a560194e00314aa210080523700805282560194e0feffb4e95740b988008052f60300aab4033ba9L8;FFc952009420008052e10319aac652009420008052e10313aac35200942000805221028052c0520094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9L1", + "6;FFc20100143f03086b02010054080180520900809268220039690200f99f0600f12a0500542c000014410300545f0f00b1e0030054e0830591e1030091022c8052BBBL8;FFfa6702a9f85f03a9f65704a9f44f05a9fd03009148008052f40301aae10302aa000d002af30302aa70fcff97e00314aa2832", + "0094e10313aa6cfcff97950a40f9L8;FFf6074091d68209911f0101eb807a0054e8cf42f92a040091c00202914908805209692138ead302f932290094e14316911d0f00949f0600b180000054c0020291BL8;FF220080528cf6009461d640f9810000b460da40f92200805287f6009460220091f30b40f9f", + "d7bc2a8bbfdff17fd7bbea9f30b00f9fd03009101c840f9f30300aaL8;FFfd030091f35301a9610000b4027cc19b220400b5337c009be00313aa31000094f40300aa600400b4210000b021d047b9c10300347ffe3ff1690400549302138bBBL8;FFe8074091e0c3009108810991325f0094e83349f94083c", + "03ce93f49f91f0500b1e067813de9d302f960200054e0abc43de1a7c43deac33391e2a3c43de95b49f9L8;FF3f0400f1ebf3ff5408028052e06a68f822008052883600949affff17c80080d20800f0f2080900912effff17fb6b4ca9f9430891f8c30d91f7432a91e8f341f9L16;FF81825ff881ffffb480", + "0240f92200805289b60094f8ffff17dc0000b488071c8be00315aa0201805201f17dd382b60094e86f40f9790600f97a2201a908008092BBBBL8;FB6e72656365697665725f636861696e7370656e64696e675f7072655f6b657972656d6f74655f726567697374726174696f6e5f69646c6f63616c5f726", + "5676973L8;FF9ffe003988264d298a2e4e298c364f29e00300ad0809c05a2909c05ae00301ad8e3e5029e003c03de107c03de20bc03de30fc03d830e803d820a803d8106803dBL8;FFe0234ea9e16340f9e22340f9081540f900013fd6e03b02f9e8031691e13f02f9290c40f9e103129120013fd6fbc342", + "f97f0f00b1410a0054a8008052a8ffff17L8;FF400d0037e00316aae10317aa220080528906009406000014228f7fa920008052e1031faa31020094c00c00375ac300f139c3009101fcff54f6e742a91a058052BBL8;FFa2018052e4008052534c0094b8835cf8e1034ba9fbf34ca9f9274ea9f6a34fa9e8", + "a705a9180300b43f0400f16b00005422008052804601947f0700f1ab000054L8;FF02c1853c438942ad01c1823c00c1813c02c1843c03c1833ce80b40b9400504ad418147ade8a700b9e81340b9430905ade4838a3c8001803de8d302b9214b803dL16;FFe9af00f9e9f343f9e97700f9e9fb43f9eba710a", + "9e9ff43f9e9b700f9e90344f9eaa718a9e90744f9ea0f44f9e9eb00f9e90b44f9e2a712a9e91344f9e98f00f9BBBL8;FF88ffffd0083138918902805222000014e89343b8e93f40b9e0830091ebab44a9e1e30091a80319b8e863413909b306b8e92340f9e8230039a8f31a38a8c301d1L8;FF290040f928", + "0800f93f0108eb20010054290440f90a050091206928382a0800f9f44f42a9fd7b41a9ffc30091c0035fd6f30300aae00301aaf40301aae10309aaBL8;FF631015910f000014e00300f9a1feffb021e8149183fefff063900291e003009142018052840080521a000014a1feffb021e81491a3feffb06344", + "0f91e00300f9L8;ZDBBL8;FF8d260194682640f9a80000b4602a40f901f57ed34200805287260194683240f9a80000b4603640f901f57ed34200805281260194683e40f9a80000b4604240f9L8;FF611a40f9c1fdffb40804805205000014611240f93f0400f12bfdff5408028052806a68f822008052832", + "60094e4ffff17fd7bbea9f30b00f9fd030091010440f9L16;FF281c40f9080102ebe3040054290c40f91f0109eb82040054e80328aa280108ab831e005429ac40a92a0040f96801088b1f010aebea338a9a08010acb0a0e8052" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines0 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines1.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines1.lean index 8b686aadf..d8babf1ac 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines1.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines1.lean @@ -27,362 +27,253 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub1 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF5f0109eba0060054ef030aaa5015c038e8030baa0e1e0012b0feff36ea054039df8103714b150012c3fdff54ea094039dfc103714a1500124b190b2aca110012L4;FFc000009000403d91ad200094c000009000003791ad200094c000009000603791a7200094c000009000c03791a420", - "0094ff0301d1fd7b03a9fdc30091080040f9L8;FFf85f04a9f65705a9f44f06a9fdc30091280c40f9880100372a2440a9092001a98802009008212091082800a9f44f46a9f65745a9f85f44a9fd7b43a9ffc30191BBL4;FFe08743adf80300aab40600111b04805216048052000400ada2a00194e00316aa", - "21008052a0a00194802300b4e10318aae20316aaf30300aaa6a00194e10e40f9L4;FF016861f8260840f97f0006eb80000054000080d21f000039007d20d427804039e31000125f00036b4cffff54231840b96324c21ae3fe0737231c40b96324c21aL8;FFfd830091140040f9e00301aa810100d021bc19", - "91e8230091c2018052f1a0009488c20091810100d021f41991a40100b084a00b91e0230091a32300d162008052BBBL4;FFcfe001941f100031218c0054f9ffff17cce00194f70300aa1f0400b141fdff54e043059181008052c7e00194008b0035e85341b9e87700b957ffdfc8d70200b4L4;FB4b0000000", - "00000007f0b00000e0000004572726f72414349504e491972616e676520656e64206f7574206f6620626f756e64733a20c004203c3d20c0002f6361L8;FFe00308aa6a0200f9ff074091ffc30091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8a4dcff17e0430f91f40301aa212000910242", - "8052a5e00094BL8;FF0001805201068052c2600194fd7bbda9f50b00f9f44f02a9fd030091f40302aaf30301aaf50300aa9e60019400078052010180529c600194600100b48002c03dL8;FF440080521a000014a0031df8210100d021843a91230100d063ac3a91a0c300d1420180524401805211000014c", - "80080d2a0831d38a0c300d10800f0f2bf931d38BBBBL4;FFff0301d1fd7b01a9f65702a9f44f03a9fd43009109304039c90b0037150040f9f30300aa160840b9a21300d1f40308aaa00642a9b6c31fb8abfbff9708fc79d3L4;FFf44f03a9fd830091010840a908018052f30300aae023009129f87fd33f2", - "100f13481889ae30314aa0c000094e80740f91f0500f1e0000054e80b40f9742200a9L8;FF29010bcb0a2500a9fd7b43a9ff030191c0035fd6e80741b2e0030091e80300f9c3f5ff97e10300aa20008052fd7b43a9ff030191c0035fd623010094fd7b43a9BL8;FF010300d021242291240300b084600691", - "a32300d122018052a8831ff8f280019488c20091010300d021482291240300b084e00691a32300d182018052a8831ff8L8;FFe10317aae20316aa0001188bb18000940803168be81700f9803640f9800100b4e11740f9e80f40f91f0101eb40850054e81340f9090580522a040091ea1700f9BBBL4;FFe02", - "30091f49b00f9bb370094f40300aaa000f8b6f5031faae00315aae10314aab1c00194140100b49ec00194e00314aa21008052350080529bc00194600000b5L4;FB6f75626c65205261746368657420666f7220746865736500a3794900000000003800000000000000ca0100001d000000a3794900000000", - "003800000000000000L8;FFe20bc13de107c13df66b00f9e28305ada00b7bade12b803da103d83cfc8f00f96083843c6083c23c6183863c6183c13c6283853c6283c03ca1033aade10348adBL8;FF030000141f404071d536969ae80740f9080114cbbf0208eb28040054e80b40f91f0002710801148b03f", - "dff54e90f80121f00207109140033c20000540a7c0653L8;FFe81f40f9e10315aae20317aa0001148bb0400094e90344a9080009eb630e0054ff0208eb68080054340117ab420e0054f42300f9090740f9280117eb03080054BBBBBL4;FFe90b41b2e9a300a908000014e80b41b2a0831df8130000148800", - "80d20800f0f2080140b2e80700f9e0230091c0050194e00700f9210400d021602191230400d0L4;FFa04700d16cc2ff97e0fb00b9a04700d169c2ff97e0f300b9a04700d166c2ff97e0eb00b9a04700d163c2ff97e0e700b9a04700d160c2ff97e0e300b9a04700d1L8;FFe90f00f9e92f4429a8831fb8ea", - "830039e91302b8e92b40b9eb6302b8ebc342f8ea970039eaab0039e9b302b8eabf0039eb1b00f9e83b00b9dc100194fd7b45a9BL8;FFe0031baa21008052a7900194001f00b4e10314aae2031baae02f00f9ad9001940a00001437008052381740f9d8fcffb53a0080523b2340f9f54700f9fbfdffb5L8;F", - "F4af13191a8031ff8620100d042101091e92b01a9e3430091c3900094fd7b44a9ff430191c0035fd608100091200440a9a94300d1eaffff904a313491a8031ff8BBBL4;FF290080d2a14302d14926c0f2a87f38a9e82604a9b3d0019436ffff1728008052e86705a9e93f40f92801403968f607372800805", - "2ff3300f9e82700f92e000014L4;FB8b338d2ac24b89660aed28599ff515af1e689b6521ed2c81d73c087a35f466406696050db7b8a1869574a28c1a3c1a67000021113f11fdf9cd2cc4b031ea5594L8;FFe8a303f9e00100b000343991e8ab03f9e80100d008c12991e1032b91e3031d9162008052f8630", - "5f9f6030daaf5030aaae9a703f9e9af03f9e8b303f91bc9ff97BL8;FFc90200d029051e91e9ab10a9290080d2e1a30391090ec0f2e8ff0fa9e8a712a9b0500194c80200f008350f9129048052682601a9880280d2090080920800f0f2L8;FFda500094e88345b9e9c742f902a09152040100d084603d91e0", - "031baa1f010071e103152ae204a072e813899ae3031f2ae84f04f9cf500094e8fb40b9e97b40f9BBBBL4;FFb50000b4e00316aae10315aa22008052a8f00194b30000b4e00314aae10313aa22008052a3f00194ffc30891f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L4;FB2e000000000000003102", - "00000e000000636f6e737472756374656420636f72726563746c7900000085924800000000003300000000000000350700000e000000L8;FF888246f81f0500b1810000549fe606a99ffe07a99f82083881a20191e20313aa9ef2ff97600400b5e1031faae4ffff17880240f91f0500b1c10000549f5e00a", - "9BL8;FFfd7b03a9f32300f9fdc3009129008052e80301aaf30300aaff2700a909048052ea0200d04a213e910900ac72e1630091ea2702a9e9030091e00308aaff2701a9L8;FFdf0600b18000005480020391e1431691951000941f0700b1e080ff54802202916c010014e8031faa00011aab42690054e143", - "1691610d0094df0600b180000054BBBL4;FF681e043969f20ff8788600f97c42043909fdff1740c3c13ce0030491a14301d1a0039b3cf63f0094e83b40f948f1ffb4e02740f9e13b40f9220080529db00194L4;FF050080d2639440f9009840f9418440f8c807001400000000210000f0207048394003003", - "5200000f02200805222700839009c40f9a00100b4fd7bbfa9200000f0L8;FFbeffff17e91340f9e093c23cfa430e91e193c33cea2740f9e8a34039f50b40f93f0500b1400701ad4af303f8c0f8ff542a018052eb830091e013c03d690200f9BL8;FFe1032d91e85b04f9e8c32291e95f04f929fffff02931", - "2291e8a305f9e8c32791e9a705f9d2300194e89b40f9e9c31691eaffff904a912891e9a305f9e9c32791L8;FFe1f343f9810000b4e0f743f922008052a8300094a33000942002805221008052a1300094201f00b4880c8052c90000f029c13f9108400039c80080d22001c03dBBBBBBL4;FFf44f01a9fd03", - "009108a040391f0d0071a101005413d041a9880240f9680000b4e00313aa00013fd6810640f9c10000b4820a40f9e00313aaf44f41a9fd7bc2a8L4;FFe00315aae10318aae2031caabf180094a0feff35a3180094e001805221008052a1180094801000b4a80000d008812f91150380d2090140f9087140f", - "8f90b40f9L8;FFc0035fd6090440f96a0200d04a210e911f7d01a90a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6e82300910900009029c11c91a20f00f9600200d0BBL4;FF800a40921f1800f1221c0054817e0353411c00343f100071ec0100543f0800716c0300543f040071200600543f0", - "8007141faff54a80352f81f0500b1000d0054L4;FB6f74206f70656e2066696c6520617420c000214572726f72207768696c652072656164696e672066726f6d2066696c6520617420c0006877636170206e6f7420L8;FFaa835738a96317386901084aab935738a97317384901084aaaa35738a98317386", - "901084aabb35738a99317384901084aaac35738a9a317386901084aabd35738BBBL4;FFc0035fd62000805201048052b6d80194c20300b042603491e0031faae10315aac6d80194fd7bbda9f50b00f9f44f02a9fd030091089440f9f40302aaf30300aaL4;FB69742f737061727365706f73747175616e74", - "756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f76312f756e6368L8;FFe8fb00f9e86f45f9e0ff45f9e70346f9fe0746f9ee0f46f9e8e700f9e87745f9f21746f9e51b46f9e21f46f9e42746f9e82717a9e88745f9e97f45f9e62b46f9BL8;FFe90348f9e", - "067c13d8183813ce83b08f9e80f40f9e94708f9e11fc43de223c43de0fb863de01b843d600600ad620a803de80000b4ea1740f9e90740f9682200f9L8;FFff1f06f9f62306f9ff2706f9ff530cb9ff2f06f9ff630cb91f0800f1a12b0054a02302d1d4f4ff9700080036c1efffb4e5010014c01b00b5a023", - "02d1cef4ff97BBBBL4;FFfd7b06a9f73b00f9f65708a9f44f09a9fd83019109704039f30300aaf40308aaa90100343f0d0071c107005460a240a9090d40f9e803009120013fd6e80340f9L4;FB7374726174696f6e20494420c000196d6573736167652077697468206f6c6420636f756e74657220c00320", - "2f20c00008696e76616c696420c00a206d65737361L8;FFa80600b5e1031faadaffff17e1031faa883200b9d7ffff1781020054e1031faae00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6c80080d2e10700f9BL8;FFff0600b1bb8313f8c0040054a02303d1f260ff975f0700b1bb8313f8a00", - "60054a02303d1ed60ff97bb8313f898060036a02303d1e960ff97e18344a9a82303d1L8;FFf6230bf9ab780094f43349f9e04306918123009102738052ae780094e083c53d89630f91e187c53de8436c79f5174bf9fb1b4bf9e01b843d2001c03de11f843dBBBL4;FF800300d000601391adb80194800300", - "d000a01291aab80194800300d000001391aab80194820300d042400791e00315aaa5b80194800300d000c01391a0b80194L4;FD5ce74500000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L8;FFac83", - "1e78e00b803de193823c0820003928008052ab435eb808240039a8835e78e00bc03de193c23c010000f90ba000b8081c00790a4000390010813c01a0813cBL8;FF1f0109eb69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff54a00200b000203091a4380194a00200b000c009", - "91a1380194fd7bbfa9L8;FFeb432a91ecc32491691140b8ea6745f9fa4f40f9883100b8e8436b396081c03ce93309b9e903092a6181c13ce8a30f39883140b86c7e0e91eaf301f9ea5f45f9BBBBBL4;FF3f080071a1020054f70300aae003082ae10313aae20303aaf80303aacbf1ff97000500b47600001", - "43f0c0071c00300543f10007121010054f70300aa01600491L4;FFfd7b43a9ffc30191aa080014f44f46a9f65745a9f85f44a9fd7b43a9ffc30191c0035fd6e0030091e10316aae20315aa230080522400805283e9ff97f60b40f9L8;FF89000054c0035fd6e0031faac0035fd6fd7bbfa9fd03009140020", - "0f000000a91a7080194080840f9080300b4080040f9490200d029811f911f0109ebe0000054BL8;FF421a0054e00313aa080c49f81f0500b1e00100546c020094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebc9180054L8;FF01038052b88800940001805201", - "6c8052b58800940001805201668052b288009400018052015a8052af88009400018052010f8052ac8800946001009000c01f91BBBL4;FF4801088b080300f9e90200f948ff60d3e80a00b5400b40921f1800f1e20a0054417f0353010b00343f080071ed0100543f0c0071200300543f100071e0030054L4", - ";FB00000000000d00000000000d1100000d000d0d160d007c494c059ea36eca27c5617373657274696f6e206661696c65643a206b65792e69735f6e6f6e6528292fL8;FF1a000014590080529f04001439008052d60000b4e00318aae10316aa22008052a4c80094ed031baad40000b4e00315aae10314aa", - "220080529ec80094ed031baaBL8;FF980240f9080740f91f0100eb42020054e80f41b2e80700f907000014c90080d248008052e04300390900f0f2e8470039e90700f9e0230091bd3d0094f44f4da9L8;FF280108ab8300005426000014e80308ab82040054090840f9090100b42a0140b24a11c0da4a154", - "0d24a0d0a8b4a25019129194a8b29050091280108ab22030054BBBBL4;FFc80600f984010014e80317aae94f00f90a0d4af85f0109eba207005469040090f303042a29b140f9690400b4e9030291aa0000b04a312291e92b0aa9c90300d0L4;FBe4204000000000002000000000000000080000000000000", - "0409b400000000000e42040000000000020000000000000000800000000000000949c400000000000L8;FF2b010014c1020291a2c303d15aecff97e02100b44e010014e8af40f9140101eba3310054e8af40f91f0114eba9210054a0c303d189e7ff978031003728fc60d3BL8;FF081540d2aa833da9080d", - "088baa831ef808250191681a488b080500911f0109eb680b0054a0a300d1210080522200805223008052240080520d5bff97a8277ea9L8;FF0080c53ce016803d0080c03ce002803d0080c13ce006803da8680094810700d15f0700b1e12700f9800b0054e00641ade0430691facb00f90083823ce20242a", - "dBBBL4;FFe3feff17a04301d1e10319aa220080522300805224008052159bff97b9035cf8f0feff17a04301d1e10319aae2031aaa23008052240080520d9bff97b9035cf8L4;FFf30b40f9fd7bc2a8c0035fd600008012fcffff17fd7bbba9fd030091f96b04a9390000b021430691f35301a9f55b02a9f6", - "188092c20200cbf76303a9f70300aaL8;FFa80357f880030191a1c303d12200805208050091a80317f8d9a80094e8031f2aa0877bada0d300d1a8f31438a203d93ce1830091e00704ada08779ade22b803dBL8;FFd5280194a04302d1e10313aac80200941f1c0072e0079f1a04000014e0031f2ac0035fd", - "6e0031f2aff031291f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L8;FF00013fd6e0e302f9e8074091e1e702f908011891290c40f9e163179120013fd6fa034bf95f0f00b161030054e8008052f6e742f9e8e3163949008092f5e342f9BBBBBBBL4;FF0800669e0801c0da0811c0da08fd43d3deffff", - "17220000d042f01091e1630091e00313aa03088052f277009414008092e00314aaf44f49a9f65748a9f85f47a9L4;FF9a9200b8955a01a9892e00b968620039f44f4ba9fb3b40f9f6574aa9f85f49a9fa6748a9fd7b46a9ff030391c0035fd6a00000f000e02991b51c0094ffc302d1L8;FFe0179f1ac003", - "5fd620008052c0035fd6fd7bbda9f65701a9f44f02a9fd03009115fcdfc8f40302aaf30301aaf60308aab5010037a1420091200080520a1d0194BBL4;FFeaf35239ed6b5339fcc35339ee6f5339ea730929eaf75239ef735339fcc75339f0775339ea730a29eafb5239f17b5339fccb5339f27f5339ea730", - "b29eaff5239L4;FF000000d000001f91fd030091aefeff97fd7bc1a8000000d000e01e91c0035fd6fd7bbfa9fd030091fd7bc1a8c0035fd600000000000000000000000000000000L8;FF3f0500b121faff54e00308ab23ffff54a001009000a01291a99c0094e8031faa090840f929f5ffb5091440f9e80", - "3088b09f6ffb5b6ffff17e9031faa0a2440f9BBBL4;FF09fb003908ff0039e8430591cfdc0194e0074091e1430591028c815200400f91acdc0194e00b4091e182319102c4805200c00091a7dc01949adc019400c48052L4;FB64696e672e727300c0012ec0023a2000c00019696e76616c69642077697265", - "20747970652076616c75653a20c00013696e76616c6964206b65792076616c7565L8;FFe81742f9f6bb42f9f2bf42f9e0c742f9e2cf42f9eaa317a9e81b42f9ea4742f9fed742f9e8ab00f9e81f42f9eacb00f9ea4b42f9e92312a9e82342f9e93342f9BL8;FFe11f843de8032179480300b0e0fb833d08b", - "140f91f0900f189040054e8633f91a90200f029110f91e8bb0ef968008052e1074091e9bf0ef9e90200b029013c91L8;FF0800001400010039b402148ba08300d1f40f00f9ba5c00941f040031400700541f0002716200005435008052070000141f002071620000545500805203000014BBBBL4;FF80040", - "054e1e7076ff9031caa080700d1e9f341a9eb0b40f9180118ea0a32805261fcff54f80740f97f0500f10001005420a9200e0800669e680100b40801c0daL4;FB45014f0065001c013400a5002600e40032018501f2000e017201920194008600b9010e00a301b1015b01d60069013c001c00000097007500", - "83004000d100f500L8;FFe10300aa20f6ffb4a6ffff17e1031faa883200b9adffff17e1010054e1031faaa0ffff17c80080d2e11700f90800f0f2080900d190ffff17e80b41b2e01700f9BL8;FF4a0d0a8b4a25019129194a8b29050091200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff5420030", - "09000a00391a37c0194fd7bbea9f44f01a9fd030091L8;FFe11740f99bfbff17e06300912200805223008052240080528592ff97e11740f918fcff17f30300aae06300912200805223008052240080527d92ff97e11740f9BBBL4;FFe10314aa5b000014a0031cf8810300b0215c3091830300b063c03091", - "a00301d122038052240280520f000014a0031cf8810300b0215c3091830300b063201f91L4;FB14f647000000000020000000000000000800000000000000f81348000000000014f647000000000010000000000000000800000000000000d014480000000000L8;FFe20343ad020001adb5000034e00316", - "aae1031caa22008052a6bc0094e11b40f9e81340f9080101cb1ffd01f1690b0054f61740f9610341ad630b40ada0c300d1BL8;FFe80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb492d0054080c47f81f0500b1802300546c030094L8;FF810", - "000b4e20a40f9e00315aaa93c00949f0b00b1410d005468ae42b90801003660a24aa961b242b9081540f900013fd6606601f9616a01f93cffff1760a248a9BBBBBL4;FFe9031faa962281b996fcff35ea031faa958e40f955fdffb52801088b49011f8be10313aa0001098b0ef8ff97b8010034610a40f96", - "80240f9801641b91f0101ebL4;FFf44f05a9fd830091f60302aaf50301aaf30300aaf40302aa030000149f0216eb88090054c0058052e10315aae20314aa210d00941f0400f1c1080054f40301aaL8;FF81020054e90300aae04300918204805221250091f30308aae2faff97e9834039e80313aa3ffd037", - "181010054e007c03d09008012090100b9e003803d0041803cBL8;FFc0035fd6e81340f9097d8052eb2b40b90a7dc99b087d099b69d09b526963a872697da99b09c949ab48358a9a080100b4280080526806003968020039fd7b43a9L8;FFa88c00944000805241008052a68c0094207a00b4f90300aaa28c", - "00944000805241008052a08c0094607900b4fa0300aa9c8c009440008052410080529a8c0094BBBL4;FF6012803ce00a40ad6112813c800b3fade10300b4e00318aa22008052f44f4da9f6574ca9f85f4ba9fa674aa9fc6f49a9fd7b48a9e923476dff8303919dcc0114L4;FB82e489f494c49fd4f624fd3", - "4e004eb14da64d174cc44c75415b41ea40394088439f432e42fd424c44d3446245b14500461746a6477547c4434c73fd722e729f7L8;FFeb7700f97adb42a975bb43a979a344a96b334e29604600547f010971204600549f0600b1a06100541f0700b120020054380100b4e0031aaae10318aa22008052BL", - "8;FFe20242ad0183833c0083853ce10240ad0283843c0183803c0083813c40030094fc2740f99f1700f188fbff54ea430f91e8e3009129008052448948adec030b91L8;FF080040f9e20301aa002140a9e10308aaf34c0014281040b9000040f96800c8376800d037d54c0014e94c0014e94c0014000040f", - "98e28ff17000040f93fc7fe17BBBBL4;FFc0035fd6e90f41b2090100f9f44f42a9f50b40f9fd7bc3a8c0035fd6e91741b20a210039090100f9f44f42a9f50b40f9fd7bc3a8c0035fd62a0480d20a00f0f2L4;FBd4c242000000000057726f6e674b454d4b657954797065000000000000000000000000000", - "0000000010000000000000088f34200000000004261644b454d4b65L8;FFe00313aa22008052230080522400805287020094610a40f9e00315aaceffff17e00313aa2200805223008052240080527f020094610a40f9680240f9d8ffff17BL8;FF40f5ffb443000014ff5f09a9ff5300f9c1620091a20301", - "d1cc55ff9760f4ffb424000014ffdf07a9ff4700f9e1e30191a20301d1c555ff9780f3ffb440000014L8;FF4900009029c10191a82734a928008052490100b029212c91aa0303d1a04700d1e8a711a9480100b008291891e8ab13a98a06805248048052ffa70ea9490100b0BBBL4;FFe10318aa1903028b0", - "0011c8bb1ac0194e83340f9e10300912200805208050091e83300f9e803009100010191d4ac0194ffff0039e8031aaa02fd46d31ce17a92L4;FFfb1b40f9f65746a9f85f45a9fa6744a9fd7b42a9ff030291c0035fd620008052f7ffff17e00313aaf60301aae10315aae20314aa2cfeff97750a40f9e103", - "16aaL8;FFd40600913b008052bf031ff8a8033ea9080000142807c05a08683a785a0b00915f0315ebbb031ff87b070091a2010054480700911f0115eb420b0054a8035ef8BL8;FF160080924233c03de85345f9800705ad400743ad8233803de8bb02f9800703ad420344ad820304ad410341ad810301ad4", - "20342ad820302ad410340ad810300adL8;FF209600b4e10314aae20319aafa0300aab02c0094e29340f9020000143a008052e3074da9c0220a912137fe97e0fbc33de1ffc33dd4220b91e207c43dd5220c91BBBBBBL4;FFe80b40f96a0640f9490108eb430200546a0240f9e00740f94801088b682600a98", - "00200f9e0031faaf44f44a9fd7b43a9ff430191c0035fd6e00302aa22150194L4;FFe9470491e80701f920f18f3cb50000b4e0031caae10315aa22008052a5140094e11341f9410d00b4e01741f9660000149c140094c0018052210080529a140094L8;FF480102ab220b0054a905c0d20a018052690200f", - "9686a2af8f44f44a9f65743a9fd7b42a9ff430191c0035fd6480102aba2080054090180527f420029686a29f8BBL4;FFe1031faae30314aae40315aaff7f02a93adfff97208748ad480300b008f11d91224fc03d2343c03df5c3009169038052e0c30091200703ad200746ad2223803dL4;FD6c0d4a00000", - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000940d4a0000000000900e4a0000000000L8;FFa363009142008052b30f00f9f694009468420191610100f021cc1791840100d084200f91a363009182018052a80f00f9ed940094ed940094fd7b41", - "a9f31340f9BBBL4;FFa0a302d130d50094e80300aae00301aae8f10736801200b5f5031faa62feff1761360054e85340f9ff0208eb40020054080e8052a1837bade852089ba203d63cL4;FB5600000000000000600000001f000000e11f4900000000005600000000000000560000000900000073686f756", - "c642062652061626c6520746f2073656e642065L8;FFe84342f9f1c342f9efcb42f9e32f00f9f5d342f9e9a310a9e84742f9e95742f9e3d742f9e0af823de8b700f9e84b42f9e34b00f9eba318a9e84f42f9eb7342f9BL8;FF8000005480220291e1431691561200943f0700b1f90b40f9007fff5401c303", - "91e24316916000805213110094f3fbff17e8031faa00011aab62670054e1431691L8;FF59b5fe97fc5346f98082c03ce85f46f99f0b00b1e0d3823de8ab05f901080054e8ab45f9e9c32791e0d3c23de95b04f9090100f029413191e80305f9080000f0BBBBL4;FF4801088b480300f9e90200f988fe60d3", - "a80500b5800a40921f1800f1a2050054817e0353c10500343f080071600100543f040071c1faff54e82b40f91f0500b1L4;FBf4c97400631e124064c5a38b1e927497d3d4786b101a623ab34a7da3954fae126b04dba9d7a3604ed88cdc8550950f0d4a9134ceb7e19b94139151d2c3d6e1c8L8;FFe80301", - "aa60000036a8f9ffb466000014e1031faa883200f9caffff17a10d0054e0031faa87ffff1721050054e0031faa7affff17c80080d2e00700f90800f0f2BL8;FF1f0500b1a0020054e1c30191a20301d1ce5dff97a0f7ffb463000014e8ab40b948000037f85700f9e1f20091a20301d1d55eff97a0f6ffb4", - "64000014ffe308a9L8;FFeb074091e8cf42f92a0400916b810991490380526001029109692138ead302f96b290094e1431691641100949f0a00b1e10b0054e1ffc33de8d342f9e90348f9BBBL4;FFe20316aa90120094e81340f9e083c23ce91f40f91f0500f1e003803de90b00f941020054e003c03de80", - "b40f909008092690200f96082803c680e00f934fdffb4L4;ZBL8;FFc181813c4109c03da2031df8223240b9a0039c3ce141823ca1037eadf23300f932825fb831c20191e041813ce20343ade141803ce117c03d12c21fb800c29e3cBL8;FF1f0500b1a1000054ff3706f9f63b06f9ff3f06f9ff830cb91f0", - "800f1e1350054a02302d1c5ecff97800a003621f8ffb4dc01001401c30091a22302d1e1ebff97L8;FF401a00b5a02302d187f4ff97c010003601eeffb4d5000014402200b5a02302d181f4ff974010003641edffb415010014e17f0ab967ffff17a88357f8080540f9BBBBBL4;FF2801088b6a010c8b08cd", - "c9ca4bc1cbca69adcb9329bdc8ca08010a8b2981c8ca200108cafd7b45a9ff830191c0035fd6ffc301d1fd7b05a9f44f06a9fd430191L4;FFa0feffb4f30300aae00319aae10317aa1f08007163080054f9031faa35200091d70600d1f60313aab47a79f8e00314aa2205009439070091d40281a8ff0219e", - "bL8;FF22008052f30b40f9fd7bc2a8a904011460220091f30b40f9fd7bc2a87200001460420691c10000946022009107feff9760420891f30b40f9fd7bc2a89afdff17BL8;FF60001fd6202040a9210300b021002b91030d40f9e2038052fd7b43a9ff03019160001fd608200091200440a9e92300910a00", - "00b04ac11991e8a700a9020300d0L8;FFe00309aaa2018052e5840094620100d042c036916d00001408200091410100f021701e91e80300f9e8230091e00309aa22028052da840094620100d042c03891BBBL4;FF200080398004f8b728040091490400d1310000141f0800f1611d0054a18300d1a2a300d", - "1bf633ea9bf031ff8c7adff97e01d00b5f40f42f9e80742f99f0208ebL4;FB8b634900000000003800000000000000490100000a0000008b6349000000000038000000000000004a0100000a0000008b634900000000003800000000000000L8;FFf67f42f9f4c342f9f8030baaedc742f9f9cb42f9fecf4", - "2f9eed742f9f2db42f9f1df42f9e0e342f9e3235739e7fb42f9e4eb42f9e5ef42f9f5835739e9f200f8BL8;FFbf931d38a8031df8c9390094e80300aac102009021240e91c302009063400d91a0c300d142018052a4008052a8031df801390094a1035df8e80740f9f30301aaL8;FF2083c63c2183c73ce8", - "2b00b9e8430691e00705ade10240adfab30a39e10302ade10ac03de10b03ad255efe97e99341b93f09007121080054e8cf40f9e9a341b9BBBBL4;FF810c0154cee401941f100031010c0154f9ffff17cbe40194f70300aa1f0400b141fdff54e043059181008052c6e40194e00a0135e85341b9e82301b95", - "7ffdfc8L4;FB415f56315f4d4c4b454d3736383a53434b41204b6579000000000000000000000000000000000000000000000000000000000000000000001200000000000000L8;FFea031faaf6031faa0c318c9a79014039680500912e0080526d696e38df010cebaf194092f021ca9aaf1d0013cd05009", - "1160216aa820000544a1d0091ee030daaBL8;FF84e01291e0230091a32300d142008052a8831ff8f4640194f40200b094422391c10200f0218c2f91a32300d142018052e40314aab3831ff8eb64019468620091L8;FFfd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f090071e1010054e003", - "02aaf40302aaf30301aad2000094e80300aae00301aa08020037980240f9BBBL4;FFf44f04a9fd030091086440a9f50302aaf30300aa220700b1e300005400210091e10308aaa5a40194e9031faa080080927400001400e4040f49fc43d35f0840f2L4;FFf35301a9fb7305a9441c40b9400440f9a402003", - "55f0000eb20020054440040f9800400f9440040a9040000f9607861f85f0000ebe0000054c0021091e12a0091L8;FF15008092750200f9df0600b18002005474de48a9970100b49822009104000014f70600f118630091e000005401835ff881ffffb4000340f9220080529da40094BL8;FFc20000542a7c", - "0653090500394a051a320a01003912000014eb0f80122c7c10532b2c0633ec0000352a7c0c530b050039090900394a091b320a01003908000014BL4;FF810000b4400340f922008052a9240094a002c03da80a40f9c002803dc80a00f9140300b4e00313aae10314aa22008052f44f45a9fb0b40f9f65744", - "a9f85f43a9L3;FB0600000004000000400000000000000040f03f000000000040f03f00000000006802000000000000680200000000000008000000000000000100000004000000BBBBBBBBL4;FFe9430091e22701a9a80201ab420f0054170440f9f30300aae9060091ff2200f129fd43d32af17dd34901", - "09cbe932899a1f0549eb290a00542a050091e0830091L4;FF830c80520bfbff9720f9ffb445000014e16300b9c6ffff17c80080d2a1831df80800f0f2080900d107000014e80b41b2a0831df804000014c80080d20800f0f2L8;FFf65741a9fd7bc3a8c0035fd61ffbff978902009029210e91027d01a909", - "0500a9c0035fd6e30302aae20301aae10300aae00308aa97000014e30302aae20301aaBBL4;FFb99e0194f8c30c9107000014e0231291c182009130120094e84742f91f0900b120fbff54e0c30c91e1231291022b8052a89e0194e92740f9890100b4e82b40f9L4;FFf40300aaf30301aa96ffff97e00314", - "aae10313aae81a80d2010000d4e0f6ff97f35341a9fd7bc2a8c0035fd6000000002400028b0500028b5f0002f1a8070054L8;FFfd430091130040f9e00301aa810100d021681b91e8030091c2018052f19e009468220191810100d021881591a40100b084a00a91e0030091a3630091a2008052BBBL4;FF1", - "f100031414c005439feffb505000014e043059181008052cbde0194804b0035e85341b9e83700b957ffdfc8770000b5c4de0194f70300aaff0600b180020054L4;FB910700001300000094024900000000004f00000000000000f10300003300000062225c6e5c725c745c30025c78c32000006902000022", - "6578706c696369742070L8;FFe81f00f928a440f9eaa302a92a2055a9ea7b00f9e86300f92a2056a9e86700f928c040f9ead300f9232857a9e86f00f928c440f9e85f00f928c840f9e8e300f9BL8;FFf73349f94083c03ce83f49f9ff0a00b1e067803de8d300f901010054e067c03de8d340f9090080926", - "90200f96082803c680e00f965040014f4c30091a1820091L8;FFe00316aa6a0a00f909692138e10313aa6afbff97780a40f9680240f9080118cbdf0208eb88070054680640f9e10317aae20316aa0001188ba65e00940803168bBBBBL4;FF43a8200e6c00669e6c0100b48c01c0da8c11c0da0c0e4c8b8c0", - "10b8a428c212e42a8302e4f00261e8f0500372f00805202000014ef031faaad210091a001108bL4;ZFL8;FFc80080d20800f0f2080500d1b0ffff17c80080d20800f0f208090091acffff17c80080d2e0230039e00300910800f0f2ff270039e80300f9bdf3ff97e80300aaBL8;FF03400091a52300d1e00", - "308aac2028052a9831ff8fb7e0194fd7b42a9ffc30091c0035fd60920009121030090212438912403009084803291a32300d1e00308aaL8;FF080d088b0825019109fd46d30800098b080500911f0109ebe815005447000014f7031faaf50314aab60e4ff8df0600b120170054e00315aad0e2ff97080040", - "b2BBBL4;FF690200f96082803c680e00f9600000540063009158a7ff97f3d340a9940100b47522009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f9L4;FB75742e7273002f72757374632f34386132323963656165666434393835633530393930623134313136623664383536616", - "6303938352f6c6962726172792f636fL8;FF620a803d600600ad010100b4e00315aa22008052f44f45a9f52340f9fd7b43a9ff830191a3be0014f44f45a9f52340f9fd7b43a9ff830191c0035fd620008052BL8;FF4a0d0a8b4a25019129194a8b29050091280108ab22030054091440f9090100b42a0140", - "b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abL8;FF217c0353010800343f040071000100543f08007141fdff5481220191e20313aaa3fdff97000100b483000014200e00b5e00313aa7cfeff97e80301aa80000036BBBBBL4;FF29040091e00315aa690a00f91b692138e10313a", - "a13faff97770a40f9680240f9080117cbbf0208eb480f0054680640f9e10316aae20315aa0001178ba50e0294L4;FF23008052ff030094e86b42f9e96f42f91f0500f1e9af00f9e03c0054e87342f9e89f00f99c0000b4e10353a9e2031caaa80e0094790a00b4e8bb43b909b343b8L8;FF684200f808008", - "01269c200f8680200b9f44f46a9f52b40f9fd7b44a9ffc30191c0035fd6e80313aae10314aae00315aae08700a949008052e1230091e00308aaBL8;FF887e089bfb0314aaa8031ef81100001436008052a9835ef8aa835ff868021c8b7b0700d15aa301919ca30191092900a9096501a9a9435fb8156502a", - "9175103a9L8;FFc0035fd6fd7bbea9f30b00f9fd030091f30300aa12adff9760020079f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aaBBBL4;FF0b000014e82340f9e10317aae20316aa0001188bafce01940803168be82700f9398300f173820091800d0054e1", - "2740f9e81f40f91f0101eb600a0054e82340f9L4;FBc4ad92840000ba67f34e46444ac5f0cf39795cde26cba649360fb4b9d0c335297ca5adaaacd19f14ab28b8e6eae448b290f7752b1fbaf412c6b8732cac9be552L8;FFe0bb00f9e0030baaeb0314aafadb4aa9f7ef49a9680a00f9e8fb40f9e0f3c03d", - "75a615a9f27340f9680e00f9e9e740f9720600a9e1030991e8bf40f9678213a9BL8;FFe17740f9210100b4e07b40f922008052a84e019405000014e00640ade20ac03d620a803d600600adff031691f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L8;FFffa71139400703ad020144ad420304ad01014", - "1ad410301ad020142ad420302ad010140ad410300ad60000054e02b40f92ee8ff97f4e351a9180200b499220091BBBBL4;FF290d098bf35b01a9f75b02a92925019129fd46d329050091200200547f0600b100010054680240b20811c0da081540d2080d088b08250191681a488b08050091L4;FB6167655", - "26573656e6461626c65000000000000000000000008000000000000000800000000000000948342000000000000000000000000000800000000000000L8;FF210200d021701e91230200d063301d91e0030091220280524400805206e3ff97e10340f978ffff17ffc301d1fd7b03a9f72300f9f65705a9f4", - "4f06a9fdc30091BL8;FF630000143400801239008052010b40a9e00313aafd6e0194600200365a00001454008012e80200f008612a9159008052010940a9e00313aaf46e019440010036L8;FFc3110094e1d342f956f9ff17e043169122008052be110094e1d342f95ff9ff17e043169122008052b911009", - "4e1d342f98dfbff17e043169122008052b4110094BBBL4;FF0e088052e94340b9f20b43a98d194039045840f9a6e35b38258108aaa7c35b788b094079edab00398d7141f88f7140f8a6a31a3886504078907c4039917d4039L4;FF08008092080300f9ff0b4091ff830091f44f45a9f65744a9f85f43a9fa", - "6742a9fc6f41a9fd7bc6a8c0035fd6e0031faaadaeff97a0877ea9abaeff97fd7bbea9L8;FF2800805208783478e9a341a9ea0b40f9282900a9280900f9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd6c001009000a02e91BL8;FFe15b813d680000b4e00313aa00013fd", - "6810640f9810000b4820a40f9e00313aaa42e01949f0b00b101030054e89f40f9c002c03dc91240b9f59342b91f0500b1L8;FF000200544e000014a8e300d1000540ad0209c03d620a803d600600ade8034b391f1500714cfeff541f0d0071800600541f110071e00800541f15007101080054BBBBBBL4;F", - "Fc0035fd6e80f40f98a0640f9490108eb631700548a0240f9e00b40f9e20315aa4801088b882600a9580040f9080740f91f0100eb62010054e80f41b2e80700f9L4;FF894800b548008052f7c34bf9f8c74bf9e9830a91e8830a3928008052e0230891e143139142008052e96b02f9e86f02f9f77302f9f8", - "7702f99d0e0094e1bf4bf9L8;FF610200d021c0249162018052e7160114fd7bbda9f65701a9f44f02a9fd030091130440f9f40308aa930100b4160040f99c160194e00313aa210080529a160194BBL4;FF29244039e00700f93f0900f1a20100544a1900120ae10a8b4afd09aa5f0108eba3040054e00740", - "f9480180520aa000a91f0000f9fd7b44a9ff430191c0035fd6L4;ZBL8;FF7e120094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb492d0054080c47f81f0500b180230054BBBL4;FF69420039f0ffff17ff0307d1fd7b16a9fc6f17a9fa67", - "18a9f85f19a9f6571aa9f44f1ba9fd830591f30308aa08018052e00709a9ff230aa9e8430291ff5b00f9L4;FB76657273696f6e5f6e65676f74696174696f6e696e6e6572636861696e0000008c1b49000000000047000000000000001d0200001400000073686f756c642073L8;FFe9ab1da929d45da9e8", - "f700f928fc40f921000891e9a30fa9aed6009408e30d91f04b46a9ed031aaae10316aaee0317aa000540ad08cf41f9e95f4ca9e00b40f9BL8;FFe8cb42f908011acb1f0308eb288c0054e8cf42f9e10319aae20318aa00011a8bac560194f90b40f94803188be8d302f9e89f49f9f4074091948209911f05", - "00b1L8;FF3af0ff97f30315aa69018052618e41f8280041d23f0000f10841899a1f2d00f1020b0054a80240f9a80000b4a00640f901e97bd3020180529e560094e00315aaBBBBL4;FF1f400039602201a9090d40f9e803009120013fd6e80340f91f0d00b160fdff54e0c30591e1030091022e8052a9f601", - "94755a41a9c80240f9680000b4e00315aaL4;FB74436f6e74656e744e6f53656e6465724b65795374617465436861696e73656e6465725f726174636865745f6b657973656e6465725f726174636865745f6b65L8;FFc80e00b5200840921f1800f1020f0054217c0353210f00343f040071c00300543f08", - "0071e00100543f0c007101050054888248f81f0500b1810000549fe608a9BL8;FFf976019468e201910103009021e02591040300f084401191a3630091c2018052a80f00f9f0760194684202910103009021182691040300f084c01191a3630091L8;FFe267c33de09b843de06bc33de19f843de16fc33d4", - "083843ce073c33d4183853ce197c13d4083863ce09bc13d4283833ce293c13dfa3349f9e0ef843de08fc13dBBBL4;FFf65741a9fd7bc3a8c0035fd6f503012af60308aab8b60194e80316aae90301aae103152a2a008052890600f98a420039d4ffff17ffc307d1fd7b19a9fc6f1aa9L4;ZDL8;FFc0035fd", - "6c201009042001791c5010090a5603891e1030091e0031f2ae3031faa1eb70094c001009000803791a4b60094ff8303d1fd7b08a9fc6f09a9fa670aa9BL8;FFb3a800b4f43741f9a6360194e00313aa21008052a4360194c01001b4e10314aae20313aae00300f9aa360194f9d740f9f58b42b9f78f42b9f", - "a1b00f9190a00b4L8;FFe2031aaaf50300aab2360094fb031caafc4f40f90200001435008052e9c32491e8432a91f87b05f9200541adf88305f9f8c30d91fc6305f9fc6b05f900818b3cBBBBBL4;FF0801148b03fdff54e90f80121f00207109140033c20000540a7c0653090500394a051a320a010039e0", - "ffff17ea0f80120b7c10530a2c0633eb0000350b7c0c53L4;FFc4060094fd7bbda9f50b00f9f44f02a9fd030091f40302aaf303012af50300aaa006009400038052010180529e060094400100b4155000a9810000f021000391L8;FFac06019468aa40f9a80000b460ae40f901f57ed342008052a6060194", - "68b640f9e80000b460ba40f901f57ed342008052f30b40f9fd7bc2a89e060114f30b40f9BL8;FF090080920001c03d01c1c03c0800f0d2977e02290000803d01c0803c80de01a9892200a955f9ffb4e00316aae10315aac5ffff17a04301d12e83ff97a8835df8L8;FF6ad7ff97b9035ef8792600b4b7835", - "df8f80b00f938fb7fd3a2860094e00318aa41008052a0860094002500b4e10317aae20318aafa0300aaf30700f9f71300f9BBBL4;FF3700805206000014ff1e00714000005417018052ff02346b81270054580b40f9fc1b00f9380200b4530740f99dc60194e00318aa210080529bc60194003200b4L4;FB", - "742f616172636836342d756e6b6e6f776e2d6c696e75782d676e752f72656c656173652f6275696c642f737071722d383934636339653033313261616632312fL8;FFe8270ea9e8ab42f9e9af42f9e10313ada182cd3ca082cc3ce86300f9e8b342f9e2ab803dea2306a9e8b742f9aa524678e00714ade83", - "b00f9e8bf42f9e8a703a9BL8;FF0cfeffb43f0108ebb3611932000200542b0440f90afc78d37369283808050091280800f98af6ffb43f0108eb93611932e00200547369283808050091280800f9L8;FF0811c0da081540d2080d088b0825019108fd46d308050091091840f93f0500b1400400540a2040f9", - "092c40f90a0100b44b0140b26b11c0da6b1540d26b0d0b8bBBBBL4;FF48008052a80200b983ffff17e00300b000c02d91e20300b042802e91e1058052c5e60194fb1f40f9e803192af90f40b954ffff17e00300b000d02f91e20300b0L4;FB732e696f2d313934396366386336623562353537662f70726f", - "73742d302e31342e342f7372632f656e636f64696e672e72730076656e646f722f6c6962736967L8;FFfc6f41a9fd7bc6a8c0035fd621010054810000b4801240f922008052a5e60094811a40f9a1fcffb40804805205000014811240f93f0400f10bfcff5408028052BL8;FFf31340f9ffc30091c0035fd", - "6fd7bbea9f44f01a9fd030091f303012af40300aaa066019400028052010180529e660194200100b4140000f9e10200f021203491L8;FFa80000b4605e40f901f97fd342008052a8660094686640f9a80000b4606a40f901f97fd342008052a2660094687240f9a80000b4607640f901f97fd342008052BB", - "BL4;FFf85f04a9f65705a9f44f06a9fd830091f303002ae00301aaf70301aaf40308aa0a7e0094f50301aaa100f8b6f8031faae00318aae10315aaaba60194350300b4L4;FF9f00006b6dffff54826c1c53e001809200c022cb6500008b606860f8020840f9bf0002ebc1e7ff5402804039421000123f000", - "26b4ce7ff54021840b94224c11aL8;FFe0030091a1630091e20313aab50f00f9b5620091eba60094946200f121ffff54e0030091e8a60094f44f43a9f51340f9fd7b41a9ff030191c0035fd6ff8301d1BL8;FF030d40f9c2028052fd7b43a9ff03019160001fd61f09007141040054082000910904009182", - "0200b042903991e82700a9e80300910900009029d12591200440a9L8;FF000040f99a02ff17000040f94ba1fe17000040f90e94fe17082440a9e20301aae00308aae10309aadc260014fd7bbda9f65701a9f44f02a9fd030091f30302aaBBBBBBBL4;FF01030054287c179b1f2100b1a8020054081d0091f", - "422009118f17d92950218ab02020054e8ef7db2bf0208eba8010054b50200b4f603032a9a1a0294e00315aaL4;FFe11f40f9810000b4e00316aa22008052a81a0094a80180d25f0700b10800f0f2a8831cf8c0000054e017c03da0e300d1e003803d7bf8ff9703000014b90180d2L8;FF08010acb2a0108c", - "b6a010aeb68000054ea031faa09010b8b0b0440f9290108ebe803889a4101899a6001088bc0035fd60b0440f9e9031febe8039f9ae103899aBBL4;FFff4b0339ff4f033909017eb2ff530339aa008052ff5703390a010aaaff5b03390a057fb2ff5f03390a0940b2ff630339290180520a017db2ff670339", - "090109aaL4;ZFL8;FFa3630091a2008052a80f00f9f69a0094810100b0219c1591a401009084200b91a363009182008052b30f00f9ee9a0094ee9a0094fd7b41a9f31340f9ffc30091BBBL4;FF12b20094f60301aaa100f8b6f9031faae00319aae10316aab3da0194fa0300aa960200b49fda0194e00316", - "aa21008052390080529cda0194c0feffb4e1031aaaL4;FB38037b003f020000ed0058008600170029014701e1009201480071010000c7005d0098000a00fc001d01b600820141004d01007c494c059ea36eca27c5006c4cL8;FFe85342f9e8a700f9e85742f9eb2311a9e85b42f9eb7342f9e8a300f9e863", - "42f9ea2313a9e86f42f9ea7742f9e82b00f9e88f42f9e81b00f9e89342f9e87b00f9BL8;FFe08fc13d5f0700b1e1eb843de18bc13de0e3843de087c13de2e7843de283c13de0db843de07fc13de1df843de17bc13de0d3843de077c13de2d7843de273c13dL8;FF28008052e82700f9e8e740f9e98742b9f", - "a5b06a91f0500b1e95700b9e1ebff54e82300f9facb40f9fc2f00f9f55307a91aeeffb51c018052e81b41f91f0500b1BBBBL4;FF20013fd6e80340f91f0d00b140fdff54755a41a9e00740adc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9L4;FB686", - "1696e20666f722073657373696f6e20776974682062617365206b657920c00f2c20636861696e20636f756e743a20c00076656e646f722f6c69627369676eL8;FFf50300aaf4ab00f9e08708ade28342ade28309ade18340ade18307ad402300b4e0c3039193f7ff97f6000014e1430091e20313aaf70b00", - "f9f73300f93f070094BL8;FFac7a019408008092680200f9f30b40f9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091010040f9f30300aa1f4800b93f0400f18b000054600640f922008052L8;FFf44f05a9fd030091ff0740d1ff0300f9ff833cd1e8074091f30300aafa07409108810991e00301aaf50", - "74091ff0300f95a830991b58209917c91ff97f73349f9BBBL4;FF6a0eaef2abccadf2aaaccdf2a1c301d1abecccf2ea6deef2020180522b8fedf20a010acaa8a73ca90b010bcaa86301d1aaaf3aa9aaed8dd26bae8cd28accadf2L4;ZBL8;FF210080520abb0094602b00b4fb0300aac00100b000c02e910", - "1048052e20318aa03048052e4031aaae50314aae6031baa07048052fa0f00f9f6100094e0431291BL8;FFe00313aa40000094080040b20811c0da081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aa080c48f81f0500b180020054L8;FF683642f9619243f9094940", - "f915ed40b918a140b917594f293f0100f1fa079f1a810000b4608e43f922008052a13a0094619a43f9f56b00f9810000b4609643f9BBBBBL4;FF880e005429040090297100918a0000102b6968384a090b8b40011fd601200591e003022ae20303aad7f4ff97403800b4210400b021a01f91230400b063c0", - "3491L4;FFfd7bbda9f65701a9f44f02a9fd030091687cc19bff0308ebc1020054747c019b0800f0d2f30302aa080102cb9f0208eb08020054b40200b4f50301aaf60300aaL8;FF29811f91287968f8e10308aae70a0114080040f9e20301aa002140a9e10308aaef0a0114ff0301d1fd7b02a9f31b00f9fd", - "830091130040f9e00301aae8030091BL8;FF490f00916842003908008092682600a9ef000014a8060091822600f109008092e80b0aa9e8830291ff1301b9ff1b01b9e95b00f9e96700f9e97300f9e97f00f9L8;FFe8d300b9a86e1c53e8cb00b9a86a1b53e8c300b9a8621953e8a71629a95e1853a85a175", - "3e8a71529a9561653a8521553e8a71429a94e1453a84a1353e8a71329BBBL4;FFe2031baa230080522400805218bdff97b7035ef8ba035df8480317cb7f0308eb69e3ff54a0c300d1e10317aae2031baa23008052240080520dbdff97b7035ef8L4;FB000000000000000008000000000000000800000000", - "00000048ff4500000000000000000000000000080000000000000008000000000000002400460000000000L8;FF6093c03ce0938f3ce88700f9730b0094e1b343f9fcb743f9fabb43f9f8bf43f93f0400b1803a0054e0ebc13de1efc13d684340f9e2f7c13dfa8302f9e04f813dBL8;FF42008052ab4a019", - "4687e40f9a80000b4608240f901f97fd342008052a54a0194688a40f9a80000b4608e40f901f97fd3420080529f4a0194689640f9a80000b4L8;FFf30b40f9fd7bc2a8c0035fd6e80300aa098d40f83f0500b1201a0054f30300aae00308aab3020094e80300aae00313aa090140b22911c0da291540d229", - "0d098bBBBBL4;FFe183059122008052810241ad820e40adff1701f9e81301f9610203ad620e02adaeea0194e20f40f9f9c30891ff7f0739420100b4e81341f9e91741f960020291L4;FB08000000000000000800000000000000707e42000000000000000000000000000800000000000000080000000000", - "0000407f4200000000000000000000000000L8;FF27eaff97770a40f9680240f9080117cbbf0208eb280b0054680640f9e10316aae20315aa0001178baaea0094e802158b680a00f9952240f9550300b4610a40f9BL8;FF036b01941f0400f12001005412000014e0031faa1f0400f1a00000540e0000142", - "00080521f0400f1610100542800178b1f0114eb1705009182fbff54a96a6838L8;FF680e00f9f50000b4f30314aae00313aa52050094b50600f173a2019181ffff54e81f40f9c80000b4090d8052e00314aa02018052017d099b9e6a0094e17740f9BBBL4;FF7f22003928008092680200f9b50000b4e003", - "14aae10315aa22008052a5aa0194f44f51a9f65750a9f85f4fa9fa674ea9fc6f4da9fd7b4ca9ff830491c0035fd6L4;FFe1031faa4cffff17fd7bbba9fa6701a9f85f02a9f65703a9f44f04a9fd030091361040b9135040a9df060572c0170054b601e0379f8200f1e2040054e8031faaL8;FFf85f43a9fa", - "6742a9fc6f41a9fd7bc6a8a8aa0014f6a340a9e183009102308052131940b914814039e00316aaa9aa0094a10240f9d3c200f9d4220639810000b4BL8;FF200705ad200543ad200703ad200944ad200b04ad210141ad210301ad200942ad200b02ad200540ad200700ad1139ff97e0234da982e20291e163", - "40f9081140f9L8;FF8100805200001891ff0316b9dd290094e0074091fa0356b98100805200001891ff0316b9d7290094e0074091f70356b98100805200001891ff0316b9d1290094BBBBBBL4;FF3f0500b1e0000054e003082ae10314aae20313aacdfbff9780faffb4260000149f5a00a99f0a00f9e003", - "082ae10314aae20313aac5fbff9780f9ffb41e000014L4;FFe00301b9a04700d16bc4ff97e0fb00b9a04700d168c4ff97e0f300b9a04700d165c4ff97e0eb00b9a04700d162c4ff97e0e700b9a04700d15fc4ff97e0e300b9L8;FF0920003909819f1a9f7d02710a819f1a8d0d00122e18403929010b0b4a", - "114c0bbf25007129c100110b819f1adf7d02710924003949c100110a819f1a09280039BBL4;FF08e13491f40b00f9f52300a906000014600640a96800009008e13491f50b00f9f42300a9220300d042f83391e3030091e80f00f9bc920194f44f44a9f65743a9L4;ZDL8;FF4a25019129194a8b290500912", - "00108ab62000054fd7bc1a8c0035fd6800100d000802a91a6920094800100d000001c91a3920094600100f000001491a0920094BBBL4;FF8b020acbcc020beb8de179d3df020beb4b01168b8b828b9aac110ccb9c819f9a6a010aebe00d00540b0e8052f8031faa59ed4092087d0b9b28a10b9b49e179d3L", - "4;FB0000dd84009d009d00000000000000000000777a16b316b30000000000000000000000000000000000000000000000000000a28cab96ab960000010075402ca1L8;FFf70316aa89008052e97300f9f6ef49a908008092f4030baafa8700f9eb0319aae87700f9e4a74ba9eef347a9f9031eaafe0314a", - "ae80317aaf70316aae1d348a9BL8;FFb4110094e1d342f9a3fbff17e043169122008052af110094e1d342f9bbfbff17e043169122008052aa110094e1d342f911fcff17e043169122008052a5110094L8;FFc0035fd6000100f000e03e91020100f042c03f9121068052c7520094e8ff42f9e90343f92001", - "0090002000912301009063a007912401009084000191e2833291BBBBL4;FF8b6e40f9a9035af80a1140b8150140390c5140781b7140f81cf140f87f0500b1ea8300b9aa835a381a7141f8167d4039ec0b0179e94700f9ea43023920070054L4;FB0000000000000000010000000000000001000000000000", - "00b4ad42000000000000000000000000000400000000000000040000000000000020ca420000000000L8;FFe80300f9e0030091c9e7ff97e10300aae10300f9210200f021681b91230200f063101591e0030091c20180524400805201e7ff97e00340f960ffff17c80080d2BL8;FFab235538e00740ad290", - "1084a4a01084ae0c30291a9031538a93355386b01084aaa131538aa435538a1c302d1ab2315382901084aab535538a93315384901084aL8;FF780300b4e1d342f9e8cb42f9f97b49f91f0101eb208d0054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9610f0094fad342f9e8cb42", - "f9BBBL4;FFa26301d1bf233ba9bf031cf8cf9bff97a1237ba9a00800b4e10800b4f80300aae00308aa22008052a2b20194e00318aa38e9ffb460000014a86303d1a26301d1L4;ZBL8;FF56010bcb210140f9966e01a93f0400b100feff5439e941a937e143a9352145a9e80f00f9810000b4200540f92200", - "8052a0b20094b90000b4e0031aaae10319aaBL8;FFe0833291a102009021600d91a2018052a302009063bc0d91240280522b000014e05306f9e0833291a102009021600d91a2018052a302009063a0089104018052L8;FF02288052b332009448058052e90000b0290d0c91e8bb02f9c80080d20800f0f2f", - "a9304f908390091e9b702f9e8b302f9e80000f008b140f91f0500f169050054BBBBBL4;FF0800669e0cc101f2c0030054eb0700f98801c0daec0b00f90811c0da880f488b0801198a571b08cbe8025df87f0308ebe1010054e1825cf8e00309aae2031baaL4;FF010100ade083c83ce183c73ce90f00f9e9", - "8741f908018052eb2702f9e18318ade92b00a9e8e300f9aa020094f7031faa1a05805228008052e82f00f9e8661a9bL8;FFf65741a9fd7bc3a8aa020114f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f30b00f9fd030091012440f9f30300aa3f0400b140010054810000b4602a40f9BL8;FFfd43009", - "1010300f021802991240300d084602291e323009182008052e80700f9e6820194fd7b41a9ff830091c0035fd6010300f02170299182008052db820114L8;FFf30300aa1610805235000191383040f92000178be21640d2e1031f2af91640d216140038a18200943f1f00f1a8010054800640ad80020191e1", - "03009122008052BBBL4;FF4ac110aa29094039e0030091eb1300f908010aaaeca30039ee0300b9ed0b0079e91b0039f1f300f8e87300f8eb7301f8ec7f0039059a0094f40301aa6101f8b6L4;FB0000000000000000090000000000000009000000000000005077490000000000577749000000000000000", - "0000000000000000000000000000000000000000000L8;FF8a0000102b7968784a090b8b40011fd6895643a91600f0d28082c03c880e40f9810ac03da003933ca80314f841838c3ca98315f860010014e083029181220091BL8;FF0803168b680a00f9540300b4610a40f9680240f9b51240f91f0101ebc0", - "070054680640f9490380522a040091e00314aa6a0a00f909692138e10313aa50fbff97L8;FFe0430f91c955fe97f82740f9e81f40f91f0308eb61000054e0e300911479fe97080d8052e92340f90827089b29008052097d02a9090180521a7100a91c070091BBBBL4;FFff0600b100030054f84305919900", - "8052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb23cb00541803008bf9feffb50f0000141f0400b1L4;FB1ced4800000000006a00000000000000120100002e0000001ced4800000000006a00000000000000bd0000002e0000001ced4800000000006a00000000000000L8;FF48", - "080054e81b40b9c8180037e8018052e8632d393e000014a003dd3ca8035ef809008092690200f953000014e0dfc03de8c341f9c082803ce8b705f934000014BL8;FF02028052a80f00f9f762019468c20091c10200f021c03091e40200d084003d91a363009122028052a80f00f9ee620194ee620194fd7b", - "41a9f31340f9ffc30091L8;FF47000014e10300a9e00301aae10309aa22008052f4030daabd050094e10340a9ed0314aa2aa040a9536928380cfc71d308050091290040f9280800f90cfeffb4BBBL4;FF1b95ff97f82b40f9f92340f9280318cbdf0208eb29f3ff54e0030191e10318aae20316aa2300805", - "2240080521095ff97f82b40f9f92340f990ffff1720008052L4;FF84fc44d304e01f786500056b20010054e103054bbf1000711fc921384d0300541fb11f380614805205c11fb801d05f382210001283060011c200020b02d01f38L8;FFa40100d084002591e323009182008052e80700f9e9a20094fd7b4", - "1a9ff830091c0035fd6810100f021fc159182008052dea20014080040f9e00301aa090140f9BL8;FF299123914a0200b04ac10d91e8a701a9e8230091800200b000980791e8ab02a9a8630091a1831ff8820200b042e01191e8a703a9e8430091e1630091e8ab04a9BL4;FF80010054c1025ef8810000b4c", - "0825ef822008052a7220094c1825ff8e1feffb4c00240f922008052a2220094f3ffff17686640f9c80000b40805088be00314aaL3;ZBBBBBBBBBBL4;FFef11c0daeffd43d3ddffff172d2100d1ad01168abf2500b16819005408fd79d36d020d8b686a2938a8210039b1ffff172e2100d1ce01168adf2500", - "b148180054L4;FF8b0200b5e0030caa1b000014e10300a9e00301aae10308aa220080522300805224008052f4030caa87000094e10340a9ec0314aa2aa040a9290040f90bfc63d3L8;FFfd7b43a9ffc30191be050014a04300d1b55f3fa9fffbff978002009000801a91aa1f01948002009000e01a91a71f", - "01948002009000802291a11f019480020090BBL4;FF290bc0f2e87f08a9e8270ba9b59f0194f81b40b9880a00910900809295630229892300a9fc0740f9bc0000b4e0031baae1031caa220080529e9f0194f44f53a9L4;FF207c0253426005910004412a070000d0e8c002910008402a0010402a0020402a", - "0a0400114001200a007c091b007c1b53404860380004005100741e5302040011L8;FFfd430091130040f9e00301aa810100d021681b91e8030091c2018052f19f0094810100d021101591a40100b084002891e0030091a363009142008052b30f00f9BBBL4;FFad000054390300eb436c00541803008b060", - "000141f0400b1c16b0054c8df01941f100031416b005439feffb505000014e043059181008052c3df0194806a0035L4;FBaa010000090000007d004900000000004a00000000000000b10100000d0000007d004900000000004a00000000000000b1010000200000007d00490000000000L8;FF28c840f97", - "40a00f96922003909008092690200f9e80000b420cc40f9f30301aae10308aa22008052a2df0094e10313aa28d440f9e80000b420d840f9f30301aaBL8;FFfb0b00f91beb7bd3fadf0329f62700b9a45f0194e0031baa01018052a25f0194000800b416400091fa0318aae00700f90a00001435008052dc5", - "63fa95a0700d1L8;FF22008052c2020094610a40f9a1ffff17e00313aa22008052bd020094610a40f9bdffff17e00313aae10318aae20316aab7020094780a40f9680240f9080118cbBBBBL4;FF4f00261e8f0500372f00805202000014ef031faaad210091a001108b10000b8a426970fc438c202e71006", - "69e32c201f2a1fbff54e8ffff17e083c43ce183c23cL4;FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000694f001400000000000000000000000000000000L8;FF24008052f4030baa89150094e10340a9eb0314aa2ca040a9290040f90af", - "c78d39369283808050091280800f96af3ffb4d4ffff17e10300a9e00301aae10309aaBL8;FF6800c8376800d037c97f0114c27f0114f77f0114090040f9281040b9200140f96800c8376800d037d77f0114f17f0114f17f0114082440a9e20301aae00308aaL8;FF3becff97e1630091257fff979f0700b1", - "80000054e1630091e00315aaa994ff97888240f91f0500b18000005480020491e16300910b93ff97889e40f91f0500b1BBBL4;FFe80300f9e9230039560100b4e10316aa22008052a7bf019406000014f8031faa880300f008c1319157038052e80b00f9b50000b4e00314aae10315aa22008052L4;FB2d0", - "0000000000000a200000009000000000000000000000010000000000000000800000000000000d0e847000000000000000000000000000000000000000000L8;FFf65742a9fc5f41a9fd7bc4a8c0035fd6c50100d0a5602c91e123009182620791e0031f2ae3031faa18c00094e8430091c50100d0a5202d", - "91e1c3099102210191BL8;FFa93f0194601800b4e10314aae20315aaf60300aaaf3f0194571740f9570400b4541340f99f3f0194e00317aa210080529d3f0194601500b4e10314aae20317aaL8;FFc0035fd63040ff97fd7b43a9ff030191c0035fd60001009000c01391ab3f00940001009000201491a83", - "f00940001009000801491a53f00940001009000e01491BBBBBL4;FFfd7bc3a817fbff17e00313aa22008052230080522400805215020094610a40f9dbffff17e00313aae10316aae20314aa23008052240080520d020094760a40f9L4;FF01813191b30f0094a60f009400c4805221008052a40f0094405d", - "00b4e10b409102c48052f60300aa21c00e91a90f00949c0f0094008c8152210080529a0f0094L8;FFfd7b46a9f33b40f9ff030291c0035fd6ff8301d1fd7b04a9f32b00f9fd030191f30301aae10300aae0230091e2031f2ab8fcff97ea0740f9e8c341f8690f8052BL8;FFb98f019420008052e10316aab", - "68f019420008052e1031caab38f0194ff8300d1fd7b01a9fd430091280440a92903009029b10d91220300b0428c1091e02700a9L8;FF60020079f44f42a9fd7b41a9ffc30091c0035fd6a80100d008010191e9030091630100b063c02291640100d08440129100210091e2230091f40301aa21008052BBBL", - "4;FF61fcff54e0830091e5050094f81740f9dfffff17f4031faa3a0200b4f50318aaf6031aaae00315aa145e0094080040b20811c0da081540d2080d088b08250191L4;FB5557dad0491d752b732ca28cdf4ccddb24ff83e900003a05aaddbdd27e5b35f1d99e1a8ab274f443629e0b8a2052e37c1b54702", - "5166ebfbac4a81af8d33a8fedL8;FFf0031aaae90316aaeadb40f9fb0309aaeec300f9e82f40f9f07315a9ec030baaf67b40f9ef7347a9e8f700f9f0008052e30302aaebcf40f9ee174da9e97b4ca9BL8;FF017c0353210200341f1100f160020054e003082ae20313aae303142ab5ffff97c0fdffb4d2ff", - "ff17280180d2e00700f90800f0f2081500d1deffff17e90b41b2L8;FF880240f9680000b4e00315aa00013fd6810640f9810000b4820a40f9e00315aaa44f0094e863019100610c91c5e7ff97e8a75139c8000036e14741f9810000b4BBBBL4;FF1f050071810100543f0c00b12904005428008052e90300", - "f029092691680a00b928038052692201a908008092680200f90d00001428008052e90300f029cd2591L4;FB6b65790000000000fe924800000000004c000000000000005900000009000000fe924800000000004c000000000000005a00000009000000fe92480000000000L8;FFe80b41b2e00700f90400", - "0014c80080d20800f0f2080500d1e80300f9e0030091c3e4ff97e10300aae10300f9210200d021c01491230200d063101591e0030091BL8;FFf40302aaf30300aa080115cb5f0008eba8010054b40000b4680640f9e20314aa0001158bab6f0194a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3", - "a8L8;FF4901805209692138ead302f95a220094e1431691690c0094e0b349f9800100b4e1d342f9e8cb42f91f0101eb20390054e8cf42f9090180522a04009109692138BBBL4;FF6a06805228048052ff2703a9690300b029150a91e92b05a9290080d2492dc0f2e87f04a937000014e00742ad686200a96", - "08600ad3a000014010b42a9e00317aaL4;FFfd7bc6a847ffff17e0031faab6afff97a0877ea9b4afff973ffc3ff16900005420008052c0035fd6fd7bbba9fc6701a9f85f02a9f65703a9f44f04a9fd030091L8;FFa94300d1fa03002a00210091a22300d1fb03012a21008052e30315aae40316aaa8273fa", - "9d7af0094e0031a2ae1031b2a28e340391f05007181f8ff54ddffff17BL8;FF290c40f9e1830b9120013fd6fcfb42f99f0f00b1c106005488008052f46f41f9e8230b3949008092f36b41f9690300f9880240f9680000b4e00313aa00013fd6L8;FFe10316aab82f00942000805221028052b52f0094e000", - "009000600f91bc2f009420008052a1028052af2f0094ffc306d1fd7b15a9fc6f16a9fa6717a9f85f18a9BBBBBBL4;FF290400f0290100918a0000102b6968384a090b8b40011fd6010440f9410300b4000840f922008052f44f41a9fd7bc2a8a017021413d041a9880240f9680000b4L4;FFe20315aa0040", - "1d91fa0a0094f5ab4bf9bf0600b1c0230054e0dbc53dfcaf4bf9e077803dbb0000b4e0031aaae1031baa220080529f170094280340f9fb074091L8;FF28008052145400a9080800f9680200d008011c9174da00a9600e00f9680200f9f44f42a9f65741a9fd7bc3a8c0035fd6280080527f7e01a9680600f", - "9680200d0BBL4;FF81f5ff5445000014b4835df841000014a0031df84103009021c82491430300906344259136000014a0031df84103009021c82491430300906314259130000014L4;ZBL8;FF81ffffb4e00240f922008052a9970094f8ffff17d50000b4a806158be00314aa0201805201f17dd3a29700", - "9408008092680200f9f44f43a9f70b40f9f65742a9BBBL4;FF609a40f922008052aad70194749600f9f44f41a9fd7bc2a8c0035fd6ffc302d1fd7b06a9fa6707a9f85f08a9f65709a9f44f0aa9fd830191097c40f9f30308aaL4;FB65616479207265717565737465643a20c0001a53656e64206b6579206", - "5706f6368206465637265617365642028c004202d3e20c001290010496e76616c696420L8;FFe88704f9e8031d9108e107910001803de88340f9e89b04f99c190094e8eb41f9eafb41f9e9f341f9eb1342f9f96b42f9ec6f42f9e84700f9e8ef41f9fe7342f9BL8;FF22008052ab570194e18349f9e1acff", - "b4e08749f963fdff17e18b49f93f0800b1800100543f0400b140010054810000b4e08f49f9220080529e570194e19749f9L8;FF020280522301009063a0379104028052f500001448008052e0a33239e0833291e8a73239c80080d20800f0f2e85306f9bf4cff9770000014e05306f9e0833291BBBBL4;FF", - "41030054880200f96800805235000014770240f9761a40b9f50301aaa1f7019400028052010180529ff70194800600b4e8420291e10315aa160800b9080000f9L4;FB08000000000000000800000000000000c87f42000000000000000000000000000800000000000000080000000000000020814200000", - "000000000000000000000L8;FFf65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6170080923800805219018052a80640f91f0116eba90c0054e00313aa89f6ff97e80300aae00301aaBL8;FFa90356f8691a00f909008092608600ad692200a91c0400b524000014a1770194c006805221008052", - "9f770194c00600b4080300f008510891695b0091000940adL8;FFe843169101610091e04f813db1770094e063c13de8a342f9e907409129c13591f73340f9e157c13de0f3863de05bc13dea670291e8d700f928e341f8ff0600b1BBBL4;FF9f0314eb8801005418000014f52740b988031f8be80208abe3f", - "3ff54a003009000e00991a6b70194f51b40f99f0314ebc9010054e00315aae1031caa22008052L4;ZDL8;FFc0020054290500913f0102ebe90700f96101005420844cade80300aa226cc03d000400ad202000910209803d021900f9fd7b41a9ff83009104b1ff17c5010090BL8;FFfc6f01a9fa6702a9f85", - "f03a9f65704a9f44f05a9fd030091ff033ad1a902009029c13b91ff0300f9e97301f9fb0308aaa84700d1e97701f9890c40f9e0070aa9L8;FFa8370094e06b40f921008052a6370094a0fe00b4e26b40f9e10315aaf70300aaac3700944b000014608652ad08010090629ec03df5c30d91800700ad820b80", - "3dBBBBBL4;FF0043c63c0143c73c0243c83ce10179a9e0853ead0043c23c0143c33ce2019f3c0243c53c3f0400b1f6dd7aa9e0853cad0043c43c0143c13cf4557ca9e0893dadL4;FF33008052285440a9f4cf00a9ff0f00f9bf0214eb49f9ff54e0230091e1031faae20315aa2300805224008052f30308a", - "a85e8ff97e80313aaf35341a9c3ffff17L8;FF09200091e80301aae50300aaa9831ff8490200f02b411d91410200f021c01d91430200f0634c1091a92300d1460200f0c6c01c912a018052470200f0e7ec1d91BL8;FF4002005481025df8810000b480825df822008052a787019481825ef8810000b48002", - "5ff822008052a2870194810e40f93f0400f1ebfdff54801240f922008052L8;FF684201916101009021d01d91640100f084200a91a363009142018052a80f00f9f1870094682202916101009021f81d91640100f084200f91a3630091a2018052BBBL4;FFe9008052f51700f9fa0301aa1f01096bf503092", - "ae05f06a9a11b0054570080d2e00306911700f0f2978300f9ebafff97490080d25f0700b1f5d301390900f0f2L4;FB207374617465202862617365206b657920c0012900204e6f2076616c69642073657373696f6e20666f7220726563697069656e743a20c01b2c2063757272656eL8;FFe0d7803d01908", - "0522841082a69914bb8e023c23de10b19ade127c23de22fc23d3b8108aae97344f9eaef43f9e00717ade02bc23de10fc23de9a301f9e97740f9BL8;FF0b00be522b000b0bac1d00128d00f83761710c8bab008052300000144d15c039ae1d00128c1d0e0b8c0102518d00f83761710c8bcb0080522800001", - "49f114071L8;FF29050091200108ab62000054fd7bc1a8c0035fd6000100b000601a91a8470094000100b000c01591a54700940001009000203691a2470094fd7bbfa9fd030091BBBBL4;FF8b000054602a40f922008052a9e7019408048052746200b9a00302d168da04a9e3830291e10315aa682e00f93", - "30080520204805224008052f3830239a3490094L4;FB000000000000000028a848000000000038a848000000000007000000000000000600000000000000000000000000000000000000000000000000000000000000L8;FF000705ada083dd3ca183d73c000b06ada083d83ca283d93c010303ada083da3", - "ca183d33c020304ada083d43ca283d53c010301ada083d63ca183d13c020302adBL8;FF20008052018c8152c2670194fd7bbda9f65701a9f44f02a9fd030091e10200b4090040393f01037141030054f30301aaf40300aaf60308aa9a670194e00313aaL8;FF611a40f9810000b4601640f922008052a867", - "0094614640f9e10400b408108052606a68f822008052f44f41a9fd7bc2a8a0670014611640f9810000b4601240f9BBBL4;FFa8035ff8697201f8691d001268f201f828008092aa1b00b9ab831f386cf200786a1201b8699e0039680200f9fd7b44a9f32b40f9ff830191c0035fd61f090071L4;FF600400b", - "4210000b0211842b9c10300347ffe3ff1690400549302138bf51300f9622e4092150082d2600202cb0100805264090094130014cb7ffe3ff109030054L8;FF08596c786001094a01010a4af44f43a9f51340f9fd7b41a9ff030191c0035fd6e801009008010191e9230091830100f063c02291a401009084", - "401291f303002aBL8;FFfd7b02a9f31b00f9fd8300910a7c4039f30308aa08088052090040390010c03c01f0c03c48150033e003009129111d12e013803ce87f003968060091e9030039L8;FFe10313aaf44f42a9f65741a9fd7bc3a8c0035fd6c00000d000601391a8270094e00301aae10302aad626001", - "4ff8300d1fd7b01a9fd430091a01300d181008052BBBBBBBL4;FF0b170b8b2a6b28382903098be80328aa7b0700d12a2100392817088ba90600d1610140ad3501158a010100adfbfaffb521000014090180520801098b29210091L4;FFdf0a00b1e00b803de81b00f9c1000054e1230091e2830091e00315", - "aadbf6ff970c000014e01bc03de10bc03de81b40f9e10740f9a0839e3ca1039d3ca8031ef8L8;FF930a00f9f44f42a9f65741a9fd7bc3a8c0035fd6600200f000c01d91a81b0194fd7bbea9f44f01a9fd030091f30300aa148000910180009100008092081c0194BBL4;FF2901054aeb3f40b9ea4e0039e9", - "520039e95e4039ea5a40390801064afa430391e8560039e862403929010b4aeb4740b94a01074ae95e0039ea5a0039ea664039L4;ZFL8;FF090840f949fdffb5e90309abc2030054280108ab42040054091440f9090300b40a1040f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0da", - "BBBL4;FFf307409173420f91e1074091220080526002029121400f91fb4b0af9e017853de11f853de00747ade01b853de123853da0077aadff4f0af9e0f7843da20378adL4;FB3000000000000000080000000000000014614400000000006465736372697074696f6e00000000001453440000000000180", - "00000000000000800000000000000L8;FFeb0b43a9ee031baae76f44a9ec0318aae46740f9ed0740f9e60316aae33b40f9fe1740f9e03340f9f5ef40f9fa8740f9e0c7c33da8008052f80306aae87300f9BL8;FFff0600b120a1813ce04fc13de8cf0ef92800805221a1803c40f18f3cf6bb0ef938210039", - "28250039f4cb00f9a00b0054e8c30091e0431691008542ad0201c73cL8;FFf36b41f9c80240f9680000b4e00313aa00013fd6c10640f9810000b4c20a40f9e00313aaa35b00949f0a00b121010054e01bc13de11fc13db47e0853e88344b9BBBBL4;FFfa6715a9f85f16a9f65717a9f44f18a9fdc3049109", - "a04039291a0037155840a9f30300aa0080c13cf70308aae8030291e00316aae01f803d79fb0194c8624039L4;FB732e696f2d313934396366386336623562353537662f70726f73742d302e31342e342f7372632f656e636f64696e672f766172696e742e7273002f636172676fL8;FF3f0900b140210054", - "880080d20800f0f2080900913f0108eba120005481220091e20313aa45080094f50300aaf50100143f0900b140220054880080d20800f0f2BL8;FFe00318aae10313aab77b0194170040f9f40308aaa37b0194e00313aa2100805238008052a07b0194c0feffb4f50300aa0801805208000039b60000b4a0", - "060091L8;FF8b91ff97f71740f9e80f40f9080117cbbf0208ebc978ff54e0630091e10317aae20315aa23008052240080528091ff97f71740f9befbff17f60300aae0630091BBBL4;FFfa675ba9fc6f5aa9fd7b59a9ffc30791c0035fd6080400d0fc03152ad702008b080140f949d03bd53401088b08ee8", - "252894240399f0308eb9b33889a3f050071L4;ZBL8;FFe08f803de92301f9c00b0054e037c13de13bc13df4230991e243c13de92341f9e0431291e00610ade03fc13de1230991e12fc13de82701f9e00a11ade033c13dBL8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb880b0", - "0546d000014f30300aa1dfdff97e80300aae00313aa090140b22911c0da291540d2L8;FFce0300141f150071a01000541f190071c1110054607e42f9618242f9290c40f9e8830f91e1031baa20013fd6f6834f39df0a0071e1140054c8008052df010014BBBBBL4;FF5afeff17e00313aae10317aae20315", - "aa230080522400805215feff97770a40f9680240f9080117cbbf0208eb89cbff54e00313aae10317aae20315aa23008052L4;FFf76300f9f6570da9f44f0ea9fdc30291553040b9f30300aaa8c300d1e00302aaf40301aab6c300d1f53f00b9d663fe97a8035df8c082c03cc182c13c1f0900b1L8;FF010c", - "40f921feffb408048052006868f822008052a70b0114010440f93f0400f14bfdff5408028052006868f822008052a00b0114fd7bbca9f85f01a9f65702a9BL8;FF621200b4e10240f9340080399400f8b728040091490400d1110000145f2800f1880000542800028b08f1df386804f837a0c300d173f4ff", - "97a8035db8a8140037L8;FF4dd4ff97e00313aaf34f41f9e2ffff1718018052ff0f00f9a9000014f90314aaa08b0094e00318aa410080529e8b0094a05d00b4ea3340f9f40300aa08080091BBBL4;FFa1c300d1e00316aa49038052aa031ef80969373813b7ff97b7035ef8ba035df8480317cbdf0208eb0", - "81b0054160100b4a8835df8e10b40f9e20316aa0001178bL4;FB4e0000000000000001050000140000004d6573736167654c656e6774684576656e4d6573736167654c656e677468546f6f4c6f6e6753657269616c697a617469L8;FF0035c03d0843152ae28718ad2181cd3cf7430d912281ca3c2481c73", - "ced0316aae38717ad2181cb3ce60309912381c83ceabb43f9fa6b00f9e28716ad2181c93cBL8;FF601240f922008052aa4b0194610640f9810000b4600a40f922008052a54b0194603240f9a00000b4613640f9610000b4220080529f4b0194611e40f9e10100b4L8;FFad194e8bbf010cebe30100546b05", - "00f1ec030daa81feff54a90109abe2000054200108ab62010054fd7bc1a8c0035fd6e90309ab63ffff54000100b000c03591BBBBL4;FF438742ad40e3c63c4213c03de87f15a9e043803de1238f3ce3238e3ce2238d3caeeb0194c2fe47d3d5de7992d91a4092ff3f0439020100b4e82755a960020291L4;", - "FB0800000000000000304b420000000000000000000000000008000000000000000800000000000000304b42000000000000000000000000000800000000000000L8;FF9f0208ebe9f6ff54e00313aae10316aae20314aa230080522400805284010094760a40f9afffff17fd7bbca9f70b00f9f65702a9f", - "44f03a9fd030091f30301aaBL8;FF683a00b9e83346b869520478e943413968b203b808048052680201a9e85b40b9695e0139681204b8e82740f96082823c68f204f8e8274129611200f97cfe0039L8;FFfd7b43a9ff830191c0035fd6f503012a74040051e00313aad7070094e80300aae00301aa28fc07", - "3708fc60d3c80100b5080840921f1900f102020054017c0353BBBL4;FFf44f07a9fd030191f50301aa298440a9f30300aaa85300d1f40302aae00309aac2830094b6c35e38df0a007120010054808640a9a85300d1a0d3de3ce003803dL4;FFed118b9a0b128b9a1f004af20f781753ab018b9a1f004bf2c", - "b018b9a10785ed39f010f6a6d0150b2ae118b9a1f0068f2ce0147b2ad018e9a9f010f6aae118b9aL8;FF5a0700f1e12700f9c1feff540a000014e0e3009142008052230080522400805283c1ff97e00744a9f3ffff17f5e703a9ff2700f9f50b40f9e80340f9bf0208ebBL8;FF2083cb3c2183cc3ce9a70c", - "912283cd3ce8bb01f9e863019120f18f3ce9e70c912083ce3c21f18f3ce9270d912183c73c22f18f3ce9670d912283c93c20f18f3cL8;FFa1035df8015700b5bb020014ba031ef8e8e350391f050071a1070054e9030291e8074091e08326910801189121e50e910d04ff97e80356b9f9074bf9f80b4bf9B", - "BBBBBL4;FFe10309aa220080522300805224008052f4030aaa16060094e10340a9ea0314aa2ca040a9290040f99369283808050091280800f960f9ffb63f0108ebe0000054L4;FFa913009420dd00b4a80000b008a53991e90300aa0001c03d08e140f8ec0741b2c20280520000803d08e000f8c8028052e", - "8bb00f9e16b42f9c10100b4e0031baaL8;FFf32340f9ff430191c0035fd6ff0301d1fd7b02a9f31b00f9fd830091f30308aae82300911d020094e86340391ffd0371e0000054c8008052680200b9fd7b42a9BBL4;FFe9ab05a9a9a300d1e1630191a8831df8e8230291e9ab06a9d5930194740a40f968024", - "0f99f0208eb61000054e00313aa3493019408038052690640f9e083c83cL4;ZDL8;FF68320191610100f021281991840100d084202991e0230091a32300d122018052a8831ff8f0930094940100d094a20a9168c20091610100f021c01b91a32300d1BBBL4;FF480080520900f0f2e0830091e8a70039290", - "90091e91300f9c5c80094f50300aa0d000014f51740f908000014e80741b202000014e80f41b2e0830091e81300f9L4;FBd99bf75aca140a0f60a97adc044a0805a72f22bb307eeacc72408843d6594d605218f974a29ecfe184fbb0b822c03c330d1805b600000dea744893d76342c9beL8;FFfb0304aae", - "4031caaec031baaeba71ca9eb0302aae98b40f9f91b00f9f9031eaaf20b00f9f20307aae7af40f9e9b700f9e9c740f9edfb48a9e8ab18a9ea5340f9BL8;FF09692138e1431691ead302f95c0c0094e89b49f91f0500b1c0000054e8074091e143169108810991004103917f0f0094f87f49f9580300b4e1d", - "342f9e8cb42f9L8;FF58914078f46b41f9e03f813de143813de91305b9680000b4e00314aa00013fd6210740f9810000b4220b40f9e00314aaa05300949f0b00b14102005435030036BBBBL4;FFfb0300aaa0e300d1e8270129f70f00f9f7030aaaf1dbff97e8430191e0031baae10317aafb0b00f947cd0", - "094e843413968060036e8634139e10f40f91f050071L4;FB3c000000050000009a9648000000000033000000000000004e000000050000009a96480000000000330000000000000034000000050000009a96480000000000L8;FFc80080d2e00700f90800f0f2080900d18affff17e80b41b2e00700f9070", - "00014e90b41b2e92300a98cffff17c80080d20800f0f2080500d1e80300f9e0030091BL8;FFa00b3fadde73019400e4006fbf0318f8a0833aada003973ca8da77d3a0877aada10301d1e00314aa22008052080d17aaa0073ead080dc0daa88318f8a2837badL8;FFd6620091000b0054c1825ff881ffffb4", - "c00240f922008052a6730094f8ffff17e17749f93f0800b1e0adff543f0400b1a0adff54810000b4e07b49f922008052BBBL4;FFa0835bf822008052aab30194bf0600f1ab000054e00316aae10315aa22008052a4b30194e00314aaa99bff9708008092686e00a9ff830891f44f45a9f65744a9L4;ZBL8;", - "FF0043c13c2005803d09810091c86a40b9c93200f91f050031e0160054090500119f02096b09050054c10a44a9e0230091e30315aabbfcff97c86a40b90901172bBL8;FFf50300aa3d010014f9a345f9f5a745f9e0c32791f3ab45f90163009102288052ac3301943f0700b140270054e0c32291e1c32791", - "02288052a6330194e0c31d91L8;FFe10000b021e0029102028052e30000b063140b91c4018052da000014c80080d2e0632a39e0432a910800f0f2ff672a39e84b05f9be28ff97e10300aae14b05f9BBBBBL4;FF290040f9080140f9291902cb000540a9220101d1b4feff17080a8052090040f92a0040f94", - "8fc089b290140f9200540a94801088b024101d1fefeff17080040f9L4;FF5f1900f1f6030daae1030eaaef0310aa000500540b1940396bc100517f25007128550054292d0c1b5f1d00f1f6030daae1030eaaef0310aac0030054081d4039L8;FFac030114f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a", - "9f44f02a9fd030091140040f9f30300aa9f0600b140020054610e40f93f0400b140010054810000b4BL8;FF200440a9e92300910a0000b04aa11991e8a700a9020300f042bc0391ea0f00f9e3430091c0830194fd7b43a9ff030191c0035fd6202040a9210300b0217c2b91L8;FFe8030091e00309aa6201", - "8052f5830094410100f021101591640100d084801b91e0030091a363009142008052b30f00f9ed83009468a20191410100f021d01d91BBBL4;FFe00308aaabc30194e00314aae0bf02f9810300f021883791830300f063003891e0e31591e20180522402805292ffff17e80f41b285ffff17c812009183ff", - "ff17L4;FBc9684900000000004a00000000000000b60200000900000034684900000000006a00000000000000550100002a00000034684900000000006a00000000000000L8;FFa9c30094001b00b4e10314aae2031caae05f00f9afc300940300001428008052e85f00f9e8db41f9ead341f9e9df41f9e8", - "2300f9e8cf41f9f50309aaeaa30da9BL8;FF080118cbdf0208eb29f8ff54e00313aae10318aae20316aaae020094780a40f9bbffff17e00313aa22008052a9020094610a40f9c3ffff17e00313aae10316aaL8;FFa90302d1e8430f91a20302d124010191030480520502805208440094e8eb41f91f0500b", - "1e01b0054e002c03de8f341f9e9030b91e17740f92015803de89301f9BBBBL4;FF1f0000f1cd000054390300eb23ec00541803008bf9feffb50f0000141f0400b181eb0054c6e301941f10003101eb0054f9ffff17c3e30194f70300aa1f0400b1L4;FB73e84800000000003800000000000000520000000", - "c00000073e848000000000038000000000000005b0000000900000073e84800000000003800000000000000L8;FFc90100b029e10e91e8cb03f9000200f000740c91e8432d91e1431e91e9cf03f9d3e30094e8ab45f91f0500b1a1380054f95b4bb9b9031db8480200f008b140f9BL8;FF00018052010480", - "52c2630194ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aac10200f021e02f91e8030091e00309aa42028052ea63019468620091L8;FF6b00f8376b008052430000143f004871030b00544b0dc0396c1d00122c540c0b810148516b00f8378b0080523a0000142b7c1c534b0a00344d11c0390", - "b00be52BBBL4;FFe10319aa22008052aaa30194da0000b4bb0000b4e0031aaae1031baa22008052a4a30194d70800b4e00316aa410000143f1d0071c10d0054fa031f2ae8031faaL4;FFe1031aaa050080d2040080124304805262008052000080d2930400941f0400b1a00e005402fe81d25aff4cd36312", - "40f9c40210914108d89a820600519c7e4093L8;FFfd430091810100f0210c1691a40100d084801f91e323009182008052e80700f9e6a30094fd7b41a9ff830091c0035fd6810100f021fc159182008052dba30014BL8;FFe0031faab8230194e00741a9b6230194ffc300d1fd7b02a9fd830091480200b00", - "8c10d9109200091e02301a9800200b000200391820200b042c00e91e1030091BL4;FFc80dc0dae90dc0dae82703a9e80313aab3230094f44f4ca9f94b40f9f6574ba9f85f4aa9fd7b48a9ff430391c0035fd6ff8301d1fd7b03a9f52300f9f44f05a9L3;ZBBBBBBBBBL4;FFe93280d2c826089b08ed7c92c", - "902088b212500b140fdff54a00208cb02018052a41d0294e6ffff17e003032aa81d0294f40300aae3ffff17ffc302d1fd7b05a9L4;FFf71740f9e003803d3aff48d3f6fcffb5eaffff17c000009000202991bc1d0094ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191L8;F", - "F132001a928008052081000f9180319ebc3020054680219ebb502198bf333889a954e00a9985a01a9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6BBL4;FF17108052e1031f2a95020191e08707ade00741ade247803de21340adf97b40f9e133803de40305ade00f42adf83f4339e227803d", - "8002188b021740d2e08f06adL4;FFe00701323f00006b00ffff54e00303aa480c80d2211080d2220080d2010000d41f9800b121feff54e00303aae10302aa010000d4edffff17e80300aae00301aaL8;FFe8230091820100d042200c91e3430091e82701a9c49d0094fd7b42a9ffc30091c0035fd6a80100", - "b008710c91e00301aae10308aa62028052dc9d0014080040f9BBBL4;FFe85341b9e81700b957ffdfc8770000b5ccdd0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054L4;FB4900000000000000920000001800000089094900000000004", - "9000000000000007000000020000000890949000000000049000000000000007c00000015000000L8;FFe96700f909b840f9e9ef00f909bc40f9e95700f909c040f9e96f00f909c440f9e95f00f909c840f9e9e300f909dc59a9e95b00f909d440f9e93f00f909d840f9BL8;FFe8f3687915008092e8e30a", - "79e057813de15b813de6010014e8074091f6af45f9e043259108810991f5074091b5820991469d0094f43349f9e0431691a1220091L8;FFf65702a9f44f03a9fd030091f30301aa210840f9f40300aa680240f91f0101eb600e0054680640f92a040091e00314aa490180526a0a00f909692138c5140094B", - "BBBL4;FFfd7b42a9ffc30191c0035fd6206300d1c9330094e9ffff17f90300aaa0c20091a24201912100805223008052ade1ff97a82643a92a01198a00696afc00a8200eL4;ZFL8;FF80040036480a00b5e1031faaccffff171f0800f1010d0054e1230091e20313aaffdf00a9ff0f00f9a8fbff97600d00", - "b5990a40f9880240f93f0308eb61000054BL8;FFffc30091c0035fd62103009021d03591e00308aa62028052fd7b42a9ffc30091e27d0114092000912103009021e83491040300d084601291a32300d1e00308aaL8;FFe81340f9490380522a040091e00316aaea1700f909692138e1630091207dff97f81", - "740f9e80f40f9080118cbdf0208eb48420054e81340f9e10317aae20316aaBBBL4;FF220400d109008092a86301d11a00f0f2b58b3aa9e90f00f9e91b00f9e92700f9a8831bf8a21000b417210091f5630091b86301d1360080522200001499bd0194L4;FB0800000000000000f465480000000000406648", - "00000000002c654800000000008c65480000000000dc6448000000000018f64700000000002800000000000000L8;FF0232805220f18f3ce9e7099121f18f3c00844cade8c701f9e8a7089100f18f3c00884dade8e70891e023009101f18f3ce867099102f18f3ce827099100f18f3cBL8;FF080100b4080", - "140b20811c0da081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0daL8;FFf44f03a9fd830091480001aba2020054010840a9f30300aae023009129f87fd31f0109eb0881899a090180521f2100f11481899ae30314aaac1500", - "94e80740f9BBBBBL4;FF90feff17e00313aa22008052230080522400805216000094610a40f997feff17e00313aae10317aae20315aa23008052240080520e000094770a40f9680240f9L4;FF4081803c4181813ce9bf0bf985ebff9708008092880200f9e89340f9a80000b4e08b40f9e19340f92200805", - "2a10d0094e8a340f9a80000b4e0bf40f9e1a340f9L8;FF8d0600541f190071800700541f1d0071010e0054202040a96102009021703c91030d40f9e2018052fd7b45a9ff83019160001fd61f050071cc020054e8060035BL8;FF5f050071e90300f9c1010054e9030091210300d021802991440300908440", - "2291e3230091e00308aa82008052e90700f9e28d0194fd7b41a9ff830091c0035fd6L8;FF200108ab62000054fd7bc1a8c0035fd6800100b000e03291a98d0094800100b000001c91a68d0094600100d000001491a38d0094ff8300d1fd7b01a9fd430091BBBL4;FF2081803c280100f9e00315aa9eb6ff9", - "75a0700f1b5c2019181ffff545b0300b468e379d3e00318aa01111bcb02018052f44f50a9f6574fa9f85f4ea9fa674da9L4;FB70745f7665632073686f756c6420626520636f6d706c65746500000000000000de194900000000005700000000000000a6020000200000006368756e6b207368L8;FF17504", - "0f9bf0600b1c04700540a9840b95f010971604700541f0500b1c07d0054ffcaff975c008052c00400146183c93c6283ca3c6083c43c6383c83ce107813dBL8;FF828707adeb1300b9ebe303b9200300ad034e0194e9bf4639e84346390a088052a00302d1f80310912a15003308111d12e8430639e803109", - "1eabf0639200740adL8;FFa94d0094a00900b4e10314aae20319aaf50300aaaf4d0094572340f9b6831ef8b8431fb8f70200b4561f40f99d4d0094e00317aa210080529b4d0094800700b4BBBBL4;FFe10740f9810000b4e00318aa22008052a8ed0194130800b4e00317aae10313aa22008052a3ed01946", - "80240b20811c0da081540d2080d088b08250191681a488bL4;FB607c420000000000496e76616c6964417267756d656e74000000000000000000100000000000000008000000000000007484420000000000496e76616c696453L8;FFf4fbff35f44f42a9f50b40f9fd7bc3a8c0035fd6e00313aa2200805", - "2230080522400805282030094610a40f9d8ffff17e00313aa220080522300805224008052BL8;FF41fdff54f70219cbf46b45a9f82300f99f021aeba101005429000014e9e30191e0830091f63f00f9a82739a9b57f3aa92c000014f9031faaf46b45a9f82300f9L8;FFe1031aaae20318aac1100094fad3", - "42f9fc0740919c83019144feff17e043169122008052ba100094e1d342f94efeff17e0431691e1031aaae20318aab4100094BBBL4;FF15008092814a40f93f0400b140020054810000b4804e40f922008052a5ad0194815640f9810000b4805a40f922008052a0ad0194816e40f93f0400f18b000054L4;F", - "Fe20314aa0001158b0a0f0094a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaf60301aae10315aae20314aa2bffff97750a40f9L8;FFff9701f9f59301f9ff9b01f9f59f01f9f5ab01f9ffaf01f91467179b9c0a40f91c2a003788ff7ed3282700b5fa0301aa5c0700b497", - "fb7fd39aad0094e00317aaBL8;FFb42d0194ff0600b19542039141020054e8031691e00316aa812d0194c8624039890200f029e11991e9d302f9fbc342f9f5c742f9e8631639f7cb42f9e8018052L8;FFf9074bf9fc0b4bf9a8e21839080180d2f80f4bf90800f0f21a017eb235000014b50000b4e00314a", - "ae10315aa22008052a02d0094080180d20800f0f21a0540b2BBBBBBL4;FFc0035fd6e80741b2e9ffff17f40301aa1f2900f1880000542a01088b4af1df384a03f837e0030091e10309aae20308aa747e0094e80340b9c8000036e00740f9L4;FF4283cd3cea6341f960838a3c4083ce3c61838b3c4183c73", - "c60838d3c4083c83c6183863c4183c93c6083873c4083ca3c6183883c4183c33c6083893c4083c43cL8;FF22008052400b0054290b00341a0000143f0d007101030054a80240391fed0171410e0054e12700b40a00018be9030aaa28fddf382822f836e9030aaa2beddf38BBL4;FF89364039ea774039e87", - "300394801094a893a4039ea7b4039e87700394801094a89424039ea834039e87b00394801094a89464039ea874039e88300394801094aL4;ZBL8;FF0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb880b00546d000014f30300aa12f1ff97e80300aae00313aa090140b22", - "911c0daBBBL4;FF5f2800f1880000542800028b08f1df388804f837e08300917a3e0094e82340b9e8460037e81b40f98a0740f9490108eb635600548a0340f9e01740f94801088bL4;FB5600000000000000ed00000009000000e11f4900000000005600000000000000a6000000090000005369676e616c", - "5f5051434b415f56315f4d4c4b454d373638L8;FFe8ab1aa9e8e343f9eaf343f9e9a309a9e8e743f9e9eb43f9e8df00f9e8ef43f9e8af15a9e8f743f9eb3b44f9e9a310a9e8fb43f9e90744f9e8b700f9e8ff43f9BL8;FF0900088b390500913f0308ebc9130054f87749f91f0700b1c0130054802202917", - "31c0094080040b20811c0da081540d2080d088b0825019109fd46d30800098bL8;FF4157ff5415fbff1728008052e80300f9f9d740f9f58b42b9f78f42b9fa1b00f9b958ffb513fbff17e8c31291fa8302910081c03ce86742f9a003983ca80319f8BBBBL4;FF28008052a203df3c800600ad820a803d68e", - "20039f44f4aa9f65749a9f85f48a9fd7b47a9ffc30291c0035fd60001805201068052b7f50194000400b000001d91L4;FB65646973747269627574696f6e5f7575696453656e6465724b6579446973747269627574696f6e4d6573736167657369676e696e675f6b65794964656e746974L8;FFe80300f9c", - "aeaff97e10300aae00301aaf44f47a9f92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd637008052180080921901805206000014e20313aaBL8;FF82018052a80f00f9f775019468c200910103009021e01791040300f084c01891a363009102018052a80f00f9ee750194ee750194fd7b41a9f31", - "340f9ffc30091L8;FF290340b22911c0da291540d2290d098b2925019129fd46d32905009102000014e9031faaf88b92b9380100340a0340b24a11c0da4a1540d24a0d0a8b4a250191BBBL4;FFe00301910103088be2ff0139b1b50194fc03019123000014e10b40f9020308cb8003088b188100d1350002", - "8ba9b50194683340f960030191e103019122008052L4;ZDL8;FFab835ff8ec0315aab6577ea9e0c20191b8835df8140200b49f0600b1c1000054f91b40f9f40740f9f3031f2afb031faa3a000014e00313aae10314aa22008052BL8;FFe9fb05b9e8fb02f93ef5ff97f3f742f9e8ef42f97f0208eb610000", - "54e0631791f96bff9708068052e9f342f9e07fc13d6826089be183c13de287c13d69060091L8;FF36008052e0831f91e183159102288052b0350094a0620091e1831f9102288052fa9304f9ab350094e87b4ab949008052f79b04f9f69f04f91f010071fca304f9BBBBBL4;FF16000014a06300912f06019", - "4e80300aae00301aac8fa073610000014e0031faa0e000014880080d2a0831df80800f0f207000014e90b41b2a9233da905000014L4;FF09692138e12300919be5ff97f80f40f9e80740f9080118cbdf0208ebe80c0054e80b40f9e10317aae20316aa0001188ba80500940803168be80f00f9540300b4L8", - ";FFe0000054c1825ff881ffffb4c00240f922008052a7050194f8ffff1714f3ffb48806148be00313aa01f17dd302018052f44f42a9f65741a9fd7bc3a89d050114BL8;FF22008052ab850194e9ffff17f44f41a9fd7bc2a8c0035fd6ff0301d1fd7b03a9fdc30091080040b9280200341f0500712104005", - "408200091200440a9a92300d1L8;FF01f97fd342008052aa850094e8b740f91f0500f1ab000054e0bb40f901f97fd342008052a3850094e8c340f91f0500f1ab000054e0c740f901f97fd342008052BBBL4;FFc802138ba8031ff8a003de3ca8035ff8f50301914103c03d490b40f9a0c20091e10319aa02", - "238052e013803de82b00f9e183853ce93700f9a6c50194a8220591L4;FB3800000000000000ab0100001e0000006c69627369676e616c5f70726f746f636f6c3a3a73657373696f6e5f6d616e6167656d656e7443757272656e74000000L8;FF810000b4e02740f922008052a9c50094ed1b40f9ee6740f9", - "8dcdffb56ffeff17fa031faabcfcff1737008052fc7740f97c0500b49bc50094e0031caa21008052BL8;FF600300b4e00000143f040071400200543f08007121030054e1230091e20313aae8fcff97400200b4e9000014c1620091e20313aae3fcff97a00100b4c9000014L8;FF1f0900714c01005408020", - "0341f05007141030054000180521d000014280180d20800f0f2081d00d11e0000141f150071000200541f11007141040054280180d2BBBBL4;FF021115cbf44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8a8e50114f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6960015eb090500541f01", - "04ebL4;FB20616e6420636f756e7465723a20c0152e2053657373696f6e206c6f6164656420666f7220c0022e20c0172073657373696f6e206861732062617365206b6579L8;FFbf0208eb61000054e00313aafbe40094680640f918693538d5220091750a00f9b4f7ffb6680240f9bf0208eb61000054e0", - "0313aaf1e40094680640f934008052BL8;FF1f0d00b1696200a9a8030054e00316aa22008052a765019419000014080b0091a0031df805000014e90b41b2a9a33ca903000014080f0091a8831cf8a0e300d1L8;FF22008052ab650094611e40f9810000b4602240f922008052a665009460620191f30b40f", - "9fd7bc2a85efeff1761ce40f9810000b460d240f9220080529d650094BBBL4;FFe80f00f9540300b4e10f40f9e80740f9b51240f91f0101eb80080054e80b40f9490380522a040091e00314aaea0f00f909692138e12300910a91ff97f60f40f9L4;FF621e00b9fbffff17bf3b03d5e3ffff17200000b000", - "400691350000b0000c40391f1c007221020054e103142ae00313aa24feff97f40300aaf30301aaa0420891L8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a250191BL8;FFe0179f1ac525019", - "48822403969224039f503002a1f01096be0179f1abf2501948826403969264039b502000a1f01096be0179f1ab9250194882a4039692a4039L8;FF2801005420030191e10315aae20314aab025009488021a32e8ff0739081d40922d000014a00640ad2800805220030291e103069122008052ff2701f9ba", - "020191BBBBBBBL4;FFca0640f9490108eba30d0054ca0240f9e00740f94801088bc82600a908fc60d3280700b5080840921f1900f162070054017c0353810700341f1100f1c0070054L4;FFa1020054b60b7ba9a1835af8420700b4e10700f9a08301d1e10316aa0a110094b7035af8ff0600b120090054a", - "88301d1a9eb7aa9bbf37ba90081c23c0181c33cL8;FFe00313aae10314aae20315aaf96300a9a8730039c4190194a0000035d60600f1c1feff54e0031f2a0200001420008052f44f45a9f91340f9f65744a9f85f43a9BBL4;FFa10100546083c03c6183c13c080080926283c23c680200f9e043803ce1438", - "13ce243823c6082803c6182813c6282823c71000014e87f41b9e90300b26343c13cL4;ZFL8;FFaa331638aa6356382901084aab431638ab735638a9531638a98356384a01084a6b01084aaa631638aa9356382901084aab731638aba35638a9831638a9b35638BBBL4;FF090180d2e8031faa0900f0f2290", - "17fb24a1d4092a0c300d108010aaae81b00f9ea7343f8a9233da9aaf31df8ebc1ff97c80300d008b135916903805268a600a9L4;FB6e6465782e6372617465732e696f2d313934396366386336623562353537662f686b64662d302e31332e302f7372632f6c69622e7273001b737071722076312eL8;FFe", - "87f40f9e8d302f9e84b40f9e8d702f9e88340f9e8e302f9e87740f90329009135290094e8a343f9eab343f9e0030991e9ab43f9ebcb43f981e20791e84700f9BL8;FF4a2501914afd46d34a05009102000014ea031faaf67b52b9df06007181010054eb7f52b9ec8352b96b0100346b0140b26b11c0da6b1", - "540d26b0d0b8b6b250191L8;FFfa1f06f9fa3706f91f7f07a9f6d705f9f6e305f9faeb05f9ffe705f9a88317f88a1000b5e0c327910163009102288052a8590094e0c32291e1c3279102288052BBBBL4;FFe00743ade84b40f9e223c03de317c03d882200f928008052808600ad820e803d8302803d68620", - "039f44f4ca9f6574ba9fd7b4aa9ff430391c0035fd600018052L4;FB6e20c00e206661696c656420776974682027c007272c2068616420c01020726563656976657220636861696e73001243616e6469646174652073657373696f6eL8;FF351500b5e1031faa91fdff17e08743ade00314aaa0873bade08", - "b44ada08b3cade18341ada18339ade28342ada2833aade18340ada18338ad8af3ff97a0877badBL8;FFac0300543f040071e00600543f080071610a0054a80355f81f0500b161000054bf6735a9bf0316f8e1620091a22301d1c662ff97a0f9ffb47d0000143f180071L8;FFf6a745f90023009108810991", - "f407409194820991f2bbff97e1074091e0431691023f805221800991aa79009488e2079178008052b4008052000540ade8f36879BBBL4;FF2d696a38ee5b40f94df90737caffff17e923029121008052e44300f92061009124008052f90314aaeb2f00f9f70308aaf40305aa7499ff97e0074aa9e20317aa", - "L4;ZBL8;FF6082823ce097c03dff4f02f96016803de03bc13dff4b02f96082863ca003d43cff0f01f96022803de027c13dff0b01f96082893ce087c03dbfff3ca9682600a9BL8;FFb4f8ff97750a40f9e10316aaeeffff17281040b96800c8376800d037c5390114f6390114f639011409004039e80300aa", - "e00301aa2a0900d13f09007149819f9aL8;FFe00315aa00013fd6010740f9810000b4020b40f9e00315aaa63900949f0700b1a01c0054e26b40f9e8432a91e00316aae10317aae3031aaa13c3fe97e8436a39BBBBBL4;FFc90080d248008052e24300390900f0f2e8470039e90700f9ba000014e80741b24", - "9000014932e40f9892640f9e80314aa7f0209eb802a0054090d80520a2940f9L4;FF2100805236008052a7090094c0feffb40801805208000039f40000b4f60300aa00040091e10315aae20314aaa9090094e00316aae10313aaf44f42a9f65741a9L8;FF6902009029c10991e1030091e92b01a9d709019", - "4fd7b42a9ffc30091c0035fd6e10300aaa00280527cfdff17080080b928010034080140b20811c0da081540d2BL8;FFee1341b9e81741b9ed1b41b9ec1f41b9fa5b00f940030054fa0300aae0c30291ecbb0729ed3300b9eb2b02a9e90b00f9e81f00b9e12b00f9e871ff97e8c30291L8;FFb50a00f17306", - "0091c0daff547f0214ebe3feff54e84b41f9d77a73789f0208eb20010054e84f41f91779347894060091f45301f9b50a00f17306009181feff54BBBL4;FFb9c90194ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091040180520506805229f87fd33f1100f13481889ae303", - "14aa5a000094L4;FB000000000000000008000000000000000800000000000000a8f6450000000000000000000000000008000000000000000800000000000000fce7450000000000L8;FF990100b49b22009104000014390700f17b630091e000005461835ff881ffffb4600340f922008052a2c90094f8", - "ffff17d60000b4c806168be00314aa02018052BL8;FFac49019461da40f9810300b460de40f91800001461ce40f9810000b460d240f922008052a349019461da40f9810000b460de40f9220080529e49019461e640f9L8;FF291540d2290d098b2925019129fd46d30801098b000500911f0009eb28dfff5", - "4000100b000203691a5490094000100d000e00e91a2490094fd7bbba9f90b00f9BBBBL4;FFf30308aa3f0500b1e0010054141440f9173040b9740200b4161040f9a1e90194e00314aa210080529fe90194c00200b4e10316aae20314aaf50300aaa5e90194L4;FB304b42000000000000000000000000000", - "8000000000000000800000000000000304b420000000000000000000000000008000000000000000800000000000000L8;FFff430291c0035fd6e80180520900809268220039690200f9fd7b47a9f34340f9ff430291c0035fd6e8031f2a6822003908008092680200f9fd7b47a9f34340f9BL8;FF601240", - "f922008052aa690194611a40f914008092740e00f93f0400f18b000054601e40f922008052a2690194612640f9741a00f93f0400f18b000054602a40f9L8;FFe002803de9cf40f9ea9741b980c38d3c800fc03d821f803d4047803d801fc03df81f00b98043813c00e4006fa80319b889430df8aa0312b8a", - "8c313b8828707adBBBL4;FFb9035cf8a8035bf8080119cb5f0308eba82000541a0100b4a8835bf8e1031caae2031aaa0001198baaa9019439031a8bb9031cf8ba835bf8e10b43a9e32340f9L4;FF3f0440b1e2020054080840a92a044091f30300aae023009109f97fd3e10308aa5f0109eb4981899a0a01", - "80523f2100f134818a9ae30314aa0b000094e80740f9L8;FFf85f43a9fa6742a9fd7bc6a801000014fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4309d1f70302aae20301aae10300aae0830091BL8;FFff0312d1ff0300f9f40301aae8830c9176fc4039000440ade0430091f", - "50302aaf30303aac17e0753e08700ad062a0194e89341f91f0500f1611f0054f7830c91L8;FFd6021891e11716b91544ff97e8f347f91f0500f1e1030054088341f80083c03ce9832691c00000d000643391e1432291e8db04f928ffffd008e13691e84f04f9BBBBBBL4;FF28280037a8035ef88a0740f94", - "90108eb233700548a0340f9b7835df84801088b882700a9680240f9080540f91c0117eba32e00547b0240f9620740f95f001cebL4;FFe10b409102c48052fa0300aa21c00e91b0110094a3110094008c815221008052a1110094f9d340f9209d00b4e1074091028c8152fb0300aa21401d91168c8152L8;F", - "Fe80700f9283041b8e92b0229290c40f9e81b00b9282040b9e1230091e9c301f8e82700b980ffff97a8c35e381f05007141020054a0d3de3ce81f80526002803dBBL4;FFe0a2843d3ddcff97e08643ad480300b0089d0991f6033291c9058052e0033291e1830091a28301d1e02e833de08a44ade132833d", - "030c8052d8020191e82702a9L4;ZDL8;FFac91009414008092740200f9688e46f81f0500b160000054e00313aa9c8cff97740200f9f44f41a9fd7bc2a8c0035fd6fd7bbfa9fd030091083040f9080100b4BBBL4;FFf90315aaf34300f91f0114eb7c0f00f9e933949af88b00b9080109cb950208cb0a0116", - "8bc90215ebf333899abf0216eb89328a9a2a0108cb89030aeb69170054L4;FB67050a21aeb7487cc268260bca0124606c0f99c38f27e296114a37cd30e4feb38cbc834db69dd4bb12bdafed4fb2a28c977aa8ea00004997ac90a79f0ae7cc47L8;FF0a2548a9ea5300f9e9df00f90a2549a9e9af00f90951", - "40f9e9c700f9095540f9eaa710a90a254ba9eab700f9e9cb00f90a254ca9eaeb00f9e99b00f90a254da9BL8;FFb4100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aaab100094fad342f9fc0740919c8301914afeff17e002009000c02f91L8;FFe95f01f9b077fe97e", - "80356391f050071400c0054282340b8e90f4b79eacf42f9eb075639ec434b79e86b08b9e8c742f9e9db1079e9cb42f9aa0318f8ac831878BBBBL4;FFa0e300d108010aaaa9a33ca9f3d9ff97080400900849359149038052682601a9e00747a908008092685e00a9a1e6ffb4220080529ff1019432ffff17", - "a9e300d1L4;FB759148000000000034000000000000006f0100001d0000007591480000000000340000000000000008010000300000006d697373696e67207265636569766572L8;FFe00301aae8fd073708fc60d3080c00b5080840921f1900f1420c0054017c0353610c00343f040071000200543f0800", - "7161030054890240f93f0500b181000054BL8;FFc0035fd6080040b948000034ea020014ff8300d1fd7b01a9fd430091200440a9e80200f008a12991e90200b029510d91020300d042001c91e3030091e82700a9L8;FF6e0e00949f0600b160a1ff54c0220291e14316919411009407fdff1780c20291452", - "b0094080040b20811c0da081540d2080d088b0825019108fd46d30900088bBBBL4;FF690000140a008092fc2b40f9360080526a6e00a9330080520a0500d15f0d00b1a8010054e00309aae10308aa22008052f7030baa9fb10194e00748a9eb0317aaL4;ZBL8;FFff0300f9f50301aa281840f9e20f00f95", - "f0008ebe1230054a00640adf80302aaa20ac03da81a40f9f30300aae0630191a1e2009102328052f40303aae00701adBL8;FFe8c31791fcfb42f90081c03ce80743f99f0b00b1e07f823de80305f941320054e80345f9e07fc23de9c32291e9bb03f9c9048052800200f000cc2391e86304f9L8;FFa04700", - "d1e86303f968008052e1432a91e97705f909078052e86305f9e800009008952891e95f05f9290080d2ea6705f9e93ec0f2e87305f9c8048052ea4f05f9BBBBBL4;FF6d0d4d8bad01088a38190dcb0d035cb8df020d6b800200548d0500d1ac010ceac1feff54428c202e42a8302e4c00261e4c0100374a21", - "009160010a8b0b00088aL4;FF04000014940600f139c300918001005421035ef8810000b420835ef822008052a401009421835ff8e1feffb4200340f9220080529f010094f3ffff17e80240f9L8;FFe0e30091e10317aa22008052b9dfff97f42344a91f0114ebe3100054e81f40f9e10315aae20317aa00", - "01148ba9010194e90344a9080009eb230f0054ff0208ebBL8;FFff830091c0035fd6000040f98c720014000040f9f0810114000040f9ef810114080040f9e20301aa00a140a9e10308aaeb810114ffc300d1fd7b02a9fd830091L8;FF0811c0da081540d2080d088b08250191281b488b08050091982680b", - "978070034090340b22911c0da291540d2290d098b2925019129fd46d329050091972a80b9BBBL4;FFb4c10194e91740f928008052282100393f0100f9ff031191f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6a00300d000602591a0c10194L4;FBc000124661696c656420746f20", - "6465637279707420c01b206d65737361676520776974682072617463686574206b65793a20c00e20616e6420636f756e746572L8;FFe08302918122009102398052f5830291b0c10094800ac03d8182c03ce0431091881a40f9890e40f9a1e20091f46b40f98083813ca103963ca88318f8a90317f8BL8;F", - "F41070094e10313aa5dfaff97803e40f9800100b4610a40f9680240f91f0101eb200d0054680640f9090180522a0400916a0a00f909692138e10313aa50faff97L8;FF2831889a1f6d00f14804005409010090294122918a0000102b6968384a090b8b40011fd6010440f9410300b4000840f922008052f4", - "4f41a9fd7bc2a89d410014BBBBL4;FFe043059181008052cfe1019400ac0035e85341b9e89700b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd6L4;FB72654b657953656e6465724b6579506c61696e74657874001ced4800000000006a0000000000", - "0000ec0000002e0000001ced4800000000006a00000000000000L8;FFe10318aae20316aaf70300aab1e100940500001435008052f61640f976feffb537008052935600a9935a01a9975a02a9f44f43a9f65742a9f85f41a9fd7bc4a8BL8;FFf40300aaa76101940004805201018052a5610194200100b41", - "40000f9e10200f021000391131800b91f700039f44f41a9fd7bc2a8c0035fd60001805201048052L8;FF1f1800f102110054217c0353211300343f0800718d0100543f0c0071600200543f100071c00200543f14007141040054c1220191e20313aaf1fcff97600300b4BBBL4;FF8a4640398b26407908bd", - "70d3e083c03c420300f042801891e0230091a34300d1082109aa6905c05ae083803cb6831ff808010aaa0ad49052284108aa2a00a072L4;FFe000f83720031091f57e409302cc338b130c40b9562840f9a0ffff1700430891ef030094eaffff17c1424079000000f000c00291212c46d304786178843c7cd", - "3L8;FFa32300d1a2008052e40313aaa8831ff8f5a10094810100f021841a91a40100d084803191a32300d162008052b4831ff8eda1009488820091810100f021a41d91BL8;FF480115eb690200f923100054680a00f93f000014c80d0036970e40f9570100b4ff2a00b1a8120054e82600911f0101f1a212", - "0054290080522821c89a1f0115ebBL4;FF010040f9f30300aa810000b4600640f922008052a7210094610e40f9810000b4601240f922008052a2210094611a40f9c10000b4601e40f922008052f30b40f9L3;ZB" + "BBBBBBBBBL8;FB06000000040000004000000000000000400040000000000040004000000000008801000000000000880100000000000008000000000000000100000004000000L8;FF20feff9000802a9122feff9042a02b9121088052bfa1009420feff9000e02f91caa1009420feff9000403091c7a10", + "09420feff9000202f91c7a1009420feff90BL8;FF2b6968384a090b8b40011fd661ce40f9810000b460d240f9220080527625019461da40f9810000b460de40f9220080527125019461e640f9810000b460ea40f9L8;FF0824ff97f42344a91f0114ebe3100054e81f40f9e10315aae20317aa0001148b7c", + "250094e90344a9080009eb230f0054ff0208eb68080054340117ab020f0054BBL8;FFe10317aa220080527b650194817e40f93f0400f18b000054808240f922008052756501945f03007197e20fa9e8139b9a978600f9961201b9951601b9888e00f9L8;FF83000014200e00b5e00313aa85fdff97e80301", + "aa80000036880e00b5e1031faae1ffff17e1031faa886200b9deffff17811c0054e0031faa2cffff1720ebff54BL8;FFe00301aa08020037750240f9a80640f9160100eb62020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e0030091L8;FDb8e24600000", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0e2460000000000dce3460000000000BBBL8;FB2072657475726e656420616e206572726f7220756e65787065637465646c7900c50f4000000000004b000000000000007f0b00000e000000420", + "2400000000000L8;FF49010b8be16300910001098bc792ff97d90300b4e11740f9e80f40f9fa0f00b99a0640f9fb0b00f91f0101ebc09b0054e81340f9490180522a040091e00319aaBL8;FF0a0200904aa11f91eb230091f30300aae9ab00a949008052cafefff04a413c91a00700d1e1630091e9ab04a9", + "c9feffb029b91891e9af06a9eb048052a9028052L8;FFe00315aa0201805201ed7cd37a0500945f0f00f140070054f5524da9340200b4b982009104000014940600f139c300918001005421035ef8810000b420835ef8BBL8;FF4a0d0a8b4a25019129194a8b29050091280108ab421e0054692240f90901", + "00b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abL8;FF613e40f9e10000b4604240f922008052f44f42a9f65741a9fd7bc3a876450014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091L16;FFe8df00f9e83742f9e8af15a9e84342f9e", + "b5342f9e8b700f9e84742f9e9a318a9e84b42f9e94f42f9e8eb00f9e85742f9ea2311a9e85b42f9ea8342f9e82f14a9BBBBL8;FB4e000000000000009d02000015000000ef104000000000004e00000000000000450600000a000000ef104000000000004e000000000000004506000005000000L8;FFa97", + "315384901084aaaa35538a98315386901084aabb35538a99315384901084aaac35538a9a315386901084aabd35538a9b315384901084aaae35538a9c31538BL8;FFd2110194e0fefff000c02e91cf110194e0fefff000801091cc110194fd7bbda9f65701a9f44f02a9fd030091140840f9f30300aa3f000", + "2716200005435008052L8;FF28ff60d3eb7b42f9ed7f42f937fc60d33cff78d3ea03012ae1ab40f9fb030eaaf003182aef031a2afa0309aaf9c700f9ee03082ac1030014e96f42f9e87342f9BBL8;FF0083833c09230d29e85740b90183843c00d305a908c30139b50000b4e00740f9e10315aa220080527", + "3550194e02740f9f40f40f9930000b4e10313aa22008052L8;FF96010014e8031691e00316aa06510094c8624039fbc342f9f5c742f9f7cb42f9e863163988fdfff008813291e8d302f9e80180528083cf3ce8f304f94003803dL16;FF762500b4f7b340f9e8830591e0431e9101c10091ff0600b1e20388", + "9a6af9ff97e8cb43f96083c03ce9d743f91f0500b1e0d7823de9b305f960150054e0efc13dBBBL8;FF610a40f9680240f9962a40f91f0101ebe00f0054680640f9290400914a058052e00315aa690a00f90a692138e10313aa5efbff97770a40f9680240f9080117cbL8;FF188309913f0700b1801800540", + "0230491aa290094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb281700544c000014BL8;FF1f0500b1a0000054e00313aaf44f41a9fd7bc2a841feff17f44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091140040f9f30300aa9f0600b1L8;", + "FF020840f9bf0002ebc1e7ff5402804039421000123f00026b4ce7ff54021840b94224c11ae2e60737021c40b94224c11a82e6073702cc74923400009085c241f9BBL8;FF4b0080522c0100348c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c05009102000014ec031faa8b010b8b2801088", + "b49010b8b0801098b090140b2L8;FFe94f05f929fdffb029ed0a91ea9f04f9eac32491e86305f928fdff9008091e91e95b05f9290080d2e87305f9c80480528943c0f2ea7705f90a078052ff4b05f9L16;FFe48715ade107c23de8ff43f9e9a301f9e9030caaf4bb43f9edbf43f9f9c343f9fec743f9eecf", + "43f9f2d343f9f1d743f9e0db43f9e7f343f9e3e35e39ebbb01f9BBBBBL8;FB7373616765726174636865745f6b6579636f756e7465726369706865727465787470715f726174636865746164647265737365736964656e746974795f6b6579L8;FFfb02007933008052f4060079ba031ff8b9ffff17a0830", + "0d176f3ff97d2ffff17a08300d173f3ff97b6835ef8c80a1a8b5a070091ba031ff81b01007914050079BL8;FFe10313aa0bfeff97950a40f9550300b4610a40f9680240f9960640f91f0101eb20080054680640f9490380522a040091e00315aa6a0a00f909692138e10313aaL8;FFffc303d1fd7b09a9fc", + "6f0aa9fa670ba9f85f0ca9f6570da9f44f0ea9fd43029109604039e91f003717704229f30300aa1a0040f9a08300d1f40308aae103172aBBL8;FFd2590194ffc307d1fd7b19a9fc6f1aa9fa671ba9f85f1ca9f6571da9f44f1ea9fd4306910080c63c0180c73cfb030191084440f9093040f9f60302aa608", + "38d3cL8;FFe0031791e3032d910800f0f2e483329161fdfff021a0389102018052e9ab0cb9e85306f9f1fcff97f3f742f9e8ef42f97f0208eb61000054e0631791a2fbfe97L16;FF080116cbbf0208ebc8070054680640f9e10314aae20315aa0001168b7ddd0094c802158b680a00f9f44f43a9f70b40f9", + "f65742a9fd7bc4a8c0035fd6e00313aaBBBL8;FFeaff01a9e9230a29d8790194fd7b47a9ff030291c0035fd6ff8301d1fd7b03a9f65704a9f44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054L8;FF807d009400048152210080527c7d0094e07c01b4f80300aa7a7d009400048052210", + "08052767d0094e07c01b4f40300aae0fbc63de1ffc63de8074091e2074091BL8;FF00058052010180527afd0094400200b4e81242d3155000a9f70300aa152001a928008052081000f9e80318aaa90216eb9402168bf533899a145500a9135d01a9L8;FFc5050014fd7bbfa9fd030091fd7bc1a8c0035fd6", + "00000000210000d02040463940030035200000d02200805222400639009c40f9a00100b4fd7bbfa9200000d0BBL8;FFaaa355382901084aab831538abb35538a9931538a9c355384a01084a6b01084aaaa31538aad355382901084aabb31538abe35538a9c31538a9f355384a01084aL8;FFe95740f96062", + "1e91680902f9e86b40f9613e42f9770502f9f7c32491633a42f9680d02f9a8835838754642f9691102f9a90358f87b1502f96b3e1f91400540adL16;FFeb3b44f9eda306a9e87744f9f63f44f9fc6b00f9fc030eaaf84344f9ea4b44f9fa5344f9ec5744f9e15b44f9f06b44f9ed6f40f9e56740f9fe1740", + "f9f56340b9BBBBL8;FBcce884d4d43b935d81b3568b8ad008e9a8379fd5846b834dd1b69274d4bb3dd70e6bafeddac63c9ea28cdccbe93f5c86428b000059c77297db5b51cf7f991010L8;FF130306a90810007908edb1d28840d6f2133b00f9080000f9a8008052e80f00f933fb7fd3778d0094e00313aa", + "41008052708d0094e00a00b579020014f70314aaBL8;FFe8ef42f9e0dfc13de1e3c13de2e7c13d7f0208ebe02b833de12f833de233833d6190ff54e0631791a7abff9780fcff1721010054810000b4a01240f922008052L8;FF800d0094c001805221008052790d0094e00600b408fdfff008fd0391b5120", + "0d1090140f9086140f8090000f909fdfff0298d0391086000f8c8008052e92302a9BBL8;FFbac301d11f0500b1a3f3ffb5e0060054e81340f9e92300918a0200d04aa11f9140fffff000380a91e9ab05a9a9a300d1e1630191a8831df8e8230291e9ab06a9L8;FF290d00910a0300344a0140b24a11c0da4", + "a1540d24a0d0a8b4a2501914afd46d34a05009111000014e9031faa10000014f5031faa681a40f948f6ffb5f6031faaL16;FFe87f40f9e97b04f9e88b04f9e84b40f9e88f04f9e88340f9e89b04f9e87740f903290091601d0094e8eb41f9eafb41f9e9f341f9eb1342f9e35f42f9f86742f9BBBL8;FFe82", + "300b9a9a37da9ea2703a9a9935cb8aa635d78a80318f8a8e300d1e90f00f9a9035d38eaa700a9aa235db8a9835e38ea0300f9a983183821060094a8835c38L8;FFe012803d2093c03ce9f204f8e112c03d8092823c8192833ce9c700f9e10740f9010600b599feff17e8b740b92043c23cc0e200912183c3", + "3c2207c03deab341b9BL8;FF81ffffb4200340f9220080527aed0094f8ffff17e1430091e20313aaf70b00f9f73300f9f74f00f968040094e08744adf50300aae22fc03df4d300f9e0870badL8;FFe0f6ff97f35341a9fd7bc2a8c0035fd6030000d062201d91e40300aae1070132420c4039421c0013020", + "4003480fc5f88e000003581fc0088a0ffff356203f836BBL8;FF36110094e1d342f9dbfdff17e0431691e1031aaae20318aa30110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aa27110094L8;FFf54b02f9081140f91f0d00f1c3040054e10343b9e20743b9e803029", + "1e003279115410191f603279128e3ff970800009008712991e3074091e8f707f908000090L16;FFa00642adf90300aa882e40f9896243a9000402ada00a43ad1f010ff1e91700f9e86b02f9000803ada10240ad010000ada20241ad020001ad810240ad820ac03dBBBBBBL8;FB34356363642f3036393539", + "62342f7372632f656e636f64696e672f67662e7273000f53657269616c697a6174696f6e3a20c00076656e646f722f6c6962736967L8;FF84e00c91a8273fa9ab9d0094e00f40b9680100d0080140391f05007140fdff542b07011328030013290f0313a18b7b296b05000a2a0b02132c1705130801000aB", + "L8;FF37008052180d8052680240f9080540f91f0115ebe91a0054e00313aa49feff97e80300aae00301aac8fd073708fc60d3681a00b5080840921f1900f1a21a0054L8;FFe9634039990200f9881200f9e80b40b989a20039e9b340b8889202b828008052955a01a9892e00b968620039f44f4ca9f6574b", + "a9f85f4aa9fa6749a9fc6f48a9BBL8;FFf50b00f9f44f02a9fd030091a87cc39bf30300aae9031faa0a018052ff0308eb28008052a1030054b47c039b0b00f0d2f50304aa6b0104cb9f020bebe8020054L8;FFe10316aae20315aa0001178b81610094e802158b680a00f9952240f9550300b4610a40f968", + "0240f9941e40f91f0101ebc0090054680640f9490580522a040091L16;FFe10340f9acffff17c80080d20800f0f208090091a4ffff17ffc301d1fd7b03a9f72300f9f65705a9f44f06a9fdc30091081c00121f090071a1010054e00302aaBBBL8;FB65737075626c69636164647265737300ef1040000000", + "00004e00000000000000b904000017000000ef104000000000004e000000000000005707000005000000L8;FFe00314aa080c4af81f0500b160000054e1630091b1a1ff97964e40f9560300b4e11740f9e80f40f9944a40f91f0101eb603e0054e81340f9490380522a040091BL8;FF20008052800600f90", + "9028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6ff8301d1fd7b02a9f71b00f9f65704a9f44f05a9fd830091e803022a140c40f9L8;FF1b02a07217008252e1030091e0031f2ae20317aa7b140094000700b4c000f8b68d0a0094080040b91f110071e0feff54300000141f0017eb680700544803", + "19cbBBL8;FF5f050071000300540a0c40f908011f8b5f0500b100040054091440f92a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab03030054L8;FF693640f9680208a9681240f960828c3c684a00f9696e00f9080d40f900013fd6606601f9616a01f9290c40f9e8830f91", + "e1031baaf5830f9120013fd6f7f341f9L16;FFf2d340f9f4ff00f9e85f00f9e3db53a9ea2717a9e9030daaec1740f9f80303aaeb6f00f9eb2b40f9e3f340f9e8174ca9e00b44a9f43748a9f54700f9e8d300f9BBBBL8;FB3457fe50060b7f2293c8f8827ee26b3095cf142703b1000073e8ba087ac2f7870", + "53e2cb4db17ce5f367c4c39ce7f02652f7fb7283c33ce9512f8969432500327L8;FF400400540a2040f9092c40f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8bBL8;FF480080520801891ae99f40b9f48f06f9f69306", + "f91f01096bf49706f9facf06f9fad706f9f3e706f9f3ef06f9eaef0db9f5f30db9f7f70db9610a0054e39348a9L8;FFfc030faaf5031baafb0310aaeabf00f979110094f0031baafb0315aaee0317aaf5df5aa9ef031caafc031aaaed0318aaec0319aaeb0316aae9bf40f9f6c740f9BBL8;FFe00316aae1", + "0313aab74d0194f50300aa7c510194e00313aa210080523600805274510194e0feffb40801805208000039f40000b4a10240f9f50300aa00040091L8;FF080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091092440f93f0500b1400400540a2c40f9093840f90a0100b44b014", + "0b26b11c0daL16;FFe1a343f989008052680a00f90800809269220039680200f9810000b4e0a743f92200805274d10094e1af43f9810000b4e0b343f9220080526fd10094e1bb43f9BBBL8;FFc5f5ff97c03300b4e00700f9a1ffff9021203f91a3ffff9063603d91e023009102028052040280529301001", + "4e10300aa280c49f81f0500b12101005428008052L8;FFc0fdfff000a00a91d06d0094c0fdffd000403a91cd6d0094c0fdfff000e00991ca6d0094c0fdfff000200691c76d0094c0fdfff000200391c46d0094c0fdffd0BL8;FF3f0d00f1c0fcff544b0dc0394c1100912e1100d10c3900a96d1900122154", + "0daa2bfbff363f1100f1a0fbff544b11c0394c1500912e1500d10c3900a96d190012L8;FF4d0300541fb11f380614805205c11fb801d05f382210001283060011c200020b02d01f380130009102008052641240f9842c4092641200f904d05f3884100012BBL8;FF410f0054f9031faa84000014e1d342f9", + "e8cb42f91f0101eba0730054e8cf42f949078052f8074091188309910969213828040091f97749f9e8d302f93f0700b1L8;FFe083c53de187c53de0fb833de1ff833de92bff97e0fbc33de1ffc33de8e20891e0833f91000500add0460094e88340f90aad41a9096101910081c23ce97f01f9L16;FF81000", + "0b4602a40f9220080527ab10094613240f9810000b4603640f92200805275b10094610240f9810000b4600640f92200805270b10094610e40f9810000b4BBBBBL8;FB6e206661696c65643a206b65792e69735f6e6f6e65282900bb1140000000000047000000000000002401000015000000bb114000000", + "000004700000000000000L8;FFad01054a29010b4a8b01004aa801084a29010b4a08010a4a0afefff04a0132912801084a097d1853495969780821094a095d1053495969782001084ac0035fd6BL8;FF4a0d0a8b4a25019129194a8b2a050091091440f94801088b090100b42a0140b24a11c0da4a1540d2", + "4a0d0a8b4a25019129194a8b29050091280108ab220a0054L8;FF7d190094e19341f9810601b4e09741f9300800143f0900f1e11a0054e8008052f6b74bf9f7bb4bf9e9830a91e8830a3928008052e0230891e143139142008052BBL8;FF2000805201048052b7550194ff4307d1fd7b1aa9fc571ba9f44f", + "1ca9fd83069100e4006fe40301aae30300aaa0c302d1e1031faaf30308aae00300ade00301adL8;FF810000b4e0ff42f9220080527a590094e8c3179100810091dfeeff97a80359f8a003d83ce1833291022b8052f30703f9e80303f9e8c3179100810091e07f813dL16;FFe5ffff17a80a00d1a10312f80", + "5000014e80b41b2a00312f802000014a80600d1a0a303d1a88311f8acdfff97e10300aae86341f9f40301aa1f0500b1c0010054BBBL8;FFe10300a9e00301aae10309aa220080522300805224008052f4030baae6040094e10340a9eb0314aa2aa040a9290040f90cfc6ad35369283808050091280800f9L", + "8;FFe8cb42f91f0101ebe0d40054e8cf42f9090280522a040091e00319aa09692138e1431691ead302f90f120094f90b40f9b8010034e1d342f9e8cb42f91f0101ebBL8;FFe8070036e00301aaf44f45a9f52340f9fd7b43a9ff830191c0035fd68000805206000014e00313aa2f060094e80300aae00301", + "aaa8fe0737680240f9090540f9L8;FFfd030091361040b9135040a9df060572c0170054b601e0379f8200f1e2040054e8031faad41500b4e90313aaea0314aa2b15c0387f05013108d5889a4a0500f1BBL8;FFc09601b4e10317aa02908052f50300aa803901947b390194002c8152210080527439019460", + "9601b4e1074091022c8152fb07409121800991f70300aa192c8152L8;FFfb020014e8c344f9090d8052800fc03dc822099b000d803d8013c03d0011803d8017c03d0015803de97b45f9093100f9c90600918003c03d0001803d8007c03dL16;FF2091883ce8c702f940640054680343396013cc3cea031c9", + "1e0831d91e1e31c91f69f03f9e8031d3968274da94011843cf6831d91e8ab03f9e9af03f9641b0094BBBBL8;FB550100002a00000042024000000000006a000000000000005e0100002e00000042024000000000006a000000000000006e0000002e0000004d65737361676520L8;FF0850b99b0a0940f92", + "a0300b4080540f9c97e04535f0500f180010054eb031faa4cfd41d38d010b8b4a010ccbaef57ed30e696e78df21296b6b818d9a5f0500f1BL8;FFf44f05a9fd030091ff032ed1f30308aaa83340f9eafeff904a010491ff0300f9a96b40b9e82f00f9ea4302f9ea4702f9aa4700d1e7a30ea9a80c40f9e08", + "706a9L8;FF18e6ff97f80f40f988ffff17e023009122008052230080522400805211e6ff97e10f40f98effff17e0230091e10316aae20314aa230080522400805209e6ff97BBL8;FF010180527b490194a0831df8201100b4080d8052b3835df8fc031faa887e089bfb0314aaa8031ef8110000143600805", + "2a9835ef8aa835ff868021c8b7b0700d1L8;FFc0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0316d1f30300aae8430691e00301aaff0300f9fa03062af803052af60304aaL16;FFe10316aacd00001429a041a9e003099136dc40a9f80301aa3af05aa9022f8052e8e7", + "00f92aa042a9ec7300f9e82b17a92aac43a9e92b1fa929a044a9e8cf00f9BBBL8;FFc96a0039e9fe60d3cc520079ac0356b8cdaa0039ad3356b8c97e0039a98356f8cc4600b9cd7204b8cb320079d7b201b8d9460429d0b202f8ce3203f8c9b203f8L8;FFc0035fd6fd7bbda9f65701a9f44f02a9fd03009", + "1010040f9f30300aa810000b4600640f92200805273690094610e40f9810000b4601240f9220080526e690094BL8;FF81e20091e20313aad2f8ff97000100b45d000014600900b5e00313aa32f6ff97e80301aa80000036c80900b5e1031faadcffff17e1031faa883600f9d9ffff17L8;ZDBBL8;FF28fff", + "f9008411b9169038052d0feff17eaa759a9e8430f912083c13c2183c23c2283c33c2383c43cfa9741b9e00600adea1700f9000504ad020d05ade90b00f9L8;FFe10315aae20314aa8229009488021a32e83f0c3921000014a00640ad2800805200030291e1430a9122008052ffaf01f9e08716ada00a41ad", + "b5020191e8ab01f9L16;FFe10315aa7ba90094a00000b528008052750600f904000014e00315aae8031faa600600f90a028052e90314aa696a2af8680200f9f44f42a9f50b40f9fd7bc3a8BBBBBBBL8;FB64202d3e2043743253616d706c6564000a4b6579206a756d703a20c003202d20c0001a53656e64", + "206b65792065706f6368206465637265617365642028c00420L8;FF26090094a1835bf8fa03002a810000b4e0031caa2200805277a300945f1f007240080054e00319aa010880522200805271a30094e11340f9f50b40f9fa430e91BL8;FFe10315aae20314aa0001178b81230194e802148bb502148b680", + "a00f9081340f9e00316aae10315aae2031faa00013fd6e0031faaf44f4da9f6574ca9f85f4ba9L8;FF280800f980fbffb43f0108eb4a611932a00000546a69283808050091280800f99cffff17e00700f9e00301aaf30301aae10309aa220080522300805224008052BBL8;FFe81b40f9f71b00b9f467192", + "9f32306a9f36307a9fc6308a9f66f0aa9fa6f0ba94e280094170400b142330054b700f8b6fa031faae0031aaae10317aaaa5f0194L8;FF60008052e30313aa6dfaff97888240391f05007101020054610a40f9680240f91f0101ebc0030054690640f92a0400910b0480521f010aeb6a0a00f92b692138BL", + "8;FFc10b0054e0031faa9bffff1721050054e0031faa8effff17c80080d2e00700f90800f0f2080900d17fffff17e90b41b2e92300a984ffff17c80080d20800f0f2L8;ZDBBBL8;FB6d6f74656420612073657373696f6e0073104000000000002d000000000000006a0000000e00000072656d6f7465206", + "964656e74697479206b6579206e6f7420L8;FF081b0054f8000014e11740f9e80f40f91f0101eb60690054f50314aae81340f9490b8052b30e4cf809692138280400917f0a00b1e81700f9c10c0054f7031faaBL8;FF63040054e90700f9e92300910a0200904aa11f91eb430091f40300aae92b01a94900", + "8052cafefff04a413c91a07f0091e1830091e92b05a9c9feffb029b91891L8;ZFBBL8;FF0a0000904ac13e91e8a700a942ffffb0423c1091ea0f00f9e3430091b73f0194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000904a413a91L8;FF3f0c0071000700543f100071210500541f0", + "900f1a1210054e00313aaff6b00b9ffdf00a9df7e01a9dffe02a9f71700f9f72300f9df7e04a9f7ff05a91affff97L16;FFe80208cbe96306f91f0500f1e02b833de12f833d8c040054a81000b5e027c33de0030991e1233391022f8052f77300f9e0f3803d77c30094e86346f9f80748a9BBBBL8;FB5500", + "0000000000008a01000021000000d3094000000000005500000000000000af01000021000000d3094000000000005500000000000000b701000021000000L8;FFa9140054088c48f81f0500b12011005457fcff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109e", + "be80f005496000014BL8;FFe80308ab22030054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054091440f9090100b42a0140b2L8;FFe10313aa0228805282130094e8270491e01740f9e143139100f1cf3ce80f41f9022b8052e087813de813", + "03f979130094e8d740f91f0500f14b450054e1d740f9BBL8;FFe20317aaf90300aa82530194e10740f9810000b4e00318aa2200805276530194955a00a9955e01a9995e02a9933200b9f44f46a9f65745a9f85f44a9fa6743a9L8;FFa80359f814000014e8e322910081cb3ce8c344f94003803de8f304f9", + "43000014404fc03da80359f8e05344f94003803de8f304f900c1ffb4e15744f9c1c0ffb4L16;FFea4700f903015ba9e96b00f90a2541a9eed300f91b695ca9e9e700f9091940f9ed330ca90d3157a9ea271fa90aa543a9e36f1ea917394fa9edef00f90f5550a9BBBL8;FF0001198b837301942803178b68", + "0a00f9b6010034610a40f9680240f91f0101eb20310054680640f9090380522a040091e00316aa6a0a00f909692138e10313aaL8;FFe8cb42f9f99349f91f0101ebe0350054e8cf42f9490580522a040091e00318aa09692138e1431691ead302f90e0c0094fad342f9e8cb42f908011acb1f0308ebBL8;F", + "F240080522d170094770a40f9680240f9080117cb9f0208eb69fbff54e00313aae10317aae20314aa230080522400805222170094770a40f9680240f9080117cbL8;FF440040f9800400f9440040a9040000f9607861f85f0000ebe0000054c0020e91e12a00915f7c00a9027861f8220100b57e00001440", + "0440f9607821f8f8ffff17BBL8;FF3f0400b140010054810000b4e09349f92200805278330194e19b49f9810000b4e09f49f92200805273330194b30000b4e07b49f9e10313aa220080526e330194L8;FF6a091b320a010039d6ffff170b7c1253ec0f80120a0900390c440c33090d00396a6d1c320a0100", + "390c050039cdffff17fb03002aa04302d1e10315aae20316aaL16;FF8116c03da2039e3ca003963c8183813ca80317f8a98318f8b70000b4e00318aae10317aa2200805273b30094e8830291e94310912001029101010291a9160094BBBBBL8;FB6572546578745f5832353531395f5348412d3235365f43", + "52595354414c532d4b594245522d313032346c656e67746820636865636b656420617420636f6e7374L8;FFe80f00f9a30b3bade28347ada0073aade08746adb4f35438220114cba10b39ad330302eba003913c22020054e10740f98003148be20319aa769b00948802190bBL8;FFf42708a9e9030091a18", + "301d1e92f09a9e9c30091e9230aa9a8c301d10900009029413f91e82b0ba9e8430091e8270ca94800805209ffffb029210c91ea430191L8;FF1a0000b960620491e3431391e2018052e86b02f9e87302f9acf2ff9700e4006fa04700d1e143139102048052e03b813de037813d08c9ff97e9bf5339e84353", + "39BBL8;FFe8a30091e00309aaec550094e8a340391f050071e10d005499ffff90396b20913a0480520400001479fffff039a33e911a028052a00301d1c0deff9708008092L8;FF61fdfff021203f9102028052a3fdffb063402f919e000014e05306f9e083329161fdfff021203f9102028052a3fdffb063", + "7c2f91c40280529600001448008052L16;FFe87f14a9ff2315a9e87f17a9ff2318a9e87f1aa9ff231ba908068052ff7f07a9ff7f0aa9ff7f0da9ff7f10a9ff7f13a9ff7f16a9ff7f19a9e003833cff231ca9BBBL8;FF62010054e80f41b2e80700f9e0230091b2810094f44f4da9f6574ca9f85f4ba9fd7b", + "4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aaL8;FFe043169121800991f53309f9fb3709f9e09f843da8d6ff97963b01b4e8074091c10600d1e0431691088109910dd6ff97e86352b9f86b52b908070036e93b49f9BL8;FF0a819f1a8d0d00122e30403929010b0b4a114c0bb", + "f25007129c100110b819f1adf7d02710954003949c100110a819f1a0958003969010d0b4a114e0b29c10011L8;FF20008052f7ffff17e00313aaf60301aae10315aae20314aa2cfeff97750a40f9e10316aae6ffff17280000d008f140f9680000b4e800f037c0035fd6fd7bbfa9BBL8;FF78673fa978870", + "1f8dcfdffb50200001417018052935e00a9930a00f9f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd620008052e10318aaL8;FF843b009402000014390080527a9e40f9fa4f00f99a0100b4759a40f9793b0094e0031aaa21008052723b009400f100b4e10315aae2031aaae02b00f9", + "753b0094L16;FFb5620091e0000054a1825ff881ffffb4a00240f92200805277bb0094f8ffff17dc0000b488071c8be00317aa0201805201f17dd370bb0094795a01a994000014BBBBL8;FB00000000000000000000b04f05e1a671db1a0000f740442553c9963421aee9eb2c3fe0bf14bd37d9a68e00000", + "000000000004803821dc58802bc000000000000L8;FFffa30da9b60000b4e07340f9410b0091e20317aa7f8b0094e84b41f9a80000b401f97fd3e0031aaa42008052728b0094e9a34da97f0600b1b6031df8e94b01f9BL8;FF1c4500910a000014e087c13de17fc23de80345f9fc5b02f9e037813d618280", + "3ce86702f9e0833291a3e5ff97f5f742f9f4f342f9150500b49642009177028052L8;FF01028052b7070094fd7bbea9f30b00f9fd030091f30300aa7a0b00940002805201018052730b0094000100b401fdfff021000a91130000f91f200039f30b40f9BBL8;FFe00302ade00bc03de10fc03de213c03de3", + "17c03de326833de222833de11e833de01a833d7f6600b9e2aac43de3aec43de4b2c43de0a6c43de1a2c43d7f0200b9L8;FFe0030054e00313aa40000094080040b20811c0da081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aa080c45f81f0500b1L16;FFed030aa", + "af26f40f9ca008052ea230ea9e14740f9f79f00f9f70311aaf10306aae8031aaaea0304aae40310aaf00300aae00316aaefdb4aa9e60307aaec0315aaBBBL8;FFfd7bbda9f50b00f9f44f02a9fd030091152040b9f40300aaf30308aa796b01940004805221008052726b0194600100b4800640ad0804805", + "2751a00b9680200a9L8;FF680240f9c80000b409e179d3e00314aa02018052211108cb776b0094610e40f9e10000b4601240f922008052f44f42a9f65741a9fd7bc3a86f6b0014f44f42a9BL8;FFa08b39ad3af3ff97a0077aad880080d20800f0f2081900918082833c8182843ca0077bad8182863ca10b", + "79ad8082853ca003d13c8082803c8182813c880200f9L8;FFdf010131ab03005433000014adc50351bf0900712d00805208060054df0101312e008052aa0300542d090091bf0101eb620400540d68ed38bf050131ac020054BBL8;FF080000147f0200f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6", + "36008052765200a9771200b9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd620008052L8;FFaa835ff868021c8b7b0700d15aa301919ca30191092900a9096501a9a9435fb8156502a9175103a9176104a9166105a9096100b9fb0800b4a8035ef81f011cebL16;FF6c0400f1c00b00549f2900f14d018", + "052eb031faae9031faaea031faa8c318d9a4d040091ae696a384a0500915f010cebcf194092ce1d0013ef21cb9ae90109aaBBBBBBL8;FB312e73656e645f656b2e726563762065706f636820c01b3a204b65797353616d706c6564202d3e2048656164657253656e74001b737071722076312e73656e64L8", + ";FFe90f01f9e9ab41a9e80b01f9e81701f9ea1b01f9e92701f9e9ab40a9e82301f9e82f01f9e83b01f9e84701f9e85301f9e85f01f9e86b01f9e87701f9e88301f9BL8;FFfd7bc3a8c0035fd6e00313aa2200805232030094610a40f9daffff17e00313aa220080522d030094610a40f9eaffff17fd7bbca", + "9f85f01a9f65702a9f44f03a9L8;FFf7031caae00b41ad28008052e107c03d9a6600a9976201a9951200f98282823c8182833c8082843c68320039f44f57a9f65756a9f85f55a9fa6754a9fc6f53a9BBL8;FF1f0100712801881a1f01186ba1040054084440f99f0208eb01020054540300b4134040f9f61", + "b40f9fa0300aa39008052f50314aac8164038691640381f01096bL8;FF7c1500b4f3bb40f97e5f0094e0031caa21008052775f0094a01c01b4e10313aae2031caae02700f97a5f0094e8e740f9e98742b9fa5b06a91f0500b1e95700b9L16;FF6a0a00f909692138e10313aac7ecff97760a40f9680240f9", + "080116cb9f0208eb88070054680640f9e10315aae20314aa0001168b77df0094c802148b680a00f9BBBL8;ZBL8;FF2200805223008052240080522ba3ff97e11740f908feff17e0630091e10317aae20316aa230080522400805223a3ff97f71740f9e80f40f9080117cbdf0208ebBL8;FF2100805238008", + "0527aff0094e00800b4e10317aae20313aaf50300aa7dff0094c142009100008092d7420091e5fb00941f0400f1200100541200001435008052L8;FF620028360004803d80009e3cc0035fd60004803d000001ad80003fadc0035fd6211c001203ec7c920000803d5f8002f12028407a41020054e5003bd5", + "a5104092BBL8;FFe1031caa220080527b3f0194e80600d11f0d00b148020054e03740f9e10317aa0d000014e12f40f908008092686e00a9810000b4e02b40f9220080526e3f0194L8;FFe8a34f39a8070036f9430891ba0000b4e00315aae1031aaa22008052763f0094604242f9f5c30d91088c41f81f05", + "00b1c06b0154e8830f9121d8fe97e8834f39L16;FFe9cb42f9e8c742f9f6cf42f9f9d342f9fcd742f9f7df42f9df8225f1f8e342f9e9a30da9e9bf42f961520054e8c342f91f0112f1015200543f0700b1c0530054BBBBL8;FBd78ca69eefe171529f46342f216e259727c600a60016264f49b59ea9a28c7", + "4248b8c0000c206af7025ec4455d975990844d9eafd497e74b3dcb2e142e672185dL8;FF9f0208eb61000054e0a303917d8a0094e87b40f9697e08539706009109693438e87740f9f77f00f9ff0208eb01fdff54e0a30391738a0094e5ffff17f4031faaBL8;FFa033003728fc60d3a81000b5200840921f", + "1800f162110054217c0353811100343f0800716c0100543f040071600300543f0800716102005401e30391a22302d1L8;FFf54340f9fd7b47a9ff830291c0035fd6ff8301d1fd7b03a9f52300f9f44f05a9fdc30091f40301aaf50300aae0030091e103022af30303aaef020094e0630091BBL8;FFe92f5d", + "29e82b14292809c05a6909c05ae8271529e88f40f909208052e08744ad282508aa080dc0daa0873dadff230ca9e28345ada2833eadae4b019400e4006fL8;FF29050091200108ab62000054fd7bc1a8c0035fd680fdfff000a00291cb4b009480fdfff000e00191c84b009480fdffd000a02391c54b0094e", + "00301aa81fdfff0L16;FFe0031d91e10308aa023f805281cf0094e0430f91e1031d91032b0091e20319aaaf210094eaeb41f9efef41f9f7f341f9e9f741f95f0900b1e9fb00f961000154BBBL8;FFd4f4ff97400c00b5e9031faae00317aae30318aa69f4ffb48fffff17e00319aacc7d0094e30319aae80", + "300aae90301aae00318aa48f7073687ffff17c0000054L8;FFa8f31938e8430691ea2b02f9e97200f8ebf200f8ea7201f82908ff97e84346391f05007161050054e8a759a9e80302f9e8031091e90702f9a80318f8080100d0BL8;FFe0a30039e08300910800f0f2ffa70039e81300f9b1f5ff97e80300aa", + "e81300f9a1fefff021181591a3fefff063b01291e083009122028052a40080521a000014L8;FF27804039e31000125f00036b4cffff54231840b96324c21ae3fe0737231c40b96324c21a83fe073723cc7492050000f0a5c041f9630040f97f0005ebc1fdff54BBL8;FFe1431691ead302f9df0c0094fad3", + "42f9e8cb42f908011acb1f0308eb48420054e8cf42f9e10319aae20318aa00011a8b782f01944803188bf90b40f9fa074091L8;FF8100805200001891ff0316b9e85f00b95e2a0094e80356b9e00740918100805200001891ff0316b9e85b00b9572a0094e80356b9e00740918100805200001891L16;FFa", + "02700d1e1030191e87f05a9e82708a9d6ab0094f5031f2a1c008092f60313aa2e000014880100d0081140f91f0d00f1c30200546800805249feffb029912991BBBBBL8;FBf433420000000000000000000000000001000000000000000100000000000000d84442000000000000000000000000000100000", + "0000000000100000000000000L8;FF22010054fd7bc1a8c0035fd6e8031faa091c40f93f0500b121faff54e00308ab23ffff5420feff9000c00091c7930094e8031faa090840f929f5ffb5091440f9BL8;FFe80300aa098d40f83f0500b180160054f30300aae00308aaf7feff97e80300aae00313aa0901", + "40b22911c0da291540d2290d098b2925019129fd46d30801098bL8;FF8d008052fb0309aaf003182aef031a2aee03082af0050014eeef44b978ff78d357fd60d3eb7b42f9ed7f42f94f7c0853dc7d1853f003182ad3050014f8db40f9BBL8;FF956c0194081b4039e90740f9f702000a1f01296be0179f1a", + "8f6c0194081f4039ea0b40f9e902000a7302090a1f010a6be0179f1a886c01946802000a00010012L8;FFf5f345b9e8231839e8c31791b47e08530041c03ce183c13de8c31291e063813d01c18d3cc80080d20800f0f21c190091e14b41f9810000b4e04f41f922008052L16;FF37008052882642290a358", + "c52981a40b9942240b921008052e30316aae40315aa1f010a6be203182afa03881ae8a300913f411f7100010291fb03891aaefbff97BBBL8;FFe80300aae00301aaa8da0736adfeff17e00313aacf850094f70301aa20e5073657fbffb43a000014e00313aac9850094e80300aae00301aac8f10736a0dff", + "fb4L8;FFc00240f9220080527b770094f8ffff1714a4ffb48806148be00313aa0201805201f17dd31afdff17e19349f9f3074091738209913f0800b1800100543f0400b1BL8;FFe8031faa03000014f4031faa0901098b0a0e8052750640f9210108cb00550a9bc6020094e00315aae10314aac3020094d6", + "0000b4c8e279d3e00315aa02018052L8;FFf96b04a9390000b021231d91f35301a9f55b02a9f6188092c20200cbf76303a9f70300aa336041a9361040f9d60600d1002300d1d602028a381440f9f602168bBBL8;FF00c0359121802f9182370194e8074091e00740910881099100c0359118e1079108e107", + "91cfa70094e0074091e1074091023280520080019121c0359175370194L8;FFf60300aaa00302d10af2ff97e00316aae04b05f9e0432a9121fdffd021203f910202805263fdffb063701d9174000014c80080d2e0632a39e0432a910800f0f2L16;FFe8b343f91f0500b1e86f00f980390054e8b743f9e9b", + "f43f9f80314aa2013c93cf4bb43f9e0c30391e86300f9e8c343f9c122019102298052e093803de9a306a9BBBBL8;FB20756e726561636861626c6520636f64653a2073686f756c64206e6f74206265207573696e6720446f75626c65205261746368657420666f7220746865736500L8;FFfd7bbfa9fd030", + "091083040f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091091840f93f0500b1400400540a2040f9092c40f9BL8;FFe8ffffb008c11d91e9d702f9c9048052e8cf02f9e8632291c0feffb000081391e8d302f9e8feff9008210c91e1031691a30302d1a82738a96200805", + "2a82739a9L8;FF26010014e32345a94a018052eaaf01f9ea028052e0e30691f9a307a9e92344a9ead701f92a028052e1e30191e2430c91e4031baafa5700f9f6a708a929008052BBL8;FF0203805264018052434d0094b4035df8b3ffff17a0c300d1a82b3da9c1450094ff0307d1fd7b16a9fc6f17a9fa6", + "718a9f85f19a9f6571aa9f44f1ba9fd830591L8;FFfacf40f9e002803de9d302b9214b803dec030b915f0b00b141d6ff54f3feff178083c03ce8430f91000d803d888341f8e9035039e80b02f9e8430691a9090034L16;FFf1030aaae81b01f9f57b40f9e80303aafc4340f9e56f40f9e30310aae45f40f9", + "e08710adf00308aaea0312aa08008092e87700f9e8030eaaee0311aaf10317aaBBBL8;FFea1f4079eb834039ec1340f87f020039a91b00b969a200b8e92341a9aa3b00796b8200396c1200f86a1e0079692201a9fd7b43a9f32340f9ff430191c0035fd6L8;FFd475ff97fd7b43a9ff030191c0035fd6c0f", + "dff9000e03691cf630094c0fdff9000403791cc630094c0fdff9000a03791c9630094c0fdff9000003891c6630094BL8;FF21241691a3feffb063b00e91e003009162018052440080523fedff97e10340f99effff17ff0302d1fd7b03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091L8;ZDBBL8;FFc", + "1825ff881ffffb4c00240f92200805279270194f8ffff17680e40f9480100b40805088be00314aa01f17dd302018052f44f43a9f70b40f9f65742a9fd7bc4a8L8;FFfd03009113d440a9f40300aa350200b47682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef8220080527027", + "0094c1825ff8e1feffb4L16;FF3f0309eba9000054f8031faae00318aae10317aab4a30094f40308aa09a043a9037040a9f30300aa1a5040b91b0840f9e92300a9e30b00f9971200b471a70094BBBBBBBBL8;FB72676f2d6769742f737061727365706f73747175616e74756d726174636865742d6235386", + "43766353665333634356363642f303639353962342f7372632f6368L8;FF400540ad1f0109eb000400ad00050054abaa40a9610240f94a01088b080500915f0109eba80e00f908098052e933899a490109cb0a0e8052292d0a9b0a048052BL8;FFf44f42a9f65741a9fd7bc3a87a240114f44f42a9f65741", + "a9fd7bc3a8c0035fd6210400b4fd7bbea9f44f01a9fd030091f30301aa14e0009104000014730600f1L8;FFff030191c0035fd6e80741b2e0030091e80300f9b12aff97e10300aa20008052fd7b43a9ff030191c0035fd6c932ff97fd7b43a9ff030191c0035fd640fdffb0BBL8;FFf40300aaf30308aa48", + "008052e0330091a31300d1e10314aa0204805224008052a8c31f386b140094882240b91f05003140010054e0c3c03ce1c3c13c08050011L8;FFa80200320811c0da081540d2080d088b0825019108fd46d308050091d4030034890200322911c0da291540d2290d098b2925019129fd46d32905009120010", + "88bBL8;FF750240f9a80640f9160101eba2020054e80f41b207000014890080d248008052e02300390900f0f2e827003928017fb2e0030091e80300f9a8eaff97e10300aaL8;ZDBBBL8;FBa71a400000000000340000000000000017010000110000006c69627369676e616c5f70726f746f636f6c3a3a74", + "7269706c655f72617463686574696e76616c69L8;FFe11740f9e80f40f91f0101ebc0810054e81340f9938248f84905805209692138280400917f0600b1e81700f9a030005480220291f3fcff97080040b20811c0daBL8;FFa0873bade2035cada2833eade1035aada1833cadb800019400e4006fff7f0e3", + "9e8d341f9e9d741f9eadb41f9f0830c91ebdf41f9ece341f9080dc0daede741f9L8;FF600600f90a028052e90314aa696a2af8680200f9f44f42a9f50b40f9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091130840f9f40308aa330200b4BBL8;FFfd030091f30308aa55400094f40301aaa10", + "0f8b6f5031faae00315aae10314aab1400194940200b4f60300aa75440194e00314aa21008052350080526d440194L8;FF680240f9080117cb9f0208eba9faff54e00313aae10317aae20314aa97020094770a40f9cfffff17a8831ff8a84300d1290000d02961339140fdffb000440691L16;FFe96b40f9", + "e9fb00f9f42748a9f64700f9f60308aae8af40f9e96b00f9e93342a9e99f00f9e98f40f9e95714a9e9eb40f9e99b00f9e9cb40f9e9eb00f9e9b740f9BBBBL8;FB56657273696f6e4e65676f74696174696f6e646972656374696f6e6d696e5f76657273696f6e636861696e5f706172616d7345706f63684", + "5706f636844697265L8;FF4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd600fefff000a00491c990009400fefff000e00391c690009400feff9000a00d91c3900094BL8;FFce010d8bef11c0daef1540d2ef0d0f8bef250191ce194f8bdf010deb230300548c0500f1ed030eaa81fe", + "ff54ca010aab220200542801088b480108ab82020054L8;FF18c2ff97e04b00b9a04700d115c2ff97e04700b9a04700d112c2ff97e04300b9a04700d10fc2ff97f903002aa04700d10cc2ff97f603002aa04700d109c2ff97BBL8;FF0900f0f205000014090180d2e8031faa0900f0f229017fb24a1d4092", + "08010aaa692200a9fd7b44a9f32b40f9ff830191c0035fd6ff8303d1fd7b0aa9f75b00f9L8;FF08612a91e9d702f9c9048052e8cf02f9e863229160fdff9000081391e8d302f988fdfff008411f91e1031691a30302d1a82738a962008052a82739a988fdfff0L16;FF781600f907000014790e00f9b5000", + "0b4e00316aae10315aa2200805276d40094e0431e9115ddff97ff0600f1ebc0ff54e0b740f9e10317aa220080526ed40094BBBL8;FF1481899ae30314aafd120094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faaac700194e00741a9aa700194L8;FF", + "090180522a04009109692138e1431691ead302f9140d0094e88f49f91f0500b1c0000054e8074091e14316910881099100e1029137100094f87f49f9b80300b4BL8;FF7df4009481025ef8810000b480825ef82200805278f40094810240f93f0400b1e0fdff54810000b4800640f92200805271f4009481", + "0e40f921fdffb4801240f9L8;FF000c40391f1c007221020054e103142ae00313aa24feff97f40300aaf30301aaa0221f914107009473fdffb48afdff97f50300aae10313aae00314aab30240b9BBL8;FF2a04009109692138e1431691ead302f9dd110094e06349f9800100b4e1d342f9e8cb42f91f0101", + "ebe0c50054e8cf42f9090280522a04009109692138e1431691L8;FF0201805201ed7cd37b34009420c3c63ce88f42b99f0b00b1f67b42b92013803de86302b9e1010054e86342b92013c03d69120a9160aa49a9768202b9689602b9L16;FFe313c13df60b41b22f00001488a2069198da5fa98066c03d010", + "1c03d88de40f989d240f997fa40f99c0641f9e02b803d6183813ce86700f9e95b00f9361af8b6BBBBBL8;FB6c656e0000000000000000000000000000000000000000000100000000000000a0ab410000000000000000000000000010000000000000000800000000000000L8;FFf1ffff17b5e33ea9bf83", + "1ff8f50b40f9e80340f9bf0208eb81f9ff54e0030091ba970094c9ffff17e00740ade00313aae81340f9800600ad881200f93da3ff97BL8;FFe10317aae20315aa34000094770a40f9680240f9080117cbbf0208eba9f4ff54e00313aae10317aae20315aa2b000094770a40f99fffff17e00313aa220080", + "52L8;FFe0a30091e10316aae2031caa230080522400805213f9ff97e85b43a9ddffff1720fdffd000803a91cc18009420008052c1018052ac18009420fdffd000003f91BBL8;FF683340f960030191e10301912200805208050091683300f9b658019408e37a92e0030191e20318aaa102088bf8ff013918", + "088052775c0194e8ff4139e90740f9L8;FF28fc60d3a81000b5200840921f1800f162110054217c0353811100343f0800716c0100543f040071600300543f0800716102005401e30391a22302d19bf3ff97L16;FF9cffff17e00313aae10317aae20315aa230080522400805228000094770a40f9680240f", + "9080117cbbf0208ebc9f3ff54e00313aae10317aae20315aa23008052BBBL8;FFf40300aa750300b476c2009104000014b50600f1d6a20191c0020054c1025df8810000b4c0825df822008052727c0194c1825ef8810000b4c0025ff822008052L8;FF0239805221800991827c009488220791d800805294", + "018052000540ade893687915008092e8e30a79e057813de15b813d99000014e8074091f6b345f900230091BL8;FF02018052f44f43a9f70b40f9f65742a9fd7bc4a878fc001428008052bf0a00f9bf2200a9618200910000809274820091e4f800941f0400f140fdff54f44f43a9L8;FFf65741a9fd7bc3a", + "8c0035fd6e00313aaf60301aae10315aae20314aa2bffff97750a40f9e10316aaeeffff17fd7bbda9f65701a9f44f02a9fd030091140840f9BBL8;FFa9a316386901084aabd35638a9b316384901084aaae35638a9c316386901084aabf35638a9d316384901084aaa035738a9e316386901084aab135738", + "a9f31638L8;FF691147b86081c73c6181c83c683104b8e8835039f55b40f9e9b303b9e903092aea3b01f96ac61291e8e30939683144b8490100b969e21291ea0b42f968b604b9L16;FFe94f00f9e86f00f9943400b4fb0314aa7cbc0094e00314aa2100805275bc009400e400b4e1031aaae2031baae06b0", + "0f978bc0094e86f40f99a0100149ade78b3BBBBL8;FB4b050ad6260c58b75a2e324b9da1092fa9fc8163907995cfa28c3f14c8892782363f00003a9fab87e0b5e16308ecbb1732b56c2356cb0e75e97ed6a11e80aa22L8;FFcb7f8b0a4901094a6a2e0c536f2a0b5329010d4a6d360e532c7f8c0a6a7f8a0", + "aae7e8e0a713a0f530b020b4a105d10532f7c8f0a8d7f8d0a6b010c4a4a010e4aBL8;FF00010054810000b4e0ff42f922008052790c0194e8c3179100810091a6e6ff97a80359f8a003d83ce1833291022b8052f30703f9e80303f9e8c3179100810091L8;FFf44f04a9fd830091f403012a3f240071f303", + "00aaa9030054a8999952e02300918899b972887ea89b01fd63d3f2ffff97f50f40f9e10740f93f0015eb00030054BBL8;FFfd030091ff0740d1ff0300f9ff030cd1f50300aaf30308aa7a4c01940018805221008052734c0194e02c00b4e0e7076f08188052f40300aae88300a908048052L8;FFeb0f8012", + "2c7c10532b2c0633ec0000352a7c0c530b050039090900394a091b320a010039080000142c7c12532a440c330b090039090d00398b6d1c320a050039L16;FFf15f02f9e80b02f9e8b340f9f66702f9e81302f9e8c340f9e46b02f9e81702f9e89740f9fc6f02f9e81f02f9e8d740f9fe7302f9e82302f9e9", + "a349a9f47702f9BBBL8;FFffc301d1fd7b02a9f91b00f9f85f04a9f65705a9f44f06a9fd830091f50300aa4f680094f30301aaa100f8b6f6031faae00316aae10313aaab680194f70300aaL8;FFe8a716a95a1100d1e10740f9a1e6ffb59efdff17c0fdffd000a00091c3fdffb063403591c4fdffd084800", + "191a24700d1e1068052b468009420008052e1028052BL8;FFe8bb40f91f0500b1201400542003029142f5ff979e000014f8031baaf9c303913b008092171300b4e806178be00316aa0201805201f17dd36fec009492000014L8;FF60010054210000cbe00313aa632a40f922008052f30b40f9f00303aafd", + "7bc2a800021fd61b000094ebffff17f30b40f9fd7bc2a8c0035fd6c0035fd6fd7bbea9BBL8;FFe8c30291e263019184020191e0031aaae10319aa0304805205028052b4280194f95b40f93f0700b1a00c0054faa74ba90a630191061f57290083c13c00034339L8;FFf8134bf9f5174bf9c80240f9f7e342", + "f9680000b4e00317aa00013fd6c10640f9810000b4c20a40f9e00317aa722c00945f0b00b121020054e11b42f9ffe71639L16;FFe80300f97fac0094000480522100805278ac0094201400b4600740ade84312910291c03ce94b42f9fa0300aafc6352390104805222008052000400ad0091c13cBBBBBBL8", + ";FB64206d6573736167652076657273696f6e203cc0013e0030696e76616c69642073656e646572206b65792073657373696f6e2077697468206469737472696275L8;FFe0ffff17f44f47a9f65746a9f85f45a9fa6744a9fc6f43a9fd7b42a9ff030291c0035fd622feffb042202591e00304aae10303aa", + "b59c0094fd7bbaa9fc6f01a9BL8;FF0800f0f2080500d1e80700f9e0230091b2260094e10300aae10700f901ffffd02140119103ffffd063041291e0230091a200805224018052a7000014c80080d2L8;FFe80741b22bfdfff06ba13391ec018052f50316aaf6030a2a880200f92800805296260129952a0", + "1a98b3202a968220039f44f46a9f72340f9f65745a9fd7b43a9BBL8;FF14018052e0a30a91e1230091022a8052806001941f0700b1a0000054e0630591e1a30a91022a80527a60019460820091e1630591022a8052755200a9776201a9L8;FFe10b00a9e80000d0e40b00f9081140f91f0900f1830b00541", + "55040a9f60300aae063009102048052f30303aa81e2009180ffff97886a40b9d40a40f9e00313aaL16;FF55ecff97a00900b5e1031faad0ffff1781620091e20313aa4fecff97000a00b5e1031faacaffff17800400b5e00313aa2dedff97e80301aa40010036e80400b5BBBL8;FB70726f632f73656c662", + "f61757876000000000000000000002f6465762f6e756c6c000000000000000100020003000400050006000700080009000a000c000f00L8;FF2ea4ff97fb1740f917fbff17e063009122008052230080522400805227a4ff97e11740f91efbff17e063009122008052230080522400805220a4ff97e11740", + "f9BL8;FFf30300aa144000910140009100008092ecfc00941f0400f1c10100549ffedfc8610640f9e101f8b7600240f92200805271000194e00313aa0103805202018052L8;FFd30100b47f000094e00313aa2100805278000094400100b528008052880600f909028052936a29f8880200f9f44f41a9fd7", + "bc2a8c0035fd620008052800600f9BBL8;FF3f100071e1060054a80358f81f0500b161000054bf6738a9bf0319f8e1220191a22301d1bcc4ff9720f6ffb4850000143f1c0071e00400543f20007121050054L8;FFe00315aa0201805201f17dd37a4000943c008092320c0014a805003460fdfff00020209", + "1cd3c009460ce41f961d241f946000014e8c30a9102000014e8830b91L16;FF803a005475b742a9681f40f97ad341a9780b40f9e84f00f9fb030daabaa400b478c00094e0031aaa2100805271c00094206301b4e10318aae2031aaae06b00f9BBBBL8;FBe32e78d1bfc74716e40db55b9ebf8997d71c0000", + "19312952c9acd0edc00d4791bbc3e719e8f88d8adb93c773a7c1c07bf6641f9fe4d7b2f182ca87c567f6e9b3L8;FF08910a91e00301aae10308aae2018052fd7b44a9ff430191ae8c0014fd7bbfa9fd030091081840b9c8050034080140b20811c0da081540d2080d088b08250191BL8;FFc80080d2e0031", + "791e3032d910800f0f2e4833291e1feff9021a0389102018052e9ab0cb9e85306f9b8f4ff97f3f742f9e8ef42f97f0208eb61000054e0631791L8;FFfdc30191970840f9f30300aaf70300b4940440f9880240391f2100f1a1030054985040b9f60302aae30700a9f50304aa74cffe971f0400b1c00d0054", + "08040091BBL8;FF1f0500b180f8ff54e02312917ed4ff97c1ffff1728008052687e01a928008092687e00a93c000014f50900b475500194e00315aa21008052390080526d500194L8;FF6b2501914a194b8b4a050091490109abc20400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d32901", + "0a8b290500913f010aebe9030054200108abL16;FFe88304f942260094e8f741f9eafb41f9e9f341f9eeef41f9e1eb41f9e8e700f9e8ff41f9e82b17a9e80342f9e9231fa90900809248008052e8270ea9e8030eaaBBBL8;FFdc210094e80b40b928020036e90b40f923000014f503042af70303aaf60300", + "aa5f2800f1880000542800028b08f1df38e82df837e0230091ce210094e80b40b9L8;FFe80b40f96002803d680a00f9fd7b43a9f32340f9ff430191c0035fd679700094c00080522100805272700094c00200b4a8cc875289c78d52e9cdad7208080079BL8;FF39fdff9700fe073728fc60d3c80300b5200", + "840921f1800f1e2030054217c0353010400343f040071200100543f08007161fdff5481620091e20313aa46fcff97L8;FF00231f9149030094eaffff17c1424079e0fcff9000a01191212c46d304786178843c7cd3c20a40f9830014cb861000d1631000d142400091611e001265fc44d3BBL8;FFf407409", + "194820991df0600b18022005480620391df1b0094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb28210054L8;FF627e00547b0300b4f70315aaf50314aaf40316aa160480522003168be1031caae2031baa7b300094da021b8be0031caae1031baa22008052ba", + "031ef86e300094L16;FFe10315aae283c23ce43740f9e30318aac0860cadc26e803dc8e200f96f160094b70000b4e00318aae10317aa2200805271b00094b40000b4e00315aae10314aaBBBBBL8;FB4d000000000000005b03000009000000436861696e73656e6465725f726174636865745f6b65797365", + "6e6465725f726174636865745f6b65795f707269766174L8;FF3f01007109fefff029793d9121118a9ab0940014fd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091BL8;FF080100b4080140b20811c0da081540d2080d088b0825019108fd46d", + "308050091090c40f93f0500b1400400540a1440f9092040f90a0100b44b0140b26b11c0daL8;FFe00314aa00f1cf3ce80f41f9022b8052e087813de81303f97e18009431070014e9830c91e0d3c03d2181c03c298141f8e03f813d4183803ce97702f9e0431391BBL8;FFa2fe46d3b6e27a92b5164092e20", + "000b4e83340f980030191e10314aa0801028be83300f9b3540194e00300918102168be20315aaf5ff003976580194e00743adL8;FF0a000014e087c13de17fc23de80345f9fc5b02f9e037813d6182803ce86702f9e0833291dcedff97f5f742f9f4f342f9150500b49642009177028052b8fdff90L16;FF", + "06000014a08311f881feffb021c8119163fefff063200291a0a303d1a2008052840080523cdeff97a18351f8e86341f9f40301aa1f0500b141e0ff540effff17BBBL8;FF2f000014e003082ae20313aae303152a02fbff97e0f6ffb4aaffff17e003082ae10314aae20313aabbfcff97603000b500f6ffb4", + "a3ffff17898244f83f0500b1L8;FF220080527c780094e19b49f9810000b4e09f49f92200805277780094b30000b4e07b49f9e10313aa2200805272780094e18349f9810000b4e08749f922008052BL8;FF7df80094689240f9a80000b4609640f901f97fd34200805277f80094689e40f9a80000b460a24", + "0f901f97fd34200805271f8009468aa40f9a80000b460ae40f9L8;FFe10308aa5f0109eb4981899a0a0180523f2100f134818a9ae30314aa0b000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191BBL8;FF081002f8e8074091e20314aa000400ad20fffff000800f910", + "8c1359103048052e4031caa2505805206048052139c0094e2bf4ef9e3c34ef9e007409100800191L8;FFa02302d128f4ff97e80301aaa0030036482d00b5e1031faadbffff17a22302d1630c80528feeff97e10300aac0faffb46c010014e8434ab948000037f82305f9L16;FF6aa21ba9e87340f961828e", + "3ce19bc03d61a21da9e86340f9e1c3039160828b3ce093c03d7ca21ea9e9a346a961828a3c75e20139680601f9e83f40f970a61fa9BBBBL8;FB6a00000000000000950000002e000000110000000000000014000000000000001400000000000000d86f400000000000e96f400000000000fd6f400000000", + "000L8;FFab000054e05b40f901f97fd34200805279880094e86340f91f0500f1ab000054e06740f901f97fd34200805272880094e86f40f91f0500f1ab000054e07340f9BL8;FFe8bb01f996010014e8031691e00316aa05040194c8624039fbc342f9f5c742f9f7cb42f9e8631639e8feff9008611f91e8", + "d302f9e80180528083cf3ce8f304f9L8;FFf55b5ca9e0e30691fceb40f9e1031aaa220080522300805281f9ff97e8bb41b9e9e340f9e92700f9e8680037f52f00f9f5e740f9fc2300f9ba0000b4e00315aaBBL8;FFe0030091e80300f9b44e0094f40300aae04305917cccff97e00314aa23ccff97150080", + "9254fffff094c20a915605805260620091e143059102288052755200a9L8;FF2043813ce1031091e8a301b9e8b341b92007c03dffeb01f9e80303b928008052e8ef01f9080480520800ac72810101ade80b02f9e8430f91fff301f9e80302f9L16;FFe3e33b91e20314aa5a160094e8a343f9f9a743f9e9a", + "b43f9eaaf43f91f0500b140820054e0e3c13de1e7c13de2efc13de88b07f9e0d7833de0ebc13de1db833dBBBL8;FFff430191c0035fd688fffff0084117914903805268a600a948008052680200b9f44f44a9f51b40f9fd7b42a9ff430191c0035fd688fffff0082112917f4a0039L8;FFe10315aae20317", + "aa0001148b81680094e90344a9080009eb630e0054ff0208eb68080054340117ab420e0054f42300f9090740f9280117eb03080054090340f9BL8;FF810000549fde01a99ffe02a997fe03a981620091e20313aacef7ff97a0fbffb454000014a00c00b5e00313aa2ef5ff97e80301aa60000036c8faffb4", + "67000014L8;ZDBBL8;FFe01740f91a000014e90310912a0100d04a51059100ffffb00090199108210091e1c30e91e9db01f9eadf01f9cd24019428ffff9008291591e9008052e8271ba9L8;FFfd7bc5a8c0035fd6e00316aa3d190094d80640f9edffff1720008052e10313aab1240094ff8301d1fd7b04a", + "9f32b00f9fd03019100e4006fe80301aaf30300aaL16;FFe91600f9e93240f91f0119ebea3200b9ea6a40b9f4ce03a9f6ea04a9eca605a9ea6a00b941fcff54f40740f9b6577ea9b8835df8fb1f805233008052e00314aaBBBBBBBL8;FB656164657252656365697665640038706f73742d7175616e74756", + "d20726174636865743a206572726f72206372656174696e6720696e697469616c2041324220L8;FF410080527ba20094c01500b4f48300a9290080529f0600f109000079e90f00f9a01300541504007941008052770100f0f7420091fb0b40f99f0e00f138feffd0BL8;FF43feff540b7c07533f0108eb6b", + "611932000100544b692838080500911f0048f1280800f96202005400fc4ed3af000014e00700f9e00301aaf30301aae10309aaL8;FF6012803d695a01a9772202a9f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6ff4301d1fd7b03a9f44f04a9fdc30091f40300aae0630091a5150094BBL8;", + "FFf65755a9f85f54a9fa6753a9fc6f52a9fd7b51a9ffc3059177620114f44f56a9f65755a9f85f54a9fa6753a9fc6f52a9fd7b51a9ffc30591c0035fd6a0c300d1L8;FF220080526d010094610a40f9bfffff17e00313aae10316aae20314aa67010094760a40f9680240f9080116cb9f0208eb69f8ff54e", + "00313aae10316aae20314aaBL8;FFe90300f9e0030091b4e8ff97f44f47a9f65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6370080521800809219018052a80640f91f0116eb09100054L8;ZDBBBL8;FB2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41", + "fbabd9831f79217e1319cde05bef104000000000004e00000000000000L8;FFca8fff977f0a00b100040054e11740f9e80f40f91f0101eb40500054e81340f92a040091e00315aa49018052ea1700f9096921385afbff97e1630091bb8fff97BL8;FFb502000a1f01096be0179f1a92170194883a4039693", + "a4039b502000a1f01096be0179f1a8c170194883e4039693e4039b502000a1f01096be0179f1a86170194L8;ZFBBL8;FFc0035fd608200091200440a9e92300910a0000904a013f91e8a700a942ffff9042700c91ea0f00f9e3430091b33e0194fd7b43a9ff030191c0035fd608200091L8;FF4403805296", + "000014c90080d2e8430039480080520900f0f2e8470039e90700f9ddffff17e00700f981fdff902120179183fdff9063341791e0230091a2008052L16;FFe0afc23de22300f9e20309aaeefb0ba9eb9b06a9e6030aaae1df00a9fcbf00f9fba31da9a80100f0ef3300f9e56f00f9f6b70aa9f86700f9e0d3", + "00f9f1cb07a9BBBBL8;FB696e202053746172744f7574206f6620626f756e6473206163636573730000003d044000000000004900000000000000a5010000130000003d04400000000000L8;FF4a11c0da4a1540d24a0d0a8b4a2501914afd46d34a05009111000014e9031faa10000014f5031faa681a40", + "f948f6ffb5f6031faa770a40f917f7ffb5e80317abBL8;FFfcbf40f97c1500b4f3bb40f97d120194e0031caa2100805276120194a01c01b4e10313aae2031caae02700f979120194e8e740f9e98742b9fa5b06a91f0500b1L8;FF787f60d3e8cf40f9880000b4e18359a92200805278120094e8df40f9ea4", + "31391e09bc03d23fdff9063e03a9125fdff90a5803b91e89701f9e89340f9e0830a91BBL8;FFe0230091e10318aae20316aa2300805224008052e8ddff97f80f40f9e80740f9080118cbdf0208eb29f7ff54e0230091e10318aae20316aa2300805224008052L8;FF80520094e00313aa210080527952009", + "4400100b528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd620008052800600f909028052L16;FFe8c300f9084446a9e8ab00f9083840f9e8ab1aa90aa047a9eaa309a908dc48a90af840f9e8df00f9084c40f93f030aebea8300f90e284fa9e8af15a908684aa9BBBL8;FFe", + "00313aa220080522300805224008052e9fdff97610a40f95cfeff17e00313aae10317aae20315aa2300805224008052e1fdff97770a40f9680240f9080117cbL8;FF6e110094e1d342f92dfaff17e04316912200805269110094e1d342f98ffcff17e04316912200805264110094e1d342f95efdff17e043", + "1691220080525f110094BL8;FF6aa240a9e00740f9690240f9e10313aa54692838080500911f0048f1680a00f9a3fdff540b7c0e533f0108eb7361193220010054536928380cfc5cd308050091L8;FF1f0400b1a00e005402fe81d25aff4cd3631240f9c4020e914108d89a820600519c7e409343cf74b36", + "31200f921040051830c40b93f00146b21b0821a63040011BBL8;FFe09349f9220080527b320194e80740910881099100210491d70a0094e5fcff17e1d342f9e8cb42f91f0101eb008e0054e8cf42f949058052f407409194820991L8;FF01f8ffb4820a40f9e00313aabcffff17e803009100610e9131ecf", + "f97b9ffff17fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1L16;FF82024eadf7430891e307803de20302ad80b20094e0a30191e10316aa732a0094e8e30791e0a301916c280094e8ff40f91f0500b1e0040054e82f40f9f53b01f9BBBBBL8;FB6e7469666965720e62616", + "4206b65792074797065203cc3200080690400013e00696e76616c6964206b65792061677265656d656e74696e76616c696420736967L8;FFe10740f9e20319aaa0021c8b819a00948803190bbcc303d1a8f314387fff03f160030054a8f3543869070011e98300391ffd007120ecff54a96a283808050011", + "BL8;FFe20318aaf60300aa821a0194b3835df8acffff17e90313aaf54f43a9f75b42a9fb0f40b9f96341a9fc0340f9060000143c008052542340f9b4031df874f1ffb5L8;FF2083c03c2183c13cbf0600b1e00711adc0050054e077c03df53301f9fc3701f9e09f803d384100b4e80240391f0d0071800d0", + "0541f09007181400054010700d1BBL8;FF696200f9e9fe60d3600602ade083c83ce183c23c74220ba9e8fe70d3699a0179e90b40f9600a03ade083c33ce283c53c683a0339a88354f869720df8a9035538L8;FFe0dfc13de1e3c13de2e7c13d7f0208ebe02b833de12f833de233833d6190ff54e0631791a", + "8f8fe9780fcff1721010054810000b4a01240f9220080526e5a0094L16;FFacffff17a2c303d1630c8052e0e0ff97e10300aae0f4ffb437010014603a00b5a0c303d130e7ff97e80301aac0080036883a00b5e1031faa9effff17003500b5BBBL8;FFe80340b9c8000036e00740f9f44f44a9fd7b43a9ff4", + "30191c0035fd6e80b40f96a0640f9490108eb430200546a0240f9e00740f94801088b682600a9800200b9L8;FF6b0d0b8b6b2501916bfd46d36b0d009135000014eb031faa3e000014f3031faa0901098b0a0e8052f4cf42f9210108cb00510a9b33110094e00314aae10313aaBL8;FFc100005469964039", + "3ff501716100005473060091a3ffff17130500a91f410039f44f45a9fd7b44a9ff830191c0035fd6890480524a008052132500a90a410039L8;FF10785ed39f010f6a6d0150b2ae118b9a1f0068f2ce0147b2ad018e9a9f010f6aae118b9a1f0067f2ce014bb2ad018e9a8c010f6a0e9465d3ab118b9a8d0", + "1100aBBL8;FFf92b00f9f85f06a9f65707a9f44f08a9fd03019137fc4039f40301aaf30300aa1610805235000191383040f92000178be21640d2e1031f2af91640d216140038L8;FFc0ce0054e8fb41f9e9b30e91001fc03de99b04f92900009029712991e8fb03f92800009008c13391e89f04f9e8830e9", + "1eac32491e9a704f92900009029913491L16;FF400545ad6a5142784941092a6a1142b8e00718ad6181ca3c6081c83c5b8109aae9635e39eac35e39e28714ad6181cc3c6281c63cf503092aeaaf00b9ea6f44f9BBBBL8;FB8d0000001400000073686f756c642062652061626c6520746f2073656e642063", + "7432000000000000b51d4000000000005600000000000000a200000031000000L8;FFe00315aa410080527a8a0094000e00b4fa0300aa7b8a0094e00315aa41008052748a0094400d00b4fb0300aa758a0094e00315aa410080526e8a0094800c00b4BL8;FF68624039f5f345b9e8231839e8c31791b47e0", + "8530041c03ce183c13de8c31291e063813d01c18d3cc80080d20800f0f21c190091e14b41f9810000b4e04f41f9L8;FFf85f05a9f65706a9f44f07a9fd830091385040b9f50301aaf30300aad8030034080340b20811c0da081540d2080d088b0825019108fd46d308050091b70a40f9BBL8;FF844a01941", + "6000014e82700f93a2f40f9fb3300f9daf8ffb51b018052287f40f91f0500b101fdff541c008092289740f91f0500b1e1010054e82300f9353b40f9L8;FF6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab8202", + "00542a0140b2L16;FFe8db03f9e8df40f9eceb03f9e8e703f9e8af40f9feff03f9e8ef03f9e8c740f9ea0704f9e8f303f9e88b40f9f20f04f9e8f703f9e8b740f9e71f04f9e8fb03f9BBBL8;FF820d005433008052a00302d1e3830291e10315aa0204805224008052f38302396c1a0094776a0194000480", + "5221008052706a0194a03200b4600740adf40300aaL8;FFf50314aae00315aaff000094d60600f1b5a2019181ffff54682640f9c80000b4090d8052e00314aa02018052017d099b716a0094617e40f93f0400f18b000054BL8;FF0900f0f2e827003928017fb2e0030091e80300f9b1f0ff97e10300aae00", + "301aaf44f47a9f92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd637008052L8;FFe90300aa1f3d01383f4d0138e80300aae90300aa1f5d01383f6d0138e80300aae90300aa1f7d01383f8d0138e80300aae90300aa1f9d01383fad0138e80300aaBBL8;FFedc74639eaa34639e8d303b9e9ab077", + "9e8a759a9ecb300f9eda305392b1f0036ebd343b9e96306394921c993e8cb00f9ecab4779e31b40f9eb3b00b9a00302d1L8;FFa802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091150840f9080040f9f40302aaf30300aa080115cbL16;FF6200", + "0094682a41a989020acb1f0109eb49030054890208cb6b0240f94a0109cb3f010aeb890100546c0114cb9f010aeb23010054080e8052610640f98006089bBBBBBBL8;FB396366386336623562353537662f70726f73742d302e31342e342f7372632f656e636f64696e672f766172696e742e727300c00f2", + "04a756d70696e6720616865L8;FF95274078080101cb1f0500f109010054a806c05a08682178210800917b0700f1a1831ff8c1feff540d000014a06300d14200805223008052240080521fc2ff97BL8;FF210840f9f40300aa680240f91f0101eb40040054680640f92a040091e00314aa490280526a0a00", + "f90969213896050094e10313aad4fbff97803240b980010034L8;FF220080527c1e0094a1835ef8810000b4e00315aa22008052771e0094a06300d1e103172af411009428008052a16300d1e2630091e00316aaffa301a9ff1700f9BBL8;FFff0208eba002803da9031ef861000054e00313aabd59019474", + "0640f9d70000b4e806178b80620091e10314aa02f17dd31d5f0194a002c03da8035ef8e9060091L8;FF0801891ae99f40b9f48f06f9f69306f91f01096bf49706f9facf06f9fad706f9f3e706f9f3ef06f9eaef0db9f5f30db9f7f70db9610a0054e39348a9e0c31291L16;FFcaebff97b73240b9b70c003", + "4e80240b20811c0da081540d2080d088b0825019108fd46d308050091b60a40f9f60b00b4c90240b22911c0da291540d2290d098bBBBL8;ZBL8;FF2b7968784a090b8b40011fd603e4006ff6c744f90083c03c0183c13c0283c23ce007409100c0359101088052f6ef07f9e0fb863de1ff863de203873df6", + "0b0ef9BL8;FF610640f9a104f8b7600240f92200805279fe0094e00313aa0103805202018052f44f42a9fd7b41a9ffc3009172fe001460fa7f92280000cb010102ab62010054L8;ZFBBL8;FFe237c03d680200f96082803c6182813c6282823cdc0000b4b90000b4e0031caae10319aa22008052733e0194", + "ba0000b4e03340f9e1031aaa220080526e3e0194L8;FF08752391690080520001c03d08d140f8e9031039c90080d2ea0300aae0fb01f90900f0f20000803d08d000f8a802805234490091e8ff01f9e8f701f9f4f301f9L16;FF340108aaf2010014df0600b1a04200546003c63ce1d302f9e1c31591e0d70", + "2f9e0831d91ef7300f9eeeb00b9eccb02f9e9cf02f9eadb02f9fadf02f9f9e302f9BBBBL8;FBed964a2c7a47a1b3d7a7539ac0e0f1fbd1a00da647de446fa28cbcdc9c090000e6dcac7a3c5ce0ef84ce527407242bb0294934211e40d0c335297ca5adaa6b80L8;FF005a8052010180527a8e0094207300b", + "4f30300aaf4031faac8038052f5fdfff0b5ca3a9136008052e84b01f9e04f01f9ff5301f90b0000146802148bc9038052BL8;FFe0833291e1feff9021203f9102028052e3feffd063201c919e000014e05306f9e0833291e1feff9021203f9102028052e3feffd0635c1c91c402805296000014L8;FFfd7b", + "43a9ffc30191c0035fd635008052f4d701a9f41700f9e8030091e00315aae10314aa540d0094e80340f91f0500b120010054e003c03de80741a929008092BBL8;FF08a800a91f0000f9fd7b44a9ff430191c0035fd61f014871830e0054290cc0392a1d001208550a0b08014851e900f8378a00805208a80", + "0a91f0000f9fd7b44a9L8;FF0801098b130500917f0209eba9140054088c48f81f0500b12011005464feff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b08050091L16;FFe86342f9eb9342f9e0c7833de81300f9e86742f9e89f00f9e88342f9e84300f9e89742f9e87b00f9e8", + "9f42f9e8d300f9e8ab42f9e85700f9e8b342f9e8a70ba9BBBL8;FF00010034808640a9e8330091696a0094f5334039bf0a0071e1000054e0031f2af44f44a9f65743a9fd7b42a9ff430191c0035fd6608640a9e8330091f45341f8L8;FFfaa359a92083c13c2183c23ce00600ad808601ade8b700f9bc000", + "0b4e0031baae1031caa22008052736e00945f0b00b1c1f2ff548082c23ce8bf40f9e0430691BL8;FFfd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff430bd1081c00121f09007181010054e00302aaf30302aaf40301aa2bfbff9720020037L8;FF0020402a0a0400114001200a00", + "7c091b007c1b53404860380004005100741e530204001108d962783f0008eb69000054020c001100080011e7a01191e0d86078BBL8;FF23ffffd06320219124ffffd084a00a9142c035918107805248432c39ba2a0194e0074091e10318aae20319aa00002f912a120094f8eb4df934f5ff1748236639L8;", + "FF7c2e0094604a00b4a0877dadfa0300aa000400ad7b2e009400c4805221008052742e0094c04900b4e1833f9102c48052f90300aa16c48052762e0094e0074091L16;FF610240f9810000b4600640f92200805279ae0094610e40f9610200b408048052606a68f822008052f44f48a9f65747a9fd7b46a9", + "ff4302916fae0014610240f9BBBBBL8;FB090100002e00000042024000000000006a00000000000000b00000002e0000000000000000000000080000000000000008000000000000006c2f420000000000L8;FF2909c05aa0033fadae3f7529a003dc3ca103dd3ca203de3ca303df3ca303983ca203973ca", + "103963ca003953ce8270e294809c05a6909c05ae8270f298809c05aBL8;FFf8031faaf90317aae00314aaeafcff97080040b20811c0da081540d2080d088b08250191081848abe2090054180118ab020a0054390700f194c2019161feff54L8;FFa04700d117c4ff97f903002aa04700d114c4ff97fb0300", + "2aa04700d111c4ff97e8074091e9ab41b908411d9109010039e99b41b900fd0039e007409109050039BBL8;FF0811092a29008052a9031cf808000039e0030291e2140094e8f77fb21f0008ebe8350054f72740b99f0600f1602300542800805249018052c96a283808050091L8;FFfd030091ff032ed1f3", + "0308aaa83340f9aafdff904a211791ff0300f9a96b40b9e82f00f9ea4302f9ea4702f9aa4700d1e7a30ea9a80c40f9e08706a9ea830aa9L16;FF84d60094fa031f2ae8f340f91f0d00b141160054e1b340f9280080527f2200a9080080923f0400f17f2201a98b000054e0b740f9220080526fd60094e883", + "0591BBBL8;FF550300b4610a40f9680240f9960640f91f0101eb80310054680640f9490180522a040091e00315aa6a0a00f909692138e10313aa5dfcff97770a40f9680240f9L8;FFe1431691a8140094e8b349f9f4074091948209911f0500b18000005480020491e14316912a130094e8cf49f91f0500b", + "180b5ff5481e20491b4010014e1d342f9BL8;FF810000b460ce40f9220080527af6009461d640f9810000b460da40f92200805275f6009461e240f9810000b460e640f92200805270f6009461ee40f9810000b4L8;FFf51300f9622e4092150082d2600202cb01008052e3f6ff97130014cb7ffe3ff10903", + "0054f30300aa000440d1a40213cb650e7fa96202048b630005aa83feffb5BBL8;FF4081833ce067c13d4181823c4281813cead342f9e99f06f9e24bc33de347c33de14fc33dea8306f9e03f833de18b833de143c33da7ffff17e8f342f9e06fc13dL8;FF1f0500b1401b0054e8fb41f9001fc03de0432a91", + "022b8052e84701f9e8830f91018100912083863c7a360094e04740f9e2432a91e10316aaadd6fe973c008092L16;FFe4f5ff17ba0000b4e00315aae1031aaa2200805278b60094e16f40f9810000b4e04740f92200805273b600949b0200b4e04b40f9e1031baa220080526eb60094BBBBL8;FB747261746", + "96f6e5f6964616c6963655f626173655f6b657970656e64696e675f6b796265725f7072655f6b65796c6f63616c5f6964656e746974795f7075626cL8;FF8002803d682600294809c05a6909c05a682601298809c05aa909c05a68260229c809c05ae909c05a68260329f44f48a9f92b40f9f65747a9f85f", + "46a9fd7b44a9BL8;FF404fc03da80359f814000014e8e322910081cb3ce8c344f94003803de8f304f943000014404fc03da80359f8e05344f94003803de8f304f900c1ffb4e15744f9L8;FFf71f40f9fb1340f9d582009104000014940600f1b5c2009180010054a1025ef8810000b4a0825ef8220080527", + "2060094a1825ff8e1feffb4a00240f922008052BBL8;FFe0031caae1031baa220080527a4601943f0700f1ab000054e03340f9e10319aa2200805274460194df0600f12b010054e02f40f9e10316aa220080526e460194L8;FFfafdff17c8000090081140f91f0900f123030054e8b30a9109feffb029c11", + "991e80302f9e8830a9140fdffd000281291e90702f9290000f029712991e80b02f9L16;FFe91744f9e92b14a9eb9b44f9ea1f44f9e9a744f9ea9f00f98ae20791f43744f9e92b07f9e92344f94001c03dea5f44f9e90f00f9e92744f9e093833de91700f9BBBL8;FF09f306f809810091e8a703a988ffffd", + "008613e91e82700f908008012ea0300f90b7307f80af307f8e85300b97af7ff97e81340f91f0500b1c0000054e00bc03dL8;FF220080526d050094880a40f9e00313aae10314aaefffff17e00301aaf30301aae10309aa22008052f4030aaa630500946ba240a9ea0314aae10313aadeffff17BL8;FFe003", + "0091420180524400805211000014c80080d2e0230039e00300910800f0f2ff270039e80300f9acecff97e80300aae80300f9a1feffb021e81491a3feffb0L8;ZDBBL8;FF01f57ed3420080527b260194684a40f9a80000b4604e40f901f57ed34200805275260194685640f9a80000b4605a40f901f57ed3", + "420080526f260194686240f9L8;FFf30300aa810000b4600240f92200805279260094610e40f9c10000b4600a40f922008052f30b40f9fd7bc2a872260014f30b40f9fd7bc2a8c0035fd6fd7bbea9L16;FF16250a9bf50316aaa88e46b89f02086be9979f1a29219f5a291d0072a01600542a4c40b93f050", + "071610300548902086b032000542b4840b90c358c527f010071" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines1 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines10.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines10.lean index 548e62ae7..e5762849b 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines10.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines10.lean @@ -27,358 +27,252 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub10 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF402a0054c906009129fd43d32af17dd3490109cb1f0549eb090200542a0500915f0108eb0895899a1f3d00f18210005409017d921f1100f18800805229210091L4;FF22200094c000009000603b911f200094c000009000c03b911c200094c000009000203c9119200094c00000900080", - "3c9113200094ffc300d1fd7b01a9f44f02a9L8;FF350080527a200194600000b5120000142000805268fe4ad309088052804e00a90811c0da280108cbe90080521f1d00f10831899a29008052280908aa932201a9BBL4;FF810000b4e04b40f92200805219a00194e15340f9f803162a810000b4e0031aaa", - "2200805213a00194bf0600310004005448008052e0c30191e3830091e10319aaL4;FFf96b04a92103005460c25f3862d25f3863e25f784410001280010034e30000343f000039007d20d4f55b42a9e00301aafd7bc5a8a2fdff1763825fb8e0ff9f52L8;FFa80f00f968a0009468220291810100d021f81d", - "91a40100b084200f91a3630091a2018052a80f00f95fa000945fa00094fd7b41a9f31340f9ffc30091c0035fd6BBBL4;FFe85341b9e86700b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eba3780054L4;FB2e312f737", - "2632f62797465735f6d75742e7273002f72757374632f34386132323963656165666434393835633530393930623134313136623664383536616630L8;FF00e540f9e02f00f900e940f9a07a00543f050071a1200154890080520a008092790a00f969220039e00308aa6a0200f9ff074091ffc30091f44f", - "45a9f65744a9BL8;FF6a600194fd7b41a9f31340f9ffc30091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aac10200d021e43191e8230091e00309aa02038052L8;FF2200805232030094610a40f9daffff17e00313aa220080522d030094610a40f9eaffff17fd7bbca9f85f01a9f", - "65702a9f44f03a9fd030091f30301aa210840f9BBBBL4;FFcd010deaa1feff54428c202e42a8302e4d00261e6d030037082100918001088b0c00098a42696cfc438c212e6d00669eadc101f221fdff54f4ffff17c80180d2L4;FFe00313aa2100805217000094400200b4e10316aae20313aaf50300aa1d0", - "00094935600a9930a00f9f44f42a9f65741a9fd7bc3a8c0035fd635008052935600a9L8;FF220080522300805224008052f4030caaf7150094e10340a9ec0314aa2aa040a9290040f90bfc63d35369283808050091280800f9cbfdffb43f0108eb93611932BL8;FF040300d084e01291e0030091a3630091", - "a2008052a80f00f963800194010300d0211828912403009084402391a363009162008052b30f00f95b8001945b800194L8;FF09692138aef1ff97e1630091947fff97888248f81f0500b180070054e11740f9e80f40f91f0101eb20830054e81340f92a0400918022029149018052ea1700f9BBBL4;FFa8a", - "300d118960094a8835d381f050071e0040054480340b9493340b8a0a301d12a034238e10314aaa88319b8288341f8c9b20cb8a92f7ea9aa031c38a8831bf8L4;FB697665725f636861696e7370656e64696e675f7072655f6b657972656d6f74655f726567697374726174696f6e5f69646c6f63616c5f72", - "656769737472617469L8;FF0081079123c0009488c20d91e0030091b0320094e0430691e1030091023280521cc00094e1430691e00314aa026e805218c00094ff031491f44f42a9fc0b40f9BL8;FF08393091a82b3fa90a078052c8048052bf273aa9a90200d029cd2191a92b3ca9290080d2e92fc0f2a87", - "f3ba9a8273ea91c400194e11b40f9810000b4e01f40f9L8;FF410180390101f8b7e0031faa4a050091290500d10a2500a9fd7b43a9ff030191c0035fd63f2900f1880000544b01098b6bf1df388b0cf8374b05c0396c1d0012BBBBBL4;FF63902c91a0c300d142018052440180521b000014a0031df82104", - "00d021682c91230400d063c02991a0c300d142018052a400805212000014a0031df8210400d0L4;FF09050039e97b41b900401d9118d5003909090039e97341b919f50039090d0039e96b41b916f9003909110039e96741b909150039e95b41b909190039e95341b9L8;FF690a00b9682a01a92800805268", - "0200f9fd7b43a9f32340f9ff430191c0035fd6e91340f9ea2b40b97f7e01a9691200f96a2a00b97fb200397f0200f9fd7b43a9BL8;FF550500b4363740f916900194e00315aa2100805214900194e00b00b4e10316aae20315aae01b00f91a900194364740f9560400b4f40f00b9f403172af7031caaL8;F", - "Ff31300f9fd430091e90301aaf30300aa610100d021b01c91e8030091e00309aa620180525f900094610100d021101591840100b084003191e0030091a3630091BBBL4;FFc0035fd6fd7bbea9f30b00f9fd030091f30308aa13d00194004680520101805211d00194e00000b4a8008052680200a97f7e01a", - "9f30b40f9fd7bc2a8c0035fd6L4;FB5f8bd566a27c2d97cce9733a9e4aa29aadaeace7eb39784a9e12a28c2bf9abb41e0d428b000097756460c5accfeb824580d679cbd3e4be0fe17bcce884d4d43bL8;FF08110f9129038052e8ef01f9e80100d008012791e8a303f9e00100b000403a91e8ab03f9e8010", - "0d008212a91e1430f91fc3340f9e3031d9162008052f8eb01f9BL8;FFff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052L8;FFe5432591c082833c2083c63ca68302d1e87704f9e85b44f9a7", - "0302d1c082863c404fc03de203182a2283c53cc182843c4143cf3c20f18f3ce963019120cbc03dBBBBL4;FF008501ad020041ad028102ad600540ad000500ad092902a9f44f42a9f65741a9fd7bc3a8c0035fd6f403012af60308aaf50300aa20f00194e80316aae90300aaL4;FB365f4352595354414c53", - "2d4b594245522d313032346c656e67746820636865636b656420617420636f6e737472756374696f6e0000000000ea98480000000000L8;FF977e02a99f5e03a99f6204a99f3e00f91f0900f1a1110054e00313aaffeeff9740010036210e00b5e0031faacfffff17e003082ae20313aa430c8052a1e8ff9", - "7BL8;FFe00301aa3f0500b1e0010054ff8300d1fd7b01a9fd430091e10200d0218029910403009084803691e323009182008052e80700f951700194fd7b41a9ff830091L8;FFfad342f9e8cb42f908011acb1f0308eb48420054e8cf42f9e10319aae20318aa00011a8b1b7000944803188bf90b40f9fa07", - "40915a830991e8d302f97f0700b1BBBL4;FF63000491640300d084a00f9120c10091a263009121008052aa0f00f9f30308aa48b00194e00340f9e80313aae90300d0290d40f9a9f7ffb50a8046b8c90380d2L4;FFe1031f2ae20313aade110094e00314aaf44f42a9fd7b41a9ffc30091c0035fd6c0035fd", - "6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091L8;FFf44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a87da9ff17a50100f0a5400191e123009162c20791e0031f2ae3031faa86b00094e8a34639a00100f000a00191BL8;FF2181803ce86702f910000014c80080d2fb4340f9fa83", - "02910800f0f21c4500910a000014e087c13de17fc23de80345f9fc5b02f9e037813d6182803ce86702f9L8;FF687240f9c80000b40805088be00315aa0201805201f17dd31630009420074bad28008052e99343b95c0300f9560b00b940c3803c41c3813c492f00b968020b39BBBBBBL4;FFfd7bc2a8c003", - "5fd6fd7bbea9f44f01a9fd03009108e040391f0d0071a101005413d042a9880240f9680000b4e00313aa00013fd6810640f9c10000b4820a40f9L4;FFfd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9ff0740d1ff0300f9ffc327d1f30302aaf70303aaf90301a", - "af40300aaL8;FFfd030091150840f9160040f9f40300aaf30308aabf0216ebc1010054f50300b4890640f9e904003769d600a9290140b2680200d008811f91690e00f9680200f9BBL4;FF4281ff9720eaffb47e000014a0e300d19d980094f40301aa00ed0736ad000014c08640adc282c93ca88353f8c38", - "2c83ca9035cf8e0070cadc082ca3cc182c43cL4;ZBL8;FFa363009122018052b30f00f96698009466980094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa81010090BBBL4;FFa8031fb83dd1ff97fd7b46a9f33b40f9ff030291c0035fd6ff4302d1f", - "d7b03a9fb2300f9fa6705a9f85f06a9f65707a9f44f08a9fdc30091f40300aae00304aaL4;FB75616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f656e636f64696e672f67662e7273002f636172676fL8;FFfecb40f9e44f40f9f19740f9f6bf40f", - "9ec8740f9fbab40f9fab340f9e3e740f9e84740f9e0b3c23de0430f91e1031d91e20319aae3af03f9e8a303f9e86b40f9BL8;FFe08749f9220080521a580194f4ab49f99f0600b1a0baff54f5b349f9f3af49f9551600b47622009104000014b50600f1d6620091a0150054c1825ff881ffffb4L8;FFe103", - "1faae8570cb9bcffff17e1031faae8630cb9b9ffff17e1970cb9f2feff17e1930cb9f0feff1708018052ffeb05f9f6ef05f91f7f0aa91fff0ba9f6fb05f9BBBBL4;FFe00743ad882a00f9280080528212803d800600ad68720039f44f4fa9f76b40f9f6574ea9fd7b4ca9ff030491c0035fd600018052010", - "2805226f80194000400b0L4;FB6c696e75782d676e752f72656c656173652f6275696c642f6c69627369676e616c2d70726f746f636f6c2d613434636635613164633062366666632f6f75742fL8;FF16faff97200600b5e1031faae2ffff17880248f81f0500b1a10000549f6608a99f7e09a9997e0aa99", - "fb200b981020291e20313aaecfaff97c00600b5e1031faaBL8;FF680200f99a0000b4e1031aaa2200805218780194b70000b4e03740f9e10317aa2200805213780194e12f40f9810000b4e02b40f9220080520e780194880700d1L8;FFe8074091e00740910881099100c0359118e1079108e10791aeeaff", - "97e0074091e1074091023280520080019121c0359118780094e00fc43de113c43de0074091BBBL4;FF3500805218b8019400ffffb4e92340b9680080527f0600b1f48302a90811092a08000039400d0054680240b20811c0da081540d2080d088b08250191681a488bL4;ZDL8;FF080101cb1f7d00f1c902", - "0054e80b40f980a2c03c81a2c13c0801018b000500ad288000910500001496008052e80b40f916693538a8060091e083c03c6002803dBL8;FF29010a8b290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a2501", - "91L8;FF810000b4608e43f92200805219380094619a43f9810000b4609643f92200805214380094ea5f40f9f44740f9e95740f968c6533935fd48d3a801003661f241f9BBBBBL4;FF09000014e00700f92104009021d429912304009063302a91e0230091a20180522402805274fc0094e90740f928ffff1", - "7e0230091e8a700a966e40094e00316aaL4;FFe083c03c8899b972aa060091887ea89b6002803d08fd63d308d1091be90b40f908051c32286935386a0a00f9f44f44a9f51b40f9fd7b42a9ff430191c0035fd6L8;FF5a080114a9200091410200f021801791a9831ff8430200f063bc1791460200f0c6001", - "791a52300d1e00308aae2018052a400805264080194fd7b42a9ffc30091BL8;FF29050091280108ab02080054699640f93f0500b1c00300546a4241b9699e40f92a0600344a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a050091L8;FF5b0080525a00805259008052580080525700805250", - "0080524f0080524e0080524d0080524c0080524b0080524a00805249008052a8fe41d3eaff06a9ecff09a9BBBL4;FFa103009021242891a303009063402891e0030291e2008052c400805276bc0094fa4340f9810350a94a0080d298e751a90a00f0f2965f53a95a0200b43f0400f1L4;FB73696f6e20737", - "461746520636f727275707420666f7220c00076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f74726970L8;FFf7430d916281ce3ce9f200f8e91f5e396481cb3ce0d7803d410146ade85744f9f40315aae60309916381cd3cfb6b00f9ef0314aae10319ad6081cf3c", - "ecd343f9BL8;FFc0035fd6e0230091f7a300a971240094e0230091f7a700a96e240094e00313aae1031faae20314aa1a070094770a40f9680240f9080117cb9f0208eba9fbff54L8;FFf60301aae10315aae20314aa30ebff97750a40f9e10316aaeeffff17281040b96800c8376800d0373248001463480", - "0146348001409004039e80300aae00301aaBBBBL4;FF5f0308ebe0080054381f40f9da0000b4080d805200a30191e10318aa427f089b16e80194080480525f3f1ff11f4f00a91f2304a9142305a9480700911f7f01a9L4;FB720000000000000030000000260000004f9d480000000000750000000000000", - "07a00000026000000000000000000000008000000000000000800000000000000L8;FF61fdff54e87f41f91f0500b1e1000054ff7f01f9fc8301f93fff04a9fc8f01f9ff9301f9ff2b03b921e30091a2c303d118efff97e00100b4c0010014e86341f9BL8;FFf31340f9ffc30091c0035fd6ff0301d1fd7b", - "02a9f44f03a9fd830091e90301aaf30300aae102009021682c91e8230091e00309aa420180525a68019468820191L8;FF220080521b680094f8ffff17680e40f9480100b40805088be00314aa01f17dd302018052f44f43a9f70b40f9f65742a9fd7bc4a80f680014f44f43a9f70b40f9BBBL4;FFe08e41a", - "de123c03de216c03d6112803ce30a03ade10204ad6012813c6312823c6212833cb40000b4e00315aae10314aa220080520fa80194e10740f9c10300b4L4;FF461000f9e8ffff17200000b000c0099171ffff974cffff976000f837fd7bc1a8c0035fd6000080d21f000039007d20d440d03bd5009002d1c0", - "035fd6c0035fd6L8;FF4fa8009488e27a9282164092a0c303d12103088ba2f314381ea80094f90b40f9b5c303d125000014e10f40f9820108cba002088b198100d1b3c303d13400028bBL8;FFf303012af40308aa3f0500716102005428008052090000b029c10691e8730039e87300910010c03ce82702a", - "9a88300d1290000d029712e91800200b000643991L8;FFb9eb7da90cfcff17e89740f9c80000b40805088be00314aa0201805201f17dd3142800943a008092a2faff17a0c300d1e1031aaae20318aa60eaff97ba035ef8BBBBBBBL4;FF0801c0da0811c0da08fd43d3dcffff17220000d042601191e1a300", - "91030a80526477009414008092e00314aaf44f4aa9f65749a9f85f48a9fa6747a9fc6f46a9L4;FF291c0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ffc30bd109404039290a0037160440a9f30300aae0630591f40308aaf9030591L8;FFe10314aae30313aaf44f42a9f657", - "41a9fd7bc3a891feff17480014cb160113ab62010054e00314aae10302aae20313aa121c0194b65200a9b30a00f9f44f42a9BBL4;FF9c031e4afeaf40b9fc221f38fc525f387b031e4afeb340b9fb321f38fb625f3808011e4afeb740b9e8421f38e8725f389c031e4afebb40b9fc521f38fc825f38L4;ZF", - "L8;FFe00301aae80000341f05007121010054a10100902154149142038052539c0014a101009021c01391a20480524f9c0014a101009021bc1491a20280524b9c0014BBBL4;FFd6c20091e10b40913b0080529aff4439c002029121c0009122008052e047803de02f883d000941ade133883dc81f8052088", - "3313908008092e043803de037883dL4;FBfa0f4900000000004d00000000000000e8020000050000006661696c656420746f206465636f64652050726f746f627566206d6573736167653a200000000000L8;FFe8cf00f9e82342f9e78742f9ee8b42f9e28f42f9e4a342f9e89700f9e82742f9efaf42f9e", - "dbf42f9e0cb42f9f2db42f9e8a71aa9e92b42f9e82f42f9e9a309a9BL8;FFe0074091e82b48f9e20bc43de1074091e08f843de0ffc33d00800991e193843de103c43d21800191e07f843de007c43d023f8052e82b09f9e183843de28b843dL8;FFe92f09a9e9c30091e9230aa9a8c301d12900009029e101", - "91e82b0ba9e8430091e8270ca948008052290100b029413191ea430191a8273da9280100b008991c91BBBBL4;FFfc6f09a9fa670aa9f85f0ba9f6570ca9f44f0da9fd03029109804039490c0037155c40a9f40308aa0004c03df30300aa1b008092a80e40f9e01b803dfb5f04a9L4;FB722e72730076656e", - "646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f7365616c65645f73656e6465722e7273002b73656e646572L8;FFb0f4ff97e10300aa60fdffb5480740f91f011ceb49600054e00313aafffaff97a0fc073728fc60d3086000b5200840921f1800f122600054287c0353486", - "00034BL8;FFa2028052e40314aab30f00f9667c019468620091010300b021fc3491a3630091c2028052e40314aaa80f00f95e7c019468c20091010300b021601891a3630091L8;FFe0630091220080522300805224008052f791ff97e11740f984fcff17e0630091220080522300805224008052f091ff97", - "e11740f996fcff17e063009122008052BBBL4;FF880100b40ba444a92a0c40f940010bcb1f0009eb68010054080008ab01319fda3f0009eba8010054fd7bc1a8c0035fd6e1031faae0031faafd7bc1a8c0035fd6L4;ZBL8;FF688242f86082c13ce203c03d6102c03dd53200f9e82f00f9680a40f9e08384", - "3ce09340ade82300f9e10f803dc20200ade30342adc40601adc30202adb40000b4BL8;FF28170054e4000014080c43f81f0900b1010b0054f3031faa64000014e80300aa098d40f83f0500b180160054f30300aae00308aaf7feff97e80300aae00313aaL8;FF698e01f96a9201f97f420e39696e41f96b2", - "20c916a7241f96001c03d686641f96ba20d91699e01f9697e41f923008052616a41f9607641f90221039169ae01f9BBBBBL4;FFc80240b20811c0da081540d2080d088b0825019108fd46d308050091f50100b4a90240b22911c0da291540d2290d098b29250191a91a498b290500912001088bL4;FF190c", - "0094e00c00b481060091e20319aafa0300aa1f0c0094d702f8b6f4031faae00314aae10317aa1f0c0094e90f41b206000014e91741b204000014290480d2L8;FFe10300aa140000f96202009042c01291e003132a8b0c0194f44f41a9fd7bc2a8890c01140001805201018052290c0194fd7bbda9f50b00f", - "9f44f02a9fd030091BL8;FFf6b340f9e00300910161009102288052208c0194bf0600b1c0020054e0430591e1030091022880521a8c019417000014880080d2e00700f90800f0f207000014L8;FF0208803d00c0823c01fdff54f30300aae0430a91b8d4ff97e00313aaf34f41f9e2ffff1733008052590d", - "00b43f0700f1c02300543f0f00f1210d0054098c0094BBBL4;FFf60313aaf30300aa16cc0194e0031baa210080523a00805213cc019400fdffb4e10317aae2031baaf50300aa19cc0194e00313aaf30316aaf6031caafc0318aaL4;FB18f8450000000000000000000000000008000000000000000800000", - "00000000024f4450000000000000000000000000008000000000000000800000000000000L8;FFf5031faadf0600b160000054e00317aa0fc7ff9708008092750600f9686a01a903feff17e1e741f93f0400b140010054810000b4e0eb41f9220080520dcc0094BL8;FFf70b40f9f65742a9fd7bc4a8c003", - "5fd6fd7bbea9f44f01a9fd030091140040f99f0600b1e0030054012440f9f30300aa3f0400b140010054810000b4602a40f9L8;FFfd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f9BBBBL4;", - "FF000540adfb0301aa3ff401f1f3430291ff7f15a9ff230179e18302ade08708ad020141ade08b01ade28309ad080b005460027fb2e1031aaae2031baa15ec0194L4;FB63616e2062652070726573656e740000000000000000000008000000000000000800000000000000304b420000000000000000000", - "00000000800000000000000L8;FFc0080054680640f9490280522a040091e00316aa6a0a00f909692138e10313aa8febff97780a40f9680240f9080118cbdf0208eb08080054680640f9e10317aaBL8;FFf70b00b9e00f803dbc0000b4e0031aaae1031caa22008052166c0194e0e30191fb3f00f95d54ff", - "97e81740b9fa5f42a9fc0f40f9fb3f00f91f05007161040054L8;FFf70b40f9f65742a9fd7bc4a8c0035fd636008052765200a9771200b9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd620008052e10314aa266c0094ff0302d1BBBL4;FFe08707ade00741ade247803de21340adf87b40f9e133803de", - "40305ade00f42adf73f4339e227803d8002178be21640d2e08f06adf91640d2161400380bac0194L4;FF0b118b9a5f01096a700170b2a8058d9a1f005cf26dfe56d30f159f9a4801096ae9119f9a5f010e6a0efc4ad30b128b9a5f010d6a6f1605536d0141b28e010e0aL8;FFf63300b908028052f60313a", - "ae85700a9ff2301a9c88640b8e07f02a9a8080036fc031faaf7031faaf8030091190380523a0080520c000014e81340f9a003dd3cBL8;FFb58302d19fdbff97c8fffff008912891490200f029110f91e8c702f9e8ffffb008310791e9d702f9c9048052e8cf02f9e8632291800200b000b82c91e8d302f9L", - "8;FF080b00359b1f4092fa0f41b2691f40927b0309aaa1035df8616400b526030014a8035df808011acb7f0308eb287e0054bb0400b420031a8be1031caae2031baaBBBBBBL4;FF93611932a00300540cfc6ad35369283808050091280800f92c0500b5e0030baa3f0108eb20010054290440f90a0500912", - "06928382a0800f9f44f42a9fd7b41a9L4;FF220080521b140094e11341f981e300b4e01741f91807001412140094e0031aaa210080521014009440e900b4e1df40f9e2031aaaf90300aa16140094e0d7c53dL8;FF29008052010500f9090100b9c0035fd609fc58d30afc50d30bfc48d30cfc70d3000d003", - "90901003909fc68d30a0500390afc60d3091100390910805229340833BBL4;FF08008092e80b00f9bac301d11f0500b1a30c00b4280300b008c10d91290000b029311991400f0054ea1340f9eb230091200300d000bc3091eba305a9e1630191L4;ZDL8;FF6102005469aa4829c9030034290140b22911c0", - "da291540d2290d098b2925019129fd46d3290d00910a0300344a0140b24a11c0da4a1540d24a0d0a8b4a250191BBBL4;FFe2028052640280521e000014880080d20800f0f208050091e81300f9e083009133c90094e01300f9a10300f021982a91a30300f063a01d91e0830091e2028052L4;FB782971ba6", - "2157026a08ce8baee34a28c5e8bd2aa000067bc8ee267ce5d4bcb6e039a74ec24e695ad626d6783b22610fd8b1b3c336a5c5bf0b0d63457fe50060bL8;FFf75744f9e9c300f9e9d343f9fb5b44f9f66344f9ef6744f9ed6b44f9e9ab00f9e9db43f9fa6f44f9fc7344f9e77744f9e07b44f9e9ab1aa9eadf", - "43f9e9e343f9BL8;FF7f0700b1fb0314aa806dff5440c30391d1000014e8031faa00011aab62570054e1431691c60c00943f0700b1f90b40f9e0070054e1d342f9e8cb42f91f0101ebL8;FFe9c31291e8cf44b9f5bb44b920c1c03c9f0b00b1e8a304b9e027813d410a0054e8830291e99f40f9e027c13d1", - "6d10791e8a344b9f59302b93f0500b1c002803dBBBBL4;FFe9430191a20301d1e003082a217100914ddeff97601200b5b7035cf8fb0317aa628f40f8e20b00b4e10240f9200080398000f8b728040091490400d111000014L4;FB75697265646b796265725f7072655f6b65795f696420697320726571756", - "9726564000000000000006b796265725f7072655f6b65795f7075626c696320697320L8;FFc90080d248008052e02300390900f0f2e8270039e90300f9e003009134e9ff97f44f47a9f92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd617008092BL8;FFe0c30191f93b00f9645cff97e81f40b9", - "f61340f9f93b00f91f05007141040054e0c301915d5cff97f80b40f9f93b00f9b8030036e0c30191585cff97fc1740f9L8;FFe09349f9220080521a740094e19b49f9810000b4e09f49f92200805215740094b30000b4e07b49f9e10313aa2200805210740094e18349f9810000b4e08749f9BBBL4;FFf70", - "300aa19210091b54301d1bca303d138008052e20301aa09000014a26301d1830c8052249aff97200c00b5bc835af8f9031caa228f40f8e20e00b4810340f9L4;ZBL8;FFf65750a9f85f4fa9fa674ea9fc6f4da9fd7b4ca9ff830491c0035fd6ff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9f", - "dc30091f403032af30300aaBL8;FF232c0054a88357f8080540f91f0115eb290b0054a02302d138ecff97a033003728fc60d3a81000b5200840921f1800f162110054217c0353811100343f080071L8;FFc80080d20800f0f20809009103010014c80080d2f64f05f90800f0f2080900d107000014e04f05", - "f9e80b41b204000014c80080d20800f0f2080500d1e0432a91BBBBBL4;FFe8a701a9484c402982008052a81f00b9be880094e0230091a173009182008052b31f00b9b9880094e8a743a9eaaf41a928e108aae9b340a90b010bca4901098bL4;FF24040094bc7e6092a3000014e88b41f9e84400b4e08f41f", - "901ed7cd322020014f78b41f9ff0600b120440054f48f41f9bf0a00f101f6ff54880640f91f1100f1L8;FFfd7bc2a818fdff17fd7bbea9f30b00f9fd03009101c840f9f30300aa810000b460ce40f9220080521204019461d640f9810000b460da40f9220080520d040194BL8;FF020300d042d83e91e827", - "00a9e8030091090000b029b11491200440a9e82701a9e8230091090000b029e11991e82702a9e34300912c840194fd7b43a9ff030191L8;FF6b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab6205005", - "4BBBL4;FF02000014c8060091e8bf02f9e0e3159137b90094e0bf02f9810300f021883791830300f063c43791e0e31591e2018052e401805270b80094f4bf42f90c000014L4;FB97654900000000004e00000000000000570700000500000097654900000000004e00000000000000580700000500000042", - "654900000000005400000000000000L8;FFe17344f9f14340f9f22b40f9e10b19aded7300f9ed6f40f9e0c7803df9bb48a9fe030daaf56b00f9f503082a08018052edfdff1719df78b3f57740f99f0700b1BL8;FF210840f9f50300aa680240f91f0101eb800b0054680640f9b60a40f92a040091b41640f", - "9490280526a0a00f909692138b60900b4c80240b20811c0da081540d2L8;FFe8bf40f9e0430691e1e30091022180528002803de8ab00f96082803c680e00f91c440094e0430691e10315aa3296fe97e00315aa546cfe9728008092680200f9BBBBL4;FF60fa0035e85341b9e8e300b957ffdfc8d70200b4f", - "f0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebL4;FB530300000900000025e84800000000004d000000000000005b030000090000003031323334353637383961626364656653657373696f6e537472756374757265L8;FFf5431e91e10b17a", - "de3c3803de98b01f98083803cea6f01f9e86301f900300094e8cb43f96083c03ce9d743f91f0500f1e0d7823de9b305f9412e0054e0d7c23dBL8;FF000380520101805217640194400100b4155000a9e10200d021803791131000b91f500039f44f42a9f50b40f9fd7bc3a8c0035fd600018052010380522", - "5640194L8;FF24640094e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00013fd6e0031faaf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6BBBL4;FFfc0b00f9f44f02a9fd030091ff0740d1ff0300f9ff830ad1290440f9090600b4340040f98a0240395f2100f1c105", - "00542a0480d23f8518f10a00f0f281050054L4;FFfb7305a91a0000f040c30291017877783b6c1c53383c7cd39dfeff97f30300aa603400b4c0021091e1ea009122000090bf22007144e040f9027861f8ec010054L8;FFc0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa810100f021", - "fc1791e8030091e00309aae20080525ca4009468c20091810100f021881591BL8;FF0900009029d10d918202009042883991e02700a9e3030091e00308aa32240194fd7b41a9ff830091c0035fd6ffc300d1fd7b02a9fd8300910800009008810d91BL4;FF0a088052e00300912a15003308111d12e88300", - "39e80313aaeaff0039e00741ade00700ad0ffafe97e00740ade0030091600601ad3b240094fd7b44a9f32b40f9L3;ZBBBBBBBBBL4;FFdf2200f129fd43d32af17dd3490109cbc932899a1f0549eb890a00542a050091f30300aaa08300d15f0108eb013280520295899a39030094b9537ea9a1035ff8L4;F", - "Fe003c03de80741a929008092890200f98082803c880e00f9810000b4e00313aa22008052131e0094f44f44a9fd7b43a9ff430191c0035fd60a1e0094c0028052L8;FF08011c9174d600a9780e00f9e00316aa0103805202018052680200f9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8101e011400", - "01805201038052251e0194BBL4;FFfd7bc6a8c0035fd63f0700b1c0e9ff54e0c30c91c886ff974bffff1738008052df0215ebf54702f9f84b02f9ff4f02f929f7ff54e0231291e1031faae20316aaL4;FF211c001203ec7c920000803d5f8002f12028407a41020054e5003bd5a5104092bf1000f1c10100", - "546004803d600001ad63e47a92820003cb420002d11f2003d5L8;FFe0030091a3630091a2008052a80f00f9659e009468620091810100d0219c1591a40100b084200b91a363009182008052a80f00f95c9e0094810100d021301d91BBBL4;FFe2031f2ae0023fd61f0000f1ad000054390300ebe33900541", - "803008b060000141f0400b16139005435de01941f100031e138005439feffb505000014e0430591L4;FB642060c0056020617420c00029696e76616c6964206c656e6774683a2065787065637465642031362062797465732c20666f756e6420c00027696e76616c6964L8;FFe82b04f9e80b40f9e35b04f", - "9e82f04f9e83b40f9e83304f9e84340f9e83704f9e82340f9e83b04f9e83740f9e83f04f9e82743a9e84704f9e87b40f9e94304f9BL8;FFe007409168030291e10316aa00802f91e20314aa030880521b088052e69f0094089080520083c23cf54f09f9e84b09f9f57749f9fb6709f9f46b09f9f47349f9L", - "8;FF550300b4610a40f9680240f9960640f91f0101eb20080054680640f9490380522a040091e00315aa6a0a00f909692138e10313aad1faff97770a40f9680240f9BBBBL4;FF010f010e0b00098a02696bfc438c212e6c00669e8cc101f2a00100548d01c0daad11c0da6d0d4d8bad01098a19150dcb2d3", - "b7c29bf01166bc001577ae0050054L4;ZFL8;FF430200d063d81a91e0030091a2018052e400805209000014e00300f9410200d021a41a91430200d063c01691e0030091a2018052040180526ff2ff97e10340f9BL8;FF820180526f7e0194fd7b42a9ffc30091c0035fd609200091210300b021580091040", - "300d084601291a32300d1e00308aaa2018052a9831ff8507e0194fd7b42a9L8;FF800100b4e11740f9e80f40f91f0101ebc0680054e81340f9090180522a040091ea1700f909692138e16300918c7dff977f0600b180000054e1630091e00315aaBBBL4;FF620a803df44f4ba9f55340f9fd7b49a9ff0303", - "91c0035fd6e083c03ce183c13c88008052e283c23c600600ad620a803d01f17dd3e00314aa020180520dbe0194L4;FB110000000000000014010000050000006964656e746974792d6b65792d706169720000000000000090874900000000001100000000000000fe00000005000000L8;FF7f170094610a", - "42a9e80314aaf39340a9e0031f2a2500805206048052e30313aa8cbe0094e10340f9810000b4e00313aa220080520fbe0094f44f46a9fd7b45a9BL8;FF08fd46d308050091090840f9290b00b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091091440f94801088b090100b42a0140", - "b24a11c0daL8;FF0301009063340591e023009102018052640080527832ff97e10740f9b1ffff17e80f41b2abffff17e80f41b2b9ffff17a0031df8010100902104069103010090BBBBBL4;FFe10317aae20315aa230080522400805287000094770a40f975ffff17e00313aa22008052230080522400805", - "280000094610a40f97cffff17e00313aae10317aaL4;FFf59301f9e86f02f9e8a740f9e97702f9e87302f9e87b40f9e0cf803d080308aafc9302f9e87b02f9e8a74fa9f73b05b9fa4305b9e88302f9e8c740f9e97f02f9L8;FFa1f7ff97e103162a680640f9df0202710801148ba3feff54e90f80123f002", - "071ea0f801229140033c20000542a7c0653090500394a051a320a01003912000014BL8;FF1f1d0071a8010054691880522925c81a49010036490300d029610f91e00301aa225968f8490300d029611091285968f8e10308aa4d8e0114281040b96800c837L8;FF610e40f93f0400b140010054810000b460", - "1240f922008052168e0094611a40f9810000b4601e40f922008052118e0094b40000b4600640f9e10314aa22008052BBBL4;FF240080528ac0ff97e12740f9e00313aab9feff17e0e3009122008052230080522400805282c0ff97e12740f9c0feff17e0e30091220080522300805224008052L4;FB7d6bd", - "b1a0000ce4611267d9401f6bd6d9daa2c3f52493c29d65aa68e00000000000000002d1a9e71c85c02bc0000000000000000000000000000000000000000L8;FFf65704a9f44f05a9fd030091ff0324d1ff0300f9f30308aa090040f93f0900b181010054080080927f220039680200f9ff032491f44f45a9", - "f65744a9f85f43a9BL8;FFe1031caa220080521a4e0194fbe30091a80302d1e10316aa60c30291bc0302d156690094a80358f81f0500b120120054e082c13ce80700f9e8030b91f7430f91L8;FF184e0094e00315aa21008052164e0094601800b4e10314aae20315aaf60300aa1c4e0094571740f957040", - "0b4541340f90c4e0094e00317aa210080520a4e0094BBBBL4;FFfd7b44a9ff830191c0035fd6200080520104805224ee0194ff8301d1fd7b04a9f44f05a9fd030191141840b9f30308aa9f06003140030054018840a948008052L4;FB6b65792061677265656d656e74696e76616c6964207369676e61747", - "57265206465746563746564696e76616c6964207072656b6579206964656e746966696572L8;FFe80300f93ae3ff97e80300aae80300f9210200d021941c91230200d063881591e0030091e2008052a400805221000014e00300f9210200d021941c91230200d0BL8;FF370c40f9882489d24892a4f2e9e2", - "79d32849d2f28824e0f2341117cbff0208eba9000054f5031faae00315aae10314aa1d6e0194f30300aa140300b4f60301aaL8;FFe0431691e1031aaae20318aa30110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aa27110094fad342f9fc0740919c830191BBBL4;F", - "Fa9835c78600a01ad78f20cf876e20ef875620ff868e20ff8690e0279f6feff17790300f0391f36911a038052edfeff1728028052bf231b38790300f039fb2891L4;FF4a050034e9031f2ae8031faaeb0301aa060000144a1d409208010a8b6b010a8b6a0140396a0300346b0500914aff3f364c1d00129f", - "010271c10000546a014079L8;FF08ffdf88c802003568e34039a0024079e103132a1f050071e1f9ff54e2031f2aea06009408fc78d309fc60d3287b68782821084a095d1053295b69782001084aBL8;FF21028052282e0194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff032ed", - "1f30308aaa83340f98a0200d04ac13b91ff0300f9a96b40b9L8;FFe8074091e1e702f908011891290c40f9e163179120013fd6fa034bf95f0f00b12102005468008052f5e742f9e8e3163949008092f4e342f9690200f9a80240f9BBBBBBL4;FFf85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a", - "96ef20094e0230091f7a700a96bf20094e00313aae1031faae20314aa23008052240080527c080094L4;FF1f0500b1e0ef883de1f3883de2f7883de03400544083c33c4183c43c090080924283c53ce01b813d4083c63ce11f813de1efc83de223813de2f7c83de027813dL8;FF29010a8baa5788d24aafb", - "cf2aa9ad2f2ead7faf22a7dca9b4bfd57d30ad092520a13a0726ca50a9b092040390a2440392a151833c90180521a0000140b004039BBL4;FFe00319aae10317aa2200805219960194bc0000b4e00740f9e1031caa2200805214960194b80000b4e0031baae10318aa220080520f96019400e4006fe00303", - "91L4;ZBL8;FF1f0109eb28170054e4000014080c43f81f0900b1010b0054f3031faa64000014e80300aa098d40f83f0500b180160054f30300aae00308aa74feff97e80300aaBBBL4;FF200600543f14007161080054c1a20191a2a302d14cc0ff97a05d00b5f5031faad1ffff173f040071a00600543f08", - "007121070054a88357f81f0500b181000054L4;FBb701000021000000b11c4900000000005500000000000000bf01000021000000b11c4900000000005500000000000000d601000019000000b11c490000000000L8;FFe56f40f9e45f40f9f03340f9eef347a9fadb4aa9e9474ca9f44b40f9e22f40f96d", - "070014f7030caaf6031f2a20844eade0032b91e17700f902328052e0af833dBL8;FF04190094080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308eb681c005406010014e1d342f9e8cb42f91f0101ebe0700054L8;FF1f011ceb80390054e02fc13de133c13d2101009", - "021d83191e237c13de0031791e3833291e4032d91e2008052e0d3823de1d7823de2db823db1f9ff97f3f742f9BBBBL4;FF19f60194400500b4e8a20591e003c03de10315aa085800a9080400f008013b910004803d1f800039602202a9090d40f9e843009120013fd6e80b40f91f0d00b1L4;FB657970726", - "55f6b65795f69647369676e65645f7072655f6b65795f696474696d657374616d7053656e6465724b6579537461746553747275637475726573656eL8;FF080500d1e80300f9e003009138ebff97e10300aae10300f94102009021081d914302009063101591e0030091420180524400805270eaff97e103", - "40f94fffff17BL8;FF6822019101030090219c2791040300f084401491a363009182018052a80f00f961760194684200910103009021e42791040300f084c01491a363009162018052L8;FF8c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c05009102000014ec031faa8b010b8b2801088b49010b8b0", - "801098b090140b22911c0da291540d2290d098bBBBL4;FF000500ad5a1400b4d602178b33008052fc0301911808805229000014020308cb8003088ba18302d11ab60194683340f960030191e10301912200805208050091L4;ZDL8;FFaa031ff82a1b40f928e179d3ea0f00f92a1f40f9081109cbea1300f", - "9362b42a97401088bea0b00f9ab831ff8e90700b46901088bf91b00f9f9031faae90700f9BL8;FFe8c30db9e80340f9fb8706f9e8eb06f9e81740b9f98b06f9e8e30db9480080520801891ae99f40b9f48f06f9f69306f91f01096bf49706f9facf06f9fad706f9L8;FF810000b4e0f743f9220080521936", - "0094e0830f91e1432a91022b80521d360094e04740f9e1830f918b72fe973c008092b7050014c80080d2e10000b021383f91BBBBBL4;FFe80200f9d90100b4940600f13907009118c3019173c2019121fdff54f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd620040090L4", - ";FF2911c0da291540d2290d098b29250191e91a498b29050091b61640f92801088b360200b4c90240b22911c0da291540d2290d098b29250191c91a498b29050091L8;FFf44f42a9f50b40f9fd7bc3a819060114f44f42a9f50b40f9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091080040f9", - "1f0900b1a1000054f44f42a9BL8;FF4a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010a8bL8;FF13693738f3060091a88358f8b38319f87f0208eb01e6ff54a0e301d1678500942dffff17a0230", - "1d1e1031faae2031caa4300805244008052ed9bff97a84f7ca9BBBL4;FF360108abc2140054b600f8b6f5031faae00315aae10316aa23c60194ea0f00b9f52b00b90fc60194e00316aa21008052350080520cc60194c0feffb408018052L4;FB206865616465722073697a6500000000ee61490000000000", - "56000000000000003f000000270000006d697373696e672073656e64657220636861696e00000000L8;FF685201a968a20291000506ade20357ad69520678e9bb41f96d6602a9020104ade00758ad7e1a00f972c604a9000505ade00b56ade1d7c03d638201397b1206b8BL8;FF3f0800716c0100543f040", - "071600700543f0800716106005481620091e003082ae20313aa57fdff97200700b4fa0000143f0c0071000700543f10007121050054L8;FF21c0139138460014ff4301d1fd7b03a9f32300f9fdc300913f040071f30300aae102005428008052090100d029611891ff2300a908048052a06300910800ac72", - "BBBBL4;FFe10314aa20e60194ff0304d1fd7b0aa9fc6f0ba9fa670ca9f85f0da9f6570ea9f44f0fa9fd830291810600b4080d8052e92300913a0080d2367c089bf40302aaL4;FB636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f62", - "797465732d312e31322e312f737263L8;FF680240f9bf0208eb4109005447000014680240f9897e0753bf0208eb3761193261000054e00313aa64e50094680640f99f0248f117693538d50a0091750a00f9BL8;FFf44f10a9fdc30291f30308aa08008092580080d2e82b00f9e8c300911800f0f2e00703a", - "9ff2300f9ff6b00b9a8031cf8210c00b4f40301aaf50300aa19210091L8;FF61ce40f9810000b460d240f9220080521866009461da40f9810000b460de40f9220080521366009461e640f9810000b460ea40f9220080520e66009461f240f9BBBL4;FF4a1d409208010aaa69a200a92800805268020039fd", - "7b45a9f33340f9ffc30191c0035fd6ffc301d1fd7b02a9f91b00f9f85f04a9f65705a9f44f06a9fd830091L4;FF000080d21f000039007d20d463ce7492260000b0c60042f9630040f97f0006eb80000054000080d21f000039007d20d463424079682c46d31fbd007108020054L8;FF1f050071a1020054", - "a101009021402f910204805255a600141f0d0071600100541f11007121020054a10100f021540791820780524da60014a10100f021600591BL8;FF49008052098500a92900805209010039c0035fd636000014fd7bbfa9fd030091330000941f1c0072e0079f1afd7bc1a8c0035fd6ff8301d1fd7b04a9f4", - "4f05a9L8;FFa802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaf60301aae10315aae20314aa63e8ff97750a40f9e10316aaeeffff17281040b9BBBBBBBL4;FF8312803d821e803d811a803d8016803de82700a9480dc0da690dc0dae82701a9880dc0daa90dc0dae82702a9c", - "80dc0dae90dc0dae82703a9e80313aa181a0294L4;FF220080521b1a00940b000014b80000b4e00319aae10318aa22008052151a0094a1835ef8810000b4e00315aa22008052101a0094e003c03d280080529a6200a9L8;FFdeffff17098100513f7d0171a2010054e80f00b9e3430091e00313aaf65701a", - "9e10314aa620200f042040d91f0ffff17e00313aa610200f021982191cfffff17BBL4;FFe20317aae30315aae40314aaeafcff97a8835ef81f0500b160020054a083de3ca8835ff86002803d680a00f907000014e8028052490300b029d1159169a200a9L4;ZFL8;FFa8da77d3a0877aada10301d1e00314", - "aa22008052080d17aaa0073ead080dc0daa88318f8a2837bada2033fad449a009400e4006fbff31838b0c302d1a8277229BBBL4;FFff430191c0035fd63f09007161010054e80b40f90a0180d20a00f0f209dd78924a0140b2090000140a0180d2e9031faa0a00f0f205000014080180d2e9031faaL4;FB2", - "f766172696e742e7273002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f62797465L8;FFe5d300f999d2ff97e99759a9ea0740f9fb0f5ca9f04340f9ef3b40f9f56340f9edeb40f9e0bf40f9f2ab40f9eb1b43a9e77b44a9f113", - "42a9f7eb50a9e84740f9BL8;FF290d098b292501910819498b140500913f0700b1f60f00f9c001005400c30091e31e0094080040b20811c0da081540d2080d088b0825019109fd46d30800098bL8;FFe1c31791e91703f9e9ff02f9290100b0292d0e91e81303f9280100b008110f91e90b03f9290080d2e", - "82303f9c8048052a934c0f2ea2703f90a078052e07f823dBBBBL4;FF28c30391e10315aa180800f9085c00a92804009008412a911f60003916640039602200a9090d40f9e803009120013fd6e80340f91f0d00b1c0fcff54755a40a9L4;FBc02020457863656564656420667574757265206d65737361676", - "5206c696d69743a20c0152c2063757272656e7420697465726174696f6e3a20c0012900175365L8;FFa8031bf8a0873aade08b43ada08b3bade18340ada18338ade08b41ada08b39ad00f4ff97a0077cad880080d2a203da3c0800f0f2a9035bf8081500918082873cBL8;FFe80300f92103009021040891", - "e823009142018052527a0194020300f042a03091e0230091e10300914e7a01944e7a0194fd7b42a9ffc30091c0035fd6008c8152L8;FFf50300aa237a0094167a0094002c815221008052147a0094609601b4e1074091022c8152fb07409121800991f70300aa192c81527b830991167a0094e0074091BBB", - "L4;FF1f0300f1e8079f1a0801290aa81d0036e80240f9f90314aab4db77a9080118cbbf0208eb280b0054d50000b4e80640f9a2f67ed3e10316aa0009188b15ba0194L4;ZBL8;FFe07f803d88f200f8e07fc03d690200f96092803c680e00f9b80000b4e00315aae10318aa2200805212ba0094e02301910", - "db3ff97ff832591f44f45a9f65744a9BL8;FF29050091200108ab62000054fd7bc1a8c0035fd6a00200d000c02b91183a0194a00200d000602991153a0194a00200d000c00991123a0194fd7bbda9f65701a9L8;FFe80302f93bf4ff97680a42f9600642f9e103152a080d40f900013fd6f55b40f9607e02", - "f9618202f9effeff17e85745f9788242f9fadf09a9fb6300f9fa4f45f9BBBBBL4;FF230400b063343791e00700f9c7000014481c00121f090071810b005428008052f40300aae1230091ffa300a940008052e20303aae8ff02a908008092e303042aL4;FF21008052180a0094400300b4880000f008a5399", - "1e90741b20001c03d08e140f80000803d08e000f8c8028052692200a989008052602201a9880000f008293491L8;FF202040a96102009021680c91030d40f9e2028052fd7b43a9ff03019160001fd608200091200440a9a92300d10a0000904a3125916202009042480191a8831ff8BL8;FF02000014480f", - "0091a0e300d1a8831cf8377f0094f80300aa39000014b8035df837000014210300b021d82391230300b063542491a0831cf821000014a0831cf8L8;FF1813009128060054400b00d11f0014ebc2250054a80100b0082101910103c0791307c07908fddf8848020035a80100b008e140391f050071c1eeff5", - "4e003152aBBBL4;FF0c00669e8cc101920cad00a9c0035fd6fd7bbea9f44f01a9fd030091290400d0290140f94ad03bd55301098b694240393f050071e1010054600640a9aa0300b0L4;FBe4f945000000000025194900000000006a00000000000000090100002e00000025194900000000006a00000000", - "000000b00000002e0000000000000000000000L8;FFc14c0054b60000b4e06740f9e10316aa2200805217ca0094e17740f9810000b4e05f40f92200805212ca00941a3700b4e05b40f9e1031aaab3010014f6031faaBL8;FF61f240f9a11100b460f640f989000014610640f9810000b4600a40f92200805", - "2144a0194611240f9810000b4601640f9220080520f4a0194611e40f9810000b4L8;FF7e020094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb880b00546d000014f30300aa1dfdff97e80300aae00313aaBBBBL4;FFfa2743a91f0500f1a0080054e0830091e", - "10317aae2031baae96b01a9fa470094e82b42a9fa2743a91f0500f141010054f90600b4e00f40f9e10319aa22008052L4;FB0800000000000000cc77400000000000e41f40000000000020000000000000000800000000000000c479400000000000e41f4000000000001000000000000000L8;FF4203005", - "4010840a9e50304aa0a018052e40303aaf30300aae023009129f87fd31f0109eb0881899abf0400f1890080524901899a1f0109eb1481899ae30314aaBL8;FF5f0500b180020054092040f92a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab8301005459000014e8031faa0", - "90c40f93f0500b1L8;FFd0feff17eaa759a9e8430f912083c13c2183c23c2283c33c2383c43cfa9741b9e00600adea1700f9000504ad020d05ade90b00f9bc0000b4e0031baae1031caaBBBL4;FFb4035bf8880216cbbf0208ebc8220054150100b4a8835bf8e1031caae20315aa0001168b1baa0194d602", - "158bb6031cf89f0216eb00240054a8835bf809028052L4;FFe70323aae7fc47d3921852aaa01840aac21842aae31843aa52c2009200c0009242c000924f020f8b5200008b4f020f8b72c000924f020f8b01fdff54d3ffff17L8;FF0001803d090900f9ea0b00f9c0050054da4e179b590b40f935f77ed339", - "0400b410aa0094e00315aa210080520eaa0094600600b4480740f9e1031faab5833ea9BL8;FF010840a9f30300aae023009129f87fd31f0109eb0881899a090180521f2100f11481899ae30314aa8d010094e80740f91f0500f120010054e80b40f9742200a9L8;FF1c2a0094c082c53ce8b744f9e007409", - "1e163c23de9a744f900001891e027823de05fc23d01048052e85304f9e89349b9eaab44f9e037823de04fc23de8f308b9BBBBBBL4;FFc0035fd675040051f9230091760800513a008052770240f9e20640f95f0018eb492a0054e10240f9200080398000f8b728040091490400d1110000145f2800f1L4;F", - "Fe98341b919f5003909110039e97b41b91bf9003909150039e97341b909190039e96b41b9091d0039e96741b909210039e95b41b909250039e95341b909290039L8;FF6b011b328d1d00126e9d01516b5d0151bf250071cd1d0012ee979f1a6b818c1abfe903714b69293829050091eb238e1a3f8100f108", - "010b2a01feff541f1d0072BBL4;FFfd7bc5a81b920114e80740f9080116cbff0208ebc81b0054f70100b48002168be10318aae20317aa1a920194d602178be00318aae10317aa22008052f60f00f9L4;ZDL8;FF21602b91840100d084e02a91e3230091e2018052e80700f958920094fd7b41a9ff830091c", - "0035fd6810100d021f82b91c20280524d920014ffc300d1fd7b02a9BBBL4;FFab0240b26a8241f8a00240b2610240b2a8b316b868024238a98316b8e903092aa8031638a8b356b8aa8315f8690100b9a9ab77a9683100b8a88355f8fbc30239L4;FB296483e2513ecce93c95a29a53dfeb393c25a28cffa8", - "8b8c0000c40d1af1e6e32b5021934ee3f2840f0cf92f73b041c24580f2af1be7031f2e0dd78ca69eefe1L8;FFfec700f9eb5700f9e41300f9f4bb00f9f40305aaf5ef00f9f50307aae6e300f9ed7b00f991caff97e83340f9e95740f9f10314aae46f40f9f2d340f9e30318aaBL8;FF9c830191d7fdff17e", - "04316912200805220110094e1d342f9e3fdff17e0431691e1031aaae20318aa1a110094fad342f9e8cb42f908011acb1f0308ebc9000054L8;FF8043c03df7cf42f9fbc742f9f5cb42f9e0e31b9181e200910227805220af803de82304f91b520094f63f42f9f43b42f9c80240f9680000b4e00314aa0001", - "3fd6BBBBL4;FFe80300f008813391a8273da9b7831cf86a0f0036e80340f9edbb40a9e92b40b917088052a0e300d108bd70d3ea2340b9d7160033b5721d124941092a08c10daaL4;FB28a64800000000000800000000000000010000000000000068ba480000000000140000000000000002000000000000", - "0050aa4800000000000400000000000000L8;FF1f0500b1810000549f6608a99f7e09a99f020a3881020291e20313aa0ff4ff97800400b5e1031faae4ffff17880240f91f0500b1e10000549f5e00a99f7e01a9BL8;FF6901084aab135838a9f317384901084aaa235838a90318386901084aab335838a91", - "318384901084aaa435838a92318386901084aab535838a93318384901084aL8;FFe1d342f9e8cb42f91f0101eba0730054e8cf42f949078052f8074091188309910969213828040091f97749f9e8d302f93f0700b1c01d00540023029188260094BBBL4;FF15000014f80300aa1500001428008052691300", - "91a0831b38a8931b38a9031bf803000014e80f41b2a8031bf8a04301d12fa70094a0031bf8610300f021f42691L4;ZBL8;FF1cb2009408048052b95240b9a85e02a9a81a00f913b20094000980522100805211b20094200b00b4f60300aa0db2009400048052210080520bb20094000a00b4BL8;FFff5306", - "f9e95b06f9ff5f06f9e97306f9e87706f923320194f3f742f9e8ef42f9e0dfc13de1e3c13de2e7c13d7f0208ebe02b833de12f833de233833d6190ff54L8;FF1f090071200500ad2209803de2ef01f9c01e00541f0d007141470054e80000f008b140f9680500b4e0d341f9e34740f9e8830f91e45b40f9b", - "b92fe97fcf341f9BBBBBL4;FF8000003568835d38ff02086bc0020054e1e7076f080700d1e90740f9180118ea3b00805261fdff54208d212e00a8302e0800261e48010037292100918003098bL4;FFdb0000b468071b8be00316aa0201805201ed7cd317020094ff2200f101efff54f6031f2a5f000014b9", - "0000b4e00316aae10319aa220080520e020094e12740f9L8;FFe10313aa96010094770a40f9680240f9080117cbbf0208eb6800005455fdffb5f0ffff17e00313aae10317aae20315aa2300805224008052ed170094770a40f9BL8;FFc0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091080040f", - "9e00301aa14cd40a9e803009155820194930100b475ea7bd3130300f073621191e0030091L8;FF7f050071210400548bb243292b0400346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0d00916c0300348c0140b28c11c0da8c1540d28c0d0c8bBBBL4;FFfbab00a9eaa303a9a3350094fc", - "7341f99f0b00b1a1000054e81740f91f2100391f0100f96c000014570080520d000014e0031b2a29c201941f1c007261070054L4;FB6f7220726563697069656e743a20c01b2c2063757272656e742073657373696f6e2062617365206b657920c01d2c206e756d626572206f662070726576696f75L8;FF", - "a203953c4283c43ce10302ad4083c33c4183c83ce84b00f9e00b01ad4083c93c4283c73ce18303ade21b803dd2000014806ec03d8a220791886206910101c03dBL8;FF680240f9080117cbbf0208eb28070054680640f9e10316aae20315aa0001178b1c420194e802158b680a00f9951640f9550300b461", - "0a40f9680240f9941240f9L8;FF20008052e1028052274200940201009042403b91e0031faa38420094fd7bbda9f50b00f9f44f02a9fd03009108684539f30300aa1f110071cd0300541f150071BBBBL4;FF1803008bf9feffb50f0000141f0400b101ba00543ae201941f10003181b90054f9ffff1737e2", - "0194f70300aa1f0400b141fdff54e04305918100805232e20194L4;FBfb0000002e0000001ced4800000000006a000000000000009c0000002e0000004572726f720000001ced4800000000006a00000000000000020100002e000000L8;FF19008092e207c33de0432d91e1431e91e02f823de00bc33de1", - "33823de1efc23de03b823de0f3c23de237823de2f7c23de023823de0fbc23de11f823de1dfc23dBL8;FF18620194000480520101805216620194000100b4e10200f021000191130000f91f600039f30b40f9fd7bc2a8c0035fd6000180520104805226620194fd7bbea9L8;FF080540f91f0115ebe91a005", - "4e00313aa49feff97e80300aae00301aac8fd073708fc60d3681a00b5080840921f1900f1a21a0054017c0353c11a00343f080071BBBL4;FF1fa20194ff0302d1fd7b04a9f72b00f9f65706a9f44f07a9fd0301915f7800f1f30300aae200005428008052690300b0290117914a068052680a00b9b200001", - "4L4;FF1f3000f1680d0054f303022a360d00b4c11a40b9e203014b4200016aa00c0054e003024b24c59c520000020a64eda072030000f063400491390310912100024bL8;FF5fa20094740100b4930100f073221391e0030091a1630091e20313aab50f00f9b506009157a20094940600f121ffff54e0030", - "09154a20094f44f43a9f51340f9BL8;FF800600f909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6fd7bbfa9fd030091290840f9890200b40b2840a92c0040f96b010a8b7f010ceb61020054BL4;FF1f6d00f148040054c90000b029c11c918a0000102b6968384a090b8b40011fd6010440f94", - "10300b4000840f922008052f44f41a9fd7bc2a80e22001413d041a9L3;ZBBBBBBBBBBL4;FFf10331aaf20320aa117971f8717a32f8eef8ffb50b000014600240fd00a8200e0000669e0000c0da0010c0da00fc43d3e8ffff17e003042a0d1f029417000014L4;FFeeffff17ff0301d1fd7b02a9f44f03a9f", - "d830091480001ab42030054010840a9e50304aa0a018052e40303aaf30300aae023009129f87fd31f0109eb0881899aL8;FF28031aab42060054490316ab620600540a031acb092800a9e91242d3f70300aa082401a928008052081000f9d60215eb23040054280315eb1803158be833889aBBL4;FF1c9f0", - "194f70f40f9e80740f9ff0208eb6000005404000014f7031faae0230091a89e019408038052e90b40f9e00bc03de826089be91b40f9ea0600910001803dL4;FF040000140bf7ff9741008052010000b9e00313aaf30b40f9fd7bc2a8c0035fd6c0035fd6fd7bbca9bf2c40f2fd03009181030054f35301a9", - "f40300aae0f77fb2L8;FF810100d021101591a40100b084a00991e0030091a363009142008052b30f00f9619f009468020291810100d021181591a40100b084200a91a363009162018052BBBL4;FF40df0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0", - "000f1ad000054390300ebe35800541803008b06000014L4;FB080400001700000045024900000000004e000000000000001a0400000900000045024900000000004e0000000000000064020000130000004502490000000000L8;FF0239805223df0094e87b45f9140340f99f0208ebe8ff00f9e8979f1a0", - "8219f5a081d0072a0c700541f05007161ca005488008052e16345f9740a00f968220039BL8;FFe00b01ad4e5f019400e4006f9f1a00f9808200ad8002803d08db77d3800640ad80020191e103009122008052080d17aae00700ad080dc0da881e00f9820241adL8;FF1f0101eb40040054680640f92a0400", - "91e00314aa490280526a0a00f90969213833130094e10313aad4fbff97803240b980010034610a40f9680240f91f0101ebBBBBL4;FFa0010054ae01c0dace11c0da8e0d4e8bce01098acefd0b9b4e010e8bcf015ab8bf020f6b20020054ae0500d1cd010deaa1feff54428c202e42a8302e4d00261eL4;ZF", - "L8;FF6d19001221e00daa8bf5ff363f2500f100f6ff544b2580394a290091292900d10a2500a96bf5ffb77f05007128f5ff5421fc0baae0031faafd7b43a9ff030191BL8;FF000040f9627f0114000040f9327f0114000040f9667f0114ff8301d1fd7b04a9f44f05a9fd030191f30308aae8430091f4030", - "0aa62570094e84340391f050071L8;FFc0680054e81340f92a0400918022029149018052ea1700f909692138bde2ff97e16300918e7eff97805e40f9800100b4e11740f9e80f40f91f0101eb20850054BBBL4;FF890119aba2040054340108ab42130054b400f8b6f5031faae00315aae10314aa21bf0194", - "140400b40ebf0194e00314aa21008052350080520bbf0194e0feffb4L4;FB807e4900000000004b000000000000007f0b00000e0000004572726f72576869737065725072654b657953656e6465724b6579506c61696e7465787400000000L8;FFe283c13c6402c33c690244f8e003853c6002c03de83300", - "f9680a40f9e083833cc10201ade083c03ce82700f9e383c43cc00a00ade083c53ce483863ce93f00f9BL8;FF532b40f9173f0194e00318aa21008052153f0194200500b4e10313aae20318aaf60300aa1b3f0194b3835df8acffff17e90313aaf54f43a9f75b42a9fb0f40b9L8;FF80f6ffb4a9ffff17e00", - "3082ae10314aae20313aa16feff97601a00b5a0f5ffb4a2ffff17898244f83f0500b1810000549fde04a99f2e00f99f6200b91f0900f1BBBBBL4;FF680640f9090180522a040091e00316aa6a0a00f909692138e10313aa81faff97550300b4610a40f9680240f9962a40f91f0101eb802c0054680640f94", - "9028052L4;FFe0431391e2dfc53de037813de13b813de23f813df3ecff97f62b40f93f020014e8af00f9e87342f9f97742f9e9df44b9f67b42f9fb0308aa18fd78d328ff60d3L8;FFfd7b04a9f32b00f9fd030191f30301aae10300aae0230091e2031f2a2dfcff97e90740f9e82740b9aa058052e123009", - "1e00313aa82048052e90700f9e92f4229BL8;FF297d3d91ca028052e8a300399f0a00b1e92b03a900020054680240f91f0900b1a0000054f60300aae00313aa5b77ff97e00316aaa08640ad740200a9e0031faaL8;FF08fddf8888020035a80100d008e140391f05007181040054e2031f2aebe7ff9709fc", - "78d38801009008e13b910afc60d3097969784921094a2a5d105308596a78BBBL4;FFe00316aa1c692138e1e30091e92700f984baff97f82740f9e81f40f9080118cbdf0208eb08230054e82340f9e10317aae20316aa0001188b16cf01940803168bL4;FB97900b70265932f53743a28ce620feb611bd363", - "f000081ebda9d4950a269a4d10129996f60636a2a0576d286d9af5166a96b08796ed2d1356d5b4b050ad6260cL8;FFe2030baaf6034ba9e50315aaef7b18a9f9fb42a9f4bb00f9ec2b40f9f0f700f9f42f44a9f2cf00f9f2031baafb0304aaeaab00f9e40300aaf00312aaea6341a9BL8;FFe8fb0039e103", - "19aae8b340f9e97304f8e9a34539ec7b0079ebf303f8e8f304f8e95f01399259ff97e103002ae8430691e00315aab69fff97e8cb40f98082c53cL8;FF220080521b4f0094f56340f9e8031691e00315aaf24e0094a8624039f5c342f9f7c742f9e8631639880280d22007c03d0800f0f21b2100d14003803", - "de8630191BBBBL4;FF7f0a00b10302005428008052e90300f029a10b91a80200b908048052f70340f9a9a200a9df0600f1eaf9ff54d2ffff1739008052e003192a28ef01947f0a00b1L4;FB29203e203130207c7c2062797465735b62797465732e6c656e2829202d20315d203c203078383000259448000", - "000000054000000000000004c00000005000000L8;FF880700b5200840921f1800f1c2070054217c0353e10700343f0800712c0200543f040071e00300543f080071e1020054880243f81f0500b1810000549f5e03a9BL8;FF42a80c91e3030091e00314aae10313aae82700a9346f0194f44f43a9f51340", - "f9fd7b41a9ff030191c0035fd6e9f99ed208fc43d3040300b084002591696abcf2L8;FF84c02f9142c035918107805248432c39286f0094e0074091e10318aae20319aa00002f912a120094f8eb4df934f5ff1748236639e2074091400100d000a02991BBBL4;FFfa675ba9fc6f5aa9fd7b59a9ffc30791c", - "0035fd6e4031faaa78358b899324fb8bc8357f8be035838ba035df8a70317b8074c41b999b20db8bb677ca9bc0316f8L4;FF810100b4e9074091ea030091eb074091ec0301aa0d1440382d0100392d014039adfeff348c0500f14d15003841ffff54f80308aae80300911f692138e0030091L8;FFb3031df", - "85969e978e86f03a92a3b0e1329370d133c2709133a230813361f0713351b0613a92b3d292a330c13292f0b13a92b3c29292b0a13a9c31db8e80100d0BL8;FFe0a745f9220080521a2f0194f37740f9e8c31791e00313aaf12e019468624039f5f345b9e8231839e8c31791b47e08530041c03ce183c13de", - "8c31291e063813dL8;FF29312291a8a739a9a84302d1482f0094684e41b9090000d029512b91f72704a9e98300916a0000904ab10d91a88318b8080000d008212c910b0000d06b612191BBBBBBL4;FF220080521b170294613240f9810000b4603640f92200805216170294613e40f9c10000b4604240f92", - "2008052f30b40f9fd7bc2a80f170214f30b40f9fd7bc2a8L4;FFe8830991eabf1339e037c13de13bc13de0d7853de1db853d12edfe97e0d7c53de1dbc53de007409100401d91e00714ad3c170094e083099174eefe97f90300aaL8;FFf70b40f9f65742a9fd7bc4a8c0035fd6950640f97504f8b7750200b", - "4960240f910170194e00315aa21008052370080520d170194800300b4e10316aae20315aaBBL4;FF2904c0392a1d00124a6119534801280b08010251e900f8374a00805208a800a91f0000f9fd7b44a9ff430191c0035fd61f114071c30f00542908c0392a1d0012L4;ZBL8;FFff030191c0035fd6ffc300", - "d1fd7b01a9f31300f9fd430091e90301aaf30300aa8101009021f41a91e8030091e00309aa020280525b97009468a2009181010090BBBL4;FFf85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6200080520104805222d70194ff4301d1fd7b02a9f51b00f9f44f04a9fd830091f40300aa35008052e00300", - "91L4;FB4b657973556e73616d706c6564506f6c796e6f6d69616c456e636f646572696478707473706f6c797341757468656e74696361746f726d61635f6b65794e6f48L8;FFf57b40f9fc4340f9ee0311aae96340f9e56f40f9f1031baafb0316aaf74f40f9f65b40f96c08001428a00791e07f00f9e003", - "09910001c03d21000891ec0b18a9BL8;FFf67749f9e8d302f9df0600b1a033005480220291d31e0094080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308eb48320054L8;FF420280522301009063f43991e85306f908000014e05306f9e08332912101009021083b914", - "20280522301009063503b9144018052704bff97e15346f906000014BBBBL4;FF33f70194ffc302d1fd7b06a9f93b00f9f85f08a9f65709a9f44f0aa9fd83019109a04039f30300aaf40308aaa90100343f0d0071e1070054602241a9090d40f9L4;FB7b00000000000000340000002e0000008c934800000", - "000004800000000000000c800000016000000617474656d707420746f206a6f696e20696e746f20636f6cL8;FF211818914302009063101591e0030091420180524400805277ebff97e00340f967ffff17c80080d20800f0f20809009159ffff17c90080d2e823003948008052BL8;FF84c00b91e0030091", - "a363009162018052b30f00f964770194688201910103009021382491040300f084400c91a3630091e2008052a80f00f95b77019468a20191L8;FF4281813cead342f9e99f06f9e24bc33de347c33de14fc33dea8306f9e03f833de18b833de143c33da7ffff17e8f342f9e06fc13de0074091e173c13df64", - "349f9BBBL4;FFa80214cb7f0208eb29eaff54e0a30091e10314aae20313aa230080522400805283a9ff97f41f40f9f51740f948ffff1720008052e10313aa1bb70194800300d0L4;ZDL8;FFe80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a91fb70094f", - "d7bbda9f50b00f9f44f02a9fd030091a87cc39bBL8;FF2100805218370194c01d01b4e10313aae20316aafa0300aa1e370194fcbf40f97c1500b4f3bb40f90e370194e0031caa210080520c370194a01c01b4e10313aaL8;FF18370094e00315aa010180521637009400ed00b4080d8052f90300aaf5031f", - "aaf67e089bf40317aae10318aadf0215eb60020054e0830f91f70600d138a00191BBBBBL4;FFe8430091f50300aae0430091028100912100805223008052aaebff97e00315aabbffff17000140fd00a8200e0b00669e6b01c0da6b11c0da6bfd43d30c696b38L4;FF000180520102805232070094fd7bbea", - "9f44f01a9fd030091f30301aaf40300aa1007009400038052010180520e070094000100b4810000f021800091144c00a9L8;FF0800f0f2081500d1deffff17e90b41b2e92300a9dcffff17280180d20800f0f2081100d1d7ffff173f00156b81f7ff54680240f9e0031faa090540f90a0140f9BL8;FF957e", - "02290001c03d01b1c03c0000803d01b0803c1100001412870194a002805221008052b50280520f870194e01800b4280300b0080d1091954200390001c03dL8;FF01ed7cd3020180521a870094ff030991f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6f80f40f908008092e82700f", - "9e83300f9e83f00f9BBBL4;FF682700a9a81301d1490100b029c10991800300f000642491682701a9e8d30191c90000b029212c91e1030691a30301d1682702a9a803009008b1149129048052L4;FB73657373696f6e206372656174656420617420c0012900217374616c6520756e61636b6e6f776c6564", - "6765642073657373696f6e20666f7220c00d2028637265L8;FFe0af42f9220080521ac70094fc031f2adf0600b141adff547cfdff17e16740f9810000b4e00315aa2200805211c70094bad4ffb4e05f40f9e1031aaa22008052BL8;FF240600946aa240a9e00740f9690240f9e10313aa546928380805009", - "11f0048f1680a00f9e3fdff540b7c0e533f0108eb7361193220010054536928380cfc5cd3L8;FF09fd46d30800098b080500911f0109eb69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff54000100b000801c911147009400010090BBBBL4;FFe02b40f9ff8200f181090054e", - "81f40f9f95f40b91f4100f1a1090054ed2f44a90af040f8137040f8166c4039177041b8ea1f00f9680140b9693140b8ac0140b9L4;FB636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632fL8;F", - "Fa2008052a40080527bdbff97e16341f906000014e80f41b2e86301f9e0030b9133dcff97e10300aae16301f92102009021c820912302009063602191e0030b91BL8;FFa3630091e2018052a80f00f96667019468a20191e102009021082a91e40200f084202f91a363009142018052a80f00f95d6701946", - "8c20191e102009021302a91L8;FF684a40f9a80000b4604e40f901f57ed34200805217670094685640f9a80000b4605a40f901f57ed34200805211670094686240f9a80000b4606640f901f57ed3BBBL4;FF1f000014c80a0091a0831df805000014e90b41b2a9233da903000014c80e0091a8031df8a0c3", - "00d1319c0094f45745a9e11f40f9e10000b4e82340f9f70300aaL4;FF340000b0810210917f0204eb207860f880fcff54620240f98102109103290091440400f9620240f9820000f9227863f87f0202eb200500547f7e00a97f0200ebL8;FF290000132d0c03132e10041330180613311c071322280a1323", - "2c0b13444111536b050a0a8c090a0a2f1405133220081325300c131f05003129010a0aad0d0a0aBL8;FFea2f04a92a0080d2f50308aaea0bc0f2e97f03a9f70302aae92b06a9f60303aa20270194e30316aae00314aae20317aae80315aa7f8000f1010600540a0c40f9L8;FF2100805218270094000c00b", - "4e10314aae20316aaf70300aa1e270094591740f9b7831ff8190400b4541340f90d270094e00319aa210080520b270094a00900b4BBBBBBBL4;FF6b651b9b0c210039210140ad610100ad210142ad220d41ad610102ad620d01ad284940f9228143ad2119c03d684900f9e80600d11701178a628103ad611", - "9803dL4;FFe10317aa22008052f80308aa191b0094f7031caad5ffff17f7031caaf80308aad2ffff17a00000f000202c91281b0094ff8301d1fd7b03a9f65704a9f44f05a9L8;FF41040054680a40f96002c03d61820091000080927f0a00f9a80a00f928008052a002803d7f2200a97d1b01941f0400f18", - "1010054688200911ffddfc8610240f9BBL4;FF000540394a01114a0ba11f382b0540390cb11f380c02124a0ed11f380e0d4039101140396b01004a0af11f382a0d4039321140390dc15f3822c15f384a010e4aL4;ZFL8;FF689b0094b401009094421891810100b021ac1591e0230091a32300d182008052", - "e40314aab3831ff85f9b009468e20091810100b021bc1591a32300d182008052BBBL4;FFe8430591c0420091645f009415db0194000880522100805213db0194000a00b4600640ad01088052e8f349f9e9b340f922008052b45200b9000400ad600a41adL4;FB4c656e6774684578636565646564556e657", - "8706563746564456e6447726f7570546167496e76616c6964537472696e6730534400000000001800000000000000L8;FFe81b04f9e80f40f9ee3b04f9e81f04f9e82b40f9eb4704f9e82704f9e83740f9f44f04f9e83f04f9e81f40f9f57f04f9e84304f9e87b40f9ec8704f9e84b04f9BL8;FFf64349f9", - "00800991e85b09f9e83b49f9e277c13de0a3843de067c13de81700f9e83f49f9e1a7843de16bc13de80700f9e807409108810191e2ab843de09b843dL8;FFf30c0094e08bc13de18fc13d73a20191e293c13de387c13de10316aae08601ade07fc13de183c13de82b43f9e216803de00600ade83200f9e30", - "a803d75fdffb5BBBBL4;FFd6c2019181ffff543f0318ebe2000054f60315aae00316aa0be4ff97f70600f1d6c2019181ffff54b40300b488e279d3e00315aa02018052011114cb0dfb0194L4;FB74696e6720696e697469616c204232412073746174653a20c00076656e646f722f6c69627369676e616c2", - "f727573742f70726f746f636f6c2f7372632f73746fL8;FFa08b3cade18341ada18339ade28342ada2833aade18340ada18338ad01f5ff97a0877bade80b41b277010014e1430091e20313aaf70b00f9f74b00f9f76700f9BL8;FF8bcdcbca8c81cc93a9c1c9caad010b8b2c010c8babbdcbca89adc9caad", - "81cd930b2401a989010aca093400a9490008cb2af17d92290940921f010aeb42f9ff54L8;FF28feff17e0630091220080522300805224008052f690ff97e11740f92ffeff17e0630091e10317aae20315aa2300805224008052ee90ff97f71740f9e80f40f9BBBL4;FFa0033aade84300f964a3ff97a003d", - "43ce83340f9b5431638f70b00f90001803de92740f9bfe337a9bf8318f8993a00b4e83740f9f32340f9f6031faaf55b00b9L4;ZBL8;FFf8031faae00318aae10317aa26bb0094e8030a91e12301910232805200a101911cbb0094800642ade1030a91883240f9e00313aa023f8052e00716ad800640adBL8", - ";FF080d088b0825019108fd46d316050091770a40f9570900b4740640f9f8031faaf90317aae00314aaeafcff97080040b20811c0da081540d2080d088b08250191L8;FFa80080525d01001460c643f961ca43f9290c40f9e8830f91e1031baafb6300f920013fd6e8f341f91f0d00b1e1070054e8008052", - "51010014f9430891ba0000b4BBBBBL4;FF610a40f946ffff17e00313aae10316aae20315aa230080522400805284fdff97760a40f9680240f9080116cbbf0208eb09e9ff54e00313aae10316aae20315aaL4;FFa80200f9f44f45a9f52340f9fd7b43a9ff830191c0035fd6ff8301d1fd7b03a9f65704a9f", - "44f05a9fdc30091f30302aaf40301aaf50300aa36008052e0630091L8;FFe00313aa62048052580b0194600000362000805223000014950240f9a80a40f9e80200b4b60640f9f80300911900009039e32491fa4300917402009094220191BL8;FFa8035ef809dd78920c000014f65343a9df0600b140feff", - "54f76745a9e15744a9a0ffff17e9031faa180700d103000014e9031faa18070091081d4092390108aaL8;FF090900f9f65301f9d6060091df8e00f1c0020054138b00948008805241008052118b0094a04800b4a00641adca0600d1e94b41f9a84240b9000401ada10240adBBBL4;FF4219803d485100f9e", - "81b40b9400500ad620141ad48551d29e82740b9405d08a9420101ad2001c03d48c103394025803dab000054e01b40f9e10313aa22008052L4;FB0800000000000000fce7450000000000556e6368756e6b6564496e76616c69644c656e67746856314d7367696e6465780000000000000000080000000000", - "0000L8;FFf4031aaaa8f200f8e8a35d39f7430d91e003c23de10b19ade6030991e8af00b9e84f44f9e107c23de9a301f9e94744f9e20fc23de85300f9e85f44f9e4f7c13dBL8;FF01f57ed3420080521a4b0194686e40f9a80000b4607240f901f57ed342008052144b0194687a40f9a80000b4607e40f90", - "1f57ed3420080520e4b0194688640f9L8;FFf30300aae00308aa69040094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb492d0054080c47f8BBBBL4;FFe05bc03de15fc03de263c03de367c03de39b803de297803de193803de08f803de06", - "bc03de16fc03de273c03de377c03de3ab803de2a7803de1a3803de09f803dL4;FBd07d42000000000054727946726f6d496e744572726f72004f9d48000000000075000000000000005c0000001c000000496e76616c69644c656e677468000000L8;FFe20315aa2300805224008052f8000094770a40f9b", - "0ffff17e00313aa220080522300805224008052f1000094610a40f9b7ffff17e00313aae10316aae20315aaBL8;FFe90500b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091091440f94801088b090100b42a0140b24a11c0da4a1540d24a0d0a8b4a250191L8;FFe9ab0779e8a759", - "a9ecb300f9eda305392b1f0036ebd343b9e96306394921c993e8cb00f9ecab4779e31b40f9eb3b00b9a00302d1e2e300918b1245f8e8fb0039BBBL4;FF770500b4e0430191e10316aae20315aa68ffff97f52b40f9bf0600b120050054883240f9f4e345a91f0308eb0109005436008052580100b4f90314", - "aa28174038L4;FFa2a300d1f7fcff9728008052e80300f91c000014e003152a860d0094a083dd3ca8835ef8e91b40f9ff0300f9e083803ce80f00f9c90200b517000014e003152aL8;FFb6835ef8b3031ff83a008052db020079d4060079dfffff175f0700f161000054e8031faa0c000014e8031faae903", - "1aaa2afd41d34b01088b29010acb6cf57ed3BL8;FFe103129120013fd6fbc342f97f0f00b1410a0054a8008052a8ffff17404fc03da80359f814000014e8e322910081cb3ce8c344f94003803de8f304f943000014L8;FFe00740918100805200001891ff0316b9e84300b94b2a0094e80356b9e00740918", - "100805200001891ff0316b9e83f00b9442a0094e80356b9e007409181008052BBBBBBL4;FFc0035fd6ffc301d1fd7b03a9f72300f9f65705a9f44f06a9fdc30091081c00121f09007181010054550040f9f30302aaa20640f9e20100b4f40301aaa10240f9L4;FFc0010014f8db40f936008052e00b4091e", - "82303b9e8830c918900805200c00e91e143139162008052e86b02f9e96f02f9f97302f9fb7702f9f67b02f9fa7f02f9L8;FF0b0900390b0e8052090d0039290840394b0d00332a0440390c1100390c1080522c1500330b190039293040b80a1d00392a7040782b2440390c210039099100b8BBL4;FF28030", - "0f008211d91e83700f908008012e87300b9398cff97b80000b4e00319aae10318aa2200805212930194a8a300d1a96301d1e1630191e82f00f968000090L4;ZDL8;FF080c48f8740200f91f0500b1400000540f8eff97755e40f9744200f9bf0600b180020054745a4ca9960100b49722009104000014d60", - "600f1f7620091e0000054BBBL4;FF63401891e0830091e2028052040180521cffff17890080d248008052e0a300390900f0f2e8a7003929090091e91300f90affff17890080d248008052e0a30039L4;FBc716bfc7d674adae2be49ebf5e8bd71c0000efa3893d5195177804010a82858c137a8600c502a9", - "ff2ee5a4198354eacc567290a06a1d2a78c564e32e78d1bfc7L8;FFe0030991e9f341f9eb1342f9a1e20791e8e700f9e8ff41f9022f8052e06fc13df6ef41f9fb4700f9e82b17a9e80342f9ea0b42f9f73342f9f86742f9fa6b42f9BL8;FF00403d91e302009063401c91c40200f084e03d9142800991810", - "48052480300392453019448236639e2074091c00200f000643c91e302009063401c91c40200f0L8;FFf36b41f9e94305b9e04b813de14f813d680000b4e00313aa00013fd6810640f9810000b4820a40f9e00313aa115300949f0b00b121020054e0a34fa942030291BBBBL4;FF08010aaa69a200a908008", - "092680200f9e1f0ffb42200805216f3019484ffff17a1835df8e0031caa1ff30194ff4302d1fd7b07a9f34300f9fdc301910a6840b9L4;FB9a964800000000003300000000000000d9010000050000009a964800000000003300000000000000dd010000050000009a964800000000003300000000000000", - "L8;FF9f02073881420191e003082ae20313aa12f5ff97c00f00b540fcffb4d7ffff17890240f93f0500b1810000549f5e00a99f6201a99f2600f91f0900f1a10f0054BL8;FFa2833bad6b01084aaac31638aaf356382901084aabd31638ab035738a9e31638a91357384a01084a6b01084aaaf31638aa235", - "7382901084aab031738ab335738L8;FFe80740910881099100210491d70a0094e5fcff17e1d342f9e8cb42f91f0101eb008e0054e8cf42f949058052f4074091948209910969213828040091f67749f9BBBL4;FF41550054b88358f81f0700b1a0110054a14301d1a26301d1bf031bb84a9dff97a01600b5", - "b9035bb81f0700f10b010054a80359f8fc0300aae10318aa22008052L4;ZBL8;FF610140ad6c2140b94c2100b9410100ad3f0102eb28fdff54c93200f91f0009ebe20309aae3fcff54a2ffff17a30100f063a035912db30094a30100f063c03691BL8;FFe08332910800f0f2ffa73239e85306f937280094", - "e10300aae15306f9e0833291a102009021c00a9102028052a302009063a016919e000014e05306f9e0833291L8;FF02028052e30000b0634c0b91a40280524c000014e80f41b2e0432a91e84b05f93328ff97e10300aa3e000014c80080d2e0632a39e0432a910800f0f2ff672a39BBBBBL4;FF090a00371", - "50040f9f40308aaf30300aaa80e40f9480700b4770640f9a00642a9e20317aac1fdff9708fc79d3e1e7076fe9031faab96240a9080d010ef6d640a9L4;FF890000b029813691e9ab01f9890000b0290d3591e9bf01f9e9018052e9c301f9890000b0298d3591e9d301f9890000b029e93591e9e701f94903", - "8052e9eb01f9L8;FF8806148be00313aa01f17dd302018052f44f42a9f65741a9fd7bc3a815030114f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091BL8;FF240300d084602091e323009182008052e80700f959830194fd7b41a9ff830091c0035fd6010300f0217029918", - "20080524e830114080040f9e00301aa090140f9L8;FF810000b4602a40f92200805219830094b40000b4600640f9e10314aa2200805214830094610e40f9810000b4601240f9220080520f830094763640f915008092BBBL4;FF3f0500b180040054fd7bbca9f70b00f9f65702a9f44f03a9fd030091c304", - "0036098840f93f0500b160040054f603022a029840f9f303032af40300aaa4030090L4;FB34684900000000006a00000000000000dc0000002e00000034684900000000006a00000000000000750000002e00000034684900000000006a00000000000000L8;FFeaef43f9f80316aae10b19ade127c23de6", - "030991e0d7803de023c23d01048152e8b743f9ea7202f80a788052e22fc23de00717ade02bc23de86b00f9e8ff5e39BL8;FF1f0101eb00030054680640f9090180522a0400916a0a00f909692138e10313aac7fbff97818a40a940008052e30313aa19faff97810a42a960008052e30313aaL8;FF2207c03", - "deab341b91f010071f8c741b9801f803de9079f1a818308ad0801094be99741b962c3883ce8e300b9e8cf40f9ead700b9e9bb00b9684308f8731aff97BBBBL4;FFf9ffff173fe30194f70300aa1f0400b141fdff54e0430591810080523ae3019460d90035e85341b9e8c300b957ffdfc8d70200b4ff0600", - "b100030054f8430591L4;FB656e63727970743c6e6f6e653e6d6573736167655f646563727970745f7369676e616c6661696c656420746f206465636f64652070726576696f757320736573L8;FFe8e33b91018300910270805200810091fc031a2afae33b911ee30094a003dd3ca8035ef8e0431e91e1e3", - "3b91e2c30d91f77f07f94083803cf8431e91e88b07f9BL8;FFf44f03a9fd830091e90301aaf30300aac10200f021a01e91e8230091e00309aa020280525f630194f40200b094422391c10200f021283091e0230091a32300d1L8;FF6b611932000100544b692838080500911f0048f1280800f9620200540", - "0fc4ed3af000014e00700f9e00301aaf30301aae10309aa22008052f4030b2a24060094BBBL4;FF540000144801805229008052e103019108000039e00316aae92b00f9818eff97f82b40f9f92340f9280318cbdf0208ebe80b0054160100b4e82740f9e10317aaL4;FF65eda072040000f0027c02538440", - "04914204402a43c302914208422a4210422a4220422a4240422a46040011c200220a427c051b427c1b5399486238e20303aaL8;FF82008052e80700f95ca30094fd7b41a9ff830091c0035fd6810100f021fc15918200805251a30014080040f9e00301aa090140f93f0500b1e0010054ff8300d1BL8;FF0", - "a2440a9f40300aa00600091f50301aaf30308aa4a0140f9e10309aa40013fd68a0a40f94a0115eb230400548b0640f9750a00f96b01158b8baa00a9f44f45a9BL4;FFe00313aa01ed7cd302018052f44f42a9f65741a9fd7bc3a816230014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44", - "f02a9fd03009114d440a9L3;ZBBBBBBBBBL4;FFe90c80d2c826089b08e97b92c902088b212500b140fdff54a00208cb02018052141d0294e6ffff17e003032a181d0294f40300aae3ffff17ff8302d1fd7b04a9L4;FFfd7b06a9fb3b00f9fa6708a9f85f09a9f6570aa9f44f0ba9fd83019109604039890e", - "0037f40308aa092040a9f30300aae0c30091028d40a921a1009190120094L8;FFe10200547ffedfc8810640f98104f8b7800240f922008052161d0194e00314aa0103805202018052f44f42a9fd7b41a9ffc300910f1d0114280000cb010102abBBL4;FF539d019400e4006ffa430391e1e3129140430091", - "027b8052ff8b08b9a0f2803d1c9d019408028052ff130df8e8430339ff6f00f9930200b40a9d0194e00313aaL4;FF73420091987e4093630640f9e9ffff17007840b901000014c80780d2007c4093427c4093010000d44df5ff17000400b4fd7bbea9fd030091f30b00f9f30300aaL8;FFc0035fd6090080", - "921f0900b9090100f9fd7b42a9ffc30091c0035fd6e93300914a0100904ae10e91800100d000740c91e1430091e92b01a93d9d0094fd7b42a9BBBL4;FF1f0400b1611a00543ddd01941f100031e119005439feffb505000014e04305918100805238dd019420190035f8074091e82b41b9e007409118430f", - "9100400f91L4;FB44524400000000006120446973706c617920696d706c656d656e746174696f6e2072657475726e656420616e206572726f7220756e65787065637465646c7900L8;FFed074ba9e48f00f9e4ab40a9f61f14a9e7030baae8f347a9f60307aaf19700f9f10300aaf80316aae3ef00f9e303", - "10aaf0030daafbdf00f9fb0308aa8d018052BL8;FFe01bc43de11fc43de223c43de09b843de19f843de2a3843d125d01940078805221008052105d0194207201b4e10319aa02788052fb0300aa165d0194e09bc43dL8;FF770a40f9680240f9080117cbbf0208eba9f4ff54e00313aae10317aae20315aa2", - "b000094770a40f99fffff17e00313aa2200805226000094610a40f9a8ffff17BBBBL4;FF24fd0194f5bf40f9e0430091c1220091022d80521ffd0194958600f8e1430091e00314aa022d80521afd01942800805268420039ff031191f44f46a9f65745a9L4;ZFL8;FF081c00121f090071a1010054e00302", - "aaf30302aaf40301aa00fcff9720020037750240f9a80640f9160101eba2020054e80f41b2e81300f907000014c90080d2BL8;FFf30b40f9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091010040f9f30300aa3f0400f18b000054600640f922008052107d0194610e40f914008092740200f9L8;FF977", - "cff97808240f9800100b4e11740f9e80f40f91f0101eb003b0054e81340f9090180522a040091ea1700f909692138e16300918a7cff97e00314aa080c4df8BBBL4;FF0010c33c090080920110c43c695600a9098400910a4401916082823c6182833c692a01a9681200f929000014990600f9480b0091050", - "00014800600f9e80b41b2L4;FB616c666f726d65642066696c65000000a28749000000000054000000000000005900000005000000a28749000000000054000000000000005f00000005000000L8;FF1300001488050051f5031f2af60313aa1f090071030b00549f010471200500540b0000149f010871c", - "0040054e8df9f529f01086b60040054c8ff9f52f5031f2aBL8;FF5e3d0194fd7b41a9ff830091c0035fd6fd7bbfa9fd030091082440f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f9L8;FF1f1100710c2e00541f0900710d3200541f0d0071e13c0054607e42", - "f9618242f94e0300140043c83c0143c93ce0630391e81744b9f6f343b9a1e20091fcf741f9BBBBBL4;FF680640f9490480522a040091e00315aa6a0a00f909692138e10313aa81f8ff97770a40f9680240f9080117cbbf0208eb28330054680640f9e10316aae20315aaL4;FF1b1e48b3298117aaca1e40b", - "3e0431391ec6b02f908e11caae96f02f9fb7302f908010aaaeb7b02f9e87702f9ed7f02f9eceaff97f85b5ca908008092880200f9L8;FF6202009042803b91e00308aaa10080521d0d0194ffc301d1fd7b05a9f33300f9fd430191082440a9f30301aae0630091e1030091e2031f2a080dc0da290dc0daBL", - "8;FFb402148bff0a00f1e80316aaf40f00f9a0010054e90740f9215442a9290114cbbf0209eb88050054b50000b46002148be20315aa178d0194e80316aa8902158bL8;FF008540a917ddff97f47f40f9163c0853f303002a35008052e87740f99f0208eb61000054e0a30391648c0094e87b40f91669343", - "896060091e87740f9f67f00f9BBBL4;FFc0035fd61f090071c1000054080180d289de78920800f0f2080140b206000014080180d2f4031faae9031faa0800f0f208017fb28a1e409229010aaa68a600a9L4;FB54000000000000007900000005000000361a49000000000054000000000000007f00000005", - "000000361a49000000000054000000000000008d00000014000000L8;FF1ccd00945c7900b4e05f40f9c5030014765f40f9df0600b1804b005468d340b91f010971204b00543f0500b160000054e0031baa6acaff975c00805259030014BL8;FF2083c13ce8c700f9e8a759a98082833ce8a716a978caff3", - "4e11740f921caffb4e00b40f922008052124d01944dfeff17fb0300aaf80b00b99a0400b4fb0300f9L8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab22030054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a250191BBBBL4;FFe1031faa220080522", - "30080522400805287dfff97f72341a996ffff17f8031faae0230091e10318aa2200805223008052240080527edfff97f76741a9b9ffff17L4;FB287d42000000000053657373696f6e4e6f74466f756e64000000000000000000080000000000000008000000000000002084420000000000496e76616c69", - "6453L8;FFdf0208eb69f7ff54e00313aae10318aae20316aa2300805224008052f4020094780a40f9b3ffff17e00313aa220080522300805224008052ed020094610a40f9BL8;FFf65755a9f85f54a9fa6753a9fc6f52a9fd7b51a9ffc30591c0035fd6a8060091820600d1f8a30191e88b06a9080080921", - "9230091f6e3019137008052e83f00f9L8;FFe0031aaae10319aa0304805205028052796d0094f95b40f93f0700b1a00c0054faa74ba90a630191061f57290083c13c0003433908e301910183c23cea2301a9BBBL4;FFa203df3ca303dc3cf4830191c9058052e0830191e00706ada0077cade23b803da203", - "d73ca1c302d1e2030091030c8052e32f803de08703ada1037dade21b803dL4;FFfa6701a9f30700f9002140a900013fd6600e003718070091a8024039e10315aac80c00343504009128023837770a40f9690240f9f603082a280117cb1f0116ebL8;FF19ad0094801b00b4f70300aa15ad00944000805241", - "00805213ad0094c01a00b4f80300aa0fad009440008052410080520dad0094001a00b4f90300aa09ad0094BL8;FF220101ada90359f841f18f3ce9d701f9fbc301f9f5c701f9f7cb01f9e8bb01f996010014e8031691e00316aaec2c0194c8624039fbc342f9f5c742f9f7cb42f9L8;FFa20a40f9e00314a", - "a1a2d0094e8a340f91f0500b160000054e002039190ebff97f35353a9940100b47522009104000014940600f1b5620091e0000054a1825ff8BBBBBBL4;FFb5fdffb525000014e00313aaf80301aae10316aae20315aa230080522400805283070094760a40f9e10318aae6ffff17e0830091f52702a966f1", - "0094e00313aaL4;FFe0af4bf9220080521a150094571a00b5d500001413150094c00280522100805211150094200a01b4a80000d008a53991ec0741b20001c03d08e140f8d9028052L8;FF07000014aa7929f8290500914a010ecbff010beb4a010f8b20fbff54ee030faaf115c038301e00127102f83711", - "c200513f2a0071c3feff54117a1a1231060151BBL4;FFc1010054881e00121f050071cc0700548afe48d30c0180d2891e4092eb0f41b20c00f0f21f01007168018c9a39018a9a29019f9a99000014e0031aaaf9d300a9L4;ZBL8;FF3f0400b140010054810000b4601240f92200805217950094611a40f98", - "10000b4601e40f92200805212950094b40000b4600640f9e10314aa220080520d950094BBBL4;FFe01740f94801088ba82600a9a88355f8080540f9150100ebe20000541e020014a2a302d1e003082a430c805222bbff97a01f00b5bc8355f8820740f95f0015ebL4;FB4900000000000000180100001000", - "00005369676e616c205051205261746368657420563120436861696e202053746172744f7574206f6620626f756e64732061L8;FFea230ca929a857a9e9ef00f929a058a9e96f00f9e85f00f929a059a9eaa30aa928e85aa9e9e300f9e80700f929a05ca9e9f700f929ec5da9e82f00f928fc40f9BL8;FFf", - "bb749f9e8074091088109917f0700b1c029005400210491a2170094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebL8;FFe95706f929010090292d0e91eaa705f9ea032d91e86b06f92801009008d11291e96306f9290080d2e87b06f9c80480528943c0f2ea7f", - "06f90a078052ff5306f9BBBBL4;FFe84340391f050071ec030054c8040035e90f41b22d000014e89340b8e90f40b9ec234079ea2341b8eba34039680a00b9e82f407969b200b86cf20078eca741a9L4;FB33000000000000007e0100004600000053656e64657220636861696e20697320746f6f206c6f6e", - "6773656e6465725f636861696e5f6b65795f6e657874576869L8;FFa80640f91f0116eb090f0054e00313aa02f4ff97e80300aae00301aae8fd073708fc60d3880e00b5080840921f1900f1c20e0054017c0353e10e00343f040071BL8;FF3f0001f1f30308aaa8000054e80b41b27f0200f968d200a9100", - "0001408004039590080d2f50300aa1900f0f21fc1007182000054087d0453290b009105000014L8;FFead302f9dd110094e06349f9800100b4e1d342f9e8cb42f91f0101ebe0c50054e8cf42f9090280522a04009109692138e1431691ead302f9d0110094e85349f9BBBL4;FFe00743ade0430291e223c0", - "3da18302d1a0073eade00741ada2039e3ca0073cade00b42ada00b3dade00740ada0073badd9550094a08302d1e143029102048052L4;ZDL8;FFe1038a9af303889a99b2ff97e00314aae10313aa96b2ff97d90000b428e379d3e00314aa02018052011119cb11b50094d5fbffb5f44f4ba9f6574aa9f85f", - "49a9BL8;FFe8f342f909068052e02fc13d6822099be133c13de237c13d18000014c80080d2e0031791e3032d910800f0f2e4833291a10200b02160089102018052e9ab0cb9L8;FFaa010014a1820191a22302d118f4ff9700fcffb469010014202e00b5a02302d1f1f4ff97600e003641fbffb474010014a", - "1e20191a22302d10df4ff97a0faffb4BBBBBL4;FF2981c9938c010a8b6901098b8d81cc938abdcaca2badcbca280108caa91d40d208010a8b6901098b0acdcaca0881c8932bc1cbca4901098b6801088b2abdcacaL4;FF080116cb9f0208eb09f2ff54e0230091e10316aae20314aa2300805224008052f9", - "e5ff97f60f40f988ffff17e0230091220080522300805224008052f2e5ff97L8;FF011115cb1b050194612640f9810000b4602a40f92200805216050194680e48f81f0d00b1a1000054f44f42a9f50b40f9fd7bc3a8c0035fd6e00313aaf44f42a9BL8;FF202040a9210300b021200e91030d40f90204805", - "2fd7b43a9ff03019160001fd608200091094000912203009042e80491e82700a9e8030091090000d029c11991L8;FFea979f1a4a219f5a4a1d0072c0fcff545f05007121020054a80240f99f0308eb00070054880700b1380100793b050079a80a00f9c3fbff544b000014a80240f9BBBL4;FFe10316aae2", - "0313aa230080522400805287b7ff97b6035ff865ffff17a08300d1e10316aa2200805223008052240080527fb7ff97b6035ff841ffff1720008052L4;FB5f6b65795f69647369676e65645f7072655f6b65795f696474696d657374616d704d6573736167654b65796369706865725f6b65796d61635f6b6", - "57969767365L8;FF795601a908008092770600f908f7ff172093c63ce8bf43f9f7c31591f4a35d39e082009101830091022e8052e03f803de8f30ff8e91f00f916c50094e81f40f9BL8;FFa0c300d1a8031df8393a0094e10300aa7a000014e00700f9c10200b021c00b91c30200b0631c0c91e0230091a2", - "0080524403805296000014c90080d2e8430039L8;FFa80318f82801009008b140f91f0900f103040054a80302d14900009029412191e8a703a948008052090100b029a13e91eae30091a04700d1e8271ca9080100b0BBBBL4;FF99008052e00318aae10319aae2031f2ae0023fd61f0000f1cd0000543903", - "00eb831901541803008bf9feffb5110000141f0400b1e118015431e501941f100031L4;FB6e206661696c65643a20216d73672e69735f656d70747928290000000000000067e54800000000004700000000000000310100000d00000067e5480000000000L8;FFe8cf40f99f0a00b1e05b803de8bb00f9c1", - "000054e05bc03de8bb40f96002803d680a00f93c000014f5030091c182009102288052a082009116e50094f64340f9BL8;FF69120139e95b4079742201a9e82b40b969920278685202b8e82740296ac203f87c92003968ba0039e80740f969ae003977b200397bb600397af202b8783203f8L8;FF1c65001", - "4f44f42a9f65741a9fd7bc3a8c0035fd6210400b4fd7bbea9f44f01a9fd030091f30301aa14e0009104000014730600f194c20191c002005481825cf8BBBL4;FFe217803d3a030191a82735a9e10304ad79eeff9700e4006fa0833aada0833bada003d53ca103d63ca203d73ca303d83ce323803de21f803", - "de11b803de017803dL4;FFa0060054c10600d116ff4cd3e21a40f91500188b000700d1367c169bbf0200ea41040091e0179f1af68602a9f52600f93e000014c81a80d2000080d2010000d4L8;FFa8831ff868a5009468a50094f44f43a9fd7b42a9ff030191c0035fd6ff0301d1fd7b02a9f44f03a9fd830", - "091e90301aaf30300aaa101009021481691e8230091BL8;FF887e4039697e4039b302000a1f01096be0179f1a312501946802000ac802080a00010012f44f42a9f65741a9fd7bc3a82a250114ff4301d1fd7b04a9fd030191L8;FF420100b4e8ab41f9e9af41f900030291e10315aa080102ab2935899ae8", - "ab01f9e9af01f91d250094e0430a91a102198be20314aaf43f0c3916250094e08759adBBBBBBBL4;FFfd03009113d840a9f40300aa360300b475c2009106000014e00315aa23000094d60600f1b5a2019140020054a1025df8810000b4a0825df8220080520d190294L4;FFf95b45a9bf0a00b1010300545", - "60400b4bb0000b4e00319aae1031baa2200805214190094a1035ef8810000b4e00318aa220080520f190094a08300d1e103172aL8;FFe10315aa95a240a9160115eba3020054880240f9e20313aa0001158b1d1901947f0216eb28010054a80213ab02020054880600f9f44f43a9f65742a9fd7b41a9BBL4", - ";FF60ffff97e00742adf41f40f9e203c63c9f0600b1e00700ade20b803d4002005460420191a1e200910224805219990194e00740ade20bc03d09018052740e00f9L4;ZFL8;FFa93355386b01084aaa131538aa435538a1c302d1ab2315382901084aab535538a93315384901084aaa635538a9431538690", - "1084aab735538a95315384901084aBBBL4;FFc0000054e00bc03de81b40f9e003803de80b00f90c000014e8a742a9a82739a9a8c301d1890000d029312291c0030090005c1491e8a703a9e8030091e1e30091L4;FB656976656443743153616d706c6564001b737071722076312e73656e645f63742e7265", - "63762065706f636820c01a3a2043743153616d706c6564202d3e204374L8;FFfb0308aaf2ab00f9f80316aaea0314aaf56300f9ec031caae5d300f908008092f0e300f9e56f40f9e87700f9f6134ba9eef347a9fa8700f9e96340f9f57b40f9BL8;FFe85349f9280500b409e179d3f84f49f959038052361", - "108cb04000014d6c201f118c3019120040054e1d342f9e8cb42f91f0101eb00030054e8cf42f929040091L8;FFa8fe60d3c82300b5a00a40921f1800f102240054a17e035321240034280400511f390071c806005489000010ea6a683829090a8b20011fd6a03500b5a02302d1BBBBL4;FFe183c13ce283c", - "23ce91f40f9c80240f9e00702ade21b803de93b00f9680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aa0ef90194e00742adL4;FB6578742073657269616c697a6564206279746573207765726520746f6f2073686f7274203cc0013e0020636970686572746578742076657273696f6e", - "20776173L8;FFa18378ad8182803c8082813ca18379ad8182823c8082833c6affff17c1010054e1031faae4fcff17880080d2e17f00f90800f0f2dcfcff17e80b41b2e07f00f9BL8;FFa00301d1620280520401805224000014010300b021182e91030300b063201e91a0031cf8a00301d16202805204028", - "0521b000014a0031cf8010300b021182e91L8;FF000400ad600100b000c02d9108c1359103048052e4031caa25058052060480523dcfff97e2bf4ef9e3c34ef9e007409100800191e10316aa74baff97e01bc43dBBBL4;FF60a201a9a88357f809008092690200f948fcffb51f000014830300f063601e91", - "e10314aae20314aa30b90194f5030caa21b90194ec0315aaf60300aaf50301aaL4;ZBL8;FF420c00546b1d0091eefeff375f00001448008052e91f80520840003909200039c0035fd63f050071a8100054e84300391f090071ecfbff54a80c00341f050071BL8;FF4a0400b40b0440f9ed031faaec030aaa", - "6b4100916e8541f8cf0140b2ce010d8bef11c0daef1540d2ef0d0f8bef250191ce194f8bdf010deb230300548c0500f1L8;FFe00640ad6862199169621a91c32ac03d60061e3960621991e10318aa759e03f9000500ade00a41ad63de813d000901ad800740ade8835039200500ad820341adBBBBBL4;FF3", - "f040071600100543f080071a1f9ff54f40300aa01a00491e003082ae20303aaf60303aa39f2ff97200100b4d0000014f40300aa01000591e003082ae20303aaL4;FFe88300a9e0030091e80f00f9e90300f9f4e6ff97884640b829008092745601a9680a00b9690200f9f44f45a9f52340f9fd7b43a9ff83", - "0191c0035fd609090094L8;FF61020090212012916402009084a01191a2008052e30313aa6309019463090194fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b02a9fd830091490200f0BL8;FFe02740f9eaffff17f6031faae00315aae10314aa839cff97800400b4e88340b9e93348b8611a00f9e", - "a1f40b9e12b40f9797200a9683a00b9e81b40f969b203b8L8;FF18890094e00313aa410080521689009480c7ffb55e000014e0430a91e1030491023080521b890094e00313aa7782ff97f80740f928008052e1430a91e00313aaBBBL4;FF696a2af8680200f9f44f42a9f50b40f9fd7bc3a8c0035fd6fd7b", - "bda9f65701a9f44f02a9fd030091687cc19bff0308ebc1020054747c019b0800f0d2f30302aaL4;FB08000000000000003404460000000000000000000000000008000000000000000800000000000000e00046000000000000000000000000000800000000000000L8;FFf9c343f9e9030caae48715ade1", - "07c23de8bb01f9e87344f9fec743f9f45300f9f4bb43f9eecf43f9f2d343f9f1d743f9e0db43f9e3e35e39e7f343f9e4e343f9BL8;FF81825cf8810000b480025df8220080521849019481025ef8810000b480825ef82200805213490194810240f9810000b4800640f9220080520e490194810e40f9L8;F", - "Ff30300aa1f0500b1e0030054e00313aa40000094080040b20811c0da081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aaBBBBL4;FFd83200b9a10100b4e00313aa22008052f44f43a9f65742a9f85f41a9fd7bc4a814e9011437008052c10e40f93f0400f1cafdff", - "54f0ffff17f44f43a9f65742a9L4;FBe41f40000000000018000000000000000800000000000000e48c400000000000e41f40000000000020000000000000000800000000000000e48e400000000000L8;FFfd030091ff4314d1ff0300f9f30308aa090840f9c93000b4080440f917008092f6830591d500", - "80d2e9df15a9d8020291e8ab00f91500f0f248008092e9430591BL8;FF0101805218690194000100b40103009021402b91130000f91f200039f30b40f9fd7bc2a8c0035fd6000180520102805228690194fd7bbda9f50b00f9f44f02a9L8;FFaaffffd04ae13691400100b0009c189108210091e1c30e91e", - "9db01f9eadf01f943690094480100b008193c91e9008052e8271ba9fa0741b2e8df40f92083c13cBBBL4;FF22008052f44f59a9f65758a9f85f57a9fa6756a9fc6f55a9fd7b54a9ff83069114a90114f44f59a9f65758a9f85f57a9fa6756a9fc6f55a9fd7b54a9ff830691L4;FF6001f83612000014e183", - "4ca93f0000eb61fdff54e08f40f920fdffb512000014732200917f6200f180010054a000138b000c407960ff2f36080780d2600c8092L8;FFe00302ade00bc03de10fc03de213c03de317c03de343803de23f803de13b803de037803d08010191ff430991f44f45a9f65744a9f85f43a9fa6742a9fc6f41a", - "9BL8;FF0001168b08108052e20315aae1031aade08b53ade00b1bade08751ade00719ad0814003811290194bf3e00f148020054e0075bada14302d1e00314aa22008052L8;FF046108910551fe97e88340f9e00314aa016940b94f51fe97e0234fa9f4e302f9081140f900013fd6e0e702f9e8074091e1eb", - "02f908011891290c40f9e1631791BBBBBBL4;FFe80b40b9c8150037e80f40f98a0740f9490108eba32400548a0340f9e00b40f94801088b882700a908fc60d3a80b00b5080840921f1900f1420c0054017c0353L4;FFe2030c91210080521c0c0094e007409161e20191e2830c9100401d91ff050094e8ab", - "4bf91f0900b1813e0054e0074091a20000b042e8359100401d9161620491L8;FF1f410039f44f45a9fd7b44a9ff830191c0035fd6890480524a008052132500a90a410039f44f45a9fd7b44a9ff830191c0035fd60a048052932a00a99f420039BBL4;FF29910194200080520104805231910194fd7bbda9", - "fc5701a9f44f02a9fd030091ff0740d1ff0300f9ff830ad1090440f9f30308aa3f8131f1c1040054f50301aaL4;ZDL8;FF4a513491620100f042500f91a8031ff8e92b01a9e343009133910094fd7b44a9ff430191c0035fd6880100d0082d2f91e00301aae10308aa22058052fd7b44a9BBBL4;FFe10319", - "aae20315aaf80300aa21d1019414d10194e00315aa2100805212d10194e01800b4e10319aae20315aaf3031aaae03b00f917d10194e05340f973a80094L4;FB7616b47240e1051b0595e8330bdda28c749d80e100009519f91165044fb8612e25ec7d294fe76f6a0a95624a3943df5d95600f26e72afff0c", - "709ed964a2c7a47L8;FFea1b00f9e97b00f90a2556a9e9d300f90b2557a9ea2f0ca9e9ef00f90a2558a9e96f00f90b2559a9eb5f00f9e9e300f90b255aa9eaaf0aa90a2d5ba9e90700f9BL8;FFea2301a9e8a3039181820091a50303d102048052e3031caae4031baaa0073aadf55b02a9fa2700a97ca6ff", - "97fb7740f9e082c03ce182c13ce282c23c7f0700b1L8;FFbf2738a9090100f0292d0e91a92b3aa9290080d2a10302d16908c0f2a87f39a9a8273ca91f5100944083cf3ca88355f8bb0353f8b5df73a920b7803de83304f9BBBBL4;FF89c90094a86774a9b80355f81f0500f121010054281f00121f050071", - "cc090054880a0035381f4092e90f41b2e80318aa5a00001400e4006fe10b41a9a00303d1L4;FB33000000000000002f02000011000000696e76616c69642070656e64696e67205072654b6579206d6573736167652062617365206b657900d695480000000000L8;FF0900f0f2e8270039e90300f9e8ffff", - "17e00300f9210200f021f41a91230200f063341b91e003009102028052a4018052eaffff17c80080d2e0230039e0030091BL8;FFad010c8bce11c0dace1540d2ce0d0e8bce250191ad194e8bbf010ceb830400546b0500f14a810091ec030daa21fcff5406000014ed031faa4e815ff80efdffb5L8;FF802", - "20054806203917c290094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb2821005413000014f9031faafbb749f9BBBL4;FFe93b40f9e82740f9e92310a9e81340f9e88b00f9e82b40f9bb8312f81f0500b180020054a06303d15c99ff97e01f40f9e10f40f9a84", - "301d1b38a0094a8035b38L4;ZBL8;FF08088052a08301d1a12301d162008052b9831df8a82b3ea9790a0094bc937aa9a82301d1e0031f2ae1031baae20317aa2500805206048052fb0700f9e3031caaBL8;FFe0833291e1032d91022b805221310194e1fb42f9f39b45f93f0400b100010054810000b4e0f", - "f42f92200805211310194e8c31791008100918de6ff97a80359f8L8;FFe1c32491e85303f9e8831a91e95703f949fdff9029312291e89b04f9e8831f91e99f04f942310094687a40f9e9830e910a0000f04a012191e99b04f9e9831f91BBBBBL4;FF9f03116ba0030054f00500d10f020feac1feff54bf05", - "00f10001005443a8200e6b00669e6b0100b46b01c0da6b11c0dacb0d4b8b6b010a8a428c212e42a8302eL4;FF21835ff8e1feffb4200340f92200805218010094f3ffff17e86640f9c80000b40805088be00315aa0201805201ed7cd3100100945f0b00f1e0030054f5d24fa9L8;FF400200f000c03f911d", - "01019460020090002000911a010194ff0301d1fd7b03a9fdc30091080040f9090540f9490d00b40a0140f9410180390101f8b7e0031faaBL8;FF130040f9e00301aa010300f021d42991e8030091a20180526281019468620091010300f021082a91240300d084602691e0030091a363009142018052a80f", - "00f9L8;FF9780ff97ba000034818a4329e3630091800080522a93ff977f0600b160100054e11740f9e80f40f91f0101eb008c0054e81340f92a040091e00316aa49028052BBBL4;FF0a7d4039f43300f8f70340f9e90b00f9ea63003913c10194000480522100805211c10194a00600b488fe68d3ea0b40f", - "9160000b9174000f8097d105308180079L4;FB2f72757374632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c6962726172792f616c6c6f632f7372L8;FFe86700f9e95b00f93502f8b6f9031faae00319aae10315aa23c10094d60900b410c10", - "094e00316aa21008052390080520dc1009460e5ffb4e10318aae20316aaBL8;FFa8ffff17e00313aae10317aae20315aa20000094770a40f9680240f9080117cbbf0208eb89f5ff54e00313aae10317aae20315aa17000094770a40f9a6ffff17L8;FF220080521b410094c10240f9810000b4c00640f922", - "00805216410094c10e40f9a1fdffb4c01240f92200805211410094e9ffff17681a40f9280100b4090d8052BBBBL4;FFe00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eba39900541803008bf9feffb50f0000141f0400b10199005432e101941f10003181980054L4;FB207769746820", - "74797065203cc0013e00155075626c69634b6579207b206b65795f747970653dc00c2c2073657269616c697a653dc002207d00013cc0013ac001L8;FF2b0042a9291c40f9080340f92ab840a9e9ff00f9ebe700f91f0109eb0b008092e971005489008052680a00f9692200396b0200f9ea0000b4e1030aa", - "af40300aaBL8;FFc0035fd6fd7bbea9f44f01a9fd030091f303012af40300aa12610194000480520101805210610194200100b4140000f9e10200f021600691131800b91f700039L8;FFe02300913a56ff97e10300aae10700f9210100f021203891230100f063e43891e0230091a200805224018052a700", - "0014c80080d20800f0f2080500d1a0c300d1BBBL4;FFfc031aaa732a00b468ea7bd3e00640f9fa031faa028100d1081840b91f01186ba0250054428000d1008000915a0700915f8000b121ffff54460100142003c03dL4;FFbf1040f20000805262786678423c7cd3e10100543fcc74f2a001005421cc749", - "2214000d13f0002ebe0279f1a0800001463141a127f003f71a1f9ff54001040f9L8;FFf31300f9fd430091130040f9e00301aa810100f021e01891e80300914202805260a10094810100f021a01691a40100d084e00491e0030091a363009102018052BL8;FF22210194800200b0000015911c2101948002", - "00b00060159119210194800200b000c0159116210194f6031faae00316aae10315aa1c210194800200b000e01691BL4;FF3501178bd732889a152300a9f7fbffb5f62b40f9f51f40f996000037980000b01823209113000014d7fe45d3e80214ab420d0054e90200ab620d0054aa0217cbL3;ZB" + "BBBBBBBBBL8;FB636339653033313261616632312f6f75742f7369676e616c2e70726f746f2e70715f726174636865742e7273001b737071722076312e73656e645f656b2e7265L8;FF01048052740a00b9690201a9000400ad616a29f8680200f9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b4", + "7a9ff430391c0035fd620feff9000243191BL8;FFed24019461e640f9810000b460ea40f922008052e824019461f240f9810000b460f640f922008052e324019461fe40f9810000b4600241f922008052de240194L8;FF40fdffb00000029140210094ff0301d1fd7b03a9fdc30091080040f9090540f949", + "0d00b40a0140f9410180390101f8b7e0031faa4a050091290500d10a2500a9BBL8;FF682604a9755200b9f44f4aa9f65749a9f85f48a9fa6747a9fd7b46a9ffc30291c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091L8;FFe80f41b2b9ffff17a0031df8a1fdfff021c426", + "91a3fdfff063142791a0c300d142018052e40080522c000014a0031df8a1fdfff021c4269183fdffd063500291BL8;FF77ffff17e90b41b2e92300a97cffff17c80080d20800f0f2080500d170ffff17c80080d2e10700f90800f0f2080900d107000014e80b41b2e00700f904000014L8;ZDBBBL8;FB6a0", + "0000000000000ec0000002e00000042024000000000006a00000000000000890000002e00000042024000000000006a00000000000000f30000002e000000L8;FF2200805223008052240080529ba8ff97e11740f9e3ffff17962e40f9560300b4e11740f9e80f40f9972a40f91f0101eb40850054e81340", + "f9490480522a040091BL8;FF0a0000144003188be10315aae20316aaf00401940803160be8bf0a39944200919f0219eb80050054f8bf4a39955a40a9620318cbdc0202eb63feff5458020034L8;FFe80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a922010094fd7bbea9f44f01a9fd0", + "30091f40300aa2301f8b7f30303aac10100b4e00302aaBBL8;FFe20c0054695241b969010034290140b22911c0da291540d2290d098b2925019129fd46d329050091280108ab830000545b000014e80308ab220b0054695641b9L8;FF1730889ae0db04a9f70400b4150340f9f60300aa080014eb2310005", + "4ff0208eb09010054e0e30091e10317aa220080526c43ff97f42344a91f0114eb23100054L16;FFe82744f9eb2344f9e81700f9e82b44f9e82b00f9e82f44f9e82700f9e83344f9e82f01a9e83b44f9eb3744f9e84300f9e83f44f9e82300f9e84344f9e8af06a9BBBBL8;FB61663b870a0e001a00042634", + "1e55080042202c094c58367014640000a901ab0015012100fd011f02660138037b003f020000ed0058008600170029014701e100L8;FFa97318384901084aaaa35838a98318386901084aabb35838a99318384901084aaac35838a9a318386901084aabd35838a9b318384901084aaae35838a9c31838BL8", + ";FFc202805223110114fd7bbfa9fd030091083040f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091091840f93f0500b140040054L8;FFa04700d187c2ff97e0e700b9a04700d184c2ff97e0e300b9a04700d181c2ff97e0df00b9a04700d17ec2ff97e0db00b9a04700d1", + "7bc2ff97e0d700b9a04700d1BBL8;FFe2031aaa23008052240080525ae0ff97b9035cf8a8035bf8080119cb5f0308eb69deff54a04301d1e10319aae2031aaa23008052240080524fe0ff97b9035cf8L8;FFfd7bc6a8c0035fd6404fc03da80359f84003803de8f304f9e89740f91f0500b121f7ff54baff", + "ff17e89348b9208757adf7e342f9a00302d1e1031faaa80315b8L16;FF08008092a0039d3c6082803c680200f91e000014e8c341f9e9cb43f9e0dfc03d680e00f9080080923f0d00b16082803c680200f9a0020054e0431e919cdcff97BBBL8;FFc0035fd6e00313aa220080522300805224008052580000", + "94610a40f96ffeff17e00313aae10317aae20315aa230080522400805250000094770a40f9680240f9L8;FF00040054e1d342f9e8cb42f91f0101eb204f0054e8cf42f92a040091800203914901805209692138ead302f9bf230094e14316917c0d0094e0ab49f9800100b4BL8;FF735647a9950100b4762", + "2009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f922008052e2f40094f8ffff17340100b48806148be00313aaL8;FF7f0006eb80000054000080d21f000039007d20d463424079682c46d31fbd007108020054e3fcffb063a0119163d86878867e031b9f00066b8a000054000080", + "d2BBL8;FF6b0d0b8b6b2501916bfd46d36b0d009104000014eb031faa0d0000144b0080522c0100348c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c050091L8;FF08552c91e95b05f9290080d2e87305f9c80480526944c0f2ea7705f90a078052001f813dff4b05f9e85305f9ff5705f9ea", + "5f05f9e86b05f9e96f05f93b310094L16;FF02428052f3b40094f8d750a9800ac03d8182c03c881a40f9890e40f9f78340f9fb8f40f94083813ce107813de81f02f9e91302f9f527f8b7552b00b4e1b40094BBBBBL8;FB70726576696f75735f73657373696f6e7300000000000000920e40000000000055", + "00000000000000ce000000010000006661696c656420746f206465636f6465L8;FF810000b4a08a40f922008052ea9c0094a19240f9810000b4a09640f922008052e59c0094a19e40f9810000b4a0a240f922008052e09c0094a1aa40f9810000b4BL8;FFe10313aa50faff97e00314aa088c44f81f0500b", + "160000054e10313aa75fdff97950a40f9550300b4610a40f9680240f9960640f91f0101eb800b0054680640f9L8;FF801000b428fdffd008413a91150380d2090140f9087140f8f90b40f9f80300aa1500f0f27c008052090000f9f6018052087000f81d000014e89f4139e9534678BBL8;FF60030191e10", + "301912200805208050091683300f927590194e8031f2ae8ff0139e327c03da00303d1600743ada18302d16223c03d6343803dd502178b5a0317cbL8;FFbf5b38a9b67f3aa9bf233ba9bf6b3ca97cf6ff97e03100b5a0077eada8035ef8f3cf45f9e88306f9e8c745f9e03b833da00b7cade13f833d7f0208", + "ebe02b833dL16;FFe20315aa0001178bf2dc0094e802158b680a00f9951640f9550300b4610a40f9680240f9961240f91f0101ebe00b0054680640f9490480522a040091e00315aaBBBL8;FFe92300a916000014280180d20800f0f2081100d1110000143f00156bc1f0ff54dfffff17e80b40f98a0640f9", + "490108eb830300548a0240f9e00740f94801088bL8;FFe0074091e1074091023880520080099121800191ef7c0094e92342a9e00319aae0f3c63d0178805222008052f5170af9e8130af908048152e91b0af9e9eb4df9BL8;FF1200001435008052c182009100008092d78200915bf900941f0400f161010", + "054fffedfc8c10240f9810000b4c00640f922008052e0fc0094e00316aa01058052L8;FF6b010a8b6a0140396a0300346b0500914aff3f364c1d00129f010271c10000546a0140796b010a8b08010a8b6b090091f5ffff174c0500124d7d01534a7d0253BBL8;FFaa731838aaa358382901084aab831838a", + "bb35838a9931838a9c358384a01084a6b01084aaaa31838aad358382901084aabb31838abe35838a9c31838a9f35838L8;FFf40316aafc432a91e8031aaa58fd60d3fa6740f9f6fe60d3e85700f915fd48d3b6000014fb4b40f9ea5f40f9f40317aafa6740f9fc432a9159000014e8974ab9L16;FFebbb00", + "b9efbc0094e00316aa21008052e8bc009460f200b4e1031aaae2031baae06300f9ebbc0094ebbb40b9eccb40b9d40400143f0700b1e0010054f90000b4BBBBL8;FB61f35001414aaed1575a0f8995f5a322564d25ea49159797525496eabc8150faacf151ba31ff00bba28cd208c019285407340000d02cc", + "16b5181327d23749560L8;FFf63b00f9e8db00b9a8721d53f44700f9e8d300b9a86e1c53e8cb00b9a86a1b53e8c300b9a8621953e8a71629a95e1853a85a1753e8a71529a9561653a8521553BL8;FF2002805221008052ea0c0194a06c00b4880c8052e9feffb029410d9108400039c80080d22001c03d08", + "00f0f2e9f35639e06302f91c490091280280520000803dL8;FF88e9ff97f60b40f9dfffff17ff0302d1fd7b06a9f44f07a9fd830191f30300aae0230091a2e9ff97f40740f99f0600b1e0010054e083c13ce183c23ce81f40f9BBL8;FFbaef3aa9fb0314aaf4031caafc0340f9ba831bf8bac301d1280316", + "8ba0a300d1e1630191f9a305a948fffff008613e91e83700f908008012e87300b9e6ddff97L8;FF6b0d0b8b6b25019129194b8b2905009129010aabc20600542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9050054L16;FFea0317aae5030faaef0301aae20", + "30caaed0308aaf2e300f9f7cb49a908008092e1d348a9e98700f9ec2b40f9f57b40f9e87700f9fe1b40f9e96340f9e86b40f9BBBL8;FFe93200d103000014e8031faae92a00d14a1d4092a0e300d108010aaaa9a33ca9bbf0ff97a8ffff9008a1189149038052682601a9e00747a908008092685e00a9L8;", + "FF1f2100f92003c03d0081843c2007c03d0081853cfc2700f9da0000b4e0031baae1031aaa22008052e36c0094fc2740f99f1b00f103050054f8430691fb0c8092BL8;FFe0870aade28344ade2830bade18341ade18308ade28342ade28309ade18340ade18307ada02100b4e0c3039147f7ff9707010014", + "e1430091e20313aafb1f00f9L8;FFfd030091017c4093e20304aa060080d2050080d2040080d2000880d2d3ffff97fd7bc1a847f6ff17080000d02900805209811c39c0035fd6fd7bbfa9fd030091BBL8;FF20ffffb00020359140290194f80300aae043169122008052a0100094e1d342f9e00318aad4fb", + "ff17f90300aae04316912200805299100094e00319aaf90b40f9L8;FFc10640f9810000b4c20a40f9e00317aae92c00945f0b00b101110054e8e342f9e29340f9e07b40f9e16b40f91b5501b9e8a74fa9299940b9e9b305b9081540f9L16;FFe80b40f9e07b42f9080502d11f0008ebc9230054e91b40f9e", + "0031f2ae80317aaea031caa2b154038080500f14c1540388b010b4a6001002a61ffff5487120094BBBBBBL8;FB2c20726563697069656e743dc0001243616e6469646174652073657373696f6e20c0052068616420c01020726563656976657220636861696e730076656e646fL8;FF63400c9104fefff08", + "4e00c91e80b00f9a9831ff8189d0094e00f40b968034039a102174a1f05007180fcff543a070094d6ffff1748074079a0831f78e0430091BL8;FFa00100b4c9000014c1c20091e20313aadefcff97000100b4d6000014e01c00b5e00313aab7fdff97e80301aa40010036481d00b5e1031faa61f9ffb4f10", + "00014L8;FFfd7b46a9ff030391c0035fd620fdfff000a03491411d0094ffc302d1fd7b08a9f65709a9f44f0aa9fd0302910920403989050037010040f9f30300aa22fdfff0BBL8;FFbf633ea9bf031ff833e5ff97e01d00b5f40f42f9e80742f99f0208eb61000054e0231091295c0194e80b42f9a003de3", + "c8a0600918822199ba9035ff80001803dL8;FFf44f09a9fd83019128008052f30300aa3500028bffa300a996fdff90d6623e9117008012a88300d1e0830091f40301aaff8701a9f5db02a9f73b00b9435d0094L16;FF81fefff02150169183fefff063280f91e003009122028052a4008052e80300f91200", + "0014e00300f981fefff02150169183feffb063900291e003009122028052BBBL8;FB30f8450000000000100000000000000008000000000000006c1346000000000030f845000000000018000000000000000800000000000000a014460000000000L8;FFea1700f909692138e1630091378eff97f71740f", + "9e80f40f9080117cbbf0208eba8380054e81340f9e10316aae20315aa0001178be7800094e802158be81700f9BL8;FFf44f45a9f71b40f9f65744a9fd7b42a9ff830191c0035fd62805003628f97fd35f0108eb4881889ae10202ab620b0054020101eb810a00f9630b0054280101cbL8;FF190082521a04", + "a05217008252e1074091e003132ae20317aaea130094000700b4c000f8b6fc090094080040b91f110071e0feff54350000141f0017eb68060054BBL8;FFdfc2007122010054c87e0453690b00910a000014e80b41b20900809268fe00a9690200f92a010014df3e0171e9000054c87e0453690f009168420", + "03908008092L8;FF606601f9616a01f986ffff17776a41f900c3c73c01c3c83ce90f44b9f6eb43b9756641f9e80240f9208706ade90303b9680000b4e00315aa00013fd6e10640f9L16;FF68d21da968a207910001803de88340f968fe00f9efc00094e08750ad68e20d91e91b41f974d601f9000500ade8", + "7740f9e083c03d69ce01f968d201f960ee803dBBBBL8;FB0eb7e00103a04962db261c916bcb6e7e1ca83fd17f0be1a5f018c1cb9347f044b1019f9bc18850c69b09c7f1e05f0000b8876ba8a3082d69c3b57daea31ec61bL8;FFeaa300a9a84300d1e91700f9c2fdfff042402191e9a301a9e3430091278d", + "0094fd7b44a9ff430191c0035fd608feffd008590991e00301aae10308aaa2028052BL8;FF0001803de02fc33de9f702f90005803de033c33d0009803d9c6300917b0700919f0314eb0071005400e4006f0823059189ab40a9ffa305f9f6a705f9f6b305f9L8;FFc0058052e10315aae20314aacc2400941", + "f0400f1c1080054f40301aa3f0016ebc2feff54a86a74381fb9007161feff54e8330091e00315aae10314aacd0cff97BBL8;FFaca640a9080680520a038052c852089bf6e300912b008052e0231291c182009129310a9bffff06a9f7231291ebff03a9ff3f00f9f4a304a9eca705a9f0070094L8;FF00e00", + "191414d009480fdffd000a023913e4d0094080040f989fdfff029610b91e00301aa08014039227968f889fdfff029c10b91287968f8e10308aa154d0014L16;FFe64f00f9e48f00f9f5b700f93ad7ff97ebc341a9e70316aafe5756a9f22b40f9ecdb53a9e64f40f9e98740f9e03340f9e3ef40f9f7af40f", + "9ee4740f9fbdf40f9BBBL8;FF1f0500b1e1000054280080521f8400f91fa00fa91f1001b91f8c00f91f2001b9481c00121f09007101070054740040f9820640f9020b00b4810240f929008039L8;FFcaffff904a510591a0fdff9000e02c91e86300f9e863019108210091a10303d1a92b34a9e02f803d3e", + "6d0094e83b40f9c9fdffd029a92791e003c63c682602a9BL8;FFe1031faa880200b9daffff1781020054e1031faae00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6c80080d2e10700f90800f0f2080900d1b7ffff17L8;FFa00c0054e003024b24c59c520000020a64eda072e3fcff906320139", + "139030e912100024b007c041bc11a00b9330f40b9007c1b5377486038f51e409200231f91BBL8;FF09fd46d30800098b080500911f0109eb681200548e00001480020391f9160094080040b20811c0da081540d2080d088b0825019108fd46d30900088b39050091L8;FFe04b823d4004c03de04f823d210", + "140ade173823de077823d210140ad190540f9e1df813de0e3813db90100b4140140f9e4300094e00319aa21008052dd300094L16;FFc00640adf80300aa610240f9000400ad810000b4e00317aa22008052e6b0009408048052686200a9680a00f9e5b000940004805221008052deb00094200400b4BBBBB", + "L8;FB73697a65732c20616c6c2073697a65732073686f756c6420626520636f7272656374000000000000741940000000000058000000000000003c0000000d000000L8;FFe0230091f30301aae10314aae20315aa230080522400805298bcff97e10313aaf35341a9cdffff1700feffb000001891369500", + "94fd7bbfa9fd030091083c40f9BL8;FF3f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff5400ffff9000202b913815019400ffff9000c02e913515019400ffff9000801091L8;FF410d00b4e01741f966000014ed180094c001805221008052e618009420fa00b428fdffd008f", + "d039118fc78d3090140f9086140f8ca018052fb0300aaef031f2aBBL8;FF2c550194ffff0039e8031aaa02fd46d31ce17a921a154092020100b4e83340f9e10319aa0801028be83300f9e8030091000101911f550194e003009121031c8bL8;FFe96306f9290080d2e87b06f9c80480524942c0f2ea7f06f", + "90a078052ff5306f9e85b06f9ff5f06f9ea6706f9e87306f9e97706f93d550094e1fb44f9810000b4L16;FFc2020054880240f9a80000b4800640f901e97bd302018052e7d80094e00314aa0109805202018052e3d80094280080927f220039680200f9ff431491f44f45a9BBBL8;FF1d000014e80741b21", + "b000014f603032a5f2800f1880000542800028b08f1df38e849f837e0230091422a0094e80b40b968000036e00b40f912000014e80f40f9L8;FFf90b40f9800100b4e1d342f9e8cb42f91f0101eb20bf0054e8cf42f9090580522a04009109692138e1431691ead302f97d110094e8d352b91f050071c100", + "0054BL8;FF42008052ecf80094688640f9a80000b4608a40f901f57ed342008052e6f80094689240f9a80000b4609640f901f57ed342008052e0f80094689e40f9a80000b4L8;FF00c0009242c000924f020f8b5200008b4f020f8b72c000924f020f8b01fdff54d3ffff17c9157e92ff0500f1aa0d098b4", + "90140f9eb0329aa6bfd47d3691949aaBBL8;FFe0431691a122009102738052f1380194e083c53de187c53d15008092e8436c79e057813de15b813de8e30a7920010014e8074091f6a745f90023009108810991L8;FFe81745f91f0500b1e1000054ff1705f9f81b05f9ff1f05f9ff430ab9ff2705f9ff530", + "ab91f0800f1212a0054a02302d18df4ff9700080036c1eeffb4d9010014L16;FF6091c83ce237c23df7430d91e86b00f9e8ff5e3969d14578e0d7803de023c23deaef43f92841082ae10b19ade127c23d699145b8e22fc23de417c23de00717adBBBBL8;FB656456657273696f6e206d69736d6174636820", + "6166746572206e65676f74696174696f6e4d696e696d756d2076657273696f6e4572726f6e656f757320646174L8;FFfb0313aa61feff54a8e301d1e0031aaae10318aa000dc03da8835cf842008052a0039a3ca8031bf8e3880094a8035df8a80000b401f97fd3e01340f942008052BL8;FFe9db42f9422", + "1803d2283c83cebe20891410103ad2083c53c2183c63ce84701f9e8a70691e04341f9400501ad2083c73c2183c43ce9b304f9400902ad2083c33cL8;FFd40281a8ff0219eb41ffff54600640a9e8e30691141d0094e8df40f91f0500f1a0540054f55f5ca9e60800940008805201018052df080094207800", + "b4f40300aaBBL8;FFfc0b00f9f65702a9f44f03a9fd030091ffc30ad1282440a9f30300aa1f0109eb000900540961009100e4006f0aa140a9290000f9e9430591ea2314a92a210591L8;FFfc030b9160838e3c2083c83c61838f3c2183c93c6083883c2083ca3c6183893c2183cb3c60838a3c2083c43c61", + "838b3c2183c53ce85301f9c86a40b9e00704adL16;FFe7030baaeb0316aafadb4aa9fcbb00f9e14740f9fc0305aae56f40f9ec0311aaf10310aaea7300f9f00315aaf57b40f9ea0300aae00312aaf20304aae0f3803dBBBL8;FFa80200b983ffff1780fffff00040139182fffff042001491e10580522865", + "0194fb1f40f9e803192af90f40b954ffff1780fffff00050159182fffff042201691L8;FF080117cbbf0208eb6800005455fdffb5f0ffff17e00313aae10317aae20315aad6070094770a40f9680240f9080117cbbf0208eb09fcff54e00313aae10317aaBL8;FFe10300aae00301aaf44f47a9f65746a9f", + "85f45a9fa6744a9fd7b43a9ff030291c0035fd6370080521800809219018052a80640f91f0116eb090f0054e00313aaL8;ZDBBL8;FFeabf0639200740ade00600ad5a230094e00640ada00302d1808702ad433e0194e8430691a08303d1c1e20091028300917dc4ff97e89341b91f05007161060054L8;FF", + "e00313aae10314aa22008052f44f45a9fb0b40f9f65744a9f85f43a9fa6742a9fd7bc6a8e4280014c80240f91f0308eb4002005408068052a002c03da90a40f9L16;FF600600b49f020072fa0300aa88139b9a000540ad000400ada08300d164feff97a9237fa9aa2f7ea92901088b080500913f010aeba8", + "831ff808098052ea338a9aBBBBBBBL8;FB6f6e20666f7220726563697069656e743a20c01b2c2063757272656e742073657373696f6e2062617365206b657920c01d2c206e756d626572206f6620707265L8;FF5f0008ebc109005448008052f50300aae0430091ff2301a9e10303aaf40302aae87f03a9b", + "84301d1ff2304a9e87f06a9ff2307a9e87f09a9ff230aa9e87f0ca9BL8;FF280000149f114071630800544d19c039ae1d00128c390e0b8c1140518d00f83761710c8beb0080521e0000149f014871830700544d1dc039ae1d00128c550e0bL8;FF080900d107000014e80b41b2a0831df804000014c80080", + "d20800f0f2080500d1a0c300d1a8031df81c29ff97e10300aa43000014e1031faa4100001441fdff90BBL8;FFdae8ff97e84b40b9c8010034a1035ef8a8035df81f0101eb60200054eb2f40b9a8835df8090780522a04009109692138e0030b2aa1c300d1aa031ef8cbe8ff97L8;FF29050091200108ab22", + "0a0054e10313aa85fbff97b7010034610a40f9680240f91f0101eba0090054680640f9090180522a040091e00317aa6a0a00f909692138BL8;FFe10300aa00feffb5a80640f91f0116eb29050054e00313aaa3efff9740fd073728fc60d3e80400b5200840921f1800f102050054217c0353210500343f04", + "0071L8;ZDBBBL8;FBf904000019000000ef104000000000004e0000000000000001050000140000003d0f4000000000004a00000000000000b6020000090000000000000000000000L8;FFf7031faaf50314aab60e4ff8df0600b180170054e00315aa71f2ff97080040b20811c0da081540d2080d088b08", + "25019109fd46d30800098b080500911f0109ebBL8;FF0011803c0111813cc0035fd6290080521f0500f909010039c0035fd6290080520a2500390921003909010039c0035fd649008052098500a92900805209010039L8;ZFBBL8;FF42ffff9042542591ea0f00f9e34300912a3f0194fd7b43a9ff030191", + "c0035fd608200091200440a9e92300910a0000904a713e91e8a700a942ffff9042401991L8;FF430c805207f9ff97e10300aaa10a00b5680240f9080540f91f0119ebe9030054e00313aa90feff97c009003728fc60d3a80600b5200840921f1800f182070054L16;FFe8f301f9a80100f0081140f9e2c34", + "5a9ebbf40f9facf40f9e31340f9f7f340f9f44b40f91f0900f1ebbf00f9490300548801009008411f9129038052e86705f9BBBBL8;FBcb000000140000004e1a4000000000005800000000000000cb00000009000000617373657274696f6e206661696c65643a2063757272656e745f6b6579203e3dL8;F", + "F00003b91418f0094e8031faa080113abe300005400fefff0004004913b8f0094e8031faa080113abc2010054090140b22911c0da291540d2290d098b29250191BL8;FFf36b41f9e8230b3949008092880240f9690300f9680000b4e00313aa00013fd6810640f9812101b4820a40f9e00313aae11201940", + "8090014f7c31791e82746b9L8;FF9c0000b4e10353a9e2031caaf1120094790a00b4e8bb43b909b343b839008052eadb43b93a008052e88303b9e8bb4779093300b8e91341f9e80b0679e8a34839BBL8;FFe00318aa2100805239008052e9520194e0feffb4e8031faaf88300a9ff0f00f91703003409018", + "0520968283808050091e1230091e00317aae80f00f9cbd8ff97L8;FF40818f3ce9e304f9680000b4e00314aa00013fd6c10640f9810000b4c20a40f9e00314aae45200947f0b00b141050054e8630191ea9740f9e93342f908e10c91L16;FFe2eb00f90e4548a9e09b00f900514da9e9ff00f9094144a912", + "1149a9e0a700f917014fa9e9db00f9093145a902154aa9e00f00f9008140f9e9b300f9093140f9BBBL8;FF2a040091e00315aa6a0a00f909692138e10313aad5f8ff97770a40f9680240f9080117cbbf0208eb68220054680640f9e10316aae20315aa0001178be5720194L8;FF22008052dd110094e1d34", + "2f9e00316aa02faff17e043169122008052d7110094e1d342f94ef9ff17e0431691e1031caae2031aaad1110094fcd342f9e8cb42f9BL8;FF0d00be528d010d0b4c2180396b710d8b8c00f8b761e10c8b2b0180520a0000144d254039bf0500f1c80100548c1900126ce10c8b81fd0daa3f000beb0305005", + "4L8;FFf30300aa603400b4c0020e91e1ea009122000090bf22007144bc43f9027861f8ec010054e006178be1fcffb021c013912300008b34686038801e7ed31f0002ebBBL8;FFed320194e19749f9810000b4e09b49f922008052e8320194f47749f99f0600b180aaff54f57f49f9f37b49f9350600b4762", + "2009104000014b50600f1d6620091L8;FFff030b39a8a33aa9bf831bf829f1ff97a8835cf81f0d00b181010054680200f9e8034b391f1500710d0200541f190071800200541f1d0071400200541f210071L16;FFfc8f00f9e10302ad6083c33c6183ca3ce00b01ad6083c93c6283c83ce00704ad6183c73c", + "e10b03ad1cffff17fd7bbda9fc0b00f9f44f02a9fd030091ffc314d1BBBBBL8;FB6e206661696c65643a2062797465732e6c656e2829203e203130207c7c2062797465735b62797465732e6c656e2829202d20315d203c20307838300000000000L8;FFf49a0094a8c303d17b070091f60314aa00c1cb3c0", + "1c1cc3ce80f40f90c088052000500ad3ae7ffb4eb430391ea8300915f8300f16081c63c6181c73c690146f8BL8;FF571740f917fcffb538008052482740f91f0500b121fdff5419008092542340f9b4031df8f40e00b4080d80525a1f40f9fc0300f9fb0f00b9f96301a9f75b02a9L8;FF42008052e96b02", + "f9e86f02f9f77302f9f87702f9980e0094e1bf4bf9810000b4e0bb4bf922008052e31a0094e1af4bf9810000b4e0b34bf922008052de1a0094BBL8;FF8f7140f8a6a31a3886504078907c4039917d4039ad0319f88df140f80e160033f0fd68d3a7831a78123300f883004039897040f802b300f8a2a0c29", + "38af040f8L8;FF2661ff97e80300aae85306f9e0833291a1fdffb021002691a2018052a3fdffb063a0269124018052ab60ff97e15346f9e15306f9e083329161fdfff021203f91L16;FFa083d43ca283d53ce10317ada083d63ca183d13ce20318ada083d23ce10316ad002100b4f40300aae0030b91a0e2", + "ff97e00314aa342300b458010014a2c303d1BBBL8;FF23008052240080525b060094770a40f9680240f9080117cb9f0208eb69fbff54e00313aae10317aae20314aa230080522400805250060094770a40f9680240f9L8;FFe103182a00c03591fbcfff97e80348f9c8f100b4e1ff47f9280080524803003", + "9280040391f050071c1f10054e0074091e14306910274805200800991f8074091BL8;FF092c0039e97b4039ee7f4039083c0039280080520c300039c911092a0b3400390a3800390940003908000039ff830091c0035fd6ff8301d1fd7b04a9f44f05a9L8;FF4801096ae9119f9a5f010e6a0efc4ad30b12", + "8b9a5f010d6a6f1605536d0141b28e010e0a8c01110aad118b9a5f010e6a70fe51d3ae0173b26b1a0653cd118d9aBBL8;FF29194a8b29050091280108ab8300005441000014e80308abe2070054096040b93f05007141010054096440b9290140b22911c0da291540d2290d098b29250191L8;FFe10315aa", + "e20318aaf70300aaf13a009402000014370080527ac240f9fa0100b4fc031baa7bbe40f9e63a0094e0031aaa21008052df3a0094a0de00b4e1031baaL16;FF22008052ecba0094e17740f9810000b4e05f40f922008052e7ba0094b50000b4e05b40f9e10315aa22008052e2ba0094bc0000b4e06f40f9e1", + "031caa22008052BBBBL8;FB717220756e61626c6520746f2066697820656e63617073756c617465312073746f72656420737461746520656e6469616e6e6573730000007419400000000000L8;FF00018052010980522787009400018052010380522487009400018052016c805221870094000180520166", + "80521e87009400018052015a80521b87009400018052BL8;FF81ffffb4a00240f922008052ea0a0194f8ffff17e027c13de8a344b9b47e0853e137c13de063813de89305b921418e3c76000014e89340f9e82000b40805088bL8;FF01fdfff021000d91131000b91f500039f44f42a9f50b40f9fd7bc3a8c", + "0035fd600018052010380521e070094fd7bbea9f44f01a9fd030091f303012af40300aaBBL8;FF341340f9ef4a0194e00318aa21008052e84a0194402000b4e10314aae20318aafa0300aaeb4a01943b2340f9f54700f97b0200b4341f40f9e24a0194e0031baaL8;FF226968f889fdffd029810d9128696", + "8f8e10308aa1f47001408a440a9e20301aae00308aae10309aa4f470014fd7bbfa9fd030091083040f9080100b4080140b2L16;FFe3031baae9030eaaf7af00f9f7ef49a9e1d348a9ee0311aafa8700f9fa0302aae22f40f9f10312aab409001408234039e90318aa1f0d0071c00000541f110071BBBL8;F", + "F84010014e80317aae94f00f90a0d4af85f0109eba2070054090300b0f303042a291140f9690400b4e90302914a0000904a611091e92b0aa9c90200d029a11f91L8;FF42008052ec6a0094682a40f9a80000b4602e40f901f97fd342008052e66a0094683640f9a80000b4603a40f901f97fd342008052e0", + "6a0094684240f9a80000b4BL8;FF3f0c007121fdff5481620091e20313aac1f6ff97800500b5e1031faae8ffff17e10314aae20313aabbf6ff97800500b5e1031faae2ffff17400600b5e00313aaL8;FF6002803dfd7b43a9f32340f9ff430191c0035fd6ff4300d1e0330039e0334039ff430091c0035fd", + "61f000039e80300aae90300aa1f1d00383f2d0038e80300aaBBL8;FFdeffff17e90b41b2e92300a9dcffff17280180d20800f0f2081100d1d7ffff173f00156b81f7ff54680240f9e0031faa090540f90a0140f9290100cb4a01008bL8;FFe10309aa58270014fd7bbda9f65701a9f44f02a9fd030091f30", + "302aaf50301aaf40300aae72a0094e00313aa21008052e02a0094600100b4e10315aae20313aaL16;FFf44f04a9fd830091f503012af40300aaf30308aaebaa0094000580522100805236008052e3aa0094c00b00b40805805216000039e1230091e88300a9800240f9BBBBBBL8;FB63642f303639353962", + "342f7372632f76312f756e6368756e6b65642f73656e645f63742e72730076656e646f722f6c69627369676e616c2f727573742f70726fL8;FF299b0094e0230191e183079102308052f09e0094f42340f928008052f51f40f9933240b9e123019102308052a0220091a80200f9e79e0094b38a01b9e1031", + "4aaBL8;FFe00313aae10316aae20314aaa3020094760a40f9680240f9080116cb9f0208ebe9f8ff54e00313aae10316aae20314aa9a020094760a40f9c1ffff17fd7bbda9L8;FFc0000054e017c03da0e300d1e003803d7bf8ff9703000014b90180d21900f0f2f7031caaf8031baae003c03d280080529a", + "6600a9976201a9951200f98082823cBBL8;FFdf0600b100040054e00317aae10316aa22008052e85e0194e00313aa1f000094680e40f91f0500b160000054e00740f9e5e2ff9760820091e1430691022a8052L8;FF3c000014e8c31791e00313aa765a009469624039a8fdffd008bd3291ca028052e80b03", + "f9f5fb45b9ea0f03f948fd60d3fcfb42f9e9231839b47e0853e0c2c13cL16;FF600400542800805228692a3848050091680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd6f50300aae00313aa22008052230080522400805290020094610a40f9BBBL8;ZBL8;FF427b0094e0fdffb000403e913f7b0094e0f", + "dffd0008010913c7b0094e0fdffb000803d91397b0094e0fdffd000c00e91367b0094e0fdffd000000891337b0094BL8;FF600240f922008052ebfe0094e00313aa0103805202018052f44f44a9f65743a9f85f42a9fd7b41a9ff430191e2fe001428008052bf0a00f9bf2200a961420091L8;FFfaffff17", + "220040396200003421040091fdffff17200000cbc0035fd6000000000000000000000000000000000000000000000000000000000000000000000000BBL8;FFe11f40f93f0100721b119f1aa82303d1fd020094a88353f80083c03c0183c13c1f0900b1e08704adc1080054e03340f9e11340f9a82303d1f", + "b3b00b969f7ff97L8;FFe84740f91f0900b1c13c0054682a43f9e0830f9161e21391022b8052175501b9683642f9754242f908e940b9684a06b9e83e0094e1830f91e00315aafcdefe97L16;FF6283ca3c685f40f9e07f813d6083c43ce183813d6183c53ce287813d6283c03ce06f813d6083c63ce17381", + "3d6183c13ce25f813d6283c73cfabb42f9e077813dBBBBL8;FB11ce00003f332563ff46b0582749c6e6f794d196024be482bdb40f826bea9651aaf507e25709d5d09b84081a4ed735daf8a2296006a897900b70265932f53743L8;FF41008052eb8e0094e07a00b4f80300aaec8e00944000805241008052", + "e58e0094207a00b4f90300aae68e00944000805241008052df8e0094607900b4fa0300aaBL8;FFe05706f9e80b41b2c9000014c80080d20800f0f2080500d1c5000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f919150094e10300aae15306f9L8;FFf30302aa080102cb9f0208eb08020", + "054b40200b4f50301aaf60300aae90e0094e00314aae10313aae20e0094800200b4e80300aad5a200a9df0200f9f44f42a9BBL8;FFc8220091a0039d3c464b01946083c03ce89b40f909008092610bc03de03b803de043803de03bc03de88b00f9e87b00f9681200f90800f0d26182823c6006803dL8;FF0", + "800098b080500911f0109ebe81b00541401001497010094080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f0008eb29210054L16;FFe6e300f908008092ee6b40f9ebf300f9fb0311aaf10300aae7af00f9e70316aae00319aaf4031eaae6030caaef8f00f9ebb344a9e87", + "700f9f9fb42a9fc4340f9BBBL8;FFe0830091f40301aaff0700f9e00701ad4e6b0194a2035ef8820900b5800640ada08300d1a0073fad476b01941f040031200a0054f40f40f97600805208000014L8;FFe86301f9e9cb02b9eacf02b9080380d20800f0f21a1100d1e9d342b9204bc03d8101c03de88f01", + "b9e94303b98041883c8021c03de95343b9811d803d8182823cBL8;FFe1031faa2823189be90f40f92a0700910001803d090900f98a0a00f9beffff17800400b5e00313aa9ffbff97e80301aa40010036e80400b5e1031faab6ffff17L8;FFe30000343f000039007d20d4f55b42a9e00301aafd7bc5a8a2f", + "dff1763825fb8e0ff9f527f00006bedfeff54606c1c53e101809220c020cb6102008b766a60f8BBL8;FFe1d342f9e8cb42f9f97b49f91f0101eb40370054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9450c0094fad342f9e8cb42f908011acbL8;FFd2290094e80356b9e007409", + "18100805200001891ff0316b9e80b00b9cb290094e0074091f90356b98100805200001891ff0316b9c5290094e0074091f60356b9L16;FFedae0094e10b40f9810000b4e00314aa22008052e8ae0094f44f54a9f65753a9f85f52a9fa6751a9fc6f50a9fd7b4fa9ff430591c0035fd622feff9042c03891B", + "BBBBL8;FB3d0f4000000000004a00000000000000b60200000900000042024000000000006a00000000000000550100002a00000042024000000000006a00000000000000L8;FFad194e8bbf010cebe30100546b0500f1ec030daa81feff54a90109abe2000054200108ab62010054fd7bc1a8c0035fd6e9", + "0309ab63ffff5400feffb000400d91BL8;FF080c47f81f0500b1c1dcff54e8031faa080113abe307005400ffff90008037913a130194f3031faa088c48f81f0500b1c1dfff54e8031faa080113aba3060054L8;FFe0eb00b9a04700d186c4ff97e0e700b9a04700d183c4ff97e0e300b9a04700d180c4ff9", + "7e0df00b9a04700d17dc4ff97e0db00b9a04700d17ac4ff97e0d700b9BBL8;FFfa674ea9fc6f4da9fd7b4ca9ff830491c0035fd660fffff000a4219162fffff042202291c103805225530194ff8306d1fd7b14a9fc6f15a9fa6716a9f85f17a9L8;FF0805088be00313aa0201805201f17dd3e9560094e06", + "3c13de167c13db47e0853e8a345b93c008092e00718ade82303b9e00758ad955e1833e82343b97c0300f9L16;FFe0d7c23de8b345f909008092690200f96082803c680e00f9a5000014e8030091418300910228805200810091fc030b91e8d60094fa4340f9e8b345f9e0d7c23dBBBL8;FF21603f91a3fff", + "fd063743f91e0230091a200805244028052c9ffff17890080d2a8831d38480080520900f0f2a8931d38a0c300d128017fb2a8031df8177d0094L8;FF09692138ead302f9b02b0094e1431691850f0094e09b49f9800100b4e1d342f9e8cb42f91f0101eb008f0054e8cf42f9090180522a04009109692138", + "e1431691BL8;FFa500001460220091f30b40f9fd7bc2a8bd00001460220091d700009460220291f30b40f9fd7bc2a8b2fdff17610640f9810000b4600a40f922008052def60094L8;FFfd7bc1a8c0035fd6000080d21f000039007d20d440d03bd5009002d1c0035fd6c0035fd6fd7bbea9fd030091f3530", + "1a9330000b0340000b073be40f994c240f9BBL8;FF008542ad0201c73ce277813de06f813de173813d018141ade807409108810991e06b813de167813d2f8e0094e83349f94083c03ce93f49f91f0500b1e01b843dL8;FFc80240f9a80000b4c00640f901e97bd302018052e8360094e00316aa010980520", + "2018052e4360094e0831591e1831a9102288052e7360094e0831f91e1831591L16;FFe0831d91e1c31591fcbb02f9f7c302f9e9bf02f9eb8b05b9ec8f05b9e8cb02f9db180094e0b343f91f0400b1200f0054eb831d91f7430d91ed031baa681142f8BBBBL8;FBbb1240000000000038000000000000005b", + "00000009000000bb124000000000003800000000000000530000000d000000bb124000000000003800000000000000L8;FF290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff5400feff9000e010913783009400feff9000e0039134830094e0fdffb0BL8;FFc082c73", + "ce9a344f9fbbf01f9f5c301f9f7c701f90001803de9d301f9e0234ea9e3031f2ae16340f9e22340f9081940f900013fd6e03b02f9e8031691e13f02f9L8;FFe82f00f9e8661a9bf70600911b0140f97f0700b1a010005416d140a9740f00b48906148b1c1140f93aed7cd3fc0700b47c16f8b7080d40f9fb", + "5b02a9dba20091BBL8;FFffe70ca9ff6f00f9c1620091a20301d131cbff9760f5ffb428000014e81341b948000037f98b00f9c1920191a20301d138ccff9760f4ffb44c000014e87340f9L8;FF1a0380d240fdffb000b82f9108210091e1430691ea2f19a9e90702f91a00f0f240430094e81f40b9e80306", + "39e10740f9c1f7ffb527feff173c008052e8430691L16;FFe06700f9e00302aae22f40f9e9eb00f9e98b40f9f73b00f9f70301aae9b700f9e9c740f9fed300f9fe030faaef0319aae92311a9f90306aae6031baae9e342f9BBBL8;FFfd7b47a9f34340f9ff430291c0035fd6ffc305d1fd7b11a9fc9300f9", + "fa6713a9f85f14a9f65715a9f44f16a9fd4304915a2040b9f60302aaf50301aaf30300aaL8;FFe0030baa61000014e10300a9e00301aae10309aa22008052f4030baad7050094e10340a9eb0314aa2aa040a9290040f90dfc6ad35369283808050091280800f9BL8;FF40fcffb4610000143f0c007160fbf", + "f543f100071c100005481620091e20313aabdf2ff9720fbffb452000014e20313aa230c805246edff97e10300aad4ffff17L8;ZDBBL8;FF611e40f9e10100b408068052606a68f822008052f44f41a9fd7bc2a8e6260114610a40f9e10000b408018052606a68f822008052f44f41a9fd7bc2a8de260114L", + "8;FF22008052ec260094f3ffff17686640f9c80000b40805088be00314aa0201805201ed7cd3e426009474d64fa9350200b49682009104000014b50600f1d6c20091L16;FFe0c3c33ce1c3c23ce2c3c13cf14f40b9e18100ade201803df1490629efc1019121fbff546801088b08050091290308eb410200", + "54f50302aaf80300aaf7031faaBBBBBBBBL8;FB20c0002173707172206e65676f74696174696e672076657273696f6e20646f776e20746f20c0001b737071722076312e73656e645f63742e726563762065706fL8;FF201600b409488052a10241ada20e40adf90300aae9c301f9e92b40f9480080520100", + "01ad1f0309eb020c00adff0f01f9ff0b01f9ff2701f9ff2301f9ff3f01f9BL8;FF262a0094f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aa1d200194a00100b4f50300aae1230194L8;FFf4030caa87000094e10340a9ec0314aa2aa040a92", + "90040f90bfc63d35369283808050091280800f9cbfdffb43f0108eb93611932a00300540cfc6ad353692838BBL8;FFf85f14a9f65715a9f44f16a9fd430491e24f00b9b40040f9f60307aae52f00f9f503042af903032aa93340f9f703012afa03002ae82300f9e92b00f9140100b4L8;FFe10313aa88fcf", + "f97760a40f9680240f9080116cb9f0208eb48060054680640f9e10315aae20314aa0001168be9630094c802148b680a00f9f44f43a9f65742a9BL8;FFe90300f9e003009124eaff97f44f47a9f65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6170080923800805219018052a80640f91f0116e", + "b890c0054L8;ZDBBBL8;FB6e64696e674b796265725072654b6579636970686572746578746465637279707400000000000000bb124000000000003800000000000000d900000016000000L8;FF280400917f0600b1e81700f900240054802202916bfcff97080040b20811c0da081540d2080d088b08250", + "19108fd46d30900088b37050091ff0208eba8220054BL8;FF00010054e80313aa4900805209010039fd7b43a9f32340f9ff430191c0035fd6e043c13c2800805268020039e003803d6012803cfd7b43a9f32340f9ff430191L8;FF1f0016eb1700178ba9fdff54040000141f25007101010054f5031f2ae0", + "03152af44f43a9f65742a9f85f41a9fd7bc4a8c0035fd635008052e003152af44f43a9BBL8;FF41ffffb021e038910201805260001fd641ffffd021003091e200805260001fd6ff0301d1fd7b03a9fdc30091090040f968028052290141d23f8d00f12831889aL8;FF4b018052e0031faa4a010b8b29010b", + "cb0a2500a9fd7b43a9ff030191c0035fd6e80741b2e0030091e80300f91b4aff97e10300aa20008052fd7b43a9ff030191L16;FFe1032b910232805200410091f4032b91f0c30094e87740f981220091023180520aa540a90081c03da0039d3cea4700f9e96b00f90aa541a9e0f7803de9e700f9BBBBL8;F", + "B6c6c206c6f7765722076657273696f6e7300000000000000bb114000000000004700000000000000b101000012000000bb114000000000004700000000000000L8;FFe81b00541401001497010094080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f0008eb29210054f3", + "0b40f9fd7bc2a8c0035fd6BL8;FF090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d3L8;FFf60300aa21c00e91f2130094ed130094008c815221008052e6130094605c00b4e1074091028c815", + "2f90300aa21401d91e813009408c48052e00316aa01c48052BBL8;FFe00317aa99d7ff97e003c03d08008092685a00a96082823cf44f4da9f75b40f9f6574ca9fd7b4aa9ff830391c0035fd6e88343a98082c23ce92f45a9ea2740f9L8;FFe9a344f9fbbf01f9f5c301f9f7c701f90001803de9d301f9e02", + "34ea9e3031f2ae16340f9e22340f9081940f900013fd6e03b02f9e8031691e13f02f9290c40f9L16;FFe103002a9e390094e203012ae103002a9b390094e203012ae103002a98390094e203012ae103002a95390094e203012ae103002a92390094e203012ae103002aBBBL8;FFe20313aa36a001915cfdf", + "f97b5a201f1e10316aa41ffff54887e40f91f0500b1c0100054610a40f9680240f91f0101ebe0300054680640f9981241b949098052L8;FF00011a8bf3730094f90b40f94803188be8d302f9df0600b14064ff5481620391e2431691400080523d1000941dfbff17e8031faa000119ab224e0054e1431691", + "BL8;FFf4031faaf5ff03a92911c0da490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f60300aa080014ebL8;FFbf0200ea41040091e0179f1af68602a9f52600f93e000014c81a80d2000080d2010000d4e20300cb160700d15600168ad6020", + "08b36cc01f9d606188be00316aaBBL8;FFe90740f9682200f96a2603a9f31340f90800001408008092681a00f9f30742a9810000b4e00740f922008052e2330194a80600d11f0900b1e823931aa8000036L8;FF60fdff9000a01a914430009420008052e1031aaa2430009420008052e10318aa21300094e", + "16b40f9200080521e30009400018052e10315aa1b30009420008052L16;FF4183c53ce313813de20f813df52342f9a203953c4283c43ce10302ad4083c33ce00b01ad1d0000148862069189565ca9806ec03d0101c03de083029188d640f9BBBBBL8;FB64657220636861696e206b6579696e76616c69642", + "073656e64657220636861696e20707269766174652072617463686574206b65796d75737420686176652062L8;FF14e37a9218174092e20000b4e89b40f960020191e10317aa0801028be89b00f924980094e0430391e102148be20318aaf83f0439e79b0094f90b40f9e08749adBL8;FFc20000540a7c06", + "53090500394a051a320a010039e0ffff17ea0f80120b7c10530a2c0633eb0000350b7c0c530a050039090900396a091b320a010039d6ffff17L8;FFbb0000b4e0031aaae1031baa22008052e91b0094280340f9fb074091fa4313917b431d91090141d21f0100f128459f9a1f0500f1cc140054c82100b50", + "0e4006fBBL8;FF6e210094a08302d1e143029102048052da1d0094a80356f81f0500f120030054c082c63cc182c73cc282c83c600604adc082c23cc182c33c622a803dc282c53cL8;FFe80b41b2c9000014c80080d20800f0f2080500d1c5000014c80080d2e0a33239e08332910800f0f2ffa73239e8530", + "6f91a62ff97e10300aae15306f9e0833291L16;FFf34340f9ff430291c0035fd6420200b4432440b97f040071e8020054481840b9a8030037e801805214000014e003c03de80b40f9090080926082803c680e00f9BBBL8;FF810000b4601e40f922008052ea7b0194614a40f93f0400b140020054810000b", + "4604e40f922008052e37b0194615640f9810000b4605a40f922008052de7b0194L8;FFff3309f9e83b09f9ff3f09f9ea4709f9e85309f9e95709f944780094f6ef47f9e01bc43de11fc43de0431691e8036179e1833791023f8052e057813de15b813dBL8;FF0904003909819f1a0a0000396ac10011cb01", + "0d0b29114c0b0a0800396ac100118b0d00122c0c403929c100117f2500710a0c00390910003909819f1a9f7d0271L8;FFe10315aac80c00343504009128023837770a40f9690240f9f603082a280117cb1f0116eb63080054680640f9e10315aae20316aabb02168b0001178be5fbff97BBL8;FF4e380114", + "ff8301d1fd7b04a9f32b00f9fd030191f30308aae8230091c6380094e82340391f050071a1010054e94340393f0500716c0400540b0180d2ea474039L8;FF4ac141391f0500b1e96b0aa909018052686100d1eabb00b9e9eb01f9eb2308a9ffef01f920380054698640f9684242b9e87f00b9e96b00f9a90", + "a00b4758240f9L16;FFec03162aeb03152ae90314aaf9031f2a7b3e00b41a008092e00309aaf5031baae94b00f9e9040014c10000b4f40300aae00316aa22008052dfbb0094e00314aaBBBBL8;FB5e790d0e7026764ed9ccd4c2a4e4d2aa0b66dfa47b40a9eaa28c7add265b7930928400006dbe567c6ed0", + "d7cb8272c358661d9f9e6fe7607682d223172e1b28e2L8;FFc97a73780a7973784901094a09793378b50a00f173060091c0daff547f0214ebe3feff54e84b41f9d77a73789f0208eb20010054e84f41f91779347894060091BL8;FF08c52991e96306f9290080d2e87b06f9c80480524942c0f2ea7f06f90", + "a078052ff5306f9e85b06f9ff5f06f9ea6706f9e87306f9e97706f93c080194e1fb44f9L8;FFf35341a9c3ffff17e0230091e10315aae20314aa2300805224008052f30308aa80e8ff97e80313aaf35741a9c7ffff17e0230091f30301aae10314aae20315aaBBL8;FFf8df42a9e82340b928f70737e8074", + "0f9080116cbff0208eb08190054970100b48002168be10318aae20317aae94b0194d602178be00318aae10317aa22008052L8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8bL16;FFe8", + "2f44f9ea3b44f9e82701a9e83744f9e93344f9e84300f9e83f44f9e8a706a9e84344f9e94f44f9e8ab03a9e84b44f9ea5f44f9e87b00f9e85344f9e8d300f9BBBL8;FFe123009128070091e00315aae80f00f9d6f1ff97f70f40f9e80740f9080117cbbf0208eba8070054e80b40f9e10316aae20315aa00", + "01178be66b0194f902158bL8;FF606a68f822008052f44f41a9fd7bc2a8e96b0014604a40f9a00000b4614e40f9610000b422008052e36b0094611240f9810000b4600e40f922008052de6b0094BL8;FF810200ad10000014e88340f9e00314aae80700f9a6f3ff970800f0d2965e02a9886200a9e80740f", + "9992201a9e8c303910081c23c8002833cf8031baaf9c30391L8;FF40feff541f0102ebc80100542a0400d120008052080100b44b696838010500d1e80301aa7f01096b61ffff54fd7bc1a8c0035fd6e0031faafd7bc1a8c0035fd6BBL8;FF090080920800f0f2692200a90d000014e08745ad08008092e23", + "7c03d680200f96082803c6182813c6282823cb90000b4e0031aaae10319aa22008052de2b0194L8;FFf50300aaef2b0094e00313aa2100805236008052e72b0094c0feffb40801805208000039f40000b4f60300aa00040091e10315aae20314aae62b0094e00316aaL16;FFe1031aaae2031aaa3ea80094", + "40feff9000402b9123feffd063801b9144feff9084002c91a24700d1c102805226a80094e0031391017880520210805223008052BBBBBBL8;FB6465782e6372617465732e696f2d313934396366386336623562353537662f736f727465642d7665632d302e382e31312f7372632f6c69622e727300c0202", + "044L8;FF56008052ffef00f9e88307911323179b680240f988fdffb5efffff173f4100f1011c0054e08703a9e69f00944000805241008052df9f0094002300b4f40300aaBL8;FFe80740f9f30301aac80000b4e00b40f9e10308aa22008052e71f0194e10313aae81340f9c80000b4e01740f9e10308aa22", + "008052e01f0194e10313aae81f40f9L8;FFe01bc03de10bc03de81b40f9e10740f9a0839e3ca1039d3ca8031ef8810000b4e00b40f922008052e31f0094a0877eada8035ff8960200f9881600f928008052BBL8;FFe20180522402805292ffff17e80f41b285ffff17c812009183ffff17e0e31591e8bf02", + "f9eac302f92e5e0094fd7bbea9f44f01a9fd030091f30301aaf40300aaL8;FFe8230b3949008092880240f9690300f9680000b4e00313aa00013fd6810640f9812101b4820a40f9e00313aae25f009408090014f7c31791e82746b9f50346b9L16;FF3aedff17e8031faa94fcff35e003088be10313aa35e", + "dff9775fdff34610a40f9680240f91f0101eba0020054680640f9090180522a040091e003152a6a0a00f9BBBL8;FB01010101010101010101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L8;FF22008052230080", + "52240080529ba3ff97e11740f99cfdff17f30300aae063009122008052230080522400805293a3ff97e11740f9e00313aab7fbff17e0630091BL8;FF1f0500f1e0179f1ac0035fd6e0031f2ac0035fd6fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091f50305aaf40304aaf90303aaf70302aa", + "f80301aaL8;FFc0035fd6e2001836260040f987805ff8060000f9a7801ff8c0035fd61f2003d5c2001036260040b988c05fb8060000b9a8c01fb8c0035fd6020100b44efc41d3BBL8;FFa0031cf841ffffb021ec039143ffffb063380491a00301d162028052e4008052ad450094b8035cf8b7a376a9bce7", + "73a9a10375a9e83700f9ba2378a9b80300b4L8;FF703202f9694a02f96c4e02f96e5202f9775602f9f15300f97fca13393f00001448431c2afa0316aaf65f40f9ea6b40f9eb5740f9f9430891088308aafc432a91L16;FF6283c33ce067813d6083c53c1f0500b1e26b813de16f813de073813de363813d0", + "06a00546083c33c6183c43ce0831d91693740f96283c23ce1030e91e0871dadBBBBL8;FBa28cd01d49fb00008e502bac2cb119e16cc6462b3be9f5da491bdd5bb2c66e4223cee145a6cc973c07ac77dcd4bb4c693dd712bd0e6bfa26afed655bdac64fb2L8;FF428c0094fd7bbfa9fd030091082440f9080", + "100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b1400400540a1440f9BL8;FF08018052bf5b38a9b67f3aa9bf233ba9bf6b3ca943eeff97e03100b5a0077eada8035ef8f3cf45f9e88306f9e8c745f9e03b833da00b7cade13f833d7f0208ebL8;FFb6c300d1", + "f53f00b935bbfe97a8035df8c082c03cc182c13c1f0900b1a0873dade1050054a0877dade0030191e00702adbb0bff97f60300aaf70301aae8f30091BBL8;FFe123803df9ff4039c182c03ce10b00adc282c43c020119cbb80202ebe20302ad02010054e002198be10314aae20315aae84f01942803150be", + "8ff003920000014L8;FFc2030054280108ab42040054091440f9090300b40a1040f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191L16;FFec2744f9ef3344f9fc3744f9e8c300f9e8d343f9e73b44f9e03f44f9e64344f9fe4744f9e8ab00f9e8d743", + "f9f54b44f9fa5f44f9e56344f9e46744f9e92312a9BBBL8;FFe80f41b2e80700f9e023009123760094e90300aae90700f9a1ffff9021203f91a3ffffb063c00791e023009102028052e4018052a8750094e00740f9f44f4ea9L8;FFe00313aaf7070094e80300aae8070036e00301aaf44f45a9f52340f9f", + "d7b43a9ff830191c0035fd68000805206000014e00313aaeb070094e80300aae00301aaBL8;FF21010054800900b5e00313aaa6fcff97e80301aaa0050036e80900b5e1031faadaffff17e20313aa230c805248f6ff97e10300aaa0faffb4caffff17e00900b5L8;FF21cc7492214000d13f0002ebe0279f", + "1a0800001463141a127f003f71a1f9ff54001040f91fcc74f22101005420008052c0035fd620cc749200fc44d3000400d1BBL8;FF62670054e14316914f0d0094df0600b18000005480220291e1431691da1200943f0700b1f90b40f9c07cff5401230491c4000014e8031faa00011aabe2650054L8;FF09", + "0180d20900f0f23a017fb2e91f4092fb0309aaa1035df8615800b5c60200141f09007101050054090180d208df78920900f0f23a0140b2091f40921b0109aaL16;FFe8c300f9ff230639e827009460864ead80a2019168fa40f9e103009102328052800602ad60864cad883200f9800600ad608a4dad800a", + "01ade6af009460220091BBBBBL8;FB697479206b657900bb124000000000003800000000000000490100000a000000bb1240000000000038000000000000004a0100000a000000bb12400000000000L8;FF21dc0291a202805222940014082440a9e20301aae00308aae10309aa52940014000040f946940", + "014000040f949940014090040b9e80301aa0afefff04ae13a91BL8;FF290d098b2925019129fd46d30801098b130500917f0209eb09290054088c48f81f0500b1802000544a030094080040b20811c0da081540d2080d088b08250191L8;FF0000803d08e000f8c8028052e8bb00f9e16b42f9c10100b4e0", + "031baaf7c700f9f70302aa22008052fb0309aaf9031aaafa030caae0170094e20317aaf7c740f9BBL8;FF20010054808640a9a85300d1a0d3de3ce003803dd7530094b7c35e38ff0a00712101005408008092680200f9f44f47a9f72b40f9f65746a9fd7b44a9ff030291L8;FFa00240f922008052eb5700", + "94f8ffff17e027c13de8a344b9b47e0853e137c13de063813de89305b921418e3c76000014e89340f9e82000b40805088be00313aaL16;FF98fe71d319693538d51a0091750a00f998faffb4680240f9f9621932bf0208eb61000054e00313aae6d20094680640f997fe78d319693538d51e0091750a00f9", + "BBBL8;FFe02300914b290094e80b40b9681a0037e80f40f9ea0640f9490108eb43290054ea0240f9e00b40f94801088be82600a9680240f9080540f9170100ebe2000054L8;FF950e00b47622009104000014b50600f1d6620091e00d0054c1825ff881ffffb4c00240f922008052e3770094f8ffff17600", + "20291b10b0094e807409108810991BL8;FF1a030094e00313aae80300aa090d48f83f0500b1a0000054f30300aae00308aaae000094e00313aa145c40f99f0600b1c0f4ff5413544ca9950100b476220091L8;FF12000014732200917f6200f180010054a000138b000c407960ff2f36080780d2600c8092", + "e2830f32010000d4c0feffb6000080d21f000039007d20d4b5221d91BBL8;FF49ffff9029410491e84b09f928ffffb008213e91e94f09f9aa0a8052a04700d1e85b09f9e807409121800991e93709f929ffffb0294d279108c13591e94309f9L8;FFc80080d20800f0f2e84b05f9233eff9770000014e04b", + "05f9e0432a9121fdffd021203f910202805263fdffb063401d9184018052e3000014e04b05f9e0432a91L16;FF8006005448ff70d349ff60d3eac313915a9100b8fa4f40f9e8ff1339e87740f949d10078e9034ba9e88702f9e88f02f9e8eb41f9e99702f9e93340f91f0500b1BBBBL8;FB9f1b400000000", + "000340000000000000037010000220000004d414320766572696669636174696f6e206661696c656400a71a4000000000003400000000000000L8;FF290d4092ff0209eb49258a9a1c0940f93f0118eb809349fa82feff54f552199b687a77781b05c05a9c0200b4a80640f909091c8b2ac15f781f030a6b", + "ea979f1aBL8;FFfc6f41a9fd7bc6a8c0035fd6404fc03da80359f84003803de8f304f9e89740f91f0500b121f7ff54baffff17e89348b9208757adf7e342f9a00302d1e1031faaL8;FFc0030054081d403908c100511f250071e85300544a018052f6030daae1030eaa29210a1bef0310aa287d60d3a8020", + "037bf020014e9031f2a4c018052ea0100b4BBL8;FFec434039692e01a9eb024039e91240b8681e007968111d126aa200b8ea72407868860039e8524078eb7e40396c820039ec7241f8684e0079e89240b8692202b8L8;FFe11b40f9e21340f9e843069163a303916423039185830091e00316aa060480522", + "5f0fe97facb40f9e86346395f0b00b161100054f7430f9108150036c08641a9L16;FFe0031aaae10319aa22008052eac70094e87740f9f48f00f9002100911ecfff97ebfb40f994008052f53300f9f6f300f9ed03001429a041a9e003099135f040a9BBBL8;FFf4670194e82300910083009146640094f80", + "f40f97801f8b6fc031faae0031caae10318aa2064019437008052e8230091008300913c640094f80f40f9f8feffb7L8;FF0101f8b7e0031faa4a050091290500d10a2500a9fd7b43a9ff030191c0035fd63f2900f1880000544b01098b6bf1df388b0cf8374b05c0396c1d00128c611953BL8;FF81010054", + "e00302aaf30302aaf40301aaa5f4ff9720020037750240f9a80640f9160101eba2020054e80f41b207000014890080d248008052e02300390900f0f2L8;ZDBBL8;FF448948adec030b91408541adf81f40b9e95300b94231803d02c1853c438942ad01c1823c00c1813c02c1843c03c1833ce80b40b94005", + "04ad418147ade8a700b9L8;FFfd7b48a9ff430391c0035fd6ff8301d1fd7b03a9f52300f9f44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054080200341f05007141030054L16;FF8a0200cbe8020bcb69dbb6f24afd44d308fd44d3a96ddbf2fa030baac9b6edf2417d099b147d099b5", + "6b3ff9713020036284340b928060036a9237fa9ea1340f9BBBBBBBL8;FB6c6564202d3e2043743253616d706c6564002f72757374632f343861323239636561656664343938356335303939306231343131366236643835366166303938L8;FFeda10094e003142af44f48a9f65747a9f85f46a9fa6745a9", + "fc6f44a9fd7b43a9ff430291c0035fd648008052e0230091ff0f00f9ffa300a912f8ff97e88340a9BL8;FF08050091280800f92004f8b7e0030aaa26000014e10300a9e00301aae10308aa22008052f4030caa9c050094e10340a9ec0314aa2ba040a9290040f90afc78d3L8;FFfd7b07a9fc6f08a9fa670", + "9a9f85f0aa9f6570ba9f44f0ca9fdc3019109604039690f0037f40308aa182040a9f30300aaa0c300d1028d40a901a3009117130094BBL8;FF26ffff17a0c300d12100805222008052230080522400805257edff97a8035ef891feff17a0c300d122008052230080522400805250edff97a1035ef8f8feff", + "17L8;FFe10317aae20315aadc000094770a40f9baffff17e00313aa22008052d7000094610a40f9c3ffff17e00313aae10316aae20315aad1000094760a40f9680240f9BL8;FFe0031faa72ffff17c80080d2e00700f90800f0f2080900d163ffff17e90b41b2e92300a968ffff17c80080d20800f0f2080", + "500d15cffff17c80080d2e10700f9L8;ZDBBBL8;FB1100000000000000b4010000110000007265757365642062617365206b657900650d4000000000001100000000000000a00100000500000034f8450000000000L8;FF3a8fff97807640f9800100b4e11740f9e80f40f91f0101eb60440054e81340f90", + "90180522a040091ea1700f909692138e16300912d8fff97e00314aa088c4bf8BL8;FF200440a90800009008a13891c2feff9042803591e3030091e92301a927fe0094fd7b42a9ffc30091c0035fd608a440a9e20301aae00308aae10309aa4afe0014L8;ZFBBL8;FFe10308aa583e0114000040f9c53e001", + "4000040f9f43f0014202440a948ffffd0081d3091a2018052e10308aa230d40f960001fd6ff0301d1fd7b01a9f51300f9L8;FF81fdff902120179183fdff9063081891e0230091a200805284018052ae47ff97e00740f941feff17c80080d20800f0f20809009147ffff17ff0301d1fd7b02a9L16;FFe867", + "05f968feff9008e11e91e8a303f940feffb000c42291e8ab03f968feff9008c12291e1032b91e3031d9162008052f86305f9f40310aae9a703f9e9af03f9BBBBL8;FB010005b405960378025a0000035007c0037806e8000006f000140378059c0000689b06f003786d130000688f04b200006c3d0100a52", + "1526fb8ea3c622b414cc4L8;FF2905009129010aabc20600542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9050054280108ab8300005426000014BL8;FFf88332913c000014e8c31791e00313aa750d019469624039e8fefff0089d1f91ca028052e80b03f9", + "f5fb45b9ea0f03f948fd60d3fcfb42f9e9231839b47e0853L8;FFe19340f922008052eb110094e8a340f9a80000b4e0bf40f9e1a340f922008052e5110094e8af40f9a80000b4e09f40f9e1af40f922008052df110094b50000b4BBL8;FFf6575da9f85f5ca9fa675ba9fd7b59a9ffc30791c0035fd660ff", + "ffd00040269162ffffd042e0269161048052294e0194fd7bbca9f70b00f9f65702a9f44f03a9L8;FFf0510094e00316aa21008052e9510094000c00b4e10314aae20316aaf70300aaec510094591740f9b7831ff8190400b4541340f9e3510094e00319aa21008052L16;FFe8bb00f90b2043a9ec6700f90", + "d3058a9e0b3823d1e5051a9ea2f1fa90f4052a9e89300f90a2044a9ed6f00f91b3459a9ec5f00f9e8cf00f90b2045a9e8c300f9BBBL8;FF6dfeff17e00313aa22008052230080522400805258fdff97610a40f972feff17e00313aa22008052230080522400805251fdff97610a40f978feff17e00313aaL", + "8;FFe8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aad7100094fad342f9fc0740919c8301913ffeff17e043169122008052d0100094e1d342f9BL8;FF2300805224008052f4030caa9b150094e10340a9ec0314aa2aa040a9536928380bfc71d308050091290040f9280800f94bf2ff", + "b4ddffff17e10300a9e00301aaL8;FF4210422a4220422a4240422a46040011c200220a427c051b427c1b5399486238e20303aa3907005139771e5325070011240b001163d865781f0003eb9980991aBBL8;FF948209911f0500b18000005480620391e143169166130094e8bb49f91f0500b100bdff5481", + "420491f0010014e1d342f9e8cb42f91f0101eb807d0054e8cf42f9L8;FF94021891290c40f9e163179120013fd6f6034bf9df0e00b18104005488008052a2ffff17f46b40f9e807409108011891e00314aa6c2d009488624039fb034bf9L16;FF410400b4603640f919000014600640ad682e40f9e90a40f", + "9e502c03d620ac03d6382c43ce82b00f9641ac03de93700f9683a40f9611a40f9e583853ce08700adBBBBBL8;FB5b000000000000005200000009000000560b4000000000007500000000000000390000002e000000cb1440000000000072000000000000001100000026000000L8;FFe8830091e00315aa", + "e10f00f9120f0094e81340f91f0900f1e0040054e1830091e00313aa02328052ea990094e10740f9410300b4e00315aa22008052ffc30691BL8;FFfd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f909", + "1440f9L8;FF4183c93c6083873c4083ca3c6183883c4183c33c6083893c4083c43c6183823c4183c53c6083833c4083c63c6183843c6083853ce00755ad62838c3ceabb0bf9BBL8;FF22008052ec590194816e40f93f0400f18b000054807240f922008052e65901948002039162ddff9708018052802201", + "91955a09a99f220ca908048052955e0aa9L8;FF21008052eb590094a06c00b4880c8052a9fdffb02961209108400039c80080d22001c03d0800f0f2e9f35639e06302f91c490091280280520000803dfc5b02f9L16;FFc5e5ff9760faffb4b6000014a01900b5a0c303d1a4e6ff97e80301aac000003688f", + "9ffb4cd000014e1031faae88701b9c9ffff17e1031faae88b01b9c6ffff17BBBL8;FF4b692838080500911f0048f1280800f9a202005400fc4ed354000014e00700f9e00301aaf30301aae10309aa220080522300805224008052f4030b2a4e050094L8;FF081540d2080d088b08250191481b488b080500", + "9114000014280080525f0700b1ffcb02f9e8cf02f9ffd302f980100054e0431691e1031faa22008052cf180094BL8;FF0a028052e90314aa696a2af8680200f9f44f41a9fd7bc2a8c0035fd6ff0301d1fd7b02a9f44f03a9fd830091080840a92b04009189008052f30300aae0230091L8;FFa083dd3ca88", + "35ef8e91b40f9ff0300f9e083803ce80f00f9c90200b517000014e003152ad60c0094e8830091090000b029b10091a8273fa9e8030091a1fcfff0BBL8;FFf4c30091a18200910228805280820091f0390194e95b40f9e067c03de8d340f9f71b00f93f0d00b1e083833ce82700f94101005428008052ff06", + "00f17f7e01a9L8;FFa88317f8ca1000b5e0831f91a162009102288052ef390094e0831a91e1831f9102288052eb390094e0831591e1831a9102288052e7390094fc031faaf7031faaL16;FFe10314aa213300b59a010014aa0100b4f50300aae0031caaf40301aae1030aaa22008052f6030daaf7030eaae", + "2b90094ee0317aaed0316aae00315aae10314aaBBBBL8;FB484d41432063616e2074616b652061206b6579206f6620616e792073697a650085094000000000004d0000000000000018000000260000004132424232410000L8;FF36fd44d3370d409219038052e80303a9ff2300f9e90f00f96953199b7f0", + "317ebe8031baadc26969a290940f93f011ceba20200540961199b1f3d00f1e0030054BL8;FFc80000b40805088be00313aa0201805201f17dd3e8090194e063c13de167c13db47e0853e8a345b93c008092e00718ade82303b9e00758ad955e1833e82343b9L8;FFe80f00f9540300b4e10f40f9e80740f9", + "b51e40f91f0101eba00d0054e80b40f9490480522a040091e00314aaea0f00f909692138e123009186e5ff97f60f40f9BBL8;FFfc6f58a9fd7b57a9ff430791c0035fd620008052e10315aa2346019420008052e10318aa2046019420008052e1031baa1d46019400018052e10314aa1a460194L8;FFffa7", + "00a929008052eaff01a9e9230a2946460094fd7b47a9ff030291c0035fd6ff8301d1fd7b03a9f52300f9f44f05a9fdc3009143010034081c0012f30302aaL16;FFea2313a9e86742f9ea7742f9e8af01a9e87b42f9eb9742f9e83b00f9e87f42f9e84300f9e89342f9e87b00f9e89b42f9e8d300f9e89f42", + "f9eb230ca9e8b342f9BBBL8;FF602a40f922008052eb69019408048052746200b9a00302d168da04a9e3830291e10315aa682e00f9330080520204805224008052f3830239d6190094b42240b9L8;FFecfeff9760420891f30b40f9fd7bc2a87ffeff17610640f9810000b4600a40f922008052e46900946", + "11240f9810000b4601640f922008052df69009460020191BL8;FFe80300aae00301aa08020037750240f9a80640f9160100eb62020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9L8;ZFBBL8;FFfa6742a9fc6f41a9fd7bc6a8c0035fd6ebab59a93f05007", + "1e89741b92083c13cec030b918033803da10900548031c03de8c302b98b4100f8204b803d8ac100f8L8;FFa00640ad2800805220030291e103069122008052ff2701f9ba020191e0070eada00a41ade82301f9e00b0fad22260094880201d1ffff073902fd47d31bdd7992L16;FFf44f43a9fd7b42a9ff03", + "0191c0035fd6e00741a924a60094ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae02300910401805205038052BBBBBBL8;FB726f6f745f6b6579d41b4000000000004800000000000000c800000016000000617474656d707420746f206a6f696e20696e746f20636f6c6c6563746", + "96f6e20L8;FFff2308a9e87f0aa9ff230ba9e87f0da9ff230ea9e87f10a9ff2311a9e87f13a9ff2314a9e87f16a9ff2317a9e87f19a9f45701a909000014a003de3c39070091BL8;FFe10313aa50fbff97760a40f9680240f9080116cb9f0208ebc8060054680640f9e10315aae20314aa0001168be91d01", + "94c802148b680a00f9f44f43a9f65742a9L8;FFff0600b120090054a88301d1a9eb7aa9bbf37ba90081c23c0181c33c0281c43ce10740f9e20304ade11f803d2b000014baef7aa917008092a003dc3cbc835bf8BBL8;FF5b02805219f17dd30b000014e8bf40f9e10316aae20315aa0001148bed5d019494", + "02158bf4c300f9396300f15a630091c0050054e8bb40f956d77fa91f0114ebL8;FFe02fc33de9f702f90005803de033c33d0009803d9c6300917b0700919f0314eb0071005400e4006f0823059189ab40a9ffa305f9f6a705f9f6b305f90001803dL16;FF9e010094780a40f9afffff17e00313aa2200805", + "2230080522400805297010094610a40f9b5ffff17e00313aae10316aae20314aa23008052240080528f010094BBBL8;ZBL8;FF02738052f37d00949800805211020014f6eb44f953000014e8074091f69b45f900230091088109912acbff97e1074091e0431691026e805221800991e57d0094BL8;FF3f1d", + "00f129318a9a2a0080525f0014eb570909aaa0000054c9fe7bd3a90000b5f716168b10000014f30315aa11000014f80308aae3fd00940005805201018052L8;ZFBBL8;FFf43d0194e00747ada8c302d1e243c03df58b40f914010191e1031f2aa0073cade10f46adb7f35838e02fc03da2039a3cb5031bf8", + "0001178b08108052e21640d2L8;FFc4010014e8ff41f9788242f9fadf09a9f6f741f9f7fb41f9fa0742f9f5230ba9e80342f9e90b42f9f40f42f9757e42f9e86b00f9080340f9e94b00f9680000b4L16;FFe1c31591e06f813d6083c73cf8831d91e173813d6183c23c681340f9e07b813d6083c33ce2778", + "13de06b813d6013c13ce167813de9e31539a091883ce8c702f9BBBBL8;FB36c6254cdb64bb4de8820000000036d9c917000000000000000000000000aa6211b800000000000000000000000000000000000000000000000000000000056bL8;FF010000ad01fdff54f30300aae0430a9102e4ff97e00313a", + "af34f41f9e2ffff1718018052ff0f00f9a9000014f90314aae48d0094e00318aa41008052dd8d0094BL8;FFe85306f925140094e80300aae85306f9e0833291e1feffd021e01291a2018052e3feffd06380139124018052aa130094e15346f9e15306f9e0833291e1feff90L8;FFe10315aae20314aaf20d", + "0094e00316aae10313aaf44f42a9f65741a9fd7bc3a8c0035fd620fdff9000c00291370a0094ff8301d1fd7b03a9f65704a9f44f05a9BBL8;FFf85f14a9f65715a9f44f16a9fd430491480040f9f30300aae10700f9e80400b4490440f9e8a701a908008092e80b00f9bac301d11f0500b1a30c00b488020", + "0f0L8;FF080113aba301005480fdffd0008039913e4a0094e8031faa080113abe300005480fdfff000400291384a0094e8031faa080113abc2010054090140b22911c0daL16;FFe54300f93cd4ff97e7af42a9fe0315aaee2b44a9e54340f9f21354a9f03b40f9f46340f9e61340f9e0bf40f9f78740f9e9", + "cf40f9ecd745a9e3b75ca9fa3f51a9BBBL8;FFa9b317b8ab031af8a8831a3881070054885a40f98b6e40f9a9035af80a1140b8150140390c5140781b7140f81cf140f87f0500b1ea8300b9aa835a381a7141f8L8;FF22008052ec6d0094e9030b91ea0740f9e81740f92015c03df87f00f9eaa30ea9e8934", + "1f98082823ce8bf00f972ffff17c8fdffd008a1199189028052e86301f9BL8;FF3f0108ebe11e005481220091e20313aa75060094f50300aa0d0200143f0900b1a0200054880080d20800f0f2080500913f0108eb0120005481220091e20313aaL8;FFc0035fd6c0035fd6fd7bbca9bf2c40f2fd03009181", + "030054f35301a9f40300aae0f77fb23f0000eba8030054f55b02a9f303032af603022af503042ab3032037BBL8;FF22008052a5110094e1d342f929fcff17e043169122008052a0110094e1d342f954faff17e0431691220080529b110094e1d342f93efcff17e043169122008052L8;FFc94202f8cac202", + "f8addefe972800c0d229008052e01316b9e80f0bf9e8032491e0074091e92316b90904805200001891e8030bf9e8833f91f6074091e9070bf9L16;FFe23f813d8282c23ce027813d8082c33cf40340f9e88302f9e12b813de22f813de033813debad009460220091e1230b9102398052740200f9e6ad0094", + "e0864aadBBBBBL8;FB000000000000000009000000000000000900000000000000903d400000000000973d400000000000000000000000000000000000000000000000000000000000L8;FFa97357384a01084a6b01084aaa531738aa8357382901084aab631738ab935738a9731738a9a357384a01084a6", + "b01084aaa831738aab357382901084aab931738BL8;FF40020054e00313aa52010094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb69010054000114abc2000054f44f41a9L8;FFf9d340f9209d00b4e1074091028c8152fb0300aa21401d91168c8152ed1500", + "9408c48052fa8301f9e88701f9fb8b01f9f68f01f9e315009420c4805221008052BBL8;FF39031a8bb9031cf8ba835bf8e10b43a9e32340f9a0e300d1e40314aae5031aaae60319aaacfcff97a8d37ca91f0900b121060054a1035bf8280019cb1f1d00f1L8;FF4221803d2283c83cebe20891410103ad20", + "83c53c2183c63ce84701f9e8a70691e04341f9400501ad2083c73c2183c43ce9b304f9400902ad2083c33cc282c93cL16;FFe0dfc03de9b701f9e9c341f9e88f01f9e883059108c100914181883c4281893c4001863ce99b01f9572e0094e00fc23de113c23d08008092e21bc23d3a008052BBBL8;FFe203", + "15aa0001178bf2750194e802158b680a00f994a201919f0218eb601e0054610a40f9680240f91f0101eb40110054680640f929040091e00314aa690a00f9L8;FFe1431691880e0094e1d342f9e8cb42f91f0101ebc06d0054e8cf42f92a040091c02202914901805209692138ead302f994250094e143169", + "17b0e0094e08f49f9BL8;FFf30b00f9fd030091010040f9f30300aa810000b4600640f922008052e6f50094610e40f9810000b4601240f922008052e1f50094611a40f9c10000b4601e40f9L8;FF03290091440400f9620240f9820000f9227863f87f0202eb200500547f7e00a97f0200eb200500546042", + "4079002c46d31fbc0071ed070054611240f921cc74f2BBL8;FFe2d7843de273c13de0cb843de06fc13de1cf843de16bc13de0c3843de067c13de86f09f9e2c7843de1bf843de0bb843df41300f980020054e83b49f9080100b4L8;FF090000f029913491e8bb02f9080000f008c13391e85703f9e8830e91", + "6afdffb04aa11391e85b03f9080000f008712991e96703f9e9831a91e85f03f9e8831591L16;FFedb50094e12340f9e90315aae10600b5f4031faa64f9ff17e96740f928dd789267f7ff17e02200911bbdff97e16740f9810000b4e07f42f922008052deb50094BBBBL8;FB6a00000000000000bd0000002", + "e00000042024000000000006a00000000000000190100002e00000042024000000000006a00000000000000ca0000002e000000L8;FF296d0054170117abc2db0054b700f8b6f8031faae00318aae10317aa22820094170800b4e7850094e00317aa2100805238008052df850094e0feffb43f0700b1BL8;", + "FFf43b42f940818f3ce9e304f9680000b4e00314aa00013fd6c10640f9810000b4c20a40f9e00314aae30501947f0b00b141050054e8630191ea9740f9e93342f9L8;FFf3ffff17e80240f9c80000b40805088be00315aa0201805201ed7cd3e60500945f1f00f1c0140054f55243a9340200b4b98200910", + "4000014940600f139c30091BBL8;FF03000014e8031faa292100914a1d409208010aaa69a200a908008092680200f9610000b422008052e3450194680700d11f0d00b1a8000054e0031caae1031baaL8;FFf50b40f9fd7bc3a8eb450014010040f9810000b4000440f922008052e6450014c0035fd6fd7bb", + "ea9f44f01a9fd030091010040f968028052290041d23f8d00f1L16;FFe8032b9108e10591e9af03a9e9c745f90001c03de8d345f9eb0f46f9eaa702a9eacb45f9e91b46f9e8d300f9e8d745f9ea7b00f9eacf45f9e98300f9e92746f9BBBL8;FFab000054609a40f9e10308aa22008052e96501940800801", + "274d612a9749e00f9684201b9f44f42a9f50b40f9fd7bc3a8c0035fd6ff0302d1fd7b06a9f33b00f9L8;FF3f0500b1810000549fde04a99f2e00f99f6200b91f0900f141180054e00313aaf0fdff97e0080036811400b5e0031faa9effff17680240f9080540f9190101ebBL8;FFe80301aa80000036a808", + "00b5e1031faadcffff17e1031faa881a00f9d9ffff17a10a0054e0031faab0ffff1721050054e0031faa9effff17c80080d2e10700f9L8;ZDBBL8;FF689640f9a80000b4609a40f901f97fd342008052e825019468a240f9a80000b460a640f901f97fd342008052e225019468ae40f9a80000b460b240f9", + "01f97fd3L8;FF22008052ec250094611a40f9c10000b4601e40f922008052f30b40f9fd7bc2a8e5250014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9L16;FF000400ad08048052602201a9680600f95affff17d82e40f9880ac05a6b0480920a9300d1779100913f0117eb20040", + "05461a100913f0015eb280900544b2540b9" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines10 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines11.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines11.lean index 0b8c70d2a..0135f49ac 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines11.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines11.lean @@ -27,358 +27,251 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub11 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF1831899a19f37dd314230091930219ab43120054f8000014c806009100e4040f130040f914fd43d31f0940f2ea0313aa8906949a410140fd290500f121a8200eL4;FFfd430091280840f9290040f91f0002f1230f00543f0108eb13601932200100542a0440f91f1040f1536928380805", - "0091280800f94202005400fc47d36e000014L8;FFf44f42a9f50b40f9fd7bc3a8c0035fd6f5031faae00315aae10313aa12200194ffc301d1fd7b03a9f72300f9f65705a9f44f06a9fdc30091160440f9f30300aaBBL4;FFe20313aa24008052e88300390f02009404a00194000480522100805202a00194", - "801300b4e08743adfa0300aaf3031faab5060011190480521b048052000400adL4;FF7f00006bedfeff54606c1c53e101809220c020cb6102008b766a60f8c00a40f93f0000eb80000054000080d21f000039007d20d4c5824039a11000129f00016bL8;FFffc300d1fd7b01a9f31300f9fd430091130040", - "f9e00301aa810100d021441e91e8030091620180524ea00094810100d021101591a40100b084801b91e0030091BBBL4;FF1803008bf9feffb50f0000141f0400b1017800542ae001941f10003181770054f9ffff1727e00194f70300aa1f0400b141fdff54e04305918100805222e00194L4;FB3938352f6", - "c6962726172792f636f72652f7372632f736c6963652f696e6465782e7273003e4e6f7420656e6f7567682062797465732072656d61696e696e6720L8;FFf85f43a9fa6742a9fc6f41a9fd7bc6a8d5dbff17e00301aa190340f909a0c0a90a0c41a90078c03d043c4da9e94700f912184ea9e86b00f90920", - "42a9e0b3823dBL8;FF58600194f402009094422391c10200d0218c2f91e0230091a32300d142018052e40314aab3831ff84f60019468620091c10200d021b42f91a32300d162018052L8;FFf50300aa680240f91f0101eb800b0054680640f9b60a40f92a040091b41640f9490280526a0a00f909692138b", - "60900b4c80240b20811c0da081540d2080d088bBBBBL4;FFe0630191d56101d10800f0f2e82f00f952e8ff97e0630191e10315aa7f9b0094e08743adc282c33ce9ab45a9e83740f9e08701adc082c43ce28300ad05000014L4;FF930a00f9f44f42a9f65741a9fd7bc3a8c0035fd620008052e10313aa120", - "00094f04f0014894f0014c6610014000000009c4f0014000000000000000000000000L8;FFa00300540cfc6ad35369283808050091280800f92c0500b5e0030baa3f0108eb20010054290440f90a050091206928382a0800f9f44f42a9fd7b41a9ffc30091BL8;FFfd7b41a9f31340f9ffc30091c0035fd6", - "080040f9000140f9080040b9080500511f1d0071a8010054691880522925c81a49010036290300d029610f91e00301aaL8;FF0969213825f2ff97e1630091847fff97806a40f9800100b4e11740f9e80f40f91f0101eb40880054e81340f9090180522a040091ea1700f909692138e1630091BBBL4;FFc9f", - "20cf8cb720df8687301f86af30138f299009440030037f7a201f1b5a2019118070091c1fcff54e80340f9e9234039e0031faae81300f9e9a3003908048052L4;FB6f6e5f6964616c6963655f626173655f6b657970656e64696e675f6b796265725f7072655f6b65796c6f63616c5f6964656e746974795f", - "7075626c69633c6e6fL8;FFfd7bc3a8c0035fd6fd7bbca9fc5f01a9f65702a9f44f03a9fd030091ff8317d1ff0300f9f40301aa28ec40f9e20700f95f0008ebe10a005480064dadf50302aaBL8;FF220080520b400194e10f40f9810000b4e01340f92200805206400194f44f57a9fcab40f9f65756a9fd7", - "b54a9ff030691c0035fd6fd7bbea9f44f01a9fd030091L8;FF8c6119538c01210b810102516b00f8374b0080524c0000143f104071c30b00544b09c0396c1d00122c380c0b811140516b00f8376b008052430000143f004871BBBBBL4;FF21682c91230400d063d42c91a0c300d142018052440080520900", - "0014a0031df8210400d021682c91230400d063302991a0c300d142018052840080525e040194L4;FF091d0039e94b41b909210039e94341b909250039e93b41b909290039e93341b9092d0039e92b41b909310039e92341b909350039e91f41b909390039e91341b9L8;FFf32340f9ff430191c0035fd6ff", - "0301d1fd7b02a9f31b00f9fd830091f30301aae10300aae00300912200805219fdff97e1030091e00313aa020480523b100194BL8;FFfc031aaafa03182a384340f905900194e00316aa2100805203900194400b00b4e10318aae20316aaf90300aa09900194f8031a2afa031caafc0317aaf703142aL8;F", - "F42008052b30f00f95790009468a20191610100d021dc1c91840100b084200a91a363009162018052a80f00f94e9000944e900094fd7b41a9f31340f9ffc30091BBBL4;FF000180520146805217d00194ff4304d1fd7b0ba9fc6f0ca9fa670da9f85f0ea9f6570fa9f44f10a9fdc30291130c40f9892489d", - "24992a4f26ae279d32949d2f2L4;FB935d81b3568b8ad008e9a8379fd5846b834dd1b69274d4bb3dd70e6bafeddac63c9ea28cdccbe93f5c86428b000059c77297db5b51cf7f991010f80785b47810L8;FFe9a703f9e9af03f9e8b303f987c8ff970900809288018052f0031caae8270ea9fadb4aa9ef3b4", - "7a9e03740f9f88f41a9f57b40f9fc0748a9e45f40f9f7ef49a9BL8;FFeaff01a9e9230a2916500194fd7b47a9ff030291c0035fd6ff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9692841a9L8;FFe8b304f928210a91e9e32291c082893c4043ce3ce0234d39c2", - "82853ce11740b9e33740b9408708ade42740b9fb6304f9020140ade8031691f56704f9f76b04f9BBBBL4;FFe00315aaea0301aae103142a2b0080526a0600f96b420039e4ffff17fd7bbca9f85f01a9f65702a9f44f03a9fd030091150c40f9f50500b4140040f9f30300aaL4;FB2e00000000000000a900", - "00000e000000484d41432d5348413235362073686f756c642061636365707420616e792073697a65206b65790000ea98480000000000L8;FF40f9ffb4bfffff17a80640f91a0101eba3100054a80640f91f011aeb49080054e00313aaedeeff97000c003728fc60d3e80900b5200840921f1800f1220a005", - "4BL8;FFc0035fd6e10200d0217029918200805246700114281040b96800c8376800d037367001144a7001144a700114281040b96800c8376800d0371d70011416700114L8;FFfb0314aa806dff5440c30391d1000014e8031faa00011aab62570054e1431691c60c00943f0700b1f90b40f9e0070054e1d3", - "42f9e8cb42f91f0101eb40330054BBBL4;FF0a0900b90900f0f2090100f9f44f43a9f51340f9fd7b41a9ff030191c0035fd6ff8303d1fd7b09a9f95300f9f85f0ba9f6570ca9f44f0da9fd430291f30308aaL4;FFff0740d1ff071ef83b008052f30308aaf5031faaf9031faa34008052180082521a02a05", - "21b02a07217008252e1030091e0031f2ae20317aa7f120094000700b4L8;FFa30100d063202591a40100f084200291a21300d121038052a8c31f3815b00094ff4302d1fd7b03a9fc6f04a9fa6705a9f85f06a9f65707a9f44f08a9fdc30091BL8;FFe08332918ae5ff97f5f742f9f4f342f9150500b49642", - "009177028052980200d018b31491060000142200805201300194b50600f1d6c20091c0030054c1025ff8L8;FFffc33191f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6fb6340f91f0500f1f8c30d91c902005468c21191090000d029012191e84b05f9BBBBBBL4;FFe00313aaf44f", - "41a9fd7bc2a809180214f44f41a9fd7bc2a8c0035fd6010040f9810000b4000440f92200805201180214c0035fd6010040f9810000b4000440f9L4;FFa20000d042e03691e0431391e10313aae3008052ff0300f9f80304aa880d0094e86b42f9fb6f42f9fa7342f9f57742f91f0900b141040054e843139", - "1e0031aaaL8;FFf44f42a9f65741a9fd7bc3a8c0035fd604180194000380520101805202180194200400b4880640f929008052600e00f916a400a9080000f968d600a9680200d0BBL4;FFe8d300f908008092e2830aadc082c53cc282c33ce353803de10308adc182c63cc082c73ce9bb00f9e10309ade23", - "f803de0074cade9030091e33fc03deabb40f9L4;ZBL8;FF21701e91e8030091e00309aa22028052549800948101009021101591840100f084801b91e0030091a363009142008052b30f00f94c98009468a2019181010090BBBL4;FFf303032af503022af603012ae50700f9e61300b96daf0094f70301aaa", - "100f8b6f9031faae00319aae10317aa0ed80194b70500b4fa0300aafad70194e00317aaL4;FB2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f686b64662d302e31332e302f7372632f686d61635fL8;FFe04b823de0c7c33de8a703f9e8fb40f", - "9f6b303f9e8ab03f9e8bb40f9f5bf03f9e8b703f9e8ff40f9facb03f9e8bb03f9e8db40f9fbd303f9e8c303f9e8cf40f9BL8;FFc00240f9220080520a580194f8ffff17e80740910881099100210291ed0b0094f4b749f99f0600b100b8ff54f5bf49f9f3bb49f9b51300b47622009104000014L8;FFe807", - "06f9ff0b06f9fa0f06f901430291a22302d1c0f5ff9760dcffb46700001420dcff54c8010014e0dbff54c80080d20800f0f20809009101010014c80080d2BBBBL4;FF00001a9122f80194ff8302d1fd7b06a9f85f07a9f65708a9f44f09a9fd83019109904039f30300aaf40308aaa90100343f0d0071c10", - "70054602241a9090d40f9L4;FB7369676e616c2e70726f746f2e776972652e7273002f72757374632f343861323239636561656664343938356335303939306231343131366236643835366166L8;FFd5ffff17880240f91f0500b1e10000549f5e00a99f7e01a9977e02a99f5e03a99f6204a99f3e00f9e", - "10314aae20313aa5e090094c00300b5e1031faac6ffff17BL8;FF1f0d00b128e8ff54e00319aae1031caa22008052077801943cffff17df020171e20b0054fc031faaec0f00b9e84700b9eb2700f9e9234629e03740f9e11f40f9L8;FFe82b48f9e20bc43de1074091e08f843de0ffc33d00800991e19384", - "3de103c43d21800191e07f843de007c43d023f8052e82b09f9e183843de28b843de087843dBBBL4;FF08050091f52740b98803088be80208ab620c0054e9f77fb2f41f40b91f0109eb481f00544801805249008052e1a300910804003900028052e91f00f969a3ff97L4;ZDL8;FF680a00f9f44f44a9f657", - "43a9fd7b42a9ff430191c0035fd6d6008052e0ffff17e0230091020480522300805224008052dfcdff97e10f40f9e5ffff1720008052BL8;FF29194a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1", - "a8L8;FFf8030aaa810000b460ee41f9220080520838009461fa41f9810000b460f641f92200805203380094ea0318aafa6740f958fd60d37fc61339e95340f928008052BBBBBL4;FF91080194e30316aae80300aae90301aae00315aae403142ac8d40736c9d5ffb59bffff17e00317aa87080194e30317a", - "ae80300aae90301aae00316aae403152aL4;FF28008052f5031faae1031faaffa300a9ff0f00f9e0230091220080522300805224008052e8e8ff97e4ffff17ff8301d1fd7b02a9f85f03a9f65704a9f44f05a9L8;FFc0035fd6410200f021a01991e00308aae2018052fd7b42a9ffc300914308011441020", - "0f0215c1691e00308aaa2018052fd7b42a9ffc300913c080114410200f0BL8;FF090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010a8b2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091L8;FFe8a704a9ffa305a9e8af07a9ffa308a9e8b70aa9ff", - "a30ba9e8bf0da9ffa30ea9e8df10a9ffa311a9e8e713a9ffa314a9e8ef16a9ffa317a9e8db19a9ffa31aa9BBBL4;FF6b000054220080520ac801941f0700f1ab000054e00319aae10318aa2200805204c80194df0600f12b010054e00317aae10316aa22008052fec7019404000014L4;FB6c655f7261746", - "36865742e727300136661696c656420746f20646563727970743a20c0002f636172676f2d6769742f737061727365706f73747175616e74756dL8;FFe8a301f9e86b44f9f2b743f9e20317ad6281c93cf1bb43f9ed7344f9e0bf43f9e3035e39e4c743f9e5cb43f9e7d743f9ed5300f9ed6f40f9e25b44f9", - "f66344f9BL8;FFe00313aae10317aae20314aa11070094770a40f9680240f9080117cb9f0208eba9faff54e00313aae10317aae20314aa08070094770a40f9cfffff17a8831ff8L8;FF2a0900d13f09007149819f9ae90000b43f0500f161020054010100b0213c1991e202805241480014ff8300d1fd7b0", - "1a9fd430091010100b021001991040100b0BBBBL4;FF137f02a91f4f03a91c6300b9282300f9e9030054281f40f9090d80523a2300f94823099b010140f93f0400b1000300541bf141a9196943a914e144a9810000b4L4;FB304b42000000000000000000000000000800000000000000080000000000000", - "0204c420000000000000000000000000008000000000000000800000000000000L8;FF1f0500b1e1000054ff6301f9fc6701f93f7f01a9fc7301f9ff7701f9fff302b9e1030b91a2c303d10aefff97a03500b5e1031faad3ffff17e1031faae8e300f9BL8;FFe102009021c02991e402009084e01291e023", - "0091a32300d1a2008052a8831ff851680194f40200d094422391e102009021902c91a32300d142018052e40314aaL8;FFf65742a9fd7bc4a8c0035fd6fd7bbea9f44f01a9fd030091140040f99f0600b1e0030054012440f9f30300aa3f0400b140010054810000b4602a40f922008052BBBL4;FFe00316a", - "a1a0000141f09007161010054090180d288de78920900f0f2290140b20b000014090180d2e8031faab4fe48d30900f0f206000014090180d2f4031faaL4;FFfd7bbea9fd030091f35301a9330000b0340000b073be40f994c240f97f0214eb89000054608e5ff800003fd6fcffff17f35341a9fd7bc2a85a", - "0b0014fd7bbea9L8;FF14a80094a80357f880030191a1c303d122008052b7c303d108050091a80317f837a8009428e37a92b9f31438a0c303d18102088be20319aaf90b40f905a80094BL8;FFe82703a9e8030091e1830091a0039e3c372801941300001428008052890200b029413f91bf233ea90804805", - "2000400910800ac72e1830091bf031ff8e81b00f9L8;FF3cfcff17a0c300d1e1031caa020480525aeaff97bc035ef8bb035df8d7fdff17a0c300d1e1031aaae20318aa53eaff97ba035ef881fcff172000805201188052BBBBBBBL4;FFfd7b45a9ffc30291c0035fd6e92341a9ea0740f9480108cb395100", - "a9280900f936feffb4080a8052e90a80d2c826089b08ed7c92c902088b212500b140fdff54L4;FF1c130094f50f56a9e0c30591e10316aae20315aa8a110094fa5f57a9f85b58a95f0b00b1e1020054760600b4e8c30591e00318aae10316aaf756fe97fb6b57a9L8;FFf65741a9fd7bc3a8c0035fd66002", - "00f000c01d910a1c0194fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30302aae20301aae10300aa01010037e00308aaBBL4;FF7b031e4afebf40b9fb621f38fb925f3808011e4afec340b9e8721f38e8a25f389c031e4afec740b9fc821f38fcb25f387b031e4afecb40b9fb921f38fbc25f38L4;ZF", - "L8;FFffc300d1fd7b02a9fd83009109004039e80300aae00301aa3f0900716c01005408210091490200343f050071c1030054e80300f9a101009021a01591e8230091BBBL4;FFe097c93de10b07ade19bc93de23b883de017883d220341ade11b883de81200f8e02b883d210340ade89200f8e81201f8e82", - "710f9e227883de023883de11f883dL4;FB00000000000000000800000000000000080000000000000050584400000000006c656e6774682064656c696d697465722065786365656473206d6178696d756dL8;FFe83342f9e95b42f9e8df00f9e83b42f9eb2315a9e83f42f9eb5742f9ea2318a9e84742f9e", - "a4342f9e8b700f9e84b42f9ea2711a9e99b42f9eabb42f9e8cb00f9BL8;FFe087843d135c0194f9431591b40000b4e00315aae10314aa22008052055c0194e1e34df9810000b4e00317aa22008052005c0194e1074091e0833791023f8052L8;FFa82b3fa90a078052c8048052bf273aa9290100b0292d0e", - "91a92b3ca9290080d2e92fc0f2a87f3ba9a8273ea90d5c0094e11b40f9810000b4e01f40f922008052BBBBL4;FF880800b4a00642a9e203019169f7ff9708fc79d3e1e7076fe9031faaba2a40a90d0a8052080d010ef95b46a918000a8a496b78fc208d282e0800669e0ec101f2L4;FB2063657274696669", - "636174652069732065787069726564202865787069726174696f6e3a20c0132c2076616c69646174696f6e5f74696d653a20c00129002f63L8;FF3f8001f182fdff5408050051890240f98a0000100b6b68384a090b8b40011fd63f0900b1802400543f0116eb4124005481220091e20313aaca070094f50", - "300aaBL8;FF02018052e40314aaa80f00f9567c019468320591010300b021601d91a363009102028052e40315aaa80f00f94e7c019468420291010300b02154359124030090L8;FF2300805224008052e991ff97e11740f99efcff17e0630091220080522300805224008052e291ff97e11740f9b0fcff17", - "e0630091220080522300805224008052BBBL4;FF800300f000000291820300f0424003914109805228bc0194800300f000a00391820300f042a00491a10f80520fbc0194ffc307d1fd7b19a9fc6f1aa9fa671ba9L4;ZBL8;FF601e40f9e10314aa2200805209bc0094612640f9610500b4080a8052180000", - "14611a40f9080080921f200039080000f93f0400b140010054810000b4601e40f9BL8;FF090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb89190054088c45f81f0500b1c0140054ce020094080040b20811c0daL8;FF698241f96aa201f96a7a41f969b201f9698", - "e41f96001803d6b9241f9689601f9619a01f960a601f96aaa01f969be01f96bc201f962c601f9481940f900013fd6BBBBBL4;FFe10313aa77f7ff971601003513000014e8031faa75feffb5e003088be10313aa70f7ff97b6010034610a40f9680240f91f0101eb00240054680640f909018052L4;FFe803", - "17aa0900f0f2692200a9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd63a008052fc0b0094e00317aa2100805234008052L8;FFf40302aaf50301aaf303002a050c01940002805201018052030c0194600100b4e10300aa155000a96202009042a01491e003132a730c019", - "4f44f42a9f50b40f9BL8;FFe80b41b2e20700f904000014880080d20800f0f2080140b2e0030091e80300f923810094f40300aae0430591b274ff97e00314aa0674ff9715008092340300b0L8;FF0009805201018052078c0094206b00b4f80300aa038c0094c000805241008052018c0094730080528069", - "00b4a8009152130300a908080079280080528800b172BBBL4;FFf80f40f9f703192af903142afa0315aa28008052020000143a008052f52b40b9e85f1829e9534929f60309a9e8571a29e82f40b9e00b00f9e0830191e9231b29L4;FBd00b460000000000000000000000000008000000000000000800000", - "0000000006cf3450000000000000000000000000008000000000000000800000000000000L8;FFe1f341f9810000b4e0f741f92200805208cc0094ba0000b4e0c741f9e1031aaa2200805203cc0094e1cf41f9810000b4e0d341f922008052fecb0094e1db41f9BL8;FF220080520b4c0194613240f98100", - "00b4603640f922008052064c0194b40000b4600640f9e10314aa22008052014c0194610e40f9810000b4601240f922008052L8;FF0a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b29050091BBBBL4;", - "FF680b0011e83f0439f503082a08108052020115cb140302eb630f005475020034e8430291e10317aaf903162a0001158bf602028b07ec0194e82755a960020291L4;FB0800000000000000304b420000000000000000000000000008000000000000000800000000000000304b420000000000000000000", - "00000000800000000000000L8;FFe20316aa0001188b12ec00940803168b680a00f9540300b4610a40f9680240f9b51240f91f0101ebc0080054680640f9490380522a040091e00314aa6a0a00f9BL8;FFe0e301915554ff97e81340b9fb3f00f9c8030036e0e301915054ff971f0700b1fb3f00f9400500", - "54e0e301914b54ff97df0600b1fb3f00f960060054e0e30191L8;FFfd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9BBBL4;FF3f1f00f1a8010054e08744ad80020191a18301d122008052a", - "0073dade08b45ada00b3ead36ac019400e4006fff6300f9e08304ade02f803d08db77d3e08744adL4;FF8c01110aad118b9a5f010e6a70fe51d3ae0173b26b1a0653cd118d9a6e0e03535f010c6aac0172b27115520a72fe52d38d118d9aec01100a5f010e6aaf017db2L8;FFf70600918823199ba9035ef", - "89c070091ff4200f10001803d090900f9fc1700f9800d0054e85a199b1b0940f975fb7fd39b0400b41c0540f9faab0094e00315aaBL8;FF880200d008e10491e1031691a30302d1a82738a962008052a82739a9880200d008611191fbc302f9f5cb02f9a8031af8e4dbff97a10356f8810000b4a08356f8L", - "8;FF142c00945a031b8be0031caae1031baa22008052ba031ef8062c00941b0000141a0180d2e8031faa9bff48d31a00f0f206000014090180d2fb031faae8031faaBBBBBBL4;FFffc30091c0035fd6f30300aae00301aaf40301aae10309aa22008052230080522400805272060094880a40f9e00313aae", - "10314aaedffff17e10300a9e00301aaL4;FFe8e351f9f8431391e9b34bf9e0431391e1031faa0083813ce0efc83d22008052e87302f92300805224008052e97f02f9e13bc13de23fc13dfa6b01f9e00715adL8;FF0b0900390bec78d30a1500394a0040b909210039490840796b011c320b1900390c1d003", - "9012500390aa100b8091d0079c0035fd609fc74d30afc6cd30bfc64d3BBL4;FFaa831df8aa6301d1eaa706a9a9a300d1e9a307a9e8a30091a3831af834940194740a40f9680240f99f0208eb61000054e00313aa9393019408038052690640f9L4;ZDL8;FF4afd46d34a05009111000014e9031faa100000", - "14f5031faa681a40f948f6ffb5f6031faa770a40f917f7ffb5e80317ab23f9ff54600100f00060149100940094BBBL4;FF040280520f000014880080d20800f0f208050091e81300f9e083009124c90094e01300f9a10300f021982a91a30300f063f42a91e0830091e202805244028052L4;FB7f2293c8f", - "8827ee26b3095cf142703b1000073e8ba087ac2f787053e2cb4db17ce5f367c4c39ce7f02652f7fb7283c33ce9512f89694325003279672ecea93c8L8;FFee7f44f9f58344f9eaa709a9e9e743f9eaf743f9e9df00f9e9ef43f9e9af00f9e9f343f9e97700f9e9fb43f9eba710a9e9ff43f9e9b700f9e903", - "44f9eaa718a9BL8;FF40330054e8cf42f92a040091002302914901805209692138ead302f9ed160094e1431691b60c0094e09b49f9800100b4e1d342f9e8cb42f91f0101eb203f0054L8;FFe8a702b9002c0054e8c31791406302910d7afe97e8c357391f050071002c0054e9c31791e8c757392021c03c2", - "121c13ce02b833de12f833dc82c0036e8830291BBBBL4;FF5f2800f1880000542800028b08f1df380806f837a0e300d1da5c0094a8835cb8c80f0037a8835df86a0340f9490108eb03120054ea0240f9a0035df84801088bL4;FB7265717569726564fffffffffffffffffffffffffffffffffffffffffff", - "fffffffffffffffffffff6d697373696e672074686569722072656d6f74652066696eL8;FF3800805206000014e003082ae20313aa430c80529becff9740feffb5a80640f91f0116ebe9090054e00313aaebf2ff97e80300aae00301aa48fd073708fc60d3BL8;FFf93b00f99f0700b160f4ff54e0c30191", - "525cff97e0230191fcdf04a9f62f00f91dbfff97f60300aaf70301aae00315aae10314aa6b87ff97000200b408ff60d3L8;FF220080520b740094f4ab49f99f0600b1a0baff54f5b349f9f3af49f9551600b47622009104000014b50600f1d6620091a0150054c1825ff881ffffb4c00240f9BBBL4;FF340", - "080399400f8b728040091490400d1110000145f2800f1880000542800028b08f1df38e806f837a06303d1d51c0094a88352b868110037a88353f82a0340f9L4;ZBL8;FFe20000b5d4000035280080527f0600f9687e01a97f0200f92f000014281c40f9080102ebe3040054290c40f91f0109eb82040054e", - "80328aa280108ab831e0054BL8;FF6c0100543f040071600300543f0800716102005401e30391a22302d149ebff97002c00b5e1031faae7ffff173f0c0071800300543f10007121010054602e00b5L8;FFe84b05f92a29ff97f60300aa3f010014f79b44f9f69f44f9e0831f91fca344f9a1620091022880", - "520a340094ff0600b180010054e0831a91e1831f9102288052BBBBBL4;FF6c010c8b2acdcaca8bc1cbca2981c9938c010a8b6901098b8d81cc938abdcaca2badcbca280108caa91d40d208010a8b6901098b0acdcaca0881c8932bc1cbcaL4;FFc1420054880240f96aae8c52ca8dac72090140b93f010a6", - "b60020054080140b949ae8c5269ccae721f01096b61410054810a41a9e0e306914ef7ff97e8df40f9L8;FF61e240f9810000b460e640f9220080520804019461ee40f9810000b460f240f9220080520304019460220091f30b40f9fd7bc2a865fdff17fd7bbea9f30b00f9BL8;FFc0035fd6202040a92103", - "00b021e02991030d40f9a2028052fd7b43a9ff03019160001fd608200091200440a9e92300910a0000b04a011a91e8a700a9220300b0L8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840f", - "9BBBL4;FFf4c302f9f6bf02f906000014e80b41b2e0c302f902000014c8060091e8bf02f9e0e3159122b90094f40300aae0e31591e1231091022e8052f5e3159105c40194L4;FB5900000005000000426549000000000054000000000000005f000000050000004265490000000000540000000000000065", - "000000050000004265490000000000L8;FF60020054970100b4b422009104000014f70600f194620091e000005481825ff881ffffb4800240f92200805201c40094f8ffff17dc0000b488071c8be00315aaBL8;FF080d088b08250191c81a488b08050091f40800b4890240b22911c0da291540d2290d098", - "b29250191891a498b29050091200108ab02080054e10313aab0fcff97L8;FFa6ffff17e85340b91f050071610f0054e043c73ce143c83c03e4006fe283cc3ce8430691e0c30e91808506ade083cb3cc1e20091e2430e91fa030b91808907adBBBBL4;FF83f800541803008bf9feffb50f0000141f0400b1e", - "1f7005429e401941f10003161f70054f9ffff1726e40194f70300aa1f0400b141fdff54e043059181008052L4;FB70726576696f75735f636f756e74657270715f726174636865745f7374617465496e76616c69645075626c69634b6579436861696e73656e6465725f72617463L8;FFe8b345f90900809", - "2e0030b91690200f96082803c680e00f9a5deff97c20100143f03086b02010054080180520900809268220039690200f99f0600f12a050054BL8;FFfd7bbda9f65701a9f44f02a9fd030091f50303aaf303022af403012af60300aa006401940004805201018052fe630194400100b4165400a9e10200d02", - "1003891L8;FFe0230091f7a300a96240ff97e0230091f7a700a95f40ff97e00313aae1031faae20314aa1a070094770a40f9680240f9080117cb9f0208eba9fbff54e00313aaBBBL4;FF090440f93f8131f181060054010040f9f30308aae28b815228144038e8030039e8030091000140b20aa401948806", - "4039810a0091e2c38052e8833139e8833191L4;FFe006178b010000f021e004912300008b34686038801e7ed31f0002ebe902005474044039801e7ed35f0000eb620200547408403911000014a1060012000000f0L8;FFa40100d084a00a91e0030091a3630091a2008052a80f00f953a40094810100f021", - "9c1591a40100d084200b91a363009182008052b30f00f94ba400944ba40094BL8;FF09600091e02300a9200440a90800009008c109918202009042383c91e3030091e92301a920240194fd7b42a9ffc30091c0035fd6ff0301d1fd7b01a9f51300f9BL4;FFff830191c0035fd6ff4303d1fd7b08a9f94b00", - "f9f85f0aa9f6570ba9f44f0ca9fd03029137fc413939604ca9f40301aaf30300aa08108052f51a40d236000291L3;ZBBBBBBBBBL4;FF190a00b4750240f9e1cf00a9f70f00f9b70a00b4a00240fdfc0f40f9fa031faa1b328052f80315aa0088202e0800669e17c10192f70000b5008f40fc5a230091L4;F", - "F21008052081e0094400200b4c800009008a53991e90741b20001c03d08e140f80000803d08e000f8c8028052892200a989008052802201a9c800009008293491L8;FF82faff978002009000201e910c1e0194fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd03009128400091f30303aaf70302aa08", - "fddfc8f60301aaf40300aaBBL4;FF23008052240080527990ff97f94f42f9f84b42f9b3ffff17400300f000181e91420300d042401a91610280520f9e0194600300b000602591019e019420008052L4;FF6300019123740bd5420001f1a8ffff5480003ead80003fadc0035fd6820003cb634000d1424001", - "d1600001ad600082ad420001f1a8ffff5480003ead80003fadL8;FFa40100b084e00491a363009142008052b30f00f9549e0094549e0094fd7b41a9f31340f9ffc30091c0035fd6000040f9960b0014ffc300d1fd7b01a9f31300f9BBBL4;FF8100805230de019420380035e85341b9e82300b957ffdfc87", - "70000b529de0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2aL4;FB2067726f757020636f756e743a20657870656374656420352c20666f756e6420c0001e696e76616c69642067726f7570206c656e67746820696e2067726f7570L8;FFe84b04f9e86340f9e84f04f", - "9e8d340f9e85304f9e86740f9e85704f9e85740f9e85f04f9e86f40f9e86304f9e85f40f9e86704f9e8e340f9e86b04f9e85b40f9BL8;FFe0a3843de0a7c43d4383c63ce85309f9e2a3c43df95709f9f75b09f9e1abc43df95f09f9f97b49f9e00b843de0afc43de3f3863de8e34df9e10f843d0183c13cL", - "8;FF080117cbbf0208eb28070054680640f9e10316aae20315aa0001178b0d5e0094e802158b680a00f9951640f9550300b4610a40f9680240f9941240f91f0101ebBBBBL4;FF8d0500d1ac010ceaa1feff54428c202e42a8302e4c00261e4c0100374a2100916b010a8b6b01098a02696bfc438c212e6c0", - "0669e8cc101f221fdff54f4ffff17L4;ZFL8;FFe00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6ff8302d1fd7b05a9f93300f9f85f07a9f65708a9f44f09a9fd430191081c00121f090071a1010054BL8;FFffc30091c0035fd609200091010300d021202191230300906300399126030090c68", - "03891a52300d1e00308aa02028052a9831ff8e4018052537e0194fd7b42a9L8;FF7390ff97df0600b120b1ff548022029154010014e8031faa000117ab42680054e16300917e7dff977f0600b18000005480220291e16300915c92ff97df0600b1BBBL4;FFf44f4ba9f55340f9fd7b49a9ff030391c0035f", - "d6000180520104805212be0194fd7bbfa9fd030091080040f90a0840f909696238290140924a0109eb63020054L4;FB90874900000000001100000000000000020100000500000090874900000000001100000000000000270100000500000090874900000000001100000000000000L8;FFffc30191c003", - "5fd6ffc302d1fd7b07a9f85f08a9f65709a9f44f0aa9fdc30191280441f9f30301aae20300f95f0008eb81040054f60300aae023009161420691BL8;FF4a1540d24a0d0a8b4a25019129194a8b29050091280108ab220a0054090140b22911c0da291540d2290d098b2925019129fd46d30801098b080500", - "911f0109ebL8;FF63540691a0c300d142018052e40080522c000014a0031df801010090210406910301009063780691a0c300d1420180528400805223000014a0031df801010090BBBBBL4;FFe20315aa230080522400805278000094770a40f9680240f9080117cbbf0208eba9efff54e00313aae10317a", - "ae20315aa23008052240080526d000094770a40f9L4;FFe90342b9e80b05b9e8af40f9f6af02f9e88b02f9e89f40f9f9b31539e88f02f9e8bf40f9e89702f9e8a340f9e89b02f9e81f41b9e84705b9e8c340f9e8a702f9L8;FFeb0f80122c7c10532b2c0633ec0000352a7c0c530b050039090900394a091", - "b320a010039080000142c7c12532a440c330b090039090d00398b6d1c320a050039BL8;FF6800d0374a8e01144a8e01144a8e0114000040f9080040b91f050071200100541f090071a1010054280300d008e1189102018052e00301aae10308aa3b8e0114L8;FF0c8e0094e00313aa14008092080c45f874", - "0200f91f0500b140000054fc88ff97754640f9742a00f9bf0600b180020054745a49a9960100b49722009104000014BBBL4;FF7bc0ff97e12740f906ffff17e0e3009122008052230080522400805274c0ff97e12740f9d7feff17e0e300912200805223008052240080526dc0ff97e12740f9L4;FB00000", - "000b04f05e1a671db1a0000f740442553c9963421aee9eb2c3fe0bf14bd37d9a68e00000000000000004803821dc58802bc000000000000000000000000L8;FFfa6742a9fc6f41a9fd7bc6a8c0035fd6280141d2ea008052f9031c911f2d00f1f5c31591edc3139108318a9aea0100b04a192191cb000010", - "4c7968786b090c8bBL8;FFf89301b9e91740f90029803da8835af8e0430691e10244ade1830d91e8bb01f9a8e378a9fa9701b92183813c2083823ce10245ade81700f9e80b40f9e9a319a9L8;FF601500b4e10314aae20317aaf80300aa104e0094482740f91f0500b120030054592f40f95b6340b999110", - "0b4542b40f9fc4d0094e00319aa21008052fa4d0094BBBBL4;FFe0230091a31300d124008052a8c31f380e50009403ee0194000480522100805201ee0194c00300b4e083c03ce183c13c8906001108048052692200b929008092L4;FB696e76616c6964204b79626572207072656b6579206964656e74696", - "669657273656c662073656e64206f662061207365616c65642073656e646572206d657373L8;FF633c16910f000014e00300f9210200d021941c91230200d0639c1591e0030091e20080528400805212000014210200d021941c91230200d063a01b91e00300f9BL8;FF086e0194e00314aa010180521501", - "8052056e0194e10316aaf60317aa60feffb4ff7f01a9f60300a9370200b4290040f9280840f91f0109ebea33899a0a010acbL8;FFd7fdff17e04316912200805220110094e1d342f9e3fdff17e0431691e1031aaae20318aa1a110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691BBBL4;F", - "Fa8031b78bf731b381fb300b8ba035bf8e4feff17e8031faae93200d103000014e8031faae92a00d18a1f4092a00301d108010aaaa9233ca94896ff97680300f0L4;FF6b010a8b08010a8b6b090091f5ffff174c0500124d7d01534a7d02538c01c05a1f0100f1ad011f124a011f128c7d1d536b010d8bed", - "179f1a6a010a8ba901092aL8;FFa0020079a8ee5f78d60600f10801174aa8020079e1f8ff5412000014e80100d008010191a22300d10021009121008052e3031aaaa40100d084401291e80b00f9BL8;FFe82f00f9ea4302f9ea4702f9aa4700d1e7a30ea9a80c40f9e08706a9ea830aa9e00304aae18b0ba", - "9e10302aae96300b9e28f07a9e49708a9e69f09a9ffd30879L8;FF680000b4e00314aa00013fd6a10640f9611300b4a20a40f9e00314aa052e009497000014f6e742f9fb074bf9f90b4bf9fc0f4bf9f8134bf9f5174bf9c80240f9BBBBBBL4;FF770a40f9680240f9080117cb9f0208eb69fbff54e00313a", - "ae10317aae20314aa230080522400805271080094770a40f9680240f9080117cb9f0208eb29faff54L4;FFe0f3c83de12b813de02f813de233813d9200001408008092880200f9d300001408008092880200f9fb08001408008092880200f9e5010014fa150094c0028052L8;FF0c044039edf99ed26d6ab", - "cf2ea031f2ae9031f2a6b5d58d3ad74d3f28d18e4f26b810caa0c0840396b610caa0c0c40396b410caa0c1040396b210caa0c144039BBL4;FFa402188be1031faae30316aae08300ad9ae0ff97e0074aad480300d008a11d91e25bc03de34fc03df5c3009189028052e0c30091e08704ade08747ade22f80", - "3dL4;ZBL8;FFe00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb89190054088c45f81f0500b1c014005472050094080040b2BBBL4;FFbfe337a9bf8318f8bf0319b81f0800f1215f0054b58355f8a20640f9426100b4a10240f920008039001bf8b72804", - "0091490400d1e5000014a88359f81f0500b1L4;FB5500000000000000f601000021000000b11c49000000000055000000000000000402000025000000b11c49000000000055000000000000000602000019000000L8;FF20884fade1b3833de0b7833d21804cade2bb833de0a3833d22804dad21400891e1", - "9f833de2a7833de0ab833d09d60094e0032b91012b0091bd500094e8e33b91BL8;FFe8cf42f9490b8052f4074091948209910969213828040091f69349f9e8d302f9df0a00b1610d0054f9031faa75000014e1d342f9e8cb42f91f0101eb806f0054L8;FFe8ef42f97f0208eb61000054e06317915d8cfe9", - "708068052e1f342f9e02fc13d6906089be8f35639e133c13de237c13d620600911f090071200500ad2209803dBBBBL4;FFc0fcff54755a42a9e08740adc80240f9a0873eade00fc03da0039f3c680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aafef50194a0877eadL4;FB6465725f7", - "369676e696e675f6b657973656e6465725f6d6573736167655f6b6579736d6573736167655f76657273696f6e53656e6465724b65795265636f7264L8;FFc90080d248008052e02300390900f0f2e8270039e90300f9ecffff17e00300f94102009021081d914302009063f81d91e003009142018052a401", - "8052eeffff17BL8;FFa80f00f958760194688201910103009021cc2791040300f084401591a3630091c2008052a80f00f94f7601944f760194fd7b41a9f31340f9ffc30091c0035fd6L8;FF292501910819498b140500913f0700b1f60f00f9c001005400c30091672c0094080040b20811c0da081540d20", - "80d088b0825019109fd46d30800098b08050091BBBL4;FF683300f93eb60194e8031f2ae8ff0139e327c03da00303d1600743ada18302d16223c03d6343803dd502178b5a0317cb608708ade08742ad624f803de213c03dL4;ZDL8;FFb8db3da9b5831ef87701198bf80240f9f4ce43a9fa3245a91f0700b", - "1600b0054e96e41a9fc1240f9f50640f93ff97af2a10800549f0600b120060054f62640f9BL8;FFf3e706f9f3ef06f9eaef0db9f5f30db9f7f70db9610a0054e39348a9e0c31291e2db42f9e5f35639e1833291e6031f2a79e6ff97e85b42f91f0900b1e1830054L8;FF0800f0f2e0c30e91e3432a91e483", - "0f91e2008052e9eb03b9e8f301f964060094f5ef41f9e8e741f9bf0208eb61000054e0230f91546cfe9708068052e9eb41f9BBBBBL4;FF006034910e060294ff0303d1fd7b08a9f74b00f9f6570aa9f44f0ba9fd030291f30300aa29008092e8230091e18b00a9ff4b00b9e90f00f9e91b00f9a80f00f9L4", - ";FF280108ab4301005409010014e8031faab70a40f957fdffb5b61640f9e803088b36feffb5e80308ab22200054b42240f9740100b4890240b22911c0da291540d2L8;FFf65741a9fd7bc3a8c0035fd6090141d2ea0080523f2d00f129318a9a3f2500f1480e00544a0200f04a4120918b0000104c696938", - "6b090c8b60011fd600200091BL8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091340108ab830000542d000014f40308ab62050054152040f9750300b4131c40f9f6031faaL8;FFe80b00f980ffff17e82740f9a9e301d1ea1740f92001c03da98359f81f0500f14001803d49090", - "0f98b010054e02b40f901f97fd342008052fe85009407000014BBBL4;FFb6033ea9a18300d10800003928008052e003172aa8031ff872b1ff97a1035ff8a8035ef81f0101ebc0130054a8835ef8490280522a040091e0031caaaa031ff8L4;FB456249000000000034000000000000003701000022000000", - "4d414320766572696669636174696f6e206661696c65640099624900000000003400000000000000L8;FF000903ad68ff70d36112893ce08754ad689e0139e87242f8649606a9681e08a9e8f240f8699207f8e9af40b9685200f9e8a341f960828d3ce0afc03d688a18a9BL8;FF1f0900f1a1210054e0031", - "3aaff6b00b9ffdf00a9df7e01a9dffe02a9f71700f9f72300f9df7e04a9f7ff05a923feff97e0060036212c00b5992240f9881a40f9L8;FFe1630091a21b00b9e92302a9e8030091ff2301a962b6fe9740030035e003c03de80b40f96002803d680a00f9fd7b43a9f32340f9ff430191c0035fd6f9450094", - "BBBBL4;FFf3031faa370140b21840009179040090fb0300907b3f3b915c048052fa2ec0f2350080520b000014e00640ade0c30091e10314aae08701ade8bf009400040037L4;FB2f62797465735f6d75742e72730021706f73742d7175616e74756d20726174636865742073656e64206572726f723a20c0", - "001a73657373696f6e207374617465L8;FFc200005494fe4ed3680240f9bf0208eb0107005435000014680240f9897e0e53bf0208eb3861193261000054e00313aa52e50094680640f997fe5cd318693538BL8;FFf6030191fac3009137008052e20301aa0a000014c1220091a20301d1e003082a2551ff9", - "7c01700b5ba035cf8f9031aaa228f40f8420f00b4410340f920008039L8;FFa11100b460f640f989000014610640f9810000b4600a40f92200805205660094611240f9810000b4601640f92200805200660094611e40f9810000b4602240f9BBBL4;FF173040b9f50300aaf30308aab7060034e80240b208", - "11c0da081540d2080d088b0825019108fd46d308050091b60a40f9f60500b4c90240b22911c0da291540d2L4;FF2300009063c0029163d86878867e031b9f00066b8a000054000080d21f000039007d20d46300060b9f00036b4b010054000080d21f000039007d20d463141a12L8;FF2203805249a60014", - "a10100f021b80691e204805245a60014a10100f021c40591a207805241a60014a10100f021440891c20480523da60014fd7bbea9f44f01a9BL8;FFfd030191f30301aaf40300aa05260194200480522100805203260194200400b4800640ada800805208000039280480520900009029211e91e0a300a9a8", - "0700d1L8;FF6800c8376800d0372a2600145b2600145b26001408004039c90000d029011b91e00301aa08711d5308410051081d7d92226968f8c90000d029e11b91286968f8BBBBBBBL4;FFf44f4ca9f94b40f9f6574ba9f85f4aa9fd7b48a9ff430391c0035fd6ff0302d1fd7b07a9fdc301916a2440a96", - "81040f90b3140a9081140b9e2ab03a9e92700f9L4;FF996e01a9800a803d68320039f44f4ba9fb3b40f9f6574aa9f85f49a9fa6748a9fd7b46a9ff030391c0035fd6a00000f000a02d91161a0094ffc306d1fd7b15a9L8;FFe8230091e3430091e00313aae80b00f9280200f008311091e80f00f9e10314a", - "a620200f042a82191e1ffff17610200f021d42191e00313aa2200805280033fd6BBL4;FF08008092680200f9f44f48a9f65747a9f85f46a9fa6745a9fd7b44a9ff430291c0035fd6687e00a9f8ffff17ff0302d1fd7b04a9f72b00f9f65706a9f44f07a9L4;ZFL8;FFaa2f7329ac377429a0033ead0809c0", - "5a2909c05aa0033fadae3f7529a003dc3ca103dd3ca203de3ca303df3ca303983ca203973ca103963ca003953ce8270e29BBBL4;FF0800f0f20a017fb2081d4092e0030091280108aaea2300a950c2ff97c80300d0084935914903805268a600a92800805268020039fd7b43a9f32340f9ff430191L4;FB7", - "32d312e31322e312f7372632f62797465735f6d75742e7273002f72757374632f34386132323963656165666434393835633530393930623134313136623664L8;FFe90f02f9e1430f91e0b3c23de3f701f9e20319aae8eb01f9e86b40f9e0fb01f9e0031d91e8ef01f9e8fb40f9f21b02f9e8f301f9e8bb", - "40f9f73302f9e8ff01f9BL8;FF080500911f0109eb68000054fe040014e8031faa160114ab020d0154f47349f99f0e00b161000054e8031faa0d00001400030291331d0094080040b20811c0daL8;FFfffb02f9e80303f9ff0703f9ea0f03f9e81b03f9e91f03f9125a0094e1fb44f9810000b4e0ff44f92", - "2008052015a0094e0c31791e1833291022b8052055a0094BBBBL4;FFe00740adc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aa00fa0194e08741ad28008052e217c03dL4;FB6e6465724b657920646973747269627574696f6e20c02220447", - "5706c6963617465206d65737361676520666f7220697465726174696f6e3a20c0000d4d657373L8;FF8182883ca0077aad8282893c880200f98082833ca00f7bad8182843ca10b79ad89820af88082853ca003d13c8382863c8082803c8182813c8282823c4f000014BL8;FFc0035fd6fd7bbaa9fc6f01a9", - "fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0308d1f30308aa410100b4160040395b0080d2f50300aa1b00f0f2dfc20071L8;FF68030291e10316aa00802f91e20314aa030880521b088052d7bbff97089080520083c23cf54f09f9e84b09f9f57749f9fb6709f9f46b09f9f47349f9e0a3843dBBB", - "L4;FF0803158be80a00f9b40000b481f67ed3e00316aa4200805206ba0194e8a746a9ec031baaf70319aabbc301d1580080521f011cebe83f40f941d6ff54ff000014L4;ZBL8;FFf85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd628008052e81b00f901ba00940010805221008052ffb9009480e1ffb52", - "0008052011080520bba0094e0031f2aBL8;FFf44f02a9fd030091140840f9f30300aa3f0002716200005435008052080000143f0020716200005455008052040000143f404071680080521535889a680240f9L8;FFf75345f9f5230ba9e85b45f9e95f45f9fb6345f9757e42f9e86b00f9080340f9e95700", - "f9680000b4e00315aa00013fd6010740f9810000b4020b40f9e00315aaBBBBBL4;FFffa304a908018052f3230091ffff01a9ffa303a9a8f7ff97600c00b4e10740f9f40300aa810000b4e00b40f922008052000a0294e11340f9810000b4e01740f9L4;FF682602a9e10f40f981faffb4e00315aa2200805", - "2070a0094f44f46a9f65745a9f85f44a9fd7b43a9ffc30191c0035fd620008052c10280520b0a009420008052L8;FFe9ab00a9e3230091270a0194fd7b43a9ff030191c0035fd6202040a96102009021200d91030d40f902028052fd7b43a9ff03019160001fd6202040a961020090BL8;FF210300b021d8", - "2391230300b063601d91a0e300d1a20180520402805226000014a0831cf8210300b021d82391230300b063a42491a0e300d1a201805224018052L8;FFe203132ae1e2ff9708fc78d3720100f052e23b9109fc60d3487a68782821084a095d1053495a69782801084adbffff17a80100b008010191a98300d", - "100210091BBBL4;FF4a61199109080091400540ad690200f909040091000502a9000500ad008501ad090505a9f44f41a9fd7bc2a8c0035fd6f40308aa10ca0194e80314aa29008052L4;FB080000000000000008000000000000004cfe450000000000506f6c796e6f6d69616c4572726f724368756e6b49", - "6e6465784465636f64696e674572726f724368L8;FFe8ef42f91f0500b180180054e8c3159100a10191fec4ff97c0000014fa031faa1f000014f4031faae8fb42f91f0500b180000054e8c3159100010291f4c4ff97BL8;FF602240f9220080520a4a0194612a40f9810000b4602e40f922008052054a019", - "460c20191f30b40f9fd7bc2a8aefeff17602200917800009460220291f30b40f9L8;FF090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209ebe90b0054088c5cf81f0500b1e00900541efeff97080040b20811c0daBBBBL4;FFf80309aaf9030aaa0aea0194e90318aa3", - "30000143f0700b1e00500549f7f00f1ea2700a949080054fee901940004805221008052fce90194200900b4810240adL4;FB0800000000000000347b400000000000e41f400000000000100000000000000008000000000000007c7b40000000000063616e20616c7761797320656e636f64L8;FFfb32009", - "4e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faa0eea0094e00741a90cea0094fd7bbfa9fd030091BL8;FFc1fcff540a1840f9e803088b5f0500b1c1fdff54e80308abe2090054092440f93f0500b180010054092c40f92a0140b24a11c0da4a1540d24", - "a0d0a8b4a250191L8;FF220080520b6a0094fbe30091a80302d1e10316aa60c30291bc0302d14785ff97a80358f81f0500b120120054e082c13ce80700f9e8030b91f7430f91f89301b9BBBL4;FFca060091a14301d109693638e82340b9aa031cf8e003082a7295ff97a1035cf8a8035bf81f0101eb6023", - "0054a8835bf8f43340f9090380522a040091e003172aL4;FFc9157e92ff0500f1aa0d098b490140f9eb0329aa6bfd47d3691949aa29c10092e00100544b0540f9ff0900f1ec032baa8cfd47d38b194baa6bc100926901098bL8;FFbf831ff815090091a8835ef8ba024079bbe25f78080101cb1f0d00f149", - "01005448431b2a390700f1b51200910809c05a086821b821100091a1831ff861feff54BL8;FFf44f43a9fd7b42a9ff030191c0035fd6e0031faa142a0194e00741a9122a0194682a0114c10600b40a1440385f150071e1060054298400d13f8100b122070054L8;FFe8a344f9e02f823d00e4006fe13b823", - "de127c23de86304f9e85344f9e96704f9ea8304f9e88f04f9c182803ce087853de083853d33290094f90740910a088052BBBBBBL4;FF880000542800028b08f1df388826f837e0230091db7a0094e80b40b9e8f90737e80f40f9ea0640f9490108ebe3410054ea0240f9e00b40f94801088be82600a9L4;F", - "Fe94b41b9092d0039e94341b909310039e93b41b909350039e93341b909390039e92b41b9093d0039e92341b909410039e91f41b909450039e91341b909490039L8;FF800000541f000039ff830091c0035fd6e8034039e9074039ea0b4039eb0f4039ec134039ed1740392811082ae91b4039ee1f40396a", - "110a2aab110c2aef234039BBL4;FF0c920194a8a243391f050071c00000541d000014f60f00f9a8a243391f05007121030054e8830091a0260491a18202916d6a0094f8df42a9e82340b928f70737L4;ZDL8;FFfd830091091c0012e03300393f0900710d0100543f1100718c0100543f0d0071c00100543", - "f1100718001005417000014090200343f050071000100543f090071BBBL4;FFa88201f8e85340f9e9ab0ba9a9035638000540adbb031738a9020238000700adeeab0094a0fa0736f80319aafaef48a9df0219ebf54340f9f94f40f9b74302d1L4;FB71529f46342f216e259727c600a60016264f49b59ea9", - "a28c74248b8c0000c206af7025ec4455d975990844d9eafd497e74b3dcb2e142e672185dd2a9de4b16bcL8;FFe8f700f9e8ff40f9e7031baae96f00f9ee7b40f9e1a740f9e89300f9eb2b40f9e83357a9f8ef53a9e2c35da9e8ff00f9e8275ca9ed1b4ba9e02b44a9ec2717a9BL8;FFe0431691e1031aaae", - "20318aa11110094fad342f9fc0740919c830191dffdff17f80300aae04316912200805209110094e1d342f9e00318aa02feff17e0431691L8;FFc10640f9810000b4c20a40f9e00314aa085200941f0b00b1fa432791c100005420afc03de82344f94003803de8f304f910010014f68740f91f0700b1e014", - "0054BBBBL4;FFed0f40f9ea1b40f9eb1b00f9a98109aaca210aaae90f00f9e93740f9480108aa36fd68d3e92340f9e83302a929fd68d3e92300f949daff97a8035bb8a9435b78L4;FB0400000000000000696e76616c6964207075626c6963207369676e696e67206b65796d697373696e67207369676e69", - "6e67206b6579696e76616c696420707269L8;FF977e02a99f5e03a99f6204a99f3e00f9e10314aae20313aa64030094c00300b5e1031faad5ffff17c1010054e1031faac1ffff17880080d2e10700f90800f0f2BL8;FFaa635838a94318386901084aab735838a95318384901084aaa835838a9631838690", - "1084aab935838a97318384901084aaaa35838a98318386901084aabb35838L8;FF080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308eb681c005406010014e1d342f9e8cb42f91f0101ebe0700054e8cf42f9BBBL4;FF630300f063802791a04301d162018052e40080", - "5268a60094b8035bf8a9a373a9ac8354f8bc2f77a9b9ab78a9e82707a9a8a775a9ea3700f9d80300b4f7030caaL4;ZBL8;FFe80300913f030071f70300aa1a0101911b81009148139b9a000540ad000400ad00b200940009805221008052feb10094c00800b4f80300aafab1009400048052BL8;FFe06317", - "916068ff9780fcff1721010054810000b4a01240f92200805205320194a11a40f961f4ffb40804805205000014a11240f93f0400f1cbf3ff5408028052L8;FF0083c73ce8ff41f99f0b00b1001f813de8fb03f9a1340054e8fb43f9001fc13de9831a91e9b302f9c9048052e0000090008c2891e85b03f90", - "80000f008212c91BBBBBL4;FF1c00198a496b7cfc208d282e0800669e18c101f2c1fbff54f4ffff172000805205000014610a40f9608300d1ebdb00943b0080522800809280220039880200f9L4;FFfb0315aa810000b51a000014e10316aa160300b4e0031baa2200805205020094b80200b518000014f7", - "0400b4e02b40f9e10317aa220080523a008052fd010094L8;FF680240f9080117cbbf0208ebc9fbff54e00313aae10317aae20315aa2300805224008052e2170094770a40f9d6ffff17f44f44a9f90b40f9f65743a9f85f42a9BL8;FFa1630091e20313aab40f00f9948200914c820194b58200f121ffff5", - "4e003009149820194f44f43a9f51340f9fd7b41a9ff030191c0035fd6ff0301d1fd7b01a9L8;FF8c2501918cfd46d38c05009114000014f5031faaf60314aad30e43f87f0600b1c1030054e8031faa28000014e9031faa8a2a80b96afbff35ea031faa8b1a40b9BBBL4;FFe0830b91bcaaff97e0830b91e1", - "e3009191350094fc7341f99f0b00b1e0fdff54f57741f9fb7b41f9e0430691216300910228805207c20194fa2740f95f0700b1L4;FB73207374617465733a20c000204e6f2076616c69642073657373696f6e20666f7220726563697069656e743a20c0392c20286e6f2063757272656e7420736573L8;FF", - "88d640f989e240f98083813c4001c03d81220091a80317f888ee40f9e007813d807ac03da98318f889565fa94083813ca2837bade81302f9e883029100a10191BL8;FF1f0101eb40070054680640f9490480522a040091e00315aa6a0a00f909692138e10313aab6faff97760a40f9680240f9080116cbbf", - "0208eb48060054680640f9L8;FF400500541f190071000500541f1d0071c107005475fe41f974fa41f9a80240f9680000b4e00314aa00013fd6a10640f9810000b4a20a40f9e00314aafd410094BBBBL4;FF60b80035e85341b9e8a300b957ffdfc8d70200b4ff0600b100030054f843059199008052e003", - "18aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebL4;FB1ced4800000000006a00000000000000440100001c0000001ced4800000000006a00000000000000090100002e0000001ced4800000000006a00000000000000L8;FFe02b823de0e3c23de227823de2e7c23de013823de0ebc23de1", - "0f823de1d7c23de01b823de0dbc23df9cb03f9e217823de107823de00b823db95f0094e8b345f9BL8;FFf30b00f9fd030091f30300aa05620194000480520101805203620194000100b4e10200f021800191130000f91f600039f30b40f9fd7bc2a8c0035fd600018052L8;FF6c0100543f0400716007005", - "43f0800716106005481620091e003082ae20313aa57fdff97200700b4fa0000143f0c0071000700543f100071210500541f0900f1BBBL4;FFf40301aa07a20194c00380522100805205a20194a01700b48802403989064039156983d28a0a40398b324078f588b5f208bd70d3b5f8d4f2b76300d1560300b", - "0L4;FF007c041bc11a00b9330f40b9007c1b5377486038f51e40920043089150040094c08240391f1040f2010c0054c41240f99fcc74f2a00b005484cc7492844000d1L8;FFfd7b41a9ff030191c0035fd6ff0301d1fd7b02a9f44f03a9fd830091140040f9e00301aa810100f021481691e823009162018", - "0524ba20094b30100d073a20b91BL8;FF0b0c40f92b0200372c0c40f97f010cebc1010054ac0100372b0440f96a010aabc20100540b0840f90a0400f9690109aba2010054090800f9e00301aa1f0100f9BL4;FF880240f9680000b4e00313aa00013fd6810640f9c10100b4820a40f9e00313aaf44f41a9f", - "d7bc2a802220014280400d11f0d00b1c8000054000440f922008052L3;ZBBBBBBBBBBL4;FF0a0317ebe3080054335500a92a0900f936efffb4df0600b1a0080054df2600b1c2080054c9f27dd302018052293d009129f17d92ca02098b000109cb41250091L4;FFbf0400f1890080524901899a1f0109eb1", - "481899ae30314aa2d140094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6L8;FFbf0219eb782200a9a932999a89d600a9765e01a9f44f47a9f65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6e8030091090000d029c11c91f6a300a9BBL4;FF09090", - "0f9e80315aa098d41f8ea0f00f93f0500b1e0010054df0200f109068052e0230091e303949aea079f1ae903899ae2231291e1031faae84b02f9d6020acbL4;FF3f0000eba8030054f55b02a9f303032af603022af503042ab3032037c27e4093a47e4093e00314aa637e4093c81b80d2010000d49f0200f1", - "000841baa1000054L8;FFa80f00f9589f0094589f0094fd7b41a9f31340f9ffc30091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091140040f9e00301aa810100d021081d91e8230091BBBL4;FF1f0400b1615800542ddf01941f100031e157005439feffb505000014e04305918100805228df0194205", - "70035e85341b9e84300b957ffdfc8770000b521df0194L4;FB4e00000000000000b90400001700000045024900000000004e00000000000000980100000900000045024900000000004e000000000000004901000009000000L8;FF08008092680200f9810000b4e06745f92200805207df0094e16f45f98", - "10000b4e07345f92200805202df0094e8032b9100e10091fcd7ff97a9100014e0031d91BL8;FFe20301ad3e5f0194882648298a2e49299682003980a20191e10300910809c05a2909c05a9f9202f8882600294809c05a6b09c05a892a4a29882e012922008052L8;FF00030054680640f9090180522a0400", - "916a0a00f909692138e10313aac7fbff97818a40a940008052e30313aa19faff97810a42a960008052e30313aaf44f42a9BBBBL4;FF4d030037082100918001088b0c00098a42696cfc438c212e6d00669eadc101f221fdff54f4ffff17e81341b2e0630191d56101d1e82f00f948e7ff97e0630191L4;ZF", - "L8;FFc0035fd6ff8301d1fd7b03a9f65704a9f44f05a9fdc30091081c00121f090071a1010054e00302aaf30302aaf40301aaeafdff9720020037750240f9a80640f9BL8;FFe1000054e86340391f0500714c04005428050035e90f41b230000014e81341b8e91740b9eac34039800640adec334079a8831", - "fb8e8a341b8a9b31fb8e93f4079L8;FFe81340f9090180522a040091ea1700f909692138e1630091817eff977f0600b160d0ff5480220291e16300916891ff977ffeff17e00315aa0efcff97080040b2BBBL4;FFff0600b1f40317a9ffc300f960030054e8031faa49018052096828380805009100630091", - "e8c300f913360094e1c305916caaff9700630091e1c305918fb1ff97L4;FB07000000000000000600000000000000000000000000000000000000000000000000000000000000090000000000000009000000000000009d86490000000000L8;FFc312803dc09202adc95607a9b40000b4602a40f9e10314", - "aa2200805205bf0094613240f9410500b4603640f922008052f44f4aa9f65749a9fd7b48a9ffc30291BL8;FFf96341a9fc0340f9060000143c008052542340f9b4031df874f1ffb509018052a8035df8755a00a9755e01a9785e02a97c6605a97b6200b9682603a9686604a9L8;FF41180054e00313aae7f", - "eff97e0080036811400b5e0031faa9effff17680240f9080540f9190101eb031e0054680240f9080540f91f0119eb690d0054e00313aaBBBBBL4;FF2a040091e00315aa6a0a00f909692138e10313aa73faff97770a40f9680240f9080117cbbf0208ebc82b0054680640f9e10316aae20315aa0001178b0", - "50f0294L4;FFe9db00f9e97f42f9377f08533cff78d3f9e318a9e9d700f9f803082a93010014e0d7c53de1dbc53de0431391e2dfc53de037813de13b813de23f813dd9ecff97L8;FFa8831fb8ea430039e91301b8e91b40b9eb6301b8ebc341f8ea570039ea6b0039e9b301b8ea7f0039eb1300f9e82b00b", - "93e0f0194fd7b44a9f32b40f9ff830191BL8;FF608600ad04000014e0031faac0035fd660c305d1f44f4aa9f65749a9f85f48a9fa6747a9fc6f46a9fd7b45a9e923446dffc30291c0035fd6ff4303d1fd7b07a9L8;FF0001094af44f42a9fd7b41a9ffc30091c0035fd6a80100d008010191e90300916301", - "00b063c02291640100d084401291f303002a00210091e2230091f403012aBBBL4;FFe82700f9a81e40f91f0500b1000b0054e12740f9e81f40f91f0101eba01e0054e82340f9490380520969213828040091b72640f9b63240f9e82700f9770200b4L4;FB58b75a2e324b9da1092fa9fc8163907995cfa28", - "c3f14c8892782363f00003a9fab87e0b5e16308ecbb1732b56c2356cb0e75e97ed6a11e80aa228d8a9085740eL8;FFf2031caae0bf46a9ed7b00f9e89f12a9e71f40f9ed0740f9fc4340f997f6ff17e8ff40f9f0f340f9e10315aaf16f1ea9f10305aaeabf40f9e89300f9e85b40f9BL8;FF8182c63c8282", - "c73c1f0500b1e00600ade20a803d200c0054f91300f9f9430691fbe300912083cc3c2183cd3ce81f00f9e81b40f92283c33ce0e3009160838c3cL8;FF00610c912fe7ff97c8fdff17f83f42f92083c13ce9d742f9f5c742f9f7cb42f9080340f9c0828d3cf63b42f9e9d304f9680000b4e00316aa00013fd", - "6010740f9BBBBL4;FF42feff54080b40f9fc0340f9f903002a5f0308ebc1010054fa0100b41b0740f938008052f7031caae8164038691740381f01096be0179f1a18ef01945a0700f1L4;FB259448000000000054000000000000005900000005000000259448000000000054000000000000005f0000000", - "500000025944800000000005400000000000000L8;FF9f7e04a9977e05a981c20091e20313aa8df0ff97200a00b5e1031faae2ffff173f0c0071e00200543f100071e100005481620091e20313aa04edff97a00500b5BL8;FFe1031f2aa974d3f28918e4f2087dc99b09488852e901a07202fd44d3087d80", - "524880081be0031faa037d091b316f0114fd7bbaa9fc6f01a9fa6702a9f85f03a9L8;FF430100f063a00891440100d084402a91428009918104805248030039156f009448236639e2074091400100d000c42891430100f063a00891440100d084402991BBBL4;FFbe8316387f0700b100fdff54bc0357b89", - "eb24db83f000071e86300b9fcab00b9bc0356f89e3208b8be835638bc8317f8bc035ab8be031838be435a78bc0316b8L4;FF0101a0521f070094a001f836f9060094080040b91f11007120ffff54f5060094080040b91f090071c10a0054280080521f0b00f91f2300a954000014f303002aL8;FF0821019", - "1002f407808fddf8848010035e80100d008e140391f05007101030054e103192ae2031f2ad807009408fc60d33d000014e80100d008010191a94300d1BL8;FF01c18d3cc80080d20800f0f21c190091e14b41f9810000b4e04f41f922008052042f0194e89f40f91f0500b160000054406302917ee4ff97f", - "3db52a9960100b4L8;FFe92305a9e9f30091a00700d1e92b06a9090000d029012191f42707a9e9230091a1a301d1e92f08a9a94302d1e92309a9a8e301d1090000d029212191e82b0aa9BBBBBBL4;FFc0035fd6fd7bbda9f65701a9f44f02a9fd030091010c40f9f30300aa3f0400f18b000054601240f92", - "200805201170294611e40f93f0400b140010054810000b4L4;FFf60301aae8830891e043139101810091a44700d1e20319aae30316aa1af1ff97e86b42f91f0500f1614f0054b60000b4e00319aae10316aa22008052fd160094L8;FF750200a913170194750a00f9e00314aaf44f43a9f70b40f9f65742a", - "9fd7bc4a818fdff17280080527f0a00f97f2200a9e00314aaf44f43a9f70b40f9f65742a9BBL4;FF08390a0b08114051e900f8376a00805208a800a91f0000f9fd7b44a9ff430191c0035fd61f014871830e0054290cc0392a1d001208550a0b08014851e900f837L4;ZBL8;FF21101591840100f084201d", - "91e0030091a363009142008052a80f00f9529700948101009021341b91840100f084200f91a3630091a2018052b30f00f94a970094BBBL4;FFa3730091e10314aa0204805224008052f30308aab57300390c390094942240b900d701940004805221008052fed60194a00100b4e00740ad08048052688200", - "a9L4;FB65616465725265636569766564726563656976696e675f6864724865616465725265636569766564686472436861696e63757272656e745f65706f63686c696eL8;FF022f8052eae700f9f9030baae0f3803dfc030eaaf48f11a9f4030faaf1df00f9f0cf00f9e6fb00f9f29710a9f6f300f9f603", - "0daae4af00f9f51300f9f7ef13a9BL8;FF01020014e1d342f9e8cb42f91f0101eb408b0054e8cf42f9490a8052f4074091948209910969213828040091f67749f9e8d302f9df0600b1a032005480220291L8;FFe80f41b2e0833291e85306f9284cff97e10300aae15306f9e083329121010090212037910", - "2028052230100b063200591a40280524c000014e80f41b2e0833291BBBBL4;FFe803009120013fd6e80340f91f0d00b141030054880200f9680080522a000014765e4429796240a9f50301aafdf601940004805201018052fbf60194400500b4L4;FB6c656374696f6e2077697468206c656e203e2075736", - "97a653a3a4d41580000008c934800000000004800000000000000af0000000a0000003078207c20000000L8;FF0900f0f2e8270039e90300f9e8ffff17e00300f941020090211818914302009063401891e00300914201805264018052eaffff17c80080d2e0230039e0030091BL8;FF0103009021601d91", - "040300f084c00c91a363009102028052a80f00f952770194686200910103009021542491040300f084400d91a363009142018052a80f00f9L8;FF00800991e85b09f9e83b49f9e277c13de0a3843de067c13de81700f9e83f49f9e1a7843de16bc13de80700f9e807409108810191e2ab843de09b843de19", - "f843dBBBL4;FF00a005910eb70194800300d000000691830300b063802291840300d084800691a24300d1a1038052a8273fa911b70194092843a9eb0309aa090100f929010a8bL4;ZDL8;FFf30300aae9031faa0a018052ff0308eb28008052a1030054b47c039b0b00f0d2f50304aa6b0104cb9f020bebe", - "8020054010100b4a17c019be00302aae20315aaBL8;FFe2031caae02700f912370194e8e740f9e98742b9fa5b06a91f0500b1e95700b960140054e8830291e0c3179101a1049144f7ff97e082c23ce182c33ce282c43cL8;FF3a03158b800f0094600745adb5a201916233c03de82342f9e10318aa408701", - "ad610f44ad601fc03d4217803d483300f9400700ad430b803db7fdffb5fc4f40f9BBBBBL4;FFbbffff17e08740ade20fc03de80740f9000500ad0209803dff430991f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e803049120040090L4;FF1f400039f44f41a9fd7bc2a8c0035fd", - "600018052010380521e070094fd7bbda9f50b00f9f44f02a9fd030091f30302aaf40301aaf50300aafa06009400048052L8;FF290100cb4a01008be0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6fd7bbea9f30b00f9fd030091080040f9f30300aaa80000b4600640f9BL8;FF08d1", - "40f89f5e00399f5201780000803d08d000f89f1201b80800f0d20900809280d601a9892200a9610240f93f0400f18a04005426000014fa860194a0038052L8;FFe84b00f9e85700f9e86300f9e86f00f9e87b00f9e88700f9e89300f9e89f00f9e8ab00f9e8b700f9e8c300f9e8cf00f9e8db00f9f832f8b", - "715fb7fd3b500f8b6BBBL4;FF620080526aaf11a9682713a9f5030aaa682714a9a80300b008c13d91bac31b3868ab00f9fb030baafdacff97ea0315aaf55f40b9eb031baa800744ad68220191L4;FB6174656420617420c00129000d4964656e74697479206b657920c023206973206e6f74207472757374", - "656420666f722072656d6f7465206164647265737320c0L8;FF0cc70094f5031faaf3faff178092c63cf40308aae8bf43f9fc6700f9fca35d3921830091e0e3803d022e8052e8f203f8e8c31591f7430d910081009105c70094BL8;FF08050091290040f9280800f90c0200b500fc55d393000014e10300a", - "9e00301aae10309aa220080520a060094e10340a92aa040a9536928380cfc5cd308050091L8;FF002036910e470094fd7bbfa9fd030091082440f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b140040054BBBBL4;FFaa094079783d4039a80316b80", - "81c40b9a93316b8a9f140f8e80f00b9a8194039e91b00f909184039a8a3173808084079ec1f00b90c0040b9a9231838697140f8L4;FB76312f6368756e6b65642f73656e645f63742e7273002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766L8;F", - "Fc2018052a40080523c000014e80f41b29dffff17e06301f92102009021e018912302009063a01691e0030b91420280520401805227000014e0230b39e0030b91BL8;FFe40200f084a02f91a363009122028052a80f00f95467019468e20191e102009021201e91e40200f084203091a363009102028052a", - "80f00f94b670194e1020090L8;FF420080520b670094686e40f9a80000b4607240f901f57ed34200805205670094687a40f9a80000b4607e40f901f57ed342008052ff660094688640f9a80000b4BBBL4;FF22008052e00308aa0aa70194e00317aaf40000b4f70300aae00315aae10314aa2200805203a7", - "0194e00317aa088fff97e003c03d08008092685a00a96082823cL4;FF2005005460424079002c46d31fbc0071ed070054611240f921cc74f240090054340000b08202109141404e393ffc0371600700542104001141400e39001c0051L8;FFce110a0a101a0a0a20240913311e0a0a42280a0a632c0a0a28", - "340d13e4c3841aef150a0a52220a0a21380e13a5300a0a2901044a6b010c4a00240a0a08350a0aBL8;FF0b804039e9031f2a6c0240b94d7c40390080c03c0a0d00f96a3240b84e7041f80b8100394b0040390c1100b84c1c40390a0500b96a111d124b5040780a850039L8;FFe10314aae20319aaf50300a", - "a11270094572340f9b6831ef8b8431fb8f70200b4561f40f9ff260094e00317aa21008052fd260094800700b4e10316aae20317aaBBBBBBBL4;FF9cf9ffb520000014090180520801098b292100910801148a206b68fc00a8200e0a00669e0afbffb5f9ffff17200340fd00a8200e0800669e0801c0da081", - "1c0daL4;FFfdc3009109504039e9020037011040b9155840a9f30300aae0030091f40308aad3120094e0630091e10316aacf140094e1030091e2630091e00315aa33f6ff97L8;FF810000b4600640f922008052091b0194e00313aa0105805202018052051b0194a00640f9e10316aae20314aa031b0194b", - "40a00f9f44f43a9f70b40f9f65742a9BBL4;FF0fe11f380f1540394d000d4a0c0100392c15403903094039210940390b0500394b02104a8c010f4a11194039201940390a0d00390a1d40392e1d40390b110039L4;ZFL8;FFe40314aaa8831ff8579b0094579b0094f44f43a9fd7b42a9ff030191c0035fd6", - "ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aa810100b021bc1991BBBL4;FFa8031df8e1f7c43d08088052a9831ef8000801ade057c03da80203a9e00313aa0083853ca08b7eada1039c3ca85e04a9a10200ada20a803dfeda0194e09740f9L4;FB08000000000000002064440000000000000", - "0000000000000080000000000000008000000000000001058440000000000556e6578706563746564547970655572L8;FFe8d340f9e04b823de85304f9e86740f9e85704f9e8ef40f9e85b04f9e85740f9e85f04f9e86f40f9e86304f9e85f40f9e86704f9e8e340f9e86b04f9e85b40f9BL8;FFe19f843d", - "07a600948083c23c8183c33ce85748f9f93348f9e06f833d8083c13ce173833d8183c03ce8eb06f9e06b833de167833d27000014e01bc43de83b48f9L8;FFe81b41f91f0500b1e00d0054e94b42b9e84f42b9f62341f9e9230529e85b42b9e82700b916aa00b4f31f41f9fd5a0094e00316aa21008052fb5", - "a0094c01101b4BBBBL4;FF17000014086aec38a805f836090a80528a2100d1ab0a40f989fd099b4a010e8a0d6a2c38ac0e40f9080140920a020a8be00f43ad680108cba18b7bad4d210039L4;FB726167652f696e6d656d2e7273002f636172676f2d72656769737472792f696e6465782e6372617465732", - "e696f2d313934396366386336623562353537662f68L8;FFa5020094e08745adf50300aaf4eb00f9e0870cade28346ade2830dade18343ade1830aade28344ade2830bade18341ade18308ade28342ade28309ade18340adBL8;FF0b3041a90e3440a92f6868f86e010e8b08210091cbcdcbcace81ce931f", - "010aeb8c010fcaad010c8bacc1cccaad010b8babbdcbcaad81cd938e010e8bccadcccaL8;FF080117cbbf0208eb29c6ff54e0630091e10317aae20315aa2300805224008052e390ff97f71740f929feff17e0630091220080522300805224008052dc90ff97BBBL4;FFfb031faa180080920805009135008", - "0525a008052e83700f9f44340f9480080d2a06301d10800f0f29702168ba8831af84aa3ff979402168b2803188b9c16c038L4;ZBL8;FFe87301f9e00714ad800a41ade00b15ad10bb0094f8000014f5f340f9d71f00b400bb0094e00317aa2100805238008052fdba009480fcffb4a1020291e20317aaBL8", - ";FF081848abe2090054180118ab020a0054390700f194c2019161feff54080317ab22070054c902158b080109ab62090054691640f9090100b42a0140b24a11c0daL8;FFe00315aae1031aaa22008052093b0094683642f909c143393f0d0071c1260054e10000f021200d91e0830f91020380525f140094", - "e8fb41f9eaf741f9f5031faaBBBBBL4;FF230080522400805279fdff97760a40f940ffff17e00313aa22008052230080522400805272fdff97610a40f973feff17e00313aae10319aae20317aa23008052L4;FFe1031faa220080522300805224008052ffdb01a9ff1700f9ebebff97e81340f929068052e", - "0030091e10313aaf61700f909010039cd04009480a20091e1630091L8;FFd716088bc82640a9e3830091600640a9e20314aae82700a9c82641a9f86702a9fa6703a9e82701a91f0b019420fd0737d6820091df0217eb61feff54600640a9BL8;FF2800805278e600a968020039b60000b4e00314aae10316", - "aa22008052058b0194b50000b4e00317aae10315aa22008052008b0194f44f4da9f95340f9f6574ca9L8;FF5f0109eb084000b9010000ad01fdff54f30300aae0430a91a7d3ff97e00313aaf34f41f9e2ffff17e84b41f9f84f41f9f40317aae80f00f9990300b548008052BBBL4;FF0ccb0194b80000b4e", - "0031caae10318aa2200805207cb0194b60000b4e00b40f9e10316aa2200805202cb01949b0100b4e00314aae1031baa22008052f44f56a9L4;FB080000000000000094f5450000000000696e6e65725f6d73670000000000000000000000000000000800000000000000080000000000000074f845000000", - "0000L8;FFe00717ade00bc23de1efc13de8270ea9e96744f9e87b40f9e00b18ade2f3c13dee6344f9e96300f9e9734ff8ed6f44f9e18b14ade1fbc13de0ebc13de8bb01f9BL8;FFa80000b4608a40f901f57ed342008052084b0194689240f9a80000b4609640f901f57ed342008052024b0194689e40f9a", - "80000b460a240f901f57ed342008052L8;FF1f0500b1802300546c030094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb482200545b010014e80300aa098d40f8BBBBL4;FFe83f40f9e92b48a9480101d12b01019109dd7992e92f02a909fd47d308194092e82", - "701a948011a32e80f00b93e000014e8d676d3e08753adea03142aa9dad793L4;FB0000000000000000080000000000000008000000000000005876420000000000000000000000000008000000000000000800000000000000184d420000000000L8;FF2300805224008052e9000094760a40f9680240f90", - "80116cbbf0208eb29f7ff54e00313aae10316aae20315aa2300805224008052de000094760a40f9b1ffff17BL8;FF29194a8b29050091280108ab02040054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108aba2020054092c40f9L8;FFe10319aae8b340", - "f9e97304f8e9a34539ec7b0079ebf303f8e8f304f8e95f01398375fe97e103002ae8430691e00315aaa7bbfe97e8cb40f98082c53c8182c63cBBBL4;FFe91640381f01096be0179f1a23ab0194180700f11600160a21ffff54e003162a1eab01941f1c0072c0070054280080526822003928008092680200", - "f9b50a00b5L4;FF7c0d0094e88300910900009029212191a8273fa9e8030091210000b02148019100210091a24300d1defcff9728008052e80300f9770000b4e00314aa7f030094L8;FFcc6a6c789f213b6b08818b9a3f0500f108ffff54c90a088b2a0140795f213b6b6100005434050079caffff17a903", - "5ef81325889a5f0309eb40030054d70a138bBL8;FF404fc03da80359f8e05344f94003803de8f304f900c1ffb4e15744f9c1c0ffb422008052032b019403feff17c082c73ce8a344f94003803de8f304f9fefdff17L8;FF00001891ff0316b9e83b00b93d2a0094e80356b9e00740918100805200001891f", - "f0316b9e83700b9362a0094e80356b9e00740918100805200001891ff0316b9BBBBBBL4;FF20008039a001f8b728040091490400d121000014890080d248008052e02300390900f0f2e827003928017fb220000014e80741b21e0000145f2800f188000054L4;FF0b0b0094ba0000b4e00316aae1031aaa2", - "200805207130094bb0000b4e00319aae1031baa2200805202130094e043139121008052ce0a0094f66f42f9e47342f9L8;FF0ad100780b3d0039c0035fd609fc74d30afc6cd30bfc64d30c0c8052001d00390901003909fc5cd30c2c08330a0500390afc54d3090d00390910805229340833BBL4;FF08e13", - "491e82706a9200300d000e83291e83b00f9a80301d135930194a1835df8810000b4a0035ef82200805201930194760a40f9680240f9df0208eb61000054L4;ZDL8;FFe1825ff881ffffb4e00240f92200805208930094f8ffff17d50000b4a806158be00314aa0201805201f17dd30193009408008092685", - "e00f9f44f43a9f70b40f9BBBL4;FF0900f0f2e8a7003929090091e91300f9f3feff17890080d2e0a30039480080520900f0f2e0830091e8a7003929090091e91300f91ec80094dcfeff17e80741b2L4;FB4716e40db55b9ebf8997d71c000019312952c9acd0edc00d4791bbc3e719e8f88d8adb93c773a7", - "c1c07bf6641f9fe4d7b2f182ca87c567f6e9b30ec6be20b2b2L8;FFe9231fa9e80f42f9e90742f9fb6f42f9f97342f9fcbb42f9e8cf00f9e81742f9f4c742f9e0f3803de8c300f9e81b42f9e8ab00f9e81f42f9e92312a9e82342f9BL8;FF84e03c9142800991a10380524803003918530194c00200f0002", - "01591c20200f042203991e103805233530194e04316912200805207120094e1d342f942faff17L8;FFe17740f9081140f900013fd6e06b01f9e8c31791e16f01f9290c40f9e1830b9120013fd6fcfb42f99f0f00b101010054c800805217ffff17e04bc13de14fc13dBBBBL4;FFe96a9852f30308aaa9d5b", - "b725f01096ba1040054680400f008b140f9680300b4a91b00b9a8630091e90300b029510d91ea030091a07f0091e82700a928008052L4;FBea010000050000009a964800000000003300000000000000f0010000050000009a964800000000003300000000000000fa010000050000009a96480000000000", - "L8;FFe00313aaf5f1ff9740010036210c00b5e0031faad3ffff17e003082ae20313aa430c805297ebff97c0f9ffb4c3ffff17a80640f91a0101eb0201005499000014BL8;FFa9131738a94357384a01084a6b01084aaa231738aa5357382901084aab331738ab635738a9431738a97357384a01084a6b010", - "84aaa531738aa8357382901084aL8;FFe8d302f9df0600b1a033005480220291572c0094080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308eb4832005401020014BBBL4;FFe00308aa0bb30194e0031caa08008092b90319b8a88318f8a70000143f0c0071c0050054", - "3f10007161070054a80357f81f0500b18100005428008052bf0318f8L4;ZBL8;FF60910091e20315aa28b30094a00100f000c43a91a20100f042203b918102805225b30094a20100f042e01691a50100f0a5203791e1230091e0031f2ae3031faaBL8;FFa102009021c00a9102028052a302009063dc1691", - "c40280529600001448008052e0a33239e8a73239c80080d20800f0f246000014e05306f9e0833291a1020090L8;FFe84b05f92a28ff97e80300aae84b05f9e0432a91e10000b021400591a2018052e30000b0639c0591240280522b000014e04b05f9e0432a91e10000b021400591BBBBBL4;FFf76240391", - "b00188a296b7bfc208d282e0800669e1cc101f2e0020054e90700f98803c0da0811c0da680f488b0801188a3a1b08cb48035df8bf0208eb21010054L4;FF890000b029493591e8d709a908018052f5430c91e9fb01f9890000b029a93691e88f01f9e8a301f9e8b701f9e8cb01f9e8df01f9e8f301f9e807", - "02f9e90f02f9L8;FF011440f9f30300aa3f0800b1800100543f0400b140010054810000b4601a40f92200805203030194612240f9810000b4602640f922008052fe020194740240f9BL8;FF3f0500b1e0010054ff8300d1fd7b01a9fd430091010300f021802991240300d084e02091e323009182008052e", - "80700f942830194fd7b41a9ff830091c0035fd6L8;FF750200f9df0600b180020054745e47a9970100b49822009104000014f70600f118630091e000005401835ff881ffffb4000340f922008052fe820094f8ffff17BBBL4;FF84603791e0031faaf70301aae1031f2ae3031f2af50308aa36c3019402a0", - "9152a403009084c03791e204a072e3031f2a30c301941f0017eb610100543f00166bL4;FB0e00000026000000496e76616c6964496e7075744c656e677468496e76616c69644f75747075744c656e677468496e73756666696369656e7452616e646f6d6eL8;FF69d14578ea3b00f90a908052e10fc23d28", - "41082aea6300f9ea435f39e00b18ade213c23d699145b8ea6300b9eaa35f39e417c23d3b8108aae18b14ade11bc23dBL8;FFf44f42a9f50b40f9fd7bc3a812faff17e00313aa220080520e020094610a40f9dbffff17f50300aae00313aa2200805208020094610a40f9e00315aae3ffff17L8;FFfa0301a", - "ae106f8b6fb031faae0031baae1031aaa1443009402430094e00280522100805200430094c01c00b40801009008a13b911a0380d20001c03d08f140f8BBBBL4;FF99008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb83d700541803008bf9feffb50f0000141f0400b1e1d600", - "5421e301941f100031L4;FB73696f6e2070726f746f627566000000000000000000000010000000000000000800000000000000508e43000000000000000000000000000100000000000000L8;FFd8010094f7cb43f96083c03ce8d743f9ff0600b1e0df813de8c303f920160054e8430f91018300910270", - "80520081009108e30094e0d3c23de1dfc13de9670b91BL8;FFc2008052e40314aab3831ff85663019468620091c10200f021403091a32300d1e2008052e40314aaa8831ff84e6301944e630194f44f43a9fd7b42a9ff030191L8;FF6aa240a9e00740f9690240f9e10313aa54692838080500911f0048f16", - "80a00f9e3fdff540b7c0e533f0108eb7361193220010054536928380cfc5cd308050091BBBL4;FFe20316aa0001188b12a301941803168bf82b00f93f0318ebc0080054e82740f90a070091e1030191e00315aa0902805209693838ea2b00f96a8eff97e12b40f9L4;FF3907005139771e5325070011240b", - "001163d865781f0003eb9980991a42d879781f0002eb3997991ae003192a46feff97e103002a8002f837397f4093c0021091L8;FFfd7b01a9fd430091810100f0210c1691a40100d084002391e323009182008052e80700f945a30094fd7b41a9ff830091c0035fd6810100f021fc159182008052BL8;FFf", - "52340f9fd7b43a9ff830191c0035fd6090440f98a0200b04a210e911f7d01a90a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6e8230091090000f0BL4;FFf30300aa350200b49682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef82200805201230094c1825ff8e1f", - "effb4c00240f922008052L3;ZBBBBBBBBBL4;FFfc6f05a9fa6706a9f85f07a9f65708a9f44f09a9fd030191150c40f9e9430091e22701a9a80201ab420f0054170440f9f30300aae9060091ff2200f129fd43d3L4;FFf96343a9f55b44a93f0b00b1e1020054760300b4e8c30091e00315aae10316aade27", - "fe97f91b40f93f0b00b1c1070054e8fb4039e97b407937008052ea3b40b9L8;FF62010054a101f8b722008052f44f42a9fd7b41a9ffc30091061d0114f44f42a9fd7b41a9ffc30091c0035fd68002009000a01c91021d01948002009000801391BBL4;FF21008052089d0194c05100b4e10316aae20313aa", - "f50300aa0e9d0194e8434339e803082a09028052290108cb7f0209eb620100541000001408008092880200f9L4;FF018c40b9a102f836611640f9601e40f93f0000ebc0000054632640f9e00313aa020080d2010080d260003fd6618240a93f0000eb60010054210000cbe00313aaL8;FFffc30091c0035f", - "d6fd7bbfa9fd030091080040f91f0500b1000b0054083040b9e80b0034080140b20811c0da081540d2080d088b0825019108fd46d308050091BBBL4;FFf7430591080b0039e82341b91b030039080f0039e81341b91c07003908130039e80341b908170039e8f340b9081b0039e8a75b29091f0039082300", - "39e8a75a29L4;FB1c0a4900000000004b000000000000007f0b00000e0000004572726f7200000089094900000000004900000000000000bb000000200000006e6f6e2d55544638L8;FFe9eb10a9e0bf46a9f7fb15a9f9fb42a9ed7300f9e72f44a9e8174da9f60310aaed0304aae40301aae1030eaaee03", - "1baaf00311aaf70306aafb6b4aa9e61f40f9BL8;FFe19fc43de0031caae2a3c43de8c34ef921058052e0ff833de05fc73d22008052e103843de207843de0f3863de8eb0df9005d0194e00314aa0104805222008052L8;FFe00313aae10317aae20315aa20000094770a40f9680240f9080117cbbf0208eb8", - "9f5ff54e00313aae10317aae20315aa17000094770a40f9a6ffff17e00313aaBBBBL4;FFf85f44a9fa6743a9fc6f42a9fd7b41a9e923c76cc0035fd6000400f0008015911bfd0194e923b96dfd7b01a9fc6f02a9fa6703a9f85f04a9f65705a9f44f06a9L4;ZFL8;FF48008052e0a300390900f0f2e8a700", - "39e91300f9e083009125f2ff97e10300aae00301aaf44f49a9f93340f9f65748a9f85f47a9fd7b45a9ff830291c0035fd6BL8;FF3f0400f18b000054601240f922008052087d0194740e00f9f44f41a9fd7bc2a8c0035fd6fd7bbfa9fd030091080040f91f0500b1c0040054080840f9090140b2L8;FF1f0", - "500b160000054e1630091708fff97954e40f9550300b4e11740f9e80f40f9964a40f91f0101eba0390054e81340f9490380522a040091e00315aaea1700f9BBBL4;FF02000014480f0091a00301d1a8031cf827b20094f90300aae1db41a9f76343a9f4d744a9790200b43f0400f18b000054e00316aa220", - "08052febc0194ff0600f1L4;FBa28749000000000054000000000000006500000005000000a28749000000000054000000000000007300000005000000a2874900000000005400000000000000L8;FFf60313aa9f01086b60090054080200d008b140f91f0500f1c902005448008052e901009029713391e", - "82707a9e801009008d93391ea0d8052ff2704a9c90100d0BL8;FF3f0500b1400400540a1440f9092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d2L8;FF02278052200700ade83302b9113d0094786a41f9756641f9080340", - "f9680000b4e00315aa00013fd6010740f9810000b4020b40f9e00315aafe3c0094ff0a00b1BBBBBL4;FF0001178b130d0294e802158b680a00f9804e41b980010034610a40f9680240f91f0101ebe0330054680640f9090580522a0400916a0a00f909692138e10313aaL4;FFb50000b4e0df40f9e10315a", - "a22008052080d0094b80000b4e00316aae10318aa22008052030d0094e15341f9810000b4e05741f922008052fe0c0094e00313aaL8;FFe92300a923faff97e90f40f9e83740b9aa058052e1630091e00313aa82048052e90f00f9e92f4429a8831fb8ea830039e91302b8e92b40b9eb6302b8ebc342f8BL", - "8;FFe90f00f9e083c03ce90f40f90001803d090900f9f44f45a9f65744a9f85f43a9fd7b42a9ff830191c0035fd633008052285440a9f4cf00a9ff0f00f9bf0214ebL8;FFdf0208eb41fcff54e0a303915b8c0094dfffff17284d1c9b090940f93f011beb29010054080540f9f5031f2a13797b78767e085", - "3e87740f99f0208eb40fdff54BBBL4;FF28008052680200b9ff030891f44f43a9f65742a9fc5f41a9fd7bc4a8c0035fd6ff8303d1e923076dfd7b08a9fc6f09a9fa670aa9f85f0ba9f6570ca9f44f0da9L4;FB73686f756c642062652061626c6520746f2073656e64206374320000000000009120490000", - "0000005600000000000000a20000003100000000000b1016201d30L8;FF6083c63c6183c73c6283c83c6383c13ce077813d6083c93ce17b813d6183c03ce083813d6083c23ce15f813d6183c43cf4bb42f9e27f813d6283c33ce067813dBL8;FF084d0194e0031aaa210080523b008052054d019440f8ffb", - "4fb0340f9e2031aaafc0300aae1031baa0a4d019418000014e8ef41f9080f00b4e9f341f9e80302f9L8;FF29194a8b29050091280108abc2010054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8BBBBL4;FFe0230091e10317aae", - "20315aa230080522400805276dfff97f70f40f9e80740f9080117cbbf0208eb49f7ff54e0230091e10317aae20315aa2300805224008052L4;FB657373696f6e537472756374757265496e76616c696453656e6465724b657953657373696f6e0000f4224000000000002000000000000000080000000000", - "0000L8;FFb9ffff17e00313aae10316aae20314aa2300805224008052e5020094760a40f9680240f9080116cb9f0208eb69f7ff54e00313aae10316aae20314aa23008052BL8;FFffc300b9ffcb00b9e84b00f9e85700f9b8031cf809000014c1520191a20301d13957ff97401200b5b8035cf8f90318aa2", - "28f40f8620f00b4010340f93a008039L8;FFe8a3039181820091a50303d102048052e3031caae4031baaa0073aadf55b02a9fa2700a96dc2fe97fb7740f9e082c03ce182c13ce282c23c7f0700b1e08705adBBBL4;FF95020191a82735a9e18304ad6af6ff9700e4006fa0833aada0833bada003d53ca103", - "d63ca203d73ca303d83ce327803de223803de11f803de01b803de20f41adL4;FF63080054680640f9e10315aae20316aabb02168b0001178b660e0094e802168bf5031baa680a00f9ecffff171f010271800100541f01037100fcff5448030037L8;FF400080524100805207ad0094401900b4fa0300aa03", - "ad0094400080524100805201ad0094801800b4fb0300aafdac00944000805241008052fbac0094c01700b4BL8;FFe8631639880200f008e11991e8d302f9e80180528083cf3ce8f304f94003803d57000014f5c742f9f7cb42f99b0280d21b00f0f2e8a75139e8060036e14741f9L8;FF81ffffb4a00240f", - "922008052092d0094f8ffff17e89740f928f3ffb40805088be00313aa0201805201f17dd3fcfeff17ea074091e90756b9f7e742f94a011891BBBBBBL4;FFe1031faae20314aa230080522400805277070094e90640f9610a40f9680240f99f0209eb9532899a080101cbbf0208ebc9f9ff54e00313aae203", - "15aa23008052L4;FF0000803d08e000f8c8028052e88319a9e16b42f9c10000b4e0031baa22008052fb030caa03150094ec031baaff0600b1e00300543f1300f1c10b0054e8d340f9L8;FF3f1a007143feff541f050071600b00541fb60071c10c00541f0100718801881a3f1100f103fdff543f0500b1e1", - "fcff5496000014cf0540391f820371f1150012BBL4;FFf90f00f9716c0094e11500b5fa0319aa280319cbf90f00f91f7d00f129180054a10240ad88021a8b55830091f9c30091010100adf50f00f958050034e00316aaL4;ZBL8;FF762a40f915008092750200f9df0600b18002005474de45a9970100b49", - "822009104000014f70600f118630091e000005401835ff881ffffb4000340f922008052BBBL4;FFc9080054810340f9200080398000f8b728040091490400d1110000145f2800f1880000542800028b08f1df388804f837e0830091d33d0094e82340b948320037L4;FB6363657373000000e82049000000", - "00004900000000000000a501000013000000e82049000000000049000000000000009d01000016000000e820490000000000L8;FF21000891e9a30fa912d50094f2031aaa08e30d91f6f300f9000540ad08cf41f9f8c341a9ea0312aaedcb40a9e30317aae4031baaec0b45a9e95f4ca9fb0314aaBL8;FF6", - "8280054e00200b000c009910c550194e8031faa000119ab42730054e1431691b70d0094f90b40f9df0a00b100040054e1d342f9e8cb42f91f0101ebe0530054L8;FFe85b06f9ff5f06f9ea6706f9e87306f9e97706f91355009452000014e0032d9192eeff97e1fb42f93f0400b1a0140054fb4340f9fa83", - "0291810000b4e0ff42f9BBBBL4;FFa83b0079e81b00796852017828008092aa1b00b9a9031ff8ab831f38ea0b00b96a1201b86c7201f869f201f86b9e0039680200f9fd7b44a9f32b40f9ff830191L4;FB737065724d6573736167654b6579736c69627369676e616c5f70726f746f636f6c3a3a646f7562", - "6c655f72617463686574736b697070696e6720636f72727570L8;FF200200543f080071e1030054898246f83f0500b1a10000549fe606a99ffe07a999fe08a99f9a00b981a20191e003082ae20313aadcf7ff97001200b520fcffb4BL8;FF1ffd0071a9010054087d0453290f0091684200397f2600a9f44", - "f54a9f65753a9f85f52a9fa6751a9fc6f50a9fd7b4fa9ff430591c0035fd6a8060091820601f1L8;FF280500b409e179d3f84f49f959038052361108cb04000014d6c201f118c3019120040054e1d342f9e8cb42f91f0101eb00030054e8cf42f929040091e00318aaBBBL4;FF21410094a80356f81f0500", - "f120030054c082c63cc182c73cc282c83c600604adc082c23cc182c33c622a803dc282c53c600602adc082c43cc182c13c600a03adL4;ZDL8;FFfa6748a9fc6f47a9fd7b46a9ff030391c0035fd6f3031f2af60300f99cffff17ff8304d1fd7b0ca9fc6f0da9fa670ea9f85f0fa9f65710a9f44f11a9fd03", - "0391BL8;FFe85306f99ff4ff97f3f742f9e8ef42f97f0208eb61000054e06317915a6bff97e8f342f909068052e02bc33de12fc33de233c33d6822099b69060091e0032d91L8;FF43010014e8e344f91f0500b14101005408018052ffe304f9f8e704f9bf7e0aa9bffe0ba9f8f304f9e8ff04f9ff0305f9f", - "90705f9a1420291a22302d16bf5ff97BBBBBL4;FF2981c9930badcbca4801088b6901098b0acdcaca0881c8932bc1cbca4901098b6801088b2c81c99329bdcaca0badcbca2801088b6a010c8b08cdc9ca4bc1cbcaL4;FFe10f40f9ea0740f98cffff17e0230091e10308aa020180522300805224008052e9", - "e5ff97e92341a98cffff17800000f00080059102050094ff8302d1fd7b06a9L8;FFf50b40f9fd7bc3a8f6feff17fd7bbda9f65701a9f44f02a9fd03009114d440a9f30300aa950100b49622009104000014b50600f1d6620091e0000054c1825ff8BL8;FF200440a9e82701a9e8230091090000d02941159", - "1e82702a9e343009122850194fd7b43a9ff030191c0035fd6202040a9210300d021342a91030d40f942038052L8;FF880500b4a80640f9ae0a00f9180100791b050079d6ffff179f0700f161000054e9031faa0c000014e9031faaea031caa4bfd41d36c01098b4a010bcb8df57ed3BBBL4;FFe10318aa18", - "c5019420008052e10313aa15c50194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff431cd1f30308aa08018052ff0300f9L4;FB656450656e64696e674b796265725072654b657963697068657274657874656e6372797074696e76616c69642073656e64657220636861696e206", - "d6573736167L8;FFe03fc03ddf0600b1e9c31391f4e31539e8bb02f9e8f34ff82091883ce8c702f900350054e8435039f7430d91e91742f9e012cc3ce0831d91e1e31c91e8031d39BL8;FF480080520900f0f2e8470039e90700f9ddffff17e00700f9c10200b021c00b91c30200b063d40b91e0230091a2", - "0080524402805286000014c90080d2a8831d38L8;FF08753091e82b1ea90a078052c8048052ff2719a9090100b0298d2691e92b1ba9290080d2e1430691a949c0f2e87f1aa9e8271da90b450094e80342f9e9235039BBBBL4;FF61180154f9ffff172ee50194f70300aa530080521f0400b13300a07201fd", - "ff54e04305918100805227e5019400170135fb5341b957ffdfc8d70200b4ff0600b1L4;FB4700000000000000320100000d00000014a443000000000024a443000000000024a443000000000024a4430000000000d0ee4800000000000000000000000000L8;FFe05bc03de8bb40f9f40300f9df0e00b1e0", - "83803cf7079f1a9f0600b1e80f00f9c0010054f82b40b9e00740f91f070071a90100547f020039940000b4e10314aaBL8;FF68ee00397f5a00a97dffff17ff0a00710101005417dd7892091f0091fb03082a06000014f7031faa091b009103000014f7031faa09230091681f4092e80208aaL8;FF810000b", - "480025df8220080520965009481025ef8810000b480825ef82200805204650094810240f9810000b4800640f922008052ff640094810e40f9a1fdffb4BBBL4;FF785200b9e20f41ade413c03de10340ada403993ca28f3bada1833aad610200ada2837bada103d93c620201ad6112803db60000b4e00317a", - "ae10316aa22008052L4;FFe20300cb160700d15600168ad602008b36cc01f9d606188be00316aa010000d4df0200ebc1faff5420cc41f9d50218cbe10318aa050080d20400801243068052L8;FFe00309aa6201805256a50094b40100f094a20b91a101009021801691e0230091a32300d102018052e4031", - "4aab3831ff84da5009468120091a101009021601791BL8;FFe8330091090000b029c106910010c03ce82702a908004039200440a9e9430091e8330039280000d008712e91820200b042e43a91e3830091e007803de92303a9L8;FFe0830d91e2d7c03de1030e91e00b813de10f813de08757ade213813de0", - "071fade08b58ade003813de18355ade207813de1031dade08b56ade00b1eade08754adBBBBBBBL4;FFa1825ef8810000b4a0025ff82200805208190294a10e40f93f0400f1ebfdff54a01240f92200805202190294ebffff17880240f9280100b4090d8052e00313aaL4;FFdb10009428008052ff2b00f9a", - "18300d1ff2304a9e2030191e0031aaa3bf4ff97350080929c000014e89f4139e9534678a1035ef8fc834139fa3740f92841082aL8;FFff030191c0035fd6e0030091f35b00a960f5ff97600200f000801a910b190194600200f000e01a9108190194600200f00080229102190194ff8301d1fd7b01a9BBL4", - ";FF69fe00a9600601ad6212803d7f0200f9f44f5ba9fc575aa9fd7b59a9ff030791c0035fd6e00740ad08008092e20bc03d6082803c6182813c6282823c680200f9L4;ZFL8;FFaa835538a96315386901084aab935538a97315384901084aaaa35538a98315386901084aabb35538a99315384901084aaac", - "35538a9a315386901084aabd35538BBBL4;FF3bd90194e8030091e90000d029e13491a82739a9e8830091a90300f029c10d91aac301d1a00700d1a8273aa968008052c90300d029c13391e1e30091f91300f9L4;FB3253616d706c6564001b737071722076312e73656e645f63742e726563762065706f63", - "6820c0243a20456b526563656976656443743153616d706c6564202d3eL8;FFfa5740f9f1a34ca9e2c345a9e1d348a9610a0014e9030eaafcbb00f9fc0305aafa0302aae4e300f9e50314aaf40310aae29349a9f80309aaf0a74ba928a00791BL8;FFe00318aa19692138e9d302f9e11a0094e1431691ba1", - "10094080340f91f0500b1a0000054e243169120008052e10318aa04160094e10318aa288c43f81f0500b1L8;FF3df5ff97e0140036e1fcffb4b001001401830191a22302d159f4ff9740fcffb46f010014e02e00b5a02302d132f5ff97a00d003681fbffb47a01001401e30191BBBBL4;FF28008052e21bc", - "03de93b40f9800600ad820a803d891a00f968720039f44f4ba9f74b40f9f6574aa9fd7b48a9ff030391c0035fd6000180520102805215f90194L4;FB20746f6f206f6c64203cc0013e0025636970686572746578742076657273696f6e2077617320756e7265636f676e697a6564203cc0013e001e756e72", - "65636f67L8;FFd9fcff17880080d20800f0f208050091d5fcff17880080d20800f0f208110091d1fcff17410200b021802091430200b0639c2091e0c30391e200805264018052BL8;FF030300b063082a91a00301d1620280524401805212000014a0031cf8010300b021182e91030300b063802e91a0030", - "1d162028052e401805209000014a0031cf8L8;FFe11fc43de223c43de09b843de19f843de2a3843d03790094007880522100805201790094207201b4e10319aa02788052fb0300aa07790094e09bc43de19fc43dBBBL4;FF2800805288420039e92347a90a0400918a0600a93caeffb58b0300b06b611991", - "0a018052600540adffab08a9ff4f00f9f6570ca9e00705ad9f8100f142050054L4;ZBL8;FF610500546c0400f1800e00549f2900f14d018052eb031faae9031faaea031faa8c318d9a4d040091ae696a384a0500915f010cebcf194092ce1d0013ef21cb9aBL8;FFed030eaa81feff54ca010aab22020054", - "2801088b480108ab8202005409804039000509ab22020054fd7bc1a8c0035fd6e8031faa091c40b949fbff35e9031faaL8;FF68021e3968621c91220101adc00644adc21ec03d60d6813d61da813dc0864fad62d2813d000500adc08659ad68621b91000500adc022c13dc11ec13d68e21b91BBBBBL4;FFf", - "60303aa40f3ff97601800b5e9031faae00314aae30316aac4ffff17e00317aa89090194e30317aae80300aae90301aae00316aa88fb0736a7ffff17e80f40f9L4;FFc00180522100805207090094c00200b4880000f008fd3991890000f0298d3991cb0080520a0140f9e92f02a9086140f8c9018052e00b", - "c03d0a0000f9086000f8L8;FF29c13e910a0000904ae12491400200f000803f91e92b00a96902009029610691e1030091e92b01a931090194fd7b42a9ffc30091c0035fd6000040fd28018052BL8;FFe90f40b97b2201a9e87b40b969020139e9fb4079681204b8e8c3413969520478e92340f9685e01396", - "97204f8e82746a976a205a9e87e045369f204f8e93f40b9L8;FF02308052080300f912890094e93740f9eafbff179f8200f121080054e1834ea9e81f40f91b410079000440ad000500ad610000b422008052fe880094088b41b9BBBL4;FF080102cb9f0208eb08020054b40200b4f50301aaf60300aa02c9", - "0194e00314aae10313aa00c90194800200b4e80300aad5a200a9df0200f9f44f42a9f65741a9L4;FB08000000000000005406460000000000000000000000000008000000000000000800000000000000bc0446000000000000000000000000000800000000000000L8;FFe5e743f9fc7700f9fc0315aaf5", - "03102ae27744f9eb6740f9f02340f9e13340f9e3b7803de20713adec2b4ba9e8a301f9a8008052e0a3803ddb020014f60301aaBL8;FFa1fdffb4801240f92200805209490194e9ffff17f44f41a9fd7bc2a8c0035fd6ff8300d1fd7b01a9fd430091e10b00a9c20200d042e00891e70305aae60304aaL8;F", - "F080c48f81f0500b18002005428fdff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab23010054BBBBL4;FFf85f41a9fd7bc4a8c0035fd620008052e10314aa14e90194ff8307d1fd7b18a9fc6f19a9fa671aa9f85f1ba9f6571ca9f44f1d", - "a9fd0306915c2040b9f403032aL4;FBe41f400000000000280000000000000008000000000000007492400000000000e41f400000000000300000000000000008000000000000003094400000000000L8;FFf9030b913a0080921b0180523c008052f7cb00f9e8f300f9a90311f8a0c303d1eee7ff97f403", - "01aac046003788fe60d3a82e00b5800a40921f1800f1a22e0054BL8;FFfd030091210300b4090040393f210071810300543f8418f121040054f50300aaf40308aaff68019400c4805221008052fd680194200400b4a106009102c48052L8;FFe8c700f9e8a759a98082833ce8a716a978caff34e11740f92", - "1caffb4e00b40f922008052036900944dfeff17fb0300aaf80b00b99a0400b4fb0300f9f9680094BBBL4;FFc0035fd6a04301d121008052220080522300805224008052759bff97b6a37ba9e0feff17a04301d1e10316aae20315aa23008052240080526d9bff97b6035cf8L4;FFe2830f32010000d4c0fe", - "ffb6000080d21f000039007d20d4b542069120008052a00a0039f35341a9f51340f9fd7bd9a8c0035fd6fd7bbea9fd030091f35301a9L8;FFfd7bc6a8c0035fd66082c73ce8af40f90a0480526182c63ce99b40f9bcc303d1e083853cf50340f9e83700f9a85701d1e183843ce18f48ade08b42adbf8200f", - "1BL8;FFa0873dade00b5cada08b3eade10359ada1833bade2035aada2833cad0f29019400e4006fe00319ade0031aade0031bade0e3803d48d776d3e0075badea03162aL8;FF20013fd6fa034bf95f0f00b141080054c8008052f6eb42f9f5e742f9e8e3163949008092670000141a0180d2e8031faa38ff", - "48d31a00f0f206000014090180d2BBBBBBL4;FFc10c00343f040071200100543f080071c1faff5481220191e003082ae20313aa2afaff97a0faffb49900001481820191e003082ae20313aa33fbff97e0f9ffb4L4;FFe4830c9143038052f41700f9f5d700f9ce040094e8ab4bf91f0900b121400054e8cb", - "41b9c836003436008052f31b00f9df02086be0431391a14700d1d526961aL8;FFf44f45a9fd7b44a9ff830191c0035fd68804805249008052932200a989420039f44f45a9fd7b44a9ff830191c0035fd6ff0301d1fd7b03a9fdc30091600200b0BBL4;FF010040f9f40302aae28b815228144038e8030039", - "e8030091000140b20d9101949f8218f161040054e10315aae2c3805228144038e8833139e8833191000140b2L4;ZDL8;FFff430191499100140a10009109200091e8230091200440a9a9031ff8e9ffffb029313491eaa300a9a84300d1e91700f9620100f042581091e9a301a9e3430091BBBL4;FFf90301", - "aaa101f8b6f6031faae00316aae10319aa14d1019428008052f3031aaa38008052e83b00f9e05340f967a80094f90301aaa1feffb7fa0300aa190b00b4L4;FBa1b3d7a7539ac0e0f1fbd1a00da647de446fa28cbcdc9c090000e6dcac7a3c5ce0ef84ce527407242bb0294934211e40d0c335297ca5adaa6", - "b804b949a33491dL8;FFea3f00f90a255ca9eb271ea90b255da9e97f00f909f140f908fd40f9ebab05a9e88300f9e8430f9100610091e94b00f908d10094e0233391e1430f91022f8052BL8;FFe08705ade237803d000e0054e082c33ce182c43ce8a30391e282c53c00630291a0073bade082c63ca2033c", - "ade18345ade237c03da1033dada2039c3c0d7aff97L8;FFe8f304f94003803dffa71139e89740f91f0500b160000054e02b40f993eaff97f4db51a9960100b49822009104000014d60600f118630091e000005401835ff8BBBBL4;FFe30319aae40318aafb030291e10300f9e00301ade00302ade00303ad", - "973b009460874bad280080526267c03d635bc03dfc830391e0830391a10303d1e2830091L4;FB3200000000000000a800000014000000656d7074792073656e646572206b65792073746174656c69627369676e616c5f70726f746f636f6c3a3a73656e646572L8;FF0800f0f2ff270039e80300f928e6ff", - "97e80300aa210200f021f41a91230200f063881591e003009102028052a4008052e80300f909000014e00300f9210200f0BL8;FFeeffff17ed031faaa90109ab62030054280108ab02020054096840b989010034290140b22911c0da291540d2290d098b2925019129fd46d329050091200108abL8;FFe80", - "74091088109917f0700b1c02900540021049126250094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb68280054BBBL4;FF08020036a8835b3849a34ab8abe35b78aa935b381f050071a98311b8abc311788c0d0054280e0035e90f41b274000014686e00a97d0", - "00014f6031f2a84ffff17L4;ZBL8;FF84b10094a1035af8810000b4e0031caa2200805207b10094bc035cf8f70315aa760a00b4a0835cf8480701d11f0008eba9110054e0031f2ae80316aae90317aaBL8;FFa003d83ce1833291022b8052f30703f9e80303f9e8c3179100810091e07f813d0c310194e8f", - "b42f91f0500b121e2ff54e99f40f9f30200f068b240f93f0500b1L8;FFe85303f9080000f008212c91e9a304f9690000b029c10d91e8a704f9e8831a91a04700d1e9af04f9e900009029a13e91e8ab04f928008052e1432a91e96705f9BBBBBL4;FF4d00261e0d0600372d00805202000014ed031faa8c21", - "009180010e8b0e000a8a22696efc438c202e6f00669eefc101f2c1fbff54e8ffff1701827ca915de3ca9L4;FFd40200b4b982009104000014940600f139c300912002005421035ef8810000b420835ef8220080520201009421835ff8e1feffb4200340f922008052fd000094L8;FF4a050091290500d10a", - "2500a9fd7b43a9ff030191c0035fd63f2900f1880000544b01098b6bf1df388b0cf8374b05c0396c1d00128c6119538c01210b81010251BL8;FF5981019468a20091010300f021302a91240300d084e02691a363009122028052a80f00f950810194010300f021201891240300b084402391a36300910201", - "8052L8;FFea1700f909692138a5ecff97e16300918380ff97807e80b980010034e11740f9e80f40f91f0101ebe08b0054e81340f9090180522a040091ea1700f909692138BBBL4;FFe863403915f000f80938003929008092087c0039080480520a7001f8602201a9692200a9f44f45a9f71b40f9f65744a", - "9fd7b42a9ff830191c0035fd6aa0300b0L4;FB632f737472696e672e727300000000000479490000000000340000000000000037010000220000004d414320766572696669636174696f6e206661696c656400L8;FFf50300aa13c1009444000014550f00b404c10094e00315aa210080523900805201c10", - "09460fdffb4e10318aae20315aaf60300aa07c100947000001436008052BL8;FFe00313aa2200805212000094610a40f9afffff17e00313aae10316aae20315aa0c000094760a40f9680240f9080116cbbf0208eb69f6ff54e00313aae10316aaL8;FFe00314aa017d099b02018052f44f42a9f65741a9fd", - "7bc3a806410014f44f42a9f65741a9fd7bc3a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9BBBBL4;FFf9ffff172fe10194f70300aa1f0400b141fdff54e0430591810080522ae1019460970035e85341b9e88300b957ffdfc8d70200b4ff0600b100030054f8430591L4;FB3e002f727573", - "74632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c6962726172792f616c6c6f632fL8;FFe0030eaa220080520ae10094e00314aae8e740f9485602b4e1e740f922008052ff074091ffc30091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a", - "9fd7bc6a8BL8;FFf44f41a9fd7bc2a8c0035fd600018052010480521f610194fd7bbda9f50b00f9f44f02a9fd030091f40302aaf303012af50300aafb6001940005805201018052L8;FFa8031df82a56ff97e10300aa7a000014e00700f9210100f021203891230100f0637c3891e0230091a20080524403", - "805296000014c90080d2e843003948008052BBBL4;FFe083873ce8a747a9482701a908008092485300a96a0100142003c03df43b00f93b008052e083873ce0c301914b89ff970803156bf51f00b903fcff5409358c52L4;FF1fcc74f22101005420008052c0035fd620cc749200fc44d3000400d11fc022e", - "b63f8ff54e6ffff1700cc749200fc44d3000400d11fc022eb82feff54bcffff17L8;FFb30f00f958a1009468920091810100f021281991a40100d084c01691a363009122018052a80f00f94fa1009468a20091810100f0214c1991a40100d084401791BL8;FF0f210194800200b000401791752101948002", - "00b000c01891820200b0420019912102805211210194800200b000a0179103210194800200b00000189103210194BL4;FFa8831cf8a8c300d1a02301d1a9ab3ba9e908ff97a8035ef8b7031ff8140117eba3080054b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054L3;ZB" + "BBBBBBBBBL8;FB63762065706f636820c0223a204374315265636569766564202d3e20456b53656e744374315265636569766564000c73657373696f6e20666f7220c01d206861L8;FF22feff9042e03191810280521ca1009420feff900024319122feff90424032918102805216a100942000805201048", + "0520da10094ff0303d1fd7b06a9fb3b00f9BL8;FF60220091f30b40f9fd7bc2a8a1feff17f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4600640f922008052ce240194L8;FFfd7b43a9ff030191c0035fd63f2900f1880000544b01098b6bf1df388b0cf8374b", + "05c0396c1d00128c6119538c01210b810102516b00f8374b0080524c000014BBL8;FFf903002ae00301aaf40305aaf50304aaf80303aafa0302aaf30308aab0600094f60300aae0031aaaf70301aaac600094fa0300aafb0301aad264019400048052L8;FFa0c300d1420180528400805223000014a0031d", + "f8a1fdfff021c42691a3fdfff063302791a0c300d142018052440080521a000014a0031df8a1fdfff021c42691BL8;FFc80080d20800f0f2080500d1e80300f9e003009111ebff97e10300aae10300f9a1feff9021481391a3feff9063b00e91e0030091c20180524400805296eaff97L8;ZDBBBL8;FB420", + "24000000000006a00000000000000950000002e000000110000000000000014000000000000001400000000000000087f400000000000197f400000000000L8;FFe00316aaea1700f909692138e16300912692ff97f81740f9e80f40f9080118cbdf0208eb88840054e81340f9e10317aae20316aa000118", + "8bd68400940803168bBL8;FF4003188be10315aab302028be1040194e87b41f9e97f41f940030291e1c3089122008052080500b12935899ae87b01f9e97f01f910010194ffbf0a39f6031caaL8;FF22008052e30313aadc040094000300b50e00001428008052090180529f6a29f8880200f9f44f41a9fd7", + "bc2a8c0035fd6d30100b4d3040094e00313aa21008052BBL8;FF69010034290140b22911c0da291540d2290d098b2925019129fd46d329050091280108ab830000544d000014e80308ab62090054693a40f9090100b42a0140b2L8;FFe81f40f9e10315aae20317aa0001148be0440094e90344a9080009e", + "b630e0054ff0208eb68080054340117ab420e0054f42300f9090740f9280117eb03080054L16;FFeb4744f9e84b44f9e82f03a9e85744f9eb5344f9e8d300f9e85b44f9eb230ca9e86744f9eb6344f9e86f00f9e86b44f9e85f00f9e87344f9e85b00f9e87f44f9BBBBL8;FB9201480071010000c7005d00", + "98000a00fc001d01b600820141004d01007c494c059ea36eca27c5006c4c5c24749464b03aa21632820854000000d50046009c00L8;FF6901084aabf35838a9d318384901084a220080526801084aa9e31838a8f31838e18305adf46b00f912910094e08745ada8035ef87f1e0139e82300f9e86b40f9BL8", + ";FF0a2040f9092c40f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b250191L8;FF78c2ff97e0d300b9a04700d175c2ff97e0cf00b9a04700d172c2ff97e0cb00b9a04700d16fc2ff97e0c700b9a04700d16cc2ff97", + "e0c300b9a04700d169c2ff97BBL8;FFebfeff17a04301d1e10319aa02018052230080522400805247e0ff97bae77ba9a1035bf83c230091546b39f83f001ceb28dfff54fefeff1760ffffd000602491L8;FFe8e742f9e2031f2aea1700f9e80f00f9e8d345b9e93700b9e82700b9e8031691400707adbb03", + "18f8b58318b8d6690094e88345b9e9c742f902a0915284fdfff0L16;FF12000014e0dfc13de8c343f909008092690200f9fa031c2a6082803c680e00f9e1b340f93f0400f18b000054e0b740f922008052d0d40094e883059100c10091BBBL8;FF080117cbbf0208eb29ceff54e00313aae10317aae20315", + "aa230080522400805245000094770a40f969feff17e00313aa2200805223008052240080523e000094L8;FFe1d342f9e8cb42f91f0101ebe0660054e8cf42f9090180522a04009109692138e1431691ead302f96f0d0094df0600b18000005480020391e143169195100094BL8;FF01f17dd302018052f44", + "f42a9f65741a9fd7bc3a8d8f40014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f30b00f9fd030091012440f9f30300aa3f0400b1L8;FF1f000039007d20d46300060b9f00036b4b010054000080d21f000039007d20d463141a127f003f7180000054000080d21f000039007d20d4631240f97fcc74", + "f2BBL8;FF02000014ec031faa8b010b8b2801088b49010b8be14316910001098b3a120094da0300b4e1d342f9e8cb42f9f60700b9f63749f91f0101ebe0d50054e8cf42f9L8;FFe1f343f9810000b4e0f743f922008052d9340094db3400942002805221008052d4340094201f00b4880c805269fdff9029", + "c1149108400039c80080d22001c03dL16;FFe00315aa2100805239008052d9b40094202700b4e10318aae20315aaf60300aadcb4009450010014560080d2e083029181220091026e80521600f0f2f5830291BBBBBL8;FB2070726576696f75732073657373696f6e2070726f746f62756657686973706572", + "4d6573736167654b6579736c69627369676e616c5f70726f746f636f6c3a3aL8;FFa0ae40f922008052db9c0094a1b640f9810000b4a0ba40f922008052d69c0094680240f928f3ffb5ff030791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9BL8;FF490380522a040091e00315aa6a0a00f90969213", + "8e10313aa3bfaff97770a40f9680240f9080117cbbf0208eb880a0054680640f9e10316aae20315aa0001178bL8;FFfc834139fa3740f92841082ae91346b8378108aae11340f9610400b525000014d60c00b4d71c0094c001805221008052d01c0094c00b00b428fdfff008fd0391BBL8;FF608708ade08", + "742ad624f803de213c03d600706ade18343ad622f803d610307ad56220094a10303d1e00316aae20317aad85c0194608744ad73060091e80b40f9L8;FFa0077dade22f833de137833de033833da1efff540023019125fbfe977affff17e81f46f91f0500b1e1000054ff1f06f9f62306f9ff2706f9ff530c", + "b9ff2f06f9L16;FF6a0a00f909692138e10313aa27eaff97770a40f9680240f9080117cbbf0208eb280b0054680640f9e10316aae20315aa0001178bd7dc0094e802158b680a00f9BBBL8;FF882600a9680240f9090540f91f0009eb49010054e80f41b2e80300f9e00300910e830094f44f45a9f65744a9", + "fd7b43a9ff830191c0035fd60a0140f9290100cbL8;FFe81f0af9e8270af908788052e82b0af9e8330af988230f91f8230af9fb2f0af9f6370af90001803de91f0bf9f6230bf9d17c0094f43349f9e043069181230091BL8;FF02018052dcfc009468fe4ad3090880520811c0da280108cbe90080521f1d0", + "0f10831899a29008052360908aae80313aa954e00a9885a01a9f44f43a9f65742a9L8;FF8c01c05a1f0100f1ad011f124a011f128c7d1d536b010d8bed179f1a6a010a8ba901092a4b010c8be7ffff1754fc41d30d0000141f4100f1ea279f1a29010a0aBBL8;FF4a01084ac00640adaad318386a01084a2", + "801084aaae31838e10300ada8f31838a0073ead13390194a9035538480d8052aa135538ab235538e00740ad2901084aL8;FFeb432a91ecc32491691140b8ea6745f9fa4f40f9883100b8e8436b396081c03ce93309b9e903092a6181c13ce8a30f39883140b86c7e0e91eaf301f9ea5f45f9L16;FFe0031c", + "aae10319aa22008052f50309aad9bc0094e90315aaf70000b4e00318aae10317aa22008052f50309aad2bc0094e90315aab40000b4e00309aae10314aaBBBBL8;FBac55ca5195df0e01ebd65a6c0f0a035f86ecf00540b07e4f890cb8bec41f23695c3f3db95a978f187637506e0d61ed3ea28c370adbfd2", + "10807340000f77bd10fL8;FFe8a71429a94e1453a84a1353e8a71329a9461253a8421153e8a712297f00001428000013290402532a0803532b0c0453e0e340b9e2db40b9e3d340b9f79740b9BL8;FFfc5b02f9e85f02f9e86702f9e94313396501001428008052e80f00f9e82b41f9e80700f9e83341f9f9", + "3f00b91f0500b14157ff5415fbff1728008052e80300f9L8;FF608600ade00742ad681a00f9e80b40f96082833c6182843c742200a9f44f47a9fd7b46a9ff030291c0035fd6e00b40f927e6ff97480080d20800f0f2742200a9BBL8;FFb80000b4e00319aae10318aa22008052d94c0194a8a300d1a96301", + "d1e1630191e82f00f92800009008d12e91e82706a940ffffd000d83291e83b00f9a80301d1L8;FF280108ab8300005426000014e80308ab82040054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab22030054L16;FFf1d300f9f1031baafb0312aaab0", + "b0014082340391f090071808700541f0d0071a19e0054f7030caa360080523904001408234039f87700f91f150071e1220054BBBL8;FFa1e6ffb422008052db6c019432ffff17a9e300d1aa635df8288140b829c140786a6201f8a88319b8a80319b8681200b9a8e35df8a9431978692a007968e201f8L8;", + "FFe02340f9080d8052826f089b0080c23c1a0040f901a00191e00a803d0080c33ce00e803d0080c43ce012803d0080c53ce016803d0080c03ce002803d0080c13cBL8;FFf70b00f9d2080094e08741adf50300aaf4ab00f9e08708ade28342ade28309ade18340ade18307ad402300b4e0c3039193f7ff97", + "f6000014e1430091e20313aaL8;FF007840b9cdffff97007c4093280780d2010000d43bf6ff97fd7bc1a8c0035fd6fd7bbaa9fd030091f35301a9f303019154008052f55b02a9f50302aaf76303a9BBL8;FFe1d342f9a0fcff17f90300aae04316912200805291100094e00319aaf90b40f9e1d342f9c3fc", + "ff1720ffffb000c001912929019420008052017880520a290194L8;FF00013fd6e0e302f9e8074091e1e702f908011891290c40f9e163179120013fd6fa034bf95f0f00b161030054e8008052f6e742f9e8e3163949008092f5e342f9L16;FFe17342f9fa03002a810000b4e0031caa22008052d8ac00945", + "f1f0072f4c30791c00a0054e0031baa0104805222008052d1ac0094a1835cf8e00f40f9610000b4BBBBBBL8;FB722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f73657373696f6e5f6d616e6167656d656e742e7273001b737071722076312e73656eL8;FFa12300d1fc430091e", + "8230079bdccff97df0a00f1830b00548806168b54034079f303002a1afefff05a430c91d60600d1150900d10800001427070094a0020079BL8;FFe20313aa430c80529cf5ff97e10300aafaffff17e1031faae86b00b9f7ffff17680240f9080540f9190101ebe2000054aa000014e20313aa430c80528ff", + "5ff97L8;FF42003591a0c300d123028052f40308aa12120094a8577da9b6077ea91f0900b141010054e8230091e00316aa72d8fe97950100b4e00316aae10315aa22008052BBL8;FF090900f9ea0f02f905000014a2a300d1830c805261e3ff97601100b5bc835df8fb031caa628f40f802f4ffb5b900001", + "45f2800f1880000542800028b08f1df38L8;FFa2035ef8a20a00b5a08300d1b4573ea9b6031ff8b7831fb83b5d00941f04003180080054f40f40f9760080520800001400010039b402148ba08300d1f40f00f9L16;FF8400805209000014e00300f981fefff02150169183fefff063101591e00300912202", + "8052440080529be6ff97e10340f978ffff17ffc301d1fd7b03a9f72300f9BBBL8;FB30f845000000000020000000000000000800000000000000141646000000000030f845000000000010000000000000000800000000000000ec16460000000000L8;FF7f0600b1a086ff5480220491e163009117a2ff9", + "731fcff17e063009122008052230080522400805284a4ff97e11740f99bfbff17e06300912200805223008052BL8;FF5f0008eb28060054ca02178b280117eb6a0200f942f5ff54c0fefff000c002912dfd009420008052615a40a9f58300a9ff0f00f9df0215eb89f7ff54e0230091L8;FF48031ccb1f00", + "08eb080600541b001c8b7f0315eba9010054bf0200f12803959ae90308aa08f97fd33f011beba3ffff543f0148f136319a9aa9021ccbc8021ccbBBL8;FF682600a922010014a8060091220400f1f40301aaa88b32a909008092a86303d1bf8319b8bf031ab8bf831ab8bf031bb8a98313f8a90315f8a9831", + "6f8a90318f8L8;FF810000b4e20a40f9e00315aada4000949f0b00b1410d005468ae42b90801003660a24aa961b242b9081540f900013fd6606601f9616a01f93cffff1760a248a9L16;FFff074091ffc30091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd688018052e92b5ba9e8", + "7300f9ebcf40f9e77740f9e82f40f9f0cf00f9BBBBL8;FB153b2b5d5c872222973c72d61ca8f0dc178b9b37da103467c2194145b101b272badecbcf9b0927aee05f00005aedbd5f63735b067e4f7d61091d8803527d77e9L8;FFfd7b44a9ff430191128d001408feffd008710b91e00301aae10308aa6202", + "8052fd7b44a9ff4301910a8d001408feffd008ad0991e00301aae10308aae2028052BL8;FF0001803d08018052e8cb05f9e8672a9100f18f3ce8c32c91e99b05f9ea9f05f90003813c0083823cf6bf05f9e0e3823dfa1f06f9fa3706f91f7f07a9f6d705f9L8;FFe83340391f0900712007005489060091c", + "80209cbc80600b41f0500f1aa02098be1000054490140393fad0071000600543fb50071c00500540200001449014039BBL8;FFe84742f91f0900b121040054f46f41a93b0c00b468071b8be9f301b2960a40f9695595f208f17dd31a6100d148ff43d3087d099bd50208ab42010054970640f9L8;FF08004", + "0f9e20301aa002140a9e10308aa444d0014281040b9000040f96800c8376800d037304d00143c4d00143c4d0014000040f9dc4eff17000040f9e90cff17L16;FFf19740f9fa1351a9e86b40f9e9eb03f9e1031d91e07f04f9e0430f91e20319aae8a703f9e8fb40f9eea303f9e8ab03f9e8e740f9fcb703f", + "9e8af03f9e8bf40f9BBBL8;FFa90cf8b7280400914a0400d1e800001401500591e003022ae20303aa2df6ff97e01e00b4e00700f9a1ffff9021203f91a3ffffb0635408917e00001401400591L8;FFe8008052e90741b2681a00f9080080926006803d682600a93c000014080100d0081140f9480300b4e8", + "4301914900009029c10b91a82734a928008052c9fdffd0BL8;FFe80b41b2e00700f9b4ffff17c80080d20800f0f2080500d1b0ffff17c80080d20800f0f208090091acffff17c80080d2e0230039e00300910800f0f2ff270039L8;FFaa030094c08240391f1040f2010c0054c41240f99fcc74f2a00b005", + "484cc7492844000d160000014ebf9ff97e10300aa82018052000080d2220000b99a000014BBL8;FF3f0308eb49100054f87749f91f0700b1a015005480220291fb170094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebL8;FF209600b4e10314aae20319aafa0", + "300aae0300094e29340f9020000143a008052e3074da9c0220a914dc2fe97e0fbc33de1ffc33dd4220b91e207c43dd5220c91L16;FFc00641adf70300aa610e40f9000400ad810000b4601240f922008052d6b0009408048052e00316aa010880522200805268de01a9681600f9cfb00094e10f40f9BBBBB", + "L8;FB7375636365737366756c206465637279707420616c776179732068617320612076616c69642062617365206b65790000bb124000000000003800000000000000L8;FF080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091092440f93f0500b1400400540a2c40f9093840", + "f90a0100b44b0140b26b11c0daBL8;FF32150194fd7bbfa9fd030091083040b9c8030034080140b20811c0da081540d2080d088b0825019108fd46d308050091090840f9090300b40a0440f9ec031faaL8;FFee031f2afc031f2af7031f2a090000f9086000f8ec0741b22bfdffb06ba13391ed018052f00", + "3182ae2030a2a4a070014e96f42f9e87342f9e9a31ba9b60000b4BBL8;FFe2031aaafaff0039e2580194e00318aae10317aa22008052d7580194e00316aaaf540094faff403908088052f60301aaf70300aafc03009102011acb390002ebL8;FFe0ff44f922008052db580094681240f9080700b4e1f342f", + "9e2f742f9e8833291e0db42f9e44b40f9430302917007ff97fc5346f98082c03ce85f46f99f0b00b1L16;FFf65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd621010054810000b4801240f922008052d3d80094811a40f9a1fcffb40804805205000014811240f9BBBL8;FFaa0640f9490108ebe", + "3470054aa0240f9e00b40f9e303162a4801088ba82600a9680240f9080540f9180100eba2010054e80f41b2e80700f9e0230091077f0094L8;FFe1d752b9e2db52b9e3431691c0008052501400949f0e00b140020054e1d342f9e8cb42f91f0101eb60b70054eb074091e8cf42f92a0400916b8109914903", + "8052BL8;FF60a240f901f57ed342008052daf8009468aa40f9a80000b460ae40f901f57ed342008052d4f8009468b640f9e80000b460ba40f901f57ed342008052f30b40f9L8;FF29c10092e00100544b0540f9ff0900f1ec032baa8cfd47d38b194baa6bc100926901098be00000544a0940f9eb032aaa6", + "bfd47d36a194aaa4ac100924901098bBBL8;FFf4074091948209919e880094e1074091e0431691023f805221800991dd38019488e20791000540ade8f36879e8e30a79e057813de15b813dbc010014f6c744f9L8;FF401a00b5a02302d187f4ff97c010003601eeffb4d5000014402200b5a02302d181f4f", + "f974010003641edffb415010014e17f0ab967ffff17a88357f8080540f9L16;FFe02bc23de10fc23d3b8108aae97344f96b1147f8e00b18ade213c23de00bc23de9a301f9e31fc23df6cb43f9e18b14ade11bc23de203c23dea7202f8eaa35f39BBBBL8;FB612072656365697665642066726f6d2072656d", + "6f7465207061727479436861696e206e6f7420617661696c61626c650042024000000000006a00000000000000L8;FFdd880094f30740f9a003da3c19038052a9035bf8f80f40f9fa230191680240f9a0039d3ca9031ef81f0500f1ab000054600640f901f97fd342008052ce880094BL8;FFc282c93ce93", + "304f9400500ad2a0080528083ce3ceaa71139eacf42f902f18f3ce803169122b7803d6001803dea5301f9e95f01f982a1ff97e80356391f050071L8;FF155c00a997008052350080523f0700f1f78b01f9e08f01f9f59301f9c0040054f7031faa79420091350080523a03178be8e30691400740a9fb1c00", + "94e8bb41b9BBL8;FF280080524001803d0a008092ff2315a92081823ce8bb00f9e8c700f92081853c09018052e8ff1ba9ffa31ca9e8030591e05b803de067803dffab1da9ea2701f9L8;FF2083c63c2183c73ce82b00b9e8430691e00705ade10240adfab30a39e10302ade10ac03de10b03ad14e0fe97e9", + "9341b93f09007121080054e8cf40f9e9a341b9L16;FFf9030faaed0317aaef031eaafe0310aaf0030aaaea0314aae40308aae8030eaaee0311aaf1031baafb0312aae31340f9f44b40f9f70302aae22f40f99f070014BBBL8;FF810680521e65019420008052010480521565019480fffff000001d912b65", + "019482fffff042601491e00301aae10318aa1665019482fffff042801291e00301aaL8;FFe20315aacd070094770a40f9daffff17f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291BL8;FF99f5ff9700fe073728fc60d3c80e00b52", + "00840921f1800f1020f0054217c0353210f00343f040071c00300543f080071e00100543f0c007101050054888248f8L8;ZDBBL8;FF2007c03de9b341b92143c23ce8c741b9f81f40b94003803dfacf40f9e002803de9d302b9214b803dec030b915f0b00b141d6ff54f3feff178083c03ce8430f91L8;FF", + "0867089b0a070091ca0a00f9144d00a9170900f90081813c091500f9f44f45a9fb0b40f9f65744a9f85f43a9fa6742a9fd7bc6a8c0035fd6e00316aa91190094L16;FF29010acb0a0e8052292d0a9b0a0480522a6100a92a2101a9377d02a93f3100b92ae903a92aa104a939fd05a93f6900b9d4a8009400", + "04805221008052cda80094BBBBBBBL8;FB76696f7573207374617465733a20c0000d4964656e74697479206b657920c023206973206e6f74207472757374656420666f722072656d6f7465206164647265L8;FFff230da9e87f0fa9ff2310a9e87f12a9ff2313a9e87f15a9ff2316a9e87f18a9083c8052f", + "f7f02a9ff7f05a9ff7f08a9ff7f0ba9ff7f0ea9ff7f11a9ff7f14a9BL8;FF8c0148518d00f83761710c8b0b018052140000148d7d1c53ad0600340d00be528d010d0b4c2180396b710d8b8c00f8b761e10c8b2b0180520a0000144d254039L8;FF2120329143fdff9063e83291a0031df836000014a0031d", + "f841fdff902120329143fdff9063943291a0c300d1620380524401805230000014c80080d2a0831d38BBL8;FFba035df8b7035ef87f0600b1e81f40f9200300545f0317eb60190054a8835df8ea060091a1c300d1e00313aa49088052aa031ef809693738bce8ff97b7035ef8L8;FFe10313aa78fbff9756", + "0300b4610a40f9680240f9b70640f91f0101eb80080054680640f9490280522a040091e00316aa6a0a00f909692138e10313aa6afbff97BL8;FFe00100543f0c007161fdff54888246f81f0500b1810000549fe606a99ffe07a99f82083881a20191e20313aa9ef2ff97600400b5e1031faae4ffff178802", + "40f9L8;ZDBBBL8;FB0800000000000000080000000000000048ea450000000000496e76616c696453657373696f6e4572726f7200000000008c7e4500000000001800000000000000L8;FF2816005458000014f6031faa958640f9bf0600b1401700548022049160f2ff97080040b20811c0da081540d208", + "0d088b0825019109fd46d30800098b08050091BL8;FFc0035fd6fd7bbfa9fd030091050000941f1c0072e0079f1afd7bc1a8c0035fd6fd7bbda9f65701a9f44f02a9fd0300910800403929004039f40300aaf30301aaL8;ZFBBL8;FFea0f00f9e34300911c3f0194fd7b43a9ff030191c0035fd608200091", + "200440a9e92300910a0000904ac13e91e8a700a942ffffb042581d91ea0f00f9e3430091L8;FF217c0353010800343f040071000100543f08007141fdff5481220191e20313aaa3fdff97000100b483000014200e00b5e00313aa7cfeff97e80301aa80000036L16;FF68feff9008e11e91e8a303f940fef", + "fb000cc2191e8ab03f968feff9008412191e1032b91fb0302aae3031d9162008052f86305f9fc0310aae9a703f9e9af03f9BBBBL8;FB20706172616d732e6d61785f6f6f6f5f6b6579735f6f725f64656661756c742829000000000000003d044000000000004900000000000000950000000d000000L8;F", + "F29fd46d30801098b000500911f0009eb28dfff5400feff9000a00d912b8f009400feffd000403e91288f0094fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9BL8;FFf50346b9e042c13ce142c23ce0a30c91fcff42f961e2009102278052e01b813de11f813de88304b9da120194f66f41f9f36b41f9c", + "80240f9680000b4e00313aaL8;FFea0303b9e99301f9e8a30c39450000141f09007141050054e97342f90a0180d20a00f0f228dd78924c0140b228000014eabf40f9e97742f9f97b42f9e89340f9BBL8;FF10000014e8031faab60a40f976faffb5b41640f9e803088b54fbffb5f80308ab23fcff5460fff", + "fd000003b91274f019428008052ff0f00f9ffa300a957080035L8;FFf6bb41f9fbbf41f9000545ad5f0500b10231c03df5c341f9f7c741f9e95305f9400705ad000543ad4233803dffa71139400703ad020144ad420304ad010141adL16;FFe01700f9008540f9e9ab00f9093540f9e02b00f9008940f9e9", + "9700f9093d47a9e02700f9008d40f91b554ea9e00b00f9009140f9e9d700f909ed40f9e03b00f9BBBL8;FFe802158b680a00f9954640f9550300b4610a40f9680240f9944240f91f0101eba0160054680640f9490f80522a040091e00315aa6a0a00f909692138e10313aaL8;FF08011ccb5f0308eb492af", + "f54e0431691e1031caae2031aaac8110094fcd342f94cf9ff17e043169122008052c3110094e1d342f956f9ff17e043169122008052BL8;FF4b018052e0031faa4a010b8b29010bcb0a2500a9fd7b43a9ff030191c0035fd6e80741b2e0030091e80300f90bf9ff97e10300aa20008052fd7b43a9ff03019", + "1L8;FFe902005474044039801e7ed35f0000eb620200547408403911000014a1060012e0fcffb000a0139114c8613802000014947e01139400003780761e535fc020ebBBL8;FF80050054c1825ff881ffffb4c00240f922008052d8320194f8ffff17f37749f97f0600b140020054e18349f93f0400b1400", + "10054810000b4e08749f922008052L8;FF000200544e000014a8e300d1000540ad0209c03d620a803d600600ade8034b391f1500714cfeff541f0d0071800600541f110071e00800541f15007101080054L16;FFff0300f9f30300aa0232805200844eade10313aaf40308aae0071bad00884fade00b1cad", + "01804cade10319ad02804dade0030091e2031aadd6b20094e8430691BBBBBL8;FB1d1c40000000000054000000000000004c000000050000001d1c400000000000540000000000000059000000050000001d1c4000000000005400000000000000L8;FF688148f84081823c4181833c600542ade92300f90", + "9048052488104f85833899ae00701ad800702ade20342ad820303ade28747ade01bc03da28739ad8003883cBL8;FFf54f03a9937e089bde1a0194e00313aa01018052d71a0194a0831df8201100b4080d8052b3835df8fc031faa887e089bfb0314aaa8031ef81100001436008052L8;FFe0db4bf9a00000", + "b4e1df4bf9610000b422008052d81a0094584900b4e00317aae10318aa45020014fbdcffb5eafeff17200740adbf0600b1385b42a9e00715adBBL8;FF63701d12eb5300798b7041f8efb302f8affd68d3871040b824008052a6431a78e85344b8848001aae103192ab1831938910140b90cf040b9f21740f", + "9a7031ab8L8;FF02028052a3fdffb063403091e4018052a160ff97f55346f9e0833291e1032d91022b8052db5a0094e08332913af0ff97f30315aa69018052618e41f8280041d2L16;FF830c805242e1ff97802200b42b010014c1020291a2c303d15aecff97e02100b44e010014e8af40f9140101eba331", + "0054e8af40f91f0114eba9210054a0c303d1BBBL8;FF080117cb9f0208eb29faff54e00313aae10317aae20314aa230080522400805245060094770a40f9c9ffff17e00315aa28890094e20315aae80300aae00301aaL8;FF18830991e37a0094e0074091e8431691008009918fc5ff97e08741ade217c03", + "de8eb46f9f94b09f9e2a3843de267c33de09b843de06bc33de19f843de16fc33dBL8;FFfd030191f30300aa3f9400f16c0500543f8000f1400900543f9000f1e10b0054692240393fb50071410c0054693640393fb50071e10b0054694a40393fb50071L8;FF6e0e03535f010c6aac0172b27115520a72fe", + "52d38d118d9aec01100a5f010e6aaf017db29055530aef118d9a5f01116a6d4e53d3f10153b210020b0a2f128f9aBBL8;FF29fd46d32905009102000014e9031faa280108ab02060054097040b93f05007141010054097440b9290140b22911c0da291540d2290d098b2925019129fd46d3L8;FFe2031aaa", + "f50300aae23a0094fb031caafc4f40f90200001435008052e9c32491e8432a91f87b05f9200541adf88305f9f8c30d91fc6305f9fc6b05f900818b3cL16;FFddba0094fa031faa762201a9080080927a0600f93ffaff1729008052e96b00f9880100b4fb0308aad6ba0094e0031baa21008052cfba009440", + "af00b4e16740f9BBBBL8;FB58000000000000005f0000000500000073697a652073686f756c6420626520636f7272656374000074194000000000005800000000000000a00000002a000000L8;FF010f805218870094e0fdffd000a017912e870094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f", + "05a9fd030091ff4307d1f50301aaf30308aa15010037BL8;FFe00313aa0201805201f17dd3f9f7ff17f96f41f9eac31791f5e3573940c1c03cf7ef573941c1c13ce91f46b9280340f958914078f46b41f9e03f813de143813dL8;FFe00a00940002805201018052d90a0094200100b4140000f901fdfff02", + "1800d91130800b91f300039f44f41a9fd7bc2a8c0035fd6000180520102805209070094BBL8;FF21008052db4a0194001f00b4e10314aae2031baae02f00f9de4a01940a00001437008052381740f9d8fcffb53a0080523b2340f9f54700f9fbfdffb528008052L8;FF0811c0da081540d2080d088b08250", + "19108fd46d308050091091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140b26b11c0da6b1540d26b0d0b8bL16;FFe1200054282540391f05007181200054c80100b0081140f91f0900f149070054880100d008411f91e9eb01f9e8ef01f968feffd008e11e91e8a303f929038052BBBL8;F", + "Fe8270ba9e8530291c90200d029f11e91ea830291a04700d1e8270ca9e8f30191a10302d1e8270da928008052a9ffff9029b10b91682703a988ffffd008f51b91L8;FF604640f901f97fd342008052da6a0094684e40f9a80000b4605240f901f97fd342008052d46a0094685a40f9a80000b4605e40f901", + "f97fd342008052ce6a0094BL8;FF99f7ff97e80301aa80000036a80600b5e1031faadaffff17e1031faa883200b9d7ffff1781020054e1031faae00301aaf44f45a9f65744a9fd7b43a9ff830191L8;FFe90300aa1f3d00383f4d0038e80300aae90300aa1f5d00383f6d0038e80300aae90300aa1f7d003", + "83f8d0038e80300aae90300aa1f9d00383fad0038e80300aaBBL8;FFe0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0316d1f30300aaL8;FFf60300aae32a0094935a00a9930a00f9f44f42a9f65741a9fd7", + "bc3a8c0035fd620008052e10313aa0f270094ff8300d1fd7b01a9fd430091e80301aae00700f9L16;FFf60f00f975d2ff97e003152ae123009172d2ff9796224039f50f40f9e80740f9df0a00712d010054df120071cc010054df0e007141030054bf0208ebe0030054BBBBBBL8;FB746f636f6c2f737263", + "2f747269706c655f726174636865742e7273002f72757374632f3438613232396365616566643439383563353039393062313431313662L8;FFdbffff17e91f40f948008052e0830791f30301aa28210039280100f90ea6ff97e10313aad2ffff17e0230191f40301aae183079102308052d69e0094e8031", + "faaBL8;FFf50b00f9f44f02a9fd03009148008052f40301aae10302aa000d002af30302aa39fcff97e00314aa3a0a0094e10313aa35fcff97801a40b980010034610a40f9L8;FF68320039f44f4fa9f6574ea9f85f4da9fa674ca9fc6f4ba9fd7b4aa9ff030491c0035fd620fdfff000a037912b1b0094ff", + "0303d1fd7b09a9f6570aa9f44f0ba9BBL8;FF7c0e00f9e35e0194e91740f928008052282100393f0100f9ff031191f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd680ffffb000e03991L8;FFe1c2c03ce8a305b9e067813de163813d8607001435008052f6b340f9d6e9ffb53a0080", + "52fcbf40f9fceaffb528008052e82700f9e8e740f9e98742b9fa5b06a9L16;FFe00315aacaffff17f50300aae00313aa22008052230080522400805287020094610a40f9e00315aaceffff17e00313aa2200805223008052240080527f020094BBBL8;ZBL8;FFe0fdffd000000591307b0094e0fdffb0000", + "03b912d7b0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9ff833cd1BL8;FF00008092744200914efb00941f0400f120fdff54f44f44a9f65743a9f85f42a9fd7b41a9ff430191c0035fd6f7031faae00317aae10314aa0bfb0094c0feffd0L8;ZFBBL8;FFb", + "b8353f80083c03c0183c13c0283c23c7f0700b1e08705ade237803de00a00540083c33c0183c43ce00315aa0283c53ce10314aae00707ad0083c63ce20308adL8;FF683642f9619243f9094940f915ed40b918a140b917594f293f0100f1fa079f1a810000b4608e43f922008052d23e0094619a43f9f56b", + "00f9810000b4609643f9L16;FF6083c23ce163813d6183c33c5f0700b1e81303f9e27b813de067813de16b813d404900546083c43c6183c53c6283c63ce8e35539fac301f9e0071ead6113c13cBBBBL8;FBa28c935fa54c00002c5d04c6d549f47937ce5561074fe06ce3416cbdbebdd9af5166a96b0879a", + "741e7598a03cada0ad6260c58b75a2e324b9da1092fa9fc8163L8;FFe08e00944000805241008052d98e0094a07800b4eaa74da928008052e84f1ca9f32f40f9fc7f1ea91c038052e82710a9ea7f12a9eaa74ca9e8531fa9f4031faaBL8;FFe0833291e1feff9021203f9102028052e3feffd063b41d91a4", + "028052fe000014e05306f9e0833291e1feff9021203f9102028052e3feff9063603d9104028052L8;FFf65741a9fd7bc3a8c0035fd629008052097c00a9f44f42a9f65741a9fd7bc3a8c0035fd61fcc00a91f0000f9f44f42a9f65741a9fd7bc3a8c0035fd6d3d200a9BBL8;FF692200a930000014e082c0", + "3ce88241f8e00315aae003803de80b00f9b04a0094f60300aaa0020291f70301aaac4a0094f80300aaf90301aad24e019400048052L8;FFf30b40f9fd7bc2a8c0035fd6e80300aa098d40f83f0500b1201a0054f30300aae00308aab3020094e80300aae00313aa090140b22911c0da291540d2290d098bL", + "16;FFf74f40f9ef3b40f9e8030aaaea0b40f9e96340f9f6030daaed0307aae72340f9f57b40f9fabb00f9fa0310aaf00311aaf1031baafb0308aae8030eaaee0312aaBBBL8;FF00010039b402148ba08300d1f40f00f93d6b01941f040031e00800541f0002716200005435008052070000141f002071620", + "0005455008052030000141f404071L8;FF8082833ce98b01b98082c23c8112c03de8bf40f97a0200f98002803df45744a9e8ab00f9610a803d6082803c680e00f9f50000b4f30314aae00313aa52050094BL8;FFe20313aa230c805241f5ff97e10300aa20f6ffb4a6ffff17e1031faa883200b9adffff17", + "e1010054e1031faaa0ffff17c80080d2e11700f90800f0f2080900d1L8;FFc00a40f93f0000eb80000054000080d21f000039007d20d4c5824039a11000129f00016b4cffff54c11a40b92124c41ae1fe0737c11e40b92124c41a81fe0737BBL8;FF1f0308eb48360054e8cf42f9e10319aae20318aa0001", + "1a8bde2e01944803188be8d302f9f88b49f9580300b4e1d342f9e8cb42f9f98749f91f0101eba0360054L8;FF8100805200001891ff0316b9bf290094e0074091fa0356b98100805200001891ff0316b9b9290094e0074091f70356b98100805200001891ff0316b9b3290094L16;FF45feffb0a5e02a91e", + "1030191e0031f2ae3031faa00ab009440feffb000402b9123fefff063801b9144feffb084602c91a22700d1c102805213ab0094e0830091BBBBBL8;FB5e0100002e00000042024000000000006a000000000000006e0000002e00000042024000000000006a0000000000000002000000260000000000000", + "000000000L8;FF3293009400feffb0000018912f93009420feff90004003912c930094fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9fd030091ff4307d100e4006ff30300aaBL8;FF00ffff900020279130130194f3031faa080c47f81f0500b121e3ff54e8031faa080113ab6305005400ffff9000c0", + "369126130194f3031faa080c47f81f0500b1L8;FFa04700d177c4ff97e0d300b9a04700d174c4ff97e0cf00b9a04700d171c4ff97e0cb00b9a04700d16ec4ff97e0c700b9a04700d16bc4ff97e0c300b9a04700d1BBL8;FFf65718a9f44f19a9fd030591e10b04a9f603072af703062ae05700b9f40305aa", + "f80308aaa96f48a9e92f00f9a93f40f9e91f00f9a93b40f9e91b00f9b94f46a9L8;FF750b00b960c3803c61c3813c682f00b9ff033a91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6a0fdff9000202b91a2fdff9042002c91L16;FFf40300f95f0f00b1e80f00f9e8079f1a9f060", + "0b1e083803c60090054e9a340393f03096b430900545f0f00b1000e00543f03086be8979f1a08219f5a081d0072BBBL8;FFf70300aab6ffff17e80741b28dffff17e80741b29affff17e80f41b289ffff17e80f41b296ffff17a0031df8a1fffff021780391a3fffff063c80391a0c300d1L8;FFead302f9", + "780f0094e88349f91f0500b1c0000054e8074091e143169108810991008102919b120094f87f49f9780300b4e1d342f9e8cb42f9f97b49f91f0101ebBL8;FF611240f9a10800b4601640f922008052f30b40f9fd7bc2a8d7f6001460220091f30b40f9fd7bc2a87200001460420691c10000946022009107", + "feff9760420891L8;FF7f0214eb89000054608e5ff800003fd6fcffff17f35341a9fd7bc2a8b40a0014fd7bbea9fd030091f30b00f9f303002aecffff97ecffff97610a0094e003132aBBL8;FFe93b08f9e0110054e0abc43de1a7c43deac33391e2a3c43de95b49f94081883ce01bc43d4181873c428186", + "3cea3b48f9e9c706f9e25fc33de35bc33de163c33dL8;FF02288052e33600944805805269fdffb029751f91e8bb02f9c80080d20800f0f2fa9304f908390091e9b702f9e8b302f9a8000090081140f91f0500f169050054L16;FF69d140786091c33ce1f7c13de2efc13de3fbc13de8bb01f9e8c743f9f40", + "31aaae0d7803de0f3c13def0314aae87202f8e8bf5d39e6030991e08713ade407c23dBBBBL8;FB82000000090000007375636365737366756c6c79206465637279707465643b206d757374206861766520612063757272656e7420737461746500000000000000L8;FF00a00d9131830094ff4302d1fd7b0", + "4a9f92b00f9f85f06a9f65707a9f44f08a9fd03019137fc4039f40301aaf30300aa1610805235000191383040f92000178bBL8;FF290c40f9e103129120013fd6fbc342f97f0f00b1a106005488008052f43f42f9e8a3113929008092f53b42f9690200f9880240f9680000b4e00315aa00013fd6L8;FFf9", + "5f03a9e82300f968577ea9e82700f9dc060094e0031caa21008052d5060094001500b4e12340f9e2031caaf60300aad8060094a0a300d1e1031caa22008052BBL8;FF1f0500b161000054ff670ea9ff7b00f9c1c20091a20301d11fcbff9720f3ffb437000014a00301d12a550094f80301aa00f60736470", + "00014f8031faa45000014L8;FFe0430f915fdbfe97f82740f9e81f40f91f0308eb61000054e0e3009124e5fe97080d8052e92340f90827089b29008052097d02a9090180521a7100a91c070091L16;FFeefb00f9ee0310aaf1a34ca9f00305aaf5a70fa9e5a74da9e1030eaaf50314aae9ab18a90a008092", + "e9031eaaeb2b0ea9eb030daaed0317aaf7ef49a9faa700f9BBBL8;FFf40308aadf6601940004805221008052d8660194401b00b4c00640adf70300aa000400ade00315aaad620094f80301aaa100f8b6f5031faae00315aae10318aaL8;FF0dfeffb43f0108eb7361193220010054536928380cfc71d3080", + "50091290040f9280800f94c0200b5e0030daa47000014e10300a9e00301aae10309aa22008052BL8;FF800c00b5e00313aa97f3ff97e80301aa60000036a8f9ffb466000014e1031faa883200f9caffff17a10d0054e0031faa87ffff1721050054e0031faa7affff17L8;ZDBBL8;FFf44f41a9fd7bc2a8c", + "0035fd6fd7bbda9f65701a9f44f02a9fd03009114d440a9f30300aaf50300b496e2009104000014b50600f1d6c2019140030054c1825cf8L8;FF80010054c1025ef8810000b4c0825ef822008052d8260094c1825ff8e1feffb4c00240f922008052d3260094f3ffff17687a40f9c80000b40805088be003", + "14aaL16;FFe8031faa1d000014f6031faa0001805299eeffb5f80300aaf5031faaf7031faae9031faae8031faa14000014e20308aa290308eb00feff5408011b8bf50302aaBBBBBBBBL8;FB636820c0243a204e6f4865616465725265636569766564202d3e2048656164657252656365697665640010456", + "e636f64696e67206572726f723a20c000c02020L8;FFff3b01f9ff5701f9ff5301f9ff6b01f9ff6f01f9ff8301f9ff8701f9ff9b01f9ff9f01f9ffb301f9ffb701f9ff1701f9e81301f9ff1b01f9e81f01f9ff2f01f9BL8;FFe00315aa21008052f40315aa36008052d8230194a0feffb4080740f9f50300", + "aae00314aa020000143500805209fc4ad30a088052f4031faaf5ff03a92911c0daL8;FF08050091280800f92c0500b5e0030baa3f0108eb20010054290440f90a050091206928382a0800f9f44f42a9fd7b41a9ffc30091c0035fd6f30300aae00301aaBBL8;FFe82f40f9130540f91301f8b6f7031faae0", + "0317aae10313aa13600194ff4b00b9130080921b000014e82f40f9081140b9e82f00b9730200b4e61f00f9fb03192aL8;FFf85f41a9fd7bc4a8c0035fd6e8031faa74f7ffb5e00308ab43f8ff54c0fdff9000e0019129600094e00313aa22008052c2020094610a40f9a1ffff17e00313aaBL8;FFe00313a", + "a98f0ff97e80300aae00301aae8fd073708fc60d3080c00b5080840921f1900f1420c0054017c0353610c00343f040071000200543f08007161030054L8;ZDBBBL8;FBbb124000000000003800000000000000f00000000d0000006d697373696e672072656d6f7465206964656e74697479206b65790000", + "0000007310400000000000L8;FF59010014e11740f9e80f40f91f0101eb20710054e81340f92a040091e00315aa49088052ea1700f9096921387ef1ff97e16300911d91ff979f0700b180000054BL8;FFc0035fd6ff8302d1fd7b08a9f34b00f9fd0302910010c03c01f0c03cf30308aa08004039097c403", + "90a088052e013803ce0030091e1f3803c200440ad08111d12L8;FFf65742a9f85f41a9fd7bc4a8c0035fd6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BBL8;FF49ffff9029f107918a0000102b7968784a090b8b40011fd6082", + "00091200440a9e92300910a0000904ad13991e8a700a942ffff9042b41d91ea0f00f9e3430091L8;FFc0035fd63352ff97fd7b43a9ff030191c0035fd680fdff90002027912e40009480fdff90008027912b40009480fdff9000e027912840009480fdff9000402891L16;FF0ba542a9e92f17a90ba543a9", + "ea2f1fa9e99300f90aa544a9e9cf00f90ba545a9e9c300f9093540f9e9ab00f9093940f9e99700f9093d40f9e9ab1aa90a2548a9BBBBL8;FBb30100000d000000bb114000000000004700000000000000ce010000210000000000000000000000000000000000000001000000000000009c7944000000000", + "0L8;FFe80300aa098d40f83f0500b1201a0054f30300aae00308aa4d020094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098bBL8;FF29010a8b290500913f010aeb29030054280108ab8300005410000014e80308abc2010054090840f9090100b42a0140b24a11", + "c0da4a1540d24a0d0a8b4a250191L8;FFe8e301f9088c8152f6df01f9f9e701f9e8eb01f9d3050094f90300aaf60301aae8830891e043139101810091a44700d1e20319aae30316aa9ae9ff97e8d344b9BBL8;FFe007803d1f0500b1e1f9ff54eeffff17a0835df8dcffff17a0031df861ffffd021900491", + "63ffffd0630c0591a0c300d1a20280526401805212000014a0031df8L8;FFe103129120013fd6fbc342f97f0f00b1a106005488008052f43f42f9e8a3113929008092f53b42f9690200f9880240f9680000b4e00315aa00013fd6810640f9L16;FF8f390094e203012ae103002a8c390094e203012ae1030", + "02a89390094e203012ae103002a86390094e203012ae103002a83390094e203012ae103002a80390094BBBL8;FF09692138280400911f070071680a00f961050054881641b9080140b20811c0da081540d2080d088b0825019108fd46d308050091978640f9970400b4e90240b2L8;FF790c0094f90b40f9", + "1f0700b1c00e0054e1d342f9e8cb42f91f0101eb402a0054e8cf42f92a040091c02202914901805209692138ead302f94f220094e1431691BL8;FFe3100054ff0208eb09010054e0e30091e10317aa2200805262f2ff97f42344a91f0114ebe3100054e81f40f9e10315aae20317aa0001148bd6f30094e9", + "0344a9L8;FF010000d4df0200ebc1faff5420cc41f9d50218cbe10318aa050080d2040080124306805202008052e805009481020e9100ff4cd3201400f936cc01f925000014BBL8;FFe0031baae10315aa22008052da330194e13349f9f3074091738209913f0400f18b000054e03749f922008052d23301", + "943f0700b16000005460c20091f40c0094L8;FFe10316aa1830009420008052210280521530009460fdff9000c022912f30009420008052a10280520f300094ffc306d1fd7b15a9fc6f16a9fa6717a9f85f18a9L16;FF812200914083813ce107813de81302f9e91f02f91e150094e10b45ad480080d2e00", + "fc13de30bc13d0800f0f2f52b00f9f56b40f916017db2a18b39ade133c03dBBBBBL8;FB65656e20736574206966206b7962657220707265206b65792069732070726573656e74000000000039074000000000003300000000000000210200000e000000L8;FFa05701d1e257c03de1830091e00704ade087", + "47ade22b803de00702ade08b48ade00b03ade08746ade00701adf7140094a0c303d1a15701d102048052f8040094BL8;FF0b7c1253ec0f80120a0900390c440c33090d00396a6d1c320a0100390c050039cdffff17f703002ae0230091e10314aae20315aa89ffff97e003172ae80b40f9L8;FFa04700d1e", + "143139137e3c0a9362340b902048052e03b813de037813d6ec9ff97e9bf5339e84353390a088052e00740912a15003308111d1200401d91e8431339BBL8;FF600602adc082c43cc182c13c600a03adc082c03c600601ade28344ad620200adf44f5aa9fcb340f9f65759a9f85f58a9fa6757a9fd7b55a9ff", + "c30691c0035fd6L8;FF61fdfff021203f9102028052a3fdffb063d43091a4028052fe000014e05306f9e083329161fdfff021203f910202805263fdfff063603d9104028052f5000014L16;FF690200f9fd7b47a9f34340f9ff430291c0035fd6e80180520900809268220039690200f9fd7b47a9f34340f", + "9ff430291c0035fd6e8031f2a6822003908008092BBBL8;FF616e40f93f0400f18b000054607240f922008052d87b01946002039154ffff976022019125ffff97617e40f93f0400f18b000054608240f922008052ce7b0194L8;FFe8e30a79e37b0094380080527400805215008092e8d342f9e067c13de9", + "4306912081009102708052e8a302f9e843169101610091e04f813dd67b0094e063c13dBL8;FF0a819f1a8d0d00122e10403929010b0b4a114c0bbf25007129c100110b819f1adf7d02710914003949c100110a819f1a0918003969010d0b4a114e0b29c10011L8;FFe802168bf5031baa680a00f9ecffff1", + "71f010271800100541f01037100fcff5448030037090480520900ac7248030836aa26407848031036ab26407848031837BBL8;FFe80f41b20b00f0f23f01007108018b9a29019f9a0a018a1a26000014e89340b8e90f40b9ec234079ea2341b8eba34039680a00b9e82f407969b200b86cf20078L8;FFe03", + "b0094e06b40f921008052d93b0094a0fe00b4e26b40f9e10315aaf70300aadc3b00944b000014608652ada80000b0629ec03df5c30d91800700ad820b803dL16;FF9c0000b4e1031caa22008052dabb0094ba0000b4e05b40f9e1031aaa22008052d5bb0094e17340f9810000b4e00315aa22008052d0bb0", + "094f6031faa787201a9BBBBL8;FB5b639423795d0507f0f98913489399b1a49da30cd1a7fd217d479d423f94da7da28c00eef1f38ae57e800000a46dc8ec2453a8fae00193193b6f44baa9b569b2L8;FFf45301f9b50a00f17306009181feff54c8feff17e0430a910ae2ff97e14340f9f5ffff17e8430a9", + "1f34b41f9142300910081c03ce8030a910001803d04000014BL8;FF810000b4e0ff44f922008052da0b0194681240f9080700b4e1f342f9e2f742f9e8833291e0db42f9e44b40f9430302916fbaff97fc5346f98082c03ce85f46f9L8;FF230080522400805276e8ff97e10313aaf35341a9cdffff1700fd", + "ffd0004033912a080094fd7bbea9f44f01a9fd030091f30301aaf40300aad20b009400038052BBL8;FFf60f00f9dc4b019402000014f60f00f9a87240f90a0540f92a1100b4170140f9e80240391f2100f1e1100054090180d25f8518f10900f0f2a1100054a86e40f9L8;FF29050091200108ab62000054", + "fd7bc1a8c0035fd680fdffd0008006912b48009480fdffd000e001912848009480fdffb000a0239125480094fd7bbfa9fd030091L16;FFe85744f9e9230ca9e86344f9e95b44f9e86f00f9e86744f9e85f00f9e86f44f9eaa30aa9e87744f9e83f00f9e87b44f9e9a31da9e88344f9e97f44f9e8f700f9BB", + "BL8;FFf8df40a9f90f00f91f0319ebe9010054390100b4e00317aae10318aa22008052e30319aad56b0194600a00b4f70300aa06000014e00317aae10318aa22008052L8;FFb40000b4600640f9e10314aa22008052d96b0094602e40f9a00000b4613240f9610000b422008052d36b0094611a40f981000", + "0b4601640f922008052ce6b0094BL8;FF3b0080921600f0d217008092351500b5e1031faa91fdff17e08743ade00314aaa0873bade08b44ada08b3cade18341ada18339ade28342ada2833aade18340adL8;FFc3fcfff063c01491e0031faae10308aa2ce8ff97c3fcfff063201591e10302aa28e8ff9729", + "3c00f1ea33899a211000b40b1c0091e9031faaccfcfff08c491891BBL8;FFe12740f9810000b4e00315aa22008052d92b0194e12340f9810000b4e01f40f922008052d42b0194ff830891f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L8;FFe10313aaf44f42a9f65741a9fd7bc3a8c0035fd640fdff", + "d000c026912b280094ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191L16;FF240080528dcfff97e86b42f9e96742f9e91f00f9bdfeff17200080520104805211a8009440feff9000402b9123feffd063801b9144feff9084a02b91a24700d1BBBBBBL8;FB75706c6963617", + "465206d65737361676520666f7220636f756e7465723a20c000394c6f63616c6c7920737570706c69656420616464726573736573206e6f7420L8;FFe09f00944000805241008052d99f0094e01b00f9202200b4da9f00944000805241008052d39f0094e01700f9602100b4d49f00944000805241008052", + "cd9f0094BL8;FFc80000b4e02340f9e10308aa22008052d91f0194e10313aae82b40f9c80000b4e02f40f9e10308aa22008052d21f0194e10313aae10700f901ffffd021401191L8;FF8082803c8182813c68620039f44f4ca9f6574ba9fd7b4aa9ff430391c0035fd620fdfff0008036912c1c0094ff030", + "6d1fd7b12a9fc6f13a9fa6714a9f85f15a9BBL8;FF16010094888e41f81f0500b160000054e00314aadce3ff97e00314aae10313aa022b8052f44f41a9fd7bc2a8d95f0114088c41f81f0500b160010054fd7bbea9L8;FFe042c13ce142c23ce0a30c91fcff42f961e2009102278052e01b813de11f813de", + "88304b9db5f0094f66f41f9f36b41f9c80240f9680000b4e00313aa00013fd6L16;FF09692138e10313aa28edff97f4fbff35f44f42a9f50b40f9fd7bc3a8c0035fd6e00313aa22008052230080522400805282030094610a40f9d8ffff17e00313aaBBBL8;FB00000000000000000000000000000000000", + "000000202020202020202020202020202020202020202020202020202020202020303030303030303030303030303L8;FF2200805223008052240080528ba3ff97e11740f9c4fbff17e0630091e10317aae20315aa230080522400805283a3ff97f71740f9e80f40f9080117cbbf0208ebBL8;FFf30300aa", + "dfff00940003805201018052d8ff0094600500b4880219cb080115ab82050054f60300aa192000a948008052080800f9e00317aae10316aae20318aaL8;FF260040398af05f3828686e380600003908682e38aaf01f38c0035fd61f2003d5261c40a9282441a98a2c7ea98c347fa95f0001f1e8000054061", + "c00a9082401a9BBL8;FFf50308aa9f0700f12b010054f40300aae00319aaf60301aae1031caa22008052d53f0194e10316aae00314aa3f0400f16b00005422008052cf3f0194ff0600f1L8;FFce0300141f150071a01000541f190071c1110054607e42f9618242f9290c40f9e8830f91e1031baa20013fd", + "6f6834f39df0a0071e1140054c8008052df010014L16;FF6083c53ce9f301f9e9e35539e0f7803d6013c13ce8c301f9681340f9e2eb803de9230e39e092833ce8cf01f91a110094e1b343f9f6b743f9f8bb43f9fcbf43f9BBBBL8;FB3c9eed85a28c99e649fb0000c51089d1efc0ecfb514a39aa89e616d7", + "f3568dbaa4e2a9382dc28cfc233fff9970e011ba83e2a27c2d97cce9733a9e4aa29aadaeL8;FF092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8bBL8;FFe02b833da0077dade22f833de1378", + "33de033833da1efff540023019124aeff977affff17e81f46f91f0500b1e1000054ff1f06f9f62306f9ff2706f9ff530cb9L8;FF89008052e08702a9e0030091e163009142008052e8a701a987030094b70000b4e00316aae10317aa22008052d20f0094a0c300d1e103152a4f030094b5937da9BBL8;FF1", + "9020034e8030091e10314aa9a02028b0001198bdf4f0194e83340f9e0020191e10300912200805208050091e83300f9104c0194ffff0039f50318aaf4031aaaL8;FFad194e8bbf010cebe30100546b0500f1ec030daa81feff54a90109abe2000054200108ab62010054fd7bc1a8c0035fd6e90309ab63ff", + "ff5480fdffd000402391L16;FFe8db43f9e9eb43f9f66f44f9ed7344f9f07f44f9e8ab1aa9e8e743f9eaf343f9e28744f9f48f44f9e1a343f9e8df00f9e8ef43f9e8af15a9e8f743f9eb2b44f9BBBL8;FFf95b40f9f6574da9f85f4ca9fd7b4aa9ffc30391c0035fd69404005136008052770040f9e20640", + "f95f0015eb290d0054e10240f9290080398900f8b728040091L8;FFa8fe0737680240f9090540f91f0009eb29060054e80f41b2e80300f9e00300910e76ff97f44f45a9f52340f9fd7b43a9ff830191c0035fd6f503012a74040051BL8;FFe00313aa98fcff97e80301aa80040036480a00b5e1031faaccf", + "fff171f0800f1010d0054e1230091e20313aaffdf00a9ff0f00f9a8fbff97600d00b5990a40f9L8;FF1fc022eb63f8ff54e6ffff1700cc749200fc44d3000400d11fc022eb82feff54bcffff173f1c00f169020054fd7bbea9e30301aae10302aafd030091f30b00f9BBL8;FFe1431691400d0094df0600b", + "18000005480220291e1431691351200943f0700b1f90b40f9e07aff5400c303913c010014e8031faa000119ab62640054e1431691L8;FFa1035df8015700b5bb020014ba031ef8e8e350391f050071a1070054e9030291e8074091e08326910801189121e50e91f52bff97e80356b9f9074bf9f80b4bf9L1", + "6;FFf44f5ba9fcd340f9fd7b59a9ff03079111b7ff1725fefff0a5a02791a163009162c20791e0031f2ae3031faafbab0094ff4305d1fd7b0fa9fc6f10a9fa6711a9BBBBBL8;FB380000000000000050010000090000006d697373696e672072656d6f7465206964656e74697479206b65790000000000a1", + "104000000000004d00000000000000L8;FFe00308aa620080523f01007109fefff029ed3a9121118a9a0e940014fd7bbfa9fd030091080040f91f0500b1000b0054083040b9e80b0034080140b20811c0daBL8;FF09fd46d30800098b080500911f0109eb481f00543901001400200091890300942400001", + "4e80300aa098d40f83f0500b1e01e0054f30300aae00308aa22040094L8;FFec031aaafa0319aae9031baaff0600b1800a0054e0431391e10309aae9b700f9f4090094ec6b42f9ea6f42f9fb7342f9e2eb44b99f0900b1010b0054e87b42f9BBL8;FFc0035fd6a0d3de3ce007803ddd57019480048052210", + "08052d6570194600200b4a8624039e10340ad1600003908440039886240390110803c088c003988048052L8;FF0201805201f17dd3f9f7ff17f96f41f9eac31791f5e3573940c1c03cf7ef573941c1c13ce91f46b9280340f958914078f46b41f9e03f813de143813de91305b9L16;FF37fbffb4680240f9", + "18631932bf0208eb61000054e00313aadad20094680640f918693538d5220091750a00f9b4f7ffb6680240f9bf0208eb61000054e00313aaBBBL8;FF06010014e003082ae20313aae303162a62faff97c01100b57c0240f9820740f95f0017eba9060054810340f9200080398000f8b728040091490400d1", + "11000014L8;FF00010491740b0094f4cf49f99f0600b100b0ff54f5d749f9f3d349f9b50b00b47622009104000014b50600f1d6620091000b0054c1825ff881ffffb4c00240f9BL8;FF04000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f922008052d5f70094f8ffff1714f3ffb488061", + "48be00313aa01f17dd302018052f44f42a9L8;FF20008052a00a0039f35341a9f51340f9fd7bd9a8c0035fd6fd7bbea9fd030091f35301a9330000b0340000b056faff9773b640f994ba40f97f0214eb82000054BBL8;FF290080d2e85f09f928038052091ac0f2ff3309f9e83b09f9ff3f09f9ea4709f9e", + "85309f9e95709f930340194f6ef47f9e01bc43de11fc43de0431691e8036179L8;FF21fdffd021203f910202805263fdffb063941e91c4018052da000014c80080d2e0632a39e0432a910800f0f2ff672a39e84b05f9093eff97e10300aae14b05f9L16;FFf97b02f9f7e31339f98302f9e08b02f9fa9302", + "f9e99b02f9fc9f02f9c00300546083c73ce88303f9f9031c91e8634f39694740f9e0831d91e0cb813d6013c63cBBBBL8;FB17010000110000006c69627369676e616c5f70726f746f636f6c3a3a747269706c655f72617463686574696e76616c696420726563656976657220636861696eL8;FF4a219f5a", + "4a1d0072c0fcff545f05007121020054a80240f99f0308eb00070054880700b1380100793b050079a80a00f9c3fbff544b000014a80240f9880500b4BL8;FFa80315b8e8e742f9e2031f2aea1700f9e80f00f9e8d345b9e93700b9e82700b9e8031691400707adbb0318f8b58318b8d51c0194e88345b9e9", + "c742f902a09152L8;FF297dac9b3f7d60f2415600540b1540386bc100516901092bed379f1a7f250071eb031f2a080100544a0500d18dfe073605000014e9031f2a287d60d388550036BBL8;FFe9d2407868a202b808088052681500336a520079eaf240f8695e00796a3203a9680201397f020039b60600", + "b538000014081700d1b4831df805000014e80b41b2L8;FFa90302d1e8430f91a20302d124010191030480520502805214440094e8eb41f91f0500b1e01b0054e002c03de8f341f9e9030b91e17740f92015803de89301f9L16;FFf80301aa36dc5ba9022f8052e8e700f92aa042a9ec7300f9e82b17a92aa", + "c43a9e92b1fa929a044a9e8cf00f92aa045a9e8c300f9283440f9e8ab00f9283840f9BBBL8;FFfb0b40f9580800b4f90314aaf4031c2adc670194e00318aa210080523c008052d4670194c0fdffb4e1031baae20318aae00300f9d7670194fc03142af40319aaL8;FF8c01210b810102516b00f8374b0080", + "524c0000143f104071c30b00544b09c0396c1d00122c380c0b811140516b00f8376b008052430000143f004871030b0054BL8;FFe827003928017fb2e0030091e80300f912eeff97e10300aae00301aaf44f47a9f92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd63700805218008092L8;ZDBBL", + "8;FFe81340b9430905ade4838a3c8001803de8d302b9214b803dfafdff1788020090081140f91f0900f123030054e8b30a91c9ffffb029c11991e80302f9e8830a91L8;FF000180521d000014280180d20800f0f2081d00d11e0000141f150071000200541f11007141040054280180d20800f0f21700001", + "4e00313aae5020094e80300aaL16;FF1f5301a9155b02a9092300a9e92341a90a2300f9092303a928a7482908270929e82f40b9085300b93c000014b9035ff8e0031aaa880219ebe833889a3f0314ebBBBBBBBL8;FB352f6c6962726172792f636f72652f7372632f697465722f7472616974732f6163637", + "56d2e72730076656e646f722f6c69627369676e616c2f727573742f7072L8;FF290080521f0500f109000079e90f00f9a1ecff54e02300910af8ff97e00b40f961ffff1722feff9042403991e00308aa169e009422feff9042e03891139e0094BL8;FF7369283808050091280800f98af3ffb4e8ffff17e1", + "0300a9e00301aae10309aa22008052f4030aaa8c050094e10340a9ea0314aa2ba040a9290040f973692838L8;FFb95f7da9b55b7ea93f0b00b1e1020054760300b4a8c300d1e00315aae10316aa7fb3fe97b9035df83f0b00b101080054a8e35d38a9c35d783a008052aa835db8BBL8;FFf52b40b9f44f40", + "b9f30309aa13ffff1780ffffd000601d912c5e0194a0a33ea980ffffd000c01d9183ffffd063a0119184ffffd084401e91a26300d141038052L8;FF080116cbbf0208ebe9f8ff54e00313aae10316aae20315aac8000094760a40f9c1ffff17fd7bbca9f70b00f9f65702a9f44f03a9fd030091f30301aa2", + "10840f9BL8;FF0800f0f2080900d107000014e80b41b2e00700f904000014c80080d20800f0f2080500d1e80300f9e00300910be8ff97e10300aae10300f9a1feff9021600e91L8;ZDBBBL8;FB280000000000000008000000000000009468460000000000e468460000000000c8f8450000000000500000", + "00000000000800000000000000fc67460000000000L8;FF1f0500b160000054e163009113a2ff97964e40f9560300b4e11740f9e80f40f9974a40f91f0101eb00430054e81340f9490380522a040091e00316aaea1700f9BL8;FFff8300d1fd7b01a9fd43009108004039a01300d1a8c31f3833fe0094fd7", + "b41a9ff830091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091480001aba2020054L8;ZFBBL8;FFf44f03a9fd430091344c40a941ffffd021b43991150040f9e2008052680e40f9e00314aa00013fd6e000003620008052f44f43a9f51340f9fd7b41a9ff030191L8;FFf44f03a9fd830091480001aba2", + "020054010840a9f30300aae023009129f87fd31f0109eb0881899a090180521f2100f11481899ae30314aaac150094e80740f9L16;FFe8b303f92cc8ff9788018052eb2b5ba9e87300f9e9ab40f9e14740f9e82f40f9e77740f9fabb40f9ef8f40f9ec1f40f9e6e340f9e8f700f9e8cf40f9f60740f9BBBB", + "L8;FB421a38ebf616b7af742505cca14734f2ca579cb3e1e6cf99bfbb7dfad97134f29d0e8691221a34f2907934f234f200000100a421f64e4ea472c6598715435759L8;FFe80308ab82040054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab220300", + "54091440f9090100b42a0140b2BL8;FFe0c2c13ce1c2c03ce8a305b9e067813de163813d8607001435008052f6b340f9d6e9ffb53a008052fcbf40f9fceaffb528008052e82700f9e8e740f9e98742b9L8;FFe0df40f9e10315aa22008052da110094f85b5ca987000014e0d7c53de1dbc53de0431391e2d", + "fc53de037813de13b813de23f813d62ebff97a90000140a0180d2BBL8;FFfd030091c10500b40a0040395f2100f1a10500543f8418f1c1050054f70300aaf40303aaf60302aaf50308aad551019400c4805221008052ce510194400800b4L8;FFdc510094a00900b4e10314aae20319aaf50300aadf51009", + "4572340f9b6831ef8b8431fb8f70200b4561f40f9d5510094e00317aa21008052ce510094800700b4L16;FF122046a9ebb300f9e89700f90b2047a9ebab1aa90bf840f9e84f00f90a2048a93f030bebeb8300f9e8df00f9172049a9ea5300f90a684aa9e8af00f9082c4ba9BBBL8;FF22008052230080522", + "40080524afdff97610a40f9dbfeff17e00313aa22008052230080522400805243fdff97610a40f9e2feff17e00313aae10317aae20315aaL8;FF48feff17e0431691e1031aaae20318aaca100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aac1100094fad342f9fc07", + "4091BL8;FFe10308aa220080522300805224008052f4030baa89150094e10340a9eb0314aa2ca040a9290040f90afc78d39369283808050091280800f96af3ffb4d4ffff17L8;FF42d879781f0002eb3997991ae003192a46feff97e103002a8002f837397f4093c0020e91242b009143a31191020c40b90", + "77864f865787978e0804039a56c1c53BBL8;FF49048052f4074091948209910969213828040091f67749f9e8d302f9df0600b10026005480220291271e0094080040b20811c0da081540d2080d088b08250191L8;FFf9074bf9fc0b4bf9a8e21839080180d2f80f4bf90800f0f21a017eb235000014b5000", + "0b4e00314aae10315aa22008052d1310094080180d20800f0f21a0540b2L16;FFe28f01ada00600ada20e01ade08b42ade41f803de84300f9a29202ada012803da85a07a9210100b4e00314aa22008052f44f4ca9f6574ba9f85f4aa9fd7b49a9BBBBBL8;FB560b400000000000750000000000000064000", + "00026000000576869737065725072654b657953656e6465724b6579506c61696e74657874000000000000000000L8;FFf44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8d899001435008052ff0f00f9ffd700a9d4fcffb4e0230091e10316aae20314aa23008052240080527fbdff97BL8;FF0a0100b44b", + "0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b29050091L8;FFe3e7c53de4f3c53de0d7853de2dfc53dea1b4cf9e02b813de0efc53de1db853de12f813de1e3c53de027813de00bc63de233813de2ebc53de11b8", + "13de107c63dBBL8;FF985e0ba99f220da999220ea99cf200b92addff97f50314aa6002c03d680a40f9a18e47f88082843c882e00f9810000b4804240f922008052cf590194602ec03dL8;FFe85f02f9e86702f9e94313396501001428008052e80f00f9e82b41f9e80700f9e83341f9f93f00b91f0500b14", + "157ff5415fbff1728008052e80300f9f9d740f9L16;FFa083db3ca183dc3ca283de3c000705ada083dd3ca183d73c000b06ada083d83ca283d93c010303ada083da3ca183d33c020304ada083d43ca283d53c010301adBBBL8;FF6aa240a9e00740f9690240f9e10313aa54692838080500911f0048f1680", + "a00f9a3fdff540b7c0e533f0108eb7361193220010054536928380cfc5cd308050091L8;FFe8d342f9e0cf42f9490180520968283808050091fa3b49f9e8d302f9fafcffb5e8031faaf98792b939010034290340b22911c0da291540d2290d098b29250191BL8;FF0af97fd37f010aeb4a95819ae10308aa", + "5f1100f15481899ae30314aac7ffff97e80b40b9c8000036e00741a9f44f43a9fd7b42a9ff030191c0035fd6e80b40f9L8;FF215c1f9100210091a24300d1defcff9728008052e80300f9770000b4e00314aa7f030094e81b40f9880000b4f31f40f9e00313aa7a030094e85b40a9f40341a9BBL8;FF7f22", + "00a9687e02a908008092681a00f98a15005449040014e807409180020291f507409108810991b58209912a790094f43349f94083c03ce83f49f99f0600b1L8;FF36008052e0831f91e183159102288052e0390094a0620091e1831f9102288052fa9304f9db390094e87b4ab949008052f79b04f9f69f04f", + "91f010071fca304f9L16;FFf44f40f9e10000b422008052f5030daaf6030eaad8b90094ee0316aaed0315aa340100b4e04b40f9e10314aa22008052f4030daaf5030eaacfb90094ee0315aaBBBBL8;FB42024000000000006a00000000000000120100002e00000042024000000000006a00000000000000", + "bd0000002e000000496e646578206465636f64696e672065L8;FF080500912a8541f81f0117ebdc26969a5f011ceb23ffff541b0500913a0080520851199be91b40f9bf0209eb130540f961010054e0c300911ce0ff97e01f40f9BL8;FF7c0300f9750b00b960c3803c61c3813c682f00b9ff033a91f44f4", + "5a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0feffb000001891e2feffb0L8;FFe80740f9080116cb9f0208ebe80c0054e80b40f9e10315aae20314aa0001168bdc090094c802148be80f00f91b0200b4e10f40f9ea0740f95f0101ebc00d0054BBL8;FF20008052e10316aa174601942", + "0008052e1031caa14460194ff8300d1fd7b01a9fd430091280440a9890200d029f11e9142ffffd042542c91e02700a9e3030091L8;FF1f0900714c010054080200341f05007141030054000180521d000014280180d20800f0f2081d00d11e0000141f150071000200541f11007141040054280180d2L16;", + "FFebab42f9e8e300f9e8b742f9e85b00f988018052eba30da92400001428a00791fecb00f92080c03d0101c03d280841f9e0030eaae17b44a9f0030baae3e700f9BBBL8;FFe06901940004805221008052d9690194c01f00b4600740ad08048052e93b40f9330100b9000400ad288100a9280d00f9342100", + "b9670000140b257ea9e00308aaL8;FFf30b40f9fd7bc2a871feff17610640f9810000b4600a40f922008052d6690094611240f9810000b4601640f922008052d1690094611e40f9810000b4602240f9BL8;FFe003009115f0ff97f44f47a9f65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6170", + "080923800805219018052a80640f91f0116eba90c0054e00313aaL8;ZFBBL8;FF204bc03de8d342b929ffffb029c12c918101c03de01b40f92043813ce1031091e8a301b9e8b341b92007c03dffeb01f9e80303b928008052e8ef01f908048052L8;FF16194092420100b4e82341f9e92741f920030291a1", + "020191080102ab2935899ae82301f9e92701f913260094e003069141031b8be20316aaf6ff0739f6030691L16;FF29f87fd33f1100f13481889ae30314aa40000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a90aa60094BBBBBBL8;FB776974682", + "06c656e203e207573697a653a3a4d4158000000d41b4000000000004800000000000000af0000000a000000a1104000000000004d00000000000000L8;FFa8035ff8f50f40f93f4300f18002803d880a00f9201500543457139b970a40f9ff0640f261100054d70d00b4d59d0094e00317aa41008052ce9d", + "0094c02000b4BL8;FFf85f41a9fd7bc4a8c0035fd6e8031faab60a40f976f4ffb5b41640f9e803088b54f5ffb5e00308ab23f6ff5400ffffd000c02a91251a0194e00313aa22008052L8;FFe00f803d0c000014e00316aa6083c23cb6eb7aa9bbf37ba917008092e10740f9e01b803de00f803d610000b42", + "2008052d11d0094e15740f9810000b4e00315aaBBL8;FFe0010054e8bf40f989060091e1c30591e00315aa1b693438e9c300f9c3e3ff97f4c340f9e8bb40f9080114cbbf0208eb68010054d5fcffb5ecffff17e0c30591L8;FF08018052e8cb05f9e8672a9100f18f3ce8c32c91e99b05f9ea9f05f900038", + "13c0083823cf6bf05f9e0e3823dfa1f06f9fa3706f91f7f07a9f6d705f9f6e305f9L16;FF760a40f9680240f9080116cb9f0208ebe9f6ff54e00313aae10316aae20314aa230080522400805284010094760a40f9afffff17fd7bbca9f70b00f9f65702a9BBBL8;ZBL8;FFe077c53de17bc53d58008052e8", + "e36b799400805215008092e057813de15b813de8e30a79fc010014e8074091f6a745f90023009108810991f407409194820991BL8;FFdcfd0094400200b4e81242d3155000a9f70300aa152001a928008052081000f9e80318aaa90216eb9402168bf533899a145500a9135d01a9f44f43a9f65742a9L8;Z", + "FBBL8;FFa0873aadf81640d2a303973c08140038443e01941f1f00f1a8010054a0877aada10301d1e00314aa22008052a0073eada08b7bada00b3fad0e3a019400e4006fL8;FFe00315aa00013fd6010740f9810000b4020b40f9e00315aad73d00949f0700b1a01c0054e26b40f9e8432a91e00316aae10", + "317aae3031aaa77fffe97e8436a39L16;FF1f0c0094eab343f9fcb743f9fabb43f9e1bf43f95f0500b1404d0054e9cb43f9e8cf43f9bf0600b1e0c343f9efc743f9ebd343f9e82709a9e8d743f9ecdf43f9BBBBL8;FBda5e01003010df98e7bf90f48e9e0000c2ab2e6a237900000d13000000000000777a", + "836bc6f00000459b00000000000000000000000000000000000000000000L8;FFa05d00b4ea3340f9f40300aa08080091e9031aaa2b4540784a0500f10be11f781345007881ffff54e93340f92805098b01f17dd3e8f300b2a8aae0f23f0108ebBL8;FF21203f9102028052e3feffd063201d91e4018052a", + "0130094f55346f9e0833291e1032d91022b8052da0d0194e083329101e8ff97f30315aa69018052618e41f8L8;FFfdc30091f30300aae003009153000094e80340f9f40b40b91f0900b1c1030054e80f40f9160101f1e2040054d50d0094c001805221008052ce0d0094800800b4BBL8;FF08a11f9109000", + "0f029513e91400f0054ea1340f9eb23009140fffff0005c2c91eba305a9e1630191aa831df8aa6301d1eaa706a9a9a300d1e9a307a9e8a30091L8;FF291540d2290d098b2925019129fd46d30801098b000500911f0009eb28dfff5480fdffd000a02391284a009480fdffd000003b91254a0094fd7bbba9", + "f90b00f9L16;FFfc4752a9e84740f9e9c703f9e1031d91e0b3c23de3af03f9e20319aae8a303f9e86b40f9e0b303f9e0430f91e8a703f9e8fb40f9fcbf03f9e8ab03f9e8bb40f9BBBL8;FF167d4039ec0b0179e94700f9ea43023920070054887640f91f8100f121070054887240f94b0080528df240b981", + "8247a9090940790a1940390f7140f80e0140b9L8;FFe96701f9f2feff172143c23c2007c03dfc430f912283c33ce8b341b9e0430691810f803debc741b901048052e002803de9cf40f9ea9741b980c38d3c800fc03dBL8;FFd3090094f50300aa010200143f0900b140210054880080d20800f0f20809009", + "13f0108eba120005481220091e20313aa45080094f50300aaf50100143f0900b1L8;FFc27e4093a47e4093e00314aa637e4093c81b80d2010000d49f0200f1000841baa100005473061c12600180927f82007100009fdaf35341a9f55b42a9fd7bc4a8BBL8;FF96110094e1d342f955fcff17e0431691220", + "0805291110094e1d342f960fcff17e0431691220080528c110094e1d342f976fcff17e04316912200805287110094L8;FFd6021891e11716b91856ff97e8f347f91f0500f1e1030054088341f80083c03ce983269100fdfff000383191e1432291e8db04f948ffff9008510591e84f04f9L16;FF60860ead", + "e08a4bad608a0fadff831a91f44f43a9f65742a9fc5f41a9fd7bc4a8c0035fd6e08fc03de82341f929008092690200f96082803c680e00f9e0230291BBBBBL8;FB9d3d400000000000a63d40000000000008c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e", + "511f6c3e2b8c68059bL8;FFabc35738a9a31738a9d357384a01084a6b01084aaab31738aae357382901084aabc31738abf35738a9d31738a90358384a01084a6b01084aaae31738aa135838BL8;FFfd7bc2a8c0035fd6e00314ab83ffff5400ffff9000c030912c12019400ffff900080109129120194fd7", + "bbfa9fd030091083c40f9080100b4080140b20811c0daL8;FFdc150094809b00b408018052e1031aaa02c48052f60300aa08140038dd150094e8830891e0431391a44700d101810091e20316aa23c480529aebff97e86b42f9BBL8;FF292000543c230091546b39f83f001cebe9000054e0031aaa2200805", + "2e3031caad6550194fa0300aa402300b4b30800b4d4550194e00313aa21008052cd550194L8;FFe93304f9400500ad2a0080528083ce3ceaa71139eacf42f902f18f3ce803169122b7803d6001803dea5301f9e95f01f983eefe97e80356391f050071400c0054L16;FFe8b300f9e00714ade017c23de1ff", + "c13de00b15ade003c23de207c23de10312ade00bc23de1efc13de20313ade0f3c13de2f7c13de10310ade0fbc13de1e7c13dBBBL8;FF19692138733a0094e10313aac7fbff97806240b960010034610a40f9680240f91f0101eb60100054680640f929040091690a00f91a692138e10313aabbfbff97L8;F", + "F800100b4e1d342f9e8cb42f91f0101ebe0840054e8cf42f9090180522a04009109692138e1431691ead302f96e0e00949f0600b160a1ff54c0220291e1431691BL8;FF22008052f30b40f9fd7bc2a8daf50014f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091140040f9f30300aa9", + "f0600b140020054610e40f9L8;FF40090054340000b082020e9141404e393ffc0371600700542104001141400e39001c00511f7c0071a800005481020e9120c0208b21404e3901400d39611240f9BBL8;FF090140b22911c0da291540d2290d098b292501910819498b08050091e98792b96901003429014", + "0b22911c0da291540d2290d098b2925019129fd46d329050091L8;FFa04700d1e86303f968008052e1432a91e97705f909078052e86305f928fdffb008a52891e95f05f9290080d2ea6705f9e93ec0f2e87305f9c8048052ea4f05f9L16;FFe17740f9810000b4e05f40f922008052d9b50094da0500b4e0", + "5b40f9e1031aaa22008052d4b5009429000014e0c31591cebeff97e0c31391bfbfff97fc031f2aBBBBL8;FB42024000000000006a00000000000000200100002e000000ef104000000000004e00000000000000f904000019000000ef104000000000004e00000000000000L8;FFf78301a9ff1700f9e013", + "0054e8031faa990a40f94901805209683f3808050091e81700f9390800b4280340b20811c0da081540d2080d088b08250191281b488bBL8;FF08e10c91f6bb41f9fbbf41f9000545ad5f0500b10231c03df5c341f9f7c741f9e95305f9400705ad000543ad4233803dffa71139400703ad020144ad420304", + "adL8;FF8001005421035ef8810000b420835ef822008052d805009421835ff8e1feffb4200340f922008052d3050094f3ffff17e81640f9c80000b40805088be00315aaBBL8;FF22008052dc450194280700d11f0d00b1a8000054e03340f9e10319aa22008052d5450194c80600d11f0d00b1a8edff54e0", + "2f40f9e10316aa22008052ce450194L8;FF2831889a1f6d00f14804005489fdffb029610e918a0000102b6968384a090b8b40011fd6010440f9410300b4000840f922008052f44f41a9fd7bc2a8ce450014L16;FFea230ca9e8e345f9eadf45f9e9f301f9e9db45f9e86f00f9e8e745f9e0f7803de85f00f", + "9e8eb45f9e8e300f9e8ef45f9eaa30aa9e8f345f9ea0346f9e80700f9BBBL8;FFfd830191094840f9f30308aa3f0500b180010054098449a9a8a300d1e00309aa46600094a8835d381f050071e101005488fffff008010e910904805204000014L8;FF031e0054680240f9080540f91f0119eb690d0054e0", + "0313aae2fdff972024003728fc60d3681000b5200840921f1800f102110054217c0353211300343f080071BL8;FF0800f0f2080900d10f000014c80080d2e00700f90800f0f2080900d18affff17e80b41b2e00700f907000014e90b41b2e92300a98cffff17c80080d20800f0f2L8;ZDBBL8;FF42008052", + "dc25019468ba40f9e80000b460be40f901f97fd342008052f30b40f9fd7bc2a8d4250114f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9L8;FFf30300aa810000b4600640f922008052d9250094610e40f9c10000b4601240f922008052f30b40f9fd7bc2a8d2250014f30b40f9fd7bc2a8c00", + "35fd6ff8303d1L16;FF59910091ea0319aa7f01086beb0317aaa1feff54f49200919f0215eb680a0054d8a500940004805221008052d1a50094c00c00b42043c13c2143c03c9f0215eb" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines11 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines12.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines12.lean index d51997dbd..c75ce2a3f 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines12.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines12.lean @@ -27,358 +27,251 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub12 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF211ca00e418500fc61ffff54df1e00f123210054690240f9696a28f8e9031faaeaef7fb20b098052ec1f8052040000143f0116eb29050091000b0054686a6938L4;FFe10300a9e00301aae10308aa220080522300805224008052db000094e10340a92aa040a9290040f91f1040f15369", - "283808050091280800f903feff540b7c0753L8;FFf50301aab60300b4a80a40f9280900b4690240f9b40240f92901168b3f0114eb01040054690e40f9c9030037aa0e40f93f010aeb610300544a030037a90640f9BBL4;FFd4f0ffb58affff1734008052fb0a40f9e80240f9fc0700f97f0308eb61f6ff54", - "e00317aa7cd6ff97b0ffff17e0c30191639cff97e96f47a9f59340b9fa6748a9L4;FF4cffff54c11a40b92124c41ae1fe0737c11e40b92124c41a81fe0737c1ce7492060000f0c60042f9210040f93f0006ebc1fdff54c7424079e62c46d3dfbc0071L8;FFa363009142008052b30f00f946a0009468a201", - "91810100d021d01d91a40100b084200a91a363009142018052a80f00f93da000943da00094fd7b41a9f31340f9BBBL4;FF60760035e85341b9e86300b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebL4;FB696e20627", - "56666657220746f20726561642076616c7565202872657175657374656420c00a20627574206f6e6c7920c00b20617661696c61626c652900015cc0L8;FF101452a9e8bb00f9087043a9ea231fa90a2044a9e8cf00f90b2045a9e8c300f9084446a9e8ab00f9083840f9e8ab1aa90aa047a9eaa309a908dc", - "48a90af840f9BL8;FFe40314aaa8831ff84760019447600194f44f43a9fd7b42a9ff030191c0035fd6ffc302d1fd7b05a9fc6f06a9fa6707a9f85f08a9f65709a9f44f0aa9fd430191L8;FF08250191c81a488b08050091f40800b4890240b22911c0da291540d2290d098b29250191891a498b290500912", - "00108ab02080054e10313aab0fcff97560300b4BBBBL4;FFe8031faaca0180d2090080920a00f0f2e08741ad880a00f928008052892a00a98082813c8182823ce08740ad8082833c8182843c68320039f44f4ea9f76340f9L4;FF00000000000000000000000000000000586100140000000000000000000", - "000000000000000000000000000000000000000000000000000000000000000000000L8;FFc0035fd6f30300aae00301aaf40301aae10309aa220080522300805224008052d3150094880a40f9e00313aae10314aaedffff17e10300a9e00301aae10309aaBL8;FF225968f8290300d029611091285968f8", - "e10308aa35800114281040b96800c8376800d037328001143280011432800114080040f9000140f9080040b91f050071L8;FF777fff97e00314aa080c4af81f0500b160000054e16300915d92ff97954e40f9550300b4e11740f9e80f40f9964a40f91f0101ebe0860054e81340f949038052BBBL4;FF60a", - "200a928008092680200f91e00001408008092a9030090296d0091680200f9c8028052692202a91700001457048052940300f094c2349109000014e0c30091L4;FB6e653e6661696c656420746f206465636f64652070726576696f75732073657373696f6e2070726f746f627566000000147d4900000000", - "002d00000000000000L8;FF8366c03df30300aae0a301918182079102328052f60303aae00701ad82024eadf7430891e307803de20302adf9bf0094e0a30191e10316aaad3a0094e8e30791BL8;FFf40300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aa10400194000300b50e000014280", - "08052090180529f6a29f8880200f9f44f41a9fd7bc2a8L8;FF030b00544b0dc0396c1d00122c540c0b810148516b00f8378b0080523a0000142b7c1c534b0a00344d11c0390b00be522b000b0bac1d00128d00f83761710c8bBBBBBL4;FFb7035df86bffff17880080d20800f0f20811009154ffff178800", - "80d20800f0f2081100915fffff17e0230091e8ab00a948ec0094a0c300d1a82b3da945ec0094L4;FF093d0039e90b41b909410039e90341b909450039e9fb40b909490039e9f340b9094d0039e9ab5c290a51003909550039e9ab5b290a590039095d0039e9ab5a29L8;FFfd7b42a9f31b40f9ff030191c0", - "035fd6ff0302d1fd7b06a9f33b00f9fd8301916902009029212e91f30301aa290140f9e10300aa48078052a08300d1e2031f2aBL8;FFf40f40b90e00001428008052ff2300f9e80b00f9353b40f9345341b9285741b9e83f00b915fbffb528008052e81b00f9364740f916fcffb539008052e88740b9L8;F", - "Fc0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aa610100d021081d91e8230091e00309aa420180523c90009468820191610100d021881591BBBL4;FF8924e0f2551113cb7f0209ebe80c0054f90308aa150300b4f40300aaf1cf0194e00315aa0101805216018052eecf0194e00b00b", - "4f80300aae00314aaf36302a9L4;FB4c3b620b8b914040e01f50052680a7bbfdf629516faeee4ad4ecdfdda65d48eae5dcd4ad5fc2e658d11ba28c32aeb5b9910b428b00009f809101d374fd52e298L8;FFe8174da9f9fb42a9ebb344a9edab40a9e69f43a9e9474ca94f010014e0afc23de22300f9e2030", - "9aaeefb0ba9eb9b06a9e6030aaae1df00a9fcbf00f9fba31da9BL8;FFe08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a2900500194fd7b47a9ff030291c0035fd6ff8301d1fd7b03a9f52300f9f44f05a9L8;FF428309ade90300f98a83fe97e8c342f9200bc03dfbc742f9e9", - "db42f9f5cb42f9f7cf42f91f0500b1c082873ce9a304f9801500542083cb3c2183cc3ce9a70c91BBBBL4;FFf60314aaf70314aac08640fc0088202e0800669e18c1019205000014080700d1b50600d11801188a750200b4f80000b5c08640fcf70208d10088202e0800669eL4;FB2e00000000000000e000", - "00000e000000ea984800000000002e00000000000000cd0000000d0000006c69627369676e616c5f70726f746f636f6c3a3a70726f74L8;FF217c0353410a00343f0800718d0100543f0c0071200300543f100071800300543f1400710105005481c20091e20313aaf6edff97200400b46d0000143f04007", - "1BL8;FF4b700114fd7bbda9f65701a9f44f02a9fd030091140840f9f30300aa3f0002716200005435008052080000143f0020716200005455008052040000143f404071L8;FFe8cf42f92a040091002302914901805209692138ead302f971240094e1431691b60c0094e09b49f9800100b4e1d342f9e8cb", - "42f91f0101eb203f0054e8cf42f9BBBL4;FFe8c30091f40302aaf70301aaf50300aa93ffff97e86343a91f0900b1610a0054f96a9852e0031f2ab9d5bb720bb00194086b40b9f603002a1f01196be1090054L4;FFc000f8b6eb070094080040b91f110071e0feff54300000141f0017eb68070054480319c", - "b1f0008eb080700541c00198b9f0315eba9010054bf0200f10803959aL8;FFf503022af40301aaf30300aac11300b496fa7fd3f3af0094e00316aa41008052f1af0094c01500b4f48300a9290080529f0600f109000079e90f00f9a0130054BL8;FF280041d21f8d00f10831979a1f6d00f108ffff54e9fe", - "ff100a6b683829090a8b20011fd6c1825ff841feffb4c00240f9eeffff17280400d11f0d00b1a8fdff54L8;FFe800009008c10891e94f05f969038052c00000f000843691e8f301f9e1432a91e8fb01f9e800009008e11091e3830f9142008052e9f701f9e9ff01f9e80302f9BBBBBBL4;FF22008052fb17", - "0214c0035fd6fd7bbea9f44f01a9fd030091f40300aa68018052f30300aa818e41f8290041d23f0000f12841889a1f2d00f1a2010054680240f9L4;FFe10315aa0a180094e8d344b9680900367f0700b1a0080054f2170094c001805221008052f0170094e06401b4a80000d008fd3991f60300aa090140f", - "9086140f8L8;FF08011c91680200f9f44f42a9f65741a9fd7bc3a8c0035fd6280080527f7e01a9680600f9680200d008210e91680200f9f44f42a9f65741a9fd7bc3a8c0035fd6BBL4;FFe85300a9e00706ade2034aade383833cea5f00f92281883ce25bc03d2081893c22818a3ce00b48ade9d340f9e08", - "3843ce00749ade97300f9e95740f9e87340f9L4;ZBL8;FF21b41e91840100f084200f91a3630091a2018052a80f00f94398009443980094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091BBBL4;FF2100805239008052f7d70194c0feffb4e1031aaae20317aaf80300aaf", - "9031aaafcd70194e8630091e0230091e1031faae2031f2a1dd80194faef41a9e00319aaL4;FB696d706c2e72730012506f6c796e6f6d69616c206572726f723a20c0001545787065637465642030206f7220312c20676f7420c0002163616e6e6f7420616476L8;FFf1d703f9e8c703f9e8c340f9e4df03f", - "9e8cf03f9e8d740f9f4e303f9e8db03f9e8df40f9eceb03f9e8e703f9e8af40f9feff03f9e8ef03f9e8c740f9ea0704f9BL8;FFb50600f1d662009100130054c1825ff881ffffb4c00240f922008052f5570194f8ffff17f37749f97f0600b140020054e18349f93f0400b140010054810000b4L8;FFf557", - "06f90800f0f2080900d107000014e05706f9e80b41b204000014c80080d20800f0f2080500d1e0833291e85306f90f4dff97f50300aa3d010014f9a345f9BBBBL4;FFe803009120013fd6e80340f91f0d00b141030054880200f9680080522a000014785e40a9f50301aa762240b9edf7019400038052010", - "18052ebf70194200500b4L4;FB303938352f6c6962726172792f616c6c6f632f7372632f737472696e672e72730006207769746820c0000c206e6f7420666f756e643a20c00076656e646f722fL8;FFc1010054e1031faab2ffff17880080d2e10700f90800f0f2aaffff17e80b41b2e00700f9a7ffff178", - "80080d20800f0f2080140b2a3ffff17880080d20800f0f2BL8;FF3f0100721b119f1aa82303d16e080094a88353f80083c03c0183c13c1f0900b1e08704adc1080054e03340f9e11340f9a82303d1fb3b00b925edff97bb8353f8L8;FF04780094f9431591b40000b4e00315aae10314aa22008052f67700", - "94e1e34df9810000b4e00317aa22008052f1770094e1074091e0833791023f805221800991BBBL4;FFe11f40f9e81740f9090101cb3f3d00f1e9110054e91b40f92a4000912003c03d1f010aebea1f00f92069a13c401300540802805228692a38e003152a48050091L4;ZDL8;FF0105805208b80094fd7b", - "bea9f44f01a9fd030091140040f9f30300aa62000094682a41a989020acb1f0109eb49030054890208cb6b0240f94a0109cb3f010aebBL8;FFc0035fd6a00200b000c03191fc370194a00200b000602991f9370194a00200b000c00991f6370194fd7bbfa9fd030091081840f9080100b4080140b20811c0", - "daL8;FF9f0e00b12801003901010054f55b40f988008052a802003948008092480300f988008052e6070014e903182ae04f40f9e803172a2a7d60b3fa6700f9188116aaBBBBBL4;FF48e1073649e2ffb591ffff17fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4309d1a80400b", - "0080140f949d03bd5e00700f93301088bL4;FFfd830091280440f9290c40f9340108ab020e00545f0800f180000054281440f9140114ab620d00549400f8b6e0031faae10314aafc070094f70302aaf60300aaL8;FF21041891e00308aa42018052fd7b42a9ffc3009135080114a9240091410200f021401", - "991a9831ff8490200f02bc11891a92300d1430200f063881991460200f0BL8;FF280108ab8300005420000014e80308abc2030054694640f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62020054L8;FFa80a00f1eeff0ca9f0ff0fa9f8ff12a9faff15a9fc", - "ff18a9e0ff1ba9e201005460220091e123019102308052f98700947f0200f97f8a01b9ff430791f44f45a9BBBL4;FF3f0800b101020054fa0300aa540080d2e0031aaa1400f0f2fdafff9708008092685200a9ffc30b91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8L4;FB7261746368657", - "42d623538643766353665333634356363642f303639353962342f7372632f696e6372656d656e74616c5f6d6c6b656d3736382e7273002f6361L8;FFf86744f9fa7744f9fe030daaf94740f9e3b7803de87700f9e8008052400545ad6a5142784941092a6a1142b8e00718ad6181ca3c6081c83c5b8109aa", - "e9635e39BL8;FFa84300d1090000f029413191c0020090001c3691e8a700a9a82300d1c20200b042a02491e1230091e8a701a9ff470194c00200b000e00c91f4470194c00200b0L8;FF84801891e3230091e2018052e80700f93a480094fd7b41a9ff830091c0035fd6010100b021981991c20280522f480", - "014fd7bbfa9fd030091083040f9080100b4BBBBL4;FF000540f922008052fae70194bb0000b4e0031caae1031baa22008052f5e70194b90000b4e0031aaae10319aa22008052f0e70194bb0302d1b40000b4e00318aaL4;FB204c42000000000000000000000000000800000000000000080000000000000", - "0304b420000000000000000000000000008000000000000000800000000000000L8;FF59ffff17e1031faae8e700f956ffff1740eeff54bc010014c0c200916230009472ffff17e8af40f9140101eb02010054e7000014c1720091a2c303d1e2e8ff97BL8;FFb3831ff84868019468620091e102009021b8", - "2c91a32300d1e2008052e40314aaa8831ff84068019468c20091e102009021d42c91a32300d142008052e40314aaL8;FFfc670094613240f9810000b4603640f922008052f7670094b40000b4600640f9e10314aa22008052f2670094610e40f9810000b4601240f922008052ed670094BBBL4;FFe8031fa", - "a0900f0f229017fb28a1e4092e10740f908010aaa69a200a92900805269020039810000b4e00b40f922008052f0a70194ff030991f44f44a9f65743a9L4;FFfd030091f30b00f9f303002aecffff97ecffff97070b0094e003132a01000094017c4093c80b80d2e00301aa010000d4e00301aaa80b80d201", - "0000d4fdffff17L8;FFa8f354380c088052fc03082a82011ccb350302eb62f8ff54b5c303d1e10740f9e20319aaa0021c8bfaa700948803190bbcc303d1a8f314387fff03f160030054BL8;FFa88300d1e82702a9251a0094c0010035a003de3ca8035ff8e003803de80b00f9e003c03de80b40f98002803", - "d880a00f993620039f44f47a9fd7b46a9ff030291L8;FF0928009420008052e10319aa0628009420008052010480520e2800942000805201c480520b280094fd7bbea9f44f01a9fd030091f40300aa2301f8b7f30303aaBBBBBBBL4;FFa00208cb02018052fa1b0294e6ffff17e003032afe1b0294f40300", - "aae3ffff17ff8302d1fd7b04a9fc6f05a9fa6706a9f85f07a9f65708a9f44f09a9fd030191L4;FFfc0305912083c53ce86758a9f6cb40f97f0700b1e80300f9e80305910001803d00060054e8c30591e02300910227805201e10091f71b0094570400b525000014L8;FFe30313aaf44f43a9f65742a9f85f", - "41a9fd7bc4a8effdff1734f87f92560014cbd50213ab82050054a9fe4ad30a0880522911c0da490109cbea0080523f1d00f1BBL4;FF08011e4afecf40b9e8a21f38e8d25f389c031e4afe6b40b9fcb21f38fce25f387b031e4afe7740b9fbc21f38fbf25f3808011e4afe8340b9e8d21f38e8024039L4;ZF", - "L8;FF42008052230000143f0d007180010054082100913f11007121030054e80300f9a10100902140169118000014e80300f9a1010090211015911400001408050091BBBL4;FFfb7b10f9ff7f10f904dc0194e87b50f9e97f50f9c00202912103019162018052fffe0139082d00b12935899ae87b10f9e97", - "f10f9f9db01942083c13d2187c13dL4;FB207573697a652076616c7565696e76616c696420766172696e74726563757273696f6e206c696d69742072656163686564696e76616c6964207461672076616cL8;FFe84f42f9e8eb00f9a8a20791f5a742f90001c03de85f42f9e82f14a9e86342f9eb9342f9e", - "0c7833de81300f9e86742f9e89f00f9e88342f9e84300f9e89742f9BL8;FF21800991035c0194000740ad08434079e8032179480300b0e01b843de11f843d08b140f91f0900f189040054a90200f029110f91e8633f91e9bf0ef9e90200b0L8;FFfc5b0094e10f40f9810000b4e01340f922008052f75b00", - "94f44f57a9fcab40f9f65756a9fd7b54a9ff030691c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9BBBBL4;FFe0040054f50a40f9eaa700a9c801c0daee0f00f90811c0da080f488b08010a8a08fd0d9b5b03088be8031baa6a835bf8090d5bf83f0500b15c01889a880b40f9L4;FB6172676f2d726567", - "69737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f6861736862726f776e2d302e31372e312fL8;FF500200143f0900b1400e0054880080d20800f0f23f0108ebc10d005481220091e20313aa060b0094f50300aa450200143f0900b1800f0054880080d2080", - "0f0f2BL8;FF84000491a363009182018052a80f00f9457c019468220191010300b0218435912403009084800491a3630091e2018052a80f00f93c7c019468e20391010300b0L8;FFdb91ff97e11740f9b8fcff17e0630091220080522300805224008052d491ff97e11740f9e2fbff17e063009122008052", - "2300805224008052cd91ff97e11740f9BBBL4;FFf85f1ca9f6571da9f44f1ea9fd430691f30308aa410300b41a004039481b1f121f8900712105005416040091340400f1f6d308a940050054d5028039e00707a9L4;ZBL8;FF22008052fbbb0094612640f9810000b4602a40f922008052f6bb0094610240", - "f9810000b4600640f922008052f1bb0094610e40f9610200b408048052606a68f8BL8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb88130054bd000014080c44f81f0900b1c1090054f3031faa5a000014e80300aa098d40f8L8;FF60ce01f961d201f9290c40f9e8830f91e10", - "31baafb6300f920013fd6f4f341f99f0e00b16100005468008052fa030014e8c30d91fa6700f979d241f91ad14778BBBBBL4;FF2a040091e00316aa6a0a00f909692138e10313aa63f7ff97550300b4610a40f9680240f9969a40f91f0101eb20230054680640f9490280522a040091e00315aaL4;FFf90b", - "0094e0fcffb4fb0300aa0801805208000039b90000b460070091e1031aaae20319aafb0b0094bc2240f99c0100b4b51e40f9eb0b0094e0031caa21008052L8;FFfd7bc3a8700c01140001805201028052100c0194080040f9a80000b4000440f901e97bd302018052f20b0114c0035fd6010040f9810000b", - "4000440f922008052BL8;FF94c238915605805260620091e143059102288052755200a9760a00f9fd8b0194ffc30a91f44f43a9fc0b40f9f65742a9fd7bc4a8c0035fd6e00740f9eaffff17L8;FF130b00f9080000b9f68b0094c000805241008052f48b0094006800b4c8009e52138301a908080079e800", - "be52080000b9131700f9eb8b0094c000805241008052BBBL4;FFe81b40f9f71b00b9f4671929f32306a9f36307a9fc6308a9f66f0aa9fa6f0ba9be610094170400b142330054b700f8b6fa031faae0031aaae10317aafacb0194L4;FBa00b460000000000496e646578206465636f64696e67206572726f7", - "244617461206465636f64696e67206572726f7247656e6572616c20646573657269616c69L8;FF810000b4e0df41f922008052f9cb0094e8031faae9031faa291d4092340108aaf2010014df0600b1a04200546003c63ce1d302f9e1c31591e0d702f9e0831d91BL8;FFfc4b0194611a40f9c10000b4601e", - "40f922008052f44f41a9fd7bc2a8f54b0114f44f41a9fd7bc2a8c0035fd6010040f9810000b4000440f922008052ed4b0114L8;FF29010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6BBBBL4;", - "FFe143029122008052080500b12935899ae82715a901ec0194ff3f0439f80314aaf70316aaf603192a02ff47d314df7992181b4092020100b4e82755a960020291L4;FB0800000000000000304b420000000000000000000000000008000000000000000800000000000000204c420000000000000000000", - "00000000800000000000000L8;FF09692138e10313aa75ebff97760a40f9680240f9080116cb9f0208eb08080054680640f9e10315aae20314aa0001168bf8eb0094c802148b680a00f9f44f43a9BL8;FF4654ff979f8300f1e10400545f8700f1a1040054e8e30191e00317aa21048052f1410094e8e341", - "391f050071e1050054e80342391f0500712c0b0054c80b0035L8;FFe9230a29076c0094fd7b47a9ff030291c0035fd6ff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9BBBL4;FF80020191a18301d122008052080d17aaa0073dad080dc0dae", - "86700f9e28345ada2033ead26ac0194e8275a29ea2f5b29f6c3023980a20191a18301d10809c05aL4;FF9055530aef118d9a5f01116a6d4e53d3f10153b210020b0a2f128f9a5f01106ab201120af00152b2714a12530f128f9a900180525f01126aea0151b212b06cd3L8;FF21008052f8ab0094400e00b", - "4e1031faab5833ea9bf831ff8a8835ef895274078080101cb1f0500f109010054a806c05a08682178210800917b0700f1a1831ff8BL8;FF22008052fb2b0194e8031faa170100b4e91740f9c900003628fd60d3e88305b9e80f40f9e8cb02f9e80317aae0832291e1031691e8c702f9acdbff97e20f4ba9L", - "8;FF0900f0f23a017fb2691f4092011880521b0109aa050300141f09007121070054090180d268df78920900f0f23a0140b2691f40921b0109aaa1035df8415f00b5BBBBBBL4;FFe10309aa220080522300805224008052f4030baa66060094e10340a9eb0314aa2aa040a9290040f90cfc6ad3536928380", - "8050091280800f92cfbffb43f0108ebL4;FFe2b3803df96f01f9fa7301f9ff7701f9f6f302b9ff6b02f9f66f02f9ff7302f9d9f4ff97e86f42f929068052e0431391e1830a9109010039e037c13df6b30bf9L8;FF0c0c8052001d00390901003909fc5cd30c2c08330a0500390afc54d3090d00390910805", - "2293408330b0900390bfc4cd30a1100394a0040b90921003949084079BBL4;FFe083c23c8826089be91f40f998000014490440f90a018052e30300f9282545a9ffab05a9ff3700f9c90600b40a0d8052192101911c018052387d0a9b3a008052L4;ZDL8;FF490080524afdff35ea031faa4901098b200108", - "aba2010054f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6600100f000601f91f1930094600100f0BBBL4;FF5dc80094f51340f960000014f65340f9df0600b10012005417efffb4e8e279d3151117cbefd30194e00315aa01018052edd30194802200b4e8031faae9031faaL4;FB6f09e89cf", - "eff95cf179603b10000a1b21de3c1bf24a3cb3722a7dacb4f5b305c482fd6c6a960f577cf77209b5f03044339129a03457ec9d0c9c722c9f746decbL8;FFe90744f9ea0f44f9e9eb00f9e90b44f9e2a712a9e91344f9e98f00f9e91744f9e92b14a9eb9b44f9ea1f44f9e9a744f9ea9f00f98ae20791f437", - "44f9e92b07f9BL8;FFe8cf42f9090180522a04009109692138e1431691ead302f9a90c0094e88349f91f0500b1c0000054e8074091e14316910881099100810291cc0f0094f87f49f9L8;FFe02bc33de12fc33d13210891e0a350a9600600ade17740f9e20313aa23008052081940f900013fd6e06b01f9e", - "8c31791e16f01f9290c40f9e1830b9120013fd6BBBBL4;FFe80200f9690300f908fc60d3a80500b5080840921f1900f1a2050054017c0353c10500343f080071000100543f04007141020054e96b40b949fa073729008052L4;FB6765727072696e74696e76616c69642073656e64657220636861696e207", - "2617463686574206b6579617373657274696f6e206661696c65643a2069203c207365L8;FF080a00b5080840921f1900f1a20a0054017c0353010d00343f04007161fdff54890240f93f0900b161000054970200f99f1a00f91f0900f1e10c0054e00313aaBL8;FFe90f40b9e00fc03d765e00a969220629", - "68008052600a803d600601a968e20039eefeff17e11740f969ffff17a0e300d1a8ab3ca94750009420008052e10314aaL8;FF22008052fb730094f8ffff17e80740910881099100210291ed0b0094f4b749f99f0600b100b8ff54f5bf49f9f3bb49f9b51300b47622009104000014b50600f1BBBL4;FF490", - "108eb633600548a0340f9b40353f84801088b880300f9290300f988fe60d3280700b5800a40921f1800f122070054817e0353410700343f08007160010054L4;ZBL8;FF29ac40a92a0040f96801088b1f010aebea338a9a08010acb0a0e805216250a9bf50316aaa88e46b89f02086be9979f1a29219f5a2", - "91d0072a01600542a4c40b9BL8;FFa02302d11decff97e80301aaa0030036c82e00b5e1031faadbffff17a22302d1630c805203e4ff97e10300aac0faffb478010014e8534cb948000037f62b06f9L8;FF04340094e0831591e1831a910228805200340094ff0a00b161c9ff54a4010014fc432a912f0100", - "14c80080d2e14f05f90800f0f2080900d1ca000014e04f05f9BBBBBL4;FF4901098b6801088b2abdcaca2981c9930badcbca4801088b6901098b0acdcaca0881c8932bc1cbca4901098b6801088b2c81c99329bdcaca0badcbca2801088bL4;FF1f0500b1a0400054f6275ca9fc031faae82f00f9e8eb40f", - "9f90b41b2e92304a97d000014810a41a9e0e3069141f7ff97e8df40f91f0500b1003f0054f6275ca9L8;FFfd030091010040f9f30300aa810000b4600640f922008052f6030194610e40f9810000b4601240f922008052f1030194611a40f9810000b4601e40f922008052BL8;FF427c2991ea0f00f9e343", - "009116840194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000b04ae11991e8a700a9020300f042600491ea0f00f9L8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8", - "bBBBL4;FFe8cb42f91f0500b160000054a0620091a9acff97f7c742f9f5c342f9970100b4b822009104000014f70600f118630091e000005401835ff881ffffb4000340f9L4;FB54000000000000007300000005000000426549000000000054000000000000007900000005000000426549000000000054", - "000000000000007f00000005000000L8;FF0201805201f17dd3fac30094e86f40f9790600f97a2201a908008092e4f5ff17ba0000b4e00315aae1031aaa22008052f0c30094e16f40f9810000b4e04740f9BL8;FF560300b4610a40f9680240f9b70640f91f0101eb00080054680640f9490180522a04009", - "1e00316aa6a0a00f909692138e10313aaa2fcff97780a40f9680240f9L8;FFe3838b3ce3838c3c8376fe97e89341b9080e00362007c03de9b341b92143c23ce8c741b9a6000014080100b008e1079169038052d0feff17eaa759a9e8430f91BBBBL4;FF21e4019440f60035e85341b9e8df00b957ffdfc8d", - "70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054L4;FB6865745f6b657973656e6465725f726174636865745f6b65795f70726976617465636861696e5f6b65796d6573736167655f6b65797300007fea480000000000L8;FF2c0000144103005", - "45f0f00b1e0030054e0830591e1030091022c8052fde30094fa031f2ae8f340f91f0d00b141160054e1b340f9280080527f2200a908008092BL8;FF144c02291f600039f44f42a9f65741a9fd7bc3a8c0035fd600018052010480520c640194ff8300d1fd7b01a9fd430091080040b9a01300d1a8c31fb80", - "6640194L8;FFe10317aae20314aa11070094770a40f9680240f9080117cb9f0208eba9faff54e00313aae10317aae20314aa08070094770a40f9cfffff17a8831ff8a84300d1BBBL4;FF000140b203a40194a88300d1e0030091e18331912da40194f2a301940004805221008052f0a30194600400b4a007", - "7fad0804805260a200a928008092680200f9L4;FF00c0049114c8613802000014947e01139400003780761e535fc020eb83ffff54e14f40b202000014947e0113607f349b1f0001eba8ffff549c7e40939f060071L8;FFfd7b41a9f31340f9ffc30091c0035fd6080040f9e00301aa094540b83f050071e1", - "010054ff8300d1fd7b01a9fd430091810100f0210c1691a40100d084001e91BL8;FFf44f03a9fd430091155040a9e00301aae80300913a240194740100b49302009073e23591e0030091a1630091e20313aab50f00f9b506009132240194940600f1BL4;FF2000178be1031f2ae20315aa08140038f62300", - "94bf3e00f148020054800642ad80020291e103009122008052e00702ad800a43ade00b03ad810240ade10300adL3;ZBBBBBBBBBL4;FF0088202e0800669e17c101f260ffff54e802c0dae91340f90811c0da200540a9530f488b68fe1b9ba802088b024106d19e1800940800148a206b68fc00a8200eL4;F", - "F882602a9e10f40f9a1fcffb5e7ffff1720008052c1028052031e0094ff8302d1fd7b04a9fb2b00f9fa6706a9f85f07a9f65708a9f44f09a9fd03019109404039L8;FF1f0500f101030054d56240a9e00316aa0103805202018052f61d0194f90215cb330313ab420b005408ff4ad3090880520811c0da28", - "0108cbe90080521f1d00f1BBL4;FF41028052089e0194ff8307d1fd7b18a9fccb00f9fa671aa9f85f1ba9f6571ca9f44f1da9fd030691f30300aae0430291f50304aaf40303aa032a0094e84b40f9L4;FFc0035fd6030000f062400691e40300aae1070132420c4039421c00130204003480fc5f88e00000", - "3581fc0088a0ffff356203f836634006917f0c003918000014L8;FFfd430091130040f9e00301aa810100d021fc1791e8030091e2008052419e009468c20091810100d021881591a40100b084a00a91e0030091a3630091a2008052BBBL4;FFe0023fd61f0000f1ad000054390300eb033600541803008b0", - "60000141f0400b18135005416de01941f1000310135005439feffb505000014e043059181008052L4;FB20c00b3a20657870656374656420c0082c20666f756e6420c00016696e76616c6964206c656e6774683a20666f756e6420c000217468652073797374656d2074L8;FFe86f04f9e80740f9e87304f", - "9e83f40f9e87704f9e9235ea9e97b04f9e88304f942260094e8f741f9eafb41f9e9f341f9eeef41f9e1eb41f9e8e700f9e8ff41f9BL8;FFe013843d0083c03cf8031baa08011bcbf66309f93f0308ebe09b843de19f843dfb6f09f9f62b08f9e0ff833de103843de207843dfbeb0df908590154793600b4L", - "8;FF40070054680640f9490480522a040091e00315aa6a0a00f909692138e10313aab6faff97760a40f9680240f9080116cbbf0208eb48060054680640f9e10314aaBBBBL4;FFaa2240f9aa0a00b42a01008a00696afc00a8200e0c00669e8c0b00b48b01c0da6b11c0da4a0d4b8b4a01098a0b69ea38eb0", - "bf8364c2100d118692a386b014092L4;ZFL8;FFe00302aaf30302aaf40301aae3fcff9720020037750240f9a80640f9160101eba2020054e80f41b2e81300f907000014c90080d248008052e0a300390900f0f2BL8;FFffc30091c0035fd6092000912103009021e03a91a9831ff82403009084603a91a32", - "300d1e00308aae2028052337e0194fd7b42a9ffc30091c0035fd609200091L8;FF60afff54e263009160008052c7000014e8031faa000116abc2660054e16300916f7dff977f0600b18000005480220291e1630091f392ff97bf0600b180adff54BBBL4;FF090440f94b2000d10a0800f929010b8a3f2500", - "b1080200540a0c40f90901098b01692238212100395f0500b1a0010054080d02cb49050091090c00f903811ff8L4;FB2e01000005000000908749000000000011000000000000004501000005000000908749000000000011000000000000004a010000050000009087490000000000L8;FFb3000094f58b", - "44a9e00316aaf7e345a9e083c03ce8d343a9e183c13ce10315aae283c23ce43740f9e30318aac0860cadc26e803dc8e200f96f160094b70000b4BL8;FF49090054091c40f93f0500b120060054096840b969070034290140b22911c0da291540d2290d098b2925019129fd46d3290500910a2440f9aa0600", - "b44b0140b2L8;FF210406910301009063700691a0c300d142018052440080521a000014a0031df8010100902104069103010090632c0691a0c300d1420180524401805211000014BBBBBL4;FF75ffff17e00313aa22008052230080522400805266000094610a40f97cffff17f44f45a9f65744a9f85f43a", - "9fa6742a9fc6f41a9fd7bc6a8c0035fd6e00313aaL4;FFe8d740f9e8ab02f9e8cb40f9e8b302f9e86741b9e86b05b9e813049108f14fb8e87305b949d109b8e9235c29e8d31539e8fb4379e9d71539e9fb41b9e8f70a79L8;FF0b010039a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035", - "fd6fd7bbda9f65701a9f44f02a9fd030091150840f9080040f9f40302aaf30300aaBL8;FF48030090080d219142018052e00301aae10308aa358e0114281040b96800c8376800d037328e0114328e0114328e0114ff8300d1fd7b01a9fd430091090040f9L8;FFd60600f1f7620091e0000054e1825ff881", - "ffffb4e00240f922008052f58d0094f8ffff17d50000b4a806158be00314aa0201805201f17dd3ee8d009408008092BBBL4;FFdefeff17e0e30091e10318aae20316aa230080522400805265c0ff97f82740f9e81f40f9080118cbdf0208ebe9dbff54e0e30091e10318aae20316aa23008052L4;FB00000", - "00000000000000000005849b290cb5edb1a0000f200941f00de724e0d91c5d42c3f6555b2339157a68e00000000000000000d2a80a1c73402bc00000000L8;FFf7430d91fb0300aa60011fd6760740f9df0a00b1c03a0054df0600b1803a005475b742a9681f40f97ad341a9780b40f9e84f00f9fb030daa", - "baa400b4e9cd0094BL8;FFa80302d12183833c2083843cb1a8ff97e11b40f9e21340f9e843069163a303916423039185830091e00316aa060480527ca2ff97facb40f9e86346395f0b00b1L8;FFc01300b4e10314aae20319aafc0300aa004e0094542340f9b4031df8b40100b5820000143600805257174", - "0f917fcffb538008052482740f91f0500b121fdff54BBBBL4;FF602201a9000400ad692200a9f44f45a9fd7b44a9ff830191c0035fd6e023009167eaff97e043c13ce143c23ce83740b9e90740f9ea1340b960c2803c61c2813cL4;FB61676512626164204b454d206b65792074797065203cc3200080690", - "400013e0019756e6578706563746564204b454d206b65792074797065203cc32000806904L8;FFe0030091e20080526400805209000014e00300f9210200d021941c91230200d0632c1691e0030091e20080524400805251e2ff97e10340f96affff17fd7bbda9BL8;FF28010acbe80208eb88010054e803", - "1faa4901178b09000014f6031faa00018052ff7f01a9ff0300a937feffb5ea031faae9031faae8031faa4be179d32ce179d3L8;FFe1031aaae20318aa11110094fad342f9fc0740919c830191dffdff17f80300aae04316912200805209110094e1d342f9e00318aa02feff17e043169122008052BBBL4;F", - "F0849359149038052682601a908008092685e00a9b40000b4e00315aae10314aa22008052f3ad0194e0a30091d294ff97d1feff17c88240b8c9c240780a6342f8L4;FF4b010c8be7ffff1754fc41d30d0000141f4100f1ea279f1a29010a0ae9000036f4031faa0700001428008052ff0f00f9ffa300a910", - "00001414f97fd33402f8b7L8;FFbc831ff82fae009468e34039a0024079e103132a1f050071e1f5ff54e0ffff17f44f47a9f65746a9f85f45a9fa6744a9fc6f43a9fd7b42a9ff030291c0035fd6BL8;FFff4b02f9e3930ca9e59b0da9e9fb00b9ea0b10a900013fd6e03b02f9e8031691f4031691e13f02f", - "9290c40f9e103129120013fd6f8c342f91f0f00b121020054L8;FFf4e342f9680000b4e00314aa00013fd6c10640f9810000b4c20a40f9e00314aaf42d00945f0b00b141100054f5833f91bb070036e88340f9e0074091f69340f9BBBBBBL4;FFe00313aae10317aae20314aa23008052240080526608009", - "4770a40f9c9ffff17e00315aa78160194e20315aae80300aae00301aac8e707374cffff17e0230091L4;FF21008052f8150094002701b4a80000d008a53991fb0300aa0001c03d08e140f8ec0741b2d6028052d90280520000803d08e000f8e1ab4bf941f1ffb58effff17L8;FF6c010caa8bfd43d36b7dc", - "d9b0d7d80526bfd44d36cb10d9b0d488852ed01a0728c7d0d1bea030a2a1fad01a90a0900f92a00805209b100390c2900b90a7d00a9BBL4;FFe23bc03de1030391e243009103048052e323803de00702ade18348ade20f803db7020191e8270ca9e10303ad52dfff9700e4006fe00306ade00307ade033c0", - "3dL4;ZBL8;FF0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb88130054bd000014080c44f81f0900b1c1090054f3031faa5a000014e80300aaBBBL4;FFc10000542800805238008052dffe04a9bfa339a9a8ff3ba91f0800f1c15b0054b58355f8a20640f9a25e00b4a102", - "40f920008039c003f8b728040091490400d1L4;FB881f49000000000058000000000000006a00000009000000e11f49000000000056000000000000008400000009000000881f4900000000005800000000000000L8;FFe0032b91924e0094e87f47f91f0500b1004d0054e0031d91e1c33991e3e33b91e2", - "0314aa5a160094e8a343f9f9a743f9e9ab43f9eaaf43f91f0500b140820054BL8;FFe8cf42f949098052f6074091d6820991f4031baa0969213828040091f87749f9e8d302f91f0700b1a01a0054c02202910e170094080040b20811c0da081540d2L8;FFe2f702f9e083ff541f0d0071f3c31291c16c005", - "44801009008b140f9880500b4e0db42f9e44b40f9e8c31791430302919db6fe97e8c31791fcfb42f90081c03cBBBBL4;FF28008052a203df3c800600ad820a803d68c20039f44f4aa9f74340f9f65749a9fd7b47a9ffc30291c0035fd6000180520105805207f60194000400b000a01c91L4;FB537472756", - "37475726573656e6465725f6b65795f7374617465734d6573736167654b65796369706865725f6b65796d61635f6b65796976436f6d62696e656446L8;FFe00300f94102009021081d914302009063d01d91e00300914201805244018052e5ffff17e00300f941020090212c1e9143020090639c1591e003", - "0091c2008052BL8;FFffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa0103009021f42691e8030091e00309aa620180523d760194686200910103009021102891040300f0L8;FF1f0109eb68000054fe040014e8031faa160114ab020d0154f47349f99f0e00b161000054e8031faa0d0000140", - "0030291b72a0094080040b20811c0da081540d2BBBL4;FF600706ade18343ad622f803d610307adc1560094a10303d1e00316aae20317aafcb50194608744ad73060091e80b40f9f60315aa000500adba0e00b48082c63cL4;ZDL8;FFdffa7af2010e0054f5a600a9e91640f9ea3240b939c30191fbf201a", - "9e91600f9e93240f91f0119ebea3200b9ea6a40b9f4ce03a9f6ea04a9eca605a9ea6a00b9BL8;FF08030090fa83029108b140f9fb4340f91f0d00f143070054e8c31791e0833291a55dff97e8fb42f91f0500b100f50054e80343f9e9f31691e07fc13de9a305f9L8;FF0227c03da826089b008743ada906", - "0091fb6300f9000500ad0209803de9ef01f9e0432a916ef4ff97687a40f919008092f9f301f9c87300b4090380527b7640f9BBBBBL4;FFe20a00b416210091f4630091f7230091350080520e000014e90f40f9e1630091a2630091e003082a3f0900b129119fdae90f00f9d4f2ff97c01100b5b70f40f9L4", - ";FF290d098b29250191891a498b29050091280108ab83000054f5000014e80308ab621e0054bb2640f9290180527f0300f1e903899a390108aba21d0054b900f8b6L8;FFf44f42a9f65741a9fd7bc3a88c02001400200091f44f42a9f65741a9fd7bc3a814030014e80300aa098d40f83f0500b1a0000054", - "f30300aae00308aa48030094BL8;FFf70315aae00313aad21a0094080040b20811c0da081540d2080d088b08250191081848abe2020054160116ab02030054f70600f173a2019161feff54c80215abL8;FFa8e301d1e91740f90001c03da88359f82001803d280900f9e83340f91f0500f1ab000054e0374", - "0f901f97fd342008052f0850094e83f40f91f0500f1ab000054BBBL4;FF09692138a18300d166b1ff97b6035ff8a8035ef8080116cb9f0308eb081300541c0100b4a8835ef8e10f40f9e2031caa0001168bf7c50194d6021c8bb6031ff8L4;FB17010000110000006c69627369676e616c5f70726f746f63", - "6f6c3a3a747269706c655f72617463686574696e76616c696420726563656976657220636861696eL8;FFe87740f9022980526942023978a21aa9e85340f960828f3ce08b53ad6aa21ba9e87340f961828e3ce19bc03d61a21da9e86340f9e1c3039160828b3ce093c03dBL8;FF3f0308eb6100005480c20", - "091687cff97881e40f9e083c33ce0031faa2823189b000d803de083c43c0011803de083c53c0015803de93740f9093100f929070091L8;FFc000805221008052f7450094c00200b4a8cc875289c78d52e9cdad7208080079c8008052090000b9680200a9680a00f9fd7b43a9f32340f9ff430191c0035fd6", - "BBBBL4;FFd6a201f118a30191730600916003005400877fa9e8230091f3bb0094e82340391f05007121feff5428b340f91f0900f183feff5448008052a00700d1e1c30091L4;FB20636f727275707420666f7220c0001c706f73742d7175616e74756d2072617463686574206572726f723a20c000234275", - "696c64696e67205072654b65795768L8;FFd50e0091750a00f9d70000b594fe55d3680240f9bf0208ebc104005423000014680240f9897e1553bf0208eb3961193261000054e00313aa40e50094680640f9BL8;FF8000f8b728040091490400d1110000145f2800f1880000542800028b08f1df38e807f83", - "7a0e300d1c6ceff97a8835cb848130037a8835df82a0340f9490108ebL8;FF22008052fb650094612a40f9810000b4602e40f922008052f665009460c20191f30b40f9fd7bc2a8aefeff17602200917800009460220291f30b40f9fd7bc2a8BBBL4;FF290d098b29250191c91a498b29050091b41640f928", - "01088b140500b4890240b22911c0da291540d2290d098b29250191891a498b29050091380108ab22040054L4;FF7f003f7180000054000080d21f000039007d20d4631240f97fcc74f2200d005463cc749266fc44d3c60400d1dfc024eb220c0054000080d21f000039007d20d4L8;FFfd030091080040f9", - "f30300aa1f0500b160000054e00313aa51a3ff9714008092740200f9680e48f81f0500b160000054e00313aae6a0ff97740200f9f44f41a9BL8;FF0010803c820200b042403a910110813c600640a9e8a701a9e8230091090000b029d10b91e3630091e8a702a90e260194e10b40f9e10000b4e80740f9f3", - "03002aL8;FFe10308aa3926001408a440a9e20301aae00308aae10309aa30260014c00000b000002391e1031faac0035fd6c0035fd6e30302aae20301aac10000d021601891BBBBBBBL4;FF692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a29ff190294fd7b47a9f", - "f030291c0035fd6ff8301d1fd7b03a9f65704a9L4;FFfc6f16a9fa6717a9f85f18a9f65719a9f44f1aa9fd43059109304039e9130037190840b9f30300aa180040f9e0a30291f40308aae103192abd110094f50f4ba9L8;FFf44f47a9f65746a9f85f45a9fa6744a9fc6f43a9fd7b42a9ff030291c0035fd", - "6fd7bbfa9fd030091600200f000d82191620200f042202291c10180521e1a0194BBL4;FFfd030191f70304aae40303aae30302aae20301aae10300aae0830091f60305aaf30308aac4fcff97e81340f91f0500b100040054e00bc03df41b40f9e0830091L4;ZFL8;FF4809c05a6909c05ae8270f298809c0", - "5aa909c05ae8271029c809c05ae909c05ae8271129e08743adc806805234008052a00301d1a1c302d122008052b4031ef8BBBL4;FFc0035fd6ff4302d1fd7b07a9f34300f9fdc30191011440f9f30308aaa10100b4001040f9a8c300d197b30094a8035d381f05007181010054a8835d381f050071L4;FB3", - "835366166303938352f6c6962726172792f636f72652f7372632f697465722f61646170746572732f656e756d65726174652e7273002f72757374632f343861L8;FFe8ff40f9fa3f02f9e80302f9e89340f9ed4b02f9e80702f9e8db40f9f15f02f9e80b02f9e8b340f9f66702f9e81302f9e8c340f9e46b", - "02f9e81702f9e89740f9BL8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb499d0054180116aba20a0154b800f8b6f9031faae00319aae10318aafb590194f90b00f9L8;FF40030291e1c317917396fe973c008092ab050014c80080d2210100b021d831910800f0f2e0031791e", - "3833291e4c31791e2008052e9fb05b9e8fb02f990fdff97BBBBL4;FF800600ad820a803d68a20039f44f4aa9f93b40f9f65749a9f85f48a9fd7b46a9ffc30291c0035fd6000180520104805208fa0194000400d000c0179104fa0194L4;FB6167652066726f6d20c02e206661696c656420746f206465637", - "27970743b2073656e6465722072617463686574207075626c6963206b657920c011206d657373L8;FFe08744ade00314aae22fc03da0873cade08742ada2039b3ca0873aade08b43ada08b3bade18340ada18338ade08b41ada08b39addbf3ff97a0077cad880080d2BL8;FF22010054c87e0453690b0091", - "0a000014e80b41b20900809268fe00a9690200f92a010014df3e0171e9000054c87e0453690f00916842003908008092682600a9L8;FFe0a7c43d4383c63ce85309f9e2a3c43df95709f9f75b09f9e1abc43df95f09f9f97b49f9e00b843de0afc43de3f3863de8e34df9e10f843d0183c13ce013843dBBB", - "L4;FF36230daaf55f40f9ea031faaed0308aaad010c8a20696dfc00a8200e0e00669e4e0100b55f2100b1e02b00544a210091f32b40f9fa2f40b9fc1b40f9ad010aabL4;ZBL8;FF2d120094e17342f9fa03002ae1f4ffb5a9ffff17c80600b1e2160054e80300f9f0b900940004805221008052eeb900942", - "01400b4600740ade84312910291c03cBL8;FF080114cbbf0208ebe8000054680640f93f0002710801148ba20100540101003926000014e00313aaf603012ae10314aae20315aaf7f8ff97e103162a680640f9L8;FFfc390094df0600b1a0300054e85f40f9e0c32491f69b04f9fa9f04f9e8a704f9e86b40", - "f9f7a304f9e8ab04f9e85740f9fbb304f9e8af04f9e8830f918f93fe97BBBBBL4;FF22008052fb090294e12b40f93f0400f18b000054e02f40f922008052f509029460c2009101f1ff97e00314aa3f000014f30300aa688e4ff81f0500b1e1000054L4;FFe10314aa080a0094fd7bbda9f65701a9f44f02a", - "9fd030091f30300aa020300b4280040391f21007161030054f40302aaf60301aa9e8ffe971f0400b180050054L8;FF21300c91030d40f9c2018052fd7b43a9ff03019160001fd6202040a96102009021c40c91030d40f982028052fd7b43a9ff03019160001fd60a20009109240091BL8;FF1d000014a083", - "1cf8210300b021d82391230300b0630c2491a0e300d1a20180526401805214000014a0831cf8210300b021d82391230300b0637c2491a0e300d1L8;FFa20301d1e10700b9210080526301009063c02291640100b084401291a8031ef8a9031cf8278a0094e10740b9720100f052e23b91a80100b008e1403", - "91f050071BBBL4;FF610600f969420039edffff17ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091040180520509805229f87fd33f1100f13481889aL4;FB756e6b446174614465636f64696e674572726f720000000025194900000000006a00000000000000dc0000002e", - "00000025194900000000006a00000000000000L8;FF08008092740600f9687201a9e8fbff175b0080521e020014ea6700f9e94f00f9e86f00f9943400b4fb0314aaedc90094e00314aa21008052ebc9009400e400b4BL8;FFfd7bc2a8a8feff17610640f9810000b4600a40f922008052f6490194611240f", - "9410d00b4601640f922008052f30b40f9fd7bc2a8ef49011461ce40f9810000b4L8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eba808005450000014f3031faa080c47f81f0500b1c1dcff54e8031faa080113abe3070054BBBBL4;FFfc0300aa7f7f00f1010000adc9070054f", - "4e901940004805221008052f2e90194e00700b4ea2741a9b86200b9e10240adb92600a9e92340a9010000adba2202a9L4;FB6520746f206120566563000000000000ea984800000000002e00000000000000440300000e000000000000000000000008000000000000000800000000000000L8;FF090040f", - "9280140f93f0100f9e80000b4291040393f050071e0000054000140f9fd7bc1a800001fd6200200b000001f9104ea009404ea0094fd7bbfa9fd030091BL8;FF29194a8b29050091280108ab8300005441000014e80308abe2070054096040b93f05007141010054096440b9290140b22911c0da291540d22", - "90d098b29250191L8;FFe91740f90029803da8835af8e0430691e10244ade1830d91e8bb01f9a8e378a9fa9701b92183813c2083823ce10245ade81700f9e80b40f9e9a319a9a80302d1BBBL4;FF09692138a14301d1aa031cf86595ff97a1035cf8a8035bf8f90f00f91f0101eb80220054a8835bf84904", - "80522a040091e00313aa09692138a14301d1aa031cf8L4;FFe00000544a0940f9eb032aaa6bfd47d36a194aaa4ac100924901098b2afd48d3299d00924a9d00924901098bea8300b2297d0a9b08c1498b292840791f0109ebL8;FF0a000014a06300d1820080522300805224008052d6bfff97a0077fa9f1", - "ffff17b5e33ea9bf831ff8f50b40f9e80340f9bf0208eb81f9ff54e003009181a90094BL8;FF490500b4ea0200b04ab140f95f0900f1c3040054ff8302d1fd7b08a9f44f09a9fd030291e90300f9e90300914a0200f04ac10d91eb230091f30300aae9ab00a9L8;FFe0833f9139031891f7032791f8833f9", - "1297f4039280340392a15003308111d1228030039e80327912a7f0039e083c53de187c53de0fb833de1ff833de9fffe97BBBBBBL4;FF08fc60d3882700b5080840921f1900f1a2270054017c0353c12700343f0800716c0100543f040071c00400543f080071c103005481620091e003082ae20313aaL4;F", - "Fe90b41b9094d0039e90341b909510039e9fb40b909550039e9f340b909590039e9ab5c290a5d003909610039e9ab5b290a65003909690039e9ab5a290a6d0039L8;FFf0274039c911092af12b4039f22f4039ee334039e14740390c120f2aef374039f03b40394d12112af13f4039f243403908040039e8", - "4b4039e24f40390a080039BBL4;FFe80740f9080116cbff0208eb08190054970100b48002168be10318aae20317aafc910194d602178be00318aae10317aa22008052f60f00f9ee91019402000014L4;ZDL8;FFc0000054110000143f150071600000543f190071a10100540a008092092100390a0100f9f", - "d7b42a9ffc30091c0035fd6090080921f210039090100f9fd7b42a9BBBL4;FF48f3ff5413008092e8af40b9fc031faad60e00b5e9031faa3f0116eb620800546a0b40f99f0316eb0c0e80528b83969aed0d80924e01098bd0690c9bee0309aaL4;FBdb54b1d040c5774f26232f0583d814345557dad0491d", - "752b732ca28c30d697d90000aaed083d89a75e0f269acfa31bf933bbb8543cd276472052e37c1b547025L8;FFe9174ca9ef6741a9e9d300f9e97b43a9e97b00f9e9fb40f9e9e700f9e96b40f9e9fb00f9f42748a9f64700f9f60308aae8af40f9e96b00f9e93342a9e99f00f9BL8;FF2200805203110094e", - "1d342f913feff17e0431691e1031aaae20318aafd100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aaL8;FF20afc03de82344f9f4630191e9c7009180c20391e1e31b9120f18f3c8942039102278052f86f11a9f55f12a9e92b00f9e8a300f9f7510094ff0600b19542", - "0391BBBBL4;FFea0f40f9765a0179687a00b9a8035af869fa0079a9835a78a8831cf8a88357b8a9031d78a9b357b8681a00b9c87e105369b201b8a9035c3868ba0239a8835bf8L4;FB76617465207369676e696e67206b657945974800000000003100000000000000dc0000002c00000045974800000000", - "003100000000000000e700000036000000L8;FFb9ffff17e80b41b2e00700f9b6ffff17880080d20800f0f2080140b2b2ffff17880080d20800f0f208110091aeffff17e00300f9210200f021901791230200f0BL8;FFa99318384901084aaac35838a9a318386901084aabd35838a9b318384901084aaae", - "35838a9c318386901084aabf35838a9d318384901084a220080526801084aL8;FF490b8052f4074091948209910969213828040091f69349f9e8d302f9df0a00b1610d0054f9031faa75000014e1d342f9e8cb42f91f0101eb806f0054e8cf42f9BBBL4;FF1f0500f1eb000054e00309aae10308aa220080", - "52f6030baaf6b10194eb0316aa9f0700f1ab000054e0030baae1031caa22008052efb10194e12347a91f0900f1L4;ZBL8;FF21008052f8b10094a00700b43f030071a80e40f9a90240f96a139a9a400540ad1f0109eb000400ad00050054abaa40a9610240f94a01088b080500915f0109ebBL8;FF606a68", - "f822008052fa31019499ffff17c80080d20800f0f2080900912dffff17fa830291e8fb42f91f0500b1201e0054e80343f9e07fc13de9c31291e0833291L8;FFe1831591e3830f91e8b702f9e800009008a13e91e8f301f922008052e8fb01f9e800009008613f9100cf803de9f701f9e9ff01f9e80302f92", - "4ecff97e15343f9BBBBBL4;FF7b620039f44f47a9f65746a9f85f45a9fa6744a9fc6f43a9fd7b42a9e923416dff030291c0035fd62004009000201191070202940920403989010037090040f9L4;FFb80100b510000014810000b4e00316aa22008052f7010094b70000b4e1ee7cd3e00314aa02018052f2", - "0100945a008052b80000b401ef7cd3e00313aa02018052L8;FFfd7bc5a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f090071e1010054e00302aaf40302aaf30301aad8000094e80300aaBL8;FFf51300f9f44f03a9fd430091080040f9e00301aa14cd40a9e803009", - "138820194b30100b4080d8052757e089b130300f073e21191e0030091a1630091e20313aaL8;FF7f05007120fcff54eb031faa050000144b008052ecfcff35ec031faa8b010b8b2801088b49010b8b0801098b090140b22911c0da291540d2290d098b29250191BBBL4;FFa00b005448070091e0430191e1", - "43069102288052e82700f9fec101949f0700b1e003005420630091e143019102288052f8c10194e82b44b9fc7301f9f57701f9L4;FB73696f6e207374617465292c206e756d626572206f662070726576696f7573207374617465733a20c00022536b697070696e6720636f72727570742070726576L8;FF", - "a103963ce91f02f9e01b813de217813de113813dc5150094e20fc13de313c13df60b41b22f00001488a2069198da5fa98066c03d0101c03d88de40f989d240f9BL8;FFe10314aae20315aa0001168b01420194c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aa22008052f7", - "000094610a40f9a5ffff17L8;FF608205917600009461c641f9810000b460c241f922008052f641009461ce41f9810300b460ca41f922008052180000141f0d0071200500541f11007161040054BBBBL4;FF83b600541803008bf9feffb50f0000141f0400b1e1b5005419e201941f10003161b50054f9ff", - "ff1716e20194f70300aa1f0400b141fdff54e043059181008052L4;FBb00000002e000000000000000000000008000000000000000800000000000000c889430000000000506f6c796e6f6d69616c4572726f724368756e6b496e6465L8;FFe0d7c23da8031ef8a0039d3c6002803d680a00f9980000b475", - "da01a9781600f907000014790e00f9b50000b4e00316aae10315aa22008052eee10094e0431e91BL8;FF010480521362019408004039e90200f029611191e00301aa08711d5308410051081d7d92226968f8e90200f029411291286968f8e10308aa2c620114ff0301d1L8;FFa1210054e00313aaff6b00b", - "9ffdf00a9df7e01a9dffe02a9f71700f9f72300f9df7e04a9f7ff05a923feff97e0060036212c00b5992240f9881a40f93f0308ebBBBL4;FFd6120f91410300f021203e91082109aa6905c05a420300f042801891a34300d108010aaa0ad49052b6831ff8284108aa2a00a072097dd59b28a10a9bc903805", - "2L4;FF60000014ebf9ff97e10300aa82018052000080d2220000b99a00001495520091050080d2e10315aa040080124304805262008052000080d2db020094f30300aaL8;FF810100f021801691e0230091a32300d102018052e40313aab4831ff842a2009488120091810100f021601791a32300d182018", - "052e40313aaa8831ff83aa20094BL8;FFfd7bc1a80f080014200440ad000500adfd7bc1a8c0035fd6800200b000401491f7210194800200b000a01491f4210194ff8301d1fd7b02a9f71b00f9f65704a9BL4;FFf44f41a9fd7bc2a8fa210014f44f41a9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd0300910", - "11040f9f30300aa810000b4600e40f922008052ee210094610240f9L3;ZBBBBBBBBBBL4;FFfc1e02946cffff17e003152a01018052e20313aaf81e0294f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6f50300aa60220091f80302aaL4;FFe0031faa081f0094e00741a9061f0094f", - "f8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd83029128008052f30300aaf8430091ff2301a9e87f03a9ff2304a9L8;FFe823009180020090008c08918202009042a01b91e1430091e9a301a9e91700f9021f019469fbff970001805201058052081f01948002009000201a91f31e0194BBL4;FF94020", - "98bff4702f9d00a00941b000014f49e01944002805221008052f29e0194e01e00b4f80f40f9e90740f96a0300904ac91791f70300aae8cd8d524001c03dL4;FF73061c12600180927f82007100009fdaf35341a9f55b42a9fd7bc4a830f7ff17e4f6ff97c1028052010000b900008092fd7bc4a8c0035fd6", - "def6ff9781018052L8;FF42018052479f009488820191810100d021881591a40100b084a00a91e0230091a32300d1a2008052a8831ff83e9f009488c20091810100d0219c1591a40100b0BBBL4;FFf70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad0", - "00054390300eb035500541803008b060000141f0400b1L4;FBfc0744000000000078084400000000006408440000000000ac0944000000000064074400000000007d004900000000004a00000000000000270500000f000000L8;FF21200091023c805202df0094e9c743f9080340f91f0109eb892f0054e", - "1a343f989008052680a00f90800809269220039680200f9810000b4e0a743f922008052BL8;FF9f1202f82809c05a4a09c05a892e4b29882a02292809c05a6909c05a88260329884640f909208052800640ad282508aa080dc0dae00700ad9f2203a9820241adL8;FFf50b40f9fd7bc3a812faff17e00313", - "aa220080520e020094610a40f9dbffff17f50300aae00313aa2200805208020094610a40f9e00315aae3ffff17fd7bbca9BBBBL4;FFe10315aa759a0094e08743adc282c33ce9ab45a9e83740f9e08701adc082c43ce28300ad04000014e8031faa09008092ea1341b2e08741ad880a00f928008052L4;ZF", - "L8;FF160101eb02030054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e00300910ff4ff97e10300aae00301aaf44f45a9BL8;FF6a820039aa835fb8abb35fb8e80b00b9e81300b96a1200b868a200b8ea2342a96012823ce91b0079e92b00796b0600b96c120", - "079691e00796a2201a96112833cL8;FF0811c0da081540d2080d088b0825019108fd46d30900088b37050091ff0208ebc9120054968248f8df0600b1c01200548022029163eeff97080040b20811c0daBBBL4;FF0e000014e8031faaf6e740a9b9f9ffb5e90319aba3fbff54800300d000001c91f7be0194", - "28008052ff0600b1ffc300f9ff2317a9a10c0054d90700b42807198bL4;FBa486490000000000000000000000000000000000000000000000000000000000aa86490000000000b38649000000000000001b1b1b1b1b1b1b1b1b1b001b1b1bL8;FFfcbe0014612640f9080080921f200039080000f93f0400", - "b140010054810000b4602a40f922008052f2be0094613240f9810000b4603640f922008052edbe0094BL8;FFf44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd620008052e10317aaff3e019420008052e10319aafc3e019420008052e10318aaL8;FFd9feff972024003728f", - "c60d3681000b5200840921f1800f102110054217c0353211300343f0800718d0100543f0c0071600200543f100071c00200543f140071BBBBBL4;FFe802158b680a00f9882240f9a82000b4090d8052941e40f9590480521851099b5b0380525c0280521a0180520b000014680640f9e10316aae20315aa0", - "001178bL4;FFf9575aa9f62b40f9f41740f922020014ea431391e9d744b9eb635339481140b84aa140b8e18b40f9e8bb03b9e8bf4979eadb03b9ea7342f909b303b8e97742f9L8;FFc0035fd6fd7bbea9f44f01a9fd030091f40300aaf30308aaf20e01940002805221008052f00e0194200100b48002c03", - "d08028052680200a90000803d680a00f9BL8;FFfc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191350840f9fa0301aaf30300aa750500b4540740f9ed8e0194e00315aa21008052eb8e0194601800b4L8;FF21008052e82700a92e8f0094e003132ae103142aa80100d008e140391f050071c0fb", - "ff54d3e7ff97f44f42a9fd7b41a9ffc30091c0035fd6ffc300d1fd7b01a9BBBL4;FFe80240b20811c0da081540d2080d088b08250191e81a488b08050091b60100b4c90240b22911c0da291540d2290d098b29250191c91a498b29050091200108abL4;FB8365b3e3a2d80926d66e277f6ee27fd5ee4adfd", - "d48ead4ade658a28c3854ed4511bf919500008f8136cdceac0dd8f12b1bcf3accca59fa96b5e019a5371ae52bL8;FFf50316aae65b00f9e65f40f9fb0307aae80700f9ee234da9e9e740f9f2d340f9f4ff00f9e85f00f9e3db53a9ea2717a9e9030daaec1740f9f80303aaeb6f00f9BL8;FF2083ce3cc1e2", - "009161838d3c2183cf3cfc030b9160838e3c2083c83c61838f3c2183c93c6083883c2083ca3c6183893c2183cb3c60838a3c2083c43c61838b3cL8;FF810000b4020b40f9e00316aaf94e00947f0b00b181040054e91f40f9e14341f9e0031691ffa71139200545ad286140f9e82303f9200705ad200543a", - "d200703adBBBBL4;FF1800180a21ffff5404000014f8031f2a0200001438008052e003182a0fef01943f1f007209008012e8079f1a1f1c0072a90200b9e803881aa8120039b60000b4L4;FB65000000050000002594480000000000540000000000000073000000050000002594480000000000540000000", - "000000079000000050000002594480000000000L8;FFe1031faad8ffff17e20313aa230c80528ce7ff97e10300aa60faffb4caffff17a00500b5e00313aadcedff97e80301aa40010036080600b5e1031faacaffff17BL8;FFf65704a9f44f05a9fd030091f30302aaf40300aa020500b46806138bf60301", - "aa15f17dd3ef6e0194e00315aa01018052ed6e0194a00500b4f70300aa1b400091L8;FF42800991a103805248030039096f0094400100d000800191420100d042802591e1038052246f0094e04316912200805207120094e1d342f942faff17f60300aaBBBL4;FFbc0359f8be431678be835938a8435678b", - "c831af8be031b38e8930678087e1053e9b306f8e84b0239a8fd60d3fcb309f8a98357f8e85f0239e87d1053ea3307f8L4;FFf5031faafc031faa34008052190082521a04a05217008252e1074091e003132ae20317aa74110094000700b4c000f8b6e0060094080040b91f110071e0feff54L8;FFe00f00b", - "900210091a22300d121008052a30100b063c02291a40100d084401291a8273fa927af0094e00f40b9e80100d008e140391f05007140fdff542b070113BL8;FF7722009104000014d60600f1f7620091e0000054e1825ff881ffffb4e00240f922008052f32e0194f8ffff17e89340f9c80000b40805088be", - "00313aa02018052L8;FFe8630091e8270ba948008052c90000f029a13e91ea030191a8a73ca9c80000f008093191a8ab3ea90a078052c8048052bfa739a9c90000f0298d2691a9ab3ba9BBBBBBL4;FF602240f922008052fa160294612a40f9810000b4602e40f922008052f516029474d640a9950100b49", - "622009104000014b50600f1d6820091e0000054c1825ff8L4;FF08008092880200f9b70000b4e00318aae10317aa22008052f6160094bf0600f1eb3e0154e0031caae10315aaf20900141f0900f1811700542083c03c2183c13cL8;FFfd7bc4a80ffdff17600200d000601591fb160194600200d000c0159", - "1f8160194f7031faae00317aae10315aafe160194281040b96800c8376800d0370d170114BBL4;FF8a00805208a800a91f0000f9fd7b44a9ff430191c0035fd6097d1c53490d00342910c0390a00be5208010a0b2a1d00120901f83708710a8baa00805208a800a9L4;ZBL8;FF4a970094fd7b41a9f31340", - "f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa8101009021681b91e8030091e00309aac2018052BBBL4;FF680e00f9000400ad742200b9750200b9f44f44a9f51b40f9fd7b42a9ff430191c0035fd62000805201048052fed60194ff4301d1fd7b03a9f44f04a9fdc300", - "91L4;FB6b736e6578745f726f6f7473656e645f65706f6368706172616d7343743153616d706c656443743153656e744b65797353616d706c656473656e64696e675f68L8;FFfa2300f9e7fb16a902d70094e72340f9e31340f9f70314aafb031caae10316aacd00001429a041a9e003099136dc40a9f803", - "01aa3af05aa9022f8052e8e700f9BL8;FF911c0094080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308eb48310054e6010014e1d342f9e8cb42f9f407409194820991L8;FFe85306f91a4cff97e10300aa3e000014c80080d2e0a33239e08332910800f0f2ffa73239e", - "85306f9114cff97e80300aae85306f9e08332912101009021c03991BBBBL4;FF28430291e10315aa165c0229086000a9080400f0080138911f600039602201a9090d40f9e803009120013fd6e80340f91f0d00b100fdff54755a41a9e00740adL4;FBd5934800000000004d00000000000000e8020000050", - "00000d5934800000000004d000000000000005303000009000000d5934800000000004d00000000000000L8;FF0800f0f2ff270039e80300f918ecff97e80300aa4102009021fc17914302009063881591e0030091e2008052a4008052e80300f909000014e00300f941020090BL8;FF4977019468c20091", - "01030090217c2491040300f084c00d91a363009142018052a80f00f940770194682201910103009021a42491040300f084400e91a3630091L8;FFf8c1ff978083c23c8183c33ce85748f9f93348f9e06f833d8083c13ce173833d8183c03ce8eb06f9e06b833de167833d27000014e01bc43de83b48f9608", - "2803cBBBL4;FF608540fc0a2440f9290500910088202e09a901a90c00669e8cc101920cad00a9c0035fd6092849a9eb0309aa090100f929010a8b608540fc0a5440f929050091L4;ZDL8;FFe30314aa16b70094800100b507000014340100b4f3b60094e00314aae10315aaf1b60094a00000b5280080527", - "50600f904000014e00315aae8031faa600600f9BL8;FFe8fb42f9e0db823de082c53ce1df823de182c03ce0e7823de082c13ce2e3823de82300f9e1d3823de0d7823dfacb40f9fc2f00f9f55307a95a1200b4080d8052L8;FFf70314aa020000141901805268fa40f9fb6340f91f0500b140020054760241", - "f9690a42b9740e42b9681a42b9e8270529d60100b475fe40f9ea360094e00316aaBBBBBL4;FF006839910081c03c230400b063401f912404009084803991a003923ca28303d1a100805203070294e803049120040090006839910081c03c0181c13c0281c23cL4;FF01018052f8060094400100b4155000a", - "9810000f021000191130800f91f600039f44f42a9f50b40f9fd7bc3a8c0035fd6000180520104805206070094fd7bbea9L8;FF01f57ed342008052fa060194680e40f9a80000b4601240f901f57ed342008052f4060194681a40f9a80000b4601e40f901f57ed342008052ee060194682640f9BL8;FF2100", - "8052f8860194601600b4280300b0088d08910900f0d20001c03d01d1c03ca80380520000803d01d0803c0e000014ec8601942004805221008052ea860194L8;FFf6031faae00316aae10315aa06870094150100b4f3860094e00315aa2100805236008052f0860094600000b5f6ffff1720008052b58338a", - "9bf8319f8381e00b4BBBL4;FF897b40f9e03340f9746201a96b2200f960828c3c61828d3c800745ad699e00f9690605917a02053960828e3c61828f3ce00746ad76de14a9756601b96082883cL4;FB00224661696c656420746f2064657465726d696e652073656c665f73657373696f6e3a20c000124661", - "696c656420746f206465637279707420c01b206d657373L8;FFe0e3c03de8f243f8df0600b1e9c31391f40b00f9f4bb02f9fce315392091883ce8c702f940640054680343396013cc3cea031c91e0831d91e1e31c91f69f03f9BL8;FF290040f9280800f94cfeffb40a7c15533f0108eb536119322001005", - "42a0440f90bfc63d35369283808050091280800f94b0200b5e0030caa7a000014e10300a9L8;FF0a1440f9092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b250191BBBBL4;FFaa831778aa7140f8e90b00f9a", - "97d4039a8031878a87141f8ea1300f9aa0302d1ec2f00b9533100f8a88316f8a9031738ba0000b4e1031aaa22008052ede60194L4;FB353665333634356363642f303639353962342f7372632f76312f6368756e6b65642f73656e645f656b2e72730076656e646f722f6c69627369676e616c2f7275L8;F", - "Fff270b39f56301f919dcff97e80300aae86301f92102009021e018912302009063281991e0030b91420280522401805218000014e0230b39e0030b91ff270b39BL8;FF21601e91e40200f084a03091a363009102028052b30f00f94367019468620091e102009021201891e40200f084203191a36300910", - "2018052a80f00f93a670194L8;FF608a40f901f57ed342008052f9660094689240f9a80000b4609640f901f57ed342008052f3660094689e40f9a80000b460a240f901f57ed342008052ed660094BBBL4;FFf44f4da9f75b40f9f6574ca9fd7b4aa9ff830391c0035fd6e88343a98082c23ce92f45a9ea27", - "40f9e007803d1f0500b1e1f9ff54eeffff17a0835df8dcffff17L4;FF1f7c0071a80000548102109120c0208b21404e3901400d39611240f9600a40f921cc7492940210917f7e00a97f7e01a9820a40f97f1200f9020f00b4620600f9L8;FF29010b4aab010e4a0c02114a4d00034a2a380a0a6b010f4a8c", - "01124aad01054a29010b4a8b01004aa801084a29010b4a08010a4aaa0100d04ae13b912801084aBL8;FF4a1040b80b4d00794bb040b80a2102b84a0840b90ca100394cf040f80a9102b80a088052aa1500330081803c0b2d00b90c3903a90a01013909000014e9031faaL8;FFf40300aa03270094582f40f", - "9d80100b5c3ffff1737008052591740f9b7831ff859fcffb535008052572340f9b6831ef8b8431fb877fdffb534008052582f40f9BBBBBBBL4;FF08fd43d3d6ffff17220000d042601291e1a30091031380524676009414008092e00314aaf44f4aa9f65749a9f85f48a9fa6747a9fc6f46a9fd7b45a9ffc", - "30291L4;FF2800809229008052880200f969520039f44f45a9f65744a9fd7b43a9ff830191c0035fd6a00000f000802c91081b0094ff0304d1fd7b0aa9fc6f0ba9fa670ca9L8;FFfd7bc4a8c0035fd6f405f8b7140400b4f41a0194e00314aa2100805237008052f11a0194200500b4e10316aae20314aab", - "40200a9f71a0194b40a00f961820091BBL4;FF0b2140392f214039294100910dc11f382d00034aca010a4a0c150039eb010b4a0d0900390d00114a0d1900390a1d00390b21003908410091a1f7ff54ec0f40f9L4;ZFL8;FFe8230091e00309aac2018052459b009468c20091810100b021f41991a4010090", - "84a00b91e0230091a32300d162008052a8831ff83c9b0094b401009094e20491BBBL4;FF01c4805222008052fada0194e09340f9018c815222008052f6da0194ff0b4091ffc32191f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6L4;FB6c000000000000000000000000000000080", - "0000000000000080000000000000010584400000000004f7468657200000000000000000000000800000000000000L8;FFe86f04f9e80740f9e87304f9e83f40f9e87704f9e9235ea9e88304f9e87f40f9e97b04f9e88b04f9e84b40f9e88f04f9e88340f9e89b04f9e87740f903290091BL8;FF6082803c", - "09008092680e00f9e0430691690200f9bb100094a80600d11f0900b163010054ab000014e80180520900809268220039e0430691690200f9b1100094L8;FFe10313aae20316aae00f00f9015b0094e82b41f9e80700f9e83341f9f93f00b91f0500b1a00b0054f33b41f9e87b42b9e81700b9b3a800b4f43", - "741f9e95a0094BBBBL4;FF8a050091a82a01a90802098b03853eade117c03d02019f3c01813dadea2740f92800809229008052480100f969a20039f44f58a9f65757a9f85f56a9fa6755a9L4;FB6b64662d302e31332e302f7372632f6c69622e7273002c726563656976656420736572766572206365727", - "4696669636174652077697468207265766f6b656420L8;FFe18307ade02300b4e87b40f91f0500b160000054e0c3039151f8ff97e8bb40f91f0500b16000005420030291e8f5ff97f7d740f9ff0600b100280054fb0318aaBL8;FFce010fca23feff540b3001a90e3400a93f1100f1c2f6ff54eb031faaea", - "031faaec0340b29f0109ebe20000542c00088b6df17dd38c696b786b017fb28c21cd9aL8;FFe11740f930feff17e0630091e10317aae20315aa2300805224008052d490ff97f71740f9e80f40f9080117cbbf0208eb49c6ff54e0630091e10317aae20315aaBBBL4;FF5c040034fc35f8371f0500f1c9360", - "054480080d2a06301d1b30600d10800f0f2a8831af83da3ff97a88357f8970240797f0208eb20020054e80ac05a49031b8bL4;ZBL8;FFe01b00f903bb0094f6ba00940010805221008052f4ba0094c01e00b4a00642adf90300aa882e40f9896243a9000402ada00a43ad1f010ff1e91700f9e86b02f9BL8", - ";FF4a1540d24a0d0a8b4a25019129194a8b29050091280108ab02080054691e40f9090100b4290140b22911c0da291540d2290d098b2925019129fd46d329050091L8;FFf6e743b9f7e343b9fa6740f932020014081347b8e9e743b9ea0f42f9fadf09a9f4f741f9f7fb41f9e8cb03b9e883503909b305b8", - "788242f9e90742f9a8831838BBBBBL4;FF240080526afdff97790a40f9680240f9080119cbff0208eba9ceff54e00313aae10319aae20317aa23008052240080525ffdff97790a40f96dfeff17e00313aaL4;FFe203009131e6ff9728008092a80200f9f44f45a9f65744a9fd7b43a9ff830191c0035fd6f", - "f0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aaL8;FFa862009109000090295125916202009042400191e3830091e82702a9120b0194f44f48a9f65747a9f85f46a9fa6745a9fd7b44a9ff430291c0035fd6080040b9BL8;FFf85f4ba9fd7b49a9ff830391c0035fd6b4835df8c7ffff", - "17a0031df8210300b021e43191230300b0638c2f91a0c300d1020380524401805209000014a0031df8L8;FFff5301f9f3031faae84f01f9e8430a910081c03ce8030a910001803de80f40f9082e00b574010014ee8a00940003805201018052ec8a0094204800b4f80300aaBBBL4;FFf65755a9f85f54a9f", - "a6753a9fc6f52a9fd7b51a9ffc30591f6ca0114f44f56a9f65755a9f85f54a9fa6753a9fc6f52a9fd7b51a9ffc30591c0035fd6a0c300d1L4;FB25194900000000006a000000000000005b0000002600000025194900000000006a00000000000000fb0000002e00000025194900000000006a0000000000", - "0000L8;FFe87344f9e3ffc13da97202f8e2e3c13de23744f9e48715ade1e7c13deb3b44f9eda306a9e87744f9f63f44f9fc6b00f9fc030eaaf84344f9ea4b44f9fa5344f9BL8;FFfc4a019468aa40f9a80000b460ae40f901f57ed342008052f64a019468b640f9e80000b460ba40f901f57ed342008052f", - "30b40f9fd7bc2a8ee4a0114f30b40f9L8;FF3f0500b140220054f30300aae00308aa20020094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209ebBBBBL4;FF20030291080d0aaaa14302d122008052a0873dade08751ad290dc0da080dc0dae95", - "301f9e85701f9a0873bade28354ada2833eade18352ada1833cadf7ea0194L4;FBc1200080600000004f9d4800000000007500000000000000810000001c0000006120446973706c617920696d706c656d656e746174696f6e2072657475726e65L8;FFfd7bbca9f70b00f9f65702a9f44f03a9fd030091f", - "30301aa210840f9f40300aa680240f91f0101eb600e0054680640f92a040091e00314aa490180526a0a00f9BL8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab42010054fd7bc1a8c0035fd6e8031faa090840f969faffb5091440f9L8;FF8282c73c1f0500", - "b1e00600ade20a803d200c0054f91300f9f9430691fbe300912083cc3c2183cd3ce81f00f9e81b40f92283c33ce0e3009160838c3c2083ce3cBBBL4;FF58000014e00743ade92f40f9682600a9608600ad53000014e90f40f9280080923f210039280100f94e000014280080522900809268220039690200", - "f949000014L4;FFe81b40f9880000b4f31f40f9e00313aa7a030094e85b40a9f40341a91f0500f161000054f30314aa4000001408fc43d30900fe921f0109eb41000054200020d4L8;FF480313eba900005402f57ed3e0120091e10317aaf9aa00945a070091fb02007933008052f4060079ba031ff8b9ff", - "ff17a08300d176f3ff97d2ffff17a08300d1BL8;FFe80200b008b140f91f0500f149040054e12340f9a04303d102048052b44303d11aeaff97e8ffffb008310791e92740f9b42338a9c8fffff008912891a92339a9L8;FFe83300b92f2a0094e80356b9e00740918100805200001891ff0316b9e82f00b92", - "82a0094e80356b9e00740918100805200001891ff0316b9e82b00b9212a0094BBBBBBL4;FF2800028b08f1df38a812f837e0030091cc7b0094e80340b908010036e00740f9f44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd6e80b40f9aa0640f9L4;FFe0074091a10000b0210c359100401d91e", - "2018052e30316aa7c0a0094e1074091e20b40916062049121401d9142c00e9126eeff97e16b42f9810000b4e00316aaL8;FF0b0900390bfc4cd30a1100394a0040b909210039490840790b1500390c190039012500390aa100b8091d0079c0035fd6fd7bbfa9fd030091600200b000403491BBL4;FFe0031", - "3aa8f920194680640f909038052400fc03dc822099ba9035df80001803d090900f9c8060091a1835af8680a00f9810000b4a0035bf822008052ed920194L4;ZDL8;FFf65742a9fd7bc4a8c0035fd6fd7bbfa9fd030091083c40f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d3080", - "50091092440f93f0500b1BBBL4;FFf5feff17e80741b2e4feff17e80741b2cbfeff17e80f41b2e0feff17e80f41b2edfeff17e80f41b2c5feff17880080d20800f0f20811009150ffff17e0830091L4;FB2d7305b6c5093743000046f78321d6224f1374182d384361d948e28948c32841a4e766e6361ff6", - "641a288f6aff8b89baf50c5e73e7750ec6d61d804728c505b6L8;FFe92742f9e8ab1aa9e82b42f9ea3f42f9e9a309a9e82f42f9e93b42f9e8df00f9e83742f9e8af15a9e84342f9eb5342f9e8b700f9e84742f9e9a318a9e84b42f9BL8;FFf60300aae04316912200805201120094e1d342f9e00316aac6f", - "9ff17f60300aae043169122008052fa110094e1d342f9e00316aaccf9ff17e043169122008052L8;FFe84345b9b47e085372ffff17f46f41f9e8c31791e91f46b900c1c03c01c1c13cf5fb45b9880240f9f36b41f9e97305b9e057813de15b813d680000b4e00313aaBBBBL4;FFe90300f029b11491e1430", - "091e82704a9e80300d008591c91e82b06a96a06805228048052ff2701a9e90300d029150a91e92b03a9290080d24914c0f2e87f02a9L4;FB330000000000000008020000050000009a9648000000000033000000000000000c020000050000009a9648000000000033000000000000002202000005000000", - "L8;FFe10314aae20313aa00f1ff97000e00b5e1031faae10900b5a80640f91f011aeb69050054e00313aadcf1ff972009003728fc60d3080700b5200840921f1800f1BL8;FFab631738ab935738a9731738a9a357384a01084a6b01084aaa831738aab357382901084aab931738abc35738a9a31738a9d35", - "7384a01084a6b01084aaab31738L8;FFe1d342f9e8cb42f91f0101eb408b0054e8cf42f9490a8052f4074091948209910969213828040091f67749f9e8d302f9df0600b1a032005480220291152a0094BBBL4;FFbf2337a9a86303d1a26301d1012101911e9cff9700f4ffb4c0000014b98353f83f180071", - "20060054990a003728008052a14301d1a26301d1bf233ba9bf031cf8L4;ZBL8;FF76b30094a30100f063603691e0120091e10314aae20315aa14b30094a00100f000203491a20100f0424035912108805221b30094a00100f000803991f0b20094BL8;FF21c00a9102028052a302009063c0089104018052", - "8700001448008052e0a33239e8a73239c80080d20800f0f229000014f30300aaa00302d189e9ff97e00313aaL8;FFa2018052e30000b0636002910401805222000014c80080d2e0632a39e0432a910800f0f2ff672a39e84b05f91028ff97e80300aae0432a91e10000b021400591BBBBBL4;FF41835cf8e", - "00316aae20315aa0f0302948000003548835d38ff02086b60020054e1e7076f880700d1e90740f91c011cea81fdff54208d212e00a8302e0800261eL4;FFc9008052e81302f9e81b02f9880000b008c93691ff8b01f9ff9301f9ff9f01f9ff9b01f9ffa701f9ffb301f9ffbb01f9ffc701f9ffcf01f9ffdb", - "01f9ffe301f9L8;FF9f0600b1e002005473d640a9950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f922008052ef020194f8ffff17340100b4BL8;FF010300f0217029918200805237830114080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9f", - "d430091010300f021802991240300d084602191L8;FFd60000b4c806168be00314aa0201805201f17dd3f7820094753600f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6fd7bbfa9fd030091081840f9080100b4BBBL4;FFe80315aae00314aae303132a420100540d0000141f210039290080920901", - "00f9c0035fd6e80315aae00314aae303132aab000054c3000836096041b93f110071L4;FB657373000000000034684900000000006a00000000000000190000001c00000034684900000000006a00000000000000e30000002e0000003468490000000000L8;FFeccb43f9e97344f96b1147f8eaaf00b9e0", - "0bc23de31fc23de203c23de48715ade107c23de8ff43f9e9a301f9e9030caaf4bb43f9edbf43f9f9c343f9fec743f9BL8;FFfd7bbca9f85f01a9f65702a9f44f03a9fd03009148008052f50301aae10302aa000d002af30302aaa5fbff97b73240b9b70c0034e80240b20811c0da081540d2L8;FFe902805", - "21a00f0f2e98316a90000803d08f000f8e9bf00f9e81f40b9e8030639e10740f961cdffb4e01740f91a000014e90310916affff904ae1369100010090BBBBL4;FF61d60054f9ffff171ee30194f70300aa1f0400b141fdff54e04305918100805219e3019440d50035e85341b9e8bf00b957ffdfc8d70200", - "b4ff0600b100030054L4;FB0100000000000000349f430000000000000000000000000001000000000000000100000000000000689c43000000000000000000000000000000000000000000L8;FFe8c343f9f89b45f9f99f45f9e0f3803d21f18f3ce8f701f9f7eb01f9762500b4f7b340f9e8830591e043", - "1e9101c10091ff0600b1e203889a10f9ff97e8cb43f9BL8;FFc0035fd6fd7bbda9f50b00f9f44f02a9fd030091f40302aaf30301aaf50300aaf06201940005805201018052ee620194600100b48002c03d154c00a9e10200d0L8;FF290040f9280800f90c0200b500fc55d393000014e10300a9e00301aae", - "10309aa220080520a060094e10340a92aa040a9536928380cfc5cd308050091290040f9BBBL4;FFe82340f91f0101eb40080054e82740f9090380522a040091e003142a09692138e1030191ea2b00f95e8eff97e0e344a9e12340f93f0018eb2903005422008052L4;FF242b009143c30291020c40b90778", - "64f865787978e0804039a56c1c53a51000511f1040f2a37c4093c1020054e01040f91fcc74f26002005400cc7492064000d1L8;FF3aa30014080040f9e00301aa090140f93f0900b1a1000054810100f021fc15918200805231a30014ff8300d1fd7b01a9fd430091810100f0210c1691a40100d0BL8;FF2", - "9c11c91a20f00f9800200b000380691e82701a9a8630091820200b042001091e1430091e82702a900230194800200b000601091f5220194088441f8010d40f9BL4;FFfc220094f3ffff17680240f9c80000b40805088be00314aa0201805201ed7cd3f4220094745643a9350200b49682009104000014b50", - "600f1d6c2009180010054L3;ZBBBBBBBBBL4;FF2af17dd3490109cbe932899a1f0549eb290a00542a050091e0830091010880525f0108eb0295899a1c020094f95342a9e11b40f9f90900b4780240f9e15700a9L4;FFeb5f4139fbf343f82841082ae9f344f8f67344f8eba300395a8108aae91300f95801", - "00b50d000014e017c03d1aff48d3f703182ae00b803d20000014f7031f2aL8;FF83020090630013918402009084001d91a20700d161058052061d0194800200900080139183020090630013918402009084202491a20700d161058052fd1c0194BBL4;FF6f02001435008052e803082a09028052290108cb", - "7f0209ebe3000054eab344b96b02088b6b0500d1ea032a2a5f114beb634d00547f0209ebf4cf00a96a32899aL4;FF632a40f922008052f30b40f9f00303aafd7bc2a800021fd61b000094ebffff17f30b40f9fd7bc2a8c0035fd6c0035fd6fd7bbea9fd030091f30b00f940000094L8;FF090840f9290b00", - "b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091091440f94801088b090100b42a0140b24a11c0da4a1540d24a0d0a8bBBBL4;FF09270039082b0039e8a75929092f003908330039e8a7582909370039083b0039e8a75729093f003908430039e8a7562909470039084b0039e8a755", - "29094f0039L4;FB20696e7075746661696c656420746f207061727365206120555549447468652055554944206973206e696c000000000000000000000000000800000000000000L8;FFe9474ca9ec9f00f9ec0312aa520e0014092340393f190071a1cf0054e0031d91e10308aa023f8052fadc0094e043", - "0f91e1031d91032b0091e20319aaaf210094BL8;FFfc5c0194e8074091e00319aa0178805208812f915cd40094e8f34df91f0900f1203c0154e0074091e10740910232805200c0359121802f91f4432591f55c0194L8;FF2200805212000094610a40f9afffff17e00313aae10316aae20315aa0c0000947", - "60a40f9680240f9080116cbbf0208eb69f6ff54e00313aae10316aae20315aaBBBBL4;FFfd430091ffc312d1ff0300f909604039c91a0037155840a9f30300aaf90308aae8c30091e00316aacdfc0194610a40f9c9624039f40301aa288c41f8e92f00b9L4;ZFL8;FF3700805218038052a80640f91f0116", - "eb490a0054e00313aae0fbff9720fe073728fc60d3080a00b5200840921f1800f1420a0054217c0353610a00343f040071BL8;FF2911c0da291540d2290d098b292501910819498b08050091096040b93f050071e103005409a84c29290140b22911c0da291540d2290d098b2925019129fd46d3L8;FF096", - "92138e1630091757cff97f71740f9e80f40f9080117cbbf0208ebe8380054e81340f9e10316aae20315aa0001178bf87c0094e802158be81700f9955a40f9BBBL4;FFab000054e00318aae10317aa22008052f8bc01949f0600f12b010054e00315aae10314aa22008052f2bc0194040000143f0800b1c10", - "10054f90316aae00319aaL4;FB7900000005000000a28749000000000054000000000000007f00000005000000a28749000000000054000000000000008d00000014000000f787490000000000L8;FF29010691e82b09a90a0b8052e92b06a9290080d2480380528910c0f2a02700d1e1030191e87f05a9e", - "82708a9fdbc0094f5031f2a1c008092f60313aa2e000014BL8;FF6b0d0b8b6b25019129194b8b2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb29030054L8;FF81130054200740ade83342b9e89303b920070bade20c0014776a41", - "f900c3c73c01c3c83ce90f44b9f6eb43b9756641f9e80240f9200708ade93303b9680000b4BBBBBL4;FF68f8ff97e10314aa280c49f81f0500b180000054c0008052e20313aa65fdff97882e40f9680100b4090d8052812a40f9157d099be0008052e20313aa36a00191L4;FF29eaff97ff0b4091ffc3279", - "1f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0efc83de1f3c83de0074091e2f7c83d00401d91e0d7853dL8;FFea970039eaab0039e9b302b8eabf0039eb1b00f9e83b00b9340d0194fd7b45a9f33340f9ffc30191c0035fd6ff4301d1fd7b02a9f51b00f9f44f04a9fd830091BL", - "8;FF49f9ff54e0230091e1031faae20315aa2300805224008052f30308aa647fff97e80313aaf35341a9c3ffff17e0230091e10315aae20314aa2300805224008052L8;FFebffff17f80700f9f68c00944000805241008052f48c0094e07300f9c08300b4f08c00944000805241008052ee8c0094e06f00f", - "9008300b4ea8c009440008052BBBL4;FFfd030291f60301aa280442a9f30300aaf70303aaf40302aae00308aaa3c7ff97c80a40f9680e00b40bfc79d3e1e7076f9a624039ce3640a9ef031faa680d010eL4;FB2c4027503a603170588053904ea045b074c07fd062e069f0bb10b000ad30a62097509c4081", - "708a60e390e880f5b0fea0cfd0c4c0d9f0d2e076217d3160016b11L8;FF6083c53c9f0600b1e26b813de16f813de073813de363813d205e0054e9cb42f9e8c742f9f6cf42f9f9d342f9fcd742f9f7df42f9df8225f1f8e342f9e9a30da9BL8;FFe8830591ea0310912b0000906bf128911a0380d2c00200d", - "000d81e9108210091e1430691ea2f19a9e90702f91a00f0f21f4d0194e81f40b9e8030639e10740f9L8;FFc0035fd6000100f000c00d91fc4c0094000100f000c01591f94c0094000100d000203691f64c0094fd7bbfa9fd030091081840f9080100b4080140b20811c0daBBBBL4;FF6bdfff97f70f40f9b", - "2ffff17e0230091e10319aae20313aa230080522400805263dfff97f90f40f9f80740f9080319cb7f0208eb69efff54e0230091e10319aaL4;FB8c75420000000000496e76616c6964526567697374726174696f6e49644475706c6963617465644d65737361676500000000000000000000010000000000", - "0000L8;FF24008052da020094760a40f9b3ffff17fd7bbda9f50b00f9f44f02a9fd03009148008052f40301aae10302aa000d002af30302aa6aecff97e00314aa615c0094BL8;FF9a00f8b728040091490400d1110000145f2800f1880000542800028b08f1df38e80bf837a0e300d1c6d5ff97a8835cb8c", - "80d0037a8835df82a0340f9490108ebL8;FFe237803d000e0054e082c33ce182c43ce8a30391e282c53c00630291a0073bade082c63ca2033cade18345ade237c03da1033dada2039c3cfe95fe97e00640adBBBL4;FFe10340ada28f3bade40b42ada1833aad610200ada48b3cada2837bad620202ada183", - "7cad610201ad7f6200b9f44f5ca9fc575ba9fd7b5aa9ff430791c0035fd6L4;FF090480520900ac7248030836aa26407848031036ab264078480318371a000014760a40f9680240f9370c009135104078080116cb1f0115eb63050054d5000034L8;FFe9ab42a928008052e8531ea9fc031faaf6031faaff", - "231fa9ea0301f9e90f01f9e9ab41a9e80b01f9e81701f9ea1b01f9e92701f9e9ab40a9e82301f9e82f01f9BL8;FFa10600b4e04b41f922008052f92c0194ffa71139e89740f91f0500b14106005433000014a082c03ca182c13ce80200d0a282c23c400707ad4243803d08b140f9L8;FFf53f00f9fa074bf", - "9481140b8fb0b4bf9f90f4bf9fc134bf94a014139f8174bf9e85b07b9e8631d91f51b4bf9093100b8e91f4bf9e80240f9f4e342f9ea431d39BBBBBBL4;FF240080526a070094e80640f99f0208eb9532889ad5f8ffb5608640a9e823009103150294e80740f91f0500f101020054c80080d20800f0f20811", - "0091e81300f9L4;FFa30000d063e03891e0431391e1031aaae2031caa190140b9c40180527b0c0094fb6f42f9e17342f9e807409108411d91e0031baa6f150094f7ab4bf9f96701b9L8;FF03020054cf0940391fc20371ef150012f119112a0f12001223020054d00d403910160012101a112af0090e33cf", - "11009111c200513f2a007102fcff54d4ffff17BBL4;FF626c0094fa0740f9f60301aaf80300aa5b0315cb3f001beb48170054561100b48002158be10318aae20316aaf9940194b502168be00318aae10316aa22008052L4;ZBL8;FFfc940094f8ffff17d60000b4c806168be00314aa0201805201f17dd3f", - "5940094752a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6fd7bbea9f30b00f9BBBL4;FFe81b40f98a0740f9490108eb834100548a0340f9e01740f94801088b882700a908fc60d3481600b5080840921f1900f142170054017c0353a11a00343f040071L4;FB4900000000000000950100001b00", - "0000e82049000000000049000000000000006901000027000000617373657274696f6e206661696c65643a2065706f63685fL8;FFfadb4aa9e10315aae72f44a9ee031caae0bf46a9f40304aafe1b43a9f1030aaae81b01f9f57b40f9e80303aafc4340f9e56f40f9e30310aae45f40f9e08710adBL8;FFe", - "8cf42f92a04009180c202914901805209692138ead302f9041d0094e1431691a70d0094e0a349f9800100b4e1d342f9e8cb42f91f0101eb406b0054e8cf42f9L8;FF22008052fb540094e8c317910081009186eeff97c80080d20800f0f21c450091a7000014e85746f9e95b46f92001009000c01e91e103", - "2d91e85b04f9e8c32291BBBBL4;FFc0035fd61f09007181010054ea0f40f9090180d20900f0f248dd7892290140b20a000014ea474039090180d2e8031faa0900f0f205000014090180d2e8031faaL4;FB7420726563656976657220636861696e207769746820696e76616c69642072617463686574206b", - "657957686973706572526174636865746661696c656420746fL8;FFd6ffff17890240f93f0500b1c10000549f5e00a99f7e01a9977e02a9981a00f99f3200f91f0900f1a10f0054e00313aadaf3ff9740010036410d00b5e0031faaBL8;FF09008092e80b06a9e8830191e93b00f9ffa300b9ffab00b9e94", - "700f9a8031cf8400d00541a210091f7c30191fb8301913800805209000014a20301d1830c8052L8;FF19692138e9d302f965280094e1431691ba110094080340f91f0500b1a0000054e243169120008052e10318aa04160094e10318aa288c43f81f0500b1e0fcff54BBBL4;FFc082c03c600601ade28344", - "ad620200adf44f5aa9fcb340f9f65759a9f85f58a9fa6757a9fd7b55a9ffc30691c0035fd6800300d0000c1f91830300b063401e91L4;ZDL8;FF190c40f9892489d24992a4f22ae379d32949d2f28924e0f2571119cb3f0309eba9000054f8031faae00318aae10317aafdb40094f40308aa09a043a90370", - "40a9BL8;FF000500ad0209803de9f702f978eaff979c6300917b0700919f0314eb41efff5400030014e8cb45f9090d8052e037c33d6822099b000d803de03bc33d0011803dL8;FF80f8ffb444010014e82f45f91f0500b1a1000054ff2f05f9f83305f9ff3705f9ff730ab91f0800f101340054a02302d1c", - "df4ff97200a0036c1f6ffb4cd010014BBBBBL4;FF69adcb9329bdc8ca08010a8b2981c8ca200108cafd7b45a9f33340f9ffc30191c0035fd6ff8301d1fd7b05a9fd430191a8ae8cd2294c8ed2aaed8dd2680eaef2L4;FFf73b00f9f65708a9f44f09a9fd830191f50300aae8030091e00302aaf30304aaf7", - "0303aaf60302aaf403012a3b89fe97e8630091c04200913889fe97730100b4L8;FF81ffffb4c00240f922008052f9040194f8ffff17680240f9c80000b40805088be00314aa0201805201f17dd3f1040194745642a9950100b49622009104000014BL8;FFfd7b43a9ff03019160001fd608200091200440a", - "9e92300910a0000d04aa11991e8a700a9020300f042a43a91ea0f00f9e34300910c850194fd7b43a9ff030191L8;FF0d696d78bf01186b29818c9a5f0500f108ffff540a09098b4b0140797f01186b610000545b050079c1ffff17aa0240f93a25899a9f030aeb8003005416091a8bBBBL4;FF15008092e8", - "0b02f9e8e30f91e0ff01f9e10302f9f51302f9ff0702f9ff0f02f9a8831df8a11700b4960080d2e20301aa1b210091f72310911600f0f2fce30f91L4;FB65206b6579736465637279707473657373696f6e207761732076616c69643b206d75737420686176652072656d6f7465206964656e74697479206", - "b6579000000L8;FFe81342f9f69f03f9f6831d912013843ce8ab03f9e9af03f974190094e8b343f91f0500b1e86f00f980390054e8b743f9e9bf43f9f80314aa2013c93cf4bb43f9BL8;FF480080520900f0f2a0c300d1a8931d38a9031df8163a0094e10300aa74000014c80080d2e0430039e023009108", - "00f0f2ff470039e80700f90d3a0094e80300aaL8;FF1f0100f1e8179f1a0101090a24000014e1031f2a22000014882245b8e92f4379eb4746398c9246f8edc74639eaa34639e8d303b9e9ab0779e8a759a9ecb300f9BBBBL4;FF00030054f843059199008052e00318aae10319aae2031f2ae0023fd61f00", - "00f1cd000054390300eb431501541803008bf9feffb50f0000141f0400b1a1140154L4;FB737071723a3a76313a3a6368756e6b65643a3a73746174657373686f756c642062652061626c6520746f2073656e6420435453495a4500007fe6480000000000L8;FF22008052fbe40094f41b40f99f0600b1e1", - "0100541c000014f803172a5700805205000014940000b4e10314aa22008052f0e40094f41b40f9e81f805277e20029BL8;FF69a200a9280080526cffff17a0e300d1a8ab3ca94f41009420008052e10314aa0c650194fd7bbea9f44f01a9fd030091f303012af40300aaea64019400028052L8;FF801240f", - "922008052fa640094e9ffff17f44f41a9fd7bc2a8c0035fd6ff8300d1fd7b01a9fd430091e10b00a94201009042403591e70305aae60304aae50303aaBBBL4;FFfca401949f0600f16b020054e00315aae10314aa22008052f6a401940e0000140040c23c0140c33c290040f90240c43c085440b9600601a", - "d3f0500b10040c03cL4;FF02008052e80500948102109100ff4cd3201400f936cc01f925000014152440f9000700d1bf0200eae0179f1a1f000014e10318aae00315aa6200805208060094L8;FFa32300d182018052e40314aaa8831ff845a5009445a50094f44f43a9fd7b42a9ff030191c0035fd608004", - "039090900d11f09007128819f9a280100b41f0500f1BL8;FF19250194fd7b44a9ff430191c0035fd63f8000f1e10200540c5040780a1040b80b0040390d7c40390e7041f81f0100396b111d120c0d00790c0840b90a2100b8L8;FFe0071cadf1000094e00745ada88301d1e0830d91e1030e91e0071cad1f", - "250094e08752ada80302d1a08301d1e1030e91e0071cad1a250094e08753ada203d83cBBBBBBBL4;FF017d099b02018052f44f42a9f65741a9fd7bc3a8f7180214f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd03009113d440a9f40300aaL4;FFe91346b8378108aa611200b4e", - "00318aa8f000014bb0000b4e00319aae1031baa22008052f3180094a1035ef8810000b4e00318aa22008052ee180094e0030191L8;FFf91300f9f85f03a9f65704a9f44f05a9fd430091160840f9760200b4335040a9380200f018431091170440f9b9730091750200f0b5e21891e8164038e3030091BBL4", - ";FFf44f5ba9fc575aa9fd7b59a9ff030791c0035fd6fd7bbaa9fc0b00f9fa6702a9f85f03a9f65704a9f44f05a9fd030091ffc30ad1f30308aa610300b40800018bL4;ZFL8;FFa9b315384901084aaae35538a9c315386901084aabf35538a9d315384901084aaa035638a9e315386901084aab135638a9f", - "315384901084aaa235638a9031638BBBL4;FFe8a706a9c803009008892091e8ab08a96a06805248048052ffa703a9c903009029c92191e9ab05a9290080d2c92cc0f2e8ff04a9e8a707a9fad80194e10340f9L4;FB2043743253616d706c6564001b737071722076312e73656e645f63742e726563762065", - "706f636820c01f3a2043743141636b6e6f776c6564676564202d3e2043L8;FFfbbb4ca9e03340f90001c03d08008092f9030faaf60312aaed5b00f9ed030aaaf26f40f9ca008052ea230ea9e14740f9f79f00f9f70311aaf10306aae8031aaaBL8;FFe0fcff54e243169140008052fd150094e3ffff17e04", - "3169122008052fd170094e1d342f9e5ffff17f85f49f9580300b4e1d342f9e8cb42f9f95b49f91f0101ebL8;FFa22302d14ef4ff97e0faffb449010014e8eb45f91f0500b1801c005401430291a22302d1acf6ff97e0f9ffb453010014e83746f91f0500b1a1000054ff3706f9BBBBL4;FF000400d000e01", - "89111f90194ff8302d1fd7b06a9f85f07a9f65708a9f44f09a9fd83019109904039f30300aaf40308aaa90100343f0d0071c1070054602241a9L4;FB6e697a6564206d6573736167652076657273696f6e203cc0013e0010626164206b6579206c656e677468203cc0153e20666f72206b65792077697468", - "20747970L8;FFf57b00f95cedff97e17b40f9cafcff17ff8301d1fd7b03a9f65704a9f44f05a9fdc30091081c00121f090071a1010054e00302aaf30302aaf40301aad7f7ff97BL8;FF010300b021182e91030300b063642e91a00301d162028052e4008052566d0094b8035cf8b7a376a9bce773a9a1037", - "5a9e83700f9ba2378a9b80300b4f50308aaL8;FFe0031caae2a3c43de8c34ef921058052e0ff833de05fc73d22008052e103843de207843de0f3863de8eb0df9f1780094e00314aa0104805222008052ed780094BBBL4;FF490080d2080080920900f0f2682600a9e85740f9c80100b41f0500b180070054", - "1f2500b1a207005409f17dd3ea5340f902018052293d009129f17d920801098bL4;ZBL8;FFe90109aa220800546b1d0091eefeff373e0000141f150071210500546c0400f1c00b00549f2900f14d018052eb031faae9031faaea031faa8c318d9a4d040091BL8;FF0a0840f90afcffb5ea030aab23feff54", - "a00200d000600991f9380194a00200d000801991f6380194a00200d000602e91f338019408004039a90200d029e10191L8;FF010100ade8830f913e9ffe97f5f341f9f4f741f9f7fb41f9f8ff41f9f60342f9fa0742f9bf0600b1fb0b42f9e0190054e8830f91e0432a910224805201e10091BBBBBL4;FF8", - "90640f92a0108eb431d0054890240f9e00316aae30317aae403152a2801088be90b40f9882a00a9680040f9080540f9150109ebe2020054e80f41b2e80700f9L4;FFe80741b2600a803d682600a9602601a9f44f45a9f52340f9fd7b43a9ff830191c0035fd620008052c1018052fe080094ffc301d1fd7b", - "03a9f85f04a9f65705a9L8;FF0820601e00119f9ac0035fd6ffc300d1fd7b02a9fd830091490200f029c13e910a0000904ae12491400200f000803f91e92b00a96902009029e10691e1030091BL8;FF7a0202a978fe00396a260d2968c20139e1e7ffb4e02740f9d3ffff17a0e300d1a8ab3ca94b6500942", - "0008052e10314aa08890194fd7bbca9f85f01a9f65702a9L8;FF08050011088b01b9ff431191f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6ff1b00f9e01b40f9e10318aafc880094e0031faafa880094BBBL4;FFfd7bc3a8c0035fd629008052097c00a9f44f42a9f65741a9fd7b", - "c3a8c0035fd61fcc00a91f0000f9f44f42a9f65741a9fd7bc3a8c0035fd6d3d200a929008052L4;FB08000000000000008c0146000000000025194900000000006a00000000000000ec0000002e00000025194900000000006a00000000000000890000002e000000L8;FF9f0700b1f70318aa6002005494", - "0100b4f522009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f922008052efc80094f8ffff17dc0000b4BL8;FFe50303aae1030091e3230091e40302aa5b490194420700b4fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd0300914804028b49008052f30303aa340d002aL8;F", - "F1e000014f4031faae00313aa080c48f81f0500b1c1fdff54f40314abe2020054688e4bf81f0500b140020054e00313aa52010094080040b20811c0da081540d2BBBBL4;FFfa0301aaf70300aaf60308aabb0302d169001c6be37f00b9e51b08a9fc9700b942090054f8d640a9e2031aaae00318aae10315", - "aad50200941f0400f181020054L4;FB000000000000000008000000000000000800000000000000304b420000000000000000000000000008000000000000000800000000000000304b420000000000L8;FF817e0353c12e00343f0c0071a00400543f080071400200543f040071a1080054e8b340f91f05", - "00b1c1000054e8170291ff7316a9ffbb00f9ff7b01b91ff10ff8BL8;FFf30300aa15c48052026901942800809293d600a9880200f9f44f42a9f50b40f9fd7bc3a8c0035fd6e90f41b2090100f9f44f42a9f50b40f9fd7bc3a8c0035fd6L8;FFe0031aaa210080523b008052f668009440f8ffb4fb0340f9e", - "2031aaafc0300aae1031baafb68009418000014e8ef41f9080f00b4e9f341f9e80302f9e8830591BBBL4;FFb4035bf8880216cbbf0208eb49dcff54a04301d1e10316aae20315aa2300805224008052629bff97b6035cf8b4035bf8d9feff17a04301d1e10314aa22008052L4;FF330000d0340000d03ef8", - "ff9773b640f994ba40f97f0214eb82000054608640f800003fd6fcffff17f35341a9fd7bc2a8c0035fd6fd7bbda9fd030091f55b02a9L8;FFe92300f909088052b8328a9ae10f01ad08050091a00b3cade213c03de80f00f9a30b3bade28347ada0073aade08746adb4f35438220114cba10b39ad330302e", - "bBL8;FF29dbda93a14302d1080d0aaae00314aa22008052a0873dade00759ad290dc0da080dc0dae9cb01f9e8cf01f9a0873bade2035cada2833eade1035aada1833cadL8;FFf8031faae8031faa0900f0f23a017fb2091f4092f70302911b0109aaa1035df8a10000b4b9835df8e00319aa22008052f028", - "0094f99f44f9fca344f9f8a744f9BBBBBBL4;FF9c000014e00313aa7f110194e80300aae00301aaa8fc073656000014611f0054e0031faadcfeff17811f0054972240f9881a40f9ff0208ebc0020054881e40f9L4;FFd2ecff97e8030e91e1431391e003162a496afe97e007409161220391e3030e910040", - "1d91e203162a92050094e8ab4bf91f0900b1416c0054e007409161620491L8;FF00203691e82300916c110194e80740f91f0500f1c0000054e00b40f9e11b40b9fd7b43a9ff030191c0035fd6e80b40f9e91b40b9600200b000603691630200b0BBL4;FF04910194a88300d1e0030091e18331912e910194", - "f39001940004805221008052f1900194800300b4a0077fad08048052602200a9000400adff074091ff830a91L4;ZDL8;FF19910094fd7b44a9ff430191c0035fd6880100d008b92d91e00301aae10308aaa2028052fd7b44a9ff4301912f910014880100d008d12f91e00301aae10308aaBBBL4;FFf8d001", - "94e00319aa2100805236008052f5d00194c0fdffb4e1031aaae20319aae02b00f9fbd00194e93f40f9f92f00f928014039e80900362011c03c2111c13cL4;FBeae448b290f7752b1fbaf412c6b8732cac9be552e6e3a28c20d59c090000c890211f92fe5c1b8cafcb9aaf2a8825e1e1ddbeaf10e5240eb2d", - "30c7c1c68cf8a14L8;FFfa430f9103d1009448e30591ff0200f1e9b742f9000540ade8079f1ae80208cbe96306f91f0500f1e02b833de12f833d8c040054a81000b5e027c33de0030991BL8;FFe00640ade80b41b9010340f908830bb80083893c01838a3c810000b4000740f922008052f3500194a0077d", - "ad7b0200f9e8a743a96082803ca003dc3c6182813cL8;FF81ffffb4000340f922008052f9500094f8ffff17e88b40f9c80000b40805088be00314aa0201805201f17dd3f1500094400745ad160080924233c03de85345f9BBBBL4;FF600706ad600749ad623b803d6247c03d030c8052632f803d9a030191", - "608703ad61034aad621b803da87f34a9618304ad513a009400e4006f608307ad608308adL4;FB5f6b657973000000ea984800000000002e000000000000006b0100003100000063616e20616c7761797320617070656e6420746f206120566563000000000000L8;FF21f41a91230200f0639c1591e00300", - "91020280528400805257e5ff97e10340f9c6ffff17e80f41b2c0ffff17c80080d20800f0f208090091bcffff17ff0302d1BL8;FFa2000054fd7bc1a8c0035fd6e00308aba3ffff54000300d000201c91f8700194ea031faac9efffb584ffff17e00200f000603891f2700194e00200f000c01c91L8;FF400", - "100f000203691fd700094e8031faa000119ab42730054e1431691b70d0094f90b40f9df0a00b100040054e1d342f9e8cb42f91f0101ebe0530054e8cf42f9BBBL4;FF48134ab8a9435bb84aa34ab8ab035d38a80311b8a8e35b78493300b8a9835cf8a8c31178e98f00f9a9035cf8a8c31078e82b40f9e93", - "f00f9a9835b38aa8311b8L4;ZBL8;FFea031caa2b154038080500f14c1540388b010b4a6001002a61ffff5426090094a1835bf8fa03002a810000b4e0031caa22008052efb000945f1f007240080054BL8;FFe0010054fb4340f9f4833291081100b4e883329140630291a758ff97e85346f91f0500b1600", - "80054e02bc33de85b46f9e07f823de80305f94c000014fb4340f9L8;FFe94f05f9e9000090298d2691ea9f04f9eac32491e86305f9e800009008b52991e95b05f9290080d2e87305f9c80480524942c0f2ea7705f90a078052ff4b05f9BBBBBL4;FF165e7ea915e23da919e23ea93f0400b11b821fb8c005", - "0054610000b422008052f4000294560500b4e00317aae10316aa22008052ef0002942500001437008052L4;FFf3ffff17eb031f2af6030daae1030eaaef0310aa7afdff17e87a40f9c80000b40805088be00315aa0201805201ed7cd3f00000945a008052d6000037e00f40f9L8;FF6b00f8374b0080524c", - "0000143f104071c30b00544b09c0396c1d00122c380c0b811140516b00f8376b008052430000143f004871030b00544b0dc0396c1d0012BL8;FFb30f00f94881019468820091010300f021742a91240300d084602791a363009122018052a80f00f93f8101943f810194fd7b41a9f31340f9ffc30091c003", - "5fd6L8;FFe16300917680ff97803240f9800100b4e11740f9e80f40f91f0101eb608b0054e81340f9090280522a040091ea1700f909692138e16300916980ff97882240f9BBBL4;FF4a050091090100f9490380520a2502a9f44f45a9f71b40f9f65744a9fd7b42a9ff830191c0035fd6890300f02901109", - "18a02805207000014a9030090291d3691L4;FB5879490000000000340000000000000017010000110000006c69627369676e616c5f70726f746f636f6c3a3a747269706c655f72617463686574696e76616c69L8;FFe007c13de10bc13de20fc13d882640f9893240f9a0073ead8082c33c8116c03da2039", - "e3ca003963c8183813ca80317f8a98318f8b70000b4e00318aae10317aaBL8;FFe20315aa03000094760a40f9adffff17ff0301d1fd7b02a9f44f03a9fd830091480001aba2020054010840a9f30300aae023009129f87fd31f0109eb0881899aL8;FFfd830291081c00121f090071e1010054e00302aaf4", - "0302aaf30301aad2000094e80300aae00301aa08020037980240f9080740f91f0100eb42020054e80f41b2BBBBL4;FF99008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb839500541803008bf9feffb50f0000141f0400b1e194005411e101941f100031L4;FB7372632f7374", - "72696e672e727300c0012ec0006c69627369676e616c5f636f72653a3a6375727665504e493a0000000000000000000000000000000000000000L8;FFfce00014e80301aa190340f90aa5c0a90b7142a90e3156a9143555a9ea4700f903015ba9e96b00f90a2541a9eed300f91b695ca9e9e700f9091940f", - "9ed330ca9BL8;FFf9600194400100b4155000a9e10200f021e00691132000b91f900039f44f42a9f50b40f9fd7bc3a8c0035fd6000180520105805207610194fd7bbda9f65701a9L8;FF0900f0f2e8470039e90700f9ddffff17e00700f9210100f021203891230100f063343891e0230091a20080524402", - "805286000014c90080d2a8831d3848008052BBBL4;FF1f01096b69070054c80300f008b140f9480400b4280100b008712e91490300b029c10d91f92302a9480300f008c11891ea830091a02700d1e82703a9e8730091L4;FF3f1c00f169020054fd7bbea9e30301aae10302aafd030091f30b00f9f30300a", - "ae00303aa0d000094e10300aac00000b400008052610200f9f30b40f9fd7bc2a8L8;FFa363009162018052a80f00f946a1009468620091810100f021781991a40100d084c01791a363009182018052a80f00f93da100943da10094fd7b41a9f31340f9BL8;FFfd7bbea9f44f01a9fd030091210300b4080c", - "40f9c8010036291448ab620300542afd7bd38a0000b528e97bb3080c00f907000014f40301aa21008052f30300aaBL4;FFf7031faa08011fcb9f0208ebe8040054340100b4680640f9e10315aae20314aa0001178bfb200094e802148bb502148b680a00f9081340f9e00316aae10315aaL3;ZB" + "BBBBBBBBBL8;FB7320696e76616c696420726567697374726174696f6e20494420c0001f756e6b6e6f776e207365727665722063657274696669636174652049443a20c0001b73L8;FFfa6708a9f85f09a9f6570aa9f44f0ba9fd830191081c40f91f0500b1e0100054290c40f917050091f30301aa3f011", + "7ebc10e005400e4006f168442a9748e40a9BL8;FF610e40f9810000b4601240f922008052c9240194611a40f9810000b4601e40f922008052c4240194612640f9810000b4602a40f922008052bf240194613240f9L8;FF3f104071c30b00544b09c0396c1d00122c380c0b811140516b00f8376b00805243", + "0000143f004871030b00544b0dc0396c1d00122c540c0b810148516b00f837BBL8;FF21008052cb640194600400b4000740adfc0300aa381f0012000400ade00315aa9f600094080480528002c03d09008092687203a9687e04a908018052687e05a9L8;FFa3fdfff063ec2691a0c300d142018052440180", + "5211000014c80080d2a0831d38a0c300d10800f0f2bf931d38a8031df8fa6aff97e80300aaa1fdfff021c42691BL8;FFe00340f960ffff17c80080d20800f0f20809009152ffff17e00300f9a1feff9021481391a3feff9063f00f91e0030091c201805284018052f1ffff17c90080d2L8;ZDBBBL8;FB2d7", + "f400000000000d081400000000000e281400000000000b81f400000000000f581400000000000070000000000000006000000000000000000000000000000L8;FFe81700f9803640f9800100b4e11740f9e80f40f91f0101eb40850054e81340f9090580522a040091ea1700f909692138e16300910d92ff", + "97887240b91f050071BL8;FFf50313aac2fe47d3420100b4e87b41f9e97f41f940030291e10315aa080102ab2935899ae87b01f9e97f01f902010194c8de7992c21a4092e0c30891a102088bL8;FFcc040094400100b528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd6200", + "08052800600f909028052936a29f89f0200f9f44f41a9BBL8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab02080054699640f93f0500b1c00300546a4241b9699e40f92a0600344a0140b24a11c0daL8;FF090340f9d60217cbdf0208eb3501178bd732889a152300a9f7fbffb", + "5f62b40f9f51f40f99600003778fdff901863089113000014d7fe45d3e80214ab820c0054L16;FFe8f300f900630054ef0715a9a80100f0e29309a9e4030caaf02f00f9eec300f9f2b300f9e9df00f9e98b44f9ea9700f9ea8f44f9e0cf00f9081140f9ea4b00f9BBBBL8;FB1400ee00fd00b50025012d00", + "16010000000000000000000008000000000000000800000000000000c42543000000000084254300000000008515400000000000L8;FFe083843ce183853ce00742ade83700f97f0200f96082863ca00b7ead6182873ce11bc03d6282853ce00b01ad6182883c6082843cff430791f44f44a9fc0b40f9BL8", + ";FF29194b8b2905009129010aab620500542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb89040054280108ab83000054L8;FFe0bf00b9a04700d166c2ff97e0bb00b9a04700d163c2ff97e0b700b9a04700d160c2ff97e0b300b9a04700d15dc2ff97e0af00b9", + "a04700d15ac2ff97e0ab00b9BBL8;FF2251019420008052e1031baa0651019420008052e10313aa03510194a0a33ca960ffffd000001f9163ffffd063a0119164ffffd084c02491a2e300d1a1038052L8;FF84a02991e0031baa1f010071e103152ae204a072e813899ae3031f2ae84f04f9616a0094e8fb", + "40b9e97b40f93f00086be8279f1a1f0009ebe9a79f1a0901891aL16;FF6edcff975ad107369f0600f1abd0ff54e00740f9e10314aa22008052c6d4009480feff17e0d7c23de8b345f909008092e0430f91690200f96082803c680e00f9BBBL8;FF610a40f970feff17e00313aae10317aae20315aa230080", + "522400805236000094770a40f9680240f9080117cbbf0208eb49ceff54e00313aae10317aae20315aaL8;FF1f0700b1e080ff54802202916c010014e8031faa00011aab42690054e1431691610d0094df0600b18000005480220291e1431691561200943f0700b1f90b40f9BL8;FF40010054810000b4602", + "a40f922008052c9f40094613240f9810000b4603640f922008052c4f40094610240f9810000b4600640f922008052bff40094610e40f9L8;FF200d005463cc749266fc44d3c60400d1dfc024eb220c0054000080d21f000039007d20d482c05fb85f1000f188000054000080d21f000039007d20d486b05f", + "38BBL8;FF490180522a040091e0031aaa09692138e1431691ead302f92b120094fcd342f9e8cb42f908011ccb5f0308ebe8d40054e8cf42f9e10316aae2031aaa00011c8bL8;FF0800f0f2e9b34e39e04301f91c490091280280520000803dfc3b01f9e83f01f9e84701f9e9430a39f7ef41f9f6eb41f917", + "0800b4f50316aae00315aadaeeff97L16;FFd4b4009488620691806ec03d89e240f90101c03d88d640f98a2207918083873c4001c03df8431091a8031df888ee40f900430191a9831ef8f73f41f981220091BBBBBL8;FB646f75626c655f72617463686574736b697070696e6720636f7272757074207265", + "63656976657220636861696e207769746820696e76616c6964207261746368L8;FFfd7bc6a8c0035fd600feffd0000035912199009440008052e10317aa02990094ff8302d1fd7b04a9fb2b00f9fa6706a9f85f07a9f65708a9f44f09a9fd030191BL8;FFd41c0194e802158b680a00f9951640f9550300b", + "4610a40f9680240f9961240f91f0101eba00a0054680640f9490480522a040091e00315aa6a0a00f909692138L8;FF3cfdffd09cab3991090140f9086140f897ff48d3f80300aaf50741b2d6018052090000f9086000f8a1035ef8810000b4a0835ef822008052bf1c0094bb0000b4BBL8;FFf60315aa000", + "500adba0e00b48082c63c8182c73caa8302d1890246f8888248f85f8300f14081823c4181833c800642ad696b00f909048052488104f85733899aL8;FFff630cb91f0800f1a12b0054a02302d1d4f4ff9700080036c1efffb4e5010014c01b00b5a02302d1cef4ff97c010003601efffb4e1000014c02300", + "b5a02302d1L16;FF952240f9550300b4610a40f9680240f9941e40f91f0101ebc00b0054680640f9490580522a040091e00315aa6a0a00f909692138e10313aa0ceaff97760a40f9BBBL8;FF4a01008be0031faa0a2500a9f44f45a9f65744a9fd7b43a9ff830191c0035fd6e82b00a9e00300910e7b0094", + "e00313aa188b0094e80300aa28f70736e00301aaL8;FF02738052d37c0094e083c53d89630f91e187c53de8436c79f5174bf9fb1b4bf9e01b843d2001c03de11f843de8032179280100b0e0fb833d081140f91f0900f1BL8;FFf85f41a9fd7bc4a8c0035fd6f8031faae00318aae10313aa03f90094fd7bb", + "ca9f70b00f9f65702a9f44f03a9fd03009109800091f40302aaf60301aa29fddfc8L8;FFe9000036f4031faa0700001428008052ff0f00f9ffa300a91000001414f97fd33402f8b7340100b4e00314aaf50301aaf60302aa6b060094600100b4e20316aaBBL8;FF4a01084ae0c30291a9031538a93355386", + "b01084aaa131538aa435538a1c302d1ab2315382901084aab535538a93315384901084aaa635538a94315386901084aL8;FFeb6345f9490300b9693e0f91f55b40f9483300b88a2d02a9e8f341f9eaa34f39800500ad280100f96a5e0f39bc0000b4e00316aae1031caa22008052be3c0094L16;FF220080", + "52ccbc0094fc7340f9fa031f2af9031c915c0b00b4f86f40f9f50314aaf66300f916008092f7031caae00318aae10317aa22008052bfbc0094df0600b1BBBBL8;FB9652e9a3310a8c62d40ae63074a2d6f9b981c268260bca012460c8bdd2d13e880188114a37cd30e4feb38cbc834db69dd4bb12bdafed4", + "fb2a28ccacbdcc9263cL8;FF2c100553e4cb40b93f0400312d140653e5c340b90801150a097c890ae79b56294a7c8a0a6b7c8b0a2e180753efc3971a8c7c8c0aad7c8d0a08010f4a301c0853BL8;FFf9d740f9f58b42b9f78f42b9fa1b00f9b958ffb513fbff17e8c31291fa8302910081c03ce86742f9a0", + "03983ca80319f8480200b0081140f91f0d00f143070054L8;FFf44f47a9fd7b46a9ff030291c0035fd6ffc301d1fd7b02a9f91b00f9f85f04a9f65705a9f44f06a9fd830091f60302aaa200f8b6f9031faae00319aae10316aaBBL8;FF28490194a1835df8810000b4a0035ef822008052c84c0194760a40", + "f9680240f9df0208eb61000054e00313aa07480194680640f909038052400fc03dc822099bL8;FF091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054092040f9090100b42a0140b24a11c0da4a1540d2L16;FFc80100b0e00309aa081140f9e9c", + "f40f9edeb40f91f0900f149060054880100d008411f91e97740f9e8ef01f968feffd008e11e91e9eb01f929038052e1430f91BBBL8;FFedffff17ff0302d1fd7b02a9fc6f03a9fa6704a9f85f05a9f65706a9f44f07a9fd83009114b840b9f30300aaf80301aac46c01940004805221008052bd6c0194L8;", + "FFe006803d786d0094810700d15f0700b1e12700f9800b0054e00641ade0430691facb00f90083823ce20242ad0183833c0083853ce10240ad0283843c0183803cBL8;FFf70b00f9f73300f93f070094e08742adf50300aae21fc03de84340f9e08709ade08740ade257803de85316a9e08707ade28341ad", + "e28308ad802300b4e0c30391L8;FFf70300aa580080d2161440f9e10b05a9001c40f9d60200cbe05b04a9d602028b1b000014e18a45a9e00315aae11600f9e11e00f92100028be11200f9f35341a9BBL8;FF2000805201088052072901942000805201048152042901942000805201908052012901942000", + "805201048052fe28019420008052012c8152fb28019420008052L8;FFc80240f9690200f9680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aac42c0094e8e7563968000036e00314aa0ae7ff97e11b42f9f7030291L16;FF22008052ccac0094e00318aa0104805222008052c8ac0094e", + "16342f9f81340f9810000b4e01f40f922008052c2ac0094e11740f9810000b4e00740f922008052BBBBBBL8;FB645f63742e726563762065706f636820c0022d3ec01b3a2043743253616d706c6564202d3e204b65797353616d706c6564002f636172676f2d6769742f737061L8;FFa8ee5f78d60600f10", + "801174aa8020079a0090054a002407908ffdf88e801003568034039e103142a1f05007181030054e2031f2a0e07009408fc78d309fc60d3BL8;FFe10300aaa10a00b5680240f9080540f91f0119ebe9030054e00313aa99fdff97c009003728fc60d3a80600b5200840921f1800f182070054217c0353010", + "80034L8;FFcd20009407000014a003df3ce85701a928008052f60702a9e003833ce8230039e82740f9e083c13ce183c23ce283c33ce383c03c882200f928008052808600adBBL8;FFc808f837e0e315912a120094e87b45b9c8150037e8c742f98a0640f9490108ebe31b00548a0240f9e0c342f94801088", + "b882600a9a8835df8080540f9140100ebL8;FF315d00941f040031400700541f0002716200005435008052070000141f0020716200005455008052030000141f404071d536969ae80740f9080114cbbf0208ebL16;FFf65705a9f44f06a9fdc30091081c00121f090071a1010054e00302aaf30302aaf403", + "01aa80edff9720020037750240f9a80640f9160101eb82020054e80f41b2BBBL8;FB30f845000000000018000000000000000800000000000000cc1846000000000030f8450000000000100000000000000008000000000000004c19460000000000L8;FF240080527da4ff97e11740f918fcff17f30300a", + "ae063009122008052230080522400805275a4ff97e11740f9e00313aa9afbff17f30300aae063009122008052BL8;FFf50301aae1031faae20316aaf7feff97e10315aae05741a9b7ffff1708010036c0feff9000803991c2fefff0428003912102805208fd009448060037e0031f2aL8;FF1f0109eb2802", + "0054f70300aaf60315aa80021c8be1074091e20317aacd00009428008052f50316aafc031baa0804a07208011bcb1f0540f11731999a7f0348f1BBL8;FFa8831bf8201200541a210091b72303d1bc6303d13900805209000014e1f20191a22301d11bc6ff97601700b5bc835bf8fa031caa428f40f882100", + "0b4810340f9L8;FF62820391613e40f9081140f900013fd6606601f9616a01f9290c40f9e8830f91e1031baa20013fd6fcf341f99f0f00b1a100005448008092480300f908018052L16;FFfabb40f9ef8f40f9ec1f40f9e6e340f9e8f700f9f60740f9f23f40f9e8c340f9f16740f9e56f40f9e14740f9e4", + "5f40f9e8b300f9e8ab40f9e06746a9e8c300f9BBBBL8;FB5368b53f0b692940209bdb7f55641688e892f1fe0036dc9f52efac0948cc853bac4a6fcf314400005ec6de110faac78b3f3df3d77b69da4dff25042bdfb9e906L8;FFfd7b44a9ff430191028d001408feffd008090a91e00301aae10308aa4204", + "8052fd7b44a9ff430191fa8c001408feffd0080d0991e00301aae10308aa62028052BL8;FFf6e305f9faeb05f9ffe705f9a88317f88a1000b5e0c327910163009102288052cc100194e0c32291e1c3279102288052c8100194e0c31d91e1c3229102288052L8;FF3fad0071e9179f1a090109cb48158a9a3", + "f0d00f1c2020054a90400b40a01403958c100511f270071280400543f0500f1e00000540805403908c100511f250071BBL8;FF89620091e8031aaa880100b42a0940f929610091086100d1550115ab63ffff5460ffff9000803a9162ffff9042603b91a1068052024d01949509f8b6f9031faaL8;FF00004", + "0f94504ff17082440a9e20301aae00308aae10309aa334d0014fd7bbfa9fd030091080040f91f0500b1000b0054083040b9e80b0034080140b20811c0daL16;FFfecb03f9e8b303f9e8ff40f9f1d703f9e8bb03f9e89340f9e6df03f9e8bf03f9e8db40f9fbe703f9e8c303f9e8cf40f9f7ef03f9e8c703f", + "9e8c340f9faf703f9BBBL8;FFe003022ae20303aa22f6ff97801d00b4e00700f9a1ffff9021203f91a3ffffb063fc0791e023009102028052c4028052e1000014c90080d248008052e2430039L8;FF29211b91aa0303d1a04700d1e8a711a9a8fdff9008053691e8ab13a98a06805248048052ffa70ea9a9", + "fdff90299d2a91e9ab10a9290080d2e1a30391090ec0f2BL8;FFe80300f905f7ff97e80300aaa1fefff021580f91a3feff9063803891e00300916201805204018052e80300f911000014c80080d2e0230039e00300910800f0f2L8;FF95520091050080d2e10315aa040080124304805262008052000080d", + "2db020094f30300aa1f0400b140060054000000f000201d91180000f0000c40391f1c0072BBL8;FF4814005472000014fa031faaf9ab49f9f8074091188309913f0700b1a018005400c303912b1c0094080040b20811c0da081540d2080d088b0825019109fd46d3L8;FFc9220d91800600ade003c43de18", + "7c53dd8a20d91c8220d91d6220e91800a01ade083c53de28bc53de83f00f9e88340f9a00600ade08fc53de14fc23dffe31039L16;FF810000b4e00315aa22008052cab00094e10340f9810000b4e00314aa22008052c5b00094f44f49a9f93340f9f65748a9f85f47a9fd7b45a9ff830291c0035fd6BBBBB", + "L8;FBab0100001e0000006c69627369676e616c5f70726f746f636f6c3a3a73657373696f6e5f6d616e6167656d656e7443757272656e74000000bb12400000000000L8;FF6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b290500", + "9129010aabc20600542a0140b2BL8;FFeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191ad194e8bbf010ceb830500546b0500f1ec030daa81feff54a90109abL8;FFe00319aae10316aa22008052ca180094e80b4091e083099108c10e9146d4fe97e8074091408", + "3009108411d912bd7fe97fae340f936008052f8db00f9da0b00b5BBL8;FFc2020054e8030091e10317aae20316aa00011a8bcf5801944803160be8ff0039d60500b5f703082a08088052020117cbb60202eb62060054e8030091e10314aaL8;FFe0d3823de8ab05f901080054e8ab45f9e9c32791e0d3c23", + "de95b04f9a9fdff9029411f91e80305f9080000f008612a91e85f04f928008052eac32291e96f06f9L16;FF3f0400f10bfcff5408028052a06a68f822008052c8d80094dbffff17e0230b39e0030b91ff270b39f56301f9fbdeff97e80300aae86301f981feffb0218c1391BBBL8;FFf44f4fa9f6574ea9f", + "85f4da9fa674ca9fc6f4ba9fd7b4aa9ff030491c0035fd675040051f9230091760800513a008052770240f9e20640f95f0018eb492a0054L8;FF6001029109692138ead302f960290094e1431691641100949f0a00b1e10b0054e1ffc33de8d342f9e90348f9e067c13d8183813ce83b08f9e80f40f9e947", + "08f9BL8;FFfd7bc2a8ccf80014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091080040f9f30300aaa80000b4600640f901f97fd342008052bff80094680e40f9L8;FF2afd48d3299d00924a9d00924901098bea8300b2297d0a9b08c1498b292840791f0109eb22010054ca7a1d53f7031f2a3", + "801084b5f050071cc0100540a020034BBL8;FFe04316910123009102738052d1380194f8031f2ab701001403e4006f0083c03c0183c13c0283c23cf6d344f9e0074091fbcf44f9f9c744f900802f91f5cb44f9L8;FF160101ebe200005475010014a22302d1630c8052e3eeff97e10300aaa02e00b5a8835", + "7f8080540f91f0116eb490e0054a02302d16cf4ff97c02d003728fc60d3L16;FFe8ff43f9e48715ade107c23de6435f39ebbb01f9eb6740f9f4bb43f9e90316aaf60315aaf503062af8030baaeaaf00b9edbf43f9f9c343f9fec743f9eecf43f9BBBBL8;FB0e0000002600000042024000000000006a0000", + "0000000000190000001c00000042024000000000006a00000000000000e30000002e0000004202400000000000L8;FFa003dd3ca9035ef86002803d680240f9690a00f91f0500b1e0130054608640a9c2fe44d338e6ff97b78359f8f503002a133c0853a88358f8ff0208eb61000054BL8;FF400c0054282", + "340b8e90f4b79eacf42f9eb075639ec434b79e86b08b9e8c742f9e9db1079e9cb42f9aa0318f8ac8318784b650036ea6b48b9ebdb5079ece20b91L8;FFa80c0037e88b41f9fb735ca9bf0208eb40010054494300918802178bb5060091df0209ebf74200911b7101a9f59301f9e1fdff545d000014e0430c", + "91e10315aaBBL8;FFea3f01f9e9d300f9a8831ff8b4835ff8820640f9620600b4810240f9200080398000f8b728040091490400d1110000145f2800f1880000542800028b08f1df38L8;FFec030b91eaa741b9e86301f9e9cb02b9eacf02b9080380d20800f0f21a1100d1e9d342b9204bc03d8101c03de8", + "8f01b9e94303b98041883c8021c03de95343b9L16;FF28a00791e07f00f9e00309910001c03d21000891ec0b18a9022f8052eae700f9f9030baae0f3803dfc030eaaed4700f9e4af00f9f51300f9f48f11a9f1df00f9BBBL8;FFe10315aa1165019420008052810480520565019482fffff042801691e003", + "18aae10317aa0965019482fffff042e01291e0031baa1a650194ff4301d1fd7b02a9L8;FF081c00121f090071e1010054e00302aaf40302aaf30301aad2000094e80300aae00301aa08020037980240f9080740f91f0100eb42020054e80f41b2e80700f9BL8;FF1f0500b1810000549fe608a99ffe09a99", + "f820a3881220291e20313aa92f8ff97401200b5e1031faae2ffff17880245f81f0500b1a10000549f6605a99f7e06a9L8;ZDBBL8;FF000d803d888341f8e9035039e80b02f9e8430691a9090034e90310912a0100d04a5105911a0380d200ffffb00090199108210091e1c30e91e9db01f91a00f0f2L8;FF", + "d90640f9ecffff17fd7bbba9fa6701a9f85f02a9f65703a9f44f04a9fd030091f40303aaf30302aaf60300aac20100b4f70301aac3280094e00313aa21008052L16;FF600200b4e00740ad08048052c80202a9dffe03a9000400ada2037fadc81a00f9d54e0929c20200add45200b9f44f4da9f6574ca9f8", + "5f4ba9fa674aa9fc6f49a9BBBBBBBL8;FB737320c0000d4b6579207472696d6d65643a20c000c0001243616e6469646174652073657373696f6e20c00e206661696c656420776974682027c007272c2068L8;FFff7f17a9e8cb00f9ff630639c71a009460864cad68620791765e5ca9626ec03d61ea40f90", + "00700ad0001c03d68f640f9e00317aaa8031ff8e8830691020301adBL8;FFbf0500f1c80100548c1900126ce10c8b81fd0daa3f000beb030500544b018052e0031faa4a010b8b29010bcb0a2500a9fd7b43a9ff030191c0035fd6e80741b2L8;FFa0c300d10800f0f2bf931d38a8031df80229ff97e10300", + "aaa1031df841fdff902120329143fdff90638c3291a0c300d162038052440080521f000014a0031df8BBL8;FFba035df8480317cb7f0208ebc8180054e81f40f9130100b4a8835df8e11b40f9e20313aa0001178bca620194e81f40f9f702138ba0835df85f0317ebc9010054L8;FF780a40f9680240f908", + "0118cbdf0208eb88070054680640f9e10317aae20316aa0001188bcb6200940803168b680a00f9540300b4610a40f9680240f9b51240f9BL8;FF1f0500b1c10000549f5e00a99f7e01a9977e02a9981a00f99f3200f9e10314aae20313aa4d010094c00300b5e1031faad6ffff17c1010054e1031faac2ff", + "ff17L8;ZDBBBL8;FB08000000000000005cec45000000000040eb4500000000004ced4500000000006120446973706c617920696d706c656d656e746174696f6e2072657475726e65L8;FF1f0109ebe815005447000014f7031faaf50314aab60e4ff8df0600b120170054e00315aaa2ebff97080040b208", + "11c0da081540d2080d088b0825019109fd46d3BL8;FF1f01096be0179f1ae31701948806403969064039f503002a1f01096be0179f1add170194880a4039690a4039b602000a1f01096be0179f1ad7170194880e4039L8;ZFBBL8;FF0e3f0194fd7b43a9ff030191c0035fd608200091200440a9e9230091", + "0a0000904ab13991e8a700a942ffffb0425c1191ea0f00f9e3430091003f0194fd7b43a9L8;FF880e00b5e1031faae1ffff17e1031faa886200b9deffff17811c0054e0031faa2cffff1720ebff54c80080d20800f0f20809009137000014e1010054e0031faaL16;FFe8b303f91cc9ff97e31340f9f0031", + "caae2031baae8f341f909008092f7f300f9facf00f9e0c7c33de1f7c03de82b01f968018052f57b40f9e8270ea9ed0740f9BBBBL8;FB3d0440000000000049000000000000009d000000300000003d044000000000004900000000000000c00000000c0000003d044000000000004900000000000000L8;F", + "Ffd030091084c80b9f30300aac80a0034080140b20811c0da081540d2080d088b0825019108fd46d315050091681a40f9080a00b4080140b20811c0da081540d2BL8;FF00013fd6c10640f9810000b4c20a40f9e00313aac81201949f0a00b121010054e01bc13de11fc13db47e0853e88344b9e063813de", + "167813de8a305b96c080014L8;FF56fd60d3eaa340f93bfd60d3e9c700f93cfd78d3e97f42f958fd78d3e9d700f9480400b4e8c740f9e08b40f922008052e19340f9177d0853bf120094ef0317aaBBL8;FF560300b4e10f40f9e80740f9b70640f91f0101eb80080054e80b40f9490280522a040091e0031", + "6aaea0f00f909692138e1230091add8ff97f80f40f9e80740f9L8;FF410301ad020142ad420302ad010140ad410300ad60000054e02b40f92ee8ff97f4e351a9180200b49922009104000014180700f1396300916001005421835ff8L16;FF00e952a93f0309ebe94b00f9e9979f1a29219f5ae04300f900", + "9d40f9291d0072e03700f900a140f9e01f00f900a540f9e01b00f900a940f9e07b00f900ad40f9BBBL8;FFbaf8ff97760a40f9680240f9080116cbbf0208ebe8150054680640f9e10314aae20315aa0001168bca720194c802158b680a00f9f44f44a9f90b40f9f65743a9L8;FFbe110094e1d342f95ff9f", + "f17e043169122008052b9110094e1d342f98dfbff17e043169122008052b4110094e1d342f9a3fbff17e043169122008052af110094BL8;FFc0035fd623010094fd7b43a9ff030191c0035fd6c0feffd000802e911eef0094c0feffd000e02e911bef0094c0feffd000402f9118ef0094c0feffd000a02f9", + "1L8;FF83ffff54e14f40b202000014947e0113607f349b1f0001eba8ffff549c7e40939f06007181fc41d380030054007f1c9b034000917f0001eba918005486761e53BBL8;FFcd320194e18f49f9810000b4e09349f922008052c8320194b30000b4e07b49f9e10313aa22008052c3320194f49f49f99f0", + "600b1e0a5ff54f5a749f9f3a349f9L8;FFf46b41f9f36741f9880240f9680000b4e00313aa00013fd6810640f9810000b4820a40f9e00313aac3320094e14341f9810000b4e04741f922008052be320094L16;FF614208910232805200410891d1b2009488820e91e003009122230094e0430691e1030091", + "02328052cab20094e1430691e00314aa02748052c6b20094ffc31491BBBBBL8;FB5f000000050000001d1c400000000000540000000000000065000000050000001d1c400000000000540000000000000073000000050000001d1c400000000000L8;FFa8f35438e18346ad1f7d0071a18338ade8050054e", + "a0f40f9a902088b08011b32b7c303d1b3c303d1400540ad200500ada8f31438fc03082a82011ccb350302ebBL8;FFa9835ef8aa835ff868021c8b7b0700d15aa301919ca30191092900a9096501a9a9435fb8156502a9175103a9176104a9166105a9096100b9fb0800b4a8035ef8L8;FFe00f0054fcdf00", + "f93c1b40f9e077c03de8e34a39e007409123fdfff063b0009100401d91e10316aae2031caa84018052e8b301b9e09b803df6e700f9f50d0094BBL8;FFa59b7aa96affff1799ffff9039e31f915a04805258ffff17a9735c3808d34178e00316aaf9d701a9159341b8b60301d1e8270129a9237da9b9835c3", + "8bbe35c78L8;FF3f0000f10841899a1f2d00f1020b0054a80240f9a80000b4a00640f901e97bd302018052c45a0094e00315aa0109805202018052c05a0094e0c31d91e1c32291L16;FF89e7ff978031003728fc60d3c82600b5200840921f1800f1c2260054217c0353e12600343f0c00712c0500543f04", + "0071e00600543f080071200900543f0c0071BBBL8;FFc8e707374cffff17e0230091e8ab00a914790094a8831ff8a84300d18900009029b11991a0fffff000440691e8a700a9a82300d1c2ffff9042603691e1230091L8;FF4083843ce073c33d4183853ce197c13d4083863ce09bc13d4283833ce293c13", + "dfa3349f9e0ef843de08fc13d5f0700b1e1eb843de18bc13de0e3843de087c13dBL8;FF810b0054695e40393fb50071210b0054f40308aa680240f9699240b86ae240b8a05300d1e1230091e80700f9683241b8e92b0229690e40f9e81b00b9682240b9L8;FF5f01106ab201120af00152b2714a12530f12", + "8f9a900180525f01126aea0151b212b06cd34a118f9a1f02206a101c0653e2179f1a527e65d30f1c05530201020aBBL8;FF2905009102000014e9031faa280108ab22040054097840b93f05007141010054097c40b9290140b22911c0da291540d2290d098b2925019129fd46d329050091L8;FF01818c3c", + "200542adf97305f9f77f05f900818d3c01818e3c200540ade96b40f9fa8705f9f58b05f90081893c01818a3ce8ab46a9e94b05f9e95305f9e93340f9L16;FFe2031baae04700f9d2ba00940300001428008052e84700f9fb6b40f9b80000b4e0031aaae10318aa22008052c2ba0094b50000b4e06740f9e1", + "0315aa22008052BBBBL8;FB74194000000000005800000000000000a600000022000000741940000000000058000000000000004c00000022000000616c6c206c656e677468732073686f75L8;FFbf0244f149010054280080524900805268220039690200f99c000014480080527f220039680200f99800", + "0014f40300aab50c00b4c38a0094e00315aa41008052BL8;FFe91305b9680000b4e00314aa00013fd6210740f9810000b4220b40f9e00314aac50a01949f0b00b14102005435030036e0a350a9e20313aae17740f9081540f9L8;FFfd7bbea9f44f01a9fd030091f303012af40300aacb0a0094000280520", + "1018052c40a0094200100b4140000f901fdfff021000e91130800b91f300039f44f41a9BBL8;FFe82f00f9e10319aa294f41b9b5e301d1280c49f8f68700b9e95700b91f0500b1f85f07a9fa3700f900090054a0e301d1f9000094a082c23ca182c33ca282c43cL8;FF6b2501914a194b8b4a05009109010", + "0b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500542a0140b24a11c0da4a1540d2L16;FF40feffd0003c3991e8ab03f968feffd008612291e1430f9162008052e8b303f9e80303aae3031d91e9a703f9e9af03f9fecb00f9eb1b03a9e8e700f9fab300f9BBBL8;F", + "F682b05a98a068052480480527f2700a989fffff0297d2e91692b02a9290080d2891cc0f2687f01a9682704a91f670194c46a01948004805221008052bd6a0194L8;FF686640f9a80000b4606a40f901f97fd342008052c86a0094687240f9a80000b4607640f901f97fd342008052c26a0094687e40f9a8", + "0000b4608240f901f97fd3BL8;FFc0035fd6c80080d2e10700f90800f0f2080900d1b4ffff17e80b41b2e00700f9b1ffff17c80080d20800f0f2080500d1adffff17c80080d20800f0f208090091L8;FFe90300aa1fbd00383fcd0038e80300aae90300aa1fdd00383fed0038e80300aae90300aa1ffd003", + "83f0d0138e80300aae90300aa1f1d01383f2d0138e80300aaBBL8;FFe8430691e00301aaff0300f9fa03062af803052af60304aaf90303aae21b00f9f50301aab70302d1f403059130c3ff97e84346391f05007180020054881245b8L8;FF41fdffd021602b9144fdffd084e02a91e3230091e00308aa620", + "28052fa260094fd7b41a9ff830091c0035fd6e00301aa41fdffd021c02d91a2008052f5260014L16;FF760080521f000014b6010034df060071e1010054bf0208eb000300543600805218000014df16007141020054bf0208eb40020054b600805212000014bf0208ebBBBBBBL8;FB366438353661663039", + "38352f6c6962726172792f636f72652f7372632f697465722f61646170746572732f656e756d65726174652e72730021706f73742d7175L8;FFe7ffff1702fefff042a03991e00308aae10315aa0d9b00944000805241008052019b009440008052e10315aafe9a009422feffb042802591e00317aa039b0", + "094BL8;FF680240f91f0101ebe0050054680640f9090180522a0400916a0a00f909692138e10313aa28fcff97801e40b980010034610a40f9680240f91f0101eb20050054L8;FFfd43029109504039a9050037011040b9155840a9f30300aae0a30091f40308aa45120094a8c300d1e00316aaa7cbfe97b6", + "035df8a083dd3ca8835ef8df0a00b1BBL8;FF225b019482ffffb042a01e91e0031aaae10314aa225b0194ff4307d1fd7b19a9fc5f1aa9f6571ba9f44f1ca9fd430691160c40f908008092080c00f9df0600b1L8;FF1f0500b1e95700b9e1ebff54e82300f9facb40f9fc2f00f9f55307a91aeeffb51c0180", + "52e81b41f91f0500b161f2ff5416008092e83341f9f93f00b91f0500b1L16;FF610a40f9680240f9d8ffff17e00313aae10308aa2200805223008052240080527602009469aa40a9d7ffff17fd7bbda9f50b00f9f44f02a9fd030091f30301aaBBBL8;ZBL8;FFe8074091f30300aafa07409108810991e00", + "301aaf5074091ff0300f95a830991b582099174a3ff97f73349f94083c03ce83f49f9ff0a00b1e067803de8d300f9BL8;FF00a03e91c3feffd063203e91c4fefff084600991a20700d1610580520afb0094ffc300d1fd7b01a9f44f02a9fd430091a002003713400091f40300aa01400091L8;ZFBBL8;FF6", + "9d3ff97600d00b4e88b40b9e9b348b8ea3b40b9e08744ad7b0200f968aa00b9eba3422969b20ab86901001260828c3c61828d3ce08745ad69220f29e8a74129L8;FF22008052cc3e0094ea031aaafa6740f9ff5700f9f5031faa7fc613393400809296020014e8ff41f9788242f9e90742f9fadf09a9f7f7", + "41f9f6fb41f9f5230ba9L16;FF6083c73ce8230e39681340f9e192833c6183c33ce9cb41f9e2031fad6083c23ce8cf01f93f8120f1e0071dade1040054e8e341f91f010ff181040054e8d741f9BBBBL8;FB907995cfa28c3613a54c0000c8ca3ded5182ea32be21d6d0a7765ccfc0de8bdf601ad6a11e80a", + "a228d8a03f6fe3c88afca08a2d80926d66e277f6ee27fd5ee4aL8;FFff2311a9e82713a9ea7f15a9eaa74ba9ff2314a9ff2317a9e82716a9ea7f18a9e85719a9ff231aa9f67f1ba9ff231da9ff0301f9e80701f9f70b01f9ff0f01f9BL8;FFf500001448008052e0a33239e0833291e8a73239c80080d208", + "00f0f2e85306f9fe14009470000014e05306f9e0833291e1feff9021203f9102028052e3feffd0L8;FF29008052c90200f9f44f42a9f65741a9fd7bc3a8c0035fd6ffc301d1fd7b03a9f85f04a9f65705a9f44f06a9fdc30091280840f9f40303aaf60302aaf50301aaBBL8;FF21008052cb4e0194e00400", + "b4e08743adfa0300aa000400ada0820291a04a009408048052e90b40f9e003c03de8eb14a9e2430291e8ff15a908018052e8ff16a9L8;FF2925019129fd46d30801098b130500917f0209eb691e0054080c47f81f0500b160180054b2feff97080040b20811c0da081540d2080d088b0825019109fd46d3L", + "16;FF9e0d0014092340393f150071a1bf0054e0031d91e10308aa026e8052cdce0094e0430f91e1031d91032b0091e20319aaf5430f912e1c0094fbeb41f97f0b00f1BBBL8;FFd536969ae80740f9080114cbbf0208eb28040054e80b40f91f0002710801148b03fdff54e90f80121f00207109140033c20", + "000540a7c0653090500394a051a32L8;FFb50600f173a2019181ffff54e81f40f9c80000b4090d8052e00314aa02018052017d099bc46e0094e17740f9210100b4e07b40f922008052bf6e009405000014BL8;FF90ffff17e80b41b2e01700f98dffff17c80080d20800f0f2080500d189ffff17c80080d2", + "0800f0f20809009185ffff17c80080d2e0a30039e08300910800f0f2L8;FFc1ce7492060000f0c6c041f9210040f93f0006ebc1fdff54c7424079e62c46d3dfbc0071a80d0054e1fcff9021a0119121d86678887c011b7f00086b8bfcff54BBL8;FFe8cf42f9490480522a040091e00318aa09692138e143", + "1691ead302f92a0c0094fad342f9e8cb42f908011acb1f0308eba8350054e8cf42f9e10319aae20318aaL8;FFe0074091fb0356b98100805200001891ff0316b9ad290094e0074091fc0356b98100805200001891ff0316b9a7290094e0074091f80356b98100805200001891L16;FF02108052230080522", + "40080527bd2ff97e11b40f9a0ffff1740feffb00000289123fefff063801b9144feffb084602891a22700d1c102805203ab009420008052BBBBBL8;FB08000000000000000800000000000000982f420000000000496e76616c696453657373696f6e4572726f72000000000034f94100000000001800000", + "000000000L8;FF5f0401f1f6fdfff0d6820e91e08303ade08304ad82000054e0c30191cd9600945d000014c00640ad48fc46d3e9c3029157e07a925414409220010191e20308aaBL8;FFe1e7ff54e8031faa080113ab2304005400ffff90000033911c130194f3031faa088c45f81f0500b181ebff54e803", + "1faa080113abe302005400ffff9000003091L8;FF68c4ff97e0bf00b9a04700d165c4ff97e0bb00b9a04700d162c4ff97e0b700b9a04700d15fc4ff97e0b300b9a04700d15cc4ff97e0af00b9a04700d159c4ff97BBL8;FF030400b4e0a30191e10303aae20304aacdfeff97e00314aaa1520094fc0300aa", + "f50301aad30300b4c6560194e00313aa21008052bf560194c03e00b4e10319aaL8;FF210680520e530094e8ff42f9e90343f9a0fdff9000602c91a3fdff9063c03391a4fdff9084402d91e2833291e1068052e85306f9e95706f903530094a0fdff90L16;FFa00900541f05007141120054e81b40f91f050", + "0b120320054e9030091e8431e9120c10091102e0094e8cb43f96083c03cf6432d91e9d743f91f0500b1e0df803dBBBL8;FF42018052e400805224000014a0031df8a1fffff021780391a3fffff063a00391a0c300d142018052440180521b000014a0031df8a1fffff021780391a3fffff0L8;FF208d0054", + "e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9610f0094fad342f9e8cb42f908011acb1f0308eb288c0054e8cf42f9e10319aaBL8;FFf30b40f9fd7bc2a89afdff17610640f9810000b4600a40f922008052c6f60094611240f9810000b4601640f922008052c1f6009460020191f3", + "0b40f9fd7bc2a8L8;FF01000094017c4093c80b80d2e00301aa010000d4e00301aaa80b80d2010000d4fdffff17fd7bbba9fd030091f30b00f9f303012ae22700f9e20300aad3003037BBL8;FFeaab06f9e053833de18b833de157c33de287833de17f833de287c33dbf0600b1e07b833de07fc33df4179f", + "1ae383833de37bc33de183c33d2083853ce08bc33dL8;FFe883249129fdffb029a93791e85303f9680000b008a11f91e85703f9e8830e91a04700d1e85b03f9080000f008712991e85f03f9e8831591e1432a91e86303f9L16;FFe003c23d2841082a699140b8e29b803de2ffc13de10bc23de09315ad3b8", + "108aae9635e39e417c23de38b14ade213c23de30fc23de9af00b9e95f44f9e84b44f9BBBBL8;FBbb124000000000003800000000000000470100000a0000007375636365737366756c6c79206465637279707465643b206d757374206861766520612072656d6fL8;FFe21640d2e1031f2af91640d216140", + "038348700943f1f00f1a8010054800640ad80020191e103009122008052e00700ad800a41ade00b01adfe82009400e4006fBL8;FF810640f9810000b4820a40f9e00315aac9060194e863019100610c918cdfff97e8a75139c8000036e14741f9810000b4e04b41f922008052bf060194e89740f9L8;FF23", + "00805224008052bcdb3da9bc831ef864e3ff97b6237ea9ea058052b7835df819050091ca6a2838e90219cbb9831ef8bf0209eb88020054b50000b4e12740f9BBL8;FF480b0091b8031df805000014e80b41b2a0031df802000014480f0091a0e300d1a8831cf8fd4c0094f80300aa39000014b8035df8370", + "0001441fffff021e00091L8;FF1a7d01a91f2503a91f2100f92003c03d0081843c2007c03d0081853cfc2700f9da0000b4e0031baae1031aaa22008052c1460094fc2740f99f1b00f103050054L16;FFfa0316aaf60304aaf44b40f9fe0303aae31340f9e45f40f9ee030faaef3b40f9e0f3803dea0307aa", + "e70312aa93050014e9b343f9ea4700f91f0500b1eab743f9BBBL8;FF09630194f80600b4f60300aacd660194e00318aa2100805235008052c5660194c0feffb4e10316aae20318aaf90300aac8660194e00316aae10318aa22008052L8;FFf4030daabd050094e10340a9ed0314aa2aa040a9536928380cf", + "c71d308050091290040f9280800f90cfeffb43f0108ebb3611932000200542b0440f90afc78d3BL8;FFc80080d2e00700f90800f0f2080900d16bffff17e90b41b2e92300a970ffff17c80080d20800f0f2080500d164ffff17c80080d2e10700f90800f0f2080900d1L8;ZDBBL8;FF3f0400b1400100548", + "10000b4c0025df822008052c8260194c1025ef8810000b4c0825ef822008052c3260194c10240f93f0400b1e0fdff54810000b4c00640f9L8;FF0201805201ed7cd3cb260094745652a9350200b49682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef822008052bf260094c182", + "5ff8L16;FFf80300aa1f0103ebea33839a08010acb1f0103ebea33839a08010acb6a0008cb37010aeb69000054e90303aa03000014f7031faa0901098b0a0e8052fb6740a9BBBBBBBBL8;FB457863656564656420667574757265206d657373616765206c696d69743a20c0092c20696e6465783a20c00b2", + "c20636f756e7465723a20c00076656e646f722fL8;FFe82b01f9ff3301f9e83701f9ff4701f9e84301f9ff4b01f9e84f01f9ff5f01f9e85b01f9ff6301f9e86701f9ff7701f9e87301f9ff7b01f9e87f01f9ff8f01f9BL8;FF490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aa173088", + "9ae0db04a9f70400b4150340f9f60300aa080014eb23100054ff0208eb09010054L8;FFf40301aae10309aa22008052230080522400805263000094880a40f9e00313aae10314aaedffff17e10300a9e00301aae10309aa220080522300805224008052BBL8;FFf903172acf630194e00313aa2100805237", + "008052c7630194c0fdffb4e10314aae20313aae01b00f9ca630194e61f40f928008052f703192af9031b2a04000014L8;FF22008052bd020094610a40f9bdffff17e00313aae10318aae20316aab7020094780a40f9680240f9080118cbdf0208eb29f8ff54e00313aae10318aae20316aaBL8;FF890240f", + "93f0500b1810000549f6600a99f7e01a99f020238e003082ae10314aae20313aa90f3ff97a00f00b540fcffb4d7ffff17898242f83f0900b161000054L8;ZDBBBL8;FB2d0000000000000008010000050000006c69627369676e616c5f70726f746f636f6c3a3a73657373696f6e73657373696f6e5f7665", + "7273696f6e72656d6f7465L8;FFe1630091e00315aaa1a6ff97888240f91f0500b18000005480020491e163009103a5ff97889e40f91f0500b160e3ff5481e20491e26300916000805298a4ff97BL8;FF2a150033a18300d1e8030039e8030191ea7f0039a0073fadfaff0094e00742ade0030191e00701a", + "d1f190194c1feffd021800f91e0830091ea0000941f1c0072L8;ZFBBL8;FF0e400194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000904ad13991e8a700a942ffff9042302f91ea0f00f9e343009100400194fd7b43a9L8;FF2540009480fdff9000a028912240009480fdff90000029", + "911f40009480fdff900060299119400094ffc303d1fd7b0aa9f95b00f9f85f0ca9f6570da9f44f0ea9L16;FFeaa709a90a2549a9eadf00f9e98700f90a254aa9eaaf15a9e9c700f90a254ba9ea8b00f9e9b700f90a254ca9e9eb00f9092d4da9eacb00f90aa107914101c03dBBBBL8;FB000000000000000", + "0000000000000000001000000000000005043440000000000e0b7420000000000180000000000000008000000000000002c78440000000000L8;FF130500917f0209eb691e0054080c47f81f0500b160180054a5fcff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f", + "0109ebBL8;FF29194a8b29050091200108ab62000054fd7bc1a8c0035fd6e0fefff000e035911a100194e0fefff000c02e9117100194e0fefff0008010911410019408004039L8;FF08540037e86f42f9f87342f9e8c700f9b60000b4e00319aae10316aa22008052c5130094e3c740f9e0431391e2e30e9", + "1e103142ae40318aa720a0094e00b4091BBL8;FF61ffffd02190049163ffffd063000291a0c300d1a20280524400805209000014a0031df861ffffd02190049163ffffd063e40491a0c300d1a202805244018052L8;FF810000b4820a40f9e00315aaca530094e863019100610c91c5e7ff97e8a75139c80", + "00036e14741f9810000b4e04b41f922008052c0530094e89740f9ffa71139L16;FFe203012ae103002a7d390094e203012ae103002a7a390094e203012ae103002a77390094e203012ae103002a74390094e003012af44f42a9fd7b41a9ffc30091BBBL8;FF2911c0da291540d2290d098b29250191e91a4", + "98b29050091962281b9d6030034ca0240b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a050091958e40f9L8;FF690c0094e0b349f9800100b4e1d342f9e8cb42f91f0101eb20390054e8cf42f9090180522a04009109692138e1431691ead302f95c0c0094e89b49f91f0500b1BL8;FF080009eb23", + "0f0054ff0208eb68080054340117ab020f0054f42300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889a152300a9L8;FF152440f9000700d1bf0200eae0179f1a1f000014e10318aae00315aa620080520806009460030034dbfcff97000040b91f980071e0020054f55b4", + "2a9f76343a9BBL8;FFe87349f9090d00913f0900f123c7ff54080141d2e90080521f2d00f10831899a1f2500f12823005429ffffd029913f918a0000102b7968784a090b8b40011fd6L8;FFf65719a9f44f1aa9fd430591e18b00a9880000f0e40f00f9081140f91f0900f1e3160054176040a928008052f", + "40300aaa8ff37a939fdffb039633e911a008012L16;FFe207c13d6083853c6383843ca103953ce38301ade20b803da08779ada203d53c760200f96282823c6082803c6182813ce00743ad751e00f9600604ade20344adBBBBBL8;FB390740000000000033000000000000002f02000011000000696e76616", + "c69642070656e64696e67205072654b6579206d6573736167652062617365206b657900L8;FFa80351f81f0500f1e02b0054a8c303d16082cf3c6582ce3c0181c73c0281c83ce9fb8392fa6f00a9e00705ad0081c23c0181c33ce233803de00703ad0081c43cBL8;FFff0202710801148b43f8ff54daffff", + "17e083c03ce80f40f96002803d680a00f9f44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd6e0230091e1031faaL8;FFe8431391eabf1339e037c13de13bc13de0d7853de1db853d3716ff97e0d7c53de1dbc53de007409100401d91e03f813de143813d1d310094e037c13de13bc13dBBL8;FF80", + "ffff90004c2e9183ffff906320119184ffff9084e02e91a20700d1e103805209580194fd7bbea9f30b00f9fd030091010040f9130840f93f0013eb69010054L8;FF48008052e0a33239e0833291e8a73239c80080d20800f0f2e85306f9ff61ff9770000014e05306f9e083329161fdfff021203f9102028", + "052a3fdffb063d42f91L16;FF680200f9fd7b47a9f34340f9ff430291c0035fd641a040a9e00313aa44944329e20308aafd7b47a9f34340f9ff43029199320014fd7bbda9fc5701a9f44f02a9BBBL8;FF619640f93f0400f18b000054609a40f922008052c87b0194613240f9810000b4603640f92200805", + "2c37b0194613e40f9c10000b4604240f922008052f30b40f9L8;FFe8a342f9e907409129c13591f73340f9e157c13de0f3863de05bc13dea670291e8d700f928e341f8ff0600b120a1813ce04fc13de8cf0ef92800805221a1803cBL8;FFcb0d00122c144039091c003949c100117f250071092000390981", + "9f1a9f7d02710a819f1a8d0d00122e18403929010b0b4a114c0bbf25007129c100110b819f1aL8;FF1a000014760a40f9680240f9370c009135104078080116cb1f0115eb63050054d5000034680640f9e10317aae20315aa0001168bc7fbff97c802158bf502158bBBL8;FFeca741a9a83b007968520178", + "28008092aa1b00b9a9031ff8ab831f386a1201b86c7201f869f201f86b9e0039680200f9fd7b44a9f32b40f9ff830191c0035fd6L8;FF081140f9fa6740f9080600b4640247a9e8830f91e1432a91638203912200805263eafe97fcf341f9a0c2c73ce8ff43b9f6eb43b99f0b00b1a01e813de8f307b9L16", + ";FF08008092760600f932fbff17e8b743f9eb031c912093ce3c69d14b78e133c23de6030991e86b00f9e8ff5e39e237c23de0d7803de023c23deaef43f92841082aBBBBL8;FB067aa4aae8600b70f9efccc6545230458baf268b711645dd061128ea31f8f897dfcbda279d1878f1a28c05788f73f4657e80", + "00009e631f3781786668be5c1965L8;FF390700f1946200910001005488825ff888ffffb4800240f901f97fd342008052c58b0094f7ffff17f42341a9c80000b40805088be00318aa0201805201f17dd3BL8;FF9f0b00b1e0d3823de8ab05f901080054e8ab45f9e9c32791e0d3c23de95b04f9e9feffb02", + "9210c91e80305f9e8ffffd008c11d91e85f04f928008052eac32291L8;FF01018052cb0b0094000100b401fdfff021000891144c00a91f400039f44f41a9fd7bc2a8c0035fd60001805201038052fc070094fd7bbda9f50b00f9f44f02a9BBL8;FF1f8131f1a1100054a16a40f9e28b815228144038e8830", + "039e8830091000140b2cc4b0194e8064039e10a0091e2c38052e8033239e8033291000140b2c54b0194L8;FF081840b9c8050034080140b20811c0da081540d2080d088b0825019108fd46d308050091091c40b909050034290140b22911c0da291540d2290d098b29250191L16;FFe88744f9e8a705a9e8", + "8f44f9e98b44f9e84b00f9e89b44f9e9a30fa9cdcb0094fe0318aae69f43a9e0bf46a9ed0316aaea6341a9f0031baaebb344a9e30317aaBBBL8;FFcd6b019437008052b30000b4e00314aae10313aa22008052c76b0194b50000b4e00316aae10315aa22008052c26b0194e00317aae10319aaf44f46a9f9", + "1b40f9L8;FF614640f9e10400b408108052606a68f822008052f44f41a9fd7bc2a8c66b0014611640f9810000b4601240f922008052c16b0094610640f9810000b4600a40f9BL8;FFa18338ad8af3ff97a0877bade80741b28082863c8182873ca0877cad8082883c8182893ca08779ad8082823c8182833", + "ca0877aad8082843c8182853ca08778adL8;FF6bf17d926b0100cb04000014a90500913f0101ebe20e00540d68e938cd02f8376d01094bbf0940f28000005429050091f8ffff17294100913f010aebc2000054BBL8;FFfd7bc6a8c0035fd6ff4301d1fd7b03a9f32300f9fdc300913f040071f30300aae10", + "200542800805229ffffb029c12c91ff2300a908048052a06300910800ac72L8;FF350840f9fa0301aaf30300aa750500b4540740f9cb2b0094e00315aa21008052c42b0094601800b4e10314aae20315aaf60300aac72b0094571740f9570400b4L16;FFc102805210a8009442feff9042c02d91e10300aa", + "0da8009420feffd000a028911aa80094830400b4ff4302d1fd7b06a9f65707a9f44f08a9fd83019148004039BBBBBBL8;FB76616c69642053657276696365204944733a2073656e6465723dc00c2c20726563697069656e743dc0001a696e76616c696420737461746520666f722063616cL8;FFe01300f9", + "a02000b4ce9f00944000805241008052c79f0094e00f00f9e01f00b4c89f00944000805241008052c19f0094e00b00f9201f00b4c29f009440008052BL8;FF03ffffd063281291e0230091a20080528401805290250094e00740f941feff17c80080d20800f0f20809009147ffff17fd7bbda9f50b00f9f4", + "4f02a9fd030091L8;FFf65716a9f44f17a9fd83049109304039890d0037010840b9f30300aa150040f9e0230291f40308aabba301d142130094f60f49a9a0a301d1e10315aae20316aaBBL8;FFf44f01a9fd030091f30300aaf40301aacde3ff97e10314aae00313aaf44f41a9fd7bc2a8022b8052ca5f01", + "14fd7bbca9f85f01a9f65702a9f44f03a9fd030091L8;FFc10640f9810000b4c20a40f9e00313aac95f00949f0a00b121010054e01bc13de11fc13db47e0853e88344b9e063813de167813de8a305b96c080014f37740f9L16;FF2200805223008052240080527b030094610a40f9e6ffff17fd7bbca9f85", + "f01a9f65702a9f44f03a9fd030091f30301aa210840f9f50300aa680240f91f0101ebBBBL8;FB0303040404040400000000000000000000000000000000000000000000000000010000000000000000000000000000006f766572666c6f7720696e2044757261L8;FFc978ff54e0630091e10317aae20315", + "aa230080522400805278a3ff97f71740f9befbff17f60300aae063009122008052230080522400805270a3ff97e11740f9BL8;FF3ffc00941f0017eb61010054c8fefff008410491755a01a9685200a9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6f80300aa0140009120008052L8;FFaa2", + "c3ea9ac343fa9c0035fd61f2003d52e3c42a9304443a95f8001f1a9000054820c7ca981107da9a20c3ca9a1103da9061c00a9082401a90e3c02a9104403a9BBL8;FFab000054e03740f9e10317aa22008052c93f01945f0700f12b010054e00315aae1031aaa22008052c33f0194040000149f0b00b1c101", + "0054f80319aae00318aaL8;FF3c008092860b0014759a41f9e8830f91e00315aa543b0094a8624039f7f341f9c90080d2f6f741f9eaf343b90900f0f2e8e30f39ebf743b9e8fe48d3faff41f9L16;FF3f0400b100670054e9cf43f9e8ef42f9e0c343f9facb43f9f5db43f9e95b00f91f0500b1e9d743f9e", + "97300f9e07b0054695340f96027c03de87b00f9e8835739BBBBL8;FBace7eb39784a9e12a28c8ee578940000aab5409a1f48b911523a9cc27b6f75948df2bb4c89b684d4d43b935d81b3bf6d7914105cfeb39fd5846b834dd1b69274L8;FF2905009129010aab020400542a0140b24a11c0da4a1540d24a0", + "d0a8b4a2501914afd46d329010a8b290500913f010aeb29030054280108ab8300005410000014BL8;FFff2f06f9ff630cb91f0800f1a12b0054a02302d19becff9700080036c1efffb4e5010014c01b00b5a02302d195ecff97c010003601efffb4e1000014c02300b5L8;FF01fdfff021a83f91a04301d1", + "22028052e30315aaff020094a14301d1e2030091e00314aab0e6ff97a1035df8810000b4e00315aa22008052bf0f009428008092BBL8;FFa2fe46d3b8e27a92b5164092e20000b4e83340f9e0020191e10314aa0801028be83300f9034c0194e00300918102188be20315aaf5ff0039c64f0194e00743adL", + "8;FF224c009480fdffd0002032911f4c009480fdffd000a03e911c4c0094ff8300d1fd7b01a9fd430091e80301aae00700f981fdffd021803f9184fdffd084003f91L16;FFe9a310a9e8fb43f9e90744f9e8b700f9e8ff43f9eaa318a9e80344f9ea0b44f9e8eb00f9e80f44f9e88f00f9e81344f9e82b14", + "a9e81b44f9ea2f44f9e92313a9BBBL8;FF4a0400d115000014f90303aaf80300aa5f2800f1880000542800028b08f1df38e809f837e023009122210094e80b40b9a8ea0737e80f40f9e90640f92a0108ebL8;FFe00313aad7070094e80300aae00301aa28fc073708fc60d3c80100b5080840921f1900f10", + "2020054017c0353210200341f1100f160020054e003082ae20313aaBL8;FF880240f93f0308eb61000054e00314aa0eeb0094880640f9e083c03ce1031faa2823189be90f40f92a0700910001803d090900f98a0a00f9b4ffff17e1031faaL8;FFf30300aae00303aa0d000094e10300aac00000b4000080", + "52610200f9f30b40f9fd7bc2a8c0035fd6dbf8ff97000040b9fbffff17c0028052c0035fd6fd7bbea9BBL8;FF310d0094f90b40f91f0700b1e00b0054e1d342f9e8cb42f91f0101eb00400054e8cf42f92a040091c02202914901805209692138ead302f9d41a0094e1431691L8;FF28030036281f00121f", + "050071ec040054c8520035381f4092fa0f41b2e80318aa9c02001438ff48d31a0180d21a00f0f2091f4092fb0309aaa1035df8415300b5L16;FFf85f12a9f65713a9f44f14a9fdc30391292c47a92018c03d282844a9346c45a9e00b803deb0f00f92b4c43a91f8120f1e91b00f9e82300f9396842a9e11b", + "0054BBBBBL8;FB5f0300001c00000073657373696f6e5f76657273696f6e72656d6f74655f6964656e746974795f7075626c696373656e6465725f636861696e72656365697665L8;FF081540d2080d088b0825019108fd46d308050091090840f9290b00b42a0140b24a11c0da4a1540d24a0d0a8b4a250", + "19129194a8b2a050091091440f94801088bBL8;FFe80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb69240054080c47f81f0500b1201d0054e2feff97L8;FFe2c700f923fdffd063580391f77f42f9e0431391e1031aaae2031caaa4018052ea", + "bf00f9f9031aaae8af00f94ef5ff97ec6b42f9e96f42f9fa7342f9e27742f9BBL8;FF174800390030813c680200a9680a00f9f44f47a9f72b40f9f65746a9fd7b44a9ff030291c0035fd62000805281048052fd530194ff8304d1fd7b0ca9fc6f0da9L8;FF680000b4e00314aa00013fd6210740f9810000", + "b4220b40f9e00314aac65700949f0b00b14102005435030036e0a350a9e20313aae17740f9081540f900013fd6L16;FFd0d20094680640f93400805217693538d5260091750a00f9680240f9bf0208ebe1f8ff54c4ffff17ffc307d1fd7b19a9fc6f1aa9fa671ba9f85f1ca9f6571da9BBBL8;FF5f2800f1", + "880000542800028b08f1df388804f837e023009126290094e80b40b9c8150037e80f40f98a0740f9490108eba32400548a0340f9e00b40f94801088bL8;FF22008052cc770094f8ffff17e17749f93f0800b1e0adff543f0400b1a0adff54810000b4e07b49f922008052c2770094e18349f9e1acffb4e08", + "749f963fdff17BL8;FFf65741a9fd7bc3a8cbf7001400200091f44f42a9f65741a9fd7bc3a88802001400200091f44f42a9f65741a9fd7bc3a84d020014012040f93f0800b140020054L8;FF608640f800003fd6fcffff17f35341a9fd7bc2a8c0035fd6fd7bbda9fd030091f55b02a956cc218bf50300aa", + "d6220091f35301a9f303012af40302aae7ffff97BBL8;FFe143069102738052e057813de0fbc33de15b813de8e30a79e063813dcd370194fc074091f94315919c8301919f0600b1a0050054b8008052af000014e8074091L8;FFe0432a9121fdffd021203f910202805223fdffd063e03c9104028052c900", + "0014c80080d2e0632a39e0432a910800f0f2ff672a39e84b05f9f83dff97e10300aaL16;FFe1031c91e8231c39683b40f9f8831d91e99b03f92093803ce88f03f957170094e9b343f93f0900f161040054e16740f9810000b4e07f42f922008052beb70094BBBBL8;FB206d657373616765206b657973536", + "9676e616c5f5051434b415f56315f4d4c4b454d3736383a53434b41204b657973686f756c64206f6e6c79206661696c2062L8;FFa80640f9ae0a00f9180100791b050079d6ffff179f0700f161000054e9031faa0c000014e9031faaea031caa4bfd41d36c01098b4a010bcb8df57ed30d696d78BL8;FFe4", + "feff9084801691e0031baa1f010071e103152ae204a072e813899ae3031f2ae84f04f9601d0194e8fb40b9e97b40f93f00086be8279f1a1f0009ebe9a79f1aL8;FFeb031f2a7f05007141300054ef2300f9fc031faa1900f0d2e12f00f9f503152ab70000b4e1ee7cd3e00314aa02018052c107009428034", + "1d23f0300f114459f9aBBL8;FFa0831df802000014081300d1a0c300d1a8031df8014e0094f40300aaf5db44a9e11b40f9810000b4e01f40f922008052c1470194b50000b4e00316aae10315aaL8;FFa10000b4e07b40f922008052ca470094e9030b91ea0740f9e81740f92015c03df87f00f9eaa30ea9e", + "89341f98082823ce8bf00f972ffff1788fdffb008e10f91L16;FFeb2312a92ba047a9e84f00f934a048a9eba71aa9e8df00f929a049a9e8ab15a92aa04aa9e9a310a929a04ba9e9b700f9eaa318a929a84ca9e9eb00f929a04da9BBBL8;FFe10740f9810000b4e0031baa22008052c9670194b60000b4e00", + "31aaae10316aa22008052c4670194614a40f93f0400b140020054810000b4604e40f922008052L8;FF4b0dc0396c1d00122c540c0b810148516b00f8378b0080523a0000142b7c1c534b0a00344d11c0390b00be522b000b0bac1d00128d00f83761710c8bab008052BL8;FF1901805206000014e20313aa", + "430c80522feeff97e10300aa00feffb5a80640f91f0116eb49050054e00313aa7ef4ff9740fd073728fc60d3080500b520084092L8;ZDBBL8;FF00ffffd000281291e90702f9090000f029213f91e80b02f928ffff9008010891e90f02f949048052e82719a9e1031091e3430691e8271aa928ffff9008a1", + "0791L8;FFe8070036e00301aaf44f45a9f52340f9fd7b43a9ff830191c0035fd68000805206000014e00313aad9020094e80300aae00301aaa8fe0737680240f9090540f9L16;FF2933949aff021aebe103899af303889a1ab3ff97e0031aaae10313aa17b3ff97d90000b428e379d3e0031aaa020180520", + "11119cbc0a70094e80340f91ba300a9BBBBBBBL8;FB6f746f636f6c2f7372632f726174636865742f6b6579732e7273001f756e74727573746564206964656e7469747920666f72206164647265737320c0002f6361L8;FF40008052e10316aa079e0094ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9", + "f6570ba9f44f0ca9fdc3019148040091f40302aae11700f917f97fd3f30300aaBL8;FF08050091280800f920fcffb63f0108eb400300546a6928380805009120008052290040f9280800f93f0108eb20010054290440f90a050091206928382a0800f9L8;FFab735f38bcf35df82841082aa9f35ef8b6735", + "ef8ebe300395b8108aae91b00f9570100b50d000014a003df3cfbfe48d3fa03172ae00f803d20000014fa031f2aBBL8;FF115e0194ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091040180520506805229f87fd33f1100f13481889ae30314aa40000094L8;FFf40300aa6", + "80240f91f0101eb600e0054680640f92a040091e00314aa490180526a0a00f909692138ba140094e10313aa5dfaff97803e40f9800100b4610a40f9BL8;FFa3feff9063b00e91e0030091820280524400805290e7ff97e00340f94cffff17c80080d20800f0f2080900913effff17e00300f9a1feff90216", + "00e91a3feff90L8;ZDBBBL8;FB486846000000000034674600000000009467460000000000e46646000000000034f845000000000028000000000000000800000000000000f869460000000000L8;FF09692138e1630091188fff97f81740f9e80f40f9080118cbdf0208eb48420054e81340f9e10317aae", + "20316aa0001188bc88100940803168be81700f9965a40f9BL8;FF010840a9f30300aae023009129f87fd31f0109eb0881899a090180521f2100f11481899ae30314aa24000094e80740f91f0500f120010054e80b40f9742200a9L8;ZFBBL8;FFc0035fd6a80240f91f0500b160020054a86300910900009", + "029413a9142ffff9042843791e3030091e00314aae10313aab50f00f9e82700a9003e0194e0000036L8;FF1f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faa003e0094e00741a9fe3d0094fd7bbaa9fc6f01a9fa6702a9f85f03a9L16;FFf23f40f9f16740f9e56f", + "40f9e8db00f9e45f40f9e8c340f9e9c300f9e99740f9f4cf00f9f88f41a9e8b300f9e8d740f9e9ab00f9e06746a9eb2312a9ebf340f9BBBBL8;FB6fb299a42e0b5a2e5fe2fea5ca5700009cb37d55b2cc0d77708da9fc9d0e00008691a48b9079000034f200008e416dc05bb5716b5b831f32a1133a41d5a", + "392c4L8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8bBL8;FFfa5b06a91f0500b1e95700b9e1ebff54e82300f9facb40f9fc2f00f9f55307a91aeeffb51c018052e81b41f91f0500b1", + "61f2ff5416008092e83341f9f93f00b9L8;FFe9675339e8031faa0a00f0f2eaaf00f906000014090180d2e8031faa0900f0f229017fb2e9af00f9291d00120afd60d30801092aeadb00f9e81f01b9e8cb00f9BBL8;FFe106009102c48052f30300aad1510194540500b4ca024039e80315aa5f2100f12105", + "00549f8631f141050054c5510194008c815221008052be510194a00600b4L8;FFe10316aae20317aaf40300aad1510094582f40f9d80100b5c3ffff1737008052591740f9b7831ff859fcffb535008052572340f9b6831ef8b8431fb877fdffb5L16;FFeaaf18a90a2c4ca9e8b700f9e8979f1a08219f5ae", + "aeb00f9081d0072eb9b00f90a2c4da9eb8f00f90b444ea9eb2b14a9072853a9062c54a9ea3700f90e2857a9BBBL8;FF23008052240080523bfdff97770a40f9680240f9080117cbbf0208eb89dcff54e00313aae10317aae20315aa230080522400805230fdff97770a40f9dcfeff17L8;FF9c83019144fe", + "ff17e043169122008052ba100094e1d342f94efeff17e0431691e1031aaae20318aab4100094fad342f9e8cb42f908011acb1f0308ebc9000054BL8;FFe10300a9e00301aae10309aa220080522300805224008052f4030aaa77150094e10340a9ea0314aa2ca040a9290040f99369283808050091280800", + "f960f9ffb6L8;FFa51000511f1040f2a37c4093c1020054e01040f91fcc74f26002005400cc7492064000d115000014d6020e917f7e00a97f7e01a9c10a40f97f1200f9810000b4BBL8;FF08fd46d30900088b3a0500915f0308eba82400546e010014e1d342f9e8cb42f9f6074091d68209911f0101eb80", + "7a0054e8cf42f92a040091c002029149088052L8;FF2c000014160180d21600f0f2150500b4e00314aae10315aa22008052c6310094da0e009123000014fa074bf9fb0b4bf9e0e31791f90f4bf9fc134bf981e20091L16;FFff430391ccb10014f44f4ca9f6574ba9f85f4aa9fd7b49a9ff430391c0035fd", + "645feff90a5a02491e123009162e20191e0031f2ae3031faae8ad0094ffc302d1BBBBBL8;FB080000000000000008000000000000006ca6410000000000456e636f64654572726f7272656d61696e696e6700000000560b4000000000007500000000000000L8;FFf55b41a9e10317aae20314aaa002168b", + "d0990094daffff17ffc30691f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8c0035fd6e8a3403920feff9000203191BL8;FF29010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6L8;FFe0138", + "13de003c63de223813de2ffc53de10f813de1f7c53de00b813de0fbc53de31f813de207813de1831fadea2b02f9e4fb803d3f0500b140140054e12fc13dBBL8;FF686240f9a002803da80a00f9f44f4da9f6574ca9f85f4ba9fa674aa9fc6f49a9fd7b48a9ff830391c0035fd6fa0300aab50200b4c35901", + "94e00315aa21008052L8;FFf58b42b9f78f42b9fa1b00f9b958ffb513fbff17e8c31291fa8302910081c03ce86742f9a003983ca80319f8e80000b0081140f91f0d00f143070054e8833291L16;FFa083d63ca183d13c020302ada083d23c010300ad200800b5f4af40f974d2ffb518000014c0ffff54580", + "1001480ffff54a80a00917c0000140800809249008092BBBL8;FF290040f9280800f94c0200b500fc55d336000014e10300a9e00301aae10309aa22008052230080522400805232050094e10340a92aa040a9536928380cfc5cd3L8;FF29fd46d32905009102000014e9031faaf88b92b9380100340a0340", + "b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a05009102000014ea031faaf67b52b9BL8;FF00008092742200a9f44f43a9fd7b42a9ff030191c0035fd6fd7bbea9f30b00f9fd030091f30300aac6f900940009805201018052bff90094800100b4600640adL8;FF1f0500f161000054f30314aa400", + "0001408fc43d30900fe921f0109eb41000054200020d417050091f30300aa21008052e0f27dd33203009440ffffb4e10314aaBBL8;FFe04f823de8a304f9c0120054f8432591fc074091a182009100830091027080529c830191f9431591ca390194e8a344f9e04fc23d890a00d19f0600f1ea008052L8;F", + "F2801881ae9bb40b91f01096b61050054e2d341f9e5b34e39e0c30991e35340f9e45b40f9e1c324912600805246f0ff97e83b41f91f0900b180770054c90080d2L16;FFed0314aae14340f9010100b4e02740f922008052f4030daaf5030eaac6b90094ee0315aaed0314aaad0000b4e0030eaae1030daa2", + "2008052bfb90094fc031faaBBBBL8;FB72726f7244617461206465636f64696e67206572726f7247656e6572616c20646573657269616c697a6174696f6e206572726f724572726f7220776974682065L8;FF070000141b0500910851199be91b40f9bf0209eb130540f9e0feff540810158bb50600917f4", + "300f1137100a9f52300f941fbff543a020036eaa342a909008092BL8;FF42e01891210680520d060194e8ff42f9e90343f9e0feffb000401991e3feffb063a02091e4feffb084201a91e2833291e1068052e85306f9e95706f902060194L8;FF28040091e90b40f92b0580524a0108cbe80f00f95f1d00f1", + "2b692138c90d00543b6928f808210091e80f00f9e083c03ce80f40f96002803d680a00f9f44f47a9BBL8;FFe00308aa0d460194fd7b41a9ff830091c0035fd6ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191350840f9fa0301aaf30300aaL8;FF0800f0f217000014e003", + "13aa76050094e80300aae8070036e00301aaf44f45a9f52340f9fd7b43a9ff830191c0035fd68000805206000014e00313aa6a050094L16;FFe9df40f9f91740f9ec8700f94c018052e4d309a9e2d35da9fbab00f9e45f40f9fb8f45a9f1ab12a9ea030faafab300f9f13f40f9fa5740f9ec7300f9ec2b40", + "f9BBBL8;FF0005c03d0a657da91a8c5cf801c10091e92300f917257fa9eb3300f9e9db06a90b2540a9b60302d1c002803de91f00f9092940b9151140f9ebab04a9e95f00b9L8;FF22008052cc69009460620191f30b40f9fd7bc2a85efeff1761ce40f9810000b460d240f922008052c369009461da40f98", + "10300b460de40f91800001461ce40f9BL8;FF89f6ff97e80300aae00301aae8fd073708fc60d3280c00b5080840921f1900f1620c0054017c0353810c00343f040071200200543f08007181030054890240f9L8;ZFBBL8;FF0800ac72810101ade80b02f9e8430f91fff301f9e80302f9e90702f9d227009", + "4a0420035fbef41f9e6f341f9e8430691e32b40b9fceb41f9e0e30091c1e20091L8;FFd4290094e8ff47391ffd007128010054e00743adc902088b08011a32200500ade00b44ad200901ade8ff07391a00001409108052e1830191160101d1220108cbL16;FFff0301d1fd7b02a9f44f03a9fd8300910108", + "40a988008052f30300aae0230091440080524500805229f87fd33f1100f13481889ae30314aa26000094e80740f9BBBBBBL8;FBe802000005000000a1104000000000004d000000000000005303000009000000a1104000000000004d000000000000005b0300000900000070726576696f7573L8;FF890a", + "40f9e8fe42d3f60300aa33008052bf031ff835f57ef2a8033ea9800c00549c0640f9fa031faa050000141bc11f7814e11f78b51200d1b50b00b4884740b8BL8;FF86010094610a40f9b0ffff17e00313aa2200805281010094610a40f9b9ffff17e00313aae10318aae20316aa7b010094780a40f9680240", + "f9080118cbdf0208ebL8;FF22008052cc1d0094e00b41ad28008052e107c03d975a00a99a6e01a99c1200f98282823c8182833c8082843c68320039f44f5aa9f65759a9f85f58a9fa6757a9BBL8;FFe10314aa22008052230080522400805239e9ff97f4c340f9ebffff17e0c30591e10314aae20315aa23", + "0080522400805231e9ff97f4c340f9e8bb40f9080114cbL8;FFfaeb05f9ffe705f9a88317f88a1000b5e0c327910163009102288052cd5d0094e0c32291e1c3279102288052c95d0094e0c31d91e1c3229102288052c55d0094L16;FFf44f03a9fd030091f30301aa210840f9f40300aa680240f91f0101e", + "b000b0054680640f92a040091e00314aa490180526a0a00f90969213842560094e10313aaBBBL8;ZBL8;FF90cdff97e1074091e0431691023f805221800991cf7d009488e2079178008052b4008052000540ade8f3687915008092e8e30a79e057813de15b813de6010014BL8;FFf85f41a9fd7bc4a8c003", + "5fd6000180520105805203fa0094c0fefff000a005911afa0094fd7bbda9f65701a9f44f02a9fd030091f30302aae20301aaf40300aaL8;ZFBBL8;FFbf0318f8a0833aada003973ca8da77d3a0877aada10301d1e00314aa22008052080d17aaa0073ead080dc0daa88318f8a2837bada2033fadfe390194", + "00e4006fL8;FF1f050071c11d0054e84f45f9fb6300f9fa0314aaf75345f9f85b45f9fb6345f9e84700f9e85745f9e85700f9e85f45f9f40308aadc0000b4e00316aae1031caaL16;FFe9ef43f9ede343f9eee743f9e84300f9e8db43f9e82700f928134df8e87b00f9e8435f39e9730ff8e86300b9007b0", + "0546013c93c685340f9f9030caae04700f9BBBBL8;FBa28ce26db48f000056e2000001003110ee88093799c3175d175dd5f6fb9cd8e5d8e5d5f6d5f6d5f6d5f6a28c21e7e717e717a28ca28ca28ca28ca28ca28ca28cL8;FF48540054fa2b00f9214500b4f30301aacc8d0094e00313aa01018052c58d009", + "4e83340f9e10313aaf50300aa00018052e80f00f9154400b595020014c18d0094BL8;FF280041d23f0000f10841899a1f2d00f1020b0054a80240f9a80000b4a00640f901e97bd302018052c30d0194e00315aa0109805202018052bf0d0194e0c31d91L8;FF28fdff9008fd0391ca018052090140f92bfd", + "ff906b8d0391e02b01a9086140f8090000f9c9008052eb2702a9e08740ad086000f8e80741b2682a00a9608600adBBL8;FFa3831af8274a0194740a40f9680240f99f0208eb61000054e00313aa0b49019408038052690640f9e083c23c8826089be91f40f998000014490440f90a018052L8;FFf85f02a9", + "f65703a9f44f04a9fd030091084c80b9f30300aac80a0034080140b20811c0da081540d2080d088b0825019108fd46d315050091681a40f9080a00b4L16;FFf1d703f9e8b703f9e8ff40f9f7eb03f9e8bb03f9e8db40f9faf703f9e8c303f9e8b340f9ed0304f9e8cb03f9e8c340f9fe0704f9e8cf03f9e8", + "ab40f9e40b04f9BBBL8;FF0cf140f8a9831c78894a41b9aaa31c380a7141f8087d40393f010071afb31cf8aa831bf86901891aaa835cf88b4640f93ffd0371a8031c38280080529f4600f9L8;FF821f803d4047803d801fc03df81f00b98043813c00e4006fa80319b889430df8aa0312b8a8c313b882870", + "7adeb1300b9ebe303b9200300ada4680094e9bf4639BL8;FF40220054880080d20800f0f2081900913f0108eba121005481220091e20313aaca030094f50300aae90100143f0900b140250054880080d20800f0f208110091L8;FF30f7ff17e4f6ff97c1028052010000b900008092fd7bc4a8c0035fd6de", + "f6ff9781018052010000b9f35341a9f9ffff17e11703a9d4ffff97e11743a9e1ffff17BBL8;FFe1d342f981fcff17e04316912200805282110094e1d342f99efbff17e0431691220080527d110094e1d342f9fdfdff17e04316912200805278110094e1d342f9L8;FFc8220091e06b823de94b04f9252a00", + "94fb074bf9f90b4bf91a00f0d2fc0f4bf9f8134bf9f5174bf9e83740f9880000b4e00746a922008052bf2d0094f7030291L16;FF9cb4ff97ff831a91f44f43a9f65742a9fc5f41a9fd7bc4a8c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff8325d1ff0300f9BBBBBL8;", + "FB6bbd41fbabd9831f79217e1319cde05b6c69627369676e616c5f636f72653a3a6375727665446a621c95420000000000ec954200000000005895420000000000L8;FF2901084aabf31738ab235838a9031838a93358384a01084a6b01084aaa131838aa4358382901084aab231838ab535838a9331838a", + "96358384a01084a6b01084aBL8;FF081540d2080d088b0825019108fd46d308050091092440f93f0500b1400400540a2c40f9093840f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b250191L8;FF1f0500f1a10b0054e00316aa21c4805222008052c8150094f62b40f9e0031aaa01c48052220080", + "52c3150094e0031baa018c815222008052bf150094fae340f9BBL8;FF202200b4e10b40f9e20313aaf90300aad0550194bb0700b4ca550194e0031baa21008052c3550194e01e00b4e12f40f9e2031baaf70300aac6550194df0600b1L8;FF282340b8e90f4b79eacf42f9eb075639ec434b79e86b08b9e8", + "c742f9e9db1079e9cb42f9aa0318f8ac8318784b650036ea6b48b9ebdb5079ece20b91e04341f9L16;FFe20311ade0ebc13de1030fade8f340f91f0d00b100eaff54e0431e91e10316aae20318aae30317aaf9830591fe290094e8635e391ffd0371800f00546083c13cBBBL8;FF950a40f9350300b4610a", + "40f9680240f9960640f91f0101ebe00f0054680640f929040091e00315aa690a00f91c692138e10313aaadfbff97770a40f9680240f9L8;FF9411009407fdff1780c202913a2b0094080040b20811c0da081540d2080d088b0825019108fd46d30900088b390500913f0308ebc9130054f87749f91f0700b", + "1BL8;FF3f0400b140010054810000b4601240f922008052c8f50094611a40f9810000b4601e40f922008052c3f50094b40000b4600640f9e10314aa22008052bef50094L8;FF600a40f921cc749294020e917f7e00a97f7e01a9820a40f97f1200f9020f00b4620600f9420040f9620200f9530400f96206", + "40f9530000f98f000014620640f9BBL8;FF04000014f4031faa64000014e9031faaea8b92b92a0100344a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a05009102000014ea031faaeb7b52b9L8;FF2afdffd04aed0a91007f803dff4b05f9e85305f9ff5705f9ea5b05f9e86b05f9e96f05f9", + "21320094e1b342f9810000b4e0b742f922008052bf350094e0432a91L16;FFabf9ff17d60000b4e06740f9e10316aa22008052c8b50094e90315aadc0000b4e05f40f9e1031caa22008052c2b50094e90315aada0000b4e05b40f9e1031aaaBBBBL8;FB01050000140000004d6573736167654c656e67746", + "84576656e4d6573736167654c656e677468546f6f4c6f6e6753657269616c697a6174696f6e496e76616c69L8;FF08050091982680b978070034090340b22911c0da291540d2290d098b2925019129fd46d329050091972a80b9b7060034ea0240b24a11c0da4a1540d24a0d0a8bBL8;FF010141ad410301", + "ad020142ad420302ad010140ad410300ad60000054e02b40f9f5dfff97f4e351a9180200b49922009104000014180700f13963009160010054L8;FF0201805201ed7cd3cb0500945f1b00f160110054f5d245a9340200b4b982009104000014940600f139c300918001005421035ef8810000b420835ef82", + "2008052BBL8;FF68ffff17e12b40f908008092686a00a9c1fdffb4e02740f9eaffff17f6031faae00315aae10314aa5fdaff97800400b4e88340b9e93348b8611a00f9ea1f40b9L8;FF13d041a9880240f9680000b4e00313aa00013fd6810640f9c10100b4820a40f9e00313aaf44f41a9fd7bc2a8c2450", + "014280400d11f0d00b1c8000054000440f9L16;FFe8f745f9e83f00f9e8fb45f9e9a31da9e9ff45f9e80746f9e8a705a9e80b46f9e87f00f9e87740f909c940f900210091e9af08a90ba559a9eb6b00f9eaa71ea9BBBL8;FF88ffffd0083138918902805268a600a909008092690200f9fd7b46a9f33b40f", + "9ff030291c0035fd6a8935db8a9c35db8a1a300d1abab7ea9e00313aae80b00b9L8;FF8d0100543f0c0071600200543f100071c00200543f14007141040054c1220191e20313aaf1fcff97600300b4e00000143f040071400200543f08007121030054BL8;FF080500d1e80300f9e003009103ecff97e103", + "00aae10300f9a1feffb021201291a3feffb063b00e91e0030091a20180524400805288ebff97e00340f97cffff17L8;ZDBBL8;FFfd030091010040f9f30300aa810000b4600640f922008052c7250194610e40f9810000b4601240f922008052c2250194611a40f9810000b4601e40f922008052L8;FFfd7", + "b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f090071e1010054e00302aaf40302aaf30301aad8000094e80300aae00301aa08020037980240f9L16;FF010000ade2000054b79200d10803178b010140ad092140b9292300b9210300adff0215eb08fbff54d73200f9d6ffff1768018052740e0", + "0b95dffff170801176b" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines12 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines13.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines13.lean index a7b3cb13b..9d311f5a2 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines13.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines13.lean @@ -27,358 +27,251 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub13 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF1f01027161ffff543f010aeb082100546e0e09cbc8815ff81f0103eba2210054ed0329aa08090b9bef031faa081540f9f00308aa1002168a606a70fc00a8200eL4;FF3f0108eb6b611932000100544b692838080500911f0048f1280800f9a202005400fc4ed354000014e00700f9e003", - "01aaf30301aae10309aa2200805223008052L8;FF290116abc20900546a0a40f9690600f9480108aba2090054e00315aa680a00f9f44f46a9f72340f9f65745a9fd7b43a9ffc30191f3050014e00313aaf1050094BBL4;FF3f0900b1610d0054737f609274eeffb577ffff170080c03cf6031baa1b0040f9", - "01800091e017803d080c40f9e83300f9e29f0194610600d17f0700b1e10a00f9L4;FFa80d0054010000d021c0029121d86678887c011b7f00086b8bfcff542100080b7f00016b2afcff54c11240f93fcc74f22001005434cc749288fe44d3080500d1L8;FFffc30091c0035fd6ffc300d1fd7b01a9f31300", - "f9fd430091130040f9e00301aa810100d021b01c91e8030091620180522ca00094810100d021101591a40100b0BBBL4;FF837400541803008bf9feffb50f0000141f0400b1e173005409e001941f10003161730054f9ffff1706e00194f70300aa1f0400b141fdff54e043059181008052L4;FB00c000216", - "3616e6e6f7420616476616e63652070617374206072656d61696e696e67603a20c004203c3d20c0000000007d004900000000004a00000000000000L8;FFe8df00f9084c40f93f030aebea8300f90e284fa9e8af15a908684aa9ee9f00f9e8c700f9082c4ba9ea0f00f9072850a9ebcb00f90b784ca9e8b7", - "00f9e8979f1aBL8;FF280c40f9f90301aaf30300aa365c4d291f0500b140020054341740f93a3340b9f40500b4351340f9de5f0194e00314aa21008052dc5f0194a00f00b4e10315aaL8;FF610a40f9680240f9b70640f91f0101eb00080054680640f9490180522a040091e00316aa6a0a00f909692138e", - "10313aaa2fcff97780a40f9680240f9080118cbBBBBL4;FFf6574da9fd7b4ba9ffc30391c0035fd6000400f000601391fdff0194ff0304d1fd7b0ca9f85f0da9f6570ea9f44f0fa9fd0303910950403929140037150440a9L4;FF00000000000000000000000000000000000000000000000000000000824", - "f00140000000000000000000000000000000000000000000000000000000000000000L8;FF220080522300805224008052f4030baac7150094e10340a9eb0314aa2aa040a9290040f90cfc6ad35369283808050091280800f92cfbffb43f0108eb73611932BL8;FF200100541f090071a1010054080300d0", - "08e1189102018052e00301aae10308aa2280011428030090080d219142018052e00301aae10308aa1c800114281040b9L8;FF2a040091e00315aaea1700f909692138e1630091627fff97f71740f9e80f40f9080117cbbf0208eb28860054e81340f9e10316aae20315aa0001178be57f0094BBBL4;FFe10", - "315aaed300094f55343a9f72340f9f84f00f9bf0a00b161020054f8fe58d3880280d2e97e1053772200790800f0f2783201b8685200a908ff60d3694a0039L4;FB370000003800000058334448206e6f206c6f6e67657220737570706f727465646a7573742070726f6d6f74656420612073657373696f6e", - "00147d490000000000L8;FFe0a3019182380094e8ff40f91f0500b1e0040054e82f40f9f53b01f9bf0208eb61080054e8e7039183824dad04f1cf3c88ea40f9e0c30991e90741f9818a4cadBL8;FFc0035fd6d30100b4e63f0194e00313aa21008052e43f0194400100b528008052880600f909028052936", - "a29f8880200f9f44f41a9fd7bc2a8c0035fd620008052L8;FFab008052300000144d15c039ae1d00128c1d0e0b8c0102518d00f83761710c8bcb008052280000149f114071630800544d19c039ae1d00128c390e0b8c114051BBBBBL4;FFe00313aa70100194e80300aae00301aae303162a88b70736c3fd", - "ff17fd7bbda9f65701a9f44f02a9fd03009148008052f50301aae10302aa000d002af30302aaL4;FF0a61003909650039e9ab59290a690039096d0039e9ab58290a71003909750039e9ab57290a790039097d0039e9ab56290a81003909850039e9ab55290a890039L8;FFe8230039e90300f902fdff97aa", - "035ef8a8c35fb8a9058052e1030091e00313aaa2058052ea9300f8ab2b7d29e9470039e83b00b9eb2301b8ab035fb8ea7301b8BL8;FFea4740f9e93f40f9e08745ad7b6a05a9684a01b96a2600a9e9a346a960828b3c61828c3ce08746ad6a2201a9692202a9e9a345a960828d3c61828e3ce08744adL8;F", - "F840100b084a00a91e0230091a32300d1a2008052a8831ff83390009468c20091610100d0219c1591840100b084200b91a32300d182008052a8831ff82a900094BBBL4;FFff1b00f9130200b4090040f9080840f91f0109ebea33899a08010acb2a0108cb6a020aeb68010054ea031faa0901138b0800001", - "418018052ff6302a9ff1b00f9L4;FB20abd553bd94d2cddccc442fb1c65491c38df289ca8267ee9d7080ad40d8754378a67d5115cbd89342e67621ca0d44d47397a28c5497f732d380428b0000d140L8;FF280200d0ef3300f9e56f00f9f6b70aa9f86700f9e0d300f9f1cb07a9ec7b00f9e0b3823d08b14", - "0f9ee4755a9e14740f9e9df40f9f09740f9edc340f9eb2b40f9BL8;FFfdc3009143010034081c0012f30302aa1f0900714c010054080200341f05007141030054000180521d000014280180d20800f0f2081d00d11e0000141f150071L8;FF2283cd3ce8bb01f9e863019120f18f3ce9e70c912083ce3c21", - "f18f3ce9270d912183c73c22f18f3ce9670d912283c93c20f18f3c2083c83ce9a70b9121f18f3cBBBBL4;FF18c1019278ffffb40803c0da0811c0da08f17dd3080d7a92e80208cb01015cf8e1fdffb400815cf822008052e1ef0194ebffff17750640f9950100b4a2260091L4;FB6f636f6c00000000ea98", - "4800000000002e000000000000006900000031000000ea984800000000002e000000000000006d0000000e0000007a94480000000000L8;FF000300543f080071e1030054888244f81f0500b1810000549fde04a99ffe05a997fe06a981220191e20313aa66f1ff97400200b467000014e10314aae20313a", - "aBL8;FF680080521535889a680240f9080114cbbf0208ebe8000054680640f93f0002710801148be20100540101003928000014e00313aaf603012ae10314aae20315aaL8;FF090180522a04009109692138e1431691ead302f9a90c0094e88349f91f0500b1c0000054e8074091e1431691088109910081", - "0291cc0f0094f87f49f9780300b4BBBL4;FFe80300d008b140f9680300b4e82300916903009029510d91e82701a928008052690300d029b11491ea430091a07f0091e82706a9680300b008591c91e82b08a9L4;FFe90308aa08f97fd33f011ceba3ffff543f0144f136319a9aa90219cbc80219cb1f0109e", - "be8010054f70300aaf60315aa8002198be1030091e20317aa3d110094L8;FF1504007941008052f70100d0f7220191fb0b40f99f0e00f1d801009018e33b91f90100d0e10f00f9c308005441008052b50100b0b5c22291b60100d0d6421291BL8;FFc0825ff8e9ffff17d3e640a9280340f9680000b4e003", - "13aa00013fd6210740f981fcffb4220b40f9e00313aae0ffff17e8ef42f9c80000b40805088be00314aaL8;FF0ceaff97f55b40f97fc21239681242f9600e42f9080d40f900013fd6607e02f9618202f93ef4ff17e000009000800d91e200009042e00d91e1028052fe2f0094BBBBBBL4;FFa80000b46006", - "40f901e97bd302018052e8170294e00313aa0109805202018052f44f41a9fd7bc2a8e217021421010054810000b4601240f922008052dd170294L4;FF090000f9086000f8bb0000b4e0031aaae1031baa22008052e6170094e80741b2a90000d029e13691d5018052ea008052fa0316aadb0180520300001", - "4e97b42f9L8;FF680200d008e11e9169d600a9690e00f9680200f9f44f42a9f65741a9fd7bc3a8c0035fd60001805201038052f9170194210100b4e00100370a0040b2690200d0BBL4;FFe283853ce083863c3f0500b1e183873ce00746ade81b00f9e08700ada0000054e0074ba9e80313aac0310094120", - "00014dc970194e005805221008052da970194L4;ZBL8;FFe90301aaf30300aa8101009021f41a91e8030091e00309aa020280523198009468c200918101009021881591840100f084a00a91e0030091a3630091a2008052BBBL4;FFe10317aa22008052ead70194817e40f93f0400f18b000054808240f92", - "2008052e4d701945f03007197e20fa9e8139b9a978600f9961201b9951601b9888e00f9L4;FB616e63652070617374206072656d61696e696e67603a20c004203c3d20c0002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d31L8;FFe8f303f9e88b40f9f20f04f9e8f703f", - "9e8b740f9e71f04f9e8fb03f9e8eb40f9ef2f04f9e80304f9e82754a9ee3f04f9e64304f9e81304f9e81340f9e90b04f9BL8;FFe08749f922008052ea570194e18f49f9810000b4e09349f922008052e5570194b30000b4e07b49f9e10313aa22008052e0570194e80740910881099100610391L8;FFf5a7", - "45f9e0c32791f3ab45f90163009102288052ef5700943f0700b140270054e0c32291e1c3279102288052e9570094e0c31d91e1c3229102288052e5570094BBBBL4;FF08830191e10315aa161000b9085c00a9080400f0088136911f500039602201a9090d40f9e803009120013fd6e80340f91f0d00b100f", - "dff54755a41a9e00740adL4;FB6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f74696d657374616d702e7273002f636172676f2d7461726765742f616172636836342d75L8;FF081100919fffff17e00300f941020090216c1c914302009063cc1791e003009142018052840180521", - "2000014e00300f941020090216c1c914302009063101591BL8;FF0083c03c0183c13c0283c23c7f0700b1e08705ade237803de00a00540083c33c0183c43ce00315aa0283c53ce10314aae00707ad0083c63ce20308ad498bff97L8;FFf4770094000740ad08434079e803217988010090e01b843de11f84", - "3d08b140f91f0900f189040054e90000d029110f91e8633f91e9bf0ef96901009029612891BBBL4;FFe1a30091e81f00f956a3ff97e11f40f9e81740f91f0101ebe0120054e81b40f9090380522a040091e003142aea1f00f909692138e1a300914aa3ff97f41f40f9L4;ZDL8;FF890100546c0114cb9f01", - "0aeb23010054080e8052610640f98006089b48e179d302110acbf44f41a9fd7bc2a8e9b700140a0e8052740109cb6c0640f901310a9bBL8;FF081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501", - "91L8;FFf6030aaad6f5ff979f0a00b1c10000547a9a41f97bc641f908ff48d3ea6b40f906000014fa5740f9ea6b40f908ff48d3bade78b34bfd60d317dd78b328008052BBBBBL4;FF684240391f050071e1200054600640a9290400902961199108040091200540ad680200f9e8430091e00703a9e043009", - "1028100916100805223008052e08700adL4;FFf80301aaf40700b4e6070094e00314aa21008052e4070094e10318aaf30300aa2000805273feffb4285440a9f4cf00a9ff0f00f9bf0214eb08070054f4031faaL8;FFc64018910a018052470200f0e72c1091e9af00a9a5200091e00308aa42028052c4008", - "052ea0300f928080194fd7b42a9ffc30091c0035fd6410200f0218c1a91BL8;FFf44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6eb031faa6c8e40f94cf2ffb598ffff17ea031faae9faffb5ddffff172003009000003491e187019420030090L8;FFf65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0", - "035fd608fd41d3f6031faa18038052f9230191170500910a000014a80640f9d60600914a070091ff0216ebBBBL4;FFc0035fd6e8cb41b91f05007181030054e8cf41b98c9740f98d8b40f989a340f9eed341b9ebd741b91f190071eb5f00b94c0100541f050071e00400541f090071L4;FB72676f2d72656", - "769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f70726f73742d302e31342e342f7372632f65L8;FFeac35e39e28714ad6181cc3c6281c63cf503092aeaaf00b9ea6f44f9e48715ad6181c73c6b9143f8e94f40f9e0a3803debbb01f9eb5f44f9e20713ad", - "ec7202f8BL8;FF00e02291f1470194c00200b000402391eb470194c00200b000401d91eb470194c00200b000a01d91e5470194c00200b000001e91e2470194ff0301d1fd7b03a9L8;FF080140b20811c0da081540d2080d088b0825019108fd46d308050091091840f93f0500b1400400540a2040f9092c4", - "0f90a0100b44b0140b26b11c0da6b1540d2BBBBL4;FFe10314aa22008052eae7019448008052a00302d1e3830291e10315aa0204805224008052e8830239e8490094a82240b91f05003120290054600740ad1c050011L4;FB304b42000000000000000000000000000800000000000000080000000000000", - "0507c42000000000053797374656d54696d654572726f72000500000000000000L8;FF802100b5e1031faa812200b5e8af40f91f0114eb290a0054a0c303d1cfe6ff97c021003728fc60d3080e00b5200840921f1800f1020e0054217c0353210e0034BL8;FFa8831ff83868019468220191e10200902130", - "2991a32300d182008052e40314aaa8831ff83068019430680194f44f43a9fd7b42a9ff030191c0035fd6fd7bbda9L8;FF611a40f9c10000b4601e40f922008052f44f41a9fd7bc2a8e6670014f44f41a9fd7bc2a8c0035fd6010040f9810000b4000440f922008052de670014c0035fd6BBBL4;FFf85f42a", - "9fc6741a9fd7bc5a8c0035fd6091440f93f8100f1c1020054091040f92b9140b82a1140f82dd140782c0140390b1101b82b7d40390a9100f82af140f8L4;FFfd7bbba9fd030091f30b00f9f303012ae22700f9e20300aad300303720201212040080d200600a121f10507101010054e44b40b9e1030191e3", - "430191e0008012L8;FFa8f3543869070011e98300391ffd007120ecff54a96a2838080500116bffff17a00100f000e00391a301009063202491a40100f084600491a24700d1e1038052BL8;FFc0035fd6800200d000000091830200b063603691840200d084e00091a20700d1e1068052f3270194ff4301d", - "1fd7b03a9f32300f9fdc300913f1000f123040054L8;FFc10100b4e00302aa22008052e30313aa03280094000300b50e00001428008052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6d30100b4d9270094BBBBBBBL4;FF150c40f9e9430091e22701a9a80201ab020f0054170440f9f30300", - "aae9060091ff2200f129fd43d32af17dd3490109cbe932899a1f0549ebe90900542a050091L4;FF2017c03de1af40f9fc0305913b0080922003803df90318aa810000b4e00315aa22008052e31b00948003c03d80e20091e1230091022780529b6a00a9976601a9L8;FF29318a9a2a0080525f0014eb5709", - "09aaa0000054c9fe7bd3a90000b5f716168b10000014f30315aa11000014f80308aadc1b01940005805201018052da1b0194BBL4;FF6a030a4afb064039eaf21f389c031e4a0801094ae90a4039fce21f38e8020039e80e40396a030b4a29010c4aea060039ea124039e90a0039e916403908010d4aL4;ZF", - "L8;FFa101009021a81591e80300f9e8230091c2008052229c0094a201009042c015910f000014e80300f9810100b021401791e82300910201805206000014a1010090BBBL4;FFe10b40912273c13d28835839c0020291e01f883d2077c13d21c00091e97b50f9ea7f50f922008052e013883d207bc13de12", - "3883d217fc13de20f883de29fc93dL4;FB75653a203000000062756666657220756e646572666c6f777576776e6ca16e38f3f16cbcc2c834f7387e01cf81572df8f55c4e96a73a64c764656c696d697465L8;FFe87b00f9e89f42f9e8d300f9e8ab42f9e85700f9e8b342f9e8a70ba9e8b742f9e9c742f9e", - "8431ca9e8c342f9e83f00f9e8cf42f9e9231ea9e9d742f9e8d342f9BL8;FF29013c91e8bb0ef968008052ea074091e94f09f94ac13591e1074091e93709f9e90200b029b11791e84b09f9e80200b008bd1691e94309f9290080d2a04700d1L8;FFf65704a9f44f05a9fd030091ff033ad1290100b0292128", - "91ff0300f9e97301f9fb0308aaa84700d1e97701f9890c40f9e0070aa9e0070ea9e00303aae20f0ba9BBBBL4;FFbf0208ebc1010054810740f9e00640f9e20315aafdfb019420010035e8624039896340391f01096ba100005469237da9df0208eb200349fa00030054e93b41a9L4;FB7372632f7261772e", - "7273003e696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a20696e76616c6964205369L8;FF081500913f0108ebe10e005481220091e20313aa89090094f50300aa390200143f0900b120130054880080d20800f0f2080900d13f0108eb81120054812", - "20091BL8;FF21c035912403009084000591a3630091e2018052a80f00f9337c019468a20491010300b021e036912403009084800591a3630091a2028052a80f00f92a7c0194L8;FF1dfeff17e0630091220080522300805224008052c691ff97e11740f978feff17e0630091220080522300805224008052", - "bf91ff97e11740f9bafeff17e0630091BBBL4;FF7506f8b63f2c00f1880000540800018b08f1df380864f837e80300aaa06301d1e20314aa01050091b6240094a8835ab868040036b5035bf81e000014d9bb0194L4;ZBL8;FF22008052f44f48a9f65747a9fd7b46a9ff430291e7bb0014610240f9080080", - "921f200039080000f9810000b4600640f922008052dfbb0094618241f8e1fdffb5BL8;FF3f0500b1e0120054f30300aae00308aa06fdff97e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209ebL8;FF189147b8e8fb41f9f7a34f39fcbf4f39f60", - "342f9f5230ba9e8fb43b9fb0742f975ce41f9e86b00f9e8ff43b9e85700f9280340f9680000b4e00315aa00013fd6BBBBBL4;FF6a0a00f909692138e10313aa55f7ff97770a40f9680240f9080117cbbf0208eb68220054680640f9e10316aae20315aa0001178be70b0294e802158b680a00f9L4;FFe90b", - "0094400700b4e10315aae2031caaf40300aaef0b00940200001434008052e8a3009189008052e0430091a1c300d162008052f82b00b9a8273da9bb5f3ea9L8;FFec0b0114c0035fd6fd7bbea9f44f01a9fd030091130040f968018052f40313aa818e41f8290041d23f0000f12841889a1f2d00f1a201005", - "4680240f9a80000b4BL8;FFe0030091e82b00a942680094ff8300d1fd7b01a9fd430091090040f9e80301aa2a8540f85f01007129119f9a5f0500f1e90300f9c1010054e9030091210300b0L8;FFe98b0094a06600b468008f52130303a9080800796800af52080000b968008052e80f00f9132300f933fb", - "7fd3dd8b0094e00313aa41008052db8b0094202000b5BBBL4;FFfa0300f9e7cb0194e00317aa210080523a008052e4cb0194e0feffb4e92740b988008052b7033da90811092a29008052a9031ef808000039e0830191a7610094L4;FB7a6174696f6e206572726f724572726f72207769746820656e636f6", - "465722f6465636f6465722073657269616c697a6174696f6e563056312519490000000000L8;FFef7300f9eeeb00b9eccb02f9e9cf02f9eadb02f9fadf02f9f9e302f9a0818d3cf6bb02f9ebbf02f9e8c302f9f5c702f9b00f0094e9b343f9fab743f9f9bb43f9BL8;FFc0035fd6fd7bbea9f44f01a9fd03", - "0091140040f9f30300aa880241d29f0200f108459f9aa80600b41f0500f1000200541f0900f121090054610a40f9810000b4L8;FFe00308aba3ffff54000100d000201291eb4b0094000100d000c01591e84b0094000100b000203691e54b0094fd7bbfa9fd030091083040b9c8030034080140b2BBBBL4;", - "FFe10317aa080102ab2935899ae82715a9f2eb0194e0430291e102148be20318aaf83f0439ebeb0194e83f4439f503082a08108052020115cb740302ebc30b0054L4;FB0800000000000000204c420000000000000000000000000008000000000000000800000000000000304b420000000000000000000", - "00000000800000000000000L8;FFf65742a9f85f41a9fd7bc4a8c0035fd6e8031faab60a40f976f4ffb5b41640f9e803088b54f5ffb5e00308ab23f6ff544002009000001391e1eb0094e00313aaBL8;FFe90f41b262000014080700d1090080921f0d00b1696e00a9a8000054e00319aae10318aa220080", - "52e26b0194c80600d11f0d00b148d8ff54e00317aae10316aaL8;FFa00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a29f16b0094fd7b47a9ff030291c0035fd6ff8301d1fd7b03a9f52300f9f44f05a9fdc30091BBBL4;FF2909c05a7f9302f8e82712294809c05a6b09c05ae92b5c29e", - "82f1329220080527f1302f82809c05a4a09c05ae92f5d29e82b14292809c05a6909c05ae8271529L4;FF4a118f9a1f02206a101c0653e2179f1a527e65d30f1c05530201020a5f000e6a0e02110a31017eb2508a03aa2912899a114c1353ef01010a0e010e0adf010d6aL8;FFc1feff540d000014a06300d", - "1420080522300805224008052c5c1ff97a0077fa9a806c05a08682178210800917b0700f1a1831ff821fdff54fc1740f903000014BL8;FFe0031691e5134ca9e11f40f995daff97e8c342f9200bc03dfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1404f803da90319f8601a00542083c33ce85f04f9L", - "8;FFfd020014ba031ef8e8074091e0832691e10318aa080118915304ff97e8034bf9f9074bf9f80b4bf91f0500f181010054281f00121f0500714c05005448090035BBBBBBL4;FF7361193220030054536928380bfc71d308050091290040f9280800f9abf6ffb43f0108eb93611932400400542c0440f90", - "afc78d39369283808050091280800f9L4;FFe0d7853db90d0094e107409160420191e243139121401d911cefff97f65741f9e15b41f9e8431391e00316aadee9fe97e9435339e86753393f05007101010054L8;FF0b1500390c190039012500390aa100b8091d0079c0035fd6ff0301d1fd7b02a9f31b00f", - "9fd830091f30308aae82300915a020094e86340391ffd0371e0000054BBL4;FF9b03805212000014371b40b934008052e82f40f9490700d13f0108eba004005488031b8b18a301f17b83009115411ef839a3019116c11ef815411ff814dd3f29L4;ZDL8;FF00202091ee930094800100d000c02891eb9300", - "94fd7bbda9f50b00f9f44f02a9fd03009108d040a9f30300aa1f4c00b91f1800f91f0800f9f40300b415e10091BBBL4;FF9802158b8ac20191190e8052ff7f01a9f70300a9fa030aaaf5030aaa5b0f59f84083c23c4183c13c4283c03c7f0700b1e18301ade20b803d4a3740f94083c53cL4;FBa9be0ec6c", - "ae9e3ee0000043dba525b25eaa4cce7fc8ed899f5e70095d67df89b9afc3602efec209b380346baef67b60c4ea708f7eb0e22c9a7f233e3a7780ec6L8;FFe92344f94001c03dea5f44f9e90f00f9e92744f9e093833de91700f9e92b44f9e92b00f9e98744f9e92f00f9e98b44f9e9af0fa9e98f44f9e94b", - "00f9408c0054BL8;FF780300b4e1d342f9e8cb42f9f97b49f91f0101eb403d0054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9920c0094fad342f9e8cb42f9L8;FFfcfb42f99f0f00b1c106005488008052f46f41f9e8230b3949008092f36b41f9690300f9880240f9680000b4e", - "00313aa00013fd6810640f9810000b4820a40f9BBBBL4;FFe93700f9cfffff17e92b40f93f0500b18100005429008052ff3300f9ff2705a9e1430191a20301d1e003082a07ddff9740f9ffb464000014a20301d1e003082aL4;FB6c662e6c656e28296c656e67746820636865636b6564206f6e20696e697", - "469616c697a6174696f6e6c69627369676e616c5f70726f746f636f6c3a3a67726f75L8;FFd6f2ff9780000036010a00b5e0031faae3ffff17a80640f9190101ebe200005480000014e20313aa230c805275ecff97e10300aaa10800b5a80640f91f0119ebBL8;FF04740194fd7bbba9fc0b00f9f85f02a9", - "f65703a9f44f04a9fd030091ff4307d100e4006ff30300aa5f0401f116030090d6a20e91e08303ade08304ad82000054L8;FFd662009100130054c1825ff881ffffb4c00240f922008052e6730094f8ffff17f37749f97f0600b140020054e18349f93f0400b140010054810000b4e08749f9BBBL4;FF3f0", - "40071c1faff54a8035bf81f0500b1c0010054a14301d1a26301d10b9dff9760faffb47a000014a8835cf81f0500b1a0010054a1620091a26301d1039dff97L4;ZBL8;FF3f050071610300548902086b032000542b4840b90c358c527f0100718b018b1a3f010b6b090500542901805268d20129280080526", - "9220039680200f906000014BL8;FF202a00b5a02302d10cecff97e80301aae0010036882a00b5e1031faacaffff17e02500b5a02302d104ecff97e80301aa40010036482600b5e1031faac2ffff17L8;FFe80b41b2c7000014c80080d2e14f05f90800f0f2080900d1d0000014c80080d20800f0f2080500", - "d1be000014e04f05f9e80b41b2c9000014c80080d20800f0f2BBBBBL4;FF6a010c8b08cdc9ca4bc1cbca69adcb9329bdc8ca08010a8b2981c8ca200108cafd7b45a9f33340f9ffc30191c0035fd6ff4301d1fd7b03a9f32300f9fdc30091L4;FF590080d2e82f00f9e8eb40f9fc031faa1900f0f2e92304a", - "96f000014280340391fad0071e8179f1a4a0308cb2817999a5f2500f1c2090054aa0b00b409014039L8;FFec030194612640f9810000b4602a40f922008052e703019460a20191f30b40f9fd7bc2a8e0fcff17fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4BL8;FFe343009108840194fd7b", - "43a9ff030191c0035fd60820009109240091220300b042802c91e82700a9e8030091090000b029011a912900001408a0009109200091L8;FF4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6600100d000a03c91e6830094600100d000001c91e3830094400100f000001491e083009", - "4BBBL4;FF22008052ebc30194f8ffff17e8bf42f9c80000b40805088be00315aa0201805201f17dd3e3c30194e00314aae8abff97880300f008dd3c9109058052682601a9L4;FB426549000000000054000000000000008d0000001400000034684900000000006a00000000000000120100002e00000034", - "684900000000006a00000000000000L8;FF22008052ebc300949b0200b4e04b40f9e1031baa22008052e6c30094f9031faaebffff17fb031faa1bfcff17ba0000b4e00315aae1031aaa22008052ddc30094BL8;FF080118cbdf0208eb08070054680640f9e10317aae20316aa0001188bed4301940803168", - "b680a00f9540300b4610a40f9680240f9b51240f91f0101eb40070054L8;FF2083c13c2183c23c2283c33c2383c43cfa9741b9e00600adea1700f9000504ad020d05ade90b00f9bc0000b4e0031baae1031caa22008052de430094fbe30091BBBBL4;FF390300eb63f400541803008bf9feffb50f0000141", - "f0400b1c1f3005408e401941f10003141f30054f9ffff1705e40194f70300aa1f0400b141fdff54e0430591L4;FB4e000000000000006402000013000000696e6465786b657950656e64696e675072654b65797072655f6b65795f69647369676e65645f7072655f6b65795f6964L8;FF3f0400f17f2201a", - "98b000054e0b740f922008052e7e30094e883059100c10091b3ddff973a0500349f0100145f0f00b1c0000054e80080520900809268220039BL8;FFfd7b41a9ff830091c0035fd6ff8300d1fd7b01a9fd430091080040b9a01300d1a8c31fb832640194fd7b41a9ff830091c0035fd6e00301aae10200d02", - "1c01a91L8;FF290000f029710a91200100f0007c2291e8a700a9a82300d14201009042001191e1230091e8a701a9f0630094200100f000403991e56300944001009000400f91BBBL4;FF000400adff074091ff830a91f44f42a9fc0b40f9fd7bc3a8c0035fd6eb0f41b205000014eb1741b2030000144b05", - "0091ea0309aa09c480520b2900a9090900f9L4;FF81fc41d380030054007f1c9b034000917f0001eba918005486761e53c67c4093c5021091a31e00517f7c0071a1404e3948030054a3c0238b69404d3968c04d39L8;FFe323009182008052e80700f92ba40094fd7b41a9ff830091c0035fd6810100f021", - "fc15918200805220a40014080040f9e00301aa090140f93f0500b1e0010054BL8;FF21ffff54e00300912f240194f44f43a9f51340f9fd7b41a9ff030191c0035fd608a440a9e20301aae00308aae10309aa1a240114ff8300d1fd7b01a9fd430091BL4;FF820241ade20301adf423009400e4006f808200", - "ad808201ad808202ad8002803d28d776d3800642adea03172a09dbd99380020291080d0aaae103009122008052L3;ZBBBBBBBBBL4;FF0a00669e2a0300b44901c0da2911c0da080d498b0901148a286be9388803f836e80333aa2a2100d10bfc79d301551b9be80329aa4a01148aec0600d12b6b2938L4;F", - "Fa9080037f40308aa092040a9f30300aae0430091028d40a921a1009168130094f85b41a9f55f42a91f0b00b1e1020054770300b4e8430091e00315aae10317aaL8;FF0831899a29008052ff0215eb360908aa8008005428ff7bd3480600b5d616198b3b000014b309f8b7530200b4dd1d0194e00313aa21", - "00805238008052da1d0194BBL4;FF1f0500f160160054f643029108088052f7030091c082c63cc182c73cc282c23ce00703adc082c33cc182c83ce20301adc282c13cc082c53ce123803df9ff4039L4;FFbf3b03d5a200f837430180520600b012e50701320a000014634006917f0c0039faffff17020006", - "0be103002a07000014bf3b03d5630400714001005440ffff37L8;FFa80f00f9389e0094810100d0219c1591a40100b084200b91a363009182008052b30f00f9309e0094309e0094fd7b41a9f31340f9ffc30091c0035fd6000040f9BBBL4;FF11de019440340035e85341b9e81f00b957ffdfc8770000b50", - "ade0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd6L4;FB696d657374616d7020697320696e76616c69643a20c0000089094900000000004900000000000000550000004e00000089094900000000004900000000000000L8;FFe82b17a9e80342f9e9231fa", - "90900809248008052e8270ea9e8030eaa3e0f0014e00301aa190340f909a0c0a91a2845a90078c03d0b484da91c0441f9e86b00f9BL8;FFf7e74df9e10315aae20319aae002188bf05d0194ae010014e04fc23de8a344f909008092690200f96082803c680e00f9ff0600f1eb730054e01f40f9e10317aaL", - "8;FFe20315aa0001168bf25d0094c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aa22008052f7000094610a40f9a5ffff17f50300aaBBBBL4;FF8901098a19150acb0901098b38210039a92240f928010bcba82200f928008052365f3c293fa33ea93f831ff8a82640f9080", - "50091a82600f929237fa9750640f9L4;ZFL8;FFe8a70039e91300f9e083009108f3ff97e10300aae00301aaf44f49a9f93340f9f65748a9f85f47a9fd7b45a9ff830291c0035fd63700805218038052a80640f9BL8;FF2103009021c03391040300d084601291a32300d1e00308aaa2038052a9831ff8267", - "e0194fd7b42a9ffc30091c0035fd60920009121030090213c3b91a9831ff8L8;FF81220491e263009140008052f190ff9767fdff17e8031faa000117ab02650054e16300915e7dff977f0600b18000005480220291e16300913c92ff97df0600b1BBBL4;FFfd7bc1a8c0035fd6a003009000001391eebd01", - "94a003009000a01291e8bd0194a003009000601391e5bd0194ffc304d1fd7b0da9fc6f0ea9fa670fa9f85f10a9L4;FB11000000000000006001000005000000908749000000000011000000000000006501000005000000908749000000000011000000000000006901000005000000L8;FFe00318aae103", - "17aa22008052e9bd0094b40000b4e00315aae10314aa22008052e4bd009460220091f44f4aa9f65749a9f85f48a9fd7b47a9ffc3029143b7ff17BL8;FF6b11c0da6b1540d26b0d0b8b6b2501914a194b8b4b0500910a3040f96901098b0a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b", - "8b4a050091L8;FFc80080d2a0831d38a0c300d10800f0f2bf931d38a8031df80533ff97e80300aa01010090210406910301009063200591a0c300d142018052a4008052a8031df8BBBBBL4;FF22008052230080522400805258000094610a40f96ffeff17e00313aae10317aae20315aa230080522400805", - "250000094770a40f9680240f9080117cbbf0208ebL4;FFe8c3473949610ab8e97740f9e8331639e8b341b949c10af8e9f740f9e8371639e80b409108c10e9149410bf8ff0300b99cdfff97e8db51f91f0d00b1a0060054L8;FF080115cb5f0008eba8010054b40000b4680640f9e20314aa0001158bed0d0", - "194a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaBL8;FFe80301aa2a0140f95f0500b1e903899ae90300f9c0010054e9030091210300d0218029914403009084402191e3230091e00308aa82008052e90700f91f8e0194L8;FF684600f9f44f43a9f70b40f9f65742a9fd", - "7bc4a8c0035fd6fd7bbfa9fd030091082440f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d3BBBL4;FF240080525ac0ff97f82740f9d7feff17e0e3009122008052230080522400805253c0ff97e12740f904ffff17e0e30091e10319aae20317aa2300805224008052L4;FB00000", - "00000000000000000000000000000000000fa9d698a1044db1a00000000de194900000000005700000000000000890000003c000000de19490000000000L8;FFe0031aaa21008052e7cd0094206301b4e10318aae2031aaae06b00f9edcd0094ed031baa1c0500147c6347a9792f40f976af40a9744340f9", - "6f4b40f968d741a9BL8;FF61100054f7430f9108150036c08641a9a90302d1e8430f91a20302d1240101910304805205028052444e0194e8eb41f91f0500b1e01b0054e002c03de8f341f9L8;FF19008092542340f9b4031df8f40e00b4080d80525a1f40f9fc0300f9fb0f00b9f96301a9f75b02a9f54f0", - "3a9937e089bdc4d0094e00313aa01018052da4d0094BBBBL4;FF682e00b9690200f96a0a00b9f44f45a9fd7b44a9ff830191c0035fd62000805201048052f0ed0194ffc301d1fd7b02a9f91b00f9f85f04a9f65705a9f44f06a9L4;FB000d3e20286578706563746564203cc3200080690400023e2900746", - "f6f2066617220696e207468652070617374746f6f2066617220696e207468652066757475L8;FFf50b00f9f44f02a9fd03009148008052f503012ae10303aa000d002af30303aaf403022a5eedff9795040034a80200320811c0da081540d2080d088b08250191BL8;FF6a110acb891109cbecb68dd26cdb", - "b6f22b010acbac6ddbf26bfd44d3ccb6edf274210c9b0c0e80522b0440f9082d0c9b6a010a8b6901098bea2702a99f0216ebL8;FF03110094e1d342f913feff17e0431691e1031aaae20318aafd100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aaf4100094BBBL4;F", - "Fa80319b8a88317b8681200b908e342f8a9c31778692a00796a6201f868e201f808008092f51340f9685e00a974fdffb5eeffff17ff8303d1fd7b08a9fc6f09a9L4;FF340100b4e00314aaf50301aaf60302aa6b060094600100b4e20316aae10315aa0200001420008052f48300a9ff0f00f9a2000037e0", - "230091ad000094c0010034L8;FFc201009042002f91e00304aae10303aaedad0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff830ed1280840f9291440f9e80f00b4BL8;FF68008052f53f42f9f43b42f9e8a3113929008092a80240f9690200f9680000b4e00314aa00013fd", - "6a10640f9e12a00b4a20a40f9e00314aade2d019453010014L8;FF0000189109a941a90081c23ce087853de9030bf9ea070bf94c05ff97e88340f9f40300aaf50301aae00316aae10314aae20315aa039140a91f04ff9720070036BBBBBBL4;FFe8ab00a943f20094a8831ff8a84300d1490100d029b1129", - "14004009000b40791e8a700a9a82300d1420400f042400391e1230091e8a701a9ec15029440040090L4;FF78ff78d3c8fe60d337ff60d3dcfe78d3cf7e0853ab0000d06b2934918d008052e903192af003182aee03082ac108001418fd78d3ed7f42f9cefe60d337fd60d3L8;FFc0035fd61f7d00a9c0035", - "fd6090840790b0c40790a0040b92909c05a6b09c05a4a09c05a297d10536b7d10530a0100b909090079092000910b0d0079090500f9BBL4;FFe137c03de23bc03de33fc03de31b803de217803de113803de00f803d88024039e94340398a064039eb4740398c0a4039ed4b40392801084aeeb740398f7a40", - "39L4;ZBL8;FF098d40f83f0500b1e0120054f30300aae00308aafdefff97e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b13050091BBBL4;FF2b0000141f0800f1615c0054b58355f8bf031fb8bfe33da9a20640f9bf831ef8625d00b4a10240f920008039600c", - "f8b728040091490400d170000014c1b20191L4;FB9f00000009000000382049000000000058000000000000007e000000090000005369676e616c5f5051434b415f56315f4d4c4b454d3736383a63697068657274L8;FFe0e3c13de1e7c13de2efc13de88b07f9e0d7833de0ebc13de1db833de1dbc13de0", - "df833de0dfc13de2e3833de1cf833de0d3833df95b00f9f98f07f9e99307f9BL8;FF080d088b0825019108fd46d30900088b390500913f0308eb48190054da000014f6074091d6820991c022029132180094080040b20811c0da081540d2080d088bL8;FFe80743f99f0b00b1e07f823de80305f94132005", - "4e80345f9e07fc23de9c32291e9bb03f9c904805220010090002c1091e86304f92800009008612091e1c31d91BBBBL4;FF03f60194ffc302d1fd7b07a9f85f08a9f65709a9f44f0aa9fdc3019109e04039f30300aaf40308aaa90100343f0d00714108005460a242a9090d40f9e8430091L4;FB696e67657", - "27072696e747376657273696f6e6c6f63616c5f66696e6765727072696e7472656d6f74655f66696e6765727072696e7453656e6465724365727469L8;FF840080521a000014e00300f941020090212c1e914302009063301d91e0030091c20080524400805211000014c80080d2e0230039e00300910800", - "f0f2ff270039BL8;FF84c01591e0030091a363009142008052a80f00f9347601940103009021182891040300f084401691a363009162008052b30f00f92c7601942c760194fd7b41a9L8;FF080d088b0825019109fd46d30800098b080500911f0109eb499d0054180116aba20a0154b800f8b6f9031faae", - "00319aae10318aaec750094f90b00f9980300b4BBBL4;FF8182c73caa8302d1890246f8888248f85f8300f14081823c4181833c800642ad696b00f909048052488104f85733899a600702ad608705ad628346ad620303adL4;ZDL8;FF41fcff54f40740f9b6577ea9b8835df8fb1f805233008052e00314a", - "af70314aa57000014338740a9080080921f230039080300f9e00313aa7fb3ff97280340f9BL8;FFe9ffffd029912891e80305f90800009008610691e8a705f9e8c31691ea032d91e9af05f90900009029310791e8ab05f9e8c32791a04700d1e9b705f9a90200b0L8;FFfa031faa086d099bf5c324913800", - "8052e86b00f911000014e8eb41f9090680528003c03dc822099bc90600910001803d8007c03de9ef01f90005803d800bc03dBBBBBL4;FFf60317aac28e40f8a20800b4e10240f9200080398000f8b728040091490400d1110000145f2800f1880000542800028b08f1df388806f837a0c300d1b16e0094L4", - ";FFfa031faae0031aaae10319aaf6050094790200b4e3050094e00319aa210080523a008052e0050094e0feffb4f98300a9ff0f00f9d8010034e8031faa09018052L8;FFe00313aa144440f99f0600b180fbff54135449a9550800b47622009104000014b50600f1d6620091a0070054c1825ff881ffffb4", - "c00240f922008052dd050194BL8;FF42010054000114ab82020054f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e80315ab03ffff542003009000c01c91e3850194ea031faa49f9ffb5d0ffff17L8;FFe04340f901f97fd342008052e9850094e84b40f91f0500f1ab000054e04f40f901f97fd342008", - "052e2850094e85740f91f0500f1ab000054e05b40f901f97fd3BBBL4;FF1f0700b120030054a8035ef81f0116ebc0130054a8835ef8ca060091a18300d1e00318aa49038052aa031ff8096936384cb1ff97b6035ff8a8035ef8080116cbL4;FB206d657373616765206b6579735369676e616c5f5051434b", - "415f56315f4d4c4b454d3736383a53434b41204b6579000000000000000000000000000000000000L8;FF7ca21ea9e9a346a961828a3c75e20139680601f9e83f40f970a61fa9e95f40b9680a01f9c8f040f8696208396966089162828c3c6bda19a97ab21ca9681601f9BL8;FFe083c03c0001803de083c", - "13c0005803de083c23c0009803d892200f90c000014e003082ae20313aa630c8052f1f5ff9780f6ffb4a9ffff17e003082ae10314aaL8;FF000100d000201991030100d063c01191040100d084001a91a27f0091e1068052f445009420008052c1008052ee450094ff0302d1fd7b07a9fdc301916a2440a9", - "BBBBL4;FFe86f06a9e803009009c53b91280e8052ff6f03a9e92308a9c80300f009d5059188068052fc7f04a9e92305a9fc6b07a9ece50194e3ffff17f5031faae00315aaL4;FB69737065724d65737361676520666f723a20c0102077697468207072654b657949643a20c015202873657373696f6e2063", - "72656174656420617420c001290021L8;FF98fe63d319693538d5120091750a00f9d80000b5f403172a680240f9bf0208eb8102005411000014680240f9f9621932bf0208eb61000054e00313aa2fe50094BL8;FF631e00544a0340f9a0035df84801088b480300f9290300f908fc60d3080800b50808409", - "21f1900f102080054017c0353210800343f0c0071400200543f080071L8;FFa8feff17610640f9810000b4600a40f922008052e7650094611240f9410d00b4601640f922008052f30b40f9fd7bc2a8e065001461ce40f9810000b460d240f9BBBL4;FFb800f8b6f9031faae00319aae10318aaf5a50194d8", - "0300b4e2a50194e00318aa2100805239008052dfa50194e0feffb4e8031faaf88300a9ff0f00f917030034L4;FF82c05fb85f1000f188000054000080d21f000039007d20d486b05f3886000034000080d21f000039007d20d4860000cbdf0002eb82000054000080d21f000039L8;FFfd7bc2a8c0035fd6", - "fd7bbfa9fd030091083c40f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091092440f93f0500b140040054BL8;FF22008052e00308aaea250194e003132af44f45a9fd7b44a9ff830191c0035fd62000805221048052ef250194fd7bbda9f65701a9f44f02a9fd03009108", - "004039L8;FF09260014fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4313d1ff0300f908088052f50302aa2010c03c2a7c40392900403921f0c03cBBBBBBBL4;FFf44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054080200341f05007121030054000180528", - "d000014280180d20800f0f2081d00d18e000014L4;FFa08301d1e10318aae20315aa6c0f0094b6035af8df0a00b1e1090054b60b7ba9bb8301d1a1835af8220200b4e10700f9a08301d1e10316aa43110094b7035af8L8;FFfd7bbea9f44f01a9fd030091130c40f9f301003668fe45d3090440f93f0108a", - "b02040054090840f9210108ab02040054210300b4090040f9200108cb22008052BBL4;FFe10317aae20316aae003803de40314aaf50740f9f40b00f9e30315aaebfbff97e80340f9080114cb1f2500f109030054e81340f9eb534079892a0091e003c03dL4;ZFL8;FFa0873aade28344ada9035538aa1355", - "38ab2355382901084a4a01084a6b01084aa9031538a9335538aa131538aa4355382901084aab231538ab535538a9331538BBBL4;FF6c06005448070035e90f41b2410000147f020079fd7b47a9f34340f9ff430291c0035fd6a8135db8a9435db8ab035f38aaa35db8ac835d78e83300b9a8e35d78L4;FB3", - "23239636561656664343938356335303939306231343131366236643835366166303938352f6c6962726172792f636f72652f7372632f697465722f74726169L8;FFfc6f02f9e81f02f9e8d740f9fe7302f9e82302f9e9a349a9f47702f9f4031d91ef7b02f9e82b02f9e8df40f9e92702f9e82f02f9e8af", - "40f9f07f02f9e83702f9BL8;FF980300b4e7590194e00318aa2100805239008052e4590194c0feffb4f90b40f95f0700b1f8cb02f9e0cf02f9ffd302f920130054e8031faa4901805209683f38L8;FFf3f742f9e8ef42f97f0208eb61000054e06317913c90fe9708068052e9f342f9e07fc13d6826089be", - "183c13de287c13d69060091000500ad0209803de9f702f9BBBBL4;FFff4303d1fd7b0aa9f6570ba9f44f0ca9fd83029109604039f30300aaf40308aa490200343f0d00710109005460a240a9090d40f9e823009120013fd6e8234039L4;FB61676520636f756e74657220c00076656e646f722f6c6962736", - "9676e616c2f727573742f70726f746f636f6c2f7372632f63727970746f2e7273002f63617267L8;FF0800f0f2080900d18082873ca2037dad8182883c80828a3ca1037aad8282893c8182833ca10f7bad8082843ca003d13c8182853ca10b79ad8382863c9b000014BL8;FF22010014a8060091220400f1", - "f40301aaa88b32a909008092a86303d1bf8319b8bf031ab8bf831ab8bf031bb8a98313f8a90315f8a98316f8a90318f8a8831bf8L8;FF0083c03cf8031baa08011bcbf66309f93f0308ebe09b843de19f843dfb6f09f9f62b08f9e0ff833de103843de207843dfbeb0df908590154793600b4f7e74df9BBB", - "L4;FF83feff545b010014ca01c0da4a11c0daaa0d4aab022900544a010c8a2d69ea384d06f836ad1d0012ee5b40f94d0000360e0700b4ad010012cd010debe3260054L4;ZBL8;FFe94b42f9fa0300aafc6352390104805222008052000400ad0091c13ce85f42f9e0031baae90b00f9e28310ad88f203f8e", - "0b90094a1835cf8810000b4e00f40f9BL8;FFdf0202710801148ba3feff54e90f80123f002071ea0f801229140033c20000542a7c0653090500394a051a320a01003912000014eb0f80122c7c10532b2c0633L8;FFe8834f391f05007161330054f4f741f9f7fb41f9f5ff41f9f80342f9e80742f9fb0b42", - "f9e85700f9b60000b4e0031aaae10316aa22008052de390094e15f40f9BBBBBL4;FF280080521f8400f91fa00fa91f1001b91f8c00f91f2001b9481c00121f09007101070054740040f9820640f9020b00b4810240f929008039a90cf8b728040091L4;FF080400919f0208eb41030054940600f1e003005", - "4e3090094e00314aa21008052e1090094a00400b4c1060091e20314aaf50300aae709009416000014e80f41b2L8;FFe8030091200440a9a9831ff80900009029912091ea2300a9a82300d1e91300f96202009042100291e92301a9e3230091fd090194fd7b43a9ff030191c0035fd6BL8;FFa20180524401", - "80520b000014f80300aa0b000014a0831cf8210300b021d82391230300b063382491a0e300d1a2018052e4008052407e0094b8835cf8e1034ba9L8;FF81eaff54deffff17fb6344a9530b00d1fa2b40f9f93340f97f0214ebf63b40f91c038052a2050054a80100b00821019108fddf8888020035a80100b", - "0e103152aBBBL4;FFe30314aaa8000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9edc90194ff0301d1fd7b02a9f44f03a9L4;FB750000002e0000007374617465206465636f6465206661696c65646e6f742079657420696d706c656d656e7465", - "646d657373616765206465636f646520666169L8;FFe1031aaae2031baae06b00f9f1c90094e86f40f99a0100149ade78b3e8ef42f91f0500b180000054e8c3159100a10191d7c4ff97e87740f98b010014fa031faaBL8;FF60d240f922008052ea49019461da40f9810000b460de40f922008052e549019", - "461e640f9810000b460ea40f922008052e049019460220091f4feff9760a20791L8;FF000100d000801e91ed490094f3031faa088c48f81f0500b1c1dfff54e8031faa080113aba3060054000100d000200e91e3490094f3031faa080c47f81f0500b1BBBBL4;FF08048052aa2601a9a87203a9a82204a9a", - "02205a9b60000b4e00317aae10316aa22008052e3e90194d30200b5f44f49a9f65748a9f85f47a9fa6746a9fc6f45a9L4;FB204c420000000000000000000000000008000000000000000800000000000000fc75420000000000000000000000000008000000000000000800000000000000L8;FF090040f", - "9280140f93f0100f9e80000b4291040393f050071e0000054000140f9fd7bc1a800001fd6200200b000001f91f4e90094f4e90094ff4302d1fd7b07a9BL8;FF29fd46d32905009102000014e9031faa280108ab02060054097040b93f05007141010054097440b9290140b22911c0da291540d2290d098b2", - "925019129fd46d3L8;FF2183833c2083843ca2c4fe97e11b40f9e21340f9e843069163a303916423039185830091e00316aa060480526dbefe97facb40f9e86346395f0b00b161100054BBBL4;FF5895ff97b9035cf8a8035bf8080119cb7f0208ebc8210054130100b4a8835bf8e1031aaae20313aa0001", - "198be9a901943903138bb9031cf89f0600b1fc0700f9L4;FF22010054ca7a1d53f7031f2a3801084b5f050071cc0100540a020034f703182a0e000014202040a9e10313aa030d40f9e20314aaf44f44a9f65743a9f85f42a9L8;FFc9ffff17e00740ade00313aae81340f9800600ad881200f9e3a2ff97f4", - "4f49a9fb2b40f9f65748a9f85f47a9fa6746a9fd7b44a9ff830291c0035fd620008052BL8;FF490080528a0200d04a4d3c91a00700d1e1630091e9ab04a9890200d029a13891e9af06a9eb048052a9028052ffab01a98a0200d04a013891eaaf03a92a0080d2L8;FFe0fbc33de1ffc33de0833f91e07b823", - "de17f823d132a0094e8074091e13b40f9e0c3229108011891e28200916a5cfe97e80356b91f05007141020054fa074bf9BBBBBBL4;FF12fbff97800400b4950100143f0c0071600400543f100071810200541f0900f1013500547c0240f9ff6b00b9ffeb00a93f7f01a93fff02a9fa1700f9fa2300f9L4;F", - "F09710039e9ab59290a75003909790039e9ab58290a7d003909810039e9ab57290a85003909890039e9ab56290a8d003909910039e9ab55290a95003909990039L8;FFea110e2a2e12102a4810082a09100039e9534039ef5740390b0c00392b10122a0d180039ed634039f1674039e911092a0b240039f0", - "5f40392b120d2a08280039BBL4;FFf60f00f9a87240f90a0540f92a1100b4170140f9e80240391f2100f1e1100054090180d25f8518f10900f0f2a1100054a86e40f91f8131f1a1100054a16a40f9L4;ZDL8;FFffc30091c0035fd6e93300912a0100b04ae10e91600100f000a80e91e1430091e92b01a91", - "2920094fd7b42a9ffc30091c0035fd6000040f9080040b928010034BBBL4;FF4f010e8bff0114ebef33949aef410d9bf16d40b93f02086bc1000054ce05009110c20191df0116ebc3feff542c0000149f030beb8031005489030a8b9c070091L4;FB6922e6653d85e689d33a8fedd8868d89f5fd19435e27", - "785ced96d7a7d1a0a28ca70f97d90000ece3dee68cee90b7e2ccac4e990e5381b2b867f9c9292ab28563L8;FFe98f40f9e95714a9e9eb40f9e99b00f9e9cb40f9e9eb00f9e9b740f9e9cb00f9e98b40f9e9b700f9e9c740f9e8c700f908018052e98b00f9e9df40f9e87300f9BL8;FFf4100094fad342f9f", - "c0740919c8301910ffeff17f60300aae043169122008052ec100094e1d342f9e00316aa32feff17e043169122008052e6100094e1d342f9L8;FF41020054e8031691e00316aac4510094c86240392901009029410691e9d302f9fbc342f9f5c742f9e8631639f7cb42f9e80180528083cf3c7f0b00b1a803", - "19f8BBBBL4;FF69de023968f20af8e82747a96a5a00b979f201f8692200a9e82740f9e94740f9787202f8680a00f9e843423969f202f8e98340b968de0039e80b4179699203b8L4;FB759148000000000034000000000000004a0100002d00000075914800000000003400000000000000540100001b0000", - "0073746f72655f736b69707065645f6b65L8;FF63cc1791e0030091e20180528401805209000014e00300f9210200f021901791230200f063101591e0030091e20180524400805240e6ff97e10340f99effff17BL8;FFa9e31838a8f31838e18305adf46b00f91b720194e08745ada8035ef87f1e0139e82", - "300f9e86b40f9e083843ce183853ce00742ade83700f97f0200f96082863cL8;FF49098052f6074091d6820991f4031baa0969213828040091f87749f9e8d302f91f0700b1a01a0054c022029192240094080040b20811c0da081540d2080d088bBBBL4;FFa0000054810000b4e00317aa22008052e8b101", - "943f0700f14b010054e03740f9e10319aa22008052e2b1019405000014fc2b00f9bce372a99f0b00f1a1010054L4;ZBL8;FFa80e00f908098052e933899a490109cb0a0e8052292d0a9b0a0480522a5d00a92a2101a9367d02a93f3100b92a8103a92aa104a938fd05a93f6900b9610100b4BL8;FF022b80", - "52e86702f9e8c31791018100912081803cef31019440030291e2833291e10313aa6b6eff973c008092fb4340f9fc5b02f9d5010014c90080d2fb4340f9L8;FF810000b4e05743f922008052e9310094e43100942002805221008052e2310094404700b4880c8052e900009029c13f9108400039c80080d22", - "001c03d0800f0f2BBBBBL4;FF1f010039208541ad0011803c208942ad290080520111813c092000390011823c0211833cc0035fd6fd7bbfa9fd0300912004009000801191f501029409204039L4;FFec010094e0031a2aff031291f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0", - "031faae10317aaed010094ff2f00f9e02f40f9e1031caaL8;FFe00301aa08020037980240f9080740f91f0100eb42020054e80f41b2e80700f907000014c90080d248008052e04300390900f0f2e8470039e90700f9e0230091BL8;FFb40f00f994a201912e820194b5a201f121ffff54e00300912b82019", - "4f44f43a9f51340f9fd7b41a9ff030191c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9L8;FF0819498b15050091f60314aad30e43f87f0600b180fcff54e00316aa80edff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b08050091BBBL4;FF1f010071fb7b01f9e802881a1f", - "01186b81fbff54e8ab41f99f0208ebfb179f1a81faff5474faffb4f5a741f9f31b40f93b008052f60314aa68164038a9164038L4;FB696f75732073657373696f6e20c00520666f7220c0023a20c0002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366L8;FF", - "97fa40f99c0641f9e02b803d6183813ce86700f9e95b00f9361af8b6f9031faae00319aae10316aaefc10094806ec03d8a220791886206910101c03d88d640f9BL8;FFf50300aae00313aa22008052f1000094610a40f9e00315aaadffff17e00313aa22008052eb000094610a40f9bcffff17e00313aae1", - "0317aae20315aae5000094L8;FF745656a9a80240f9680000b4e00314aa00013fd6a10640f9610300b4a20a40f9e00314aa17000014745656a9a80240f9680000b4e00314aa00013fd6a10640f9BBBBL4;FF11e2019440b40035e85341b9e89f00b957ffdfc8d70200b4ff0600b100030054f84305919900", - "8052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054L4;FB784465636f64696e674572726f724368756e6b446174614465636f64696e674572726f72000000001ced4800000000006a00000000000000dc0000002e000000L8;FFbbdcff97ff0600f1ebc0ff54e0b740f9e10317aa22008052e6", - "e1009402feff17e18b40a9e0432d91e4974329412b0094e8ab45f91f0500b1e1b6ff5474ffff17BL8;FFfd7b02a9f44f03a9fd830091e90301aaf30300aae10200f0217c0291e8230091e00309aa620380522e62019468420191c10200f021102891c40200f084e01291L8;FF6100005480c200915998fe9", - "7881e40f9e083c33ce0031faa2823189b000d803de083c43c0011803de083c53c0015803de93740f9093100f929070091e083c03cBBBL4;FFe98300a9e0230091ffa301a9a8df3ea905a201948012003788164039891a4039410300f021203e918a1e40398b12407908bd70d3e083c03c420300f04280189", - "1L4;FF1f0400b140060054200000900040069138000090000c40391f1c007261030054390000902203109140404e391ffc0371200300540004001140400e3964fcff97L8;FF3aa20094f44f43a9fd7b42a9ff030191c0035fd6ff0301d1fd7b02a9f44f03a9fd830091140040f9e00301aa810100f021a41", - "a91e8230091a201805229a20094BL8;FFf44f05a9fd830091e803022a140c40f9020440f9f30300aa14030037550001ab621400548982009129fddfc83f0500f121070054960640f9610240f9370016cbBL4;FF810000b4600640f922008052e9210094602e40f9a00000b4613240f9610000b422008052e", - "3210094611a40f9c10000b4601640f922008052f30b40f9fd7bc2a8L3;ZBBBBBBBBBBL4;FFc2060091e10313aaf90303aaeb1e0294e20318aae30319aae00315aaf0feff176004009000a01691e51e0294400400d000001791e31e02946004009000c01391L4;FFe8030091e10b00a9ff6300b9ff7f02a9f", - "f7f05a9a8831cf80800001401630091a2e300d15ffdff97c00d00b5a8835cf8080540f9280900b4a0e300d13dfeff97L8;FF8002009000c01991ed1e01948002009000601591ea1e01948002009000c01591e71e0194ffc300d1fd7b01a9f44f02a9fd430091f30300aa1440009101400091BBL4;FF1f030", - "9eb082000790000803d61000054e02300917b9e019408038052e90b40f90a0700910827089b49028052095d00a9090900f9ea0f00f9aca640a908068052L4;FF010000b9f35341a9f9ffff17e11703a9d4ffff97e11743a9e1ffff17fd7bbfa9040000f0e30300aafd03009184e040f9481c80d2427c4093", - "800400d1e40304cbL8;FF84200b91a32300d182008052a8831ff8359f0094b30100b073e20491810100d021341691a32300d142008052e40313aab4831ff82c9f009488620091810100d0BBBL4;FF815400540edf01941f1000310154005439feffb505000014e04305918100805209df019440530035e85", - "341b9e83f00b957ffdfc8770000b502df0194f70300aaL4;FB7d004900000000004a0000000000000028050000320000007d004900000000004a00000000000000d9040000130000007d004900000000004a00000000000000L8;FFecde0094e1af43f9810000b4e0b343f922008052e7de0094e1bb43f98", - "10000b4e0bf43f922008052e2de0094e8031d9100410191dcd7ff97891000142ea0c0a9BL8;FFe20301ad1e5f019400e4006f9ffe003988264d298a2e4e298c364f29e00300ad0809c05a2909c05ae00301ad8e3e5029e003c03de107c03de20bc03de30fc03dL8;FFf85f01a9f65702a9f44f03a9fd0300", - "9148008052f50301aae10302aa000d002af30302aaa5fbff97b73240b9b70c0034e80240b20811c0da081540d2080d088bBBBBL4;FF892a00a98082813c8182823ce08740ad8082833c8182843c68320039f44f4ea9f76340f9f6574da9fd7b4ba9ffc30391c0035fd6000400f000201491f4fe0194L4;ZF", - "L8;FFf65744a9fd7b43a9ff830191c0035fd6e20313aa430c80527af7ff97e10300aac0feffb5a80640f91f0116eba9040054e00313aac9fdff9700fe073728fc60d3BL8;FF7f020039f44f45a9fd7b44a9ff830191c0035fd61f09007181010054ea1340f9090180d20900f0f248dd7892290140b20a000", - "014ea674039090180d2e8031faaL8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb6811005486000014e00315aa53daff97080040b20811c0da081540d2080d088b08250191BBBL4;FFf4c340f9da4200915b02805219f17dd30b000014e8bf40f9e10316aae20315aa0001148b", - "ebbe01949402158bf4c300f9396300f15a630091c0050054e8bb40f9L4;FB1b1b00131b1b001b000007000000000008c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059bL8;FF610240f9810000b4600640f922008052e8be0094610e40", - "f9810000b4601240f922008052e3be0094611a40f9010100b4601e40f922008052f44f4aa9f65749a9BL8;FFf93e019420008052e10316aaf63e019420008052e10315aaf33e019400018052e10313aaf03e0194fd7bbfa9fd030091083c40f9080100b4080140b20811c0daL8;FF41040054c1220191e20", - "313aae8fdff97600300b4e00000143f040071400200543f08007121030054e1230091e20313aadffdff97400200b4e9000014c1620091BBBBBL4;FFf40e0294e802158b680a00f994a201919f0218eb601e0054610a40f9680240f91f0101eb40110054680640f929040091e00314aa690a00f919692138b", - "5a30094L4;FFea7700f9ea675339e8bb0779e8c35339ea2f1c29e91301f9e8a30839810000b4e09340f922008052e20e0094e0bf40f9e8431391e1031baadbe4fe97e8435339L8;FFf44f41a9fd7bc2a8c0035fd62000805201028052f40e0194e90300aa00a840a95f4100f1210100540000c03d0a00801", - "20041803c210140f90a0100b9010100b4BL8;FFe10314aae20315aaf60300aaf18e0194571740f9570400b4541340f9e18e0194e00317aa21008052df8e0194601500b4e10314aae20317aaf80300aae58e0194L8;FFf44f02a9fd430091a80100d00821019108fddf88a8020035a80100d008e140392100", - "40791f05007181040054e2031f2ab6e7ff9709fc78d38801009008e13b91BBBL4;FFc30000546e010014e8031faab6feffb5e00308ab422d0054e1e3009151baff97570300b4e12740f9e81f40f9b82240f91f0101ebe01e0054e82340f929040091L4;FB637c2f0676d13f9db4d4e9cd827c5878b5c585f", - "3f833d62975437d51d893762144d4a28c553b7cd0802a919500003ed264954975f6b2fd2aa293a553a68ef934L8;FFeb2b40f9e3f340f9e8174ca9e00b44a9f43748a9f54700f9e8d300f9ea2343a9e7f346a9ed6b00f9ed0740f9ea7b00f9eafb40f9eefb00f9ee0309aae9eb40f9BL8;FF2183c53ce853", - "01f9c86a40b9e00704ad2083c63c2183c73ce82b00b9e8430691e00705ade10240adfab30a39e10302ade10ac03de10b03ad6168ff97e99341b9L8;FF200944ad200b04ad210141ad210301ad200942ad200b02ad200540ad200700ad545dfe97e0234da982e20291e16340f9081140f900013fd6e03b02f", - "9e8031691BBBBL4;FFe00314aae10316aa22008052e9ee01947f0600f16b000054e0031caaa9ffff17f44f49a9f65748a9f85f47a9fa6746a9fc6f45a9fd7b44a9ff830291c0035fd6L4;FB54000000000000007f00000005000000259448000000000054000000000000008d000000140000005365616c6", - "5642053656e6465722076323a2044485365616cL8;FFe10314aae20313aaf0ecff97800700b5e1031faac4ffff17e1031faa883200f9c1ffff17e1010054e1031faab6ffff17c80080d2e10700f90800f0f2080900d1BL8;FFfc0313aa08000014390080529c0700d1d6620091b56200d178673fa9788701", - "f8dc0200b4b50200b4d80a40f9f8feffb4da0640f9db6e0194e00318aa21008052L8;FFe04316912200805201120094e1d342f9e00316aac6f9ff17f60300aae043169122008052fa110094e1d342f9e00316aaccf9ff17e043169122008052f4110094BBBL4;FF0a358c52e86b0239c81f0012897209f80", - "98440a9e88f0239a8035838e22f00f9a20356b8e81f033948019fda967208f8f60300aa95f208f814d447a9e86700f9L4;FF350000141f0017eb6806005448031ccb1f0008eb080600541b001c8b7f0315eba9010054bf0200f12803959ae90308aa08f97fd33f011beba3ffff543f0148f1L8;FF2803001", - "3290f0313a18b7b296b05000a2a0b02132c1705130801000a2d130413290d000a08010b4a4a09000a8c15000aab8f7c29ae1a000a114011539227000aBL8;FF01f17dd3eb2e0194e063c13de167c13d9f0f00b1e8a345b9e00718ade82303b9810d005448008092680300f971000014f46f41f9e8c31791e", - "91f46b900c1c03cL8;FF290080d2e92fc0f2a8ff3aa9a8a73da9f42e0094a10357f8810000b4a08357f822008052e32e0094e11340f9810000b4e01740f922008052de2e0094f44f5aa9BBBBBBL4;FF81ffffb4c00240f922008052e9160294f8ffff17680240f9080100b401e97bd3e00314aa02018052f", - "44f42a9f65741a9fd7bc3a8df160214f44f42a9f65741a9L4;FFbf0600b1e00719ad601c0054e077c03de30b4091a50000d0a5203091a70000d0e7c03091e8431391e2830c9163c00e9164c20391e00317aae10318aae60313aaL8;FF3e1701143e170114ff8300d1fd7b01a9fd430091e00302aa610200d", - "021802491e8030091020280522e170194e00300912e170194fd7b41a9ff830091c0035fd6BBL4;FF1f0000f9fd7b44a9ff430191c0035fd62914c0392b1d00124a1d0b0b4a0102510901f83708710a8bca00805208a800a91f0000f9fd7b44a9ff430191c0035fd6L4;ZBL8;FF3897009468220191810100", - "9021881591840100f084a00a91e0030091a3630091a2008052a80f00f92f9700946862009181010090219c1591840100f084200b91BBBL4;FFf40300aaf30308aa48008052e0330091a31300d1e10314aa0204805224008052a8c31f38e9380094882240b91f05003140010054e0c3c03ce1c3c13c080500", - "11L4;FB647248656164657253656e74646b506f6c796e6f6d69616c4465636f6465727074735f6e656564656469735f636f6d706c65746573656e64696e675f656b7265L8;FF2aa042a9ec7300f9e82b17a92aac43a9e92b1fa929a044a9e8cf00f92aa045a9e8c300f9283440f9e8ab00f9283840f9eb23", - "12a92ba047a9eba71aa9e84f00f9BL8;FF1f0101eb40880054e8cf42f92a040091802202914903805209692138ead302f9ff1d0094e1431691950f0094e87749f91f0500b1e0070054e1d342f9e8cb42f9L8;FFa201805223010090631c3a91240280522b000014e05306f9e08332912101009021c03991a", - "201805223010090630035910401805222000014c80080d2e0a33239BBBBL4;FFc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aae1f60194e08741ad28008052e217c03d800600adL4;FB5b03000009000000303132333435363738396162636", - "4656670726576696f75735f636f756e74657273656e6465725f636861696e5f6b657953656e6465724d65L8;FF21fc179143020090639c1591e0030091e20080528400805247ebff97e10340f9c6ffff17e80f41b2c0ffff17c80080d20800f0f208090091bcffff17ff0302d1BL8;FF22018052a80f00f9", - "3777019437770194fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa0103009021c82491L8;FF09008092680e00f9e0430691690200f9bb100094a80600d11f0900b163010054ab000014e80180520900809268220039e0430691690200f9b1100094a80", - "600d1BBBL4;FF0088202e09a901a90c00669e8cc101920cad00a9c0035fd6092846a9eb0309aa090100f929010a8b608540fc0a3c40f9290500910088202e09a901a90c00669eL4;ZDL8;FF0a028052e90314aa696a2af8680200f9f44f42a9f50b40f9fd7bc3a8c0035fd6ffc302d1fd7b08a9f65709a9f", - "44f0aa9fd0302915f8000f1e20300f941060054BL8;FFf6c740f9537f089be6360194e00313aa01018052e4360194001801b4080d8052fc0300aaf3031faa547f089bf5031aaae10316aa9f0213eba0020054e0c31791L8;FF21008052e8360094a0e700b4e10315aae20316aae00f00f9ee360094050000", - "14160080920500001428008052e80f00f9680a41f9e80b00f9681241f91f0500b1BBBBBL4;FF230400b0638020912404009084e03991a00739ada203943ca28303d1a1008052f4060294f406029428008052610600f968420039f7feff17ff8302d1fd7b06a9L4;FFf44f01a9fd030091f303012af40300a", - "ae40600940002805201018052e2060094200100b4140000f9810000f021800191130800b91f300039f44f41a9fd7bc2a8L8;FFa80000b4602a40f901f57ed342008052e8060194683240f9a80000b4603640f901f57ed342008052e2060194683e40f9a80000b4604240f901f57ed342008052BL8;FF0015", - "00b4290300b029010991880c8052200540ad088000390900f0d228048052000400ad89a200a980a201a908008092880200f9610240f93f0400f18b000054L8;FFf7031faaf6031faa19038052fa23019108000014a80359f8d6060091f70a0091df0218eb15693338b78319f8e01a0054c00e40920850b99", - "b0a0940f92a0300b4BBBL4;FF6182893ce00747ad60828a3c61828b3ce00744ad6082843c6182853ce00745ad6082863c6182873c800746ad000506ad803bc03d0039803de80f40f9742200a9L4;FB61676520776974682072617463686574206b65793a20c00e20616e6420636f756e7465723a20c0152e", - "2053657373696f6e206c6f6164656420666f7220c0022eL8;FFe8031d3968274da94011843cf6831d91e8ab03f9e9af03f9641b0094e8b343f91f0500b120730054e83f00f9e8831d91e9a35d390091c03ce8bf43f9e0030e91BL8;FFe00301aae10308aa22008052f4030caaf0050094e10340a9ec0314a", - "a2aa040a9290040f90bfc63d35369283808050091280800f90bfeffb43f0108eb93611932L8;FF29194b8b2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb29030054280108ab83000054BBBBL4;FFf95f40b9e13340f9a10000b4e", - "02340f922008052e7e60194f95f40b9f78216aa7afe68d3e13740f9a10000b4e02740f922008052dfe60194f95f40b9e15340f9L4;FB73742f70726f746f636f6c2f7372632f646f75626c655f726174636865742e727300c01b2073657373696f6e20737461746520636f727275707420666f7220c0L8;F", - "Ff56301f90adcff97e80300aae86301f92102009021e0189123020090634c1991e0030b91420280526401805209000014e06301f92102009021e0189123020090BL8;FF68c20091e1020090219c2791e40200f084a03191a363009182018052a80f00f93167019468220191e102009021642e91e40200f08", - "4203291a3630091e2008052L8;FF68aa40f9a80000b460ae40f901f57ed342008052e766009468b640f9e80000b460ba40f901f57ed342008052f30b40f9fd7bc2a8df660014f30b40f9fd7bc2a8BBBL4;FFa0031df86103009021382f916303009063b42f91a0c300d1a20280526401805212000014a003", - "1df86103009021382f916303009063102891a0c300d1a2028052L4;FF420040f9620200f9530400f9620640f9530000f98f000014620640f9227823f8d6ffff170229009180021091047862f8a4faffb4801840b920efff35800840f9L8;FF097d1853495969780821094a095d1053495969782001084ac0", - "035fd6fd7bbea9f30b00f9fd030091f301009068e240391ffd037180000054f30b40f9fd7bc2a8BL8;FF050000142a008052492109aa0200001449008052098500a92900805209010039f44f4ba9f74b40f9f6574aa9fd7b48a9ff030391c0035fd649008052030900f9L8;FFf8f6ffb4532b40f9e626009", - "4e00318aa21008052e4260094200500b4e10313aae20318aaf60300aaea260094b3835df8acffff17e90313aaf54f43a9f75b42a9BBBBBBBL4;FFc0035fd6e92341a9ea0740f9480108cb395100a9280900f936feffb408138052e91380d2c826089b08f17d92c902088b212500b140fdff54a00208cb020", - "18052L4;FFf85f0da9f6570ea9f44f0fa9fd83029109304039a90b0037010840b9f30300aa150040f9e0e30091f40308aabbe300d1af120094f60f44a9a0e300d1e10315aaL8;FF0000809274820091551b01941f0400f1010300549ffedfc8610240f9810000b4600640f922008052e21a0194e00313aa0", - "105805202018052f44f43a9f70b40f9BBL4;FFe8430391530340b255830f9114410f91970d4092970400b4e95342f9e8b344b900e4006feb1b40f940430091a18301d1a9031af8e9af44b90a050011eab304b9L4;ZFL8;FF810100b021cc1591a32300d182008052e40314aab3831ff8339b009468620091", - "810100b021dc1591a32300d182008052e40314aaa8831ff82b9b00942b9b0094BBBL4;FFf303002af35301b9c00300d000c01f91c30300d063802191c40300f084e02f91e243059161058052f2da01942000805201088052f7da0194e8af40f9e96341b9L4;FB0800000000000000145e440000000000000", - "000000000000008000000000000000800000000000000d858440000000000456e636f64654572726f7272656d6169L8;FF601d0094e8eb41f9eafb41f9e9f341f9eb1342f9e35f42f9f86742f9e84700f9e8ef41f9e06fc13df96b42f9ef7b42f9fc7f42f9e86b00f9e8f741f9e78342f9BL8;FFa80600d1", - "1f0900b142140054e0031baae10315aa22008052e65a01949d000014f3031faae8031faa85000014bf0600b121fb0054f8031f2af6031faa34008052L8;FFe00313aa21008052e75a0094c01001b4e10314aae20313aae00300f9ed5a0094f9d740f9f58b42b9f78f42b9fa1b00f9190a00b4f4d340f9da5", - "a0094e00319aaBBBBL4;FFfc6f54a9fd7b53a9e923526dff430691c0035fd6a2820091f60313aaf30300aae00315aa21008052230080525ddeff97e00313aaf30316aa4effff17000240fdL4;FB494420c00076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f73656", - "e6465725f6b6579732e727300c00f204a756d70696eL8;FFf6635ba9581400b4d922009104000014180700f139630091a013005421835ff881ffffb4200340f922008052e1fa0094f8ffff1728008092e1c30391e20313aaBL8;FF8a010aaa7f0109eb630000540aa403a9c0035fd66801088b6bf17dd328", - "6868380821cb9a0a010aaa0aa403a9c0035fd6fd7bbea9f44f01a9fd030091011840f9L8;FF2300805224008052c990ff97f71740f92afeff176001009000203291e87a0094f50300aae0630091220080522300805224008052be90ff97e11740f9e00315aaBBBL4;FF0a751053087d10133c0100392a050", - "079b58318f8c802f836d60e0091b50600917b1300913f0316eb180f00d1f30314aa41fbff549e010014a02302d180f1ff97L4;ZBL8;FF000803ada10240ad010000ada20241ad020001ad810240ad820ac03de02b813d8082c43c942240f9e127813de22f813de033813d61320054e16742f9e0831391BL8", - ";FF280108aba2060054694240b93f0500716102005469aa4829c9030034290140b22911c0da291540d2290d098b2925019129fd46d3290d00910a0300344a0140b2L8;FFe8ff41f9aa0318f8f5230ba9e80342f9757e42f9fb6300f9fb0b42f9e86b00f9080340f9e95700f9680000b4e00315aa00013fd6", - "010740f9810000b4020b40f9BBBBBL4;FF22008052230080522400805258fdff97610a40f972feff17e00313aa22008052230080522400805251fdff97610a40f978feff17e00313aa2200805223008052L4;FFe0230091040180520506805229f87fd33f1100f13481889ae30314aa0c000094e80740f91", - "f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191L8;FF28010034080140b20811c0da081540d2080d088b0825019108fd46d300050091c0035fd6e0031faac0035fd6fd7bbea9f30b00f9fd030091f30300aad90a0194BL8;FF210300b021e43191230300b063b42f91a0c300d1020380", - "5264018052467f0094b4035df8b3ffff17a0c300d1a82b3da938670094e803002a001c00121f180071L8;FFe88a00944000805241008052e68a0094204200b42800805213000079130300a9e80f00f9130b00f933fb7fd3dd8a0094e00313aa41008052db8a0094804400b4BBBL4;FF22008052230080522", - "400805258bdff97a1035ef822ffff17a0c300d1e10317aae20318aa230080522400805250bdff97b7035ef8ba035df8480317cb1f0308ebL4;FB9c0000002e000000000000000000000008000000000000000800000000000000bcf745000000000025194900000000006a00000000000000020100002e00", - "0000L8;FFec5744f9e15b44f9f06b44f9ed6f40f9e56740f9fe1740f9f56340b9e3b7803dee2749a9e20713adf16748a9e83f00f968018052e0a3803de43f43a9e0cb44a9BL8;FFfd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091092040a9f30300aaa80000b4600a40f901f97fd342008052e14a01946", - "81240f9a80000b4601640f901f97fd3L8;FF09290054088c48f81f0500b1802000544a030094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb481f005439010014BBBBL4;FF00e4006fffbf0a39e85b41f9e95f41f9ea6341f9d6060071eb6741f9ec6b41f91a0", - "dc0daed6f41f9ee7341f93c0dc0daa0833badef7741f95b0dc0daa0833cadL4;FB6420616e206572726f7220756e65787065637465646c7900d5a24800000000004b000000000000007f0b00000e00000000000000000000000800000000000000L8;FF09692138f2570094e10313aa64eaff97803e40f98", - "00100b4610a40f9680240f91f0101eb600d0054680640f9090180522a0400916a0a00f909692138e10313aaBL8;FFe803088b49fbffb5e0ffff170003009000002891ea6a0194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091f40301aaf50300aa214aff97L8;FFc1e2009161838d", - "3c2183cf3cfc030b9160838e3c2083c83c61838f3c2183c93c6083883c2083ca3c6183893c2183cb3c60838a3c2083c43c61838b3c2183c53cBBBL4;FFe80300b008b140f91f0500f189030054e8830091490000f029211591e82703a9e8a30091eac30091e82704a948008052690300f029a10c91a02700", - "d1e1430191L4;FF17050091f30300aa21008052e0f27dd33203009440ffffb4e10314aae20313aaf50300aa430c0094e8031faae9031f2a4a008052eb0315aa050000148d0200b4L8;FF73f3ff97b6835ef8c80a1a8b5a070091ba031ff81b01007914050079adffff17a08300d16af3ff97b6835ef8d70a", - "138b480313eba8fcff54e8ffff1748008052BL8;FF880200d008e10491c9048052e8c302f9800200b000d02e91e8cb02f9880200d008211291a10302d1e303169142008052e9c702f9e9cf02f9e8d302f9c1daff97L8;FFe80356b9e00740918100805200001891ff0316b9e82700b91a2a0094e80356b9e", - "00740918100805200001891ff0316b9e82300b9132a0094e80356b9e0074091BBBBBBL4;FF490108eb63100054aa0240f9e00740f94801088ba82600a9680240f9080540f9150100eb62010054e80f41b2e80300f9e0030091fe070194f44f46a9f72340f9L4;FF22008052eb120094a04700d1aac4ff97e", - "0ab01b9a04700d1a7c4ff97e09b01b9a04700d1a4c4ff97e09301b9a04700d1a1c4ff97e08b01b9a04700d19ec4ff97L8;FF620200b042c03591a1168052f71201942a004039e8048052e90080525f0000712b0440392c0840392811881a5f7d0271490d00120e819f1a3f2500716d0d0012BBL4;FFa8820", - "0911f011beba802019181f2ff5412000014e0031faae10317aaf2920194690308eba001005433fd45d31521009104000014730600f1b5820091e0000054L4;ZDL8;FF400400540a2c40f9093840f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b1", - "1c0da6b1540d26b0d0b8bBBBL4;FFe82b02a943af0094880080d20800f0f208110091d1feff17880080d20800f0f208110091b6feff17880080d20800f0f208110091d8feff17a08302d1a82b36a9L4;FBf24a3743000000f9690b4e804a58484b9385668f4c5814e2a74a03680f3d2088b345ca57446b14", - "a881bae51f14c27b7799f0ed28a3e8081261d832f54bd0e658L8;FFe94f42f9e8eb00f9e85742f9ea2311a9e85b42f9ea8342f9e82f14a9e85f42f9e81300f9e86342f9e92313a9e87742f9e97b42f9e80b00f9e87f42f9e84300f9BL8;FFf4110094e1d342f9fff9ff17e0431691e1031aaae20318aaee1", - "10094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aae5110094L8;FF00013fd6810640f9810000b4820a40f9e00313aae75200949f0b00b101030054e89f40f9c002c03dc91240b9f59342b91f0500b1e063813de99305b960000054BBBBL4;FFe82705a9f7f201947f220", - "03928008092680200f9fd7b47a9f34340f9ff430291c0035fd6080842a9039043a9e00301aae10308aa20c900946022003928008092L4;FB9a96480000000000330000000000000017020000050000005369676e616c5f504e495f5369676e617475726576657273696f6e20646f6573206e6f7420666974", - "L8;FF42070054217c0353610700343f040071a00200543f080071000100543f0c007100fdff54e20313aa230c805275ebff97e10300aae8ffff17888241f81f0500b1BL8;FFaae357382901084aabc31738abf35738a9d31738a90358384a01084a6b01084aaae31738aa1358382901084aabf31738ab235", - "838a9031838a93358384a01084aL8;FF080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308eb48310054e6010014e1d342f9e8cb42f9f4074091948209911f0101ebBBBL4;FF129cff97a1637ba9a00e00b4a11000b4f90300aae00318aa22008052e5b20194e00319aa", - "7f000014a88355f81f0500b18100005428008052bf8316f8bfa335a9L4;ZBL8;FFa00100f000e03991edb20094a00100f000c03891edb20094a00100f000003691e7b200942000805201048052eeb20094a00100f000203991e1b20094ff4303d1BL8;FFe05306f9e0833291a102009021c00a9102028052", - "a30200906364179174000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f9fd270094e80300aaL8;FFa2018052e30000b06374059144018052e84b05f911000014c80080d2e0632a39e0432a910800f0f2ff672a39e84b05f9ff27ff97e80300aae84b05f9e0432a91BBBBBL4;FFc80100372", - "92100916003098b1b00188a296b7bfc208d282e0800669e1cc101f2e1fbff54f4ffff1740077fad28008052e08700ad02000014e8031f2ae08740adL4;FFffef01f9fff701f9eaff01f9ff0302f9ff0b02f9ff1702f9ff1f02f9e82302f9e92702f9c7eaff97e8df40f91f0500b1c01b0054e0e30191e1e3", - "069102288052L8;FF8806148be00313aa01f17dd302018052f44f42a9f65741a9fd7bc3a8e5020114f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091BL8;FFe323009182008052e80700f92b830194fd7b41a9ff830091c0035fd6010300f02170299182008052208301140", - "80040f9e00301aa090140f93f0500b1e0010054L8;FF080140b20811c0da081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d2BBBL4;FF62000054e9031f2a0500001463001036095040f9490000b429008052f44f", - "43a9f70b40f9f65742a9fd7bc4a80921003929008092090100f9c0035fd6ff8302d1L4;FB6a00000000000000800000002e000000576869737065725072654b657953656e6465724b6579506c61696e746578740034684900000000006a00000000000000L8;FFeecf43f9f2d343f9f1d743f9e0db43f9e7", - "f343f9e3e35e39ebbb01f9eb0316aae4e343f9e5e743f9e27744f9fc7700f9f66740f9f02340f9fc5300f9fc6f40f9BL8;FF080d088b0825019108fd46d308050091b60a40f9f60b00b4c90240b22911c0da291540d2290d098b29250191c91a498b29050091b41640f92801088b140b00b4L8;FF00f82f9", - "108210091e1c30e91e9db01f9eadf01f916430094080100b008f90691e9008052e8271ba9fa0741b2e8df40f92083c13ce8c700f9e8a759a98082833cBBBBL4;FFf843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb63d300541803008bf9feffb50f0000141f0400", - "b1c1d2005400e30194L4;FB0100000000000000ac8f4300000000007fea4800000000004e00000000000000b9040000170000007fea4800000000004e000000000000005707000005000000L8;FF6083c03ce9d743f91f0500b1e0d7823de9b305f960150054e0efc13de1f3c13d1f0700b1e2f7c13de9f3", - "43f9d60600d140071eade0d7c23deab345f942fb803dBL8;FF21003b910004803d1f800039f44f42a9f50b40f9fd7bc3a8c0035fd60001805201058052fb620194fd7bbda9f65701a9f44f02a9fd030091f30303aaf40302aaL8;FF280800f94cfeffb40a7c15533f0108eb53611932200100542a0440f90", - "bfc63d35369283808050091280800f94b0200b5e0030caa7a000014e10300a9e00301aaBBBL4;FFb80200b4e30318aa05a30194800200b520008052e10318aaf3a20194e08742ade83b40f9681a00f928008052608600ad686200a917000014e08742ade83b40f9L4;FF15000014d60210917f7e00a97f7e", - "01a9c10a40f97f1200f9810000b400008012610600f964000014734e00a900008012d30a00f9f35341a9fb7345a9b2feff17L8;FF84802391e323009182008052e80700f92aa30094fd7b41a9ff830091c0035fd6080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091BL8;FF2", - "0001fd6ff4302d1fd7b06a9f53b00f9f44f08a9fd830191e20300b4f30302aae90301aa018840a9350101ebe2cf00a9630400546a0209abe20900544b0001abBL4;FFc1025ef8810000b4c0825ef822008052e8220094c1825ff8e1feffb4c00240f922008052e3220094f3ffff17681640f9280100b4080", - "5088be00314aa01ed7cd3L3;ZBBBBBBBBBL4;FFb50a00b4000340fdfb0740f9fa031faafc0318aa0088202e0800669e15c10192f50000b5808f40fc5a2300910088202e0800669e15c101f260ffff54a802c0daL4;FF39008092b80000b4e00315aae10318aa22008052e71c00943f0b00b1c1020054e813", - "40f9e9a34039e80b00f9e96300399704003648ff70d349ff60d3610a40f9L8;FFffc300d1fd7b01a9f44f02a9fd430091f30300aa930200376142009100008092744200914e1d01941f0400f1010300549ffedfc8610640f9a104f8b7600240f9BBL4;FF09010a0b6d020acbea1b00f9e9430339e9430391", - "4a0100b4ea1b40f92801088be90315aa2b0140390c1540384a0500f18b010b4a2b15003861ffff54b4fd46d3L4;FF130040f9e00313aa930000b4d8ffff97733a40f9fcffff17000000f000d843f9d3ffff97000000f000d843f9d0ffff97000000f0f30b40f9fd7bc2a8008840f9L8;FF4a25019129194a", - "8b29050091280108ab220a0054090140b22911c0da291540d2290d098b2925019129fd46d30801098b080500911f0109eb49090054091c40f9BBBL4;FF08530039e8a7542909570039085b0039e8a75329095f003908630039e8a7522909670039086b0039e8a75129096f003908730039e8a75029097700", - "39087b0039L4;FB0800000000000000604644000000000053797374656d54696d654572726f72005b3d4519636b5385357d08270063454c1e6a715c903e89072e00000000000000L8;FFeaeb41f9efef41f9f7f341f9e9f741f95f0900b1e9fb00f961000154e8fb40f9772201a908008092683e00a98c0e", - "00140823403908051f121f09007141020054BL8;FFfc074091e00740919c83099100c0359188830e917fcf0094e0074091e1074091023280520080019121c03591e95c0194e0ffc33de103c43d80430891e207c43dL8;FF03000094760a40f9adffff17ff0301d1fd7b02a9f44f03a9fd830091480001aba", - "2020054010840a9f30300aae023009129f87fd31f0109eb0881899a09018052BBBBL4;FF1f0500b1e923013940010054e0430c91f7430c91136c0094f68b41f9e0030791e1220091022a8052eafc01940200001416008092818a40a9e0430191f4430191L4;ZFL8;FFa00600543f080071600300543f0c00", - "71210700541f0800f1410d0054e1230091e20313aaffdf00a9ff0f00f9e7faff97a00d00b5991640f9880e40f93f0308ebBL8;FF290500912801088b5f050071000300540a0c40f908011f8b5f0500b100040054091440f92a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091L8;FF550", - "300b4e11740f9e80f40f9965640f91f0101eb80390054e81340f9490480522a040091e00315aaea1700f909692138e16300915a7cff97f71740f9e80f40f9BBBL4;FFf3a4ff9728008092686a00a9f44f52a9f65751a9f85f50a9fa674fa9fc6f4ea9fd7b4da9ffc30491c0035fd6fc2f40f9fb2340f93f0", - "400b1f91740f9fa0f00f9L4;FB4e00000000000000f904000019000000f7874900000000004e000000000000000105000014000000ff884900000000004a00000000000000b602000009000000L8;FF080200d008b140f91f0d00f1c302005468008052e901009029713391e82707a9e801009008a132912", - "a0d8052ff2704a9c90100d029010691e82b09a90a0b8052BL8;FF280108ab8300005410000014e80308abc2010054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054L8;FFe00315aa00013fd6e10640f9810000b4e20a40f9e00315aae63c00", - "949f0b00b1e0080054e8430c91a6000014776a41f900c3c73c01c3c83ce90f44b9f6eb43b9BBBBBL4;FF5cfdff97b5a201f1e10316aa41ffff54887e40f91f0500b1c0100054610a40f9680240f91f0101ebe0300054680640f9981241b9490980520969213828040091L4;FFe1db853de2df853dc6eaff9", - "7e043139139ebff97380100b4e0c740f9e10318aa04000014b60000b4e00319aae10316aa22008052df0c0094e0e30e91a6eaff97L8;FFf40301aaf50300aa3f8000f1f30308aa21020054e0230091e10315aac2faff97e823403988010036e89340f8e91341f8684200f80800801269c200f8680200b9BL", - "8;FFf30308aa5a7fff97e80313aaf35741a9c7ffff17e0230091f30301aae10314aae20315aa2300805224008052507fff97e10313aaf35341a9cdffff17200300d0L8;FF41008052e88c0094e06b00f9408200b4e48c00944000805241008052e28c0094e06700f9808100b4de8c0094400080524100805", - "2dc8c0094e06300f9c08000b4BBBL4;FF98ee40a9e9031faa15000d8ac96975fc208d282e0800669e19c101f260030054e92f02a9ee3701a9ef0700f92803c0da0811c0daa80e488b08010d8adc1908cbL4;FB5a6151714c4147512ea125b13881339102e109f114c11fd1cd31c621db11d001e171ea61f7", - "51fc4195b19ea183918881b9f1b2e1afd1a4c1ec42e752fa62f172L8;FFe9bf42f961520054e8c342f91f0112f1015200543f0700b1c0530054e95b00f9f50314aaf4db42f9e9e742f9e8eb42f9f66300f9e82300f9e97700f914e900b4BL8;FFc1f7ffb527feff173c008052e8430691e0430f910560ff9", - "7f82740f9e81f40f91f0308eb61000054e0e300915083ff97080d8052e92340f90827089b29008052L8;FF081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b250191BBBBL4;FFe20313aa230080522", - "400805258dfff97f90f40f9f80740f972ffff1720008052e10319aaf0ec0194fd7bbda9f50b00f9f44f02a9fd030091152040b9f40300aaL4;FB010000000000000008fb420000000000496e76616c69644d65737361676546666942696e64696e674572726f720000000000000000000000080000000000", - "0000L8;FFe10313aa66ecff97801a40b980010034610a40f9680240f91f0101ebe0050054680640f9090180522a0400916a0a00f909692138e10313aa59ecff97801e40b9BL8;FFe32400540a0340f9ba035df84801088b080300f9290300f948ff60d3a80a00b5400b40921f1800f1a20a0054417f0353c", - "10a00343f080071ed0100543f0c0071L8;FFe80b41b9010340f908830bb80083893c01838a3c810000b4000740f922008052e46c0094a0077dad7b0200f9e8a743a96082803ca003dc3c6182813c6082823cBBBL4;FFffc307d1fd7b19a9fc6f1aa9fa671ba9f85f1ca9f6571da9f44f1ea9fd4306919f80", - "00f1f30300aac1050054f60302aaf70301aae0430291e10303aa02048052L4;FF680640f9e10317aae20315aa0001168b480e0094c802158bf502158b680a00f9ceffff17291040b83514009108fd0f37ea031faa08fd1737eb031faa48001836L8;FFe83b01f9e84701f9e85301f9e85f01f9e86b01f9e8", - "7701f9e88301f9e88f01f9e89b01f9e8a701f9e82340f9e93f01f9e90340f9f87b01f9181140f9f76f01f9BL8;FFa80300b4e8ffff900891289149ffffd029e13591bb2336a9a84303d1a82737a928008052890200f029e10491aa8302d1a04700d1a8273ba9880200d008ed3391L8;FFe9a703f9680000b", - "4e00314aa00013fd6e10640f9810000b4e20a40f9e00314aae42c009476000036f7030291fc030014e8631d91f6030291e95b47b9083140b8BBBBBBL4;FFe08300910a0a0194f40300aa7f0a00f9e00314aaf44f48a9f65747a9f85f46a9fd7b45a9ff430291c0035fd6f4031faaf8ffff17ff4301d1fd7b", - "03a9f44f04a9L4;FFff0600b180270054e9af4bf9e2b34bf92c008092f7bb00f947010014da7e0853fb0308aaef031a2ac2070014e9ef59a93a7f085328ff60d33cff78d3ab0000d0L8;FF11121a33cf090091f003112a31c200513f2a007122fbff54cdffff1730320f2acf0d009111c200513f2a007162", - "faff54c7ffff173f1100f1c00200543f0500b1BBL4;FFf50f00f9eb9401945b0315cbe00317aa4e6c0094f60301aa3f001bebf70300aa49050054e0230091e10315aae20316aa23008052240080524d87ff97f45741a9L4;ZBL8;FFfd030091011840f9f30300aa1f3000f93f0400b140010054810000b46", - "01e40f922008052e3940094612640f9810000b4602a40f922008052de94009408008092BBBL4;FF200100543f080071c1faff54c1620091a2a302d1e003082a0cbeff97a0faffb49a010014c1c20091a2a302d1e003082a15bfff97e0f9ffb48b010014a0a302d1L4;FB7365637265742e65706f6368203d", - "3d2073656c662e63757272656e745f65706f6368202b20310000e82049000000000049000000000000006901000009000000L8;FFf00308aaea0312aa08008092e87700f9e8030eaaee0311aaf10317aaf74f40f93d060014e8fb41f9e90742f9f0030aaaeb0b42f9e3cf42f95f0500b1e8e700f9BL8;FF0", - "90180522a04009109692138e1431691ead302f99a0d0094df0600b18000005480c20291e1431691c01000941f0700b14086ff548122029110010014e8031faaL8;FFe95f04f989fdffb029312291e8a305f9e8c32791e9a705f915550094e89b40f9e9c316910a0000f04ac10191e9a305f9e9c32791e85b", - "04f92800009008612091BBBBL4;FF0900f0f229017fb24a1d409208010aaa692200a9fd7b44a9f32b40f9ff830191c0035fd6ffc304d1fd7b0da9fc6f0ea9fa670fa9f85f10a9f65711a9f44f12a9L4;FB206465636f64652073657373696f6e207265636f72642070726f746f6275666c6f61645f657869", - "7374696e675f73657373696f6e734d65737361676520776173L8;FFd0ffff17e003082ae20313aa430c80527cedff9760f9ffb4c0ffff17a80640f91a0101eb020100547d000014e10314aae20313aae5f2ff97401100b5e1031faaBL8;FFfd5aff97800e00b5bb035cf8fa031baa428f40f8421000b4610", - "340f9360080399600f8b728040091490400d1110000145f2800f1880000542800028b08f1df38L8;FFe243169140008052fd150094e3ffff17e043169122008052fd170094e1d342f9e5ffff17f85f49f9580300b4e1d342f9e8cb42f9f95b49f91f0101ebc0bf0054BBBL4;FF840300d084a01f91a20700", - "d1e1038052f8b40194fd7bbea9f30b00f9fd030091010040f9130840f93f0013eb69010054000440f922008052b30100b4e30313aaL4;ZDL8;FFf30300aa1a5040b91b0840f9e92300a9e30b00f9971200b4e2b40094e00317aa0101805218018052dfb40094e30b40f9f60319aaa0fdffb4d91100b47f03", - "03ebBL8;FFe03fc33d0015803de98346f9093100f969060091e02bc33d0001803de02fc33d0005803de033c33d0009803de9cf05f9a88357f8080540f9882600b4a02302d1L8;FFa1c20091a22302d1e9f3ff9720f6ffb48d010014a22302d1830c805231efff9780f5ffb4d9000014a1620091a22302d1d", - "ff3ff97e0f4ffb474010014e1c32491BBBBBL4;FFa9ccadf28accadf2a8accdf2a9ecccf22a4ccef2e86deef2298fedf2ea8decf2080008ca090009cae00702a9e82700a928000aca6aae8cd28a2eaff2e0030091L4;FFe8040094e00313aa21008052e6040094400300b4e10317aae20313aaf60300aaec", - "0400940200001436008052e80b40f9e083c13ce103c03db35a03a9e82300f9L8;FFb50600f1d6620091e0000054c1825ff881ffffb4c00240f922008052e5040194f8ffff17680e40f9280100b40805088be00314aa01f17dd302018052f44f42a9BL8;FFc0035fd608200091200440a9e92300910a0000d", - "04a211591e8a700a9020300f0421c3d91ea0f00f9e3430091fe840194fd7b43a9ff030191c0035fd608200091L8;FF88031aebc900005402f57ed3c0120091e10316aae98400942e00805288070091d8020079db060079a80a00f9b0ffff17e00315aa66cdff972e008052d2ffff17BBBL4;FF3800805219", - "0380521a018052810340f9340080399400f8b728040091490400d1110000145f2800f1880000542800028b08f1df38a813f837e0e31591b12d0094L4;FB8b634900000000003800000000000000490000000a0000008b634900000000003800000000000000520000000c0000008b6349000000000038000", - "00000000000L8;FFe0c30391e86300f9e8c343f9c122019102298052e093803de9a306a9e9c743f9e8d343f9e93f00f9e9435e39e95f00b9e903099128f100f8e6c40094efc31391BL8;FFc10200b021800891c30200b063400d91e023009102018052a4008052e80700f909000014e00700f9c10200b021", - "800891c30200b063540d91e023009102018052L8;FFeda305392b1f0036ebd343b9e96306394921c993e8cb00f9ecab4779e31b40f9eb3b00b9a00302d1e2e300918b1245f8e8fb0039e10319aae8b340f9e97304f8BBBBL4;FF0fe501941f10003121140154f9ffff170ce50194f70300aa1f0400b141fd", - "ff54e04305918100805207e5019400130135fc5341b957ffdfc8d70200b4ff0600b1L4;FB5600000000000000830000002700000073686f756c642062652061626c6520746f20656e636f6465206865616465722073697a6500000000d6e6480000000000L8;FF680200399f0600b1e0010054f38743a9e0", - "0313aa88e2ff97d40000b488e279d3e00313aa02018052011114cbe1e40094e12740f9810000b4e02b40f922008052BL8;FF01018052e8640194200100b4140000f9e10200f021003691130800b91f300039f44f41a9fd7bc2a8c0035fd60001805201028052f7640194fd7bbda9f50b00f9L8;FFe103009", - "1e3230091e40302aa4c650094420700b4fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd0300914804028b49008052f30303aa340d002a39400091BBBL4;FF0140c13c6212803d685200b9600600ad21010054f44f5ea9fcd340f9f6575da9f85f5ca9fa675ba9fd7b59a9ffc30791c0035fd6600300d", - "000000f91620300d0L4;FF60030034dbfcff97000040b91f980071e0020054f55b42a9f76343a90b000014151c00f91b000014201040f920f4ffb4330c40f9000400d19402109161a20091L8;FFe1020054a80100f008210c91e00301aae10308aa8202805224a50014ffc300d1fd7b02a9fd830091e0070", - "0f9200440a9e8230091090000d029c13291a2010090BL8;FF0a1c40390c9100b80c0880520b050039ac1500330bf040f80a2100390ab040b80b3901a90a0d00b90c810039c0035fd649008052010900f90921003929008052L8;FFb4f35938a2039e3ca0073eadc0f2c03cc0f2863ce32400940008805221", - "008052e1240094c00200b4a0077ead971a0033a203de3c080880527f0200f917fc0039BBBBBBBL4;FF750300b476c2009104000014b50600f1d6a20191c0020054c1025df8810000b4c0825df822008052e2180294c1825ef8810000b4c0025ff822008052dd180294L4;FFe103172aba100094e12b40f9e", - "92340f9280101cb1f2500f149150054e91300f9e22740f9a80000f008c12e91080140f938280091296f8e524a00018be0030191L8;FFe00313aae10314aae20315aaf96300a9a873003904190194a0000035d60600f1c1feff54e0031f2a0200001420008052f44f45a9f91340f9f65744a9f85f43a9BBL4", - ";FF08f15f381f010271e1020054220400f109008092e8a30691b6e303d1e08b1aa9a98310f8a90312f8a98313f8a90315f8a98316f8a90318f8a98319f8a9031bf8L4;ZFL8;FF6901084aab335638a91316384901084aaa435638a92316386901084aab535638a93316384901084aaa635638a9431638690", - "1084aab735638a95316384901084aBBBL4;FF810000b4e00740f922008052e9d80194c082c23cd70240f9080d8052e90c80922227089bc1a20191a0039b3ce00316aac082c33ca0039c3cc082c43ca0039d3cL4;FB743253616d706c6564001b737071722076312e73656e645f63742e726563762065706f", - "636820c0022d3ec01b3a2043743253616d706c6564202d3e204b657973L8;FFea0304aae40310aaf00300aae00316aaefdb4aa9e60307aaec0315aae7030baaeb0317aafa030faaf50305aae50312aaef031eaafe0308aae8030eaaee0311aaBL8;FFc0bf0054e8cf42f9490480522a040091e00318aa096", - "92138e1431691ead302f997110094fad342f9e8cb42f908011acb1f0308ebc8be0054e8cf42f9e10319aaL8;FFf63b06f9ff3f06f9ff830cb91f0800f1e1350054a02302d117f5ff97800a003621f8ffb4dc01001401c30091a22302d133f4ff9780f7ffb49c010014a22302d1BBBBL4;FF090d40f9e8030", - "09120013fd6e80340f91f0d00b141030054880200f9680080522a000014785e40a9f50301aa762240b9dcf801940003805201018052daf80194L4;FB65203cc0013e001f756e74727573746564206964656e7469747920666f72206164647265737320c00018696e76616c6964204d4143206b6579206c65", - "6e677468L8;FF20020037750240f9a80640f9160101eb02030054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e0030091fcedff97BL8;FF9f0700f12b010054f40300aae00319aaf60301aae1031caa22008052e5780194e10316aae00314aa3f0400f16b000", - "05422008052df780194ff0600f1ab000054L8;FFe8074091e00319aa0178805208812f914df0ff97e8f34df91f0900f1203c0154e0074091e10740910232805200c0359121802f91f4432591e6780094fc074091BBBL4;FF400109cb01250091eab80194f35349a9b40100b47522009104000014940600f1", - "b522019100010054a8825ff888ffffb4a00240f901f57ed342008052ddb80194L4;ZBL8;FFae696a384a0500915f010cebcf194092ce1d0013ef21cb9ae90109aa620500546b1d0091eefeff37280000146c0400f1400900549f2900f14d018052eb031faaBL8;FFe00301aa227968f8a90200d029a13391", - "287968f8e10308aa24390114fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e0030054e00313aa40000094L8;FFf438009460c21491e1432a9102248052757e02f9748202f9778602f9788a02f9768e02f97a9202f97b9602f9e9380094681242f969e21391600e42f9692a03f9BBBBBL4;FFe", - "02300910afe0094e90300aae90700f9210400b021a01f91230400b063c03591e023009102028052e401805242fd0094e00740f9f44f4ea9f95b40f9f6574da9L4;FFf44f06a9fdc30091350840f9b500f8b6f8031faae00318aae10315aaf2080094f40301aaf30300aa750000b5360080520c0000149706", - "40f9da080094e00315aaL8;FFe92b01a91a090194fd7b42a9ffc30091c0035fd6080840f9280100b4090140b22911c0da291540d2290d098b292501910819498b00050091c0035fd6e0031faaBL8;FFf44f03a9fd030091084841b9f30300aa88060034080140b20811c0da081540d2080d088b082501910", - "8fd46d308050091690a40f9c90500b42a0140b24a11c0daL8;FFe10317aaf8880094620100f042003891e10314aaec880094600100f000003191630100b063a02591640100f084803191a24700d121038052ee880094630100f0BBBL4;FFc90200f9f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbaa9fc6f", - "01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ffc30bd1590080d2f40301aaf50300aaL4;FB28294368756e6b00000000000000000008000000000000000800000000000000bc0b46000000000054727946726f6d536c6963654572726f7200000000000000L8;FF88071c8be00317aa0201805201", - "f17dd3e8c80094795a01a994000014f80301aabf0600b1c0350054960100b49722009104000014d60600f1f7620091e0000054BL8;FF3940009118f17dd30b000014680640f9e10316aae20315aa0001178bed480194e802158b680a00f9186300f139630091c003005436d77fa9e00314aae10313aaL8;F", - "F080d088b0825019109fd46d30800098b080500911f0109eb69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff54000100d000c01791BBBBL4;FF3f0015eba24b0054080d80523360089b782240f9d80100b4097f089b681e40f9fb031faa08e1009122a101d1092940b93f0114", - "6b402a005442a001d17b070091L4;FB000000000000000008000000000000000800000000000000304b420000000000000000000000000008000000000000000800000000000000304b420000000000L8;FF1f0800f101330054a0c303d1d3e7ff97a01e0036c12900b410020014e8cb40f91f0500b10101", - "0054ff6f19a9df7e04a9fcdb00f9ffdf01b9df7e06a9df8205f8BL8;FFea1741b2092100390a0100f9f44f42a9f50b40f9fd7bc3a8c0035fd6290480d20900f0f2090500a9f44f42a9f50b40f9fd7bc3a8c0035fd62000805201c48052L8;FFea0310914b0000906b2102911a0380d2400100b000380b910", - "8210091e1430691ea2f19a9e90702f91a00f0f210690094e81f40b9e8030639e10740f9c1f7ffb5BBBL4;FF2300805224008052599bff97b6035cf8dafeff17a04301d1220080522300805224008052529bff97a1035cf8e0feff17a04301d1220080522300805224008052L4;FF56cc218bf50300aad622", - "0091f35301a9f303012af40302aae7ffff97e20316aae10314aae003132aa0023fd6e4000094fd7bbda9fd030091f35301a9f30302aaL8;FFa003913c22020054e10740f98003148be20319aaefa800948802190ba8f31438290080521ffd0071ba0218cbe803082ae9830039a0050054aac303d14969283", - "8BL8;FFf628019400e4006fff7f0e39e8d341f9e9d741f9eadb41f9f0830c91ebdf41f9ece341f9080dc0daede741f9eeeb41f9290dc0daa0833badefef41f9a04302d1L8;FFf5ab44f9e11b42f9ffe71639810000b4e01742f922008052e6280094e8a340f91f0500b160000054e00203915ce7ff97f45b", - "53a9960100b49722009104000014BBBBBBL4;FF090d8052e083c33ce822099be0031faa000d803de083c43c0011803de083c53c0015803de93740f9093100f9e9060091e083c03c892200f90001803de083c13cL4;FFe2030e9100401d913c050094e8ab4bf91f0900b1416b0054d4060031f53f00b92286", - "0054a04700d1f50316aaa2c2ff97e08b01b9a04700d19fc2ff97e08301b9L8;FF63403391640200b084c03791a24300d1c10a8052a8031ff8a9831fb8f5100194ff4301d1fd7b03a9f32300f9fdc30091f30308aae843009158ffff97e8834039BBL4;FFf44f42a9fc5741a9fd7bc3a8c0035fd67f220039", - "7f0200f9ff074091ff830a91f44f42a9fc5741a9fd7bc3a8c0035fd6280080527f0200f968220039ff074091L4;ZDL8;FF62028052fd7b44a9ff43019127910014880100d0080d2e91e00301aae10308aae2028052fd7b44a9ff4301911f910014880100d008692e91e00301aae10308aaBBBL4;FFe8c302", - "91a04302d1a0873bad8ea90094f66340f97609f8b6f9031faae00319aae10316aaf0d00194f7031aaa5a011ceb20010054090e8052085d099b9823099bL4;FBd4c2dfa47d287026a4e47b400668764ed2aaa9eaaf82d9cc0b66a28c926eed22000052a40c87415afd8c210dbdee0afa8b2e98bb0f14d86a9", - "b2209ee06fade90L8;FFe1233391022f8052f77300f9e0f3803df0d00094e86346f9f80748a9ea2f41a9e02bc33de81b01f908008092e12fc33dfc0318aae87700f9f57b40f9f8030baaBL8;FF6082823ca1037bad092300a9e81b40f96182833c6082843ca1037cad080b00f96182853c6082863cb90000", - "b4e0031aaae10319aa22008052de500194e12740f9L8;FF800705ad400743ad8233803de8bb02f9800703ad420344ad820304ad410341ad810301ad420342ad820302ad410340ad810300ad800745ad8233c03de8bb42f9BBBBL4;FF603fc03d6143c03d6247c03d634bc03d6327803d6223803d611f803d", - "601b803dff020039e28f42ade51fc03de00741ade413c03d6507803de323803d6507c03dL4;FBea984800000000002e000000000000006f0100000e000000aa914800000000005e00000000000000060400000900000085924800000000003300000000000000L8;FFfd7b03a9f92300f9f85f05a9f65706", - "a9f44f07a9fdc30091081c00121f09007181010054e00302aaf30302aaf40301aacaefff9720020037750240f9a80640f9BL8;FFef700194000300d000603991ec700194e00200f000601c91e9700194fd7bbda9f50b00f9f44f02a9fd030091010c40f9f30300aa1f6c00b93f0400f18b000054L8;FF2a0", - "4009180c202914901805209692138ead302f9882a0094e1431691a70d0094e0a349f9800100b4e1d342f9e8cb42f91f0101eb406b0054e8cf42f909018052BBBL4;FFe96b00b9a9935b38eb830439e97300b9aa8310b8a80000b4e01f40f9e12b40f922008052e3b00194a06303d1e10316aa22008052230", - "08052c8e7ff97a8e772a9L4;ZBL8;FFe00319aa0108805222008052e9b00094e11340f9f50b40f9fa430e91810000b4e01740f922008052e2b00094e11f40f9810000b4e00740f922008052ddb00094BL8;FFf4833291480f00b4e89b40f9e9c31691eaffffb04a912891e9a305f9e9c32791e8fb04f9680", - "200b008c10d91e9ab05f9a902009029e10491e8af05f928008052L8;FFe85305f9ff5705f9ea5f05f9e86b05f9e96f05f9f3300094e1f343f9810000b4e0f743f922008052e2300094a8b240f9280700b4e1eb41f9e2ef41f9e8432a91BBBBBL4;FF381740f9b8f5ffb539008052c00642a9a21300d1bcc3", - "1fb8f3fbff97c80a40f9c8f6ffb5c2820091fa0300aae00316aa2100805223008052d0e3ff97e0031aaaL4;FFe10340f9700100941f0000715a139f1ae1d340a9810000b4e00f40f922008052e400009474deffb4e02b40f9e10314aa22008052df000094eefeff17e1e740f9L8;FF2c540c0b810148516b", - "00f8378b0080523a0000142b7c1c534b0a00344d11c0390b00be522b000b0bac1d00128d00f83761710c8bab008052300000144d15c039BL8;FFffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa010300f021e02f91e8030091420280522e81019468620091010300f021082a91040300f084e0", - "1291L8;FF680500b409e179d3961e40f957038052331108cb0400001473c201f1d6c2019160040054e11740f9e80f40f91f0101eb00030054e81340f929040091e00316aaBBBL4;FF03000014a9030090297d36910a0380528b0280d20a0900f90b00f0f20b2500a9f44f45a9f71b40f9f65744a9fd7b42a", - "9ff830191c0035fd62000805201048052L4;FB6420726563656976657220636861696e206d657373616765206b6579737375636365737366756c206465637279707420616c776179732068617320612076616cL8;FF22008052ebc00094e8830291e94310912001029101010291a9160094a00f7ead48008", - "0d2a10b7bad0800f0f2f62702f9161d00914083843ca003d83c4383853cBL8;FF090180521f2100f11481899ae30314aae9000094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faaea400194L8;FFe80700f907000014c90080d248008052e043003909", - "00f0f2e8470039e90700f9e02300910236ff97f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6BBBBL4;FF61940054f9ffff170ee10194f70300aa1f0400b141fdff54e04305918100805209e1019440930035e85341b9e87f00b957ffdfc8d70200b4ff0600b100030054L4;FB000000000000", - "000000000000446a626e6f206b65792074797065206964656e7469666965720e626164206b65792074797065203cc3200080690400013e00696eL8;FF0d3157a9ea271fa90aa543a9e36f1ea917394fa9edef00f90f5550a9ea9300f91e1552a9e9db00f90aa544a9ec5700f90d3158a9fa8305a91af940f", - "9eacf00f9BL8;FFf44f02a9fd030091f50303aaf303022af403012af60300aae26001940006805201018052e0600194400100b4165400a9e10200f021600791144c04291fa00039L8;FF0900f0f2a0c300d1a8931d38a9031df80756ff97e10300aa74000014c80080d2e0430039e02300910800f0f2ff47", - "0039e80700f9fe55ff97e80300aa210100f0BBBL4;FF490300b029b10d91e1c30191e82704a9280080526903009029a10d91e8270aa9480300d008a12991e82b0ca94a06805208048052ff2707a9490300d029d52891L4;FFc0035fd6dbf8ff97000040b9fbffff17c0028052c0035fd6fd7bbea9e20300c", - "b1f0022eafd0300914200008ae1030054e30322aaf35301a9f40301aa7f0014ebL8;FFffc30091c0035fd6ffc300d1fd7b02a9fd830091080040f9e90301aaa10100d021d80d91e00309aa42008052e80300f9e82300911aa10094a20100d042803091BL8;FF15000094e10314aae00313aa082440a90a08", - "40f90b01018b280101ebe933889a480101eb0b2400a9a3000054080800f9f44f41a9fd7bc2a8c0035fd6800200b0BL4;FFe2031faa00013fd6e0031faaf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a939fdfe97e0230091f7a700a936fdfe97e00313aaL3;ZB" + "BBBBBBBBBL8;FB7071722076312e73656e645f656b2e726563762065706f636820c01b3a2048656164657253656e74202d3e204374315265636569766564003c5472696d6d696eL8;FFf50300aa24feff9084603491e6030091e00316aa85048052070c8052e20314aae00300ade00301ade00302ad82080", + "094b71e00f9b3a400940004805221008052BL8;FFc10000b4603640f922008052f30b40f9fd7bc2a8b8240114f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aa810000b4L8;FF8b0080523a0000142b7c1c534b0a00344d11c0390b00be522b000b0bac1d00128d", + "00f83761710c8bab008052300000144d15c039ae1d00128c1d0e0b8c010251BBL8;FF880a40f9775a00a968a608a968320591776e01a97a6e02a9610206a9613a00f96082873c697e00f9699600f9784a01b91f0100f97f5601b9f44f45a9f65744a9L8;FFa3fdfff063e02591a0c300d142018052a40080", + "52a8031df87f6aff97a1035df8e80740f9f30301aac80000b4e00b40f9e10308aa22008052af640094e10313aaBL8;FFe8230039480080520900f0f2e8270039e90300f9dfffff17e00300f9a1feff9021481391a3feff9063801391e0030091c2018052640080521a000014e00300f9L8;ZDBBBL8;FB000", + "000000000000000000000000000000900000000000000090000000000000058824000000000005f8240000000000000000000000000000000000000000000L8;FFa1000054818a4e29e3630091c00080529ea4ff979f0f00b100020054e11740f9e80f40f91f0101eb607c0054e81340f92a040091e00315", + "aa49038052ea1700f9BL8;FFe2bf0a39c3040194944200919f0219ebc1faff54e08756ade8830c91e2bfc03d14010291e1031f2ae0071eade08754ade2fb803df9f741f9faf341f9e0071cadL8;FFfd7bc2a8c0035fd6ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091040", + "180520503805229f87fd33f1100f13481889ae30314aaBBL8;FF4a1540d24a0d0a8b4a2501914afd46d34a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010a8b2a0140b24a11c0daL8;FFe90200aba20c0054aa0217cba8831cf8a8c300d1a02301d1a9ab3ba", + "95648ff97a8035ef8b7031ff8140117ebe3070054b8237da9b6835ef81501178b680240f9L16;FFe97f00f91f0d00f1e36500548801009008411f91fb3300f9e8ef01f968feff9008e11e91fbf346a929038052e8a303f940feff90009c1a91e8ab03f968feff90BBBBL8;FB4c00000000000000e2000000", + "14000000a1104000000000004d00000000000000e802000005000000a1104000000000004d000000000000005303000009000000L8;FFf65743a9f85f42a9fd7bc5a8c0035fd6e00301aa01fefff021a00391a2018052ec900014fd7bbfa9fd030091082440f9080100b4080140b20811c0da081540d2BL8", + ";FF1b000014e80308ab22030054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054091440f9090100b4L8;FFa04700d157c2ff97e0a700b9a04700d154c2ff97e0a300b9a04700d151c2ff97e09f00b9a04700d14ec2ff97e09b00b9a04700d1", + "4bc2ff97e09700b9a04700d1BBL8;FF0151019420008052e10313aaf550019420008052e1031caaf3500194ff8301d1fd7b04a9f32b00f9fd030191098440a9f30308aae8230091e00309aa1f4f0094L8;FFc80000f0a9050036081140f9e92740f91f0500f109030054080000b008c10b9160fdff900068", + "3891a92338a9e8632291a900009029411f91a10302d1a82739a9L16;FFbcddff97080700d1fa031c2a1f0900b1a2000054e00319aae10318aa22008052b5d40094ff0600f1ab000054e0b740f9e10317aa22008052afd400949acd0736BBBL8;FF23008052240080522b000094770a40f96afeff17e00313", + "aa22008052230080522400805224000094610a40f971feff17e00313aa220080522300805224008052L8;FF007fff5401c30391e24316916000805213110094f3fbff17e8031faa00011aab62670054e14316914f0d0094df0600b18000005480220291e1431691da120094BL8;FF810000b4601240f9220", + "08052baf40094611a40f9c10000b4601e40f922008052f30b40f9fd7bc2a8b3f40014f30b40f9fd7bc2a8c0035fd6210400b4fd7bbea9L8;FF86000034000080d21f000039007d20d4860000cbdf0002eb82000054000080d21f000039007d20d4840002cb8200403982000034000080d21f000039007d20", + "d4BBL8;FFc434019488031a8bfc074091f60740b99c830191e8d302f9b9010034e1d342f9e8cb42f91f0101ebe0d40054e8cf42f9090280522a040091e00319aa09692138L8;FFf70600f1b5c2009181ffff54390000142009c03dc102c03de8a344f9fc3b01f92023803d2183863ce84701f928000014fb", + "6b4ca92600001461fdff9021202391L16;FFa003963ca2837eada1039c3ca80317f88083833c8283823c8183813cfc15009400230291a1820791ee170094a0077bada8035af8a20f7cadf72f02f9e82b02f9BBBBBL8;FB6574206b657957686973706572526174636865746661696c656420746f20646563", + "6f64652073657373696f6e207265636f72642070726f746f62756600000000L8;FF37c040f935204639f30301aaf40300aabc9c00940030805201018052b59c0094600a00b408028052f6031faa38008052f723032917038052e80300a9ff0b00f9BL8;FFe10313aa20faff97770a40f9680240f9080117c", + "bbf0208eba8090054680640f9e10316aae20315aa0001178bb91c0194e802158b680a00f9952240f9550300b4L8;FFe00319aae1031baa22008052ba1c00943a018052f90318aafb0316aae11340f9810000b4e00f40f922008052b21c0094e8fe70d3e9fe60d3956e00a9995a01a9BBL8;FF600702ad608", + "705ad628346ad620303ad820641ad603fc03de20703ad6003883ce8ff4139810240ad1f810071e10302adc2050054ea0b40f98903088b08011b32L8;FFc8f4ff974010003641eeffb421010014e18f0cb96fffff17a88357f8080540f9150101ebe200005481010014a22302d1630c8052a9ecff97e10300", + "aa203000b5L16;FF680240f9080116cbbf0208eb080b0054680640f9e10314aae20315aa0001168bbcdc0094c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6BBBL8;FFf44f45a9f65744a9fd7b43a9ff830191c0035fd6e00313aa0e8b0094e80300aae00301aa88f70737d7ffff17", + "e92b00a9e0030091fb7a0094fd7bbda9f65701a9L8;FF89040054e8633f91e90000d029411f91e8bb0ef968008052e1074091e9bf0ef9e9fdffb029611791e84b09f9a8fdffd008213e91e94f09f9aa0a8052a04700d1BL8;FFf30300aaf50308aa3f0500f141040054680a40f96002c03d6182009100008", + "0927f0a00f9a80a00f928008052a002803d7f2200a923f900941f0400f181010054L8;FFe10315aa0200001420008052f48300a9ff0f00f9a2000037e0230091ad000094c0010034200020d455fc41d3bf0214eb68020054f4031faae8031faab50000b4BBL8;FFab735538a95315384901084aaa835538a", + "96315386901084aab935538a97315384901084aaaa35538a98315386901084aabb35538a99315384901084aaac35538L8;FFf75340f9e15f40f9810000b4e06b40f922008052b83c0094e14b40f9fc432a91810000b4e00314aa22008052b23c0094683642f9094940f9090001b4690242f9L16;FFe00900", + "54e8ef42f9e0031a2a80de78b31f0500b1203900546027c03de8c301f9f7430d91e8835739695340f9e1030e91e0eb803d6093c73ce8230e39684740f9BBBBL8;FB073400004c611516ff9bb76efd3937466151d0e29e8ffa644c60b2055deee43dd9cf6d5766386d5557369c2ccb466c15544552c883e22", + "d97733aa29aace7784aL8;FF2f200953f9fb55290801094ace7c8e0a4a010b4af403152a29240a532b2c0c53fcd7532908010a4a2a300d538c010d4af07c900acf7f8f0a2d280b538c010e4aBL8;FFe8833291e0032d91dba6ff97e85346f91f0500b180620054e85b46f9e9f31691e02bc33de95b04f9e9", + "ffffd029c11d91e8c303f9e8ffffd008f11c91e85f04f9L8;FFf9080094f40304aaf50303aaf30300aa760000b5370080520c000014f80301aab80c0094e00316aa2100805239008052b00c009420feffb4e10318aae20316aaBBL8;FFa9035df80001803d090900f9c8060091a1835af8680a00f9810000", + "b4a0035bf822008052b44c0194a88200911f011beba802019181f2ff5412000014e0031faaL8;FF4a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd680fdffd0004004910849009480fdffd000e001910549009480fdffb000a02391L16;FFe8a303f962008052e8ab03f968f", + "effd008811e91e9a703f9e9af03f9e90303aae3031d91e8b303f9e80300aa40fefff000e42091e4af02a9fb271ca9f2ab00f9BBBL8;FFa00700b4164b40f96082c93c6182ca3cb4c31fb8df0600b1000400ad4002005415074da91ce749a91adf4aa90bef4ba9280400d11f0d00b1086740f968020054L8;", + "FF0083813c40030094fc2740f99f1700f188fbff54ea430f91e8e3009129008052448948adec030b91408541adf81f40b9e95300b94231803d02c1853c438942adBL8;FF49f7ff97e2000014e1430091e20313aafb2700f9f70b00f9bc020094e08742adf50300aae21fc03df4b300f9e08709ade08740ad", + "e257803de08707ade08b41adL8;FFf55b42a9f76343a9fd7bc6a8c0035fd6e10240b99f0a0071ff7e02a9000080d221001b32e10200b9ff1e00f980feff54600640f9a00200cbf1ffff17640240f9BBL8;FF21058052f828019420ffffb000202f910e29019420ffffb000e027910b29019420ffffb00080", + "37910829019420ffffb0002027910529019420ffffb000c03691L8;FFffe71639416effb4e01742f9220080526efbff17f6e742f9fb074bf9f90b4bf9fc0f4bf9f8134bf9f5174bf9c80240f9f7e342f9680000b4e00317aa00013fd6L16;FFbdac0094e14b42f9810000b4e04f42f922008052b8ac0094e", + "15742f9810000b4e00340f922008052b3ac0094b70000b4e01b40f9e10317aa22008052aeac0094BBBBBBL8;FB727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f6b64662e7273002f636172676fL8;FF287b68782821084a0", + "95d1053295b69783701084a14000014680100d008210091f703002a00210091a22300d121008052e3031aaa04fefff084e00c91e80b00f9BL8;FF3f040071000100543f08007141fdff5481220191e20313aaacfcff97000100b483000014200e00b5e00313aa85fdff97e80301aa80000036880e00b5e10", + "31faaL8;FF820e803d8302803d68220039f44f4aa9f65749a9fd7b48a9ffc30291c0035fd620fdfff0006035910c1d0094ffc301d1fd7b03a9f72300f9f65705a9f44f06a9BBL8;FF631a0054bb835df8620740f95f0014eb69050054610340f9200080398000f8b728040091490400d1110000145f2800f", + "1880000542800028b08f1df384803f837L8;FF28040054e80b40f91f0002710801148b03fdff54e90f80121f00207109140033c20000540a7c0653090500394a051a320a010039e0ffff17ea0f80120b7c1053L16;FFe80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e003", + "0091ede6ff97e10300aae00301aaf44f46a9f72340f9f65745a9fd7b43a9BBBL8;FB30f845000000000018000000000000000800000000000000f01a46000000000030f845000000000010000000000000000800000000000000c81b460000000000L8;FF23008052240080526ca4ff97e11740f9e00313a", + "a9efbff17e063009122008052230080522400805264a4ff97e11740f9d1fbff17e0630091e10318aae20316aaBL8;FFf44f45a9f71b40f9f65744a9fd7b42a9ff830191c0035fd6e0230091e20301aae10308aae1feff97eaaf40a96901158b480115eb690200f922f0ff54c0fefff0L8;FF69faff541200", + "0014df021ceba3040054f70300aaa08300d1e10315aae20314aae30316aa23000094a8035ef81f0500f1c0030054b4835ef8e6ffff17155300a9BBL8;FF380080399800f8b728040091490400d1110000145f2800f1880000542800028b08f1df38880ef837a00301d111f2ff97a8035cb868100037a8035", + "df84a0340f9L8;FF7f0c0014776a41f900c3c73c01c3c83ce90f44b9f6eb43b9756641f9e80240f9208709ade96303b9680000b4e00315aa00013fd6e10640f9810000b4e20a40f9L16;FFe89740f9f0b74aa9e8ab00f9e8d740f9f88f41a9e92312a9e9a349a9e84f00f9e88740f9e9af1aa9ebf340f9e8", + "df00f9e8af40f9e88700f9c2f1ff1740fefff0BBBBL8;FB1ab609db209b9c863aed591b16372133639d8e7052ef933fd5c22971ac4a5e8b314400002fe1d3fd806cb7b851af23f1482e7e66d45d1498ba3550678ff94ac5L8;FFfd7b44a9ff430191f28c001408040091200440a9a94300d1eaffffd04a01", + "1691a8031ff8c2fdfff042a81b91e92b01a9e3430091f18c0094fd7b44a9ff430191BL8;FFc4100194f3031faaf9031faa35008052e0c32791e1c31d9102288052bd10019400630091e1c3279102288052fb9b05f9b8100194e88b4cb949008052f9a305f9L8;FF68030054490180521823091b081f00131", + "f010071cd020054b403f8b6f7031faae00317aae10314aaef0c0094f8031f2ae9feffb40a1f00124a09380b4a791f53BBL8;FFe00319aae10315aaf74c0194f8c30c9107000014e0231291c1820091c8070094e84742f91f0900b120fbff54e0c30c91e1231291022b8052b6500194e92740f9L8;FF08154", + "0d2080d088b0825019108fd46d308050091090840f9290b00b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091091440f94801088bL16;FFe8cf03f9e8ab40f9f5fb03f9e8d303f9e8d740f9e70b04f9e8db03f9e85340f9e40f04f9e8e303f9e9a358a9f61304f9f01704f9e8ff03f", + "9e8eb40f9e9f303f9BBBL8;FF0900f0f2e8470039e90700f961000014c90080d248008052a0c300d10900f0f2a2831d38a8931d38a9031df8eb760094e00700f9a1ffff9021203f91a3ffffb0L8;FFe8ff0fa9e8a712a9186d0094c8fdffd008c5279129048052682601a9880280d2090080920800f0f269", + "2200a90d000014e08745ad08008092e237c03d680200f9BL8;FFff270039e80300f9f4f6ff97e80300aae80300f9a1fefff021580f91a3fefff063840f91e0030091620180528401805279f6ff97e10340f9e00301aaf44f45a9L8;FF61030054190000f022030e9140404e391ffc0371200300540004001", + "140400e3964fcff97f60300aaa00300b420030e91d30a00f9760200f9610282d28202018bBBL8;FF0800098b080500911f0109eb481700545f000014fa031faaf9b749f9f8074091188309913f0700b18018005400230491181c0094080040b20811c0da081540d2L8;FFa20201ade24bc23de0dfc13dfa1", + "702f9220500ade1e3c13df91b02f9000700ade073c23de177c23de0671139c00600ad097142396902003609dd49b8ea0308aaL16;FF2000805201048052f7ac00942000805201088052f4ac0094ffc301d1fd7b05a9f44f06a9fd430191f40308aa280cc0da29fefff029a12691a8831ff828048052BBBBB", + "L8;FB3800000000000000b80100001d00000064656372797074696f6e206661696c6564696e7465726e616c206572726f723a20656e746572656420756e7265616368L8;FF4a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9050054280108ab8300005426000014e80308", + "ab82040054090840f9090100b4BL8;FFe300005423000014e8031faa090840f949fdffb5e90309abc2030054280108ab42040054091440f9090300b40a1040f9ec031faaeb0309aa4a4100914d8541f8L8;FF3900805265000014e00b409100c00e914d000014e00755ade96341f9e97f02f94083803c418", + "3813c45000014e9830a9168008052eaef4bf9e96b02f9e9eb4bf9BBL8;FFe20315aa0001178bc2580194e802150be8ff00394a000014e80316aaf80317aafa010034e8030091e10317aaf802028b00011a8bb7580194e83340f980030191L8;FFa04700d1e1833291e95706f969fdffd029ed0a91e86b06f", + "968fdffb008552c91e96306f9290080d2e87b06f9c80480526944c0f2ea7f06f90a078052e07f823dL16;FF83feffb0630c1491e0030b91a20080524401805270ffff17e0230b39e0030b91ff270b39f56301f9ecdeff97e80300aa81feffb0218c139183feffb063481191BBBL8;FFe10240f9200080398", + "000f8b728040091490400d1110000145f2800f1880000542800028b08f1df388826f837e0230091102a0094e80b40b9e8f90737e80f40f9L8;FFe11fc43de223c43de0fb863de01b843d600600ad620a803de80000b4ea1740f9e90740f9682200f96a2603a9f31340f90800001408008092681a00f9f307", + "42a9BL8;FFa80000b4601240f901f97fd342008052b9f80094681a40f9a80000b4601e40f901f97fd342008052b3f80094682640f9a80000b4602a40f901f97fd342008052L8;FFf703182a0e000014202040a9e10313aa030d40f9e20314aaf44f44a9f65743a9f85f42a9fa6741a9fd7bc5a860001fd65", + "f09007141000054173f0153356440a9BBL8;FF01048052e01b843de11f843de223843df6ef07f9e3ff863de3fb863d2b350194b83801940004815221008052b4380194e07c01b4f80300aab238019400048052L8;FF481300b5200840921f1800f182130054217c0353411400343f040071200100543f080", + "07141fdff54a1a20491a22302d17ff3ff97e02900b5e1031faae9ffff17L16;FFf2d343f9f1d743f9e0db43f9e3e35e39e7f343f9e4e343f9e5e743f9e27744f9fa7700f9fa5300f9fa4f40f9ea5f40f9e3b7803de20713ade8f200f888018052BBBBL8;FB6a00000000000000800000002e0000007a1340", + "00000000005700000000000000b2030000330000007a134000000000005700000000000000c50300004e000000L8;FFa0e301d1bf830094a80359f813693738f3060091a88358f8b38319f87f0208eb01e6ff54a0e301d1b68300942dffff17a02301d1e1031faae2031caa43008052BL8;FFe04341f98a0", + "100b90afb0b918b090079eb630191ac0358f8482500a968390c91a98358780c0100f9e8031691e9df06797ba3ff97f88345b91f07003160080054L8;FF22008052030180520402805255e5ff97f48f41f9f0ffff17f8031faa130180521f080071e2f7ff54f7031faaf5031faa14018052bf0a00f1400a00", + "54bf0e00f1BBL8;FF4803f837e00300911afaff97e80340b9880a0037e80b40f98a0640f9490108eb430a00548a0240f9e00740f94801088b882600a908fc60d3080500b502084092L8;FF811d803d8182823c8082833ce98b01b98082c23c8112c03de8bf40f97a0200f98002803df45744a9e8ab00f961", + "0a803d6082803c680e00f9f50000b4f30314aaL16;FFf0cf00f9e6fb00f9fa2300f9f29710a9f6f300f9f6030faaf7ef13a9e7fb16a9bcc80094e72340f9e31340f9f70316aae14740f9fb031caa090080928a008052BBBL8;FFf51b00f9f44f04a9fd83009115d040a9e20301aaf30308aae00315aae103", + "14aa590000941f0400f1410600543f0014eb020a0054080d80522854089b092540f9L8;FF07000014c90080d248008052e04300390900f0f2e8470039e90700f9e0230091ee6eff97f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6BL8;FF997e07a99f8200b981420191e20313aa6", + "8f9ff97c01100b5e1031faad5ffff17880240f91f0500b1810000549f5e00a99f6201a99f2600f91f0800f1810e0054L8;ZDBBL8;FFeadf01f917250194e81f40b9e8c306394d0000142093c13ce9df40f9e8a30539e012803d2093c03ce9f204f8e112c03d8092823c8192833ce9c700f9e10740f9L8;FF", + "bc280094a00800b4e10317aae20313aaf50300aabf280094d8de40a9b70000b52700001435008052d8de40a9970400b4e806178b198300911aed7cd304000014L16;FFfd7b48a9ff830391c0035fd62000805201048052f4a400942000805201098052f1a40094ff0303d1fd7b06a9fc6f07a9fa6708a9f8", + "5f09a9f6570aa9f44f0ba9BBBBBBBL8;FB616420c01020726563656976657220636861696e73002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e2d6c696e75782d676e752f7265L8;FFe5170094e8d340f91f0900f160040054e1830691e00315aa02328052bda20094a0820791e", + "143009102328052b9a20094000741ada8035ff8a8521da9a0860dadBL8;FFe0030091e80300f9f4280094e10300aa20008052fd7b43a9ff030191c0035fd60c310094fd7b43a9ff030191c0035fd600fffff000c02391071f019400fffff0L8;FF41fdff902120329143fdff9063bc3291a0c300d1620380", + "526401805216000014c90080d228008052a0831d380900f0f2a8931d38a9031df805000014e10300aaBBL8;FFe1031aaa22008052170100b4e30317aaba620194e81f40f9e00000b520008052e10317aaf05e0194b3620194e81f40f920008052000540ad7f0600f1ea2340f9L8;FF1f0101ebc007005468", + "0640f9490380522a040091e00314aa6a0a00f909692138e10313aa50fbff97760a40f9680240f9080116cb9f0208ebc8060054680640f9BL8;FF880080d2e10700f90800f0f2baffff17e80b41b2e00700f9b7ffff17880080d20800f0f2080140b2b3ffff17880080d20800f0f208110091afffff17e003", + "00f9L8;ZDBBBL8;FB6420616e206572726f7220756e65787065637465646c7900c50f4000000000004b000000000000007f0b00000e0000004572726f72576869737065725072654bL8;FF0800098b080500911f0109ebc815005435000014f7031faaf50314aab30e4ff87f0600b180160054e00315aa90", + "ebff97080040b20811c0da081540d2080d088bBL8;FF690e4039f503002a1f01096be0179f1ad11701948812403969124039aa02000ad6020a0a1f01096be0179f1aca1701948816403969164039f503002a1f01096bL8;ZFBBL8;FFff030191c0035fd6202040a941ffffd0213c3291030d40f922038052", + "fd7b43a9ff03019160001fd608200091200440a9e92300910a0000904a013f91e8a700a9L8;FF1affff17c80080d2e00b00f90800f0f2080900d10bffff17e90b41b2e9a300a910ffff17c80080d20800f0f2080500d104ffff17c80080d20800f0f208090091L16;FFee3f40f9e56f40f9e0f3803de1938", + "03df1a34ca9f7ef49a9fc0748a9ea6341a9f9fb42a9ebb344a9e0bf46a9e69f43a9e4a74ba9fadb4aa980010014fb5300f9BBBBL8;FBc70000002f0000003d044000000000004900000000000000c6000000190000003d044000000000004900000000000000bf000000090000003d04400000000000L8;F", + "F080d088b0825019108fd46d316050091770a40f9570900b4740640f9f8031faaf90317aae00314aaddfaff97080040b20811c0da081540d2080d088b08250191BL8;FFf37740f99f0600b1001a0054e01bc13de11fc13de9830291e88344b9e1a30c91022780522041893cf883329121418a3ce98302912", + "0e10291f47312a9f53301b9L8;FF1d0000141f090071611e00540a0180d2e97342f90a00f0f24a0140b228dd7892eaaf00f9f1000014e96753390c0180d2e8031faa0c00f0f205000014090180d2BBL8;FF080118cbdf0208ebc8070054e80b40f9e10317aae20316aa0001188bbd5201940803168be80f0", + "0f9540300b4e10f40f9e80740f9b51240f91f0101eb80080054L8;FF81ffffb4200340f922008052ba520094f8ffff17e8e322910081cf3ce8e344f93dffff17e88b40f9c80000b40805088be00314aa0201805201f17dd3ae520094L16;FFe06300f900b140f9e0d300f900b540f9e06700f900b940f9e0", + "ef00f900bd40f9e05700f900c140f9e06f00f900c540f9e05f00f900c940f9e0e300f900cd40f9BBBL8;FFf85f42a9fd7bc5a8c0035fd6f50300aae00313aa22008052230080522400805225feff97610a40f9e00315aa53feff17e00313aa220080522300805224008052L8;FFe1d342f9bbfbff17e0431", + "69122008052aa110094e1d342f911fcff17e043169122008052a5110094e1d342f929fcff17e043169122008052a0110094e1d342f9BL8;FF15ef0094c0feffd00000309112ef0094c0feffd0006030910fef0094c0feffd000c0309109ef0094ffc300d1fd7b01a9f44f02a9fd430091280840f9290040f", + "9L8;FFc67c4093c5020e91a31e00517f7c0071a1404e3948030054a3c0238b69404d3968c04d391f8d0171e5979f1ae7879f1aa90200342900094b3f2500714c020054BBL8;FF950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f922008052b3320194f8ffff1714a", + "4ffb48806148be00313aa02018052L8;FFe87f40f91f0500b180000054e803009100e1039102edff97f3d34ea9940100b47522009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f9L16;FFf44f42a9fc0b40f9fd7bc3a8c0035fd6fd7bbda9fc0b00f9f44f02a9fd030091ff0314d1", + "ff0300f9f30300aa0232805200844dad0274c03de10313aaf40308aaBBBBBL8;FB540000000000000079000000050000001d1c40000000000054000000000000007f000000050000001d1c40000000000054000000000000008d00000014000000L8;FFe3070054e10740f9f40319aaf90301aabc0100346", + "0021c8b3900028bbd9a0094a80357f8e0020191a1c303d12200805208050091a80317f8ee960094bff31438BL8;FF1f011ceb80080054560b40f9586340b9360500b4540740f9ba1a0194e00316aa21008052b31a0194000c00b4e10314aae20316aaf70300aab61a0194591740f9L8;FFfaaf4bf9e1b34b", + "f9e80b409108c10e91e0031aaa98190094f7db51f9ff0600b1a00d0054fbdf51f9f6e351f92c008092f90317aae1ab4bf9c10000b4e0031aaaBBL8;FF1a2342b8e90b00f9a9035e38a88314f8a80301d1a903153869f3ff97a8035c381f05007141010054a8a77ca9682601a9810000141f090071e10b005", + "4bc035df8L8;FF02288052c35a0094e0c32791e1c31d9102288052bf5a009448058052a9fdffb029153391e8c303f9c80080d20800f0f2fb9b05f908390091e9bf03f9e8bb03f9L16;FF210800541f0800f101420054a0c303d1f76301f9f77f01f973e7ff97600a0036812800b5fbd340f9e8cb40f97f03", + "08eba0110054e8cf40f9090e8052e0bfc03dBBBL8;FFe8a701a904770194c0ffff900080009111770194c0ffff9000a035910e770194c0ffff900000369108770194c0ffff900020259108770194c0ffff9000802591L8;FFe2e7843de283c13de0db843de07fc13de1df843de17bc13de0d3843de077c13", + "de2d7843de273c13de0cb843de06fc13de1cf843de16bc13de0c3843de067c13dBL8;FFe9c301f8e82700b97cffff97a8c35e381f050071c10a0054a0d3de3ce81f8052884200398002803df44f45a9fd7b44a9ff830191c0035fd63f9800f1e0050054L8;FF5f000e6a0e02110a31017eb2508a03aa2912", + "899a114c1353ef01010a0e010e0adf010d6aec010c0a0f3211aa30017ab20d1c00128c01080a0912899a0e1c0453BBL8;FF02000014e9031faa280108ab42020054090040f93f0500b1a0010054090840f92a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108abL8;FFe85705f9", + "e85f05f9e82b40f9e95b05f9e86705f9e92344a9ea4f05f9ea7f40b9fa8f05f9e89305f9e80f40f95f010071e96f05f9e8cb05f9e82f40b9e97705f9L16;FFbdba00949f0600b1000b0054f50314aaff0600b1c00d0054e8eb40b9e0831d91e1c31591f7bb02f9f4831d91e88f05b9e87340f9f6bf02f9fc", + "c302f9f98b05b9BBBBL8;FB6c6420776f726b20666f722053484132353600000000000032134000000000004700000000000000110000000a0000009d054000000000004800000000000000L8;FFbc8a0094e02300f9201600b4bd8a0094e00315aa41008052b68a0094e01f00f9601500b4b78a0094e003", + "15aa41008052b08a0094e01b00f9a01400b4b18a0094BL8;FF00013fd6e06b01f9e8c31791e16f01f9290c40f9e1830b9120013fd6fcfb42f99f0f00b1810d0054a8008052a5ffff17e03fc13de143c13d1443172ae81345b9L8;FFfd7bc2a8c0035fd60001805201028052f4060094fd7bbda9f50b00f9f", + "44f02a9fd030091f40302aaf303012af50300aab40a00940003805201018052ad0a0094BBL8;FFa88358f8e08705ada082c53ca103d93ce82700f9e28306ada082c13ce18304ad3a2f40f9fb3300f99a0700b4080d8052382b40f9547f089bb24a0194e00314aaL8;FF4a0d0a8b4a2501914afd46d329010", + "a8b290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b42a0140b24a11c0daL16;FFfbab00f9fb0314aaf4030faaec8700f9f6bf00f9f60307aaf54712a9f5030aaae44f00f9f28f00f9ed6300f9ee3700f9f70700f9e5d300f9ffd0ff97eb1b43a9BBBL8;F", + "F403e00b488ae8e52a9ffff9029c1149148aeac72200540ad082000b9880280d2890480520800f0f2c0a601a908110091000400adc8a600a948008052d3a20039L8;FF42008052bc6a0094688a40f9a80000b4608e40f901f97fd342008052b66a0094689640f9a80000b4609a40f901f97fd342008052b0", + "6a009468a240f9a80000b4BL8;FFa9ffff17e00300f9a1feffd021dc1191a3feff906360029106000014a1feffd021dc1191a3feff9063700291e00300f9e0030091c20180528400805211000014L8;FFe90300aa1f3d01383f4d0138e80300aae90300aa1f5d01383f6d0138e80300aae90300aa1f7d013", + "83f8d0138e80300aae90300aa1f9d01383fad0138e80300aaBBL8;FFe99741b9e00315aaeb2b5aa9a80318b8e8c34639e93200b8e9cf40f9e8631139a8f31938e8430691ea2b02f9e97200f8ebf200f8ea7201f861c3ff97e8434639L8;FFfd7bbda9f65701a9f44f02a9fd030091140840f9f30300aa3f0", + "002716200005435008052080000143f0020716200005455008052040000143f40407168008052L16;FF20010054f6031f2a22000014bf0208eb40010054560080520a000014bf0208eb61030054e0230091b6a5009419000014bf0208eb41040054e0230091b1a50094BBBBBBL8;FB616e74756d20726174", + "636865742073656e64206572726f723a20c0001b737071722076312e73656e645f63742e726563762065706f636820c0243a2043743153L8;FF22feffb042e02591009b0094ff8303d1fd7b08a9fc6f09a9fa670aa9f85f0ba9f6570ca9f44f0da9fd030291368841b9f30301aaf40300aab29e009400308", + "052BL8;FF680640f9090280522a0400916a0a00f909692138e10313aa1bfcff97818a40a960008052e30313aa6dfaff97888240391f05007101020054610a40f9680240f9L8;FFe013803de82b00f9c1000054e1a30091e2030191e00315aaa3f5ff970b000014a003df3ce113c03de82b40f9e11740f9e0", + "0700ade81300f9810000b4e01b40f9BBL8;FFa00a0054f30300aae8230091022a80520021009161820091f60700f9bd5e0194770a40f9ff9e00f1a9010054f70600d108038052690640f9e826089b770a00f9L8;FFa1f4ff5413008092f9d740f9f58b42b9f78f42b9fa1b00f959f6ffb53b008052f4e340", + "f9fa0316aa74f7ffb536008052e92347a9e0dbc23de1dfc23dea5740b9L16;FF210840f9f40300aa680240f91f0101eb40040054680640f92a040091e00314aa490280526a0a00f90969213890470094e10313aafdebff97803240b980010034BBBL8;ZBL8;FF01010054e067c03de8d340f909008092690", + "200f96082803c680e00f965040014f4c30091a18200910228805280820091b87e0094e95b40f9e067c03de8d340f9BL8;FF000080922ffb00941f0400f1e10200547ffedfc8810640f98104f8b7800240f922008052b4fe0094e00314aa0103805202018052f44f42a9fd7b41a9ffc30091L8;ZFBBL8;FF6", + "182813ce20748ad6082803ce037c03d69a200b9e94740b968be0239e88340b969c20239e90b417968120bb8e8e3413969520b78e92740f96082823c69720bf8L8;FFe80342f9f40f42f9e95700f9e90b42f9757e42f9e86b00f9080340f9e94b00f9680000b4e00315aa00013fd6010740f9810000b4020b", + "40f9e00315aaae3e0094L16;FF1f0112f121040054f7e741f9ff0600b1a00b0154f6ef41f9f8eb41f9e8ff41f9e83f00f9160f01b4b6be0094e00316aa21008052afbe0094602c01b4e10318aaBBBBL8;FBdfdd48ead4ade658a28cff50fbac0000843917518b424840d225e3cbaf0f606ee5e7b92e90c13", + "71ae52b637c2f061db1cc44c6f59026827c5878b5c585f3f833L8;FFe81301f9f81701f9ff1b01f9e81f01f9f92301f9ff2701f9e82b01f9fa2f01f9ff3301f9e83701f9e03b01f9ff3f01f9884e1c9be9f77fb2190940f938f77ed3BL8;FF63b41c9184018052e3000014e05306f9e0833291e1feff9021", + "203f9102028052e3feffd063081e91c4018052da000014c80080d2e0a33239e08332910800f0f2L8;FFf30300aac80300b40805088ba90640f918ed7cd337a100910400001418c300f1f7c20091c0020054e8825ef81f0114eb61ffff54e0025ef8e10316aae20314aaBBL8;FF08008092e18317a9e06304", + "91e1c700f9e10314aae9231aa989008052e80b01f9e82301f9e80313aaf7db11a9f7e712a9f8e713a96083873ce93301f9ff3701f9L8;FF0800098b080500911f0109eb28170054e4000014080c43f81f0900b1010b0054f3031faa64000014e80300aa098d40f83f0500b180160054f30300aae00308aaL", + "16;FFe1220154e8ef41f9eaff41f9e9f741f9eb1f42f9f7f341f9f0fb41f9e84700f9e80342f9f10b42f9e11742f9fa3742f9f65342f9e82b17a9e80742f9ea1b42f9BBBL8;FF0a010039e0ffff17ea0f80120b7c10530a2c0633eb0000350b7c0c530a050039090900396a091b320a010039d6ffff170b7", + "c1253ec0f80120a0900390c440c33L8;FFe00640ade20ac03d620a803d600600adff031691f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6ebab59a93f050071e89741b92083c13cBL8;FFffa70039e81300f9f4f4ff97e80300aaa1fefff021541291a3fefff063981291e81300f9", + "31000014c90080d2e0a30039480080520900f0f2e0830091e8a70039L8;FF2100080b7f00016b2afcff54c11240f93fcc74f22001005434cc749288fe44d3080500d11fc123eb23fbff54834200d1bf1040f2a0000054e3fcff9063a01191BBL8;FF00011a8bc32e01944803188be8d302f9f89749f9f90b", + "40f9780300b4e1d342f9e8cb42f9f99349f91f0101ebe0350054e8cf42f9490580522a040091e00318aaL8;FFff0316b9a1290094e86b40b9e0032791e1833f91f9e33f39e8833f39e8a74b29f6e73f39faeb3f39e9873f39e88b3f39e8a74a29f7ef3f39fbf33f39e98f3f39L16;FF01108052f8aa00942", + "000805201048152f5aa0094ff4302d1fd7b06a9f65707a9f44f08a9fd830191280840f9f30301aa1f8125f181040054681640f91f010ff1BBBBBL8;FB080000000000000078414200000000005c40420000000000cc494200000000006120446973706c617920696d706c656d656e746174696f6e2072657", + "475726e65L8;FFffbf0339e08707adf50301aae88b00f9f8920094e0c30291a102178be20314aaf4bf0339bb960094e00747ada8c302d1e243c03df58b40f914010191e1031f2aBL8;FF12130194f3031faa088c48f81f0500b121efff54e8031faa080113aba301005400ffff900060269108130194e803", + "1faa080113abe300005400ffff9000202f91L8;FFe0ab00b9a04700d156c4ff97e0a700b9a04700d153c4ff97e0a300b9a04700d150c4ff97e09f00b9a04700d14dc4ff97e09b00b9a04700d14ac4ff97e09700b9BBL8;FFe20313aafa0300aac2560194f90b00f9db0200b4bb560194e0031baa21008052", + "b4560194003d00b4e12f40f9e2031baaf90300aab7560194e9031baa0c000014L8;FF00602c91a2fdff9042a02d91e1068052fb520094a0fdff9000a42091a2fdff9042002291a1158052fb520094e8ff42f9e90343f9a0fdff9000201e91a3fdff90L16;FFe9c301f960320054e0efc13de9f343f9e1f3c", + "13de2f7c13de0df823de0dfc03de9d305f9e9c341f9e1e3823de2e7823dc082803ce9b705f9c082c03ce1dfc23dBBBL8;FF63a00291a0c300d142018052a400805212000014a0031df8a1fffff021780391a3fffff063e40391a0c300d1420180524400805209000014a0031df8a1fffff0L8;FFe20318aa", + "00011a8bc2760094f90b40f94803188be8d302f9e89f49f9f4074091948209911f0500b18000005480620391e143169166130094e8bb49f91f0500b1BL8;FF8cfdff17610640f9810000b4600a40f922008052b8f60094611240f9810000b4601640f922008052b3f60094611e40f9810000b4602240f922", + "008052aef60094L8;FF20201212040080d200600a121f10507101010054e44b40b9e1030191e3430191e0008012e30f02a9e11b00f9e07f072963020f32060080d2050080d2610c8092BBL8;FFe8cb02f92183863c2283873c2083883c2383843c20010054e0f3c63de1074091e043169121800991f53309", + "f9fb3709f9e09f843de0910094963b01b4e8074091L8;FFe8fdffb008811a91e86703f948008052e86305f968fdffb008a11391e86705f9e84f05f928fdffd008ed0a91e85b05f908078052e97305f9e9831a91e85f05f9L16;FFead743f9e01bc23de18f16ade97700f9e96744f9e11fc23de29317ade22", + "3c23de7cb43f9e95300f9e3a35d39e4bb43f9e8a301f9e8035e39e5bf43f9eaf200f8BBBBL8;FB7465206964656e74697479206b657900bb124000000000003800000000000000490100000a000000bb1240000000000038000000000000004a0100000a000000L8;FF9f1a00f9808200ad8002803d08db7", + "7d3800640ad80020191e103009122008052080d17aae00700ad080dc0da881e00f9820241ade20301adee82009488264829BL8;FFffa711391f0500b160000054e02b40f9e9e0ff97f3d351a9940100b47522009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f922008052L8;FFc0", + "02198be20315aac2060094628f7fa92103158be00316aa64020094e0110037b70000b4e00316aae10317aa22008052b10600945ac300f17bc3009161faff54BBL8;FF43fffff0635c0191a0831cf821000014a0831cf841fffff021e0009143ffffd063e03c91a0e300d1a20180520402805226000014a08", + "31cf841fffff021e00091L8;FFf8430691fb0c8092e02340f9080d8052826f089b0080c23c1a0040f901a00191e00a803d0080c33ce00e803d0080c43ce012803d0080c53ce016803d0080c03cL16;FFe04bc23deb6b00f9e9e700f9e9bb43f9f0cb43f9e2d743f9ebeb43f9e51b44f9e92b17a9e9bf43f9", + "eac343f9e09b833df22f44f9e13344f9e9ff00f9e9c743f9BBBL8;FFbd660194752e40f9682640f9bf0208eb20050054080d8052762a40f929008052a85a089bbf1600f1097d02a909018052186500a9b90600911f2503a909048052L8;FF7369283808050091280800f98af6ffb43f0108eb93611932e00", + "200547369283808050091280800f92004f8b7e0030aaa26000014e10300a9e00301aae10308aaBL8;FF07000014e80b41b2e00700f904000014c80080d20800f0f2080500d1e80300f9e0030091edecff97e10300aae10300f9a1feffb021901491a3feffb063b00e91L8;ZDBBL8;FF22008052bc260194c", + "10e40f921fdffb4c01240f922008052b7260194e5ffff17680240f9c80000b409e179d3e00314aa02018052211108cbaf260194610e40f9L8;FFe1feffb4c00240f922008052ba260094f3ffff17688e40f9280100b40805088be00314aa01ed7cd302018052f44f42a9f65741a9fd7bc3a8af260014f44f", + "42a9L16;FF00710a9b210108cb0cb2ff97e0031caae10317aa09b2ff97e90b40f9c90000b428e179d3e0031caa02018052011109cbb1a60094681a40f9600ac03d966200a9BBBBBBBBL8;FB6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f73746174652f73657373696f6e2e72730", + "012696e76616c696420617267756d656e743a20L8;FFe88b01f9ff9301f9e89701f9ffa701f9e8a301f9ffab01f9e8af01f9e8bb01f9ffbf01f9ff230e39e80701f9ff0301f9b88319f8a115005429feff9029a12691BL8;FFe0e30091e10317aa2200805245220094f42344a91f0114eb23100054e81f40", + "f9e10315aae20317aa0001148bb9230194e90344a9080009eb630e0054ff0208ebL8;FFf4030baa57000094e10340a9eb0314aa2aa040a9290040f90cfc6ad35369283808050091280800f92cfbffb43f0108eb7361193240020054536928380afc71d3BBL8;FF28008052e81b00f928008052e84b00b9e0", + "0306aaf40306aa915f0094fc0300aae00316aaf80301aa8d5f0094e92b40f93b1940f9bb00f8b6fa031faae0031aaaL8;FFae020094780a40f9bbffff17e00313aa22008052a9020094610a40f9c3ffff17e00313aae10316aae20314aaa3020094760a40f9680240f9080116cb9f0208ebBL8;FF971600f", + "99f2e00f91f0900f1a10d0054e00313aa74f0ff9740010036410b00b5e0031faad4ffff17e003082ae20313aa430c805216eaff97e0f9ffb4c4ffff17L8;ZDBBBL8;FB5f6964656e746974795f7075626c696373656e6465725f636861696e72656365697665725f636861696e7370656e64696e675f7072", + "655f6b657972656d6f7465L8;FF16ffff17e11740f9e80f40f91f0101ebe06e0054e81340f9968248f8490280520969213828040091df0600b1e81700f9201f00548022029125f2ff97080040b2BL8;FFa00000546800805268220039280080520b000014bb0301940004805221008052b4030194a00100b", + "4e00741ad09048052e8031faa60a600a9000400ade0030091L8;ZFBBL8;FFff030191c0035fd6082000910940009142ffffb042481791200440a9e82700a9e80300910900009029e13e912000001408200091200440a9e92300910a000090L8;FFfd830291081c00121f090071e1010054e00302aaf30302", + "aaf40301aa62ffff97e80300aae00301aa08020037680240f9080540f9150100eb62020054e80f41b2L16;FFeba700f90b7140f9e99b00f9e9ab43f9eb8f00f90ba94ea9a9031ef8e9f301f9097d40f9e127833de9af13a90b2550a9ebab01a9e91700f90a2551a9e9ab04a9BBBBL8;FB000000000000000", + "001000000000000000100000000000000904f4400000000000000000000000000000000000000000001000000000000008879440000000000L8;FF28170054e4000014080c43f81f0900b1010b0054f3031faa64000014e80300aa098d40f83f0500b180160054f30300aae00308aafcfeff97e80300aae0", + "0313aaBL8;FFe9fefff029813991e00301aa08711d5308410051081d7d92226968f8e9fefff029613a91286968f8e10308aae90f011408a440a9e20301aae00308aae10309aaL8;FF61e20191e343139100c00e91e203142a40040094e8db51f91f0900b1414f0054e00b409161620491e443139100c00e9", + "122fdff9042ec3f91e30280522a030094BBL8;FF85590094a0035df8bfffff17a0c300d1a82b3da903520094ffc301d1fd7b02a9fa6703a9f85f04a9f65705a9f44f06a9fd830091f303002ae00301aaf70301aaL8;FF1f0500b160000054e02b40f922e9ff97f3d351a9940100b47522009104000014940", + "600f1b5620091e0000054a1825ff881ffffb4a00240f922008052ae530094L16;FFc0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff071df82c0040f9e9008052f5433c91fc233391f80302aaf30300aaBBBL8;FF150300b4ab0240b26b11c0da6b1540d26b0d0", + "b8b6b2501916bfd46d36b0500912801088b49010b8be10313aa0001098b9ef9ff97380200351c000014e8031faaL8;FFc0000054e8074091e143169108810991004103917f0f0094f87f49f9580300b4e1d342f9e8cb42f9f97b49f91f0101eb40370054e8cf42f9490380522a040091BL8;FFf7fbffb5f6", + "2b40f9f51f40f996000037d8feff901863089113000014d7fe45d3e80214ab420d0054e90200ab620d0054aa0217cba8831cf8a8c300d1a02301d1L8;FF0b000014151c00f91b000014201040f920f4ffb4330c40f9000400d194020e9161a20091818201a97f7e00a9e00313aaf35341a9fd7bc5a8c0035", + "fd6352440f9BBL8;FFf37749f97f0600b1e0020054e18f49f93f0400b140010054810000b4e09349f922008052b4330194e19b49f9810000b4e09f49f922008052af330194b30000b4L8;FFe803019115e3009116630191a0a301d1f30303aabf0317f8b5db39a9b9831af8ba031bb819300094e22340f98", + "21500b5e0030191f55b04a9f92b00f9b94302d1L16;FF620205ade10341ad610202ade20342ad620203ade00740ad600606adff431691f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd688620691BBBBBL8;FBe80e4000000000003200000000000000a800000014000000770d40000", + "00000002e000000000000006b0100003100000063616e20616c7761797320617070656eL8;FF0181c13ce433c03de01704ad0081c03c08fc83924803088be00702ade00b45ad1f0109ebe50309ade01bc03de2130aade28f43ade413c03de347803de48706adBL8;FF76ffff97a9ffff17ff0306d1fd7b14", + "a9fcab00f9f65716a9f44f17a9fd030591e10b00a9680200b0e40b00f9081140f91f0900f1830b0054155040a9f60300aaL8;FFa04700d1e243c13de00711ade03fc13de00b12ad53c9ff97fa03002ae0431391e10319aa750e009421fdfff021200191e3431391e00313aae2008052e3f2ff97BBL8;FF00", + "0440f922008052b30100b4e30313aaba5b0194000200b4e10313aaf30b40f9fd7bc2a8c0035fd6000440f9e10313aaf30b40f9fd7bc2a8c0035fd6ae5b0194L8;FF84018052e3000014e05306f9e083329161fdfff021203f9102028052a3fdffb063283191c4018052da000014c80080d2e0a33239e0833", + "2910800f0f2ffa73239L16;FFfd030091ff830fd13f040071f30300aa01020054f40304aaa2020036340400b4f50303aab7db0094e00314aa21008052b0db0094a00b00b4e10315aae20314aaBBBL8;FFfd7bc2a8bc7b0114f30b40f9fd7bc2a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da", + "9fd830291081c00121f09007181010054540040f9880640f9L8;FF40f18f3cf6bb0ef93821003928250039f4cb00f9a00b0054e8c30091e0431691008542ad0201c73ce277813de06f813de173813d018141ade807409108810991BL8;FFdf7d02710924003949c100110a819f1a0928003969010d0b4a11", + "4e0b29c10011cb0d00122c1c4039092c003949c100117f2500710930003909819f1a9f7d0271L8;FF680a00f9ceffff17291040b83514009108fd0f37ea031faa08fd1737eb031faa48001836b8264078c80120376800283688120b8b0b1140798812188be1230091BBL8;FF3f090071e1000054ea0f40f9", + "080180d20800f0f249dd7892080140b205000014080180d2e9031faa0800f0f208017fb24a1d409229010aaa682600a9fd7b44a9L8;FF41050054e8f347b9a01ec13de9c3249120fdffd000542c91e1831a91e84709b9e8c32491e3830f912041803c2900009029913491e85303f968fdffd008a11391L16", + ";FF69914bb8e10b19ade127c23de22fc23de417c23d3b8108aae9ff43f9eccb43f9e00717ade02bc23de10fc23de9f200f8e9a35f3968114df8e00b18ade213c23dBBBBL8;FB2b1d1b9de8f4e756a07fc24b89660aed2859ec3fdc32444a9c6621ed2c81d73c087a35f466406696050db7b8a1869574a28c", + "00fc1fd27df57e800000065499d6L8;FFbd8b00947f0600b100130054e803049194221c9bf50314aaa88640f8a80000b4a00240f901f97fd342008052b28b0094e8030a91930200f90001c03de81740f9BL8;FFe96f06f9a04700d1e1833291e95706f9c9fefff029ed0a91e86b06f9c8feffd008552c91e", + "96306f9290080d2e87b06f9c80480526944c0f2ea7f06f90a078052L8;FFfd030091f30302aaf40301aaf50300aabc0b00940004805201018052b50b0094400100b4155000a901fdfff021800891130800f91f600039f44f42a9f50b40f9BBL8;FFa88301d1e0830091e103329108480194bc4b019400048", + "05221008052b54b0194801500b4f50740f9f7830091e0a2c43de1a6c43da80216cb1f7d00f1000400adL8;FF29fd46d3290500910a0840f94a0400b40b0440f9ed031faaec030aaa6b4100916e8541f8cf0140b2ce010d8bef11c0daef1540d2ef0d0f8bef250191ce194f8bL16;FFf70315aafb031aaafa", + "031caa89008052e97300f91b00001428a00791fa8b00f9fa0317aa0001c03df7a349a9e9bf00f969008052ec030baae03740f9e0f3803dBBBL8;FFf65745a9f85f44a9fd7b42a9ffc30191c0035fd6e0230091e1031faa22008052230080522400805223f7ff97f72341a996ffff17f8031faae0230091e1", + "0318aaL8;FF22008052bc6b0094603240f9a00000b4613640f9610000b422008052b66b0094611e40f9e10100b408068052606a68f822008052f44f41a9fd7bc2a8ae6b0014BL8;FF8082803c880200f98182813ce0ffff17e08741ade00314aaa08739ade08b42ada08b3aade18340ada18338ad70f3ff9", + "7a08779ad880080d20800f0f208050091L8;FF0d00098bae3540a9ad010eaabfc101f220ffff543f0101ebc2fdff540d68e9388dfdff37290500913f0009eb81ffff5460000014ae1d4092ad1d00128e696e38BBL8;FFe1630091a21b00b9e92302a9e8030091ff2301a9e1e1ff9740030035e003c03de80", + "b40f96002803d680a00f9fd7b43a9f32340f9ff430191c0035fd6b12b0194L8;FF541340f9bf2b0094e00317aa21008052b82b0094601500b4e10314aae20317aaf80300aabb2b0094482740f91f0500b120030054592f40f95b6340b9991100b4L16;FF09150071a8c31e38020400541f0900716d040054", + "1f1100710c0700541f0d0071811000546c0400f1a01200549f2900f14d018052eb031faae9031faaea031faaBBBBBBL8;FB6c20746f20c00d20746f20737563636565643a20c00025636970686572746578742076657273696f6e2077617320756e7265636f676e697a6564203cc0013e00L8;FF41008052", + "bb9f0094e00700f9601e00b4bc9f00944000805241008052b59f0094e00300f9a01d00b4b69f00944000805241008052af9f0094001d00b4f30300aaBL8;FF48008052f503012ae10303aa000d002af30303aaf403022a1bfdff9795040034a80200320811c0da081540d2080d088b0825019108fd46d308", + "050091d4030034L8;FFf6100094b9df79a9b8d77aa93f0b00b161050054750600b4a0a301d1e10318aae20315aaca120094bae779a96083c23cbca37aa9b5835bf8e01f803d5f0700b1BBL8;FF150840f9f60301aa3f0015eba204005408038052f30300aa090440f9c026089be80336aaf40302aaa80208", + "8b0805088b02f17dd3176040a9016000915a600194L8;FF9f0600b1001a0054e01bc13de11fc13de9830291e88344b9e1a30c91022780522041893cf883329121418a3ce983029120e10291f47312a9f53301b9e85701b9L16;FF800b0054680640f9b60a40f92a040091b41640f9490280526a0a00f9096", + "92138b60900b4c80240b20811c0da081540d2080d088b08250191c81a488b08050091BBBL8;FB74696f6e3a3a6e65776f766572666c6f77207768656e20616464696e67206475726174696f6e20746f206053797374656d54696d656000000000000000000000L8;FFe00316aad6fdff17e0630091220080", + "52230080522400805268a3ff97e11740f9e3fdff17e0630091e10318aae20316aa230080522400805260a3ff97f81740f9BL8;FF31fc00944002f8b7c8fefff00841049174d600a9780e00f9e00316aa0103805202018052680200f9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8aeff0014L8;FFaa2", + "c3ea9ac343fa9c0035fd61f2003d52c3440a90e0c409203ec7c9221000ecb42000e8b261c41a90c3400a9282442a92a2c43a92c34c4a9424002f169010054BBL8;FF6ac3ff9708008092686e00a9ff030891f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e83300f9b20356f8b083", + "54f8af3b7329aa277429L8;FF34190091fc432a91ac030014fb6300f9287c013569620e9168ca13916c4e42f9e9a309a968420e91694a42f9e85b00f96e5242f9775642f9761642f9781a42f9L16;FFe16700f9e1c30391e99300f9e9d343f9f4c743f9e047803d6093c73ce93300f9e9df43f9e8e303396", + "84740f9e0a70ba9e0831d91e9e343f9e0938f3ce92300f9BBBBL8;FBd4bb3dd70e6bafeddac63c9ea28cf671789400007713cb6fffb07e75a21a01f8faa35c68840fd9ee27558b914040e01f50050368a5e314df7fd56faeee4ad4ecL8;FFe80308abc2010054090840f9090100b42a0140b24a11c0da4a1", + "540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd600feffd0BL8;FFa02302d18fecff974010003641eeffb421010014e18f0cb96fffff17a88357f8080540f9150101ebe200005481010014a22302d1630c805270e4ff97e10300aaL8;FF680200f9f44f4ea9f76340f9", + "f6574da9fd7b4ba9ffc30391c0035fd6a0877dad680200f9a8835ff86082803c6182813c681600f9f44f4ea9f76340f9f6574da9BBL8;FFf4430291e223c03d17108052e1031f2a95020191e08707ade00741ade247803de21340adf97b40f9e133803de40305ade00f42adf83f4339e227803d8002188bL", + "8;FFe3230091e00308aa62028052ee4b0094fd7b41a9ff830091c0035fd6fd7bbfa9fd030091082440f9080100b4080140b20811c0da081540d2080d088b08250191L16;FFe85344f9e94f44f9e8d300f9e85b44f9e8ef00f9e86b44f9e8e300f9e87b44f9e8f300f9e88344f9e8f700f9e88b44f9e87f00", + "f908008092e87700f9e8030eaaBBBL8;FFc3150054e90240f9e00318aae30319aa2801088be90b40f9e82a00a928fd60d3880a00b5280940921f1900f1220b0054217d0353c10b00343f080071ac010054L8;FFe303142ab5ffff97c0fdffb4d2ffff17280180d2e00700f90800f0f2081500d1deffff17e", + "90b41b2e92300a9dcffff17280180d20800f0f2081100d1d7ffff17BL8;FF881e00b9b1ffff171f0100f1e1031faae8079f1a88820039acffff17e1031faa881a00b9a9ffff17e1010054e1031faa9cffff17c80080d2e11700f90800f0f2L8;FFe20300cb1f0022eafd0300914200008ae1030054e30322", + "aaf35301a9f40301aa7f0014ebe18b40b2422041fae8030054010000f021d047b981000034010000f0BBL8;FF210d0094e0a749f9800100b4e1d342f9e8cb42f91f0101eb20460054e8cf42f9090180522a04009109692138e1431691ead302f9140d0094e88f49f91f0500b1L8;FF9d020014090180d209", + "00f0f23a017fb2e91f4092fb0309aaa1035df8415200b595020014a8035df808011acb1f0308eb886f0054980200b4a8835df8e10319aaL16;FFf80301aaf70300aaebab00a968021891094080524a008052cbff9f52edff9f521c008092050000140c02003529010ecb08010e8b090700b43f0900f12e31", + "8a9aBBBBBL8;FB725f636861696e7370656e64696e675f7072655f6b657972656d6f74655f726567697374726174696f6e5f69646c6f63616c5f726567697374726174696f6e5fL8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab220a0054090140b22911c", + "0da291540d2290d098b2925019129fd46d3BL8;FF080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebe81b00541401001497010094080040b20811c0da081540d2080d088bL8;FF9f0900b101400054e0431391e1031aaaf7a714a9d7090094ec6b42f9ea6f42f9e9", + "7342f9f7eb44b99f0900b181440054e87b42f9f87f42f9e3fcffd063203d91BBL8;FFfa670ea9f85f0fa9f65710a9f44f11a9fd030391f30308aa081840f9e10b02a9172100f183190054181440f9f40300aaf50302aaf60301aae0430191e10303aaL8;FFe06b01f9e8c31791e16f01f9290c40f9e1830b", + "9120013fd6fcfb42f99f0f00b1810d0054a8008052a5ffff17e03fc13de143c13d1443172ae81345b9e063813dL16;FFf44f1ea9fd430691e9010090f40300aaf30308aa291140f93f0d00f1c3030054887200918900009029a11091e8a700a9886200918900009029c11a91ea230091BBBL8;FF882700a9", + "08fc60d3a80b00b5080840921f1900f1420c0054017c0353c10c00343f040071200100543f080071c1faff5481220191e003082ae20313aaf6fbff97L8;FFe18b49f93f0800b1800100543f0400b140010054810000b4e08f49f922008052b5770094e19749f9810000b4e09b49f922008052b0770094f47", + "749f99f0600b1BL8;FF3f0400b100020054e10000b4082440f9f30300aa22008052e00308aab6f70094e00313aa012c40f9e10000b4083040f9f30300aa22008052e00308aaaef70094L8;FFe20316aae10314aae003132aa0023fd6e4000094fd7bbda9fd030091f35301a9f30302aaf403012af51300f9", + "42cc218bf50300aa40200091610240f961ffff97BBL8;FFf68f45f90023009108810991f4074091948209915c8d0094e1074091e04316910239805221800991ba37019488220791d800805294018052000540ade8936879L8;FFe14b05f9e0432a9121fdffd021203f910202805263fdffb063e81d91c402", + "8052b8000014e04b05f9e0432a9121fdffd021203f910202805263fdffb063201f91L16;FFe17740f9c10100b4e05f40f90a0000145cfbff17d90000b4e07f42f9e10319aa22008052b4b70094e05f40f9e17740f9610000b422008052afb70094ba0000b4BBBBL8;FB61736564206f6e2073697a65732c2", + "0616c6c2073697a65732073686f756c6420626520636f727265637400000000000074194000000000005800000000000000L8;FFbf01186b29818c9a5f0500f108ffff540a09098b4b0140797f01186b610000545b050079c1ffff17aa0240f93a25899a9f030aeb8003005416091a8b88031aebBL8;FF09", + "01891a48020090a9050036081140f9e92740f91f0500f109030054c8fffff008213f91c0feffb000683891a92338a9e8632291090200b029411f91a10302d1L8;FF9f0600f1280100542900805228008052fb031faaf7031faaff2706a9e82b00f9ff3b00f906000014e883019125060094f72346a9fb3b4", + "0f9e82b00f900fdffd0BBL8;FF22008052bc470194e00314aa67cbff97081f00d129008052680600f969020039200000143f090071a1010054a8035ef809dd78920c000014f65343a9df0600b1L8;FF89028052e86301f9e96701f9f2feff172143c23c2007c03dfc430f912283c33ce8b341b9e04306918", + "10f803debc741b901048052e002803de9cf40f9ea9741b9L16;FFe9a700f92ba44ea9e88f00f928a007910001c03deba300f92ba04fa9e0f3803dea2f13a9e8a701a939a450a92aa051a9eaa704a9e80b00f929a052a9e84300f9BBBL8;FFbd670194615640f9810000b4605a40f922008052b8670194616", + "e40f93f0400f18b000054607240f922008052b2670194600203912eebff97e80340f9765e09a9L8;FF300000144d15c039ae1d00128c1d0e0b8c0102518d00f83761710c8bcb008052280000149f114071630800544d19c039ae1d00128c390e0b8c1140518d00f837BL8;FF1f1800f122050054217c0353", + "410500343f040071000200543f08007161fdff54888246f81f0500b1a10000549fe606a99ffe07a999fe08a99f9a00b981a20191L8;ZDBBL8;FF42008052e8db00f966fcff970a0380d228ffff9008890891690480520a00f0f2e8a716a95a1100d1e10740f9a1e6ffb59efdff1720ffff9000802d9123ff", + "ff90L8;FF1f0009eb29060054e80f41b2e80300f9e0030091f12dff97f44f45a9f52340f9fd7b43a9ff830191c0035fd6f503012a74040051e00313aac5020094e80300aaL16;FF08008092080300f9950400b4e00316aae10315aa22008052f44f4ba9f6574aa9f85f49a9fa6748a9fc6f47a9fd7b46a9f", + "f030391b0a70014b9035ff809008092BBBBBBBL8;FB72676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f62797465732d312e31322e312f7372632f62L8;FFc0a10094e00317aa41008052b9a10094c01200b488060091e00b00f9f3a301a9", + "141000b4e20a00d1e1031f2af30300aa1ca200947306148be9031faa28008052BL8;FFf44f42a9fd7b41a9ffc30091c0035fd6f30300aae00301aaf40301aae10309aa220080526d050094880a40f9e00313aae10314aaefffff17e00301aaf30301aaL8;FF39008092b70000b4e00315aae10317aa22008", + "052b82100943f0b00b1c1020054e81b40f9e9e34039e81300f9e9a30039da04003668ff70d369ff60d3610a40f9BBL8;FFe80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9ef5d0194ff0301d1fd7b02a9f44f03a9fd830091010840a9L8;FF680240f91", + "f0101eb200d0054680640f9090180522a0400916a0a00f909692138e10313aa50faff97e00314aa088c44f81f0500b160000054e10313aa75fdff97BL8;FF63b80e91e00300918202805264018052f1ffff17c90080d2e8230039480080520900f0f2e8270039e90300f9dfffff17e80f41b2dcffff17e00", + "300f9a1feff90L8;ZDBBBL8;FB4c6a460000000000ac6a46000000000034f84500000000002800000000000000080000000000000044694600000000009869460000000000c8f8450000000000L8;FF560300b4e11740f9e80f40f9945640f91f0101ebe0420054e81340f9490480522a040091e00316aae", + "a1700f909692138e1630091fd8eff97f71740f9e80f40f9BL8;FFf44f43a9fd7b42a9ff030191c0035fd6e0031faaf4fd0094e00741a9f2fd0094ffc300d1fd7b02a9fd8300910802009008a11f9109200091e02301a9c0feffb0L8;ZFBBL8;FF20008052f44f43a9f51340f9fd7b41a9ff030191c0035fd", + "6a8820091e9ffffd02961109142ffffb0427c1991e3030091e00314aae10313aae82700a9ef3d0194L8;FFf65704a9f44f05a9fd030091ffc331d1ff0300f9fb0302aaf30301aa28004b39fa0300aaf8c30d91f94308911f1100714d0200541f1900710c0300541f150071L16;FFe9a349a9f0b74aa9e9d7", + "00f9e98740f9e84f00f9e9df00f9e9af40f9e98700f9c8f2ff17e8008052eeb300f9e3f340f9e87300f9ee734ca9e8db40f9e4a709a9BBBBL8;FB0dc427c5ecf10920f664dc58ca0fa03c48c688b4623f12397ee018d8c52dab9ca73a242ae5e90000f47e6095901ae72819332dbc29975402450c6ce25c9", + "af5b3L8;FF29050091200108ab62000054fd7bc1a8c0035fd600fefff0002006910b8e009400fefff000e00391088e009400feff9000a00d91058e0094281040b96800c837BL8;FF1f0500b1a1f4ff5413008092f9d740f9f58b42b9f78f42b9fa1b00f959f6ffb53b008052f4e340f9fa0316aa74f7ffb5", + "36008052e92347a9e0dbc23de1dfc23dL8;FFe8c700f9e18b40f9810000b4e09340f922008052b8110094e13355a9ef0317aaeddf5aa9eb0316aaea1f41b9fa9740f9ee0318aaf0cb40f9410200b4e0031aaaBBL8;FFc1060091028c8152f40300aa168c8152c051019408c48052b61200f9a85201a92800", + "8092a84e00a9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e90f41b2L8;FF34008052582f40f9f8f6ffb4532b40f9bc510094e00318aa21008052b5510094200500b4e10313aae20318aaf60300aab8510094b3835df8acffff17e90313aaL16;FFeab70aa90a345aa9ed3f00f90c345ba9eeb31da9e", + "d3300f90c345ca9ecf700f9ed2f00f90c345da9ec7f00f9ed4b00f9009c00541f05007101bf005488008052BBBL8;FFf80300aae00313aa22008052230080522400805228fdff97610a40f9e00318aa1bfeff17ffc303d1fd7b0aa9f95b00f9f85f0ca9f6570da9f44f0ea9fd830291L8;FFe0431691e103", + "1aaae20318aaab100094fad342f9fc0740919c8301914afeff17e0fdff9000400891086e0094f80300aae043169122008052a0100094e1d342f9BL8;FF3f0108ebe00000548a6928380805009120008052290040f9280800f983ffff17e00301aaf30301aae10309aa220080522300805224008052f4030a", + "aa5f150094L8;FF00008012610600f964000014734e00a900008012d30a00f9f35341a9fb7345a9b2feff17e04040795aa31191002c46d3407b6078063c7cd3e40840f9207c4093BBL8;FF09692138ead302f9a01b0094e14316911d0f00949f0600b180000054c0020291e1431691a8140094e8b349f9f4", + "074091948209911f0500b18000005480020491L8;FFf8174bf9f51b4bf902278052c1310094f7e742f9f4e342f9e80240f9680000b4e00314aa00013fd6e10640f9810000b4e20a40f9e00314aaaf310094df0a00b1L16;FFfd7b08a9f65709a9f44f0aa9fd030291280840f9f30301aa1f0101f16106005", + "4681640f91f8120f101060054682240f91f010ff1a1050054e10313aa348c44f8BBBBBL8;FB7a000000260000000700000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000900000000000000L8;FF03feffd063001d9124feff9084a03191", + "a273009141038052a8730039fa95009420008052e10316aaef950094283c0012493c4092288108aa093c40922101679eBL8;FFe00308aba3ffff5400ffffb0008027910e16019400ffffb000c02e910b16019400ffffb00080109108160194080040f909ffffb029413891e00301aa08014039L8;FFe02bc", + "13d2afdffd04ae13d91e233c13de86f02f9e13f813de11fc13d2bfdffd06b813c91e03b813de01bc13de14b813de107c13d24fdffd084e03a91e047813dBBL8;FF37008052bb59019400f8ffb4e1031aaae20315aaf60300aabe590194e9030091a86300d1209100910f560094b7835ff89701f8b6f9031f", + "aae00319aae10317aaL8;FFe0032d91dcf3fe97e85346f91f0500b180620054e85b46f9e9f31691e02bc33de95b04f92900009029612a91e8c303f92800009008912991e85f04f9e8c31691L16;FF680200f9681a00f9694200f9db000014a80a00d1f46701f905000014e80b41b2e06701f902000014a80", + "600d1e0030b91e86301f9e9dfff97f40300aab4000014BBBL8;FF08050091290040f9280800f90cfeffb40a7c15533f0108eb53611932200100542a0440f90bfc63d35369283808050091280800f98b0200b5e0030caa1b000014L8;FFdf06007181010054eb7f52b9ec8352b96b0100346b0140b26b11c0", + "da6b1540d26b0d0b8b6b2501916bfd46d36b0d009104000014eb031faa0d0000144b008052BL8;FF080180521f2000a91f0800f90080813c600ac03d0180823c0080833cf30b40f9fd7bc2a8c0035fd60001805201098052ecf50094ff0302d1fd7b07a9fdc30191L8;FFe20313aaf50300aac2f9ff97e80", + "31faae9031f2a4a008052eb0315aa050000148d0200b46b0d0c8bf7020ccb370200b46d0140f9ff0a00f1ec328a9abf4100f1BBL8;FFeb672191e8b704f928818a9a49ffff9029e13e91f4ab04f960f18f3c8a0000102b7968784a090b8b40011fd603e4006ff6c744f90083c03c0183c13c0283c23cL8;F", + "F0900f0f23c4500911f011ceb808a0054e8430891e0c30e91e3c32491000543ad0221c03de8432a91e4432a9121fdfff021a03891020180520209803d000500adL16;FF7a6201a9080080927c0600f921f9ff17810000b4e0031caa22008052b6b90094b80000b4e08b42f9e10318aa22008052b1b90094e", + "19342f9810000b4e09742f9BBBBL8;FB6e636f6465722f6465636f6465722073657269616c697a6174696f6e5630563142024000000000006a00000000000000190100002e0000004202400000000000L8;FF490100f9a80000b4e01f40f901ed7cd302018052b8890094ff030991f44f45a9f65744a9f85", + "f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6f80f40f908008092BL8;FFe0feffb000401991e2feffb042801a91e1068052fa050194e0feffb000840d91e2feffb042e00e91a1158052fa050194e8ff42f9e90343f9e0feffb000000b91L8;FFfb1b40f9f65746a9f85f45a9fa6744a9fd7b42a9ff030291", + "c0035fd6e0230091e1031faa2200805223008052240080524ce6ff97e02341a983ffff17e0230091BBL8;FF750500b4540740f9be490194e00315aa21008052b7490194601800b4e10314aae20315aaf60300aaba490194571740f9570400b4541340f9b2490194e00317aaL8;FFe80300aae00301aaa8fe", + "0737680240f9090540f91f0009eb29060054e80f41b2e80300f9e0030091ec4fff97f44f45a9f52340f9fd7b43a9ff830191c0035fd6L16;FFed6300f9edf740f9e5d300f9e093803de1f3803de82b01f9f6bf00f9f2d711a9e70f00f9e70301aa08008092e2ef00f9e2031baae87700f9fba34ca9f65340", + "f9BBBL8;FF696a0194010700d15f0700b1612200f9c01e0054c002c03daa0302d1e02b803d950a00b4e8434179e98b4239f3334af8f6bf4239f7b34ab8a8031878a9231838L8;FF810000b460d240f922008052ba69009461da40f9810000b460de40f922008052b569009461e640f9810000b460ea40f92", + "2008052b069009461f240f9810000b4BL8;FF3f0500b1a10000549f6600a99f7e01a9997e02a99f3200b9e003082ae10314aae20313aa63faff97a00f00b520fcffb4d6ffff17898243f83f0900b161000054L8;ZFBBL8;FFe2830b91e403182ae5031baaf81f00b971beff97f89341b91f0b0071a107005", + "4faa359a92083c13c2183c23ce00600ad808601ade8b700f9bc0000b4e0031baaL8;FFe98301913a01028be90306912001088bc0290094e82341f9e92741f920030291e103069122008052080500b12935899ae82301f9e92701f9ef250094c8de7992L16;FF1f0500f1e0000054e80b40f9742200a9f44f", + "43a9fd7b42a9ff030191c0035fd6e00741a9f0a50094ff0301d1fd7b02a9f44f03a9fd830091010840a988008052BBBBBBL8;FB5f636f756e7465726f6e652d74696d652d7072652d6b657970715f726174636865745f73746174654e6f48656164657252656365697665646b796265725f6369L8;FF097d", + "10531b05c05a3405c05a9a0200b4c80a1a8b6a3f001209c15f785f01096be9979f1a29219f5a291d007200feff543f05007141020054a9035ef85f0309ebBL8;FFa9f7ff54e00313aae10318aae20316aa72010094780a40f9b7ffff17e00313aa220080526d010094610a40f9bfffff17e00313aae10316", + "aae20314aa67010094L8;FFfc6f56a9fd7b55a9ffc30691c0035fd6e90740f917008092e20344adff0600b1e11fc03de28302ade113803da2033cada103973cc1f3ff54810000b4e00316aaBBL8;FFbf0208eb49faff54e0c30591e10314aae20315aa230080522400805226e9ff97f4c340f9caffff17e0", + "5fc03de8c340f929008092ff0600b1690200f96082803cL8;FFf3031faaf9031faa35008052e0c32791e1c31d9102288052be5d009400630091e1c3279102288052fb9b05f9b95d0094e88b4cb949008052f9a305f9f5a705f9L16;FF0aebff97803240f9800100b4610a40f9680240f91f0101eb000a005", + "4680640f9090180522a0400916a0a00f909692138e10313aafdeaff97e00314aa080c43f8BBBL8;ZBL8;FFe8074091f6af45f9e043259108810991f5074091b5820991d5caff97f43349f9e0431691a122009102738052b97d0094e083c53de187c53d15008092e8436c79BL8;FFf50308aa14010037e003", + "15aae10314aae30313aaf44f42a9f65741a9fd7bc3a891feff17480014cb160113ab62010054e00314aae10302aae20313aa5afe0094L8;ZFBBL8;FFbff31838b0c302d1a8277229aa2f7329ac377429a0033ead0809c05a2909c05aa0033fadae3f7529a003dc3ca103dd3ca203de3ca303df3ca303983c", + "a203973cL8;FF22008052bc3d0094e80314aaf64b40f9e15f40f9a10000b4e06b40f922008052b53d0094e80314aafc432a91d60000b4e0031aaae10316aa22008052ae3d0094L16;FFe0831d91e16f00f9e1030e91f5c301f9f5430d91efb702a9ee6700f9eb2b00f9ea1f00f9f4230e39a092833ce8cf0", + "1f9f7d301f9a61f0094e7b343f9ff0400b1BBBBL8;FBa28ca28ca28ca28ca28c0000e26d56e256e2000005881fc4602ec6c02b1a57ca2eed7623ac24c2a6615336201b10088004403c955af7ce03e701514dadae53dfL8;FF000f805201018052ba8d0094805b00b4f80300aabb8d0094400180524100805", + "2b48d0094b3008052405700b4e8fdfff008013a9149408b52080140f909100079BL8;FFe1c3229102288052c20d0194e0c32791e1c31d9102288052be0d019448058052e9feffd029f51f91e8c303f9c80080d20800f0f2fb9b05f908390091e9bf03f9L8;FFf44f45a9f65744a9fd7b43a9ff830191c003", + "5fd6e92b41a9e00bc03d680200f9e80f40b9600a803d74220129692a01a9f44f45a9f65744a9fd7b43a9ff830191BBL8;FFe30300f9282545a9ffab05a9ff3700f9c90600b40a0d8052192101911c018052387d0a9b3a0080529b03805212000014371b40b934008052e82f40f9490700d1L8;FF080140b2", + "0811c0da081540d2080d088b0825019108fd46d316050091770a40f9570900b4740640f9f8031faaf90317aae00314aaeafcff97080040b20811c0daL16;FFe8d303f9e8d740f9ef0f04f9e8db03f9e9a349a9f21304f9e61704f9e8e303f9e8df40f9e9df03f9e8e703f9e8af40f9e72304f9e8ef03f9e8", + "c740f9ea2b04f9BBBL8;FF9fa207a909050054a8ffffb00881109109fd78d3684200390afd68d308fd48d3695e0039681201b848038052680e00f9080080926a520178d1000014a8ffffb0L8;FFe84346390a088052a00302d1f80310912a15003308111d12e8430639e8031091eabf0639200740ade0060", + "0ad2268ff97e00640ada00302d1808702ad0b830094BL8;FF3f0108eba124005481220091e20313aa1f0b0094f50300aadd010014e1430091e20313aaf70b00f9f73f00f9970a0094e08743adf50300aae227c03df4c300f9L8;FFfd7bbfa9040000f0e30300aafd03009184bc43f9481c80d2427c409380", + "0400d1e40304cb0100018b6000048a6300018b6100048a210000cb010000d411f7ff97BBL8;FF63feff17e04316912200805273110094e1d342f9abfeff17e0431691220080526e110094e1d342f92dfaff17e04316912200805269110094e1d342f98ffcff17L8;FFe11b42f9ffe71639411400b5a40000", + "14e8833f91e23f40f9a34301d10081c03ce8ff47f9a5c300d180008052e10314aae40315aaa8031ef8e8074091f6074091L16;FFf40301aa283040f9e22300f95f0008eb41380054f60302aaf30300aae023019181a2019102328052f50303aab9ad0094e0230191e10315aaac250094e8630791BBBBBL8;", + "FB8c96420000000000c494420000000000c91c4000000000004800000000000000cf0000000500000061626f7274000000c91c4000000000004800000000000000L8;FFaa431838aa7358382901084aab531838ab835838a9631838a99358384a01084a6b01084aaa731838aaa358382901084aab831838a", + "bb35838a9931838a9c35838BL8;FF4a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aabc20600542a0140b24a11c0da4a1540d24a0d0a8bL8;FF1d00001458ff78d3fb031aaa5a7c085348fc60d3eb7b42f9ed7f42f937fd60d35cfc78d3f90309", + "2af003182aef031a2aee03082aea0319aa130400140a0180d2BBL8;FFa0060054e0534da9df0214ebc9060054e10316aa22008052340600b4e30314aab6550194000600b520008052e10314aaed510194a083dd3ca183de3c09008092L8;FF8a0100b90afb0b918b090079eb630191ac0358f8482500a968", + "390c91a98358780c0100f9e8031691e9df06797cf0fe97f88345b91f07003160080054e8e20b91L16;FF6193c03cea030b91e8e30d39e8df43f92003029140f18e3ce9cb43f9f8432d91e1eb803de0ebc03d41f1ce3ce8cf01f9e8432d91e9bb01f940918b3c41818c3cBBBL8;FF080117cbbf0208eb480f", + "0054680640f9e10316aae20315aa0001178bbd750194e802158b680a00f9951640f9350300b4610a40f9680240f9961240f91f0101ebL8;FFc013005480220291ec290094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb681200548e000014800203918b24009", + "4BL8;FFe00313aa080c45f81f0500b14000005482feff97744640f99f0600b1e0020054735649a9950100b47622009104000014b50600f1d6620091e0000054c1825ff8L8;FF227823f8d6ffff170229009180020e91047862f8a4faffb4801840b920efff35800840f94500805282700091002040390010", + "40d3a520c01aa6040051e503054bBBL8;FF7f05007181010054eb7f52b9ec8352b98b0700346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0d009135000014eb031faa3e000014f3031faaL8;FFe1c32491022b8052c2350094e1f341f9f69344f93f0400b100010054810000b4e0f741f9", + "22008052b3350094e8830f9100810091faefff97a80359f8e05ac03dL16;FF22008052bcb50094e90315aae0874da9810000b422008052b7b50094e90315aae12340f961f9ffb4e00309aa22008052b1b50094f4031faa2bf9ff17e0c31591BBBBL8;FB64000000000000003d0f4000000000004a0000000", + "0000000b60200000900000042024000000000006a00000000000000550100002a0000004202400000000000L8;FF4a2501914afd46d34a0500919a1a40b95f070071e10500548bb243298b0600346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0d0091cc050034BL8;FF21835ff881ffff", + "b4200340f922008052b9050194f8ffff17e8e322910081cf3ce8e344f93dffff17e88b40f9c80000b40805088be00314aa0201805201f17dd3L8;FFbd05009421835ff8e1feffb4200340f922008052b8050094f3ffff17e82a40f9c80000b40805088be00315aa0201805201ed7cd3b00500945f1700f10", + "00e0054BBL8;FFe12b40f9797200a9683a00b9e81b40f969b203b8e90f40b97b2201a9e87b40b969020139e9fb4079681204b8e8c3413969520478e92340f9685e0139697204f8L8;FF22008052f44f41a9fd7bc2a8ba450014f44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd03009101004", + "0f9f30300aa810000b4600640f922008052L16;FF0aad5aa9eae700f90aa55ba9e9ff00f909ed40f9ea2f17a90aad5ca9e9cf00f909f140f9e9b300f909f540f9e9c300f909f940f9e9ab00f909fd40f9ea2712a9BBBL8;FFa8835f38e9b300b8a9035ef8e8c30039e89f0039e8230091e9f300f80981009", + "1a8a73da988ffffd008613e91a8831ef808008012ea1700f9eb7301f8eaf301f8L8;FFe1230091e20313aae8fcff97400200b4e9000014c1620091e20313aae3fcff97a00100b4c9000014c1c20091e20313aadefcff97000100b4d6000014e01c00b5BL8;FFc80080d20800f0f2080500d16effff17c800", + "80d20800f0f2080900916affff17c90080d2e8230039480080520900f0f2e8270039e90300f9e4ffff17c80080d2L8;ZDBBL8;FFbd250194e00313aa080c49f81f0500b14000005404010094745a45a9f60000b4f50314aae00315aaff000094d60600f1b5a2019181ffff54682640f9c80000b4L8;FF080", + "740f91f0100eb42020054e80f41b2e80700f907000014c90080d248008052e04300390900f0f2e8470039e90700f9e0230091e92bff97f44f4da9f6574ca9L16;FF030800540809c05ae0031faae80b00b9c82e40f904000014009000911f0002eba2f7ff54011000913f0002eb280300540a01008be90b4", + "0b94b0140b92909c05a" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines13 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines14.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines14.lean index 5d4b2f397..5bf732872 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines14.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines14.lean @@ -27,358 +27,250 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub14 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF1100669ef10000b5ff2100b1c0230054ef21009110020fabe3feff541d0100142f02c0daef11c0da0f0e4fab621e0054ef01168a706aef38d003f8361001168aL4;FF24008052f4030b2abf0000946aa240a9e00740f9690240f9e10313aa54692838080500911f0048f1680a00f9a3fd", - "ff540b7c0e533f0108eb7361193220010054L8;FFa00640ad600600adf44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd6a90e40f9680a40f9a082c03cf40300f9e90f00f9090116ebe083803ce3040054BBL4;FFa0100054e017c03de13340f9e0c30191e2830091fb1300f9e083823ce11f00f9", - "4eebff97e83b40f9fb0316aa1f0500b100010054e08744ade22fc03d8213803dL4;FF1fc123eb23fbff54834200d1bf1040f2a0000054030000d063c0029174d86678833e7cd305400091941c4092681000d15f7c0271497c0553421c45d39416039bL8;FF84003191e0030091a363009142008052b30f00", - "f924a0009468a20191810100d021dc1c91a40100b084200a91a363009162018052a80f00f91ba000941ba00094BBBL4;FF01e0019440720035e85341b9e85f00b957ffdfc8770000b5fadf0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd6L4;FB760100001", - "c000000500844000000000020094400000000008c08440000000000c009440000000000f80744000000000001014900000000004800000000000000L8;FFea2b00f90a6c51a9ebeb00f90e2c53a908219f5a081d0072eb3700f90ba040f9eb1f00f90bb054a9ec7b00f914b055a9ecd300f90db056a9ed67", - "00f9ecef00f9BL8;FFe20314aafb0300aae25f0194281f40f91f0500b1c10000542500001414008092281f40f91f0500b120040054382740f9d80900b4352340f9ca5f0194e00318aaL8;FFdf0208eb08070054680640f9e10317aae20316aa0001188bde5f00940803168b680a00f9540300b4610a40f96", - "80240f9b51240f91f0101eb40070054680640f9BBBBL4;FFf30300aa161040b9e0230091f40308aa529b0094a00642a9e2830191f66300b9e1faff97a80a40f9a81000b409fc79d3e1e7076fef031faaaa2e40a9ed031faaL4;ZFL8;FF20030054536928380bfc71d308050091290040f9280800f9abf6ff", - "b43f0108eb93611932400400542c0440f90afc78d39369283808050091280800f9eaf8ffb4BL8;FF6800c8376800d037198001141980011419800114ff0301d1fd7b01a9f51300f9f44f03a9fd430091080040f9e00301aa080140f915d140a9e803009110800194L8;FFe802158be81700f9e00314aa088", - "c4df81f0500b160000054e16300914193ff97888a40f91f0500b120eaff548142049136000014e11740f9e80f40f91f0101ebBBBL4;FF685e0039f44f5ba9f6575aa9f85f59a9fa6758a9fc6f57a9fd7b56a9ff030791c0035fd6e083c63ce183c73cbf0600b1c282c53ce84f40f9e00706ade083c43cL4;", - "FB2d000000000000006a0000000e00000072656d6f7465206964656e74697479206b6579206e6f7420636f6e73697374656e7420776974682070726576696f7573L8;FFe482843ce10314aa02328052e82b01f9e93701f9e10a00ade30201ade18a0fade38210ade40242ade48211add9bf009460220091e", - "1c30991023e8052d5bf0094BL8;FF800600f909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6e00301aae10302aa2e400114ff8300d1fd7b01a9fd430091a01300d181008052bfc31fb8L8;FF8d00f83761710c8beb0080521e0000149f014871830700544d1dc039ae1d00128c550e0b8c0148", - "518d00f83761710c8b0b018052140000148d7d1c53ad060034BBBBBL4;FF48fbff97a80240f91f0500b120050054b40a40f9e10313aa880240b20811c0da081540d2080d088b08250191881a488b000500913bfbff97610a40f9680240f9L4;FF098d0039e9ab54290a91003909950039e9ab53290a99003", - "9099d0039e9ab52290aa1003909a50039e9ab51290aa9003909ad0039e9ab50290ab1003909b50039L8;FFaa435ff8e95b0039e96f0039eb1f00b9e9830039ea1302f8e89302b813100194fd7b46a9f33b40f9ff030291c0035fd6ff0302d1fd7b06a9f33b00f9fd830191BL8;FF682603a9e95740b9686a", - "04a9694e01b9e92740f96082893c694a00f9e8a741a961828a3c7c8600f9688e00f9e82f40b97ca60fa9e90b40f9682201b9e82340f9L8;FF940100b094e20491610100d021341691a32300d142008052e40314aab3831ff82190009468620091610100d021301d91a32300d142008052e40314aaa8831ff", - "8BBBL4;FF53feffb5e8031faae9031faaea031faa0b0e8052140440f9f3031faa08510b9bfa031faa37510b9b56510b9b18000014fb1340f9f50308aae0e30091e10315aaL4;FBcb9f0bb09dc267489853730a01dd45e4c4149d8afc081a8924dda1938a4c17e19d149064a88a5511296483e2513ecce93c", - "95a29a53dfeb393c25a28cea1bdc4dL8;FFfc7340f91f0900f1f41b00f9fa9b00f9e4e300f9a90500543f0700b1e61f00f9e21700f9e7b300f9e0350054f60309aa28070091e97740f9e88b07f9a8010090BL8;FF000200541f11007141040054280180d20800f0f217000014e00313aaf7070094e80300a", - "ae8070036e00301aaf44f45a9f52340f9fd7b43a9ff830191c0035fd6L8;FFe9e70b912183c33c20f18f3c2083ca3ce9270c9122f18f3ce9670c912283c53c20f18f3c2083c43ce9a70a9121f18f3ce9e70a9108e10c9120f18f3c2083c63cBBBBL4;FFe00314aae11f8052d8ef0194a8060091bf2200f10", - "8fd43d309f17dd3280108cba832889a02000014e8031faa687e01a9f44f43a9f65742a9f85f41a9fd7bc4a8L4;FB4e00000000000000b9040000170000007a944800000000004e0000000000000057070000050000007a944800000000004e000000000000005807000005000000L8;FFe2edff97a00100b", - "46b00001481620091e20313aaddedff97000100b47d000014600d00b5e00313aabceeff97e80301aa40010036c80d00b5e1031faac1f8ffb4BL8;FF23008052240080524962ff97e103162a680640f9df0202710801148b63feff54e90f80123f002071ea0f801229140033c20000542a7c0653090500394", - "a051a32L8;FFe1d342f9e8cb42f9f97b49f91f0101eb403d0054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9920c0094fad342f9e8cb42f908011acbBBBL4;FF6a06805228048052ff2703a9690300b029150a91e92b05a9290080d2e1c300914914c0f2f90b00b9e87f04a9e827", - "07a9dcaf0194e0031f2ae8af01940000162aL4;FF68031ccbf50316aaf9031caa1f0540f11731989a9f0344f1a9faff541c000014df0219eb23050054f70300aaa08300d1e10315aae20314aae30316aa30010094L8;FF5c0080520d000014ba080094fa0f40f9e80740f95f0308eb60040054fb0b40f99c", - "070091410700919f021cebe10f00f9607b3a786006005480ff41d31f0001ebBL8;FF0201805201ed7cd3da2f0194e9c31291e8cf44b9f5bb44b920c1c03c9f0b00b1e8a304b9e027813d410a0054e8830291e99f40f9e027c13d16d10791e8a344b9L8;FFe000009000040091e200009042600191a115805", - "2e52f0094e8f741f9e9fb41f9c00000f000743d91e300009063401191c40000f084403e91e2c32491c1058052BBBBBBL4;FF611a40f9c1fdffb40804805205000014611240f93f0400f12bfdff5408028052806a68f822008052d2170294e4ffff17fd7bbea9f30b00f9fd030091010040f9L4;FFea7f42f", - "9e0431391e86b02f9fb6f02f9fa7302f9f57702f9e97b02f9ea7f02f9b0f5ff9708008092e00313aa880200f9fdf4ff97210340f9280041d23f0000f1L8;FF29811f91008500a90a0d00f9090100f9c0035fd6290080521f7d01a9090500f9690200d029210e91090100f9c0035fd6690200d029e11e9100", - "8500a9000d00f9BBL4;FF201100b44803009008c13f910900f0d2000540ad02f1c13ce8058052680201a9681200f928008052000400ad02f0813c682600a9e00300914680ff976f000014L4;ZBL8;FFa80f00f92898009481010090219c1591840100f084200b91a363009182008052b30f00f9209800942", - "0980094fd7b41a9f31340f9ffc30091c0035fd6fd7bbca9BBBL4;FF932201b9f44f48a9fb2340f9f65747a9f85f46a9fa6745a9fd7b43a9ff430291c0035fd6e8630091e0230091e1031faae2031f2afdd70194faef41a938008052L4;FB3934396366386336623562353537662f62797465732d312e3132", - "2e312f7372632f62797465732e7273002745787065637465642061206e756d62657220626574L8;FFe81704f9e89f40f9eb4704f9e81b04f9e81740f9ed4f04f9e82304f9e8a744a9e55304f9f77304f9e82b04f9e83b40f9e92704f9e97f40f9e83304f9e84340f9BL8;FF8b0b0094f4bb49f99f0600b1e", - "0b2ff54f5c349f9f3bf49f9950e00b47622009104000014b50600f1d6620091e00d0054c1825ff881ffffb4c00240f922008052L8;FF3f0b00b1e1c8ff54a3010014c80080d2e15706f90800f0f2080900d1ca000014e05706f9e80b41b2c7000014c80080d2e15706f90800f0f2080900d1d0000014BBBB", - "L4;FFc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aad1f70194e08741ad28008052e217c03d800600adL4;FB6e6b6e6f776e2d6c696e75782d676e752f72656c656173652f6275696c642f6c69627369676e616c2d70726f746f636f6c2d61", - "34346366356131646330623666L8;FFe0030091420180524400805209000014e00300f941020090216c1c914302009063181591e0030091420180526401805231ecff97e10340f986ffff17ff0302d1BL8;FF600d00b4e88b40b9e9b348b8ea3b40b9e08744ad7b0200f968aa00b9eba3422969b20ab8690", - "1001260828c3c61828d3ce08745ad69220f29e8a741296182813cL8;FFe8bb0ef968008052ea074091e94f09f94ac13591e1074091e93709f96901009029110491e84b09f968010090081d0391e94309f9290080d2a04700d1e85b09f9BBBL4;FFf51740f97f0600b100030054bf0214eb80150054e81b40", - "f98a060091e1a30091e00313aa49048052ea1f00f9096934383ca3ff97f41f40f9f51740f9a80214cbL4;ZDL8;FF28e179d380320a9b021109cbdbb70094740a00f9f44f41a9fd7bc2a8c0035fd6fd7bbea9fc4f01a9fd030091ff830dd100844cadf30308aae8a70891026cc03dBL8;FF4a194b8b4a0500", - "91090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8bL8;FF9f0a00b1742a01f968420e39772e01f9763201f96a6a02b96b6e02b97a3a01f97b3e01f9210600546a008052686209916b620a91eab30e396a2647a90", - "001c03dBBBBBL4;FF70ecff97e8030491fa031faabcc302d11b0140b2f8330191330400b073820591191380524a0000140e000a8a01696efc228c202e4f00669ef0c101f2a0010054L4;FFe9031faaf50000b46002148be10308aae20315aadf070094e10318aae90314aae80740f93501158bf50f00f909", - "0115cb285041a99f0209eb48060054d40000b4L8;FFe00308aaa2018052fd7b42a9ffc3009116080114410200f021dc1991e00308aae2028052fd7b42a9ffc300910f080114ff0301d1fd7b01a9f51300f9f44f03a9BL8;FF00603891de870194200300d000a02791db8701942003009000601c91d887019", - "4fd7bbda9f50b00f9f44f02a9fd030091014840f9f30300aa1fa400f91f0800f9L8;FF940a00916907c05a09793a78aa0a00f980fcff54c80e40929b0240791565b89bba0a40f9a80240f95f0308eb21feff54e00315aa8ad0ff97eeffff1740008052BBBL4;FFe1010054ee4f00b9ed2b00f9ec2703a949", - "0080522c0000141f1d0071c00400541f210071c1000054ec2703a909018052ee4f00b9ed2b00f923000014280400d1L4;FB6e636f64696e672e72730076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f73657373696f6e5f6d616e6167656d656e74L8;FFb9010014", - "ff0600b1600200549c0100b4d5220091040000149c0700f1b5620091e0000054a1825ff881ffffb4a00240f922008052cfc70094f8ffff17d70000b4BL8;FFfdc30091080040f9090540f9490d00b40a0140f9410180390101f8b7e0031faa4a050091290500d10a2500a9fd7b43a9ff030191c0035fd63f", - "2900f188000054L8;FF6b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500542a0140b24a11c0daBBBBL4;FFe97f40b9fa0316aabc2200b99f03096be00705ada00600ada3f3ff540600001420c30091421e0094381f", - "40f93af7ffb5bdffff1748008052a00302d1e3830291L4;FB0c000000000000000b000000000000000b0000000000000004000000000000000e0000000000000020de48000000000025de48000000000031de480000000000L8;FF3f0800718c0100543f040071000300543f08007121020054001b00b5a0", - "c303d1bee6ff97e80301aaa0030036c8fcffb4d80000143f0c0071400200543f100071BL8;FFf50b00f9f44f02a9fd030091210300b4090040393f210071810300543f8431f121040054f50300aaf40308aacd670194008c815221008052cb670194200400b4L8;FFfd7bbea9f44f01a9fd030091140040f", - "9f30300aa880241d29f0200f108459f9aa80600b41f0500f1000200541f0900f121090054610a40f9810000b4600640f9BBBL4;FF297141f80d5101780d0880528c111d126d15003309f101f8290080920c2100390a7101f80d9d0039090100f9c0035fd6090500f9290180d20900f0f2090100f9L4;FFe3", - "0f02a9e11b00f9e07f072963020f32060080d2050080d2610c8092637c4093000780d23e0a0094037c4093e000f837d3009836280380d2e00303aa410080d2L8;FFeca70094a00100d000a03691a301009063202691a40100d084403791a24700d141048052e3a70094a001009000003f91d3a70094ff430", - "0d1e8031f2ae9330091BL8;FF090040b90aca89522a49a7723f010a6b200200543f9000f141030054f30308aae84300912a140094e81340b91f05003161020054e043c13c7f020039e003803dL8;FFe00313aa21008052d7270094400100b528008052880600f909028052936a29f8880200f9f44f41a9fd", - "7bc2a8c0035fd620008052800600f909028052936a29f8BBBBBBBL4;FFe0830091010480525f0108eb0295899a02010094f95342a9e11b40f9b90900b4780240f9e15700a9750a00b4000340fdfb0740f9fa031faafc0318aa0088202eL4;FF961200f98082823ce21b00942800805268420039ffc30b91f", - "44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6fc0305911b008092b70000b4L8;FF400200b4e81242d3155000a9f70300aa152001a928008052081000f9e80318aaa90216eb9402168bf533899a145500a9135d01a9f44f43a9f65742a9f85f41a9BBL4;FFe80e0039e81a40394a010", - "e4a29010f4aea120039ea1e4039e9160039e92240390801104ae81a0039e82640394a01114a2901124aea1e0039ea2a4039e9220039L4;ZFL8;FF214c1691e80300f9e823009162008052139c0094a201009042201591e0230091e10300910f9c00940f9c0094fd7b42a9ffc30091c0035fd6fd7bbfa9fd0", - "30091BBBL4;FFe017883d80f3c23ce8820139280500b149358a9ae11b883de212863ce02b883de87b10f9e97f10f9dcdb019428048052897f413980f3c43ce8fe013981f3c33cL4;FB64206c656e677468206578636565646564756e657870656374656420656e642067726f757020746167696e76616c69", - "6420737472696e672076616c75653a2064L8;FFe97f00f9e9e742f9e82f00f9480200b0e98300f908b140f9f19300f9f69b00f91f0900f1e1b300f9ea5b00f9ef6f00f9f24b00f9e9050054a80100f008110f91BL8;FFe85b09f928038052a90fc0f2ea5f09f9aa0a805221800991ff3309f9e83b09f9ff3", - "f09f9ea4709f9e85309f9e95709f9dc5b0194f6ef47f9e01bc43de11fc43dL8;FFe4170ca9e6230da9ff230b39ff7b01f9e20f0fa9e41710a9e62311a920013fd6e06b01f9e8c31791f3c31791e16f01f9290c40f9e1830b9120013fd6f4fb42f9BBBBL4;FFe1e7076fea0740f91b0080920d0a8052c8050", - "0d10e010eeaa1fbff54208d212e00a8302e0800261e48010037292100910003098b18000a8a496b78fc208d282eL4;FB676e6572207461673a20c0002f72757374632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c696272L8;FFe20313aafe0", - "40094f50300aa2d0200143f0900b1a0140054e80b41b23f0108eb4114005481220091e20313aa09060094f50300aa230200143f0900b180170054BL8;FF68420591010300b021fc3591a3630091c2028052e40315aaa80f00f9227c019468520591010300b021543691a3630091a2028052e40315aaa80f0", - "0f91a7c0194L8;FF220080522300805224008052b891ff97e11740f97bfbff17e0630091220080522300805224008052b191ff97e11740f9b5fcff17e06300912200805223008052BBBL4;FF2002805221008052d7bb0194406300b4280f8052890300b029d53d914a0080d22001c03d0840003928038052", - "0a00f0f229028052480108aa690201a90000803dL4;ZBL8;FFf44f48a9f65747a9fd7b46a9ff430291c0035fd6fd7bbca9fc5f01a9f65702a9f44f03a9fd030091ff831ad1ff0300f9f50302aaf40301aa200442adf30300aaBL8;FFa9140054088c48f81f0500b12011005464feff97080040b20811c0da", - "081540d2080d088b0825019109fd46d30800098b080500911f0109ebe80f005496000014L8;FF210740f9810000b4220b40f9e00315aad83b00949f0a00b141040054f94308915707003676b641f978ba41f971620e9168be41f96ac241f9fc432a916bae41f9BBBBBL4;FF954640f9550300b4610a40f96", - "80240f9944240f91f0101eba0160054680640f9490f80522a040091e00315aa6a0a00f909692138e10313aa3af7ff97760a40f9L4;FFb4733fa9da030094bc0000b4e00314aae1031caa22008052d60b0094e0031baae10317aa22008052d20b0094b90000b4e0031aaae10319aa22008052cd0b0094L8;F", - "F600640f901e97bd302018052d90b0194e00313aa0109805202018052f44f41a9fd7bc2a8d30b011421010054810000b4601240f922008052ce0b0194611a40f9BL8;FF21802991240300f084602591e3230091e00308aa82008052e90700f9178c0194fd7b41a9ff830091c0035fd6210300b021702991e", - "00308aa82008052fd7b41a9L8;FF230300143f8b00f1201500543f9300f161060054f70314aad28b0094006c805201018052d08b0094006500b4f30300aaf4031faa88048052750100f0b5f20491BBBL4;FFe8f77fb21f0008eba83000549f060071e1010054a8035df81f0500f1402d005428008052a983", - "5df80b050091e003192aa1c300d10a018052ab031ef82a692838L4;FB6a00000000000000190100002e00000025194900000000006a00000000000000ca0000002e000000000000000000000008000000000000000800000000000000L8;FFe1bf43f93f0500b1a05b0054e8cf43f9e0c343f99f0700b1f6", - "cb43f9e84b00f9e8d743f9e84300f9e8db43f9e82700f9608c0054e8d343f9eac743f9fb031c91BL8;FF600640f922008052da4b0194611240f9410900b408038052606a68f822008052f44f41a9fd7bc2a8d24b0114604a40f9a00000b4614e40f9610000b422008052L8;FF0811c0da081540d2080d088", - "b0825019108fd46d308050091090840f9090300b40a0440f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0daBBBBL4;FFe8031baaf7031aaa15020034e8430291e1031aaa5703028b0001158bddeb0194e82755a960020291e143029122008052080500b12935899ae82715a9d7eb01", - "94L4;FB0800000000000000304b420000000000000000000000000008000000000000000800000000000000304b42000000000000000000000000000800000000000000L8;FF220080522300805224008052b8010094610a40f9aeffff17e00313aa220080522300805224008052b1010094610a40f9b5ff", - "ff17e00313aae10318aae20316aaBL8;FF22008052db6b0194bdfeff1708008092686e00a9c80600d11f0d00b108d7ff54f6ffff1708008092686e00a9160100b4e00317aae10316aa22008052cd6b0194L8;FF43010034081c0012f30302aa1f0900714c010054080200341f05007141030054000180521", - "d000014280180d20800f0f2081d00d11e0000141f15007100020054BBBL4;FFe88f40f909208052e08744ad282508aa080dc0daa0073dadff230ca9e28345ada2033ead06ac019400e4006fff3f0339e9235f29a0033dad088109aa29008092L4;FFec010c0a0f3211aa30017ab20d1c00128c01080a0912", - "899a0e1c045310c471d3ad0501539f010b6a2b017bb26911899a0bfc5bd30ce873d3df010d6aee8510aaL8;FFb5eb3ea9bf831ff8e80f40f9a083de3ca9835ff89f0308eba0039d3ca9031ef8c1f8ff540063009166ab0094c3ffff17f7031faa18038052390080520c000014BL8;FFe9671f91a80359f82", - "183c43ce5432591c082833c2083c63ca68302d1e87704f9e85b44f9a70302d1c082863c404fc03de203182a2283c53cc182843c4143cf3cL8;FF381f4092fa0f41b2091f40921b0309aaa1035df8815c00b5e7020014a8035df808011acb1f0308eb28780054180500b4a8835df8e10319aae20318aa0001", - "1a8bBBBBBBL4;FFeaf8ffb43f0108eb73611932600500549369283808050091280800f9e006f8b7e0030aaabfffff17e10300a9e00301aae10309aa220080522300805224008052L4;FFe96353393f050071cc160054f8db40f9894e0035ea0f41b27a02001409a340b8eabf4979e0074091eb7742f9ecc3", - "533900401d910d1340f868230039e87342f9L8;FFc8008052680200b9fd7b42a9f31b40f9ff030191c0035fd6e083c03c080080126042803c680200b9fd7b42a9f31b40f9ff030191c0035fd6ff4301d1fd7b03a9BBL4;FFfa3700f95a070091c003005435835cf8f50100b437035cf8d2930194e00315aa", - "21008052d0930194202100b4e10317aae20315aaf60300aad6930194280340f9L4;ZDL8;FF04000014940600f1b5c2019140030054a1825cf83f0400b140010054810000b4a0025df822008052d2930094a1025ef8810000b4a0825ef822008052cd930094BBBL4;FF4183c33c4283c43cea4300f9e20303", - "ade117803dc0ebff54e00743ad3f0117ebea4340f9a0073dade00741adaa031cf8a0073bade00b42ada00b3cad40030054L4;FB2907e3ee000054fa4eedcafd06cdc1340c36e3244eb67cbdd768ff92a0035f2ac6a51ca82011eec4a26d12210932fd6eb394c1276d9a0a18af863985fcd632f5L8;FFe92b", - "47f9f0b300f9f0031aaafabf40f9ee3300f9ee0305aae92b01f9e9e740f9f8031caae50316aaf60318aae37b00f9e9bf00f9e92b40f9fc030faaf88f53a9BL8;FF08011acb1f0308eb483c0054e8cf42f9e10319aae20318aa00011a8bdd530194f90b40f94803188be8d302f9df0600b14064ff54816203", - "91e243169140008052L8;FFe00313aadb530094e14b41f9810000b4e04f41f922008052d6530094e89f40f91f0500b160000054406302915fedff97f3d352a9940200b47522009104000014BBBBL4;FF830c8052ecd9ff9780f8ffb417000014a00301d15cf40094e80300aae00301aa48fb073611000014", - "a80600d1090080921f0d00b1697200a9e8edff5442000014L4;FB705f636970686572696e76616c6964207369676e6564207072656b6579206964656e74696669657267e6096a85ae67bb72f36e3c3af54fa57f520e518c68059bL8;FFa9040054e00313aac4f2ff97e007003728fc60d3c80400b5200840", - "921f1800f1a2050054217c0353210600343f040071c00100543f08007161fdff54880240f9BL8;FFe0c30191e37301945d000014c00640ad48fc46d3e9c3029157e07a925414409220010191e20308aaffbf0339e08707adf50301aae88b00f901740194e0c30291L8;FF22008052db730094e18f49f9810", - "000b4e09349f922008052d6730094b30000b4e07b49f9e10313aa22008052d1730094e807409108810991006103918b0b0094BBBL4;FF60f9ffb469000014bf633ba9bf031cf8a14301d1a26301d1fc9cff9780f8ffb46b000014bfe33ca9bf831df8a1620091a26301d1f59cff97a0f7ffb45b000014L4;", - "ZBL8;FF88008052620a00f92900805268220039690200f9f44f47a9f92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd6e9719cd2d53240f909c7b1f2691cc7f2BL8;FFe1031faae82f06f9bfffff17e1031faae8570cb9bcffff17e1031faae8630cb9b9ffff17e1970cb9f2feff17e1930cb9f0f", - "eff1708018052ffeb05f9f6ef05f9L8;FF080500d1c5000014c80080d2e0632a39e0432a910800f0f2ff672a39e84b05f9f328ff97e10300aae14b05f9e0432a91e10000b021e0029102028052e30000b0BBBBBL4;FF080040f9130140f91f0100f9f30100b4281040391f050071e0010054690240f9e803", - "009120013fd6e00740ade20bc03d600600ad620a803dfd7b43a9f32340f9L4;FF29c100513f250071880b00545f0500f1000b00540b0540396bc100517f250071c80a00544c0180525f0900f1292d0c1b000a00540b0940396bc100517f250071L8;FF600640f922008052da030194610e40f9810000b460", - "1240f922008052d5030194611a40f9810000b4601e40f922008052d0030194612640f9810000b4602a40f9BL8;FF020300f042800091e82700a9e8230091090000b029211591200440a9e82701a9e8030091090000b029411a91e82702a9e3430091ec830194fd7b43a9ff030191L8;FFe00301aa610100d", - "021003d914200805256840014ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa610100d021083d91e8030091e00309aaa2008052BBBL4;FFc842009109008092692200a9ff431c91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0c342f9b9ffff17e8231091f50742f", - "9f40b42f9L4;FBbd0000002e00000034684900000000006a00000000000000190100002e00000034684900000000006a00000000000000ca0000002e0000003468490000000000L8;FFe16f40f9810000b4e04740f922008052d8c30094dbfdffb5f9031faadcffff17e0030e912ec1ff97daf7ff17e8c31", - "5910021009135bdff97e06740f9e10f40f9BL8;FF680640f9490280522a040091e00314aa6a0a00f909692138e10313aa88fcff97760a40f9680240f9080116cb9f0208eb48060054680640f9e10315aae20314aaL8;FFa80302d1e10316aa60c30291bc0302d11a5fff97a80358f81f0500b120120054e0", - "82c13ce80700f9e8030b91f7430f91f89301b9e91740f90029803da8835af8BBBBL4;FF8100805200e4019420f20035e85341b9e8db00b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1L4;FB74696d657374616d704d6573736167654b65", - "796369706865725f6b65796d61635f6b657969767365656450656e64696e674b796265725072654b657963697068L8;FF690200f90b000014280080527f2200a9080080927f2201a99f0600f1ab000054e00740f9e10314aa22008052d1e30094f41b40f99f0600b1e0010054f38743a9BL8;FFa20180521", - "9640114e00301aae10200d021c039912201805214640114fd7bbea9f44f01a9fd030091f30301aaf40300aacc6301940003805201018052ca630194L8;FFe26300944001009000a00f91dc6300944001009000a00991dc6300944001009000000a91d66300944001009000600a91d3630094ff0301d1fd7b", - "03a9fdc30091BBBL4;FFff074091ff830a91f44f42a9fc0b40f9fd7bc3a8c0035fd60a2500a9ff074091ff830a91f44f42a9fc0b40f9fd7bc3a8c0035fd62000805201048052e5a30194L4;FF1f8d0171e5979f1ae7879f1aa90200342900094b3f2500714c0200541f8d017108050011290d80122821881", - "a68c00d390c000014004300911f0001eb88000054L8;FFff8300d1fd7b01a9fd430091810100f0210c1691a40100d084801e91e323009182008052e80700f914a40094fd7b41a9ff830091c0035fd6810100f021fc1591BL8;FF08004039a01300d1a8c31f380b240194fd7b41a9ff830091c0035fd6ff83", - "00d1fd7b01a9fd430091080040f9e0230091e80700f904240194fd7b41a9ff830091BL4;FFe00702ad800640ad290dc0da080dc0da892207a9e00700ad820243ade20303ad810241ade10301addc23009400e4006f9ffe0139e0030091882648a98a2e49a9L3;ZBBBBBBBBBL4;FF29030a8b08651b9b0232", - "80529701178a9c0700d12b210039e00308aadd1d0294bcfaffb520000014090180520801098b292100910801148a206b68fc00a8200eL4;FFb628fe97f80b40f91f0b00b161050054e87b4039e93b407939008052ea1b40b9ebdf4039fbf341f82841082ae9f342f8f77342f8eb2300395a8108aae90300f", - "9L8;FFe00800b4e10317aae20313aaf50300aae01d0194c142009100008092d74200913f1e01941f0400f1200100541200001435008052c142009100008092d7420091BBL4;FFc182c03ce10b00adc282c43c020119cbb80202ebe20302ad02010054e002198be10314aae20315aada9d01942803150be8f", - "f00392000001419020034e8030091L4;FF0100050be203002a80fc5f885f00006b01ffff5481fc008880ffff35c0035fd685fc5f88a504001185fc0088a0ffff350700b0120600b05211000014e00304aaL8;FF599e0014281040b9000040f96800c8376800d037099e00141d9e00141d9e0014281040b90", - "00040f96800c8376800d037ef9d0014e89d00141d9e0014e00301aaBBBL4;FF1f0000f1ad000054390300eb233200541803008b060000141f0400b1a1310054f7dd01941f1000312131005439feffb505000014e043059181008052f2dd0194L4;FB500000004e00000075726e3a757569643a0000000000", - "000089094900000000004900000000000000600000003900000089094900000000004900000000000000L8;FF162042a93f031cebe94700f9090c41a9e0b3823de8bb00f9085443a91b4446a90e9853a9e9231fa9092044a90d9455a9e8cf00f9081047a9e8a71aa9142048a9BL8;FF22008052db5d01949", - "a030014f6df44f9e04316910123009102738052dd5d01949800805211020014f6eb44f953000014e8074091f69b45f90023009108810991L8;FFe00313aa22008052f1000094610a40f9e00315aaadffff17e00313aa22008052eb000094610a40f9bcffff17e00313aae10317aae20315aae5000094770a", - "40f9BBBBL4;FF17e97bd3368100d1b70200b4d6820091e10315aaf78200d1e00316aabfd7009440ff0736cffd0194e001805221008052cdfd0194200900b4080400f008e11491L4;ZFL8;FF1f0116ebc90a0054e00313aac3fcff9720fe073728fc60d3880a00b5200840921f1800f1c20a0054217c0353e", - "10a00343f080071ac0100543f040071a0030054BL8;FF230300906300399126030090c6803891a52300d1e00308aae2028052e4018052297e0194fd7b42a9ffc30091c0035fd62103009021443791e00308aae2018052L8;FF210c00545afdff17e8031faa000117abc2630054e1630091517dff97df0600", - "b1e00a0054e11740f9e80f40f91f0101ebc03b0054e81340f92a04009180220291BBBL4;FFf65711a9f44f12a9fd430391f30308aa610700b4f50300aa090400d0b40301d1a8164038087d0453e853003929b140f93f0d00f109040054e853009189030090L4;FB908749000000000011000000000000008", - "e010000050000009087490000000000110000000000000098010000050000002e626173652d6b657973626173652d6bL8;FFc50100d0a5e03091e103009162220891e0031f2ae3031faa4cbe0094fd7bbea9fc4f01a9fd030091ff830ed100844eade10300aa02328052f30308aae0071badBL8;FF490109", - "abc20400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9030054200108ab22010054fd7bc1a8c0035fd6L8;FF3d32ff97a1035df8e80740f9f30301aac80000b4e00b40f9e10308aa22008052d43d0094e10313aae81340f9c80000b4e01740f9e10308aa2", - "2008052cd3d0094BBBBBL4;FF29ceff54e00313aae10317aae20315aa230080522400805245000094770a40f969feff17e00313aa2200805223008052240080523e000094610a40f970feff17L4;FF1f0900b1a104005428008052ff0701f9e80b01f9e89340f9ff0f01f9a80000b4e08b40f9e19340f922", - "008052d10d0094e8a340f9a80000b4e0bf40f9e1a340f9L8;FFf60301aae10315aae20314aa5ef7ff97750a40f9e10316aaeeffff17ff8301d1fd7b04a9f32b00f9fd030191f30301aae10300aae0230091e2031f2ae5faff97BL8;FFfd7b41a9ff830091c0035fd6210300d021702991e00308aa8200805", - "2fd7b41a9ff830091118e0114ff8300d1fd7b01a9fd430091090040f9e80301aa2a0140f9L8;FF08050091090c40f93f0500b1400400540a1440f9092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b2BBBL4;FF4bc0ff97f92740f9e81f40f908", - "0119cbff0208ebc9e0ff54e0e30091e10319aae20317aa230080522400805240c0ff97f92740f9fefeff17e0e3009122008052L4;FB57000000000000007b00000040000000de194900000000005700000000000000f00000003d000000de194900000000005700000000000000b80000001f000000L8;FF", - "9f0700b16ca742a9618343a96aeb44a9773b5129803c0054ff420171403c0054df0600b1407f00543f0400b1f70318aa20020054e10000b422008052f8030baaBL8;FFe9030b91e17740f92015803de89301f9a10000b4e07b40f922008052d54d0194e9030b91ea0740f9e81740f92015c03df87f00f9ea", - "a30ea9e89341f98082823cL8;FFa0831df8201100b4080d8052b3835df8fc031faa887e089bfb0314aaa8031ef81100001436008052a9835ef8aa835ff868021c8b7b0700d15aa301919ca30191BBBBL4;FFfd830091f50300aa40c50094f30301aaa100f8b6f6031faae00316aae10313aae1ed0194f703", - "00aa930200b4cded0194e00313aa2100805236008052caed0194L4;FB72650000000000000000000000000000080000000000000008000000000000003083420000000000dc2240000000000018000000000000000800000000000000L8;FF08fd46d308050091d4030034890200322911c0da291540d229", - "0d098b2925019129fd46d3290500912001088be10313aa4bedff97f502003574040034610a40f9BL8;FFeb2303a9e80e0054f8031faaf7031faaf50316aae802188be00741ad1f0115ebe933959a160109cbe9a30191e8030091b70216cb35210091e00702adff0214ebL8;FFfad342f9fc0740919c83019", - "10ffeff17f60300aae043169122008052ec100094e1d342f9e00316aa32feff17e043169122008052e6100094e1d342f943feff17BBBL4;FFfa670aa9f85f0ba9f6570ca9f44f0da9fd0302910080c53c0180c63cf40301aa083c40f90280c43cf30300aae00702ad0080c13c0180c23c16a840b9e83300f", - "9L4;FF200020d455fc41d3bf0214eb68020054f4031faae8031faab50000b40000148be20315aa330f0094e80314aa0801158be80f00f9e083c03ce80f40f96002803dL8;FFe92b00b51f4100f1a12b0054390440f9f8031faa5500805217038052e01f00f9ff7f1fa9ff1701f9ff1301f9ff2f01f9ff2b0", - "1f9ff4701f9ff4301f9ff5b01f9BL8;FFfc831291e8db42f9f90316918043c03df7cf42f9fbc742f9f5cb42f9e0e31b9181e200910227805220af803de82304f9d82d0194f63f42f9f43b42f9c80240f9L8;FFb50000b4e00314aae10315aa22008052d82d0094e88340f9f69340f9008545a90c060094e8", - "8340f9f40300aaf50301aae00316aae10314aae20315aa039144a9BBBBBBL4;FF00802291e1150294400400f000800291de150294400400f000e00291d8150294400400d000e00d91d8150294400400d000400e91d2150294400400d000a00e91L4;FFdcfe78d3f003182ab91e00b4ca7e0853e0031baae1", - "0319aa22008052f9030baafb030caaeadb19a9f60313aaf30314aaf40315aaf50309aae8df1aa9f7031caaL8;FFc0035fd6ff4301d1fd7b02a9f65703a9f44f04a9fd830091340440f9f30300aa88ba00d11fb900b128010054a8008052740600f9680200b9f44f44a9f65743a9BBL4;FF69010a4ae84300", - "39880e4039e9470039e94f4039aa010c4aea4b0039ea5340398b7240392801084a89124039ecb34039e84f00398d764039f0bb40394801094aL4;ZBL8;FF7f0209eba9140054088c48f81f0500b12011005409faff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f01", - "09ebe80f0054BBBL4;FFa2a302d110c0ff97405700b5f5031faa95ffff17a2a302d1630c8052e6bbff97f50300aa00f2ffb4380200145f2800f1880000542800028b08f1df384822f837L4;FB6578745369676e616c5f5051434b415f56315f4d4c4b454d3736383a41757468656e74696361746f7220557", - "06461746500000000000000000000000000000000L8;FFea9707f976810036a06302d1e1433c918f180094b4ef7ba9e0031d91a8e779a9a082c83ca18b7aa9a182c93ce3031baaa282ca3ca4835cf8e037823de13b823dBL8;FF0825019108fd46d30900088b200500911f0008eb89190054e1431691880e", - "0094e1d342f9e8cb42f91f0101ebc06d0054e8cf42f92a040091c022029149018052L8;FFe3c31791e8bf03f92801009008413191e8fb02f922008052e80303f92801009008013291e02f823de9ff02f9e90703f9e80b03f9d8e9ff97e15b44f9810000b4BBBBL4;FF20013fd6e80b40f91f0d00b1c10300", - "54880200f9680080522e0000146082c13c785a40a9770a40f9f50301aae003803dccf501940006805201018052caf50194L4;FB6669636174655072654b65795369676e616c4d6573736167656d657373616765726567697374726174696f6e5f696444656372797074696f6e4572726f724d65L8;FFe803", - "00f9faeaff97e80300aa41020090212c1e914302009063881591e0030091c2008052a4008052e80300f932eaff97e10340f9b8ffff17e80f41b2b2ffff17BL8;FFf31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa0103009021242891e8030091e00309aae20080", - "521a76019468220191L8;FFd8750094e00318aa2100805239008052d5750094c0feffb4f90b40f95f0700b1f8cb02f9e0cf02f9ffd302f920130054e8031faa4901805209683f3808050091BBBL4;FF820641ad603fc03de20703ad6003883ce8ff4139810240ad1f810071e10302adc2050054ea0b40f98", - "903088b08011b32400540ad200500ade8ff0139e90740f9L4;ZDL8;FFc80000b409e179d3e00313aa02018052211108cbd7b50094210f40f9c11800b4201340f9a300001433008052fb1f8052e0030baaf7030baa680000147701198bBL8;FF29e10491e8b305f968008052e1c31791e91703f9e9ff02f9a", - "902009029cd2191e81303f9a802009008b12291e90b03f9290080d2e82303f9c8048052a934c0f2L8;FF0009803de86b40f97b6300915a0700917f0308ebc070005400e4006fa8220591fc432a9169ab40a9ff9b04f9f89f04f9f8ab04f90001803de8c324910011803dBBBBBL4;FFa8035db8e80c0037a8", - "035ef8ca0240f9490108eb43100054ea0240f9a0835df84801088be80200f9c90200f908fc60d3a80500b5080840921f1900f1c2050054L4;FF0968283808050091e1230091e00318aae80f00f9c8e5ff970500001428008052ff0f00f9ffa300a9780d0035570300b4e10f40f9e80740f9b80640f91f010", - "1ebL8;FFf8ffff17010440f93f0800b180f9ff543f0400b140f9ff54e10000b4080840f9f30300aa22008052e00308aad1050194e00313aa011040f921f8ffb4001440f9BL8;FF2003009000003491dd8501942003009000603891da850194200300d000002891d7850194fd7bbea9f44f01a9fd03009101", - "2440f9f30300aa1f0800f91f1400f9L8;FF42008052db850094e86340f91f0500f1ab000054e06740f901f97fd342008052d4850094e86f40f91f0500f1ab000054e07340f901f97fd342008052cd850094BBBL4;FF1f0308eb28130054180100b4a8835ef8e1031baae20318aa0001168bddc50194d6021", - "88bb6031ff8e80f40b9a8010034a8035ef81f0116eb20170054eb1340f9L4;FB00000000000000000000000000000000120000000000000013000000000000001000000000000000160000000000000073686f756c64206f6e6c79206661696cL8;FF2001803de3c50094e0dbc13de1dfc13d68e20d91e9c", - "343f9000500ad69ce01f9c4f7ff17e11f40f9810000b4e0031aaa22008052cfc50094e16f40f9810000b4BL8;FFe20313aa1ffdff97601a00b5a0f5ffb4a2ffff17898244f83f0500b1810000549fde04a99f2e00f99f6200b91f0900f141180054e00313aaf0fdff97e0080036L8;FF681040f90b3140a9", - "081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a29da450094fd7b47a9BBBBL4;FFe10313aaf44f4fa9f6574ea9f85f4da9fa674ca9fc6f4ba9fd7b4aa9ff030491c0035fd6fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd03009", - "1680002ebL4;FB7374616c6520756e61636b6e6f776c65646765642073657373696f6e20666f7220c00d20286372656174656420617420c00129000d4964656e74697479206b65L8;FF680640f997fe6ad319693538d5160091750a00f9370200b5f403182a680240f9bf0208eb61000054e00313aa23e50", - "094680640f9a906009114693538690a00f9BL8;FF800100543f040071e1020054e92b40f93f0500b140030054c1420091a20301d1e003082af94eff9700faffb483000014e94340b909f90737f77f04a9c6ffff17L8;FF22008052db65009461da40f9810000b460de40f922008052d665009461e640f981", - "0000b460ea40f922008052d165009460220091f4feff9760a20791f30b40f9BBBL4;FF090180520968283808050091e1230091e00317aae80f00f94291ff9710000014e8031faab60a40f976faffb5b41640f9e803088b54fbffb5f80308ab23fcff54L4;FF007d20d4840002cb820040398200003400008", - "0d21f000039007d20d4a268633882000034000080d21f000039007d20d44600805225008052c620c91a270000b0L8;FF0a2c40f9093840f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b250191BL8;FF29004039f4", - "0300aaf30301aa1f01096be0179f1af12501948806403969064039f503002a1f01096be0179f1aeb250194880a4039690a4039b602000a1f01096bL8;FFf30300aae1830191e013843c00e4006f4815003329111d12e00304aa02088052f40303aae1f3843cf9030691e9030139e87f0139e00303ade0030", - "4ad8bd7ff97BBBBBBBL4;FF1f150071e00100541f11007101030054280180d20800f0f287000014740240f9820640f9620800b4810240f92800c0394808f837480400d1290400914e000014L4;FFff0600b1400900546083c23c6183c33c6283c43ca9eb7aa9e10740f9e20304adbbf37ba9e11f803d0200", - "001417008092e20344adff0600b1e11fc03de28302adL8;FFf44f41a9fd7bc2a8da190114618200910000809274820091411a01941f0400f1a10100549ffedfc8610240f9810000b4600640f922008052ce190194e00313aaBBL4;FFaa02148be90b00f9480100f94b1100796002803d690a00f9f44f47a9", - "f72b40f9f65746a9fd7b44a9ff030291c0035fd6680200f9f44f47a9f72b40f9f65746a9L4;ZFL8;FFa96355384a01084a6b01084aaa431538aa7355382901084aab531538ab835538a9631538a99355384a01084a6b01084aaa731538aaa355382901084aab831538BBBL4;FFe93303b8a9835ef8a83b00", - "79e91300f9e93340b9e8d30378e83343b8ec730378e8b300b8681d0012e90b00b9e91340f9e863003908208052e90b00f9e90b40b9L4;FB74732f616363756d2e7273002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d62353864376635366533363435636364L", - "8;FFe8c740f9e78302f9e83b02f9e8b740f9e68b02f9e84302f9e8cb40f9eb8f02f9e84702f9e89b40f9f59702f9e84f02f9e8a740f9e59b02f9e85302f9e88f40f9BL8;FF08050091fa3b49f9e8d302f97a0300b4480340b20811c0da081540d2080d088b08250191481b488b0805009114000014280080", - "525f0700b1ffcb02f9e8cf02f9L8;FFe083329169f3ff97fc9740f9e89b40f91a008092fafb02f9e87300b409038052fb031faa370100b0f7aa00911471099bf8032d913600805210000014e8f342f9BBBBL4;FF1f090071a1030054880200396800805268620039f44f4ca9f6574ba9fd7b4aa9ff430391", - "c0035fd6760240f9f50301aaccf901940002805201018052caf90194L4;FB6f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f6369706865722d302e352e322f7372632f737472L8;FFe08745ade00314aaa0873dade08b46ada08b3eade18343", - "ada1833bade28344ada2833cade18341ada18339ade28342ada2833aade18340ada18338adb9f3ff97BL8;FF201200541a210091b72303d1bc6303d13900805209000014e1f20191a22301d10964ff97601700b5bc835bf8fa031caa428f40f8821000b4810340f938008039L8;FFe10315aae20319aae00", - "2188be1790094ae010014e04fc23de8a344f909008092690200f96082803c680e00f9ff0600f1eb730054e01f40f9e10317aa22008052BBBL4;FF4e2100d1ed5b00f9cc010c8a9f2500b1e82500542c010c8bbf0600b12b692a388b210039e0240054290d0acbab060091f90314aaeb5f00f935811ff8e94", - "740f9L4;ZBL8;FF22008052dbb90094e00318aa0104805222008052d7b90094e16342f9f81340f9810000b4e01f40f922008052d1b90094e11740f9810000b4e00740f922008052BL8;FFec0000352a7c0c530b050039090900394a091b320a010039080000142c7c12532a440c330b090039090d00398b6", - "d1c320a0500390b010039a802148be0031f2aL8;FF810000b4e06b40f922008052d9390094f6fe60d3f86b00f9ea0315aafc432a91e95740f968c6533935fd48d388380037cf01001401ed40b9080f40f9e00316aaBBBBBL4;FF4a0400d1e800001401500591e003022ae20303aa0cf4ff97e01e00b4e007", - "00f9210400b021a01f91230400b0635436917e00001401400591e003022ae20303aaL4;FF680200f9f44f42a9f65741a9fd7bc3a8c0035fd6e91741b268220039690200f9f44f42a9f65741a9fd7bc3a8c0035fd6280480d20800f0f2685200a9f44f42a9L8;FF202040a96102009021a40e91030d40f9e2", - "058052fd7b43a9ff03019160001fd6202040a96102009021e00d91030d40f922038052fd7b43a9ff03019160001fd6BL8;FFfbf34ca9f9274ea9f6a34fa9e8a705a9180300b43f0400f16b00005422008052d48901947f0700f1ab000054e0031caae1031baa22008052ce8901943f0700f1L8;FF08e1403", - "9c07a73781f05007121040054e2031f2aade2ff9708fc78d36a0100f04ae13b9109fc60d3487968782821084a095d1053495969782801084ac87a3378BBBL4;FFfd830091010840a988008052f30300aae0230091240080520504805229f87fd33f1100f13481889ae30314aa8e000094e80740f91f0500f", - "1e0000054e80b40f9L4;FB6c65644d414320766572696669636174696f6e206661696c656456657273696f6e206d69736d61746368206166746572206e65676f74696174696f6e4d696e69L8;FFe0000014fc031faaf60000145a008052f70318aade000014f7031f2ae8eb41f91f0500b180000054e8030", - "e9100410191c7c4ff97df0600b100960054f50f42f9BL8;FFf30b40f9fd7bc2a887feff176042069151000094e00313aaecfeff9760420891f30b40f9fd7bc2a87ffeff17610640f9810000b4600a40f922008052cd490194L8;FF21e3ff54e8031faa080113ab63050054000100d000c01d91d9490094f3", - "031faa080c47f81f0500b1e1e7ff54e8031faa080113ab23040054000100d000001a91BBBBL4;FFfd7b44a9ff830291c0035fd6f9030aaa03000014fa6741a9e9030aaa08008092ba2601a9a86600a9b60000b4e00317aae10316aa22008052cee9019493fdffb4L4;FB304b420000000000000000000000", - "000008000000000000000800000000000000304b420000000000000000000000000008000000000000000800000000000000L8;FFf34300f9fdc30191280040f9f30300aa1f0500b160030054e8630091e00301aaa8330094e80f40f9e003c23ce91b40f91f0500b1e003803de90b00f920030054BL8;FF2", - "905009102000014e9031faa280108ab22040054097840b93f05007141010054097c40b9290140b22911c0da291540d2290d098b2925019129fd46d329050091L8;FFf7430f9108150036c08641a9a90302d1e8430f91a20302d1240101910304805205028052356a0094e8eb41f91f0500b1e01b0054e002", - "c03de8f341f9e9030b91BBBL4;FFe0030054a8035bf8f42740f91f0119eb40220054a8835bf82a070091a14301d1e0031baa4905805209693938aa031cf83c95ff97b9035cf8a8035bf8080119cbL4;FFfa6741a9fd7bc5a860001fd65f09007141000054173f0153356440a9fa031f2a483f00121f21376", - "b02010054281340f9c1520012e00315aa5a07001100013fd6L8;FFe10315aae8a900940001805201308052e5a90094fd7bbaa9fb0b00f9fa6702a9f85f03a9f65704a9f44f05a9fd030091f30306aaa600f8b6f4031faae00314aaBL8;FFf40308aaea0bc0f2e9ff02a9e9ab05a9e4290194e00313aae803", - "14aaf44f49a9fd7b48a9ff830291000440ad1f0100390011803c0111813cc0035fd61f0500f9L8;FFfb0b4bf9f90f4bf9fc134bf9f8174bf9f51b4bf9450000140a0180d20804805209c480520a00f0f2e89f04f9e9a704f95a650091a1035df8611b00b5de000014BBBBBBL4;FF3f7f04a9faff05a98207", - "40f9423500b4810340f9370080395704f8b728040091490400d12f000014e003082ae20313aae303152ae0f7ff97e0f6ffb4aaffff17L4;FFe9ab54290a9d003909a10039e9ab53290aa5003909a90039e9ab52290aad003909b10039e9ab51290ab5003909b90039e9ab50290abd003909c10039e9ab4f2", - "9L8;FFe8734039ed7740390c140039ec5b40390a1c0039ea6b4039f26f4039a811082a0c120c2a0e2000394a120a2a092c0039e97b4039ee7f4039083c003928008052BBL4;FFe28b815228144038e8830039e8830091000140b2df910194e8064039e10a0091e2c38052e8033239e8033291000140b2d89", - "10194a88301d1e0830091e1033291L4;ZDL8;FF1f050071a1010054880100d008d90d91e00301aae10308aa4200805213920014880100d008d10d91e00301aae10308aa420080520d920014281040b96800c837BBBL4;FF3f0114ebf033949a290110cb29690c9b200dc03da0039a3c2011c03de012803d2", - "015c03de016803d2019c03de01a803d2001c03da003973c2005c03da003983cL4;FB5bbcf5d6567a35cbfa1ce97a6b4e883267f4f0d8141283035e3c0e7dc2729373a237a28c9fbdba520000b263b3429c4c636a42620cbd3e8cd8b8b7a55040900eL8;FF6ef9ff17e87740f9f40309aaf5030aaa0021009", - "13dcbff97e0032b91d2caff9708008092745601a9686600a97c030014e8e300f9e87740f9a082c63cea3f00f9BL8;FF43feff17e0431691e1031aaae20318aae0100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aad7100094fad342f9fc074091L8;FF404f803dc122", - "0054f8630191e8031691e00315aa1ba30191f54301f9f5031691fd5efe97e8c342f91f0500b1601300548043c03df6e32291f76301912183c93cBBBBL4;FF49fd60d368d2037848fd70d369ba0079e9ab43a9687a0139e81340f975e2003968f205f8a8835838697206f8a90358f868de013969f206f8e8a", - "742a97bf203f8L4;FB792063616c6c656420666f72206e6f6e2d6578697374656e7420636861696e00759148000000000034000000000000005d0100000e0000007591480000000000L8;FFff0302d1fd7b03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaf", - "30302aaf40301aab9f0ff97e80300aae00301aaBL8;FFa00b7ead6182873ce11bc03d6282853ce00b01ad6182883c6082843cff430791f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8c0035fd6ffc300d1fd7b01a9L8;FF0825019108fd46d30900088b390500913f0308eb48190054da000014f60740", - "91d6820991c0220291b6250094080040b20811c0da081540d2080d088b08250191BBBL4;FFe00318aae299ff9708008092686e00a9e00748a9610000b422008052d5b10194b5c6ffb4e00314aae10315aa13feff17aa035ab8e00748a9ec2700f95f050071L4;ZBL8;FFe00314aa22008052f44f4ba9fb3b", - "40f9f6574aa9f85f49a9fa6748a9fd7b46a9ff030391d3b10014f44f4ba9fb3b40f9f6574aa9f85f49a9fa6748a9fd7b46a9BL8;FFfa8302910900f0f23c4500911f011ceb80390054e02fc13de133c13da102009021780591e237c13de0031791e3833291e4032d91e2008052e0d3823de1d7823dL8;FFe", - "9b34e39e04301f91c490091280280520000803dfc3b01f9e83f01f9e84701f9e9430a3978010014f9430891e84741f9f7432a912083c63cf8c30d91a80319f8BBBBBL4;FF29010037090040f92a0080920a0100f92a008052297140b90a200039090900b9c0035fd6fd7bbfa9fd0300912004009000e0119", - "1e6010294ff4302d1fd7b04a9L4;FFe90100943a00805278fdffb5eeffff17e81f40f9e8df00f9970000b507000014e81f40f9e8df00f9e00316aae10317aa22008052cf010094f6e742a9f71340f9L8;FFfbf6ff97f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031", - "faae00316aae10314aadd010194a00100b4f50300aac9010194BL8;FFfd430091080040f9e00301aa15d140a9e80300911a820194740100b4130300f073621291e0030091a1630091e20313aab50f00f9b506009112820194940600f1L8;FF1f0109eba96f0054170115ab42de0054f50314aabc0e48f89f", - "0f00b161000054e8031faa0d000014e00315aa06ebff97080040b20811c0da081540d2080d088bBBBL4;FF1f01096be0179f1af4c10194d60600f11b001b0a21ffff54c6ffff17e81740f9156d00a92c000014e043069121230091022a8052d7c10194f41340f95f0314ebL4;FB386336623562353537662", - "f70726f73742d302e31342e342f7372632f656e636f64696e672f766172696e742e7273002f636172676f2d72656769737472792f69L8;FF89e240f940838f3c4001c03d81220091a80317f888ee40f9e007813d807ac03da98318f889565fa94083813ca2837bade81302f9e883029100a10191a103963c", - "BL8;FF770a40f9680240f9080117cbbf0208eb09f8ff54e00313aae10317aae20315aadc000094770a40f9baffff17e00313aa22008052d7000094610a40f9c3ffff17L8;FF810000b4a20a40f9e00314aad9410094686645391f05007161010054612640f9810000b4602240f922008052d1410094612e4", - "0f9810000b4602a40f922008052BBBBL4;FF390300eb63b200541803008bf9feffb50f0000141f0400b1c1b10054f8e101941f10003141b10054f9ffff17f5e10194f70300aa1f0400b141fdff54e0430591L4;FB1ced4800000000006a00000000000000750000002e0000001ced4800000000006a00000", - "0000000000e00000026000000496e76616c6964496e7075744c656e67L8;FFe0d7c23de8b345f9000200f000e02191030200f063a02491040200f084802291e2431e9121048052e0e7813de8d303f9e0e10094020200f042802191e00309aaBL8;FFe0230091a32300d142008052a8831ff825620194f402", - "00b094422391c10200f0218c2f91a32300d142018052e40314aab3831ff81c62019468620091c10200f0L8;FF0001803de083c13c0005803de083c23c0009803d892200f90c000014e003082ae20313aa630c8052f1f5ff9780f6ffb4a9ffff17e003082ae10314aae20313aaBBBL4;FFe0230091a34300d", - "1082109aa6905c05ae083803cb6831ff808010aaa0ad49052284108aa2a00a072097dd59b28a10a9be90f40f9e9a301a9a8df3ea9eaa10194L4;FFf60300aaa00300b420031091d30a00f9760200f9610282d28202018bdf1e00b9010c40b942cc749242187bb2150080d23304001117008052130c00b9df", - "1a00b9L8;FFb30100d073e20491810100f021c01691e0230091a32300d102018052e40313aab4831ff820a2009488620091810100f021d81a91a32300d1e2008052e40313aaBL8;FFea0215ab22140054890240f93f010aebc20d00543f0115eb830e0054ff0202eb430e0054e00316aada210194880240f", - "9760200f926000014760a40f9c90202ebBL4;FFdc210014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091f30300aa004840f9a00000b4614e40f9610000b422008052cf210094611240f9810000b4L3;ZBBBBBBBBBBL4;FFdf1e02946004009000a01291dc1e0294420400d042203391e00308", - "aae10303aad91e0294400400d000001791d41e02946004009000401691d11e0294420400d0L4;FF0011003728fc60d3880600b5200840921f1800f1c2060054217c0353e10600343f0800714d0200543f0c007180fdff543f100071e00200543f14007101040054L8;FF00008092461f01941f0400f1c101", - "00549ffedfc8610640f9e101f8b7600240f922008052d31e0194e00313aa0103805202018052f44f42a9fd7b41a9ffc30091BBL4;FF0a038052c852089bf6e300912b008052e0231291c182009129310a9bffff06a9f7231291ebff03a9ff3f00f9f4a304a9eca705a958120094e84742f91f0900b1L4;FF", - "0100018b6000048a6300018b6100048a210000cb010000d411f7ff97fd7bc1a8c0035fd6fd7bb9a9fd030091f30b00f9f303032ae43700f9e3f77fb25f0003ebL8;FF21301d91a32300d142008052e40313aaa8831ff8249f0094249f0094f44f43a9fd7b42a9ff030191c0035fd6ffc300d1fd7b01a9f31", - "300f9fd430091130040f9BBBL4;FFff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300eb235100541803008b060000141f0400b1a1500054L4;FBbd040000130000007d004900000000004a00000000000000d3050000120000007d004900000000", - "004a00000000000000910500002a0000005010440000000000L8;FF2a7042a9190340f920d05ba9e86b00f9292041a927104da93f0314eb36404ea9e8e700f92b2043a9e92f1fa9352c4ba9e89300f9292044a9e8cf00f93e2045a9BL8;FF830e803d820a803d8106803d8002803d682600294809c05a690", - "9c05a682601298809c05aa909c05a68260229c809c05ae909c05a68260329f44f48a9f92b40f9L8;FF0825019108fd46d308050091b60a40f9f60b00b4c90240b22911c0da291540d2290d098b29250191c91a498b29050091b41640f92801088b140b00b4890240b2BBBBL4;FFff0304d1fd7b0ca9f85f0", - "da9f6570ea9f44f0fa9fd0303910950403929140037150440a9f30300aa161040b9e0230091f40308aa499a0094a00642a9e2830191L4;ZFL8;FF080500b5200840921f1800f142050054217c0353610500343f040071600100543f08007161fdff54e00700b5e00313aabafdff97e80301aa80010036480", - "800b5BL8;FF0900f0f205000014090180d2e8031faa0900f0f229017fb24a1d409208010aaa69a200a92900805269020039f44f45a9fd7b44a9ff830191c0035fd6ffc300d1L8;FF08fd46d30900088b37050091ff0208eb490f0054968248f8df0600b1801400548022029105e3ff97080040b20811c0da", - "081540d2080d088b0825019109fd46d3BBBL4;FF56d77fa91f0114ebe0010054e8bf40f989060091e1c30591e00315aa1b693438e9c300f93faaff97f4c340f9e8bb40f9080114cbbf0208eb68010054d5fcffb5L4;FB6bbd41fbabd9831f79217e1319cde05b636c692f7372632f73746f7265732e72730", - "02f636172676f2d72656769737472792f696e6465782e6372617465732e69L8;FFfd7b48a9ffc30291dabe0014f44f4aa9f65749a9fd7b48a9ffc30291c0035fd608008092e90300aa1f200039e00313aa280100f9f44f4aa9f65749a9fd7b48a9BL8;FF081540d2080d088b0825019108fd46d308050091", - "092440f93f0500b1400400540a2c40f9093840f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b250191L8;FFe20313aadafdff97a00100b4c9000014c1c20091e20313aad5fdff97000100b4d6000014e01c00b5e00313aaaefeff97e80301aa40010036481d00b5e1031faaBBBBBL4;FFe10313aa4", - "7faff97806240b960010034610a40f9680240f91f0101eb60100054680640f929040091690a00f91a692138e10313aa3bfaff97950a40f9350300b4L4;FFe8000036e86353391f0500714c090054e80d0035ec0f41b276000014e8431391e1a740f9e0431391099140b80a1140f81bd140b8220080522300", - "8052e97b00f9L8;FF22008052db0e01140a0500f92a008052210140f90a0100b941ffffb5c0035fd6ffc301d1fd7b04a9f52b00f9f44f06a9fd0301913f9000f1c105005409204039BL8;FF482740f91f0500b120030054592f40f95b6340b9991100b4542b40f9d18e0194e00319aa21008052cf8e0194c", - "01300b4e10314aae20319aafc0300aad58e0194L8;FF0afc60d3097969784921094a2a5d105308596a780001094af44f42a9fd7b41a9ffc30091c0035fd6a80100d008010191e9030091630100b063c02291640100d0BBBL4;FF4a018052e00317aa0a692138e1e30091e92700f943baff97f92740f9e81f", - "40f9080119cbff0208eb281e0054e82340f9e10318aae20317aa0001198bd5ce0194L4;FBdb4e9b662f005e16bc2dfeb016de8495d6d3a0230e34e2c4c47b8b98c369fbd6ecaba79744f74abfa951a28c14efbf333884919500003a14f87636c5995579b0L8;FFeae700f9ea8f40f9e99b00f9e9cb40f9e4", - "ab13a9eaa740f9e9eb00f9e9b740f9fba700f9fb0316aae9cb00f9e98b40f9fe8b00f9fe0308aae80302aae20301aaBL8;FF3f09007121080054e8cf40f9e9a341b9ec030b91eaa741b9e86301f9e9cb02b9eacf02b9080380d20800f0f21a1100d1e9d342b9204bc03d8101c03de88f01b9L8;FFe13f02f", - "9290c40f9e103129120013fd6fbc342f97f0f00b1e1000054c800805223ffff17e8e322910081cd3ce8d344f97effff17f63f42f92083c13ceae32291BBBBL4;FFff8302d1fd7b05a9fa6706a9f85f07a9f65708a9f44f09a9fd430191130840f9183040b9f70300aaf40308aa330300b4f60640f9cbee01", - "94e00313aa21008052L4;FB65642053656e6465722076323a2044482d73656e646572008592480000000000330000000000000089060000180000006d697373696e6720696e2070726f746fL8;FFa6ffff17e80b41b2e00700f9a3ffff17c80080d20800f0f2080500d19fffff17c80080d20800f0f20809", - "00919bffff17e00300f9210200d021701e91230200d0BL8;FFd96e0194c00200b4e1031aaae20318aaf90300aadf6e01949c0700d1d6620091b56200d178673fa9788701f8dcfdffb50200001417018052935e00a9930a00f9L8;FFe1d342f9fff9ff17e0431691e1031aaae20318aaee110094fad342f9e", - "8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aae5110094fad342f9BBBL4;FF28008052fbe702a9194440f91fa007a9a80301d11f4400f9e00309aafa9303a9e59b04a9e3930139e25306b8ebb307f8ee0f0239f18700b9f24700f9f0230179L4;FF36319a9aa9021ccbc8021ccb1f01", - "09eb28020054f70300aaf60315aa80021c8be1074091e20317aa3210009428008052f50316aafc031baa0804a07208011bcbL8;FF2128000aad11000acf1e000a3f070031422c000a5023000af1c3911a6b31000a4901094a8a010e4a4c02014a2802084a29010d4a4a010f4a8c01024a6334000aBL8;FF0", - "1c1c13cf5fb45b9880240f9f36b41f9e94305b9e04b813de14f813d680000b4e00313aa00013fd6810640f9810000b4820a40f9e00313aace2e01949f0b00b1L8;FFf65759a9f85f58a9fa6757a9fc6f56a9fd7b55a9ffc30691c0035fd6a04302d1e1031faa25f1ff9752ffff17fd7bbda9fc5701a9f44f", - "02a9fd030091ffc320d1BBBBBBL4;FFfd7bc3a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f09007181010054540040f9880640f9080200b4f30301aa810240f9L4;FFe0f3883df6431391f5db11f9fcdf11f9ff0b00b9ff0300f979c4ff97e86b42f91f0900b14033", - "00541f0500b1c03200544083cb3c4183cc3c090141d21f0100f1L8;FFff8301d1fd7b01a9f91300f9f85f03a9f65704a9f44f05a9fd430091160440f9760200b4335040a9380200d018431091170040f9b9730091750200d0b5e21891BBL4;FF5f114071630a00542918c0392b1d00124a390b0b4a114051", - "0901f83708710a8bea00805208a800a91f0000f9fd7b44a9ff430191c0035fd65f01487103090054L4;ZBL8;FFa363009182008052a80f00f9269700948101009021a01b91840100f084e00491a363009162008052b30f00f91e9700941e970094fd7b41a9f31340f9ffc30091BBBL4;FF600600ad682200", - "b9f44f44a9fd7b43a9ff430191c0035fd6c00300b000e03a91d7d60194092840a9eb0309aa090100f929010a8b608540fc0a0c40f929050091L4;FB63656976696e675f637431456b53656e744374315265636569766564456b53656e744374315265636569766564726563656976696e675f63743200000", - "0000000L8;FF29a048a9e95300f9e8df00f929a049a9e8ab15a92aa04aa9e9a310a929a04ba9e9b700f9eaa318a929a84ca9e9eb00f929a04da9e9a700f92ba44ea9e88f00f9BL8;FF1f0101ebe08b0054e8cf42f92a040091802202914901805209692138ead302f9371e0094e1431691850f0094e09b49", - "f9800100b4e1d342f9e8cb42f91f0101ebL8;FFe08332910800f0f2ffa73239e85306f9f74bff97e80300aae08332912101009021c03991a20180522301009063f4399144018052e85306f911000014c80080d2BBBBL4;FF820a803d68a20039f44f4aa9f93b40f9f65749a9f85f48a9fd7b46a9ffc30291", - "c0035fd60001805201048052e9f60194000400b000801b91e5f60194fd7bbca9L4;FB73736167654b65796b796265725f7072655f6b65795f69646b796265725f6369706865727465787453656e6465725369676e696e674b6579657068656d657261L8;FFfd7b03a9fa6704a9f85f05a9f65706a9f44f07", - "a9fdc30091081c00121f090071a1010054e00302aaf30302aaf40301aabaf5ff9720020037750240f9a80640f9BL8;FFe8030091e00309aae2008052257701940103009021e42491040300f084c00e91e0030091a363009182018052b30f00f91d770194686200910103009021142591L8;FF1f0900b1421", - "40054e0031baae10315aa22008052d77600949d000014f3031faae8031faa85000014bf0600b121fb0054f8031f2af6031faa3400805219008092BBBL4;FF8cc101920cad00a9c0035fd6fd7bbda9f65701a9f44f02a9fd030091090400b0f30300aa290140f94ad03bd55401098b894240393f050071a10", - "40054802640a9L4;ZDL8;FF680040b91f050031e006005400e4006f1605001189008052c80ac05af40301aaf30300aaa8c31fb8a81300d1e0030191a8a73da9c801009008e13791e9038052BL8;FFb50600d136a001919703138b1df7ff97e08bc13de18fc13d73a20191e293c13de387c13de10316aae08", - "601ade07fc13de183c13de82b43f9e216803de00600adL8;FF000200547a1a41f9683a42b9e82700b9da0100b4751641f9d2360094e0031aaa21008052d036009420e300b4e10315aae2031aaae00700f9d636009405000014BBBBBL4;FFf73b00f9f65708a9f44f09a9fd830191200440ad28008052f303", - "00aae87f01a9a88300d1e0830091f40301aaff0700f9e00701ade1060294a2035ef8820900b5L4;FFc0035fd60001805201028052f1060094fd7bbda9f50b00f9f44f02a9fd030091f40302aaf303012af50300aacd0600940003805201018052cb060094400100b4L8;FFdc060194684a40f9a80000b460", - "4e40f901f57ed342008052d6060194685640f9a80000b4605a40f901f57ed342008052d0060194686240f9a80000b4606640f9BL8;FF600640f922008052da860194602a40f9a00000b4612e40f9610000b422008052d4860194610e40f93f0400f1ab0f0054601240f922008052f44f4fa9f6574ea9L8;F", - "F080540f9c97e04535f0500f180010054eb031faa4cfd41d38d010b8b4a010ccbaef57ed30e696e78df21296b6b818d9a5f0500f108ffff5408090b8b0a014079BBBL4;FFe81b40f9792202a9e82b40f9682a03a9e87b40b9eab347b8280100b9e88743a96a4601b968ae00f9e84f40b9686201b9e82740b", - "968a2053981e2ffb5dafeff17L4;FB20c0172073657373696f6e206861732062617365206b65793a20c00e20616e6420636f756e7465723a20c0022e20c000083c6572726f723a20c0013e002f7275L8;FFe95f00b9e9030991c1820091022e8052e093803d28f100f8dec60094e8c31591a012c93cea8f4", - "2f908a10291e98b42f9f7430d91e0d7803d010146ad032dc03dBL8;FF000100540dfc6ad35369283808050091280800f94d0200b5e0030baa61000014e10300a9e00301aae10309aa22008052f4030baad7050094e10340a9eb0314aaL8;FF10000014e80308abc2010054090840f9090100b42a0140b24a", - "11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6BBBBL4;FFf63b40f9f3031f2ae10600b4e85740f9fb1f40f9e90f40b9e82700f97fffff17f60746a9f30300d073a61091e02b40f9540380520a000014f63340f9f30300d0L4;FB0076656e646f722f6c69", - "627369676e616c2f727573742f70726f746f636f6c2f7372632f747269706c655f726174636865742e727300136661696c656420746fL8;FF63781991e0030b91420280528401805239dbff97e16341f9e16301f92102009021c820912302009063002191e0030b91c2018052640280522fdbff97f46341f", - "9BL8;FFa80f00f92867019428670194fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aae102009021bc2e91e8030091L8;FFc0035fd6fd7bbea9f30b00f9fd030091092040a9f30300aaa80000b4600a40f901f97fd342008052d2660094681240f9a800", - "00b4601640f901f97fd342008052BBBL4;FF4400805209000014a0031df86103009021382f9163030090638c2f91a0c300d1a202805244018052339b0094a0035df8bfffff17a0c300d1a82b3da925830094L4;FF450080528270009100204039001040d3a520c01aa6040051e503054b02000014bf3b03d", - "5831c40b96100050a40fc5f887f00006b61ffff5441fc008880ffff35L8;FFc0035fd657a700941f047df2e8079f1a68e20039f30b40f9fd7bc2a8c0035fd6000040f9080040b9280100341f050071a1010054a80100f008cd0491e00301aaBL8;FF09210039f5ffff17e00301aa810200b021303d916200", - "805214270114ff8300d1fd7b01a9fd430091280440a9090000b029710e91820200b042783991e02700a9L8;FFfb0f40b9f96341a9fc0340f9060000143c008052542340f9b4031df874f1ffb509018052a8035df8755a00a9755e01a9785e02a97c6605a97b6200b9682603a9BBBBBBBL4;FFdc1a0294e6f", - "fff17e003032ae01a0294f40300aae3ffff17fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30300aa220100b45f3c00f10202005448007d92L4;FFe20316aa5e100094b9df7ca9b8d77da93f0b00b121030054350400b4a8e300d1e00318aae10315aa4d73fe97bae77ca96083c23cbcef7da9b5835e", - "f8e00b803dL8;FFf65742a9fd7bc4a8da1a011428008052bf0a00f9bf2200a96182009100008092748200913e1b01941f0400f140fdff54f44f43a9f70b40f9f65742a9fd7bc4a8BBL4;FFeaab44b98b030b8b2801080b89e97c92a0033ead0809c05aa0039b3c7601098baa233529e8e31291f8e3129109", - "9b01940003c03de9031faae8430391e037803dL4;ZFL8;FFf44f43a9fd7b42a9ff030191c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa810100b021001a91e8030091e00309aaa2018052199b0094BBBL4;FFe2074091c00300d000283291c30300d063c01e91c40300d084a03291", - "42400f9101038052e8eb09f9e9db13b9e1da019448008052c00300d000003391c30300d0L4;FB6e696e676465736372697074696f6e282920697320646570726563617465643b2075736520446973706c61790000000006000000000000000c00000000000000L8;FFe08742f9e68b42f9f19b42f9e8e700", - "f9e8ff41f9fb9f42f9faa742f9e5ab42f9e4af42f9e82b17a9e80342f9ea0b42f9f2b342f9f6b742f9edbb42f9e9231fa9BL8;FF1900809228008052ff1700f9e80700f9e0074091e8c33f91e103182a00c035916ca20094e80348f9c8f100b4e1ff47f92800805248030039280040391f050071L8;FF210", - "08052d85a0094800e01b4e10314aae20319aafb0300aade5a0094f4e340f9fa0316aaf40800b4f8df40f9cd5a0094e00314aa21008052cb5a0094600b01b4BBBBL4;FF00a8200e0800669e0801c0da0811c0da0cfd43d3086a6c38cdffff17000400d000a01691eafa0194ff8302d1fd7b06a9f73b00f9f6", - "5708a9f44f09a9fd830191L4;FB6720616865616420c012206d657373616765732028696e6465783a20c00b2c20636f756e7465723a20c0012900c0202045786365656465642066757475726520L8;FFfb0318aae87b00f9a6060094f8674fa9f50300aaf6df50a9202300b4080b00911f0900f143240054", - "b80000b4e00319aae10318aa22008052cefa0094962300b4BL8;FFf30300aa3f0400f18b000054601e40f922008052d77a0194612640f9140080927f7a00b9741a00f93f0400f17f0200f98b000054602a40f922008052cd7a0194L8;FFd0fbff17f70300aae0630091220080522300805224008052b590f", - "f97e11740f9e00317aa92fcff17f70300aae0630091220080522300805224008052ac90ff97BBBL4;FFba0358f8edffff17bf0600f1a1310054fb0308aa28008052f32300f9f5031faaff0700f9f40600911e000014e84340f90901168b280316cb2a050091380d0091L4;ZBL8;FF02788052e11f00f9e2b", - "a0094200742ad9f8225f1a0073cad200b43ada00b3dad210340ada1033aad220341ada2033badc12d0054b82d00b4a8e300d1e1831391BL8;FF4a11c0da4a1540d24a0d0a8b4a2501914afd46d34a05009111000014e9031faa10000014f5031faa681a40f948f6ffb5f6031faa770a40f917f7ffb5e8031", - "7abL8;FFe00315aadb3a009496300036f6fe60d3ea5f40f9e95740f968c6533935fd48d3e8580037d2020014e84700f9e8fb41f978ca43f9fadf09a9f7eb43b9f6ef43b9BBBBBL4;FF240080524afdff97610a40f9dbfeff17e00313aa22008052230080522400805243fdff97610a40f9e2feff17e00313", - "aae10317aae20315aa2300805224008052L4;FFc0035fd6e00741a9e70a0094fd7bbda9f50b00f9f44f02a9fd030091a87cc39bf30300aae9031faa0a018052ff0308eb28008052a1030054b47c039b0b00f0d2L8;FF0009805201018052d70a0194800100b4600640ad080180521f2000a91f0800f90080", - "813c600ac03d0180823c0080833cf30b40f9fd7bc2a8c0035fd600018052BL8;FFac0000541f080071c000005420008052c0035fd61f1c007140000054000180521f00286b41000054c0035fd6fd7bbfa9fd030091200300f000e02591220300f0L8;FFf5031faaf40b00f9f94b01f9e04f01f9ff5301f9f", - "b6304a9fa2b00f908000014e00316aa42008052d28a0094f53f40f9b5060091bf0219ebe0260054a8621c9bBBBL4;FFa9e4ff54a0c300d1e10317aae20318aa230080522400805245bdff97b7035ef8ba035df81cffff17a0c300d1e1031aaa2200805223008052240080523cbdff97L4;FB000000000000", - "000008000000000000000800000000000000ccfa45000000000000000000000000000800000000000000080000000000000054fb450000000000L8;FFb9040014e8c341f91f0500b160200054e84f00f9e8cb41f9facf41f9e0d341f9f8db41f9f9df41f91f8125f1e9c741f9e83300f9812700545f0700b", - "120290054BL8;FF42008052db4a0194681e40f9a80000b4602240f901f97fd342008052d54a0194682a40f9a80000b4602e40f901f97fd342008052cf4a0194683640f9a80000b4L8;FF002000918903009424000014e80300aa098d40f83f0500b1e01e0054f30300aae00308aa22040094e80300aae003", - "13aa090140b22911c0da291540d2290d098bBBBBL4;FF740dc0da980dc0daa0833dadd50dc0daf70dc0daa0833eada003d73ca103d83ca203d93ca303da3ce39b803de297803de193803de08f803da003db3ca103dc3cL4;FB0800000000000000c877420000000000000000000000000008000000000000", - "000800000000000000247842000000000000000000000000000800000000000000L8;FF57eaff97e00314aa088c44f81f0500b160000054e10313aa3dfdff97950a40f9550300b4610a40f9680240f9960640f91f0101eb000c0054680640f949038052BL8;FF610f00b4f7031faaf6031f2afc031faa332", - "0805218068f52fb0200d07bc32a910e000014c9e98dd2080040f9896eaaf2892eccf289adecf21f0109ebe80200d0L8;FFe85301f9c86a40b9e00704ad2083c63c2183c73ce82b00b9e8430691e00705ade10240adfab30a39e10302ade10ac03de10b03ad5284fe97e99341b93f090071BBBL4;FFe82708", - "a96803009008052791e82b0aa9ca05805288038052ff2705a96903009029a92391e92b07a9290080d24918c0f2e87f06a9e82709a9daaa019428008092L4;FF6b0d0c8bf7020ccb370200b46d0140f9ff0a00f1ec328a9abf4100f1e0000054bf6900f1c1feff54ff0600f180fcff54680540f9f3ffff17f", - "f0600f100fcff54L8;FFbf031ff8bf233ea913038052e88300913423139b880240f9e8efffb4800640f901f57ed342008052d2aa00947affff17950640f9480080520900809208200039BL8;FFa10353f8810000b4a08353f822008052d82a0194f56340f9e8031691e00315aaaf2a0194a8624039f5c342", - "f9f7c742f9e8631639880280d22007c03d0800f0f2L8;FF8100805200001891ff0316b9e81f00b90c2a0094e80356b9e00740918100805200001891ff0316b9e81b00b9052a0094e80356b9e00740918100805200001891BBBBBBL4;FFf65745a9fd7b43a9ffc30191c0035fd63600805206000014e00308", - "2ae20313aa630c8052e4f8ff97c0fbffb5770240f9e20640f95f0015eb09070054e10240f9L4;FFe08301b9a04700d19bc4ff97e07b01b9a04700d198c4ff97e07301b9a04700d195c4ff97e06b01b9a04700d192c4ff97e06701b9a04700d18fc4ff97e05b01b9L8;FFca114a0b0e819f1a7f7d0271c901", - "090b0e819f1abf25007129c10011cb114b0b0e819f1a9f7d02714ac100110904003909819f1a0a0000396ac10011cb010d0bBBL4;FFa1825ff881ffffb4a00240f922008052d8920194f8ffff17bc0000b481eb7bd3e00314aa02018052d2920194f44f56a9f65755a9f85f54a9fa6753a9fc6f52a9L4;ZD", - "L8;FF6b25019129194b8b2905009129010aabc20600542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9050054280108abBBBL4;FF34af009400018052e10315aae6d20194090c40f9490100b40ba440a90a0040f93f010aebea338a9a29010acb0a0e8052292", - "d0a9b1f2500a9c0035fd6ca030090L4;FB000026bf4ce1dbf2175bb41cf8c041f0ff6021ea8e1dfbcafb2f0c877912ca577a54bb5743503ac2b6e5700774d8ed28555fdcbf532d32f5ad88e65800002af4L8;FFe88742f9e8a706a9e88b42f9e99742f9e8ab03a9e88f42f9eaa742f9e81b00f9e89342f9e", - "87b00f9e89b42f9e8d300f9e89f42f9e9230ca9e8ab42f9e9a342f9BL8;FFfad342f9fc0740919c830191fbf9ff17f60300aae043169122008052dd110094e1d342f9e00316aa02faff17e043169122008052d7110094e1d342f94ef9ff17L8;FF4063029169ecff97f3d352a9140200b476220091040000", - "14940600f1d662009160010054c1825ff881ffffb4c00240f922008052cf520094f8ffff17e057c13dBBBBL4;FF680200f9fd7b47a9f34340f9ff430291c0035fd6ff0306d1fd7b12a9fc6f13a9fa6714a9f85f15a9f65716a9f44f17a9fd830491f30308aa084840f9970280d2L4;FB20696e2075386d69", - "64203e206c656e0000000000000000000000000000000000010000000000000074f342000000000000000000000000001000000000000000L8;FF810000549fde01a99ffe02a997fe03a981620091e20313aa5bf4ff97a0fbffb454000014800b00b5e00313aabbf1ff97e80301aa60000036c8faffb45e0", - "00014BL8;FF6b01084aaa131838aa4358382901084aab231838ab535838a9331838a96358384a01084a6b01084aaa431838aa7358382901084aab531838ab835838a9631838L8;FF40880054e8cf42f92a040091802202914903805209692138ead302f9832b0094e1431691950f0094e87749f91f0500b1", - "e0070054e1d342f9e8cb42f91f0101ebBBBL4;FFa86303d1a26301d101c10091599dff9720f0ffb4aa000014a88352b86800003728008052a8ff32a91f0400f101170054a8835af8090540f9292100f143170054L4;ZBL8;FFfd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191092040", - "f9f30308aa3f0009ebe2000054a8018052690a00f9090380526822003928008052BL8;FFe0833291a102009021a80e9142028052a302009063940d91e85306f908000014e05306f9e0833291a102009021a80e9142028052a302009063f00e9144018052L8;FFe10000b021400591a2018052e30000b063e", - "00591240180523727ff97e14b45f9e14b05f9e0432a91e10000b021e0029102028052e30000b0632c0a91e4018052BBBBBL4;FF290080928822003928008052890200f98092803c8192813c68420039f44f49a9f65748a9f85f47a9fa6746a9fc6f45a9fd7b44a9e923436dff830291c0035fd6L4;FFf70b", - "00f9f9430c91f7e30191f4e30691e0020094e00745ade1430c91e86340f9ea8b40f902288052e94f40f9ebdb40f92083823ce083cc3c2183833ce183cd3cL8;FF140040f9f30300aa9f0600b1e0020054611a40f93f0400b140010054810000b4601e40f922008052d2020194612640f9810000b4602a40f", - "922008052cd020194BL8;FFff8300d1fd7b01a9fd430091010300f021802991040300f084e01091e323009182008052e80700f914830194fd7b41a9ff830091c0035fd6010300f021702991L8;FF6b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b2501912919", - "4b8b2905009129010aab820200542a0140b24a11c0daBBBL4;FFfd7b06a9f73b00f9f65708a9f44f09a9fd830191090c40f9f30308aa3f0500b140020054090442a9e8c30091f4c30091e00309aa749c0094e9c34039e8e74039L4;FBec0000002e00000034684900000000006a000000000000008900000", - "02e00000034684900000000006a00000000000000f30000002e0000003468490000000000L8;FFf53700f9f56340b9e3b7803dec2b4ba9e20713ade8f200f848018052e0a3803db1fcff1720008052e1031caadec2009420008052e1031aaadbc2009420008052BL8;FF890240b22911c0da291540d2290d", - "098b29250191891a498b29050091200108ab220a0054e10313aa85fbff97b7010034610a40f9680240f91f0101eba0090054L8;FFe8a716a978caff34e11740f921caffb4e00b40f922008052d64200944dfeff17fb0300aaf80b00b99a0400b4fb0300f9cc420094e0031aaa210080523b008052BBBBL4;", - "FF1f10003141d20054f9ffff17fde20194f70300aa1f0400b141fdff54e043059181008052f8e2019420d10035e85341b9e8bb00b957ffdfc8d70200b4ff0600b1L4;FB7fea4800000000004e0000000000000058070000050000002aea480000000000540000000000000059000000050000002aea48000", - "00000005400000000000000L8;FFa9831cf8a003983caa0319f8a88317f800010054e0f3c03da02302d1e1431e91f8cb03f9f9cf03f9e0eb813d89300094e0431e91a12302d1e20316aae303152aBL8;FFf50301aaf60300aad66201940006805201018052d4620194800100b48002c03d165400a9e10200", - "d021803b91130800f90080813c1fa00039f44f42a9f65741a9L8;FFe10308aa22008052f4030caaf0050094e10340a9ec0314aa2aa040a9290040f90bfc63d35369283808050091280800f90bfeffb43f0108eb9361193200010054BBBL4;FF681a00f928008052608600ad686a00a910000014d7a201942", - "0008052e00741addf0600f1785601a9742200b97a9200396052823c6152833c7f0200a9ab000054L4;FFe04040795ac30291002c46d3407b6078063c7cd3e40840f9207c4093c30003cbc81000d184400091631000d1421c001269fc44d30010069b0800088b06d05f38L8;FF810100f0210c1691a40100d", - "084002491e323009182008052e80700f917a30094fd7b41a9ff830091c0035fd6810100f021fc1591820080520ca30014080040f9BL8;FF020a00545f010beb68050054a90213abe20900543f0102eba2831ff8a90f00f928070054098441f8f40308aa290140f920013fd6880640f90801158b88ce00a9B", - "L4;FF02018052f44f42a9f65741a9fd7bc3a8d8220014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091f30300aabdffff9774d645a9L3;ZBBBBBBBBBL4;FF0811c0da560f488be80b40f9091b16cb000540a9220101d1e31700940800148a206b68fc00a8200e0a00669e4", - "a0300b44901c0da2911c0da080d498b0801148aL4;FFe0c30091fa3300b9e8db0039e80b40f9e96b0079e9634039fb7303f8f6f303f8e87304f8e93f0139bcf6fe97f703002a15000014f5031baae81340f9e9a34039L8;FF22008052db1c0194e00313aa0103805202018052f44f42a9fd7b41a9ffc3009", - "1d41c011460fa7f92280000cb010102ab62010054a101f8b722008052f44f42a9BBL4;FFa81544d3edd701a9e81700f9f42b00b4e81340f9e91b40f92801088b177d0091eab344b9ebaf44b940430091e8a344b9e9a744b9a18301d16b010a0becab44b9L4;FFcbffff1741d03bd5258055b8018c40b9217", - "801123f00056be00400540430029180fc5f888000003585fc0088a0ffff351f000014bf3b03d5a500023218000014L8;FF3f0500b120060054096840b969070034290140b22911c0da291540d2290d098b2925019129fd46d3290500910a2440f9aa0600b44b0140b26b11c0da6b1540d2BBBL4;FFe8a74f", - "29097f003908830039e8a74e2909870039088b0039e8a74d29098f003908930039e8a74c2909970039089b0039e8a74b29099f003908a30039e8a74a29L4;FB0000000000000000080000000000000008000000000000006458440000000000676f6f676c652e70726f746f62756600a00f4900000000000", - "f00000000000000L8;FFe0031d9181220091032b0091f4031d9101210094e8a343f9eaa743f9ebab43f9e9af43f91f0900b1e9fb00f901130154e8fb40f96b2201a908008092682a00a9BL8;FF8162019102328052e07f843de183843de287843ddf5c0194e0074091e10740910238805200800991218001", - "91d95c0194e92342a9e00319aae0f3c63d01788052L8;FF1f2100f11481899ae30314aa6d0e0094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faadb5c0094e00741a9BBBBL4;FFdc8d009480820091e1030791022a8052f63700f9dffc0194a00642a9", - "e2c3009182f7ff97a80a40f9081400b41cfc79d3e1e7076feb031faaba6e40a9e9031faaL4;ZFL8;FF61000054806200916efc0094881240f9e083c03ce1031faa2823189be90f40f92a0700910001803d090900f98a1600f9d6ffff171f0800f121090054e1230091BL8;FF280108ab0303005438000014", - "e8031faa096040b93f05007160fcff540a6840b9e803088b5f05007141fdff54096c40b9290140b22911c0da291540d2290d098bL8;FF080117cbbf0208ebc8380054e81340f9e10316aae20315aa0001178bdd7c0094e802158be81700f9956640f9550300b4e11740f9e80f40f9966240f91f0101ebBBB", - "L4;FF60030054e0630091e10700f923a5ff97ff0600b1fa0f00f9e0030054e06300911ea5ff979f0600b1fa0f00f920080054e063009119a5ff97e8630091e00316aaL4;FB14f6470000000000180000000000000008000000000000001c0b48000000000014f64700000000002000000000000000080000", - "0000000000600c480000000000L8;FFe92b06a9290080d248038052c90fc0f2a02700d1e1030191e87f05a9e82708a9e0bc0094cfbc00940004815221008052cdbc0094801300b4e10313aa02048152BL8;FFfd7bc1a8c0035fd6a00200f000202a91db3c0194a00200f000602991d83c0194a00200f000c", - "00991d53c0194e00301aaa10200f021802a91a20080520b3d0114L8;FF756641f9e80240f9200705ade9d302b9680000b4e00315aa00013fd6e10640f9810000b4e20a40f9e00315aad13c00949f0b00b101120054689a42b91f090071BBBBBL4;FF1f070071680a00f961050054881641b9080140b20811", - "c0da081540d2080d088b0825019108fd46d308050091978640f9970400b4e90240b22911c0da291540d2L4;FFe0030e9144ebff97f9575aa9f62b40f9f4cf42a9f8db40f9e0830c9126ebff97e1cf40f9e16affb4e0cb40f922008052d00c009453fbff172000805281008052L8;FFf44f44a9f51b40f9fd", - "7b42a9ff430191c0035fd628008052e1230091e00313aaf5d300a9e8630039f7f6ff97f44f44a9f51b40f9fd7b42a9ff430191c0035fd6BL8;FF00603891de8c01941f180071cc0000541f0400710101005468008052e003082ac0035fd61f1c0071a1000054e80080520400001448008052020000140801", - "8052L8;FFd88c00944000805241008052d68c0094e05f00f9008000b4d28c00944000805241008052d08c0094607f00b4f50300aacc8c00944000805241008052ca8c0094BBBL4;FF88035df87f0308eb2101005481835cf8e00318aae2031baaeccc01948000003588835d385f03086b40040054e1e7076", - "fe92f42a9ee3741a9280700d1ef0740f9L4;FBc002cb12d622dd32b4c2bfd2a2e2a9f2988293928ea285b257525c4241724a627b1270026d3266220fd204c219f212e22392288235b23ea29a6391738c438753L8;FFd8cc0094e00314aa21008052d6cc0094c04101b4e1031caae20314aafa0300aaf6031", - "4aadbcc0094e97740f93e0700147923442977db40a97c0f40f97ad343a9BL8;FF097d02a9090180521a7100a91c0700911a7d01a91f2503a91f2100f92003c03d0081843c2007c03d0081853cfc2700f9da0000b4e0031baae1031aaa22008052L8;FF4a194b8b4a050091090100b42b0140b26b11c0da6b", - "1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8bBBBBL4;FFf30308aad7ec01940004805221008052d5ec0194600100b4800640ad08048052751a00b9680200a9000400ad680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd6L4;FB080000000000", - "0000e07b4200000000004170706c69636174696f6e43616c6c6261636b4572726f72496e76616c69645365616c656453656e6465724d65737361L8;FF80010034610a40f9680240f91f0101eb60050054680640f9090280522a0400916a0a00f909692138e10313aa4cecff97818a40a960008052e30313a", - "a94eaff97BL8;FF200300543f100071600300543f14007121050054e85740f91f0500b120070054c1c20091a20301d1f855ff97e0f9ffb46a0000143f040071e00200543f080071L8;FFa1037bad092300a9e81b40f96182833c6082843ca1037cad080b00f96182853c6082863cb90000b4e0031aaae103", - "19aa22008052cf6c0094e12740f9010b00b4BBBL4;FFf50306aaf40305aaef380094e84b40f91f0500f1c0230054fb430291e00317aaf90300916083c63c6183c73c6283c83c6383c53ce00703ad6083c13c6183c23cL4;FFb8264078c80120376800283688120b8b0b1140798812188be1230091e91b00b", - "9ea3b0079002140a9eb3f0079f3eb00a900013fd600f70736290000148a120a8bL8;FFb70301d1ff0701f9ff1301f9ff1f01f9ff2b01f9ea3301f9ff3701f9ff4301f9e94b01f9ff4f01f9f35701f9ff5b01f9f56301f9ff6701f9ff7301f9ff7f01f9BL8;FFa82b3da90a078052c8048052bf2738a98902", - "00d029cd2191a92b3aa9290080d2a10302d16908c0f2a87f39a9a8273ca9dc2c01944083cf3ca88355f8bb0353f8L8;FFca220a91eb030291e29340f9f7030291483100b8683d0a91eb435d39e90b03b9c9fe0a911a6d00a9fb0308aa197101a9e8a743f9400540ad785702a9280100f9BBBBBBL4;FFfdc3", - "00911f1c007280010054c80080d2e0230039ff2700390800f0f2e0030091e80300f9f2090194f44f44a9fd7b43a9ff430191c0035fd6530040f9680640f9L4;FF6b2934918d008052ef031a2a78ff78d337fd60d3f603192aee03082af003182ab4070014e02bc13de12fc13da40000d084203091e233c13", - "de86b02f94083803cL8;FF80100054480080520a018052680200b928050091686a2af8f44f44a9f65743a9fd7b42a9ff430191c0035fd609111a33e803092a7f2200297f0600f9f44f44a9BBL4;FF230000141f090071e10b0054080180d229df78920800f0f2080140b25f000014e00317aa396c0094fa0", - "740f9f70301aaf80300aa5b0315cb3f001beb48130054L4;ZBL8;FF7f0a00f97fa202a9f30b40f9fd7bc2a8c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa8101009021802091e8030091e00309aae2008052BBBL4;FF61d50094e80300aae00301aaa8fc0736c5000014a13e0054f", - "5031faa92feff17c13d0054bc0357f8a80356f89f0308eba0010054a88356f8a083dd3cf5031faaL4;FB5369676e616c205051205261746368657420563120436861696e204164642045706f63680000000032214900000000004d00000000000000a40100000a000000L8;FFe80342f9fcff41f9e9ff00f", - "9e91b42f9e71342f9e8bb00f9e80f42f9fa5342f9e9ab00f9e92342f9e06fc13de8cf00f9e81742f9e67f42f9e9af1aa9e92b42f9BL8;FF000119ab426e0054e14316918c0d0094f90b40f9df0a00b100040054e1d342f9e8cb42f91f0101eb204f0054e8cf42f92a040091800203914901805209692138L", - "8;FFe9ab05f9a90000d029c10d91e8af05f9e8c32291a04700d1e9b705f92901009029413191e8b305f928008052e1833291e96f06f9e95706f929010090292d0e91BBBBL4;FFfd4303915c0080d2f30308aa08008092a94301d11c00f0f2a0073ba9e82b00f9e83700f9a9031cf8410e00b4f80301aaf90", - "300aa37210091f5430191ba4301d1L4;FB20656d7074790000dc224000000000001800000000000000080000000000000028c442000000000004c3420000000000dc0743000000000063616e20616c7761L8;FF010b00b5a80640f91f011aeb89060054e00313aac1f3ff97400a003728fc60d3280800b52", - "00840921f1800f162080054217c0353810800343f0800710c020054BL8;FFa809f837a0e300d1aeddff97a8835cb848110037a8835df84a0340f9490108eb631c00546a0340f9b6035df84801088b680300f9490300f9c8fe60d3880900b5L8;FFe8cf42f9490480522a040091e00318aa09692138e14316", - "91ead302f997110094fad342f9e8cb42f908011acb1f0308ebc8be0054e8cf42f9e10319aae20318aaBBBL4;FFf7b40194000200b4e10313aaf30b40f9fd7bc2a8c0035fd6000440f9e10313aaf30b40f9fd7bc2a8c0035fd6d1b4019420008052e10313aaf30b40f9fd7bc2a8L4;ZDL8;FFe8031faaed33", - "839a6a030dcb6c000acb4e01198b29030ceb2be179d3691109cb6b808e9a3f030ceb29819f9a5f010beb6b9284d22b49b2f2aa0301d18b24c9f2BL8;FFfeecff97f50301aa804d0037a8fe60d3c82300b5a00a40921f1800f102240054a17e035321240034280400511f390071c806005489000010ea6a68", - "3829090a8bL8;FFa22302d1daf3ff9740f4ffb4560100141f0800f1e1220054a80302d1a10302d1a22302d11f7d01a908018052bf6338a9b87f3aa9bf233ba9bf673ca93bf5ff97BBBBBL4;FFffff03a94a8cccf2ff1b00f9aa8ceef229000acaa11300d1e82701a9480040b982008052a8c31fb87889009", - "4e82743a9ea2f41a928e108aae93340a90b010bcaL4;FFe81740f9e083843ce82f00f9e00b42adb37e04a9a10200ada20a803db45200b9f44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd620008052e10313aaL8;FFf65741a9fd7bc3a8da040114f44f42a9f65741a9fd7bc3a8c0035fd600200", - "0913afeff17fd7bbea9f30b00f9fd030091090040f9e8008052f30300aa2a0900d1BL8;FF09400091020300f0426c3c91e82700a9e8030091090000d029c11991200440a9e82701a9e8230091090000d029011591e82702a9e3430091eb840194fd7b43a9L8;FFe00315aa62cdff97a80640f9890700912e", - "008052a90a00f908091c8b180100791b050079a2ffff17e00315aa58cdff97a80640f92e00805216091a8b88031aebBBBL4;FFe87b45b908230037e8c742f96a0340f9490108eb632700548a0340f9f4c342f94801088b880300f9690300f988fe60d3881800b5800a40921f1800f182180054L4;FB5b000", - "000090000008b634900000000003800000000000000530000000d0000008b63490000000000380000000000000082000000090000007375636365737366L8;FFa092c83ce1b7c13de2bbc13dea3f5739f00314aaebd14d78e0d7803de6030991e0a7c13de10b19ade1abc13d6a410a2aeb914db8e8ff5539", - "e9d14878e2b3c13dBL8;FF640080523c390094e10740f9b1ffff17e80f41b2abffff17e80f41b2b9ffff17a0031df8c10200b021240e91c30200b063740e91a0c300d142018052e4008052L8;FFe9a34539ec7b0079ebf303f8e8f304f8e95f0139564ffe97e103002ae8430691e00315aa7a95fe97e8cb4", - "0f98082c53c8182c63c8282c73c1f0500b1e00600adBBBBL4;FF00030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb431101541803008bf9feffb50f0000141f0400b1a1100154L4;FB56000000000000003f000000270000006d697373696e672073656e6", - "4657220636861696e000000002de748000000000034000000000000003701000022000000L8;FFdce40094df0e00b160000054a0020291c4deff97ff830b91f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8c0035fd6032440b97f04007108010054091840b9BL8;FFf44f02a9fd030091f40302aaf303", - "012af50300aad36401940003805201018052d1640194400100b4155000a9e10200f021803691131000b91f500039f44f42a9L8;FF18f17dd30b000014680640f9e10316aae20315aa0001178bde640094e802158b680a00f9186300f139630091c003005436d77fa9e00314aae10313aa8f010094BBBL4;F", - "F42a00f91610480520ba50194fd7bbfa9fd030091e8031faa4900018a006869fc00a8200e0a00669e2a0100b51f2100b1a003005408210091220108abe3feff54L4;FF818201a97f7e00a9e00313aaf35341a9fd7bc5a8c0035fd6352440f9000700d1bf0200eae0179f1a40fcff3580021091a206409101", - "1440f9022400f9022040f9L8;FF42200c91e3430091e82701a9f6a40094fd7b42a9ffc30091c0035fd6a80100f008710c91e00301aae10308aa620280520ea5001408004039e00301aa1f050071BL8;FF09010039c0035fd6e00301aa810200d021400191a200805214250114fd7bbda9f65701a9f44f02a", - "9fd030091140840f9f30300aa3f0002716200005435008052L8;FF000400adc0f2c63c0208803d00f0823c60a200a9e003019102250094ff431391f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd620008052BBBBBBBL4;FFc10240f9810000b4c00640f922008052d8180294c10e40", - "f9a1fdffb4c01240f922008052d3180294e9ffff17880240f9280100b4090d8052e00313aa017d099bL4;FF41a30091e30318aa49110079480100f9e20f00f95a0e0094f56f44a9f95b45a9bf0a00b1c1070054600640f9fbe702a9f61f00f9bcc31fb834f0fe97f70300aaL8;FFfd7b41a9ff830191c003", - "5fd6ff8301d1fd7b03a9f52300f9f44f05a9fdc30091e90300aae10700f9220d41f83f0002ebc1010054000440ad6b0200f06b210e91BBL4;FFa8831cf8e0180054550080d219210091b7e303d1faa306911500f0f2380080520e000014480080d2290080520800f0f2692200a971010014a2e300d1830c8", - "052L4;ZFL8;FFaa835638a96316386901084aab935638a97316384901084aaaa35638a98316386901084aabb35638a99316384901084aaac35638a9a316386901084aabd35638BBBL4;FFc082c53ca0039e3cc082c03ca003993cc082c13ca0039a3cd8d80194ff0600b1752e00f960050054a0877dadf71", - "f00f9e00703ada2837ead0083853ca1837cadL4;FB53616d706c6564002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639L8;FFf1031baafb030aaaea030daaed0314aae0f3803d8d020014082340391f050071c", - "1020054e0430f91a122009102398052d8d80094e0031d91e1430f91032b0091BL8;FFe20318aa00011a8be25801944803188be8d302f9e06749f9f90b40f9800100b4e1d342f9e8cb42f91f0101eb20bf0054e8cf42f9090580522a04009109692138L8;FF830c8052faecff97e0f6ffb4ea000014016300", - "91a22302d129f4ff9740f6ffb483010014e1032d91a22302d124f4ff97a0f5ffb4650100141f0800f1c1240054BBBBL4;FF200500b408c30091e10315aa161000b9085c00a92804009008a134911f500039602201a9090d40f9e803009120013fd6e80340f91f0d00b100fdff54755a41a9L4;FB203cc001", - "3e002d6d697373696e672073656e646572206b657920737461746520666f7220646973747269627574696f6e20494420c0001d70726f746f636f6c20L8;FFe10300aae00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6e20313aa230c805267f1ff97e10300aac0feffb5a80640f91f0116eb090", - "50054e00313aaBL8;FFe03740f9e10317aa22008052d97801945f0700f12b010054e00315aae1031aaa22008052d3780194040000149f0b00b1c1010054f80319aae00318aad460ff97L8;FFe00740919c83099100c0359188830e9170ebff97e0074091e1074091023280520080019121c03591da780094", - "e0ffc33de103c43d80430891e207c43d81620191BBBL4;FFf7ffff17e84740f968a5ffb4080d088be00313aa0201805201f17dd3d5b8019425fdff17e083ca3ce183cb3ce283c83cea6740f9685e05a9600601ade083c93cL4;ZBL8;FFe9031faaea031faa8c318d9a4d040091ae696a384a0500915f010c", - "ebcf194092ce1d0013ef21cb9ae90109aae20200546b1d0091eefeff37140000146c0400f1BL8;FF080040b20811c0da081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aa080c45f81f0500b1800200545afbff97080040b2L8;FF081140f900013fd6fadf49a9fb6", - "340f9f55b40f960c603f961ca03f9bdfdff1760e213914ef7ff97b5000014e10000f021400e91e0830f91c20880522c120094BBBBBL4;FFf85f4ca9fd7b4aa9ffc30391c0035fd69404005136008052770040f9e20640f95f0015eb290d0054e10240f9290080398900f8b7280400914a0400d115000014L", - "4;FF2100805238008052d708009440feffb4e10317aae20315aaf60300aadd080094e0030091e10315aa220080522300805224008052f55b00a9f50b00f9b2e9ff97L8;FFc0035fd6ffc300d1fd7b02a9fd830091490200f029c13e910a0000904ae12491400200f000803f91e92b00a96902009029e1059", - "1e1030091e92b01a9fc080194BL8;FF4a1540d24a0d0a8b4a25019129194a8b2a050091691640f94801088b090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abL8;FF63402e9120008052e1031faae2031faaf68800944000805241008052e288009440008052e103", - "17aadf8800944000805201098052dc8800944000805281088052BBBL4;FFf30308aafb030691fc03029109008092a80301d11900f0f2600713a9898300f9898f00f9ffcb01b9ffd301b9899b00f9688f00f9810f00b417210091b80301d1L4;FB25194900000000006a00000000000000f30000002e00000", - "025194900000000006a00000000000000950000002e00000011000000000000001400000000000000L8;FFe1825ff881ffffb4e00240f922008052d8c80094f8ffff17353400b4a806158be00314aa0201805201f17dd3d1c800949b01001497ff48d3e0031baa080c48f8BL8;FF8f010094e00315aae103", - "13aa8c010094770a40f9680240f9080117cbbf0208eb6800005455fdffb5f0ffff17e00313aae10317aae20315aad6070094770a40f9L8;FFdf480094000100b000203691dc480094fd7bbfa9fd030091083c40f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091092440f", - "9BBBBL4;FF08a101915fa001b121ffff54530080527f0a0071c1320054680400b008b140f91f0d00f123040054e8030291a90000d029312291e8270aa9e8f30191c90300f0L4;FB000000000000000008000000000000000800000000000000204c420000000000000000000000000008000000000000000", - "800000000000000204c420000000000L8;FFdf0207b81f0800f1812f0054a0c303d1c2e7ff9720060036a12700b4c3010014e8f340f91f0d00b1e1040054a1a303d1a2c303d1ba8311f87fecff97a083db3cBL8;FFf4680194ffc304d1fd7b0fa9fc5f10a9f65711a9f44f12a9fdc30391130440f9b300f8", - "b6f6031faae00316aae10313aadd680194140040f9730000b535008052L8;FF27feff173c008052e8430691e0430f91f67bfe97f82740f9e81f40f91f0308eb61000054e0e30091419ffe97080d8052e92340f90827089b29008052097d02a9BBBL4;FF4b9bff97a1035cf8e7feff17a04301d1e10319aae", - "20313aa2300805224008052439bff97b9035cf8a8035bf8080119cb7f0208eb49ddff54a04301d1e10319aaL4;FFf403012af51300f942cc218bf50300aa40200091610240f961ffff97e20313aae103142ae00315aa0300009063d03c91f35341a9f00303aaf51340f9fd7bc3a8L8;FF080500113700001", - "4e10740f9e80319aaf90301aad4010034a8c303d13900028b0001148bdba80094a80357f880030191a1c303d12200805208050091a80317f8BL8;FFa0833cada0833dada0833eada003d73ca103d83ca203d93ca303da3ce3d7803de2d3803de1cf803de0cb803da003db3ca103dc3ca203dd3ca303de3ce", - "3e7803dL8;FFd60600f1f7620091e0000054e1825ff881ffffb4e00240f922008052d5280094f8ffff17e89740f9c80000b40805088be00314aa0201805201f17dd3cd280094BBBBBBL4;FF0005803de083c23c0009803d12ffff1780c2009146470094e9ffff17e00313aa59110194e80300aae00301aaa", - "8da0736adfeff17e00313aa53110194f70301aaL4;FFa04700d19cc2ff97e07b01b9a04700d199c2ff97e07301b9a04700d196c2ff97e06b01b9a04700d193c2ff97e06701b9a04700d190c2ff97e05b01b9a04700d1L8;FFe007c03d1ffd0371e003803d40020054e91342b8ea2740b9e1430091e003c03", - "de8830039e00313aaa91b00b9aab301b8a81b40b9e007803de81302b8ea2700b9BBL4;FFff830a91f44f42a9fc5741a9fd7bc3a8c0035fd62000805201048052ed900194ff4307d1fd7b17a9fc6f18a9fa6719a9f85f1aa9f6571ba9f44f1ca9fdc30591L4;ZDL8;FF42048052fd7b44a9ff430191179100", - "14880100d0086d2d91e00301aae10308aa62028052fd7b44a9ff4301910f91001408040091200440a9a94300d1eaffffb0BBBL4;FFe00318aad0b9ff975a0700f118c3019181ffff54bf0216ebfa0317aab74302d1e2000054f8031aaae00318aac6b9ff97730600f118c3019181ffff54df021cebL4;FBe", - "fd5fa320668af820d0e7026764ed9ccd4c2a4e4d2aa0b66dfa47b40a9eaa28c7f4ced22000064d9cf570f76474c51260eab9a3bed455ac556b9af8723172e1bL8;FFe56f40f9e72340f9e08710adefb344a9edef49a9f1a34ca9eb030faaf00346a9f7030daaed0740f9fe1b43a9e4a74ba9fadb4aa9e367", - "42a9ef3b47a9b7faff17BL8;FF010b00b4e00315aa54000014e88241f8e082c03ce9c302918a0100904ae13691c00200f000382b91e86300f9e863019108210091a10303d1a92b34a9e02f803dL8;FF766e00a9623a803d600606ad800743ad687a00f9755e01a9600604ad820344ad620205ad810341ad6", - "10202ad820342ad620203ad810340ad610201adff032e91BBBBL4;FFe323c03d640b01ad600702ad608707ad648b08ad639709ade112813ce012803ce212833ce412823ce512853ce312843cb80000b4e00319aae10318aa22008052L4;FB1d0200000900000072984800000000003300000000000000220", - "3000020000000536b697070696e6720617263686976652c2063757272656e742073657373696fL8;FF160101eba2020054e80f41b207000014890080d248008052e02300390900f0f2e827003928017fb2e0030091e80300f9efe5ff97e10300aae00301aaf44f47a9BL8;FF601240f922008052da700194", - "611e40f914008092740e00f93f0400b140010054810000b4602240f922008052d1700194612a40f9810000b4602e40f922008052L8;FF2a04009109692138e1431691ead302f99a0d0094df0600b18000005480c20291e1431691c01000941f0700b14086ff548122029110010014e8031faa000119abBBB", - "L4;FF1f0500f1600e0054bb8353f8e80f40b9e10317aae20316aae0031baa1c7da80adcb00194a80351b8493340b8e23fc03deb2b48a97b5a02a968ea00b9e88b40f9L4;ZBL8;FF68008052400bc03d49f342f8e0030891682200394003803de80309aa49f300f8290080924003c03d690200f96092803c6", - "80e00f9cca9ff97b60000b4e00317aaBL8;FFa04700d1e96f06f9e1833291e95706f9890200f029cd2191eaa705f9ea032d91e86b06f9880200f008712691e96306f9290080d2e87b06f9c80480528943c0f2L8;FFe0d341f9e34740f9e45b40f98691fe97fc4b45f9e082c03ce9432a91e85745f99f0b00", - "b1c002803de8a304f921090054e8a344f9e9831f91c002c03de95303f9BBBBBL4;FFaeffff172c69eb38ac03f8366d2100d18c014092aa010a8ace3641a928692b382a010a8bcc010ccb4821003928190bcba9050091cc2601a91c011cb815dd3ca9L4;FFe02740f9e8000094080140392940805208c1005", - "11f290071282080522831889ac8aa073715fd60d3bf9601f1eb279f1a53fdff170001805201088052da000094L8;FFae1d00128c1d0e0b8c0102518d00f83761710c8bcb008052280000149f114071630800544d19c039ae1d00128c390e0b8c1140518d00f83761710c8beb008052BL8;FFe0030091a363", - "009142018052a80f00f925810194010300f021542491240300b084402391a363009142018052b30f00f91d8101941d810194fd7b41a9f31340f9L8;FFe91700f917692138d0e3ff97e16300915380ff97c80240f91f0500b1a0000054e263009120008052e10316aa7894ff97e10316aa288c43f81f0500b", - "1e0fcff54BBBL4;FFe9c00194ff4307d1fd7b19a9fc5f1aa9f6571ba9f44f1ca9fd430691160c40f908008092080c00f9df0600b1a00a0054f30300aae8230091022a805200210091L4;FB69642062617365206b65790000000000a3794900000000003800000000000000ab0100001e0000006c69627369", - "676e616c5f70726f746f636f6c3a3a73657373L8;FFa303de3cf52b02f9e107813de20b813de00f813da2033aad4083c53c4283c33ca103933c4183c43c4383863cfb4702f94383c63ce18301ad4083c93c4183c83cBL8;FFe00741a9e8400194ff8302d1fd7b06a9f73b00f9f65708a9f44f09a9fd83019", - "128008052f30300aa3500028bffa300a9d6020090d6820a9117008012a88300d1L8;FFc000f8b6f40300aaf6031faae00316aae10314aae4400094a00100b4f50300aad0400094e00315aa21008052f40315aa36008052cc400094a0feffb4080740f9BBBBL4;FFf843059199008052e00318aae10319aae", - "2031f2ae0023fd61f0000f1cd000054390300eb639100541803008bf9feffb50f0000141f0400b1c1900054f0e00194L4;FB76616c6964206b65792061677265656d656e74206f75747075742028616c6c2d7a65726f20736861726564207365637265742964657669636520494420697320L8;FF070954a", - "9e9b300f909a945a9ed6f00f9043559a9ec5f00f910195aa93f030aebeba717a90ba546a903015da9eb9700f9e9d700f90ba547a9e04b00f9e3eb0fa9BL8;FFf44f42a9f65741a9fd7bc3a8c0035fd60001805201068052ee600194fd7bbea9f44f01a9fd030091f30301aaf40300aacc600194000580520", - "1018052ca600194L8;FF21e03491230100f063a03991e023009102018052a4008052e80700f909000014e00700f9210100f021e03491230100f063b43991e02300910201805264008052BBBL4;FFe92b09a9290080d2a90cc0f2e87f08a9e8270ba9e3a00194d2a001948004805221008052d0a00194602e", - "00b46803009008412f91890e0091000540ad88ae8e52L4;FFe18b40b2422041fae803005421000090211842b98100003421000090211442b9210300341f4000f1814200d1130280d21320939a2000138b61feff97201400b4L8;FFe0230091e103009116a1009416a10094fd7b42a9ffc30091c0035fd6ff", - "0301d1fd7b02a9f44f03a9fd830091140040f9e00301aa810100f021a81991e8230091BL8;FF00201a91e1200194800200b000c01991db200194fd7bbda9f50b00f9f44f02a9fd030091150c40f9f30300aaf40301aacc2001940005805201018052ca200194BL4;FFe1031faae20314aa23008052240080", - "52bd010094770a40f9680240f9080117cb9f0208eb69fbff54e00313aae10317aae20314aa2300805224008052b2010094L3;ZB" + "BBBBBBBBBL8;FB67206578636573736976652072656365697665725f636861696e20666f722073657373696f6e20776974682062617365206b657920c00f2c20636861696e2063L8;FFaca40094e00c00b4e00740adf70300aaa11240f9000400ad810000b4e00316aa22008052a4a4009408048052b9524", + "0b9a85e02a9a81a00f9a2a4009400098052BL8;FF600640f922008052ab240194610e40f9810000b4601240f922008052a6240194612640f93f0400f18b000054602a40f922008052a024019474d643a9750300b4L8;FF8d00f83761710c8bcb008052280000149f114071630800544d19c039ae1d00128c", + "390e0b8c1140518d00f83761710c8beb0080521e0000149f01487183070054BBL8;FFf85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd62000805201048052e2600194ff4301d1fd7b02a9f51b00f9f44f04a9fd830091f40300aa35008052e0030091L8;FFe81340f9c80000b4e01740f9e10308aa220080", + "52a8640094e10313aae81f40f9c80000b4e02340f9e10308aa22008052a1640094e10313aae82b40f9c80000b4BL8;FFa1feff902148139183feffd063900291e0030091c20180528400805211000014c80080d2e0230039e00300910800f0f2ff270039e80300f9d8eaff97e80300aaL8;ZDBBBL8;FB000", + "000000000000065824000000000006e8240000000000000001b1b1b1b1b1b1b1b1b1b001b1b1b1b1b00131b1b001b0000070000443f350b16493a657b753aL8;FF096921383ff0ff97e1630091f791ff979f0b00b1a1010054e083c13ce81740f96003803d680b00f9f44f48a9f65747a9f85f46a9fa6745", + "a9fc6f44a9fd7b43a9BL8;FFe08b55adf67f4e39e00b1dade18352add51a40d20001168b08108052e20315aae1031aade08b53ade00b1bade08751ade00719ad081400380a050194bf3e00f1L8;FF0c000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00", + "741a9de000094fd7bbda9f50b00f9f44f02a9fd030091BBL8;FF4a1540d24a0d0a8b4a25019129194a8b29050091280108ab8300005420000014e80308abc2030054694640f9090100b42a0140b24a11c0da4a1540d24a0d0a8bL8;FF7f0a00f99f0208eb08040054f7031faa08011fcb9f0208eba804005", + "4340100b4680640f9e10315aae20314aa0001178ba8440094e802148bb502148b680a00f9L16;FF08e12091e1430f91e3031d9162008052f8eb01f9f80311aae9a703f9e9af03f9e8b303f9fec700f9eb5700f9e41300f9f4bb00f9f40305aaf5ef00f9f50307aaBBBBL8;FBa1104000000000004d000000", + "000000005b03000009000000456b526563656976656443743153616d706c6564756373656e64696e675f63743143743153656e74L8;FF080d088b0825019108fd46d308050091090c40f93f0500b1400400540a1440f9092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8bBL8", + ";FF2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6e0fefff000603391f5100194e0fefff000c02e91L8;FF48c2ff97e09300b9a04700d145c2ff97e08f00b9a04700d142c2ff97e08b00b9a04700d13fc2ff97e08700b9a04700d13cc2ff97", + "e08300b9a04700d139c2ff97BBL8;FFe82340391f050071e1000054e84340391f0500710c040054e8040035e90f41b22e000014e89340b8e90f40b9eba34039ea2341b8ec234079680a00b9e82f4079L8;FF88fdfff008411f91c9048052e8c302f9e3031691e8cb02f988fdfff008612a9142008052e9c7", + "02f9e9cf02f9e8d302f96ee4ff97f58740f9e8031691e00315aaL16;FFe2ffff17e8432d91e0430f91611f009428c30091a02302d11b2d0094e0ffc23de103c33d19008092e207c33de0432d91e1431e91e02f823de00bc33de133823dBBBL8;FF1d000094610a40f990feff17e00313aa22008052230080", + "522400805216000094610a40f997feff17e00313aae10317aae20315aa23008052240080520e000094L8;FF3f0700b1f90b40f9c07cff5401230491c4000014e8031faa00011aabe2650054e1431691400d0094df0600b18000005480220291e1431691351200943f0700b1BL8;FFf44f01a9fd030091f30", + "301aa14e0009104000014730600f194c20191c002005481825cf8810000b480025df822008052a1f4009481025ef8810000b480825ef8L8;FFa268633882000034000080d21f000039007d20d44600805225008052c620c91a27000090c6040051e7201d9102008012a520d41a02d01f381fe01f78641e40", + "b9BBL8;FFe1431691ead302f90f120094f90b40f9b8010034e1d342f9e8cb42f91f0101ebc0d30054e8cf42f9090380522a040091e00318aa09692138e1431691ead302f9L8;FFe0830f91a2028052fb6300f9bf090094e8fb41f9f6e743b9f5031faaf7e343b9eaf741f9e86b00f9c80080d20800f0f214", + "49009168008052e85700f96cf8ff17L16;FFe85f42f9e007813de10b813da08739ad4083c63c4183c53ce313813de20f813df52342f9a203953c4283c43ce10302ad4083c33c4183c83ce84b00f9e00b01adBBBBBL8;FB696e76616c69642073656e64657220636861696e2072617463686574206b657967", + "e6096a85ae67bb72f36e3c3af54fa57f520e518c68059babd9831f19cde05bL8;FFf58300390c000014e80740f9a083de3cd6060091a822179ba9835ff8aa060091df4200f10001803d090900f9ea0b00f9c0050054da4e179b590b40f935f77ed3BL8;FF610a40f9680240f9941e40f91f0101ebc009005", + "4680640f9490580522a040091e00315aa6a0a00f909692138e10313aa05faff97760a40f9680240f9080116cbL8;FF889e0039280080529c820039971202b8895202789a1600f968620039f44f4ea9f6574da9f85f4ca9fa674ba9fc6f4aa9fd7b49a9ffc30391c0035fd6680316cbBBL8;FF400540ad200", + "500ade8ff0139e90740f9f503082a020315cb386540a93c0302eba3070054350200340803028be10318aae80300f9e80301910001158ba55c0194L8;FFa88357f8080540f91f0115eb09100054a02302d1b3f4ff97402f003728fc60d3c81400b5200840921f1800f102150054217c0353c11500343f0400", + "7120010054L16;FFe00313aa2200805223008052240080525a000094610a40f988ffff17f50300aae00313aa22008052230080522400805252000094610a40f9e00315aa8effff17BBBL8;FFf44f02a9fd03009113d840a9f40300aa360300b475c2009106000014e00315aa23000094d60600f1b5a20191", + "40020054a1025df8810000b4a0825df822008052L8;FFe85b09f9e807409121800991e93709f9a9fdffd0294d279108c13591e94309f9290080d2e85f09f928038052091ac0f2ff3309f9e83b09f9ff3f09f9ea4709f9BL8;FF688200911ffddfc8610240f9810000b4600640f922008052a7fc0094e0031", + "3aa0105805202018052a3fc0094a00640f9e10316aae20314aa4bfd0094b40a00f9L8;FF0000148be20315aab2fcff97e80314aa0801158be80f00f9e083c03ce80f40f96002803d680a00f9f44f44a9f65743a9fd7b42a9ff430191c0035fd6e0230091BBL8;FFa9a315386901084aabd35538a9b315384", + "901084aaae35538a9c315386901084aabf35538a9d315384901084aaa035638a9e315386901084aab135638a9f31538L8;FF01a140b960fe41f9280d40f900013fd6607e02f9618202f948fdff17ea5f40f9f6fe60d3f4031aaae95740f968c6533935fd48d3480c00376d000014f85f45f9L16;FFe06700", + "f9e0831d91e9db01f9e092833ce8cf01f9391c0094efb343f9fa0315aaff0900f1c14c0054b60000b4e06740f9e10316aa220080529fbc0094e17740f9BBBBL8;FBa28cf860264a7dc3363f00003997fac8ef9f75d8892189734e57714ca87d0f9d441906a28a4ae7347b43050a50be8658d2c5bb819168e", + "296f6c95b3cfeb3846bL8;FF2e340e5331380f53fb875429297f890a6b7f8b0aaa7e8a0af69b40b90f020f4a2d7c8d0a8e7f8e0ad07e910ae901094a6a010a4a08010c4a29010d4a4a010e4aBL8;FFe8c31691eafeffb04a210c91e86304f9e8ffff9008213f91e96f04f9e9c32291e86704f9e8c31d91a0", + "4700d1e86b04f968008052e1833291e97f06f909078052L8;FFf70300aab30c0094e0230091e10316aa220080522300805224008052f6df00a9f60f00f93fe9ff97ea2341a9eb058052e90740f9160500914b692838290116cbBBL8;FFe10317aae8480194690308eba001005433fd45d315210091040000", + "14730600f1b5820091e0000054a1825ff881ffffb4a00240f9220080529f4c0194f8ffff17L8;FF02490094fd7bbda9f65701a9f44f02a9fd030091140840f9f30300aa3f0002716200005435008052080000143f0020716200005455008052040000143f404071L16;FFf7eb10a9e8bf00f9e77b04a9f11", + "300f9f56300f9ef3b00f9f04300f9e61f00f9ea0700f9e5d300f9f3d2ff97e99759a9ea0740f9fb0f5ca9f04340f9ef3b40f9BBBL8;FFe88300a9087340f922008052f4030baae00308aaa86c0194e88340a9eb0314aa0a000014f9031faaf6031faafa031faaeb031faafb031faaf5031faa08018052L8;", + "FF01c1823c00c1813c02c1843c03c1833ce80b40b9400504ad418147ade8a700b9e81340b9430905ade4838a3c8001803de8d302b9214b803dfafdff17080100b0BL8;FFe08b08ade02400b4e19740f93f0800b1800100543f0400b140010054810000b4e09b40f922008052a3ec0094e1a340f9810000b4", + "e0a740f9220080529eec0094L8;FF630001cb8100018b610e00a9e07a80b9e10313aae20318aa480880d2010000d408f6ff97e10300aadf0200ebc0fbff54d60200cbe0fcffb7630640f91f0003ebBBL8;FF0229019420ffffb000003391ff28019420ffffb000003091fc28019420ffffb000602691f928", + "0194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9L8;FFc10640f9810000b4c20a40f9e00317aaa92c00945f0b00b101090054e0074091e10314aa022b805200001891ffe71639a82c0094f5030291e1074091a0a20291L16;FFe00319aa0110805222008052aaac00947c008052e087c03d8", + "8f242f8290080927c220039e07f803d88f200f8e07fc03d690200f96092803c680e00f9b80000b4BBBBBBL8;FB2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f656e636f64L8;FFbc831ff8dc9c0094e", + "003172a68034039e103142a1f050071c0fcff54fe060094f703002a08ffdf88c802003568034039a0024079e103132a1f050071e1f9ff54BL8;FFe1ffff17e1031faa886200b9deffff17811c0054e0031faa2cffff1720ebff54c80080d20800f0f20809009137000014e1010054e0031faa1affff17c80", + "080d2L8;FFfdc300910920403909080037010040f9f30300aa22fdfff042a03391e0030091e3018052f40308aadc110094e80340f9f52b41a9f62741291f0900b181010054BBL8;FFe0e315910b120094e87b45b9e8110037e8c742f96a0740f9490108eb031800546a0340f9e0c342f94801088b682700a", + "908fc60d3a80600b5020840925f1800f1L8;FF0a2c0633eb0000350b7c0c530a050039090900396a091b320a010039d6ffff170b7c1253ec0f80120a0900390c440c33090d00396a6d1c320a0100390c050039L16;FFffc30191c0035fd637008052a80640f91f0116ebc9080054e00313aa62edff9760fe", + "073728fc60d3880800b5200840921f1800f1c2080054217c0353e1080034BBBL8;FB30f845000000000010000000000000000800000000000000141d46000000000030f845000000000018000000000000000800000000000000c01f460000000000L8;FF23008052240080525ca4ff97f81740f9e80f40f", + "9080118cbdf0208eb697aff54e0630091e10318aae20316aa230080522400805251a4ff97f81740f9cbfbff17BL8;FF0080009104fd0094e00314aad7feff97895a40a9ca02178b280117eb6a0200f9e2eeff54cdffff17c0feffd000603f91f9fc0094c0feffd000603f91f3fc0094L8;FF1c0b00f90900", + "0014f60315aa08008092080300f9b60000b4e00314aae10316aa22008052a4000094e003132a941300940300001408008092080300f9ff0b4091BBL8;FF490108eb034900548a0340f9b8835cf84801088b880300f9490300f908ff60d3880d00b5000b40921f1800f1820d0054017f0353a10d00343f100", + "0712c020054L8;FFe00315aaac4000949f0b00b101050054e00313aa088c4ff8093006910a9c41b92001c03d168841b91f0500b1ea8303b90003803d40000054e9faff9775de4ea9L16;FF0020239101bd009440fefff000202091febc0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd", + "030091ff0324d1ff0300f9f30308aa090040f9BBBBL8;FBd6ff9008f73a20674d27b73876f7a0175c2933c525a346ffa9fc7e6b060700009bf974a41c7a8bf16c5e0bdbc2f8c63bbd36dd94c5363bc85f019c3ad6ffb68aL8;FFc0035fd60a20009109400091e8230091200440a9a9031ff8e9ffffd029a1", + "1a91eaa300a9a84300d1e91700f9c2fdfff042882191e9a301a9e3430091df8c0094BL8;FFf5a705f91f010071f3ab05f92801881ae99f40b91f01096b41050054e39348a9e0c31291e2db42f9e5f35639e1032d9126008052cae5ff97e85b42f91f0900b1L8;FF5f0d1872410100540b1540386bc100517", + "f250071c80000544a1d0012290500d158012b0b0a7f08534afe073608008092680200f9f44f45a9f65744a9f85f43a9BBL8;FF890100b4e82b40f92ac100913f0108ebe8af43a9ea038a9aea2700f908059f9a7401899af99b41f9a800003779000014e8d343a9f99b41f9c80e0036e0830791L8;FF09010", + "0b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab220a0054090140b22911c0da291540d2290d098b2925019129fd46d3L16;FFe80304f9e89b40f9ec1b04f9e80704f9e81740f9eb1f04f9e82304f9e82740f9f22704f9e82b04f9e80b40f9e35b04f9e82f04f9e83b40f", + "9e83304f9e84340f9BBBL8;FF63840791c9000014c90080d248008052e24300390900f0f2e8470039e90700f9ba000014e80741b249000014932e40f9892640f9e80314aa7f0209eb802a0054L8;FF6082803c6182813c6282823cb90000b4e0031aaae10319aa22008052a6700094e12740f9810000b4e0", + "0315aa22008052a1700094e12340f9810000b4e01f40f9BL8;FFf65744a9fd7b43a9ff830191c0035fd6ff8301d1fd7b03a9f65704a9f44f05a9fdc30091081c00121f09007181010054e00302aaf30302aaf40301aa5afdff97L8;FFdf1e00b9010c40b942cc749242187bb2150080d2330400111700805", + "2130c00b9df1a00b9c21200f9c5ffff1700231f9128030094e4ffff1741400d9142c00d91BBL8;FF080d088b0825019109fd46d30800098b080500911f0109eb281700544c000014fa031faaf9ab49f9f8074091188309913f0700b10018005400c30391c2170094L8;FF4b4d40780c7d40394a09403900f", + "1c03c087140f82d0080526b5f02796ac304396aab0491490100b9e9030291e82302f928210f91ede310390001803dec631139L16;FFf30300aae9a301a9a82300d109018052e28f03a9e0030091e163009162008052e8a702a948170094610a42a9e80314aaf39340a9e0031f2a2500805206048052BBBBB", + "L8;FB61626c6520636f64653a2073686f756c64206e6f74206265207573696e6720446f75626c65205261746368657420666f7220746865736500bb12400000000000L8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab22030054091440f9090100b42a0140b24a11c0", + "da4a1540d24a0d0a8b4a250191BL8;FFae0140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191ad194e8bbf010cebe30100546b0500f1ec030daa81feff54a90109abe2000054200108ab62010054L8;FFe0230891e8830a3928008052e143139142008052e86f02f9e97302f9ea7702f9550c0094e00", + "7409100401d9180f2ff971400001408018052f6af4bf9f7b34bf9BBL8;FFe10300912200805208050091e83300f9e8540194ffff0039e80319aa02fd46d31ae17a9219154092e20000b4e83340f980030191e10318aa0801028be83300f9L8;FFff5306f9e85b06f9ff5f06f9ea6706f9e87306f9e97706f", + "904550094e1fb44f9810000b4e0ff44f922008052a2580094a458009420028052210080529d580094L16;FFe86301f91d000014a003123848008052a0a303d1a8131238b58311f8dfdeff97e10300aa54ffff17e0230b39e0030b91ff270b39f56301f9d8deff97e80300aaBBBL8;FFea0640f9490108ebe", + "3410054ea0240f9e00b40f94801088be82600a908fc60d3882700b5080840921f1900f1a2270054017c0353c12700343f0800716c010054L8;FF810000b4e00740f922008052aa780094a80600d11f0900b1e823931aa8000036e0031baae10315aa22008052a2780094e13349f9f3074091738209913f04", + "00f1BL8;FFadf80094683240f9a80000b4603640f901f97fd342008052a7f80094683e40f9a80000b4604240f901f97fd342008052a1f80094684a40f9a80000b4604e40f9L8;FFfa031f2a483f00121f21376b02010054281340f9c1520012e00315aa5a07001100013fd600ff073612000014280f40f9e", + "00315aae10313aae20314aa00013fd6BBL8;FF21008052ae380194e07c01b4f40300aae0fbc63de1ffc63de8074091e2074091e00315aa0881099142c03591e1031baae30318aa04048152e50314aa06048052L8;FF802700b5a02302d157f4ff97e80301aa80000036e82700b5e1031faae1ffff17e1031", + "faae8730ab9deffff17e17b0ab938ffff17a88357f8080540f9160101ebL16;FFe0a3803de6030991683e00a9e00759ade86b40f969ba03a969ff60d3602e00f960c20891685201a968a20291000506ade20357ad69520678e9bb41f96d6602a9BBBBL8;FB616c726561647920636f6d7075746564206c61", + "7a696c79007a134000000000005700000000000000c90300001600000042024000000000006a00000000000000L8;FF440080525dacff97a84f7ca9e80b00f980ffff17e82740f9a9e301d1ea1740f92001c03da98359f81f0500f14001803d490900f98b010054e02b40f901f97fd3BL8;FFe8e20b9120c", + "3c13ce98745b9e86f04a921c3c23c1f0b0071f59b45b9e8bf45b9e1c20891eac742f9fbcb42f9208717ade89308b9e11f00f9a1170054e20f4ba9L8;FF014d0054880640f91f1100f1000400541f1900f1614c0054880240f96aad8c522aefac72090140b9080940793f010a6ba9cc8d520001497a414b00", + "54810a41a9BBL8;FF5f1800f122050054017c035341050034e0430591a32300d1840c8052f2d6ff9760fbffb42a000014a02300d1f9560094e80300aae00301aae8fd073624000014L8;FFe00313aa3b030094b50600f173a2019181ffff54e81f40f9c80000b4090d8052e00314aa02018052017d099ba2", + "480094e17740f9210100b4e07b40f922008052L16;FFe80319aaea270ea9ea6341a9f9fb42a9e61f40f9ebb344a9f57b40f9e0bf46a9ed0740f9e56f40f9e45f40f9f03340f9eef347a9fadb4aa9e9474ca9f44b40f9BBBL8;FF3f0500b120060054092d40f93f8100f121070054092940f92d0080520861", + "40b92a0940792b1940392c7140f8682600b9ea0300792a7141f8eb0b00392b7d4039L8;FFf40300aaf6031faae00316aae10314aae5640094a00100b4f50300aaa9680094e00315aa21008052f40315aa36008052a0680094a0feffb4080740f9f50300aaBL8;FFe00313aa68f5ff9740010036a10c00b50", + "1f9ffb4bcffff17e20313aa430c80520befff97e10300aa40f8ffb4b6ffff17a80640f91a0101eb02010054a2000014L8;ZDBBL8;FF010600b599feff17e8b740b92043c23cc0e200912183c33c2207c03deab341b91f010071f8c741b9801f803de9079f1a818308ad0801094be99741b962c3883cL8;FF", + "5ac300f139c30091a003005428035ff81f0113eb61ffff5420835ef8e10315aae20313aaa7290094c0feff35f60319aac18e5ff8810000b4200340f922008052L16;FFfd830191094c40b9f90300aaf80308aa3f090071a20700542a2f40a9e92f00b9295741a9aa031ff82a1b40f928e179d3ea0f00f92a", + "1f40f9081109cbea1300f9BBBBBBBL8;FB6c656173652f6275696c642f6c69627369676e616c2d70726f746f636f6c2d613434636635613164633062366666632f6f75742f7369676e616c2e70726f746fL8;FF020340ada2820cadb60000b4e00317aae10316aa22008052a7a2009460220091ff030e91f", + "44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8d7a9ff1725feff90BL8;FF00202491041f019400fffff000802491011f019400fffff000e02491fe1e019400fffff000402591fb1e019400fffff000a02591f81e019400fffff000002691L8;FF0f000014e80f41b2a8031df8a0c300d1e228ff97a0031d", + "f841fdff902120329143fdff90630c3391a0c300d162038052240180526828ff97a1035df8e80341a9BBL8;FFe80740f9eb2745a940818a3c000940ad41818b3c683940f954650f29f40340f940818c3c600542ad42818d3c6219c03d483900f9280940f9400502ad600540adL8;FFe10315aae20314aa00", + "01168bb1620094c802148b680a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6e8031faab60a40f976f4ffb5b41640f9e803088bBL8;FFa1feff9021501691a3feff9063941691e003009122028052a401805209000014e00300f9a1feff9021501691a3feff9063b00e91e0030091220280524400", + "8052L8;ZDBBBL8;FB657953656e6465724b6579506c61696e746578740000000007000000000000000600000000000000000000000000000000000000000000000000000000000000L8;FF0825019109fd46d30800098b080500911f0109eb2815005423000014f7031faaf50314aab38e4df87f0600b180", + "200054e00315aa2af2ff97080040b20811c0daBL8;FFe0179f1ac4170194881a4039691a4039b502000a1f01096be0179f1abe170194881e4039691e4039aa02000ad6020a0a1f01096be0179f1ab717019488224039L8;ZFBBL8;FF42ffffb042d01091ea0f00f9e3430091ea3e0194fd7b43a9ff030191", + "c0035fd6082000910980009142ffffb042f80491e82700a9e80300910900009029d13991L8;FF00ffff17c80080d2e10b00f90800f0f2080900d10f000014c80080d2a1831df80800f0f2080900d11a000014e80b41b2e00b00f907000014e80b41b2a0831df8L16;FFa80100f0081140f9eabf40f9e5b34", + "0f91f0900f1e5b300f9eabf00f9a92b00548801009008411f9129038052e8ef01f968feff9008e11e91e8a303f940feff90BBBBL8;FB4900000000000000e7000000090000005369676e616c205051205261746368657420563120436861696e204e657874003d044000000000004900000000000000L8;F", + "F081848abe2090054180118ab020a0054390700f194c2019161feff54080317ab22070054c902158b080109ab62090054691640f9090100b42a0140b24a11c0daBL8;FFe85701b9b312019448008052e9f31691ea7340f9e8f31639e8c31691eb7b40f9e9e302f9e99f40f9e8eb02f908018052e8f302f94", + "8c141393f0500b1f3db02f9L8;FFe8031faa0900f0f22c017fb217fd60d3291d0012e1ab40f9fa9740f90a01092ae8c700f9f5000014e8c740f91a7d0853ef031a2ae13355a9ee031baafa9740f9BBL8;FFe80b40f9490380522a040091e00314aaea0f00f909692138e123009193d8ff97f60f40f9e8074", + "0f9080116cb9f0208ebc8070054e80b40f9e10315aae20314aaL8;FF400745addf0a00b14233c03de85345f9800705ad400743ad8233803de8bb02f9800703ad420344ad820304ad410341ad810301ad420342ad820302ad410340adL16;FFe05b00f900d140f9e00700f900d95aa9e03f00f900dd40f9e0", + "3300f900e140f9e0f700f900e540f9e02f00f900e940f9a07a00543f050071a120015489008052BBBL8;FF1dfeff97610a40f95afeff17e00313aae10317aae20315aa230080522400805215feff97770a40f9680240f9080117cbbf0208eb89cbff54e00313aae10317aaL8;FF54faff17e043169122008", + "0529b110094e1d342f93efcff17e04316912200805296110094e1d342f955fcff17e04316912200805291110094e1d342f960fcff17BL8;FF1f0002f1230f00543f0108eb13601932200100542a0440f91f1040f15369283808050091280800f94202005400fc47d36e000014e10300a9e00301aae10308a", + "aL8;FF1f8d017108050011290d80122821881a68c00d390c000014004300911f0001eb880000545c0080d2f4031c2ae0ffff17e00318aa860080d2e3ffff1727008052BBL8;FF01f17dd31afdff17e19349f9f3074091738209913f0800b1800100543f0400b140010054810000b4e09749f922008052a13", + "20194e19f49f9810000b4e0a349f9L8;FF22008052ac320094f8ffff17e87340f9680300b40805088be00313aa0201805201f17dd3a4320094ffc32091f44f42a9fc5741a9fd7bc3a8c0035fd6f46b41f9L16;FFe2db803de0071aad01804cade0030091e10319adafb20094e84306916182079102328052", + "00810791aab2009488c20d91e0030091fb220094e0430691e1030091BBBBBL8;FB6d697373696e6720696e2070726f746f627566484d41432063616e2074616b652061206b6579206f6620616e792073697a650000000000008509400000000000L8;FFf40315aa82fe46d3bcc303d1e20000b4a80357f88", + "0030191e10319aa0801028ba80317f8e396009488e27a9282164092a0c303d12103088ba2f31438a59a0094BL8;FFb7831ff8190400b4541340f9ad1a0194e00319aa21008052a61a0194a00900b4e10314aae20319aaf50300aaa91a0194572340f9b6831ef8b8431fb8f70200b4L8;FF22008052fa030c", + "aaab1a0094ec031aaaff0600b1f8e300f9200e0054e8431391e0031baae10316aa4dacfe97ec6b42f9e96f42f9e87342f9f67742f9eb7b42f9BBL8;FFe92e00d188df78925d00001408a341b8ab2b7da9a9635c78ac835cf8a88315b8a8035e78aa831af8aa135c38a9c3157869038052a8031b7888ffff9", + "008e10591L8;FFe80000b0081140f91f0500f169050054e8c32c9169fdffd029a93791e85b04f9a80000d008a11f91e85f04f9e8c31691a04700d1e86304f9080000f008c10b91L16;FF6823099be1031faa000d803de0c3c03d0011803de0c7c03d0015803de0cbc03d0019803de0b3c03d0001803de0b7", + "c03d0005803de0bbc03d0009803d68070091BBBL8;FF02770194c0ffff9000e02591ff760194ff4301d1fd7b03a9f44f04a9fdc300911f1c007280010054c80080d2e0230039ff2700390800f0f2e0030091e80300f9L8;FFe86f09f9e2c7843de1bf843de0bb843df41300f980020054e83b49f9080100b", + "4090140b22911c0da291540d2290d098b292501910819498b08050091e98792b9BL8;FF3fb400f1a1060054690240393fd5017141060054690640393fc90171e1050054690a40393fb9017181050054690e40393fe9007121050054691240393fd50171L8;FF10c471d3ad0501539f010b6a2b017bb26911", + "899a0bfc5bd30ce873d3df010d6aee8510aa0dc070d36b0179920ffc4ed30c020c0a10b46dd3cb010baa2e017cb2BBL8;FFa2000054fd7bc1a8c0035fd6e00308aba3ffff5440ffff9000a03a91fb360194e00301aa41ffff9021803991a2018052d836011408a440a9e20301aae00308aaL8;FFe8a30bb9", + "e9a340a9f6c705f9f6cf05f9e8d705f9e82b40b9e9e305f9e95f40b9e8b30bb9e81f40f9e9df0bb9e93340b9e8df05f9e8e705f9e82740b9e9e30bb9L16;FFe8cb02f9a21c0094eeb343f9df0500b1e00b0054eb831d91e9e343f98aa201916011c53cf7430d916281ce3ce9f200f8e91f5e396481cb3ce0", + "d7803d410146adBBBBL8;FB1d0000001700000011104000000000004f00000000000000d0000000400000001d1c400000000000540000000000000059000000050000001d1c400000000000L8;FFe00315aa41008052aa8a0094e01700f9e01300b4ab8a0094e00315aa41008052a48a0094e01300f92013", + "00b4a58a0094e00315aa410080529e8a0094e00f00f9BL8;FFe063813de167813de8a305b93a000014480200b0081140f91f0500f1a9040054e8830291e0032d91e10313aa0204805214210191f3032d9176eeff97e8ffffd0L8;FF400100b4155000a901fdfff021800e91131000b91f500039f44f42a9f", + "50b40f9fd7bc3a8c0035fd60001805201038052dc060094fd7bbda9f65701a9f44f02a9BBL8;FF01018052ab4a0194601900b4080d8052fb0300aaf4031faa567f089bf7031aaae10318aadf0214eb80020054a0e301d1f70600d138a001917c03148bd6000094L8;FF4a1540d24a0d0a8b4a25019129194", + "a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091L16;FFea0315aaf2d751a9ef0314aae5d340f9f70740f9e70316aaee3740f9ed6340f9f4031baafecb40f9e44f40f9f19740f9f6bf40f9ec8740f9fbab40f9fab340f9BBBL8;F", + "Fc80200b94301001408358c52f50302aa3f01086b29050054080300b0081140f91f0d00f1a3040054e80302914900009029611091e8270aa9e8630291c90200d0L8;FF60a640f901f97fd342008052aa6a009468ae40f9a80000b460b240f901f97fd342008052a46a009468ba40f9e80000b460be40f901", + "f97fd342008052f30b40f9BL8;FFc80080d2e0230039e00300910800f0f2ff270039e80300f9e0f0ff97e80300aae80300f9a1feffd021dc1191a3feffd063141291e0030091c201805264008052L8;FFe90300aa1fbd01383fcd0138e80300aae90300aa1fdd01383fed01381ffc0138c0035fd6c1ffff1", + "71f000039e80300aae90300aa1f1d00383f2d0038e80300aaBBL8;FF1f05007161050054e8a759a9e80302f9e8031091e90702f9a80318f8880200b0081140f91f0900f103040054a80302d12900009029613f91e8a703a948008052L8;FF1535889a680240f9080114cbbf0208ebe8000054680640f93f0", + "002710801148ba20100540101003926000014e00313aaf603012ae10314aae20315aabfe8ff97L16;FFe80b40f980564079a9060091e123009116693538e90f00f940d2ff97e10f40f9e80740f9080101cb1f7d00f1c9020054e80b40f980a2c03c81a2c13c0801018bBBBBBBL8;FB616d706c6564202d3e", + "20456b526563656976656443743153616d706c65640076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372L8;FF01018052ab9e0094c01300b4f50300aaac9e00940030805201018052a59e0094001300b4f63300b908028052f60313aae85700a9ff2301a9c88640b8e07f0", + "2a9BL8;FF1f0101ebc0030054690640f92a0400910b0480521f010aeb6a0a00f92b692138a00300542800805228692a3848050091680a00f9f44f42a9f50b40f9fd7bc3a8L8;FF22008052ac1e0094e10340ade81340f9960200f9880e00f9280080528082803c810a803d68520039f44f4ba9f6574aa9fd", + "7b49a9ff030391c0035fd620fdfff0BBL8;FF010140f9290400d13f0d00b188000054000540f922008052a75e0194e18340f93f0400f18b000054e08740f922008052a15e0194e19b40f914008092f48300f9L8;FFfc7b06f900838b3ce0e3c23de85306f9e95706f9e85b06f9e92346a901838c3ce1e7c2", + "3d00838d3ce0d3c23de85f06f9e86706f9e82f40f9e96306f9e92740f9L16;FF610a40f9680240f91f0101eb40030054680640f9090180522a0400916a0a00f909692138e10313aaf0ebff97818a40a940008052e30313aa38eaff97810a42a9BBBL8;ZBL8;FFf71b00f93f0d00b1e083833ce82700f9410", + "1005428008052ff0600f17f7e01a97f2200a9687e02a908008092681a00f98a15005449040014e807409180020291BL8;FFadfe0014280000cb010102ab62010054a101f8b722008052f44f42a9fd7b41a9ffc30091a4fe0014f44f42a9fd7b41a9ffc30091c0035fd6c0fefff000e00491L8;ZFBBL8;FFe", + "93b40f96182863ce10347ad681e0339c87e045369f20bf8e91f40b96282853c6082843c6182833c600608a97c6609a96a261d2968c20339da0500b531000014L8;FF9f0700b1fb6300f9e0380054e26b40f9e35740f9e8432a91e00317aae10316aa9500ff97e84b45f9f64f45f9e95345f9f55745f9fa5b", + "45f91f0900b101400054L16;FFe20316aae06700f9b2be009470080014e9031faa08008092690600f9683601a90cfeff17f5031faadf0600b160000054e00317aa69c7ff9708008092750600f9BBBBL8;FBd62975437d51d893762144d4a28c04fcfbac0000354c97021be16a616a70eec33090a9c57de84", + "c2d12022f005e16bc2dfeb0758af76124dfd9c80e34e2c4c47bL8;FF1f0309eba86f0054130540f9580100b4ac8e0094e00318aa41008052a58e0094fa0300aaf91700f9a06e00b4b90000b50c000014ff1700f95a008052390100b4BL8;FFffa73239e85306f9e4140094e10300aae15306f9e0833291e1", + "feff9021203f9102028052e3feff9063e03c9104028052c9000014c80080d2e0a33239e0833291L8;FFb00f0094c0feff35f40240f9d40400b4f6825ff8ab0e0094e00314aa21008052a40e0094a00b00b4e10316aae20314aaf50300aaa70e00941c000014a21240f9BBL8;FF98e6ff97ff830a91f44f45", + "a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd62000805201048052de4a0194ff4301d1fd7b04a9fd0301915f2c00f1L8;FFf7feff97e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb89190054088c45f81f0500b1c0140054L", + "16;FFe66b42f9fe6f42f9ec7342f9e9231fa9e81342f9e90f42f9fb7742f9f47b42f9e37f42f9e8cf00f9e82342f9e78742f9ee8b42f9e28f42f9e4a342f9e89700f9BBBL8;FF090d00396a6d1c320a0100390c050039cdffff17f703002ae0230091e10314aae20315aa230080522400805212faff97e00", + "3172ae80b40f9ff0202710801148bL8;FFec030b918033803da10900548031c03de8c302b98b4100f8204b803d8ac100f8204bc03de8d342b9c9fdffd029e13f918101c03de01b40f92043813ce1031091BL8;FFe91300f9e5f4ff9723000014c90080d2e0a30039480080520900f0f2e0830091e8a70039", + "e91300f9dcf4ff9709000014e10740f9e10000b4e80b40f9f30300aaL8;FF74d86678833e7cd305400091941c4092681000d15f7c0271497c0553421c45d39416039b8502088b090100543f150071e1f8ff54a2c05fb85f1000f189f8ff54BBL8;FF09692138e1431691ead302f90e0c0094fad342f9e8cb", + "42f908011acb1f0308ebe8340054e8cf42f9e10319aae20318aa00011a8ba72e0194f90b40f94803188bL8;FFe8933f39e8a74929fcf73f39f8fb3f39e9973f39e89b3f39e8a74829e99f3f39e8a33f39e8a74729e9a73f39e8ab3f39e8a74629e9af3f39e8b33f39e8a74529L16;FF21040054e10313aa3", + "40c43f89f0600b160070054753240f9f60300aae003009156daff97688242f86082c13ce203c03d6102c03dd53200f9e82f00f9680a40f9BBBBBL8;FB6420616e206572726f7220756e65787065637465646c7900c50f4000000000004b000000000000007f0b00000e00000042024000000000006a00000", + "000000000L8;FFa0073cade10f46adb7f35838e02fc03da2039a3cb5031bf80001178b08108052e21640d2a0873aadf81640d2a303973c081400380b9700941f1f00f1a8010054BL8;FF02130194e8031faa080113abc2010054090140b22911c0da291540d2290d098b2925019129fd46d30801098b0005", + "00911f0009eb28dfff5400ffff9000801091L8;FFa04700d147c4ff97e09300b9a04700d144c4ff97e08f00b9a04700d141c4ff97e08b00b9a04700d13ec4ff97e08700b9a04700d13bc4ff97e08300b9a04700d1BBL8;FF08008092e83700f9e00314aa84520094fc0300aaf50301aa93fcffb53a008052", + "f90b00f99bfdffb50900809228008052e083c63ce0030291e85f1c29e85b1d29L8;FF63c03391a4fdff9084e01e91e2032d91c1058052e8a305f9e9a705f9ea520094e85746f9e95b46f9a0fdff9000201e91a3fdff9063c03391a4fdff9084602291L16;FFe0431e91e2e3c23de3e7c23de1030b91e9d34", + "5f9eab745f9e2031faae303152aa0039d3cf5431e91e10b17ade3c3803de98b01f98083803cea6f01f9e86301f9BBBL8;FF21780391a3fffff063500291a0c300d142018052840080526f7c0094b7035df86bffff17880080d20800f0f20811009154ffff17880080d20800f0f208110091L8;FF00bdff54", + "81420491f0010014e1d342f9e8cb42f91f0101eb807d0054e8cf42f949048052f4074091948209910969213828040091f67749f9e8d302f9df0600b1BL8;FF60620191f30b40f9fd7bc2a879fdff1761ce40f9810000b460d240f922008052a5f6009461da40f9810000b460de40f922008052a0f6009460", + "420091f30b40f9L8;FF637c4093000780d298090094037c4093e000f837d3009836280380d2e00303aa410080d2220080d2010000d4e00303aa04000094f30b40f9fd7bc5a8c0035fd6BBL8;FFc10600d1e04316910881099145910094e86352b9f86b52b908070036e93b49f9ea3f49f9e86f52b9f5cb42", + "f9692a01a9e9d742f97822012908008092680200f9L8;FF280080d2e97705f9c9048052683bc0f2ff4b05f9e95305f9ff5705f9e96b05f9e86f05f901330094e9c30d91f6ef41f9e8e741f920854fad2285c03ddf0208ebL16;FFe24f44f9eb5344f9f65744f9f85b44f9ea6344f9e9030daafa6b44f9ec6", + "f44f9ed7744f9e17344f9f14340f9f22b40f9e10b19aded7300f9ed6f40f9e0c7803dBBBBL8;FBbb12400000000000380000000000000050010000090000006d697373696e672072656d6f7465206964656e74697479206b65790000000000a110400000000000L8;FF8a2e49299682003980a20191e1030", + "0910809c05a2909c05a9f9202f8882600294809c05a6b09c05a892a4a29882e0129220080529f1202f82809c05a4a09c05aBL8;FFad060194f8ffff17e88b40f908d7ffb40805088be00313aa0201805201f17dd3a5060194b2feff17f63f42f92083c13ceae32291e9d742f9f5c742f9f7cb42f9L8;FF2e", + "000014a0a300d1e10319aae20315aa230080522400805242e3ff97b6677ea9b7835df8e6ffff17f95f03a9d9a20091fb5b02a937835ef8d70df8b7f70200b4BBL8;FF43fffff063ac0191a0e300d1a2018052240180521d000014a0831cf841fffff021e0009143fffff063140191a0e300d1a2018052640", + "1805214000014a0831cf8L8;FFe002803d0080c13ce006803d56470094810700d15f0700b1e12700f9800b0054e00641ade0430691facb00f90083823ce20242ad0183833c0083853ce10240adL16;FFe63b44f9fe3f44f9e44344f9f94744f9e9cf00f9e9cf43f9e34b44f9ec4f44f9f15344f9f75744f9", + "e9c300f9e9d343f9fb5b44f9f66344f9ef6744f9ed6b44f9BBBL8;FF187d01a91f2504a9172505a91a6100b9792e00f9cb13005408030090f8e30091081140f91f0d00f1030d0054684a40f91f0500b160020054608649a9e8e30091L8;FF22008052f4030caa9c050094e10340a9ec0314aa2ba040a9290", + "040f90afc78d37369283808050091280800f98af3ffb4e8ffff17e10300a9e00301aae10309aaBL8;FFe0030091620180524400805272ecff97e00340f954ffff17c80080d20800f0f20809009146ffff17c90080d2e8230039480080520900f0f2e8270039e90300f9L8;ZDBBL8;FFe10000b4601240f92", + "2008052f44f42a9f65741a9fd7bc3a8a7260114f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f30b00f9fd030091080040f9f30300aaL8;FFf65741a9fd7bc3a8c0035fd6fd7bbea9f44f01a9fd030091f40300aa68018052f30300aa818e41f8290041d23f0000f12841889a1f2d00f1a20100546802", + "40f9L16;FF692a492988ee02a9280080528082813c950a00f9991e00f9882608298a6a0929f44f51a9f65750a9f85f4fa9fa674ea9fc6f4da9fd7b4ca9ff830491c0035fd6BBBBBBBBL8;FBc000204e6f2076616c69642073657373696f6e20666f7220726563697069656e743a20c0392c20286e6f20637", + "57272656e742073657373696f6e207374617465L8;FF28048052f50b00f9f50317aa0a0fc0daa9a33ba9a86300d109018052fb5f44a9a8a73ca908088052a08301d1a12301d162008052b9831df8a82b3ea9420a0094BL8;FF68080054340117ab420e0054f42300f9090740f9280117eb03080054090340", + "f9d60217cbdf0208eb3501178bd732889a152300a9f7fbffb5f62b40f9f51f40f9L8;FF08050091290040f9280800f9aaf6ffb43f0108eb93611932600300542b0440f900fc78d37369283808050091280800f9c00400b5e0030aaac6ffff17e10300a9BBL8;FFe1031baae85f0194e80316aaf60301aaf4", + "1f00f9e80700f928008052fad70429db0300b4e82b40f9f403192af903172af80f00f9f8031caafc0316aa171540f9L8;FFe9f8ff54e00313aae10316aae20314aa9a020094760a40f9c1ffff17fd7bbda9f50b00f9f44f02a9fd03009148008052f40301aae10302aa000d002af30302aaBL8;FFa80640f", + "91a0101ebe200005489000014e20313aa230c80520deaff97e10300aa210900b5a80640f91f011aeba9040054e00313aa5cf0ff976008003728fc60d3L8;ZDBBBL8;FB5f726567697374726174696f6e5f69646c6f63616c5f726567697374726174696f6e5f6964616c6963655f626173655f6b65797065", + "6e64696e675f6b79626572L8;FF0811c0da081540d2080d088b0825019108fd46d30900088b37050091ff0208ebc81d005420010014e11740f9e80f40f91f0101eba06c0054f50314aae81340f9BL8;FF680200f909190194fd7b48a9f34b40f9ff830291c0035fd62000805201048052e0ff0094fd7bbea", + "9f44f01a9fd030091f40300aaf30308aaa203019400048052L8;ZFBBL8;FF4ae13e91e8a700a942ffffb042ec1f91ea0f00f9e3430091e83f0194fd7b43a9ff030191c0035fd6202040a941ffffd021000f91030d40f902048052fd7b43a9L8;FFe80700f907000014c90080d248008052e04300390900f0", + "f2e8470039e90700f9e0230091dd49ff97f44f4ea9f95b40f9f6574da9f85f4ca9fd7b4aa9ffc30391L16;FF0a2d52a9ea0b00f90a2553a9ea4300f9e92300f90a2554a9eaaf06a9e91f00f90a2555a9ea1b00f9e97b00f90a2556a9e9d300f90b2557a9ea2f0ca9e9ef00f9BBBBL8;FB000000000000000", + "0000000000000000001000000000000005043440000000000d30940000000000055000000000000002901000019000000737071723a3a7631L8;FF090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb89190054088c45f81f0500b1c01400542a030094080040b208", + "11c0daBL8;FF19100114fd7bbfa9fd030091083040f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091091840f93f0500b1400400540a2040f9L8;FFe8db51f91f0900b1e14d0054e0431391b0edff97b80000b4e0c740f9e10318aa22008052a4130094e0e30e9121edff9", + "7e0030e91bfedff97e8cb41b9f31b40f9BBL8;FFf40308aa864f0094f50301aaa100f8b6f8031faae00318aae10315aae24f0194350300b4f90300aaa6530194e00315aa21008052380080529e530194c0feffb4L8;FFf8ffff17e88b40f908d7ffb40805088be00313aa0201805201f17dd3a6530094b2f", + "eff17f63f42f92083c13ceae32291e9d742f9f5c742f9f7cb42f9c80240f9L16;FF880900d19f0500f10881899a89feff9029690a918a0000102b7968784a090b8b40011fd62b0042a9291c40f9080340f92ab840a9e9ff00f9ebe700f91f0109ebBBBL8;FF978640f9d7fbffb5e9031faa962281b996fcf", + "f35ea031faa958e40f955fdffb52801088b49011f8be10313aa0001098b8ef9ff97b8010034610a40f9680240f9L8;FFe00318aa09692138e1431691ead302f9450c0094fad342f9e8cb42f908011acb1f0308eb48360054e8cf42f9e10319aae20318aa00011a8ba67300944803188bBL8;FFa9ab3ba94c", + "f7ff97a8035ef8b7031ff8140117eba3080054b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcb9f0208ebL8;FF000700d1bf0200eae0179f1a40fcff3580020e91a2064091011440f9022400f9022040f9210400d1011400f9c2fcffb4550400f981020e91a30c8", + "05282c241f9BBL8;FFe07b49f9e10313aa22008052aa330194e18349f9810000b4e08749f922008052a5330194e80740910881099100c10391010c00940ffeff17880241d2e9008052L8;FFfa5b00b9103000941f04003180080054b50358f87a0080520800001400010039d502158be0030191b50318f80", + "63000941f040031400700541f00027162000054L16;FF97e25fa9806ec03d0101c03d950641f988e240f989d640f99c0a41f96083813ce12b803de86700f9e95b00f93502f8b6f9031faae00319aae10315aadaaf0094BBBBBL8;FB6420746f206120566563000000000000770d4000000000002e0000000", + "00000006f0100000e000000390740000000000033000000000000002203000020000000L8;FFe08b07ad42030054e90340f928fc83523f0108eba228005400e4006fe8430391e00301ade00302ade00bc03de10fc03de213c03de317c03de343803de23f803dBL8;FFe063009102048052f30303aa81e200", + "9180ffff97886a40b9d40a40f9e00313aaa81b00b9e8430191c3b5ff97e82b40f91f0500b1c0000054e017c03de83340f9L8;FFe08308912faffe97e16b02f9e343139122028052e06f02f9e00313aae17302f921fdffd021003591d8f2ff97a51b009480008052210080529e1b0094c05001b4BBL8;FF20", + "008052e10313aaf30b40f9fd7bc2a8c0035fd620008052e10313aae2570194ffc307d1fd7b19a9fc6f1aa9fa671ba9f85f1ca9f6571da9f44f1ea9fd430691L8;FFe85306f9e561ff97e10300aae15306f9e083329161fdfff021203f910202805263fdfff063e03c9104028052c9000014c80080d2e0a33", + "239e08332910800f0f2L16;FFf48300a9b3db0094f40f00f91800001448008092680200f9ff830f91f44f42a9fc5741a9fd7bc3a8c0035fd6140700b4f50303aaa3db0094e00314aa21008052BBBL8;FF080200b4f30301aa810240f920008039c001f8b729040091080500d1892200a925000014c90080d", + "248008052e04300390900f0f2e8470039e90700f924000014L8;FFe06b813de167813df7d2ff97e83349f94083c03ce93f49f91f0500b1e01b843de93b08f9e0110054e0abc43de1a7c43deac33391e2a3c43de95b49f94081883cBL8;FF0a819f1a8d0d00122e20403929010b0b4a114c0bbf25007129c1", + "00110b819f1adf7d02710934003949c100110a819f1a0938003969010d0b4a114e0b29c10011L8;FFe91b00b9ea3b0079002140a9eb3f0079f3eb00a900013fd600f70736290000148a120a8b4a11407948fe2f37f3ffff17e00313aae10317aae20316aa53feff97BBL8;FFf32b40f9ff830191c0035fd6", + "fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091f30302aaf40300aa020500b46806138bf60301aa15f17dd3L8;FFe95703f9c904805222008052e8f301f9e8fb01f968fdffd008011b91f63309b9e9f701f9e9ff01f9e80302f991f1ff97e19b44f9810000b4e09f44f922008052L16", + ";FFf0435f39e9af00b9e00bc23de31fc23de18b14ade11bc23de203c23dea7202f8edbf43f9f9c343f9e9030caae48715ade107c23de8bb01f9e87344f9fec743f9BBBBL8;FB6f5e7039138ff872a9b2cc3089f331fe2fa7485fa235154c8ad52be204e85309339df3ec27f1e8beaaf611e960475463a781", + "21c6030a37f8a28c1c5b61520375L8;FFa002803da80000b401f57ed3e0031aaa42008052a88b0094f41340f9f32f40f99f4200f1619eff5450000014ff0f00f915018052f63340f9f3031faaf52700f9BL8;FFe07f823dff5306f9e85b06f9ff5f06f9ea6706f9e87306f9e97706f903080194e1fb44f98", + "10000b4e0ff44f922008052a10b0194a30b01942002805221008052L8;FFfd7bc3a8c0035fd60001805201048052e4070094fd7bbda9f65701a9f44f02a9fd030091f303032af40302aaf50301aaf60300aaa30b00940004805201018052BBL8;FFc9120054010040ad8802168bd68200910104805222008", + "052010100adf60f00f9a54b019400e4006fe0830091e1031faae30314aae40316aae0b6843de0b2843dL8;FFdf010deb230300548c0500f1ed030eaa81feff54ca010aab220200542801088b480108ab8202005409804039000509ab22020054fd7bc1a8c0035fd6e8031faaL16;FFf90304aae97300f9ed", + "030aaaeb031eaae3e700f9e30311aafe030caaf04300f9f0031baafb0308aaf2ab00f9f80316aaea0314aaf56300f9ec031caae5d300f9BBBL8;FF2200805223008052240080521af7ff97f76741a9b9ffff17e0230091e10317aae20315aa230080522400805212f7ff97f70f40f9e80740f9080117cbbf", + "0208ebL8;FF610a40f9e10000b408018052606a68f822008052f44f41a9fd7bc2a8a66b0014f44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd03009114d440a9BL8;FF8082823ca2837aad8182833c880200f98082853ca18378ad8282843c8182803c8082813ccaffff17e08742ade00314a", + "ae21fc03de84340f9a0873aade08740adL8;FFdf11007100030054df0d007140010054df090071010c00542d050091bf0101ebe20a00540e68ed38df0501310dfbff54590000142e050091df0101eb020a0054BBL8;FFc000805221008052aa2b0194c00200b4a8cc875289c78d52e9cdad7208080079c80", + "08052090000b9680200a9680a00f9fd7b43a9f32340f9ff430191c0035fd6L8;FF542b40f9af2b0094e00319aa21008052a82b0094c01300b4e10314aae20319aafc0300aaab2b0094542340f9b4031df8b40100b58200001436008052571740f9L16;FF8c318d9a4d040091ae696a384a0500915f010ceb", + "cf194092ce1d0013ef21cb9ae90109aa420c00546b1d0091eefeff375f00001448008052e91f805208400039BBBBBBL8;FB2f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f737263L8;FFb09f0094", + "4000805241008052a99f0094401c00b4f50300aaaa9f00944000805241008052a39f0094801b00b4f70300aaa49f009440008052410080529d9f0094BL8;FF890200322911c0da291540d2290d098b2925019129fd46d3290500912001088be10313aa08fdff97f502003574040034610a40f9680240f91f", + "0101eb60040054L8;FF600800546083c33c6183c43ce80700f9e08702ade01fc03de013803da003983cb70000b4e00318aae10317aa22008052a11f0094e14740f9810000b4e00316aaBBL8;FFb50600d1750a00f9f70000b4ff0600b180020054e00318aae10317aa22008052a55f0194e00313aadc0000", + "94688e41f81f0500b160000054e00313aaa2e3ff97L8;FFb45f009448008052e9f31691ea7340f9e8f31639e8c31691eb7b40f9e9e302f9e99f40f9e8eb02f908018052e8f302f948c141393f0500b1f3db02f9ffef02f9L16;FFf40800b4890240b22911c0da291540d2290d098b29250191891a498b290", + "50091200108ab02080054e10313aaefecff97560300b4610a40f9680240f9b70640f9BBBL8;ZBL8;FFe80f40f9080118cbdf0208eba9bcff54e0630091e10318aae20316aa230080522400805255a3ff97f81740f9ddfdff17e0630091220080522300805224008052BL8;FF0001805201038052e6fb0094", + "03feff97c0fefff000600691fcfb0094fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd03009128400091f30303aaf70302aaL8;FF661c01a9261c41a9682402a9282442a96a2c03a92a2c43a96c3484a92c34c4a9420001f1e8feff548e3c7ca9661c01a9861c7da9682402a988247ea96a2c03a9BBL", + "8;FFb8237529b12f7629ad8357f83f0400b1ac0359f8bb8313f880040054f28304a9a02303d1f14700b9ec4302a9ef3b0629ed1f00f9eb2b0229e9230329e12f00f9L8;FF681e42f96a2242f96b2642f96d2a42f96f2e42f9703242f97fc6133920a10291693602f96c3a02f96e3e02f9774202f968fe01f", + "96a0202f96b0602f96d0a02f9L16;FFe88700f93d1f0094efb343f9ff0900f1e17b0054e16740f9810000b4e00316aa22008052a4bf00945c7900b4e05f40f9c5030014765f40f9df0600b1804b0054BBBBL8;FBdfdda65d48eae5dcd4ad5fc2e658d11ba28c82efe99f0000b9a8a3f8a46a1c273dbf33e7", + "d7f748dc6b8c0c470171b1c65491c38df289529f333222ddd62940d8L8;FF00e00c91018c009400feffd000e00391fe8b0094e0fdfff000a00d91fb8b0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4311d1BL8;FF203000b5a88357f8080540f91f0115eb09100054a0230", + "2d17aecff97402f003728fc60d3c81400b5200840921f1800f102150054217c0353c11500343f040071L8;FFfd7b4ba9ffc30391c0035fd6ff8302d1fd7b07a9f54300f9f44f09a9fdc30191f40301aaf30300aae0230091e103022af50303aa20030094a8c300d1e00315aaBBL8;FF021740d2e08f06ad1", + "a1740d217140038145001945f1f00f1a8010054e08744ad80020191a14301d122008052a0873dade08b45ada08b3eadde4b019400e4006fL8;FF08fd46d308050091090c40f93f0500b1400400540a1440f9092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a0500910901", + "00b4L16;FFee0311aaf10312aa12018052f27300f97a0e001408008092f5f316a9f57b40f9e87700f9ed074ba9e48f00f9e4ab40a9f61f14a9e7030baae8f347a9f60307aaBBBL8;FF3f040071e00300543f080071a1020054f70300aae003082ae10313aae20303aaf80303aaecf3ff97000500b4760000", + "143f0c0071c00300543f10007121010054L8;FF3f00156b81f7ff54680240f9e0031faa090540f90a0140f9290100cb4a01008be0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6fd7bbaa9BL8;FF080900d18cffff17e80b41b2e01700f989ffff17c80080d20800f0f2080500d185f", + "fff17c80080d20800f0f20809009181ffff17c80080d2e0a30039e0830091L8;FF21cc47b9210300341f4000f1814200d1130280d21320939a2000138b61feff97201400b4030c40f26104005401c05f3802d05f3804e05f7842100012c1020034BBL8;FFc0000054e8074091e14316910881099100e1029", + "137100094f87f49f9b80300b4e1d342f9e8cb42f9f97b49f91f0101eb40440054e8cf42f9490380522a040091L8;FFe20318aa00011a8bb22f00944803188be00319aae10318aa22008052a8031ef8a52f0094090000141f090071814e0054090180d208df78920900f0f23a0140b2L16;FF3f0500f1a01c", + "00540c0140799ffd0771cdfeff549f010b6b8d0100549f010d6b60feff541300001488050051f5031f2af60313aa1f090071030b00549f010471BBBBBL8;FB6964616c6963655f626173655f6b657970656e64696e675f6b796265725f7072655f6b65796c6f63616c5f6964656e746974795f7075626c69", + "63000000000000L8;FF0801098b080500911f0109eb49090054091c40f93f0500b120060054096840b969070034290140b22911c0da291540d2290d098b2925019129fd46d329050091BL8;FF0825019108fd46d30900088b200500911f0008eb29210054f30b40f9fd7bc2a8c0035fd6e80300aa098d40f", + "83f0500b1201a0054f30300aae00308aab3020094L8;FFe0431391e10319aae2031caa04028052e9ab13a9e89b00f933f5ff97ec6b42f9e16f42f9ee7342f9f97742f99f0900b121440054fc0318aaf8030e91ee6b12a9BBL8;FFe20304aae30305aae40306aae50318aae60317aa70feff97e82b40f91f0", + "900b1c10b00541803178bfa2f40f9f30f00f9080340394aff70d349ff78d35b7f0853L8;FFe167813de8a305b93a000014e8000090081140f91f0500f1a9040054e8830291e0032d91e10313aa0204805214210191f3032d91aff6ff97080000f008612a91L16;FFa00700d1e8a701a96800805269fefff0", + "29810291e1a30091e8a705a968feffb008811f91e8ab07a9ea08805288008052ffa702a969feffd029ed0691e9ab04a9BBBL8;FFa0faffb49900001481820191e003082ae20313aafffcff97e0f9ffb49c000014e00313aafb850094e80300aae00301aaa8fc073656000014611f0054e0031faaL8;FF80a", + "aff54f57f49f9f37b49f9350600b47622009104000014b50600f1d662009180050054c1825ff881ffffb4c00240f922008052a0770094f8ffff17f37749f9BL8;FFe00313aa088040f81f0500b1e0edff5400200091f44f42a9f65741a9fd7bc3a86e000014e80300aa098d40f83f0500b1a0000054f3030", + "0aae00308aacb020094L8;FFe20313aae103142ae00315aa0300009063601c91f35341a9f00303aaf51340f9fd7bc3a800021fd6fd7bbea9fd030091f30b00f9f30300aa00200391730200f9BBL8;FF15008092e8e30a79e057813de15b813d99000014e8074091f6b345f9002300910881099147870094e", + "1074091e04316910242805221800991a6370194e01fc53dL8;FFa4028052af000014c80080d2e0632a39e0432a910800f0f2ff672a39e84b05f9de3dff97e10300aae14b05f9e0432a9121fdffd021203f910202805263fdffb0L16;FFe05b40f9e1031aaa22008052aab70094f7031f2adf0600b1416aff", + "54f57740f957df78b3795601a908008092770600f908f7ff172093c63ce8bf43f9f7c31591BBBBL8;FB3c0000000d0000007375636365737366756c206465637279707420616c776179732068617320612076616c69642062617365206b65790000bb12400000000000L8;FFc900005402f57ed3c0120091", + "e10316aa558800942e00805288070091d8020079db060079a80a00f9b0ffff17e00315aaa0ddff972e008052d2ffff17e00315aaBL8;FFa82739a9e8feff9008210c91c9048052e8c302f9e3031691e8cb02f9e8feff900841179142008052e9c702f9e9cf02f9e8d302f935dcff97f58740f9e8031691L8", + ";FF00e00f91e8e30691a1008052950315aa89060094e1835ba93f0400b1a0020054ff0600b1600200544a0080d2e8e740f9490000900a00f0f2200d00f9490000b0BBL8;FF40feff54f76745a9e15744a9a0ffff17e9031faa180700d103000014e9031faa18070091081d4092390108aa2800805278e600", + "a968020039b60000b4e00314aaL8;FF80c38d3c800fc03d821f803d4047803d801fc03df81f00b98043813c00e4006fa80319b889430df8aa0312b8a8c313b8828707adeb1300b9ebe303b9200300adL16;FF2aa053a9e8a706a929a054a9e9ab03a929a855a9e81b00f9e97b00f929a056a9e9d300f9ea2", + "30ca929a857a9e9ef00f929a058a9e96f00f9e85f00f929a059a9BBBL8;FFe00314aa76620aa9e10313aa022b805268620ba9080180527f220ca9080480527f220da975220ea97cf200b9f44f47a9f65746a9f85f45a9fa6744a9fc6f43a9L8;FF61710c8beb0080521e0000149f014871830700544d1dc0", + "39ae1d00128c550e0b8c0148518d00f83761710c8b0b018052140000148d7d1c53ad0600340d00be52BL8;FFe20313aa5bf8ff97600400b5e1031faae3ffff17880240f91f0500b1c10000549f5e00a99f7e01a9977e02a9981a00f99f3200f9e10314aae20313aa27060094L8;ZDBBL8;FF6320229124ff", + "ff9084602e91a24700d1e1068052ec23019420008052e1028052e123019422ffff9042e00691e0031faafb230194fd7bbca9f70b00f9f65702a9L8;FFe00301aa28fc073708fc60d3c80100b5080840921f1900f102020054017c0353210200341f1100f160020054e003082ae20313aae303142ab5ffff9", + "7c0fdffb4L16;FF1f230039090300f9880219ebe833889a3f0314eb2a33949ab4835ff8ff0214ebe00314aae1038a9af303889af3b2ff97e00314aae10313aaf0b2ff97d90000b4BBBBBBBL8;FB797465732e7273001b737071722076312e73656e645f63742e73656e642065706f636820c01e3a2048656", + "16465725265636569766564202d3e2043743153616dL8;FF37feffd0f70232911b00809268e61f78e80309aa29f57ed3ea1740f908050091f80313aab3031df85969e978e86f03a92a3b0e1329370d133c2709133a230813BL8;FFe10309aa22008052f4030aaa630500946ba240a9ea0314aae10313aade", + "ffff17ffc303d1fd7b0aa9f95b00f9f85f0ca9f6570da9f44f0ea9fd830291081c0012L8;FFa0c300d1bb031db8a8631d38e81340f9a9431d78e9a34039bc731df8b6f31df8a8731ef8a9f31e38c71eff971a00005217000014f5031caae91b40f9eae34039BBL8;FF88008052f30300aae0230091040180", + "52050d805229f87fd33f1100f13481889ae30314aa26000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9L8;FF950a40f9550300b4610a40f9680240f9960640f91f0101eb800b0054680640f9490380522a040091e00315aa6a0a00f909692138e10313aa3bfaff97770a40f9BL8;FF21e", + "40e91a3feff90634c0f91e0030091220280526400805229000014e00300f9a1feff9021e40e9183feffd063900291e0030091220280528400805220000014L8;ZDBBBL8;FB50000000000000000800000000000000006b460000000000546b460000000000b46b46000000000021044000000000000e0000", + "0000000000ec0000002c000000L8;FF080117cbdf0208eb28420054e81340f9e10314aae20316aa0001178bad810094e802168be81700f97f0600b1609fff54e1630091e00315aac6000014e8031faaBL8;FF00ac0891c2fefff042403d91e1030091e92300a9f0fd0094fd7bbfa9fd030091c0fefff000a", + "03d91c2fefff042c03d9161018052e8fd0094fd7bbea9f44f01a9L8;ZFBBL8;FFf44f43a9f51340f9fd7b41a9ff030191c0035fd6000040f9c2fdff17080040f9e20301aa002140a9e10308aa0e3e0114000040f9fc3d0114000040f90b3e0114L8;FFc1080054606641f9616a41f9290c40f9e8830f91e1", + "031baa20013fd6fcf341f99f0f00b14112005448008092480300f9a8008052620d00141f090071fc432a91L16;FFe4030caae50700f9e9031aaafa0317aae89300f9f70301aae18f40f9e8d740f9e2831aa9e2030baaf6034ba9e50315aaef7b18a9f9fb42a9f4bb00f9ec2b40f9BBBBL8;FBff7cff44f66", + "4686f19e88885911c4791f9366cd97ee0109087fe0ca6a73ac1c3e5e9000091864aa1c58c1c90802c01aa08e64ef1ef85cbd2f19584a62bd9d2aaL8;FF6800d037198e00140a8e00140b8e001409004039e80300aae00301aa2a0900d13f09007149819f9ae90000b43f0500f16102005401fefff0213c07", + "91e2028052BL8;FFea5740b9fc7b06f900838b3ce0e3c23de85306f9e95706f9e85b06f9e92346a901838c3ce1e7c23d00838d3ce0d3c23de85f06f9e86706f9e82f40f9e96306f9L8;FF22008052ebcb00f9f9030caaeddf1aa9f7030eaafa030faaf60310aaf8030aaaa5110094ee0317aaeddf5aa9ebc", + "b40f9ea0318aaf00316aaef031aaaec0319aaBBL8;FF06000014e91741b2e1030aaa03000014290480d20900f0f2090500a909c48052090900f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e90f41b2e80315aaL8;FFf54f43a9f75b42a9fb0f40b9f96341a9fc0340f9060000143c008052542340f", + "9b4031df874f1ffb509018052a8035df8755a00a9755e01a9785e02a97c6605a9L16;FF09008092790a00f968220039690200f961dbff97cb100014e0032b91f50301aa2120009102398052aad10094e87b45f9140340f99f0208ebe8ff00f9e8979f1aBBBL8;FF280400511f390071880e0054a9ffff902", + "9b107918a0000102b6968384a090b8b40011fd601200591e003022ae20303aaf8f6ff97403800b4a1ffffb021203f91L8;FFe00318aad4fbff17f90300aae04316912200805299100094e00319aaf90b40f9e1d342f9a0fcff17f90300aae04316912200805291100094e00319aaf90b40f9BL8;FF6ca240", + "a9ea0314aae10313aaefffff17ff0301d1fd7b03a9fdc30091080040f9090540f9c90100b40a0140f92d0500d1eb030aaa6c1540380b3500a981194092L8;FFc30003cbc81000d184400091631000d1421c001269fc44d30010069b0800088b06d05f388600003402e05f7842040011421c001206c05f38c", + "6eaff353fc122ebBBL8;FFe14316912a130094e8cf49f91f0500b180b5ff5481e20491b4010014e1d342f9e8cb42f91f0101ebe0770054e8cf42f949028052f6074091d6820991f4031baaL8;FF00960054df0600b1f7030291a0020054e0820391e1e3179102278052fce314a9f5af00f9ab31009412000", + "014da0640b27a6e00a9797201a9785602a9ff074091L16;FF9f0600b1000a0054753e40f9f60300aae023009159ddff976082c13c688242f8e183c23ce283c13c6402c33c690244f8e003853c6002c03de83300f9680a40f9BBBBBL8;FBd82e400000000000df2e400000000000000000000000000000000", + "000000000000000000000000000e52e400000000000ee2e4000000000000000d1009300a700L8;FF0001679e20e0e00e013c184e0000669ec0035fd6283c00130a3c00122b0401132c080213290000132d0c03132e10041330180613311c071322280a13232c0b13BL8;FF227968f809ffffb029a1389128", + "7968f8e10308aadf150114080040f9e20301aa002140a9e10308aa0e160114281040b9000040f96800c8376800d037fa150114L8;FFe023c13de163813de18f5fade82b42f926fdffd0c6803b91e96b02f969e20191e40fc13de15b813de1fbc03de0431391e243813de227c13de1830891e04f813dBBL8;", + "FFe955019436008052e9030091a86300d12091009104560094b7835ff8d7feffb7bb035ff8170400b4a6590194e00317aa21008052390080529e590194e0fdffb4L8;FFaafdffb04a411f91e86304f9080000f008c10b91e96f04f9e9c32291e86704f9e8c31d91a04700d1e86b04f968008052e1833291e", + "97f06f909078052e86b06f9L16;FFf55356a9e0030091c1420091022a8052b0d90094bf0a00b16016005460420091e1030091022a8052aad90094755200a9c2000014a80a00d1e16701f905000014BBBL8;FFe10300a9e00301aae10308aa220080522300805224008052f4030caa16050094e10340a9ec0", + "314aa2aa040a9290040f90bfc63d35369283808050091280800f9L8;FF2c0100348c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c05009102000014ec031faa8b010b8b2801088b49010b8be14316910001098b3a120094BL8;FF6a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9", + "692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a29fbf50094L8;FFe0000054bf6900f1c1feff54ff0600f180fcff54680540f9f3ffff17ff0600f100fcff54730540f929008052eeffff1789000036f70308aa180080920d000014BBL8;FFe007409100c035910108", + "8052f6ef07f9e0fb863de1ff863de203873df60b0ef9e36b873de367873de363873de35f873d16360194e05fc73de163c73de8074091L8;FFdb050094f6ef41f9e8e741f9df0208eb61000054e0230f91dbd7fe97e8eb41f909068052c822099be9430891200543ad2221c03d18000014c80080d2e0c30e9", + "1L16;FF22008052acb90094e19f42f9810000b4e0a342f922008052a7b90094e1ab42f9810000b4e0af42f922008052a2b90094fc031f2adf0600b141adff547cfdff17BBBBL8;FB6a00000000000000ca0000002e00000042024000000000006a00000000000000200100002e000000ef10400000000000", + "4e00000000000000f904000019000000L8;FFe82700f9e83300f9e83f00f9e84b00f9e85700f9e86300f9e86f00f9e87b00f9e88700f9e89300f9e89f00f9e8ab00f9e8b700f9e8c300f9e8cf00f9e8db00f9BL8;FFe3feffb063a02091e4feffb084c00b91e2032d91c1058052e8a305f9e9a705f9e9050", + "194e85746f9e95b46f9e0feffb000000b91e3feffb063a02091e4feffb0L8;FF22008052230080522400805245e6ff97e10f40f98effff17e0230091e10319aae20317aa23008052240080523de6ff97f90f40f9e80740f9080119cbff0208ebBBL8;FF21008052ab490194601500b4e10314aae20317aaf", + "80300aaae490194482740f91f0500b120030054592f40f95b6340b9991100b4542b40f9a2490194e00319aaL8;FFf503012a74040051e00313aa56050094e80300aae00301aa28fc073708fc60d3c80100b5080840921f1900f102020054017c0353210200341f1100f160020054L16;FFf4371ea9eb031e", + "aae1d348a9fe0310aaf00303aaf88f41a9e9df00f9ef3b40f9ed0317aaf57b40f9fc4340f9ee0311aae96340f9e56f40f9f1031baafb0316aaBBBL8;FF533100f8ba0000b4e02b40f9e1031aaa22008052a8690194fb8216aaa85e58d37afe68d3e13340f9e81f00f9810000b4e02340f9220080529f6901", + "94f95f40b9L8;FF60f640f922008052ab69009461fe40f9810000b4600241f922008052a669009460220091f30b40f9fd7bc2a8a1feff17f30b40f9fd7bc2a8c0035fd6fd7bbea9BL8;FF971e00f99f3600f91f0900f1a10d0054e00313aa64f6ff9740010036410b00b5e0031faad3ffff17e003082ae20", + "313aa430c805206f0ff97c0f9ffb4c3ffff17L8;ZFBBL8;FFe1031caa22008052ab2901945f0b00b1c1f2ff548082c23ce8bf40f9e0430691e1e30091022180528002803de8ab00f96082803c680e00f9a6290194e0430691L8;FFe0030691e20316aa4103088bf6ff0739b0290094e00751ade0430991e2", + "93c03de377c03de1030e91b60302d1e00b813de10f813de0074fade213813de3f7803dL16;FFf30300aae0230091040180520502805229f87fd33f1100f13481889ae30314aa0c000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9BBBBBBL8;FB70686572746578746b7962657", + "25f7072655f6b65795f696430313233343536373839616263646566696e76616c696420726f6f74206b6579496e76616c696450L8;FF000700545a0700b11b01007914050079ba031ff803fdff54dc000014a8035ef8a80500b4b6835ef8b3031ff83a008052db020079d4060079dfffff175f0700f1BL8;", + "FF760a40f9680240f9080116cb9f0208eb69f8ff54e00313aae10316aae20314aa5e010094760a40f9bdffff17fd7bbca9f70b00f9f65702a9f44f03a9fd030091L8;FF22008052ac1d0094e15740f9810000b4e00315aa22008052a71d009417008092f61341b2d9ffff17e00316aabb8301d1c7ffff172", + "0fdfff000c03891f7190094BBL8;FF680e00f96000005400630091aee1ff97f3d340a9940100b47522009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f9220080529e5d0194L8;FF1f010071f3ab05f92801881ae99f40b91f01096b41050054e39348a9e0c31291e2db42f9e5f35", + "639e1032d912600805203eeff97e85b42f91f0900b1c07a0054L16;FF1f0500b160000054e10313aae3fdff97950a40f9550300b4610a40f9680240f9960640f91f0101eba0080054680640f9490380522a040091e00315aa6a0a00f9BBBL8;ZBL8;FFe057813de15b813de8e30a7920010014e8074091f6", + "a745f90023009108810991f40740919482099166cdff97e1074091e0431691023f805221800991a57d0094BL8;FFb65200a9b30a00f9f44f42a9f65741a9fd7bc3a8c0035fd6c0fefff000000691faf90094fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30302aae20301aaL8;ZFBBL8;FFa103963c", + "a003953ce8270e294809c05a6909c05ae8270f298809c05aa909c05ae8271029c809c05ae909c05ae8271129e08743adc806805234008052a00301d1L8;FFe80314aaea5740f9f44740f9f86b00f9bf000014a82247b8e9cf4779eaff41f9eb874f39ec034879e82309b9e8fb41f9e94b1279e9f741f9ea4", + "b05f9ec331579L16;FF00ad00540093c03ce8bf43f9e30319aae113c23de217c23d3bff48d3e0d7803de93344f9f4031aaaa8f200f8e8a35d39f7430d91e003c23de10b19ade6030991BBBBL8;FBace7d673eb39f094784a3c259e124f09a28c0000f136a7d456e2000006f0ebafec12f9642770675a24c6", + "a2247dcaca6ebfd56e4223cee145a6ccb69d1352b361L8;FF130300a9080000f9130b00f9ad8d00944001805241008052a68d0094a05500b4e8fdfff008293a91c9009d52080140f909100079138301a9080000f9131700f9BL8;FFe8bb03f9480200d0081140f91f0500f169050054e8c32c91c9fefff02", + "9a93791e85b04f9080200f008a11f91e85f04f9e8c31691a04700d1e86304f9e8ffffb0L8;FFc0035fd6f50b40f9ae0d0094c001805221008052a70d0094a00300b428fdff9008fd0391090140f9086140f8090000f929fdff90298d0391086000f8c8008052BBL8;FF3f0108eba004005488031b8b18a30", + "1f17b83009115411ef839a3019116c11ef815411ff814dd3f29fa3700f95a070091c003005435835cf8f50100b437035cf8L8;FF081540d2080d088b08250191081848abe2090054180118ab020a0054390700f194c2019161feff54080317ab22070054c902158b080109ab62090054691640f9L16;FFe8", + "f303f9e8b740f9fb2f04f9e8fb03f9e8cb40f9f03304f9e8ff03f9e89f40f9e53704f9e81b04f9e80f40f9ee3b04f9e81f04f9e82b40f9eb4704f9e82704f9BBBL8;FF08351a9109058052682601a908008092685e00a9f44f57a9f65756a9f85f55a9fa6754a9fc6f53a9fd7b52a9ff030691c0035fd6a8", + "ffffb00875199103000014L8;FFe8430691a08303d1c1e20091028300914509ff97e89341b91f050071610600542007c03de9b341b92143c23ce8c741b9f81f40b94003803dfacf40f9e002803dBL8;FFe0870aade08741ade25f803de08708ade08b42ade08b09ade08740ade08707ad002700b4e0c3039", + "195f8ff97c8010014e1430091e20313aaf70b00f9f74b00f9L8;FFfd7bc1a8c0035fd6fd7bb9a9fd030091f30b00f9f303032ae43700f9e3f77fb25f0003eb48010054040080d2d3010837637e4093081b80d2010000d401f7ff97BBL8;FFe04316912200805264110094e1d342f95efdff17e0431691220", + "080525f110094e1d342f984fdff17f40300aae04316912200805259110094e1d342f9e00314aaL8;FF08011891a0039d3cd6021891c6c8fe97e0074091e13b40f9e8833f9100001891e2432391bbc6fe97e8074091e0833f91e103279108011891e283249189c5fe97L16;FFe0230191a5230094fbef40f9", + "7f0700b120010054faf740f9570302f1c3360054e5020054f8031faae00318aae10317aadda90094e8030a91e123019102328052BBBBBL8;FB6e00000009000000000000000000000000000000000000000100000000000000b0a542000000000063616c6c65642060526573756c743a3a756e7772617028", + "29L8;FF4a01084a6b01084aaaa31838aad358382901084aabb31838abe35838a9c31838a9f358384a01084ac00640adaad318386a01084a2801084aaae31838e10300adBL8;FF4a2501914afd46d329010a8b290500913f010aebe9050054280108ab8300005426000014e80308ab82040054090840f9090", + "100b42a0140b24a11c0da4a1540d2L8;FFe9031faa0a00f0f205000014080180d2e9031faa0800f0f20a017fb2081d4092e0431391ea6b02f9280108aae86f02f933efff97e15341f9810000b4e00316aaBBL8;FF08d300a9a1035bf8f40740f90083813c0183823c090300f9810000b4e0031aaa2200805", + "2a4550194f70f40f9b50000b4e00314aae10315aa220080529e550194L8;FF20c3c13ce98745b9e86f04a921c3c23c1f0b0071f59b45b9e8bf45b9e1c20891eac742f9fbcb42f9208717ade89308b9e11f00f9a1170054e20f4ba9e0031691L16;FF05150094e8432d91f7ab45f90081c03ce8b745f9ff06", + "00b1a0039d3ca8031ef8e00e0054e8e33b91018300910270805200810091fc031a2afae33b91a5d50094BBBL8;FFe00f0054680640f929040091e00315aa690a00f91b692138e10313aa93fbff97770a40f9680240f9080117cbbf0208eb480f0054680640f9e10316aae20315aaL8;FF080040b20811c0d", + "a081540d2080d088b0825019108fd46d30900088b390500913f0308eb49100054f87749f91f0700b1a0150054802202918d250094080040b2BL8;FF81ffffb4c00240f922008052aaf50094f8ffff17340100b48806148be00313aa01f17dd302018052f44f42a9f65741a9fd7bc3a8a0f50014f44f42a9f", + "65741a9L8;FF02000014bf3b03d5831c40b96100050a40fc5f887f00006b61ffff5441fc008880ffff35c300030a831800b9bfffff1766824039087c4093c61000127affff17BBL8;FF0901098b0a0e8052f4cf42f9210108cb00510a9b33110094e00314aae10313aa30110094d50000b4a8e279d3e0031", + "4aa02018052011115cb9f350194e1db42f9L8;FFe1432a91022b8052f6ff01f9e8fb01f9e8830f9100810091001f803dad350094e8f341f91f0500b101e5ff54e84340f9b5000090f6c32491090140f9a81240f9L16;FFaabeff97e0c31391bdbfff97f7031f2a04feff17eb831d91e133c23de237c23d60", + "91c83ceaef43f9f80316aae10b19ade127c23de6030991e0d7803de023c23dBBBBL8;FB6a000000000000005e0100002e00000042024000000000006a000000000000006e0000002e00000042024000000000006a000000000000000200000026000000L8;FF8c0140b28c11c0da8c1540d28c0d0c8b8c25", + "01918cfd46d38c05009127000014280080523f0700b1ff1700f9ffa301a9a00c0054e0630091e1031faa22008052BL8;FFad050194400745addf0a00b14233c03de85345f9800705ad400743ad8233803de8bb02f9800703ad420344ad820304ad410341ad810301ad420342ad820302adL8;FFf55248a93", + "40200b4b982009104000014940600f139c300918001005421035ef8810000b420835ef822008052a205009421835ff8e1feffb4200340f922008052BBL8;FFe82746a976a205a9e87e045369f204f8e93f40b97a0202a978fe00396a260d2968c20139e1e7ffb4e02740f9d3ffff17a0e300d1a8ab3ca9ea", + "43009420008052L8;FFad450094610e40f9810000b4601240f922008052a8450094611a40f9810000b4601e40f922008052a3450094e00313aa080c49f81f0500b1400000542d000094L16;FF090141f9e9af1aa9090541f9e94f00f9e1ccff975700805220020014e8f741f9eafb41f9e0030991e9f341f", + "9eb1342f9a1e20791e8e700f9e8ff41f9022f8052BBBL8;FFa8031fb8b4f6ff97fd7b46a9f33b40f9ff030291c0035fd6ff4302d1fd7b03a9fb2300f9fa6705a9f85f06a9f65707a9f44f08a9fdc30091f40300aae00304aaL8;FFe00313aab7fdff97e80301aa40010036481d00b5e1031faa61f9ffb4f1", + "000014e20313aa430c80529cf5ff97e10300aafaffff17e1031faae86b00b9f7ffff17BL8;FFe0230039e00300910800f0f2ff270039e80300f9e1ebff97e80300aaa1feffb021201291a3feffb063280f91e0030091a2018052a4008052e80300f909000014L8;ZDBBL8;FF090d8052e00314aa02018052", + "017d099ba9250194617e40f93f0400f18b000054608240f922008052a3250194619640f93f0400f18b000054609a40f922008052L8;FFf85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aae0210094a00100b4f50300aaa4250094e00315aa21008052f40315aaL16", + ";FF6b09c05a3f010b6b89feff54099000913f0102ebe90300aae2000054499000d10b01098b610140ad6c2140b94c2100b9410100ad3f0102eb28fdff54c93200f9" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines14 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines15.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines15.lean index e3c60b6bb..e7db37bcc 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines15.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines15.lean @@ -27,358 +27,250 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub15 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF310110cbf00110cb100211ca1002168a1f1e00f1c9030054ff010aeb881c0054f02100d11002168a1f2600b1c81c0054716a6f3812fd79d37002108be8032faaL4;FF536928380cfc5cd308050091290040f9280800f94c0200b500fc55d336000014e10300a9e00301aae10309aa2200", - "80522300805224008052a3000094e10340a9L8;FFf50740f9bf0209ebc9000054e00313aae10315aa22008052d6fdff9776a240a9170116eb03040054680240f9e10314aae20315aa0001168bc61f0194bf0217ebBBL4;FF800701ade18343ad810300ad26000014c80300d008b140f91f0d00f1c3030054", - "2801009008712e914903009029b10d91f92302a9e8630091e82703a968008052L4;FF8502088b090100543f150071e1f8ff54a2c05fb85f1000f189f8ff54a3b05f3843f8ff35a30013cb7f0002ebe3f7ff54b70002cbe202403982f7ff35986a6838L8;FFfd7b41a9f31340f9ffc30091c0035fd6ffc300", - "d1fd7b01a9f31300f9fd430091130040f9e00301aa810100d021001a91e8030091a20180520aa00094810100d0BBBL4;FF1f0000f1ad000054390300eb237000541803008b060000141f0400b1a16f0054e7df01941f100031216f005439feffb505000014e043059181008052e2df0194L4;FBcf0000000", - "500000001014900000000004800000000000000d70000000500000061626f7274000000010149000000000048000000000000006e00000009000000L8;FF0db057a9ed5700f9ec6f00f90db058a9ed5f00f9ece300f90db059a9ed5b00f9ec0700f90cb45aa9edf300f915b45ba9ec3f00f9edf700f90cb4", - "5ca9ed7f00f9BL8;FF21008052c85f0194800d00b4e10315aae20318aaa0031ff8ce5f01943c3340f9b8831ff8bc0800b4352f40f9bd5f0194e0031caa21008052bb5f0194c00a00b4L8;FF490280522a040091e00314aa6a0a00f909692138e10313aa88fcff97760a40f9680240f9080116cb9f0208eb4", - "8060054680640f9e10315aae20314aa0001168bBBBBL4;FF200d010ea87301d10e0c805210000b8a426970fc438c202e7100669e32c201f2a00100545102c0da3112c0da110e518b31020b8a31fe0e9b5101118b20025ab8L4;ZFL8;FF3f0108eb73611932600500549369283808050091280800f9e006f8", - "b7e0030aaabfffff17e10300a9e00301aae10309aa220080522300805224008052f4030caaBL8;FF740100b4130300d073621291e0030091a1630091e20313aab50f00f9b506009108800194940600f121ffff54e003009105800194f44f43a9f51340f9fd7b41a9L8;FF60730054e81340f9938248f8490", - "4805209692138280400917f0600b1e81700f9002400548022029194fbff97080040b20811c0da081540d2080d088b08250191BBBL4;FFe183c53ce23b803de87b00f9e00705adc0f8ff54e08746adf55303a9f72300f9e083873ce08b45adc182853ce12bc03df63f40f9e083853cdf0600b1e283863cL4;", - "FB6c792d65737461626c69736865642073657373696f6e0000147d4900000000002d0000000000000060000000220000006d697373696e67207071207072652d6bL8;FF48008052e0a3019175fe00f9680200f9c5b8ff97ff831791f44f43a9f65742a9fc5f41a9fd7bc4a8c0035fd6e8c30991e1a301910", - "232805200810791c5bf0094BL8;FF27400194a0c35fb8fd7b41a9ff830091c0035fd6ff8300d1fd7b01a9fd430091e023009101018052ff0700f91c400194e00740f9fd7b41a9ff830091c0035fd6L8;FF0d00be528d010d0b4c2180396b710d8b8c00f8b761e10c8b2b0180520a0000144d254039bf0500", - "f1c80100548c1900126ce10c8b81fd0daa3f000beb03050054BBBBBL4;FFb50640f91f0101eb00040054680640f9490180522a040091e00314aa6a0a00f909692138e10313aa2efbff97760a40f9680240f9080116cb9f0208eb48030054L4;FFe9ab4f290ab9003909bd0039e9ab4e290ac1003909c5003", - "9e9ab4d290ac9003909cd0039e9ab4c290ad1003909d90039e9ab4b290add003909e10039e92b4929L8;FF6902009029212e91f30301aa290140f9e10300aa48078052a08300d122008052e8230039e90300f9dafcff97aa035ef8a8c35fb8a9058052e1030091e00313aaBL8;FF771201b968a612a9689e", - "00f9e82b40b9781601b9684201b9e83f40b9745201b9685601b9e81b40f9755a07a9752206a9795a08a9f44f5ca9f6575ba9f85f5aa9L8;FF1990009419900094f44f43a9fd7b42a9ff030191c0035fd6ffc300d1fd7b01a9f44f02a9fd430091a80100d008210191f30300aa08fddf88e8020035a80100d", - "0BBBL4;FFd86f00945f031bebe0030054e083c53ce183c33c0803138be283c43c5a07009173c201910101803d028100ade083c93ce183c83ce283c63ce383c73cfa1b00f9L4;FB293c83e9000084d2fa23d4da034e301e5a38f3f75bff44b2dc763c0f4580f2af1be7031fe25776b0a750139071529f4634", - "2f216e259727c600a60016264f49b5L8;FF08110f91e9eb01f9e9433c91fb0301aae8ef01f9e00100b000083691e8f701f9e80100d008012791e9f301f929038052e1430f91e8a303f9e3031d9162008052BL8;FF8000805206000014e00313aaeb070094e80300aae00301aaa8fe0737680240f9090540f", - "91f0009eb29060054e80f41b2e80300f9e0030091dd440094f44f45a9L8;FFe9270b9122f18f3ce9670b9120f18f3cc082c73ce9a344f9fbbf01f9f5c301f9f7c701f90001803de9d301f9e0234ea9e3031f2ae16340f9e22340f9081940f9BBBBL4;FFc0035fd6ffc301d1fd7b04a9f52b00f9f44f06a9f", - "d030191e20301aae10300aae0230091f30308aab8e9ff97e10740f93f0c00b101020054e00b40f9c4d7ff97L4;FB617373657274696f6e206661696c65643a207071725f6b65792e69735f6e6f6e6528290000000000d69548000000000032000000000000002800000011000000L8;FF2a000014e20313a", - "a230c80525de8ff97e10300aafaffff17e1031faa883e00f9f7ffff17c10e0054e0031faa7fffff1721050054e0031faa72ffff17c80080d2BL8;FF0a01003912000014eb0f80122c7c10532b2c0633ec0000352a7c0c530b050039090900394a091b320a010039080000142c7c12532a440c330b0900390", - "90d0039L8;FF1f0308eb483c0054e8cf42f9e10319aae20318aa00011a8bce6f0094f90b40f94803188be8d302f9df0600b14064ff5481620391e2431691400080523d100094BBBL4;FFe6af01941f1c0072a0060054a18a43a9e0c30091a31245a90083c43c0183c53ce08701ad0486009440080036a886", - "40f99f0208eb290c0054e90300d029b140f9L4;FFa8035ef81f0500f140040054b4835ef8e8ffff171f25007181010054755200a9790a00f9ff074091ff830091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L8;FF82100054880340920800088b1f0101eb820f0054607b6078617b6878e8fedf88c8", - "02003528e340391f050071e1fcff54e2031f2a9508009408fc78d309fc60d3BL8;FFf59302b93f0500b1c002803de8a702b9002c0054e8c3179140630291ca55ff97e8c357391f050071002c0054e9c31791e8c757392021c03c2121c13ce02b833dL8;FFe89b04f9e99f04f9da2f0094e84f45f9e95345f", - "9c00000f000743d91e300009063401191e400009084c00191e2831a91c1058052e85303f9e95703f9cd2f0094BBBBBBL4;FF3f0400b140020054f30300aa810000b4600640f922008052c6170294610e40f9810000b4601240f922008052c1170294611a40f9c10000b4601e40f922008052L4;FF08459f9", - "a1f0500f14c010054480100b4810000b4200740f922008052c5170094211340f9015901b4201740f9050000141f0900f1210740f9615801b4200b40f9L8;FF090100f9c0035fd6090440a9020041a9230940f960001fd6fd7bbda9f65701a9f44f02a9fd03009114d840a9f30308aa150040f9df0215eba1", - "010054b50300b4BBL4;FFa80a0091b4831df805000014e80b41b2a0831df802000014a80e0091a0c300d1a8031df8e28c0094f40300aa59000014c08640ada88353f8c282c83ca9035cf8L4;ZBL8;FFf70b00f9f65702a9f44f03a9fd030091011440f9f30300aa3f0800b1800100543f0400b1400100548", - "10000b4601a40f922008052bf970094612240f9810000b4BBBL4;FF817e40f93f0400f18afcff54e6ffff17089440f91f0500b160000054014001b9c0035fd6fd7bbfa9fd030091c00300b000c03891c20300b042803991c1058052L4;FB7765656e203020616e6420362c20676f7420c0001a65706f6368", - "206e6f7420696e2076616c69642072616e67653a20c00010456e636f64696e67206572726f72L8;FFe98b04f9e94b40f9e83704f9e82340f9e98f04f9e83b04f9e87b40f9fca704f9e84b04f9e86740f9e85704f9e8ef40f9e85b04f9e85740f9e85f04f9e86f40f9BL8;FFcc570194f8ffff1760020291b", - "10b0094e80740910881099100010491740b0094f4cf49f99f0600b100b0ff54f5d749f9f3d349f9b50b00b47622009104000014L8;FFc80080d20800f0f2080500d1be000014e05706f9e80b41b2c9000014c80080d20800f0f2080500d1c5000014c80080d2e0a33239e08332910800f0f2ffa73239BBBB", - "L4;FF820a803d68920039f44f49a9f65748a9f85f47a9fd7b46a9ff830291c0035fd60001805201038052daf70194000400b000601a91d6f70194ff0304d1fd7b0ca9L4;FB66632f6f75742f7369676e616c2e70726f746f2e66696e6765727072696e742e727300000000000028914800000000004c0000", - "0000000000e200000014000000L8;FFfd7b03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf40301aaaaf6ff97e80300aae00301aa08020037BL8;FFe20748ad6082803ce037c03d69a200b9e94740b968be0239e88340b969c20239e90b4179681", - "20bb8e8e3413969520b78e92740f96082823c69720bf8e93b40f9L8;FF28038052a90fc0f2ea5f09f9aa0a805221800991ff3309f9e83b09f9ff3f09f9ea4709f9e85309f9e95709f9cd770094f6ef47f9e01bc43de11fc43de0431691BBBL4;FF7f0208ebe8140054130100b4e81b40f9e1031aaae20313", - "aa0001148bcdb701949402138bf41f00f9bf0214eb200f0054e81b40f98a060091e1a30091e0031baaL4;ZDL8;FFe9e70891e10300aa0232805200f18f3c08e040f9e023009121f18f3ce927099122f18f3ce8af01f9cab7009468220791e0230091572a0094e0630691e1230091BL8;FF4a2501914afd46", - "d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54a00200b000803291c1370194a00200b0L8;FF081140b9fb4b00f9fbc30d91ffe701f9e9d301f9e9b30e916001803deb0313aa68aa02b9e8830e91e9db01f9694240f9e8e301f9688d4ff8eadf01f9e", - "a5b00f9BBBBBL4;FF0f02c0daef11c0dacf0d4f8bef010a8aeffd199b0f010f8bf18156b89f02116b000300540f0600d1f00110eaa1feff54bf0500f10001005422a8200e4b00669eL4;FF6002158be10308aae20314aad1070094e10318aab402148bff0a00f1e80316aaf40f00f9a0010054e90740f921", - "5442a9290114cbbf0209eb88050054b50000b4L8;FFfd43009114cc40a9e00301aae80300910b080194930100b475ea7bd3530200d073023e91e0030091a1630091e20313aab40f00f99482009102080194b58200f1BL8;FF3f0400b11f1400f91f2000f940020054810000b4604e40f922008052c587019", - "4615640f9810000b4605a40f922008052c0870194616e40f93f0400f18b000054L8;FFe10315aad8870094ff8300d1fd7b01a9fd430091a0c31f78a01300d130a6ff97fd7b41a9ff830091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaBBBL4;FF090080921f0d00b1692a00a96800005422", - "008052c7c70194080700d11f0d00b1a8000054e00319aae10318aa22008052c0c70194c80600d11f0d00b148f9ff54L4;FB2e7273000a64656372797074656420c00e206d6573736167652066726f6d20c02620776974682063757272656e742073657373696f6e20737461746520286261L8;FFe806178b", - "e00316aa0201805201f17dd3c8c70094e96f40f9080080927b0600f9682601a9b2f9ff17b50000b4e0031baae10315aa22008052bec70094e16f40f9BL8;FF4b01098b6bf1df388b0cf8374b05c0396c1d00128c6119538c01210b810102516b00f8374b0080524c0000143f104071c30b00544b09c0396c", - "1d00122c380c0bL8;FF4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b42a0140b2BBBBL4;FFe10315aa0204805224008052e8830239ce4900949f07003100260054f4de40a9e2031aaa600740ade003", - "14aae10317aae00705ada50100941f0400f1c1230054L4;FB3cde4800000000006caa48000000000047de4800000000000d000000000000000700000000000000000000000000000000000000000000000000000000000000L8;FFc1000054e87b41b968fb0737fcbf00f9ff8301b9d8ffff17a2c303d163", - "0c805258e0ff97e10300aad8ffff17e1830591a2c303d1c5e5ff9760faffb4b6000014BL8;FFa1060091028c8152f30300aa158c8152d06701942800809293d600a9880200f9f44f42a9f50b40f9fd7bc3a8c0035fd6e90f41b2090100f9f44f42a9f50b40f9L8;FF22008052cb670094611240f9410900b", - "408038052606a68f822008052f44f41a9fd7bc2a8c3670014604a40f9a00000b4614e40f9610000b422008052bd670094BBBL4;FFc0035fd6ff8301d1fd7b04a9f32b00f9fd030191098440a9f30308aae8230091e00309aac07d0094e82340391f050071e1000054e84340391f0500710c040054L4;FF22", - "0080d2010000d4e00303aa04000094f30b40f9fd7bc5a8c0035fd6fd7bbea91f0440b1fd030091f30b00f9f30300aa88000054f30b40f9fd7bc2a8c0035fd6L8;FF0801204b087d1f53e8330039e0334039ff430091c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091e80100900821019108fdd", - "f8848030035e8010090BL8;FF6012803cfd7b43a9f32340f9ff430191c0035fd63fa000f141010054f30308aae8430091001000918104805218140094e81340b91f05003100010054e80313aaL8;FF9f0200f9f44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091330400b182030054b3", - "00f8b6f6031faae00316aae10313aacb270094f40301aaBBBBBBBL4;FF0800669e15c10192f50000b5808f40fc5a2300910088202e0800669e15c101f260ffff54a802c0da0811c0da560f488be80b40f9091716cb000540a9228100d1L4;FFe00318aae10317aa22008052c91b0094e1af40f9f70340f92", - "1fcffb5e3ffff173b008092f7feffb5faffff17a00000f000602b91d61b0094ff4303d1fd7b0aa9L8;FFfd7bc4a8c0035fd60001805201058052e01b0194600200f000601d91c81b0194fd7bbda9f65701a9f44f02a9fd030091f30302aae20301aae10300aaf40308aaBBL4;FFe92e40390801004ae8260", - "039e83240394a01194a2901184aea2a0039ea364039e92e0039e93a40390801134ae8320039e83e40394a011a4a2901164aea360039L4;ZFL8;FF083040b9c8030034080140b20811c0da081540d2080d088b0825019108fd46d308050091090840f9090300b40a0440f9ec031faaeb0309aa4a4100914d8", - "541f8BBBL4;FFa08303d1e237c83de33bc83de1430591e43fc83de9820039e1830aade28f0fade227c83de32bc83de487803de433c83de28f0dade22fc83de317c83de013883dL4;FB617461206973206e6f74205554462d3820656e636f646564566172696e745369787479466f75724269744c656e6774", - "6844656c696d6974656453746172744772L8;FFe03300f9e86705f9080200b00801279129038052e8a303f900020090001c3491e8ab03f9080200b008812791e1032b91f20302aaf00303aae3031d9162008052BL8;FFe0431691e8036179e1833791023f8052e057813de15b813de8e30a79cd5b0194380", - "080527400805215008092e8d342f9e067c13de94306912081009102708052L8;FF9f0e00b12102005468008052f46f41f9f36b41f9e8230b3949008092880240f9690300f9680000b4e00313aa00013fd6810640f9812101b4820a40f9e00313aaBBBBL4;FF0800669e0ec101f2e1f9ff54f4ffff17fb130", - "0f904000014618300d1e0830091a08d0094e00741ad28008092880200f9280080528082803c8182813c68820039L4;FB6172792f616c6c6f632f7372632f7374722e7273002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d3139343963663863366235L8;FF880080d2080", - "0f0f2081900913f0108ebed160054e10314aae20313aa5e030094f50300aa170200143f0900b1401f0054e80741b23f0108ebe11e005481220091BL8;FF68820191010300b021a83691a3630091c2018052e40314aaa80f00f9127c019468e20191010300b021e01f91a363009102028052e40314aaa80f0", - "0f90a7c0194L8;FF24008052aa91ff97e11740f979fdff17e0630091220080522300805224008052a391ff97e11740f99cfdff17f30300aae0630091220080522300805224008052BBBL4;FF691200f91a000014480080d27a4200390800f0f20869009115000014e80741b2a06301d1a8831af8e1b00094", - "f50300aae00315aac6a3ff970b000014a8835bf8L4;ZBL8;FFe023029102328052f60303aaf7230291e00702ad200843ade00b03ad210040ade10300ad220041ad21000291e20301adc8bb0094e0230291e10316aa7c360094BL8;FF1dfeff97080040b20811c0da081540d2080d088b0825019109fd46d3", - "0800098b080500911f0109eb281000548a000014f30300aacd030094e80300aae00313aaL8;FF6db241f96fa641f970aa41f9699641f96c9a41f96e9e41f977a241f9f14f00f971ca1391761602f9781a02f9681e02f96a2202f96b2602f96d2a02f96f2e02f9BBBBBL4;FF680240f9080116cbbf0208ebe", - "8150054680640f9e10314aae20315aa0001168bcc0b0294c802158b680a00f9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8L4;FFa0c300d1e103182a99030094b4937da9e0a30091e20340f9e10316aae30314aa4a030094e00740f9e1a30091e2430091f6e6ff97a1035df8810000b4e00314aaL8;F", - "Fc1fdffb40804805205000014611240f93f0400f12bfdff5408028052806a68f822008052c30b0194e4ffff17010040f968018052290041d23f0000f12841889aBL8;FFff830091098c0114ff8303d1fd7b09a9f95300f9f85f0ba9f6570ca9f44f0da9fd430291f30308aa28008052380180d2ff2303a91", - "800f0f2e87f05a9e8830091L8;FF36008052e84b01f9e04f01f9ff5301f90b0000146802148b8904805294620091090100a9b5220191090900f9f65301f9d6060091df9600f180170054b98b0094BBBL4;FF38b7ff97a1035ef80200001421008052a8035df81f0101eb201b0054a8835df8490280522a04", - "0091e00318aaaa031ef809692138a1c300d12ab7ff97b7035ef8L4;FB2cf9450000000000000000000000000008000000000000000800000000000000c8f345000000000025194900000000006a00000000000000200100002e000000L8;FFe04700f9f5ff5e39e0831d91e82b00f9e8e35e39e16f00f9e1", - "030e91e82b02a9e8e343f9f8c701f978d34b78e82703a9e8eb40b9f4cb01f974934bb8e89f03b9BL8;FFcc4b0194611240f9810000b4600e40f922008052c74b0194b40000b4600640f9e10314aa22008052c24b0194602e40f9a00000b4613240f9610000b422008052L8;FFce1540d2ce0d0e8bce25019", - "1ad194e8bbf010ceb830500546b0500f1ec030daa81feff54a90109abe300005423000014e8031faa090840f949fdffb5e90309abBBBBL4;FFff3f0439e80314aa02fd47d314dd799218194092020100b4e82755a960020291e10317aa080102ab2935899ae82715a9caeb0194e0430291e102148be20318", - "aaL4;FB0800000000000000304b420000000000000000000000000008000000000000000800000000000000304b42000000000000000000000000000800000000000000L8;FF2300805224008052a9010094780a40f9680240f9080118cbdf0208ebe9f6ff54e00313aae10318aae20316aa230080522400", - "80529e010094780a40f9afffff17BL8;FF0300001408008092686e00a998d5ffb4e00319aae10318aaeaffff17a0e300d1a8ab3ca91b480094faab48a9e00315aae89347b8e97f40b9e10314aafc034239L8;FF1f11007141040054280180d20800f0f217000014e00313aaf7070094e80300aae8070036e", - "00301aaf44f45a9f52340f9fd7b43a9ff830191c0035fd680008052BBBL4;FFa0033eada003da3ca103db3ca203dc3ca303dd3c080dc0dae333803de22f803de12b803de027803d692200a9f44f5ea9f6575da9f85f5ca9fa675ba9fc6f5aa9L4;FF0dc070d36b0179920ffc4ed30c020c0a10b46dd3cb01", - "0baa2e017cb229018e9aed030d2a0e0090526b650daa1f020f6a2d017db210009052ad11899a89010f6aL8;FFe80740f9e083c33cf7060091a822189be92740f9aa060091ff4200f10001803d090900f9ea0b00f940050054fb5a189b7a0b40f955fb7fd3ba0300b4b9ab0094BL8;FF20f18f3ce96301912", - "0cbc03de8b304f928210a91e9e32291c082893c4043ce3ce0234d39c282853ce11740b9e33740b9408708ade42740b9fb6304f9020140adL8;FFd42b00945a03188be00319aae10318aa22008052ba031ef8c62b00941d0000141a0180d29bff48d31a00f0f2691f4092fb0309aaa1035df8615900b5ce02", - "0014BBBBBBL4;FFf4030caa3a060094e10340a9ec0314aa2aa040a9536928380bfc71d308050091290040f9280800f94bf2ffb4ddffff17e10300a9e00301aae10308aa22008052L4;FFf62b00f9f9d300f9e98303b9ea0b0779eb9301f9eca30c39edab0bf96ad30078699300b868f300f86c7f00396b73", - "01f826ebfe97f90300aafb0301aa28008052L8;FFf32300f9fdc30091f30308aae843009142020094e8834039e007c03d1ffd0371e003803d40020054e91342b8ea2740b9e1430091e003c03de8830039e00313aaBBL4;FF1f0500b121fcff540500001436008052280340f91f0500b181fbff54f4031f2a", - "e82f40f9490700d13f0108eba1fbff54e063019148caff97fc3340f9d9ffff17L4;ZDL8;FFa10240f93f0400b1e0fdff54810000b4a00640f922008052c6930094a10e40f921fdffb4a01240f922008052c1930094e5ffff177f1600f97f1e00f97f4200b9BBBL4;FF0a01098b290500915f0117ebe90f00", - "f9eb33979a4a010bcb4b01199b7b0100f9a1837bada203d63c6281803c6081823c6181813caa035cf8a2037dada103d93cL4;FB0000bd7ecd09206045036f2e47ac3eab0077c1c564f4dabfeb077177da0d1ca8c7d4c1c454fcea8348cc0ebc72b3c1273fa2016896033985ce2332f500004ce5L8;FFefa7", - "40f9e62704a9e91740f9e20300aaf5f700f9f5030aaae09bc33de92b00f9e90f40f9e193c33deb2b5fa9ec6300f9ec030daae91700f9e98f40f9e6030caaBL8;FF3d1000941dfbff17e8031faa000119ab224e0054e1431691790c0094f90b40f91f0700b1c00e0054e1d342f9e8cb42f91f0101eb402a00", - "54e8cf42f92a040091L8;FF940600f1b5620091e0010054a1825ff881ffffb4a00240f922008052c5530094f8ffff17e027c13de8a344b9b47e0853e137c13de063813de89305b921418e3cBBBBL4;FF880b0091a0031df805000014e90b41b2a9a33ca903000014880f0091a8831cf8a0e300d1e2e80094", - "e12b40f9280400d11f0d00b1e8000054e82f40f9f70300aaL4;FBabd9831f19cde05b6b796265725f7072655f6b65795f7369676e61747572652069732072657175697265646964656e746974795f6b6579206973207265717569L8;FF1f0500b1810000549f6200a99f7e01a9987e02a9e10314aae20313", - "aa4af5ff97000100b454000014400800b5e00313aaaaf2ff97e80301aa80000036a80800b5BL8;FFa102178be20314aaf4bf0339d1730194e00747ada8c302d1e243c03df58b40f914010191e1031f2aa0073cade10f46adb7f35838e02fc03da2039a3cb5031bf8L8;FFf4bb49f99f0600b1e0b2ff54f5c", - "349f9f3bf49f9950e00b47622009104000014b50600f1d6620091e00d0054c1825ff881ffffb4c00240f922008052bd730094BBBL4;FFa06301d150b40094f40301aa80fa073618000014a0035df8010080924083c33c280400d1090080921f0d00b1696e00a96082823c0804005422008052bdb30194L4;", - "ZBL8;FFc971fcf2a97ec99b29fd45d3290d098b29f57ed3ab0209ebeb0700f9411800545f0100710bfa80526a018a1a4a01142b421b00545f01086bc20b005448018052BL8;FF1f7f0aa91fff0ba9f6fb05f9e80706f9ff0b06f9fa0f06f901430291a22302d16eedff9760dcffb46700001420dcff54c80", - "10014e0dbff54c80080d20800f0f2L8;FF63c00a91a4028052fe000014e04b05f9e0432a91e10000b021e0029102028052e30000b06360039104028052f500001448008052e0632a39e0432a91e8672a39BBBBBL4;FFff430191c0035fd6000400f000603291dc030294dc030294080040f9290040f90801", - "40f9291902cb000540a9220101d16efeff1708328052090040f92a0040f9L4;FFc8090054292d0c1b5f0d00f1200900540b0d4039f0030faaee0301aaed0316aa6bc100517f250071e8580054292d0c1b5f1100f1f6030daae1030eaaef0310aaL8;FF22008052cb030194613240f9c10000b4603640f922", - "008052f30b40f9fd7bc2a8c4030114f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9BL8;FFc0035fd6e00700f9200440a9e8230091090000b029b11591e82701a9020300d0428c1091e3430091df830194fd7b43a9ff030191c0035fd60820009109300091L8;FF188400946862009", - "1610100d021ac1a91640100d084a00b91e0030091a3630091a2008052a80f00f90f840094410100f0211c1691640100d084e00491a3630091BBBL4;FFf70f42f9f81342f9e023009101810091022a8052cfc30194bf0600b161f2ff54e2ffff17f4c342f9c1ffff1748008052c90a0091e0031639e807163", - "9e9bf02f9L4;FB6a00000000000000200100002e00000097654900000000004e00000000000000f90400001900000097654900000000004e000000000000000105000014000000L8;FF610000b422008052cac30094b80000b4e08b42f9e10318aa22008052c5c30094e19342f9810000b4e09742f922008", - "052c0c30094e19f42f9810000b4e0a342f9BL8;FF0001168bd3430194c802148b680a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6e8031faa74f7ffb5e00308ab43f8ff54c002009000602991c0430194L8;FFe0430691e10244ade1830d91e8bb01f9a8e378a9fa9701b92183813c2083823ce1", - "0245ade81700f9e80b40f9e9a319a9a80302d12183833c2083843c759efe97BBBBL4;FFcd000054390300eb43f000541803008bf9feffb50f0000141f0400b1a1ef0054e7e301941f10003121ef0054f9ffff17e4e30194f70300aa1f0400b141fdff54L4;FB657274657874656e6372797074696e76616c", - "69642073656e64657220636861696e206d657373616765206b6579736465637279707473657373696f6e20776173L8;FFe00313aa6ce1ff97d40000b488e279d3e00313aa02018052011114cbc5e30094e12740f9810000b4e02b40f922008052c0e300945f0f00b180000054e8030091BL8;FF000100b4e", - "10200d021003a91144c00a91f400039f44f41a9fd7bc2a8c0035fd60001805201038052da630194fd7bbda9f50b00f9f44f02a9fd030091f30302aaL8;FF080040f9090540f9490d00b40a0140f9410180390101f8b7e0031faa4a050091290500d10a2500a9fd7b43a9ff030191c0035fd63f2900f18800", - "00544b01098bBBBL4;FFff8306d1fd7b14a9fc6f15a9fa6716a9f85f17a9f65718a9f44f19a9fd030591491c0012f403042af50303aa3f190071f30308aaec030054e80301913f090071L4;FF5c0080d2f4031c2ae0ffff17e00318aa860080d2e3ffff172700805205008052c30210913ffc0371800a005", - "42104001161400e39bf7e0071e1c79f1a3f00356aL8;FF8200805209a40014080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091810100f0210c1691a40100d084001f91e323009182008052BL8;FFc0035fd6e30302aae20301aa8102009021403f91e4230114ff0301d1fd7b", - "02a9f44f03a9fd830091480001aba2020054010840a9f30300aae023009129f87fd3BL4;FF8c364aa9e00300ad8e3e4ba9e00301ad080dc0da290dc0dae08302ade01f803de013803de007c03de10bc03de20fc03de303c03d8302803d820e803d810a803dL3;ZBBBBBBBBBL4;FF0a00669e2afcffb5f9ff", - "ff17200340fd00a8200e0800669e0801c0da0811c0da09fd43d3dfffff17220000f042d00f91e1a30091033280520e79009414008092L4;FF560100b50d000014e00fc03ddafe48d3f903162ae003803d09000014f9031f2a38008092b60000b4e00315aae10316aa22008052bf1d0094f5031baa59df78b", - "3L8;FF371e01941f0400f161010054fffedfc8c10640f90107f8b7c00240f922008052c41d0194e00316aa0103805202018052c01d019468fe4ad309088052f80313aaBBL4;FFe10314aa9a02028b0001198bd19d0194e83340f9e0020191e10300912200805208050091e83300f9f59d0194ffff0039f50", - "318aaf4031aaaa2fe46d3b8e27a92L4;FFa27c4093480c80d2011080d2030080d2010000d41f9800b160000054a500070b08000014e00304aa010080d2010000d4fbffff17bf3b03d5e503002a05feff37L8;FFa10100b021003d9142008052479e0014281040b9000040f96800c8376800d037f99d00141", - "39e0014139e0014080040f9090140392a0900d13f09007149819f9aBBBL4;FF60300035e85341b9e81b00b957ffdfc8770000b5ebdd0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1L4;FB6a0000002c0000008909490000000000490000000000", - "0000a400000016000000000000000000000009000000000000000e000000000000001300000000000000L8;FFe8df00f90c2049a9e8af00f909204aa9ea2718a909e007912001c03d097040f9e88b00f908784ba9e92f14a90ba44ea9e0c7833de8b700f908284ca9e99f00f9BL8;FF9b9d0094e1074091e", - "0431691026e805221800991cf5d0194e077c53de17bc53d58008052e8e36b799400805215008092e057813de15b813de8e30a79fc010014L8;FF680240f9080117cbbf0208eb09f8ff54e00313aae10317aae20315aadc000094770a40f9baffff17e00313aa22008052d7000094610a40f9c3ffff17e003", - "13aaBBBBL4;FF090140f9087140f8090000f9087000f8080380d20800f0f20f000014680640f9000540ade00700ad35835ff828835ef8bf0208ebc002005428035ff8e00740adL4;ZFL8;FF3f080071a1020054400f00b5e00313aab2fcff97e80301aac0060036a80f00b5e1031faae6ffff173f0c00712", - "00300543f10007121010054800900b5e00313aaBL8;FFfd7b42a9ffc30091087e0114092000912103009021343491040300d084e01291a9831ff87c0000140980009121030090213c3991a9831ff8090300d02be11291L8;FF49018052ea1700f90969213829ecff97e1630091427dff97807640f9800100", - "b4e11740f9e80f40f91f0101eb60440054e81340f9090180522a040091ea1700f9BBBL4;FF29e10e91890600f989008052aa0301d1a8031cf8880300d008b11491e9a304a9890300b0297d2591e9ab06a96a06805229048052ffa301a9880300b008150a91L4;FB657973000000000090874900000000001", - "100000000000000b4010000110000007265757365642062617365206b65790090874900000000001100000000000000L8;FF00884fade00b1cad01804cade10319ad02804dade0030091e2031aadcdbd009468420891e00300915a300094e0430691e103009102328052c6bd0094e1430691BL8;FFe8031f", - "aa091c40f93f0500b121faff54e00308ab23ffff54a00200f000002591c73d0194e8031faa090840f929f5ffb5091440f9e803088b09f6ffb5b6ffff17L8;FFe10313aae81f40f9c80000b4e02340f9e10308aa22008052c63d0094e10313aae82b40f9c80000b4e02f40f9e10308aa22008052bf3d0094e", - "10313aae10700f9BBBBBL4;FFe00313aae10317aae20315aa230080522400805236000094770a40f9680240f9080117cbbf0208eb49ceff54e00313aae10317aae20315aa2300805224008052L4;FF22008052cb0d0094e8af40f9a80000b4e09f40f9e1af40f922008052c50d0094b50000b4e0df40f9e1", - "0315aa22008052c00d0094e8e340f9880000b4e1035ca9L8;FFe90740f9e82740b9aa058052e1230091e00313aa82048052e90700f9e92f4229a8831fb8ea430039e91301b8e91b40b9eb6301b8ebc341f8ea570039ea6b0039BL8;FF5f0500b1e903899ae90300f9c0010054e9030091210300d02180299", - "14403009084c02191e3230091e00308aa82008052e90700f9018e0194fd7b41a9ff830091L8;FF6b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b29050091BBBL4;FF230080522400805239c0ff97e1", - "2740f904ffff17e0e30091e10318aae20316aa230080522400805231c0ff97f82740f9e81f40f9080118cbdf0208eba9e0ff54L4;FBde194900000000005700000000000000cb00000013000000de194900000000005700000000000000700200003d000000de194900000000005700000000000000L8;FF", - "fb030caacbcd0094ec031baaeb0318aa3a0100b4e00319aae1031aaa22008052f8030baaf9030caac2cd0094ec0319aaeb0318aaf60000b4e0030baae10316aaBL8;FFe8bf00f972ffff17c80200d008413e9189028052e86301f9e96701f9f2feff172143c23c2007c03dfc430f912283c33ce8b341b9e0", - "430691810f803debc741b9L8;FF092900a9096501a9a9435fb8156502a9175103a9176104a9166105a9096100b9fb0800b4a8035ef81f011ceb80080054560b40f9586340b9360500b4540740f9BBBBL4;FFc0feffb4e10317aae20313aaf40300aad0ed0194e8230091a08200916ac60094f50f40f97501", - "f8b6f9031faae00319aae10315aacced019434008052e8230091L4;FB00fe420000000000000000000000000008000000000000000800000000000000e47c42000000000050726f746f636f6c4164647265737300a1a1480000000000L8;FF680240f91f0101eb60040054680640f92a04009109028052e0", - "03142a09692138e10313aa6a0a00f9f44f42a9f50b40f9fd7bc3a83aedff17e8031faa94fcff35BL8;FFe8ff06a9c2040054170a00b4f85344a91f0314eb00050054c8e279d3f9031faafb0600d11a1116cbe10318aaa0c301d118c30191cb0d0094e80740f9a0877eadL8;FFe0431691e1031aaae20318a", - "ae0100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aad7100094fad342f9fc0740919c830191BBBL4;FFe00700ad0080c33ce00b01adc5ad01940004805221008052c3ad0194801200b4600644adf50300aa811a40f9000400ad810000b4801e40f922008052bdad019", - "4L4;FF680a00f9f44f44a9f65743a9fd7b42a9ff430191c0035fd6e0230091f40301aae1031faae20315aa4fffff97e10314aae05341a9eaffff17080040f9680000b4L8;FFff5f01f9ff7301f9ff7701f9ff8b01f9ff8f01f9ffa301f9ffa701f9ff571ea9ff0701f9f50301f9ff0b01f9f50f01f9ff1f0", - "1f9f51b01f9ff2301f9f52701f9BL8;FF680000b4e00314aa00013fd6c10640f9810000b4c20a40f9e00314aac52d01941f0b00b1fa432791c100005420afc03de82344f94003803de8f304f910010014L8;FF0d04ff9700060036b50000b4e00314aae10315aa22008052c62d0094e0234ea9e16b40f908", - "0d40f900013fd6e0e302f9e8074091f4074091e1e702f908011891BBBBBBL4;FFcf150294ff4301d1fd7b03a9f44f04a9fdc300911f1c007280010054c80080d2e0230039ff2700390800f0f2e0030091e80300f9de0a0194f44f44a9fd7b43a9L4;FFfc030daaf8030eaafa0310aac9150094ed031caafc", - "0317aae90315aaf50314aaf40313aaf30316aaefdb59a9ec031baafbdf5aa9f0031aaaee0318aaeb0319aaL8;FFfd7b42a9ff430191c0035fd6350040f9f60301aae8030091e10314aae00315aad3150194e80340f91f0500f10101005488008052680200b9f44f44a9f65743a9BBL4;FF89164039ea5740", - "39e85300394801094a891a4039ea5b4039e85700394801094a891e4039ea5f4039e85b00394801094a89224039ea634039e85f00394801094aL4;ZBL8;FF9600001473f9ff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb281000548a000014f30300aace12", - "0094e80300aaBBBL4;FFe08300919f3e0094e82340b9884b0037e81b40f9aa0640f9490108eb035b0054aa0240f9e01740f94801088ba82600a9a88355f8080540f9150100ebe2000054L4;FB00000000000000000000000000000000456e63617073756c6174696f6e206b6579204d414320697320696e7", - "6616c696467e6096a85ae67bb72f36e3c3af54fa5L8;FFfa0301aae23f823de88304f94a2e0094e8a743f9eab343f9e10314aae9ab43f9ebcb43f9f7a343f9e86b00f9e8af43f9f40f44f9f67b44f9f57f44f9e8e700f9BL8;FF09692138ead302f91b180094e14316917b0e0094e08f49f9800100b4e1d3", - "42f9e8cb42f91f0101ebe0840054e8cf42f9090180522a04009109692138e1431691L8;FFe05f44f922008052ca550094c55500942002805221008052c3550094a06c00b4880c8052290100902961329108400039c80080d22001c03d0800f0f2e9f35639BBBBL4;FF600500b408a30591e003c03de10315", - "aa085800a9080400f008813b91170800f90080813c1fa0003960a202a9090d40f9e843009120013fd6e80b40f91f0d00b1L4;FB73736167656465766963655f69645072654b65795265636f72645374727563747572657075626c69635f6b6579707269766174655f6b657950656e64696e674bL8;FFc800", - "80d20800f0f208090091aeffff17ff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091081c00121f09007181010054e00302aaf30302aaBL8;FF0103009021402891040300f084c01691e0030091a3630091c2008052a80f00f9117601940103009021582891040300f084401791a36300", - "9142028052b30f00f9L8;FFfa3b49f9e8d302f97a0300b4480340b20811c0da081540d2080d088b08250191481b488b0805009114000014280080525f0700b1ffcb02f9e8cf02f9ffd302f9BBBL4;FFf503082a020315cb386540a93c0302eba3070054350200340803028be10318aae80300f9e80301910", - "001158bc9b50194683340f960030191e103019122008052L4;ZDL8;FFd80000b4e00315aae10318aa22008052c8b50094ab835ff8f91b40f9f40740f95b0b00b4e0031caae1031baa22008052c0b50094ab835ff8f3031f2afb031faaBL8;FFea2703f90a078052e07f823dfffb02f9e80303f9ff0703f9e", - "a0f03f9e81b03f9e91f03f9cf350194e1fb44f9810000b4e0ff44f922008052be350194e0c31791L8;FF0081853c08018052e8c304f9e8832491e99304f9ea9704f9a002813ca082823cf8b704f9f9e304f9f91705f9f92f05f9f8cf04f9bf7e07a9f8db04f9ffdf04f9BBBBBL4;FF017c0353e10500343f", - "0c0071c00100543f08007120faff543f04007181020054e94b40b949000037f52700f981d20091a2630091e003082af3efff9700faffb4L4;FFa00d0054e80b40f9490280522a040091e00317aaea0f00f909692138e1230091b5e5ff97f90f40f9e80740f9080119cbff0208ebe80c0054e80b40f9e1031", - "8aaL8;FF22008052f44f42a9f65741a9fd7bc3a8c805011400200091f44f42a9f65741a9fd7bc3a81b0200141f0500b180000054f30300aa1a030094e00313aae80300aaBL8;FF3f0400f18b000054602a40f922008052c885019468d243a9090080927f2604a9740300b413c1009104000014940600f173", - "a20191c002005461025df8810000b4L8;FFe87b40f91f0500f1ab000054e07f40f901f97fd342008052c6850094e88740f91f0500f1ab000054e08b40f901f97fd342008052bf850094e89340f91f0500f1BBBL4;FFa8835ef8ca060091a18300d109048052aa031ff8607d40930969363831b1ff977f060", - "0b120030054a1035ff8a8035ef81f0101eb00120054a8835ef849058052L4;FB206261736564206f6e2073697a65732c20616c6c2073697a65732073686f756c6420626520636f727265637400000000e4624900000000005800000000000000L8;FFe04740f922008052cac50094b60000b4e04b40f9e10", - "316aa22008052c5c50094e14340f9e10300b4e02740f922008052c0c50094fa031faad7fcff17e11f40f9BL8;FF811400b5e0031faa9effff17680240f9080540f9190101eb031e0054680240f9080540f91f0119eb690d0054e00313aae2fdff972024003728fc60d3681000b5L8;FFff030291c0035fd6", - "ff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9BBBBL4;FFe0040054c40400b40a0100ab090002cb150003cb4821889a960009ebc90400541f0104ebc2060054f70302aa9f0015ebc90a0054380115cbc9e279d", - "3f40301aaL4;FB7920c023206973206e6f74207472757374656420666f722072656d6f7465206164647265737320c000224661696c656420746f2064657465726d696e65207365L8;FFf44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6680240f919631932bf0208eb61000054e00313aa13e50", - "094680640f998fe71d319693538d51a0091BL8;FFe96b40b949000037f73700f9c1b20091a20301d1e003082afb4fff9760f8ffb470000014a20301d1e003082a830c8052d14bff97a0f7ffb423000014ff5f05a9L8;FFfd7bc2a887feff176042069151000094e00313aaecfeff9760420891f30b40f9fd", - "7bc2a87ffeff17610640f9810000b4600a40f922008052be650094611240f9BBBL4;FF600300f000a03591cda5019428008052ff0f00f9ffa300a957080035560300b4e10f40f9e80740f9b70640f91f0101eb80080054e80b40f9490280522a040091L4;FFc6040051e740069102008012a520d41a02d01", - "f381fe01f78641e40b9601a40b90000042abf00006a80000054000080d21f000039007d20d4c4020034a000000bL8;FF29194b8b2905009129010aabc20600542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9050054280108ab83000054BL8;FFe0179f1ae5", - "250194880e4039690e4039f503002a1f01096be0179f1adf2501948812403969124039aa02000ad6020a0a1f01096be0179f1ad825019488164039L8;FFe8830291e0030191f1250094f8000090e8030391e083029101bb40f9ed250094e8830591e0030391eb250094c80000d008411d91f7ff453900054", - "0ad9ffe00f1BBBBBBBL4;FF8000805277000014740240f9820640f9020700b4810240f9200080396009f8b728040091490400d16d000014f503012a74040051760240f9c20640f9a20500b4L4;FFe113803da2033cada103973c20010054a2037cade00316aaa103d73cf60309aae20301ade107803d4107", - "00b53b000014e90700f9810000b4e00316aa22008052L8;FF0105805202018052f44f41a9fd7bc2a8c8190114f44f41a9fd7bc2a8c0035fd6600200f000601591c5190194600200f000c01591c2190194ff8301d1fd7b01a9BBL4;FFfd7b44a9ff030291c0035fd6e0030091e10314aa4201805223008052", - "24008052338cff97f5d340a9e2ffff1708358c521f00007101fa805200019f5ac0035fd6L4;ZFL8;FFabb35538a9931538a9c355384a01084a6b01084aaaa31538aad355382901084aabb31538abe35538a9c31538a9f355384a01084a6b01084aaad31538aa035638BBBL4;FF68020079e8b340b8692200", - "b8a9035ef8ea9303b8aa1b00b9ea7343f8685200b8e80b40f9691201f8e9634039eba300396a9200f8689201f869860039fd7b47a9L4;FB2f303639353962342f7372632f6c69622e727300237370717220696e6974696174696e6720737461746520776974682076657273696f6e20c00f20616e642064L", - "8;FFfbb302f9e85702f9e8a753a9eabb02f9e06f813de86302f9e83740f9e95b02f9e88702f9e87b40f9e89302f9e86740f9e89f02f9e8ef40f9e8a302f9e85740f9BL8;FFffd302f980100054e0431691e1031faa22008052cf180094e8d342f9e0cf42f9490180520968283808050091fa3b49f9e8d302", - "f9fafcffb5e8031faaf98792b9L8;FF09068052e02bc33d6822099b690600910001803de02fc33de9f702f90005803de033c33d0009803d9c6300917b0700919f0314eb0071005400e4006f08230591BBBBL4;FFe00500b4c8c20391e10315aa1f200039080000f92804009008c12a9160a200a9090d40f9", - "e823009120013fd6e82340391f090071a0fcff5475da40a9e083c23cL4;FB65616d2e7273001243616e6469646174652073657373696f6e20c0052068616420c01020726563656976657220636861696e73001243616e6469646174652073L8;FFa0877dad800605ada08b7ead800a06ada1837bad810203", - "ada2837cad820204ada18379ad810201ada2837aad820202ada18378ad810200ad10000014e88340f9BL8;FF9800f8b728040091490400d1110000145f2800f1880000542800028b08f1df38880ef837a00301d196e2ff97a8035cb868100037a8035df84a0340f9490108ebL8;FFcc7900949a030014f6d", - "f44f9e04316910123009102738052ce7900949800805211020014f6eb44f953000014e8074091f69b45f900230091088109918cb9ff97BBBL4;FF7f0009eb80070054e94b40f90a098052a083d73c69240a9baa8358f861040091bf0203ebe14f00f92a6101a9ea0740f92001803d2a2102a925010139361", - "103a9L4;ZBL8;FFccb90094b70000b4e01b40f9e10317aa22008052c7b90094e00319aa0110805222008052c3b90094e90b40f93f0500b100f4ff5488f242f8e087c03d8172c33cBL8;FF680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091150840f9080040f9f40", - "302aaf30300aa080115cb5f0008eba8010054L8;FF00013fd6fadf49a9fb6340f9f55b40f9607e02f9618202f9290c40f9e8830f91e1031baa20013fd6fcf341f99f0b00b1a100005468008052fa6740f9e8020039BBBBBL4;FF01f4ff97801d00b4e00700f9210400b021a01f91230400b063fc3591e023", - "009102028052c4028052e1000014c90080d248008052e24300390900f0f2e8470039L4;FFf65741a9fd7bc3a8c0035fd63500805275d200a928008092680200f9f44f42a9f65741a9fd7bc3a8c0035fd6800000f000203891c209009420008052e10314aaL8;FF080040f9280100b4080140b20811c0da08", - "1540d2080d088b0825019108fd46d300050091c0035fd6e0031faac0035fd6080040396902009029c11e91e00301aaBL8;FFab000054e03340f9e10319aa22008052c8890194df0600f12b010054e02f40f9e10316aa22008052c2890194040000143f0800b1c1010054f80300aae00318aaL8;FF1600001", - "4a80100b008010191a98300d100210091a20301d1210080526301009063c02291640100b084401291a8031ef8a9031cf8f3890094a80100b0e103152aBBBL4;FF742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9d3c90194ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300a", - "ae023009104018052L4;FB6d756d2076657273696f6e4572726f6e656f757320646174612072656365697665642066726f6d2072656d6f7465207061727479436861696e206e6f74206176L8;FFf40b42f9950100b49822009104000014b50600f118630091e000005401835ff881ffffb4000340f922008", - "052c1c90094f8ffff17f57740f9369400b4c806168bBL8;FF611240f9810000b4601640f922008052c849019460020191f30b40f9fd7bc2a871feff17610640f9810000b4600a40f922008052bf490194611240f9810000b4L8;FFcf490094f3031faa088c45f81f0500b181ebff54e8031faa080113abe3", - "020054000100d000001791c5490094f3031faa088c48f81f0500b121efff54e8031faaBBBBL4;FFe00314aae10313aa22008052f44f49a9f65748a9f85f47a9fa6746a9fc6f45a9fd7b44a9ff830291c2e90114e30300d063402791e0031faa01048052e2031caaL4;FB204c420000000000000000000000", - "000008000000000000000800000000000000204c420000000000000000000000000008000000000000000800000000000000L8;FFe083c33ce183c43ce93740f9e283c53c680200f9600601ade003c03d692a00f9e90b40f96212803d6082803c690e00f9fd7b47a9f34340f9ff430291c0035fd6BL8;FF0", - "2000014e9031faa280108ab42020054090040f93f0500b1a0010054090840f92a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108abL8;FFe17740f92015803de89301f9a10000b4e07b40f922008052c6690094e9030b91ea0740f9e81740f92015c03df87f00f9eaa30ea9e893", - "41f98082823ce8bf00f9BBBL4;FF7f0308eba82100541b0100b4a8835bf8e10f40f9e2031baa0001198bcda9019439031b8bb9031cf8f66740f9fa2700f9df0600b1e10000541f000014f42740f9L4;FF00ff073612000014280f40f9e00315aae10313aae20314aa00013fd680010037f3031f2a1403174", - "b683e00121f21346bc2010054281340f9c1520012e00315aaL8;FFe10313aad8a90094f30200b4f50300aaf60301aaf70302aaf80303aaf90308aafa0304aafb0305aabea90094e00313aa21008052340080521daa009400feffb4BL8;FF2900805209010039c0035fd6290080520a250039092100390901", - "0039c0035fd649008052098500a92900805209010039c0035fd6ff8300d1fd7b01a9fd430091L8;FF2183c03ce90f4bf9a84301d1ea0756b9eb134bf92083c33c0141803ce0675139094101f868fd60d3e9174bf9aa031bb8ea1b4bf9c042833cabc31cb8e82309b9BBBBBBL4;FFe003082ae10314aae203", - "13aaeffaff97603000b500f6ffb4a3ffff17898244f83f0500b1810000549fea04a99f2e00f99f6200b91f0900f1412e0054770240f9L4;FF0ac5003909c90039e9ab4e290acd003909d10039e9ab4d290ad5003909d90039e9ab4c290add003909e10039e9ab4b290ae5003909e90039e8431391e311009", - "4L8;FF0c300039c911092a0b3400390a3800390940003908000039ff830091c0035fd65f9000f181050054282040391fb50071a1050054283440391fb5007141050054BBL4;FF02920194c79101940004805221008052c5910194801500b4f50740f9f7830091e0a2c43de1a6c43da80216cb1f7d00f1000", - "400adc9120054010040ad8802168bL4;ZDL8;FF6800d0370a9200140a9200140a920014fd7bbea9f44f01a9fd030091140040f9f30300aa9f0600b1e0020054611a40f93f0400b140010054810000b4601e40f9BBBL4;FF2009c03da003993ce10140ade609c03de38942ade59141ad210100ad2219803d2", - "61501ad240d02adc9050091a1037cada203d73c3f0116ebe201803de18100adL4;FB5001414aaed1575a926d18dad4b0b55325ea49159797525496eabc8150faacf151ba31ff00bba28c25efba520000cd83e6ac8cbb47a8daba1ae730adbc541aa1L8;FF740080520aad40a9e90700f9e9c747f9a0039d3", - "ce0dbc33dea6b00f9a9031ef80aa541a9e027833da082c63ceae700f9e9bf00f90aa542a9e0f7803deabb00f9BL8;FF9c8301913ffeff17e043169122008052d0100094e1d342f948feff17e0431691e1031aaae20318aaca100094fad342f9e8cb42f908011acb1f0308ebc9000054L8;FFeaa209912283", - "cb3cc082893c2083ca3ce9db42f94221803d2283c83cebe20891410103ad2083c53c2183c63ce84701f9e8a70691e04341f9400501ad2083c73cBBBBL4;FF7c7204f868e207f8a8035d78696208f8a9835cf8682e0179e85f40b969e208f8e92b40f9689a00b9487d105369c209f8e93740f9689a023928f", - "d60d369720ab8L4;FB34000000000000005e0100002d0000006d6573736167652066726f6d20746f6f2066617220696e746f20746865206675747572657365745f7265636569766572L8;FF08020037750240f9a80640f9160100eb62020054e80f41b2e80300f907000014c90080d248008052e02300390", - "900f0f2e8270039e90300f9e0030091dce6ff97BL8;FFf31300f9fd430091e90301aaf30300aae10200f021883791e8030091e00309aae20180520f72019468620091e10200f021c43791040300d084001b91e0030091L8;FF08fd46d30900088b200500911f0008eb89190054e1431691880e0094e1d342", - "f9e8cb42f91f0101ebc06d0054e8cf42f92a040091c02202914901805209692138BBBL4;FF21040054aa435ab85ffd0371c80300544a1d00135f0100716d030054e92f03a9a98356f8a06303d1e82300f9a80358f8ea0f00b9aa0355f8e92301a9a88359f8L4;ZBL8;FFff030391c0035fd6f90300aae003", - "15aacef9ff97a80e40f9a90240f9e00319aad3ffff17a00100f000a03c91a20100f042a03d91c1078052efb1009420008052BL8;FFe2db823d5ff1ff97f3f742f9e8ef42f97f0208eb61000054e06317911a68ff9708068052e1f342f9e02fc13d6906089be8f35639e133c13de237c13d62060091L8;FFe", - "80000f0e05a803d08b140f9fb6b4ca91f0d00f143070054e8432a91e0c324917559fe97e84b45f91f0500b1003f0054e85345f9e9b30e91e002c03de95303f9BBBBBL4;FFfa6705a9f85f06a9f65707a9f44f08a9fd03019109304039490c0037170040f9f40308aa160840b9b50180d2f30300aae80e40f", - "91500f0f2f60f00b9e80400b4L4;FFd582009104000014940600f1b5c2009180010054a1025ef8810000b4a0825ef822008052c3010094a1825ff8e1feffb4a00240f922008052be010094f3ffff17L8;FFe00315aa21008052f40315aa36008052c5010194a0feffb4080740f9f50300aae00314aa02000", - "0143500805209fc4ad30a088052f4031faaf5ff03a92911c0daBL8;FF21ffff54e00300910f820194f44f43a9f51340f9fd7b41a9ff030191c0035fd6080040f9002540a9220d40f940001fd6ff8300d1fd7b01a9fd430091080040f9L8;FF0825019109fd46d30800098b080500911f0109eb296d005417", - "0117abc2db0054b700f8b6f8031faae00318aae10317aacd810094170800b4ba810094e00317aaBBBL4;FF0206005408038052e90b40f94027089be8033aaa8802088b0805088b02f17dd3165c40a901600091c4c10194f30f40f9940600d1740a00f9f60000b4df0600b1L4;FB6e6465782e63726174657", - "32e696f2d313934396366386336623562353537662f62797465732d312e31322e312f7372632f62797465735f6d75742e7273001c70L8;FFe91f02f9e01b813de217813de113813d96150094e20fc13de313c13df60741b2e41bc13de00bc13de107c13de20f06ade317c13de89f40f9f58300f9f56b40f9", - "BL8;FFe00313aae10316aae20315aad1000094760a40f9680240f9080116cbbf0208ebe9f8ff54e00313aae10316aae20315aac8000094760a40f9c1ffff17fd7bbca9L8;FFcc4100947f660539f44f42a9f50b40f9fd7bc3a8c0035fd6735256a9880240f9680000b4e00313aa00013fd6810640f9c1fef", - "fb4820a40f9e00313aaf44f42a9BBBBL4;FF81008052f0e1019420b00035e85341b9e89b00b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1L4;FB7468496e76616c69644f75747075744c656e677468496e73756666696369656e7452616", - "e646f6d6e65737300000000001ced4800000000006a00000000000000L8;FFe10309aad0e10094000200f000402391cee10094fd7bbca9f85f01a9f65702a9f44f03a9fd030091330840f9f70301aaf40300aa130300b4f60640f9b9e10094BL8;FF21b42f91a32300d162018052e40314aaa8831ff81462", - "019468c20091c10200f021b42391a32300d122018052e40314aaa8831ff80c62019468220191c10200f0L8;FF1ffdff97601a00b5a0f5ffb4a2ffff17898244f83f0500b1810000549fde04a99f2e00f99f6200b91f0900f141180054e00313aaf0fdff97e0080036811400b5BBBL4;FF200f0037882a403", - "9892e4039410300f021203e918a3240398bd2407808bd70d3e083c03c420300f042801891e0230091a34300d1082109aa6905c05ae083803cL4;FFc21200f9c5ffff1700430891ce030094e4ffff1741400d9142c00d913f1400385f0001ebc1ffff54200310912100805201400e39e2ffff170043089108", - "040094L8;FFa8831ff818a2009418a20094f44f43a9fd7b42a9ff030191c0035fd6ff0301d1fd7b02a9f44f03a9fd830091140040f9e00301aa810100f021381d91e8230091BL8;FFc315005495fe45d32a0115abc2150054bf0202ebe30100545f0101eba3010054610240f9200015cb370015cbc921019", - "489124092c80215ab770200f9690e00f9BL4;FF600e40f922008052ca210094610240f9810000b4600640f922008052c5210094602e40f9a00000b4613240f9610000b422008052bf210094611a40f9810000b4L3;ZBBBBBBBBBBL4;FF42203391d01e0294400400d000601791cb1e029460040090004012", - "91cb1e0294400400d000a01691c81e0294400400d000401691c21e0294400400f000402991L4;FF1f0400f1010c0054a8835cf8090540f9292100f1a30c00540a0140f94b8540f80a2500a9eb2f00f9e1ffff173f040071a00100543f08007121020054e1430091L8;FFcc1e0114f44f42a9fd7b41a9ffc3", - "0091c0035fd6800200900080139183020090630013918402009084202491a20700d161058052cf1e0194c0035fd6fd7bbda9BBL4;FF21040054f46f41a93b0c00b468071b8be9f301b2960a40f9695595f208f17dd31a6100d148ff43d3087d099bd50208ab42010054970640f989620091e8031aaaL4;FF", - "48010054040080d2d3010837637e4093081b80d2010000d401f7ff97f30b40f9fd7bc7a8c0035fd6b2f6ff97e10300aa8201805200008092220000b9f8ffff17L8;FFe00301aa810100d021001a91e8030091a2018052139f009468c20091810100d021881591a40100b084a00a91e0030091a3630091a20", - "08052a80f00f90a9f0094BBBL4;FFefde01941f1000312150005439feffb505000014e043059181008052eade0194604f0035e85341b9e83b00b957ffdfc8770000b5e3de0194f70300aaff0600b1L4;FB581244000000000050114400000000003010440000000000540e440000000000d0104400000000", - "00e013440000000000d8124400000000003010440000000000L8;FFeaa317a9284446a92a684aa9e8ab00f9281847a9eaaf18a92a2c4ca9e8a71aa9286c48a9eaeb00f92a4850a9295c49a9eb9b00f9e85300f9e8979f1a08219f5aBL8;FFf65747a9f85f46a9fd7b44a9ff430291c0035fd6e00308aacd5", - "6ff17e30302aae20301aac10200d021203e91de5e0114fd7bbaa9fc6f01a9fa6702a9f85f03a9L8;FF2911c0da291540d2290d098b29250191891a498b29050091200108ab220a0054e10313aa85fbff97b7010034610a40f9680240f91f0101eba0090054680640f9BBBBL4;FFf66300b9d8f9ff97a80a4", - "0f9a81000b409fc79d3e1e7076fef031faaaa2e40a9ed031faa200d010ea87301d10e0c805210000b8a426970fc438c202e7100669eL4;ZFL8;FFe1031faae8ffff17c00400b5e00313aab2fdff97e80301aae0000036280500b5e1031faae0ffff17e1031faa880600b9ddffff17e1031faa880200b9daf", - "fff17BL8;FFfd7b02a9fd8300910a0040f969028052e80301aa4a0141d25f8d00f14931899a0a0300b04ac901918b0000104c7969786b090c8b60011fd60920009121030090L8;FF0800098b080500911f0109eb281300546a000014f7031faaf50314aab60e4ff8df0600b180170054e00315aa35eeff97", - "080040b20811c0da081540d2080d088bBBBL4;FFecffff17e0c30591e10314aa22008052230080522400805235b1ff97f4c340f9ebffff17e0c30591e10314aae20315aa23008052240080522db1ff97f4c340f9L4;FB6f2d313934396366386336623562353537662f70726f73742d302e31342e342f737", - "2632f656e636f64696e672f766172696e742e7273002f636172676f2d7265L8;FFffc3029126bcff17ff8301d1fd7b03a9f52300f9f44f05a9fdc30091f40301aaf30300aabfbe009400048052210080521fbf0094400400b4f50300aab9be0094BL8;FF4a194b8b4a050091090100b42b0140b26b11c0da", - "6b1540d26b0d0b8b6b25019129194b8b2905009129010aabc20600542a0140b24a11c0da4a1540d24a0d0a8bL8;FF61f9ffb4f1000014e20313aa430c805214f9ff97e10300aafaffff17e1031faae86b00b9f7ffff17680240f9080540f9190101ebe2000054aa000014e20313aaBBBBBL4;FF610a40f96", - "80240f9960640f91f0101ebe00f0054680640f929040091e00315aa690a00f91c692138e10313aa2dfaff97770a40f9680240f9080117cbbf0208ebL4;FF091141f8089141f8e92b10a9e87f00f91c040094e86b42f9e96f42f91f0500f1e99300f9c03f0054fa7342f9e8a740f9a80000b4e1af40f9e2a7", - "40f9e0031aaaL8;FF3fb5007161050054093440393fb5007101050054094840393fb50071a1040054095c40393fb5007141040054f30308aa080040f9099040b80ae040b8f40301aaBL8;FF542340f9b4031df8b40100b58200001436008052571740f917fcffb538008052482740f91f0500b121fdff541", - "9008092542340f9b4031df8f40e00b4080d8052L8;FF84401291f303002a00210091e2230091f40301aa21008052e82700a9f98e0094e003132aa80100d008e14039810240791f050071c0fbff549ee7ff97f44f42a9BBBL4;FF2803178be82700f9360300b4e12740f9e81f40f9b72e40f91f0101ebe01e", - "0054e82340f929040091e00316aa1c692138e1e30091e92700f92abaff97f82740f9L4;FB016372f75a0f7686425460cd361e489549405c3c31bef99879f22ea0a686816f443e29147616b47240e1051b0595e8330bdda28c02cd2ea6a91191950000ea27L8;FFe1030aaaea0308aa08018052e9b700f9e9", - "af40f9e87300f9ef6741a9e9c700f9e9df40f9f6134ba954f6ff170a00809288018052ebe300f9e82b0ea9fbbb4ca9BL8;FFe94303b98041883c8021c03de95343b9811d803d8182823c8082833ce98b01b98082c23c8112c03de8bf40f97a0200f98002803df45744a9e8ab00f9610a803dL8;FFe9d742f", - "9f5c742f9f7cb42f9c80240f9f43b42f940818f3ce9e304f9680000b4e00314aa00013fd6c10640f9810000b4c20a40f9e00314aabe4e00947f0b00b1BBBBL4;FFc9ee0194a01100b4e10316aae20313aaf50300aacfee0194f61640f93a008052160200b4f91240f9beee0194e00316aa21008052bcee01", - "94601000b4e10319aaL4;FB627566484d41432063616e2074616b652061206b6579206f6620616e792073697a65000000000000019d4800000000004d000000000000001800000026000000L8;FF633c1691e0030091220280526400805223000014c80080d2e0230039e00300910800f0f2ff270039e803", - "00f9e0e3ff97e80300aa210200d021701e91230200d0BL8;FFf44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd620008052e10318aad06e019400018052e10315aacd6e0194ff0302d1fd7b02a9fc6f03a9L8;FFfc0740919c830191fbf9ff17f60300aae043169122008052dd110094e", - "1d342f9e00316aa02faff17e043169122008052d7110094e1d342f94ef9ff17e0431691BBBL4;FFed3309b8ef330179eca700b9e7d300b96d880094a8035c38bc935c381f05007121090054a8835c381f050071ac0b005428170035e90f41b2bc000014495f40f9L4;FF1f0540f11731999a7f0348f169fa", - "ff5412000014df021ceba3040054f70300aaa08300d1e10315aae20314aae30316aa23000094a8035ef81f0500f1c0030054L8;FF0801094a4901104a8a010b4aabc35eb80801094a4901034a6b39000a0801094a08010b4a89021b8b3f0500b160040054097d18536a0240797b0700b1e95a6978BL8;FF2", - "1020054e0a34fa942030291e17740f9081140f900013fd6e06b01f9e8c31791e16f01f9290c40f9e1830b9120013fd6fcfb42f99f0f00b101010054c8008052L8;FFf30308aaa08741ada82b40f9a90700d1ff0300f9e00700a9a0e300d1e1030091e20f01a9a26301d1e82706a9c80000f008812391e417", - "02a9e61f03a9e00702adBBBBBBL4;FF20008039c001f8b729040091080500d1892200a925000014c90080d248008052e04300390900f0f2e8470039e90700f924000014e80741b221000014f50302aaL4;FFe8ab0bf960838b3c4083cd3c29459f9a61838c3c4183ce3c3f0500f160838d3c4083c73c6183", - "8e3c4183c83c6083873c4083c93c6183883c4183ca3c6083893cL8;FFe8164038e3030091e00313aae10314aae20315aaf96300a9a8730039e2160194a0000035d60600f1c1feff54e0031f2a0200001420008052f44f45a9f91340f9BBL4;FF291cc0392b1d00124a550b0b4a0148510901f83708710a8b", - "0a01805208a800a91f0000f9fd7b44a9ff430191c0035fd6497d1c53a90700340900be524901090bL4;ZBL8;FFc0035fd6fd7bbea9f30b00f9fd030091080040f91f0900b1a1000054e0031faaf30b40f9fd7bc2a8c0035fd6080141d2e90080521f2d00f10831899a690100f0BBBL4;FF0088202e09a901", - "a90c00669e8cc101920cad00a9c0035fd6fd7bbea9f44f01a9fd030091490400b0290140f94ad03bd55301098b694240393f05007181010054L4;FBd8184900000000004c00000000000000e20000003100000090194900000000004d000000000000005f0300001c000000da1a4900000000005b0000000", - "0000000L8;FF28a007910001c03deba300f92ba04fa9e0f3803dea2f13a9e8a701a939a450a92aa051a9eaa704a9e80b00f929a052a9e84300f92aa053a9e8a706a928d054a9BL8;FF008f0054e8cf42f9090180522a04009109692138e1431691ead302f9780f0094e88349f91f0500b1c0000054e80740", - "91e143169108810991008102919b120094L8;FFe0a33239e08332910800f0f2ffa73239e85306f9e64bff97e80300aae85306f9e08332912101009021c03991a20180522301009063603a91240180521e4bff97BBBBL4;FFfc5f01a9f65702a9f44f03a9fd030091ff830bd109804039f30300aaf40308aa", - "a90100343f0d007161070054602241a9090d40f9e803009120013fd6e80340f9L4;FB6c5f7075626c6963656e637279707465645f73746174696353656e6465724b65794d65737361676553657373696f6e53747275637475726570715f7261746368L8;FF160101eba2020054e80f41b2e80300f9070000", - "14c90080d248008052e02300390900f0f2e8270039e90300f9e0030091dfebff97e10300aae00301aaf44f47a9BL8;FF040300f084400f91a363009182018052a80f00f91477019468c200910103009021442591040300f084c00f91a363009182018052a80f00f90b77019468220191L8;FF28008052ff1", - "700f9e80700f9e0074091e8c33f91e103182a00c035915dbeff97e80348f9c8f100b4e1ff47f92800805248030039280040391f050071c1f10054BBBL4;FF600640ad8a0300904a6119910b1c0091002502a98b0200f90b180091000509ad620241ad016101b902010aad400540ad0a0400910a2505a90a0", - "800910a2508a9L4;ZDL8;FFa1a300d142008052760000b9e00300ade00301ada8a73ea929100094f59744a9c001009000c02e91e603009101048052e20314aa0304805207088052e40315aaBL8;FFe83200f9e30a803d75fdffb5e81b41f91f0500b1e00d0054e94b42b9e84f42b9f62341f9e9230529e85", - "b42b9e82700b916aa00b4f31f41f9ba360194e00316aaL8;FF1a0080920300001428008052e80700f978b640f9694a42b9684e42b9fadf03a9e9230629980100b475b240f9bd360094e00318aa21008052bb360094e0e000b4BBBBBL4;FF800640ada08300d1a0073faddc0602941f040031200a0054f40f", - "40f9760080520800001400010039b402148ba08300d1f40f00f9d20602941f040031e0080054L4;FF155000a9810000f021000291131000b91f500039f44f42a9f50b40f9fd7bc3a8c0035fd60001805201038052d9060094fd7bbea9f44f01a9fd030091f303012aL8;FF01f57ed342008052ca06019468", - "6e40f9a80000b4607240f901f57ed342008052c4060194687a40f9a80000b4607e40f901f57ed342008052be060194688640f9BL8;FFf85f4da9fa674ca9fd7b4ba9ff030491c8860114c38601948004805221008052c1860194401000b4284d8e52290300b029850991a88cac72200540ad082000b9L8;F", - "F5f21296be100005415054079b37e0853a88358f8ff0208ebe0140054a80000141368b99b680240f91f0500b121130054e12340f91f0001eb22280054e81f40f9BBBL4;FFe0030291e82b08a922a30094a00300d000c02391a20300d042002591010a8052f5c6019420008052e10314aacec60194fd7bbaa", - "9fc6f01a9fa6702a9f85f03a9L4;FB7374632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c6962726172792f636f72652f7372632f6974L8;FFebfb42f9f6031aaaece342f9eddf42f9e0c30391e10319ad028543ad0019c03de1030e9102298", - "052ec4300f9ece742f9fa9742f9e28716adfca742f9f4c742f9BL8;FF2aa040a9290040f90dfc6ad35369283808050091280800f90dfeffb43f0108eb7361193220010054536928380cfc71d308050091290040f9280800f94c0200b5L8;FF000100b000e01c91cd460094000100b000c01591ca46009400", - "01009000203691c746009408004039090100b029812091e00301aa08711d5308410051081d7d92BBBBL4;FF734a1091f402805205000014f63340f9f30300d07302109154028052f53b40f9ba0000b4e1031aaa22008052c1e60194e13740f9d60000b4e02340f9e10316aaL4;FB20646563727970743a20", - "c0002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d62353864376635366533363435636364L8;FFe0030b91e1830591022c8052d1e60094e0030b9196e1ff97f50314aa69018052a18e41f8280041d23f0000f10841899a1f2d00f1c2020054880240f9a80000b", - "4BL8;FFe00309aac20280521667019468420091e1020090210c2491e40200f084a03291e0030091a363009162018052a80f00f90d670194e102009021742a91e40200f0L8;FFcc660094681e40f9a80000b4602240f901f97fd342008052c6660094682a40f9a80000b4602e40f901f97fd342008052c066", - "0094683640f9a80000b4603a40f9BBBL4;FF091440f93f8100f1c1020054091040f92b9140b82a1140f82dd140782c0140390b1101b82b7d40390a9100f82af140f8297141f80d5101780d0880528c111d12L4;FFc300030a831800b9bfffff1766824039087c4093c61000127affff17210000b042c00d9", - "121401d913f1400385f0001ebc1ffff54810210912200805222400e39L8;FFe10308aa6200805208a70014a80100f008c10491e00301aae10308aa6200805202a70014281040b96800c8376800d037ffa60014ffa60014ffa60014ff0301d1BL8;FFe3030091e00308aae7260194fd7b41a9ff830091c003", - "5fd6ffc300d1fd7b02a9fd830091e82300910900009029112591e0a300a9200440a9820200b042883991L8;FF686604a9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd620008052e10317aace26009420008052e10319aacb26009420008052BBBBBBBL4;FF5f1000f1890", - "08052082100913731889a1a000014480400b008611991000540ad600600adf44f43a9f65742a9f85f41a9fd7bc4a8c0035fd648fc7dd3a80800b5L4;FF5f0700b1e1020054e00bc03de00300adb70000b4e00318aae10317aa22008052c41a0094f7031caaf8031baae11f40f9c10000b508000014600bc0", - "3de003803dL8;FFc0035fd6f7031faae00317aae10314aad51a019408fcdfc8081140f91f0500f1e0179f1ac0035fd6ffc300d1fd7b02a9fd830091280200f008c10d9109200091BBL4;FFea0309aacb6a69380c69693829050091ff0209eb8b010b4acb6a2a3821ffff54f7430339ebab40a908028052e9", - "4303916a7100a96a0900f92a01088b08210091L4;ZFL8;FF810100b021101591a401009084c01891e0030091a363009142008052b30f00f9119b0094119b0094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9BBBL4;FF63002191c40300d084603391e243059161028052e8430539d6da0194", - "2000805201088052d0da0194ff0302d1fd7b02a9fc6f03a9fa6704a9f85f05a9f65706a9L4;FB0f000000000000000a0000000000000008000000000000000c00000000000000d813490000000000de13490000000000ea13490000000000f913490000000000L8;FFe80f42f9e90742f9eebf42f9f0c742", - "f9e2cf42f9e8cf00f9e81742f9e0f3803de8c300f9e81b42f9e8ab00f9e81f42f9e92312a9e82342f9e92742f9e8ab1aa9BL8;FFc1f10054e0074091e14306910274805200800991f807409118830991cd5a0194e0074091e84316910080099100980094e08741ade217c03de8eb46f9f94b09f9L8;FFe10", - "318aae20314aaf60300aad15a0094f88332913c000014e8c31791e00313aa9f5a009469624039280100d008950691ca028052e80b03f9f5fb45b9ea0f03f9BBBBL4;FF09804039f30300aaf40308aaa90100343f0d007181070054602241a9090d40f9e803009120013fd6e80340f91f0d00b10103005488", - "0200f96800805228000014L4;FB6d657373616765206c696d69743a20c0092c20696e6465783a20c00b2c20636f756e7465723a20c00076656e646f722f6c69627369676e616c2f727573742f70L8;FFe00317aae10316aa22008052c9fa009417010014e1430091e20313aaf70b00f9f73f00f97d050094", - "e08743adf50300aaf4cb00f9e0870aade28344ade2830badBL8;FF613240f9742600f93f0400f18b000054603640f922008052c67a0194680a40f929008092693200f91f0900f1c0000054610e40f9810000b4601240f922008052L8;FFe11740f9e00317aab3fcff176001009000601c91ca7a009460010", - "09000a00f91c77a00946001009000003e91c47a00946001009000e00d91c17a009460010090BBBL4;FFe90340f91b0d00d1ea2300f9550200b4f32b40f9fc1b40f97fbf00f109310054e94340f91bcd00d1480080d20800f0f2a06301d12901168ba8831af834cd0091L4;ZBL8;FFa20303d1e00318aaf8e", - "b00a9b40303d1fb1300f942bb0094c2ba00940004805221008052c0ba0094602e00b4a8e300d1f80300aadc0ec0da000540adc80100b0BL8;FF23f9ff54a00200d000200a91cc3a0194490080524afdff35ea031faa4901098b200108aba2010054f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035", - "fd6L8;FFf5230ba9e8ff41f9e90342f9fb0742f975c643f9e86b00f9080340f9e95700f9680000b4e00315aa00013fd6010740f9810000b4020b40f9e00315aabd3a0094BBBBBL4;FF3bfdff97770a40f9680240f9080117cbbf0208eb89dcff54e00313aae10317aae20315aa230080522400805230fdff", - "97770a40f9dcfeff17f80300aae00313aaL4;FFf50304aa6b0104cb9f020bebe8020054010100b4a17c019be00302aae20315aae30314aade0a0094800100b507000014340100b4bb0a0094e00314aae10315aaL8;FF01098052e30a0194ffc300d1fd7b02a9fd830091490200f029c13e910a0000904ae1", - "2491400200f000803f91e92b00a96902009029610891e1030091e92b01a9BL8;FF42402791e10a8052fb8a0194ff0307d1fd7b16a9fc6f17a9fa6718a9f85f19a9f6571aa9f44f1ba9fd830591f40301aa3f2000f1f30308aac8000054e80b41b2L8;FF140940f974ffffb4130540f997fa7fd3c48a0094e", - "00317aa41008052c28a0094003e00b4e10313aae20317aaf5df07a9550b158bf60300aac68a0094b5064079BBBL4;FFb7035ef81dffff17a0c300d1e10317aae20316aa230080522400805234bdff97b7035ef8ba035df8480317cbdf0208eb09e4ff54a0c300d1e10317aae20316aaL4;FB000000000000", - "000008000000000000000800000000000000dcfb450000000000000000000000000008000000000000000800000000000000acfc450000000000L8;FFf4d741f9e8e341f9fce741f9e95b00f9e87700f9e0f30da9f46700f974a400b4c0ca0094e00314aa21008052beca0094c0fe00b4e16f40f9e20314a", - "af70300aaBL8;FF603a40f901f97fd342008052c94a0194684240f9a80000b4604640f901f97fd342008052c34a0194684e40f9a80000b4605240f901f97fd342008052bd4a0194L8;FF2925019129fd46d30801098b130500917f0209eb69240054080c47f81f0500b1201d0054e2feff97080040b20811", - "c0da081540d2080d088b0825019109fd46d3BBBBL4;FFa203dd3ca303de3ce3ab803de2a7803de1a3803de09f803db90dc0dae83f40f9000c0054e08742ade24740f9ff1701f95ffc00f1ff1301f9610204ade08741adL4;FB0800000000000000847a420000000000000000000000000008000000000000", - "00080000000000000094794200000000004572726f720000000000000000000000L8;FF2a040091e00315aa6a0a00f909692138e10313aa42eaff97770a40f9680240f9080117cbbf0208eb480b0054680640f9e10316aae20315aa0001178bc5ea0094BL8;FF08012a91210e0054081140b91601162afc0", - "31aaa590d00359f0217eba2000054390080522e000014ff0214eba8ffff54880217cba902178b1f4100f1c2010054L8;FF21080054e8cf40f9e9a341b9ec030b91eaa741b9e86301f9e9cb02b9eacf02b9080380d20800f0f21a1100d1e9d342b9204bc03d8101c03de88f01b9e94303b9BBBL4;FF7f2200", - "39680200f926000014f6031f2ae003162ae1aa01941f1c007281f8ff54e80300b008b140f91f0900f1a3020054e8830091490000f029211591e82703a9L4;FF730540f929008052eeffff1789000036f70308aa180080920d000014e001805247030094c0faffb4280000b008d90191f30300aa090140f90", - "87140f8f7018052L8;FF090000f9780100b515000014ea0740f94800805209008092e083009148210039490100f9c0a3ff97f40b40f9980100b4b322009104000014180700f173620091BL8;FF1b2100d14003803de863019100610c91dddeff97c8fdff17f83f42f92083c13ce9d742f9f5c742f9f7cb42", - "f9080340f9c0828d3cf63b42f9e9d304f9680000b4L8;FFff0316b9e81700b9fe290094e80356b9e00740918100805200001891ff0316b9e81300b9f7290094e80356b9e00740918100805200001891ff0316b9e80f00b9BBBBBBL4;FF200080398000f8b728040091490400d1110000145f2800f1880000", - "542800028b08f1df38e804f837e0030091957b0094e80340b9080a0037e80b40f9ea0640f9L4;FFa04700d18cc4ff97e05301b9a04700d189c4ff97e04b01b9a04700d186c4ff97e04301b9a04700d183c4ff97e03b01b9a04700d180c4ff97e03301b9a04700d1L8;FF29114c0b0a0800396ac100118b0d", - "00122c0c403929c100117f2500710a0c00390910003909819f1a9f7d02710a819f1a8d0d00122e10403929010b0b4a114c0bBBL4;FFfd7b51a9ffc30591c0035fd620008052e10315aad49201942000805261028052d192019420008052e1031aaace920194ff4301d1fd7b02a9f65703a9f44f04a9L4;ZD", - "L8;FF8300005426000014e80308ab82040054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab22030054091440f9BBBL4;FF4a413b91c90280520a2500a9c0035fd6ff8307d1fd7b18a9fc6f19a9fa671aa9f85f1ba9f6571ca9f44f1da9fd030691160", - "c40f9140040f9f50305aafb0300aaL4;FB096b557e2ddf654f1812424f6624a0f32061370cf575f1db175d3c3317640cc06fcb39780cfd72f23b99e3eedec2bbe9f44d37430607d11b0000fb887781f1dbL8;FFe86f00f9e8af42f9e85f00f9e8b342f9e8e300f9e8b742f9eaa30aa9e8bf42f9e83f00f9e", - "8c342f9e9a31da9e8cb42f9e9d342f9e8f700f9e8cf42f9e82f00f9BL8;FFe0431691e1031caae2031aaad1110094fcd342f9e8cb42f908011ccb5f0308eb492aff54e0431691e1031caae2031aaac8110094fcd342f94cf9ff17e0431691L8;FFe15bc13de87345b9cfffff17e89340f9c80000b4080508", - "8be00313aa0201805201f17dd3c3520094e063c13de167c13db47e0853e8a345b93c008092e00718adBBBBL4;FF1700f0f21f0500b1a0010054f40300aa004c40f9a8e300d1815240f9c2c80094a8835c381f050071210100540804009008210c91090480524f000014e80300f0L4;FB0800000000000000", - "ac05430000000000000000000000000010000000000000000800000000000000d8f442000000000063616c6c65642060526573756c743a3aL8;FFe1031faa882600f9d3ffff17e10c0054e0031faa93ffff1721050054e0031faa86ffff17c80080d2e00700f90800f0f2080900d177ffff17e90b41b2e92", - "300a9BL8;FFa99358384a01084a6b01084aaa731838aaa358382901084aab831838abb35838a9931838a9c358384a01084a6b01084aaaa31838aad358382901084aabb31838L8;FFe08b0054e8cf42f92a040091802202914901805209692138ead302f9bb2b0094e1431691850f0094e09b49f9800100b4", - "e1d342f9e8cb42f91f0101eb008f0054BBBL4;FF0a0140f94b8540f80a2500a9ab0313f871ffff17a26301d1830c8052d698ff97a0edffb4a8000014190600b428008052a14301d1a26301d1bf233ba9bf031cf8L4;ZBL8;FF6b000014081c40f9f40300aa080101eb230700549b0e40f91f011bebc20600", - "54e80328aa3f0101eb7c03088b600800549f0b00f1812200f983060054892240a9BL8;FF2d270094e15346f906000014e80f41b2e0833291e85306f9e5270094e10300aae15306f9e0833291a102009021c00a9102028052a302009063c01891a4028052L8;FF2d27ff97f64b45f9e0432a91e1c32491022", - "b8052cf320094e0432a9140f1ff97f70316aa69018052e18e41f8280041d23f0000f10841899a1f2d00f1e20a0054BBBBBL4;FF2004009000601091e1020294ffc303d1e923086dfd7b09a9fc6f0aa9fa670ba9f85f0ca9f6570da9f44f0ea9fd43029109604039290e0037156040a9f40308aaL4;FFe8af", - "01f9e87740f9e0071bade082c83ce182c73ce8c301f9e89f40f92083883ce20245ad2183873ce182cd3cead701f9eab340f9e2831dade082cc3c21838d3cL8;FFb40000b4600640f9e10314aa22008052c8020194610e40f9810000b4601240f922008052c3020194743640f99f0600b1e0020054735647a", - "9950100b476220091BL8;FF8200805209830114080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091010300f021802991240300d084e02191e323009182008052L8;FF4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7b", - "c1a8c0035fd6e00308aba3ffff54600100d000603e91BBBL4;FF3f050071a1020054e9e34039140180d21400f0f23f050071cc05005489080035ea0f41b24800001408008092a903009029413f91680200f908038052692202a9L4;FB6a00000000000000950000002e00000011000000000000001400000", - "0000000001400000000000000007449000000000011744900000000002574490000000000L8;FFe1031baad8c2009420008052e10314aad5c2009420008052e10319aad2c2009420008052e10316aacfc20094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9BL8;FF680640f9090180522a040091e003", - "17aa6a0a00f909692138e10313aa78fbff97560300b4610a40f9680240f9b70640f91f0101eb80080054680640f949028052L8;FFc942009440f8ffb4fb0340f9e2031aaafc0300aae1031baace42009418000014e8ef41f9080f00b4e9f341f9e80302f9e8830591ea0310912b0000f06b612191BBBBL4;", - "FF00030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb43cf00541803008bf9feffb50f0000141f0400b1a1ce0054L4;FB5f000000050000002aea480000000000540000000000000065000000050000002aea4800000000005400000000000000730000000", - "50000002aea480000000000L8;FFf9431e91b62e0094e8cb43f9f5cf43f9fa031c2af6d343f9f8d743f91f0500f10114005408008092a02302d1766201a9685600a95eddff97e0430f91eaddff97BL8;FFfd7bc3a8c0035fd60001805201068052e0620194ffc300d1fd7b01a9f31300f9fd430091e90301", - "aaf30300aac10200f0215c3091e8030091e00309aa22038052L8;FF0dfc6ad35369283808050091280800f94d0200b5e0030baa61000014e10300a9e00301aae10309aa22008052f4030baad7050094e10340a9eb0314aa2aa040a9BBBL4;FFe00317aae10316aa22008052c9a20194f44f59a9f65758a9f", - "85f57a9fa6756a9fc6f55a9fd7b54a9ff830691c0035fd6e0030191e10319aa2200805223008052L4;FF8600003402e05f7842040011421c001206c05f38c6eaff353fc122eb82010054231543aaea03292a630843aa631043aa4b00030a4200030a3f0102eb62010a0bL8;FFe00301aa090140f93f0900b", - "1a1000054810100f021fc15918200805203a30014ff8300d1fd7b01a9fd430091810100f0210c1691a40100d084802491e3230091BL8;FFf44f48a9f53b40f9fd7b46a9ff430291c0035fd6290080528a0200b04a210e911f7d01a90a2500a9f44f48a9f53b40f9fd7b46a9ff430291c0035fd6a9831ff8B", - "L4;FF350200b49682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef822008052c2220094c1825ff8e1feffb4c00240f922008052bd220094L3;ZBBBBBBBBBL4;FF296be838a903f836092100d10afc79d3eb0336aa2901148a0b1b0b8b2a6b28382903098be80328aa7b0700d12", - "a210039281b088ba90600d1610141ad3501158aL4;FFea9342b8eb2f40b9e80b00f9e9630039aa1b00b9abb301b8e80300f9e92300390a000014f7ef43a9e017c03df62740f9e00b803dfafe48d398faffb5d7ffff17L8;FFfd7b41a9ffc30091ca1c0114f44f42a9fd7b41a9ffc30091c0035fd68002009", - "000a01c91c61c0194800200900080139183020090630013918402009084001d91BBL4;FF4a1100116d09c05aa8273429ada335296d050011ad09c05aac831ab8ada337296d090011ad09c05aa9b33629ada33929680d00110809c05aa9b33829a8c31db8L4;FF81fc5f883f00006b8100005482fc018881f", - "fff350a000014bf3b03d510000014e00304aa010080d2010000d40c000014bf3b03d50200023240fef736427c4093L8;FF6b0d0b8b6b2501914a194b8b4b0500910a3040f96901098b0a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091490109abc2040054BBBL4;FF09a700", - "3908ab0039e8a7492909af003908b30039e8a7482909b7003908bb0039e8a7472909bf003908c30039e8a7462909c7003908cb0039e8a7452909cf0039L4;FB427974657356616c7565000000000000c00f4900000000000a0000000000000014747970652e676f6f676c65617069732e636f6d2fc0012ec", - "0002f636172676fL8;FF770e0014e8ef41f9e94f00f9e9f341f9eafb41f9eb0b42f9ef6342f9e86b00f9e8f741f9ec5b42f9e1eb41f9faff41f9e73742f9e8e700f9e80342f9e35f42f9BL8;FF22008052f5170af9e8130af908048152e91b0af9e9eb4df9e81f0af9e8270af908788052e82b0af9e8330a", - "f988230f91f8230af9fb2f0af9f6370af90001803dL8;FFd95c0094ff8302d1fd7b06a9f73b00f9f65708a9f44f09a9fd83019128008052f30300aa3500028bffa300a9360100d0d6e2369117008012a88300d1e0830091BBBBL4;FF880f010ef6df43a90a32805214001b8a496b74fc208d282e0800669e", - "18c101f220040054e9f301a9eb0b00f90803c0dafc0319aa0811c0da880e488b08011b8aL4;ZFL8;FFe20313aaffdf00a9ff0f00f9cffaff97c00c00b5990a40f9880240f93f0308eb61000054e00314aa56fc0094880640f9e083c03ce1031faa2823189be90f40f9BL8;FF2925019129fd46d329050091", - "0a0c40f90801098b5f0500b141fcff54e80308ab42040054091840f93f0500b180010054092040f92a0140b24a11c0da4a1540d2L8;FF60390054e81340f9490580522a040091e00315aaea1700f909692138e16300913f7cff97f71740f9e80f40f9080117cbbf0208eba8380054e81340f9e10316aaBBB", - "L4;FFe10319aa70960094e863403988070036e8834039e10740f91f050071cc0a0054680b0035e90f41b25f000014e80600d1290080921f0d00b1696a00a9a8010054L4;FB14f6470000000000200000000000000008000000000000007c0e48000000000014f64700000000001000000000000000080000", - "00000000007c10480000000000L8;FFf60300aa1c048152d2bc0094e8031faac902088b080900912a0540392b0140391f0120f12a0100392b05003921ffff54350080527f0312f1e10d0054d40d00b4BL8;FFfd7bbea9f30b00f9fd030091080040f91f0900b1a1000054e0031faaf30b40f9fd7bc2a8c00", - "35fd6080141d2e90080521f2d00f10831899aa90200d029491491L8;FFe005005468620a9169b20a910001c03d081140b92001803d69b642b968be02b9c903003660a24ca9693a40f961ba42b962be42b923a10291081540f900013fd6BBBBBL4;FF290d098b29250191e91a498b29050091962281b9d603", - "0034ca0240b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a050091958e40f9150300b4ab0240b2L4;FFd90c009420008052c1018052d60c009420008052e1031aaad30c0094e17342f9e09340f9d00c009420008052c1028052cd0c0094e17342f9e0af40f9ca0c0094L8;FFff4301d1fd7b03a9f3", - "2300f9fdc300913fb400f1e1050054090040393fd5017181050054090440393fc9017121050054090840393fb90171c1040054090c4039BL8;FF1f00086b61000054e003082ac0035fd6fd7bbfa9fd0300914003009000c023914203009042002591010a8052f28c0194ff4301d1fd7b03a9f32300f9fdc3", - "0091L8;FFa07e00b4f60300aac68c00944000805241008052c48c0094e07d00b4f30300aac08c00944000805241008052be8c0094207d00b4fc0300aaba8c009440008052BBBL4;FF190119ea41fdff54ff0500f12001005420a9200e0800669e880100b40801c0da0811c0daa80e488b08010d8ae80300f", - "9208d212e00a8302e0800261e28040037L4;FBb623bd33a003ab13c2e3c9f3d4c3dfd3eea3e5b3f883f39321732a6337533c430d3306231b13100379f372e36fd364c355b35ea343934883d885d395cea5c5b5L8;FFe8eb00b968e342a9ff0600b175ab44a9e87300f968a745a9c04900543fc3007180490", - "054080b00911f0900f123590054f80000b4e0031aaae10318aa22008052BL8;FFcc4c0194fc2740f99f1b00f103050054f8430691fb0c8092e02340f9080d8052826f089b0080c23c1a0040f901a00191e00a803d0080c33ce00e803d0080c43cL8;FF4a2501914afd46d329010a8b290500913f010aeba9", - "010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54000100f000800e91c14c0094000100f0BBBBL4;FF2000805201048052d7ec0194fd7bbda9f50b00f9f44f02a9fd030091091440f9290300b4141040f98a0240395f210071610300543f8531f101040054f50308aaL4;FB6765556e6b6e", - "6f776e5365616c656453656e64657256657273696f6e5365616c656453656e64657253656c6653656e64556e6b6e6f776e5365616c656453656eL8;FF888240391f05007101020054610a40f9680240f91f0101eb40040054690640f92a0400910b0480521f010aeb6a0a00f92b692138600400542800805", - "228692a38BL8;FFa1030054e8c340b948000037f76300f9c1320191a20301d1fb56ff9760f8ffb44a000014e8cb40b988f70737f76700f9baffff17e84b40f91f0500b160020054L8;FFe00315aa54000014e88241f8e082c03ce9c30291aafffff04ae13691400100d000981791e86300f9e86301910821", - "0091a10303d1a92b34a9e02f803dec6c0094BBBL4;FFe223803d6283c03ce08700ad6183c33c6083c43ce317803de18301ade203803d2a840094fcff403908088052f70301aaf80300aa02011ccb3a0002eba2010054L4;FF4a11407948fe2f37f3ffff17e00313aae10317aae20316aa53feff97770a40f", - "9b9ffff17e00313aae10316aae20315aa4dfeff97760a40f9d2ffff17750a40f9L8;FFf98701f9ff8b01f9fa9301f9ff9701f9fb9f01f9ffa301f9e0ab01f9ffaf01f90a000014a8035df8e97241f89f0306f1f60314aa550300f953230039489300f8BL8;FFb5df73a920b7803de83304f9e8f304f94003", - "803dffa71139e89740f91f0500b160000054e02b40f941e2ff97f4db51a9960100b49822009104000014d60600f1L8;FFe83f40f9e9620991eb1f0d39e0fb833d400941ade1ff833de003843d000540ade207843de083853d020141ade187853de87f41f9e28b853de08f853d4000c03dBBBBBBL4;FFa801", - "00b4690240f9200180398001f8b729050091080500d1692200a9200000f9e0031faaf44f44a9fd7b43a9ff430191c0035fd6e80741b2e9ffff17f40301aaL4;FFe01bc13da60000d0c6c030914183813ce11fc13d4083833ce023c13de8830c914183843ce127c13de0431391e1830891e283099163c2039", - "1e50313aa4283823cL8;FFf65743a9fd7b42a9ff430191c0035fd6e80340f91f2100f121060054e80740f91f3500f1a1070054e80b40f91f4900f181070054e80f40f91f5d00f161070054BBL4;FF370d00b48002158be10318aae20317aad0940194b502178be00318aae10317aa22008052f50f00f9c29", - "401945b0315cbe00316aa256c0094f60301aa3f001bebL4;ZBL8;FF1895009481010090219c2091840100f084802791e0030091a363009162018052b30f00f91095009410950094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1BBBL4;FFa183de3c8907009108151c8b000500ada90317f884feff178", - "13b0054f5031faa81feff17a08302d14b0b0094f2ffff17a0a302d144d50094f50301aaa0d20736L4;FB2f1c49000000000047000000000000009b0000001b0000008b1a4900000000004e00000000000000b9040000170000008b1a4900000000004e00000000000000L8;FFeb3f42f9e8c300f9e81f42f", - "9f28342f9f87700f9e28742f9ea8f42f9e89700f9e82742f9f49342f9f76b00f9f77b42f9ec9742f9e8a709a9e82f42f9e93342f9BL8;FFead302f946160094e14316917c0d0094e0ab49f9800100b4e1d342f9e8cb42f91f0101ebe0660054e8cf42f9090180522a04009109692138e1431691ead302f9L", - "8;FFeaa705f9ea032d91e86b06f92801009008551191e96306f9290080d2e87b06f9c80480524942c0f2ea7f06f90a078052ff5306f9e85b06f9ff5f06f9ea6706f9BBBBL4;FF36008052e20301aa09000014a20301d1830c8052d8daff97a00a00b5ba035cf8f7031aaae28e40f8620d00b4410340f9340", - "080399400f8b728040091490400d1L4;FB797320777269746520746f206120537472696e67000000002d9648000000000031000000000000003a00000021000000436f6e74656e7420646f6573206e6f74L8;FF3f040071800300543f080071a1020054880243f81f0500b1810000549f5e03a99f7e04a99", - "77e05a981c20091e20313aa45f6ff9740fcffb4610000143f0c0071BL8;FFc00a40921f1800f182090054c17e0353a10900343f080071ac0100543f040071e00200543f08007181faff54e8a340b948000037f85300f9e1d20091a20301d1L8;FF00011a8bd37400944803188be8d302f9e06749f9f90b40", - "f9800100b4e1d342f9e8cb42f91f0101eb20bf0054e8cf42f9090580522a04009109692138e1431691BBBL4;FFc0035fd620008052e10313aad6b40194ff0302d1fd7b04a9f85f05a9f65706a9f44f07a9fd030191f70302aae20301aae10300aae0830091f60303aaf30308aaL4;ZDL8;FF4b92e4f24007", - "00543f030ceb0e0e805210d0009128338c9a0ce179d38c1108cb687f0e9b8fc101d1a8a10e9bedfd44d3ee430191ef730091b27dcb9bad0301d1BL8;FF20011fd6a03500b5a02302d1ebecff97e0140036e1fcffb4b001001401830191a22302d107ecff9740fcffb46f010014e02e00b5a02302d1e0ecff", - "97a00d0036L8;FF003000b580074dada8035ef8f6c744f9e87b05f9e8bf44f9800702ad800b4baddf0208eb800b00ad80074cad800701ada1eeff54a02201912d6bfe9772ffff17BBBBBL4;FF4901098b6c010c8b2acdcaca8bc1cbca2981c9938c010a8b6901098b8d81cc938abdcaca2badcbca280108c", - "aa91d40d208010a8b6901098b0acdcaca0881c893L4;FFd9040094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0312d1167c4093e8ef7db2ff0300f9df0200f1e9079f1ad80209cb09ff7cd3L8;FF3f0500f14881889a1f2500f1c8090054490200f0296920918a0000102b696", - "8384a090b8b40011fd660220091f30b40f9fd7bc2a8a500001460220091f30b40f9BL8;FFff030191c0035fd608200091200440a9e92300910a0000d04ab11491e8a700a92203009042180291ea0f00f9e3430091dd840194fd7b43a9ff030191c0035fd6L8;FF48fcff54e6ffff17f44f45a9f65744a9f8", - "5f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd66001009000a03e91c78400940a0040f9e80080524a0141d25f2d00f1BBBL4;FF817e0353a11800343f080071400400543f040071e1060054e81342f91f0500b141020054ff1302f9f81702f9fffe02a9ff7e04a9f82302f9f82f02f9fffe05a9L4;FB756c6", - "c79206465637279707465643b206d757374206861766520612063757272656e74207374617465000000000000008b634900000000003800000000000000L8;FFe00717ad7b810aaae0afc13decf742f92841082aea114ff8e99148b8e193c13de00b18ade097c13d29dd78d3ec7202f8e49bc13deabb01f9", - "ea7b43f9ebe35739BL8;FF2c000014a0031df8c10200b021240e91c30200b063980e91a0c300d1420180528400805223000014a0031df8c10200b021240e91c30200b063900e91a0c300d1L8;FFe20a803d200c0054f91300f9f9430691fbe300912083cc3c2183cd3ce81f00f9e81b40f92283c33ce0e30", - "09160838c3c2083ce3cc1e2009161838d3c2183cf3cBBBBL4;FFefe401941f10003121100154f9ffff17ece40194f70300aa1f0400b141fdff54e043059181008052e7e40194000f0135e85341b9e82b01b957ffdfc8d70200b4L4;FB4d414320766572696669636174696f6e206661696c65640081e7480", - "000000000340000000000000017010000110000006c69627369676e616c5f70726f746f63L8;FF49010037e90180520921003909008092090100f9c0035fd61f21003909008092090100f9c0035fd6018840a904944329e00308aa1f2e0014fd7bbaa9fc6f01a9BL8;FFf50b40f9fd7bc3a8c0035fd60001", - "805201038052df640194ff8300d1fd7b01a9fd430091080040b9a01300d1a8c31fb819650194fd7b41a9ff830091c0035fd6L8;FFe00315aae10313aa8c010094770a40f9680240f9080117cbbf0208eb6800005455fdffb5f0ffff17e00313aae10317aae20315aad6070094770a40f9680240f9BBBL4;F", - "F600300d000801191cda401944801c0da0811c0da280d48ab020200540801018a0968e8388900f836e00308aafd7bc1a8c0035fd6000040fd00a8200e0800669eL4;FF210400d1011400f9c2fcffb4550400f981021091a30c8052820242f9800c80d2352000f9a20200f9222040f9431000b9332040f9f5", - "5b42a973620091f76343a9L8;FFa1000054a10100f021300d910205805206a50014a10100f021bc0c91a203805202a50014090040b9e80301aaaa0100f04ad10d91e00308aa420080523f010071BL8;FF080000143f0020716200005455008052040000143f404071680080521535889a680240f9080114c", - "bbf0208ebe8000054680640f93f0002710801148ba2010054L8;FF01088052e3240094fd7bbaa9fb0b00f9fa6702a9f85f03a9f65704a9f44f05a9fd03009119e040a9f60300aa344c40a9f50302aa370840f9b80400b40807188bBBBBBBBL4;FF02018052f44f42a9f65741a9fd7bc3a8c8180214f44f42", - "a9f65741a9fd7bc3a8c0035fd6c0035fd6fd7bbea9f44f01a9fd030091088040391f0d0071a1010054L4;FFf50301aaa81300d189008052e00705a9a08300d1e103019142008052e82704a9c3100094b50000b4e00317aae10315aa22008052bf180094bc035ff85c0600b4L8;FF0a0440f9000500ad4801", - "018b0b2000a93f7d00a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6e10200b43f0002ebe80300540a2440a9f40300aa00600091BBL4;FFdd7eff97202100b5ba835cf8f9031aaa228f40f8e22000b4410340f9340080399400f8b728040091490400d1110000145f2800f1880000542800028b08f1d", - "f38L4;ZFL8;FFa9b316384901084aaae35638a9c316386901084aabf35638a9d316384901084aaa035738a9e316386901084aab135738a9f316384901084aaa235738a9031738BBBL4;FF0283843ce10302adb70000b4e02340f9e10317aa22008052c6d80194e12b40f9810000b4e02f40f922008052c1d", - "80194e14340f93f0400f18b000054e04740f9L4;FB353962342f7372632f76312f756e6368756e6b65642f73656e645f63742e7273002f636172676f2d6769742f737061727365706f73747175616e74756d726174L8;FFe20314aa17270094f6a343f9e9a743f9eaab43f9e8af43f9df0a00b1e8fb00f9e", - "1c50054e8fb40f96a2201a908008092682600a96a0a0014e86345f9e97345f9BL8;FFe1431691ead302f97d110094e8d352b91f050071c1000054e1d752b9e2db52b9e3431691c0008052501400949f0e00b140020054e1d342f9e8cb42f91f0101ebL8;FFa80302d1a10302d1a22302d11f7d01a9080180", - "52bf5b38a9b67f3aa9bf233ba9bf6b3ca97cf6ff97e03100b5a0077eada8035ef8f3cf45f9e88306f9e8c745f9BBBBL4;FFe00740adc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aac0f80194e08741ad28008052e217c03dL4;FB61646472", - "65737320697320696e76616c69643a20c0012ec00011696e76616c69642073657373696f6e3a20c00030696e76616c69642073656e646572206b6579L8;FFb6f7ff9700fe073728fc60d3680500b5200840921f1800f1a2050054217c0353c10500343f040071200200543f080071200100543f0c007121f", - "dff5481620091BL8;FF08008092686e00a9ff030891f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e83300f9b20356f8b08354f8af3b7329aa277429b8237529L8;FF02328052e07f843de183843de287843dd0780094e0074091e1074091023880520080099121800191ca780094", - "e92342a9e00319aae0f3c63d0178805222008052BBBL4;FF6a2604a9620200ad6c3200f97aa2013919fdff17e02302913ca5ff97f50301aa80a007370afdff17a06301d1a8d33aa9189500942000805221028052cab80194L4;ZBL8;FFc00600549f2900f14d018052eb031faae9031faaea031faa8c318d", - "9a4d040091ae696a384a0500915f010cebcf194092ce1d0013ef21cb9ae90109aa62000054BL8;FF0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab230100541e000014f4031faae00313aa080c45f81f0500b1L8;FFe8fb41f9eaf741f9f5031faaf6e", - "743b9f7e343b9e86b00f9c80080d258fd60d30800f0f21449009168008052e85700f9c2000014fb6300f9fb4b40f9ea5f40f9BBBBBL4;FFf90303aaf80300aa5f2800f1880000542800028b08f1df38e809f837e023009198710094e80b40b9a8ea0737e80f40f9e90640f92a0108ebc3150054e90240f9L", - "4;FFe9a340a9ca05805281624039e06300912a69283808050091e80b00f994000094f60b40f9e80340f9f45742a9080116cbbf0208eb88030054d50000b4e80740f9L8;FFfd7b42a9ffc30091c0035fd6ffc300d1fd7b02a9fd830091490200f029c13e910a0000904ae12491400200f000803f91e92b00a", - "9490200f029413f91e1030091BL8;FF421e0054692240f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abe21c0054694e41b949020034290140b22911c0daL8;FFd98800944000805281078052d68800942000805201048052d3880094600100f0002030916301", - "00b063a02391640100f084a03091a24700d141038052cd880094BBBL4;FF36008052e20314aa0900001461530191a26301d1fcb2ff97601000b5788f40f9f70318aae28e40f8e20d00b4010340f93a0080399a00f8b728040091490400d1L4;FB14000000000000005054490000000000615449000000000", - "075544900000000000000d1009300a7008a00e400eb00bd000a029100f4010000ef015601b3012001L8;FF1f0500b161e3ff541bffff1728008052e86b00f9cd0300b4fc031aaafa030daac0c80094e0031aaa21008052bec8009400be00b4e10315aae2031aaaf90300aaBL8;FF680240f9080117cbbf02", - "08eb09fcff54e00313aae10317aae20315aacd070094770a40f9daffff17f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6L8;FF3f0500b1400400540a2c40f9093840f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d", - "2BBBBL4;FF29b10d91ab0302d1ea830291e8270ba968008052e90300b0293d3b91a04700d1a10302d1682503a9e803009008251891682905a98a068052480480527f2500a9L4;FB000000000000000008000000000000000800000000000000304b420000000000e81f40000000000028000000000000000", - "800000000000000a897400000000000L8;FFa183dc3ca283dd3cf8d301f9e0071bada083de3ca183d73ce2031cada083d83ca283d93ce10319ada083da3ca183d33ce2031aada083d43ca283d53ce10317adBL8;FF0b000014c7680194e00313aa2100805236008052c468019480feffb4e10314aae20313", - "aaf50300aaca68019408008092f3570ba9e80700f9e81300f9e81f00f9L8;FF090180521a7100a91c0700911a7d01a91f2503a91f2100f92003c03d0081843c2007c03d0081853cfc2700f9da0000b4e0031baae1031aaa22008052bd680094BBBL4;FFe20313aa2300805224008052389bff97b9035cf8e", - "2feff17a04301d1e10319aa220080522300805224008052309bff97b9035cf8e8feff17a04301d1e10319aaL4;FF00021fd6fd7bbea9fd030091f30b00f9f30300aa00200391730200f9310b00941f0000714b03005481000054200000d0210080520140063941008052200000d0L8;FFffa80094e80313a", - "abff3143802fd46d313e17a921a154092e20000b4a80357f880030191e10319aa0801028ba80317f8f3a80094a0c303d12103138be2031aaaBL8;FFe2e3803de1df803de0db803da82737a9480dc0da690dc0daa82738a9880dc0daa90dc0daa82739a9c80dc0dae90dc0daa8273aa9e8030c91c9280194f", - "30740f9L8;FF5f0f00b1616bff5448008092680200f95bfbff17f6eb42f9fb074bf9f90b4bf9fc0f4bf9f8134bf9f5174bf9c80240f9f7e742f9680000b4e00317aa00013fd6BBBBBBL4;FF20e5073657fbffb43a000014e00313aa4d110194e80300aae00301aac8f10736a0dfffb423000014210a0054e", - "0031faa9dfeff17880080d2e00b00f90800f0f2L4;FF8dc2ff97e05301b9a04700d18ac2ff97e04b01b9a04700d187c2ff97e04301b9a04700d184c2ff97e03b01b9a04700d181c2ff97e03301b9a04700d17ec2ff97L8;FFf1faff97fd7b43a9f32340f9ff430191c0035fd6e003c03d08008012680200b", - "96042803cfd7b43a9f32340f9ff430191c0035fd6ffc301d1fd7b05a9f33300f9BBL4;FF350840f9364841b9f90301aaf30300aab50400b4340740f9c2900194e00315aa21008052c0900194602100b4e10314aae20315aaf70300aac6900194381740f9L4;ZDL8;FF4ab12f91a8031ff8620100f042c40f", - "91e92b01a9e3430091e3900094fd7b44a9ff430191c0035fd60a20009109400091e8230091200440a9a9031ff8e9ffffb0BBBL4;FFf50319aaa1000054f94f40f9f88b40b9f34340f957ffff17280400f008b140f9f94f40f9f88b40b9f34340f91f0500f109eaff54e8b30291a90300b029b10d91L4;FB2", - "8e25b63c480bec65123f7fa8913489399b1a49da30cd1a7fd217d479d423f94da7da28c1dbe03560000b714bd6ced05dafccf73a2ccc74918d9b1c272282b2fL8;FF1f0900f1fb5340f9e0bb40f9ebe340f9e93f40f9e88340f9e31340f9ec3340f9f74b40f9ec3300f981130054e88300f9e027c33d8103", - "c03de86f46f9e93f00f9BL8;FFfb500194e83b40f9e902009029190f91e003c63c682602a9e8008052e90741b2681a00f9080080926006803d682600a93c000014280300f008b140f9480300b4L8;FFf44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6404fc03da80359f84003803de", - "8f304f9e89740f91f0500b121f7ff54baffff17e89348b9BBBBL4;FFccf00194e10740f9c10300b4e00340f91a0000141f09007161010054090180d208df78920900f0f2290140b20b000014090180d2e8031faa38ff48d30900f0f2L4;FB6e2073746174652069732066726573686c6f63616c5f6964656", - "e746974795f6b65795f627974657372656d6f74655f6964656e746974795f6b65795f62797465L8;FFf92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd637008052180080921901805206000014e20313aa430c805254e9ff97e10300aa00feffb5a80640f9BL8;FFcc70019468d640a9741e00f9", - "7f0a00f9950100b41421009104000014b50600f194820091e000005481825ff881ffffb4800240f922008052be700194f8ffff17L8;FF426e0054e14316918c0d0094f90b40f9df0a00b100040054e1d342f9e8cb42f91f0101eb204f0054e8cf42f92a040091800203914901805209692138ead302f9BBB", - "L4;FF69b20eb8686601a9e9a345a9692a04a9e92340f96b2205a9e81b40f96232803de08746ad69220da9e80b40f9e97340b9755203a9600605ade08744ad687200f9L4;ZBL8;FFe10316aa22008052cab00094b40000b4e00315aae10314aa22008052c5b00094e0630191c0a9ff97ff431891f44f45a9f", - "65744a9f85f43a9fa6742a9fc6f41a9BL8;FFea7f06f90a078052ff5306f9e85b06f9ff5f06f9ea6706f9e87306f9e97706f9d030019452000014e0032d9140e6ff97e1fb42f93f0400b1a0140054fb4340f9L8;FFe900009029a13e91e8fb03f9080000f008212c91e85703f928008052ea831a91e96705", - "f9a04700d1e1432a91e94f05f9e9000090298d2691e86305f9e8000090BBBBBL4;FF15e13da919e13ea91b811fb82800809229008052880200f969520039f44f46a9f65745a9f85f44a9fa6743a9fc6f42a9fd7b41a9ffc30191c0035fd6200140fdL4;FFfd7bbba9f90b00f9f85f02a9f65703a9f44f04a", - "9fd030091960000f0970000f0f30301aac12a40f9e82e40f9f40300aa1f0113eb1531939ae20315aa3800158bL8;FF1e0000149f014871830700544d1dc039ae1d00128c550e0b8c0148518d00f83761710c8b0b018052140000148d7d1c53ad0600340d00be528d010d0b4c218039BL8;FFffc30091c003", - "5fd6ff0301d1fd7b02a9f44f03a9fd830091140040f9e00301aa010300f021602191e8230091a20080520c810194330300b073422391010300f0L8;FFe2630091400080527194ff97e3ffff17e0630091220080522300805224008052a396ff97e11740f9e3ffff17962e40f9560300b4e11740f9e80f40f", - "9972a40f9BBBL4;FF61820091f60700f9d2c00194770a40f9ff9e00f1a9010054f70600d108038052690640f9e826089b770a00f9010140f9290400d13f0d00b188000054000540f9L4;FB696f6e5f6d616e6167656d656e7443757272656e74000000a3794900000000003800000000000000b80100001d", - "00000064656372797074696f6e206661696c65L8;FFe20b803d4283c73ce18303ade38b02ad89ffff1735008052e00745ad89620791e233c03d88ea40f98af640f9a0073bad8072c03da203983ce007813d2001c03dBL8;FFe0830091f40301aaff8701a9f5db02a9f73b00b9d9400194a2035ef8a20a00b", - "5a08300d1b4573ea9b6031ff8b7831fb8d34001941f04003180080054f40f40f9L8;FFf50300aae00314aa020000143500805209fc4ad30a088052f4031faaf5ff03a92911c0da490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aaBBBBL4;FF1f10003141900054f9ffff17ede00194f", - "70300aa1f0400b141fdff54e043059181008052e8e00194208f0035e85341b9e87b00b957ffdfc8d70200b4ff0600b1L4;FB6f7574206f662072616e67650000000050da43000000000018000000000000000800000000000000b8f04300000000009cef430000000000c4f3430000000000L8;FFeba709a", - "90ba548a9ebdf00f9e98700f90ba549a9ea2f15a9e9c700f90ba54aa9e9b700f90aa54ba9eacb00f9e9eb00f90aa54ca9ea9b00f90a6d40f9e9a700f9BL8;FF000100b4e10200f021e00791144c00a91f800039f44f41a9fd7bc2a8c0035fd60001805201058052da600194fd7bbda9f50b00f9f44f02a9f", - "d030091f30302aaL8;FF2d55ff97e10740f9b1ffff17e80f41b2abffff17e80f41b2b9ffff17a0031df8210100f021843a91230100f063d43a91a0c300d142018052e40080522c000014BBBL4;FF48aeac72082000b988048052480301a9481300f9e800805248a3003908008092000400ad482700a93c24", - "00b524010014f9031caa1f03156bfa0300f9280a0054L4;FF030c40f26104005401c05f3802d05f3804e05f7842100012c1020034240200347f000039007d20d4b2f8ff97e10300aac2028052000080d2220000b9fd7bc2a8L8;FFa200805217a10094b30100d073421891810100f021ac1591e0230091a3", - "2300d182008052e40313aab4831ff80ea1009488e20091810100f021bc1591a32300d1BL8;FF600200b4a8fe45d3690640f9290108ab420200546a0a40f94a0108ab420200546c0240f9ab1242d3141000f9880108cb092c01a90a2000a9600e00f9f44f42a9BL4;FF770a40f9680240f9080117cb9f0208", - "eb29faff54e00313aae10317aae20314aa2300805224008052a7010094770a40f9c9ffff17a8831ff8a84300d1290000f0L3;ZB" + "BBBBBBBBBL8;FB6f756e743a20c0002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639L8;FF210080529ba40094200b00b4f60300aa9ca40094000480522100805295a40094000a00b4e80300913f030071f7030", + "0aa1a0101911b81009148139b9a000540adBL8;FF96c2009104000014b50600f1d6a20191c0020054c1025df8810000b4c0825df82200805294240194c1825ef8810000b4c0025ff8220080528f240194c10240f9L8;FF4d1dc039ae1d00128c550e0b8c0148518d00f83761710c8b0b018052140000148d", + "7d1c53ad0600340d00be528d010d0b4c2180396b710d8b8c00f8b761e10c8bBBL8;FFa3730091e10314aa0204805224008052f30308aab57300398e140094942240b998640194000480522100805291640194a00100b4e00740ad08048052688200a9L8;FFe02f40f9e10308aa220080529a640094e10313", + "aae10700f9a1fdfff021602491a3fdfff063482591e0230091a200805284018052586aff97e00740f941feff17BL8;FFa1feff9021481391a3feff9063280f91e0030091c2018052a4008052e80300f95deaff97e10340f9bdffff17e80f41b2b7ffff17c80080d20800f0f208090091L8;ZDBBBL8;FB062", + "711000000000038ed45000000000048ed45000000000048ed45000000000048ed450000000000c88340000000000000000000000000006d697373696e6720L8;FFff430291c0035fd6880341d2e90080521f2d00f10831899ae9fdff9029e10b918a0000102b7968784a090b8b40011fd6e11740f9e80f40", + "f91f0101eba0880054BL8;FF48020054e0075bada14302d1e00314aa22008052a0873dade00b5cada08b3eade10359ada1833bade2035aada2833cadd100019400e4006fe00319ade0031aadL8;FFa87cc39bf30300aae9031faa0a018052ff0308eb28008052a1030054b47c039b0b00f0d2f50304aa6b0", + "104cb9f020bebe8020054010100b4a17c019be00302aaBBL8;FF4a25019129194a8b29050091200108ab62020054f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6eb031faa6c8e40f94cf2ffb598ffff17ea031faae9faffb5L8;FF081340f9e00316aae10315aae2031faa00013fd6e0031faaf44f4da", + "9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a9da42ff97e0230091L16;FFe6e300f9ed7b00f9ebcaff97e83340f9e95740f9f10314aae46f40f9f2d340f9e30318aae8f700f9e8ff40f9e7031baae96f00f9ee7b40f9e1a740f9e89300f9BBBBL8;FB456b52656365697665646570", + "6f63686573656b637431436861696e506172616d736d61785f6f6f6f5f6b65797343743141636b6e6f776c656467656472656365L8;FF4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a250191BL8", + ";FFf2100194e0fefff000801091ef100194fd7bbfa9fd030091081840b9c8050034080140b20811c0da081540d2080d088b0825019108fd46d308050091091c40b9L8;FFe07f00b9a04700d136c2ff97e07b00b9a04700d133c2ff97e07700b9a04700d130c2ff97e07300b9a04700d12dc2ff97e06f00b9", + "a04700d12ac2ff97e06b00b9BBL8;FF69b200b8e91340f9a83b0079a9031ff8e90f40f968520178a8035ff8697201f8691d001268f201f828008092aa1b00b9ab831f386cf200786a1201b8699e0039L8;FF29500094a8624039fbc342f9f5c742f9f7cb42f9e863163988fdfff008813291e8d302f9e801", + "80522083c13ce8f304f94003803d28ffff17e94341f9295541b9L16;FFe1efc23de03b823de0f3c23de237823de2f7c23de023823de0fbc23de11f823de1dfc23de02b823de0e3c23de227823de2e7c23de013823de0ebc23de10f823dBBBL8;FF770a40f9680240f9080117cbbf0208eb29d3ff54e00313", + "aae10317aae20315aa230080522400805203000094770a40f991feff17ff0301d1fd7b02a9f44f03a9L8;FFf90b40f9e07aff5400c303913c010014e8031faa000119ab62640054e1431691310d0094f90b40f91f0700b1e00b0054e1d342f9e8cb42f91f0101eb00400054BL8;FF220080529cf40094810", + "240f9810000b4800640f92200805297f40094810e40f9a1fdffb4801240f92200805292f40094e9ffff17f44f41a9fd7bc2a8c0035fd6L8;FF601a40b90000042abf00006a80000054000080d21f000039007d20d4c4020034a000000b1f00066b60020054e00c4039a200040b1f1c007260010054607200", + "91BBL8;FF01120094d6000034e17f52b9e28352b9e343169180008052d61400943f0700b1a0100054e1d342f9e8cb42f91f0101eb60c10054eb074091e8cf42f92a040091L8;FFe80342f9b7028052e85700f9a8028052e86b00f9e95740f968c6533935fd48d3e80a073762f8ff170027c03d011fc13de8", + "fb43f9fc3b01f92023803d2183863cL16;FF4083c93c4283c73ce18303ade21b803dd2000014806ec03d8a220791886206910101c03d88d640f989e240f98083813c4001c03d81220091a80317f888ee40f9BBBBBL8;FB696e76616c6964207369676e6564207072656b6579206964656e74696669657200", + "00000000000000000000000000000000000000000000000000000000000000L8;FF390400b49f9c0094e00315aa21008052989c0094600600b4480740f9e1031faab5833ea9bf831ff815090091a8835ef8ba024079bbe25f78080101cb1f0d00f1BL8;FFbf0208ebc8080054680640f9e10314aae20315a", + "a0001168b9e1c0194c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aa22008052L8;FFb5035ef89f0308ebc8030054e80b40f90001168be10318aae2031caa9d1c0094c8021c8be81f00f9b50000b4e00318aae10315aa220080528f1c0094e8a741a9BBL8;FF683340f9600", + "30191e10301912200805208050091683300f9d6580194f80340f9ffff0139f9031caa22ff46d3e20000b4683340f960030191e10318aa0801028bL8;FF3f08007141fdff5401a30491a22302d1c6f3ff97602b00b5e1031faae9ffff17002900b5a02302d19ef4ff97e80301aa80000036682900b5e1031f", + "aae1ffff17L16;FFe00313aa2200805223008052240080524a000094610a40f99bffff17e00313aae10317aae20315aa230080522400805242000094770a40f9680240f9080117cbBBBL8;FF9d7c0194a1825ef8810000b4a0025ff822008052987c0194a10e40f93f0400f1ebfdff54a01240f922008052", + "927c0194ebffff17880240f9280100b4090d8052L8;FFe85309f9e95709f9f8780094f6ef47f9e01bc43de11fc43de0431691e8036179e143069102738052e057813de0fbc33de15b813de8e30a79e063813d957c0094BL8;FFf44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6f405f8b7140400b499fc0", + "094e00314aa210080523700805291fc0094200500b4e10316aae20314aab40200a9L8;FFf40301aae1031faae20315aa4fffff97e10314aae05341a9eaffff17080040f9680000b4000440f93d060014c0035fd6fd7bbda9f65701a9f44f02a9fd030091BBL8;FF4901084aaa235638a90316386901084aa", + "b335638a91316384901084aaa435638a92316386901084aab535638a93316384901084aaa635638a94316386901084aL8;FFfb4b40f9e92308a9fa5700f9bc0000b4e00317aae1031caa22008052963c0094e15f40f9fa6740f9810000b4e06b40f922008052903c0094fc432a91bb0000b4L16;FF810000", + "b4e05f40f9220080529abc00941a3700b4e05b40f9e1031aaab3010014f6031faae8ef42f91f0500b180180054e8c3159100a1019158c5ff97c0000014BBBBL8;FBd1b6d4bb0e6bdac6a28c95d610754bfc363f00000abadf8326a4bf3f2a760c8e69b4dd02e71be172d18f0f826bea9651aaf59e9ae0bab", + "3571a5b081a4ed735daL8;FF0801094a4901104a6a0200130801094a7f0600316b060253097d18536c0e04534a01140aedc3971a6e1205536f160653495a69784a010d4a6d1a07530b7c8b0aBL8;FFe86b06f9c8feffd008a52891e96706f9290080d2ea6f06f9e93ec0f2e87b06f9c8048052ea5706f9ca", + "fefff04aed0a91e0df813dff5306f9e85b06f9ff5f06f9L8;FFf60f00f99f0209eb68020054d40000b4e80b40f9e10315aae20314aa0001168b9c0c0094e083c03cc802148be80f00f96002803d680a00f9f44f46a9f91b40f9BBL8;FFbc0000b481eb7bd3e00314aa02018052994c0194f44f56a9f65755", + "a9f85f54a9fa6753a9fc6f52a9fd7b51a9ffc30591c0035fd620008052e10315aaca480194L8;FF680080521535889a680240f9080114cbbf0208ebe8000054680640f93f0002710801148ba20100540101003926000014e00313aaf603012ae10314aae20315aaL16;FFf56340f9edeb40f9e0bf40f9f2a", + "b40f9eb1b43a9e77b44a9f11342a9f7eb50a9e84740f9e90f02f9e1430f91e0b3c23de3f701f9e20319aae8eb01f9e86b40f9BBBL8;FF3c00805237008052f40318aa818e47f89ba204a90804805296f201a995a205a980a206a9a8c35fb899ea02a997ae03a9887a00b9810000b4004340f922008052L8;", + "FF081140f91f0900f123030054e8b30a9149feffd029c11991e80302f9e8830a9180fdfff000281291e90702f9290000f029c10b91e80b02f9c8fdffb008211b91BL8;FFe87b40f91f0500b120180054e0c3039162f5ff97be000014e1430091e20313aaf70b00f9f74b00f9f9090094e08744adf50300aa", + "e22fc03de86340f9e0870badL8;FFe9fdff5494060051010003cb73420091987e4093630640f9e9ffff17007840b901000014c80780d2007c4093427c4093010000d4f3f5ff17000400b4fd7bbea9BBL8;FFfd030091ff8308d1f30300aae0a30391fb0305aafc0304aaf90303aafa0302aaf80301aaf7a3", + "0391e52b00f983f2ff97e87740f91f0500b1e00c0054e82300f9L8;FF21001891baccfe97e0234ea9a2a20291e16b40f9081140f900013fd6e0e302f9e8074091e1e702f908011891290c40f9e163179120013fd6fa034bf95f0f00b1L16;FFe00315aae10318aa220080529aac0094e023019167b3ff97f", + "f832591f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd628008052e81b00f9BBBBBBL8;FB696e672f706f6c796e6f6d69616c2e727300287365745f756e61636b6e6f776c65646765645f7072655f6b65795f6d65737361676520666f723a20c010207769L8;FFe2031f2aea0600940", + "8fc78d309fc60d3287b68782821084a095d1053295b69782001084aa0020079a8ee5f78d60600f10801174aa8020079e1f8ff5412000014BL8;FFe00b00f90800f0f2080900d10bffff17e90b41b2e9a300a910ffff17c80080d20800f0f2080500d104ffff17c80080d20800f0f20809009100ffff17c80", + "080d2L8;FFd78209aa5f1100f161010054b60240b9b70000b4e00315aae10317aa2200805295200094280080921c000014eb3342a91a00001493200094c001805221008052BBL8;FFa2060054017c0353c1060034e0620091a3a300d1640c8052e3eeff9740fbffb434000014a0a300d1ea6e0094e80300a", + "ae00301aae8fd07362e00001400f7ff54L8;FFcdffff17f703002ae0230091e10314aae20315aa89ffff97e003172ae80b40f9ff0202710801148b43f8ff54daffff17e083c03ce80f40f96002803d680a00f9L16;FF3f080071ad0100543f0c0071600300543f100071e00300543f1400716105005481c2", + "0091e20313aa6becff97800a00b5e1031faae6ffff173f04007160030054BBBL8;FB30f8450000000000200000000000000008000000000000004020460000000000560b40000000000075000000000000006d00000026000000636f696e73000000L8;FFf30300aae063009122008052230080522400805", + "249a4ff97e11740f9e00313aacffbff17e063009122008052230080522400805241a4ff97e11740f91dfbff17BL8;FFc0feffd000c03f91f0fc0094c0fefff000200091edfc0094f6031faae00316aae10315aad0fc0094c0fefff000400191e6fc0094c0fefff000a00191e5fc0094L8;FFff830091f44f", + "45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0031faad0fcff97a0877ea9cefcff97fd7bbea9f44f01a9fd030091f40300aaBBL8;FF3f080071ac0300543f040071e00600543f080071610a0054a80355f81f0500b161000054bf6735a9bf0316f8e1620091a22301d1d8c4ff97a0f9f", + "fb47d000014L8;FFb70300b4b822009104000014f70600f1186300910003005401835ff881ffffb4000340f92200805293400094f8ffff17ff0600b17582039180050054200740adL16;FF3f0900b181010054080080927f220039680200f9ff032491f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd", + "7bc6a8c0035fd6280141d2ea008052f9031c91BBBBL8;FB1a9b7e7db8f2459d2cd9fc3e5c2981098a58ef03a9fc786c06070000150efe549c2ac0c444ad2180d087cc97cc842e81dd8cbdef99c96998eaccb19f4b9fac97L8;FFfd7b44a9ff430191c0035fd608040091200440a9a94300d1eaffffd04a41", + "1891a8031ff8e2fdff9042840191e92b01a9e3430091d18c0094fd7b44a9ff430191BL8;FFc07a0054c90080d20900f0f2294500911f0109ebc08d0054e02fc13de133c13de0031791e237c13de3032d91e4833291e1feff9021a0389102018052e02b833dL8;FFfd7b42a9ff830191c0035fd6940100b49", + "c100094e00314aa210080523700805294100094e0fbffb4e10315aae20314aaf60300aa971000940200001436008052BBL8;FF01230091022a8052a25001943f0b00b1e0f7ff54e0430291e1830791022a80529c500194e83f40f91f0500b16010005415050091e0220091e1430291022a8052L8;FF08010", + "98b080500911f0109eb49090054091c40f93f0500b120060054096840b969070034290140b22911c0da291540d2290d098b2925019129fd46d329050091L16;FFe83704f9e82340f9e83b04f9e83740f9e83f04f9e82743a9e84704f9e87b40f9e94304f9e84b04f9e86340f9e84f04f9e8d340f9e85304f", + "9e86740f9e85704f9BBBL8;FF090d80520a2940f9e083c33c692a099be0031faa200d803de083c43c2011803de083c53c2015803dea3740f92a3100f96a060091e083c03c0a2d00f92001803dL8;FF220080529c700094ff830891f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6ff", + "4301d1fd7b03a9f32300f9fdc300913f040071f30300aaBL8;FF20020037750240f9a80640f9160101eb02030054e80f41b207000014890080d248008052e02300390900f0f2e827003928017fb2e0030091e80300f9c7f6ff97L8;FF3f1400385f0001ebc1ffff5420030e912100805201400e39e2ffff1", + "700231f9162030094e10315aae00313aa0b030094000080d2f35341a9f55b42a9f76343a9BBL8;FF080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eba816005439000014f9031faafbab49f9fa0740915a8309917f0700b1L8;FFa03000940018805221008052993", + "00094408d00b4e0e7076f08188052e9030291a8033da908048052f90300aaa8031ef8e8074091e10318aa08011891000000adL16;FFe30313aac6ac0094e10340f9810000b4e00313aa2200805297b00094f44f46a9fd7b45a9ffc30191c0035fd6ffc302d1fd7b07a9f85f08a9f65709a9f44f0aa9BBBBB", + "L8;FB3800000000000000ca0100001d000000bb124000000000003800000000000000fd0100001a000000000000000000000008000000000000000800000000000000L8;FF29194a8b29050091280108abc2010054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b290500", + "91200108ab62000054fd7bc1a8BL8;FFfd7bc1a8c0035fd6e90309ab63ffff5400ffff9000201091ec14019400ffff9000001f91e914019400ffff9000802b91e6140194ff8300d1fd7b01a9fd430091L8;FFe9830a91e8830a3928008052e0230891e143139142008052e96b02f9e86f02f9f67302f9f77", + "702f9430c0094b70000b4e00316aae10317aa220080528e180094BBL8;FFdc540194e003009101031a8be20319aaf9ff00399f580194e00317aae10316aa2200805294580194e8ff4039f703082a08088052020117cbb60202ebe3f9ff54L8;FFe04200b4880c8052a9fdff902961209108400039c80080d", + "22001c03d0800f0f2e9f35639e06302f91c490091280280520000803dfc5b02f9e85f02f9e86702f9L16;FFe86301f981feffb0218c139183feffb063a01391e0030b91a2008052a40180524dffff17e06301f981feffb0218c139183feffb063e81391e0030b91a2008052BBBL8;FF3f040071c00400543", + "f080071c103005481620091e003082ae20313aadefcff97800400b4950100143f0c0071600400543f100071810200541f0900f101350054L8;FF8b000054e03749f9220080529a7800943f0700b16000005460c20091f40c0094e87349f9090d00913f0900f123c7ff54080141d2e90080521f2d00f10831", + "899aBL8;FF01f97fd3420080529bf80094685640f9a80000b4605a40f901f97fd34200805295f80094686240f9a80000b4606640f901f97fd3420080528ff80094686e40f9L8;FF80010037f3031f2a1403174b683e00121f21346bc2010054281340f9c1520012e00315aa7306001100013fd600ffff342", + "0008052f44f44a9f65743a9f85f42a9BBL8;FFe05f873de163873de5340194480340391f050071e0420154f91700f999380194007880522100805292380194407801b4e807409102788052f90300aa08810991L8;FFa32a0054a88357f8080540f91f0116eb69090054a02302d143f4ff972032003728fc6", + "0d3280f00b5200840921f1800f1e20f0054217c0353011000343f080071L16;FF020104ade00758ad7e1a00f972c604a9000505ade00b56ade1d7c03d638201397b1206b8000903ad68ff70d36112893ce08754ad689e0139e87242f8649606a9BBBBL8;FBec0000002e00000042024000000000006a0000", + "0000000000890000002e0000002829000000000000000000000000000008000000000000000800000000000000L8;FF420080529c88009407000014a8e301d1e91740f90001c03da88359f82001803d280900f9e83340f91f0500f1ab000054e03740f901f97fd3420080528e880094BL8;FFe0031691e56", + "340f9e4031faaf7dbff97e8c342f9200bc03dfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1404f803da90319f860420054e96301912083c33cL8;FFe0e30691996a42a9a1f7ff97e1df40f93f0400b1604a0054f63f5ca9e8eb40f9e82700f9fa1800b45f0700f1c10b005428034039eb031f2a1fad00", + "7140180054BBL8;FF28008092680200f9ffc30a91f44f43a9fc0b40f9f65742a9fd7bc4a8c0035fd6f55355a9e8430591f6b340f9e0030091016100910228805296480194bf0600b1L8;FF9d48009405000014e00640ade20ac03d620a803d600600adff031691f44f45a9f65744a9f85f43a9fa6742a9fc", + "6f41a9fd7bc6a8c0035fd6ebab59a93f050071L16;FFe22f40f96d070014f7030caaf6031f2a20844eade0032b91e17700f902328052e0af833d20884fade1b3833de0b7833d21804cade2bb833de0a3833d22804dadBBBL8;FFec3300f8ea0b00f98afd68d32c0140b9eb630039eb0340f929f140f86d32", + "00294d7d10536b0600f92bfd68d32cfd60d36a2200796a7d1053693201b8e90b40f9L8;FFe00314aa020000143500805209fc4ad30a088052f4031faaf5ff03a92911c0da490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aa1730889aBL8;FFe10314aae20313aa73f4ff97401000b5e", + "1031faa610a00b5a80640f91f011aeb69050054e00313aa4ff5ff97a009003728fc60d3880700b5200840921f1800f1L8;ZDBBL8;FFe8e300b9e8cf40f9ead700b9e9bb00b9684308f872240094fa0301aae106f8b6fb031faae0031baae1031aaace24019494280194e0028052210080528d280194L8;FF", + "9d2800948002c03d880a40f9c002803dc80a00f9f30200b4e00315aae10313aa22008052f44f44a9f65743a9f85f42a9fa6741a9fd7bc5a88f280014c80240f9L16;FF362b42a97401088bea0b00f9ab831ff8e90700b46901088bf91b00f9f9031faae90700f9b8db3da9b5831ef87701198bf80240f9f4", + "ce43a9fa3245a91f0700b1BBBBBBBL8;FB2e73746f726167652e7273001f696e76616c6964207365616c65642073656e646572206d6573736167653a20c000136661696c656420746f2064656372797074L8;FFa5a03791e123009162c20791e0031f2ae3031faac19e0094e8a3463920feff90000038912", + "3feff9063001d9124feff9084803891a21300d121038052a8c31f38BL8;FFf21e0194ffc300d1fd7b01a9f44f02a9fd430091280840f9290040f91f0002f1431a00543f0108eb13601932200100542a0440f91f1040f15369283808050091L8;FFf6df42a9f45744a9e10200b409008092690600a9880000", + "b4e10308aa2200805295220094b60000b4e00317aae10316aa2200805290220094b40000b4e00315aaBBL8;FF4219803d485100f9e81b40b9400500ad620141ad48551d29e82740b9405d08a9420101ad2001c03d48c103394025803dab000054e01b40f9e10313aa22008052L8;FF54f5ffb5e00308ab23", + "f6ff54a0fdfff000e03d91ed5e0094e00313aa2200805286010094610a40f9b0ffff17e00313aa2200805281010094610a40f9b9ffff17BL8;FF65e8ff97e10340f99fffff17ff0302d1fd7b03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf403", + "01aaL8;ZDBBBL8;FB09000000000000000900000000000000758b4000000000007c8b400000000000000000000000000000000000000000000000000000000000828b400000000000L8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb281f005411000014f6031faa938640f97f", + "0600b180270054802204916debff97080040b2BL8;FF69224039f503002a1f01096be0179f1ab11701948826403969264039b502000a1f01096be0179f1aab170194882a4039692a4039b502000a1f01096be0179f1aL8;ZFBBL8;FF200440a9e82701a9e82300910900009029013f91e82702a9e3430091", + "d73e0194fd7b43a9ff030191c0035fd6202040a941ffffd021803191030d40f9a2028052L8;FF14000014c80080d20800f0f2080500d1e80700f9e0230091d048ff97e10300aae10700f981fdff902120179183fdff9063e41791e0230091a200805224018052L16;FF005c2091e8ab03f968feff9008012", + "291e1430f91fc3340f9e3031d9162008052f8eb01f9e9a703f9e9af03f9e8b303f9e1c8ff970900809288018052f0031caaBBBBL8;FBe6000000090000003d044000000000004900000000000000fb000000140000003d0440000000000049000000000000000a010000110000003d04400000000000L8;F", + "F4a1540d24a0d0a8b4a25019129194a8b29050091280108ab02080054691e40f9090100b4290140b22911c0da291540d2290d098b2925019129fd46d329050091BL8;FFffef02f9ebab08a9e89f00b9eae702f9fff702f9fb4300f920330054f4a740f9f98342b9b41700b4f3a340f995120194e00314aa2", + "10080528e120194e01e01b4L8;FFeabf40f9eb0319aaedd740f9fba340f9f00318aaf70316aae8000014fa031f2ae88343b9093340b8eb130491ea0343b9e80302b9e80b467969f10fb8e99341f9BBL8;FF0001168ba3520194c802148be80f00f9e083c03ce80f40f9290080926082803c680e00f969020", + "0f9f44f46a9f91b40f9f65745a9f85f44a9fd7b42a9ffc30191L8;FF810300ade1b2ff5428008092680200f9a6fdff1780fdfff00064289182fdfff04240299101068052d54e0094fd7bbea9f44f01a9fd030091f40300aa2301f8b7L16;FF0a008092790a00f969220039e00308aa6a0200f9ff074091ff", + "c30091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a82fdcff17e00301aa190340f9BBBL8;FFe20315aa23008052240080520afeff97770a40f954feff17e00313aa22008052230080522400805203feff97610a40f95bfeff17e00313aae10317aae20315aaL8;FFe0431691220080528c110", + "094e1d342f976fcff17e04316912200805287110094e1d342f981fcff17e04316912200805282110094e1d342f99efbff17e0431691BL8;FF2200805223008052240080524b160094e10340a92aa040a9290040f91f1040f15369283808050091280800f903feff540b7c07533f0108eb6b6119320001005", + "4L8;FF05008052c3020e913ffc0371800a00542104001161400e39bf7e0071e1c79f1a3f00356ae10a0054ff000071421046fa430b00547b7f349b9f1e0071830400d1BBL8;FF220080529c32019460220291fa0a009408fdff17f37749f97f0600b180030054e19b49f93f0400b140010054810000b4e09", + "f49f9220080528f320194e1a749f9L8;FFf36741f9880240f9680000b4e00313aa00013fd6810640f9210100b4820a40f9e00313aa94320094ffc32091f44f42a9fc5741a9fd7bc3a8c0035fd6ffc32091L16;FF02328052a3b20094e1430691e00314aa026e80529fb20094ff031491f44f42a9fc0b40f9", + "fd7bc3a8c0035fd6fd7bbca9fc5f01a9f65702a9f44f03a9fd030091BBBBBL8;FB4d000000000000001800000026000000560b4000000000007500000000000000020000001c000000560b40000000000075000000000000002500000020000000L8;FFf90b40f9b5c303d125000014e10f40f9820108cba", + "002088b198100d1b3c303d13400028b9b9a0094a80357f880030191a1c303d122008052b7c303d108050091BL8;FF561f40f99f1a0194e00317aa21008052981a0194800700b4e10316aae20317aaf40300aa9b1a0194582f40f9d80100b5c3ffff1737008052591740f9b7831ff8L8;FF9f0900b1410e00", + "54e8d700f9e9c300f9ebcb00f9b90000b4e0031baae10319aa22008052941a0094fae740f923fdffd063a03391e0431391e2031caae4018052BBL8;FFa8a73ca9b7031cf80a0c0036ea27412948bf70d3a00301d1f6030caa4941092a2a231caa08c11baab78209aa580108aaf5030baa66deff97a88355b", + "8a9c35578L8;FFe86704f9e8c31d91e1833291e86b04f928feffd008811a91e86f04f948008052e86b06f9a8fdffb008411f91e86f06f9e85706f968fdfff008ed0a91e86306f9L16;FF1b018052e8d300f9caffff173f100071e00200543f140071200500543f18007121030054e8d341b968000037fceb", + "00f9ffdb01b9c1d20191a2c303d155e9ff97BBBL8;FFd6800094f44f44a9fd7b43a9ff430191c0035fd6530040f9680640f9a80100b4690240f9200180398001f8b729050091080500d1692200a9200000b9e0031faaL8;FF69010034290140b22911c0da291540d2290d098b2925019129fd46d32905009", + "104000014f4031faa64000014e9031faaea8b92b92a0100344a0140b24a11c0daBL8;FFc1040054691640393fd5017161040054691a40393fa5017101040054691e40393f910171a1030054692240393fe900714103005473260091baffff17e0230091L8;FF29018e9aed030d2a0e0090526b650daa1f02", + "0f6a2d017db210009052ad11899a89010f6a1004a0726b010aaa0c380e530a128e9a0ed074d31f004ef24f010baaBBL8;FFe10309aa08370114ffc300d1fd7b02a9fd83009109200091e80301aae50300aaa9831ff849ffff902b21359141ffff9021603c9123fffff063203991a92300d1L8;FFe9bb40b9", + "e8d30bb94800805208018a1af4a70bb91f01096be83740b9eadb0bb9e8e70bb9810a0054e2d341f9e5b34e39e0c30991e35340f9e45b40f9e1432a91L16;FFe85744f9f40315aae60309916381cd3cfb6b00f9ef0314aae10319ad6081cf3cecd343f9e8a301f9e86b44f9f2b743f9e20317ad6281c93cf1", + "bb43f9ed7344f9BBBBL8;FB54000000000000005f000000050000001d1c400000000000540000000000000065000000050000001d1c40000000000054000000000000007300000005000000L8;FF601200b49f8a0094e00315aa41008052988a0094e00b00f9a01100b4998a0094e00315aa41008052928a", + "0094e00700f9e01000b4938a0094e00315aa41008052BL8;FF08c11d91c9048052e85706f9e8ffff9008213f91e85f06f9e8feffb008210c91e8fb02f9c0feffd000402b91e80303f9e8feffb008e11a91e1833291e3c31791L8;FFfd030091f50303aaf303022af403012af60300aa9b0a0094000480520", + "1018052940a0094400100b4165400a901fdfff021000f91144c02291f600039f44f42a9BBL8;FFa08641ad94a20191a216c03da30ac03de10318aaa8835ef8808701ada083d83ca183d93c8217803d800700ad883300f9830b803d97fdffb5287f40f91f0500b1L8;FF200108ab62000054fd7bc1a8c0035", + "fd680fdffd000400a91ec46009480fdffd000e00191e946009480fdffb000a02391e6460094fd7bbfa9fd030091081840f9L16;FFe3e740f9e84740f9e0b3c23de0430f91e1031d91e20319aae3af03f9e8a303f9e86b40f9e04b823de0c7c33de8a703f9e8fb40f9f6b303f9e8ab03f9e8bb40f9BBBL8;F", + "F29a11f91ea830291a04700d1e8270ba9e8530291c90200d029f11e91a10302d1e8270ca9e8f30191e8270da968008052a9ffff9029b10b91682703a988fffff0L8;FFfd7bc2a89c6a0014f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aa810000b4600640f922", + "0080528f6a0094610e40f9BL8;FF65f0ff97e10340f9e00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6ff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091081c0012L8;FFe90300aa1f3d00383f4d0038e80300aae90300aa1f5d00383f6d0038e80300aae90300aa1f7d003", + "83f8d0038e80300aae90300aa1f9d00383fad0038e80300aaBBL8;FF29ffffb029210c91eae30091a04700d1e8271ca908fffff008251891e82b1ea90a078052c8048052ff2719a909fffff029ed0a91e92b1ba9290080d2e1430691L8;FFe103162a680640f9df0202710801148ba3feff54e90f80123f0", + "02071ea0f801229140033c20000542a7c0653090500394a051a320a01003912000014eb0f8012L16;FF000500ad288000910500001496008052e80b40f916693538a8060091e083c03c6002803d680a00f9f44f44a9f65743a9fd7b42a9ff430191c0035fd6d6008052BBBBBBL8;FB632f646f75626c655f", + "726174636865742e7273002f72757374632f34386132323963656165666434393835633530393930623134313136623664383536616630L8;FFa8080036fc031faaf7031faaf8030091190380523a0080520c000014e81340f9a003dd3cf70600918823199ba9035ef89c070091ff4200f10001803d09090", + "0f9BL8;FFc0035fd6f50300aae00313aa2200805252020094610a40f9e00315aaccffff17f50300aae00313aa220080524b020094610a40f9e00315aad2ffff17e00313aaL8;FF00003891f51a0094ff0303d1fd7b06a9fb3b00f9fa6708a9f85f09a9f6570aa9f44f0ba9fd83019109304039e908003717", + "0840b9f30300aa160040f9a06300d1BBL8;FF3f0400f18b000054e09f40f922008052995e0194e0230091f49b00f9fb180094f40300aaa000f8b6f5031faae00315aae10314aacc5a0194140100b4915e0194L8;FFe86b06f9e87306f9e81b40f9e96f06f9e87706f9e87f06f9e82340f901838e3ce1d7c2", + "3de89b06f9e80f40f90083893ce8d306f9e923452901838a3cf98306f9L16;FF60008052e30313aaf44f42a9f50b40f9fd7bc3a831eaff17e00313aa22008052230080522400805244020094610a40f9d9ffff17f50300aae00313aa22008052BBBL8;ZBL8;FFf507409108810991b5820991f2bdff97f43", + "349f94083c03ce83f49f99f0600b1e04f823de8a304f9c0120054f8432591fc074091a18200910083009102708052BL8;FFf2fa0094c0feffd000a03e91c3feffd063203e91c4fefff084400591a20700d161058052d8fa0094c0feffd000a03e91c3feffd063203e91c4fefff084600991L8;ZFBBL8;FFe", + "08744ada90356f8691a00f909008092608600ad692200a91c0400b524000014983e0194c006805221008052913e0194c00600b448ffffb008213791695b0091L8;FF75f601f9f54b40f92800805276ee01f968c6133969f201f97afa01f9bc0000b4e00317aae1031caa22008052923e0094fadf49a9e15f", + "40f9810000b4e06b40f9L16;FF686a01a903feff17e1e741f93f0400b140010054810000b4e0eb41f92200805295be0094e1f341f9810000b4e0f741f92200805290be0094ba0000b4e0c741f9BBBBL8;FB8b98c369fbd6ecaba79744f74abfa951a28cf47c80e10000c867bc1790884b4f7b29d8f0e734c", + "f9f7b3e5c53e9a9361e489549405c3caaf9f387f215574ba686L8;FFe8031faa490b00916a7a687828e11f78080500913f0308eb2a45007861ffff54e8031faae9031faa8a060091ea1300f91f0308ebe00000544a6b687808110091BL8;FF0800f0f2ffa73239e85306f9d3140094e10300aae15306f9e0", + "833291e1feff9021203f9102028052e3feffd0635c1d91c4028052b8000014e05306f9e0833291L8;FF020100b4a10e40f9e0630091e30316aae40314aacf010094f55342a91f000014b400f8b6f7031faae00317aae10314aacd0a0094d40200b4920e0094e00314aaBBL8;FF820000542800028b08f1df", + "38680ef83728008039e800f8b72a00805208a800a91f0000f9fd7b44a9ff430191c0035fd62904c0392a1d00124a6119534801280bL8;FFce020094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb88130054bd000014080c44f81f0900b1c1090054f3031faaL", + "16;FFe82742f9efaf42f9edbf42f9e0cb42f9f2db42f9e8a71aa9e92b42f9e82f42f9e9a309a9e83342f9e95b42f9e8df00f9e83b42f9eb2315a9e83f42f9eb5742f9BBBL8;FF03f8ff54d8ffff17e0230091e1031faa230080522400805207faff97800640ada08300d1a0073fadf76a01941f04003121f", + "6ff54e083c03ce80f40f96002803dL8;FFe8a301b9e8b341b92007c03dffeb01f9e80303b928008052e8ef01f9080480520800ac72810101ade80b02f9e8430f91fff301f9e80302f9e90702f99a6cff97BL8;FF22008052e00308aa9bee0094e00313aae01300f9a1fefff021541291a3fefff063b01291", + "e083009122028052a400805211000014e10740f9e10000b4e80b40f9L8;FFa3b05f3843f8ff35a30013cb7f0002ebe3f7ff54b70002cbe202403982f7ff35986a683858f7ff3562fd9fd22200a0f27f0002eb6890829abf0208ebc80a0054BBL8;FFe8d302f97f0700b1fb0314aaa053ff54e80740910881", + "099100210491e14316911310009497faff1720ffffd00020029122ffffd042c0029121048052d52a0194L8;FFe9b73f39e8bb3f39e8a74429e9bf3f39e8c33f39e8a74329e9c73f39e8cb3f39e8a74229e9cf3f39e8d33f39e8a74129e8db3f39e80b40b9e9d73f39e8df3f39L16;FFe083843ce09340ade", + "82300f9e10f803dc20200ade30342adc40601adc30202adb40000b4601e40f9e10314aa2200805291ae0094612640f9610500b4080a8052BBBBBL8;FB5b0000002600000042024000000000006a00000000000000fb0000002e00000042024000000000006a000000000000009c0000002e0000004572726", + "f72000000L8;FFa0877aada10301d1e00314aa22008052a0073eada08b7bada00b3fadd592009400e4006fbf0318f8a0833aada003973ca8da77d3a0877aada10301d1e00314aaBL8;FFf212019400ffff9000e02791ef120194fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091084c80b9f303", + "00aac80a0034080140b20811c0da081540d2L8;FF38c4ff97e07f00b9a04700d135c4ff97e07b00b9a04700d132c4ff97e07700b9a04700d12fc4ff97e07300b9a04700d12cc4ff97e06f00b9a04700d129c4ff97BBL8;FFe83f40f9f41700f9f57308a9f54f09a9fa4f0aa9e93300f9e9670ba9fb6300f9", + "e0838c3ce86f00f9fd140094080400b142380054142400919f0208ebe3370054L8;FFe2c32291c1058052e85b04f9e95f04f9dd52009420008052e10314aad252009420008052e10316aacf52009420008052e1031caacc52009400018052e10313aaL16;FF00300094e8cb43f96083c03ce9d743f91f050", + "0f1e0d7823de9b305f9412e0054e0d7c23de8b345f909008092e0030b91690200f96082803c680e00f9ffdeff97BBBL8;FF5fffff17e0230091e8ab00a9e5740094a0c300d1a82b3da9e2740094e00313aaec840094e80300aae00301aae303162a88b70736c3fdff17fd7bbaa9fc6f01a9L8;FF00260054", + "80220291b92b0094080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308eba82400546e010014e1d342f9e8cb42f9BL8;FFfd7bc2a8d4fdff1760220091f30b40f9fd7bc2a816000014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd03009101c840f9f30300aa81", + "0000b460ce40f9L8;FFfd7bbea91f0440b1fd030091f30b00f9f30300aa88000054f30b40f9fd7bc2a8c0035fd6acffff97e10300aaf303134b00008092330000b9f8ffff17fd7bbda9BBL8;FF490d00b4e8d342f91f0115ebea33959a08010acbaa0208cb33010aeb091d0054e90315aae8000014e81b40", + "f91f0500b1000a0054e85b40b91f010071cd0b0054L8;FF820b803d800700ad8190ff54e0230f91cdd4fe9781fcff1721010054810000b4c01240f92200805293360094c11a40f981f4ffb40804805205000014c11240f9L16;FFf9bb48a9fe030daaf56b00f9f503082a08018052edfdff1719df78b3f57", + "740f99f0700b160020054970100b4b422009104000014f70600f194620091e0000054BBBBL8;FB4d000000000000005f0300001c00000073657373696f6e5f76657273696f6e72656d6f74655f6964656e746974795f7075626c696373656e6465725f63686169L8;FF892e4b29882a02292809c05a6909c", + "05a88260329884640f909208052800640ad282508aa080dc0dae00700ad9f2203a9820241ade20301adce82009400e4006fBL8;FFc80240f9f83b42f940818b3ce9c304f9680000b4e00318aa00013fd6c10640f9810000b4c20a40f9e00318aa920601947f0b00b1c1020054f6e3229155050036L8;FF35", + "035ef89f060094e00317aa2100805298060094f60300aa20008052d60c00b4e00316aae10315aae20317aa99060094228f7fa9e00316aae10317aa3b020094BBL8;FF41fffff021e0009143fffff063840191a0e300d1a2018052440180520b000014f80300aa0b000014a0831cf841fffff021e0009143f", + "ffff063400191a0e300d1L8;FF0283843c0183803c0083813c29010094fc2740f99f1700f188fbff54ea430f91e8e3009129008052448948adec030b91408541adf81f40b9e95300b94231803dL16;FFe9ab00f9e9db43f9fa6f44f9fc7344f9e77744f9e07b44f9e9ab1aa9eadf43f9e9e343f9ee7f44f9", + "f58344f9eaa709a9e9e743f9eaf743f9e9df00f9e9ef43f9BBBL8;FF0e610094e8e340391f0500712102005488fffff008010e91090480522e00001439008052752e40f9682640f9bf0208eb21fbff5460220191dd040094d6ffff17L8;FF22008052f4030aaa8c050094e10340a9ea0314aa2ba040a9290", + "040f97369283808050091280800f920fcffb63f0108eb400300546a6928380805009120008052BL8;FFe8ffff17e00300f9a1feffb021901491a3feffb063bc1491e00300916201805264018052eaffff17e80f41b2dcffff17e00300f9a1feffb021e81491a3feffb0L8;ZDBBL8;FFa80000b4600640f90", + "1f57ed34200805299260194680e40f9a80000b4601240f901f57ed34200805293260194681a40f9a80000b4601e40f901f57ed342008052L8;FFa80000b4600640f901e97bd30201805299260094e00313aa0109805202018052f44f41a9fd7bc2a89326001421010054810000b4601240f9220080528e26", + "0094L16;FFff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091f403032af30300aae20000b5d4000035280080527f0600f9687e01a97f0200f92f000014BBBBBBBBL8;FB292c206e756d626572206f662070726576696f7573207374617465733a20c000237370717220696e697469617", + "4696e6720737461746520776974682076657273L8;FFbc937aa9a82301d1e0031f2ae1031baae20317aa2500805206048052fb0700f9e3031caabe9f0094a1035af8810000b4e0031caa220080528fa30094bc035cf8BL8;FF9600003738ffff901863089113000014d7fe45d3e80214ab820c0054e90200", + "aba20c0054aa0217cba8831cf8a8c300d1a02301d1a9ab3ba92f270094a8035ef8L8;FFe00301aae10309aa220080522300805224008052f4030caa32000094e10340a9ec0314aa2aa040a9536928380afc71d308050091290040f9280800f92af3ffb4BBL8;FFf60313aaf30300aa9e630194e0031baa21", + "0080523a0080529663019400fdffb4e10317aae2031baaf50300aa99630194e00313aaf30316aaf6031caafc0318aaL8;FF39fcff97e00314aacc170094e10313aa35fcff97801a40b980010034610a40f9680240f91f0101ebe0050054680640f9090180522a0400916a0a00f909692138BL8;FF480600b", + "5200840921f1800f182060054217c0353a10600343f040071c00100543f08007161fdff54888242f81f0500b1810000549fe202a99ffe03a998fe04a9L8;ZDBBBL8;FB5f7072655f6b65796c6f63616c5f6964656e746974795f7075626c69636661696c656420746f206465636f64652070726576696f75", + "732073657373696f6e2070L8;FF49068052b30e4bf809692138280400917f0a00b1e81700f9410e0054f7031faa7c000014e11740f9e80f40f91f0101eba06b0054e81340f9968248f849078052BL8;FF210080529b030194200100b4800640ad08048052680200a9000400ad680a00f9f44f41a9fd7bc2a", + "8c0035fd62000805201048052ccff0094ff0303d1fd7b08a9L8;ZFBBL8;FFff03019160001fd6082000910940009142ffffb042840591e82700a9e80300910900009029e13e91200440a9e82701a9e82300910900009029613a91e82702a9L8;FFc0035fd6f623009137008052180d8052680240f9080540", + "f91f0115ebe91a0054e00313aa40ffff97e80300aae00301aac8fd073708fc60d3681a00b508084092L16;FF0a2558a9e96f00f90b2559a9eb5f00f9e9e300f90b255aa9eaaf0aa90a2d5ba9e90700f9ea3f00f90a255ca9eb271ea90b255da9e97f00f909f140f908fd40f9BBBBL8;FB3a3a6368756e6b6", + "5643a3a73746174657300000000000000d30940000000000055000000000000004001000021000000d3094000000000005500000000000000L8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb88130054bd000014080c44f81f0900b1c1090054f3031faa5a000014e80300aa09", + "8d40f8BL8;FF092c40f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8bL8;FFbf02086ba2000054f53f40b9bf02086bf603152ac9c9ff54e0830c919dedff97e8cf40f9880000b4e00759a92200805", + "291130094e0030c910eedff97e0830a91BBL8;FFe10319aae20315aaf60300aaa1530194e00319aae10315aa2200805296530194e8230091e0820091ef4f0094f70f40f97701f8b6fa031faae0031aaae10317aaL8;FFf83b42f940818b3ce9c304f9680000b4e00318aa00013fd6c10640f9810000b4c20", + "a40f9e00318aa935300947f0b00b1c1020054f6e3229155050036e0234ea9L16;FF0b008092e971005489008052680a00f9692200396b0200f9ea0000b4e1030aaaf40300aae0030eaa2200805292d30094e00314aae8e740f9485602b4e1e740f9BBBL8;FF801641b91f0101ebc03b0054680640f909018", + "0522a0400916a0a00f909692138e10313aa81f9ff97570300b4610a40f9680240f9988240f91f0101eb00310054L8;FFe8d302f9f88b49f9580300b4e1d342f9e8cb42f9f98749f91f0101eba0360054e8cf42f9490480522a040091e00318aa09692138e1431691ead302f92a0c0094BL8;FFe804005434", + "0100b4680640f9e10315aae20314aa0001178b9ef30094e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00013fd6e0031faaL8;FF800c80d2352000f9a20200f9222040f9431000b9332040f9f55b42a973620091f76343a9deffff17fd7bbaa9fd030091f76303a9177c4093f55b0", + "2a936000090BBL8;FF1f2d00f10831899a29ffffd029393f918a0000102b7968784a090b8b40011fd6e1d342f9e8cb42f91f0101eb20b50054e8cf42f9490180520969213821040091L8;FF36008052070000141f0020716200005456008052030000141f40407156379a9aa80357f8080115cbdf0208eb2", + "8040054a88357f81f0002710801158b03fdff54L16;FFd60900b49fb30094e00316aa210080523900805297b3009460e5ffb4e10318aae20316aaf50300aa9ab3009444000014550f00b493b30094e00315aa21008052BBBBBL8;FB63616e20616c7761797320617070656e6420746f20612062756666657", + "2000000870840000000000047000000000000009b0000001b000000696e76616c696420L8;FFe13b803de037803d08010191ff430991f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd66082c73ce8af40f90a0480526182c63ce99b40f9BL8;FFe00f803de82300f90c000014e8a745", + "a9e0feffd000c01091a18301d1a82739a9a8c301d1a9ffff9029611091a8273aa9e8c30091eb170194684e41b9090000d0L8;FF88008052e06f02f921fdffd021a033911a0000b9e3431391e00313aae2018052f6cb01b9e86b02f9e87302f9c7f2ff97e08308916a17ff97e16b02f9e3431391BBL8;FFf3", + "0308aa082c40f9092040f90080c43c970280d2b86301d1a8031df8080180523f8100f11700f0f20083813c1fa004a91f2c00f9a1030054081c40f90b4840f9L8;FFffa73239e85306f9d461ff97e10300aae15306f9e083329161fdfff021203f9102028052a3fdffb0637c3091c4028052b8000014e0530", + "6f9e083329161fdfff0L16;FF9cdb0094200900b4e10315aae20314aaf48300a99fdb0094f40f00f92f00001428008052ff0f00f9ffa300a9a0e300d1e12300913e2a0094a083dc3ca183dd3cBBBL8;FFe80741b221000014f50302aa1f2900f1880000542900088b29f1df388918f837e0230091e20308a", + "af22c0094e80b40b908010036e00b40f9f44f4da9f6574ca9L8;FFe01bc43d4181873c4281863cea3b48f9e9c706f9e25fc33de35bc33de163c33deaab06f9e053833de18b833de157c33de287833de17f833de287c33dbf0600b1BL8;FFcb0d00122c244039093c003949c100117f250071094000390981", + "9f1a9f7d02710a819f1a8d0d00122e28403929010b0b4a114c0bbf25007129c100110b819f1aL8;FF770a40f9b9ffff17e00313aae10316aae20315aa4dfeff97760a40f9d2ffff17750a40f9680240f994fe41d3080115cb9f0208eba8020054b40000b4680640f9BBL8;FFa03b0194e00315aa01018052", + "993b0194a00500b4f70300aa1b400091fc0313aa08000014390080529c0700d1d6620091b56200d178673fa9788701f8dc0200b4L8;FF9d3b0094fc432a9180c3c03c81c3c13ce8bf4ab9f69b4ab9fc4b45f9a00600ade89303b935070014a01ec13de8f347b9e0432a91a126c03da002803de88303b9L16", + ";FFf45300f9f4bb43f9eecf43f9f2d343f9f1d743f9e0db43f9e3e35e39e7f343f9e4e343f9e5e743f9fc7700f9fc0315aaf503102ae27744f9eb6740f9f02340f9BBBBL8;FB7e800000fa111a782e830d0e9152b1952c3f1eb49aa770d4a68e0000000000000000798b9ccdcae002bc0000000000000000", + "0000000000000000000000000000L8;FFe0430a91e10314aae20316aad0e9ff97fa4f41f9f75341f9e20314aae30316aae40313aae0031aaae10317aa72eaff97f70e00b4f60600f1e0031faad7fa7fd3BL8;FF9c0b0194e04200b4880c8052e9feffb029410d9108400039c80080d22001c03d0800f0f2e", + "9f35639e06302f91c490091280280520000803dfc5b02f9e85f02f9L8;FF9c0b0094600100b4165400a901fdfff021000991140800f91f60003913640039f44f42a9f65741a9fd7bc3a8c0035fd60001805201048052ca070094fd7bbea9BBL8;FFe0ae843de0aa843de0a6843de0a2843d4eefff97e0864", + "3ad68ffff9008ed2091f6033291c9058052e0033291e1830091a28301d1e02e833de08a44ade132833dL8;FF091c40b949fbff35e9031faa0a0840f90afcffb5ea030aab23feff5480fdffb000402391e947009480fdffb000203291e647009480fdffd000e00691e3470094L16;FF08008092f0e300f9e5", + "6f40f9e87700f9f6134ba9eef347a9fa8700f9e96340f9f57b40f9fa5740f9f1a34ca9e2c345a9e1d348a9610a0014e9030eaafcbb00f9BBBL8;FF49f7ff54e0230091e10317aae20315aa230080522400805207f7ff97f70f40f9b2ffff17e0230091e10319aae20313aa2300805224008052fff6ff97f9", + "0f40f9L8;FFf30300aaf50300b496e2009104000014b50600f1d6c2019140030054c1825cf83f0400b140010054810000b4c0025df822008052906b0094c1025ef8810000b4BL8;FFa203973ca80318f8a08738ade28341ada28339ad56f3ff97a0877aad880080d20800f0f2a90358f8080900918082843", + "ca003d73c8182853c8082863ca18378adL8;FF0e686e38bf81037160020054ce1d0013bfb5037101030054df850131ed0600544d0000142e050091df0101eb820800540e686e38bfc1037160010054ce1d0013BBL8;FF20ffffb000802d9123ffffb06320229124ffffb084602e91a27f0091e1068052d92", + "7019420008052c1008052ce270194fd7bbca9f70b00f9f65702a9f44f03a9L8;FF17fcffb538008052482740f91f0500b121fdff5419008092542340f9b4031df8f40e00b4080d80525a1f40f9fc0300f9fb0f00b9f96301a9f75b02a9f54f03a9L16;FF09200039c0035fd63f050071a8100054e8430039", + "1f090071ecfbff54a80c00341f050071610500546c0400f1800e00549f2900f14d018052eb031faae9031faaBBBBBBL8;FB2f76312f6368756e6b65642f73656e645f656b2e727300214572726f72207768696c652072656164696e672066726f6d2066696c6520617420c00018696e7661L8;FFc01a00b4", + "f80300aa9e9f00944000805241008052979f0094001a00b4f90300aa989f00944000805241008052919f0094401900b4fa0300aa929f009440008052BL8;FF680640f92a04009109028052e003142a09692138e10313aa6a0a00f9f44f42a9f50b40f9fd7bc3a8f7fcff17e8031faa94fcff35e003088be1", + "0313aaf2fcff97L8;FF220080529c1f0094c80180d25f0700b10800f0f2a88319f800030054e18b42ada0a301d1a003d83ce20301ade107803d23f9ff97f80740f912000014600bc03dBBL8;FFe00313aae10314aa022b8052f44f43a9f65742a9f85f41a9fd7bc4a89d5f011482ffffb042a01e91e00316", + "aae10315aaeb5b0194fd7bbaa9fc6f01a9fa6702a9L8;FFebab08a9e89f00b9eae702f9fff702f9fb4300f920330054f4a740f9f98342b9b41700b4f3a340f9965f0094e00314aa210080528f5f0094e01e01b4e10313aaL16;FF1f0101eb40080054680640f9490180522a040091e00316aa6a0a00f9096", + "92138e10313aae1ecff97780a40f9680240f9080118cbdf0208eb88070054680640f9BBBL8;ZBL8;FF4ea3ff97e11740f9e4fdff17e0630091e10317aae20316aa230080522400805246a3ff97f71740f9e80f40f9080117cbdf0208ebc9bcff54e0630091e10317aaBL8;FF08fddfc8f60301aaf40300aa", + "1f0500f101030054d56240a9e00316aa010380520201805294ff0094f90215cb330313ab420b005408ff4ad3090880520811c0daL8;FF8a2c7fa96c3404a9ae3c3ca9a61c3da9a8243ea9aa2c3fa9c0035fd600000000200c014e0400028b5f8001f1a80300545f4000f102020054013c084ea2001836BBL", + "8;FF73c3ff97ff0600b1bb8313f8c0040054a02303d16ec3ff975f0700b1bb8313f8a0060054a02303d169c3ff97bb8313f898060036a02303d165c3ff97e18344a9L8;FF6f0e02f9701202f939c14339743bff97f50300aafa0301aae8830f91e00317aae103192ae20315aae3031aaa02e0fe97f7f341f", + "9770200b4eaf741f9c80080d2L16;FF68d340b91f010971204b00543f0500b160000054e0031baac4caff975c008052590300146083c63c6183c73c6283c83c6383c13ce077813d6083c93ce17b813dBBBBL8;FB754378a67d5115cbd89342e67621ca0d44d47397a28c6b70e99f000079840a543aafb1f9", + "77b68dfb72793ab885b4161fe047fc081a8924dda1931a954aac60abL8;FFff0300f9f80300aaf30308aa1b1043799c8f00940004805221008052958f0094009200b4f31f00f9f30318aa08048052698640b8e8830ea9ff7f00f909040036BL8;FF200100543f08007141fdff5401a30491a22302d18debf", + "f97602b00b5e1031faae9ffff17002900b5a02302d165ecff97e80301aa80000036682900b5e1031faaL8;FF82bcfe97a8035df8a083dd3ca9835ef81f0900b1e00b803de91b00f981010054e1230091e2830091e00314aa7ee6ff9728008092680200f9f44f49a9f54340f9BBL8;FFff6300f9e08304ade", + "02f803d28db77d3e08744ad80020191a14301d122008052080d18aaa0873dad080dc0dae86700f9e28345ada2833eadce4b0194e8275a29L8;FF2b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d32901", + "0a8bL16;FFf19700f9f10300aaf80316aae3ef00f9e30310aaf0030daafbdf00f9fb0308aa8d018052e9eb10a9e0bf46a9f7fb15a9f9fb42a9ed7300f9e72f44a9e8174da9BBBL8;FFf70300aa01600491e003082ae20303aaf80303aa3af5ff97800300b461000014f70300aae003082af80303aae20303", + "aae303142a19f2ff97e90300aa14000014L8;FFfc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0316d1f30300aae8430691e00301aaff0300f9fa03062af803052af60304aaf90303aae21b00f9BL8;FF0800f0f2ffa70039e81300f9d3f5ff97e80300aae81300f9a1fefff021181591a3f", + "efff063841591e083009122028052640180523c000014c80080d2e0a30039L8;FF240200347f000039007d20d4b2f8ff97e10300aac2028052000080d2220000b9fd7bc2a8c0035fd6abf8ff97e10300aa82018052000080d2220000b9f35341a9BBL8;FFe00318aa09692138e1431691ead302f9fd0c009", + "4fad342f9e8cb42f908011acb1f0308eb48430054e8cf42f9e10319aae20318aa00011a8b962f01944803188bL8;FF74020014ba031ef8f7030291fb1b42f9f63b00f97f8318f101320054e11742f9e003279102c480529a2f0094e007409181008052ff0316b900001891732a0094L16;FF200500540b00", + "00149f010871c0040054e8df9f529f01086b60040054c8ff9f52f5031f2af60313aa9f01086b60090054880100d0081140f91f0500f1c9020054BBBBBL8;FB920e4000000000005500000000000000ce000000010000006d6573736167655f656e63727970746d6573736167655f646563727970745f7369", + "676e616c666169L8;FF0a2440f9aa0600b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4b0500910a3040f96901098b0a0100b44b0140b26b11c0da6b1540d26b0d0b8bBL8;FFe80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209e", + "b691e0054080c47f81f0500b160180054b2feff97L8;FF998600b4e18b00f9e0431391e1030eaae20319aa110a0094e86b42f9e9db44b91f0900b1e91f01b9a1860054e07342f9e17742f9e84313910012ff97e8435339BBL8;FF1f013a6b5c7f105353ff60d3e0179f1a59ff68d3eaa700a9af6c0194080", + "74039f703002a1f013b6be0179f1aaa6c0194080b4039fb02000a1f013c6be0179f1aL8;FFc9048052e85706f9080000d008c10b91e85f06f9a8fdff9008411f91e8fb02f960fdffb000402b91e80303f9a8fdff9008012e91e1833291e3c3179142008052L16;FF290080d2a91ac0f2e8ff03a9e8a706a9", + "f6d30094881e40b91f050071e1000054950640f93501f8b6f8031faae00318aae10315aaccd30094280080527f7e00a9BBBL8;FFdcfeff17811f0054972240f9881a40f9ff0208ebc0020054881e40f9090d8052e083c33ce822099be0031faa000d803de083c43c0011803de083c53c0015803dL8;FF7f0", + "600b140020054e18349f93f0400b140010054810000b4e08749f92200805295770094e18f49f9810000b4e09349f92200805290770094b30000b4e07b49f9BL8;FFe00313aa088c48f81f0500b1e0ebff54f44f42a9f65741a9fd7bc3a85f000014010040f9810000b4000440f92200805291f70014c0035", + "fd6fd7bbda9f65701a9L8;FF8b0a00941f0000714b03005481000054200000b02100805201201d3941008052200000b0080c80d200c01e91612a00b9010000d4240000b0e30300aa62e20191BBL8;FFe123c53db8008052e82369795401805215008092e057813de15b813de8e30a7985000014e8d342f9e", + "067c13de8a302f9680e00f908008092e04f813d6082803cL8;FF63ac1c919e000014e04b05f9e0432a9121fdffd021203f910202805263fdffb063e81c91c40280529600001448008052e0632a39e8672a39c80080d20800f0f2L16;FFf4a35d39e082009101830091022e8052e03f803de8f30ff8e91f00", + "f99db70094e81f40f9e03fc03ddf0600b1e9c31391f4e31539e8bb02f9e8f34ff82091883cBBBBL8;FB3800000000000000ab0100001e0000006c69627369676e616c5f70726f746f636f6c3a3a73657373696f6e5f6d616e6167656d656e7443757272656e74000000L8;FF9cddff97a80640f989070091", + "2e008052a90a00f908091c8b180100791b050079a2ffff17e00315aa92ddff97a80640f92e00805216091a8b88031aeb48fcff54BL8;FFe00315aa28030194a8624039fbc342f9f5c742f9f7cb42f9e8631639e8feff9008611f91e8d302f9e80180522083c13ce8f304f94003803d28ffff17e94341f9L8", + ";FF3f030aeb28ed03f9e103005408488852e801a0727f0308eb69030054fb0316aaf62f40f93a008052b70100b510000014280400d11f0900b16200005422008052BBL8;FFe10316aa220080529b470194b50000b4e00317aae10315aa2200805296470194f44f4da9f95340f9f6574ca9f85f4ba9fd7b49", + "a9ff830391c0035fd6b4835df8L8;FF82420094e9bf4639e84346390a088052a00302d1f80310912a15003308111d12e8430639e8031091eabf0639200740ade00600ad0042ff97e00640ada00302d1L16;FFeaa30aa928e85aa9e9e300f9e80700f929a05ca9e9f700f929ec5da9e82f00f928fc40f9210", + "00891e9a30fa999c70094f2031aaa08e30d91f6f300f9000540adBBBL8;FFfd7b42a9ff030291a267011428008052e80300f9e10740f981f9ffb5ceffff172000805201048052cf630194ff4301d1fd7b03a9f32300f9fdc30091098440a9L8;FF8d010d0b4c2180396b710d8b8c00f8b761e10c8b2b0180", + "520a0000144d254039bf0500f1c80100548c1900126ce10c8b81fd0daa3f000beb030500544b018052BL8;FFc00300b5e1031faad5ffff17c1010054e1031faac1ffff17880080d2e10700f90800f0f2b9ffff17e80b41b2e00700f9b6ffff17880080d20800f0f2080140b2L8;ZDBBL8;FFf44f03a9fd03", + "0091150040f9bf0600b1a005005414d840a9f30300aa960100b49722009104000014d60600f1f7620091e0000054e1825ff881ffffb4e00240f9L8;FFd2ffff17280180d2e00700f90800f0f2081500d1deffff17e90b41b2e92300a9dcffff17280180d20800f0f2081100d1d7ffff173f00156b81f7ff5", + "4680240f9L16;FF28e379d3e00314aa02018052011119cb99a70094d5fbffb5f44f4ba9f6574aa9f85f49a9fa6748a9fc6f47a9fd7b46a9ff030391c0035fd6f3031f2af60300f9BBBBBBBL8;FB706c6564002f72757374632f3438613232396365616566643439383563353039393062313431313662366", + "43835366166303938352f6c6962726172792f616c6cL8;FF361f0713351b0613a92b3d292a330c13292f0b13a92b3c29292b0a13a9c31db8680100f008410091002f407808fddf8848010035680100f0080140391f050071BL8;FF1f090071e1010054e00302aaf30302aaf40301aa6bfeff97e80300aae0", + "0301aa08020037680240f9080540f9150100eb62020054e80f41b2e80700f907000014L8;FF7a5f1833e89343b8eb3f40b9e91300f9eaa30039e80b00b968ff58d3ebb300b8e90b00f9ea63003914000014baf37da9a003df3cb6835ef8e00f803d5bff48d3BBL8;FFfd7b42a9ff030191c0035fd6e00741", + "a9d55d0194ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091040180520504805229f87fd3L8;FF680240f9080117cbbf0208eb880a0054680640f9e10316aae20315aa0001178b9c610094e802158b680a00f9951640f9550300b4610a40f9680240f9961240f9BL8;FFa1f", + "eff9021e40e91a3feff90633c0f91e00300f917000014c80080d2e0230039e00300910800f0f2ff270039e80300f9cae7ff97e80300aae80300f9a1feff90L8;ZDBBBL8;FB6368756e6b2073697a65206d757374206265206e6f6e2d7a65726f7369676e65642d7072652d6b6579736f6e652d74696d652d", + "7072652d6b6579736f6e652d74L8;FF000117abe2570054e1630091e78eff97df0600b180070054e11740f9e80f40f91f0101eb60300054e81340f92a0400918022029149018052ea1700f909692138BL8;FFfd030091f40300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aa96010194000", + "300b50e00001428008052090180529f6a29f8880200f9f44f41a9L8;ZFBBL8;FF000040f9fe3d0114000040f9033e0114000040f9083e0114f33d0014fd7bbfa9fd030091080040f91f0500b1c0040054080840f9090140b22911c0da291540d2L8;FFad0200541f0d007181080054606641f9616a41f925", + "0000141f1d007181070054606641f9616a41f9290c40f9e8830f91e1031baa20013fd6fcf341f99f0f00b1L16;FFf0f700f9f42f44a9f2cf00f9f2031baafb0304aaeaab00f9e40300aaf00312aaea6341a9f2031caae0bf46a9ed7b00f9e89f12a9e71f40f9ed0740f9fc4340f9BBBBL8;FB0000315ed27", + "995339d879781d3361233702688af989c4cb8a28c8c21d2aa0000ed5dea1973d2900cd2a9b9f378c0466add7306d95319235ef973d2aa00006dbdL8;FFd48d0014ff8300d1fd7b01a9fd43009101fefff02100079104fefff084800691e3230091e2018052e80700f9c68d0094fd7b41a9ff830091c0035f", + "d601fefff0BL8;FFe92740f9e86b06f9e87306f9e81b40f9e96f06f9e87706f9e87f06f9e82340f901838e3ce1d7c23de89b06f9e80f40f90083893ce8d306f9e923452901838a3cL8;FFe2c740f9e08756a9610200b4e2af18a922008052f9030caaf8030daafcdf1aa9f7030eaafc030faafa0310aaf60", + "30aaa91110094e2af58a9ef031caaee0317aaBBL8;FF06000014e91741b2f4030aaa03000014290480d20900f0f2095100a9098c8152e00313aa01c4805222008052090900f9f44f43a9f70b40f9f65742a9fd7bc4a8L8;FF7b6200b9682603a9686604a9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a", + "9fd7b47a9ff430391c0035fd620008052e10317aacc4d009420008052e10319aaL16;FF08219f5a081d0072a0c700541f05007161ca005488008052e16345f9740a00f96822003908008092680200f9810000b4e06745f9220080528fd10094e16f45f9BBBL8;FFa3ffffd063c00691e00700f9b70100140", + "1800191e003022ae20303aadef5ff97e03600b4e00700f9a1ffffb021203f91a3ffffd063a80891e023009102028052L8;FFe1d342f9c3fcff17c0fdfff000e01491f16d00942000805201788052d26d00942000805201088052cf6d00942000805201048152cc6d00942000805201908052BL8;FFac0038", + "37e0031faafd7b43a9ff030191c0035fd63f0500f141010054e80741b2e0030091e80300f9ccf7ff97e10300aa20008052fd7b43a9ff030191c0035fd6L8;FF82010054231543aaea03292a630843aa631043aa4b00030a4200030a3f0102eb62010a0b42308b1a3fc122eb23e9ff5422010034436c1c53e", + "403801204d01f38BBL8;FF0969213828040091f87749f9e8d302f91f0700b1c0200054c0220291ab1c0094080040b20811c0da081540d2080d088b0825019108fd46d30900088b39050091L8;FFff433291f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6f6031faafb031faa19008", + "0921a01805200e4006fe00740910104805200001891L16;FFe083833cc10201ade083c03ce82700f9e383c43cc00a00ade083c53ce483863ce93f00f9c312803dc09202adc95607a9b40000b4602a40f9e10314aa22008052BBBBBL8;FB8a00e400eb00bd000a029100f4010000ef015601b30120010b021", + "b02ce0146023b013602bb0000007b0000003c00c800e700a4002501660031003d00135a6852L8;FF444111536b050a0a8c090a0a2f1405133220081325300c131f05003129010a0aad0d0a0ace110a0a101a0a0a20240913311e0a0a42280a0a632c0a0a28340d13BL8;FF0616011406160114000040f9a6", + "170014000040f9b3d5ff17000040f90fcdff17082440a9e20301aae00308aae10309aafd150114fd7bbfa9fd030091080040f9L8;FFe00bc13de2830991e157813de113c13d63c20391e8e302f96842019167220391e9ab01a92afdffd04a413d91e8ab00a9e8830c91e50313aae35f813de253813dBBL8;", + "FFe1031baae20317aaf80300aaa1590194fc6740b99b590194000480522100805294590194e00200b460c2c53c61c2c63cf90300aaa1835ef8000400ad810000b4L8;FF68fdffd008a52891e96706f9290080d2ea6f06f9e93ec0f2e87b06f9c8048052ea5706f96afdfff04aed0a91e0df813dff5306f9e", + "85b06f9ff5f06f9ea6306f9L16;FFe80b41b2e06701f902000014a80600d1e86301f9e0030b91d0dfff97e10300aa91000014a80a00d1e16701f94e000014e80b41b2e06701f94b000014a80600d1BBBL8;FFcbfdffb43f0108eb93611932a00300540cfc6ad35369283808050091280800f92c0500b5e00", + "30baa3f0108eb20010054290440f90a050091206928382a0800f9L8;FFda0300b4e1d342f9e8cb42f9f60700b9f63749f91f0101ebe0d50054e8cf42f9490180522a040091e0031aaa09692138e1431691ead302f92b120094fcd342f9BL8;FFfd7b47a9ff030291c0035fd6ff8301d1fd7b03a9f52300f9", + "f44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054080200341f05007141030054L8;FFe001805247030094c0faffb4e8fcfff008c11091f30300aa090140f9087140f8f7018052f8018052090000f9087000f8e00315aa3a030094760000b4e00314aaBBL8;FFe26bc73de00740910881", + "0991e01b843de067c73d00800191e11f843de023843de227843dc3350194e007409100800991be350194f50300aa9239019400088052L8;FFe3c324910800f0f2e4432a9121fdfff021a0389102018052e99b0ab9e84b05f9c3050094f6ef41f9e8e741f9f7432a91df0208eb61000054e0230f91c2d7fe9", + "7L16;FFe16740f9810000b4e00315aa2200805299b90094bad4ffb4e05f40f9e1031aaa2200805294b90094f5031faaf3faff178092c63cf40308aae8bf43f9fc6700f9BBBBL8;FBef104000000000004e0000000000000001050000140000004d6573736167654c656e6774684576656e4d657373616765", + "4c656e677468546f6f4c6f6e67536572L8;FFf832f8b715fb7fd3b500f8b6f6031faae00316aae10315aad3850094150100b498890094e00315aa210080523600805290890094600000b5f6ffff1720008052BL8;FF84400f91e2c32291c1058052e85b04f9e95f04f9dc05019420008052e10314aad1050", + "19420008052e10316aace05019420008052e1031caacb05019400018052L8;FF09f2ff54e0230091e10319aae20317aa230080522400805232e6ff97f90f40f988ffff17e02300912200805223008052240080522be6ff97e10f40f98effff17BBL8;FF210080529b490194c01300b4e10314aae20319aaf", + "c0300aa9e490194542340f9b4031df8b40100b58200001436008052571740f917fcffb538008052482740f9L8;FFe003082ae20313aae303142ab5ffff97c0fdffb4d2ffff17280180d2e00700f90800f0f2081500d1deffff17e90b41b2e92300a9dcffff17280180d20800f0f2L16;FFf74f40f9f65b40", + "f96c08001428a00791e07f00f9e00309910001c03d21000891ec0b18a9022f8052eae700f9f9030baae0f3803dfc030eaaf48f11a9f4030faaBBBL8;FFe1db46a9b7fe58d333008052e903192a610100b4e02740f922008052f5031baafb031aaafa03092a93690194e803192af9031a2afa031baafb0315", + "aaee2b43a9L8;FFf30b00f9fd030091010040f9f30300aa810000b4600640f92200805296690094610e40f9810000b4601240f92200805291690094611a40f9810000b4601e40f9BL8;FFa80640f91a0101ebe200005489000014e20313aa230c8052fdefff97e10300aa210900b5a80640f91f011aeba90", + "40054e00313aa4cf6ff976008003728fc60d3L8;ZFBBL8;FFe10315aa71cfff97e00315aa4ec4ff9728008092680200f9a6ffff17e85340b91f050071610f0054e043c73ce143c83c03e4006fe283cc3ce8430691e0c30e91L8;FFe0071fade00b50ade003813de1834cade207813de263c03de1831cade1", + "834dade2e3803de1831dad3f010094011740f9e8030e91e0430991f2250094e8c30991L16;FFff030191c0035fd6e00741a9d6a50094fd7bbda9f50b00f9f44f02a9fd030091a87cc39bf30300aae9031faa0a018052ff0308eb28008052a1030054b47c039bBBBBBBL8;FB75626c69634b6579536573736", + "96f6e537472756374757265436861696e73656e6465725f726174636865745f6b657973656e6465725f726174636865745f6b65L8;FF61000054e8031faa0c000014e8031faae9031aaa2afd41d34b01088b29010acb6cf57ed3cc6a6c789f213b6b08818b9a3f0500f108ffff54c90a088b2a014079BL8;", + "FFf30301aa210840f9f40300aa680240f91f0101eb000b0054680640f92a040091e00314aa490180526a0a00f909692138e5090094e10313aaf3faff97803240f9L8;FFff8301d1fd7b03a9f65704a9f44f05a9fdc3009109504039e9020037011040b9155840a9f30300aae0030091f40308aa11110094e", + "0630091e10316aa0d130094BBL8;FFf8ffff17e80340f9c80000b40805088be00313aa0201805201f17dd3965d0194ff030b91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6L8;FFc90080d20900f0f2294500911f0109ebc08d0054e02fc13de133c13de0031791e237c13de3032", + "d91e483329181fdff9021a0389102018052e02b833de12f833dL16;FF09692138e10313aae8eaff97770a40f9680240f9080117cbbf0208ebe8070054680640f9e10316aae20315aa0001178b98dd0094e802158b680a00f9951640f9BBBL8;ZBL8;FF88e20791000540ade8f36879e8e30a79e057813de1", + "5b813dbc010014f6c744f9e04316910123009102738052997d0094f8031f2ab701001403e4006f0083c03cBL8;FFe10300aa01010037e00308aae30313aaf44f43a9f65742a9f85f41a9fd7bc4a8effdff1734f87f92560014cbd50213ab82050054a9fe4ad30a0880522911c0daL8;ZFBBL8;FFa1c302d1", + "22008052b4031ef8a0873aade28344ada9035538aa135538ab2355382901084a4a01084a6b01084aa9031538a9335538aa131538aa4355382901084aL8;FF6b130036ea2349b9eb4b5279e1830f91a96207f8e94b45f9eae303b96a3642f9a8e207f8e833557940210391ebcb0779a96208f8e8ff0779b33", + "aff9780110036L16;FFe8af00b9e84f44f9e107c23de9a301f9e94744f9e20fc23de85300f9e85f44f9e4f7c13de00717ade00bc23de1efc13de8270ea9e96744f9e87b40f9e00b18adBBBBL8;FB91204c693dd712bd0e6bfa26afed655bdac64fb23c9eed85a28c0000a7d4f13656e20000f02c262a66d1", + "54ce8391271a8b429c3385f592d3e1bca9382dc28cfcL8;FFa08d00944001805241008052998d0094005400b4e8fdfff008513a91a9809352080140f909100079130303a9080000f9132300f9938d00944001805241008052BL8;FF08213f91e86704f9e8c31d91e1833291e86b04f988fffff008811a91e", + "86f04f948008052e86b06f9e8feffd008210c91e86f06f9e85706f9e8feff9008ed0a91L8;FFe92302a9c8018052e90741b2e02301a9e0030091e92300a929e7ff97a802168b0908805275da00a9682602a928008092741a00b9680200f9f44f45a9f65744a9BBL8;FFa04d0194e00315aa21008052994d0", + "194202100b4e10317aae20315aaf60300aa9c4d0194280340f91f0500b121fcff540500001436008052280340f91f0500b1L8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab02080054691e40f9090100b4290140b22911c0da291540d2290d098bL16;FFe8", + "3740f9f44f04f9e83f04f9e81f40f9f57f04f9e84304f9e87b40f9ec8704f9e84b04f9e8d340f9e04b823de85304f9e86740f9e85704f9e8ef40f9e85b04f9BBBL8;FFa8ffffb008d51991680a00f9080380527f6a0039683200797f7e00397fb201b8ebffff17ec8306a9a8e300d1e13f00f9808640a9ef", + "2f04a9ea2b00f9eea70b29L8;FFe9d302b9214b803dec030b915f0b00b141d6ff54f3feff178083c03ce8430f91000d803d888341f8e9035039e80b02f9e8430691a9090034e9031091caffff90BL8;FF11090094e08744adf50300aae85b40f9e0870bade08742ade85319a9e08709ade08b43ade08b0aa", + "de18340ade18307ade08b41ade08b08ad002800b4e87b40f9L8;FFf30b40f9fd7bc7a8c0035fd6b2f6ff97e10300aa8201805200008092220000b9f8ffff17e08702a9e21f00f9a6ffff97e0c30191e5830191e3008012e00304a9BBL8;FF83fbff17e04316912200805253110094e1d342f994fbff17e04", + "31691e1031aaae20318aa4d110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691L8;FFe10b46a9e007409100001891a4c7fe97f4034bf9fa074bf9e0c31d91fb0b4bf9f90f4bf9c1e20091fc134bf9f8174bf902248052f51b4bf9962d00949f0600b1L16;FF00a10191a3ad0094800642ad", + "e1030a91883240f9e00313aa023f8052e00716ad800640ade87301f9e00714ad800a41ade00b15ad97ad0094f8000014f5f340f9BBBBBL8;FB60206f6e20616e2060457272602076616c75650000000000ef104000000000004e000000000000008f02000014000000ef104000000000004e000000000000", + "00L8;FFa8f31838a0073eadda910094a9035538480d8052aa135538ab235538e00740ad2901084a4a01084ae0c30291a9031538a93355386b01084aaa131538aa435538BL8;FF4a0d0a8b4a25019129194a8b29050091280108ab22030054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a2", + "5019129194a8b29050091280108abL8;FF220080529c150094e15f41f9810000b4e06341f922008052971500941a4affb4e00319aae1031aaa2200805292150094e0df40f9e1031aaa47faff17eeef44b9BBL8;FFe02740f9930000b4e10313aa2200805299550194e13340f93f0400f18b000054e00317a", + "a2200805293550194df0600f14b060054e06b40f9e10316aa26000014L8;FFe56340f9e4031faa30e4ff97e8c342f9200bc03dfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1404f803da90319f860420054e96301912083c33c2183c43cL16;FFa003dd3ca8035ef8e0431e91e1e33b91e2c30d91f77f", + "07f94083803cf8431e91e88b07f9d8010094f7cb43f96083c03ce8d743f9ff0600b1e0df813de8c303f9BBBL8;FF0001178ba3750194e802158b680a00f9952240f9350300b4610a40f9680240f9961e40f91f0101ebe00f0054680640f929040091e00315aa690a00f919692138L8;FF0811c0da081540d", + "2080d088b0825019109fd46d30800098b080500911f0109eb4814005472000014fa031faaf9ab49f9f8074091188309913f0700b1a0180054BL8;FFfd7bc3a8c0035fd6fd7bbea9f44f01a9fd030091140040f9f30300aa9f0600b1e0020054611a40f93f0400b140010054810000b4601e40f9220080528", + "ef50094L8;FF210000b042c00d9121401b913f1400385f0001ebc1ffff5481020e912200805222400e39bfffff17630a40f9620c40f2600000543f000039007d20d460c05f38BBL8;FF810000b4e0df42f9220080529a350194e04306910d100094e11b40f93f0400f18b000054e01f40f92200805292350", + "194ff0600b1e1000054e83340f91f0500b1L8;FF3f0500b1a0010054281100b4e04340f9e8432a91b8cffe97e84b45f91f0500b180080054e002c03de85345f9001f813de8fb03f94d000014a80f00b4687a40f9L16;FF01048152e8b743f9ea7202f80a788052e22fc23de00717ade02bc23de86b00f9e8", + "ff5e3969d14578ea3b00f90a908052e10fc23d2841082aea6300f9ea435f39BBBBL8;FB000000000000000008000000000000000800000000000000c052450000000000496e76616c696453657373696f6e4572726f72000000000014e6440000000000L8;FF23008052240080524ca9ff97e02342a9990a", + "40f9490180520968283808050091e81700f939f8ffb5e8031faa982680b9f8f8ff35e9031faa972a80b9b7f9ff35BL8;FF410340ad810300ade1b2ff5428008092680200f9a6fdff17e0feff9000441591e2feff904220169101068052d40101941cbeff17f0010114c10600b40a144038L8;FF9d050094f", + "3ffff17e83e40f9c80000b40805088be00315aa0201805201ed7cd3950500945f1300f1a00a0054f5d24aa9340200b4b982009104000014940600f1BBL8;FFe10314aad7410194fd7bbca9f85f01a9f65702a9f44f03a9fd030091084841b9f30300aa88060034080140b20811c0da081540d2080d088b08", + "25019108fd46d3L8;FF745a45a9f60000b4f50314aae00315aa28000094d60600f1b5a2019181ffff54682640f9c80000b4090d8052e00314aa02018052017d099b8f450094617e40f9L16;FFe06fc13df6ef41f9fb4700f9e82b17a9e80342f9ea0b42f9f73342f9f86742f9fa6b42f9e9231fa9e80f42f", + "9e90742f9fb6f42f9f97342f9fcbb42f9e8cf00f9BBBL8;FFf303032af503022af603012ae50700f9e61300b972610094f70301aaa100f8b6f9031faae00319aae10317aace610194b70500b4fa0300aa92650194e00317aaL8;FF680240f9080540f9190101ebe2000054aa000014e20313aa430c80528f", + "f5ff97e10300aaa10a00b5680240f9080540f91f0119ebe9030054e00313aa99fdff97BL8;FFe00300f9a1feffb02120129183fefff063900291e0030091a2018052840080525debff97e10340f9cbffff17e80f41b2c5ffff17c80080d20800f0f208090091L8;ZDBBL8;FF9d250194613240f9810000b4", + "603640f92200805298250194613e40f9e10000b4604240f922008052f44f42a9f65741a9fd7bc3a890250114f44f42a9f65741a9L8;FF360080529b250094a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad30a088052f4031faaf5ff03a92911c0da490109cbea0080523f1d00f1L16", + ";FF1f0009ebe20309aae3fcff54a2ffff1723feffb063002c91eaa1009423feffb063202d9160910091e20315aae5a1009420feffb00024319122feffb042803191" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines15 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines2.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines2.lean index 29f843787..d47dc60e5 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines2.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines2.lean @@ -27,361 +27,253 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub2 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF83020054ee0d4039ce150012ce190b2a4e090e33ea110091e5ffff17df81007100fdff54df15027163040054cf7d0853ff7d00714c0100540f020034ff590071L4;FF090540f9490d00b40a0140f9410180390101f8b7e0031faa4a050091290500d10a2500a9fd7b43a9ff030191c003", - "5fd63f2900f1880000544b01098b6bf1df38L8;FFc0035fd614fd45d3330440f9750214ab02080054280840f9170114ab02080054290040f97f0208eb360114cbe1000054950200b416030037c80240b289020090BBL4;FF3f0400f18b000054e01240f92200805298a00194f6ce01a9f61600f9f43200b9", - "bb0000b4e00318aae1031baa2200805290a0019428008052e0c30191e3430191L4;FF83fe073723cc7492050000f0a50042f9630040f97f0005ebc1fdff5423404079652c46d3bfbc007168080054030000d063c0029163d86578487c031b9f00086bL8;FFa8831ff8e8a00094b30100b073e20491810100", - "d021cc1591a32300d182008052e40313aab4831ff8dfa0009488620091810100d021dc1591a32300d182008052BBBL4;FFff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb238900541803008bf9feffb50f0000141f0400b1L4;FB72676f2d7", - "2656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f62797465732d312e31322e312f7372632f62L8;FFe92742f9020340f95f0009ebe8979f1a08219f5a081d0072c07600541f0500712179005488008052e1eb41f9620a00f968220039080080926802", - "00f9810000b4BL8;FF154c00a9e10200d021e008910004803d1fc00039f44f42a9f50b40f9fd7bc3a8c0035fd60001805201078052a9600194fd7bbda9f65701a9f44f02a9fd030091L8;FFa8031df8ba55ff97e80300aa210100d021843a91230100d063a03991a0c300d142018052a4008052a8031df8f", - "254ff97a1035df8e80740f9f30301aac80000b4BBBBL4;FFe0e7076fec031faa010d010ea82a40a90d000a8a02696dfc438c212e6900669e2ec101f280010054c901c0da2911c0daa90d498b2b010a8a09190bcb2f015cb8L4;FFf44f43a9fd7b42a9ff030191c0035fd6e00741a9a4000094fd7bbea9f44", - "f01a9fd030091f40300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aaL8;FFff030191c0035fd660020090006038919e0001946002009000c038919b0001946002009000203991980001946002009000803991950001946002009000e03991BL8;FFe9800194e9800194f44f43a9fd7b42a9", - "ff030191c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa010300d021d02891e8030091c2018052L8;FF09692138e16300911580ff97887240b91f050071a1000054818a4e29e3630091c0008052a692ff979f0f00b100020054e11740f9e80f40f91f0101eb607c0054BBBL4;FFf6f", - "fff1720008052b4833ea9e0230091a16300d1b5c300d1bf831ff827b3ff97680240f9a083de3ca9835ff8ff0208eba002803da9031ef861000054e00313aaL4;FBfd0100001a00000050726576696f7573436861696e4b6579626173655f6b6579726f6f745f6b6579303132333435363738396162636465", - "6653657373696f6e53L8;FFf67300f9f65340f9a203933ce10302ade20347ade20301ade1034aade10304ade20349ade20303ade1034bade10300ad51ffff1736008052e00745ad88220791BL8;FF090500394a051a320a010039e0ffff17ea0f80120b7c10530a2c0633eb0000350b7c0c530a050039090", - "900396a091b320a010039d6ffff170b7c1253ec0f8012L8;FF090340f9d60217cbdf0208eb3501178bd732889a152300a9f7fbffb5f62b40f9f51f40f996000037d80000901823209113000014d7fe45d3e80214ab820c0054BBBBBL4;FF63242291e0230091a20080522401805224000014880080d20800", - "f0f2080140b2a0c300d1a8031df8b1050194f70300aae10740f9810000b4e00b40f922008052L4;FF5dc2ff97e0df00b9a04700d15ac2ff97e0db00b9a04700d157c2ff97e0d700b9a04700d154c2ff97e0d300b9a04700d151c2ff97e0cf00b9a04700d14ec2ff97L8;FFf33340f9ffc30191c0035fd6ff", - "4302d1fd7b07a9f34300f9fdc30191f30308aa28008052e10300aaffa300a90804805269020090296139910800ac72e0e30091BL8;FF28008052e82f00f9e10319aa294f41b9b5e301d1280c49f8f68700b9e95700b91f0500b1f85f07a9fa3700f900090054a0e301d191010094a082c23ca182c33cL8;F", - "F620100d042a01091e92b01a9e3430091b5900094fd7b44a9ff430191c0035fd6880100b008f12e91e00301aae10308aae2018052fd7b44a9ff430191cb900014BBBL4;FFe85f40f9f63300f9e85300f9760400b494d00194e00316aa210080523900805291d00194c0f5ffb4e15340f9e20316aae02700f", - "997d00194f92f40f919000014L4;FBc733cb2e70ce02f2485fa235154c8ad5cc94ca760e28349ef3ec27f1e8beaaf611e960475463a78121c6030a37f8a28c005b1a67000007d1fe28db6453cfe882L8;FFebe340f9e31340f9ea0315aaecab40f9e0bb40f9ed0316aafb5340f9e9c340f9e8f341f9e9c30", - "0f909008092e4c34ca9ef0303aae82b01f948018052ee3b40f9BL8;FF692200a90d000014e08745ad08008092e237c03d680200f96082803c6182813c6282823cb90000b4e0031aaae10319aa220080528f500194e12740f9810000b4L8;FF3f00086be8279f1a1f0009ebe9a79f1a0901891a280100d0a9", - "05003608b140f9e92740f91f0500f109030054080000b008c10191000100d0005c1a91a92338a9BBBBL4;FFfd7bc6a8c0035fd6ff4303d1fd7b0ba9f36300f9fdc30291e40301aae30300aae0030091e1031faaf30308aa233b0094e00744ade22bc03d6222803d600603adL4;FB27726563697069656e74", - "27206973206e6f74206f6e65206f662074686520726563697069656e747320696e2074686973205365616c656453656e646572563253L8;FF9f7e01a9977e02a9981a00f99f3200f9e10314aae20313aa4d010094c00300b5e1031faad6ffff17c1010054e1031faac2ffff17880080d2e10700f90800f0f", - "2BL8;FFc762009420010035e003c03de80b40f96002803d680a00f9fd7b43a9f32340f9ff430191c0035fd6000300b000801c91e30200f063002291040300b084601d91L8;FF80220291e1431691561200943f0700b1f90b40f9007fff5401c30391e24316916000805213110094f3fbff17e8031faa0001", - "1aab62670054e14316914f0d0094BBBL4;FF85ffff17a04301d1a82b3ba9f18c00941f09007101010054aa035cf8691f009148dd789206000014e8031faa691b009103000014e8031faa692300914a1d4092L4;FFfd030091000c40f901000094200000f000a040f9600100b4fd7bc1a820dbff900000009", - "101000014200000f000a040f9c00000b420dbff900000009101000014L8;FF69010aaa60660191600a803d2001c03de23080526822003928f140f809088052696603a9696204a9e90308916092803c21250091680e00f9480080527f2a00f9BL8;FFe85b04f9e8ffffd008310791e9ab05f96902009029c1", - "0d91e8af05f9e8c32291a04700d1e9b705f9890200f029e10491e8b305f928008052e1833291e96f06f9L8;FF0800f0f2e9b34e39e04301f91c490091280280520000803dfc3b01f9e83f01f9e84701f9e9430a39f7ef41f9f6eb41f9170800b4f50316aae00315aadaeeff97BBBBBBL4;FF9c180214f44f", - "41a9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd03009108a040391f0d0071a1010054135040a9880240f9680000b4e00313aa00013fd6810640f9L4;FFf80300aa1500f0f27c008052090000f9f6018052087000f81d000014e89f4139e9534678fc834139fa3740f92841082ae91346b8378108aae11340f", - "9610400b5L8;FF00380691e82701a9a8630091620200d042001091e1430091e82702a9a3180194600200d00060109198180194ff8301d1fd7b01a9f91300f9f85f03a9f65704a9BBL4;FFe1620091a2e300d1c081ff97e0f9ffb4f60000143f1800712c0300543f140071600500543f18007181f8ff54a80", - "358f81f0500b1200c0054e1e20191a2e300d1L4;FB666f756e642f70726f632f73656c662f617578760000000000000000000000002f6465762f6e756c6c0000000000000001000200030004000500060007000800L8;FFa9b317384901084aaae35738a9c317386901084aabf35738a9d317384901084aa", - "a035838a9e317386901084aab135838a9f317384901084aaa235838a9031838BBBL4;FFf50301aa1f0500f1ab000054609a40f9e10308aa2200805296d801940800801274d612a9749e00f9684201b9f44f42a9f50b40f9fd7bc3a8c0035fd6094840f9L4;FB756e6b65642f73656e645f656b2e7273002f", - "636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d6235386437663536653336L8;FFf62f46f9ed3346f9e8cf00f9e88b45f9f13746f9e33b46f9f03f46f9e8b300f9e89345f9e8ab00f9e89745f9e92312a9e89b45f9e99f45f9e8ab1aa9e8a345f9BL8;FF6a2603a9f", - "31340f90800001408008092681a00f9f30742a9810000b4e00740f92200805293580194a80600d11f0900b1e823931aa8000036e0031baae10315aaL8;FFc010003601efffb4e1000014c02300b5a02302d1c8f4ff974010003641eeffb421010014e18f0cb96fffff17a88357f8080540f9150101ebe200", - "005481010014BBBBL4;FF1f0d00b141030054880200f9680080522a000014770240f9761a40b9f50301aa90f8019400028052010180528ef80194200500b4e8c20091e10315aa160800b9L4;FB67653a20c000266572726f72207768696c6520696e766f6b696e6720616e206666692063616c6c6261636b", - "3a20c000166572726f7220696e206d6574686f6420L8;FF0800f0f2080900d1b4ffff17e80b41b2e00700f9b1ffff17c80080d20800f0f2080500d1adffff17c80080d20800f0f208090091a9ffff17e00300f941020090BL8;FF994e0094a883533808060036a80354381f0500718c090054e80d0035e90", - "f41b273000014880700d1090080921f0d00b1696e00a9a8000054e00319aae1031caaL8;FFe803217988010090e0fb833d08b140f91f0900f189040054e8633f91e90000d029110f91e8bb0ef968008052e1074091e9bf0ef96901009029612891e84b09f9BBBL4;FF20008052c1048052a7b80194800300", - "d0000008919db80194800300d000a0079197b80194800300d00020119194b80194800300d00080119191b80194a0077ba9L4;ZDL8;FF09540079f44f48a9f65747a9fd7b46a9ff430291c0035fd648008052e91f80520840003909200039f44f48a9f65747a9fd7b46a9ff430291c0035fd6a85300d1BL8;", - "FFfd030091082440f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b1400400540a1440f9092040f90a0100b4L8;FFeb6345f9490300b9693e0f91f55b40f9483300b88a2d02a9e8f341f9eaa34f39800500ad280100f96a5e0f39bc0000b4e00316aae", - "1031caa220080528d380094BBBBBL4;FFe003082ae20303aaf80303aabaf3ff97800300b461000014f70300aae003082af80303aae20303aae303142aa2eeff97e90300aa14000014091041b949000037L4;FFdfffff17ff0302d1fd7b06a9f44f07a9fd830191f30300aae02300919de9ff97f40740f99f", - "0600b1e0010054e083c13ce183c23ce81f40f9608600ade00742adL8;FF490200d029e11e911f0109eb600000541f0800f9c0035fd6ffc300d1fd7b02a9fd830091e8030091e1031faa0be6ff97e80740a9e20341a9081140f900013fd6BL8;FF150114ab83000054c0000014f50314abc2170054762e40f", - "9f60400b4742a40f9f7031faaf80316aae00314aa56020094080040b20811c0da081540d2080d088bL8;FF9f880094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4307d1f50301aaf30308aa15010037bf0244f1490100542800805249008052BBBL4;FF3f1400712105005488", - "9b40f91f0500b14006005461c30091a26301d1bbb1ff97e0f9ffb46d0000143f040071e00200543f080071a1030054888340f91f0500b1L4;FB636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f73726", - "32fL8;FF5f0700b140060054f4031aaa48008052fe030daaef0314aae94f40f97102001428008052e85f00f9b80000b4e00314aae10318aa220080528ec80094b90000b4BL8;FFf6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aa9f480194a00100b4f5", - "0300aa8b480194e00315aa21008052L8;FF091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054092040f9090100b42a0140b24a11c0da4a1540d2BBBBL4;FF29c10d91e8270ba9e8530291c90300d029b10d91ea830291a04700d1e8270ca9e8f3", - "0191a10302d1e8270da928008052e9030090293d3b91682703a9c80300f0L4;FB576869737065725072654b657953656e6465724b6579506c61696e746578745369676e65645072654b65795265636f7264537472756374757265000000000000L8;FFc82600b5200840921f1800f1c2260054217c0353e1", - "2600343f0c00712c0500543f040071e00600543f080071200900543f0c0071210800541f0800f101420054BL8;FF4a088052a1a300d1e00313aa0a69293828050091a8831ef80254ff97b6835ef8b7835df8e80216cb7f0208eb88060054130100b4a8035ef8e10315aae20313aaL8;FF0183833c0083853", - "ce10240ad0283843c0183803c0083813c40030094fc2740f99f1700f188fbff54ea430f91e8e3009129008052448948adec030b91408541adBBBL4;FFa8035bf8080119cb5f0308eb69deff54a04301d1e10319aae2031aaa2300805224008052029bff97b9035cf8ebfeff17a04301d1e10319aa0201805", - "223008052L4;FF336041a9361040f9d60600d1002300d1d602028a381440f9f602168bd5220391180c18cbfa02188b54230091530100b4611640f9a102018b818600f8618a40a9L8;FFe00702ada08b7aade00b03ada08778ade00701ade2250094a1d300d1e00316aae20318aa9ba80094a8c303d100c1c", - "b3c01c1cc3ce80f40f9000500addaedffb4BL8;FFfd7bc6a8c0035fd6fd7bbea9f30b00f9fd030091f30300aa92280194200480522100805290280194400100b4600640ada800805208000039210480520010803cL8;FFc80240f9690200f9680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e0", - "0315aa93280094e8e7563968000036e00314aa0ae7ff97e11b42f9f7030291BBBBBBBL4;FFfa6746a9fc6f45a9fd7b44a9ff830291c0035fd6e92340a9795200a9280108cb680a00f957feffb4e8e67ad3081d019108e57a92e902088b212500b180fdff54L4;FFfd7b08a9f65709a9f44f0aa9fd0302910", - "920403989050037010040f9f30300aaa20000f042402a91a0c300d123028052f40308aa12120094a8577da9b6077ea9L8;FF6002f8b7680200f008011c91d45601a9c84e00a9f44f42a9f65741a9fd7bc3a8c0035fd6e10300aae00316aae20315aae30315aae40313aae50314aaf44f42a9BBL4;FFe0835", - "339fccf5339f9875339ea730c29ea035339f88b5339fcd35339f38f5339eaf30d29ea075339fa935339fcd75339f6975339ea730f29ea0b5339f59b5339L4;ZFL8;FFaaf9ffb50a3040f9e903098b8afaffb5daffff17a001009000001391989c0094800100b000001491959c0094fd7bbea9f44f01a9fd0", - "30091010040f9f30300aaBBBL4;FF2100805298dc0194e09700f9600b00b4e10b4091e09740f902c4805221c000919cdc01948fdc0194008c8152210080528ddc0194e09300f9600a00b4f99340f9L4;FB3a20c00013696e76616c6964207769726520747970653a20c00b2028657870656374656420c001", - "290032756e657870656374656420747970652055524c2e7479L8;FFeaeb00f9ea5742f9e8af1aa9e82f42f9eb2b42f9e8df00f9e83b42f9e8c700f9e83f42f9e9a310a9e84342f9e94f42f9e8b700f988a207910001c03de85342f9BL8;FFe84b09f9e80200b008091991e94f09f9aa0a8052a04700d1e85", - "b09f9e807409121800991e93709f9e90200b029b1179108c13591e94309f9290080d2e85f09f9L8;FF1f404071d536969ae80740f9080114cbbf0208eb28040054e80b40f91f0002710801148b03fdff54e90f80121f00207109140033c20000540a7c065309050039BBBBL4;FF0811c0da880e488b18011", - "b8a208d212e00a8302e0800261e680700372b00805202000014eb031faa29210091f80700f92001148b14001b8a496b74fc208d282eL4;FB90001b015400140139004700ee0028007c001b00b400fc005501c400de004501610165005e008501040071017e012801a70035012f000b000000000000000000", - "L8;FF8dffff17c80080d20800f0f2080500d189ffff17c80080d20800f0f20809009185ffff17c80080d2e0a30039e08300910800f0f2ffa70039e81300f9acf1ff97BL8;FF010040f9f30300aa3f0400f18b000054600640f922008052967c0194610e40f9140080927f6200b9740200f93f0400f17f6a0", - "0b98b000054601240f922008052L8;FFe00313aa9afbff17f30300aae06300912200805223008052240080527492ff97e11740f9e00313aa9efbff17e06300912200805223008052240080526c92ff97BBBL4;FF06000014810300b0215c3091830300b063e01e91a0031cf8a00301d12203805204028052", - "f4b00094b9035cf88bffff1728008092686a00a935000014e89341b8L4;FB14f647000000000018000000000000000800000000000000b01648000000000014f6470000000000100000000000000008000000000000003017480000000000L8;FFc802018be90f40f962008052010101ad030900ad290dc0", - "da600b42ada9831ef8630743ad69048052000902ad030503adc80100b008812d91e82704a9a86300d1BL8;FF080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb482200545b010014e80300aa098d40f83f0500b140220054f30300aaL8;FF62820391613e40f9081", - "140f900013fd6606601f9616a01f9290c40f9e8830f91e1031baa20013fd6fcf341f99f0f00b1a100005448008092480300f908018052BBBBBL4;FFc03b0054680640f9090180522a0400916a0a00f909692138e10313aa01f8ff97570300b4610a40f9680240f9988240f91f0101eb00310054680640f94", - "9028052L4;FF3f0016ebc2feff54a86a74381fb9007161feff54e8330091e00315aae10314aab2e4fe97e83340391f0900712007005489060091c80209cbc80600b41f0500f1L8;FFfd7b43a9f32340f9ff430191c0035fd6e00701a989008052ea1342b8eb2740b9e1430091e9830039e007c03de00308a", - "aaa1b00b9abb301b8a91b40b9e00300adBL8;FFf32340f9ff430191c0035fd6690600f968020039fd7b43a9f32340f9ff430191c0035fd6fd7bbea9f44f01a9fd030091a90300d0290140f94ad03bd55301098bL8;FFa07800b4eaa74da928008052e84f1ca9f32f40f9fc7f1ea91c038052e82710a9ea7f", - "12a9eaa74ca9e8531fa9f4031faaff2311a9e82713a9ea7f15a9eaa74ba9BBBL4;FFec0340f9c869ec384804f836c92a41a908014092800640adcb692c387f020039280108cb892100d14a05009129010d8ac82a01a9c801098bc9190ccb0b210039L4;FB188713970ea705b76c4767577a67717740074b1", - "756275d378fd784c799f792e7a397a887b5b7bea7d757dc47c177ca67fb17f007ed37e62742e649f654c65fd6L8;FFf60309aaf9030eaa9acc0094ee0319aae90316aaf50000b4e0030eaae10315aa22008052f60309aa92cc0094e90316aaf57740f9947c00b4e00309aae10314aaBL8;FF408541adf81f", - "40b9e95300b94231803d02c1853c438942ad01c1823c00c1813c02c1843c03c1833ce80b40b9400504ad418147ade8a700b9e81340b9430905adL8;FF000040f902bafe17082440a9e20301aae00308aae10309aad04c0014fd7bbfa9fd030091080040f91f0500b1000b0054083040b9e80b0034080140b", - "20811c0daBBBBL4;FF0a2500a9f44f42a9f50b40f9fd7bc3a8c0035fd620008052018c8152adec0194fd7bbda9f50b00f9f44f02a9fd030091f30301aa210200b4f40300aa89ec0194L4;FB794c656e6774684261644b454d436970686572746578744c656e6774680000007a944800000000004e0000000", - "0000000f9040000190000007a94480000000000L8;FFe00313aae10308aa2200805223008052240080527602009469aa40a9d7ffff17fd7bbda9f50b00f9f44f02a9fd030091f30301aa210840f9f40300aa680240f9BL8;FFffdf0aa9ff5f00f9c1c20091a20301d1be55ff97a0f2ffb430000014a00301", - "d1196d0094fa0301aa80f507363e000014680b0091ba031df805000014e80b41b2L8;FF29650a91e9ab10a9290080d2e1a30391090ec0f2e8ff0fa9e8a712a9a16c0094480100b008953b9129048052682601a9880280d2090080920800f0f2692200a9BBBL4;FF1a154092020100b4e83340f9e10319aa0", - "801028be83300f9e803009100010191c7ac0194e003009121031c8be2031aaafaff003997ac0194e00318aae10317aaL4;FFe6ffff17280000d0083141f9680000b4e800f037c0035fd6fd7bbfa9fd03009104000094fd7bc1a860fff7362c0f0014ffc302d1fd7b07a9f85f08a9f65709a9L8;FF690700d", - "1796a7a783f0108eb41feff54a08300d152f5ff97a0835ef8eeffff17b5035ef8a98300d1b3835e38289140f8290141f8bf0600b1a8031cf8e97200f8BL8;FF800745ad8233c03de8bb42f9766e00a9623a803d600606ad800743ad687a00f9755e01a9600604ad820344ad620205ad810341ad610202ad8", - "20342ad620203adL8;FFc9220d91800600ade003c43de187c53dd8a20d91c8220d91d6220e91800a01ade083c53de28bc53de83f00f9e88340f9a00600ade08fc53de14fc23dffe31039BBBBBBL4;FFe80300aae00301aae10314aae8f80737d3ffff17e0030091e82b00a9edf00094ffc300d1fd7b01a9f", - "44f02a9fd430091280840f9290040f91f0002f1230f0054L4;FF20fa00b4a80000b008fd399118fc78d3090140f9086140f8ca018052fb0300aaef031f2aee031f2afc031f2af7031f2a090000f9086000f8ec0741b2ab0000b0L8;FFf44f44a9f65743a9fd7b42a9ff430191c0035fd66a1100120600001", - "4e9031faa130000148c0d00126a1500124a190c2a0815001208190a2a290100cb7f220029BBL4;FF222fc03de1030391e283009103028052e323803de00702ad210347ade20f803db6020191e8270ca9e10303adf2ddff9700e4006f28008092208304ad208305adL4;FDb0374a000000000000000000000", - "00000000000000000000000000000000000000200000000000000000000000000000000000000ffffffffffffffff00000000L8;FFffc30091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aa810100d021802891e8230091e00309aa42018052db94009468820191610100f0BBBL4;", - "FFf7060091018100ad0201803da1837dadf75b00f9a28f7cad018102ad028d01adbc8355f8f9031caa228f40f802c0ffb597000014e0830291c90a0094f45740f9L4;FB6b00000000000000e11f49000000000056000000000000005c00000022000000de1949000000000057000000000000000c0100001", - "7000000de19490000000000L8;FFe8eb00f9e85b42f9e88f00f9e85f42f9e82714a9e86742f9e96342f9e89f00f9e86b42f9e8a701a9e87742f9e96f42f9e8af04a9eb8b42f9e8c742f900930054BL8;FF4f0d0094df0600b18000005480220291e1431691da1200943f0700b1f90b40f9c07cff54012304", - "91c4000014e8031faa00011aabe2650054e1431691400d0094L8;FF08612091e85f04f928008052eac32291e96f06f9a04700d1e1833291e95706f9090100f0292d0e91e86b06f9080100f0082d1091e96306f9290080d2e87b06f9BBBBL4;FFc0010054e1430191a20301d1bfddff9760faffb460000014", - "e83740f91f0500b1a0010054a1620091a20301d1b7ddff9760f9ffb461000014ff5b05a9ff3300f9L4;FB1e9d1128aafca8060a250803122105bc9d1d290be964810dfa7e94856480a3f7060d004c9762c24c575a1522353a5a1240c11ec3c401eb0107ab38f8600e8720L8;FF080900d16bffff17e90b41", - "b2e92300a970ffff17c80080d20800f0f2080500d164ffff17c80080d2e10700f90800f0f2080900d107000014e80b41b2e00700f9BL8;FFff4f00f9e1620091a20301d1bf5dff97c0f5ffb44b000014ff6307a9ff4300f9e1c30191a20301d1b85dff97e0f4ffb44d000014a00301d113750094f60301aa", - "L8;FFe067c13d8183813ce83b08f9e80f40f9e94708f9e11fc43de223c43de0fb863de01b843d600600ad620a803de80000b4ea1740f9e90740f9682200f96a2603a9BBBL4;FFe00315aae10314aa2200805299b40194f44f47a9f65746a9f85f45a9fd7b44a9ff030291c0035fd6e003c03de80b40f9745", - "600a9780a00f96082813c681600f9L4;ZBL8;FF02c29d3c01c29c3ce0c3c33ce1c3c23ce2c3c13cf24f40b9018200ad0202803d120a062910c2019121fbff54e90800b42cc101d1ed430191ee7300918cfd44d3BL8;FF80f7ffb49c010014a22302d1830c8052a8e4ff97e0f6ffb4ea00001401630091a22", - "302d1d7ebff9740f6ffb483010014e1032d91a22302d1d2ebff97a0f5ffb4L8;FF160101ebe200005475010014a22302d1630c8052e3eeff97e10300aaa02e00b5a88357f8080540f91f0116eb490e0054a02302d16cf4ff97c02d003728fc60d3BBBBBL4;FFa8ae8cd2294c8ed2aaed8dd2680eaef2a9cc", - "adf28accadf2a8accdf2a9ecccf22a4ccef2e86deef2298fedf2ea8decf2080008ca090009caf30302aae82700a9L4;FF41ffff54600640a9e8e30691a8040094e8df40f91f0500f1a0540054f55f5ca99004009400088052010180528e040094207800b4f40300aa155c00a997008052L8;FF610640f981", - "0000b4600a40f92200805298040194611240f9810000b4601640f9220080529304019460020191f30b40f9fd7bc2a88cfdff17610640f9810000b4BL8;FF42e03991ea0f00f9e3430091b6840194fd7b43a9ff030191c0035fd6202040a9210300b021242991030d40f9c2028052fd7b43a9ff0301916000", - "1fd608800091L8;FF6200001408200091410100f021901791e80300f9e8230091e00309aae2018052cf840094620100d042403b915700001408200091410100f021081d91e80300f9BBBL4;FF61000054e02310912ec40194e80b42f9a003de3c8a0600918822199ba9035ff80001803d090900f9ea0f02f", - "905000014a2a300d1830c80529faaff97601100b5L4;FB50010000090000006d697373696e672072656d6f7465206964656e74697479206b657900000000003d634900000000004d000000000000005f0300001c000000L8;FFe90301aae27f43f9fc7300f9fc6f40f9ef1f40f9e13340f9e3b7803de1031", - "3adec2b4ba9e86b00f988008052e2a3803d6dfeff1728008052e85f00f9b90000b4BL8;FFc80000b4e00b40f9e10308aa2200805298440194e10313aae81340f9c80000b4e01740f9e10308aa2200805291440194e10313aae81f40f9c80000b4e02340f9L8;FFec030b91eaa741b9e86301f9e9cb02b9ea", - "cf02b9080380d20800f0f21a1100d1e9d342b9204bc03d8101c03de88f01b9e94303b98041883c8021c03de95343b9BBBBL4;FFd70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb030901541803008bf9feffb50f000014L4;FB1300", - "0000000000001000000000000000160000000000000073686f756c64206f6e6c79206661696c206261736564206f6e2073697a65732c20616c6c2073697aL8;FFcffeff374f04f837360400b42e010debe9030054aa0500d1ac0900d1df2900f14d018052eb031faaf5031faacd318d9a2e0900d12f00805", - "2df010cebc0570054BL8;FFc10200f021b42f91a32300d162018052e40314aaa8831ff8e3640194e3640194f44f43a9fd7b42a9ff030191c0035fd6ff8300d1fd7b01a9fd430091080040b9L8;FF080740f91f0100eb42020054e80f41b2e80700f907000014c90080d248008052e04300390900f0f2e847", - "0039e90700f9e0230091ae59ff97f44f4da9f6574ca9BBBL4;FFf40303aaf60301aaea0308aa2905899a410140fd290500f121a8200e211ca00e418500fc61ffff545f2000f1030e0054090140f9096922f8f7031faafa1f8052L4;FF5f7c00a9027861f8220100b57e000014400440f9607821f8f8ffff1", - "77f7821f8f6ffff17e20300aa607821f84180403940008052441c40b9231040d30020c31aL8;FFf8ffff17d60000b4c806168be00314aa0201805201f17dd396a40094754200f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6fd7bbfa9fd030091081840f9BL8;FF2c7c12532a440c330b090039090d", - "00398b6d1c320a0500390b010039a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9BL4;FFfa6742a9fd7bc6a89a240014c80240f91f0308eb4002005408068052a002c03da90a40f90867089b0a070091ca0a00f9144d00a9170900f90081813c091500f9L3;FB0", - "00000000000000000f03f000000000000f03f0000000000a802000000000000a802000000000000001000000000000001000000050000000010000000000000BBBBBBBBL4;FF010880525f0108eb0295899ac3030094f95342a9e11b40f9f90900b4780240f9e15700a9b50a00b4000340fdfb0740f9fa03", - "1faafc0318aa0088202e0800669eL4;FF080500d1a0c300d1a8031df8b813ff97e10300aa43000014e1031faa41000014c100009021602791c300009063282891a0031df836000014a0031df8c1000090L8;FFe10300aae00308aa14010014fd7bbda9f65701a9f44f02a9fd030091f30302aaf40308aa82", - "0100b4f60301aa8d1e0194e00313aa210080528b1e0194c00200b4BBL4;FF2ac100913f0108ebe8af43a9ea038a9aea2700f908059f9a7401899af99b41f9a800003779000014e8d343a9f99b41f9c80e0036e083079101230091022a8052L4;FF5f8000f1e80300545f4000f1c3000054261c40a98c347f", - "a9061c00a9ac343fa9c0035fd6e2001836260040f987805ff8060000f9a7801ff8c0035fd61f2003d5L8;FFa80f00f9e89e009468620091810100d0219c1591a40100b084200b91a363009182008052a80f00f9df9e0094810100d021a01b91a40100b084e00491a3630091BBBL4;FFf843059199008052e", - "00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300eb634900541803008b060000141f0400b1e1480054b1de01941f100031L4;FB616e696300000000010149000000000048000000000000006a0000001100000045024900000000004e0000000000000001050000140000007d0049000000", - "0000L8;FF28cc40f9eaa30aa92a205aa9e83f00f928d840f9ea0700f9e8531ea9a12e00549f0600b1a00d0254880600913f0308eb01010154480200d008b140f91f0900f1BL8;FF0228805280820091a25e0194e95b40f9e067c03de8d340f9f71b00f93f0d00b1e083833ce82700f94101005428008052f", - "f0600f17f7e01a97f2200a9687e02a9L8;FF680a00f9540300b4610a40f9680240f9b51240f91f0101ebc0070054680640f9490380522a040091e00314aa6a0a00f909692138e10313aa50fbff97760a40f9BBBBL4;FF10000b8a426970fc438c202e7100669e32c201f2a1fbff54e8ffff17e083c43ce18", - "3c23ce82f40f921827aa920829e3ce083c33c385e7ca921829c3c3f0400b1L4;ZFL8;FF410200d021481691430200d063801691e00300916201805204018052e80300f911000014c80080d2e0230039e00300910800f0f2ff270039e80300f9acf3ff97BL8;FF62028052a9831ff8dc7e0194fd7b42a9ffc", - "30091c0035fd62103009021803791e00308aaa2028052fd7b42a9ffc30091ce7e011409200091210300b021e00191L8;FF0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebc815005435000014f7031faaf50314aab30e4ff87f0600b180160054e00315aaBBBL4;FF220080", - "529bbe0194f8ffff17e80340f9c80000b40805088be00313aa0201805201f17dd393be0194ff030b91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L4;FB72652f7372632f697465722f7472616974732f616363756d2e727300636c692f7372632f6c69622e72730076656e646f722f6c69627369676", - "e616c2f72757374L8;FF01048052a8be0094ff8302d1fd7b05a9f93300f9f85f07a9f65708a9f44f09a9fd43019117a040a9f40301aaf30300aae0030091a18300d1a3831ff8a88b3ea9BL8;FFc2010054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108", - "ab62000054fd7bc1a8c0035fd6a00200f000602191L8;FF880e00b5e1031faae1ffff17e1031faa886200b9deffff17811c0054e0031faa2cffff1720ebff54c80080d20800f0f20809009137000014e1010054e0031faaBBBBBL4;FFe802158b680a00f9952240f9350300b4610a40f9680240f9961e40f", - "91f0101ebe00f0054680640f929040091e00315aa690a00f919692138e10313aaf9f9ff97L4;FF39008052eadb43b93a008052e88303b9e8bb4779093300b8e91341f9e80b0679e8a34839ea0303b9e99301f9e8a30c39450000141f09007141050054e97342f9L8;FFe9630039c0f8ff97f44f46a9f52b4", - "0f9fd7b44a9ffc30191c0035fd6e00301aa6102009021603b91a2008052cf0e0114ff8301d1fd7b04a9f32b00f9fd030191BL8;FF176104a9166105a9096100b9fb0800b4a8035ef81f011ceb80080054560b40f9586340b9360500b4540740f98d8e0194e00316aa210080528b8e0194000c00b4L8;FF3f", - "0400f18b000054600640f922008052988e0094761a40f915008092750200f9df0600b1e0010054748643a9e00314aa318cff97d60000b4c8e279d3e00314aaBBBL4;FF2904009114692138e92700f9770240b976825ff8b7020034e80240b20811c0da081540d2080d088b0825019108fd46d308050091f6", - "0100b4c90240b22911c0daL4;FBe6e3a28c6ece7869562992840000fab454b55e63313b1eb04689f4d0e7379bfb2a8a05e9e5240eb2d30c7c1c933e4688fdc52e5f7d287026a4e47b400668764eL8;FF60020891692202a9e9bb40f979b210a9e8ff40f96baa11a9692203a9e99340f96ff212a9e8db40f9", - "66fa14a9692204a9e9cf40f9659218a9e8b340f96dba1aa9BL8;FFfd7bc6a8c0035fd6ebab59a93f050071e89741b92083c13cec030b918033803da10900548031c03de8c302b98b4100f8204b803d8ac100f8204bc03de8d342b9L8;FF04000014180700f1396300916001005421835ff881ffffb420034", - "0f922008052944e0094f8ffff17e8e322910081cf3ce8e344f93dffff17e88b40f9c80000b4BBBBL4;FF0a0140b24a11c0da4a1540d24a0d0a8b4a25019108194a8b08050091ea031faadf0a00b12801088b20020054df0600b100010054c90240b22911c0da291540d2L4;FB08000000000000000884420", - "000000000000000000000000008000000000000000800000000000000348442000000000000000000000000000800000000000000L8;FF081c00121f090071a1010054e00302aaf30302aaf40301aa80edff9720020037750240f9a80640f9160101eb82020054e80f41b2e80300f907000014c90080d2BL", - "8;FF5100001494008012e80200f008c12a9179008052010940a9e00313aaeb6e019420090037fa02140a1b038052f40200d094ea1b910e000014f90309aa165540a9L8;FFe1d342f9a3fbff17e043169122008052af110094e1d342f9bbfbff17e043169122008052aa110094e1d342f911fcff17e043169", - "122008052a5110094e1d342f9BBBL4;FFad0319f88df140f80e160033f0fd68d3a7831a78123300f883004039897040f802b300f8a2a0c2938af040f863701d12eb5300798b7041f8efb302f8affd68d3L4;FFf44f01a9fd030091f40300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aa30", - "feff97000300b50e00001428008052090180529f6a29f8880200f9L8;FFa2ae009440008052e10317aaa6ae0094ff0302d1fd7b02a9fc6f03a9fa6704a9f85f05a9f65706a9f44f07a9fd8300919f0003eb621400545c08038b5a08048bBL8;FFe063813de99305b9600000544063029117e4ff97f3d352a", - "9140200b47622009104000014940600f1d662009160010054c1825ff881ffffb4c00240f922008052L8;FFf46b41f9f36741f9880240f9680000b4e00313aa00013fd6810640f9810000b4820a40f9e00313aa922e0094e14341f9810000b4e04741f9220080528d2e0094BBBBBBL4;FFe0230091ba0b019", - "4f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aa9c160294a00100b4f50300aaL4;FF810000b4e0bb4bf92200805299160094e1af4bf9810000b4e0b34bf92200805294160094e0db4bf9a00000b4e1df4bf9610000b4220080528e16009458", - "4900b4L8;FFc00200b4e10316aae20313aaf50300aaa0160194020000143500805268fe4ad309088052954e00a90811c0da280108cbe90080521f1d00f10831899a29008052BBL4;FFe80741b2e0430091e80b00f9b88b0094e80300aae00740f929008052092000a9fd7b44a9ff430191c0035fd6400300", - "d000001b9195960194400300d000601b91L4;ZBL8;FF10060094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb482200545b010014e80300aa098d40f83f0500b140220054BBBL4;FFa88315f8614300b4e20301aaf7031faa19210091b68302d1fc4302911a01", - "80521b0080923800805214018052810340f9350080399500f8b728040091490400d1L4;FB7570706f727420616c6c206c6f7765722076657273696f6e73000000000000008c1b4900000000004700000000000000b1010000120000008c1b490000000000L8;FFfadb4aa9e2031baaf88f41a9fe0314aae6", - "9f43a9f40315aaebb344a9e56f40f9ea031caafb5340f9ef3b40f9f1030aaaf57b40f9ea0300aafc4340f9e45f40f9BL8;FF8000005480620391e143169166130094e8bb49f91f0500b100bdff5481420491f0010014e1d342f9e8cb42f91f0101eb807d0054e8cf42f949048052f4074091L8;FF0109805", - "2020180529a560094e0c31d91e1c32291022880529e560094e0c32791e1c31d91022880529a56009448058052290100b029ed0691e8c303f9c80080d2BBBBL4;FF00013fd6c10640f9810000b4c20a40f9e00315aa97f60194e1c30591e00314aa022e80529bf601942800805268820039ff830b91f44f43", - "a9f65742a9fc5f41a9L4;FB795f70726976617465636861696e5f6b65796d6573736167655f6b65797300007a944800000000004e0000000000000064020000130000004c6f676963616c46L8;FF9ffe09a99f820a3881220291e20313aa92f8ff97401200b5e1031faae2ffff17880245f81f0500b1a100", - "00549f6605a99f7e06a9997e07a99f8200b981420191BL8;FFe2038052a80f00f9e776019468a202910103009021942691040300f084401291a363009102038052a80f00f9de760194de760194fd7b41a9f31340f9ffc30091L8;FF5f0700b1e1eb843de18bc13de0e3843de087c13de2e7843de283c13de", - "0db843de07fc13de1df843de17bc13de0d3843de077c13de2d7843de273c13de0cb843dBBBL4;FFfa671ba9f85f1ca9f6571da9f44f1ea9fd4306910080c63c0180c73cfb030191084440f9093040f9f60302aa60838d3c396840a961838e3c7f8000f10a048052L4;ZDL8;FFf85f0ba9f6570ca9f44f0da", - "9fd03029100e4006ff303052af503042af403032ae30302aae20301aaf60300aac001009000c02e91c401009084403a91e6030091BL8;FFf4d340f997360194e00319aa2100805295360194800e01b4e10314aae20319aafb0300aa9b360194f4e340f9fa0316aaf40800b4f8df40f98a360194e00314aaL", - "8;FF01818c3c200542adf97305f9f77f05f900818d3c01818e3c200540ade96b40f9fa8705f9f58b05f90081893c01818a3ce8ab46a9e94b05f9e95305f9e93340f9BBBBBL4;FF0a050039090900396a091b320a010039d6ffff170b7c1253ec0f80120a0900390c440c33090d00396a6d1c320a0100390c", - "050039cdffff17f703002ae0230091L4;FF131000b91f500039f44f42a9f50b40f9fd7bc3a8c0035fd60001805201038052ac060094fd7bbea9f44f01a9fd030091f303012af40300aa8a06009400028052L8;FFfd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091080040f9f30300aaa80000b4600640f9", - "01f97fd34200805291060194680e40f9a80000b4601240f901f97fd3BL8;FFa083dc3ca103db3ca9035cf8881a00f908008092800a803d8182803c890e00f9880200f922000014a04301d13883ff97a8277ca9a003dd3ca103db3c8082823cL8;FFa4860094e0031aaae10319aae2031baae30315aae4031", - "faafed7ff97280700d1f7031baa1cf940929f0315ebc80f005428fb4092f3031faa1f0500f1e8031faaBBBL4;FFe10313aae20318aafb0300aaa1c601943c1740f91c01f8b6f6031faae00316aae1031caaa0c601943b0080523c1740f95cffffb7f62f00b91c0300b4331340f9L4;FB6f75742f7369676e", - "616c2e70726f746f2e70715f726174636865742e7273002163616e6e6f7420616476616e63652070617374206072656d61696e696e67603aL8;FFe9c342f9e8cb42f9e9230da9e8d342f9e9cf42f9e81700f9e8d742f9e84f00f9e8db42f9e9a308a9a89247f8e95f5739e8bb01f9e8ff42f9eb7202f8eb7", - "f43f9BL8;FF2004f8b7e0030aaa26000014e10300a9e00301aae10308aa22008052f4030caa9c050094e10340a9ec0314aa2ba040a9290040f90afc78d37369283808050091L8;FF6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab", - "620500542a0140b24a11c0da4a1540d2BBBBL4;FF42a0309181068052bbe601942000805201048052a4e60194e00300b000e03a9197e60194e20300b042e02e91e00301aae10318aa94e60194e20300b042002d91L4;FB6e616c2f727573742f70726f746f636f6c2f7372632f73657373696f6e5f6d616e", - "6167656d656e742e7273000a64656372797074656420c00e206d6573736167L8;FFa06a68f8220080529ae60094dbffff17e0230b39e0030b91ff270b39f56301f9b3dbff97e80300aae86301f92102009021ac1b9123020090632c1c91e0030b91BL8;FF130800b91f300039f44f41a9fd7bc2a8c0035fd", - "60001805201028052ad660194fd7bbda9f50b00f9f44f02a9fd030091f40302aaf303012af50300aa89660194L8;FF9c660094687e40f9a80000b4608240f901f97fd34200805296660094688a40f9a80000b4608e40f901f97fd34200805290660094689640f9a80000b4609a40f9BBBL4;FFf90300aa97", - "a60194e00315aa210080523800805294a60194c0feffb4e10319aae20315aaf60300aa9aa60194e00319aae10315aa220080528ea60194e8230091L4;FFe2e60737021c40b94224c11a82e6073702cc7492340000b0850242f9420040f95f0005ebc1e5ff5402404079452c46d3bfbc0071a802005422000", - "09042c00291L8;FFfd7b02a9f85f03a9f65704a9f44f05a9fd830091280440f9290c40f9340108ab020e00545f0800f180000054281440f9140114ab620d00549400f8b6e0031faaBL8;FFe82701a9e82300910900009029c12491e82702a9e3430091b3260194fd7b43a9ff030191c0035fd60804009120", - "0440a9e92300910a0000904af12591820200b0L8;FFf50301aaf40300aa96260094e00313aa2100805294260094600100b4e10315aae20313aaf60300aa9a260094935a00a9930a00f9f44f42a9f65741a9fd7bc3a8BBBBBBBL4;FF01018052981a0294000200b5e003162a01018052e20315aa9f1a02940", - "3000014e003032a9a1a0294608600a97f0200f9f44f43a9f65742a9f85f41a9fd7bc4a8L4;FF1900f0f2f7031caaf8031baae003c03d280080529a6600a9976201a9951200f98082823c68320039f44f4fa9f6574ea9f85f4da9fa674ca9fc6f4ba9fd7b4aa9L8;FF6001088bc0035fd6020c40f9480001e", - "b83010054610000541f2001a9c0035fd6090840f90a0040f92901018b3f010aebea338a9a29010acb092001a9c0035fd6BBL4;FF4a018052ff6b0339690180520a010aaaff6f0339090109aaff73033909057eb2aa018052ff77033909010aaaff7b033909097fb2ff7f0339080d40b2ffc32491L4;ZFL8;", - "FFc0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa810100b021341a91e8030091e00309aa22028052dc9a009468c20091810100b021781a91BBBL4;FFe20316aaf70300aaa2da0194e8230091008300913cb30094f80f40f97801f8b6fc031faae0031caae10318aa9eda0194370080", - "52e82300910083009132b30094L4;FB5c24749464b03aa216328208540041212c0b4c57376d16620000d50046009c001400ee00fd00b50025012d001601000000000000000000000800000000000000L8;FFe89742f9e86300f9e8a342f9e8ef00f9e8c342f9e8f300f9e8cb42f9e8f700f9e8d342f9e87f", - "00f9e8d742f9e84b00f9e8e342f9e88300f9c8008052e87300f9BL8;FFe0cb843de06fc13de1cf843de16bc13de0c3843de067c13de86f09f9e2c7843de1bf843de0bb843df41300f980020054e83b49f9080100b4090140b22911c0daL8;FF61f2ff5416008092e83341f9f93f00b91f0500b1a1f4ff541", - "3008092f9d740f9f58b42b9f78f42b9fa1b00f959f6ffb53b008052f4e340f9fa0316aa74f7ffb5BBBBL4;FFe00315aa9bfa0194e08741ad28008052e217c03d800600ad820a803d68820039f44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd60001805201038052L4;FB616c2f727573742f707", - "26f746f636f6c2f7372632f73746174652f73657373696f6e2e7273001d52656d6f7665642061206d61746368696e6720636861696e5fL8;FFe08742adf50300aae21fc03de84340f9e08709ade08740ade257803de85316a9e08707ade28341ade28308ad802300b4e0c3039149f7ff97e2000014e14300", - "91BL8;FF9c7a0194610e40f914008092740200f93f0400f18b000054601240f922008052947a0194611a40f9740e00f97f5200b93f0400f18b000054601e40f922008052L8;FF4083c03ce83f49f9ff0a00b1e067803de8d300f901010054e067c03de8d340f909008092690200f96082803c680e00f9650", - "40014f4c30091a182009102288052BBBL4;FF8b2eaff21ffd03a92a4ccef24b8cccf21f0103f8e85b40b9ea8decf2ab8ceef22a010aca2b010bcaf903082aaaaf3ba9b90319f8353f0094e13340f9a06301d1L4;ZBL8;FFe10316aae2031baa03048052fffbff97e86342f908010fd11ffd01f1892700540", - "8788052200742ad6a048052eb1f40f9fa5b42f9a00303d1f45f42f9e1831391BL8;FF28fdff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab230100541e000014f4031faae00313aaL8;FF220080529b3a0094ea031aaafa6740f9ff5700", - "f9f5031faa7fc613393400809296020014e8ff41f9788242f9e90742f9fadf09a9f7f741f9f6fb41f9f5230ba9BBBBBL4;FFe00700f9b701001401800191e003022ae20303aabdf3ff97e03600b4e00700f9210400b021a01f91230400b063a83691e023009102028052c4018052ac010014L4;FF980a009", - "4e00314aae10313aa960a0094800200b4e80300aad5a200a9df0200f9f44f42a9f65741a9fd7bc3a8c0035fd629008052097c00a9f44f42a9f65741a9L8;FF21008052e2031faad50a0194b3831ff8684200917302009073020b91e0030091a12300d1e20313aaa80f00f9cd0a0194e0030091a1630091e2", - "0313aac90a0194BL8;FFa8031cf8000f00541b210091f6c30291fc8302913900805209000014a20301d1830c8052a470ff97201500b5bc035cf8fb031caa628f40f8620d00b4810340f9L8;FFa9461253a8421153e8a712297f00001428000013290402532a0803532b0c0453e0e340b9e2db40b9e3d340b", - "9f79740b92c100553e4cb40b93f0400312d140653BBBL4;FFba035df812ffff17a0c300d1e1031aaa22008052230080522400805204bdff97b7035ef813ffff17a0c300d1220080522300805224008052fdbcff97a1035ef8L4;FB0000000000000000080000000000000008000000000000002c00460000", - "0000000000000000000000080000000000000008000000000000003400460000000000L8;FF1f0500b1e0f3c13de153813de1e3c13de057813de0e7c13de25b813de147813de04b813df88702f9fc7f02f9e17b02f9e06b0054602bc03de88303f9e0831d91BL8;FF609a40f901f97fd342008052994a019", - "468a240f9a80000b460a640f901f97fd342008052934a019468ae40f9a80000b460b240f901f97fd3420080528d4a0194L8;FF2925019129fd46d30801098b130500917f0209eb691e0054080c47f81f0500b160180054b2feff97080040b20811c0da081540d2080d088b0825019109fd46d3BBBBL4;FF8", - "1020191080102ab2935899ae81301f9e91701f9a1ea0194e92342a9e0830591e20b40f90101098be27f073999ea0194e00750ad08108052e28bc03de1031f2aL4;FB080000000000000008000000000000009880420000000000000000000000000008000000000000000800000000000000a88142000000", - "00000000000000000000L8;FF680240f9941e40f91f0101ebc00b0054680640f9490580522a040091e00315aa6a0a00f909692138e10313aa0ceaff97760a40f9680240f9080116cbbf0208ebBL8;FF3ff1017121fbff54f9031f2a1a0500910500001439008052f70314aafa031caae80314aa01011ccba", - "0021c8bd549ff97210600b43f0400f18006005408004079L8;FF210100b4e07b40f922008052996a009405000014e00640ade20ac03d620a803d600600adff031691f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8BBBL4;FF600300f000540a91620300f042e00a91c1038052b8aa0194ff83", - "06d1fd7b14a9fc6f15a9fa6716a9f85f17a9f65718a9f44f19a9fd030591e10b04a9f603072aL4;FFd41500b4e90313aaea0314aa2b15c0387f05013108d5889a4a0500f181ffff54a6000014282c4079080a00b46a02148b6b008052ec0313aae90308aaf4031faaL8;FFa00640f9220080529aaa0094a1", - "0e40f9810000b4a01240f92200805295aa0094a11a40f9f30b40f9810000b4a01e40f9220080528faa0094a12640f9810000b4BL8;FF00013fd6e03b02f9e8031691e13f02f9290c40f9e103129120013fd6fbc342f97f0f00b1e1000054c800805223ffff17e8e322910081cd3ce8d344f97effff17L8;F", - "Fe0074091fb0356b98100805200001891ff0316b9cb290094e0074091fc0356b98100805200001891ff0316b9c5290094e0074091f80356b98100805200001891BBBBBBL4;FFe00313aa20130194e80300aae00301aa48fc0736a3ffff1761020054e0031faaf44f46a9f72340f9f65745a9fd7b43a9ffc3", - "0191c0035fd6880080d2e00700f9L4;FFa04700d15cc4ff97e0df00b9a04700d159c4ff97e0db00b9a04700d156c4ff97e0d700b9a04700d153c4ff97e0d300b9a04700d150c4ff97e0cf00b9a04700d1L8;FF69010d0b4a114e0b29c10011cb0d00122c1c4039092c003949c100117f2500710930003909", - "819f1a9f7d02710a819f1a8d0d00122e20403929010b0b4a114c0bBBL4;FFfd7b42a9ff430191c0035fd6082440a9e20301aae00308aae10309aacf920114fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9fd030091ff0740d1ff0300f9L4;ZDL8;FF281040b96800c8376800d037b9920014ea920014e", - "a920014ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa610100f0216c1c91e8030091e00309aaBBBL4;FFeb031aaada0140b233110acb08010b8b1be100910500001473c201f17bc3019118070091c00b0054683740b91f01176b41ffff54680340f91f0500b1e0feff54L4;FB0872ec2b0872", - "0872d5f6d56bd5f6d5f6d5f6d5f6d5f6d5f6a28cb43fa28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28c0000ab960000c978L8;FFf5ef00f9fadb4aa9e31340f9e22f40f9f57b40f9e56f40f9ef030014e8b343f9e94700f9df0600b1e9c343f9ebfb43f9ea6b00f9e8e700f9e8b743f", - "9f4bb43f9BL8;FFe1d342f929fcff17e043169122008052a0110094e1d342f954faff17e0431691220080529b110094e1d342f93efcff17e04316912200805296110094e1d342f9L8;FFe1068052e85306f9e95706f9a952009420010090002000912201009042600191e1068052b4520094000100f000a4", - "3291020100f042003491a11580529b520094BBBBL4;FF887640f91f8100f121070054887240f94b0080528df240b9818247a9090940790a1940390f7140f80e0140b90cf140f8a9831c78894a41b9aaa31c380a7141f8L4;FB00000000000000000000000000000000010000000000000064c24200000000", - "0000000000000000001000000000000000080000000000000014fe420000000000L8;FF0800f0f20809009152ffff17e00300f9210200f021681b91230200f063cc1791e0030091c201805284018052f1ffff17c90080d2e8230039480080520900f0f2BL8;FFaa635538a94315386901084aab735538a95", - "315384901084aaa835538a96315386901084aab935538a97315384901084aaaa35538a98315386901084aabb35538L8;FF08011acb1f0308eb288c0054e8cf42f9e10319aae20318aa00011a8b9d720094f90b40f94803188be8d302f9e89f49f9f4074091948209911f0500b180000054BBBL4;FF016100", - "91c19bff9760e8ffb454000014a86303d1a26301d101810191bb9bff97a0e7ffb454000014a86303d1a26301d1016100910f9dff97e0e6ffb448000014L4;ZBL8;FF220080529bb20094b70000b4e00318aae10317aa2200805296b20094b5fbffb4e00f40f9e10315aa2200805291b20094d8ffff178800", - "80520902805268220039BL8;FF22000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f9b4270094e80300aae0833291a102009021600d91a2018052a302009063940d9144018052L8;FFe8832491e900009029a92c91e85303f9680000b008c10d91e85703f9e8830e91a04700d1e85b03f90", - "80000f008012191e85f03f9e8831591e1432a91e86303f9BBBBBL4;FFf80309aaf60314aaf4030a2aaf020294ea03142af40316aae90318aa80000035e8825d385f01086b60020054ebb340a9e1e7076f880500d10c010ceaa1fcff54L4;FFf70600911b0140f97f0700b1a010005416d140a9740f00b489", - "06148b1c1140f93aed7cd3fc0700b47c16f8b7080d40f9fb5b02a9dba20091f95f03a9e82300f9L8;FF220080529b020194613240f9810000b4603640f92200805296020194610240f9810000b4600640f92200805291020194610e40f9810000b4601240f922008052BL8;FF080040f9e00301aa090140f", - "93f0900f1a1000054010300f02170299182008052d2820114ff8300d1fd7b01a9fd430091010300f021802991240300d084e02291L8;FFe00700ad800a41ade00b01adcc82009400e4006f9f1a00f9808200ad8002803d08db77d3800640ad80020191e103009122008052080d17aae00700ad080dc0daBB", - "BL4;FFf6031faae00316aae10314aaa6c201943f09007141030054e82340f98a06009109dd789215000014140500b4f70300aa8cc20194e00314aa2100805236008052L4;FB5d77490000000000667749000000000000001b1b1b1b1b1b1b1b1b1b001b1b1b1b1b00131b1b001b0000070000443f350b164", - "93a657b753a0627110000000000L8;FF023f8052f5830291a2c20094882640f9800ac03da1a201918a1a40f98182c33c8216c03da80317f8880e40f9893240f98083873c8082c03cf48340f9aa831ef8BL8;FF760a40f9680240f9080116cb9f0208ebc8060054680640f9e10315aae20314aa0001168b9b", - "420194c802148b680a00f9f44f43a9f65742a9f85f41a9fd7bc4a8L8;FF1a7d01a91f2503a91f2100f92003c03d0081843c2007c03d0081853cfc2700f9da0000b4e0031baae1031aaa2200805290420094fc2740f99f1b00f103050054BBBBL4;FF81ca0054bee201941f10003101ca0054f9ffff17bbe2", - "0194f70300aa1f0400b141fdff54e043059181008052b6e20194e0c80035e85341b9e8b300b957ffdfc8L4;FB190100002e0000001ced4800000000006a00000000000000ca0000002e0000001ced4800000000006a00000000000000200100002e0000007fea480000000000L8;FFe8b345f9e0d7c23de0", - "030b91e8c301f9a8c20091e0df803d922d0094e00740ade8030091e0432d91e1431e91e0e7813d028149ade1eb813d0155c03de233823dBL8;FFc0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aac10200f021601f91e8030091e00309aa02028052dc620194c10200f021043191e402", - "00d0L8;FF3f0108ebb3611932000200542b0440f90afc78d37369283808050091280800f98af6ffb43f0108eb93611932e00200547369283808050091280800f92004f8b7BBBL4;FF210a8052a8a20194fd7bbca9f70b00f9f65702a9f44f03a9fd030091c10500b40a0040395f2100f1a10500543f8418f", - "1c1050054f70300aaf40303aaf60302aaL4;FF0130009102008052641240f9842c4092641200f904d05f388410001284641a3204d01f383f000039420400115f00036b2100188b81ffff5482060051e103022aL8;FF3f0500b1e0010054ff8300d1fd7b01a9fd430091810100f0210c1691a40100d084802", - "591e323009182008052e80700f9d2a20094fd7b41a9ff830091c0035fd6BL8;FFaa220194a8630091090000f029c11c91e8a701a9a82300d1800200b0006c0191820200b042c00d91e1630091e8a702a99e220194800200b00020119190220194BL4;FF0201805201ed7cd39a22009474d64fa9350200b49", - "682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef8220080528e220094c1825ff8L3;ZBBBBBBBBBBL4;FF6e020e8b6c6a2938cc2100396d7a6df86d7a28f8a7ffff1788f27dd3df2200f1080114cbc832889a080117eb43190054080800f9000080929800001409fd7dd3L4;FF5", - "369283808050091280800f9cbfdffb43f0108eb93611932a00300540cfc6ad35369283808050091280800f92c0500b5e0030baa3f0108eb20010054290440f9L8;FF004014919e1f01948002009000a014919b1f0194ff8301d1fd7b03a9f52300f9f44f05a9fdc30091f40308aa080440f9e10700f93f00", - "08eb68060054080c40f9BBL4;FFf65752a9f85f51a9fa6750a9fc6f4fa9fd7b4ea9ff030591c0035fd6e0c30191fc0700f9069cff97e96f47a9f49340b9f85b48a93f0900b161010054f60300b4L4;FF08d962783f0008eb69000054020c001100080011e7c00291e0d860783f0000eb4294821adf00026b", - "8d030054e00315aa23fdff97f40300aac00b00b4e20213cbL8;FFe99f009468420191810100d021cc1791a40100b084200f91a363009182018052a80f00f9e09f0094e09f0094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1BBBL4;FFe85341b9e85700b957ffdfc8770000b5bcdf0194f70300aaff0", - "600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054L4;FB4a00000000000000b0010000090000007d004900000000004a00000000000000bb010000200000007d004900000000004a00000000000000e101000009000000L8;FFe10308aa220080529adf0094e", - "10313aa28e040f9e80000b420e440f9f30301aae10308aa2200805292df0094e10313aa28ec40f9e80000b420f040f9f30301aaBL8;FF94820091dc0200f97b8300d1d90a00b9d68200911a0200b4fb0100b49c0a40f9991a40b99cfeffb4970640f98d5f0194e0031caa210080528b5f0194c00400b4L8;", - "FFdf0208eb29f8ff54e00313aae10318aae20316aaae020094780a40f9bbffff17e00313aa22008052a9020094610a40f9c3ffff17e00313aae10316aae20314aaBBBBL4;FFe82f40f921827aa920829e3ce083c33c385e7ca921829c3c3f0400b1e183c03c28821ff835da7da920829d3ce083c13c21829", - "a3c20829b3ce0060054610000b4L4;ZFL8;FF220080522300805224008052f4030aaa77150094e10340a9ea0314aa2ca040a9290040f99369283808050091280800f960f9ffb63f0108ebe00000548a692838BL8;FFe10309aae67f0114281040b9000040f96800c8376800d037c87f0114dc7f0114dc7f0", - "114281040b9000040f96800c8376800d037af7f0114e07f0114e07f0114L8;FF60e3ff5481e20491e263009160008052a092ff9716ffff17e11740f9e80f40f91f0101ebe06e0054e81340f9968248f8490280520969213828040091df0600b1BBBL4;FF9cbf0194e12740f9810000b4e02b40f922008052", - "97bf0194e8c3009100c10091a2a6ff97f40b40f9df0600b1a0f5ff54e80340f9e9234039e81300f9e9a30039L4;FB010000000000000010e9470000000000af7b4900000000004e00000000000000b904000017000000af7b4900000000004e000000000000005707000005000000L8;FFe0031f2ae3031f", - "aa10c00094ff4303d1fd7b09a9f85f0aa9f6570ba9f44f0ca9fd430291283c40f9f30301aae20700f95f0008eb410a0054f70303aa788c40a9BL8;FFf80300aaa33f0194482740f91f0500b120030054592f40f95b6340b9991100b4542b40f98f3f0194e00319aa210080528d3f0194c01300b4e10314aa", - "e20319aaL8;FFa23f009400010090004015919f3f00940001009000a015919c3f00940001009000001691963f0094ffc303d1fd7b0aa9f95b00f9f85f0ca9f6570da9f44f0ea9BBBBBL4;FF680240f9080116cb9f0208ebc9fbff54e00313aae10316aae20314aa230080522400805202020094760a40f9d", - "6ffff17fd7bbaa9fc6f01a9fa6702a9f85f03a9L4;FF605c00b4e1074091028c8152f90300aa21401d919f0f009408c48052e00316aa01c48052e8e301f9088c8152f6df01f9f9e701f9e8eb01f9d3050094f90300aaL8;FFec374229eb2740b9ea9300f8e1230091ea1b40b9e9230039a9058052a8031ff", - "8e00313aac2048052e81302f8a80f8052ab831fb8e9470039ec2301b8e95b0039BL8;FFe3030091e00308aab78f0194fd7b41a9ff830091c0035fd6ff0301d1fd7b02a9f31b00f9fd830091080040b9f30300aae00301aa1f05007101020054210300d0L8;FFe82700a9cf8f0094a80100d008e140396002", - "4079810240791f050071c0fbff5474e8ff9760020079f44f42a9fd7b41a9ffc30091c0035fd6ff0301d1fd7b02a9BBBL4;FF081848ab02430054140114ab22430054d60600f1b5c2019161feff5495021aab42430054b500f8b6f6031faae00316aae10315aa9ccf0194d53e00b489cf0194L4;FBd8868d8", - "9f5fd19435e27785ced96d7a7d1a0a28cb5814e32a71683e900000821b001438b3a1128e3102805f6cbe5d42d07a138d42ab285635bbcf5d6d23d5bfaL8;FFe7cf00f9e8d740f9e0b3c23dedb300f9fa5740f9f44b40f9ea2312a9e88740f9f18700f9eadf49a9eb231ba9e82f46a9f0570ea9f50316aaea", - "d700f9e4ab40a9BL8;FFe92300a9dcffff17280180d20800f0f2081100d1d7ffff173f00156b81f7ff54680240f9e0031faa090540f90a0140f9290100cb4a01008be0031faa0a2500a9L8;FFe04b41f9220080529a4f0094e89740f9ffa711391f0500b160000054e02b40f922e9ff97f3d351a9940100b", - "47522009104000014940600f1b5620091e0000054BBBBL4;FF680a00b9e80180523f0400f1692201a908008092680200f96b0000542200805294ef0194a80600d11f1100b1a8fbff54e00314aae10315aa22008052f44f46a9L4;FB4c00000000000000f00700001d000000fe924800000000004c0000000", - "0000000020c00001d000000fe924800000000004c000000000000001d0a000016000000L8;FF8202805244008052fbe3ff97e00340f94cffff17c80080d20800f0f2080900913effff17e00300f9210200d021c01491230200d063181591e003009182028052BL8;FFc0035fd6e00313aaf60301aae10315", - "aae20314aa23008052240080520462ff97750a40f9e10316aaecffff17281040b96800c8376800d037ae6f0114df6f0114L8;FFe1431691ead302f95c0c0094e89b49f91f0500b1c0000054e8074091e143169108810991004103917f0f0094f87f49f9580300b4e1d342f9e8cb42f9f97b49f9BBBL4;FF0", - "39343a9dc850094b4af01940000162ab2af01941f1c0072a1f9ff54e80300d008b140f9680500b428008052690300d029b11491e82706a9680300d008611391L4;FFff0740d1ff071ff8f30303aaf40302aa810100b4a81300d1e9330091aa1300d1eb0301aa0c1440380c0100390c0140390c0200346b05", - "00f12c15003841ffff54L8;FF3f0014eb3c30949afc0500b4f4031f2ab50100b0b5c22291ba4300d1b60100d0d642129105000014720800949c0700f11400144aa00400546026407861274078BL8;FF810640f9810000b4820a40f9e00313aa982f0194e14b41f9810000b4e04f41f922008052932f0194e", - "89f40f91f0500b160000054406302910de5ff97f3d352a9L8;FFf65719a9f44f1aa9fd430591e18b00a9e80000d0e40f00f908b140f91f0900f1e3160054176040a928008052f40300aaa8ff37a9f900009039a302911a008012BBBBBBL4;FFe00313aa00013fd6810640f9c10100b4820a40f9e00313aaf", - "44f41a9fd7bc2a894170214280400d11f0d00b1c8000054000440f922008052f44f41a9fd7bc2a8L4;FFfa4313917b431d91090141d21f0100f128459f9a1f0500f1cc140054c82100b500e4006fa04700d1e143139137e3c0a9362340b902048052e03b813de037813dL8;FF08210e91680200f9f44f42a", - "9f65741a9fd7bc3a8c0035fd6680200d008e11e9174d600a9740e00f9680200f9f44f42a9f65741a9fd7bc3a8c0035fd600018052BBL4;FFa0031df84103009021c824914303009063942691a0c300d1e2008052040380522a000014a0031df84103009021c824914303009063e02591a0c300d1e2008052", - "L4;ZBL8;FFfd7bc4a8c0035fd6fd7bbfa9fd030091082440f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b140040054BBBL4;FF3f0500b140020054f40300aa161041b9171441b9152041b9008040f9e8c30091818640f990ad0094e8c34039680100", - "36c80300b008413a91e904805268a600a9L4;FB706172616d733a20c000000000000000d8184900000000004c00000000000000e200000014000000000000000000000008000000000000000800000000000000L8;FFe78342f9e08742f9e68b42f9e86b00f9e8f741f9f08f42f9e2a342f9faa742f9e4af", - "42f9e8e700f9e8ff41f9f7bb42f9f1bf42f9f4c342f9e3c742f9e82b17a9BL8;FF810000b4e09b49f92200805299570194f47749f99f0600b180aaff54f57f49f9f37b49f9350600b47622009104000014b50600f1d662009180050054c1825ff8L8;FF210100902120379102028052230100b0639403918", - "4018052e3000014e05306f9e0833291210100902120379102028052230100b063e80491c4018052da000014BBBBL4;FF080400f0080137911f30003960a200a9090d40f9e823009120013fd6e80740f91f0900b100fdff5475de40a9f6830191e183c33ce083c43ce82f40f9e283c23cL4;FB08000000000", - "000000800000000000000408242000000000000000000000000000800000000000000080000000000000088844200000000000000000000000000L8;FFe8fd073708fc60d3280c00b5080840921f1900f1620c0054017c0353810c00343f040071200200543f08007181030054890240f93f0500b1a10000", - "549f6600a9BL8;FF0109c03d08e142f80108803d08e002f8c8068052680201a9681200f96800805268a2003908008092000800ad682600a90e000014e08745ad08008092e237c03dL8;FF20a1813ce04fc13de8cf0ef92800805221a1803c40f18f3cf6bb0ef93821003928250039f4cb00f9a00b0054e8c", - "30091e0431691008542ad0201c73ce277813dBBBL4;FF140100b4e30314aab5b70194f50300aac00000b520008052e10314aaa2b7019494b70194350080522003c03de80740f97f0600f1e92740b9d41200f9c082823cL4;ZDL8;FFa5c03391e1230091e2030091e0031f2ae3031faa0db80094c00100900", - "060339197b70094ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aaBL8;FFe0070ea9e00303aae20f0ba9e4170ca9e6230da9ff230b39ff7b01f9e20f0fa9e41710a9e62311a920013fd6e06b01f9e8c31791f3c31791e16f01f9290c40f9L8;FF08b140f9fa6740f9080600b4640247", - "a9e8830f91e1432a9163820391220080524198fe97fcf341f9a0c2c73ce8ff43b9f6eb43b99f0b00b1a01e813de8f307b9BBBBBL4;FF0043c03ce0853badc0010054610000b42200805297070294b60000b4e00317aae10316aa2200805292070294b40000b4e00315aae10314aa220080528d070294L4;F", - "Fe0230091e10315aae20314aa2300805224008052f30308aa7be8ff97e80313aaf35741a9c7ffff17e0230091f30301aae10314aae20315aa2300805224008052L8;FFe00308aa6201805204018052e9af00a9ea0300f9dd070194fd7b42a9ffc30091c0035fd6400200f000101e9101058052c0035fd6e0", - "031faac0035fd6c0035fd6BL8;FF9c870194ebffff17617e40f93f0400f18b000054608240f92200805295870194619640f9140080927faa00f9747e00f93f0400f17f3a00f98b000054609a40f9L8;FFa80f00f9e8870094e8870094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f", - "9fd430091e90301aaf30300aa61010090212c1e91e8030091BBBL4;FF978300f9600a0054e0030691f52700b9fa2300f9e1afff97490080d2f73740f91f0700b10900f0f2898300f9000a0054e0030691d9afff97f55f40b9e94f40b9L4;FB742073657373696f6e2062617365206b657920c01d2c206e75", - "6d626572206f662070726576696f7573207374617465733a20c000204e6f2076616c6964207365L8;FF6b114df8e00b18ade213c23de417c23de95300f9eccb43f9e00bc23de18b14ade11bc23de31fc23dea7202f8e203c23de8ff43f9e9030caaebbb01f9eba35f39BL8;FF630800544d19c039ae1d001", - "28c390e0b8c1140518d00f83761710c8beb0080521e0000149f014871830700544d1dc039ae1d00128c550e0b8c0148518d00f837L8;FF081840b9c8050034080140b20811c0da081540d2080d088b0825019108fd46d308050091091c40b909050034290140b22911c0da291540d2290d098b29250191BB", - "BBL4;FFb42240b997e70194000480522100805295e70194c01f00b4600740ad08048052e93b40f9330100b9000400ad288100a9280d00f9342100b9670000140b257ea9L4;FB0900000000000000090000000000000080e048000000000087e0480000000000000000000000000000000000000000000000", - "0000000000008de0480000000000L8;FFa083d23c010300ad200800b5f4af40f974d2ffb518000014c0ffff545801001480ffff54a80a00917c0000140800809249008092680200f9681a00f9694200f9BL8;FF2100805298670194400300b4e10314aae20313aaf50300aa9e67019428008092d5ce00a9c", - "80200f9f44f42a9f65741a9fd7bc3a8c0035fd6e90b41b2097d00a9L8;FF220080529b670094610640f9810000b4600a40f92200805296670094603240f9a00000b4613640f9610000b42200805290670094611e40f9e10100b408068052BBBL4;FF81010054ea0f40f9090180d20900f0f248dd78922901", - "40b20a000014ea474039090180d2e8031faa0900f0f205000014090180d2e8031faa0900f0f229017fb2L4;FFf30300aa000440d1a40213cb650e7fa96202048b630005aa83feffb5734200d11f0013eb41ffff54020080d2efffff1780ffff97140080d281018052010000b9L8;FF00210091f403022aa2", - "630091f503012a21008052e80700f9a90f00f9c9a70094e103152ae003132ae203142ae801009008e140391f050071a0faff54f303002aBL8;FFe1f3803cff270194e0030091c52701947f020039fd7b42a9f31b40f9ff030191c0035fd6ff8302d1fd7b08a9f34b00f9fd0302910010c03c01f0c03cf303", - "08aaL8;FFbfc31fb8cf260094a0c35fb8fd7b41a9ff830091c0035fd6ff8300d1fd7b01a9fd430091e023009101018052ff0700f9c4260094e00740f9fd7b41a9ff830091BBBBBBBL4;FF0801148a206b68fc00a8200e0a00669e4afcffb5f9ffff17200340fd00a8200e0800669e0801c0da0811c0da08f", - "d43d3e0ffff17220000d042f01191e1630091L4;FF810000b4e00b40f922008052991b0094a0877eada8035ff8960200f9881600f9280080528082803c8182813c68620039f44f4ca9f6574ba9fd7b4aa9ff430391L8;FF1f0400f1a10100549ffedfc8610240f9810000b4600640f922008052951b0194e", - "00313aa0105805202018052f44f41a9fd7bc2a88f1b0114f44f41a9fd7bc2a8BBL4;FFe96a403908010b4aeb4f40b9e8620039e86e40394a010b4aeb5740b9ea660039ea72403929010b4aeb5f40b9e96a0039e976403908010b4aeb6740b9e86e0039L4;ZFL8;FFce1540d2ce0d0e8bce250191ad194e8b", - "bf010cebe30100546b0500f1ec030daa81feff54a90109abe2000054200108ab62010054fd7bc1a8c0035fd6e90309abBBBL4;FFe1fb843de2ff843d220741ade003853de113853d210340ade20f853de00b853de107853d9ddb0194e84b4af9e94f4af96002029121030191620180521fff0139L4;FBb06", - "3440000000000737461636b000000485344000000000008000000000000000800000000000000545644000000000048534400000000000800000000000000L8;FFe60302aaea0314aae0f3803df00300aae0030eaaf9031baaef0303aaf10304aaeb08001408234039f87700f91f190071a1200054480200", - "b0e00309aa08b140f9BL8;FFe277813de06f813de173813d018141ade807409108810991e06b813de167813d68a50094e83349f94083c03ce93f49f91f0500b1e01b843de93b08f9e0110054L8;FFe063813de167813de8a305b96c080014f37740f99f0600b1001a0054e01bc13de11fc13de9830291e88", - "344b9e1a30c91022780522041893cf883329121418a3cBBBBL4;FF610a40f9a04302d1e8630239e00744ade08702ad738d0094a00642a9e2430191f4430191f3f6ff97a80a40f9481500b40dfc79d3fb2745a9e1e7076fb03a40a9L4;FB2d72656769737472792f696e6465782e6372617465732e696f2d3", - "13934396366386336623562353537662f62797465732d312e31322e312f7372632f62797465L8;FF081900913f0108eba121005481220091e20313aaca030094f50300aae90100143f0900b140250054880080d20800f0f2081100913f0108eba124005481220091BL8;FFe10317aae20316aaa27b019495", - "7b0194e00313aa21008052937b0194200200b4e10315aae20313aa930200a9997b0194e00315aae10313aa22008052930a00f9L8;FF2200805223008052240080527891ff97e11740f9e00316aad6fdff17e06300912200805223008052240080527091ff97e11740f9e3fdff17e0630091e10318aaBBBL4", - ";FF61510054965640a9e92347a9ca0600918a0200f93c5200b49f3f00f1ec4300f9f72f00f9e200005468037d929f1300f189008052082100913431889a0f000014L4;ZBL8;FFe28fc03de93301f9e1020fad8282803c4ffeff97e027c13de12bc13de0230b91e22fc13df56b42f9f77742f9e86342f9e26", - "f42f9e47b42f9e10315aae30317aaBL8;FF290d098b2925019129fd46d30801098b130500917f0209ebe90b0054088c5cf81f0500b1e00900541efeff97080040b20811c0da081540d2080d088b08250191L8;FF3c008092860b0014759a41f9e8830f91e00315aa723b0094a8624039f7f341f9c90080d2", - "f6f741f9eaf343b90900f0f2e8e30f39ebf743b9e8fe48d3faff41f9BBBBBL4;FF240080520afeff97770a40f954feff17e00313aa22008052230080522400805203feff97610a40f95bfeff17e00313aae10317aae20315aa2300805224008052L4;FFa0873dade1050054a0877dade0030191e00702adf", - "de2fe97f60300aaf70301aae8f3009189008052e08702a9e0030091e163009142008052e8a701a98c030094L8;FFf44f03a9fd030091130040f9740a40f9680240f99f0208eb80010054680640f9890600910815148b010900a9031101a9690a00f9f44f43a9f65742a9f85f41a9BL8;FFa8035ef8ca0240", - "f9490108ebe3160054ea0240f9b4835df84801088be80200f9c90200f988fe60d3e80a00b5800a40921f1800f1e20a0054817e0353010b0034L8;FFe9031aaa2b4540784a0500f10be11f781345007881ffff54e93340f92805098b01f17dd3e8f300b2a8aae0f23f0108eb48540054fa2b00f9214500b4f", - "30301aaBBBL4;FFa4cb0194f702168bb7031ef85f0317eb401c0054a8835df8ea060091a1c300d1e0031baa49048052aa031ef809693738fcb6ff97b7035ef8ba035df8480317cbL4;FB6f6e496e76616c6964000000000000005f234900000000004a00000000000000b602000009000000251949000000", - "00006a00000000000000550100002a000000L8;FF2281c33ce7bf43f9f5a35d39e24344f9e38715ad2181c43c2381c63ceb4744f9f64b44f9f84f44f9e20713ad2181c53c699346f89b8208aaf40319aae8cb43f9BL8;FF08068052606a68f822008052f44f41a9fd7bc2a8974b0114610a40f9e10000b40", - "8018052606a68f822008052f44f41a9fd7bc2a88f4b0114f44f41a9fd7bc2a8L8;FF9f4b0094000100d000e005919c4b0094000100d000801291994b0094ff8300d1fd7b01a9fd430091e80301aae00700f9010100d021601391040100d084e01291BBBBL4;FF41fb0191080102ab2935899ae82715a9a2e", - "b0194e04302918102158be20319aaf93f04399beb0194e83f4439f6031c2af503082a08108052020115cb140302ebL4;FB0800000000000000304b420000000000000000000000000008000000000000000800000000000000304b42000000000000000000000000000800000000000000L8;FF210840f9f", - "40300aa680240f91f0101eb000b0054680640f92a040091e00314aa490180526a0a00f90969213863670094e10313aa0aebff97803240f9800100b4BL8;FF69220b29680080527b0201397a7204f86882013936f7ffb579feff171f09007121010054ea4740f9691f009148dd789207000014ea074239e80", - "31faa691b0091L8;FF210200341f1100f160020054e003082ae20313aae303142ab5ffff97c0fdffb4d2ffff17280180d2e00700f90800f0f2081500d1deffff17e90b41b2e92300a9BBBL4;FFba830094b7c35e38ff0a00712101005408008092680200f9f44f47a9f72b40f9f65746a9fd7b44a9ff0302", - "91c0035fd6a0d3de3ce007803d8aab019480048052L4;FF1f0067f2ce014bb2ad018e9a8c010f6a0e9465d3ab118b9a8d01100a6f0148b21f010d6ae8118b9a9f010e6a0b014fb26d11889a1f005af2ad014eb26b018d9aL8;FF01faff54e00300912eab0094cdffff17e00740ad60220091e20bc03de81b", - "40f9800600ad820a803d881a00f9f7a4ff97f44f4da9f6574ca9f85f4ba9fa674aa9BL8;FF2083c83ce9a70b9121f18f3ce9e70b912183c33c20f18f3c2083ca3ce9270c9122f18f3ce9670c912283c53c20f18f3c2083c43ce9a70a9121f18f3ce9e70a91L8;FF28030036281f00121f050071ec040054c", - "8520035381f4092fa0f41b2e80318aa9c02001438ff48d31a0180d21a00f0f2091f4092fb0309aaa1035df8415300b5BBBBBBL4;FF8a6928380805009120008052290040f9280800f983ffff17e00301aaf30301aae10309aa220080522300805224008052f4030aaafe0500946ca240a9ea0314aaL4;FFf", - "7c700f9f70302aa22008052fb0309aaf9031aaafa030caa96130094e20317aaf7c740f9ec031aaafa0319aae9031baaff0600b1800a0054e0431391e10309aaL8;FFf31b40f9ff030191c0035fd6e083c03c080080126042803c680200b9fd7b42a9f31b40f9ff030191c0035fd6fd7bbea9f44f01a9fd03", - "0091f40300aa2301f8b7BBL4;FF8826089be94f40f939000014eb230091ea430091200300d000b83191eba305a9a86301d1e8a706a9a8a300d1290000b0295119914a017db2e1630191e8a707a9L4;ZDL8;FFa2018052e40314aaa8831ff8e6930094610100f021f41b91840100d084a02991a32300d1a20", - "08052b3831ff8de93009468620091610100f021081c91840100d0BBBL4;FFbbc80094f50300aaa08302d18ebcff97f45740f9a10300f021c42b91a30300f063242c91a08302d10203805224028052b50316f8f0c70094b50356f8f95340f9L4;FBfb1d89ce94573302d5ae1859337f110eb703d6ff434858", - "191ed7683db94e69ee5cf62c0f438f5ca7a02d0b70b64fd4ad0000c45894099bfd591916cd63d6733eL8;FFe22f40f9e98b00f969018052e0f3803de193803df1d300f9f10317aaf44300f9ed6b00f9ed0310aaf00315aa2bf7ff1756450036e86345f9e96b45f9ea7345f9BL8;FFf97b49f91f0101eb403", - "70054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9450c0094fad342f9e8cb42f908011acb1f0308eb48360054L8;FFe0a350a9e20313aae17740f9081540f900013fd6e06b01f9e8c31791e16f01f9290c40f9e1830b9120013fd6fcfb42f99f0f00b1810d0054a8008052a5ffff", - "17BBBBL4;FF2c0e0054e00b40f9f71740f9c80e0035e90f41b27a000014a083de3c6082823c08008092f71740f9687200a9b60000b4e00317aae10316aa220080528df30194L4;FB330000000000000038000000050000009a96480000000000330000000000000080000000050000009a96480000000000", - "33000000000000008800000005000000L8;FFbbe8ff97e10300aae10300f9210200f021001a91230200f063101591e0030091a201805244008052f3e7ff97e00340f97cffff17c80080d20800f0f2080500d1BL8;FFa2033fadce73019400e4006fbff31838b0c302d1a8277229aa2f7329ac377429a0033", - "ead0809c05a2909c05aa0033fadae3f7529a003dc3ca103dd3ca203de3cL8;FF9c730094e18349f9e1acffb4e08749f963fdff17e18b49f93f0800b1800100543f0400b140010054810000b4e08f49f9220080528f730094e19749f9810000b4BBBL4;FFf85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6", - "b5537ba9bf0a00b140feff54a0637da9bf0600b1b9077ca9bb8312f860f9ff54e00708a9a06303d1d79bff97L4;ZBL8;FF021600543f01146b63feff54c13240f9ca2a40f9f90b40b9480101cb1f0d00f12902005428100091c92e40f92b0bc05a4a0108cb5f7d00f12b6921b8c83200f9BL8;FFe1c32291", - "02288052a23301943f0b00b1e1c8ff54a3010014c80080d2e15706f90800f0f2080900d1ca000014e05706f9e80b41b2c7000014c80080d2e15706f9L8;FFe0432a91e10000b021e0029102028052e30000b06320039104028052c9000014c80080d2e0632a39e0432a910800f0f2ff672a39e84b05f9ad2", - "8ff97e10300aaBBBBBL4;FF290040f9080140f9291502cb000540a9228100d15dffff1708138052090040f92a0040f948fc089b290140f9200540a94801088b026102d19bfeff17fd7bbea9L4;FF08c100511f250071e85300544a018052f6030daae1030eaa29210a1bef0310aa287d60d3a8020037bf02", - "0014e9031f2a4c018052ea0100b4297dac9b3f7d60f2L8;FF601240f9220080529a030194611a40f9810000b4601e40f92200805295030194b40000b4600640f9e10314aa2200805290030194e00313aa080c45f81f0500b1BL8;FF030d40f982048052fd7b43a9ff03019160001fd608200091096000910", - "20300f042bc0291e82700a9e8030091090000b029511991200440a9e82701a9e8230091L8;FF640100d084200a91a363009142018052a80f00f9e4830094e4830094fd7b41a9f31340f9ffc30091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaBBBL4;FFe0e31591e8bf02f9eac302f9f19f", - "0094fd7bbea9f44f01a9fd030091f30301aaf40300aab8020094888e41f81f0500b160000054e00314aa3facff97e00314aaL4;FB5e0100002e00000034684900000000006a000000000000006e0000002e00000034684900000000006a0000000000000002000000260000000000000000000000L8;FFe8", - "c741f9e85b00f9d70000b4e00318aae10317aa2200805296c30094e90315aae1f341f9a10000b4e00314aa2200805290c30094e90315aadf0600b1f7430d91BL8;FFe20314aaa3020094760a40f9680240f9080116cb9f0208ebe9f8ff54e00313aae10316aae20314aa9a020094760a40f9c1ffff17fd7b", - "bda9f50b00f9f44f02a9L8;FFa10000b4e07b40f92200805299430094e9030b91ea0740f9e81740f92015c03df87f00f9eaa30ea9e89341f98082823ce8bf00f972ffff170801009008c12391BBBBL4;FF41fdff54e043059181008052bee30194e0e90035e85341b9e8d300b957ffdfc8d70200b4ff0600", - "b100030054f843059199008052e00318aae10319aae2031f2aL4;FB530000000d00000073e8480000000000380000000000000082000000090000007375636365737366756c6c79206465637279707465643b206d75737420686176L8;FF1f0d00f1c3020054a8c300d1690000f029913f91e8ab05f90802", - "00f008ed1591e9af05f989008052000200d0002c3091e8cb03f9e1432d91e8d303f9080200f0BL8;FFc10200f021082a91c40200f084e01291e0030091a363009142018052a80f00f9e1630194c10200f021542491e40200b084402391a363009142018052b30f00f9L8;FF2b000b0bac1d00128d00f8376", - "1710c8bab008052300000144d15c039ae1d00128c1d0e0b8c0102518d00f83761710c8bcb008052280000149f11407163080054BBBL4;FF160080923b0080524c0000148e290094fb6b44a97f0700b100170054e9e345a9e083c73ceae746a9e183c83ce86340f9fcdb49a9e00701adf7834ca9ea2301a9L", - "4;FF43cf74b3631200f921040051830c40b93f00146b21b0821a630400113f000071830c00b921a09f1ad6021091e6ea009143008052b51600126420c11a84040051L8;FF080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091810100f0210c1691a40100d084002091e323009", - "182008052e80700f9cfa30094BL8;FFe92300a9a9230194ff0301d1fd7b03a9fdc30091e8030091490200b029c10d91e00700a9800200b000280591e82701a9e8230091820200b042200f91e1430091BL4;FFfdc3009143010034081c0012f30302aa1f0900714c010054080200341f05007141030054000", - "180521d000014280180d20800f0f2081d00d11e0000141f150071L3;ZBBBBBBBBBL4;FFfc6f06a9fa6707a9f85f08a9f65709a9f44f0aa9fd430191170c40f9e9830091e22702a9e80201ab02100054160440f9c9060091df2200f129fd43d32af17dd3L4;FF09604039690f0037f40308aa182040a9f303", - "00aaa0c300d1028d40a901a3009117130094b95f7da9b55b7ea93f0b00b1e1020054760300b4a8c300d1e00315aaL8;FF0001805201058052b21d01948002009000801e919a1d0194f8031faae00318aae10313aaa01d01948002009000201a91961d0194800200900080139183020090BBL4;FF1a1740d2", - "17140038989d01945f1f00f1a8010054e08744ad80020191a14301d122008052a0873dade08b45ada08b3eadc39d019400e4006fff6300f9e08304adL4;FFe10302aae20303aae30304aae40305aae50306aa010000d4c0035fd6f7ffff1740d01bd500008052c0035fd6c0035fd6fd7bbfa9fd030091fdf", - "fff97017c4093L8;FFe00301aa080140391f050071a1000054a10100b021300d9102058052d39d0014a10100b021bc0c91a2038052cf9d0014080040f9e00301aa08014039e8000034BBBL4;FF390300eb632a00541803008b060000141f0400b1e1290054b9dd01941f1000316129005439feffb5050000", - "14e043059181008052b4dd0194a0280035e85341b9L4;FB8909490000000000490000000000000081000000200000006f766572666c6f7720696e204475726174696f6e3a3a6e657700000000000000d309490000000000L8;FFe9f300f909dc40f9e93300f909e040f9e9f700f909e440f9e92f00f909e8", - "40f9e97f00f909ec40f9e94b00f909f840f9e98300f9a0a600541f050071e1c70054BL8;FF02738052a35d0194e083c53de187c53d15008092e8436c79e057813de15b813de8e30a7920010014e8074091f6a745f90023009108810991f407409194820991L8;FFe10313aa5dfaff97803e40f9800100b46", - "10a40f9680240f91f0101eb200d0054680640f9090180522a0400916a0a00f909692138e10313aa50faff97e00314aaBBBBL4;FF0c00669eccf4ffb50b0180524a010b8b6b2100914a01098a00696afc00a8200e0c00669eccf3ffb5f9ffff17000140fd00a8200e0a00669e4a01c0da4a11c0daL4;ZFL8;", - "FFe00314aa2ffd0094880640f9e083c03ce1031faa2823189be90f40f92a0700910001803d090900f98a0a00f9b4ffff17e1031faa881e00b9b1ffff171f0100f1BL8;FF42018052a9831ff8dc7d0194fd7b42a9ffc30091c0035fd6092000912103009021c03f91040300d084e01291a32300d1e00308aa", - "c2048052a9831ff8cf7d0194L8;FF0001188ba37d00940803168be81700f9965a40f9560300b4e11740f9e80f40f9945640f91f0101ebe0420054e81340f9490480522a040091e00316aaea1700f9BBBL4;FF200280522100805297bd0194002a00b4280f8052890300d029d53d914a0080d22001c03d084", - "00039280380520a00f0f229028052480108aa690201a90000803dL4;FB0800000000000000f0674800000000004468480000000000a46848000000000018f6470000000000280000000000000008000000000000003c67480000000000L8;FFa4bd009468e20791e023009131300094e0630691e12300910", - "23280529dbd0094e1630691e00313aa023f805299bd0094ff430e91fc4f41a9fd7bc2a8c0035fd6BL8;FF6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b2L8;FF1f0500f120010054e80b40", - "f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faaa03d0094e00741a99e3d0094fd7bbaa9fc6f01a9fa6702a9f85f03a9BBBBBL4;FF080117cbbf0208eb29d3ff54e00313aae10317aae20315aa230080522400805203000094770a40f991feff17ff0301d1fd7b02a9f44f03a9fd8300914800", - "01abL4;FF220080529b0d0094e8af40f9a80000b4e09f40f9e1af40f922008052950d0094b50000b4e0df40f9e10315aa22008052900d0094f85b5ca987000014e0d7c53dL8;FF080440b9090440f96202009042a02991200440a9e80b00b9e8230091a9831ff82902009029b11291e8a701a9a82300d129", - "02009029c10d91e8a702a9e3630091BL8;FF210300d021702991e00308aa82008052fd7b41a9ff830091d48d0114ff8300d1fd7b01a9fd430091090040f9e80301aa2a4540b85f01007129119f9a5f050071L8;FFe0130079e0230091a1c31f78a11300d103acff97fd7b41a9ff830091c0035fd6ffc300d", - "1fd7b01a9f31300f9fd430091e90301aaf30300aa610100d021c82091BBBL4;FFfc6f4ca9fd7b4ba9ff43049199cd011420008052f58303a9ff2700f93ac2ffb5e82740f9e083c33ce81b00f9280f00f928008092e00b803d2083803c280300f9L4;FB6f756c642062652073697a65203200008021490000", - "0000005800000000000000760000002f0000007370717220666978696e672062616420656e63617073756cL8;FF6183c53ce20b813d6283c73ce0071ead6083c63c6183c03ce28f1fad6283c33ce0fb803d6083c13cf60742f9e1031cad6083c23cdf0600b1e00b1dad40560054BL8;FFe00600ad9723009", - "4e00640ada00302d1808702adc34d0194e8430691a08303d1c1e20091028300911b80ff97e89341b91f050071610600542007c03de9b341b9L8;FFe10316aae20317aaf40300aaa14d0094582f40f9d80100b5c3ffff1737008052591740f9b7831ff859fcffb535008052572340f9b6831ef8b8431fb877", - "fdffb5BBBBL4;FF08050091d50600b4a90240b22911c0da291540d2290d098b29250191a91a498b29050091380108abe2050054b800f8b6f9031faae00319aae10318aa9aed0194L4;FB74617465496e76616c696450726f746f627566456e636f64696e6700000000000000000000000000080000000000", - "00000800000000000000a484420000000000L8;FF7b030094610a40f9e6ffff17fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30301aa210840f9f50300aa680240f91f0101eb800b0054680640f9b60a40f9BL8;FF9f021aebc0030054080e805238070091f70600d1c97e089b3627089ba0c301d1e", - "10314aa9f0d0094e80740f9a0877eada203df3c0801168b000502ada0877cadL8;FFfad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aaab100094fad342f9fc0740919c8301914afeff17400100f000201c91906d0094BBBL4;FF807240f9220080529aad019480020391a694", - "ff970801805280220191955a09a99f220ca908048052955e0aa9985e0ba99f220da999220ea99cf200b96e94ff97L4;FFe10316aaeeffff17fd7bbda9f65701a9f44f02a9fd030091140840f9f30300aa3f0002716200005435008052080000143f002071620000545500805204000014L8;FF4100805298", - "ad0094602600b4930a40f9f60300aafc831ca9ffef00f9930300b4f7031faa3c008052e80316aa080000146907c05a09693778f70a0091ff0213ebBL8;FF8083cf3c7f0b00b1a80319f8404f803dc1220054f8630191e8031691e00315aa1ba30191f54301f9f5031691ba3aff97e8c342f91f0500b16013", - "00548043c03dL8;FF2c000014160180d21600f0f2150500b4e00314aae10315aa22008052952d0094da0e009123000014fa074bf9fb0b4bf9e0e31791f90f4bf9fc134bf981e20091BBBBBBL4;FFf44f44a9fd7b43a9ff430191c0035fd6e80b40f96a0640f9490108eb430200546a0240f9e00740f94801", - "088b682600a9800200b9e0031faaf44f44a9fd7b43a9L4;FF6183823c4183c53c6083833c4083c63c6183843c6083853ce00755ad62838c3ceabb0bf9e3e7c53de4f3c53de0d7853de2dfc53dea1b4cf9e02b813de0efc53dL8;FF7f0101318a200054e9030aaa6b1d00122cdddf389f0101316a20005489", - "1d00124dcd5f382c150012e9030aaaac091a33fe0000149f2200f189040054a8024039BBL4;FF894a4039ea8b4039e88700394801094a894e4039ea8f4039e88b00394801094a89524039ea934039e88f00394801094a89564039ea974039e89300394801094aL4;ZBL8;FF291540d2290d098b292501912", - "9fd46d30801098b130500917f0209ebe90b0054088c5cf81f0500b1e0090054c3f9ff97080040b20811c0da081540d2080d088bBBBL4;FF882700a908fc60d3a82a00b5080840921f1900f1822c0054017c0353613100343f040071200100543f080071c1faff54c1420191a2a302d1e003082ab3beff97L", - "4;FB3a53434b41204b65790000000000000038204900000000005800000000000000a400000018000000e11f4900000000005600000000000000c800000009000000L8;FFeaa318a9e80344f9ea0b44f9e8eb00f9e81344f9e82b14a9e81b44f9ea1744f9e92313a9e81f44f9e92344f9e8ab01a9ea2744f", - "9e82b44f9e8ab04a9e82f44f9BL8;FF080500911f0109eb681200548e0000148002039112170094080040b20811c0da081540d2080d088b0825019108fd46d30900088b390500913f0308eb49100054L8;FF4801009008b140f91f0d00f143070054e8833291e0032d91477dfe97e85346f91f0500b18062", - "0054e85b46f9e9f31691e02bc33de95b04f92900009029612091BBBBL4;FFb3f50194ff4301d1fd7b03a9f32300f9fdc30091080040f9130140f91f0100f9f30100b4281040391f050071e0010054690240f9e803009120013fd6e00740adL4;FB794b657950616972537472756374757265000000000000", - "0028914800000000004c00000000000000e200000031000000c9944800000000004d00000000000000L8;FF430c80522feeff97e10300aa00feffb5a80640f91f0116eb49050054e00313aa7ef4ff9740fd073728fc60d3080500b5200840921f1800f122050054217c0353BL8;FFc0035fd6ffc300d1fd7", - "b01a9f31300f9fd430091e90301aaf30300aa0103009021d02891e8030091e00309aac2018052dc750194686200910103009021082991L8;FF4afd46d34a05009102000014ea031faaf67b52b9df06007181010054eb7f52b9ec8352b96b0100346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46", - "d3BBBL4;FF08050091683300f9cdb5019408e37a92e0030191e20318aaa102088bf8ff0139180880529bb50194e8ff4139e90740f9f503082a020315cb386540a93c0302ebL4;ZDL8;FFf3030caa9bb50094ab835ff8ec0313aae0c20191f40740f9fa0000b4e0030caae1031aaa2200805292b50094ab83", - "5ff8e0c20191f3031f2afb031faaf91b40f9BL8;FF000500ad0209803de9f702f9e083329117ebff97fc9740f9e89b40f91a008092fafb02f9e87300b409038052fb031faab7020090f77614911471099bf8032d91L8;FF2801881ae9bb40b91f01096b61050054e2d341f9e5b34e39e0c30991e35340f9e", - "45b40f9e1c324912600805246f0ff97e83b41f91f0900b180770054c90080d2BBBBBL4;FF880080d20800f0f2080140b2a8031df8a0c300d1b6fa0094e1a341a9f45743a9800200b4490080923f0400f1690200a98b000054e00308aa220080528d050294L4;FFe10f40f9e80740f9b51e40f91f0101eba0", - "0d0054e80b40f9490480522a040091e00314aaea0f00f909692138e123009181e5ff97f60f40f9e80740f9080116cbL8;FF00200091f44f42a9f65741a9fd7bc3a88802001400200091f44f42a9f65741a9fd7bc3a84d020014012040f93f0800b1400200543f0400b100020054e10000b4BL8;FF0a0000d", - "04a511991a8831ff8020300f042dc3791e9ab00a9e3230091b2850194fd7b43a9ff030191c0035fd60a10009109200091e8030091200440a9a9831ff8L8;FF9c850094e8cf40f91f0500f1ab000054e0d340f901f97fd34200805295850094e8db40f91f0500f1ab000054e0df40f901f97fd3420080528e", - "850094e81b40f9BBBL4;FFf52743a9e1030191022c80522001c03d290940f9e00315aa0001803de9cf00f99cc50194e8274529b4a20539a96201b9a86601b9bc0000b4e00f40f9e1031caaL4;FB8b634900000000003800000000000000b80100001d00000064656372797074696f6e206661696c6564696", - "e7465726e616c206572726f723a20656e7465726564L8;FF99c50094005900b4e10319aae2031caae05f00f99fc5009423000014f60314aa3a008052892000b4f40309aa8dc50094e00314aa210080528bc50094605800b4BL8;FFc1c20091e20313aadefcff97000100b4d6000014e01c00b5e00313aab7", - "fdff97e80301aa40010036481d00b5e1031faa61f9ffb4f1000014e20313aa430c8052L8;FF0800f0f217000014e00313aa76050094e80300aae8070036e00301aaf44f45a9f52340f9fd7b43a9ff830191c0035fd68000805206000014e00313aa6a050094BBBBL4;FF82080054170e8052a8e279d3c9e2", - "79d35304179b141115cb221116cbf50301aae00315aaf60303aa6102148b93e50194c056179be10313aa2f0000140a0e8052L4;FB3a20c00e20616e6420636f756e7465723a20c0022e20c000083c6572726f723a20c0013e002f72757374632f3438613232396365616566643439383563353039L8;FF17", - "693538d5260091750a00f9680240f9bf0208ebe1f8ff54c4ffff17ffc307d1fd7b19a9fc6f1aa9fa671ba9f85f1ca9f6571da9f44f1ea9fd43069169020090BL8;FFbb5a0094e12b40f9280400d11f0d00b1e8000054e82f40f9f40300aa22008052e00308aa93650194e00314aa984dff97280080527806", - "00f9680200f9f44f50a9L8;FF61da40f9810300b460de40f91800001461ce40f9810000b460d240f9220080529465009461da40f9810000b460de40f9220080528f65009461e640f9810000b4BBBL4;FFe80740f9080116cb9f0208ebc8070054e80b40f9e10315aae20314aa0001168b9ca50194c802148", - "be80f00f9e083c03ce80f40f9290080926082803c680e00f9L4;FFe707009473fdffb48afdff97f50300aae10313aae00314aab30240b9e6060094b30200b9e3ffff17a042089196070094eeffff17634000d1ff1040f2a0000054L8;FF29194a8b29050091200108ab62000054fd7bc1a8c0035fd6a0010", - "0f00040099197a50094a00100f000001c9194a50094a00100900000149191a50094fd7bbea9BL8;FFb502000a1f01096be0179f1ab3250194882e4039692e4039aa02000ad6020a0a1f01096be0179f1aac2501948832403969324039f503002a1f01096be0179f1aL8;FFe0070eada00a41ade82301f9e0", - "0b0fada2250094880201d1ffff073902fd47d31bdd799216194092420100b4e82341f9e92741f920030291a1020191080102abBBBBBBBL4;FFe003082ae20313aae303142aaaffff9720fbffb427000014e00313aa1a1a0194e80300aae00301aaa8fd073621000014e80741b2400000145f2800f1880000", - "54L4;FF0281c43ce10740f9e20304ade11f803d2b000014baef7aa917008092a003dc3cbc835bf8e00f803d0c000014e00316aa6083c23cb6eb7aa9bbf37ba917008092L8;FFfd7b41a9ff830191c0035fd6ff8300d1fd7b01a9fd430091082440a9e0030091e82700a932ffff97fd7b41a9ff830091c003", - "5fd6ff0301d1fd7b02a9f31b00f9BBL4;FF6443c33c6543c23ce0630491e86300b96043c43cf7030091e8b300b9a8a64439f663049169c301f8090480526143c53c1f010071e80303916243c03ce8a711a9L4;ZFL8;FF4a01084a6b01084aaa931638aac356382901084aaba31638abd35638a9b31638a9e", - "356384a01084aa2833bad6b01084aaac31638aaf356382901084aabd31638BBBL4;FF2800805268020039fd7b47a9f34340f9ff430291c0035fd6ffc305d1fd7b11a9fc9300f9fa6713a9f85f14a9f65715a9f44f16a9fd4304915a2040b9f60302aaL4;FB73656e645f656b2e726563762065706f636820", - "c01b3a204b65797353616d706c6564202d3e2048656164657253656e74002f636172676f2d6769742f73706172L8;FFe8a743f9022f8052e04bc23df5df43f9fae343f9e86b00f9e8af43f9fceb43f9f71744f9f92344f9f84744f9e8e700f9e8b743f9fb6b44f9f67344f9e0f3803dBL8;FF6bfd46d36b0", - "d009104000014eb031faa0d0000144b0080522c0100348c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c05009102000014ec031faaL8;FFa4590094e0c31d91e1c3229102288052a0590094f3031faaf9031faa35008052e0c32791e1c31d91022880529959009400630091e1c32791022880", - "52fb9b05f9BBBBL4;FF01028052b3f90194000400d000201891aff90194ff4302d1fd7b06a9f65707a9f44f08a9fd83019109604039f30300aaf40308aa490200343f0d007101080054L4;FB20c00e206661696c656420776974682027c023273b2063616e6e6f7420676574207265636569766572206368", - "61696e20696e666f2028c00129002e5265636569L8;FFe80741b28082863c8182873ca0877cad8082883c8182893ca08779ad8082823c8182833ca0877aad8082843c8182853ca08778ad8082803c880200f98182813cBL8;FF6c0300543f140071e00500543f18007161080054a8835ab848000037b9831", - "af8e1d20191a22301d1c763ff97e0f7ffb4660000143f0c0071600500543f100071L8;FF15008092e8e30a79e057813de15b813de6010014e8074091f6af45f9e043259108810991f5074091b582099137b9ff97f43349f9e0431691a122009102738052BBBL4;FFc3140094e8230291e20300aae12f40f9", - "00610091e30315aa92fbff97e42748a9e34f40f9e50314aae80317aa7f0009ebc1f8ff54e81300f9e9234ba9e52f00f9L4;ZBL8;FF88f247f8a9e300d1602e803d2001c03dff6702f9ff6302f9681200f9e80340f960828c3ce033c13dff2701f9ff2301f968fe03a948008052682600f9683200f9BL8;FF", - "e90000b43f0500f161020054a10200d021dc2c91e2028052d4390114ff8300d1fd7b01a9fd430091a10200d021a02c91a40200d084202c91e3230091e2018052L8;FF1f050071c11d0054e84f45f9fb6300f9fa0314aaf75345f9f85b45f9fb6345f9e84700f9e85745f9e85700f9e85f45f9f40308aadc0", - "000b4e00316aae1031caaBBBBBL4;FFe083c33c692a099be0031faa200d803de083c43c2011803de083c53c2015803dea3740f92a3100f96a060091e083c03c0a2d00f92001803de083c13c2005803dL4;FFfd7bc3a8c0035fd6800000f0008038919b090094a80000b0a90000b0002900f9212d00f9c003", - "5fd6ff8301d1fd7b03a9f65704a9f44f05a9fdc30091f30300aaL8;FF080d088b0825019108fd46d300050091c0035fd6e0031faac0035fd6ffc300d1fd7b02a9fd830091490200f029c13e910a0000904ae12491400200f000803f91BL8;FFe0031aaae10318aafa2700f9965f0094e8c34239a8010036e", - "8e34239490080d20900f0f21f0500716c080054e08744a988090035e90f41b25000001408008092L8;FFc8feff17e0430a9155d2ff97e14340f9f5ffff17e8430a91f34b41f9142300910081c03ce8030a910001803d04000014390700f1946200910001005488825ff8BBBL4;FFe80740f91f0500f1e000", - "0054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a99fc90194ff0301d1fd7b02a9f44f03a9fd830091010840a9L4;FB4368756e6b65640025194900000000006a00000000000000190000001c00000025194900000000006a00000000000000e30000002e000000251949000000000", - "0L8;FF01f17dd39bc90094fcde78b364020014f9031faa89050014f57740f959008052890500145f0700b1c0010054da0000b4e1031aaa22008052f40309aa8dc90094BL8;FF810000b460ea40f9220080529949019461f240f9810000b460f640f9220080529449019461fe40f9810000b4600241f92200", - "80528f49019460220091f30b40f9L8;FFf85f02a9f65703a9f44f04a9fd030091084c80b9f30300aac80a0034080140b20811c0da081540d2080d088b0825019108fd46d315050091681a40f9080a00b4BBBBL4;FF0900001408008092680200f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6350080", - "52745600a9740a00f9771a00b9f44f43a9f70b40f9f65742a9fd7bc4a8L4;FB304b420000000000000000000000000008000000000000000800000000000000304b420000000000000000000000000008000000000000000800000000000000L8;FFff430291c0035fd641a040a9e00313aa44944329e203", - "08aafd7b47a9f34340f9ff430291f3320014fd7bbda9fc5701a9f44f02a9fd030091ff830fd13f040071BL8;FF220080529b690194610240f9742600f97f6200b93f0400f17f7200b97f7a00b98b000054600640f92200805291690194740200f9f44f41a9fd7bc2a8c0035fd6L8;FFeb1300b9ebe303b92", - "00300adcd680094e9bf4639e84346390a088052a00302d1f80310912a15003308111d12e8430639e8031091eabf0639200740ade00600adBBBL4;FFa0e300d1e40314aae5031aaae60319aaacfcff97a8d37ca91f0900b121060054a1035bf8280019cb1f1d00f1292000543c230091546b39f83f001cebe", - "9000054L4;FF1f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6200020d4fd7bbea9f44f01a9fd030091f40300aaa300f8b6f3031faa28008052L8;FFfa0307aaf60306aaf90305aafb0304aaf80303aa360f0094e81340f91f0500f100360054e083c83ce183c93c0808805", - "2e283c43cf3430391f90b00f9e08709adBL8;FFe8c30591e0c30091e082c63ce182c73ce282c83ce08709ade082c93ce182c23ce2830aade082c33ce282c43ce18307ade082c53ce182c03ce28308ade082c13cL8;FFc8220091e06b823de94b04f9c8290094fb074bf9f90b4bf91a00f0d2fc0f4bf9f813", - "4bf9f5174bf9e83740f9880000b4e00746a9220080528e290094f7030291BBBBBBL4;FF49150054610340f9370080399700f8b728040091490400d1110000145f2800f1880000542800028b08f1df388808f837a0c300d1637a0094a8035db848240037L4;FFa411009408c48052fa8301f9e88701f9fb8b", - "01f9f68f01f99211009420c480522100805290110094809b00b408018052e1031aaa02c48052f60300aa08140038L8;FF68420039f44f45a9fd7b44a9ff830191c0035fd648008052010800a908400039c0035fd68804805249008052012000a909400039c0035fd688048052742200a9BBL4;FFe036833d", - "e08742ade23a833de213c03de01e833de122833de08743ade21a833de026833de12a833df3daff9700e4006fe00301ade00302ade00bc03de10fc03dL4;ZDL8;FF080140b20811c0da081540d2080d088b0825019108fd46d308050091091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140", - "b26b11c0da6b1540d2BBBL4;FF730209ebc0190054080e80523869089be00318aa8cbaff97730600f118c3019181ffff54c6000014faef48a913008092f54340f9f94f40f9b74302d1e8af40b9L4;FBc16fff71cf51a3a927e2205bb2055deee43dd9cf5fe9d824027dd6e99c2ccb466c15544552c883e22", - "d97733aa29aace7784aa28c75ef11ce0000a45e67f5f260L8;FFe98f00f9097140f9e92b14a90a7540f9e9c747f9ea1300f90a7940f9e9f301f9ea9f00f90aa54fa9e91700f9098540f9e92b00f9098940f9e92700f9098d40f9BL8;FF9f510194f80300aae043169122008052a0100094e1d342f9e00318", - "aad4fbff17f90300aae04316912200805299100094e00319aaf90b40f9e1d342f9a0fcff17L8;FF4b650036ea6b48b9ebdb5079ece20b91e04341f98a0100b90afb0b918b090079eb630191ac0358f8482500a968390c91a98358780c0100f9e8031691e9df0679BBBBL4;FFaa635df8288140b829c14078", - "6a6201f8a88319b8a80319b8681200b9a8e35df8a9431978692a007968e201f8edffff17ff0302d1fd7b02a9fc6f03a9fa6704a9L4;FB20636861696e206b657954696d652073686f756c64206d6f766520666f7277617264000000000000e9974800000000003800000000000000410000000e000000L8;", - "FF9f6600a99f7e01a99f020238e003082ae10314aae20313aa90f3ff97a00f00b540fcffb4d7ffff17898242f83f0900b161000054971600f99f2e00f91f0900f1BL8;FFb9710194fd7b41a9ff830091c0035fd6ff8300d1fd7b01a9fd430091080040b9a01300d1a8c31fb8ab710194fd7b41a9ff830091", - "c0035fd6fd7bbfa9fd030091L8;FF390500913f0308ebc9130054f87749f91f0700b1c013005480220291f7290094080040b20811c0da081540d2080d088b0825019109fd46d30800098b08050091BBBL4;FF880700d11f0d00b1c9000054930200360a000014880700d11f0d00b188ffff54e0030baae10", - "31caa2200805291b10194e00748a953010036e82747a93f0900f1L4;ZBL8;FFf6430e91e213803de82b00f9a1b10094e0630191e10314aa552c0094e8a30791e06301912a2a0094f4f740f99f0600b120010054faff40f9560301f183210054BL8;FFe8fffff008310791e1c31d91e3c31791e8bf03f9a80", - "2009008e10491e8fb02f922008052e80303f9a802009008a10591e02f823de9ff02f9e90703f9e80b03f9L8;FFea0000904a8d2691007f803dff4b05f9e85305f9ff5705f9ea5b05f9e86b05f9e96f05f99f310094e1b342f9810000b4e0b742f9220080528e310094e0432a91BBBBBL4;FF22696bfc438c", - "212e6c00669e8cc101f241fdff54f4ffff17f6031faa0800809223000014e0430091f50b00f9dbe9ff9716835df81a835fb8160300b417035df8L4;FFc80000b40805088be00315aa0201805201ed7cd3970100945f1f00f1c0140054f55243a9340200b4b982009104000014940600f139c300918001005", - "421035ef8L8;FF68080054340117ab020f0054f42300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889a152300a9f7fbffb5f62b40f9f51f40f9BL8;FF050040f9e80301aa210300b021a02f91030300f063902991a9600091260300b0c6a02e91a9831ff8290300b02b21", - "2f91a92300d12a018052070300f0e7142f91L8;FFb7060034ea0240b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a0500919a1a40b95f070071e10500548bb243298b0600346b0140b26b11c0da6b1540d2BBBL4;FFa203009042203e91e0031aaae10314aabac10194ff0302d1fd7b04a9f72b00f", - "9f65706a9f44f07a9fd030191098c41f8f30308aa3f0500b100020054e8630091L4;FB3a20c0152e2053657373696f6e206c6f6164656420666f7220c0022e20c0172073657373696f6e206861732062617365206b65793a20c00e20616e6420636f75L8;FF5f170094a00b7bad480080d2a103d83ce307c", - "13d0800f0f2f42300f9160d00914083823ce00bc13d4183843ca38339ade00fc13df52342f9e10f803da003953cBL8;FFe00314aa088c44f81f0500b160000054e10313aa75fdff97950a40f9550300b4610a40f9680240f9960640f91f0101eb800b0054680640f9490380522a040091L8;FF13d041a988", - "0240f9680000b4e00313aa00013fd6810640f9c10100b4820a40f9e00313aaf44f41a9fd7bc2a891410014280400d11f0d00b1c8000054000440f9BBBBL4;FF1f0000f1cd000054390300eb23aa00541803008bf9feffb50f0000141f0400b181a90054b6e101941f10003101a90054f9ffff17b3e10194f", - "70300aa1f0400b1L4;FB890000002e0000001ced4800000000006a00000000000000f30000002e0000001ced4800000000006a00000000000000950000002e0000001100000000000000L8;FFc0035fd620008052e10313aaa6e1009420008052e10316aaa3e10094ffc300d1fd7b01a9f44f02a9fd43009", - "1480200f0082101913400407908fddf88f30300aaBL8;FFb4610194fd7bbda9f50b00f9f44f02a9fd030091f40302aaf303012af50300aa9061019400058052010180528e610194400100b4155000a9e10200f021800391L8;FFe00000143f040071400200543f08007121030054e1230091e20313aae8fc", - "ff97400200b4e9000014c1620091e20313aae3fcff97a00100b4c9000014c1c20091BBBL4;FF097dd59b28a10a9be90f40f9e9a301a9a8df3ea9b4a10194600800378852403989564039410300f021203e918a5a40398b72417808bd70d3e083c03c420300f0L4;FFc20a40f9830014cb861000d1631000d", - "142400091611e001265fc44d38008159b0600068b04d05f388400003401e05f7821040011211c001204c05f3884000034L8;FFa40100d084c01591a32300d162018052a8831ff8e4a10094e4a10094f44f43a9fd7b42a9ff030191c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9BL8;FF1581", - "959a3511f8b7750900b495210194e00315aa210080523600805292210194601000b4615a40a9f58300a9ff0f00f9df0215ebc8080054f5031faae8031faaBL4;FFfd7bc2a89b210014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4600640f9220080528f2100", - "94610e40f9c10000b4L3;ZB" + "BBBBBBBBBL8;FB000000000000000000004000000000000000400000000000769700000000000076970000000000000000010000000000010000000500000000a0000000000000L8;FF00602c91c1a100942000805201048052a5a1009420feff9000802f91bba10094ff4303d1fd7b07a9fc6f08a9fa670", + "9a9f85f0aa9f6570ba9f44f0ca9fdc30191BL8;FF220080526c25019461f240f9a11100b460f640f989000014610640f9810000b4600a40f92200805263250194611240f9810000b4601640f9220080525e250194L8;FFf42300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bd7", + "32889a152300a9f7fbffb5f62b40f9f51f40f99600003738fdff9018630891BBL8;FF932201b9f44f48a9fb2340f9f65747a9f85f46a9fa6745a9fd7b43a9ff430291c0035fd6e8630091e0230091e1031faae2031f2a647a0194faef41a938008052L8;FFc80080d20800f0f20809009137000014e10100", + "54e0031faa1affff17c80080d2e00b00f90800f0f2080900d10bffff17e90b41b2e9a300a910ffff17c80080d2BL8;FFa6ebff97f44f47a9f65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6370080521800809219018052a80640f91f0116eb890d0054e00313aa1af2ff97L8;FD30074700000", + "000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000ffffffffffffffff00000000BBBL8;FB6a000000000000005b0000002600000042024000000000006a00000000000000fb0000002e00000042024000000000006a000000000000009c0", + "000002e000000L8;FFea1700f909692138e1630091b792ff97fb1740f9e80f40f908011bcb3f0308eb089b0054e81340f9e1031aaae20319aa00011b8b678500946803198bfb0b40f9BL8;FFffab01a9cafeffb04a0d0891eaaf03a92a0080d2f40308aaea0bc0f2e9ff02a9e9ab05a9c1010194e00313aa", + "e80314aaf44f49a9fd7b48a9ff830291000440adL8;FF220080526c05009421835ff8e1feffb4200340f92200805267050094f3ffff17e86640f9c80000b40805088be00315aa0201805201ed7cd35f0500945f0b00f1BBL8;FFe21c0054694e41b949020034290140b22911c0da291540d2290d098b2925", + "019129fd46d329050091340108ab63010054db000014e8031faa690a40f989faffb5L8;FF010040f9f30300aa810000b4600640f92200805268450094610e40f9810000b4601240f92200805263450094612640f93f0400f18b000054602a40f922008052L16;FFe85f42f9e81300f9e86342f9e92313a9e", + "87742f9e97b42f9e80b00f9e87f42f9e84300f9e88742f9e8a706a9e88b42f9e99742f9e8ab03a9e88f42f9eaa742f9BBBBL8;FBef104000000000004e00000000000000010300001f000000ef104000000000004e00000000000000020300001f000000ef104000000000004e00000000000000L8;FF690", + "1084aabf35538a9d315384901084aaa035638a9e315386901084aab135638a9f315384901084aaa235638a90316386901084aab335638a91316384901084aBL8;FF080000143f0020716200005455008052040000143f404071680080521535889a680240f9080114cbbf0208ebe8000054680640f93f000", + "2710801148ba2010054L8;FFe00316aa21c4805222008052e92319a969150094e31359a9e0830c91e2030c9121008052170c0094e007409161e20191e2830c9100401d91ff050094e8ab4bf9BBL8;FF6d550194e13340f93f0400b160010054e00314aa22008052f44f59a9f65758a9f85f57a9fa6756a9f", + "c6f55a9fd7b54a9ff83069160550114f44f59a9f65758a9L8;FF57000014f5c742f9f7cb42f99b0280d21b00f0f2e8a75139e8060036e14741f9a10600b4e04b41f92200805262550094ffa71139e89740f91f0500b141060054L16;FFe1f3c13d1f0700b1e2f7c13de9f343f9d60600d140071eade0d7c2", + "3deab345f942fb803da9831cf8a003983caa0319f8a88317f800010054e0f3c03da02302d1BBBL8;FFbf0208eba9efff54e00313aae10317aae20315aa2300805224008052d6000094770a40f9680240f9080117cbbf0208eb49eeff54e00313aae10317aae20315aaL8;FFfa031faaf9ab49f9f80740911", + "88309913f0700b10018005400c3039154250094080040b20811c0da081540d2080d088b0825019109fd46d30800098b08050091BL8;FF40020054610e40f93f0400b140010054810000b4601240f92200805266f50094611a40f9810000b4601e40f92200805261f50094b40000b4600640f9e10314aaL8;", + "FF420040f95f0005ebc1e5ff5402404079452c46d3bfbc0071a8020054e2fcffb042a0119142d86578257c021b9f00056b8be4ff544200050b9f00026b2ae4ff54BBL8;FF2911c0da291540d2290d098b292501910819498b140500913f0700b1f60f00f9c001005400c30091ca1e0094080040b20811c0d", + "a081540d2080d088b08250191L8;FFe85305f9ff5705f9ea5f05f9e86b05f9e96f05f9c531009455000014e0c32491afefff97e1f341f9f8c30d91f94308913f0400b1e0150054fb6b4ca9810000b4L16;FFeb0316aae4e343f9e5e743f9e27744f9fc7700f9f66740f9f02340f9fc5300f9fc6f40f9f537", + "00f9f56340b9e3b7803dec2b4ba9e20713ade8f200f848018052BBBBBL8;FB69646b6579000000726563767265616473656e6473656564707265766e6578747370717261757468696e64657850656e64696e675072654b65797072655f6b65L8;FFadffff17a08300d16af3ff97b6835ef8d70a138b48031", + "3eba8fcff54e8ffff1748008052bf031ff8bf233ea913038052e88300913423139b880240f9e8efffb4BL8;FFd1faff97770a40f9680240f9080117cbbf0208eb28070054680640f9e10316aae20315aa0001178b6a1d0194e802158b680a00f9951640f9550300b4610a40f9L8;FFed100094b88f7ea9e0", + "030191e1031aaae20318aaa10e0094f56f44a9f95b45a9bf0a00b101030054560400b4bb0000b4e00319aae1031baa220080525e1d0094BBL8;FF396840a961838e3c7f8000f10a048052687f00f9000442ad630b47ade87f0091696b00f909088052f80303aa608705ad6437c03df40300aa638b03ad030", + "841adL8;FFe8f342f909068052e02bc33de12fc33de233c33d6822099b69060091e0032d91000500ad0209803de9f702f9caf2ff979c6300917b0700919f0314eb41efff54L16;FF2200805223008052240080521b010094610a40f9a3ffff17f50300aae00313aa22008052230080522400805213010094", + "610a40f9e00315aaa9ffff17e00313aaBBBL8;FF080200341f05007121030054000180528d000014280180d20800f0f2081d00d18e0000141f150071e00100541f11007101030054280180d20800f0f287000014L8;FFe00315aa0881099142c03591e1031baae30318aa04048152e50314aa06048052e05", + "f873de163873dad790094480340391f050071e0420154f91700f9617d0094BL8;FFf44f43a9f65742a9f85f41a9fd7bc4a8c0035fd60001805201058052a1f90094c0feffd000a00591b8f90094fd7bbda9f65701a9f44f02a9fd030091f30302aaL8;FFfd030091000c40f901000094200000d000a040f9", + "600100b4fd7bc1a8a0dcffd00000009101000014200000d000a040f9c00000b4a0dcffd00000009101000014BBL8;FF6b01084aaad31538aa0356382901084aabe31538ab135638a9f31538a92356384a01084a6b01084aaa031638aa3356382901084aab131638ab435638a9231638L8;FF685e1f396901", + "00f968c25339693642f9e00600ad22210391400941ade00a01ad010341ad020f40ade883103968620f917fc61339810301ad6032c13d6136c13dL16;FFe3b7803dee2749a9e20713adf16748a9e83f00f968018052e0a3803de43f43a9e0cb44a9b9040014e8c341f91f0500b160200054e84f00f9e8cb41", + "f9facf41f9BBBBL8;FBf80785b478104c3b620b8b914040e01f50052680a7bbfdf629516faeee4ad4ecdfdda65d48eae5dcd4ad5fc2e658d11ba28c32aeb5b9910b428b00009f809101L8;FF708d00940066805201018052698d0094a05000b4f30300aaf4031faa48048052f5fdfff0b5ea169136008052", + "e84b01f9e04f01f9ff5301f90b0000146802148bBL8;FF6d0d0194a11a40f961f4ffb40804805205000014a11240f93f0400f1cbf3ff5408028052606a68f822008052620d019499ffff17c80080d20800f0f208090091L8;FFc8018052e90741b2e88300a9e0030091e80f00f9e90300f9f9e6ff9788464", + "0b829008092745601a9680a00b9690200f9f44f45a9f52340f9fd7b43a9ff830191BBL8;FFc8490194740a40f9680240f99f0208eb61000054e00313aaac48019408038052690640f9e083c83c8826089be94f40f939000014eb230091ea43009140fffff0L8;FF770a40f917f7ffb5e80317ab23f9ff548", + "0fdffb000002491bc490094490080524afdff35ea031faa4901098b200108aba2010054f44f44a9f90b40f9f65743a9L16;FFe84700f9e8ef41f9e06fc13df96b42f9ef7b42f9fc7f42f9e86b00f9e8f741f9e78342f9e08742f9e68b42f9f19b42f9e8e700f9e8ff41f9fb9f42f9faa742f9BBBL8;FF1f0", + "5007121010054a8277da9890000141f090071a10f0054aa835df8e92e00d148dd789278000014a8a35cb8abab7da9a9e35c78ac035df8a8031bb8a8835e78L8;FF1f010071f8c741b9801f803de9079f1a818308ad0801094be99741b962c3883ce8e300b9e8cf40f9ead700b9e9bb00b9684308f83a69ff", + "97fa0301aae106f8b6BL8;FFe08742ade267803de08709ade08b43ade08b0aade18340ade18307ade08b41ade08b08ad402700b4e0c303918cf7ff9787010014e1430091e20313aaf70b00f9L8;FF63201d917f0c003918000014bf3b03d5a200f837430180520600b012e50701320a00001463201d917f0", + "c0039faffff170200060be103002a07000014bf3b03d5BBL8;FFfad342f9fc0740919c830191d7fdff17e04316912200805220110094e1d342f9e3fdff17e0431691e1031aaae20318aa1a110094fad342f9e8cb42f908011acbL8;FF08913491e8ff07f948fdffd008411c9169038052e8030bf900fdfff", + "000480f91e80b0bf948fdffd008e11b91e1833f916300189162008052f5f307f9f6fb07f9L16;FFe02b813d8082c43c942240f9e127813de22f813de033813d61320054e16742f9e083139102788052e11f00f969ad0094200742ad9f8225f1a0073cad200b43adBBBBBBL8;FB6e616c2f727573742f7072", + "6f746f636f6c2f7372632f73657373696f6e2e7273002f636172676f2d72656769737472792f696e6465782e6372617465732e696fL8;FF2d130413290d000a08010b4a4a09000a8c15000aab8f7c29ae1a000a114011539227000a2128000aad11000acf1e000a3f070031422c000a5023000af1c3911aB", + "L8;FF017c0353c11a00343f0800716c0100543f040071600700543f0800716106005481620091e003082ae20313aa57fdff97200700b4fa0000143f0c007100070054L8;FFfd7b47a9ff430391c0035fd620fdfff000403491c11d0094ff0303d1fd7b06a9fb3b00f9fa6708a9f85f09a9f6570aa9f44f0b", + "a9fd83019109604039890e0037BBL8;FF010100b4a17c019be00302aae20315aae30314aa69610194800100b507000014340100b467610194e00314aae10315aa60610194a00000b528008052750600f9L8;FFe00315aa6a0a00f909692138e10313aa05faff97760a40f9680240f9080116cbbf0208ebc8", + "080054680640f9e10314aae20315aa0001168b66610094c802158bL16;FFf30302aaf40301aa27eeff9720020037750240f9a80640f9160101eb82020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039BBBL8;FBef104000000000004e00000000000000580700000500", + "0000fa084000000000002900000000000000440100001b000000fa084000000000002900000000000000L8;FFe00316aaea1700f909692138e1630091b68eff97f71740f9e80f40f9080117cbdf0208eba83d0054e81340f9e10314aae20316aa0001178b66810094e802168bBL8;FF020440f9f30300aa1", + "4030037550001ab621400548982009129fddfc83f0500f121070054960640f9610240f9370016cbea0215ab22140054890240f93f010aebL8;FF1f0008eb080700541c00198b9f0315eba9010054bf0200f10803959ae90308aa08f97fd33f011ceba3ffff543f0144f136319a9aa90219cbc80219cb1f01", + "09ebBBL8;FF38000014e8031faa096040b93f05007160fcff540a6840b9e803088b5f05007141fdff54096c40b9290140b22911c0da291540d2290d098b2925019129fd46d3L8;FFff0e00b10105005448008092480300f9680080522a0d0014606641f9616a41f9290c40f9e8830f91e1031baa20013fd6", + "fcf341f99f0f00b1a10e005448008092L16;FFea2343a9e7f346a9ed6b00f9ed0740f9ea7b00f9eafb40f9eefb00f9ee0309aae9eb40f9eae700f9ea8f40f9e99b00f9e9cb40f9e4ab13a9eaa740f9e9eb00f9BBBBL8;FB9672ecea93c86f09e89cfeff95cf179603b10000a1b21de3c1bf24a3cb3722a7d", + "acb4f5b305c482fd6c6a960f577cf77209b5f03044339129a03457ec9d0c9c7L8;FF6b25019129194b8b2905009129010aab620500542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb89040054280108abBL8;FFe0c31291e2db42f9e5f35639e1833291e6031f", + "2a92e6ff97e85b42f91f0900b1e1830054480200d0fa830291081140f9fb4340f91f0d00f143070054e8c31791L8;FF03000014e9030a2af603022ac85d0012ea5d1853e903092a087d60d31b1e48b3298117aaca1e40b3e0431391ec6b02f908e11caae96f02f9fb7302f908010aaaBBL8;FFe20314aa73", + "510194e00315aae10313aaf44f42a9f65741a9fd7bc3a8c0035fd660ffffb000c02891b84d0194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9L8;FF6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aabc2060", + "0542a0140b2L16;FF810000b4e0bf43f9220080526ad10094e8031d910041019136d8ff97891000142ea0c0a92a7042a9190340f920d05ba9e86b00f9292041a927104da93f0314ebBBBL8;FF1f7c0aa91f2009a9087c0ba9080180521f200ca9080080921f200da9e003022ae20303aae303042a5af8ff9", + "7803000b4e00700f9a1ffff9021203f91a3ffffb0L8;FF00803991c16d0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff8308d1f30300aae0a30391fb0305aafc0304aaf90303aafa0302aaBL8;FF21700daa0bfaff363f1500f180faff544b15c0394c1900912e1900d10c39", + "00a96d190012218c0daaebf8ff363f1900f160f9ff544b19c0394c1d00912e1d00d1L8;FF84641a3204d01f383f000039420400115f00036b2100188b81ffff5482060051e103022afafeff1701d05f38a6081b53e9ffff17600240f9600000b43f000039BBL8;FFc01d005400230291eb180094080040b2", + "0811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308eb681c005406010014e1d342f9e8cb42f9L8;FFe9a20991ea6f01f9e02b4fa9eb7301f92001803d09214e29e90303b9e80703b9480d40f900013fd6e0e302f9e8074091e1e702f908011891290c40f9e1631791L16;FF60124", + "0f9220080526bb10094611a40f9010100b4601e40f922008052f44f4aa9f65749a9fd7b48a9ffc3029162b10014f44f4aa9f65749a9fd7b48a9ffc30291BBBBBL8;FB2b0100003b000000617373657274696f6e206661696c65643a20216d73672e69735f656d707479282900000000000000bb114000000", + "000004700000000000000L8;FFfd7bbea9f30b00f9fd03009173010090680240391ffd037180000054f30b40f9fd7bc2a8c0035fd6ac9500941f047df2e8079f1a68020039f30b40f9fd7bc2a8BL8;FF090140b22911c0da291540d2290d098b2925019129fd46d30801098b080500911f0109eb49090054", + "091c40f93f0500b120060054096840b969070034290140b2L8;FFe96b02f9e86f02f9f67302f9f77702f9190d0094e1b34bf9810000b4e0af4bf92200805264190094571a00b5d500001464190094c0028052210080525d190094BBL8;FFe00302ad21fdff97a0877ead68fffff008ed2091a203df3ca303", + "dc3cf4830191c9058052e0830191e00706ada0077cade23b803da203d73ca1c302d1e2030091L8;FF74590094e8fb42f91f0500b121e2ff54e99f40f9f3000090681240f93f0500b1e0010054fb4340f9f4833291081100b4e8833291406302917ff3fe97e85346f9L16;FFc80000b4e06741f9e10308aa2", + "200805269d90094e10314aae86f41f9c80000b4e07341f9e10308aa2200805262d90094e10314aae87f41f91f0500b1c0010054BBBL8;FF2cfbffb43f0108eb7361193220030054536928380bfc71d308050091290040f9280800f9abf6ffb43f0108eb93611932400400542c0440f90afc78d393692838L", + "8;FFc0d30054e8cf42f9090380522a040091e00318aa09692138e1431691ead302f901120094d6000034e17f52b9e28352b9e343169180008052d61400943f0700b1BL8;FF1f0009eb29060054e80f41b2e80300f9e0030091a1ffff97f44f45a9f52340f9fd7b43a9ff830191c0035fd6f503012a740400", + "51e00313aa1b060094e80300aaL8;FF81ffff54a6000014282c4079080a00b46a02148b6b008052ec0313aae90308aaf4031faa09000014bfbd03716d958b9a8d010d8bac010ccb290500f19401148bBBL8;FF7b83099173390194e007409168030291e10316aa00802f91e20314aa030880521b088052ad", + "880094089080520083c23cf54f09f9e84b09f9f57749f9fb6709f9L8;FF0005803d800bc03d0009803de9c704f9a88357f8080540f9c82500b4a02302d111f5ff97f60301aa004d0037c8fe60d3082300b5c00a40921f1800f142230054L16;FFe8b343f91f0500b120730054e83f00f9e8831d91e9a35d3", + "90091c03ce8bf43f9e0030e91e95f00b9e9030991c1820091022e8052e093803d28f100f865b90094BBBBL8;FB6c656e677468206d75737420626520646976697369626c6520627920324d657373616765206c656e67746820697320746f6f206c6f6e6753657269616c697a61L8;FF08ffff5408090b8b0", + "a0140795f21296be100005415054079b37e0853a88358f8ff0208ebe0140054a80000141368b99b680240f91f0500b121130054e12340f9BL8;FFea830aa9e00304aae18b0ba9e10302aae96300b9e28f07a9e49708a9e69f09a9ffd30879ff4b02f9e3930ca9e59b0da9e9fb00b9ea0b10a900013fd6e03", + "b02f9L8;FFf60f40f9e80740f9080116cb9f0208eb09f2ff54e0230091e10316aae20314aa2300805224008052fee5ff97f60f40f988ffff17e02300912200805223008052BBL8;FF5aa301919ca30191092900a9096501a9a9435fb8156502a9175103a9176104a9166105a9096100b9fb0800b4a8035ef", + "81f011ceb80080054560b40f9586340b9L8;FFf90303aae21b00f9f50301aab70302d1f4030591d6e1fe97e84346391f05007180020054881245b8e99741b9e00315aaeb2b5aa9a80318b8e8c34639e93200b8L16;FF2aa045a9e8c300f9283440f9e8ab00f9283840f9eb2312a92ba047a9eba71aa9e84f", + "00f929a048a9e95300f9e8df00f929a049a9e8ab15a92aa04aa9e9a310a9BBBL8;FFca0e0139d2b204f8d84e0139c85600b9f44f5da9f6575ca9f85f5ba9fa675aa9fc6f59a9fd7b58a9ff830791c0035fd63f8300f141090054e13740f9e02b40f9L8;FF612640f93f0400f18b000054602a40f92200805", + "26869009474d643a9750300b496c2009104000014b50600f1d6a20191c0020054c1025df8810000b4c0825df8BL8;FFc10b0054e0031faa9affff1721050054e0031faa8dffff17c80080d2e00700f90800f0f2080900d17effff17e90b41b2e92300a983ffff17c80080d20800f0f2L8;ZDBBL8;FFbc000", + "0b4e0031baae1031caa2200805269290194fbe30091a80302d1e10316aa60c30291bc0302d11d520094a80358f81f0500b120120054e082c13ce80700f9L8;FFe08b17adac250094880201d1ff3f0c3902fd47d319dd799214194092420100b4e8ab41f9e9af41f900030291e10315aa080102ab2935899a", + "e8ab01f9e9af01f9L16;FFc0035fd6ffc302d1fd7b08a9f65709a9f44f0aa9fd0302915f8000f1e20300f941060054680040b91f050031e006005400e4006f1605001189008052c80ac05aBBBBBBBL8;FB2d3e20c00129002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d", + "313934396366386336623562353537662f686b64662d302e31L8;FF810000b4e01740f9220080526aa30094e11f40f9810000b4e00740f92200805265a3009468008052400bc03d49f342f8e0030891682200394003803de80309aaBL8;FFfd7b4aa9ff830391c0035fd6e0230091f7a300a9b3210094e02", + "30091f7a700a9b0210094e00313aae1031faae20314aa1a070094770a40f9680240f9080117cbL8;FFf4030a2a070000946ba240a9ea03142ae00740f9690240f9e10313aaeeffff17ff0301d1fd7b02a9f44f03a9fd830091480001ab42030054010840a9e50304aaBBL8;FFfa0300f96f630194e00317a", + "a210080523a00805267630194e0feffb4e92740b988008052b7033da90811092a29008052a9031ef808000039e083019137280094L8;FFa00300542800805228692a3848050091680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd6f50300aae00313aa2200805252020094610a40f9e00315aaccffff17BL", + "8;FF080500d178ffff17c80080d2e10700f90800f0f2080900d107000014e80b41b2e00700f904000014c80080d20800f0f2080500d1e80300f9e003009197e9ff97L8;ZDBBBL8;FB636f6e73697374656e7420776974682070726576696f75736c792d65737461626c69736865642073657373696f6e000", + "073104000000000002d00000000000000L8;FF70000014e11740f9e80f40f91f0101eb60680054e81340f9958248f8490980520969213828040091bf0600b1e81700f9a0190054802202917feaff97080040b2BL8;FFe92f07a9eb048052a9028052ff2b02a9cafeffb04a0d0891ea2f04a92a0080d2f503", + "08aaea0bc0f2e97f03a9f70302aae92b06a9f60303aabcff0094e30316aaL8;ZFBBL8;FFe8a700a942ffff90426c3c91ea0f00f9e3430091a93f0194fd7b43a9ff030191c0035fd6082000910940009142ffffb042b03491e82700a9e803009109000090L8;FFe0060036212c00b5992240f9881a40f93f0", + "308eb6100005480c20091b4e1fe97881e40f9e083c33ce0031faa2823189b000d803de083c43c0011803de083c53cL16;FFea2f41a9e02bc33de81b01f908008092e12fc33dfc0318aae87700f9f57b40f9f8030baae56f40f9e72340f9e08710adefb344a9edef49a9f1a34ca9eb030faaBBBBL8;FBd309", + "4000000000005500000000000000bf01000021000000d3094000000000005500000000000000d601000019000000d3094000000000005500000000000000L8;FF10fcff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb281000548a000014f30300aa4a0c009", + "4e80300aae00313aaBL8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6e0fefff000203791b60f0194e0fefff000c02e91b30f0194L8;FFe0031caa220080526b130094250200143a000014e0d7c53de1dbc53de0431391e2dfc53de037813de13b", + "813de23f813df3ecff97f62b40f93f020014e8af00f9BBL8;FFfd7b42a9ffc30191c0035fd639008052e10740f901feffb5f2ffff17ffc301d1fd7b05a9f33300f9fd430191098440a9f30308aa020c42a9e8230091e00309aaL8;FF220080526c53009403feff17c082c73ce8a344f94003803de8f304f9", + "fefdff17c80000f0081140f91f0500f149040054e12340f9a04303d102048052b44303d1L16;FFea9300f91e1552a9e9db00f90aa544a9ec5700f90d3158a9fa8305a91af940f9eacf00f9070954a9e9b300f909a945a9ed6f00f9043559a9ec5f00f910195aa9BBBL8;FF5af9ff97b50100b4610a40f968", + "0240f91f0101eb60300054680640f9090480522a040091e00315aa6a0a00f909692138e10313aa4df9ff97805241b980010034L8;FFe8340054e8cf42f9e10319aae20318aa00011a8b6f730094f90b40f94803188be8d302f97f0700b1fb0314aaa053ff54e80740910881099100210491e1431691BL8;F", + "F9f0208eb29faff54e00313aae10317aae20314aa230080522400805217170094770a40f9c9ffff17a8831ff8a84300d1c900009029e13d91a0feffb000440691L8;FF7f7821f8f6ffff17e20300aa607821f84180403940008052441c40b9231040d30020c31a000400519f00006b80030054450840f940", + "008052a120403923100012BBL8;FFe18349f9810000b4e08749f92200805269330194f4ab49f99f0600b1a0baff54f5b349f9f3af49f9551600b47622009104000014b50600f1d6620091a0150054L8;FF8ef1ff97e0031b2aa88357f87f0302710801158b43f8ff54daffff17a80358f82003c03de00313", + "aa096b40b9940a40f9e81b00f9e8030191e00b803de93f00b9L16;FFa00f7ead480080d2a10b7bad0800f0f2f62702f9161d00914083843ca003d83c4383853ca303de3cf52b02f9e107813de20b813de00f813da2033aad4083c53cBBBBBL8;FB72756374696f6e00770d4000000000002e000000000000", + "00a90000000e000000484d41432d5348413235362073686f756c642061636365707420616e79207369L8;FFa8f31438290080521ffd0071ba0218cbe803082ae9830039a0050054aac303d1496928380805001137000014e10740f9e80319aaf90301aad4010034a8c303d1BL8;FFa8273da9e8feffd0084", + "d1491a82b3fa90a078052c8048052bf273aa9e9fefff029ed0a91a92b3ca9290080d2e92fc0f2a87f3ba9a8273ea9bc170194e11b40f9L8;FF0a088052e0074091fa8309912a15003308111d1200401d91e8431339e8830991eabf1339e037c13de13bc13de0d7853de1db853dd015ff97e0d7c53de1dbc5", + "3dBBL8;FF796a01a9685e00a9f44f5ea9f6575da9f85f5ca9fa675ba9fc6f5aa9fd7b59a9ffc30791c0035fd6e4031faaa78358b899324fb8bc8357f8be035838ba035df8L8;FFe0a33239e8a73239c80080d20800f0f246000014e05306f9e083329161fdfff021203f910202805263fdfff063003a9104", + "0180528700001448008052e0a33239L16;FFe8008052ff4307390f00001428008052ff0f00f9ffa300a9a0e300d1e1230091132a009428008052a083dc3ca183dd3ca283de3ce82300f948008052e08700adBBBL8;FFa9770194a00100b4f50300aa6d7b0194e00315aa21008052f40315aa36008052647b", + "0194a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad3L8;FFea3f49f9e86f52b9f5cb42f9692a01a9e9d742f97822012908008092680200f9490d00b4e8d342f91f0115ebea33959a08010acbaa0208cb33010aeb091d0054BL8;FFcb0d00122c344039095c003949c100117f2500710", + "960003909819f1a9f7d027129010b0b8b0d00120a819f1a29c100117f2500714a114c0b0964003909819f1aL8;FFfd03009104000094fd7bc1a860fff736860e0014ffc302d1fd7b07a9f85f08a9f65709a9f44f0aa9fdc30191000280525c0d0094f30300aa40038052590d0094BBL8;FFa937019400018", + "052e10315aaa6370194fd7bbfa9fd030091086040b9a8060034080140b20811c0da081540d2080d088b0825019108fd46d308050091090840f9L8;FF0300001428008052e82b00f968c640f9694642b91f0500b1e95f00b900020054e0830f91612206918e0f00946083c93c6183ca3c6283cb3ce8f341f9", + "c00601adL16;FFf80301aabf0600b1c0350054960100b49722009104000014d60600f1f7620091e0000054e1825ff881ffffb4e00240f92200805260bb0094f8ffff17353400b4BBBBL8;FB0000000000000000000000000000000000005849b290cb5edb1a0000f200941f00de724e0d91c5d42c3f6555b", + "2339157a68e00000000000000000d2a80a1c734L8;FFe84f01f9e8030a910005c03d0065803da002803db60a00f980110054f63340f973060091b5620091df0213eba1f8ff54e00314aae10318aa420080525e8b0094BL8;FFf8feffb0187300910600001422008052690b0194b50600f1d6c20091c00300", + "54c1025ff8280041d21f8d00f10831979a1f6d00f108ffff54e9feff100a6b6838L8;FFfd7bc2a8c0035fd60001805201028052a4070094fd7bbea9f44f01a9fd030091f30301aaf40300aa660b009400038052010180525f0b0094000100b401fdfff0BBL8;FFe20f02ade2b6c43de10301ade40b03ade2", + "13c03de01e833de11a833de08742ade22a833de02e833de01fc03de122833de026833de022c33de126c33d6042823cL8;FF800200545afbff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab230100541e000014f4031faaL16;FFe7030ba", + "aeb0317aafa030faaf50305aae50312aaef031eaafe0308aae8030eaaee0311aaf1031baafb030aaaea030daaed0314aae0f3803d8d02001408234039BBBL8;FF000400ad680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd62000805201048052a1670194fd7bbda9f50b00f9f44f02a9fd030091f30301a", + "a210200b4f40300aaL8;FFf65741a9fd7bc3a8c0035fd6fd7bbea9f30b00f9fd030091080040f9f30300aaa80000b4600640f901f57ed342008052616b0094680e40f9a80000b4601240f9BL8;FF8282823c92ffff17e08744ade00314aae22fc03de86340f9a0873cade08742ada2039b3ca8031cf8a087", + "3aade28343ada2833bade18340ada18338ade28341adL8;FF2d0d0091bf0101eba20300540e68ed38df010131cbf3ff5427000014ad191f12bfb903712d00805281030054df0101312e0080522a0100542d090091bf0101ebBBL8;FFe10314aaa7270194ff0302d1fd7b07a9fdc301916a2440a9681040f9", + "0b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9L8;FF80080054560b40f9586340b9360500b4540740f96b2b0094e00316aa21008052642b0094000c00b4e10314aae20316aaf70300aa672b0094591740f9b7831ff8L16;FF620500546b1d0091eefeff3728000", + "0146c0400f1400900549f2900f14d018052eb031faae9031faaea031faa8c318d9a4d040091ae696a384a0500915f010cebBBBBBBL8;FB5f63742e726563762065706f636820c01f3a2043743153616d706c6564202d3e2043743141636b6e6f776c6564676564001b737071722076312e73656e645f63L8", + ";FFe88f01f9e89b01f9e8a701f9e82340f9e93f01f9e90340f9f87b01f9181140f9f76f01f9b70301d1ff0701f9ff1301f9ff1f01f9ff2b01f9ea3301f9ff3701f9BL8;FFfd030091f30301aa210840f9f50300aa680240f91f0101eb800b0054680640f9b60a40f92a040091b41640f9490280526a0a00f", + "909692138b60900b4c80240b2L8;FFfd7b52a9ff030691c0035fd6e01fc03de08301ad170100b4e00318aae10317aa22008052f80308aa631f0094f7031caad5ffff17f7031caaf80308aad2ffff17BBL8;FFe0179f1a84740194b50600f11900190a21ffff5403000014fa0300aaf9031f2ae003192a7c7", + "401941f1c0072e0031aaa8001005428008052ff0200f9e8220039L8;FF60140054e8830291e0c3179101a104910f0d0094e082c23ce182c33ce282c43ce8fb42f9e0db823de082c53ce1df823de182c03ce0e7823de082c13ce2e3823dL16;FFf44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6e8031faa", + "74f7ffb5e00308ab43f8ff54a0feffd000e00391b7db0094e00313aa220080522300805224008052BBBL8;ZBL8;FF49c1ff54e0630091e10317aae20316aa230080522400805218a3ff97f71740f902feff17f50300aae063009122008052230080522400805210a3ff97e11740f9BL8;FFc142009100008", + "092d7420091ddfb00941f0400f161010054fffedfc8c10640f90107f8b7c00240f92200805262ff0094e00316aa01038052020180525eff0094L8;FFbf1000f1c10100546004803d600001ad63e47a92820003cb420002d11f2003d56300019123740bd5420001f1a8ffff5480003ead80003fadc0035fd6", + "820003cbBBL8;FF880700d11f0d00b1a8000054e00319aae1031caa22008052673f0194480700d11f0d00b148f5ff54e03340f9e1031aaa6900001408008092686e00a957000014L8;FFfa6740f988380036eafb41f9c80080d2f6ef43b9f7eb43b90800f0f2ff5700f958fd60d3f5031faa143900913303", + "0014607e42f9618242f9290c40f9e8830f91L16;FFe95b00f9f50314aaf4db42f9e9e742f9e8eb42f9f66300f9e82300f9e97700f914e900b467bf0094e00314aa2100805260bf0094c04101b4e1031caae20314aaBBBBL8;FBd2a9de4b16bcdb54b1d040c5774f26232f0583d814345557dad0491d752b7", + "32ca28c30d697d90000aaed083d89a75e0f269acfa31bf933bbb8543cd276472052L8;FFf5031f2ae9031faa1c03805248008052f32f00f9e81b00f90a000014e87b40f9e93740f9940a00912905009113693638f32f40f93f4100f1f47f00f940830054BL8;FF62ebff97002c00b5e1031faae7ffff173f", + "0c0071800300543f10007121010054602e00b5a02302d136ecff97e80301aaa0030036c82e00b5e1031faadbffff17L8;FFe10313aaeb040094e1030091e2630091e00314aa54e6ff9728008092a80200f9f44f45a9f52340f9fd7b43a9ff830191c0035fd6ff8301d1fd7b03a9f65704a9BBL8;FFff3f03", + "39ea0341b9e8275f29eb0741b9ec0b41b9ed0f41b9ee1341b9ef1741b9a0833dad0809c05a2909c05aa0833eada003db3ca103dc3ca203dd3ca303de3cL8;FF21000391a2008052a24b0014fd7bbea9f30b00f9fd030091080040f91f0900b1a1000054e0031faaf30b40f9fd7bc2a8c0035fd6080141d2e", + "90080521f2d00f1L16;FFe8fb40f9772201a908008092683e00a98c0e00140823403908051f121f09007141020054e0031d9181220091032b0091f4031d9101210094e8a343f9eaa743f9BBBL8;FFc80080d20800f0f20809009110ffff1761030054e0031faa89ffff17c80080d2e90b00f90800f0f2080", + "900d108ffff17c80080d2e90b00f90800f0f2080900d1L8;FF081140f91f0900f103040054a80302d14900009029010c91e8a703a948008052c9fdffd029411f91eae30091a04700d1e8271ca9a8fdff9008251891e82b1ea9BL8;FFc90080d2e0a30039480080520900f0f2e0830091e8a70039e91300f9", + "9ff5ff9709000014e10740f9e10000b4e80b40f9f30300aa22008052e00308aa5eef0094L8;FF23404079652c46d3bfbc007168080054e3fcff9063a0119163d86578487c031b9f00086b8bfcff546300080b9f00036b2afcff54211040f93fcc74f220010054BBL8;FF5a830991e8d302f97f0700b1fb03", + "14aa806dff5440c30391d1000014e8031faa00011aab62570054e1431691c60c00943f0700b1f90b40f9e0070054e1d342f9L8;FFff0316b9e85700b9502a0094e80356b9e00740918100805200001891ff0316b9e85300b9492a0094e80356b9e00740918100805200001891ff0316b9e84f00b9L16;FFe", + "82707a948feffb008c128912a0d8052ff2704a929feff9029d12591e82b09a90a0b8052e92b06a9290080d248038052c90fc0f2a02700d1e1030191e87f05a9BBBBBL8;FB0c424200000000000000000000000000000000000000000001000000000000005035420000000000ef104000000000004e00000", + "000000000b904000017000000L8;FFe803088b09f6ffb5b6ffff17e9031faa0a2440f9aaf9ffb50a3040f9e903098b8afaffb5daffff1720feff9000200191b693009400feffb000a00d91b3930094BL8;FF130500917f0209eb89190054088c45f81f0500b1c0140054ce020094080040b20811c0da0815", + "40d2080d088b0825019109fd46d30800098b080500911f0109ebL8;FF3f09007141380054e87342f90a0180d20a00f0f209dd78924a0140b2c0010014f8db40f936008052e00b4091e82303b9e8830c918900805200c00e91e1431391BBL8;FF856c01941f1c007220050054972e40f9f30f40f9770500b4", + "e0430191e10316aae20315aa68ffff97f52b40f9bf0600b120050054883240f9f4e345a91f0308ebL8;FF6d570094e89f40f91f0500b16000005440630291d0ecff97f3db52a9960100b47722009104000014d60600f1f7620091e0000054e1825ff881ffffb4e00240f9L16;FF0800809260220091e1a30", + "091f5df02a9f51f00f9f96b0829fb630929f45300b9e82f00f9f9500094e0a300917f0200f902e0ff97f44f5ea9f6575da9f85f5ca9BBBL8;FF23000014210a0054e0031faa9dfeff17880080d2e00b00f90800f0f296feff17e90b41b2e9a300a994feff17880080d20800f0f2080140b28ffeff1788008", + "0d2L8;FF40010054810000b4e09749f92200805269770094e19f49f9810000b4e0a349f9220080526477009460220291fa0a009408fdff17f37749f97f0600b180030054BL8;FF011116cb6cf70094611240f9e10000b4601640f922008052f44f42a9f65741a9fd7bc3a864f70014f44f42a9f65741a9fd", + "7bc3a8c0035fd6fd7bbda9f50b00f9L8;FFd5220391180c18cbfa02188b54230091530100b4611640f9a102018b818600f8618a40a9601640f9a002008b69f7ff97730240f9f7ffff1739231d91e00316aaBBL8;FFe00fc43de113c43de0074091e82b48f9e20bc43de1074091e08f843de0ffc33d008009", + "91e193843de103c43d21800191e07f843de007c43d023f8052e82b09f9L8;FFff672a39e84b05f9a43dff97e80300aae0432a9161fdffb021f819914202805263fdffb063f41891e84b05f908000014e04b05f9e0432a9161fdffb021f81991L16;FFe9c743f9e8d343f9e93f00f9e9435e39e95f00b9e90", + "3099128f100f86db70094efc31391a092c83ce1b7c13de2bbc13dea3f5739f00314aaebd14d78e0d7803dBBBBL8;FBbb124000000000003800000000000000ca0100001d000000bb124000000000003800000000000000fd0100001a00000000000000000000000800000000000000L8;FF0a0100b44b014", + "0b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b29050091BL8;FFe8feff9008e11691fbc302f9f5cb02f9a8031af8fddbff97a10356f8810000b4a08356f82200805263070194e8031faa170100b4e91740f9c900003", + "628fd60d3L8;FFf6e30191e99701f909fdffd029e10091e9ab01f909fdffb0296d3f91e9bf01f9e9018052e9c301f909fdffb029ed3f91e9d301f909fdffd029490091e9e701f9BBL8;FFf40301aa3f2000f1f30308aac8000054e80b41b20900809268d200a9690200f900010014170040395a0080d2f50", + "300aa1a00f0f2ffc2007182000054e87e0453L8;FFe90310916affffd04a5105911a0380d240fdffb00090199108210091e1c30e91e9db01f91a00f0f2eadf01f9bd430094e81f40b9e8c306394d0000142093c13cL16;FFf74f40f93d060014e8fb41f9e90742f9f0030aaaeb0b42f9e3cf42f95f0500b1", + "e8e700f9e80342f9fcff41f9e9ff00f9e91b42f9e71342f9e8bb00f9e80f42f9BBBL8;FF3f09007161010054e80b40f90a0180d20a00f0f209dd78924a0140b2090000140a0180d2e9031faa0a00f0f205000014080180d2e9031faa0800f0f20a017fb2L8;FFc0fdff9000603891c3630094c0fdff9000c", + "03891c0630094c0fdff9000203991ba630094ffc300d1fd7b01a9f44f02a9fd430091280840f9290040f91f0002f1BL8;FF081c00121f090071e1010054e00302aaf30302aaf40301aa23f4ff97e80300aae00301aa08020037750240f9a80640f9160100eb62020054e80f41b2e80300f9L8;ZDBBL8;FF6", + "d270114f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6fd7bbea9f44f01a9fd030091140040f99f0600b1e0030054012440f9f30300aa3f0400b140010054L8;FFc00240f9220080526b270094f3ffff17880240f9280100b40805088be00313aa01ed7cd302018052f44f42a9f65741a9fd7bc3a86027", + "0014f44f42a9f65741a9L16;FFe00317aa010180521801805269a70094e30b40f9f60319aaa0fdffb4d91100b47f0303ebe8031faaed33839a6a030dcb6c000acb4e01198b29030ceb2be179d3BBBBBBBBL8;FB61696e2e72730038706f73742d7175616e74756d20726174636865743a206572726f72206", + "372656174696e6720696e697469616c204232412073746174653a20L8;FF2a5d00a92a2101a9367d02a93f3100b92a8103a92aa104a938fd05a93f6900b9610100b4e00314aa22008052f44f4ba9fb3b40f9f6574aa9f85f49a9fa6748a9BL8;FF94c20191c002005481825cf8810000b480025df8220080", + "526724019481025ef8810000b480825ef82200805262240194810240f9810000b4800640f922008052L8;FF00400491c420009440fdffb000a00491c120009440fdffb000000591be20009440fdffb000600591bb20009440fdffb000c00591b820009440fdffb000200691BBL8;FF600600ad682200b9f4", + "4f44a9fd7b43a9ff430191c0035fd680ffffd000001d91ba600194fd7bbca9fc5f01a9f65702a9f44f03a9fd030091ff0308d1f60300aaL8;FFe10313aa08fdff97f502003574040034610a40f9680240f91f0101eb60040054680640f92a04009109028052e003142a09692138e10313aa6a0a00f9f44f4", + "2a9BL8;FFe00301aaf44f47a9f92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd637008052180080921901805206000014e20313aa430c8052c5eaff97e10300aaL8;ZDBBBL8;FB6420726563656976657220636861696e206d657373616765206b6579737375636365737366756c206465637279", + "707420616c776179732068617320612076616cL8;FF081540d2080d088b0825019108fd46d30900088b37050091ff0208eb482f0054e1010014e11740f9e80f40f91f0101eb807f0054e81340f9938248f8490a8052BL8;FFeeeb41f9290dc0daa0833badefef41f9a04302d1a0833cada0833dada0833ea", + "da003d73ca103d83ca203d93ca303da3ce3d7803de2d3803de1cf803de0cb803dL8;FF160440f96f040094e00313aa2100805268040094400200b4e10316aae20313aaf50300aa6b040094935600a9930a00f9f44f42a9f65741a9fd7bc3a8c0035fd6BBL8;FFc0feffb4e10316aae20314aa740200a9704", + "40194e00316aae10314aa22008052740a00f9f44f42a9f65741a9fd7bc3a861440114280080527f2200a97f0a00f9L8;FFe8a700a9a82300d182fdff9042802a91e1230091e8a701a9af40009480fdff9000401891bc40009480fdff9000c02991b940009480fdff9000202a91b3400094L16;FFe9cb00f9", + "e98b40f9e9b700f9e9c740f9e8c700f908018052e98b00f9e9df40f9e87300f96ef9ff17e87740f9f40309aaf5030aaa0021009197cbff97e0032b91BBBBL8;FB6374696f6e6374724b657973556e73616d706c6564506f6c796e6f6d69616c456e636f646572696478707473706f6c797341757468656e7", + "4696361746f726d61L8;FFfd7bbea9f30b00f9fd030091080040f91f0900b1a1000054e0031faaf30b40f9fd7bc2a8c0035fd6080141d2e90080521f2d00f10831899a09feff9029710b91BL8;FF09804039000509ab22020054fd7bc1a8c0035fd6e8031faa091c40b949fbff35e9031faa0a0840f90afc", + "ffb5ea030aab23feff54e0fefff000201091b3100194L8;FFe8074091e98b41b908411d9109010039e98341b900fd0039e007409109050039e97b41b900401d9118d5003909090039e97341b919f50039090d0039e96b41b9BBL8;FFf6570ca9f44f0da9fd830291f30308aa28008052f4e30091ffa303a9", + "e8ff05a9e8a30091e08702a9ff6b00b9ffff04a9a80f00f9a10900b4560080d2e20301aaL8;FF08012a91fbc302f9f5cb02f9a8031af836e4ff97a10356f8810000b4a08356f82200805264540094e8031faa170100b4e91740f9c900003628fd60d3e88305b9L16;FF02feff17e18b40a9e0432d91e4974", + "329412b0094e8ab45f91f0500b1e1b6ff5474ffff17e0d7c23de8b345f980feff9000c0199183feff9063801c9184feff90BBBL8;FFfd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091f40300aa004841b9f30301aa80010034610a40f9680240f91f0101ebc0340054680640f909018052L8;FF", + "e1d342f9e8cb42f9f97b49f91f0101eb40440054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9fd0c0094fad342f9e8cb42f908011acbBL8;FF220080526cf40094e5ffff17f44f41a9fd7bc2a8c0035fd6c20700b4fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd03009148", + "04028b49008052f30303aaL8;FFe6060094b30200b9e3ffff17a0221f91f0060094eeffff17634000d1ff1040f2a0000054e3fcffb063a0119163d86878633c7cd3841e4092661000d1a5400091BBL8;FFead302f9d0110094e85349f9280500b409e179d3f84f49f959038052361108cb04000014d6c201", + "f118c3019120040054e1d342f9e8cb42f91f0101eb00030054L8;FFe15740f9e24b40f92001803d481540f900013fd6606601f9616a01f9bcf2ff172013c03de86342b92123c03d205b803de88303b90143813ce00313aa088c4ff8L16;FFf9031faae00319aae10316aaa6b00094806ec03d8a220791886", + "206910101c03d88d640f989e240f940838f3c4001c03d81220091a80317f888ee40f9e007813dBBBBBL8;FBc8ab410000000000696e76616c696420636861696e206b6579000000000000009f1b40000000000034000000000000004a0100002d0000009f1b400000000000L8;FFf44f49a9fb2b40f9f657", + "48a9f85f47a9fa6746a9fd7b44a9ff830291c0035fd620008052e10315aa9f98009400018052013080529c980094fd7bbaa9fb0b00f9BL8;FF26000094610a40f9a8ffff17e00313aae10317aae20315aa20000094770a40f9680240f9080117cbbf0208eb89f5ff54e00313aae10317aae20315aa170000", + "94L8;FF22fdffd042e03991e1068052b218009420008052e1018052a3180094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9BBL8;FFf503082a020315cb386540a93c0302eba2f8ff54fc030191e10318aae20319aa8003158b6b5c0194a802190be8ff01397f", + "fe03f11808805220020054e8ff4139L8;FF002c00b5e1031faae7ffff173f0c0071800300543f10007121010054602e00b5a02302d16ff4ff97e80301aaa0030036c82e00b5e1031faadbffff17a22302d1L16;FF240080521d000094770a40f996ffff17e00313aa2200805223008052240080521600009", + "4610a40f99dffff17e00313aae10316aae20315aa2300805224008052BBBL8;FF6d7c0194c10240f9810000b4c00640f922008052687c0194c10e40f9a1fdffb4c01240f922008052637c0194e9ffff17880240f9280100b4090d8052e00313aaL8;FF088109910fccff97e1074091e04316910242805221", + "8009916e7c0094e01fc53de123c53db8008052e82369795401805215008092e057813de15b813de8e30a79BL8;FFf70b40f9f65742a9fd7bc4a8c0035fd6f7031faae00317aae10314aaa2f8009408fcdfc8081140f91f0500f1e0179f1ac0035fd6fd7bbda9f65701a9f44f02a9L8;FFf30300aa3f00027", + "16200005435008052080000143f0020716200005455008052040000143f404071680080521535889a680240f9080114cbbf0208eb28050054BBL8;FF4901084aaa235738a90317386901084aab335738a91317384901084aaa435738a92317386901084aab535738a93317384901084aaa635738a9431738", + "6901084aL8;FF682213912001803de90742f90101803de83b41f9696e02f9e9e34939687602f9280080526a7202f969c2133968c21239b60000b4e0031aaae10316aa22008052L16;FFe8ef42f91f0500b180000054e8c3159100a1019131c5ff97e87740f98b010014fa031faae0000014fc031faaf6000", + "0145a008052f70318aade000014f7031f2aBBBBL8;FB8d8a9085740e8365b3e3a2d80926d66e277f6ee27fd5ee4adfdd48ead4ade658a28c3854ed4511bf919500008f8136cdceac0dd8f12b1bcf3accca59fa96b5e0L8;FFcc7e910a6b010f4af503142a4a010d4a4d5a7078f44740f929010b4a4a010c4", + "aa801084a20010a4a097c18535a0b0091080300795f0314eb495a69780920094aBL8;FFe07f813d730c0194e8fb42f91f0500b121e2ff54e99f40f9530200b0681240f93f0500b1e0010054fb4340f9f4833291081100b4e8833291406302917ea6ff97L8;FFa899995249018052e083c03c8899b972aa06", + "0091887ea89b6002803d08fd63d308d1091be90b40f908051c32286935386a0a00f9f44f44a9f51b40f9fd7b42a9BBL8;FFa1020291e80f00f9e8830091000000ada08201918c480094e86342a9f71b40f91f0500f140060054ff8602f16225005416048052970100b48002168be10318aaL8;FF0b010039", + "a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091150840f9080040f9f40302aaf30300aaL16;FFf4031d91ef7b02f9e82b02f9e8df40f9e92702f9e82f02f9e8af40f9f07f02f9e83702f9e8c740f9e78302f9e83b02f9e8b740f9e68b02f9e8", + "4302f9e8cb40f9BBBL8;FF930200b46f6c0194e00313aa2100805236008052676c0194c0feffb4e10317aae20313aaf40300aa6a6c0194e8230091a0820091bc680094f50f40f97501f8b6L8;FFa9680094c2fdffb042001a91e0031faac3680094fd7bbca9f70b00f9f65702a9f44f03a9fd03009115004", + "0f9bf0600b1a005005414d840a9f30300aa960100b4BL8;FFe08743ade00314aae227c03da0873bade08741ada203993ca08739ade08b42ada08b3aade08740ada08738ad20f4ff97a0077bad880080d20800f0f2880200f9L8;FFfd030091f30b00f940000094130040f9e00313aa930000b4d8ffff9773", + "3a40f9fcffff17000000d0009843f9d3ffff97000000d0009843f9d0ffff97000000d0BBL8;FF08e301910183c23cea2301a9e8a3039181820091a50303d102048052e3031caae4031baaa0073aadf55b02a9fa2700a97fd5ff97fb7740f9e082c03ce182c13cL8;FF810000b4e01742f9220080526a2c00", + "94e8a340f91f0500b180000054e803029100010391aee6ff97f45753a9f50200b49622009109000014e8e7563908d40736L16;FFe85f42f9e0031baae90b00f9e28310ad88f203f868ac0094a1835cf8810000b4e00f40f92200805263ac0094e00318aa01048052220080525fac0094e16342f9BBBBBBL8", + ";FB74696f6e20494420c000c01b2073657373696f6e20737461746520636f727275707420666f7220c0001f70726f63657373696e67205072654b6579206d657373L8;FFfa6702a9f85f03a9f65704a9f44f05a9fd030091ff830ed1280840f9291440f9e80f00b4e92b00b51f4100f1a12b0054390440f9", + "f8031faa5500805217038052BL8;FF0800f0f2080500d1a0c300d1a8031df8a2260094e10300aa7a000014e00700f901ffffd02140119103ffffd0639c1191e0230091a20080524403805296000014L8;FFffc30191c0035fd620fdfff000c03591c21c009420008052c1018052a21c0094fd7bbaa9fc6f0", + "1a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ffc30bd1BBL8;FF7460019449000014e0c302f9f6bf02f906000014e80b41b2e2c302f902000014c8060091e8bf02f9e0e315919b660094e0bf02f981ffffb02188099183ffffb0L8;FFa81b00b9e84301918bfafe97e82b40f91f0500b1c0000054e", + "017c03de83340f9e00f803de82300f90c000014e8a745a960fdfff000c01091a18301d1a82739a9L16;FFe1031faac2ffff17e20313aa230c8052cfe6ff97e10300aaa0f7ffb4b4ffff17e1031faa883e00f9b9ffff17e1010054e1031faaaeffff17c80080d2e10700f9BBBL8;FB1200140019001f00240", + "02a0032003f004800540066007f009200aa00cc00ff00240154019901ff014802aa023203ff03910454056506ff072409aa0acc0cff0fL8;FF24fbff17e063009122008052230080522400805219a4ff97e11740f9edfbff17e063009122008052230080522400805212a4ff97e11740f9fffbff17e06300", + "91BL8;FFf44f42a9fd7b41a9ffc300916a000114f44f42a9fd7b41a9ffc30091c0035fd6c0feffd000a03e91c3feffd063203e91c4fefff084600991a20700d161058052L8;FF09028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd63f4000f1e20300aaa80000543f0002eb68000054e00302aa0c0", + "a0014ff8300d1fd7b01a9fd430091BBL8;FFa88353f81f0500b161000054bfe733a9bf8314f8a12303d1a22301d1aec4ff9760f4ffb444000014a8035ab848000037b9031af8e1b20191a22301d1b5c5ff97L8;FF000540ad082140b9614241f9e89303b9000700ad218101b4604641f9220080526540009", + "4050c0014f7031faa080080921c0180527f220fa9601ec03d684240f9L16;FF74c00094ed031baa1c0500147c6347a9792f40f976af40a9744340f96f4b40f968d741a99f0700b16ca742a9618343a96aeb44a9773b5129803c0054ff420171BBBBL8;FB0ec6be20b2b22d7305b6c5093743000046f78321", + "d6224f1374182d384361d948e28948c32841a4e766e6361ff6641a288f6aff8b89baf50c5e73e7750ec6d61dL8;FF08fd46d308050091091c40b909050034290140b22911c0da291540d2290d098b2925019129fd46d3290500910a0840f94a0400b40b0440f9ed031faaec030aaaBL8;FFa1aeff97e8f34", + "2f909068052e02bc33de12fc33de233c33d6822099b69060091e0032d91000500ad0209803de9f702f991eaff979c6300917b0700919f0314ebL8;FFff0208eba1020054f90600f1e00300546c100094e00319aa2100805265100094e00c00b481060091e20319aafa0300aa68100094d702f8b6f4031faa", + "e00314aaBBL8;FFf80300aae0f5ffb4df0215ebf54702f9f84b02f9ff4f02f928090054f9031faae8031faad60000b40003198be10317aae20316aa67500194e80319aa0801168bL8;FF22010054fd7bc1a8c0035fd6e8031faa091c40f93f0500b121faff54e00308ab23ffff5480fdffd000803d91b74c", + "0094e8031faa090840f929f5ffb5091440f9L16;FF3e0f0014e00301aa190340f909a0c0a91a2845a90078c03d0b484da91c0441f9e86b00f9162042a93f031cebe94700f9090c41a9e0b3823de8bb00f9085443a9BBBL8;FF280e0036e90b40f983000014e80f40f9690640f92a0108eb032b0054690240", + "f9e00315aae30316aae403142a2801088be90b40f9682a00a9680040f9080540f9L8;FFc8008052090000b9680200a9680a00f9fd7b43a9f32340f9ff430191c0035fd6c0fdfff000a00091c3fdffd063403591c4fdfff084800191a27f0091e1068052BL8;FF000400b5e1031faaeaffff17e10314aae20", + "313aa40fcff97600400b5e1031faae4ffff1761020054e1031faae00301aaf44f45a9f65744a9fd7b43a9ff830191L8;FF8008159b0600068b04d05f388400003401e05f7821040011211c001204c05f3884000034000080d21f000039007d20d4bfc021eb82010054a31443aae703252aBBL8;FF1300001", + "4f9031faafbb749f9e8074091088109917f0700b1c02900540021049189170094080040b20811c0da081540d2080d088b0825019109fd46d30800098bL8;FFf60314aaf40315aaf50317aaf70302910a0000141f090071e1060054090180d268df78920900f0f23a0140b2370000141a048052ba031ef8e8", + "030291e13f40f9L16;FF220080526cb0009460220091f44f4aa9f65749a9f85f48a9fd7b47a9ffc302919db7ff1725fefff0a5402791e103009162220891e0031f2ae3031faa87ac0094BBBBBL8;FB65636861696e5f6b65796d6573736167655f6b6579730000ef104000000000004e0000000000000064", + "02000013000000696e6465786b657950656e64696e6750L8;FF090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0daBL8;FF6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b", + "26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab020400542a0140b2L8;FFe86b02f9fef1ff9708008092880200f9b50000b4e0031caae10315aa2200805265180094e11341f981e300b4e01741f91807001463180094e0031aaa21008052BBL8;FFf4430291e223c03d16108052e10", + "31f2a95020191e08707ade00741ade247803de21340adf87b40f9e133803de40305ade00f42adf73f4339e227803d8002178bL8;FF1867139106000014220080526a580094b50600f1d6c20091c0030054c1025ff8280041d21f8d00f10831979a1f6d00f108ffff54e9feff100a6b683829090a8bL16;FF", + "e80f41b2f7feff17a80a0091d1feff17a80a0091f3feff17fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091360840f9f30301aaf40300aa1f0002f1BBBL8;FF810000549fea04a99f2e00f99f6200b91f0900f1412e0054770240f9e20640f9423100b4e10240f920008039000ef8b728040091", + "490400d17d0000145f2800f1L8;FF6d780094e80740910881099100c10391010c00940ffeff17880241d2e90080521f2d00f10831899ae9fdff90295912918a0000102b7968784a090b8b40011fd6BL8;FF01f97fd3420080526bf8009468b640f9e80000b460ba40f901f97fd342008052f30b40f9fd7bc", + "2a863f80014f30b40f9fd7bc2a8c0035fd6fd7bbda9f50b00f9L8;FFc0035fd6200020d4fd7bbea9f44f01a9fd030091f40300aaa300f8b6f3031faa280080520901805210000014f30303aa010100b4e00302aae10313aa5c090094BBL8;FFe10316aa4a870094e01bc43de11fc43de223c43de09b843de", + "19f843de2a3843d68380194007880522100805261380194207201b4e10319aa02788052fb0300aaL8;FFa02800b5a02302d117f4ff97e80301aae0010036082900b5e1031faacaffff17602400b5a02302d10ff4ff97e80301aa40010036c82400b5e1031faac2ffff17L16;FFe95f40b9680a01f9c8f040", + "f8696208396966089162828c3c6bda19a97ab21ca9681601f92001803d6ab80094e0dbc13de1dfc13d68e20d91e9c343f9000500adBBBBL8;FB0000d1009300a7008a00e400eb00bd000a029100f4010000ef015601b30120010b021b02ce0146023b013602bb0000007b0000003c00c800e700a40025016", + "600L8;FF01f97fd3420080526b880094e87b40f91f0500f1ab000054e07f40f901f97fd34200805264880094e88740f91f0500f1ab000054e08b40f901f97fd342008052BL8;FF4003803d57000014f5c742f9f7cb42f99b0280d21b00f0f2e8a75139e8060036e14741f9a10600b4e04b41f92200805261", + "080194ffa71139e89740f91f0500b1L8;FFe1031baae2031aaa72080094bc7e6092a3000014e88b41f9e84400b4e08f41f901ed7cd322020014f78b41f9ff0600b120440054f48f41f9bf0a00f101f6ff54BBL8;FF760a00f973480194ffc30a91f44f43a9fc0b40f9f65742a9fd7bc4a8c0035fd6e00740", + "f9eaffff17e0030091e82b00a9ac460094ff8303d1fd7b09a9f95300f9L8;FFe90702f97846ff97a0420035fbef41f9e6f341f9e8430691e32b40b9fceb41f9e0e30091c1e20091e2830b91e403182ae5031baaf81f00b917ddfe97f89341b9L16;FFe1dbc13de0df833de0dfc13de2e3833de1cf833de0d", + "3833df95b00f9f98f07f9e99307f9ea9707f976810036a06302d1e1433c918f180094b4ef7ba9e0031d91BBBL8;FF680600f92802805268220079480080527f5e00397f3201b8680200b9f44f44a9f51b40f9fd7b42a9ff430191c0035fd682fffff042e01691e00301aae10314aaL8;FFd60217cbdf0208", + "eb3501178bd732889a152300a9f7fbffb5f62b40f9f51f40f996000037b8fdffb01863089113000014d7fe45d3e80214ab820c0054e90200abBL8;FFe1031faa882600f9d3ffff17010e0054e1031faa87ffff17e1010054e1031faa79ffff17c80080d2e10700f90800f0f2080900d169ffff17e80b41b2", + "e00700f9L8;ZDBBL8;FFfa0741b2e8df40f92083c13ce8c700f9e8a759a98082833ce8a716a978caff34e11740f921caffb4e00b40f922008052612801944dfeff17fb0300aaf80b00b9L8;FFe1830091e00308aa02048052e00301ad01d6ff97e9ff4039e88340390a088052e00300912a15003308111d1", + "2e8830039e80313aaeaff0039e00741ade00700adL16;FFf70314aa57000014338740a9080080921f230039080300f9e00313aad9b3ff97280340f9c80000b409e179d3e00313aa02018052211108cb5fa80094210f40f9BBBBBBBL8;FB73746174653a20c00076656e646f722f6c69627369676e616c2f7", + "27573742f70726f746f636f6c2f7372632f63727970746f2e7273002e526563656976657220L8;FF18033291790100f0e10f00f9c30800544100805235feff90b5420c9136feff90d6e20c915c0080520d000014ba080094fa0f40f9e80740f95f0308eb60040054BL8;FF22008052f4030b2a240600946a", + "a240a9e00740f9690240f9e10313aa54692838080500911f0048f1680a00f9e3fdff540b7c0e533f0108eb7361193220010054L8;FFf30742a9e8030091e00313aa4a210094e80340f91f0500b1e0010054e003c03de80741a929008092890200f98082803c880e00f9810000b4e00313aa22008052BBL8;", + "FF220080522300805224008052daedff97a1035ef822ffff17a0c300d1e10317aae20318aa2300805224008052d2edff97b7035ef8ba035df8480317cb1f0308ebL8;FF5e010094760a40f9bdffff17fd7bbca9f70b00f9f65702a9f44f03a9fd030091f30301aa210840f9f40300aa680240f91f0101eb0", + "00b0054680640f92a040091BL8;FFe00313aa28efff97e80300aae00301aae8fd073708fc60d3880f00b5080840921f1900f1c20f0054017c0353e10f00343f040071200200543f08007101040054L8;ZDBBBL8;FB64020000130000005369676e65645072654b65795265636f7264537472756374757265", + "69647075626c69635f6b6579707269766174655f6b65797369676e6174L8;FF807240f9800100b4e11740f9e80f40f91f0101ebe06c0054e81340f9090180522a040091ea1700f909692138e1630091ae8fff977f0600b180000054e1630091BL8;FF8842403969424039aa02000ad6020a0a1f01096be01", + "79f1a7f1701948846403969464039f503002a1f01096be0179f1a79170194884a4039694a4039b502000aL8;ZFBBL8;FF0924009142ffffd042203491e82700a9e80300910900009029213f912900001408a000910920009142ffff9042b80b91e82700a9e82300910900009029413a91L8;FF4402805286", + "000014c90080d2a8831d38480080520900f0f2a0c300d1a8931d38a9031df89d48ff97e10300aa74000014c80080d2e0430039e02300910800f0f2L16;FFec7b00f9e0b3823d081140f9ee4755a9e14740f9e9df40f9f09740f9edc340f9eb2b40f9fc7340f91f0900f1f41b00f9fa9b00f9e4e300f9a905", + "00543f0700b1BBBBL8;FB49000000000000009d010000160000003d044000000000004900000000000000950100001b0000003d0440000000000049000000000000006901000027000000L8;FF23f9ff5400feff9000000e91bf8e0094490080524afdff35ea031faa4901098b200108aba2010054f44f44", + "a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6BL8;FFe95700b960140054e8830291e0c3179101a1049144f7ff97e082c23ce182c33ce282c43ce8fb42f9e0db823de082c53ce1df823de182c03ce0e7823de082c13cL8;FFe1830c91e40313aae86b02f9e9a350a962c20391e6431391e7031faaf59", + "301f9e86f02f9e8a740f9e97702f9e87302f9e87b40f9e0cf803d080308aafc9302f9BBL8;FFddddff97f80f40f9b1ffff17e0230091220080522300805224008052d6ddff97e10f40f9b7ffff17e0230091e10316aae20314aa2300805224008052ceddff97L8;FF936a29f89f0200f9f44f41a9fd7bc2a", + "8c0035fd6e00301aae10302aa4b4d0014ff8300d1fd7b01a9fd430091a01300d181008052bfc31fb8444d0094a0c35fb8L16;FFee9f00f9e8c700f9082c4ba9ea0f00f9072850a9ebcb00f90b784ca9e8b700f9e8979f1aea2b00f90a6c51a9ebeb00f90e2c53a908219f5a081d0072eb3700f9BBBL8;FFb", + "f0208ebc9cbff54e00313aae10317aae20315aa2300805224008052d6fdff97770a40f956feff17f50300aae00313aa220080522300805224008052cefdff97L8;FFe1d342f984fdff17f40300aae04316912200805259110094e1d342f9e00314aa83fbff17e04316912200805253110094e1d342f994fb", + "ff17e0431691e1031aaaBL8;FF290040f9280800f94c0200b500fc55d336000014e10300a9e00301aae10309aa22008052230080522400805213160094e10340a92aa040a9536928380cfc5cd3L8;FF3f000071830c00b921a09f1ad6020e91e6ea009143008052b51600126420c11a84040051c57a66f86", + "320c21a42100012bc001c8bdc7a26f8641a00b942001b32BBL8;FF0969213828040091f67749f9e8d302f9df0600b1a033005480220291ba1e0094080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a050091L8;FFff0300f9ff4332d1f30308aaa86340b9ff0300f9e90300aae0070", + "9a9aa4700d1e88b00b96bfdff906ba10f91e81301b9a81840f9e20f0aa9e0070da9e00304aaL16;FFbf0208eb61080054e8e7039183824dad04f1cf3c88ea40f9e0c30991e90741f9818a4cade482843ce10314aa02328052e82b01f9e93701f9e10a00ade30201adBBBBBL8;FB6e6174757265206465746", + "563746564696e76616c6964207072656b6579206964656e746966696572696e76616c6964204b79626572207072656b657920696465L8;FF6bffff1720feff9000003a9103feffd063001c9124feff9084803a91a24700d1e1038052a896009420feff9000c02c9103feffd063001e9124feff9084602d91", + "BL8;FF09018052a8035df8755a00a9755e01a9785e02a97c6605a97b6200b9682603a9686604a9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391L8;FFe8431391e0060091f6d2fe97e86b42f94083c03c4183c13c4283c23c1f0500b1e0ef883de1f3883de2f7883de03400544083c", + "33c4183c43c090080924283c53cBBL8;FF610200ade083c43c68f20df8a8035cf8699e0339a9835c78600a01ad78f20cf876e20ef875620ff868e20ff8690e0279f6feff1799ffff90397719911a038052L8;FFa11a40f961f4ffb40804805205000014a11240f93f0400f1cbf3ff5408028052606a68f82", + "2008052635a009499ffff17c80080d20800f0f2080900912dffff17L16;FFa0c303d128e7ff97e80301aa20080036283500b5e1031faa96ffff17e1031faae8df01b993ffff17e8af40f91b0101ebe2000054f3010014a2c303d1430c8052BBBL8;FFe0031faaf44f44a9fd7b43a9ff430191c0035fd6e00", + "302aabe880094e80300aae00301aae10314aae8f80737d3ffff17e0030091e82b00a9aa780094ff4301d1L8;FF30110094d50000b4a8e279d3e00314aa02018052011115cb677a0094e1db42f9810000b4e0df42f922008052627a0094e04306910d100094e11b40f93f0400f1BL8;FFf44f45a9fd7b44a9", + "ff830191c0035fd60a048052932a00a99f420039f44f45a9fd7b44a9ff830191c0035fd68804805249008052932200a989420039f44f45a9L8;FF6f0148b21f010d6ae8118b9a9f010e6a0b014fb26d11889a1f005af2ad014eb26b018d9a9f010e6a0d40c4d26f11889abf0120eaed014db2ab018b9a9f0", + "10e6aBBL8;FFd83a01943f1f00f1a8010054800640ad80020191e103009122008052e00700ad800a41ade00b01ada236019400e4006f9f1a00f9808200ad8002803d08db77d3L8;FFe8a304f9e8831f91a04700d1e9af04f969fdffd029a11391e8ab04f968008052e1830f91e90f02f9e9f701f929fdfff", + "029ed0a91e80b02f928fdfff008f91491L16;FFe48715ad6181c73c6b9143f8e94f40f9e0a3803debbb01f9eb5f44f9e20713adec7202f8b9010014ff0600b1600200549c0100b4d5220091040000149c0700f1BBBBL8;FB00000b1016201d302c4027503a603170588053904ea045b074c07fd062e069f0", + "bb10b000ad30a62097509c4081708a60e390e880f5b0fea0cfd0c4c0d9f0d2e0L8;FFfc0300aa6f8a0094e00315aa41008052688a0094c00b00b4f60300aa698a0094e00315aa41008052628a0094000b00b4eaa743a9ecaf42a9eeb741a9f0bf40a9BL8;FF220080526c0a0194e89f40f91f0500b160000", + "0544063029197e4ff97f3db52a9960100b47722009104000014d60600f1f7620091e0000054e1825ff881ffffb4L8;FF170300b4e90240b22911c0da291540d2290d098b29250191e91a498b29050091b61640f92801088b360200b4c90240b22911c0da291540d2290d098b29250191BBL8;FF345341b92", + "85741b9e83f00b9b50300b54500001428008052e81300f9288f40f9e80f00f9289740f91f0500b160feff54359f40f9284341b9e82b00b9550600b4L8;FF4a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ff", + "ff5480fdffd0L16;FFe8eb40f9ef2f04f9e80304f9e82754a9ee3f04f9e64304f9e81304f9e81340f9e90b04f9e81704f9e89f40f9eb4704f9e81b04f9e81740f9ed4f04f9e82304f9BBBL8;FFf9e240a9e2031aaa000400ade00319aae10318aa0c0200941f0400f1612f00543f0018ebe2310054080d80", + "52f6031aaa3964089b3a2340f9281b40f95f0308ebL8;FF608240f9220080526b6a0094619640f93f0400f18b000054609a40f922008052656a0094613240f9810000b4603640f922008052606a0094613e40f9e10000b4BL8;FF180080921901805206000014e20313aa430c8052cef0ff97e10300aa00f", + "effb5a80640f91f0116eb29070054e00313aa1df7ff9740fd073728fc60d3e80600b5L8;FFe90300aa1fbd01383fcd0138e80300aae90300aa1fdd01383fed01381ffc0138c0035fd6000002abe8779f1a5f0000f1e9579f1a2801084a8801003708409952BBL8;FFe2e300918b1245f8e8fb0039e10319a", + "ae8b340f9e97304f8e9a34539ec7b0079ebf303f8e8f304f8e95f0139dcbbff97e103002ae8430691e00315aab9ceff97L8;FF5f0008eba8010054b40000b4680640f9e20314aa0001158b6e2a0094a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaf60301aaL16;FF48e1", + "79d302110acbf44f41a9fd7bc2a870aa00140a0e8052740109cb6c0640f901310a9b28e179d380320a9b021109cb0dab0094740a00f9f44f41a9fd7bc2a8BBBBBBL8;FB616420c012206d657373616765732028696e6465783a20c00b2c20636f756e7465723a20c00129001a73657373696f6e207374617", + "46520636f72727570742066L8;FFa0077fa9a806c05a08682178210800917b0700f1a1831ff821fdff54fc1740f903000014b5eb3ea9bf831ff8e80f40f9a083de3ca9835ff89f0308eba0039d3cBL8;FF610a40f9680240f91f0101eb00030054680640f9090180522a0400916a0a00f909692138e10313", + "aac7fbff97818a40a940008052e30313aa19faff97810a42a9L8;FF59f5ff9713000014e083c33ca1835ef8e003803de10100b4e00315aa22008052651e00940b000014b80000b4e00319aae10318aa220080525f1e0094a1835ef8BBL8;FFe02300918002803d880a00f9690a00f96de2ff97df0600b1e0", + "079f1af44f5ca9f6575ba9fc5f5aa9fd7b59a9ff430791c0035fd6fd7bbaa9fc6f01a9fa6702a9L8;FFe2db42f9e5f35639e1833291e6031f2acbeeff97e85b42f91f0900b1e1830054e80000d0fa830291081140f9fb4340f91f0d00f143070054e8c31791e0833291L16;FF29250191c91a498b2905009", + "1b41640f92801088b140b00b4890240b22911c0da291540d2290d098b29250191891a498b29050091200108ab220a0054e10313aaBBBL8;ZBL8;FFe36b873de367873de363873de35f873d4e790094e05fc73de163c73de8074091e26bc73de007409108810991e01b843de067c73d00800191e11f843de0", + "23843dBL8;FFa101f8b722008052f44f42a9fd7b41a9ffc3009168fe0014f44f42a9fd7b41a9ffc30091c0035fd6c0fefff000e00491b6fa0094c0feffd000a03e91c3feffd0L8;ZFBBL8;FFb70000b4e03740f9e10317aa22008052693e0194e12f40f9a1d5ffb4e02b40f96dffff17a00301d1a82b3ca9", + "ad3c009420008052e10314aa9a3a019420008052L8;FF163a01b4e0830f9187f8ff97683642f9754602f9aa0000d009554f29481140f93f050071e1450154fb6340f91f0900f1c902005468c21191290000b029712991L16;FFa0818d3cf6bb02f9ebbf02f9e8c302f9f5c702f9b00f0094e9b343f9fab74", + "3f9f9bb43f9e1bf43f93f0500b1a05b0054e8cf43f9e0c343f99f0700b1f6cb43f9BBBBL8;FB4b949a33491deae448b290f7752b1fbaf412c6b8732cac9be552e6e3a28c20d59c090000c890211f92fe5c1b8cafcb9aaf2a8825e1e1ddbeaf10e5240eb2d30cL8;FF94620091090100a9b5f20091090900f", + "9f65301f9d6060091df7e00f1e0240054688e00948007805241008052618e0094206b00b4a00640adc90600d1e84b41f9BL8;FF48008052e0a33239e8a73239c80080d20800f0f246000014e05306f9e0833291e1feff9021203f9102028052e3feff9063003a91040180528700001448008052L8;FF6902", + "00f96082803c680e00f9e10200b5e9ffff176b0e0094c002805221008052640e0094400300b428fdff9008a50391e90741b20001c03d08e140f80000803dBBL8;FFff430191c0035fd6097d1c53490d00342910c0390a00be5208010a0b2a1d00120901f83708710a8baa00805208a800a91f0000f9fd7b4", + "4a9ff430191c0035fd6L8;FF1f0109ebe80f0054960000141dfeff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb281000548a000014f30300aaL16;FFe8b742f9e9c742f9e8431ca9e8c342f9e83f00f9e8cf42f9e9231ea9e9d742f9e8d342f9e97f00f9e9", + "e742f9e82f00f9c80100d0e98300f9081140f9f19300f9BBBL8;FFf6d340f85b6a0094e83340391f090071a0010054bf02086b61010054e9d340f8e85341f8df0209eb800248fae0179f1af44f44a9f65743a9fd7b42a9ff430191L8;FFe1e30091022180528002803de8ab00f96082803c680e00f96e6e0", + "094e0430691e10315aa3914ff97e00315aa1609ff9728008092680200f9a6ffff17e85340b9BL8;FF7a0240f9480740f91c0101ebc2020054e80f41b207000014890080d248008052e0e303390900f0f2e8e7033928017fb2e0c30391e87b00f998f4ff97e10300aaL8;FF3f0000eb4294821adf00026b8d", + "030054e00315aa23fdff97f40300aac00b00b4e20213cbe10313aa5f0015eb4290959a68eeff97e00313aa37f9ff97f76343a9BBL8;FFe207409120ffffd00080059123ffffd063a0219124ffffd084200691428009918104805248030039a72a019448236639e207409120ffffd000a4049123ffffd0L8;", + "FFf9030bf900001891f6070bf9e4dcfe97e00706a9e00319aa01c4805222008052652e0094bc035ef8bb035df868031ccb1f7d00f189440054b9835df8400740adL16;FF080080921f200039080000f9810000b4600640f92200805267ae0094618241f8e1fdffb5f44f48a9f65747a9fd7b46a9ff430291", + "c0035fd6fd7bbca9fc5f01a9BBBBBL8;FB506f6c796e6f6d69616c4572726f724368756e6b496e6465784465636f64696e674572726f724368756e6b446174614465636f64696e674572726f7200000000L8;FFa909c05ae8271029c809c05ae909c05ae8271129e08743adc806805234008052a00301d1a", + "1c302d122008052b4031ef8a0873aade28344ada9035538aa135538BL8;FF080317ab22070054c902158b080109ab62090054691640f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab02080054L8;FFe99341b900401d911aed003909090039e98b41b916f100", + "39090d0039e98341b919f5003909110039e97b41b91bf9003909150039e97341b909190039e96b41b9BBL8;FFa14301d1e00315aaa8031cf857dcff97b6035cf8b4035bf8880216cbbf0208ebc8220054150100b4a8835bf8e1031caae20315aa0001168b66560194d602158bL8;FFe00304aae18b0ba9e1", + "0302aae96300b9e28f07a9e49708a9e69f09a9ffd30879ff4b02f9e3930ca9e59b0da9e9fb00b9ea0b10a900013fd6e03b02f9e8031691L16;FF00c100910ddeff973a0500349f0100145f0f00b1c0000054e80080520900809268220039690200f90b000014280080527f2200a9080080927f2201a99f06", + "00f1BBBL8;FF080117cbbf0208ebc8300054680640f9e10316aae20315aa0001178b6d760194e802158b680a00f9951640f9550300b4610a40f9680240f9961240f91f0101ebL8;FFe8cb42f91f0101ebe0770054e8cf42f949028052f6074091d6820991f4031baa0969213828040091f87749f9e8d302f", + "91f0700b1c0200054c02202913d2a0094BL8;FF60f240f9220080526bf6009461fa40f9810000b460fe40f92200805266f6009460220091f30b40f9fd7bc2a89afdff17fd7bbea9f30b00f9fd03009101c840f9L8;FF734200d11f0013eb41ffff54020080d2efffff1780ffff97140080d2810180520100", + "00b9030000143406009440fcff34e00314aaf35341a9fd7bc3a8c0035fd6BBL8;FFe0074091e173c13df64349f900800991e85b09f9e83b49f9e277c13de0a3843de067c13de81700f9e83f49f9e1a7843de16bc13de80700f9e807409108810191L8;FFfc3b01f9a9010014c90080d20900f0f23c450091", + "1f011ceb603b0054200743ade8c324912223c03d61fdffb021381491e0c30e91e3432a91e4c32491e2008052L16;FFf9031faaebffff17fb031faa1bfcff17ba0000b4e00315aae1031aaa2200805265b60094e16f40f9810000b4e04740f92200805260b60094dbfdffb5f9031faaBBBBL8;FB696300000", + "0000000920e4000000000005500000000000000ce000000010000006d6573736167655f656e63727970746d6573736167655f646563727970745f73L8;FFff430291c0035fd6ff4302d1fd7b03a9fc6f04a9fa6705a9f85f06a9f65707a9f44f08a9fdc30091390040f9f40301aafb0300aa3f0700b12006", + "0054880a40f9BL8;FFc1c0ffb4220080526b06019403feff17c082c73ce8a344f94003803de8f304f9fefdff1748020090081140f91f0500f149040054e12340f9a04303d102048052L8;FF6d060094f3ffff17db0000b468071b8be00316aa0201805201ed7cd366060094ff2200f101efff54f6031f2a5", + "f000014b90000b4e00316aae10319aa22008052BBL8;FF040000143f0800b1c1010054f80300aae00318aa15caff9708008092686a00a9f44f5ba9f6575aa9f85f59a9fa6758a9fc6f57a9fd7b56a9ff030791c0035fd6L8;FF88fdffb008611191e90f02f949048052e82719a9e1031091e3430691e8271", + "aa988fdffb00801119142008052e8db00f966fcff970a0380d288fdffb008e91191L16;FFe92b44f9e92b00f9e98744f9e92f00f9e98b44f9e9af0fa9e98f44f9e94b00f9408c0054e92b47f9f0b300f9f0031aaafabf40f9ee3300f9ee0305aae92b01f9BBBL8;FFe81b40f9e003803de80b00f90c00001", + "4e8a742a9a82739a9a8c301d1290000f02961109180ffffb000c01091e8a703a9e8030091e1e30091ba620194e8030091L8;FFffc303d1fd7b0aa9f95b00f9f85f0ca9f6570da9f44f0ea9fd830291081c00121f090071e1010054e00302aaf30302aaf40301aa6bfeff97e80300aae00301aaBL8;FF6328", + "0f91e003009142018052a400805231ecff97e10340f9b5ffff17c80080d20800f0f208090091adffff17ff0302d1fd7b03a9f92300f9f85f05a9f65706a9L8;ZDBBL8;FFa80000b4606640f901f57ed34200805269260194686e40f9a80000b4607240f901f57ed34200805263260194687a40f9a80000b4", + "607e40f901f57ed342008052L8;FFf44f01a9fd030091010040f968028052290041d23f8d00f12831889a1f6d00f14804005449fdffb0292130918a0000102b6968384a090b8b40011fd6010440f9L16;FF8b018b1a3f010b6b090500542901805268d201292800805269220039680200f90600001488008", + "052620a00f92900805268220039690200f9f44f47a9f92340f9" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines2 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines3.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines3.lean index 33a9ffc02..151d0b468 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines3.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines3.lean @@ -27,361 +27,252 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub3 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FFa1030054df010d6bc0fbff541a0000146e310a2aea0d0091d5ffff17ff81007140010054ffc1007161020054df0d407180faff5410000014ce1d40928e696e38L4;FF8b0cf8374b05c0396c1d00128c6119538c01210b810102516b00f8374b0080524c0000143f104071c30b00544b09", - "c0396c1d00122c380c0b811140516b00f837L8;FF29811f9117000014f80300aa85200194000380520101805283200194400500b42a008052e80300aa165c00a98902009029011c910a0800f9e00318aa09000014BBL4;FFe1031aaae20319aa24008052e84301398e02009483a001940004805221008052", - "81a00194602300b4e08743ad08048052e80302a9e2830091e103152ae81b00f9L4;FF8bfcff546300080b9f00036b2afcff54211040f93fcc74f22001005421cc749223fc44d3630400d17fc024eb23fbff54244000d1ff1040f2a0000054010000d0L8;FFe40313aaa8831ff8d7a00094d7a00094f44f43", - "a9fd7b42a9ff030191c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa810100d0216c1c91BBBL4;FF81880054aee001941f10003101880054f9ffff17abe00194f70300aa1f0400b141fdff54e043059181008052a6e00194e0860035e85341b9e87300b957ffdfc8L4;FB797465732", - "e72730022616476616e6365206f7574206f6620626f756e64733a20746865206c656e20697320c0122062757420616476616e63696e6720627920c0L8;FFe0ef41f9220080528ae00094e1f741f9810000b4e0fb41f92200805285e00094e10342f9810000b4e00742f92200805280e00094e10f42f98100", - "00b4e01342f9BL8;FFf30303aaf40302aaf50301aaf60300aa84600194000880520101805282600194800100b48002c03d165400a9e10200d021600991130800f90080813c1fe00039L8;FFe00b40f9e10308aa2200805289600094e10313aae81340f9c80000b4e01740f9e10308aa2200805282600094e", - "10313aae81f40f9c80000b4e02340f9e10308aaBBBBL4;FFdf020f6b20020054c90500d12e010eeac1feff54428c202e42a8302e4900261e690600378c210091a0010c8b0d000a8a02696dfc438c212e6900669e2ec101f2L4;FFa7000094000300b50e00001428008052090180529f6a29f8880200f9f44", - "f41a9fd7bc2a8c0035fd6d30100b47d000094e00313aa210080527b000094400100b5L8;FF920001946002009000403a918f0001946002009000a03a9189000194ffc300d1fd7b01a9f44f02a9fd430091280840f9290040f91f0002f1230f00543f0108ebBL8;FFd880019468620091010300d021082991", - "040300d084e01291e0030091a363009122018052a80f00f9cf800194010300d0213029912403009084402391a3630091L8;FFe81340f92a040091e00315aa49038052ea1700f909692138bbe9ff97e1630091ff7fff979f0b00b1a1010054e083c13ce81740f96003803d680b00f9f44f48a9BBBL4;FF20c", - "00194740640f9d70000b4e806178b80620091e10314aa02f17dd387c00194a002c03da8035ef8e9060091e02300918002803d880a00f9690a00f92ea9ff97L4;FB747275637475726570726576696f75735f636f756e74657270715f726174636865745f7374617465436861696e73656e6465725f726174", - "636865745f6b657973L8;FFe233c03d89fa40f9a0073bad0001c03d817ac03d88ee40f9a203983ce007813d4183813ce81302f9e91f02f9b70000b4e00318aae10317aa220080527dc00094BL8;FF0a0900390c440c33090d00396a6d1c320a0100390c050039cdffff17f703002ae0230091e10314aae20", - "315aa89ffff97e003172ae80b40f9ff0202710801148bL8;FFe90200aba20c0054aa0217cba8831cf8a8c300d1a02301d1a9ab3ba96628ff97a8035ef8b7031ff8140117ebe3070054b8237da9b6835ef81501178b680240f9BBBBBL4;FF8c100294e11340f9810000b4e01740f92200805287100294e11f", - "40f9810000b4e02340f92200805282100294e12b40f9810000b4e02f40f9220080527d100294L4;FFe0cb00b9a04700d14bc2ff97e0c700b9a04700d148c2ff97e0c300b9a04700d145c2ff97e0bf00b9a04700d142c2ff97e0bb00b9a04700d13fc2ff97e0b700b9L8;FFe9a302a9e8230091e2031f2aff", - "a301a9a0fdff97e91f40f9e85740b9aa058052e0830091e1e3009182048052e91f00f9e92f4829a8831fb8ea030139e91304b8BL8;FFa282c43ca88358f8e08705ada082c53ca103d93ce82700f9e28306ada082c13ce18304ad3a2f40f9fb3300f99a0700b4080d8052382b40f9547f089b79900194L8;F", - "Ffd7bbfa9fd030091081840b9c8050034080140b20811c0da081540d2080d088b0825019108fd46d308050091091c40b909050034290140b22911c0da291540d2BBBL4;FFe0031baa40060094746b40a97c0f40f941ffff1748040091e00314aae1031aaa1f0114ebe40318aae933949a030109cb630b00f", - "9aceaff97d60600d1f803132aL4;FB00000000ffcec917000000000000000000000000bbda11b800000000000000000000000000000000000000000000000000000000df35da5e000036c6254cdb64L8;FFe8270ea9e8a74ba9ecab00f9e30304aae0c7c33de5fb42a9f10303aaf9b344a9e40308aaf74b0", - "0f9e80310aae3030faaeacf00f9e1f7c03def030eaaea6341a9BL8;FFe00315aa220080528a500194e12340f9810000b4e01f40f92200805285500194ff830891f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6L8;FFe8632291a900009029110f91a10302d1a82739a9080100d008", - "413191c9048052e8c302f9e3031691e8cb02f9080100d008213e9142008052e9c702f9e9cf02f9BBBBL4;FFe00742ad600601ade00b43ad600a02ade00741ad600600adfd7b4ba9f36340f9ff430391c0035fd6ff0303d1fd7b0aa9f35b00f9fd83029100e4006ff30308aaL4;FB656e744d657373616765", - "00000000000085924800000000003300000000000000210700000e000000696e76616c69642027726563697069656e74272070617373L8;FFbaffff17e80b41b2e00700f9b7ffff17880080d20800f0f2080140b2b3ffff17880080d20800f0f208110091afffff17e00300f9210200d021701e91230200d", - "0BL8;FFa27f0091e10680529a700194ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aae10200d021982a91e8230091e00309aae2028052ca700194f40200d0L8;FFdf0600b18000005480220291e1431691da1200943f0700b1f90b40f9c07cff5401230491c4000014e8031faa00011aabe265", - "0054e1431691400d0094df0600b1BBBL4;FF08010aaa69a200a908008092680200f9e82b40f9a80000b4e01f40f9e12b40f92200805283b00194e82340f9080500d11f0d00b1a8000054e01b40f9e12340f9L4;FFfd7bc1a8c0035fd6c0035fd600000000210000f02074483960010035200000f02200805", - "22274083900a440f9c00000b4210000f020dbff902180089100000091L8;FF6862013993b00094b6f7ffb5c0ffff17a50100f0a5800091e1630091a2c20091e0031f2ae3031faaf8b00094a30100f063e0009100088052e1031aaae2031aaaBL8;FFe95706f9890200d029cd2191eaa705f9ea032d91e86b", - "06f9880200d008f52491e96306f9290080d2e87b06f9c80480524942c0f2ea7f06f90a078052ff5306f9L8;FFf70600f1b5c2009181ffff54390000142009c03dc102c03de8a344f9fc3b01f92023803d2183863ce84701f928000014fb6b4ca926000014e100009021c00f91BBBBBBL4;FFc10000b4820a", - "40f9e00313aaf44f41a9fd7bc2a887180214f44f41a9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091086040391f0d0071a101005413d040a9L4;FF25000014d60c00b486180094c00180522100805284180094c00b00b4a80000d008fd3991bc0000d09ceb2e91090140f9086140f897ff48d3f80300a", - "af50741b2L8;FFf44f05a9fd430091160440f9760200b4335040a9380200d018431091170040f9b9730091750200d0b5e21891e8164038e3030091e00313aae10314aae20315aaBBL4;FFb281ff9720f8ffb4f70000143f0c0071e00400543f10007101f7ff54a80355f81f0500b1800b0054e1220191a2e", - "300d1a681ff97a0f6ffb40c0100143f1c0071L4;FB09000a000c000f001200140019001f0024002a0032003f004800540066007f009200aa00cc00ff00240154019901ff014802aa023203ff03910454056506ff07L8;FF6901084aab335838a91318384901084aaa435838a92318386901084aab535838a", - "93318384901084aaa635838a94318386901084aab735838a95318384901084aBBBL4;FF3f0500b180040054fd7bbca9f70b00f9f65702a9f44f03a9fd030091a3040036097c40f93f0500b140040054f603022a028c40f9f303032af40300aac40300b0L4;FB34356363642f303639353962342f7372632f", - "76312f6368756e6b65642f73656e645f63742e7273002f636172676f2d6769742f737061727365706f7374717561L8;FFeac745f9e9a309a9e8b345f9e9a745f9eb2318a9e8b745f9ebcb45f9e88b00f9e8bb45f9e8b700f9e8bf45f9e8cb00f9e8c345f9e8eb00f9e8d345f9e82f14a9BL8;FF220080528", - "b580194e13349f9f3074091738209913f0400f18b000054e03749f922008052835801943f0700b16000005460c20091f40c0094e87349f9090d0091L8;FFa22302d1630c8052a9ecff97e10300aa203000b5a88357f8080540f91f0115eb09100054a02302d1b3f4ff97402f003728fc60d3c81400b52008", - "40921f1800f1BBBBL4;FF080000f9080400f0082135911f30003960a200a9090d40f9e803009120013fd6e80340f91f0d00b100fdff5475da40a9e00740adc80240f9e08701ade00bc03dL4;FB63616c6c2027c003273a20c0001f696e76616c6964207365616c65642073656e646572206d657373616765", - "3a20c00026756e6b6e6f776e207365616c65642073L8;FF21bc19914302009063dc1591060000144102009021bc19914302009063cc1591e00300f9e0030091c20180528400805211000014c80080d2e0230039e0030091BL8;FF220080528b780194e80600d11f0d00b148020054e03740f9e10317aa0d0", - "00014e12f40f908008092686e00a9810000b4e02b40f9220080527e780194880700d1L8;FF6801009008690591e94f09f9aa0a8052a04700d1e85b09f9e807409121800991e93709f9690100902911049108c13591e94309f9290080d2e85f09f928038052BBBL4;FF99b80194ffc302d1fd7b05a9fc6f06", - "a9fa6707a9f85f08a9f65709a9f44f0aa9fd430191fb0305aaf80304aafc03032af503022af90301aaf703002af60308aaL4;ZDL8;FF690100d029e10e91f60301aaf30300aaa8273fa9c001009000a80e91e8230091a14300d1f40303aaf50302aab0b80094e10740f9c10100b43f0400b121010054BL8;", - "FF4b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aabL8;FFf75340f9e15f40f9810000b4e06b40f92200805287380094e14b40f9fc432a91810000b4e00314aa2200805281380094683642f90", - "94940f9090001b4690242f9BBBBBL4;FF168800f9f70300aa01500491e003082ae20303aaf80303aabbf2ff97200100b460000014f70300aa01800491e003082ae20303aaf80303aab3f2ff97400c00b5L4;FF681a00f9e80b40f96082833c6182843c742200a9f44f47a9fd7b46a9ff030291c0035fd6e0", - "0b40f922e6ff97480080d20800f0f2742200a9f44f47a9fd7b46a9L8;FFfd7b42a9ffc30091c0035fd6ffc300d1fd7b02a9fd830091490200d029c13e91eafffff04ae12491400200d000803f91e92b00a9490200f029c10891e1030091BL8;FF08250191081848ab42150054170117ab62150054180700f", - "194a2019161feff54e80216abc2020054080115abe2140054697e40f93f0500b180020054691241b9L8;FF68220039690200f99c000014480080527f220039680200f998000014f40300aab50c00b47f880094e00315aa410080527d880094e02300f9201600b479880094BBBL4;FFa0050054e1030691a2", - "6301d1afb1ff9760f8ffb44d000014888f40f91f0500b1e002005461630091a26301d1a7b1ff9760f7ffb44e000014e8d341b988f60737L4;FB6c69622e7273001b737071722076312e73656e645f656b2e73656e642065706f636820c01e3a204b657973556e73616d706c6564202d3e204b65797353616", - "d70L8;FFe07740f9e10319aa2200805289c80094e86740f91f0500b1608dff54df0600b1e02d0054681f40f96083c23ce9c31391e0831d91e1c31591f6bb02f9e8d302f9BL8;FFf40315aa3600805287480194a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad30a088052f4031faaf5", - "ff03a92911c0da490109cbea008052L8;FF4a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6000100b00020189185480094000100b000c01591824800940001009000203691BBBBL4;FF08b51e91682b05a98a068052480480527f2700a9c90300f029d50591692b02a92900", - "80d2891cc0f2687f01a9682704a98ce801947be801948004805221008052L4;FB382140000000000020000000000000000800000000000000c89d4000000000008c21400000000000280000000000000008000000000000000c9f400000000000L8;FFa0c303d1f76301f9f77f01f973e7ff97600a003681", - "2800b5fbd340f9e8cb40f97f0308eba0110054e8cf40f9090e8052e0bfc03d6823099be1031faa000d803dBL8;FF0001168b93680194d602138bb6831ef8df0217eb61000054a0a300d1d7670194a8035ef809108052d506009109693638a1db7da9b5831ef83f0015eb09010054L8;FFf81f40b9e95300b", - "94231803d02c1853c438942ad01c1823c00c1813c02c1843c03c1833ce80b40b9400504ad418147ade8a700b9e81340b9430905ade4838a3cBBBL4;FF24008052fa9aff97bae77ba9a1035bf83c230091546b39f83f001ceb28dfff54fefeff17600300d000200d9184a8019420008052e1031baa8ba8019", - "420008052L4;FF601640f9a002008bea090094730240f9f7ffff1739430691e00316aa211740f9e16a38f8da6200f9f35341a9f55b42a9f76343a9f96b44a9fd7bc5a8c0035fd6L8;FFd602188b3b008052b5c303d10c0880522d00001409088052a002088be1830091220108cb8ba80094a80357f880030", - "191a1c303d12200805208050091a80317f8BL8;FF0110813cf30b40f9fd7bc2a8c0035fd6200080522104805293280194fd7bbea9f44f01a9fd030091f40300aa2301f8b7f30303aac10100b4e00302aa22008052L8;FFffe71639416effb4e01742f9220080526efbff17f6e742f9fb074bf9f90b4bf9fc", - "0f4bf9f8134bf9f5174bf9c80240f9f7e342f9680000b4e00317aa00013fd6BBBBBBBL4;FF000308cb020180528a1c0294e8ffff17e003032a8e1c0294f40300aae5ffff17ffc302d1fd7b05a9fc6f06a9fa6707a9f85f08a9f65709a9f44f0aa9fd430191L4;FF1f0900b141010054e8230091e00316aab", - "e90fe97950100b4e00316aae10315aa22008052831c009407000014a003df3ce85701a928008052f60702a9e003833cL8;FFf65741a9fd7bc3a840feff17fff8ff97fd7bbda9f65701a9f44f02a9fd03009115fcdfc8f40302aaf30301aaf60308aab5010037a142009120008052ea1c0194BBL4;FFec6b0", - "0b9ec535339e19f5339eafb1029ea135339e2a35339fcdb5339e3a75339eb2b1229eb175339ea1b5339ec7700b9ec575339e4ab5339eb2b1329eb1f5339L4;ZFL8;FF3f0400b140010054810000b4600640f922008052879c0094610e40f9810000b4601240f922008052829c0094611e40f914008092740", - "200f93f0400b140010054BBBL4;FFe1074091028c815221400f91178c8152e00319aa8fdc0194e99740f908c48052f95f14a9e92313a97edc019420c48052210080527cdc0194c00800b4e19740f9L4;FB70655f75726c3a20657870656374656420747970652055524c3a2022c009222028676f743a2022", - "c0022229004b6661696c656420746f20656e636f6465205072L8;FFe93f13a9ef030aaaea030baaeb6f42f9e8a700f9880a41f9e96b42f9e0f3803d8082c03de82b01f9e87342f9e093803de8af04a9e87742f9ebc342f9e80b00f9BL8;FF28038052091ac0f2ff3309f9e83b09f9ff3f09f9ea4709f9e85", - "309f9e95709f9905c0194f6ef47f9e01bc43de11fc43de0431691e8036179e143069102738052L8;FF4a051a320a010039e0ffff17ea0f80120b7c10530a2c0633eb0000350b7c0c530a050039090900396a091b320a010039d6ffff170b7c1253ec0f80120a090039BBBBL4;FF0800669e18c101f2e1f8f", - "f54e6ffff1735c305d1e0430c91022e8052e10315aa8cfc0194e1430191e00315aa022e805288fc0194e11b40f9810000b4e00316aaL4;FB08c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b", - "L8;FFe80300aa410200b021341a91430200b063781a91e81300f931000014c90080d2e0a30039480080520900f0f2e0830091e8a70039e91300f99df1ff9723000014BL8;FF8c7c0194611a40f9740e00f93f0400f18b000054601e40f922008052857c0194612640f9741a00f93f0400f18b000054602a4", - "0f9220080527e7c0194742600f9L8;FFe11740f9d1fbff17e0630091e10318aae20316aa23008052240080526492ff97f81740f9e80f40f9080118cbdf0208eb697aff54e0630091e10318aae20316aaBBBL4;FFe91f40b9ebe34039ea2342b8e10740f9776200a9683200b9e84f4079693203b8e91b40f9", - "a8c31a78a9031cf8e9434079e83b007969720378e91740f968d20378L4;FB14f647000000000018000000000000000800000000000000d41848000000000014f647000000000010000000000000000800000000000000ac19480000000000L8;FF09018052e82705a928000291e1030191f62306a9ea1500", - "94bc937da9e8030191e0031f2ae10319aae2031aaa2500805206048052e3031caaf6bc0094a1035df8BL8;FFe00308aa20020094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb09290054088c48f81f0500b1L8;FF7f0c0014776a41f900c", - "3c73c01c3c83ce90f44b9f6eb43b9756641f9e80240f9208709ade96303b9680000b4e00315aa00013fd6e10640f9810000b4e20a40f9BBBBBL4;FF2a040091e00317aa6a0a00f909692138e10313aaf3f7ff97790a40f9680240f9080119cbff0208eb48300054680640f9e10318aae20317aa0001198b8", - "50c0294L4;FFaa02098be1000054490140393fad0071000600543fb50071c005005402000014490140393fad0071e9179f1a090109cb48158a9a3f0d00f1c2020054a90400b4L8;FFe91302b8eb2700b9aff6ff97fd7b43a9f32340f9ff430191c0035fd6ff8301d1fd7b04a9f44f05a9fd0301913f9800f", - "121060054090040393fed017101060054BL8;FF694240393f05007181010054600640a92a0300b04a61199109040091400540ad690200f9000500ad000502a9f44f41a9fd7bc2a8c0035fd6f40308aa8e8c0194L8;FFff2314a9ff2317a9e82716a9ea7f18a9e85719a9ff231aa9f67f1ba9ff231da9ff03", - "01f9e80701f9f70b01f9ff0f01f9e81301f9f81701f9ff1b01f9e81f01f9BBBL4;FF20053eade00a40ad20093fadf44f4da9f6574ca9f85f4ba9fa674aa9fc6f49a9fd7b48a9e923476dff830391c0035fd6c2820091f50300aae00316aa21008052L4;FB6ea665b6788673961a6611760c46075636263d3", - "620062b16f9f6f2e6efd6e4c6d5b6dea6c396c886a176aa66b756bc468d3686269b169006484d41432063616eL8;FF220080528bcc0094590080527e080014f7031baaf68e40f8f81e40f91f0b00b1000d00541f0700b1c00c0054e81e4139e9524478ea224039fce644a92841082aBL8;FFe4838a3c8001", - "803de8d302b9214b803dfafdff17280300b008b140f91f0900f123030054e8b30a9189ffffb029b13491e80302f9e8830a91c00200b000881d91L8;FF081540d2080d088b0825019108fd46d308050091090840f9290b00b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091091440f", - "94801088bBBBBL4;FFe00313aa2100805287ec0194c00000b4e10314aae20313aaf50300aa8dec0194e00315aae10313aaf44f42a9f50b40f9fd7bc3a8c0035fd620008052e10313aaL4;FB4e00000000000000010500001400000017a24800000000004a00000000000000b60200000900000062a248000", - "000000072000000000000000200000026000000L8;FF1f0101eb40040054680640f92a040091e00314aa490280526a0a00f909692138b6500094e10313aafdebff97803240b980010034610a40f9680240f91f0101ebBL8;FFa0031df802000014680f0091a0e300d1a8831cf8a6610094fa0300aa320000", - "14fa031faa30000014ba035df82e000014a0831cf8e10200b021483191e30200b0L8;FF0d000014e08745ad08008092e237c03d680200f96082803c6182813c6282823cb90000b4e0031aaae10319aa22008052806c0094e12740f9810000b4e00315aaBBBL4;FF220080528bac0194e00316aaef830094f", - "aff403908088052f60301aaf70300aafc03009102011acb390002ebc2020054e8030091e10317aae20316aa00011a8bL4;FFf44f0aa9fdc30191000280525c0d0094f30300aa40038052590d0094080013aae82500b4880080527f0277f28a0080520802a072e903332a6b7e03534a01889aL8;FF6003005", - "408038052e9830791ea7240f8da26089ba9035cf8a9031df8ea7201f8480340f908f8ffb4400740f901f97fd3420080527fac0094bbffff1748008052BL8;FF810340ad610201adff032e91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6404fc03da80359f84003803de8f304f9e", - "89740f91f0500b1L8;FFa20201ade24bc23de0dfc13dfa1702f9220500ade1e3c13df91b02f9000700ade073c23de177c23de0671139c00600ad097142396902003609dd49b8ea0308aaBBBBBBL4;FF3f0108eb13601932200100542a0440f91f1040f15369283808050091280800f94202005400fc47d36", - "e000014e10300a9e00301aae10308aa2200805223008052L4;FF6be12891ed018052f003182ae2030a2a4a070014e96f42f9e87342f9e9a31ba9b60000b4e00319aae10316aa2200805280140094e80b4091e083099108c10e91L8;FF690600f9f44f44a9f65743a9fd7b42a9ff430191c0035fd62900805", - "2040000144900805202000014690080526a0200b04a812f914a7969f808010aeb03050054BBL4;FF2027c03d212bc03d222fc03d2333c03de31b803de217803de113803de00f803d680200f9e00bc03de10740f96082803ca10100b4e00314aa220080527d940194L4;ZDL8;FF21881591840100d084a00a", - "91e0230091a32300d1a2008052a8831ff8d294009468c20091610100f0219c1591840100d084200b91a32300d182008052a8831ff8BBBL4;FFecffff17a0a302d10fd50094f50301aae0c10736fa000014a0a302d10ad50094f50301aa80c70736f5fbffb4e7000014f6031faa1401805208018052ff7f01", - "a9L4;FB57000000000000000d01000017000000de1949000000000057000000000000006801000011000000010004880588000007f006f0000003780378010005b40596L8;FFf13f1ea9ef0308aae8ff40f9e55f00f9e5030faaef030caae89300f9e8bb40f9e3030aaaeafb40f9ec0309aae94740f9e8ff", - "00f9e8e740f9f90301aaee2b1ca9BL8;FFdf0600b18000005480220291e1431691351200943f0700b1f90b40f9e07aff5400c303913c010014e8031faa000119ab62640054e1431691310d0094f90b40f9L8;FFc80480526944c0f2ea7f06f90a078052e07f823dff5306f9e85b06f9ff5f06f9ea6706f9e", - "87306f9e97706f98d540094e1fb44f9810000b4e0ff44f922008052BBBBL4;FFe1430191a20301d1b0ddff9780f8ffb451000014ffdb06a9ff3f00f9a1620091a20301d1a9ddff97a0f7ffb453000014a00301d104f50094f40301aa80fa0736L4;FBa63169e0e2eb8a3fae24f63099f85ea319c3c1c46d3", - "454706ae2a679d1fee690a488adda98a2290b66c906bb60295ed7810a2908d786df9a07122105847c0d2cL8;FF04000014c80080d20800f0f2080500d1e80300f9e0030091a5e9ff97e10300aae10300f9210200f021b01c91230200f063101591e00300916201805244008052BL8;FFc0f7073615000014", - "01008092280400d17f6600a91f0d00b108f0ff54e00317aa22008052837401947cffff17280b0091b6031df805000014e80b41b2a0031df8L8;FFf31340f90800001408008092681a00f9f30742a9810000b4e00740f92200805284740094a80600d11f0900b1e823931aa8000036e0031baae10315aa220", - "08052BBBL4;FFf44f47a9f65746a9f85f45a9fd7b44a9ff030291c0035fd6ffc306d1fd7b17a9fc5f18a9f65719a9f44f1aa9fdc3059100e4006f439040a9f503012af30300aaL4;ZBL8;FF90e300918b7dcb9b0c0e80520f010c9bac0301d111010b8b22060091efd100910082c13c111640f929c101f11", - "2025ff80102de3c8081813c0082dc3c918102f8BL8;FF650100141f0800f1c1240054a80302d1a10302d1a22302d11f7d01a908018052bf5b38a9b67f3aa9bf233ba9bf6b3ca92aeeff97e03100b5a0077eada8035ef8L8;FF481300b5200840921f1800f182130054217c0353411400343f040071200100", - "543f08007141fdff54a1a20491a22302d17ff3ff97e02900b5e1031faae9ffff17BBBBBL4;FF28000aca6aae8cd28a2eaff2e00702a9e00300914a8cccf2ffff03a9aa8ceef2ff1b00f929000acae82701a9482440a91f0500b13401829a818a40a923890094L4;FF350080523f0700f1f78b01f9e08f01f", - "9f59301f9c0040054f7031faa79420091350080523a03178be8e30691400740a98f040094e8bb41b9a80c0037e88b41f9L8;FF600a40f9220080528a040194611240f9810000b4601640f92200805285040194611e40f9810000b4602240f9220080528004019460620191f30b40f9fd7bc2a8BL8;FF0920", - "0091020300d042303991e82700a9e8030091090000b029511991200440a9e82701a9e8230091090000b029b11491e82702a9e34300919b840194fd7b43a9L8;FFe8230091e00309aa42018052c4840094620100d042c037914c00001408200091410100f021441e91e80300f9e8230091e00309aa6201805", - "2b9840094620100d0BBBL4;FFbc835df8fb031caa628f40f802f4ffb5b90000145f2800f1880000542800028b08f1df38c808f837e0e31591552d0094e87b45b9c8150037e8c742f98a0640f9L4;FB73657373696f6e5f76657273696f6e72656d6f74655f6964656e746974795f7075626c696373656e64", - "65725f636861696e72656365697665725f636861696e73L8;FFe0031caae10319aa2200805289c4009454ff48d3fc7340f9f9031c917749ffb54efaff1728008052e84700f9f96340f9380100b4e0031aaae10318aa22008052BL8;FFe10308aa220080528a440194e10313aae82b40f9c80000b4e02f40f", - "9e10308aa2200805283440194e10313aae10700f9c102009021c00b91c302009063a80c91L8;FF811d803d8182823c8082833ce98b01b98082c23c8112c03de8bf40f97a0200f98002803df45744a9e8ab00f9610a803d6082803c680e00f9f50000b4f30314aaBBBBL4;FF1f0400b161080154ade401941", - "f100031e1070154f9ffff17aae40194f70300aa1f0400b141fdff54e043059181008052a5e40194c0060135e85341b9e81301b9L4;FB65732073686f756c6420626520636f727265637400000000cce748000000000058000000000000003c0000000d0000007375636365737366756c206465637279L8;F", - "F10696a38ff010deb4a050091111a4092101e00133122cb9a350215aaa20000546b1d0091ef0500918c05009170feff37f000f837abfe60d3ab0000b5eb032aaaBL8;FFa01300d1a8c31fb8e4640194fd7b41a9ff830091c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd0300913", - "50840f93c5040b9f30301aaL8;FFf85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aa90640094a00100b4f50300aa7c640094e00315aa21008052f40315aaBBBL4;FF48000014e00316aae10313aae20317aaa0023fd6692240a90a01008a20696afc00a8200e0d00", - "669ecd0300b40b01008aac01c0da8c11c0da6b0d4c8b6b01088aL4;FF000400519f00006b80030054450840f940008052a120403923100012211040d30020c11a000400511f00046a01010054440440f95f0004ebe0020054c0021091L8;FF080100b4080140b20811c0da081540d2080d088b0825019108", - "fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0daBL8;FFf44f02a9fd030091150840f9080040f9f40302aaf30300aa080115cb5f0008eba8010054b40000b4680640f9e20314aa0001158b87240194a802148be0031f2aBL4;FFf44f45a9fb0b40f9f65744", - "a9f85f43a9fa6742a9fd7bc6a8c0035fd6e00316aa91190094d90640f9ecffff17fd7bbba9fa6701a9f85f02a9f65703a9f44f04a9L3;FB00004000000000000000400000000000088508000000000008850800000000000010000000000000010000000400000000a00800000000000090480000000000B", - "BBBBBBBL4;FF15c10192f50000b5808f40fc5a2300910088202e0800669e15c101f260ffff54a802c0da0811c0da560f488be80b40f9091b16cb000540a9220101d12b190094L4;FF21602791c300009063d42791a0c300d1620380524401805230000014c80080d2a0831d38a0c300d10800f0f2bf931d3", - "8a8031df89e13ff97e10300aaa1031df8L8;FFe10316aae20313aaf50300aa911e0194020000143500805268fe4ad309088052954e00a90811c0da280108cbe90080521f1d00f10831899a29008052280908aaBBL4;FF949e01943f0b00b1e0f7ff54e0430291e1830791022a80528e9e0194e83f40f91f0", - "500b16010005415050091e0220091e1430291022a8052f53f00f9859e0194L4;FFc2001036260040b988c05fb8060000b9a8c01fb8c0035fd6020100b44efc41d3260040398af05f3828686e380600003908682e38aaf01f38c0035fd61f2003d5L8;FF62008052b30f00f9d79e0094d79e0094fd7b41a9f", - "31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa810100d021f41a91BBBL4;FF6148005439feffb505000014e043059181008052acde0194a0470035e85341b9e83300b957ffdfc8770000b5a5de0194f70300aaff0600b180020054f8430591L4;FB4a0000000000", - "0000b602000009000000567461626c650000000000000000000008000000000000000800000000000000e428440000000000636c6f6e6564726fL8;FF29070054280700d1ed031caafc0309aae86305f9c801009008110f91e9032b91e8ef01f9e1430f91e8f701f9080200d008012791e3ef00f9e3031d9", - "162008052BL8;FF08008092681a00f98a15005449040014e807409180020291f507409108810991b582099163900094f43349f94083c03ce83f49f99f0600b1e04f823de8a304f9L8;FF680240f9080116cb9f0208ebc8060054680640f9e10315aae20314aa0001168b8c5e0094c802148b680a00f9f44f", - "43a9f65742a9f85f41a9fd7bc4a8c0035fd6BBBBL4;FFe183c03c28821ff835da7da920829d3ce083c13c21829a3c20829b3ce0060054610000b42200805282fe0194b80000b4e00317aae10318aa220080527dfe0194L4;ZFL8;FFe80300aae80300f9410200d021481691430200d063601791e00300916", - "201805284018052e4f2ff97e10340f9e00301aaf44f45a9f65744a9fd7b43a9ff830191BL8;FFa9831ff8240300b08460019126030090c6803291034000910601001421030090211c3691e00308aa22038052fd7b42a9ffc30091bd7e01140920009121030090L8;FFbee2ff97080040b20811c0da081540", - "d2080d088b0825019109fd46d30800098b080500911f0109eb2815005423000014f7031faaf50314aab38e4df87f0600b1BBBL4;FFfd7bc6a8c0035fd6e0c30591e1031faa220080522300805224008052f4b0ff97e0a357a97cffff17800300d00060389183be0194a00300b000601a9180be0194L4;FB2", - "f70726f746f636f6c2f7372632f6b656d2e7273002163616e6e6f7420616476616e63652070617374206072656d61696e696e67603a20c004203c3d20c0002fL8;FF42008052b7031ef8ed170094880ec0dac90100d0290d2e91a80f00f9a8058052e0630091a9233ea9a863009109018052a18300d14200", - "8052a8273fa9e0170094BL8;FF8f3e0194a00200f0006029918c3e0194a00200f000c00991893e0194fd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b08250191L8;FF1affff17c80080d2e00b00f90800f0f2080900d10bffff17e90b41b2e9a300a910ffff17c80080d20", - "800f0f2080500d104ffff17c80080d20800f0f208090091BBBBBL4;FF770a40f9680240f9080117cbbf0208eb480f0054680640f9e10316aae20315aa0001178b8b0e0294e802158b680a00f9952e40f9d5f2ffb4610a40f9680240f9L4;FF0a0180d20a00f0f228dd78924c0140b228000014eabf40f9e9", - "7742f9f97b42f9e89340f956fd60d3eaa340f93bfd60d3e9c700f93cfd78d3e97f42f958fd78d3L8;FFf30301aae10300aae0230091e2031f2aa0fbff97e90740f9e82740b9aa058052e1230091e00313aa82048052e90700f9e92f4229a8831fb8ea430039e91301b8BL8;FFe10314aae20316aaf70300a", - "a918e0194591740f9b7831ff8190400b4541340f9808e0194e00319aa210080527e8e0194a00900b4e10314aae20319aaf50300aaL8;FF02018052011116cb8a8e0094612640f9810000b4602a40f922008052858e0094680e48f875021bf81f0d00b160000054e00313aa6b88ff9748008092680200f9BB", - "BL4;FF291540d2290d098b29250191c91a498b290500912001088be1e30091f1b9ff971701003513000014e8031faa76feffb5e003088be1e30091eab9ff97b7010034L4;FBd2aaa9eaaf82d9cc0b66a28cb732b4dfebb49284000043059f581fbbd45ae8e86b075100c3eb485852d972939b2209ee06fad", - "e900044c755de945e790d0e7026L8;FF692205a9e9c340f9e8ab40f9692206a9e89740f9683a00f9e8d740f968de07a9e8df40f97ba208a9e98740f9e8af40f969a209a9e9c740f9e88b40f969a20aa9BL8;FFc90200f0296127918101c03de01b40f92043813ce1031091e8a301b9e8b341b92007c03dff", - "eb01f9e80303b928008052e8ef01f9080480520800ac72810101adL8;FF0805088be00314aa0201805201f17dd3884e0094400745addf0a00b14233c03de85345f9800705ad400743ad8233803de8bb02f9800703ad420344ad820304adBBBBL4;FF290d098b29250191c91a498b2a050091490140b22911", - "c0da291540d2290d098b292501914919498b2a050091590108abe2070054b900f8b6fa031faae0031aaaL4;FB0800000000000000d082420000000000000000000000000008000000000000000800000000000000707b420000000000617373657274696f6e206661696c6564L8;FF48008052e023003909", - "00f0f2e8270039e90300f9e0030091a5e3ff97e10300aae00301aaf44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd637008052BL8;FFe00313aae10314aa62008052df6e0194a0070037e00313aae10316aae20315aa5a033c0ad96e0194e00600353f0b00f1a8040054da06003428631b9b1c11", - "40b9L8;FF29fcff17e043169122008052a0110094e1d342f954faff17e0431691220080529b110094e1d342f93efcff17e04316912200805296110094e1d342f955fcff17BBBL4;FF871040b824008052a6431a78e85344b8848001aae103192ab1831938910140b90cf040b9f21740f9a7031ab8a59b7aa", - "96affff1799030090399308915a048052L4;FFf44f41a9fd7bc2a8c0035fd6d30100b474feff97e00313aa210080520bfeff97400100b528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8L8;FFf30302aaf60301aaf40300aaf80100d018230191d901009039e33b9120008052fb010", - "0d07f021ceb400500547546407857034079ff02156b60ffff5408ffdf88BL8;FF8c2e0194f8ffff17e057c13de15bc13de87345b9cfffff17e89340f9c80000b40805088be00313aa0201805201f17dd3802e0194e063c13de167c13db47e0853L8;FFe87f40f91f0500b180000054e803009100e1039102", - "edff97f3d34ea9940100b47522009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f9BBBBBBL4;FF88160294e00315aa21008052f40315aa3600805284160294a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad30a088052f4031faaf5ff03a9L4;FFe00317aae1", - "0318aa45020014fbdcffb5eafeff17200740adbf0600b1385b42a9e00715ade00f0054fcdf00f93c1b40f9e077c03de8e34a39e0074091a30000d0L8;FF280908aa932201a9f44f42a9f65741a9fd7bc3a8c0035fd620008052e10313aa91160194000040f9f2160114010040f9810000b4000440f922008", - "0527d160114BBL4;FF92960194400300d000c01b918f960194400300d000201c918c960194400300d000801c9189960194400300d000e01c9186960194400300d000401d9180960194L4;ZBL8;FFf30300aae00308aa91030094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd", - "46d30801098b130500917f0209eb09290054088c48f8BBBL4;FF110000145f2800f1880000542800028b08f1df38883ff837a08302d1593f0094a80356b848620037a80357f82a0340f9490108eb237400548a0340f9b58356f8L4;FB4700000000000000b30100000d0000008c1b4900000000004700000", - "000000000ce01000021000000000000000000000000000000000000000100000000000000L8;FFe00312aae08710ade81b01f99f0100148800805209008092790a00f968220039e00301aa690200f9ff074091ffc30091f44f45a9f65744a9f85f43a9fa6742a9BL8;FF948209910969213828040091f677", - "49f9e8d302f9df0600b10026005480220291401e0094080040b20811c0da081540d2080d088b0825019108fd46d30900088bL8;FF0800f0f2fb9b05f908390091e9bf03f9e8bb03f94801009008b140f91f0500f169050054e8c32c912901009029491491e85b04f9a80000d008c10d91e85f04f9BBBBL4;", - "FFfd7bc4a8c0035fd60001805201038052a0f60194000400b000e01b919cf60194ff8302d1fd7b06a9f85f07a9f65708a9f44f09a9fd83019109a04039f30300aaL4;FB696e6765727072696e74636f6e74656e74536572766572436572746966696361746563657274696669636174657369676e6174757", - "2655369676e616c4d657373L8;FFe20313aa68f9ff97c01100b5e1031faad5ffff17880240f91f0500b1810000549f5e00a99f6201a99f2600f91f0800f1810e0054e00313aa68f5ff9740010036BL8;FFc0035fd6ffc301d1fd7b05a9f33300f9fd430191f30308aae8230091414f0094e82340391f0500", - "71e1000054e84340391f0500714c04005428050035e90f41b2L8;FFe06fc13de1cf843de16bc13de0c3843de067c13de86f09f9e2c7843de1bf843de0bb843df41300f980020054e83b49f9080100b4090140b22911c0da291540d2BBBL4;FF687f00f9000442ad630b47ade87f0091696b00f909088052f", - "80303aa608705ad6437c03df40300aa638b03ad030841ade127803d77308a9a08050091641b803dL4;ZDL8;FF0104805225048052070c8052e00300ade00301ade00302adde0c009408018052bf7f3fa9bf233ea97eb6009400098052210080527cb60094e00900b4f70300aaBL8;FF21008052883601946", - "00b01b4e10318aae20314aaf60300aa8e360194f88332913c000014e8c31791e00313aa5c36019469624039a80200b008351a91ca028052L8;FFe85705f9e85f05f9e82b40f9e95b05f9e86705f9e92344a9ea4f05f9ea7f40b9fa8f05f9e89305f9e80f40f95f010071e96f05f9e8cb05f9e82f40b9e977", - "05f9BBBBBL4;FFe10314aae20315aa2300805224008052f7f8ff97e003172ae80b40f9ff0202710801148b03f8ff54d8ffff17e0230091e1031faa2300805224008052ecf8ff97L4;FF0101805288060094200100b4140000f9810000f021800391130800b91f300039f44f41a9fd7bc2a8c0035fd600018", - "0520102805297060094fd7bbea9f44f01a9L8;FF420080528b060194681a40f9a80000b4601e40f901f97fd34200805285060194682640f9a80000b4602a40f901f97fd3420080527f060194683240f9a80000b4BL8;FF88a601a9080080928182803c880200f912000014a04301d14783ff97a8835df8a0", - "83db3ca183dc3ca9035bf8881a00f908008092e18301ade00b803d808600adL8;FFe0000054e80b40f982fb7fd3410b00910005138b8f860094e80313aa08011c8bbf0600f1a8831cf8a0060054a80400b4fb0308cb33008052e11340f9e0031aaaBBBL4;FF88c60194e0031caa210080523600805285c60", - "19440feffb4e10313aae2031caae00f00f98bc60194f62f40b9c80600511f090071c20100542a008052e803162aL4;FB20c004203c3d20c0002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f62797465732dL8;FFe80700f9e80", - "b43f9eba301f9e8f200f84841092aa91246b8ea435739f5a357393b8108aae8ef42f9ea1300f9e81b00f9e8035839e8af00b986c60094e8030e91BL8;FF280800f98af3ffb4e8ffff17e10300a9e00301aae10309aa22008052f4030aaa8c050094e10340a9ea0314aa2ba040a9290040f97369283808050", - "091280800f9L8;FF4a0d0a8b4a2501914afd46d329010a8b290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b42a0140b24a11c0daBBBBL4;FFe00301aae10315aa8fe60194200080528104805294e60194e20300b042003191e00318aae10317aa87e6019", - "4e20300b042602d91e0031baaa0e60194ff4301d1L4;FB652066726f6d20c02620776974682063757272656e742073657373696f6e207374617465202862617365206b657920c0012900c0000a64656372797074656420L8;FFa20080524401805270ffff17e0230b39e0030b91ff270b39f56301f9a4dbf", - "f97e80300aa2102009021ac1b912302009063281991e86301f91d000014a0031238BL8;FF000380520101805287660194400100b4155000a9e10200f021a03491131000b91f500039f44f42a9f50b40f9fd7bc3a8c0035fd6000180520103805295660194L8;FF01f97fd3420080528a66009468a240f9a8", - "0000b460a640f901f97fd3420080528466009468ae40f9a80000b460b240f901f97fd3420080527e66009468ba40f9BBBL4;FFe0820091307f0094f70f40f97701f8b6fa031faae0031aaae10317aa92a6019436008052e8230091e0820091267f0094f70f40f9f7feffb7f80b40f9770300b4L4;FF42d86", - "578257c021b9f00056b8be4ff544200050b9f00026b2ae4ff54021040f95fcc74f2c000005442cc749242fc44d3420400d15fc024eb23e3ff547f0000f9L8;FFe10314aa98a60094f70302aaf60300aaf80301aaf40700b482a60094e00314aa2100805280a60094e10318aaf30300aa2000805273feffb4", - "285440a9f4cf00a9BL8;FF42943d91e8a700a9ea0f00f9e3430091a5260194fd7b43a9ff030191c0035fd6202040a9810200b021f83d91030d40f9a2068052fd7b43a9ff03019160001fd6L8;FFc0035fd620008052e10313aa96260094ff8300d1fd7b01a9fd430091e80301aae00700f9c10000d021001", - "891c40000d084801791e3230091e00308aa62028052BBBBBBBL4;FFc0035fd600018052e8fe43d31500188bf60600d1ff2600f1e00315aae11f805209f17dd3e20314aa280108cbd732889a7e1a0294755a00a9777e01a9f44f43a9L4;FFff030491c0035fd6a00000f000e02c919f1a0094ff0303d1fd7b", - "09a9f6570aa9f44f0ba9fd43029109504039a9050037011040b9155840a9f30300aae0a30091L8;FFfd7bbfa9fd030091630200f063202191e0031faaa51a0194ff8301d1fd7b01a9f91300f9f85f03a9f65704a9f44f05a9fd430091160440f9760200b4335040a9BBL4;FFf44f45a9f65744a9f85f43a9", - "fa6742a9fc6f41a9fd7bc6a8c0035fd6400300f000801891430300d063002391440300f084e01891a24700d1010380528d9a0194L4;ZFL8;FFa401009084a00b91e0030091a363009162008052a80f00f9d39a0094810100b021841a91a401009084401991a363009162008052b30f00f9cb9a0094686200", - "91BBBL4;FFf80f40f9f8feffb7fb0b40f9580800b4f90314aaf4031c2a82da0194e00318aa210080523c0080527fda0194c0fdffb4e1031baae20318aae00300f985da0194L4;FB080000000000000038db440000000000f8da4400000000002f72757374632f34386132323963656165666434393835633", - "5303939306231343131366236643835L8;FF2c000014ed634ba928a00791fa3f11a90001c03de0030aaaf1fb12a9f63f40f9b1008052fe6740f9ef6f40f9e10310aae80740f9e9bf00f9e90317aae3e700f9BL8;FF291540d2290d098b292501910819498b08050091e98792b969010034290140b22911c0", - "da291540d2290d098b2925019129fd46d32905009104000014f4031faaL8;FF36008052e92347a9e0dbc23de1dfc23dea5740b9fc7b06f900838b3ce0e3c23de85306f9e95706f9e85b06f9e92346a901838c3ce1e7c23d00838d3ce0d3c23dBBBBL4;FFa4fa0194000400d000001791a0fa0194ff8302d1", - "fd7b06a9f85f07a9f65708a9f44f09a9fd83019109a04039f30300aaf40308aaa90100343f0d0071c1070054L4;FB69642028c0232920666f756e642077697468206120646966666572656e74207075626c6963206b65790076656e646f722f6c69627369676e616c2f727573742fL8;FFe20313aafb2700", - "f9f70b00f9bc020094e08742adf50300aae21fc03df4b300f9e08709ade08740ade257803de08707ade08b41ade08b08ade02400b4e19740f9BL8;FF8c7a019408008092681a00f9f44f41a9fd7bc2a8c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aa010300b021602191e8230091", - "e00309aaL8;FF80820091937a0094e95b40f9e067c03de8d340f9f71b00f93f0d00b1e083833ce82700f94101005428008052ff0600f17f7e01a97f2200a9687e02a908008092BBBL4;FF02028052313f0094a8a77da9ea031faaabb37ba9f04340f9e20f49a9a543573828e108aa0102168ba4c356f8a9b", - "77aa9af5356f80c010ccafa2f40b9e12700f9L4;ZBL8;FF620080526901088b08010291200502ad200b43ad200903ad210340ad210100ad220341adfc2301f9220101adc90100b029812d91e97302f9e9030991ea7702f9BL8;FF080c48f81f0500b1c1fdff54f40314abe2020054688e4bf81f0500b1400", - "20054e00313aa52010094080040b20811c0da081540d2080d088b0825019109fd46d3L8;FFe80342f9f40f42f9e95700f9e90b42f9757e42f9e86b00f9080340f9e94b00f9680000b4e00315aa00013fd6010740f9810000b4020b40f9e00315aa7d3a0094BBBBBL4;FF01300591e003022ae20303aabef4", - "ff97203500b4210400b021a01f91230400b063601d91e00700f90b00001401e00191e003022ae20303aaa4f3ff97c03300b4L4;FFfd7bc3a8c0035fd61fcc00a91f0000f9f44f42a9f65741a9fd7bc3a8c0035fd6d3d200a929008052c90200f9f44f42a9f65741a9fd7bc3a8c0035fd6ffc301d1L8;FFe0", - "030091c80a0194fd7b42a9f31b40f9ff030191c0035fd6281040b9000040f96800c8376800d037a20a0114d30a0114d30a0114281040b9000040f96800c837BL8;FF380080399800f8b728040091490400d1110000145f2800f1880000542800028b08f1df38680bf837a0e300d155f3ff97a8835cb8480d", - "0037a8835df86a0340f9L8;FFe5c340b90801150a097c890ae79b56294a7c8a0a6b7c8b0a2e180753efc3971a8c7c8c0aad7c8d0a08010f4a301c08532f200953f9fb55290801094ace7c8e0aBBBL4;FF19ffff17a0c300d1e1031aaa220080522300805224008052f5bcff97b7035ef82fffff17a0c300d", - "1e10317aae20313aa2300805224008052edbcff97b7035ef8L4;FB000000000000000008000000000000000800000000000000dc06460000000000000000000000000008000000000000000800000000000000ac07460000000000L8;FF68234239695b40f9f4031c91e0cb813d6093c83ce8231c39684f4", - "0f9e10f00f9e1031c91e99b03f92093803cf9831d91e88f03f9981c0094e8b343f91f0900f1BL8;FF68ba40f9e80000b460be40f901f97fd342008052f30b40f9fd7bc2a8854a0114f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9L8;FF0800098b080500911f0109eb28", - "170054e4000014080c43f81f0900b1010b0054f3031faa64000014e80300aa098d40f83f0500b180160054f30300aae00308aaBBBBL4;FFe08716ade0074eade2bf803df57f41f9f77b41f9e08714ade00b4fadf4bf4a39e08b15ade1034cad2003148b821a40d2981a40d2e18312ade00b4dade08b13adL", - "4;FB08000000000000000800000000000000308242000000000000000000000000000800000000000000080000000000000038824200000000000000000000000000L8;FF080b0054680640f9e10314aae20315aa0001168b8fea0094c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd", - "6e00313aa2200805223008052BL8;FF1f01186bc00100543f5000f1a00200543f2000f180f6ff543f1000f161050054080040b9690a8e52294eae721f01096be8031baaa0f6ff5424000014210800d1L8;FFc0035fd6ebab59a93f050071e89741b92083c13cec030b918033803da10900548031c03de8c3", - "02b98b4100f8204b803d8ac100f8204bc03de8d342b9490100d0BBBL4;FFf703062ae05700b9f40305aaf80308aaa96f48a9e92f00f9a93f40f9e91f00f9a93b40f9e91b00f9b94f46a9030400b4e0a30191e10303aae20304aacdfeff97L4;FF09000014bfbd03716d958b9a8d010d8bac010ccb290500f", - "19401148bec030daa600100549f010aeb20010054ed030caaae15c038eefeff36cd1d0012bf810371L8;FFa02a40f9220080528aaa0094a13240f9810000b4a03640f92200805285aa0094a13e40f9810000b4a04240f92200805280aa0094a14a40f9810000b4a04e40f9BL8;FFf63f42f92083c13ceae3", - "2291e9d742f9f5c742f9f7cb42f9c80240f9f43b42f940818f3ce9e304f9680000b4e00314aa00013fd6c10640f9810000b4c20a40f9L8;FFff0316b9bf290094e86b40b9e0032791e1833f91f9e33f39e8833f39e8a74b29f6e73f39faeb3f39e9873f39e88b3f39e8a74a29f7ef3f39fbf33f39e98f3f3", - "9BBBBBBL4;FF0800f0f2aaffff17e90b41b2e92300a9a8ffff17880080d20800f0f2080140b2a3ffff17880080d20800f0f2081100919fffff17e00300f9210400f021e02291L4;FF4dc4ff97e0cb00b9a04700d14ac4ff97e0c700b9a04700d147c4ff97e0c300b9a04700d144c4ff97e0bf00b9a04700d", - "141c4ff97e0bb00b9a04700d13ec4ff97L8;FFbf25007129c100110b819f1adf7d02710934003949c100110a819f1a0938003969010d0b4a114e0b29c10011cb0d00122c244039093c003949c100117f250071BBL4;FFff030cd1f50300aaf30308aa85920194001880522100805283920194e02c00b4e0e", - "7076f08188052f40300aae88300a908048052a1020291e80f00f9e8830091L4;ZDL8;FF42018052d7920094610100f021101591840100d084a00e91e0030091a363009142008052b30f00f9cf92009468020291610100f021181591840100d084200a91BBBL4;FF608740a9a84302d12fac0094a80357381", - "f05007120feff54483340b8490340b9ab4302d16a8141f8ac0240b2a00240b2a8b316b868014238610140b2a98316b8L4;FB1deea1c853ad7f83699431c20f2a95e6d8806c4036201b100880044088ec0b924f25a29a514dadae53dface7d673eb39f094784a3c259e124f09a28cd01d49fbL8;FFe0c743f", - "9f2cb43f9eecf43f9e8bf00f9e8bf43f9efd343f9ead743f9e2df43f9e4e343f9e8ff00f9e8db43f9faeb43f9f7ef43f9e1f343f9fef743f9e8a71aa9BL8;FF55fcff17e04316912200805291110094e1d342f960fcff17e0431691220080528c110094e1d342f976fcff17e04316912200805287110094e", - "1d342f981fcff17L8;FFe8ff42f9e90343f9000100f0002030912301009063a00791040100f084e03091e2032d91c1058052e8a305f9e9a705f990520094e85746f9e95b46f9000100f0BBBBL4;FF087d40393f010071afb31cf8aa831bf86901891aaa835cf88b4640f93ffd0371a8031c38280080529f4", - "600f99fa207a9090500540804009008b11d9109fd78d3L4;FB000000000000000000000000000000000100000000000000a0ad420000000000556e6964656e74696669656444656c69766572795365616c65642053656e6465L8;FFe8270039e90300f9dfffff17e00300f9210200f021681b91230200f06", - "3a01b91e0030091c2018052640080521a000014e00300f9210200f021681b91230200f0BL8;FFa99315384901084aaac35538a9a315386901084aabd35538a9b315384901084aaae35538a9c315386901084aabf35538a9d315384901084aaa035638a9e31538L8;FF80620391e143169166130094e8bb49", - "f91f0500b100bdff5481420491f0010014e1d342f9e8cb42f91f0101eb807d0054e8cf42f949048052f407409194820991BBBL4;FFa86303d1a26301d101a10191be9cff9720e6ffb448000014bc035cf83f0b00f180010054a80354f8480100b4a98354f8e03f00f9f90301aae10308aa22008052L4;ZBL", - "8;FF280080522a0000147c0000b50b000014fb0600b48aa240a93c008052890240f91f0109ebe933899a080109cb090e80520829099b1f0900f99f031bebc2040054BL8;FFe85306f911000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f9a3270094e80300aae85306f9e0833291a10200", - "9021600d91a2018052a3020090L8;FF48fdfff008e13591e86703f948008052e86305f9e800009008a13e91e86705f9e84f05f9e8000090088d2691e85b05f908078052e97305f9e9831a91e85f05f9BBBBBL4;FF208d212e00a8302e0800261ec80300376b21009180030b8b1c00198a496b7cfc208d282", - "e0800669e0cc101f201fbff54f4ffff17610a40f9e08200d167dc0094L4;FF68577ea9e82700f986020094e0031caa2100805284020094001500b4e12340f9e2031caaf60300aa8a020094a0a300d1e1031caa220080522300805224008052L8;FF8c020194611a40f9c10000b4601e40f922008052f30b4", - "0f9fd7bc2a885020114f30b40f9fd7bc2a8c0035fd6210400b4fd7bbea9f44f01a9fd030091f30301aaBL8;FFe323009182008052e80700f9cb820194fd7b41a9ff830091c0035fd6080040f9e00301aa090140f93f0900b1a1000054010300f02170299182008052bb820114L8;FF881e00f9820241ade2", - "0301adbc820094882648298a2e49299682003980a20191e10300910809c05a2909c05a9f9202f8882600294809c05a6b09c05a892a4a29BBBL4;FF89c2019400feffb4e10317aae20314aaf50300aa8fc20194e00317aae10314aa2200805283c20194190000140a0180d2e9031faa0a00f0f203000014e9", - "031faaL4;FB1ceb4700000000002ceb4700000000002ceb4700000000002ceb470000000000c07849000000000000000000000000006d697373696e672073656e6465722063L8;FFa8031df8e8431091a103963c00a101918283813ca2877eada98318f8a08b3cada1833dad46180094a20f7cade84f42f9", - "a1037badf43b02f9e83b00f9480080d2BL8;FFc0035fd6e8031faab60a40f976f4ffb5b41640f9e803088b54f5ffb5e00308ab23f6ff54c00200900060259184420194e00313aa2200805286010094610a40f9L8;FFf8430691fb0c8092e02340f9080d8052826f089b0080c23c1a0040f901a00191e00a8", - "03d0080c33ce00e803d0080c43ce012803d0080c53ce016803d0080c03cBBBBL4;FFd70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb03c700541803008bf9feffb50f000014L4;FB4e00000000000000f9040000190000007fea480", - "0000000004e0000000000000001050000140000004d6573736167654c656e6774684576656e4d657373616765L8;FF038948ade037823de13b823d008547ade22f823de32b823d038946ade023823de127823d008545ade31b823de21f823d0201ca3ce117823d010d44ade013823dBL8;FF84803d91e003", - "0091a363009122028052b30f00f9d462019468c20091c10200f021401891e40200d084003e91a363009102018052a80f00f9cb62019468e20091L8;FFe0030aaa26000014e10300a9e00301aae10308aa22008052f4030caa9c050094e10340a9ec0314aa2ba040a9290040f90afc78d3736928380805009", - "1280800f9BBBL4;FFf50308aa87a2019400c480522100805285a20194400800b4e106009102c48052f30300aa8ba20194540500b4ca024039e80315aa5f2100f1210500549f8631f1L4;FFfafeff1701d05f38a6081b53e9ffff17600240f9600000b43f000039007d20d4f72a0091c17a77f8610100b400", - "008052610600f9210040f9610200f9330400f9L8;FF810100f021fc159182008052c7a20014080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091810100f0210c1691a40100d084002691BL8;FF800200b0008011918d220194800200b0004012918a220194ff8301d1fd7b03a", - "9f52300f9f44f05a9fdc30091e90300aae10700f9220d41f83f0002eb81010054BL4;FFe1feffb4c00240f92200805289220094f3ffff17687a40f9c80000b40805088be00314aa0201805201ed7cd381220094745652a9350200b49682009104000014L3;ZBBBBBBBBBBL4;FFa90f00b5699284d208f17d", - "d32949b2f28924c9f24992e4f2097dc99b080109cb2805488b0900809208fd42d3080500d10811c0da2825c89ae9ef7fb21f0109ebL4;FF0a050091206928382a0800f9f44f42a9fd7b41a9ffc30091c0035fd6f30300aae00301aaf40301aae10309aa22008052230080522400805263000094880a40f9L", - "8;FFf30301aaf50300aac80100370181009120008052f41f01940007f8b7a00640ad800600adb30100b593ce00a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6BBL4;FFfc0740f9879f0194e00316aa21008052859f0194c0dcffb520008052e10316aa919f0194ea9740b9eb4f40f907000014ea974", - "0b9eb4f40f9f8031aaafa0b40f9L4;FFe10313aa5f0015eb4290959ae9000094e00313aa37f9ff97f76343a9f96b44a9e00314aaf35341a9f55b42a9fd7bc5a8c0035fd6e1141a123f003f7161efff54L8;FFfd7b01a9f31300f9fd430091130040f9e00301aa810100d021901791e8030091e2018052cf9", - "f0094810100d021101591a40100b084a00e91e0030091a3630091BBBL4;FF390300eb636800541803008b060000141f0400b1e1670054a9df01941f1000316167005439feffb505000014e043059181008052a4df0194a0660035e85341b9L4;FB0000000000000000000000000000000001000000000000", - "003c2844000000000063616c6c65642060526573756c743a3a756e77726170282960206f6e20616e20L8;FFe10308aa220080528adf0094e10313aa28f840f9e80000b420fc40f9f30301aae10308aa2200805282df0094e10313aa20200091f30301aae4d8ff9760420891BL8;FFe10317aae2031caaf50", - "300aa915f0194eaffff17f75b4429eaef40a9f41740f9fa1f40b90a00001428008052a8633fa93c3340f9bcf7ffb528008052a87f3ea9L8;FFa3020094760a40f9680240f9080116cb9f0208ebe9f8ff54e00313aae10316aae20314aa9a020094760a40f9c1ffff17fd7bbda9f50b00f9f44f02a9fd0300", - "91BBBBL4;FF220080528bff0194b80000b4e00317aae10318aa2200805286ff0194d50500b4e00316aae10315aa2200805281ff0194290000144d69ec382d07f836e083c13cL4;FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "5450001400000000000000006a4f0014L8;FF0805009120008052290040f9280800f983ffff17e00301aaf30301aae10309aa220080522300805224008052f4030aaa5f1500946ca240a9ea0314aae10313aaBL8;FF281040b9000040f96800c8376800d037c77f0114c77f0114c77f0114281040b900004", - "0f96800c8376800d037a07f0114997f0114ce7f0114281040b9000040f9L8;FFe81700f9201f005480220291e9edff97080040b20811c0da081540d2080d088b0825019108fd46d30900088b37050091ff0208ebc81d005420010014e11740f9BBBL4;FF88bf0194000480522100805286bf0194000500b4", - "e87e105309ff68d3190000b9144000f80838003908ff60d309280079084c0039287d1053e91340f917180079L4;FBaf7b4900000000004e000000000000005807000005000000e17d49000000000029000000000000004e0100002d0000005a7b4900000000005400000000000000L8;FF748643a9f60302", - "aaf50300aae20318aae00314aafebf0094e81f80521f01206a4004005488018052e10240f9a822003908008092a80200f9810000b4e00318aaBL8;FFfc0300aa933f0194542340f9b4031df8b40100b58200001436008052571740f917fcffb538008052482740f91f0500b121fdff5419008092542340f9", - "b4031df8L8;FFfd830291081c00121f090071e1010054e00302aaf30302aaf40301aa62ffff97e80300aae00301aa08020037680240f9080540f9150100eb62020054e80f41b2BBBBBL4;FFf65704a9f44f05a9fd03009148008052f40301aae10302aa000d002af30302aaf0faff97e00314aa47890094e", - "10313aaecfaff97950a40f9550300b4610a40f9L4;FFf60301aae8830891e043139101810091a44700d1e20319aae30316aa9ae9ff97e8d344b908540037e86f42f9f87342f9e8c700f9b60000b4e00319aae10316aaL8;FFed7301b8e96f0039ea1f00b9e9830039eb9302b8e8b70039c40f0194fd7b44a", - "9f32b40f9ff830191c0035fd6ff8301d1fd7b04a9f32b00f9fd030191f30301aaBL8;FF21602991e823009182008052c48f01944203009042002091e023009161820091c08f0194c08f0194fd7b42a9f31b40f9ff030191c0035fd6210300d021502991L8;FFf44f03a9fd830091e90301aaf30300aa6101", - "00d021381d91e8230091e00309aa22028052cf8f0094940100b094a20b9168620091610100d0217c1d91e0230091BBBL4;FFe00315aa210080523600805286cf0194e0feffb4f58303a9ff2700f93a3e00b40803138b540480525c028052f50318aaf9e300a9e80f00f90c000014e82340f9L4;FB6e900a6", - "46b4e883267f4f0d8141283035e3c0e7dc2729373a237a28c3d71c72d2f6007340000af1ffc3dda06237d14b52c23a274b7ec20cdc1e561f35001414aL8;FFe0030baaeb0303aaf00308aae8030eaaee031caaf9030baaed0304aafc4340f9e083803df8c741a9e74b44a9f6134ba9e30311aaf1031eaafe", - "1b40f9eb0312aaBL8;FFf44f45a9f52340f9fd7b43a9ff830191c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0316d1f30300aae8430691e00301aaL8;FFa1825ff881ffffb4a00240f922008052884f0094f8ffff17e88b40f908d7ffb40805088be00313aa0201805", - "201f17dd3804f0094b2feff17f63f42f92083c13cBBBBL4;FFf52b40f9fd7b44a9ffc3019189ef0114bf0a00b16301005428008052e90300f0296d2691680a00b948038052692201a908008092680200f901feffb5c9ffff17L4;FBfe924800000000004c000000000000009b09000009000000fe9248000", - "00000004c000000000000009f09000009000000fe924800000000004c00000000000000L8;FF64018052f1ffff17c90080d2e8230039480080520900f0f2e8270039e90300f9dfffff17e80f41b2dcffff17e00300f9210200d021441591230200d0633c1691BL8;FFdf6f0114ff8301d1fd7b04a9f32b00", - "f9fd030191f30308aae82300912a490094e82340391f050071a1010054e94340393f0500716c0400540b0180d2ea474039L8;FF1f0101eb40370054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9450c0094fad342f9e8cb42f908011acb1f0308eb48360054e8cf42f9BBBL4;FF2", - "a158052ff2703a9690300b029150a91e82b08a96a06805228048052e92b05a9290080d2e87f04a9692bc0f215000014e80300d008b140f9c80200b428008052L4;FFe83300911f69213821488052e0330091c23680520101a0729a070094e000f83674070094080040b91f110071e0feff54200080521d00", - "0014f503002af8031faaL8;FFe8fedf882802003528e340391f050071c1feff54e2031f2a5c08009408fc78d309fc60d3087b68782821084a095d1053095b69782001084a9c0700f11400144aBL8;FF940200b47522009104000014940600f1b5620091e0010054a1825ff881ffffb4a00240f9220080528", - "22f0194f8ffff17e027c13de8a344b9b47e0853e137c13dL8;FFe803019115e3009116630191a0a301d1f30303aabf0317f8b5db39a9b9831af8ba031bb8952f0094e22340f9821500b5e0030191f55b04a9f92b00f9b94302d1BBBBBBL4;FF8c170214f44f41a9fd7bc2a8c0035fd6fd7bbea9f30b00f9f", - "d030091010040f9f30300aa3f0400f18b000054600640f9220080527f170294610e40f93f0400f1L4;FF4ac9ff97e9bf5339e84353390a088052e00740912a15003308111d1200401d91e8431339e8431391eabf1339e037c13de13bc13de0d7853de1db853d79edfe97L8;FF01038052a3170194090440a", - "9020041a9230540f960001fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aa610200d021402391e8030091e00309aaBBL4;FFc4018052210000144103009021c824914303009063e42491a0031df818000014a0031df84103009021c824914303009063182691a0c300d1e2008052e4038052", - "L4;ZBL8;FF0a1440f9092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b250191BBBL4;FF08008012680200b93000001448008052680200b92d000014e81343b8e93740b9c40300b084e03991f9e343a9a8831f", - "b8e8434139e0031faaa9b31fb8e92740f9L4;FB9cff450000000000000000000000000008000000000000000800000000000000840b46000000000090194900000000004d00000000000000e802000005000000L8;FFe80342f9ea0b42f9edcb42f9e9231fa9e80f42f9e90742f9e8cf00f9e81742f9e8c3", - "00f9e81b42f9e8ab00f9e81f42f9e92312a9e82342f9e92742f9e8ab1aa9BL8;FF81ffffb4c00240f92200805289570194f8ffff17f37749f97f0600b140020054e18349f93f0400b140010054810000b4e08749f9220080527e570194e18f49f9L8;FFc80080d2e0a33239e08332910800f0f2ffa73239e", - "85306f9a54cff97e10300aae15306f9e0833291210100902120379102028052230100906360379104028052BBBBL4;FFc18201ade083c03ce183c13ce85b00f9e80240f9e01b803de18b03ad680000b4e00315aa00013fd6e10640f9810000b4e20a40f9e00315aa7ef70194c18a41adL4;FB08000000000", - "000000800000000000000dc8442000000000073656e64657220636572746966696361746520636f6e7461696e6564207365727665722063657274L8;FF9f7e01a9997e02a99f3200b9e003082ae10314aae20313aa63faff97a00f00b520fcffb4d6ffff17898243f83f0900b161000054971e00f99f3600", - "f91f0900f1BL8;FF680200f96082803c6182813c6282823cdc0000b4b90000b4e0031caae10319aa2200805283770194ba0000b4e03340f9e1031aaa220080527e770194b70000b4L8;FFe06f813de173813d018141ade807409108810991e06b813de167813d59c1ff97e83349f94083c03ce93f49f91f0", - "500b1e01b843de93b08f9e0110054e0abc43dBBBL4;FF010140ad080b40f9c85601a9eaa34329c182833c0103c03dc082843cc102803dc92a0b29c8820139ab000054e0031aaae10313aa220080527eb701949b0100b4L4;ZDL8;FFe023009104018052050e805229f87fd33f1100f13481889ae30314aa7", - "4000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191BL8;FFe1830b9120013fd6f4fb42f99f0e00b12102005468008052f46f41f9f36b41f9e8230b3949008092880240f9690300f9680000b4e00313aa00013fd6810640f9L8;FF41050054e8f347b9a01ec13de9c324", - "91e00000b0008c2891e1831a91e84709b9e8c32491e3830f912041803c2900009029212c91e85303f9e80000b008a13e91BBBBBL4;FF5a0700915f0f00f1e00f00540807805221048052554f089be8030491e00315aa144440b880dd0094e80344391f05007140100054600740ade8030491a08642a9L4;F", - "F71e8ff97e10313aaf35341a9cdffff17800000d00080289189070094fd7bbea9f44f01a9fd030091f30301aaf40300aa7c07009400038052010180527a070094L8;FF490200f029610d912001c03d0001803dc0035fd6490200f029a10d912001c03d0001803dc0035fd6ff0302d1fd7b07a9fdc301916a", - "2440a9681040f90b3140a9BL8;FF220080528b870194749600f97f4600f9f44f42a9f50b40f9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091f30308aae55e0094f40301aaa100f8b6L8;FFe00309aac2008052d6870094682201916101009021881591640100f084a00a91e0030091a363009", - "1a2008052a80f00f9cd8700946862009161010090219c1591BBBL4;FF68008052e03340f9e12b40f9fa030691bf0e0071a832881a3f01007208119f1ae84f00b9e803069153130094882b50a96083c13c6183c23c8b8b40f91f0500b1L4;FB7373696f6e20666f7220726563697069656e743a20c0392c20", - "286e6f2063757272656e742073657373696f6e207374617465292c206e756d626572206f662070L8;FFe48715ade107c23df4bb43f9edbf43f9f9c343f9fec743f9eecf43f9f2d343f9f1d743f9e0db43f9e3e35e39e7f343f9e4e343f9e5e743f9f5435f39fc7300f9BL8;FF61710c8b0b0180521400001", - "48d7d1c53ad0600340d00be528d010d0b4c2180396b710d8b8c00f8b761e10c8b2b0180520a0000144d254039bf0500f1c8010054L8;FF29fd46d3290500910a0840f94a0400b40b0440f9ed031faaec030aaa6b4100916e8541f8cf0140b2ce010d8bef11c0daef1540d2ef0d0f8bef250191ce194f8bBB", - "BBL4;FFe00308aa0005c03d0a657da91a8c5cf801c10091e92300f917257fa9eb3300f9e9db06a90b2540a9b60302d1c002803de91f00f9092940b9151140f9ebab04a9L4;FB96e04800000000000000d1009300a7008a00e400eb00bd000a029100f4010000ef015601b30120010b021b02ce0146023b01", - "3602bb0000007b0000003c00c800L8;FFdb000014a80a00d1f46701f905000014e80b41b2e06701f902000014a80600d1e0030b91e86301f9a1dcff97f40300aab4000014f55356a9e0030091c1420091BL8;FFf44f42a9f65741a9fd7bc3a8c0035fd6ca0080d2090900b90a00f0f20a0100f9f44f42a9f", - "65741a9fd7bc3a8c0035fd620008052e10313aa96670194ff0301d1L8;FF606a68f822008052f44f41a9fd7bc2a888670014610a40f9e10000b408018052606a68f822008052f44f41a9fd7bc2a880670014f44f41a9fd7bc2a8c0035fd6BBBL4;FF4a1d409208010aaa692200a9fd7b44a9f32b40f9ff83", - "0191c0035fd6ff8303d1fd7b0aa9f75b00f9f6570ca9f44f0da9fd830291f30308aa28008052f4e30091L4;FF030000143406009440fcff34e00314aaf35341a9fd7bc3a8c0035fd6f51340f9e20313aae00314aa01008052f35341a9fd7bc3a8430900142e01001410050014L8;FFf403022a6b000094f5", - "03002ae003132ae103142a67000094e103002ae003152af44f43a9f51340f9fd7b41a9ff030191c0035fd6fd7bbba9fc0b00f9f85f02a9BL8;FF08004039097c40390a088052e013803ce0030091e1f3803c200440ad08111d122a150033a18300d1e8030039e8030191ea7f0039a0073fade6270194e007", - "42adL8;FFc0035fd6ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191350840f9fa0301aaf30300aa750500b4540740f97a270094e00315aaBBBBBBBL4;FFe00313aa03048052da76009414008092e00314aaf44f49a9f65748a9f85f47a9fa6746a9fc6f45a9fd7b44a9ff8", - "30291c0035fd6e92340a9795200a9280108cbL4;FFc0035fd6a00000f000c02b91a01b0094ff0306d1fd7b12a9fc6f13a9fa6714a9f85f15a9f65716a9f44f17a9fd83049109304039890d0037010840b9f30300aaL8;FFc0035fd6fd7bbda9f65701a9f44f02a9fd030091160040f9f30301aa20008052f", - "40302aaf50308aac1820091ee1b01942001f8b7680200f008212091b45a01a9BBL4;FFe87a40394a010b4aeb7340b9ea720039ea7e403929010b4aeb7f40b9e9760039e982403908010b4ae87a0039e82f51294a010b4a2801084aea7e0039e8820039L4;ZFL8;FF63ffff54800100b000a013918c9b0094", - "800100b000202091899b0094a001009000601691869b0094fd7bbda9f50b00f9f44f02a9fd03009108d040a9f30300aaBBBL4;FF082d00b12935899ae84b0af9e94f0af992db0194280c8052237bc13d2077c13d08ff013928835839a08302d1e3ff843de313c53de1430591088301392173c13dL4;FB080", - "00000000000002c5e44000000000054564400000000009014490000000000b464440000000000c064440000000000a464440000000000b464440000000000L8;FFe9cf40f9edeb40f91f0900f1a9060054a80100f008110f91e97740f9e8ef01f9080200b008012791e9eb01f929038052e1430f91e8a303", - "f962008052e8ab03f9BL8;FFe0abc43de1a7c43deac33391e2a3c43de95b49f94081883ce01bc43d4181873c4281863cea3b48f9e9c706f9e25fc33de35bc33de163c33deaab06f9e053833dL8;FFe983029120e10291f47312a9f53301b9e85701b98f5b009448008052e9f31691ea7340f9e8f31639e8c", - "31691eb7b40f9e9e302f9e99f40f9e8eb02f908018052BBBBL4;FFa80d010efa5b47a97f0700b1ec031faaea031faa3901949a110a8052f72700f914000e8a096a74fc208d282e0800669e1cc101f240050054380b40f9e9cf03a9L4;FB735f6d75742e7273002f636172676f2d72656769737472792f696", - "e6465782e6372617465732e696f2d313934396366386336623562353537662f696e6465786dL8;FFe20313aa1f0b0094f50300aadd010014e1430091e20313aaf70b00f9f73f00f9970a0094e08743adf50300aae227c03df4c300f9e0870aade08741ade25f803dBL8;FFf44f43a9f65742a9f85f41a9fd", - "7bc4a8887b0114000300f000201491887b019420008052e10313aa8f7b0194ff0302d1fd7b06a9f44f07a9fd830191e8830091L8;FFe20316aa23008052240080526891ff97f81740f9e80f40f9080118cbdf0208eba9bcff54e0630091e10318aae20316aa23008052240080525d91ff97f81740f9BBBL4", - ";FF68731d536a92845209311d12297d0a1b297d10530801094b08391f122805480b09008092087d0253080500d10811c0da2825c89a1405009198f27dd399220091L4;ZBL8;FF808610ad828e803df46742f9f67342f9e84702f908140094b60000b4e00317aae10316aa2200805282bb0094b40000b4e00", - "315aae10314aa220080527dbb0094BL8;FF09fd46d30800098b080500911f0109eba808005450000014f3031faa080c47f81f0500b1c1dcff54e8031faa080113abe3070054a00200d000203291803b0194L8;FF34190091fc432a91ac030014fb6300f9287c013569620e9168ca13916c4e42f9e9a309a9", - "68420e91694a42f9e85b00f96e5242f9775642f9761642f9781a42f9BBBBBL4;FFfbfdff97770a40f9680240f9080117cbbf0208eba9cbff54e00313aae10317aae20315aa2300805224008052f0fdff97770a40f955feff17e00313aa22008052L4;FFb70000b4e00316aae10317aa22008052880b0094a", - "0c300d1e103152a54030094b5937da9810000f021483591a04301d122028052e30315aa04030094a14301d1L8;FFfd7bc4a8c0035fd6e00313aaf50304aaf70303aaf60302aaf80301aa06000094e10318aae20316aae30317aae40315aaebffff17fd7bbfa9fd030091010040f9BL8;FF3f08007100fbff", - "543f040071c1000054e1c30091a2630091ac74ff97c0faffb48e000014a2630091830c80529271ff9720faffb44e000014a0630091028c0094L8;FF888b0094e00313aa01018052868b0094e83340f9e10313aaf50300aa00018052e80f00f9154400b5950200147d8b0094000f8052010180527b8b00948", - "05b00b4BBBL4;FF7f0308eba81b00541b0100b4a8835df8e10340f9e2031baa0001178b8dcb0194f7021b8bb7031ef85f0317ebe01c0054a8835df809058052ea060091a1c300d1L4;FB25194900000000006a000000000000005e0100002e00000025194900000000006a000000000000006e0000002e00", - "00004d657373616765206c656e677468206dL8;FFe9bb01f9e93f44f9fa5f44f9e8f200f8e85b44f9ec6344f9e9a301f9e95344f9e16744f9e85300f9e86b44f9fc6f44f9ea7202f8ea035e39f07744f9e8270ea9BL8;FFc0035fd6fd7bbda9f65701a9f44f02a9fd03009114d440a9f30300aaf50300b49", - "6e2009104000014b50600f1d6c2019140030054c1825cf83f0400b140010054L8;FFe3230091e00308aa62028052cb4b0094fd7b41a9ff830091c0035fd6fd7bbfa9fd030091082440f9080100b4080140b20811c0da081540d2080d088b08250191BBBBL4;FFe2f0ff54e8430291e10317aae20318aa000", - "1158b8feb0194a802180be83f0439f503082a08108052020115cb740302eb82f4ff54e8430291e1031aaae2031baaL4;FB0800000000000000a84b420000000000000000000000000008000000000000000800000000000000204c42000000000000000000000000000800000000000000L8;FF610a40f96", - "80240f91f0101eb000a0054680640f9090180522a0400916a0a00f909692138e10313aafdeaff97e00314aa080c43f81f0500b160000054e10313aaBL8;FF03000014e8031faa692300914a1d4092f71740f908010aaa69a200a908008092680200f976f6ffb5b9ffff1720008052e10314aa976b0194ffc", - "300d1fd7b01a9L8;FFdcffff17280180d20800f0f2081100d1d7ffff173f00156b81f7ff54680240f9e0031faa090540f90a0140f9290100cb4a01008be0031faa0a2500a9f44f45a9BBBL4;FF2100805288ab0194600200b4a8624039e10340ad1600003908440039886240390110803c088c0039880480", - "52174800390030813c680200a9680a00f9f44f47a9L4;FF9f010e6a0d40c4d26f11889abf0120eaed014db2ab018b9a9f010e6a6d11889a1f0056f2ad014cb26b018d9a8c010e6a0ee479d30d7c1f536811889a3f010072L8;FFfc6f49a9fd7b48a9ff830391c0035fd620008052e10315aa93ab00940001", - "80520130805290ab0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9BL8;FF08e10c9120f18f3c2083c63ce9270b9122f18f3ce9670b9120f18f3cc082c73ce9a344f9fbbf01f9f5c301f9f7c701f90001803de9d301f9e0234ea9e3031f2aL8;FF9d020014090180d20900f0f23a017fb2e", - "91f4092fb0309aaa1035df8415200b595020014a8035df808011acb1f0308eb886f0054980200b4a8835df8e10319aaBBBBBBL4;FFe10313aaefffff17ff0301d1fd7b03a9fdc30091080440f9c80100b4090040f90c0500d1ea0309aa4b1540380a3000a961194092ab003837e0031faafd7b43a9L4;FFe", - "9b700f9f9090094ec6b42f9ea6f42f9fb7342f9e2eb44b99f0900b1010b0054e87b42f9e2c700f9a30000b063183991f77f42f9e0431391e1031aaae2031caaL8;FFf30303aac10100b4e00302aa22008052e30313aaa2130194000300b50e00001428008052090180529f6a29f8880200f9f44f41a9fd7b", - "c2a8c0035fd6d30100b4BBL4;FFe8030191a3831af8aa831df8b8930194740a40f9680240f99f0208eb61000054e00313aa1793019408038052690640f9e013c03d8826089be92b40f91c000014L4;ZDL8;FF84e00491a32300d122018052a8831ff8d593009468e20091610100f0212c1c91a32300d1420", - "18052e40314aaa8831ff8cd93009468020191610100f021541c91BBBL4;FFf70000b4f60314aae00316aa7ebcff97f70600f1d6c2019181ffff54d90000b428e379d3e00314aa02018052011119cb80d30194e00315aa85bbff97880080d2L4;FBffb86fd00756c5d6216f135c61fcd6ff1b75f6bfad4e4f", - "42c2bb914c70f92c0fd697837aab5d0b7062e2d4ad0000c607ee11b0212ac77878408a0eb7e00103a0L8;FFebbb45f9e00bc33de85300f9e86745f9e027833de8df00f9e86f45f9e8af00f9e87745f9e9a310a9e87b45f9e98745f9e8b700f9e87f45f9eaa318a9e88345f9BL8;FFe8cf42f9e10319aae20", - "318aa00011a8b905301944803188be8d302f9f88b49f9580300b4e1d342f9e8cb42f9f98749f91f0101eba0360054e8cf42f949048052L8;FFe03fc13de143c13d1443172ae81345b9e063813de167813de8a305b93a000014280100f008b140f91f0500f1a9040054e8830291e0032d91e10313aa020480", - "52BBBBL4;FFb5e5ffb4e00314aae10315aa2200805288f3019428ffff17a0035df8c3ffff17a0831cf8e10300f021f42691e30300f063102891a0e300d16201805244008052L4;FB9a9648000000000033000000000000008e000000050000009a964800000000003300000000000000b100000005000000", - "9a964800000000003300000000000000L8;FF6effff17c80080d20800f0f2080900916affff17c90080d2e8230039480080520900f0f2e8270039e90300f9e4ffff17c80080d2e0230039e00300910800f0f2BL8;FFa303df3ca303983ca203973ca103963ca003953ce8270e294809c05a6909c05ae8270", - "f298809c05aa909c05ae8271029c809c05ae909c05ae8271129e08743adL8;FFe09b49f9220080528a730094f47749f99f0600b180aaff54f57f49f9f37b49f9350600b47622009104000014b50600f1d662009180050054c1825ff881ffffb4BBBL4;FFe84740f9bb8312f81f0500b160050054a06303d1", - "d19bff970800809229008092b4e731a9a88315f8a80317f848008052a88313f8a8a303d1bf031ab8bf8312f8L4;ZBL8;FFa8fbff54c0420191e10308aa02048052230080522400805265c9ff97c9a245a9d5ffff17c04201918200805223008052240080525ec9ff97c13240f9ca2a40f9BL8;FF0800f0f2", - "080900d1d0000014c80080d20800f0f2080500d1be000014e05706f9e80b41b2c9000014c80080d20800f0f2080500d1c5000014c80080d2e0a33239L8;FFe14b05f9e0432a91e10000b021e0029102028052e30000b063680a91c4028052b8000014e04b05f9e0432a91e10000b021e0029102028052e30", - "000b063a00b91BBBBBL4;FFf30b00f9fd030091f30300aa85030294000380522100805283030294400200b4080400f008413a91090400f029a13a910001c03d080940f9080800f9a8028052L4;FF415600540b1540386bc100516901092bed379f1a7f250071eb031f2a080100544a0500d18dfe07360500", - "0014e9031f2a287d60d388550036eb031f2a7f050071L8;FF4000005482feff97744640f99f0600b1e0020054735649a9950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f922008052BL8;FF090000b029511491e82702a9e3430091a5830194fd7b43a9ff030191c", - "0035fd609004039202040a9030d40f9a9000036210300b021b42d91a202805260001fd6L8;FFf30300aa410100f021701e91e8230091e00309aa22028052d283009468820191410100f021881591640100d084a00a91e0230091a32300d1a2008052a8831ff8BBBL4;FFe10313aa022b8052f44f41a9fd7b", - "c2a890c30114088c41f81f0500b160010054fd7bbea9f44f01a9fd030091f30300aaf40301aa30acff97e10314aae00313aaL4;FB080000000000000008000000000000004050470000000000496e76616c696453657373696f6e4572726f72000000000068e34600000000001800000000000000L8;FFa0", - "050054e8fb42f91f0500b1a00800546083ca3ce87b00f9e0831d91e8e35739695f40f9e1c30391e047803d6013c93ce8e30339685340f9e99300f9e0938f3cBL8;FFfd03009148008052f40301aae10302aa000d002af30302aa39fcff97e00314aa530a0094e10313aa35fcff97801a40b980010034610a", - "40f9680240f91f0101ebL8;FF89028052e86301f9e96701f9f2feff172143c23c2007c03dfc430f912283c33ce8b341b9e0430691810f803debc741b901048052e002803de9cf40f9ea9741b9BBBBL4;FFe0023fd61f0000f1cd000054390300eb03e800541803008bf9feffb50f0000141f0400b161e700", - "54a5e301941f100031e1e60054f9ffff17a2e30194f70300aaL4;FB6520612063757272656e742073746174650000000000000073e84800000000003800000000000000470100000a0000007375636365737366756c6c7920646563L8;FF08e12291e3431e9162008052e9cf03f9e9d703f9e8db03f904dc", - "ff97e22740b95f080071c3000054080080927f220039680200f974f5ffb5aeffff17e39340a9BL8;FFd9630194d9630194fd7b41a9f31340f9ffc30091c0035fd6ff8300d1fd7b01a9fd43009109004039e80300aae00301aa3f0500710c01005409030035e10200b0L8;FF4d19c039ae1d00128c390e0b8", - "c1140518d00f83761710c8beb0080521e0000149f014871830700544d1dc039ae1d00128c550e0b8c0148518d00f83761710c8bBBBL4;FFa00200b4e16f40f9610200b422008052fa0700f9fa031caafc0316aaf60319aaf90315aaf50317aaf703142af40309aa80a30194e90314aaf403172af70315aaL", - "4;FFc57a66f86320c21a42100012bc001c8bdc7a26f8641a00b942001b32600a00f94218152a641a40b9e403242a6300040b631e00b9130000f9600a40f903204039L8;FFfd7b41a9ff830091c0035fd6810100f021fc159182008052c4a30014080040f9e00301aa090140f93f0500b1e0010054ff8300d", - "1fd7b01a9fd430091810100f0BL8;FFe82702a999230194fd7bbfa9fd030091800200b000800f91820200b042a00f916101805291230194fd7bbea9f44f01a9fd030091f40300aa098441f8f30308aaBL4;FF000200541f11007141040054280180d20800f0f217000014e00313aae5020094e80300aae80", - "70036e00301aaf44f45a9f52340f9fd7b43a9ff830191c0035fd6L3;ZBBBBBBBBBL4;FF490109cbc932899a1f0549ebe90a00542a050091f30300aaa08300d15f0108eb010c80520295899aac020094b9537ea9a1035ff8790a00b4750240f9e1cf00a9L4;FFe10316aa6528fe97b9035df83f0b00b10108", - "0054a8e35d38a9c35d783a008052aa835db8ab735f38bcf35df82841082aa9f35ef8b6735ef8ebe300395b8108aaL8;FF630013918402009084202491a27f009161058052971d0194ff4301d1fd7b01a9f85f02a9f65703a9f44f04a9fd430091f60302aaf30301aaf50300aa22400091BBL4;FFe02f803d", - "28db77d3e08744ad80020191a14301d122008052080d18aaa0873dad080dc0dae86700f9e28345ada2833eadb39d0194e8275a29ea2f5b29f7c30239L4;FF060080d2050080d2040080d2030080d2020080d2200780d2f1ffff971f10003100109f1a007c4093bdf5ff97fd7bc1a8c0035fd6fd7bbfa9e40", - "301aae30302aaL8;FF1f05007121010054a10100b02154149142038052c59d0014a10100b021c01391a2048052c19d0014a10100b021bc1491a2028052bd9d0014082440a9e20301aaBBBL4;FFe81300b957ffdfc8770000b5addd0194f70300aaff0600b180020054f843059199008052e00318aae10319", - "aae2031f2ae0023fd61f0000f1ad000054390300ebL4;FB4800000000000000c900000012000000000000000000000010000000000000000800000000000000045244000000000000000000000000000000000000000000L8;FF8800805209008092790a00f968220039690200f933d9ff97310f0014280c", - "40f9e8fb00f9281840f9e1030aaae80317a948008052e87300f908008092e87700f9BL8;FFd79f0094e1074091e0431691023f8052218009918f5d019488e20791000540ade8f36879e8e30a79e057813de15b813dbc010014f6c744f9e043169101230091L8;FF088c44f81f0500b160000054e10313aa7", - "5fdff97950a40f9550300b4610a40f9680240f9960640f91f0101eb800b0054680640f9490380522a040091e00315aaBBBBL4;FF4afd43d30b696a389bffff17000400f0002015919efd019420008052e101805291fd0194e923b96dfd7b01a9fc6f02a9fa6703a9f85f04a9f65705a9f44f06a9L4;ZFL8;", - "FFe1031faae8079f1a88820039acffff17e1031faa881a00b9a9ffff17e1010054e1031faa9cffff17c80080d2e11700f90800f0f2080900d18cffff17e80b41b2BL8;FFfd7b42a9ffc30091c0035fd609240091210300b021200191240300b084a00091060300d0c660129103200091a9831ff8a52300d1", - "e00308aae2018052d17d0194L8;FF09692138e1630091057dff97f71740f9e80f40f9080117cbdf0208eb28420054e81340f9e10314aae20316aa0001178b887d0094e802168be81700f97f0600b1BBBL4;FF691200f96a000014a10c0054284401f1820d0054480080d20800f0f264000014a22301d1830", - "c805293a3ff97400f00b5b8835bf8f70318aae28e40f8e20b00b4L4;FB9067480000000000acf647000000000050000000000000000800000000000000f8684800000000004c69480000000000ac694800000000006b657967656e696eL8;FFff0307d1fd7b19a9fcd300f9f44f1ba9fd43069128f840f9f", - "30301aaa20f00f95f0008eb6106005448008052f40300aae0030091ff2300a9e10303aae87f02a9BL8;FF4a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54a00200f0L8;FFf65704a9f44f05a9fd0300", - "91ffc331d1ff0300f9fb0302aaf30301aa28004b39fa0300aaf8c30d91f94308911f1100714d0200541f1900710c0300541f150071BBBBBL4;FF42030054010840a9e50304aa0a018052e40303aaf30300aae023009129f87fd31f0109eb0881899abf0400f1890080524901899a1f0109eb1481899ae303", - "14aaL4;FFe1dbc53de0431391e2dfc53de037813de13b813de23f813d62ebff97a90000140a0180d2e9675339e8031faa0a00f0f2eaaf00f906000014090180d2e8031faaL8;FFa90d0194fd7b45a9ff830191c0035fd61f090071e1050054080440f9200440a9a92300d12a0200904ac10d91a8831ff862", - "02009042e02a91e9ab01a9e3630091BL8;FFe90300f9c1010054e9030091210300d0218029914403009084c02291e3230091e00308aa82008052e90700f9c38d0194fd7b41a9ff830091c0035fd6210300d0L8;FFe8030091e00309aac2018052d58d0094610100d021002191840100b084403391e003009", - "1a363009162028052b30f00f9cd8d009468c20091610100d021602191BBBL4;FF1bfdffb5f44f50a9f6574fa9f85f4ea9fa674da9fc6f4ca9fd7b4ba9ff430491c0035fd6a00300d00000349184cd0194a00300d00060389181cd0194c00300b0L4;FB617465312073746f72656420737461746520656e64", - "69616e6e657373737071723a3a696e6372656d656e74616c5f6d6c6b656d3736387370717220756e61626cL8;FFe82344b91f810771e0550054f4c341f99f0600b140020054e1cf41f93f0400b140010054810000b4e0d341f92200805280cd0094e1db41f9810000b4e0df41f9BL8;FF2143c23ce8c741b", - "9f81f40b94003803dfacf40f9e002803de9d302b9214b803dec030b915f0b00b141d6ff54f3feff178083c03ce8430f91000d803d888341f8L8;FF34008052582f40f9f8f6ffb4532b40f9844d0094e00318aa21008052824d0094200500b4e10313aae20318aaf60300aa884d0094b3835df8acffff17e9", - "0313aaBBBBL4;FF980500b487ed0194e00318aa210080523900805284ed0194e0feffb4f70300aaf88300a9ff0f00f9530500b4e8031faa49018052e96a283808050091e1230091L4;FB436970686572746578744d657373616765546f6f53686f72744c6567616379436970686572746578745665727369", - "6f6e556e7265636f676e697a656443697068L8;FF2a040091b41640f9490280526a0a00f909692138b60900b4c80240b20811c0da081540d2080d088b08250191c81a488b08050091f40800b4890240b22911c0daBL8;FF0219803d000500ada08b7dade93b40f9000901ad28050091e83b00f9980800b49", - "4c20191d70000b49f021aeb18070091d6c20191f70600d121fdff54f42b00f9L8;FFf80300aae043169122008052a0100094e1d342f9e00318aad4fbff17f90300aae04316912200805299100094e00319aaf90b40f9e1d342f9a0fcff17f90300aaBBBL4;FFf50314aa6002c03d680a40f9a18e47f88082", - "843c882e00f9810000b4804240f92200805283ad0194602ec03d686240f9a002803da80a00f9f44f4da9f6574ca9L4;FF3f404071680080521535889a680240f9080114cbbf0208eb28050054680640f93f0002710801148b62000054010100391c000014e90f80123f002071ea0f8012L8;FFfcef00f99c", - "07009122020054810a40f9ff0201ebc2290054e00600911f0001ebe2290054890640f9eae740f98b0700d13b6977787f010aebc1fdff54e0230791BL8;FFf6e32291f76301912183c93ceaa209912283cb3cc082893c2083ca3ce9db42f94221803d2283c83cebe20891410103ad2083c53c2183c63ce847", - "01f9e8a70691L8;FFf8174bf9f51b4bf902278052912d0094f7e742f9f4e342f9e80240f9680000b4e00314aa00013fd6e10640f9810000b4e20a40f9e00314aa7e2d0094df0a00b1BBBBBBL4;FFff430191c0035fd6e00302aa0e160194e80300aae00301aae10314aae8f80737d3ffff17e0030091e82b", - "00a9d9f10094ff4302d1fd7b05a9f85f06a9f65707a9L4;FFe1db853de12f813de1e3c53de027813de00bc63de233813de2ebc53de11b813de107c63de013813de003c63de223813de2ffc53de10f813de1f7c53de00b813dL8;FF1fd5017121040054a80640391fc90171c1030054a80a40391fb9017161", - "030054a80e40391fe9007101030054a81240391fd50171a1020054a81640391fd50171BBL4;FF895a4039ea9b4039e89700394801094a895e4039ea9f4039e89b00394801094a89624039eaa34039e89f00394801094a89664039eaa74039e8a300394801094aL4;ZBL8;FF0825019109fd46d30800098b0", - "80500911f0109eba808005450000014f3031faa080c47f81f0500b1c1dcff54e8031faa080113abe3070054800100f000003e91BBBL4;FFa0faffb457020014c1e20091a2a302d1e003082aadbeff97e0f9ffb429020014a0a302d108d60094e80300aae00301aaa8fc07367b0100145f2800f188000054L", - "4;FBe11f4900000000005600000000000000d10000001f000000881f4900000000005800000000000000cb00000014000000881f4900000000005800000000000000L8;FFea3344f9e80b00f9e83744f9e84300f9e83f44f9e8ab06a9e84344f9e8af03a9e84744f9e9a302a9e84b44f9e94f44f9e87b00f", - "9e85344f9e8d300f9e85744f9BL8;FFf87749f91f0700b1a01500548022029114180094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb4814005472000014L8;FFe8c303f92800009008911f91e85f04f9e8c316912a0100904a413191e86304f9080000f008c1", - "0191e96f04f9e9c32291e86704f9e8c31d91a04700d1e86b04f9BBBBL4;FFe20bc03d600600ad620a803dfd7b43a9f32340f9ff430191c0035fd6000400900060329197f5019497f50194ff4301d1fd7b02a9f65703a9f44f04a9fd830091L4;FB2e0000001b000000c9944800000000004d000000000000", - "00260000000f0000006d697373696e672072656d6f7465206964656e74697479206b65790000000000L8;FF410500343f040071000200543f08007161fdff54888246f81f0500b1a10000549fe606a99ffe07a999fe08a99f9a00b981a20191e20313aa5bf8ff97600400b5BL8;FF0403009084e01291e00", - "30091a363009122018052a80f00f9d37501940103009021302991040300d084402391a363009182008052b30f00f9cb750194cb750194L8;FF6b0d009104000014eb031faa0d0000144b0080522c0100348c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c05009102000014ec031faa8b010b", - "8bBBBL4;FFa2f8ff54fc030191e10318aae20319aa8003158b8fb50194a802190be8ff01397ffe03f11808805220020054e8ff413969060011a90316381ffd007100edff54L4;ZDL8;FF26000014140100b4e00313aae10314aa22008052f3030caa86b50094ab835ff8ec0313aa7701198bda0000b4e003", - "0caae1031aaa220080527eb50094ab835ff8BL8;FF3600805210000014e8f342f909068052e02bc33d6822099b690600910001803de02fc33de9f702f90005803de033c33d0009803d9c6300917b0700919f0314ebL8;FF0900f0f23c4500911f011ceb808a0054e8430891e0c30e91e3c32491000543ad0", - "221c03de8432a91e4432a91e10000d021200291020180520209803d000500adBBBBBL4;FF9f0600f1ab000054e00315aae10314aa2200805287050294f44f4ba9f74b40f9f6574aa9fd7b48a9ff030391c0035fd6e003c43ce91740f9612200a9751200f9L4;FF9f0208ebe80c0054e80b40f9e10315aae2", - "0314aa0001168b8e050094c802148be80f00f91b0200b4e10f40f9ea0740f95f0101ebc00d005428040091e90b40f9L8;FF082440f9f30300aa22008052e00308aa88050194e00313aa012c40f9e10000b4083040f9f30300aa22008052e00308aa80050194e00313aa088040f81f0500b1BL8;FF090000d", - "029e11991ea2300a9a82300d1e91300f9020300f042143791e92301a9e3230091a0850194fd7b43a9ff030191c0035fd608100091200440a9a92300d1L8;FFe8cdffb572feff17600100f000003691620100f042603691e1028052a6850094620100d042802d91e10319aa8685009400018052012080528b", - "850094620100f0BBBL4;FF220080528bc501941f0700f1ab000054e0031baae10318aa2200805285c501947f0600f12b020054e00b40f9e10313aa22008052ff030791f44f45a9f65744a9L4;FB20756e726561636861626c6520636f64653a2073686f756c64206e6f74206265207573696e6720446f756", - "26c65205261746368657420666f7220746865736500L8;FFe10318aae20314aae05f00f991c50094fb00001428008052e86300f9fb0314aaf96f00f9192000b4f4030b2a7dc50094e00319aa210080527bc50094c05600b4BL8;FF9cf5ff97e10300aafaffff17e1031faae86b00b9f7ffff17680240f908", - "0540f9190101ebe2000054aa000014e20313aa430c80528ff5ff97e10300aaa10a00b5L8;FFe80300aae00301aaa8fe0737680240f9090540f91f0009eb29060054e80f41b2e80300f9e0030091a13aff97f44f45a9f52340f9fd7b43a9ff830191c0035fd6BBBBL4;FF970015eb48040a9b73040a9b2ae1", - "79d369080054541109cbb60209cbe00313aaf50301aae10308aae20314aa83e50194c8e279d36002148be10315aa161116cbL4;FB39306231343131366236643835366166303938352f6c6962726172792f636f72652f7372632f697465722f7472616974732f616363756d2e7273001a73657373L8;FFf4", - "0300aaf30308aa29b140f93f0d00f1c3030054887200918900009029913f91e8a700a988620091890000d029813891ea230091a00700d1e8a701a968008052BL8;FFf6574fa9f85f4ea9fa674da9fc6f4ca9fd7b4ba9ff430491c0035fd6e92b4d29e80344a93f01007259119f1a1f0900f1e0fdff54e15b", - "45a91f0500f1e1f9ff54L8;FF60ea40f9220080528a65009461f240f9810000b460f640f9220080528565009461fe40f9810000b4600241f9220080528065009460220091f30b40f9fd7bc2a8BBBL4;FF690200f9f44f46a9f91b40f9f65745a9f85f44a9fd7b42a9ffc30191c0035fd6e0230091e1031fa", - "a220080522300805224008052ee97ff97e02341a9a1ffff17L4;FF2300009063c0029163d86878633c7cd3841e4092661000d1a54000915f7c0271477c0553421c45d38318039ba400038be9f3ff54ff14007140f2ff54000080d2L8;FFf30b00f9fd030091012440f9f30300aa1f3c00f93f0400b140010", - "054810000b4602a40f92200805282a50094613240f9810000b4603640f9220080527da50094BL8;FFa62501948836403969364039b502000a1f01096be0179f1aa0250194883a4039693a4039b502000a1f01096be0179f1a9a250194883e4039693e4039b502000aL8;FF2935899ae82301f9e92701f993", - "250094e003069141031b8be20316aaf6ff0739f60306918b250094e8ff47391ffd007128010054e00743adc902088b08011a32BBBBBBBL4;FF2800028b08f1df38080af837e00300915c820094e80340b9a8020037e90b40f98a0640f9480109eb030b00548a0240f94901098b892200a9680240f9e0031f", - "aaL4;FFe10740f9e01b803de00f803d610000b42200805287190094e15740f9810000b4e00315aa2200805282190094e00b41ad28008052e107c03d975a00a99a6e01a9L8;FFfd830091f30308aae8030091f2f9ff97e1030091e00313aad8f8ff97fd7b42a9f31b40f9ff030191c0035fd6ff8301d1fd7b", - "01a9f91300f9f85f03a9f65704a9BBL4;FF08358c52e51301ad08019f5ae20f00ade00702ade28f03ade08704ade20741ade82b01b908fa80d22800c0f2684301f8e8030091e20706ade9b30094e80340f9L4;ZFL8;FFab035738a9e31638a91357384a01084a6b01084aaaf31638aa2357382901084aab0", - "31738ab335738a9131738a94357384a01084a6b01084aaa231738aa535738BBBL4;FFf50301aaf30300aaf40308aa85d90194000480522100805283d90194401b00b4c00640adf70300aa000400ade00315aae6b00094f80301aaa100f8b6f5031faaL4;FB7365706f73747175616e74756d726174636865", - "742d623538643766353665333634356363642f303639353962342f7372632f76312f6368756e6b65642f737461L8;FFe82b17a9e8bb43f9eac343f9e9231fa9e8c743f9e9bf43f9e8cf00f9e8cf43f9e8c300f9e8d343f9e8ab00f9e8d743f9e92312a9e8db43f9e9f343f9e8ab1aa9BL8;FF8b010b8b280", - "1088b49010b8be14316910001098b3a120094da0300b4e1d342f9e8cb42f9f60700b9f63749f91f0101ebe0d50054e8cf42f9490180522a040091L8;FF94590094e88b4cb949008052f9a305f9f5a705f91f010071f3ab05f92801881ae99f40b91f01096b41050054e39348a9e0c31291e2db42f9e5f356", - "39e1032d91BBBBL4;FF60a240a9090d40f9e803009120013fd6e80340f91f0d00b1a1030054880200f96800805268620039f44f48a9f65747a9fd7b46a9ff430291c0035fd6760240f9L4;FB76657220636861696e20776974682073656e6465722072617463686574207075626c6963206b657920c01120", - "636861696e206b657920696e64657820c000c0c0L8;FFe0ffff17e08741ade00314aaa08739ade08b42ada08b3aade18340ada18338ad70f3ff97a08779ad880080d20800f0f2080500918082823ca2837aad8182833cBL8;FFe1060054a80358f81f0500b161000054bf6738a9bf0319f8e1220191a2230", - "1d1aa62ff9720f6ffb4850000143f1c0071e00400543f20007121050054a88353f8L8;FF94790094e083c53de187c53d15008092e8436c79e057813de15b813de8e30a7920010014e8074091f6a745f90023009108810991f407409194820991c8bbff97BBBL4;FFe44300f9280108ab821e0054e9388ed2", - "f40303aa89e3b8f2298ec3f2e938e0f21f0109eb1731899a1f0103eb031d0054e80214cb1f0500f1a9030054fa4b40f9L4;ZBL8;FF683e00f9684a00f9685600f9686200f9686e00f9603a803de093c03d687a00f968fe10a97fa211a968fe13a97fa214a968fe16a97fa217a968fe19a97fa21aa9BL8;FF", - "e80700f9cd390194fd7b41a9ff830091c0035fd6a10200d021382d91c2028052c2390114fd7bbfa9fd030091083040f9080100b4080140b20811c0da081540d2L8;FF220080528b390094e80314aaf64b40f9e15f40f9a10000b4e06b40f92200805284390094e80314aafc432a91d60000b4e0031aaae10", - "316aa220080527d390094BBBBBL4;FFe083c23c2009803dab000014e80741b29b000014f403042af60303aaf50300aa5f2800f1880000542800028b08f1df38682ef837e023009152720094e80b40b9L4;FFe003009153000094e80340f9f40b40b91f0900b1c1030054e80f40f9160101f1e20400547f09", - "0094c0018052210080527d090094800800b4880000f008fd3991L8;FFe92b00a96902009029e10791e1030091e92b01a9b6090194fd7b42a9ffc30091c0035fd6ffc300d1fd7b02a9fd830091080200f008c10d9109200091e02300a9BL8;FF686a00a955000014e8134bb8e9b740b95a0080d2ea6740f9e", - "b4340b91a00f0f2e88300b9e8434339f8e34239e93308b87f050071e9a34bb8ea3700f9ea7f4179L8;FF88ffffb4800240f901f97fd34200805288890094f7ffff17f42341a9c80000b40805088be00318aa0201805201f17dd3808900947f0600b100130054e8030491BBBL4;FF88008052f30300aae023", - "009104018052050d805229f87fd33f1100f13481889ae30314aa40000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9L4;FB6a00000000000000800000002e000000000000000000000008000000000000000800000000000000dcf44500000000000000000000000000080000000000000", - "0L8;FFe90314aaf80000b4e00319aae10318aa22008052f40309aa86c90094e90314aaf84f40f9f7031f2a784200b408008092f90309aae95b00f9e86700f912040014BL8;FFfd7bc2a8a1feff17f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4600640f92200", - "80527f490194610e40f9810000b4L8;FF080140b20811c0da081540d2080d088b0825019108fd46d316050091770a40f9570900b4740640f9f8031faaf90317aae00314aaeafcff97080040b20811c0daBBBBL4;FFc0035fd620008052e10314aa96e90194ff4301d1fd7b03a9f32300f9fdc30091091c40", - "f9f30308aa3f0500b160010054090444a9e8230091e00309aa22c30094L4;FB304b4200000000000000000000000000080000000000000008000000000000004c53420000000000000000000000000008000000000000000800000000000000L8;FFf30300aa01020054f40304aaa2020036340400b4f503", - "03aa82e90094e00314aa2100805280e90094a00b00b4e10315aae20314aaf48300a986e90094f40f00f9BL8;FFfd7bbea9f30b00f9fd030091010840f9f30300aa3f0400f18b000054600e40f92200805283690194080080927f0200f9680a00f97f2a00b9f30b40f9fd7bc2a8L8;FF883fff97e00640ada", - "00302d1808702adb4690094e8430691a08303d1c1e20091028300910c9cfe97e89341b91f050071610600542007c03de9b341b92143c23cBBBL4;FFe0031aaa22008052e3031caaa4a90194fa0300aa402300b4b30800b481a90194e00313aa210080527fa90194202200b4e10b40f9e20313aaf90300aa8", - "5a90194L4;FF0901805210000014f30303aa010100b4e00302aae10313aa5c090094e00000b4e8031faa800600f906000014e00313aa0302009460ffffb528008052880600f9L8;FFe083c53ce183ca3ce28307ade283c33ce083c73ce157803df53f4439e183c23ce18b06ade283c63c020115cb140302e", - "be28308ad22010054e8430391e10317aaBL8;FFe282c63ce18306ade082c73ce182c83ce28304ade082c93ce282c23ce18305ade082c33ce182c43ce28302ade082c53ce282c03ce18303ade082c13ce28301adL8;FFe11b42f9ffe71639411400b5a4000014e8833f91e23f40f9a34301d10081c03ce8ff", - "47f9a5c300d180008052e10314aae40315aaa8031ef8e8074091f6074091BBBBBBL4;FFa8035ef86a0740f9490108eb433300546a0340f9b7835df84801088b682700a9e8fe60d3681a00b5e00a40921f1800f1e21a0054e17e0353e11c00343f080071L4;FF94110094e8830891e0431391a44700d10181", - "0091e20316aa23c480529aebff97e86b42f91f0500f1a10b0054e00316aa21c48052220080527e110094f62b40f9L8;FF4800805268420039f44f45a9fd7b44a9ff830191c0035fd6ff8301d1fd7b04a9f44f05a9fd030191f30300aa3f9400f16c0500543f8000f1400900543f9000f1BBL4;FFe213c03d", - "e317c03de326833de222833de11e833de01a833d7f6600b9e2aac43de3aec43de4b2c43de0a6c43de1a2c43d7f0200b9e20f02ade2b6c43de10301adL4;ZDL8;FF6b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500", - "542a0140b24a11c0daBBBL4;FFfc031faa360100b593ffff1713008092f54340f9f94f40f9b74302d1e8af40b9fc031faa96f1ffb46a0b40f9090e8052ec0d80924969099b2bb1019149011c8bL4;FB9126267fe17ad077e264f960be20282206a28a4ae7347b43675f6f7d68af531abb819168e296f6c95", - "b3cfeb3846bd1b6d4bb0e6bdac6a28c642111ce00003f33L8;FFe92b01a90a2552a9e94300f9099940f9e92300f9099d40f9e9ab06a90a2554a9e92b03a90a2555a9ea7b00f9e96300f90a2556a9ead300f9e96700f90a2557a9BL8;FFf90300aae04316912200805291100094e00319aaf90b40f9e1d342", - "f9c3fcff17c00200f0008039918851019420008052017880528c5101942000805201088052L8;FFe779fe97f88345b91f07003160080054e8e20b9120c3c13ce98745b9e86f04a921c3c23c1f0b0071f59b45b9e8bf45b9e1c20891eac742f9fbcb42f9208717adBBBBL4;FFf85f05a9f65706a9f44f07a9", - "fd83009114b840b9f30300aaf80301aa81f1019400048052210080527ff10194a00700b4164b40f96082c93c6182ca3cb4c31fb8L4;FB54696d657374616d7020746f6f206c617267650000000000e9974800000000003800000000000000450000003f0000006c69627369676e616c5f70726f746f63L8;", - "FFa10d0054e00313aa74f0ff9740010036410b00b5e0031faad4ffff17e003082ae20313aa430c805216eaff97e0f9ffb4c4ffff17a80640f91a0101ebe2000054BL8;FF086c40b948090034080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b1800800540a3040b9", - "091440f94a1100344a0140b2L8;FF1f0109eb681200548e0000148002039196240094080040b20811c0da081540d2080d088b0825019108fd46d30900088b390500913f0308eb49100054f87749f9BBBL4;FFe0000054c80000b4e02740f9e10308aa2200805287b10194e00748a9d6f50736280700d11f1", - "100b168f5ff54e03740f9e10319aa220080527eb10194a5ffff17L4;ZBL8;FFe5020054f9031faae00319aae10316aa95b10094e8830f91e16301910232805200e100918bb10094a00640ad09008092a20ac03da81a40f9e1830f91698600f8BL8;FF86e1ff97e15b44f9810000b4e05f44f922008052873", - "1019482310194200280522100805280310194a06c00b4880c8052a90200902901069108400039c80080d2L8;FFe1c32491022b805292310094e1f341f9f69344f93f0400b100010054810000b4e0f741f92200805282310094e8830f9100810091faefff97a80359f8e05ac03dBBBBBL4;FF88010294e003", - "16aa2100805286010294e00400b4e10317aae20316aaf50300aa8c01029417035ff8f70100b419835ef87c010294e00317aa210080527a010294L4;FF810000b420835ef8220080528901009421835ff8e1feffb4200340f92200805284010094f3ffff17e81640f9c80000b40805088be00315aa0201805", - "201ed7cd3L8;FF96000037580200b01823209113000014d7fe45d3e80214ab420d0054e90200ab620d0054aa0217cba8831cf8a8c300d1a02301d1a9ab3ba95fe9ff97a8035ef8BL8;FFe00308aae201805284008052e9af00a9ea0300f9cd810194fd7b42a9ffc30091c0035fd6ff8300d1fd7b01a9fd43", - "0091e80301aa090040f9010300f021201991L8;FF6b0d0b8b6b2501916bfd46d36b0d0091cc0500348c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c05009127000014280080523f0700b1ff1700f9BBBL4;FF91e7ff97e863403908030036e92b42a9880280d20800f0f2682600a96a0a00f", - "9f44f47a9f72b40f9f65746a9fd7b44a9ff030291c0035fd608008092a9030090L4;FB6e7465723a20c0022e20c000083c6572726f723a20c0013e0038706f73742d7175616e74756d20726174636865743a206572726f72206372656174696e672069L8;FF4c000014e083029181220091023c8052f5830", - "2918fc10094882640f9800ac03da1420191891a40f98182c33ca80317f8880e40f98083873c8082c03cf47740f9BL8;FFe00315aa6a0a00f909692138e10313aa3bfaff97770a40f9680240f9080117cbbf0208eb880a0054680640f9e10316aae20315aa0001178b86410194e802158bL8;FF22008052f4", - "4f41a9fd7bc2a889410014f44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aa810000b4600640f922008052BBBBL4;FF41fdff54e043059181008052aee10194e0a70035e85341b9e89300b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae", - "10319aae2031f2aL4;FB14000000000000001400000000000000e8f8480000000000f9f84800000000000df9480000000000b0fb480000000000c2fb480000000000e0f2480000000000L8;FF68020035480200f0e003142ae103142a08e140391f050071e1030054e2031f2a5a3a009409fc78d3280200b", - "008e13b910afc60d3097969784921094a2a5d1053BL8;FF132000b91f900039f44f42a9f50b40f9fd7bc3a8c0035fd600018052010580529c610194fd7bbea9f44f01a9fd030091f303012af40300aa7a61019400048052L8;FFe20313aadefcff97000100b4d6000014e01c00b5e00313aab7fdff97e803", - "01aa40010036481d00b5e1031faa61f9ffb4f1000014e20313aa430c80529cf5ff97BBBL4;FF42801891e0230091a34300d1082109aa6905c05ae083803cb6831ff808010aaa0ad49052284108aa2a00a072097dd59b28a10a9be90f40f9e9a301a9a8df3ea9L4;FF000080d21f000039007d20d4bfc021e", - "b82010054a31443aae703252a630843aa631043aa2800030a2100030abf0001eb0101070b2130881abfc021eb23feff54L8;FFe00301aa810100f021341a91e803009122028052d3a1009468c20091810100f021781a91a40100d084a00b91e0030091a363009162008052a80f00f9caa10094BL8;FFb600", - "00b40000158be20316aa91210194e80315aa958200910801168b00008092e10315aae80f00f9ed2101941f0400f161010054bffedfc8810240f9810000b4BL4;FF601240f922008052f30b40f9fd7bc2a888210014f30b40f9fd7bc2a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd8302", - "91081c00121f090071L3;ZB" + "BBBBBBBBBL8;FB00a040000000000000a04000000000000ce80500000000000ce80500000000000000010000000000010000000500000000900600000000000090460000000000L8;FF092040f9f30308aa3f0009ebe2000054a8018052690a00f90903805268220039280080526b000014081c40f9f4030", + "0aa080101eb230700549b0e40f91f011bebBL8;FF611e40f9810000b4602240f92200805259250194612a40f9810000b4602e40f9220080525425019460c20191f30b40f9fd7bc2a8aefeff176022009178000094L8;FF13000014d7fe45d3e80214ab420d0054e90200ab620d0054aa0217cba8831cf8a8", + "c300d1a02301d1a9ab3ba9f228ff97a8035ef8b7031ff8140117eba3080054BBL8;FF817e40f93f0400f18afcff54e6ffff17089440f91f0500b160000054014001b9c0035fd6fd7bbfa9fd03009180ffffd000d41a9182ffffd042a01b91c1058052L8;FF0800f0f2080500d104ffff17c80080d20800f0", + "f20809009100ffff17c80080d2e10b00f90800f0f2080900d10f000014c80080d2a1831df80800f0f2080900d1BL8;FFe80300aae00301aae8fd073708fc60d3080d00b5080840921f1900f1420d0054017c0353610d00343f040071000200543f08007181030054890245f83f0500b1L8;ZDBBBL8;FB457", + "2726f7200000042024000000000006a00000000000000020100002e00000042024000000000006a00000000000000440100001c0000004202400000000000L8;FFfa0f40b9e81700f9b8010034e11740f9e80f40f91f0101eba09b0054e81340f9090280522a040091e00318aaea1700f909692138e16300", + "919c92ff97b7010034BL8;FF1f0100390011803c0111813cc0035fd61f0500f92900805209010039c0035fd6290080520a2500390921003909010039c0035fd649008052098500a929008052L8;FFe0030054f5d24fa9d40200b4b982009104000014940600f139c300912002005421035ef8810000b4208", + "35ef8220080525105009421835ff8e1feffb4200340f9BBL8;FF691640f9e803088b69fbffb5e1ffff17f40308ab421a0054e00313aa080c49f81f0500b1e0010054fa000094080040b20811c0da081540d2080d088b08250191L8;FF5d45009474d643a9750300b496c2009104000014b50600f1d6a2019", + "1c0020054c1025df8810000b4c0825df82200805251450094c1825ef8810000b4c0025ff8L16;FFe81b00f9e89342f9e87b00f9e89b42f9e8d300f9e89f42f9e9230ca9e8ab42f9e9a342f9e86f00f9e8af42f9e85f00f9e8b342f9e8e300f9e8b742f9eaa30aa9BBBBL8;FB0603000020000000ef104000", + "000000004e00000000000000d00200001d000000ef104000000000004e00000000000000bc02000015000000ef10400000000000L8;FFaa435638a92316386901084aab535638a93316384901084aaa635638a94316386901084aab735638a95316384901084aaa835638a96316386901084aab935638BL8", + ";FF0101003926000014e00313aaf603012ae10314aae20315aa10f9ff97e103162a680640f9df0202710801148ba3feff54e90f80123f002071ea0f801229140033L8;FF1f0900b1813e0054e007409122fdffb04248009100401d9161620491e4830c9143038052f41700f9f5d700f9ce040094e8ab4bf9", + "1f0900b121400054e8cb41b9BBL8;FFf85f57a9fa6756a9fc6f55a9fd7b54a9ff830691c0035fd6a04301d121008052220080522300805224008052c2e0ff97b6a37ba9e0feff17a04301d1e10316aaL8;FF33000014a082c03ca182c13cc80000f0a282c23c400707ad4243803d081140f9a80300b40800", + "00b008c10b9129feff9029811a91bb2336a9a84303d1a82737a9L16;FFe1431e91f8cb03f9f9cf03f9e0eb813d89300094e0431e91a12302d1e20316aae303152af9431e91b62e0094e8cb43f9f5cf43f9fa031c2af6d343f9f8d743f9BBBL8;FF2300805224008052cb000094770a40f96affff17e00313", + "aa220080522300805224008052c4000094610a40f971ffff17f50300aae00313aa2200805223008052L8;FF1f0109eba816005439000014f9031faafbab49f9fa0740915a8309917f0700b18017005440c3039141250094080040b20811c0da081540d2080d088b08250191BL8;FF220080525cf50094742", + "a40f99f0600b1e002005473d645a9950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f922008052L8;FF021040f95fcc74f2c000005442cc749242fc44d3420400d15fc024eb23e3ff547f0000f900ffff9788ffff1742141a125f003f7161e2ff54f2ffff17734e00", + "a9BBL8;FF09fd46d30800098b080500911f0109eb68000054fe040014e8031faa160114ab020d0154f47349f99f0e00b161000054e8031faa0d000014000302911a1d0094L8;FFe0f741f9220080525b350094e8830f9100810091a2efff97c80080d20800f0f21c450091ca000014fb6300f92dfbff17e8", + "4f45f9e95345f920fdff9000c01091L16;FFe0a3803db1fcff1720008052e1031caa95b1009420008052e1031aaa92b1009420008052e1031baa8fb1009420008052e10314aa8cb1009420008052e10319aaBBBBBL8;FB795f69647369676e65645f7072655f6b65795f696474696d657374616d704d6573", + "736167654b65796369706865725f6b65796d61635f6b657969765072654b65L8;FF800640f901f57ed3420080525a9d00947affff17950640f9480080520900809208200039090000f9780100b515000014ea0740f94800805209008092e0830091BL8;FF680240f9941240f91f0101eb40070054680640f", + "9490480522a040091e00315aa6a0a00f909692138e10313aab6faff97760a40f9680240f9080116cbbf0208ebL8;FFa1035ef8810000b4e00318aa22008052591d0094a08300d1e103172ad610009428008052ff2b00f9a18300d1ff2304a9e2030191e0031aaa3bf4ff9735008092BBL8;FFe127803d773", + "08a9a08050091641b803de28303ad000440adf3ff4139e1a300a9220113cbe18f02ad5c0302ebe013803d220200546003138be10319aae2031aaaL8;FF00030014e8cb45f9090d8052e037c33d6822099b000d803de03bc33d0011803de03fc33d0015803de98346f9093100f969060091e02bc33d000180", + "3de02fc33dL16;FF2200805223008052240080520b010094610a40f9b6ffff17e00313aae10317aae20315aa230080522400805203010094770a40f9680240f9080117cbbf0208ebBBBL8;FF740240f9820640f9620800b4810240f92800c0394808f837480400d1290400914e0000148000805277000014", + "740240f9820640f9020700b4810240f920008039L8;FF00788052210080525a7d0094407801b4e807409102788052f90300aa08810991fb1300f9010140b25a7d0094557d009420058052210080524e7d0094007901b4BL8;FFe20301aae10300aaf40308aae1000037e00314aae30313aaf44f42a9f6574", + "1a9fd7bc3a830feff1735f87f92480015cb160113ab62010054e00315aae10302aaL8;FFfd7bc1a8c0035fd6c0035fd600000000210000d02044463960010035200000d0220080522244063900a440f9c00000b4210000d0a0dcffd02180069100000091BBL8;FFa95356384a01084a6b01084aaa331638a", + "a6356382901084aab431638ab735638a9531638a98356384a01084a6b01084aaa631638aa9356382901084aab731638L8;FF820f00ad622ec13dc00604ad603ac13dc21e803d2281cc3cc02a803d000540adc0860fad2081cd3c2181ca3cc28219ad2281cb3cc11e813dc222813dc8cefe97L16;FFe0d341", + "f9f8db41f9f9df41f91f8125f1e9c741f9e83300f9812700545f0700b120290054f4d741f9e8e341f9fce741f9e95b00f9e87700f9e0f30da9f46700f9BBBBL8;FBd374fd52e29820abd553bd94d2cddccc442fb1c65491c38df289ca8267ee9d7080ad40d8754378a67d5115cbd89342e67621ca0d44d47", + "397a28c5497f732d380L8;FF4904805294620091090100a9b5120191090900f9f65301f9d6060091df8e00f1c0020054578d00948008805241008052508d0094a04800b4a00641adca0600d1BL8;FF2dffff17fa830291e8fb42f91f0500b1201e0054e80343f9e07fc13de9c31291e0833291022b8052e8", + "6702f9e8c31791018100912081803c560d019440030291L8;FFc0035fd65f0d0094c001805221008052580d0094c00200b408fdfff008fd039109fdfff0298d0391cb0080520a0140f9e92f02a9086140f8c9018052e00bc03dBBL8;FF00902791eba305a9a86301d1e8a706a9a8a300d1090000d029713e", + "914a017db2e1630191e8a707a9e8030191a3831af8aa831df8ab490194740a40f9680240f9L8;FFf85f42a9fd7bc5a8c0035fd680fdffb000e02e91ad49009480fdffb000203291aa49009480fdffd000800391a7490094fd7bbea9f44f01a9fd030091080040f9L16;FFe5ab42f9e4af42f9e82b17a9e80", + "342f9ea0b42f9f2b342f9f6b742f9edbb42f9e9231fa9e80f42f9e90742f9eebf42f9f0c742f9e2cf42f9e8cf00f9e81742f9BBBL8;FFaa031af8aa935c38a9431b7869038052a8831a78a8ffff9008e10591a8273da9b7831cf86a0f0036e80340f9edbb40a9e92b40b917088052a0e300d108bd70d3L8;", + "FFfb031faae0031baae1031aaa966900945c6d0094e002805221008052556d0094c01c00b4c8fdffb008611a911a0380d20001c03d08f140f8e90280521a00f0f2BL8;FFf73f00f966050094e08743adf50300aaf4cb00f9e0870aade28344ade2830bade18341ade18308ade28342ade28309ade18340ad", + "e18307ad800d00b5e08743adL8;FF630400714001005440ffff370100050be203002a80fc5f885f00006b01ffff5481fc008880ffff35c0035fd685fc5f88a504001185fc0088a0ffff350700b012BBL8;FF1f0308ebc9000054e0431691e1031aaae20318aa11110094fad342f9fc0740919c830191dffd", + "ff17f80300aae04316912200805209110094e1d342f9e00318aaL8;FFe9070bf9e90f0bf9e8130bf949e3ff97e1e344f9810000b4e0e744f922008052552d0094e81750a9e00314aae20743b9e10343b9e61341b9033940b9e8030291L16;FFa00b3dad210340ada1033aad220341ada2033badc12d0054b", + "82d00b4a8e300d1e1831391a20303d1e00318aaf8eb00a9b40303d1fb1300f99ca9009451ad0094BBBBBBL8;FB2d313934396366386336623562353537662f70726f73742d302e31342e342f7372632f656e636f64696e672e7273002f636172676f2d72656769737472792f69L8;FF6b31000a4901094a8", + "a010e4a4c02014a2802084a29010d4a4a010f4a8c01024a6334000a0801094a4901104a8a010b4aabc35eb80801094a4901034a6b39000aBL8;FF3f100071210500541f0900f1a1210054e00313aaff6b00b9ffdf00a9df7e01a9dffe02a9f71700f9f72300f9df7e04a9f7ff05a923feff97e0060036212", + "c00b5L8;FFf40308aa092040a9f30300aae0c30091028d40a921a1009190120094f96343a9f55b44a93f0b00b1e1020054760300b4e8c30091e00315aae10316aaf8b2fe97BBL8;FF04000014e00315aae8031faa600600f90a028052e90314aa696a2af8680200f9f44f42a9f50b40f9fd7bc3a8c0035fd", + "6fd7bbaa9fc6f01a9fa6702a9f85f03a9L8;FF680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aa2200805246000094610a40f98affff17f50300aae00313aa2200805240000094610a40f9L16;FFe90300f9e003009194e7ff97e10300aae00301aaf44f46a9f72340f9f65745a9fd7b", + "43a9ffc30191c0035fd637008052a80640f91f0116ebc9070054e00313aaBBBL8;FB4e0100002d0000007369676e65642d7072652d6b65796b796265722d7072652d6b657962756e646c6566696c6520636f756c64206e6f7420626520726561646dL8;FFe81700f97f0600b18096ff54e26300914000805", + "2e10315aa31a2ff97affcff17e8031faa000116ab224f0054e16300919e8eff97bf0600b1400e0054e11740f9BL8;FFc20d00543f0115eb830e0054ff0202eb430e0054e00316aa5e010194880240f9760200f926000014760a40f9c90202ebc315005495fe45d32a0115abc2150054L8;FFe8010054f703", + "00aaf60315aa8002198be1030091e20317aa5e01009468031ccbf50316aaf9031caa1f0540f11731989a9f0344f1a9faff541c000014df0219ebBBL8;FF290500910a0c40f90801098b5f0500b141fcff54e80308ab42040054091840f93f0500b180010054092040f92a0140b24a11c0da4a1540d24a0d0", + "a8b4a250191L8;FF480300f9c80080521d0d0014606641f9616a41f99100001468424e3975420e911f090071ad1b00541f110071e11b005468ca5339fa6700f977ca13917a620e91L16;FFe9b740f9fba700f9fb0316aae9cb00f9e98b40f9fe8b00f9fe0308aae80302aae20301aae1030aaaea0308aa08", + "018052e9b700f9e9af40f9e87300f9ef6741a9BBBBL8;FB22c9f746decba9be0ec6cae9e3ee0000043dba525b25eaa4cce7fc8ed899f5e70095d67df89b9afc3602efec209b380346baef67b60c4ea708f7eb0e22c9a7f2L8;FF830000541b000014e80308ab22030054090840f9090100b42a0140b24a11", + "c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054091440f9BL8;FFe08332917cabff97e8fb42f91f0500b100f50054e80343f9e9f31691e07fc13de9a305f9e9ffffb029213f91e80305f9e8fffff008f11c91e8a705f9e8c31691L8;FFeb7b02f9e87702f9ed7f02f9eceaff97f", + "85b5ca908008092880200f9b50000b4e0df40f9e10315aa2200805252110094b80000b4e00316aae10318aa22008052BBL8;FFf44f05a9fd030091ff8317d1f30308aa08018052ff0300f9e87f01a988e00091f40301aae84702f968ffff9008613e91e07f00a989600191e0c30c91e84f02f9L8;FF4a11c", + "0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9050054280108ab8300005426000014e80308ab82040054090840f9090100b4L16;FF36404ea9e8e700f92b2043a9e92f1fa9352c4ba9e89300f9292044a9e8cf00f93e2045a9eaa317a9284446a92a684aa9e8ab00f9281847a", + "9eaaf18a92a2c4ca9BBBL8;FF63540791e0230091020280528401805279010014089440f91f0500b1a1000054280080521f9c00f91fa012a91f4001b9481c00121f090071e1110054730040f9L8;FFf80301aaf7a30391e52b00f983f2ff97e87740f91f0500b1e00c0054e82300f9e9234fa9e082c33c00", + "630291e82703a9f62351a9e95750a9a0839d3ca8031df8BL8;FF0c3900a96d19001221a80daacbf7ff363f1d00f140f8ff544b1dc0394c2100912e2100d10c3900a96d19001221c40daaabf6ff363f2100f120f7ff544b21c039L8;FF007d20d4f72a0091c17a77f8610100b400008052610600f9210040f", + "9610200f9330400f9610640f9330000f9f35341a9fb7345a94dfeff17734e00a900008052BBL8;FF1f0101ebe0700054e8cf42f9490b8052f4074091948209910969213828040091f69349f9e8d302f9df0a00b1610d0054f9031faa75000014e1d342f9e8cb42f9L8;FF20013fd696825839df0a0071210", + "50054a8008052f5e742f9f4e342f9e8e3163949008092a80240f9690200f9680000b4e00314aa00013fd6a10640f9810000b4L16;FFc0035fd608008092e90300aa1f200039e00313aa280100f9f44f4aa9f65749a9fd7b48a9ffc3029180bcff17ff8301d1fd7b03a9f52300f9f44f05a9fdc30091BBBBB", + "L8;FB310100000d000000bb114000000000004700000000000000320100000d000000b849420000000000c849420000000000c849420000000000c849420000000000L8;FFc0035fd6ff8301d1fd7b02a9f85f03a9f65704a9f44f05a9fd830091280440f9290c40f9340108ab020e00545f0800f1800000", + "54281440f9140114ab620d0054BL8;FF2911c0da291540d2290d098b2925019129fd46d3290500910a2440f9aa0600b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4b0500910a3040f9L8;FF200a01b428fdffd008a50391ec0741b20001c03d08e140f8d90280520000803d08e000f8c80", + "28052e88319a9e16b42f9c10000b4e0031baa22008052fb030caaBBL8;FF030c8052e32f803de08703ada1037dade21b803d95020191a82735a9e18304add9fbff9700e4006fa0833aada0833bada003d53ca103d63ca203d73ca303d83cL8;FF1f0500b160080054e02bc33de85b46f9e07f823de80305f", + "94c000014fb4340f9f4833291480f00b4e89b40f9e9c316910a0000d04ac10b91e9a305f9e9c32791L16;FFc80000b4e08341f9e10308aa2200805259d90094e10314aae88b41f9c80000b4e08f41f9e10308aa2200805252d90094e10314aae16301f981feffb0218c1391BBBL8;FF08050091280800f9e", + "af8ffb43f0108eb73611932600500549369283808050091280800f9e006f8b7e0030aaabfffff17e10300a9e00301aae10309aa22008052L8;FFa0100054e1d342f9e8cb42f91f0101eb60c10054eb074091e8cf42f92a0400916b8109914902805260c1009109692138ead302f9812b0094e1431691ea11", + "0094BL8;FFe00301aa28fc073708fc60d3c80100b5080840921f1900f102020054017c0353210200341f1100f160020054e003082ae20313aae303142ab5ffff97c0fdffb4L8;FFec030daa600100549f010aeb20010054ed030caaae15c038eefeff36cd1d0012bf81037122feff548d090091f2ffff170", + "80109cb8a000014681e00910af17d92BBL8;FFf46b09f9f47349f9e0a3843de0a7c43d4383c63ce85309f9e2a3c43df95709f9f75b09f9e1abc43df95f09f9f97b49f9e00b843de0afc43de3f3863de8e34df9L8;FFc17e035361230034280400511f390071280800546bfdffb06bd10e91890000106a696", + "83829090a8b20011fd6e03400b5a02302d1fcf4ff97a0150036a1fcffb4L16;FFe8c31591a012c93cea8f42f908a10291e98b42f9f7430d91e0d7803d010146ad032dc03debfb42f9f6031aaaece342f9eddf42f9e0c30391e10319ad028543adBBBBL8;FB74696f6e20696e76616c696400000000420240", + "00000000006a000000000000000200000026000000496e76616c69644c656e6774680000004202400000000000L8;FF1f0001eb22280054e81f40f90811008b150540f9f50a00b41b0140f9b7fa7fd358890094e00317aa4100805251890094002900b4f80300aab5833ba9a0c300d1BL8;FFe8031691f40", + "31691e13f02f9290c40f9e103129120013fd6f8c342f91f0f00b12102005468008052f53f42f9f43b42f9e8a3113929008092a80240f9690200f9L8;FF24008052f7e5ff97e10f40f9ea0740f98cffff17e0230091e10308aa020180522300805224008052eee5ff97e92341a98cffff1700fdffd000800f", + "91a3050094BBL8;FF360500b4540740f95e490194e00316aa2100805257490194000c00b4e10314aae20316aaf70300aa5a490194591740f9b7831ff8190400b4541340f951490194L8;FFe9cf40f9e8631139a8f31938e8430691ea2b02f9e97200f8ebf200f8ea7201f807e2fe97e84346391f05007161", + "050054e8a759a9e80302f9e8031091e90702f9L16;FF29a04ba9e9b700f9eaa318a929a84ca9e9eb00f929a04da9e9a700f92ba44ea9e88f00f928a007910001c03deba300f92ba04fa9e0f3803dea2f13a9e8a701a9BBBL8;FFff8200f181090054e81f40f9f95f40b91f4100f1a1090054ed2f44a90af0", + "40f8137040f8166c4039177041b8ea1f00f9680140b9693140b8ac0140b9aa094079L8;FF220080525c690094c1825ef8810000b4c0025ff82200805257690094c10240f9810000b4c00640f92200805252690094c10e40f9a1fdffb4c01240f922008052BL8;FF080500d177ffff17c80080d2e10700f90", + "800f0f2080900d107000014e80b41b2e00700f904000014c80080d20800f0f2080500d1e80300f9e003009187efff97L8;ZDBBL8;FFe8030b91f7430f91f89301b9e91740f90029803da8835af8e0430691e10244ade1830d91e8bb01f9a8e378a9fa9701b92183813c2083823ce10245ade81700f9L8;FF", + "9d250094e0430a91a102198be20314aaf43f0c395f290094e08759ade0830d91e2d7c03de1030e91e00b813de10f813de08757ade213813de0071fade08b58adL16;FFf40301aaf30300aaa8c31fb8a81300d1e0030191a8a73da928feffb008412e91e9038052a1a300d142008052760000b9e00300ade0", + "0301ada8a73ea9f20f0094BBBBBBBL8;FB332e302f7372632f6c69622e7273001545787065637465642030206f7220312c20676f7420c00010496e76616c696420706172616d733a20c00076656e646f72L8;FF49f300f8290080924003c03d690200f96092803c680e00f926aaff97b60000b4e00317aae", + "10316aa2200805252a30094b40000b4e00315aae10314aa22008052BL8;FF9f0208eba9fbff54e00313aae10317aae20314aa11070094770a40f9680240f9080117cb9f0208eba9faff54e00313aae10317aae20314aa08070094770a40f9L8;FF0a018052e40303aaf30300aae023009129f87fd31f0109", + "eb0881899abf0400f1890080524901899a1f0109eb1481899ae30314aa2d140094e80740f91f0500f1BBL8;FFe8f77fb21f0008eba83000549f060071e1010054a8035df81f0500f1402d005428008052a9835df80b050091e003192aa1c300d10a018052ab031ef82a692838L8;FFf50300aae00313aa22", + "0080524b020094610a40f9e00315aad2ffff17e00313aa2200805245020094610a40f9680240f9deffff17e00313aae10308aa22008052BL8;FFe10300aae10300f981feffb021a03d91a3feff9063b00e91e003009102028052440080521ce9ff97e00340f968ffff17c80080d20800f0f2080900915aff", + "ff17L8;ZDBBBL8;FB60000000220000006d697373696e67207071207072652d6b65792049446d697373696e6720707120636970686572746578740000000000007310400000000000L8;FF0811c0da081540d2080d088b0825019108fd46d30900088b36050091df0208eb48180054d000001480220291f5", + "ebff97080040b20811c0da081540d2080d088bBL8;FFe00314aae20317aae80315aa7f8000f1010600540a0c40f90b804039e9031f2a6c0240b94d7c40390080c03c0a0d00f96a3240b84e7041f80b8100394b004039L8;ZFBBL8;FF29e13e91200440a9e82701a9e82300910900009029213a91e82702a9", + "e3430091963f0194fd7b43a9ff030191c0035fd608200091200440a9e92300910a000090L8;FF0015803de93740f9093100f929070091e083c03c0001803de083c13c0005803de083c23c0009803d892200f90c000014e003082ae20313aa630c805269f9ff97L16;FFf00346a9f7030daaed0740f9fe1b4", + "3a9e4a74ba9fadb4aa9e36742a9ef3b47a9b7faff171f0900f1fb5340f9e0bb40f9ebe340f9e93f40f9e88340f9e31340f9BBBBL8;FBf601000021000000d30940000000000055000000000000000402000025000000d309400000000000550000000000000006020000190000004e1a400000000000L8;F", + "F090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb890f0054088c5df81f0500b1c00c0054da020094080040b20811c0daBL8;FFe0fefff000801091b00f0194fd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d30", + "8050091090040f93f0500b1L8;FFe87342f9f97742f9e9df44b9f67b42f9fb0308aa18fd78d328ff60d3e9db00f9e97f42f9377f08533cff78d3f9e318a9e9d700f9f803082a93010014e0d7c53dBBL8;FFce4f0094e82340391f050071e1000054e84340391f0500714c04005428050035e90f41b230000", + "014e99340b8ea0f40b9e093c33ca91b00b9e92341b8aab301b8L8;FF6cf2ff97080000d008612a91e92740f9b42338a9080000b008c10b91a92339a988fdfff008411f91c9048052e8c302f960fdff9000402b91e8cb02f988fdfff0L16;FF3f030aebeba717a90ba546a903015da9eb9700f9e9d700f90b", + "a547a9e04b00f9e3eb0fa9eba709a90ba548a9ebdf00f9e98700f90ba549a9ea2f15a9e9c700f9BBBL8;FF610a40f9680240f91f0101ebe0200054680640f9090a80522a0400916a0a00f909692138e10313aa40f9ff97805641b980010034610a40f9680240f91f0101ebL8;FF1310009497faff17c0fdf", + "ff000401591c2fdfff042e01591210480529d6f0094e2074091c5fdfff0a540169142800991e0031f2ae3031faa340a0094e0431691BL8;FFe8a700a9a82300d1c2fefff042600091e1230091e8a701a99fef0094c0feff9000a01091acef0094c0feffd000a03e91a9ef0094c0feffd000003f91a3ef009", + "4L8;FF211040d30020c11a000400511f00046a01010054440440f95f0004ebe0020054c0020e91e12a0091e20304aa047821f8401840b9e0200035400840f943008052BBL8;FFc1825ff881ffffb4c00240f92200805259330194f8ffff17e80740910881099100210291ed0b0094f4b749f99f0600b100b", + "8ff54f5bf49f9f3bb49f9b51300b4L8;FF7dcdfe97e82340f91f0500b1c0000054e013c03de82b40f92003803da80318f80c000014e8a744a920fdff9000c01091a1a301d1a8a738a9a8e301d1c9fdffd0L16;FF4283c33ca103933c4183c43c4383863cfb4702f94383c63ce18301ad4083c93c4183c83c", + "e20b803d4283c73ce18303ade38b02ad89ffff1735008052e00745adBBBBBL8;FB7a65206b65790000770d4000000000002e00000000000000e00000000e000000770d4000000000002e00000000000000cd0000000d0000006c69627369676e61L8;FF3900028b0001148b629b0094a80357f880030191a", + "1c303d12200805208050091a80317f893970094e80313aabff3143802fd46d313e17a921a154092e20000b4BL8;FF810000b4e01f40f9220080525a1b0194e10f40f9810000b4e01340f922008052551b0194f44f57a9fcab40f9f65756a9fd7b54a9ff030691c0035fd6fd7bbea9L8;FFe007409100401d", + "91e00714adb7300094e08309913217ff97f90300aaf60301aae8830891e043139101810091a44700d1e20319aae30316aa1af1ff97e86b42f9BBL8;FFa70317b8074c41b999b20db8bb677ca9bc0316f8be8316387f0700b100fdff54bc0357b89eb24db83f000071e86300b9fcab00b9bc0356f89e3208b", + "8be835638L8;FFe8a73239c80080d20800f0f229000014f30300aaa00302d1dbf1ff97e00313aae05306f9e083329161fdfff021203f9102028052a3fdffb06304309174000014L16;FFe203833ce80700f9e0230091e80313aa10260094ff830f91f44f42a9fc5741a9fd7bc3a8c0035fd620008052e103", + "14aa8dd70094fd7bbaa9fc6f01a9fa6702a9BBBL8;FF0a088052f4031faaf5ff03a92911c0da490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f60300aaL8;FFe90315aae8000014e81b40f91f0500b1000a0054e85b40b91f010071cd0b005", + "4e8074091e0c3009108810991faa3ff97e83349f94083c03ce93f49f91f0500b1BL8;FF2c3c403929010b0b2b3840394ac100110a68003929c100118d0d00127f7d02716a0d0012096c003909819f1a5f25007129114b0b0b819f1a9f7d02716a010a0bL8;FF080013aae82500b4880080527f0277f28a00", + "80520802a072e903332a6b7e03534a01889a68020072293977924a119f9a3fc969f26c7e015349016fb20dfc50d3BBL8;FFe90500b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091091440f94801088b090100b42a0140b24a11c0da4a1540d24a0d0a8b4a250191L8;FF6083cc3c", + "6183c73ce82700f9c20202ad6083c83cc10200ad02000014e82700f9fc4f40f9f73b00f977aa40f9f96306a9d70400b4080d805278a640f9f57e089bL16;FFa806158be00314aa0201805201f17dd359bb00949b01001497ff48d3e0031baa080c48f81f0500b161e3ff541bffff1728008052e86b00f9cd", + "0300b4fc031aaaBBBBL8;FB02bc000000000000000000000000000000000000000000000000fa9d698a1044db1a0000000000007a134000000000005700000000000000890000003c000000L8;FFf8eb44a9f40319aaf90316aad3fa7fd35c8b0094e00313aa41008052558b009480c7ffb55e000014e043", + "0a91e103049102308052578b0094e00313aa8692ff97BL8;FF29090a8b20011fd6c1825ff841feffb4c00240f9eeffff17280400d11f0d00b1a8fdff54c0825ff8e9ffff17d3e640a9280340f9680000b4e00313aa00013fd6L8;FF21800a91144c00a91f400039f44f41a9fd7bc2a8c0035fd6000180520", + "103805290070094fd7bbda9f50b00f9f44f02a9fd030091f30302aaf40301aaf50300aaBBL8;FFe02ac33d6142833ce12ec33d6042843ce01ac33d6142853ce11ec33d6042803c6142813cb50200b4e00314aae10315aa22008052504b019410000014e90f41b2L8;FFe00313aa080c45f81f0500b1c1fdf", + "f54f40314abe2020054688e48f81f0500b140020054e00313aa84ffff97080040b20811c0da081540d2080d088b08250191L16;FF1f050071c1020054e0430f91a1220091023980525fcb0094e0031d91e1430f91032b0091e20314aa17270094f6a343f9e9a743f9eaab43f9e8af43f9df0a00b1BBBL8;F", + "F606b0194e00313aa21008052596b0194c00000b4e10314aae20313aaf50300aa5c6b0194e00315aae10313aaf44f42a9f50b40f9fd7bc3a8c0035fd620008052L8;FF01f57ed3420080525b6b0094681a40f9a80000b4601e40f901f57ed342008052556b0094682640f9a80000b4602a40f901f57ed342", + "0080524f6b0094683240f9BL8;FFa28339ad1af3ff97a0877cad880080d20800f0f2a9035cf8081100918082883ca003db3c8182893c80828a3ca1837aad880200f989820bf88182843c8082853cL8;FFe20100540e68ed38df0501310df2ff542e0080524d008052090500f9290080520e4100390d45003", + "9090100f9c0035fd6008500a91f0100f9c0035fd6090500f9BBL8;FFffa700a929008052eaff01a9e9230a29b6270194fd7b47a9ff030291c0035fd6ff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9L8;FF190400b4541340f95e2b0094e00319aa21008052572b0094a00", + "900b4e10314aae20319aaf50300aa5a2b0094572340f9b6831ef8b8431fb8f70200b4561f40f9L16;FFcf194092ce1d0013ef21cb9ae90109aae20200546b1d0091eefeff37140000146c0400f1c00600549f2900f14d018052eb031faae9031faaea031faa8c318d9aBBBBBBL8;FB742e72656376206570", + "6f636820c01f3a2043743141636b6e6f776c6564676564202d3e2043743253616d706c65640012506f6c796e6f6d69616c206572726f72L8;FFff4301f9e94b01f9ff4f01f9f35701f9ff5b01f9f56301f9ff6701f9ff7301f9ff7f01f9f98701f9ff8b01f9fa9301f9ff9701f9fb9f01f9ffa301f9e0ab0", + "1f9BL8;FF0811c0da081540d2080d088b08250191c81a488b08050091f40800b4890240b22911c0da291540d2290d098b29250191891a498b29050091200108ab02080054L8;FF20fdfff000e03691b41b0094ff8301d1fd7b03a9f65704a9f44f05a9fdc3009109504039e9020037011040b9155840a9f3", + "0300aae0030091f40308aace120094BBL8;FF86000014fa0300aa39008052e003192a717401941f1c0072e0031aaac1feff540aa440a908038052e00f00f9e0830b91e1e30091ff2700f9f9830b912829089bL8;FFe82300f9e1d3823de0d7823dfacb40f9fc2f00f9f55307a95a1200b4080d8052f6c740", + "f9537f089b565f0094e00313aa010180524f5f0094001801b4080d8052L16;FF0e030094610a40f99fffff17e00313aa22008052230080522400805207030094610a40f9b9ffff17e00313aae10318aae20316aa2300805224008052ff020094BBBL8;ZBL8;FFe00315aa21feff17e063009122008052230", + "080522400805208a3ff97e11740f92efeff17e0630091e10317aae20315aa230080522400805200a3ff97f71740f9BL8;FF68fe4ad309088052f80313aa0811c0da280108cbe90080521f1d00f10831899a29008052360908aa1100001455ff009400058052010180524eff0094800200b4L8;FF634000d1", + "424001d1600001ad600082ad420001f1a8ffff5480003ead80003fadc0035fd6e70300aae40301aa1f0001ebe30302aa80080054250002cbe60702cbBBL8;FF080080927b0600f94e000014b82303d1abab74a9081340b8a9c353b8ac035438e88b00b9a8835538ea3b00f9ea4740b9e9b308b809a340b85", + "f050071aa635478L8;FFe1031baa20013fd6fcf341f99f0b00b1a11200548800805268010014607e42f9618242f9290c40f9e8432a91e1031baa20013fd6f64b45f9df0a00b181210054L16;FFfa0300aaf60314aa62bf0094e97740f93e0700147923442977db40a97c0f40f97ad343a9e8eb00b968e342", + "a9ff0600b175ab44a9e87300f968a745a9c0490054BBBBL8;FBe37c1b5470256922e6653d85e689d33a8fedd8868d89f5fd19435e27785ced96d7a7d1a0a28ca70f97d90000ece3dee68cee90b7e2ccac4e990e5381b2b867f9L8;FFe93700f915030036284d1c9be2031b2a008540a9ccecff97f47f40f9", + "163c0853f303002a35008052e87740f99f0208eb61000054e0a30391528a0094e87b40f9BL8;FFa22302d1630c80521ce4ff97e10300aac0faffb478010014e8534cb948000037f62b06f9202a00b5a02302d125ecff97e80301aae0010036882a00b5e1031faaL8;FFf44f05a9fdc30091f30302aaf4030", + "1aaf50300aa36008052e0630091e1031faa220080522300805224008052ffdb01a9ff1700f9ebebff97e81340f929068052BBL8;FFe333803de22f803de12b803de027803d682600294809c05a6909c05a682601298809c05aa909c05a68260229c809c05ae909c05a68260329f44f5da9fccb40f9L8;FF0", + "831899a89fdffd029d513918a0000102b6968384a090b8b40011fd6088c40f81f0900b1411d0054e8031faa73010014e80300aa098d40f83f0500b140250054L16;FFebab43f9e9af43f91f0900b1e9fb00f901130154e8fb40f96b2201a908008092682a00a9770e0014e8ef41f9e94f00f9e9f341f9eaf", + "b41f9eb0b42f9ef6342f9BBBL8;FF71ffff17e90b41b2e9a300a901ffff17e90b41b2e9a300a96cffff17c80080d20800f0f2080500d1f9feff17c80080d20800f0f2080500d163ffff17c80080d2L8;FF0a078052c8048052ff2719a9a9fdff9029ed0a91e92b1ba9290080d2e1430691a949c0f2e87f1a", + "a9e8271da9af6b0094e80342f9e92350391f0100f1e8179f1aBL8;FFe00313aae01300f9a1fefff021181591a3fefff063a41291e083009122028052640080521cf5ff97e11340f93dffff17ff8302d1fd7b05a9f93300f9f85f07a9L8;FF21cc749223fc44d3630400d17fc024eb23fbff54244000d1ff1", + "040f2a0000054e1fcff9021a0119124d86578843c7cd343040011c6400091730600d1e10300cbBBL8;FFe8cb42f91f0101eb40330054e8cf42f92a040091002302914901805209692138ead302f9d4160094e1431691b60c0094e09b49f9800100b4e1d342f9e8cb42f9L8;FF422a0094e80356b9e007409", + "18100805200001891ff0316b9e84b00b93b2a0094e80356b9e00740918100805200001891ff0316b9e84700b9342a0094e80356b9L16;FFe82708a9b9ab00945eaf0094000481522100805257af0094801300b4e10313aa02048152f60300aa1c04815259af0094e8031faac902088b080900912a054039B", + "BBBBL8;FBef104000000000004e000000000000005707000005000000ef104000000000004e0000000000000058070000050000001d1c4000000000005400000000000000L8;FFfd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090040f93f", + "0500b1600400540a0840f9091440f9BL8;FF88130054bd000014080c44f81f0900b1c1090054f3031faa5a000014e80300aa098d40f83f0500b1e0120054f30300aae00308aa06fdff97e80300aae00313aaL8;FF62008052e86b02f9e96f02f9f97302f9fb7702f9f67b02f9fa7f02f9060b0094ba0000b", + "4e00316aae1031aaa2200805251170094bb0000b4e00319aae1031baaBBL8;FF0109005436008052580100b4f90314aa28174038e91640381f01096be0179f1a6d6c0194180700f11600160a21ffff54e003162a686c01941f1c0072c0070054L8;FF220080525c570094f8ffff17e89340f9c80000b4080", + "5088be00313aa0201805201f17dd354570094e063c13de167c13d9f0f00b1e8a345b9e00718ade82303b9L16;FFfa675ba9fc6f5aa9fd7b59a9ffc30791c0035fd6032440b97f04007108010054091840b949010037e90180520921003909008092090100f9c0035fd61f210039BBBL8;FFe00b00f90800f", + "0f20e000014880080d2b7831df80800f0f219000014e90b41b2e9a300a908000014e80b41b2a0831df813000014880080d20800f0f2080140b2L8;FFe19b49f93f0400b140010054810000b4e09f49f92200805257770094e1a749f9810000b4e0ab49f92200805252770094b30000b4e07b49f9e10313aa", + "22008052BL8;FFf44f02a9fd030091010040f9f30300aa3f0400f18b000054600640f92200805255f70094751a40f9bf0600b1e0010054748643a9e00314aac2020094d50000b4L8;FF211740f9e16a38f8da6200f9f35341a9f55b42a9f76343a9f96b44a9fd7bc5a8c0035fd6fd7bbfa9250000b02aaa9", + "c52fd030091090c40f9270000b0a58c40f9BBL8;FFe183843de28b843de087843d61370194f9431591b40000b4e00315aae10314aa2200805254370194e1e34df9810000b4e00317aa220080524f370194e1074091L8;FF4202805263fdffb063401a9144018052213dff97e14b45f906000014e80f41b2e", + "0432a91e84b05f98c3dff97e10300aae14b05f9e0432a9121fdffd021203f91L16;FFe6030991e0a7c13de10b19ade1abc13d6a410a2aeb914db8e8ff5539e9d14878e2b3c13de00717ad7b810aaae0afc13decf742f92841082aea114ff8e99148b8BBBBL8;FB0800000000000000d452450000000000a1", + "104000000000004d00000000000000e802000005000000a1104000000000004d000000000000005303000009000000L8;FF29010aab620500542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb89040054280108ab830000541b000014e80308abBL8;FFe88305b", + "9e80f40f9e8cb02f9e80317aae0832291e1031691e8c702f9c5dbff97e20f4ba9e0031691e5134ca9e11f40f9aedaff97e8c342f9200bc03dfbc742f9L8;FF49038052e9eb01f909fdffb029a93f91e8d709a908018052f5430c91e9fb01f9c9fcffd029e13991e88f01f9e8a301f9e8b701f9e8cb01f9e8", + "df01f9e8f301f9BBL8;FF490b009105000014ff3e0171e9000054e87e0453490f00916842003908008092682600a9ef000014a8060091822600f109008092e80b0aa9e8830291ff1301b9L8;FFe9df40f9e8a30539e012803d2093c03ce9f204f8e112c03d8092823c8192833ce9c700f9e10740f9010600", + "b599feff17e8b740b92043c23cc0e200912183c33cL16;FFfa5342f9e9ab00f9e92342f9e06fc13de8cf00f9e81742f9e67f42f9e9af1aa9e92b42f9eb3f42f9e8c300f9e81f42f9f28342f9f87700f9e28742f9ea8f42f9BBBL8;FF081d4092e0030091280108aaea2300a92febff9788fffff008a11891", + "4903805268a600a92800805268020039fd7b43a9f32340f9ff430191c0035fd6ff4302d1L8;FF431a00543f0108eb13601932200100542a0440f91f1040f15369283808050091280800f90202005400fc47d3c7000014e10300a9e00301aae10308aa22008052BL8;FF07000014c90080d248008052e0230", + "0390900f0f2e8270039e90300f9e00300918eedff97f44f47a9f65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6L8;ZDBBL8;FF810000b4602a40f9220080525a270194613240f9810000b4603640f92200805255270194b40000b4600640f9e10314aa2200805250270194610e40f9810000b4L", + "8;FFfd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd03009114d440a9f30300aa350200b49682009104000014b50600f1d6c2009180010054c1025ef8810000b4L16;FF691109cb6b808e9a3f030ceb29819f9a5f010beb6b9284d22b49b2f2aa0301d18b24c9f24b92e4f2400700543f030ceb0e0e80", + "5210d0009128338c9a0ce179d3BBBBBBBBL8;FBc000234275696c64696e67205072654b6579576869737065724d65737361676520666f723a20c0102077697468207072654b657949643a20c015202873657373L8;FFfd7b46a9ff0303915ba40014f44f4ba9fb3b40f9f6574aa9f85f49a9fa6748a9fd7b", + "46a9ff030391c0035fd6f90300aae00315aacef9ff97a80e40f9a90240f9BL8;FF5d240194810e40f9a1fdffb4801240f92200805258240194e9ffff17f44f41a9fd7bc2a8c0035fd6ff8300d1fd7b01a9fd430091e10b00a902fffff042a00f91L8;FFb520009440fdffb000800691af200094ffc300d1f", + "d7b01a9f44f02a9fd430091280840f9290040f91f0002f1230f00543f0108eb13601932200100542a0440f9BBL8;FFf30308aaa8c302d1e00302aa7e600094a85775a9b40356f81f0500f1c1010054a81e00121f0500716c090054aafe48d30c0180d2a91e4092eb0f41b20c00f0f2L8;FFf50b40f9fd7bc", + "3a8f7fcff17e8031faa94fcff35e003088be10313aaf2fcff9775fdff34610a40f9680240f91f0101eb60020054680640f9090180522a040091BL8;FF00feffb5a80640f91f0116eb49050054e00313aa14f1ff9740fd073728fc60d3080500b5200840921f1800f122050054217c0353410500343f04007", + "1e0010054L8;ZDBBBL8;FB69642062617365206b65790000000000bb124000000000003800000000000000ab0100001e0000006c69627369676e616c5f70726f746f636f6c3a3a73657373L8;FF09692138280400917f0600b1e81700f9c02f0054802202914bf2ff97080040b20811c0da081540d2080d0", + "88b0825019108fd46d30900088b36050091df0208ebBL8;FFa003db3ca103dc3ca203dd3ca303de3ce3e7803de2e3803de1df803de0db803da82737a9480dc0da690dc0daa82738a9880dc0daa90dc0daa82739a9c80dc0daL8;FF35008052935600a9930a00f9f44f42a9f65741a9fd7bc3a8c0035fd620", + "008052e10313aa900000943ffc3ff16900005420008052c0035fd6fd7bbba9fc6701a9BBL8;FFf44f42a9f65741a9fd7bc3a8c0035fd6fd7bbca9f70b00f9f65702a9f44f03a9fd030091080840f9080100b4090140b22911c0da291540d2290d098b29250191L8;FF80fdff9000a02591b340009480fdff", + "9000002691ad40009480fdff9000602691aa400094ff0301d1fd7b03a9fdc30091080040f9090540f9490d00b40a0140f9L16;FF2ccbff9708008092745601a9686600a97c030014e8e300f9e87740f9a082c63cea3f00f9740080520aad40a9e90700f9e9c747f9a0039d3ce0dbc33dea6b00f9BBBBL8;F", + "B635f6b6579726563656976696e675f6864724865616465725265636569766564686472436861696e63757272656e745f65706f63686c696e6b736e6578745f72L8;FF8a0000102b6968384a090b8b40011fd6088c40f81f0900b1411d0054e8031faa73010014e80300aa098d40f83f0500b140250054f3", + "0300aae00308aad10c0094BL8;FFe0fefff000001f91b0100194e0fefff000c03391ad10019408004039e9feffd029011091e00301aa227968f8e9fefff029013991287968f8e10308aa85100114L8;FF16f9003909110039e96741b909150039e95b41b909190039e95341b9091d0039e94b41b90921003", + "9e94341b909250039e93b41b909290039e93341b9092d0039BBL8;FF152100911600f0f2f7a300910a000014e1e30091a2630091e003082a9ed8ff97001200b5b70f40f9f50317aaa28e40f8020e00b4e10240f9200080398000f8b7L8;FFe80f40f9e8cb02f9e80317aae0832291e1031691e8c702f9fee", + "3ff97e20f4ba9e0031691e5134ca9e11f40f9e7e2ff97e8c342f9200bc03dfbc742f9e9db42f9L16;FF84601a91e2431e9121048052e0e7813de8d303f99cd0009482feff9042601991e00309aae10309aa98d0009480feff9000201b91a8d00094fd7bbca9f85f01a9BBBL8;FF2a0400916a0a00f909692", + "138e10313aa46faff97950a40f9550300b4610a40f9680240f9960640f91f0101eb20340054680640f9490280522a040091e00315aaL8;FF1f0308eb48430054e8cf42f9e10319aae20318aa00011a8b5e7400944803188bf90b40f9fa0740915a830991e8d302f9f88b49f9b80300b4e1d342f9e8cb42f9", + "BL8;FF340d002a3940009118f17dd30b000014680640f9e10316aae20315aa0001178b5cf40094e802158b680a00f9186300f1396300914004005436d77fa9e00314aaL8;FF5f7c0271477c0553421c45d38318039ba400038be9f3ff54ff14007140f2ff54000080d21f000039007d20d4c0035fd6fd7bb", + "ba9fd030091f35301a934000090BBL8;FFe8cf42f929040091e00318aa19692138e9d302f9c81a0094e1431691ba110094080340f91f0500b1a0000054e243169120008052e10318aa04160094e10318aaL8;FF1f0500b140000054a5eeff9775de4ea9970100b4b822009104000014f70600f118630091e", + "000005401835ff881ffffb4000340f9220080524f340094f8ffff17L16;FF807ac03da98318f889565fa94083813ca2837bade81302f9e883029100a10191a103963ce91f02f9e01b813de217813de113813d96150094e20fc13de313c13dBBBBBL8;FB3400000000000000540100001b00000073746f726", + "55f736b69707065645f6b65792063616c6c656420666f72206e6f6e2d6578697374656e7420636861696e00L8;FFfa6702a9f85f03a9f65704a9f44f05a9fd030091f30306aaa600f8b6f4031faae00314aae10313aa8f980094f30200b4f50300aaf60301aaf70302aaf80303aaBL8;FF770a40f9a6ffff", + "17e00313aa2200805212000094610a40f9afffff17e00313aae10316aae20315aa0c000094760a40f9680240f9080116cbbf0208eb69f6ff54L8;FFff0740d1ff0300f9ffc327d1f30302aaf70303aaf90301aaf40300aa22fdfff042200191e0431391e10313aae3008052ff0300f9f80304aa880d0094e", + "86b42f9BBL8;FF69060011a90316381ffd007100edff54896b28380805001171ffff17f44f5ea9f6575da9f85f5ca9fa675ba9fc6f5aa9fd7b59a9ffc30791c0035fd680ffff90L8;FF630c805255ecff97e10300aac0faffb478010014e8534cb948000037f62b06f9202a00b5a02302d15ef4ff97e8030", + "1aae0010036882a00b5e1031faacaffff17L16;FF0e000094760a40f9680240f9080116cbbf0208ebe9f3ff54e00313aae10316aae20315aa230080522400805203000094760a40f997ffff17ff0301d1fd7b02a9BBBL8;FF017d099b02018052f44f42a9f65741a9fd7bc3a8587c0114f44f42a9f65741a", + "9fd7bc3a8c0035fd6fd7bbea9f44f01a9fd030091f40300aa68018052f30300aaL8;FF85000014e8d342f9e067c13de8a302f9680e00f908008092e04f813d6082803c680200f9ff0600f1cacbff54fb010014f7e74df9e80740910103198be00317aaBL8;FFfd030091150840f9160040f9f40300aaf303", + "08aabf0216ebc1010054f50300b4890640f9e904003769d600a9290140b2c8feffd008c10791690e00f9680200f9L8;FF680640f93f0002710801148b62000054010100391c000014e90f80123f002071ea0f801229140033c20000542a7c0653090500394a051a320a01003912000014BBL8;FFab735738", + "a95317384901084aaa835738a96317386901084aab935738a97317384901084aaaa35738a98317386901084aabb35738a99317384901084aaac35738L8;FF5d3c0094fadf49a9e15f40f9810000b4e06b40f922008052573c0094fb6340f9f8c30d913a080014f66b00f9f6fe60d3f44700f9f85f00f9fa5", + "700f9619243f9L16;FFe8eb41f91f0500b180000054e8030e910041019121c5ff97df0600b100960054f50f42f9f40b42f9950100b49822009104000014b50600f118630091e0000054BBBBL8;FB19a5371ae52b637c2f0676d13f9db4d4e9cd827c5878b5c585f3f833d62975437d51d893762144d4a28c", + "553b7cd0802a919500003ed264954975f6b2fd2aa293L8;FF2a5d10534a5a6a784901094a090700791813009128060054400b00d11f0014ebc2250054480100b0084100910103c0791307c07908fddf8848020035480100b0BL8;FFe85346f91f0500b160080054e02bc33de85b46f9e07f823de80305f94", + "c000014fb4340f9f4833291480f00b4e89b40f9e9c31691eaffff904a213f91e9a305f9L8;FFff430191c0035fd628008052f5031faae1031faaffa300a9ff0f00f9e0230091220080522300805224008052ede8ff97e4ffff17ff8301d1fd7b02a9f85f03a9BBL8;FFe20317aa634c0194d602178be0031", + "8aae10317aa22008052f60f00f9564c019402000014f60f00f9e8830091a0820091a182029174480094e86342a9f71b40f9L8;FF080115cb5f0008eba8010054b40000b4680640f9e20314aa0001158b5d4c0094a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaL16;FFeb", + "8f02f9e84702f9e89b40f9f59702f9e84f02f9e8a740f9e59b02f9e85302f9e88f40f9fbb302f9e85702f9e8a753a9eabb02f9e06f813de86302f9e83740f9BBBL8;FFf9031faae00319aae10315aa9668019434008052e8230091a0820091b2680094f50f40f9f5feffb7f80b40f9950900b4546c0194e0", + "0315aa2100805239008052L8;FF9722009104000014d60600f1f7620091e0000054e1825ff881ffffb4e00240f922008052546c0094f8ffff17d50000b4a806158be00314aa0201805201f17dd3BL8;FF8082853ca2037cad8182863c8082883ca10379ad8282873ca203d13c8182813ca10f7aad8082823", + "c8282803c8182833c8382843c76000014e08744ade00314aaL8;FFf30b40f9fd7bc2a8008840f9cbffff1741d03bd5258055b8018c40b9217801123f00056be00400540430029180fc5f888000003585fc0088a0ffff351f000014BBL8;FFe282c23c7f0700b1e08705ade237803d000e0054e082c33ce18", + "2c43ce8a30391e282c53c00630291a0073bade082c63ca2033cade18345ade237c03da1033dadL8;FFe00314aaa6e6ff979dfeff17b50600f1d6620091a0010054c1825ff881ffffb4c00240f922008052532c0094f8ffff17a0c300d1e1031aaae2031baa6feaff97L16;FFf81340f9810000b4e01f40f9", + "2200805259ac0094e11740f9810000b4e00740f92200805254ac0094b70000b4e01b40f9e10317aa220080524fac0094e00319aaBBBBBBL8;FB6167652066726f6d20c0002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e2d6c696e75782d676e752f72656c656173652f6275696", + "c64L8;FFe01f00f9ff7f1fa9ff1701f9ff1301f9ff2f01f9ff2b01f9ff4701f9ff4301f9ff5b01f9ff5f01f9ff7301f9ff7701f9ff8b01f9ff8f01f9ffa301f9ffa701f9BL8;FFc90080d2e8430039480080520900f0f2e8470039e90700f9ddffff17e00700f901ffffd02140119103ffffd063541191e0", + "230091a20080524402805286000014L8;FF09404039290a0037160440a9f30300aae0630591f40308aaf903059117130094f50f56a9e0c30591e10316aae20315aa8a110094fa5f57a9f85b58a95f0b00b1BBL8;FF63c40991e0e31591e2018052e401805221660094f4bf42f90c000014f4c302f9f6bf02", + "f906000014e80b41b2e0c302f902000014c8060091e8bf02f9e0e31591L8;FFa8c301d129feffb029611091a8273aa9e8c30091b35c0094684e41b9290000b029912991f52705a9e9630091aa0000f04af11e91a80319b8280000b008612a91L16;FF0800f0f2080900d19effff17e80b41b2e00700f99bf", + "fff17c80080d20800f0f2080500d197ffff17c80080d20800f0f20809009193ffff17c80080d2e0230039BBBL8;FB481254159819ff1f000117021d1813031e1b190b1408040d1f161c121a0a070c1511090610050f0e1c181420000000001e1e1e1f0f0f140a0a1f0f07190c0615L8;FF22008052230080", + "52240080520ba4ff97e11740f911fcff17e063009122008052230080522400805204a4ff97e11740f960fcff17e06300912200805223008052BL8;FFa1fc0094c0035fd6fd7bbda9f65701a9f44f02a9fd030091160040f9f30301aa20008052f40302aaf50308aac1420091c5fc00942001f8b7c8fefff0", + "08410491L8;FF3f2000f108018052e02300912180889aff0700f984100094e80740f91f00007100019f9afd7b41a9ff830091c0035fd6fb090014ff0301d1fd7b01a9f65702a9BBL8;FF60f3ffb45d000014a88359b848000037b98319f8e1920191a22301d1adc5ff9760f2ffb45e000014a88356f81f05", + "00b161000054bfe736a9bf8317f8e1c20091L8;FF69220b916182ca3c6282cb3c77720ea92001803d6082c93c686e01f968a20b9169aa4ca90001803d68e20b91757201f975420e910101803d68220c910201803dL16;FF403c0054df0600b1407f00543f0400b1f70318aa20020054e10000b422008052f", + "8030baafb030caa53c00094ec031baaeb0318aa3a0100b4e00319aae1031aaaBBBBL8;FB804728c505b6f24a3743000000f9690b4e804a58484b9385668f4c5814e2a74a03680f3d2088b345ca57446b14a881bae51f14c27b7799f0ed28a3e8081261d8L8;FF6b4100916e8541f8cf0140b2ce010d8bef1", + "1c0daef1540d2ef0d0f8bef250191ce194f8bdf010deb230300548c0500f1ed030eaa81feff54ca010aab22020054BL8;FF41efff5400030014e8cb45f9090d8052e037c33d6822099b000d803de03bc33d0011803de03fc33d0015803de98346f9093100f969060091e02bc33d0001803dL8;FFe10317aa", + "980c0094e90f41b206000014e91741b204000014290480d2e80317aa0900f0f2692200a9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9BBL8;FF7f0700f1b60208cb000200541703088b94a2009158018052560800b4818a7fa9c80600d1f8020039160102eba3070054e0060091946200911", + "700028b55500194L8;FFe803088b09f6ffb5b6ffff17e9031faa0a2440f9aaf9ffb50a3040f9e903098b8afaffb5daffff1780fdffd000e03d91a64c009480fdffd000a02391a34c0094L16;FF1b4446a90e9853a9e9231fa9092044a90d9455a9e8cf00f9081047a9e8a71aa9142048a9e8df00f90c2049", + "a9e8af00f909204aa9ea2718a909e007912001c03dBBBL8;FF150109ebe2010054e80f41b2e80700f9e023009191760094e90300aae90700f9a1ffff9021203f91a3ffffb063e00891e023009102028052a40280526e000014L8;FFa16c009420008052c1008052966c0094fd7bbca9f70b00f9f65702a9f", + "44f03a9fd030091350440f9f30300aad50100b4340840f9370040b9340200b451700094BL8;FFc0035fd6880080d2e10700f90800f0f2c9ffff17e80b41b2e00700f9c6ffff17880080d20800f0f2080140b2c2ffff17880080d20800f0f208110091beffff17L8;FF630843aa631043aa2800030a210003", + "0abf0001eb0101070b2130881abfc021eb23feff5421010034226c1c53e303801203d01f3801e01f7800c0228b1fc01f38BBL8;FF080500911f0109eb6828005420ffffd000801091ad2c0194e8031faa000119ab42730054e1431691b70d0094f90b40f9df0a00b100040054e1d342f9e8cb42f9L8;FFe0", + "83269108a10c91000540ade807409108011891e06b823de16f823d7a2cff97e8034bf9fc074bf9fb0b4bf91f0500f181010054881f00121f050071ec040054L16;FFfd7bbea9fc4f01a9fd030091ff830ed100844eade10300aa02328052f30308aae0071bad00884fade00b1cad01804cade10319ad0280", + "4dade0030091e2031aadBBBBBL8;FB72654b65797072655f6b65795f69647369676e65645f7072655f6b65795f696474696d657374616d704d6573736167654b65796369706865725f6b65796d6163L8;FF6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a154", + "0d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebBL8;FF4a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb29030054280108ab8300005410000014e80308abc2010054090840f9090100b4L8;FF5c18009440e900b4e1df40f9e2031aaaf90300aa5f180094e0", + "d7c53de8e351f9f8431391e9b34bf9e0431391e1031faa0083813ce0efc83d22008052e87302f9BBL8;FFe21640d2e08f06adf91640d216140038c45801943f1f00f1a8010054e08744ad80020191a18301d122008052a0073dade08b45ada00b3ead8e54019400e4006fL8;FF20011fd6c1825ff841feff", + "b4c00240f9eeffff17280400d11f0d00b1a8fdff54c0825ff8e9ffff17d3e640a9280340f9680000b4e00313aa00013fd6210740f9L16;FFc2000054f50316aa680240f9df0208eb610b005458000014680240f997621932df0208eb61000054e00313aa55d30094680640f9d50600919f1240f117693638", + "BBBL8;FF880000542800028b08f1df38281cf837a0c300d1b7290094a8035db828280037a8035ef88a0740f9490108eb233700548a0340f9b7835df84801088b882700a9L8;FFe1d342f9e8cb42f91f0101eb20b50054e8cf42f9490180520969213821040091f47749f9e1d302f99f0a00b1e14a0054e8c", + "b42f91f0101eb00ba0054e8cf42f9BL8;FFf44f02a9fd030091150040f9bf0600b160020054148440a9f30300aae00314aac8030094d50000b4a8e279d3e00314aa02018052011115cb4ff80094610e40f9L8;FFe00000b4e8031faa800600f906000014e00313aa0302009460ffffb528008052880600f9", + "09028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd6c0035fd6BBL8;FF64380194e09bc43de19fc43de0031caae2a3c43de8c34ef921058052e0ff833de05fc73d22008052e103843de207843de0f3863de8eb0df94f380194e00314aaL8;FFe1031faae82705f9bfffff17e1031faae8470ab9bcff", + "ff17e1031faae8530ab9b9ffff17e1870ab9eafeff17e1830ab9e8feff17e0dcff54c9010014a0dcff54L16;FF69ce01f9c4f7ff17e11f40f9810000b4e0031aaa2200805257b80094e16f40f9810000b4e04740f92200805252b80094b60000b4e04b40f9e10316aa22008052BBBBL8;FB31003d00135a6", + "852842b003b362c0b1640315f756f31061e110d0d000000000000000000000d00000000000d1100000d000d0d160d007c494c059ea36eca27c5L8;FF5d880094e89340f91f0500f1ab000054e09740f901f97fd34200805256880094e89f40f91f0500f1ab000054e0a340f901f97fd3420080524f880094", + "e8ab40f9BL8;FF4106005433000014a082c03ca182c13c48020090a282c23c400707ad4243803d081140f9a80300b4c8fffff008213f9189ffffb029811a91bb2336a9a84303d1L8;FF880640f91f1100f1c1420054880240f96aae8c52ca8dac72090140b93f010a6b60020054080140b949ae8c5269cca", + "e721f01096b61410054810a41a9e0e30691BBL8;FFf85f0ba9f6570ca9f44f0da9fd430291f30308aa28008052380180d2ff2303a91800f0f2e87f05a9e8830091e00702a9ff7f04a9a80f00f9010800b4e20301aaL8;FF1f0b0071a1070054faa359a92083c13c2183c23ce00600ad808601ade8b700f9b", + "c0000b4e0031baae1031caa22008052514800945f0b00b1c1f2ff548082c23cL16;FFa8e779a9a082c83ca18b7aa9a182c93ce3031baaa282ca3ca4835cf8e037823de13b823dfa0301aae23f823de88304f94a2e0094e8a743f9eab343f9e10314aaBBBL8;FFa2640194ff0304d1fd7b0aa9fc6f0ba9fa6", + "70ca9f85f0da9f6570ea9f44f0fa9fd830291810600b4080d8052e92300913a0080d2367c089bf40302aaf3031faaL8;FFa20c0054aa0217cba8831cf8a8c300d1a02301d1a9ab3ba9f76bff97a8035ef8b7031ff8140117ebe3070054b8237da9b6835ef81501178b680240f97f0a00f9BL8;FF66ffff17", + "c80080d20800f0f2080500d162ffff17c80080d20800f0f2080900915effff17c80080d2e10700f90800f0f2080900d107000014e80b41b2e00700f9L8;ZDBBL8;FF9a0400b4fb0300f95e280194e0031aaa210080523b0080525628019440f8ffb4fb0340f9e2031aaafc0300aae1031baa582801941800", + "0014e8ef41f9080f00b4L8;FFcd22ff97e00740ade0030091600601adb63d0094fd7b44a9f32b40f9ff830191c0035fd6ff4303d1fd7b08a9f94b00f9f85f0aa9f6570ba9f44f0ca9fd030291L16;FFc11800b4201340f9a300001433008052fb1f8052e0030baaf7030baa680000147701198bd80000b4e", + "00315aae10318aa2200805250a80094ab835ff8f91b40f9BBBBBBBL8;FB636861696e20776974682073656e6465722072617463686574207075626c6963206b657920c01120636861696e206b657920696e64657820c00026756e6b6e6fL8;FFfb0b40f99c070091410700919f021cebe10f00f9607b3a78", + "6006005480ff41d31f0001eb82100054880340920800088b1f0101eb820f0054607b6078617b6878BL8;FF536928380cfc5cd308050091290040f9280800f90c0200b500fc55d393000014e10300a9e00301aae10309aa220080520a060094e10340a92aa040a953692838L8;FF5d220094f44f44a9fd7b4", + "3a9ff430191c0035fd65b220094c00280522100805254220094400200b448fdffb008a50391e90741b20001c03d08e140f80000803dBBL8;FFa9e4ff54a0c300d1e10317aae20318aa2300805224008052c7edff97b7035ef8ba035df81cffff17a0c300d1e1031aaa220080522300805224008052beedff", + "97L8;FFe00314aa490180526a0a00f90969213877170094e10313aaf3faff97803240f9800100b4610a40f9680240f91f0101ebc0090054680640f9090180522a040091BL8;FF890248f83f0500b1a10000549f6608a99f7e09a9997e0aa99fb200b981020291e003082ae20313aa02f3ff97201200b520f", + "cffb4d6ffff17890240f93f0500b1L8;ZDBBBL8;FB75726574696d657374616d7000000000920e4000000000005500000000000000ce00000001000000726567697374726174696f6e2d696400650d400000000000L8;FFe00315aa95a2ff97df0600b160b6ff548122029147000014e8031faa000117ab2", + "26d0054e1630091a08fff977f0a00b100040054e11740f9e80f40f91f0101ebBL8;FF1f01096be0179f1a73170194884e4039694e4039b502000a1f01096be0179f1a6d1701948852403969524039b502000a1f01096be0179f1a6717019488564039L8;ZFBBL8;FF200440a9e82701a9e80300910900009", + "029413f91e82702a9e3430091973e0194fd7b43a9ff030191c0035fd6e00700f9200440a9e82300910900009029d13a91L8;FFff470039e80700f99448ff97e80300aa41fdffb02100399183fdff9063a01891e023009102018052a4008052e80700f909000014e00700f941fdffb021003991L16;FFe61f", + "00f9e21700f9e7b300f9e0350054f60309aa28070091e97740f9e88b07f98801009008411f91e9eb01f9e9433c91fb0301aae8ef01f940feff9000103091BBBBL8;FB617373657274696f6e206661696c65643a2065706f63685f7365637265742e65706f6368203d3d2073656c662e63757272656e745f6", + "5706f6368202b20310000L8;FF00feff9000401791b08e009400feff9000001891ad8e009400fefff000600591aa8e0094fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e0030054BL8;FFe2e3823de82300f9e1d3823de0d7823dfacb40f9fc2f00f9f55307a95a1200b4080d8052f6c740f9", + "537f089b55120194e00313aa010180524e120194001801b4L8;FFe87b02f9e8a74fa9f73b05b9fa4305b9e88302f9e8c740f9e97f02f9e90342b9e80b05b9e8af40f9f6af02f9e88b02f9e89f40f9f9b31539e88f02f9e8bf40f9BBL8;FFf60f40f9e80740f9080116cb9f0208eb29f7ff54e0230091e103", + "16aae20314aa2300805224008052c3ddff97f60f40f9b1ffff17ffc307d1fd7b19a9fcd300f9L8;FFfd7b41a9ff830091c0035fd6ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191350840f9fa0301aaf30300aa750500b4540740f9L16;FF0ba040f9eb1f00f90bb054a9e", + "c7b00f914b055a9ecd300f90db056a9ed6700f9ecef00f90db057a9ed5700f9ec6f00f90db058a9ed5f00f9ece300f90db059a9BBBL8;FF610a40f9e00315aa5afeff17e00313aa220080522300805224008052c6fdff97610a40f974feff17f50300aae00313aa220080522300805224008052befdff97L", + "8;FFe20318aa4d110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aa44110094fad342f9fc0740919c83019190fbff17f60300aaBL8;FF08050091290040f9280800f90cfeffb40a7c15533f0108eb53611932200100542a0440f90bfc63d35369283808050091280800", + "f98b0200b5e0030caa1b000014L8;FF600a00f94218152a641a40b9e403242a6300040b631e00b9130000f9600a40f903204039231000330320003975424079601a40b9610640f9b54e14124200152aBBL8;FF5f0308eb4832005401020014e1d342f9e8cb42f91f0101eb408b0054e8cf42f9490a8052f4", + "074091948209910969213828040091f67749f9e8d302f9df0600b1L8;FFe10309aae20f0ea9c2e00191e3031f2ae74300f9e4170ba9e62b0ca9ff730b79ebef02f9ebf302f9fff702f9e4170fa9e61f10a9ea8b11a900013fd6e0e302f9L16;FFe18a0fade38210ade40242ade48211ad60b200946022009", + "1e1c30991023e80525cb2009448008052e0a3019175fe00f9680200f91fb9ff97ff831791f44f43a9BBBBBL8;FB6e74696669657273656c662073656e64206f662061207365616c65642073656e646572206d65737361676512626164204b454d206b65792074797065203cc320L8;FFa24700d141048052", + "9f96009400feffd000603591ad960094ff4300d1e8031f2ae93300910801204b087d1f53e8330039e0334039ff430091c0035fd6ff0301d1BL8;FFc0035fd620008052e10317aa9616019420008052e10319aa9316019420008052e10318aa9016019420008052e10316aa8d16019420008052e10315aa8a", + "160194L8;FFe01b813d4083c63ce11f813de1efc83de223813de2f7c83de027813de0f3c83de12b813de02f813de233813d9200001408008092880200f9d300001408008092BBL8;FFedfeff1728028052bf231b3899ffff9039231291a8031b78bf731b381fb300b8ba035bf8e4feff17e8031faae93200", + "d103000014e8031faae92a00d18a1f4092L8;FFfa830291e8fb42f91f0500b1201e0054e80343f9e07fc13de9c31291e0833291022b8052e86702f9e8c31791018100912081803c575a009440030291e2833291L16;FFc3e0ff97e10300aa401d00b5e8af40f91f011beb49060054a0c303d112e7ff97801", + "c003728fc60d3e81a00b5200840921f1800f1e21a0054217c0353011b0034BBBL8;FFfd7b03a9f44f04a9fdc300911f1c007280010054c80080d2e0230039ff2700390800f0f2e0030091e80300f98b800094f44f44a9fd7b43a9ff430191c0035fd6L8;FF8b000054e01f40f9220080525a7a0094ff0600", + "b1e1000054e83340f91f0500b180000054e8c3009100c10091b00e0094ff074091ff833c91f44f45a9f65744a9BL8;FFfd7b44a9ff830191c0035fd6ff8301d1fd7b04a9f32b00f9fd030191f30301aae10300aae0230091e2031f2a4efeff97e90740f9e82740b9aa058052e1230091L8;FF6d11889a1f0", + "056f2ad014cb26b018d9a8c010e6a0ee479d30d7c1f536811889a3f01007208e90eaaeb030d2a0d0045924b210baa0a0149b20e054ab24a11889aBBL8;FF800640ad80020191e103009122008052080d17aae00700ad080dc0da881e00f9820241ade20301ad92360194882648298a2e49299682003980a2", + "0191e1030091L8;FFe90302f9290080d2e81b02f9c8048052a934c0f2ea1f02f90a078052001f813dfff301f9e8fb01f9ffff01f9ea0702f9e81302f9e91702f9ac360094e1f343f9L16;FFb5620091e0000054a1825ff881ffffb4a00240f92200805257ba0094f8ffff17d70000b4e806178be00316aa0", + "201805201f17dd350ba0094e96f40f908008092BBBBL8;FB76217d3160016b115a6151714c4147512ea125b13881339102e109f114c11fd1cd31c621db11d001e171ea61f751fc4195b19ea183918881b9f1b2e1afd1a4c1L8;FF1100001440008052560080525c0080525b0080525a00805259008052580", + "0805257008052500080524f0080524e0080524d0080524c0080524b0080524a008052BL8;FFe00240f9220080525b0a0194f8ffff17e89340f9c80000b40805088be00313aa0201805201f17dd3530a0194e063c13de167c13d9f0f00b1e8a345b9e00718adL8;FFc91a498b29050091280108ab43010054", + "09010014e8031faab70a40f957fdffb5b61640f9e803088b36feffb5e80308ab22200054b42240f9740100b4890240b2BBL8;FF349b40f95f4a0194e00315aa21008052584a0194e00d00b4e10314aae20315aae00b00f9f52300f95a4a0194353b40f9345341b9285741b9e83f00b9550500b4L8;FF0000", + "0b91b146009480fdffd000e00191ae46009480fdffb000a02391ab46009480fdffb000a01691e1031faac0035fd6c0035fd6e30302aae20301aa81fdffb0L16;FFe8a744a9e55304f9f77304f9e82b04f9e83b40f9e92704f9e97f40f9e83304f9e84340f9e98b04f9e94b40f9e83704f9e82340f9e98f04", + "f9e83b04f9e87b40f9BBBL8;FFe0080054381f40f9da0000b4080d805200a30191e10318aa427f089b026b0194080480525f3f1ff11f4f00a91f2304a9142305a9480700911f7f01a9137f02a9L8;FF604240f922008052f44f42a9f65741a9fd7bc3a8586a0014f44f42a9f65741a9fd7bc3a8c0035fd6f", + "d7bbea9f30b00f9fd030091090040f9e8008052f30300aaBL8;FF200840921f1800f102070054217c0353210700343f040071c00300543f080071e00100543f0c007121fdff5488824bf81f0500b1810000549fe60ba99ffe0ca9L8;FF6100010b4873a7723f00086bc3000054000400b1a600005408c086", + "52a88cb8722100080bc0035fd6fd7bbfa9fd030091c0fcfff000241d91a1058052e20304aaBBL8;FFe8cb40f98082c53c8182c63c8282c73c1f0500b1e00600ade20a803d200c0054f91300f9f9430691fbe300912083cc3c2183cd3ce81f00f9e81b40f92283c33cL8;FFe10315aae20314aa7ce8ff9775", + "0a40f9e10316aaeeffff17281040b96800c8376800d037c1260014b2260014b32600140800403949fdffd029612e91e00301aaL16;FFc0035fd6fd7bbea9fc4f01a9fd030091ff830dd100844cadf30308aae8a70891026cc03de9e70891e10300aa0232805200f18f3c08e040f9e023009121f18f3cBBBB", + "BBL8;FB6f7220c0023a20c0002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f62797465732dL8;FFa9031ef8c1f8ff54006300919f990094c3ffff17f7031faa18038052390080520c000014e80740f9e083c33cf7060091a822", + "189be92740f9aa060091ff4200f1BL8;FF60008052e30313aaf44f42a9f50b40f9fd7bc3a812faff17e00313aa220080520e020094610a40f9dbffff17f50300aae00313aa2200805208020094610a40f9L8;FF810000b4e00315aa220080525a1e0094e003c03d280080529a6200a9996e01a9800a803d6", + "8320039f44f4ba9fb3b40f9f6574aa9f85f49a9fa6748a9fd7b46a9BBL8;FFf85f03a9f65704a9f44f05a9fd030091ff030bd1e10300aaf40300aaf30308aa298c41f83f0500b140010054e0030091f50300914a130094f70340f9e0c30591L8;FF7df8fe97e8fb42f91f0500b100f50054e80343f9e9f31", + "691e07fc13de9a305f92900009029c10b91e80305f9280000b008912991e8a705f9e8c31691ea032d91L16;FFaaebff97b7010034610a40f9680240f91f0101eba0090054680640f9090180522a040091e00317aa6a0a00f909692138e10313aa9debff97560300b4610a40f9BBBL8;ZBL8;FFe227843d8b", + "7a0094e007409100800991867a0094f50300aa5a7e00940008805221008052537e0094c09701b4a10241adf40300aaa20e40ad010001ad020c00adBL8;FF63203e91c4fefff084400591a20700d1610580529cfa0094c0feffd000a03e91c3feffd063203e91c4fefff084600991a20700d16105805293fa", + "009408fcdfc8L8;ZFBBL8;FF81088052983a019420008052c1068052953a0194ffc301d1fd7b05a9f33300f9fd430191f30308aae8230091c33a0094e82340391f050071e1000054e8434039L8;FFe84b05f968fdfff008411c91e94f05f96903805240fdff9000a41291e8f301f9e1432a91e8fb01f968f", + "dfff008e12391e3830f9162008052e9f701f9e9ff01f9L16;FFe84b00f9e8d743f9e84300f9e8db43f9e82700f9608c0054e8d343f9eac743f9fb031c91e04700f9f5ff5e39e0831d91e82b00f9e8e35e39e16f00f9e1030e91BBBBL8;FB7c1c68cf8a14d4c2dfa47d287026a4e47b400668764ed2aaa9ea", + "af82d9cc0b66a28c926eed22000052a40c87415afd8c210dbdee0afa8b2e98bb0f14d86a9b22L8;FFa20ac03d000400ada0c2c23c3f0108eb0208803d00c0823c01fdff54f30300aae0430a916de4ff97e00313aaf34f41f9e2ffff1733008052590d00b43f0700f1BL8;FFe0a33239e8a73239c80080d20", + "800f0f229000014f30300aaa00302d1a2e9ff97e00313aae05306f9e0833291e1feff9021203f9102028052e3feffd063e41c91L8;FF08e000f8c8028052692200a989008052602201a9e8fcffb008310291682602a9e10f40f981faffb4e00315aa22008052510e0094f44f46a9f65745a9f85f44a9BBL8", + ";FF2914c0392b1d00124a1d0b0b4a0102510901f83708710a8bca00805208a800a91f0000f9fd7b44a9ff430191c0035fd65f114071630a00542918c0392b1d0012L8;FFcd030094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb890f0054", + "088c5df81f0500b1c00c0054L16;FFf69b00f91f0900f1e1b300f9ea5b00f9ef6f00f9f24b00f9e9050054880100f008411f91e03300f9e86705f968fefff008e11e9129038052e8a303f940fefff0BBBL8;FFc0035fd6e0031f2af44f44a9f65743a9fd7b42a9ff430191c0035fd6ff8301d1fd7b04a9f3", + "2b00f9fd030191f30308aae8230091306b0094e82340391f050071L8;FF1f050071610f0054e043c73ce143c83c03e4006fe283cc3ce8430691e0c30e91808506ade083cb3cc1e20091e2430e91fa030b91808907ade3838b3ce3838c3cBL8;FFe00301aaff430b91f44f45a9f65744a9f85f43a9fa6742a", + "9fc6f41a9fd7bc6a8c0035fd6b8fefff0183f0a91f9c303913b0080921600f0d21700809207000014L8;FFf96b44a9e00314aaf35341a9f55b42a9fd7bc5a8c0035fd6e1141a123f003f7161efff549affff176bf7ff97140080d281018052010000b9f3ffff177500156bBBL8;FF63a0219124ffffd0842", + "0059142800991a1038052480300399b2a019420ffffd000e0009122ffffd042600191e1038052982a0194e04316912200805207120094L8;FFe0031aaa010480522200805228031c8bf6032491000500ad572e0094e883249181830091e00319aa08410091d8d4fe97bb0000b4e00319aae1031baa220080", + "52L16;FFf65702a9f44f03a9fd030091ff831ad1ff0300f9f50302aaf40301aa200442adf30300aae023029102328052f60303aaf7230291e00702ad200843ade00b03adBBBBBL8;FB42024000000000006a00000000000000dc0000002e00000042024000000000006a00000000000000750000002e0000", + "0042024000000000006a00000000000000L8;FFab2355382901084a4a01084a6b01084aa9031538a9335538aa131538aa4355382901084aab231538ab535538a9331538a96355384a01084a6b01084aaa431538BL8;FF691e40f9090100b4290140b22911c0da291540d2290d098b2925019129fd46d3290", + "50091280108aba2060054694240b93f0500716102005469aa4829c9030034L8;FF091d0039e96741b909210039e95b41b909250039e95341b909290039e94b41b9092d0039e94341b909310039e93b41b909350039e93341b909390039e92b41b9BBL8;FFb6031cf89f0216eb00240054a8835bf80902805", + "2ca060091a14301d109693638e82340b9aa031cf8e003082a3fdcff97a1035cf8a8035bf81f0101eb60230054L8;FFf4031691e13f02f9290c40f9e103129120013fd6f8c342f91f0f00b12102005468008052f53f42f9f43b42f9e8a3113929008092a80240f9690200f9680000b4L16;FFab000054e007", + "40f9e10314aa2200805259d60094f41b40f99f0600b1e0010054f38743a9e00313aac6e1ff97d40000b488e279d3e00313aa02018052011114cbBBBL8;FF60310054680640f9490280522a040091e00315aa6a0a00f909692138e10313aa42fcff97770a40f9680240f9080117cbbf0208eba83000546806", + "40f9e10316aaL8;FF080040b20811c0da081540d2080d088b0825019108fd46d30900088b390500913f0308eb681f005431010014e1d342f9e8cb42f91f0101eb00750054e8cf42f9BL8;FFf30300aa810000b460ce40f92200805259f6009461d640f9810000b460da40f92200805254f6009461e240f98", + "10000b460e640f9220080524ff6009460220091L8;FFf51340f9e20313aae00314aa01008052f35341a9fd7bc3a8c2f6ff172e01001410050014fd7bbea942008052fd030091f35301a9f30300aa200080520120c11aBBL8;FFe2ab843de09b843de19f843dce8e00948083c23c8183c33ce85748f9f9334", + "8f9e06f833d8083c13ce173833d8183c03ce8eb06f9e06b833de167833d27000014L8;FF000500ad0209803d89020094f5ef41f9e8e741f9bf0208eb61000054e0230f9189d4fe9708068052e1eb41f92223c03da906089b200743ade8b34e39a2060091L16;FFdcffff17e0030e9188c1ff97daf7ff17e8", + "c31591002100918fbdff97e06740f9e10f40f9610000b42200805252b60094b80000b4e08b42f9e10318aa22008052BBBBL8;FB69676e616c6661696c656420746f206465636f64652070726576696f75732073657373696f6e2070726f746f6275660000000000000000001000000000000000L8;FF0801", + "00b4090140b22911c0da291540d2290d098b292501910819498b08050091892680b9a9050034290140b22911c0da291540d2290d098b2925019129fd46d3BL8;FFb44303d133eaff97e8ffffb008c11d91e92740f9b42338a9c8fffff008213f91a92339a9e8feff9008210c91c9048052e8c302f9c0feff", + "b000402b91e8cb02f9L8;FF5d060094e12740f9fb0315aa810000b51a000014e10316aa160300b4e0031baa2200805254060094b80200b518000014f70400b4e02b40f9e10317aa22008052BBL8;FFeb6f40f9f86340f93f0400b1ea7b40f9e98740f9ee1341b9e81741b9ed1b41b9ec1f41b9fa5b00f940", + "030054fa0300aae0c30291ecbb0729ed3300b9eb2b02a9L8;FF690480520a00f0f2e8a716a95a1100d1e10740f9a1e6ffb59efdff1780fdffb000802c9183fdffb06320259184fdffb084602d91a24700d1e106805292420094L16;FFe9e740f9f8031caae50316aaf60318aae37b00f9e9bf00f9e92b40f", + "9fc030faaf88f53a9efa740f9e62704a9e91740f9e20300aaf5f700f9f5030aaae09bc33dBBBL8;FF490000f029d12e91a82739a9e8830091c90200b029a11f91aac301d1a00700d1a8273aa96800805289fffff029a91791e1e30091f91300f9e8a706a988ffffb0L8;FF08020037680240f9080540f915", + "0100eb62020054e80f41b2e80700f907000014c90080d248008052e04300390900f0f2e8470039e90700f9e0230091876cff97BL8;FFf44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf40301aa11f3ff97e80300aae00301aa08020037750240f9a80640f9160100eb62020054L8;Z", + "DBBL8;FF5d260194688640f9a80000b4608a40f901f57ed34200805257260194689240f9a80000b4609640f901f57ed34200805251260194689e40f9a80000b460a240f9L8;FF410300b4000840f922008052f44f41a9fd7bc2a85826001413d041a9880240f9680000b4e00313aa00013fd6810640f9c10", + "100b4820a40f9e00313aaf44f41a9L16;FFf65746a9f85f45a9fd7b43a9ff030291c0035fd6e9719cd2d53240f909c7b1f2691cc7f2c971fcf2a97ec99b29fd45d3290d098b29f57ed3ab0209ebeb0700f9" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines3 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines4.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines4.lean index 0fbddce87..6bc350e95 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines4.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines4.lean @@ -27,361 +27,253 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub4 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF0efa07370c000014ce1d40928e696e388ef90f3708000014e8031faaeb031faa610108cb0000088bc0035fd6e8031faaea0300aa5f0109eb40ffff54cc0400d0L4;FF6b008052430000143f004871030b00544b0dc0396c1d00122c540c0b810148516b00f8378b0080523a0000142b7c", - "1c534b0a00344d11c0390b00be522b000b0bL8;FFe8031faa8902009029210e9136008052040000148902009029e11e91e80316aa9f0215ebf40300f948010054ca02148b132001a9092800a9f44f46a9f65745a9BBL4;FF000400ade00340f9f4ebff979c1b00b4e0031aaad7000014e00b40f9e10314aa", - "2200805273a00194f81b40b9e8031b2abf02186bfb031aaa7c0208aa42f6ff54L4;FF21c0029124d86578843c7cd343040011c6400091730600d1e10300cb637c4093210013ea6318049b631000d1c00400540000018be5ff9f52010006cb21fc44d3L8;FFe803009142018052c6a00094810100d0211015", - "91a40100b084a00e91e0030091a363009142008052b30f00f9bea0009468020291810100d021181591a40100b0BBBL4;FFd70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb038500541803008bf9feffb50f000014L4;FB002f63617", - "2676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f62797465732d312e31322e312f73L8;FF220080527be00094e11b42f9810000b4e01f42f92200805276e00094e8430f910001029170d9ff971d120014e80301aa190340f90dadc0a90701", - "4ba91cf940f9BL8;FFf44f42a9f65741a9fd7bc3a8c0035fd600018052010880528e600194fd7bbea9f44f01a9fd030091010040f9f30300aa3f0400f18b000054600640f922008052L8;FF220080527b600094e10313aae82b40f9c80000b4e02f40f9e10308aa2200805274600094e10313aae10700f92", - "10100d021203891230100d063083991e0230091BBBBL4;FF41fdff54f4ffff17e0e7076f01696bfc6c2100d18a010a8a0a010a8b420140fd218c202e408c202e2c00669e0d00669e8c01c0daad11c0da8c11c0da8cfd43d3L4;FF28008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c00", - "35fd620008052800600f909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6L8;FF13601932200100542a0440f91f1040f15369283808050091280800f94202005400fc47d36e000014e10300a9e00301aae10308aa220080522300805224008052BL8;FF82008052b30f00f9c7800194c7800194", - "fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa010300d021e01d91L8;FFf65747a9f85f46a9fa6745a9fc6f44a9fd7b43a9ff430291c0035fd6880341d2e90080521f2d00f10831899a490100b0296122918a0000102b7968784a090b8bBBBL4;FFdf0", - "600b1e0079f1af44f5ca9f6575ba9fc5f5aa9fd7b59a9ff430791c0035fd6ff0302d1fd7b06a9f44f07a9fd830191090c40f9f30308aa3f0500b100020054L4;FB656e6465725f726174636865745f6b65795f70726976617465636861696e5f6b65796d6573736167655f6b6579730000af7b4900000000", - "004e00000000000000L8;FFe8830291812200910001029147140094a00f7bad480080d2e107c13de20bc13d0800f0f2f6d70da9161900916383853ca303d83c6083843ce00fc13d6383863cBL8;FF43f8ff54daffff17e083c03ce80f40f96002803d680a00f9f44f49a9f73b40f9f65748a9fd7b46a9ff8", - "30291c0035fd6e0230091e1031faa76ffff97a9ffff17L8;FF7f0a00f99f0208eb08040054f7031faa08011fcb9f0208eba8040054340100b4680640f9e10315aae20314aa0001178b78400094e802148bb502148b680a00f9BBBBBL4;FFf70700f9210400d021602191230400d063482291e0230091a200", - "805284018052d5040194e00740f94ffeff17880080d20800f0f20811009148feff17e00b40f9L4;FFa04700d13cc2ff97e0b300b9a04700d139c2ff97e0af00b9a04700d136c2ff97e0ab00b9a04700d133c2ff97e0a700b9a04700d130c2ff97e0a300b9a04700d1L8;FFe94b40b9eb6304b8ebc344f8ea", - "170139ea2b0139e9b304b8ea3f0139eb2b00f9e85b00b9b110019420010035e083c03ce80f40f96002803d680a00f9fd7b47a9BL8;FFe00314aa0101805277900194601900b4080d8052fb0300aaf4031faa567f089bf7031aaae10318aadf0214eb80020054a0e301d1f70600d138a001917c03148bL8;F", - "F290d098b2925019129fd46d3290500910a0840f94a0400b40b0440f9ed031faaec030aaa6b4100916e8541f8cf0140b2ce010d8bef11c0daef1540d2ef0d0f8bBBBL4;FFf3031caa760f00f9e8af40b9fc031faad6deffb580feff1728008052e82700f9e15b40f9810000b4e05340f92200805270d0019", - "4b90000b4e0031aaae10319aaL4;FBbb4de8820000000036d9c917000000000000000000000000aa6211b800000000000000000000000000000000000000000000000000000000056bda5e01003010L8;FFf20319aafc0748a9f90305aae69f43a9e03717a9f45f49a9f57b40f9ed0740f9e56f40f9e0374", - "0f9ee3f40f9ebe300f9eb0312aae0f3803dfadb4aa9e193803dBL8;FFff4301d1fd7b03a9f32300f9fdc300913f040071f30300aae102005428008052c90200f029612791ff2300a908048052a06300910800ac72e1630091a21b00b9L8;FFe8d302f96ee4ff97f58740f9e8031691e00315aa52500094a8", - "624039fbc342f9f5c742f9f7cb42f9e8631639080100f008410691e8d302f9e80180522083c13cBBBBL4;FFe80300f008d12391a9038052e1230191e203009103048052e8a704a9e00300add5390094e8230191e00300910104805278cb0094e82341391f05007180020054L4;FB656420746f2072616e67", - "655f666f725f726563697069656e745f6b65795f6d6174657269616c0000859248000000000033000000000000002307000009000000L8;FF63b41e91e003009122028052a401805209000014e00300f9210200d021701e91230200d063101591e00300912202805244008052d0e4ff97e10340f99fffff1", - "7BL8;FF94e2129168a20191e10200d021882b91e0230091a32300d1e2018052e40314aaa8831ff8c070019468b20191e10200d021401891a32300d102018052e40314aaL8;FF8000005480220291e1431691351200943f0700b1f90b40f9e07aff5400c303913c010014e8031faa000119ab62640054e143", - "1691310d0094f90b40f91f0700b1BBBL4;FF220080527bb00194e18340f9810000b4e08740f92200805276b00194e0430291a498ff979bfeff17a85300d16903009029b10d91600300b0002c0d91620300d0L4;FF01000014c0035fd63f4000f1e20300aaa80000543f0002eb68000054e00302aaf708001", - "4ff8300d1fd7b01a9fd4300913f2000f108018052e02300912180889aL8;FF9ab00094e8830091a50100d0a5002c91a1a301d102c10091e0031f2ae3031faaeab00094c201009042a03791e10300aa75b00094fd7bbba9fc0b00f9f85f02a9BL8;FFe85b06f9ff5f06f9ea6706f9e87306f9e97706f98330", - "0194e1fb44f9810000b4e0ff44f9220080527230019468b240f9080700b4e1f342f9e2f742f9e8833291L8;FFe0830f91a2028052fb6300f9d8090094e8fb41f9f6e743b9f5031faaf7e343b9eaf741f9e86b00f9c80080d20800f0f21449009168008052e85700f96cf8ff17BBBBBBL4;FF880240f96800", - "00b4e00313aa00013fd6810640f9c10000b4820a40f9e00313aaf44f41a9fd7bc2a872180214f44f41a9fd7bc2a8c0035fd6fd7bbea9f44f01a9L4;FFd6018052090000f9086000f8a1035ef8810000b4a0835ef82200805275180094bb0000b4e00319aae1031baa22008052701800943a018052f90318a", - "afb0316aaL8;FFf96300a9a873003997180194a0000035d60600f1c1feff54e0031f2a0200001420008052f44f45a9f91340f9f65744a9f85f43a9fd7b41a9ff830191c0035fd6BBL4;FF600400543f20007181f5ff54a8035bf81f0500b1e00a0054e1a20291a2e300d19a81ff9720f5ffb4d6000014a88", - "350f81f0500b1c0030054a1e303d1a2e300d1L4;FB2409aa0acc0cff0f481254159819ff1f000117021d1813031e1b190b1408040d1f161c121a0a070c1511090610050f0e1c181420000000001e1e1e1f0f0f140aL8;FFaa835838a96318386901084aab935838a97318384901084aaaa35838a98318386", - "901084aabb35838a99318384901084aaac35838a9a318386901084aabd35838BBBL4;FF84603791e0031faaf70301aae1031f2ae3031f2af50308aaa6d8019402a09152c40300b084c03791e204a072e3031f2aa0d801941f0017eb410100543f00166bL4;FB6e74756d726174636865742d623538643766", - "353665333634356363642f303639353962342f7372632f636861696e2e7273002f636172676f2d72656769737472L8;FFe8db45f9ebeb45f9ea2313a9e80b46f9eaef45f9e87b00f9e81346f9e8d300f9e82346f9e86f00f9e84346f9e8f700f9e8008052e87300f908008092e99b1ba9BL8;FF3f0900f12", - "3c7ff54080141d2e90080521f2d00f10831899a1f2500f128230054e902009029d113918a0000102b7968784a090b8b40011fd6f37749f97f0600b1L8;FF02150054217c0353c11500343f040071200100543f08007141fdff5401a30491a22302d1c6f3ff97602b00b5e1031faae9ffff17002900b5a023", - "02d19ef4ff97BBBBL4;FFe017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aa74f80194e08741ad28008052e217c03d800600ad820a803d68720039f44f49a9L4;FB656e646572206d6573736167652076657273696f6e20c0001f756e6b6e6f776e2073657276657220636572", - "74696669636174652049443a20c00014626164204bL8;FF0800f0f2ff270039e80300f998edff97e80300aae80300f94102009021bc19914302009063f41991e0030091c201805264008052d0ecff97e10340f9e00301aaBL8;FF1f0d00b1a8000054e00319aae1031caa2200805277780194480700d11f0", - "d00b148f5ff54e03340f9e1031aaa6900001408008092686e00a95700001408008092L8;FF091ac0f2ff3309f9e83b09f9ff3f09f9ea4709f9e85309f9e95709f981780094f6ef47f9e01bc43de11fc43de0431691e8036179e143069102738052e057813dBBBL4;FF78b80194130b40f9930200b4140740", - "f974b80194e00313aa2100805272b80194802c00b4e10314aae20313aafa0300aa78b80194e0031baad48f0094e8031baaL4;ZDL8;FFe8434039e00313aae10316aae20315aae30314aa1f090071cce8ff5467ffff17e00b40f92200805272b8009448008052e91f80526842003969220039f44f48a9BL8;", - "FF020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb29030054280108ab8300005410000014e80308abc2010054L8;FF01a140b960fe41f9280d40f900013fd6607e02f9618202f948fdff17ea5f40f9f6fe60d3f4031aaae95740f968c6533935fd48d34", - "80c00376d000014f85f45f9BBBBBL4;FFe9031faae00317aae30318aa69f4ffb48fffff17e00319aafb080194e30319aae80300aae90301aae00318aa48f7073687ffff17c0000054c80080d20800f0f2L4;FFff030291c0035fd6ffc301d1fd7b02a9f91b00f9f85f04a9f65705a9f44f06a9fd830091f6", - "0302aaa200f8b6f9031faae00319aae10316aa7b080094f40304aaL8;FFe92b01a9aa080194fd7b42a9ffc30091c0035fd6ffc300d1fd7b02a9fd8300910a0040f969018052e80301aae50300aa4b0141d25f0100f14a0200d04ab13d91BL8;FF3f05007161020054691641b9290140b22911c0da291540d", - "2290d098b2925019129fd46d3290500916a8640f98a0100b512000014e80316ab83fdff5420030090L8;FFe00315aa4100805277880094e01f00f9601500b473880094e00315aa4100805271880094e01b00f9a01400b46d880094e00315aa410080526b880094e01700f9BBBL4;FF96ab00f9b2ffff17e8", - "cb41b94800003796a700f961330191a26301d1aab2ff97e0f5ffb456000014a26301d1830c805281aeff9740f5ffb4460000149fdb11a9L4;FB6c6564002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f30363935396", - "234L8;FFe8e340b9e067813d6013c13ce8e31539681340f92091883ce8c702f98e1a0094efb343f9ff0900f141410054e16740f9810000b4e00315aa220080526dc80094BL8;FF3f1d00f129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f60300aa080014eb23100054ff", - "0208eb09010054e0e30091e10317aaL8;FF7f480094fd7bbda9f65701a9f44f02a9fd030091140840f9f30300aa3f0002716200005435008052080000143f0020716200005455008052040000143f404071BBBBL4;FF79e80194403e00b488ae8e52e90300b029412f9148aeac72200540ad082000b98802", - "80d2890480520800f0f2c0a601a908110091000400adc8a600a948008052L4;FB3821400000000000200000000000000008000000000000003ca04000000000003821400000000000200000000000000008000000000000006ca1400000000000L8;FFe0c3c03d0011803de0c7c03d0015803de0cbc03d00", - "19803de0b3c03d0001803de0b7c03d0005803de0bbc03d0009803d680700911b018052e8d300f9caffff17BL8;FFe00316aa22008052950200b4e30315aa93680194f60300aae00600b4e0230091ec50ff97b30000b4e00314aae10313aa220080526f680194e00316aae10315aaL8;FF8001803de8d302b", - "9214b803dfafdff176801009008b140f91f0900f123030054e8b30a91c9fdff9029b13491e80302f9e8830a914001009000e80991e90702f9BBBL4;FFe10313aa88a80194a0a33ca9600300d000000691630300b063802291640300d084800d91a2e300d1a103805281a8019420008052e10313aa86a8019", - "420008052L4;FFfd7bbfa9250000b02aaa9c52fd030091090c40f9270000b0a58c40f9e7800091e10309aa030080d2060080d28a8eac720b10a0d2041440f90a000014230840f9L8;FFafa80094e8031f2aa0877bada0d300d1a8f31438a203d93ce1830091a303d63cd402188b5a0318cbe00704ada0077", - "9ade22b803da203d13ce31f803de08701adBL8;FFe30313aa96280194000300b50e00001428008052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6d30100b46c280194e00313aa210080526a280194L8;FFc10640f9810000b4c20a40f9e00317aa782800945f0b00b101090054e0074091e1", - "0314aa022b805200001891ffe7163978280094f5030291e1074091a0a20291BBBBBBBL4;FF170c40f9e9830091e22702a9e80201ab02100054160440f9c9060091df2200f129fd43d32af17dd3490109cbc932899a1f0549ebe90a00542a050091f30300aaL4;FFe8230039e82740f9e083c13ce183c23ce", - "283c33ce383c03c882200f928008052808600ad820e803d8302803d68220039f44f4aa9f65749a9fd7b48a9ffc30291L8;FF6002f8b7680200f008011c91d45601a9c84e00a9f44f42a9f65741a9fd7bc3a8c0035fd6e10300aaa3fa7f92e00316aae20315aae40313aae50314aaf44f42a9BBL4;FFea235", - "339fc8f00b9fc325e38e5af5339eb2b1429eb275339ea2b5339fe3b40b9e6b35339eb2b1529eb2f5339ea3353399c031e4aec8300b9ec675339eb2b1629L4;ZFL8;FF810000b4602240f922008052799c0094612a40f9810000b4602e40f922008052749c0094741e00f9f44f41a9fd7bc2a8c0035fd6fd7", - "bbea9f30b00f9fd030091BBBL4;FFfc0b409108018052f70b409102c48052f90300aa9c431991f7c20091081400387cdc0194c012c03cc97e40390a088052c8024039c1f2c03c8013803c00e4006fL4;FB6f746f627566206d6573736167653b20696e73756666696369656e742062756666657220636170", - "6163697479202872657175697265643a20c00d2c2072656d61L8;FFe87b42f9e83b00f9e87f42f9e84300f9e88342f9e82300f9e88f42f9e9a302a9e89342f9e9d342f9e87b00f9e89742f9e86300f9e89b42f9e8d300f9e8a342f9BL8;FFe057813de0fbc33de15b813de8e30a79e063813d7f5c0194fc0", - "74091f94315919c8301919f0600b1a0050054b8008052af000014e8074091f68f45f900230091L8;FF0c440c33090d00396a6d1c320a0100390c050039cdffff17f703002ae0230091e10314aae20315aa89ffff97e003172ae80b40f9ff0202710801148b43f8ff54BBBBL4;FF220080527bfc0194f48b4", - "1f9f9031caa9f0600b100070054e89741f91f0500b180000054e8430c910061009122e5ff97f69341f9f58f41f9960100b4b7220091L4;FB00000000000000000800000000000000080000000000000084ac40000000000070734000000000002f72757374632f3438613232396365616566643439383563", - "L8;FFc90080d2e0a30039480080520900f0f2e0830091e8a70039e91300f994f1ff9709000014e10740f9e10000b4e80b40f9f30300aa22008052e00308aa6dfc0094BL8;FFf44f41a9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091010040f9f30300aa3f0400f18b000054600640f922008052707c0", - "194610e40f914008092740200f9L8;FF23008052240080525992ff97f81740f9cbfbff17f30300aae06300912200805223008052240080525192ff97e11740f9e00313aacffbff17e063009122008052BBBL4;FFa8035cf869f203f8691d0012aa831ab8ab831c38ea1b00b97b5201a9757202a96a9203b8", - "687204f8693e0139010400b587ffff171f09007121010054ea1740f9L4;FB14f647000000000010000000000000000800000000000000f81a48000000000014f647000000000018000000000000000800000000000000a41d480000000000L8;FF810000b4e0031caa2200805279bc0094000740ad081080", - "52e98741a9fb2204a9f96a02a9e00600ade013c03de92203a9e82b40f9e016803de83200f9810000b4BL8;FF802000544a030094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb481f005439010014002000918903009424000014L8;FFe00315aa7b3c00949f0", - "b00b101050054e00313aa088c4ff8093006910a9c41b92001c03d168841b91f0500b1ea8303b90003803d40000054e9faff9775de4ea9BBBBBL4;FF2803178b680a00f9b6010034610a40f9680240f91f0101eb20310054680640f9090380522a040091e00316aa6a0a00f909692138e10313aadaf7ff97b", - "50100b4L4;FF0a01403958c100511f270071280400543f0500f1e00000540805403908c100511f25007168030054490180521823091b081f00131f010071cd020054b403f8b6L8;FF099440393ff50171a10500540924403913040091810480523fb5007149008052410600540a3840395fb50071e105005", - "40a4c40395fb50071810500540a604039BL8;FFe80314aa29008052610600f969420039f0ffff17fd7bbca9fc0b00f9f65702a9f44f03a9fd030091ffc30ad1282440a9f30300aa1f0109eb0009005409610091L8;FFf92301f9ff2701f9e82b01f9fa2f01f9ff3301f9e83701f9e03b01f9ff3f01f9884e", - "1c9be9f77fb2190940f938f77ed31f0309eba86f0054130540f9580100b4BBBL4;FF23008052c6adff97e00315aa87ffff17c00140fd00a8200e0800669e0801c0da0811c0da0cfd43d3c8696c38d8ffff17ffc305d1fd7b11a9fc6f12a9fa6713a9L4;FB2074616b652061206b6579206f6620616e79207", - "3697a6500ba224900000000004d00000000000000180000002600000041324242324100000000000000000000L8;FFe91244b8eae300b9ea024139288108aae9ea45a9fc6700f9542108aae97700f9e93640f9e94f00f95c7700b46dcc0094e0031caa210080526bcc0094403301b4BL8;FFe90702f90900", - "00f029912891e80b02f9c80200b008c13f91e90f02f949048052e82719a9e1031091e3430691e8271aa9c80200b008613f9142008052e8db00f9L8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab220a0054090140b22911c0da291540d2290d098b2925019", - "129fd46d3BBBBL4;FFf44f42a9f50b40f9fd7bc3a8c0035fd6ffc301d1fd7b04a9f65705a9f44f06a9fd030191f40300aa091440f9f30308aa00a840a9811240f928008052ff0b00f9L4;FB0000000000000000080000000000000008000000000000006c774200000000000000000000000000080000000", - "000000008000000000000000c7a420000000000L8;FF40030054680640f9090180522a0400916a0a00f909692138e10313aaf0ebff97818a40a940008052e30313aa38eaff97810a42a960008052e30313aaf44f42a9BL8;FF632422910f000014a0831cf8e10200b021483191e30200b063401891a0e300", - "d182038052040180521d000014e10200b021483191e30200b063082991a0831cf8L8;FF220080527b6c0094e12340f9810000b4e01f40f922008052766c0094ff830891f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6ff4301d1BBBL4;FF84ac01944803160be8ff0039d60500b5f", - "703082a08088052020117cbb60202eb62060054e8030091e10314aae20315aa0001178b77ac0194e802150be8ff0039L4;FF68020072293977924a119f9a3fc969f26c7e015349016fb20dfc50d36e6619532a018a9a290080521000a8d23f65536a0f00a8523000c0f26b011f128c011a12L8;FF0820003", - "9080000f9e00301aaff830e91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a869a7ff17e91f40f948008052e083079133210039280100f9BL8;FF21f7ff54baffff17e89348b9208757adf7e342f9a00302d1e1031faaa80315b8e8e742f9e2031f2aea1700f9e80f00f9e8d345b9e93700b9e", - "82700b9e8031691L8;FF4b4d40780c7d40394a09403900f1c03c087140f82d0080526b5f02796ac304396aab0491490100b9e9030291e82302f928210f91ede310390001803dec631139BBBBBBL4;FF24008052ea060094e10340a92aa040a9290040f91f1040f15369283808050091280800f903feff540", - "b7c07533f0108eb6b611932000100544b69283808050091L4;FFf88cfe97e80740914083009108411d914f97fe97fae340f936008052f8db00f9da0b00b53900805265000014e00b409100c00e914d000014e00755ade96341f9L8;FF4a0102aba20300545f0500b1600300546b00805269a200a90803805", - "26b0200b949050091696a28f8f44f44a9f65743a9fd7b42a9ff430191c0035fd6640200b0BBL4;FF09000014080180d2f9031faae9031faa0800f0f208017fb22a1f409229010aaa682600a9f44f5da9f6575ca9f85f5ba9fa675aa9fc6f59a9fd7b58a9ff830791L4;FD000000000000000000000000000", - "0000028304a0000000000000000000000000060104a000000000000c0490000000000c46f4800000000000000000000000000L8;FFc9940094940100d094e20491610100f021a01b91a32300d162008052e40314aab3831ff8c094009468620091610100f021341691a32300d142008052e40314aaBBBL4;", - "FFf80314aaff2300a9f50314aa080315eb80010054699284d208fd44d32949b2f28924c9f24992e4f2177dc99be00315aa65bdff97f70600f1b5c2019181ffff54L4;FB0378025a0000035007c0037806e8000006f000140378059c0000689b06f003786d130000688f04b200006c3d0100a521526fb8ea3", - "c622b414cc4421a38ebf616L8;FFee6b40f9eab740f9e95b0da9e9a340f9e1030daafc2317a9fc0306aae0afc23de6a341a9e91300f9e98f40f9f8ef00f9f89f40f9e7b300f9e7b744a9e8a713a9BL8;FF1f0700b1e00b0054e1d342f9e8cb42f91f0101eb00400054e8cf42f92a040091c0220291490180", - "5209692138ead302f9ed1a0094e1431691210d0094e0a749f9L8;FF7c54009477540094200280522100805275540094e04200b4880c8052090100f02961329108400039c80080d22001c03d0800f0f2e9f35639e06302f91c490091BBBBL4;FF0c000014880b0091b4031df805000014e80b41b2a0031df8", - "02000014880f0091a0e300d1a8831cf891e90094f40300aae12b40f9f5db46a93f0400f18b000054L4;FB375234f365e660955187a3735a0f7613d1609d3a6a4d8c53aeaa5a221240e0b9ebacdfc3aa2827f7924b697784d1c25e44ca05dd433e1a38dc6382eb2730d419L8;FFdde8ff97e00340f954ffff", - "17c80080d20800f0f20809009146ffff17c90080d2e8230039480080520900f0f2e8270039e90300f9e8ffff17e00300f9210200f0BL8;FF02000014280f0091a0e300d1a8831cf897690094f60300aae13b40f9f4d748a93f0400f18b000054e03f40f922008052707401949f0600f1ab000054e00315aa", - "L8;FF7c740094e13349f9f3074091738209913f0400f18b000054e03749f922008052747400943f0700b16000005460c20091f40c0094e87349f9090d00913f0900f1BBBL4;FFa0c302d1e1031faaf40302aae08300ade003803d09ffff97a0877ead880300b008610891a203df3ca303dc3cf6c30091890", - "18052e0c30091e08704ada0077cadL4;ZBL8;FF11825df8b28102f8120a40f9e017803d0002c03da181813c4109c03db2031df8123240b9a0039c3cc141823ca1037eadf13300f911825fb810c20191c041813cBL8;FFf3cf45f9e88306f9e8c745f9e03b833da00b7cade13f833d7f0208ebe02b833da00", - "77dade22f833de137833de033833da1efff5400230191dd6aff977affff17L8;FF802700b5a02302d157f4ff97e80301aa80000036e82700b5e1031faae1ffff17e1031faae8730ab9deffff17e17b0ab938ffff17a88357f8080540f9160101ebBBBBBL4;FFe81f8052e0030091a11300d122008052a8c3", - "1f381d89009488624039e0030091a11300d122008052a8c31f3817890094e0030091618200910202805213890094L4;FFfb735ca9bf0208eb40010054494300918802178bb5060091df0209ebf74200911b7101a9f59301f9e1fdff545d000014e0430c91e10315aa2200805203018052L8;FF79fdff1761", - "ce40f9810000b460d240f9220080527704019461da40f9810000b460de40f9220080527204019460420091f30b40f9fd7bc2a8d4fdff1760220091BL8;FFff030191c0035fd608200091200440a9e92300910a0000b04a011a91e8a700a9220300b0420c2c91ea0f00f9e34300918d840194fd7b43a9ff03", - "0191c0035fd6L8;FF4240389141000014e00300f9410100f0216c1c91e8230091e00309aa42018052af840094620100d042403a913700001408200091410100f021b01c91e80300f9BBBL4;FF490108ebe31b00548a0240f9e0c342f94801088b882600a9a8835df8080540f9140100eb631a0054bb835df", - "8620740f95f0014eb69050054610340f920008039L4;FB70656e64696e675f7072655f6b657972656d6f74655f726567697374726174696f6e5f69646c6f63616c5f726567697374726174696f6e5f6964616c6963655fL8;FFf4030b2af8030c2a7ac40094ec03182aeb03142a38ff48d3e06b40f9fa031", - "6aa150100b4e10315aa22008052f4030b2af5030c2a6fc40094ec03152aeb03142aBL8;FFe0230091a200805284018052da380094e00740f941feff17c80080d20800f0f20809009147ffff17fd7bbda9f50b00f9f44f02a9fd03009148008052f503012aL8;FFe00313aa3b030094b50600f173a2019181", - "ffff54e81f40f9c80000b4090d8052e00314aa02018052017d099b71440094e17740f9210100b4e07b40f922008052BBBBL4;FF57ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebe30401541803008bf9feffb5L4;FB7074", - "20616c776179732068617320612076616c69642062617365206b6579000073e84800000000003800000000000000ab0100001e0000006c69627369676e61L8;FF18010a8b7701098b0a0000144800805209008092692200a9bc000014f6031faaf5031f2af9031f2af7031faa38008052e8431e91fb431e9", - "1fa431e914bfbff97BL8;FFf40300aa950400b4770640f975640194e00315aa2100805273640194600600b4e10317aae20315aaf60300aa79640194771640f9770300b4791240f969640194L8;FF3600805278640094a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad30a088052f403", - "1faaf5ff03a92911c0da490109cbea0080523f1d00f1BBBL4;FF2c69eb382c04f836ec020acb6a010acb4a010cca4a01088a5f2100f1e3040054ea032baa0cfc79d381260a9b2a696b382c692b38692100d16b0240f92801088aL4;FFe12a0091e20304aa047821f8401840b9e0200035400840f94300805", - "24570009100204039001040d36320c01a60040051e303034b25000014a1fc2f36c0021091L8;FF6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b2BL8;FF680a00f9f44f42a9f65741a9fd7b", - "c3a8c0035fd6e00313aaf60301aae10315aae20314aa51faff97750a40f9e10316aaeeffff17ffc300d1fd7b01a9f31300f9BL4;FFfd030091f40303aaf30302aaf60300aac20100b4f70301aa72240094e00313aa2100805270240094a00800b4e10317aae20313aaf50300aa76240094d8de40a9L3;FB0", - "090480000000000001001000000000000100100000000000010000000000000010000000600000000b009000000000000a049000000000000a0490000000000BBBBBBBBL4;FF0800148a206b68fc00a8200e0a00669e4a0300b44901c0da2911c0da080d498b0801148a296be838a903f836092100d10afc", - "79d3eb0336aa2901148a0b1b0b8bL4;FFc100009021602791c300009063cc2791a0c300d162038052440080521f000014a0031df8c100009021602791c300009063fc2791a0c300d16203805264018052L8;FF932201a9f44f42a9f65741a9fd7bc3a8c0035fd620008052e10313aa821e0194fd7bbda9f6", - "5701a9f44f02a9fd030091f30302aa4203f8b7f40308aa330200b4BBL4;FF3f0700b1f94702f960000054ff5f08a904000014e84b42f9e94f42f9e82708a9e0230091e2030291e10315aae30314aa460a0094e84742f91f0500b180f8ff54L4;FF261c40a9282441a98a2c7ea98c347fa95f0001f1e80000", - "54061c00a9082401a9aa2c3ea9ac343fa9c0035fd61f2003d52e3c42a9304443a95f8001f1a9000054L8;FFe803009102028052c69e009468c20091810100d021881591a40100b084a00a91e0030091a3630091a2008052a80f00f9bd9e0094810100d0219c1591a40100b0BBBL4;FF99008052e00318aae", - "10319aae2031f2ae0023fd61f0000f1ad000054390300eb834500541803008b060000141f0400b10145005492de01941f10003181440054L4;FB70000000000000007d004900000000004a000000000000003f05000049000000556e696e6974536c6963655b2e2e2e5d4c61796f75744572726f722f6361", - "7267L8;FFe03300f9000200b000283d91e9eb01f929038052e8a303f9e8ab03f9080200d008a12b91ebc301a9f22b00f9f8f301f9e9a703f9e9af03f9e8b303f9f7fb15a9BL8;FFc0120054f8432591fc074091a182009100830091027080529c830191f94315917c5e0194e8a344f9e04fc23d890a00d19", - "f0600f1ea008052eb672191e8b704f9L8;FFe8031faab60a40f976f4ffb5b41640f9e803088b54f5ffb5e00308ab23f6ff54200100f000c01191755e0094e00313aa2200805286010094610a40f9b0ffff17BBBBL4;FFd50500b4e00316aae10315aa2200805278fe0194290000144d69ec382d07f836e08", - "3c13c0e0c8052ef2f40f98efd0e9be183c23ce283c03ca0839b3ce083c33cL4;ZFL8;FFc0035fd6ff8301d1fd7b03a9f65704a9f44f05a9fdc30091081c00121f09007181010054e00302aaf30302aaf40301aa5afdff9720020037750240f9a80640f9BL8;FF21643391040300d084601291a9831ff8840", - "000140920009121030090210037912403009084803691a32300d1e00308aa22028052a9831ff8b07e0194fd7b42a9L8;FF80200054e00315aaeeedff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb281f005411000014f6031faa938640f9BBBL4;FF800300", - "d000601c917dbe0194ff0303d1fd7b09a9f55300f9f44f0ba9fd430291f30308aa28008092290c028be80700f9e8230091e0a304a9e0e30091e1a703a9L4;FB636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f62797465732d312e3", - "1322e312f737263L8;FFf4e340a9f56742a976be00940008805221008052d6be0094800800b4f60300aac00100d000c02e9101048052e20314aae30318aae40315aae50319aae60316aaBL8;FF08fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540", - "d26b0d0b8b6b2501914a194b8b4a050091090100b4L8;FF00ffff17c80080d2e10b00f90800f0f2080900d10f000014c80080d2a1831df80800f0f2080900d11a000014e80b41b2e00b00f907000014e80b41b2a0831df8BBBBBL4;FF962a40f91f0101ebe00f0054680640f9290400914a058052e00315a", - "a690a00f90a692138e10313aadef9ff97770a40f9680240f9080117cbbf0208eba9efff54L4;FFe9d700f9480400b4e8c740f9e08b40f922008052e19340f9177d0853750e0094ef0317aa1d0000141f090071611e00540a0180d2e97342f90a00f0f24a0140b2L8;FFe91b40b9eb6301b8ebc341f8ea570", - "039ea6b0039e9b301b8ea7f0039eb1300f9e82b00b9b10e0194fd7b44a9f32b40f9ff830191c0035fd6ff8301d1fd7b04a9BL8;FF848e0194572340f9b6831ef8b8431fb8f70200b4561f40f9728e0194e00317aa21008052708e0194800700b4e10316aae20317aaf40300aa768e0194582f40f9L8;FFf4", - "4f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f30b00f9fd030091a13b0079a1730091f30300aaddacff9760020079f30b40f9fd7bc2a8c0035fd6fd7bbea9BBBL4;FFe12740f9e81f40f91f0101eba0060054e82340f9290400910a018052e00317aa0a692138e1e30091e92700f9ddb9ff9796f9ffb4e1", - "2740f9e81f40f977025ff8L4;FB764ed9ccd4c2a4e4d2aa0b66dfa47b40a9eaa28c7add265b7930928400006dbe567c6ed0d7cb8272c358661d9f9e6fe7607682d223172e1b28e25b639423795dL8;FFe9b740f9e8cb40f969a20ba9e9eb40f9e89b40f969a20ca9e9a740f9e88f40f969a20da9e8a753a9", - "698e0ea968e20fa9e8d340f968c616a9e8ef40f968ea17a9BL8;FFe80b02f9e8430f91fff301f9e80302f9e90702f9662a0094a0420035fbef41f9e6f341f9e8430691e32b40b9fceb41f9e0e30091c1e20091e2830b91e403182aL8;FF410341ad810301ad420342ad820302ad410340ad810300ade1b2f", - "f5428008092680200f9a6fdff17000100d000343c91020100d042003d91010680528e4e0094BBBBL4;FFe10319aa88ee019476ee0194e00319aa210080523a00805273ee019400ffffb408018052b9833ea9a16300d10800003928008052e00318aaa8831ff8d9d9ff97L4;FB3a20726573756c74203d3d2", - "053656c663a3a5072654b6579207c7c206d6573736167655f7479706520617320693332203d3d20726573756c7420617320693332L8;FFa80640f91f0116ebc9080054e00313aa62edff9760fe073728fc60d3880800b5200840921f1800f1c2080054217c0353e10800343f080071ad0100543f0c0071BL", - "8;FF89031a0a8a03170a3f0100712907009140115c7a20fdff543f0d00f14003005428611b9b290b00911c1140b99f031a6a800000548a03170a5f011c6be0fbff54L8;FFe04316912200805291110094e1d342f960fcff17e0431691220080528c110094e1d342f976fcff17e0431691220080528711009", - "4e1d342f981fcff17e0431691BBBL4;FF58ffff17a9735c3808d34178e00316aaf9d701a9159341b8b60301d1e8270129a9237da9b9835c38bbe35c781a2342b8e90b00f9a9035e38a88314f8a80301d1L4;FFc0035fd620008052800600f909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6ff", - "0301d1fd7b02a9f44f03a9fd830091480001aba2020054010840a9L8;FFe801003568e34039a102174a1f050071c1030054e2031f2a4c07009408fc78d309fc60d3287b68782821084a095d1053295b69782001084aebffff17e80100d0BL8;FFe8a345b93c008092e00718ade82303b9e00758ad955e183", - "3e82343b97c0300f9750b00b960c3803c61c3813c682f00b9ff033a91f44f45a9f65744a9f85f43a9L8;FF220080527b2e0094f8ffff17e87340f9680300b40805088be00313aa0201805201f17dd3732e0094ffc32091f44f42a9fc5741a9fd7bc3a8c0035fd6f46b41f9BBBBBBL4;FF2911c0da490109c", - "bea0080523f1d00f129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f60300aa080014eb23120054ff0208ebL4;FF6350369100401d91e10316aae2031caa84018052e8b301b9e09b803df6e700f9fa0d0094faaf4bf9e1b34bf9e80b409108c10e91e0031aaaee160094f7", - "db51f9L8;FFc0035fd6ff0301d1fd7b02a9f44f03a9fd830091480001aba2020054010840a9f30300aae023009129f87fd31f0109eb0881899a090180521f2100f11481899aBBL4;FFff8307d1fd7b18a9fc6f19a9fa671aa9f85f1ba9f6571ca9f44f1da9fd030691f30308aae8030391f40303aaf80302", - "2af50301aaf60300aa286f0094e8674ca9L4;ZBL8;FF1f0500b180200054ee050094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb481f0054390100140020009100080094BBBL4;FF4801088b880300f9290300f9a8fe60d3e84200b5a00a40921f1800f10243", - "0054a17e0353214300343f040071010200541f0800f121580054b98355f8bf831cf8L4;FB8075460000000000000000000000000000000000000000000100000000000000e021460000000000546d44000000000018000000000000000800000000000000L8;FFfc6f41a9fd7bc6a814d2ff1728a00791f6", - "0311aaf10315aa0001c03d08008092f50302aae4e300f9e29349a9e8d30ea9f8030eaae03340f9fbbb4ca9ed5b00f9BL8;FF3a0500915f0308eba82400546e010014e1d342f9e8cb42f9f6074091d68209911f0101eb807a0054e8cf42f92a040091c00202914908805209692138ead302f9L8;FFe8c3169", - "1a04700d1e86304f9080000f008c10191e86704f9e8c31d91e1833291e86b04f9a8fdff9008e13591e86f04f948008052e86b06f92801009008413191BBBBL4;FFf40308aaa90100343f0d0071a107005460a241a9090d40f9e803009120013fd6e80340f91f0d00b121030054880200f968008052290000", - "14765e40a9f50301aaL4;FB616765726174636865745f6b6579636f756e7465726369706865727465787470715f72617463686574616464726573736573436f6e74656e74646174615f6d65L8;FFa10c00b501f9ffb4bcffff17e20313aa430c80520befff97e10300aa40f8ffb4b6ffff17a80640f91a01", - "01eb02010054a2000014e10314aae20313aa73f4ff97BL8;FF30000014e99340b8ea0f40b9e093c33ca91b00b9e92341b8aab301b8ea2f4079e90300b9a91b40b9ea0b0079ea234079691200b8a9b341b86012833ce00741adL8;FF290d098b292501910819498b08050091e98792b969010034290140b22", - "911c0da291540d2290d098b2925019129fd46d32905009104000014f4031faa64000014BBBL4;FFe28303ad000440adf3ff4139e1a300a9220113cbe18f02ad5c0302ebe013803d220200546003138be10319aae2031aaa78b6019468021a0be8ff0139081d0012L4;ZDL8;FF78b60094000480522100805", - "276b60094c00800b4e80300919f020072f80300aa1b0101911c81009168139c9a000540ad000400ad6bb600940009805221008052BL8;FFe80b03f9f5fb45b9ea0f03f948fd60d3fcfb42f9e9231839b47e0853e0c2c13ce1c2c03ce8a305b9e067813de163813d8607001435008052f6b340f9d6e9ffb5L", - "8;FFe8a30bb9e9a340a9f6c705f9f6cf05f9e8d705f9e82b40b9e9e305f9e95f40b9e8b30bb9e81f40f9e9df0bb9e93340b9e8df05f9e8e705f9e82740b9e9e30bb9BBBBBL4;FF800640ada08300d1a0073fad8c0602941f04003121f6ff54e083c03ce80f40f96002803d680a00f9f44f49a9f73b40f9f6", - "5748a9fd7b46a9ff830291c0035fd6L4;FFfd030091f303012af40300aa75060094000280520101805273060094200100b4140000f9810000f021000491130800b91f300039f44f41a9fd7bc2a8c0035fd6L8;FF603640f901f97fd34200805279060194683e40f9a80000b4604240f901f97fd342008052", - "73060194684a40f9a80000b4604e40f901f97fd3420080526d060194BL8;FF882600a9b90000b4e0031aaae10319aa2200805277860194b80000b4e00317aae10318aa2200805272860194b50000b4e00316aae10315aa220080526d860194L8;FFe20318aafc0313aa7306009181860094e0031aaae1031", - "9aae20317aae30315aae4031caadbd7ff97e80b40f9200080523f0300eb601d0054497b60780a014079BBBL4;FFe91f40f9e81300f9280140f91f0500b1c10200542e00001428008052e80f00f9c80600511f09007183feff5416010035ea031f2ae91f40f9e81300f9280140f9L4;FB312e31322e312f73", - "72632f62797465732e7273002f72757374632f34386132323963656165666434393835633530393930623134313136623664383536616630L8;FFee2749a908210591fe9342a9000540ade50319aae87742f9e28f41a9e0cb44a9e6030991f16748a9e13340f9ed6f40f9e8c303f9eb6740f9e7a340a9e0d", - "b813dBL8;FF20fcffb63f0108eb400300546a6928380805009120008052290040f9280800f93f0108eb20010054290440f90a050091206928382a0800f9f44f42a9fd7b41a9L8;FF4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d2", - "4a0d0a8b4a25019129194a8b29050091BBBBL4;FFfd7b02a9f51b00f9f44f04a9fd83009115d040a9e20301aaf30308aae00315aae10314aa590000941f0400f1410600543f0014eb020a0054080d80522854089bL4;FBc00e206d6573736167652066726f6d20c02720776974682050524556494f555320", - "73657373696f6e207374617465202862617365206b657920c0012900204e6fL8;FF48008052a0a303d1a8131238b58311f897dbff97e10300aa54ffff17e0230b39e0030b91ff270b39f56301f990dbff97e80300aae86301f92102009021ac1b91BL8;FFfd7bbea9f44f01a9fd030091f303012af40300a", - "a73660194000280520101805271660194200100b4140000f9e10200f021203591130800b91f300039f44f41a9L8;FFe80000b460be40f901f97fd342008052f30b40f9fd7bc2a876660014f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aaBBBL4;FF78a60194e0", - "0317aa210080523a00805275a6019400feffb4e10318aae20317aaf90300aa7ba60194e10740f9810000b4e00318aa220080526ea60194955a00a9L4;FF00ffff9788ffff1742141a125f003f7161e2ff54f2ffff17734e00a9930a00f91c000014007c4093220000b00028009142001091437860f87f001", - "3ebc0010054L8;FFff0f00f9bf0214eb08070054f4031faae9031faaf50000b46002148be10308aae20315aa7ba60094e10318aae90314aae80740f93501158bf50f00f9090115cbBL8;FFe00301aa810200b021cc3e9122038052b6260114281040b9000040f96800c8376800d037a5260114b9260114b9", - "260114e00301aa810200b021303d9162008052L8;FFbe260094fd7b41a9ff830091c0035fd6e00301aac10000d021601a91a2008052b2260014fd7bbda9f65701a9f44f02a9fd030091140840f9f30300aa3f000271BBBBBBBL4;FFf65742a9f85f41a9fd7bc4a8c0035fd6e003032a7e1a02947f0200a96", - "10a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6ff4303d1fd7b08a9f94b00f9L4;FFf40308aa4a120094a8c300d1e00316aa6574fe97b6035df8a083dd3ca8835ef8df0a00b1e013803de82b00f9c1000054e1a30091e2030191e00315aaa3f5ff97L8;FF380200f018331091170040f9b973009", - "1750200f0b5e21891e8164038e3030091e00313aae10314aae20315aaf96300a9a87300398c1a0194a0000035d60600f1BBL4;FF20008052e10313aa879a0194ff4302d1fd7b04a9fa6705a9f85f06a9f65707a9f44f08a9fd030191372800f1f30308aaa200005488028052490300f029411991L4;ZFL8;", - "FF810100b021901a91a401009084c01991a3630091a2008052a80f00f9c29a0094c29a0094fd7b41a9f31340f9ffc30091c0035fd6ff8300d1fd7b01a9fd430091BBBL4;FFfc03142af40319aae10740f9810000b4e0031baa2200805276da0194b60000b4e0031aaae10316aa2200805271da0194614a40", - "f93f0400b140020054810000b4L4;FB366166303938352f6c6962726172792f7374642f7372632f73796e632f6f6e63652e7273002f636172676f2d7461726765742f616172636836342d756e6b6e6fL8;FFf7031baafa5740f9f17300f9f1d340f9e30306aaf21314a9f2e340f9e40318aaeb1b00f9f80f", - "40f9eb0300aae61f40f9e03740f9f90307aae0f3803df00315aaBL8;FF64000014e9031faaea8b92b92a0100344a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a05009102000014ea031faaeb7b52b97f05007181010054L8;FFe85f06f9e86706f9e82f40f9e96306f9e92740f9e86b06f9e", - "87306f9e81b40f9e96f06f9e87706f9e87f06f9e82340f901838e3ce1d7c23de89b06f9e80f40f9BBBBL4;FF60a241a9090d40f9e803009120013fd6e80340f91f0d00b141030054880200f9680080522a000014785a40a9f50301aa770a40f96bfa01940004805201018052L4;FB70726f746f636f6c2f7", - "372632f70726f746f636f6c2e72730033646573657269616c697a656420556e6964656e74696669656453656e6465724d657373616765L8;FF3f0800b1800100543f0400b140010054810000b4e09b40f92200805275fa0094e1a340f9810000b4e0a740f92200805270fa0094e87b40f91f0500b1201800", - "54BL8;FFa2008052c77a0194140300f094422391010300b021742191e0230091a32300d142028052e40314aab3831ff8be7a019468620091010300b021bc2191a32300d1L8;FF681a00f98a15005449040014e807409180020291f507409108810991b582099154acff97f43349f94083c03ce83f49f99f0", - "600b1e04f823de8a304f9c0120054BBBL4;FF6901098b8d010d8b2bcdcbcaacc1ccca2981c993ad010b8b8901098bae81cd93abbdcbca2cadccca280108cac91d40d208010b8baed356f88901098b0bcdcbcaL4;ZBL8;FF0a018052e97b02f9ea7f02f9eb8302f9e88702f9da130094bc9374a9e8831391e", - "0031f2ae1031aaae20314aa2500805206048052fa0300f9e3031caae5ba0094BL8;FF0800098b080500911f0109eb69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff54a00200d000602b91723a0194a00200d000c00991L8;FF9f0700b1fb6300f9e0380054e26b40f9e35740", - "f9e8432a91e00317aae10316aa1fc5fe97e84b45f9f64f45f9e95345f9f55745f9fa5b45f91f0900b101400054BBBBBL4;FFe00700f9210400b021a01f91230400b063e01f91e0230091020280520402805293010014e10300aa280c49f81f0500b121010054280080521f7c0aa91f2009a9L4;FFfd7b03a", - "9f85f04a9f65705a9f44f06a9fdc30091280840f9f40303aaf60302aaf50301aaf30300aac80300b40805088ba90640f918ed7cd337a1009104000014L8;FF6800d037b00a0114ca0a0114ca0a0114080040f9e20301aa00a140a9e10308aaae0a0114080040f9e20301aa00a140a9e10308aaa90a011408", - "2440a9e20301aaBL8;FF490108ebc33000548a0340f9b8035df84801088b880300f9690300f908ff60d3680a00b5000b40921f1800f1620a0054017f0353810a00343f0c0071ec010054L8;FF4a010b4af403152a29240a532b2c0c53fcd7532908010a4a2a300d538c010d4af07c900acf7f8f0a2d280b5", - "38c010e4a2e340e5331380f53fb875429297f890aBBBL4;FFba035df8e90313aa480317cb7f0208eb89030054a0c300d1e10317aae20309aa2300805224008052f30309aae0bcff97b7035ef8ba035df8f52b40b9f44f40b9L4;FB0000000000000000080000000000000008000000000000003408460000", - "000000000000000000000008000000000000000800000000000000e008460000000000L8;FF616e0054e10f40f9416900b54c0300141f0f00b129100054fb031faa9a0200149f0600b1ed7300f9401b0054fb0314aa5f0101f1ea2b00f9411e00541f0700b1BL8;FFf30300aa810000b4600640f92200805", - "2784a0194610e40f9810000b4601240f922008052734a0194611a40f9810000b4601e40f9220080526e4a0194e00313aaL8;FFf7feff97e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb89190054088c45f81f0500b1c0140054BBBBL4;FFe", - "0074bade08711ad0814003877ea01941f3f00f1e8eeff54e08753ad20030291a14302d122008052a0873dade08b54ada08b3eade18351ada1833bade28352adL4;FB080000000000000008000000000000004882420000000000000000000000000008000000000000000800000000000000f07b42000000", - "000073657373696f6e00L8;FF240080525a000094610a40f988ffff17f50300aae00313aa22008052230080522400805252000094610a40f9e00315aa8effff17e00313aa2200805223008052BL8;FF00080091d36a0194e003003708fc60d31601162afc031aaa19f6ff3418000014ab688ed2082440a98", - "b2eacf20a1040b94b8ccdf22b6deef21f010beb08ad8cd2L8;FF29c113918101c03de01b40f92043813ce1031091e8a301b9e8b341b92007c03dffeb01f9e80303b928008052e8ef01f9080480520800ac72810101ade80b02f9BBBL4;FFe00314aae1810094fc0300aaf50301aad30300b473aa0194e003", - "13aa2100805271aa0194c03e00b4e10319aae20313aafa0300aa77aa0194f90b00f9db0200b4L4;FF22feff548d090091f2ffff17080109cb8a000014681e00910af17d92480113eb8c0208cb5f0113ebe8031faa8b0940920001005469020acbed0313aaae15c038L8;FF220080527baa0094a15640f981", - "0000b4a05a40f92200805276aa0094a16240f9810000b4a06640f92200805271aa0094a16e40f9810000b4a07240f922008052BL8;FFe00314aa7b2a01947f0b00b141050054e8630191ea9740f9e93342f908e10c91f6bb41f9fbbf41f9000545ad5f0500b10231c03df5c341f9f7c741f9e95305f9L8;F", - "Fe8933f39e8a74929fcf73f39f8fb3f39e9973f39e89b3f39e8a74829e99f3f39e8a33f39e8a74729e9a73f39e8ab3f39e8a74629e9af3f39e8b33f39e8a74529BBBBBBL4;FF230400f063282391e003009142028052e4008052d8060194e00340f9f44f46a9f72340f9f65745a9fd7b43a9ffc30191c003", - "5fd6e00740f9f44f46a9f72340f9L4;FFe0b700b9a04700d13bc4ff97e0b300b9a04700d138c4ff97e0af00b9a04700d135c4ff97e0ab00b9a04700d132c4ff97e0a700b9a04700d12fc4ff97e0a300b9L8;FF0940003909819f1a9f7d02710a819f1a8d0d00122e28403929010b0b4a114c0bbf25007129", - "c100110b819f1adf7d02710944003949c100110a819f1a09480039BBL4;FF000000ada0820191e76a0094e86342a9f71b40f91f0500f140060054ff8602f16225005416048052970100b48002168be10318aae20317aa76920194d602178bL4;ZDL8;FFa363009162018052a80f00f9c692009468e202916", - "10100f021cc1791840100d084200f91a363009182018052a80f00f9bd920094bd920094fd7b41a9f31340f9BBBL4;FFe903092aa8031638a8b356b8aa8315f8890100b9a9ab77a9883100b8a88355f8a88201f8e85340f9e9ab0ba9a9035638000540ada902023829008052e9c30239L4;FB00008e502bac", - "2cb119e16cc6462b3be9f5da491bdd5bb2c66e4223cee145a6cc973c07ac77dcd4bb4c693dd712bd0e6bfa26afed655bdac64fb23c9eed85a28cL8;FFe8ff43f9e9e743f9e70b44f9ec1b44f9ed4f44f9e8b700f9e80344f9f55f44f9e66f44f9e57744f9f17b44f9e8cb00f9e80744f9fb8344f9f08744f", - "9e8eb00f9BL8;FFe04316912200805282110094e1d342f99efbff17e0431691220080527d110094e1d342f9fdfdff17e04316912200805278110094e1d342f963feff17e0431691L8;FF002030912301009063a00791040100f084603491e2c32291c1058052e85b04f9e95f04f98352009420008052e103", - "14aa7d52009420008052e10316aa7a520094BBBBL4;FF684200390afd68d308fd48d3695e0039681201b848038052680e00f9080080926a520178d1000014080400900821389109058052682601a908008092685e00a9L4;FB722076323a20722028323032332d3038290000000000000085924800000000", - "0033000000000000002a0400003200000063616e20646572697665207075626c69L8;FF639c1591e0030091c20180528400805211000014c80080d2e0230039e00300910800f0f2ff270039e80300f990e7ff97e80300aa210200f021681b91230200f0BL8;FF6901084aab135638a9f315384901084aaa2", - "35638a90316386901084aab335638a91316384901084aaa435638a92316386901084aab535638a93316384901084aL8;FF0969213828040091f67749f9e8d302f9df0600b10026005480220291c42b0094080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a050091BBBL4;FFe00309", - "aa7bb20194e03f40f9e10319aabf8733a9b8f334a912000014bc035cf83f0b00f180010054a80354f8480100b4a98354f8e03f00f9f90301aae10308aaL4;ZBL8;FF8aa240a9a09300d1890240f908011c8b1f0109ebe933899a080109cb090e80520829099b018940a903c100918dfbff97a0077fadb4c3", - "5db8e00701ad69b20094BL8;FF63000e9124018052db260094e15346f9e15306f9e0833291a102009021c00a9102028052a302009063a01791e4018052d1260094f55346f9e0833291e1032d91L8;FF280080d2e97705f9c9048052683bc0f2ff4b05f9e95305f9ff5705f9e96b05f9e86f05f97f320094e", - "9c30d91f6ef41f9e8e741f920854fad2285c03ddf0208ebBBBBBL4;FFe0030037760640f9e8030191e00316aa53020294680a40f9c9624039e07f0091e2030191a3c300d1e10315aa000540ade9630139a0873ead6a35009428008052L4;FFbcdb3da9bc831ef85fe3ff97b6237ea9ea058052b7835df819", - "050091ca6a2838e90219cbb9831ef8bf0209eb88020054b50000b4e12740f9c002198be20315aaL8;FF14e0009104000014730600f194c20191c002005481825cf8810000b480025df8220080527302019481025ef8810000b480825ef8220080526e020194810240f9BL8;FFff8300d1fd7b01a9fd43009", - "1010300f021802991240300d084602391e323009182008052e80700f9b4820194fd7b41a9ff830091c0035fd6080040f9e00301aaL8;FF882e0129220080529f1202f82809c05a4a09c05a892e4b29882a02292809c05a6909c05a88260329884640f909208052800640ad282508aa080dc0dae00700adBB", - "BL4;FF8a0a0091081d4092e0c30091280108aaea2303a9c1aaff9788320091a903009029493591682600a948038052680a00f9f44f49a9f73b40f9f65748a9fd7b46a9L4;FB6861696e76656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f646f75626c655f726174636", - "865742e727300c01b2073657373L8;FFe313813d0800f0f2a3137dad16090091e00b813df52342f9e20f813de41b813de317813da00b3aad4283c43c4083c33ce107813da103933c4183c63ce00b01adBL8;FFb0ffff17e00313aa2200805281010094610a40f9b9ffff17e00313aae10318aae20316aa7b", - "010094780a40f9680240f9080118cbdf0208eba9f7ff54e00313aaL8;FFe002803d0080c13ce006803d7b420094810700d15f0700b1e12700f9800b0054e00641ade0430691facb00f90083823ce20242ad0183833c0083853ce10240adBBBBL4;FF1f0400b161c600549de201941f100031e1c50054f9ff", - "ff179ae20194f70300aa1f0400b141fdff54e04305918100805295e20194c0c40035e85341b9e8af00b9L4;FB4c656e677468546f6f4c6f6e6753657269616c697a6174696f6e496e76616c696400000000000000b1ed4800000000004a00000000000000b602000009000000L8;FFe00bc03de20f823de0", - "ef813de107823de30b823d32600094e0dfc03de8c341f9e0431e91e1d7c23dc082813ce8bf05f9e0dbc23de2dfc23d610200ad620a803dBL8;FFc10200f021082991e40200d084803e91a363009122018052a80f00f9c262019468620091c10200f021542491e40200d084003f91a363009142018052a80f", - "00f9L8;FF8af3ffb4e8ffff17e10300a9e00301aae10309aa22008052f4030aaa8c050094e10340a9ea0314aa2ba040a9290040f97369283808050091280800f920fcffb6BBBL4;FF4105005477a20194008c81522100805275a20194a00600b4c1060091028c8152f40300aa168c81527aa2019408c4805", - "2b61200f9a85201a928008092a84e00a9L4;FF610640f9330000f9f35341a9fb7345a94dfeff17734e00a900008052d37a37f8f35341a9fb7345a947feff1700008012f35341a9fb7345a943feff17fd7bbba9L8;FFe323009182008052e80700f9bba20094fd7b41a9ff830091c0035fd6810100f021fc1", - "59182008052b0a20014080040f9e00301aa090140f93f0500b1e0010054BL8;FF090440f98a0200b04a210e911f7d01a92901018b0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6e10200b43f0002eb080400540a2440a9f50300aaBL4;FFb50600f1d6c2009180010054c1025ef8810000b4c", - "0825ef82200805275220094c1825ff8e1feffb4c00240f92200805270220094f3ffff17688e40f9280100b4L3;ZBBBBBBBBBBL4;FFa80d00541805009119f37dd314230091930219ab020d0054e8ef7db27f0208eba80c0054f503042afb0302aafa0303aafc0300aa6b1f0294e00313aa01018052L4;FFe", - "00313aae10314aaedffff17e10300a9e00301aae10309aa220080522300805224008052f4030baa57000094e10340a9eb0314aa2aa040a9290040f90cfc6ad3L8;FFe00315aa41008052a3feff97a00640ad800600adb3feffb4a80e40f968010036691648ab220500542afd7bd38a0000b528e97bb3a80e", - "00f904000014e00315aaBBL4;FFf60319aaf403152aec0340f908008092882500a9e80740f99b6101a9961100f9942905298b1900f9a8faffb4e10740f9e0031aaad0ffff17fc0740f933008052L4;FF9affff176bf7ff97140080d281018052010000b9f3ffff177500156b60010054e003154bbf120071", - "bfc820388d010054bfb01f38b5c01fb875d25f38b5120012L8;FF42008052b30f00f9c79f009468020291810100d021cc1791a40100b084200f91a363009182018052a80f00f9be9f0094be9f0094fd7b41a9f31340f9ffc30091BBBL4;FFe85300b957ffdfc8770000b59ddf0194f70300aaff0600b1800", - "20054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300ebL4;FB60457272602076616c7565000000000045024900000000004e00000000000000450400000d00000045024900000000004e00000000000000460400000d000000L8;FFff074091ffc30091f44f45a9f", - "65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a871d8ff17e00301aa190340f909a0c0a90a0c41a90078c03d0c5455a9e94700f9BL8;FF380b40f9b8f9ffb50a018052a92f7fa9765e0d297b5202a97a3200b96ba603a9a9237ea9782a00a96ba204a969a205a9785201a9f44f4aa9f65749a9f85f48a9L8;", - "FF48008052f40301aae10302aa000d002af30302aa39fcff97e00314aad7170094e10313aa35fcff97801a40b980010034610a40f9680240f91f0101ebe0050054BBBBL4;FF0e0c8052ef2f40f98efd0e9be183c23ce283c03ca0839b3ce083c33c0f4105f88f2100d10041833ce083c43ceb010b8a01418", - "23c4b010b8b0041843ca043dc3cL4;ZFL8;FFefffff17ff0301d1fd7b03a9fdc30091080040f9090540f9c90100b40a0140f92d0500d1eb030aaa6c1540380b3500a981194092ac003837e0031faafd7b43a9BL8;FF6800c8376800d037af7f0114c97f0114c97f0114080040f9002540a9221140f940001", - "fd6000040f99d710014080040f9e20301aa00a140a9e10308aaa77f0114L8;FFe80f40f91f0101eba06c0054f50314aae81340f949068052b30e4bf809692138280400917f0a00b1e81700f9410e0054f7031faa7c000014e11740f9e80f40f9BBBL4;FF08580039e8a3403918f000b8097001f8087c0039", - "7affff17960000b4e10316aa2200805273bf0194b50000b4e00314aae10315aa220080526ebf0194e12740f9L4;FB59000000050000005a7b49000000000054000000000000005f000000050000005a7b490000000000540000000000000065000000050000005a7b490000000000L8;FF220080527bbf00", - "94610240f9810000b4600640f92200805276bf0094610e40f9810000b4601240f92200805271bf0094611a40f9810000b4e00314aa22008052BL8;FFf40e00b4080d80525a1f40f9fc0300f9fb0f00b9f96301a9f75b02a9f54f03a9937e089b6f3f0194e00313aa010180526d3f0194a0831df8201100b4", - "080d8052L8;FFe80700f907000014c90080d248008052e04300390900f0f2e8470039e90700f9e02300919234ff97f44f4ea9f95b40f9f6574da9f85f4ca9fd7b4aa9ffc30391BBBBBL4;FF680240f9960640f91f0101eb80310054680640f9490180522a040091e00315aa6a0a00f909692138e10313aad", - "dfaff97770a40f9680240f9080117cbbf0208ebL4;FF220080527b0f0094e3c740f9e0431391e2e30e91e103142ae40318aa770a0094e00b409161e20191e343139100c00e91e203142a40040094e8db51f91f0900b1L8;FFe10300aae02300912200805291fcff97ea0740f9e8c341f8690f8052ec37422", - "9eb2740b9ea9300f8e1230091ea1b40b9e9230039a9058052a8031ff8e00313aaBL8;FFe823009182008052b58f0194685640b94203009042002091e0230091a1730091a81f00b9af8f0194af8f0194fd7b42a9f31b40f9ff030191c0035fd6082440a9L8;FFa32300d142018052e40314aaa8831ff8c58f", - "009468720091610100d021901a91a32300d1a2008052e40314aaa8831ff8bd8f0094610100d021841a91840100b0BBBL4;FF290400910a0580520a692138e1e30091e92700f9e3baff97e80f40f9b5c201911f0115ebe0370054e12740f9e81f40f91f0101eb00290054e82340f929040091L4;FBaed1575", - "a0f8995f5a322564d25ea49159797525496eabc8150faacf151ba31ff00bba28cd208c019285407340000d02cc16b5181327d23749560ac55ca5195dfL8;FFd5000014f7d300f9280200d0edc70ba9e51300f9f40307a9e64300f9e78700a9fe4b04a9eabb1da9f51306a9ef6f00f9f6f30aa9fb6700f9ec", - "7b00f9fae300f9BL8;FFff0300f9fa03062af803052af60304aaf90303aae21b00f9f50301aab70302d1f40305913475ff97e84346391f05007180020054881245b8e99741b9e00315aaL8;FFeae32291e9d742f9f5c742f9f7cb42f9c80240f9f83b42f940818b3ce9c304f9680000b4e00318aa00013fd", - "6c10640f9810000b4c20a40f9e00318aa6d4f0094BBBBL4;FFe80f40f9e91b40f9610200a9685601a9e83f40b9742602a9683200b9f44f46a9f52b40f9fd7b44a9ffc30191c0035fd6ff8302d1fd7b04a9fc6f05a9fa6706a9L4;FBda060000120000000b9a48000000000029000000000000004e0100002", - "d00000063616e6e6f742063726561746520612044656372797074696f6e4572726f724dL8;FFe0030091220280526400805229000014e00300f9210200d021441591230200d0639c1591e0030091220280528400805220000014210200d021441591230200d0BL8;FFe80f41b20b00f0f23f01007108018b", - "9a29019f9a0a018a1a26000014e89340b8e90f40b9ec234079ea2341b8eba34039680a00b9e82f407969b200b86cf20078L8;FFe10319aae20318aa00011a8b816f00944803188be8d302f9f88b49f9580300b4e1d342f9e8cb42f9f98749f91f0101eba0360054e8cf42f9490480522a040091BBBL4;FF6", - "90300d029b11491e82706a9680300d008351591ea098052ff2703a9690300b029150a91e82b08a96a06805228048052e92b05a9290080d2e87f04a9a92cc0f2L4;FFf94b1432680218eb1f0119eb1631999a7f0218ebf7979f1a290200548102188be003152ae20316aa00120094600100b4c000f8b65f07", - "0094080040b91f110071L8;FFc1fdff5411000014e80100d008010191e103002900210091a22300d121008052e30315aae40316aaa86b3fa9a5af0094e103402928e340391f05007161fbff54BL8;FFe063813de89305b921418e3c76000014e89340f9e82000b40805088be00313aa0201805201f17dd3f", - "9f7ff17f96f41f9eac31791f5e3573940c1c03cf7ef5739L8;FFfa5b00b98e2f00941f04003180080054b50358f87a0080520800001400010039d502158be0030191b50318f8842f00941f040031400700541f00027162000054BBBBBBL4;FF8b000054601240f92200805279170294611a40f93f0400f18", - "b000054601e40f92200805273170294612640f93f0400f18b000054602a40f9220080526d170294L4;FFe0d7c53de1dbc53de007409100401d91e03f813de143813da2170094e037c13de13bc13da04700d1e243c13de00711ade03fc13de00b12ad2fc9ff97fa03002aL8;FFc2008052c7170194680240f", - "9740200d094622391610200d021e02391e0030091e3430091a2008052e40314aae80b00f9bd170194681240f9610200d021f42391BBL4;FF12000014a0031df84103009021c824914303009063a42591a0c300d1e2008052e401805209000014a0031df84103009021c824914303009063742591a0c300d1", - "L4;ZBL8;FF29194b8b2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb29030054280108ab83000054BBBL4;FFe1031f2a828e40f99a9640f9e3031f2ae8630039e90b00f9a6d701945f0700b1a0000054882653a92b0080528a4241", - "b903000014eb031f2ae8031faaac835fb8L4;FB90194900000000004d00000000000000530300000900000090194900000000004d000000000000005b03000009000000456b526563656976656443743153616dL8;FFe82b42f9ea3342f9e9a309a9e83742f9e92f42f9e8af15a9e83f42f9eb3b42f9eaa3", - "10a9e84342f9ea4f42f9e8b700f9e84742f9eba318a9e84b42f9eb5342f9BL8;FF810000b4e09349f92200805279570194b30000b4e07b49f9e10313aa2200805274570194f49f49f99f0600b1e0a5ff54f5a749f9f3a349f9950100b476220091L8;FFc9000014c80080d2e0a33239e08332910800f0f2f", - "fa73239e85306f9944cff97e10300aae15306f9e0833291210100902120379102028052230100b0633c0491BBBBL4;FFe023c03de85b40f9800601ade00743ad882a00f9280080528212803d800600ad68720039f44f4fa9f76b40f9f6574ea9fd7b4ca9ff030491c0035fd600018052L4;FB69666963617", - "4652074686174207761736e2774207369676e656420627920616e7920747275737420726f6f746c69627369676e616c5f70726f746f636f6c3a3aL8;FFa10d0054e00313aa64f6ff9740010036410b00b5e0031faad3ffff17e003082ae20313aa430c805206f0ff97c0f9ffb4c3ffff17a80640f91a0101", - "ebe2000054BL8;FFe03740f9e10317aa2200805279770194e12f40f9a1d5ffb4e02b40f96dffff17a00301d1a82b3ca9ca53009420008052e10314aa877701942000805281088052L8;FFe1a7c43deac33391e2a3c43de95b49f94081883ce01bc43d4181873c4281863cea3b48f9e9c706f9e25fc33de35", - "bc33de163c33deaab06f9e053833de18b833dBBBL4;FFe00b40f9e1031baa22008052f44f4aa9f65749a9f85f48a9fa6747a9fc6f46a9fd7b45a9ffc3029172b70114f44f4aa9f65749a9f85f48a9fa6747a9fc6f46a9L4;ZDL8;FFc0035fd6e00741a987b70094ff0301d1fd7b02a9f44f03a9fd8300910", - "10840a988008052f30300aae0230091440080528500805229f87fd33f1100f13481889aBL8;FF812101b4820a40f9e00313aa7937019408090014f7c31791e82746b9f50346b9e042c13ce142c23ce0a30c91fcff42f961e2009102278052e01b813de11f813dL8;FFe95703f9c904805222008052e8f301", - "f9e8fb01f9e80000d008810791f63309b9e9f701f9e9ff01f9e80302f991f1ff97e19b44f9810000b4e09f44f922008052BBBBBL4;FFe00707ad98120094e88340f91f0500b1c0100054e1034aade2030491e00743a9810303ade20349ad820302ade00748ade25bc03df40301b9800701ade10347adL4;F", - "F000100b4810000d021003e91144c00a91f400039f44f41a9fd7bc2a8c0035fd600018052010380528a070094fd7bbda9f50b00f9f44f02a9fd030091f30302aaL8;FF081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a297c070194fd", - "7b47a9ff030291c0035fd6BL8;FFf5031faae00315aae10314aa86870194940200b4f60300aa72870194e00314aa21008052350080526f870194c0feffb4e10316aae20314aa740200a975870194L8;FF640100f084200b91a363009182008052a80f00f9c48700946101009021301d91640100f084e0049", - "1a363009142008052b30f00f9bc870094bc870094fd7b41a9BBBL4;FF608709ad000800546083cd3c6183ce3c6283cf3ce82b00f9688740f9e99742b9800706ad6083c93c6183ca3c823b803d6283cb3c800704ad6083cc3c6183c53cL4;FB726576696f7573207374617465733a20c00022536b69707069", - "6e6720636f72727570742070726576696f75732073657373696f6e20c00520666f7220c0023a20L8;FFe27744f9fc6f40f9ebaf00b9eb0316aaf66740f9f02340f9e3b7803de20713adec2b4ba9e8f200f868008052e0a3803d4d0100149afdff175f030014290100b4BL8;FF8c1900126ce10c8b81fd0da", - "a3f000beb030500544b018052e0031faa4a010b8b29010bcb0a2500a9fd7b43a9ff030191c0035fd6e80741b2e0030091e80300f9L8;FFdf010deb230300548c0500f1ed030eaa81feff54ca010aab220200542801088b480108ab8202005409804039000509ab22020054fd7bc1a8c0035fd6e8031faaBB", - "BBL4;FFe95f00b97de70194010700d15f0700b1612200f9c01e0054c002c03daa0302d1e02b803d950a00b4e8434179e98b4239f3334af8f6bf4239f7b34ab8a8031878L4;FBe700a4002501660031003d00135a6852842b007c494c059ea36eca27c5003b362c0b1640315f756f31061e110d0d00000000", - "0000000000000d00000000000d11L8;FF022a805283e70094bf0a00b16016005460420091e1030091022a80527de70094755200a9c2000014a80a00d1e16701f905000014e80b41b2e06701f902000014BL8;FFfd7b02a9f44f03a9fd830091e90301aaf30300aae102009021dc2c91e8230091e00309aa8", - "2028052be67019468c20091e1020090212c2d91e40200f084a02c91L8;FFfd7bbda9f65701a9f44f02a9fd03009114d440a9f30300aaf50300b496e2009104000014b50600f1d6c2019140030054c1825cf83f0400b140010054810000b4BBBL4;FFffa303a9e8ff05a9e8a30091e08702a9ff6b00b9ffff", - "04a9a80f00f9a10900b4560080d2e20301aa152100911600f0f2f7a300910a000014e1e30091a2630091L4;FFfd7bbea942008052fd030091f35301a9f30300aa200080520120c11a60824039641e40b9631a40b90610001265424079001040d38300032a4220c01a2400030bL8;FFf65703a9f44f04a9fd", - "030091ffc306d1f40304aaf70303aaf60302aaf30300aaa20400b4f80301aa6ea70094e00316aa210080526ca70094200800b4e10318aaBL8;FFe0030191e00701ade3270194810200b021b03c91e0830091950100941f1c0072a00000546800805268220039280080520b0000146b270194000480522100", - "8052L8;FF2100805278270094601800b4e10314aae20315aaf60300aa7e270094571740f9570400b4541340f96e270094e00317aa210080526c270094601500b4e10314aaBBBBBBBL4;FF680a00f957feffb4e8ea7bd3089d009108e97b92e902088b212500b180fdff54000308cb02018052721b0294e8f", - "fff17e003032a761b0294f40300aae5ffff17L4;FF150040f9e0230291f40308aabba301d147130094f60f49a9a0a301d1e10315aae20316aaf6100094b9df79a9b8d77aa93f0b00b161050054750600b4a0a301d1L8;FFa84e00a9f44f42a9f65741a9fd7bc3a8c0035fd6edf7ff97fd7bbca9f85f01a9f", - "65702a9f44f03a9fd03009109800091f30302aaf50301aa29fddfc8f60300aaBBL4;FFf7020191e1d4ff5400e4006ffc6f42a9a0033bada0033cad3b1100b4f3b344b9f7af44b940430091f6ab44b9f4a344b9a18301d16802170bf5a744b979060011L4;ZFL8;FF1f3000b91f0800f9940100b415210091", - "04000014940600f1b5620091e0000054a1825ff881ffffb4a00240f922008052709b0094f8ffff17685242a97f1600f9BBBL4;FF2587c13de40fc53de0fb843d227fc13de1830aade023c53de617c53de48f0dad2383c13de7ffc43de1f7843de127c53de307853de78b0bade3970cade31fc53dL4;FBbc6", - "4440000000000000000000000000010000000000000000800000000000000e45c440000000000000000000000000010000000000000000800000000000000L8;FF080200b008e12791e9a703f9e9af03f9e90303aae3031d91e8b303f9e80300aa0002009000043591e7af02a9e9e700f9f7eb10a9e8bf00", - "f9ee2b04a9fc4712a9BL8;FFe18b833de157c33de287833de17f833de287c33dbf0600b1e07b833de07fc33df4179f1ae383833de37bc33de183c33d2083853ce08bc33de8cb02f92183863cL8;FFe8f302f948c141393f0500b1f3db02f9ffef02f9ebab08a9e89f00b9eae702f9fff702f9fb4300f9203", - "30054f4a740f9f98342b9b41700b4f3a340f9695b0094BBBBL4;FFeab702a9f0bb01a9ec0b00f98803c0da0811c0da880e488b08010e8a08fd119b1702088be80317aaea825bf8090d5bf83f0500b15301889a680a40f91f0308ebL4;FB61702d322e31342e322f7372632f696e6e65722e727300083c657", - "2726f723a20c0013e002f72757374632f343861323239636561656664343938356335303939L8;FFe08708ade08b42ade08b09ade08740ade08707ad002700b4e0c3039195f8ff97c8010014e1430091e20313aaf70b00f9f74b00f911090094e08744adf50300aaBL8;FF000440ad09810091f30301aae0", - "230091a8273ea9080300b008211d91a8031ff808008012a18300d1e00701adf4230091a8831fb89174ff97600640a9280000d0L8;FFddfdff17e06300912200805223008052240080525691ff97e11740f9e4fdff17e0630091e10317aae20316aa23008052240080524e91ff97f71740f9e80f40f9BBBL4", - ";FF78bb01942003188b0101805276bb0194a00100b488fe43d31800188b970600d19f2600f1e00318aae11f805209f17dd3e20319aa280108cbf432889a6bbb0194L4;ZBL8;FF08008092e1230b9102398052688600f8e00313aa7fbb009430000014e8431291e12302910232805200e1019179bb0094808", - "2c43c8182c53ce0230b918282c63cBL8;FFf3031faa088c48f81f0500b1c1dfff54e8031faa080113aba3060054a00200d000c02191763b0194f3031faa080c47f81f0500b121e3ff54e8031faa080113abL8;FF681e42f96a2242f96b2642f96d2a42f96f2e42f9703242f97fc6133920a10291693602f9", - "6c3a02f96e3e02f9774202f968fe01f96a0202f96b0602f96d0a02f9BBBBBL4;FF2300805224008052e9fdff97610a40f95cfeff17e00313aae10317aae20315aa2300805224008052e1fdff97770a40f9680240f9080117cbbf0208ebc9cbff54L4;FFe2030091e00314aab0e6ff97a1035df8810000b4e", - "00315aa22008052750b009428008092680200f9f44f4ea9f76340f9f6574da9fd7b4ba9ffc30391c0035fd6L8;FF2f0000941f0400b161000054fd7bc1a8c0035fd6840b0194fd7bbea9f44f01a9fd0300916bfc7bd3f30300aae9031faa280080520a0180528b0300b574e87bd3BL8;FFf40301aa00fd07", - "364a000014f9031faaf6031faaf5031faa3400805237008052a8c300d1e00314aa17650094a9035d38a8935d383f050071e1000054a9835d38L8;FFf80300aa778b00944001805241008052758b0094b3008052405700b4680100d008e9039149408b52080140f909100079130300a9080000f9130b00f96", - "98b0094BBBL4;FFaa031ef809693738e81b40b9e003082ae4b6ff97a1035ef8a8035df81f0101eb401c0054a8835df8090680522a040091e003152aaa031ef809692138a1c300d1L4;FB75737420626520646976697369626c6520627920324d657373616765206c656e67746820697320746f6f206c6f6e", - "6753657269616c697a6174696f6e20696e76L8;FFe87344f9f14340f9eaaf00b9ea5744f9e39314adf9bb48a9e9030daae1a3803ded6f40f9e86300f9c8008052e0cf803de43f43a9e0cb44a9e37b42a94a050014BL8;FF810000b4c0025df822008052794b0194c1025ef8810000b4c0825ef8220080527", - "44b0194c10240f93f0400b1e0fdff54810000b4c00640f9220080526d4b0194L8;FF08fd46d308050091090c40f93f0500b1400400540a1440f9092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b4BBBBL4;FF0001158b83eb0194a8021b0be83f0439e08", - "749adf8c30891e257c03d08030291e1031f2ae83f00f908108052e08716ade08747ade2bf803df47f41f9f57b41f9L4;FB08000000000000004c53420000000000000000000000000008000000000000000800000000000000304b42000000000000000000000000000800000000000000L8;FFe3fdff979", - "50a40f9550300b4610a40f9680240f9960640f91f0101eba0080054680640f9490380522a040091e00315aa6a0a00f909692138e10313aae8eaff97BL8;FFf31300f9fd430091e90301aaf30300aae10200b021d42991e8030091e00309aaa2018052bf6b019468620091e10200b021082a9104030090846", - "02691e0030091L8;FFf52340f9fd7b43a9ff830191c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0316d1f30300aae8430691e00301aaff0300f9BBBL4;FFf72b40f9f65746a9fd7b44a9ff030291c0035fd6200080528104805282ab0194ff8304d1fd7b0ca9fc6f0d", - "a9fa670ea9f85f0fa9f65710a9f44f11a9fd030391L4;FF08e90eaaeb030d2a0d0045924b210baa0a0149b20e054ab24a11889ace11889a1f0046f24a018e9abf0100f10df07cd30a018a9a6e018b9a9f0500710a118a9aL8;FFfd030091ff0307d1380840f9f40301aa1f4300f1e1140054950640f9f903", - "1faa4800805213038052e00700f9ff7f03a9ff7f06a9ff7f09a9ff7f0ca9ff7f0fa9BL8;FFe16340f9e22340f9081940f900013fd6e03b02f9e8031691e13f02f9290c40f9e103129120013fd6fbc342f97f0f00b1a106005488008052f43f42f9e8a31139L8;FFe20318aa00011a8b822b00944803188be", - "00319aae10318aa22008052a8031ef8742b0094090000141f090071814e0054090180d208df78920900f0f23a0140b2BBBBBBL4;FFff030191c0035fd61f0500f141010054e80741b2e0030091e80300f994080194e10300aa20008052fd7b43a9ff030191c0035fd62a05c0392b0900910d0900d1L4;FFa", - "4018052eabf00f9f9031aaae8af00f94ef5ff97ec6b42f9e96f42f9fa7342f9e27742f99f0900b101400054e0431391e1031aaaf7a714a9dc090094ec6b42f9L8;FF78130194e00313aa2100805276130194400100b528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd62000", - "8052800600f909028052BBL4;FFe8430091e92300912a0300b04ac10d9108017db2200300d000d02f91e9ab05a9a9a300d1a8831df8280000b008511991e9a306a9a8c301d1e16301919c930194L4;ZDL8;FF840100d084c01791a32300d1c2008052a8831ff8c4930094c4930094f44f43a9fd7b42a9ff0", - "30191c0035fd6fd7bbea9f44f01a9fd030091080040f9f30300aaBBBL4;FF0800f0f2080900d1680200f9f44f5ba9f6575aa9f85f59a9fa6758a9fc6f57a9fd7b56a9ff030791c0035fd6b58356f8f95340f997fcffb5e9ffff17e01740f9L4;FB4962db261c916bcb6e7e1ca83fd17f0be1a5f018c1cb93", - "47f044b1019f9bc18850c69b09c7f1e05f0000b8876ba8a3082d69c3b57daea31ec61b153b2b5d5c87L8;FFea8b45f9e8eb00f9e88f45f9e88f00f9e89345f9e82b14a9e89b45f9ea9745f9e92313a9e89f45f9e9a745f9e8ab01a9e8ab45f9eaa345f9e8a704a9e8af45f9BL8;FF2a040091e00318aa096", - "92138e1431691ead302f92a0c0094fad342f9e8cb42f908011acb1f0308eba8350054e8cf42f9e10319aae20318aa00011a8b75530194L8;FF14210191f3032d91aff6ff97080000f008612091c9048052e85706f9080000d008c10191e85f06f9080100f008413191e8fb02f9000100f000301b91e80303", - "f9BBBBL4;FF09000014a0831cf8e10300f021f42691e30300f063182891a0e300d16201805264008052d4e70094a0835cf8afffff17a0e300d1a8ab3ca9c6cf0094e81345b8L4;FBb9000000050000009a964800000000003300000000000000e5000000050000009a964800000000003300000000000000", - "ed000000050000007265757365642062L8;FFff270039e80300f999e8ff97e80300aa210200f021001a91230200f063881591e0030091a2018052a4008052e80300f909000014e00300f9210200f021001a91BL8;FFc806805234008052a00301d1a1c302d122008052b4031ef8a0873aade28344ada9035", - "538aa135538ab2355382901084a4a01084a6b01084aa9031538a9335538L8;FFc00240f9220080527a730094f8ffff17f37749f97f0600b140020054e18349f93f0400b140010054810000b4e08749f9220080526f730094e18f49f9810000b4BBBL4;FFa98318f8a8831af8f9e305a9392400b4e20319aa", - "19210091bca303d122000014b40353f8c3ffff17a08312f8610300f021d42d91630300f063b42391a06303d1L4;ZBL8;FFe9ffff1769018052eae701b28b0480d2e97ea99b4a0941d2c23240f9297dca9b8a048052292d0a9b5f0009eb62070054c10a44a9e0230091e30315aa89fcff97BL8;FFe0833291", - "0800f0f2ffa73239e85306f997280094e10300aae15306f9e0833291a102009021c00a9102028052a302009063341891a4028052fe000014e05306f9L8;FFa4028052af000014c80080d2e0632a39e0432a910800f0f2ff672a39e84b05f99328ff97e10300aae14b05f9e0432a91e10000b021e00291020", - "28052e30000b0BBBBBL4;FF692202a908038052e90741b20000803d602201a9692200a9f30b40f9fd7bc2a8c0035fd620008052010380527e030294fd7bbea9f30b00f9fd030091f30300aaL4;FF41300054ef2300f9fc031faa1900f0d2e12f00f9f503152ab70000b4e1ee7cd3e00314aa020180527203", - "0094280341d23f0300f114459f9a9f0600f128010054L8;FF7c030194f8ffff17340100b48806148be00313aa01f17dd302018052f44f42a9f65741a9fd7bc3a872030114f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9BL8;FF210300b021682d916202805260001fd6ff8300d1fd7b01a9fd4300910", - "90040f9e80301aa2a4540b85f01007129119f9a5f050071e90300f9c1010054e9030091L8;FFc983009468c20091410100f0219c1591640100d084200b91a32300d182008052a8831ff8c0830094740100d094e20491410100f021301d91a32300d142008052BBBL4;FFf44f41a9fd7bc2a8022b805281c3", - "0114fd7bbca9f85f01a9f65702a9f44f03a9fd030091150840f9f60301aa3f0015eba204005408038052f30300aa090440f9L4;FB080000000000000020624700000000000461470000000000746a4700000000006120446973706c617920696d706c656d656e746174696f6e2072657475726e65L8;FFe8", - "8700f994150094efb343f9ff0900f1010b0054b60000b4e06740f9e10316aa2200805273c30094e05f40f99c0000b4e1031caa220080526ec30094e05b40f9BL8;FFe0050054680640f9090180522a0400916a0a00f909692138e10313aa28fcff97801e40b980010034610a40f9680240f91f0101eb2005", - "0054680640f909028052L8;FF80c38d3c800fc03d821f803d4047803d801fc03df81f00b98043813c00e4006fa80319b889430df8aa0312b8a8c313b8828707adeb1300b9ebe303b9200300adBBBBL4;FF1f0400b141fdff54e0430591810080529de30194c0e50035e85341b9e8cf00b957ffdfc8d70200", - "b4ff0600b100030054f843059199008052e00318aae10319aaL4;FB7279707465643b206d757374206861766520612072656d6f7465206964656e74697479206b65790073e84800000000003800000000000000490100000a000000L8;FFe0431e91a1035db8e8f9ff97e8030091e0432d91e203009101c1", - "009197f9ff97e8432d91e9b745f90081c03ce8ab45f9e9c301f91f0500b1e0df803da0210054BL8;FF219c349162028052fd7b41a9ff830091b66301143f0900718103005409210091e10200b021a03591e40200b084203591e60200b0c680329103050091e5230091L8;FF0b018052140000148d7d1c53a", - "d0600340d00be528d010d0b4c2180396b710d8b8c00f8b761e10c8b2b0180520a0000144d254039bf0500f1c80100548c190012BBBL4;FFf50319aaf90316aaf6031caafc031aaafa0740f9b80000b4e00309aae10318aa2200805273a30194bb0000b4e0031aaae1031baa220080526ea30194dc0000b4L", - "4;FF231000330320003975424079601a40b9610640f9b54e14124200152a00040051601a00b962420079411d00b4000080d21f000039007d20d461400d9163c00d91L8;FF210c1691a40100d084802091e323009182008052e80700f9b8a30094fd7b41a9ff830091c0035fd6810100f021fc15918200805", - "2ada30014080040f9e00301aaBL8;FF290d40f920013fd640010036880640a9820241a9090940f96822009120013fd67f0200f9f44f41a9fd7bc2a8c0035fd6800640ad280080526082803c6182813cBL4;FF8000805206000014e00313aad9020094e80300aae00301aaa8fe0737680240f9090540f91f0", - "009eb29060054e80f41b2e80300f9e00300918d18ff97f44f45a9L3;ZBBBBBBBBBL4;FFf70f00f9170b00b4a00240fdfc0f40f9fa031faa1b0c8052f80315aa0088202e0800669e17c10192f70000b5008f40fc5a2300910088202e0800669e17c101f2L4;FFe91b00f9570100b50d000014a003df3cfbfe", - "48d3fa03172ae00f803d20000014fa031f2a39008092b70000b4e00315aae10317aa220080526e1d00943f0b00b1L8;FF20008052e1031faaf40303aae71d01941f0400f141020054776240a9e00313aa0103805202018052721d0194e00317aae10316aae20314aa701d0194b85e00a9BBL4;FF80a20191", - "a14301d10809c05a2909c05adf9202f8e82712294809c05a6b09c05ae92b5c29e82f132922008052df1202f82809c05a4a09c05ae92f5d29e82b1429L4;FFfd030091017c4093e20304aa060080d2050080d2040080d2e00780d2e0ffff97fd7bc1a8aef5ff17fd7bbfa9e40301aae30302aafd030091017", - "c4093e20304aaL8;FFe00308aae10309aab49d0014000040f9979d0014000040f9ab9d0014fd7bbea9f30b00f9fd030091011c40f9f30300aa3f0800b1800100543f0400b140010054BBBL4;FF832600541803008b060000141f0400b1012600549add01941f1000318125005439feffb505000014e04305", - "918100805295dd0194c0240035e85341b9e80f00b9L4;FB01000000000000009c484400000000006054696d657374616d703a3a746f5f756e69785f6e616e6f73282960206973206465707265636174656420616e642077L8;FFe8030eaad40e0014e8af43f9eab343f9e9cf00f9e9ab43f9ebcb43f9f257", - "44f9e8e700f9e8b743f9f17744f9eea743f9f7df43f9fbe343f9e82b17a9e8bb43f9BL8;FF02738052835d0194f8031f2ab701001403e4006f0083c03c0183c13c0283c23cf6d344f9e0074091fbcf44f9f9c744f900802f91f5cb44f901048052e01b843dL8;FF6a0a00f909692138e10313aa3bfaff977", - "70a40f9680240f9080117cbbf0208eb880a0054680640f9e10316aae20315aa0001178b775d0094e802158b680a00f9BBBBL4;FFfd430091ff0311d1ff0300f909404039490e0037150040f9f40308aaf30300aaa80e40f9680700b4770640f9a00642a9e20317aa1df8ff9708fc79d3e1e7076fL4;ZFL8;", - "FFe01700f989ffff17c80080d20800f0f2080500d185ffff17c80080d20800f0f20809009181ffff17c80080d2e0a30039e08300910800f0f2ffa70039e81300f9BL8;FFfd7b42a9ffc30091c0035fd609a000912103009021203c91a9831ff82403009084a03b91060300d0c6e0129103200091a52300d1", - "e00308aaa2028052c17d0194L8;FF609fff54e1630091e00315aac6000014e8031faa000117abe2570054e1630091ef7cff97df0600b180070054e11740f9e80f40f91f0101eb60300054e81340f9BBBL4;FF010340f9390080399900f8b728040091490400d1110000145f2800f1880000542800028b08f", - "1df380809f837a00301d144260094a8035cb8a8160037880a40f9L4;FB697473656e64726563767265616400009c884900000000000e00000000000000ec0000002c0000006368756e6b2073697a65206d757374206265206e6f6e2d7aL8;FFff2303a9e87f05a9ff2306a9e87f08a9ff2309a9e87f0ba9f", - "f230ca9e87f0ea9ff230fa9e87f11a9ff2312a9e87f14a9ff2315a9e87f17a9080a8052ff7f01a9BL8;FF00c025917e3d0194a00200f0006029917b3d0194a00200f000c00991783d0194fd7bbfa9fd030091083040b9c8030034080140b20811c0da081540d2080d088bL8;FFc1080054606641f9616a41", - "f9290c40f9e8830f91e1031baa20013fd6fcf341f99f0f00b14112005448008092480300f9a8008052620d00141f090071fc432a91BBBBBL4;FF39440094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faa7e0d0294e00741a97c0d0294fd7bbba9f90b", - "00f9L4;FF0900f0f229017fb2e9af00f9291d00120afd60d30801092aeadb00f9e81f01b9e8cb00f9e8c700f9e18b40f9810000b4e09340f9220080526e0d0094e13355a9L8;FF990d0194fd7b45a9ff830191c0035fd61f110071a1090054202040a96102009021e03b91030d40f9c2018052fd7b45a9ff", - "83019160001fd6202040a961020090BL8;FF21702991e00308aa82008052fd7b41a9ff830091b58d0114ff0301d1fd7b01a9f51300f9f44f03a9fd430091f30300aae8030091e00301aab18d0194680240f9L8;FF840100b084c03391a3630091a2008052a80f00f9c48d009468020291610100d0214c219", - "1840100b084403491a3630091a2008052a80f00f9bb8d0094bb8d0094BBBL4;FF006039917ecd0194a00300d000c01c917bcd0194fd7bbca9fc5f01a9f65702a9f44f03a9fd030091ff0308d1f60300aaf30308aaa8c302d1e00302aadaa50094L4;FB6520746f2066697820656e63617073756c61746531", - "2073746f72656420737461746520656e6469616e6e65737300000080214900000000005800000000000000L8;FF220080527bcd0094b40000b4e0c741f9e10314aa2200805276cd0094570080529f0300146083c63c6183c73c6283c83c6383c13ce077813d6083c93ce17b813dBL8;FFe9035039e80b02f", - "9e8430691a9090034e90310916a0100f04ae136911a0380d2c00200d0003c2c9108210091e1c30e91e9db01f91a00f0f2eadf01f99c4d0194L8;FFf54f43a9f75b42a9fb0f40b9f96341a9fc0340f9060000143c008052542340f9b4031df874f1ffb509018052a8035df8755a00a9755e01a9785e02a97c", - "6605a9BBBBL4;FFe00313aae80f00f9e6d8ff97f90f40f9f80740f9080319cb7f0208eb880f0054f70b40f9e10314aae20313aae002198b78ed01943903138bf90f00f9f50200b5L4;FB65727465787456657273696f6e556e7265636f676e697a65644d65737361676556657273696f6e4e6f4b65795479", - "70654964656e7469666965724261644b6579L8;FF291540d2290d098b29250191891a498b29050091200108ab02080054e10313aaefecff97560300b4610a40f9680240f9b70640f91f0101eb40080054680640f9BL8;FF02000014f82300f9e83740f9e9e30191ff3f00f9b57f3aa9e0030191a82739a9a", - "1c301d10767ff97e8a746a90a0d40f94901098b090d00f9e00740ad600600adL8;FFe04316912200805291100094e00319aaf90b40f9e1d342f9c3fcff17400100d000e02591796d009420008052017880527d6d009420008052010880527a6d0094BBBL4;FFf85f4ba9fa674aa9fc6f49a9fd7b48a9ff83", - "0391c0035fd6fa0300aab50200b470ad0194e00315aa21008052370080526dad019400f8ffb4e1031aaae20315aaL4;FF29140033c20000542a7c0653090500394a051a320a01003912000014eb0f80122c7c10532b2c0633ec0000352a7c0c530b050039090900394a091b320a010039L8;FF37f6ff97e8", - "eb40f9eaffff1717038052e88307911323179b680240f9a80000b4600640f901f97fd34200805271ad0094e827039118070091e1031aaa00f1cf3cBL8;FFe04341f9400501ad2083c73c2183c43ce9b304f9400902ad2083c33cc282c93ce93304f9400500ad2a0080528083ce3ceaa71139eacf42f902f1", - "8f3ce8031691L8;FF00960054df0600b1f7030291a0020054e0820391e1e3179102278052fce314a9f5af00f97b2d009412000014da0640b27a6e00a9797201a9785602a9ff074091BBBBBBL4;FFf44f08a9fd430191081c0012f30301aa1f090071a1010054570040f9e80640f9280200b4e10240f93400", - "80391402f8b729040091080500d1e92200a91f0114ebL4;FFe0fbc53de31f813de207813de1831fadea2b02f9e4fb803d3f0500b140140054e12fc13de02bc13daa0000d04a213391e233c13de86f02f9e13f813de11fc13dL8;FF41020054a81a40391fa50171e1010054a81e40391f91017181010054a8", - "2240391fe9007121010054280500511f0d007163030054ea031f2a8800805222018052BBL4;FF896a4039eaab4039e8a700394801094a896e4039eaaf4039e8ab0039c8010d4a4901094a8a010b4a8c3e4039e9af0039897e40390b020f4aeab30039eabf4039L4;ZBL8;FF7f950094f3031faa088c48f81", - "f0500b1c1dfff54e8031faa080113aba3060054800100f000e00d9175950094f3031faa080c47f81f0500b121e3ff54e8031faaBBBL4;FF2800028b08f1df38e818f837e08300914c3e0094e82340b9a8410037e81b40f9aa0640f9490108eba3500054aa0240f9e01740f94801088ba82600a9a88355f8L", - "4;FBcb00000009000000617373657274696f6e206661696c65643a2063757272656e745f6b6579203e3d20706172616d732e6d61785f6f6f6f5f6b6579735f6f725fL8;FFe9230ca9e85b44f9e95f44f9e8ef00f9e86344f9e86f00f9e86744f9e85f00f9e86b44f9e8e300f9e86f44f9e9a30aa9e87344f", - "9e80700f9e87744f9e83f00f9BL8;FFfa031faaf9ab49f9f8074091188309913f0700b1a018005400c30391441c0094080040b20811c0da081540d2080d088b0825019109fd46d30800098b08050091L8;FF68008052e1833291e97f06f909078052e86b06f92801009008351091e96706f9290080d2ea6f", - "06f9e93ec0f2e87b06f9c8048052ea5706f92a0100904a2d0e91BBBBL4;FFf40301aae10302aaf30303aa63cf009400010034808640a9e833009193cd0094f5334039bf0a0071e1000054e0031f2af44f44a9f65743a9fd7b42a9ff430191L4;FBd5934800000000004d000000000000005f0300001c0000", - "0024954800000000005b000000000000008d0000001100000073657373696f6e5f76657273696f6e72L8;FFe1031faae3ffff17880240f91f0500b1c10000549f5e00a99f7e01a9977e02a9981a00f99f3200f9e10314aae20313aa27060094c00300b5e1031faad5ffff17BL8;FFfd7b41a9f31340f9ffc", - "30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa0103009021001891e8030091e00309aa02018052b9750194L8;FF2801088b49010b8be14316910001098b3a120094da0300b4e1d342f9e8cb42f9f60700b9f63749f91f0101ebe0d50054e8cf42f9490180522a040091e0031a", - "aaBBBL4;FF896b28380805001171ffff17f44f5ea9f6575da9f85f5ca9fa675ba9fc6f5aa9fd7b59a9ffc30791c0035fd6800300d000e0069172b50194ffc306d1fd7b15a9L4;ZDL8;FFf40740f9d80000b4e00315aae10318aa2200805277b50094ab835ff8f91b40f9bb0d00b4e0031caae1031baa2200", - "805270b50094ab835ff8f3031f2afb031faaBL8;FF0071005400e4006f0823059189ab40a9ffa305f9f6a705f9f6b305f90001803d08018052e8cb05f9e8672a9100f18f3ce8c32c91e99b05f9ea9f05f90003813cL8;FFdb050094f6ef41f9e8e741f9df0208eb61000054e0230f91cb6bfe97e8eb41f90", - "9068052c822099be9430891200543ad2221c03d18000014c80080d2e0c30e91BBBBBL4;FF6082823c695201a9f44f4ba9f74b40f9f6574aa9fd7b48a9ff030391c0035fd6a0835df8ddffff17a0031df82104009021dc2c9123040090638c2d91a0c300d1L4;FF2b0580524a0108cbe80f00f95f1d00f12b", - "692138c90d00543b6928f808210091e80f00f9e083c03ce80f40f96002803d680a00f9f44f47a9fb1b40f9f65746a9L8;FFe0edff5400200091f44f42a9f65741a9fd7bc3a86e000014e80300aa098d40f83f0500b1a0000054f30300aae00308aacb020094e00313aa088c48f81f0500b1BL8;FF0a0000d", - "04ae11991020300f042543891a8831ff8e9ab00a9e323009192850194fd7b43a9ff030191c0035fd609004039202040a9030d40f9a900003621030090L8;FF42a035918085009440008052e10318aa8585009440008052e1031faae2031baae30315aae4031faadad6ff97630100d063e02d9120008052e1", - "031faae2031faaBBBL4;FFf85f43a9fa6742a9fc6f41a9fd7bc6a878c50114f60308ab83ebff54a00300f00000069176c50194ff030791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L4;FB8b634900000000003800000000000000ca0100001d0000008b634900000000003800000000000000fd010", - "0001a00000050726576696f7573436861696e4b6579L8;FFe16b40f9e20319aae04700f981c50094eccb40b9eb03142af500001428008052e85f00f9fc7340f9ba0000b4e06f40f9e1031aaa220080526ec50094fafe48d3BL8;FF680240f9080540f91f0119ebe9030054e00313aa99fdff97c009003728", - "fc60d3a80600b5200840921f1800f182070054217c0353010800343f04007100010054L8;FFf503012a74040051e00313aa56050094e80300aae00301aa28fc073708fc60d3c80100b5080840921f1900f102020054017c0353210200341f1100f160020054BBBBL4;FFe20316aa7de50194e8e279d3a102", - "168b021117cb2b000014090e80524804099b6004099b89e079d3221104cbe10308aaf44f44a9f90b40f9f65743a9f85f42a9L4;FB696f6e20737461746520636f727275707420666f7220c0023a20c0002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e2d6c696e75782dL8;FF29", - "02009029ed1591e1a30091e8a705a9080200f008512f91e8ab07a9ea08805288008052ffa702a9090200f029312e91e9ab04a9290080d2a91ac0f2e8ff03a9BL8;FFe00b00f9f73340f9a0e300d1b8831cf8fa0301aac14dff975f0700b160070054a8e300d1e00316aae10317aa6e3b0094ba0000b4e103", - "1aaae00316aa22008052L8;FFa1feff17f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4600640f92200805270650094610e40f9810000b4601240f9BBBL4;FFe0230091220080522300805224008052e797ff97e10f40f9b7ffff17e0230091e10318aae20316a", - "a2300805224008052df97ff97f80f40f9e80740f9080118cbL4;FF1f000039007d20d4c0035fd6fd7bbba9fd030091f35301a9340000b080021091000840b92002003481021091330840f9d31100b4600640f97f0200eb60050054L8;FF080080927f0a00f97f1600f97f2204a9f30b40f9fd7bc2a8c0035", - "fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aaa101009021c01491e8030091BL8;FF1f01096be0179f1a942501948842403969424039aa02000ad6020a0a1f01096be0179f1a8d2501948846403969464039f503002a1f01096be0179f1a87250194L8;FF200500ade00b44ad200901ade8", - "ff07391a00001409108052e1830191160101d1220108cbe98301913a01028be90306912001088b77250094e82341f9e92741f9BBBBBBBL4;FF090540f9340000145f2800f1880000542800028b08f1df38c808f837e003009148820094e80340b9c8020036e00740f9f44f45a9f65744a9fd7b43a9ff8301", - "91L4;FF9c1200f98282823c8182833c8082843c68320039f44f5aa9f65759a9f85f58a9fa6757a9fc6f56a9fd7b55a9ffc30691c0035fd6e90740f917008092e20344adL8;FFf44f05a9fd430091160440f9760200b4335040a9380200f018331091170040f9b9730091750200f0b5e21891e8164038e303", - "0091e00313aae10314aae20315aaBBL4;FF1f0500f1a1030054e88241f8e082c03ca9c300d140030090007c1991a14300d1a8031ef8080200d008e13691a9233fa9c8220091a0039d3c9d9901946083c03cL4;ZFL8;FF2901084aab331738ab635738a9431738a97357384a01084a6b01084aaa531738aa8", - "357382901084aab631738ab935738a9731738a9a357384a01084a6b01084aBBBL4;FFe00315aae10318aa87d90194f80600b4f60300aa73d90194e00318aa210080523500805270d90194c0feffb4e10316aae20318aaf90300aa76d90194e00316aaL4;FB7465732e7273001b737071722076312e73656e", - "645f656b2e726563762065706f636820c01b3a2048656164657253656e74202d3e204374315265636569766564L8;FFe8e743f9eaf743f9e8df00f9e8ef43f9e8af15a9e8fb43f9eb0b44f9e8b700f9e8ff43f9e9a318a9e80344f9e90744f9e8eb00f9e80f44f9ea2311a9e81344f9BL8;FFe0031aaa096", - "92138e1431691ead302f92b120094fcd342f9e8cb42f908011ccb5f0308ebe8d40054e8cf42f9e10316aae2031aaa00011c8b7659019488031a8bL8;FF2600805203eeff97e85b42f91f0900b1c07a0054c90080d20900f0f2294500911f0109ebc08d0054e02fc13de133c13de0031791e237c13de3032d", - "91e4833291BBBBL4;FFf50301aa77f90194000280520101805275f90194e00400b4c8c20391e10315aa1f200039080000f92804009008412b9160a200a9090d40f9e803009120013fd6L4;FB002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d3139343963663863366235", - "62353537662f686b64662d302e31332e302f7372L8;FF880200f98082853ca18378ad8282843c8182803c8082813ccaffff17e08742ade00314aae21fc03de84340f9a0873aade08740ada203973ca80318f8a08738adBL8;FF1f0500b161000054bfe733a9bf8314f8a12303d1a22301d19c62ff9760f4f", - "fb444000014a8035ab848000037b9031af8e1b20191a22301d1a363ff9760f3ffb4L8;FFe1074091e0431691023f8052218009918079009488e20791000540ade8f36879e8e30a79e057813de15b813dbc010014f6c744f9e04316910123009102738052BBBL4;FFa06301d1e10314aae30317aa04018052", - "05098052e2031aaa33f0ff97a8835af81f0500f160020054a8035bf8f31745a9fa2f40b9e30314aaff0214ebf7a308a9L4;ZBL8;FF080680527fa21ba9080480527ffe12a97ffe15a97ffe18a97c42003960828f3c7f220739686a1da9685a1ea998ebffb55fffff17c50100b0a5a03291e1030191BL8;FF", - "080d088b0825019108fd46d308050091091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8bL8;FFe80314aaea5740f9f44740f9f86b00f9bf000014a82247b8e9cf4779eaff41f9eb874f39ec034879e82309b9e8fb41f9e94b1279e9f", - "741f9ea4b05f9ec331579BBBBBL4;FF28020036e90b40f923000014f503042af70303aaf60300aa5f2800f1880000542800028b08f1df38e82df837e023009144720094e80b40b9280e0036e90b40f9L4;FFca018052090140f98b0000f06b8d3991e02b01a9086140f8090000f9c9008052eb2702a9e087", - "40ad086000f8e80741b2682a00a9608600adf44f45a9f65744a9L8;FF200440a96202009042b00391e3030091e92301a994090194fd7b42a9ffc30091c0035fd6ffc300d1fd7b02a9fd830091490200f029c13e910a0000904ae12491BL8;FFe8c30139e86340f9e97b00b9e9e74239eafb0079fa5b00f9c", - "1050054e0c30291e90f00b9e82300f9bc71ff97e83340b9fa5b00f91f010072e83f40b908119f1aL8;FF94221c9bf50314aaa88640f8a80000b4a00240f901f97fd34200805275890094e8030a91930200f90001c03de81740f9a002803da80000b401f57ed3e0031aaaBBBL4;FFfd7b42a9ff030191c003", - "5fd6e00741a985c90194ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091040180520504805229f87fd3L4;FB080000000000000080f445000000000000000000000000000800000000000000080000000000000038f54500000000000000000000000000080000000000000", - "0L8;FF1f0700b120030054b80100b4e0031aaae10318aa22008052f40309aaf9030eaaf6030b2af8030c2a72c90094ee0319aaec03182aeb03162ae90314aa750100b4BL8;FF601240f9220080527a490194611a40f9810000b4601e40f92200805275490194612640f9810000b4602a40f9220080527049", - "0194613240f9c10000b4603640f9L8;FF081540d2080d088b08250191081848abe2090054180118ab020a0054390700f194c2019161feff54080317ab22070054c902158b080109ab62090054691640f9BBBBL4;FFe8234039e8010036e80300d008212b914903805204000014e80300d008892b91690280", - "5268a600a92800805268020039fd7b43a9f32340f9ff430191c0035fd6L4;FB204c420000000000e41f40000000000010000000000000000800000000000000b87b400000000000e41f40000000000018000000000000000800000000000000L8;FF1800001448008092680200f9ff830f91f44f42a9fc57", - "41a9fd7bc3a8c0035fd6140700b4f50303aa6ee90094e00314aa210080526ce90094200900b4e10315aaBL8;FFc0035fd6fd7bbea9f44f01a9fd030091f30301aaf40300aa72690194000380520101805270690194000100b40103009021402991144c00a91f400039f44f41a9L8;FFe8c741b9f81f40b94", - "003803dfacf40f9e002803de9d302b9214b803dec030b915f0b00b141d6ff54f3feff178083c03ce8430f91000d803d888341f8e9035039BBBL4;FFbb0700b477a90194e0031baa2100805275a90194e01e00b4e12f40f9e2031baaf70300aa7ba90194df0600b1a0060054e0534da9df0214ebc9060054e", - "10316aaL4;FF09028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd6c0035fd6fd7ba7a9022680d2e4830191fd030091f35301a9f30300aaf40301aae00304aa01008052L8;FFe20318aa0001158b82a90094a802180be83f04392100001415020034e8430391e10317aaf902028b0001158b79a9009", - "4e89b40f960020191e143039122008052BL8;FFa5290194c81a00121f810071c21a0054e80700b9e8430691e0430391db290194880200d008013791ff7f01f9000540adff7b01f9f30700f9e08715ad000941adL8;FF08011891a0039d3cd60218912652fe97e0074091e13b40f9e8833f9100001891e243", - "2391dd4ffe97e8074091e0833f91e103279108011891e2832491ab4efe97BBBBBBL4;FFad0100543f0c0071a00200543f100071200300543f1400716104005421230191e20313aa99faff97a02d00b5f7031faad1ffff173f040071a00200543f080071L4;FFe0031aaa01c480522200805279110094e003", - "1baa018c81522200805275110094fae340f91d00001458ff78d3fb031aaa5a7c085348fc60d3eb7b42f9ed7f42f9L8;FFe10b0054692240393fb50071410c0054693640393fb50071e10b0054694a40393fb50071810b0054695e40393fb50071210b0054f40308aa680240f9699240b8BBL4;FFe40b03ad", - "e213c03de01e833de11a833de08742ade22a833de02e833de01fc03de122833de026833de022c33de126c33d6042823ce02ac33d6142833ce12ec33dL4;ZDL8;FF4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840", - "f9090100b42a0140b2BBBL4;FF3f0114ebe933949a297d0c9b696969b83f01086b8907009100f0ff54df0209eb6bc10191fc0309aaa1feff54fc0316aa7f0600b160090054f90313aa9f1700f1L4;FB2563ff46b0582749c6e6f794d196024be482bdb40f826bea9651aaf507e25709d5d09b84081a4ed73", - "5daf8a2296006a897900b70265932f53743a28c935fa54cL8;FFe95700f9092158a9e85f00f9e89b47f9e96f00f9e9bb47f9eaa31da9e8a347f9ea9f47f9e8f700f9e8a747f9e8ab05a9e8ab47f9e8a70fa9e8af47f9e84b00f9BL8;FF895101942000805201048152865101942000805201908052835101", - "9420008052010480528051019420008052012c81527d51019420008052210580527a510194L8;FFe89308b9e11f00f9a1170054e20f4ba9e0031691e56340f9e4031faa30e4ff97e8c342f9200bc03dfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1404f803dBBBBL4;FFdf0600b1000400ad40020054", - "15074da91ce749a91adf4aa90bef4ba9280400d11f0d00b1086740f968020054e88300a9087340f922008052f4030baae00308aaL4;FB6f6c3a3a73746174653a3a73657373696f6e000000000000729848000000000033000000000000006c0100002a000000696e76616c6964207265636569766572L8;", - "FF89000014e20313aa230c80520deaff97e10300aa210900b5a80640f91f011aeba9040054e00313aa5cf0ff976008003728fc60d3480600b5200840921f1800f1BL8;FF4a11c0da4a1540d24a0d0a8b4a2501914afd46d34a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b", - "2905009129010a8b2a0140b2L8;FF1f0700b1a01500548022029198250094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb4814005472000014fa031faaBBBL4;FF0800809236008052686e00a933008052e00748a9e91b40f9eba343a9fc2b40f9ceffff17a06", - "303d1bc99ff973f0700b1e0030054e03740f9e11740f9a86303d1L4;ZBL8;FFe00313aa02398052c08602adc21e803de80b02f97fb10094b4000014f5fb40f9561700b46fb10094e00316aa21008052390080526cb1009480fcffb4a1020191BL8;FF2001c03d0800f0f2e9f35639e06302f91c490091280", - "280520000803dfc5b02f9e85f02f9e86702f9e94313396501001428008052e80f00f9e82b41f9e80700f9L8;FFe1432a91022b8052f6ff01f9e8fb01f9e8830f9100810091001f803d7d310094e8f341f91f0500b101e5ff54e84340f9f50000f0f6c32491090140f9a8b240f9BBBBBL4;FFc00300b4e103", - "19aae20317aaf80300aa80010294050000143500805217035ff877feffb538008052e80316aa885600a928008052965e01a9985e02a99a3200b9L4;FF7c0100945f1b00f160110054f5d245a9340200b4b982009104000014940600f139c300918001005421035ef8810000b420835ef8220080526e01009", - "421835ff8L8;FFb7031ff8140117eba3080054b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcb9f0208ebe8040054340100b4680640f9BL8;FF240300d084602491e3230091e00308aa02018052e90700f9b8810194fd7b41a9ff830091c0035fd6ffc300d1fd7b", - "02a9fd830091050040f9e80301aa210300b0L8;FFffa301a9a00c0054e0630091e1031faa2200805223008052240080525497ff97e02342a9990a40f9490180520968283808050091e81700f939f8ffb5e8031faaBBBL4;FF29a13f91680200f928038052692202a9f44f47a9f72b40f9f65746a9fd7b44a", - "9ff030291c0035fd6e8a341b8e93f4079eb674039ec734079a81b00b9e8ab42a9L4;FB6e697469616c204132422073746174653a20c00076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f73657373696f6e2e72L8;FFa9831ef8a8031df8e8431091a103963ca2877", - "ead00410191a0039c3c8083813c8183833c8283823c35170094a0077bada8035af8a20f7cadf42f02f9e82b02f9BL8;FF680a00f9951640f9550300b4610a40f9680240f9961240f91f0101eba00a0054680640f9490480522a040091e00315aa6a0a00f909692138e10313aa20faff97L8;FF7c41009461", - "0e40f9810000b4601240f92200805277410094611a40f9810000b4601e40f92200805272410094e00313aa080c49f81f0500b1400000542d000094BBBBL4;FFe0023fd61f0000f1cd000054390300eb03a600541803008bf9feffb50f0000141f0400b161a5005495e101941f100031e1a40054f9ffff179", - "2e10194f70300aaL4;FBd5fb4800000000000700000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000900000000000000L8;FF08596a780001094a14000014480200f008010191e9030091030200d063c02291040200f0844012910021009", - "1e223009121008052e82700a9a2e10094480200f0BL8;FF0101805278610194200100b4140000f9e10200f021000491131800b91f700039f44f41a9fd7bc2a8c0035fd600018052010480528761019408a440a9e20301aaL8;FFe10300aafaffff17e1031faae86b00b9f7ffff17680240f9080540f91901", - "01ebe2000054aa000014e20313aa430c80528ff5ff97e10300aaa10a00b5680240f9BBBL4;FF99a101940005003788664039896a4039410300f021203e918a6e40398b3a407908bd70d3e083c03c420300f042801891e0230091a34300d1082109aa6905c05aL4;FF21010034226c1c53e303801203d01f3", - "801e01f7800c0228b1fc01f38c20a40f942400091020002cbe11e001201d01f38c30000cb42fc44d302e01f787400146bL8;FF810100f021841a91a40100d084401991a363009162008052b30f00f9c2a1009468620091810100f021901a91a40100d084c01991a3630091a2008052a80f00f9BL8;FF8006", - "40f9220080527a210194e00314aa01058052020180527621019420008052eaa340a9090817aa680200f96a2601a9f44f45a9f71b40f9f65744a9fd7b42a9BL4;FFe1010054e00302aaf40302aaf30301aad8000094e80300aae00301aa08020037980240f9080740f91f0100eb42020054e80f41b2e80700", - "f907000014c90080d2L3;ZB" + "BBBBBBBBBL8;FB0090460000000000045d000000000000045d0000000000000000010000000000010000000600000000f006000000000000f046000000000000f0460000000000L8;FFc2060054e80328aa3f0101eb7c03088b600800549f0b00f1812200f983060054892240a9960a40f9e8a700a9e8031", + "baa05000014e8031baa9c0700d19f0700f1BL8;FF60220291f30b40f9fd7bc2a8a8feff17610640f9810000b4600a40f92200805245250194611240f9410d00b4601640f922008052f30b40f9fd7bc2a83e250114L8;FFb8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08", + "011fcb9f0208ebe8040054340100b4680640f9e10315aae20314aa0001178bBBL8;FF8f610194fd7bbea9f44f01a9fd030091017c40f9f30300aa3f0400f18b000054608240f92200805243650194619640f914008092747e00f93f0400f18b000054L8;FF1a000014e80b41b2e00b00f907000014e80b41", + "b2a0831df814000014c80080d20800f0f2080500d1e80700f9e02300917a6bff97e10300aae10700f9a1fdfff0BL8;FF810000549f6605a99f7e06a99f02073881420191e003082ae20313aa12f5ff97c00f00b540fcffb4d7ffff17890240f93f0500b1810000549f5e00a99f6201a9L8;FD00000000000", + "00000000000000000000028004700000000000000000000000000ace546000000000044a0460000000000cc714600000000000000000000000000BBBL8;FB6a00000000000000090100002e00000042024000000000006a00000000000000b00000002e00000000000000000000000800000000000000080", + "0000000000000L8;FFe11740f9e80f40f91f0101ebe09a0054e81340f9090380522a040091e00317aaea1700f909692138e16300918f92ff97ba000034818a4329e363009180008052BL8;FF09010039c0035fd6ff8300d1fd7b01a9fd430091e10b00a9e10300912200805204000094fd7b41a9ff830091", + "c0035fd69f0001f1e1210054fd7bbaa9fc6f01a9L8;FF220080524c050094f3ffff17eb031f2af6030daae1030eaaef0310aa7afdff17e87a40f9c80000b40805088be00315aa0201805201ed7cd33f0500945a008052BBL8;FF09fd46d30800098b080500911f0109ebc9180054150114ab83000054c000", + "0014f50314abc2170054762e40f9f60400b4742a40f9f7031faaf80316aae00314aaL8;FF220080524c450094c10240f9810000b4c00640f92200805247450094c10e40f9a1fdffb4c01240f92200805242450094e9ffff17681a40f9280100b4090d8052L16;FFe8bf42f9e83f00f9e8c342f9e9a31da9e", + "8cb42f9e9d342f9e8f700f9e8cf42f9e82f00f9e8d742f9e84b00f9e8e342f9e9a30fa947c50094eb1b43a9ed031caaBBBBL8;FB4e000000000000001a04000009000000c89442000000000044954200000000003095420000000000789642000000000030944200000000003d0f400000000000L8;FFa97", + "316384901084aaaa35638a98316386901084aabb35638a99316384901084aaac35638a9a316386901084aabd35638a9b316384901084aaae35638a9c31638BL8;FFc20000542a7c0653090500394a051a320a01003912000014eb0f80122c7c10532b2c0633ec0000352a7c0c530b050039090900394a091", + "b320a01003908000014L8;FFc836003436008052f31b00f9df02086be0431391a14700d1d526961ad2ecff97e8030e91e1431391e003162a8bc1fe97e007409161220391e3030e9100401d91BBL8;FFe20315aa2300805224008052bae0ff97b6035cf8b4035bf8880216cbbf0208eb49dcff54a04301d1e", + "10316aae20315aa2300805224008052afe0ff97b6035cf8L8;FF2800805289fdfff029411f91aa8302d1a04700d1a8273ba968fdffb008a13291a82b3da90a078052c8048052bf2738a969fdffb029ed0a91a92b3aa9290080d2L16;FF1f0500f10114005408008092a02302d1766201a9685600a9b8ddff", + "97e0430f9144deff9790000014e8db43f9e0ebc13de9030b912003029128710ff8680e00f9BBBL8;FF24008052bc000094610a40f9e00315aa76ffff17e00313aa220080522300805224008052b4000094610a40f97cffff17e00313aae10317aae20315aa23008052L8;FF09fd46d30800098b080500911", + "f0109eb2816005426000014fa031faaf69f49f9f407409194820991df0600b1802200548062039171290094080040b20811c0daBL8;FF4df50094f8ffff17340100b48806148be00313aa01f17dd302018052f44f42a9f65741a9fd7bc3a843f50014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9L8;", + "FF930a00f91c000014007c4093220000900028009142000e91437860f87f0013ebc0010054640640f9c4e0ffb5650240f9650000b49f000039007d20d4230200b4BBL8;FF080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb499d0054180116aba20a0154b800f8b", + "6f9031faae00319aae10318aaL8;FFe1c32491e85303f9e8831a91e95703f9c9fdffd029611091e89b04f9e8831f91e99f04f99f310094687a40f9e9830e910a0000d04a712991e99b04f9e9831f91L16;FF89b1009420008052e10316aa86b10094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f", + "05a9fd030091ff4316d1ff0300f9f30308aabc8302d1080040f9BBBBBL8;FB795369676e616c4d6573736167656d657373616765726567697374726174696f6e5f69645072654b65795265636f72645374727563747572657075626c69635fL8;FF48210039490100f91aa4ff97f40b40f9980100b4b3220", + "09104000014180700f173620091e000005461825ff881ffffb4600240f9220080523f9d0094f8ffff17BL8;FF48060054680640f9e10314aae20315aa0001168b4f1d0194c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aa22008052f7000094L8;FF9c000014e89f4139e9", + "534678a1035ef8fc834139fa3740f92841082ae91346b8378108aa611200b4e00318aa8f000014bb0000b4e00319aae1031baa22008052BBL8;FF545d019468021a0be8ff0139081d0012290080521a0317cba90316381ffd007140050054ea03019149692838080500113400001413020034e8030191e10", + "319aaL8;FF0005803de033c33d0009803de9cf05f9a88357f8080540f9882600b4a02302d150f5ff97f50301aa804d0037a8fe60d3c82300b5a00a40921f1800f102240054L16;FF09f7ff54e00313aae10317aae20315aa2300805224008052f8000094770a40f9b0ffff17e00313aa2200805223008052", + "24008052f1000094610a40f9b7ffff17BBBL8;FF6009f8b728040091490400d16d000014f503012a74040051760240f9c20640f9a20500b4c10240f9200080398000f8b728040091490400d1110000145f2800f1L8;FFe9fdffb029351c91280f8052200540ad08800039c80ec0dafc0300aa01048052081", + "002f8e8074091e20314aa000400adc0fdff9000800f9108c1359103048052BL8;FFe20313aaf8fd0094965600a9930a00f9f44f42a9f65741a9fd7bc3a8c0035fd6c0feffd00000069198f90094fd7bbea9f44f01a9fd030091f30300aa14800091L8;FF01000014c0035fd6ff0301d1fd7b02a9f44f03a9", + "fd830091480001aba2020054010840a9f30300aae023009129f87fd31f0109eb0881899a090180521f2100f1BBL8;FFaba35638a9831638a9b356384a01084a6b01084aaa931638aac356382901084aaba31638abd35638a9b31638a9e356384a01084aa2833bad6b01084aaac31638L8;FFe00640ad6862", + "199169621a91c32ac03d60061e3960621991e10318aa759e03f9000500ade00a41ad63de813d000901ad800740ade8835039200500ad820341adL16;FF74a400b44fbd0094e00314aa2100805248bd0094c0fe00b4e16f40f9e20314aaf70300aa4bbd00941a0500143f0500b180200054600742ade0831d", + "9168234039BBBBL8;FB428b0000d140cb9f0bb09dc267489853730a01dd45e4c4149d8afc081a8924dda1938a4c17e19d149064a88a5511296483e2513ecce93c95a29a53dfeb393c25L8;FFe94b41f9a84240b9000401ada10240ad5f0109eb084000b9010000ad01fdff54f30300aae0430a915ce3ff97", + "e00313aaf34f41f9e2ffff17e84b41f9f84f41f9BL8;FFe2833291e10313aa89adff973c008092fb4340f9fc5b02f9d5010014c90080d2fb4340f9fa8302910900f0f23c4500911f011ceb80390054e02fc13de133c13dL8;FF0a0000f9086000f8e80741b2600a803d682600a9602601a9f44f45a9f5234", + "0f9fd7b43a9ff830191c0035fd620008052c10180527c090094ffc301d1fd7b03a9BBL8;FF9f0208eb61000054e00313aa8f48019408038052690640f9e013c03d8826089be92b40f91c000014e8430091e92300918a0200d04aa11f9108017db240ffffd0L8;FFf30300aa1f0500b1e0030054e00313aa4", + "0000094080040b20811c0da081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aaL16;FFe0f3803de8c300f9e81b42f9e8ab00f9e81f42f9e92312a9e82342f9e92742f9e8ab1aa9e82b42f9ea3b42f9e9a309a9e82f42f9e93342f9e8df00f9e83742f9BBBL8;FFea2", + "340b9d7160033b5721d124941092a08c10daaed0f40f9ea1b40f9eb1b00f9a98109aaca210aaae90f00f9e93740f9480108aa36fd68d3e92340f9e83302a9L8;FFe98316a90000803d08f000f8e9bf00f9e81f40b9e8030639e10740f961cdffb4e01740f91a000014e9031091aafffff04a51059180fdff", + "d00090199108210091BL8;FFe00314aaa0873bade08b44ada08b3cade18341ada18339ade28342ada2833aade18340ada18338ad01f5ff97a0877bade80b41b277010014e1430091e20313aaL8;FF0600b05211000014e00304aaa27c4093480c80d2011080d2030080d2010000d41f9800b160000054a50", + "0070b08000014e00304aa010080d2010000d4fbffff17BBL8;FF02feff17e04316912200805203110094e1d342f913feff17e0431691e1031aaae20318aafd100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691L8;FF04610891a5c7fe97e88340f9e00314aa016940b9efc7fe97e0234fa", + "9f4e302f9081140f900013fd6e0e702f9e8074091e1eb02f908011891290c40f9e1631791L16;FF00048052210080524aad0094602e00b4a8e300d1f80300aadc0ec0da000540ad28feffd00801289129048052e1831391e87302f90801805242008052000400adBBBBBBL8;FB6e6465782e637261746573", + "2e696f2d313934396366386336623562353537662f62797465732d312e31322e312f7372632f62797465735f6d75742e7273001d70L8;FF0801094a08010b4a89021b8b3f0500b160040054097d18536a0240797b0700b1e95a69780821094a095d10534801084ae95a69780801094a68020079f30318aaB", + "L8;FF992240f9881a40f93f0308eb6100005480c2009196bfff97881e40f9e083c33ce0031faa2823189b000d803de083c43c0011803de083c53c0015803de93740f9L8;FFf91b40f93f0b00b1c1070054e8fb4039e97b407937008052ea3b40b9eb5f4139fbf343f82841082ae9f344f8f67344f8eba300", + "395a8108aae91300f9580100b5BBL8;FFf65704a9f44f05a9fd030091ff431cd1f30308aa08018052ff0300f915008092e80b02f9e8e30f91e0ff01f9e10302f9f51302f9ff0702f9ff0f02f9a8831df8L8;FFe00315aa92ffff17e00313aa220080523a000094610a40f9a1ffff17e00313aae10317aae2", + "0315aa34000094770a40f9680240f9080117cbbf0208eba9f4ff54L16;FF09eeff9760fe073728fc60d3880700b5200840921f1800f1c2070054217c0353e10700343f0800712c0200543f040071e00300543f080071e1020054880243f8BBBL8;FB616c666f726d65642066696c650000001d1c40000000", + "0000540000000000000059000000050000001d1c40000000000054000000000000005f00000005000000L8;FFe80f40f91f0101eb20280054e81340f92a0400918022029149018052ea1700f90969213864e8ff97e16300918f8eff97808240f9800100b4e11740f9e80f40f9BL8;FFbf0202ebe30100545", + "f0101eba3010054610240f9200015cb370015cb4d01019489124092c80215ab770200f9690e00f963020054c0fefff000e0009193fd0094L8;FF23050054f70300aaa08300d1e10315aae20314aae30316aab6000094a8035ef81f0500f140040054b4835ef8e8ffff171f25007181010054755200a9790a", + "00f9BBL8;FF29194a8b29050091280108ab8300005414000014e80308ab42020054092440f93f0500b1a0010054092c40f92a0140b24a11c0da4a1540d24a0d0a8b4a250191L8;FF1f1100710c2e00541f0900710d3200541f0d0071e13c0054607e42f9618242f94e0300140043c83c0143c93ce0630391", + "e81744b9f6f343b9a1e20091fcf741f9L16;FFe9c700f9e9df40f9f6134ba954f6ff170a00809288018052ebe300f9e82b0ea9fbbb4ca9f4b344a9f57b40f9e80309aaebbf46a9f10308aaea6341a9f9fb42a9BBBBL8;FB33e3a7780ec62907e3ee000054fa4eedcafd06cdc1340c36e3244eb67cbdd768f", + "f92a0035f2ac6a51ca82011eec4a26d12210932fd6eb394c1276d9a0a18af86L8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd600feffd000600891948d009400feffd0BL8;FFea032d91e9af05f9e9fffff029c11d91e8ab05", + "f9e8c32791a04700d1e9b705f9e9feffd029210c91e8b305f968008052e1c31791e91703f9e9ff02f9e9feff90L8;FF4d110094e15341f9810000b4e05741f92200805248110094e00313aa29eaff97ff0b4091ffc32791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8BBL8;FF08008012e1", + "231291f70304aaf50303aaf60302aae94b02f9f8c30c91e8a304b94de2ff97e86a40b9e90300910a0000f04a413a91e94702f9890200f029f11e91L8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab22030054091440f9090100b42a0140b24a11c0da4a1540d24a0d0", + "a8b4a250191L16;FFe8a71aa9286c48a9eaeb00f92a4850a9295c49a9eb9b00f9e85300f9e8979f1a08219f5a2c2c4fa9081d00121f050071288840f9e82700f9288c40f9e80b00f9BBBL8;FF620640f9021500b4610240f9290080396918f8b7280400914a0400d1e600001401c00091e003022ae20303a", + "a8af5ff97602c00b4e00700f9a1ffff9021203f91L8;FFe8a30391e92700f9a60cff97e8630191e0a30391a1c300d1f4630191f61eff97e8c30291e263019184020191e0031aaae10319aa03048052050280527c6d0094BL8;FF4c2500912e2500d10c3900a96d19001221e00daa8bf5ff363f2500f100f6", + "ff544b2580394a290091292900d10a2500a96bf5ffb77f05007128f5ff5421fc0baaL8;FFd37a37f8f35341a9fb7345a947feff1700008012f35341a9fb7345a943feff17fd7bbba921008292e1ffeff2fd0300911f0001eba80d0054f35301a9f40300aaBBL8;FF1f0101eb806f0054e8cf42f949098052", + "f6074091d6820991f4031baa0969213828040091f87749f9e8d302f91f0700b1a01a0054c0220291f5160094080040b2L8;FFa20a40f9e00314aa4b310094e8a340f91f0500b160000054e002039190ebff97f35353a9940100b47522009104000014940600f1b5620091e0000054a1825ff8L16;FFf4030", + "1aaf30300aa4eb1009400048052210080524ab10094400400b4f50300aa48b10094000480522100805244b10094800300b40804805221008052e85700a9BBBBBL8;FBe0304000000000000000000000000000737071723a3a76313a3a6368756e6b65643a3a73746174657373686f756c642062652061626", + "c6520746f2073656e6420L8;FF9400f8b6e0031faae10314aa86950094f70302aaf60300aaf80301aaf40700b448990094e00314aa2100805241990094e10318aaf30300aa2000805273feffb4BL8;FF6901098b0a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091490109ab", + "c20400542a0140b24a11c0da4a1540d24a0d0a8b4a250191L8;FF4d190094ec031baaff0600b1e00300543f1300f1c10b0054e8d340f923fdffd063200391e0431391e1031aaae2031caa190140b9c4018052760c0094fb6f42f9BBL8;FFe327803de223803de11f803de01b803de20f41ade10340ada28f", + "3bade40b42ada1833aad610200ada48b3cada2837bad620202ada1837cad610201ad7f6200b9L8;FFe8fb04f9a80000b008a11f91e9ab05f9a9fdff9029411f91e8af05f928008052a04700d1e96f06f9e1833291e95706f969fdffd029ed0a91eaa705f9ea032d91L16;FF83feffb063d41391e0030b91a", + "2008052a400805210dfff97e16341f906000014e80f41b2e86301f9e0030b917bdfff97e10300aae16301f981feffb021a81891BBBL8;FF2300805224008052f4030caaba040094e10340a9ec0314aa2aa040a9536928380bfc71d308050091290040f9280800f94bf2ffb4ddffff17e10300a9e00301aaL", + "8;FFe0df92b980010034e1d342f9e8cb42f91f0101eba0c60054e8cf42f9090180522a04009109692138e1431691ead302f9dd110094e06349f9800100b4e1d342f9BL8;FFd2ffff17280180d2e00700f90800f0f2081500d1deffff17e90b41b2e92300a9dcffff17280180d20800f0f2081100d1d7ffff", + "173f00156b81f7ff54680240f9L8;FF480113eb8c0208cb5f0113ebe8031faa8b0940920001005469020acbed0313aaae15c038df05013108d5889a290500b183ffff5489fd43d30b0500b48ced7d92BBL8;FFe10f843d0183c13ce013843d0083c03cf8031baa08011bcbf66309f93f0308ebe09b843de1", + "9f843dfb6f09f9f62b08f9e0ff833de103843de207843dfbeb0df9L8;FFaa010014a1820191a22302d118f4ff9700fcffb469010014202e00b5a02302d1f1f4ff97600e003641fbffb474010014a1e20191a22302d10df4ff97a0faffb4L16;FF0019c03de1030e9102298052ec4300f9ece742f9fa9742f", + "9e28716adfca742f9f4c742f9f9f342f9e3c7803decb704a9028544ade89342f9e85300f9e89b42f9BBBBL8;FB6a000000000000005b0000002600000042024000000000006a00000000000000fb0000002e00000042024000000000006a000000000000009c0000002e000000L8;FFe1031baae20315aab", + "f831cf880e7ff97b9035ef8792600b4b7835df8f80b00f938fb7fd347890094e00318aa4100805240890094002500b4e10317aae20318aaBL8;FF680000b4e00314aa00013fd6a10640f9e12a00b4a20a40f9e00314aa4609019453010014fc831291e8db42f9f90316918043c03df7cf42f9fbc742f9f5c", + "b42f9L8;FFff8302d1fd7b06a9f73b00f9f65708a9f44f09a9fd830191f50300aae8030091e00302aaf30304aaf70303aaf60302aaf403012a0ec8fe97e8630091c0420091BBL8;FFe00319aa210080524a490194a00900b4e10314aae20319aaf50300aa4d490194572340f9b6831ef8b8431fb8f70200b", + "4561f40f943490194e00317aa21008052L8;FFa80318f8c8000090081140f91f0900f103040054a80302d1290000f029b12991e8a703a94800805289fdffb029a11391eae30091a04700d1e8271ca948fdffd0L16;FF39a450a92aa051a9eaa704a9e80b00f929a052a9e84300f92aa053a9e8a706a928d0", + "54a9e8ab03a929a855a9e97b00f929a056a9ea230ca92ba058a9e9d300f9BBBL8;FF783d4039a80316b8081c40b9a93316b8a9f140f8e80f00b9a8194039e91b00f909184039a8a3173808084079ec1f00b90c0040b9a9231838697140f8aa831778L8;FF4d690094e9ffff17681a40f9280100b4090d805", + "2e00314aa017d099b02018052f44f42a9f65741a9fd7bc3a842690014f44f42a9f65741a9fd7bc3a8c0035fd6BL8;FFe10300aae10300f9a1feffb0213c1091a3feffb063b00e91e003009142018052440080520cefff97e00340f967ffff17c80080d20800f0f20809009159ffff17L8;ZDBBL8;FFe80b4", + "0f9e9a319a9a80302d12183833c2083843cf8d6ff97e11b40f9e21340f9e843069163a303916423039185830091e00316aa060480527fd1ff97facb40f9L8;FFe003813de18355ade207813de1031dade08b56ade00b1eade08754ade0071cadf1000094e00745ada88301d1e0830d91e1030e91e0071cad", + "ae250094e08752adL16;FFf59744a900fefff000800f91e603009101048052e20314aa0304805207088052e40315aa140d0094e12340f9810000b4e00315aa220080523fa90094e00740adBBBBBBBL8;FB2f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f6b656d2e7273002c6369", + "70686572746578742073657269616c697a6564206279746573L8;FF4da30094e06301911aaaff97ff431891f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd63700805244a3009400088052210080523da30094BL8;FFcfffff17a8831ff8a84300d12900009029d1079100ffffb0004", + "40691e8a700a9a82300d102fffff042002a91e1230091e8a701a9881f019400fffff000601291L8;FF20010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faa811f0094e00741a97f1f0094ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9BBL8;FF3ae9ff97a1035ef80200001", + "421008052a8035df81f0101eb201b0054a8835df8490280522a040091e00318aaaa031ef809692138a1c300d12ce9ff97b7035ef8L8;FF3e02009469aa40a9dfffff17fd7bbda9f50b00f9f44f02a9fd030091f30301aa210840f9f40300aa680240f91f0101eb40040054680640f92a040091e00314aaBL", + "8;FFc90080d2e8230039480080520900f0f2e8270039e90300f9e8ffff17e00300f981feffb021a03d91a3feff9063141391e003009102028052a4018052eaffff17L8;ZDBBBL8;FB2d000000000000009f0000000900000073104000000000002d00000000000000a200000009000000000000000000000", + "010000000000000000800000000000000L8;FF0825019108fd46d30900088b200500911f0008eb89180054e16300919390ff97e11740f9e80f40f91f0101ebc0680054e81340f92a0400918022029149018052BL8;FF0c1100b84c1c40390a0500b96a111d124b5040780a8500394a1040b80b4d00794bb0", + "40b80a2102b84a0840b90ca100394cf040f80a9102b80a088052aa150033L8;ZFBBL8;FF4ad13991e8a700a942ffffb042603591ea0f00f9e3430091883f0194fd7b43a9ff030191c0035fd6088000910920009142ffffb042783691e82700a9e8030091L8;FF80f6ffb4a9ffff17e003082ae10314aae20", + "313aa16feff97601a00b5a0f5ffb4a2ffff17898244f83f0500b1810000549fde04a99f2e00f99f6200b91f0900f1L16;FFec3340f9f74b40f9ec3300f981130054e88300f9e027c33d8103c03de86f46f9e93f00f9ecab40f9e0c7833deda757a9e1f7803de8f301f9a80100f0081140f9BBBBL8;FB5800", + "0000000000006a000000090000008017400000000000560000000000000084000000090000004e1a40000000000058000000000000009f00000009000000L8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb880b00546d000014f30300aacbfaff97e80300aae00313aa090140b", + "22911c0da291540d2BL8;FF600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8bL8;FFe1dbc53de0431391e2dfc53de037813de13b813de23f813dd9ecff97f9575aa9f62b40f9f41740f92202", + "0014ea431391e9d744b9eb635339481140b84aa140b8BBL8;FFea2f4079e90300b9a91b40b9ea0b0079ea234079691200b8a9b341b86012833ce00741ad690600b9e90340b96a120079ea0f40f969a200b8e90b40796182823cL8;FF08c12a91a10302d1e303169142008052e9c702f9e9cf02f9e8d302f9", + "13e3ff97a10353f8810000b4a08353f82200805241530094f56340f9e8031691e00315aaL16;FF0ba54aa9e9b700f90aa54ba9eacb00f9e9eb00f90aa54ca9ea9b00f90a6d40f9e9a700f9e9979f1aeb2b11a90b294ea929219f5a291d0072eba300f90b4953a9BBBL8;FF60200054680640f9090b80522a", + "0400916a0a00f909692138e10313aa33f9ff97953a40f9550300b4610a40f9680240f9963640f91f0101ebc01f0054680640f9L8;FF220080523d120094e1d342f9f2f9ff1748074039e2074091c0fdfff000b81c91c3fdfff063403491c4fdfff084c01d9142c035918107805248432c39826f0094BL8;F", + "Fc0feff9000c03591a3ef0094c0feff90002036919def0094c0feff90008036919aef0094ff0301d1fd7b03a9fdc30091080040f9090540f9490d00b40a0140f9L8;FF4570009100204039001040d36320c01a60040051e303034b25000014a1fc2f36c0020e91e12a0091420440f9027821f8441c40b9df", + "ffff1781404079e0fcffb0BBL8;FF7622009104000014b50600f1d662009100130054c1825ff881ffffb4c00240f92200805244330194f8ffff17f37749f97f0600b140020054e18349f93f0400b1L8;FF29611091a8a739a9a84302d1a52f0094684e41b9090000d029c13391f72704a9e98300916a0000", + "904af11e91a88318b8080000d0089134910b0000d06bd12991L16;FF89620791e233c03d88ea40f98af640f9a0073bad8072c03da203983ce007813d2001c03de81302f9ea1f02f94083813cb70000b4e00318aae10317aa22008052BBBBBL8;FB6c5f70726f746f636f6c3a3a70726f746f636f6c000000", + "00770d4000000000002e000000000000006900000031000000770d4000000000002e00000000000000L8;FFa80357f880030191e10319aa0801028ba80317f887970094a0c303d12103138be2031aaabaf314384a9b0094a8f35438f90b40f9290080521ffd0071ba0218cbBL8;FFf44f01a9fd030091f40", + "300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aa451b0194000300b50e00001428008052090180529f6a29f8880200f9L8;FF1f0500f1614f0054b60000b4e00319aae10316aa22008052471b009408008092880200f9b70000b4e00318aae10317aa22008052401b0094bf0600f1eb3e01", + "54BBL8;FFbc8317f8bc035ab8be031838be435a78bc0316b8bc0359f8be431678be835938a8435678bc831af8be031b38e8930678087e1053e9b306f8e84b0239a8fd60d3L8;FFc80080d2e0a33239e08332910800f0f2ffa73239e85306f98061ff97e80300aae0833291a1fdffb02138279142028052a3", + "fdffb063342691e85306f908000014L16;FFf85f03a9f65704a9f44f05a9fd030091ff4314d1ff0300f9f30308aa090840f9c93000b4080440f917008092f6830591d50080d2e9df15a9d8020291e8ab00f9BBBL8;FF080014eb23120054ff0208eb09010054e0e30091e10317aa22008052d1790094f423", + "44a91f0114eb23120054e81f40f9e10315aae20317aa0001148b457b0194L8;FFe067813de9d302f960200054e0abc43de1a7c43deac33391e2a3c43de95b49f94081833ce067c13d4181823c4281813cead342f9e99f06f9e24bc33de347c33dBL8;FF0b819f1abf2500716b114c0b29c1001108819f1a0", + "970003949c1001108010d0b0974003969c1001108c1001109780039087c0039c0035fd600e4006fe8031f2aL8;FF6e6619532a018a9a290080521000a8d23f65536a0f00a8523000c0f26b011f128c011a120f128f9aad016192ce7d60d36b010caaac010faa7f0218724a010baaBBL8;FF29194a8b29050", + "091280108ab02040054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108aba2020054092c40f9L8;FF503b0094e00315aa01018052493b009400ed00b4080d8052f90300aaf5031faaf67e089bf40317aae10318aadf0215eb60020054e0830f91f70600d1", + "38a00191L16;FFfa030daa4fbb0094e0031aaa2100805248bb009400be00b4e10315aae2031aaaf90300aa4bbb0094ed031aaafa031caa11000014350080527a0400b4fc031aaaBBBBL8;FB7a1340000000000057000000000000007b000000400000007a134000000000005700000000000000f00000003", + "d0000007a134000000000005700000000000000L8;FFf80740f928008052e1430a91e00313aa02308052080300f94e8b0094e93740f9eafbff179f8200f121080054e1834ea9e81f40f91b410079000440ad000500adBL8;FF210740f981fcffb4220b40f9e00313aae0ffff17e8ef42f9c80000b4080508", + "8be00314aa0201805201ed7cd3420b0194e9c31291e8cf44b9f5bb44b920c1c03cL8;FF500b00940004805201018052490b0094400100b4155000a901fdfff021000b91130800f91f600039f44f42a9f50b40f9fd7bc3a8c0035fd60001805201048052BBL8;FF07000014e91741b20500001429690091e8", + "030aaa020000142965009169a200a908c48052680e00f9e10740f928008052680200b9c1e5ffb5ff074091ff030c91L8;FF09fd46d30800098b080500911f0109eb69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff5480fdffd000a008919447009480fdffb0L16;FFe8fb00f", + "9e1c50054e8fb40f96a2201a908008092682600a96a0a0014e86345f9e97345f9ea8345f9eb8f45f9faab45f9f7af45f9e84700f9e86745f9e1cf45f9BBBL8;FFe10313aaf44f42a9f50b40f9fd7bc3a8c0035fd6ff8307d1fd7b18a9fc6f19a9fa671aa9f85f1ba9f6571ca9f44f1da9fd0306915c2040b", + "9f403032afa0301aaL8;FFa80000b4603640f901f57ed342008052496b0094683e40f9a80000b4604240f901f57ed342008052436b0094684a40f9a80000b4604e40f901f57ed342008052BL8;FFa1837bad8182863c8082873ca18378ad8182803c8082813ca18379ad8182823c8082833c6affff17c101", + "0054e1031faae4fcff17880080d2e17f00f90800f0f2L8;FF290080521f4100390d450039090100f9c0035fd62d0080522e008052090500f9290080520e4100390d450039090100f9c0035fd62e0080526d008052090500f9BBL8;FFe92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a9", + "29008052eaff01a9e9230a29a0270194fd7b47a9ff030291c0035fd6ff8301d1fd7b03a9L8;FF502b0094e00317aa21008052492b0094800700b4e10316aae20317aaf40300aa4c2b0094582f40f9d80100b5c3ffff1737008052591740f9b7831ff859fcffb5L16;FF4d040091ae696a384a0500915f010", + "cebcf194092ce1d0013ef21cb9ae90109aa620000546b1d0091eefeff378e04f8374b8500917f0103eb280400542bfd50d3BBBBBBL8;FB3a20c0001a65706f6368206e6f7420696e2076616c69642072616e67653a20c0000d4d6573736167652066726f6d20c02e206661696c656420746f2064656372L8", + ";FFffaf01f90a000014a8035df8e97241f89f0306f1f60314aa550300f953230039489300f8490b00f9e00a005408031c8b53008052150940f9d50800b4b5080037BL8;FFe10313aab0fcff97560300b4610a40f9680240f9b70640f91f0101eb00080054680640f9490180522a040091e00316aa6a0a00f", + "909692138e10313aaa2fcff97L8;FFe0630091e10316aaca140094e1030091e2630091e00315aa33f6ff972800809229008052880200f969520039f44f45a9f65744a9fd7b43a9ff830191c0035fd6BBL8;FFe95f02a9fbab00a9eaa303a95c160094fc7341f99f0b00b1a1000054e81740f91f2100391f0", + "100f96c000014570080520d000014e0031b2a577401941f1c0072L8;FFfc0300aaf3031faa547f089bf5031aaae10316aa9f0213eba0020054e0c31791b50600d136a001919703138be80c0094e08bc13de18fc13d73a20191e293c13dL16;FF780a40f9680240f9080118cbdf0208eb69f7ff54e00313aa", + "e10318aae20316aa2300805224008052f4020094780a40f9b3ffff17e00313aa2200805223008052BBBL8;ZBL8;FFe80f40f9080117cbbf0208eb09c6ff54e0630091e10317aae20315aa2300805224008052f5a2ff97f71740f928feff17e0630091220080522300805224008052BL8;FFc81242d3f6030", + "0aa185400a9132001a928008052081000f9180319ebc3020054680219ebb502198bf333889a954e00a9985a01a9f44f44a9f90b40f9f65743a9L8;FFa80000cb1f0106eb29020054210000ca1f0004eb2108409242040054210300b5a204028b8300038be10300aa400004cb250840f2e00000549f0003eb", + "40060054BBL8;FFe8e30139a8135438e98300b9ea0b0179810200549f0700b180020054e84700b9e81740f9a02303d1ec0f00b9eb2700f9bce733a9a88314f87be3ff97fc0300aaL8;FFa80080525d01001460c643f961ca43f9290c40f9e8830f91e1031baafb6300f920013fd6e8f341f91f0d00b1e107", + "0054e800805251010014f9430891ba0000b4L16;FF3fc3007180490054080b00911f0900f123590054f80000b4e0031aaae10318aa22008052f4030aaa43bf0094ea0314aa355800b4e0030aaae10315aa22008052BBBBL8;FBc9292ab285635bbcf5d6567a35cbfa1ce97a6b4e883267f4f0d8141283035", + "e3c0e7dc2729373a237a28c9fbdba520000b263b3429c4c636a42620cbd3e8cd8b8L8;FF1669343896060091e87740f9f67f00f9df0208eb41fcff54e0a30391498a0094dfffff17284d1c9b090940f93f011beb29010054080540f9f5031f2a13797b78BL8;FFcaffff17e02500b5a02302d11decff97e8", + "0301aa40010036482600b5e1031faac2ffff17e1031faae82f06f9bfffff17e1031faae8570cb9bcffff17e1031faaL8;FFe0030091e10313aaf61700f909010039c804009480a20091e1630091e203009131e6ff9728008092a80200f9f44f45a9f65744a9fd7b43a9ff830191c0035fd6BBL8;FFf6575c", + "a9f85f5ba9fa675aa9fd7b58a9ff830791c0035fd660ffffb00080229163ffffb06320119164ffffb084802991a20700d1c1048052834b019408358c52L8;FFf30300aae00308aa69040094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb4", + "92d0054080c47f8L16;FFe86b00f9e8f741f9ec5b42f9e1eb41f9faff41f9e73742f9e8e700f9e80342f9e35f42f9eca300f9f86742f9f98742f9e9231fa9e80f42f9e90742f9ec8b42f9BBBL8;FF0800f0f2080900915fffff1780220191970d0094e80314aaaafeff17a1ffffb021380591a3ffffb063e", + "80291e00700f906000014e00700f9a1ffffb021380591L8;FF0101090a24000014e1031f2a22000014882245b8e92f4379eb4746398c9246f8edc74639eaa34639e8d303b9e9ab0779e8a759a9ecb300f9eda305392b1f0036BL8;FFf65708a9f44f09a9fd430191081c00121f090071a1010054e00302aa", + "f30302aaf40301aa00fcff9720020037750240f9a80640f9160101eba2020054e80f41b2L8;FF637c4093210013ea6318049b631000d1c00400540000018be5ff9f52010006cb21fc44d33f00056ba80600541fc01f3801e01f7802d01f38610000cb2100146bBBL8;FF1f0101eb203f0054e8cf42f90901", + "80522a04009109692138e1431691ead302f9a90c0094e88349f91f0500b1c0000054e8074091e14316910881099100810291L8;FFe00740918100805200001891ff0316b9e84300b92d2a0094e80356b9e00740918100805200001891ff0316b9e83f00b9262a0094e80356b9e007409181008052L16;FF2", + "b0140391f0120f12a0100392b05003921ffff54350080527f0312f1e10d0054d40d00b4e8030191e00316aae10314aa8cab009443af00940010805221008052BBBBBL8;FB59000000050000001d1c40000000000054000000000000005f000000050000001d1c40000000000054000000000000006500000", + "0050000001d1c400000000000L8;FF0a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b29050091BL8;FF090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eba914", + "0054088c48f81f0500b12011005464feff97080040b20811c0daL8;FF220080524c170094e043139121008052c90a0094f66f42f9e47342f9e007409121fdffb0216c3f9100401d91e2018052e30316aa770a0094e1074091e20b4091BBL8;FF280080526822003928008092680200f9b50a00b558000014", + "e00743ade92f40f9682600a9608600ad53000014e90f40f9280080923f210039280100f94e000014L8;FF810d005448008092680300f971000014f46f41f9e8c31791e91f46b900c1c03c01c1c13cf5fb45b9880240f9f36b41f9e94305b9e04b813de14f813d680000b4L16;FF09008092090100f9c0035", + "fd6018840a904944329e00308aa1f2e0014fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9BBBL8;FFe80700f9e0230091847d0094e00700f9a1ffffd021603f91a3fffff063240091e0230091a20080522401805224000014880080d20800f0f2080140b2a0c30", + "0d1L8;FF4d770094e18349f9810000b4e08749f92200805248770094e18f49f9810000b4e09349f92200805243770094e80740910881099100210491d70a0094e5fcff17BL8;FFa8e279d3e00314aa02018052011115cb49f70094612640f9810000b4602a40f92200805244f70094680e48f81f0d00b1a1", + "000054f44f42a9f50b40f9fd7bc3a8L8;FFe7800091e10309aa030080d2060080d28a8eac720b10a0d2041440f90a000014230840f9230103cb040000145f1c0071e1010054e60301aa021040f9840400d1BBL8;FFe0833791023f80522180099151370194000740ad08434079e8032179a8020090e01b84", + "3de11f843d081140f91f0900f189040054690200b029411f91e8633f91L8;FF0202805263fdffb063cc1e91a40280524c000014e80f41b2e0432a91e84b05f97e3dff97e10300aa3e000014c80080d2e0632a39e0432a910800f0f2ff672a39L16;FFe193c13de00b18ade097c13d29dd78d3ec7202f8e49", + "bc13deabb01f9ea7b43f9ebe3573928a108aae18314ade09fc13deaa301f9ea7740f9e1d342f9080118aaBBBBL8;FBa1104000000000004d000000000000005b03000009000000436861696e73656e6465725f726174636865745f6b657973656e6465725f726174636865745f6b65L8;FF2203005409084", + "0f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0daBL8;FFe9db42f9f5cb42f9f7cf42f91f0500b1404f803da90319f8601a00542083c33ce85f04f9e9671f91a80359f82183c43ce5432591c082833c2083c63", + "ca68302d1L8;FFe80702f9e90f02f9c9008052e81302f9e81b02f908fdffd008090191ff8b01f9ff9301f9ff9f01f9ff9b01f9ffa701f9ffb301f9ffbb01f9ffc701f9ffcf01f9BBL8;FFff1b01b9e95b00f9e96700f9e97300f9e97f00f9a8031cf8000f00541b210091f6c30291fc83029139008052090", + "00014a20301d1830c8052c8c9ff97201500b5L8;FF2207c03deab341b91f010071f8c741b9801f803de9079f1a818308ad0801094be99741b962c3883ce8e300b9e8cf40f9ead700b9e9bb00b9684308f81843ff97L16;FFe89700f9e82742f9f49342f9f76b00f9f77b42f9ec9742f9e8a709a9e82f42f9", + "e93342f9ef4700f9fe9b42f9e09f42f9e8df00f9e83742f9f8a342f9fba742f9BBBL8;FFfd7b07a9f34300f9fdc30191011440f9f30308aaa10100b4001040f9a8c300d125640094a8035d381f05007181010054a8835d381f0500716c06005448070035L8;FF3e060094e10340a92aa040a9290040f91f1", + "040f15369283808050091280800f943feff540b7c07533f0108eb6b611932000100544b692838080500911f0048f1BL8;FF370080521800809219018052a80640f91f0116eb090f0054e00313aa02f4ff97e80300aae00301aae8fd073708fc60d3880e00b5080840921f1900f1c20e0054L8;ZDBBL8;FF6", + "01240f9220080524b270194611a40f9c10000b4601e40f922008052f44f41a9fd7bc2a844270114f44f41a9fd7bc2a8c0035fd6010040f9810000b4000440f9L8;FFc0825ef8220080524b270094c1825ff8e1feffb4c00240f92200805246270094f3ffff17680240f9c80000b40805088be00314aa0201", + "805201ed7cd33e270094L16;FF8c1108cb687f0e9b8fc101d1a8a10e9bedfd44d3ee430191ef730091b27dcb9bad0301d108011c8b11e10091480600912082c13c321640f98cc101f122025ff8BBBBBBBBL8;FB696f6e206372656174656420617420c0012900124661696c656420746f206465637279707", + "420c01b206d65737361676520776974682072617463686574206b65L8;FFe00319aad3ffff1720feff900000339122feff9042003491c10780528da0009420008052010480527fa0009420008052010980527ca0009420feff9000a03291BL8;FFe70305aae60304aae50303aae1030091e3230091e40302", + "aa8d200194420700b4fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd0300914804028b49008052L8;FF1f1040f15369283808050091280800f94202005400fc47d36e000014e10300a9e00301aae10308aa220080522300805224008052db000094e10340a92aa040a9BBL8;FF1f01007168018c9a34", + "018a9a29019f9a4d00001400e4006fa0c302d1e10316aa02048052e30315aae40314aae00302ade00303adf5070094a0877ead88ffffd0L8;FFe003152a6a0a00f909692138e10313aae5fcff97f4fbff35f44f42a9f50b40f9fd7bc3a8c0035fd6e00313aa2200805232030094610a40f9daffff17e0031", + "3aaBL8;FF3f08007161fdff54880248f81f0500b1810000549f6608a99f7e09a99f020a3881020291e20313aa0ff4ff97800400b5e1031faae4ffff17880240f91f0500b1L8;ZDBBBL8;FB696f6e5f6d616e6167656d656e7443757272656e74000000bb124000000000003800000000000000b80100001d", + "00000064656372797074696f6e206661696c65L8;FF682e0054c8010014e11740f9e80f40f91f0101eb407d0054e81340f92a0400918022029149038052ea1700f9096921380df4ff97e16300918c91ff97888248f8BL8;FFe90dc0daa8273aa9e8030c9176000194f30740f9e80740b9e0830c916002c23", + "c61f2c23ce8ff0c39a84302d1e0cb803de1f2803c6b000194e8830c91e0030c91L8;FFf85f02a9f65703a9f44f04a9fd030091ff0740d1ff071ff8f30303aaf40302aa810100b4a81300d1e9330091aa1300d1eb0301aa0c1440380c0100390c014039BBL8;FF0819498b08050091091440f9090100b42a0", + "140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108aba2090054092440f93f0500b1c0030054L8;FF410180390101f8b7e0031faa4a050091290500d10a2500a9fd7b43a9ff030191c0035fd63f2900f1880000544b01098b6bf1df388b0cf8374b05c0396c1d0012L16;FFa9031ef8", + "0aa541a9e027833da082c63ceae700f9e9bf00f90aa542a9e0f7803deabb00f9e9ff00f90aa543a9e9db00f9092540f9e9cf00f9092940f9e9b300f9BBBBL8;FB6f6f7473656e645f65706f6368706172616d7343743153616d706c656443743153656e744b65797353616d706c656473656e64696e675f6", + "86472486561646572L8;FFe80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb492d0054080c47f81f0500b180230054c8030094BL8;FFfd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e0030054e00313aa40000094080040b20811", + "c0da081540d2080d088b0825019108fd46d30900088bL8;FFe92b41b909310039e92341b909350039e91f41b909390039e91341b9093d0039e90b41b909410039e90341b909450039e9fb40b909490039e9f340b9094d0039BBL8;FF28040091490400d1110000145f2800f1880000542800028b08f1df38", + "a805f837a0c300d1a3050094a8035db8280d0037a8035ef8aa0240f9490108eb83100054L8;FFf5cb42f9f7cf42f91f0500b1404f803da90319f8601a00542083c33ce85f04f9e9671f91a80359f82183c43ce5432591c082833c2083c63ca68302d1e87704f9L16;FFf65702a9f44f03a9fd03009133084", + "0f9f70301aaf40300aa130300b4f60640f948d40094e00313aa2100805241d40094c00300b4e10316aae20313aaf50300aaBBBL8;FF6a0a00f909692138e10313aa37faff97770a40f9680240f9080117cbbf0208eb68330054680640f9e10316aae20315aa0001178b47740194e802158b680a00f9L8;FF", + "f98749f91f0101eb40430054e8cf42f9490480522a040091e00318aa09692138e1431691ead302f9df0c0094fad342f9e8cb42f908011acb1f0308eb48420054BL8;FFe10313aa99010094e00315aae10313aa96010094770a40f9680240f9080117cbbf0208eb6800005455fdffb5f0ffff17e00313aae1", + "0317aae20315aa23008052L8;FF80020e91000840b92002003481020e91330840f9d31100b4600640f97f0200eb60050054620240f9400400f9620240f9020000f9200840f97f0200eb61110054BBL8;FF288c43f81f0500b1e0fcff54e243169140008052fd150094e3ffff17e043169122008052fd1700", + "94e1d342f9e5ffff17f85f49f9580300b4e1d342f9e8cb42f9L8;FF687240f9c80000b40805088be00315aa0201805201f17dd34734009420074bad28008052e99343b95c0300f9560b00b940c3803c41c3813c492f00b968020b39L16;FFf60741b2e41bc13de00bc13de107c13de20f06ade317c13de89", + "f40f9f58300f9f56b40f9e10305ade31307ad6383c63ca00b3aad6283c53c6083c43ca103933cBBBBBL8;FB9f1b40000000000034000000000000005d0100000e0000009f1b40000000000034000000000000005e0100002d0000006d6573736167652066726f6d20746f6fL8;FFf90308aafa0304aafb03", + "05aa4d9c0094e00313aa2100805234008052489c009400feffb4e60300aae5031baae4031aaae80319aae30318aae20317aae10316aaBL8;FFe00313aae10316aae20315aa03000094760a40f9adffff17ff0301d1fd7b02a9f44f03a9fd830091480001aba2020054010840a9f30300aae023009129f87f", + "d3L8;FFfb6f42f9fa7342f9f57742f91f0900b141040054e8431391e0031aaae10315aa71300094e8d344b9680900367f0700b1a0080054431c0094c001805221008052BBL8;FF00801f91a1580194ffc306d1fd7b15a9fcb300f9fa6717a9f85f18a9f65719a9f44f1aa9fd43059100e4006fe843029109", + "0480523f0000f1f30300aaa08302d1L8;FFe02500b5a02302d156f4ff97e80301aa40010036482600b5e1031faac2ffff17e1031faae82f06f9bfffff17e1031faae8570cb9bcffff17e1031faae8630cb9L16;FFf44f03a9fd830091480001ab42030054010840a9e50304aa0a018052e40303aaf30300a", + "ae023009129f87fd31f0109eb0881899abf0400f1890080524901899aBBBL8;FF818e41f8290041d23f0000f12841889a1f2d00f1a2010054680240f9a80000b4600640f901e97bd302018052427c0194e00313aa0109805202018052f44f41a9L8;FF08812f9174f1ff97e8f34df91f0900f160220154e0", + "074091e10740910232805200c0359121802f914a7c0094e8074091e00740910881099100c0359118e10791BL8;FFf44f42a9f65741a9fd7bc3a8c0035fd64cfc0094000380520101805245fc0094200400b4880640f929008052600e00f916a400a9080000f968d600a9c8feffd0L8;FFeb0f80122c7c105", + "32b2c0633ec0000352a7c0c530b050039090900394a091b320a010039080000142c7c12532a440c330b090039090d00398b6d1c320a050039BBL8;FFa9a317386901084aabd35738a9b317384901084aaae35738a9c317386901084aabf35738a9d317384901084aaa035838a9e317386901084aab135838", + "a9f31738L8;FF810000b4608e43f9220080524a3c0094619a43f9810000b4609643f922008052453c0094ea5f40f9f44740f9e95740f968c6533935fd48d3a801003661f241f9L16;FF01835ff881ffffb4000340f92200805249bc0094f8ffff17f57740f9369400b4c806168be00314aa0201805201f17", + "dd341bc00949b0400145c008052d4000014BBBBL8;FBa553a68ef934db4e9b662f005e16bc2dfeb016de8495d6d3a0230e34e2c4c47b8b98c369fbd6ecaba79744f74abfa951a28c14efbf333884919500003a14f876L8;FF080140391f050071c1eeff54e003152ae203132a96f2ff9708fc78d312feff9", + "05202329109fc60d3487a68782821084a095d1053495a69782801084adbffff17BL8;FFe9c32791e8fb04f9080200d008a11f91e9ab05f9e9feffb029210c91e8af05f928008052a04700d1e96f06f9e1833291e95706f9c9fefff029ed0a91eaa705f9L8;FFf65704a9f44f05a9fd830091280440f9290c", + "40f9340108ab020e00545f0800f180000054281440f9140114ab620d00549400f8b6e0031faae10314aa7a080094BBL8;FF1f0500f140030054e80740f9080116cbff0208eb28230054970100b48002168be10318aae20317aa4a4c0194d602178be00318aae10317aa22008052f60f00f9L8;FFf60301aa", + "e10315aae20314aa3bebff97750a40f9e10316aaeeffff17281040b96800c8376800d037b0480014a1480014a248001409004039e80300aae00301aaL16;FFe95b02f9e88702f9e87b40f9e89302f9e86740f9e89f02f9e8ef40f9e8a302f9e85740f9e8a702f9e86f40f9e8ab02f9e8274ba9e8b702f9e8", + "3f40f9e9af02f9BBBL8;FF4c6c019400feffb4e10318aae20315aaf60300aa4f6c0194e10740f9810000b4e00318aa22008052436c0194130800b4e00317aae10313aa220080523e6c0194L8;FF4d6c0094745642a9950100b49622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c0024", + "0f922008052416c0094f8ffff17680e40f9480100b4BL8;FFe85b40f9a0873cade08742ada8031bf8a0873aade08b43ada08b3bade18340ada18338ade08b41ada08b39ad00f4ff97a0077cad880080d2a203da3c0800f0f2L8;FFbf3b03d5a50002321800001481fc5f883f00006b8100005482fc018881", + "ffff350a000014bf3b03d510000014e00304aa010080d2010000d40c000014bf3b03d5BBL8;FFa2039c3ccbc7ff97e00640ade80b41b9010340f908830bb80083893c01838a3c810000b4000740f922008052422c0194a0077dad7b0200f9e8a743a96082803cL8;FFb9eb7da90cfcff17e89740f9c80000", + "b40805088be00314aa0201805201f17dd3452c00943a008092a2faff17a0c300d1e1031aaae20318aa60eaff97ba035ef8L16;FF01108052220080524bac0094e90b40f93f0500b100f4ff5488f242f8e087c03d8172c33cff2f01f988f200f8e07f803de07fc03d88f240f8e123813dff2b01f9BBBBBBL8", + ";FB2f6c69627369676e616c2d70726f746f636f6c2d613434636635613164633062366666632f6f75742f7369676e616c2e70726f746f2e776972652e7273000a64L8;FFff571ea9ff0701f9f50301f9ff0b01f9f50f01f9ff1f01f9f51b01f9ff2301f9f52701f9ff3701f9f53301f9ff3b01f9f53f01f9", + "ff4f01f9f54b01f9ff5301f9BL8;FFc90080d2a8831d38480080520900f0f2a0c300d1a8931d38a9031df87f260094e10300aa74000014c80080d2e0430039e02300910800f0f2ff470039e80700f9L8;FFe1020054760600b4e8c30591e00318aae10316aaf7befe97fb6b57a9fc0305912083c53ce8675", + "8a9f6cb40f97f0700b1e80300f9e80305910001803d00060054BBL8;FF86660094f40300aae0e31591e1231091022e8052f5e315914e600194e8cb42f91f0500b160000054a062009146e4ff97f7c742f9f5c342f9970100b4b8220091L8;FF2b0000906b210c91e92306a9a9630091a07f0091e92b07a92", + "900009029c10b91f42708a9e9030091a18301d1e92f09a9e9c30091e9230aa9a8c301d129000090L16;FFe00300910800f0f2ff270039e80300f982e6ff97e80300aae80300f981fefff02174149183fefff063280f91e0030091e2008052a400805221000014e00300f9BBBL8;FB0a051208041f0f071c0", + "e060000000000000117021d1813031e1b190b1408040d1f161c121a0a070c1511090610050f0e78954000000000005000000000000000L8;FF24008052fda3ff97e11740f972fcff17e0630091220080522300805224008052f6a3ff97e11740f9b6fbff17e0630091220080522300805224008052efa3ff", + "97BL8;FFb45a01a9a84e00a9f44f42a9f65741a9fd7bc3a8c0035fd6a0feff97c9feffd029a13c91027d01a9090500a9c0035fd6e30302aae20301aae10300aae00308aaL8;FFf44f03a9fd430091f30303aaf40301aa5f4000f1280100545f0013ebe8000054e10313aaf44f43a9f65742a9fd7b41a9ff0", + "301913e1100145f2000f108018052BBL8;FFa22301d194c4ff9720f1ffb41f000014a8035bb848f00737b9031bf880ffff17a22301d1830c8052ccc2ff9700f0ffb41f000014a02301d1964e0094f80301aaL8;FF698e01f96a9201f97f420e39696e41f96b220c916a7241f96001c03d686641f96ba20d9", + "1699e01f9697e41f923008052616a41f9607641f90221039169ae01f9L16;FF22008052f8030baaf9030caa4ac00094ec0319aaeb0318aaf60000b4e0030baae10316aa22008052f6030caa42c00094ec0316aab50000b4e0030caae10315aaBBBBL8;FB32f54bd0e658000026bf4ce1dbf2175bb41cf8c0", + "41f0ff6021ea8e1dfbcafb2f0c877912ca577a54bb5743503ac2b6e5700774d8ed28555fdcbf532d32f5ad88L8;FF2801088b480108ab8202005409804039000509ab22020054fd7bc1a8c0035fd6e8031faa091c40b949fbff35e9031faa0a0840f90afcffb5ea030aab23feff54BL8;FFe02fc33d00058", + "03de033c33d0009803de9cf05f9a88357f8080540f9882600b4a02302d117edff97f50301aa804d0037a8fe60d3c82300b5a00a40921f1800f1L8;FFff430391c0035fd63a0080524d100094e00317aa210080523400805245100094e0fcffb4fb0300aa0801805208000039b90000b460070091e1031aaa", + "e20319aaBBL8;FF5a6300f1a1feff54e84b42f9aa0216cbe94742f9f45741a9682a01a928008092682600a9950100b49322009104000014b50600f173620091e000005461825ff8L8;FFfd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d3080500910900", + "40f93f0500b1600400540a0840f9091440f9L16;FF097040f9e88b00f908784ba9e92f14a90ba44ea9e0c7833de8b700f908284ca9e99f00f907a44fa9e8eb00f9e8979f1aeb2702a90ba450a908219f5a081d0072BBBL8;FF930400510b000014f40300aae003082af60303aae20303aae303132acff2ff", + "97e90300aae00314aae30316aa89fdffb5740040f9820640f95f0015eb091a0054L8;FFe00314aa210080524a700094800200b4e10315aae20314aaf60300aa4d700094080000147f0200f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd636008052BL8;FFe00300f9a1fefff021c41291a3fefff063f", + "81291e0030091a2018052e400805209000014e00300f9a1fefff021c41291a3feff9063003a91e0030091a2018052L8;FFc20a40f942400091020002cbe11e001201d01f38c30000cb42fc44d302e01f787400146b20010054e103144b9f120071dfc82138cd010054dfb01f3804148052BBL8;FF1f0101e", + "be0530054e8cf42f92a04009180c202914901805209692138ead302f9eb1c0094e1431691a70d0094e0a349f9800100b4e1d342f9e8cb42f91f0101ebL8;FF080b00359b1f4092fa0f41b2691f40927b0309aaa1035df8616400b526030014a8035df808011acb7f0308eb287e0054bb0400b420031a8be1", + "031caae2031baaL16;FF54b0009468420891e0030091a5200094e0430691e1030091023280524db00094e1430691e00313aa0242805249b00094ff830e91fc4f41a9fd7bc2a8c0035fd6BBBBBL8;FB5f6b6579697650656e64696e674b796265725072654b657963697068657274657874656e6372797074", + "696e76616c69642073656e64657220636861696e206d65L8;FFa9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff5400fefff000e03d919994009420feff9000e003919694009400feffb000a00d9193940094BL8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2905009", + "1200108ab62000054fd7bc1a8c0035fd600ffff9000802f919514019400ffff9000c02e91L8;FF2300805224008052e97f02f9e13bc13de23fc13dfa6b01f9e00715ade2b3803df96f01f9fa7301f9ff7701f9f6f302b9ff6b02f9f66f02f9ff7302f9d9f4ff97BBL8;FFff6300f9e08304ade02f803d08d", + "b77d3e08744ad80020191a18301d122008052080d17aaa0073dad080dc0dae86700f9e28345ada2033ead7e540194e8275a29L8;FF81fcffb4220b40f9e00313aae0ffff17e8ef42f9c80000b40805088be00314aa0201805201ed7cd343580094e9c31291e8cf44b9f5bb44b920c1c03c9f0b00b1L16;FF", + "750a00f9c200005494fe47d3680240f9bf0208eb4109005447000014680240f9897e0753bf0208eb3761193261000054e00313aa43d30094680640f99f0248f1BBBL8;FF680240f9080540f91c0117eba32e00547b0240f9620740f95f001ceb49150054610340f9370080399700f8b728040091490400d1", + "110000145f2800f188000054L8;FF290400911f692138e9d302f985ffff17f37749f97f0600b1e0020054e18f49f93f0400b140010054810000b4e09349f92200805240780094e19b49f9810000b4BL8;FFe10000b4601240f922008052f44f42a9f50b40f9fd7bc3a847f80014f44f42a9f50b40f9fd7bc", + "3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091080040f9L8;FFfd7ba7a9022680d2e4830191fd030091f35301a9f30300aaf40301aae00304aa01008052f51300f9aef8ff97e40300aa200000b0020080d200a840f9130000f9BBL8;FF01048052220080524b380194e8074091e00319aa017880520", + "8812f916ead0094e8f34df91f0900f1203c0154e0074091e10740910232805200c0359121802f91L8;FFc80080d20800f0f20809009103010014c80080d2f64f05f90800f0f2080900d107000014e04f05f9e80b41b204000014c80080d20800f0f2080500d1e0432a91L16;FF4db80094e14340f9e10300", + "b4e02740f92200805248b80094fa031faad7fcff17e11f40f9810000b4e0031caa2200805241b80094e16f40f9f44f40f9810000b4BBBBL8;FB617373657274696f6e206661696c65643a206b65792e69735f6e6f6e65282900bb1140000000000047000000000000002401000015000000bb11400000000", + "000L8;FF1f0500f1ab000054e0af40f901f97fd34200805248880094e8b740f91f0500f1ab000054e0bb40f901f97fd34200805241880094e8c340f91f0500f1ab000054BL8;FFa82737a928008052e9feff9029210c91aa8302d1a04700d1a8273ba9c8feffd008a13291a82b3da90a078052c8048052bf", + "2738a9c9feffd029ed0a91a92b3aa9L8;FF53f7ff97e8df40f91f0500b1a0400054f6275ca9fc031faae82f00f9e8eb40f9f90b41b2e92304a97d000014810a41a9e0e3069146f7ff97e8df40f91f0500b1BBL8;FF16210091f5c30091f783009109000014a1620091a26300918fccff97601800b5b70f40", + "f9f60317aac28e40f8621200b4e10240f9340080399400f8b728040091L8;FFe8bf40f9e0430691e1e30091022180528002803de8ab00f96082803c680e00f94c480094e0430691e10315aa17eefe97e00315aaf4e2fe9728008092680200f9L16;FFe9ab43f9ebcb43f9f7a343f9e86b00f9e8af43f9f40", + "f44f9f67b44f9f57f44f9e8e700f9e8b743f9e82b17a9e8bb43f9eac343f9e9231fa9e8c743f9e9bf43f9BBBL8;FF370140b218400091190300909bfffff07bb30b915c048052fa2ec0f2350080520b000014e00640ade0c30091e10314aae08701ad6465009400040037d6a201f1L8;FF9f0208eb080400", + "54f7031faa08011fcb9f0208eba8040054340100b4680640f9e10315aae20314aa0001178b49680094e802148bb502148b680a00f9081340f9BL8;FF04000014c80080d20800f0f2080500d1e80300f9e003009180eeff97e10300aae10300f9a1feffb021e81491a3feffb063b00e91e003009142018052", + "44008052L8;ZDBBL8;FFe9f341f9e80302f9e8830591ea0310910b0000f06b813f911a0380d200ffffb000b82f9108210091e1430691ea2f19a9e90702f91a00f0f29a240194e81f40b9L8;FF37fc413939604ca9f40301aaf30300aa08108052f51a40d2360002912000178be1031f2ae20315aa0814003", + "8ad280094bf3e00f148020054800642ad80020291L16;FFf40740f95b0b00b4e0031caae1031baa2200805248a80094ab835ff8f3031f2afb031faa53000014e90300f9180100b4e00315aae10318aa22008052f5030caaBBBBBBBL8;FB776e207365616c65642073656e646572206d65737361676520766", + "57273696f6e20c0001b737071722076312e73656e645f656b2e73656e642065706f636820c0L8;FFe8fedf88c8020035280340391f050071e1fcff54e2031f2a9508009408fc78d309fc60d3087b68782821084a095d1053095b69782001084afa0f40f9e80740f9BL8;FF0cfc5cd308050091290040f928", + "0800f94cfeffb40a7c15533f0108eb53611932200100542a0440f90bfc63d35369283808050091280800f94b0200b5e0030caaL8;FF08e000f8c8028052892200a989008052802201a908fdffd008310291882602a9e10f40f9a1fcffb5e7ffff1720008052c10280527c1e0094ff8302d1fd7b04a9BBL8;", + "FFb7035ef81dffff17a0c300d1e10317aae20316aa2300805224008052b6edff97b7035ef8ba035df8480317cbdf0208eb09e4ff54a0c300d1e10317aae20316aaL8;FF6a0a00f909692138e10313aae6faff97e00314aa080c43f81f0500b160000054e10313aa0bfeff97950a40f9550300b4610a40f96", + "80240f9960640f91f0101ebBL8;FFe10000549f5e00a99f7e01a9977e02a99f5e03a99f6204a99f3e00f91f0900f1a1110054e00313aaffeeff9740010036210e00b5e0031faacfffff17e003082aL8;ZDBBBL8;FB11000000000000001d01000005000000650d40000000000011000000000000000a0100", + "0005000000650d40000000000011000000000000001401000005000000L8;FFe04b0054e81340f92a040091e00315aa49018052ea1700f909692138cee9ff97e1630091918fff97807a40f9800100b4e11740f9e80f40f91f0101ebc0680054BL8;FF69564039b502000a1f01096be0179f1a61170194885", + "a4039695a4039aa02000ad6020a0a1f01096be0179f1a5a170194885e4039695e4039f503002a1f01096bL8;ZFBBL8;FFe82701a942ffff9042542c91e34300918a3e0194fd7b43a9ff030191c0035fd6082000910930009142ffffb042602091e82700a9e80300910900009029013f91L8;FF83fdff9063", + "b41891e023009102018052640080521048ff97e10740f9b1ffff17e80f41b2abffff17e80f41b2b9ffff17a0031df881fdff902184199183fdff90L16;FFe8f701f968feff9008e11e91e9f301f929038052e1430f91e8a303f9e3031d9162008052e8ab03f968feff9008812091fa0310aaf4030eaae9a7", + "03f9e9af03f9BBBBL8;FB3d04400000000000490000000000000069010000090000005369676e616c205051205261746368657420563120436861696e204164642045706f636800000000L8;FFe00313aa40000094080040b20811c0da081540d2080d088b0825019108fd46d30900088b340500919f0208", + "eb69060054e00313aa080c48f81f0500b180020054BL8;FF080d8052fc0300aaf3031faa547f089bf5031aaae10316aa9f0213eba0020054e0c31791b50600d136a001919703138b1df7ff97e08bc13de18fc13d73a20191L8;FFe89702f9e8a340f9e89b02f9e81f41b9e84705b9e8c340f9e8a702f9e8d", + "740f9e8ab02f9e8cb40f9e8b302f9e86741b9e86b05b9e813049108f14fb8e87305b9BBL8;FFfa671ba9f85f1ca9f6571da9f44f1ea9fd430691090040b9f30308aa3f05007121090054345440a900e4006f16dc40a9040c40f9220840f9182040b9a0c302d1L8;FF50520094e00315aa210080524952009", + "4601800b4e10314aae20315aaf60300aa4c520094571740f9570400b4541340f944520094e00317aa210080523d520094L16;FFed5b00f9ec0700f90cb45aa9edf300f915b45ba9ec3f00f9edf700f90cb45ca9ed7f00f90dec40f9ed4b00f9e08400541f050071401200542c050014280441f9BBBL8;FF6", + "10a40f9e00315aaf2feff17f50300aae00313aa220080522300805224008052b5fdff97610a40f9e00315aaf6feff17e00313aa220080522300805224008052L8;FFe0431691220080523c110094e1d342f9e00316aacafdff17e04316912200805236110094e1d342f9dbfdff17e0431691e1031aaae203", + "18aa30110094fad342f9BL8;FFe10300a9e00301aae10308aa220080522300805224008052f4030caaf7150094e10340a9ec0314aa2aa040a9290040f90bfc63d35369283808050091280800f9L8;FF00040051601a00b962420079411d00b4000080d21f000039007d20d461400d9163c00d913f1400387", + "f0001ebc1ffff54c1020e912300805223400e39a7ffff17BBL8;FFa032005480220291781c0094080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308eb48310054e6010014e1d342f9e8cb42f9L8;FFe8074091e1e702f908011891290c40f9e163179120013fd6fa034", + "bf95f0f00b12102005468008052f5e742f9e8e3163949008092f4e342f9690200f9a80240f9L16;FFf65742a9fc5f41a9fd7bc4a8c0035fd6e8c30991e1a3019102328052008107914cb2009480864dade0c309918276c03de10314aa02328052e08610ad81824cadBBBBBL8;FB0080690400013e0019756", + "e6578706563746564204b454d206b65792074797065203cc32000806904000d3e20286578706563746564203cc3200080690400023eL8;FFfd7b01a9f51300f9f44f03a9fd430091680100b00841009108fddf8848030035680100b0080140391f050071a10500548f00009409fc78d30a7c185328feff90", + "BL8;FF00018052e10313aa87160194fd7bbfa9fd030091083c40f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091092440f93f0500b1L8;FF880200f9fb08001408008092880200f9e50100144b1a0094c002805221008052441a0094002701b428fdfff008a50391fb030", + "0aa0001c03d08e140f8ec0741b2BBL8;FFa00301d108010aaaa9233ca920deff9788ffff9008a1189149038052682601a908008092685e00a9b40000b4e00315aae10314aa220080523f5a0194e0a30091L8;FFe10313aa8afafe973c008092fb4340f9fc5b02f9d5010014c90080d2fb4340f9fa8302910", + "900f0f23c4500911f011ceb80390054e02fc13de133c13da1fdffb0L16;FF3f040071200200543f08007161fdff54e87f41f91f0500b1e1000054ff7f01f9fc8301f93fff04a9fc8f01f9ff9301f9ff2b03b921e30091a2c303d118efff97BBBL8;FF530040f9680640f9a80100b4690240f920018039800", + "1f8b729050091080500d1692200a9200000f9e0031faaf44f44a9fd7b43a9ff430191c0035fd6e80741b2L8;FFf85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e067c13de8d342f933ffff174b0080522c0100348c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d3BL8;FFe00313aa82048052", + "e90700f9e92f4229a8831fb8ea430039e91301b8e91b40b9eb6301b8ebc341f8ea570039ea6b0039e9b301b8ea7f0039eb1300f9e82b00b9L8;FFce11889a1f0046f24a018e9abf0100f10df07cd30a018a9a6e018b9a9f0500710a118a9a88010d0a61118e9a0901096a480142b208118a9a0001e8b6480", + "543b2BBL8;FF0809c05a2909c05a9f9202f8882600294809c05a6b09c05a892a4a29882e0129220080529f1202f82809c05a4a09c05a892e4b29882a02292809c05a6909c05aL8;FF810000b4e0f743f9220080524a3a0094e0830f91e1432a91022b80524d3a0094e04740f9e1830f9172dafe973c00809", + "2b7050014c80080d261fdffd021381491L16;FF7b0600f9682601a9b2f9ff17b50000b4e0031baae10315aa2200805246ba0094e16f40f9217b00b4e04740f92200805241ba0094fb031faaf0ffff17e8b743f9BBBBL8;FBec42e752fa62f172c002cb12d622dd32b4c2bfd2a2e2a9f2988293928ea285b2", + "57525c4241724a627b1270026d3266220fd204c219f212e22392288235b23ea2L8;FF49008052a8fe41d3eaff06a9ecff09a9e8a704a9ffa305a9e8af07a9ffa308a9e8b70aa9ffa30ba9e8bf0da9ffa30ea9e8df10a9ffa311a9e8e713a9ffa314a9BL8;FFe82303b9810d005448008092680300f971000", + "014f46f41f9e8c31791e91f46b900c1c03c01c1c13cf5fb45b9880240f9f36b41f9e94305b9e04b813de14f813dL8;FF2911c0da291540d2290d098b29250191891a498b29050091280108ab83000054f5000014e80308ab621e0054bb2640f9290180527f0300f1e903899a390108abBBL8;FF363740f94", + "f4a0194e00315aa21008052484a0194e00b00b4e10316aae20315aae01b00f94b4a0194364740f9560400b4f40f00b9f403172af7031caafc031aaaL8;FF21e03f918d460014ff4301d1fd7b03a9f32300f9fdc300913f040071f30300aae10200542800805289fdffd029c12b91ff2300a908048052a063", + "00910800ac72L16;FFfca704f9e84b04f9e86740f9e85704f9e8ef40f9e85b04f9e85740f9e85f04f9e86f40f9e86304f9e85f40f9e86704f9e8e340f9e86b04f9e85b40f9e86f04f9BBBL8;FF1f4f03a91c6300b9282300f9e9030054281f40f9090d80523a2300f94823099b010140f93f0400b1000300", + "541bf141a9196943a914e144a9810000b4000540f9L8;FF2a0900d13f0500f14881889a1f2500f148100054c9fdffb0290113918a0000102b6968384a090b8b40011fd661ce40f9810000b460d240f9220080523e6a0094BL8;FF9f820d3881e20291e20313aa16faff97200600b5e1031faae2ffff17880", + "248f81f0500b1a10000549f6608a99f7e09a9997e0aa99fb200b981020291e20313aaL8;FF8fe6ff97000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BBL8;FFe0e3009160838c3c2083ce3cc1e2009", + "161838d3c2183cf3cfc030b9160838e3c2083c83c61838f3c2183c93c6083883c2083ca3c6183893c2183cb3c60838a3cL8;FF08711d5308410051081d7d92226968f849fdffd029412f91286968f8e10308aa7c26001408a440a9e20301aae00308aae10309aaac26001440fdffd000200f91L16;FFe927", + "099122f18f3ce8af01f951aa009468220791e0230091a21a0094e0630691e1230091023280524aaa0094e1630691e00313aa0239805246aa0094ff830d91BBBBBBL8;FB312e31322e312f7372632f6c69622e727300174b657920616c7265616479207265717565737465643a20c00010626164206b65792", + "06c656e677468203cc0153eL8;FF0001803d090900f9ea0b00f940050054fb5a189b7a0b40f955fb7fd3ba0300b4489e0094e00315aa21008052419e0094200600b4f58303a9750740f9e1031faaBL8;FFe00315aae3ffff17fd7bbca9f85f01a9f65702a9f44f03a9fd03009148008052f50301aae10302", + "aa000d002af30302aaa5fbff97b73240b9b70c0034e80240b2L8;FFff030391c0035fd620fdfff000603891a21a0094ffc306d1fd7b15a9fc6f16a9fa6717a9f85f18a9f65719a9f44f1aa9fd43059109304039e9130037190840b9BBL8;FFa1220091022a8052525e01940200001417008092818a40a9e0", + "030091f80300919b22009400830091e1c30591022a8052f70f00f9475e0194ff0600b100080054L8;FFe9af05f9290000b029612a91e8ab05f9e8c32791a04700d1e9b705f9a9fdffd029411f91e8b305f968008052e1c31791e91703f9e9ff02f989fdff9029ed0a91L16;FF680240f9b70640f91f0101e", + "bc0080054680640f9490280522a040091e00316aa6a0a00f909692138e10313aa8febff97780a40f9680240f9080118cbdf0208ebBBBL8;ZBL8;FFe007409100800991797a0094f70300aa4c7e00940090805221008052457e0094c09601b4e10317aa02908052f50300aa487e0094437e0094002c815221", + "008052BL8;FFa8000037080940f91f0500f1e0179f1ac0035fd620008052c0035fd6fd7bbda9f65701a9f44f02a9fd03009115fcdfc8f40302aaf30301aaf60308aab5010037L8;ZFBBL8;FF1f0500714c04005428050035e90f41b230000014e99340b8ea0f40b9e093c33ca91b00b9e92341b8aab301b8", + "ea2f4079e90300b9a91b40b9ea0b0079ea234079L8;FFe80302f93bf4ff97680a42f9600642f9e103152a080d40f900013fd6f55b40f9607e02f9618202f9effeff17e85745f9788242f9fadf09a9fb6300f9fa4f45f9L16;FFe82b02a9e8e343f9f8c701f978d34b78e82703a9e8eb40b9f4cb01f974934", + "bb8e89f03b9e87340f9fcc301f9f79b03b9f7831d91e8d301f935200094e5b343f9BBBBL8;FB09ee06fade90efd5fa320668af820d0e7026764ed9ccd4c2a4e4d2aa0b66dfa47b40a9eaa28c7f4ced22000064d9cf570f76474c51260eab9a3bed455ac556b9L8;FFc02300543f0f00f1210d00544d8e009", + "40009805201018052468e0094206b00b4f80300aa478e0094c000805241008052408e009473008052806900b4a8009152BL8;FF74000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f97f140094e80300aae0833291e1feffd02118149142028052e3feffd063141391e85306f9L8;FFfd7b", + "43a9ffc30191c0035fd620008052c1028052840a009420008052e10314aa810a0094fd7bbda9f65701a9f44f02a9fd030091f30300aa020300b428004039BBL8;FF4a390b0b4a1140510901f83708710a8bea00805208a800a91f0000f9fd7b44a9ff430191c0035fd65f01487103090054291cc0392b1d0", + "0124a550b0b4a014851L8;FF7e020094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb880b00546d000014f30300aa1dfdff97e80300aae00313aaL16;FF00f80c91e8ab03f968fefff008611f91e1032b91f20302aaf00303aae3031d9162008052f86305f9f6", + "0306aaf8030caaf5ef00f9e9a703f9e9af03f9e8b303f9BBBL8;FFe1000054e84340391f050071ec030054c8040035e90f41b22d000014e89340b8e90f40b9ec234079ea2341b8eba34039680a00b9e82f407969b200b86cf20078L8;FFe909ff97e89341b9080e00362007c03de9b341b92143c23ce8c74", + "1b9a6000014c8fdffd008612e9169038052d0feff17eaa759a9e8430f912083c13c2183c23cBL8;FFe103082ae20313aa630c8052b0f4ff97e10300aa60fdffb5480740f91f011ceb49600054e00313aafffaff97a0fc073728fc60d3086000b5200840921f1800f1L8;FF60010054e003154bbf120071bf", + "c820388d010054bfb01f38b5c01fb875d25f38b5120012b5820151a41e001264d21f38f40313aaf76343a9f96b44a9e2ffff17BBL8;FFe1d342f942faff17f60300aae04316912200805201120094e1d342f9e00316aac6f9ff17f60300aae043169122008052fa110094e1d342f9e00316aaccf9ff17L8;", + "FF4d2e0094c082c53ce8b744f9e0074091e163c23de9a744f900001891e027823de05fc23d01048052e85304f9e89349b9eaab44f9e037823de04fc23de8f308b9L16;FF210040ade10300ad220041ad21000291e20301ad4fae0094e0230291e10316aa42260094e8630891e02302913b240094e80f41f9", + "1f0500b140080054e0431291BBBBBL8;FB0e00000026000000496e76616c6964496e7075744c656e677468496e76616c69644f75747075744c656e677468496e73756666696369656e7452616e646f6d6eL8;FFaa7355382901084aab531538ab835538a9631538a99355384a01084a6b01084aaa731538a", + "aa355382901084aab831538abb35538a9931538a9c355384a01084aBL8;FF290140b22911c0da291540d2290d098b2925019129fd46d3290d00910a0300344a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a05009111000014L8;FF093d0039e92341b909410039e91f41b909450039e91341", + "b909490039e90b41b9094d0039e90341b909510039e9fb40b909550039e9f340b909590039e9ab5c29BBL8;FFa8835bf8f43340f9090380522a040091e003172a09692138a14301d1aa031cf832dcff97a1035cf8a8035bf8f90f00f91f0101eb80220054a8835bf849048052L8;FFe00314aa00013fd6a1", + "0640f9e12a00b4a20a40f9e00314aa4756009453010014fc831291e8db42f9f90316918043c03df7cf42f9fbc742f9f5cb42f9e0e31b91L16;FF4dd60094e12740f9810000b4e02b40f92200805248d600945f0f00b180000054e80300910001029101deff97ff074091ff830c91f44f45a9f65744a9f85f", + "43a9BBBL8;FFe20315aa0001178b52760194e802158b680a00f9882640f91f0500b1a0090054610a40f9680240f91f0101eb40310054680640f9966240b92a040091952e40f9L8;FF49068052f4074091948209910969213828040091f68b49f9e8d302f9df0a00b1410f0054f9031faa84000014e1d342f", + "9e8cb42f91f0101eba0730054e8cf42f9BL8;FF85fdff9760820791f30b40f9fd7bc2a818fdff17fd7bbea9f30b00f9fd03009101c840f9f30300aa810000b460ce40f92200805240f6009461d640f9810000b4L8;FF60824039641e40b9631a40b90610001265424079001040d38300032a4220c01a2400", + "030b42040051a02c46d39f00026be0000054232100351fbc00716d1e0054BBL8;FFe01bc43de83b48f96082803c09008092680e00f9e0430691690200f9bb100094a80600d11f0900b163010054ab000014e80180520900809268220039e0430691L8;FF1f090071200500ad2209803de2ef01f9c01e0054", + "1f0d007141470054a8000090081140f9680500b4e0d341f9e34740f9e8830f91e45b40f9dde4fe97fcf341f9L16;FF4db60094e19342f9810000b4e09742f92200805248b60094e19f42f9810000b4e0a342f92200805243b60094e1ab42f9610e00b4e0af42f9220080523eb60094BBBBL8;FB080000000", + "00000001c57450000000000000000000000000001000000000000000100000000000000006845000000000000000000000000000100000000000000L8;FF290500918a2a80b9ea0400344a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a0500918b1a40b97f050071210400548bb243292b04", + "00346b0140b2BL8;FFe8feff9008a11791a10302d1e303169142008052e9c702f9e9cf02f9e8d302f9dadaff97a10353f8810000b4a08353f82200805240060194f56340f9e8031691L8;FF3a0080524c060094b80100b510000014810000b4e00316aa2200805246060094b70000b4e1ee7cd3e00314aa0", + "2018052410600945a008052b80000b401ef7cd3BBL8;FFe90b00f9e81f00b9e12b00f920caff97e8c30291e0031aaae10318aafa2700f9b6400094e8c34239a8010036e8e34239490080d20900f0f21f0500716c080054L8;FF20008052e10280528742009482fdffb042401091e0031faaa1420094fd7bb", + "da9f50b00f9f44f02a9fd03009108684539f30300aa1f110071cd0300541f150071L16;FFe92b00f9e90f40f9e193c33deb2b5fa9ec6300f9ec030daae91700f9e98f40f9e6030caaed6b40f9e13b00f9e10308aaeea713a9e99b40f9ea9300f9eabb40f9BBBL8;FF08e10d91e8ab08a96a0680524804805", + "2ffa703a989ffffb029e51c91e9ab05a9290080d2c92cc0f2e8ff04a9e8a707a99e620194e10340f9810000b4e00740f9L8;FFf44f4ea9f95b40f9f6574da9f85f4ca9fd7b4aa9ffc30391c0035fd6f623009137008052180d8052680240f9080540f91f0115ebe91a0054e00313aa49feff97BL8;FFe80f", + "41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e00300917cecff97f44f47a9f92340f9f65746a9f85f45a9fd7b43a9L8;ZDBBL8;FF01f57ed3420080524b26019468aa40f9a80000b460ae40f901f57ed3420080524526019468b640f9e80000b460ba40f901f57ed3", + "42008052f30b40f9fd7bc2a8L8;FFfd7bc2a84c260014280400d11f0d00b1c8000054000440f922008052f44f41a9fd7bc2a844260014f44f41a9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091L16;FF411800545f0100710bfa80526a018a1a4a01142b421b00545f01086bc20b00544801805284000", + "0145f01007109fa805237018a1a0901172be21a00549f02096b" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines4 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines5.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines5.lean index 39788b52e..6fbcffcec 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines5.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines5.lean @@ -27,361 +27,252 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub5 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF8c8101910dd082520900001410120012ef150012ef19102af02500511f160071820200545f0109ebc0fdff54ee0309aa2ffddf382fffff36e9030eaa30eddf38L4;FFac1d00128d00f83761710c8bab008052300000144d15c039ae1d00128c1d0e0b8c0102518d00f83761710c8bcb00", - "8052280000149f114071630800544d19c039L8;FFf85f44a9fd7b43a9ffc30191c0035fd6e8030091090000d029c11c91f5a300a9e823009180020090000c0d918202009042e02291e1430091e9a301a9e91700f9BBL4;FF28008052e0c30191e3430191e1031baae20319aa24008052f603182ae8430139", - "f80319aa690200945ea0019400048052210080525ca00194c01e00b4e08743adL4;FF3f00056ba80600541fc01f3801e01f7802d01f38610000cb2100146be503022a60010054e503014b3f1000717fc82538ed0500547fb01f3861c01fb801d05f38L8;FF84200a91a363009162018052a80f00f9b5a000", - "9468e20291810100d021cc1791a40100b084200f91a363009182018052a80f00f9aca00094aca00094fd7b41a9BBBL4;FF1f0400b1618400548de001941f100031e1830054f9ffff178ae00194f70300aa1f0400b141fdff54e04305918100805285e00194c0820035e85341b9e86f00b9L4;FB72632f6c6", - "9622e7273002973697a6520746f6f206c617267653a2074686520696e746567657220747970652063616e2066697420c0162062797465732c206275L8;FF097942a9062941a9fc8300f9e0cb00f902014ca9e9bf00f9090d43a9e2eb00f90e4548a9e09b00f900514da9e9ff00f9094144a9121149a9e0a7", - "00f917014fa9BL8;FF6c600194610e40f9140080927f4a00b9740200f93f0400f17f5200b98b000054601240f92200805262600194611a40f9740e00f93f0400f18b000054601e40f9L8;FFa200805284018052cb54ff97e00740f941feff17c80080d20800f0f20809009147ffff17fd7bbda9f50b00f9f", - "44f02a9fd03009148008052f503012ae10303aaBBBBL4;FF8c0d4d8b9f1d00f1690000540c10805205000014ac0a40f98c050091ac0a00f9ec1f80520c692b38a80e40f94c21003921815cf8080500d1a80e00f93f0400b1L4;FFff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae02", - "30091040180520503805229f87fd33f1100f13481889ae30314aa0c000094e80740f9L8;FF4b160094e10340a92aa040a9290040f91f1040f15369283808050091280800f903feff540b7c07533f0108eb6b611932000100544b692838080500911f0048f1BL8;FFe803009102028052b680019468620091", - "010300d021082991040300d084e01291e0030091a363009122018052a80f00f9ad800194010300d02130299124030090L8;FF40011fd6e11740f9e80f40f91f0101eba0880054e81340f9938248f84901805209692138210400917f0a00b1e11700f961260054e80f40f91f0101eb00900054BBBL4;FF085", - "440f91f0500b180020054f40301aa09044ba9a8a300d1e00309aa62960094a8835d381f050071e1020054880300f008210c91090480520b00001428008092L4;FB6402000013000000696e6465786b657950656e64696e675072654b65797072655f6b65795f69647369676e65645f7072655f6b65795f69", - "6474696d657374616dL8;FFe10b05ade033803da2033aad6083c63c6283c43ca103933c6183c53cfc8f00f9e10302ad6083c33c6183ca3ce00b01ad6083c93c6283c83ce00704ad6183c73cBL8;FFff0306d1fd7b14a9fcab00f9f65716a9f44f17a9fd030591e10b00a9080300d0e40b00f908b140f91f0", - "900f1830b0054155040a9f60300aae063009102048052L8;FF081340f9e00316aae10315aae2031faa00013fd6e0031faaf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a9b61cff97e0230091BBBBBL4;FFccffff17b7835df8daffff17e00700f9210400d0210018912304", - "00d063182891e0230091020180526400805209000014e00700f9210400d021001891230400d0L4;FF2dc2ff97e09f00b9a04700d12ac2ff97e09b00b9a04700d127c2ff97e09700b9a04700d124c2ff97e09300b9a04700d121c2ff97e08f00b9a04700d11ec2ff97L8;FFf34340f9ff430291c0035fd660", - "02009000203a916302009063c033916402009084003b91a27f0091e106805271100194ff8301d1fd7b03a9f52300f9f44f05a9BL8;FF6e010094a08641ad94a20191a216c03da30ac03de10318aaa8835ef8808701ada083d83ca183d93c8217803d800700ad883300f9830b803d97fdffb5287f40f9L8;F", - "Fef250191ce194f8bdf010deb230300548c0500f1ed030eaa81feff54ca010aab220200542801088b480108ab8202005409804039000509ab22020054fd7bc1a8BBBL4;FF220080526bd00194b50000b4e00318aae10315aa2200805266d00194e86b40b9f88b40b9fa0313aaf3031faaf5e702a9081d001", - "2f50f00f9e81700b908018052L4;FBdf98e7bf90f48e9e0000c2ab2e6a237900000d13000000000000777a836bc6f00000459b00000000000000000000000000000000000000000000a28ce26db48fL8;FFe2c345a9c4010014e027c33d8103c03de86f46f9e0c7833de1f7803de8f301f9280200d008b14", - "0f9e2c345a9ebbf40f9facf40f9e31340f9f7f340f9f44b40f9BL8;FFe92302a9e8030091ff2301a9c4c0ff9740030035e003c03de80b40f96002803d680a00f9fd7b43a9f32340f9ff430191c0035fd65b500194c000805221008052L8;FFe8f304f94003803d28ffff17e94341f9295541b9e91700b908", - "b140f9fb2740f91f0900f1c9040054e23740b9a08302d1e103182ab58302d1f1e3ff97080000b0BBBBL4;FFe093c43ce193c53ce8230191e0830091e00701ad22cc0094e82341391f050071c0020054e093c43ce193c53ce293c63c600600ade093c73c620201adfd7b4aa9L4;FB726563697069656e7420", - "726564756e64616e746c7920656e636f64656420617320656d7074790000ea984800000000002e00000000000000a702000031000000L8;FFff0302d1fd7b03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf40301aa49efff97e80300aae00301a", - "aBL8;FFa8831ff8b870019468620091e10200d021a01d91040300b084c01d91a32300d102028052a8831ff8af70019468e20091e10200d021f42a91040300b084401e91L8;FFe00b0054e1d342f9e8cb42f91f0101eb00400054e8cf42f92a040091c02202914901805209692138ead302f971280094e143", - "1691210d0094e0a749f9800100b4BBBL4;FF42e01991a14301d1a8273ba977b00194a18353f8e00319aa73b00194e90300aa2a0d46f85f0500b1800000542a0080920a2500a9c0035fd6ff0301d1fd7b01a9L4;FFff0700f96f0f0094e80740f91f00007100019f9afd7b41a9ff830091c0035fd6e608001", - "4ff0301d1fd7b01a9f65702a9f44f03a9fd430091f30303aaf40301aaL8;FFf65703a9f44f04a9fd030091ff030ed128f840f9f30301aae20700f95f0008ebc109005448008052f50300aae0430091ff2301a9e10303aaf40302aae87f03a9BL8;FFe0db42f9e44b40f9430302911691ff97fc5346f98082", - "c03ce85f46f99f0b00b1e0d3823de8ab05f901080054e8ab45f9e9c32791e0d3c23de95b04f9890200f0L8;FFe80342f9b7028052e85700f9a8028052e86b00f9e95740f968c6533935fd48d3e80a073762f8ff170027c03d011fc13de8fb43f9fc3b01f92023803d2183863cBBBBBBL4;FFfd0300910870", - "40391f0d0071a101005413d040a9880240f9680000b4e00313aa00013fd6810640f9c10000b4820a40f9e00313aaf44f41a9fd7bc2a85d180214L4;FFe11340f9810000b4e00f40f92200805268180094e8fe70d3e9fe60d3956e00a9995a01a9889e0039280080529c820039971202b8895202789a1600f", - "968620039L8;FFfd7bbda9f65701a9f44f02a9fd030091f30301aaf40308aa810100b4f60300aa60180194e00313aa210080525e180194c00200b4e10316aae20313aaf50300aaBBL4;FF9281ff9720f4ffb4e0000014a88356f81f0500b1a0030054e1820191a2e300d18a81ff9720f3ffb4e7000014a88", - "353f81f0500b180030054e1c20091a2e300d1L4;FB0a1f0f07190c06150a051208041f0f071c0e060000000000000117021d1813031e1b190b1408040d1f161c121a0a070c1511090610050f0e0000000000000000L8;FFa9b318384901084aaae35838a9c318386901084aabf35838a9d318384901084a2", - "20080526801084aa9e31838a8f31838e18305adf46b00f991980094e08745adBBBL4;FFe80315aae00314aae303132a220100540c0000141f2100391f0100f9c0035fd6e80315aae00314aae303132aab000054c3000836094841b93f11007162000054L4;FB792f696e6465782e6372617465732e696f2d", - "313934396366386336623562353537662f736f727465642d7665632d302e382e31312f7372632f6c69622e727300L8;FFe60307aae87700f9e70314aaf57b40f9e58f1da9e8174da9e18f00f9e3031baae9030eaaf7af00f9f7ef49a9e1d348a9ee0311aafa8700f9fa0302aae22f40f9BL8;FFe0020054e", - "18f49f93f0400b140010054810000b4e09349f92200805265580194e19b49f9810000b4e09f49f92200805260580194b30000b4e07b49f9e10313aaL8;FFe80301aa80000036682900b5e1031faae1ffff17e1031faae8830cb9deffff17e18b0cb940ffff17a88357f8080540f9150101eb232c0054a883", - "57f8080540f9BBBBL4;FFf73b40f9f65748a9fd7b46a9ff830291c0035fd600018052010280527df80194000400b000a0199179f80194ff0304d1fd7b0ca9f76b00f9f6570ea9f44f0fa9L4;FB454d206b6579206c656e677468203cc0153e20666f72206b657920776974682074797065203cc0013e001b", - "626164204b454d2063697068657274657874206c65L8;FFf44f45a9f65744a9fd7b43a9ff830191c0035fd6ff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091081c00121f09007181010054e00302aaBL8;FF7b0600f94e000014b82303d1abab74a9081340b8a9c353b8ac035438e88", - "b00b9a8835538ea3b00f9ea4740b9e9b308b809a340b85f050071aa635478e8e30139L8;FFe0fbc33de15b813de8e30a79e063813d70780094fc074091f94315919c8301919f0600b1a0050054b8008052af000014e8074091f68f45f90023009108810991BBBL4;FFfb0301aa6101f8b6f4031faae00314", - "aae1031baa74b801943a008052e0031baaca8f0094e8031baafb0301aae1feffb7e80700f9f52700b95b0200b4f50300aaL4;ZDL8;FFf65747a9fd7b46a9ff430291c0035fd6ff4301d1fd7b02a9f65703a9f44f04a9fd830091f503012af40300aaf30308aa5cb80094000580522100805236008052BL8;", - "FF090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6a00200b00080309160380194L8;FFfb4b40f9e92308a9fa5700f9bc0000b4e00317aae1031caa2200805265380094e15f40f9fa6740f9810000b4e06b40f9220080525", - "f380094fc432a91bb0000b4BBBBBL4;FF0809009110ffff1761030054e0031faa89ffff17c80080d2e90b00f90800f0f2080900d108ffff17c80080d2e90b00f90800f0f2080900d171ffff17e90b41b2L4;FFf50303aaf30300aa760000b5370080520c000014f80301aa62080094e00316aa2100805239", - "0080525f08009420feffb4e10318aae20316aaf70300aa65080094L8;FF6941899a8b0000104c6969386b090c8b60011fd6410200f021001691e00308aae2028052fd7b42a9ffc300919f080114a9600091410200f021c01b91a9831ff8BL8;FF00c01c916e880194e9031faa27000014e9031faa6a8640f", - "90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a0500916b2281b9cb0e0034L8;FFe01300b467880094e00315aa4100805265880094e01300f9201300b461880094e00315aa410080525f880094e00f00f9601200b45b880094e00315aa41008052BBBL4;FF9f9700f961630091a2", - "6301d18fb1ff9760f4ffb4360000149f5b13a99fa300f961c30091a26301d188b1ff9780f3ffb43a0000149f5b10a99f8b00f9e1030691L4;FB2f7372632f76312f6368756e6b65642f7374617465732e7273001b737071722076312e73656e645f63742e73656e642065706f636820c01e3a20486561646", - "572L8;FFba2b00b5f5031faa53fcff17e96b40f948fcff17960000b4e10316aa2200805264c80094e17740f9810000b4e05f40f9220080525fc80094b50000b4e05b40f9BL8;FF220080527b260094f42344a91f0114eb23100054e81f40f9e10315aae20317aa0001148b6b480194e90344a9080009eb63", - "0e0054ff0208eb68080054340117abL8;FF680080521535889a680240f9080114cbbf0208ebe8000054680640f93f0002710801148ba20100540101003926000014e00313aaf603012ae10314aae20315aaBBBBL4;FFd3a20039c80200b94301001408358c52f50302aa3f01086b290500546804009008b1", - "40f91f0d00f1a3040054e8030291a90000b029312291e8270aa9e8630291L4;FB8c2140000000000028000000000000000800000000000000c8a2400000000000000000000000000008000000000000000800000000000000acc4420000000000L8;FF3f100071e00200543f140071200500543f18007121", - "030054e8d341b968000037fceb00f9ffdb01b9c1d20191a2c303d155e9ff97404000b5e1031faabaffff17BL8;FFf44f52a9f65751a9fc5f50a9fd7b4fa9ffc30491c0035fd66668019436008052e0230091db50ff9713feffb5f3ffff17200080522100805276680194a0a300d1L8;FF290000f029c1019", - "1e80b02f94801009008212c91e90f02f949048052e82719a9e1031091e3430691e8271aa94801009008c12b9142008052e8db00f966fcff97BBBL4;FFe1031caa78a80194fd7bbba9fc6701a9f85f02a9f65703a9f44f04a9fd030091ff0309d1f30308aa08048052f40301aaf50300aaa22335a9e023009", - "1a1c302d1L4;FF230103cb040000145f1c0071e1010054e60301aa021040f9840400d12100028b840200b4220040b95f18007180feff545f080071a1feff54e5feffb4230840f9L8;FFa1037aade20b803de18302adb4250094a1d300d1e00316aae20318aa6da80094a8c303d17b070091f60314aa00c1c", - "b3c01c1cc3ce80f40f90c088052000500adBL8;FF400100b528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd620008052800600f909028052936a29f89f0200f9f44f41a9fd7bc2a8L8;FF21001891d364fe97e0234ea9a2a20291e16b40f9081140f900013fd6e0e302f9e8", - "074091e1e702f908011891290c40f9e163179120013fd6fa034bf95f0f00b1BBBBBBBL4;FFa08300d15f0108eb010a80520295899a92010094b9537ea9a1035ff8790a00b4750240f9e1cf00a9f70f00f9170b00b4a00240fdfc0f40f9fa031faa1b0a8052L4;FFc0035fd6a00000f000a02a91801c0094f", - "fc301d1fd7b03a9f72300f9f65705a9f44f06a9fdc300910920403909080037010040f9f30300aaa20000f042e02891L8;FFf65741a9fd7bc3a820feff17dff8ff97fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30302aae20301aaf40300aa34010037e00308aae10314aae30313aaBBL4;FFeb375", - "339ea3b5339e7b75339fe4340b9eb2b1729eb3f5339ea435339eb2b1829eb475339ea4b5339eb2b1929ea125e38eb225e385b01084a6801094aea5b5339L4;ZFL8;FF010040f9f30300aa3f0800b1800100543f0400b140010054810000b4600640f922008052639c0094610e40f9810000b4601240f9220", - "080525e9c009428008092BBBL4;FF2a15003308111d1281f3803ce88218398a7f0039e0ab893de0a7893de0a3893de09f893d56ffdfc8760000b585dc0194f60300aadf0600b120050054fa0b4091L4;FB696e696e673a20c00129001a756e6b6e6f776e20656e756d65726174696f6e2076616c756520c0", - "00537472696e6756616c756500000000006811490000000000L8;FFe8ef00f9e8cb42f9e8f700f9e8e342f9e9a30fa969018052e97300f9e6e300f908008092ee6b40f9ebf300f9fb0311aaf10300aae7af00f9e70316aae00319aaBL8;FF08810991f40740919482099195a40094e1074091e0431691023", - "98052218009916c5c019488220791d800805294018052000540ade893687915008092e8e30a79L8;FFdaffff17e083c03ce80f40f96002803d680a00f9f44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd6e0230091e1031faa76ffff97a9ffff17ff0306d1BBBBL4;FF04000014d60600f1f7620", - "091e0000054e1825ff881ffffb4e00240f92200805264fc0194f8ffff17740400b48806148be00315aa0201805201f17dd35dfc0194L4;FB35303939306231343131366236643835366166303938352f6c6962726172792f7374642f7372632f73796e632f6f6e63652e72730076656e646f722f6c696273", - "L8;FFe00313aae01300f9410200b021341a91430200b063901a91e083009122028052a400805211000014e10740f9e10000b4e80b40f9f30300aa22008052e00308aaBL8;FF3f0400f18b000054601240f922008052687c0194611a40f9740e00f93f0400f18b000054601e40f922008052617c019461264", - "0f9741a00f93f0400f18b000054L8;FF23008052240080524992ff97e11740f91dfbff17e0630091e1031baae20319aa23008052240080524192ff97fb1740f9e80f40f908011bcb3f0308ebe963ff54BBBL4;FF491f009148dd789207000014ea874039e8031faa491b009103000014e8031faa49230091", - "4a1d409208010aaa69a200a928008092680200f9d40000b4e00315aaL4;FB14f647000000000020000000000000000800000000000000241e4800000000004a8949000000000075000000000000006d00000026000000636f696e73000000L8;FFe00316aa220080526abc0094e10740f9810000b4e00313", - "aa2200805265bc0094e10b40f9810000b4e00314aa2200805260bc0094f44f54a9f65753a9f85f52a9BL8;FFe80300aa098d40f83f0500b1e01e0054f30300aae00308aa22040094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098bL8;FFb70300b4b8220091040", - "00014f70600f1186300910003005401835ff881ffffb4000340f922008052623c0094f8ffff17ff0600b17582039180050054200740adBBBBBL4;FF610a40f9680240f91f0101eb60300054680640f9090480522a040091e00315aa6a0a00f909692138e10313aacdf7ff97805241b980010034610a40f96", - "80240f9L4;FFf7031faae00317aae10314aa760c0094f8031f2ae9feffb40a1f00124a09380b4a791f535f0d1872410100540b1540386bc100517f250071c80000544a1d0012L8;FF5fb5007121050054f40308aa081040f809a040b80af040b8e1230091e80700f9081440b9e92b0229099041f8e81b00b", - "9081042b8a05300d1e9c301f8e82700b9BL8;FF00e4006f0aa140a9290000f9e9430591ea2314a92a210591280080524001803d0a008092ff2315a92081823ce8bb00f9e8c700f92081853c09018052e8ff1ba9L8;FF688c0094e00318aa41008052668c0094fa0300aaf91700f9a06e00b4b90000b50c00", - "0014ff1700f95a008052390100b4e8031faa490b00916a7a687828e11f78BBBL4;FFf85f14a9f65715a9f44f16a9fd430491e24f00b9b40040f9f60307aae52f00f9f503042af903032aa93340f9f703012afa03002ae82300f9e92b00f9140100b4L4;FB080000000000000008000000000000005cfa450", - "00000000043697068657274657874204d414320697320696e76616c696441757468656e74696361746f722070L8;FFe10314aae2031caaf50300aa71cc0094b10300146083c83c6183c93c6283ca3c685f40f9e07f813d6083c43ce183813d6183c53ce287813d6283c03ce06f813dBL8;FF66fcff970a03", - "80d2c80200d008490091690480520a00f0f2e8a716a95a1100d1e10740f9a1e6ffb59efdff17c00200d000202891c30200d063c01c91c40200d0L8;FF0801098b080500911f0109eb49090054091c40f93f0500b120060054096840b969070034290140b22911c0da291540d2290d098b2925019129fd46d", - "329050091BBBBL4;FF95620091ff2300a9560109eb4231899a84ec0194087c40931f000071c802889ae802f8b7080100d008e13491e10300b021203e91e203009042f83391e0030091L4;FB000000000000000008000000000000000800000000000000b4764200000000000000000000000000080000000", - "000000008000000000000001077420000000000L8;FFf50b40f9fd7bc3a831eaff17e00313aa22008052230080522400805244020094610a40f9d9ffff17f50300aae00313aa2200805223008052240080523c020094BL8;FFa0e300d1820380522401805214000014fa0300aa14000014a0831cf8e10200", - "b021483191e30200b063b83191a0e300d1820380526401805209000014a0831cf8L8;FFfd7b03a9f32300f9fdc300913f040071f30300aae102005428008052490100d029c11391ff2300a908048052a06300910800ac72e1630091a21b00b9e92302a9BBBL4;FF4a000014e80316aaf80317aafa010034e", - "8030091e10317aaf802028b00011a8b6cac0194e83340f980030191e10300912200805208050091e83300f990ac0194L4;FF0f128f9aad016192ce7d60d36b010caaac010faa7f0218724a010baa8b118e9a7f0271f20835530a4a010baa6e3a4ed311fc4bd34b0158b24c0558b24d0958b2L8;FFd2a5ff9", - "7e12340f9f0ffff17f5031faaf70316aae00315aae10317aa72ac0094e0230191e18307910230805269ac0094f42340f928008052f51f40f9933240b9BL8;FF400707adbb0318f8b58318b8972c0194e88345b9e9c742f902a09152840200d084001191e0031baa1f010071e103152ae204a072e813899ae", - "3031f2ae84f04f9L8;FF682c00940018805221008052662c0094408d00b4e0e7076f08188052e9030291a8033da908048052f90300aaa8031ef8e8074091e10318aa08011891000000adBBBBBBL4;FF1f0048f1280800f9a202005400fc4ed354000014e00700f9e00301aaf30301aae10309aa220080522", - "300805224008052f4030b2ace0600946aa240a9e00740f9L4;FFe97f02f94083803c4183813c45000014e9830a9168008052eaef4bf9e96b02f9e9eb4bf9e0230891e8830a3928008052e143139142008052e86f02f9e97302f9L8;FF84c02e91dc140194600200b000a031916b140194600200b000602e9", - "179140194600200b000602d9176140194600200b000c02d9173140194600200b000803091BBL4;FFc0035fd6f50f00f9e00317aacf6b0094f60301aa3f001bebf70300aa69f5ff5481ffff17f50f00f9e00316aac76b0094f60301aa3f001bebf70300aa69f4ff54L4;FD000000000000000000000000000", - "0000068324a0000000000f8334a0000000000f0334a000000000000304a000000000010304a000000000018304a0000000000L8;FFa8831ff8b8940094b8940094f44f43a9fd7b42a9ff030191c0035fd6fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091084c80b9f30300aac80a0034BBBL4;", - "FFd60000b4c8e279d3e00314aa02018052011116cb67d40194e00740ad280080926082803c6182813ce8000014880080d2b58316f80800f0f207000014e80b41b2L4;FBb7af742505cca14734f2ca579cb3e1e6cf99bfbb7dfad97134f29d0e8691221a34f2907934f234f200000100a421f64e4ea472c65", - "987154357596fb299a42e0bL8;FFe9eb40f9e8a740f9f6031baafb030baacb008052e99b00f9e9cb40f9e06700f9e00302aae22f40f9e9eb00f9e98b40f9f73b00f9f70301aae9b700f9e9c740f9BL8;FF800100b4e1d342f9e8cb42f91f0101eb20460054e8cf42f9090180522a04009109692138e14316", - "91ead302f9140d0094e88f49f91f0500b1c0000054e8074091L8;FF280280520000803dfc5b02f9e85f02f9e86702f9e943133919000014e033c33de1d3c23de9c31291e8ab45f9fc5b02f9e037813d2181803ce86702f910000014BBBBL4;FFe02f40f9220080526af40194bf0600f1ab000054e00316aa", - "e10315aa2200805264f40194e00314aa69dcff9708008092687200a9f44f52a9f65751a9f85f50a9L4;FBca9a250b1be9d5a9463e61efd6781777a91b83c97b844d014206e2829785000002000000058854ead3e3a8fe3a286644cd1b3538be14dfd5797653c9fd7d3d85L8;FF21b01c91230200f063dc1c", - "91e00300916201805264018052eaffff17e80f41b2dcffff17e00300f9210200f021081d91230200f063301d910f000014e00300f9BL8;FFe10314aa220080526a740194e00316aa6f5cff977f6600a960ffff17f85b47a91f0b00b140ffff54e1df48a91f0700b1e0faff54e84f40f9e80702a9e00316aa", - "L8;FF23c7ff54080141d2e90080521f2d00f10831899a1f2500f128230054490100f0293100918a0000102b7968784a090b8b40011fd6f37749f97f0600b1e0020054BBBL4;FFe22f803da203d73ca1c302d1e203009103068052e323803de00702ada1037dade20f803dd7020191a82735a9e10303adc1f", - "dff9700e4006fa0833aada0833badL4;ZBL8;FFe20343adc141803ce117c03df1c11fb8e0c19e3ce2c19d3ce1c19c3ce0c3c33ce1c3c23ce2c3c13cf14f40b9e18100ade201803df1490629efc1019121fbff54BL8;FFe81f46f91f0500b1e1000054ff1f06f9f62306f9ff2706f9ff530cb9ff2f06f9ff6", - "30cb91f0800f1a12b0054a02302d182ecff9700080036c1efffb4e5010014L8;FFa32a0054a88357f8080540f91f0116eb69090054a02302d143f4ff972032003728fc60d3280f00b5200840921f1800f1e20f0054217c0353011000343f080071BBBBBL4;FFe82743a9ea2f41a928e108aae93340a90b01", - "0bca4901098b6c010c8b2acdcaca8bc1cbca2981c9938c010a8b6901098b8d81cc938abdcaca2badcbca280108caL4;FF0402805250e5ff97f48f41f9f0ffff17f8031faa130180521f080071e2f7ff54f7031faaf5031faa14018052bf0a00f1400a0054bf0e00f1014d0054880640f9L8;FFf30b40f9fd", - "7bc2a816000014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd03009101c840f9f30300aa810000b460ce40f9220080525e04019461d640f9BL8;FF08200091200440a9e92300910a0000b04a911491e8a700a9020300d042183e91ea0f00f9e34300917f840194fd7b43a9ff030191c0035fd60820", - "0091200440a9L8;FFe8230091e00309aa62018052a4840094620100d0424037912c00001408200091410100f021f41a91e80300f9e8230091e00309aa0202805299840094620100d0BBBL4;FF8000f8b728040091490400d1110000145f2800f1880000542800028b08f1df384803f837e0e31591362d009", - "4e87b45b9e8110037e8c742f96a0740f9490108ebL4;FB626173655f6b657970656e64696e675f6b796265725f7072655f6b65796c6f63616c5f6964656e746974795f7075626c6963000000000000bd67490000000000L8;FF5f0700b1800b0054f503192a9f0700b115df78b3600e0054e8274ea9e0831", - "d91e1c31591fcbb02f9f7c302f9e9bf02f9eb8b05b9ec8f05b9e8cb02f9db180094BL8;FFe10303aa000d002af30303aaf403022a1bfdff9795040034a80200320811c0da081540d2080d088b0825019108fd46d308050091d4030034890200322911c0daL8;FF6c44009405000014e00640ade20ac03d62", - "0a803d600600adff031691f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6ebab59a93f050071BBBBL4;FF0f0000141f0400b1410401548ce401941f100031c1030154f9ffff1789e40194f70300aa1f0400b141fdff54e04305918100805284e40194a0020135e85341b9L4;FB6c5f", - "70726f746f636f6c3a3a73657373696f6e5f6d616e6167656d656e7443757272656e7400000073e84800000000003800000000000000b80100001d000000L8;FFf4cb43f96083c03ce8d743f99f0a00b1e0d7823de8b305f901010054e0d7c23de8b345f909008092690200f96082803c680e00f9a500001", - "4e803009141830091BL8;FFe00317aa2100805267640194400500b4e10319aae20317aaf80300aa6d640194792240f9590200b47b1e40f95d640194e00319aa210080525b640194200400b4L8;FF29318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f60300aa080014eb2310", - "0054ff0208eb09010054e0e30091e10317aa22008052BBBL4;FF5ffd03716801088b0c21003980050054e00318aae20314aa160d0094daffff170c0180520b01008a6b010c8b8c2100916b01088a20696bfc00a8200e0d00669eL4;FFe12a0091420440f9027821f8441c40b9dfffff1781404079000000f", - "000c0029163080011212c46d306786178c66c1c53607c061b014000110300001463040011L8;FF4a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54a00100d0BL8;FFfd430091f30308aac10000b40800", - "40391fad007161000054210400d100040091e8030091cd240194e80340391f05007121010054e80740396806003928008052BL4;FFb70000b52700001435008052d8de40a9970400b4e806178b198300911aed7cd3040000145ac300f139c30091a003005428035ff81f0113eb61ffff5420835ef8L3;FB7", - "80100000000000078010000000000000010000000000000010000000400000000c009000000000000b049000000000000b04900000000000010000000000000BBBBBBBBL4;FF2a6b28382903098be80328aa7b0700d12a210039281b088ba90600d1610141ad3501158a620d40ad010101ad020d00adbbfa", - "ffb521000014090180520801098bL4;FF16000014c90080d228008052a0831d380900f0f2a8931d38a9031df805000014e10300aa0f000014e80f41b2a8031df8a0c300d17e13ff97a0031df8c1000090L8;FFf50301aa671e0194e00313aa2100805236008052641e0194400200b4e10315aae20313aa93", - "0200a96a1e0194930a00f9f44f42a9f65741a9fd7bc3a8c0035fd6BBL4;FFe02312911c87ff97c1ffff1728008052687e01a928008092687e00a93c000014f50900b45f9e0194e00315aa21008052390080525c9e0194f80300aae0f5ffb4L4;FF820c7ca981107da9a20c3ca9a1103da9061c00a9082401", - "a90e3c02a9104403a9aa2c3ea9ac343fa9c0035fd61f2003d52c3440a90e0c409203ec7c9221000ecbL8;FF84200b91a363009182008052b30f00f9b59e0094b59e0094fd7b41a9f31340f9ffc30091c0035fd6000040f90ff9ff17ff0301d1fd7b02a9f44f03a9fd830091BBBL4;FF39feffb505000014e", - "0430591810080528dde0194c0430035e85341b9e82f00b957ffdfc8770000b586de0194f70300aaff0600b180020054f843059199008052L4;FB6f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f757569642d312e32362e312f7372632f7469", - "6d65L8;FFf19700f9fbdf00f9ecdb13a9f60307aaee4700f9fceb10a9fc030daae64f00f9e48f00f9f5b700f9e0d6ff97ebc341a9e70316aafe5756a9f22b40f9ecdb53a9BL8;FF28818a9ae90200d029211391f4ab04f960f18f3c8a0000102b7968784a090b8b40011fd603e4006ff6c744f90083c03c0", - "183c13c0283c23ce007409100c03591L8;FFe00313aa2200805281010094610a40f9b9ffff17e00313aae10318aae20316aa7b010094780a40f9680240f9080118cbdf0208eba9f7ff54e00313aae10318aaBBBBL4;FF0f4105f88f2100d10041833ce083c43ceb010b8a0141823c4b010b8b0041843ca04", - "3dc3ca2839a3c49692c386921003949010e8bab0e40f920419c3c018141adL4;ZFL8;FF160101eb02030054e80f41b207000014890080d248008052e02300390900f0f2e827003928017fb2e0030091e80300f97ff3ff97e10300aae00301aaf44f45a9BL8;FFffc30091c0035fd6092000912103009021a", - "03591a9831ff8240300908420359126030090c68032910340009143000014092000912103009021783d91a9831ff8L8;FF7f0600b180270054802204919be2ff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb28260054400100d000001491BBBL4;FFff2e00", - "94e00600b4f50300aa65be0194000480520101805263be0194c00b00b488008052e083c33ce183c43cf40300aa150000f9a8833ca928008052a08300d1L4;FB2f62797465732e7273002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e2d6c696e75782d676e752f72656c6561736", - "52f6275696c642fL8;FF07088052c314009466be0094000480522100805264be0094200600b4c00640adf80300aa610240f9000400ad810000b4e00317aa220080525ebe009408048052BL8;FF2b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0", - "da4a1540d24a0d0a8b4a2501914afd46d329010a8bL8;FF14000014c80080d20800f0f2080500d1e80700f9e02300918533ff97e10300aae10700f90101009021a003910301009063640491e0230091a200805224018052BBBBBL4;FFe00313aae10317aae20315aa2300805224008052d6000094770a40f", - "9680240f9080117cbbf0208eb49eeff54e00313aae10317aae20315aa2300805224008052L4;FF28dd7892eaaf00f9f1000014e96753390c0180d2e8031faa0c00f0f205000014090180d2e8031faa0900f0f22c017fb217fd60d3291d0012e1ab40f9fa9740f9L8;FFf32b00f9fd030191f30301aae1030", - "0aae0230091220080527efbff97e90740f9e82740b9aa058052e1230091e00313aa82048052e90700f9e92f4229a8831fb8BL8;FFd80100b5c3ffff1737008052591740f9b7831ff859fcffb535008052572340f9b6831ef8b8431fb877fdffb534008052582f40f9f8f6ffb4532b40f9598e0194L8;FFf4", - "4f01a9fd030091080040f9f30300aa1f0500b1e0030054e00313aa7f000094080040b20811c0da081540d2080d088b0825019108fd46d30900088b34050091BBBL4;FF1f0101ebc0050054e82340f929040091e00316aa1c692138e1e30091e92700f9d0b9ff97f82740f9e81f40f9080118cbdf0208eb89", - "f6ff54e0e30091e10318aaL4;FB0507f0f98913489399b1a49da30cd1a7fd217d479d423f94da7da28c00eef1f38ae57e800000a46dc8ec2453a8fae00193193b6f44baa9b569b2067aa4aae860L8;FFe8e340f968da19a9e9235ea9688a1ca9e87f40f9022f805269c21ba968d21da968a207910001803d", - "e88340f968fe00f968ce0094e08750ad68e20d91e91b41f9BL8;FFe5031baaf81f00b96465ff97f89341b91f0b0071a1070054faa359a92083c13c2183c23ce00600ad808601ade8b700f9bc0000b4e0031baae1031caa22008052L8;FFfd7bbea9f44f01a9fd030091f40300aa2301f8b7f30303aac1010", - "0b4e00302aa22008052e30313aa7d4e0094000300b50e00001428008052090180529f6a29f8BBBBL4;FF7f0a00b1a0000054e1030091a26300d14000805282deff97df0a00b1c0000054e8030091a26300d160008052016100917bdeff97a083de3ca8835ff87f0600f1L4;FB85924800000000003300000", - "000000000b8010000090000000000000000000000080000000000000008000000000000005484420000000000617373657274696fL8;FF600300543f100071e00300543f1400716105005481c20091e20313aa6becff97800a00b5e1031faae6ffff173f040071600300543f08007121040054888244f8BL", - "8;FF3f0d00f10002005428611b9b1c1140b99f031a6a800100548903170a3f011c6b21010054390f0091165540a9e00313aae10314aa62008052b46e0194c0fa0736L8;FF2200805282110094e1d342f99efbff17e0431691220080527d110094e1d342f9fdfdff17e04316912200805278110094e1d342f", - "963feff17e043169122008052BBBL4;FFa903153870d4ff97a8035c381f05007141010054a8a77ca9682601a9810000141f090071e10b0054bc035df8e92e00d188df78925d00001408a341b8ab2b7da9L4;FFf30300aae023009129f87fd31f0109eb0881899a090180521f2100f11481899ae30314aa0b", - "000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9L8;FF08010191e9430091e00f00b900210091a22300d121008052a30100b063c02291a40100d084401291e80b00f9a9831ff894ae0094e00f40b968e34039a102174aBL8;FFfa6742a9fc6f41a9fd7bc6a8c0035fd6800200f00080129", - "1820200f04260139121068052842e0194e8ff42f9e90343f9800200f000c01391830200f063401b91L8;FFf36741f9880240f9680000b4e00313aa00013fd6810640f9210100b4820a40f9e00313aa632e0094ffc32091f44f42a9fc5741a9fd7bc3a8c0035fd6ffc32091BBBBBBL4;FF09010054e0e3009", - "1e10317aa2200805278f40094f42344a91f0114eb23120054e81f40f9e10315aae20317aa0001148b68160294e90344a9080009eb63100054L4;FFff0600b1a00d0054fbdf51f9f6e351f92c008092f90317aae1ab4bf9c10000b4e0031aaa22008052fa030caa61160094ec031aaaff0600b1f8e300f920", - "0e0054L8;FFe30314aada020094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faa6d160194e00741a96b16019408184039BBL4;FFf76b40f91f0500f1c1010054281f00121f050071ac0300542aff48d30c0180d2291f4092eb0f41b20c00f0f21f0100", - "7168018c9a37018a9a29019f9a08010014L4;ZBL8;FF24000014e80300aa098d40f83f0500b1e01e0054f30300aae00308aa37120094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d3BBBL4;FFbb8319f8bf6b36a9bf6f37a9220740f9e25800b4210340f935008039b501", - "f8b728040091490400d11a000014a2a302d1830c805270bcff97404100b5bc8355f8L4;FB24724600000000000000000000000000010000000000000001000000000000003c3a460000000000000000000000000000000000000000000100000000000000L8;FFe8a74ba9f79f00f9f70310aaf00306aaf4", - "030aaae60307aaca008052e7030baaeb0316aafadb4aa9fcbb00f9e14740f9fc0305aae56f40f9ec0311aaf10310aaBL8;FFb91b0094e14316911d0f00949f0600b180000054c0020291e1431691a8140094e8b349f9f4074091948209911f0500b18000005480020491e14316912a130094L8;FFe86f06f", - "9e85706f928010090082d0e91e86306f908078052e97b06f9e9c32291e86706f9280080d2e97f06f9c9048052683bc0f2ff5306f9e95b06f9ff5f06f9BBBBL4;FF780a40f967f60194000480520101805265f60194000500b4080400f008813a91e10315aa165c00a9180800f91f60003960a201a9090d40", - "f9e803009120013fd6L4;FB737361676573796e635f6d65737361676563616c6c5f6d6573736167656e756c6c5f6d657373616765726563656970745f6d657373616765747970696e675f6dL8;FF401000b5e1031faa610a00b5a80640f91f011aeb69050054e00313aa4ff5ff97a009003728fc60d38807", - "00b5200840921f1800f1c2070054217c0353e1070034BL8;FF690600b9e90340b96a120079ea0f40f969a200b8e90b40796182823c6082813c691e00796a0a00f97f020039fd7b45a9f33340f9ffc30191c0035fd61f090071L8;FFe9031faaea8b92b92a0100344a0140b24a11c0da4a1540d24a0d0a8b4", - "a2501914afd46d34a05009102000014ea031faaeb7b52b97f05007181010054eb7f52b9BBBL4;FF290080521a0317cba90316381ffd007140050054ea03019149692838080500113400001413020034e8030191e10319aa3503028b0001138b66b60194683340f9L4;ZDL8;FF69b60094800700b4f90300a", - "a65b60094000480522100805263b60094600600b49f020072fa0300aa88139b9a000540ad000400ada08300d164feff97a9237fa9BL8;FF3a008052fcbf40f9fceaffb528008052e82700f9e8e740f9e98742b9fa5b06a91f0500b1e95700b9e1ebff54e82300f9facb40f9fc2f00f9f55307a91aeeffb5L", - "8;FFe9bb40b9e8d30bb94800805208018a1af4a70bb91f01096be83740b9eadb0bb9e8e70bb9810a0054e2d341f9e5b34e39e0c30991e35340f9e45b40f9e1432a91BBBBBL4;FFff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191142440a96a9284d2136041a92a49b2f235", - "5840a98a24c9f2372041a99f0209ebL4;FF000180520102805282060094fd7bbda9f50b00f9f44f02a9fd030091f40302aaf303012af50300aa5e06009400038052010180525c060094400100b4155000a9L8;FF685640f9a80000b4605a40f901f97fd34200805267060194686240f9a80000b4606640f9", - "01f97fd34200805261060194686e40f9a80000b4607240f901f97fd3BL8;FF170300b598ffff17eb031f2ae1031f2a6032ca3c6132cb3c955a00a9803e01a98082873c8182883ca1037fad904602a9921a00f980d28a3c8c3a00b9996a04a9L8;FF000400916b03008b4901094a7f0500f109250078e1fef", - "f547f0215ebe1fcff541700001448008052bf031ef8bfa33ba9a8e301d1000dc03da0039d3c2e000014BBBL4;FF1f0500b121010054210000142a008052e803152ae91f40f9e81300f9280140f91f0500b140030054330940f9130300b4360540f9f52b00b9f5031aaafa03142aL4;FB3938352f6c696272", - "6172792f616c6c6f632f7372632f737472696e672e7273007f60490000000000470000000000000024010000150000007f60490000000000L8;FFe1df813defc343a9ec2b4ba946000014eb831d91e8b743f9e133c23d6091c83ce237c23df7430d91e86b00f9e8ff5e3969d14578e0d7803de023c23deae", - "f43f9BL8;FFffc30091c0035fd6f30300aae00301aaf40301aae10309aa220080526d050094880a40f9e00313aae10314aaefffff17e00301aaf30301aae10309aa22008052L8;FF200108ab62000054fd7bc1a8c0035fd6000100b000201e9169460094000100b000c01591664600940001009000203691", - "63460094fd7bbfa9fd030091081840f9BBBBL4;FF092540f93f0500b120060054092d40f93f8100f121070054092940f92d008052086140b92a0940792b1940392c7140f8682600b9ea0300792a7141f8eb0b0039L4;FB2076616c69642073657373696f6e20666f7220726563697069656e743a20c01b2c", - "2063757272656e742073657373696f6e2062617365206b657920c01d2c206eL8;FF2302009063c01b91e0030b91a2008052a40180524dffff17e06301f92102009021ac1b912302009063081c91e0030b91a20080522401805244ffff17e06301f9BL8;FFfd7bc2a8c0035fd600018052010280528066019", - "4fd7bbda9f65701a9f44f02a9fd030091140440f9280440f99f0208eb41020054f40200b4150040f9360040f9L8;FF810000b4600640f92200805269660094610e40f9810000b4601240f92200805264660094611a40f9810000b4601e40f9220080525f660094e00313aa080c49f8BBBL4;FF955e01a999", - "5e02a9933200b9f44f46a9f65745a9f85f44a9fa6743a9fd7b42a9ffc30191c0035fd639008052e10740f901feffb5f2ffff17ffc301d1fd7b05a9L4;FF640640f9c4e0ffb5650240f9650000b49f000039007d20d4230200b4630600f9600040f9600200f9130400f9600640f9130000f96272009140fc5", - "f882000002aL8;FF285041a99f0209eb48060054d40000b46002158be10308aae20314aa6da60094e10318aab402148bff0a00f1e80316aaf40f00f9a0010054e90740f9215442a9BL8;FFaa260114090040f9e80301aa8a0200d04a550191e00308aa62008052290140393f010071890200d02961019121", - "118a9a9e260114000040f97e260114000040f9L8;FF6200005435008052080000143f0020716200005455008052040000143f404071680080521535889a680240f9080114cbbf0208ebe8000054680640f93f000271BBBBBBBL4;FFf85f0aa9f6570ba9f44f0ca9fd03029137fc413939604ca9f40301aaf", - "30300aa08108052f51a40d2360002912000178be1031f2ae20315aa081400385b1a0294L4;FF0b000014a003df3ce113c03de82b40f9e11740f9e00700ade81300f9810000b4e01b40f922008052621a0094e10340ade81340f9960200f9880e00f928008052L8;FFc1feff54e0031f2a020000142000805", - "2f44f45a9f91340f9f65744a9f85f43a9fd7b41a9ff830191c0035fd6ff0302d1fd7b02a9fc6f03a9fa6704a9f85f05a9BBL4;FF5f000014f60300aaf40303aaf50302aa1900178be0230091e10304aae20305aae30316aae40317aa68fcff97e8234039290340391f01096be0179f1a779a0194L4;ZFL8;", - "FFe00301aaa101009021401a91e803009122018052b39a0094e0030091b39a0094fd7b41a9ff830091c0035fd6fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9BBBL4;FF604e40f9220080526ada0194615640f9810000b4605a40f92200805265da0194616e40f93f0400f18b000054607240f9220080", - "525fda0194600203916bc1ff97L4;FB776e2d6c696e75782d676e752f72656c656173652f6275696c642f737071722d383934636339653033313261616632312f6f75742f7369676e616c2e70726f74L8;FFfb031eaafc9300f9fc0305aae7030eaaf46300f9ee0316aaf6030daaea0317aae5030faaef03", - "01aae2030caaed0308aaf2e300f9f7cb49a908008092e1d348a9BL8;FFeb7f52b9ec8352b98b0700346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0d009135000014eb031faa3e000014f3031faa0901098b0a0e8052L8;FF0083893ce8d306f9e923452901838a3cf98306f9e8b70db9e", - "80740f9e9b30db9e93f40b9e8df06f9e82740b93f010071e9eb0db9e8c30db9e80340f9fb8706f9BBBBL4;FF69fa0194200500b408c30391e10315aa170800f9085800a92804009008c129911f60003960a201a9090d40f9e803009120013fd6e80340f91f0d00b100fdff54L4;FB436f6e74656e7420667", - "26f6d20c0012ec00b2077697468207479706520c00035646573657269616c697a696e6720556e6964656e74696669656453656e646572L8;FFe0c3039162f5ff97be000014e1430091e20313aaf70b00f9f74b00f9f9090094e08744adf50300aae22fc03de86340f9e0870bade08742ade267803de8531a", - "a9BL8;FF42038052e40314aaa8831ff8b67a019468220191010300b0212422912403009084600691a32300d122018052a8831ff8ad7a019468c20091010300b021482291L8;FFf8432591fc074091a182009100830091027080529c830191f94315916d7a0094e8a344f9e04fc23d890a00d19f0600f1ea0", - "08052eb672191e8b704f928818a9aBBBL4;FF0881c8932cc1ccca6901098b8801088b2bbdcbca2981c9930cadccca6801088b8901098b0bcdcbca0881c8932cc1ccca6901098b8801088b2d81c99329bdcbcaL4;ZBL8;FFa10354f8810000b4e0031caa2200805268ba0094fc7742f9370d00b4e80b40f9e", - "07b42f9080502d11f0008ebc9230054e91b40f9e0031f2ae80317aaea031caaBL8;FF6f3a0194fd7bbfa9fd030091083c40f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091092440f93f0500b1400400540a2c40f9L8;FF75f601f9f54b40f92800805276ee01f968c613", - "3969f201f97afa01f9bc0000b4e00317aae1031caa22008052613a0094fadf49a9e15f40f9810000b4e06b40f9BBBBBL4;FF087c0ba9080180521f200ca9080080921f200da9e003022ae20303aae303042a05f8ff97803000b4e00700f9210400b021a01f91230400b063543591e0230091L4;FF18c300f", - "1f7c20091c0020054e8825ef81f0114eb61ffff54e0025ef8e10316aae20314aa790a0094c0feff35f40240f9d40400b4f6825ff85a0a0094e00314aaL8;FFe00308aae10309aaa40a0114000040f99d0a0114ff0301d1fd7b03a9fdc30091090040f9680180522a0141d23f0100f1490200f0297d3d9148", - "41889a8a000010BL8;FF3f040071a00300543f080071e00500543f0c007141faff54e81b41b948000037f98f00f9c1b20191a20301d19674ff97e0f9ffb4520000143f10007120030054L8;FF6b7f8b0aaa7e8a0af69b40b90f020f4a2d7c8d0a8e7f8e0ad07e910ae901094a6a010a4a08010c4a29010d4", - "a4a010e4a0801094a4901104a6a0200130801094aBBBL4;FF26ffff17a0c300d121008052220080522300805224008052d5bcff97a8035ef891feff17a0c300d1220080522300805224008052cebcff97a1035ef8f8feff17L4;FB0000000000000000080000000000000008000000000000006809460000", - "0000000000000000000000080000000000000008000000000000007009460000000000L8;FF40210054ee6b00f9e84300f9e94b00f9eccb00b9169c00b4fb0316aaebbb00b960ca0094e00316aa210080525eca009460f200b4e1031aaae2031baae06300f9BL8;FF080c49f81f0500b1400000540401009", - "4745a45a9f60000b4f50314aae00315aaff000094d60600f1b5a2019181ffff54682640f9c80000b4090d8052e00314aaL8;FFce020094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb88130054bd000014080c44f81f0900b1c1090054f3031faaBBBBL4;FFa", - "2833cad75ea019400e4006fe08311ade08312ade08313ade0a7803d65ffff1760ea019400088052210080525eea0194c00200b4e90340f9e14740f908088052L4;FB39a34800000000002f00000000000000210000000900000024954800000000005b000000000000005200000009000000000000000000", - "00000800000000000000L8;FF240080524a000094610a40f99bffff17e00313aae10317aae20315aa230080522400805242000094770a40f9680240f9080117cbbf0208eba9f3ff54e00313aaBL8;FF88ecaaf2288dcef2080deaf2200148fa280e8f52880cad724001487ae80200d008612a9120f3ff540", - "8000014f3031faa060000143300805204000014d37e60d3L8;FFe8430f91fff301f9e80302f9e90702f95746ff97a0420035fbef41f9e6f341f9e8430691e32b40b9fceb41f9e0e30091c1e20091e2830b91e403182ae5031baaBBBL4;FF68aa0194e0031baa2100805266aa0194003d00b4e12f40f9e203", - "1baaf90300aa6caa0194e9031baa0c00001408008092e83700f9e00314aac4810094fc0300aaL4;FFdf05013108d5889a290500b183ffff5489fd43d30b0500b48ced7d924d010c8bac01c0399f050131ecd79f1a7f0500f140040054ae05c039df0501318cd58c9aL8;FF6caa0094a17a40f9810000b4a0", - "7e40f92200805267aa0094a18640f9810000b4a08a40f92200805262aa0094a19240f9810000b4a09640f9220080525daa0094BL8;FF400705ad000543ad4233803dffa71139400703ad020144ad420304ad010141ad410301ad020142ad420302ad010140ad410300ad60000054e02b40f9dcdfff97L8;F", - "Fe9b73f39e8bb3f39e8a74429e9bf3f39e8c33f39e8a74329e9c73f39e8cb3f39e8a74229e9cf3f39e8d33f39e8a74129e8db3f39e80b40b9e9d73f39e8df3f39BBBBBBL4;FFf65745a9fd7b43a9ffc30191c0035fd6e0030091e82b00a9beee0094e00313aae9120194e80300aae00301aaa8ed07377aff", - "ff17ff0304d1fd7b0aa9fc6f0ba9L4;FFa04700d12cc4ff97e09f00b9a04700d129c4ff97e09b00b9a04700d126c4ff97e09700b9a04700d123c4ff97e09300b9a04700d120c4ff97e08f00b9a04700d1L8;FF69010d0b4a114e0b29c10011cb0d00122c2c4039094c003949c100117f2500710950003909", - "819f1a9f7d02710a819f1a8d0d00122e30403929010b0b4a114c0bBBL4;FFe00318aae10317aa22008052f60f00f96892019402000014f60f00f9e8830091a0820091a1820291cf6a0094e86342a9f71b40f91f0500f140030054e80740f9L4;ZDL8;FFffc30091c0035fd6ff0301d1fd7b02a9f44f03a9f", - "d830091e90301aaf30300aa610100f021941c91e8230091e00309aae2008052ab92009468e20191610100f0BBBL4;FF400700ada903173854ac009460fa0736faef48a9df0218ebf54340f9f94f40f9b74302d1090d0054620b40f90a0e80524800188b1f0114ebe933949a030109cbL4;FB99e649fb0000", - "c51089d1efc0ecfb514a39aa89e616d7f3568dbaa4e2a9382dc28cfc233fff9970e011ba83e2a27c2d97cce9733a9e4aa29aadaeace7eb39784aL8;FFe80f44f9e8a700f9e81344f9eb2311a9eb1744f9e81f44f9e8af13a9e82744f9eb2344f9e81700f9e82b44f9e82b00f9e82f44f9e82700f9e83344f", - "9e82f01a9BL8;FF2200805273110094e1d342f9abfeff17e0431691220080526e110094e1d342f92dfaff17e04316912200805269110094e1d342f98ffcff17e043169122008052L8;FF20008052e1031caa7752009400018052e10313aa7452009420008052e10319aa7152009420008052e10313aa6e52", - "009420008052210280526b520094fd7bbaa9BBBBL4;FFf44f57a9f65756a9f85f55a9fa6754a9fc6f53a9fd7b52a9ff030691c0035fd608040090081d36910300001408040090087d3691680a00f9080380527f6a0039L4;FB63206b6579000000859248000000000033000000000000002b040000220000", - "005365616c65642053656e6465722076323a204b6d697373696e67207665727369L8;FF63881591e0030091c2018052a4008052e80300f9c8e6ff97e10340f9bdffff17e80f41b2b7ffff17c80080d20800f0f208090091b3ffff17ff0302d1fd7b03a9BL8;FFaa635638a94316386901084aab735638a95", - "316384901084aaa835638a96316386901084aab935638a97316384901084aaaa35638a98316386901084aabb35638L8;FF5f0308eba82400546e010014e1d342f9e8cb42f9f6074091d68209911f0101eb807a0054e8cf42f92a040091c00202914908805209692138ead302f93d290094BBBL4;FF220080", - "52e00309aa6ab20194e03f40f9e10319aa28008052b8f334a9a88733a9a0e1ffb41e000014a9035cf8a1a338a9a98319f800e1ffb41f000014a06301d1L4;ZBL8;FF000480522100805267b20094c00300b4e00741ade8031faa0904805201048052740a00b9690201a9000400ad616a29f8680200f9f44f", - "4ca9f6574ba9f85f4aa9BL8;FF022b805273320194e0833291e8e7ff97f30315aa69018052618e41f8280041d23f0000f10841899a1f2d00f1020b0054a80240f9a80000b4a00640f901e97bd3L8;FF820b803d800700ad8190ff54e0230f91bd68fe9781fcff1721010054810000b4c01240f9220080526", - "2320094c11a40f981f4ffb40804805205000014c11240f9BBBBBL4;FF10000014780640f9e8030191e00318aa43020294680a40f909634039e07f0091e2030191a3c300d1e10315aa000540ade9630139a0873ead5a350094e8031f2aL4;FF74020094628f7fa92103158be00316aaec020094e0110037b7", - "0000b4e00316aae10317aa22008052620200945ac300f17bc3009161faff542e000014a0a300d1L8;FF810000b4800640f92200805269020194810e40f9a1fdffb4801240f92200805264020194e9ffff17f44f41a9fd7bc2a8c0035fd6a10400b4fd7bbea9f44f01a9BL8;FF090140f93f0500b1e001005", - "4ff8300d1fd7b01a9fd430091010300f021802991240300d084e02391e323009182008052e80700f9a1820194fd7b41a9ff830091L8;FF9f2203a9820241ade20301ad9c82009400e4006f9ffe003988264d298a2e4e298c364f29e00300ad0809c05a2909c05ae00301ad8e3e5029e003c03de107c03dBB", - "BL4;FFff830291c0035fd63500805228008092755201a9685200a9f44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9L4;FB696f6e20737461746520636f727275707420666f7220c00076656e646f722f6c69627369676e616c2f727573742f70726f746", - "f636f6c2f7372632f747269706cL8;FF4083c73c4283c53ce18302ade213803d29010014e083029181220091024280526cc20094f8d750a9800ac03d8182c03c881a40f9890e40f9f78340f9fb8f40f9BL8;FFe10318aae20316aa72010094780a40f9b7ffff17e00313aa220080526d010094610a40f9bf", - "ffff17e00313aae10316aae20314aa67010094760a40f9680240f9L8;FF0283843c0183803c0083813c29010094fc2740f99f1700f188fbff54ea430f91e8e3009129008052448948adec030b91408541adf81f40b9e95300b94231803dBBBBL4;FF57ffdfc8d70200b4ff0600b100030054f84305919900", - "8052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebe3c200541803008bf9feffb5L4;FB1ced4800000000006a00000000000000550100002a0000001ced4800000000006a000000000000005e0100002e0000001ced4800000000006a00000000000000L8;FF3bddff97b1feff17ff", - "632d39e8b745f9c082c03ca8031ef8680e00f908008092a0039d3c6082803c680200f91e000014e8c341f9e9cb43f9e0dfc03d680e00f9BL8;FFb9620194b9620194fd7b41a9f31340f9ffc30091c0035fd6fd7bbea9f44f01a9fd030091f30301aaf40300aa5d62019400058052010180525b6201940001", - "00b4L8;FF3f0108eb400300546a6928380805009120008052290040f9280800f93f0108eb20010054290440f90a050091206928382a0800f9f44f42a9fd7b41a9ffc30091BBBL4;FFf44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e90f41b206000014e91741b2e1030aaa03000014290480d20900f0f", - "2090500a909c48052090900f9f44f43a9L4;FF21008292e1ffeff2fd0300911f0001eba80d0054f35301a9f40300aa60fd9fd2f55b02a92000a0f29f0200ebf76303a9f92300f9480d0054930e00917f7e02f1L8;FFff8300d1fd7b01a9fd430091810100f0210c1691a40100d084802691e323009182008", - "052e80700f9a4a20094fd7b41a9ff830091c0035fd6810100f021fc1591BL8;FF00600091f40301aaf30308aa4a0140f9e10309aa40013fd6690a40f9b40a00f9290114eb230400546a0640f94801148b68a600a9f44f45a9f52340f9fd7b43a9BL4;FF0805088be00314aa01ed7cd302018052f44f42a9f", - "65741a9fd7bc3a865220014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f44f01a9fd030091f40300aaL3;ZBBBBBBBBBBL4;FF691f0294200e00b408ff43d31300198b150700d11f2700f1e00313aae11f805209f17dd3e20314aa280108cbb832889a5e1f0294880340f9e9031caa370a00b4L4;FF5", - "369283808050091280800f92cfbffb43f0108eb7361193240020054536928380afc71d308050091290040f9280800f9aaf6ffb43f0108eb9361193260030054L8;FF2100805294feff97a82640a9aa0a40f90b01138b280113ebe933889a480113ebab2600a9c3020054a80a00f993ce00a9f44f45a9f523", - "40f9fd7b43a9ff830191BBL4;FFe10e40f93f0400f10adaff54d2feff172000805201048052739f019420008052e10313aa709f019420008052e1031caa6d9f019420008052810480526a9f0194L4;FFb5820151a41e001264d21f38f40313aaf76343a9f96b44a9e2ffff1760d25f38001000121514150b", - "a41e0012f7ffff17dfbc0071a08242faa9f9ff54e7141a12L8;FFc0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa810100d021f41a91e803009102028052ad9f009468a20091810100d021101591a40100b0BBBL4;FF836400541803008b060000141f0400b1016400548adf01941f1", - "000318163005439feffb505000014e04305918100805285df0194c0620035e85341b9e84f00b9L4;FB45024900000000004e000000000000008f0200001400000045024900000000004e00000000000000570700000500000045024900000000004e00000000000000L8;FF0e584fa9e86b00f9092042a9e", - "c7b00f9053056a9ee9f00f9047050a9e8bb00f90b2043a9ec6700f90d3058a9e0b3823d1e5051a9ea2f1fa90f4052a9e89300f9BL8;FFfa6747a9fc6f46a9fd7b45a9ffc30291c0035fd620008052e1031caa725f019400018052e1031baa6f5f019420008052e10314aa6c5f019420008052e10318aaL8;", - "FF680640f9090180522a0400916a0a00f909692138e10313aa28fcff97801e40b980010034610a40f9680240f91f0101eb20050054680640f9090280522a040091BBBBL4;FFa2839a3c49692c386921003949010e8bab0e40f920419c3c018141adaa01409236011ab821419d3c01c1c43ca80a40f920419", - "e3ca043da3c21019f3ca143db3cL4;ZFL8;FFff030191c0035fd63f0500f141010054e80741b2e0030091e80300f984f4ff97e10300aa20008052fd7b43a9ff030191c0035fd64b05c0394c0900912e0900d1BL8;FF000040f991580014000040f9585b0014202440a928030090087d2891a2018052e1030", - "8aa230d40f960001fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091L8;FF1f0101eba06b0054e81340f9968248f8490780520969213828040091df0600b1e81700f9601c005480220291c7e7ff97080040b20811c0da081540d2080d088bBBBL4;FF810000b4e02b40f92200805269bf0194e8c30091", - "00c1009174a6ff97f8031faa940300f094de3691570380527dffff17200080520104805276bf0194fd7bbaa9L4;FB540000000000000073000000050000005a7b490000000000540000000000000079000000050000005a7b49000000000054000000000000007f00000005000000L8;FF6cbf0094612640", - "f9810000b4602a40f92200805267bf0094613240f9410400b4603640f919000014600640ad682e40f9e90a40f9e502c03d620ac03d6382c43cBL8;FFb3835df8fc031faa887e089bfb0314aaa8031ef81100001436008052a9835ef8aa835ff868021c8b7b0700d15aa301919ca30191092900a9096501a9", - "a9435fb8L8;FFc0035fd6f623009137008052180d8052680240f9080540f91f0115ebe91a0054e00313aa40ffff97e80300aae00301aac8fd073708fc60d3681a00b508084092BBBBBL4;FFc8300054680640f9e10316aae20315aa0001178b6f0f0294e802158b680a00f9951640f9550300b4610a40f96", - "80240f9961240f91f0101eb60310054680640f9L4;FF414f0054e00b409161620491e443139100c00e91a2000090428c3591e30280522a030094e8db51f91f0900b1e14d0054e0431391b0edff97b80000b4e0c740f9L8;FFc2048052e81302f8a80f8052ab831fb8e9470039ec2301b8e95b0039ed7301b", - "8e96f0039ea1f00b9e9830039eb9302b8e8b700399d0f0194fd7b44a9f32b40f9BL8;FF1f0109eb200c0054ffc302d1e923046dfd7b05a9fc6f06a9fa6707a9f85f08a9f65709a9f44f0aa9fd430191154c41a9148540f8080000f9a90e40f9490700b4L8;FF84803191a32300d162008052b3831ff8b58f", - "009468820091610100d021a41d91840100b084c01591a32300d162018052a8831ff8ac8f0094ac8f0094f44f43a9BBBL4;FFe00315aa4a0180520a692138e92700f9da5d0094e1e30091d2baff97a06e40b980010034e12740f9e81f40f91f0101eb00280054e82340f9290400910a018052L4;FB0e01ebd", - "65a6c0f0a035f86ecf00540b07e4f890cb8bec41f23695c3f3db95a978f187637506e0d61ed3ea28c370adbfd210807340000f77bd10f9652e9a3310aL8;FFe36703a908b140f91f0900f1a9230054a801009008110f9129038052e86705f9e80100d008012791e8a303f9e00100b000303c91e8ab03f9e8", - "0100d008e12a91BL8;FFeb2b5aa9a80318b8e8c34639e93200b8e9cf40f9e8631139a8f31938e8430691ea2b02f9e97200f8ebf200f8ea7201f86575ff97e84346391f05007161050054L8;FF7f0b00b1c1020054f6e3229155050036e0234ea9e16340f9e22340f9081540f900013fd6e03b02f9e803169", - "1e13f02f9290c40f9e103129120013fd6fbc342f9BBBBL4;FFf85f07a9f65708a9f44f09a9fd030191f80300aae0230091f50308aa5be9ff97f60740f9df0e00b141010054e00b40f967d7ff9728008052e90300f0297d2891L4;FB65737361676520666f7220706c61696e7465787420636f6e74656e743", - "b206974206973206e6f7420656e63727970746564000000000000000b9a480000000000L8;FF632c1691e00300f917000014c80080d2e0230039e00300910800f0f2ff270039e80300f982e4ff97e80300aae80300f9210200d021441591230200d063881591BL8;FFeca741a9a83b007968520178280080", - "92aa1b00b9a9031ff8ab831f386a1201b86c7201f869f201f86b9e0039680200f9fd7b44a9f32b40f9ff830191c0035fd6L8;FFe00318aa09692138e1431691ead302f92a0c0094fad342f9e8cb42f908011acb1f0308eba8350054e8cf42f9e10319aae20318aa00011a8b666f00944803188bBBBL4;FFa", - "07f0091e1c30091e82707a975af0194280080927f220039680200f9f44f4da9f95340f9f6574ca9f85f4ba9fd7b49a9ff830391c0035fd62800805229008092L4;FFe0feff54050000141f0016eb1800188ba9fdff540200001437008052e003152ad4110094e003172aff074091ff430091f44f44a9f657", - "43a9f85f42a9fc6741a9L8;FFe5ffff17f4031f2ae80740f9a80000b4e00b40f901f97fd34200805265af0094e003142af44f48a9f65747a9f85f46a9fa6745a9fc6f44a9fd7b43a9ff430291BL8;FF41c1c13ce91f46b9280340f958914078f46b41f9e03f813de143813de91305b9680000b4e00314aa0", - "0013fd6210740f9810000b4220b40f9e00314aa5d2f0194L8;FF36008052070000141f0020716200005456008052030000141f40407156379a9aa80357f8080115cbdf0208eb28040054a88357f81f0002710801158b03fdff54BBBBBBL4;FF613240f93f0400f18b000054603640f922008052671702946", - "13e40f93f0400f18b000054604240f92200805261170294614a40f93f0400f18b000054604e40f9L4;FFe0431391e10319aa7a0e0094a10000d021e03691e3431391e00313aae2008052e3f2ff97e08308918029fe97e16b02f9e343139122028052e06f02f9e00313aaL8;FFa32300d182008052e40314a", - "aa8831ff8b5170194b5170194f44f43a9fd7b42a9ff030191c0035fd6010440f98100f8b7000040f9220080525e170114ff8300d1BBL4;FFe200805284018052cb8b0094b4035df8a0e303d1df7fff97e00314aa6c7fff97e00746ade87340f9681a00f928008052608600ad685600a9ffc30a91f44f45a9", - "L4;ZBL8;FF10000014e80308abc2010054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6BBBL4;FFadb35fb86b2a0129765e0029ec0b00b9edb300b8ea4340f8600a00f9611a00b96ac201f8ea6340396d3202b8eb0b40", - "f9797202f878f202f86afe00396b7203f8L4;FB706c6564756373656e64696e675f63743143743153656e74456b526563656976656465706f63686175746873656e64726563766e65787470726576737071724eL8;FFe8eb00f9e85742f9e88f00f9e85b42f9e82f14a9e86342f9eb5f42f9ea2313a9e867", - "42f9ea7742f9e8af01a9e87b42f9eb9742f9e83b00f9e87f42f9e84300f9BL8;FF04000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f92200805264570194f8ffff1714a4ffb48806148be00313aa0201805201f17dd31afdff17L8;FFc4028052b8000014e05306f9e0833291210100902", - "120379102028052230100b063740591a4028052af000014c80080d2e0a33239e08332910800f0f2ffa73239BBBBL4;FF0102805283f70194000400b000c01a917ff70194ff8302d1fd7b06a9f85f07a9f65708a9f44f09a9fd83019109904039f30300aaf40308aaa90100343f0d0071L4;FB7365616c656", - "45f73656e64657273656e646572206365727469666963617465206e6f74207369676e6564206279207365727665724d4143207665726966696361L8;FF89000014e20313aa230c8052fdefff97e10300aa210900b5a80640f91f011aeba9040054e00313aa4cf6ff976008003728fc60d3480600b5200840", - "921f1800f1BL8;FF7977019420008052c106805276770194ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa0103009021e02291e8030091e00309aa42028052a9770194L8;FFe157c33de287833de17f833de287c33dbf0600b1e07b833de07fc33df4179f1ae383833de37bc33de183c33d208", - "3853ce08bc33de8cb02f92183863c2283873cBBBL4;FFfd7b45a9ffc30291c0035fd6e0a30091020280522300805224008052d4a9ff97e11f40f9e81740f9090101cb3f3d00f128edff54e0a300910202805223008052L4;ZDL8;FFe30314aa5a000094e80740f91f0500f1e0000054e80b40f9742200a9f", - "44f43a9fd7b42a9ff030191c0035fd6e00741a96db70094ff0301d1fd7b02a9f44f03a9BL8;FFe88304b973370194f66f41f9f36b41f9c80240f9680000b4e00313aa00013fd6c10640f9810000b4c20a40f9e00313aa603701949f0a00b121010054e01bc13dL8;FF6c370094fc432a9180c3c03c81c3c1", - "3ce8bf4ab9f69b4ab9fc4b45f9a00600ade89303b935070014a01ec13de8f347b9e0432a91a126c03da002803de88303b9BBBBBL4;FF8203883ca1833aada2037eada303d53c0243873ca2077dad0043883c0343803c0243853c0143863ca2077bad0243813ca2037cad0143823c0243833c0043843cL4;F", - "Ff40301aaf50300aa66070094000480520101805264070094400100b4155000a9810000d021803e91130800f91f600039f44f42a9f50b40f9fd7bc3a8c0035fd6L8;FFff8301d1fd7b03a9f52300f9f44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054080200341f0500714103005400", - "0180521d000014280180d2BL8;FFe00316aae10314aa22008052740a00f9f44f42a9f65741a9fd7bc3a865870114280080527f2200a97f0a00f9f44f42a9f65741a9fd7bc3a8c0035fd6ff0304d1L8;FFf31340f9ffc30091c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd03009", - "1ff0309d1092046398900003609008092090100f944000014BBBL4;FF887b00f948470491fa434a39820305ad6083c63c6283c73c080140b9e10306ad6083c83c6183c33ce87b00b9e20307ad6083c43ce9b307b8e10305ad608749adL4;FBc0002f636172676f2d72656769737472792f696e6465782e63", - "72617465732e696f2d313934396366386336623562353537662f70726f73742d302e31342e342fL8;FFf50300aae0031aaaf40301aae10309aa2200805267c70094e00315aae10314aa213300b59a010014aa0100b4f50300aae0031caaf40301aae1030aaa22008052BL8;FF8b3c0094e10300aa2000805", - "2fd7b43a9ff030191c0035fd6eb470094fd7b43a9ff030191c0035fd6c00200b000601e9166470194c00200b000c01e9163470194L8;FF091c40b949fbff35e9031faa0a0840f90afcffb5ea030aab23feff540001009000c0359166470094000100b000e0059163470094000100b000c01a9160470094BB", - "BBL4;FFa9231838533100f8ba0000b4e02b40f9e1031aaa2200805266e70194fb8216aaa85e58d37afe68d3e13340f9e81f00f9810000b4e02340f9220080525de70194L4;FB00000d000d0d160d617373657274696f6e206661696c65643a206b65792e69735f6e6f6e6528292f636172676f2d6769742f", - "737061727365706f73747175616eL8;FFa80600d1e86301f9e0030b9188dcff97e10300aa91000014a80a00d1e16701f94e000014e80b41b2e06701f94b000014a80600d14900001448008052e0230b39BL8;FFe0230091a32300d1e2008052a8831ff8b5670194f40200f094222d91e102009021482d91a", - "32300d122028052e40314aab3831ff8ac67019468620091e1020090L8;FFc0025df8220080526a670094c1025ef8810000b4c0825ef82200805265670094c10240f93f0400b1e0fdff54810000b4c00640f9220080525e670094c10e40f9BBBL4;FFe003082a9190ff97001200b5b70f40f9f50317aaa28e", - "40f8020e00b4e10240f9200080398000f8b728040091490400d1110000145f2800f1880000542800028bL4;FF42040051a02c46d39f00026be0000054232100351fbc00716d1e0054000080d21f000039007d20d46282403922ff2f361fbc0071640640f98c210054651240f9L8;FFe20316aaf50300aaf6", - "8300a971a70094f60f00f9940300b5c102148be8830091e00315aae10f00f9c71e0094e81340f91f0900f1e0040054e1830091e00313aaBL8;FF69270194a00100b4e00741ad09048052e8031faa60a600a9000400ade0030091680200f98f270194fd7b48a9f34b40f9ff830291c0035fd6200080520104", - "8052L8;FFe20317aaf80300aa72270094482740f91f0500b120030054592f40f95b6340b9991100b4542b40f95e270094e00319aa210080525c270094c01300b4e10314aaBBBBBBBL4;FFffc302d1fd7b05a9fc6f06a9fa6707a9f85f08a9f65709a9f44f0aa9fd430191170c40f9e9830091e22702a9e80", - "201abc2100054160440f9c9060091df2200f1L4;FFe10318aae20315aacf120094bae779a96083c23cbca37aa9b5835bf8e01f803d5f0700b1600800546083c33c6183c43ce80700f9e08702ade01fc03de013803dL8;FFf40308aa3f0500f101010054c92240a9a80208cb280108eb62060054600200f00", - "0c02091691b0194d306f8b7730200b45c1b0194e00313aa2100805238008052BBL4;FF0809c05aa0033eadb88301d1b6233529e8e31291a0039b3cf9b304b9b45734299c9b0194e8e312917f0700f1fb4303910001c03da003963c8004005400e4006fL4;ZFL8;FF940100b41321009104000014940600f1", - "73620091e000005461825ff881ffffb4600240f922008052629b0094f8ffff17f44f42a9f50b40f9fd7bc3a8c0035fd6BBBL4;FFe203853de3830fade31bc53de50b853de187803de68f0eadf7c0ff97e0afc93de1b3c93da88301d1a08302d1e1430591e0870aad89db0194a00779ada80302d1L4;FB346", - "4440000000000e45c4400000000000815490000000000b464440000000000d464440000000000a464440000000000b464440000000000bc64440000000000L8;FFf21314a9ecd705a9f5031eaaef8f00f9e61300f9f46300f9f03b00f9e54300f9e2d3ff97e7af42a9fe0315aaee2b44a9e54340f9f21354", - "a9f03b40f9f46340f9BL8;FF2283873c2083883c2383843c20010054e0f3c63de1074091e043169121800991f53309f9fb3709f9e09f843d19a90094963b01b4e8074091c10600d1e0431691L8;FFe00314aa21008052675b0094e01e01b4e10313aae20314aaf50300aa6d5b0094f6b340f9961600b4f3a", - "f40f95d5b0094e00316aa210080525b5b0094c01d01b4BBBBL4;FFc1010054610640f9200740f9e20318aa7efb01942001003528634039696240391f01096ba1000054e9227da9df0208eb400349faa0040054e1e7076fe9cf43a9L4;FB306231343131366236643835366166303938352f6c69627261727", - "92f636f72652f7372632f697465722f61646170746572732f656e756d65726174652e727300L8;FFe85b40f9e0870bade08742ade85319a9e08709ade08b43ade08b0aade18340ade18307ade08b41ade08b08ad002800b4e87b40f91f0500b160000054e0c30391BL8;FF08e1349102030090428c1091a3", - "8300d1b4233ea9847b0194e10740f9e10000b4e80b40f9f303002a22008052e00308aa607b0194e003132af44f47a9fd7b46a9L8;FF080117cbdf0208ebc9bcff54e0630091e10317aae20316aa23008052240080524391ff97f71740f9defdff17f60300aae0630091220080522300805224008052BBBL4", - ";FF080000142203188b200080520101805269bb0194f70300aaf40301aaf8031faa680f1b8b19f17dd35ebb0194e00319aa010180525cbb0194405400b4a86301d1L4;ZBL8;FF883e40f9e1431291e037813d8082c03c02398052e13b813d8182c13ce23f813d8282c23ce027813d8082c33cf40340f9e88", - "302f9e12b813de22f813de033813dBL8;FF63050054a00200d0006031916c3b0194f3031faa080c47f81f0500b1e1e7ff54e8031faa080113ab23040054a00200d000a02d91623b0194f3031faa088c45f8L8;FF6f0e02f9701202f939c14339cf12ff97f50300aafa0301aae8830f91e00317aae103192a", - "e20315aae3031aaa0179fe97f7f341f9770200b4eaf741f9c80080d2BBBBBL4;FFe00313aae10317aae20315aa2300805224008052d6fdff97770a40f956feff17f50300aae00313aa220080522300805224008052cefdff97610a40f9e00315aaL4;FFa0877dad680200f9a8835ff86082803c6182813c6", - "81600f9f44f4ea9f76340f9f6574da9fd7b4ba9ffc30391c0035fd6ff8302d1fd7b07a9f54300f9f44f09a9L8;FFebef7db29f020beb08030054010100b421e87bd3e00302aa02018052e30314aa7f0b0194a00100b507000014540100b45c0b0194e00314aa010180525a0b0194BL8;FF3f050071ac0900", - "54e90a0035f80f41b25a000014a9a35db8aae35d783f8300f1ac035f38e91b00b9a92f7ea9ea3b0079aa135df8ec430039eb0700f9210a0054L8;FF4001805241008052678b0094a05500b4680100d008110491c9009d52080140f909100079138301a9080000f9131700f95c8b009440018052410080525", - "a8b0094BBBL4;FFd8b6ff97e84b40b9c8010034a1035ef8a8035df81f0101eb60200054eb2f40b9a8835df8090780522a04009109692138e0030b2aa1c300d1aa031ef8c9b6ff97L4;FB616c69644864720000000000000000000800000000000000080000000000000060fd450000000000456b43743141", - "636b00000000000000000800000000000000L8;FF1f0500b1003200546083c43c6183c53ce0831d916283c63ce8bb02f9e1c31591e06f813d6083c73cf8831d91e173813d6183c23c681340f9e07b813d6083c33cBL8;FFc10e40f921fdffb4c01240f922008052684b0194e5ffff17680240f9c80000b40", - "9e179d3e00314aa02018052211108cb604b0194610e40f9e10000b4601240f9L8;FF2b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8bBBBBL4;FFfa6f08a9e08714ade08b48adf3bf4a39e08", - "b15ade18345ad771a40d20003138be20317aae18312ade08b46ade08b13ade08744ade08711ad081400385beb0194L4;FB08000000000000008078420000000000000000000000000008000000000000000800000000000000dc7842000000000000000000000000000800000000000000L8;FF770a40f96", - "80240f9080117cbbf0208ebe8070054680640f9e10316aae20315aa0001178b6beb0094e802158b680a00f9951640f9550300b4610a40f9680240f9BL8;FFa363009142018052a80f00f9b66b019468a20091e10200b021302a910403009084e02691a363009122028052a80f00f9ad6b0194e10200b0212", - "01891e40200f0L8;FFfa03062af803052af60304aaf90303aae21b00f9f50301aab70302d1f40305912591fe97e84346391f05007180020054881245b8e99741b9e00315aaeb2b5aa9BBBL4;FFf30308aa081840f9e10b02a9172100f183190054181440f9f40300aaf50302aaf60301aae0430191e10303", - "aae20304aae30305aae40306aae50318aae60317aaL4;FF88010d0a61118e9a0901096a480142b208118a9a0001e8b6480543b23f01007208118a9a8000f0b6480944b23f01007208118a9a090141b22a0000d0e00308aaL8;FFff7f12a9ff7f15a9ff7f18a9ff2302a9e87f04a9ff2305a9e87f07a9ff23", - "08a9e87f0aa9ff230ba9e87f0da9ff230ea9e87f10a9ff2311a9e87f13a9ff2314a9BL8;FF29008092f53b42f9690200f9880240f9680000b4e00315aa00013fd6810640f9810000b4820a40f9e00315aa612b0194e863019100610c9173dfff97e8a75139L8;FF74020014ba031ef8f7030291fb1b42f9f", - "63b00f97f8318f101320054e11742f9e003279102c480526a2b0094e007409181008052ff0316b900001891912a0094BBBBBBL4;FF0b3400a94c190012211c0caa6afdff361f0900f1e0fdff542a09c0392b0d00910d0d00d10b3400a94c19001221380caa4afcff361f0d00f1c0fcff542a0dc039L4;FFe", - "a6f42f9e97342f9f7eb44b99f0900b181440054e87b42f9f87f42f9a30000b0634c3991e0431391e10319aae2031caa04028052e9ab13a9e89b00f933f5ff97L8;FF936a29f89f0200f9f44f41a9fd7bc2a8c0035fd63f4000f1210100540b0040b90a0c40b9014040f8090080120a1100b9010500f9092d", - "0029c0035fd629008052BBL4;FF740a40f9680240f99f0208eb61000054e00313aafb92019408038052690640f94003c03d8826089ba9035af80001803d8a060091090900f9fc0b40f96a0a00f9L4;ZDL8;FF1f0500b1e0030054e00313aa70000094080040b20811c0da081540d2080d088b0825019108f", - "d46d30900088b340500919f0208eb69060054e00313aa080c48f8BBBL4;FF68ffff17e01740f957ffff17e01740f93effff17f50314aae7ffff17e01300f9a10300f021e01d91a30300f063302991e0830091020280528400805226000014L4;FB2222973c72d61ca8f0dc178b9b37da103467c2194145b1", - "01b272badecbcf9b0927aee05f00005aedbd5f63735b067e4f7d61091d8803527d77e95368b53f0b69L8;FFe9b345f9e80b00f9e8b745f9e84300f9e8bf45f9e8a706a9e9c345f9e8032b9108e10591e9af03a9e9c745f90001c03de8d345f9eb0f46f9eaa702a9eacb45f9BL8;FF4803188be8d302f9f89", - "749f9f90b40f9780300b4e1d342f9e8cb42f9f99349f91f0101ebe0350054e8cf42f9490580522a040091e00318aa09692138e1431691L8;FF2801009008c10191e1833291e3c3179142008052f35306f9f45b06f9e9ff02f9e90703f9e80b03f955e7ff97e1a345f9810000b4e0a745f9220080525d5300", - "94BBBBL4;FFe95740b9ebc34139eaa345b8e10f40f9e84b00b9e8bf4079e9b304b8fb2746a9ebe30039eb634139aa031bb8e91b00f9e9674139a8431b78eb270029ea4300b9L4;FB617365206b6579009a964800000000003300000000000000f7000000050000009a964800000000003300000000000000", - "39010000050000009a96480000000000L8;FF230200f0639c1591e0030091a201805284008052c8e7ff97e10340f9cbffff17e80f41b2c5ffff17c80080d20800f0f208090091c1ffff17ff0302d1fd7b03a9BL8;FFaa131538aa4355382901084aab231538ab535538a9331538a96355384a01084a6b010", - "84aaa431538aa7355382901084aab531538ab835538a9631538a9935538L8;FFe09349f9220080526a730094b30000b4e07b49f9e10313aa2200805265730094f49f49f99f0600b1e0a5ff54f5a749f9f3a349f9950100b47622009104000014BBBL4;FF220280522401805209000014a08312f8610300f0", - "21d42d91630300f063882391a06303d12202805264018052c2a70094b48352f8afffff17686e00a989010014L4;ZBL8;FF68b30094000480522100805266b30094a01000b4e0c3c03ce1c3c13c000400ad08048052602201a9680600f95affff17d82e40f9880ac05a6b0480920a9300d1BL8;FFe0833291", - "a102009021c00a9102028052a302009063400b9104028052f500001448008052e0a33239e0833291e8a73239c80080d20800f0f2e85306f97c280094L8;FF632c09919e000014e04b05f9e0432a91e10000b021e0029102028052e30000b063680991c40280529600001448008052e0632a39e8672a39c80", - "080d20800f0f2BBBBBL4;FF68030294000480522100805266030294800100b42804009008a10a910900f0d2000540ad08048052602201a9000400ad692200a9f30b40f9fd7bc2a8c0035fd6L4;FF2900805228008052fb031faaf7031faaff2706a9e82b00f9ff3b00f906000014e8830191e6030094f723", - "46a9fb3b40f9e82b00f9800000d000e00591e8e30691L8;FFf44f01a9fd030091140040f9f30300aa9f0600b1e0020054611a40f93f0400b140010054810000b4601e40f92200805260030194612640f9810000b4602a40f9BL8;FF010300f021802991240300b084202e91e3230091e00308aa82008052e", - "90700f9a6830194fd7b41a9ff830091c0035fd6010300f021702991e00308aa82008052L8;FFe40314aab3831ff8b783009468620091410100f0213c1691a32300d162008052e40314aaa8831ff8af830094af830094f44f43a9fd7b42a9ff030191c0035fd6BBBL4;FFc026089be80336aaf40302aaa802", - "088b0805088b02f17dd3176040a90160009166c30194b50600d1750a00f9f70000b4ff0600b180020054e00318aae10317aaL4;FB6420616e206572726f7220756e65787065637465646c790014694900000000004b000000000000007f0b00000e00000034684900000000006a00000000000000L8;FF9a", - "0000b4e1031aaa2200805269c30094e0874da9610000b42200805265c30094e12340f9e90315aae10600b5f4031faa64f9ff17e96740f928dd789267f7ff17BL8;FF2a0400916a0a00f909692138e10313aa1bfcff97818a40a960008052e30313aa6dfaff97888240391f05007101020054610a40f96802", - "40f91f0101ebc0030054L8;FFa0420094e9bf4639e84346390a088052a00302d1f80310912a15003308111d12e8430639e8031091eabf0639200740ade00600ad5b19ff97e00640ada00302d1BBBBL4;FFe2031f2ae0023fd61f0000f1cd000054390300ebe3e300541803008bf9feffb50f0000141f0400", - "b141e3005484e301941f100031c1e20054f9ffff1781e30194L4;FB73e848000000000038000000000000004a0100000a00000073e8480000000000380000000000000050010000090000006d697373696e672072656d6f74652069L8;FFe0dfc23de9d345f9ea030b91e1e3c23de2e7c23de0630c914081", - "873ce0dfc03de9b701f9e9c341f9e88f01f9e883059108c100914181883c4281893c4001863cBL8;FF82018052e90700f9be630194fd7b41a9ff830091c0035fd608050091e10200b021e83491c40200f084601291e323009142018052e80700f9a0630194fd7b41a9L8;FF6ce10c8b81fd0daa3f000beb0", - "30500544b018052e0031faa4a010b8b29010bcb0a2500a9fd7b43a9ff030191c0035fd6e80741b2e0030091e80300f97c58ff97BBBL4;FFb60000b4e0031caae10316aa2200805268a30194b90000b4e00b40f9e10319aa2200805263a30194b70000b4e00f40f9e10317aa220080525ea30194e00741adL", - "4;FF3f1400387f0001ebc1ffff54c10210912300805223400e39a7ffff17a1060011c302109161cc218b21e840f94200018ba5ffff17a10600123f04007160010054L8;FF090140f93f0d00b1a1000054810100f021fc159182008052a4a30014ff8300d1fd7b01a9fd430091810100f0210c1691a40100d", - "084002191e323009182008052BL8;FF680200f9f44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091f30308aae10200b4f40301aaf60300aa5c230194e00314aa210080525a230194BL4;FFf52340f9fd7b43a9ff830191c0035fd6f503012a74040051e00313aac5020094e80300aae00", - "301aa28fc073708fc60d3c80100b5080840921f1900f102020054L3;ZBBBBBBBBBL4;FF60ffff54e802c0dae91340f90811c0da200540a9530f488b68fe1b9ba802088b028101d1701800940800148a206b68fc00a8200e0a00669e8a0300b44901c0daL4;FFc1020054e81b40f9e9e34039e81300f9e9a3", - "0039da04003668ff70d369ff60d3610a40f9a0c300d1bb031db8a8631d38e81340f9a9431d78e9a34039bc731df8L8;FFb40a00f9f44f44a9f65743a9f85f42a9fd7b41a9ff430191c0035fd63406f8b7340400b45f1d0194e00314aa21008052370080525c1d0194600500b4e10316aaBBL4;FF2809c05a", - "6909c05ae8271529e88f40f909208052e08744ad282508aa080dc0daa0873dadff230ca9e28345ada2833ead939d019400e4006fff3f0339ea0341b9L4;FF060080d2050080d2040080d2000880d2d3ffff97fd7bc1a8a1f5ff17080000f02900805209811e39c0035fd6fd7bbfa9fd030091007840b9cdf", - "fff97007c4093L8;FF810000b4602240f922008052699d0094612a40f9810000b4602e40f922008052649d0094680240f929008092691e00f91f0500b160000054e00313aa5498ff97BBBL4;FF57ffdfc8770000b58edd0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f", - "2ae0023fd61f0000f1ad000054390300eba3220054L4;FB696c6c2062652072656d6f7665643a20757365206054696d657374616d703a3a746f5f756e69782829600000000000003b094900000000004d00000000000000L8;FFeac343f9e31744f9f81f44f9f92344f9e9231fa9e8cf43f9e9bf43f9ec27", - "44f9ef3344f9fc3744f9e8c300f9e8d343f9e73b44f9e03f44f9e64344f9fe4744f9BL8;FFe11f843de223843df6ef07f9e3ff863de3fb863dc25d0194625d01940004815221008052c25d0194e07c01b4f80300aa5c5d01940004805221008052bc5d0194L8;FF951640f9550300b4610a40f9680240f99", - "61240f91f0101eba00a0054680640f9490480522a040091e00315aa6a0a00f909692138e10313aa20faff97770a40f9BBBBL4;FFe9031faaba6640a90a328052080d010ef6d640a9f76240391800198a496b78fc208d282e0800669e1bc101f280030054e90700f96803c0da0811c0da080f488bL4;ZFL8;", - "FF8bf2ff97e80300aae81300f9410200d021381d91430200d063a41d91e083009122028052640180523c000014c80080d2e0a30039e08300910800f0f2ffa70039BL8;FFfd7b42a9ffc30091c0035fd6a0831ff82103009021203a912403009084a03991a32300d1e00308aae2018052a37d0194fd7b42a9", - "ffc30091c0035fd609300091L8;FF2a0400918022029149018052ea1700f909692138cde5ff97e1630091e07cff97806a40f9800100b4e11740f9e80f40f91f0101ebc03f0054e81340f909018052BBBL4;FFea0240f9490108eba32300540a0340f9990640f94801088b080300f9e90200f928ff60d3480", - "a00b5200b40921f1800f1420a0054217f0353610a00343f0c0071L4;FB65726f7369676e65642d7072652d6b6579736f6e652d74696d652d7072652d6b6579736f6e652d74696d652d6b796265722d7072652d6b6579736c6173742d72L8;FFff7f04a9ff7f07a9ff7f0aa9ff7f0da9ff7f10a9ff7f13a9f", - "f7f16a9e8c300f9ff2306392238009460864ead80a2019168fa40f9e103009102328052800602adBL8;FF0825019108fd46d308050091090840f9090300b40a0440f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191L8;FFad0200541f0d0071810800", - "54606641f9616a41f9250000141f1d007181070054606641f9616a41f9290c40f9e8830f91e1031baa20013fd6fcf341f99f0f00b1BBBBBL4;FFf85f02a9f65703a9f44f04a9fd030091f40300aa004841b9f30301aa80010034610a40f9680240f91f0101ebc0340054680640f9090180522a0400916a0a", - "00f9L4;FFef0317aaeddf5aa9eb0316aaea1f41b9fa9740f9ee0318aaf0cb40f9410200b4e0031aaa22008052ebcb00f9f9030caaeddf1aa9f7030eaafa030faaf60310aaL8;FF21183c91030d40f9c2028052fd7b45a9ff83019160001fd6080440f9200440a9a92300d12a0200904ac10d91a8831ff862", - "02009042302a91e9ab01a9e3630091BL8;FF090940f9c90100b42905098b150540f9530300907342239134f17dd3e0030091a1630091e20313aab50f00f9b5620091a48d0194946200f121ffff54e0030091L8;FFfd7b41a9f31340f9ffc30091c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a", - "9f44f05a9fd030091ff4311d1ff0300f9f80300aaf30308aa1b104379BBBL4;FFa85775a9b40356f81f0500f1c1010054a81e00121f0500716c090054aafe48d30c0180d2a91e4092eb0f41b20c00f0f21f01007168018c9a34018a9a29019f9aL4;FB5f0000000500000073697a652073686f756c642062", - "6520636f7272656374000080214900000000005800000000000000a00000002a0000008021490000000000L8;FF6183c03ce083813d6083c23ce15f813d6183c43ce8bb42f9e27f813d6283c33ce067813d6083c53c1f0500b1e26b813de16f813de073813de363813d006a0054BL8;FFe81f40b9e8c3063", - "94d0000142093c13ce9df40f9e8a30539e012803d2093c03ce9f204f8e112c03d8092823c8192833ce9c700f9e10740f9010600b599feff17L8;FF7b6200b9682603a9686604a9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd620008052e10317aa6c4d009420008052e1", - "0319aaBBBBL4;FF2c00001436008052e10740f9e1f7ffb5c1ffff17e8031faa95f9ffb5f80308ab63faff54000400d000400a9164ed019428008052ff0f00f9ffa300a9130800b5L4;FB5479706500000000000000000000000000000000000000000100000000000000a8d94200000000004261644b6579", - "4c656e677468496e76616c69644b65794167L8;FF490180522a040091e00316aa6a0a00f909692138e10313aae1ecff97780a40f9680240f9080118cbdf0208eb88070054680640f9e10317aae20316aa0001188bBL8;FFf44f54a9f65753a9f85f52a9fa6751a9fc6f50a9fd7b4fa9ff430591c0035fd6e", - "0030091e1031faae20314aa03018052040e8052ce5fff97f85f41a9f50340f9L8;FF2000805201048152776d00942000805201908052746d00942000805201048052716d009420008052012c81526e6d009420008052210580526b6d0094400100f0BBBL4;FFf60300aa73ad0194e9030091a86300d12091", - "00910c860094b7835ff89701f8b6f9031faae00319aae10317aa6ead019436008052e9030091a86300d120910091L4;FF080000142c7c12532a440c330b090039090d00398b6d1c320a0500390b010039a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaL8;FFe8ef40f91f", - "4300f16002803d680a00f941f8ff541c010014ffd71ca956008052ffef00f9e88307911323179b680240f988fdffb5efffff173f4100f1011c0054BL8;FF22b7803d6001803dea5301f9e95f01f96d53ff97e80356391f050071400c0054282340b8e90f4b79eacf42f9eb075639ec434b79e86b08b9e8c7", - "42f9e9db1079L8;FFff433291f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6f6031faafb031faa190080921a01805200e4006fe00740910104805200001891BBBBBBL4;FF2304005430000014c90080d248008052e0a300390900f0f2e8a70039e91300f978000014e80741b27500", - "00141f2900f1880000542900088b29f1df388902f837L4;FFab0000d06bc13191e03b813de01bc13de14b813de107c13da40000d084203091e047813de023c13de163813de18f5fade82b42f9a60000d0c6c03091e96b02f9L8;FFe30314aa1a0000143f11007181020054212000b40900c039281d0012c9", - "12f836090440391f81037129150012031200540a0840391fc103714a1500124a19092aBBL4;FFe8b70039e87f40394901094aebbb003908010c4ae9bf0039e87f003928008092e18340ad680200f96082813c6182803cda0100b4e00316aae1031aaa22008052L4;ZBL8;FF080113ab63050054800100f00", - "0403c916b950094f3031faa080c47f81f0500b1e1e7ff54e8031faa080113ab23040054800100f000602c9161950094f3031faaBBBL4;FF080540f9150100ebe200005476020014a2a302d1e003082a430c805276bbff97402700b5bc8355f8820740f95f0015eb89110054810340f9200080398000f8b7L", - "4;FB64656661756c74282900000000000000e8204900000000004900000000000000950000000d000000e82049000000000049000000000000009d00000030000000L8;FFe88344f9e8f700f9810000b4e0031baa2200805267d50094b90000b4e0031aaae10319aa2200805262d50094e87740f9f48f00f", - "900210091c4ceff97ebfb40f9BL8;FF1f0109eb481700545f000014fa031faaf9b749f9f8074091188309913f0700b18018005400230491311c0094080040b20811c0da081540d2080d088b08250191L8;FFe0df813dff5306f9e85b06f9ff5f06f9ea6306f9e87306f9e97706f971550094e1bb43f98100", - "00b4e0bf43f92200805260550094e0833291e1032d91022b8052BBBBL4;FFc0035fd6608640a9e8330091f45341f8f6d340f885cd0094e83340391f090071a0010054bf02086b61010054e9d340f8e85341f8df0209eb800248fae0179f1aL4;FB656d6f74655f6964656e746974795f7075626c69637365", - "6e6465725f636861696e72656365697665725f636861696e7370656e64696e675f7072655f6b657972L8;FFc1010054e1031faac1ffff17880080d2e10700f90800f0f2b9ffff17e80b41b2e00700f9b6ffff17880080d20800f0f2080140b2b2ffff17880080d20800f0f2BL8;FF686200910103009021c", - "029910403009084e01291e0030091a3630091a2008052a80f00f9b07501940103009021182891040300d084402391a363009162008052L8;FF09692138e1431691ead302f92b120094fcd342f9e8cb42f908011ccb5f0308ebe8d40054e8cf42f9e10316aae2031aaa00011c8b6775009488031a8bfc0740", - "91BBBL4;FFfcb300f9fa6717a9f85f18a9f65719a9f44f1aa9fd43059100e4006fe8430291090480523f0000f1f30300aaa08302d10101819a2201829af50304aaf40303aaL4;ZDL8;FFf60300f902000014f3031f2ab6577ea9e0c20191b8835df8e9b68dd28a0200cbe8020bcb69dbb6f24afd44d308fd", - "44d3a96ddbf2fa030baac9b6edf2417d099bBL8;FF0083823cf6bf05f9e0e3823dfa1f06f9fa3706f91f7f07a9f6d705f9f6e305f9faeb05f9ffe705f9a88317f88a1000b5e0c32791016300910228805265350194L8;FFe3c324910800f0f2e4432a91e10000d02120029102018052e99b0ab9e84b05f9c", - "3050094f6ef41f9e8e741f9f7432a91df0208eb61000054e0230f91b26bfe97BBBBBL4;FF820280524402805212000014a0031df82104009021dc2c9123040090632c2d91a0c300d182028052e400805209000014a0031df82104009021dc2c9123040090L4;FFf85f45a9fa6744a9fd7b42a9ff030291c0", - "035fd6e0230091e1031faa22008052230080522400805247e6ff97e02341a983ffff17e02300912200805223008052L8;FFe0ebff54f44f42a9f65741a9fd7bc3a85f000014010040f9810000b4000440f92200805263050114c0035fd6fd7bbda9f65701a9f44f02a9fd030091090c40f9BL8;FF2100199", - "10201805260001fd6210300d021602891e200805260001fd6202440a9280300d0087d2891a2018052e10308aa230d40f960001fd6ff0301d1fd7b03a9L8;FF8a85009440008052e10317aa76850094600100f0004035916a850094e00300374a0080521ffd02a90afd00a91fa901a90afd03a91fa904a90a", - "fd06a91fa907a9BBBL4;FFfd7bc6a8c0035fd6a00300d000e02591a20300d042402791e10a805296c50194a08300d1220080522300805224008052cfb7ff97a1035ff85dffff17a08300d1L4;FB626173655f6b6579726f6f745f6b657900000000000000000800000000000000080000000000000054504", - "700000000003d634900000000004d00000000000000L8;FFb80000b4e00319aae10318aa2200805268c50094f96740f93f0700b18006005448ff70d349ff60d3eac313915a9100b8fa4f40f9e8ff1339e87740f949d10078BL8;FF3f08007141fdff5481220191e20313aaacfcff97000100b48300001420", - "0e00b5e00313aa85fdff97e80301aa80000036880e00b5e1031faae1ffff17e1031faaL8;FFe003082ae20313aae303142ab5ffff97c0fdffb4d2ffff17280180d2e00700f90800f0f2081500d1deffff17e90b41b2e92300a9dcffff17280180d20800f0f2BBBBL4;FFfd7bc5a86de50114180e805228e1", - "79d3cae279d37304189bf50301aa141109cb421116cb6002148b64e50194e156189be00313aae20314aaf44f44a9f90b40f9L4;FB676e752f72656c656173652f6275696c642f737071722d383934636339653033313261616632312f6f75742f7369676e616c2e70726f746f2e70715f72617463L8;FFe8", - "a706a977e50094881e40b91f050071e1000054950640f93501f8b6f8031faae00318aae10315aa6fe50094280080527f7e00a9687e01a92c000014960240f9BL8;FF6c650194a8935cb8a9d35c78aa835c38acf35c38b7035d38bb135d38e83300b9ad235d38ab835e38e96b0079ba335db8eb230139a8a7", - "7da9e92300f9a9735d38L8;FF220080526b650094611a40f9810000b4601e40f92200805266650094612640f9810000b4602a40f92200805261650094613240f9c10000b4603640f922008052BBBL4;FFdf0208eb29f7ff54e0230091e10318aae20316aa2300805224008052d497ff97f80f40f9b1ffff1", - "7e0230091220080522300805224008052cd97ff97e10f40f9L4;FF620240f9400400f9620240f9020000f9200840f97f0200eb61110054600640f9200800f988000014a1cd89d2f55b02a9f5230191c138a8f2200000b000400691L8;FFe00309aa82028052b6a50094a101009021101591a40100f084a00", - "991e0030091a363009142008052b30f00f9aea5009468020291a101009021181591a40100f0BL8;FF884a4039694a4039b502000a1f01096be0179f1a81250194884e4039694e4039b502000a1f01096be0179f1a7b2501948852403969524039b502000a1f01096bL8;FF20030291e10306912200805208", - "0500b12935899ae82301f9e92701f96f250094c8de7992e0030691e20316aa4103088bf6ff073967250094e00751ade0430991BBBBBBBL4;FFc0035fd6280180d2e00700f90800f0f2081500d118000014e90b41b2e92300a916000014280180d20800f0f2081100d1110000143f00156bc1f0ff54dfffff", - "17L4;FFff0600b1e11fc03de28302ade113803da2033cada103973cc1f3ff54810000b4e00316aa2200805262190094e15740f9810000b4e00315aa220080525d190094L8;FFf96300a9a873003987190194a0000035d60600f1c1feff54e0031f2a0200001420008052f44f45a9f91340f9f65744a9f85f", - "43a9fd7b41a9ff830191c0035fd6BBL4;FFe89b40f909008092610bc03de03b803de043803de03bc03de88b00f9e87b00f9681200f90800f0d26182823c6006803d692200a930000014e082c03ce88241f8L4;ZFL8;FFaa831738aab357382901084aab931738abc35738a9a31738a9d357384a01084a6b0", - "1084aaab31738aae357382901084aabc31738abf35738a9d31738a9035838BBBL4;FFe10318aa220080526ad90194752e40f9682640f9bf0208eb20050054080d8052762a40f929008052a85a089bbf1600f1097d02a909018052186500a9b9060091L4;FB001b737071722076312e73656e645f656b2e72", - "6563762065706f636820c0223a204374315265636569766564202d3e20456b53656e7443743152656365697665L8;FFea2744f9e82f14a9e81b44f9e92313a9e82b44f9e91f44f9e8ab04a9e82f44f9ea3b44f9e82701a9e83744f9e93344f9e84300f9e83f44f9e8a706a9e84344f9BL8;FFfc074091f60", - "740b99c830191e8d302f9b9010034e1d342f9e8cb42f91f0101ebe0d40054e8cf42f9090280522a040091e00319aa09692138e1431691ead302f9L8;FF210100b021c0349102018052e02b833de12f833de233833d09fdff97f3f742f9e8ef42f97f0208eb61000054e0631791b58ffe97e8f342f9090680", - "52e02fc13dBBBBL4;FFe80340f91f0d00b1a0fcff5475da40a9e00740adc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aaL4;FB632f686d61635f696d706c2e7273002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e", - "2d6c696e75782d676e752f72656c656173652f62L8;FFe28341ada28339ad56f3ff97a0877aad880080d20800f0f2a90358f8080900918082843ca003d73c8182853c8082863ca18378ad880200f9898207f88182803cBL8;FF5d000014a88359b848000037b98319f8e1920191a22301d19b63ff9760f2f", - "fb45e000014a88356f81f0500b161000054bfe736a9bf8317f8e1c20091a22301d1L8;FF74790094f8031f2ab701001403e4006f0083c03c0183c13c0283c23cf6d344f9e0074091fbcf44f9f9c744f900802f91f5cb44f901048052e01b843de11f843dBBBL4;FFe81340f9fc1b40f9e44340f9e1f3ff54", - "e02302916eefff97e52f40f9e44340f9e30314aae81340f998ffff17fa4b40f9e10314aaa06301d183060091e2031aaaL4;ZBL8;FF82820191e0031f2ae3031faadfb90094c30100b06300339100108052e1031aaae2031aaa81b90094c00100f000203591c30100b063a02391c40100f084e03591BL8;FF", - "4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500542a0140b24a11c0da4a1540d24a0d0a8b4a250191L8;FF6b130036ea2349b9eb4b5279e1830f91a96207f8e94b45f9eae303b96a3642f9a8e207f8e833557940210391ebcb0779a96208f8e8f", - "f07794813ff9780110036BBBBBL4;FF83000014e80f40f9690640f92a0108eb032b0054690240f9e00315aae30316aae403142a2801088be90b40f9682a00a9680040f9080540f9150109ebe2010054L4;FFfd7b43a9ff830191c0035fd6e92b41a9e00bc03d680200f9e80f40b9600a803d74220129692a", - "01a9f44f45a9f65744a9fd7b43a9ff830191c0035fd6f50b40f9L8;FF400200f000803f91e92b00a96902009029410991e1030091e92b01a994090194fd7b42a9ffc30091c0035fd6e20301aae10300aa800280524efdff17000040bdBL8;FF7f0700b160090054e0c30291e83f00b9b271ff97e81340f9e", - "0230291fbf308a9e84f00f97cd4ff97e83340f93f0700b1fa0301aaf903999ae01b00f91c159f9aL8;FF420080526b890094f41340f9f32f40f99f4200f1619eff5450000014ff0f00f915018052f63340f9f3031faaf52700f9e0430a91e10314aae20316aa1bdaff97BBBL4;FF3f1100f13481889ae303", - "14aa26000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a96bc90194ff0301d1L4;FB0800000000000000d0f8450000000000de194900000000005700000000000000b203000033000000de194900000000005700000000000000c50300004e00000", - "0L8;FFe0030eaae10315aa22008052f40309aaf5030b2af6030c2a66c90094ec03162aeb03152ae90314aaf9031f2a7b3e00b41a008092e00309aaf5031baae94b00f9BL8;FF22008052f30b40f9fd7bc2a869490114f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f303", - "00aa810000b4600640f922008052L8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab02080054691e40f9090100b4290140b22911c0da291540d2290d098bBBBBL4;FFe093c03ce193c13c6012803c6112813c7f020039fd7b43a9f32340f9ff430191c0035f", - "d6091c40f93f0500b160030054093040f93f8100f1e10300540a2c40f9L4;FB847d400000000000e41f4000000000001000000000000000080000000000000040804000000000004f9d48000000000075000000000000006400000026000000L8;FFe20314aaf48300a972e90094f40f00f92f0000142800", - "8052ff0f00f9ffa300a9a0e300d1e1230091982a0094a083dc3ca183dd3c28008052a8831ff8e08700adBL8;FFfd7bc2a8c0035fd6000180520103805280690194fd7bbda9f50b00f9f44f02a9fd030091f30302aaf40301aaf50300aa5c69019400048052010180525a690194L8;FFe80b02f9e8430691a", - "9090034e9031091aaffffd04ae136911a0380d2400100b0009c189108210091e1c30e91e9db01f91a00f0f2eadf01f98d690094e81f40b9BBBL4;FF22008052340600b4e30314aa84a90194000600b520008052e10314aa72a90194a083dd3ca183de3c0900809208d300a9a1035bf8f40740f90083813c0", - "183823cL4;FFf51300f92f0b0094e40300aa200000d0020080d200a840f9130000f9637a62f842040091c3ffffb5350000d0a1420691620e028be00302aa220400f902000014L8;FF08050091e89b00f99da90094ff3f0439f80314aaf70319aa02ff46d314e37a9218174092e20000b4e89b40f96002019", - "1e10317aa0801028be89b00f990a90094BL8;FF08088052e8bf0a39e08b16ad600640ade08711ade2834bade28312ad350700b49912158bfac308911b1080520a0000144003188be10315aae20316aa65290194L8;FFe10b46a9e007409100001891c650fe97f4034bf9fa074bf9e0c31d91fb0b4bf9f90f", - "4bf9c1e20091fc134bf9f8174bf902248052f51b4bf9662900949f0600b1BBBBBBL4;FF21030054e1230091e20313aa8ffaff97002900b5f7031faac7ffff1721630091e20313aa89faff97202700b5f7031faac1ffff1721c30091e20313aa83faff97L4;FF37fd60d35cfc78d3f903092af003182aef03", - "1a2aee03082aea0319aa130400140a0180d2e9031faa0a00f0f205000014080180d2e9031faa0800f0f20a017fb2L8;FF6ae240b8a05300d1e1230091e80700f9683241b8e92b0229690e40f9e81b00b9682240b9e9c301f8e82700b93effff97a8c35e381f050071c10a0054a0d3de3cBBL4;FF6042843c", - "e01ac33d6142853ce11ec33d6042803c6142813cb50200b4e00314aae10315aa220080526291019410000014e90f41b207000014e91741b205000014L4;ZDL8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a", - "8b4a25019129194a8bBBBL4;FF43040054680b40f9090e8052f60d80928803088b0969099b150500d133c101d1050000149f1300f173c201d1b50600d1a9020054bf0214eb9c0700d1e833949aL4;FB00002c5d04c6d549f47937ce5561074fe06ce3416cbdbebdd9af5166a96b0879a741e7598a03cada0", - "ad6260c58b75a2e324b9da1092fa9fc8163907995cfa28cL8;FFe0032b91ebfb00f9f74700f966caff97f70314aa68000014e8031d91e1032b910232805200410091f4032b9169d10094e87740f981220091023180520aa540a9BL8;FFe002009000c029916d510194e0020090008022916a510194e00200", - "900020329167510194e002009000c0219164510194e00200900060319161510194e0020090L8;FFa90319f860420054e96301912083c33c2183c43c29610d912283c53cea670a91200500ad2083c63c414fc03de8bf01f90800f0d2220101ada90359f841f18f3cBBBBL4;FF6cf10194e88340a9eb0314aa", - "0a000014f9031faaf6031faafa031faaeb031faafb031faaf5031faa080180523c00805237008052f40318aa818e47f89ba204a9L4;FB20636861696e2072617463686574206b6579696e76616c6964206c6f63616c206964656e74697479206b6579696e76616c69642072656d6f7465206964656e74L8;", - "FF82060054217c0353a10600343f040071c00100543f08007161fdff54888242f81f0500b1810000549fe202a99ffe03a998fe04a981a20091e20313aae2f2ff97BL8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b290500910a1c40f95f0500b1600500540b2440f90a3040f90b0100b46c0140b2", - "8c11c0da8c1540d28c0d0c8bL8;FFf9ab49f9f8074091188309913f0700b1a018005400c30391c8290094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebBBBL4;FF89bcff97400741ada88352f84203c43c1f0500b1a0873dada2039d3c60070054408742ad420", - "3c73ca90359f8e84b00f9e2838e3ce0838c3ce1838d3ca0877dadL4;ZBL8;FFe20316aaf70300aa72b1009465b10094000880522100805263b10094201600b409488052a10241ada20e40adf90300aae9c301f9e92b40f948008052010001adBL8;FFe83341f9f93f00b91f0500b14157ff5415fbff17280", - "08052e80300f9f9d740f9f58b42b9f78f42b9fa1b00f9b958ffb513fbff17e8c31291fa8302910081c03cL8;FF3f0500b1a0010054281100b4e04340f9e8432a911859fe97e84b45f91f0500b180080054e002c03de85345f9001f813de8fb03f94d000014a80f00b4687a40f9BBBBBL4;FF68320039f44f", - "48a9f65747a9f85f46a9fa6745a9fd7b44a9ff430291c0035fd620040090004012917901029420008052e10316aa6c01029420008052e10317aaL4;FFe1feffb4200340f92200805269010094f3ffff17e82a40f9c80000b40805088be00315aa0201805201ed7cd3610100945f1700f1000e0054f55248a", - "9340200b4L8;FFe10315aae20314aa0001178b71010194e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00013fd6e0031faaf44f4da9f6574ca9f85f4ba9BL8;FF21203a91230300d063e00791a9800091260300d0c6600791a9831ff8290300b02b613a91a92300d14a0080522703", - "00d0e7fc0791e00308aae2018052e4008052L8;FF982680b9f8f8ff35e9031faa972a80b9b7f9ff35ea031faa9a1a40b95f07007160faff542801088b49011f8be16300910001098bda80ff97990100b528000014BBBL4;FFa93b0079e91340f9ec230079ea0700f96b020036aa1b40b9ab3b4079e063009", - "1e9e301f8e90740f9e86302f8e8234079ea1b00b9eb3b0079e9e302f8e86f0079L4;FB7300287365745f756e61636b6e6f776c65646765645f7072655f6b65795f6d65737361676520666f723a20c0102077697468207072654b657949643a20c0001fL8;FF480080d2e007813d0800f0f2e10b813d16017", - "eb2a08739ad4083c63c4183c53ce313813de20f813df52342f9a203953c4283c43ce10302ad4083c33ce00b01adBL8;FF770a40f9680240f9080117cbbf0208eba8090054680640f9e10316aae20315aa0001178b6b410194e802158b680a00f9952240f9550300b4610a40f9680240f9L8;FF745a45a9f6", - "0000b4f50314aae00315aa28000094d60600f1b5a2019181ffff54682640f9c80000b4090d8052e00314aa02018052017d099b5e410094617e40f9BBBBL4;FF1f0400b141fdff54e0430591810080528de10194c0a30035e85341b9e88f00b957ffdfc8d70200b4ff0600b100030054f843059199008052e", - "00318aae10319aaL4;FB38fc4800000000003ffc48000000000000000000000000000000000000000000000000000000000045fc4800000000004efc4800000000000000000000000000L8;FFe003142ae103142a08e140391f05007160fcff54473a009462024079e103002a9e390094e203012ae103002", - "a9b390094e203012ae103002a98390094e203012aBL8;FFe00308aae10309aaa4610114fd7bbea9f44f01a9fd030091f303012af40300aa6061019400048052010180525e610194200100b4140000f9e10200f021800491L8;FF080540f91f0119ebe9030054e00313aa99fdff97c009003728fc60d3a806", - "00b5200840921f1800f182070054217c0353010800343f040071000100543f080071BBBL4;FFe083803cb6831ff808010aaa0ad49052284108aa2a00a072097dd59b28a10a9be90f40f9e9a301a9a8df3ea97ea10194a0010037eba740a9e8031faaea0f40f9L4;FF20010054e103144b9f120071dfc8213", - "8cd010054dfb01f3804148052d4c01fb801d05f38211000128100010b01d01f38f35341a9f55b42a9f76343a9f92340f9L8;FFb9a10094b9a10094fd7b41a9f31340f9ffc30091c0035fd6000040f9ad0d0014ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aaa10100d021083d91BL8;FFff83", - "0191c0035fd6750a00f920008052f44f45a9f71b40f9f65744a9fd7b42a9ff830191c0035fd62805003628f97fd35f0108eb4881889ae10202ab620b0054BL4;FF48008052e04300390900f0f2e8470039e90700f9e02300918516ff97f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8", - "b6f40300aaf6031faaL3;ZB" + "BBBBBBBBBL8;FB8811000000000000e017000000000000000001000000000007000000040000000000000000000000000000000000000000000000000000000000000000000000L8;FFa9050054a8ffffb4e9af40a90a0e8052c9260a9bca0600911b0500d15f010bebeb338b9a56010bcb210140f9966e0", + "1a93f0400b100feff5439e941a937e143a9BL8;FF61ce40f9810000b460d240f9220080523925019461da40f9810000b460de40f9220080523425019461e640f9810000b460ea40f9220080522f25019460220091L8;FF44250094e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00", + "013fd6e0031faaf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6BBL8;FF609a40f9220080523b650194749600f9f44f41a9fd7bc2a8c0035fd6ffc302d1fd7b06a9fa6707a9f85f08a9f65709a9f44f0aa9fd830191097c40f9f30308aaL8;FF21602491a3fdfff063242591e0230091a20080", + "5224018052a7000014c80080d20800f0f2080500d1a0c300d1a8031df86a6bff97e10300aa7a000014e00700f9BL8;FF9f2600f91f0900f1a10f0054e00313aaf5f1ff9740010036210c00b5e0031faad3ffff17e003082ae20313aa430c805297ebff97c0f9ffb4c3ffff17a80640f9L8;FD00000000000", + "000000000000000000000e80147000000000078034700000000007003470000000000000047000000000010004700000000001800470000000000BBBL8;FB9452450000000000506f6c796e6f6d69616c4572726f724368756e6b496e6465784465636f64696e674572726f724368756e6b4461746144656", + "36f64696e6745L8;FF22a5ff977f0600b160100054e11740f9e80f40f91f0101eb008c0054e81340f92a040091e00316aa49028052ea1700f9096921385ef2ff97e16300917b92ff97BL8;FFfa6702a9f85f03a9f65704a9f44f05a9fd030091ff0312d1ff0300f9f40301aae8830c9176fc4039000440ad", + "e0430091f50302aaf30303aac17e0753e08700adL8;FFd6000037e00f40f9e10340f9330100941f0000715a139f1ae1d340a9810000b4e00f40f9220080523305009474deffb4e02b40f9e10314aa220080522e050094BBL8;FFe4000094080040b20811c0da081540d2080d088b08250191081848ab4215", + "0054170117ab62150054180700f194a2019161feff54e80216abc2020054080115abL8;FFe00314aa017d099b02018052f44f42a9f65741a9fd7bc3a837450014f44f42a9f65741a9fd7bc3a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9L16;FFe0bf46a9f00314aaf16740f9f5ef40f9e", + "c031baaea0b40f9e72340f9fe031aaafa0317aaf70316aa89008052e97300f9f6ef49a908008092f4030baafa8700f9BBBBL8;FB4a00000000000000270500000f0000003d0f4000000000004a0000000000000028050000320000003d0f4000000000004a00000000000000d904000013000000L8;FF690", + "1084aabf35638a9d316384901084aaa035738a9e316386901084aab135738a9f316384901084aaa235738a90317386901084aab335738a91317384901084aBL8;FF2c7c12532a440c330b090039090d00398b6d1c320a0500390b010039a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035", + "fd6fd7bbda9f65701a9L8;FFe203162a92050094e8ab4bf91f0900b1416c0054e007409161620491e2030e9100401d913c050094e8ab4bf91f0900b1416b0054d4060031f53f00b922860054BBL8;FFb4035bf8d9feff17a04301d1e10314aa220080522300805224008052a6e0ff97b6035cf8dafeff17a", + "04301d12200805223008052240080529fe0ff97a1035cf8L8;FFa10302d16908c0f2a87f39a9a8273ca9965100944083cf3ca88355f8bb0353f8b5df73a920b7803de83304f9e8f304f94003803dffa71139e89740f91f0500b1L16;FF0800809220718e3c6082803c680200f9f7dcff9763000014e32740", + "b9f6432d917f04007148080054e81b40b9c8180037e8018052e8632d393e000014a003dd3cBBBL8;FF24008052ac000094770a40f9680240f9080117cbbf0208eba9efff54e00313aae10317aae20315aa2300805224008052a1000094770a40f975ffff17e00313aaL8;FF081540d2080d088b082501910", + "9fd46d30800098b080500911f0109eb2821005413000014f9031faafbb749f9e8074091088109917f0700b1c029005400210491BL8;FFf65701a9f44f02a9fd030091011440f9f30300aa3f0800b1800100543f0400b140010054810000b4601a40f92200805231f50094612240f9810000b4602640f9L8;", + "FF630600f9600040f9600200f9130400f9600640f9130000f96272009140fc5f882000002a40fc0388a3ffff35000080d2010080d2f35341a9fd7bc2a8c0035fd6BBL8;FF79310194f90b00f9980300b43d350194e00318aa210080523900805235350194c0feffb4f90b40f95f0700b1f8cb02f9e0cf02f", + "9ffd302f920130054e8031faaL8;FFe85303f9080000d008913491e9a304f96900009029a11f91e8a704f9e8831a91a04700d1e9af04f969fdff9029a11391e8ab04f928008052e1432a91e96705f9L16;FFfa431091fb830291f40300aa090900d11f0500f1e80080522881889a49feff9029190b918a00", + "00102b7968784a090b8b40011fd6895643a91600f0d28082c03cBBBBBL8;FB6b6579707269766174655f6b657950656e64696e674b796265725072654b65794964656e746974794b6579506169725374727563747572656d697373696e6720L8;FF880240f9280d00b40805088be00315aa0201805201f17", + "dd3ff030791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8309d0014f6a340a9e1830091BL8;FF610a40f9a5ffff17f50300aae00313aa22008052f1000094610a40f9e00315aaadffff17e00313aa22008052eb000094610a40f9bcffff17e00313aae10317aaL8;FF3d1d0094a1035ef881", + "0000b4e00318aa22008052381d0094e0030191e103172ab5100094e12b40f9e92340f9280101cb1f2500f149150054e91300f9e22740f9BBL8;FF3503028b0001138b425d0194683340f960030191e10301912200805208050091683300f973590194fa031caaf90315aaffff013942ff46d353e37a925a1", + "74092L8;FFa17e035321240034280400511f390071c806005489000010ea6a683829090a8b20011fd6a03500b5a02302d13df5ff97e0140036e1fcffb4b001001401830191L16;FFe00313aae10316aae20315aa2300805224008052e9000094760a40f9680240f9080116cbbf0208eb29f7ff54e00313aa", + "e10316aae20315aa2300805224008052BBBL8;FF880000542800028b08f1df388803f837e0030091972e0094e80340b9a8070037e80b40f9ca0640f9490108eba30d0054ca0240f9e00740f94801088bc82600a9L8;FFe4031caa2505805206048052dbe0ff97e2bf4ef9e3c34ef9e007409100800191e10", + "316aa12ccff97e01bc43de11fc43de223c43de09b843de19f843de2a3843dBL8;FF0180009100008092aef900941f0400f1a10100549ffedfc8610240f9810000b4600640f92200805233fd0094e00313aa0105805202018052f44f41a9fd7bc2a8L8;FF1481899ae30314aa0b000094e80740f91f0500f1", + "e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6200020d4fd7bbea9f44f01a9fd030091BBL8;FFaaf356382901084aabd31638ab035738a9e31638a91357384a01084a6b01084aaaf31638aa2357382901084aab031738ab335738a9131738a94357384a01084aL8;FF68021e396862", + "1c91220101adc00644adc21ec03d60d6813d61da813dc0864fad62d2813d000500adc08659ad68621b91000500adc022c13dc11ec13d68e21b91L16;FFe1c30391e97b00f9e08709ad600b43ade8e30339680f40f9e08b0aad610341ade18308ad6093c03ce0938f3ce88700f9730b0094e1b343f9fcb743", + "f9fabb43f9BBBBL8;FBa28cea1bdc4d293c83e9000084d2fa23d4da034e301e5a38f3f75bff44b2dc763c0f4580f2af1be7031fe25776b0a750139071529f46342f216e259727c600a6L8;FFf40317aae80f00f9990300b548008052ff5301f9f3031faae84f01f9e8430a910081c03ce8030a910001803d", + "e80f40f9082e00b574010014328d009400038052BL8;FFe1feffb021b80c91e237c13de0031791e3833291e4032d91e2008052e0d3823de1d7823de2db823d78f1ff97f3f742f9e8ef42f97f0208eb61000054e0631791L8;FFf85f04a9f65705a9f44f06a9fdc30091350840f9b500f8b6f8031faae0031", + "8aae10315aa70090094f40301aaf30300aa750000b5360080520c000014970640f9BBL8;FF00983691e9ab05a9a9a300d1a8831df8080000d008713e91e9a306a9a8c301d1e16301918f490194740a40f9680240f99f0208eb61000054e00313aa73480194L8;FF080c48f81f0500b18002005428fdff970", + "80040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab23010054L16;FFe8af15a9e84342f9eb3f42f9e8b700f9e84742f9eaa318a9e84b42f9ea4f42f9e8eb00f9e85342f9e8a700f9e85742f9eb2311a9e85b42f9eb7342f9e8a300f9BBBL8;FF29f", + "d68d3e92300f911f1ff97a8035bb8a9435b78ea0f40f9765a0179687a00b9a8035af869fa0079a9835a78a8831cf8a88357b8a9031d78a9b357b8681a00b9L8;FFe1c30e91e9db01f9eadf01f995690094c8fdffb008492891e9008052e8271ba9fa0741b2e8df40f92083c13ce8c700f9e8a759a9808283", + "3ce8a716a978caff34BL8;FFf70b00f9f74b00f9f76700f9a5020094e08745adf50300aaf4eb00f9e0870cade28346ade2830dade18343ade1830aade28344ade2830bade18341ade18308adL8;FFbf3b03d5e503002a05feff37a100060b80fc5f88bf00006b41ffff5481fc008880ffff35e1ffff17e30", + "300aa000040b94000f837c0035fd60400b01261fc5f88BBL8;FFe1031aaae20318aaf4100094fad342f9fc0740919c8301910ffeff17f60300aae043169122008052ec100094e1d342f9e00316aa32feff17e043169122008052L8;FF20013fd6fa034bf95f0f00b141080054c8008052f6eb42f9f5e742f", + "9e8e3163949008092670000141a0180d2e8031faa38ff48d31a00f0f206000014090180d2L16;FFa0e300d1bc0314f8e97702f9f47b02f9e87f02f9dc130094ba537da939ad0094000480522100805235ad0094602b00b4fb0300aa20feff9000800f9101048052BBBBBBL8;FB726f746f636f6c20616464", + "7265737320697320696e76616c69643a20c0012ec00014626164204b454d206b6579206c656e677468203cc0153e20666f72206b65L8;FF03f5ff54e96f43a9b3035df8730a00d13f0114eb7b0700d1c1f1ff54040000141f0000792800805208783478e9a341a9ea0b40f9282900a9280900f9f44f4ca9B", + "L8;FF093100f929070091e083c03c0001803de083c13c0005803de083c23c0009803d892200f90c000014e003082ae20313aa630c8052f1f5ff9780f6ffb4a9ffff17L8;FF0d000014e017c03d1aff48d3f703182ae00b803d20000014f7031f2a39008092b80000b4e00315aae10318aa22008052312100", + "943f0b00b1c1020054e81340f9BBL8;FFa11700b4960080d2e20301aa1b210091f72310911600f0f2fce30f9138008052190380521a018052810340f9340080399400f8b728040091490400d111000014L8;FFe00313aae10317aae20315aa2b000094770a40f99fffff17e00313aa220080522600009461", + "0a40f9a8ffff17e00313aae10317aae20315aa20000094770a40f9L16;FF1f0500b1810000549f5e03a99f7e04a9977e05a981c20091e20313aa8df0ff97200a00b5e1031faae2ffff173f0c0071e00200543f100071e100005481620091BBBL8;FB1d1c4000000000005400000000000000650000000500", + "00001d1c400000000000540000000000000073000000050000001d1c4000000000005400000000000000L8;FF1f0101eb003b0054e81340f9090180522a040091ea1700f909692138e1630091828eff97e00314aa080c4df81f0500b160000054e163009168a1ff97954e40f9BL8;FFe80f0036a80202abc", + "2130054ca0215abe21300546b0240f93f0009ebe80f00f96b0115cbeaaf00a9880f00546901158b480115eb690200f923100054680a00f9L8;FFff074091ff830091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6f60315aa08008092680200f996feffb4e00314aae10316aa2200", + "8052BBL8;FF29194a8b29050091200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff5440ffffb000c03691883d0194fd7bbca9f85f01a9f65702a9f44f03a9fd030091L8;FF02278052200700ade83302b941410094786a41f9756641f9080340f9680000b4e00315aa00013fd6010740f9810000b4", + "020b40f9e00315aa2f410094ff0a00b1L16;FFe8030eaafc0748a9ee0311aae69f43a9f1031baae4a74ba9ed0740f9e56f40f9f03340f9e0bb00f9e0030baaeb0314aafadb4aa9f7ef49a9680a00f9e8fb40f9BBBBL8;FB3985fcd632f50000bd7ecd09206045036f2e47ac3eab0077c1c564f4dabfeb077", + "177da0d1ca8c7d4c1c454fcea8348cc0ebc72b3c1273fa2016896033985ce23L8;FF00e00391918d0094e0fdfff000a00d918e8d0094ff4301d1fd7b04a9fd03019108004039e9fdfff0299d0b918a0000102b6968384a090b8b40011fd608feffd0BL8;FF29ed0a91e81303f9e8feff9008f91491e90b03", + "f9290080d2e82303f9c8048052a934c0f2ea2703f90a078052e07f823dfffb02f9e80303f9ff0703f9ea0f03f9L8;FFc0035fd6e0efc83de1f3c83de0074091e2f7c83d00401d91e0d7853de1db853de2df853dc6eaff97e043139139ebff97380100b4e0c740f9e10318aa04000014BBL8;FFe8e301b928", + "0000b008d12e9160ffff9000842491e85302f9e8830791e1231291e85702f9e8830091ea4b02f9f84f02f9e95b02f98b4d0194e19b41f9210100b4L8;FF29194a8b29050091280108abc2010054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000", + "054fd7bc1a8L16;FF289040f9e83b00f9289440f9e84300f9289840f9e82300f9289c40f9e83700f928a040f9e81f00f928a440f9eaa302a92a2055a9ea7b00f9e86300f92a2056a9BBBL8;FFa3ffff9063003a91e0230091020280520401805258010014e003022ae20303aae303042af44f4ea9f95b40f", + "9f6574da9f85f4ca9fd7b4aa9ffc30391b7f3ff17L8;FFf95b40f93f0700b1a00c0054faa74ba90a630191061f57290083c13c0003433908e301910183c23cea2301a9e8a3039181820091a50303d102048052e3031caaBL8;FFe0031faafd7b43a9ff030191c0035fd6ff8301d1fd7b03a9f65704a9f44f", + "05a9fdc30091081c00121f090071a1010054e00302aaf30302aaf40301aaeafdff97L8;FF60fd9fd2f55b02a92000a0f29f0200ebf76303a9f92300f9480d0054930e00917f7e02f173fe44d3c90300546106009124c59c5264eda072e3fcff90207c0253BBL8;FF0811c0da081540d2080d088b08250191", + "08fd46d30900088b390500913f0308eb48190054da000014f6074091d6820991c022029119180094080040b20811c0daL8;FF81ffffb4a00240f9220080523a310094f8ffff17e89740f928f3ffb40805088be00313aa0201805201f17dd3fcfeff17ea074091e90756b9f7e742f94a011891L16;FF958e4", + "0a9e02302a9e0030091e82301a9e20315aa16000094e00740ade20bc03d810240f9620a803d600600ad010100b4e00315aa22008052f44f45a9f52340f9BBBBBL8;FB435453495a450000b51d4000000000005600000000000000830000002700000073686f756c642062652061626c6520746f20656e636", + "f64652068656164657220L8;FF285440a9f4cf00a9ff0f00f9bf0214eb08070054f4031faae9031faaf50000b46002148be10308aae20315aa39990094e10318aae90314aae80740f93501158bBL8;FF4afd46d329010a8b290500913f010aebe9030054200108ab22010054fd7bc1a8c0035fd6e8031faa", + "091c40f93f0500b121faff54e00308ab23ffff5400ffff90L8;FFe17342f9e807409108411d91e0031baa19180094f7ab4bf9f96701b9ff0600b180270054e9af4bf9e2b34bf92c008092f7bb00f947010014da7e0853fb0308aaBBL8;FFf44f5ca9fc575ba9fd7b5aa9ff430791c0035fd6ffc307d1fd7b", + "19a9fc6f1aa9fa671ba9f85f1ca9f6571da9f44f1ea9fd4306919f8000f1f30300aac1050054L8;FFe86b06f968fdffb008091e91e96306f9290080d2e87b06f9c80480528943c0f2ea7f06f90a078052ff5306f9e85b06f9ff5f06f9ea6706f9e87306f9e97706f9L16;FF83feffb063401991e0030b91c", + "2018052a40080523c000014e80f41b29dffff17e06301f981feffb02100119163feffd063a03991e0030b914202805204018052BBBL8;FFe10308aa220080522300805224008052f4030baaa8040094e10340a9eb0314aa2ca040a9290040f90afc78d39369283808050091280800f96af3ffb4d4ffff17L", + "8;FFe8cb42f91f0101ebe0c50054e8cf42f9090280522a04009109692138e1431691ead302f9d0110094e85349f9280500b409e179d3f84f49f959038052361108cbBL8;FFe0031faa090540f90a0140f9290100cb4a01008be0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6fd7bbe", + "a9f30b00f9fd030091080040f9L8;FF4d010c8bac01c0399f050131ecd79f1a7f0500f140040054ae05c039df0501318cd58c9a7f0900f1a0030054ae09c039df0501318cd58c9a7f0d00f100030054BBL8;FF08590154793600b4f7e74df9e10315aae20319aae002188b3e390194ae010014e04fc23de8", + "a344f909008092690200f96082803c680e00f9ff0600f1eb730054L8;FF43010014e8e344f91f0500b14101005408018052ffe304f9f8e704f9bf7e0aa9bffe0ba9f8f304f9e8ff04f9ff0305f9f90705f9a1420291a22302d16bf5ff97L16;FFe28717ada182cf3ca282ce3ce82b0ba9e8a342f9ea9f42f", + "9e18315ada182ca3ca082cb3ce8270ea9e8ab42f9e9af42f9e10313ada182cd3ca082cc3ce86300f9BBBBL8;FB42024000000000006a00000000000000020100002e00000042024000000000006a00000000000000440100001c00000042024000000000006a00000000000000L8;FFfa0300aaf30700f9f", + "71300f941890094e0031aaae10319aae2031baae30315aae4031faa14e8ff97280700d1f7031baa1cf940929f0315ebc80f005428fb4092BL8;FFe0e31b9181e200910227805220af803de82304f93f090194f63f42f9f43b42f9c80240f9680000b4e00314aa00013fd6c10640f9810000b4c20a40f9e00", + "314aaL8;FF0bc8fe97730100b43e090094e00313aa2100805237090094400300b4e10317aae20313aaf60300aa3a0900940200001436008052e80b40f9e083c13ce103c03dBBL8;FF3c490194800700b4e10316aae20317aaf40300aa3f490194582f40f9d80100b5c3ffff1737008052591740f9b7831ff", + "859fcffb535008052572340f9b6831ef8L8;FF08251891e82b1ea90a078052c8048052ff2719a949fdffd029ed0a91e92b1ba9290080d2e1430691a949c0f2e87f1aa9e8271da98d450094e80342f9e9235039L16;FF29a857a9eb6f00f9e85f00f92ba059a9eaa30aa92aa05ba9ebe300f9e83300f928ec", + "5ca9e9ab1da929d45da9e8f700f928fc40f921000891e9a30fa935c90094BBBL8;FFaa7140f8e90b00f9a97d4039a8031878a87141f8ea1300f9aa0302d1ec2f00b9533100f8a88316f8a9031738ba0000b4e1031aaa220080522f690194f95f40b9L8;FF210400b4fd7bbea9f44f01a9fd030091f30301a", + "a14e0009104000014730600f194c20191c002005481825cf8810000b480025df8220080522f69009481025ef8BL8;FFc90080d2e8230039480080520900f0f2e8270039e90300f9e8ffff17e00300f9a1feffb0213c1091a3feffb063641091e00300914201805264018052eaffff17L8;ZDBBL8;FFe8634", + "6395f0b00b161100054f7430f9108150036c08641a9a90302d1e8430f91a20302d12401019103048052050280526e250194e8eb41f91f0500b1e01b0054L8;FFa80302d1a08301d1e1030e91e0071cadaa250094e08753ada203d83cb4f35938a2039e3ca0073eadc0f2c03cc0f2863c3429009400088052", + "210080522d290094L16;FF800600ade00b41ad6042803c6242813c760200b9f44f4aa9f65749a9fd7b48a9ffc30291c0035fd602feffd04260399125feffb0a5c02e91e1030091e0031f2aBBBBBBBL8;FB207765726520746f6f2073686f7274203cc0013e002d6d697373696e672073656e646572206b65", + "7920737461746520666f7220646973747269627574696f6e20L8;FF20eaffb52000805201088052769f0094e0031f2ae1080094a1835bf8fa03002a81f7ffb5beffff17e91340f9e093c23cfa430e91e193c33cea2740f9e8a34039BL8;FF951f019400fffff000402891921f019400fffff000a028918c1", + "f019400fffff000a022918c1f019400fffff000002391861f019400fffff000602391831f0194L8;FFfd83029128008052f30300aaf8430091ff2301a9e87f03a9ff2304a9e8030091e10b00a9ff6300b9ff7f02a9ff7f05a9a8831cf80800001401630091a2e300d1BBL8;FFba035df8480317cb1f0308e", + "b681a0054180100b4a8835df8e1031caae20318aa0001178b3b630194f702188bb7031ef85f0317eba01b0054a8835df8ea060091L8;FF490280526a0a00f90969213828130094e10313aad4fbff97803240b980010034610a40f9680240f91f0101eb00030054680640f9090180522a0400916a0a00f9BL", + "8;FFc80080d2e0230039e00300910800f0f2ff270039e80300f970e9ff97e80300aa81feffb021a03d91a3feff9063280f91e003009102028052a4008052e80300f9L8;ZDBBBL8;FBecea4500000000000000000000000000000000000000000001000000000000002ceb450000000000ef1040000000000", + "04e00000000000000b904000017000000L8;FFea1700f909692138deebff97e16300918690ff97805e40f9800100b4e11740f9e80f40f91f0101eb20850054e81340f9090180522a040091ea1700f909692138BL8;FF0081803c0b2d00b90c3903a90a01013909000014e9031faa050000142a0080524921", + "09aa0200001449008052098500a92900805209010039f44f4ba9f74b40f9L8;ZFBBL8;FF09000090292138912f000014202040a941ffffd021503091030d40f9a2038052fd7b43a9ff03019160001fd6202040a941ffffd021a03291030d40f9e2038052L8;FF41180054e00313aae7feff97e0080036811", + "400b5e0031faa9effff17680240f9080540f9190101eb031e0054680240f9080540f91f0119eb690d0054e00313aaL16;FFeacf40f91f0900f1e90300548801009008411f9129038052e86705f968feff9008e11e91e8a303f940feffb000702d91e8ab03f968feff9008a12191e1032b91BBBBL8;FBc803", + "40000000000058000000000000007e000000090000005369676e616c5f5051434b415f56315f4d4c4b454d3736383a636970686572746578745369676e61L8;FF290d098b2925019129fd46d30801098b130500917f0209ebe90b0054088c5cf81f0500b1e009005411fcff97080040b20811c0da081540d", + "2080d088b08250191BL8;FF6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108abL8;FFe18b40f9e8bb03b9e8bf4979eadb03b9ea7342f909b303b8e97742f9ea7700f9ea675339e8bb0779e8c3", + "5339ea2f1c29e91301f9e8a30839810000b4e09340f9BBL8;FF6082813c691e00796a0a00f97f020039fd7b45a9f33340f9ffc30191c0035fd61f09007181010054ea0f40f9090180d20900f0f248dd7892290140b20a000014L8;FFc94e0094a8624039f5c342f9f7c742f9e8631639880280d22007c03d", + "0800f0f21b2100d14003803de863019100610c912fe7ff97c8fdff17f83f42f92083c13cL16;FFea1300f9112951a9607700543f05007141f50054890080520a008092790a00f969220039e00308aa6a0200f9ff074091ffc30091f44f45a9f65744a9f85f43a9BBBL8;FF490d80522a040091e00315aa6a", + "0a00f909692138e10313aa24f9ff97770a40f9680240f9080117cbbf0208eb081f0054680640f9e10316aae20315aa0001178bL8;FFe0074091e10318aae20319aa00002f912a120094f8eb4df934f5ff1748236639e2074091c0fdfff000a01891c3fdfff063c03491c4fdfff08440199142800991BL8;F", + "F410180390101f8b7e0031faa4a050091290500d10a2500a9fd7b43a9ff030191c0035fd63f2900f1880000544b01098b6bf1df388b0cf8374b05c0396c1d0012L8;FF00a0119163080011212c46d306786178c66c1c53607c061b014000110300001463040011e103022ac200010b400400510000014a1f", + "fc3f714dffff5480804039BBL8;FF40010054810000b4e08749f92200805239330194e18f49f9810000b4e09349f92200805234330194b30000b4e07b49f9e10313aa220080522f330194e8074091L8;FFe92305a9e9f30091a00700d1e92b06a9090000d029712991f42707a9e9230091a1a301d1e92f08", + "a9a94302d1e92309a9a8e301d1090000d029912991e82b0aa9L16;FF3db30094f7830291e10314aae00202917f140094e0e202918142089171160094e00fc13de20bc13de107c13df66b00f9e28305ada00b7bade12b803da103d83cBBBBBL8;FB6d0000000e000000ef104000000000004e000000000000", + "00b904000017000000ef104000000000004e000000000000005707000005000000ef10400000000000L8;FFe803082ae9830039a1faff5409088052e1830091220108cba9c303d12001088b3c9b0094a80357f880030191a1c303d12200805208050091a80317f86d970094BL8;FFf44f41a9fd7bc2a8c00", + "35fd6d30100b43c1b0194e00313aa21008052351b0194400100b528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8L8;FFe0031caae10315aaf20900141f0900f1811700542083c03c2183c13cbf0600b1e00719ad601c0054e077c03de30b409125fdffd0a5e03a9127fdffd0e7803b", + "91BBL8;FFfcb309f8a98357f8e85f0239e87d1053ea3307f80a358c52e86b0239c81f0012897209f8098440a9e88f0239a8035838e22f00f9a20356b8e81f033948019fdaL8;FFe05306f9e0833291a1fdffb02138279142028052a3fdffb06380279144018052fd60ff97e15346f906000014e80f41b2e0", + "833291e85306f96861ff97e10300aaL16;FF1500f0f248008092e9430591f9030b913a0080921b0180523c008052f7cb00f9e8f300f9a90311f8a0c303d1eee7ff97f40301aac046003788fe60d3a82e00b5BBBL8;FFe90344a9080009eb63100054ff0208eb68080054340117ab42100054f42300f90907", + "40f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889aL8;FFe14fc33dea8306f9e03f833de18b833de143c33da7ffff17e8f342f9e06fc13de0074091e173c13df64349f900800991e85b09f9e83b49f9e277c13de0a3843dBL8;FFe9031faae003bfadea0300912b6869386cc100516", + "b011b328d1d00126e9d01516b5d0151bf250071cd1d0012ee979f1a6b818c1abfe903714b69293829050091L8;FF8b118e9a7f0271f20835530a4a010baa6e3a4ed311fc4bd34b0158b24c0558b24d0958b24b018b9a4c018c9a7f0271f24a018d9a1f0052f26d6218538a018a9aBBL8;FF090100b42a014", + "0b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab42010054fd7bc1a8c0035fd6e8031faa090840f969faffb5091440f9L8;FF3a03158b670f0094600745adb5a201916233c03de82342f9e10318aa408701ad610f44ad601fc03d4217803d483300f9400700ad430b803db7fdffb5", + "fc4f40f9L16;FF40bb0094e0031aaa2100805239bb0094c0bb00b4e17740f9e2031caae05f00f93cbb00941a000014590080529f04001439008052d60000b4e00318aae10316aaBBBBL8;FBb80000001f0000007a134000000000005700000000000000cb000000130000007a13400000000000570000000", + "0000000700200003d0000007a13400000000000L8;FF610000b4220080523b8b0094088b41b908050011088b01b9ff431191f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6ff1b00f9e01b40f9BL8;FF9f0b00b1e8a304b9e027813d410a0054e8830291e99f40f9e027c13d16d107", + "91e8a344b9f59302b93f0500b1c002803de8a702b9002c0054e8c3179140630291L8;FF78070094fd7bbea9f44f01a9fd030091f303012af40300aa3a0b00940002805201018052330b0094200100b4140000f901fdfff021800b91130800b91f300039BBL8;FFf44f44a9fc0b40f9f65743a9f85f42a9fd", + "7bc5a8c0035fd6e023009101048052e20317aa2300805224008052a2d6ff97f45b41a9d1feff17e0230091e10316aaL8;FF00a0239191470094fd7bbfa9fd030091082440f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b140040054L16;FFfbd745f", + "9f8df45f9f9e345f9e86b00f9e86b45f9ece745f9eff345f9fcf745f9f4fb45f9e8fb00f9e86f45f9e0ff45f9e70346f9fe0746f9ee0f46f9e8e700f9BBBL8;FFf70300aaf60308aabb0302d169001c6be37f00b9e51b08a9fc9700b942090054f8d640a9e2031aaae00318aae10315aad50200941f0400f", + "1810200543f0015ebL8;FF3d6b0094685640f9a80000b4605a40f901f57ed342008052376b0094686240f9a80000b4606640f901f57ed342008052316b0094686e40f9a80000b4607240f9BL8;FFdcfcff17e80b41b2e07f00f9d9fcff17880080d20800f0f208050091d5fcff17880080d20800f0f20811", + "0091d1fcff17a1feffd021601891a3feffd0637c1891L8;FF290080520e4100390d450039090100f9c0035fd6ff0301d1fd7b02a9f31b00f9fd8300912c0840b94a0840b9f30300aa290040f94b0040f99f010a6bed379f1aBBL8;FFf52300f9f44f05a9fdc3009143010034081c0012f30302aa1f090071", + "4c010054080200341f05007141030054000180521d000014280180d20800f0f2081d00d1L8;FF35008052572340f9b6831ef8b8431fb877fdffb534008052582f40f9f8f6ffb4532b40f9372b0094e00318aa21008052302b0094200500b4e10313aae20318aaL16;FFeb0300b54a0500d14a000a8b4b214", + "0b84c0d40794091c03c4121c13c4a214039ab431eb8ac831e78e00b803de193823c0820003928008052ab435eb808240039BBBBBBL8;FB7970743b2073656e6465722072617463686574207075626c6963206b657920c011206d65737361676520636f756e74657220c0002f636172676f2d6769742f73L8", + ";FF130540f93f9f0094e00315aa41008052389f0094800e00b4a8fe41d3fa031faa9c630091d40600913b008052bf031ff8a8033ea9080000142807c05a08683a78BL8;FF780a40f9680240f9080118cbdf0208eb08070054680640f9e10317aae20316aa0001188b3b1f01940803168b680a00f9540300b", + "4610a40f9680240f9b51240f9L8;FF20fdfff000403791941b0094ff0304d1fd7b0aa9fc6f0ba9fa670ca9f85f0da9f6570ea9f44f0fa9fd83029109304039a90b0037010840b9f30300aa150040f9BBL8;FF61070054e0830b913fe3ff97e0830b91e1e300914a160094fc7341f99f0b00b1e0fdff54f57", + "741f9fb7b41f9e04306912163009102288052365f0194fa2740f9L8;FFe387c13de10316aae08601ade07fc13de183c13de82b43f9e216803de00600ade83200f9e30a803d75fdffb5e81b41f91f0500b1e00d0054e94b42b9e84f42b9L16;FF24008052ed020094610a40f9b9ffff17e00313aae10316aa", + "e20314aa2300805224008052e5020094760a40f9680240f9080116cb9f0208eb69f7ff54e00313aaBBBL8;ZBL8;FFeea2ff97e11740f92ffeff17e0630091e10317aae20315aa2300805224008052e6a2ff97f71740f9e80f40f9080117cbbf0208eb29c6ff54e0630091e10317aaBL8;FFf85f42a9fd7bc", + "5a8c0035fd6000180520105805273fb0094c0fefff000c006918afb0094f8031faae00318aae10313aa6dfb0094c0fefff000e0039186fb0094L8;FF8514403825140038f9ffff1741ffff1703fc43d306f07d9204000014826865f8226825f8a5200091bf0006eb81ffff54030c03cb2200058b8400058b", + "02000014BBL8;FFf90301aa4d0000141f090071e1040054aa8354f8691f009148dd7892250000149f0700b1e0070054363f019480088052210080522f3f0194201a00b449ffffb0L8;FFe00315aae1031aaa220080523a3f0094683642f909c143393f0d0071c126005461fdfff021802091e0830f910203", + "805246140094e8fb41f9eaf741f9f5031faaL16;FF3dbf00945b008052da0400147caf45a9773740f974a740a96d3f40f96ae341a99f0700b1eb7700f97adb42a975bb43a979a344a96b334e29604600547f010971BBBBL8;FBb7a55040900e5001414aaed1575a926d18dad4b0b55325ea4915979752549", + "6eabc8150faacf151ba31ff00bba28c25efba520000cd83e6ac8cbb47a8daba1ae7L8;FF767e0853e87740f99f0208eb40fdff54ebffff17f80700f93a8f00944000805241008052338f0094e07300f9c08300b4348f009440008052410080522d8f0094BL8;FFe8630cb9b9ffff17e1970cb9f2feff17e1", + "930cb9f0feff1708018052ffeb05f9f6ef05f91f7f0aa91fff0ba9f6fb05f9e80706f9ff0b06f9fa0f06f901430291L8;FFff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091040180520506805229f87fd33f1100f13481889ae30314aa0c000094e80740f9BBL8;FF1f0000", + "7101fa805200019f5ac0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff830ad1f30308aae8630491f40301aaf50300aaL8;FF1f0500b1802300546c030094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb482200545b010014e", + "80300aa098d40f8L16;FFf19f42f9f0a742f9e8cf00f9e81342f9e5ab42f9e4af42f9e6b342f9edb742f9e8b300f9e81742f9f6bb42f9f2bf42f9e0c742f9e2cf42f9eaa317a9e81b42f9BBBL8;FFa3ffffb0635c0191e0230091420280524401805200750094e90740f9e0feff17e00700f9a1ffffb021b", + "40291a3ffffb063540391e0230091a201805224018052L8;FFebd343b9e96306394921c993e8cb00f9ecab4779e31b40f9eb3b00b9a00302d1e2e300918b1245f8e8fb0039e10319aae8b340f9e97304f8e9a34539ec7b0079BL8;FFe81300f907000014c90080d248008052e0a300390900f0f2e8a70039", + "e91300f9e08300916df5ff97e10300aae00301aaf44f49a9f93340f9f65748a9f85f47a9L8;FFe503022a60010054e503014b3f1000717fc82538ed0500547fb01f3861c01fb801d05f382110001221800151251c0012421c409205d01f38e30380124418049bBBL8;FFcc0f0094f87f49f9780300b4e1d3", + "42f9e8cb42f9f97b49f91f0101eb403d0054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9920c0094L8;FF00001891ff0316b9e83b00b91f2a0094e80356b9e00740918100805200001891ff0316b9e83700b9182a0094e80356b9e00740918100805200001891ff0316b9L16;FF3", + "caf0094c00f00b4e00744adfb0300aa000402ade00b45ad000803ade10342ad010000ade20343ad020001adb5000034e00316aae1031caa220080522eaf0094BBBBBL8;FB540000000000000073000000050000001d1c400000000000540000000000000079000000050000001d1c4000000000005400000", + "0000000007f00000005000000L8;FF29010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6BL8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109ebe80f0054960000141dfe", + "ff97080040b20811c0da081540d2080d088b0825019109fd46d3L8;FF6062049121401d9142c00e9126eeff97e16b42f9810000b4e00316aa2200805235170094a04700d1cec4ff97e0ab01b9a04700d1cbc4ff97e09b01b9a04700d1BBL8;FF280080522900809268220039690200f949000014e8020090", + "081140f91f0500f189030054e8830091290000b029413a91e82703a9e8a30091eac30091e82704a9L8;FFe00313aa00013fd6810640f9810000b4820a40f9e00313aa375700949f0b00b121020054e0a34fa942030291e17740f9081140f900013fd6e06b01f9e8c31791L16;FFff830cd1290840f9f3030", + "8aaa90700b4280500f1e00600542b0440f91f2900f14c018052ea031faaf6031faa0c318c9a79014039680500912e0080526d696e38BBBL8;FFa8031df8757d0094f70300aae10740f9810000b4e00b40f92200805236770194e11340f9810000b4e01740f92200805231770194e11f40f9810000b4e0234", + "0f9L8;FFe1d342f9e8cb42f91f0101eb008e0054e8cf42f949058052f4074091948209910969213828040091f67749f9e8d302f9df0600b1a0330054802202914c2c0094BL8;FFc0035fd6e00313aaf44f42a9f50b40f9fd7bc3a8f6feff17fd7bbda9f65701a9f44f02a9fd03009114d440a9f30300aa95", + "0100b49622009104000014b50600f1L8;FF2100028b840200b4220040b95f18007180feff545f080071a1feff54e5feffb4230840f9a30003cbf4ffff175f000a6b41feff54221440f9e80040b95f0008ebBBL8;FFe9bf0ef949ffff9029410491e8bb0ef968008052ea074091e94f09f94ac13591e10740", + "91e93709f929ffffb0294d2791e84b09f928ffffb0088d3491e94309f9L8;FFe84b05f9753dff97e80300aae84b05f9e0432a9161fdffb021c01891a201805263fdffb0631c1991240280522b000014e04b05f9e0432a9161fdffb021c01891L16;FFe90743f9e28fc13de3a3c13de187c13de48315ade08", + "bc13debaf00b9eb6740f9ea5300f9f67f42f9f4c342f9f8030baaedc742f9f9cb42f9fecf42f9eed742f9BBBBL8;FB795f70726976617465636861696e5f6b65796d6573736167655f6b6579730000ef104000000000004e000000000000006402000013000000696e6465786b6579L8;FF4a1540d24a0d0", + "a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd600feff9000200f918783009400feff9000e0039184830094e0fdffb0BL8;FFe87704f9e85b44f9a70302d1c082863c404fc03de203182a2283c53cc182843c4143cf3c20f18f3ce963019120cbc03de8b304f928210a91e9e3229", + "1c082893cL8;FFffdb01f9ffe301f9ffef01f9fff701f9eaff01f9ff0302f9ff0b02f9ff1702f9ff1f02f9e82302f9e92702f9cceaff97e8df40f91f0500b1c01b0054e0e30191BBL8;FFbc035cf8fb031caa628f40f8620d00b4810340f9380080399800f8b728040091490400d1110000145f2800f1880", + "000542800028b08f1df38680bf837a0e300d1L8;FFfa0301aae106f8b6fb031faae0031baae1031aaa744300943a470094e00280522100805233470094c01c00b488fdffb008a110911a0380d20001c03d08f140f8L16;FFf6ab42f9e5af42f9e8af00f9e83b42f9eeb342f9e4b742f9edbb42f9e1bf42f9", + "e87300f9e84342f9f1c342f9efcb42f9e32f00f9f5d342f9e9a310a9e84742f9BBBL8;FFe90f41b2410000147f020079fd7b47a9f34340f9ff430291c0035fd6a8135db8a9435db8ab035f38aaa35db8ac835d78e83300b9a8e35d78e93303b8a9835ef8L8;FF280800f96202005400fc4ed3af000014e00", + "700f9e00301aaf30301aae10309aa22008052f4030b2a240600946aa240a9e00740f9690240f9e10313aa54692838BL8;FF017c0353e10e00343f040071200200543f080071e1030054898246f83f0500b1a10000549fe606a99ffe07a999fe08a99f9a00b981a20191e003082ae20313aaL8;ZDBBL8;FF2", + "20080523c270114c0035fd6fd7bbea9f44f01a9fd030091140040f9f30300aa880241d29f0200f108459f9aa80600b41f0500f1000200541f0900f121090054L8;FF745643a9350200b49682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef82200805232270094c1825ff8e1fe", + "ffb4c00240f922008052L16;FF2102de3ca081813c2082dc3cb28102f832825df8c28102f8220a40f9e017803d2002c03dc181813c4109c03da2031df8223240b9a0039c3ce141823ca1037eadBBBBBBBBL8;FB793a20c00e20616e6420636f756e7465723a20c0152e2053657373696f6e206c6f6164656", + "420666f7220c0022e20c0172073657373696f6e2068617320626173L8;FF92a00094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4318d1ff0300f9f50301aa281840f9e20f00f95f0008ebe1230054a00640adBL8;FFf30303aa340d002a3940009118f17dd30b000014680640", + "f9e10316aae20315aa0001178b3b240194e802158b680a00f9186300f139630091c003005436d77fa9L8;FF290040f91f1040f15369283808050091280800f903feff540b7c07533f0108eb6b611932000100544b692838080500911f0048f1280800f9a202005400fc4ed3BBL8;FF08190d91a203df3ca3", + "03dc3cf6030391c9018052e0030391e00709ada0077cade253803da203d73ca1c302d1e203019103088052e347803de08706ada1037dadL8;FF220080522d030094610a40f9eaffff17fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30301aa210840f9f50300aa680240f91f0101eb800b005468064", + "0f9BL8;FFe10000549f5e00a99f7e01a9977e02a99f5e03a99f6204a99f3e00f9e10314aae20313aa64030094c00300b5e1031faad5ffff17c1010054e1031faac1ffff17L8;ZDBBBL8;FB64696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a207368", + "6f756c64206e6f74206265207573696e672044L8;FF1f0500b180070054e11740f9e80f40f91f0101eb20830054e81340f92a0400918022029149018052ea1700f90969213845f4ff97e16300917c91ff97806a40f9BL8;FFe1430691a24302d175000194a84302d1e0830c9171000194a04302d1e10313a", + "a600100941f1c0072e0079f1a04000014e0031f2ac0035fd6e0031f2aff031291L8;FF0c0200346b0500f12c15003841ffff54e83300911f69213821488052e0330091c23680520101a0726f0d0094e000f836490d0094080040b91f110071e0feff54BBL8;FF0a6040b9092c40f9ca0700344a0140b24a1", + "1c0da4a1540d24a0d0a8b4a2501914afd46d34a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b250191L8;FF8c6119538c01210b810102516b00f8374b0080524c0000143f104071c30b00544b09c0396c1d00122c380c0b811140516b00f8376b008052430000143f004871L16;FF092d40f9", + "e9c300f9093140f9e9ab00f9093540f9ea2712a90a2547a9ead700f9e94f00f90a2548a9ea5300f9e9df00f90a2549a9e9af00f9095140f9e9c700f9BBBBL8;FB53656e74646b506f6c796e6f6d69616c4465636f6465727074735f6e656564656469735f636f6d706c65746573656e64696e675f656b726", + "563656976696e675fL8;FF080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb482200545b010014e80300aa098d40f83f0500b140220054f30300aaBL8;FF340500919f0208eb69060054e00313aa080c45f81f0500b1800200545afbff97080040b20811c0da0815", + "40d2080d088b0825019109fd46d30800098b08050091L8;FFe9ab5c290a51003909550039e9ab5b290a590039095d0039e9ab5a290a61003909650039e9ab59290a690039096d0039e9ab58290a71003909750039e9ab5729BBL8;FFea0240f9a0835df84801088be80200f9a90200f908fc60d3280600b5", + "080840921f1900f122060054017c0353410600343f0c0071600100543f080071a0faff54L8;FFe85b44f9a70302d1c082863c404fc03de203182a2283c53cc182843c4143cf3c20f18f3ce963019120cbc03de8b304f928210a91e9e32291c082893c4043ce3cL16;FF44d40094f61640f9f60100b4f8124", + "0f93cd40094e00316aa2100805235d40094a00200b4e10318aae20316aaf70300aa38d400940500001435008052f61640f9BBBL8;FF951640f9550300b4610a40f9680240f9961240f91f0101eb00340054680640f9490380522a040091e00315aa6a0a00f909692138e10313aa1cfaff97770a40f9L8;FF", + "e8cf42f9e10319aae20318aa00011a8b407400944803188bf90b40f9fa0740915a830991e8d302f97f0700b1fb0314aa806dff5440c30391d1000014e8031faaBL8;FF24008052ed170094770a40f9680240f9080117cbbf0208ebc9fbff54e00313aae10317aae20315aa2300805224008052e217009477", + "0a40f9d6ffff17f44f44a9L8;FF600640f9200800f988000014a1cd89d2f55b02a9f5230191c138a8f22000009000201d91130080d2a17e019bf60300aae12700f9000440f9090000140100138bBBL8;FFf95b49f91f0101ebc0bf0054e8cf42f9490480522a040091e00318aa09692138e1431691ead302", + "f997110094fad342f9e8cb42f908011acb1f0308ebc8be0054L8;FFffc33191f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6fb6340f91f0500f1f8c30d91c902005468c21191090000d029712991e84b05f9L16;FF6183c33ce08b01ad6083c83ce10b803d6183c73ce84300f9e10", + "303ade317803d6e000014e08302918122009102398052f583029137b40094800ac03d8182c03cBBBBBL8;FB2066617220696e746f20746865206675747572657365745f72656365697665725f636861696e5f6b65792063616c6c656420666f72206e6f6e2d657869737465L8;FFe00315aa020000142600", + "8052131900a9e70313aa130900f9f44f45a9fb0b40f9f65744a9f85f43a9fa6742a9fd7bc6a801000014fd7bbaa9fc6f01a9fa6702a9BL8;FF1f0109eb0881899a090180521f2100f11481899ae30314aae9000094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035f", + "d6L8;FF3c1c0094e06401b428fdfff008fd0391f60300aa090140f9086140f8090000f9086000f8bb0000b4e0031aaae1031baa22008052301c0094e80741b229fdfff0BBL8;FF0101819a2201829af50304aaf40303aae08304ad291e0094a80356f81f0500f1000d0054b68302d108088052f7030091c0", + "82c63cc182c73cc282c23ce00703adL8;FFb9ffff17e1970cb9f2feff17e1930cb9f0feff1708018052ffeb05f9f6ef05f91f7f0aa91fff0ba9f6fb05f9e80706f9ff0b06f9fa0f06f901430291a22302d1L16;FF1f0109eb1481899ae30314aaa1320094e80740f91f0500f120010054e80b40f9742200a", + "9f44f43a9fd7b42a9ff030191c0035fd6e0031faa6bd80094e00741a9BBBL8;FFfd7bc2a83c7c011421010054810000b4601240f922008052377c0194611a40f9c1fdffb40804805205000014611240f93f0400f12bfdff5408028052806a68f8L8;FF08e1079197ecff97e0074091e10740910232805200", + "80019121c035913d7c0094e00fc43de113c43de0074091e82b48f9e20bc43de1074091e08f843de0ffc33dBL8;FF08410491680200f9f44f42a9f65741a9fd7bc3a8c0035fd6280080527f7e01a9680600f9c8feffb008a13c91680200f9f44f42a9f65741a9fd7bc3a8c0035fd6L8;FF0b010039a802148", + "be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaf603012ae10314aae20315aae6feff97e103162ad2ffff17fd7bbda9BBL8;FF4901084aaa235838a90318386901084aab335838a91318384901084aaa435838a92318386901084aab535838a93318384901084aaa635838a9431838", + "6901084aL8;FFf8030aaa810000b460ee41f922008052393c009461fa41f9810000b460f641f922008052343c0094ea0318aafa6740f958fd60d37fc61339e95340f928008052L16;FFfc031f2ae0031baa080c48f81f0500b14000005401c5ff97df0600b18002005474674ca9990100b49b22009104000", + "014390700f17b630091e000005461835ff8BBBBL8;FB36c5995579b0016372f75a0f7686425460cd361e489549405c3c31bef99879f22ea0a686816f443e29147616b47240e1051b0595e8330bdda28c02cd2ea6a911L8;FF480100b008210091a98300d100210091a20301d1e10700b921008052e3fdffd", + "063400c91e4fdffd084e00c91a8031ef8a9031cf860880094e10740b912feff90BL8;FFea032d91e86b06f9c8feffd008091e91e96306f9290080d2e87b06f9c80480528943c0f2ea7f06f90a078052ff5306f9e85b06f9ff5f06f9ea6706f9e87306f9L8;FFf70302aaf60300aaf80301aaf40700b43c0c", + "0094e00314aa21008052350c0094e10318aaf30300aa2000805273feffb4285440a9f4cf00a9ff0f00f9bf0214ebBBL8;FF3d4c019402000014f60f00f9e8830091a0820191a18202915b480094e86342a9f71b40f91f0500f161050054081f00121f050071cc00005488010035171f4092L8;FF2a0900d1", + "3f09007149819f9ae90000b43f0500f16102005481fdffd0215c0591e20280526b480014ff8300d1fd7b01a9fd43009181fdffd02120059184fdffd0L16;FFe8bf02f9e8f340f9e8c302f9e83340f9e8c702f9e8f740f9e8cb02f9e82f40f9e8cf02f9e87f40f9e8d302f9e84b40f9e8d702f9e88340f9e8", + "e302f9e87740f9BBBL8;FF680240b20811c0da081540d2080d088b08250191681a488b08050091d50600b4a90240b22911c0da291540d2290d098b29250191a91a498b29050091380108abL8;FF0805088be00314aa01f17dd302018052f44f43a9f70b40f9f65742a9fd7bc4a8356c0014f44f43a9f70b4", + "0f9f65742a9fd7bc4a8c0035fd6fd7bbea9f44f01a9BL8;FFa9035bf8081500918082873c8182883ca0077aad8282893c880200f98082833ca00f7bad8182843ca10b79ad89820af88082853ca003d13c8382863c8082803cL8;FF0200023240fef736427c4093e00304aa480c80d2011080d2030080d201", + "0000d41f9800b140feff5480fc5f8880feff3585fc0088a0ffff3520008052c0035fd6BBL8;FFa003dc3c6182813c6082823ca1037bad092300a9e81b40f96182833c6082843ca1037cad080b00f96182853c6082863cb90000b4e0031aaae10319aa22008052L8;FF3cfcff17a0c300d1e1031caa020480", + "525aeaff97bc035ef8bb035df8d7fdff17a0c300d1e1031aaae20318aa53eaff97ba035ef881fcff172000805201188052L16;FFe09b803d88f207f808008092e09bc03dff7702f9ff7302f96012813ce023c13dbf7f34a96082823ce097c03dff4f02f96016803de03bc13dff4b02f96082863cBBBBBBL8", + ";FB656372797074656420c00e206d6573736167652066726f6d20c02620776974682063757272656e742073657373696f6e207374617465202862617365206b6579L8;FFf55701f9ff6701f9f56301f9ff6b01f9f56f01f9ff7f01f9f57b01f9ff8301f9f58701f9ff9701f9f59301f9ff9b01f9f59f01f9", + "f5ab01f9ffaf01f91467179bBL8;FF76260094e80300aa01ffff902100399103ffffd063c01291e023009102018052a4008052e80700f909000014e00700f901ffff902100399103ffffd063d41291L8;FFe8c30591e02300910227805201e1009140200094570400b5250000142017c03de1af40f9fc030", + "5913b0080922003803df90318aa810000b4e00315aa22008052BBL8;FF04000014f70600f118630091e000005401835ff881ffffb4000340f92200805235600194f8ffff17e8bf42f9c80000b40805088be00315aa0201805201f17dd3L8;FF29e10b91e82b0ba9e8430091e8270ca948008052a9fdffd02", + "9411f91ea430191a8273da968fdfff0084d1491a82b3fa90a078052c8048052bf273aa989fdff90L16;FF81fefff02174149183fefff0634c0f910f000014e00300f981fefff02174149183feffb063900291e0030091e2008052840080521200001481fefff021741491BBBL8;FBa000000009000000789", + "54000000000005000000000000000840000001e000000c9954000000000004800000000000000c9000000120000002f72757374632f34L8;FFe11740f984fcff17e0630091220080522300805224008052e8a3ff97e11740f996fcff17e0630091220080522300805224008052e1a3ff97e11740f99efcff", + "17BL8;FF97000014e30302aae20301aae10300aae00308aa14010014fd7bbda9f65701a9f44f02a9fd030091f30302aaf40308aa820100b4f60301aa32000194e00313aaL8;FFf60300aa4180889ae0230091e20313aaff0700f964100094e803002ae0031faa68010035f50740f9350100b47f0214ebe00", + "315aae10316aa6232949a35000094BBL8;FFe0f2073659000014f8031faa57000014680b0091b8831cf805000014e80b41b2a0831cf802000014680f0091a00301d1a8031cf869460094f80300aa4b000014L8;FF698241f96aa201f96a7a41f969b201f9698e41f96001803d6b9241f9689601f9619a01f", + "960a601f96aaa01f969be01f96bc201f962c601f9481940f900013fd6L16;FF220080523cc000945a008052b9040014e0031baa088c40f809204039155048a9164840f9175040f9bf0600b1c04700540a9840b95f010971604700541f0500b1BBBBL8;FBe65800002af4096b557e2ddf654f1812424f6624", + "a0f32061370cf575f1db175d3c3317640cc06fcb39780cfd72f23b99e3eedec2bbe9f44d37430607d11b0000L8;FFe0fdfff000400d91908c0094e0fdfff0000018918d8c009400feffd000c00b918a8c0094fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e0030054BL8;FF02240054a17e0", + "35321240034280400511f390071c806005489000010ea6a683829090a8b20011fd6a03500b5a02302d104edff97e0140036e1fcffb4b0010014L8;FF44100094bc2240f99c0100b4b51e40f93c100094e0031caa2100805235100094400700b4e10315aae2031caaf40300aa381000940200001434008052", + "e8a30091BBL8;FF81ffffb4600240f9220080523a500194f8ffff17e80740f9c80000b40805088be00314aa0201805201f17dd332500194ff831791f44f45a9f65744a9f85f43a9L8;FF0a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b15", + "40d26b0d0b8b6b25019129194b8b29050091L16;FFe9af04a90fa451a9e93b00f90ba452a9eb4300f9e92300f90ba454a9e97b00f909b440f9e96700f909b840f9e9ef00f909bc40f9e95700f909c040f9e96f00f9BBBL8;FF810240f9290080398900f8b7280400914a0400d115000014f70303aaf60300", + "aa5f2800f1880000542800028b08f1df38a805f837e02300918e210094e80b40b9L8;FF765200a9771200b9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd620008052e10314aa6f6c0094ff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9BL8;FF0401805204f6ff97e10340f9e00301aaf44", + "f45a9f65744a9fd7b43a9ff830191c0035fd6ff8302d1fd7b05a9f93300f9f85f07a9f65708a9f44f09a9fd430191L8;FFd4c01fb801d05f38211000128100010b01d01f38f35341a9f55b42a9f76343a9f92340f9fd7bc5a8c0035fd601d05f38840a1b53f5ffff17040c40f2a1020054BBL8;FF406b005", + "4e8cf42f9090180522a04009109692138e1431691ead302f99a0d0094df0600b18000005480c20291e1431691c01000941f0700b14086ff5481220291L8;FF443000945a031b8be0031caae1031baa22008052ba031ef8373000941b0000141a0180d2e8031faa9bff48d31a00f0f206000014090180d2fb", + "031faae8031faaL16;FFfd7bbea9fc4f01a9fd030091ff430ed100844eade9a70991f30308aa08f840f9e10300aa0232805220f18f3ce9e7099121f18f3c00844cade8c701f9e8a70891BBBBBL8;FB7373616765206b6579736465637279707473657373696f6e207761732076616c69643b206d75737420", + "686176652072656d6f7465206964656e74697479206b65L8;FF080040f929feff9029411191e00301aa08014039227968f829feff9029a11191287968f8e10308aa6a940014e00301aa21feff9021800f914200805264940014BL8;FF9214019400ffff90008010918f140194e00301aa01ffff9021e02f9", + "1a20080526c140114fd7bbea9f30b00f9fd030091080040f91f0900b1a1000054e0031faaL8;FFe86f42f929068052e0431391e1830a9109010039e037c13df6b30bf9e0d7853db40d0094e107409160420191e243139121401d911cefff97f65741f9e15b41f9BBL8;FFea2f5b29f6c3023980a20191a18", + "301d10809c05a2909c05a7f9302f8e82712294809c05a6b09c05ae92b5c29e82f1329220080527f1302f82809c05a4a09c05aL8;FFe8a304b9e027813d410a0054e8830291e99f40f9e027c13d16d10791e8a344b9f59302b93f0500b1c002803de8a702b9002c0054e8c3179140630291e0f0fe97L16;FF", + "17693538d50a0091750a00f9c200005494fe4ed3680240f9bf0208eb0107005435000014680240f9897e0e53bf0208eb3861193261000054e00313aa31d30094BBBL8;FF2800028b08f1df388808f837a0c300d198290094a8035db848240037a8035ef86a0740f9490108eb433300546a0340f9b7835df8", + "4801088b682700a9e8fe60d3L8;FFe09f49f9220080523b780094b30000b4e07b49f9e10313aa2200805236780094e18349f9810000b4e08749f92200805231780094f4ab49f99f0600b1a0baff54BL8;FF1f0900b1a1000054f44f42a9f65741a9fd7bc3a8c0035fd6090141d2ea0080523f2d00f129318", + "a9a3f2500f1480e0054cafeffb04aed09918b0000104c696938L8;FF637a62f842040091c3ffffb5350000b0a1221d91620e028be00302aa220400f90200001400400091130040f9d30000b47f9600f188ffff54010440f9817833f8BBL8;FFf443259143380194fc074091e00740919c83099100c035918", + "8830e9191a80094e0074091e1074091023280520080019121c0359137380194e0ffc33de103c43dL8;FFe84b05f9753eff97f60300aa3f010014f79b44f9f69f44f9e0831f91fca344f9a1620091022880523a380094ff0600b180010054e0831a91e1831f9102288052L16;FFe04740f9220080523bb800", + "94b40000b4e04b40f9e10314aa2200805236b80094e14340f9810000b4e02740f92200805231b80094ed1b40f9ee6740f98dcdffb5BBBBL8;FB47000000000000002b0100003b000000617373657274696f6e206661696c65643a20216d73672e69735f656d707479282900000000000000bb11400000000", + "000L8;FFe0c740f901f97fd3420080523a880094e8cf40f91f0500f1ab000054e0d340f901f97fd34200805233880094e8db40f91f0500f1ab000054e0df40f901f97fd3BL8;FF290080d2a10302d16908c0f2a87f39a9a8273ca9950401944083cf3ca88355f8bb0353f8b5df73a920b7803de83304f9e8", + "f304f94003803dffa71139e89740f9L8;FF003f0054f6275ca9590080d2e82f00f9e8eb40f9fc031faa1900f0f2e92304a96f000014280340391fad0071e8179f1a4a0308cb2817999a5f2500f1c2090054BBL8;FF490400d1110000145f2800f1880000542800028b08f1df386804f837a0c300d194f9ff", + "97a8035db8a8140037a8035ef8ca0240f9490108ebe3160054ea0240f9L8;FFa6ffff17e85340b91f050071610f0054e043c73ce143c83c03e4006fe283cc3ce8430691e0c30e91808506ade083cb3cc1e20091e2430e91fa030b91808907adL16;FFe8cf00f9e8cf43f9e8c300f9e8d343f9e8ab00f9e8d", + "743f9e92312a9e8db43f9e9df43f9e8ab1aa9e8e343f9eaf343f9e9a309a9e8e743f9e9eb43f9e8df00f9BBBL8;FF18a30191730600916003005400877fa9e8230091a9620094e82340391f05007121feff54281340f91f0900f183feff5448008052a00700d1e1c30091e86f06a9L8;FFe00316aae10315", + "aae2031faa00013fd6e0031faaf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a97b66ff97e0230091f7a700a9BL8;FF05eeff97e10340f94fffff17c90080d248008052e02300390900f0f2e8270039e90300f9ecffff17e00300f9a1feffb021e81491a3feffb063d81591", + "e0030091L8;ZDBBL8;FFe8030639e10740f9c1f7ffb527feff173c008052e8430691e0430f91b9bcff97f82740f9e81f40f91f0308eb61000054e0e300917ec6ff97080d8052e92340f9L8;FFe103009122008052e00702ad800a43ade00b03ad810240ade10300ad820241ade20301ad7424009400e4006", + "f808200ad808201ad808202ad8002803d28d776d3L16;FF3da80094ab835ff8ec0315aa1b0100b4e0031caae1031baa22008052f5030caa35a80094ab835ff8ec0315aab6577ea9e0c20191b8835df8140200b49f0600b1BBBBBBBL8;FB1e3a204b657973556e73616d706c6564202d3e204b65797353616", + "d706c656400c0012ec000636c692f7372632f73746f7265732e72730076656e646f722f6c69L8;FF5f0308ebe1fbff54fb03002ae02300916cf8ff97e0031b2adaffff17680100f008210091a94300d1fa03002a00210091a22300d1fb03012a21008052e30315aaBL8;FF7a000014e10300a9e00301aae1", + "0308aa22008052f4030caaf0050094e10340a9ec0314aa2aa040a9290040f90bfc63d35369283808050091280800f90bfeffb4L8;FFfb2b00f9fa6706a9f85f07a9f65708a9f44f09a9fd03019109404039a9080037f40308aa092040a9f30300aae0430091028d40a921a1009168130094f85b41a9BBL8;", + "FF2300805224008052abedff97b7035ef8ba035df817ffff17a0c300d1e1031aaa220080522300805224008052a2edff97b7035ef818ffff17a0c300d1e10317aaL8;FF20080054680640f9490380522a040091e00315aa6a0a00f909692138e10313aad1faff97770a40f9680240f9080117cbbf0208eb2", + "8070054680640f9e10316aaBL8;FFe20313aa430c8052a1e8ff9740f9ffb4bfffff17a80640f91a0101eba3100054a80640f91f011aeb49080054e00313aaedeeff97000c003728fc60d3e80900b5L8;ZDBBBL8;FB6964656e746974792d6b65792d7061697200000000000000650d400000000000110000", + "0000000000fe00000005000000650d4000000000001100000000000000L8;FFe81340f9090180522a040091ea1700f909692138e1630091848fff977f0600b180000054e1630091e00315aa6ba2ff97df0600b120b1ff548022029154010014BL8;FFe0179f1a541701948862403969624039b502000a1f0", + "1096be0179f1a4e1701948866403969664039b502000a1f01096be0179f1a48170194886a4039696a4039L8;ZFBBL8;FF200440a9e82701a9e8230091e82702a9e3430091793e0194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000904ac13e91e8a700a942ffff90L8;FF63d41991a0", + "c300d142018052e40080522c000014a0031df881fdff902184199143fdffd063500291a0c300d1420180528400805223000014a0031df881fdff90L16;FFe8b303f98cc8ff97f19f55a9e1031baaedc340f9e21740f9ee0314aaeb2b40f9e61f40f9f0031aaae90316aaeadb40f9fb0309aaeec300f9e82f", + "40f9f07315a9BBBBL8;FB6e164000000000004d00000000000000a40100000a000000870840000000000047000000000000009b0000001b000000ef104000000000004e00000000000000L8;FF1bfbff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb890400", + "54140114ab230100541e000014f4031faae00313aaBL8;FFe293c13de387c13de10316aae08601ade07fc13de183c13de82b43f9e216803de00600ade83200f9e30a803d75fdffb5e81b41f91f0500b1e00d0054e94b42b9L8;FF49d109b8e9235c29e8d31539e8fb4379e9d71539e9fb41b9e8f70a79e8c", + "3473949610ab8e97740f9e8331639e8b341b949c10af8e9f740f9e8371639e80b4091BBL8;FF9f0600b1e103959ae30317aae08300ade08301ade003803decf5ff97a0877ead68ffffd008690b91a203df3ca303dc3cf943019149028052e0430191e08705adL8;FF601500b4e10314aae20317aaf80300a", + "a40520094482740f91f0500b120030054592f40f95b6340b9991100b4542b40f934520094e00319aa210080522d520094L16;FF140340f99f0208ebe8979f1a08219f5a081d0072e0ab00541f050071611701548900805228c840f9740a00f96922003909008092690200f9e80000b420cc40f9BBBL8;FFa", + "dfdff97610a40f9fdfeff17e00313aae10317aae20315aa2300805224008052a5fdff97770a40f9680240f9080117cbbf0208ebe9dfff54e00313aae10317aaL8;FFe8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aa27110094fad342f9fc0740919c830191d7fdff17e04316912200", + "805220110094e1d342f9BL8;FFcbfdffb43f0108eb93611932a00300540cfc6ad35369283808050091280800f92c0500b5e0030baa3f0108eb20010054290440f90a050091206928382a0800f9L8;FFa1060011c3020e9161cc218b21e840f94200018ba5ffff17a10600123f040071600100543f080071c", + "001005441f4ff351f0c04eba80100541f0404ebc9f3ff54BBL8;FFf4074091948209911f0101eb40880054e8cf42f92a040091802202914903805209692138ead302f9e61d0094e1431691950f0094e87749f91f0500b1e0070054L8;FF680000b4e00314aa00013fd6a10640f9611300b4a20a40f9e0031", + "4aa3632009497000014f6e742f9fb074bf9f90b4bf9fc0f4bf9f8134bf9f5174bf9c80240f9L16;FFe28e803de1820fad42b20094e1c30991e00313aa026e80523eb20094ff831791f44f43a9f65742a9fc5f41a9fd7bc4a8c0035fd645feff90a5402491e1230091BBBBBL8;FB290000000000000000000", + "0000000000008000000000000000800000000000000408e410000000000ef104000000000004e00000000000000f904000019000000L8;FF080132910bfc60d3097969780a596a786921094a0a200a4a2b5d10534c5d10530b596b7808596c786001094a01010a4af44f43a9f51340f9fd7b41a9ff030191", + "BL8;FF400400540a2c40f9093840f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8bL8;FFd6028052d90280520000803d08e000f8e1ab4bf941f1ffb58effff1778ff78d3c8fe60d337ff60d3dcfe78d3cf7e08530bfdf", + "f906b3102918d008052e903192aBBL8;FF8eddff97d1feff17c88240b8c9c240780a6342f8a80319b8a88317b8681200b908e342f8a9c31778692a00796a6201f868e201f808008092f51340f9685e00a9L8;FF21d81f91e237c13de0031791e3833291e4032d91e2008052e0d3823de1d7823de2db823db", + "1f9ff97f3f742f9e8ef42f97f0208eb61000054e063179162f8fe97L16;FFe00100b4c0010014e86341f91f0500b1e1000054ff6301f9fc6701f93f7f01a9fc7301f9ff7701f9fff302b9e1030b91a2c303d10aefff97a03500b5e1031faaBBBL8;FFe9ffff17f40301aa1f2900f1880000542a01088b4af", + "1df384a03f837e0030091e10309aae20308aa922b0094e80340b9c8000036e00740f9f44f44a9fd7b43a9L8;FF8c05009102000014ec031faa8b010b8b2801088b49010b8b0801098b090140b22911c0da291540d2290d098b292501910819498b140500913f0700b1f60f00f9BL8;FF74f60094fd7b44a9", + "f32b40f9ff830191c0035fd6fd7bbca9f85f01a9f65702a9f44f03a9fd030091130040f9740a40f9680240f99f0208eb80010054680640f9L8;FF3f01007208118a9a8000f0b6480944b23f01007208118a9a090141b22a0000d0e00308aa49f100f9f44f4aa9f65749a9f85f48a9fd7b47a9ffc30291c00", + "35fd6BBL8;FF88260329884640f909208052800640ad282508aa080dc0dae00700ad9f2203a9820241ade20301ad7236019400e4006f9ffe003988264d298a2e4e298c364f29L8;FF0800f0f2e0c30e91e3432a91e4830f91e2008052e9eb03b9e8f301f964060094f5ef41f9e8e741f9bf0208eb6100005", + "4e0230f9164d8fe9708068052e9eb41f9L16;FF29d34b78eb031c912093ce3ce133c23df80316aae86b00f9e8ff5e39e6030991e237c23de0d7803d019080522841082a69914bb8e023c23de10b19ade127c23dBBBBL8;FB9a6391738c438753b623bd33a003ab13c2e3c9f3d4c3dfd3eea3e5b3f883f393", + "21732a6337533c430d3306231b13100379f372e36fd364c355b35ea343934883L8;FFe8ef16a9ffa317a9e8db19a9ffa31aa9a80a00f1eeff0ca9f0ff0fa9f8ff12a9faff15a9fcff18a9e0ff1ba9e201005460220091e123019102308052358a0094BL8;FF680000b4e00313aa00013fd6810640f981000", + "0b4820a40f9e00313aa360a01949f0b00b121020054e0a34fa942030291e17740f9081140f900013fd6e06b01f9L8;FFa21d0054b900f8b6fa031faae0031aaae10319aa74060094790200b4390a0094e00319aa210080523a008052310a0094e0feffb4f98300a9ff0f00f9d8010034BBL8;FFfa03182a3", + "84340f93e4a0194e00316aa21008052374a0194400b00b4e10318aae20316aaf90300aa3a4a0194f8031a2afa031caafc0317aaf703142af40f40b9L8;FFe1630091a21b00b9e92302a9e8030091ff2301a96100ff9740030035e003c03de80b40f96002803d680a00f9fd7b43a9f32340f9ff430191c003", + "5fd6314a0094L16;FFe83f40f9e87704f9e8f340f9e87b04f9e83340f9e87f04f9e8f740f9e88304f9e82f40f9e88704f9e8031d9108e107910001803de88340f9e89b04f99c190094BBBL8;FF220080523c6a0194bb0000b4e0031caae1031baa22008052376a0194b90000b4e0031aaae10319aa220080", + "52326a0194bb0302d1b40000b4e00318aae10314aaL8;FF61da40f9810000b460de40f922008052396a009461e640f9810000b460ea40f922008052346a009461f240f9a11100b460f640f989000014610640f9810000b4BL8;FFecfaff97c00600b5e1031faad5ffff17880240f91f0500b1e10000549f5", + "e00a99f7e01a9977e02a99f5e03a99f6204a99f3e00f9e10314aae20313aa5e090094L8;ZFBBL8;FF2083c43c61838b3c2183c53ce85301f9c86a40b9e00704ad2083c63c2183c73ce82b00b9e8430691e00705ade10240adfab30a39e10302ade10ac03de10b03adL8;FFe1031faac0035fd6c0035fd6e3", + "0302aae20301aa41fdffd021c02b9177260014fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4313d1L16;FFfc4f41a9fd7bc2a8c0035fd6ff8300d1fd7b01a9fd43009129e040f9e20300f93f0500b1c0020054290500913f0102ebe90700f96101005420844cade80300aaBBBB", + "BBL8;FB20666f72206b657920776974682074797065203cc0013e00266572726f72207768696c6520696e766f6b696e6720616e206666692063616c6c6261636b3a20c0L8;FFff2700f9e81f40f9bb264078080101cb1f0500f1090100546807c05a08682178210800915a0700f1e12700f9c1feff540a00", + "0014e0e300914200805223008052BL8;FF0811c0da081540d2080d088b0825019108fd46d308050091b60a40f9f60b00b4c90240b22911c0da291540d2290d098b29250191c91a498b29050091b41640f9L8;FFf30300aa180040f9e0a30291f40308aae103192ab8110094f50f4ba9a08301d1e10318aae", + "20315aa6c0f0094b6035af8df0a00b1e1090054b60b7ba9bb8301d1BBL8;FF00630091a1180094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb69160054f6e740a9b90600b4eb031faac9420091L8;FFe81303f988fdff9008f91491e90b03f9290080d2e8230", + "3f9c8048052a934c0f2ea2703f90a078052e07f823dfffb02f9e80303f9ff0703f9ea0f03f9e81b03f9L16;FF08080054680640f9e10317aae20316aa0001188b3fde00940803168b680a00f9540300b4610a40f9680240f9b51240f91f0101ebc0080054680640f949038052BBBL8;ZBL8;FF3c7e009460", + "9601b4e1074091022c8152fb07409121800991f70300aa192c81527b8309913b7e0094e007409168030291e10316aa00802f91e20314aa03088052BL8;FFa142009120008052affa00946002f8b7c8fefff008410491d45601a9c84e00a9f44f42a9f65741a9fd7bc3a8c0035fd6e10300aae00316aae203", + "15aae30315aaL8;ZFBBL8;FF691200b8a9b341b86012833ce00741ad690600b9e90340b96a120079ea0f40f969a200b8e90b40796182823c6082813c691e00796a0a00f97f020039fd7b45a9L8;FFf75345f9f5230ba9e85b45f9e95f45f9fb6345f9757e42f9e86b00f9080340f9e95700f9680000b4e00", + "315aa00013fd6010740f9810000b4020b40f9e00315aaL16;FFbf0400b120bc0054e9831d916013c83ce8e200912181cf3c2281ce3c2381cc3ce0d7803d0035c03d0843152ae28718ad2181cd3cf7430d912281ca3c2481c73cBBBBL8;FBaf8723172e1b28e25b63c480bec65123f7fa8913489399b1a49d", + "a30cd1a7fd217d479d423f94da7da28c1dbe03560000b714bd6ced05dafccf73a2ccc74918d9L8;FF130300a908080079280080528800b172130b00f9080000b93a8e0094c000805241008052338e0094006800b4c8009e52138301a908080079e800be52080000b9BL8;FF08000014e05306f9e0833291e", + "1feffd02118149142028052e3feffd06360149144018052fc130094e15346f906000014e80f41b2e0833291e85306f967140094L8;FF1f21007161030054f40302aaf60301aa3ccdfe971f0400b180050054080400919f0208eb41030054940600f1e0030054340e0094e00314aa210080522d0e0094BBL8", + ";FF0901f83708710a8b0a01805208a800a91f0000f9fd7b44a9ff430191c0035fd6497d1c53a90700340900be524901090b2a2080390871098bca01f8b708e10a8bL8;FF090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209ebe90b0054088c5cf81f0500b1e0090054", + "1efeff97080040b20811c0daL16;FFe46700f9feaf02a9fa8700f9e76f04a9fb030eaaf03b00f9f21f00f9ed0700f985d4ff97eb0b43a9ee031baae76f44a9ec0318aae46740f9ed0740f9e60316aaBBBL8;FFeca741a9a83b0079e81b00796852017828008092aa1b00b9a9031ff8ab831f38ea0b00b96a", + "1201b86c7201f869f201f86b9e0039680200f9fd7b44a9f32b40f9L8;FF2283c33c2383c43cfa9741b9e00600adea1700f9000504ad020d05ade90b00f9bc0000b4e0031baae1031caa22008052316e0094fbe30091a80302d1e10316aaBL8;FF22600054287c0353486000343f8001f182fdff540805005", + "1890240f98a0000100b6b68384a090b8b40011fd63f0900b1802400543f0116eb4124005481220091L8;FF60d25f38001000121514150ba41e0012f7ffff17dfbc0071a08242faa9f9ff54e7141a12ff003f7121ebff54740214cb620282d2b902028b21cc74923903148bBBL8;FFe043169122008052f41", + "10094e1d342f9fff9ff17e0431691e1031aaae20318aaee110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaaL8;FFe8a344f9e02f823d00e4006fe13b823de127c23de86304f9e85344f9e96704f9ea8304f9e88f04f9c182803ce087853de083853d15290094f90740910a0880", + "52L16;FFe1030091e3630891e20315aa19fcff97e84b42f9e9670e9120f1cf3ce95742f91f0500b1e08f803de92301f9c00b0054e037c13de13bc13df4230991e243c13dBBBBBL8;FB657373000000000042024000000000006a00000000000000190000001c00000042024000000000006a000000000000", + "00e30000002e0000004202400000000000L8;FF6b01084aaaa31538aad355382901084aabb31538abe35538a9c31538a9f355384a01084a6b01084aaad31538aa0356382901084aabe31538ab135638a9f31538BL8;FFe9031faa10000014f5031faa681a40f948f6ffb5f6031faa770a40f917f7ffb5e80", + "317ab23f9ff5400ffff9000e0109186120194490080524afdff35ea031faaL8;FF0a5d003909610039e9ab5b290a65003909690039e9ab5a290a6d003909710039e9ab59290a75003909790039e9ab58290a7d003909810039e9ab57290a850039BBL8;FF2a040091e00313aa09692138a14301d1aa031cf", + "825dcff97b9035cf8a8035bf8080119cb7f0208ebc8210054130100b4a8835bf8e1031aaae20313aa0001198bL8;FF81e200910227805220af803de82304f940560094f63f42f9f43b42f9c80240f9680000b4e00314aa00013fd6c10640f9810000b4c20a40f9e00314aa2e560094L16;FFfa6742a9fc6f", + "41a9fd7bc6a8c0035fd6f9c30d39390200343f070071e0010054e8c30d91a90100b029911e91e8cb03f960feffb0003c2391e8432d91e1431e91BBBL8;FF490380526a0a00f909692138b6020034c80240b20811c0da081540d2080d088b0825019108fd46d308050091f50100b4a90240b22911c0da2915", + "40d2290d098bL8;FF49078052f8074091188309910969213828040091f97749f9e8d302f93f0700b1c01d0054002302917d260094080040b20811c0da081540d2080d088b08250191BL8;FF60da40f9220080523bf6009461e240f9810000b460e640f92200805236f6009461ee40f9810000b460f240f92", + "200805231f6009460220091f30b40f9fd7bc2a8L8;FF000080d21f000039007d20d46282403922ff2f361fbc0071640640f98c210054651240f95f1040f2a2cc7492a1020054087c4093420100b4e7fcffd0e7a01191BBL8;FF690200f9b1100094a80600d11f0900b142140054e0031baae10315aa22008", + "052353601949d000014f3031faae8031faa85000014bf0600b121fb0054f8031f2aL8;FF0083c73ce8ff41f99f0b00b1001f813de8fb03f9a1340054e8fb43f9001fc13de9831a91e9b302f9c904805220fdffb000542c91e85b03f9080000f008913491L16;FF6f00001428008052e86700f9fcfb41f9f4", + "f741f97c0100b43ab60094e0031caa2100805233b60094001b00b4e10314aae2031caae05f00f936b6009403000014BBBBL8;FB010000000000000034654500000000000000000000000000000000000000000001000000000000007858450000000000ef104000000000004e00000000000000L8;FF6b11", + "c0da6b1540d26b0d0b8b6b2501916bfd46d36b0d00916c0300348c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c05009114000014f5031faaBL8;FFe00315aac8010194a8624039f5c342f9f7c742f9e8631639880280d22007c03d0800f0f21b2100d14003803de863019100610c91f6deff", + "97c8fdff17f83f42f9L8;FFe00313aa020180523b060094e0031a2aff031291f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0031faae10317aa6b020094ff2f00f9BBL8;FFe08744a988090035e90f41b25000001408008092686a00a955000014e8134bb8e9b740b95a0080d2ea", + "6740f9eb4340b91a00f0f2e88300b9e8434339f8e34239L8;FF400500541f190071000500541f1d0071c107005475fe41f974fa41f9a80240f9680000b4e00314aa00013fd6a10640f9810000b4a20a40f9e00314aa2e460094L16;FFe87740f9e9a700f9e9eb40f9e03340f9ed2b1fa9eab740f9e99b00f", + "9e9cb40f9fbef00f9fb0304aae4031caaec031baaeba71ca9eb0302aae98b40f9f91b00f9BBBL8;FF220080523c660194c082c23cd70240f9080d8052e90c80922227089bc1a20191a0039b3ce00316aac082c33ca0039c3cc082c43ca0039d3cc082c53ca0039e3cL8;FFe80300aae00301aac8fd073708", + "fc60d3681a00b5080840921f1900f1a21a0054017c0353c11a00343f0800716c0100543f040071600700543f08007161060054BL8;FFff030291c0035fd6170080923800805206000014e003082ae20313aa430c80529becff9740feffb5a80640f91f0116ebe9090054e00313aaebf2ff97e80300aaL8;Z", + "DBBL8;FF3d260114f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091092040a9f30300aaa80000b4600a40f901f97fd34200805230260194681240f9a80000b4L8;FF011040f9f30300aa810000b4600e40f92200805238260094610240f9810000b4600640f92200805233260094602e40f9a00", + "000b4613240f9610000b422008052L16;FF49000054df3200f91f05003160180054f82300910b0000140043c03c2901088b2001803d0043c13c2005803d09810091c86a40b9c93200f91f050031e0160054" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines5 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines6.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines6.lean index 187452752..24d67c32a 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines6.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines6.lean @@ -27,360 +27,252 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub6 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF1f0201314afeff54e9030eaa31dddf383f0201318a020054e9030eaa311e001232cd5f3831160012510a1a330f000014ff81007180fdff54ff150271a3030054L4;FFae1d00128c390e0b8c1140518d00f83761710c8beb0080521e0000149f014871830700544d1dc039ae1d00128c55", - "0e0b8c0148518d00f83761710c8b0b018052L8;FF6a2001940001805201038052712001948002009000601591592001948002009000c0159156200194fd7bbda9f65701a9f44f02a9fd030091080440f9330008ebBBL4;FF08048052e80302a9e2830091e103152ae81b00f9000400ade0c30191cfebff97", - "facf4aa9f9bb40b9fb0b00f9f30a00b44ca00194e00313aa210080524aa00194L4;FF2110001221800151251c0012421c409205d01f38e30380124418049b010004cb21fc44d383d01f3881e01f78f35341a993ffff1763141a127f003f71a1f4ff54L8;FFf31340f9ffc30091c0035fd6ffc300d1fd7b01", - "a9f31300f9fd430091130040f9e00301aa810100d021181891e8030091420180529ba0009468e20091810100d0BBBL4;FF57ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebe38000541803008bf9feffb5L4;FB74206e627", - "974657320697320c0001873706c69745f746f206f7574206f6620626f756e64733a20c004203c3d20c0001073756273657420706f696e7465722028L8;FFe9db00f9093145a902154aa9e00f00f9008140f9e9b300f9093140f9e01700f9008540f9e9ab00f9093540f9e02b00f9008940f9e99700f9093d", - "47a9e02700f9BL8;FF220080525b60019408008092681a00f9f44f41a9fd7bc2a8c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aac10200d021483191e8030091L8;FF000d002af30303aaf403022a1bfdff9795040034a80200320811c0da081540d2080d088b0825019108fd46d30", - "8050091d4030034890200322911c0da291540d2BBBBL4;FF6001005435597ea9810000b420015df82200805257000294b50000b4e00316aae10315aa22008052520002942800809229008052880200f969320039f44f43a9L4;FF1f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c00", - "35fd6e00741a960000094fd7bbda9f50b00f9f44f02a9fd030091a87cc39bf30300aaL8;FF280800f9a202005400fc4ed354000014e00700f9e00301aaf30301aae10309aa220080522300805224008052f4030b2a2f1600946aa240a9e00740f9690240f9BL8;FF84402391a363009182008052b30f00f9", - "a5800194a5800194fd7b41a9f31340f9ffc30091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091140040f9e00301aaL8;FFe81340f929040091e91700f91f692138d7ffff17e11740f9e80f40f91f0101ebc0810054e81340f9938248f84905805209692138280400917f0600b1e81700f9BBBL4;FF7f2", - "20039680200f9f44f47a9fd7b46a9ff030291c0035fd6880300d008011091890280528a0280d2690a00f90a00f0f26a2200a9f44f47a9fd7b46a9ff030291L4;FB704d6573736167654b65796369706865725f6b65796d61635f6b657969767365656450656e64696e674b796265725072654b6579636970", - "686572746578746465L8;FFe10b03ad1cffff17fd7bbda9fc0b00f9f44f02a9fd030091ffc314d1ff0300f9f30300aa0232805200844eade10313aaf40308aae0071bad00884fade00b1cadBL8;FFf30303aa81e2009180ffff97886a40b9d40a40f9e00313aaa81b00b9e84301910568ff97e82b40f91f0", - "500b1c0000054e017c03de83340f9e00f803de82300f9L8;FFf7a700a9b31cff97e00313aae1031faae20314aaa9020094770a40f9680240f9080117cb9f0208eba9fbff54e00313aae10317aae20314aaa0020094770a40f9BBBBBL4;FF63c02991e023009102018052a4008052b9040194e00740f9b6ff", - "ff17e00700f9210400d021602191230400d063bc2191e0230091a200805244038052d9ffff17L4;FFe08b00b9a04700d11bc2ff97e08700b9a04700d118c2ff97e08300b9a04700d115c2ff97e07f00b9a04700d112c2ff97e07b00b9a04700d10fc2ff97e07700b9L8;FFfdc30091138440a9f40300aaf5", - "0308aae8430091e00313aad0feff97e8834039e007c03d1ffd0371e003803de0020054e91342b8ea2740b9e1430091e003c03dBL8;FF1f0500b1400300543c8740f9371341b9381741b9282341b9e82f00b9fc0300b4348340f94f900194e0031caa210080524d900194e01400b4e10314aae2031caaL8;F", - "Fc0035fd6e8031faa091c40b949fbff35e9031faa0a0840f90afcffb5ea030aab23feff54600100d000a0139154900094600100d00020209151900094800100b0BBBL4;FFe8ff03a9e83340f9e80700f9e86f40b9e82700b9f90313aa9f1700f142ddff540affff17a00300f000a00c91a20300f042603d9", - "1010480527fd0019420008052L4;FB000056e2000001003110ee88093799c3175d175dd5f6fb9cd8e5d8e5d5f6d5f6d5f6d5f6a28c21e7e717e717a28ca28ca28ca28ca28ca28ca28ca28ca28ca28cL8;FF1f0900f1ebbf00f949030054a801009008110f9129038052e86705f9e80100d008012791e8a30", - "3f9e00100b0003c3891e8ab03f9e80100d008612991e1032b91BL8;FF59500194c00200b4a8cc875289c78d52e9cdad7208080079c8008052090000b9680200a9680a00f9fd7b43a9f32340f9ff430191c0035fd6c00200f000202891L8;FF08c10191a900009029110f91e8c702f9080000d008612091e9", - "d702f9c9048052e8cf02f9e8632291000100d000181991e8d302f9080100d008413191e1031691BBBBL4;FFf35b40f9ff030391c0035fd6e003c53ce00300d000602091e30300f063401f91e40300f084602491e283009101028052e00b803d5ff00194e003c53ce00300f0L4;FB63616e20616c77617973", - "20617070656e6420746f206120627566666572000000ea984800000000002e00000000000000ab0200000e000000ce96480000000000L8;FF08020037750240f9a80640f9160100eb62020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e00300916ce5ff9", - "7BL8;FFa32300d142028052a8831ff8a6700194e10200d0213c2b91040300b084c01e91a32300d162028052b3831ff89e7001949e700194f44f43a9fd7b42a9ff030191L8;FFe1d342f9e8cb42f91f0101eb20460054e8cf42f9090180522a04009109692138e1431691ead302f9140d0094e88f49f91f05", - "00b1c0000054e8074091e1431691BBBL4;FFf51300f9f44f03a9fd430091e90300d029c1009129fddf88a9060035e90300d0290d40f9a90800b4f40300d094020091f30308aa880642a902a00191f50300aaL4;FF5f4000f1280100545f0013ebe8000054e10313aaf44f43a9f65742a9fd7b41a9ff03019", - "1291000145f2000f108018052f60300aa4180889ae0230091e20313aaL8;FFb84301d1ff2304a9e87f06a9ff2307a9e87f09a9ff230aa9e87f0ca9ff230da9e87f0fa9ff2310a9e87f12a9ff2313a9e87f15a9ff2316a9e87f18a9083c8052BL8;FF29e10491e80305f9e8ffffd008310791e85f04f92800", - "8052eac32291e96f06f9a04700d1e1833291e95706f9890200d029cd2191e86b06f9880200d008cd2391L8;FFe84701f9e0432a91d5eeff97f7ef41f9f6eb41f9f70000b4f50316aae00315aaa1eeff97f70600f1b5c2009181ffff54e8e741f9c80000b40805088be00316aaBBBBBBL4;FFf44f41a9fd7b", - "c2a8c0035fd6fd7bbea9f44f01a9fd030091089040391f0d0071a1010054135041a9880240f9680000b4e00313aa00013fd6810640f9c10000b4L4;FFf44f4ea9f6574da9f85f4ca9fa674ba9fc6f4aa9fd7b49a9ffc30391c0035fd6680316cbb5035ef89f0308ebc8030054e80b40f90001168be10318a", - "ae2031caaL8;FF64180194020000143500805268fe4ad309088052954e00a90811c0da280108cbe90080521f1d00f10831899a29008052280908aa932201a9f44f42a9f65741a9BBL4;FF8281ff9720f2ffb4b2000014a88359f81f0500b160030054e1420291a2e300d17a81ff9720f1ffb4ce000014bfe", - "330a9bf8311f8a1e303d1a2e300d17381ff97L4;ZBL8;FFa8035ef87f1e0139e82300f9e86b40f9e083843ce183853ce00742ade83700f97f0200f96082863ca00b7ead6182873ce11bc03d6282853ce00b01ad6182883cBBBL4;FFe9031f2a0500001463001036094440f9490000b429008052f44f43a9f", - "70b40f9f65742a9fd7bc4a8092100391f0100f9c0035fd6ff0302d1fd7b06a9f33b00f9L4;FB2f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f737263L8;FFf10312aab409001408234039e90318a", - "a1f0d0071c00000541f110071e1200054282540391f050071812000544802009008b140f91f0900f149070054a80100d0BL8;FF220080525b580194e18349f9810000b4e08749f92200805256580194e80740910881099100c10391010c00940ffeff17880241d2e90080521f2d00f10831899aL8;FF1f01", - "15eb290b0054a02302d18af4ff97a033003728fc60d3a81000b5200840921f1800f162110054217c0353811100343f0800716c0100543f04007160030054BBBBL4;FFfd03039109704039f30300aaf40308aaa90100343f0d00712109005460a240a9090d40f9e823009120013fd6e80740f91f0900b1410", - "30054880200f968008052L4;FB6e677468203cc0153e20666f72206b657920776974682074797065203cc0013e002f636172676f2d72656769737472792f696e6465782e6372617465732e696fL8;FFf30302aaf40301aa44f7ff9720020037750240f9a80640f9160101eba2020054e80f41b2070000148", - "90080d248008052e02300390900f0f2e827003928017fb2BL8;FFa8135438e98300b9ea0b0179810200549f0700b180020054e84700b9e81740f9a02303d1ec0f00b9eb2700f9bce733a9a88314f868c3ff97fc0300aaf90301aaL8;FFf40740919482099186c0ff97e1074091e043169102398052218009", - "915d78009488220791d800805294018052000540ade893687915008092e8e30a79e057813dBBBL4;FF58b80194e0031baa210080523400805255b80194c0fdffb4e10315aae2031baae00b00f95bb80194e00315aae1031baa220080524fb80194f52740b903000014L4;ZDL8;FF59b80094c00b00b40805", - "805216000039e1230091e88300a9800240f9f60f00f91bd2ff97e003152ae123009118d2ff9796224039f50f40f9e80740f9df0a0071BL8;FFa00200b0006029915d380194a00200b000c009915a38019408004039a90200b029213491e00301aa08711d5308410051081d7d92226968f8a90200b0290135", - "91L8;FFe00314aae1031baa2200805259380094ea5348a9fb0318aaf56b00f9c8fe60d3e95740f9f703162a35fd48d3f603082a50000014e8e743b9ebc30d91ea0f42f9BBBBBL4;FFe9a300a901ffff17e90b41b2e9a300a96cffff17c80080d20800f0f2080500d1f9feff17c80080d20800f0f2080500d", - "163ffff17c80080d20800f0f208090091L4;FFe0230091e10316aa220080522300805224008052f6df00a9f60f00f93ae9ff97ea2341a9eb058052e90740f9160500914b692838290116cbf60f00f99f0209ebL8;FF490200f02b411b91430200f063881991a92300d1460200f0c6c01a910a01805247020", - "0f0e72c1091e00308aa22028052e9af00a9c4008052ea0300f993080194BL8;FF6b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0500916c8e40f90c0100b48c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c050091L8;FF59880094e00b00f9a01100b455880094e00315aa41", - "00805253880094e00700f9e01000b44f880094e00315aa410080524d880094401000b4f70300aa49880094BBBL4;FFa26301d181b1ff97a0f2ffb41f000014a06301d1dcc80094fa0301aa80f5073641000014fa031faa3f000014280b0091fa4700f905000014e80b41b2e04700f9L4;FB5265636569766", - "564202d3e2043743153616d706c6564002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d6235386437L8;FFe10315aa220080525ac80094bc0000b4e06f40f9e1031caa2200805255c80094fa031faa762201a9080080927a0600f93ffaff1729008052e96b00f9", - "880100b4BL8;FF420e0054f42300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889a152300a9f7fbffb5f62b40f9f51f40f996000037d80200d0L8;FF73ebff97e103162a680640f9df0202710801148ba3feff54e90f80123f002071ea0f801229140033c20000542a7c0", - "653090500394a051a320a01003912000014BBBBL4;FFc90300d029c10d91ea830291a04700d1e8270ba9e8530291c90300d029b10d91a10302d1e8270ca9e8f30191e8270da968008052e9030090293d3b91682703a9L4;FB456e636f64654572726f7272656d61696e696e6700000000382140000000000", - "020000000000000000800000000000000f8a34000000000008c21400000000000L8;FF603a00b5a0c303d144e7ff97e80301aa00040036883a00b5e1031faab2ffff17c1220191a2c303d158e6ff97603d00b5e1031faaacffff17a2c303d1630c8052BL8;FFe10316aae20313aa2300805224008052c75a", - "ff97b6835ef8b7835df8e80216cb7f0208eb89f8ff54a0a300d1e10316aae20313aa2300805224008052bc5aff97L8;FF0a0380d24801009008a92c91690480520a00f0f2e8a716a95a1100d1e10740f9a1e6ffb59efdff17400100b000801491430100b063200991440100b084601591BBBL4;FF4200805", - "2a31336a9041b0094a8c302d1a0820091e10314aac3800094a85775a9b40356f81f0500f121010054a81e00121f050071ac08005468090035b41e4092L4;FFa30003cbf4ffff175f000a6b41feff54221440f9e80040b95f0008ebc9fdff545f0060f142908b9ae20000b9eaffff17220000b0660500b4c5", - "0840f940000f91L8;FF3ae7ffb4eb430391ea8300915f8300f16081c63c6181c73c690146f8688148f84081823c4181833c600542ade92300f909048052488104f85833899ae00701adBL8;FFc0035fd6ff8301d1fd7b04a9f32b00f9fd030191090040393f050071810200540010c03ca9730039a973009", - "10a0000b04ac10691800200b000643991e92b00a9L8;FF8101005408018052baffff17a0c300d101048052e2031baaf70315aaf50314aaf40316aaa5eaff97b9db7da90bfcff17f6e742f9fb074bf9f90b4bf9fc0f4bf9BBBBBBBL4;FFf80315aa0088202e0800669e17c10192f70000b5008f40fc5a2300", - "910088202e0800669e17c101f260ffff54e802c0dae91340f90811c0da200540a9530f488bL4;FFe0030091e3018052f40308aadc110094e80340f9f52b41a9f62741291f0900b181010054d78209aa5f1100f161010054b60240b9b70000b4e00315aae10317aaL8;FFf44f43a9f65742a9f85f41a9fd7b", - "c4a850feff17560014cbd50213ab82050054a9fe4ad30a0880522911c0da490109cbea0080523f1d00f129318a9a2a008052BBL4;FFe95f5339eb635339fb121e38fb425e38e8221e38e8525e38fc321e38fc625e387b031e4afe4b40b9fb421e38fb725e3808011e4afe5340b9e8521e38e8825e38L4;ZF", - "L8;FF680200f9f30b40f9fd7bc2a8c0035fd6fd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090040f9BBBL4;FF1b0880525ac31991e0031aaae1031baae2031f2ac0023fd61f0000f1ad0000547b0300eb032d00545a03008b060000141f0", - "400b1812c005471dc01941f100031L4;FB0b00000000000000426f6f6c56616c75650000000000000088114900000000000900000000000000446f75626c6556616c75650000000000a811490000000000L8;FFf4031eaae6030caaef8f00f9ebb344a9e87700f9f9fb42a9fc4340f9f74f40f9ef3b40f9e", - "8030aaaea0b40f9e96340f9f6030daaed0307aae72340f9f57b40f9BL8;FFe057813de15b813d99000014e8074091f6b345f90023009108810991809e0094e1074091e04316910242805221800991585c0194e01fc53de123c53db8008052L8;FFfd7b14a9fcab00f9f65716a9f44f17a9fd030591e10b00", - "a9480100b0e40b00f908b140f91f0900f1830b0054155040a9f60300aae063009102048052f30303aaBBBBL4;FF1d000014546bf8381406f836e08741ade8430c9100810091e1430191022e8052e08718ad5bfc0194a80a40f9890240920a2300d14a011b8ae1430c9102328052L4;FB69676e616c2f7275", - "73742f70726f746f636f6c2f7372632f646f75626c655f726174636865742e7273002f72757374632f343861323239636561656664343938L8;FF5cfc0094e00313aae01300f9410200b021341a91430200b063841a91e08300912202805264008052b3f0ff97e11340f94cffff17fd7bbaa9fc6f01a9fa6", - "702a9BL8;FF602a40f9220080525a7c0194613240f9742600f93f0400f18b000054603640f922008052537c0194613e40f9743200f93f0400f18b000054604240f922008052L8;FFe0630091e1031baae20319aa23008052240080523692ff97fb1740f917fbff17e0630091220080522300805224008052", - "2f92ff97e11740f91efbff17e0630091BBBL4;FFe10314aa220080525abc0194e10740f9d70000b4e00318aae10317aa2200805254bc0194e10740f921edffb4e00316aa220080524fbc019465ffff17a00301d1L4;ZBL8;FFfa6751a9fc6f50a9fd7b4fa9ff430591c0035fd6c20100b042201791c50100", - "f0a5c03491e1030191e0031f2ae3031faacabc0094c00100f000203591c30100b0BL8;FF130500917f0209eb69240054080c47f81f0500b1201d0054e2feff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebL8;FF69d20391e83342b960620491e1630391022", - "7805276f200b960428f3c681601b92105803d5b3c009424000014e8030d9114000014687240f9481600b40805088bBBBBBL4;FF1f0101ebe0200054680640f9090a80522a0400916a0a00f909692138e10313aac0f7ff97805641b980010034610a40f9680240f91f0101eb60200054680640f9L4;FF2905", - "00d158012b0b0a7f08534afe073608008092680200f9f44f45a9f65744a9f85f43a9fd7b42a9ff830191c0035fd6940100b44b0c0094e00314aa21008052L8;FF39faff97a8c35e3848030036a8d35ef8a9535ff8884200f80800801289c200f8880200b9f44f45a9fd7b44a9ff830191c0035fd66900805", - "20300001469008052BL8;FFffa31ca9e8030591e05b803de067803dffab1da9ea2701f9ea3f01f9e9d300f9a8831ff8b4835ff8820640f9620600b4810240f9200080398000f8b728040091L8;FF080500913f0308eb2a45007861ffff54e8031faae9031faa8a060091ea1300f91f0308ebe00000544a6b", - "6878081100915f21296b2905009140ffff5467030014BBBL4;FFe82f40f9130540f91301f8b6f7031faae00317aae10313aa63cc0194ff4b00b9130080921b000014e82f40f9081140b9e82f00b9730200b4e61f00f9fb03192aL4;FB726576696f757320726f6f74206b65792070726573656e742077686", - "56e2073686f756c642062652065726173656441757468656e74696361746f722070726576L8;FF6083c63ce173813d6183c13ce25f813d6283c73cfabb42f9e077813d6083c23ce163813d6183c33c5f0700b1e81303f9e27b813de067813de16b813d40490054BL8;FF84002991a24700d1e1068052694c", - "019420008052e1028052634c0194c20200b042a03e91e0031faa744c0194fd7bbca9f70b00f9f65702a9f44f03a9fd030091L8;FF0a2440f9aa0600b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4b0500910a3040f96901098b0a0100b44b0140b26b11c0da6b1540d26b0d0b8bBBBBL4;", - "FFe3630091f5a301a9f4a302a976ec0194e0020035e003c03de80b40f96082803c680e00f97f0200f9f44f46a9f65745a9fd7b44a9ffc30191c0035fd6080100d0L4;FB09924800000000007b00000000000000480000002a000000000000000000000008000000000000000800000000000000387942000", - "00000000000000000000000L8;FF610a40f9e00315aadfffff17fd7bbca9f85f01a9f65702a9f44f03a9fd03009148008052f50301aae10302aa000d002af30302aacaebff97b73240b9b70c0034BL8;FFe10200b021483191e30200b063043191a0e300d18203805224028052b6600094ba835cf8e18347", - "a9f86749a9f6df4aa95a0200b43f0400f16b00005422008052L8;FFe8030091ff2301a9b5dcfe9740030035e003c03de80b40f96002803d680a00f9fd7b43a9f32340f9ff430191c0035fd64c6c0094c0008052210080524a6c0094BBBL4;FFffff0039e80319aa02fd46d31ae17a9219154092e20000b4e", - "83340f980030191e10318aa0801028be83300f984ac0194e003009101031a8be20319aaf9ff0039L4;FF4b018b9a4c018c9a7f0271f24a018d9a1f0052f26d6218538a018a9a7f0206720ccc74d36a018a9a6b6e1b531f1d00724a210daa8c016d924d008052720a1b12L8;FFe123019102308052a022009", - "1a80200f960ac0094b38a01b9e10314aadbffff17e91f40f948008052e0830791f30301aa28210039280100f9b4a5ff97e10313aaBL8;FF8c2c0194e8fb40b9e97b40f93f00086be8279f1a1f0009ebe9a79f1a0901891ae80200b0a905003608b140f9e92740f91f0500f109030054c8fffff008912891L", - "8;FF20a10b91c804ff97e8034bf9fc074bf9fb0b4bf91f0500f121010054881f00121f0500718c030054c80900359b1f4092fa0f41b2e8031baa540000147f8702f1BBBBBBL4;FF690240f9e10313aa54692838080500911f0048f1680a00f9a3fdff540b7c0e533f0108eb7361193220010054536928380", - "cfc5cd308050091290040f9280800f9L4;FFea7702f95a0c0094e007409100401d9180f2ff971400001408018052f6af4bf9f7b34bf9e9830a91e8830a3928008052e0230891e143139142008052e96b02f9L8;FF5f140194600200b0000032915c140194600200b000e0309159140194600200b00020309", - "159140194600200b00040319153140194600200b000202f9153140194BBL4;FF79ffff17fc0301aafb0300aae0230091e10319aae2031caa2300805224008052c386ff97f46741a9e1031baae2031caa8002198b57940194e0031baae1031caaL4;FD10304a0000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000L8;FF080140b20811c0da081540d2080d088b0825019108fd46d315050091681a40f9080a00b4080140b20811c0da081540d2080d088b0825019108fd46d316050091BBBL4;FFa08316f8040000", - "14880080d20800f0f208050091a08302d1a80316f874c90094f50300aaf95340f9f71800b5cc000014880080d2f51700f90800f0f2af000014L4;FB5a2e5fe2fea5ca5700009cb37d55b2cc0d77708da9fc9d0e00008691a48b9079000034f200008e416dc05bb5716b5b831f32a1133a41d5a392c40dc42", - "7c5ecf1L8;FFfed300f9fe030faaef0319aae92311a9f90306aae6031baae9e342f9eefb00f9ee0310aaf1a34ca9f00305aaf5a70fa9e5a74da9e1030eaaf50314aae9ab18a9BL8;FFe14316910881099100e1029137100094f87f49f9b80300b4e1d342f9e8cb42f9f97b49f91f0101eb40440054e8cf42", - "f9490380522a040091e00318aa09692138L8;FFc80080d2fb4340f9fa8302910800f0f21c4500910a000014e087c13de17fc23de80345f9fc5b02f9e037813d6182803ce86702f9e0833291dcedff97f5f742f9BBBBL4;FFfa674fa9fc6f4ea9fd7b4da9ffc30491c0035fd6f52b40f9f68346a9bf0600b1", - "20060054f42f40f9bf0a00b1c0fdff54df0600b1a00f0054e01700f9f73f40f9L4;FBae2b12b9260000001fb0480000000000690000000000000003000000054918d08fbdfa83e00c29f8f8073a22ef35df2bea903aff81af03ccbc45c6e93a000000L8;FF210200f021081d91230200f0639c1591e00300", - "9142018052840080521a000014210200f021081d91230200f063341691e00300f9e00300914201805244008052BL8;FFe14340f9fc5740f9fb6b5429e8c301910c600094e87340b91f050031e0050054380c00b4e00316aae10318aa22008052507401945c000014b6035df8d7ffff17L8;FFe18f49f93f0", - "400b140010054810000b4e09349f92200805256740094e19b49f9810000b4e09f49f92200805251740094b30000b4e07b49f9e10313aa22008052BBBL4;FFa003d53ca103d63ca203d73ca303d83ce31b803de217803de113803de00f803d50b4019400028052210080524eb40194600300b4e003c03df60", - "300aa0000803dL4;ZBL8;FF6801088b08050091290308eb41020054f50302aaf80300aaf7031faae8031faa1d000014f6031faa0001805299eeffb5f80300aaf5031faaf7031faae9031faaBL8;FFc01b00b5a02302d17cecff97c010003601efffb4e1000014c02300b5a02302d176ecff974010003641e", - "effb421010014e18f0cb96fffff17a88357f8080540f9L8;FF6c0100543f040071600300543f08007161020054a1e20391a22302d154f3ff97802a00b5e1031faae7ffff173f0c0071800300543f10007121010054e02c00b5BBBBBL4;FFa91d40d208010a8b6901098b0acdcaca0881c8932bc1cbca4901", - "098b6801088b2abdcaca2981c9930badcbca4801088b6901098b0acdcaca0881c8932bc1cbcaL4;FF1f1100f1000400541f1900f1614c0054880240f96aad8c522aefac72090140b9080940793f010a6ba9cc8d520001497a414b0054810a41a9e0e30691996a42a9L8;FF810000b460da40f92200805259", - "04019460220091f30b40f9fd7bc2a8bbfdff17fd7bbea9f30b00f9fd03009101c840f9f30300aa810000b460ce40f922008052BL8;FFe92300910a0000b04a511991e8a700a9020300d042643f91ea0f00f9e343009171840194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000b0L8;F", - "F424039912100001408200091410100f021681b91e80300f9e8230091e00309aac20180528e840094620100d042c039911600001408200091410100f021181891BBBL4;FF031800546a0340f9e0c342f94801088b682700a908fc60d3a80600b5020840925f1800f1a2060054017c0353c1060034e062009", - "1a3a300d1640c805298b9ff97L4;FB5500000000000000ce000000010000006d6573736167655f656e63727970743c6e6f6e653e6d6573736167655f646563727970745f7369676e616c6661696c65L8;FFe0b343f91f0400b1200f0054eb831d91f7430d91ed031baa681142f869d140786091c33ce1f7c", - "13de2efc13de3fbc13de8bb01f9e8c743f9f4031aaae0d7803dBL8;FF291540d2290d098b2925019129fd46d3290500912001088be10313aa08fdff97f502003574040034610a40f9680240f91f0101eb60040054680640f92a040091L8;FFe89741b92083c13cec030b918033803da10900548031c03de8", - "c302b98b4100f8204b803d8ac100f8204bc03de8d342b9090100b0296118918101c03de01b40f9BBBBL4;FFe80301b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebc30001541803008bL4;FB64656372797074696f6e", - "206661696c6564696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a2073686f756cL8;FF0228805200810091fc030b9161e40094fa4340f9e8b345f9e0d7c23df40300f95f0f00b1e80f00f9e8079f1a9f0600b1e083803c60090054e9a340393f03096", - "bBL8;FFe1031baae20319aafa0300aa616401940800001436008052771640f9f7fcffb538008052792240f919feffb53a008052682640f99c5200b9955a00a9955e01a9L8;FF6c42ff97f42344a91f0114eb23100054e81f40f9e10315aae20317aa0001148b5c640094e90344a9080009eb630e0054ff02", - "08eb68080054340117ab420e0054BBBL4;FF8dfbffb5f9ffff17200140fd00a8200e0b00669e6b01c0da6b11c0da6bfd43d3ec020acb6a010acb4a010cca4a01088a5f2100f162fbff540afc79d32a693738L4;FFe103022ac200010b400400510000014a1ffc3f714dffff5480804039e20304aaa120403", - "900100012000400111f00036b00d0831a0004005101100033a1200039L8;FF00400e915ea40094a00100d000001c915ba40094800100f00000149158a40094fd7bbea9f30b00f9fd030091010040f9f30300aa1f1800f93f0400b140010054BL8;FF68020039fd7b41a9f31340f9ffc30091c0035fd6e907", - "40f9690600f97f020039fd7b41a9f31340f9ffc30091c0035fd609004039e80301aa8a0200b04a550191BL4;FFe10315aae20313aa70240094c0feff35f60319aac18e5ff8810000b4200340f922008052532400948002c03d880a40f9c002803dc80a00f9f30200b4e00315aaL3;FB00100000000000000", - "010000000000000010000000500000000d009000000000000c049000000000000c049000000000070500000000000007050000000000000BBBBBBBBL4;FF292100910801148a206b68fc00a8200e0a00669e0afcffb5f9ffff17200340fd00a8200e0800669e0801c0da0811c0da08fd43d3deffff172200", - "00f042600f91L4;FF21602791c3000090634c2891a0c300d16203805224018052b712ff97a1035df8e80341a9f6df42a9f45744a9e10200b409008092690600a9880000b4e10308aaL8;FF280080529f0a00f99f2200a9f44f42a9f65741a9fd7bc3a8c0035fd6f6031faae00316aae10313aa5f1e019408", - "fcdfc8080940f91f0500f1e0179f1ac0035fd6BBL4;FFdf0215ebf54702f9f84b02f9ff4f02f928090054f9031faae8031faad60000b40003198be10317aae20316aa599e0194e80319aa0801168b7f0700f1b60208cbL4;FF42000e8b261c41a90c3400a9282442a92a2c43a92c34c4a9424002f1690100", - "54661c01a9261c41a9682402a9282442a96a2c03a92a2c43a96c3484a92c34c4a9L8;FF140040f9e00301aa810100d021701e91e823009122028052a29e009488820191810100d021881591a40100b084a00a91e0230091a32300d1a2008052a8831ff8BBBL4;FFe00318aae10319aae2031f2ae0023fd61", - "f0000f1ad000054390300eba34100541803008b060000141f0400b12141005473de01941f100031a140005439feffb5L4;FB7374616d702e7273002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f757569642d31L8;FFe64f40f", - "9e98740f9e03340f9e3ef40f9f7af40f9ee4740f9fbdf40f9f19740f9fa1351a9e86b40f9e9eb03f9e1031d91e07f04f9e0430f91e20319aae8a703f9BL8;FF01088052f6ef07f9e0fb863de1ff863de203873df60b0ef9e36b873de367873de363873de35f873dad5e0194e05fc73de163c73de8074091e", - "26bc73de0074091L8;FFe20316aa72010094780a40f9b7ffff17e00313aa220080526d010094610a40f9bfffff17e00313aae10316aae20314aa67010094760a40f9680240f9080116cbBBBBL4;FFaa01409236011ab821419d3c01c1c43ca80a40f920419e3ca043da3c21019f3ca143db3c08010acb6a0", - "5009120419a3ca82a01a921419b3c2800809229008052L4;ZFL8;FFf65744a9fd7b43a9ff830191c0035fd6e20313aa030c8052eaf6ff97e10300aac0feffb5a80640f91f0116eb69030054e00313aa39fdff9700fe073728fc60d3BL8;FF2403009084a03091f6000014092000912103009021403d91a98", - "31ff82403009084c03c9126030090c6a0309103800091a52300d1e00308aac2018052a17e0194L8;FF5f7e0094e8031faa000117ab02720054e1630091d27dff977f0a00b100040054e11740f9e80f40f91f0101eb40500054e81340f92a040091e00315aa49018052BBBL4;FFa8831df8a0073faded2e00", - "94800500b43500805207000014807a35f8b5060091a08300d1b5831df8e52e0094c00100b4a8835cf8bf0208eb01ffff54f40300aaL4;FB6c69627369676e616c2d70726f746f636f6c2d613434636635613164633062366666632f6f75742f7369676e616c2e70726f746f2e73746f726167652e727300L", - "8;FF686200a9680a00f956be0094000480522100805254be0094200400b4c00641adf70300aa610e40f9000400ad810000b4601240f9220080524ebe009408048052BL8;FF290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54a00200f000202291543e0194a00200", - "f000602991513e0194a00200f0L8;FFa7000014c80080d20800f0f2080500d1a0c300d1a8031df87533ff97e10300aa7a000014e00700f90101009021a003910301009063fc0391e0230091a2008052BBBBBL4;FFcb000094770a40f96affff17e00313aa220080522300805224008052c4000094610a40f", - "971ffff17f50300aae00313aa220080522300805224008052bc000094L4;FF0a01092ae8c700f9f5000014e8c740f91a7d0853ef031a2ae13355a9ee031baafa9740f9eabf40f9eb0319aaedd740f9fba340f9f00318aaf70316aae8000014L8;FFea430039e91301b8e91b40b9eb6301b8ebc341f8ea570", - "039ea6b0039e9b301b8ea7f0039eb1300f9e82b00b98f0e0194fd7b44a9f32b40f9ff830191c0035fd6BL8;FFe00318aa21008052578e0194200500b4e10313aae20318aaf60300aa5d8e0194b3835df8acffff17e90313aaf54f43a9f75b42a9fb0f40b9f96341a9fc0340f9L8;FF9f0208eb69060054e0", - "0313aa080c45f81f0500b18002005488f2ff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebBBBL4;FFe20316aa2300805224008052c8c0ff97f82740f9e81f40f9080118cbdf0208eb29f5ff54e0e30091e10318aae20316aa2300805224008052bdc0ff97f8", - "2740f9L4;FB0b70f9efccc6545230458baf268b711645dd061128ea31f8f897dfcbda279d1878f1a28c05788f73f4657e8000009e631f3781786668be5c19652b1d1b9de8f4L8;FF74d601f9000500ade87740f9e083c03d69ce01f968d201f960ee803dff074091ffc30091f44f45a9f65744a9f85f43a9", - "fa6742a9fc6f41a9fd7bc6a8c0035fd6BL8;FF5c4e01945f0b00b1c1f2ff548082c23ce8bf40f9e0430691e1e30091022180528002803de8ab00f96082803c680e00f9584e0194e0430691e10315aa6ea0ff97L8;FF880200f9f44f41a9fd7bc2a8c0035fd6d30100b4534e0094e00313aa21008052514e0", - "094400100b528008052880600f909028052936a29f8880200f9f44f41a9BBBBL4;FF9f0200f98082803c880e00f9ab000054e00315aae10313aa2200805255ee0194df0600f16b010054e00317aae10316aa22008052f44f49a9f65748a9f85f47a9L4;FB6e206661696c65643a20726573756c74203d3d2", - "053656c663a3a5072656b65794d657373616765207c7c206d6573736167655f7479706520617320693332203dL8;FF1f0500b1810000549fde04a99ffe05a997fe06a981220191e20313aadaefff97400900b5e1031faad6ffff17e10314aae20313aa55ecff97a00900b5e1031faaBL8;FF11000014e803", - "1f2afa0700b91a020034e8000037e10200d021e81b91e00313aa62008052a96e0194e0000037e10200d021e01b91e00313aa42008052a36e0194L8;FF73110094e1d342f9abfeff17e0431691220080526e110094e1d342f92dfaff17e04316912200805269110094e1d342f98ffcff17e04316912200805", - "264110094BBBL4;FFa9635c78ac835cf8a88315b8a8035e78aa831af8aa135c38a9c3157869038052a8031b78680300d008813391a8a73ca9b7031cf80a0c0036ea27412948bf70d3L4;FFfd7b42a9ff030191c0035fd6200020d4fd7bbea9f44f01a9fd030091f40300aa4301f8b7f30303aa810100b4e0", - "0302aae10313aa250e0094600100b4e8031faaL8;FF1f05007180fcff543a070094d6ffff1748074079a0831f78e0430091a12300d1fc430091e8230079bdccff97df0a00f1830b00548806168b54034079f303002aBL8;FF840200f084a01491e2833291e1068052e85306f9e95706f9662e0194800200f", - "000c01391820200f042001591e1068052712e0194800200f000440691820200f0L8;FFf44f42a9fc5741a9fd7bc3a8c0035fd6e8434e391f110071c00100541f0d007101f9ff54f4d341f9f3cf41f9880240f9680000b4e00313aa00013fd6810640f9BBBBBBL4;FFff0208eb68080054340117ab4210005", - "4f42300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889a152300a9f7fbffb5f62b40f9L4;FFe8431391e0031baae10316aa3321fe97ec6b42f9e96f42f9e87342f9f67742f9eb7b42f99f0900b1410e0054e8d700f9e9c300f9ebcb00f9b90000b4e0031baaL8;FF087d0", - "4531f1900710419417a01010054080c40b909144079284108aa29008052e903092a202108aac0035fd6e9031f2a202108aac0035fd60928402909290029BBL4;FF1f030071a012969ad512959abf6d0094fa0300aae00315aafc0301aabb6d0094950317ab02240054f80301aa360015aba22300549601f8", - "b6fb031faae0031baaL4;ZBL8;FF0801098b130500917f0209eb69240054080c47f81f0500b1201d005487faff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b08050091BBBL4;FFf9031caa228f40f822f9ffb5600200145f2800f1880000542800028b08f1df38c839f837e083", - "0091263f0094e82340b9a8550037e81b40f92a0740f9490108ebL4;FB8073460000000000000000000000000000000000000000000100000000000000e021460000000000b11c49000000000055000000000000002901000019000000L8;FFea7300f9f00315aaf57b40f9ea0300aae00312aaf20304aae0", - "f3803df9030faaed0317aaef031eaafe0310aaf0030aaaea0314aae40308aae8030eaaee0311aaBL8;FFe8cf49f91f0500b180b5ff5481e20491b4010014e1d342f9e8cb42f91f0101ebe0770054e8cf42f949028052f6074091d6820991f4031baa0969213828040091L8;FFe97306f9e87706f96656009", - "4f3f742f9e8ef42f9e0dfc13de1e3c13de2e7c13d7f0208ebe02b833de12f833de233833d6190ff54e0631791a38cfe9780fcff17BBBBL4;FFe80340f91f0d00b120fdff5475da41a9e00740adc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315", - "aaL4;FB65737361676573656e6465725f6b65795f646973747269627574696f6e5f6d65737361676564656372797074696f6e5f6572726f725f6d657373616765436572L8;FF3f040071a00200543f080071000100543f0c007100fdff54e20313aa230c8052e8eeff97e10300aae8ffff17888241f81f05", - "00b1810000549fde01a99ffe02a9BL8;FF81010054ea0f40f9090180d20900f0f248dd7892290140b20a000014ea474039090180d2e8031faa0900f0f205000014090180d2e8031faa0900f0f229017fb2L8;FFec8352b98b0700346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0d00913", - "5000014eb031faa3e000014f3031faa0901098b0a0e8052f4cf42f9BBBL4;FF60030191e10301912200805208050091683300f98ab60194fa031caaf90315aaffff013942ff46d353e37a925a174092e20000b4683340f960030191e10319aaL4;ZDL8;FFaa2f7ea92901088b080500913f010aeba8831ff", - "808098052ea338a9a29010acb0a0e8052292d0a9b0a0480522a6100a92a2101a9377d02a93f3100b92ae903a9BL8;FF1c018052e81b41f91f0500b161f2ff5416008092e83341f9f93f00b91f0500b1a1f4ff5413008092f9d740f9f58b42b9f78f42b9fa1b00f959f6ffb53b008052L8;FFe6031f2a10f1", - "ff97e83b41f9fa6740f9f94308911f0900b1818300540801009008b140f91f0d00f143070054e8830f91e0432a91005efe97e8f341f91f0500b1BBBBBL4;FF4a92e4f2a0040054290114cbfb0308cb190e805229fd44d33a7dca9b09e179d33c1108cbe0030091e10314aa5da60094c80240f9a90640f97b", - "0700f1e00742adL4;FF810000f021800491131000b91f500039f44f42a9f50b40f9fd7bc3a8c0035fd600018052010380526a060094fd7bbda9f65701a9f44f02a9fd030091f50303aaL8;FF420080525b060194687a40f9a80000b4607e40f901f97fd34200805255060194688640f9a80000b4608a40f9", - "01f97fd3420080524f060194689240f9a80000b4BL8;FF8e5e05a9983200f98d6a00b981260e298a9a00b98b72023981d2893c88f60239f44f4fa9f6574ea9f85f4da9fa674ca9fd7b4ba9ff030491c0035fd620008052L8;FF3b008052e11340f9e0031aaae20318aa730700915f860094e0031aaae1031", - "9aae20317aae30315aae4031baab9d7ff97bf0213ebfb0313aa61feff54a8e301d1BBBL4;FFf40319aaf9031baafb030a2a55c60194e00313aa2100805253c60194602900b4e10316aae20313aae00b00f959c60194ea031b2afb0319aaf90314aaf4031a2aL4;FB47000000000000002b0100003b000000", - "617373657274696f6e206661696c65643a20216d73672e69735f656d7074792829000000000000007f60490000000000L8;FF2841082ae10b19ade127c23d699145b8e22fc23de417c23de00717ade02bc23de10fc23d3b8108aae97344f96b1147f8e00b18ade213c23de00bc23de9a301f9BL8;FFf4030", - "aaa630500946ba240a9ea0314aae10313aadeffff17ffc303d1fd7b0aa9f95b00f9f85f0ca9f6570da9f44f0ea9fd830291081c00121f090071e1010054L8;FF080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b4", - "4b0140b26b11c0daBBBBL4;FF2b7d4039ec3300f8ea0b00f98afd68d32c0140b9eb630039eb0340f929f140f86d3200294d7d10536b0600f92bfd68d32cfd60d36a2200796a7d1053693201b8L4;FB756d626572206f662070726576696f7573207374617465733a20c000204e6f2076616c696420736573", - "73696f6e20666f7220726563697069656e743a20c0392cL8;FF2102009021ac1b912302009063541c91e0030b91a2008052c40080523bffff172102009021a819912302009063ac1591a08311f806000014a08311f821020090BL8;FF33008052a8164038c91640381f01096be0179f1a71660194940600f", - "11300130a21ffff54e003132af44f42a9f65741a9fd7bc3a869660114f3031f2ae003132aL8;FF1f0500b14000005404010094745a45a9f60000b4f50314aae00315aaff000094d60600f1b5a2019181ffff54682640f9c80000b4090d8052e00314aa02018052BBBL4;FFf33300f9fd430191098440a9f3", - "0308aa020c42a9e8230091e00309aa117f0094e82340391f050071e1000054e84340391f0500714c04005428050035e90f41b2L4;FF40fc0388a3ffff35000080d2010080d2f35341a9fd7bc2a8c0035fd6734e00a9537820f8f4ffff17a4ddffb54affff17c01a00b4050c40f280000054000080d2L8;FF", - "290114cbbf0209eb88050054b50000b46002148be20315aa5ea60094e80316aa8902158be90f00f9e083c03ce90f40f90001803d090900f9f44f45a9f65744a9BL8;FFa3260114c10600b40a1440385f150071e1060054298400d13f8100b122070054490500b4ea0200904ab140f95f0900f1c3040054ff", - "8302d1fd7b08a9f44f09a9L8;FF0801148ba20100540101003926000014e00313aaf603012ae10314aae20315aaa6e8ff97e103162a680640f9df0202710801148ba3feff54e90f80123f002071BBBBBBBL4;FFbf3e00f148020054800642ad80020291e103009122008052e00702ad800a43ade00b03ad8", - "10240ade10300ad820241ade20301ad591a029400e4006f808200adL4;FF8082803c810a803d68520039f44f4ba9f6574aa9fd7b49a9ff030391c0035fd6a00000f000402d91691a0094ff0303d1fd7b06a9fb3b00f9fa6708a9f85f09a9L8;FFf65706a9f44f07a9fd830091335040a9f90300aa610200f", - "021802191420080529c0e40f9e00313aa80033fd6600000362000805253000014380740f9980900b4BBL4;FFe827403929074039f803002a1f01096be0179f1a719a0194e82b4039290b40391a03000a1f01096be0179f1a6b9a0194e82f4039290f4039f803002a1f01096bL4;ZFL8;FFfd030091ff4307", - "d100e4006ff30300aa5f0401f1960100b0d6c22f91e08303ade08304ad82000054e0c30191599a00945d000014c00640ad48fc46d3e9c30291BBBL4;FFe80340f9765e09a9e00314aa76620aa9e10313aa022b805268620ba9080180527f220ca9080480527f220da975220ea97cf200b9f44f47a9f65746", - "a9f85f45a9L4;FB6f2e70715f726174636865742e7273002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d31393439636638633662356235353766L8;FFe98700f9ec2b40f9f57b40f9e87700f9fe1b40f9e96340f9e86b40f9f1d300f9f1031baafb0312aaab0b00140823", - "40391f090071808700541f0d0071a19e0054BL8;FFf4cf42f9210108cb00510a9b33110094e00314aae10313aa30110094d50000b4a8e279d3e00314aa02018052011115cb505a0194e1db42f9810000b4e0df42f9L8;FFe8eb06f9e81740b9f98b06f9e8e30db9480080520801891ae99f40b9f48f06f9f", - "69306f91f01096bf49706f9facf06f9fad706f9f3e706f9f3ef06f9eaef0db9BBBBL4;FF75da41a9e00740adc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aa4ffa0194e08741ad28008052L4;FB4d657373616765207769746820766572736", - "96f6e20c0001941646472657373206d69736d617463683a2073656e6465723dc00c2c20726563697069656e743dc0L8;FFe08709ade28343ade2830aade18340ade18307ade28341ade28308ad002300b4e87b40f91f0500b160000054e0c30391abf7ff97e8bb40f91f0500b120140054BL8;FF24030090", - "84e00691a32300d182018052a8831ff8a47a0194a47a0194f44f43a9fd7b42a9ff030191c0035fd600c48052c0035fd6e10300aae00308aa79e9ff17L8;FF6901009029813f91f4ab04f960f18f3c8a0000102b7968784a090b8b40011fd603e4006ff6c744f90083c03c0183c13c0283c23ce007409100c", - "0359101088052BBBL4;FF0cadccca2801088b8b010d8b08cdc9ca6cc1ccca89adcc93ac93567829bdc8ca08010b8babb356382981c8ca280108ca89410b2aac5356b80bfd79d3f00308aaL4;ZBL8;FF2b154038080500f14c1540388b010b4a6001002a61ffff5487120094e17342f9fa03002a810000b4e", - "0031caa2200805250ba00945f1f0072f4c30791c00a0054BL8;FF093840f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8bL8;FF220080525b3a0094fc432a91b50000b4e00314aae10315aa220080", - "52553a0094753642f9b60e49f84e3a0094a0028052210080524c3a0094405501b4e80000f0BBBBBL4;FF020280528401805279010014089440f91f0500b1a1000054280080521f9c00f91fa012a91f4001b9481c00121f090071e1110054730040f9620640f9021500b4L4;FF21008052580a0094a00b00b", - "4e10316aae20314aaf50300aa5e0a00941c000014a21240f9020100b4a10e40f9e0630091e30316aae40314aad4010094f55342a9L8;FF2b6968384a090b8b40011fd6202040a96102009021800b91030d40f982058052fd7b43a9ff03019160001fd6a92300d1086000916202009042a40291e02700a9BL", - "8;FF3f140071200500543f18007181f8ff54e87f40f91f0500b161000054ffe70fa9ff8700f9c1220191a20301d17773ff97e0f7ffb44b000014e85b40f91f0500b1L8;FF7f0600316b060253097d18536c0e04534a01140aedc3971a6e1205536f160653495a69784a010d4a6d1a07530b7c8b0a6c7c8c0", - "a8e7c8e0a0821094a690a0353BBBL4;FFf52b40b9f44f40b9f30309aa13ffff17a00300d000203c9159ca0194a0a33ea9a00300d000803c91a30300d063802291a40300d084003d91a26300d141038052L4;FB000000000000000008000000000000000800000000000000400a4600000000000000000000", - "00000008000000000000000800000000000000ec0a460000000000L8;FF64ca0094ebbb40b9eccb40b9d40400143f0700b1e0010054f90000b4e0031caae10319aa22008052f50309aa51ca0094e90315aaf70000b4e00318aae10317aaBL8;FF02018052017d099b5a4a0194617e40f93f0400f18b00005", - "4608240f922008052544a0194619640f93f0400f18b000054609a40f9220080524e4a0194613240f9L8;FF5a000014e80300aa098d40f83f0500b1e0120054f30300aae00308aa06fdff97e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d3BBBBL4;FF1a7000a91b5001a91", - "86402a9155c03a9202101a93f2100a9810000b4e04340f92200805253ea0194ff430e91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L4;FB0800000000000000587c4200000000004f734572726f7200000000000000000008000000000000000800000000000000204c420000000000000000000000", - "0000L8;FFe10317aae20315aa230080522400805237000094770a40f995ffff17e00313aa22008052230080522400805230000094610a40f99cffff17e00313aae10317aaBL8;FF0200001433408052e00313aaf44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e00301aa010300902", - "1602891620080528c6a0114fd7bbea9L8;FFf81f00b95581fe97f89341b91f0b0071a1070054faa359a92083c13c2183c23ce00600ad808601ade8b700f9bc0000b4e0031baae1031caa220080524d6a0094BBBL4;FFf50301aa93fcffb53a008052f90b00f99bfdffb50900809228008052e083c63ce003", - "0291e85f1c29e85b1d29e83f40f9f41700f9f57308a9f54f09a9fa4f0aa9L4;FF7f0900f1a0030054ae09c039df0501318cd58c9a7f0d00f100030054ae0dc039df0501318cd58c9a7f1100f160020054ae11c039df0501318cd58c9a7f1500f1L8;FFa19e40f9810000b4a0a240f92200805258aa0094a1", - "aa40f9810000b4a0ae40f92200805253aa0094a1b640f9810000b4a0ba40f9220080524eaa0094680240f9BL8;FFf4e351a9180200b49922009104000014180700f1396300916001005421835ff881ffffb4200340f922008052512a0194f8ffff17e8e322910081cf3ce8e344f9L8;FFe80356b9e8ff3f3", - "9e807409108011891d72a0094e1074091e0833f9102c48052210018915b2a0094e00bc73de10fc73da0873dad4b2a00940004805221008052BBBBBBL4;FFfa670ca9f85f0da9f6570ea9f44f0fa9fd830291081c00121f09007181010054550040f9f30302aaa20640f9e20100b4f40301aaa10240f92000", - "8039a001f8b7L4;FF1dc4ff97e08b00b9a04700d11ac4ff97e08700b9a04700d117c4ff97e08300b9a04700d114c4ff97e07f00b9a04700d111c4ff97e07b00b9a04700d10ec4ff97L8;FFbf25007129c100110b819f1adf7d02710954003949c100110a819f1a0958003969010d0b4a114e0b29c10011cb", - "0d00122c344039095c003949c100117f250071BBL4;FF080116cbff0208eb28230054970100b48002168be10318aae20317aa5d920194d602178be00318aae10317aa22008052f60f00f94f92019402000014f60f00f9L4;ZDL8;FF21881591840100d084a00a91e0230091a32300d1a2008052a8831ff8a", - "292009468220191610100f0219c1591840100d084200b91a32300d182008052a8831ff8BBBL4;FF68680a9b1c2940a90b2541a9eaaf03a90b2942a9e91700f9e90338aac402098bea0f00f99f0018eb0a254629eb3b00f9ea2700b90aad43a9e90700b9ea1b00f9L4;FB9e12a28c8ee578940000aab5409a", - "1f48b911523a9cc27b6f75948df2bb4c89b684d4d43b935d81b3bf6d7914105cfeb39fd5846b834dd1b69274d4bb3dd70e6bL8;FFe83b44f9eb3744f9e84300f9e83f44f9e82300f9e84344f9e8af06a9eb4744f9e84b44f9e82f03a9e85744f9eb5344f9e8d300f9e85b44f9eb230ca9e86744f9BL8;FF6", - "4110094e1d342f95efdff17e0431691220080525f110094e1d342f984fdff17f40300aae04316912200805259110094e1d342f9e00314aa83fbff17e0431691L8;FFfc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff032ed1f30308aaa83340f90a0100f04a212891ff0300f9a96b40b9e82f", - "00f9ea4302f9ea4702f9BBBBL4;FF683200797f7e00397fb201b8ebffff17ec8306a9a8e300d1e13f00f9808640a9ef2f04a9ea2b00f9eea70b29ed6700b9f5cb0094a8835c38aa135d381f050071L4;FB6f6e6d697373696e67206c6f63616c2066696e6765727072696e746d697373696e672072656d6f", - "74652066696e6765727072696e746661696c656420746f2064L8;FFf92300f9f85f05a9f65706a9f44f07a9fdc30091081c00121f09007181010054e00302aaf30302aaf40301aa3bf1ff9720020037750240f9a80640f9160101ebBL8;FFa99316384901084aaac35638a9a316386901084aabd35638a9b", - "316384901084aaae35638a9c316386901084aabf35638a9d316384901084aaa035738a9e31638L8;FFe14316911d0f00949f0600b180000054c0020291e1431691a8140094e8b349f9f4074091948209911f0500b18000005480020491e14316912a130094e8cf49f9BBBL4;FFe1b20094f80301aae0e307", - "3654000014f8031faa52000014680b0091b8831bf805000014e80b41b2a0831bf802000014680f0091a04301d1a8031bf86ca70094L4;ZBL8;FFfa6749a9fc6f48a9fd7b47a9ff430391c0035fd6a00100f000c43a91a20100f042803b918102805273b20094a00100f000c43a91a20100f042e03b918102", - "8052BL8;FF020180525b320194e00315aa010980520201805257320194e0c31d91e1c32291022880525b320194e0c32791e1c31d91022880525732019448058052a9020090L8;FF3f0400f1ebf3ff5408028052e06a68f822008052573200949affff17c80080d20800f0f2080900912effff17fb6b4ca9f", - "9430891f8c30d91f7432a91e8f341f9BBBBBL4;FF29008092880a00b928008052890200f968620039f44f4ea9f6574da9f85f4ca9fa674ba9fc6f4aa9fd7b49a9e923486dffc30391c0035fd62004009000c01091L4;FFe10319aae20315aa23008052240080523de3ff97b6677ea9b7835df8e6ffff17f9", - "5f03a9d9a20091fb5b02a937835ef8d70df8b7f70200b435035ef849020094L8;FFfd030091f30301aa14e0009104000014730600f194c201914003005481825cf83f0400b140010054810000b480025df8220080524f02019481025ef8810000b4BL8;FFc0035fd6010300f021702991820080529682011", - "4ff0301d1fd7b01a9f51300f9f44f03a9fd430091080040f9e00301aa14cd40a9e803009191820194b30100b4L8;FFe20bc03de30fc03d830e803d820a803d8106803d8002803d682600294809c05a6909c05a682601298809c05aa909c05a68260229c809c05ae909c05a68260329BBBL4;FFf65704a9f4", - "4f05a9fd030091ff0311d1ff0300f9fb0300aaf40303aa698f41f8f803012af70308aae21b00f93f0500b160050054086041b9490080521f010071L4;FB655f726174636865742e727300136661696c656420746f20646563727970743a20c00076656e646f722f6c69627369676e616c2f727573742f707", - "26f746f636fL8;FF4083813ce107813de81f02f9e91302f9f527f8b7552b00b452c20094e00315aa21008052390080524fc20094202700b4e10318aae20315aaf60300aa55c20094BL8;FF080116cb9f0208eb69f8ff54e00313aae10316aae20314aa5e010094760a40f9bdffff17fd7bbca9f70b00f9f6", - "5702a9f44f03a9fd030091f30301aa210840f9L8;FF02c1853c438942ad01c1823c00c1813c02c1843c03c1833ce80b40b9400504ad418147ade8a700b9e81340b9430905ade4838a3c8001803de8d302b9214b803dBBBBL4;FF0f0000141f0400b141c200547ce201941f100031c1c10054f9ffff1779e2", - "0194f70300aa1f0400b141fdff54e04305918100805274e20194a0c00035e85341b9L4;FB6e0000002e0000001ced4800000000006a000000000000000200000026000000000000000000000008000000000000000800000000000000f489430000000000L8;FF080080923f0d00b16082803c680200f9a0", - "020054e0431e9142dcff9712000014e0dfc13de8c343f909008092690200f9fa031c2a6082803c680e00f9e1b340f9BL8;FFe10200d021803f91144c00a91f800039f44f41a9fd7bc2a8c0035fd600018052010580526b620194fd7bbda9f50b00f9f44f02a9fd030091f30302aaf40301aaL8;FFc0035fd", - "6f30300aae00301aaf40301aae10309aa220080526d050094880a40f9e00313aae10314aaefffff17e00301aaf30301aae10309aa22008052f4030aaaBBBL4;FFf70b40f9f65742a9fd7bc4a8c0035fd6e90f41b2e80315aa06000014e91741b2f4030aaa03000014290480d20900f0f2095100a9098c815", - "2e00313aa01c48052L4;FF73fe44d3c90300546106009124c59c5264eda072030000f0207c0253634004910004412a020000f042c002910008402a0010402a0020402a05040011a000200aL8;FF8200805299a20014080040f9e00301aa090140f93f0900b1a1000054810100f021fc15918200805290a20", - "014ff8300d1fd7b01a9fd430091810100f0210c1691BL8;FFff830191c0035fd6000440ad8a0200b04a210e910a0000f9000500ad3f7d00a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6e8230091090000f029c11c91BL4;FF68018052f30300aa818e41f8290041d23f0000f12841889a1f2d00f1a", - "2010054680240f9a80000b4600640f901e97bd3020180524f220094e00313aa01098052L3;ZBBBBBBBBBBL4;FF000140fde1031aaaea031baaeb031faa0c098052ee0317aa0088202eef0308aa0d00669eb0c10192edef7fb2300100b57f2500b1680d0054e08d40fc6b210091L4;FF2b0440f900fc78d37", - "369283808050091280800f9c00400b5e0030aaac6ffff17e10300a9e00301aae10309aa220080522300805224008052f4030caa32000094L8;FFc0035fd6a80f00f9e8230091090000d029c11c918002009000380691e82701a9a86300918202009042401b91e1430091e82702a95d1f0194c4fbff978002", - "0090BBL4;FF420300f042402c91e0031faae1031baa7a9f0194420300f042a02c91e0031aaa769f0194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091L4;FFff003f7121ebff54740214cb620282d2b902028b21cc74923903148b3acf74923f001aebe10300541f0400b100f8ff54", - "c21240f9014000915a5300d139ff4cd3L8;FF84201d91e0030091a363009142008052a80f00f9a49f0094810100d021341b91a40100b084200f91a3630091a2018052b30f00f99c9f00949c9f0094fd7b41a9BBBL4;FF57ffdfc8770000b57edf0194f70300aaff0600b180020054f843059199008052e00", - "318aae10319aae2031f2ae0023fd61f0000f1ad000054390300eba3600054L4;FB580700000500000045024900000000004e00000000000000aa0200002000000045024900000000004e000000000000009d020000150000004502490000000000L8;FF0a2044a9ed6f00f91b3459a9ec5f00f9e8cf00f90", - "b2045a9e8c300f9122046a9ebb300f9e89700f90b2047a9ebab1aa90bf840f9e84f00f90a2048a93f030bebBL8;FF695f0194ff8300d1fd7b01a9fd430091080040b9a01300d1a8c31fb8ae5f0194fd7b41a9ff830091c0035fd6ff8300d1fd7b01a9fd430091e80301aae00700f9L8;FF6a0a00f9096921", - "38e10313aa1bfcff97818a40a960008052e30313aa6dfaff97888240391f05007101020054610a40f9680240f91f0101ebc0030054690640f9BBBBL4;FF08010acb6a05009120419a3ca82a01a921419b3c2800809229008052880200f969520039f44f4fa9f6574ea9f85f4da9fd7b4ca9ff030491c0035", - "fd6a2820091L4;ZFL8;FF0c3900a96d190012211c0daa6bfdff363f0900f1e0fdff544b09c0394c0d00912e0d00d10c3900a96d19001221380daa4bfcff363f0d00f1c0fcff544b0dc039BL8;FF344c40a9210300b021e02491150040f9e2008052680e40f9e00314aa00013fd6e000003620008052f44f4", - "3a9f51340f9fd7b41a9ff030191c0035fd6a80240f9L8;FF0825019108fd46d30900088b37050091ff0208eb081b0054f8000014e11740f9e80f40f91f0101eb60690054f50314aae81340f9490b8052b30e4cf809692138BBBL4;FFfc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff030bd1", - "e10300aaf40300aaf30308aa298c41f83f0500b140010054e0030091f5030091792e0094L4;FB5a7b49000000000054000000000000008d00000014000000af7b4900000000004e00000000000000f904000019000000af7b4900000000004e00000000000000L8;FFe82b00f9641ac03de93700f9683a40", - "f9611a40f9e583853ce08700ade28f01ada00600ada20e01ade08b42ade41f803de84300f9a29202ada012803da85a07a9BL8;FF156502a9175103a9176104a9166105a9096100b9fb0800b4a8035ef81f011ceb80080054560b40f9586340b9360500b4540740f94b3f0194e00316aa21008052L8;FF1f1", - "900f1a21a0054017c0353c11a00343f0800716c0100543f040071600700543f0800716106005481620091e003082ae20313aa4efeff97200700b4fa000014BBBBBL4;FF490280522a040091e00315aa6a0a00f909692138e10313aac2faff97770a40f9680240f9080117cbbf0208eba8300054680640f9e", - "10316aae20315aa0001178bL4;FFe10318aa220080525a0f0094e0e30e9121edff97e0030e91bfedff97e8cb41b9f31b40f9bf02086ba2000054f53f40b9bf02086bf603152ac9c9ff54e0830c91L8;FFff830191c0035fd608004039202440a91f050071230d40f9cc000054680100356102009021f8389", - "16200805260001fd61f090071210100546102009021203991BL8;FFa00642a9e20314aa088aff9708fc79d3e1e7076f9a624039b96240a9e9031faa080d010e96d640a90a3280521c00188a296b7cfc208d282e0800669e17c101f2L8;FFfd7b42a9ff030191c0035fd6ffc300d1fd7b01a9f44f02a9fd43", - "0091a80100d008210191f30300aa08fddf88c8020035a80100d008e14039600240791f050071BBBL4;FF0a692138e1e30091e92700f9c5baff97a80e40f91f0500b160090054e12740f9e81f40f91f0101eb60270054e82340f91c69213828040091b73240b9b61640f9L4;FB8c62d40ae63074a2d6f9b98", - "1c268260bca012460c8bdd2d13e880188114a37cd30e4feb38cbc834db69dd4bb12bdafed4fb2a28ccacbdcc9263c073400004c61L8;FFe1032b91e3031d9162008052f86305f9f40310aae9a703f9e9af03f9e8b303f9d2c7ff9788018052eb2b5ba9e87300f9e9ab40f9e14740f9e82f40f9e77740f9BL", - "8;FFe8a759a9e80302f9e8031091e90702f9a80318f8280300d008b140f91f0900f103040054a80302d12900009029d12891e8a703a948008052c90200f029e10491L8;FF7f0f00b1410a0054a8008052a8ffff17404fc03da80359f814000014e8e322910081cb3ce8c344f94003803de8f304f94300001", - "4404fc03da80359f8e05344f9BBBBL4;FFa80200b9e8038052a9a200a975000014e8274729f35f42a9f40b40f91f010072083340b929119f1a3f01086b41010054df0e00b1a903005428008052e90300f0L4;FB2900000000000000fc0100002d000000fe924800000000004c00000000000000680f00001", - "d000000fe924800000000004c00000000000000890f000011000000L8;FFe003009122028052a400805209000014e00300f9210200d021441591230200d063341691e00300912202805244008052b1e3ff97e10340f9acffff17c80080d2BL8;FF3f090071e1000054ea0f40f9080180d20800f0f249dd78", - "92080140b205000014080180d2e9031faa0800f0f208017fb24a1d409229010aaa682600a9fd7b44a9L8;FFe8d302f9f89749f9f90b40f9780300b4e1d342f9e8cb42f9f99349f91f0101ebe0350054e8cf42f9490580522a040091e00318aa09692138e1431691ead302f9BBBL4;FF68220039690200f9f", - "5ffff17ffc307d1fd7b19a9fc6f1aa9fa671ba9f85f1ca9f6571da9f44f1ea9fd430691f30308aa082c40f9092040f90080c43c970280d2L4;FFfd7bc5a8c0035fd6fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30301aaf40300aaf7031faaf84b1432680217eb1f0118eb1631989a7f0217ebf597", - "9f1aL8;FFc0035fd648008052e0230091ff0f00f9ffa300a912f8ff97e88340a9290080521f0500f109000079e90f00f9a1ecff54e02300910af8ff97e00b40f961ffff17BL8;FF9f0b00b14102005435030036e0a350a9e20313aae17740f9081540f900013fd6e06b01f9e8c31791e16f01f9290c40f9e", - "1830b9120013fd6fcfb42f99f0f00b1L8;FFe90f80121f00207109140033c20000540a7c0653090500394a051a320a010039e0ffff17ea0f80120b7c10530a2c0633eb0000350b7c0c530a05003909090039BBBBBBL4;FF220080525b170294615640f93f0400f1cb000054605a40f922008052f30b40f9f", - "d7bc2a853170214f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091L4;FFe17302f9a10000d021402a91d8f2ff9754170094800080522100805252170094c05001b488008052e06f02f9a10000d021e028911a0000b9e3431391e00313aaL8;FFfd7b01a9fd430091600200d000801391630200d", - "063001391640200d084202491a20700d16105805262170194fd7bbca9f70b00f9f65702a9f44f03a9fd030091BBL4;FFfc0b40f9f65744a9f85f43a9fa6742a9fd7bc6a8c0035fd6a0c300d1a82b3da9ac73009420008052e10580525e97019448fc43d3e90300aaea0301aa4b0140f9L4;ZBL8;FF800100", - "f000c01c915d970094800100f000001c915a970094800100900000149157970094fd7bbea9f30b00f9fd030091010c40f9f30300aa1f2400f93f0400b1BBBL4;FF682604a9755200b9f44f4aa9f65749a9f85f48a9fa6747a9fd7b46a9ffc30291c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704", - "a9f44f05a9fd030091L4;FB6f6e65536f6d65646174616573656b637431436861696e506172616d730000006d61785f6a756d70617574685f6b6579726f6f745f6b65790000000000000000L8;FFe89342f9e87b00f9e89b42f9e8d300f9e89f42f9eb230ca9e8b342f9ebab42f9e8e300f9e8b742f9e85b", - "00f988018052eba30da92400001428a00791fecb00f9BL8;FFe19349f9f3074091738209913f0800b1800100543f0400b140010054810000b4e09749f92200805252570194e19f49f9810000b4e0a349f9220080524d570194L8;FFe85306f97a4cff97e10300aae15306f9e083329121010090212037910", - "2028052230100b0630003919e000014e05306f9e0833291210100902120379102028052BBBBL4;FFc1070054602241a9090d40f9e803009120013fd6e80340f91f0d00b141030054880200f9680080522a000014785e40a9f50301aa762240b94af7019400038052L4;FB74696f6e206661696c656400000", - "00000fe924800000000004c000000000000004b0a000009000000fe924800000000004c00000000000000810b000009000000L8;FF82060054217c0353a10600343f040071c00100543f08007161fdff54888243f81f0500b1810000549fe203a99ffe04a998fe05a981e20091e20313aad2f8ff97BL8;FF", - "0103009021282391040300f084400a91e0030091a3630091e2008052b30f00f9a1770194a1770194fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9L8;FF2083883c2383843c20010054e0f3c63de1074091e043169121800991f53309f9fb3709f9e09f843d0ac5ff97963b01b4e8074091c10", - "600d1e043169108810991BBBL4;FF24008052caa9ff97e11f40f9e81740f961ffff17e0a30091e10308aa220080522300805224008052c1a9ff97e92b43a960ffff17e0a300912200805223008052L4;ZDL8;FFfd830091010840a988008052f30300aae0230091040180520503805229f87fd33f1100f13", - "481889ae30314aa40000094e80740f91f0500f1e0000054e80b40f9BL8;FFe11fc13db47e0853e88344b9e063813de167813de8a305b96c080014f37740f99f0600b1001a0054e01bc13de11fc13de9830291e88344b9e1a30c9102278052L8;FFa142813ca8f5ff972c07001437008052789240f9f6c324", - "91980100b4758e40f950370094e00318aa210080524e37009440f300b4e10315aae20318aaf90300aaBBBBBL4;FF69020094e81340f9c80700b409fc79d3e82b41a9ed031faaec031faa200d010e82ffff170c69eb38ec07f8360043c43c0143c33c8c014092ed1340f96e2100d1L4;FF000180520104805", - "272070094fd7bbda9f65701a9f44f02a9fd030091f303032af40302aaf50301aaf60300aa4d07009400048052010180524b070094600100b4L8;FF0800f0f2081d00d11e0000141f150071000200541f11007141040054280180d20800f0f217000014e00313aa3b060094e80300aae8070036e00301aaf4", - "4f45a9BL8;FFfd7b0ba9fa670ca9f85f0da9f6570ea9f44f0fa9fdc30291093040b9f30300aaf40308aa3f050071c1050054680e433948070034693a40b96a8241392b010a0aL8;FFf40300aae81700f956870094002080520101805254870094c03a00b489c240f9f5031faafa031f2afb031faa0802805", - "298a2009136fd44d3370d409219038052BBBL4;FFe00704add40600b4fa0f00b9fa03152af5030aaaeb0b00f952c70194e00314aa2100805250c70194e01100b4e11740f9e20314aae00f00f956c70194ea0315aaL4;FB7372632f656e636f64696e672f766172696e742e7273002f636172676f2d726567", - "69737472792f696e6465782e6372617465732e696f2d313934396366386336L8;FFf6030daaf7030eaa5ac70094ee0317aaed0316aae00315aae10314aaf44f40f9e10000b422008052f5030daaf6030eaa50c70094ee0316aaed0315aa340100b4BL8;FFc00200b000201f9160470194c00200b000801f9", - "15d470194c00200b000e01f915a470194c00200b00040209157470194c00200b000a0209151470194ffc300d1L8;FF080040390901009029412e91e00301aa227968f8090100b029012091287968f8e10308aa91470014fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1BBBBL4;FFf95f40b9e", - "1db46a9b7fe58d333008052e903192a610100b4e02740f922008052f5031baafb031aaafa03092a51e70194e803192af9031a2afa031baafb0315aaL4;FB74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f6c69622e7273001b737071722076312e7365", - "6e645f656b2eL8;FFe8270b39f56301f945000014e06301f92102009021c8209123020090634c21914700001448008052e0230b39e8270b39f56301f9e5ffff17a80a00d1a10312f8BL8;FF218c2d91a32300d142028052e40314aaa8831ff8a4670194a4670194f44f43a9fd7b42a9ff030191c0035fd6f", - "fc300d1fd7b01a9f31300f9fd430091e90301aaL8;FF21fdffb4c01240f92200805259670094e5ffff17680240f9c80000b409e179d3e00314aa02018052211108cb51670094610e40f9e10000b4601240f922008052BBBL4;FF08f1df38a805f837a0c300d12d100094a8035db8280d0037a8035ef8aa02", - "40f9490108eb83100054ea0240f9a0835df84801088be80200f9a90200f908fc60d3L4;FF5f1040f2a2cc7492a1020054087c4093420100b427000090e7c00291a2cc7492087c4093424000d1e5d86078a53c7cd35f0005eb82010054240600b5340000b0L8;FF0232805263a70094e10740f9410300b4e0", - "0315aa22008052ffc30691f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a850a7001435008052ff0f00f9ffd700a9BL8;FF74270194fd7bbea9f44f01a9fd030091f40300aaf30308aa52270194000480522100805250270194200100b4800640ad08048052680200a9000400ad680a00f9L8;FFe20319a", - "afc0300aa62270094542340f9b4031df8b40100b58200001436008052571740f917fcffb538008052482740f91f0500b121fdff5419008092542340f9BBBBBBBL4;FF29fd43d32af17dd3490109cbc932899a1f0549eba90b00542a050091f30300aaa08300d15f0108eb011380520295899a7a000094b95", - "37ea9a1035ff8390b00b4L4;FFa003983cb70000b4e00318aae10317aa22008052571b0094e14740f9810000b4e00316aa22008052521b0094c80180d25f0700b10800f0f2a88319f800030054L8;FF591b0194000600b4e10315aae20313aaf70300aa5f1b0194f50317aac182009100008092d7820091b", - "d1b01941f0400f1200100541200001435008052c1820091BBL4;FF2803170b7a0a00110809c05a60430091a18301d1b6233529e8e31291b4573429fab304b9000301ad0003813c899b0194e8e312910001c03de81740f91f0900f1L4;ZFL8;FFffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa", - "810100b021e01891e8030091e00309aa420280529d9b0094810100b021a01691a401009084e00491BBBL4;FFa08301d1e1430591e0870aad84db0194a0077aada80302d1a203d83c167d4039b80302d1e0870aad00f1c03ce8030291e25f803d00f18f3c4adb019400088052L4;FB4c656e67746844656c6", - "96d69746572546f6f4c61726765496e76616c6964566172696e74526563757273696f6e4c696d69745265616368656400000000000000L8;FFe61340f9e0bf40f9f78740f9e9cf40f9ecd745a9e3b75ca9fa3f51a9fc4752a9e84740f9e9c703f9e1031d91e0b3c23de3af03f9e20319aae8a303f9e86b40", - "f9BL8;FF088109917ea80094e86352b9f86b52b908070036e93b49f9ea3f49f9e86f52b9f5cb42f9692a01a9e9d742f97822012908008092680200f9490d00b4e8d342f9L8;FFe10313aae20316aafa0300aa615b0094fcbf40f97c1500b4f3bb40f9515b0094e0031caa210080524f5b0094a01c01b4e10", - "313aae2031caae02700f9555b0094BBBBL4;FFeab742a9880700d1f0bb41a91c011ceaec0b40f9110a8052a1fbff549f0500f1ec0740f90001005420a9200e0800669e880100b40801c0da0811c0da880e488bL4;FB2f72757374632f3438613232396365616566643439383563353039393062313431313", - "66236643835366166303938352f6c6962726172792f636f72652f737263L8;FFb7f8ff97f7bb40f9ff0600b160350054fb0318aaf6e357a9b82100b4d922009104000014180700f1396300910021005421835ff881ffffb4200340f922008052BL8;FFff030291c0035fd6081840f9092040f90801028b08", - "1800f9a90100b408018052080109cb1f0102eb0b31829a7f1100f1a30200542a0040b98c0080528d0140b2L8;FF3b91ff97e11740f9e00316aafbfdff17e06300912200805223008052240080523391ff97e11740f908feff17e0630091e10317aae20316aa2300805224008052BBBL4;FFf7d30aa9ec434", - "0f908017eb2f72f40f9fb8308a9fc2303a9a87302d1bbc301d1080140b2ffe309a958008052e87f06a9ffdb0ba9f56700f9f32b00f9fa2f00b9L4;ZBL8;FF64bb009460220091e1230b9102398052740200f95fbb0094e0864aad60860eade08a4bad608a0fadff831a91f44f43a9f65742a9fc5f41a9fd7", - "bc4a8c0035fd6BL8;FF1f0500b181ebff54e8031faa080113abe3020054a00200d000a02a91583b0194f3031faa088c48f81f0500b121efff54e8031faa080113aba3010054a00200d0L8;FFf6fe60d30800f0f258fd60d314390091fa0000b4e00315aae1031aaa22008052f5030aaa533b0094ea0315aa", - "fa6740f9ff5700f9f5031faaf94308914f030014BBBBBL4;FF5afeff17e00313aa220080522300805224008052c6fdff97610a40f974feff17f50300aae00313aa220080522300805224008052befdff97610a40f9e00315aaL4;FFfdc30191f40301aaf30300aae0230091e103022af50303aa25030094a", - "8c300d1e00315aa4065fe97a8035df8a083dd3ca9835ef81f0900b1e00b803de91b00f9L8;FFc00000b508018052680600f9280080520400001400018052e8031faa600600f90a028052e90314aa696a2af8680200f9f44f41a9fd7bc2a8c0035fd6ff0301d1BL8;FFeb0740f968260039e83b40796a1200", - "f8ea1b40b9ec434039692e01a9eb024039e91240b8681e007968111d126aa200b8ea72407868860039e8524078eb7e4039L8;FF005400b4680100d008390491a9809352080140f909100079130303a9080000f9132300f94f8b009440018052410080524d8b0094605200b4680100d008610491BBBL4;FFb", - "a035df8b7035ef87f0600b1e81f40f9200300545f0317eb60190054a8835df8ea060091a1c300d1e00313aa49088052aa031ef809693738bab6ff97b7035ef8L4;FB08000000000000007c0b460000000000437431437432000025194900000000006a000000000000000200000026000000000000000000", - "00000800000000000000L8;FFe277813de06b813d6013c13ce167813de9e31539a091883ce8c702f91f0c0094eab343f9fcb743f9fabb43f9e1bf43f95f0500b1404d0054e9cb43f9e8cf43f9BL8;FF22008052f44f42a9f65741a9fd7bc3a8584b0114f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f", - "30b00f9fd030091080040f9f30300aaa80000b4600640f9L8;FF290500913f010aeb29030054280108ab8300005410000014e80308abc2010054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8bBBBBL4;FFff3e00f148020054e08753ad00030291e183059122008052e00", - "70dade08b54ade00b0eade18351ade1030bade28352ade2030cad59eb019400e4006fe08311adL4;FB0800000000000000204c420000000000000000000000000008000000000000000800000000000000304b42000000000000000000000000000800000000000000L8;FF941240f91f0101eb800800546", - "80640f9490480522a040091e00315aa6a0a00f909692138e10313aacdeaff97760a40f9680240f9080116cbbf0208ebc8070054BL8;FF84402391a363009102018052b30f00f9a56b019468820091e10200b021742a910403009084602791a363009122018052a80f00f99c6b01949c6b0194fd7b41a9L8;", - "FFa80318b8e8c34639e93200b8e9cf40f9e8631139a8f31938e8430691ea2b02f9e97200f8ebf200f8ea7201f85691fe97e84346391f05007161050054e8a759a9BBBL4;FF70feff97e82b40f91f0900b1c10b00541803178bfa2f40f9f30f00f9080340394aff70d349ff78d35b7f08531f013a6b5c7f10", - "5353ff60d3e0179f1a59ff68d3L4;FF493101f9f44f4aa9f65749a9f85f48a9fd7b47a9ffc30291c0035fd6330000b073160291e8018052e0018052f32302a9d3030094400c00b4690240f96a7240f8L8;FFe87f16a9ff2317a9e87f19a9f45701a909000014a003de3c39070091a8035ff8f50f40f93f43", - "00f18002803d880a00f9201500543457139b970a40f9ff0640f2BL8;FFc8000036e14741f9810000b4e04b41f922008052572b0194e89740f9ffa711391f0500b160000054e02b40f9d0e0ff97f3d351a9940100b47522009104000014L8;FFe80356b9e00740918100805200001891ff0316b9e86b00b98", - "a2a0094e80356b9e00740918100805200001891ff0316b9e86300b9832a0094e80356b9e0074091BBBBBBL4;FF2b1100910d1100d10b3400a94c19001221540caa2afbff361f1100f1a0fbff542a11c0392b1500910d1500d10b3400a94c19001221700caa0afaff361f1500f1L4;FFec6b42f9e16f42f9e", - "e7342f9f97742f99f0900b121440054fc0318aaf8030e91ee6b12a9998600b4e18b00f9e0431391e1030eaae20319aa160a0094e86b42f9L8;FF010500f9090100b9c0035fd63f4000f1c1020054090840790a1840390b0c40390c0840390d1c40390e0440392905c05a0b11003929610aaa0c1500390a00", - "4039BBL4;FF9f0700b140110054f4a741a99b16098be80314aa690e00b488820091f50308aab80e5ef81f0700b1c00d0054b9da40a9a81a40b9e8020036a01e40b9e1630191L4;ZDL8;FF1f0500b1800200548cf7ff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0", - "109eb89040054140114ab230100541e000014BBBL4;FFe01300f9a10300f021a01e91a30300f063283091e083009102028052c400805228000014e01300f9a10300f021d02891a30300f063082991e0830091c2018052L4;FB2940209bdb7f55641688e892f1fe0036dc9f52efac0948cc853bac4a6fcf31", - "4400005ec6de110faac78b3f3df3d77b69da4dff25042bdfb9e9061ab609db209bL8;FFe91b46f9e8d300f9e8d745f9ea7b00f9eacf45f9e98300f9e92746f9ea230ca9e8e345f9eadf45f9e9f301f9e9db45f9e86f00f9e8e745f9e0f7803de85f00f9BL8;FFead302f90e0c0094fad342f9e8cb42f9080", - "11acb1f0308ebe8340054e8cf42f9e10319aae20318aa00011a8b59530194f90b40f94803188be8d302f97f0700b1L8;FFf37740f9e8c31791e00313aa3453009468624039f5f345b9e8231839e8c31791b47e08530041c03ce183c13de8c31291e063813d01c18d3cc80080d20800f0f2BBBBL4;FFe88b0", - "079810000b4e00b40f92200805258f30194e80f40b9bc831cf828f80736a0e300d1f7031baa9cdbff97a0e300d1e10318aa2200805223008052372a0094L4;FB330000000000000040010000050000009a96480000000000330000000000000070010000050000009a964800000000003300000000000000", - "6301000005000000L8;FFfa6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf40301aa3bf2ff97e80300aae00301aa08020037750240f9BL8;FF4a01084a6b01084aaa731538aaa355382901084aab831538abb35538a9931538a9c355384a01084a6b010", - "84aaaa31538aad355382901084aabb31538abe35538L8;FFb50600f1d6620091e0000054c1825ff881ffffb4c00240f92200805255730094f8ffff1714a4ffb48806148be00313aa0201805201f17dd31afdff17e19349f9BBBL4;FFa86303d1a26301d101f101918e9dff97802600b5bc835af8f9031caa", - "228f40f8821f00b4810340f9380080399800f8b728040091490400d1110000145f2800f1L4;ZBL8;FF779100913f0117eb2004005461a100913f0015eb280900544b2540b959910091ea0319aa7f01086beb0317aaa1feff54f49200919f0215eb680a005449b30094BL8;FF70000014e05306f9e0833291", - "a102009021c00a9102028052a30200906334179184018052e3000014e05306f9e0833291a102009021c00a9102028052a3020090L8;FF46000014e04b05f9e0432a91e10000b021e0029102028052e30000b063800291040180528700001448008052e0632a39e8672a39c80080d20800f0f229000014BBB", - "BBL4;FF200080520104805267030294fd7bbea9f30b00f9fd030091f30300aa5103029460048052210080524f030294e00100b42904009029210f91284d8e52200540adL4;FFa1008052950315aada030094e1835ba93f0400b1a0020054ff0600b1600200544a0080d2e8e740f9890000f00a00f0f22029", - "00f9890000f03f030aeb282d00f9L8;FF220080525b030194b40000b4600640f9e10314aa2200805256030194610e40f9810000b4601240f92200805251030194688e46f81f0500b1a0000054e00313aaBL8;FFfd7b41a9ff83009198830114ffc300d1fd7b02a9fd83009109600091e80301aae50300aaa", - "9831ff8290300b02b212f91210300b021a02f91030300f063902991L8;FFff8300d1fd7b01a9fd430091e80301aae00700f9610100d021a03d91640100d084203d91e3230091e00308aa2202805292830094fd7b41a9ff830091c0035fd6BBBL4;FF220080525bc30194e00313aa7e020094688e41f81f05", - "00b160000054e00313aa05acff97e00313aae10314aa022b8052f44f43a9f65742a9f85f41a9fd7bc4a8L4;FB5b0000002600000034684900000000006a00000000000000fb0000002e00000034684900000000006a000000000000009c0000002e0000004572726f72000000L8;FFe0220091c1bcff97e1", - "6740f9810000b4e07f42f92200805256c30094e17740f9810000b4e05f40f92200805251c30094da0500b4e05b40f9e1031aaa22008052BL8;FF690640f92a0400910b0480521f010aeb6a0a00f92b692138a00300542800805228692a3848050091680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd6f503", - "00aaL8;FF808702ad87430094e8430691a08303d1c1e2009102830091df75fe97e89341b91f050071610600542007c03de9b341b92143c23ce8c741b9f81f40b94003803dBBBBL4;FFf70300aa1f0400b141fdff54e0430591810080527ce30194a0e10035e85341b9e8cb00b957ffdfc8d70200b4ff0600", - "b100030054f843059199008052e00318aaL4;FB64656e74697479206b6579000000000025e84800000000004d000000000000005f0300001c00000073657373696f6e5f76657273696f6e72656d6f74655f6964L8;FFe99b01f9572e0094e00fc23de113c23d08008092e21bc23d3a008052e8b300f9e007", - "14ade017c23de1ffc13de00b15ade003c23de207c23de10312ade00bc23dBL8;FFff830091c0035fd6e10200b021d0359162028052fd7b41a9ff83009193630114fd7bbea9f44f01a9fd030091010040f9f30300aa3f0400f18b000054600640f9L8;FFe10300aa20008052fd7b43a9ff030191c0035fd6d", - "c63ff97fd7b43a9ff030191c0035fd64001009000c00a91576300944001009000200b915463009440010090BBBL4;FFe0030191e00702adc07a0094280040b2f70300aaf60301aa0811c0dafb031f2a3a008052081540d2080d088b082501912818488b08050091a90240b28a020032L4;FF3f080071c001", - "005441f4ff351f0c04eba80100541f0404ebc9f3ff54a00080d2f403002a0a0000141f0c04eb29f3ff54400080d2f403002a050000141f0804ebL8;FFe80700f99da30094fd7b41a9ff830091c0035fd6080040f9e00301aa090140393ffd0371e0010054ff8300d1fd7b01a9fd430091810100f0210c169", - "1a40100d0BL8;FF600400b4e10316aae20314aaf50300aa60230194b5020037a90240b275d200a9880200b008811f91690e00f9680200f9f44f42a9f65741a9fd7bc3a8c0035fd6BL4;FF017c0353210200341f1100f160020054e003082ae20313aae303142ab5ffff97c0fdffb4d2ffff17280180d2e00", - "700f90800f0f2081500d1deffff17e90b41b2L3;ZBBBBBBBBBL4;FF2911c0da080d498b0801148a296be838e903f836e90333aa0a2100d1eb0328aa29551b9b0cfc79d34a01148a2c6b283828030a8b9c0700d16b651b9b0c210039L4;FFb6f31df8a8731ef8a9f31e3843f7fe971a00005217000014f503", - "1caae91b40f9eae340397a5f1833e89343b8eb3f40b9e91300f9eaa30039e80b00b968ff58d3L8;FFe20314aab40200a9621d0194b40a00f9614200910000809274420091c01d01941f0400f1210300549ffedfc8610640f90104f8b7600240f9220080524d1d0194BBL4;FFe8275f29eb0741b9ec0b41b9", - "ed0f41b9ee1341b9ef1741b9a0833dad0809c05a2909c05aa0833eada003db3ca103dc3ca203dd3ca303de3ce333803de22f803dL4;FF280780d2010000d495f5ff97fd7bc1a8c0035fd6fd7bbaa9fd030091f35301a9f303019154008052f55b02a9f50302aaf76303a9f70300aa580080d2161440f9L8;", - "FF08008092680200f9f30b40f9fd7bc2a8c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa810100d021181891e8030091e00309aa42018052BBBL4;FF1803008b060000141f0400b1212200547bdd01941f100031a121005439feffb505000014e04305918100805276dd0194e02000", - "35e85341b9e80b00b957ffdfc8L4;FBba000000090000000000000000000000000000000000000047657474696e6720656c61707365642074696d652073696e636520554e49585f45504f43482e2049L8;FFe8ab00f9e8d743f9f54b44f9fa5f44f9e56344f9e46744f9e92312a9e8db43f9e9eb43f9f66f", - "44f9ed7344f9f07f44f9e8ab1aa9e8e743f9eaf343f9e28744f9BL8;FFe07c01b4f40300aae0fbc63de1ffc63de8074091e2074091e00315aa0881099142c03591e1031baae30318aa04048152e50314aa06048052e05f873de163873dL8;FF680240f9080117cbbf0208eba8090054680640f9e10316aae", - "20315aa0001178b5c5d0094e802158b680a00f9952240f9550300b4610a40f9680240f9941e40f9BBBBL4;FF0801198a08fd0a9b5c03088b880306d1080140f9bf0208eb61010054882306d1e00316aae20315aa010140f967fd0194a000003588e305d108014039ff02086bL4;ZFL8;FFe81300f97af2ff", - "97e80300aa410200d021381d91430200d0637c1d91e08300912202805244018052e81300f92b000014c80080d2e0a30039e08300910800f0f2BL8;FF2103009021743c91a9831ff82403009084002091060300d0c6e0129103200091a52300d1e00308aa22028052a57d0194fd7b42a9ffc30091c0035fd6", - "09200091L8;FF2a040091ea1700f909692138e1630091d37cff97e00314aa080c4af81f0500b160000054e1630091b98fff97964e40f9560300b4e11740f9e80f40f9944a40f9BBBL4;FFa00200543f080071600100543f04007181faff54e80f40f91f0500b180040054e1630091a22301d178a6ff9720f", - "affb4b5000014e81b40f91f0500b1c0010054L4;FB65736f72742d6b796265722d7072652d6b6579736964656e746974792d6b65796964656e74697469657373657373696f6e737075626c69636164647265737300L8;FF60864cad883200f9800600ad608a4dad800a01ad5fbd009460220091f44f5ba9f", - "cd340f9fd7b59a9ff030791b7b6ff17c50100d0a5403191a163009162c20791BL8;FFad194e8bbf010ceb830500546b0500f1ec030daa81feff54a90109abe300005423000014e8031faa090840f949fdffb5e90309abc2030054280108ab42040054L8;FFc10c005448008092480300f9e80080524b0d00", - "1468b30135680640a96082c23c69aa43a96082893c6082c43c680607a9680241a960828b3c6082c53c69aa0aa9BBBBBL4;FF09692138e10313aac6f8ff97950a40f9550300b4610a40f9680240f9960640f91f0101eb20340054680640f9490280522a040091e00315aa6a0a00f909692138L4;FFf8030aa", - "a5b0d0094ee0317aaeddf5aa9ebcb40f9ea0318aaf00316aaef031aaaec0319aae2c740f9e08756a9610200b4e2af18a922008052f9030caaf8030daaL8;FF790d0194fd7b45a9ff830191c0035fd608a440a90a0180d28a00c0f2a9831ff8e9031eb21f1500f1eaa701a989018052e80700f9e92b00b942", - "060054e9630091BL8;FFa18d0194f44f43a9f51340f9fd7b41a9ff030191c0035fd6ff8301d1fd7b02a9f85f03a9f65704a9f44f05a9fd830091280440f9290c40f9340108ab020e0054L8;FF588d00940004805221008052568d0094009200b4f31f00f9f30318aa08048052698640b8e8830ea9ff7f00f", - "909040036156300911602805208000014e87b40f9BBBL4;FF4d00001400e4006fa0c302d1e10316aa02048052e30315aae40314aae00302ade00303ade5170094a0877eada80300d008a53c91a203df3ca303dc3cf6030391L4;FB5800000000000000a60000002200000080214900000000005800000000", - "0000004c00000022000000616c6c206c656e677468732073686f756c6420776f726b20L8;FF6083c33c6183c43ce0831d91693740f96283c23ce1030e91e0871dad6083c53ce9f301f9e9e35539e0f7803d6013c13ce8c301f9681340f9e2eb803de9230e39BL8;FFe8b740b92043c23cc0e200912183c33", - "c2207c03deab341b91f010071f8c741b9801f803de9079f1a818308ad0801094be99741b962c3883ce8e300b9e8cf40f9L8;FF694d009420008052e10318aa664d009420008052e10316aa634d009420008052e10315aa604d009400018052e10313aa5d4d0094fd7bbfa9fd030091083c40f9BBBBL4;FFf", - "50800b5f9031faa3700805233000014f9031faaf50200b41f0319eb2008005448028052e86a3938e123009128070091e00315aae80f00f9bad8ff97f70f40f9L4;FB7265656d656e745369676e617475726556616c69646174696f6e4661696c656400000000000000000800000000000000080000000000", - "0000747c420000000000L8;FF64ed00940803168b680a00f9540300b4610a40f9680240f9b51240f91f0101eb40080054680640f9490280522a040091e00314aa6a0a00f909692138e10313aaBL8;FFc80217cb1f0308eb69f0ff54c80218cbe90208cb1f0109eb69010054aa0216cb5f0109eb030100540", - "80e8052e10740f9c006089b28e179d3021109cb556d0194L8;FF002016915e6d0094400100f000e00e915b6d0094400100f000801e91586d0094400100f000200e91556d0094400100f000c01d91526d0094400100f000001a91BBBL4;FF01860094b7835ff8d7feffb7bb035ff8170400b453ad0194e003", - "17aa210080523900805250ad0194e0fdffb4e1031baae20317aaf80300aa56ad0194fc6740b9L4;FFf603012ae10314aae20315aae6feff97e103162ad2ffff17fd7bbda9f50b00f9f44f02a9fd030091f30300aac2000037e00313aaf44f42a9f50b40f9fd7bc3a8L8;FFe08703a957ad00944000805241", - "00805255ad0094002300b4f40300aa51ad009440008052410080524fad0094e01b00f9202200b44bad00944000805241008052BL8;FFe9cb42f9aa0318f8ac8318784b650036ea6b48b9ebdb5079ece20b91e04341f98a0100b90afb0b918b090079eb630191ac0358f8482500a968390c91a9835878L8;F", - "Ff6eb12a9f5620891fbe713a9e087853de083853d8b2c0094f4833f910a088052e0833f9189fe5839888258392a15003308111d1288821839e86208918afe1839BBBBBBL4;FFe0830091e20308aa2e7e0094e82340b968000036f41740f96d000014e91b40f9ea0640f9480109eb03020054ea0240f9f417", - "40f94901098be92200a91f0114ebL4;FF69e20191e40fc13de15b813de1fbc03de0431391e243813de227c13de1830891e04f813de00bc13de2830991e157813de113c13d63c20391e8e302f968420191L8;FF09110012e3060054080c40390815001208190a2a28090e3387000014e2031faa2a008052e3", - "0314aae803092a00e4006f7f0001ebe00300ad281c00545f0003ebBBL4;FF5c95019409000014080180d2f7031faae9031faa0800f0f208017fb2ea1e409229010aaa682600a9f44f5da9f6575ca9f85f5ba9fa675aa9fc6f59a9fd7b58a9L4;ZBL8;FF088c45f81f0500b181ebff54e8031faa080113abe", - "3020054800100f000a01d9157950094f3031faa088c48f81f0500b121efff54e8031faa080113aba3010054BBBL4;FF28040091490400d1110000145f2800f1880000542800028b08f1df38a804f837e0830091273e0094e82340b9083d0037e81b40f98a0740f9490108eb034c0054L4;FBe82049000000", - "00004900000000000000c00000000c000000e8204900000000004900000000000000c70000002f000000e8204900000000004900000000000000L8;FF94008052f53300f9f6f300f9ed03001429a041a9e003099135f040a9f80301aa36dc5ba9022f8052e8e700f92aa042a9ec7300f9e82b17a92aac43a", - "9e92b1fa9BL8;FF09fd46d30800098b080500911f0109eb281700544c000014fa031faaf9ab49f9f8074091188309913f0700b10018005400c30391db170094080040b20811c0daL8;FF64550094e1fb42f9f39b45f93f0400b100010054810000b4e0ff42f92200805254550094e8c3179100810091dfee", - "ff97a80359f8a003d83ce1833291022b8052BBBBL4;FFf44f44a9f65743a9fd7b42a9ff430191c0035fd6e0031f2af44f44a9f65743a9fd7b42a9ff430191c0035fd6ffc301d1fd7b03a9f85f04a9f65705a9f44f06a9L4;FB656d6f74655f726567697374726174696f6e5f69646c6f63616c5f72656769", - "7374726174696f6e5f6964616c6963655f626173655f6b657970656e64696e675fL8;FF08110091aeffff17e00300f94102009021441e914302009063d01d91e0030091620180524401805209000014e00300f94102009021441e914302009063101591BL8;FFb30f00f9a8750194a8750194fd7b41a9f31", - "340f9ffc30091c0035fd6bbd2ff17e00301aa010300f021401991220280528e750114ff8300d1fd7b01a9fd430091L8;FFf60740b99c830191e8d302f9b9010034e1d342f9e8cb42f91f0101ebe0d40054e8cf42f9090280522a040091e00319aa09692138e1431691ead302f90f120094BBBL4;FFe08304", - "ad70410094a80356f81f0500f1000d0054b68302d108088052f7030091c082c63cc182c73cc282c23ce00703adc082c33cc182c83ce20301adc282c13cL4;ZDL8;FF147d099bfcb2ff9713020036284340b928060036a9237fa9ea1340f91f5301a9155b02a9092300a9e92341a90a2300f9092303a928a7", - "482908270929e82f40b9BL8;FFe0c32291e1c327910228805261350194e0c31d91e1c32291022880525d350194f3031faaf9031faa35008052e0c32791e1c31d91022880525635019400630091L8;FFe00640ad09068052e8eb41f9e20ac03dc822099bc9060091e0c32491000500ad0209803de9ef01f9c", - "df3ff97e86b40f97b6300915a0700917f0308ebe1eeff54BBBBBL4;FF63482d91a0c300d18202805224028052b9f90094a0035df8c0ffff17a0c300d1a82b3da9abe10094ffc301d1fd7b05a9f33300f9fd430191a8ae8cd2294c8ed2L4;FF2400805240e6ff97e10f40f98effff17e0230091e10319aae2", - "0317aa230080522400805238e6ff97f90f40f9e80740f9080119cbff0208eb09f2ff54e0230091L8;FF160040f9f30300aa490100b4680a40f91f0116ebea33969a08010acbca0208cb34010aebc9000054e90316aa06000014f4031faae8031faa03000014f4031faaBL8;FFfdc30091090040f96802805", - "2290141d23f8d00f12831889a090300f029b100918a0000102b7968784a090b8b40011fd608200091200440a9e92300910a0000d0L8;FF0afd09a91fa90aa90afd0ca91fa90da90afd0fa91fa910a90afd12a91fa913a90afd15a91fa916a90afc41d31ffd05a91fa917a90a3180521ffd08a91ffd0ba9BB", - "BL4;FFe10316aae2031caa2300805224008052c7b7ff97b6035ff8a8035ef8080116cb9f0308eb09ecff54a08300d1e10316aae2031caa2300805224008052bcb7ff97L4;FBe8020000050000003d634900000000004d0000000000000053030000090000003d634900000000004d000000000000005b030", - "000090000003031323334353637L8;FFe9034ba9e88702f9e88f02f9e8eb41f9e99702f9e93340f91f0500b1f97b02f9f7e31339f98302f9e08b02f9fa9302f9e99b02f9fc9f02f9c00300546083c73cBL8;FF886200b9deffff17811c0054e0031faa2cffff1720ebff54c80080d20800f0f20809009137", - "000014e1010054e0031faa1affff17c80080d2e00b00f90800f0f2L8;FF081100d1d7ffff173f00156b81f7ff54680240f9e0031faa090540f90a0140f9290100cb4a01008be0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191BBBBL4;FFf65743a9f85f42a9fd7bc5a85be50114080e80525304", - "089b6004089ba8e279d3141115cbf50301aae10313aae20314aa52e50194c8e279d36102148b021116cbL4;FB6865742e7273002163616e6e6f7420616476616e63652070617374206072656d61696e696e67603a20c004203c3d20c0002f636172676f2d7265676973747279L8;FF39008052950100b456", - "e50094e00315aa210080523800805253e5009420feffb4e10316aae20315aaf70300aa59e500940200001437008052882642290a358c52BL8;FFaa040036ff0600712c0a0054d70a0035e90f41b259000014a0035df8baffff17a0831cf8e102009021bc2e91e302009063142f910f000014a0831cf8e102", - "0090L8;FFf30b40f9fd7bc2a85a650014f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aa810000b4600640f9220080524d650094BBBL4;FFb7ffff17e0230091e10316aae20314aa2300805224008052c597ff97f60f40f9e80740f9080116cb9f0208eb29f7ff5", - "4e0230091e10316aae20314aa23008052L4;FF130080d2a17e019bf60300aae12700f9000440f9090000140100138b020180d2e00315aa210440f92100028bb1060094c00640f973420091016873f83f6400f1L8;FF84200a91a363009162018052a80f00f9a5a50094a5a50094fd7b41a9f31340f9ffc30", - "091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aaBL8;FFe0179f1a752501948856403969564039b502000a1f01096be0179f1a6f250194885a4039695a4039aa02000ad6020a0a1f01096be0179f1a68250194885e4039L8;FFe293c03de377c03de1030e91b60302d1e00b813de1", - "0f813de0074fade213813de3f7803de0071fade00b50ade003813de1834cade207813de263c03de1831cadBBBBBBBL4;FFe80b40f98a0640f9490108eb830300548a0240f9e00740f94801088b882600a9680240f9090540f91f0009eb49010054e80f41b2e80300f9e00300916c0e0194L4;FF17008092f", - "61341b2d9ffff17e00316aabb8301d1c7ffff17a00000f000002e916b190094ff8301d1fd7b03a9f65704a9f44f05a9fdc3009109504039e9020037L8;FFff0301d1fd7b01a9f65702a9f44f03a9fd43009115a040a9090115ebe3030054f30302aaf40300aa5f0009eb09010054e00314aaf503012ae103", - "13aa22008052BBL4;FFe00315aae003803de80b00f9bf700094f60300aaa0020291f70301aabb700094f80300aaf90301aa4e99019400048052210080524c990194e00400b4e08743adL4;ZFL8;FF4a01084a6b01084aaae31738aa1358382901084aabf31738ab235838a9031838a93358384a01084a6b0", - "1084aaa131838aa4358382901084aab231838ab535838BBBL4;FF1f2503a909048052187d01a91f2504a9172505a91a6100b9792e00f9cb130054480400b0f8e3009108b140f91f0d00f1030d0054684a40f91f0500b160020054L4;FB64001b737071722076312e73656e645f656b2e726563762065706f", - "636820c0022d3ec0273a20456b53656e744374315265636569766564202d3e204e6f486561L8;FFe94f44f9e8ab03a9e84b44f9ea5f44f9e87b00f9e85344f9e8d300f9e85744f9e9230ca9e86344f9e95b44f9e86f00f9e86744f9e85f00f9e86f44f9eaa30aa9BL8;FF0f120094f90b40f9b8010034e1d", - "342f9e8cb42f91f0101ebc0d30054e8cf42f9090380522a040091e00318aa09692138e1431691ead302f901120094d6000034L8;FF6822099be133c13de237c13d18000014c80080d2e0031791e3032d910800f0f2e4833291210100b021c0349102018052e9ab0cb9e85306f9f1fcff97f3f742f9BBBBL4", - ";FF5cf90194e08741ad28008052e217c03d800600ad820a803d68620039f44f48a9f65747a9fd7b46a9ff430291c0035fd6000180520102805266f90194000400d0L4;FB75696c642f6c69627369676e616c2d70726f746f636f6c2d613434636635613164633062366666632f6f75742f7369676e616c2e", - "70726f746f2e73746f726167L8;FF8082813ca18379ad8182823c8082833cacffff17e08742ade00314aae21fc03da0873aade08740ada203973ca08738ade08b41ada08b39ad3af3ff97a0077aadBL8;FF8262ff9720f1ffb41f000014a8035bb848f00737b9031bf880ffff17a22301d1830c8052645ff", - "f9700f0ffb41f000014a02301d1d4790094f80301aae0f20736L8;FFe223843df6ef07f9e3ff863de3fb863d8c780094537900940004815221008052b3790094e07c01b4f80300aa4d7900940004805221008052ad790094e07c01b4BBBL4;FF04018052050980529306009116f0ff97a8835af81f0500f1", - "20190054a8035bf8fa2f40b9e30314aafc1b40f9e44340f9f3a308a9f31745a9e81340f983ffff17L4;ZBL8;FFa24700d1c10280526ab90094e00313910178805202108052230080522400805233cfff97e86b42f9e96742f9e91f00f9bdfeff1720008052010480525ab90094BL8;FF4afd46d329010a8b", - "290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8bL8;FFf5031faaea031faa5700805234008092ff5700f959010014e8cb43b9f6c30d916b7e0e91c9b245b86a621e91740102f9689a07b9e85f40f9f84f40f9493", - "100b8BBBBBL4;FFe80f41b2e80700f9e023009178fe0094e90300aae90700f9210400b021a01f91230400b063e03691e023009102028052a40280526e000014930400510b000014L4;FF58090094c00180522100805256090094a00300b4880000f008fd3991090140f9086140f8090000f9890000f0298d", - "3991086000f8c8008052e92302a9c8018052L8;FFa80080520820201e00119f9ac0035fd6ff8300d1fd7b01a9fd430091280440a9090200f029b10f9162020090422c0591e02700a9e3030091e00308aa6a090194BL8;FFe81740f9fb03889adf0600b1e0070054e82f40f9e0c30291f6230ba9e80b40f9e", - "86300f96cd4ff97f60300aae13300f937000014e08744a91f090071a1010054L8;FFfa4f41f9f75341f9e20314aae30316aae40313aae0031aaae10317aabddaff97f70e00b4f60600f1e0031faad7fa7fd3840c0054e8f77fb2ff0208eb280c0054BBBL4;FFfd7b02a9f44f03a9fd830091010840a98800", - "8052f30300aae0230091440080528500805229f87fd33f1100f13481889ae30314aa0c000094e80740f91f0500f1L4;FB616c726561647920636f6d7075746564206c617a696c7900de194900000000005700000000000000c90300001600000000000000000000000800000000000000L8;FFe9040014c1", - "0000b4f40300aae00316aa2200805257c90094e00314aa9c0000b4e1031caa2200805252c90094ba0000b4e05b40f9e1031aaa220080524dc90094BL8;FF5c490194610e40f9810000b4601240f92200805257490194612640f93f0400f18b000054602a40f9220080525149019474d643a9750300b496c2", - "009104000014L8;FF2925019129fd46d329050091280108aba2060054694240b93f0500716102005469aa4829c9030034290140b22911c0da291540d2290d098b2925019129fd46d3BBBBL4;FF1f0100394b1140b84e1d40394c5140784d0140390b2100b84b0940b90e2100394e7d40390c0d0079ac111d", - "124db140b80b9100b80b0880520c0500394cf140f8L4;FBe41f40000000000010000000000000000800000000000000dc81400000000000e41f400000000000180000000000000008000000000000005c83400000000000L8;FFa083de3ce87f04a948008052e87f05a9ff2306a9e87f08a9ff2309a9e87f", - "0ba9ff230ca9e87f0ea9ff230fa9e87f11a9ff2312a9e87f14a9ff2315a9e87f17a9BL8;FF400100b4155000a90103009021c02991130800f91f600039f44f42a9f50b40f9fd7bc3a8c0035fd6000180520104805268690194fd7bbda9f65701a9f44f02a9L8;FFe8c306394d0000142093c13ce9df40f9e", - "8a30539e012803d2093c03ce9f204f8e112c03d8092823c8192833ce9c700f9e10740f9010600b599feff17e8b740b9BBBL4;FF090300f9810000b4e0031aaa2200805258a90194f70f40f9b50000b4e00314aae10315aa2200805252a90194e02740f9930000b4e10313aa220080524da90194L4;FF0040", - "0091130040f9d30000b47f9600f188ffff54010440f9817833f8f9ffff17210000d0e0b340f9e27340f9220401f9600000b4210000d0200001f9a0420691L8;FFe0430391e102148be20318aaf83f043960a90094f90b40f9e08749ada05701d1e257c03de1830091e00704ade08747ade22b803de00702a", - "de08b48ade00b03adBL8;FF0803160be8bf0a39944200919f0219eb80050054f8bf4a39955a40a9620318cbdc0202eb63feff54580200344003188be10315aab302028b56290194e87b41f9L8;FFe0f9ff54f6030291e1c31d9102248052c06210915f29009428008052f43302f9d4820f91e8e71639e800", - "00b0fa3702f9fb3b02f9f93f02f9fc4302f9f84702f9BBBBBBL4;FFc02900b5f7031faabbffff1721830191e20313aa8cfbff97e02700b5f7031faab5ffff17e20313aae303162a62f7ff97f70300aa00f6ffb4be000014e00313aaL4;FF081d4092e0431391ea6b02f9280108aae86f02f933efff97e153", - "41f9810000b4e00316aa2200805252110094e15f41f9810000b4e06341f9220080524d110094L8;FFe81f8052884200398002803df44f45a9fd7b44a9ff830191c0035fd63f9800f1e00500543fb400f1a1060054690240393fd5017141060054690640393fc90171BBL4;FF29690091e8030aaa02000014", - "2965009169a200a908c48052680e00f9e10740f928008052680200b9c1e5ffb5ff074091ff030c91f44f44a9fc0b40f9f65743a9L4;ZDL8;FF29050091200108ab62000054fd7bc1a8c0035fd6800100d000c02c9158910094800100d000001c9155910094600100f00000149152910094ff4301d1fd7b04", - "a9BBBL4;FF7c0f00f9084d169b000540ad0209c03da203993ca0873bad008541ad038942ada80357f81f0500b1a0039a3ce38a02ade112803d80fdff54a04302d142baff97L4;FB3613a54c0000c8ca3ded5182ea32be21d6d0a7765ccfc0de8bdf601ad6a11e80aa228d8a03f6fe3c88afca08a2d80926d", - "66e277f6ee27fd5ee4adfdd48ead4adL8;FF0081c03da0039d3cea4700f9e96b00f90aa541a9e0f7803de9e700f90ba542a9e92f17a90ba543a9ea2f1fa9e99300f90aa544a9e9cf00f90ba545a9e9c300f9BL8;FF00a02d915e510194e002009000a02a915b510194e00200900000219158510194fd7bba", - "a9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff8308d1L8;FFe9d701f9fbc301f9f5c701f9f7cb01f9e8bb01f996010014e8031691e00316aa2f510094c8624039fbc342f9f5c742f9f7cb42f9e86316392801009008410691BBBBL4;FF0804805296f201a995a205a980a206a9a8c35fb8", - "99ea02a997ae03a9887a00b9810000b4004340f92200805251f101946002c03d680a40f98002803d880a00f9L4;FB697479206b65796d697373696e672073656e64657220636861696e206b6579696e76616c69642073656e64657220636861696e206b6579696e76616c69642072L8;FF000100b45d0000", - "14600900b5e00313aa42f0ff97e80301aa80000036c80900b5e1031faadcffff17e1031faa882e00f9d9ffff17c10b0054e0031faa9bffff17BL8;FF8c2501916b194c8b6b0500910a0100b44c0140b28c11c0da8c1540d28c0d0c8b8c2501914a194c8b4a0500914a010baba20c00544b0140b26b11c0da", - "6b1540d2L8;FF481700545f000014fa031faaf9b749f9f8074091188309913f0700b18018005400230491b5290094080040b20811c0da081540d2080d088b0825019109fd46d3BBBL4;FFe97f00f9e083893ca003dd3ce1838a3ce0838b3c590100b4e03740f9e10319aa2200805253b1019405000014e83", - "740f9e89b00b908008092e84b00f9e83f40f9L4;ZBL8;FF1f0309eb020c00adff0f01f9ff0b01f9ff2701f9ff2301f9ff3f01f9ff3b01f9ff5701f9ff5301f9ff6b01f9ff6f01f9ff8301f9ff8701f9ff9b01f9ff9f01f9BL8;FFe86742f9a003983ca80319f8e80200f008b140f91f0d00f143070054e88", - "33291e0032d910459ff97e85346f91f0500b180620054e85b46f9e9f31691e02bc33dL8;FFe9830e910a0000f04a012191e99b04f9e9831f91e8f303f9680000b008c10d91e9a304f9e900009029a13e91e8a704f928008052a04700d1e96705f9e1432a91BBBBBL4;FF69010294ffc301d1fd7b01a9fc6f", - "02a9fa6703a9f85f04a9f65705a9f44f06a9fd43009109504039a9130037166440a9f30300aa1c1040b9f40308aa350b40f9L4;FFb982009104000014940600f139c300918001005421035ef8810000b420835ef8220080525301009421835ff8e1feffb4200340f9220080524e010094f3ffff17L8;FFfd", - "7b4aa9ff830391c0035fd6e0230091f7a300a9afddff97e0230091f7a700a9acddff97e00313aae1031faae20314aa23008052240080522d170094770a40f9BL8;FFe9af00a9ea0300f9a0810194fd7b42a9ffc30091c0035fd6080040f9290300f029611191e00301aa0801403908711d5308410051081d", - "7d92226968f8290300f0L8;FF4b0080528cfaff35ec031faa8b010b8b2801088b49010b8be16300910001098bcf80ff97d90300b4e11740f9e80f40f9fa0f00b99a0640f9fb0b00f91f0101ebBBBL4;FFc2980094f40301aae100f8b6f6031faae00316aae10314aa63c101941400809213000014340200b", - "4f70300aa4dc10194e00314aa21008052360080524ac10194L4;FB70726f63657373696e67205072654b6579206d6573736167652066726f6d20c0001f70726f63657373696e67205072654b6579206d6573736167652066726f6dL8;FF1d0000148862069189565ca9806ec03d0101c03de083029188d64", - "0f9812200914083813ce107813de81302f9e91f02f91e150094e10b45ad480080d2e00fc13dBL8;FF941e40f91f0101ebc0090054680640f9490580522a040091e00315aa6a0a00f909692138e10313aa05faff97760a40f9680240f9080116cbbf0208ebc8080054L8;FF3f0400f18b000054608240f922", - "00805258410094619640f93f0400f18b000054609a40f92200805252410094613240f9810000b4603640f9220080524d410094BBBBL4;FFe2031f2ae0023fd61f0000f1cd000054390300ebe3a100541803008bf9feffb50f0000141f0400b141a1005474e101941f100031c1a00054f9ffff1771e10194L", - "4;FB0800000000000000080000000000000014e943000000000000000000000000000000000000000000010000000000000088ef4300000000000000000000000000L8;FFe103002a95390094e203012ae103002a92390094e203012ae103002a8f390094e203012ae103002a8c390094e203012ae103002", - "a89390094e203012ae103002aBL8;FF131800b91f700039f44f41a9fd7bc2a8c0035fd600018052010480526d610194fd7bbda9f50b00f9f44f02a9fd030091f40302aaf303012af50300aa49610194L8;FF41fdff5481220191e20313aaacfcff97000100b483000014200e00b5e00313aa85fdff97e803", - "01aa80000036880e00b5e1031faae1ffff17e1031faa886200b9BBBL4;FF6b0600f9692a01a9680200f9f44f47a9f72b40f9f65746a9fd7b44a9ff030291c0035fd6400300f000e03e916303009063002291440300f084603f91a27f0091L4;FFfd7bc5a8c0035fd601d05f38840a1b53f5ffff17040c40f", - "2a102005403c05f3801d05f3802e05f782110001203010034620000349f000039007d20d402805fb8L8;FFe8030091a2008052a6a1009468620091a10100d021ac1a91a40100d084a00b91e0030091a3630091a2008052a80f00f99da10094810100f0211c1691a40100d0BL8;FF020101eb810a00f9630b", - "0054280101cb5f0008eb28060054ca02178b280117eb6a0200f942f5ff54800200b0006018915621019420008052615a40a9f58300a9BL4;FFe00316aae10314aa67210094a00100b4f50300aa53210094e00315aa21008052f40315aa360080524f210094a0feffb4080740f9f50300aae00314aa020000", - "14L3;ZB" + "BBBBBBBBBL8;FB0000000000000000000000000000000051e574640600000000000000000000000000000000000000000000000000000000000000000000000000000000000000L8;FF352145a9e80f00f9810000b4200540f92200805228a50094b90000b4e0031aaae10319aa2200805223a50094b7000", + "0b4e00318aae10317aa220080521ea50094BL8;FFf4feff9760a20791f30b40f9fd7bc2a887feff176042069151000094e00313aaecfeff9760420891f30b40f9fd7bc2a87ffeff17610640f9810000b4600a40f9L8;FFe0230091f7a300a97623ff97e0230091f7a700a97323ff97e00313aae1031faae2", + "0314aa2300805224008052bd010094770a40f9680240f9080117cb9f0208ebBBL8;FF3f0500b140020054f40300aa161041b9171441b9152041b9008040f9e8c30091818640f9955f0094e8c340396801003688ffffd008611c91e904805268a600a9L8;FFa1fdfff021602491a3fdfff063bc2491e02300", + "91a20080524403805296000014c90080d2e8430039480080520900f0f2e8470039e90700f9ddffff17e00700f9BL8;FF1a0101eb0201005499000014e10314aae20313aa00f1ff97000e00b5e1031faae10900b5a80640f91f011aeb69050054e00313aadcf1ff972009003728fc60d3L8;FD10004700000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BBBL8;FB72726f720000000042024000000000006a00000000000000dc0000002e00000042024000000000006a00000000000000750000002e000000420", + "2400000000000L8;FF807e80b980010034e11740f9e80f40f91f0101ebe08b0054e81340f9090180522a040091ea1700f909692138e16300916e92ff97803240f9800100b4e11740f9BL8;FF5e010194e89341f91f0500f1611f0054f7830c91e8c30591e0c30091e082c63ce182c73ce282c83ce08709ad", + "e082c93ce182c23ce2830aade082c33ce282c43cL8;FFeefeff17e1e740f9e02740f966010094080140392940805208c100511f290071282080522831889ac8aa073715fd60d3bf9601f1eb279f1a53fdff1700018052BBL8;FFe2140054697e40f93f0500b180020054691241b93f050071610200546916", + "41b9290140b22911c0da291540d2290d098b2925019129fd46d3290500916a8640f9L8;FFfd830291081c00121f090071e1010054e00302aaf40302aaf30301aad2000094e80300aae00301aa08020037980240f9080740f91f0100eb42020054e80f41b2L16;FFeb0319aae87700f9e4a74ba9eef347a9f", + "9031eaafe0314aae80317aaf70316aae1d348a9f5ef00f9fadb4aa9e31340f9e22f40f9f57b40f9e56f40f9ef030014BBBBL8;FB3d0f4000000000004a00000000000000bd040000130000003d0f4000000000004a00000000000000d3050000120000003d0f4000000000004a00000000000000L8;FFaa4", + "35738a92317386901084aab535738a93317384901084aaa635738a94317386901084aab735738a95317384901084aaa835738a96317386901084aab935738BL8;FFf44f02a9fd030091150840f9080040f9f40302aaf30300aa080115cb5f0008eba8010054b40000b4680640f9e20314aa0001158b27150", + "194a802148be0031f2aL8;FFa04700d1f50316aac6c2ff97e08b01b9a04700d1c3c2ff97e08301b9a04700d1c0c2ff97e07b01b9a04700d1bdc2ff97e07301b9a04700d1bac2ff97e06b01b9BBL8;FFe0feff17a04301d122008052230080522400805298e0ff97a1035cf8e7feff17a04301d1e10319aae", + "20313aa230080522400805290e0ff97b9035cf8a8035bf8L8;FF60000054e02b40f993eaff97f4db51a9960100b49822009104000014d60600f118630091e000005401835ff881ffffb4000340f9220080521f550094f8ffff17L16;FFa8035ef809008092690200f953000014e0dfc03de8c341f9c08280", + "3ce8b705f934000014e8b345f9e0d7c23de0030b91e8c301f9a8c20091e0df803d922d0094BBBL8;FF2200805223008052240080529a000094610a40f97cffff17e00313aae10317aae20315aa230080522400805292000094770a40f9680240f9080117cbbf0208ebL8;FF1b250094080040b20811c0da0", + "81540d2080d088b0825019109fd46d30800098b080500911f0109eb68280054c0fdfff000a0239175710094e8031faa000119abBL8;FF220080522cf50094740240f99f0600b1e002005473d640a9950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f922008052L8;", + "FF734e00a9537820f8f4ffff17a4ddffb54affff17c01a00b4050c40f280000054000080d21f000039007d20d4fd7bbda9fd030091f35301a9f51300f903c05f38BBL8;FF4901805209683f3808050091fa3b49f9e8d302f97a0300b4480340b20811c0da081540d2080d088b08250191481b488b0805009", + "114000014280080525f0700b1L8;FFe94f05f929fdffb029ed0a91ea9f04f9eac32491e86305f928fdff9008c52991e95b05f9290080d2e87305f9c80480524942c0f2ea7705f90a078052ff4b05f9L16;FF880e40f9810ac03da003933ca80314f841838c3ca98315f860010014e083029181220091023f", + "8052f583029129b50094882640f9800ac03da1a201918a1a40f9BBBBBL8;FB72656d6f7465206964656e74697479206b65790000000000a1104000000000004d000000000000005f0300001c00000073657373696f6e5f76657273696f6e72L8;FF02308052131940b914814039e00316aa309d0094a1024", + "0f9d3c200f9d4220639810000b4a00640f922008052229d0094a10e40f9810000b4a01240f922008052BL8;FFe20315aae5000094770a40f9680240f9080117cbbf0208eb09f8ff54e00313aae10317aae20315aadc000094770a40f9baffff17e00313aa22008052d7000094L8;FF28fdffd00881399108", + "0140f938280091296f8e524a00018be003019141a30091e30318aa49110079480100f9e20f00f95a0e0094f56f44a9f95b45a9bf0a00b1BBL8;FFe20000b4683340f960030191e10319aa0801028b683300f966590194e00301912103138be2031aaafaff0139295d0194e8ff4139290080521a0317cba90", + "31638L8;FFa22302d159f4ff9740fcffb46f010014e02e00b5a02302d132f5ff97a00d003681fbffb47a01001401e30191a22302d14ef4ff97e0faffb449010014e8eb45f9L16;FFde000094760a40f9b1ffff17fd7bbca9f70b00f9f65702a9f44f03a9fd030091f30301aa210840f9f40300aa680240f9", + "1f0101eb600e0054680640f92a040091BBBL8;FF08fc60d3280700b5080840921f1900f162070054017c0353810700341f1100f1c0070054e003082ae20313aae303142aaaffff9720fbffb427000014e00313aaL8;FF307d00940078805221008052297d0094207201b4e10319aa02788052fb0300aa2c7", + "d0094e09bc43de19fc43de0031caae2a3c43de8c34ef921058052e0ff833dBL8;FF2dfd0014f44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091160040f9f30301aa20008052f40302aaf50308aac182009193f900942001f8b7L8;FFf40300aa4301f8b7f30303aa810100b4e00302aa", + "e10313aa250e0094600100b4e8031faa800600f90a000014f3031faa280080520901805207000014e00313aaBBL8;FF6b01084aaa231738aa5357382901084aab331738ab635738a9431738a97357384a01084a6b01084aaa531738aa8357382901084aab631738ab935738a9731738L8;FF010100ade883", + "0f91f2edfe97f5f341f9f4f741f9f7fb41f9f8ff41f9f60342f9fa0742f9bf0600b1fb0b42f9e0190054e8830f91e0432a910224805201e10091L16;FFf8bf43f93f0400b1803a0054e0ebc13de1efc13d684340f9e2f7c13dfa8302f9e04f813d1f0500b1e0f3c13de153813de1e3c13de057813de0e7c1", + "3de25b813dBBBBL8;FB0016264f49b59ea9a28c9c835fa4aad583e90000baf52c8912bf6024cb6d8e4645aa04a478a45732a17fe142e672185dd2a9fd84b312de084da140c5774f2623L8;FF010180522b8d0094204800b4f80300aa2c8d00944000805241008052258d0094204200b42800805213000079", + "130300a9e80f00f9130b00f933fb7fd3218d0094BL8;FF61abff9708068052e1f342f9e02fc13d6906089be8f35639e133c13de237c13d620600911f090071200500ad2209803de2f702f9e083ff541f0d0071f3c31291L8;FF300d0094e00315aa2100805238008052280d009440feffb4e10317aae2031", + "5aaf60300aa2b0d0094e0030091e10315aa220080522300805224008052f55b00a9BBL8;FF08038052690640f94003c03d8826089ba9035af80001803d8a060091090900f9fc0b40f96a0a00f99f0700b140110054f4a741a99b16098be80314aa690e00b4L8;FF1e000014f4031faae00313aa080c48f81", + "f0500b1c1fdff54f40314abe2020054688e4bf81f0500b140020054e00313aa52010094080040b20811c0da081540d2L16;FFe86342f9ea2313a9e86f42f9ea7742f9e82b00f9e88f42f9e81b00f9e89342f9e87b00f9e89742f9e86300f9e8a342f9e8ef00f9e8c342f9e8f300f9e8cb42f9BBBL8;FFc87", + "e105369b201b8a9035c3868ba0239a8835bf869de023968f20af8e82747a96a5a00b979f201f8692200a9e82740f9e94740f9787202f8680a00f9e8434239L8;FFe11740f921caffb4e00b40f922008052296d00944dfeff17fb0300aaf80b00b99a0400b4fb0300f9266d0094e0031aaa210080523b0080", + "521e6d009440f8ffb4BL8;FFe28342ade28309ade18340ade18307ade02300b4e87b40f91f0500b160000054e0c3039151f8ff97e8bb40f91f0500b16000005420030291e8f5ff97f7d740f9L8;FF2000040b60fc0288a2ffff35e00701323f00006b00ffff54e00303aa480c80d2211080d2220080d2010", + "000d41f9800b121feff54e00303aae10302aa010000d4BBL8;FFe6100094e1d342f943feff17e0431691e1031aaae20318aae0100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aad7100094L8;FFf8031faae8031faa0900f0f23a017fb2091f4092f70302911b0109a", + "aa1035df8a10000b4b9835df8e00319aa22008052212d0094f99f44f9fca344f9f8a744f9L16;FFe20318aa03048052e4031aaae50314aae6031baa07048052fa0f00f9f6100094e0431291e10316aae2031baa03048052fffbff97e86342f908010fd11ffd01f1BBBBBBL8;FB7920776974682074797065", + "203cc0013e002163616e6e6f7420616476616e63652070617374206072656d61696e696e67603a20c004203c3d20c0002f63617267L8;FFf6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd620feffb000c024917c9d009440008052e10317aa5d9d0094ff0302d1fd7b02a9fc6f03a9B", + "L8;FFe003082ae10314aae20313aa1ffdff97601a00b5a0f5ffb4a2ffff17898244f83f0500b1810000549fde04a99f2e00f99f6200b91f0900f141180054e00313aaL8;FFe9a34039e80b00f9e96300399704003648ff70d349ff60d3610a40f9e0c30091fa3300b9e8db0039e80b40f9e96b0079e96340", + "39fb7303f8f6f303f8e87304f8BBL8;FF5f2800f1880000542800028b08f1df38a813f837e0e3159186120094e87b45b908230037e8c742f96a0340f9490108eb632700548a0340f9f4c342f94801088bL8;FF680240f9080117cbbf0208eb89f5ff54e00313aae10317aae20315aa17000094770a40f9a6", + "ffff17e00313aa2200805212000094610a40f9afffff17e00313aaL16;FFe20313aa04edff97a00500b5e1031faad8ffff17e20313aa230c80528ce7ff97e10300aa60faffb4caffff17a00500b5e00313aadcedff97e80301aa40010036BBBL8;FB79000000050000001d1c400000000000540000000000", + "00007f000000050000001d1c40000000000054000000000000008d00000014000000ef10400000000000L8;FF550300b4e11740f9e80f40f9964a40f91f0101eba0390054e81340f9490380522a040091e00315aaea1700f909692138e16300916d8eff97f71740f9e80f40f9BL8;FF3f000014c80d00369", + "70e40f9570100b4ff2a00b1a8120054e82600911f0101f1a2120054290080522821c89a1f0115eb1581959a3511f8b7750900b421010194L8;FFff074091ff830091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a825010014e0031faa5ffdff97a0877ea95dfdff97fd7bbaa9fc6f01a9fa67", + "02a9BBL8;FF160440f9d30600b102050054b300f8b6f8031faae00318aae10313aa623d0194170040f9f40308aa26410194e00313aa21008052380080521e410194c0feffb4L8;FF81130054200740ade83342b9e89303b920070bade20c0014776a41f900c3c73c01c3c83ce90f44b9f6eb43b9756641f9", + "e80240f9200708ade93303b9680000b4L16;FFe0f3c03d75a615a9f27340f9680e00f9e9e740f9720600a9e1030991e8bf40f9678213a960020891692202a9e9bb40f979b210a9e8ff40f96baa11a9692203a9BBBBL8;FB32f500004ce53f8dc4ce7f41060177d62f226b023393c80edefa5788cdc1dab2e", + "acc85377a8be8b5beb2cebd33236d7fcfe1221e893d1ef33c3308ae05b60000L8;FF08c10891e00301aae10308aa62028052fd7b44a9ff4301915e8d001408a440a9aa4300d1200440a9c2fdfff0429c2391a8273fa9e8ffffd008311a91ea2301a9BL8;FFe81b03f9e91f03f9880d0194e1fb44f9810000", + "b4e0ff44f92200805226110194e0c31791e1833291022b80522911019440030291e1c317914eb1ff973c008092L8;FFb60000b4e00319aae10316aa2200805229110094e0e30e91a6eaff97e0030e9144ebff97f9575aa9f62b40f9f4cf42a9f8db40f9e0830c9126ebff97e1cf40f9BBL8;FFe09f41f922", + "0080522b510194f70f40f9e80740f9ff0208eb6000005404000014f7031faae0230091684c019408038052e90b40f9e00bc03de826089be91b40f9L8;FFc0035fd680fdffd000e039917f4d009480fdfff000e001917c4d009480fdffd000a02391794d0094fd7bbfa9fd030091081840f9080100b408014", + "0b20811c0daL16;FFe86700f928c040f9ead300f9232857a9e86f00f928c440f9e85f00f928c840f9e8e300f928cc40f9eaa30aa92a205aa9e83f00f928d840f9ea0700f9e8531ea9BBBL8;FF01600091e003022ae20303aa72f5ff97602900b4a1ffff9021203f91a3ffffb063fc0691e00700f95f00001", + "4e10300aae003022ae20303aa67f5ff97002800b4L8;FFe4031baaa0073aadf55b02a9fa2700a9471aff97fb7740f9e082c03ce182c13ce282c23c7f0700b1e08705ade237803d000e0054e082c33ce182c43ce8a30391BL8;FF20020037750240f9a80640f9160101eb02030054e80f41b2e80300f90700", + "0014c90080d248008052e02300390900f0f2e8270039e90300f9e003009157f7ff97L8;FF632013910004412ae2fcff9042a011910008402a0010402a0020402a05040011a000200a007c041b007c1b53734860387306005173761e5363060011600a0011BBL8;FF081540d2080d088b0825019108fd46d3", + "0900088b200500911f0008eb89190054e1431691880e0094e1d342f9e8cb42f91f0101ebc06d0054e8cf42f92a040091L8;FFf53f00f9fa074bf9481140b8fb0b4bf9f90f4bf9fc134bf94a014139f8174bf9e85b07b9e8631d91f51b4bf9093100b8e91f4bf9e80240f9f4e342f9ea431d39L16;FFfd7b4", + "3a9ff8301912bb10014f44f45a9f52340f9fd7b43a9ff830191c0035fd620008052010480525fad0094ff8302d1fd7b05a9f93300f9f85f07a9f65708a9BBBBBL8;FB73697a6500000000801740000000000056000000000000003f000000270000006d697373696e672073656e64657220636861696e000", + "000009f1b400000000000L8;FFf50f00f9090115cb285041a99f0209eb48060054d40000b46002158be10308aae20314aa2b990094e10318aab402148bff0a00f1e80316aaf40f00f9a0010054BL8;FF00602a9181150194e8031faa090840f929f5ffb5091440f9e803088b09f6ffb5b6ffff17e9031faa", + "0a2440f9aaf9ffb50a3040f9e903098b8afaffb5daffff17L8;FFef031a2ac2070014e9ef59a93a7f085328ff60d33cff78d3ebfcfff06b3102918d008052ef031a2a78ff78d337fd60d3f603192aee03082af003182ab4070014BBL8;FFf60302aaf70301aae0430291e10303aa02048052f50306aaf403", + "05aa171b0094e84b40f91f0500f1c0230054fb430291e00317aaf90300916083c63c6183c73cL8;FF8a55009452000014e0032d9192eeff97e1fb42f93f0400b1a0140054fb4340f9fa830291810000b4e0ff42f92200805221590094e8c317910081009186eeff97L16;FF27000014e0230b39e0030b91f", + "f270b39f56301f961dfff97e80300aae86301f981feffb02100119183feffb063481191e0030b91420280522401805218000014BBBL8;FFe10300a9e00301aae10309aa220080522300805224008052f4030aaa96040094e10340a9ea0314aa2ca040a9290040f99369283808050091280800f960f9ffb6L", + "8;FF04000014d6c201f118c3019120040054e1d342f9e8cb42f91f0101eb00030054e8cf42f929040091e00318aa19692138e9d302f95a280094e1431691ba110094BL8;FFf30300aaa80000b4600640f901f57ed34200805228f90094680e40f9a80000b4601240f901f57ed34200805222f90094681a40", + "f9a80000b4601e40f901f57ed3L8;FFae0dc039df0501318cd58c9a7f1100f160020054ae11c039df0501318cd58c9a7f1500f1c0010054ae15c039df0501318cd58c9a7f1900f120010054ab19c039BBL8;FFe01f40f9e10317aa220080522a3901949a030014f6df44f9e043169101230091027380522b", + "3901949800805211020014f6eb44f953000014e8074091f69b45f9L8;FF80f8ffb444010014e82f45f91f0500b1a1000054ff2f05f9f83305f9ff3705f9ff730ab91f0800f101340054a02302d1cdf4ff97200a0036c1f6ffb4cd010014L16;FFe8b342f9e2ab803dea2306a9e8b742f9aa524678e00714a", + "de83b00f9e8bf42f9e8a703a9e9c342f9e8cb42f9e9230da9e8d342f9e9cf42f9e81700f9e8d742f9BBBBL8;FB090100002e00000042024000000000006a00000000000000b00000002e0000000000000000000000080000000000000008000000000000004035440000000000L8;FFf3031faa1f0500f1e", + "8031faae0000054e80b40f982fb7fd3410b00910005138b2c890094e80313aa08011c8bbf0600f1a8831cf8a0060054a80400b4fb0308cbBL8;FF2d0901941f0b00b1fa432791c100005420afc03de82344f94003803de8f304f910010014f68740f91f0700b1e014005420afc03de82344f9f4630191e9c", + "70091L8;FFb35a03a9e82300f9e81740f9e083843ce82f00f9e00b42adb37e04a9a10200ada20a803db45200b9f44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd6BBL8;FFb8431fb877fdffb534008052582f40f9f8f6ffb4532b40f92a490194e00318aa2100805223490194200500b4e10313a", + "ae20318aaf60300aa26490194b3835df8L8;FF1f0100f1e8179f1a0101090a24000014e1031f2a22000014882245b8e92f4379eb4746398c9246f8edc74639eaa34639e8d303b9e9ab0779e8a759a9ecb300f9L16;FF08e30d91f04b46a9ed031aaae10316aaee0317aa000540ad08cf41f9e95f4ca9e00b", + "40f9fadb4aa9e2031baaf88f41a9fe0314aae69f43a9f40315aaebb344a9BBBL8;FFe13340f9a10000b4e02340f92200805229690194f95f40b9f78216aa7afe68d3e13740f9a10000b4e02740f92200805221690194f95f40b9e15340f9f63b40f9L8;FF810000b480825ef8220080522a690094810240f", + "9810000b4800640f92200805225690094810e40f9a1fdffb4801240f92200805220690094e9ffff17f44f41a9BL8;FFc80080d2e0230039e00300910800f0f2ff270039e80300f960efff97e80300aaa1feffb021201091a3feffb063280f91e0030091e2008052a4008052e80300f9L8;ZDBBL8;FFe002c", + "03de8f341f9e9030b91e17740f92015803de89301f9a10000b4e07b40f92200805224290194e9030b91ea0740f9e81740f92015c03df87f00f9eaa30ea9L8;FFc00200b4a0077ead971a0033a203de3c080880527f0200f917fc0039000400adc0f2c63c0208803d00f0823c60a200a9e00301917d3e0094", + "ff431391f44f45a9L16;FFe3031faa54a5009420feffb000e02d917ea50094ff8303d1fd7b08a9fc6f09a9fa670aa9f85f0ba9f6570ca9f44f0da9fd03029100e4006ff303052af503042aBBBBBBBL8;FB494420c0002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d3139", + "34396366386336623562353537662f686b64662d302e31332eL8;FFf50b40f93f0500b1400701ad4af303f8c0f8ff542a018052eb830091e013c03d690200f969010aaa60660191600a803d2001c03de23080526822003928f140f8BL8;FFff0301d1fd7b03a9fdc30091080040f9090540f9490d00b40a0", + "140f9410180390101f8b7e0031faa4a050091290500d10a2500a9fd7b43a9ff030191c0035fd6L8;FF5ffdff97c00d00b5a8835cf8080540f9280900b4a0e300d13dfeff970011003728fc60d3880600b5200840921f1800f1c2060054217c0353e10600343f080071BBL8;FFa1c300d1e00316aa4903805", + "2aa031ef80969373815e9ff97b7035ef8ba035df8480317cbdf0208eb081b0054160100b4a8835df8e10b40f9e20316aa0001178bL8;FF09692138e10313aac7fbff97818a40a940008052e30313aa19faff97810a42a960008052e30313aaf44f42a9f50b40f9fd7bc3a812faff17e00313aa22008052BL", + "8;FF09000014e00300f981feffb021a03d9183feffd063900291e00300910202805284008052ece8ff97e10340f9c6ffff17e80f41b2c0ffff17c80080d20800f0f2L8;ZDBBBL8;FBef104000000000004e000000000000005707000005000000ef104000000000004e00000000000000580700000500000", + "0fa084000000000002900000000000000L8;FFe16300917990ff977f0600b160d0ff5480220291e163009160a3ff977ffeff17e00315aa0efcff97080040b20811c0da081540d2080d088b0825019108fd46d3BL8;FFf6574aa9fd7b48a9ff030391c0035fd649008052030900f909210039f5ffff17e003", + "01aac1fefff021943c916200805258ff0014c10600b40a1440385f150071L8;ZFBBL8;FFfd7b43a9ff03019160001fd608200091200440a9e92300910a0000904ae13e91e8a700a942ffff9042902491ea0f00f9e3430091613f0194fd7b43a9ff030191L8;FFd9feff972024003728fc60d3681000b5200", + "840921f1800f102110054217c0353211300343f0800718d0100543f0c0071600200543f100071c00200543f140071L16;FFe3031d9162008052f86305f9f6030daaf5030aaae9a703f9e9af03f9e8b303f975c9ff97ebe340f9e31340f9ea0315aaecab40f9e0bb40f9ed0316aafb5340f9BBBBL8;FB6c5f", + "5051434b415f56315f4d4c4b454d3736383a41757468656e74696361746f72205570646174655369676e616c5f5051434b415f56315f4d4c4b454d373638L8;FF09fd46d30800098b080500911f0109eba808005450000014f3031faa080c47f81f0500b1c1dcff54e8031faa080113abe307005400fefff", + "000801091738f0094BL8;FFa2000054fd7bc1a8c0035fd6e00308aba3ffff54e0fefff000e037917b0f0194e0fefff000c02e91780f0194e0fefff000801091750f0194e0fefff000800391L8;FF220080522c130094e0bf40f9e8431391e1031baa990dff97e8435339e8000036e86353391f0500714c09", + "0054e80d0035ec0f41b276000014e8431391e1a740f9BBL8;FFea474039090180d2e8031faa0900f0f205000014090180d2e8031faa0900f0f229017fb24a1d409208010aaa69a200a92800805268020039fd7b45a9f33340f9L8;FFe9d742f9f5c742f9f7cb42f9080340f9c0828d3cf63b42f9e9d304f9", + "680000b4e00316aa00013fd6010740f9810000b4020b40f9e00316aa1f5300947f0b00b1L16;FFfa6742a9fc6f41a9fd7bc6a8fedcff17e0430f91f40301aa21200091024280522cd30094e92742f9020340f95f0009ebe8979f1a08219f5a081d0072c0760054BBBL8;FF34730194e802158b680a00f988", + "9640f91f0500b1a0090054610a40f9680240f91f0101eba01f0054680640f9964241b92a040091959e40f9490e80526a0a00f9L8;FF81048052480300396f6f009448236639e2074091c0fdfff000c41791c3fdfff063c03491c4fdfff08440189142800991a103805248030039636f0094c0fdfff0BL8;F", + "F8c6119538c01210b810102516b00f8374b0080524c0000143f104071c30b00544b09c0396c1d00122c380c0b811140516b00f8376b008052430000143f004871L8;FFe20304aaa120403900100012000400111f00036b00d0831a0004005101100033a1200039d3ffff17bf3b03d5411c40b92400030aa6", + "fc5f883f00066b61ffff54BBL8;FF08810991006103918b0b0094f4bb49f99f0600b1e0b2ff54f5c349f9f3bf49f9950e00b47622009104000014b50600f1d6620091e00d0054c1825ff881ffffb4L8;FFe8630091e8270ba94800805269fdff9029a11391ea030191a8a73ca928fdff90084d1491a8ab3e", + "a90a078052c8048052bfa739a929fdffb029ed0a91a9ab3ba9L16;FFfc8f00f96083843c6083c23c6183863c6183c13c6283853c6283c03ca1033aade10348adf67300f9f65340f9a203933ce10302ade20347ade20301ade1034aadBBBBBL8;FB4e00000000000000580700000500000061737365727469", + "6f6e206661696c65643a207071725f6b65792e69735f6e6f6e6528290000000000e80e400000000000L8;FFe8031f2aa0877bada0d300d1a8f31438a203d93ce1830091e00704ada08779ade22b803de00702ada08b7aade00b03ada08778ade00701ad44140094a1d300d1BL8;FFc0035fd620008052800", + "600f909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9L8;FFe8431391e2830c9163c00e9164c20391e00317aae10318aae60313aae0f3883df6431391f5db11f9fcdf11f9ff0b00b9ff0300f99dc4ff97e86b42f91f0900", + "b1BBL8;FF967208f8f60300aa95f208f814d447a9e86700f928008052fbe702a9194440f91fa007a9a80301d11f4400f9e00309aafa9303a9e59b04a9e3930139e25306b8L8;FFe15306f9e083329161fdfff021203f9102028052a3fdffb063603191a40280524c000014e80f41b2e0833291e85306f95a", + "61ff97e10300aa3e000014c80080d2L16;FF800a40921f1800f1a22e0054817e0353c12e00343f0c0071a00400543f080071400200543f040071a1080054e8b340f91f0500b1c1000054e8170291ff7316a9BBBL8;FF152300a9f7fbffb5f62b40f9f51f40f996000037d8ffffd01863089113000014d7fe", + "45d3e80214ab820e0054e90200aba20e0054aa0217cba8831cf8a8c300d1L8;FFe067c13de81700f9e83f49f9e1a7843de16bc13de80700f9e807409108810191e2ab843de09b843de19f843d96d3ff978083c23c8183c33ce85748f9f93348f9BL8;FFeb238e1a3f8100f108010b2a01feff541f1d00728", + "00000541f000039ff830091c0035fd6e8034039e9074039ea0b4039eb0f4039ec134039ed1740392811082aL8;FF7f0206720ccc74d36a018a9a6b6e1b531f1d00724a210daa8c016d924d008052720a1b1203ac6bd3615615534a490baa6b721c534a010caa6c761d534aed0baaBBL8;FFe803088b49fbf", + "fb5e0ffff1740ffff9000403a917d370194fd7bbfa9fd030091086840b91f05007161040054086c40b9080140b20811c0da081540d2080d088bL8;FFf70314aa020000141901805268fa40f9fb6340f91f0500b140020054760241f9690a42b9740e42b9681a42b9e8270529d60100b475fe40f9223b0094", + "e00316aaL16;FF220080522cbb0094ed031baad40000b4e00315aae10314aa2200805226bb0094ed031baa5f0700b140060054f4031aaa48008052fe030daaef0314aae94f40f9BBBBL8;FB5700000000000000700200004500000073686f756c642062652065786163746c7920333220627974657300000", + "00000007a134000000000005700000000000000L8;FFe10318aa68870094e0031faa66870094e10317aa6487009402feff9042202e91e10314aa6987009400feff9000202791e3fdffd063801d9104feff9084a02791BL8;FFdfa3ff97e8c357391f050071002c0054e9c31791e8c757392021c03c2121c1", + "3ce02b833de12f833dc82c0036e8830291e02bc33de12fc33d13210891e0a350a9L8;FFf44f41a9fd7bc2a8c0035fd6000180520102805263070094fd7bbda9f50b00f9f44f02a9fd030091f40302aaf303012af50300aa230b00940003805201018052BBL8;FFe20317aa23008052240080529ad6ff97f4", + "5b41a9e2feff17e0230091e10316aae20317aa230080522400805292d6ff97f45b41a91dffff17e0230091e10316aaL8;FF0a1440f9092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b250191L16;FFe87745f", + "9f21746f9e51b46f9e21f46f9e42746f9e82717a9e88745f9e97f45f9e62b46f9f62f46f9ed3346f9e8cf00f9e88b45f9f13746f9e33b46f9f03f46f9BBBL8;FFa24b0054080d80523360089b782240f9d80100b4097f089b681e40f9fb031faa08e1009122a101d1092940b93f01146b402a005442a001d", + "17b07009108a10191L8;FF01f57ed3420080522b6b0094687a40f9a80000b4607e40f901f57ed342008052256b0094688640f9a80000b4608a40f901f57ed3420080521f6b0094689240f9BL8;FFe0c30391e200805264018052f57b00f9f1f0ff97e17b40f9cafcff17ff8301d1fd7b03a9f65704a9f44f", + "05a9fdc30091081c00121f090071a1010054e00302aaL8;FF3f010bebeeb79f1aad018e1a0d0300360d4099529f010a6b4d73a77288010d0b08318c1aec030bcb08010a4b8a218bda1f010d6b4901098be30000543f0500b1BBL8;FF1e0000141f150071000200541f11007141040054280180d20800f0f2", + "17000014e00313aaf7070094e80300aae8070036e00301aaf44f45a9f52340f9fd7b43a9L8;FFf60300aa332b0094b3835df8acffff17e90313aaf54f43a9f75b42a9fb0f40b9f96341a9fc0340f9060000143c008052542340f9b4031df874f1ffb509018052L16;FFa8835e78e00bc03de193c23c01000", + "0f90ba000b8081c00790a4000390010813c01a0813c09540079f44f48a9f65747a9fd7b46a9ff430291c0035fd648008052BBBBBBL8;FB7061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f696e6372656d656e74616cL8", + ";FF5a0b00915f0315ebbb031ff87b070091a2010054480700911f0115eb420b0054a8035ef8690700d1796a7a783f0108eb41feff54a08300d152f5ff97a0835ef8BL8;FF1f0101eb40070054680640f9490280522a040091e00314aa6a0a00f909692138e10313aa88fcff97760a40f9680240f9080116c", + "b9f0208eb48060054680640f9L8;FFe0e30091f40308aabbe300d1aa120094f60f44a9a0e300d1e10315aae20316aa5e100094b9df7ca9b8d77da93f0b00b121030054350400b4a8e300d1e00318aaBBL8;FF5f0700b1a00b005448070091e0430191e143069102288052e82700f92d5f01949f0700b1e00", + "3005420630091e143019102288052275f0194e82b44b9fc7301f9L8;FFf62341f9e9230529e85b42b9e82700b916aa00b4f31f41f92a5f0094e00316aa21008052235f0094c01101b4e10313aae20316aae00f00f9265f0094e82b41f9L16;FFe10316aae20314aa2300805224008052da020094760a40f9", + "b3ffff17fd7bbda9f50b00f9f44f02a9fd03009148008052f40301aae10302aa000d002af30302aaBBBL8;ZBL8;FFe20315aa2300805224008052dba2ff97f71740f929feff17e0630091220080522300805224008052d4a2ff97e11740f930feff17e0630091e10317aae20315aaBL8;FFc0feffd000a03", + "e91c3feffd063203e91c4fefff084600991a27f00916105805269fb0094ff4301d1fd7b01a9f85f02a9f65703a9f44f04a9fd430091f60302aaL8;FFe20300aa010080d27f0001ebc0030054856861384568213821040091fbffff17c10000b4030300b4630400d181686338e1682338fcffff17e100038b", + "620400d1BBL8;FF29f9379168ae8c52200540adc88dae72084000b9880880520a008092680201a9000400ad220141ad681200f968008052695b009168a20039880700d11f0900b1L8;FFf6e743b9f7e343b9fa6740f932020014081347b8e9e743b9ea0f42f9fadf09a9f4f741f9f7fb41f9e8cb03b9e883", + "503909b305b8788242f9e90742f9a8831838L16;FF204600549f0600b1a06100541f0700b120020054380100b4e0031aaae10318aa22008052f60309aaf9030eaa22bf0094ee0319aae90316aaf50000b4e0030eaaBBBBL8;FB30adbc541aa187b21a2b5a6c0f0a035f86ec4d14e8bc2cfe6a12b8bec41f2", + "3695c3f3db95a978f187637506e0d61ed3ea28c3f90a8ea0000136ad750c24776c7L8;FFe06f00f9008300b42e8f00944000805241008052278f0094e06b00f9408200b4288f00944000805241008052218f0094e06700f9808100b4228f009440008052BL8;FFa22302d187edff9760dcffb46700001420", + "dcff54c8010014e0dbff54c80080d20800f0f20809009101010014c80080d2f55706f90800f0f2080900d107000014L8;FF1f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9600b0094fd7bbda9f50b00f9f44f02a9fd030091a87cc39bf30300aaBBL8;FFfb6304", + "91aa020094e81b41b91f050071a10100546083c03c6183c13c080080926283c23c680200f9e043803ce143813ce243823c6082803c6182813c6282823cL8;FF3f0500b140220054f30300aae00308aa20020094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b1", + "30500917f0209ebL16;FFea4742f9fed742f9e8ab00f9e81f42f9eacb00f9ea4b42f9e92312a9e82342f9e93342f9eaeb00f9ea5742f9e8af1aa9e82f42f9eb2b42f9e8df00f9e83b42f9BBBL8;FF1b000014e00700f9a1ffffb021b40291a3ffff9063c03991e0230091a20180520401805212000014e00", + "700f9a1ffffb021b40291a3ffffb063e80291e0230091L8;FFebf303f8e8f304f8e95f0139a400ff97e103002ae8430691e00315aa8113ff97e8cb40f98082c53c8182c63c8282c73c1f0500b1e00600ade20a803d200c0054BL8;FFfd7b45a9ff830291c0035fd63700805218038052a80640f91f0116eb", + "490a0054e00313aae0fbff9720fe073728fc60d3080a00b5200840921f1800f1420a0054L8;FF010004cb21fc44d383d01f3881e01f78f35341a993ffff1763141a127f003f71a1f4ff54c4ffff17610000cb2100146b60010054e203014b3f1000717fc82238BBL8;FFfad342f9e8cb42f908011acb1f03", + "08eb483c0054e8cf42f9e10319aae20318aa00011a8b2b2f0194f90b40f94803188be8d302f9df0600b14064ff5481620391L8;FFe83300b9112a0094e80356b9e00740918100805200001891ff0316b9e82f00b90a2a0094e80356b9e00740918100805200001891ff0316b9e82b00b9032a0094L16;FFe", + "11b40f9e81340f9080101cb1ffd01f1690b0054f61740f9610341ad630b40ada0c300d1c802018be90f40f962008052010101ad030900ad290dc0da600b42adBBBBBL8;FB1d1c40000000000054000000000000008d0000001400000042024000000000006a00000000000000120100002e0000004202400", + "0000000006a00000000000000L8;FFe00308aba3ffff5420feff90008001917e93009420feff9000e003917b93009400feffb000a00d9178930094fd7bbfa9fd030091083040b9c8030034080140b2BL8;FF0800098b080500911f0109eb281000548a000014f30300aacd030094e80300aae00313aa0901", + "40b22911c0da291540d2290d098b2925019129fd46d30801098bL8;FFc8c4ff97e09301b9a04700d1c5c4ff97e08b01b9a04700d1c2c4ff97e08301b9a04700d1bfc4ff97e07b01b9a04700d1bcc4ff97e07301b9a04700d1b9c4ff97BBL8;FF4800805269fffff029e12391a02700d1e1430191e82708a9", + "68ffffd008811b91e82b0aa9ca05805288038052ff2705a969ffffb029dd3591e92b07a9290080d2L8;FFe16f01f9290c40f9e1830b9120013fd6fcfb42f99f0f00b101010054c800805217ffff17e04bc13de14fc13de84345b9b47e085372ffff17f46f41f9e8c31791L16;FFdf010cebaf194092f021c", + "a9aaf1d0013cd050091160216aa820000544a1d0091ee030daacffeff374f04f837360400b42e010debe9030054aa0500d1ac0900d1BBBL8;FF220080522c770194e12b40f9810000b4e02f40f92200805227770194f70700f9a1ffffd021603f91a3fffff063480091e0230091a200805284018052e67c0", + "094L8;FF080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308eb4832005401020014e1d342f9e8cb42f91f0101eb408b0054e8cf42f9BL8;FFd6620091e0000054c1825ff881ffffb4c00240f92200805227f70094f8ffff17680240f9c80000b40805088be00314aa02", + "01805201f17dd31ff70094745642a9L8;FFc9fdff545f0060f142908b9ae20000b9eaffff17220000b0660500b4c50840f940000d91240000b081201d916300058b270080d2c81040f903a000a9c51840f9BBL8;FF290080d2a04700d1e85b09f928038052a90fc0f2ea5f09f9aa0a805221800991ff3309", + "f9e83b09f9ff3f09f9ea4709f9e85309f9e95709f97c330194f6ef47f9L8;FFa201805223fdffd063c039910401805222000014c80080d2e0632a39e0432a910800f0f2ff672a39e84b05f95b3dff97e80300aae0432a9161fdffb021c01891L16;FFf2db42f9f1df42f9e0e342f9e3235739e7fb42f9e4e", + "b42f9e5ef42f9f5835739e9f200f8e90301aae27f43f9fc7300f9fc6f40f9ef1f40f9e13340f9e3b7803dBBBBL8;FB50656e64696e675072654b65797072655f6b65795f69647369676e65645f7072655f6b65795f696474696d657374616d704d6573736167654b65796369706865L8;FF00a00d9181830", + "094e00301aa01feff9021800f91420080525d830014ff8300d1fd7b01a9fd430091e80301aae00700f901feff902120109104feff9084a00f91BL8;FF4043ce3ce0234d39c282853ce11740b9e33740b9408708ade42740b9fb6304f9020140ade8031691f56704f9f76b04f9428309ade90300f92ea3ff9", + "7e8c342f9L8;FFe1e3069102288052f70b00f9f9430c91f7e30191f4e306912e070094e00745ade1430c91e86340f9ea8b40f902288052e94f40f9ebdb40f92083823ce083cc3cBBL8;FF8cf8ff97a8835cb8480d0037a8835df86a0340f9490108ebc33000548a0340f9b8035df84801088b880300f9690", + "300f908ff60d3680a00b5000b40921f1800f1L8;FFe90280521a00f0f2e98316a90000803d08f000f8e9bf00f9e81f40b9e8030639e10740f961cdffb4e01740f91a000014e90310916affffd04a51059140fdffb0L16;FFe95742f9e3d742f9e0af823de8b700f9e84b42f9e34b00f9eba318a9e84f42f9", + "eb7342f9e8eb00f9e85b42f9e88f00f9e85f42f9e82714a9e86742f9e96342f9BBBL8;FFa83b0079e91300f9e93340b9e8d30378e83343b8ec730378e8b300b8681d0012e90b00b9e91340f9e863003908208052e90b00f9e90b40b968020079e8b340b8L8;FF080500911f0048f1680a00f9e3fdff540b7", + "c0e533f0108eb7361193220010054536928380cfc5cd308050091290040f9280800f90c0200b500fc55d393000014BL8;FFdcf7ff97001200b520fcffb4d6ffff17890240f93f0500b1c10000549f5e00a99f7e01a9977e02a9981a00f99f3200f91f0900f1a10f0054e00313aadaf3ff97L8;ZDBBL8;FF6", + "10a40f9810000b4600640f92200805229270194611240f9410900b408038052606a68f822008052f44f41a9fd7bc2a821270114604a40f9a00000b4614e40f9L8;FF2d270094f3ffff17681640f9280100b40805088be00314aa01ed7cd302018052f44f42a9f65741a9fd7bc3a822270014f44f42a9f657", + "41a9fd7bc3a8c0035fd6L16;FFf23300f932825fb831c20191e041813ce20343ade141803ce117c03d12c21fb800c29e3c02c29d3c01c29c3ce0c3c33ce1c3c23ce2c3c13cf24f40b9018200adBBBBBBBBL8;FB65206b65793a20c00e20616e6420636f756e7465723a20c0022e20c0002f636172676f2d6", + "769742f737061727365706f73747175616e74756d72617463686574L8;FFf80302aaa20ac03da81a40f9f30300aae0630191a1e2009102328052f40303aae00701adf6430e91e213803de82b00f928a40094e0630191e10314aa1b1c0094BL8;FFe00314aae10313aa8f010094e00315aae10313aa8c0100", + "94770a40f9680240f9080117cbbf0208eb6800005455fdffb5f0ffff17e00313aae10317aae20315aaL8;FF54000014e00700f9e00301aaf30301aae10309aa220080522300805224008052f4030b2abf0000946aa240a9e00740f9690240f9e10313aa5469283808050091BBL8;FFe233803dd7020191a8", + "2735a9e18307adad06009400e4006fa0833aada0833bada003d53ca103d63ca203d73ca303d83ce33f803de23b803de137803de033803dL8;FFb60a40f92a040091b41640f9490280526a0a00f909692138b60900b4c80240b20811c0da081540d2080d088b08250191c81a488b08050091f40800b489024", + "0b2BL8;FF880080d2e10700f90800f0f2b9ffff17e80b41b2e00700f9b6ffff17880080d20800f0f2080140b2b2ffff17880080d20800f0f208110091aeffff17e00300f9L8;ZDBBBL8;FB6f75626c65205261746368657420666f7220746865736500bb124000000000003800000000000000ca0100001d", + "000000bb124000000000003800000000000000L8;FF800100b4e11740f9e80f40f91f0101eb40880054e81340f9090180522a040091ea1700f909692138e16300916f91ff97e00314aa080c4af81f0500b160000054BL8;FFf44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6fd7bbea", + "9f30b00f9fd030091f30300aa2504019420048052210080521e040194400100b4L8;FF200080521d000014f503002af8031faaf94b1432680218eb1f0119eb1631999a7f0218ebf7979f1a290200548102188be003152ae20316aa2f170094600100b4BBL8;FF29194b8b2905009129010a8b2a0140b24a1", + "1c0da4a1540d24a0d0a8b4a25019129194a8b29050091340108ab830000542d000014f40308ab62050054152040f9L8;FF030b00544b0dc0396c1d00122c540c0b810148516b00f8378b0080523a0000142b7c1c534b0a00344d11c0390b00be522b000b0bac1d00128d00f83761710c8bL16;FF095540f9", + "eaa710a90a254ba9eab700f9e9cb00f90a254ca9eaeb00f9e99b00f90a254da9e98f00f9097140f9e92b14a90a7540f9e9c747f9ea1300f90a7940f9BBBBL8;FB637431456b53656e744374315265636569766564456b53656e744374315265636569766564726563656976696e675f63743200000000000", + "08515400000000000L8;FFe00308aa20020094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb09290054088c48f81f0500b1BL8;FF1f0109eb89040054140114ab230100541e000014f4031faae00313aa080c45f81f0500b1c1fdff54f403", + "14abe2020054688e48f81f0500b140020054e00313aaL8;FF0a790039097d0039e9ab56290a81003909850039e9ab55290a890039098d0039e9ab54290a91003909950039e9ab53290a990039099d0039e9ab52290aa10039BBL8;FF3f040071a101005481c20091a2630091e003082a7fd9ff9760faffb4", + "5800001481620091a2630091e003082a6ad8ff97a0f9ffb449000014a2630091e003082aL8;FFe0234d39c282853ce11740b9e33740b9408708ade42740b9fb6304f9020140ade8031691f56704f9f76b04f9428309ade90300f92ff0fe97e8c342f9200bc03dL16;FF76feffb537008052935600a9935a0", + "1a9975a02a9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd620008052e10313aa5dd0009420008052e10316aa5ad00094BBBL8;FF680240f9080117cbbf0208eb48330054680640f9e10316aae20315aa0001178b2c740194e802158b680a00f9952240f9550300b4610a40f9680240f9961e40f9L8;FF", + "00011aab62570054e1431691c60c00943f0700b1f90b40f9e0070054e1d342f9e8cb42f91f0101eb40330054e8cf42f92a040091002302914901805209692138BL8;FFf90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f090071e1", + "010054e00302aaf40302aaL8;FF020180d2e00315aa210440f92100028b30f4ff97c00640f973420091016873f83f6400f1610000b481ffff54f4ffff1780020e9121008052e22740f982c201f9BBL8;FFe8cf42f9e10319aae20318aa00011a8b303401944803188be8d302f9e06749f9f90b40f9800100", + "b4e1d342f9e8cb42f91f0101eb20bf0054e8cf42f909058052L8;FF68fdff9008411c91e94f05f96903805220fdff9000401891e8f301f9e1432a91e8fb01f968fdff9008412491e3830f9142008052e9f701f9e9ff01f9e80302f9L16;FFe0431091881a40f9890e40f9a1e20091f46b40f98083813ca10", + "3963ca88318f8a90317f85f170094a00b7bad480080d2a103d83ce307c13d0800f0f2f42300f9BBBBBL8;FB6e7420636861696e9f1b40000000000034000000000000006e0100000e0000009f1b40000000000034000000000000006f0100001d0000009f1b400000000000L8;FFf85f03a9f65704a9f44f", + "05a9fd030091ff4309d1f70302aae20301aae10300aae0830091fa0307aaf60306aaf90305aafb0304aaf80303aa49050094e81340f9BL8;FFe0031faa68180194e00741a966180194ff8302d1fd7b06a9f73b00f9f65708a9f44f09a9fd83019128008052f30300aa3500028bffa300a9f6fefff0d6623e", + "91L8;FF29210191d5018052ea008052fa0316aadb01805203000014e97b42f9ea7f42f9e0431391e86b02f9fb6f02f9fa7302f9f57702f9e97b02f9ea7f02f9b0f5ff97BBL8;FFc082c33cc182c83ce20301adc282c13cc082c53ce123803df9ff4039c182c03ce10b00adc282c43c020119cbb80202ebe2", + "0302ad02010054e002198be10314aaL8;FFc0f5ff9760dcffb46700001420dcff54c8010014e0dbff54c80080d20800f0f20809009101010014c80080d2f55706f90800f0f2080900d107000014e05706f9L16;FF69d80094fd7bbfa9fd030091090040f9280140f93f0100f9e80000b4291040393f05007", + "1e0000054000140f9fd7bc1a800001fd680feffd000e0169161d80094BBBL8;FF220080522c7c0194e4ffff17fd7bbea9f44f01a9fd030091010040f968028052290041d23f8d00f12831889a1f6d00f148040054a9ffffd0294107918a000010L8;FF00800991e193843de103c43d21800191e07f843de0", + "07c43d023f8052e82b09f9e183843de28b843de087843d297c0094f9431591b40000b4e00315aae10314aaBL8;FFc8feffd00821079169d600a9690e00f9680200f9f44f42a9f65741a9fd7bc3a8c0035fd600018052010380525df80094e00301aac1feffd021c0099162018052L8;FFf50b00f9f44f02a", + "9fd030091f30300aac2000037e00313aaf44f42a9f50b40f9fd7bc3a81b000014750a40f9680240f954fc41d3080115cb9f0208eba8010054BBL8;FFab735838a95318384901084aaa835838a96318386901084aab935838a97318384901084aaaa35838a98318386901084aabb35838a99318384901084a", + "aac35838L8;FF9f0e00b12801003901010054f55b40f988008052a802003948008092480300f988008052e6070014e903182ae04f40f9e803172a2a7d60b3fa6700f9188116aaL16;FF81ffffb4600340f9220080522abc0094f8ffff17d60000b4c806168be00314aa0201805201f17dd323bc0094fcde7", + "8b364020014f9031faa89050014f57740f9BBBBL8;FB91950000ea2740508d60a1644ed5151b26d3654b4a93a242c8b33943df5d95600f26341bda8b07e91c6d4a2c7a47a1b3d7a7539ac0e0f1fbd1a00da647de446fL8;FF52023291480100b0080140391f05007181eaff54deffff17fb6344a9530b00d", + "1fa2b40f9f93340f97f0214ebf63b40f91c038052a2050054480100b008410091BL8;FFe97706f98908019452000014e0032d9159e6ff97e1fb42f93f0400b1a0140054fb4340f9fa830291810000b4e0ff42f922008052200c0194e8c3179100810091L8;FF08070054f4031faae9031faaf50000b46002", + "148be10308aae20315aa2d0c0094e10318aae90314aae80740f93501158bf50f00f9090115cb285041a99f0209ebBBL8;FFe80f41b2e90317aa120000141f09007161010054080180d2e9de78920800f0f2080140b20b000014080180d2e9031faa17ff48d30800f0f206000014080180d2L8;FF84a00491", + "e3230091e2018052e80700f95d480094fd7b41a9ff830091c0035fd681fdffd021b80591c202805259480014fd7bbfa9fd030091083040f9080100b4L16;FF0329009135290094e8a343f9eab343f9e0030991e9ab43f9ebcb43f981e20791e84700f9e8a743f9022f8052e04bc23df5df43f9fae343f9e8", + "6b00f9e8af43f9BBBL8;FFe2050054b800f8b6f9031faae00319aae10318aa64680194980500b4296c0194e00318aa2100805239008052216c0194e0feffb4f70300aaf88300a9ff0f00f9L8;FFfd030091140040f99f0600b1e0030054012440f9f30300aa3f0400b140010054810000b4602a40f922008", + "052226c0094613240f9810000b4603640f922008052BL8;FF8182813c8282823c4f000014e08744ade00314aae22fc03da0873cade08742ada2039b3ca0873aade08b43ada08b3bade18340ada18338ade08b41ada08b39adL8;FF00008052feffff17fd7bbfa9000000d000001d91fd030091aefeff97fd", + "7bc1a8000000d000e01c91c0035fd6fd7bbfa9fd030091fd7bc1a8c0035fd6fd7bbfa9BBL8;FF2d2c0194e12740f9010b00b4e00315aa54000014e88241f8e082c03ce9c302912a0100f04a51059100fffff000e02c91e86300f9e863019108210091a10303d1L8;FF6928009420008052e10319aa662800", + "942000805201048052622800942000805201c480525f280094fd7bbea9f44f01a9fd030091f40300aa2301f8b7f30303aaL16;FFa003d43cff0f01f96022803de027c13dff0b01f96082893ce087c03dbfff3ca9682600a988f247f8a9e300d1602e803d2001c03dff6702f9ff6302f9681200f9BBBBBBL8", + ";FB20c00129002f72757374632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c6962726172792f737464L8;FF9c0a40f91c2a003788ff7ed3282700b5fa0301aa5c0700b497fb7fd329a00094e00317aa4100805222a00094602600b4930a40f9", + "f60300aafc831ca9ffef00f9BL8;FFe02300910201805264008052f2250094e10740f9b1ffff17e80f41b2abffff17e80f41b2b9ffff17a0031df801ffffd021a4139103ffffd063f41391a0c300d1L8;FF2d2000948003c03d80e20091e1230091022780529b6a00a9976601a9961200f98082823c2b200", + "0942800805268420039ffc30b91f44f45a9f65744a9f85f43a9BBL8;FF2d600194e00314aad8e3ff9788ffffb008510d9109058052682601a9c842009109008092692200a9ff431c91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L8;FF29ed0a91a92b3ca9290080d2e92fc0f2a87f3ba9a8273ea98", + "45c0094e11b40f9810000b4e01f40f92200805222600094e10f40f9810000b4e01340f922008052L16;FF83fefff063801391e00300f9e0030091e20080526400805209000014e00300f981fefff02174149183fefff0633c0f91e0030091e200805244008052e6e5ff97BBBL8;FB3861323239636561656", + "664343938356335303939306231343131366236643835366166303938352f6c6962726172792f636f72652f7372632f736c6963652f6dL8;FFe0630091220080522300805224008052daa3ff97e11740f9b0fcff17e0630091220080522300805224008052d3a3ff97e11740f9b8fcff17e0630091220080", + "52BL8;FF210080522b000194c00200b4e10316aae20313aaf50300aa2e000194020000143500805268fe4ad309088052954e00a90811c0da280108cbe90080521f1d00f1L8;FFe00316aad6090094e00315aaf44f43a9f65742a9fd7b41a9ff030191c0035fd6ffc300d1fd7b01a9f44f02a9fd4300913f4", + "000f1f30300aa280100543f0013ebBBL8;FFb8835cf849000014a0031cf841ffffb021ec039143ffffb063d00191a00301d162028052840180523e000014f80300aa3e000014a0031cf841ffffb021ec0391L8;FF60ce01f961d201f9290c40f9e8830f91e1031baafb6300f920013fd6f4f341f99f0e00b", + "16100005468008052fa030014e8c30d91fa6700f979d241f91ad14778L16;FFc07d005459cbff975c008052c00400146183c93c6283ca3c6083c43c6383c83ce107813d6183c53ce20b813d6283c73ce0071ead6083c63c6183c03ce28f1fadBBBBL8;FBfb887781f1db4c69aaefa9449d928f4307a6ff0d", + "3c7cf8dc1cf32b6e3c339a56f9154dcaedd571644007d877e3ee71395db1c30e3743d71cd11b0100744059e1L8;FFe00313aa40000094080040b20811c0da081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aa080c45f81f0500b180020054BL8;FF01830191a2230", + "2d120ecff9740fcffb46f010014e02e00b5a02302d1f9ecff97a00d003681fbffb47a01001401e30191a22302d115ecff97e0faffb449010014L8;FF89008052e0430091a1c300d162008052f82b00b9a8273da9bb5f3ea9b4733fa9d5030094bc0000b4e00314aae1031caa2200805220100094e0031baa", + "e10317aaBBL8;FFfa6742a9fc6f41a9fd7bc6a8c0035fd63f0700b1c0e9ff54e0c30c912ad4ff974bffff1738008052df0215ebf54702f9f84b02f9ff4f02f929f7ff54e0231291L8;FF29010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba901", + "0054200108aba2000054fd7bc1a8c0035fd6L16;FF09c440f9e95f00f909c840f9e9e300f909dc59a9e95b00f909d440f9e93f00f909d840f9e9f300f909dc40f9e93300f909e040f9e9f700f909e440f9e92f00f9BBBL8;FF68f60737e80f40f9890640f92a0108eb43230054890240f9e00316aae30317", + "aa2801088be90b40f9882a00a928fd60d3681700b5280940921f1900f142180054L8;FF081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a297e6c0094fd7b47a9ff030291c0035fd6BL8;FF081c00121f090071a1010054e00302aaf30", + "302aaf40301aae3fcff9720020037750240f9a80640f9160101eba2020054e80f41b2e81300f907000014c90080d2L8;FF03c05f3801d05f3802e05f782110001203010034620000349f000039007d20d402805fb8e3ff9f525f00036b6dffff54436c1c53e401809283c023cb0400038bBBL8;FF1001001", + "4e8031faa000119ab426e0054e14316918c0d0094f90b40f9df0a00b100040054e1d342f9e8cb42f91f0101eb204f0054e8cf42f92a04009180020391L8;FF0900f0f23a017fb2691f4092011880521b0109aa050300141f09007121070054090180d268df78920900f0f23a0140b2691f40921b0109aaa1", + "035df8415f00b5L16;FF00f18f3c00884dade8e70891e023009101f18f3ce867099102f18f3ce827099100f18f3c2bb0009468e20791e02300917c200094e0630691e123009102328052BBBBBL8;FB7900000000000000bb124000000000003800000000000000490000000a000000bb1240000000000038", + "00000000000000520000000c000000bb12400000000000L8;FF080040f9090140392a0900d13f09007149819f9a290100b43f0500f1e102005408fefff008c13b91e00301aae10308aa8202805257940014ffc300d1fd7b02a9BL8;FFf30b40f9fd7bc2a8c0035fd6080141d2e90080521f2d00f10831899", + "a09ffff90290900918a0000102b6968384a090b8b40011fd6088c40f81f0900b1411d0054L8;FFe8431391e00316aa9c12ff97e9435339e86753393f05007101010054e96353393f050071cc160054f8db40f9894e0035ea0f41b27a02001409a340b8eabf4979BBL8;FFe92f5d29e82b14292809c05a690", + "9c05ae8271529e88f40f909208052e08744ad282508aa080dc0daa0073dadff230ca9e28345ada2033ead5e54019400e4006fL8;FFe8c357391f050071002c0054e9c31791e8c757392021c03c2121c13ce02b833de12f833dc82c0036e8830291e02bc33de12fc33d13210891e0a350a9600600adL16;FF", + "680640f997fe5cd318693538d50e0091750a00f9d70000b594fe55d3680240f9bf0208ebc104005423000014680240f9897e1553bf0208eb3961193261000054BBBL8;FF681a00b5e00a40921f1800f1e21a0054e17e0353e11c00343f080071ad0100543f0c0071a00200543f100071200300543f140071", + "6104005421230191e20313aaL8;FFf5b349f9f3af49f9551600b47622009104000014b50600f1d6620091a0150054c1825ff881ffffb4c00240f92200805221780094f8ffff17e807409108810991BL8;FF6b090c8b60011fd600200091f44f42a9f65741a9fd7bc3a88c02001400200091f44f42a9f6574", + "1a9fd7bc3a814030014e80300aa098d40f83f0500b1a0000054L8;FFf9ffff17210000b0e0b340f9e27340f922e003f9600000b4210000b020dc03f9a0221d91e14b40f9011800f9540100b4220000b0210000b08006009142ac40f9BBL8;FF80430891e207c43d8162019102328052e07f843de183843de", + "287843d2d380194e0074091e107409102388052008009912180019127380194e92342a9e00319aaL8;FF34380094e0831591e1831a910228805230380094ff0a00b161c9ff54a4010014fc432a912f010014c80080d2e14f05f90800f0f2080900d1ca000014e04f05f9L16;FF6ffeff17fa031faabcfcff", + "1737008052fc7740f97c0500b42ab80094e0031caa2100805223b80094005900b4e10319aae2031caae05f00f926b8009423000014BBBBL8;FB4700000000000000310100000d000000bb114000000000004700000000000000320100000d000000e06c450000000000f06c450000000000f06c450000000", + "000L8;FF420080522c880094e81b40f9e8cdffb572feff1700feff9000000e9102feff9042600e91e102805265840094e2fdfff042a02391e10319aa6484009400018052BL8;FF1f0500b160000054e02b40f95ae2ff97f4db51a9960100b49822009104000014d60600f118630091e000005401835ff881", + "ffffb4000340f9220080521e080194L8;FFaa0b00b40901403929c100513f250071880b00545f0500f1000b00540b0540396bc100517f250071c80a00544c0180525f0900f1292d0c1b000a00540b094039BBL8;FFb4835df84801088be80200f9c90200f988fe60d3e80a00b5800a40921f1800f1e20a00", + "54817e0353010b00343f08007100fbff543f040071c1000054e1c30091L8;FFe3838b3ce3838c3cc7e3fe97e89341b9080e00362007c03de9b341b92143c23ce8c741b9a600001488fdffb008611b9169038052d0feff17eaa759a9e8430f91L16;FFe8ef43f9e8af15a9e8f743f9eb3b44f9e9a310a9e8f", + "b43f9e90744f9e8b700f9e8ff43f9eaa318a9e80344f9ea0b44f9e8eb00f9e81344f9e82b14a9e81b44f9BBBL8;FF88fffff009390c91280e8052ff6f03a9e92308a988ffffd0097d2e9188068052fc7f04a9e92305a9fc6b07a97f640194e3ffff17f5031faae00315aae10313aaL8;FF7866ff97e00313", + "aae1031faae20314aa1a070094770a40f9680240f9080117cb9f0208eba9fbff54e00313aae10317aae20314aa11070094770a40f9680240f9BL8;FF42018052a4018052eeffff17e00300f9a1feffb021e81491a3feffb063b01591e00300914201805244018052e5ffff17e00300f9a1feffb0210c1691", + "83fefff0L8;ZDBBL8;FF0827089b29008052097d02a9090180521a7100a91c0700911a7d01a91f2503a91f2100f92003c03d0081843c2007c03d0081853cfc2700f9da0000b4e0031baaL8;FF800642adea03172a09dbd99380020291080d0aaae103009122008052e00702ad800640ad290dc0da080dc0d", + "a892207a9e00700ad820243ade20303ad810241adL16;FFc1000054f91b40f9f40740f9f3031f2afb031faa3a000014e00313aae10314aa22008052f3030caa23a80094ab835ff8ec0313aae0c20191f40740f9fa0000b4BBBBBBBL8;FB627369676e616c2f727573742f70726f746f636f6c2f7372632f7", + "0726f746f636f6c2e7273001243616e6469646174652073657373696f6e20c0223a2063616eL8;FFe40316aaa8273fa95b9e0094e0031a2ae1031b2a280340391f05007181f8ff54ddffff173f0014eb3c30949afc0500b4f4031f2a35feff90b5420c91ba4300d1BL8;FF3f0108eb93611932000100540d", + "fc6ad35369283808050091280800f94d0200b5e0030baa61000014e10300a9e00301aae10309aa22008052f4030baad7050094L8;FFf55f42a91f0b00b1e1020054770300b4e8430091e00315aae10317aad0b3fe97f80b40f91f0b00b161050054e87b4039e93b407939008052ea1b40b9ebdf4039BBL8;", + "FFe2031baa23008052240080529aedff97b7035ef8ba035df8480317cb7f0308eb69e3ff54a0c300d1e10317aae2031baa23008052240080528fedff97b7035ef8L8;FFe20315aa0001178b32620094e802158b680a00f9951640f9550300b4610a40f9680240f9941240f91f0101eb40070054680640f94", + "90480522a040091e00315aaBL8;FF200840921f1800f1220a0054217c0353410a00343f0800718d0100543f0c0071200300543f100071800300543f1400710105005481c20091e20313aaf6edff97L8;ZDBBBL8;FB0201000005000000650d40000000000011000000000000002701000005000000650d40", + "000000000011000000000000002e01000005000000650d400000000000L8;FFe8031faa000117ab42680054e1630091768fff977f0600b18000005480220291e163009154a4ff97df0600b160afff54e263009160008052c7000014e8031faaBL8;FFb502000a1f01096be0179f1a42170194886e4039696", + "e4039b502000a1f01096be0179f1a3c1701948872403969724039b502000a1f01096be0179f1a36170194L8;ZFBBL8;FF42e83391ea0f00f9e34300916b3e0194fd7b43a9ff030191c0035fd6202040a941ffffd0211c3391030d40f982048052fd7b43a9ff03019160001fd608200091L8;FF2184199183", + "fdff9063f01991a0c300d142018052440080521a000014a0031df881fdff902184199183fdff9063ac1991a0c300d1420180524401805211000014L16;FFec030baaf67b40f9ef7347a9e8f700f9f0008052e30302aaebcf40f9ee174da9e97b4ca9e7cf00f9e8d740f9e0b3c23dedb300f9fa5740f9f44b", + "40f9ea2312a9BBBBL8;FBb904000017000000ef104000000000004e000000000000005707000005000000ef104000000000004e000000000000005807000005000000b51d400000000000L8;FF080c48f81f0500b1c1fdff54f40314abe2020054688e4bf81f0500b140020054e00313aaae010094080040", + "b20811c0da081540d2080d088b0825019109fd46d3BL8;FFe84f42b9f62341f9e9230529e85b42b9e82700b916aa00b4f31f41f929120194e00316aa2100805222120194c01101b4e10313aae20316aae00f00f925120194L8;FF08c10e9149410bf8ff0300b9b5dfff97e8db51f91f0d00b1a00600541f0", + "900b1a104005428008052ff0701f9e80b01f9e89340f9ff0f01f9a80000b4e08b40f9BBL8;FFa0077cade237803da203d73ca1c302d1e2030091030a8052e32b803de00703ada1037dade217803d3a030191a82735a9e10304ada4f4ff9700e4006fa0833aadL8;FFc01300b4e10314aae20319aafc0300a", + "a30520094542340f9b4031df8b40100b58200001436008052571740f917fcffb538008052482740f91f0500b121fdff54L16;FFf30301aae10308aa220080522ad20094e10313aa28d440f9e80000b420d840f9f30301aae10308aa2200805222d20094e10313aa28e040f9e80000b420e440f9BBBL8;FFe", + "20315aa23008052240080529afdff97770a40f9f7feff17e00313aa22008052230080522400805293fdff97610a40f9fefeff17e00313aa2200805223008052L8;FFe3fdff17e0431691e1031aaae20318aa1a110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aa1111", + "0094fad342f9fc074091BL8;FFf44f42a9fd7b41a9ffc30091c0035fd6f30300aae00301aaf40301aae10309aa220080522300805224008052d3150094880a40f9e00313aae10314aaedffff17L8;FFa00080d2f403002a0a0000141f0c04eb29f3ff54400080d2f403002a050000141f0804eb89f2ff546", + "00080d2f403002a007f009b830400d1fa0180925a0300cbBBL8;FFe1d342f9e8cb42f91f0101ebe08b0054e8cf42f92a040091802202914901805209692138ead302f91e1e0094e1431691850f0094e09b49f9800100b4e1d342f9L8;FFf4e342f9680000b4e00314aa00013fd6c10640f9810000b4c20a4", + "0f9e00314aa253200945f0b00b141100054f5833f91bb070036e88340f9e0074091f69340f9L16;FF82620791e0031f2ae3031faa53ae0094e843009145feff90a5002591e1c3099102210191e0031f2ae3031faa4bae0094ff4303d1fd7b09a9f85f0aa9f6570ba9BBBBBL8;FBef104000000000004e000", + "0000000000001050000140000003d0f4000000000004a00000000000000b602000009000000cb144000000000007200000000000000L8;FFc0035fd6680100b008210091e923009103feffd063400c9104feffd084e00c91f303002a00210091f403022aa2630091f503012a21008052e80700f9a90f00f9", + "BL8;FF6b25019129194b8b2905009129010aabc20600542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9050054280108abL8;FFf003182aee03082ac108001418fd78d3ed7f42f9cefe60d337fd60d3dcfe78d3f003182ab91e00b4ca7e0853e0031baae1031", + "9aa22008052f9030baafb030caaBBL8;FF74fdffb5eeffff17ff8303d1fd7b08a9fc6f09a9fa670aa9f85f0ba9f6570ca9f44f0da9fd0302910080c53c0180c63cf40301aa083c40f90280c43cf30300aaL8;FF08068052e1f342f9e02fc13d6906089be8f35639e133c13de237c13d620600911f0900712", + "00500ad2209803de2f702f9e083ff541f0d0071f3c31291c16c0054L16;FFd3ffff17e1031faae8e300f959ffff17e1031faae8e700f956ffff1740eeff54bc010014c0c200910830009472ffff17e8af40f9140101eb02010054e7000014BBBL8;FFff430191c0035fd6e80b40f96a0640f9490108eb430", + "200546a0240f9e00740f94801088b682600a9800200f9e0031faaf44f44a9fd7b43a9ff430191c0035fd6L8;FFc001005400c300915c2c0094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb68000054fe040014e8031faa160114abBL8;FF890600910815148b", + "010900a9031101a9690a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6e00313aaf50304aaf70303aaf60302aaf80301aa06000094L8;FFf3fcfff073fe1091e8018052e0018052f32302a9d3030094400c00b4690240f96a7240f8e8018052e80303a9090000f90a7000f8e0c30091e82300f90bf", + "dff97BBL8;FFe00300ad0809c05a2909c05ae00301ad8e3e5029e003c03de107c03de20bc03de30fc03d830e803d820a803d8106803d8002803d682600294809c05a6909c05aL8;FF0227c03da826089b008743ada9060091fb6300f9000500ad0209803de9ef01f9e0432a916ef4ff97687a40f91900809", + "2f9f301f9c87300b4090380527b7640f9L16;FFe22fc23d3b8108aae97344f9eaef43f9e00717ade02bc23de10fc23de9a301f9e97740f96b114df8e00b18ade213c23de417c23de95300f9eccb43f9e00bc23dBBBBL8;FBd885d395cea5c5b5f4c5ffd5e2e5e9f580058b1596259d35ac45a755ba65b175", + "6395688575b57ea54fd544c559f552e53b1530052d35262517551c4501750a65L8;FF7f0200f97f8a01b9ff430791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd608fd41d3f6031faa18038052f9230191170500910a000014BL8;FFe8c31791e16f01f9290c40f9e1830b9120013", + "fd6fcfb42f99f0f00b101010054c800805217ffff17e04bc13de14fc13de84345b9b47e085372ffff17f46f41f9L8;FFe8031faa090180520968283808050091e1230091e00318aae80f00f9cde5ff970500001428008052ff0f00f9ffa300a9780d0035570300b4e10f40f9e80740f9BBL8;FF0e0000142", + "8008052ff2300f9e80b00f9353b40f9345341b9285741b9e83f00b915fbffb528008052e81b00f9364740f916fcffb539008052e88740b9ea4740f9L8;FFc0008052210080522a4a0094c00200b4a8cc875289c78d52e9cdad7208080079c8008052090000b9680200a9680a00f9fd7b43a9f32340f9ff43", + "0191c0035fd6L16;FFe8eb41f9eafb41f9e9f341f9eb1342f9f96b42f9ec6f42f9e84700f9e8ef41f9fe7342f9e78342f9e08742f9e68b42f9e86b00f9e8f741f9f08f42f9e2a342f9BBBL8;FF220080522c6a019448008052a00302d1e3830291e10315aa0204805224008052e88302391b1a0094a82240", + "b91f05003120290054600740ad1c050011e97f40b9L8;FF600a40f9220080522b6a0094611240f9810000b4601640f922008052266a0094611e40f9810000b4602240f922008052216a0094612a40f9810000b4602e40f9BL8;FFc00300b5e1031faac6ffff17c1010054e1031faab2ffff17880080d2e10", + "700f90800f0f2aaffff17e80b41b2e00700f9a7ffff17880080d20800f0f2080140b2L8;ZFBBL8;FF6ec1ff97e99341b93f09007121080054e8cf40f9e9a341b9ec030b91eaa741b9e86301f9e9cb02b9eacf02b9080380d20800f0f21a1100d1e9d342b9204bc03dL8;FFff0300f908088052f50302aa20", + "10c03c2a7c40392900403921f0c03cf30300aae1830191e013843c00e4006f4815003329111d12e00304aa02088052f40303aaL16;FF226cc03d000400ad202000910209803d021900f9fd7b41a9ff8300915eb1ff1725feffd0a5202a91e1230091e2030091e0031f2ae3031faa48a6009420feffd0BBBB", + "BBL8;FB001a73657373696f6e20737461746520636f727275707420666f7220c00008696e76616c696420c00a206d6573736167653a20c0002f636172676f2d6769742fL8;FF24008052ddc1ff97e00744a9f3ffff17f5e703a9ff2700f9f50b40f9e80340f9bf0208eb01faff54e003009167990094cdff", + "ff17e00740ad60220091e20bc03dBL8;FF2801088b140b00b4890240b22911c0da291540d2290d098b29250191891a498b29050091200108ab220a0054e10313aa85fbff97b7010034610a40f9680240f9L8;FFa1835af8220200b4e10700f9a08301d1e10316aa3e110094b7035af8ff0600b1400900546", + "083c23c6183c33c6283c43ca9eb7aa9e10740f9e20304adbbf37ba9BBL8;FFea0319aa2c8541f88d0140b28c010b8bad11c0daad1540d2ad0d0d8bad2501918c194d8b9f010bebc31300544a0500f1eb030caa81feff54890119aba2040054L8;FFe91f03f9895a0094e1fb44f9810000b4e0ff44f922008", + "052275e0094e0c31791e1833291022b80522a5e009440030291e1c317914ffefe973c008092ab050014L16;FF2a040091e00314aa6a0a00f909692138e10313aa75ebff97760a40f9680240f9080116cb9f0208eb08080054680640f9e10315aae20314aa0001168b25de0094BBBL8;ZBL8;FF1b08805275", + "cdff97089080520083c23cf54f09f9e84b09f9f57749f9fb6709f9f46b09f9f47349f9e0a3843de0a7c43d4383c63ce85309f9e2a3c43df95709f9BL8;FFe40313aae50314aaf44f42a9f65741a9fd7bc3a840feff1780fcff97fd7bbda9f65701a9f44f02a9fd03009115fcdfc8f40302aaf30301aaf603", + "08aab5010037L8;ZFBBL8;FFf33340f9ffc30191c0035fd61f09007181010054ea0f40f9090180d20900f0f248dd7892290140b20a000014ea474039090180d2e8031faa0900f0f205000014L8;FF2d3e0094df0600b1a0300054e85f40f9e0c32491f69b04f9fa9f04f9e8a704f9e86b40f9f7a304f9e8a", + "b04f9e85740f9fbb304f9e8af04f9e8830f91b8eafe97L16;FFed0316aae38717ad2181cb3ce60309912381c83ceabb43f9fa6b00f9e28716ad2181c93c2281c33ce7bf43f9f5a35d39e24344f9e38715ad2181c43c2381c63cBBBBL8;FBb1c272282b2fa4aae8600b70f9ef08d994ca63628cac268b7116", + "45dd061128ea31f8f897dfcbda279d1878f1a28c1ee803560000a338555bbb2f39fc95452cdbL8;FF131700f92f8e0094c000805241008052288e0094a06600b468008f52130303a9080800796800af52080000b968008052e80f00f9132300f933fb7fd3218e0094BL8;FFe10300aae15306f9e0833291e", + "1feff9021203f9102028052e3feffd063401e91a40280524c000014e80f41b2e0833291e85306f959140094e10300aa3e000014L8;FFa00400b4c1060091e20314aaf50300aa300e009416000014e80f41b2680200f9f44f42a9f65741a9fd7bc3a8c0035fd6e91741b268220039690200f9f44f42a9BBL8", + ";FF2a01805208a800a91f0000f9fd7b44a9ff430191c0035fd660ffffb000e0299162ffffb042002b9161088052694a019429244039e00700f93f0900f1a2010054L8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eba808005450000014f3031faa080c47f81f0500b1c1dcff54", + "e8031faa080113abe3070054L16;FFe33b40f9fe1740f9e03340f9f5ef40f9fa8740f9e0c7c33da8008052f80306aae87300f9e60302aaea0314aae0f3803df00300aae0030eaaf9031baaef0303aaBBBL8;FFff830191c0035fd61f09007181010054ea0f40f9090180d20900f0f248dd7892290140b20a", + "000014ea474039090180d2e8031faa0900f0f205000014090180d2L8;FF60c30291bc0302d1e596ff97a80358f81f0500b120120054e082c13ce80700f9e8030b91f7430f91f89301b9e91740f90029803da8835af8e0430691e10244adBL8;FFe20313aaca070094f50300aa500200143f0900b1400e005", + "4880080d20800f0f23f0108ebc10d005481220091e20313aa060b0094f50300aa450200143f0900b1L8;FF3acf74923f001aebe10300541f0400b100f8ff54c21240f9014000915a5300d139ff4cd3c00a00f9400314cb22cf74b3c21200f93f683a381500156b3400148bBBL8;FFe20318aae5110094fad", + "342f9fc0740919c830191fbf9ff17f60300aae043169122008052dd110094e1d342f9e00316aa02faff17e043169122008052d7110094L8;FFe0833f9139031891f7032791f8833f91297f4039280340392a15003308111d1228030039e80327912a7f0039e083c53de187c53de0fb833de1ff833d8e28ff", + "97L16;FFe92341f9e0431291e00610ade03fc13de1230991e12fc13de82701f9e00a11ade033c13de28fc03de93301f9e1020fad8282803c4ffeff97e027c13de12bc13dBBBBBL8;FB6a00000000000000800000002e000000576869737065725072654b657953656e6465724b6579506c61696e74657874", + "0042024000000000006a00000000000000L8;FFa92356384a01084a6b01084aaa031638aa3356382901084aab131638ab435638a9231638a95356384a01084a6b01084aaa331638aa6356382901084aab431638BL8;FF4901098b200108aba2010054f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c00", + "35fd600ffff9000c01b917712019400ffff9000001f917412019400ffff90L8;FF09890039e9ab56290a8d003909910039e9ab55290a95003909990039e9ab54290a9d003909a10039e9ab53290aa5003909a90039e9ab52290aad003909b10039BBL8;FF345601943903138bb9031cf89f0600b1fc0700f", + "9e0030054a8035bf8f42740f91f0119eb40220054a8835bf82a070091a14301d1e0031baa4905805209693938L8;FF1f0b00b1fa432791c100005420afc03de82344f94003803de8f304f910010014f68740f91f0700b1e014005420afc03de82344f9f4630191e9c7009180c20391L16;FFe9cf03f987d2", + "0094e8ab45f91f0500b1a1380054f95b4bb9b9031db8e8010090081140f91f0d00f1c3020054a8c300d18900009029a11091e8ab05f968fefff0BBBL8;FF29250191a91a498b290500912001088be10313aa15fcff971601003513000014e8031faa75feffb5e003088be10313aa0efcff97b6010034610a", + "40f9680240f9L8;FF08fd46d30900088b3a0500915f0308eb681c005406010014e1d342f9e8cb42f91f0101ebe0700054e8cf42f9490b8052f4074091948209910969213828040091BL8;FF65fdff17fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4600640f92200805224f60094610e40f98", + "10000b4601240f9220080521ff60094611a40f9L8;FFa2cc7492087c4093424000d1e5d86078a53c7cd35f0005eb82010054240600b5340000b094020e9102e90091c6040011817a62f821c026cb817a22f83f000014BBL8;FFf6031faa340080521900809228008052ff1700f9e80700f9e0074091e8c33", + "f91e103182a00c03591338b0094e80348f9c8f100b4e1ff47f92800805248030039L8;FFe1831591e3830f91e8b702f968fdffb008a11391e8f301f922008052e8fb01f968fdffb00861149100cf803de9f701f9e9ff01f9e80302f924ecff97e15343f9L16;FF28008052e85f00f9e8db41f9ead341f9e9", + "df41f9e82300f9e8cf41f9f50309aaeaa30da9e8c741f9e85b00f9d70000b4e00318aae10317aa220080521eb60094BBBBL8;FBb904000017000000ef104000000000004e000000000000005707000005000000ef104000000000004e0000000000000058070000050000001d1c400000000000L8;FFf603", + "14aad30e43f87f0600b1c1030054e8031faa28000014e9031faa8a2a80b96afbff35ea031faa8b1a40b97f05007120fcff54eb031faa050000144b008052BL8;FF2083c13ce9d742f9f5c742f9f7cb42f9080340f9c0828d3cf63b42f9e9d304f9680000b4e00316aa00013fd6010740f9810000b4020b40", + "f9e00316aa1e060194L8;FFe02f40f9e1031caa670200943a00805278fdffb5eeffff17e81f40f9e8df00f9970000b507000014e81f40f9e8df00f9e00316aae10317aa220080521e060094BBL8;FFe93308b87f050071e9a34bb8ea3700f9ea7f4179e8c30139e86340f9e97b00b9e9e74239eafb0079fa", + "5b00f9c1050054e0c30291e90f00b9e82300f9f4c9ff97L8;FF608205917600009461c641f9810000b460c241f9220080522746009461ce41f9810300b460ca41f922008052180000141f0d0071200500541f11007161040054L16;FFf9031eaaf20b00f9f20307aae7af40f9e9b700f9e9c740f9edfb48a", + "9e8ab18a9ea5340f9e22f40f9e98b00f969018052e0f3803de193803df1d300f9f10317aaBBBL8;FFc082c03ca003993cc082c13ca0039a3cd5660194ff0600b1752e00f960050054a0877dadf71f00f9e00703ada2837ead0083853ca1837cad0283843ce10302adL8;FF81620091e003082ae20313aa57", + "fdff97200700b4fa0000143f0c0071000700543f100071210500541f0900f1a1210054e00313aaff6b00b9ffdf00a9df7e01a9BL8;FFe00301aa48fd073708fc60d3080a00b5080840921f1900f1a20a0054017c0353010d00343f04007161fdff54890240f93f0900b161000054970200f99f1a00f9L8;Z", + "DBBL8;FF601640f901f97fd3420080522a260194681e40f9a80000b4602240f901f97fd34200805224260194682a40f9a80000b4602e40f901f97fd3420080521e260194L8;FF2d260094611a40f9c10000b4601640f922008052f30b40f9fd7bc2a826260014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30", + "b00f9fd030091f30300aa004840f9L16;FF090500119f02096b09050054c10a44a9e0230091e30315aabbfcff97c86a40b90901172b021600543f01146b63feff54c13240f9ca2a40f9f90b40b9480101cb" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines6 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines7.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines7.lean index 3ad6aade3..8f5bbbcee 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines7.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines7.lean @@ -27,359 +27,252 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub7 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FFf07d08531f7e00718c010054500200341f5a0071e1020054ff010d6b40fcff5414000014310e0012101e001210160012101a112ad7ffff171f82007140010054L4;FF140000148d7d1c53ad0600340d00be528d010d0b4c2180396b710d8b8c00f8b761e10c8b2b0180520a0000144d25", - "4039bf0500f1c80100548c1900126ce10c8bL8;FF4303005440030054090840f93f0108eb63030054f50301aa3f0009eb69010054e10313aaf603022a22008052f40300aa50feff9788a640a9e203162ae00314aaBBL4;FFe01c00b4e1031aaae20313aaf40300aa50a00194fb0a40f9e80240f9fc0700f9", - "7f0308ebe0090054fc0640f9690700917f431ff1e90a00f988171b8b135100a9L4;FFc4ffff17610000cb2100146b60010054e203014b3f1000717fc822384d0100547fb01f3861c01fb802d05f384210001242800151421c001202d01f38f35341a9L8;FF21101591a40100b084001091e0030091a36300", - "9142008052a80f00f992a00094810100d021401891a40100b084200a91a363009162018052b30f00f98aa00094BBBL4;FF0f0000141f0400b1418000546ce001941f100031c17f0054f9ffff1769e00194f70300aa1f0400b141fdff54e04305918100805264e00194a07e0035e85341b9L4;FBc02029206", - "97320736d616c6c6572207468616e2073656c6620706f696e7465722028c001290021737562736574206973206f7574206f6620626f756e64733a20L8;FF008d40f91b554ea9e00b00f9009140f9e9d700f909ed40f9e03b00f900e952a93f0309ebe94b00f9e9979f1a29219f5ae04300f9009d40f9291d", - "0072e03700f9BL8;FFe00309aa8203805296600194c10200d021043191e40200d084a00a91e0030091a363009122028052b30f00f98e60019468220191c10200d021401891e40200d0L8;FF290d098b2925019129fd46d3290500912001088be10313aa08fdff97f502003574040034610a40f9680240f91", - "f0101eb60040054680640f92a04009109028052BBBBL4;FFf65742a9fd7b41a9ff030191c0035fd6000400f0000013915d000294ffc303d1fd7b0ba9f76300f9f6570da9f44f0ea9fdc3029109304039c90a0037170040f9L4;FFe9031faa0a018052ff0308eb28008052a1030054b47c039b0b00f0d2f50", - "304aa6b0104cb9f020bebe8020054010100b4a17c019be00302aae20315aae30314aaL8;FFe10313aa54692838080500911f0048f1680a00f9a3fdff540b7c0e533f0108eb7361193220010054536928380cfc5cd308050091290040f9280800f94c0200b5BL8;FF010300d021a01e91e823009102028052", - "948001943303009073422391010300d021283091e0230091a32300d1c2008052e40313aab4831ff88b80019488620091L8;FFa0300054802202911cfcff97080040b20811c0da081540d2080d088b0825019108fd46d30900088b37050091ff0208eb482f0054e1010014e11740f9e80f40f9BBBL4;FFc00", - "35fd6a8935db8a9c35db8e0230091abab7ea9e10314aae80b00b9a8835f38e9b300b8a9035ef8ea1700f9e8c30039e9f300f8eb7301f8e89f0039eaf301f8L4;FB6372797074000000a3794900000000003800000000000000d900000016000000a3794900000000003800000000000000f00000000d0000", - "006d697373696e6720L8;FF01804cade10319ad02804dade0030091e2031aad4fc00094e84306916142089102328052004108914ac0009488820e91e0030091d7320094e0430691e1030091BL8;FF0c000014e8a745a9a00200d000603291a18301d1a82739a9a8c301d149fffff029312291a8273aa9e8c", - "3009170400194684e41b9090000d029610691f52705a9L8;FF680240f9080117cb9f0208eba9faff54e00313aae10317aae20314aa97020094770a40f9cfffff17a8831ff8a84300d1290000d029f12a91e00000f0002c3891BBBBBL4;FF890080d2e8430039480080520900f0f2e847003928017fb2a3ff", - "ff17e00700f9210400d021602191230400d063742191e0230091a200805244028052c9ffff17L4;FFa04700d10cc2ff97e07300b9a04700d109c2ff97e06f00b9a04700d106c2ff97e06b00b9a04700d103c2ff97f803002aa04700d100c2ff97e06700b9a04700d1L8;FFe8830039e00315aaa91b00b9aa", - "b301b8a81b40b9e007803de81302b8ea2700b969faff97810240f9c10100b4e00313aa22008052f44f45a9f52340f9fd7b43a9BL8;FFe01300f95390019416000014e82700f93a2f40f9fb3300f9daf8ffb51b018052287f40f91f0500b101fdff541c008092289740f91f0500b1e1010054e82300f9L8;F", - "F002030914e900094fd7bbda9f50b00f9f44f02a9fd03009108d040a9f30300aa1f7c01a9940100b41521009104000014940600f1b5620091e0000054a1825ff8BBBL4;FFe10315aa58d001940c0c40f98c0100b4090040f90a0840f95f0109ebeb33899a4a010bcb2b010acb8b010bebe8000054eb031fa", - "a49010c8b04000014ea031faaL4;FBa28ca28c0000e26d56e256e2000005881fc4602ec6c02b1a57ca2eed7623ac24c2a6615336201b10088004403c955af7ce03e701514dadae53dface7d673eb39L8;FFfb0302aae3031d9162008052f86305f9fc0310aae9a703f9e9af03f9e8b303f9c2c8ff97e3134", - "0f9f0031caae2031baae8f341f909008092f7f300f9facf00f9BL8;FFc30200f063c01c91c40200f084002991a27f0091e10680525650019420008052c100805250500194fd7bbca9f70b00f9f65702a9f44f03a9fd030091350440f9L8;FFa30302d1a82738a962008052a82739a9080100d008c13d91fb", - "c302f9f5cb02f9a8031af836e4ff97a10356f8810000b4a08356f8220080523e500094e8031faaBBBBL4;FF00c02491e30300f063401f91e40300f084202591a24300d1a1028052a0039f3c54f00194ff4301d1fd7b03a9f32300f9fdc3009100e4006ff30308aae80300f0L4;FB47000000000000009b00", - "00001b000000c9944800000000004d00000000000000f70100001a000000fe924800000000004c000000000000002d05000009000000L8;FFf44f47a9f65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6370080521800809219018052a80640f91f0116eb09100054e00313aa28efff97e80300a", - "aBL8;FFc0035fd6fd7bbea9f44f01a9fd03009113d040a91f0800f9d40000b4e00313aa3959ff97940600f173c2019181ffff54f44f41a9fd7bc2a8c0035fd6ffc300d1L8;FF0881099100e1029137100094f87f49f9b80300b4e1d342f9e8cb42f9f97b49f91f0101eb40440054e8cf42f9490380522a04", - "0091e00318aa09692138e1431691BBBL4;FFe00308aa58abff9708fc79d3e0e7076faa8246b88c2e40a9e9031faa010d010e0d1380520e000b8a82696efc438c212e6800669e0fc101f2e80313aaa0010054L4;FFff0700f94f0f0094e803002ae0031faa68010035f50740f9350100b47f0214ebe00315a", - "ae10316aa6232949aa1110094e00316aac1080094e00315aaf44f43a9L8;FFff7f02a9ff7f05a9ff7f08a9ff7f0ba9ff7f0ea9ff7f11a9ff7f14a9ff7f17a9e8cb00f9ff630639012b009460864cad68620791765e5ca9626ec03d61ea40f9BL8;FFe96306f9290080d2e87b06f9c80480526944c0f2ea7f", - "06f90a078052e07f823dff5306f9e85b06f9ff5f06f9ea6706f9e87306f9e97706f94a300194e1fb44f9L8;FF0201805201ed7cd34a30009420c3c63ce88f42b99f0b00b1f67b42b92013803de86302b9e1010054e86342b92013c03d69120a9160aa49a9768202b9689602b9BBBBBBL4;FF820a40f9e003", - "13aaf44f41a9fd7bc2a848180214f44f41a9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd03009108a040391f0d0071a1010054135041a9880240f9L4;FF54180094c8021c8be81f00f9b50000b4e00318aae10315aa2200805245180094e8a741a940a30091e1030191e2a30091e92304a9e80740f9e82b00f", - "938ffff17L8;FFfd7bc3a8c0035fd620008052e10313aa55180194fd7bbda9f65701a9f44f02a9fd030091f30301aaf40308aa810100b4f60300aa3b180194e00313aa21008052BBL4;FF40f0ffb4c1000014bfe336a9bf8317f8e1820191a2e300d16c81ff9760efffb4c9000014bfe333a9bf8314f8e1c", - "20091a2e300d16581ff9780eeffb495000014L4;ZBL8;FF6082843cff430791f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8c0035fd6e00301aa810100f021641a91a20180527e980014ffc300d1fd7b01a9f31300f9BBBL4;FFfd830191094840f9f30308aa3f0500b180010054098449a9a8a300d1e", - "00309aa41ae0094a8835d381f050071e1010054c80300b008210c910904805204000014L4;FB2f696e6372656d656e74616c5f6d6c6b656d3736382e7273002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538L8;FF08110f91e9eb01f9e8ef01f90802009", - "008012791e8a303f929038052e00100f000243b91e8ab03f90802009008812a91e1430f9162008052e8b303f9e80303aaBL8;FFe9020090297913918a0000102b7968784a090b8b40011fd6e1d342f9e8cb42f91f0101eb20b50054e8cf42f9490180520969213821040091f47749f9e1d302f9L8;FF3f08", - "00716102005401e30391a22302d19bf3ff97002c00b5e1031faae7ffff173f0c0071800300543f10007121010054602e00b5a02302d16ff4ff97e80301aaBBBBL4;FF35000014770240f9761a40b9f50301aa44f80194000280520101805242f80194800600b4e8820191e10315aa160800b9080000f9080", - "400f0080136911f300039L4;FB2d313934396366386336623562353537662f72616e645f636f72652d302e392e352f7372632f6c69622e7273002163616e6e6f7420616476616e636520706173L8;FFe0030091e80300f969edff97e10300aae00301aaf44f47a9f92340f9f65746a9f85f45a9fd7b43a9f", - "f030291c0035fd637008052180080921901805206000014BL8;FF4d0000141f090071e1040054aa8354f8691f009148dd7892250000149f0700b1e00700543f78019480088052210080523d780194201a00b4090300f029290991L8;FFe15b813d99000014e8074091f6b345f9002300910881099171baff", - "97e1074091e0431691024280522180099149780094e01fc53de123c53db8008052e8236979BBBL4;FF28008052e80b00f9a8020032890300327f0600b10811c0da2911c0dafcdf0329081540d2291540d2080d088b290d098b082501912925019108fd46d329fd46d3L4;ZDL8;FF2d010054df120071cc01", - "0054df0e007141030054bf0208ebe0030054760080521f000014b6010034df060071e1010054bf0208eb000300543600805218000014BL8;FF286968f8e10308aa8838011408a440a9e20301aae00308aae10309aa7f380114fd7bbfa9fd030091083040f9080100b4080140b20811c0da081540d2080d08", - "8bL8;FF691147b86081c73c6181c83c683104b8e8835039f55b40f9e9b303b9e903092aea3b01f96ac61291e8e30939683144b8490100b969e21291ea0b42f968b604b9BBBBBL4;FF5fffff1780220191b93e0094e80314aaaafeff172104009021e02f912304009063082a91e00700f906000014e00700f", - "92104009021e02f912304009063542491L4;FF68020054d40000b4e80b40f9e10315aae20314aa0001168b4e080094e083c03cc802148be80f00f96002803d680a00f9f44f46a9f91b40f9f65745a9f85f44a9L8;FFfd7b42a9ffc30091c0035fd6a9200091410200f021d01791a9831ff8430200f063f81", - "791460200f0c6001791a52300d1e00308aa420180526400805292080194BL8;FF4901098b6a010c8b29010a8b2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abe20c0054695241b969010034290140b22911c0daL8;FFe00315aa4100805247880094800f00b4f80300aa43", - "880094e00315aa4100805241880094c00e00b4f90300aa3d880094e00315aa410080523b880094000e00b4BBBL4;FF02000014280f0091e0030291e84300f967bd0094fa0300aa33000014fa4740f931000014e04300f9a103009021242891a303009063a02891e0030291e2008052L4;FB6635366533363", - "4356363642f303639353962342f7372632f76312f6368756e6b65642f73656e645f63742e7273002f636172676f2d6769742f73706172736570L8;FFfb0308aa47c80094e0031baa2100805245c8009440af00b4e16740f9e2031baae04700f94bc800940300001428008052e84700f9fb6b40f9b80000b4", - "e0031aaaBL8;FF1823209113000014d7fe45d3e80214ab820c0054e90200aba20c0054aa0217cba8831cf8a8c300d1a02301d1a9ab3ba921300094a8035ef8b7031ff8140117ebL8;FFeb0f80122c7c10532b2c0633ec0000352a7c0c530b050039090900394a091b320a010039080000142c7c12532a440", - "c330b090039090d00398b6d1c320a050039BBBBL4;FFc80300f008dd1d91682b05a98a068052480480527f2700a9c90300f029d50591692b02a9290080d2c91dc0f2687f01a9682704a94be80194f47f40b99f03146bL4;FB2800000000000000080000000000000054a5400000000000e02140000000000", - "03000000000000000080000000000000084a6400000000000e81f400000000000L8;FFe0e0ff97e10300aae0f4ffb437010014603a00b5a0c303d130e7ff97e80301aac0080036883a00b5e1031faa9effff17003500b5a0c303d128e7ff97e80301aaBL8;FFb6835ef8b7835df8bbffff17e00200f000c0", - "2b91e30200b063802291e40200f084402c91a24300d141038052a8273fa95068019420008052e10315aa4a680194L8;FFa24700d1e10680525a68009420008052e1028052546800944201009042002b91e0031faa65680094fd7bbca9f70b00f9f65702a9f44f03a9fd030091150040f9BBBL4;FFe90f41b", - "2e80314aa5100001400e4006ff60b41a9f7830191a0c302d1e30315aae40314aae10316aae00202ade00e803de08303ade01b803dd0f2ff97e0864dadL4;FF240000b0814006916300058b270080d2c81040f903a000a9c51840f9200800f9051000f9c61440f9271400f942000f91c100038ba00400d1e1", - "0301cb634000d1L8;FF800702ade20342ad820303ade28747ade01bc03da28739ad8003883ca8f35438e18346ad1f7d0071a18338ade8050054ea0f40f9a902088b08011b32b7c303d1BL8;FFe98300912a0000d04a712e91e1030091e00b803de92b01a975280194fd7b44a9f32b40f9ff830191c0035fd", - "6f30308aa28008052890200b029413f91ff2302a9L8;FFf8134bf9f5174bf9c80240f9f7e342f9680000b4e00317aa00013fd6c10640f9810000b4c20a40f9e00317aa412800945f0b00b121020054e11b42f9ffe71639BBBBBBBL4;FF68fe1b9ba802088b024101d1a91700940800148a206b68fc00a820", - "0e0a00669e8a0300b44901c0da2911c0da080d498b0801148a296be838e903f836e90333aaL4;FF220080524b1c0094280080921c000014eb3342a91a000014421c0094c001805221008052401c0094800400b4a80000f008fd3991f60300aa090140f9086140f8L8;FF5f0014eb570909aaa0000054c9fe", - "7bd3a90000b5f716168b10000014f30315aa11000014f80308aa3e1c019400058052010180523c1c0194400200b4e81242d3BBL4;FF9c031e4afe5b40b9fc621e38fc925e387b031e4afe6340b9fb721e38fba25e3808011e4afe6f40b9e8821e38e8b25e389c031e4afe7b40b9fc921e38fcc25e38L4;ZF", - "L8;FF3f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d2BBBL4;FF012c00543bfeffb51a000014f303002ac00300d000c01f91c30300d063802191c40300f084403091f35301b9e2430591610", - "580524fdc01942000805201c48052L4;FB0b00000000000000466c6f617456616c7565000000000000c8114900000000000a00000000000000496e74333256616c7565000000000000e811490000000000L8;FFfabb00f9fa0310aaf00311aaf1031baafb0308aae8030eaaee0312aa9e0d0014092340393", - "f150071a1bf0054e0031d91e10308aa026e805246dc0094e0430f91BL8;FFe82369795401805215008092e057813de15b813de8e30a7985000014e8d342f9e067c13de8a302f9680e00f908008092e04f813d6082803c680200f9ff0600f1L8;FF81e2009180ffff97886a40b9d40a40f9e00313aaa81b00", - "b9e8430191f683fe97e82b40f91f0500b1c0000054e017c03de83340f9e00f803de82300f90c000014BBBBL4;FF080109cb0932805209ff099ba80a00f948030a8b5c6b38381c210039a80e40f94903098b08050091204106d1a80e00f948fc01942800809229008052280300f9L4;FB3563353039393062", - "31343131366236643835366166303938352f6c6962726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f7665635f64657175L8;FFf85f03a9f65704a9f44f05a9fd030091ff430bd1081c00121f09007181010054e00302aaf30302aaf40301aa2bfbff97200200377a0240f9480740f91c0", - "101ebBL8;FF4c7c0194614a40f9743e00f93f0400f18b000054604e40f922008052457c0194615640f9744a00f93f0400f18b000054605a40f9220080523e7c0194745600f9L8;FF2200805223008052240080522892ff97e11740f924fbff17e06300912200805223008052240080522192ff97e11740f9", - "edfbff17e06300912200805223008052BBBL4;FFa8031cf88a0600f9a2980094200080522102805254bc0194fd7bbea9f30b00f9fd030091090c40f9220101f1c3010054f30308aa080840f9e00301aa04088052L4;ZBL8;FF63a02391c40100f084403691a22700d1c102805257bc0094e0830091021080", - "52230080522400805221d2ff97e11b40f9a0ffff17c00100f000e03191c30100b0BL8;FFe81b00541401001497010094080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f0008eb29210054f30b40f9fd7bc2a8c0035fd6L8;FFe00315aa0201805201f17dd3493c00943c0", - "08092320c0014a8050034e00000f000c00c915a3c009460ce41f961d241f946000014e8c30a9102000014e8830b91BBBBBL4;FF090b80522a0400916a0a00f909692138e10313aab3f7ff97953a40f9550300b4610a40f9680240f9963640f91f0101ebc01f0054680640f9490d80522a040091L4;FF3700", - "8052480c0094e0fbffb4e10315aae20314aaf60300aa4e0c00940200001436008052745a00a9740a00f978620039f44f45a9f65744a9f85f43a9fd7b42a9L8;FFc1048052e08700a9e1230091e00308aae96300396cf6ff97f44f45a9fd7b44a9ff830191c0035fd6e00313aaf6ffff17490080528104805", - "2e00313aae80314aaBL8;FF490400d1110000145f2800f1880000542800028b08f1df384803f837e003009118f5ff97e80340b9880a0037e80b40f98a0640f9490108eb430a00548a0240f9L8;FF3f1300f1f93300f9ed0600543f8700f1330080528c0d00543f1700f1801800543f7b00f1c1130054f703", - "14aa3d8c0094005a8052010180523b8c0094207300b4BBBL4;FFf903172a47cc0194e00313aa210080523700805244cc0194c0fdffb4e10314aae20313aae01b00f94acc0194e61f40f928008052f703192af9031b2a04000014L4;FB696f757320726f6f74206b6579206d697373696e6741757468656e7", - "4696361746f722070726576696f7573204d4143206b65792070726573656e74207768656eL8;FF6083c43c6183c53c6283c63ce8e35539fac301f9e0071ead6113c13c6083c73ce8230e39681340f9e192833c6183c33ce9cb41f9e2031fad6083c23ce8cf01f9BL8;FF150040f9bf0600b1a005005414d8", - "40a9f30300aa960100b49722009104000014d60600f1f7620091e0000054e1825ff881ffffb4e00240f9220080523d4c0194L8;FF6b2501914a194b8b4a050091490109abc20400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9030054200108abBBBBL4;", - "FF08e13491e10300b021203e91e203009042f83391e0030091e3630091f4a301a9f5a302a960ec019460fd07360004009000801c91e30300d06300229104040090L4;FB08000000000000000800000000000000f87a420000000000541e4000000000002000000000000000080000000000000078c242000", - "0000000616464726573736fL8;FFe80240b20811c0da081540d2080d088b0825019108fd46d308050091b60a40f9f60b00b4c90240b22911c0da291540d2290d098b29250191c91a498b29050091BL8;FF4c6c01941f0700f1ab000054e00319aae10318aa22008052466c0194df0600f14b040054e00317", - "aae10316aa22008052406c01941d0000143f0800b140030054L8;FFc00200b4a8cc875289c78d52e9cdad7208080079c8008052090000b9680200a9680a00f9fd7b43a9f32340f9ff430191c0035fd6400100d000801491430100d0BBBL4;FF54ac0194e00317aae10316aa2200805248ac0194e8ff4039f", - "703082a08088052020117cbb60202ebe3f9ff5417020034e8030091e10314aa9802028b0001178bL4;FF03ac6bd3615615534a490baa6b721c534a010caa6c761d534aed0baa6b7a1e534ab10caa6c7e1f534a910baa6b4210534a950caa0c4010534a250baa0b000012L8;FFd2ffff17e0230191f40301a", - "ae1830791023080524fac0094e8031faae7ffff17a20100d042400391e00308aae10315aa45ac009440008052410080524aac0094BL8;FF800200b000fc2d91a92338a9e8632291490200f029110f91a10302d1a82739a9880200d008e10491c9048052e8c302f9e3031691e8cb02f9880200d008c11191L", - "8;FF627e00547b0300b4f70315aaf50314aaf40316aa160480522003168be1031caae2031baa4b2c0094da021b8be0031caae1031baa22008052ba031ef83d2c0094BBBBBBL4;FF4c0200b500fc55d336000014e10300a9e00301aae10309aa220080522300805224008052b2060094e10340a92aa040a95", - "36928380cfc5cd308050091290040f9L4;FFe86f02f9f67302f9f77702f9480c0094b70000b4e00316aae10317aa2200805244140094b50000b4e0031caae10315aa220080523f140094e19341f9810000b4L8;FF3f4000f1c10000540000c03d09008012090100b90041803cc0035fd629008052010500f", - "9090100b9c0035fd63f4000f181040054090c40390a0840390b044039BBL4;FF220080523a031c8b4a940194f90740f928031acbfa0f00f91f7d00f128e8ff54e0230091e1031aaa020480522300805224008052ae86ff97f46b41a939ffff17L4;ZDL8;FF770a40f9570900b4740640f9f8031faaf90317", - "aae00314aa3cf7ff97080040b20811c0da081540d2080d088b08250191081848abe2090054180118ab020a0054BBBL4;FFe80b41b2e01700f9ac000014880080d20800f0f208050091a8000014880080d2e01700f90800f0f23b000014880080d2e01700f90800f0f228000014880080d2L4;FB0920f664d", - "c58ca0fa03c48c688b4623f12397ee018d8c52dab9ca73a242ae5e90000f47e6095901ae72819332dbc29975402450c6ce25c9af5b3ff7cff44f664L8;FF0a008092e9031eaaeb2b0ea9eb030daaed0317aaf7ef49a9faa700f9fa0316aaf60304aaf44b40f9fe0303aae31340f9e45f40f9ee030faaef3b", - "40f9e0f3803dBL8;FFe1431691ead302f9fd0c0094fad342f9e8cb42f908011acb1f0308eb48430054e8cf42f9e10319aae20318aa00011a8b485401944803188bf90b40f9fa074091L8;FFf4f342f9150500b49642009177028052180100f018e70091060000142200805244540094b50600f1d6c20091c", - "0030054c1025ff8280041d21f8d00f10831979aBBBBL4;FFfa3340f9a0e300d1bc831cf893dcff97a0e300d1bc831cf890dcff9709008092a84301d1b46b3ba9ff6b00b9e92b00f9a8031cf83a1500b4f71300f91b210091L4;FB88b0480000000000690000000000000057c35773052fe57da347cd62431", - "528daac5fbb290730fff684afc4cfc2ed90995f58cb3b74000000f1b0480000000000L8;FF11000014c80080d2e0230039e00300910800f0f2ff270039e80300f964e9ff97e80300aae80300f9210200f021081d91230200f063881591e003009142018052BL8;FFa0831cf8e10200f021601f91e30200f0", - "63542491a0e300d102028052440180521b000014a0831cf8e10200f021601f91e30200f063043191a0e300d102028052L8;FF4c740094e18349f9810000b4e08749f92200805247740094e80740910881099100c10391010c00940ffeff17880241d2e90080521f2d00f10831899a490100d0BBBL4;FF48b", - "40194000480522100805246b40194c00200b4e08740ad0802805209048052685a00a9682601a9880a40f9000400ad8002c03d754a00b9602602a9600e803dL4;ZBL8;FFe8031faa14000014e20308aa290308eb00feff5408011b8bf50302aaf80300aa1f0103ebea33839a08010acb1f0103ebea33839a0", - "8010acb6a0008cb37010aebBL8;FF150101ebe200005481010014a22302d1630c805257e4ff97e10300aa203000b5a88357f8080540f91f0115eb09100054a02302d161ecff97402f003728fc60d3L8;FFa02302d128f4ff97e80301aaa0030036482d00b5e1031faadbffff17a22302d1630c80528feeff", - "97e10300aac0faffb46c010014e8434ab948000037f82305f9BBBBBL4;FF4901098b6801088b2c81c99329bdcaca0badcbca2801088b6a010c8b08cdc9ca4bc1cbca69adcb9329bdc8ca08010a8b2981c8ca200108caf44f46a9fd7b45a9L4;FF9cf7ff97e1df40f93f0400b1604a0054f63f5ca9e8eb40f", - "9e82700f9fa1800b45f0700f1c10b005428034039eb031f2a1fad0071401800541fb5007100180054L8;FF4c04019461d640f9810000b460da40f9220080524704019461e240f9810000b460e640f9220080524204019461ee40f9810000b460f240f9220080523d040194BL8;FF4aa11991e8a700a90203", - "00d042383b91ea0f00f9e343009163840194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000b04a911491e8a700a9L8;FFe80300f9e8230091e00309aa4201805283840094620100d042c03b910b00001408200091410100f021c01491e80300f9e8230091e00309aa820280527884009", - "4BBBL4;FF40fbffb434000014a0a300d1cec40094e80300aae00301aae8fd07362e00001400f7ff54a5000014a0a300d1c6c40094f40301aac0ed07363d000014a0a300d1L4;FB6420746f206465636f64652070726576696f75732073657373696f6e2070726f746f627566000000000000000000000010", - "000000000000000800000000000000L8;FFe0f3c13def0314aae87202f8e8bf5d39e6030991e08713ade407c23de003c23d2841082a699140b8e29b803de2ffc13de10bc23de09315ad3b8108aae9635e39BL8;FF09028052e003142a09692138e10313aa6a0a00f9f44f42a9f50b40f9fd7bc3a8f7fcff1", - "7e8031faa94fcff35e003088be10313aaf2fcff9775fdff34610a40f9L8;FF2043813ce1031091e8a301b9e8b341b92007c03dffeb01f9e80303b928008052e8ef01f9080480520800ac72810101ade80b02f9e8430f91fff301f9e80302f9BBBBL4;FFf9feffb50f0000141f0400b1210001546be401941", - "f100031a1ff0054f9ffff1768e40194f70300aa1f0400b141fdff54e04305918100805263e4019480fe0035L4;FB64206e6f74206265207573696e6720446f75626c65205261746368657420666f722074686573650073e84800000000003800000000000000ca0100001d000000L8;FF430900545f0f00b", - "1000e00543f03086be8979f1a08219f5a081d0072a00900541f05007141120054e81b40f91f0500b120320054e9030091e8431e9120c10091BL8;FF985e02a9996a03a9992204a9f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd620008052e10315aa4d64019420008052e10317aa4", - "a640194L8;FFf42300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889a152300a9f7fbffb5f62b40f9f51f40f996000037180100b018232091BBBL4;FFe92200d16b0240f90801098a6801088b0a210039ff0219ebf706009180020054680240f9096977383f01027141ff", - "ff54e90337aa9822099bb3ffff17682640a9L4;FFd3ffff17bf3b03d5411c40b92400030aa6fc5f883f00066b61ffff54a4fc068886ffff350000010a401800b9001a003441404079212c46d3211c00513f7c0071L8;FF810000b4600640f92200805249a40094610e40f9810000b4601240f92200805244", - "a4009408008092680200f9f30b40f9fd7bc2a8c0035fd6ffc300d1fd7b01a9BL8;FFe00308aa620080523f010071890200b02961019121118a9a84240114ff4302d1fd7b07a9f44f08a9fdc301910a7c4039f40308aa08088052090040390010c03cBL4;FFe10313aa22008052f44f44a9f65743a9f85f42", - "a9fa6741a9fd7bc5a845240014c80240f9ff0208eb20020054080680528002c03d890a40f9e862089bea060091L3;FB0010000000000000010000000400000000300a000000000000204a000000000000204a0000000000780100000000000078010000000000000010000000000000BBBBBBBBL4;FFe163", - "0091e00313aa030880529979009414008092e00314aaf44f49a9f65748a9f85f47a9fa6746a9fc6f45a9fd7b44a9ff830291c0035fd6e92340a9795200a9L4;FF220080524b1e0094b60000b4e00317aae10316aa22008052461e0094b40000b4e00315aae10314aa22008052411e0094f44f4da9f6574ca", - "9f85f4ba9fd7b4aa9L8;FFe0031f2ac0035fd6fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091f50305aaf40304aaf90303aaf70302aaf80301aaf30300aa3a1e019400038052BBL4;FF000200541703088b94a2009158018052560800b4818a7fa9c80600d1f8020039160102eba3070054e00", - "60091946200911700028b479e01945a6300f1a1feff54L4;FF420001f1e8feff548e3c7ca9661c01a9861c7da9682402a988247ea96a2c03a98a2c7fa96c3404a9ae3c3ca9a61c3da9a8243ea9aa2c3fa9c0035fd600000000L8;FF999e009488c20091810100d0219c1591a40100b084200b91a32300d18", - "2008052a8831ff8909e0094b30100b073e20491810100d021301d91a32300d142008052BBBL4;FF05000014e0430591810080526ede0194e03f0035e85341b9e82b00b957ffdfc8770000b567de0194f70300aaff0600b180020054f843059199008052e00318aaL4;FB2e32362e312f7372632f6572726f", - "722e7273002f72757374632f3438613232396365616566643439383563353039393062313431313662366438353661663039L8;FFe8fb40f9eea303f9e8ab03f9e8e740f9fcb703f9e8af03f9e8bf40f9fecb03f9e8b303f9e8ff40f9f1d703f9e8bb03f9e89340f9e6df03f9e8bf03f9e8db40f9BL8;FF0", - "8810991e01b843de067c73d00800191e11f843de023843de227843da15e0194e0074091008009919f5e0194f50300aa3c5e019400088052210080523a5e0194L8;FF9f0208eb69f8ff54e00313aae10316aae20314aa5e010094760a40f9bdffff17fd7bbca9f70b00f9f65702a9f44f03a9fd030091f303", - "01aa210840f9f40300aaBBBBL4;FF880200f969520039f44f4fa9f6574ea9f85f4da9fd7b4ca9ff030491c0035fd6a2820091f70300aae00315aa2100805223008052a1e0ff97e00317aa75ffff17L4;ZFL8;FFc80300b5200840921f1800f1e2030054217c0353010400343f040071200100543f0800716", - "1fdff5481620091e20313aa46fcff97000400b5e1031faaeaffff17BL8;FFfd7b42a9ffc30091c0035fd62103009021103291e00308aae2028052fd7b42a9ffc30091817e01142103009021d43791e00308aa82028052fd7b42a9ffc30091L8;FFea1700f9096921385afbff97e1630091c37dff97807240", - "f9800100b4e11740f9e80f40f91f0101ebe06c0054e81340f9090180522a040091ea1700f909692138BBBL4;FFa0e300d1e10315aa220080520301805204018052b6b0ff97e00314aab4035df8eeffff17e90740f9a8d37ca93f0900b100030054e083c03ce183c13ce283c23cL4;FBf7874900000000004", - "e0000000000000064020000130000005369676e65645072654b65795265636f726453747275637475726569647075626c69635f6b657970L8;FFe00316aa010880522200805268de01a9681600f947be0094e10f40f9810000b4e00315aa2200805242be0094e10340f9810000b4e00314aa220080523dbe", - "0094BL8;FF00c009914e3e0194080040f9a90200f029e13291e00301aa08014039227968f8a90200f029413391287968f8e10308aa7e3e0114080040f9e20301aa002140a9L8;FF4403805296000014c90080d2e8430039480080520900f0f2e8470039e90700f9ddffff17e00700f90101009021a003910", - "301009063b40391e0230091a2008052BBBBBL4;FF610a40f9e00315aa76ffff17e00313aa220080522300805224008052b4000094610a40f97cffff17e00313aae10317aae20315aa2300805224008052ac000094L4;FFfa031f2ae88343b9093340b8eb130491ea0343b9e80302b9e80b467969f10fb8e9", - "9341f9e8fb0379e8a34c39eafb01b9e8c30739e8ab40f9e9f700f9a80000b4L8;FFff0301d1fd7b02a9f31b00f9fd830091f30301aae10300aae0030091e2031f2a5cfbff97e1030091e00313aa020480527e0e0194fd7b42a9f31b40f9ff030191BL8;FF060000143c008052542340f9b4031df874f1ffb", - "509018052a8035df8755a00a9755e01a9785e02a97c6605a97b6200b9682603a9686604a9f44f4ca9f6574ba9L8;FF89040054140114ab230100541e000014f4031faae00313aa080c45f81f0500b1c1fdff54f40314abe2020054688e48f81f0500b140020054e00313aab1fdff97BBBL4;FFa1ffff17e0", - "e30091220080522300805224008052b6c0ff97e12740f9a8ffff17e0e30091220080522300805224008052afc0ff97e12740f9c6ffff17e0e30091L4;FBe756a07fc24b89660aed2859ec3fdc32444a9c6621ed2c81d73c087a35f466406696050db7b8a1869574a28c00fc1fd27df57e800000065499d66", - "f5e7039138fL8;FF88018052e92b5ba9e87300f9ebcf40f9e77740f9e82f40f9f0cf00f9fabb40f9ef8f40f9ec1f40f9e6e340f9e8f700f9f60740f9f23f40f9e8c340f9f16740f9BL8;FFe00315aa9076ff9728008092680200f9a6ffff17e85340b91f050071610f0054e043c73ce143c83c03e4006fe2", - "83cc3ce8430691e0c30e91808506ade083cb3cL8;FFfd7bc2a8c0035fd620008052800600f909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6e00301aae10302aa744d0014ff8300d1fd7b01a9fd430091BBBBL4;FFfa6746a9fd7b45a9ff83029149ee0114f44f49a9f65748a9f85f47a9fa67", - "46a9fd7b45a9ff830291c0035fd6000400b00080289142ee019420008052e10313aaL4;FB3d20726573756c74206173206933320085924800000000003300000000000000c6010000090000004f9d4800000000007500000000000000020000001c000000L8;FFd0ffff1781620091e20313aa4fecff9700", - "0a00b5e1031faacaffff17800400b5e00313aa2dedff97e80301aa40010036e80400b5e1031faac2ffff17e20313aaBL8;FF800100362000805202000014e0031f2af44f47a9f65746a9f85f45a9fa6744a9fc6f43a9fd7b42a9ff030291c0035fd6600640a9e8130091e9230091eaffff90L8;FFe1d342f", - "95efdff17e0431691220080525f110094e1d342f984fdff17f40300aae04316912200805259110094e1d342f9e00314aa83fbff17e043169122008052BBBL4;FFa00301d1f6030caa4941092a2a231caa08c11baab78209aa580108aaf5030baa8e96ff97a88355b8a9c35578e083ca3ce183cb3ce283cc3", - "c77ca00b968ea00b9L4;FF800600f90a000014f3031faa280080520901805207000014e00313aac8060094e0feffb528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8L8;FFba0100b05ac32291d60600d1150900d10800001427070094a0020079a8ee5f78d60600f10801174aa8020", - "079a0090054a002407908ffdf88e801003568e34039BL8;FF42a00791a1158052582e0194e8ff42f9e90343f9800200f000c00391830200f063401b91840200f084800491e2032d91c1058052e8a305f9e9a705f94d2e0194L8;FF01f8ffb4820a40f9e00313aabcffff17e803009100610e9131ecff97b9", - "ffff17fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1BBBBBBL4;FFf51f40f996000037780400d01823209113000014d7fe45d3e80214ab820e0054e90200aba20e0054aa0217cba8831cf8a8c300d1a02301d1a9ab3ba91efe0094L4;FFe10319aa220080524a160094fa", - "e740f9a30000d063e02891e0431391e2031caae4018052e1031aaac80d0094fb6f42f9e17342f9e807409108411d91e0031baaL8;FF09200091090500f9c0035fd6091840392a7d04535f1d0071200700545f190071800200545f050071e10a0054290d00120a1c4039291d48d329c10aaa0a104039BBL4;", - "FFe10316aa589601941f090071e11d0054080180d2e9de78920800f0f2080140b2ef000014f36b00a9f30300aaf61e00b43c960194e00316aa210080523b008052L4;ZBL8;FF1f0109ebe81b005414010014d8020094080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f00", - "08eb29210054f30b40f9fd7bc2a8BBBL4;FFe36b00542a0340f9f51740f94801088b282700a9a88355f8080540f9190115eba3540054bc8355f8820740f95f0019eb89330054810340f9350080399500f8b7L4;FB737071723a3a76313a3a6368756e6b65643a3a73746174657300000000000000b11c490", - "00000000055000000000000004001000021000000b11c490000000000L8;FFf1031baafb0312aae31340f9f44b40f9f70302aae22f40f99f07001428a00791e07f00f9e00309910001c03d21000891ec0b18a9022f8052eae700f9f9030baaBL8;FFf87749f9e8d302f91f0700b1c0200054c0220291c41c", - "0094080040b20811c0da081540d2080d088b0825019108fd46d30900088b390500913f0308eb681f0054L8;FF21010054810000b4a01240f92200805248560094a11a40f961f4ffb40804805205000014a11240f93f0400f1cbf3ff5408028052606a68f8220080523d560094BBBBL4;FF4cf60194e08741", - "ad28008052e217c03d800600ad820a803d68a20039f44f49a9f65748a9f85f47a9fd7b46a9ff830291c0035fd6000180520104805255f60194L4;FB746966696361746573656e6465725f6531363473656e6465725f646576696365657870697265736964656e746974795f6b65797369676e657273656e6", - "465725fL8;FF97fe03a981620091e20313aacef7ff97a0fbffb454000014a00c00b5e00313aa2ef5ff97e80301aa60000036c8faffb467000014e1031faa882600f9d3ffff17BL8;FF4a1d409208010aaa69a200a92800805268020039fd7b45a9f33340f9ffc30191c0035fd6ffc300d1fd7b01a9f31300", - "f9fd430091e90301aaf30300aa01030090L8;FF210108cb00510a9b33110094e00314aae10313aa30110094d50000b4a8e279d3e00314aa02018052011115cb41760094e1db42f9810000b4e0df42f922008052BBBL4;FF0801028b683300f97db60194e00301912103138be2031aaafaff01394db60194e", - "8ff4139290080521a0317cba90316381ffd007101fbff5409088052a18302d1L4;ZDL8;FF2aa104a939fd05a93f6900b945b60094000480522100805243b60094600200b4e00740ad08048052c80202a9dffe03a9000400ada2037fadc81a00f9d54e0929BL8;FFf4e340f9fa0316aa74f7ffb536008052e", - "92347a9e0dbc23de1dfc23dea5740b9fc7b06f900838b3ce0e3c23de85306f9e95706f9e85b06f9e92346a901838c3cL8;FFc0ce0054e8fb41f9e9b30e91001fc03de99b04f92900009029012191e8fb03f92800009008512b91e89f04f9e8830e91eac32491e9a704f92900009029212c91BBBBBL4;FFe2", - "1bc03d0825199b08011c8b000502ade00740ad0219803d000500ade00b41ad000901ade80240f908050091e80200f9600600545a0700f19cc3019194c20191L4;FFf303022af403012af60300aa45060094000480520101805243060094400100b4165400a9810000f021000591144c02291f600039f44f4", - "2a9f65741a9fd7bc3a8L8;FF609640f901f97fd34200805249060194689e40f9a80000b460a240f901f97fd3420080524306019468aa40f9a80000b460ae40f901f97fd3420080523d060194BL8;FF610380525886019420008052a10280525586019420008052a10380525286019420008052210480524f", - "86019420008052810480524c8601942000805281038052L8;FFe0031aaae10318aa000dc03da8835cf842008052a0039a3ca8031bf845860094a8035df8a80000b401f97fd3e01340f9420080523f860094f30740f9a003da3cBBBL4;FFfa0315aaf52b40b90200001413008092880340b21f0700b10811c", - "0da081540d2080d088b08250191881b488b080d009160010054090340b22911c0da291540d2L4;FB4700000000000000310100000d0000007f604900000000004700000000000000320100000d000000606a470000000000706a470000000000706a470000000000L8;FFe31fc23df6cb43f9e18b14ade11", - "bc23de203c23dea7202f8eaa35f39e8ff43f9e48715ade107c23de6435f39ebbb01f9eb6740f9f4bb43f9e90316aaf60315aaBL8;FFe00302aaf30302aaf40301aa6bfeff97e80300aae00301aa08020037680240f9080540f9150100eb62020054e80f41b2e80700f907000014c90080d248008052L8;FF", - "6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b2BBBBL4;FFe90b40f96d4a00396a6a0039ea6340396c5e00396b32007969b201f86a8e0039f44f44a9f51b40f9fd7b42a9ff430191c0035fd", - "67f0200b9f44f44a9f51b40f9L4;FB20286e6f2063757272656e742073657373696f6e207374617465292c206e756d626572206f662070726576696f7573207374617465733a20c00022536b697070L8;FF21a819912302009063bc1591a0a303d1a200805284008052a7daff97a18351f8e86341f9f4030", - "1aa1f0500b141e0ff540effff17e80f41b2f7feff17a80a0091BL8;FFf44f42a9f65741a9fd7bc3a86366011433008052e003132af44f42a9f65741a9fd7bc3a85d660114fd7bbda9f65701a9f44f02a9fd030091140440f9280440f9L8;FF017d099b4b660094617e40f93f0400f18b000054608240f922", - "00805245660094619640f93f0400f18b000054609a40f9220080523f660094613240f9810000b4BBBL4;FF30000014e99340b8ea0f40b9e093c33ca91b00b9e92341b8aab301b8ea2f4079e90300b9a91b40b9ea0b0079ea234079691200b8a9b341b86012833ce00741adL4;FF1f000039007d20d4fd7bb", - "da9fd030091f35301a9f51300f903c05f3802d05f3804e05f78541000124301003464000034bf000039007d20d404805fb8e3ff9f52L8;FFf85f43a9fd7b42a9ff830191c0035fd633008052285440a9f4cf00a9ff0f00f9bf0214eb49f9ff54e0230091e1031faae20315aa2300805224008052f30308aa", - "BL8;FFfd030291e90300f9e90300914a0200d04ac10d91eb230091f30300aae9ab00a9490080528a0200b04a4d3c91a00700d1e1630091e9ab04a9890200b029a13891L8;FFea0f801229140033c20000542a7c0653090500394a051a320a01003912000014eb0f80122c7c10532b2c0633ec0000352a7c0", - "c530b050039090900394a091b32BBBBBBBL4;FF808201ad808202ad8002803d28d776d3800642adea03172a09dbd99380020291080d0aaae103009122008052e00702ad800640ad290dc0da080dc0da892207a9L4;FFf6570aa9f44f0ba9fd83019109304039e9080037170840b9f30300aa160040f9a063", - "00d1f40308aae103172a10120094b50f7fa9e0630091e10316aae20315aaL8;FF390340f9770200f0f78a2191350200f0b5b21291f63300917a0200f05a9321917b0200f07bf70c9109000014e00313aa610200f021a021914200805280033fd6BBL4;FFe0179f1a659a0194e8334039291340390a03000a", - "5a030a0a1f01096be0179f1a5e9a0194e837403929174039f803002a1f01096be0179f1a589a0194e83b4039L4;ZFL8;FF57e07a925414409220010191e20308aaffbf0339e08707adf50301aae88b00f9779a0094e0c30291a102178be20314aaf4bf0339479a0094e00747ada8c302d1BBBL4;FFfa6744", - "a9fc6f43a9fd7b42a9ff03029150da011428008052e80300f9e10740f981f9ffb5ceffff1720008052010480524dda0194ff4301d1fd7b03a9f32300f9L4;FB2f70726f73742d302e31342e342f7372632f656e636f64696e672e7273002f636172676f2d6769742f737061727365706f73747175616e747", - "56d726174636865L8;FFf7030caa360080523904001408234039f87700f91f150071e1220054480200b0e00309aa08b140f9e9cf40f9edeb40f91f0900f149060054a80100f008110f91BL8;FF220080524b5a0194e04306910d100094e11b40f93f0400f18b000054e01f40f922008052435a0194ff0600", - "b1e1000054e83340f91f0500b180000054e8c30091L8;FFf5f30db9f7f70db9610a0054e39348a9e0c31291e2db42f9e5f35639e1833291e6031f2acbeeff97e85b42f91f0900b1e1830054480100b0fa83029108b140f9BBBBL4;FFe217c03d800600ad820a803d68a20039f44f49a9f65748a9f85f47a9", - "fd7b46a9ff830291c0035fd6000180520104805258fa0194000400d00060179154fa0194L4;FB00394c6f63616c6c7920737570706c69656420616464726573736573206e6f742076616c69642053657276696365204944733a2073656e6465723dc00c2c2072L8;FF2003029142f5ff979e000014f8031b", - "aaf9c303913b008092171300b4e806178be00316aa0201805201f17dd341fa009492000014e08743ade00314aae227c03dBL8;FFfd7bbea9f44f01a9fd030091890300d0290140f94ad03bd55301098b694240393f050071e1010054600640a90a0300b04a61199109080091400540ad690200f9L8;FFf6e", - "f07f9e0fb863de1ff863de203873df60b0ef9e36b873de367873de363873de35f873d77790094e05fc73de163c73de8074091e26bc73de007409108810991BBBL4;FF8d8109aae9334aa9600d010e10020c8ae65b40b9216970fc228c202e5100669e31c20192f10200b43202c0da5212c0da120e52ab823", - "1005452020c8a320d12cbL4;ZBL8;FFe0031baa010480522200805249ba0094a1835cf8e00f40f9610000b42200805244ba0094e00318aa010480522200805240ba0094e16342f9f81340f9810000b4BL8;FF2905009129010aabc20600542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d3290", - "10a8b290500913f010aebe9050054280108ab8300005426000014L8;FF08151091690080520001c03d08d140f8e9031039c90080d2ea0300aae0fb01f90900f0f20000803d08d000f8a802805234490091e8ff01f9e8f701f9f4f301f9BBBBBL4;FF610240f9290080396918f8b7280400914a0400d1e600", - "001401c00091e003022ae20303aa69f3ff97602c00b4e00700f9210400b021a01f91230400b063601891L4;FF1f000014b400f8b6f7031faae00317aae10314aa540a0094d40200b4410a0094e00314aa21008052370080523e0a0094e0feffb4e10316aae20314aaf50300aaL8;FFe9030091200440a9a8", - "831ff80800009008912491e82701a9e81300f9e3230091610a0194fd7b43a9ff030191c0035fd608200091200440a9a92300d10a000090BL8;FF61000054ff670ba9ff6300f9e1c30291a20301d16d73ff97a0f6ffb44a000014e86740f91f0500b161000054ffe70ca9ff6f00f9c1620091a20301d16373", - "ff97L8;FFaf7c8f0acd7c8d0a701e08534a010b4a497c890a6b220953ce010f4acd010d4a6e320d53f07c900a29010c4a6c260a53cb7f8b0a4901094a6a2e0c536f2a0b53BBBL4;FF5cca0194fd7bbea9f44f01a9fd030091140040f9f30300aa81000094682a41a989020acb1f0109eb49030054890208c", - "b6b0240f94a0109cb3f010aeb89010054L4;FB000000000000000008000000000000000800000000000000f40a460000000000000000000000000008000000000000000800000000000000f0f5450000000000L8;FF22008052f50309aa4aca0094e90315aab40000b4e00309aae10314aa2200805244ca0", - "094fc7340f9fa031f2af9031c915c0b00b4f86f40f9f50314aaf66300f9BL8;FF810000b4603640f922008052494a0194613e40f9e10000b4604240f922008052f44f42a9f65741a9fd7bc3a8414a0114f44f42a9f65741a9fd7bc3a8c0035fd6L8;FF0801098b130500917f0209eba9140054088c48f81f", - "0500b12011005464feff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b08050091BBBBL4;FFfd7bc6a8c0035fd6200080520108805255ea0194ff8302d1fd7b04a9fc6f05a9fa6706a9f85f07a9f65708a9f44f09a9fd030191f803002ae0830091f60307aaL4;FB080000000000", - "00000800000000000000c084420000000000000000000000000008000000000000000800000000000000f8844200000000004964000000000000L8;FFe20315aa230080522400805228000094770a40f9680240f9080117cbbf0208ebc9f3ff54e00313aae10317aae20315aa23008052240080521d00009", - "4770a40f9BL8;FFf44f01a9fd030091010040f9f30300aa1f3000b93f0400f18b000054600640f922008052436a0194610e40f934008092740200f93f0400f18b000054601240f9L8;FF5f0b00b1c1f2ff548082c23ce8bf40f9e0430691e1e30091022180528002803de8ab00f96082803c680e00f9496a", - "0094e0430691e10315aa5fbcfe97e00315aaBBBL4;FFe93300f9e9670ba9fb6300f9e0838c3ce86f00f9442d0094080400b142380054142400919f0208ebe3370054b400f8b6f7031faae00317aae10314aa4aaa0194L4;FFc0010054ae15c039df0501318cd58c9a7f1900f120010054ab19c0397f05013", - "18cd58c9a05000014f4031faa08011fcb52000014ec031faa8801088b0b188052L8;FF28f3ffb5ff030791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6a00100b000a03e9147aa009440008052e10317aa4baa0094ff8302d1BL8;FF3dffff17e88b40f9c80000b40805088be003", - "14aa0201805201f17dd3452a0194400745addf0a00b14233c03de85345f9800705ad400743ad8233803de8bb02f9L8;FF492a0094604a00b4a0877dadfa0300aa000400ad432a009400c4805221008052412a0094c04900b4e1833f9102c48052f90300aa16c48052462a0094e0074091BBBBBBL4;FF2804", - "0091490400d11e000014890080d248008052e04300390900f0f2e847003928017fb21d000014e80741b21b000014f603032a5f2800f1880000542800028bL4;FFe07700b9a04700d10bc4ff97e07300b9a04700d108c4ff97e06f00b9a04700d105c4ff97e06b00b9a04700d102c4ff97e06700b9a04700d", - "1ffc3ff97e06300b9L8;FF0960003909819f1a9f7d027129010b0b8b0d00120a819f1a29c100117f2500714a114c0b0964003909819f1a2c3c403929010b0b2b3840394ac100110a680039BBL4;FFe8830091a0820191a1820291b66a0094e86342a9f71b40f91f0500f161050054081f00121f050071cc0", - "0005488010035171f4092e80f41b2e90317aa12000014L4;ZDL8;FF99920094940100d094e20491610100f021a01b91a32300d162008052e40314aab3831ff89092009468620091610100f0212c1691a32300d142008052e40314aaBBBL4;FF0aa544a9eb2b05a9e90700f90aa545a9e93300f9094d4d29e", - "a2700f9e91700b9a237005468040091e00314aae1031aaa1f0114ebe933949a020109cbbe010014L4;FBafeddac63c9ea28cf671789400007713cb6fffb07e75a21a01f8faa35c68840fd9ee27558b914040e01f50050368a5e314df7fd56faeee4ad4ecdfdda65d48eaL8;FFeb6344f9e86f00f9e86b44f", - "9e85f00f9e87344f9e85b00f9e87f44f9e8f300f900630054ef0715a9280200f0e29309a9e4030caaf02f00f9eec300f9f2b300f9BL8;FF2200805253110094e1d342f994fbff17e0431691e1031aaae20318aa4d110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aaL", - "8;FFaa4700d1e7a30ea9a80c40f9e08706a9ea830aa9e00304aae18b0ba9e10302aae96300b9e28f07a9e49708a9e69f09a9ffd30879ff4b02f9e3930ca9e59b0da9BBBBL4;FFe1000054a8035d381f0500718c030054c8120035e90f41b299000014a8f35c38e00314aae82b00b9a8d35c78e82300b9a9a", - "37da9ea2703a9a9935cb8aa635d78L4;FB65636f64652070726f746f62756600002d964800000000003100000000000000560000002c0000002d964800000000003100000000000000570000002e000000L8;FFa2020054e80f41b207000014890080d248008052e02300390900f0f2e827003928017fb2e", - "0030091e80300f960e7ff97e10300aae00301aaf44f47a9f92340f9BL8;FF6901084aab135738a9f316384901084aaa235738a90317386901084aab335738a91317384901084aaa435738a92317386901084aab535738a93317384901084aL8;FF1f0500b180b5ff5481e20491b4010014e1d342f9e8cb42", - "f91f0101ebe0770054e8cf42f949028052f6074091d6820991f4031baa0969213828040091f87749f9BBBL4;FFf80300aa46000014b8835bf844000014a06303d1a8ab32a99e8e0094a0031bf8610300f021f42691630300f063e4279118000014a0031bf8610300f021f42691L4;ZBL8;FF6db200942000", - "80520104805256b20094ff0303d1fd7b06a9fb3b00f9fa6708a9f85f09a9f6570aa9f44f0ba9fd830191081c40f91f0500b1e0100054290c40f9BL8;FF298d1a91e8c303f9c80080d20800f0f2fb9b05f908390091e9bf03f9e8bb03f9e80200f008b140f91f0500f169050054e8c32c91890200f029e927", - "91e85b04f9L8;FF1f0500b1401b0054e8fb41f9001fc03de0432a91022b8052e84701f9e8830f91018100912083863c4a320094e04740f9e2432a91e10316aac66efe973c008092BBBBBL4;FF63020294ff0302d1e923016dfd7b02a9fc6f03a9fa6704a9f85f05a9f65706a9f44f07a9fd8300910960403", - "9e9090037150040f9f40308aaf30300aa3b008052L4;FFe00317aa2100805247020094f60300aa20008052d60c00b4e00316aae10315aae20317aa4b020094228f7fa9e00316aae10317aac3020094400d0037e00316aaL8;FF80825ef8220080524a020194810240f93f0400b1e0fdff54810000b480064", - "0f92200805243020194810e40f921fdffb4801240f9220080523e020194e5ffff17BL8;FF68e279d3151113cb130300f073621091e0030091a1630091e20313aab40f00f994c2019187820194b5c201f121ffff54e003009184820194f44f43a9f51340f9L8;FFf44f48a9f92b40f9f65747a9f85f46a9fd", - "7b44a9ff430291c0035fd6ff4302d1fd7b03a9fc6f04a9fa6705a9f85f06a9f65707a9f44f08a9fdc30091390040f9BBBL4;FF2801881a1f01186ba1040054084440f99f0208eb01020054540300b4134040f9f61b40f9fa0300aa39008052f50314aac8164038691640381f01096be0179f1aL4;FB6c2f7", - "372632f73657373696f6e5f6d616e6167656d656e742e7273000a64656372797074656420c00e206d6573736167652066726f6d20c02620776974682063L8;FF50010014560080d2e083029181220091026e80521600f0f2f58302914dc2009488620691806ec03d89e240f90101c03d88d640f98a220791", - "8083873c4001c03dBL8;FFf40300aa680240f91f0101eb000b0054680640f92a040091e00314aa490180526a0a00f909692138fe090094e10313aaf3faff97803240f9800100b4610a40f9L8;FFfafdff17080100f008b140f91f0900f123030054e8b30a9169fdfff029b13491e80302f9e8830a9100010", - "09000e42491e90702f9290000f029012191e80b02f9BBBBL4;FFe8ab00b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebc3be00541803008bL4;FB496e76616c696453657373696f6e4572726f7200000000002c53430", - "00000000018000000000000000800000000000000d49b430000000000b89a430000000000L8;FF3f0400f18b000054e0b740f92200805248e20094e883059100c1009114dcff975ad107369f0600f1abd0ff54e00740f9e10314aa220080523ee2009480feff17BL8;FFf50300aa47620194000680520101", - "805245620194400100b4155000a9e10200f021000091130800f91fa00039f44f42a9f50b40f9fd7bc3a8c0035fd600018052L8;FF630500946ba240a9ea0314aae10313aadeffff17ffc303d1fd7b0aa9f95b00f9f85f0ca9f6570da9f44f0ea9fd830291081c00121f090071e1010054e00302aaBBBL4;F", - "F22008052090900f9f44f43a9f70b40f9f65742a9fd7bc4a846a201142000805201c480525ba2019420008052018c815258a20194fd7bbda9f65701a9f44f02a9L4;FF007c041b007c1b53734860387306005173761e5363060011600a001143d863783f0003eb1380931a757e409340d873783f0000eb69", - "00005473060011757e4093L8;FFa40100d084002791e323009182008052e80700f989a20094fd7b41a9ff830091c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091080040f9e00301aaBL8;FFa20f00f9800200b0008c0891e82701a9a8630091820200b042a01291e1430091e82702a95122019", - "4800200b00060109146220194fd7bbea9f44f01a9fd030091BL4;FF02018052f44f41a9fd7bc2a84922001421010054810000b4601240f92200805244220094611a40f9c1fdffb40804805205000014611240f93f0400f12bfdff54L3;ZBBBBBBBBBBL4;FF0088202e1000669e10c201f220ffff541102c0", - "da3112c0da710d51aba20e0054120d11cb40825ff81f0001eb820e005412280c9b000600d1e2031faa1000108aL4;FFe10340a9ec0314aa2aa040a9536928380afc71d308050091290040f9280800f92af3ffb4e4ffff17e10300a9e00301aae10308aa220080522300805224008052L8;FF00201a91511f", - "01948002009000c019914b1f0194ff0302d1fd7b03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091160840f9e10300f93f0016eba8070054BBL4;FFff8317d1f30308aa08018052ff0300f9e87f01a988e00091f40301aae84702f9480300d008211d91e07f00a989600191e0c30c91e84f02f908008", - "012e1231291L4;FFc00a00f9400314cb22cf74b3c21200f93f683a381500156b3400148b3a001a8b20010054e003154bb80a1b53bf1200715fcb20388d000054181480525fb31f38L8;FFf31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa810100d021701e91e80", - "30091220280528b9f0094810100d021101591BBBL4;FF1803008b060000141f0400b1216000546bdf01941f100031a15f005439feffb505000014e04305918100805266df0194e05e0035e85341b9e84b00b957ffdfc8L4;FB4e00000000000000450600000a00000045024900000000004e000000000000", - "00450600000500000045024900000000004e00000000000000010300001f000000L8;FFeb8300f9e8df00f9172049a9ea5300f90a684aa9e8af00f9082c4ba9eaaf18a90a2c4ca9e8b700f9e8979f1a08219f5aeaeb00f9081d0072eb9b00f90a2c4da9BL8;FFe10200d021a00d91e40200d084200d91e32", - "30091e00308aae2018052875f0194fd7b41a9ff830091c0035fd6ff8300d1fd7b01a9fd430091080040b9a01300d1L8;FF2a0400910b0480521f010aeb6a0a00f92b692138a00300542800805228692a3848050091680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd6f50300aae00313aaBBBBL4;FFf7030", - "0aae00315aa2100805223008052aae1ff97e00317aa75ffff17400140fd00a8200e0c00669e8c01c0da8c11c0da8cfd43d34d696c38c1ffff17000400f0L4;ZFL8;FF4c1100912e1100d10c3900a96d19001221540daa2bfbff363f1100f1a0fbff544b11c0394c1500912e1500d10c3900a96d190012217", - "00daa0bfaff363f1500f1BL8;FF1f0500b160020054a86300910900009029211591020300d042840c91e3030091e00314aae10313aab50f00f9e82700a95d7f0194e000003620008052f44f43a9L8;FF280400917f0a00b1e81700f9c10c0054f7031faa70000014e11740f9e80f40f91f0101eb60680054", - "e81340f9958248f8490980520969213828040091bf0600b1BBBL4;FFf70340f9e0c30591a1220091022a805250bf01940200001417008092818a40a9e0030091f80300914250009400830091e1c30591022a8052f70f00f945bf0194L4;FB0105000014000000357e4900000000004a00000000000000b60", - "20000090000000000000000000000080000000000000008000000000000002ce8470000000000L8;FF210100b4e00314aa22008052f44f4ca9f6574ba9f85f4aa9fd7b49a9ff43039144bf0014f44f4ca9f6574ba9f85f4aa9fd7b49a9ff430391c0035fd6c50100d0BL8;FF493f0194000c00b4e10314aa", - "e20316aaf70300aa4f3f0194591740f9b7831ff8190400b4541340f93e3f0194e00319aa210080523c3f0194a00900b4e10314aaL8;FF3f0c0071000700543f100071210500541f0900f1a1210054e00313aaff6b00b9ffdf00a9df7e01a9dffe02a9f71700f9f72300f9df7e04a9f7ff05a91affff97BBB", - "BBL4;FF540f0294e802158b680a00f9882640f91f0500b1a0090054610a40f9680240f91f0101eb40310054680640f9966240b92a040091952e40f9490380526a0a00f9L4;FF9dedff97e8cf40f9880000b4e00759a922008052470f0094e0030c910eedff97e0830a9194edff97e8e340f9880000b4e087", - "5ba9220080523e0f009428008052L8;FF2201805260001fd66102009021043991e200805260001fd66102009021443991c200805260001fd6fd7bbfa9fd03009108409952021840b9010840f94873a772BL8;FF80030054e90700f9e802c0da0811c0da880f488b0801188a08fd0a9b3b03088b680306d10", - "80140f9bf0208eb61010054682306d1e00316aae20315aa010140f9L8;FF81040054e2031f2a20e8ff9709fc78d38801009008e13b910afc60d3097969784921094a2a5d105308596a780001094a60020079f44f42a9fd7b41a9ffc30091BBBL4;FFe82700f9b7020034e80240b20811c0da081540d2080d", - "088b0825019108fd46d308050091f60100b4c90240b22911c0da291540d2290d098b29250191c91a498bL4;FB1516ff9bb76efd3937466151d0e29e8ffa644c60b2055deee43dd9cf6d5766386d5557369c2ccb466c15544552c883e22d97733aa29aace7784aa28cf860264aL8;FFfabb40f9ef8f40f9ec", - "1f40f9e6e340f9e8f700f9e8cf40f9f60740f9f23f40f9f16740f9e56f40f9e8db00f9e45f40f9e8c340f9e9c300f9e99740f9f4cf00f9BL8;FFeae30091a04700d1e8271ca9c80200d008a52f91e82b1ea90a078052c8048052ff2719a9c90200d029cd2191e92b1ba9290080d2e1430691a949c0f2e87f", - "1aa9L8;FF4003803de8f304f900c1ffb4e15744f9c1c0ffb422008052464f009403feff17c082c73ce8a344f94003803de8f304f9fefdff17280100d008b140f91f0500f1BBBBL4;FF29012891a80200b9e8038052a9a200a909000014bf260029a80a00b9df0600f1ab000054e00314aae10316aa220080", - "5240ef01947f0600f14b0b0054e00317aaL4;FB446973706c617961626c6546696e6765727072696e74206372656174656420776974682073686f727420656e636f64696e674e6f2063757272656e7420736573L8;FF0800f0f208090091a4ffff17ffc301d1fd7b03a9f72300f9f65705a9f44f06a9fdc3", - "0091081c00121f090071a1010054e00302aaf30302aaf40301aa27eeff97BL8;FFf32b40f9ff830191c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091344c40a9f50300aa010300b021e02491e2008052680e40f9e00314aa00013fd6L8;FF0e0c0094fad342f9e8cb42f908011acb1f0308ebe", - "8340054e8cf42f9e10319aae20318aa00011a8b4a6f0094f90b40f94803188be8d302f97f0700b1fb0314aaBBBL4;FFb86301d1a8031df8080180523f8100f11700f0f20083813c1fa004a91f2c00f9a1030054081c40f90b4840f9f4a30091090140b90a3140b80c7141f8167140f8L4;FF690200548102", - "178b20008052e20316aad6110094800200b4c000f8b635070094080040b91f110071e0feff54050000141f0016eb1700178ba9fdff5404000014L8;FFa20100f042e00291e00308aa4eaf0094a20100f0428002914baf009440008052e10316aa50af0094ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa", - "9f6570ba9BL8;FF810d0054a8008052a5ffff17e03fc13de143c13d1443172ae81345b9e063813de167813de8a305b93a000014e80200d008b140f91f0500f1a9040054e8830291L8;FF6a091b320a010039d6ffff170b7c1253ec0f80120a0900390c440c33090d00396a6d1c320a0100390c050039cdff", - "ff17fb03002aa04302d1e10315aae20316aaBBBBBBL4;FF010040f9f30300aa810000b4600640f92200805247170294610e40f9810000b4601240f92200805242170294611a40f9810000b4601e40f9220080523d170294L4;FFe2018052f6cb01b9e86b02f9e87302f9c7f2ff97e0830891aceefe97e16b", - "02f9e343139182018052e06f02f960620491e17302f9a10000d021503691bcf2ff97L8;FF150c40f9f40300aaf30308aab5030037a882009108fddfc81f0500f1a1050054a80a40f9a002c03da182009100008092bf0a00f9680a00f9280080526002803dBBL4;FF2c0140f9080500f12b8500f84c8500f8", - "61ffff54480840f22003005449147d921f1100f10800098b2900098b82000054ea031faa020108370c0000142a0140b9L4;ZBL8;FF40010054810000b4601240f92200805248970094611a40f9810000b4601e40f92200805243970094080080927f2201a9f30b40f9fd7bc2a8c0035fd6ff0301d1BBBL4;", - "FFf903002ae00301aaf40305aaf50304aaf80303aafa0302aaf30308aaabae0094f60300aae0031aaaf70301aaa7ae0094fa0300aafb0301aa3ad7019400048052L4;FB20000000000000002008000000000000456b43743141636b6d61785f6f6f6f5f6b65797343743141636b6e6f776c6564676564726", - "563656976696e675f656b43L8;FF2080c03d0101c03d280841f9e0030eaae17b44a9f0030baae3e700f9e9df40f9f91740f9ec8700f94c018052e4d309a9e2d35da9fbab00f9e45f40f9fb8f45a9BL8;FF60220291fa0a009408fdff17f37749f97f0600b180030054e19b49f93f0400b140010054810000", - "b4e09f49f92200805240570194e1a749f9810000b4e0ab49f9L8;FF230100b0633c0391c40280529600001448008052e0a33239e8a73239c80080d20800f0f246000014e05306f9e083329121010090212037910202805223010090BBBBL4;FF0101805248f70194200500b408430291e10315aa161000b9", - "085c00a9080400f0088137911f500039602201a9090d40f9e803009120013fd6e80340f91f0d00b1L4;FBfe924800000000004c000000000000005e09000016000000fe924800000000004c00000000000000bd0000000a000000ffffffffffffffff67726f75705f6964L8;FF000100b45d000014600900", - "b5e00313aa32f6ff97e80301aa80000036c80900b5e1031faadcffff17e1031faa883600f9d9ffff17c10b0054e0031faa9affff17BL8;FFf31300f9fd430091e90301aaf30300aa0103009021442391e8030091e00309aa220280528f7701940103009021882391040300f084c00a91e0030091a3630091", - "L8;FF6fc4ff97e86352b9f86b52b908070036e93b49f9ea3f49f9e86f52b9f5cb42f9692a01a9e9d742f97822012908008092680200f9490d00b4e8d342f91f0115ebBBBL4;FF24008052baa9ff97e11f40f964ffff17e0a30091e10315aa220080522300805224008052b2a9ff97f41f40f981ffff17e0a", - "30091e10314aae2031baa23008052L4;ZDL8;FF742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a953b70094ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae023009144008052BL8;FF2041893cf883329121418a3ce983029120e10291f47312a9f53301b9e85701b94c3", - "7019448008052e9f31691ea7340f9e8f31639e8c31691eb7b40f9e9e302f9L8;FF5437009402000014390080527a9e40f9fa4f00f99a0100b4759a40f941370094e0031aaa210080523f37009400f100b4e10315aae2031aaae02b00f945370094BBBBBL4;FF8043843c0043c23cca010a8a8143833c0143", - "c13cac010ccb8043823c0043c83c0a010a8b8143813c0143c73c8043883c0043c63c8143873c0143c03c8043863cL4;FF165400a9810000d021003f91140800f91f60003913640039f44f42a9f65741a9fd7bc3a8c0035fd6000180520104805258070094fd7bbea9f30b00f9fd030091L8;FFf52340f9fd", - "7b43a9ff830191c0035fd68000805206000014e00313aa2f060094e80300aae00301aaa8fe0737680240f9090540f91f0009eb29060054e80f41b2BL8;FF7f050071a10000546012c63c6112c73c693e40b9e00700ad6a4240b9ea0800366a0642396a0a0036750240f9bf0600b1200f00546a4a40b97606", - "40f92a110036L8;FFe80303a9ff2300f9e90f00f96953199b7f0317ebe8031baadc26969a290940f93f011ceba20200540961199b1f3d00f1e0030054080500912a8541f81f0117ebBBBL4;FFf5031a2aeb0b40f9fa0f40b92600001408008092f73740f9682600a9080700d11f0d00b109f0ff5483ffff1", - "7e12340f908008092682600a9e1efffb4e03340f9L4;FB623562353537662f62797465732d312e31322e312f7372632f62797465735f6d75742e72730021706f73742d7175616e74756d20726174636865742073656e64L8;FFe04b40f9e10314aa22008052f4030daaf5030eaa47c70094ee0315aaed031", - "4aae14340f9010100b4e02740f922008052f4030daaf5030eaa3ec70094ee0315aaBL8;FFfd7b01a9f44f02a9fd430091280840f9290040f91f0002f1431a00543f0108eb13601932200100542a0440f91f1040f15369283808050091280800f902020054L8;FFe0030054e00313aa40000094080040b208", - "11c0da081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aa080c45f81f0500b1BBBBL4;FFee2b43a9a90302d1290140f9ef2f40b9f01340f9f11f40b9f20b40f94bfd68d34a631baa7f0a007180cdff54c9aa00a9697d1053ac835778ada35738aa035738L4;FB7365", - "6e642065706f636820c01e3a204b657973556e73616d706c6564202d3e204b65797353616d706c6564002f636172676f2d6769742f737061727365706f73L8;FF05000014e80b41b2a00312f802000014a80600d1a0a303d1a88311f864dcff97e10300aae86341f9f40301aa1f0500b1c0010054c80000b", - "4e06741f9e10308aaBL8;FFf30300aae102009021d42d91e8030091e00309aa2202805292670194e102009021882391e40200f084a02d91e0030091a363009162018052b30f00f98a670194L8;FFf44f42a9f65741a9fd7bc3a849670014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f30b00f9fd03", - "0091080040f9f30300aaa80000b4600640f901f57ed3BBBL4;FF280600b5080840921f1900f122060054017c0353410600343f0c0071600100543f080071a0faff543f040071a101005481c20091a2630091e003082a7291ff97L4;FF9402109102e90091c6040011817a62f821c026cb817a22f83f00001", - "4087c4093c2feffb47f0204ebe000005484feffb400290091340000b081021091207860f8L8;FFd4fcffb4e0230091e10316aae20314aa230080522400805225bdff97f55b41a9e10317aae20314aaa002168b49a70094daffff17ffc30691f44f44a9fc0b40f9BL8;FFf44f41a9fd7bc2a8c0035fd62000", - "8052010480525427019400800091b2ffff17ff0303d1fd7b08a9f74b00f9f6570aa9f44f0ba9fd030291210a00b4f30300aaL8;FFb4031df8f40e00b4080d80525a1f40f9fc0300f9fb0f00b9f96301a9f75b02a9f54f03a9937e089b3e270094e00313aa010180523c270094a0831df8201100b4BBBBBBB", - "L4;FF750240f9e1cf00a9f70f00f9d70b00b4a00240fdfc0f40f9fa031faa1b138052f80315aa0088202e0800669e17c10192f70000b5008f40fc5a2300910088202eL4;FFe18b42ada0a301d1a003d83ce20301ade107803d23f9ff97f80740f912000014600bc03de00f803de14740f9810000b4e00316", - "aa220080523e1b00941a008092L8;FF00008092d7820091b51b01941f0400f161010054fffedfc8c10240f9810000b4c00640f922008052421b0194e00316aa01058052020180523e1b019468fe4ad3BBL4;FFa003973c20020054680e001100e4006f60430091e8b304b94803170ba18301d10809c05ab4", - "573429b6233529e8e31291000301ad0003813c769b0194e8e31291L4;ZFL8;FFe0030091a363009102018052b30f00f9959b009468920091810100b021281991a401009084c01691a363009122018052a80f00f98c9b009468a20091810100b0BBBL4;FF2100805248db0194200d00b4e0874aade8030291", - "e25fc03dda1a0033f30300aa000400ad00f1cf3c0208803d00f0823c1afc0039e00b40910040199169db0194L4;FB000000000000000008000000000000000800000000000000f458440000000000496e76616c6964576972655479706576616c7565496e76616c69644b65796b65L8;FFe0b303f9e0430f", - "91e8a703f9e8fb40f9fcbf03f9e8ab03f9e8bb40f9f1d703f9e8b703f9e8ff40f9f7eb03f9e8bb03f9e8db40f9faf703f9e8c303f9e8b340f9BL8;FF1f0115ebea33959a08010acbaa0208cb33010aeb091d0054e90315aae8000014e81b40f91f0500b1000a0054e85b40b91f010071cd0b0054e8074091", - "e0c30091L8;FFe8e740f9e98742b9fa5b06a91f0500b1e95700b960140054e8830291e0c3179101a104911a0d0094e082c23ce182c33ce282c43ce8fb42f9e0db823de082c53cBBBBL4;FF0c010e8a208d212e00a8302e0800261ea8070037ec0700f92c00805202000014ec031faa4a2100914001148b14", - "000e8a096a74fc208d282e0800669e1cc101f2L4;FB2f697465722f7472616974732f616363756d2e72730076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f72617463686574L8;FF4cfb0094f8ffff17e1430091e20313aaf70b00f9f73300f9f74f00f968040094", - "e08744adf50300aae22fc03df4d300f9e0870bade08742ade267803de08709adBL8;FFbf010beba302005419000014e8031faa49001fcb2af17d9229094092ff030aeb030700543f1100f1830900542a6868b88b0080526c0140b29f0109eb83090054L8;FF2b91ff97f71740f9e80f40f9080117cbdf020", - "8eb49c1ff54e0630091e10317aae20316aa23008052240080522091ff97f71740f902feff17f50300aae0630091BBBL4;FF5f8b0071610200549f3d00f149430054e8420091a06301d1994100d1e84300f9480080d20800f0f2a8831af88ba3ff97e002c03de83340f9f5031f2abf431638L4;ZBL8;FFe08", - "fc03de82341f929008092690200f96082803c680e00f9e023029142b4ff97ff831a91f44f43a9f65742a9fc5f41a9fd7bc4a8c0035fd6fd7bbaa9fc6f01a9BL8;FF000021914e3b0194e8031faa080113abe3000054a00200d000c02991483b0194e8031faa080113abc2010054090140b22911c0da29154", - "0d2290d098b29250191L8;FFe8a34f39a8070036f9430891ba0000b4e00315aae1031aaa22008052453b0094604242f9f5c30d91088c41f81f0500b1c06b0154e8830f914361fe97e8834f39BBBBBL4;FFf2feff17f50300aae00313aa220080522300805224008052b5fdff97610a40f9e00315aaf6feff", - "17e00313aa220080522300805224008052adfdff97610a40f9L4;FF81010054e1230091e2830091e00314aa7ee6ff9728008092680200f9f44f49a9f54340f9fd7b47a9ff830291c0035fd6a003df3ce10bc03de91b40f9e10740f9L8;FFfd7b02a9f44f03a9fd830091080840a92b04009189008052f303", - "00aae02300910af97fd37f010aeb4a95819ae10308aa5f1100f15481899ae30314aac7ffff97BL8;FF6c820039ec7241f8684e0079e89240b8692202b8e9d2407868a202b808088052681500336a520079eaf240f8695e00796a3203a9680201397f020039b60600b5L8;FFa96d8252080140f9091000791", - "38304a9080000f9132f00f9428b00944001805241008052408b0094c05000b488ad8752130306a90810007908edb1d28840d6f2BBBL4;FFba035df8480317cb7f0208ebc8180054e81f40f9130100b4a8835df8e11b40f9e20313aa0001178b4acb0194e81f40f9f702138ba0835df85f0317ebc9010054L", - "4;FB0800000000000000a0e7450000000000000000000000000008000000000000000800000000000000743b46000000000000000000000000000800000000000000L8;FFbf0600b1e0c343f9efc743f9ebd343f9e82709a9e8d743f9ecdf43f9e9ef43f9ede343f9eee743f9e84300f9e8db43f9e82700f", - "928134df8e87b00f9e8435f39BL8;FF01f57ed3420080524a4b0194680e40f9a80000b4601240f901f57ed342008052444b0194681a40f9a80000b4601e40f901f57ed3420080523e4b0194682640f9L8;FF29050091200108ab62000054fd7bc1a8c0035fd6000100d000801691484b0094000100d000c0", - "1591454b0094000100b000203691424b0094e00301aa010100d0BBBBL4;FFe08312ade08313ade0a7803da8d676d3e08753adea03132a89dad59300030291080d0aaae183059122008052e0070dade08751ad290dc0da080dc0daf3830591L4;FB08000000000000009c4c42000000000000000000000000", - "0008000000000000000800000000000000304b42000000000000000000000000000800000000000000L8;FF680640f9e10314aae20315aa0001168b50eb0094c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aa220080522300805224008052BL8;FFf31340f9ffc30091c00", - "35fd6ffc300d1fd7b02a9fd830091090040f9e80300aae00301aa3f0500b140010054e80300f9e10200b021f42691e823009162018052L8;FFe80302f9e8031091e90702f9a80318f8680100b008b140f91f0900f103040054a80302d14900009029010291e8a703a948008052490100b029413191eae300", - "91BBBL4;FFeaa700a965ab019408074039f703002a1f013b6be0179f1a60ab0194080b4039fb02000a1f013c6be0179f1a5bab0194080f4039f703002a1f615a6be0179f1aL4;FFe8018052e80303a9090000f90a7000f8e0c30091e82300f90bfdff97f31f40f908028052e1031f2ae82300f9e00313aa7", - "f3e0039530300941f04003120030054L8;FF61100054d70d00b446ab0094e00317aa4100805244ab0094c02000b4890a40f9e8fe42d3f60300aa33008052bf031ff835f57ef2a8033ea9800c00549c0640f9BL8;FF940600f1b5620091e0000054a1825ff881ffffb4a00240f922008052452b0194f8ffff", - "17e88b40f908d7ffb40805088be00313aa0201805201f17dd33d2b0194L8;FF8100805200001891ff0316b9e85f00b97c2a0094e80356b9e00740918100805200001891ff0316b9e85b00b9752a0094e80356b9e00740918100805200001891BBBBBBL4;FF80faff542a15c0392b1900910d1900d10b3400", - "a94c190012218c0caaeaf8ff361f1900f160f9ff542a19c0392b1d00910d1d00d10b3400a94c19001221a80caaL4;FFe9db44b91f0900b1e91f01b9a1860054e07342f9e17742f9e843139142e9fe97e84353391f05007141890054e86353391f050071ac99005448b70035e90f41b2L8;FF0b3041292941", - "0daa0e1900390a1d003921810baa090080120c1100b9010500f9090100b9c0035fd629008052010500f9090100b9c0035fd609fc58d30afc50d3BBL4;FF4201805284930194610cf8b7fa0301aafc0300f9fc0314aaf4031baaa10300b4f70300aa3f930194e0031aaa210080523d930194800f00b4e1031", - "7aae2031aaaL4;ZDL8;FFf4031faae00313aa080c48f81f0500b1c1fdff54f40314abe2020054688e4bf81f0500b140020054e00313aab5020094080040b20811c0da081540d2080d088bBBBL4;FF2401805209000014e01300f9a10300f021d02891a30300f063302991e0830091c201805284008052a3c", - "70094e01340f92dffff17e01300f9a10300f021e01d91L4;FB9c863aed591b16372133639d8e7052ef933fd5c22971ac4a5e8b314400002fe1d3fd806cb7b851af23f1482e7e66d45d1498ba3550678ff94ac5d6ff9008f73aL8;FFe8eb45f9e8e300f9e8ef45f9eaa30aa9e8f345f9ea0346f9e80700f9e", - "8f745f9e83f00f9e8fb45f9e9a31da9e9ff45f9e80746f9e8a705a9e80b46f9e87f00f9BL8;FFfb0314aaa053ff54e80740910881099100210491e14316911310009497faff17c00200f000e03991c20200f042803a912104805270530194e2074091c50200f0L8;FF1c190091e14b41f9810000b4e04f41", - "f92200805247530094e89f40f91f0500b16000005440630291d0ecff97f3db52a9960100b47722009104000014d60600f1BBBBL4;FFa8835cb8bc035df8c8060037bb835df8e10319aae20318aae0031baa4df30194e84b40b9e9b344b87c6e00a9785601a9684a00b969b204b8e82742a9746a02a9L4;FB", - "9a964800000000003300000000000000c3010000050000009a964800000000003300000000000000b0010000050000009a964800000000003300000000000000L8;FFa80640f9160100eb62020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e00300915ee", - "8ff97f44f47a9f65746a9BL8;FFa9c31538a9f355384a01084a6b01084aaad31538aa0356382901084aabe31538ab135638a9f31538a92356384a01084a6b01084aaa031638aa3356382901084aL8;FFf3074091738209913f0800b1800100543f0400b140010054810000b4e09749f92200805243730094", - "e19f49f9810000b4e0a349f9220080523e73009460220291BBBL4;FF880000542800028b08f1df38881df837a04301d11b1c0094a8035bb8681f0037a8035cf82a0340f9490108ebc35400548a0340f9b8835bf84801088b880300f9L4;ZBL8;FF000480522100805247b30094c00c00b42043c13c2143c0", - "3c9f0215eb010000ade2000054b79200d10803178b010140ad092140b9292300b9210300adff0215ebBL8;FF63881891c4018052da000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f962280094e10300aae15306f9e0833291a102009021c00a9102028052L8;FFf60300aaa00302d10af", - "2ff97e00316aae04b05f9e0432a91e10000b021e0029102028052e30000b063f0099174000014c80080d2e0632a39e0432a910800f0f2BBBBBL4;FFa88cac7208f001b8680480520900f0d2602201a9000400ad692200a9f30b40f9fd7bc2a8c0035fd620008052610480524d030294fd7bbea9f30b00f9f", - "d030091L4;FFe103005408488852e801a0727f0308eb69030054fb0316aaf62f40f93a008052b70100b510000014280400d11f0900b162000054220080523e030094e80600d1L8;FFf44f41a9fd7bc2a841feff17f44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091140040f9f30300a", - "a9f0600b140020054610e40f93f0400b1BL8;FFa92300d1260300b0c6a02e912a018052070300f0e7142f91e00308aae201805284008052e9af00a9ea0300f987830194fd7b42a9ffc30091c0035fd6080040f9L8;FF080040391f1400f91f3000b91ffd0371000300541f050071ed0000541f090071e000", - "00541f0d0071400200541f11007103000014480000341f050071010440f9BBBL4;FF54c30114a203009042203e91e00316aae10315aa69c30194ff0302d1fd7b06a9f33b00f9fd830191f30308aa6602009440030037080400f008b140f91f0900f1L4;FB34684900000000006a000000000000000201000", - "02e00000034684900000000006a00000000000000440100001c00000034684900000000006a00000000000000L8;FF4cc3009429000014e0c3159174beff97e0c3139165bfff97fc031f2aabf9ff17d60000b4e06740f9e10316aa2200805240c30094e90315aadc0000b4e05f40f9BL8;FFe00313aa2200", - "805252020094610a40f9e00315aaccffff17f50300aae00313aa220080524b020094610a40f9e00315aad2ffff17e00313aa2200805245020094L8;FFfacf40f9e002803de9d302b9214b803dec030b915f0b00b141d6ff54f3feff178083c03ce8430f91000d803d888341f8e9035039e80b02f9e843069", - "1a9090034BBBBL4;FFe10319aae2031f2ae0023fd61f0000f1cd000054390300ebc3df00541803008bf9feffb50f0000141f0400b121df005463e301941f100031a1de0054f9ffff17L4;FB656e746974795f7075626c696373656e6465725f636861696e72656365697665725f636861696e7370656e646", - "96e675f7072655f6b657972656d6f74655f7265L8;FFe1efc13de20313ade0f3c13de2f7c13de10310ade0fbc13de1e7c13de20311ade0ebc13de1030fade8f340f91f0d00b100eaff54e0431e91e10316aae20318aaBL8;FF220080524b630194610e40f914008092740200f93f0400f18b000054601240", - "f92200805243630194611a40f9740e00f93f0400f18b000054601e40f922008052L8;FF00800b91516300944001009000e00b914e6300944001009000400c914b6300944001009000a00c91486300944001009000000d9142630094ffc300d1fd7b01a9BBBL4;FF2911c0da4a11c0da291540d24a1540d22", - "90d098b4a0d0a8b292501914a25019129fd46d329194a8b2801088b180900b1a5000054f9031faae00319aae10318aaL4;FF89f2ff54600080d2f403002a007f009b830400d1fa0180925a0300cb004000915a03038a5a03008b60028092000019cb0000038a395300911900198b00430091L8;FF8480219", - "1e323009182008052e80700f98aa30094fd7b41a9ff830091c0035fd6810100f021fc1591820080527fa30014080040f9e00301aa090140f93f0900b1BL8;FF280080527f7e01a9680600f9880200b008210e91680200f9f44f42a9f65741a9fd7bc3a8c0035fd6880200b008e11e9175d200a9750e00f96", - "80200f9f44f42a9BL4;FFe92300a9dcffff17280180d20800f0f2081100d1d7ffff173f00156b81f7ff54680240f9e0031faa090540f90a0140f9290100cb4a01008be0031faa0a2500a9L3;ZBBBBBBBBBL4;FFe80600d11701178a210140ad610100ad210142ad220d41ad610102ad620d01ad5cfaffb52", - "0000014090180520801098b292100910801148a206b68fc00a8200eL4;FFebb300b8e90b00f9ea63003914000014baf37da9a003df3cb6835ef8e00f803d5bff48d357faffb5d5ffff17fa031f2a688240a915d940a9a4f4fe97a1033da9L8;FFe00313aa0103805202018052f44f44a9f65743a9f85f42a", - "9fd7b41a9ff430191441d011428008052bf0a00f9bf2200a9614200910000809274420091a81d0194BBL4;FFe12b803de027803d682600294809c05a6909c05a682601298809c05aa909c05a68260229c809c05ae909c05a68260329f44f5da9fccb40f9f6575ca9f85f5ba9L4;FFe10b05a9001c40f9d60", - "200cbe05b04a9d602028b1b000014e18a45a9e00315aae11600f9e11e00f92100028be11200f9f35341a9f55b42a9f76343a9fd7bc6a8L8;FF989d009468e20091810100d021101591a40100b084001091e0030091a363009142008052a80f00f98f9d0094810100d021401891a40100b084200a91a36300", - "91BBBL4;FF770000b56fdd0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300ebc31e00541803008bL4;FB662074686973206661696c732c20776527766520736f6d65686f772076696f6c617465642063617573616c69747900003", - "b094900000000004d00000000000000L8;FFf48f44f9e1a343f9e8df00f9e8ef43f9e8af15a9e8f743f9eb2b44f9e9a310a9e8fb43f9e90744f9e8b700f9e8ff43f9eaa318a9e80344f9ea0b44f9e8eb00f9BL8;FFac5d0194480340391f050071e0420154f91700f9435d01940078805221008052415d01", - "94407801b4e807409102788052f90300aa08810991fb1300f9010140b2L8;FF1f0101ebc0090054680640f9490580522a040091e00315aa6a0a00f909692138e10313aa05faff97760a40f9680240f9080116cbbf0208ebc8080054680640f9BBBBL4;FFc0020054e1e7076f680700d1e90740f91b011bea", - "0a328052e1fcff54208d212e00a8302e0800261e48010037292100910003098b1800198a496b78fc208d282eL4;ZFL8;FFffa70039e81300f969f2ff97e80300aae81300f9410200d021381d91430200d063901a91e083009122028052a40080521a000014c90080d2e0a3003948008052BL8;FF21030090", - "21083f91a9831ff8040300d084601291a32300d1e00308aa42038052867d0194fd7b42a9ffc30091c0035fd62103009021703f91e00308aa82028052L8;FF1f0101eb603e0054e81340f9490380522a040091e00316aaea1700f909692138e1630091be7cff97f71740f9e80f40f9080117cbdf0208eba83", - "d0054e81340f9BBBL4;FFa1620091a22301d170a6ff9720f9ffb4a7000014e82740f91f0500b1a0010054a1c20091a22301d168a6ff9720f8ffb496000014ff5b03a9ff2300f9a1620091L4;FBf7874900000000004e00000000000000b904000017000000f7874900000000004e00000000000000570700", - "0005000000f7874900000000004e00000000000000L8;FFe0031f2ae3031faac0bd0094ff4305d1fd7b0fa9fc6f10a9fa6711a9f85f12a9f65713a9f44f14a9fdc30391292c47a92018c03d282844a9346c45a9e00b803dBL8;FF091440f9090300b40a1040f9ec031faaeb0309aa4a4100914d8541f8ae0", - "140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191ad194e8bbf010cebe3010054L8;FF693640f9680208a9681240f960828c3c684a00f9696e00f9080d40f900013fd6606601f9616a01f9290c40f9e8830f91e1031baaf5830f9120013fd6f7f341f9BBBBBL4;FFe10313aab7f8ff97770a40f96802", - "40f9080117cbbf0208eb68330054680640f9e10316aae20315aa0001178b490d0294e802158b680a00f9951640f9550300b4L4;FFfcdf1aa9f7030eaafc030faafa0310aaf6030aaa470d0094e2af58a9ef031caaee0317aafcdf5aa9ea0316aaf0031aaaed0318aaec0319aae1cf40f9610300b4L8;FFea", - "2300916202009042882b91287968b82902009029c10d91200440a9eaa701a9ea530091e81700b92802009008b10f91eaa302a9a82300d1e8a703a9e3630091BL8;FF5f0800f180000054281440f9140114ab620d00549400f8b6e0031faae10314aa518d0194f70302aaf60300aaf80301aaf40700b43b8d", - "0194e00314aa21008052L8;FF940a0091d60600f1b562009113693738f47f00f900880054a0867fa9e2031b2a40ddff97f47f40f9e87740f9f303002a9f0208eb61000054e0a303918f8c0094BBBL4;FFc9018052e0030391e00709ada0077cade253803da203d73ca1c302d1e203019103088052e347803", - "de08706ada1037dade233803dd7020191a82735a9e18307adL4;FB666f7220534841323536000000000000d9214900000000004700000000000000110000000a000000212249000000000048000000000000001d00000017000000L8;FFe092833ce8cf01f91a110094e1b343f9f6b743f9f8bb43f9fcbf4", - "3f93f0400b100670054e9cf43f9e8ef42f9e0c343f9facb43f9f5db43f9e95b00f91f0500b1BL8;FFead700b9e9bb00b9684308f8af240094fa0301aae106f8b6fb031faae0031baae1031aaa504d01943e4d0194e0028052210080523c4d0194c01c00b4c80200d0L8;FF080100b4080140b20811c0da08", - "1540d2080d088b0825019108fd46d308050091092440f93f0500b1400400540a2c40f9093840f90a0100b44b0140b26b11c0daBBBBL4;FFe80740f9080117cbbf0208eba8070054e80b40f9e10316aae20315aa0001178b4ced0194f902158bf8df40a9f90f00f91f0319ebe9010054390100b4e00317aaL", - "4;FB556e747275737465644964656e74697479496e76616c69645072654b65794964496e76616c69645369676e65645072654b65794964496e76616c69644b796265L8;FFc7ecff97760a40f9680240f9080116cb9f0208eb88070054680640f9e10315aae20314aa0001168b4aed0094c802148b680a00f", - "9f44f43a9f65742a9f85f41a9BL8;FF75ffff17090e8052ea0740f9012b099bb80208cb002b099b09e179d3221108cb466d0194f80b00f96bffff17e00200d000603491426d0194ffc305d1fd7b11a9L8;FF4f6d0094400100f0000017914c6d0094400100f000600d91496d0094fd7bbaa9fc6f01a9fa67", - "02a9f85f03a9f65704a9f44f05a9fd030091ff8308d1f30300aaBBBL4;FF48ad0194000480522100805246ad0194e00200b460c2c53c61c2c63cf90300aaa1835ef8000400ad810000b4e0031baa220080523fad019475f2ffb4e0031aaaL4;FF1b000014750a40f9680240f954fc41d3080115cb9f0208e", - "ba8010054b40000b4680640f9e20314aa0001158ba10e0094a802148be0031f2a680a00f9f44f42a9L8;FF49ad0094e01700f9602100b445ad0094400080524100805243ad0094e01300f9a02000b43fad009440008052410080523dad0094e00f00f9e01f00b439ad0094BL8;FF0c0100f9e8031691e9df", - "0679a455ff97f88345b91f07003160080054e8e20b9120c3c13ce98745b9e86f04a921c3c23c1f0b0071f59b45b9e8bf45b9e1c20891L8;FFe083c53de187c53de0fb833de1ff833d4403ff97e0fbc33de1ffc33de8e20891e0833f91000500ad6e2d0094e88340f90aad41a9096101910081c23ce97f01f", - "9BBBBBBL4;FF22020054e80f41b25d000014e00302aaf50302aacc150194f40301aac0000036740b00b54d000014e0830091e92b02a998f10094b70240f9e80640f91f0114ebL4;FF67220391e9ab01a9aa0000d04a813291e8ab00a9e8830c91e50313aae35f813de253813de16f813de46b813de067813", - "deb0300f96ee6ff97e043139165f3ff97L8;FFe81b00545f0001eb400100548a0000350968e2383f0501312d1b00547f0001eb800000540968e3383f0501318d1a00545f0003eba1030054e9031faa1f050071BBL4;FFff830791c0035fd63a008052f66b0ca937e2ffb514ffff17e0030391e10317aae20", - "31caa2300805224008052b087ff97faa34ca9f66340f9f30340f915011c8bL4;ZBL8;FF800100f000e008914d950094e8031faa080113abe3000054800100f000601c9147950094e8031faa080113abc2010054090140b22911c0da291540d2290d098bBBBL4;FF8a0340f9e01740f94801088b882700a90", - "8fc60d3482100b5080840921f1900f162210054017c0353412200343f040071200100543f080071c1faff54a1a300d1L4;FBc600000019000000e8204900000000004900000000000000bf00000009000000e8204900000000004900000000000000e7000000090000005369676e616c2050L8;FF29a044a", - "9e8cf00f92aa045a9e8c300f9283440f9e8ab00f9283840f9eb2312a92ba047a9e84f00f934a048a9eba71aa9e8df00f929a049a9e8ab15a92aa04aa9BL8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eba816005439000014f9031faafbab49f9fa0740915a8309917f0700b18", - "017005440c30391L8;FFf30703f9e80303f9e8c3179100810091e07f813d4f550094e8fb42f91f0500b121e2ff54e99f40f95301009068b240f93f0500b1e0010054fb4340f9f4833291BBBBL4;FFfdc30091f60300aae00301aaf40303aaf50302aaf70308aaaccc009408048052090400b029210b91f30", - "300aaf80301aae92300a9080400b008611d9189028052L4;FB6b796265725f7072655f6b65796c6f63616c5f6964656e746974795f7075626c69635265636f726453747275637475726563757272656e745f73657373696f6eL8;FFe00300916201805244008052aae9ff97e10340f99effff17ff0302d1f", - "d7b03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054BL8;FFe80301aae00700f9010300f021201a91040300f084a01991e3230091e00308aae201805285750194fd7b41a9ff830091c0035fd6fd7bbea9f44f01a9fd030091L8;FFf90b40f9b8010034e1d342f9e8cb42", - "f91f0101ebc0d30054e8cf42f9090380522a040091e00318aa09692138e1431691ead302f901120094d6000034e17f52b9BBBL4;FFc082c53ce123803df9ff4039c182c03ce10b00adc282c43c020119cbb80202ebe20302ad02010054e002198be10314aae20315aa47b501942803150be8ff0039L4;ZDL", - "8;FF085300b93c000014b9035ff8e0031aaa880219ebe833889a3f0314eb2933949aff021aebe103899af303889ac0b2ff97e0031aaae10313aabdb2ff97d90000b4BL8;FFe1c3279102288052fb9b05f951350194e88b4cb949008052f9a305f9f5a705f91f010071f3ab05f92801881ae99f40b91f0109", - "6b41050054e39348a9e0c31291L8;FFfb020014e8c344f9090d8052800fc03dc822099b000d803d8013c03d0011803d8017c03d0015803de97b45f9093100f9c90600918003c03d0001803d8007c03dBBBBBL4;FFaaed8dd2680eaef2a9ccadf28accadf2a8accdf2a9ecccf22a4ccef2e86deef2298fedf", - "2ea8decf2080008ca090009caf30302aae8a700a928000aca6aae8cd2L4;FFe10319aae20317aa23008052240080522de6ff97f90f40f988ffff17e023009122008052230080522400805226e6ff97e10f40f98effff17e0230091e10318aaL8;FF0901098b0a0e8052750640f9210108cb00550a9bc6020", - "094e00315aae10314aac3020094d60000b4c8e279d3e00315aa02018052011116cb3e050194611240f9BL8;FF4ab11491e8a700a9020300f042dc3891ea0f00f9e343009163850194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000d04ab11491e8a700a9L8;FF1ffd0ea91ffd11a91f", - "fd14a91f692a381f0100f9c0035fd6090080920a0180521f692a38090100f9c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9BBBL4;FFb6035ff858ffff17a08300d1e10316aa220080522300805224008052b4b7ff97b6035ff85cffff17a08300d1e10316aae20318aa2300805224008052ac", - "b7ff97L4;FB383961626364656653657373696f6e53747275637475726570726576696f75735f636f756e74657270715f726174636865745f7374617465496e76616c696450L8;FFe88303f9f9031c91e8634f39694740f9e0831d91e0cb813d6013c63ce1031c91e8231c39683b40f9f8831d91e99b03f9", - "2093803ce88f03f957170094e9b343f9BL8;FF080900d10bffff17e90b41b2e9a300a910ffff17c80080d20800f0f2080500d104ffff17c80080d20800f0f20809009100ffff17c80080d2e10b00f90800f0f2L8;FFc0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff031", - "6d1f30300aae8430691e00301aaff0300f9fa03062af803052af60304aaBBBBL4;FFe00315aaf44f44a9f90b40f9f65743a9f85f42a9fd7bc5a848e50114541109cbe00313aaf50301aae10308aae20314aa42e50194c8e279d36002148b021116cbL4;FB2f696e6465782e6372617465732e696f2d31393", - "4396366386336623562353537662f62797465732d312e31322e312f7372632f62797465732e7273002f727573L8;FF981a40b9942240b921008052e30316aae40315aa1f010a6be203182afa03881ae8a300913f411f7100010291fb03891aaefbff970800809260220091e1a30091BL8;FF21bc2e91e302", - "0090630c2491a0e300d1c20280526401805209000014e102009021bc2e91e302009063742a91a0831cf8a0e300d1c2028052240180529e590094L8;FF610e40f9810000b4601240f92200805248650094612640f93f0400f18b000054602a40f9220080524265009474d643a9750300b496c200910400001", - "4b50600f1BBBL4;FF24008052ba97ff97f60f40f9b1ffff17ffc307d1fd7b19a9fcd300f9fa671ba9f85f1ca9f6571da9f44f1ea9fd430691090040b9f30308aa3f05007121090054L4;FF610000b481ffff54f4ffff178002109121008052e22740f9820202f9010800b9f55b42a9d1ffff173f0800f966", - "000014200000b0f55b02a9030082d2f76303a9L8;FFa101009021441591e8230091e00309aa2202805293a5009468e20191a101009021881591a40100f084a00a91e0230091a32300d1a2008052a8831ff88aa50094BL8;FF695e4039f503002a1f01096be0179f1a622501948862403969624039b502000", - "a1f01096be0179f1a5c2501948866403969664039b502000a1f01096be0179f1aL8;FFe1834dade2e3803de1831dad3f01009401bb40f9e8030e91e04309916d250094e8c30991e0030e916b250094e00741ad9ffe00f1f8430a91ffaf01f9ffab01f9BBBBBBBL4;FFf44f45a9f65744a9fd7b43a9ff8301", - "91c0035fd60a0140f9290100cb4a01008be0031faa0a2500a9f44f45a9f65744a9fd7b43a9ff830191c0035fd6e82b00a9L4;FF011040b9155840a9f30300aae0030091f40308aa16110094e0630091e10316aa12130094e1030091e2630091e00315aa76f4ff972800809229008052880200f9L8;FF5cf7", - "ff97e103152a95a240a9160115eba3020054880240f9e20313aa0001158b421901947f0216eb28010054a80213ab02020054880600f9f44f43a9f65742a9BBL4;FFfa0300aa000400ada0820291af70009408048052e90b40f9e003c03de8eb14a9e2430291e8ff15a908018052e8ff16a908008092e1831", - "7a9e0630491e1c700f9L4;ZFL8;FFa9331838a96358384a01084a6b01084aaa431838aa7358382901084aab531838ab835838a9631838a99358384a01084a6b01084aaa731838aaa358382901084aBBBL4;FF608649a9e8e3009147af0094e8e340391f05007121020054c80300d008210c91090480522e0", - "0001439008052752e40f9682640f9bf0208eb21fbff5460220191L4;FB6465725265636569766564001b737071722076312e73656e645f63742e726563762065706f636820c0243a204e6f4865616465725265636569766564202d3e20L8;FFe87744f9e83f00f9e87b44f9e9a31da9e88344f9e97f44f9e", - "8f700f9e88744f9e8a705a9e88f44f9e98b44f9e84b00f9e89b44f9e9a30fa946d90094fe0318aaBL8;FFe17f52b9e28352b9e343169180008052d61400943f0700b1a0100054e1d342f9e8cb42f91f0101eb60c10054eb074091e8cf42f92a0400916b81099149028052L8;FFe8ef42f97f0208eb610000", - "54e06317919d8ffe97e8f342f909068052e02bc33de12fc33de233c33d6822099b69060091e0032d91000500ad0209803de9f702f9BBBBL4;FF0080189162f90194ff0303d1fd7b08a9f74b00f9f6570aa9f44f0ba9fd03029109704039f30300aaf40308aaa90100343f0d00716108005460a240a9090d4", - "0f9L4;FB652e7273002966696e6765727072696e742076657273696f6e206e756d626572206d69736d61746368207468656d20c00420757320c0001b66696e6765727072L8;FF880080d20800f0f2081900918082833c8182843ca0077bad8182863ca10b79ad8082853ca003d13c8082803c8182813c880", - "200f98282823c92ffff17e08744adBL8;FF59000014f8031faa57000014680b0091b8831cf805000014e80b41b2a0831cf802000014680f0091a00301d1a8031cf85f6e0094f80300aa4b000014b8835cf8L8;FFf40300aae0fbc63de1ffc63de8074091e2074091e00315aa0881099142c03591e1031baa", - "e30318aa04048152e50314aa06048052e05f873de163873d9d790094BBBL4;FFf32b40f9480080d20800f0f2680600f9a88357f809008092690200f9e80100b54c000014e90313aa04000014e84340f90801168b090d00d1f32b40f9480080d2L4;ZBL8;FFc00100f000203591c30100b063a02391c40100", - "f084803591a24700d1c102805254b90094c20100f042a03791e10300aa45b90094c00100b00040329140b90094BL8;FF4a25019129194a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054L8;FFe95740f9606", - "21e91680902f9e86b40f9613e42f9770502f9f7c32491633a42f9680d02f9a8835838754642f9691102f9a90358f87b1502f96b3e1f91400540adBBBBBL4;FFf40300aae003082af60303aae20303aae303132a58efff97e90300aae00314aae30316aa89fdffb5740040f9820640f95f0015eb091a00548", - "10240f929008039L4;FFe90741b2e02301a9e0030091e92300a924e7ff97a802168b0908805275da00a9682602a928008092741a00b9680200f9f44f45a9f65744a9fd7b43a9ff830191L8;FFfd7b41a9ff830091c0035fd6ffc300d1fd7b02a9fd830091490200f029c13e910a0000904ae12491400200f", - "000803f91e92b00a96902009029610791e1030091BL8;FFea6340f9291d009148dd78920b000014e08744a908008092686a00a90c000014eae74239e8031faa2919009103000014e8031faa292100914a1d409208010aaaL8;FF770100b447890094e00317aa4100805245890094e80300aa40008052e873", - "00f9080b00b4f66f00f90300001448008052ffa30da9b60000b4e07340f9410b0091BBBL4;FFe0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a951c90194fd7bbda9f50b00f9f44f02a9fd030091a87cc39bf30300aae9031faaL4;FB0800000000000000d00346000000000", - "0000000000000000008000000000000000800000000000000480346000000000000000000000000000800000000000000L8;FFe17340f9810000b4e00315aa2200805248c90094f6031faa787201a908008092760600f932fbff17e8b743f9eb031c912093ce3c69d14b78e133c23de6030991BL8;FFb506", - "00f1d6a20191c0020054c1025df8810000b4c0825df82200805245490194c1825ef8810000b4c0025ff82200805240490194c10240f9810000b4c00640f9L8;FF290d00910a0300344a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a05009111000014e9031faa10000014f5031faa681a40f", - "948f6ffb5f6031faaBBBBL4;FF4a7141f8cb1500330d0d00b90c2901a90b810039c0035fd6e90300d029892b916a02805209a900a92900805209010039c0035fd6e90300d029d52b916a038052L4;FBe41f400000000000100000000000000008000000000000000886400000000000e41f4000000000001", - "80000000000000008000000000000008087400000000000L8;FFff2318a9e87f1aa9ff231ba908068052ff7f07a9ff7f0aa9ff7f0da9ff7f10a9ff7f13a9ff7f16a9ff7f19a9e003833cff231ca9e8008052ff4307390f000014BL8;FFfd030091f303032af40302aaf50301aaf60300aa43690194000480", - "520101805241690194600100b4165400a90103009021402a91140800f91f60003913640039L8;FF2043c23cc0e200912183c33c2207c03deab341b91f010071f8c741b9801f803de9079f1a818308ad0801094be99741b962c3883ce8e300b9e8cf40f9ead700b9BBBL4;FFe13340f93f0400f18b000054e", - "00317aa2200805247a90194df0600f14b060054e06b40f9e10316aa2600001439008052bbf8ffb537008052df0600b1a1f9ff54L4;FFe14b40f9011800f9540100b4220000d0210000d08006009142ac40f921b040f9540000f9e20301aa340000f907000014f4af40f9d4feffb5340000b094620291L8;F", - "Fe08746ade00701ad95260094a0c303d1a15701d102048052e50e0094a80351f81f0500f1e02b0054a8c303d16082cf3c6582ce3c0181c73c0281c83ce9fb8392BL8;FFe97f41f940030291e1c3089122008052080500b12935899ae87b01f9e97f01f94e290194ffbf0a39f6031caaf50313aac2fe47d34", - "20100b4e87b41f9e97f41f9L8;FFf54b02f908b140f91f0d00f1c3040054e10343b9e20743b9e8030291e003279115410191f603279128e3ff97080000b008012191e3074091e8f707f9080000b0BBBBBBL4;FFd1110194f70301aac0f80736b90000145f2800f1880000542800028b08f1df38680ff837e", - "0230091167a0094e80b40b9681a0037e80f40f9ea0640f9490108ebL4;FF1a4affb4e00319aae1031aaa2200805248110094e0df40f9e1031aaa47faff17eeef44b948fd60d338fd78d3eb7b42f9ed7f42f9fb0309aae903172ae1ab40f9L8;FFe1050054690a40393fb9017181050054690e40393fe9007", - "121050054691240393fd50171c1040054691640393fd5017161040054691a40393fa5017101040054BBL4;FFf85f42a9fd7bc5a8c0035fd6e023009101048052e20317aa2300805224008052b383ff97f45b41a9d1feff17e0230091e10316aae20317aa2300805224008052L4;ZDL8;FFfd030191080040", - "39690100d029f521918a0000102b6968384a090b8b40011fd6880100d008212d91e00301aae10308aa62028052fd7b44a9ff4301917b910014BBBL4;FFe9ffff179c008052f3d745a99f0314eb80170054680b40f98a070091080500d1090114ab2821889a090e80520969099b682b01a9e81740f9eaaf43", - "a9392900a9L4;FBe658a28cff50fbac0000843917518b424840d225e3cbaf0f606ee5e7b92e90c1371ae52b637c2f061db1cc44c6f59026827c5878b5c585f3f833d62975437d51L8;FF093540f9e9ab00f9093940f9e99700f9093d40f9e9ab1aa90a2548a9eaa709a90a2549a9eadf00f9e98700f90a25", - "4aa9eaaf15a9e9c700f90a254ba9ea8b00f9BL8;FFf30300aae0a30391fb0305aafc0304aaf90303aafa0302aaf80301aaf7a30391e52b00f983f2ff97e87740f91f0500b1e00c0054e82300f9e9234fa9e082c33cL8;FFe8d302f9e80180528083cf3ce8f304f94003803d57000014f5c742f9f7cb42f99", - "b0280d21b00f0f2e8a75139e8060036e14741f9a10600b4e04b41f922008052BBBBL4;FFf44f47a9f65746a9f85f45a9fa6744a9fc6f43a9fd7b42a9ff030291c0035fd620008052010480524ff10194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9L4;FB6563656976657220636861696e206b65790", - "000000000000072984800000000003300000000000000110100001500000072984800000000003300000000000000L8;FF21050054e0031faa8effff17c80080d2e00700f90800f0f2080900d17fffff17e90b41b2e92300a984ffff17c80080d20800f0f2080500d178ffff17c80080d2BL8;FF6b0d0b8b", - "6b2501916bfd46d34a010b8b4a0500915f010bebc90b00542801088b480108aba30100544b000014e8031faa090c40f93f0500b1c1f7ff54e9031faaL8;FF0800098b080500911f0109eb281700544c000014fa031faaf9ab49f9f8074091188309913f0700b10018005400c303915f250094080040b2081", - "1c0da081540d2BBBL4;FFbb8312f81f0900f16101005408008092686e00a9e04302917699ff97f3031f2af6031f2ae00748a9e91b40f9eba343a99affff17a06303d18899ff97e83f40f9L4;ZBL8;FFffb301f9ffb701f9ff1701f9e81301f9ff1b01f9e81f01f9ff2f01f9e82b01f9ff3301f9e83701f9f", - "f4701f9e84301f9ff4b01f9e84f01f9ff5f01f9e85b01f9BL8;FFe95b04f9e9fffff029310791e8c303f9e8fffff008610691e85f04f9e8c31691aa0200904ae10491e86304f9e8ffffb008912891e96f04f9e9c32291e86704f9L8;FFe94f05f9e9000090298d2691ea9f04f9eac32491e86305f9e80000", - "9008312b91e95b05f9290080d2e87305f9c80480528943c0f2ea7705f90a078052ff4b05f9BBBBBL4;FF3b3340b9d50b00b4380740f945010294e00315aa2100805243010294601200b4e10318aae20315aaf70300aa49010294381740f9b80a00b43a1340f939010294L4;FFe83e40f9c80000b40805088", - "be00315aa0201805201ed7cd3460100945f1300f1a00a0054f5d24aa9340200b4b982009104000014940600f139c3009180010054L8;FF680240f9080117cb9f0208eb69fbff54e00313aae10317aae20314aa230080522400805222170094770a40f9680240f9080117cb9f0208eb29faff54e00313aaBL", - "8;FF29411291286968f8e10308aa87810114080040f9290300f029e10d91e00301aa08014039227968f8290300f029a10e91287968f8e10308aa7c810114ffc300d1L8;FFc09b0054e81340f9490180522a040091e00319aaea1700f909692138e1630091bf80ff97fb1740f9e80f40f908011bcb3f0308e", - "b089b0054e81340f9e1031aaaBBBL4;FF80feffb4e10317aae20314aaf50300aa50c10194e00317aae10314aa2200805244c10194020000143500805228008092755201a9685200a9f44f47a9f72b40f9L4;FB20c01d20776869636820686164206e6f206f6e652d74696d65207072656b65790076656e64", - "6f722f6c69627369676e616c2f727573742f70726f746f636f6c2fL8;FFe30bc13d0800f0f2f52b00f9f56b40f916017db2a18b39ade133c03de207c13d6083853c6383843ca103953ce38301ade20b803da08779ada203d53c760200f9BL8;FF680640f9e10314aae20315aa0001168b50410194c802158", - "b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aa2200805246000094610a40f9L8;FF613e40f9e10000b4604240f922008052f44f42a9f65741a9fd7bc3a845410014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091BBBBL4;FFf70300aa1f0400b14", - "1fdff54e0430591810080526ce10194a09f0035e85341b9e88b00b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aaL4;FB08c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cd", - "e05bL8;FF86390094e203012ae103002a83390094e203012ae103002a80390094e203012ae103002a7d390094e203012ae103002a7a390094e203012ae103002a77390094BL8;FF000580520101805247610194400100b4155000a9e10200f021000591132000b91f900039f44f42a9f50b40f9fd7bc3a8c", - "0035fd6000180520105805255610194L8;FFdeffff17811c0054e0031faa2cffff1720ebff54c80080d20800f0f20809009137000014e1010054e0031faa1affff17c80080d2e00b00f90800f0f2080900d1BBBL4;FF810380525ba1019420008052c103805255a10194ff0305d1fd7b0ea9fc6f0fa9fa67", - "10a9f85f11a9f65712a9f44f13a9fd830391fa0308aa080c40f9b40280d2L4;FFe3ff9f525f00036b6dffff54436c1c53e401809283c023cb0400038b006863f8030840f99f0003eb80000054000080d21f000039007d20d405804039a3100012L8;FF84e00491a363009182008052b30f00f995a1009495", - "a10094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aaBL8;FFff0f00f9df0215eb89f7ff54e0230091f50301aae1031faae20316aa7ffdff97e10315aae05741a9b7ffff1708010036800200b000c01891820200b042601991BL4;FF3500805209fc4a", - "d30a088052f4031faaf5ff03a92911c0da490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4L3;ZB" + "BBBBBBBBBL8;FB0000000000000000000000000000000000001b1b1b1b1b1b1b1b1b1b001b1b1b1b1b00131b1b001b000007000082775f19328d6db5d6cb6d0b4c24000000c300L8;FFb5fbffb4e00f40f9e10315aa2200805219a50094d8ffff17880080520902805268220039280080522a0000147c000", + "0b50b000014fb0600b48aa240a93c008052BL8;FF220080521c250194611240f9810000b4601640f9220080521725019460020191f30b40f9fd7bc2a871feff17610640f9810000b4600a40f9220080520e250194L8;FF69fbff54e00313aae10317aae20314aa2300805224008052b2010094770a40f968", + "0240f9080117cb9f0208eb29faff54e00313aae10317aae20314aa23008052BBL8;FF08008012680200b93000001448008052680200b92d000014e81343b8e93740b984ffffd084001c91f9e343a9a8831fb8e8434139e0031faaa9b31fb8e92740f9L8;FFa1fdfff021602491a3fdfff063742491e02300", + "91a20080524402805286000014c90080d2a8831d38480080520900f0f2a0c300d1a8931d38a9031df8476bff97BL8;FF080700b5200840921f1800f142070054217c0353610700343f040071a00200543f080071000100543f0c007100fdff54e20313aa230c805275ebff97e10300aaL8;ZDBBBL8;FB6a0", + "00000000000000e00000026000000496e76616c6964496e7075744c656e677468496e76616c69644f75747075744c656e677468496e73756666696369656eL8;FFe80f40f91f0101eb608b0054e81340f9090280522a040091ea1700f909692138e16300916192ff97882240f9680500b409e179d3961e40", + "f957038052331108cbBL8;FFe18307ade082c53ce182c03ce28308ade082c13ce282c63ce18306ade082c73ce182c83ce28304ade082c93ce282c23ce18305ade082c33ce182c43ce28302adL8;FF0108805258010094fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091360000f057000090f30", + "301aac10e40f9e8ee43f9f40300aa1f0113eb1531939aBBL8;FF8a0100b512000014e80316ab83fdff5440ffffb000803c916c410194e9031faa27000014e9031faa6a8640f90a0100b44b0140b26b11c0da6b1540d26b0d0b8bL8;FFe80700f907000014c90080d248008052e04300390900f0f2e847003", + "9e90700f9e02300914d4bff97f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6L16;FFe8b343f9e94700f9df0600b1e9c343f9ebfb43f9ea6b00f9e8e700f9e8b743f9f4bb43f9e0c743f9f2cb43f9eecf43f9e8bf00f9e8bf43f9efd343f9ead743f9BBBBL8;FB910500002a0000001c9d4200", + "00000000249f4200000000001c9e420000000000fc9c420000000000209b4200000000009c9d420000000000aca0420000000000L8;FFa97317384901084aaaa35738a98317386901084aabb35738a99317384901084aaac35738a9a317386901084aabd35738a9b317384901084aaae35738a9c31738BL8", + ";FF680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaf60301aae10315aae20314aacdf8ff97750a40f9e10316aaeeffff17281040b96800c8376800d037L8;FFa04700d1b7c2ff97e06701b9a04700d1b4c2ff97e05b01b9a04700d1b1c2ff97e05301b9a04700d1aec2ff97e04b01b9a04700d1", + "abc2ff97e04301b9a04700d1BBL8;FF080119cb7f0208eb49ddff54a04301d1e10319aae20313aa230080522400805285e0ff97b9035cf8e2feff17a04301d1e10319aa220080522300805224008052L8;FFe88b40f9c80000b40805088be00314aa0201805201f17dd317550094400745ad160080924233", + "c03de85345f9800705ad400743ad8233803de8bb02f9800703adL16;FFe00740ade8030091e0432d91e1431e91e0e7813d028149ade1eb813d0155c03de233823d038948ade037823de13b823d008547ade22f823de32b823d038946adBBBL8;FFa9efff54e00313aae10317aae20315aa23008052240080", + "5287000094770a40f975ffff17e00313aa22008052230080522400805280000094610a40f97cffff17L8;FF42730054e1431691b70d0094f90b40f9df0a00b100040054e1d342f9e8cb42f91f0101ebe0530054e8cf42f92a04009180c202914901805209692138ead302f9BL8;FF1df50094f8ffff17340", + "100b48806148be00313aa01f17dd302018052f44f42a9f65741a9fd7bc3a813f50014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9L8;FF02d05f3804e05f78541000124301003464000034bf000039007d20d404805fb8e3ff9f529f00036b6c000054bf000039007d20d4836c1c53e5018092a3c023", + "cbBBL8;FFffcb02f9e8cf02f9ffd302f980100054e0431691e1031faa22008052cf180094e8d342f9e0cf42f9490180520968283808050091fa3b49f9e8d302f9fafcffb5L8;FFe85305f9ff5705f9ea5f05f9e86b05f9e96f05f975310094e1f343f9810000b4e0f743f92200805213350094a81240f928", + "0700b4e1eb41f9e2ef41f9e8432a91L16;FF8182c33c8216c03da80317f8880e40f9893240f98083873c8082c03cf48340f9aa831ef8a8031df8e8431091a103963c00a101918283813ca2877eada98318f8BBBBBL8;FB656d6f74655f6964656e746974795f7075626c696373656e6465725f636861696e", + "72656365697665725f636861696e7370656e64696e675f7072655f6b657972L8;FF1d9d0094a11a40f9f30b40f9810000b4a01e40f922008052179d0094a12640f9810000b4a02a40f922008052129d0094a13240f9810000b4a03640f922008052BL8;FF610a40f9c3ffff17e00313aae10316aae20315a", + "ad1000094760a40f9680240f9080116cbbf0208ebe9f8ff54e00313aae10316aae20315aac8000094760a40f9L8;FFc1070054600640f9fbe702a9f61f00f9bcc31fb8f218ff97f70300aaf50301aaa81300d189008052e00705a9a08300d1e103019142008052e82704a9be100094BBL8;FF1ffd007101f", + "bff5409088052a18302d1220108cbe90301912001088b1d5d0194683340f960030191e10301912200805208050091683300f94e590194e8031f2aL8;FF1f0500b1801c005401430291a22302d1acf6ff97e0f9ffb453010014e83746f91f0500b1a1000054ff3706f9f63b06f9ff3f06f9ff830cb91f0800", + "f1e1350054L16;FFe00314aa490180526a0a00f9096921380d4b0094e10313aa64eaff97803e40f9800100b4610a40f9680240f91f0101eb600d0054680640f9090180522a040091BBBL8;FF748b0094e80300aae00301aaa8fd073621000014e80741b2400000145f2800f1880000542800028b08f1df38", + "080af837e00300916f2e0094e80340b9a8020037L8;FFe05fc73d22008052e103843de207843de0f3863de8eb0df9177d0094e00314aa0104805222008052137d0094e8074091e00319aa0178805208812f9136f2ff97BL8;FFc8feffd008610891b45a01a9a84e00a9f44f42a9f65741a9fd7bc3a8c0035", + "fd66efbff97fd7bbca9f85f01a9f65702a9f44f03a9fd03009109800091f30302aaL8;FFc8060094e0feffb528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd6ff0301d1fd7b02a9f44f03a9fd830091010840a908018052BBL8;FFa9a357384a01084a6b01084aaa831738a", + "ab357382901084aab931738abc35738a9a31738a9d357384a01084a6b01084aaab31738aae357382901084aabc31738L8;FF243d009460c21491e1432a9102248052757e02f9748202f9778602f9788a02f9768e02f97a9202f97b9602f9193d0094681242f969e21391600e42f9692a03f9L16;FFe14781", + "3de04b813df88702f9fc7f02f9e17b02f9e06b0054602bc03de88303f9e0831d9168234239695b40f9f4031c91e0cb813d6093c83ce8231c39684f40f9BBBBL8;FB2f0583d814345557dad0491d752b732ca28cdf4ccddb24ff83e900003a05aaddbdd27e5b35f1d99e1a8ab274f443629e0b8a2052e37c1", + "b547025166ebfbac4a8L8;FFe00313aa410080521a8d0094804400b4f5031faaf40b00f9f94b01f9e04f01f9ff5301f9fb6304a9fa2b00f908000014e00316aa420080520f8d0094f53f40f9BL8;FFc16c0054480200b0081140f9880500b4e0db42f9e44b40f9e8c3179143030291b3bbff97e8c31791fc", + "fb42f90081c03ce80743f99f0b00b1e07f823de80305f9L8;FFf50b00f9b7e9ff97e9a340a9ca05805281624039e06300912a69283808050091e80b00f994000094f60b40f9e80340f9f45742a9080116cbbf0208eb88030054BBL8;FF88820091f50308aab80e5ef81f0700b1c00d0054b9da40a9a81a40", + "b9e8020036a01e40b9e1630191420180524a490194610cf8b7fa0301aafc0300f9fc0314aaL8;FF080d088b0825019109fd46d30800098b080500911f0109eb69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff5480fdffd000e00391L16;FFe8f700f9e8d342f9e87f00f9e8d", + "742f9e84b00f9e8e342f9e88300f9c8008052e87300f92c000014ed634ba928a00791fa3f11a90001c03de0030aaaf1fb12a9BBBL8;FF69f202f8e98340b968de0039e80b4179699203b849fd60d368d2037848fd70d369ba0079e9ab43a9687a0139e81340f975e2003968f205f8a8835838697206f8L8;", + "FFfb0340f9e2031aaafc0300aae1031baa206d009418000014e8ef41f9080f00b4e9f341f9e80302f9e8830591ea0310912b0000f06b210c911a0380d280fdffd0BL8;FFff0600b100280054fb0318aaf6635ba9581400b4d922009104000014180700f139630091a013005421835ff881ffffb4200340f9", + "220080520fed0094f8ffff17L8;FFedffff17e80300aae00301aae10302aae20303aae30304aae40305aae50306aa010000d4c0035fd6f7ffff1740d01bd500008052c0035fd6c0035fd6fd7bbfa9BBL8;FFfad342f9fc0740919c8301913ffeff17e043169122008052d0100094e1d342f948feff17e043", + "1691e1031aaae20318aaca100094fad342f9e8cb42f908011acbL8;FFf5ab44f9e11b42f9ffe71639810000b4e01742f922008052172d0094e8a340f91f0500b160000054e00203915ce7ff97f45b53a9960100b49722009104000014L16;FF8927005408788052200742ad6a048052eb1f40f9fa5b42f9a", + "00303d1f45f42f9e1831391620080526901088b08010291200502ad200b43ad200903ad210340adBBBBBBL8;FB6f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f6c69622eL8;FFfa6704a9f85f05a9f", + "65706a9f44f07a9fd8300919f0003eb621400545c08038b5a08048bf30302aaf60301aaf40300aa780100d01843009139feffb039033291BL8;FFf0fdff97e0080036811400b5e0031faa9effff17680240f9080540f9190101eb031e0054680240f9080540f91f0119eb690d0054e00313aae2fdff97202", + "40037L8;FFe93f0139401eff97f703002a15000014f5031baae81340f9e9a34039ea9342b8eb2f40b9e80b00f9e9630039aa1b00b9abb301b8e80300f9e92300390a000014BBL8;FF880300f9690300f988fe60d3881800b5800a40921f1800f182180054817e0353a11800343f080071400400543f04007", + "1e1060054e81342f91f0500b141020054L8;FFe10316aae20315aa0c000094760a40f9680240f9080116cbbf0208eb69f6ff54e00313aae10316aae20315aa03000094760a40f9adffff17ff0301d1fd7b02a9L16;FF080600b5e1031faacaffff17e10314aae20313aaf0ecff97800700b5e1031faac4ff", + "ff17e1031faa883200f9c1ffff17e1010054e1031faab6ffff17c80080d2BBBL8;FB4e00000000000000f904000019000000ef104000000000004e0000000000000001050000140000003d0f4000000000004a00000000000000b602000009000000L8;FF080117cbbf0208ebe8380054e81340f9e10316a", + "ae20315aa0001178b1d810094e802158be81700f9955a40f9550300b4e11740f9e80f40f9965640f91f0101ebBL8;FFe00315aa210080523600805219010194601000b4615a40a9f58300a9ff0f00f9df0215ebc8080054f5031faae8031faab60000b40000158be20316aa15010194L8;FFf85f03a9f657", + "04a9f44f05a9fd030091ff0740d1ff0300f9ff0740d1ff071ef83ffc3ff18900005409008092090100f973000014810100b4e9074091ea030091BBL8;FFf50300aa0801805208000039b60000b4a0060091e10317aae20316aa1d41019418410194e00313aa2100805211410194200200b4e10315aae2031", + "3aa930200a9L8;FFe00315aa00013fd6e10640f9810000b4e20a40f9e00315aa174100949f0b00b1e0080054e8430c91a6000014776a41f900c3c73c01c3c83ce90f44b9f6eb43b9L16;FFe99340f96ff212a9e8db40f966fa14a9692204a9e9cf40f9659218a9e8b340f96dba1aa9692205a9e9c340f9e8", + "ab40f9692206a9e89740f9683a00f9e8d740f9BBBBL8;FBe32f536492bad99bf75aca140a0f60a97adc044a0805a72f22bb307eeacc72408843d6594d605218f974a29ecfe184fbb0b822c03c330d1805b600000dea7448L8;FFe34300915d8d0094fd7b44a9ff430191c0035fd608100091200440a9a943", + "00d1eaffffd04a811a91a8031ff8e2fdff9042483491e92b01a9e34300914f8d0094BL8;FFab050014c80080d2e1feffd021b80c910800f0f2e0031791e3833291e4c31791e2008052e9fb05b9e8fb02f957f5ff97f3f742f9e8ef42f97f0208eb61000054L8;FFe16affb4e0cb40f9220080521a1100945", + "3fbff172000805281008052520d009420008052c10180524f0d009420008052e1031aaa4c0d0094e17342f9e09340f9BBL8;FFea0600910001803d090900f9e80315aa098d41f8ea0f00f93f0500b1e0010054df0200f109068052e0230091e303949aea079f1ae903899ae2231291e1031faaL8;FF08154", + "0d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b250191L16;FFa12e00549f0600b1a00d0254880600913f0308eb01010154c80100d0081140f91f0900f129070054280700d1ed031caafc0309aae86305f", + "9880100f008411f91BBBL8;FFa1ffff9021203f91a3ffffb063340991e00700f9c7000014481c00121f090071810b005428008052f40300aae1230091ffa300a940008052e20303aae8ff02a9L8;FFe282c53c00630291a0073bade082c63ca2033cade18345ade237c03da1033dada2039c3c930cff97e0", + "0640ade80b41b9010340f908830bb80083893c01838a3cBL8;FFe10300aae00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6e20313aa430c80527af7ff97e10300aac0feffb5a80640f91f0116eba9040054e00313aaL8;FF43d863783f0003eb1380931a757e409340d873783f0000eb6900005", + "473060011757e4093000000f000201d91180000f0000c40391f1c007281100054a02a0091BBL8;FFc02202914901805209692138ead302f902180094e14316917b0e0094e08f49f9800100b4e1d342f9e8cb42f91f0101ebe0840054e8cf42f9090180522a040091L8;FFe9a703f9680000b4e00314aa000", + "13fd6e10640f9810000b4e20a40f9e00314aa1531009476000036f7030291fc030014e8631d91f6030291e95b47b9083140b8L16;FFf44f09a9fd43019117a040a9f40301aaf30300aae0030091a18300d1a3831ff8a88b3ea942008052b7031ef8b6170094880ec0da29fefff029ed2591a80f00f9BBBBB", + "L8;FB340000000000000037010000220000004d414320766572696669636174696f6e206661696c656400a71a40000000000034000000000000001701000011000000L8;FFe90740f9215442a9290114cbbf0209eb88050054b50000b46002148be20315aa1c990094e80316aa8902158be90f00f9e083c0", + "3ce90f40f90001803d090900f9BL8;FF00ffff9000c02a917015019400ffff90008010916d150194fd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d3L8;FFe02bc13de12fc13d24fdffb084e03a91e233c13de86b02f94083803ce01bc13d26fdffb0c68", + "03b914183813ce11fc13d4083833ce023c13de8830c914183843cBBL8;FF6283c83c6383c53ce00703ad6083c13c6183c23ce223803d6283c03ce08700ad6183c33c6083c43ce317803de18301ade203803dea540094fcff403908088052L8;FFc80080d20800f0f21c450091a7000014e85746f9e95b46f", + "960fdffb000c01091e1032d91e85b04f9e8c32291e95f04f909fefff029611091e8a305f9e8c32791L16;FFe0230b39e0030b91ff270b39f56301f952dfff97e80300aae86301f981feffb02100119183feffb0636c1191e0030b91420280526401805209000014e06301f9BBBL8;FF3f0108ebe00000548", + "a6928380805009120008052290040f9280800f983ffff17e00301aaf30301aae10309aa220080522300805224008052f4030aaa7e040094L8;FF080340f91f0500b1a0000054e243169120008052e10318aa04160094e10318aa288c43f81f0500b1e0fcff54e243169140008052fd150094e3ffff17e043", + "1691BL8;FF420080521cf90094682640f9a80000b4602a40f901f57ed34200805216f90094683240f9a80000b4603640f901f57ed34200805210f90094683e40f9a80000b4L8;FF7f0501318cd58c9a05000014f4031faa08011fcb52000014ec031faa8801088b0b188052ec8300b20b000014f0fd48d3e", + "f9d0092aa010a8b29010ecb109e0092BBL8;FF002300910881099162860094e1074091e0431691026e8052218009911d390194e077c53de17bc53d58008052e8e36b799400805215008092e057813de15b813dL8;FFa1c20091a22302d1e9f3ff9720f6ffb48d010014a22302d1830c805231efff9780f5f", + "fb4d9000014a1620091a22302d1dff3ff97e0f4ffb474010014e1c32491L16;FFe84f00f9e8db42f9e9a308a9a89247f8e95f5739e8bb01f9e8ff42f9eb7202f8eb7f43f9e80700f9e80b43f9eba301f9e8f200f84841092aa91246b8ea435739BBBBL8;FB506f6c796e6f6d69616c4572726f724368756e", + "6b496e6465784465636f64696e674572726f724368756e6b446174614465636f64696e674572726f7200000000L8;FF33008052e11340f9e0031aaae20318aafc0313aa730600911e890094e0031aaae10319aae20317aae30315aae4031caaf1e7ff97e80b40f9200080523f0300ebBL8;FF80c20391e1e", + "31b9120f18f3c8942039102278052f86f11a9f55f12a9e92b00f9e8a300f91b090194ff0600b19542039141020054e8031691e00316aa9a040194L8;FF20008052e10313aa57050094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0312d1167c4093e8ef7db2ff0300f9df0200", + "f1e9079f1aBBL8;FFacffff17e90313aaf54f43a9f75b42a9fb0f40b9f96341a9fc0340f9060000143c008052542340f9b4031df874f1ffb509018052a8035df8755a00a9755e01a9L8;FFeda305392b1f0036ebd343b9e96306394921c993e8cb00f9ecab4779e31b40f9eb3b00b9a00302d1e2e300918b", + "1245f8e8fb0039e10319aae8b340f9e97304f8L16;FFe56f40f9ea031caafb5340f9ef3b40f9f1030aaaf57b40f9ea0300aafc4340f9e45f40f9e00312aae08710ade81b01f99f0100148800805209008092790a00f9BBBL8;FFf3031f2ae10600b4e85740f9fb1f40f9e90f40b9e82700f97fffff17f607", + "46a993fffff073e62791e02b40f9540380520a000014f63340f993fffff0738a2791L8;FFfd7bc2a8c0035fd6ff8300d1fd7b01a9fd430091e10b00a9c2fdff9042c02291e70305aae60304aae50303aae1030091e3230091e40302aa55650094420700b4BL8;FF09000014e00300f9a1feffb0212010918", + "3fefff063900291e0030091e200805284008052dceeff97e10340f9c6ffff17e80f41b2c0ffff17c80080d20800f0f2L8;ZDBBL8;FFe89341f98082823ce8bf00f972ffff1728ffff900881069189028052e86301f9e96701f9f2feff172143c23c2007c03dfc430f912283c33ce8b341b9e0430691L8;FF", + "f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6200080520108805250250094fd7bbaa9fb0b00f9fa6702a9f85f03a9f65704a9f44f05a9fd030091L16;FFf403032ae30302aae20301aaf60300aa00fefff000800f9124feffb084a03091e60300910104805225048052070c8052e00300ade0", + "0301ade00302adde0c0094BBBBBBBL8;FB302f7372632f686d61635f696d706c2e7273002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665L8;FF09088052696603a9696204a9e90308916092803c21250091680e00f9480080527f2a00f96", + "86201391aa30094b6f7ffb5c0ffff1725feff90a5e03691e1630091BL8;FF3f2900f1880000544b01098b6bf1df388b0cf8374b05c0396c1d00128c6119538c01210b810102516b00f8374b0080524c0000143f104071c30b00544b09c039L8;FF4d0200543f0c007180fdff543f100071e00200543f1400", + "71010400541f0400f1010c0054a8835cf8090540f9292100f1a30c00540a0140f94b8540f80a2500a9BBL8;FF24630194f702168bb7031ef85f0317eb401c0054a8835df8ea060091a1c300d1e0031baa49048052aa031ef809693738fee8ff97b7035ef8ba035df8480317cbL8;FF0e020094610a40f9db", + "ffff17f50300aae00313aa2200805208020094610a40f9e00315aae3ffff17fd7bbca9f85f01a9f65702a9f44f03a9fd03009148008052BL8;FF08090091bcffff17ff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091081c00121f09007181010054e00302aaf30302aaf40301aacaef", + "ff97L8;ZDBBBL8;FB4e0100002d0000001d1c400000000000540000000000000059000000050000001d1c40000000000054000000000000005f000000050000001d1c400000000000L8;FF0900088b37050091ff0208ebc9120054968248f8df0600b1c0120054802202919ff2ff97080040b20811c0da08", + "1540d2080d088b0825019109fd46d30800098bBL8;FFe1060054298400d13f8100b122070054490500b42a0200f04a1140f95f0900f1c3040054ff8302d1fd7b08a9f44f09a9fd030291e90300f9e90300910a020090L8;ZFBBL8;FFc0035fd6202040a941ffffd021c43091030d40f9c2028052fd7b43a9", + "ff03019160001fd6088000910920009142ffffb042a81c91e82700a9e803009109000090L8;FF41040054c1220191e20313aae8fdff97600300b4e00000143f040071400200543f08007121030054e1230091e20313aadffdff97400200b4e9000014c1620091L16;FFe9c340f9e8f341f9e9c300f909008", + "092e4c34ca9ef0303aae82b01f948018052ee3b40f9e8270ea9e8a74ba9ecab00f9e30304aae0c7c33de5fb42a9f10303aaBBBBL8;FB3a656b68656164657200000000000000b51d4000000000005600000000000000ed0000000900000080174000000000005600000000000000a600000009000000L8;F", + "Ff3031faa088c48f81f0500b1c1dfff54e8031faa080113aba306005400feffd000803d91698f0094f3031faa080c47f81f0500b121e3ff54e8031faa080113abBL8;FFe1031faac0035fd6c0035fd6e30302aae20301aae1fefff021c02c91570f0114fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f", + "44f05a9fd030091ff033ad1L8;FFe0431391099140b80a1140f81bd140b82200805223008052e97b00f9091141f8089141f8e92b10a9e87f00f91c040094e86b42f9e96f42f91f0500f1e99300f9BBL8;FFffc30191c0035fd6ffc301d1fd7b02a9f91b00f9f85f04a9f65705a9f44f06a9fd83009117304", + "0b9f50300aaf30308aab7060034e80240b20811c0da081540d2L8;FF81040054e91f40f9e14341f9e0031691ffa71139200545ad286140f9e82303f9200705ad200543ad200703ad200944ad200b04ad210141ad210301ad200942adL16;FF1f0500712179005488008052e1eb41f9620a00f96822003908", + "008092680200f9810000b4e0ef41f92200805212d30094e1f741f9810000b4e0fb41f922008052BBBL8;FF09692138b6020034c80240b20811c0da081540d2080d088b0825019108fd46d308050091f50100b4a90240b22911c0da291540d2290d098b29250191a91a498bL8;FF00001491c2fdfff042801", + "491e1038052606f0094e04316912200805207120094e1d342f942faff17f60300aae04316912200805201120094e1d342f9e00316aaBL8;FF030b00544b0dc0396c1d00122c540c0b810148516b00f8378b0080523a0000142b7c1c534b0a00344d11c0390b00be522b000b0bac1d00128d00f83761710c8", + "bL8;FFa4fc068886ffff350000010a401800b9001a003441404079212c46d3211c00513f7c0071c9020054f35341a9fb7345a9e303004b0100230a411800b96000006aBBL8;FFc00240f9220080521b330194f8ffff1760020291b10b0094e80740910881099100010491740b0094f4cf49f99f0600b100b", + "0ff54f5d749f9f3d349f9b50b00b4L8;FF290080d2e92fc0f2a8ff3aa9a8a73da9762f0094a10357f8810000b4a08357f82200805214330094e11340f9810000b4e01740f9220080520f330094f44f5aa9L16;FFe10304ade20349ade20303ade1034bade10300ad51ffff1736008052e00745ad88220791", + "e233c03d89fa40f9a0073bad0001c03d817ac03d88ee40f9a203983cBBBBBL8;FB32000000000000002800000011000000696e76616c6964206d657373616765204956696e76616c6964206d657373616765204d4143206b6579696e76616c6964L8;FFe00316aae20318aa229b0094a8c303d100c1cb3c0", + "1c1cc3ce80f40f9000500addaedffb4d602188b3b008052b5c303d10c0880522d00001409088052a002088bBL8;FFfdc30191350840f9fa0301aaf30300aa750500b4540740f91a1b0194e00315aa21008052131b0194601800b4e10314aae20315aaf60300aa161b0194571740f9L8;FF403300541f0500", + "b1c03200544083cb3c4183cc3c090141d21f0100f1e8ab0bf960838b3c4083cd3c29459f9a61838c3c4183ce3c3f0500f160838d3c4083c73cBBL8;FFebb307f8ee0f0239f18700b9f24700f9f0230179ed3309b8ef330179eca700b9e7d300b9f4570094a8035c38bc935c381f05007121090054a8835c3", + "81f050071L8;FFe0a33239e08332910800f0f2ffa73239e85306f95161ff97e80300aae85306f9e0833291a1fdffb021002691a2018052a3fdffb0635c2691240280522b000014L16;FFffbb00f9ff7b01b91ff10ff81f0800f101330054a0c303d1d3e7ff97a01e0036c12900b410020014e8cb40f91f05", + "00b101010054ff6f19a9df7e04a9fcdb00f9BBBL8;FFa02301d1a9ab3ba9bb7e0094a8035ef8b7031ff8140117ebe3090054b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcbL8;FFe06f833d8083c13ce173833d8183c03ce8eb06f9e06b833de167833d2700001", + "4e01bc43de83b48f96082803c09008092680e00f9e0430691690200f9bb100094BL8;FFe91b4039ee1f40396a110a2aab110c2aef234039f0274039c911092af12b4039f22f4039ee334039e14740390c120f2aef374039f03b40394d12112af13f4039L8;FF6b7a1e534ab10caa6c7e1f534a910baa6b42", + "10534a950caa0c4010534a250baa0b0000124a290baa0bfc4cd34a9d0caa0c4812536b017b924a010baa6b320c53BBL8;FF0825019108fd46d308050091090c40f93f0500b180030054091440f92a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b290500910a1840f92801088bL8;FF21008052", + "1b3b0094a0e700b4e10315aae20316aae00f00f91e3b009405000014160080920500001428008052e80f00f9680a41f9e80b00f9681241f91f0500b1L16;FF7102001428008052e85f00f9b80000b4e00314aae10318aa2200805216bb0094b90000b4e07740f9e10319aa2200805211bb0094e86740f91f", + "0500b1608dff54BBBBL8;FBdc0200001200000070745f7665632073686f756c6420626520636f6d706c657465000000000000007a134000000000005700000000000000a602000020000000L8;FFa24700d1210380525f87009403feff906360249120008052e1031faae2031faa68870094400080524100", + "80524e87009440008052e10317aa4b87009440008052BL8;FF600600ade17740f9e20313aa23008052081940f900013fd6e06b01f9e8c31791e16f01f9290c40f9e1830b9120013fd6fcfb42f99f0f00b1c106005488008052L8;FF1c0b0094400100b4155000a901fdfff021000c91131000b91f500039f", + "44f42a9f50b40f9fd7bc3a8c0035fd600018052010380524b070094fd7bbea9f44f01a9BBL8;FFe20317aa23008052240080528ad6ff97f45b41a933ffff17f40300aae0230091e10316aa02048052230080522400805281d6ff97e00314aaf45b41a9f50740f9L8;FF29194b8b2905009129010aab02040", + "0542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb29030054280108ab83000054L16;FFe8b300f9e89345f9e8ab00f9e89745f9e92312a9e89b45f9e99f45f9e8ab1aa9e8a345f9eac745f9e9a309a9e8b345f9e9a745f9eb2318a9e8b745f9ebcb45f9BBBL8;F", + "F5fa001b121ffff54530080527f0a0071c1320054080300b0081140f91f0d00f123040054e80302914900009029611091e8270aa9e8f30191c90200d029f11e91L8;FFa80000b4609640f901f57ed342008052196b0094689e40f9a80000b460a240f901f57ed342008052136b009468aa40f9a80000b460", + "ae40f901f57ed342008052BL8;FFf30302aaf40301aad7f7ff9720020037750240f9a80640f9160101eb02030054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039L8;FF600300540ac0865229050091aa8cb87208010a0b681200b97f2600a9fd7b42a9f31b40f9ff03019", + "1c0035fd6e80301aae0030091e10302aae20308aad6ffff97BBL8;FFff830191c0035fd68000805206000014e00313aaeb070094e80300aae00301aaa8fe0737680240f9090540f91f0009eb29060054e80f41b2e80300f9e0030091L8;FFa8035df8755a00a9755e01a9785e02a97c6605a97b6200b9682", + "603a9686604a9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd6L16;FFe91f80520840003909200039f44f48a9f65747a9fd7b46a9ff430291c0035fd6a85300d1490100d029911e91f60301aaf30300aaa8273fa900feffd000981791BBBBBBL8;FB5f6d6c6b656d373638", + "2e7273001443616e6e6f74206f70656e2066696c6520617420c0001243616e6469646174652073657373696f6e20c00e206661696c6564L8;FFeeffff17b5035ef8a98300d1b3835e38289140f8290141f8bf0600b1a8031cf8e97200f86003005408038052e9830791ea7240f8da26089ba9035cf8a9031", + "df8BL8;FFe10315aae20314aa0001168b211f0194c802148b680a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6e8031faa74f7ffb5e00308ab43f8ff5400ffffd0L8;FFe10315aaaccafe97bae77ca96083c23cbcef7da9b5835ef8e00b803d5f0700b1e1020054e00bc03de00300adb70000b4e0", + "0318aae10317aa220080520e1f0094BBL8;FFf57701f91f010071fb7b01f9e802881a1f01186b81fbff54e8ab41f99f0208ebfb179f1a81faff5474faffb4f5a741f9f31b40f93b008052f60314aa68164038L8;FFe80700f9e83341f9f93f00b91f0500b1a00b0054f33b41f9e87b42b9e81700b9b3a800", + "b4f43741f9165f0094e00313aa210080520f5f0094c01001b4e10314aaL16;FF6aecff97e00314aaa54e0094e10313aa66ecff97801a40b980010034610a40f9680240f91f0101ebe0050054680640f9090180522a0400916a0a00f909692138BBBL8;ZBL8;FF2300805224008052cca2ff97f71740f9e80", + "f40f9080117cbbf0208eb49c6ff54e0630091e10317aae20315aa2300805224008052c1a2ff97f71740f92afeff17BL8;FFf30301aaf50300aa2240009120008052e1031faaf40303aa89fb00941f0400f141020054776240a9e00313aa010380520201805210ff0094e00317aae10316aaL8;FF3f0840f2", + "c0000054e30100b481686238e30302aae1682238f8ffff1762084092e10303aa03000014806861f8e06821f83f0002eb212000d181ffff5463084092BBL8;FF020001ad6a2600a922150054e00319aae1031caaa4000014aa135438e8031faa691b009103000014e8031faa692300914a1d409208010aaa6", + "9a200a908008092L8;FFe8ff41f9aa0318f8f5230ba9e80342f9757e42f9fb6300f9fb0b42f9e86b00f9080340f9e95700f9680000b4e00315aa00013fd6010740f9810000b4020b40f9L16;FFe10315aa22008052f60309aa1abf0094e90316aaf57740f9947c00b4e00309aae10314aa2200805213bf00", + "94590080527e080014f7031baaf68e40f8f81e40f9BBBBL8;FB543c9f1d48f267050a21aeb7487cc268260bca0124606c0f99c38f27e296114a37cd30e4feb38cbc834db69dd4bb12bdafed4fb2a28c977aa8ea00004997ac90L8;FF410080521b8f0094e06300f9c08000b41c8f00944000805241008052", + "158f0094e05f00f9008000b4168f009440008052410080520f8f0094607f00b4f50300aaBL8;FFe05706f9e80b41b204000014c80080d20800f0f2080500d1e0833291e85306f94e150094f50300aa3d010014f9a345f9f5a745f9e0c32791f3ab45f901630091L8;FFe9031faa0a018052ff0308eb28008", + "052a1030054b47c039b0b00f0d2f50304aa6b0104cb9f020bebe8020054010100b4a17c019be00302aae20315aae30314aaBBL8;FF71000014e87f41b9e90300b26343c13c6443c33c6543c23ce0630491e86300b96043c43cf7030091e8b300b9a8a64439f663049169c301f8090480526143c53cL8;FF0", + "9290054088c48f81f0500b1802000544a030094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb481f005439010014L16;FFe8c700f9e83f42f9e9a310a9e84342f9e94f42f9e8b700f988a207910001c03de85342f9e93f13a9ef030aaaea030baaeb6f42f9e8a", + "700f9880a41f9e96b42f9BBBL8;FFa20180524401805209000014e00700f9a1ffffb021b40291a3ffffb063100391e0230091a201805224028052da740094e90740f928ffff17e0230091e8a700a9L8;FFf91300f9f9430691fbe300912083cc3c2183cd3ce81f00f9e81b40f92283c33ce0e3009160838c", + "3c2083ce3cc1e2009161838d3c2183cf3cfc030b9160838e3cBL8;FF217c0353610a00343f040071a00600543f080071600300543f0c0071210700541f0800f1410d0054e1230091e20313aaffdf00a9ff0f00f9e7faff97a00d00b5L8;FF4d0100547fb01f3861c01fb802d05f384210001242800151421", + "c001202d01f38f35341a97fffff1702d05f38421000124114010b221c0012f9ffff1725008052BBL8;FFe2431691400080523d1000941dfbff17e8031faa000119ab224e0054e1431691790c0094f90b40f91f0700b1c00e0054e1d342f9e8cb42f91f0101eb402a0054L8;FFe80356b9e00740918100805", + "200001891ff0316b9e82700b9fc290094e80356b9e00740918100805200001891ff0316b9e82300b9f5290094e80356b9e0074091L16;FFa9831ef8630743ad69048052000902ad030503ad28fefff008612591e82704a9a86300d109018052e82705a928000291e1030191f62306a9b3150094bc937da9B", + "BBBBL8;FBbd0000002e00000042024000000000006a00000000000000190100002e00000042024000000000006a00000000000000ca0000002e0000004202400000000000L8;FF0811c0da081540d2080d088b0825019108fd46d308050091090840f9090300b40a0440f9ec031faaeb0309aa4a4100914d", + "8541f8ae0140b2ad010c8bce11c0daBL8;FF130500917f0209eb890f0054088c5df81f0500b1c00c00547e020094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebL8;FFe06b01b9a04700d1b6c4ff97e06701b9a04700d1b3c4ff97e05b01b9a04700d1b0c4ff9", + "7e05301b9a04700d1adc4ff97e04b01b9a04700d1aac4ff97e04301b9BBL8;FF4918c0f2e87f06a9e82709a977530194280080927f220039680200f926000014f6031f2ae003162a2b6c01941f1c007281f8ff54e8020090081140f91f0900f1L8;FFe91f46b900c1c03c01c1c13cf5fb45b9880240f9f36", + "b41f9e97305b9e057813de15b813d680000b4e00313aa00013fd6810640f9810000b4820a40f9e00313aaL16;FFdf2900f14d018052eb031faaf5031faacd318d9a2e0900d12f008052df010cebc057005410696a38ff010deb4a050091111a4092101e00133122cb9a350215aaBBBL8;FFe00740f94ffef", + "f17880080d20800f0f20811009148feff17e00b40f9ccffff17b7835df8daffff17e00700f9a1ffffd021003991a3fffff063080291e0230091L8;FF490a8052f4074091948209910969213828040091f67749f9e8d302f9df0600b1a0320054802202910a2a0094080040b20811c0da081540d2080d088b", + "08250191BL8;FF950100b49622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f92200805213f70094f8ffff17680e40f9280100b40805088be00314aaL8;FF200800f9051000f9c61440f9271400f942000d91c100038ba00400d1e10301cb634000d12100008a6000008a21000", + "68b00400091410c00f9401400f9bf1c00f1BBL8;FFe01bc43de11fc43de0431691e8036179e1833791023f8052e057813de15b813de8e30a791b370194380080527400805215008092e8d342f9e067c13de9430691L8;FFa201805263fdffb063f4189144018052e84b05f911000014c80080d2e0632a39e", + "0432a910800f0f2ff672a39e84b05f94a3dff97e80300aae84b05f9e0432a91L16;FFe10313adec2b4ba9e86b00f988008052e2a3803d6dfeff1728008052e85f00f9b90000b4e0031caae10319aa2200805211b7009454ff48d3fc7340f9f9031c91BBBBL8;FB725f6b65796d61635f6b6579697650656e", + "64696e674b796265725072654b657963697068657274657874656e6372797074696e76616c69642073656e64657220L8;FFe3230091e00308aa220280524e830094fd7b41a9ff830091c0035fd6fd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b08250191BL8;FF200bc03", + "dfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1c082873ce9a304f9801500542083cb3c2183cc3ce9a70c912283cd3ce8bb01f9e863019120f18f3cL8;FF2183833ce183cd3ce8af01f9e87740f9e0071bade082c83ce182c73ce8c301f9e89f40f92083883ce20245ad2183873ce182cd3cead701f9ea", + "b340f9e2831dadBBL8;FF620a0054017f0353810a00343f0c0071ec0100543f040071a00300543f080071e00500543f0c007141faff54e81b41b948000037f98f00f9c1b20191a20301d1L8;FF0090199108210091e1c30e91e9db01f9eadf01f97343009488fdffb008691a91e9008052e8271ba9fa0741", + "b2e8df40f92083c13ce8c700f9e8a759a98082833cL16;FFe89f00f9e86b42f9e8a701a9e87742f9e96f42f9e8af04a9eb8b42f9e8c742f900930054f13f1ea9ef0308aae8ff40f9e55f00f9e5030faaef030caae89300f9BBBL8;FF692200b8a9035ef8ea9303b8aa1b00b9ea7343f8685200b8e80b40f9", + "691201f8e9634039eba300396a9200f8689201f869860039fd7b47a9f34340f9ff430291L8;FFe10300a9e00301aae10309aa220080520a060094e10340a92aa040a9536928380cfc5cd308050091290040f9280800f94cfeffb40a7c15533f0108eb53611932BL8;FF40010036410d00b5e0031faad0fff", + "f17e003082ae20313aa430c80527cedff9760f9ffb4c0ffff17a80640f91a0101eb020100547d000014e10314aae20313aaL8;ZDBBL8;FF610000b4220080521b270194611240f9810000b4600e40f92200805216270194b40000b4600640f9e10314aa2200805211270194602e40f9a00000b4613240f9L", + "8;FFfd7bbda9f65701a9f44f02a9fd030091f30300aabdffff9774d645a9350200b49682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef8L16;FF0202803d120a062910c2019121fbff54e90800b42cc101d1ed430191ee7300918cfd44d390e300918b7dcb9b0c0e80520f010c", + "9bac0301d111010b8b22060091BBBBBBBBL8;FB2d623538643766353665333634356363642f303639353962342f7372632f7574696c2e7273002745787065637465642061206e756d626572206265747765656eL8;FFe8a30791e0630191141a0094f4f740f99f0600b120010054faff40f9560301f18321", + "0054e5020054f9031faae00319aae10316aa4ca00094e8830f91e1630191BL8;FFd6070094770a40f9680240f9080117cbbf0208eb09fcff54e00313aae10317aae20315aacd070094770a40f9daffff17f44f44a9f90b40f9f65743a9f85f42a9L8;FF1f0048f1680a00f9a3fdff540b7c0e533f0108eb7", + "361193220010054536928380cfc5cd308050091290040f9280800f94c0200b500fc55d336000014e10300a9BBL8;FF7f4600b9e00742ad7f0200b9e30b43ade00705ade30b04ad6042803c6142813c6342823c6242833cb40000b4e00315aae10314aa220080520f640194ff030891L8;FF2911c0da29154", + "0d2290d098b29250191891a498b29050091200108ab02080054e10313aab0fcff97560300b4610a40f9680240f9b70640f91f0101eb00080054BL8;FFa1feff9021b40f91a3feff9063f00f91e0030091e20180528401805209000014e00300f9a1feff9021b40f91a3feff9063b00e91e0030091e201805", + "244008052L8;ZDBBBL8;FBfd0100001a000000436861696e73656e6465725f726174636865745f6b657973656e6465725f726174636865745f6b65795f70726976617465636861696e5f6bL8;FFe163009155a4ff97954e40f9550300b4e11740f9e80f40f9964a40f91f0101ebe0860054e81340f949038", + "0522a040091e00315aaea1700f909692138e1630091BL8;FF600640ada800805208000039210480520010803c0110813cf30b40f9fd7bc2a8c0035fd620008052210480524e000194ff4301d1fd7b03a9f32300f9fdc30091L8;FFc000f8b6340d0094080040b91f110071e0feff54050000141f0016eb18", + "00188ba9fdff540200001437008052e003152a03170094e003172aff074091ff430091BBL8;FF750300b4131c40f9f6031faaf70315aae00313aaaf080094080040b20811c0da081540d2080d088b08250191081848abe2020054160116ab02030054f70600f1L8;FFab008052300000144d15c039ae1d00", + "128c1d0e0b8c0102518d00f83761710c8bcb008052280000149f114071630800544d19c039ae1d00128c390e0b8c114051L16;FFe9f301f9ea9f00f90aa54fa9e91700f9098540f9e92b00f9098940f9e92700f9098d40f9e92b01a90a2552a9e94300f9099940f9e92300f9099d40f9e9ab06a9BBBBL8;F", + "B4c00000000000000e200000031000000a1104000000000004d000000000000005f0300001c000000dc1a4000000000005b000000000000008d00000011000000L8;FF80200054a6030094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb481f00543901001400", + "200091db03009424000014BL8;FF84ffff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6L8;FF09a50039e9ab51290aa9003909ad0039e9ab50290ab1003909b50039e9ab4f290ab9003909bd003", + "9e9ab4e290ac1003909c50039e9ab4d290ac9003909cd0039BBL8;FF830c8052a5d6ff97e0f8ffb41e000014a06300916f620094e80300aae00301aaa8fb0736180000148082c23ce8031faae9031faaea031faa200080522b008052L8;FFfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1c082873ce9a", + "304f9801500542083cb3c2183cc3ce9a70c912283cd3ce8bb01f9e863019120f18f3ce9e70c91L16;FFffc300d1fd7b01a9f44f02a9fd430091c80100f0084100913400407908fddf88f30300aa68020035c80100f0e003142ae103142a080140391f050071e1030054BBBL8;FF1f0101ebe033005468064", + "0f9490480522a040091e00315aa6a0a00f909692138e10313aa01faff97770a40f9680240f9080117cbbf0208eb28330054680640f9L8;FFead302f966240094e1431691b60c0094e09b49f9800100b4e1d342f9e8cb42f91f0101eb203f0054e8cf42f9090180522a04009109692138e1431691ead302f9", + "BL8;FFf30301aad8000094e80300aae00301aa08020037980240f9080740f91f0100eb42020054e80f41b2e80700f907000014c90080d248008052e04300390900f0f2L8;FF010800b9f55b42a9d1ffff173f0800f96600001420000090f55b02a9030082d2f76303a900bc43f9221440f91f0003eb18208", + "39a420c00b535cc41f9bf0600b1BBL8;FF2a04009109692138e1431691ead302f97d110094e8d352b91f050071c1000054e1d752b9e2db52b9e3431691c0008052501400949f0e00b140020054e1d342f9L8;FF0ceaff97f55b40f97fc21239681242f9600e42f9080d40f900013fd6607e02f9618202f93", + "ef4ff1760fdff9000e0209162fdff9042402191e102805250300094L16;FF160d00914083823ce00bc13d4183843ca38339ade00fc13df52342f9e10f803da003953c4c000014e083029181220091023c8052f583029116b40094882640f9BBBBBL8;FB340000000000000008010000300000006d6973736", + "96e6720726563656976657220636861696e206b65796c69627369676e616c5f70726f746f636f6c3a3a7374L8;FF1f0500f100360054e083c83ce183c93c08088052e283c43cf3430391f90b00f9e08709ade083c53ce183ca3ce28307ade283c33ce083c73ce157803df53f4439BL8;FF17008012a88300", + "d1e0830091f40301aaff8701a9f5db02a9f73b00b97b180194a2035ef8a20a00b5a08300d1b4573ea9b6031ff8b7831fb8731801941f040031L8;FF08008092e00313aa880200f9fdf4ff97210340f9280041d23f0000f108459f9a1f0500f14c010054480100b4810000b4200740f9220080520f1c00942", + "11340f9BBL8;FFe20315aa235c01942803150be8ff00392000001419020034e8030091e10314aa9a02028b0001198b1a5c0194e83340f9e0020191e10300912200805208050091L8;FFe80b41b204000014c80080d20800f0f2080500d1e0833291e85306f94f62ff97f50300aa3d010014f9a345f9f5a74", + "5f9e0c32791f3ab45f90163009102288052L16;FF6ed80094fd7bbfa9fd030091090040f9280140f93f0100f9e80000b4291040393f050071e0000054000140f9fd7bc1a800001fd680feffd000e0169151d80094BBBL8;FF2b6968384a090b8b40011fd6010440f9410300b4000840f922008052f44f41a", + "9fd7bc2a8147c011413d041a9880240f9680000b4e00313aa00013fd6810640f9L8;FF220080521c7c0094e1e34df9810000b4e00317aa22008052177c0094e1074091e0833791023f805221800991197c0094000740ad08434079e8032179280100b0BL8;FF54f80014ff0301d1fd7b02a9f31b00f9fd83", + "0091f30308aae823009136010094e86340391ffd0371e0000054c8008052680200b9fd7b42a9f31b40f9ff030191L8;FFb40000b4680640f9e20314aa0001158b20fcff97a802148be0031f2a680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd6e00313aaa10f00f9e10315aae20314aaBBL8;FFa9a31838", + "6901084aabd35838a9b318384901084aaae35838a9c318386901084aabf35838a9d318384901084a220080526801084aa9e31838a8f31838e18305adL8;FFf6030aaad6f5ff979f0a00b1c10000547a9a41f97bc641f908ff48d3ea6b40f906000014fa5740f9ea6b40f908ff48d3bade78b34bfd60d317d", + "d78b328008052L16;FF59008052890500145f0700b1c0010054da0000b4e1031aaa22008052f40309aa15bc0094e90314aaf80000b4e00319aae10318aa22008052f40309aa0ebc0094BBBBL8;FBa28cd20aeaedc4ad92840000ba67f34e46444ac5f0cf39795cde26cba649360fb4b9d0c335297ca5adaa", + "acd19f14ab28b8e6eae448b290f7752b1fbaf412c6b8L8;FF08fddf8888020035480100b0e103152a08014039c07a73781f05007121040054e2031f2a62f2ff9708fc78d30afeff904a01329109fc60d3487968782821084aBL8;FF4de6ff97c80080d20800f0f21c450091a7000014e85746f9e95b46f9c", + "0feffd000c01091e1032d91e85b04f9e8c32291e95f04f989ffff9029611091e8a305f9L8;FF48060054d40000b46002158be10308aae20314aa1f0c0094e10318aab402148bff0a00f1e80316aaf40f00f9a0010054e90740f9215442a9290114cbbf0209ebBBL8;FFf7031faae9031faa0800f0f208017", + "fb2ea1e409229010aaa68a600a9e10740f928008052680200b9811a00b4e00314aa22008052ff074091ff030c91f44f44a9L8;FF080140b20811c0da081540d2080d088b0825019108fd46d308050091091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140b26b11c0da6b1540d2L16;FFfc", + "eb43f9f71744f9f92344f9f84744f9e8e700f9e8b743f9fb6b44f9f67344f9e0f3803de82b17a9e8bb43f9eac343f9e9231fa9e8c743f9e9bf43f9e8cf00f9BBBL8;FF530500b4e8031faa49018052e96a283808050091e1230091e00313aae80f00f902f2ff97f90f40f9f80740f9080319cb7f0208eb88", + "0f0054f70b40f9e10314aaL8;FF1d6c0094b40000b4600640f9e10314aa22008052186c0094610e40f9810000b4601240f922008052136c0094611a40f9c10000b4601e40f922008052f44f41a9BL8;FFdbf3ff97a0077cad880080d20800f0f2080900d18082873ca2037dad8182883c80828a3ca1037aa", + "d8282893c8182833ca10f7bad8082843ca003d13c8182853cL8;FFfd030091291c0091e803002ae00302aa29f17d92ea0302aa290101cb5f0009ebc30000544a00094b4a0d409240000aeb23070054ea0309aa4c00018beb031faaBBL8;FFa92b34a9e02f803d76280194e83b40f929ffffb029891491e00", + "3c63c682602a9e8008052e90741b2681a00f9080080926006803d682600a93c000014880200b0L8;FFc10100b4e00302aa22008052e30313aa1a2c0094000300b50e00001428008052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6d30100b4112c0094L16;FFe80340f960828c3ce033c13d", + "ff2701f9ff2301f968fe03a948008052682600f9683200f9683e00f9684a00f9685600f9686200f9686e00f9603a803de093c03dBBBBBBL8;FB2f7372632f73796e632f6f6e63652e7273001b626164204b454d2063697068657274657874206c656e677468203cc0153e20666f72206b657920776974682", + "074L8;FF930300b4f7031faa3c008052e80316aa080000146907c05a09693778f70a0091ff0213ebfcef00f99c07009122020054810a40f9ff0201ebc2290054e0060091BL8;FF42018052e40080522c000014a0031df801ffffd021a4139103ffffb063500291a0c300d1420180528400805223000014a0", + "031df801ffffd021a4139103ffffd0L8;FFfa6742a9fc6f41a9fd7bc6a8c0035fd6fc0305911b008092b70000b4e00318aae10317aa2200805213200094e1af40f9f70340f921fcffb5e3ffff173b008092BBL8;FFfd7bc6a8c0035fd6e0c342f9b9ffff17e8231091f50742f9f40b42f9f70f42f9f81342", + "f9e023009101810091022a805218600194bf0600b161f2ff54e2ffff17L8;FF1d600094f44f57a9fcab40f9f65756a9fd7b54a9ff030691c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff033ad1a9fdffd0L16;FFe10340f96affff17fd7bbda9f50b00f9f44f02a9fd0", + "3009148008052f503012ae10303aa000d002af30303aaf403022a5eedff9795040034a80200320811c0daBBBL8;FB656d6368722e7273002f72757374632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c696272617279L8;FF23008052240080", + "52cca3ff97e11740f9e2fbff17e0630091220080522300805224008052c5a3ff97e11740f91dfeff17e0630091220080522300805224008052BL8;FF0831899a29008052280908aa932201a9f44f42a9f65741a9fd7bc3a8c0035fd620008052e10313aa4ffc0094fd7bbda9f65701a9f44f02a9fd030091", + "f30302aaL8;FFe8000054e00313aa21008052f44f42a9fd7b41a9ffc30091890900143f2000f108018052e02300912180889ae20313aaff0700f93c100094e803002ae0031faaBBL8;FF43ffff9063e03d9118000014a0031cf841ffffb021ec039143ffffb063100391a00301d162028052240280522d00", + "0014a0031cf841ffffb021ec039143ffff90L8;FF189147b8e8fb41f9f7a34f39fcbf4f39f60342f9f5230ba9e8fb43b9fb0742f975ce41f9e86b00f9e8ff43b9e85700f9280340f9680000b4e00315aa00013fd6L16;FF6283c33ce0fb803d6083c13cf60742f9e1031cad6083c23cdf0600b1e00b1dad4", + "0560054e82344b91f810771e0550054f4c341f99f0600b140020054e1cf41f9BBBBL8;FB24d3e459e4590000dd84009d009d00000000000000000000777a16b316b30000000000000000000000000000000000000000000000000000a28cab96ab960000L8;FFfbf8ff97080040b20811c0da081540d2080", + "d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab230100541e000014f4031faae00313aaBL8;FFe8eb45f91f0500b1801c005401430291a22302d173eeff97e0f9ffb453010014e83746f91f0500b1a1000054ff3706f9f63b06f9ff3f06f9ff830cb91f0800f1L8;FF22008052", + "1c100094b90000b4e0031aaae10319aa2200805217100094a0c300d1e103182a94030094b4937da9e0a30091e20340f9e10316aae30314aa45030094BBL8;FFe1031faae20316aa230080522400805289dbff97f94f42f9f84b42f9b3ffff1760ffffb000e8109162ffff9042203a9161028052584c01946", + "0ffffb000e03991L8;FFe00308aba3ffff5480fdffd000403e916e4c009480fdfff000e001916b4c009480fdffd000a02391684c0094fd7bbfa9fd030091083040b9c8030034080140b2L16;FF09e840f9e97f00f909ec40f9e94b00f909f840f9e98300f9a0a600541f050071e1c7005488008052090080", + "92790a00f968220039690200f98dd9ff97310f0014BBBL8;FF217d0353c11800343f040071600100543f080071a1f9ff54f40300aa01a00491e003082ae20303aaf60303aa5af4ff97200100b4d0000014f40300aa01000591L8;FFff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e", + "2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052BL8;FF48008052e0a300390900f0f2e8a70039e91300f9e083009150f6ff97e10300aae00301aaf44f49a9f93340f9f65748a9f85f47a9fd7b45a9ff830291c0035fd6L8;FF006863f8030840f99f0003eb800000", + "54000080d21f000039007d20d405804039a31000123f00036b4cffff54031840b96324c11ae3fe0737031c40b96324c11aBBL8;FF4901805209692138ead302f92d160094e14316917c0d0094e0ab49f9800100b4e1d342f9e8cb42f91f0101ebe0660054e8cf42f9090180522a04009109692138L8;FFfd", + "020014ba031ef8e8074091e0832691e10318aa080118913b2cff97e8034bf9f9074bf9f80b4bf91f0500f181010054281f00121f0500714c05005448090035L16;FF24b00094e1630691e00313aa023f805220b00094ff430e91fc4f41a9fd7bc2a8c0035fd6ff0307d1fd7b19a9fcd300f9f44f1ba9fd43", + "069128f840f9f30301aaBBBBBL8;FB38000000000000005b00000009000000bb124000000000003800000000000000530000000d000000bb1240000000000038000000000000008200000009000000L8;FFfd830091200440a90900009029111991e80700f9e8230091e2fdffd042bc2391e3430091e8270", + "1a954940094fd7b42a9ffc30091c0035fd608fefff008113c91BL8;FFe8031faa73010014e80300aa098d40f83f0500b140250054f30300aae00308aa69040094e80300aae00313aa090140b22911c0da291540d2290d098b29250191L8;FFe0074091eb7742f9ecc3533900401d910d1340f868230039e8", + "7342f9f62b00f9f9d300f9e98303b9ea0b0779eb9301f9eca30c39edab0bf96ad30078699300b8BBL8;FFff3f0339e9235f29a0033dad088109aa29008092a0033eada003da3ca103db3ca203dc3ca303dd3c080dc0dae333803de22f803de12b803de027803d692200a9L8;FFe17740f9e20313aa230080", + "52081940f900013fd6e06b01f9e8c31791e16f01f9290c40f9e1830b9120013fd6fcfb42f99f0f00b1c106005488008052f46f41f9L16;FFe00313aa1fd30094680640f998fe63d319693538d5120091750a00f9d80000b5f403172a680240f9bf0208eb8102005411000014680240f9f9621932bf0208eb", + "BBBL8;FF65fcff97a02d00b5f7031faad1ffff173f040071a00200543f08007121030054e1230091e20313aa5bfcff97002900b5f7031faac7ffff1721630091e20313aaL8;FF00210291ed0b0094f4b749f99f0600b100b8ff54f5bf49f9f3bb49f9b51300b47622009104000014b50600f1d6620091001", + "30054c1825ff881ffffb4c00240f9BL8;FFf30300aae00308aa48030094e00313aa144440f99f0600b180fbff54135449a9550800b47622009104000014b50600f1d6620091a0070054c1825ff881ffffb4L8;FF21b040f9540000f9e20301aa340000f907000014f4af40f9d4feffb5f4fcffd094421191", + "f3ffff170004009101f05f38a10000343fbc007181ffff54400000f9BBL8;FFe0f3c63d0178805222008052f5170af9e8130af908048152e91b0af9e9eb4df9e81f0af9e8270af908788052e82b0af9e8330af988230f91f8230af9fb2f0af9L8;FFe80b41b2c7000014c80080d2e14f05f90800f0f20809", + "00d1d0000014c80080d20800f0f2080500d1be000014e04f05f9e80b41b2c9000014c80080d20800f0f2L16;FFf60314aa3a008052892000b4f40309aa1cb80094e00314aa2100805215b80094605800b4e10318aae20314aae05f00f918b80094fb00001428008052e86300f9BBBBL8;FBf06c450000000", + "000a8754000000000000000000000000000737071723a3a76313a3a6368756e6b65643a3a73746174657373686f756c642062652061626c6520L8;FF012080525884009402feff9042a00d915e84009440008052e10318aa5284009440008052e1031faae2031baae30315aae4031faaf0e6ff97e3fdfff0", + "63002491BL8;FFf8ffff17e88b40f9c80000b40805088be00314aa0201805201f17dd316080194400745ad160080924233c03de85345f9800705ad400743ad8233803de8bb02f9L8;FF6bc100517f250071c8090054292d0c1b5f0d00f1200900540b0d4039f0030faaee0301aaed0316aa6bc100517f250", + "071e8580054292d0c1b5f1100f1f6030daaBBL8;FFa263009164ccff97c0faffb48e000014a2630091830c8052a0caff9720faffb44e000014a06300916a560094f40301aa00fd07364a000014f9031faaf6031faaL8;FF2083c13c2183c23c2283c33c2383c43cfa9741b9e00600adea1700f9000504ad0", + "20d05ade90b00f9bc0000b4e0031baae1031caa220080520f480094fbe30091L16;FFea1744f9e92313a9e81f44f9e92344f9e8ab01a9ea2744f9e82b44f9e8ab04a9e82f44f9ea3344f9e80b00f9e83744f9e84300f9e83f44f9e8ab06a9e84344f9BBBL8;FFf44f4fa9f6574ea9f85f4da9fa674ca9fc6", + "f4ba9fd7b4aa9ff030491c0035fd6ff0302d1fd7b02a9fc6f03a9fa6704a9f85f05a9f65706a9f44f07a9fd830091L8;FF080117cb9f0208eba9faff54e00313aae10317aae20314aa08070094770a40f9cfffff17a8831ff8a84300d1290000f02971149180fdffd000440691e8a700a9BL8;FF63900291", + "e0030091c2008052840080521a000014e00300f9a1feffb0210c1691a3feffb063101591e0030091c20080524400805211000014c80080d2e0230039L8;ZDBBL8;FFe1031aaa220080521b280194fc2740f99f1b00f103050054f8430691fb0c8092e02340f9080d8052826f089b0080c23c1a0040f901a0", + "0191e00a803d0080c33cL8;FFe10301ad5c24009400e4006f9ffe0139e0030091882648a98a2e49a98c364aa9e00300ad8e3e4ba9e00301ad080dc0da290dc0dae08302ade01f803de013803dL16;FFe0030caae1031aaa220080521aa80094ab835ff8e0c20191f3031f2afb031faaf91b40f9260000141", + "40100b4e00313aae10314aa22008052f3030caa0ea80094BBBBBBBL8;FB6e6f742067657420726563656976657220636861696e20696e666f2028c001290006207769746820c00022536b697070696e6720636f72727570742070726576L8;FF36feff90d6e20c9105000014720800949c0700f11400144a", + "a00400546026407861274078e8fedf8828020035280340391f050071c1feff54e2031f2a5c080094BL8;FFe10340a9eb0314aa2aa040a9290040f90dfc6ad35369283808050091280800f90dfeffb43f0108eb7361193220010054536928380cfc71d308050091290040f9L8;FFfbf341f82841082ae9f34", + "2f8f77342f8eb2300395a8108aae90300f9560100b50d000014e00fc03ddafe48d3f903162ae003803d09000014f9031f2a38008092BBL8;FFba035df812ffff17a0c300d1e1031aaa22008052230080522400805286edff97b7035ef813ffff17a0c300d12200805223008052240080527fedff97a1035e", + "f8L8;FF6a0a00f909692138e10313aab6faff97760a40f9680240f9080116cbbf0208eb48060054680640f9e10314aae20315aa0001168b17620094c802158b680a00f9BL8;FF200400b46d0000143f040071000300543f080071e1030054888244f81f0500b1810000549fde04a99ffe05a997fe06a9812", + "20191e20313aa66f1ff97400200b4L8;ZDBBBL8;FB11000000000000004501000005000000650d40000000000011000000000000004a01000005000000650d40000000000011000000000000006001000005000000L8;FF000116abc2660054e1630091678fff977f0600b18000005480220291e1630091e", + "ba4ff97bf0600b180adff5481220491e263009140008052e9a2ff9767fdff17BL8;FF8876403969764039aa02000ad6020a0a1f01096be0179f1a2f170194887a4039697a4039f503002a1f01096be0179f1a29170194887e4039697e4039b302000aL8;ZFBBL8;FF0960009142ffffb042c02891e82700a", + "9e80300910900009029713e91200440a9e82701a9e82300910900009029713991e82702a9e3430091503e0194fd7b43a9L8;FFc80080d2a0831d38a0c300d10800f0f2bf931d38a8031df85048ff97e80300aa81fdff902184199183fdff9063a01891a0c300d142018052a4008052a8031df8L16;FFe887", + "40f9f18700f9eadf49a9eb231ba9e82f46a9f0570ea9f50316aaead700f9e4ab40a9e0030baaeb0303aaf00308aae8030eaaee031caaf9030baaed0304aaBBBBL8;FB56000000000000005700000009000000b51d4000000000005600000000000000600000001f000000801740000000000056000000000", + "000005600000009000000L8;FF0800098b080500911f0109eb69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff5400fefff000c00591658e009400feff9000a00d91BL8;FFe82b41f9e80700f9e83341f9f93f00b91f0500b1a00b0054f33b41f9e87b42b9e81700b9b3a800b4", + "f43741f915120194e00313aa210080520e120194c01001b4L8;FFe19340f9220080521b120094e8a340f9a80000b4e0bf40f9e1a340f92200805215120094e8af40f9a80000b4e09f40f9e1af40f9220080520f120094b50000b4BBL8;FFa0833bada003d53ca103d63ca203d73ca303d83ce323803de21f", + "803de11b803de017803d785200b9e20f41ade413c03de10340ada403993ca28f3bada1833aadL8;FF19008092542340f9b4031df8f40e00b4080d80525a1f40f9fc0300f9fb0f00b9f96301a9f75b02a9f54f03a9937e089b14520094e00313aa010180520d520094L16;FFf30301aae10308aa220080521", + "ad20094e10313aa28ec40f9e80000b420f040f9f30301aae10308aa2200805212d20094e10313aa28f840f9e80000b420fc40f9BBBL8;FF240080528cfdff97610a40f946ffff17e00313aae10316aae20315aa230080522400805284fdff97760a40f9680240f9080116cbbf0208eb09e9ff54e00313aaL", + "8;FF9c830191dffdff17f80300aae04316912200805209110094e1d342f9e00318aa02feff17e04316912200805203110094e1d342f913feff17e0431691e1031aaaBL8;FFe10300a9e00301aae10309aa220080522300805224008052f4030baac7150094e10340a9eb0314aa2aa040a9290040f90cfc6a", + "d35369283808050091280800f9L8;FF004000915a03038a5a03008b60028092000019cb0000038a395300911900198b004300913f0300eb230100543f0b04eba3f1ff54807a1f53007c40935f0000ebBBL8;FFe8cb42f91f0101eb008f0054e8cf42f9090180522a04009109692138e1431691ead302f978", + "0f0094e88349f91f0500b1c0000054e8074091e143169108810991L8;FF0000189109a941a90081c23ce087853de9030bf9ea070bf9f12dff97e88340f9f40300aaf50301aae00316aae10314aae20315aa039140a9c42cff9720070036L16;FFf44f0ca9fd430291283c40f9f30301aae20700f95f0008e", + "b410a0054f70303aa788c40a9748643a9f60302aaf50300aae20318aae00314aa5bae0094e81f8052BBBBBL8;FB02000000260000004b7962657220707265206b6579206d7573742062652070726573656e7420666f7220746869732073657373696f6e2076657273696f6e426fL8;FF4d960094e103152a", + "e003132ae203142a680100b0080140391f050071a0faff54f303002af403022a6b000094f503002ae003132ae103142a67000094e103002aBL8;FF8300005426000014e80308ab82040054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab2203005409", + "1440f9L8;FFeadb19a9f60313aaf30314aaf40315aaf50309aae8df1aa9f7031caafc030daaf8030eaafa0310aa131a0094ed031caafc0317aae90315aaf50314aaf40313aaBBL8;FFe00702ad0080c13c0180c23c16a840b9e83300f9e00700ad0080c33ce00b01ad185a01940004805221008052115a01", + "94801200b4600644adf50300aa811a40f9L8;FFe80000b0081140f9880500b4e0db42f9e44b40f9e8c3179143030291b408ff97e8c31791fcfb42f90081c03ce80743f99f0b00b1e07f823de80305f941320054L16;FFc1720091a2c303d1e2e8ff97802100b5e1031faa812200b5e8af40f91f0114eb290", + "a0054a0c303d1cfe6ff97c021003728fc60d3080e00b5200840921f1800f1BBBL8;FFe00302aa73880094e80300aae00301aae10314aae8f80737d3ffff17e0030091e82b00a95f780094ffc300d1fd7b01a9f44f02a9fd430091280840f9290040f9L8;FF020d0154f47349f99f0e00b161000054e8031f", + "aa0d00001400030291ac2a0094080040b20811c0da081540d2080d088b0825019109fd46d30800098b08050091BL8;FFe10318aae20316aae30317aae40315aaebffff17fd7bbfa9fd030091010040f92f0000941f0400b161000054fd7bc1a8c0035fd64cf60094fd7bbea9f44f01a9L8;FFf31f40f9080", + "28052e1031f2ae82300f9e00313aa7f3e0039530300941f04003120030054f503002af7031faaf6031faa34008052bfd33da9e20216cbb6831ef8BBL8;FF682601298809c05aa909c05a68260229c809c05ae909c05a68260329f44f48a9f92b40f9f65747a9f85f46a9fd7b44a9ff430291c0035fd6fd7b", + "baa9fc6f01a9L8;FFfa031faa086d099bf5c3249138008052e86b00f911000014e8eb41f9090680528003c03dc822099bc90600910001803d8007c03de9ef01f90005803d800bc03dL16;FFe18b14ade11bc23de31fc23dea7202f8e203c23de8ff43f9e9030caaebbb01f9eba35f39e48715ade107c23df", + "4bb43f9edbf43f9f9c343f9fec743f9eecf43f9BBBBL8;FBaea4a5b4b884b39482e489f494c49fd4f624fd34e004eb14da64d174cc44c75415b41ea40394088439f432e42fd424c44d3446245b14500461746a6477547c44L8;FFa80640f9d60600914a070091ff0216eb940a00916907c05a09793a78aa0", + "a00f980fcff54c80e40929b0240791565b89bba0a40f9a80240f95f0308eb21feff54BL8;FFe8c31791e91f46b900c1c03c01c1c13cf5fb45b9880240f9f36b41f9e97305b9e057813de15b813d680000b4e00313aa00013fd6810640f9810000b4820a40f9L8;FFb80640f91f0101eba00d0054e80b40f9", + "490280522a040091e00317aaea0f00f909692138e1230091bae5ff97f90f40f9e80740f9080119cbff0208ebe80c0054BBL8;FFe93f40f9e08745ad7b6a05a9684a01b96a2600a9e9a346a960828b3c61828c3ce08746ad6a2201a9692202a9e9a345a960828d3c61828e3ce08744ad682603a9L8;FF80fd", + "ffd000802c9183fdffd06320259184fdffd084602d91a27f0091e10680525946009420008052c10080524e460094ff0302d1fd7b07a9fdc301916a2440a9L16;FFfaa742f9e4af42f9e8e700f9e8ff41f9f7bb42f9f1bf42f9f4c342f9e3c742f9e82b17a9e80342f9ea0b42f9edcb42f9e9231fa9e80f42", + "f9e90742f9e8cf00f9BBBL8;FFfa0316aabc2200b99f03096be00705ada00600ada3f3ff540600001420c3009163080094381f40f93af7ffb5bdffff1748008052a00302d1e3830291e10315aaL8;FF220080521c6a009460c20191f30b40f9fd7bc2a8aefeff17602200917800009460220291f30b40f9f", + "d7bc2a8a8feff17610640f9810000b4600a40f922008052BL8;FFa3ffff17880080d20800f0f2081100919fffff17e00300f9a1feffd0214c1491a3feffd063f00f91e0030091420180528401805212000014e00300f9a1feffd0L8;ZFBBL8;FF8101c03de88f01b9e94303b98041883c8021c03de95343b", + "9811d803d8182823c8082833ce98b01b98082c23c8112c03de8bf40f97a0200f98002803df45744a9L8;FFe1f3843cf9030691e9030139e87f0139e00303ade00304adafd7ff97e8830291e00301913f260094980000b0e8030391e0830291011740f972260094e8830591L16;FF00c0299171a60094ff03", + "01d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae023009104018052050e805229f87fd33f1100f13481889ae30314aaBBBBBBL8;FB737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f76312f6368756", + "e6b6564L8;FFe81b40f9800600ad820a803d881a00f951a5ff97f44f4da9f6574ca9f85f4ba9fa674aa9fc6f49a9fd7b48a9ff830391c0035fd620008052e10315aa4a9a0094BL8;FF1f0101eba0090054680640f9090180522a040091e00317aa6a0a00f909692138e10313aa78fbff97560300b4610a40", + "f9680240f9b70640f91f0101eb80080054L8;FFe11f803d0200001417008092e20344adff0600b1e11fc03de28302ade113803da2033cada103973c20010054a2037cade00316aaa103d73cf60309aae20301adBBL8;FF340108ab42130054b400f8b6f5031faae00315aae10314aa535a0194140400b418", + "5e0194e00314aa2100805235008052105e0194e0feffb4ff0600b1f40317a9L8;FFc80080d2a1fdffd021d81f910800f0f2e0031791e3833291e4c31791e2008052e9fb05b9e8fb02f990fdff97f3f742f9e8ef42f97f0208eb61000054e0631791L16;FFc802148b680a00f9f44f43a9f65742a9f85f41a", + "9fd7bc4a8c0035fd6e8031faab60a40f976f4ffb5b41640f9e803088b54f5ffb5e00308ab23f6ff54a0feffd0BBBL8;ZBL8;FFf75b09f9e1abc43df95f09f9f97b49f9e00b843de0afc43de3f3863de8e34df9e10f843d0183c13ce013843d0083c03cf8031baa08011bcbf66309f93f0308ebBL8;FFa142", + "0091200080528ffa00946002f8b7c8fefff008410491d45601a9c84e00a9f44f42a9f65741a9fd7bc3a8c0035fd6e10300aaa3fa7f92e00316aae20315aaL8;ZFBBL8;FF090180d2e8031faa0900f0f229017fb24a1d409208010aaa69a200a92800805268020039fd7b45a9f33340f9ffc30191c0035fd6", + "2fecff17fd7bbba9fc0b00f9L8;FFe8834f391f05007161330054f4f741f9f7fb41f9f5ff41f9f80342f9e80742f9fb0b42f9e85700f9b60000b4e0031aaae10316aa220080520f3e0094e15f40f9L16;FFeb4744f9f64b44f9f84f44f9e20713ad2181c53c699346f89b8208aaf40319aae8cb43f9e9bb0", + "1f9e93f44f9fa5f44f9e8f200f8e85b44f9ec6344f9e9a301f9BBBBL8;FBd73b3e26877c8b338d2ac24b89660aed28599ff515af1e689b6521ed2c81d73c087a35f466406696050db7b8a1869574a28c1a3c1a67000021113f11fdf9cd2cL8;FFe00313aa410080521a8e0094202000b5230300143f8b00f", + "1201500543f9300f161060054f70314aa168e0094006c8052010180520f8e0094006500b4f30300aaBL8;FFc80080d2e0a33239e08332910800f0f2ffa73239e85306f950140094e80300aae85306f9e0833291e1feffd021e01291a2018052e3feffd0633c139124028052L8;FFf65741a9fd7bc3a8c003", + "5fd6280480d20800f0f2685200a9f44f42a9f65741a9fd7bc3a8c0035fd63500805275d200a928008092680200f9f44f42a9f65741a9BBL8;FF4a1900120ae10a8b4afd09aa5f0108eba3040054e00740f9480180520aa000a91f0000f9fd7b44a9ff430191c0035fd6e80741b2e0430091e80b00f947540", + "094L8;FF80fdfff000a00a91704a0094f3031faa088c48f81f0500b1c1dfff54e8031faa080113aba306005480fdffd000403a91664a0094f3031faa080c47f81f0500b1L16;FFf10304aaeb08001408234039f87700f91f190071a1200054c80100d0e00309aa081140f9e9cf40f9edeb40f91f0900f1a9", + "060054880100f008411f91e97740f9BBBL8;FFe8031faa0900f0f229017fb24a1d409208010aaa692200a9fd7b44a9f32b40f9ff830191c0035fd6ff0306d1fd7b12a9fc6f13a9fa6714a9f85f15a9f65716a9L8;FFe1830d91e8bb01f9a8e378a9fa9701b92183813c2083823ce10245ade81700f9e80b4", + "0f9e9a319a9a80302d12183833c2083843cc01bff97e11b40f9e21340f9BL8;FF800f0054880080d20800f0f2081500913f0108ebe10e005481220091e20313aa89090094f50300aa390200143f0900b120130054880080d20800f0f2080900d1L8;FF3a001a8b20010054e003154bb80a1b53bf1200715f", + "cb20388d000054181480525fb31f3855c31fb880d25f38001000121803000b98d21f38f76343a9f96b44a9BBL8;FFe1d342f94ef9ff17e0431691e1031caae2031aaad1110094fcd342f9e8cb42f908011ccb5f0308eb492aff54e0431691e1031caae2031aaac8110094fcd342f9L8;FFe0fbc33de1ffc3", + "3de0833f91e07b823de17f823d75430094e8074091e13b40f9e0c3229108011891e2820091aec9fe97e80356b91f05007141020054fa074bf9L16;FFe0230b91e22fc13df56b42f9f77742f9e86342f9e26f42f9e47b42f9e10315aae30317aa808610ad828e803df46742f9f67342f9e84702f908140094", + "b60000b4BBBBBL8;FBec0000002e00000042024000000000006a00000000000000890000002e00000042024000000000006a00000000000000f30000002e0000004202400000000000L8;FFab735638a9531638a98356384a01084a6b01084aaa631638aa9356382901084aab731638aba35638a9831638a", + "9b356384a01084a6b01084aaa931638aac35638BL8;FF0060309171120194fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e0030054e00313aa40000094080040b20811c0da081540d2080d088b08250191L8;FFe9ab51290ab5003909b90039e9ab50290abd003909c10039e9ab4f290ac500", + "3909c90039e9ab4e290acd003909d10039e9ab4d290ad5003909d90039e9ab4c29BBL8;FFaa031cf809dcff97b9035cf8a8035bf8080119cb7f0308eba82100541b0100b4a8835bf8e10f40f9e2031baa0001198b1856019439031b8bb9031cf8f66740f9L8;FFe1e31b9120f18f3c8942039102278052f8", + "6f11a9f55f12a9e92b00f9e8a300f91c560094ff0600b19542039141020054e8031691e00316aa9b510094c8624039L16;FF08810291e9af05f98900805260feffb0000c1a91e8cb03f9e1432d91e8d303f988feffb008c11a91e3431e9162008052e9cf03f9e9d703f9e8db03f95edcff97BBBL8;FF1f01", + "01eb602d0054680640f9090180522a040091e00316aa6a0a00f909692138e10313aa01fcff97550300b4610a40f9680240f9962a40f91f0101eb802c0054L8;FFf69349f9e8d302f9df0a00b1610d0054f9031faa75000014e1d342f9e8cb42f91f0101eb806f0054e8cf42f949098052f6074091d682099", + "1f4031baa09692138BL8;FF810000b4601e40f9220080521af60094612640f9810000b4602a40f92200805215f6009460a20191f30b40f9fd7bc2a8e0fcff17fd7bbea9f30b00f9fd030091L8;FF087c4093c2feffb47f0204ebe000005484feffb400290091340000b081020e91207860f825000014001c", + "0051340000b01f7c00710901005480020e9101290091BBL8;FF280040391f050071c1f10054e0074091e14306910274805200800991f8074091188309911b360194e0074091e843169100800991c7800094e08741ade217c03dL8;FF810000b4e05743f9220080521a3600941c3600942002805221008052", + "15360094404700b4880c805269fdffb029c1149108400039c80080d22001c03d0800f0f2L16;FFe90315aae1f341f9a10000b4e00314aa2200805218b60094e90315aadf0600b1f7430d91a0050054e8fb42f91f0500b1a00800546083ca3ce87b00f9e0831d91BBBBL8;FB5400000000000000590000000", + "50000001d1c40000000000054000000000000005f000000050000001d1c40000000000054000000000000006500000005000000L8;FFecfcff35ec031faa8b010b8b2801088b49010b8b0801098b090140b22911c0da291540d2290d098b292501910819498b15050091f60314aad30e43f87f0600b1BL8;", + "FF7f0b00b181040054e91f40f9e14341f9e0031691ffa71139200545ad286140f9e82303f9200705ad200543ad200703ad200944ad200b04ad210141ad210301adL8;FFf6e742a9f71340f9d582009104000014940600f1b5c2009180010054a1025ef8810000b4a0825ef82200805212060094a1825ff8e", + "1feffb4a00240f922008052BBL8;FFe83340b9fa5b00f91f010072e83f40b908119f1a7f0700b160090054e0c30291e83f00b9eac9ff97e81340f9e0230291fbf308a9e84f00f94beaff97e83340f9L8;FF745656a9a80240f9680000b4e00314aa00013fd6a10640f9610300b4a20a40f9e00314aa17000", + "014745656a9a80240f9680000b4e00314aa00013fd6a10640f9L16;FFf44300f9ed6b00f9ed0310aaf00315aa2bf7ff1756450036e86345f9e96b45f9ea7345f9ebbb45f9e00bc33de85300f9e86745f9e027833de8df00f9e86f45f9BBBL8;FFb70000b4e02340f9e10317aa2200805219660194e12b40f", + "9810000b4e02f40f92200805214660194e14340f93f0400f18b000054e04740f9220080520e660194L8;FFdffe02a9f71700f9f72300f9df7e04a9f7ff05a923feff97e0060036212c00b5992240f9881a40f93f0308eb6100005480c200915e04ff97881e40f9e083c33cBL8;FF1f0900f1e10c0054e003", + "13aad6f2ff9780000036010a00b5e0031faae3ffff17a80640f9190101ebe200005480000014e20313aa230c805275ecff97e10300aaL8;ZDBBL8;FF683640f9a80000b4603a40f901f97fd34200805218260194684240f9a80000b4604640f901f97fd34200805212260194684e40f9a80000b4605240f9", + "01f97fd3L8;FFa00000b4614e40f9610000b42200805219260094611240f9810000b4600e40f92200805214260094610240f9810000b4600640f9220080520f260094602e40f9L16;FF1f0d00f12902005428100091c92e40f92b0bc05a4a0108cb5f7d00f12b6921b8c83200f9a8fbff54c0420191e1030", + "8aa020480522300805224008052bfc9ff97" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines7 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines8.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines8.lean index 185b535fa..ba1dfc913 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines8.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines8.lean @@ -27,359 +27,252 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub8 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF1fc2007161010054ff0d4071c0faff5408000014ef1d40928f696f384ffa073704000014ef1d40928f696f38cff90f3769010acb2b010e8b610108cb0000088bL4;FF81fd0daa3f000beb030500544b018052e0031faa4a010b8b29010bcb0a2500a9fd7b43a9ff030191c0035fd6e807", - "41b2e0030091e80300f94d15ff97e10300aaL8;FF3f0108eb23020054090040f9f40300aae103022ae20313aa2001088b33200194e00314aae10315aa010400f9f44f42a9f65741a9fd7bc3a8c0035fd680020090BBL4;FF130900f9191900b9cb02005473eb7bd306000014680700917b0700d1738200d1", - "1f451ff1e9010054946740a981830091e0031caae20313aa30a00194fb0a00f9L4;FF7fffff1702d05f38421000124114010b221c0012f9ffff172500805201801fb805c01f381fe01f78caffff1703d05f38631000126114010b251c0012d4ffff17L8;FF8aa00094fd7b41a9f31340f9ffc30091c0035f", - "d6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa810100d021081d91e80300914201805279a00094BBBL4;FFe86b00b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebc37c00541803008bL4;FB73656c662", - "03d2028c0022c20c00d292c20737562736574203d2028c0022c20c00129001973706c69745f6f6666206f7574206f6620626f756e64733a20c00420L8;FF00a140f9e01f00f900a540f9e01b00f900a940f9e07b00f900ad40f9e06300f900b140f9e0d300f900b540f9e06700f900b940f9e0ef00f900bd", - "40f9e05700f9BL8;FF84200b91a363009102018052a80f00f98560019468420191c10200d021082991e40200d084a00b91a363009122018052a80f00f97c60019468620091c10200d0L8;FFe003142a09692138e10313aa6a0a00f9f44f42a9f50b40f9fd7bc3a8f7fcff17e8031faa94fcff35e003088be", - "10313aaf2fcff9775fdff34610a40f9680240f9BBBBL4;FFf40308aa150840b9f30300aae80e40f9f50f00b9880700b4e00642a9e2330091f663019140fbff9709fc79d3e0e7076fe8031faa0b0c8052210d010eea2640a9L4;FF57000094800100b507000014340100b434000094e00314aae10315aa320", - "00094a00000b528008052750600f904000014e00315aae8031faa600600f90a028052L8;FF00fc55d336000014e10300a9e00301aae10309aa22008052230080522400805213160094e10340a92aa040a9536928380cfc5cd308050091290040f9280800f9BL8;FF010300d021403091a32300d1e2008052", - "e40313aaa8831ff88380019483800194f44f43a9fd7b42a9ff030191c0035fd6000040f902060014000040f9e4140014L8;FF1f0101eb807f0054e81340f9938248f8490a805209692138280400917f0600b1e81700f9c02f00548022029138edff97080040b20811c0da081540d2080d088bBBBL4;FF269", - "a00942800809260220039680200f9f44f47a9fd7b46a9ff030291c0035fd6ff0307d1fd7b16a9fc6f17a9fa6718a9f85f19a9f6571aa9f44f1ba9fd830591L4;FB72656d6f7465206964656e74697479206b65790000000000147d4900000000002d0000000000000008010000050000006c69627369676e", - "616c5f70726f746f63L8;FF0232805243c00094e1430691e00314aa027480523fc00094ffc31491f44f42a9fc0b40f9fd7bc3a8c0035fd6fd7bbda9fc0b00f9f44f02a9fd030091ff0314d1BL8;FFe96300918a0200904ab10d91a80319b8080000d0083107910b0000906bf12891e92306a9a9630091a07", - "f0091e92b07a90900009029912891f42708a9e9030091L8;FFe8a700a9a82300d10201009042201791e1230091e8a701a9444000940001009000c00491394000940001009000601691364000940001009000c0169130400094BBBBBL4;FF890080d2a8831d38480080520900f0f2a8931d38a0c300d12801", - "7fb2a8031df853050194f70300aab6ffff17e80741b28dffff17e80741b29affff17e80f41b2L4;FFfdc1ff97e06300b9a04700d1fac1ff97e05f00b9a04700d1f7c1ff97e04f00b9a04700d1f4c1ff97e04b00b9a04700d1f1c1ff97e04700b9a04700d1eec1ff97L8;FFff8301913b100114e003c03d08", - "008012a80200b9a042803c810240f981feffb5f44f45a9f52340f9fd7b43a9ff830191c0035fd6ff4301d1fd7b03a9f32300f9BL8;FF353b40f9345341b9285741b9e83f00b9b50300b54500001428008052e81300f9288f40f9e80f00f9289740f91f0500b160feff54359f40f9284341b9e82b00b9L8;F", - "F81ffffb4a00240f92200805239900094f8ffff177f820039f44f42a9f50b40f9fd7bc3a8c0035fd6ffc300d1fd7b02a9fd830091e90301aae00300f9810100b0BBBL4;FFe9031faaeb031faa0c0e80520d0440f94a350c9b29350c9b6b350c9b0a2500a90d2d01a9c0035fd60aa040a9090e80520b0040f", - "9ec0d80920929099b0a0c40f9L4;FBf094784a3c259e124f09a28c0000f136a7d456e2000006f0ebafec12f9642770675a24c6a2247dcaca6ebfd56e4223cee145a6ccb69d1352b36191204c693dd7L8;FFe0c7c33de1f7c03de82b01f968018052f57b40f9e8270ea9ed0740f9ee3f40f9e56f40f9e0f38", - "03de193803df1a34ca9f7ef49a9fc0748a9ea6341a9f9fb42a9BL8;FFf30300aad50100b4340840f9370040b9340200b433500194e00314aa2100805231500194800200b4e10315aae20314aaf60300aa37500194080000147f0200f9L8;FF170100b4e91740f9c900003628fd60d3e88305b9e80f40f9e8", - "cb02f9e80317aae0832291e1031691e8c702f9fee3ff97e20f4ba9e0031691e5134ca9e11f40f9BBBBL4;FF0881259169028052a14300d1e203009103048052a8273fa9e00300ad96390094e00740ad600600adfd7b43a9f32340f9ff430191c0035fd6fd7bbda9f65701a9L4;FBc9944800000000004d00", - "000000000000e8010000170000005768697370657247726f7570696e76616c69642073656e6465722072617463686574207072697661L8;FFe00301aae8fd073708fc60d3880f00b5080840921f1900f1c20f0054017c0353e10f00343f040071200200543f08007101040054890248f83f0500b1a100005", - "4BL8;FFfd7b01a9f31300f9fd430091e90301aaf30300aae10200d021c42b91e8030091e00309aa020380527e700194e10200d021242c91040300b084401f91e0030091L8;FFead302f9fd0c0094fad342f9e8cb42f908011acb1f0308eb48430054e8cf42f9e10319aae20318aa00011a8b397000944803", - "188bf90b40f9fa0740915a830991BBBL4;FFf001c0da1012c0dad00d508b10020b8a10fe0d9b9001108b118256b85f01116b60010054f00500d10f020feaa1feff54428c202e42a8302e4f00261e0f040037L4;FFf65742a9fd7b41a9ff030191c0035fd6ffc300d1fd7b01a9f44f02a9fd4300913f4000f", - "1f30300aa280100543f0013ebe8000054e00313aa21008052f44f42a9L8;FF000700ad0001c03d68f640f9e00317aaa8031ff8e8830691020301ad9a270094e8d340f91f0900f160040054e1830691e00315aa0232805236b00094a0820791BL8;FF810000b4e0ff44f92200805239300194343001942002", - "80522100805232300194e04200b4880c8052890200f02901069108400039c80080d22001c03d0800f0f2L8;FFe15740f9e24b40f92001803d481540f900013fd6606601f9616a01f9bcf2ff172013c03de86342b92123c03d205b803de88303b90143813ce00313aa088c4ff8BBBBBBL4;FF680000b4e003", - "13aa00013fd6810640f9c10000b4820a40f9e00313aaf44f41a9fd7bc2a833180214f44f41a9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091L4;FFe00301914201805223008052240080521df9ff97e12b40f9e82340f9e81300f950ffff17e0a30091e10316aae2031caa230080522400805213f9ff9", - "7e85b43a9L8;FF39180194c00200b4e10316aae20313aaf50300aa3f180194020000143500805268fe4ad309088052954e00a90811c0da280108cbe90080521f1d00f10831899aBBL4;FFbfe339a9bf831af8e1420291a2e300d15e81ff97a0edffb4b2000014bf6332a9bf0313f8e1620091a2e300d1578", - "1ff97c0ecffb48d000014bf6338a9bf0319f8L4;ZBL8;FFfd430091e90301aaf30300aa810100f021981a91e8030091e00309aaa20080528098009468a200918101009021881591840100f084a00a91e0030091a3630091BBBL4;FFc8030090080110918902805268a600a909008092690200f9fd7b46a9f", - "33b40f9ff030291c0035fd6a8935db8a9c35db8a1a300d1abab7ea9e00313aae80b00b9L4;FB643766353665333634356363642f303639353962342f7372632f6b64662e7273002f636172676f2d6769742f737061727365706f73747175616e74756d726174L8;FFe3031d91e9a703f9e9af03f9fecb00f", - "9eb1b03a9e8e700f9fab300f9fbab00f9fb0314aaf4030faaec8700f9f6bf00f9f60307aaf54712a9f5030aaae44f00f9BL8;FF9f0a00b1e14a0054e8cb42f91f0101eb00ba0054e8cf42f9290400911f692138e9d302f985ffff17f37749f97f0600b1e0020054e18f49f93f0400b140010054L8;FFa003", - "0036c82e00b5e1031faadbffff17a22302d1630c805255ecff97e10300aac0faffb478010014e8534cb948000037f62b06f9202a00b5a02302d15ef4ff97BBBBL4;FF60a200a9090d40f9e823009120013fd6e80740f91f0900b100fdff5475de40a9f6830191e183c33ce083c43ce82f40f9e283c23cc18", - "201ade083c03ce183c13cL4;FB74206072656d61696e696e67603a20c004203c3d20c0002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336L8;FFe20313aa430c8052cef0ff97e10300aa00feffb5a80640f91f0116eb29070054e00313aa1df7ff974", - "0fd073728fc60d3e80600b5200840921f1800f102070054BL8;FF68ae8c52200540adc88dae72084000b9880880520a008092680201a9000400ad220141ad681200f968008052695b009168a20039880700d11f0900b1020001adL8;FF5401805215008092e057813de15b813de8e30a7985000014e8d342", - "f9e067c13de8a302f9680e00f908008092e04f813d6082803c680200f9ff0600f1cacbff54BBBL4;FF200100546a0240b24a11c0da4a1540d24a0d0a8b4a2501916a1a4a8b4a05009102000014ea031faa6b0340b20801098b6b11c0da1c5100916b1540d288030a8bL4;ZDL8;FFdf16007141020054bf02", - "08eb40020054b600805212000014bf0208eb20010054f6031f2a22000014bf0208eb40010054560080520a000014bf0208eb61030054BL8;FF0825019108fd46d308050091091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a0500", - "91L8;FF682213912001803de90742f90101803de83b41f9696e02f9e9e34939687602f9280080526a7202f969c2133968c21239b60000b4e0031aaae10316aa22008052BBBBBL4;FFe023009142028052440180529afc0094e90740f9e0feff17e00700f92104009021d429912304009063742a91e023009", - "1a2018052240180521b000014e00700f9L4;FFfd7b42a9ffc30191c0035fd6e0230091e10316aae20314aa230080522400805219e9ff97f60f40f9e8ffff17ff4301d1fd7b02a9f51b00f9f44f04a9fd830091L8;FFfd7b42a9ffc30091c0035fd6a9200091410200f021a01c91430200f06360119146020", - "0f0c6201c91a52300d1e00308aaa200805264018052a9831ff882080194BL8;FF291540d2290d098b2925019129fd46d329050091280108ab830000545b000014e80308ab220b0054695641b969010034290140b22911c0da291540d2290d098bL8;FFfa0300aa37880094e00315aa410080523588009440", - "0d00b4fb0300aa31880094e00315aa410080522f880094800c00b4fc0300aa2b880094e00315aa41008052BBBL4;FF8401805226000014e04300f9a103009021242891a303009063582891e0030291e2008052440280521d000014e04300f9a103009021242891a303009063282391L4;FB6f73747175616", - "e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f76312f6368756e6b65642f73656e645f65L8;FFe10318aa220080523ac80094b50000b4e06740f9e10315aa2200805235c800949f0600b1000b0054f50314aaff0600b1c00d0054e8eb40b9e0831d91", - "e1c31591BL8;FFe3070054b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcb9f0208eba8040054340100b4680640f9e10315aae20314aaL8;FF0b010039a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030", - "091150840f9080040f9f40302aaf30300aaBBBBL4;FFf63b00f9820d005433008052a00302d1e3830291e10315aa0204805224008052f3830239394a00942ee8019400048052210080522ce80194a03200b4600740adL4;FB28000000000000000800000000000000bca74000000000003c2040000000000", - "030000000000000000800000000000000e0a84000000000003422400000000000L8;FF20080036283500b5e1031faa96ffff17e1031faae8df01b993ffff17e8af40f91b0101ebe2000054f3010014a2c303d1430c8052c3e0ff97e10300aa401d00b5BL8;FFffc300d1fd7b01a9f31300f9fd430091e903", - "01aaf30300aae102009021e01d91e8030091e00309aa020280527d68019468620091e102009021082991e4020090L8;FFbf0600b1a005005414d840a9f30300aa960100b49722009104000014d60600f1f7620091e0000054e1825ff881ffffb4e00240f9220080522e680094f8ffff17BBBL4;FF2800805", - "2e276c03de36ac03df8030491e0030491a1c302d1e2830191e00608ade0064bade24a803de256c03d030c8052e33e803d19030191e08605ade1024cadL4;FF2100008a6000008a2100068b00400091410c00f9401400f9bf1c00f1c9020054a37c0391824006912100008b2100038b21f07d92419401a93f", - "4005f169020054L8;FFb3c303d1400540ad200500ada8f31438fc03082a82011ccb350302ebe3070054e10740f9f40319aaf90301aabc01003460021c8b3900028b36a80094a80357f8BL8;FF080480520800ac7200040091e1030091e80b00f9e8830091ff1b00f9e82700a95f1a009420010035e00bc03", - "de81b40f96002803d680a00f9fd7b44a9f32b40f9L8;FF810000b4e01742f92200805239280094e8a340f91f0500b180000054e803029100010391aee6ff97f45753a9f50200b49622009109000014e8e7563908d40736BBBBBBBL4;FF0a2100d1eb0328aa29551b9b0cfc79d34a01148a2c6b283828030a", - "8b9c0700d16b651b9b0c210039e80600d11701178a2001c03d6001803d218141ad228d40adL4;FF090000f9086000f8b70000b4e00315aae10317aa22008052361c0094ca018052e9031f2ae80741b2ab0000f06be12891ec018052f50316aaf6030a2a880200f9L8;FF155000a9f70300aa152001a92800", - "8052081000f9e80318aaa90216eb9402168bf533899a145500a9135d01a9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6BBL4;FF7b031e4afe8740b9fba21e38fbd25e3808011e4afe9340b9e8b21e38e8e25e389c031e4afe9740b9fcc21e38fcf25e387b031e4afe9b40b9fbd21e38fb025f38L4;ZF", - "L8;FF6b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054BBBL4;FF54dc019420008052018c815251dc01942000805221c4805243dc0194e00b40910108805200c0199157dc0194a0280035e80", - "b4091e00b409108c11a9100401991L4;FB0a0000000000000055496e74333256616c7565000000000008124900000000000b00000000000000456d70747900000028124900000000000500000000000000L8;FFe1031d91032b0091e20319aaf5430f912e1c0094fbeb41f97f0b00f1e1220154e8ef41f9e", - "aff41f9e9f741f9eb1f42f9f7f341f9f0fb41f9e84700f9e80342f9BL8;FFcacbff54fb010014f7e74df9e80740910103198be00317aa08812f919ad30094e8f34df91f0900f160220154e0074091e10740910232805200c0359121802f91L8;FFe8a745a9200100b000c01e91a18301d1a82739a9a8c301", - "d189fdffd029312291a8273aa9e8c30091615c0094684e41b9290000b029911f91f52705a9e9630091BBBBL4;FF69620039ffc31291f44f46a9f65745a9f85f44a9fa6743a9fc6f42a9fd7b41a9e923c76cc0035fd6a2820091f40300aae00315aa210080522300805202deff97L4;FB652f6d6f642e7273", - "002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e2d6c696e75782d676e752f72656c656173652f6275696c642f6cL8;FFc2020054e80f41b207000014890080d248008052e0e303390900f0f2e8e7033928017fb2e0c30391e87b00f950f1ff97e10300aae00301aaff430b91f44", - "f45a9BL8;FFf44f41a9fd7bc2a8c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091e90301aaf30300aa010300b021a01f91e8030091e00309aa02028052797c0194L8;FF240080521a92ff97e11740f9fffbff17e06300912200805223008052240080521392ff97e11740f911fcff17e0630091", - "2200805223008052240080520c92ff97BBBL4;FF0301028be10308aa7b9200942800809260220039680200f9f30b40f9fd7bc2a8c0035fd6800300d000200d91820300f042e00091010480524fbc01940a2045a9L4;ZBL8;FF63a02391c40100f084403291a22700d1c102805247bc009420008052011080", - "5241bc009420008052010481523ebc0094ff4302d1fd7b06a9f65707a9f44f08a9BL8;FFe80300aa098d40f83f0500b1201a0054f30300aae00308aab3020094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098bL8;FF000540ad082140b9614241f9e89303b9000", - "700ad218101b4604641f922008052343c0094050c0014f7031faa080080921c0180527f220fa9601ec03d684240f9BBBBBL4;FFe00315aa6a0a00f909692138e10313aaa4f7ff97770a40f9680240f9080117cbbf0208eb081f0054680640f9e10316aae20315aa0001178b360c0294e802158bL4;FFff83", - "0191c0035fd6ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191970840f9f30300aaf70300b4940440f9880240391f2100f1L8;FFf1ffff17ff8300d1fd7b01a9fd430091e80301aae00700f9410200f021403d91440200f084c03c91e3230091e00308aae2018052710c019", - "4fd7b41a9ff830091BL8;FFe00740f94801088b882600a908fc60d3080500b5020840925f1800f122050054017c035341050034e0430591a32300d1840c80527a81ff9760fbffb42a000014L8;FFf30300aaf4031faac8038052750100d0b5b2049136008052e84b01f9e04f01f9ff5301f90b0000146802", - "148bc903805294620091090100a9b5f20091090900f9BBBL4;FF28008052e81b00f928008052e84b00b9e00306aaf40306aa9ca30094fc0300aae00316aaf80301aa98a30094e92b40f93b1940f9bb00f8b6fa031faae0031aaaL4;FB2073686f756c642062652065726173656441757468656e746963617", - "46f722070726576696f7573204d4143206b6579206d697373696e67002519490000000000L8;FF3f8120f1e0071dade1040054e8e341f91f010ff181040054e8d741f91f0112f121040054f7e741f9ff0600b1a00b0154f6ef41f9f8eb41f9e8ff41f9e83f00f9BL8;FFf8ffff17d50000b4a806158be003", - "14aa0201805201f17dd3364c0194745642a9950100b49622009104000014b50600f1d6620091e0000054c1825ff881ffffb4L8;FF22010054fd7bc1a8c0035fd6e8031faa091c40f93f0500b121faff54e00308ab23ffff54000100d000601191344c0094e8031faa090840f929f5ffb5091440f9BBBBL4;", - "FF84601d91a20700d1e106805249ec0194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff430ed1e8b79752f603012a08febf722900080bL4;FB7055756964537472696e675575696442797465734b7962657220707265206b6579206d7573742062652070726573656e7420666f7", - "22074686973207365737369L8;FFb41640f92801088b140b00b4890240b22911c0da291540d2290d098b29250191891a498b29050091200108ab220a0054e10313aaaaebff97b7010034610a40f9BL8;FF3f0400b1200a0054e85340f9fc0301aae14740f9fa0300aae80f00f9e85f40f9e85f02a9e92358", - "29e80f00b9e85f5929e8270229e8e30191e2570094e87b40b9L8;FF63200991440100d084601591a27f0091e1068052476c009420008052c1008052416c0094fd7bbca9f70b00f9f65702a9f44f03a9fd030091350440f9f30300aaBBBL4;FF44ac0194e83340f980030191e10300912200805208050091e", - "83300f968ac0194ffff0039f50316aaf40318aaa2fe46d3b6e27a92b5164092e20000b4e83340f9L4;FF4a290baa0bfc4cd34a9d0caa0c4812536b017b924a010baa6b320c534a8d0caa6c5a1653480163b24801889a6a5214533f39406a08ad0baa0b200853082d0aaaL8;FF40008052e10315aa47ac009", - "4a20100f042602f91e00317aa3bac0094a20100f042c02f9138ac0094ff8303d1fd7b08a9fc6f09a9fa670aa9f85f0ba9f6570ca9BL8;FF42008052e9c702f9e9cf02f9e8d302f91cdcff97f58740f9e8031691e00315aa0f2c0194a8624039fbc342f9f5c742f9f7cb42f9e8631639880200d008e11991L", - "8;FFf60314aaf40315aaf50317aaf70302910a0000141f090071e1060054090180d268df78920900f0f23a0140b2370000141a048052ba031ef8e8030291e13f40f9BBBBBBL4;FF280800f90cfeffb40a7c15533f0108eb53611932200100542a0440f90bfc63d35369283808050091280800f98b0200b5e", - "0030caa1b000014e10300a9e00301aaL4;FFe09741f9220080523a140094e0431391e10313aa022880523e140094e8270491e1431391e00314aa00f1cf3ce80f41f9022b8052e087813de81303f935140094L8;FF0c3c403909110039090040390a1500390a1440390b1900390b104039091d0039091c403", - "90a2100390a1840390b2500390b20403909290039092440390a2d0039BBL4;FFe0230091e10315aae20316aa2300805224008052a686ff97f45741a9fa0740f940ffff17e0230091e10315aae20317aa23008052240080529d86ff97f45741a9L4;ZDL8;FF390700f194c2019161feff54080317ab220700", - "54c902158b080109ab62090054691640f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8bBBBL4;FFe01700f90800f0f20d000014e90b41b2e92302a90b000014e90b41b2e92302a91f000014e90b41b2e92302a92b000014880080d20800f0f208050091e81300f9L4;FB686f19e88", - "885911c4791f9366cd97ee0109087fe0ca6a73ac1c3e5e9000091864aa1c58c1c90802c01aa08e64ef1ef85cbd2f19584a62bd9d2aa0000315ed279L8;FFea0307aae70312aa93050014e9b343f9ea4700f91f0500b1eab743f9e04bc23deb6b00f9e9e700f9e9bb43f9f0cb43f9e2d743f9ebeb43f9e51b", - "44f9e92b17a9BL8;FF5a830991e8d302f9f88b49f9b80300b4e1d342f9e8cb42f9f98749f91f0101eb40430054e8cf42f9490480522a040091e00318aa09692138e1431691ead302f9L8;FF1f6d00f108ffff54e9feff100a6b683829090a8b20011fd6c1825ff841feffb4c00240f9eeffff17280400d11", - "f0d00b1a8fdff54c0825ff8e9ffff17d3e640a9BBBBL4;FFb74301d1e2031aaa28000014b4035df8c8ffff17a0831cf8e10300f021442391e30300f063882391a0e300d1220280526401805209000014a0831cf8e10300f0L4;FB6d00000000000000726567697374726174696f6e5f69642069732072657", - "175697265647369676e65645f7072655f6b65795f6964206973207265717569726564L8;FFa40080529ce8ff97e10340f9b5ffff17c80080d20800f0f208090091adffff17ff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091081c0012BL8;FF2402805212000014a0831cf8e10200f0", - "21601f91e30200f063082991a0e300d1020280522401805209000014a0831cf8e10200f021601f91e30200f063401891L8;FF29d93f918a0000102b7968784a090b8b40011fd6e1d342f9e8cb42f91f0101eb20b50054e8cf42f9490180520969213821040091f47749f9e1d302f99f0a00b1BBBL4;FF682", - "200f9f44f5aa9f65759a9fc5f58a9fd7b57a9ffc30691c0035fd6200080520102805240b4019420008052010480523db40194fd7bbaa9fc6f01a9fa6702a9L4;ZBL8;FF69000054e90303aa03000014f7031faa0901098b0a0e8052fb6740a900710a9b210108cbb2b1ff97e0031caae10317aaafb1ff97e", - "90b40f9c90000b428e179d3BL8;FFc81400b5200840921f1800f102150054217c0353c11500343f040071200100543f08007141fdff5401a30491a22302d174ebff97602b00b5e1031faae9ffff17L8;FFa02800b5a02302d117f4ff97e80301aae0010036082900b5e1031faacaffff17602400b5a02302", - "d10ff4ff97e80301aa40010036c82400b5e1031faac2ffff17BBBBBL4;FFffc30191c0035fd6ffc301d1fd7b05a9f33300f9fd430191a8ae8cd2294c8ed2aaed8dd2680eaef2a9ccadf28accadf2a8accdf2a9ecccf22a4ccef2e86deef2L4;FF58000014880240f929cd8d52298dae72080140b91f01096", - "b01480054810a41a9e0e306919b6a42a982f7ff97f9df40f93f0700b120470054f55b5ca9e0e30691L8;FF61fa40f9810000b460fe40f9220080523804019460220091f30b40f9fd7bc2a89afdff17fd7bbea9f30b00f9fd03009101c840f9f30300aa810000b460ce40f9BL8;FF020300d042b43f91ea0f", - "00f9e343009155840194fd7b43a9ff030191c0035fd6202040a9210300b0219c2a91030d40f922038052fd7b43a9ff03019160001fd6L8;FF620100d042c03a91e0230091e10300917484009474840094fd7b42a9ffc30091c0035fd608a440a9e20301aae00308aae10309aa7a840014fd7bbfa9fd03009", - "1BBBL4;FFc1c40094e80300aae00301aa68f8073680f5ffb420000014f5031faaf7031faa1800809214018052e0a30a91e1230091022a805237c401941f0700b1a0000054L4;FB9c544700000000000000000000000000010000000000000001000000000000008065470000000000000000000000000001", - "000000000000000100000000000000L8;FFe417c23de38b14ade213c23de30fc23de9af00b9e95f44f9e84b44f9ead743f9e01bc23de18f16ade97700f9e96744f9e11fc23de29317ade223c23de7cb43f9BL8;FF680240f91f0101eb60020054680640f9090180522a040091e003152a6a0a00f90969213", - "8e10313aae5fcff97f4fbff35f44f42a9f50b40f9fd7bc3a8c0035fd6L8;FFe90702f92a20ff97a0420035fbef41f9e6f341f9e8430691e32b40b9fceb41f9e0e30091c1e20091e2830b91e403182ae5031baaf81f00b9285bfe97f89341b9BBBBL4;FFe85341b9e8f300b957ffdfc8d70200b4ff0600b10", - "0030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eba3fc0054L4;FB73e84800000000003800000000000000fd0100001a00000050726576696f7573436861696e4b6579626173655f6b6579726f6f745f6b65790000000000000000L8;FF102e0094e8cb43f", - "96083c03cf6432d91e9d743f91f0500b1e0df803de9c301f960320054e0efc13de9f343f9e1f3c13de2f7c13de0df823de0dfc03de9d305f9BL8;FF20008052e10319aa47640194fd7bbea9f44f01a9fd030091f303012af40300aa3064019400028052010180522e640194200100b4140000f9e10200d02", - "1003791L8;FF13000014d7fe45d3e80214ab820c0054e90200aba20c0054aa0217cba8831cf8a8c300d1a02301d1a9ab3ba9124cff97a8035ef8b7031ff8140117ebe3070054BBBL4;FFe00301aae10318aae20314aa1a693738e82200d16a0240f92801088a4801088b1a2100393ba40194ebffff176806", - "40f90905009129fd43d32af17dd3490109cbL4;FFc9020054f35341a9fb7345a9e303004b0100230a411800b96000006a00030054e303004b22c59c526000000a62eda072010000f021400491007c021b007c1b53L8;FFf31300f9fd430091e90301aaf30300aa810100f021901791e8030091e00309aae2", - "0180527fa40094810100f021101591a40100d084a00e91e0030091a3630091BL8;FF01f0c03c48150033f30300aae0c3009129111d12e013833ce83f0139e8230091080140b2e9c30039e1f3833c95240194e0c300915b240194e093c13ce193c03cBL4;FFca0a00f9135500a9130900f90081813c091500", - "f9f44f44a9f65743a9f85f42a9fa6741a9fd7bc5a8c0035fd6e00316aa3d190094d80640f9edffff1720008052L3;FB010000000600000000400a000000000000304a000000000000304a00000000008801000000000000c40700000000000000100000000000000700000004000000BBBBBBBBL4;FF2801", - "08cb680a00f957feffb4e8e67ad3081d019108e57a92e902088b212500b180fdff54000308cb02018052311e0294e8ffff17e003032a351e0294f40300aaL4;FFff830391c0035fd6090345f80003c43c680200a9e81f40f9745603a9692a00f9e91340f96012803d695a01a9772202a9f44f4da9f6574ca", - "9f85f4ba9fd7b4aa9L8;FF01018052381e0194600500b4880219cb080115ab82050054f60300aa192000a948008052080800f9e00317aae10316aae20318aa9d1e01941f0017eb61010054BBL4;FFe84b42f9aa0216cbe94742f9f45741a9682a01a928008092682600a9950100b49322009104000014b50", - "600f173620091e000005461825ff881ffffb4600240f9L4;FF200c014e0400028b5f8001f1a80300545f4000f102020054013c084ea2001836010000f981801ff8c0035fd61f2003d582001036010000b981c01fb8c0035fd6L8;FFe40313aab4831ff8879e009488620091810100d0213c1691a32300d16", - "2008052e40313aaa8831ff87f9e00947f9e0094f44f43a9fd7b42a9ff030191c0035fd6BBBL4;FFe10319aae2031f2ae0023fd61f0000f1ad000054390300ebc33d00541803008b060000141f0400b1413d005454de01941f100031c13c005439feffb505000014L4;FB38352f6c6962726172792f636f72", - "652f7372632f74696d652e7273002f72757374632f3438613232396365616566643439383563353039393062313431313662L8;FFfbe703f9e8c303f9e8cf40f9f7ef03f9e8c703f9e8c340f9faf703f9e8cf03f9e8ab40f9f5fb03f9e8d303f9e8d740f9e70b04f9e8db03f9e85340f9e40f04f9BL8;FFc", - "09701b4a10241adf40300aaa20e40ad010001ad020c00ade007409100800991925e0194f70300aa2e5e019400908052210080522c5e0194c09601b4e10317aaL8;FF680240f91f0101eb000b0054680640f92a040091e00314aa490180526a0a00f90969213882170094e10313aaf3faff97803240f98001", - "00b4610a40f9680240f9BBBBL4;FF400140fd00a8200e0c00669e8c01c0da8c11c0da8cfd43d34d696c38c1ffff17000400f00080149149fe0194ffc301d1fd7b02a9f91b00f9f85f04a9f65705a9L4;ZFL8;FFe10314aae20313aa40fcff97600400b5e1031faae4ffff1761020054e1031faae00301aaf", - "44f45a9f65744a9fd7b43a9ff830191c0035fd6880080d2e10700f9BL8;FF7a7e01140920009121030090210033912403009084803291a32300d1e00308aa22038052a9831ff8747e0194fd7b42a9ffc30091c0035fd621030090219c3491L8;FFe1630091b67dff977f0600b180000054e1630091e00315", - "aa9d90ff97df0600b160b6ff548122029147000014e8031faa000117ab226d0054e1630091a87dff97BBBL4;FF600600ad620a803d480500b5f44f4ba9f55340f9fd7b49a9ff030391c0035fd6e80740f91f0900b141020054e8031faaf5031faa1401805206000014e80740f9L4;FB7269766174655f6b6", - "5797369676e617475726574696d657374616d700000000046884900000000005500000000000000ce000000010000007265676973747261L8;FFf44f49a9f93340f9f65748a9f85f47a9fd7b45a9ff830291c0035fd6200080520104805240be009420008052010880523dbe0094ffc301d1fd7b05a9f44f", - "06a9BL8;FFe10308aa863e0114281040b9000040f96800c8376800d037683e01147c3e01147c3e0114000040f9211a0014000040f9d2b8ff17000040f995abff17082440a9L8;FF4402805286000014c90080d2a8831d38480080520900f0f2a0c300d1a8931d38a9031df85233ff97e10300aa74000014c", - "80080d2e0430039e02300910800f0f2BBBBBL4;FF770a40f9680240f9080117cbbf0208eba9efff54e00313aae10317aae20315aa2300805224008052a1000094770a40f975ffff17e00313aa2200805223008052L4;FFe09740f9e1ab40f922008052390e0094e8bb40f9880000b4e08756a92200805234", - "0e0094787f60d3e8cf40f9880000b4e18359a9220080522e0e0094e8df40f9L8;FFc0035fd6fd7bbda9f65701a9f44f02a9fd030091140840f9f30300aa3f0002716200005435008052080000143f0020716200005455008052040000143f404071BL8;FFf85f4aa9fa6749a9fc6f48a9fd7b47a9ff43039", - "1c0035fd620008052e10317aa418e019420008052e10319aa3e8e019420008052e10318aa3b8e019420008052L8;FF080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314abBBBL4;FF2200805223", - "00805224008052a8c0ff97e12740f9cdffff17a06a40b9e0d7ff34e12740f9e81f40f91f0101eb81d6ff54f30300aae0e300912200805223008052L4;FBf872a9b2cc3089f331fe2fa7485fa235154c8ad52be204e85309339df3ec27f1e8beaaf611e960475463a78121c6030a37f8a28c1c5b615203757", - "e800000fa11L8;FFe56f40f9e14740f9e45f40f9e8b300f9e8ab40f9e06746a9e8c300f9e89740f9f0b74aa9e8ab00f9e8d740f9f88f41a9e92312a9e9a349a9e84f00f9e88740f9BL8;FFc1e20091e2430e91fa030b91808907ade3838b3ce3838c3cbf80ff97e89341b9080e00362007c03de9b341b921", - "43c23ce8c741b9a6000014c80200f008c11591L8;FFa01300d181008052bfc31fb86d4d0094a0c35fb8fd7b41a9ff830091c0035fd6ff8300d1fd7b01a9fd430091e023009101018052ff0700f9624d0094e00740f9BBBBL4;FF49ee019420008052e10316aa46ee0194ff8301d1fd7b04a9f44f05a9fd03", - "0191018840a9f30308aa28008052141840b9e0830091e373009124008052e8730039L4;FB4f9d4800000000007500000000000000250000002000000063757272656e744b7962657231303234206b657970726f746f62756620656e636f64696e67207761L8;FF230c8052cfe6ff97e10300aaa0f7ffb4b4", - "ffff17e1031faa883e00f9b9ffff17e1010054e1031faaaeffff17c80080d2e10700f90800f0f2080900d19effff17BL8;FF4a211a91e20200b0428c1091e3430091e8a700a9ea0f00f9536e0194edffff17ff8300d1fd7b01a9fd430091e80301aae00700f9010300b021402691040300b0L8;FF5311009", - "4e1d342f994fbff17e0431691e1031aaae20318aa4d110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aa44110094BBBL4;FFa8835af869da0179a9035b78a8031cf8a9831c78e9a341a9600604ade083c63ce183c73c622a803de283c93c696200f9e9fe60d3600602a", - "de083c83ce183c23cL4;FFc0035fd6ff0301d1fd7b02a9f44f03a9fd830091010840a908018052f30300aae023009129f87fd33f2100f13481889ae30314aad7ffff97e80740f91f0500f1L8;FFe103142a1f05007181030054e2031f2a0e07009408fc78d309fc60d3287b68782821084a095d1053295b6", - "9783701084a14000014e80100d008010191f703002aBL8;FFe85746f9e95b46f9800200f000c00391830200f063401b91840200f084000891e2c32291c1058052e85b04f9e95f04f9402e019420008052e10314aa3a2e0194L8;FFff0300f9ff4332d1f30308aaa86340b9ff0300f9e90300aae00709a9aa", - "4700d1e88b00b9cb0000f06b812391e81301b9a81840f9e20f0aa9e0070da9e00304aaBBBBBBL4;FFa8035ef8b7031ff8140117ebe3090054b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcb9f0208ebe8040054340100b4L4;FFbc160094f7ab4bf9ff0600b140", - "240054e8af4bf9f9b34bf92c008092f7a319a92c0100142083c03c2183c13cbf0600b1e00711adc0050054e077c03df53301f9L8;FF29a10aaa0a14403929810aaa0a00403929610aaa0a04403929410aaa0a08403929210aaa0a0c403929010aaa100000140a0040390b0440394a2d4cd34ab10baaBBL4;", - "FF39960194fa0300aaa0fdffb4f66b0ca9b70000b4e0031aaae10319aae20317aa3c960194c80217cbfb0313aaf76b00f99f0308eb281d0054f30340f9e80317aaL4;ZBL8;FFc0035fd6e80300aa098d40f83f0500b1201a0054f30300aae00308aa95040094e80300aae00313aa090140b22911c0da2915", - "40d2290d098b2925019129fd46d3BBBL4;FF28040091490400d1110000145f2800f1880000542800028b08f1df38a82ef837e0830091073f0094e82340b9c8510037e81b40f98a0740f9490108eb03680054L4;FB55000000000000005401000019000000b11c49000000000055000000000000006e01000", - "025000000b11c49000000000055000000000000006b01000021000000L8;FFe0f3803dfc030eaaed4700f9e4af00f9f51300f9f48f11a9f1df00f9f0cf00f9e6fb00f9fa2300f9f29710a9f6f300f9f6030faaf7ef13a9e7fb16a935d60094BL8;FF31010014e1d342f9e8cb42f91f0101eb00750054e8cf", - "42f949068052f4074091948209910969213828040091f68b49f9e8d302f9df0a00b1410f0054f9031faaL8;FF99ffff17c80080d20800f0f2080900912dffff17fa830291e8fb42f91f0500b1201e0054e80343f9e07fc13de9c31291e0833291022b8052e86702f9e8c31791BBBBL4;FF000400b000401c", - "9151f60194ffc302d1fd7b07a9f74300f9f65709a9f44f0aa9fdc3019109c04039f30300aaf40308aaa90100343f0d007101080054602242a9L4;FB7575696469646b65794d65737361676572237479706573656e6465725f6365727469666963617465636f6e74656e745f68696e7453656e64657243686", - "1696e4bL8;FF010e0054e1031faa87ffff17e1010054e1031faa79ffff17c80080d2e10700f90800f0f2080900d169ffff17e80b41b2e00700f966ffff17c80080d20800f0f2BL8;FF21f42691e8030091e00309aa620180528476019468c200910103009021202791040300f084c01291e0030091a36300", - "9162018052a80f00f97b76019468e20191L8;FF3c760094e04306910d100094e11b40f93f0400f18b000054e01f40f92200805234760094ff0600b1e1000054e83340f91f0500b180000054e8c3009100c10091BBBL4;FF220108cbe90301912001088b41b60194683340f960030191e1030191220080520", - "8050091683300f965b60194e8031f2ae8ff0139a00303d1a18302d1600743adL4;ZDL8;FFc20200add45200b9f44f4da9f6574ca9f85f4ba9fa674aa9fc6f49a9fd7b48a9ff830391c0035fd620008052010480523db6009420008052010980523ab60094BL8;FFe1e7c23d00838d3ce0d3c23de85f06f9e", - "86706f9e82f40f9e96306f9e92740f9e86b06f9e87306f9e81b40f9e96f06f9e87706f9e87f06f9e82340f901838e3cL8;FFe8a304f9e8831f91a04700d1e9af04f9e90000b029a13e91e8ab04f968008052e1830f91e90f02f9e9f701f9e90000b0298d2691e80b02f9e80000b008712791BBBBBL4;FF21", - "fdff546a9284d2e8031bcb2a49b2f28a24c9f24a92e4f27f0218eb00040054090313cb190500911a0e805229fd44d3347dca9b09e179d3381108cbe0030091L4;FFc0035fd6000180520104805251060094281040b96800c8376800d037550600148606001486060014ff0302d1fd7b02a9fb1b00f9fa670", - "4a9f85f05a9f65706a9L8;FF68b640f9e80000b460ba40f901f97fd342008052f30b40f9fd7bc2a835060114f30b40f9fd7bc2a8c0035fd6fd7bbda9f50b00f9f44f02a9fd030091150040f9BL8;FF49860194fd7bbca9f70b00f9f65702a9f44f03a9fd030091080840f9080100b4090140b22911c0da29", - "1540d2290d098b292501910819498b08050091091440f9L8;FF19038052a9035bf8f80f40f9fa230191680240f9a0039d3ca9031ef81f0500f1ab000054600640f901f97fd34200805230860094a003dd3ca9035ef86002803dBBBL4;FF290d098b29250191091b498b29050091280108ab83000054c1000", - "014e80308abe21700546a010034e91340f929010032297d40932911c0da291540d2290d098bL4;FB706a470000000000e8694900000000000000000000000000737071723a3a76313a3a6368756e6b65643a3a73746174657373686f756c642062652061626c6520L8;FFf503062af8030baaeaaf00b9edb", - "f43f9f9c343f9fec743f9eecf43f9f2d343f9f1d743f9e0db43f9e3e35e39e7f343f9e4e343f9e5e743f9e27744f9fa7700f9BL8;FFe04300390900f0f2e8470039e90700f9e0230091563b0094f44f4ea9f95b40f9f6574da9f85f4ca9fd7b4aa9ffc30391c0035fd6f623009137008052180d8052L8;FF", - "4a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54000100b0BBBBL4;FFfd7b42a9ff430191c0035fd6e80300b008c131914903805268a600a948008052680200b9f44f44a9f51b40f9fd7b42a9ff43019", - "1c0035fd6e80300b008f92891L4;FB696e6720636f72727570742070726576696f75732073657373696f6e20c00520666f7220c0023a20c0002f636172676f2d72656769737472792f696e6465782eL8;FFd1feff17a80a0091f3feff17fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd03009136084", - "0f9f30301aaf40300aa1f0002f1c2000054f50316aa680240f9BL8;FF9f0208ebc1010054f40100b4150040f9360040f933008052a8164038c91640381f01096be0179f1a4c660194940600f11300130a21ffff5404000014f3031f2aL8;FF603640f9220080523a660094613e40f9e10000b4604240f922", - "008052f44f42a9f65741a9fd7bc3a832660014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9BBBL4;FF690600b9e90340b96a120079ea0f40f969a200b8e90b40796182823c6082813c691e00796a0a00f97f020039fd7b45a9f33340f9ffc30191c0035fd61f090071L4;FF9f00036b6c000054bf000", - "039007d20d4836c1c53e5018092a3c023cb0600038b136863f8650a40f9df0005eb80000054000080d21f000039007d20d467824039L8;FF1bbcff97e80313aaf35341a9c3ffff17e0230091e10315aae20314aa2300805224008052f30308aa11bcff97e80313aaf35741a9c7ffff17e0230091f30301aa", - "BL8;FFe9af06a9eb048052a9028052ffab01a98a0200b04a013891eaaf03a92a0080d2f40308aaea0bc0f2e9ff02a9e9ab05a93c260194e00313aae80314aaf44f49a9L8;FF0a010039080000142c7c12532a440c330b090039090d00398b6d1c320a0500390b010039a802148be0031f2a680a00f9f44f4", - "2a9f65741a9fd7bc3a8c0035fd6BBBBBBBL4;FFe00700ad820243ade20303ad810241ade10301ad411a029400e4006f9ffe0139e0030091882648a98a2e49a98c364aa9e00300ad8e3e4ba9e00301ad080dc0daL4;FFbf0f0094fae341a9f9ef42a95f0b00b1e1020054db0300b4b80000b4e00319aae103", - "18aa22008052321a0094a1835ef8810000b4e00315aa220080522d1a0094L8;FF80fd0737180700f120070054281740381f310071e82300392c01005488feff341f250071600400541f290071c1020054e00313aae10317aaf0ffff171f350071BBL4;FF291b40391803000a1f01096be0179f1a529a0194", - "e83f4039291f40390a03000a5a030a0a1f01096be0179f1a4b9a0194e843403929234039f803002a1f01096bL4;ZFL8;FFe243c03df58b40f914010191e1031f2aa0073cade10f46adb7f35838e02fc03da2039a3cb5031bf80001178b08108052e21640d2a0873aadf81640d2a303973cBBBL4;FFfdc300", - "91098440a9f30308aae8030091e00309aadcb30094e9034039e82740393f050071e1000054e92340393f050071cc020054a9030035ea0f41b223000014L4;FB742d623538643766353665333634356363642f303639353962342f7372632f656e636f64696e672f706f6c796e6f6d69616c2e7273002f636", - "172676f2d726567L8;FFe97740f9e8ef01f9080200b008012791e9eb01f929038052e1430f91e8a303f962008052e8ab03f9080200b008a12691e9a703f9e9af03f9e90303aae3031d91BL8;FF00c10091b00e0094ff074091ff833c91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035f", - "d6e067c13de8d342f933ffff174b0080522c010034L8;FFfb4340f91f0d00f143070054e8c31791e0833291e881fe97e8fb42f91f0500b100f50054e80343f9e9f31691e07fc13de9a305f92900009029c10191e80305f9BBBBL4;FFffc302d1fd7b06a9f93b00f9f85f08a9f65709a9f44f0aa9fd830191", - "09a04039f30300aaf40308aaa90100343f0d007121080054602240a9090d40f9e8030091L4;FB6563697069656e743dc00076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f6b656d2e72730076656e646f722f6c696273L8;FFa0873bade08741ada203993ca08739", - "ade08b42ada08b3aade08740ada08738ad20f4ff97a0077bad880080d20800f0f2880200f98082853ca2037cad8182863cBL8;FF09040091000502a9000500ad008501ad090505a9f44f41a9fd7bc2a8c0035fd6f40308aa447a0194e80314aa29008052610600f969420039edffff17ffc300d1L8;FFe01", - "b843de067c73d00800191e11f843de023843de227843d927a0094e007409100800991907a0094f50300aa2d7a009400088052210080522b7a0094c09701b4BBBL4;FF40825ff81f0003eb42310054120980521708129b200600d11100118af2c24039df00126b01feff54f29243f8e01243f8df0112ebe00", - "140fa00020054eaffff17L4;ZBL8;FFe01f40f9220080523aba0094e11740f9810000b4e00740f92200805235ba0094e14b42f9810000b4e04f42f92200805230ba0094e15742f9810000b4e00340f9BL8;FFe80308ab82040054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a250191291", - "94a8b29050091280108ab22030054091440f9090100b42a0140b2L8;FF163a01b4e0830f9187f8ff97683642f9754602f90a0100b009554f2948b140f93f050071e1450154fb6340f91f0900f1c902005468c21191290000b029012191BBBBBL4;FFe0230091020280520401805258010014e003022ae203", - "03aae303042af44f4ea9f95b40f9f6574da9f85f4ca9fd7b4aa9ffc3039140f0ff1701600091e003022aL4;FF440a00940c0000143500805228008092755201a9685200a9f44f46a9f65745a9f85f44a9fd7b43a9ffc30191c0035fd635008052f4d701a9f41700f9e8030091L8;FF4a312591a8831ff862", - "02009042b80191e9ab00a9e3230091530a0194fd7b43a9ff030191c0035fd608200091200440a9a92300d10a0000904a412491a8831ff8BL8;FF60f5ffb428000014e81341b948000037f98b00f9c1920191a20301d16a74ff9760f4ffb44c000014e87340f91f0500b161000054ff670ea9ff7b00f9c1c2", - "0091L8;FF29010d4a6d360e532c7f8c0a6a7f8a0aae7e8e0a713a0f530b020b4a105d10532f7c8f0a8d7f8d0a6b010c4a4a010e4acc7e910a6b010f4af503142a4a010d4aBBBL4;FF6c0114cb9f010aeb23010054080e8052610640f98006089b48e179d302110acbf44f41a9fd7bc2a83aca01140a0e805", - "2740109cb6c0640f901310a9b28e179d3L4;FB00000000000000000800000000000000080000000000000060f7450000000000456b526563656976656400000000000025194900000000006a00000000000000L8;FF16008092f7031caae00318aae10317aa2200805237ca0094df0600b1e0090054e8ef4", - "2f9e0031a2a80de78b31f0500b1203900546027c03de8c301f9f7430d91BL8;FFfd7bbea9f30b00f9fd030091090040f9e8008052f30300aa2a0900d13f0500f14881889a1f2500f148100054c90200b0292114918a0000102b6968384a090b8bL8;FF1f0109ebe80f0054960000141dfeff97080040b208", - "11c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb281000548a000014f30300aaBBBBL4;FFf70306aaf90305aafa03012af50308aa00feff97e84f42a9f47343a91f0500f1a100005408008092b47201a9a84e00a94f000014e0830091e1031a2ae20319aaL4;FB4f9d48000000", - "00007500000000000000390000002e000000446a62000000000069a34800000000007900000000000000080000002600000062a2480000000000L8;FF96ffff17e00313aa22008052230080522400805216000094610a40f99dffff17e00313aae10316aae20315aa23008052240080520e000094760a40f", - "9680240f9BL8;FF220080523b6a0194740e00f9f44f41a9fd7bc2a8c0035fd6fd7bbfa9fd030091086840b91f05007161040054086c40b9080140b20811c0da081540d2080d088bL8;FF8192fe9728008092680200f9a6ffff17e85340b91f050071610f0054e043c73ce143c83c03e4006fe283cc3ce843", - "0691e0c30e91808506ade083cb3cc1e20091BBBL4;FFf75b042937aa0194e00314aa210080523700805234aa0194e0feffb4e95740b988008052f60300aab4033ba90811092a29008052a9031cf808000039e0030291L4;FFec8300b20b000014f0fd48d3ef9d0092aa010a8b29010ecb109e00920f020f8", - "bf07d0c9bcf05409208c1508baf0400b5490800b43f0103f1ed030aaaef031faaL8;FFfd7b04a9fb2b00f9fa6706a9f85f07a9f65708a9f44f09a9fd03019137c040f935204639f30301aaf40300aa2daa009400308052010180522baa0094600a00b4BL8;FF800703ad420344ad820304ad410341ad8103", - "01ad420342ad820302ad410340ad810300ade1b2ff5428008092680200f9a6fdff17800200d000d40f91820200d0L8;FFf9030bf900001891f6070bf9fa87fe97e00706a9e00319aa01c4805222008052342a0094bc035ef8bb035df868031ccb1f7d00f189440054b9835df8400740adBBBBBBL4;FF08f1", - "df38e849f837e02300910d7b0094e80b40b968000036e00b40f912000014e80f40f9aa0640f9490108ebe3470054aa0240f9e00b40f9e303162a4801088bL4;FFa04700d1fcc3ff97e05f00b9a04700d1f9c3ff97fa03002aa04700d1f6c3ff97f603002aa04700d1f3c3ff97f903002aa04700d1f0c3ff9", - "7fb03002aa04700d1L8;FF29c100118d0d00127f7d02716a0d0012096c003909819f1a5f25007129114b0b0b819f1a9f7d02716a010a0b0b819f1abf2500716b114c0b29c1001108819f1aBBL4;FF1f09007161010054080180d2e9de78920800f0f2080140b20b000014080180d2e9031faa17ff48d3080", - "0f0f206000014080180d2f7031faae9031faa0800f0f2L4;ZDL8;FFa8831ff88892009468c20091610100f0213c1691a32300d162008052e40314aaa8831ff88092009480920094f44f43a9fd7b42a9ff030191c0035fd609004039BBBL4;FF7a0740f9e8af40b9fc031faae9031faa13008092b74302d14", - "0000014faef48a97c1500b4b34302d15ae300913b008052780240b2050000149cc301f15ac30191L4;FBe5dcd4ad5fc2e658d11ba28c82efe99f0000b9a8a3f8a46a1c273dbf33e7d7f748dc6b8c0c470171b1c65491c38df289529f333222ddd62940d8754378a67d51L8;FFe9df00f9e98b44f9ea9700f", - "9ea8f44f9e0cf00f908b140f9ea4b00f9e97f00f91f0d00f1e3650054a80100b008110f91fb3300f9e8ef01f9e80100f008012791BL8;FF44110094fad342f9fc0740919c83019190fbff17f60300aae0431691220080523c110094e1d342f9e00316aacafdff17e04316912200805236110094e1d342f9L", - "8;FFe9fb00b9ea0b10a900013fd6e03b02f9e8031691f4031691e13f02f9290c40f9e103129120013fd6f8c342f91f0f00b12102005468008052f53f42f9f43b42f9BBBBL4;FFa80318f8a8e300d1e90f00f9a9035d38eaa700a9aa235db8a9835e38ea0300f9a983183838180094a8835c381f050071210", - "10054a8277da9890000141f090071L4;FB6d697373696e67207468656972206c6f63616c2066696e6765727072696e746661696c656420746f206465636f64652074686569722070726f746f627566696eL8;FFf65746a9f85f45a9fd7b43a9ff030291c0035fd637008052180080921901805206000014e", - "20313aa430c8052c5eaff97e10300aa00feffb5a80640f91f0116ebBL8;FFaa635738a94317386901084aab735738a95317384901084aaa835738a96317386901084aab935738a97317384901084aaaa35738a98317386901084aabb35738L8;FFe8d302f91f0700b1c0200054c0220291482a0094080040", - "b20811c0da081540d2080d088b0825019108fd46d30900088b390500913f0308eb681f005431010014BBBL4;FF630300f063cc2791a04301d162018052c400805230000014a0031bf8610300f021f42691630300f0639c2791a04301d1620180528401805227000014610300f0L4;ZBL8;FF17050091f303", - "01aa3f0117ebc10e005400e4006f168442a9748e40a9f50300aaa40100f084003e91e6030091e00316aa85048052070c8052e20314aae00300adBL8;FF680200b008c10d91e85f04f9e8c31691a04700d1e86304f9e8ffffb008912891e86704f9e8c31d91e1833291e86b04f948fffff008e13591e86f04", - "f948008052L8;FFfc3b01f9a9010014c90080d20900f0f23c4500911f011ceb603b0054200743ade8c324912223c03de100009021383f91e0c30e91e3432a91e4c32491e2008052BBBBBL4;FFa80e40f9c80600b4770640f9a00642a9e20317aae5fcff9708fc79d3e1e7076fe9031faaba6640a9080d010", - "ef6d640a9f76240391c00198a496b7cfc208d282eL4;FFe10317aa220080523a02009406000014228f7fa920008052e1031faab9020094c00c00375ac300f139c3009101fcff54f6e742a91a058052f71f40f9fb1340f9L8;FFf44f41a9fd7bc2a8c0035fd6c20700b4fd7bbba9f90b00f9f85f02a9f6570", - "3a9f44f04a9fd0300914804028b49008052f30303aa340d002a3940009118f17dd3BL8;FFfd7b41a9ff030191c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091080040f9e00301aa14cd40a9e803009173820194b30100b4080d8052757e089bL8;FFf40301aafb0300aa3f0700b12006005488", - "0a40f9080100b4090140b22911c0da291540d2290d098b292501910819498b08050091892680b9a9050034290140b2BBBL4;FF56c20194b50600f11900190a21ffff5403000014fa0300aaf9031f2ae003192a4ec201941f1c0072e0031aaa8001005428008052ff0200f9e822003986000014L4;FB75727", - "2656e742073657373696f6e207374617465202862617365206b657920c0012900c0000a64656372797074656420c00e206d6573736167652066726f6d20L8;FFf8431091a8031df888ee40f900430191a9831ef8f73f41f981220091a003963ca2837eada1039c3ca80317f88083833c8283823c8183813c", - "fc15009400230291BL8;FF680240f91f0101ebc0090054680640f9090180522a0400916a0a00f909692138e10313aae6faff97e00314aa080c43f81f0500b160000054e10313aa0bfeff97L8;FF0801009008613c91e90f02f949048052e82719a9e1031091e3430691e8271aa90801009008013c9142008", - "052e8db00f966fcff970a0380d20801009008e93c91BBBBL4;FFf9feffb50f0000141f0400b121be00545be201941f100031a1bd0054f9ffff1758e20194f70300aa1f0400b141fdff54e04305918100805253e2019480bc0035L4;FB28a44300000000006120446973706c617920696d706c656d656e746", - "174696f6e2072657475726e656420616e206572726f7220756e65787065637465646c7900L8;FFe0d7c23de8b345f909008092e0430f91690200f96082803c680e00f962ddff97080700d1fa031c2a1f0900b1a2000054e00319aae10318aa220080522de20094BL8;FF0106805253620194fd7bbda9f657", - "01a9f44f02a9fd030091f303032af40302aaf50301aaf60300aa2e62019400068052010180522c620194600100b4165401a9L8;FFf30302aaf40301aa6bfeff97e80300aae00301aa08020037680240f9080540f9150100eb62020054e80f41b2e80700f907000014c90080d248008052e0430039BBBL4;F", - "Ffd030091140440f9930600b162030054b300f8b6f6031faae00316aae10313aa41a20194f50300aa2ea20194e00313aa21008052360080522ba20194e0feffb4L4;FF200000900040069138000090000c40391f1c007281100054a02a00913900009021031091367860f8df0200f1640a437aed0200547f", - "7e007164da467aa00f0054L8;FF14cd40a9e80300917da20094b30100b468e279d3151113cb930100f073a21291e0030091a1630091e20313aab40f00f994c2019173a20094b5c201f121ffff54BL8;FFf40300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aa50220194000300b50e00001", - "428008052090180529f6a29f8880200f9f44f41a9fd7bc2a8BL4;FF08028052806a68f82200805239220094e4ffff17fd7bbea9f30b00f9fd030091010440f9f30300aa810000b4600240f9220080522f220094610e40f9c10000b4L3;ZBBBBBBBBBBL4;FFce0500d1521640f9e00312aa0000158a606a60", - "fc00a8200e0300669ee30000b55f2000b1000f005442200091000002abe3feff54770000146200c0da4210c0daL4;FFf4030aaa20000094e10340a9ea0314aa2ba040a9290040f900fc78d37369283808050091280800f980fbffb43f0108eb4a611932a00000546a69283808050091L8;FF170c40f9f503", - "01aaf40300aaf30308aaf7010037e182009120008052a21f01942008f8b7986640a9f50100b417040036fafe45d3a8021aab4208005409fd7bd3BBL4;FFf70304aaf50303aaf60302aae94b02f9f8c30c91e8a304b95898ff97e86a40b9e90300914a0000904a211591e94702f94903009029b10d91e8e30", - "1b9680000f0L4;FF55c31fb880d25f38001000121803000b98d21f38f76343a9f96b44a9b1ffff17e2031aaa230080525f000094dfffff17f76343a9f96b44a9aaffff17fd7bbea9L8;FFa40100b084801b91e0030091a363009142008052b30f00f9839f009468a20191810100d021b41e91a40100b0842", - "00f91a3630091a2018052a80f00f97a9f0094BBBL4;FF770000b55fdf0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300ebc35c00541803008bL4;FB45024900000000004e00000000000000020300001f00000045024900000000", - "004e0000000000000006030000200000006f766572666c6f77c320000069020000L8;FFeb8f00f90b444ea9eb2b14a9072853a9062c54a9ea3700f90e2857a9eab70aa90a345aa9ed3f00f90c345ba9eeb31da9ed3300f90c345ca9ecf700f9ed2f00f9BL8;FFa8c31fb8955f0194fd7b41a9ff830091c00", - "35fd6ff4302d1fd7b04a9f92b00f9f85f06a9f65707a9f44f08a9fd03019137fc4039f40301aaf30300aa16108052L8;FF2200805252020094610a40f9e00315aaccffff17f50300aae00313aa220080524b020094610a40f9e00315aad2ffff17e00313aa2200805245020094610a40f9BBBBL4;FF00c01", - "39152ff0194ffc303d1fd7b0ba9f76300f9f6570da9f44f0ea9fdc3029109304039890a0037170040f9f40308aa150840b9f30300aae80e40f9f50f00b9L4;ZFL8;FF80faff544b15c0394c1900912e1900d10c3900a96d190012218c0daaebf8ff363f1900f160f9ff544b19c0394c1d00912e1d00d10c3", - "900a96d19001221a80daaBL8;FFf51340f9fd7b41a9ff030191c0035fd6a8820091c9fffff029312291020300d042a80c91e3030091e00314aae10313aae82700a94c7f0194f44f43a9f51340f9L8;FFe81700f9a0190054802202914fd9ff97080040b20811c0da081540d2080d088b0825019108fd46d3", - "0900088b36050091df0208eb48180054d000001480220291BBBL4;FFff0600b100080054006300914a360094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb69160054f6e740a9b90600b4L4;FB496e76616c696453657373696f6e4572726f7200000000000c7", - "c4700000000001800000000000000080000000000000040ea47000000000024e9470000000000L8;FFa5c02c91e123009162e20191e0031f2ae3031faaadbf0094ffc302d1fd7b08a9f65709a9f44f0aa9fd030291280840f9f30301aa1f0101f161060054681640f9BL8;FFe20319aaf50300aa423f0194", - "572340f9b6831ef8b8431fb8f70200b4561f40f9303f0194e00317aa210080522e3f0194800700b4e10316aae20317aaf40300aaL8;FFe0060036212c00b5992240f9881a40f93f0308eb6100005480c20091a475fe97881e40f9e083c33ce0031faa2823189b000d803de083c43c0011803de083c53cBBB", - "BBL4;FF09692138b6020034c80240b20811c0da081540d2080d088b0825019108fd46d308050091f50100b4a90240b22911c0da291540d2290d098b29250191a91a498bL4;FFff0701f9e80b01f9ff0f01f9b70000b4e0db40f9e10317aa22008052350f0094e0431391e10313aa02288052390f0094e827", - "0491e01740f9e143139100f1cf3cL8;FF5f00086b23010054497c09536a7089528a00a072297daa9b29fd67d3210009ab420100542289081b6002009000203691a30f01943f040031e103811ae003809aBL8;FF528f0194a000003568e305d1080140395f03086be0050054e1e7076fe80600d1e90740f91", - "70117ea0a328052e1fcff54208d212e00a8302e0800261e48010037L8;FFc0035fd6a80100d008010191e9030091630100b063c02291640100d08440129100210091e2230091f403012a21008052e82700a9638f0094e103142aa80100d0BBBL4;FF290500912001088be1e30091a5baff97170100351300", - "0014e8031faa76feffb5e003088be1e300919ebaff97b7010034e12740f9e81f40f91f0101eb80240054L4;FB7dc3363f00003997fac8ef9f75d8892189734e57714ca87d0f9d441906a28a4ae7347b43050a50be8658d2c5bb819168e296f6c95b3cfeb3846bd1b6d4bb0e6bL8;FFf88f41a9e8b300f9e8", - "d740f9e9ab00f9e06746a9eb2312a9ebf340f9e9a349a9f0b74aa9e9d700f9e98740f9e84f00f9e9df00f9e9af40f9e98700f9c8f2ff17BL8;FFe8271da9474f0194e80342f9e92350391f0100f1e8179f1a0101090a24000014e1031f2a22000014882245b8e92f4379eb4746398c9246f8edc74639eaa3", - "4639L8;FF49040054e12340f9a04303d102048052b44303d16cf2ff97080000d008612091e92740f9b42338a9080000b008c10191a92339a9080100d008413191c9048052BBBBL4;FFe10313aa22008052f44f49a9f65748a9f85f47a9fa6746a9fc6f45a9fd7b44a9ff83029133ef0114081740f9fb0f40", - "f9fa1b40f9f70300f91f011bebc1010054L4;FB73696f6e000000004e9b4800000000002c00000000000000330000002d000000656e64206f66206b657973747265616d20726561636865647b9b480000000000L8;FF20020037750240f9a80640f9160101eb82020054e80f41b2e80300f907000014c900", - "80d248008052e02300390900f0f2e8270039e90300f9e00300914ce4ff97BL8;FFe000003620008052f44f43a9f51340f9fd7b41a9ff030191c0035fd6a80240f91f0500b160020054a8630091e9ffff9029211591e20200d042840c91e3030091L8;FFa053ff54e80740910881099100210491e14316911", - "310009497faff17400100d000402691420100d042e0269121048052616f0094e2074091450100d0a5402791BBBL4;FF15f140f87f0500b1a98318b8097d40398a320fb8ac8317f8a9031838c0030054f903012a098449a9fa0300aae8a30091e00309aa2c850094e8a340391f050071L4;FF1f2500710101", - "0054f5031f2ae003152af44f43a9f65742a9f85f41a9fd7bc4a8c0035fd635008052e003152af44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6L8;FFf44f0ca9fdc3019148040091f40302aae11700f917f97fd3f30300aa31af0094e00317aa410080522faf0094c01200b488060091e00b00f9f3a301a", - "9141000b4BL8;FFe0032d91e10313aa0204805214210191f3032d915deeff97e8ffffd008310791c9048052e85706f9e8ffff9008912891e85f06f9880200f008e10491e8fb02f9L8;FF8ef1ff97e0031b2aa88357f87f0302710801158b43f8ff54daffff17a80358f82003c03de00313aa096b40b9940a", - "40f9e81b00f9e8030191e00b803de93f00b9BBBBBBL4;FF614a40f93f0400b140020054810000b4604e40f92200805236170294615640f9810000b4605a40f92200805231170294616e40f93f0400f18b000054607240f9L4;FF38170094800080522100805236170094404d01b488008052e06f02f9a100", - "00d021e028911a0000b960620491e3431391e2018052e86b02f9e87302f9acf2ff97L8;FFbf2200a9a61701941f0400f1e1020054a88200911ffddfc8a10240f9810000b4a00640f92200805232170194e00315aa01058052020180522e1701940b000014BBL4;FF0b0140b90a0100b98a0080522b0100b9", - "c20008362b696a780c696a780b692a782c692a784a017fb2a20000362b696a380c696a380b692a382c692a38c0035fd6L4;ZBL8;FFfd7b02a9f44f03a9fd830091e90301aaf30300aa8101009021a41a91e8230091e00309aaa20180527e970094940100f094e204918101009021c01691e0230091BBBL4;", - "FF2100805238d70194600400b4000740adfc0300aa381f0012000400ade00315aa9aae0094080480528002c03d09008092687203a9687e04a908018052687e05a9L4;FB743253656e7443743253616d706c656473656e64696e675f63743200000000008b1a4900000000004e00000000000000640200001", - "300000056657273696f6e4eL8;FFf1ab12a9ea030faafab300f9f13f40f9fa5740f9ec7300f9ec2b40f9ed6300f9edf740f9e5d300f9e093803de1f3803de82b01f9f6bf00f9f2d711a9e70f00f9BL8;FF220080523b570194b30000b4e07b49f9e10313aa2200805236570194e18349f9810000b4e08749", - "f92200805231570194e18f49f9810000b4e09349f922008052L8;FF63203591040180528700001448008052e0a33239e8a73239c80080d20800f0f229000014f30300aaa00302d1dbf1ff97e00313aae05306f9e083329121010090BBBBL4;FF00fdff54755a41a9e00740adc80240f9e08701ade00bc03d", - "e017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aa2ef70194e08741adL4;FB436861696e4b6579626173655f6b6579636861696e5f6964726f6f745f6b6579c3200000690500004e6f745374616c65a861000000000000496d706c69636974L8;FF21050054e0031faa8dffff", - "17c80080d2e00700f90800f0f2080900d17effff17e90b41b2e92300a983ffff17c80080d20800f0f2080500d177ffff17c80080d2BL8;FF62018052b30f00f987770194686200910103009021b42391040300f084400b91a363009122018052a80f00f97e7701947e770194fd7b41a9f31340f9ffc30091", - "L8;FFea33959a08010acbaa0208cb33010aeb091d0054e90315aae8000014e81b40f91f0500b1000a0054e85b40b91f010071cd0b0054e8074091e0c3009108810991BBBL4;FF24008052aaa9ff97f41f40f9fc1740f9880314cb7f0308eb89f0ff54e0a30091e10314aae2031baa23008052240080529fa", - "9ff97f41f40f9fc1740f97bffff17L4;ZDL8;FF4500805229f87fd33f1100f13481889ae30314aa26000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9BL8;FFe99f40f9e8eb02f908018052e8f302f948c141393f0500b1f3db02f9ffef02f9eba", - "b08a9e89f00b9eae702f9fff702f9fb4300f920330054f4a740f9f98342b9L8;FF0300001428008052e82b00f968c640f9694642b91f0500b1e95f00b900020054e0830f9161220691a70f00946083c93c6183ca3c6283cb3ce8f341f9c00601adBBBBBL4;FF0043c53cec1300f96cfd199b8043853c8143", - "803ca0877dad09692b384921003908010c8be91740f900c19c3ca003dd3c01c19d3c2905009100c19e3ca1837badL4;FFf30300aa37070094000280520101805235070094000100b4810000d021803f91130000f91f200039f30b40f9fd7bc2a8c0035fd6000180520102805245070094L8;FFe80300f9e0", - "03009159fcff97f44f45a9f52340f9fd7b43a9ff830191c0035fd6f503012a74040051e00313aa1b060094e80300aae00301aa28fc073708fc60d3BL8;FF772a40f9971300b4790e40f9782e40f93f0700b1a01400546a8a42397a1240f9aa1500366a3640b96c4640b96f2248f870a248f8712249f872a2", - "49f8600a40f9L8;FFdc26969a5f011ceb23ffff541b0500913a0080520851199be91b40f9bf0209eb130540f961010054e0c3009106d0ff97e01f40f9070000141b0500910851199bBBBL4;FF7bffff17608749adc80600d1090080921f0d00b16aae00a9690200f96082813c6182823ca8000054e00317a", - "ae10316aa220080522fc70194b80000b4e00319aaL4;FB206572726f723a20c0001a73657373696f6e20737461746520636f727275707420666f7220c0001c706f73742d7175616e74756d207261746368657420657272L8;FFed0314aaad0000b4e0030eaae1030daa2200805237c70094fc031faa7a620", - "1a9080080927c0600f921f9ff17810000b4e0031caa220080522ec70094b80000b4BL8;FF00fc47d3c7000014e10300a9e00301aae10308aa220080523e060094e10340a92aa040a9290040f91f1040f15369283808050091280800f943feff540b7c0753L8;FF800200545afbff97080040b20811c0da08", - "1540d2080d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab230100541e000014f4031faaBBBBL4;FFd33e0029c96a0039e9fe60d3cc520079ac0356b8cdaa0039ad3356b8c97e0039a98356f8cc4600b9cd7204b8cb320079d7b201b8d9460429d0b202f8ce3203f8L4;FB7471", - "75616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f76312f6368756e6b65642f7374617465732e72L8;FF220080523be70094e10314aae86f41f9c80000b4e07341f9e10308aa2200805234e70094e10314aae87f41f91f0500b1c0010054c80000b", - "4e08341f9e10308aaBL8;FF68620091e102009021b42391e40200f084202e91a363009122018052a80f00f98167019481670194fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9L8;FF420080523b670094680e40f9a80000b4601240f901f57ed34200805235670094681a40f9a80000b4601e", - "40f901f57ed3420080522f670094682640f9a80000b4BBBL4;FF60faffb45800001481620091a2630091e003082a5d90ff97a0f9ffb449000014a2630091e003082a830c8052428dff97e0f8ffb41e000014a0630091b2a70094L4;FF25000014001c0051340000b01f7c007109010054800210910129009", - "1007861f881021091022900913f7822f8230000148402109180c0208b00c04d391f8c0171L8;FFf65743a9f85f42a9fd7bc5a8c0035fd6e8a34039a00100d000003b91a301009063202591a40100d084803b91a273009141038052a87300393ea7009420008052BL8;FF691640383f1500f1e10900542984", - "00d13f8100b1e2090054e90400b4ea0200904ab140f95f0900f163040054e90700f9e92300914a0200d04ac10d91eb430091L8;FF080d8052b3835df8fc031faa887e089bfb0314aaa8031ef81100001436008052a9835ef8aa835ff868021c8b7b0700d15aa301919ca30191092900a9096501a9BBBBBBB", - "L4;FF0800669e17c101f260ffff54e802c0dae91340f90811c0da200540a9530f488b68fe1b9ba802088b026102d13e1600940800148a206b68fc00a8200e0a00669eL4;FF0a0000141a008092e01fc03de013803da003983cb7fbffb5e0ffff17d90180d21900f0f2f7031caae00b41ad28008052e107c0", - "3d9a6600a9976201a9951200f9L8;FF090880520811c0da280108cbe90080521f1d00f10831899a29008052360908aae80313aa954e00a9885a01a9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6BBL4;FF0001c03da003983ce80f40f9e6a742a9fa43039108e17a922801088ba98302d108011c8b29", - "0940b2081d00910a915f382e915f38c60400f10ba15f380fd15f38L4;ZFL8;FF214c1991a401009084401791a363009162018052a80f00f9839b009468620091810100b021781991a401009084c01791a363009182018052a80f00f97a9b0094BBBL4;FFe00319aa21c480522200805239db019465db0194", - "e01b10f9e00b4091e8430591e13b20b900c00091e1031faae2031f2a5edb0194e8ab40f91f0500f1e0090054L4;FB79496e76616c69645461670000000000000000000000000001000000000000000100000000000000f05b44000000000000000000000000000800000000000000L8;FFed0304f9e8cb03", - "f9e8c340f9fe0704f9e8cf03f9e8ab40f9e40b04f9e8d303f9e8d740f9ef0f04f9e8db03f9e9a349a9f21304f9e61704f9e8e303f9e8df40f9BL8;FF088109916b760094e83349f94083c03ce93f49f91f0500b1e067813de9d302f960200054e0abc43de1a7c43deac33391e2a3c43de95b49f94081833c", - "e067c13dL8;FFe1df823de182c03ce0e7823de082c13ce2e3823de82300f9e1d3823de0d7823dfacb40f9fc2f00f9f55307a95a1200b4080d8052f6c740f9537f089b295b0094BBBBL4;FFc1f7ff54e6ffff17a0877bad7f0700f1f4567ea9f9627fa9e0063fadab000054e01f40f9e1031baa2200805231", - "fb0194f32340f99f0600b120070054780300b4L4;FB2f6b6579732e727300c020204475706c6963617465206d65737361676520666f7220636f756e7465723a20c00076656e646f722f6c69627369676e616c2f7275L8;FFe08b43ade08b0aade18340ade18307ade08b41ade08b08ad402700b4e0c30391", - "8cf7ff9787010014e1430091e20313aaf70b00f9f73f00f966050094e08743adBL8;FF51000014ec031faaea031faaed0340b2bf010bebc20000542d686c788ef17dd38c017fb2ad21ce9aaa010aaa9f010beba20000542b686c388cf17dd36b21cc9aL8;FF2200805223008052240080521891ff97e1174", - "0f9e00315aa21feff17e06300912200805223008052240080521091ff97e11740f92efeff17e0630091e10317aaBBBL4;FF6003803d6003c03df70f00f9240000149f4100f1c9400054480080d2a06301d1f4030caa0800f0f2a8831af87ba3ff97a86301d1e006009101028052e1a60094L4;ZBL8;FFfa6", - "702a9f85f03a9f65704a9f44f05a9fd030091ff8325d1ff0300f9f40301aa283040f9e22300f95f0008eb41380054f60302aaf30300aae023019181a20191BL8;FF29fd46d30801098b000500911f0009eb28dfff54a00200d000c00991383b0194a00200d000802291353b0194fd7bbba9f90b00f9f85f0", - "2a9f65703a9f44f04a9L8;FFfa6740f988380036eafb41f9c80080d2f6ef43b9f7eb43b90800f0f2ff5700f958fd60d3f5031faa1439009133030014607e42f9618242f9290c40f9e8830f91BBBBBL4;FFfdfeff17e00313aae10317aae20315aa2300805224008052a5fdff97770a40f9680240f9080117", - "cbbf0208ebe9dfff54e00313aae10317aae20315aa23008052L4;FF680200f9600a803d6182803c690e00f961feffb4e00b40f922008052350b0094f44f49a9f54340f9fd7b47a9ff830291c0035fd6ff8301d1fd7b03a9f52300f9L8;FFe80b40b9c8000036e00741a9f44f43a9fd7b42a9ff030191c003", - "5fd6e80b40f900008092742200a9f44f43a9fd7b42a9ff030191c0035fd6080040b20811c0daBL8;FF38000014081700d1b4831df805000014e80b41b2a0831df802000014081300d1a0c300d1a8031df851800094f40300aaf5db44a9e11b40f9810000b4e01f40f9L8;FF133b00f9080000f9a8008052e", - "80f00f933fb7fd3338b0094e00313aa41008052318b0094e00a00b579020014f70314aa2c8b009400668052010180522a8b0094BBBL4;FFe1031aaa22008052170100b4e30317aa53cb0194e81f40f9e00000b520008052e10317aa40cb019432cb0194e81f40f920008052000540ad7f0600f1ea2340f9L", - "4;FB080000000000000010f34500000000000000000000000000080000000000000008000000000000004cf645000000000000000000000000000800000000000000L8;FFe9730ff8e86300b9007b00546013c93c685340f9f9030caae04700f9e0831d91e16f00f9e1030e91f5c301f9f5430d91efb702a", - "9ee6700f9eb2b00f9ea1f00f9BL8;FFa80000b4602a40f901f57ed342008052384b0194683240f9a80000b4603640f901f57ed342008052324b0194683e40f9a80000b4604240f901f57ed342008052L8;FF21e01691a2008052784b0014fd7bbea9f30b00f9fd030091080040f91f0900b1a1000054e003", - "1faaf30b40f9fd7bc2a8c0035fd6080141d2e90080521f2d00f1BBBBL4;FFe95301f9e85701f9e0070bade28354ade2030eade18352ade1030cad3feb019400e4006fffbf0a39e85b41f9e95f41f9ea6341f9d6060051eb6741f9ec6b41f9L4;FB0800000000000000304b42000000000000000000000000", - "0008000000000000000800000000000000107542000000000000000000000000000800000000000000L8;FF1b010094610a40f9a3ffff17f50300aae00313aa22008052230080522400805213010094610a40f9e00315aaa9ffff17e00313aa220080522300805224008052BL8;FF776b0194e20200f0424", - "023910a000014082100910103009021e02791e80300f9e8230091420080526d6b0194e20200b042e01291e0230091e1030091696b0194L8;FFa04700d1e8271ca9480100b008051c91e82b1ea90a078052c8048052ff2719a9490100b0292d0e91e92b1ba9290080d2e1430691a949c0f2e87f1aa9e8271d", - "a9BBBL4;FF56ab019408134039e902000a1f01336b7303090ae0179f1a50ab019408174039f703002a1f01396be0179f1a4bab0194081b4039e90740f9f702000a1f01296bL4;FFf503002af7031faaf6031faa34008052bfd33da9e20216cbb6831ef85ffc3ff1290100548102168be003152ab20d00941", - "f0400b140040054e00200b41600168bL8;FFfa031faa050000141bc11f7814e11f78b51200d1b50b00b4884740b8097d10531b05c05a3405c05a9a0200b4c80a1a8b6a3f001209c15f785f01096be9979f1aBL8;FFb2feff17f63f42f92083c13ceae32291e9d742f9f5c742f9f7cb42f9c80240f9f83b42", - "f940818b3ce9c304f9680000b4e00318aa00013fd6c10640f9810000b4L8;FFff0316b9e85700b96e2a0094e80356b9e00740918100805200001891ff0316b9e85300b9672a0094e80356b9e00740918100805200001891ff0316b9e84f00b9BBBBBBL4;FFcaf7ff361f1d00f140f8ff542a1dc0392b2100", - "910d2100d10b3400a94c19001221c40caaaaf6ff361f2100f120f7ff542a21c0392b2500910d2500d10b3400a9L4;FFc2050014eabb40f938fd78d35a7c085348fc60d35cfc78d3ab0000b06b29349157fd60d38d008052fb0309aaf003182aef031a2aee03082af0050014eeef44b9L8;FF0bfc48d30cfc", - "70d3000d00390901003909fc68d30a0500390afc60d30911003909108052293408330b0900390bec78d30a1500394a0040b90921003949084079BBL4;FFfb0300aa43930194f7031baa1300001434930194600280522100805232930194c00d00b4480300b008c11e910001c03de84d8c52a8ceac7208f00", - "0b868028052L4;ZDL8;FF0825019109fd46d30800098b080500911f0109eb69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff54800100d000202a9130930094BBBL4;FFa30300f063082991e0830091020280522401805298c70094e01340f90bffff17e01300f9a10300f021a", - "01e91a30300f063403091e083009102028052e4008052L4;FB20674d27b73876f7a0175c2933c525a346ffa9fc7e6b060700009bf974a41c7a8bf16c5e0bdbc2f8c63bbd36dd94c5363bc85f019c3ad6ffb68a1a9b7e7db8f2L8;FFe87740f909c940f900210091e9af08a90ba559a9eb6b00f9eaa71ea90", - "aad5aa9eae700f90aa55ba9e9ff00f909ed40f9ea2f17a90aad5ca9e9cf00f909f140f9BL8;FFa5e03a9142800991e0031f2ae3031faa340a0094e0431691220080523d120094e1d342f9f2f9ff1748074039e2074091e002009000600291e302009063c01b91L8;FFf7620091e0000054e1825ff881ffff", - "b4e00240f92200805236530094f8ffff17e89340f9c80000b40805088be00313aa0201805201f17dd32e530094e063c13dBBBBL4;FF777205f8762603a9682200f9e8274029683e0139e88b407969420139e94340b968520578e8e34039691205b8e91b40f9689e0139e80b40b969f205f8686a00b9L4;FB", - "b8010000050000009a964800000000003300000000000000a8010000050000009a964800000000003300000000000000ac010000050000009a96480000000000L8;FFf85f45a9fa6744a9fd7b43a9ff030291c0035fd6370080521800809219018052a80640f91f0116eb890d0054e00313aa1af2ff97e80", - "300aae00301aae8fd0737BL8;FFab131638ab435638a9231638a95356384a01084a6b01084aaa331638aa6356382901084aab431638ab735638a9531638a98356384a01084a6b01084aaa631638L8;FFfa0a009408fdff17f37749f97f0600b180030054e19b49f93f0400b140010054810000b4e09f49f9", - "2200805231730094e1a749f9810000b4e0ab49f922008052BBBL4;FF290300f908ff60d3881c00b5000b40921f1800f1821c0054017f0353a11c00343f1000718c0100543f0800718c0500543f040071a00900543f080071c10c0054L4;ZBL8;FF08fbff54d73200f9d6ffff1768018052740e00b95dffff", - "170801176b030800540809c05ae0031faae80b00b9c82e40f904000014009000911f0002eba2f7ff54BL8;FFa302009063000b9104028052c9000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f951280094e10300aae15306f9e0833291a102009021c00a91L8;FFff672a39e84b05f9592", - "8ff97e80300aae0432a91e10000b02188069142028052e30000b063740591e84b05f908000014e04b05f9e0432a91e10000b021880691BBBBBL4;FFf30300aa37030294000380522100805235030294c00100b42804009008ad0f910900f0d20001c03d080940f9080800f9080380520000803d602201a96", - "92200a9L4;FFfb0316aaf62f40f91f0900b15a008052a2000054e02b40f9e10317aa2200805234030094542500b49f0600f1e0230054e10316aa9f0a00f126010014e32345a9L8;FF40010054810000b4601240f92200805238030194611a40f9810000b4601e40f92200805233030194b40000b4600640f", - "9e10314aa220080522e030194742a40f9BL8;FFe00301aa090140f93f0900b1a1000054010300f0217029918200805273830114ff8300d1fd7b01a9fd430091010300f021802991240300d084e01f91e3230091L8;FF810100b4fd7bbea9f30b00f9fd030091080840f9f30300aa22008052e00308aa3483", - "0094e00313aaf30b40f9fd7bc2a8e81f805208000039c0035fd6fd7bbca9BBBL4;FFc902005468008052a903009029c13391e82703a9a803009008813e912a0c8052ff2700a9890300d029c92191e82b05a96a068052e92b02a9290080d248048052L4;FB090100002e00000034684900000000006a00000", - "000000000b00000002e0000000000000000000000080000000000000008000000000000001450470000000000L8;FFe1031caa220080523ac30094e90315aada0000b4e05b40f9e1031aaa2200805234c30094e90315aae0874da9810000b4220080522fc30094e90315aae12340f9BL8;FF610a40f96802", - "40f9deffff17e00313aae10308aa220080523e02009469aa40a9dfffff17fd7bbda9f50b00f9f44f02a9fd030091f30301aa210840f9f40300aaL8;FFe90310916affff904ae136911a0380d20001009000f82f9108210091e1c30e91e9db01f91a00f0f2eadf01f960430094e81f40b9e8c306394d00001", - "42093c13cBBBBL4;FF60e30194f70300aa1f0400b141fdff54e0430591810080525be3019480dd0035e85341b9e8c700b957ffdfc8d70200b4ff0600b100030054f843059199008052L4;FB67697374726174696f6e5f69646c6f63616c5f726567697374726174696f6e5f6964616c6963655f626173655", - "f6b657970656e64696e675f6b796265725f7072L8;FFe30317aaf9830591fe290094e8635e391ffd0371800f00546083c13c6193c03cea030b91e8e30d39e8df43f92003029140f18e3ce9cb43f9f8432d91e1eb803dBL8;FF3c63019408008092681a00f9f44f41a9fd7bc2a8c0035fd6fd7bbea9f44f01", - "a9fd030091010040f9f30300aa3f0400f18b000054600640f9220080522d630194L8;FFf44f02a9fd430091280840f9290040f91f0002f1431a00543f0108eb13601932200100542a0440f91f1040f15369283808050091280800f90202005400fc47d3BBBL4;FF49a3019437a30194e00318aa210080523", - "900805234a3019400ffffb4f80304a93b030036f8031faa2d0000142da30194200a8052210080522ba30194001200b4L4;FF3f0300eb230100543f0b04eba3f1ff54807a1f53007c40935f0000eb5a23999a94269f1a87ffff17fa0319aa3400805284ffff17d60210917f7e00a97f7e01a9L8;FFa100005", - "4810100f021fc15918200805276a30014ff8300d1fd7b01a9fd430091810100f0210c1691a40100d084002291e323009182008052e80700f96fa30094BL8;FFf65741a9fd7bc3a8c0035fd620008052e10314aa44230194ff8301d1fd7b03a9f52300f9f44f05a9fdc30091e90300aae10700f9220d41f83", - "f0002ebc1010054BL4;FFf44f45a9f52340f9fd7b43a9ff830191c0035fd6c0035fd6fd7bbda9f65701a9f44f02a9fd03009113d440a9f40300aa350200b47682009104000014b50600f1L3;ZBBBBBBBBBL4;FF0a00669ecafbffb5f9ffff17200340fd00a8200e0800669e0801c0da0811c0da08fd43d3d", - "cffff17220000f042601091e1a30091030c80527e78009414008092L4;FF00a30091a3c300d1a1031ef8e10315aae20316aab6f8ff97390080929a220129e80b40f9e9634039990200f9881200f9e80b40b989a20039e9b340b8889202b8L8;FF1f0400f120fdff54f44f44a9f65743a9f85f42a9fd7b41a", - "9ff430191c0035fd6f7031faae00317aae10314aa3e1d019480020090008013918302009063001391BBL4;FFfa675aa9fd7b58a9ff830791c0035fd66003009000400b91430300f063401e916403009084201891a20700d1c1048052409d0194fd7bbaa9fc6f01a9fa6702a9L4;FFc0035fd6e10240b99f0", - "a0071ff7e02a9000080d221001b32e10200b9ff1e00f980feff54600640f9a00200cbf1ffff17640240f9630001cb8100018b610e00a9L8;FF62018052b30f00f9879d0094879d0094fd7b41a9f31340f9ffc30091c0035fd6090040b9e80301aaaa0100b04ac10491e00308aa620080523f010071a90100", - "b0BBBL4;FF060000141f0400b1411e00545cdd01941f100031c11d005439feffb505000014e04305918100805257dd0194001d0035e85341b9e80700b957ffdfc8770000b5L4;FB860100003b000000756e61626c6520746f20636f6e76657274207468652073797374656d2074696520696e746f2061205", - "56e69782074696d657374616d704e43L8;FFe80f44f9e88f00f9e81344f9e82b14a9e81b44f9ea2f44f9e92313a9e85344f9e94f44f9e8d300f9e85b44f9e8ef00f9e86b44f9e8e300f9e87b44f9e8f300f9BL8;FF445d0194375d01942005805221008052355d0194007901b4e90200f029d50091280f80", - "52200540ad08800039c80ec0dafc0300aa01048052081002f8e8074091L8;FFe10314aae20315aa0001168b415d0094c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aa2200805246000094610a40f98affff17BBBBL4;FF0800669e1bc101f241fbff54f4ffff1715008092", - "21000014886305d1080140f91f0500b160010054e0e30591816305d1f6e305915b6c0094f5bf40f9e0a30b91L4;ZFL8;FF0900f0f2e0830091e8a70039e91300f957f2ff9709000014e10740f9e10000b4e80b40f9f30300aa22008052e00308aa30fd0094e00313aae01300f9410200d0BL8;FFfd7b42a9", - "ffc30091787d0114096000912103009021403e91a9831ff8240300908460319126030090c6c03d9103200091a52300d1e00308aa02038052817d0194L8;FFe10314aae20316aa0001178b417d0094e802168be81700f97f0600b18096ff54e263009140008052e10315aa3990ff97affcff17e8031faa000", - "116ab224f0054BBBL4;FFa22301d161a6ff9740f7ffb498000014ffdb04a9ff2f00f9a1c20091a22301d15aa6ff9760f6ffb488000014ffdb01a9ff1700f9e1630091a22301d153a6ff97L4;FB5807000005000000ab884900000000002900000000000000440100001b000000ab88490000000000290000", - "00000000004e0100002d0000007369676e65642d70L8;FFeb0f00f92b4c43a91f8120f1e91b00f9e82300f9396842a9e11b0054f80301aaf70300aaebab00a968021891094080524a008052cbff9f52edff9f521c008092BL8;FF6b0500f1ec030daa81feff54a90109abe2000054200108ab62010054fd7", - "bc1a8c0035fd6e90309ab63ffff54a00200f000600991323d0194a00200f000801991L8;FFff0e00b10105005448008092480300f9680080522a0d0014606641f9616a41f9290c40f9e8830f91e1031baa20013fd6fcf341f99f0f00b1a10e005448008092BBBBBL4;FF610a40f9680240f9961240f91f01", - "01eb00340054680640f9490380522a040091e00315aa6a0a00f909692138e10313aa9cf8ff97770a40f9680240f9080117cbL4;FFe0d340f9e2c700f922008052f6030baaf9030caaf8030daaf5df1aa9f7030eaafa031caafc030faaf5031baafb0310aaeabf00f92f0d0094f0031baafb0315aaL8;FF59", - "0d0194fd7b45a9ff830191c0035fd608200091200440a9a92300d10a0000904aa119916202009042cc2c91a8831ff8e9ab01a9e36300914b0d0194fd7b45a9BL8;FF398d0194e10318aaf30300aa2000805273feffb4285440a9f4cf00a9ff0f00f9bf0214eb08070054f4031faae9031faaf50000b46002", - "148be10308aae20315aaL8;FFe87b40f9697e08539706009109693438e87740f9f77f00f9ff0208eb01fdff54e0a30391858c0094e5ffff17f4031faaf5031f2ae9031faa1c03805248008052BBBL4;FF9d16009400e4006fa0833aada0833bada003d53ca103d63ca203d73ca303d83ce33f803de23b803", - "de137803de033803d7f4600b9e00742ad7f0200b9e30b43adL4;FB6a224900000000004f00000000000000d000000040000000361a49000000000054000000000000005900000005000000361a4900000000005400000000000000L8;FFe9d743f9e97300f9e07b0054695340f96027c03de87b00f9e8835", - "739e16700f9e1c30391e99300f9e9d343f9f4c743f9e047803d6093c73ce93300f9e9df43f9BL8;FF08013f911a0380d20001c03d08f140f8e90280521a00f0f2e98316a90000803d08f000f8e9bf00f9e81f40b9e8030639e10740f961cdffb4e01740f91a000014L8;FF6b1540d26b0d0b8b6b2501914a", - "194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aabc20600542a0140b2BBBBL4;FFe10318aa22008052e30319aa54ed0194600a00b4f70300aa06000014e00317aae10318aa2200805232ed019437008052b30000b4e00314aae10313aa22008052L", - "4;FB725072654b65794964496e76616c69644d61634b65794c656e67746800000000000000000000000008000000000000000800000000000000487c420000000000L8;FFfd7bc4a8c0035fd6e8031faa74f7ffb5e00308ab43f8ff54400200b000001c9137ed0094e00313aa22008052230080522400805", - "20e030094610a40f99fffff17BL8;FFfc6f12a9fa6713a9f85f14a9f65715a9f44f16a9fd430491f40301aa3f0001f1f30308aac8000054e80b41b20900809268d200a9690200f91100001408004039L8;FFe0a30391fb0305aafc0304aaf90303aafa0302aaf80301aaf7a30391e52b00f983f2ff97e877", - "40f91f0500b1e00c0054e82300f9e9234fa9e082c33c00630291BBBL4;FFe10315aa220080523aad01948effff1738008052fc6740b932ad0194000480522100805230ad019460fdffb520008052010480523cad0194ff4307d1fd7b1aa9L4;FFf50b40f9fd7bc3a8c0035fd6e00313aaa10f00f9e10315a", - "ae20314aac2feff97a10f40f9750a40f9eeffff17ff0302d1fd7b02a9fb1b00f9fa6704a9f85f05a9L8;FF400080524100805237ad0094e00b00f9201f00b433ad0094400080524100805231ad0094e00700f9601e00b42dad009440008052410080522bad0094e00300f9BL8;FFeac742f9fbcb42f92087", - "17ade89308b9e11f00f9a1170054e20f4ba9e0031691e56340f9e4031faadedbff97e8c342f9200bc03dfbc742f9e9db42f9f5cb42f9L8;FFe9a20991ea6f01f9e02b4fa9eb7301f92001803d09214e29e90303b9e80703b9480d40f900013fd6e0e302f9e8074091e1e702f908011891290c40f9e163179", - "1BBBBBBL4;FF23feff54680240f97f0a00f99f0208eb68050054e1031faaf50314aa08011fcb9f0208eb88060054950700b4e10240f9760a40f9680240f9080116cbbf0208ebL4;FF85000014c022009116f3ff9708008092880200f9b50000b4e0031caae10315aa2200805233150094e19341f9810601b", - "4e09741f9300800143f0900f1e11a0054L8;FFa80b0054a800805209018052680200b9616a29f8f44f44a9f65743a9fd7b42a9ff430191c0035fd6211a00b40900c039281d0012090cf836090440391f810371BBL4;FF11ffff17e0030391e10315aae20318aa2300805224008052a587ff97fad74ca912f", - "fff17400300900060389134950194ff8307d1fd7b18a9fc6f19a9fa671aa9L4;ZBL8;FF2925019129fd46d30801098b000500911f0009eb28dfff54800100900000149137950094800100f000a00f9134950094fd7bbea9f30b00f9fd030091f30300aaBBBL4;FFa2a302d1e003082a60beff97a0faffb4d", - "3010014a9a300d1a2a302d1e003082a2161009168bfff97c0f9ffb4f2010014a0a302d1b4d50094e80300aae00301aaL4;FB51205261746368657420563120436861696e204e65787400e8204900000000004900000000000000e600000009000000e8204900000000004900000000000000L8;FFe9a310a", - "929a04ba9e9b700f9eaa318a929a84ca9e9eb00f929a04da9e9a700f92ba44ea9e88f00f928a007910001c03deba300f92ba04fa9e0f3803dea2f13a9BL8;FFc8170094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb2816005426000014fa031faaf69f49f9f", - "407409194820991L8;FF081100b4e883329140630291ea7cfe97e85346f91f0500b160080054e02bc33de85b46f9e07f823de80305f94c000014fb4340f9f4833291480f00b4e89b40f9BBBBL4;FFe00702a9e1030091e00316aa62008052e30315aae40314aae82701a980cb009428008092e0220039e80", - "200f9b80000b4e00313aae10318aa220080522df50194L4;FB70726576696f75735f73657373696f6e730000000000000080954800000000005500000000000000ce000000010000006661696c656420746f206465636f6465L8;FFe00302aaf30302aaf40301aa23f4ff97e80300aae00301aa080200377", - "50240f9a80640f9160100eb62020054e80f41b2e80300f907000014c90080d248008052BL8;FFf30300aa088c41f81f0500b140000054e95dff9768d240a9090080927f2601a9940100b41321009104000014940600f173620091e000005461825ff881ffffb4L8;FFe28352b9e343169180008052d61400", - "943f0700b1a0100054e1d342f9e8cb42f91f0101eb60c10054eb074091e8cf42f92a0400916b8109914902805260c10091BBBL4;FF2000001419020034e8030091e10314aa9a02028b0001198b3eb50194e83340f9e0020191e10300912200805208050091e83300f962b50194ffff0039f50318aaL4;ZDL", - "8;FF28e379d3e0031aaa02018052011119cb38b50094e80340f91ba300a908008092080300f9950400b4e00316aae10315aa22008052f44f4ba9f6574aa9f85f49a9BL8;FFe2db42f9e5f35639e1032d9126008052b1e5ff97e85b42f91f0900b1c07a0054c90080d20900f0f2294500911f0109ebc08d00", - "54e02fc13de133c13de0031791L8;FF0005803d800bc03d0009803de9c704f9a88357f8080540f9c82500b4a02302d111f5ff97f60301aa004d0037c8fe60d3082300b5c00a40921f1800f142230054BBBBBL4;FF8a2eaff2e08702a9e02300914a8cccf2ff7f04a9aa8ceef2ff1f00f929000aca418840a", - "9e8a701a9d8890094e81f8052e0230091a173009122008052a8730039L4;FFe20316aa23008052240080521ee6ff97f80f40f9e80740f9080118cbdf0208eb09f2ff54e0230091e10318aae20316aa230080522400805213e6ff97f80f40f9L8;FFe10000b4601640f922008052f44f42a9f65741a9fd7bc", - "3a836050114f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f50b00f9f44f02a9fd030091010040f9BL8;FF2203009042340391ea0f00f9e343009155850194fd7b43a9ff030191c0035fd608200091094000912203009042a80591200440a9e82700a9e8030091090000d0L8;FFf44f05a9fd03009138", - "404079f30301aaf40300aaf7031faa190380522e0080520600001438c11f783be11f78f7060091ff4200f1a00c0054e852199b89c240f9BBBL4;FFb6035ff8a8035ef8080116cb1f0308ebe9ebff54a08300d1e10316aae20318aa2300805224008052a1b7ff97b6035ff857ffff17a08300d12200805223", - "008052L4;FB75626c69634b6579436861696e73656e6465725f726174636865745f6b657973656e6465725f726174636865745f6b65795f70726976617465636861696e5f6bL8;FF3f0900f161040054e16740f9810000b4e07f42f92200805236c50094e17740f9c10100b4e05f40f90a0000145cfbff17", - "d90000b4e07f42f9e10319aa22008052BL8;FF080900d10f000014c80080d2a1831df80800f0f2080900d11a000014e80b41b2e00b00f907000014e80b41b2a0831df814000014c80080d20800f0f2080500d1L8;FFf90303aae21b00f9f50301aab70302d1f4030591f86afe97e84346391f05007180020", - "054881245b8e99741b9e00315aaeb2b5aa9a80318b8e8c34639e93200b8BBBBL4;FFe10315aaf44f44a9f90b40f9f65743a9f85f42a9fd7bc5a838e50114fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9L4;FB74632f343861323239636561656664343938356", - "335303939306231343131366236643835366166303938352f6c6962726172792f616c6c6f632f7372632f7374L8;FFf5df02a9f51f00f9f96b0829fb630929f45300b9e82f00f9f1620094e0a300917f0200f902e0ff97f44f5ea9f6575da9f85f5ca9fa675ba9fc6f5aa9fd7b59a9BL8;FFa0835cf8a0ff", - "ff17fc031f2ae80700f910000014ea3340b9eb6b40793c008052a9831c38e92340f9ea2b00b9ea234139a8931cf808fd78d3b8835cf8ed330029L8;FFd6a20191c0020054c1025df8810000b4c0825df82200805236650094c1825ef8810000b4c0025ff82200805231650094c10240f9810000b4c00640f", - "922008052BBBL4;FF345440a900e4006f16dc40a9040c40f9220840f9182040b9a0c302d19f0600b1e103959ae30317aae08300ade08301ade003803dc1efff97a0877ead68030090L4;FF00e040f9221440f91f0003eb1820839a420c00b535cc41f9bf0600b1a0010054b50400b4b602188bc81a80d2e0", - "0316aa010000d4df0200eb8006005480021091L8;FF68220191a1010090219c1591a40100f084200b91a32300d182008052a8831ff881a50094b40100f094e20491a1010090212c1691a32300d142008052e40314aaBL8;FF56250194886a4039696a4039b502000a1f01096be0179f1a50250194886e403", - "9696e4039b502000a1f01096be0179f1a4a2501948872403969724039b502000aL8;FFe18318ade00740ade18319ade08753ade08714ade2034bade28315ad0801005400030191e10315aae20314aa3925009488021a32e83f0c3921000014a00640adBBBBBBBL4;FFe003009193f50094e00313aabe1901", - "94e80300aa28f70736e00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6e00313aab4190194e80300aae00301aaL4;FF69520039f44f45a9f65744a9fd7b43a9ff830191c0035fd6a00000f000602e914b190094ffc303d1fd7b09a9fc6f0aa9fa670ba9f85f0ca9f6570da9f44f0ea9L8;FFfd7b", - "41a9ff030191c0035fd6e0030091f35b00a98ff5ff97600200f000801a913a190194600200f000e01a9137190194600200f00080229131190194ff0301d1BBL4;FFe10314aae9231aa989008052e80b01f9e82301f9e80313aaf7db11a9f7e712a9f8e713a96083873ce93301f9ff3701f96ebeff97ff830", - "a91f44f45a9f65744a9L4;ZFL8;FFab831838abb35838a9931838a9c358384a01084a6b01084aaaa31838aad358382901084aabb31838abe35838a9c31838a9f358384a01084ac00640adaad31838BBBL4;FFab0f0094d6ffff17c80300b0080110918902805222000014e89343b8e93f40b9e0830091eba", - "b44a9e1e30091a80319b8e863413909b306b8e92340f9e8230039L4;FB4865616465725265636569766564001b737071722076312e73656e645f63742e726563762065706f636820c01f3a2043743153616d706c6564202d3e20437431L8;FFe69f43a9e0bf46a9ed0316aaea6341a9f0031baaebb344a9e", - "30317aaf70315aafb031aaafa031caa89008052e97300f91b00001428a00791fa8b00f9fa0317aaBL8;FF60c1009109692138ead302f9081e0094e1431691ea110094e0df92b980010034e1d342f9e8cb42f91f0101eba0c60054e8cf42f9090180522a04009109692138L8;FFcaf2ff979c6300917b0700", - "919f0314eb41efff5400030014e8cb45f9090d8052e037c33d6822099b000d803de03bc33d0011803de03fc33d0015803de98346f9BBBBL4;FFe823009120013fd6e80740f91f0900b141030054880200f9680080522f000014770240f9761a40b9f50301aa2df9019400028052010180522bf90194c0050", - "0b4L4;FB696e742070617273696e67206572726f723a20c0001f496e76616c69642066696e6765727072696e7420697465726174696f6e7320c00012696e76616c696420L8;FFe00314aae22fc03de86340f9a0873cade08742ada2039b3ca8031cf8a0873aade28343ada2833bade18340ada18338ade28", - "341ada28339ad1af3ff97a0877cadBL8;FF49000014a0031cf8010300b021182e91030300b0639c2791a00301d162028052840180523e000014f80300aa3e000014a0031cf8010300b021182e91030300b0L8;FF480340391f050071e0420154f91700f934790094007880522100805232790094407801b4", - "e807409102788052f90300aa08810991fb1300f9010140b235790094BBBL4;FF0800f0f268a600a9a88357f809008092690200f9e80700b4a00358f801f57ed34200805233b901943a000014e80b40f902000014e80f40f9680a00f931000014L4;ZBL8;FF830400b4ff4302d1fd7b06a9f65707a9f44f08", - "a9fd8301914800403909150071a8c31e38020400541f0900716d0400541f1100710c0700541f0d007181100054BL8;FFfd7bc1a8c0035fd6a00200d000002e913b390194a00200d00060299138390194a00200d000c0099135390194fd7bbfa9fd030091081840b9c8050034080140b2L8;FF685e1f39690", - "100f968c25339693642f9e00600ad22210391400941ade00a01ad010341ad020f40ade883103968620f917fc61339810301ad6032c13d6136c13dBBBBBL4;FF8900f8b7280400914a0400d115000014f70303aaf60300aa5f2800f1880000542800028b08f1df38a805f837e023009104720094e80b40b96", - "8f60737e80f40f9L4;FFc0035fd620008052c101805246090094ff8301d1fd7b03a9f52300f9f44f05a9fdc300915f0c00f1f30300aa89040054f50302aaf40301aa2a090094c0018052L8;FFe92b01a96a090194fd7b42a9ffc30091c0035fd6281040b96800c8376800d03754090114850901148509011", - "4ffc300d1fd7b01a9f31300f9fd430091e90301aaBL8;FF69a200a908008092680200f9610000b42200805237890194680700d11f0d00b1a8000054e0031caae1031baa2200805230890194280700d11f0d00b1a8000054L8;FFe20317aa43890094e84b41f9a80000b401f97fd3e0031aaa420080523589", - "0094e9a34da97f0600b1b6031df8e94b01f9e84f01f9e8030a910005c03d0065803dBBBL4;FF0a018052ff0308eb28008052a1030054b47c039b0b00f0d2f50304aa6b0104cb9f020bebe8020054010100b4a17c019be00302aae20315aae30314aa48c90194L4;FB0800000000000000140246000000000", - "0000000000000000008000000000000000800000000000000c00246000000000000000000000000000800000000000000L8;FFe86b00f9e8ff5e39e237c23de0d7803de023c23deaef43f92841082a69914bb8e10b19ade127c23de22fc23de417c23d3b8108aae9ff43f9eccb43f9e00717adBL8;FF2200", - "80523b490194c10e40f9a1fdffb4c01240f92200805236490194e9ffff17681a40f9280100b4090d8052e00314aa017d099b02018052f44f42a9f65741a9L8;FF770a40f917f7ffb5e80317ab23f9ff54000100b00080369139490094490080524afdff35ea031faa4901098b200108aba2010054f44f44a", - "9f90b40f9f65743a9BBBBL4;FF09a900a92900805209010039c0035fd6fd7bbca9f85f01a9f65702a9f44f03a9fd03009133d040a9f50301aa381840b9f60300aa940300b42ae90194e00314aaL4;FBe41f400000000000200000000000000008000000000000002c8a400000000000456d707479496e766", - "16c69644469676974506f734f766572666c6f774e65674fL8;FF28008052ff0f00f9ffa300a9a0e300d1e12300916d2a009428008052a083dc3ca183dd3ca283de3ce82300f948008052e08700ade203833ce80700f9e0230091BL8;FFf44f42a9f65741a9fd7bc3a8c0035fd600018052010480524e6901", - "94fd7bbea9f30b00f9fd030091f30300aa2d69019400028052010180522b690194000100b4L8;FFe9bb00b9684308f8a040ff97fa0301aae106f8b6fb031faae0031baae1031aaa416900942f690094e0028052210080522d690094c01c00b4480100b008612b91BBBL4;FFe0031faa030000143aa901942", - "0008052e81740f91b5f00a91b6701a9000540ad136b02a9e92344291c1b00f90083833c09230d29e85740b90183843c00d305a9L4;FFf3ffff170004009101f05f38a10000343fbc007181ffff54400000f9faffff17e00304aab7000094e09740f9bbffff97e1834ba93f0000eb80020054e5230191L8;F", - "Ffa6f00a9e00705ad0081c23c0181c33ce233803de00703ad0081c43c0181c13ce433c03de01704ad0081c03c08fc83924803088be00702ade00b45ad1f0109ebBL8;FF40030291e10315aa080102ab2935899ae87b01f9e97f01f940290194c8de7992c21a4092e0c30891a102088be2bf0a39382901949", - "44200919f0219ebc1faff54L8;FF08212c91e8ff07f9c80000f008c1089169038052e8030bf9c00000d000083591e80b0bf9c80000f008610891e1833f916300189162008052f5f307f9f6fb07f9BBBBBBL4;FF43290054ea0240f9e00b40f94801088be82600a9680240f9080540f9170100ebe20000540", - "6010014e003082ae20313aae303162a40f7ff97c01100b57c0240f9L4;FFef7e0853dc7d1853f003182ae9c700f9f703082ad2030014d8fd78d3e9031aaa3a7f085328ff60d3eb7b42f9ed7f42f937fc60d33cff78d3ea03012ae1ab40f9L8;FF691e40393f910171a1030054692240393fe900714103005", - "473260091baffff17e0230091e10313aaf40308aa0effff97e82340391f050071e1030054e093c03cBBL4;FFab83ff97f45b41a9e2feff17e0230091e10316aae20317aa2300805224008052a383ff97f45b41a91dffff17e0230091e10316aae20317aa2300805224008052L4;ZDL8;FF08a440a9aa4300", - "d1200440a9620100f042dc1191a8273fa9e8ffffb008e13391ea2301a9e34300914f910094fd7b44a9ff430191c0035fd608100091200440a9BBBL4;FFea3b40f92b2101a9e80f40f92a2102a9ea2740b9e80740b92a210629ea1b40f9e82b40f92aa103a9e80740f933a104a9e82740f928d505a9e81740", - "b928610d29L4;FBd893762144d4a28c04fcfbac0000354c97021be16a616a70eec33090a9c57de84c2d12022f005e16bc2dfeb0758af76124dfd9c80e34e2c4c47b8b98c369fbd6L8;FFe9b700f90a254ca9e9eb00f9092d4da9eacb00f90aa107914101c03deba700f90b7140f9e99b00f9e9ab43f9eb8f", - "00f90ba94ea9a9031ef8e9f301f9097d40f9BL8;FF00630291e82703a9f62351a9e95750a9a0839d3ca8031df8e8a30391e92700f9207aff97e8630191e0a30391a1c300d1f4630191e7abff97e8c30291e2630191L8;FF3c510094ffa71139e89740f91f0500b14106005433000014a082c03ca182c13c2", - "80100f0a282c23c400707ad4243803d08b140f9a80300b4080000d008c10191BBBBL4;FFf44f05a9fd030091ffc308d1f803022af90301aafa0300aaf70308aa9bc80094f40300aae00319aaf30301aa97c8009408040090088123911f03007189028052L4;FB1201000014000000696e76616c696420736", - "56e64657220636861696e20707269766174652072617463686574206b65796d7573742068617665206265656e2073L8;FFe10700f90800f0f2080900d107000014e80b41b2e00700f904000014c80080d20800f0f2080500d1e80300f9e00300914fe6ff97e10300aae10300f9210200f0BL8;FF0a1c40f9", - "5f0500b1e1faff542801088be80308ab02080054090840f9490500b40a0440f9ec031faaeb0309aa4a6100914d0140b90d040034ad0140b2ad11c0daL8;FF080d088b0825019109fd46d30800098b080500911f0109eba816005439000014f9031faafbab49f9fa0740915a8309917f0700b18017005440c", - "303914c250094BBBL4;FF08040036e02740f9e11340f9a86303d1ec9c0094a88352b81f050031c011005408008092fc2b40f9686e00a9e83b40f928fdffb4e02740f9e13b40f922008052L4;ZBL8;FFff6301f9e86701f9ff7701f9e87301f9ff7b01f9e87f01f9ff8f01f9e88b01f9ff9301f9e89701f9f", - "fa701f9e8a301f9ffab01f9e8af01f9e8bb01f9ffbf01f9BL8;FFe8c31d91a04700d1e86b04f968008052e1833291e97f06f909078052e86b06f9880200f008d52391e96706f9290080d2ea6f06f9e93ec0f2e87b06f9c8048052L8;FFe85305f9ff5705f9ea5f05f9e86b05f9e96f05f943310094550000", - "14e0c32491afefff97e1f341f9f8c30d91f94308913f0400b1e0150054fb6b4ca9810000b4BBBBBL4;FFe00318aa2100805237010294401100b4e1031aaae20318aaf90300aa3d010294c00642a9a21300d1bcc31fb83efcff97c80a40f9880900b408fc79d3e1e7076fL4;FF21035ef8810000b420835ef", - "8220080523801009421835ff8e1feffb4200340f92200805233010094f3ffff17e85240f9c80000b40805088be00315aa02018052L8;FFe10317aae20314aa230080522400805217170094770a40f9c9ffff17a8831ff8a84300d1e900009029012291400200f000d40c91e8a700a9a82300d1620200d0BL", - "8;FFfd7b01a9f31300f9fd430091130040f9e00301aa010300f021e02291e8030091420280527f810194010300f021282391240300d084400a91e0030091a3630091L8;FFe20319aa00011b8b428100946803198bfb0b40f9fa0f40b9e81700f9b8010034e11740f9e80f40f91f0101eba09b0054e81340f", - "9090280522a040091e00318aaBBBL4;FFf65746a9fd7b44a9ff030291c0035fd6ff8301d1fd7b02a9f71b00f9f65704a9f44f05a9fd830091090c40f93f0500b160060054095440f93f0500b160070054L4;FB7372632f6b656d2e7273002163616e6e6f7420616476616e63652070617374206072656d61", - "696e696e67603a20c004203c3d20c0002f636172676f2d72656769L8;FF6282823c6082803c6182813ce00743ad751e00f9600604ade20344ad620205ade10341ad610202ade20342ad620203ade00740ad600606adff431691f44f45a9BL8;FF8affff17f50300aae00313aa2200805240000094610a40f", - "9e00315aa92ffff17e00313aa220080523a000094610a40f9a1ffff17e00313aae10317aae20315aaL8;FF010040f9f30300aa810000b4600640f92200805237410094610e40f9810000b4601240f92200805232410094612640f93f0400f18b000054602a40f922008052BBBBL4;FFe10319aae2031f2ae", - "0023fd61f0000f1cd000054390300ebc39d00541803008bf9feffb50f0000141f0400b1219d005453e101941f100031a19c0054f9ffff17L4;FB76656e646f722f6c69627369676e616c2f727573742f636f72652f7372632f63757276652e7273001e45435075626c69634b657920646573657269616c69", - "7a65L8;FFe203012ae103002a74390094e003012af44f42a9fd7b41a9ffc30091c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1BL8;FF08a440a9e20301aae00308aae10309aa83610114ffc300d1fd7b02a9fd83009109200091e80301aae50300aaa9831ff8e", - "90200b02b813291e10200f021000691L8;FF0bffff17e90b41b2e9a300a910ffff17c80080d20800f0f2080500d104ffff17c80080d20800f0f20809009100ffff17c80080d2e10b00f90800f0f2080900d1BBBL4;FFf90302aa1400f0f2e11b00b91f0500b1600500541c1440f9153040b9f803012af703", - "00aabc0500b4f31240f92da10194e0031caa210080522ba10194603900b4L4;FF3f00036b4cffff54031840b96324c11ae3fe0737031c40b96324c11a83fe073703cc749224000090840042f9630040f97f0004ebc1fdff5403404079642c46d3L8;FF810100f021802091e8030091e200805284a1009481", - "0100f0219c2091a40100d084802791e0030091a363009162018052b30f00f97ca100947ca10094fd7b41a9BL8;FF210280524921019448060037e0031f2af44f45a9f71b40f9f65744a9fd7b42a9ff830191c0035fd6e0230091e20301aae10308aa69fdff97eaaf40a96901158bBL4;FF150340f9f60300", - "aa080014ebe3100054ff0208eb09010054e0e30091e10317aa2200805243fffe97f42344a91f0114ebe3100054e81f40f9e10315aae20317aaL3;ZB" + "BBBBBBBBBL8;FB9d00ad00570000012401bb004d01730045014f0065001c013400a5002600e40032018501f2000e017201920194008600b9010e00a301b1015b01d60069013c00L8;FF890240f91f0109ebe933899a080109cb090e80520829099b1f0900f99f031bebc20400548aa240a9a09300d189024", + "0f908011c8b1f0109ebe933899a080109cbBL8;FF611240f9810000b4601640f92200805209250194611e40f9810000b4602240f9220080520425019460620191f30b40f9fd7bc2a85efeff1761ce40f9810000b4L8;FF24008052a7010094770a40f9c9ffff17a8831ff8a84300d1290000d02961309100", + "fdffb000440691e8a700a9a82300d142fdffb042a00791e1230091e8a701a9BBL8;FFe1031f2a828e40f99a9640f9e3031f2ae8630039e90b00f9a37a01945f0700b1a0000054882653a92b0080528a4241b903000014eb031f2ae8031faaac835fb8L8;FFe10300aa74000014c80080d2e0430039e02300", + "910800f0f2ff470039e80700f93e6bff97e80300aa81fdffb021003991a3fdfff063e02591e023009102018052BL8;FFe8ffff17888241f81f0500b1810000549fde01a99ffe02a997fe03a981620091e20313aa5bf4ff97a0fbffb454000014800b00b5e00313aabbf1ff97e80301aaL8;ZDBBBL8;FB745", + "2616e646f6d6e657373000000000042024000000000006a00000000000000190000001c00000042024000000000006a00000000000000e30000002e000000L8;FF0400001473c201f1d6c2019160040054e11740f9e80f40f91f0101eb00030054e81340f929040091e00316aae91700f9176921382aedff", + "97e16300914b92ff97BL8;FFe082c53ce282c03ce18303ade082c13ce28301ad41010194c81a00121f810071c21a0054e80700b9e8430691e04303916f010194c8fefff008413b91ff7f01f9L8;FFe20315aa3800158b190115cb11050094620215cb8002158be1031f2a71050094d80e00f9f9ee03f9f44", + "f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6BBL8;FF6b2501914a194b8b4a0500916b2281b9cb0e00346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0500916c8e40f90c0100b48c0140b28c11c0daL8;FFc000f8b6f40300aaf6031faae00316aae10314aa44410094a00100b", + "4f50300aa08450094e00315aa21008052f40315aa36008052ff440094a0feffb4080740f9L16;FFe2df43f9e4e343f9e8ff00f9e8db43f9faeb43f9f7ef43f9e1f343f9fef743f9e8a71aa9e8ff43f9e9e743f9e70b44f9ec1b44f9ed4f44f9e8b700f9e80344f9BBBBL8;FBa49f420000000000fc9c4200", + "000000000c9c42000000000090a14200000000001ca3420000000000e4a1420000000000a0a44200000000002ca1420000000000L8;FF6901084aabf35738a9d317384901084aaa035838a9e317386901084aab135838a9f317384901084aaa235838a90318386901084aab335838a91318384901084aBL8", + ";FF7a1101146b1101146c11011409004039e80300aae00301aa2a0900d13f09007149819f9ae90000b43f0500f161020054e1fefff0213c3291e202805235110114L8;FFa8c2ff97e03b01b9a04700d1a5c2ff97e03301b9a04700d1a2c2ff97e02b01b9a04700d19fc2ff97e02301b9a04700d19cc2ff97", + "e01f01b9a04700d199c2ff97BBL8;FF7de0ff97b9035cf8e8feff17a04301d1e10319aae2031baa230080522400805275e0ff97b9035cf8a8035bf8080119cb7f0308eb69ddff54a04301d1e10319aaL8;FF420344ad820304ad410341ad810301ad420342ad820302ad410340ad810300ad800745ad8233", + "c03de8bb42f9766e00a9623a803d600606ad800743ad687a00f9L16;FFe023823de127823d008545ade31b823de21f823d0201ca3ce117823d010d44ade013823de00bc03de20f823de0ef813de107823de30b823d944e0094e0dfc03dBBBL8;FFe00313aae10317aae20315aa2300805224008052780000", + "94770a40f9680240f9080117cbbf0208eba9efff54e00313aae10317aae20315aa2300805224008052L8;FF7d2a0094e1431691a70d0094e0a349f9800100b4e1d342f9e8cb42f91f0101eb406b0054e8cf42f9090180522a04009109692138e1431691ead302f99a0d0094BL8;FFf65701a9f44f02a9fd0", + "30091140040f9f30300aa9f0600b1e0020054611a40f93f0400b140010054810000b4601e40f92200805200f50094612640f9810000b4L8;FF0600038b136863f8650a40f9df0005eb80000054000080d21f000039007d20d467824039e31000129f02036be91040d38d000054000080d21f000039007d20", + "d4BBL8;FFe8031faaf98792b939010034290340b22911c0da291540d2290d098b2925019129fd46d32905009102000014e9031faaf88b92b9380100340a0340b24a11c0daL8;FFe0d341f9e34740f9e45b40f9a8e3fe97fc4b45f9e082c03ce9432a91e85745f99f0b00b1c002803de8a304f921090054e8", + "a344f9e9831f91c002c03de95303f9L16;FFa08b3cada1833dad46180094a20f7cade84f42f9a1037badf43b02f9e83b00f9480080d2e313813d0800f0f2a3137dad16090091e00b813df52342f9e20f813dBBBBBL8;FB656d6f74655f726567697374726174696f6e5f69646c6f63616c5f726567697374", + "726174696f6e5f6964616c6963655f626173655f6b657970656e64696e675fL8;FF0d9d0094a13e40f9810000b4a04240f922008052089d0094a14a40f9810000b4a04e40f922008052039d0094a15640f9810000b4a05a40f922008052fe9c0094BL8;FFc1ffff17fd7bbca9f70b00f9f65702a9f44f03a", + "9fd030091f30301aa210840f9f40300aa680240f91f0101eb600e0054680640f92a040091e00314aa49018052L8;FFb50000b4e00317aae10315aa22008052091d0094bc035ff85c0600b4c80adc9a08d91c9b080600b5f8e700a9b8835ef8760c00b4f50b40f9f90316aa04000014BBL8;FFe8ff0139a00", + "303d1a18302d1600743ad6223c03d624f803d608708ade00743ad608706ade00b44ad608b07ade00742ad608705ad81220094a10303d1e00316aaL8;FFa02302d117f5ff97800a003621f8ffb4dc01001401c30091a22302d133f4ff9780f7ffb49c010014a22302d1830c8052faecff97e0f6ffb4ea0000", + "1401630091L16;FF6a0a00f909692138e10313aa57eaff97e00314aa088c44f81f0500b160000054e10313aa3dfdff97950a40f9550300b4610a40f9680240f9960640f91f0101ebBBBL8;FFe90b40f98a0640f9480109eb030b00548a0240f94901098b892200a9680240f9e0031faa090540f934000014", + "5f2800f1880000542800028b08f1df38c808f837L8;FFe8f34df91f0900f1203c0154e0074091e10740910232805200c0359121802f91f44325910b7d0094fc074091e00740919c83099100c0359188830e9159edff97BL8;FFf50301aa29fddfc8f60300aaf40308aa3f0500f101010054c92240a9a8020", + "8cb280108eb62060054c0feffd00000099159f90094d306f8b7730200b401fd0094L8;FFf30300aae023009129f87fd33f2100f13481889ae30314aad7ffff97e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6BBL8;FFabf35738a9d31738a90358384a01084a6", + "b01084aaae31738aa1358382901084aabf31738ab235838a9031838a93358384a01084a6b01084aaa131838aa435838L8;FF081140f900013fd6fadf49a9fb6340f9f55b40f960c603f961ca03f9bdfdff1760e213914ef7ff97b500001461fdffd021a02191e0830f91c208805213120094L16;FFe10f00", + "f9e1031c91e99b03f92093803cf9831d91e88f03f9981c0094e8b343f91f0900f1616e0054e10f40f9416900b54c0300141f0f00b129100054fb031faaBBBBL8;FB1af8d33a8fedd8868d89f5fd19435e27785ced96d7a7d1a0a28cb5814e32a71683e900000821b001438b3a1128e3102805f6cbe5d42d0", + "7a138d42ab285635bbcL8;FFb5060091bf0219ebe0260054a8621c9b140940f974ffffb4130540f997fa7fd3088d0094e00317aa41008052018d0094003e00b4e10313aae20317aaf5df07a9BL8;FF41320054e80345f9e07fc23de9c32291e9bb03f9c9048052c0feffd000542c91e86304f9e8ffffd008", + "c11d91e1c31d91e3c31791e8bf03f9e8feffb008210c91L8;FFd50000b4e80740f9e10314aae20315aa0001168b0f0d0094e003c03de10f40f9c802158be80b00f96002803d680a00f9210100b4e00314aa22008052f44f46a9BBL8;FFf4031baaa10300b4f70300aa0d4d0194e0031aaa21008052064d01", + "94800f00b4e10317aae2031aaafb0300aa094d0194f7031baa13000014024d019460028052L8;FF6249009480fdffb000a023915f490094fd7bbfa9fd030091083c40f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091092440f9L16;FFf63f40f9b1008052fe6740f9ef6", + "f40f9e10310aae80740f9e9bf00f9e90317aae3e700f9f7031baafa5740f9f17300f9f1d340f9e30306aaf21314a9f2e340f9BBBL8;FFa90358f868de013969f206f8e8a742a97bf203f87c7204f868e207f8a8035d78696208f8a9835cf8682e0179e85f40b969e208f8e92b40f9689a00b9487d1053L8;", + "FF00b82f9108210091e1430691ea2f19a9e90702f91a00f0f262690094e81f40b9e8030639e10740f9c1f7ffb527feff173c008052e8430691e0430f918101ff97BL8;FF28008092e1c30391e20313aafb0318aae87b00f9a6060094f8674fa9f50300aaf6df50a9202300b4080b00911f0900f143240054", + "b80000b4e00319aae10318aaL8;FFfd030091fdffff97017c4093060080d2050080d2040080d2030080d2020080d2200780d2f1ffff971f10003100109f1a007c409363f6ff97fd7bc1a8c0035fd6BBL8;FF1f0308ebc9000054e0431691e1031aaae20318aac1100094fad342f9fc0740919c83019144fe", + "ff17e043169122008052ba100094e1d342f94efeff17e0431691L8;FFd60600f1f7620091e0000054e1825ff881ffffb4e00240f922008052062d0094f8ffff17e89740f9c80000b40805088be00314aa0201805201f17dd3fe2c0094L16;FF210100ad220341adfc2301f9220101ad29feffd029612591e", + "97302f9e9030991ea7702f90a018052e97b02f9ea7f02f9eb8302f9e88702f9a3130094bc9374a9BBBBBBL8;FB72730076656e646f722f6c69627369676e616c2f727573742f636f72652f7372632f63757276652e72730022616476616e6365206f7574206f6620626f756e64L8;FF200080527b0100d07", + "f021ceb400500547546407857034079ff02156b60ffff5408ffdf88e801003568034039a102174a1f050071c1030054e2031f2a4c070094BL8;FF28fc60d3681000b5200840921f1800f102110054217c0353211300343f0800718d0100543f0c0071600200543f100071c00200543f14007141040054c12", + "20191L8;FFf7ef43a9e017c03df62740f9e00b803dfafe48d398faffb5d7ffff17370080523900809248ff70d349ff60d3990200f997220039883e0039e80340f989d20078BBL8;FFff1302f9f81702f9fffe02a9ff7e04a9f82302f9f82f02f9fffe05a9ff7e07a9fa3b02f9f84702f9fffe08a9f85302f", + "9ff5702f9f55b02f9f58f02f9f5a702f9L8;FFf44f03a9fd830091480001aba2020054010840a9f30300aae023009129f87fd31f0109eb0881899a090180521f2100f11481899ae30314aa6d0e0094e80740f9L16;FFe10700f90800f0f2080900d1a6ffff17e80b41b2e00700f9a3ffff17c80080d20800", + "f0f2080500d19fffff17c80080d20800f0f2080900919bffff17e00300f9BBBL8;FB30f845000000000018000000000000000800000000000000380d46000000000030f8450000000000200000000000000008000000000000007c0e460000000000L8;FF80390054e81340f9490480522a040091e00315a", + "aea1700f909692138e1630091528eff97f71740f9e80f40f9080117cbbf0208ebc8380054e81340f9e10316aaBL8;FFe80315aa958200910801168b00008092e10315aae80f00f97afd00941f0400f161010054bffedfc8810240f9810000b4800640f922008052ff000194e00314aaL8;FFeb074091ec03", + "01aa0d1440382d0100392d014039adfeff348c0500f14d15003841ffff54f80308aae80300911f692138e00300910101a0523b0a0094a001f836BBL8;FF14410194e00315aae10313aa22008052930a00f9f44f43a9f65742a9f85f41a9fd7bc4a80441011440ffffb000602891563d019420008052e1031", + "3aa3a3d0194L8;FF756641f9e80240f9200705ade9d302b9680000b4e00315aa00013fd6e10640f9810000b4e20a40f9e00315aa024100949f0b00b101120054689a42b91f090071L16;FF68de07a9e8df40f97ba208a9e98740f9e8af40f969a209a9e9c740f9e88b40f969a20aa9e9b740f9e8cb40f969", + "a20ba9e9eb40f9e89b40f969a20ca9e9a740f9BBBBL8;FB93d76342c9befb1d89ce94573302d5ae1859337f110eb703d6ff434858191ed7683db94e69ee5cf62c0f438f5ca7a02d0b70b64fd4ad0000c45894099bfd5919L8;FFfd7b44a9ff430191c0035fd608200091200440a9a94300d1eaffffd04aa1", + "1a91e2fdff9042102491a8031ff8e92b01a9e3430091418d0094fd7b44a9ff430191BL8;FFe063179140afff9708068052e9f342f9e07fc13d6826089be183c13de287c13d69060091000500ad0209803de9f702f9e083329130ebff97fc9740f9e89b40f9L8;FF490d009420008052c1028052460d0094e", + "17342f9e0af40f9430d00942000805201c480523f0d009420008052018c81523c0d00942000805221c480523a0d0094BBL8;FFe84b02f9d6020acb9402098bff4702f9180300941b0000140a510194400280522100805203510194e01e00b4f80f40f9e90740f96affffb04a212991f70300aaL8;FF4a194", + "b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8bL16;FFe9032b91e8ef01f9e1430f91e8f701f968fefff008e11e91e3ef00f9e3031d9162008052e03300f960feff9000d00b91e9eb01f92903805", + "2e8a303f9e8ab03f9BBBL8;FF08008092e303042affa304a908018052f3230091ffff01a9ffa303a9fdf7ff97600c00b4e10740f9f40300aa810000b4e00b40f922008052ff700194e11340f9L8;FF810000b4000740f9220080520a710094a0077dad7b0200f9e8a743a96082803ca003dc3c6182813c60", + "82823ca1037bad092300a9e81b40f96182833c6082843cBL8;FFc9fdff9700fe073728fc60d3080500b5200840921f1800f142050054217c0353610500343f040071600100543f08007161fdff54e00700b5e00313aabafdff97L8;FF190000f021030e91367860f8df0200f1640a437aed0200547f7e007", + "164da467aa00f0054930f0037b5ea0091207875f8200f00b562020032407c409303280091BBL8;FF09692138e1431691ead302f96e0e00949f0600b160a1ff54c0220291e14316919411009407fdff1780c20291a81d0094080040b20811c0da081540d2080d088bL8;FFca220a91eb030291e29340f9f70", + "30291483100b8683d0a91eb435d39e90b03b9c9fe0a911a6d00a9fb0308aa197101a9e8a743f9400540ad785702a9280100f9L16;FFa8058052e0630091a9233ea9a863009109018052a18300d142008052a8273fa9a9170094f4e340a9f56742a905b10094000880522100805201b10094800800b4BBBBB", + "L8;FB6c69627369676e616c5f70726f746f636f6c3a3a747269706c655f72617463686574696e76616c696420726563656976657220636861696e206d657373616765L8;FFf44f45a9f65744a9f85f43a9fd7b42a9ff830191c0035fd633008052285440a9f4cf00a9ff0f00f9bf0214eb49f9ff54e02300", + "91e1031faae20315aa23008052BL8;FF08050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b2L8;FFe127c13de0431391e1830891e283099163c20391e50313aa4283823c4083853c4183863ceeb", + "8ff97e0431391c2f2ff97e89341f91f0d00b1801200541f0900b1BBL8;FFf70301aaf80300aa02011ccb3a0002eba201005420031c8be10318aae20317aa0c5901948803170be8ff0039170500b52b000014080280d20800f0f2681200a9L8;FFe9a705f967550094e89b40f9e9c316910a0000d04ac10b9", + "1e9a305f9e9c32791e85b04f9080000f008612a91e9ab05f9a90000b029a11f91e8af05f9e8c32291L16;FF81feffb02100119183feffb063981191e0030b914202805284018052cedeff97e16341f9e16301f981feffb021a8189183feffb063e01891e0030b91c2018052BBBL8;FF6ca240a9ea0314aae", + "10313aaefffff17ff0304d1fd7b0aa9fc6f0ba9fa670ca9f85f0da9f6570ea9f44f0fa9fd830291081c00121f09007181010054550040f9L8;FF22008052fd170094e1d342f9e5ffff17f85f49f9580300b4e1d342f9e8cb42f9f95b49f91f0101ebc0bf0054e8cf42f9490480522a040091e00318aa0969", + "2138BL8;FF604240f901f57ed3420080520af90094684a40f9a80000b4604e40f901f57ed34200805204f90094685640f9a80000b4605a40f901f57ed342008052fef80094L8;FF0f020f8bf07d0c9bcf05409208c1508baf0400b5490800b43f0103f1ed030aaaef031faa2e318b9acaf17dd350157bf2e", + "0fdff54b001108bf1030daa320240a9BBL8;FFe8e30a79fc010014e8074091f6a745f90023009108810991f407409194820991c8880094e1074091e0431691023f8052218009910739019488e2079178008052L8;FFa22302d1daf3ff9740f4ffb4560100141f0800f1e1220054a80302d1a10302d1a2230", + "2d11f7d01a908018052bf6338a9b87f3aa9bf233ba9bf673ca93bf5ff97L16;FFf5a357393b8108aae8ef42f9ea1300f9e81b00f9e8035839e8af00b90db90094e8030e91ee2749a908210591fe9342a9000540ade50319aae87742f9e28f41a9BBBBL8;FB42024000000000006a00000000000000dc0000", + "002e00000042024000000000006a00000000000000750000002e0000007374617465206465636f646520666169L8;FF601d0054497b60780a014079000400916b03008b4901094a7f0500f109250078e1feff547f0215ebe1fcff541700001448008052bf031ef8bfa33ba9a8e301d1BL8;FFc8624039e9f", + "eff9029611f91e9d302f9fbc342f9f5c742f9e8631639f7cb42f9e80180528083cf3c7f0b00b1a80319f8404f803dc1220054f8630191e8031691L8;FFd80209cb09ff7cd314ef7cd33f0100f1820248faa9000054f5031faae00315aae10314aa40050094940900b4f70301aaf90300aa03090094e00314", + "aa01018052BBL8;FF785e02a97c6605a97b6200b9682603a9686604a9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd620008052e10317aa3a450194L8;FFe9a34539ec7b0079ebf303f8e8f304f8e95f013982dafe97e103002ae8430691e00315aa5fedfe97e8cb40f980", + "82c53c8182c63c8282c73c1f0500b1e00600adL16;FF68220039e00301aa690200f9ff074091ffc30091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a86ed2ff1728a00791f60311aaf10315aa0001c03dBBBL8;FFf402805205000014f63340f993fffff07342279154028052f53b40f9ba00", + "00b4e1031aaa2200805203690194e13740f9d60000b4e02340f9e10316aa22008052L8;FFfd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd0300914804028b49008052f30303aa340d002a3940009118f17dd30b000014680640f9e10316aae20315aaBL8;FF08090091bcffff17ff0302d1fd7b03a9f", + "a6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071a1010054e00302aaf30302aaf40301aabaf5ff97L8;ZDBBL8;FF810f803debc741b901048052e002803de9cf40f9ea9741b980c38d3c800fc03d821f803d4047803d801fc03df81f00b98043813c00e4006fa80319b889430df8L8;FF", + "19e040a9f60300aa344c40a9f50302aa370840f9b80400b40807188b3a8300911bed7cd3040000147bc300f15ac30091c003005448035ff81f0117eb61ffff54L16;FF08018052bf7f3fa9bf233ea90da90094000980522100805206a90094e00900b4f70300aa07a90094000480522100805200a90094c0", + "0800b4e80300919f020072BBBBBBBL8;FB333634356363642f303639353962342f7372632f76312f6368756e6b65642f7374617465732e7273000a64656372797074656420c00e206d6573736167652066L8;FFa2c20091e0031f2ae3031faa339f009423feff906340379100088052e1031aaae2031aaa5", + "79f0094e883009125feff90a5e02391a1a301d102c10091e0031f2aBL8;FF6c1d00122c380c0b811140516b00f8376b008052430000143f004871030b00544b0dc0396c1d00122c540c0b810148516b00f8378b0080523a0000142b7c1c53L8;FFeb2f00f9e1ffff173f040071a00100543f080071210200", + "54e1430091a2e300d137fdff9720fbffb42b00001401c30091a2e300d132fdff9780faffb420000014BBL8;FF7f0308eba81b00541b0100b4a8835df8e10340f9e2031baa0001178b0d630194f7021b8bb7031ef85f0317ebe01c0054a8835df809058052ea060091a1c300d1L8;FFf50301aae10302aa00", + "0d002af30302aaa5fbff97b73240b9b70c0034e80240b20811c0da081540d2080d088b0825019108fd46d308050091b60a40f9f60b00b4BL8;FF20020037750240f9a80640f9160101eba2020054e80f41b207000014890080d248008052e02300390900f0f2e827003928017fb2e0030091e80300f937e9", + "ff97L8;ZDBBBL8;FB540000000000000065000000050000001d1c400000000000540000000000000073000000050000001d1c40000000000054000000000000007900000005000000L8;FF080500911f0109eb6811005486000014e00315aa90eaff97080040b20811c0da081540d2080d088b0825019108", + "fd46d30900088b37050091ff0208eb490f0054BL8;FF4aa11f91eb230091f30300aae9ab00a949008052cafefff04a413c91a00700d1e1630091e9ab04a9c9feffb029b91891e9af06a9eb048052a9028052ffab01a9L8;ZFBBL8;FF29713e91200440a9e82701a9e82300910900009029d13991e82702a9", + "e3430091463f0194fd7b43a9ff030191c0035fd608200091200440a9e92300910a000090L8;FFe20313aadafdff97a00100b4c9000014c1c20091e20313aad5fdff97000100b4d6000014e01c00b5e00313aaaefeff97e80301aa40010036481d00b5e1031faaL16;FFf9b344a9e40308aaf74b00f9e8031", + "0aae3030faaeacf00f9e1f7c03def030eaaea6341a9f20319aafc0748a9f90305aae69f43a9e03717a9f45f49a9f57b40f9BBBBL8;FB5369676e616c5f5051434b415f56315f4d4c4b454d3736383a53434b41204b657900000000000000c8034000000000005800000000000000a400000018000000L8;F", + "F6305005400fefff000c00e915f8f0094f3031faa080c47f81f0500b1e1e7ff54e8031faa080113ab2304005400fefff000000891558f0094f3031faa088c45f8BL8;FFe9fefff029010491ff0300f9e97301f9fb0308aaa84700d1e97701f9890c40f9e0070aa9e0070ea9e00303aae20f0ba9e4170ca9e", + "6230da9ff230b39ff7b01f9L8;FFc03f0054fa7342f9e8a740f9a80000b4e1af40f9e2a740f9e0031aaa0d130094e28753a9e0431391fa8b00f9be040094e96f42f9e86b42f9e9bf00f9e97342f9BBL8;FF080d088b0825019108fd46d308050091b60a40f9f60500b4c90240b22911c0da291540d2290d0", + "98b29250191c91a498b29050091b41640f92801088b140500b4L8;FF200b02ad200540ad200700ad3ee6fe97e0234da982e20291e16340f9081140f900013fd6e03b02f9e8031691e13f02f9290c40f9e103129120013fd6fbc342f9L16;FF0dd30094e10342f9810000b4e00742f92200805208d30094e1", + "0f42f9810000b4e01342f92200805203d30094e11b42f9810000b4e01f42f922008052fed20094BBBL8;FF290500912001088be10313aaf7f8ff971601003513000014e8031faa75feffb5e003088be10313aaf0f8ff97b6010034610a40f9680240f91f0101eb00240054L8;FFc6f9ff17f60300aae0431", + "69122008052fa110094e1d342f9e00316aaccf9ff17e043169122008052f4110094e1d342f9fff9ff17e0431691e1031aaae20318aaBL8;FFab008052300000144d15c039ae1d00128c1d0e0b8c0102518d00f83761710c8bcb008052280000149f114071630800544d19c039ae1d00128c390e0b8c11405", + "1L8;FF00030054e303004b22c59c526000000a62eda072e1fcffb021201391007c021b007c1b5320486038f55b42a9f76343a9f96b44a9fd7bc6a8c0035fd6c3020e91BBL8;FF7622009104000014b50600f1d6620091000b0054c1825ff881ffffb4c00240f92200805204330194f8ffff17e17749f93f0", + "800b1e0adff543f0400b1a0adff54L8;FFf65759a9f85f58a9fa6757a9fc6f56a9fd7b55a9ffc30691c0035fd6a04302d1e1031faa25f1ff9752ffff17fd7bbda9fc5701a9f44f02a9fd030091ffc320d1L16;FFe007813d4183813ce81302f9e91f02f9b70000b4e00318aae10317aa2200805205b30094", + "e8830291812200910001029147140094a00f7bad480080d2e107c13dBBBBBL8;FB206d65737361676520636970686572206b65790000000000fa0840000000000029000000000000004e0100002d000000fa084000000000002900000000000000L8;FFe1830091220108cb129b0094a80357f880030191a", + "1c303d12200805208050091a80317f843970094e8031f2aa0877bada0d300d1a8f31438a203d93ce1830091BL8;FF570400b4541340f90e1b0194e00317aa21008052071b0194601500b4e10314aae20317aaf80300aa0a1b0194482740f91f0500b120030054592f40f95b6340b9L8;FF61838e3c4183c8", + "3c6083873c4083c93c6183883c4183ca3c6083893c4083c33c61838a3c4183c43c6083833c4083c53c6183843c4183c63c6083853cc082c03cBBL8;FFac0b005428170035e90f41b2bc000014495f40f9e8d34278eabf4039e19342b83f8100f1a8c31b78aae31b38e1060054486f40f9e0031aaa1f0500b", + "1c0130054L8;FFe05306f9e0833291a1fdffb021002691a201805263fdfff063c039910401805222000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f93761ff97L16;FFffdf01b9df7e06a9df8205f8df0207b81f0800f1812f0054a0c303d1c2e7ff9720060036a12700b4c3010014e8f3", + "40f91f0d00b1e1040054a1a303d1a2c303d1BBBL8;FF9f0208ebe8040054340100b4680640f9e10315aae20314aa0001178b0d7b0194e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00013fd6L8;FFa80600d11f0900b163010054ab000014e80180520900809268220039e043069", + "1690200f9b1100094a80600d11f0900b142140054e0031baae10315aa22008052BL8;FFf243403908040039e84b4039e24f40390a080039ea110e2a2e12102a4810082a09100039e9534039ef5740390b0c00392b10122a0d180039ed634039f1674039L8;FF4a8d0caa6c5a1653480163b24801889a6a52", + "14533f39406a08ad0baa0b200853082d0aaa0a340d5308690baa0b1c015308710aaa09017cb22811889a7f021f72BBL8;FF5f0500b180020054092040f92a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab8301005459000014e8031faa090c40f93f0500b1L8;FF00020054", + "7a1a41f9683a42b9e82700b9da0100b4751641f90a3b0094e0031aaa21008052033b009420e300b4e10315aae2031aaae00700f9063b009405000014L16;FFdf0600b1e02d0054681f40f96083c23ce9c31391e0831d91e1c31591f6bb02f9e8d302f9e8e340b9e067813d6013c13ce8e31539681340f920", + "91883ce8c702f9BBBBL8;FB6368756e6b2073686f756c642062652073697a652032000074194000000000005800000000000000760000002f0000007370717220666978696e672062616420L8;FF010980524887009440008052810880524587009440008052810780524287009420008052010480523f87", + "009400feff9000402691e3fdffd063801b9104feff90BL8;FFf46f41f9e8230b3949008092f36b41f9690300f9880240f9680000b4e00313aa00013fd6810640f9810000b4820a40f9e00313aa000b0194e14b41f9810000b4L8;FFfd030091f303012af40300aa0d0b00940002805201018052060b00942", + "00100b4140000f901fdfff021800c91130800b91f300039f44f41a9fd7bc2a8c0035fd6BBL8;FF61ffff17200080520118805246470194200080520104805242470194ff4307d1fd7b17a9fc6f18a9fa6719a9f85f1aa9f6571ba9f44f1ca9fdc30591350840f9L8;FF10000014e80308abc201005409084", + "0f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6L16;FFe88b00f9e8bb45f9e8b700f9e8bf45f9e8cb00f9e8c345f9e8eb00f9e8d345f9e82f14a9e8db45f9ebeb45f9ea2313a9e80b46f9eaef45f9e87b00f9e81346f9BBBL8;F", + "Fab0302d1ea830291e8270ba968008052a9ffff9029b10b91a04700d1a10302d1682503a988fffff008f11a91682905a98a068052480480527f2500a989fffff0L8;FF0d6b009468b640f9e80000b460ba40f901f57ed342008052f30b40f9fd7bc2a8056b0014f30b40f9fd7bc2a8c0035fd6fd7bbea9f3", + "0b00f9fd030091092040a9BL8;FFe90300f9e003009144f1ff97e10300aae00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6e20313aa230c805267f1ff97e10300aac0feffb5a80640f9L8;FFc8fcfff0e003c03d01c9c13de81340b9001c216e681200b96002803dfd7b42a9f31b40f9ff03019", + "1c0035fd6c0fcfff000c01c91c2fcfff04280159121038052BBL8;FF46310094f44f45a9f52340f9fd7b43a9ff830191c0035fd6f503012a74040051e00313aad7070094e80300aae00301aa28fc073708fc60d3c80100b508084092L8;FF20008052e10317aa4727009420008052e10319aa44270094200", + "08052e10318aa4127009420008052e10316aa3e27009420008052e10315aa3b27009400018052L16;FFe8230091a14300d1f40303aaf50302aa64a70094e10740f9c10100b43f0400b121010054e8434039e00313aae10316aae20315aae30314aa1f090071cce8ff54BBBBBBL8;FB20776974682027c023", + "273b2063616e6e6f742067657420726563656976657220636861696e20696e666f2028c0012900166572726f7220696e206d6574686f64L8;FFea7201f8480340f908f8ffb4400740f901f97fd342008052079f0094bbffff174800805208200039080000f9e00301aaff830e91f44f45a9f65744a9f85f4", + "3a9BL8;FF00c02e91611b0194e00313aa22008052c2020094610a40f9a1ffff17e00313aa22008052bd020094610a40f9bdffff17e00313aae10318aae20316aab7020094L8;FFf7031caaf8031baae11f40f9c10000b508000014600bc03de003803de11f40f9810000b4e00316aa22008052021f00941a", + "0080921d0000141a008092e00bc03dBBL8;FFa91640381f01096be0179f1a22740194d60600f11b001b0a21ffff54c6ffff17e81740f9156d00a92c000014e043069121230091022a8052065f0194f41340f9L8;FFe20313aae00300f9125f0094f9d740f9f58b42b9f78f42b9fa1b00f9190a00b4f4d340", + "f9075f0094e00319aa21008052005f0094800e01b4e10314aae20319aaL16;FFe10313aa59ecff97801e40b980010034610a40f9680240f91f0101eb60050054680640f9090280522a0400916a0a00f909692138e10313aa4cecff97818a40a9BBBL8;ZBL8;FFe0fdffd000200c91607b0094f50300aae06", + "30091220080522300805224008052b6a2ff97e11740f9e00315aad0fbff17f70300aae06300912200805223008052BL8;FFe20314aab8ff0094b85e00a9b40a00f9f44f44a9f65743a9f85f42a9fd7b41a9ff430191c0035fd63406f8b7340400b404ff0094e00314aa2100805237008052L8;FFe9ffff17", + "e00307aac0035fd6210400d1030080d27f0002eb000100540468633863040091256863389f00056b40ffff548000054b0200001400008052c0035fd6BBL8;FFe03340f9680200f99a0000b4e1031aaa22008052083f0194b70000b4e03740f9e10317aa22008052033f0194e12f40f9810000b4e02b40f92", + "2008052fe3e0194L8;FFe00315aa0c3f009496300036f6fe60d3ea5f40f9e95740f968c6533935fd48d3e8580037d2020014e84700f9e8fb41f978ca43f9fadf09a9f7eb43b9f6ef43b9L16;FF1f0b00b1000d00541f0700b1c00c0054e81e4139e9524478ea224039fce644a92841082ae91244b8eae300", + "b9ea024139288108aae9ea45a9fc6700f9542108aaBBBBL8;FBa79f0ae7cc47c16fff71cf51a3a927e2205bb2055deee43dd9cf5fe9d824027dd6e99c2ccb466c15544552c883e22d97733aa29aace7784aa28c75ef11ce0000L8;FF108f00944000805241008052098f0094a07e00b4f60300aa0a8f0094", + "4000805241008052038f0094e07d00b4f30300aa048f00944000805241008052fd8e0094BL8;FF02288052130f01943f0700b140270054e0c32291e1c32791022880520d0f0194e0c31d91e1c3229102288052090f01943f0b00b1e1c8ff54a3010014c80080d2L8;FF0e0f0094800100b50700001434010", + "0b40c0f0094e00314aae10315aa050f0094a00000b528008052750600f904000014e00315aae8031faa600600f90a028052BBL8;FF1f010071e80303916243c03ce8a711a908358c52e51301ad08019f5ae20f00ade00702ade28f03ade08704ade20741ade82b01b908fa80d22800c0f2684301f8L8;FF0", + "02000918903009424000014e80300aa098d40f83f0500b1e01e0054f30300aae00308aa22040094e80300aae00313aa090140b22911c0da291540d2290d098bL16;FFe0f3803d8082c03de82b01f9e87342f9e093803de8af04a9e87742f9ebc342f9e80b00f9e87b42f9e83b00f9e87f42f9e84300f9e88", + "342f9e82300f9e88f42f9BBBL8;FF586d0094e00316aa627d0094e30316aae80300aae90301aae00315aae403142ac8d40736c9d5ffb59bffff17e00317aa587d0094e30317aae80300aae90301aaL8;FF2083c83c61838f3c2183c93c6083883c2083ca3c6183893c2183cb3c60838a3c2083c43c61838b", + "3c2183c53ce85301f9c86a40b9e00704ad2083c63c2183c73cBL8;FF991640f9880e40f93f0308eb61000054806200914dea0094881240f9e083c03ce1031faa2823189be90f40f92a0700910001803d090900f98a1600f9d6ffff17L8;FF01801fb805c01f381fe01f78caffff1703d05f3863100012611", + "4010b251c0012d4ffff17f35341a96effff1701000014fd7bbba9fd030091f55b02a9f50301aaBBL8;FFe8cf42f92a040091c02202914901805209692138ead302f9bd140094e1431691690c0094e0b349f9800100b4e1d342f9e8cb42f91f0101eb20390054e8cf42f9L8;FF8100805200001891ff0316b", + "9e81f00b9ee290094e80356b9e00740918100805200001891ff0316b9e81b00b9e7290094e80356b9e00740918100805200001891L16;FFe8030191e0031f2ae10319aae2031aaa2500805206048052e3031caa30ab0094a1035df8810000b4e0031caa2200805201af0094000740ad08108052e98741a9B", + "BBBBL8;FB6a00000000000000200100002e000000ef104000000000004e00000000000000f904000019000000ef104000000000004e000000000000000105000014000000L8;FFce1540d2ce0d0e8bce250191ad194e8bbf010ceb830500546b0500f1ec030daa81feff54a90109abe300005423000014e8", + "031faa090840f949fdffb5e90309abBL8;FF880b00546d000014f30300aa1dfdff97e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209ebe90b0054L8;FFa04700d1a7c4ff97e03b01b9a04700d1a4c4ff97e03301b9a04700d1a1c4ff97e02b01b", + "9a04700d19ec4ff97e02301b9a04700d19bc4ff97e01f01b9a04700d1BBL8;FFa3020054e8830091290000b029413a91e82703a9e8a3009160ffffd000900991e82704a968fffff008e1239189038052e1c30091e82705a9e343019142008052L8;FF0d5700949f0b00b101030054e89f40f9c002c03dc91", + "240b9f59342b91f0500b1e063813de99305b9600000544063029169ecff97f3d352a9140200b476220091L16;FFa20000546b1d0091ef0500918c05009170feff37f000f837abfe60d3ab0000b5eb032aaa18010a8b7701098b0a0000144800805209008092692200a9bc000014BBBL8;FF0201805264008", + "05209000014e00700f9a1ffffd021003991a3fffff063a00291e023009102018052a4008052ca7c0094e00740f9b6ffff17e00700f9a1ffffd0L8;FF08fd46d30900088b3a0500915f0308eb48310054e6010014e1d342f9e8cb42f9f4074091948209911f0101eb40880054e8cf42f92a04009180220291", + "49038052BL8;FF01f17dd302018052f44f42a9f65741a9fd7bc3a808f70014f44f42a9f65741a9fd7bc3a8c0035fd6002000913afeff17fd7bbea9f30b00f9fd030091090040f9L8;FFc9020054a37c039182201d912100008b2100038b21f07d92419401a93f4005f169020054c81b80d2000080d262008", + "0d2430480d204008092050080d2010000d4BBL8;FF2081009102708052e8a302f9e843169101610091e04f813d0e370194e063c13de8a342f9e907409129c13591f73340f9e157c13de0f3863de05bc13dea670291L8;FF61fdffb021c01891a201805263fdffb06360199124018052cf3cff97e14b45f9e", + "14b05f9e0432a9121fdffd021203f910202805263fdffb063ac1d91e4018052L16;FF7749ffb54efaff1728008052e84700f9f96340f9380100b4e0031aaae10318aa22008052f4030b2af8030c2a02b70094ec03182aeb03142a38ff48d3e06b40f9BBBBL8;FB636861696e206d657373616765206b6579", + "736465637279707473657373696f6e207761732076616c69643b206d75737420686176652072656d6f746520696465L8;FF08fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b4BL8;FFe9e70c9", + "12083ce3c21f18f3ce9270d912183c73c22f18f3ce9670d912283c93c20f18f3c2083c83ce9a70b9121f18f3ce9e70b912183c33c20f18f3c2083ca3cL8;FFe082cc3c21838d3c20838c3c99420091e18247ade00319aae8eb01f9c8620491eaff01f9eac740f9e007813de103813d010140ade99b01f9e9", + "8341f9a8620491BBL8;FF64ccff97e0f9ffb4520000143f100071200300543f140071200500543f18007181f8ff54e87f40f91f0500b161000054ffe70fa9ff8700f9c1220191a20301d1L8;FFe8a716a978caff34e11740f921caffb4e00b40f922008052074700944dfeff17fb0300aaf80b00b99a0400", + "b4fb0300f904470094e0031aaa210080523b008052L16;FFe8bb40f9e3030aaaeafb40f9ec0309aae94740f9e8ff00f9e8e740f9f90301aaee2b1ca9ee6b40f9eab740f9e95b0da9e9a340f9e1030daafc2317a9fc0306aaBBBL8;FFc0035fd61f09007181010054aa035ef8090180d20900f0f248dd7892", + "290140b20a000014aa935d38090180d2e8031faa0900f0f205000014090180d2e8031faaL8;FF200100542a0440f90bfc63d35369283808050091280800f94b0200b5e0030caa7a000014e10300a9e00301aae10308aa22008052f4030caaf0050094e10340a9BL8;FFe5f2ff97401100b5e1031faa010b0", + "0b5a80640f91f011aeb89060054e00313aac1f3ff97400a003728fc60d3280800b5200840921f1800f162080054217c0353L8;ZDBBL8;FF610000b4220080520b270194611a40f9810000b4601640f92200805206270194614640f9e10400b408108052606a68f822008052f44f41a9fd7bc2a8fe260114L", + "8;FF220080520c270094c1825ff8e1feffb4c00240f92200805207270094f3ffff17682a40f9c80000b40805088be00314aa0201805201ed7cd3ff26009460e20191L16;FFefd100910082c13c111640f929c101f112025ff80102de3c8081813c0082dc3c918102f811825df8b28102f8120a40f9e01780", + "3d0002c03da181813c4109c03dBBBBBBBBL8;FB203020616e6420362c20676f7420c0001f70726f63657373696e67205072654b6579206d6573736167652066726f6d20c01d20776869636820686164206e6f20L8;FF0232805200e1009112a40094a00640ad09008092a20ac03da81a40f9e1830f916986", + "00f8e00313aa02398052c08602adc21e803de80b02f906a40094b4000014BL8;FFfd7bc5a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f090071e1010054e00302aaf40302aaf30301aad2000094e80300aaL8;FFe00301aae10309aa220080522300805224008052a", + "3000094e10340a92aa040a9536928380cfc5cd308050091290040f9280800f90cfeffb40a7c15533f0108ebBBL8;FFf44f43a9f65742a9fc5f41a9fd7bc4a8c0035fd61f090071c1000054080180d289de78920800f0f2080140b206000014080180d2f4031faae9031faa0800f0f2L8;FF680640f949018", + "0522a040091e00316aa6a0a00f909692138e10313aaa2fcff97780a40f9680240f9080118cbdf0208eb08070054680640f9e10317aae20316aaBL8;FFd5e9ff97e10340f99effff17ff0302d1fd7b03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaf30302a", + "af40301aaL8;ZDBBBL8;FB65796d6573736167655f6b6579730000ef104000000000004e000000000000006402000013000000696e6465786b657950656e64696e675072654b6579707265L8;FF5a91ff97f71740f9e80f40f9080117cbbf0208eb28860054e81340f9e10316aae20315aa0001178b0a840", + "094e802158be81700f9e00314aa088c4df81f0500b1BL8;FF3f1000f123040054090040b90aca89522a49a7723f010a6b200200543f9000f141030054f30308aae8430091e6070094e81340b91f05003161020054e043c13cL8;FFf44f44a9f65743a9f85f42a9fc6741a9fd7bc5a8c0035fd6fd7bbca9f8", + "5f01a9f65702a9f44f03a9fd030091f30301aaf40300aaf7031faaf84b1432680217ebBBL8;FF73a2019161feff54c80215ab42010054000114ab82020054f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e80315ab03ffff5440ffffb000803c9153400194L8;FF8d00f83761710c8beb0080521e0000", + "149f014871830700544d1dc039ae1d00128c550e0b8c0148518d00f83761710c8b0b018052140000148d7d1c53ad060034L16;FF0a2554a9e92b03a90a2555a9ea7b00f9e96300f90a2556a9ead300f9e96700f90a2557a9e95700f9092158a9e85f00f9e89b47f9e96f00f9e9bb47f9eaa31da9BBBBL8;F", + "B920e4000000000005500000000000000ce0000000100000056315374617465696e6e65725f7374617465507152617463686574537461746576657273696f6e5fL8;FFe80300aa098d40f83f0500b1e01e0054f30300aae00308aa8a0c0094e80300aae00313aa090140b22911c0da291540d2290d098b29", + "25019129fd46d30801098bBL8;FFe00314ab83ffff54e0fefff0008035915e100194e0fefff0008010915b100194fd7bbfa9fd030091082440f9080100b4080140b20811c0da081540d2080d088bL8;FFe9ab4c290ad1003909d90039e9ab4b290add003909e10039e92b49290ae5003909e90039e92b482", + "90aed003909f10039e843139150100094e0074091e1431391BBL8;FFe007803de007c03d680200a96a2601a9e003803d6b1200f91f000014c80a0091a0831df805000014e90b41b2a9233da903000014c80e0091a8031df8a0c300d1L8;FF2083ce3c21f18f3ce9270d912183c73c22f18f3ce9670d91228", + "3c93c20f18f3c2083c83ce9a70b9121f18f3ce9e70b912183c33c20f18f3c2083ca3ce9270c91L16;FFe2031f2a5a3a009409fc78d388feffd0080132910afc60d3097969784921094a2a5d105308596a780001094a14000014c80100f008210091e903009183feff90BBBL8;FFe10316aae20315aa00011", + "78b11740194e802158b680a00f9804e41b980010034610a40f9680240f91f0101ebe0330054680640f9090580522a0400916a0a00f9L8;FFa90c0094e88349f91f0500b1c0000054e8074091e14316910881099100810291cc0f0094f87f49f9780300b4e1d342f9e8cb42f9f97b49f91f0101eb403d0054", + "BL8;FFe8470039e90700f9e023009143faff97f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aa3af00094L8;FFa0010054b50400b4b602188bc81a80d2e00316aa010000d4df0200eb8006005480020e9102008092011440f902cc01f981060", + "0b597020e91560080d2050080d2BBL8;FFe8cb42f91f0101eb60b70054eb074091e8cf42f92a0400916b810991490380526001029109692138ead302f9ce1b0094e1431691641100949f0a00b1e10b0054L8;FF60fdff900004159162fdff9042601691a115805250300094e8f741f9e9fb41f960fdff900", + "074129163fdff9063a0249164fdff9084401391e2c32491c1058052L16;FF800ac03da1420191891a40f98182c33ca80317f8880e40f98083873c8082c03cf47740f9a9831ef8a8031df8e8431091a103963ca2877ead00410191a0039c3cBBBBBL8;FB6174653a3a73657373696f6e00000000390740000", + "000000033000000000000006c0100002a000000696e76616c6964206c6f63616c206964656e74697479206bL8;FFe183c23ce18b06ade283c63c020115cb140302ebe28308ad22010054e8430391e10317aae20318aa0001158b099c0094a802180be83f04392100001415020034BL8;FF80080054f40f40", + "f9760080520800001400010039b402148ba08300d1f40f00f9691801941f040031400700541f0002716200005435008052070000141f002071L8;FF015901b4201740f9050000141f0900f1210740f9615801b4200b40f922008052ff0b4091ffc32791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9f", + "d7bc6a8BBL8;FFe83300f94b580194ffff0039f50318aaf4031aaaa2fe46d3b8e27a92b5164092e20000b4e83340f9e0020191e10314aa0801028be83300f93e580194e0030091L8;FF145c00943f0700b140270054e0c32291e1c32791022880520e5c0094e0c31d91e1c32291022880520a5c00943f0b0", + "0b1e1c8ff54a3010014c80080d2e15706f9L16;FF5ed80094ff4302d1fd7b07a9f34300f9fdc30191280040f9f30300aa1f0500b160030054e8630091e00301aa4e330094e80f40f9e003c23ce91b40f91f0500b1BBBL8;FFc10100b4820a40f9e00313aaf44f41a9fd7bc2a8087c0114280400d11f0d00b", + "1c8000054000440f922008052f44f41a9fd7bc2a8007c0114f44f41a9fd7bc2a8L8;FFe01b843de11f843d081140f91f0900f189040054e90000d029411f91e8633f91e9bf0ef9e9fdffb029611791e8bb0ef968008052ea074091e94f09f94ac13591BL8;FFc0035fd6e083c03c080080126042803c6802", + "00b9fd7b42a9f31b40f9ff030191c0035fd62a004039e8048052e90080525f0000712b0440392c0840392811881aL8;FFc2feff97a10f40f9750a40f9eeffff17ff0302d1fd7b02a9fb1b00f9fa6704a9f85f05a9f65706a9f44f07a9fd830091f40302aaf30300aa540d003728004039BBL8;FFf46b00f9", + "4b380194e08745ada8035ef87f1e0139e82300f9e86b40f9e083843ce183853ce00742ade83700f97f0200f96082863ca00b7ead6182873ce11bc03dL8;FF9f0a00b1742a01f968420e39772e01f9763201f96a6a02b96b6e02b97a3a01f97b3e01f9210600546a008052686209916b620a91eab30e396a2", + "647a90001c03dL16;FFe90314aaf84f40f9f7031f2a784200b408008092f90309aae95b00f9e86700f9120400141f0700b120030054b80100b4e0031aaae10318aa22008052f40309aaBBBBL8;FB732cac9be552e6e3a28c6ece7869562992840000fab454b55e63313b1eb04689f4d0e7379bfb2a8a05e9", + "e5240eb2d30c7c1c933e4688fdc52e5f7d287026a4e4L8;FF095d1053495969782801084ac87a337816000014480100b008210091a98300d100210091a20301d121008052e3fdffd063400c91e4fdffd084e00c91a8031ef8BL8;FFe8c32791e9a705f966080194e89b40f9e9c31691eaffff904a213f91e", + "9a305f9e9c32791e85b04f9e8ffffd008c11d91e9ab05f9090200d029a11f91e8af05f9L8;FF88050054b50000b46002148be20315aa100c0094e80316aa8902158be90f00f9e083c03ce90f40f90001803d090900f9f44f45a9f65744a9f85f43a9fd7b42a9BBL8;FFfc0b40f9f65743a9f85f42a9fd7bc", + "5a8094c0114e80740f9080116cbff0208ebc81b0054f70100b48002168be10318aae20317aa074c0194d602178be00318aaL8;FF6b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500542a0140b24a11c0daL16;FFe8", + "cf43f9e8c300f9e8d343f9e8ab00f9e8d743f9e92312a9e8db43f9e9f343f9e8ab1aa9e8e743f9eaf743f9e8df00f9e8ef43f9e8af15a9e8fb43f9eb0b44f9BBBL8;FFe20313aae002198b126c01943903138bf90f00f9f50200b52c00001436008052e10740f9e1f7ffb5c1ffff17e8031faa95f9ffb5f8", + "0308ab63faff54a0ffff90L8;FFfd7bc2a80c6c0014f44f41a9fd7bc2a8c0035fd6010040f9810000b4000440f922008052046c0014c0035fd6fd7bbea9f44f01a9fd030091140040f9f30300aaBL8;FFa10b79ad8382863c9b000014e08745ade00314aaa0873dade08b46ada08b3eade18343ada1833ba", + "de28344ada2833cade18341ada18339ade28342ada2833aadL8;FF091d0012480000cb8c0500d11f010beb200100548df55f386b050091bf01096b61ffff5441000bcb20008052fd7bc1a8c0035fd6e8c300b2ecc300b2edc301b2BBL8;FF081140f9480300b4e84301912900009029213f91a82734a9280", + "0805229ffffb029010891aa0303d1a04700d1e8a711a908fffff008053691e8ab13a98a068052L8;FFe00313aa210080520a2c0094400100b528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd620008052800600f909028052936a29f8L16;FF687a00f968fe10a97fa211a9", + "68fe13a97fa214a968fe16a97fa217a968fe19a97fa21aa9080680527fa21ba9080480527ffe12a97ffe15a97ffe18a97c420039BBBBBBL8;FB797065203cc0013e00224661696c656420746f2064657465726d696e652073656c665f73657373696f6e3a20c0001e45435075626c69634b6579206465736", + "572L8;FF1f0001ebe2290054890640f9eae740f98b0700d13b6977787f010aebc1fdff54e023079137f6ff97e8eb40f9eaffff1717038052e88307911323179b680240f9BL8;FF63101491a0c300d142018052440080521a000014a0031df801ffffd021a4139103ffffd063cc1391a0c300d14201805244", + "01805211000014c80080d2a0831d38L8;FFf7feffb5faffff1720fdfff000203691621c0094ff4303d1fd7b0aa9f6570ba9f44f0ca9fd83029109604039a9050037150440a9f30300aae0230091f40308aaBBL8;FFf4c342f9c1ffff1748008052c90a0091e0031639e8071639e9bf02f9a3ffff17e00316", + "3948008052c90a0091e0e31591e8071639e9bf02f9386600940b000014L8;FF29211791ff0300f9e97301f9fb0308aaa84700d1e97701f9890c40f9e0070aa9e0070ea9e00303aae20f0ba9e4170ca9e6230da9ff230b39ff7b01f9e20f0fa9L16;FF081540d2080d088b0825019108fd46d308050091d40", + "30034890200322911c0da291540d2290d098b2925019129fd46d3290500912001088be10313aa4bedff97BBBL8;FB2f636f72652f7372632f74696d652e72730001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101L8;FFbea3ff97e11740", + "f978feff17e0630091220080522300805224008052b7a3ff97e11740f9bafeff17e0630091220080522300805224008052b0a3ff97e11740f9BL8;FF4203f8b7f40308aa330200b4f50301aa0c000194e00313aa210080523600805204000194400200b4e10315aae20313aa930200a907000194930a00f9", + "f44f42a9L8;FF08010035f40740f9d40000b4e00314aae1031f2ae20313aa72000094e00314aaf44f42a9fd7b41a9ffc30091c0035fd69affff17afffff17afffff17d9ffff17BBL8;FF63c03991a00301d162028052040180522400001441ffffb021ec039143ffff9063203e91a0031cf8a00301d16202", + "8052040280521b000014a0031cf841ffffb0L8;FF210740f9810000b4220b40f9e00315aa094000949f0a00b141040054f94308915707003676b641f978ba41f971620e9168be41f96ac241f9fc432a916bae41f9L16;FF3f0400b140010054810000b4e0d341f92200805208c00094e1db41f9810000b4e", + "0df41f92200805203c00094b40000b4e0c741f9e10314aa22008052febf0094BBBBL8;FB010075402ca10872ec2b08720872d5f6d56bd5f6d5f6d5f6d5f6d5f6d5f6a28cb43fa28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28c0000L8;FF080c45f81f0500b1c1fdff54f40314abe20", + "20054688e48f81f0500b140020054e00313aa8effff97080040b20811c0da081540d2080d088b0825019109fd46d3BL8;FFe1350054a02302d1deecff97800a003621f8ffb4dc01001401c30091a22302d1faebff9780f7ffb49c010014a22302d1830c8052c1e4ff97e0f6ffb4ea000014L8;FFe00740f9", + "e1a30091e2430091f6e6ff97a1035df8810000b4e00314aa220080520510009428008092680200f9afffff1720fdff9000600291540c009420008052BBL8;FF624c01942000805241028052464c0194ff8307d1fd7b18a9fccb00f9fa671aa9f85f1ba9f6571ca9f44f1da9fd030691f30300aae0430291f", + "50304aaf40303aaL8;FF0811c0da081540d2080d088b0825019108fd46d308050091090840f9090300b40a0440f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0daL16;FF280c40f9e8fb00f9281840f9e1030aaae80317a948008052e87300f908008092e87700f9e8030eaad40e00", + "14e8af43f9eab343f9e9cf00f9e9ab43f9ebcb43f9BBBL8;FFe003082ae20303aaf60303aa61f5ff97601800b5e9031faae00314aae30316aac4ffff17e00317aa5a7e0094e30317aae80300aae90301aae00316aa88fb0736L8;FFeaff01a9e9230a29686c0094fd7b47a9ff030291c0035fd6ff8301d1f", + "d7b03a9f52300f9f44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054BL8;FF3700805218038052a80640f91f0116ebc90a0054e00313aac3fcff9720fe073728fc60d3880a00b5200840921f1800f1c20a0054217c0353e10a00343f080071L8;FF83fe073703cc7492040000f084c041", + "f9630040f97f0004ebc1fdff5403404079642c46d39fbc007168030054e3fcff9067a01191867c4093e4d86478217c041bBBL8;FFe1431691ead302f96f0d0094df0600b18000005480020391e1431691951000941f0700b1e080ff54802202916c010014e8031faa00011aab42690054e1431691L8;FF38", + "1f4092fa0f41b2091f40921b0309aaa1035df8815c00b5e7020014a8035df808011acb1f0308eb28780054180500b4a8835df8e10319aae20318aa00011a8bL16;FFa20f00f95f0008eb6106005448008052f40300aae0030091ff2300a9e10303aae87f02a9ff2303a9e87f05a9ff2306a9e87f08a9ff23", + "09a9e87f0ba9ff230ca9BBBBBL8;FB7375636365737366756c6c79206465637279707465643b206d757374206861766520612063757272656e7420737461746500000000000000bb12400000000000L8;FFe00301aae10308aa6202805241940014080040f9e00301aa080140391f050071a100005401fef", + "ff021d03c91020580523894001401fefff0215c3c91a2038052BL8;FF29fd46d30801098b130500917f0209eb492d0054080c47f81f0500b1802300546c030094080040b20811c0da081540d2080d088b0825019109fd46d30800098bL8;FF68f300f86c7f00396b7301f8e413ff97f90300aafb0301aa28", + "0080523a1400b408180094e0031aaa2100805201180094f8db40f9c0dd00b4e1d340f9e2031aaaBBL8;FFf44f5ea9f6575da9f85f5ca9fa675ba9fc6f5aa9fd7b59a9ffc30791c0035fd660fffff00080229163fffff06320119164fffff084202391a24700d1c1048052L8;FFe8230b3949008092f36b41", + "f9690300f9880240f9680000b4e00313aa00013fd6810640f9810000b4820a40f9e00313aa01580094e14b41f9810000b4e04f41f9L16;FF61000054e00313aa0ed30094680640f997fe6ad319693538d5160091750a00f9370200b5f403182a680240f9bf0208eb61000054e00313aa02d30094680640f9", + "BBBL8;FF55fcff97202700b5f7031faac1ffff1721c30091e20313aa4ffcff97c02900b5f7031faabbffff1721830191e20313aa58fdff97e02700b5f7031faab5ffff17L8;FF220080520c780094f8ffff17f37749f97f0600b140020054e18349f93f0400b140010054810000b4e08749f922008052017", + "80094e18f49f9810000b4e09349f9BL8;FFc00240f9220080520bf80094f8ffff17010440f93f0800b180f9ff543f0400b140f9ff54e10000b4080840f9f30300aa22008052e00308aafff70094e00313aaL8;FFfaffff17e00304aab7000094e09740f9bbffff97e1834ba93f0000eb80020054e5230191", + "ffff04a927008052ff2f00f946008052e00305aae2e30091280980d2BBL8;FFf6370af90001803de91f0bf9f6230bf909380194f43349f9e043069181230091027380520b380194e083c53d89630f91e187c53de8436c79f5174bf9fb1b4bf9L8;FF080500d1c5000014c80080d2e0632a39e0432a910800", + "f0f2ff672a39e84b05f93e3eff97e10300aae14b05f9e0432a9121fdffd021203f910202805263fdffb0L16;FFfb0314aaf96f00f9192000b4f4030b2a0cb80094e00319aa2100805205b80094c05600b4e16b40f9e20319aae04700f908b80094eccb40b9eb03142af5000014BBBBL8;FB746f2073656e6", + "420435453495a450000b51d4000000000005600000000000000830000002700000073686f756c642062652061626c6520746f20656e636f6465L8;FF20008052e1031faae2031faa5d84009440008052e10317aa4384009400feff9000400d915a840094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9", + "f44f05a9BL8;FF800703ad420344ad820304ad410341ad810301ad420342ad820302ad410340ad810300ad800745ad8233c03de8bb42f9766e00a9623a803d600606ad800743adL8;FFe1030eaaef0310aa800700540b1140396bc100517f250071a8570054292d0c1b5f1500f1f6030daae1030eaaef031", + "0aa400600540b1540396bc100517f250071BBL8;FFf5031faa3400805237008052a8c300d1e00314aae8440094a9035d38a8935d383f050071e1000054a9835d383f050071ac090054e90a0035f80f41b25a000014L8;FFa80302d1e10316aa60c30291bc0302d1c370ff97a80358f81f0500b120120054e", + "082c13ce80700f9e8030b91f7430f91f89301b9e91740f90029803da8835af8L16;FFe8af03a9e84744f9e9a302a9e84b44f9e94f44f9e87b00f9e85344f9e8d300f9e85744f9e9230ca9e85b44f9e95f44f9e8ef00f9e86344f9e86f00f9e86744f9BBBL8;FF5c2040b9f60302aaf80301aaf30300aaf40", + "308aa0b680194000480522100805204680194e00d00b4c00640adf50300aa000400ade00318aad9630094f60301aaL8;FFa82300d1c2fdff9042203d91e1230091e8a701a950640094c0fdff90008025915d640094c0fdff9000603b915a640094c0fdff9000c03b9154640094c0fdff90BL8;FFe0030091", + "0800f0f2ff270039e80300f942eeff97e80300aaa1feffb0210c1691a3feffb063280f91e0030091c2008052a4008052e80300f9c7edff97e10340f9L8;ZDBBL8;FFe00e803d0080c43ce012803d0080c53ce016803d0080c03ce002803d0080c13ce006803db0280194810700d15f0700b1e12700f9800b", + "0054e00641ade0430691L8;FFe007c03de10bc03de20fc03de303c03d8302803d820e803d810a803d8006803de017c03de11bc03de21fc03de313c03d8312803d821e803d811a803d8016803dL16;FFab835ff8ec0313aa7701198bda0000b4e0030caae1031aaa2200805206a80094ab835ff8f40740f9d", + "80000b4e00315aae10318aa22008052ffa70094ab835ff8BBBBBBBL8;FB696f75732073657373696f6e20c00520666f7220c0023a20c000217374616c6520756e61636b6e6f776c65646765642073657373696f6e20666f7220c00d2028L8;FF08fc78d309fc60d3087b68782821084a095d1053095b6978", + "2001084a9c0700f11400144ac1fdff5411000014680100f008210091e103002900210091a22300d1BL8;FF280800f94c0200b5e0030daa47000014e10300a9e00301aae10309aa22008052f4030daabd050094e10340a9ed0314aa2aa040a9536928380cfc71d308050091L8;FFb60000b4e00315aae1031", + "6aa2200805209220094f5031baa59df78b3e003c03d28008052955e01a9986600a9800a803d68420039f44f49a9fb2b40f9f65748a9BBL8;FF19ffff17a0c300d1e1031aaa22008052230080522400805277edff97b7035ef82fffff17a0c300d1e10317aae20313aa23008052240080526fedff97b7035e", + "f8L8;FFf44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aa22008052f7000094610a40f9a5ffff17f50300aae00313aa22008052f1000094610a40f9e00315aaBL8;FF67000014e10314aae20313aae2edff97a00100b46b00001481620091e20313aaddedff97000100b47d000014600d00b5e00", + "313aabceeff97e80301aa40010036L8;ZDBBBL8;FB650d40000000000011000000000000006501000005000000650d40000000000011000000000000006901000005000000650d4000000000001100000000000000L8;FFe8031faa000117ab02650054e1630091568fff977f0600b18000005480220291e", + "163009134a4ff97df0600b1210c00545afdff17e8031faa000117abc2630054BL8;FF1f01096be0179f1a231701946802000ac802080a00010012f44f42a9f65741a9fd7bc3a81c170114ff8300d1fd7b01a9fd430091280440a90900009029013b91L8;ZFBBL8;FFff030191c0035fd6080040f949ffffd", + "029213d91e00301aa0801403908711d5308410051081d7d92226968f849ffffd029013e91286968f8e10308aa353e0114L8;FFd547ff97a1035df8e80740f9f30301aac80000b4e00b40f9e10308aa2200805205420094e10313aae81340f9c80000b4e01740f9e10308aa22008052fe410094L16;FFfc43", + "40f9e083803df8c741a9e74b44a9f6134ba9e30311aaf1031eaafe1b40f9eb0312aad5000014f7d300f9a80100f0edc70ba9e51300f9f40307a9e64300f9BBBBL8;FB73686f756c642062652061626c6520746f2073656e6420656b00000000000000801740000000000056000000000000005c000000220", + "000007a13400000000000L8;FF628e0094fd7bbfa9fd030091083c40f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091092440f93f0500b1400400540a2c40f9BL8;FFe10314aae20313aae00300f911120194f9d740f9f58b42b9f78f42b9fa1b00f9190a00b4f4d340f9", + "06120194e00319aa21008052ff110194800e01b4e10314aaL8;FFe0df40f9e10315aa220080520a120094e8e340f9880000b4e1035ca92200805205120094e15341f90130ffb4e05741f97cf9ff17e90b4091ea074091e0074091BBL8;FF610200ada2837bada103d93c620201ad6112803db60000b4e003", + "17aae10316aa22008052045201949f0600f16b020054e00315aae10314aa22008052fe510194L8;FFa0831df8201100b4080d8052b3835df8fc031faa887e089bfb0314aaa8031ef81100001436008052a9835ef8aa835ff868021c8b7b0700d15aa301919ca30191L16;FFf30301aae10308aa220080520", + "ad20094e10313aa20200091f30301aa3ed9ff9760420891ff074091ffc30091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9BBBL8;FFe10316aae20315aa230080522400805279fdff97760a40f940ffff17e00313aa22008052230080522400805272fdff97610a40f973feff17e00313aae10319aaL", + "8;FFe20318aafd100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aaf4100094fad342f9fc0740919c8301910ffeff17f60300aaBL8;FF2cfbffb43f0108eb7361193220030054536928380bfc71d308050091290040f9280800f9abf6ffb43f0108eb93611932400400", + "542c0440f90afc78d393692838L8;FF5a23999a94269f1a87ffff17fa0319aa3400805284ffff17d6020e917f7e00a97f7e01a9c10a40f97f1200f9610000b4610600f9a9000014734e00a9d30a00f9BBL8;FF008102919b120094f87f49f9780300b4e1d342f9e8cb42f9f97b49f91f0101eb208d0054e8", + "cf42f9490380522a040091e00318aa09692138e1431691ead302f9L8;FFb50000b4e00314aae10315aa2200805209320094e88340f9f69340f9008545a90c060094e88340f9f40300aaf50301aae00316aae10314aae20315aa039144a9L16;FF1f01206a4004005488018052e10240f9a82200390800809", + "2a80200f9810000b4e00318aa2200805203b20094610240f9810000b4600640f922008052feb10094BBBBBL8;FB7468206f72206e656974686572206b79626572207072655f6b65795f696420616e64206b796265725f636970686572746578742063616e206265207072657365L8;FFe003152af44f43a9", + "f51340f9fd7b41a9ff030191c0035fd6fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9fd030091ffc306d1f40304aaf70303aaf60302aaBL8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054092040f9090100b42a0140b24a11c0da4a1540d24a", + "0d0a8bL8;FFf30316aaefdb59a9ec031baafbdf5aa9f0031aaaee0318aaeb0319aa9c080014010700d1e8431391e006009107d9fe97e96b42f9e03bc13de13fc13dea8342f9BBL8;FF000400ad810000b4801e40f922008052095a0194e90340b908048052964e01b9885603a93f050071882200f9410100", + "54e803009100017eb2d9550094f50301aaL8;FFe80345f9e07fc23de9c32291e9bb03f9c904805260fdffd000542c91e86304f92800009008612a91e1c31d91e3c31791e8bf03f9a8fdffb008411f91e8fb02f9L16;FF020e0054217c0353210e00343f0800718c0100543f040071000300543f080071210", + "20054001b00b5a0c303d1bee6ff97e80301aaa0030036c8fcffb4d8000014BBBL8;FF1f0002f1230f00543f0108eb13601932200100542a0440f91f1040f15369283808050091280800f94202005400fc47d36e000014e10300a9e00301aae10308aaL8;FF1f0109eb499d0054180116aba20a0154b800f8", + "b6f9031faae00319aae10318aa41760094f90b00f9980300b4057a0094e00318aa2100805239008052fd790094BL8;FFfd0300916bfc7bd3f30300aae9031faa280080520a0180528b0300b574e87bd3ebef7db29f020beb08030054010100b421e87bd3e00302aa02018052e30314aaL8;FF5ffc3ff1290", + "100548102168be003152a0c0d00941f0400b140040054e00200b41600168bf5ffff17a0a300d1e10316aa79010094b45b7ea9b7835df8e20216cbBBL8;FFfa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9ff833cd1e8074091f30300aafa07409108810991e00301aaf5074091ff03", + "00f95a830991L8;FF0009803de86b40f97b6300915a0700917f0308ebc070005400e4006fa8220591fc432a9169ab40a9ff9b04f9f89f04f9f8ab04f90001803de8c324910011803dL16;FFf2d343f9f1d743f9e0db43f9e3e35e39e7f343f9e4e343f9e5e743f9f5435f39fc7300f9e27744f9fc6f40f9e", + "baf00b9eb0316aaf66740f9f02340f9e3b7803dBBBBL8;FB34c73fd722e729f7188713970ea705b76c4767577a67717740074b1756275d378fd784c799f792e7a397a887b5b7bea7d757dc47c177ca67fb17f007ed37e627L8;FFe00315aa3fe0ff97eeffff1740008052e10315aa44860094fd7bbaa9fc6", + "f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0309d10920463989000036BL8;FFe00313aa0c0a01949f0b00b101030054e89f40f9c002c03dc91240b9f59342b91f0500b1e063813de99305b9600000544063029130e4ff97f3d352a9140200b4L8;FFe80b40f9e10318aae20317aa0001198b", + "100a00942803178be80f00f9560300b4e10f40f9e80740f9b71240f91f0101eba00d0054e80b40f9490380522a040091BBL8;FFe95740b9686a04a9694e01b9e92740f96082893c694a00f9e8a741a961828a3c7c8600f9688e00f9e82f40b97ca60fa9e90b40f9682201b9e82340f9771201b9L8;FF6810", + "40f90b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a295c460094fd7b47a9L16;FFe81742f9e8c300f9e81b42f9e8ab00f9e81f42f9e92312a9e82342f9e92742f9e8ab1aa9e82b42f9ea3342f9e9a309a9e83742f9e92f42", + "f9e8af15a9e83f42f9BBBL8;FF0204805224008052e8830239011a00949f07003100260054f4de40a9e2031aaa600740ade00314aae10317aae00705ada50100941f0400f1c1230054f80301aaL8;FF0d6a0094611240f9410d00b4601640f922008052f30b40f9fd7bc2a8066a001461ce40f9810000b46", + "0d240f922008052016a009461da40f9810000b460de40f9BL8;FF214c1491a3feffd063b00e91e0030091420180524400805209000014e00300f9a1feffd0214c1491a3feffd063b80e91e00300914201805264018052c6efff97L8;ZFBBL8;FFe8ab00f9610a803d6082803c680e00f9f50000b4f30314a", + "ae00313aa52050094b50600f173a2019181ffff54e81f40f9c80000b4090d8052e00314aa02018052L8;FFe00303914526009448fdffd008c13091f7ff4539000540ad9ffe00f1ff2701f9ff2301f9e10301ade00710ad000941adc81f8052e803063908008092e20300adL16;FF74000094e80740f91f05", + "00f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a93ea60094ff0301d1fd7b02a9f44f03a9fd830091BBBBBBL8;FB2f73656e645f63742e7273006d697373696e672073656e64657220636861696e6d61785f6a756d7050726576696f75732008000000000000707265766", + "96f7573L8;FF0001805201308052479a0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0307d1380840f9f40301aa1f4300f1e1140054950640f9BL8;FF680640f9490280522a040091e00316aa6a0a00f909692138e10313aa6afbff97780a40f9680240f9080118cbdf0208", + "eb88070054680640f9e10317aae20316aaL8;FFe107803d410700b53b000014e90700f9810000b4e00316aa22008052061e0094e15740f9810000b4e00315aa22008052011e0094e0a30291e103192a7e110094BBL8;FFffc300f960030054e8031faa49018052096828380805009100630091e8c300f96a", + "180094e1c30591f0e3ff9700630091e1c3059193e9ff970e000014e8031faaL8;FF41fcfe9708068052e9f342f9e07fc13d6826089be183c13de287c13d69060091000500ad0209803de9f702f9e083329169f3ff97fc9740f9e89b40f91a008092L16;FF0020019161da0094e00313aa220080522300805", + "224008052b8010094610a40f9aeffff17e00313aa220080522300805224008052b1010094610a40f9b5ffff17BBBL8;ZBL8;FFe09b843de19f843dfb6f09f9f62b08f9e0ff833de103843de207843dfbeb0df908590154793600b4f7e74df9e10315aae20319aae002188b067e0094ae010014BL8;FFe403", + "13aae50314aaf44f42a9f65741a9fd7bc3a820feff1760fcff97fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30302aae20301aaf40300aa34010037L8;ZFBBL8;FFf85f02a9f65703a9f44f04a9fd030091ff4307d100e4006ff30300aa5f0401f156ffffb0d6820e91e08303ade08304ad82000054", + "e0c30191063e01945d000014L8;FF810000b4e06b40f9220080520a3e0094f6fe60d3f86b00f9ea0315aafc432a91e95740f968c6533935fd48d388380037cf01001401ed40b9080f40f9e00316aaL16;FFe95344f9e16744f9e85300f9e86b44f9fc6f44f9ea7202f8ea035e39f07744f9e8270ea9e8734", + "4f9f14340f9eaaf00b9ea5744f9e39314adf9bb48a9e9030daaBBBBL8;FBc4b031ea5594c733cb2e70ce02f2485fa235154c8ad5cc94ca760e28349ef3ec27f1e8beaaf611e960475463a78121c6030a37f8a28c005b1a67000007d1fe28L8;FFf4031faa8804805215feff90b50a3b9136008052e84b01f", + "9e04f01f9ff5301f90b0000146802148b8904805294620091090100a9b5220191090900f9f65301f9BL8;FF2b000014e05306f9e0833291e1feffd021e01291a2018052e3feff9063c039910401805222000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f9L8;FFfd7bc3a8c0035fd620fd", + "ff90006002915e0a009420008052e10314aa410a0094fd7bbda9f65701a9f44f02a9fd030091330400b182030054b300f8b6f6031faaBBL8;FFe80300aae00740f929008052092000a9fd7b44a9ff430191c0035fd660ffffb000602b915c4a019460ffffb000c02b91594a019460ffffb000202c91564a0", + "194L8;FF21e3ff54e8031faa080113ab6305005480fdfff000e009915c4a0094f3031faa080c47f81f0500b1e1e7ff54e8031faa080113ab2304005480fdfff000200691L16;FFe8ef01f968fefff008e11e91e9eb01f929038052e1430f91e8a303f962008052e8ab03f968fefff008c11f91e9a703f9e9", + "af03f9e90303aae3031d91e8b303f9BBBL8;FFf44f17a9fd830491f30308aa084840f9970280d21700f0f21f0500b1a0010054f40300aa004c40f9a8e300d1815240f972680094a8835c381f05007121010054L8;FFe843069163a303916423039185830091e00316aa060480524716ff97facb40f9e8634", + "6395f0b00b161100054f7430f9108150036c08641a9a90302d1e8430f91BL8;FF3f0108eb8112005481220091e20313aafe040094f50300aa2d0200143f0900b1a0140054e80b41b23f0108eb4114005481220091e20313aa09060094f50300aaL8;FFb1ffff17e2031aaa230080525f000094dfffff17f7", + "6343a9f96b44a9aaffff17fd7bbea91f5c00f1fd030091f30b00f920010054010000f021a843f9330040f9BBL8;FF4cf9ff17e043169122008052c3110094e1d342f956f9ff17e043169122008052be110094e1d342f95ff9ff17e043169122008052b9110094e1d342f98dfbff17L8;FFfb0b4bf9f90f4b", + "f9fc134bf9f8174bf9f51b4bf9450000140a0180d20804805209c480520a00f0f2e89f04f9e9a704f95a650091a1035df8611b00b5de000014L16;FFe00317aae10316aa220080520aae0094b40000b4e00315aae10314aa2200805205ae009408008092e1230b9102398052688600f8e00313aa06ae0094", + "30000014BBBBBL8;FB6a00000000000000950000002e000000110000000000000014000000000000001400000000000000403a400000000000513a400000000000653a400000000000L8;FF2901084aaba31638abd35638a9b31638a9e356384a01084aa2833bad6b01084aaac31638aaf356382901084aa", + "bd31638ab035738a9e31638a91357384a01084aBL8;FF08fd46d30900088b340500919f0208eb69060054e00313aa080c48f81f0500b18002005428fdff97080040b20811c0da081540d2080d088b0825019109fd46d3L8;FF0add003909e10039e9ab4b290ae5003909e90039e843139157120094e00740", + "91e1431391028c815200401d9109160094e00b4091e843139102c4805200c00e91BBL8;FFfa2700f9df0600b1e10000541f000014f42740f9f66740f9fa2700f9df0600b140030054a8035bf8fc6b4da91f0119eb40210054a8835bf82a070091a14301d1L8;FFa9fdff9029813291e9d302f9fbc342f9f5", + "c742f9e8631639f7cb42f9e80180528083cf3c7f0b00b1a80319f8404f803dc1220054f8630191e8031691e00315aaL16;FFe22740b95f080071c3000054080080927f220039680200f974f5ffb5aeffff17e39340a9e0431e91a1035db842faff97e8030091e0432d91e203009101c10091BBBL8;FF6806", + "40f9490280522a040091e00315aa6a0a00f909692138e10313aaf3fbff97770a40f9680240f9080117cbbf0208ebc82b0054680640f9e10316aae20315aaL8;FF28040091f87749f9e8d302f91f0700b1a01a0054c022029187240094080040b20811c0da081540d2080d088b0825019108fd46d30900088", + "b390500913f0308ebBL8;FF010040f9f30300aa810000b4600640f92200805208f60094610e40f9810000b4601240f92200805203f60094611a40f9810000b4601e40f922008052fef50094L8;FF007861f881020e91022900913f7822f82300001484020e9180c0208b00c04d391f8c0171a9feff5402e9", + "0091c6040011c07c7d93827862f800c0268b5f0000ebBBL8;FFe8eb46f9f94b09f9e2a3843de267c33de09b843de06bc33de19f843de16fc33d4083843ce073c33d4183853ce197c13d4083863ce09bc13d4283833ce293c13dL8;FFe9b34e39e04301f91c490091280280520000803dfc3b01f9e83f01f9", + "e84701f9e9430a3978010014f9430891e84741f9f7432a912083c63cf8c30d91a80319f8L16;FFe8e35739695f40f9e1c30391e047803d6013c93ce8e30339685340f9e99300f9e0938f3ce88700f994150094efb343f9ff0900f1010b0054b60000b4e06740f9BBBBL8;FB1d1c400000000000540000000", + "000000073000000050000001d1c400000000000540000000000000079000000050000001d1c4000000000005400000000000000L8;FF80fcff54e00316aa39f3ff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eba96f0054170115ab42de0054f50314aaBL8;", + "FF200942ad200b02ad200540ad200700ad3d99ff97e0234da982e20291e16340f9081140f900013fd6e03b02f9e8031691e13f02f9290c40f9e103129120013fd6L8;FF0d060094f3ffff17d70000b4e806178be00316aa0201805201ed7cd306060094f71f40f936008052ff2200f18018005408058052f", + "a0317aaf766089bf5d240a9BBL8;FF3f0700b1fa0301aaf903999ae01b00f91c159f9ae81740f9fb03889adf0600b1e0070054e82f40f9e0c30291f6230ba9e80b40f9e86300f93beaff97f60300aaL8;FF810000b4a20a40f9e00314aa0a460094686645391f05007161010054612640f9810000b460224", + "0f92200805202460094612e40f9810000b4602a40f922008052L16;FFe8af00f9e87745f9e9a310a9e87b45f9e98745f9e8b700f9e87f45f9eaa318a9e88345f9ea8b45f9e8eb00f9e88f45f9e88f00f9e89345f9e82b14a9e89b45f9BBBL8;FFe8e3009100c1009189e9ff97e00314aae10313aa022b805", + "20e660194f44f56a9fc9340f9f65755a9f85f54a9fa6753a9fd7b51a9ffc30591c0035fd620008052L8;FFe0031faa2823189b000d803de083c43c0011803de083c53c0015803de93740f9093100f929070091e083c03c0001803de083c13c0005803de083c23c0009803dBL8;FFa10800b5a80640f91f01", + "19eba9040054e00313aac4f2ff97e007003728fc60d3c80400b5200840921f1800f1a2050054217c0353210600343f040071c0010054L8;ZDBBL8;FF420080520c260194685a40f9a80000b4605e40f901f97fd34200805206260194686640f9a80000b4606a40f901f97fd34200805200260194687240f9", + "a80000b4L8;FFa00000b4613240f9610000b42200805209260094611a40f9810000b4601640f92200805204260094614640f9c10000b4604240f922008052f30b40f9fd7bc2a8L16;FFc9a245a9d5ffff17c0420191820080522300805224008052b8c9ff97c13240f9ca2a40f9e9ffff1769018052eae70", + "1b28b0480d2e97ea99b4a0941d2c23240f9" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines8 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines9.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines9.lean index 50f171840..4adc30064 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines9.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseLines9.lean @@ -27,359 +27,252 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub9 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FFc0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091170c40f9e80201ab62220054160440f9df2200f1e90316aae3000054df0600b1L4;FF20008052fd7b43a9ff030191c0035fd6ad20ff97fd7b43a9ff030191c0035fd6c000009000403a9128200094c000", - "009000a03a9125200094c000009000003b91L8;FF00801a91312001948002009000e01a912e200194fd7bbda9f50b00f9f44f02a9fd030091f30300aa4003f8b7f40308aa130100b41b200194e00313aa21008052BBL4;FFb4feffb49f0600b1c0190054e00319aae10314aa2200805226a00194eeffff17", - "e13b40f9810000b4e03f40f92200805220a00194f4e740a9f30318aae14740f9L4;FFf35341a96effff1701000014fd7bbba9fd030091f55b02a9f50301aa600200b4f35301a9f30300aa20008292e0ffeff23f0000eb88140054f76303a9610e40f2L8;FF810100d021101591a40100b084c03491e00300", - "91a363009142008052b30f00f971a0009468420191810100d021d01d91a40100b084200a91a363009142018052BBBL4;FFf9feffb50f0000141f0400b1217c00544be001941f100031a17b0054f9ffff1748e00194f70300aa1f0400b141fdff54e04305918100805243e00194807a0035L4;FB3c3d20c00", - "02f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f62797465732d312e3132L8;FF00c140f9e06f00f900c540f9e05f00f900c940f9e0e300f900cd40f9e05b00f900d140f9e00700f900d95aa9e03f00f900dd40f9e03300f900e1", - "40f9e0f700f9BL8;FF21242291e40200d084200c91a363009122018052a80f00f97360019468c20091c10200d021b83191e40200d084a00c91a363009162018052a80f00f96a600194L8;FF1f0101eb60020054680640f9090180522a040091e003152a6a0a00f909692138e10313aae5fcff97f4fbff35f", - "44f42a9f50b40f9fd7bc3a8c0035fd6e00313aaBBBBL4;FF0c00098a42696cfc438c212e6d00669eadc101f2a0010054ae01c0dace11c0da8e0d4e8bce01098acefd0b9b4e010e8bcf015ab8bf020f6b20020054ae0500d1L4;FFe90314aa696a2af8680200f9f44f42a9f50b40f9fd7bc3a8c0035fd6fd7", - "bbda9f65701a9f44f02a9fd030091130840f9f40308aa330200b4160440f919000094L8;FF0cfeffb40a7c15533f0108eb53611932200100542a0440f90bfc63d35369283808050091280800f98b0200b5e0030caa1b000014e10300a9e00301aae10308aaBL8;FF000040f912180014ffc300d1fd7b01a9", - "f31300f9fd430091130040f9e00301aa010300d021001891e8030091020180526c80019468620091010300d021c02991L8;FF0825019108fd46d30900088b36050091df0208eb682e0054c8010014e11740f9e80f40f91f0101eb407d0054e81340f92a0400918022029149038052ea1700f9BBBL4;FF090", - "c40f9f30308aa3f0500b120060054083840f9a80400b4090d8052153440f9b9a300d1177d099bf40301aaf8031faaf6c300913a0340b2bba301d1a08640a9L4;FB6f6c3a3a73657373696f6e73657373696f6e5f76657273696f6e72656d6f74655f6964656e746974795f7075626c696373656e6465725f", - "636861696e72656365L8;FFff0300f9f30300aa0232805200844dad0274c03de10313aaf40308aae2db803de0071aad01804cade0030091e10319ad28c00094e84306916182079102328052BL8;FFa18301d1e92f09a9e9c30091e9230aa9a8c301d10900009029b12891e82b0ba9e8430091e8270ca9480", - "08052a90200f029e10491ea430191a8273da9a80200d0L8;FF0001009000401291304000940001009000a012912a400094000100900000139127400094ff0301d1fd7b03a9fdc30091080040f9090540f9490d00b40a0140f9BBBBBL4;FF89ffff17e80f41b296ffff17a0031df8210400d021682c912304", - "00d063b82c91a0c300d142018052e400805224000014a0031df8210400d021682c91230400d0L4;FFe04300b9a04700d1ebc1ff97f903002aa04700d1e8c1ff97f603002aa04700d1e5c1ff97e8074091e98b41b908411d9109010039e98341b900fd0039e0074091L8;FFfdc30091f30308aae00700f9e8", - "630091e11300b9e0230091e1031faae2031f2a52100194e80f40f91f0500f1a1010054680200900821389109018052ca068052BL8;FF550600b4349b40f926900194e00315aa2100805224900194e00d00b4e10314aae20315aae00b00f9f52300f929900194353b40f9345341b9285741b9e83f00b9L8;F", - "F21d80d91e8230091e00309aa4200805263900094820100b042803091e0230091e10300915f9000945f900094fd7b42a9ffc30091c0035fd6ffc300d1fd7b01a9BBBL4;FF29b10191ca0100b41f010beb080500914a0500d1ed338b9aae7d0c9b2e696eb829c10191df01016be1feff54e80d8092a825089", - "b007103d1c0035fd6e0031faaL4;FB12bd0e6bfa26afed655bdac64fb23c9eed85a28c0000a7d4f13656e20000f02c262a66d154ce8391271a8b429c3385f592d3e1bca9382dc28cfc233fab8ad5a0L8;FFebb344a9e0bf46a9e69f43a9e4a74ba9fadb4aa980010014fb5300f9280200d008b140f9eabf4", - "0f9e5b340f91f0900f1e5b300f9eabf00f9a92b0054a8010090BL8;FFf44f43a9f70b40f9f65742a9fd7bc4a8c0035fd636008052765200a9771200b9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd620008052e10314aa35500194L8;FFe7e2ff97e8c342f9200bc03dfbc742f9e9db42f9f5cb42f9f7", - "cf42f91f0500b1404f803da90319f8601a00542083c33ce85f04f9e9671f91a80359f82183c43cBBBBL4;FFf44f02a9fd030091690400f0290140f94ad03bd55301098b694240393f05007141020054692a40a9000440ad2b0500916b0200f9eb0300d06b611991017100b9L4;FB7465206b6579696e7661", - "6c69642073656e6465722072617463686574207075626c6963206b657957686973706572546578745f5832353531395f5348412d3235L8;FF9f6608a99f7e09a9997e0aa99fb200b981020291e003082ae20313aa02f3ff97201200b520fcffb4d6ffff17890240f93f0500b1e10000549f5e00a99f7e01a", - "9BL8;FFa363009122028052b30f00f97670019476700194fd7b41a9f31340f9ffc30091c0035fd6e00301aa010300b021c01f91a20080525d700114090040f9e80300aaL8;FFe8d302f9f88b49f9b80300b4e1d342f9e8cb42f9f98749f91f0101eb40430054e8cf42f9490480522a040091e00318aa0969", - "2138e1431691ead302f9df0c0094BBBL4;FF29210091c001098be7ffff1709c201d12a0080920a2500a9f44f43a9f51340f9fd7b41a9ff030191c0035fd6e90300d029010091ea230091e02700a9630300b0L4;FFfd7b41a9ffc30091740800143f2000f108018052e02300912180889ae20313aaff0700f", - "9270f0094e803002ae0031faa08010035f40740f9d40000b4e00314aaL8;FFe14300910232805232b00094000741ada8035ff8a8521da9a0860dad020340ada2820cadb60000b4e00317aae10316aa220080521fb0009460220091ff030e91BL8;FFe9f35639e06302f91c490091280280520000803dfc5b", - "02f9e85f02f9e86702f9e943133919000014e033c33de1d3c23de9c31291e8ab45f9fc5b02f9e037813dL8;FF1f0500b140000054a5eeff9775de4ea9970100b4b822009104000014f70600f118630091e000005401835ff881ffffb4000340f9220080521e300094f8ffff17BBBBBBL4;FF08c040391f0d", - "0071a1010054135042a9880240f9680000b4e00313aa00013fd6810640f9c10000b4820a40f9e00313aaf44f41a9fd7bc2a81e180214f44f41a9L4;FFddffff17a00000d000c02f914018009420008052c101805233180094a00000d000a03491a20000d042202f91e10680522e18009420008052e101805", - "22a180094L8;FF29008052280908aa932201a9f44f42a9f65741a9fd7bc3a8c0035fd620008052e10313aa30180194e10300aae00308aa72f7ff17fd7bbda9f65701a9f44f02a9BBL4;FFe1e20191a2e300d15081ff97e0ebffb495000014bf6335a9bf0316f8e1220191a2e300d14981ff9700ebffb4af0", - "00014bf633ba9bf031cf8e1a20291a2e300d1L4;ZBL8;FFa2008052a80f00f97798009468c20091810100f021ac1a91840100f084a00b91a3630091a2008052a80f00f96e980094810100f021401b91840100f084c01a91BBBL4;FFa8835f38e9b300b8a9035ef8e8c30039e89f0039e8230091e9f300f80", - "9810091a8a73da9c803009008211d91a8831ef808008012ea1700f9eb7301f8eaf301f8L4;FB636865742d623538643766353665333634356363642f303639353962342f7372632f7574696c2e7273002f636172676f2d6769742f737061727365706f737471L8;FFf28f00f9ed6300f9ee3700f9f70700f", - "9e5d300f9a5d0ff97eb1b43a9ea0315aaf2d751a9ef0314aae5d340f9f70740f9e70316aaee3740f9ed6340f9f4031baaBL8;FF810000b4e09349f92200805229580194e19b49f9810000b4e09f49f92200805224580194b30000b4e07b49f9e10313aa220080521f580194e18349f9810000b4L8;FFe803", - "01aae0010036882a00b5e1031faacaffff17e02500b5a02302d156f4ff97e80301aa40010036482600b5e1031faac2ffff17e1031faae82f06f9bfffff17BBBBL4;FFe85b00f9e80240f9e01b803de18b03ad680000b4e00315aa00013fd6e10640f9810000b4e20a40f9e00315aa21f80194c18a41ade02", - "3c03de85b40f9800601adL4;FB623562353537662f62797465732d312e31322e312f7372632f62797465732e7273002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e2dL8;FF217c0353210700343f040071c00300543f080071e00100543f0c007121fdff5488824bf81f0500b18", - "10000549fe60ba99ffe0ca99f820d3881e20291e20313aaBL8;FF6a2600a922150054e00319aae1031caaa4000014aa135438e8031faa691b009103000014e8031faa692300914a1d409208010aaa69a200a908008092e03340f9L8;FFfb010014f7e74df9e80740910103198be00317aa08812f918befff", - "97e8f34df91f0900f160220154e0074091e10740910232805200c0359121802f9125780094BBBL4;FF6b0d0b8b6b250191691b4b8b37050091e80208ab42100054140500b102230054b400f8b6f5031faae00315aae10314aa2db801941bb80194e00314aa21008052L4;ZDL8;FFe02300917db700941900", - "0014bf0208eb41040054e023009178b70094e80b40f980564079a9060091e123009116693538e90f00f9e6d1ff97e10f40f9e80740f9BL8;FF090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46", - "d3L8;FF2c380094fadf49a9e15f40f9810000b4e06b40f92200805226380094fb6340f9f8c30d913a080014f66b00f9f6fe60d3f44700f9f85f00f9fa5700f9619243f9BBBBBL4;FF2104009021d429912304009063201891e0230091a20180520401805212000014e00700f92104009021d429912304009", - "063082a91e0230091a201805244018052L4;FFf403012a3f240071f30300aaa9030054a8999952e02300918899b972887ea89b01fd63d3f2ffff97f50f40f9e10740f93f0015eb00030054a899995249018052L8;FFfd7b42a9ffc30091c0035fd6410200f021381a91e00308aaa2028052fd7b42a9ffc30", - "09161080114410200f021901691e00308aaa2028052fd7b42a9ffc30091BL8;FF2925019129fd46d329050091280108ab830000544d000014e80308ab62090054693a40f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8bL8;FF29880094c00b00b4f60300aa25880094e00315aa41", - "00805223880094000b00b4eaa743a9ecaf42a9eeb741a9f0bf40a91100001440008052560080525c008052BBBL4;FFe0030291e2008052e400805214000014fa0300aa14000014e04300f9a103009021242891a303009063e01791e0030291e20080520401805209000014e04300f9L4;FB6b2e727300766", - "56e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f646f75626c655f726174636865742e727300c01b20736573L8;FFf7bb02f9f4831d91e88f05b9e87340f9f6bf02f9fcc302f9f98b05b9e8cb02f9a21c0094eeb343f9df0500b1e00b0054eb831d91e9e343f98aa20191", - "6011c53cBL8;FF0001178b33480194e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00013fd6e0031faaf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391L8;FF080115cb5f0008eba8010054b40000b4680640f9e20314aa0001158b2d480094a802148be0031f2a680a00f9f44f4", - "2a9f65741a9fd7bc3a8c0035fd6e00313aaBBBBL4;FFf40300aaf9e240a9e2031aaa000400ade00319aae10318aa0c0200941f0400f1612f00543f0018ebe2310054080d8052f6031aaa3964089b3a2340f9281b40f9L4;FB380000000000000008000000000000000caa400000000000882240000000000", - "04000000000000000080000000000000044ab40000000000062a2480000000000L8;FFe8af40f91f011beb49060054a0c303d112e7ff97801c003728fc60d3e81a00b5200840921f1800f1e21a0054217c0353011b00343f040071200200543f080071BL8;FF84e01291e0030091a363009122018052a80f", - "00f974680194e102009021302991e40200d084402391a363009182008052b30f00f96c6801946c680194fd7b41a9L8;FFd50000b4a806158be00314aa0201805201f17dd327680094745642a9950100b49622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f9BBBL4;FFe22a803", - "da87f35a9e18206ad8af1ff9700e4006fe08209ade0820aade04ec03de152c03de256c03de35ac03de336803de232803de12e803de02a803d7f020039L4;FFc81b80d2000080d2620080d2430480d204008092050080d2010000d40d00001440000f91240000b0030440f9069441a9dfffff17060180d2e3", - "1c80d2e50306aaL8;FFe0020191a1c303d12200805208050091a80317f85aa80094bff31438f40315aa82fe46d3bcc303d1e20000b4a80357f880030191e10319aa0801028ba80317f8BL8;FFff830191c0035fd6800200d000000091830200b063603691840200d084e00091a27f0091e10680523228019", - "4ff0302d1fd7b06a9f44f07a9fd83019109004039L8;FFe00314aaa6e6ff979dfeff17b50600f1d6620091a0010054c1825ff881ffffb4c00240f92200805222280094f8ffff17a0c300d1e1031aaae2031baa6feaff97BBBBBBBL4;FF618101ad628d00ad5cfaffb520000014090180520801098b292100", - "910801148a206b68fc00a8200e0a00669ecafbffb5f9ffff17200340fd00a8200e0800669eL4;FF2800805296260129952a01a98b3202a968220039f44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd6a00000f000002b91361c009420008052c1018052L8;FF0001805201058052421c01946002", - "00f000601d912a1c0194fd7bbda9f65701a9f44f02a9fd030091f30302aae20301aaf40300aaf50308aa14010037e00315aaBBL4;FF08011e4afe9f40b9e8e21e38e8125f389c031e4afea340b9fcf21e38fc225f387b031e4afea740b9fb021f38fb325f3808011e4afeab40b9e8121f38e8425f38L4;ZF", - "L8;FF200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54a001009000601391279c0094a001009000001c91249c0094800100b000001491219c009408004039BBBL4;FF53dc0194530400b0e80b4091e00b409161ba40f908411b9100c01a914ddc0194e00b4091a80304d100401b914adc0194c80", - "3009008010391f60b4091000540adL4;FB496e74363456616c756500000000000040124900000000000a0000000000000055496e74363456616c7565000000000060124900000000000b00000000000000L8;FFf10b42f9e11742f9fa3742f9f65342f9e82b17a9e80742f9ea1b42f9e66b42f9fe6f42f9e", - "c7342f9e9231fa9e81342f9e90f42f9fb7742f9f47b42f9e37f42f9BL8;FF345c0194e8074091e00740910881099100c0359118e1079108e10791bdce0094e0074091e1074091023280520080019121c03591275c0194e00fc43de113c43dL8;FFaa0000f04ab10d91a80319b8280000b0086120912b0000", - "906b210291e92306a9a9630091a07f0091e92b07a92900009029c10191f42708a9e9030091a18301d1BBBBL4;FFe00314aa5affff17400340fd00a8200e0800669e0801c0da0811c0da18fd43d3546b7838caffff17000400d000e0159137fc0194ff8303d1e923076dfd7b08a9L4;FB69627369676e616c", - "2d70726f746f636f6c2d613434636635613164633062366666632f6f75742f7369676e616c2e70726f746f2e7365616c65645f73656e6465L8;FFf65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd65802009018932091f9c303913b0080921600f0d21700809207000014e103082ae20313aa630", - "c8052BL8;FF150300b0b5e2129168220591010300b021c03491e0030091a3630091e2018052e40315aaa80f00f96f7c0194140300f094422391010300b021343791a3630091L8;FFe11740f960fcff17e06300912200805223008052240080520592ff97e11740f972fcff17e06300912200805223008052", - "24008052fe91ff97e11740f9b6fbff17BBBL4;FF092440f9000109cb1f000aeb48000054c0035fd6fd7bbfa9fd030091800300f000400191820300f042a00191a102805241bc0194fd7bbfa9fd030091281040f9L4;ZBL8;FFfd830191280840f9f30301aa1f8125f181040054681640f91f010ff1210400", - "54e10313aa340c43f89f0600b160070054753240f9f60300aae003009156daff97BL8;FF130500917f0209eb691e0054080c47f81f0500b160180054b2feff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebL8;FF69220b916182ca3c6282cb3c77720ea9200", - "1803d6082c93c686e01f968a20b9169aa4ca90001803d68e20b91757201f975420e910101803d68220c910201803dBBBBBL4;FF680a00f9889640f91f0500b1a0090054610a40f9680240f91f0101eba01f0054680640f9964241b92a040091959e40f9490e80526a0a00f909692138b6020034L4;FFa103", - "0054985040b9f60302aae30700a9f50304aad691fe971f0400b1c00d005408040091ff0208eba1020054f90600f1e00300541b0c0094e00319aa21008052L8;FFc0035fd6e30302aae20301aa410200f021603991440c0114fd7bbea9f44f01a9fd030091f40301aaf303002a1d0c0194000180520101805", - "21b0c0194400100b4BL8;FFa02300d1b08c0094e80300aae00301aae8fd07362400001428008092680200f9ffc30a91f44f43a9fc0b40f9f65742a9fd7bc4a8c0035fd6f55355a9e8430591L8;FFf65301f9d6060091df7e00f1e0240054248c00948007805241008052228c0094206b00b4a00640adc906", - "00d1e84b41f9a20ac03d000400ada0c2c23c3f0108ebBBBL4;FFe1031baa38cc0194e80316aaf60301aaf41f00f9e80700f928008052fad70429db0300b4e82b40f9f403192af903172af80f00f9f8031caafc0316aa171540f9L4;FB6a00000000000000120100002e00000025194900000000006a00000", - "000000000bd0000002e000000000000000000000008000000000000000800000000000000L8;FF160f01b427cc0094e00316aa2100805225cc0094602c01b4e10318aae20316aae06700f92bcc009470080014e9031faa08008092690600f9683601a90cfeff17BL8;FFc00240f9220080522a4c0194f8ff", - "ff17680e40f9480100b40805088be00314aa01f17dd302018052f44f43a9f70b40f9f65742a9fd7bc4a81e4c0114f44f43a9L8;FFe803088b09f6ffb5b6ffff17e9031faa0a2440f9aaf9ffb50a3040f9e903098b8afaffb5daffff17000100d000c01191234c0094000100b000203691204c0094BBBBL4;", - "FF080900113f01086bc2000054480080520858012928008052080000f9d3010014e00300f9e00304aaf80303aaf70302aa86c30094e803009008010391fa0300aaL4;FB6f6e2076657273696f6e426f7468206f72206e656974686572206b79626572207072655f6b65795f696420616e64206b796265725", - "f6369706865727465787420L8;FF680240f91f0101eba0090054680640f9090180522a040091e00317aa6a0a00f909692138e10313aa9debff97560300b4610a40f9680240f9b70640f91f0101ebBL8;FF1f050031c0010054f71740f9fc0700b4e0031aaae1031caa22008052256c01943a000014fa0300", - "aae0031aaa2854ff9708008092686e00a901ffff17e0c3c73cL8;FFd50100b4340840f9370040b9340200b4246c0094e00314aa21008052226c0094800200b4e10315aae20314aaf60300aa286c0094080000147f0200f9f44f43a9BBBL4;FF80030191e10314aa0801028be83300f95bac0194e00300918", - "102168be20315aaf5ff00392bac0194e00743adf4430291e223c03d16108052e1031f2a95020191L4;FF0a340d5308690baa0b1c015308710aaa09017cb22811889a7f021f7269067792ea179f1a3f0108f14901332aea079f1a3f01007269010c0a0b010aaaea138a1aL8;FFf44f0da9fd030291368841b", - "9f30301aaf40300aa23ac0094003080520101805221ac0094c01300b4f50300aa1dac009400308052010180521bac0094001300b4BL8;FFe8d302f9e80180522083c13ce8f304f94003803d28ffff17e94341f9295541b9e91700b908b140f9fb2740f91f0900f1c9040054e23740b9a08302d1e103182aL", - "8;FFe083269108a10c91000540ade807409108011891e06b823de16f823d9204ff97e8034bf9fc074bf9fb0b4bf91f0500f181010054881f00121f050071ec040054BBBBBBL4;FFe10308aa220080522300805224008052f4030caa96060094e10340a9ec0314aa2aa040a9290040f90bfc63d3536928380", - "8050091280800f9cbfdffb43f0108ebL4;FF31070014e9830c91e0d3c03d2181c03c298141f8e03f813d4183803ce97702f9e0431391e86b02f9fef1ff9708008092880200f9b50000b4e0031caae10315aaL8;FF0a2840390b3100390b2c403909350039093040390a3900390a3440390b3d00390b38403", - "909410039090080120a4500390b4900390c4d0039090100b9c0035fd6BBL4;FFfa0740f960ffff17ffc305d1fd7b11a9fc6f12a9fa6713a9f85f14a9f65715a9f44f16a9fd430491480040f9f30300aae10700f9e80400b4490440f9e8a701a9L4;ZDL8;FF29050091280108ab02080054691e40f9090100", - "b4290140b22911c0da291540d2290d098b2925019129fd46d329050091280108aba2060054694240b93f050071BBBL4;FFe08300914ac90094a1835df8e10000b4a8035ef8f40300aa22008052e00308aa24d40194e00314aae01300f9a10300f021982a91a30300f0633c2b91e0830091L4;FB95339d879", - "781d3361233702688af989c4cb8a28c8c21d2aa0000ed5dea1973d2900cd2a9b9f378c0466add7306d95319235ef973d2aa00006dbd045484954f2dL8;FFe9bf43f9eac343f9e09b833df22f44f9e13344f9e9ff00f9e9c743f9e63b44f9fe3f44f9e44344f9f94744f9e9cf00f9e9cf43f9e34b44f9ec4f", - "44f9f15344f9BL8;FFdf0c0094fad342f9e8cb42f908011acb1f0308eb48420054e8cf42f9e10319aae20318aa00011a8b2a5401944803188bf90b40f9fa0740915a830991e8d302f9L8;FF280340f9680000b4e00313aa00013fd6210740f981fcffb4220b40f9e00313aae0ffff17e8ef42f9c80000b40", - "805088be00314aa0201805201ed7cd31d540094BBBBL4;FF21442391e30300f063b42391a0e300d1220280522401805287e80094b4835cf8b4ffff17c80600d1090080921f0d00b1697200a908f8ff54e10316aa94000014L4;FB7369676e65645f7072655f6b65795f7075626c696320697320726571756", - "97265647369676e65645f7072655f6b65795f7369676e617475726520697320726571L8;FF1f090071e1010054e00302aaf30302aaf40301aa11f3ff97e80300aae00301aa08020037750240f9a80640f9160100eb62020054e80f41b2e80300f907000014BL8;FFa0e300d102028052040180528a680094", - "b6835cf8b1ffff17e043c73cfb1f00b9fc0b00f9fa0f00b9e00f803db80000b4e00316aae10318aa220080521d740194L8;FFe14a0054e8cb42f91f0101eb00ba0054e8cf42f9290400911f692138e9d302f985ffff17f37749f97f0600b1e0020054e18f49f93f0400b140010054810000b4BBBL4;FFf85", - "f03a9f65704a9f44f05a9fd030091ff8308d15b0080d2f30308aa09008092a8a303d1bac303d11b00f0f2a08731a9a9831cf8a8a73aa9e10a00b4f60301aaL4;ZBL8;FFe0031caa02018052011109cb29b40094681a40f9600ac03d966200a9692a492988ee02a9280080528082813c950a00f9991e00f98", - "82608298a6a0929f44f51a9BL8;FF002900b5a02302d14cecff97e80301aa80000036682900b5e1031faae1ffff17e1031faae8830cb9deffff17e18b0cb940ffff17a88357f8080540f9150101ebL8;FFe1031faae82705f9bfffff17e1031faae8470ab9bcffff17e1031faae8530ab9b9ffff17e1870a", - "b9eafeff17e1830ab9e8feff17e0dcff54c9010014a0dcff54BBBBBL4;FF298fedf2ea8decf2080008ca090009cae08702a9e8a700a928000aca6aae8cd28a2eaff2e0230091ff7f04a94a8cccf2ff1f00f9aa8ceef229000acaa1730091L4;FFfceb40f9e1031aaa22008052230080527cf9ff97e8bb41b", - "9e9e340f9e92700f9e8680037f52f00f9f5e740f9fc2300f9ba0000b4e00315aae1031baae2031aaaL8;FF220080522b04019461d640f9810000b460da40f9220080522604019461e240f9810000b460e640f922008052210401946022009185fdff9760820791f30b40f9BL8;FF08200091200440a9e923", - "00910a0000b04ae11991e8a700a9020300d042e03b91ea0f00f9e34300913f840194fd7b43a9ff030191c0035fd60820009109800091L8;FF083040f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140b", - "2BBBL4;FFe0630591e1a30a91022a805231c4019460820091e1630591022a8052755200a9776201a92bc4019449000014e0c302f9f6bf02f906000014e80b41b2e2c302f9L4;FBb462470000000000000000000000000000000000000000000100000000000000f85547000000000097654900000000004e", - "00000000000000b904000017000000L8;FFe95300f9e3a35d39e4bb43f9e8a301f9e8035e39e5bf43f9eaf200f8e24f44f9eb5344f9f65744f9f85b44f9ea6344f9e9030daafa6b44f9ec6f44f9ed7744f9BL8;FFe00313aa2200805232030094610a40f9daffff17e00313aa220080522d030094610a40f", - "9eaffff17fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30301aaL8;FF1f0b0071a1070054faa359a92083c13c2183c23ce00600ad808601ade8b700f9bc0000b4e0031baae1031caa22008052204400945f0b00b1c1f2ff548082c23cBBBBL4;FF1803008bf9feffb50f0000141f0400b101fc00544", - "ae401941f10003181fb0054f9ffff1747e40194f70300aa1f0400b141fdff54e04305918100805242e40194L4;FB08000000000000000800000000000000088a43000000000025e84800000000004d00000000000000e80200000500000025e84800000000004d00000000000000L8;FFe9c341f9e1e3823", - "de2e7823dc082803ce9b705f9c082c03ce1dfc23de0431e91e2e3c23de3e7c23de1030b91e9d345f9eab745f9e2031faae303152aa0039d3cBL8;FF130800b91f300039f44f41a9fd7bc2a8c0035fd600018052010280523d640194fd7bbda9f50b00f9f44f02a9fd030091f40302aaf303012af50300aa1", - "9640194L8;FFb8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcb9f0208eba8040054340100b4680640f9e10315aae20314aa0001178bBBBL4;FF1f2100f16a0e40f90831899a08010acb680a00f9f44f44a9f65743a9f85f42a9fa6741a9fd7bc5a8c0035fd60021", - "0091e10308aa21a4019490ffff17fd7bbda9L4;FF20486038f55b42a9f76343a9f96b44a9fd7bc6a8c0035fd6c302109161c0218b23c04d3903fdff346304005123c00d39f35341a9fb7345a9e5ffff17f35301a9L8;FF42008052b30f00f977a4009468020291810100f021cc1791a40100d084200f91a3", - "63009182018052a80f00f96ea400946ea40094fd7b41a9f31340f9ffc30091BL8;FFe18301ad600a40ad8012823ce08741ad8212833c8012803c8112813c9f020039f44f48a9fd7b47a9ff430291c0035fd6ff8300d1fd7b01a9fd430091280440a9BL4;FFe10313aa38240094ff8301d1fd7b04a9f32b00", - "f9fd03019100e4006fe80301aaf30300aae1830091e00308aa02048052e00301adddd5ff97e9ff4039e8834039L3;FB00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000051e57464060000000000000000000000BBBBBBBBL4;FFe5ff", - "ff17ffc302d1fd7b05a9fc6f06a9fa6707a9f85f08a9f65709a9f44f0aa9fd430191170c40f9e9830091e22702a9e80201aba20f0054160440f9c9060091L4;FFff830391c0035fd6ff4301d1fd7b03a9f44f04a9fdc30091f40300aae0630091aa150094f30742a9e8030091e00313aaa01e0094e80340f", - "91f0500b1e0010054L8;FF8802009008011c91755a01a9685200a9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6f80300aa01400091200080528c1e01944002f8b788020090BBL4;FF220080522b9e0194f8ffff17e80740f9c80000b40805088be00314aa0201805201f17dd3239e0194ff8", - "31791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L4;FF820000b4010000394200083681e01f78c0035fd60000803dc200303780009f3c620028360004803d80009e3cc0035fd60004803d000001ad80003fadc0035fd6L8;FFffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa810100d02", - "12c1e91e8030091c20080526e9e009468220191810100d021881591a40100b084a00a91BBBL4;FFe0430591810080524fde0194003c0035e85341b9e82700b957ffdfc8770000b548de0194f70300aaff0600b180020054f843059199008052e00318aae10319aaL4;FB36643835366166303938352f6c69", - "62726172792f616c6c6f632f7372632f737472696e672e7273001a696e76616c6964206368617261637465723a20666f756eL8;FFe8e303f9e9a358a9f61304f9f01704f9e8ff03f9e8eb40f9e9f303f9e80304f9e89b40f9ec1b04f9e80704f9e81740f9eb1f04f9e82304f9e82740f9f22704f9BL8;FF0", - "2908052f50300aa325e0194255e0194002c815221008052235e0194609601b4e1074091022c8152fb07409121800991f70300aa192c81527b830991255e0194L8;FF1f0101ebc0090054680640f9090180522a0400916a0a00f909692138e10313aae6faff97e00314aa080c43f81f0500b160000054e103", - "13aa0bfeff97950a40f9BBBBL4;FFf44f06a9fd8300910960403909140037150040f9f30300aae2030091165c4229a00645a9f40308aaf65f0029e7f9ff9718fc79d3e0e7076fea031faaa82643a9L4;ZFL8;FF0800f0f2c9ffff17e80b41b2e00700f9c6ffff17880080d20800f0f2080140b2c2ffff178", - "80080d20800f0f208110091beffff17e00300f9410200d021a41a91BL8;FFe00308aa62028052fd7b42a9ffc30091667e0114092000912103009021e03191240300908460319126030090c6a0309103800091a9831ff8a52300d1e00308aaL8;FF7f0a00b100040054e11740f9e80f40f91f0101ebe04b00", - "54e81340f92a040091e00315aa49018052ea1700f90969213891d9ff97e1630091997dff97807a40f9BBBL4;FF1f0900b1a1020054350080528800805229008092745601a9692200a9f44f4ba9f55340f9fd7b49a9ff030391c0035fd6e083c03ce183c13ce283c23c600600adL4;FB74696f6e2d6964009", - "08749000000000011000000000000001d01000005000000908749000000000011000000000000000a010000050000009087490000000000L8;FFfd430191f40308aa280cc0dac90100d029413091a8831ff828048052f30300aae9a301a9a82300d109018052e28f03a9e0030091e163009162008052e8a7", - "02a9BL8;FFe20301aae00308aae10309aa633e0114fd7bbfa9fd030091080040f91f0500b1000b0054083040b9e80b0034080140b20811c0da081540d2080d088b08250191L8;FFff470039e80700f94933ff97e80300aa01010090214002910301009063200591e023009102018052a4008052e80700f90", - "9000014e00700f90101009021400291BBBBBL4;FF240080529a000094610a40f97cffff17e00313aae10317aae20315aa230080522400805292000094770a40f9680240f9080117cbbf0208eba9efff54e00313aaL4;FFea431391e09bc03da300009063203091a5000090a5c03091e89701f9e89340f9e0", - "830a91e1830c91e40313aae86b02f9e9a350a962c20391e6431391e7031faaL8;FF680080521535889a680240f9080114cbbf0208ebe8000054680640f93f0002710801148ba20100540101003926000014e00313aaf603012ae10314aae20315aaBL8;FFe10316aa388e019420008052e10315aa358e019", - "400018052e10313aa328e0194e00301aa4103009021802091c20280525e8e0114000040f9080040b908050051L8;FF83ffff54800100b0008032912c8e0094600100d000001491298e0094fd7bbca9f70b00f9f65702a9f44f03a9fd030091140040f9f30300aa9f0600b140020054BBBL4;FF240080529a", - "c0ff97e12740f9e00313aaabfeff17e0e3009122008052230080522400805292c0ff97e12740f9b3feff17f30300aae0e300912200805223008052L4;FB1a782e830d0e9152b1952c3f1eb49aa770d4a68e0000000000000000798b9ccdcae002bc000000000000000000000000000000000000000000000", - "000c8c5defbL8;FFe9af1aa9ebf340f9e8df00f9e8af40f9e88700f9c2f1ff17e00100d000402b9127ce0094e00100d00040289124ce0094fd7bbaa9fc6f01a9fa6702a9f85f03a9BL8;FF69038052d0feff17eaa759a9e8430f912083c13c2183c23c2283c33c2383c43cfa9741b9e00600adea1700f900", - "0504ad020d05ade90b00f9bc0000b4e0031baaL8;FFfd7b41a9ff830091c0035fd6ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191350840f9fa0301aaf30300aa750500b4540740f9BBBBL4;FF3250009427ee0194000480522100805225ee0194c00100b4e00741ad0804", - "8052e80300a9e2030091e103142ae80b00f9000400ade00313aa98390094f44f45a9L4;FB7320696e76616c69646e6f206b65792074797065206964656e7469666965720e626164206b65792074797065203cc3200080690400013e00696e76616c696420L8;FFe80b41b2e00700f99bffff17c80080d208", - "00f0f2080500d197ffff17c80080d20800f0f20809009193ffff17c80080d2e0230039e00300910800f0f2ff270039BL8;FF84c02591e3230091e00308aae20080526a6e0194fd7b41a9ff830091c0035fd6ff4305d1fd7b0fa9fc6f10a9fa6711a9f85f12a9f65713a9f44f14a9fdc30391L8;FFfad342f", - "9fc0740919c83019190fbff17f60300aae0431691220080523c110094e1d342f9e00316aacafdff17e04316912200805236110094e1d342f9dbfdff17BBBL4;FF74220ba9e8fe70d3699a0179e90b40f9600a03ade083c33ce283c53c683a0339a88354f869720df8a9035538610200ade083c43c68f20df", - "8a8035cf8699e0339L4;FFe0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6200020d4ff4301d1fd7b02a9f65703a9f44f04a9fd830091f30300aa820400372a004039L8;FF00210091a22300d121008052e3031aaaa40100d084401291e80b00f9bc831ff858ae0094e003172a68e34", - "039e103142a1f050071c0fcff54fe060094f703002aBL8;FF20008052e10316aa372e019420008052e1031caa342e019400018052e10313aa312e019420008052e10319aa2e2e019420008052e10313aa2b2e019420008052L8;FFe10309aae20f0ea9c2e00191e3031f2ae74300f9e4170ba9e62b0ca9ff", - "730b79ebef02f9ebf302f9fff702f9e4170fa9e61f10a9ea8b11a900013fd6e0e302f9BBBBBBL4;FF680640f9e10315aae20314aa0001178b30160294e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00013fd6e0031faaf44f4da9f6574ca9L4;FFfc3701f9e09f803d384100b4e8", - "0240391f0d0071800d00541f09007181400054010700d1e8431391e0060091588bfe97e86b42f94083c03c4183c13c4283c23cL8;FF0b0840394a910baa0b0c40394a710baa0b1040394a510baa0b1440394a310baa2a0d78b3091c4039490109aa0a0098d28d0c8052ca8fbdf2aa45dcf2aac9fff2BBL4;", - "FFbc0000b4e10740f94003088be2031caa30960194c80215cbf56b00f91f0308eb281d0054b80000b44003158be1031baae20318aa27960194fa5b4ca9b70000b4L4;ZBL8;FF0801098b130500917f0209eb691e0054080c47f81f0500b16018005457faff97080040b20811c0da081540d2080d088b0825", - "019109fd46d30800098b08050091BBBL4;FF8a0340f9f51740f94801088b882700a9a8fe60d3e83a00b5a00a40921f1800f1023b0054a17e0353213b00343f080071ad0100543f0c0071000400543f100071L4;FBb11c49000000000055000000000000008a01000021000000b11c4900000000005500000", - "000000000af01000021000000b11c4900000000005500000000000000L8;FFe72340f9e31340f9f70316aae14740f9fb031caa090080928a008052e80319aaea270ea9ea6341a9f9fb42a9e61f40f9ebb344a9f57b40f9e0bf46a9ed0740f9BL8;FF84000014e1d342f9e8cb42f91f0101eba0730054e8cf", - "42f949078052f8074091188309910969213828040091f97749f9e8d302f93f0700b1c01d005400230291L8;FF018100912081803c3256009440030291e2833291e10313aaae92fe973c008092fb4340f9fc5b02f9d5010014c90080d2fb4340f9fa8302910900f0f23c450091BBBBL4;FF090d40f9e84300", - "9120013fd6e80b40f91f0d00b181030054880200f9680080522c0000146006c03d775a40a9f50301aae003803d1bf601940005805201018052L4;FB6579697465726174696f6e0073656564537071724b657973536565644e6f6e65536f6d656e616d65000000005a65726f696e64657850656e64696e675", - "072654bL8;FF080500d162ffff17c80080d20800f0f2080900915effff17c80080d2e10700f90800f0f2080900d107000014e80b41b2e00700f904000014c80080d20800f0f2BL8;FF01030090214c2791040300f084401391a3630091a2018052a80f00f9727601940103009021802791040300f084c013", - "91a3630091e2008052b30f00f96a760194L8;FFb00e0094ff074091ff833c91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e067c13de8d342f933ffff174b0080522c0100348c0140b2BBBL4;FF6223c03d624f803d608708ade00743ad608706ade00b44ad608b07ade00742ad6", - "08705adec560094a10303d1e00316aae20317aa27b60194608744ade80b40f9L4;ZDL8;FFff0303d1fd7b06a9fc6f07a9fa6708a9f85f09a9f6570aa9f44f0ba9fd830191094c40b9f90300aaf80308aa3f090071a20700542a2f40a9e92f00b9295741a9BL8;FFe1d7c23de89b06f9e80f40f90083893ce", - "8d306f9e923452901838a3cf98306f9e8b70db9e80740f9e9b30db9e93f40b9e8df06f9e82740b93f010071e9eb0db9L8;FFe90302f9290080d2e81b02f9c8048052a934c0f2ea1f02f90a078052001f813dfff301f9e8fb01f9ffff01f9ea0702f9e81302f9e91702f92a360094e1f343f9BBBBBL4;FFe1", - "0313aa37a60094c80240f9a90640f9e21bc03de00742ad08251a9b0801188b000502ade00740ad0219803d000500ade00b41ad000901ade80240f908050091L4;FFf44f07a9fd830091385040b9f50301aaf30300aad8030034080340b20811c0da081540d2080d088b0825019108fd46d308050091b70a4", - "0f9170300b4e90240b2L8;FFbf0600b160020054148440a9f30300aae00314aac8030094d50000b4a8e279d3e00314aa02018052011115cb21060194610e40f9e10000b4601240f922008052BL8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108aba209005409", - "2440f93f0500b1c00300540a6040b9092c40f9ca070034L8;FF680240f9690a00f91f0500b1e0130054608640a9c2fe44d322d6ff97b78359f8f503002a133c0853a88358f8ff0208eb61000054a0e301d170850094a80359f8BBBL4;FF2925019129fd46d32905009102000014e9031faa280108ab22160", - "0547f0600b1a0150054690240b22911c0da291540d2290d098b29250191691a498b29050091L4;FB746f2073656e6420435453495a45000097614900000000005600000000000000830000002700000073686f756c642062652061626c6520746f20656e636f6465L8;FFfa5300f9fa4f40f9ea5f40f9e3b", - "7803de20713ade8f200f888018052e0a3803de6030991683e00a9e00759ade86b40f969ba03a969ff60d3602e00f960c20891BL8;FF680240f9080540f91f0115ebe91a0054e00313aa49feff97e80300aae00301aac8fd073708fc60d3681a00b5080840921f1900f1a21a0054017c0353c11a0034L8;FF", - "00e01e912e460094000100b000c015912b4600940001009000203691284600940001009000a02791e1031faac0035fd6c0035fd6e30302aae20301aa010100b0BBBBL4;FF7f4a0039680600f92802805268220079480080527f5e00397f3201b8680200b9f44f44a9f51b40f9fd7b42a9ff430191c0035fd", - "6e20300b042603191e00301aaL4;FB6372617465732e696f2d313934396366386336623562353537662f70726f73742d302e31342e342f7372632f656e636f64696e672f766172696e742e7273002fL8;FFdf0208eb610b005458000014680240f997621932df0208eb61000054e00313aa76e5009468064", - "0f9d50600919f1240f117693638750a00f9c200005494fe47d3BL8;FF0200001433008052e003132a436601941f1c0072e0079f1af44f42a9f65741a9fd7bc3a8c0035fd6ff4304d1fd7b0ba9fc6f0ca9fa670da9f85f0ea9f6570fa9L8;FFf30b00f9fd030091090040f9e8008052f30300aa2a0900d13f", - "0500f14881889a1f2500f14810005449010090298100918a0000102b6968384a090b8b40011fd6BBBL4;FF81010054ea0f40f9090180d20900f0f248dd7892290140b20a000014ea474039090180d2e8031faa0900f0f205000014090180d2e8031faa0900f0f229017fb2L4;FFe31000129f02036be9104", - "0d38d000054000080d21f000039007d20d4631a40b96324d41a83000036000080d21f000039007d20d4631e40b96324d41a83000036L8;FFe10314aae20315aa230080522400805207bcff97e10313aaf35341a9cdffff17a00100900020209125a6009408004039e00301aa1f0900710c010054e8010034", - "BL8;FFfd7b48a9ff830291000440ad1f0100390011803c0111813cc0035fd6290080521f0500f909010039c0035fd6290080520a2500390921003909010039c0035fd6L8;FFfd7bbda9f65701a9f44f02a9fd030091150840f9080040f9f40302aaf30300aa080115cb5f0008eba8010054b40000b468064", - "0f9e20314aa0001158b25260094BBBBBBBL4;FF290dc0dae08302ade01f803de013803de007c03de10bc03de20fc03de303c03d8302803d820e803d810a803d8006803de017c03de11bc03de21fc03de313c03dL4;FFa06300d1e103172af911009428008052a16300d1e2630091e00316aaffa301a9ff17", - "00f959f5ff9713000014e083c33ca1835ef8e003803de10100b4e00315aaL8;FFc00100541f890071600000541f710171a1010054e3430091e00313aae10314aae2031baae80f00b9f65701a93e1a0194a0fc0736cfffff17e00313aae1031aaaBBL4;FFe0179f1a459a0194e8474039292740391803000a", - "1f01096be0179f1a3f9a01940803000a4803080a000100123b9a01941f1c0072e0010054a06300d1e10316aaL4;ZFL8;FF08140038299a00941f1f00f1a8010054a0877aada10301d1e00314aa22008052a0073eada08b7bada00b3fad549a009400e4006fbf0318f8a0833aada003973cBBBL4;FFe9a340", - "b868260039ea1f4079eb834039ec1340f87f020039a91b00b969a200b8e92341a9aa3b00796b8200396c1200f86a1e0079692201a9fd7b43a9f32340f9L4;FB69737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f70726f73742d302e31342e342f7372632f6", - "56e636f64696e67L8;FFe8b303f9e80300aa0002009000dc3191e4af02a9fb271ca9f2ab00f9f7eb10a9e8bf00f9e77b04a9f11300f9f56300f9ef3b00f9f04300f9e61f00f9ea0700f9BL8;FF8c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c05009102000014ec031faa8b010b8b280108", - "8b49010b8b0801098b090140b22911c0da291540d2L8;FF280000b008911f91e8a705f9e8c31691ea032d91e9af05f9290000b029612091e8ab05f9e8c32791a04700d1e9b705f9290100b029413191e8b305f968008052BBBBL4;FF20013fd6e80340f91f0d00b181030054880200f9680080522c000014", - "795e41a9f50301aa76a64039781240f91dfa019400048052010180521bfa0194600500b4L4;FB69676e616c2f727573742f70726f746f636f6c2f7372632f67726f75705f6369706865722e7273001753656e6465724b657920646973747269627574696f6e20L8;FF8082883ca10379ad8282873ca203d1", - "3c8182813ca10f7aad8082823c8282803c8182833c8382843c76000014e08744ade00314aae85b40f9a0873cade08742adBL8;FFfd7b02a9fd830091e80300aae00301aa098540f83f0500f141010054e80300f921030090212c0891e8230091220180525b7a0194020300f04240239109000014L8;FFa10", - "241adf40300aaa20e40ad010001ad020c00ade007409100800991837a0094f70300aa1f7a009400908052210080521d7a0094c09601b4e10317aa02908052BBBL4;FFe2e7076f218c222e21a8302e3100261e910500375f2100b1603200544a210091f32b40f9fa2f40b9fc1b40f9500110abe3faff548f0", - "10014f80a40f9e91340f9L4;ZBL8;FF220080522bba0094b70000b4e01b40f9e10317aa2200805226ba0094e00319aa011080522200805222ba00947c008052e087c03d88f242f8290080927c220039BL8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054092040f9090", - "100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8bL8;FFe84b05f9e80000f008c10891e94f05f969038052e00000d000fc3591e8f301f9e1432a91e8fb01f9e80000f008811091e3830f9162008052e9f701f9e9ff01f9BBBBBL4;FFe20303aa51f3ff97602900b4210400b021a01f912304", - "00b063fc3491e00700f95f000014e10300aae003022ae20303aa46f3ff97002800b4210400b021a01f91L4;FFe00315aae10314aaaa0a0094e80340f91f0500b120010054e003c03de80741a929008092690200f96082803c680e00f9e10200b5e9ffff171a0a0094c0028052L8;FF6202009042400191e9", - "ab00a9e3230091450a0194fd7b43a9ff030191c0035fd6202040a96102009021440e91030d40f902038052fd7b43a9ff03019160001fd6BL8;FFa20301d15173ff9720f3ffb437000014a00301d1ac8a0094f80301aa00f6073647000014f8031faa45000014480b0091b8031df805000014e80b41b2a003", - "1df8L8;FF4d5a7078f44740f929010b4a4a010c4aa801084a20010a4a097c18535a0b0091080300795f0314eb495a69780920094a2a5d10534a5a6a784901094a09070079BBBL4;FF80320a9b021109cb2cca0194740a00f9f44f41a9fd7bc2a8c0035fd6092840a9eb0309aa090100f929010a8b608540f", - "c0a0c40f9290500910088202e09a901a9L4;FB440100001c000000000000000000000008000000000000000800000000000000a0e7450000000000000000000000000008000000000000000800000000000000L8;FFe8835739695340f9e1030e91e0eb803d6093c73ce8230e39684740f9e06700f9e0831", - "d91e9db01f9e092833ce8cf01f9391c0094efb343f9fa0315aaff0900f1BL8;FF40011fd661ce40f9810000b460d240f922008052274a019461da40f9810000b460de40f922008052224a019461e640f9810000b460ea40f9220080521d4a0194L8;FFcd030094e80300aae00313aa090140b22911c0da29", - "1540d2290d098b2925019129fd46d30801098b130500917f0209eb890f0054088c5df81f0500b1c00c0054BBBBL4;FFe30317aae40316aaf2fdff97e85b42a9f76f43a91f0500f1a100005408008092b76e01a9a85a00a955000014e0830091e10314aae2031caa03480094e86742a9L4;FB720000000000", - "00001100000026000000e41f400000000000180000000000000008000000000000005876400000000000e41f4000000000002000000000000000L8;FF080116cbbf0208ebe9f3ff54e00313aae10316aae20315aa230080522400805203000094760a40f997ffff17ff0301d1fd7b02a9f44f03a9fd83009", - "1480001abBL8;FF0825019108fd46d308050091090c40f93f0500b180030054091440f92a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b290500910a1840f92801088bL8;FFe2430e91fa030b91808907ade3838b3ce3838c3cb09cfe97e89341b9080e00362007c03de9b341b92143c23ce8c7", - "41b9a6000014480100d00821029169038052BBBL4;FF292d0094e8f77fb21f0008ebe8350054f72740b99f0600f1602300542800805249018052c96a283808050091a14301d1e00315aaa8031cf88a95ff97b6035cf8L4;FF2e318b9acaf17dd350157bf2e0fdff54b001108bf1030daa320240a9220e41a", - "9318200913f0210ebe40332aae50320aae60322aa84fc47d3a5fc47d3c6fc47d3L8;FF08028052f6031faa38008052f723032917038052e80300a9ff0b00f9f58300390c000014e80740f9a083de3cd6060091a822179ba9835ff8aa060091df4200f1BL8;FF42a01091010680524b2a0194609fff170100", - "40f9810000b4000440f922008052242a0114c0035fd6ff0301d1fd7b02a9f44f03a9fd830091480001aba2020054L8;FFe0031aaa010480522200805228031c8bf6032491000500ad262a0094e883249181830091e00319aa08410091f37cfe97bb0000b4e00319aae1031baa22008052BBBBBBL4;FFa826", - "00a9680240f9080540f9180100eba2010054e80f41b2e80700f9e023009143070194f44f4fa9f6574ea9f85f4da9fa674ca9fc6f4ba9fd7b4aa9ff030491L4;FFedc3ff97e8074091e9ab41b908411d9109010039e99b41b900fd0039e007409109050039e99341b900401d911aed003909090039e98b41b", - "916f10039090d0039L8;FF0970003949c1001108010d0b0974003969c1001108c1001109780039087c0039c0035fd600e4006fe8031f2ae9031faae003bfadea0300912b6869386cc10051BBL4;FF08017fb2ea1e409229010aaa68a600a9e10740f928008052680200b9811a00b4e00314aa22008052ff0", - "74091ff030c91f44f44a9fc0b40f9f65743a9f85f42a9L4;ZDL8;FFe80300aae00301aa2a0900d13f09007149819f9ae90000b43f0500f161020054810100d0219c2b91e20280525f920014ff8300d1fd7b01a9fd430091810100d0BBBL4;FF3907009120130054483740b91f01176b41ffff54480340f91", - "f0500b1e0feff54408740a9a84302d1c7ab0094a80357381f05007120feff54083340b8090340b9L4;FB15cbd89342e67621ca0d44d47397a28c6b70e99f000079840a543aafb1f977b68dfb72793ab885b4161fe047fc081a8924dda1931a954aac60ab6c15a88a5511L8;FFfbf346a929038052e8a303f", - "9e00100d000303791e8ab03f9e80100f008012991e1430f91e3031d9162008052f8eb01f9f80311aae9a703f9e9af03f9e8b303f9BL8;FFdbfdff17e0431691e1031aaae20318aa30110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aa27110094fad342f9fc074091L", - "8;FFe8a3113929008092a80240f9690200f9680000b4e00314aa00013fd6a10640f9e12a00b4a20a40f9e00314aa2152009453010014fc831291e8db42f9f9031691BBBBL4;FFa10f0054aa835df8e92e00d148dd789278000014a8a35cb8abab7da9a9e35c78ac035df8a8031bb8a8835e78aa031af8aa9", - "35c38a9431b7869038052a8831a78L4;FB76616c696420636861696e206b657900fe924800000000004c00000000000000df0000002b00000045737461626c697368656457697468507178646800000000L8;FF49050054e00313aa14f1ff9740fd073728fc60d3080500b5200840921f1800f1220500542", - "17c0353410500343f040071e00100543f08007161fdff54880248f8BL8;FFa99317384901084aaac35738a9a317386901084aabd35738a9b317384901084aaae35738a9c317386901084aabf35738a9d317384901084aaa035838a9e31738L8;FFe1d342f9e8cb42f91f0101eb00750054e8cf42f9490680", - "52f4074091948209910969213828040091f68b49f9e8d302f9df0a00b1410f0054f9031faa84000014BBBL4;FF21f42691630300f063202791a0031bf8a04301d162018052640180521e000014a0031bf8610300f021f42691630300f0634c2791a04301d162018052a4018052L4;ZBL8;FFe00301ade003", - "02ad82080094b71e00f924b20094000480522100805222b20094e00c00b4e00740adf70300aaa11240f9000400ad810000b4e00316aa22008052BL8;FFe86b06f9a802009008e10491e86f06f9e85706f9880200f008cd2191e86306f908078052e97b06f9e9c32291e86706f9280080d2e97f06f9c90480", - "52683bc0f2L8;FF000500ad0209803d89020094f5ef41f9e8e741f9bf0208eb61000054e0230f917968fe9708068052e1eb41f92223c03da906089b200743ade8b34e39a2060091BBBBBL4;FF0800669e18c101f200030054e90700f90803c0da0811c0da880f488b0801198a5b1b08cb68035df8bf0208e", - "b2101005461835cf8e00316aae20315aa33020294L4;FFd582009104000014940600f1b5c2009180010054a1025ef8810000b4a0825ef82200805223020094a1825ff8e1feffb4a00240f9220080521e020094f3ffff17L8;FF0b000014680640f9e10316aae20315aa0001178b2f020194e802158b680a0", - "0f9186300f1396300914004005436d77fa9e00314aae10313aa99010094e00315aaBL8;FF130300f073e21091e0030091a1630091e20313aab40f00f994a2019169820194b5a201f121ffff54e003009166820194f44f43a9f51340f9fd7b41a9ff030191L8;FF2911c0da291540d2290d098b2925019129", - "fd46d3290500918a2a80b9ea0400344a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a0500918b1a40b9BBBL4;FFfa0300aa39008052e003192a43c201941f1c0072e0031aaac1feff540aa440a908038052e00f00f9e0830b91e1e30091ff2700f9f9830b912829089be95f02a9L4;FBc0272", - "0776974682050524556494f55532073657373696f6e207374617465202862617365206b657920c0012900204e6f2076616c69642073657373696f6e2066L8;FFa1820791ee170094a0077bada8035af8a20f7cadf72f02f9e82b02f9e85f42f9e007813de10b813da08739ad4083c63c4183c53ce313813d", - "e20f813df52342f9BL8;FF950a40f9550300b4610a40f9680240f9960640f91f0101eb20080054680640f9490380522a040091e00315aa6a0a00f909692138e10313aad1faff97770a40f9L8;FF690480520a00f0f2e8a716a95a1100d1e10740f9a1e6ffb59efdff17000100b000201991030100b063c01", - "191040100b084001a91a24700d1e10680522d420094BBBBL4;FFe85341b9e8a700b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eba3ba0054L4;FBfced4800000000004b000000000000007f0b00000e0000001ced480", - "0000000006a000000000000005b000000260000001ced4800000000006a00000000000000L8;FFff0600f1ab000054e0b740f9e10317aa2200805227e200949acd0736e2ffff17e8432d91e0430f91611f009428c30091a02302d11b2d0094e0ffc23de103c33dBL8;FFe10200f021800091141000f91fa0", - "003913a40039f44f42a9f65741a9fd7bc3a8c0035fd6000180520106805239620194fd7bbea9f30b00f9fd030091f30300aaL8;FF0900f0f2e8470039e90700f9e02300914757ff97f44f4ea9f95b40f9f6574da9f85f4ca9fd7b4aa9ffc30391c0035fd6f623009137008052180d8052680240f9BBBL4;F", - "F0801805208000039f40000b4a10240f9f50300aa00040091e20314aa2da20194e00315aae10313aaf44f42a9f65741a9fd7bc3a8c0035fd6600300b000e01591L4;FF930f0037b5ea0091207875f8200f00b562020032407c40930328009100e80091367863f8207860f8b60000b4c11a40b981000035c1", - "1e40b941000035000c0091L8;FFe003009170a20094f44f43a9f51340f9fd7b41a9ff030191c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091080040f9e00301aa15d140a9e8030091BL8;FFc0035fd6d30100b426220194e00313aa2100805224220194400100b528008052880600f90902805", - "2936a29f8880200f9f44f41a9fd7bc2a8c0035fd620008052BL4;FF600a40f922008052f30b40f9fd7bc2a828220014f30b40f9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091010040f968028052290041d23f8d00f12831889aL3;ZBBBBBBBBBBL4;FF000c428b0000158a626ae0386202f836022000", - "d152fe79d33f0600b14200158a726a20386202028b52200039c00900543f020debc80700541f000deb88070054L4;FF280800f99cffff17e00700f9e00301aaf30301aae10309aa220080522300805224008052f4030a2a070000946ba240a9ea03142ae00740f9690240f9e10313aaL8;FF690100b517e9", - "7bb319000014e00314aa4100805250feff97965e41a9986640a975feffb5e80319aa160000141d1f019400058052010180521b1f0194600500b4BBL4;FF08e13491400300b000ec2b91e85302f9e8830791e1231291e85702f9e8830091ea4b02f9f84f02f9e95b02f9509f0194e19b41f9210100b4e09f4", - "1f922008052L4;FF1f5c00f1fd030091f30b00f920010054010000f021cc40f9330040f97f0200eb330100b4c000005421400091fbffff17000000f01348463906000014330440f9L8;FF7a9f0094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa810", - "100d021c01491e803009182028052699f0094BBBL4;FF060000141f0400b1415c00544cdf01941f100031c15b005439feffb505000014e04305918100805247df0194005b0035e85341b9e84700b957ffdfc8770000b5L4;FB45024900000000004e00000000000000d00200001d00000045024900000000", - "004e00000000000000bc0200001500000045024900000000004e00000000000000L8;FF0c345da9ec7f00f9ed4b00f9009c00541f05007101bf00548800805209008092790a00f968220039690200f907dbff97cb100014e0032b91f50301aa21200091BL8;FF35000191383040f92000178be21640d2e10", - "31f2af91640d216140038235f01943f1f00f1a8010054800640ad80020191e103009122008052e00700ad800a41adL8;FF680240f9deffff17e00313aae10308aa220080523e02009469aa40a9dfffff17fd7bbda9f50b00f9f44f02a9fd030091f30301aa210840f9f40300aa680240f9BBBBL4;FF68070", - "0b4e00642a9e2330091f663019135faff9709fc79d3e0e7076fe8031faa0b0c8052210d010eea2640a90c00098a42696cfc438c212e6d00669eadc101f2L4;ZFL8;FFcbf7ff363f1d00f140f8ff544b1dc0394c2100912e2100d10c3900a96d19001221c40daaabf6ff363f2100f120f7ff544b21c0394c2", - "500912e2500d10c3900a9BL8;FFfd7b41a9ff030191c0035fd6000040f9caf9ff17080040f9e20301aa002140a9e10308aa5d7f0114000040f9537f0114000040f93f7f0114000040f93c7f0114L8;FFd4e2ff97080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f0008eb", - "89180054e16300919b7eff97e11740f9e80f40f91f0101ebBBBL4;FFeb031faac9420091ea0319aa2c8541f88d0140b28c010b8bad11c0daad1540d2ad0d0d8bad2501918c194d8b9f010bebc31300544a0500f1eb030caa81feff54L4;FB30eb4700000000006120446973706c617920696d706c656d656", - "e746174696f6e2072657475726e656420616e206572726f7220756e65787065637465646c7900L8;FF1f8120f101060054682240f91f010ff1a1050054e10313aa348c44f89f0600b1000a0054753e40f9f60300aae023009159ddff976082c13c688242f8e183c23cBL8;FF343f0194582f40f9d80100b5", - "c3ffff1737008052591740f9b7831ff859fcffb535008052572340f9b6831ef8b8431fb877fdffb534008052582f40f9f8f6ffb4L8;FF0015803de93740f9093100f929070091e083c03c0001803de083c13c0005803de083c23c0009803d892200f90c000014e003082ae20313aa630c805269f9ff97BBB", - "BBL4;FF290500912001088be10313aa95faff971601003513000014e8031faa75feffb5e003088be10313aa8efaff97b6010034610a40f9680240f91f0101eb602d0054L4;FFe80f41f9022b8052e087813de81303f9300f0094e8d740f91f0500f14b450054e1d740f9e0031caa22008052210f00942502", - "00143a000014e0d7c53de1dbc53dL8;FFfd7bc1a8c0035fd660020090006032916202009042e0329121038052460f0194000040f96c0f0114080040f9e20301aa002140a9e10308aa580f0114ff8301d1BL8;FF292100918003098b1c00188a296b7cfc208d282e0800669e17c101f241fbff54f4ffff17e", - "8430091e00314aaf5430091fb8e019488624039f40341a9290300d0L8;FF08e14039600240791f050071c0fbff5408e8ff9760020079f44f42a9fd7b41a9ffc30091c0035fd6ffc300d1fd7b01a9f44f02a9fd430091a80100d008210191BBBL4;FFe82340f9290400910a018052e00317aa0a692138e1e3", - "0091e92700f991baff97360300b4e12740f9e81f40f9b71240f91f0101eba0230054e82340f929040091L4;FBdac6a28c95d610754bfc363f00000abadf8326a4bf3f2a760c8e69b4dd02e71be172d18f0f826bea9651aaf59e9ae0bab3571a5b081a4ed735daf8a2296006a8L8;FFe8008052eeb300f9e3", - "f340f9e87300f9ee734ca9e8db40f9e4a709a9e4030caae50700f9e9031aaafa0317aae89300f9f70301aae18f40f9e8d740f9e2831aa9BL8;FFe8d303b9e9ab0779e8a759a9ecb300f9eda305392b1f0036ebd343b9e96306394921c993e8cb00f9ecab4779e31b40f9eb3b00b9a00302d1e2e300918b12", - "45f8L8;FFe8c302f9000100d000301b91e8cb02f9080100d008813e91a10302d1e303169142008052e9c702f9e9cf02f9e8d302f913e3ff97a10353f8810000b4a08353f8BBBBL4;FF9b0300b41c1340f939008052f70314aae8164038891740381f01096be0179f1a3eef01947b0700f11900190a21ffff", - "5402000014f9031f2ae003192a37ef0194L4;FB4b00000000000000bb0000000e0000007472756e63617465642063697068657274657874617373657274696f6e206661696c65643a2062797465732e6c656e28L8;FFe10300aae00301aaf44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd63700", - "8052a80640f91f0116ebc9070054e00313aa09eeff9760fe073728fc60d3BL8;FFe00314aae10313aab50f00f9e82700a9456f0194e000003620008052f44f43a9f51340f9fd7b41a9ff030191c0035fd6a8820091a9fffff029312291e20200d0L8;FF42800991e0031f2ae3031faa340a0094e04316912", - "20080523d120094e1d342f9f2f9ff1748074039e2074091400100d000c02e91430100f063200891440100d0BBBL4;FFe10d005499030090391b09913a04805204000014790300d0392320911a028052a00301d10496ff9708008092796a01a9685e00a9f44f5ea9f6575da9f85f5ca9L4;FFfd7bbaa9fc6f", - "01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9ff0740d1ff071ef83ffc3ff18900005409008092090100f973000014L8;FFe20a00d1e1031f2af30300aa27af00947306148be9031faa28008052d7010090f7e23b911b00809268e61f78e80309aa29f57ed3ea1740f90805009", - "1f80313aaBL8;FF800200d000d02e91e80303f9880200f008611591e1833291e3c3179142008052f35306f9f45b06f9e9ff02f9e90703f9e80b03f903dfff97e1a345f9810000b4L8;FFdd56fe97e82340f91f0500b1c0000054e013c03de82b40f92003803da80318f80c000014e8a744a9c00000f00030", - "3391a1a301d1a8a738a9a8e301d129fdfff0BBBBBBL4;FF220080522b1702946002039137feff976022019108feff97617e40f93f0400f18b000054608240f92200805221170294619640f93f0400f18b000054609a40f9L4;FF00e4006fa04700d1e143139102048052e03b813de037813de4c8ff97e9bf", - "5339e84353390a088052e0074091fa8309912a15003308111d1200401d91e8431339L8;FFa8fe45d3890640f93f0108abe2050054890a40f9290108abe20500548a0240f9480108cb692200a9815640a9600640f9e20315aa21170194750a00f9f44f43a9BBL4;FFff4301d1fd7b04a9fd0301915f2c00f1", - "820000542800028b08f1df38680ef83728008039e800f8b72a00805208a800a91f0000f9fd7b44a9ff430191c0035fd6L4;ZBL8;FFa32300d102018052e40314aab3831ff875970094686200918101009021d81a91a32300d1e2008052e40314aaa8831ff86d9700946d970094f44f43a9fd7b42a9BBBL4;", - "FF880a40f9775a00a968a608a968320591776e01a97a6e02a9610206a9613a00f96082873c697e00f9699600f9784a01b91f0100f97f5601b9f44f45a9f65744a9L4;FB65676f74696174696f6e646972656374696f6e6d696e5f76657273696f6e636861696e5f706172616d7345706f636845706f63684", - "46972656374696f6e637472L8;FFe70301aa08008092e2ef00f9e2031baae87700f9fba34ca9f65340f9f4371ea9eb031eaae1d348a9fe0310aaf00303aaf88f41a9e9df00f9ef3b40f9ed0317aaBL8;FF2c570194e80740910881099100210491d70a0094e5fcff17e1d342f9e8cb42f91f0101eb008e00", - "54e8cf42f949058052f4074091948209910969213828040091L8;FF2120379102028052230100b063c4039174000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f9404cff97e80300aae08332912101009021083b91BBBBL4;FF28008052e217c03d800600ad820a803d68920039f44f49a9", - "f65748a9f85f47a9fd7b46a9ff830291c0035fd6000180520103805237f70194000400b000201b91L4;FB70726576696f757344657669636549647265717569726564f0a54800000000000000000000000000000000000000000000000000000000000992480000000000L8;FFe10700f90800f0f2080900", - "d107000014e80b41b2e00700f904000014c80080d20800f0f2080500d1e80300f9e00300913fecff97e10300aae10300f941020090BL8;FFc0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa0103009021d82391e8030091e00309aaa20180526c77019401030090210c2491040300f0", - "L8;FF5c92ff97e83349f94083c03ce93f49f91f0500b1e067813de9d302f960200054e0abc43de1a7c43deac33391e2a3c43de95b49f94081833ce067c13d4181823cBBBL4;FFe0a30091e10314aa22008052230080522400805296a9ff97f41f40f94effff17e0a30091e10314aae20313aa23008052240", - "080528ea9ff97f41f40f9f51740f9L4;ZDL8;FF39b70094ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091040180520502805229f87fd33f1100f13481889ae30314aa0c000094BL8;FFb41700b4f3a340f926370194e00314aa2100805224370194e01e01b4e10313aae20", - "314aaf50300aa2a370194f6b340f9961600b4f3af40f91a370194e00316aaL8;FF6083cc3c6183c73ce82700f9c20202ad6083c83cc10200ad02000014e82700f9fc4f40f9f73b00f977aa40f9f96306a9d70400b4080d805278a640f9f57e089bBBBBBL4;FFe91700f9a9035eb8148116b801c1983c00c1", - "993ca1837cad09c11fb801c19a3c00c19b3ca1837aad01c1963c00c1973c5a0700915f0f00f1a1f2ff5412000014L4;FFfd7bbea9f30b00f9fd030091f30300aa24070094000280520101805222070094000100b4810000f021000091130000f91f200039f30b40f9fd7bc2a8c0035fd6L8;FFc80100b508", - "0840921f1900f102020054017c0353210200341f1100f160020054e003082ae20313aae303142ab5ffff97c0fdffb4d2ffff17280180d2e00700f9BL8;FF6d4e40b96e1640f90b180036e00740ad2b00805221008052a0073fadbd000014208701946003805221008052750380521d870194401a00b42803", - "00b008210891L8;FFe91b40f9bf0209eb130540f9e0feff540810158bb50600917f4300f1137100a9f52300f941fbff543a020036eaa342a909008092490100f9a80000b4e01f40f9BBBL4;FFe10318aa220080522ac70194e12340f9a1e6ffb4e03340f96cffff1728008052e80f00f92804009008b140f", - "91f0900f149040054a86301d1690000b029312291L4;FB6f723a20c000234275696c64696e67205072654b6579576869737065724d65737361676520666f723a20c0102077697468207072654b657949643a20c0152028L8;FFe08b42f9e10318aa2200805229c70094e19342f9810000b4e09742f922008", - "05224c70094e19f42f9810000b4e0a342f9220080521fc70094e1ab42f9810000b4BL8;FF3f0108eb6b611932000100544b692838080500911f0048f1280800f96202005400fc4ed3af000014e00700f9e00301aaf30301aae10309aa22008052f4030b2aL8;FFe00313aa080c45f81f0500b1c1fdff54f4", - "0314abe2020054688e48f81f0500b140020054e00313aa84ffff97080040b20811c0da081540d2080d088b08250191BBBBL4;FFc9b203f8ca0e0139d2b204f8d84e0139c85600b9f44f5da9f6575ca9f85f5ba9fa675aa9fc6f59a9fd7b58a9ff830791c0035fd63f8300f141090054e13740f9L4;FB7300", - "1b737071722076312e73656e645f63742e73656e642065706f636820c01e3a204865616465725265636569766564202d3e2043743153616d706c6564002fL8;FF220080522be70094e10314aae88b41f9c80000b4e08f41f9e10308aa2200805224e70094e10314aae16301f92102009021ac1b912302009", - "063f41b91e0030b91BL8;FFf31300f9fd430091e90301aaf30300aae102009021182e91e8030091e00309aa620280526f67019468820191e102009021802e91e40200f084a02e91e0030091L8;FF602a40f901f57ed34200805229670094683240f9a80000b4603640f901f57ed34200805223670094683e", - "40f9a80000b4604240f901f57ed3420080521d670094BBBL4;FFe80300aae00301aaa8fb0736180000148082c23ce8031faae9031faaea031faa200080522b008052e007803de007c03d680200a96a2601a9e003803d6b1200f9L4;FFa9feff5402e90091c6040011c07c7d93827862f800c0268b5f0000e", - "bc028537aadfdff548318003502290091807862f81f0013eb41f7ff54bf00001400290091L8;FFe10316aa38a70094283c0012493c4092288108aa093c40922101679e0001679e20e0e00e013c184e0000669ec0035fd6283c00130a3c00122b0401132c080213BL8;FFf40300aae92b01a9490080528a02", - "00b04a4d3c91a07f0091e1830091e92b05a9890200b029a13891e92f07a9eb048052a9028052ff2b02a98a0200b04a013891L8;FFa9435fb8156502a9175103a9176104a9166105a9096100b9fb0800b4a8035ef81f011ceb80080054560b40f9586340b9360500b4540740f91a270094e00316aaBBBBBBB", - "L4;FF4a0400b44901c0da2911c0da080d498b0801148a296be838a904f836e90333aa0a2100d1eb0328aa29551b9b0cfc79d34a01148a2c6b283828030a8b9c0700d1L4;FF8282823c8182833c8082843c68320039f44f57a9f65756a9f85f55a9fa6754a9fc6f53a9fd7b52a9ff030691c0035fd6e01fc0", - "3de08301ad170100b4e00318aaL8;FFf8031faae00318aae10313aa361b0194fd7bbca9f70b00f9f65702a9f44f03a9fd03009109800091f40302aaf60301aa29fddfc8f30300aaf50308aa3f0500f1BBL4;FF10e15f38ca010a4a2ea15f3824d15f3825e15f380cb15f3811f15f38cb010b4a8e000f4a21", - "b15f380a911f38af00104a2af15f38120140392c000c4a30014039L4;ZFL8;FF7a9b0094fd7b41a9f31340f9ffc30091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aa810100b021a81991e8230091e00309aaa2008052BBBL4;FFe8af40f9097d8052eb6341b90a7dc99b087d099b", - "69d09b526963a872697da99b17c949ab48358a9a480a00b5e8074091e0c30491f6c3049108410f91675f0094L4;FB08000000000000002458440000000000556e6578706563746564576972655479706561637475616c427566666572556e646572666c6f7744656c696d69746564L8;FFe9df03f9e8e703", - "f9e8af40f9e72304f9e8ef03f9e8c740f9ea2b04f9e8f303f9e8b740f9fb2f04f9e8fb03f9e8cb40f9f03304f9e8ff03f9e89f40f9e53704f9BL8;FF4181823c4281813cead342f9e99f06f9e24bc33de347c33de14fc33dea8306f9e03f833de18b833de143c33da7ffff17e8f342f9e06fc13de0074091", - "e173c13dL8;FFe00313aa01018052275b0094001801b4080d8052fc0300aaf3031faa547f089bf5031aaae10316aa9f0213eba0020054e0c31791b50600d136a001919703138bBBBBL4;FF3f0314ebe833949a280308cb990208cb0a01188b090319ebf733899a3f0318eb89328a9a3a0108eb0001005409", - "0e80521655099be00316aa13e4ff975a0700f1L4;FB73742f70726f746f636f6c2f7372632f66696e6765727072696e742e72730038706f73742d7175616e74756d20726174636865743a206572726f722063726561L8;FFf50300aaf4cb00f9e0870aade28344ade2830bade18341ade18308ade28342ad", - "e28309ade18340ade18307ad800d00b5e08743ade00314aaa0873bade08b44adBL8;FF6a010aaa2b097dd35f0008eb4a21cb9a0b1c40f96a010aaa0a1c00f9820000542901028b092000f9c0035fd60b2441a90c3440a929010aca6c010c8bad01098bL8;FFe20315aa23008052240080520891ff97f7174", - "0f9e80f40f9080117cbbf0208eb09c6ff54e0630091e10317aae20315aa2300805224008052fd90ff97f71740f9BBBL4;FFa8835ab81f050031c1450054e81f40f9f50240390001c03dbf0600716003803d08450054480080d26003c03da06301d10800f0f2994600d1a8831af8e8460091L4;ZBL8;FF023", - "28052f50303aa32bb0094e0230191e10315aae6350094e8630791e0230191bb330094fbef40f97f0700b120010054faf740f9570302f1c3360054e5020054BL8;FFfd030091084c80b9f30300aac80a0034080140b20811c0da081540d2080d088b0825019108fd46d315050091681a40f9080a00b408014", - "0b20811c0da081540d2L8;FFe1031baa20013fd6fcf341f99f0b00b1a11200548800805268010014607e42f9618242f9290c40f9e8432a91e1031baa20013fd6f64b45f9df0a00b181210054BBBBBL4;FF240080529afdff97770a40f9f7feff17e00313aa22008052230080522400805293fdff97610a40", - "f9fefeff17e00313aa2200805223008052240080528cfdff97L4;FFf44f05a9fdc30091f40301aaf50300aae0030091e103022af30303aaf4020094e0630091e10313aaf0040094e1030091e2630091e00314aa54e6ff9728008092L8;FF081540d2080d088b0825019100fd46d3c0035fd6ff4302d1fd7b", - "04a9fa6705a9f85f06a9f65707a9f44f08a9fd030191f30301aaf40300aa6102009021600a91BL8;FF220080522b8b0194b50000b4e00316aae10315aa22008052268b0194e00314aa2b73ff97081f00d129008052680600f969020039200000143f090071a1010054L8;FFa05000b4f30300aaf4031faa4", - "8048052750100d0b5d2209136008052e84b01f9e04f01f9ff5301f90b0000146802148b4904805294620091090100a9b5120191BBBL4;FFe80740f9eb2745a940818a3c000940ad41818b3c683940f954650f29f40340f940818c3c600542ad42818d3c6219c03d483900f9280940f9400502ad600540adL", - "4;FB080000000000000004f7450000000000000000000000000008000000000000000800000000000000fce745000000000000000000000000000800000000000000L8;FFf4230e39a092833ce8cf01f9f7d301f9a61f0094e7b343f9ff0400b100ad00540093c03ce8bf43f9e30319aae113c23de217c23", - "d3bff48d3e0d7803de93344f9BL8;FF2c4b0194684a40f9a80000b4604e40f901f57ed342008052264b0194685640f9a80000b4605a40f901f57ed342008052204b0194686240f9a80000b4606640f9L8;FF0831899a090100b0295501918a0000102b6968384a090b8b40011fd6088c40f81f0900b1411d", - "0054e8031faa73010014e80300aa098d40f83f0500b140250054BBBBL4;FF1a0dc0daed6f41f9ee7341f9e8c30891e0030badef7741f93c0dc0dae0030cad5b0dc0da740dc0dae0030dad980dc0dab90dc0dae0030eadd50dc0daf70dc0daL4;FB0800000000000000304b42000000000053747265616d43", - "69706865724572726f7200000000000000000000000000000008000000000000000800000000000000L8;FF0b010094610a40f9b6ffff17e00313aae10317aae20315aa230080522400805203010094770a40f9680240f9080117cbbf0208eb09f7ff54e00313aae10317aaBL8;FF696b0194fd7b42a9ffc", - "30091c0035fd6fd7bbfa9fd030091086040b9a8060034080140b20811c0da081540d2080d088b0825019108fd46d308050091090840f9L8;FF386b0094e80342f9e92350391f0100f1e8179f1a0101090a24000014e1031f2a22000014882245b8e92f4379eb4746398c9246f8edc74639eaa34639e8d303", - "b9BBBL4;FFe0179f1a45ab0194081f4039ea0b40f9e902000a7302090a1f010a6be0179f1a3eab01946802000a000100123bab01941f1c007220050054972e40f9f30f40f9L4;FFf5ffff17a0a300d1e10316aa79010094b45b7ea9b7835df8e20216cbf2ffff17e88300910900009029212191a8a73da9e", - "8030091210000b021ec009100210091L8;FF29219f5a291d007200feff543f05007141020054a9035ef85f0309eb000700545a0700b11b01007914050079ba031ff803fdff54dc000014a8035ef8a80500b4BL8;FFc20a40f9e00318aa2a2b01947f0b00b1c1020054f6e3229155050036e0234ea9e16340", - "f9e22340f9081540f900013fd6e03b02f9e8031691e13f02f9290c40f9L8;FF602a0094e80356b9e00740918100805200001891ff0316b9e84b00b9592a0094e80356b9e00740918100805200001891ff0316b9e84700b9522a0094e80356b9BBBBBBL4;FF4c19001221e00caa8af5ff361f2500f100f6ff", - "542a25803929290091082900d1092000a96af5ffb75f05007128f5ff5421fc0aaae0031faafd7b43a9ff030191L4;FF78ff78d357fd60d3eb7b42f9ed7f42f94f7c0853dc7d1853f003182ad3050014f8db40f93f09007141380054e87342f90a0180d20a00f0f209dd78924a0140b2L8;FF6b011c320b19", - "00390c1d0039012500390aa100b8091d0079c0035fd609fc68d30afc60d30bfc58d30cfc48d3001500390901003909fc50d30a0500392a004039BBL4;FF0000803da8833aa9a8831bf8090000143b00805237008052baef3aa9fb0314aaf4031caafc0340f9ba831bf8bac301d12803168ba0a300d1e1630", - "191f9a305a9L4;ZDL8;FF600100f0000014912d930094fd7bbca9f70b00f9f65702a9f44f03a9fd030091080040f9f30300aa1f0500b160000054e00313aa7a90ff97e00313aa14008092BBBL4;FF8dc70094e01340f926ffff17e01300f9a10300f021982a91a30300f063882b91e0830091e2028052e40", - "1805225ffff17e01300f9a10300f021982a91a30300f0L4;FB459d2cd9fc3e5c2981098a58ef03a9fc786c06070000150efe549c2ac0c444ad2180d087cc97cc842e81dd8cbdef99c96998eaccb19f4b9fac970b00bfd78bf5L8;FFe9b300f909f540f9e9c300f909f940f9e9ab00f909fd40f9ea2712a90", - "90141f9e9af1aa9090541f9e94f00f987ccff975700805220020014e8f741f9eafb41f9BL8;FFe40200908460039142c035918107805248432c3937530194e0074091e10318aae20319aa00002f912a120094f8eb4df934f5ff1748236639e2074091c00200f0L8;FFe167c13d9f0f00b1e8a345b9e00718", - "ade82303b9810d005448008092680300f971000014f46f41f9e8c31791e91f46b900c1c03c01c1c13cf5fb45b9880240f9BBBBL4;FFcdfeff17e00b40f9f71740f91f09007121010054ea3340f9891f009148dd789207000014ea674139e8031faa891b009103000014e8031faa892300914a1d4092L4;FB", - "3300000000000000ca010000050000009a964800000000003300000000000000ce010000050000009a964800000000003300000000000000d201000005000000L8;FF08fc60d3080d00b5080840921f1900f1420d0054017c0353610d00343f040071000200543f08007181030054890245f83f0500b1810", - "000549f6605a99f7e06a9BL8;FFaa9356382901084aab731638aba35638a9831638a9b356384a01084a6b01084aaa931638aac356382901084aaba31638abd35638a9b31638a9e356384a01084aL8;FF2c730094b30000b4e07b49f9e10313aa2200805227730094e18349f9810000b4e08749f922008052", - "22730094e18f49f9810000b4e09349f9220080521d730094BBBL4;FFa8035ab8e8f9073728008052a8031af8ccffff17281800511f090071030600543f140071600000543f200071410b00543f140071a1c31eb8a00d00543f200071L4;ZBL8;FF011000913f0002eb280300540a01008be90b40b94b0140", - "b92909c05a6b09c05a3f010b6b89feff54099000913f0102ebe90300aae2000054499000d10b01098bBL8;FF02028052a302009063dc1791c4028052b8000014e05306f9e0833291a102009021c00a9102028052a302009063141991a4028052af000014c80080d2e0a33239L8;FF42028052e30000b063d", - "00691440180528927ff97e14b45f906000014e80f41b2e0432a91e84b05f94128ff97e10300aae14b05f9e0432a91e10000b021e00291BBBBBL4;FFf30b40f9fd7bc2a8c0035fd6200080520103805234030294ff8302d1e923036dfd7b04a9fc6f05a9fa6706a9f85f07a9f65708a9f44f09a9fd0301910", - "9404039L4;FF4a018052eaaf01f9ea028052e0e30691f9a307a9e92344a9ead701f92a028052e1e30191e2430c91e4031baafa5700f9f6a708a929008052f6e30191e99701f9L8;FF9f0600b1e002005473d645a9950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f", - "9220080521f030194f8ffff17340100b4BL8;FF82008052e80700f96c830194fd7b41a9ff830091c0035fd6080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091010300f021802991L8;FFf85f01a9f65702a9f44f03a9fd030091140040f9f30300aa9f0600b1e0020054611a", - "40f93f0400b140010054810000b4601e40f9220080521e830094612640f9BBBL4;FFc967c0f2a07f0091e1030091e87f01a9e82704a933c3019428008092680200f9fd7b46a9f33b40f9ff030291c0035fd6090c40f93f0500b1e0040054095440f9L4;FB506f6c796e6f6d69616c4572726f724368756e6", - "b496e6465784465636f64696e674572726f724368756e6b446174614465636f64696e674572726f7200000000L8;FF61f9ffb4e00309aa2200805229c30094f4031faa2bf9ff17e0c3159150beff97e0c3139163bfff97f7031f2a04feff17eb831d91e133c23de237c23d6091c83cBL8;FF680240f91f01", - "01eb40040054680640f92a040091e00314aa490280526a0a00f909692138af050094e10313aad4fbff97803240b980010034610a40f9680240f9L8;FFe9df40f9e8a30539e012803d2093c03ce9f204f8e112c03d8092823c8192833ce9c700f9e10740f9010600b599feff17e8b740b92043c23cc0e2009", - "12183c33cBBBBL4;FFe00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eba3db00541803008bf9feffb50f0000141f0400b101db005442e301941f10003181da0054L4;FB655f6b65796c6f63616c5f6964656e746974795f7075626c6963000000000000a5ec480000000000550000000", - "0000000ce000000010000006d6573736167655fL8;FFe0ebc03d41f1ce3ce8cf01f9e8432d91e9bb01f940918b3c41818c3c05150094e8432d91f7ab45f90081c03ce8b745f9ff0600b1a0039d3ca8031ef8e00e0054BL8;FF610e40f9140080927f3200b9740200f93f0400f17f3a00b98b000054601240", - "f92200805223630194740e00f9f44f41a9fd7bc2a8c0035fd6ff0301d1fd7b02a9L8;FFc7000014e10300a9e00301aae10308aa220080523e060094e10340a92aa040a9290040f91f1040f15369283808050091280800f943feff540b7c07533f0108ebBBBL4;FF690300b029811491880c8052200541ad0", - "84001392211c03d280a8052680201a9000401ad210140ad0900f0d2681200f9280080520210803d010000ad682600a9L4;FFc10a40f97f1200f9610000b4610600f9a9000014734e00a9d30a00f9f35341a9fb7345a9f8feff171f4002f10130009119fc44d3a90300542007009125c59c52L8;FFfd7b41a", - "9ff830091c0035fd6080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091810100f0210c1691a40100d084802291e3230091BL8;FF000440ad8b0200b06b210e910a0440f9000500ad4801018b0b2000a93f7d00a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6e10200b43", - "f0002ebe8030054BL4;FFd6c2009180010054c1025ef8810000b4c0825ef82200805226230094c1825ff8e1feffb4c00240f92200805221230094f3ffff17880240f9280100b40805088bL3;ZBBBBBBBBBL4;FFe00314aaf44f4aa9f65749a9f85f48a9fa6747a9fc6f46a9fd7b45a9ffc30291c0035fd6e", - "92341a9ea0740f9480108cb395100a9280900f936feffb4080c8052L4;FF28008052955a01a9892e00b968620039f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd6c000009000802991351d0094ff0303d1L8;FF8402009084202491a20700d161058052381d0194ffc300d", - "1fd7b01a9f44f02a9fd430091a002003713400091f40300aa0140009100008092891d01941f0400f1BBL4;FFf85f03a9f65704a9f44f05a9fd030091ffc324d19f8000f1f40300aaff0300f9c1040054600440ade8e31291a08301d1f30302aaf60301aaf5e31291a0073dadL4;FFe07a80b9e10313aae20", - "318aa480880d2010000d462f5ff97e10300aadf0200ebc0fbff54d60200cbe0fcffb7630640f91f0003ebe9fdff5494060051010003cbL8;FF29cd049121118a9a689d0014ffc300d1fd7b02a9fd830091091c0072e0330039200100543f050071a10100540a008092090900b90a0100f9fd7b42a9ffc300", - "91BBBL4;FF50dd0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300ebe31a00541803008b06000014L4;FB53524643343132324d6963726f736f667446757475726500ec28440000000000180000000000000008000000000000002", - "04b440000000000044a440000000000L8;FFe88344f9e8f700f9e88b44f9e87f00f908008092e87700f9e8030eaaee0311aaf10312aa12018052f27300f97a0e001408008092f5f316a9f57b40f9e87700f9BL8;FFe20314aa000400ade00200f00060019108c1359103048052e4031caa25058052060480", - "524cb30094e2bf4ef9e3c34ef9e007409100800191e10316aa839e0094L8;FFf50300aae00313aa2200805240000094610a40f9e00315aa92ffff17e00313aa220080523a000094610a40f9a1ffff17e00313aae10317aae20315aa34000094BBBBL4;FFc1220091022a805232fd01940200001415008092", - "88a305d1898305d1e0e30591010140f9220140f9f6e30591218e0094c0820091e1a30b91022a8052f5cb00f9L4;ZFL8;FF21381d91430200d063841a91e0830091220280526400805287f1ff97e11340f93dffff17ff8302d1fd7b05a9f93300f9f85f07a9f65708a9f44f09a9fd430191BL8;FFfd7b42a9", - "ffc30091c0035fd6ce550014fd7bbea9f30b00f9fd030091010040f9f30300aa3f0400f18b000054600640f9220080521f7d019408008092680200f9L8;FFe1630091a67cff97bf0600b1400e0054e11740f9e80f40f91f0101eb20280054e81340f92a0400918022029149018052ea1700f90969213834d", - "7ff97e1630091BBBL4;FF80f5ffb490000014a02301d1aebd0094f90301aa60f8073620000014490080d2684200390900f0f22869009129008092692200a936000014f9031faa17000014L4;FB72652d6b65796b796265722d7072652d6b65796f6e652d74696d652d7072652d6b657962756e646c656669", - "6c6520636f756c64206e6f7420626520726561646dL8;FF050000140c02003529010ecb08010e8b090700b43f0900f12e318a9a3f0500f1a01c00540c0140799ffd0771cdfeff549f010b6b8d0100549f010d6b60feff54BL8;FF2f3d0194a00200f0002026912c3d0194ff8300d1fd7b01a9fd430091e80", - "301aae00700f9a10200f021002791a40200f084802691e3230091e00308aa62028052L8;FF480300f9c80080521d0d0014606641f9616a41f99100001468424e3975420e911f090071ad1b00541f110071e11b005468ca5339fa6700f977ca13917a620e91BBBBBL4;FFbf0208eb48330054680640f9e103", - "16aae20315aa0001178b2e0d0294e802158b680a00f9952240f9550300b4610a40f9680240f9961e40f91f0101ebe0330054L4;FFee0317aaf5df5aa9ef031caafc031aaaed0318aaec0319aaeb0316aae9bf40f9f6c740f903000014e9030a2af603022ac85d0012ea5d1853e903092a087d60d3L8;FFff", - "830191c0035fd6080440f9200440a9a92300d12a0200904ac10d91a8831ff86202009042682c91e9ab01a9e36300913d0d0194fd7b45a9ff830191c0035fd6BL8;FF348d0194e10318aae90314aae80740f93501158bf50f00f9090115cb285041a99f0209eb48060054d40000b46002158be10308aae203", - "14aa268d0194e10318aaL8;FFf32f00f9e81b00f90a000014e87b40f9e93740f9940a00912905009113693638f32f40f93f4100f1f47f00f940830054e93700f915030036284d1c9be2031b2aBBBL4;FFe00705ade30b04ad6042803c6142813c6342823c6242833cb40000b4e00315aae10314aa2200805", - "222cd0194ff030891f44f43a9f65742a9fc5f41a9fd7bc4a8L4;FB5f00000005000000361a49000000000054000000000000006500000005000000361a49000000000054000000000000007300000005000000361a490000000000L8;FFe8e30339684740f9e0a70ba9e0831d91e9e343f9e0938f3ce9230", - "0f9e88700f93d1f0094efb343f9ff0900f1e17b0054e16740f9810000b4e00316aa22008052BL8;FFe90310916a0100f04ae13691c00200d0003c2c9108210091e1c30e91e9db01f9eadf01f9524d0194c80200f008b90f91e9008052e8271ba9fa0741b2e8df40f9L8;FF4a11c0da4a1540d24a0d0a8b4a", - "2501914afd46d329010a8b290500913f010aebe9050054280108ab8300005426000014e80308ab82040054090840f9090100b4BBBBL4;FF2ced0194b50000b4e00316aae10315aa2200805227ed0194e00317aae10319aaf44f46a9f91b40f9f65745a9f85f44a9fd7b42a9ffc30191c0035fd6e0230091L", - "4;FB646973747269627574696f6e5f6964496e76616c696450726f746f636f6c41646472657373000000000000000000000008000000000000000800000000000000L8;FFe00313aa22008052230080522400805207030094610a40f9b9ffff17e00313aae10318aae20316aa2300805224008052ff02009", - "4780a40f9680240f9080118cbBL8;FF5b0080d2f50300aa1b00f0f21fc1007182000054087d0453690b0091050000141ffd0071c9010054087d0453690f00916842003908008092682600a9f44f56a9L8;FFe82703a9f62351a9e95750a9a0839d3ca8031df8e8a30391e92700f91196fe97e8630191e0a3", - "0391a1c300d1f4630191d8c7fe97e8c30291e263019184020191BBBL4;FFfc571ba9f44f1ca9fd83069100e4006fe40301aae30300aaa0c302d1e1031faaf30308aae00300ade00301ade00302adb2f7ff97a0877ead88030090089d0991L4;FFf65706a9f44f07a9fd830091f40302aaf30300aa540d003", - "728004039e80e003419048052f8031faa3a0000d05a0300911900ac720c0000148812188be1230091L8;FFa01d00b427ad0094400080524100805225ad0094001d00b4f30300aa21ad009440008052410080521fad0094401c00b4f50300aa1bad00944000805241008052BL8;FFf7cf42f91f0500b1404f", - "803da90319f860420054e96301912083c33c2183c43c29610d912283c53cea670a91200500ad2083c63c414fc03de8bf01f90800f0d2L8;FF20013fd696825839df0a007121050054a8008052f5e742f9f4e342f9e8e3163949008092a80240f9690200f9680000b4e00314aa00013fd6a10640f9810000b", - "4BBBBBBL4;FF48020054680640f9e20315aa0001168b30150294e90640f9d602158b760a00f9280115eb63020054e90240f9940215cb9f0208eb2101158b9532889ae12200a9L4;FFe8008052f6b74bf9f7bb4bf9e9830a91e8830a3928008052e0230891e143139142008052e96b02f9e86f02f9f67302f", - "9f77702f91e0d0094e1b34bf9810000b4L8;FF29150012430b00540a0840391fc103714a1500124a19092a0911001262f9ff544831092a54000014e9031faaea031faa0b00038b0f00028b4c008052ed030091BBL4;FFf85f1ba9f6571ca9f44f1da9fd030691f70300aaf30308aae803039100800091f50", - "304aafa0303aaf803022af60301aa8d6d0094e8534ca9f96b40f91f0500f1L4;ZBL8;FF188fff9728008092680200f9f30b40f9fd7bc2a8c0035fd6fd7bbca9f85f01a9f65702a9f44f03a9fd030091140040f9f30300aa9f0600b140020054610e40f9BBBL4;FF88fc0736010100145f2800f1880000542", - "800028b08f1df38480ff837e0830091f83d0094e82340b9e8360037e81b40f9aa0640f9490108eb23460054aa0240f9L4;FBfb00000014000000e82049000000000049000000000000000a01000011000000e82049000000000049000000000000000f01000014000000e820490000000000L8;FFe8a701a", - "939a450a92aa051a9eaa704a9e80b00f929a052a9e84300f92aa053a9e8a706a929a054a9e9ab03a929a855a9e81b00f9e97b00f929a056a9e9d300f9BL8;FFdf0600b18022005480620391f81b0094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb282100541", - "3000014f9031faaL8;FFe9c316910a0000f04ac10191e9a305f9e9c32791e8fb04f9a80000d008c10d91e9ab05f92901009029413191e8af05f928008052a04700d1e96f06f9e1833291BBBBL4;FFf44f46a9f65745a9f85f44a9fd7b43a9ffc30191c0035fd6ff8301d1fd7b04a9f32b00f9fd030191f30", - "308aae8230091c5ce0094e82340391f050071e1000054L4;FB2070726576696f75732073657373696f6e2070726f746f62756676616c696400859248000000000033000000000000007d010000440000008592480000000000L8;FFe02300390900f0f2e8270039e90300f9e003009146eaff97f44f47a9f", - "65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6370080521800809219018052BL8;FF600240f9220080522a750194f8ffff17f44f41a9fd7bc2a8c0035fd6ff4305d1fd7b0fa9fc6f10a9fa6711a9f85f12a9f65713a9f44f14a9fdc30391f40301aaL8;FF09692138ead302f98c2b0094e14316", - "91ea110094e0df92b980010034e1d342f9e8cb42f91f0101eba0c60054e8cf42f9090180522a04009109692138e1431691BBBL4;FFf4031aaaa2fe46d3b8e27a92b5164092e20000b4e83340f9e0020191e10314aa0801028be83300f955b50194e00300918102188be20315aaf5ff003925b50194L4;ZDL", - "8;FFfa6748a9fc6f47a9fd7b46a9ff03039128b50014b9035ff8090080921f230039090300f9880219ebe833889a3f0314eb2a33949ab4835ff8ff0214ebe00314aaBL8;FFe237c13de3032d91e4833291a10200b02160089102018052e02b833de12f833de233833db7f4ff97f3f742f9e8ef42f97f0208", - "eb61000054e0631791726bff97L8;FFc17e035361230034280400511f39007128080054eb0000b06bb12291890000106a69683829090a8b20011fd6e03400b5a02302d1fcf4ff97a0150036a1fcffb4BBBBBL4;FFd289009468624039e0230091a173009122008052a8730039cc890094e8a743a9eaaf41a", - "928e108aae9b340a90b010bca4901098b6c010c8b2acdcaca8bc1cbcaL4;FF88ffff17e02300912200805223008052240080520ce6ff97e10f40f98effff17e0230091e10316aae20314aa230080522400805204e6ff97f60f40f9e80740f9L8;FFf30300aa3f0400f18b000054600640f92200805227050", - "194751a40f9bf0600b1e0010054748643a9e00314aac2020094d50000b4a8e279d3e00314aa02018052BL8;FF29c119912000001408200091200440a9e92300910a0000d04ac11991e8a700a9020300f042a43d91ea0f00f9e34300913d850194fd7b43a9ff030191c0035fd6L8;FF2afd44d3290d4092ff", - "0209eb49258a9a1c0940f93f0118eb809349fa82feff54f552199b687a77781b05c05a9c0200b4a80640f909091c8b2ac15f781f030a6bBBBL4;FF240080529ab7ff97a1035ff86bffff17a08300d1e10316aae20313aa230080522400805292b7ff97b6035ff8a8035ef8080116cb7f0208eba9edff54a0", - "8300d1L4;FB65796d6573736167655f6b657973000097654900000000004e000000000000006402000013000000696e6465786b657950656e64696e675072654b6579707265L8;FF2cc50094e05f40f9e17740f9610000b42200805227c50094ba0000b4e05b40f9e1031aaa2200805222c50094f7031f2a", - "df0600b1416aff54f57740f957df78b3BL8;FFe80700f9e0230091493a0094e10300aae10700f9c10200b021c00b91c30200b063840c91e0230091a200805224018052a7000014c80080d20800f0f2080500d1L8;FFe9cf40f9e8631139a8f31938e8430691ea2b02f9e97200f8ebf200f8ea7201f8296bf", - "e97e84346391f05007161050054e8a759a9e80302f9e8031091e90702f9BBBBL4;FFff0740d1ff0300f9ffc321d1ff0300f97a0400905aa3059157ffdfc8f60301aaf403002af50308aa170300b453008052ff0600b13300a07240030054f8430591L4;FB72696e672e72730067e54800000000004700000", - "000000000240100001500000067e548000000000047000000000000002b0100003b000000617373657274696fL8;FFffc30791c0035fd6fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9fd030091ff830bd1f30308aae8030691f6030691fefbff97f4c340f9e827029100f1cf3cBL8;FFeb5b0079e90f", - "00f9e80700f9ea83003924650194e00314aa2100805222650194c00500b4e10315aae20314aaf60300aa28650194e82b41a9e9834039792200b9L8;FF2c650094c10e40f9a1fdffb4c01240f92200805227650094e9ffff17681a40f9280100b4090d8052e00314aa017d099b02018052f44f42a9f65741a", - "9fd7bc3a8BBBL4;FF08f53a91a203df3ca303dc3cf943019149028052e0430191e08705ada0077cade237803da203d73ca1c302d1e2030091030a8052e32b803de00703ada1037dadL4;FF02008092011440f902cc01f9810600b597021091560080d2050080d2040080124304805202008052e11a40f900", - "0080d2d622c19a017f169b0b0600941f0400b1L8;FFb3831ff878a5009468620091a101009021341691a32300d142008052e40314aaa8831ff870a5009468c20091a1010090213c1691a32300d162008052e40314aaBL8;FF1f01096be0179f1a442501948876403969764039aa02000ad6020a0a1f01096", - "be0179f1a3d250194887a4039697a4039f503002a1f01096be0179f1a37250194L8;FF2800805200030291e1430a9122008052ffaf01f9e08716ada00a41adb5020191e8ab01f9e08b17ad2c250094880201d1ff3f0c3902fd47d319dd799214194092BBBBBBBL4;FF88f70737d7ffff17e92b00a9e00300", - "9180f50094010040f93f0400b1a0000054810000b4000440f92200805221190214c0035fd6fd7bbda9f65701a9f44f02a9L4;FFfd43029109604039e91f003717704229f30300aa1a0040f9a08300d1f40308aae103172af2100094b88f7ea9e0030191e1031aaae20318aaa10e0094f56f44a9L8;FFfd7b", - "01a9f65702a9f44f03a9fd43009115a040a9090115ebe3030054f30302aaf40300aa5f0009eb09010054e00314aaf50301aae10313aa220080522df7ff97BBL4;FFf85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6200080520104805232990194ff0307d1fd7b19a9fc571aa9f44f1ba9fd430691f3030", - "8aae8e30091f5e30091L4;ZFL8;FF6a01084a2801084aaae31838e10300ada8f31838a0073ead59990094a9035538480d8052aa135538ab235538e00740ad2901084a4a01084ae0c30291a9031538BBBL4;FFa8f31a38a8c301d109f306f809810091e8a703a9c80300b008211d91e82700f908008012ea0", - "300f90b7307f80af307f8e85300b941d2ff97e81340f91f0500b1L4;FB41636b6e6f776c6564676564001b737071722076312e73656e645f63742e726563762065706f636820c0243a2043743153616d706c6564202d3e20456b526563L8;FF0001c03df7a349a9e9bf00f969008052ec030baae03740f9e", - "0f3803df90304aae97300f9ed030aaaeb031eaae3e700f9e30311aafe030caaf04300f9f0031baaBL8;FFe1431691ead302f9dd110094e06349f9800100b4e1d342f9e8cb42f91f0101ebe0c50054e8cf42f9090280522a04009109692138e1431691ead302f9d0110094L8;FF093100f969060091e02bc3", - "3d0001803de02fc33d0005803de033c33d0009803de9cf05f9a88357f8080540f9882600b4a02302d150f5ff97f50301aa804d0037BBBBL4;FFe8c20091e10315aa160800b9080000f928040090082134911f30003960a200a9090d40f9e823009120013fd6e80740f91f0900b100fdff5475da40a9e083c", - "03cL4;FB617267756d656e743a20c0001a696e76616c696420737461746520666f722063616c6c20746f20c00d20746f20737563636565643a20c0002c63697068657274L8;FF880080d20800f0f2a9035cf8081100918082883ca003db3c8182893c80828a3ca1837aad880200f989820bf88182843c808", - "2853ca1837bad8182863c8082873cBL8;FF63601e9118000014a0031cf8010300b021182e91030300b063302a91a00301d162028052240280522d000014a0031cf8010300b021182e91030300b063201891L8;FF28790094200580522100805226790094007901b4690100b029352d91280f8052200540ad", - "08800039c80ec0dafc0300aa01048052081002f8e8074091e20314aaBBBL4;FF28b90194c00480522100805226b90194801100b4880300f008010591490080d2000540ad08e141f80900f0f229650091000400ad08e001f8c804805269a200a9L4;ZBL8;FF6c0400f1a01200549f2900f14d018052eb031f", - "aae9031faaea031faa8c318d9a4d040091ae696a384a0500915f010cebcf194092ce1d0013ef21cb9ae90109aaBL8;FF0811c0da081540d2080d088b0825019108fd46d308050091091c40b909050034290140b22911c0da291540d2290d098b2925019129fd46d3290500910a0840f9L8;FF820f00ad622", - "ec13dc00604ad603ac13dc21e803d2281cc3cc02a803d000540adc0860fad2081cd3c2181ca3cc28219ad2281cb3cc11e813dc222813d9c43fe97BBBBBL4;FF890640f92a0108eb43230054890240f9e00316aae30317aa2801088be90b40f9882a00a928fd60d3681700b5280940921f1900f1421800542", - "17d0353c1180034L4;FF2100805228090094e00600b4880000f008fd3991b51200d1090140f9086140f8090000f9890000f0298d3991086000f8c8008052e92302a9c8018052e90741b2L8;FFf30300aa61020090219c1091e8030091e00309aa6201805272090194730240f961020090216011916402009", - "084e01091e003009163620091620180526a090194BL8;FFe03340f9e10319aa2200805229890194c80600d11f0d00b1a8edff54e02f40f9e10316aa220080522289019468ffff17e12b40f908008092686a00a9c1fdffb4L8;FFa002803db60a00f980110054f63340f973060091b5620091df0213eba1f8", - "ff54e00314aae10318aa4200805221890094f8eb44a9f40319aaf90316aad3fa7fd3BBBL4;FF800100b507000014340100b425c90194e00314aae10315aa23c90194a00000b528008052750600f904000014e00315aae8031faa600600f90a028052e90314aaL4;FB0800000000000000cc0546000000000", - "0000000000000000008000000000000000800000000000000440546000000000000000000000000000800000000000000L8;FFe02bc23de10fc23de9f200f8e9a35f3968114df8e00b18ade213c23df0435f39e9af00b9e00bc23de31fc23de18b14ade11bc23de203c23dea7202f8edbf43f9BL8;FFfd7b", - "c3a82b490114f44f42a9f65741a9fd7bc3a8c0035fd6210400b4fd7bbea9f44f01a9fd030091f30301aa14e0009104000014730600f194c20191c0020054L8;FFf85f42a9fd7bc5a8c0035fd6000100d000a002912a490094000100d000e0059127490094000100d00060179124490094fd7bbea9f44f01a", - "9fd030091080040f9BBBBL4;FF2100805228e90194200400b4e10313aae20314aaf70300aa2ee90194c10e40f93f0400f18b000054c01240f92200805220e90194a10240f9d4de01a9d41600f9L4;FB766572666c6f774e6f7441506f7765724f6654776f0000004f9d4800000000007500000000000000a", - "40000002a0000004b796265723130323400000000000000L8;FFe80313aa6a260094ff830f91f44f42a9fc5741a9fd7bc3a8c0035fd620008052e10314aa30e90094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9BL8;FF0103009021c02a91130000f91f200039f30b40f9fd7bc2a8c0035f", - "d600018052010280523b690194fd7bbea9f30b00f9fd030091f30300aa1a69019400028052L8;FF1a0380d20001c03d08f140f8e90280521a00f0f2e98316a90000803d08f000f8e9bf00f9e81f40b9e8030639e10740f961cdffb4e01740f91a000014e9031091BBBL4;FF08c30139b50000b4e00740f9e", - "10315aa2200805227a90194e02740f9f40f40f9930000b4e10313aa2200805221a90194e13340f93f0400b160010054e00314aaL4;FFffff04a927008052ff2f00f946008052e00305aae2e30091280980d2610080d2030080d2040180d2ffff03a9e75300b9e65b00b9010000d4210000b021800291L8;F", - "Fe50309ade01bc03de2130aade28f43ade413c03de347803de48706ade08b07ad42030054e90340f928fc83523f0108eba228005400e4006fe8430391e00301adBL8;FFe08756ade8830c91e2bfc03d14010291e1031f2ae0071eade08754ade2fb803df9f741f9faf341f9e0071cade08b55adf67f4e39e", - "00b1dade18352add51a40d2L8;FFe9070bf9e90f0bf9e8130bf949e3ff97e1e344f9810000b4e0e744f92200805224290094e81750a9e00314aae20743b9e10343b9e61341b9033940b9e8030291BBBBBBL4;FF820740f95f0017eba9060054810340f9200080398000f8b728040091490400d1110000145", - "f2800f1880000542800028b08f1df388804f837e0230091f1790094L4;FFfb030eaaf003182aef031a2afa0309aaf9c700f9ee03082ac1030014e96f42f9e87342f9e00316aa21c4805222008052e92319a91f110094e31359a9e0830c91L8;FFe81f80528002803d88420039f44f45a9fd7b44a9ff83019", - "1c0035fd6690240393fed0171c1000054699640393ff501716100005473060091a3ffff17130500a9BBL4;FF9b83ff97f45b41a933ffff17f40300aae0230091e10316aa0204805223008052240080529283ff97e00314aaf45b41a9f50740f961ffff172000805201188052L4;ZDL8;FFa94300d1eaffff", - "b04a313491a8031ff8620100f042e01091e92b01a9e343009141910094fd7b44a9ff430191c0035fd608200091200440a9a94300d1eaffffb0BBBL4;FFf44f5da9f6575ca9f85f5ba9fa675aa9fc6f59a9fd7b58a9ff830791c0035fd6e8af40b9e88b00b9950300b41dd10194e00315aa210080521bd101", - "94001a00b4L4;FBecaba79744f74abfa951a28cf47c80e10000c867bc1790884b4f7b29d8f0e734cf9f7b3e5c53e9a9361e489549405c3caaf9f387f215574ba686816f443e2914L8;FFe127833de9af13a90b2550a9ebab01a9e91700f90a2551a9e9ab04a90a2d52a9ea0b00f90a2553a9ea4300f9e923", - "00f90a2554a9eaaf06a9e91f00f90a2555a9BL8;FF84020191e0031aaae10319aa030480520502805288510194f95b40f93f0700b1a00c0054faa74ba90a630191061f57290083c13c0003433908e301910183c23cL8;FF89fdfff029e13591bb2336a9a84303d1a82737a928008052090100f029413191a", - "a8302d1a04700d1a8273ba9080100f0084d2091a82b3da90a078052c8048052BBBBL4;FFf60300aaf50301aaa82734a98812809a6912819aa82735a90810949a2910939ae0230091a10303d162008052a82736a9ca630094a80303d140830091e10319aaL4;FB6574206966206b7962657220707265206b6", - "5792069732070726573656e74000072984800000000003300000000000000210200000e0000007298480000000000L8;FF21f41a91230200f063101591e0030091020280524400805287e5ff97e00340f968ffff17c80080d20800f0f2080900915affff17c90080d2e823003948008052BL8;FFad1540d2", - "ad0d0d8bad250191adfd46d3ad0500914e815ff80e0100b4cf0140b2ef11c0daef1540d2ef0d0f8bef250191ce194f8bce050091cd010d8bae0140b2L8;FF080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb2816005426000014fa031faaf69f49f9f4074091948", - "20991df0600b1BBBL4;FF2cb10194e4ffff17a0877dada203dd3c680200f96282823c6082803c6182813cd90400b4e03740f9e10319aa22008052330080521fb10194f6031f2aa5ffff17L4;ZBL8;FFff230e39e80701f9ff0301f9b88319f8a1150054a90100f02941309128048052f50b00f9f50317aa0", - "a0fc0daa9a33ba9a86300d109018052fb5f44a9a8a73ca9BL8;FFea5706f98a0200f04acd2191e0df813dff5306f9e85b06f9ff5f06f9ea6306f9e87306f9e97706f92e310194e1bb43f9810000b4e0bf43f9220080521d310194L8;FFe0f741f9220080522a310094e8830f9100810091a2efff97c80080", - "d20800f0f21c450091ca000014fb6300f92dfbff17e84f45f9e95345f9e000009000303391BBBBBL4;FFed031faac92a40a9ec031faa000d010e0e000a8a22696efc438c202e6f00669eefc101f280010054f001c0da1012c0dad00d508b10020a8a301910cb11025cb8L4;FF01ed7cd32b0100945f0f00f", - "140070054f5524da9340200b4b982009104000014940600f139c300918001005421035ef8810000b420835ef8220080521d010094L8;FF42401291e1230091e8a701a937010194400200f0008018912c010194600200d00080109129010194600200d000e0109123010194400200f000603f9123010194BL", - "8;FFe2008052b30f00f97781019477810194fd7b41a9f31340f9ffc30091c0035fd6000040f9ea040014000040f998100014ffc300d1fd7b01a9f31300f9fd430091L8;FFea1700f909692138e1630091a480ff97b7010034e11740f9e80f40f91f0101ebe09a0054e81340f9090380522a040091e00317a", - "aea1700f909692138e1630091BBBL4;FF097840f93f0500b180070054098040f93f8100f181070054f30308aa087c40f9090940790a194039147140f8160140b915f140f8e9030079097141f8ea0b0039L4;FB737472792f696e6465782e6372617465732e696f2d31393439636638633662356235353766", - "2f62797465732d312e31322e312f7372632f62797465732e727300L8;FFf65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd68862069197e25fa9806ec03d0101c03d950641f988e240f989d640f99c0a41f96083813ce12b803dBL8;FF34000094770a40f9680240f9080117cbbf0208eba9f4ff5", - "4e00313aae10317aae20315aa2b000094770a40f99fffff17e00313aa2200805226000094610a40f9L8;FF2c41009474d643a9750300b496c2009104000014b50600f1d6a20191c0020054c1025df8810000b4c0825df82200805220410094c1825ef8810000b4c0025ff8BBBBL4;FF50e10194f70300aa1", - "f0400b141fdff54e0430591810080524be10194809b0035e85341b9e88700b957ffdfc8d70200b4ff0600b100030054f843059199008052L4;FB64207769746820c00f20747261696c696e6720627974657300c0013ac000012bc000c00010626164206b6579206c656e677468203cc0153e20666f72206b", - "6579L8;FFff071df82c0040f9e9008052f5433c91fc233391f80302aaf30300aa880900d19f0500f10881899a090200d029c120918a0000102b7968784a090b8b40011fd6BL8;FFc30200f063401991a92300d1e60200f0c68005912a018052e70200f0e72c0691e00308aa6201805204018052e9af00a9e", - "a0300f965610194fd7b42a9ffc30091L8;FF0f000014c80080d2a1831df80800f0f2080900d11a000014e80b41b2e00b00f907000014e80b41b2a0831df814000014c80080d20800f0f2080500d1e80700f9BBBL4;FFe10313aae2031caafb0300aa31a101942003c03d9f0700b1f43b00f9e083873c2003", - "0054e0c301916c89ff970803156bf51f00b942040054f30a40f9fc0700f9L4;FF9fbc007168030054030000f067c00291867c4093e4d86478217c041b5f00016b6bfcff548100010b5f00016b0afcff54011040f93fcc74f2c102005463c00291L8;FFf31340f9ffc30091c0035fd6080040f9a90100d029", - "c13e91e00301aa08014039227968f8a90100d029213f91287968f8e10308aa5da10014ffc300d1fd7b01a9BL8;FF480115eb690200f922f0ff54800200b0002016912d210194e00314aa5ffdff97895a40a9ca02178b280117eb6a0200f9e2eeff54cdffff17800200b000001591BL4;FF0001148b332100", - "94e90344a9080009eb230f0054ff0208eb68080054340117ab020f0054f42300f9090740f9280117eb03080054090340f9d60217cbdf0208ebL3;ZB" + "BBBBBBBBBL8;FB1c002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e2d6c696e75782d676e752f72656c656173652f6275696c642f737071722d383934L8;FF090e80520829099b018940a903c100918dfbff97a0077fadb4c35db8e00701adf8a400940004805221008052f1a40", + "094c00300b4e00741ade8031faa09048052BL8;FF60d240f922008052fb24019461da40f9810300b460de40f91800001461ce40f9810000b460d240f922008052f224019461da40f9810000b460de40f922008052L8;FF4521009440fdff9000c031915221009440fdffb000e006914f21009440fdffb000", + "4007914921009440fdffb0004001914921009440fdffb000a0019143210094BBL8;FFadb35fb86b2a0129765e0029ec0b00b9edb300b8ea4340f8600a00f9611a00b96ac201f8ea6340396d3202b8eb0b40f9797202f878f202f86afe00396b7203f8L8;FFa4008052e80700f909000014e00700f981fdff", + "b021003991a3fdfff063f42591e02300910201805264008052ba6aff97e10740f9b1ffff17e80f41b2abffff17BL8;FF60000036c8faffb45e000014e1031faa882600f9d3ffff17e10c0054e0031faa93ffff1721050054e0031faa86ffff17c80080d2e00700f90800f0f2080900d1L8;ZDBBBL8;FB420", + "24000000000006a00000000000000800000002e000000576869737065725072654b657953656e6465724b6579506c61696e74657874004202400000000000L8;FFc80240f91f0500b1a0000054e263009120008052e10316aa70a6ff97e10316aa288c43f81f0500b1e0fcff54e26300914000805269a6ff", + "97e3ffff17e0630091BL8;FF000540adff7b01f9f30700f9e08715ad000941ad08088052e8bf0a39e08b16ad600640ade08711ade2834bade28312ad350700b49912158bfac308911b108052L8;FFff0301d1fd7b02a9f44f03a9fd830091010840a908018052f30300aae023009129f87fd33f2100f1348", + "1889ae30314aa0c000094e80740f91f0500f1e0000054BBL8;FF8c1540d28c0d0c8b8c2501918cfd46d38c0500914901098b6a010c8b29010a8b2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abL8;FFf50300aae00314aa020000143500805209fc4ad30a088052f4031fa", + "af5ff03a92911c0da490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aaL16;FFf55f44f9e66f44f9e57744f9f17b44f9e8cb00f9e80744f9fb8344f9f08744f9e8eb00f9e80f44f9e8a700f9e81344f9eb2311a9eb1744f9e81f44f9e8af13a9BBBBL8;FBef104000000000004e000000", + "0000000091070000130000003d0f4000000000004a000000000000003f050000490000004c61796f75744572726f722200360005L8;FFaa435838a92318386901084aab535838a93318384901084aaa635838a94318386901084aab735838a95318384901084aaa835838a96318386901084aab935838BL8", + ";FFff8300d1fd7b01a9fd430091e1fefff021003291e4fefff084803191e3230091e2018052e80700f927110194fd7b41a9ff830091c0035fd6e1fefff021983291L8;FFe01301b9a04700d196c2ff97e00b01b9a04700d193c2ff97e00301b9a04700d190c2ff97e0fb00b9a04700d18dc2ff97e0f300b9", + "a04700d18ac2ff97e0eb00b9BBL8;FFe2031baa23008052240080526ae0ff97b9035cf8e3feff17a04301d1e10319aa22008052230080522400805262e0ff97b9035cf8f0feff17a04301d1e10319aaL8;FF755e01a9600604ad820344ad620205ad810341ad610202ad820342ad620203ad810340ad6102", + "01adff032e91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L16;FFe8c341f9e0431e91e1d7c23dc082813ce8bf05f9e0dbc23de2dfc23d610200ad620a803d95ddff97b1feff17ff632d39e8b745f9c082c03ca8031ef8680e00f9BBBL8;FF6d000094770a40f975ffff17e00313aa22008052230080", + "522400805266000094610a40f97cffff17f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8L8;FFdf0600b18000005480c20291e1431691c01000941f0700b14086ff548122029110010014e8031faa000119ab426e0054e14316918c0d0094f90b40f9df0a00b1BL8;FF602a40f922008052fbf", + "40094b40000b4600640f9e10314aa22008052f6f40094610e40f9810000b4601240f922008052f1f40094743640f99f0600b1e0020054L8;FF631a40b96324d41a83000036000080d21f000039007d20d4631e40b96324d41a83000036000080d21f000039007d20d463ce749226000090c6c041f9630040", + "f9BBL8;FF4a1540d24a0d0a8b4a2501914afd46d34a05009102000014ea031faaf67b52b9df06007181010054eb7f52b9ec8352b96b0100346b0140b26b11c0da6b1540d2L8;FF69fdff9029a11391e8fb03f9080000d008913491e85703f928008052ea831a91e96705f9a04700d1e1432a91e94f05f929", + "fdffb029ed0a91e86305f928fdff90L16;FFe41b813de317813da00b3aad4283c43c4083c33ce107813da103933c4183c63ce00b01ad4083c73c4283c53ce18302ade213803d29010014e083029181220091BBBBBL8;FB6b796265725f7072655f6b65796c6f63616c5f6964656e746974795f7075626c69", + "635265636f726453747275637475726563757272656e745f73657373696f6eL8;FFa16240f9810000b4a06640f922008052f99c0094a16e40f9810000b4a07240f922008052f49c0094a17a40f9810000b4a07e40f922008052ef9c0094a18640f9BL8;FF6a0a00f90969213828070094e10313aa5dfaff9", + "7803e40f9800100b4610a40f9680240f91f0101eb200d0054680640f9090180522a0400916a0a00f909692138L8;FF390317cbb502178bb90b00b49f0319eb9733999a9f0319eb48ffff54e00315aae10318aae2031caaf61d0094a0feff35f41c0094e001805221008052ed1c0094BBL8;FFe20317aa035", + "d0194608744ade80b40f9000500ad5a1400b4d602178b33008052fc0301911808805229000014020308cb8003088ba18302d1f65c0194683340f9L8;FFa22302d129f4ff9740f6ffb483010014e1032d91a22302d124f4ff97a0f5ffb4650100141f0800f1c1240054a80302d1a10302d1a22302d11f7d01", + "a908018052L16;FF000c0054680640f9490380522a040091e00315aa6a0a00f909692138e10313aa42eaff97770a40f9680240f9080117cbbf0208eb480b0054680640f9e10316aaBBBL8;FFe00300915b2e0094e80340b9c8020036e00740f9f44f45a9f65744a9fd7b43a9ff830191c0035fd6280180d2", + "e00700f90800f0f2081500d118000014e90b41b2L8;FFe0074091e1074091023280520080019121c03591ff7c0094e0ffc33de103c43d80430891e207c43d8162019102328052e07f843de183843de287843df57c0094BL8;FFe00313aa2100805238008052f9fc0094000600b4e10315aae20313aaf7030", + "0aafcfc0094f50317aac182009100008092d782009163f900941f0400f120010054L8;FF200020d4ff4301d1fd7b02a9f65703a9f44f04a9fd830091f30300aa820400372a0040394a050034e9031f2ae8031faaeb0301aa060000144a1d409208010a8bBBL8;FF2901084aab231838ab535838a9331838a", + "96358384a01084a6b01084aaa431838aa7358382901084aab531838ab835838a9631838a99358384a01084a6b01084aL8;FFe8fb41f9eaf741f9f5031faaf6e743b9f7e343b9e86b00f9c80080d258fd60d30800f0f21449009168008052e85700f9c2000014fb6300f9fb4b40f9ea5f40f9L16;FF9a0200", + "149f0600b1ed7300f9401b0054fb0314aa5f0101f1ea2b00f9411e00541f0700b140210054ee6b00f9e84300f9e94b00f9eccb00b9169c00b4fb0316aaBBBBL8;FBf5d6d23d5bfa6e900a646b4e883267f4f0d8141283035e3c0e7dc2729373a237a28c3d71c72d2f6007340000af1ffc3dda06237d14b52", + "c23a274b7ec20cdc1e5L8;FF550b158bf60300aa028d0094b50640799f0600f161000054f3031faad7000014a87a1f53a9661a53f80316aa5a00805212feff9052023291e8e300b9a8761e53BL8;FFe8fb02f922008052e80303f9e8feffb008e10c91e02f823de9ff02f9e90703f9e80b03f99fe1ff97e1", + "5b44f9810000b4e05f44f922008052ef0c0194f10c0194L8;FFf65745a9f85f44a9fd7b43a9ffc30191f90c0014f44f46a9f65745a9f85f44a9fd7b43a9ffc30191c0035fd6e0030091e10316aae20315aa2300805224008052BBL8;FF21008052fb4c0194c00d00b468ffff9008012e910001c03de84d8c", + "52a8ceac7208f000b8680280520000803da8833aa9a8831bf8090000143b00805237008052L8;FF3f0500b1400400540a2c40f9093840f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d2L16;FFe40318aaeb1b00f9f80f40f9eb0", + "300aae61f40f9e03740f9f90307aae0f3803df00315aafb031eaafc9300f9fc0305aae7030eaaf46300f9ee0316aaf6030daaBBBL8;FF69c209f8e93740f9689a023928fd60d369720ab8e96740b97af204f868ae0239884e41b9775e013969221729e86340b96a4a01796802033947ffff17e8031faaL8;", + "FFf82740f9e81f40f91f0308eb61000054e0e30091460bff97080d8052e92340f90827089b29008052097d02a9090180521a7100a91c0700911a7d01a91f2503a9BL8;FF22008052fcec0094962300b4e00317aae10316aa22008052f7ec009417010014e1430091e20313aaf70b00f9f73f00f97d050094", + "e08743adf50300aaf4cb00f9L8;FFfd7bbfa9e40301aae30302aafd030091017c4093e20304aa060080d2050080d2040080d2e00780d2e0ffff97fd7bc1a854f6ff17fd7bbfa9e40301aae30302aaBBL8;FFe1031aaae20318aab4100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e103", + "1aaae20318aaab100094fad342f9fc0740919c8301914afeff17L8;FF5f0f00b1616bff5448008092680200f95bfbff17f6eb42f9fb074bf9f90b4bf9fc0f4bf9f8134bf9f5174bf9c80240f9f7e742f9680000b4e00317aa00013fd6L16;FFe8831391e0031f2ae1031aaae20314aa2500805206048052f", + "a0300f9e3031caa1fa90094a10354f8810000b4e0031caa22008052f0ac0094fc7742f9370d00b4BBBBBBL8;FB733a20746865206c656e20697320c0122062757420616476616e63696e6720627920c0001941646472657373206d69736d617463683a2073656e6465723dc00cL8;FF08fc78d309fc60d32", + "87b68782821084a095d1053295b69782001084aebffff17680100d008210091e9430091e00f00b900210091a22300d12100805203fefff0BL8;FFe20313aaf1fcff97600300b4e00000143f040071400200543f08007121030054e1230091e20313aae8fcff97400200b4e9000014c1620091e20313aae3f", + "cff97L8;FFe9234039881200f9a81b40b989a20039a9b341b8889202b8280080529a9200b8955a01a9892e00b968620039f44f4ba9fb3b40f9f6574aa9f85f49a9fa6748a9BBL8;FFff7e16a91f0800f1011e0054b4835df8820640f9621f00b4810240f9200080398004f8b728040091490400d13100001", + "41f0800f1611d0054a18300d1a2a300d1L8;FF1f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faa305d0094e00741a92e5d0094ff8302d1fd7b06a9f73b00f9f65708a9L16;FF81fefff02150169183fefff0634c0f91e0030091220280526400805223000014c800", + "80d2e0230039e00300910800f0f2ff270039e80300f928e7ff97e80300aaBBBL8;FB30f845000000000020000000000000000800000000000000981046000000000030f8450000000000100000000000000008000000000000009812460000000000L8;FFe20315aa0001178b02810094e802158be81700f", + "9956640f9550300b4e11740f9e80f40f9966240f91f0101eb60390054e81340f9490580522a040091e00315aaBL8;FF0105805202018052fb00019420008052eaa340a9090817aa680200f96a2601a9f44f45a9f71b40f9f65744a9fd7b42a9ff830191c0035fd6750a00f920008052L8;FF150a00940800", + "40b91f11007120ffff54110a0094080040b91f090071c10a0054280080521f0b00f91f2300a954000014f303002af5031faafc031faa34008052BBL8;FF00c48052c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0308d1f30308aa410100b4160040395b0080d2f5030", + "0aa1b00f0f2L8;FFe005005468620a9169b20a910001c03d081140b92001803d69b642b968be02b9c903003660a24ca9693a40f961ba42b962be42b923a10291081540f900013fd6L16;FFe88f40f969a20da9e8a753a9698e0ea968e20fa9e8d340f968c616a9e8ef40f968ea17a9e8e340f968da19a9e9", + "235ea9688a1ca9e87f40f9022f805269c21ba9BBBBL8;FB16cd63d6733effb86fd00756c5d6216f135c61fcd6ff1b75f6bfad4e4f42c2bb914c70f92c0fd697837aab5d0b7062e2d4ad0000c607ee11b0212ac77878408aL8;FFc0035fd608feffd008cd0a91e00301aae10308aa22058052fd7b44a9ff43", + "01912c8d00140a10009109200091e8230091200440a9a9031ff8e9ffffd029811a91BL8;FF1a008092fafb02f9e87300b409038052fb031faaf7feffd0f73600911471099bf8032d913600805210000014e8f342f909068052e02bc33d6822099b69060091L8;FF00fdfff000a03e91500d0094ff8301d1f", + "d7b02a9f85f03a9f65704a9f44f05a9fd830091f60302aaf50301aaf30300aaf40302aa030000149f0216eb88090054BBL8;FFe8cd8d524001c03d1f0309eb082000790000803d61000054e02300913b4c019408038052e90b40f90a0700910827089b49028052095d00a9090900f9ea0f00f9L8;FF4a250", + "1914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff5480fdffd000a03a91444d009480fdfff0L16;FF68fefff008812391ebc301a9f22b00f9f8f301f9e9a703f9e9af03f9e8b303f9f7fb15a9f19700f9fbdf00f9ecdb13a9f60307aaee4700f", + "9fceb10a9fc030daaBBBL8;FF810000b4e01740f922008052fa700194e12b40f93f0400f18b000054e02f40f922008052f470019460c2009170f4ff97e00314aa3f000014f30300aa688e4ff8L8;FFa1037cad080b00f96182853c6082863cb90000b4e0031aaae10319aa22008052f5700094e12740f901", + "0b00b4e00315aa54000014e88241f8e082c03ce9c30291BL8;FFe80301aa80010036480800b5e1031faae8ffff17c00400b5e00313aab2fdff97e80301aae0000036280500b5e1031faae0ffff17e1031faa880600b9ddffff17L8;FF00e80091367863f8207860f8b60000b4c11a40b981000035c11e40b", + "941000035000c00911f3000f1680d0054f303022a360d00b4c11a40b9e203014b4200016aBBL8;FF0825019108fd46d30900088b390500913f0308ebc9130054f87749f91f0700b1c0130054802202915a1c0094080040b20811c0da081540d2080d088b08250191L8;FFe83f40f9e9620991eb1f0d39e0f", + "b833d400941ade1ff833de003843d000540ade207843de083853d020141ade187853de87f41f9e28b853de08f853d4000c03dL16;FFf60300aa20feffb000800f9101048052e20314aae30318aae40315aae50319aae60316aa07088052c3140094f5b000940004805221008052eeb00094200600b4BBBBB", + "L8;FB206b6579735369676e616c5f5051434b415f56315f4d4c4b454d3736383a53434b41204b657973686f756c64206f6e6c79206661696c206261736564206f6e20L8;FF24008052f30308aaacbcff97e80313aaf35341a9c3ffff17e0230091e10315aae20314aa2300805224008052f30308aaa2bcff", + "97e80313aaf35741a9c7ffff17BL8;FF6b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b29050091L8;FF01110054e89741f9e0cfc03d1f0500b1e0e3803da0110054e0e3c03de9470491e80701f920f", + "18f3cb50000b4e0031caae10315aa22008052ef180094e11341f9BBL8;FFf0000014e80317aaf90318aa1c020034e8030091e10318aa1903028b00011c8bfc580194e83340f9e10300912200805208050091e83300f9e803009100010191L8;FFa04700d1e9b705f9a9fdff9029411f91e8b305f92800805", + "2e1833291e96f06f9e95706f969fdffd029ed0a91eaa705f9ea032d91e86b06f968fdffb008c52991L16;FF64028052c4deff97f46341f9e0030b91e1830591022c8052fed80094e0030b9196e1ff97f50314aa69018052a18e41f8280041d23f0000f10841899a1f2d00f1BBBL8;FFf30302aaa20640f9e", + "20100b4f40301aaa10240f920008039a001f8b728040091490400d11e000014890080d248008052e04300390900f0f2e847003928017fb2L8;FFe1431691ead302f997110094fad342f9e8cb42f908011acb1f0308ebc8be0054e8cf42f9e10319aae20318aa00011a8bf87800944803188be8d302f9e067", + "49f9BL8;FF686240f9a80000b4606640f901f57ed342008052f8f80094686e40f9a80000b4607240f901f57ed342008052f2f80094687a40f9a80000b4607e40f901f57ed3L8;FF220e41a9318200913f0210ebe40332aae50320aae60322aa84fc47d3a5fc47d3c6fc47d3e70323aae7fc47d3921852aaa", + "01840aac21842aae31843aa52c20092BBL8;FFb4008052000540ade8f3687915008092e8e30a79e057813de15b813de6010014e8074091f6af45f9e043259108810991f5074091b58209910d860094f43349f9L8;FF003000b580074dada8035ef8f6c744f9e87b05f9e8bf44f9800702ad800b4baddf020", + "8eb800b00ad80074cad800701ada1eeff54a02201913dd7fe9772ffff17L16;FFe0cb44a9e6030991f16748a9e13340f9ed6f40f9e8c303f9eb6740f9e7a340a9e0db813de1df813defc343a9ec2b4ba946000014eb831d91e8b743f9e133c23dBBBBL8;FB6c65646e6f742079657420696d706c656d656e", + "7465646d657373616765206465636f6465206661696c65644d414320766572696669636174696f6e206661696cL8;FF000dc03da0039d3c2e0000143b008052e11340f9e0031aaae20318aa73070091fc880094e0031aaae10319aae20317aae30315aae4031baacfe7ff97bf0213ebBL8;FFe00315aa1ba", + "30191f54301f9f5031691e69aff97e8c342f91f0500b1601300548043c03df6e32291f76301912183c93ceaa209912283cb3cc082893c2083ca3cL8;FF15018052fb080094a0feffb4f30300aae00319aae10317aa1f08007163080054f9031faa35200091d70600d1f60313aab47a79f8e00314aaf30900", + "9439070091BBL8;FF20008052e10319aa3745019420008052e10318aa3445019420008052e10316aa3145019420008052e10315aa2e45019400018052e10313aa2b450194fd7bbca9L8;FFe20a803d200c0054f91300f9f9430691fbe300912083cc3c2183cd3ce81f00f9e81b40f92283c33ce0e3009160", + "838c3c2083ce3cc1e2009161838d3c2183cf3cL16;FF08008092f50302aae4e300f9e29349a9e8d30ea9f8030eaae03340f9fbbb4ca9ed5b00f9e8a74ba9f79f00f9f70310aaf00306aaf4030aaae60307aaca008052BBBL8;FFfd680194e13740f9810000b4e02740f922008052f8680194e15340f98100", + "00b4e05740f922008052f3680194880280d2b40e00f90800f0f2a8ce00a948008052L8;FF0001178b03690094e802158b680a00f9186300f139630091c003005436d77fa9e00314aae10313aa8f010094e00315aae10313aa8c010094770a40f9680240f9BL8;FF20020037750240f9a80640f9160101eba", + "2020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e003009127efff97L8;ZDBBL8;FFaa0312b8a8c313b8828707adeb1300b9ebe303b9200300ad6c250194e9bf4639e84346390a088052a00302d1f80310912a15003308111d12e8430639e8031091L8;FF", + "40835ef8e10313aae20317aafd290094c0feff35f6031aaac18e5ff8810000b4400340f922008052f3280094a002c03da80a40f9c002803dc80a00f9140300b4L16;FFf80300aa1b0101911c81009168139c9a000540ad000400adfaa800940009805221008052f3a80094800700b4f90300aaf4a8009400", + "04805221008052eda80094BBBBBBBL8;FB726f6d20c02720776974682050524556494f55532073657373696f6e207374617465202862617365206b657920c0012900204e6f2076616c6964207365737369L8;FFe3031faa259f009422feffd042c02d91e10300aa3d9f0094fd7bbba9fc0b00f9f85f02a9f", + "65703a9f44f04a9fd030091ff030ed128f840f9f30301aae20700f9BL8;FF4b0a00344d11c0390b00be522b000b0bac1d00128d00f83761710c8bab008052300000144d15c039ae1d00128c1d0e0b8c0102518d00f83761710c8bcb008052L8;FFc00500b5a0e300d111feff9700010036c1f9ffb4310000", + "14a2e300d1830c80520bfbff9720f9ffb445000014e16300b9c6ffff17c80080d2a1831df80800f0f2BBL8;FFaa031ef809693738e81b40b9e003082ae6e8ff97a1035ef8a8035df81f0101eb401c0054a8835df8090680522a040091e003152aaa031ef809692138a1c300d1L8;FFc90240b22911c0da29", + "1540d2290d098b29250191c91a498b29050091b41640f92801088b140b00b4890240b22911c0da291540d2290d098b29250191891a498bBL8;FFe10300aae00301aaf44f47a9f92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd637008052180080921901805206000014e20313aa430c805254e9", + "ff97L8;ZDBBBL8;FB1d1c40000000000054000000000000007f000000050000001d1c40000000000054000000000000008d00000014000000ef104000000000004e00000000000000L8;FF968248f8df0600b18014005480220291d7ebff97080040b20811c0da081540d2080d088b0825019109fd46d308", + "00098b080500911f0109eb281300546a000014BL8;FFcafeffb04a0d0891eaaf03a92a0080d2f40308aaea0bc0f2e9ff02a9e9ab05a952ff0094e00313aae80314aaf44f49a9fd7b48a9ff830291000440ad1f010039L8;ZFBBL8;FF4a213f91e8a700a942ffffd042ac3391ea0f00f9e3430091383f0194", + "fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000904ab13991e8a700a9L8;FF61f9ffb4f1000014e20313aa430c805214f9ff97e10300aafaffff17e1031faae86b00b9f7ffff17680240f9080540f9190101ebe2000054aa000014e20313aaL16;FFed0740f9e56f40f9e03740f9ee3f4", + "0f9ebe300f9eb0312aae0f3803dfadb4aa9e193803de2c345a9c4010014e027c33d8103c03de86f46f9e0c7833de1f7803dBBBBL8;FB80174000000000005600000000000000c80000000900000080174000000000005600000000000000d10000001f0000004e1a4000000000005800000000000000L8;F", + "F1f0500b181ebff54e8031faa080113abe302005400fefff0000005914b8f0094f3031faa088c48f81f0500b121efff54e8031faa080113aba301005400feffd0BL8;FFe20f0fa9e41710a9e62311a920013fd6e06b01f9e8c31791f3c31791e16f01f9290c40f9e1830b9120013fd6f4fb42f99f0e00b12", + "102005468008052f46f41f9L8;FF1f0900b1e8af00f9e9a300f921050054e0431391e1031caa2200805223008052ff030094e86b42f9e96f42f91f0500f1e9af00f9e03c0054e87342f9e89f00f9BBL8;FF890240b22911c0da291540d2290d098b29250191891a498b29050091380108ab22040054b800f", + "8b6f9031faae00319aae10318aa2c4f0194d80300b4f1520194L8;FF7f0f00b1e1000054c800805223ffff17e8e322910081cd3ce8d344f97effff17f63f42f92083c13ceae32291e9d742f9f5c742f9f7cb42f9c80240f9f43b42f9L16;FFe8430f9100010291cad9ff971d120014e80301aa190340f90d", + "adc0a907014ba91cf940f9097942a9062941a9fc8300f9e0cb00f902014ca9e9bf00f9090d43a9BBBL8;FF680640f9090180522a040091e00316aa6a0a00f909692138e10313aae3f8ff97550300b4610a40f9680240f9969a40f91f0101eb20230054680640f949028052L8;FFee110094fad342f9e8cb4", + "2f908011acb1f0308ebc9000054e0431691e1031aaae20318aae5110094fad342f9fc0740919c830191fbf9ff17f60300aae0431691BL8;FF8d00f83761710c8beb0080521e0000149f014871830700544d1dc039ae1d00128c550e0b8c0148518d00f83761710c8b0b018052140000148d7d1c53ad06003", + "4L8;FF61c0218b23c04d3903fdff346304005123c00d39f35341a9fb7345a9e5ffff17f35301a9fb7305a9fafcffb040a31191017877783b6c1c53383c7cd39dfeff97BBL8;FF810000b4e07b49f922008052fa320194e18349f9e1acffb4e08749f963fdff17e18b49f93f0800b1800100543f0400b1400", + "10054810000b4e08f49f922008052L8;FFf30308aaa08741ada82b40f9a90700d1ff0300f9e00700a9a0e300d1e1030091e20f01a9a26301d1e82706a968fdff9008a10f91e41702a9e61f03a9e00702adL16;FFe20bc13d0800f0f2f6d70da9161900916383853ca303d83c6083843ce00fc13d6383863c", + "e10b05ade033803da2033aad6083c63c6283c43ca103933c6183c53cBBBBBL8;FBfc0100002d0000004e6f2063757272656e742073657373696f6e000000000000890c4000000000002c00000000000000330000002d000000617373657274696fL8;FFa303d63cd402188b5a0318cbe00704ada00779ade", + "22b803da203d13ce31f803de08701ada1037aade20b803de18302ad16140094a1d300d1e00316aae20318aaBL8;FF991100b4542b40f9fe1a0194e00319aa21008052f71a0194c01300b4e10314aae20319aafc0300aafa1a0194542340f9b4031df8b40100b58200001436008052L8;FF6183863cc182c1", + "3c6083803cc082c23c6183813c6083823cec2f0054894800b548008052f7c34bf9f8c74bf9e9830a91e8830a3928008052e0230891e1431391BBL8;FF087440f91f8100f1e11300540c7040f9e81341390e088052e94340b9f20b43a98d194039045840f9a6e35b38258108aaa7c35b788b094079edab003", + "98d7141f8L8;FFe80300aae0833291a1fdffb021002691a2018052a3fdffb06334269144018052e85306f911000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f9L16;FFba8311f87fecff97a083db3ca183dc3ca283dd3cf8d301f9e0071bada083de3ca183d73ce2031cada083d83ca283", + "d93ce10319ada083da3ca183d33ce2031aadBBBL8;FFe0031faaf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a93f790094e0230091f7a700a93c790094e00313aae1031faae20314aaL8;FFfd7a00949d000014f3031faae8031faa85000014bf0600b121fb0054f8031f2", + "af6031faa340080521900809228008052ff1700f9e80700f9e0074091e8c33f91BL8;FFe911092a0b240039f05f40392b120d2a08280039e8734039ed7740390c140039ec5b40390a1c0039ea6b4039f26f4039a811082a0c120c2a0e2000394a120a2aL8;FF69067792ea179f1a3f0108f14901332aea07", + "9f1a3f01007269010c0a0b010aaaea138a1a0b118b9a5f01096a700170b2a8058d9a1f005cf26dfe56d30f159f9aBBL8;FFc1fcff540a1840f9e803088b5f0500b1c1fdff54e80308abe2090054092440f93f0500b180010054092c40f92a0140b24a11c0da4a1540d24a0d0a8b4a250191L8;FF1a008092", + "0300001428008052e80700f978b640f9694a42b9684e42b9fadf03a9e9230629980100b475b240f9f53a0094e00318aa21008052ee3a0094e0e000b4L16;FF8e1a0094efb343f9ff0900f141410054e16740f9810000b4e00315aa22008052f5ba0094ba2b00b5f5031faa53fcff17e96b40f948fcff1796", + "0000b4e10316aaBBBBL8;FB656e63617073756c617465312073746f72656420737461746520656e6469616e6e657373737071723a3a696e6372656d656e74616c5f6d6c6b656d3736387370L8;FF84c02691a24700d1410380523e87009440008052410180523387009440008052e10313aa308700944000", + "8052c10080522d87009440008052e10318aa2a870094BL8;FFe04f41f922008052fb0a0194e89f40f91f0500b1600000544063029126e5ff97f3d352a9940200b47522009104000014940600f1b5620091e0010054a1825ff8L8;FF000180520102805236070094fd7bbda9f50b00f9f44f02a9fd030091f", + "40302aaf303012af50300aaf60a00940003805201018052ef0a0094400100b4155000a9BBL8;FF364841b9f90301aaf30300aab50400b4340740f9fb4a0194e00315aa21008052f44a0194602100b4e10314aae20315aaf70300aaf74a0194381740f9980300b4L8;FF80fdffd0000009915047009480fdf", + "fd000e001914d47009480fdffb000a023914a4700940800403989fdffd029a10c91e00301aa08711d5308410051081d7d92L16;FFe8d300f9e82346f9e86f00f9e84346f9e8f700f9e8008052e87300f908008092e99b1ba9e60307aae87700f9e70314aaf57b40f9e58f1da9e8174da9e18f00f9BBBL8;F", + "F297d2e91692902a9290080d2691bc0f2687d01a9682504a954670194fc9740b9f47f40b9880280d249008052dc5202290800f0f2c90200b9080540b2c80600f9L8;FFf30300aaa80000b4600a40f901f97fd342008052f86a0094681240f9a80000b4601640f901f97fd342008052f26a0094681e40f9a8", + "0000b4602240f901f97fd3BL8;FF1f0116eb09050054e00313aab6f7ff9700fe073728fc60d3680500b5200840921f1800f1a2050054217c0353c10500343f040071200200543f08007120010054L8;FF3fe7ff97ff4301d1fd7b03a9f32300f9fdc30091e90300aae10300f9e0430091e20b00b9e203009", + "1e10309aaf30308aab9ffff97e82340b9e007c03d681200b9BBL8;FF1f1900f102020054017c0353210200341f1100f160020054e003082ae20313aae303142ab5ffff97c0fdffb4d2ffff17280180d2e00700f90800f0f2081500d1L8;FFe10313aa38270094080040f9e20301aa002140a9e10308aa622", + "70014000040f90129ff17000040f90ee7fe17000040f96adefe17082440a9e20301aae00308aaL16;FF67ffff17e00b40f922008052faaa009448008052e91f80526842003969220039f44f48a9f65747a9fd7b46a9ff430291c0035fd6ff4301d1fd7b02a9f65703a9BBBBBBL8;FB2063616c6c2027c003", + "273a20c0002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d6235386437663536653336343563L8;FFfa6742a9fc6f41a9fd7bc6a8c3a7ff17e91f40f948008052e083079133210039280100f92ca6ff97e12340f9f0ffff17f5031faaf70316aae00315aae1031", + "7aaBL8;FF780a40f9680240f9080118cbdf0208eb29f8ff54e00313aae10318aae20316aaae020094780a40f9bbffff17e00313aa22008052a9020094610a40f9c3ffff17L8;FFe007803de017803db70000b4e00318aae10317aa22008052f71e0094e11f40f9810000b4e00316aa22008052f21e0094a8", + "0180d25f0700b10800f0f2a8831cf8BBL8;FF5f0314eb0206005408038052e90b40f94027089be8033aaa8802088b0805088b02f17dd3165c40a9016000919e5f0194f30f40f9940600d1740a00f9f60000b4L8;FFfb0300aa035f0094f4e340f9fa0316aaf40800b4f8df40f9fa5e0094e00314aa210080", + "52f35e0094600b01b4e10318aae20314aaf60300aaf65e0094f8833291L16;FF60008052e30313aa94eaff97888240391f05007101020054610a40f9680240f91f0101eb40040054690640f92a0400910b0480521f010aeb6a0a00f92b692138BBBL8;ZBL8;FF24008052ada2ff97e11740f9e00317aa92f", + "cff17f70300aae0630091220080522300805224008052a4a2ff97e11740f9e00317aab3fcff17e0fdffd000400491BL8;FFfcfe0094600500b4e10316aae20314aab40200a9fffe0094b40a00f961420091000080927442009166fb00941f0400f1210300549ffedfc8610640f90104f8b7L8;FFf3ffff17", + "e10300aa3f0840f2a0000054220040390202003421040091fbffff17e4db07b2e4df9ff2220040f94300048b6200228a5fc001f26100005421200091BBL8;FF880700d11f0d00b128e8ff54e00319aae1031caa22008052f73e01943cffff17df020171e20b0054fc031faaec0f00b9e84700b9eb2700f9e", + "9234629e03740f9L8;FFf5230ba9e8ff41f9e90342f9fb0742f975c643f9e86b00f9080340f9e95700f9680000b4e00315aa00013fd6010740f9810000b4020b40f9e00315aaee3e0094L16;FFe97700f9e93640f9e94f00f95c7700b4fcbe0094e0031caa21008052f5be0094403301b4e10314aae2031c", + "aaf50300aaf8be0094b10300146083c83c6183c93cBBBBL8;FBa45e67f5f2609126267fe17ad077e264f960be20282206a28a4ae7347b43675f6f7d68af531abb819168e296f6c95b3cfeb3846bd1b6d4bb0e6bdac6a28c6421L8;FF207d00b4fc0300aafe8e00944000805241008052f78e0094607c00b4", + "f40300aaf88e00944000805241008052f18e0094a07b00b4f70300aaf28e009440008052BL8;FFe15706f90800f0f2080900d1ca000014e05706f9e80b41b2c7000014c80080d2e15706f90800f0f2080900d1d0000014c80080d20800f0f2080500d1be000014L8;FFe90314aa696a2af8680200f9f44f4", + "2a9f50b40f9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091687cc19bff0308ebc1020054747c019b0800f0d2BBL8;FFe8030091e20706ad38770094e80340f91f0500f1a1030054e88241f8e082c03ca9c300d140fffff0001c1291a14300d1a8031ef88801009008510591a9233fa9L8;FF2", + "925019129fd46d30801098b130500917f0209eb69240054080c47f81f0500b1201d0054e2feff97080040b20811c0da081540d2080d088b0825019109fd46d3L16;FFe9a302a9e89342f9e9d342f9e87b00f9e89742f9e86300f9e89b42f9e8d300f9e8a342f9e8ef00f9e8cb42f9e8f700f9e8e342f9e9a", + "30fa969018052e97300f9BBBL8;FFe00316aae403152a48e1073649e2ffb591ffff17ff8302d1fd7b06a9f73b00f9f65708a9f44f09a9fd830191200440ad28008052f30300aae87f01a9a88300d1L8;FFe82b00b9e8430691e00705ade10240adfab30a39e10302ade10ac03de10b03ad3606ff97e99341", + "b93f09007121080054e8cf40f9e9a341b9ec030b91eaa741b9BL8;FF1f0800f121090054e1230091e20313aaffdf00a9ff0f00f9cffaff97c00c00b5990a40f9880240f93f0308eb61000054e00314aa35ea0094880640f9e083c03cL8;FF600200b4f35301a9f30300aa20008292e0ffeff23f0000eb881", + "40054f76303a9610e40f2f96b04a92103005460c25f3862d25f3863e25f784410001280010034BBL8;FF090180522a04009109692138e1431691ead302f95c0c0094e89b49f91f0500b1c0000054e8074091e143169108810991004103917f0f0094f87f49f9580300b4L8;FFff0316b9e81700b9e029009", + "4e80356b9e00740918100805200001891ff0316b9e81300b9d9290094e80356b9e00740918100805200001891ff0316b9e80f00b9L16;FFfb2204a9f96a02a9e00600ade013c03de92203a9e82b40f9e016803de83200f9810000b4e00316aa22008052f2ae0094e10740f9810000b4e00313aa22008052B", + "BBBBL8;FB4d6573736167654c656e6774684576656e4d6573736167654c656e677468546f6f4c6f6e6753657269616c697a6174696f6e496e76616c696400000000000000L8;FFc2030054280108ab42040054091440f9090300b40a1040f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce", + "11c0dace1540d2ce0d0e8bce250191BL8;FF088c5cf81f0500b1e00900541efeff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eba808005450000014f3031faaL8;FF98c4ff97e01301b9a04700d195c4ff97e00b01b9a04700d192c4ff97e00301b9a04700d", + "18fc4ff97e0fb00b9a04700d18cc4ff97e0f300b9a04700d189c4ff97BBL8;FFe82706a968fffff008812391e83b00f96cd9ff977f22003928008092680200f9b50000b4e00314aae10315aa22008052f1560194f44f51a9f65750a9f85f4fa9L8;FF04000014940600f1d662009160010054c1825ff881f", + "fffb4c00240f922008052f5560094f8ffff17e057c13de15bc13de87345b9cfffff17e89340f9c80000b4L16;FFf6031faaf5031f2af9031f2af7031faa38008052e8431e91fb431e91fa431e91a5fbff97f4cb43f96083c03ce8d743f99f0a00b1e0d7823de8b305f901010054BBBL8;FF21603f91a3fff", + "fd063bc3f91e0230091a200805244038052d9ffff17890080d2e8430039480080520900f0f2e847003928017fb2a3ffff17e00700f9a1ffffd0L8;FF09692138ead302f9782b0094e1431691950f0094e87749f91f0500b1e0070054e1d342f9e8cb42f91f0101ebe08b0054e8cf42f92a04009180220291", + "49018052BL8;FFe8008052f30300aa2a0900d13f0500f14881889a1f2500f1c8090054c9feffb029150a918a0000102b6968384a090b8b40011fd660220091f30b40f9fd7bc2a8L8;FF0d00001440000d91240000b0030440f9069441a9dfffff17060180d2e31c80d2e50306aa461000f9e8ffff1720000", + "0b000c0079171ffff974cffff976000f837BBL8;FFe8d700f928e341f8ff0600b120a1813ce04fc13de8cf0ef92800805221a1803c40f18f3cf6bb0ef93821003928250039f4cb00f9a00b0054e8c30091e0431691L8;FFc53cff97f64b45f9e0432a91e1c32491022b8052ff360094e0432a9140f1ff97f", + "70316aa69018052e18e41f8280041d23f0000f10841899a1f2d00f1e20a0054L16;FFfa0316aa150100b4e10315aa22008052f4030b2af5030c2af7b60094ec03152aeb03142a5f0700b1800b0054f503192a9f0700b115df78b3600e0054e8274ea9BBBBL8;FB6e74697479206b657900000000000000bb", + "124000000000003800000000000000490000000a000000bb124000000000003800000000000000520000000c000000L8;FF2b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8bBL8;FFe9270c9", + "122f18f3ce9670c912283c53c20f18f3c2083c43ce9a70a9121f18f3ce9e70a9108e10c9120f18f3c2083c63ce9270b9122f18f3ce9670b9120f18f3cL8;FFea1302f9ea7f41f9010100ade083c83ce183c73ce90f00f9e98741f908018052eb2702f9e18318ade92b00a9e8e300f9f8060094f7031faa1a", + "05805228008052BBL8;FF45cbff97e0f7ffb44b000014e85b40f91f0500b161000054ff670ba9ff6300f9e1c30291a20301d13bcbff97a0f6ffb44a000014e86740f91f0500b161000054L8;FFfc46009440f8ffb4fb0340f9e2031aaafc0300aae1031baafe46009418000014e8ef41f9080f00b4e9f341", + "f9e80302f9e8830591ea0310912b0000f06bd12991L16;FFe0afc23de6a341a9e91300f9e98f40f9f8ef00f9f89f40f9e7b300f9e7b744a9e8a713a9e9eb40f9e8a740f9f6031baafb030baacb008052e99b00f9e9cb40f9BBBL8;FF0900f0f229017fb24a1d4092a0c300d108010aaae81b00f9ea7343f8", + "a9233da9aaf31df8caeaff9788fffff0080919916903805268a600a92800805268020039L8;FFec0314aa2aa040a9290040f90bfc63d35369283808050091280800f90bfeffb43f0108eb93611932000100540dfc6ad35369283808050091280800f94d0200b5BL8;FF810800343f0800710c0200543f040", + "071800300543f080071a1020054880243f81f0500b1810000549f5e03a99f7e04a9977e05a981c20091e20313aa45f6ff97L8;ZDBBL8;FF611640f9810000b4601240f922008052f9260194610640f9810000b4600a40f922008052f4260194603240f9a00000b4613640f9610000b422008052ee260194L", + "8;FFa2ffff9774564da9350200b49682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef822008052f1260094c1825ff8e1feffb4c00240f9L16;FFb2031df8123240b9a0039c3cc141823ca1037eadf13300f911825fb810c20191c041813ce20343adc141803ce117c03df1c11f", + "b8e0c19e3ce2c19d3ce1c19c3cBBBBBBBBL8;FB6f6e652d74696d65207072656b65790011696e76616c69642073657373696f6e3a20c0001c706f73742d7175616e74756d2072617463686574206572726f723aL8;FFf5fb40f9561700b4fea30094e00316aa2100805239008052f6a3009480fcffb4a102", + "0191e20316aaf70300aaf9a30094f4a300940008805221008052eda30094BL8;FFe00301aa08020037980240f9080740f91f0100eb42020054e80f41b2e80700f907000014c90080d248008052e04300390900f0f2e8470039e90700f9e0230091L8;FF53611932200100542a0440f90bfc63d3536928380", + "8050091280800f98b0200b5e0030caa1b000014e10300a9e00301aae10308aa220080522300805224008052BBL8;FF08017fb28a1e409229010aaa68a600a928008052680200b9ff030891f44f43a9f65742a9fc5f41a9fd7bc4a8c0035fd6ffc305d1fd7b11a9fc6f12a9fa6713a9L8;FF0001188b03640", + "0940803168b680a00f9540300b4610a40f9680240f9b51240f91f0101eb40070054680640f9490280522a040091e00314aa6a0a00f909692138BL8;FFb9f0ff97e80300aae00301aa08020037750240f9a80640f9160100eb62020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f", + "2e8270039L8;ZDBBBL8;FB5f6b65795f69647369676e65645f7072655f6b65795f696474696d657374616d704d6573736167654b65796369706865725f6b65796d61635f6b657969765065L8;FF60000054e163009139a5ff97888a40f91f0500b120eaff548142049136000014e11740f9e80f40f91f010", + "1eb60730054e81340f9938248f84904805209692138BL8;FF7f020039e003803d6012803cfd7b43a9f32340f9ff430191c0035fd63fa000f141010054f30308aae84300910010009181048052d4070094e81340b91f050031L8;FF1f0118eb1631989a7f0217ebf5979f1a690200548102178b20008052e2", + "0316aa05170094800200b4c000f8b60a0d0094080040b91f110071e0feff5405000014BBL8;FFea031faa49f9ffb5d0ffff1740ffffd0006006914d40019440ffffd000600a914a40019440ffffd000a02f914740019409004039202040a9030d40f9a9000036L8;FF0d00be528d010d0b4c2180396b710d", + "8b8c00f8b761e10c8b2b0180520a0000144d254039bf0500f1c80100548c1900126ce10c8b81fd0daa3f000beb03050054L16;FFe8a347f9ea9f47f9e8f700f9e8a747f9e8ab05a9e8ab47f9e8a70fa9e8af47f9e84b00f9e0032b91ebfb00f9f74700f9c0caff97f70314aa68000014e8031d91BBBBL8;F", + "B6e65676f74696174696f6e696e6e6572636861696e000000bb1140000000000047000000000000001d0200001400000073686f756c6420737570706f72742061L8;FF130500917f0209eb69240054080c47f81f0500b1201d0054d5fcff97080040b20811c0da081540d2080d088b0825019109fd46d308", + "00098b080500911f0109ebBL8;FF0825019108fd46d308050091090c40f93f0500b1400400540a1440f9092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091L8;FF028c815200401d9102140094e00b4091e843139102c4805200c00e9101813191fc130094f713009", + "400c4805221008052f0130094405d00b4e10b409102c48052BBL8;FF365a0094f45745a9e11f40f9e10000b4e82340f9f70300aa22008052e00308aaf5530194e00317aaf40000b4f70300aae00315aae10314aa22008052ee530194L8;FF22f18f3ce9670c912283c53c20f18f3c2083c43ce9a70a9121f", + "18f3ce9e70a9108e10c9120f18f3c2083c63ce9270b9122f18f3ce9670b9120f18f3cc082c73cL16;FF63400c9184feff9084e00c9100210091e223009121008052e82700a926d00094c80100f0e003142ae103142a080140391f05007160fcff54473a009462024079BBBL8;FF09692138e10313aae8f9f", + "f97e10314aa280c49f81f0500b180000054c0008052e20313aa65fdff97882e40f9680100b4090d8052812a40f9157d099be0008052L8;FFe8cf42f9490380522a040091e00318aa09692138e1431691ead302f9920c0094fad342f9e8cb42f908011acb1f0308eb483c0054e8cf42f9e10319aae20318aa", + "BL8;FFa00100b4f50300aafef30094e00315aa21008052f40315aa36008052f5f30094a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad30a088052L8;FF040080124304805202008052e11a40f9000080d2d622c19a017f169b0b0600941f0400b1a0060054c10600d116ff4cd3e21a4", + "0f91500188b000700d1367c169bBBL8;FFe1ffc33de8d342f9e90348f9e067c13d8183813ce83b08f9e80f40f9e94708f9e11fc43de223c43de0fb863de01b843d600600ad620a803de80000b4ea1740f9L8;FFe89b04f9e99f04f93f300094e84f45f9e95345f960fdff900074129163fdff9063a024916", + "4fdff9084c01691e2831a91c1058052e85303f9e95703f932300094L16;FF8083813c8183833c8283823c35170094a0077bada8035af8a20f7cadf42f02f9e82b02f9480080d2e007813d0800f0f2e10b813d16017eb2a08739ad4083c63cBBBBBL8;FB6579696e76616c69642072656d6f7465206964656", + "e74697479206b65796d697373696e672073656e64657220636861696e206b6579696e76616c69642073656eL8;FFe8430391e10317aaf902028b0001158b009c0094e89b40f960020191e14303912200805208050091e89b00f931980094ff3f0439f80314aaf70319aa02ff46d3BL8;FF62000054550080", + "52030000141f404071d536969ae80740f9080114cbbf0208eb28040054e80b40f91f0002710801148b03fdff54e90f80121f00207109140033L8;FFfd1b0014e86f42f9fb031aaafa0315aaf50308aae0074091e1031aaae20315aa00401d91fa0a0094f5ab4bf9bf0600b1c0230054e0dbc53dfcaf4bf9e", + "077803dBBL8;FF8102188be20315aaf5ff0039015c0194e00743ade0430291e223c03da18302d1a0073eade00741ada2039e3ca0073cade00b42ada00b3dade00740ada0073badL8;FF0800f0f2080900d1ca000014e05706f9e80b41b2c7000014c80080d2e15706f90800f0f2080900d1d0000014c8008", + "0d20800f0f2080500d1be000014e05706f9L16;FFe003803de90b00f920030054e083c33ce183c43ce93740f9e283c53c680200f9600601ade003c03d692a00f9e90b40f96212803d6082803c690e00f9fd7b47a9BBBL8;FFc0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4600640f", + "922008052f47b0194610e40f9810000b4601240f922008052ef7b0194611a40f9L8;FFe1074091e93709f9a9fdffd0294d2791e84b09f9a8fdffd0088d3491e94309f9290080d2a04700d1e85b09f928038052a90fc0f2ea5f09f9aa0a805221800991BL8;FF5f7d0271490d00120e819f1a3f2500716d0d", + "0012ca114a0b0e819f1a7f7d0271c901090b0e819f1abf25007129c10011cb114b0b0e819f1a9f7d02714ac10011L8;FFe80e003419048052f8031faafafcfff05a0310911900ac720c0000148812188be1230091fa6701a9f30700f9002140a900013fd6600e003718070091a8024039BBL8;FF6282853c", + "e00b01ad6182883c6082843cff430791f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8c0035fd6281040b96800c8376800d0375c3801144d380114L8;FF081140b9fb4b00f9fbc30d91ffe701f9e9d301f9e9b30e916001803deb0313aa68aa02b9e8830e91e9db01f9694240f9e8e301f9688d4ff8ead", + "f01f9ea5b00f9L16;FFf9030eaaf6030b2af8030c2afabb0094ee0319aaec03182aeb03162ae90314aa750100b4e0030eaae10315aa22008052f40309aaf5030b2af6030c2aeebb0094BBBBL8;FB7b400668764ed2aaa9eaaf82d9cc0b66a28cb732b4dfebb49284000043059f581fbbd45ae8e86b075100", + "c3eb485852d972939b2209ee06fade900044c755de94L8;FFa9031cf82c880094480100b0e103152a08014039c07a73781f05007120fcff544df2ff97c07a3378e14340f9f45341f9f3031faaf50301aa09000014e84f41f9BL8;FFe8c32291a04700d1e9b705f9e9feffb029210c91e8b305f928008052e", + "1833291e96f06f9e95706f9c9fefff029ed0a91eaa705f9ea032d91e86b06f9c8feffd0L8;FFff830191c0035fd633008052285440a9f4cf00a9ff0f00f9bf0214eb49f9ff54e0230091e1031faae20315aa2300805224008052f30308aa8ae8ff97e80313aaBBL8;FFe10317aa22008052f60f00f9fa4b0", + "194a8a243391f050071c00000541d000014f60f00f9a8a243391f05007121030054e8830091a0260491a182029112480094L8;FF4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b42a0140b2L16;FFe8", + "b700f9e8ff43f9e9a318a9e80344f9e90744f9e8eb00f9e80f44f9ea2311a9e81344f9ea2744f9e82f14a9e81b44f9e92313a9e82b44f9e91f44f9e8ab04a9BBBL8;FF00c03c915168019428008052ff0f00f9ffa300a9130800b5f50800b5f9031faa3700805233000014f9031faaf50200b41f0319eb20", + "08005448028052e86a3938L8;FF880241d29f0200f108459f9aa80600b41f0500f1000200541f0900f121090054610a40f9810000b4600640f922008052f16b0094611240f9410900b408038052BL8;FFe18340ada18338adb9f3ff97a0877dad800605ada08b7ead800a06ada1837bad810203ada2837ca", + "d820204ada18379ad810201ada2837aad820202ada18378adL8;FF2b7d089b0c2080f2e80300aa1f000aeba90100542e00088b004100d1cf397fa9ef010bcace010bca90010fcb91010ecb0f020faa2e020eaaee010e8abf012eeaBBL8;FF48048052ffa70ea909fffff0299d2a91e9ab10a9290080d2e1a", + "30391090ec0f2e8ff0fa9e8a712a95028019428ffffb008a5149129048052682601a9880280d2L8;FF9f0200f9f44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091330400b182030054b300f8b6f6031faae00316aae10313aa2b280094f40301aaL16;FF60828f3c7f220739686a1da9", + "685a1ea998ebffb55fffff1725feffd0a5002991e103019182820191e0031f2ae3031faa1aa8009423feffd06360299100108052BBBBBBL8;FB69616c697a6564207769746820c00f20747261696c696e67206279746573000c206e6f7420666f756e643a20c0002f636172676f2d72656769737472792f6", + "96eL8;FFa80000b4600640f901f97fd342008052f99f0094e827039118070091e1031aaa00f1cf3ce8ef40f91f4300f16002803d680a00f941f8ff541c010014ffd71ca9BL8;FFa0c300d10800f0f2bf931d38a8031df832260094e80300aa01ffffd021a4139103ffffd063c01291a0c300d142018052a4", + "008052a8031df8b7250094a1035df8L8;FFbe120094600a40f9e80301919ac1fe97f62340f9e083c43ce82f40f9df0a00b1e00b803de81b00f9c1000054e1230091e2830091e00315aadbf6ff970c000014BBL8;FFe80741b298ffff17a1035ef8e10000b4a8835ef8f40300aa22008052e00308aaf55f01", + "94e00314aae0bf02f981ffffb02188099183ffffb063000a91e0e31591L8;FFe41710a9e62311a920013fd6e06b01f9e8c31791f3c31791e16f01f9290c40f9e1830b9120013fd6f4fb42f99f0e00b12102005468008052f46f41f9f36b41f9L16;FFf502003574040034610a40f9680240f91f0101eb600", + "40054680640f92a04009109028052e003142a09692138e10313aa6a0a00f9f44f42a9f50b40f9fd7bc3a8BBBL8;FB01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101L8;FF7bfbff17e06300", + "91220080522300805224008052a9a3ff97e11740f9b5fcff17e0630091220080522300805224008052a2a3ff97e11740f979fdff17e0630091BL8;FFf65741a9fd7bc3a8c0035fd6280080529f0a00f99f2200a9f44f42a9f65741a9fd7bc3a8c0035fd6f6031faae00316aae10313aa2cfc009408fcdfc8", + "080940f9L8;FFc0035fd60000000000000000000000002400028b0500028b5f0002f1a80700545f8000f1e80300545f4000f1c3000054261c40a98c347fa9061c00a9ac343fa9BBL8;FF21ec039143ffffb063e80291a00301d1620280524401805212000014a0031cf841ffffb021ec039143ffffb06354", + "0491a00301d162028052e401805209000014L8;FF6db241f96fa641f970aa41f9699641f96c9a41f96e9e41f977a241f9f14f00f971ca1391761602f9781a02f9681e02f96a2202f96b2602f96d2a02f96f2e02f9L16;FF570080529f0300146083c63c6183c73c6283c83c6383c13ce077813d6083c93ce", + "17b813d6183c03ce083813d6083c23ce15f813d6183c43ce8bb42f9e27f813dBBBBL8;FBab960000c9781deea1c853ad7f83699431c20f2a95e6d8806c4036201b100880044088ec0b924f25a29a514dadae53dface7d673eb39f094784a3c259e124f09L8;FF0800098b080500911f0109eb69010054000", + "114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff5400feffd000800c91458c0094e0fdfff000a00d91BL8;FF01630091a22302d1f0ebff9740f6ffb483010014e1032d91a22302d1ebebff97a0f5ffb4650100141f0800f1c1240054a80302d1a10302d1a22302d11f7d01a9L8;FFe10319aa", + "370c009420008052e1031caa350c0094ffc303d1fd7b0ba9f76300f9f6570da9f44f0ea9fdc30291553040b9f30300aaa8c300d1e00302aaf40301aaBBL8;FFee110094e84b40f91f0500f160160054f643029108088052f7030091c082c63cc182c73cc282c23ce00703adc082c33cc182c83ce20301adc", + "282c13cc082c53cL8;FFce1540d2ce0d0e8bce250191ad194e8bbf010ceb830500546b0500f1ec030daa81feff54a90109abe300005423000014e8031faa090840f949fdffb5e90309abL16;FFf25744f9e8e700f9e8b743f9f17744f9eea743f9f7df43f9fbe343f9e82b17a9e8bb43f9eac343f9e31744", + "f9f81f44f9f92344f9e9231fa9e8cf43f9e9bf43f9BBBL8;FFa7ffff17e80f40f9890640f92a0108eb431d0054890240f9e00316aae30317aae403152a2801088be90b40f9882a00a9680040f9080540f9150109ebe2020054L8;FF080200341f05007141030054000180521d000014280180d20800f0f20", + "81d00d11e0000141f150071000200541f11007141040054280180d20800f0f217000014BL8;FFac0100543f040071a00300543f080071a1020054400f00b5e00313aab2fcff97e80301aac0060036a80f00b5e1031faae6ffff173f0c0071200300543f100071L8;FF5f00016b6bfcff548100010b5f0001", + "6b0afcff54011040f93fcc74f2c102005463a01191bf1040f20000805262786678423c7cd3e10100543fcc74f2a0010054BBL8;FF610d0094df0600b18000005480220291e1431691561200943f0700b1f90b40f9007fff5401c30391e24316916000805213110094f3fbff17e8031faa00011aabL8;FF04", + "3000945a03188be00319aae10318aa22008052ba031ef8f72f00941d0000141a0180d29bff48d31a00f0f2691f4092fb0309aaa1035df8615900b5ce020014L16;FFe87f0ea9ff230fa9e87f11a9ff2312a9e87f14a9ff2315a9e87f17a9080a8052ff7f01a9ff7f04a9ff7f07a9ff7f0aa9ff7f0da9ff7f", + "10a9ff7f13a9ff7f16a9BBBBBL8;FB3800000000000000470100000a0000007375636365737366756c6c79206465637279707465643b206d757374206861766520612072656d6f7465206964656e74L8;FF34940014080040f9e00301aa08014039e80000341f0500712101005421feff902174029142038", + "0522a94001421feff9021e00191a20480522694001421feff90BL8;FF080500911f0109eb482200545b010014e80300aa098d40f83f0500b140220054f30300aae00308aa20020094e80300aae00313aa090140b22911c0da291540d2L8;FFf60300aa031800942800805297000014fc170094c002805221", + "008052f517009420dd00b428fdffd008a50391e90300aa0001c03d08e140f8ec0741b2c2028052BBL8;FF41540194ff0302d1fd7b04a9f72b00f9f65706a9f44f07a9fd030191f50301aa298440a9f30300aaa85300d1f40302aae00309aadf530094b6c35e38df0a0071L8;FF22008052fc570094e89f40", + "f91f0500b160000054406302915fedff97f3d352a9940200b47522009104000014940600f1b5620091e0010054a1825ff881ffffb4L16;FFa906009114693538690a00f9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6680240f919631932bf0208eb61000054e00313aaf2d20094680640f9", + "BBBL8;FFe20313aae303162a84faff97f70300aa00f6ffb4be000014e00313aa4d860094f70301aac0f80736b90000145f2800f1880000542800028b08f1df38680ff837L8;FF22008052fc770094b30000b4e07b49f9e10313aa22008052f7770094e807409108810991006103918b0b0094f4bb49f99f0", + "600b1e0b2ff54f5c349f9f3bf49f9BL8;FF011040f921f8ffb4001440f922008052f44f42a9f65741a9fd7bc3a8f6f7001400200091f44f42a9f65741a9fd7bc3a81b0200141f0500b180000054f30300aaL8;FF610080d2030080d2040180d2ffff03a9e75300b9e65b00b9010000d4e1fcffd021601191", + "6001f83612000014e1834ca93f0000eb61fdff54e08f40f920fdffb5BBL8;FFe01b843d2001c03de11f843de8032179a8020090e0fb833d081140f91f0900f189040054e8633f91690200b029411f91e8bb0ef968008052e1074091e9bf0ef9L8;FF63401e91a4028052fe000014e04b05f9e0432a9121fd", + "ffd021203f910202805223fdffd063603d9104028052f500001448008052e0632a39e0432a91e8672a39L16;FF28008052e85f00f9fc7340f9ba0000b4e06f40f9e1031aaa22008052f6b70094fafe48d3b80000b4e00319aae10318aa22008052f0b70094f96740f93f0700b1BBBBL8;FB2068656164657", + "22073697a6500000000801740000000000056000000000000003f000000270000006d697373696e672073656e64657220636861696e00000000L8;FFfd03009138404079f30301aaf40300aaf7031faa190380522e0080520600001438c11f783be11f78f7060091ff4200f1a00c0054e852199b89c240f9", + "2afd44d3BL8;FF687a00f9755e01a9600604ad820344ad620205ad810341ad610202ad820342ad620203ad810340ad610201adff032e91f44f45a9f65744a9f85f43a9fa6742a9L8;FF68560054292d0c1b5f1900f1f6030daae1030eaaef0310aa000500540b1940396bc100517f25007128550054292d0", + "c1b5f1d00f1f6030daae1030eaaef0310aaBBL8;FFa9a35db8aae35d783f8300f1ac035f38e91b00b9a92f7ea9ea3b0079aa135df8ec430039eb0700f9210a0054eb0740f968260039e83b40796a1200f8ea1b40b9L8;FFe0430691e10244ade1830d91e8bb01f9a8e378a9fa9701b92183813c2083823ce", + "10245ade81700f9e80b40f9e9a319a9a80302d12183833c2083843c9ef5fe97L16;FFe85f00f9e86b44f9e8e300f9e86f44f9e9a30aa9e87344f9e80700f9e87744f9e83f00f9e88344f9e8f700f9810000b4e0031baa22008052efc70094b90000b4BBBL8;FFa100f8b6f9031faae00319aae10316aa356", + "40194fa0300aa960200b4f9670194e00316aa2100805239008052f1670194c0feffb4e1031aaae20316aaf70300aaL8;FF00c0359154640094c0fdff90002036914e640094c0fdff90008036914b640094ff0301d1fd7b03a9fdc30091080040f9090540f9490d00b40a0140f941018039BL8;FFb8ffff17", + "e80f41b2b2ffff17c80080d20800f0f208090091aeffff17ff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071L8;ZDBBL8;FFfacb00f90083823ce20242ad0183833c0083853ce10240ad0283843c0183803c0083813c40030094fc2740f99f1700f188fbff54ea43", + "0f91e8e3009129008052L8;FFe82700a9480dc0da690dc0dae82701a9880dc0daa90dc0dae82702a9c80dc0dae90dc0dae82703a9e80313aa1e240094f44f4ca9f94b40f9f6574ba9f85f4aa9L16;FFf91b40f9bb0d00b4e0031caae1031baa22008052f8a70094ab835ff8f3031f2afb031faaf60300f90", + "2000014f3031f2ab6577ea9e0c20191b8835df8e9b68dd2BBBBBBBL8;FB6372656174656420617420c00129001b737071722076312e73656e645f63742e726563762065706f636820c0243a20456b526563656976656443743153616d70L8;FF21008052e30315aae40316aaa86b3fa9299e0094e1034029", + "280340391f05007161fbff54e5ffff17f4031f2ae80740f9a80000b4e00b40f901f97fd342008052BL8;FF290040f9280800f90cfeffb43f0108ebb3611932000200542b0440f90afc78d37369283808050091280800f98af6ffb43f0108eb93611932e002005473692838L8;FFf85f47a9fa6746a9fd7b4", + "4a9ff830291c0035fd6f9ef41a9e00fc03df71740f9e003803d3aff48d3f6fcffb5eaffff1740fdff9000e03391481e0094ff4303d1BBL8;FFba035df8e90313aa480317cb7f0208eb89030054a0c300d1e10317aae20309aa2300805224008052f30309aa62edff97b7035ef8ba035df8f52b40b9f44f40", + "b9L8;FFadffff17e00313aa22008052eb000094610a40f9bcffff17e00313aae10317aae20315aae5000094770a40f9680240f9080117cbbf0208eb09f8ff54e00313aaBL8;FFc80d00b5e1031faac1f8ffb42a000014e20313aa230c80525de8ff97e10300aafaffff17e1031faa883e00f9f7ffff17c10", + "e0054e0031faa7fffff1721050054L8;ZDBBBL8;FB8e01000005000000650d400000000000110000000000000098010000050000002e626173652d6b657973626173652d6b6579730000000000650d400000000000L8;FFe1630091498fff97df0600b1e00a0054e11740f9e80f40f91f0101ebc03b0054e", + "81340f92a0400918022029149018052ea1700f90969213865f0ff97e1630091BL8;FFc2feff9042542c91e02700a9e3030091e00308aa39fe0094fd7b41a9ff830091c0035fd6ffc300d1fd7b02a9fd8300910800009008b13a9109600091e02300a9L8;ZFBBL8;FF281040b9000040f96800c8376800d03", + "7663e0114573e0114583e0114080040f9002540a9221140f940001fd6000040f997470014080040f9e20301aa00a140a9L8;FFe10313aae81f40f9c80000b4e02340f9e10308aa22008052f7410094e10313aae82b40f9c80000b4e02f40f9e10308aa22008052f0410094e10313aae10700f9L16;FFe787", + "00a9fe4b04a9eabb1da9f51306a9ef6f00f9f6f30aa9fb6700f9ec7b00f9fae300f9e36703a9081140f91f0900f1a92300548801009008411f9129038052BBBBL8;FB57000000000000000c010000170000007a1340000000000057000000000000000d010000170000007a1340000000000057000000000", + "000006801000011000000L8;FF093840f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8bBL8;FFe20319aafb0300aa02120194f4e340f9fa0316aaf40800b4f8df40f9f9110194e00314aa21008052", + "f2110194600b01b4e10318aae20314aaf60300aaf5110194L8;FF29c10e914a411d9100401d912081c03c2181c13ce9ef51f9e8ab0bf94081803c4181813ce9bf0bf985ebff9708008092880200f9e89340f9a80000b4e08b40f9BBL8;FF0e0000140040c23c0140c33c290040f90240c43c085440b96006", + "01ad3f0500b10040c03c0140c13c6212803d685200b9600600ad21010054f44f5ea9fcd340f9L8;FF092900a9096501a9a9435fb8156502a9175103a9176104a9166105a9096100b9fb0800b4a8035ef81f011ceb80080054560b40f9586340b9360500b4540740f9L16;FFfd7bc6a8cbd8ff17e00301aa1", + "90340f909a0c0a90a0c41a90078c03d0c5455a9e94700f90e584fa9e86b00f9092042a9ec7b00f9053056a9ee9f00f9047050a9BBBL8;FFe20317aa23008052240080526afdff97790a40f9680240f9080119cbff0208eba9ceff54e00313aae10319aae20317aa23008052240080525ffdff97790a40f9L", + "8;FFe043169122008052ec100094e1d342f9e00316aa32feff17e043169122008052e6100094e1d342f943feff17e0431691e1031aaae20318aae0100094fad342f9BL8;FF08050091280800f9eaf8ffb43f0108eb73611932600500549369283808050091280800f9e006f8b7e0030aaabfffff17e10300", + "a9e00301aae10309aa22008052L8;FFf35341a9fb7345a9f8feff171f4002f10130009119fc44d3a90300542007009125c59c5265eda072e4fcffb0027c0253842013914204402a43a311914208422aBBL8;FF610f0094fad342f9e8cb42f908011acb1f0308eb288c0054e8cf42f9e10319aae20318aa00", + "011a8bfa310194f90b40f94803188be8d302f9e89f49f9f4074091L8;FFb22cff9700060036b50000b4e00314aae10315aa22008052f7310094e0234ea9e16b40f9080d40f900013fd6e0e302f9e8074091f4074091e1e702f908011891L16;FF610e40f9810000b4601240f922008052f9b10094611a40f", + "9810000b4e00314aa22008052f4b10094612640f9810000b4602a40f922008052efb10094613240f9BBBBBL8;FB6e74000000000000560b40000000000075000000000000005c0000001c000000496e76616c69644c656e67746873657373696f6e00000000dc1a400000000000L8;FFf30300aaa20400b4", + "f80301aafd990094e00316aa21008052f6990094200800b4e10318aae20316aaf50300aaf68300a9f8990094f60f00f9940300b5c102148bBL8;FF4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd600ffffb000c026914916019400ffffb000c02e914616019400ffffb00080109143", + "160194L8;FFe86f42f93f0500b1e00715adea6301f9202800544083cb3c4183cc3c4283cd3cea6341f960838a3c4083ce3c61838b3c4183c73c60838d3c4083c83c6183863cBBL8;FF6107f8b6f7031faae00317aae10315aa3556019415008092814a40f93f0400b140020054810000b4804e40f9220080", + "52f1590194815640f9810000b4805a40f9L8;FF22008052e80303f9a8fdffb008012091e02f823de9ff02f9e90703f9e80b03f9d8e9ff97e15b44f9810000b4e05f44f922008052f0590094f259009420028052L16;FF3f0c0071400200543f100071c1000054e87b41b968fb0737fcbf00f9ff8301b9d8f", + "fff17a2c303d1630c805258e0ff97e10300aad8ffff17e1830591a2c303d1BBBL8;FF2200805223008052240080526a050094e10340a92aa040a9290040f91f1040f15369283808050091280800f903feff540b7c07533f0108eb6b61193200010054L8;FFc0feffb4f90b40f95f0700b1f8cb02f9e0cf02", + "f9ffd302f920130054e8031faa4901805209683f3808050091fa3b49f9e8d302f97a0300b4480340b20811c0daBL8;FFfef90094a00100b507000014540100b4fcf90094e00314aa01018052f5f90094c00000b508018052680600f9280080520400001400018052e8031faa600600f9L8;FFf2ffff17e88", + "30091090000b029b10091a8a73da9e8030091a1fcfff02134279100210091a2a300d1f7fcff9728008052e80300f91c000014e003152ae00c0094BBL8;FFb5820991ac5e0094f73349f94083c03ce83f49f9ff0a00b1e067803de8d300f901010054e067c03de8d340f909008092690200f96082803c680e", + "00f965040014L8;FF0081853c08018052e8c304f9e8832491e99304f9ea9704f9a002813ca082823cf8b704f9f9e304f9f91705f9f92f05f9f8cf04f9bf7e07a9f8db04f9ffdf04f9L16;FFe20713adec2b4ba9e8f200f868008052e0a3803d4d0100149afdff175f030014290100b4f50300aae0031aaaf", + "40301aae10309aa22008052efb90094e00315aaBBBBL8;FB42e649f654c65fd66ea665b6788673961a6611760c46075636263d3620062b16f9f6f2e6efd6e4c6d5b6dea6c396c886a176aa66b756bc468d3686269b169006L8;FF09008092090100f944000014f40300aae81700f9fb89009400208052010", + "18052f4890094c03a00b489c240f9f5031faafa031f2afb031faa0802805298a20091BL8;FF7622009104000014940600f1d662009160010054c1825ff881ffffb4c00240f922008052f4090194f8ffff17e057c13de15bc13de87345b9cfffff17e89340f9L8;FFe00316aaea0f00f909692138e1230091", + "a0e5ff97f80f40f9e80740f9080118cbdf0208ebe80c0054e80b40f9e10317aae20316aa0001188bf60900940803168bBBL8;FF68a612a9689e00f9e82b40b9781601b9684201b9e83f40b9745201b9685601b9e81b40f9755a07a9752206a9795a08a9f44f5ca9f6575ba9f85f5aa9fa6759a9L8;FFff03", + "0291c0035fd6ff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9L16;FFeb3b42f9eaa310a9e84342f9ea4f42f9e8b700f9e84742f9eba318a9e84b42f9eb5342f9e8eb00f9e85742f9e88f00f9e85b42f9e82f14", + "a9e86342f9eb5f42f9BBBL8;FF006a01940004805221008052f9690194c02300b4e00745adf60300aa1f0317eb000400ad82250054080d80521353089b94070011612640f93f0400f18b000054L8;FF22008052fc69009461e640f9810000b460ea40f922008052f769009460220091f4feff9760a20791f", + "30b40f9fd7bc2a887feff176042069151000094e00313aaBL8;FFe10340f986ffff17ff0302d1fd7b03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf40301aaaaf6ff97L8;ZFBBL8;FF017d099bfc290194e17740f9210100b4e07b40f92200805", + "2f729019405000014e00640ade20ac03d620a803d600600adff031691f44f45a9f65744a9f85f43a9L8;FFe00b11ade00742ad281300f8289300f8281301f8e8cf00f9e0070dad2801005420030191e10315aae20314aaf929009488021a32e8ff0739081d40922d000014L16;FF010840a988008052f303", + "00aae0230091440080528500805229f87fd33f1100f13481889ae30314aa5a000094e80740f91f0500f1e0000054e80b40f9742200a9BBBBBBL8;FB436861696e4b65797265717569726564000000000000000020000000000000006f766572666c6f77617574685f6b6579626173655f6b6579736573736", + "96f6e73L8;FFf9031faa4800805213038052e00700f9ff7f03a9ff7f06a9ff7f09a9ff7f0ca9ff7f0fa9ff7f12a9ff7f15a9ff7f18a9ff2302a9e87f04a9ff2305a9e87f07a9BL8;FF0001188b031e01940803168b680a00f9540300b4610a40f9680240f9b51240f91f0101ebc0070054680640f9490380", + "522a040091e00314aa6a0a00f909692138L8;FFf50f4ba9a08301d101a30091e20315aa320f0094b6035af8df0a00b1a1020054b60b7ba9a1835af8420700b4e10700f9a08301d1e10316aa05110094b7035af8BBL8;FFf6e740a9b9f9ffb5e90319aba3fbff5480ffff9000c03b914c5a019428008052ff", + "0600b1ffc300f9ff2317a9a10c0054d90700b42807198bf4c340f9da420091L8;FFfafb02f9e87300b409038052fb031faab7fdffd0f72a13911471099bf8032d913600805210000014e8f342f909068052e02bc33d6822099b690600910001803dL16;FFe00313aae10318aae20316aa230080522400805", + "2a9010094780a40f9680240f9080118cbdf0208ebe9f6ff54e00313aae10318aae20316aa2300805224008052BBBL8;ZBL8;FFe04fc23de8a344f909008092690200f96082803c680e00f9ff0600f1eb730054e01f40f9e10317aa22008052f27d00949a030014f6df44f9e043169101230091BL8;FFe003", + "08aae10314aae30313aaf44f43a9f65742a9f85f41a9fd7bc4a850feff17560014cbd50213ab82050054a9fe4ad30a0880522911c0da490109cbea008052L8;ZFBBL8;FFc00640ad48fc46d3e9c3029157e07a925414409220010191e20308aaffbf0339e08707adf50301aae88b00f9313a0194e0c30291", + "a102178be20314aaf4bf0339L8;FF00013fd6fadf49a9fb6340f9f55b40f9607e02f9618202f9290c40f9e8830f91e1031baa20013fd6fcf341f99f0b00b1a100005468008052fa6740f9e8020039L16;FFe1a3803ded6f40f9e86300f9c8008052e0cf803de43f43a9e0cb44a9e37b42a94a0500141f050", + "0b1003200546083c43c6183c53ce0831d916283c63ce8bb02f9BBBBL8;FBdb6453cfe88200000000ffcec917000000000000000000000000bbda11b800000000000000000000000000000000000000000000000000000000df35da5e0000L8;FFd6060091df9600f180170054fd8d0094000980524100805", + "2f68d0094005d00b4a00641adca0600d1e94b41f9a82240f9000401ada10240ad5f0109eb082000f9BL8;FF36140094e80300aae0833291e1feffd021e01291a2018052e3feffd06314139144018052e85306f911000014c80080d2e0a33239e08332910800f0f2ffa73239L8;FFe00316aae10313aa370a", + "0094f40301aaf50300aafb0d0094e00313aa2100805236008052f30d0094c0feffb40801805208000039f40000b4f60300aa00040091BBL8;FF60ffffb000802c91534a019460ffffb000e02c91504a019460ffffb000402d914d4a019460ffffb000a02d91474a0194ffc305d1fd7b11a9fc6f12a9fa671", + "3a9L8;FF524a0094f3031faa088c45f81f0500b181ebff54e8031faa080113abe302005480fdfff000200391484a0094f3031faa088c48f81f0500b121efff54e8031faaL16;FFe80300aa40fefff000b40a91e7af02a9e9e700f9f7eb10a9e8bf00f9ee2b04a9fc4712a9f21314a9ecd705a9f5031eaaef", + "8f00f9e61300f9f46300f9f03b00f9BBBL8;FFa8ffffb008010e91090480524f000014a8ffff9008313891890280524b000014a8935cb88a5e40f9a9c35cb8b8af7da9b9035df85f8100f1a88317b8a8835e38L8;FFa20302d1240101910304805205028052366a0094e8eb41f91f0500b1e01b0054e002c", + "03de8f341f9e9030b91e17740f92015803de89301f9a10000b4e07b40f9BL8;FF230200143f0900b180170054880080d20800f0f2081900913f0108ebed160054e10314aae20313aa5e030094f50300aa170200143f0900b1401f0054e80741b2L8;FF7f0200eb330100b4c000005421400091fbffff1700", + "0000f013285d3906000014330440f9040000140bf7ff9741008052010000b9e00313aaf30b40f9fd7bc2a8BBL8;FFe043169122008052b4110094e1d342f9a3fbff17e043169122008052af110094e1d342f9bbfbff17e043169122008052aa110094e1d342f911fcff17e0431691L8;FF2183c03ce90f4b", + "f9a84301d1ea0756b9eb134bf92083c33c0141803ce0675139094101f868fd60d3e9174bf9aa031bb8ea1b4bf9c042833cabc31cb8e82309b9L16;FFe8431291e12302910232805200e1019100ae00948082c43c8182c53ce0230b918282c63c883e40f9e1431291e037813d8082c03c02398052e13b813d", + "8182c13cBBBBBL8;FB083d4000000000001a3d400000000000b81f4000000000002d3d4000000000000700000000000000060000000000000000000000000000000000000000000000L8;FF6b01084aaaf31638aa2357382901084aab031738ab335738a9131738a94357384a01084a6b01084aaa231738a", + "a5357382901084aab331738ab635738a9431738BL8;FF0800098b080500911f0109eb89040054140114ab230100541e000014f4031faae00313aa080c48f81f0500b1c1fdff54f40314abe2020054688e4bf81f0500b1L8;FF0181319103160094fe15009400c4805221008052f7150094209e00b4e10b40", + "9102c48052fa0300aa21c00e91f9150094f4150094008c815221008052ed150094BBL8;FFe0031aaa4906805209693938aa031cf8e6dbff97b9035cf8a8035bf8080119cb5f0308eba82000541a0100b4a8835bf8e1031caae2031aaa0001198bf5550194L8;FF1ba30191f54301f9f5031691e7e7fe97e8", + "c342f91f0500b1601300548043c03df6e32291f76301912183c93ceaa209912283cb3cc082893c2083ca3ce9db42f9L16;FFf1f9ff97e8432d91e9b745f90081c03ce8ab45f9e9c301f91f0500b1e0df803da0210054e0dfc23de9d345f9ea030b91e1e3c23de2e7c23de0630c914081873cBBBL8;FF0001", + "178b03760194e802158b680a00f9882240f9a82000b4090d8052941e40f9590480521851099b5b0380525c0280521a0180520b000014680640f9e10316aaL8;FF48190054da000014f6074091d6820991c0220291ab250094080040b20811c0da081540d2080d088b0825019108fd46d30900088b2005009", + "11f0008eb89190054BL8;FF612640f9810000b4602a40f922008052f9f50094613240f9c10000b4603640f922008052f30b40f9fd7bc2a8f2f50014f30b40f9fd7bc2a8c0035fd6fd7bbea9L8;FFc028537aadfdff548318003502290091807862f81f0013eb41f7ff54bf00001400290091340000b08102", + "0e917f0204eb207860f880fcff54620240f981020e91BBL8;FFfa3349f9e0ef843de08fc13d5f0700b1e1eb843de18bc13de0e3843de087c13de2e7843de283c13de0db843de07fc13de1df843de17bc13de0d3843de077c13dL8;FFa8000090e05a803d081140f9fb6b4ca91f0d00f143070054e8432a91", + "e0c3249115d0fe97e84b45f91f0500b1003f0054e85345f9e9b30e91e002c03de95303f9L16;FFe10316aa22008052fbb50094e05f40f99c0000b4e1031caa22008052f6b50094e05b40f99a0000b4e1031aaa22008052f1b50094e0874da9610000b422008052BBBBL8;FB7f000000050000001d1c40000", + "000000054000000000000008d0000001400000042024000000000006a00000000000000120100002e0000004202400000000000L8;FFbc0e48f89f0f00b161000054e8031faa0d000014e00315aa8af1ff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebBL8;", + "FFfbc342f97f0f00b1e1000054c800805223ffff17e8e322910081cd3ce8d344f97effff17f63f42f92083c13ceae32291e9d742f9f5c742f9f7cb42f9c80240f9L8;FF340200b4b982009104000014940600f139c300918001005421035ef8810000b420835ef822008052f305009421835ff8e1feffb42", + "00340f922008052ee050094BBL8;FFe13300f937000014e08744a91f090071a1010054ea6340f9291d009148dd78920b000014e08744a908008092686a00a90c000014eae74239e8031faa29190091L8;FFfd4500947f660539f44f42a9f50b40f9fd7bc3a8c0035fd6735256a9880240f9680000b4e0031", + "3aa00013fd6810640f9c1feffb4820a40f9e00313aaf44f42a9L16;FFea9745f9e92313a9e89f45f9e9a745f9e8ab01a9e8ab45f9eaa345f9e8a704a9e8af45f9e9b345f9e80b00f9e8b745f9e84300f9e8bf45f9e8a706a9e9c345f9BBBL8;FF010480523862019482fffff042401891e0031faae10315a", + "a51620194fd7bbda9f50b00f9f44f02a9fd030091089440f9f40302aaf30300aaf50301aa1f0500f1L8;FF892200f90c000014e003082ae20313aa630c8052f1f5ff9780f6ffb4a9ffff17e003082ae10314aae20313aa1ffdff97601a00b5a0f5ffb4a2ffff17898244f8BL8;FF3f08007161fdff548802", + "40f91f0500b1810000549f6200a99f7e01a9987e02a9e10314aae20313aa4af5ff97000100b454000014400800b5e00313aaaaf2ff97L8;ZDBBL8;FF607640f901f97fd342008052fa250194687e40f9a80000b4608240f901f97fd342008052f4250194688a40f9a80000b4608e40f901f97fd342008052", + "ee250194L8;FFfd250014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4600640f922008052f1250094610e40f9810000b4601240f9L16;FF297dca9b8a048052292d0a9b5f0009eb62070054c10a44a9e0230091e30315aa89fcff97f7a500940004805221008", + "052f0a50094a01000b4e0c3c03ce1c3c13c" ] end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseLines9 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseScalarsHooks.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseScalarsHooks.lean index baa4e9704..08c90fb77 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseScalarsHooks.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/BaseScalarsHooks.lean @@ -31,9 +31,9 @@ open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseData (baseHooks) set_option maxRecDepth 4000000 in set_option maxHeartbeats 1600000 in theorem base_scalars : extractElfScalarsAndOkPlaced mutantMpl mutantMmpl mutantCliElfImage = some ( - 0x49c010#64, 0x3ff040#64, 11, 0x4a4000#64, -- layout-bypass: concrete-mutant-trace-checkpoint - 0x49a038#64, 0x49a040#64, 0x49e418#64, 0x49e419#64, -- layout-bypass: concrete-mutant-trace-checkpoint - 0x49e4fc#64, 0x49e4fd#64, 0x49e4f8#64, 0x49e4f9#64) := by rfl_kernel -- layout-bypass: concrete-mutant-trace-checkpoint + 0x46a000#64, 0x400040#64, 7, 0x471000#64, -- layout-bypass: concrete-mutant-trace-checkpoint + 0x46f000#64, 0x46f008#64, 0x46bbfc#64, 0x46bbfd#64, -- layout-bypass: concrete-mutant-trace-checkpoint + 0x46bce0#64, 0x46bce1#64, 0x46bcdc#64, 0x46bcdd#64) := by rfl_kernel -- layout-bypass: concrete-mutant-trace-checkpoint set_option maxRecDepth 4000000 in set_option maxHeartbeats 1600000 in diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/Call0.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/Call0.lean index 4bf6a3647..046948020 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/Call0.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/Call0.lean @@ -18,40 +18,27 @@ public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseFull public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Files public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C0 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q1q0L -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q1q0R -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q1q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C3 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C4 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C5 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C6 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q0 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q0q3q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q0q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q0q3q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q0q3q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q3q1q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q3q1q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q3q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q3q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q3q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q3 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C8 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C9 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C10 @@ -65,42 +52,42 @@ public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C17 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C18 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C19 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q2q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q2q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q2q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q2q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q1q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q1q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q1q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q1q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q1q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q1q3q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q3 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C21 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C22 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C23 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C24 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C25 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q3q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q3q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q3q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q3q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q3q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q3q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q2q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q2q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q2q2q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q2q2q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q2q2q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q2q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q3 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C27 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C28 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C29 @@ -156,22 +143,7 @@ public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C78 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C79 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C80 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C81 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q2q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q2q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q2q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q2q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C83 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C84 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C85 @@ -187,29 +159,12 @@ public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C94 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C95 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C96 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C97 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q1q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q1q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q1q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q1q1q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q1q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C99q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C99q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C99q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C99q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C99 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C100 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C101 -/-! Chained `192`-chunk `cliRunPlacedSig` proof (`ssRun0`) for `Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0`. -/ +/-! Chained `147`-chunk `cliRunPlacedSig` proof (`ssRun0`) for `Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0`. -/ @[expose] public section @@ -231,40 +186,27 @@ open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.BaseFull (ssSpec) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Files (ssFiles0 hbInp0_eq) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C0 (c0) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C1 (c1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q0 (c2q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q1 (c2q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q2 (c2q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q0 (c2q3q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q1 (c2q3q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q0 (c2q3q2q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q1q0L (c2q3q2q1q0L) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q1q0R (c2q3q2q1q0R) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q1q1 (c2q3q2q1q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q1q2 (c2q3q2q1q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q1q3 (c2q3q2q1q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q2 (c2q3q2q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q2q3 (c2q3q2q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2q3q3 (c2q3q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C2 (c2) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C3 (c3) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C4 (c4) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C5 (c5) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C6 (c6) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q0 (c7q0) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q1 (c7q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q0q0 (c7q2q0q0q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q0q1 (c7q2q0q0q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q0q2 (c7q2q0q0q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q0q3q0 (c7q2q0q0q3q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q0q3q1 (c7q2q0q0q3q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q0q3q2 (c7q2q0q0q3q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q0q3q3 (c7q2q0q0q3q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q1 (c7q2q0q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q2 (c7q2q0q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q0q3 (c7q2q0q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q1 (c7q2q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q2 (c7q2q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2q3 (c7q2q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3 (c7q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q2 (c7q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q0 (c7q3q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q1 (c7q3q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q0 (c7q3q2q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q1 (c7q3q2q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q2 (c7q3q2q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q3q0 (c7q3q2q3q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q3q1q0 (c7q3q2q3q1q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q3q1q1 (c7q3q2q3q1q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q3q1q2 (c7q3q2q3q1q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q3q1q3 (c7q3q2q3q1q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q3q2 (c7q3q2q3q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q2q3q3 (c7q3q2q3q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C7q3q3 (c7q3q3) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C8 (c8) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C9 (c9) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C10 (c10) @@ -278,42 +220,42 @@ open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C17 (c17) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C18 (c18) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C19 (c19) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q0 (c20q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q0 (c20q1q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q1 (c20q1q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q0 (c20q1q2q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q1 (c20q1q2q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q2q0q0 (c20q1q2q2q0q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q2q0q1 (c20q1q2q2q0q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q2q0q2 (c20q1q2q2q0q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q2q0q3 (c20q1q2q2q0q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q2q1 (c20q1q2q2q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q2q2 (c20q1q2q2q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q2q3 (c20q1q2q2q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q2q3 (c20q1q2q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1q3 (c20q1q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q1 (c20q1) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q2 (c20q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3 (c20q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q0 (c20q3q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q1 (c20q3q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q0 (c20q3q2q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q1q0 (c20q3q2q1q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q1q1 (c20q3q2q1q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q1q2 (c20q3q2q1q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q1q3q0 (c20q3q2q1q3q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q1q3q1 (c20q3q2q1q3q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q1q3q2 (c20q3q2q1q3q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q1q3q3 (c20q3q2q1q3q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q2 (c20q3q2q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q2q3 (c20q3q2q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C20q3q3 (c20q3q3) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C21 (c21) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C22 (c22) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C23 (c23) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C24 (c24) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C25 (c25) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q0 (c26q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q0 (c26q1q0q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q1 (c26q1q0q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q2 (c26q1q0q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q3q0 (c26q1q0q3q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q3q1 (c26q1q0q3q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q3q2q0 (c26q1q0q3q2q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q3q2q1 (c26q1q0q3q2q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q3q2q2 (c26q1q0q3q2q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q3q2q3 (c26q1q0q3q2q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q0q3q3 (c26q1q0q3q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q1 (c26q1q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q2 (c26q1q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1q3 (c26q1q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q1 (c26q1) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q2 (c26q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3 (c26q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q0 (c26q3q0q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q1 (c26q3q0q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q2q0 (c26q3q0q2q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q2q1 (c26q3q0q2q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q2q2q0 (c26q3q0q2q2q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q2q2q1 (c26q3q0q2q2q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q2q2q2 (c26q3q0q2q2q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q2q2q3 (c26q3q0q2q2q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q2q3 (c26q3q0q2q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q0q3 (c26q3q0q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q1 (c26q3q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q2 (c26q3q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C26q3q3 (c26q3q3) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C27 (c27) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C28 (c28) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C29 (c29) @@ -369,22 +311,7 @@ open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C78 (c78) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C79 (c79) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C80 (c80) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C81 (c81) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q0 (c82q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q1 (c82q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q2 (c82q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q0 (c82q3q0q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q1 (c82q3q0q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q2q0q0 (c82q3q0q2q0q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q2q0q1 (c82q3q0q2q0q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q2q0q2 (c82q3q0q2q0q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q2q0q3 (c82q3q0q2q0q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q2q1 (c82q3q0q2q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q2q2 (c82q3q0q2q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q2q3 (c82q3q0q2q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q0q3 (c82q3q0q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q1 (c82q3q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q2 (c82q3q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82q3q3 (c82q3q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C82 (c82) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C83 (c83) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C84 (c84) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C85 (c85) @@ -400,27 +327,10 @@ open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C94 (c94) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C95 (c95) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C96 (c96) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C97 (c97) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q0 (c98q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q1 (c98q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q0 (c98q2q0q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q1q0 (c98q2q0q1q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q1q1q0 (c98q2q0q1q1q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q1q1q1 (c98q2q0q1q1q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q1q1q2 (c98q2q0q1q1q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q1q1q3 (c98q2q0q1q1q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q1q2 (c98q2q0q1q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q1q3 (c98q2q0q1q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q2 (c98q2q0q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q0q3 (c98q2q0q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q1 (c98q2q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q2 (c98q2q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q2q3 (c98q2q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98q3 (c98q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C99q0 (c99q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C99q1 (c99q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C99q2 (c99q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C99q3 (c99q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C98 (c98) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C99 (c99) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C100 (c100) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0.C101 (c101) theorem ssRun0 {mpl mmpl : MultiPlacement} {elf : ElfImage} (hv : ElfFullValidPlaced mpl mmpl elf ssSpec) : @@ -429,6 +339,6 @@ theorem ssRun0 {mpl mmpl : MultiPlacement} {elf : ElfImage} cliRunPlacedSig_of_elfFinalChunk hv (fun name => congrArg (cliExternsPlacedSig mmpl · name) compHooks0_placed_eq) hbInp0_eq rfl - (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2q0).step c2q1).step c2q2).step c2q3q0).step c2q3q1).step c2q3q2q0).step c2q3q2q1q0L).step c2q3q2q1q0R).step c2q3q2q1q1).step c2q3q2q1q2).step c2q3q2q1q3).step c2q3q2q2).step c2q3q2q3).step c2q3q3).step c3).step c4).step c5).step c6).step c7q0).step c7q1).step c7q2q0q0q0).step c7q2q0q0q1).step c7q2q0q0q2).step c7q2q0q0q3q0).step c7q2q0q0q3q1).step c7q2q0q0q3q2).step c7q2q0q0q3q3).step c7q2q0q1).step c7q2q0q2).step c7q2q0q3).step c7q2q1).step c7q2q2).step c7q2q3).step c7q3).step c8).step c9).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17).step c18).step c19).step c20q0).step c20q1q0).step c20q1q1).step c20q1q2q0).step c20q1q2q1).step c20q1q2q2q0q0).step c20q1q2q2q0q1).step c20q1q2q2q0q2).step c20q1q2q2q0q3).step c20q1q2q2q1).step c20q1q2q2q2).step c20q1q2q2q3).step c20q1q2q3).step c20q1q3).step c20q2).step c20q3).step c21).step c22).step c23).step c24).step c25).step c26q0).step c26q1q0q0).step c26q1q0q1).step c26q1q0q2).step c26q1q0q3q0).step c26q1q0q3q1).step c26q1q0q3q2q0).step c26q1q0q3q2q1).step c26q1q0q3q2q2).step c26q1q0q3q2q3).step c26q1q0q3q3).step c26q1q1).step c26q1q2).step c26q1q3).step c26q2).step c26q3).step c27).step c28).step c29).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66).step c67).step c68).step c69).step c70).step c71).step c72).step c73).step c74).step c75).step c76).step c77).step c78).step c79).step c80).step c81).step c82q0).step c82q1).step c82q2).step c82q3q0q0).step c82q3q0q1).step c82q3q0q2q0q0).step c82q3q0q2q0q1).step c82q3q0q2q0q2).step c82q3q0q2q0q3).step c82q3q0q2q1).step c82q3q0q2q2).step c82q3q0q2q3).step c82q3q0q3).step c82q3q1).step c82q3q2).step c82q3q3).step c83).step c84).step c85).step c86).step c87).step c88).step c89).step c90).step c91).step c92).step c93).step c94).step c95).step c96).step c97).step c98q0).step c98q1).step c98q2q0q0).step c98q2q0q1q0).step c98q2q0q1q1q0).step c98q2q0q1q1q1).step c98q2q0q1q1q2).step c98q2q0q1q1q3).step c98q2q0q1q2).step c98q2q0q1q3).step c98q2q0q2).step c98q2q0q3).step c98q2q1).step c98q2q2).step c98q2q3).step c98q3).step c99q0).step c99q1).step c99q2).step c99q3) c100 + ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4).step c5).step c6).step c7q0).step c7q1).step c7q2).step c7q3q0).step c7q3q1).step c7q3q2q0).step c7q3q2q1).step c7q3q2q2).step c7q3q2q3q0).step c7q3q2q3q1q0).step c7q3q2q3q1q1).step c7q3q2q3q1q2).step c7q3q2q3q1q3).step c7q3q2q3q2).step c7q3q2q3q3).step c7q3q3).step c8).step c9).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17).step c18).step c19).step c20q0).step c20q1).step c20q2).step c20q3q0).step c20q3q1).step c20q3q2q0).step c20q3q2q1q0).step c20q3q2q1q1).step c20q3q2q1q2).step c20q3q2q1q3q0).step c20q3q2q1q3q1).step c20q3q2q1q3q2).step c20q3q2q1q3q3).step c20q3q2q2).step c20q3q2q3).step c20q3q3).step c21).step c22).step c23).step c24).step c25).step c26q0).step c26q1).step c26q2).step c26q3q0q0).step c26q3q0q1).step c26q3q0q2q0).step c26q3q0q2q1).step c26q3q0q2q2q0).step c26q3q0q2q2q1).step c26q3q0q2q2q2).step c26q3q0q2q2q3).step c26q3q0q2q3).step c26q3q0q3).step c26q3q1).step c26q3q2).step c26q3q3).step c27).step c28).step c29).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66).step c67).step c68).step c69).step c70).step c71).step c72).step c73).step c74).step c75).step c76).step c77).step c78).step c79).step c80).step c81).step c82).step c83).step c84).step c85).step c86).step c87).step c88).step c89).step c90).step c91).step c92).step c93).step c94).step c95).step c96).step c97).step c98).step c99).step c100) c101 end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call0 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/Call1.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/Call1.lean index 48980056c..7fe819029 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/Call1.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/Call1.lean @@ -23,19 +23,19 @@ public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C3 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q0 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q1 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q3q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q3q2L -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q3q2R -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q3q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q3q1L +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q3q1R +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q3q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q3 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q3 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C5 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C6 @@ -72,14 +72,11 @@ public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C33 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C34 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C35 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C36 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C38 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C38q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C38q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C38q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C38q3 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C39 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C40 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C41 @@ -107,13 +104,10 @@ public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C62 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C63 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C64 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C65 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C66q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C66q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C66q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C66q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C67 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C66s0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C66s1 -/-! Chained `96`-chunk `cliRunPlacedSig` proof (`ssRun1`) for `Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1`. -/ +/-! Chained `90`-chunk `cliRunPlacedSig` proof (`ssRun1`) for `Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1`. -/ @[expose] public section @@ -140,19 +134,19 @@ open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C3 (c3) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q0 (c4q0) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q1 (c4q1) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q0 (c4q2q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q0 (c4q2q1q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q1 (c4q2q1q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q0 (c4q2q1q2q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q1 (c4q2q1q2q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q2 (c4q2q1q2q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q3q0 (c4q2q1q2q3q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q3q1 (c4q2q1q2q3q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q3q2L (c4q2q1q2q3q2L) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q3q2R (c4q2q1q2q3q2R) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q2q3q3 (c4q2q1q2q3q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1q3 (c4q2q1q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q1 (c4q2q1) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q2 (c4q2q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3 (c4q2q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q0 (c4q2q3q0q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q1 (c4q2q3q0q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q2 (c4q2q3q0q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q3q0 (c4q2q3q0q3q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q3q1L (c4q2q3q0q3q1L) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q3q1R (c4q2q3q0q3q1R) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q3q2 (c4q2q3q0q3q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q0q3q3 (c4q2q3q0q3q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q1 (c4q2q3q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q2 (c4q2q3q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q2q3q3 (c4q2q3q3) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C4q3 (c4q3) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C5 (c5) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C6 (c6) @@ -189,14 +183,11 @@ open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C33 (c33) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C34 (c34) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C35 (c35) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C36 (c36) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37q0 (c37q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37q1 (c37q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37q2q0 (c37q2q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37q2q1 (c37q2q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37q2q2 (c37q2q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37q2q3 (c37q2q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37q3 (c37q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C38 (c38) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C37 (c37) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C38q0 (c38q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C38q1 (c38q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C38q2 (c38q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C38q3 (c38q3) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C39 (c39) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C40 (c40) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C41 (c41) @@ -224,11 +215,8 @@ open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C62 (c62) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C63 (c63) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C64 (c64) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C65 (c65) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C66q0 (c66q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C66q1 (c66q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C66q2 (c66q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C66q3 (c66q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C67 (c67) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C66s0 (c66s0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1.C66s1 (c66s1) theorem ssRun1 {mpl mmpl : MultiPlacement} {elf : ElfImage} (hv : ElfFullValidPlaced mpl mmpl elf ssSpec) : @@ -237,6 +225,6 @@ theorem ssRun1 {mpl mmpl : MultiPlacement} {elf : ElfImage} cliRunPlacedSig_of_elfFinalChunk hv (fun name => congrArg (cliExternsPlacedSig mmpl · name) compHooks0_placed_eq) hbInp1_eq ssC1Out_eq - (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4q0).step c4q1).step c4q2q0).step c4q2q1q0).step c4q2q1q1).step c4q2q1q2q0).step c4q2q1q2q1).step c4q2q1q2q2).step c4q2q1q2q3q0).step c4q2q1q2q3q1).step c4q2q1q2q3q2L).step c4q2q1q2q3q2R).step c4q2q1q2q3q3).step c4q2q1q3).step c4q2q2).step c4q2q3).step c4q3).step c5).step c6).step c7).step c8).step c9).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17).step c18).step c19q0).step c19q1).step c19q2).step c19q3).step c20).step c21).step c22).step c23).step c24).step c25).step c26).step c27).step c28).step c29).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37q0).step c37q1).step c37q2q0).step c37q2q1).step c37q2q2).step c37q2q3).step c37q3).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66q0).step c66q1).step c66q2).step c66q3) c67 + (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4q0).step c4q1).step c4q2q0).step c4q2q1).step c4q2q2).step c4q2q3q0q0).step c4q2q3q0q1).step c4q2q3q0q2).step c4q2q3q0q3q0).step c4q2q3q0q3q1L).step c4q2q3q0q3q1R).step c4q2q3q0q3q2).step c4q2q3q0q3q3).step c4q2q3q1).step c4q2q3q2).step c4q2q3q3).step c4q3).step c5).step c6).step c7).step c8).step c9).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17).step c18).step c19q0).step c19q1).step c19q2).step c19q3).step c20).step c21).step c22).step c23).step c24).step c25).step c26).step c27).step c28).step c29).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38q0).step c38q1).step c38q2).step c38q3).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66s0) c66s1 end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call1 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/Call2.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/Call2.lean index 7a60a33d9..5db877d60 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/Call2.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/Call2.lean @@ -23,19 +23,19 @@ public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C3 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q0 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q1 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q0q0L -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q0q0R -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q3q3L +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q3q3R +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q3 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q3 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C5 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C6 @@ -58,41 +58,41 @@ public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C22 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C23 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C24 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q0q3L -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q0q3R -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q3q3L +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q3q3R +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q3 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C26 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C27 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C28 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q0q3L +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q0q3R +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q1 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q2 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q3 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q3q0 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q3q2L -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q3q2R -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q3q3 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q3 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C30 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C31 @@ -164,9 +164,8 @@ public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C96 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C97 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C98 public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C99 -public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C100 -/-! Chained `149`-chunk `cliRunPlacedSig` proof (`hbRun2`) for `Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2`. -/ +/-! Chained `148`-chunk `cliRunPlacedSig` proof (`hbRun2`) for `Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2`. -/ @[expose] public section @@ -193,19 +192,19 @@ open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C3 (c3) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q0 (c4q0) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q1 (c4q1) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q0 (c4q2q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q0 (c4q2q1q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q1 (c4q2q1q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q2 (c4q2q1q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q0q0L (c4q2q1q3q0q0L) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q0q0R (c4q2q1q3q0q0R) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q0q1 (c4q2q1q3q0q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q0q2 (c4q2q1q3q0q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q0q3 (c4q2q1q3q0q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q1 (c4q2q1q3q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q2 (c4q2q1q3q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1q3q3 (c4q2q1q3q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q1 (c4q2q1) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q2 (c4q2q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3 (c4q2q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q0 (c4q2q3q0q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q1 (c4q2q3q0q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q2 (c4q2q3q0q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q3q0 (c4q2q3q0q3q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q3q1 (c4q2q3q0q3q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q3q2 (c4q2q3q0q3q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q3q3L (c4q2q3q0q3q3L) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q0q3q3R (c4q2q3q0q3q3R) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q1 (c4q2q3q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q2 (c4q2q3q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q2q3q3 (c4q2q3q3) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C4q3 (c4q3) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C5 (c5) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C6 (c6) @@ -228,41 +227,41 @@ open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C22 (c22) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C23 (c23) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C24 (c24) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q0 (c25q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1 (c25q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q0 (c25q2q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q1 (c25q2q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q0 (c25q2q2q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q0q0 (c25q2q2q1q0q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q0q1 (c25q2q2q1q0q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q0q2 (c25q2q2q1q0q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q0q3L (c25q2q2q1q0q3L) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q0q3R (c25q2q2q1q0q3R) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q1 (c25q2q2q1q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q2 (c25q2q2q1q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q1q3 (c25q2q2q1q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q2 (c25q2q2q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q2q3 (c25q2q2q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2q3 (c25q2q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q0 (c25q1q0q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q1 (c25q1q0q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q2 (c25q1q0q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q0 (c25q1q0q3q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q1 (c25q1q0q3q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q2 (c25q1q0q3q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q3q0 (c25q1q0q3q3q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q3q1 (c25q1q0q3q3q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q3q2 (c25q1q0q3q3q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q3q3L (c25q1q0q3q3q3L) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q0q3q3q3R (c25q1q0q3q3q3R) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q1 (c25q1q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q2 (c25q1q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q1q3 (c25q1q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q2 (c25q2) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C25q3 (c25q3) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C26 (c26) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C27 (c27) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C28 (c28) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0 (c29q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q0 (c29q0q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q1 (c29q0q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q2 (c29q0q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q0 (c29q0q3q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q1 (c29q0q3q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q0q0 (c29q0q3q2q0q0) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q0q1 (c29q0q3q2q0q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q0q2 (c29q0q3q2q0q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q0q3L (c29q0q3q2q0q3L) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q0q3R (c29q0q3q2q0q3R) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q1 (c29q0q3q2q1) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q2 (c29q0q3q2q2) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q2q3 (c29q0q3q2q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q0q3q3 (c29q0q3q3) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q1 (c29q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q0 (c29q2q0q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q1 (c29q2q0q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q2 (c29q2q0q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q0 (c29q2q0q3q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q1 (c29q2q0q3q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q2 (c29q2q0q3q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q3q0 (c29q2q0q3q3q0) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q3q1 (c29q2q0q3q3q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q3q2L (c29q2q0q3q3q2L) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q3q2R (c29q2q0q3q3q2R) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q0q3q3q3 (c29q2q0q3q3q3) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q1 (c29q2q1) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q2 (c29q2q2) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2q3 (c29q2q3) +open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q2 (c29q2) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C29q3 (c29q3) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C30 (c30) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C31 (c31) @@ -334,7 +333,6 @@ open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C96 (c96) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C97 (c97) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C98 (c98) open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C99 (c99) -open Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2.C100 (c100) theorem hbRun2 {mpl mmpl : MultiPlacement} {elf : ElfImage} (hv : ElfFullValidPlaced mpl mmpl elf ssSpec) : @@ -343,6 +341,6 @@ theorem hbRun2 {mpl mmpl : MultiPlacement} {elf : ElfImage} cliRunPlacedSig_of_elfFinalChunk hv (fun name => congrArg (cliExternsPlacedSig mmpl · name) compHooks0_placed_eq) hbInp2_eq ssC2Out_eq - ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4q0).step c4q1).step c4q2q0).step c4q2q1q0).step c4q2q1q1).step c4q2q1q2).step c4q2q1q3q0q0L).step c4q2q1q3q0q0R).step c4q2q1q3q0q1).step c4q2q1q3q0q2).step c4q2q1q3q0q3).step c4q2q1q3q1).step c4q2q1q3q2).step c4q2q1q3q3).step c4q2q2).step c4q2q3).step c4q3).step c5).step c6).step c7).step c8).step c9).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17).step c18).step c19).step c20).step c21).step c22).step c23).step c24).step c25q0).step c25q1).step c25q2q0).step c25q2q1).step c25q2q2q0).step c25q2q2q1q0q0).step c25q2q2q1q0q1).step c25q2q2q1q0q2).step c25q2q2q1q0q3L).step c25q2q2q1q0q3R).step c25q2q2q1q1).step c25q2q2q1q2).step c25q2q2q1q3).step c25q2q2q2).step c25q2q2q3).step c25q2q3).step c25q3).step c26).step c27).step c28).step c29q0).step c29q1).step c29q2q0q0).step c29q2q0q1).step c29q2q0q2).step c29q2q0q3q0).step c29q2q0q3q1).step c29q2q0q3q2).step c29q2q0q3q3q0).step c29q2q0q3q3q1).step c29q2q0q3q3q2L).step c29q2q0q3q3q2R).step c29q2q0q3q3q3).step c29q2q1).step c29q2q2).step c29q2q3).step c29q3).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66).step c67).step c68).step c69).step c70).step c71).step c72).step c73).step c74).step c75).step c76).step c77).step c78).step c79).step c80).step c81).step c82).step c83).step c84).step c85).step c86).step c87).step c88).step c89).step c90).step c91).step c92).step c93).step c94).step c95).step c96).step c97).step c98).step c99) c100 + (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4q0).step c4q1).step c4q2q0).step c4q2q1).step c4q2q2).step c4q2q3q0q0).step c4q2q3q0q1).step c4q2q3q0q2).step c4q2q3q0q3q0).step c4q2q3q0q3q1).step c4q2q3q0q3q2).step c4q2q3q0q3q3L).step c4q2q3q0q3q3R).step c4q2q3q1).step c4q2q3q2).step c4q2q3q3).step c4q3).step c5).step c6).step c7).step c8).step c9).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17).step c18).step c19).step c20).step c21).step c22).step c23).step c24).step c25q0).step c25q1q0q0).step c25q1q0q1).step c25q1q0q2).step c25q1q0q3q0).step c25q1q0q3q1).step c25q1q0q3q2).step c25q1q0q3q3q0).step c25q1q0q3q3q1).step c25q1q0q3q3q2).step c25q1q0q3q3q3L).step c25q1q0q3q3q3R).step c25q1q1).step c25q1q2).step c25q1q3).step c25q2).step c25q3).step c26).step c27).step c28).step c29q0q0).step c29q0q1).step c29q0q2).step c29q0q3q0).step c29q0q3q1).step c29q0q3q2q0q0).step c29q0q3q2q0q1).step c29q0q3q2q0q2).step c29q0q3q2q0q3L).step c29q0q3q2q0q3R).step c29q0q3q2q1).step c29q0q3q2q2).step c29q0q3q2q3).step c29q0q3q3).step c29q1).step c29q2).step c29q3).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66).step c67).step c68).step c69).step c70).step c71).step c72).step c73).step c74).step c75).step c76).step c77).step c78).step c79).step c80).step c81).step c82).step c83).step c84).step c85).step c86).step c87).step c88).step c89).step c90).step c91).step c92).step c93).step c94).step c95).step c96).step c97).step c98) c99 end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.Call2 diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/F3LayoutData.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/F3LayoutData.lean index b7b63bab1..a22a801da 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/F3LayoutData.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroup/F3LayoutData.lean @@ -15,10 +15,14 @@ public import VerifiedLibraries.Mallocng.Proofs.PlacedInterned public import LibsignalBinary.Heap.Iface /-! -Placed ELF layout, `mallocng` placement, and allocator branch-stub constants for the -`cheval26-small-subgroup` mutant CLI binary (`981040` B, -`sha256 = ad04f6d5153274c79a9d0726bf2537469c9292413c62301adf4d40e5996422ef`). Downstream linking -proofs check these constants against `mutantCliElfImage`. +# Generated ELF Layout & Address Table (`F3LayoutData`) + +**Checked by Lean.** Untrusted (`Role::Proof`): auto-generated by `gen_stock_layout.py` +from `libsignal-cli.elf` (`618592` B, `sha256 = b11150205ed6227aa9af7229fc2a129072607b3491b6cb681997db857a22b738`) and `stock-link.json`. + +Single generated definition module holding all literal ELF segment bounds, PHDR bytes, `musl` +`StdBinaryLayout` addresses, `mallocngLib` `MultiLayout` addresses, and Rust allocator +addresses (`stock/rdl_shim.S` 1-hop `b __rdl_*` thunks (`< e_entry`) into `rxSeg`). -/ set_option autoImplicit false @@ -31,65 +35,71 @@ open Arm64 Arm64.Obj ProofLib ProofLib.StdStartup open VerifiedLibraries.Mallocng.Proofs (mallocngMultiL) open LibsignalBinary.Heap (RustAllocAddrs) -/-- Expected SHA-256 digest of the `cheval26-small-subgroup` mutant CLI ELF. -/ -def f3TrialElfSha256 : String := - "ad04f6d5153274c79a9d0726bf2537469c9292413c62301adf4d40e5996422ef" +/-- Expected SHA-256 of `libsignal-cli.elf`. -/ +def f3ElfSha256 : String := + "b11150205ed6227aa9af7229fc2a129072607b3491b6cb681997db857a22b738" -/-- Number of `PT_LOAD` segments in the mutant CLI ELF. -/ -def f3SegCount : Nat := 8 +/-- Compatibility alias for `f3ElfSha256`. -/ +abbrev f3TrialElfSha256 : String := f3ElfSha256 -/-- Total byte length across page-aligned `PT_LOAD` segments. -/ -def f3SegByteSum : Nat := 675840 +/-- `PT_LOAD` segment count of the stock CLI ELF. -/ +def f3SegCount : Nat := 4 -/-- Word count (`bytes / 4`) of the page-aligned `rxSeg` (`seg[5]`). -/ +/-- Sum of page-aligned `PT_LOAD` region byte lengths (`(elf.segments.map (·.bytes.length)).sum`). -/ +def f3SegByteSum : Nat := 462848 + +/-- Word count (`bytes / 4`) of the page-aligned `rxSeg` (`seg[2]`). -/ def f3RxWordCount : Nat := 6144 -/-- Code byte length (`p_filesz = p_memsz`) of `.img.text` (`seg[1]` at `0x400000`). -/ -def f3ImgTextByteLen : Nat := 0x88508 +/-- Page-aligned base `(stockStdLayout.rxProgram elf).base` of the whole `PT_LOAD[rxSegIdx]` + (`seg[2]`; note `startAddr = e_entry` may sit at a higher page inside this same + `PT_LOAD` when `.text.b_pre` precedes `.text`). -/ +def f3RxSegBase : BitVec 64 := 0x469000#64 /-- Post-`__init_tp` `tpidr_el0` value (`builtin_tls + 0xc8`). -/ -def f3TpAddr : BitVec 64 := 0x4a3338#64 +def f3TpAddr : BitVec 64 := 0x4702b8#64 -/-- Initial program break address. -/ -def f3BrkStart : BitVec 64 := 0x4a4000#64 +/-- Initial `brkStart` (`0x471000`). -/ +def f3BrkStart : BitVec 64 := 0x471000#64 -/-- ELF program header table (`11 × 56 = 616` bytes at `0x3ff040`, with empty `PT_TLS` at index `9`). -/ +/-- The `7 × 56 = 392` B ELF program header table at `0x400040` + (`PT_TLS` index `5` = `0/0/0/0`). -/ def f3PhdrBytes : List (BitVec 8) := [ - 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0xf0#8, 0x3f#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0xf0#8, 0x3f#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x68#8, 0x02#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x68#8, 0x02#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x08#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x3f#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x3f#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa8#8, 0x02#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa8#8, 0x02#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x08#8, 0x85#8, 0x08#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x08#8, 0x85#8, 0x08#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x08#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x48#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x48#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xb0#8, 0x09#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x49#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x49#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x78#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x78#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xc0#8, 0x09#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xb0#8, 0x49#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xb0#8, 0x49#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xd0#8, 0x09#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xc0#8, 0x49#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xc0#8, 0x49#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x70#8, 0x50#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x70#8, 0x50#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x30#8, 0x0a#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x20#8, 0x4a#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x20#8, 0x4a#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x78#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x78#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x0a#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x30#8, 0x4a#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x30#8, 0x4a#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x88#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xc4#8, 0x07#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x07#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x51#8, 0xe5#8, 0x74#8, 0x64#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8 + 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x88#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x88#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x08#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x76#8, 0x97#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x76#8, 0x97#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x0c#8, 0xe8#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x0c#8, 0xe8#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x5d#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x5d#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x88#8, 0x11#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xe0#8, 0x17#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x07#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x51#8, 0xe5#8, 0x74#8, 0x64#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8 ] -/-- Startup and libc layout addresses for the mutant CLI ELF. -/ +/-- Concrete `StdBinaryLayout` for the stock CLI ELF. -/ def f3StdLayout : StdBinaryLayout where phdrSegIdx := 0 - rxSegIdx := 5 - roSegIdx := 6 - rwSegIdx := 7 - brkStart := 0x4a4000#64 - startAddr := 0x49c010#64 - startCAddr := 0x49c02c#64 - libcStartMainAddr := 0x49df70#64 - initLibcAddr := 0x49dd1c#64 - memsetAddr := 0x4a0a00#64 - staticInitTlsAddr := 0x49e100#64 - copyTlsAddr := 0x49e054#64 - memcpyAddr := 0x4a0870#64 - initTpAddr := 0x49dfc4#64 - setThreadAreaAddr := 0x4a0ca0#64 - dummy1Addr := 0x49dd18#64 - libcStartMainStage2Addr := 0x49df34#64 - libcStartInitAddr := 0x49def4#64 - initFnAddr := 0x49c000#64 - initLseAddr := 0x49d084#64 - detectAndInitializeAddr := 0x49d0b0#64 - getauxvalAddr := 0x4a063c#64 - rustEnableLseAddr := 0x4a0d5c#64 - doInitAddr := 0x49c0d0#64 - cMainAddr := 0x486fc4#64 + rxSegIdx := 2 + roSegIdx := 0 + rwSegIdx := 3 + brkStart := 0x471000#64 + startAddr := 0x46a000#64 + startCAddr := 0x46a01c#64 + libcStartMainAddr := 0x46b754#64 + initLibcAddr := 0x46b500#64 + memsetAddr := 0x4697e0#64 + staticInitTlsAddr := 0x46b8e4#64 + copyTlsAddr := 0x46b838#64 + memcpyAddr := 0x469650#64 + initTpAddr := 0x46b7a8#64 + setThreadAreaAddr := 0x46e1ec#64 + dummy1Addr := 0x46b4fc#64 + libcStartMainStage2Addr := 0x46b718#64 + libcStartInitAddr := 0x46b6d8#64 + initFnAddr := 0x46a044#64 + initLseAddr := 0x46a868#64 + detectAndInitializeAddr := 0x46a894#64 + getauxvalAddr := 0x46de20#64 + rustEnableLseAddr := 0x46e2a8#64 + doInitAddr := 0x46a0d0#64 + cMainAddr := 0x4671cc#64 cas8RelaxAddr := 0#64 pollAddr := 0#64 - syscallCpAddr := 0x4a0c9c#64 - sccpAddr := 0x4a0c78#64 - syscallRetAddr := 0x49e3dc#64 + syscallCpAddr := 0x46e1e8#64 + sccpAddr := 0x46e1c4#64 + syscallRetAddr := 0x46bbc0#64 signalAddr := 0#64 sigactionAddr := 0#64 libcSigactionAddr := 0#64 @@ -105,112 +115,101 @@ def f3StdLayout : StdBinaryLayout where stdoutVtableShimAddr := 0#64 stdoutCleanupClosureAddr := 0#64 swp4RelAddr := 0#64 - errnoLocationAddr := 0x49e2b0#64 + errnoLocationAddr := 0x46ba94#64 cas8AcqAddr := 0#64 - exitAddr := 0x49e2fc#64 - dummyExitAddr := 0x49e2bc#64 - libcExitFiniAddr := 0x49e2c0#64 - doFiniAddr := 0x49c058#64 - finiFnAddr := 0x4a1060#64 - stdioExitNeededAddr := 0x4a0f30#64 - oflLockFnAddr := 0x4a103c#64 - lockFnAddr := 0x4a0b04#64 - closeFileAddr := 0x4a0eac#64 - sysExitAddr := 0x49e320#64 + exitAddr := 0x46bae0#64 + dummyExitAddr := 0x46baa0#64 + libcExitFiniAddr := 0x46baa4#64 + doFiniAddr := 0x46a058#64 + finiFnAddr := 0x46e5ac#64 + stdioExitNeededAddr := 0x46e47c#64 + oflLockFnAddr := 0x46e588#64 + lockFnAddr := 0x46e050#64 + closeFileAddr := 0x46e3f8#64 + sysExitAddr := 0x46bb04#64 hasArgcGlobal := false argcGlobalAddr := 0#64 userMainReturnsExitCode := true - phdrAddr := 0x3ff040#64 - phnum := 11 - tlsPhdrIdx := 9 + phdrAddr := 0x400040#64 + phnum := 7 + tlsPhdrIdx := 5 tlsImageAddr := 0#64 phdrBytes := f3PhdrBytes - emptyCStrAddr := 0x4a2098#64 + emptyCStrAddr := 0x409450#64 sysconfValuesAddr := 0#64 cleanupVtableAddr := 0#64 stdoutVtableAddr := 0#64 devNullStdAddr := 0#64 - devNullLibcAddr := 0x4a20a0#64 - extraRoSlices := [(0x4a20b0#64, ProofLib.mallocngRoTablesBytes)] - initArrayAddr := 0x4a3000#64 - finiArrayAddr := 0x4a3010#64 - gotAddr := 0x4a3118#64 + devNullLibcAddr := 0x409458#64 + extraRoSlices := [(0x409468#64, ProofLib.mallocngRoTablesBytes)] + initArrayAddr := 0x470000#64 + finiArrayAddr := 0x470010#64 + gotAddr := 0x470118#64 stdoutGlobalAddr := 0#64 cleanupOnceAddr := 0#64 - defaultStacksizeAddr := 0x4a3020#64 - stderrFileAddr := 0x4a3028#64 - stderrUsedAddr := 0x4a3110#64 - libcAddr := 0x4a3190#64 - threadListLockAddr := 0x4a31f8#64 - sysinfoAddr := 0x4a3200#64 - hwcapAddr := 0x4a3208#64 - finalizedAddr := 0x4a321c#64 - initializedAddr := 0x4a321d#64 + defaultStacksizeAddr := 0x470020#64 + stderrFileAddr := 0x470028#64 + stderrUsedAddr := 0x470110#64 + libcAddr := 0x470748#64 + threadListLockAddr := 0x4707b0#64 + sysinfoAddr := 0x4707b8#64 + hwcapAddr := 0x4707c0#64 + finalizedAddr := 0x470190#64 + initializedAddr := 0x470191#64 argvGlobalAddr := 0#64 pageSizeGlobalAddr := 0#64 threadIdCounterAddr := 0#64 exitingThreadIdAddr := 0#64 - stdDetectCacheAddr := 0x4a3260#64 - environAddr := 0x4a3268#64 - builtinTlsAddr := 0x4a3270#64 - mainTlsAddr := 0x4a33c0#64 - prognameAddr := 0x4a33f0#64 - prognameFullAddr := 0x4a33f8#64 - haveLseAtomicsAddr := 0x4a37a0#64 - stdinUsedAddr := 0x4a37b0#64 - stdoutUsedAddr := 0x4a37b0#64 - oflHeadAddr := 0x4a37b8#64 - oflLockAddr := 0x4a37c0#64 + stdDetectCacheAddr := 0x4701e0#64 + environAddr := 0x4701e8#64 + builtinTlsAddr := 0x4701f0#64 + mainTlsAddr := 0x470340#64 + prognameAddr := 0x470370#64 + prognameFullAddr := 0x470378#64 + haveLseAtomicsAddr := 0x470720#64 + stdinUsedAddr := 0x470730#64 + stdoutUsedAddr := 0x470730#64 + oflHeadAddr := 0x470738#64 + oflLockAddr := 0x470740#64 extraRwAtoms := [ - .u32 0x4a3210#64 0#32, - .u32 0x4a3214#64 0#32, - .u32 0x4a3218#64 0#32, - .bytes 0x4a3400#64 (List.replicate 928 0#8) + .u32 0x4707c8#64 0#32, + .u32 0x4707cc#64 0#32, + .u32 0x4707d0#64 0#32, + .bytes 0x470380#64 (List.replicate 928 0#8) ] -/-- Interned `MultiLayout` (`24` block bases and `42` symbol addresses) for `mallocngLib`. -/ +/-- Interned `MultiLayout` (`24` block bases + `42` symbol addresses) for + `VerifiedLibraries.mallocngLib` in the stock CLI ELF. -/ def f3MallocngMly : Obj.Interned.MultiLayout where - bases := [0x49e2b0#64, 0x49e3dc#64, 0x49e418#64, 0x49e4f8#64, 0x49e4fc#64, 0x49e500#64, 0x49e9b0#64, 0x49ed0c#64, 0x49f004#64, 0x49f93c#64, 0x49fd94#64, 0x49ff00#64, 0x49ff58#64, 0x4a0248#64, 0x4a024c#64, 0x4a06a0#64, 0x4a06a4#64, 0x4a075c#64, 0x4a07a4#64, 0x4a0834#64, 0x4a0870#64, 0x4a0a00#64, 0x4a0b04#64, 0x4a0c1c#64] - addrs := [0x49e2b0#64, 0x4a3214#64, 0x49e2b0#64, 0x4a3190#64, 0x49e9b0#64, 0x49e4fc#64, 0x49f93c#64, 0x4a024c#64, 0x4a0b04#64, 0x49ed0c#64, 0x49fd94#64, 0x4a3400#64, 0x4a3210#64, 0x4a3218#64, 0x4a20b0#64, 0x4a06a4#64, 0x4a075c#64, 0x4a07a4#64, 0x4a0834#64, 0x49e3dc#64, 0x4a0c1c#64, 0x4a06a0#64, 0x49ff58#64, 0x49f004#64, 0x49e418#64, 0x4a2110#64, 0x4a2158#64, 0x49e4fc#64, 0x49e4f8#64, 0x49e4fc#64, 0x4a2130#64, 0x4a0870#64, 0x4a0a00#64, 0x4a06a4#64, 0x4a06a4#64, 0x4a075c#64, 0x4a07a4#64, 0x4a0834#64, 0x49e500#64, 0x49ff00#64, 0x4a0248#64, 0x4a2138#64] + bases := [0x46ba94#64, 0x46bbc0#64, 0x46bbfc#64, 0x46bcdc#64, 0x46bce0#64, 0x46bce4#64, 0x46c194#64, 0x46c4f0#64, 0x46c7e8#64, 0x46d120#64, 0x46d578#64, 0x46d6e4#64, 0x46d73c#64, 0x46da2c#64, 0x46da30#64, 0x46de84#64, 0x46de88#64, 0x46df40#64, 0x46df88#64, 0x46e018#64, 0x469650#64, 0x4697e0#64, 0x46e050#64, 0x46e168#64] + addrs := [0x46ba94#64, 0x4707cc#64, 0x46ba94#64, 0x470748#64, 0x46c194#64, 0x46bce0#64, 0x46d120#64, 0x46da30#64, 0x46e050#64, 0x46c4f0#64, 0x46d578#64, 0x470380#64, 0x4707c8#64, 0x4707d0#64, 0x409468#64, 0x46de88#64, 0x46df40#64, 0x46df88#64, 0x46e018#64, 0x46bbc0#64, 0x46e168#64, 0x46de84#64, 0x46d73c#64, 0x46c7e8#64, 0x46bbfc#64, 0x4094c8#64, 0x409510#64, 0x46bce0#64, 0x46bcdc#64, 0x46bce0#64, 0x4094e8#64, 0x469650#64, 0x4697e0#64, 0x46de88#64, 0x46de88#64, 0x46df40#64, 0x46df88#64, 0x46e018#64, 0x46bce4#64, 0x46d6e4#64, 0x46da2c#64, 0x4094f0#64] -abbrev f3MallocngMpl : Obj.MultiPlacement := +/-- Concrete `MultiPlacement` for `VerifiedLibraries.mallocngLib` in the stock CLI ELF. -/ +noncomputable abbrev f3MallocngMpl : Obj.MultiPlacement := f3MallocngMly.toMultiPlacement mallocngMultiL.names -/-- Branch-stub addresses in `.img.text` (`seg[1]`) for `__rust_{alloc,dealloc,realloc}`. -/ +/-- Stock `rdl_shim.S` `___rust_{alloc,dealloc,realloc}` entry addresses (`< e_entry` per 5d `hstubLt`). -/ def f3StubAddrs : RustAllocAddrs where - alloc := 0x4882e4#64 - dealloc := 0x4882f0#64 - realloc := 0x48835c#64 + alloc := 0x469630#64 + dealloc := 0x469634#64 + realloc := 0x469638#64 -/-- Allocator shim addresses (`__rdl_{alloc,dealloc,realloc}`) in `seg[5]`. -/ +/-- Stock `rdl_shim.S` `__rdl_{alloc,dealloc,realloc}` body addresses in `seg[2]`. -/ def f3RdlAddrs : RustAllocAddrs where - alloc := 0x49c108#64 - dealloc := 0x49c160#64 - realloc := 0x49c164#64 - -/-- Branch-stub address in `.img.text` (`seg[1]`) for `__rust_alloc_zeroed`. -/ -def f3StubAzAddr : BitVec 64 := 0x48846c#64 - -/-- Allocator shim address (`__rdl_alloc_zeroed`) in `seg[5]`. -/ -def f3RdlAzAddr : BitVec 64 := 0x49c210#64 - -/-- Branch-stub address in `.img.text` (`seg[1]`) for `__rust_no_alloc_shim_is_unstable_v2`. -/ -def f3StubNoShimAddr : BitVec 64 := 0x4882e0#64 - -/-- Shim address (`___rust_no_alloc_shim_is_unstable_v2`) in `seg[5]`. -/ -def f3NoShimV2Addr : BitVec 64 := 0x49c2a0#64 - -/-- Sorted `(byteOffset, branchWord)` pairs for branch stubs patched in `.img.text` (`seg[1]`). -/ -def f3BranchStubSpec : List (Nat × BitVec 32) := [ - (0x882e0, 0x14004ff0#32), - (0x882e4, 0x14004f89#32), - (0x882e8, 0x140061c6#32), - (0x882f0, 0x14004f9c#32), - (0x88310, 0x14006158#32), - (0x8835c, 0x14004f82#32), - (0x8846c, 0x14004f69#32), - (0x884f0, 0x14005054#32), - (0x884fc, 0x14004f6a#32) -] + alloc := 0x469498#64 + dealloc := 0x4694f0#64 + realloc := 0x4694f4#64 + +/-- Stock `rdl_shim.S` `___rust_alloc_zeroed` entry address (`< e_entry` per 5d `hstubLt`). -/ +def f3StubAzAddr : BitVec 64 := 0x46963c#64 + +/-- Stock `rdl_shim.S` `__rdl_alloc_zeroed` body address in `seg[2]`. -/ +def f3RdlAzAddr : BitVec 64 := 0x4695a0#64 + +/-- Stock `rdl_shim.S` `___rust_no_alloc_shim_is_unstable_v2` symbol address. -/ +def f3StubNoShimAddr : BitVec 64 := 0x469640#64 + +/-- `rdl_shim.S` `___rust_no_alloc_shim_is_unstable_v2` (`ret`) address. -/ +def f3NoShimV2Addr : BitVec 64 := 0x469640#64 end Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.F3LayoutData diff --git a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroupTail/SmallSubgroupMallocng.lean b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroupTail/SmallSubgroupMallocng.lean index a62d82557..e30c29d69 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroupTail/SmallSubgroupMallocng.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/SmallSubgroupTail/SmallSubgroupMallocng.lean @@ -19,7 +19,7 @@ public import ProofLib.ProgramReflection public meta import ProofLib.ProgramReflection public import Symbolic.BugInjection.Disproofs.Impl.MutantParse public import Symbolic.BugInjection.Disproofs.Impl.MutantLink.MutantSymChars -public import Symbolic.BugInjection.Disproofs.Impl.MutantLink.WalkSpec +public import Symbolic.BugInjection.Disproofs.Impl.MutantLink.WalkSpecAnyOrder public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.F3LayoutData public import Symbolic.BugInjection.Disproofs.Impl.SmallSubgroup.MutantLinkData public import VerifiedLibraries.Mallocng.Proofs.PlacedInterned @@ -28,7 +28,7 @@ public import VerifiedLibraries.Mallocng.Proofs.PlacedInterned # `cheval26-small-subgroup` `mallocngLib` Linking Proof Proves `VerifiedLibraries.mallocngLib.LinkedAt mutantCliElfBytes mutantMmpl` for the -`cheval26-small-subgroup` mutant ELF image. +`cheval26-small-subgroup` stock-linked mutant ELF image. -/ @[expose] public section @@ -45,8 +45,8 @@ open Symbolic.BugInjection.Disproofs.Impl.MutantParse (mutantCliElf_parse) open Symbolic.BugInjection.Disproofs.Impl.MutantLink.MutantSymChars ( mutantCliElfSymChars mutantCliElf_symbols_eq ) -open Symbolic.BugInjection.Disproofs.Impl.MutantLink.WalkSpec ( - SlicesTextVarOk checkMultiVarSliced_spec +open Symbolic.BugInjection.Disproofs.Impl.MutantLink.WalkSpecAnyOrder ( + checkMultiMetaCoreAnyOrderB checkMultiSplitAnyOrder_spec ) open VerifiedLibraries.Mallocng.Proofs ( mallocngMultiL mallocngMultiL_names mallocngMultiL_toMultiPlacedLib mallocngNameChars @@ -55,7 +55,7 @@ open VerifiedLibraries.Mallocng.Proofs ( #guard CryptoVerification.BugInjection.mutant == "cheval26-small-subgroup" theorem mutant_mallocng_metaCore_ok : - Obj.Interned.checkMultiMetaCoreFastB mallocngMultiL f3MallocngMly + checkMultiMetaCoreAnyOrderB mallocngMultiL f3MallocngMly mallocngNameChars = true := by rfl_kernel @@ -68,30 +68,16 @@ theorem mutant_mallocng_metaExports_ok : mallocngNameChars mutantCliElfSymChars = true := by rfl_kernel -theorem mutant_mallocng_meta_ok : - Obj.Interned.checkMultiMetaFastB mallocngMultiL f3MallocngMly - mallocngNameChars mutantCliElfSymChars = true := - Obj.Interned.checkMultiMetaFastB_of_parts - mutant_mallocng_metaCore_ok mutant_mallocng_metaData_ok mutant_mallocng_metaExports_ok - theorem mutant_mallocng_dataWalk_ok : Obj.Interned.checkMultiDataWalkFastB mallocngMultiL f3MallocngMly mutantCliElfImage = true := by rfl_kernel -theorem mutant_mallocng_blocks_bound : - Nat.ble mallocngMultiL.blocks.length 24 = true := by - rfl_kernel - -theorem mutant_mallocng_textWalk_00 : - Obj.Interned.checkMultiTextSliceB mallocngMultiL f3MallocngMly - mutantCliElfImage 0 24 = true := by +theorem mutant_mallocng_textWalk_ok : + Obj.Interned.checkMultiTextWalkFastB mallocngMultiL f3MallocngMly + mutantCliElfImage = true := by rfl_kernel -theorem mutant_mallocng_slicesTextVarOk : - SlicesTextVarOk mallocngMultiL f3MallocngMly mutantCliElfImage 24 := - SlicesTextVarOk.zero.step mutant_mallocng_textWalk_00 - theorem mutant_mallocng_placed : VerifiedLibraries.mallocngLib.Placeable mutantMmpl ∧ VerifiedLibraries.mallocngLib.InElf mutantCliElfImage mutantMmpl ∧ @@ -100,10 +86,11 @@ theorem mutant_mallocng_placed : VerifiedLibraries.mallocngLib.Placeable (f3MallocngMly.toMultiPlacement mallocngMultiL.names) ∧ VerifiedLibraries.mallocngLib.InElf mutantCliElfImage (f3MallocngMly.toMultiPlacement mallocngMultiL.names) ∧ VerifiedLibraries.mallocngLib.DataDisjoint (f3MallocngMly.toMultiPlacement mallocngMultiL.names) := - checkMultiVarSliced_spec mallocngMultiL_toMultiPlacedLib.symm + checkMultiSplitAnyOrder_spec mallocngMultiL_toMultiPlacedLib.symm mallocngMultiL_names mutantCliElf_symbols_eq - mutant_mallocng_meta_ok mutant_mallocng_dataWalk_ok - mutant_mallocng_blocks_bound mutant_mallocng_slicesTextVarOk + mutant_mallocng_metaCore_ok mutant_mallocng_metaData_ok + mutant_mallocng_metaExports_ok mutant_mallocng_dataWalk_ok + mutant_mallocng_textWalk_ok have h_eq : mutantMmpl = f3MallocngMly.toMultiPlacement mallocngMultiL.names := rfl rwa [h_eq] diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseData.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseData.lean index 2e6a3ff9e..ffb3990e6 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseData.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseData.lean @@ -27,24 +27,21 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def baseHooks : BinTree String := ckpt_hooks [ - "BBBBBBBH9281;80;_RNvMs6_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecret14diffie_hellmanH9280;78;_RNvMsg_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint8compressEH37124;37;_RNvCs65XVORQObL2_12libcrux_hmac4hmacBH37122;4", - "1;_RNvNtCskxtBwYRO61I_4core9panicking5panicBEBH9280;47;_RNvNtCskxtBwYRO61I_4core6option13expect_failedH9280;64;_RNvNtCsbKnPy0UR4Ui_13signal_crypto7aes_cbc19aes_256_cbc_encryptBBBH18562;76;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24", - "panic_const_shl_overflowH18560;48;_RNvNtCs69KKACWg7bl_5alloc7raw_vec12handle_errorBEBH9280;35;_RNvNtCskxtBwYRO61I_4core3fmt5writeH9280;97;_RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes3pk1BEBBB", - "H4640;55;_RNvNtCskxtBwYRO61I_4core9panicking18panic_bounds_checkH4640;48;_RNvCs9Xul1Kjr0QF_16libsignal_cli_io10write_fileEH18561;88;_RNvMs5_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPoint10to_edwardsBBBH37121;85;_RNvMNt", - "Cs2wR8L9wiBdT_16curve25519_dalek6scalarNtB2_6Scalar25from_bytes_mod_order_wideH37124;57;_RINvNtCskxtBwYRO61I_4core9panicking13assert_failedjjEB4_BH37122;45;_RNvNtCsbvWyylYiyxg_4sha26sha25611compress256BBBH4640;76;_RNvNtNtCskxtBwYRO61I_4core", - "9panicking11panic_const24panic_const_add_overflowH4640;6;strlenEH18561;56;_RNvNtCskxtBwYRO61I_4core9panicking19assert_failed_innerBBBH18561;53;_RNvNvNtCs69KKACWg7bl_5alloc3fmt6format12format_innerH18560;50;_RNvNtNtCskxtBwYRO61I_4core3str8co", - "nverts9from_utf8EBBH18562;57;_RINvNtCskxtBwYRO61I_4core9panicking13assert_failedyyEB4_H18560;80;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const28panic_const_async_fn_resumedBEBH9280;80;_RNvMNtCs2wR8L9wiBdT_16curve25519_dalek6scalarNtB2_6", - "Scalar20from_bytes_mod_orderH9280;112;_RNvXso_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPointNtNtNtCskxtBwYRO61I_4core3ops5arith3Neg3negBBBBBH18562;108;_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskx", - "tBwYRO61I_4core3ops4drop4Drop4dropH18560;45;_RNvNtCsbvWyylYiyxg_4sha26sha51211compress512BH18562;74;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental12encapsulate2H18560;70;_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16cu", - "rve25519_dalekBEBBBH4640;7;memmoveH4640;48;_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchrEBH9280;70;_RNvNvMs_NtCs69KKACWg7bl_5alloc3vecINtB6_3VecppE6remove13assert_failedH9280;64;_RNvNtCsbKnPy0UR4Ui_13signal_crypto7aes_cbc19aes_256_cbc_de", - "cryptBBBH18561;65;_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_sinceH18560;45;_RNvNtCskxtBwYRO61I_4core9panicking9panic_fmtBEBH9280;57;_RNvNtNtCskxtBwYRO61I_4core5slice5index16slice_index_failH9280;97;_RNvMs0_NtNtCs1mK0QScfTr", - "Z_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes3pk2BBH18561;67;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber11decapsulateH18560;4;bcmpBBBH4640;76;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const", - "_sub_overflowH4640;50;_RNvCs9Xul1Kjr0QF_16libsignal_cli_io12write_stdoutEH18561;86;_RNvMsx_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint15is_torsion_freeBBBH37122;108;_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12Stati", - "cSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4dropBH18562;88;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental26decapsulate_compressed_keyH18561;103;_RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairC", - "ompressedBytes9from_seedBH37121;47;_RNvNtCskxtBwYRO61I_4core6option13unwrap_failedBH18560;76;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_mul_overflowH18561;123;_RNvXs8_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_9PublicKey", - "INtNtCskxtBwYRO61I_4core7convert4FromRNtB5_12StaticSecretE4fromBBBH18561;115;_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3addH18560;47;_RNvNtCskxtBwYRO61I_4core6result13unwr", - "ap_failedBH18562;67;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber11encapsulateH18561;74;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental12encapsulate1BBH18562;79;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremen", - "tal17validate_pk_bytesH18560;52;_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_errorH37123;106;_RNvMsw_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint35vartime_double_scalar_mul_basepoint" + "BBBBBH36106;76;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_shl_overflowBH18052;57;_RINvNtCskxtBwYRO61I_4core9panicking13assert_failedjjEB4_H18052;41;_RNvNtCskxtBwYRO61I_4core9panicking5panicBH36105;45;_RNvNtCsbvWyylYiyxg", + "_4sha26sha25611compress256H36105;67;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber11encapsulateBBBH18053;53;_RNvNvNtCs69KKACWg7bl_5alloc3fmt6format12format_innerH18052;52;_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_errorBH18052;8", + "5;_RNvMNtCs2wR8L9wiBdT_16curve25519_dalek6scalarNtB2_6Scalar25from_bytes_mod_order_wideH18052;74;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental12encapsulate2BH36105;47;_RNvNtCskxtBwYRO61I_4core6option13unwrap_failedH36105;57;_", + "RNvNtNtCskxtBwYRO61I_4core5slice5index16slice_index_failBBBBH18053;80;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const28panic_const_async_fn_resumedH18052;106;_RNvMsw_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint35vartime_", + "double_scalar_mul_basepointH36104;37;_RNvCs65XVORQObL2_12libcrux_hmac4hmacH72210;35;_RNvNtCskxtBwYRO61I_4core3fmt5writeBBH36105;64;_RNvNtCsbKnPy0UR4Ui_13signal_crypto7aes_cbc19aes_256_cbc_decryptBH18052;97;_RNvMs0_NtNtCs1mK0QScfTrZ_14libcru", + "x_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes3pk2H18052;88;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental26decapsulate_compressed_keyBH36105;55;_RNvNtCskxtBwYRO61I_4core9panicking18panic_bounds_checkH36105;76;_RN", + "vNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_add_overflowBBBBBH18053;76;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_sub_overflowBH9026;78;_RNvMsg_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPo", + "int8compressH9025;50;_RNvCs9Xul1Kjr0QF_16libsignal_cli_io12write_stdoutBH18052;57;_RINvNtCskxtBwYRO61I_4core9panicking13assert_failedyyEB4_H18052;45;_RNvNtCskxtBwYRO61I_4core9panicking9panic_fmtBBH18053;123;_RNvXs8_NtCscSWoUTnaXmu_12x25519_", + "dalek6x25519NtB5_9PublicKeyINtNtCskxtBwYRO61I_4core7convert4FromRNtB5_12StaticSecretE4fromH18052;45;_RNvNtCsbvWyylYiyxg_4sha26sha51211compress512H36104;88;_RNvMs5_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPoint10to_edwa", + "rdsBBH36105;48;_RNvNtCs69KKACWg7bl_5alloc7raw_vec12handle_errorBBBH4513;97;_RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes3pk1H4512;48;_RNvCs9Xul1Kjr0QF_16libsignal_cli_io10write_fileEH18052;79;", + "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytesH72210;47;_RNvNtCskxtBwYRO61I_4core6result13unwrap_failedBBBBH18053;70;_RNvNvMs_NtCs69KKACWg7bl_5alloc3vecINtB6_3VecppE6remove13assert_failedH18052;86;_RNvMsx_Nt", + "Cs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint15is_torsion_freeBH18052;80;_RNvMNtCs2wR8L9wiBdT_16curve25519_dalek6scalarNtB2_6Scalar20from_bytes_mod_orderH18052;74;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental12e", + "ncapsulate1BH36105;47;_RNvNtCskxtBwYRO61I_4core6option13expect_failedH36104;80;_RNvMs6_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecret14diffie_hellmanBBH36105;64;_RNvNtCsbKnPy0UR4Ui_13signal_crypto7aes_cbc19aes_256_cbc_encryptBBH90", + "26;103;_RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes9from_seedH9026;112;_RNvXso_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPointNtNtNtCskxtBwYRO61I_4core3ops5arith3Neg3negH18052;6", + "7;_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber11decapsulateBH36105;56;_RNvNtCskxtBwYRO61I_4core9panicking19assert_failed_innerH36105;76;_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_mul_overflow" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseData diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseFull.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseFull.lean index e5058fca9..28f1c714f 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseFull.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseFull.lean @@ -56,18 +56,18 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines14 (sub14) open Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines15 (sub15) def wsSpec : ElfFullSpecPlaced := - { entry := 0x49c010#64 -- layout-bypass: concrete-mutant-trace-checkpoint - phdrVaddr := 0x3ff040#64 -- layout-bypass: concrete-mutant-trace-checkpoint - phnum := 11 - brkStart := 0x4a4000#64 -- layout-bypass: concrete-mutant-trace-checkpoint - tokStorageAddr := 0x49a038#64 -- layout-bypass: concrete-mutant-trace-checkpoint - tokOnceAddr := 0x49a040#64 -- layout-bypass: concrete-mutant-trace-checkpoint - callocAddr := 0x49e418#64 -- layout-bypass: concrete-mutant-trace-checkpoint - callocSentinel := 0x49e419#64 -- layout-bypass: concrete-mutant-trace-checkpoint - mallocAddr := 0x49e4fc#64 -- layout-bypass: concrete-mutant-trace-checkpoint - mallocSentinel := 0x49e4fd#64 -- layout-bypass: concrete-mutant-trace-checkpoint - freeAddr := 0x49e4f8#64 -- layout-bypass: concrete-mutant-trace-checkpoint - freeSentinel := 0x49e4f9#64 -- layout-bypass: concrete-mutant-trace-checkpoint + { entry := 0x46a000#64 -- layout-bypass: concrete-mutant-trace-checkpoint + phdrVaddr := 0x400040#64 -- layout-bypass: concrete-mutant-trace-checkpoint + phnum := 7 + brkStart := 0x471000#64 -- layout-bypass: concrete-mutant-trace-checkpoint + tokStorageAddr := 0x46f000#64 -- layout-bypass: concrete-mutant-trace-checkpoint + tokOnceAddr := 0x46f008#64 -- layout-bypass: concrete-mutant-trace-checkpoint + callocAddr := 0x46bbfc#64 -- layout-bypass: concrete-mutant-trace-checkpoint + callocSentinel := 0x46bbfd#64 -- layout-bypass: concrete-mutant-trace-checkpoint + mallocAddr := 0x46bce0#64 -- layout-bypass: concrete-mutant-trace-checkpoint + mallocSentinel := 0x46bce1#64 -- layout-bypass: concrete-mutant-trace-checkpoint + freeAddr := 0x46bcdc#64 -- layout-bypass: concrete-mutant-trace-checkpoint + freeSentinel := 0x46bcdd#64 -- layout-bypass: concrete-mutant-trace-checkpoint hooks := baseHooks baseLines := mkDepth3 (.branch sub0 sub8) (.branch sub1 sub9) (.branch sub2 sub10) (.branch sub3 sub11) diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines0.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines0.lean index 98578f87f..3f368ec6b 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines0.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines0.lean @@ -27,362 +27,253 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub0 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF0900018beb031faa210900b4cc0400d08c8101910dd08252ea0300aa0b000014cb111a33ea090091ee030b2acb2500514f010fcb7f150071eb01088b02030054L4;FF008036911c200094c000009000e0369119200094c00000900040379113200094ffc300d1fd7b01a9f44f02a9fd43", - "0091280840f9290040f91f0002f1230f0054L8;FF082440a90a0840f90b01018b280101ebe933889a480101eb0b2400a9a3000054080800f9f44f41a9fd7bc2a8c0035fd68002009000e018910f20019480020090BBL4;FFe92b09a9290080d2a90cc0f2e87f08a9e8270ba91ea001940da0019480048052", - "210080520ba00194602e00b4480300f008412f91890e0091000540ad88ae8e52L4;FFc0035fd6abf8ff97e10300aa82018052000080d2220000b9f35341a9f8ffff1704805fb8e1ff9f529f00016badfdff54816c1c53e301809261c021cb0300018bL8;FFfd7b02a9fd830091080040f9e90301aaa10100", - "b021980c91e00309aa42008052e80300f9e823009148a00094a20100b042402f91e0230091e103009144a00094BBBL4;FF00030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb438d00541803008bf9feffb50f0000141f0400b1a18c0054L4;FB4572726f7", - "2414349504e491972616e676520656e64206f7574206f6620626f756e64733a20c004203c3d20c0002f636172676f2d72656769737472792f696e64L8;FFe36f1ea917394fa9edef00f90f5550a9ea9300f91e1552a9e9db00f90aa544a9ec5700f90d3158a9fa8305a91af940f9eacf00f9070954a9e9b3", - "00f909a945a9BL8;FFe10200d021c00691131800b91f700039f44f41a9fd7bc2a8c0035fd6000180520104805226600194fd7bbda9f50b00f9f44f02a9fd030091f40302aaf303012aL8;FFa9031df80756ff97e10300aa74000014c80080d2e0430039e02300910800f0f2ff470039e80700f9fe55ff97e", - "80300aa210100d021843191230100d063603691BBBBL4;FF00a8200e0b00669e6b01c0da6b11c0da6bfd43d32c696b38ddffff17000400f000a012912500029420008052e10315aa1800029420008052e10318aa15000294L4;FFe20313aaf50300aa1d000094935600a9930a00f9f44f42a9f65741a9fd7", - "bc3a8c0035fd635008052935600a9930a00f9f44f42a9f65741a9fd7bc3a8c0035fd6L8;FF8b0080523a0000142b7c1c534b0a00344d11c0390b00be522b000b0bac1d00128d00f83761710c8bab008052300000144d15c039ae1d00128c1d0e0b8c010251BL8;FFe0030091a363009142018052a80f00f9", - "6080019468a20091010300d021302a91240300b084402791a363009122028052a80f00f957800194010300d021201891L8;FF57038052331108cb0400001473c201f1d6c2019160040054e11740f9e80f40f91f0101eb00030054e81340f929040091e00316aae91700f917692138d0e3ff97BBBL4;FF220", - "0805216c00194e18340f93f0400f18b000054e08740f92200805210c00194e19b40f914008092f48300f93f0400f18b000054e09f40f92200805208c00194L4;FB72654b65797072655f6b65795f69647369676e65645f7072655f6b65795f696474696d657374616d704d6573736167654b657963697068", - "65725f6b65796d6163L8;FFe94310912001029101010291a9160094a00f7ead480080d2a10b7bad0800f0f2f62702f9161d00914083843ca003d83c4383853ca303de3cf52b02f9e107813dBL8;FFe20315aa17000094770a40f9a6ffff17e00313aa2200805212000094610a40f9afffff17e00313aae10", - "316aae20315aa0c000094760a40f9680240f9080116cbL8;FFa02301d1a9ab3ba9c828ff97a8035ef8b7031ff8140117ebe3070054b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcbBBBBBL4;FF96feff17e90b41b2e9a300a994feff17880080d20800f0f20801", - "40b28ffeff17880080d2e00b00f90800f0f20e000014880080d2b7831df80800f0f219000014L4;FFe97341b919f50039090d0039e96b41b916f9003909110039e96741b909150039e95b41b909190039e95341b9091d0039e94b41b909210039e94341b909250039L8;FFa24300d1c10a8052a8031ff8a9", - "831fb823100194ff4301d1fd7b03a9f32300f9fdc30091f30308aae843009158ffff97e8834039e007c03d1ffd0371e003803dBL8;FFf30308aa3f8131f1c1040054f50301aa010040f9f40302aae28b815228144038e8030039e8030091000140b2149001949f8218f161040054e10315aae2c38052L8;F", - "F55900014880100b008cd2c91e00301aae10308aae2028052fd7b44a9ff4301914d900014880100b008292d91e00301aae10308aa42048052fd7b44a9ff430191BBBL4;FFe8270ba948008052a90300f029993b91eac30291a04700d1a8273aa9a80300b008992291e82a05a92a068052e8038052bf2737a", - "9a90300b029151d91a92b39a9L4;FB1e689b6521ed2c81d73c087a35f466406696050db7b8a1869574a28c1a3c1a67000021113f11fdf9cd2cc4b031ea5594c733cb2e70ce02f2485fa235154c8ad5L8;FFe0f3803d1ed00094e86346f9f80748a9ea2f41a9e02bc33de81b01f908008092e12fc33dfc031", - "8aae87700f9f57b40f9f8030baae56f40f9e72340f9e08710adBL8;FFe082c03ce182c13ce282c23c7f0700b1e08705ade237803d000e0054e082c33ce182c43ce8a30391e282c53c00630291a0073bade082c63ca2033cade18345adL8;FF080100d008013091c9048052e8c302f9e3031691e8cb02f908", - "0100d008e13a9142008052e9c702f9e9cf02f9e8d302f9d0e4ff97f58740f9e8031691e00315aaBBBBL4;FF06000014090180d2f8031faae8031faa0900f0f229017fb20a1f4092e10740f908010aaae9a200a929008052e9020039810000b4e00b40f92200805208f00194L4;FB736765745f73656e6465", - "725f636861696e5f6b65795f62797465736765745f72656365697665725f636861696e5f6b657900000000000000ea98480000000000L8;FFf65706a9f44f07a9fdc30091081c00121f09007181010054e00302aaf30302aaf40301aacaefff9720020037750240f9a80640f9160101eba2020054e80f41b", - "2BL8;FF06000014ed031faa4e815ff80efdffb5eeffff17ed031faaa90109ab62030054280108ab02020054096840b989010034290140b22911c0da291540d2290d098bL8;FF09692138ead302f9262a0094e1431691a70d0094e0a349f9800100b4e1d342f9e8cb42f91f0101eb406b0054e8cf42f90901", - "80522a04009109692138e1431691BBBL4;FF1f0500f1600e0054bb8353f8e80f40b9e10317aae20316aae0031baa1c7da80a17b00194a80351b8493340b8e23fc03deb2b48a97b5a02a968ea00b9e88b40f9L4;FFfd7bbfa9fd030091fd7bc1a8c0035fd61d0080d21e0080d2e003009121dbff902100009", - "11fec7c9201000014e20300aa240000f0230000f0200000f0849040f9L8;FF17b00094e11340f9f50b40f9fa430e91810000b4e01740f92200805210b00094e11f40f9810000b4e00740f9220080520bb0009468008052400bc03d49f342f8BL8;FFe0032d918ee6ff97e1fb42f93f0400b180140054fa43", - "40f9fb830291810000b4e0ff42f9220080520d300194e8c317910081009182e6ff97c80080d29c000014L8;FFe8f341f9f6d743b9f5031faaf7d343b9f8ef41f97a008052e85b00f9c80080d20800f0f20a49009166f8ff17fafb41f9b7028052a8028052e85b00f968c65339BBBBBBL4;FF135041a98802", - "40f9680000b4e00313aa00013fd6810640f9c10000b4820a40f9e00313aaf44f41a9fd7bc2a80c180214f44f41a9fd7bc2a8c0035fd6fd7bbea9L4;FFf44f05a9fd030091ff0740d1ff0300f9ff0740d1ff0300f9ffc327d1f30302aaf70303aaf90301aaf40300aaa20000d042a03191e0431391e10313a", - "ae3008052L8;FFf96300a9a873003932180194a0000035d60600f1c1feff54e0031f2a0200001420008052f44f45a9f91340f9f65744a9f85f43a9fd7b41a9ff830191c0035fd6BBL4;FFa8831cf8e0180054550080d219210091b7e303d1faa306911500f0f2380080520e000014480080d229008052080", - "0f0f2692200a971010014a2e300d1830c8052L4;FBf8cb490000000000180000000000000008000000000000000ccc49000000000088cc49000000000098cd490000000000002f6465762f6e756c6c001443616e6eL8;FF4901084aaa435638a92316386901084aab535638a93316384901084aaa635638a", - "94316386901084aab735638a95316384901084aaa835638a96316386901084aBBBL4;FF2200805216d80194e8e3009100c10091c6bfff97e00314aae10313aa022b805217d80194f44f56a9fc9340f9f65755a9f85f54a9fa6753a9fd7b51a9ffc30591L4;FB6e74756d726174636865742d623538643766", - "353665333634356363642f303639353962342f7372632f76312f756e6368756e6b65642f73656e645f656b2e7273L8;FFe00316aaefdb4aa9e60307aaec0315aae7030baaeb0317aafa030faaf50305aae50312aaef031eaafe0308aae8030eaaee0311aaf1031baafb030aaaea030daaBL8;FF1f0101eb0", - "0030054e8cf42f929040091e00318aa19692138e9d302f9e11a0094e1431691ba110094080340f91f0500b1a0000054e243169120008052e10318aaL8;FFa02302d119f5ff97800a003621f8ffb4dc01001401c30091a22302d135f4ff9780f7ffb49c010014a22302d1830c8052fcecff97e0f6ffb4ea00", - "001401630091BBBBL4;FF800600ad820a803d68920039f44f49a9f65748a9f85f47a9fd7b46a9ff830291c0035fd6000180520103805224f80194000400b00040199120f80194ff8302d1L4;FB2073657373696f6e207769746820646973747269627574696f6e20494420c0000c73657373696f6e20666f", - "7220c01d2068617320696e76616c69642072656769L8;FF160101eb02030054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e0030091fcedff97e10300aae00301aaf44f45a9BL8;FF1b000014a0031cf80103009021182e910303009063082a91a00301d1620", - "280524401805212000014a0031cf80103009021182e910303009063802e91a00301d1L8;FF08812f914df0ff97e8f34df91f0900f1203c0154e0074091e10740910232805200c0359121802f91f443259114780094fc074091e00740919c83099100c03591BBBL4;FF00018052e10319aa22b80194800300", - "900040169115b80194800300b00040299112b80194800300d000e011910fb801948203009042c03291e10303aa0db80194L4;FD24094300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000L8;FFcf19", - "4092ce1d0013ef21cb9ae90109aa620500546b1d0091eefeff37280000146c0400f1400900549f2900f14d018052eb031faae9031faaea031faa8c318d9aBL8;FFce194f8bdf010deb230300548c0500f1ed030eaa81feff54ca010aab220200542801088b480108ab8202005409804039000509ab220200", - "54fd7bc1a8c0035fd6L8;FF618202f958fdff17f86340f9ea4340f9f6fe60d368c6533955ff48d3280d00365c000014f85745f9fb4740f9e93b00f9e84300f9bc0000b4e00317aae1031caaBBBBBL4;FFe00318aae30319aa2801088be90b40f9e82a00a928fd60d3880a00b5280940921f1900f1220b005", - "4217d0353c10b00343f080071ac0100543f040071e0030054L4;FF08fd63d308d1091be90b40f908051c32286935386a0a00f9f44f44a9f51b40f9fd7b42a9ff430191c0035fd628008052f5031faae1031faaffa300a9ff0f00f9L8;FFffc30091c0035fd6080840f9280100b4090140b22911c0da29154", - "0d2290d098b292501910819498b00050091c0035fd6e0031faac0035fd6ffc300d1fd7b02a9BL8;FF797200a9683a00b9e81b40f969b203b8e90f40b97b2201a9e87b40b969020139e9fb4079681204b8e8c3413969520478e92340f9685e0139697204f8e82746a9L8;FF42c03691e10314aa1a88009460", - "0100d000c02f916301009063602491640100d084403091a24700d1210380521c880094630100d063002d9120008052e1031faaBBBL4;FF110000145f2800f1880000542800028b08f1df38e80bf837e0030291a9310094e88340b9c80d0037e84b40f9ea0240f9490108eb633c00540a0340f9fa4740f9L4", - ";FB000d0d160d007c494c059ea36eca27c5617373657274696f6e206661696c65643a206b65792e69735f6e6f6e6528292f636172676f2d6769742f737061727365L8;FF01f17dd316c80094795a01a994000014f80301aabf0600b1c0350054960100b49722009104000014d60600f1f7620091e0000054", - "e1825ff881ffffb4e00240f9BL8;FF800640f92200805215480194810e40f9a1fdffb4801240f92200805210480194e9ffff17f44f41a9fd7bc2a8c0035fd6ff8300d1fd7b01a9fd430091e10b00a9L8;FF62000054fd7bc1a8c0035fd6000100b000e0149115480094000100b0008012911248009400010", - "09000e032910f480094fd7bbda9f65701a9f44f02a9fd030091BBBBL4;FFc90300f029d50591692902a9290080d2691bc0f2687d01a9682504a91ce80194fc9740b9f47f40b9880280d249008052dc5202290800f0f2c90200b9080540b2L4;FB28000000000000000800000000000000a89740000000000", - "03c2040000000000030000000000000000800000000000000d0984000000000009020400000000000L8;FFd3e7ff97a01e0036c12900b410020014e8cb40f91f0500b101010054ff6f19a9df7e04a9fcdb00f9ffdf01b9df7e06a9df8205f8df0207b81f0800f1812f0054BL8;FF2f680194fd7bbda9f50b", - "00f9f44f02a9fd030091210300b4090040393f210071810300543f8418f121040054f50300aaf40308aa0668019400c4805221008052L8;FF1a0380d24001009000f8099108210091e1430691ea2f19a9e90702f91a00f0f23e680094e81f40b9e8030639e10740f9c1f7ffb527feff173c008052e843069", - "1BBBL4;FF2b9bff97a1035cf8e7feff17a04301d1e10319aae20313aa2300805224008052239bff97b9035cf8a8035bf8080119cb7f0208eb49ddff54a04301d1e10319aaL4;FF080c80d200e00791612a00b9010000d4240000b0e30300aa62e20191210000b0840041f9212007910000805273ce00a964", - "0e00f9632200b9623e00f9614e00f9L8;FF8003148be20319aa1da800948802190ba8f31438290080521ffd0071ba0218cbe803082ae9830039a0050054aac303d1496928380805001137000014e10740f9BL8;FFe8d341f9e9d741f9eadb41f9f0830c91ebdf41f9ece341f9080dc0daede741f9eeeb41f", - "9290dc0daa0833badefef41f9a04302d1a0833cada0833dada0833eadL8;FFe00314aa0201805201f17dd3142800943a008092a2faff17a0c300d1e1031aaae20318aad0eaff97ba035ef83cfcff17a0c300d1e1031caa02048052caeaff97BBBBBBBL4;FF620d40ad010101ad020d00adbbfaffb5210000", - "14090180520801098b292100910801148a206b68fc00a8200e0a00669e0afcffb5f9ffff17200340fd00a8200eL4;FFf65704a9f44f05a9fd030091ffc30bd109404039290a0037160440a9f30300aae0630591f40308aaf90305911c130094f50f56a9e0c30591e10316aae20315aaL8;FFfd430091f303", - "00aa930200376142009100008092744200917d1c01941f0400f1010300549ffedfc8610640f9a104f8b7600240f922008052091c0194e00313aaBBL4;FFa81544d3edd701a9e81700f9f42b00b4e81340f9e91b40f92801088b177d0091eab344b9ebaf44b940430091e8a344b9e9a744b9a18301d16b010", - "a0becab44b9L4;FFe00304aa480c80d2011080d2030080d2010000d41f9800b140feff5480fc5f8880feff3585fc0088a0ffff3520008052c0035fd600008052feffff17fd7bbfa9L8;FF280108ab220a0054090140b22911c0da291540d2290d098b2925019129fd46d30801098b080500911f0109eb490", - "90054091c40f93f0500b120060054096840b9BBBL4;FF08d30039e8a7442909d7003908db0039e8a7432909df003908e30039e8a7422909e7003908eb0039e8a7412909ef003908f30039e9a3402908f70039e85341b9L4;FBc00019696e76616c6964207769726520747970652076616c75653a20c00013", - "696e76616c6964206b65792076616c75653a20c00013696e76616c696420776972L8;FFe9f741f95f0900b1e9fb00f961000154e8fb40f9772201a908008092683e00a98c0e00140823403908051f121f09007141020054e0031d9181220091032b0091BL8;FF02788052fb0300aa1d5c0194e09bc43de19", - "fc43de0031caae2a3c43de8c34ef921058052e0ff833de05fc73d22008052e103843de207843de0f3863de8eb0df9L8;FFff0301d1fd7b02a9f44f03a9fd830091480001aba2020054010840a9f30300aae023009129f87fd31f0109eb0881899a090180521f2100f11481899ae30314aaBBBBL4;FF08fd0", - "a9b5903088b280306d1080140f9ff0208eb81010054282306d1e00316aae20317aa010140f923fc0194c000003528e305d1e92f40b9080140393f01086bL4;FB00001b1b1b1b1b1b1b1b1b1b001b1b1b1b1b00131b1b001b000007000082775f19328d6db5d6cb6d0b4c24000000c3009d00ad0057000001", - "2401bb004d017300L8;FF3f0c0071210700541f0800f1410d0054e1230091e20313aaffdf00a9ff0f00f9e7faff97a00d00b5991640f9880e40f93f0308eb61000054806200919cfb0094BL8;FF177c0194610e40f914008092740200f93f0400f18b000054601240f9220080520f7c0194740e00f9f44f4", - "1a9fd7bc2a8c0035fd6fd7bbfa9fd030091080040f9L8;FF965640f91f0101eb80390054e81340f9490480522a040091e00315aaea1700f909692138e16300915a7cff97f71740f9e80f40f9080117cbbf0208ebc8380054BBBL4;FFe00318aae10317aa08000014990640f9b2ffff17e10740f928008092", - "686a00a9810000b4e00316aa220080520cbc0194880600d11f0d00b1a8f8ff54e00315aaL4;FB0800000000000000901b480000000000fa8749000000000075000000000000006d00000026000000636f696e7300000000000000000000000000000000000000L8;FFc302005468008052c90100f0293132", - "91e82707a9c80100f0086131912a0d8052ff2704a9c90100b029c10491e82b09a90a0b8052e92b06a9290080d248038052BL8;FF0825019108fd46d308050091090c40f93f0500b1400400540a1440f9092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091L8;FF756", - "641f9e80240f9208709ade95303b9680000b4e00315aa00013fd6e10640f9810000b4e20a40f9e00315aa0c3c00949f0b00b101050054e00313aa088c4ff8BBBBBL4;FF6b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0500912801088b49010b8be10313aa0001098b1ef8ff97380200351c000014e", - "8031faa978640f9d7fbffb5L4;FF1f0c0094d702f8b6f4031faae00314aae10317aa1f0c0094e90f41b206000014e91741b204000014290480d2e80317aa0900f0f2692200a9f44f4ca9f6574ba9L8;FFf30308aa21020054e0230091e10315aac2faff97e823403988010036e89340f8e91341f8684200f", - "80800801269c200f8680200b9f44f44a9f51b40f9fd7b42a9BL8;FFe20315aa1e8c0194e80316aa8902158be90f00f9e083c03ce90f40f90001803d090900f9f44f45a9f65744a9f85f43a9fd7b42a9ff830191c0035fd633008052L8;FF408200b4128c00944000805241008052108c0094e06700f98081", - "00b40c8c009440008052410080520a8c0094e06300f9c08000b4068c00944000805241008052BBBL4;FF2f00805202000014ef031faa292100912001158b15000d8ac96975fc208d282e0800669e19c101f2c1f9ff54e7ffff1780077fad28008052810240f968020039L4;FBda64d174cc44c75415b41ea", - "40394088439f432e42fd424c44d3446245b14500461746a6477547c4434c73fd722e729f7188713970ea705b76c4767577a677177L8;FF1f0112f1015200543f0700b1c0530054e95b00f9f50314aaf4db42f9e9e742f9e8eb42f9f66300f9e82300f9e97700f914e900b406cc0094e00314aa21008052BL", - "8;FFfb0300aaf80b00b99a0400b4fb0300f90f4c0194e0031aaa210080523b0080520c4c019440f8ffb4fb0340f9e2031aaafc0300aae1031baa114c019418000014L8;FF090840f9290b00b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091091440f94801088b090100b42a0140b", - "24a11c0da4a1540d24a0d0a8bBBBBL4;FF13ec0194008c81522100805211ec0194200400b481060091028c8152f30300aa148c815216ec019428008092b3d200a9a80200f9f44f42a9f50b40f9fd7bc3a8L4;FB53656c6653656e64556e6b6e6f776e5365616c656453656e6465725365727665724365727", - "46966696361746549644261644b454d4b6579547970650000000000L8;FF80010034610a40f9680240f91f0101ebe0050054680640f9090180522a0400916a0a00f909692138e10313aa59ecff97801e40b980010034610a40f9680240f9BL8;FF19230091f6e3019137008052e83f00f9ffc300b9ffcb00", - "b9e84b00f9e85700f9b8031cf809000014c1520191a20301d1e556ff97401200b5b8035cf8f90318aaL8;FF0083893c01838a3c810000b4000740f922008052126c0094a0077dad7b0200f9e8a743a96082803ca003dc3c6182813c6082823ca1037bad092300a9e81b40f9BBBL4;FFf50306aaf40305aa2", - "3390094e84b40f91f0500f1c0230054fb430291e00317aaf90300916083c63c6183c73c6283c83c6383c53ce00703ad6083c13c6183c23cL4;FF680240f994fe41d3080115cb9f0208eba8020054b40000b4680640f9e20314aa0001158b130e0094e0031f2aa802148b680a00f902000014e0031f2af44f", - "47a9L8;FFe85f01f9e86b01f9e87701f9e88301f9e88f01f9e89b01f9e8a701f9e82340f9e93f01f9e90340f9f87b01f9181140f9f76f01f9b70301d1ff0701f9ff1301f9BL8;FF172c0194400745ad160080924233c03de85345f9800705ad400743ad8233803de8bb02f9800703ad420344ad820304ad4", - "10341ad810301ad420342ad820302adL8;FFa1035df8616400b526030014a8035df808011acb7f0308eb287e0054bb0400b420031a8be1031caae2031baa142c00945a031b8be0031caae1031baa22008052BBBBBBL4;FF1f2900f1880000542a01088b4af1df384a03f837e0030091e10309aae20308aaa", - "87d0094e80340b9c8000036e00740f9f44f44a9fd7b43a9ff430191c0035fd6L4;FF1807001412140094e0031aaa210080521014009440e900b4e1df40f9e2031aaaf90300aa16140094e0d7c53de8e351f9f8431391e9b34bf9e0431391e1031faaL8;FF31c200513f2a007122fbff54cdffff1730320f2", - "acf0d009111c200513f2a007162faff54c7ffff173f1100f1c00200543f0500b180100054480080520a018052BBL4;FF230000141f090071e10b0054080180d229df78920800f0f2080140b25f000014e00317aa466c0094fa0740f9f70301aaf80300aa5b0315cb3f001beb48130054L4;FD84d04900000", - "00000d0c049000000000058c049000000000018304a00000000000000020000000000050000000000000000000000000000000000000000000000L8;FF1f3000f93f0400b140010054810000b4601e40f92200805211940094612640f9810000b4602a40f9220080520c940094080080927f0a00f97fa202", - "a9f30b40f9BBBL4;FF22010014a0a302d16cd50094e80300aae00301aae8de0736401600b5f5031faa71feff17a0a302d164d50094e80300aae00301aa48e8073660fbffb483000014L4;FB911f4900000000005600000000000000560000000900000073686f756c642062652061626c6520746f2073656", - "e6420656b00000000000000911f490000000000L8;FFe87700f9e8030eaaee0311aaf10317aaf74f40f93d060014e8fb41f9e90742f9f0030aaaeb0b42f9e3cf42f95f0500b1e8e700f9e80342f9fcff41f9e9ff00f9BL8;FF09fd46d30800098b080500911f0109eb68280054e002009000200891135401", - "94e8031faa000119ab42730054e1431691b70d0094f90b40f9df0a00b100040054L8;FF28008052eac32291e96f06f9a04700d1e1833291e95706f9090100f029ed0c91e86b06f9080100f008011391e96306f9290080d2e87b06f9c80480524941c0f2BBBBL4;FF110000145f2800f1880000542800028b", - "08f1df38e806f837a0e300d1a95d0094a8835cb8480f0037a8835df8ea0240f9490108ebe32700544a0340f9b4035df8L4;FB20636f6e7461696e2044656372797074696f6e4572726f724d6573736167650a25080212210539450d63ebd0752c0fd4038b9d07a916f5e174b756d409b5ca79L8;FF430c80", - "527cedff9760f9ffb4c0ffff17a80640f91a0101eb020100547d000014e10314aae20313aae5f2ff97401100b5e1031faa010b00b5a80640f91f011aebBL8;FF82000054087d0453290b0091050000141ffd0071a9010054087d0453290f0091684200397f2600a9f44f54a9f65753a9f85f52a9fa6751a9", - "fc6f50a9fd7b4fa9L8;FFe3ffff17e043169122008052fd170094e1d342f9e5ffff17f85f49f9580300b4e1d342f9e8cb42f9f95b49f91f0101ebc0bf0054e8cf42f9490480522a040091BBBL4;FF32b40194000200b4e10313aaf30b40f9fd7bc2a8c0035fd6000440f9e10313aaf30b40f9fd7bc2a8c00", - "35fd60cb4019420008052e10313aaf30b40f9fd7bc2a8L4;FB10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L8;FFe92300a9e30b00f9971200b410b40094e00317aa01018052180180520", - "db40094e30b40f9f60319aaa0fdffb4d91100b47f0303ebe8031faaed33839a6a030dcbBL8;FF02018052e9ab0cb9e85306f9a1f4ff97f3f742f9e8ef42f97f0208eb61000054e0631791086bff97e8f342f909068052e02bc33de12fc33de233c33d6822099bL8;FF38ffff17a88357f8080540f9160101", - "eba32a0054a88357f8080540f91f0116eb69090054a02302d15af4ff972032003728fc60d3280f00b5200840921f1800f1BBBBBL4;FF2bc1cbca4901098b6801088b2abdcaca2981c9930badcbca4801088b6901098b0acdcaca0881c8932bc1cbca4901098b6801088b2c81c99329bdcaca0badcbcaL4;F", - "Fe08f41f901ed7cd322020014f78b41f9ff0600b120440054f48f41f9bf0a00f101f6ff54880640f91f1100f1c1420054880240f96aae8c52ca8dac72090140b9L8;FFc1825ff881ffffb4c00240f92200805213040194f8ffff17680e40f9280100b40805088be00314aa01f17dd302018052f44f42a9f6", - "5741a9fd7bc3a808040114BL8;FFe82700a9e8030091090000b029011f91200440a9e82701a9e8230091090000b029811a91e82702a9e343009129840194fd7b43a9ff030191c0035fd6202040a9L8;FFc0120091e10316aa178400942e00805288070091d8020079db060079a80a00f9b0ffff17e00315a", - "a66cdff972e008052d2ffff17e00315aa62cdff97a80640f9BBBL4;FFff7e07a9fa3b02f9f84702f9fffe08a9f85302f9ff5702f9f55b02f9f58f02f9f5a702f9ff7e16a91f0800f1011e0054b4835df8820640f9621f00b4810240f9L4;FB656d6f74655f6964656e746974795f7075626c696373656e64", - "65725f636861696e72656365697665725f636861696e7370656e64696e675f7072655f6b657972L8;FFc122019102298052e093803de9a306a9e9c743f9e8d343f9e93f00f9e9435e39e95f00b9e903099128f100f814c40094efc31391a092c83ce1b7c13de2bbc13dBL8;FF4403805296000014c90080d", - "2e8430039480080520900f0f2e8470039e90700f9ddffff17e00700f9c102009021200a91c302009063340a91e0230091a2008052L8;FF8112c03de8bf40f97a0200f98002803df45744a9e8ab00f9610a803d6082803c680e00f9f50000b4f30314aae00313aa3b030094b50600f173a2019181ffff54BB", - "BBL4;FFff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb230d01541803008bf9feffb50f0000141f0400b1L4;FB17010000110000006c69627369676e616c5f70726f746f636f6c3a3a747269706c655f72617463686574696e76616c696420", - "726563656976657220636861696eL8;FFf38743a9e00313aa88e2ff97d40000b488e279d3e00313aa02018052011114cb0fe40094e12740f9810000b4e02b40f9220080520ae40094df0e00b160000054BL8;FF77b200397bb600397af202b8783203f868ee00397f5a00a97dffff17ff0a0071010100541", - "7dd7892091f0091fb03082a06000014f7031faa091b009103000014L8;FF7a640094420700b4fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd0300914804028b49008052f30303aa340d002a3940009118f17dd30b000014680640f9BBBL4;FF42a00f916104805246a40194fd7bbfa9fd030091e803", - "1faa4900018a006869fc00a8200e0a00669e2a0100b51f2100b1a003005408210091220108abe3feff54L4;FFdeffff17fd7bbaa9fd030091f76303a9177c4093f55b02a936000090c3021091f96b04a9f90301aae12a0091f50317aa627861f8421200b4401840b9800e0035L8;FFe00301aae10308aa82", - "02805252a40014ffc300d1fd7b02a9fd830091e00700f9200440a9e8230091090000b029913591820100f042e00a91e3430091e82701a9BL8;FF0b050039ac1500330bf040f80a2100390ab040b80b3901a90a0d00b90c810039c0035fd649008052010900f9092100392900805209010039c0035fd6e003", - "01aaBL4;FFe80313aaeaff0039e00741ade00700ada6fafe97e00740ade0030091600601ad3b240094fd7b44a9f32b40f9ff830191c0035fd6ff4303d1fd7b08a9f94b00f9L3;FB7f454c460201010300000000000000000200b7000100000010c04900000000004000000000000000c8f30e00000000000", - "0000000400038000b00400014001200BBBBBBBBL4;FF1a1e02946004009000201191171e02946004009000801191141e0294ff8302d1fd7b04a9fc6f05a9fa6706a9f85f07a9f65708a9f44f09a9fd030191150c40f9L4;FF880e00f9810000b4e00313aa22008052131e0094f44f44a9fd7b43a9ff43019", - "1c0035fd60a1e0094c002805221008052081e0094400200b4c800009008653491L8;FF8002009000201491181e01948002009000801491151e0194ffc300d1fd7b01a9f44f02a9fd430091f30300aa144000910140009100008092751e01941f0400f1BBL4;FF0a038052c852089bf6e300912b008052e02", - "31291c182009129310a9bffff06a9f7231291ebff03a9ff3f00f9f4a304a9eca705a98c120094e84742f91f0900b1L4;FFe08702a9e21f00f9a6ffff97e0c30191e5830191e3008012e00304a9e52b00f9e37f0b29e01740f9e10b43a9e43740f9e7ffff17fd7bbea9fd030091f35301a9L8;FFa8831ff86", - "39e0094b30100b073a20391810100d021f41491a32300d142008052e40313aab4831ff85a9e009488620091810100d021f01b91a32300d142008052BBBL4;FF80020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300eb434d00541803008b060000141f0400b1c", - "14c00542bde0194L4;FB4f00000000000000f10300003300000062225c6e5c725c745c30025c78c320000069020000226578706c696369742070616e696300000000b100490000000000L8;FFe0b343f92200805215de0094e1bb43f9810000b4e0bf43f92200805210de0094e8031d9100410191dcd7ff9", - "7891000142ea0c0a92a7042a9190340f920d05ba9BL8;FFe00700ad080dc0da881e00f9820241ade20301ad455e0194882648298a2e49299682003980a20191e10300910809c05a2909c05a9f9202f8882600294809c05aL8;FFfd03009148008052f50301aae10302aa000d002af30302aaa5fbff97b732", - "40b9b70c0034e80240b20811c0da081540d2080d088b0825019108fd46d308050091BBBBL4;FF32c201f2a00100545102c0da3112c0da110e518b31020b8a31fe0e9b5101118b20025ab8df02006ba0030054510600d1320212eaa1feff54ff0500f100010054L4;ZFL8;FFc0035fd6e20313aa430c80527", - "af7ff97e10300aac0feffb5a80640f91f0116eba9040054e00313aac9fdff9700fe073728fc60d3080500b5200840921f1800f1BL8;FFf40300aa3b570094e84340391f050071e1000054e86340391f0500714c04005428050035e90f41b230000014e81341b8e91740b9eac34039800640adec334079L8;", - "FF09fd46d30800098b080500911f0109eb6811005486000014e00315aa53daff97080040b20811c0da081540d2080d088b0825019108fd46d30900088b37050091BBBL4;FFe8bb40f9080114cbbf0208eb49faff54e0c30591e10314aae20315aa230080522400805222b1ff97f4c340f9caffff17e05fc0", - "3de8c340f929008092ff0600b1L4;FB2d7461726765742f616172636836342d756e6b6e6f776e2d6c696e75782d676e752f72656c656173652f6275696c642f6c69627369676e616c2d70726f746f63L8;FF2200805216be0094610e40f9810000b4601240f92200805211be0094611a40f9010100b4601e", - "40f922008052f44f4aa9f65749a9fd7b48a9ffc3029108be0014BL8;FFe90313aaf54f43a9f75b42a9fb0f40b9f96341a9fc0340f9060000143c008052542340f9b4031df874f1ffb509018052a8035df8755a00a9755e01a9785e02a9L8;FF0bffff17e90b41b2e9a300a910ffff17c80080d20800f0f20", - "80500d104ffff17c80080d20800f0f20809009100ffff17c80080d2e10b00f90800f0f2080900d1BBBBBL4;FF480f0054680640f9e10316aae20315aa0001178b1a0e0294e802158b680a00f9951640f9350300b4610a40f9680240f9961240f91f0101ebe00f0054680640f9L4;FFe87b40f9e0cf803d08", - "0308aafc9302f9e87b02f9e8a74fa9f73b05b9fa4305b9e88302f9e8c740f9e97f02f9e90342b9e80b05b9e8af40f9f6af02f9e88b02f9L8;FF2000805201028052220e0194e90300aa00a840a95f4100f1210100540000c03d0a0080120041803c210140f90a0100b9010100b422008052090e01140a050", - "0f9BL8;FFe00316aaa08640ad740200a9e0031faa608600ad04000014e0031faac0035fd660c305d1f44f4aa9f65749a9f85f48a9fa6747a9fc6f46a9fd7b45a9e923446dL8;FF0821019108fddf88a8020035a80100d008e14039210040791f05007181040054e2031f2ab6e7ff9709fc78d38801009008", - "a13a910afc60d3097969784921094aBBBL4;FFe81f40f9080118cbdf0208eb481e0054e82340f9e10317aae20316aa0001188b17ce01940803168be82700f9a80a40f9480f00b4a90640f919e97bd333610091L4;FB39795cde26cba649360fb4b9d0c335297ca5adaaacd19f14ab28b8e6eae448b290f77", - "52b1fbaf412c6b8732cac9be552e6e3a28c6ece7869562992840000fab4L8;FFe00b44a9f43748a9f54700f9e8d300f9ea2343a9e7f346a9ed6b00f9ed0740f9ea7b00f9eafb40f9eefb00f9ee0309aae9eb40f9eae700f9ea8f40f9e99b00f9BL8;FFe00315aa829fff97e8cb40f98082c53c8182c63c82", - "82c73c1f0500b1e00600ade20a803d200c0054f91300f9f9430691fbe300912083cc3c2183cd3ce81f00f9L8;FF400745addf0a00b14233c03de85345f9800705ad400743ad8233803de8bb02f9800703ad420344ad820304ad410341ad810301ad420342ad820302ad410340adBBBBL4;FFe20316aaf703", - "00aa1dee01940600001435008052f61640f93a00805256feffb537008052090340b2e8031faa7f0a00b12911c0dafa630629291540d2f35700a9L4;FB019d4800000000004d0000000000000018000000260000000000000000000000040000000000000004000000000000003cc44200000000007475706", - "c65207374L8;FF800700b5e1031faac4ffff17e1031faa883200f9c1ffff17e1010054e1031faab6ffff17c80080d2e10700f90800f0f2080900d1a6ffff17e80b41b2e00700f9BL8;FF08fc43d3040300b084602591696abcf2e1031f2aa974d3f28918e4f2087dc99b09488852e901a07202fd44d3087d", - "80524880081be0031faa037d091b386e0114L8;FFe1d342f9e00316aac6f9ff17f60300aae043169122008052fa110094e1d342f9e00316aaccf9ff17e043169122008052f4110094e1d342f9fff9ff17e0431691BBBL4;FF28008052fbe702a9194440f91fa007a9a80301d11f4400f9e00309aafa9303a", - "9e59b04a9e3930139e25306b8ebb307f8ee0f0239f18700b9f24700f9f0230179L4;FFb4835ef8e6ffff17155300a91c0b00f909000014f60315aa08008092080300f9b60000b4e00314aae10316aa220080524cfeff97e003132a1e11009403000014L8;FF6b05000a2a0b02132c1705130801000a2d130", - "413290d000a08010b4a4a09000a8c15000aab8f7c29ae1a000a114011539227000a2128000aad11000acf1e000aBL8;FF72ffff17f46f41f9e8c31791e91f46b900c1c03c01c1c13cf5fb45b9880240f9f36b41f9e97305b9e057813de15b813d680000b4e00313aa00013fd6810640f9L8;FF20013fd6fa", - "034bf95f0f00b12102005468008052f5e742f9e8e3163949008092f4e342f9690200f9a80240f9680000b4e00314aa00013fd6a10640f9611300b4BBBBBBL4;FF1f2900f1880000542900088b29f1df388918f837e0230091e20308aaa97f0094e80b40b908010036e00b40f9f44f4da9f6574ca9f85f4ba", - "9fd7b4aa9ff830391L4;FF4083c33c4183c43c090080924283c53ce01b813d4083c63ce11f813de1efc83de223813de2f7c83de027813de0f3c83de12b813de02f813de233813d92000014L8;FFfd7b01a9fd430091e00302aa610200d021402391e8030091020280525c160194e00300915c160194fd7b4", - "1a9ff830091c0035fd6ff8301d1fd7b01a9f91300f9BBL4;FF5f114071630a00542918c0392b1d00124a390b0b4a1140510901f83708710a8bea00805208a800a91f0000f9fd7b44a9ff430191c0035fd65f01487103090054L4;ZBL8;FF21481491840100f084600991e0030091a3630091a2008052a80f", - "00f95d9600946862009181010090215c1491840100f084e00991a363009182008052a80f00f9BBBL4;FF600640a9ca0300904a61199109040091400540ad690200f9000500ad000502a9f44f41a9fd7bc2a8c0035fd6f40308aa1cd60194e80314aa29008052610600f9L4;FB696f6e696e6e65726368616", - "96e0000003c1b49000000000047000000000000001d0200001400000073686f756c6420737570706f727420616c6c206c6f776572L8;FF2aac43a9e92b1fa929a044a9e8cf00f92aa045a9e8c300f9283440f9e8ab00f9283840f9eb2312a92ba047a9eba71aa9e84f00f929a048a9e95300f9e8df00f9BL", - "8;FF0900088b3a0500915f0308eb4832005401020014e1d342f9e8cb42f91f0101eb408b0054e8cf42f9490a8052f4074091948209910969213828040091f67749f9L8;FFe05306f9e08332912101009021803691a20180522301009063a431910401805222000014c80080d2e0a33239e08332910800f0f", - "2ffa73239e85306f9f94bff97BBBBL4;FF1f0d00b1e1020054880200f96800805227000014765e40a9f50301aa0cf6019400038052010180520af60194e00400b4080400f008613a91e10315aa165c00a9L4;FB65745f7374617465696e76616c696420726f6f74206b657976616c6964205072697661746", - "54b657953656e6465726b65794d657373616765506c61696e746578L8;FFe0030091e20080528400805247ebff97e10340f9c6ffff17e80f41b2c0ffff17c80080d20800f0f208090091bcffff17ff0302d1fd7b03a9fa6704a9f85f05a9BL8;FFe2008052a80f00f96276019468a201910103009021601d", - "91040300f084200d91a363009102028052a80f00f959760194686200910103009021542491040300f0L8;FF690200f9bb100094a80600d11f0900b163010054ab000014e80180520900809268220039e0430691690200f9b1100094a80600d11f0900b142140054e0031baaBBBL4;FF0a0c00910a250ba90", - "a1000910a250ea90a1400910a2511a90aa10591000500ad008501ad000503ad008504ad000506ad008507ad400500ad0ba518a9f44f42a9L4;ZDL8;FF680200f9f44f42a9f50b40f9fd7bc3a8c0035fd6ffc302d1fd7b08a9f65709a9f44f0aa9fd0302915f8000f1e20300f941060054680040b91f05003", - "1e0060054BL8;FF14360194e01001b4e10313aae20316aafa0300aa1a3601941c000014e8c31791e00313aae935019469624039a80200b008951891ca028052e80b03f9f5fb45b9L8;FFe94f40b9e8cf05f9e81f40b9e9cf0bb9e92b40b9e8a30bb9e80340f9e9d30bb9e9b340b9e8db05f9e81b40b9e8c3", - "0bb94800805208018a1a1f01096be82f40b9BBBBBL4;FF1f0002716200005435008052070000141f0020716200005455008052030000141f404071d536969ae80740f9080114cbbf0208eb28040054e80b40f91f000271L4;FF29050091b61640f92801088b360200b4c90240b22911c0da291540d2290d0", - "98b29250191c91a498b29050091280108ab4301005409010014e8031faab70a40f9L8;FF4200805216060194683240f9a80000b4603640f901f57ed34200805210060194683e40f9a80000b4604240f901f57ed3420080520a060194684a40f9a80000b4BL8;FF280300b0080d1091954200390001c03d08", - "d140f89f5e00399f5201780000803d08d000f89f1201b80800f0d20900809280d601a9892200a9610240f93f0400f1L8;FFfa23019108000014a80359f8d6060091f70a0091df0218eb15693338b78319f8e01a0054c00e40920850b99b0a0940f92a0300b4080540f9c97e04535f0500f1BBBL4;FFf6570", - "4a9f44f05a9fd030091ff0307d1171c0012f503042af603032af403002afa0302aaf90301aaff1a0071fc0308aae51f00f9ac000054ff0a0071c0000054L4;FB6e2d6c696e75782d676e752f72656c656173652f6275696c642f737071722d383934636339653033313261616632312f6f75742f7369676e", - "616c2e70726f746fL8;FFf6831d91e8ab03f9e9af03f9641b0094e8b343f91f0500b120730054e83f00f9e8831d91e9a35d390091c03ce8bf43f9e0030e91e95f00b9e9030991c1820091BL8;FF7361193220010054536928380cfc5cd308050091290040f9280800f90c0200b500fc55d393000014e1030", - "0a9e00301aae10309aa220080520a060094e10340a9L8;FF3f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091BBBBL4;FF2200805216e60194e13740f9810000b4e02740f92200805211e6019", - "4e15340f9810000b4e05740f9220080520ce60194880280d2b40e00f90800f0f2a8ce00a9L4;FB726174636865742d623538643766353665333634356363642f303639353962342f7372632f696e6372656d656e74616c5f6d6c6b656d3736382e7273002f6361L8;FFe86301f92102009021a0179123020", - "090630c1891e0030b91420280526401805209000014e06301f92102009021a017912302009063381891e0030b9142028052BL8;FF6466019468c20191e102009021302a91e40200f084003091a363009122028052a80f00f95b66019468e20191e102009021201e91e40200f084803091a3630091L8;FF01", - "f57ed3420080521566009468b640f9e80000b460ba40f901f57ed342008052f30b40f9fd7bc2a80d660014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9BBBL4;FF4400805209000014a0031df86103009021382f9163030090638c2f91a0c300d1a202805244018052409b0094a0035df8bfffff17a0", - "c300d1a82b3da932830094L4;FFbfffff17630a40f9620c40f2600000543f000039007d20d460c05f3861d05f3864e05f782110001200010034640000345f000039007d20d464805fb8e0ff9f52L8;FF095d1053495969782001084ac0035fd6fd7bbea9f30b00f9fd030091f301009068e240391ffd0371", - "80000054f30b40f9fd7bc2a8c0035fd686a600941f047df2BL8;FF0200001449008052098500a92900805209010039f44f4ba9f74b40f9f6574aa9fd7b48a9ff030391c0035fd649008052030900f909210039f5ffff17e00301aaL8;FFfd7bc3a8c0035fd6e00313aaf60301aae10315aae20314aad3e8f", - "f97750a40f9e10316aaeeffff17281040b96800c8376800d0372a2600145b2600145b260014BBBBBBBL4;FF699284d248f07dd32949b2f28924c9f24992e4f2097dc99b080109cb2805488b0900809208fd42d3080500d10811c0da2825c89a17050091287cd79bff0308ebL4;FFe10318aa22008052151a", - "0094a1835ef8810000b4e00315aa22008052101a0094e003c03d280080529a6200a9996e01a9800a803d68320039f44f4ba9fb3b40f9L8;FF1f0400f1010300549ffedfc8610240f9810000b4600640f922008052101a0194e00313aa0105805202018052f44f43a9f70b40f9f65742a9fd7bc4a8081a011", - "4BBL4;FFeaab44b98b030b8b2801080b89e97c92a0033ead0809c05aa0039b3c7601098baa233529e8e31291f8e31291449a01940003c03de9031faae8430391e037803dL4;ZFL8;FF82008052e40314aab3831ff8619a009468620091810100b0219c1491a32300d182008052e40314aaa8831ff8599a00", - "94599a0094f44f43a9fd7b42a9ff030191BBBL4;FFf44f07a9fd8300915c2040b9f60302aaf80301aaf30300aaf40308aa0cda019400048052210080520ada0194e00d00b4c00640adf50300aa000400ade00318aaL4;FB29014701e1009201480071010000c7005d0098000a00fc001d01b600820141004", - "d01007c494c059ea36eca27c5006c4c5c24749464b03aa21632820854004121L8;FFe9f341f9eb1342f9e35f42f9f86742f9e84700f9e8ef41f9e06fc13df96b42f9ef7b42f9fc7f42f9e86b00f9e8f741f9e78342f9e08742f9e68b42f9f19b42f9BL8;FFe807409108810191e2ab843de09b843de19f84", - "3de0a500948083c23c8183c33ce85748f9f93348f9e06f833d8083c13ce173833d8183c03ce8eb06f9e06b833dL8;FF179a00b4f31f41f9115a0094e00317aa210080520f5a0094c00301b4e10313aae20317aae01300f9155a0094f32b41f9e83341f9f92700f91f0500b160080054BBBBL4;FF775a40a9", - "f50301aa11fa019400038052010180520ffa0194000500b4e8c20391e10315aa1f400039085800a92804009008a12991602201a9090d40f9e8030091L4;FB726f746f636f6c2f7372632f73746174652f6b796265725f7072656b65792e7273003c5472696d6d696e6720657863657373697665207265636", - "5697665725f63L8;FF04000014180700f139630091a013005421835ff881ffffb4200340f9220080520ffa0094f8ffff1728008092e1c30391e20313aafb0318aae87b00f9a6060094BL8;FF2af17d92290940921f010aeb42f9ff540b3041a90e3440a92f6868f86e010e8b08210091cbcdcbcace81ce93", - "1f010aeb8c010fcaad010c8bacc1cccaad010b8bL8;FFf71740f92afeff176001009000e03091167a0094f50300aae0630091220080522300805224008052be90ff97e11740f9e00315aad0fbff17f70300aae0630091BBBL4;FF06a3ff9708068052ff1300f9f82300a90800001428008052f40318aaff0", - "700f9e81300f9f32b40f9fc1b40f938008052aaae8cd22b4c8ed2a06301d1e8274ca9L4;ZBL8;FFa20241ad020001ad810240ad820ac03de02b813d8082c43c942240f9e127813de22f813de033813d61320054e16742f9e083139102788052e11f00f910ba0094BL8;FF0811c0da081540d2080d088b082", - "50191081848abe2090054180118ab020a0054390700f194c2019161feff54080317ab22070054c902158b080109ab62090054L8;FF810000b4020b40f9e00315aa143a00949f0700b1fb5f00f900380054e25b40f9e8032a91e00317aae10316aae3031aaaafc5fe97e84345f9f64745f9e94b45f9BBBBBL", - "4;FF22008052230080522400805228fdff97610a40f9e00318aa1bfeff17ffc303d1fd7b0aa9f95b00f9f85f0ca9f6570da9f44f0ea9fd830291280400511f390071L4;FFe90741b20001c03d08e140f80000803d08e000f8c8028052692200a989008052602201a9880000f008e92e91682602a9e10f40f", - "981faffb4e00315aa22008052L8;FF081540d2080d088b0825019108fd46d300050091c0035fd6e0031faac0035fd6fd7bbea9f30b00f9fd030091f30300aa070a01940009805201018052050a0194BL8;FFe9031faa18070091081d4092390108aa2800805278e600a968020039b60000b4e00314aae103", - "16aa220080520c8a0194b50000b4e00317aae10315aa22008052L8;FF148a0094204200b42800805213000079130300a9e80f00f9130b00f933fb7fd30b8a0094e00313aa41008052098a0094804400b4f5031faaf40b00f9f94b01f9BBBL4;FF230080522400805229bdff97b7035ef8ba035df817ffff1", - "7a0c300d1e1031aaa22008052230080522400805220bdff97b7035ef818ffff17a0c300d1e10317aaL4;FB0800000000000000fcff450000000000000000000000000008000000000000000800000000000000d80046000000000000000000000000000800000000000000L8;FFed6f40f9e56740f9fe174", - "0f9f56340b9e3b7803dee2749a9e20713adf16748a9e83f00f968018052e0a3803de43f43a9e0cb44a9b9040014e8c341f91f0500b1BL8;FF01f57ed342008052154a0194688640f9a80000b4608a40f901f57ed3420080520f4a0194689240f9a80000b4609640f901f57ed342008052094a0194689e40f", - "9L8;FF080c43f81f0900b1010b0054f3031faa64000014e80300aa098d40f83f0500b180160054f30300aae00308aaf7feff97e80300aae00313aa090140b22911c0daBBBBL4;FFfa7316a9fb5317a9610205adf86718a9f55f19a908010054e14340f96002019117ea0194e80f40b9f9c30891e87f07392", - "0000014f44340f92800805260020291L4;FBe47a4200000000004572726f720000000000000000000000080000000000000008000000000000004c7f42000000000000000000000000000800000000000000L8;FF64eaff97803e40f9800100b4610a40f9680240f91f0101eb600d0054680640f90901805", - "22a0400916a0a00f909692138e10313aa57eaff97e00314aa088c44f8BL8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab02040054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8bL8;FFfc030b9160838e3c2083c83c61838f3c2183c93c6083", - "883c2083ca3c6183893c2183cb3c60838a3c2083c43c61838b3c2183c53ce85301f9c86a40b9e00704adBBBL4;FFe82708a96803009008052791e82b0aa9ca05805288038052ff2705a96903009029a92391e92b07a9290080d24918c0f2e87f06a9e82709a915aa019428008092L4;FFf8018052090000f", - "9087000f8e00315aa3a030094760000b4e00314aa37030094f60318aae00317aadf0600b1c0c5ff54760000b4e00313aa30030094e8031faaL8;FF5a070091ba031ff81b01007914050079adffff17a08300d16af3ff97b6835ef8d70a138b480313eba8fcff54e8ffff1748008052bf031ff8bf233ea913", - "038052BL8;FF286140f9e82303f9200705ad200543ad200703ad200944ad200b04ad210141ad210301ad200942ad200b02ad200540ad200700ad1f39ff97e0234da982e20291L8;FFe9a744f900001891e027823de05fc23d01048052e85304f9e89349b9eaab44f9e037823de04fc23de8f308b9e8a344f", - "9e02f823d00e4006fe13b823de127c23dBBBBBBL4;FF490108eb630a0054ea0240f9e00740f94801088be82600a908fc60d3e80400b5080840921f1900f102050054017c0353210500343f04007101fbff54890240f9L4;FF09150039e97341b909190039e96b41b9091d0039e96741b909210039e95b41b", - "909250039e95341b909290039e94b41b9092d0039e94341b909310039e93b41b9L8;FF251201942a004039e8048052e90080525f0000712b0440392c0840392811881a5f7d0271490d00120e819f1a3f2500716d0d0012ca114a0b0e819f1a7f7d0271BBL4;FFa1825ff881ffffb4a00240f922008052139", - "20194f8ffff17bc0000b481eb7bd3e00314aa020180520d920194f44f56a9f65755a9f85f54a9fa6753a9fc6f52a9L4;ZDL8;FF0a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b29050091BBBL4;FFf", - "90304aaae4302d1e73f00f9e65300f9e10f0d29e2af00b9560f00b47aa340a9f703022afb6709a9f9031faaf56b08a9f5c302911f0114ebe933949a0a0109cbL4;FB0000777a16b316b30000000000000000000000000000000000000000000000000000a28cab96ab960000010075402ca10872ec2b0872", - "0872d5f6d56bd5f6d5f6L8;FFea2311a9e85b42f9ea8342f9e82f14a9e85f42f9e81300f9e86342f9e92313a9e87742f9e97b42f9e80b00f9e87f42f9e84300f9e88742f9e8a706a9e88b42f9BL8;FF00c43c91e302009063a01a91c40200f084403d9142800991a1038052480300391f520194c00200f00", - "0801591c20200f042803991e10380523a520194e0431691L8;FF000100f000e02e912301009063600491040100f084a02f91e2032d91c1058052e8a305f9e9a705f91d520094e85746f9e95b46f9000100f000e02e9123010090BBBBL4;FF08011091890280524b000014a8935cb88a5e40f9a9c35cb8b8a", - "f7da9b9035df85f8100f1a88317b8a8835e38a9b317b8ab031af8a8831a3881070054885a40f9L4;FB756e77726170282960206f6e20616e2060457272602076616c756500000000001824400000000000300000000000000008000000000000000c89420000000000L8;FF3f040071a00200543f0800710", - "00100543f0c007100fdff54e20313aa230c805275ebff97e10300aae8ffff17888241f81f0500b1810000549fde01a99ffe02a9BL8;FFaa2357382901084aab031738ab335738a9131738a94357384a01084a6b01084aaa231738aa5357382901084aab331738ab635738a9431738a97357384a01084aL8;", - "FF080d088b0825019108fd46d30900088b3a0500915f0308eb48310054e6010014e1d342f9e8cb42f9f4074091948209911f0101eb40880054e8cf42f92a040091BBBL4;FFa86303d1a26301d101c10091399dff9720f0ffb4aa000014a88352b86800003728008052a8ff32a91f0400f101170054a8835a", - "f8090540f9292100f143170054L4;ZBL8;FFa00100f0008037911bb20094a00100f000c0349115b2009420008052010480521cb20094a00100f000e037910fb20094ff4303d1fd7b07a9fc6f08a9fa6709a9BL8;FFe05306f9e0833291a10200902120099102028052a3020090633c1591c4028052960000", - "1448008052e0a33239e8a73239c80080d20800f0f246000014e05306f9L8;FFe8df41f920854fad2285c03ddf0208eb820b803d800700ada190ff54e0e30e910969fe9782fcff1721010054810000b4c01240f92200805209320094c11a40f9BBBBBL4;FFf30300aaa80e40f9080a00b4a00642a9e20318a", - "a65fdff9708fc79d3e1e7076f0a634039ba6640a9eb031faa080d010e09ef40a91c00198a496b7cfc208d282eL4;FF17020094ff2200f101efff54f6031f2a5f000014b90000b4e00316aae10319aa220080520e020094e12740f9fb0315aa810000b51a000014e10316aa160300b4L8;FF02018052f44f4", - "2a9f65741a9fd7bc3a813020114f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091140040f9f30300aa9f0600b1BL8;FF55820114080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091010300f021802991240300d084402191e32300918200805", - "2e80700f9L8;FF080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8bBBBL4;FFf44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd6eaa343b8efe34039890240b2f07f4079f12f44a94a", - "bd70d32d4d4078e82108aaec434139ee1343b8L4;FB98e847000000000098e8470000000000f07749000000000000000000000000006d697373696e672073656e64657220636861696e76656e646f722f6c69627369L8;FFe0db43f9e7f343f9e3e35e39ebbb01f9eb0316aae4e343f9e5e743f9e27744f9", - "fc7700f9f66740f9f02340f9fc5300f9fc6f40f9f53700f9f56340b9e3b7803dBL8;FF19faff97810a42a960008052e30313aaf44f42a9f50b40f9fd7bc3a812faff17e00313aa220080520e020094610a40f9dbffff17f50300aae00313aa22008052L8;FF0080c23c1a0040f901a00191e00a803d0080c", - "33ce00e803d0080c43ce012803d0080c53ce016803d0080c03ce002803d0080c13ce006803d0b420094810700d1BBBBL4;FF3ae201941f10003121ce0054f9ffff1737e20194f70300aa1f0400b141fdff54e04305918100805232e2019400cd0035e85341b9e8b700b957ffdfc8d70200b4L4;FBbd00000", - "02e00000034ed4800000000006a00000000000000190100002e00000034ed4800000000006a00000000000000ca0000002e00000034ed480000000000L8;FFe0d7823de9b305f960150054e0efc13de1f3c13d1f0700b1e2f7c13de9f343f9d60600d140071eade0d7c23deab345f942fb803da9831cf8a0", - "03983caa0319f8BL8;FFc10200f021283091e0230091a32300d1c2008052e40314aab3831ff85d62019468620091c10200f021403091a32300d1e2008052e40314aaa8831ff855620194L8;FF3f0108eb53611932200100542a0440f90bfc63d35369283808050091280800f94b0200b5e0030caa7a00001", - "4e10300a9e00301aae10308aa22008052f4030caaBBBL4;FF681a00f928008052608600ad686a00a91000001412a2019420008052e00741addf0600f1785601a9742200b97a9200396052823c6152833c7f0200a9ab000054L4;FF42308b1a3fc122eb23e9ff5422010034436c1c53e403801204d01f3802", - "e01f7800c0238b1fc01f38e40840f984400091040004cb211c001201d01f38030100cbL8;FFe80700f958a20094fd7b41a9ff830091c0035fd6080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091810100f021cc1491a40100d0BL8;FFf53b00f9f44f08a9fd830191e20300b", - "4f30302aae90301aa018840a9350101ebe2cf00a9630400546a0209abe20900544b0001ab020a00545f010beb68050054BL4;FF2b6968384a090b8b40011fd6010440f9410300b4000840f922008052f44f41a9fd7bc2a80e22001413d041a9880240f9680000b4e00313aa00013fd6810640f9L3;ZBBBBB", - "BBBBBL4;FF726a2f383ffe037112220039200300546f7a68f8707a6df86f7a2df8707a28f8c8815ff81f0103ebe3f9ff54d9000014600240fd00a8200e0f00669eef01c0daL4;FF480001ab42030054010840a9e50304aa0a018052e40303aaf30300aae023009129f87fd31f0109eb0881899abf0400f18", - "90080524901899a1f0109eb1481899aL8;FF690600f9480108aba2090054e00315aa680a00f9f44f46a9f72340f9f65745a9fd7b43a9ffc30191f3050014e00313aaf1050094a00640ad600600adf44f46a9BBL4;FFa0100054e017c03de13340f9e0c30191e2830091fb1300f9e083823ce11f00f94eebf", - "f97e83b40f9fb0316aa1f0500b100010054e08744ade22fc03d8213803dL4;FF58f7ff3562fd9fd22200a0f27f0002eb6890829abf0208ebc80a0054a10e00913f7c02f121fc44d322040011c90300542104009129c59c5269eda072020000d0L8;FFfd7b01a9f31300f9fd430091130040f9e00301aa810", - "100d021701b91e8030091620180525a9f0094810100d021d01391a40100b084c02f91e0030091a3630091BBBL4;FF606e0035e85341b9e85b00b957ffdfc8770000b536df0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1L4;FB4a000000000000", - "00b10100000d0000002d004900000000004a00000000000000b1010000200000002d004900000000004a00000000000000b001000009000000L8;FFea8300f90e284fa9e8af15a908684aa9ee9f00f9e8c700f9082c4ba9ea0f00f9072850a9ebcb00f90b784ca9e8b700f9e8979f1aea2b00f90a6c51a9e", - "beb00f9BL8;FF21e43191e8230091e00309aa020380525f5f0194f402009094a22391c10200d0218c2f91e0230091a32300d142018052e40314aab3831ff8565f019468620091L8;FF1f0101eb00080054680640f9490180522a040091e00316aa6a0a00f909692138e10313aaa2fcff97780a40f9680240", - "f9080118cbdf0208eb08070054680640f9BBBBL4;FFdf02006ba0030054510600d1320212eaa1feff54ff0500f10001005443a8200e6c00669e6c0100b48c01c0da8c11c0da0c0e4c8b8c010b8a428c212e42a8302eL4;ZFL8;FFf4030baac7150094e10340a9eb0314aa2aa040a9290040f90cfc6ad3536", - "9283808050091280800f92cfbffb43f0108eb7361193220030054536928380bfc71d3BL8;FF62008052b30f00f9627f0194627f0194fd7b41a9f31340f9ffc30091c0035fd6080040f9000140f9080040b9080500511f1d0071a8010054691880522925c81aL8;FF09692138e1630091627fff97f71740f9", - "e80f40f9080117cbbf0208eb28860054e81340f9e10316aae20315aa0001178b137f0094e802158be81700f9e00314aaBBBL4;FFe183843cc0020054e02348a91f8100f14108005408084079091840390a7040f8190040b918f040f8e823007957fd68d3087041f8e94b0039097c4039ea3301f8L4;FB540", - "000000000000079000000050000008a7a49000000000054000000000000007f000000050000008a7a49000000000054000000000000008d00000014000000L8;FF1f0500b1e0040054e82f40f9f53b01f9bf0208eb61080054e8e7039183824dad04f1cf3c88ea40f9e0c30991e90741f9818a4cade48284", - "3ce10314aa02328052BL8;FF233f0194e11b40f9810000b4e01f40f922008052123f0194e10f40f9810000b4e01340f9220080520d3f0194f44f57a9fcab40f9f65756a9fd7b54a9ff030691L8;FFf30302aaf40301aa62ffff97e80300aae00301aa08020037680240f9080540f9150100eb62020054e80", - "f41b2e80700f907000014c90080d248008052e0430039BBBBBL4;FF140100b4680640f9e10315aae20314aa0001168b1a0f0294c802148b680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e0031faae10313aaf44f42a9f65741a9L4;FFf3ecff97f62b40f93f020014e8af00f9e87342f9f97742f9e9df", - "44b9f67b42f9fb0308aa18fd78d328ff60d3e9db00f9e97f42f9377f08533cff78d3f9e318a9L8;FFaa035ef8a8c35fb8a9058052e1030091e00313aaa2058052ea9300f8ab2b7d29e9470039e83b00b9eb2301b8ab035fb8ea7301b8aa435ff8e95b0039e96f0039BL8;FF560400b4f40f00b9f403172af", - "7031caafc031aaafa03182a384340f90c8f0194e00316aa210080520a8f0194400b00b4e10318aae20316aaf90300aa108f0194L8;FFa32300d1a2008052a8831ff8618f009468c20091610100d0215c1491840100b084e00991a32300d182008052a8831ff8588f0094940100b094a20391610100d0BBBL", - "4;FF018102ad028d01ada8c201911f0117eb01fdff54fb1340f99f0216ebc0010054f50314aaf70316aaf40308aaf60308aae0e30091e10315aa0e7000945f031bebL4;FB24ff83e900003a05aaddbdd27e5b35f1d99e1a8ab274f443629e0b8a2052e37c1b547025166ebfbac4a81af8d33a8fedd8868d8", - "9f5fd19435e27785ced96d7a7L8;FFf6b70aa9f86700f9e0d300f9f1cb07a9ec7b00f9e0b3823d08b140f9ee4755a9e14740f9e9df40f9f09740f9edc340f9eb2b40f9fc7340f91f0900f1f41b00f9BL8;FFe1230091ebb302a9ffa700a929008052eaff01a9e9230a291d4f0194fd7b47a9ff030291c003", - "5fd6ff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9L8;FFf8ffff17e88b40f908d7ffb40805088be00313aa0201805201f17dd3104f0094b2feff17f63f42f92083c13ceae32291e9d742f9f5c742f9f7cb42f9c80240f9BBBBL4;FF28008052e90300f029d52691680a00b928038052692201", - "a908008092680200f9f44f46a9f52b40f9fd7b44a9ffc30191c0035fd6e83b40b9f55342a9e00b40f9L4;FB696e76616c6964206d657373616765204956696e76616c6964206d657373616765204d4143206b6579696e76616c6964206d6573736167652063697068657220L8;FF888244f81f0500b18100", - "00549fde04a99ffe05a997fe06a981220191e20313aa66f1ff97400200b467000014e10314aae20313aae2edff97a00100b46b000014BL8;FFe80700f9586f0194fd7b41a9ff830091c0035fd6e10200d021702991820080524d6f0114281040b96800c8376800d0373d6f0114516f0114516f0114281040", - "b9L8;FFe1431691ead302f9a90c0094e88349f91f0500b1c0000054e8074091e14316910881099100810291cc0f0094f87f49f9780300b4e1d342f9e8cb42f9f97b49f9BBBL4;FF6a06805228048052ff2703a9690300b029150a91e92b05a9290080d2e1c300914914c0f2f90b00b9e87f04a9e82707a91", - "7af0194e0031f2a23af01940000162aL4;FFfd7bc6a8c0035fd6f60315aa08008092680200f996feffb4e00314aae10316aa22008052ff074091ff830091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L8;FFf7220191fb0b40f99f0e00f1d801009018a33a91f90100d0e10f00f9c30800544100805", - "2b50100b0b5822191b60100d0d60211915c0080520d000014ba080094BL8;FF13210891e0a350a9600600ade17740f9e20313aa23008052081940f900013fd6e06b01f9e8c31791e16f01f9290c40f9e1830b9120013fd6fcfb42f99f0f00b1L8;FF090000d029012191f72704a9e98300916a0000904a61", - "0391a88318b8080000d008d121910b0000d06b111791e92305a9e9f30091a00700d1e92b06a9090000d0BBBBBBL4;FFf30b40f9fd7bc2a815170214f30b40f9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091010040f968028052290041d23f8d00f12831889a1f6d00f148040054L4;FFe1db853da9ed", - "fe97e0d7c53de1dbc53de007409100401d91e00714ad3c170094e083099146effe97f90300aaf60301aae8830891e043139101810091a44700d1L8;FF690e00f9680200f9f44f42a9f65741a9fd7bc3a8c0035fd6000180520103805227170194210100b4e00100370a0040b2690200d029411e91008500a", - "90a0d00f9BBL4;FF201100b44803009008c13f910900f0d2000540ad02f1c13ce8058052680201a9681200f928008052000400ad02f0813c682600a9e00300912680ff976f000014L4;ZBL8;FF21b41991e8030091e00309aa020280525f97009468c200918101009021481491840100f084600991e00300", - "91a3630091a2008052a80f00f95697009481010090BBBL4;FF38d70194fd7bbea9f44f01a9fd030091017c40f9f30300aa3f0400f18b000054608240f9220080520dd70194619640f914008092747e00f93f0400f18b000054L4;FBc0001a53656e64206b65792065706f636820646563726561736564202", - "8c004202d3e20c001290010496e76616c696420706172616d733a20c000000000000000L8;FFe8f703f9e8b740f9e71f04f9e8fb03f9e8eb40f9ef2f04f9e80304f9e82754a9ee3f04f9e64304f9e81304f9e81340f9e90b04f9e81704f9e89f40f9eb4704f9BL8;FFd6620091a0150054c1825ff881ffff", - "b4c00240f92200805211570194f8ffff17e80740910881099100210291ed0b0094f4b749f99f0600b100b8ff54f5bf49f9L8;FF1f5700943f0700b140270054e0c32291e1c327910228805219570094e0c31d91e1c3229102288052155700943f0b00b1e1c8ff54a3010014c80080d2e15706f9BBBBL4;FF", - "f76b00f9f6570ea9f44f0fa9fd03039109704039f30300aaf40308aaa90100343f0d00712109005460a240a9090d40f9e823009120013fd6e80740f91f0900b1L4;FB6d697373696e672073656e64657220636861696e00000000000000000000000008000000000000000800000000000000b87f4200000", - "000000000000000000000L8;FF41020090212c1b9143020090638c1691e0030091420180528401805212000014e00300f941020090212c1b914302009063d01391e00300914201805244008052BL8;FFe02b40f92200805215770194880700d11f0d00b128e8ff54e00319aae1031caa220080520e770194", - "3cffff17df020171e20b0054fc031faaec0f00b9e84700b9L8;FFe803217988010090e01b843de11f843d08b140f91f0900f189040054e90000d029c10491e8633f91e9bf0ef96901009029212791e8bb0ef968008052ea074091BBBL4;FF49058052ea1f00f90969343825a3ff97f41f40f9fc1740f9880", - "314cb7f0308eb880e00543b0200b4f51b40f9e10b40f9e2031baaa002148b11b7019494021b8bL4;ZDL8;FF23010054080e8052610640f98006089b48e179d302110acbf44f41a9fd7bc2a817b700140a0e8052740109cb6c0640f901310a9b28e179d380320a9b021109cbBL8;FF4a11c0da4a1540d24a0", - "d0a8b4a25019129194a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8bL8;FFa7f1ff97e19344f9810000b4e09744f92200805212370094eb032a9160c1c03c61c1c13ce8af4ab9f68b4ab9fc4345f9a00600ade88303b9c2060014a01ec1", - "3dBBBBBL4;FF8b0100b46b01c0da6b11c0dacb0d4b8b6b010a8ae2e7076f218c222e21a8302e2d00261e0d0c00372d00805202000014ed031faa8c21009180010e8bdbffff17L4;FFfd030091f30301aaf40300aa1007009400038052010180520e070094000100b4810000d021403b91144c00a91f40003", - "9f44f41a9fd7bc2a8c0035fd600018052L8;FFe7ec0e91e9af00a9a5200091e00308aa42028052c4008052ea0300f956070194fd7b42a9ffc30091c0035fd6410200f0214c1991e00308aaa2018052fd7b42a9BL8;FF4a0d0a8b4a2501914afd46d34a050091090100b42b0140b26b11c0da6b1540d26b0d", - "0b8b6b25019129194b8b2905009129010a8b2a0140b24a11c0da4a1540d2L8;FFfc6f41a9fd7bc6a8c0035fd608fd41d3f6031faa18038052f9230191170500910a000014a80640f9d60600914a070091ff0216eb940a00916907c05a09793a78BBBL4;FFe00317aae10316aa2200805214c70194c5ffff1", - "7e05f06a9fa0301aaee4f00b9ed2b00f9ec2703a9f51700f9750080520b000014ee4f00b9ed2b00f9ec2703a9L4;FB012900204e6f2076616c69642073657373696f6e20666f7220726563697069656e743a20c01b2c2063757272656e742073657373696f6e2062617365206b6579L8;FF6281c63cf5030", - "92aeaaf00b9ea6f44f9e48715ad6181c73c6b9143f8e94f40f9e0a3803debbb01f9eb5f44f9e20713adec7202f8b9010014ff0600b160020054BL8;FF680240f9080117cb9f0208eba9fbff54e00313aae10317aae20314aa11070094770a40f9680240f9080117cb9f0208eba9faff54e00313aae10317a", - "ae20314aaL8;FFed031faaec030aaa6b4100916e8541f8cf0140b2ce010d8bef11c0daef1540d2ef0d0f8bef250191ce194f8bdf010deb230300548c0500f1ed030eaa81feff54BBBBL4;FFf80301aa12e70194000480522100805210e70194c02300b4e00745adf60300aa1f0317eb000400ad822500540", - "80d80521353089b94070011612640f93f0400f1L4;FB0000000000000000000000000000000000000000000000000000000000000000100000000000000010000000000000004ec848000000000009aa480000000000L8;FFe8af40f91f0114eb290a0054a0c303d1cfe6ff97c021003728fc60d3080e00b", - "5200840921f1800f1020e0054217c0353210e00343f0800718c0100543f040071BL8;FFe00309aa420180526167019468820191e102009021c02991e402009084e01291e0230091a32300d1a2008052a8831ff858670194f40200d094a22391e1020090L8;FF22008052f44f41a9fd7bc2a814670014f44f", - "41a9fd7bc2a8c0035fd6010040f9810000b4000440f9220080520c670014c0035fd6fd7bbea9f44f01a9fd030091BBBL4;FF297141f80d5101780d0880528c111d126d15003309f101f8290080920c2100390a7101f80d9d0039090100f9c0035fd6090500f9290180d20900f0f2090100f9L4;FFacffff9", - "7e10300aaf303134b00008092330000b9f8ffff17fd7bbda9fd030091f35301a9610000b4027cc19b220400b5337c009be00313aa31000094f40300aaL8;FF1ffd007120ecff54a96a2838080500116bffff17a00100f000a00291a301009063e02291a40100f084200391a24700d1e10380521aa70094a0", - "0100d000603591BL8;FF830200b063c03491840200b084a03f91a20700d1e106805221270194ff4301d1fd7b03a9f32300f9fdc300913f1000f123040054090040b90aca89522a49a772L8;FFf70300aa1e270094591740f9b7831ff8190400b4541340f90d270094e00319aa210080520b270094a00900b", - "4e10314aae20319aaf50300aa11270094572340f9BBBBBBBL4;FF821700940800148a206b68fc00a8200e0a00669e0a0300b44901c0da2911c0da080d498b0801148a296be8386903f836092100d10afc79d3eb0336aa2901148aL4;FFd5ffff17f7031caaf80308aad2ffff17a00000f000e02691281b00", - "94ff8301d1fd7b03a9f65704a9f44f05a9fdc3009109504039e9020037011040b9155840a9L8;FF570909aaa0000054c9fe7bd3a90000b5f716168b10000014f30315aa11000014f80308aa0a1b01940005805201018052081b0194400200b4e81242d3155000a9BBL4;FFe80e0039e81a40394a010e4a29", - "010f4aea120039ea1e4039e9160039e92240390801104ae81a0039e82640394a01114a2901124aea1e0039ea2a4039e9220039L4;ZFL8;FFe8230091c2008052509b0094a2010090428014910f000014e80300f9810100b021001691e82300910201805206000014a1010090210c1591e80300f9e8230091", - "BBBL4;FFe2930eade21bc83de423c83de10f883de38b0bade21fc83de2930cad46c1ff9761ba40f9e8430591a08303d134db0194a80303d1e043059132db0194e10348adL4;FBc8614400000000006465736372697074696f6e0000000000c85344000000000018000000000000000800000000000000646", - "4440000000000737461636b000000L8;FFe8ab42f9e85700f9e8b342f9e8a70ba9e8b742f9e9c742f9e8431ca9e8c342f9e83f00f9e8cf42f9e9231ea9e9d742f9e8d342f9e97f00f9e9e742f9e82f00f9BL8;FF023f8052e82b09f9e183843de28b843de087843d1a5b0194f9431591b40000b4e00315aa", - "e10314aa220080520c5b0194e1e34df9810000b4e00317aa22008052L8;FFff033ad1290100b029e12691ff0300f9e97301f9fa0308aaa84700d1e97701f9890c40f9e0070aa9e0070ea9e00303aae20f0ba9e4170ca9e6230da9ff230b39BBBBL4;FFf44f4da9f6574ca9f85f4ba9fa674aa9fc6f49a9fd", - "7b48a9e923476dff830391c0035fd6000400d00040169123fb0194ff4306d1e923126dfd7b13a9fc6f14a9L4;FB62353537662f70726f73742d302e31342e342f7372632f656e636f64696e672e727300c0002f636172676f2d72656769737472792f696e6465782e6372617465L8;FF81220091e20313aa", - "89090094f50300aa390200143f0900b120130054880080d20800f0f2080900d13f0108eb8112005481220091e20313aafe040094f50300aaBL8;FF68c20091010300b021601891a363009102018052e40314aaa80f00f95d7b019468320591010300b021601d91a363009102028052e40315aaa80f00f955", - "7b0194L8;FF2300805224008052c691ff97e11740f978feff17e0630091220080522300805224008052bf91ff97e11740f9bafeff17e0630091220080522300805224008052BBBL4;FF9f0208eb235f0054b5035bf8e00315aab7b000948c0200eb03540054a8fe60d3a80100b4480080d20800f0f209008", - "092692200a9f44f5ea9f6575da9f85f5ca9L4;ZBL8;FFfd7b46a9ff43029115bb0014610240f9080080921f200039080000f9810000b4600640f9220080520dbb0094618241f8e1fdffb5f44f48a9f65747a9fd7b46a9BL8;FFe00308aaf7feff97e80300aae00313aa090140b22911c0da291540d2290d0", - "98b2925019129fd46d30801098b130500917f0209eb89190054088c45f81f0500b1L8;FF69620e9168ca13916c4e42f9e92309a968420e91694a42f9e85300f96e5242f9775642f9761642f9781a42f9681e42f96a2242f96b2642f96d2a42f96f2e42f9BBBBBL4;FFc0035fd6f50300aae00313aa220080", - "52230080522400805225feff97610a40f9e00315aa53feff17e00313aa2200805223008052240080521dfeff97610a40f9L4;FFc0035fd6ff8301d1fd7b03a9f65704a9f44f05a9fdc30091f30302aaf40301aaf50300aa36008052e0630091e1031faa220080522300805224008052ffdb01a9L8;FFf44f", - "01a9fd030091130040f968018052f40313aa818e41f8290041d23f0000f12841889a1f2d00f1a2010054680240f9a80000b4600640f901e97bd302018052BL8;FF880080d2e00700f90800f0f207000014e80b41b2e20700f904000014880080d20800f0f2080140b2e0030091e80300f9fc800094f40300", - "aae04305915e74ff97L8;FF130303a9080800796800af52080000b968008052e80f00f9132300f933fb7fd30b8b0094e00313aa41008052098b0094202000b5230300143f8b00f120150054BBBL4;FFba035df8480317cb1f0308eb681a0054180100b4a8835df8e1031caae20318aa0001178b16cb0194f", - "702188bb7031ef85f0317eba01b0054a8835df8ea060091L4;FB4d6573736167654c656e6774684576656e4d6573736167654c656e677468546f6f4c6f6e6753657269616c697a6174696f6e496e76616c696400000000000000L8;FFe9cf02f9eadb02f9fadf02f9f9e302f9a0818d3cf6bb02f9ebbf02f", - "9e8c302f9f5c702f9b00f0094e9b343f9fab743f9f9bb43f9e1bf43f93f0500b1a05b0054BL8;FF3f0400b140010054810000b4602a40f922008052124b0194613240f9810000b4603640f9220080520d4b0194b40000b4600640f9e10314aa22008052084b0194L8;FFff830091c0035fd6fd7bbfa9fd03", - "0091082440f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b140040054BBBBL4;FFf83f04391eeb019442000014410341ad28008052420f40ad60020291e143029122008052fc03162ae0238c3c54fb019176fb01d1e1238b3ce3238a3ce223893cL4;", - "FB804c420000000000000000000000000008000000000000000800000000000000804c420000000000000000000000000008000000000000000800000000000000L8;FFc0035fd6e8031faab60a40f976f4ffb5b41640f9e803088b54f5ffb5e00308ab23f6ff544002009000c011910feb0094e00313aa2", - "20080522300805224008052BL8;FFfc0f40f9fb3f00f91f05007161040054e0e301910154ff97e81340b9fb3f00f9c8030036e0e30191fc53ff971f0700b1fb3f00f940050054e0e30191f753ff97L8;FFffa700a929008052eaff01a9e9230a291f6b0094fd7b47a9ff030291c0035fd6ff8301d1fd7b03", - "a9f52300f9f44f05a9fdc3009143010034081c0012f30302aaBBBL4;FFe88f40f909208052e08744ad282508aa080dc0daa0073dadff230ca9e28345ada2033ead41ab019400e4006fff3f0339e9235f29a0033dad088109aa29008092L4;FF1004a0726b010aaa0c380e530a128e9a0ed074d31f004ef24", - "f010baae903891aaa018d9a6b018f9acd01096a6e0168b26f0569b270096ab2ce118b9abf010072L8;FF420080522300805224008052c5c1ff97a0077fa9a806c05a08682178210800917b0700f1a1831ff821fdff54fc1740f903000014b5eb3ea9bf831ff8e80f40f9BL8;FFe9a304f9801500542083cb", - "3c2183cc3ce9a70c912283cd3ce8bb01f9e863019120f18f3ce9e70c912083ce3c21f18f3ce9270d912183c73c22f18f3ce9670d91L8;FF4b2a0094e80356b9e00740918100805200001891ff0316b9e83f00b9442a0094e80356b9e00740918100805200001891ff0316b9e83b00b93d2a0094e80356b9B", - "BBBBBL4;FF2300805224008052f4030baa28060094e10340a9eb0314aa2ca040a9290040f90afc78d39369283808050091280800f96af3ffb4d4ffff17e10300a9e00301aaL4;FFe8830c918900805200c00e91e143139162008052e86b02f9e96f02f9f97302f9fb7702f9f67b02f9fa7f02f90b0b0094b", - "a0000b4e00316aae1031aaa22008052L8;FF0aa100b8091d0079c0035fd6ff0301d1fd7b02a9f31b00f9fd830091f30308aae82300915a020094e86340391ffd0371e0000054c8008052680200b9fd7b42a9BBL4;FFfa3700f95a070091c003005435835cf8f50100b437035cf80d930194e00315aa21008", - "0520b930194202100b4e10317aae20315aaf60300aa11930194280340f9L4;ZDL8;FF0080279119930094fd7bbda9f50b00f9f44f02a9fd03009108d040a9f30300aa1f4c00b91f1800f91f0800f9f40300b415e1009104000014940600f1b5c20191BBBL4;FF6a3500f94ac301915f0118eb4a830391608", - "1853c6281843c6181833cc1f9ff543bffff17e003009167090094e82741a9f70340a9e3ffff17890080d2e0a30039L4;FBa72f22bb307eeacc72408843d6594d605218f974a29ecfe184fbb0b822c03c330d1805b600000dea744893d76342c9befb1d89ce94573302d5ae1859337f110eL8;FFe90f00f9e", - "92744f9e093833de91700f9e92b44f9e92b00f9e98744f9e92f00f9e98b44f9e9af0fa9e98f44f9e94b00f9408c0054e92b47f9f0b300f9f0031aaaBL8;FFe0070054e1d342f9e8cb42f91f0101eb40330054e8cf42f92a040091002302914901805209692138ead302f9ed160094e1431691b60c0094e09", - "b49f9800100b4L8;FF9f0f00b1810d0054a8008052a5ffff17e03fc13de143c13d1443172ae81345b9e063813de167813de8a305b93a000014280100f008b140f91f0500f1a9040054BBBBL4;FF22008052e00308aa15f30194e00317aaf71740f9bedbff970800809223000014f70345a9ff0a00b140fff", - "f54e9234d29ea3340f9ff0600b1bc831cf8e0020054L4;FB7265646465766963655f69642069732072657175697265649a9648000000000033000000000000005c000000050000009a964800000000003300000000000000L8;FFe0031faae3ffff17a80640f9190101ebe200005480000014e20313aa230", - "c805275ecff97e10300aaa10800b5a80640f91f0119eba9040054e00313aac4f2ff97BL8;FFb8030036e0c30191045cff97fc1740f9f93b00f99f0700b160f4ff54e0c30191fe5bff97e0230191fcdf04a9f62f00f9e9beff97f60300aaf70301aae00315aaL8;FF81ffffb4c00240f92200805214730094", - "f8ffff17f37749f97f0600b140020054e18349f93f0400b140010054810000b4e08749f92200805209730094e18f49f9BBBL4;FF60f9ffb469000014bf633ba9bf031cf8a14301d1a26301d1dc9cff9780f8ffb46b000014bfe33ca9bf831df8a1620091a26301d1d59cff97a0f7ffb45b000014L4;ZBL8;", - "FF032000542b4840b90c358c527f0100718b018b1a3f010b6b090500542901805268d201292800805269220039680200f90600001488008052620a00f929008052BL8;FF811100343f0800716c0100543f040071600300543f0800716102005401e30391a22302d14bebff97002c00b5e1031faae7ffff17", - "3f0c0071800300543f100071L8;FFe100009021843d9102028052e30000b063cc03919e000014e04305f9e0032a91e100009021843d9102028052e30000b063080491c40280529600001448008052BBBBBL4;FF48fc089b290140f9200540a94801088b024106d165feff17080c8052090040f92a0040f94", - "8fc089b290140f9200540a94801088b028101d1bbfeff17080040f9L4;FFe9bf01f9e9018052e9c301f9890000b0294d3091e9d301f9890000b029a93091e9e701f949038052e9eb01f9890000b029093091e8d709a908018052f5430c91L8;FF602a40f9220080521503019460a20191f30b40f9fd7bc2a", - "8e0fcff17fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4600640f92200805208030194BL8;FFe343009133830194fd7b43a9ff030191c0035fd6202040a9210300b021402a91030d40f9a2028052fd7b43a9ff03019160001fd608200091200440a9e9230091L8;FF200108ab62000054fd7b", - "c1a8c0035fd6600100d000603b9114830094600100d000c01a9111830094400100f000c012910e830094e00301aa610100d021c03b91BBBL4;FFa3ffff17e003163948008052c90a0091e0e31591e8071639e9bf02f901b900940b000014e80741b298ffff17a1035ef8e10000b4a8835ef8f40300aa2200", - "8052L4;FB6c4f470000000000496e76616c696453657373696f6e4572726f7200000000001ce4460000000000180000000000000008000000000000004c61470000000000L8;FFe04b40f9e1031baa2200805214c30094f9031faaebffff17fb031faa1bfcff17ba0000b4e00315aae1031aaa220080520b", - "c30094e16f40f9810000b4e04740f9BL8;FFb60900b4c80240b20811c0da081540d2080d088b08250191c81a488b08050091f40800b4890240b22911c0da291540d2290d098b29250191891a498b29050091L8;FF2007c03dfc430f912283c33ce8b341b9e0430691810f803debc741b901048052e002803", - "de9cf40f9ea9741b980c38d3c800fc03d821f803d4047803d801fc03dBBBBL4;FFe0430591810080523ae3019400ee0035e85341b9e8d700b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd6L4;FB5b000000090000008be8480000000000380000000", - "0000000530000000d0000008be8480000000000380000000000000082000000090000007375636365737366L8;FFe0b740f92200805215e30094e883059100c10091b3ddff973a0500349f0100145f0f00b1c0000054e80080520900809268220039690200f90b00001428008052BL8;FFc0035fd6000180", - "52010380522c630194fd7bbda9f65701a9f44f02a9fd030091f50303aaf303022af403012af60300aa07630194000480520101805205630194L8;FF003c2191e8a700a9a82300d14201009042c00d91e1230091e8a701a91e630094200100f000003691136300944001009000000c9110630094400100900", - "0600c91BBBL4;FFff074091ff830a91f44f42a9fc0b40f9fd7bc3a8c0035fd60a2500a9ff074091ff830a91f44f42a9fc0b40f9fd7bc3a8c0035fd6200080520104805220a30194L4;FFe10a0054ff000071421046fa430b00547b7f349b9f1e0071830400d1fa0180925a031bcba1000052e0c79f1a7b43", - "00915a03038a1f00016a5a031b8b610d0054L8;FF59a30094fd7b41a9ff830091c0035fd6810100f021bc1491820080524ea30014080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091BL8;FFf44f43a9f51340f9fd7b41a9ff030191c0035fd608a440a9e20301aae00308aae", - "10309aa48230114ff8300d1fd7b01a9fd43009108004039a01300d1a8c31f38BL4;FFfd7bc3a816230014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd03009114d440a9f30300aa350200b49682009104000014b50600f1L3;ZBBBBBBBBBL4;FFe00314aaf44f4aa9f65749a9f", - "85f48a9fa6747a9fc6f46a9fd7b45a9ffc30291c0035fd6e92341a9ea0740f9480108cb395100a9280900f936feffb408328052L4;FFf44f0ba9fd83019109604039890e0037f40308aa092040a9f30300aae0c30091028d40a921a1009190120094f96343a9f55b44a93f0b00b1e1020054760300b4L8;F", - "F360908aa8008005428ff7bd3480600b5d616198b3b000014b309f8b7530200b40b1d0194e00313aa2100805238008052081d0194e00800b4e10317aae20313aaBBL4;FFc182c03ce10b00adc282c43c020119cbb80202ebe20302ad02010054e002198be10314aae20315aa159d01942803150be8ff0039", - "2000001419020034e8030091L4;FFa100060b80fc5f88bf00006b41ffff5481fc008880ffff35e1ffff17e30300aa000040b94000f837c0035fd60400b01261fc5f882000040b60fc0288a2ffff35L8;FF215c1491a40100b084e00991a363009182008052b30f00f95e9d00945e9d0094fd7b41a9f31340", - "f9ffc30091c0035fd6000040f9889d0014281040b9000040f9BBBL4;FFad000054390300eb432e00541803008b060000141f0400b1c12d005433dd01941f100031412d005439feffb505000014e0430591810080522edd0194802c0035L4;FB3909490000000000490000000000000070000000200000003", - "90949000000000049000000000000007c0000001500000039094900000000004900000000000000L8;FF0900809248008052e8270ea9e8030eaa3e0f0014e00301aa190340f909a0c0a91a2845a90078c03d0b484da91c0441f9e86b00f9162042a93f031cebe94700f9BL8;FFf57749f9fb6709f9f46b09", - "f9f47349f9e0a3843de0a7c43d4383c63ce85309f9e2a3c43df95709f9f75b09f9e1abc43df95f09f9f97b49f9e00b843de0afc43dL8;FFc802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aa22008052f7000094610a40f9a5ffff17f50300aae00313aa22008052f1000094B", - "BBBL4;FFa90600910815158b000500ad2800809229831ff8e9018052882600a9680080528882003928008052802601a968620039f44f46a9f91b40f9f65745a9f85f44a9L4;ZFL8;FF08f3ff97e10300aae00301aaf44f49a9f93340f9f65748a9f85f47a9fd7b45a9ff830291c0035fd637008052180380", - "52a80640f91f0116ebc90a0054e00313aaBL8;FFa2018052a9831ff8577d0194fd7b42a9ffc30091c0035fd609200091010300d021202191230300906360399126030090c6e03891a52300d1e00308aa02028052L8;FFf190ff9767fdff17e8031faa000117ab02650054e16300915e7dff977f0600b1800", - "0005480220291e16300913c92ff97df0600b1210c00545afdff17e8031faaBBBL4;FFe8ab03a9280080d2f60300aa6850c0f2a02700d1f70301aae1630091e9ff02a9e9a305a91abd0194e8534039e10317aae00316aa1f090071820400545a0080d2L4;FB79736f6e652d74696d652d7072652d6b657973", - "6f6e652d74696d652d6b796265722d7072652d6b6579736c6173742d7265736f72742d6b796265722d7072652dL8;FF17bd0094b40000b4e00315aae10314aa2200805212bd009460220091f44f4aa9f65749a9f85f48a9fd7b47a9ffc3029143b7ff17c50100d0a5a02f91e1030091BL8;FF4801088b090", - "100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab220a0054090140b22911c0da291540d2290d098b29250191L8;FFfb0302aaf30301aa28004b39f40300aaf8830d91f90308911f1100714d0200541f1900710c0300541f150071c1080054606641f9616a41f9290c40", - "f9e8430f91BBBBBL4;FF2b000094770a40f96afeff17e00313aa22008052230080522400805224000094610a40f971feff17e00313aa2200805223008052240080521d000094610a40f9L4;FF08e11caae96f02f9fb7302f908010aaaeb7b02f9e87702f9ed7f02f9eceaff97f85b5ca908008092880200f", - "9b50000b4e0df40f9e10315aa22008052080d0094L8;FFb40000b4680640f9e20314aa0001158b1b0d0194a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaf60301aae10315aae20314aaBL8;FFe10308aa548d0114281040b96800c8376800d037518d0114518d0114518d", - "0114000040f9080040b91f050071200100541f090071a1010054280300d008e11891L8;FFf65742a9fd7bc4a8c0035fd6fd7bbfa9fd030091082440f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b1BBBL4;FFe0e30091e10318aae20316aa2300805", - "22400805226c0ff97f82740f9fdfeff17e9e340a9e82740f9e083c33ce81b00f9280d00f928008092f50318aae00b803dL4;FB20636f6d706c657465000000000000008e194900000000005700000000000000a6020000200000006368756e6b2073686f756c642062652073697a6520320000L8;FF20630", - "1b4e10318aae2031aaae06b00f91bcd0094ed031baa1c0500147c6347a9792f40f976af40a9744340f96f4b40f968d741a99f0700b16ca742a9618343a9BL8;FFe082c13ce80700f9e8030b91f7430f91f89301b9e91740f90029803da8835af8e0430691e10244ade1830d91e8bb01f9a8e378a9fa9701b", - "92183813c2083823cL8;FFe00318aa21008052124d0094200500b4e10313aae20318aaf60300aa184d0094b3835df8acffff17e90313aaf54f43a9f75b42a9fb0f40b9f96341a9fc0340f9BBBBL4;FFa08200918dc60094f50f40f9f5feffb7f80b40f9950900b40ded0194e00315aa21008052390080520", - "aed019400feffb4e10318aae20315aaf60300aa10ed0194L4;FB50726f746f636f6c4164647265737300a1a14800000000004b000000000000003901000024000000a1a14800000000004b000000000000002f0100001f000000L8;FF48008052f503012ae10303aa000d002af30303aaf403022a5eedff9", - "795040034a80200320811c0da081540d2080d088b0825019108fd46d308050091d4030034BL8;FF246d0194f30300aa140300b4f60301aa0f6d0194e00314aa01018052150180520c6d0194e10316aaf60317aa60feffb4ff7f01a9f60300a9370200b4290040f9L8;FFe0431691e1031aaae20318aafd10", - "0094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aaf4100094fad342f9fc0740919c830191BBBL4;FFfa670aa9f85f0ba9f6570ca9f44f0da9fd0302910080c53c0180c63cf40301aa083c40f90280c43cf30300aae00702ad0080c13c0180c23c16a840b9e83300f9L4;F", - "F000440f93d060014c0035fd6fd7bbda9f65701a9f44f02a9fd030091150840f9080040f9f40302aaf30300aa080115cb5f0008eba8010054b40000b4680640f9L8;FFe10303aa1bad0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff830ed1280840f9291440f9e80f00b4e9", - "2b00b51f4100f1a12b0054BL8;FFe92b00f9e8a300f91d2d0194ff0600b19542039141020054e8031691e00316aaea2c0194c8624039890200f029411891e9d302f9fbc342f9f5c742f9e8631639L8;FF60000054e002039100ecff97f35353a9940100b47522009104000014940600f1b5620091e000005", - "4a1825ff881ffffb4a00240f922008052092d0094f8ffff17BBBBBBL4;FFff430191c0035fd6530040f9680640f9a80100b4690240f9200180398001f8b729050091080500d1692200a9200000b9e0031faaf44f44a9fd7b43a9ff430191L4;FF13150094c00280522100805211150094200a01b4a80000d", - "008653491ec0741b20001c03d08e140f8d90280520000803d08e000f8c8028052e88319a9e16b42f9L8;FF090840790b0c40790a0040b92909c05a6b09c05a4a09c05a297d10536b7d10530a0100b909090079092000910b0d0079090500f9c0035fd6ff4301d1fd7b02a9BBL4;FF69010a4ae8430039880", - "e4039e9470039e94f4039aa010c4aea4b0039ea5340398b7240392801084a89124039ecb34039e84f00398d764039f0bb40394801094aL4;ZBL8;FFf30300aae00308aafdefff97e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eba91400540", - "88c48f8BBBL4;FFc7020014a2a302d1e003082a430c8052c9bbff97603600b5bc8355f8820740f95f0015eb891b0054810340f9200080398000f8b728040091490400d111000014L4;FB911f4900000000005600000000000000a6000000090000005369676e616c5f5051434b415f56315f4d4c4b454d37", - "36383a53434b41204b657900000000000000L8;FFe88b07f9e0d7833de0ebc13de1db833de1dbc13de0df833de0dfc13de2e3833de1cf833de0d3833df95b00f9f98f07f9e99307f9ea9707f976810036a06302d1BL8;FFe1d342f9e8cb42f91f0101ebe0700054e8cf42f9490b8052f4074091948209910", - "969213828040091f69349f9e8d302f9df0a00b1610d0054f9031faa75000014L8;FFa80319f84801009008b140f91f0d00f143070054e8833291e0032d91667dfe97e85346f91f0500b120600054e85b46f9e9f31691e02bc33de95b04f929000090BBBBL4;FF80fcff5475da42a9e08740adc80240f9a08", - "73eade00fc03da0039f3c680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aa09f50194a0877eadL4;FB796265725072654b65797075626c696370726976617465556e6964656e74696669656453656e6465724d657373616765656e637279707465645f6d6573736167L8;FF410200902", - "1ec1c914302009063f01b91e0030091c20080524400805211000014c80080d2e0230039e00300910800f0f2ff270039e80300f9faeaff97e80300aaBL8;FF040300f084201591a363009162018052a80f00f95f750194688201910103009021cc2791040300f084a01591a3630091c2008052a80f00f9567", - "5019456750194L8;FF0800098b080500911f0109eb499d0054180116aba20a0154b800f8b6f9031faae00319aae10318aa1a750094f90b00f9980300b406750094e00318aa21008052BBBL4;FF08050091683300f948b50194f80340f9ffff0139f9031caa22ff46d3e20000b4683340f960030191e10318", - "aa0801028b683300f93db5019428e37a9222174092L4;ZDL8;FFb8835df8fb1f805233008052e00314aaf70314aa57000014338740a9080080921f230039080300f9e00313aa7fb3ff97280340f9c80000b409e179d3e00313aaBL8;FF1f01096be83f40b9f7cf06f9f7d706f9f5b70db9f3df06f9f8eb0d", - "b9e8f70db9410a0054e39348a9e0c31291e2db42f9e5f35639e1833291e6031f2a7ae6ff97L8;FF2221c03d18000014c80080d2e0830e91e38324910800f0f2e4032a91e10000b021c43c9102018052e98b0ab9e84305f96a050094f6e741f9e8df41f9f7032a91BBBBBL4;FF53000014e91b40f98162009", - "1a2630091e003082a3f0900b129119fdae91b00f999f2ff97c0f8ffb440000014a2630091e003082a830c8052bfebff9700f8ffb4L4;FFe20314aa2300805224008052f9e5ff97f60f40f988ffff17e0230091220080522300805224008052f2e5ff97e10f40f9ea0740f98cffff17e0230091e10308aaL8", - ";FF80fbff54135449a9550800b47622009104000014b50600f1d6620091a0070054c1825ff881ffffb4c00240f9220080520b050194f8ffff17010440f93f0800b1BL8;FF6b25019129194b8b2905009129010a8b2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091340108ab8300005", - "42d000014f40308ab62050054L8;FF17850094e84b40f91f0500f1ab000054e04f40f901f97fd34200805210850094e85740f91f0500f1ab000054e05b40f901f97fd34200805209850094e86340f9BBBL4;FF2a040091e00313aaaa031ff809692138a18300d123b1ff97b6035ff8a8035ef8080116cb7f", - "0208eb48110054a8835ef8e10b40f9e20313aa0001168b10c50194L4;FB6c69627369676e616c5f70726f746f636f6c3a3a73657373696f6e5f6d616e6167656d656e7443757272656e740000003b634900000000003800000000000000L8;FF75e20139680601f9e83f40f970a61fa9e95f40b9680a01f9", - "c8f040f8696208396966089162828c3c6bda19a97ab21ca9681601f92001803d11c50094e0dbc13dBL8;FF3f0c0071000700543f100071210500541f0900f1a1210054e00313aaff6b00b9ffdf00a9df7e01a9dffe02a9f71700f9f72300f9df7e04a9f7ff05a923feff97L8;FF1f0009eb29060054e80f4", - "1b2e80300f9e0030091033bff97f44f45a9f52340f9fd7b43a9ff830191c0035fd6f503012a74040051e00313aa56050094e80300aaBBBBL4;FF08e379d3f90303aa221116cbf60300aa131118cb2000138b13e50194c80218cb160e8052e00314aa0151169be20313aa0de50194e152169ba8e279d32053", - "169bL4;FB00224661696c656420746f2064657465726d696e652073656c665f73657373696f6e3a20c000124661696c656420746f206465637279707420c01b206d657373L8;FF750a00f9d80000b5f403172a680240f9bf0208eb8102005411000014680240f9f9621932bf0208eb61000054e00313aa5d", - "e40094680640f997fe6ad319693538BL8;FF210c00b4f40301aaf50300aa19210091f6030191fac3009137008052e20301aa0a000014c1220091a20301d1e003082ad150ff97c01700b5ba035cf8f9031aaaL8;FF600a40f92200805215650094611240f9410d00b4601640f922008052f30b40f9fd7bc2a", - "80e65001461ce40f9810000b460d240f9220080520965009461da40f9BBBL4;FF090180520968283808050091e1230091e00317aae80f00f92291ff9710000014e8031faab60a40f976faffb5b41640f9e803088b54fbffb5f80308ab23fcff54L4;FF1f00066b60020054e00c4039a200040b1f1c007260", - "0100546072009103fc5f889f00036b2101005402fc038883ffff35f35341a9f51340f9fd7bc3a8c0035fd6L8;FFfd030091083c40f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091092440f93f0500b1400400540a2c40f9093840f90a0100b4BL8;FFe003132af44f45a", - "9fd7b44a9ff830191c0035fd620008052210480521d250194fd7bbda9f65701a9f44f02a9fd0300910800403929004039f40300aaf30301aaL8;FF080102ab2935899ae8ab01f9e9af01f91d250094e0430a91a102198be20314aaf43f0c3916250094e08759ade0830d91e2d7c03de1030e91e00b813de1", - "0f813dBBBBBBBL4;FFc10240f9200080398000f8b728040091490400d1110000145f2800f1880000542800028b08f1df388803f837e0030091a4820094e80340b9a8070037e80b40f9L4;FFe00319aae1031baa2200805214190094a1035ef8810000b4e00318aa220080520f190094a08300d1e103172ad", - "b10009428008052ff2b00f9a18300d1ff2304a9L8;FF130c40f9f301003668fe45d3090440f93f0108ab02040054090840f9210108ab02040054210300b4090040f9200108cb22008052f44f41a9fd7bc2a808190114BBL4;FFaa02148be90b00f9480100f94b1100796002803d690a00f9f44f47a9f72b4", - "0f9f65746a9fd7b44a9ff030291c0035fd6680200f9f44f47a9f72b40f9f65746a9L4;ZFL8;FFaa135538ab2355382901084a4a01084a6b01084aa9031538a9335538aa131538aa4355382901084aab231538ab535538a9331538a96355384a01084a6b01084aBBBL4;FFf34340f9ff430291c0035fd61f0", - "9007181010054aa035ef8090180d20900f0f248dd7892290140b20a000014aa935d38090180d2e8031faa0900f0f205000014L4;FB3934396366386336623562353537662f686b64662d302e31332e302f7372632f6c69622e7273001b737071722076312e73656e645f656b2e726563762065706fL8;FFf", - "e7302f9e82302f9e9a349a9f47702f9f4031d91ef7b02f9e82b02f9e8df40f9e92702f9e82f02f9e8af40f9f07f02f9e83702f9e8c740f9e78302f9e83b02f9BL8;FF080d088b0825019109fd46d30800098b080500911f0109eb68000054fe040014e8031faa160114ab020d0154f47349f99f0e00b1610", - "00054e8031faa0d000014L8;FF1190fe9708068052e9f342f9e07fc13d6826089be183c13de287c13d69060091e0833291000500ad0209803de9f702f96bf3ff97fc9740f9e89b40f91a008092BBBBL4;FFe183c33ce82740f9e08703ade083c13ce183c03ce84b00f9c80240f9e18302ad680000b4e0031", - "5aa00013fd6c10640f9810000b4c20a40f9e00315aa08f90194L4;FB657373696f6e20c0223a2063616e6e6f742067657420726563656976657220636861696e20696e666f2028c00129001243616e6469646174652073657373696fL8;FFa2037dad8182883c80828a3ca1037aad8282893c8182833ca10", - "f7bad8082843ca003d13c8182853ca10b79ad8382863c9b000014e08745ade00314aaa0873dadBL8;FFfd7b42a9ffc30091c0035fd6008c8152c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0308d1f30308aa410100b416004039L8;FFf66309f93f0308ebe09b843d", - "e19f843dfb6f09f9f62b08f9e0ff833de103843de207843dfbeb0df908590154793600b4f7e74df9e10315aae20319aae002188bBBBL4;FFe9f6ff5418010014e00317aae10318aae20315aa430080528400805224acff97f80a40f9a2ffff17200140fd00a8200e0a00669e4a01c0da4a11c0da4afd43d3", - "L4;ZBL8;FF0104805222008052000400ad0091c13ce85f42f9e0031baae90b00f9e28310ad88f203f80eb90094a1835cf8810000b4e00f40f92200805209b90094e00318aaBL8;FF0020089119390194fd7bbda9f65701a9f44f02a9fd030091140840f9f30300aa3f000271620000543500805208000014", - "3f002071620000545500805204000014L8;FFea4340f9fb0315aaf85b00f9be000014a82247b8e9af4779eaf741f9eb474f39ece34779e81309b9e8f341f9e92b1279e9ef41f9ea4305f9ec1315798b130036BBBBBL4;FFe90700f961000014c90080d248008052a0c300d10900f0f2a2831d38a8931d38a", - "9031df8fffe0094e00700f9210400b021a01f91230400b063843591c9000014L4;FF884640b829008092745601a9680a00b9690200f9f44f45a9f52340f9fd7b43a9ff830191c0035fd609090094c00180522100805207090094c00200b4880000f0L8;FF0900009029612391ea2300a9a82300d1e91300f", - "96202009042d00091e92301a9e32300912b090194fd7b43a9ff030191c0035fd6202040a96102009021640d91BL8;FF63542491a0831cf821000014a0831cf8210300b021d82391230300b063601d91a0e300d1a20180520402805226000014a0831cf8210300b021d82391230300b0L8;FF530b00d1fa2b", - "40f9f93340f97f0214ebf63b40f91c038052a2050054a80100b00821019108fddf8888020035a80100b0e103152a08e14039c07a73781f050071BBBL4;FF050e805229f87fd33f1100f13481889ae30314aa74000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c003", - "5fd6e00741a9L4;FB08000000000000005cf7450000000000000000000000000008000000000000000800000000000000b0e84500000000004368756e6b656400d518490000000000L8;FF1fc90094e86f40f99a0100149ade78b3e8ef42f91f0500b180000054e8c3159100a10191d7c4ff97e87740f98b", - "010014fa031faae0000014fc031faaf6000014BL8;FF2200805216490194611e40f9810000b4602240f92200805211490194612a40f9810000b4602e40f9220080520c49019460c20191f30b40f9fd7bc2a8aefeff17L8;FF08fd46d316050091770a40f9570900b4740640f9f8031faaf90317aae00314a", - "aeafcff97080040b20811c0da081540d2080d088b08250191081848abe2090054BBBBL4;FF35e90194e30300d063a02791e0031faa01048052e2031baa2fe9019420008052010480521be90194fd7bbca9f70b00f9f65702a9f44f03a9fd030091090c40f9L4;FB000000000000000008000000000000000", - "800000000000000704d420000000000000000000000000008000000000000000800000000000000704d420000000000L8;FFe80000b4291040393f050071e0000054000140f9fd7bc1a800001fd6200200b000c01d9122e9009422e90094ff4302d1fd7b07a9f34300f9fdc30191280040f9BL8;FF590000", - "14e8031faa090c40f93f0500b1c1fcff540a1840f9e803088b5f0500b1c1fdff54e80308abe2090054092440f93f0500b180010054092c40f92a0140b2L8;FFe11b40f9e21340f9e843069163a303916423039185830091e00316aa0604805260befe97facb40f9e86346395f0b00b161100054f7430f910", - "8150036c08641a9BBBL4;FFe0030054a8035bf8f42740f91f0119eb40220054a8835bf82a070091a14301d1e0031baa4905805209693938aa031cf81c95ff97b9035cf8a8035bf8080119cbL4;FF7306001100013fd600ffff3420008052f44f44a9f65743a9f85f42a9fa6741a9fd7bc5a8c0035fd6e003", - "1f2af9ffff17ff0301d1fd7b02a9f44f03a9fd830091L8;FFe81340f9800600ad881200f9e3a2ff97f44f49a9fb2b40f9f65748a9f85f47a9fa6746a9fd7b44a9ff830291c0035fd620008052e10315aa16a9009400018052BL8;FF0281c83ca0073ead0081c93ca2033fade18342ade203c73ca1033cad0", - "081c53ca2033dade18341ada1033bad7229019400020034687ec0394802f83769024039L8;FFf451fe97e0234fa9f4e302f9081140f900013fd6e0e702f9e8074091e1eb02f908011891290c40f9e163179120013fd6fa034bf95f0f00b141080054c8008052BBBBBBL4;FFe20640f9423100b4e10240f92", - "0008039000ef8b728040091490400d17d0000145f2800f1880000542800028b08f1df38281cf837a0c300d1a27a0094a8035db8L4;FFe2830c9100401d91ff050094e8ab4bf91f0900b1813e0054e0074091a20000b042a8309100401d9161620491e4830c9143038052f41700f9f5d700f9ce040094L8;F", - "F09100039e9534039ef5740390b0c00392b10122a0d180039ed634039f1674039e911092a0b240039f05f40392b120d2a08280039e8734039ed7740390c140039BBL4;FF1f0500718c130054a8140035d51e4092e80f41b2e90315aaab000014e0230091e10316aae20315aacbdcff97b50000b4e00316aa", - "e10315aa2200805208910194L4;ZDL8;FF2a0100b04a910491600100f000680d91e1430091e92b01a940910094fd7b42a9ffc30091c0035fd6000040f9080040b9280100341f050071a1010054880100d0BBBL4;FFe18242ade212c03da303da3ce38901ade18102ad03f9ff540400001428050091df0208", - "ebc986899a3f011ceb000800549f0316ebc2070054680b40f9f94f00f9L4;FB6c0f99c38f27e296114a37cd30e4feb38cbc834db69dd4bb12bdafed4fb2a28c977aa8ea00004997ac90a79f0ae7cc47c16fff71cf51a3a927e2205bb2055deeL8;FFe99b00f9e9cb40f9e9eb00f9e9b740f9e9cb00f9e98b", - "40f9e9b700f9e9c740f9e8c700f908018052e98b00f9e9df40f9e87300f96ef9ff17e87740f9f40309aaBL8;FFe8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aa11110094fad342f9fc0740919c830191dffdff17f80300aae04316912200805209110094L8;FF20c3c13ce98745b9e", - "86f04a921c3c23c1f0b0071f59b45b9e8bf45b9e1c20891eac742f9fbcb42f9208717ade89308b9e11f00f9a1170054e20f4ba9e0031691BBBBL4;FFe96740b97af204f868ae0239884e41b9775e013969221729e86340b96a4a01796802033947ffff17e8031faae93200d103000014e8031faae92a00d1", - "4a1d4092L4;FB5f636861696e5f6b65792063616c6c656420666f72206e6f6e2d6578697374656e7420636861696e759148000000000034000000000000006e0100000e000000L8;FF8401805209000014e00300f9210200f021501691230200f063d01391e0030091e20180524400805240e6ff97e10340", - "f99effff17ff0302d1fd7b03a9fa6704a9BL8;FF6901084aab535838a93318384901084aaa635838a94318386901084aab735838a95318384901084aaa835838a96318386901084aab935838a97318384901084aL8;FFf4031baa0969213828040091f87749f9e8d302f91f0700b1a01a0054c0220291302", - "40094080040b20811c0da081540d2080d088b0825019108fd46d30900088bBBBL4;FFe00318aac299ff9708008092686e00a9e00748a9610000b42200805210b10194b5c6ffb4e00314aae10315aa13feff17aa035ab8e00748a9ec2700f95f050071L4;ZBL8;FF490109cb0a0e8052292d0a9b0a0480522", - "a5d00a92a2101a9367d02a93f3100b92a8103a92aa104a938fd05a93f6900b9610100b4e00314aa22008052f44f4ba9BL8;FFe233833d6190ff54e06317910e68ff9780fcff1721010054810000b4a01240f9220080520e310194a11a40f961f4ffb40804805205000014a11240f93f0400f1L8;FF02f0ff", - "97c80080d20800f0f21c450091a2000014e84745f9e94b45f9e000009000f02f91e1832491e84b03f9e8431a91e94f03f949fdff9029312491e89304f9BBBBBL4;FFe00642a9e2330091c7fcff9708fc79d3e0e7076fea031faa010d010ee92240a90b00088a22696bfc438c212e6c00669e8cc101f28001", - "00548d01c0daad11c0daL4;FFf3ffff17e86640f9c80000b40805088be00315aa0201805201ed7cd3100100945f0b00f1e0030054f5d24fa9d40200b4b982009104000014940600f139c30091L8;FF080740f91f0100eb42020054e80f41b2e80700f907000014c90080d248008052e04300390900f0f2e8", - "470039e90700f9e0230091fbf6ff97f44f4da9f6574ca9BL8;FF75ea7bd3130300f073621191e0030091a1630091e20313aab40f00f99482009153810194b58200f121ffff54e003009150810194f44f43a9f51340f9fd7b41a9L8;FFd30e43f87f0600b180fcff54e00316aa80edff97080040b20811c0d", - "a081540d2080d088b0825019109fd46d30800098b080500911f0109eba96f0054170115abBBBL4;FF00040054e00317aae10316aa2200805213c10194e00313aadb000094680e40f91f0500b160000054e00740f962aaff9760820091e1430691022a80527c0e00f9L4;FB726f723a20c0013e0038706f73", - "742d7175616e74756d20726174636865743a206572726f72206372656174696e6720696e697469616c20413242207374617465L8;FF6183813ce86700f9e95b00f9361af8b6f9031faae00319aae10316aa1dc10094806ec03d8a220791886206910101c03d88d640f989e240f940838f3c4001c03dBL8;F", - "F550300b4610a40f9680240f9941240f91f0101eb40070054680640f9490480522a040091e00315aa6a0a00f909692138e10313aab6faff97760a40f9680240f9L8;FFfd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aa810000b4600640f9220080520c410094610e40f981", - "0000b4601240f922008052BBBBL4;FFcd000054390300eb43ae00541803008bf9feffb50f0000141f0400b1a1ad005432e101941f10003121ad0054f9ffff172fe10194f70300aa1f0400b141fdff54L4;FBec0000002e00000034ed4800000000006a00000000000000890000002e00000034ed48000000", - "00006a00000000000000f30000002e00000034ed480000000000L8;FFe0b740f9e10317aa2200805214e1009402feff17e18b40a9e0432d91e4974329412b0094e8ab45f91f0500b1e1b6ff5474ffff17e0d7c23de8b345f9000200f0BL8;FF00018052010480522d610194fd7bbea9f30b00f9fd030091f", - "30300aa0c61019400048052010180520a610194000100b4e10200f021e00191130000f91f600039L8;FF881e40f9e083c33ce0031faa2823189b000d803de083c43c0011803de083c53c0015803de93740f9093100f929070091e083c03c0001803de083c13c0005803dBBBL4;FFe0230091a34300d10821", - "09aa6905c05ae083803cb6831ff808010aaa0ad49052284108aa2a00a072097dd59b28a10a9be90f40f9e9a301a9a8df3ea925a10194L4;FFe10315aae00313aa0b030094000080d2f35341a9f55b42a9f76343a9f92340f95800001400430891b70300947bffff17e10314aae003132af3fcff97f703002", - "aL8;FFff030191c0035fd6ff0301d1fd7b02a9f44f03a9fd830091140040f9e00301aa810100f021641991e8230091a201805257a10094b30100d073a20391810100f0BL8;FF140c40f9020440f9f30300aa14030037550001ab621400548982009129fddfc83f0500f121070054960640f9610240f93700", - "16cbea0215ab22140054890240f9BL4;FFf51f40f996000037980000b018e31e9113000014d7fe45d3e80214ab420d0054e90200ab620d0054aa0217cba8831cf8a8c300d1a02301d1a9ab3ba9bb09ff97L3;ZB" + "BBBBBBBBBL8;FB7f454c460201010300000000000000000200b7000100000000a04600000000004000000000000000a86c09000000000000000000400038000700400012001100L8;FFe80b00b9c82e40f904000014009000911f0002eba2f7ff54011000913f0002eb280300540a01008be90b40b94b014", + "0b92909c05a6b09c05a3f010b6b89feff54BL8;FF68ae40f9a80000b460b240f901f97fd3420080528825019468ba40f9e80000b460be40f901f97fd342008052f30b40f9fd7bc2a880250114f30b40f9fd7bc2a8L8;FFfdc30091080040f9090540f9490d00b40a0140f9410180390101f8b7e0031faa4a", + "050091290500d10a2500a9fd7b43a9ff030191c0035fd63f2900f188000054BBL8;FF21008052390080528a650194c0feffb4e1031aaae20317aaf80300aaf9031aaa8c650194e8630091e0230091e1031faae2031f2a847a0194faef41a9e00319aaL8;FF400200b4e9000014c1620091e20313aae3fcff", + "97a00100b4c9000014c1c20091e20313aadefcff97000100b4d6000014e01c00b5e00313aab7fdff97e80301aaBL8;FF6effff17c80080d20800f0f2080900916affff17c90080d2e8230039480080520900f0f2e8270039e90300f9e4ffff17c80080d2e0230039e00300910800f0f2L8;FD68a84600000", + "00000d0a046000000000058a046000000000018004700000000000000020000000000050000000000000000000000000000000000000000000000BBBL8;FB42024000000000006a00000000000000440100001c00000042024000000000006a00000000000000090100002e00000042024000000000006a0", + "0000000000000L8;FF9a1a40b95f070071e10500548bb243298b0600346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0d0091cc0500348c0140b28c11c0da8c1540d2BL8;FFe90300f9e90300910a0200904a611591eb230091f30300aae9ab00a949008052cafefff04ac13a91a00700d1", + "e1630091e9ab04a9c9feffb029b91891e9af06a9L8;FFc0035fd6e00741a923010094fd7bbea9f44f01a9fd030091f40300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aa81050094000300b50e000014BBL8;FF1f0d00b1a8000054e0031caae1031baa2200805288450194280700d11f0d", + "00b1a8000054e03340f9e10319aa2200805281450194c80600d11f0d00b1a8edff54L8;FFb50600f1d6a20191c0020054c1025df8810000b4c0825df82200805286450094c1825ef8810000b4c0025ff82200805281450094c10240f9810000b4c00640f9L16;FFe9ff00f909ed40f9ea2f17a90aad5ca9e", + "9cf00f909f140f9e9b300f909f540f9e9c300f909f940f9e9ab00f909fd40f9ea2712a9090141f9e9af1aa9090541f9BBBBL8;FB450600000a000000ef104000000000004e000000000000004506000005000000ef104000000000004e00000000000000010300001f000000ef10400000000000L8;FFab5", + "31838ab835838a9631838a99358384a01084a6b01084aaa731838aaa358382901084aab831838abb35838a9931838a9c358384a01084a6b01084aaaa31838BL8;FF69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff54e0fefff000202f9134110194e0fefff000e00e9131110", + "194fd7bbfa9fd030091L8;FFe0e300b9a04700d1f1c2ff97e0df00b9a04700d1eec2ff97e0db00b9a04700d1ebc2ff97e0d700b9a04700d1e8c2ff97e0d300b9a04700d1e5c2ff97e0cf00b9BBL8;FF08d300a9a1035bf8f40740f90083813c0183823c090300f9810000b4e0031aaa2200805284550194f", + "70f40f9b50000b4e00314aae10315aa220080527e550194L8;FF400707ad4243803d081140f9a80300b4080000b00871089129feff9029c11f91bb2336a9a84303d1a82737a92800805289fdfff029c11d91aa8302d1a04700d1L16;FFe8df43f92003029140f18e3ce9cb43f9f8432d91e1eb803de0ebc0", + "3d41f1ce3ce8cf01f9e8432d91e9bb01f940918b3c41818c3c05150094e8432d91f7ab45f9BBBL8;FFe10313aa79fbff97770a40f9680240f9080117cbbf0208eb480f0054680640f9e10316aae20315aa0001178b89750194e802158b680a00f9952e40f9d5f2ffb4L8;FF080040b20811c0da081540d20", + "80d088b0825019109fd46d30800098b080500911f0109eb681200548e0000148002039129240094080040b20811c0da081540d2BL8;FF4000005482feff97744640f99f0600b1e0020054735649a9950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f922008052L8;", + "FF61d05f3864e05f782110001200010034640000345f000039007d20d464805fb8e0ff9f529f00006b6dffff54826c1c53e001809200c022cb6500008b606860f8BBL8;FFf41300f980020054e83b49f9080100b4090140b22911c0da291540d2290d098b292501910819498b08050091e98792b96901003", + "4290140b22911c0da291540d2L8;FFea431a91e95f05f9a04700d1e1032a91e94705f929fdffb029ed0a91e85b05f928fdff9008552c91e95305f9290080d2e86b05f9c80480524941c0f2ea6f05f9L16;FFe0874da9810000b4220080528ab50094e90315aae12340f961f9ffb4e00309aa2200805284b5", + "0094f4031faa2bf9ff17e0c31591aabeff97e0c31391bdbfff97BBBBBL8;FB795f70726976617465636861696e5f6b65796d6573736167655f6b6579730000ef104000000000004e0000000000000064020000130000005369676e616c4d65L8;FF9a0200b4c80a1a8b6a3f001209c15f785f01096be9979", + "f1a29219f5a291d007200feff543f05007141020054a9035ef85f0309eb000700545a0700b11b010079BL8;FFc802148b680a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6e8031faab60a40f976f4ffb5b41640f9e803088b54f5ffb5e00308ab23f6ff5400ffffb0L8;FF087140f8f90b40f9f8", + "0300aa1500f0f27c008052090000f9f6018052087000f81d000014e89f4139e9534678fc834139fa3740f92841082ae91346b8378108aaBBL8;FFe0c30591e1031faa220080522300805224008052f8e8ff97e0a357a97cffff1780ffff9000600a913459019480ffff90008039913159019460fffff0002", + "03c91L8;FF02288052935d009400630091e1c3279102288052fb9b05f98e5d0094e88b4cb949008052f9a305f9f5a705f91f010071f3ab05f92801881ae99f40b91f01096bL16;FF610a40f9680240f91f0101eb000a0054680640f9090180522a0400916a0a00f909692138e10313aafdeaff97e00314aa", + "080c43f81f0500b160000054e10313aaBBBL8;FFff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052L8;FF08810991f5074091b5820991d5caff97f43349f9e0431691a1220091027380528c7", + "d0094e083c53de187c53d15008092e8436c79e057813de15b813de8e30a79BL8;FFe10314aae30313aaf44f42a9f65741a9fd7bc3a891feff17480014cb160113ab62010054e00314aae10302aae20313aa2dfe0094b65200a9b30a00f9f44f42a9L8;FF1d0080d21e0080d2e0030091a1dcffd021000091", + "1fec7c9201000014e20300aa240000d0230000d0200000d0849040f9050080d2639440f9009840f9418440f8BBL8;FFb5031bf80001178b08108052e21640d2a0873aadf81640d2a303973c08140038f03d01941f1f00f1a8010054a0877aada10301d1e00314aa22008052a0073eadL8;FF686219916962", + "1a91c32ac03d60061e3960621991e10318aa759e03f9000500ade00a41ad63de813d000901ad800740ade8435039200500ad820341ad68021e39L16;FFf5c301f9f5430d91efb702a9ee6700f9eb2b00f9ea1f00f9f4230e39a092833ce8cf01f9f7d301f9a61f0094e7b343f9ff0400b100ad00540093c0", + "3ce8bf43f9BBBBL8;FB0e6bafeddac63c9ea28cdccbe93f5c86428b000059c77297db5b51cf7f991010f80785b478104c3b620b8b914040e01f50052680a7bbfdf629516faeee4ad4ecL8;FF805b00b4f80300aa8e8d00944001805241008052878d0094b3008052405700b4e8fdffd00881389149408b52", + "080140f909100079130300a9080000f9130b00f9BL8;FFe0833291c1fefff021203f9102028052e3feffb063801b91e40180527b130094f55346f9e0833291e1032d91022b8052880d0194e083329103e8ff97f30315aaL8;FFf44f07a9fd830191f30300aae0230091a2e9ff97f40740f99f0600b1e0010", + "054e083c13ce183c23ce81f40f9608600ade00742ad681a00f9e80b40f96082833cBBL8;FF3f0108eba004005488031b8b18a301f17b83009115411ef839a3019116c11ef815411ff814dd3f29fa3700f95a070091c003005435835cf8f50100b437035cf8L8;FF3e49009480fdffb000a02e913b4900948", + "0fdffd00000009138490094fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e0030054e00313aa40000094L16;FFe8db03f9e9a349a9f21304f9e61704f9e8e303f9e8df40f9e9df03f9e8e703f9e8af40f9e72304f9e8ef03f9e8c740f9ea2b04f9e8f303f9e8b740f9fb2f04f9BBBL8;FFed6", + "700b9996a0094a8835c38aa135d381f050071e1000054a8035d381f0500718c030054c8120035e90f41b299000014a8f35c38e00314aae82b00b9a8d35c78L8;FFf80310912a15003308111d12e8430639e8031091eabf0639200740ade00600ade767ff97e00640ada00302d1808702adde820094e84306", + "91a08303d1c1e20091BL8;FFe20313aa1f0b0094f50300aadd010014e1430091e20313aaf70b00f9f73f00f9970a0094e08743adf50300aae227c03df4c300f9e0870aade08741ade25f803dL8;FFe52b00f9e37f0b29e01740f9e10b43a9e43740f9e7ffff17fd7bbea9fd030091f35301a9f40300aaf30", + "301aa96ffff97e00314aae10313aae81a80d2010000d4BBL8;FFe1d342f93efcff17e04316912200805296110094e1d342f955fcff17e04316912200805291110094e1d342f960fcff17e0431691220080528c110094e1d342f9L8;FF5f0b00b101110054e8e342f9e29340f9e07b40f9e16b40f91b5501b", + "9e8a74fa9299940b9e9b305b9081540f900013fd6e0e302f9e8074091e1e702f908011891L16;FF5f0008eb41380054f60302aaf30300aae023019181a2019102328052f50303aa8cad0094e0230191e10315aaac250094e8630791e0230191a5230094fbef40f9BBBBBBL8;FB6f632f7372632f73747269", + "6e672e7273002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d6235386437663536653336L8;FF8ca10094c01200b488060091e00b00f9f3a301a9141000b4e20a00d1e1031f2af30300aaefa100947306148be9031faa2800805237feffb0f78230911b008092B", + "L8;FFec0314aa2ba040a9290040f90afc78d37369283808050091280800f98af3ffb4e8ffff17e10300a9e00301aae10309aa22008052f4030aaa8c050094e10340a9L8;FF421d0094ffc302d1fd7b08a9f65709a9f44f0aa9fd0302910920403989050037010040f9f30300aa22fdfff042402f91a0c300", + "d123028052f40308aa12120094BBL8;FF3f1100f13481889ae30314aa0c000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9175d0194fd7bbda9L8;FF680640f9090180522a0400916a0a00f909692138e10313aa50faff97e00314aa088c44f81f", + "0500b160000054e10313aa75fdff97950a40f9550300b4610a40f9L16;FF64018052f1ffff17c90080d2e8230039480080520900f0f2e8270039e90300f9dfffff17e80f41b2dcffff17e00300f981fefff021640d9183fefff063cc0d91BBBL8;FB1d1c4000000000005400000000000000790000000500", + "00001d1c40000000000054000000000000007f000000050000001d1c4000000000005400000000000000L8;FF945640f91f0101ebe0420054e81340f9490480522a040091e00316aaea1700f909692138e1630091fd8eff97f71740f9e80f40f9080117cbdf0208eb28420054BL8;FFc0035fd6e0031faa2", + "3fd0094e00741a921fd0094ffc300d1fd7b02a9fd830091e80100f00861159109200091e02301a9c0feff9000ac0891c2feffd042c03b91L8;FFfd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff071ef83b008052f30308aaf5031faaf9031faa34008052180082521a02", + "a052BBL8;FF60001fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091344c40a941ffffb021143a91150040f9e2008052680e40f9e00314aa00013fd6e000003620008052L8;FF9000001468424e3975420e911f0900718d1b00541f110071c11b005468ca533977ca13917a620e911f110071ec2d0054", + "1f0900712d3200541f0d0071013d0054L16;FFe98740f9e84f00f9e9df00f9e9af40f9e98700f9c8f2ff17e8008052eeb300f9e3f340f9e87300f9ee734ca9e8db40f9e4a709a9e4030caae50700f9e9031aaaBBBBL8;FB053e2cb4db17ce5f367c4c39ce7f02652f7fb7283c33ce9512f89694325003279", + "672ecea93c86f09e89cfeff95cf179603b10000a1b21de3c1bf24a3cb3722a7L8;FFfd7bc1a8c0035fd600feffd000a004913a8d009400feffd000600291378d0094e0fdfff000200c91348d0094281040b96800c8376800d037488d0014398d0014BL8;FF94110194f4e340f9f61b00f9b40500b4f30700", + "f9f303152af5031aaafa0317aaf703182af8df40f986110194e00314aa210080527f11019400fc00b4e10318aaL8;FFc1080054f40301aa3f0016ebc2feff54a86a74381fb9007161feff54e8330091e00315aae10314aa9f0dff97e83340391f0900712007005489060091c80209cbBBL8;FF06000014e9", + "1741b2e1030aaa03000014290480d20900f0f2090500a909c48052090900f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e90f41b2e80315aaL8;FF29010a8b290500913f010aebe9050054280108ab8300005426000014e80308ab82040054090840f9090100b42a0140b24a11c0da4a1540d24a0d0", + "a8b4a250191L16;FF0c345ba9eeb31da9ed3300f90c345ca9ecf700f9ed2f00f90c345da9ec7f00f9ed4b00f9009c00541f05007101bf00548800805209008092790a00f968220039BBBL8;FFc4018052ac01001401300591e003022ae20303aadff6ff97203500b4a1ffff9021203f91a3ffff9063e03c9", + "1e00700f90b00001401e00191e003022ae20303aaL8;FFab100094fad342f9fc0740919c8301914afeff17c0fdfff000c00491376d0094f80300aae043169122008052a0100094e1d342f9e00318aad4fbff17f90300aaBL8;FF0805009120008052290040f9280800f983ffff17e00301aaf30301aae103", + "09aa220080522300805224008052f4030aaa5f1500946ca240a9ea0314aae10313aaL8;FF02e01f7800c0238b1fc01f38e40840f984400091040004cb211c001201d01f38030100cb84fc44d304e01f786500056b20010054e103054bbf1000711fc92138BBL8;FFe8cb42f91f0101eb807d0054e8cf42f9", + "49048052f4074091948209910969213828040091f67749f9e8d302f9df0600b10026005480220291271e0094080040b2L8;FFe077823d210140ad190540f9e1df813de0e3813db90100b4140140f989310094e00319aa2100805282310094209600b4e10314aae20319aafa0300aa85310094L16;FFfd030", + "291280840f9f30301aa1f0101f161060054681640f91f8120f101060054682240f91f010ff1a1050054e10313aa348c44f89f0600b1000a0054753e40f9BBBBBL8;FB7b0000003c00c800e700a4002501660031003d00135a6852842b007c494c059ea36eca27c5003b362c0b1640315f756f31061e110d0", + "d00000000000000000000L8;FF84203091a273009141038052a87300392995009420008052e10316aa1e950094283c0012493c4092288108aa093c40922101679e0001679e20e0e00e013c184eBL8;FF3f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b250191", + "4a194b8b4a050091090100b42b0140b26b11c0da6b1540d2L8;FF210080528b19009420fa00b428fdffb0083d3e9118fc78d3090140f9086140f8ca018052fb0300aaef031f2aee031f2afc031f2af7031f2a090000f9086000f8BBL8;FF2555019436008052e9030091a86300d12091009111560094b783", + "5ff8d7feffb7bb035ff8170400b486590194e00317aa21008052390080527e590194e0fdffb4L8;FFe07f813d93590094e8fb42f91f0500b161ebff54e99f40f9f3000090681240f93f0500b1c0010054fa4340f9a81000b4e8833291606302919ff3fe97e85346f9L16;FFdb000014a80a00d1f46701f90", + "5000014e80b41b2e06701f902000014a80600d1e0030b91e86301f9e9dfff97f40300aab4000014f55356a9e0030091c1420091BBBL8;FFf44f42a9fd7b41a9ffc30091c0035fd6f30300aae00301aaf40301aae10309aa220080522300805224008052f2040094880a40f9e00313aae10314aaedffff17L", + "8;FFec8352b96b0100346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0d009104000014eb031faa0d0000144b0080522c0100348c0140b28c11c0daBL8;FF0080813c600ac03d0180823c0080833cf30b40f9fd7bc2a8c0035fd600018052010980521bf50094ff0302d1fd7b07a9fdc301", + "916a2440a9681040f90b3140a9L8;FF37030094f60318aae00317aadf0600b1c0c5ff54760000b4e00313aa30030094e8031faae1031faa4cffff17fd7bbba9fa6701a9f85f02a9f65703a9f44f04a9BBL8;FF4101005428008052ff0600f17f7e01a97f2200a9687e02a908008092681a00f98a15005449", + "040014e807409180020291f507409108810991b582099103790094L8;FFa1e20191a22302d124f4ff97a0faffb443010014e8db44f91f0500b14101005408018052ffdb04f9f8df04f9bf7e0aa9bffe0ba9f8eb04f9e8f704f9fffb04f9L16;FF21f9ff17810000b4e0031caa2200805289b90094b80000b", + "4e08b42f9e10318aa2200805284b90094e19342f9810000b4e09742f9220080527fb90094e19f42f9BBBBL8;FB42024000000000006a000000000000006e0000002e0000004d657373616765206c656e677468206d75737420626520646976697369626c6520627920324d6573L8;FF01ed7cd3020180528", + "b890094ff030991f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6f80f40f908008092e82700f9e83300f9e83f00f9BL8;FFf85f03a9f65704a9f44f05a9fd030091ff032ed1f30308aaa83340f9eafeff904a610491ff0300f9a96b40b9e82f00f9ea4302f9ea4702f9aa4700d1e7a", + "30ea9L8;FFb91d0094e8df40f91f0500f1a0540054f55f5ca98b090094000880520101805284090094207800b4f40300aa155c00a997008052350080523f0700f1f78b01f9BBL8;FF2545019400018052e10314aa2245019420008052e10316aa1f45019420008052e1031caa1c450194ff8300d1fd7b01a", + "9fd430091280440a9890200b029b11491L8;FFe97200f8ebf200f8ea7201f83ce2fe97e84346391f05007161050054e8a759a9e80302f9e8031091e90702f9a80318f8c8000090081140f91f0900f103040054L16;FFe093803de1f3803de82b01f9f6bf00f9f2d711a9e70f00f9e70301aa08008092e2ef", + "00f9e2031baae87700f9fba34ca9f65340f9f4371ea9eb031eaae1d348a9BBBL8;FFa90302d1290140f9ef2f40b9f01340f9f11f40b9f20b40f94bfd68d34a631baa7f0a007180cdff54c9aa00a9697d1053ac835778ada35738aa035738d33e0029L8;FF8d69009461da40f9810000b460de40f92200805", + "28869009461e640f9810000b460ea40f9220080528369009461f240f9810000b460f640f9220080527e690094BL8;FF9f7e01a9997e02a99f3200b9e003082ae10314aae20313aa63faff97a00f00b520fcffb4d6ffff17898243f83f0900b161000054971e00f99f3600f91f0900f1L8;FD000000000000", + "00003431440000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000BBL8;FFe8c302b98b4100f8204b803d8ac100f8204bc03de8d342b929ffff9029212b918101c03de01b40f92043813ce1031091e8a301b9e8b341b92007c", + "03dffeb01f9L8;FFf65744a9f85f43a9fa6742a9fd7bc6a889290014c80240f91f0308eb4002005408068052a002c03da90a40f90867089b0a070091ca0a00f9144d00a9170900f9L16;FF742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a91fa50094ff0301d1fd7b02a9f44f03a9fd83009101", + "0840a988008052f30300aae023009104018052BBBBBBBL8;FB696f6e20c00f20616e6420646972656374696f6e20c0001b737071722076312e73656e645f63742e726563762065706f636820c01a3a2043743153616d706c65L8;FFffa701f9e8a301f9ffab01f9e8af01f9e8bb01f9ffbf01f9ff230e39e", + "80701f9ff0301f9b88319f8a115005429feff902921259128048052f50b00f9f50317aaBL8;FF251f0194a00100b4f50300aa8d230194e00315aa21008052f40315aa3600805284230194a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad3L8;FFc80080d20800f0f2080500d1a0c300", + "d1a8031df8ee29ff97e10300aa43000014e1031faa4100001441fdff9021602c9143fdff9063282d91a0031df836000014BBL8;FFf80f40f9f703192af903142afa0315aa28008052020000143a008052f52b40b9e85f1829e9534929f60309a9e8571a29e82f40b9e00b00f9e0830191e9231b29L8;FFe0", + "0313aa22008052a9020094610a40f9c3ffff17e00313aae10316aae20314aaa3020094760a40f9680240f9080116cb9f0208ebe9f8ff54e00313aae10316aaBL8;FFa10d0054e00313aa74f0ff9740010036410b00b5e0031faad4ffff17e003082ae20313aa430c805216eaff97e0f9ffb4c4ffff17a806", + "40f91a0101ebe2000054L8;ZDBBBL8;FBef104000000000004e00000000000000b904000017000000ef104000000000004e000000000000005707000005000000ef104000000000004e00000000000000L8;FF1f0101ebe06e0054e81340f9968248f8490280520969213828040091df0600b1e81700f920", + "1f00548022029125f2ff97080040b20811c0da081540d2080d088bBL8;FF280080520b0000148e030194000480522100805287030194a00100b4e00741ad09048052e8031faa60a600a9000400ade0030091680200f9dc180194fd7b48a9L8;ZFBBL8;FF68028052290141d23f8d00f12831889a49ffff90", + "29f107918a0000102b7968784a090b8b40011fd608200091200440a9e92300910a0000904a113f91e8a700a9L8;FF0001803de083c13c0005803de083c23c0009803d892200f90c000014e003082ae20313aa630c805269f9ff9780f6ffb4a9ffff17e003082ae10314aae20313aaL16;FFe9ab43f9eb8f0", + "0f90ba94ea9a9031ef8e9f301f9097d40f9e127833de9af13a90b2550a9ebab01a9e91700f90a2551a9e9ab04a90a2d52a9ea0b00f90a2553a9BBBBL8;FBaf01000021000000d3094000000000005500000000000000b701000021000000d3094000000000005500000000000000bf01000021000000d309", + "400000000000L8;FF1f0900b1010b0054f3031faa64000014e80300aa098d40f83f0500b180160054f30300aae00308aafcfeff97e80300aae00313aa090140b22911c0da291540d2BL8;FF4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb29030054280108ab8300005410000014e", + "80308abc2010054090840f9090100b42a0140b2L8;FFe8bb43b909b343b839008052eadb43b93a008052e88303b9e8bb4779093300b8e91341f9e80b0679e8a34839ea0303b9e99301f9e8a30c39450000141f090071BBL8;FFf40308aa934f0094f50301aaa100f8b6f8031faae00318aae10315aa1e4f0", + "194350300b4f90300aa86530194e00315aa21008052380080527e530194c0feffb4L8;FF080000b008710891a92339a988fdfff008c11d91c9048052e8c302f960fdff9000402b91e8cb02f988fdfff008412791a10302d1e303169142008052e9c702f9L16;FFfa6702a9f85f03a9f65704a9f44f05a9fd", + "030091ff0740d1ff071df82c0040f9e9008052f5433c91fc233391f80302aaf30300aa880900d19f0500f10881899aBBBL8;FF680640f9490280522a040091e00317aa6a0a00f909692138e10313aa73f9ff97790a40f9680240f9080119cbff0208eb48300054680640f9e10318aae20317aaL8;FF08810", + "991004103917f0f0094f87f49f9580300b4e1d342f9e8cb42f9f97b49f91f0101eb40370054e8cf42f9490380522a040091e00318aa09692138e1431691BL8;FF96000037d8feff9018e3069113000014d7fe45d3e80214ab420d0054e90200ab620d0054aa0217cba8831cf8a8c300d1a02301d1a9ab3ba", + "94cf7ff97a8035ef8L8;FFc3020e91f96b04a9f90301aae12a0091f50317aa627861f8421200b4401840b9800e0035f35301a9fb7305a9441c40b9400440f9a40200355f0000eb20020054BBL8;FFa80600d11f0900b1e823931aa8000036e0031baae10315aa2200805286330194e13349f9f3074091738", + "209913f0400f18b000054e03749f9220080527e330194L8;FF1f0d00b181010054680200f9e8034b391f1500710d0200541f190071800200541f1d0071400200541f210071000200544e000014a8e300d1000540ad0209c03dL16;FFe20342ad620203ade00740ad600606adff431691f44f45a9f65744a9", + "f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd68862069197e25fa9806ec03d0101c03dBBBBBL8;FB73656e64657220726174636865742070726976617465206b6579696e76616c69642073656e6465722072617463686574207075626c6963206b65795768697370L8;FF0081c03c08fc83924803088be", + "00702ade00b45ad1f0109ebe50309ade01bc03de2130aade28f43ade413c03de347803de48706ade08b07ad42030054e90340f9BL8;FF090900396a091b320a010039d6ffff170b7c1253ec0f80120a0900390c440c33090d00396a6d1c320a0100390c050039cdffff17f703002ae0230091e10314aaL8;", + "FF980e0094e1bf4bf9810000b4e0bb4bf922008052881b0094e1af4bf9810000b4e0b34bf922008052831b0094e0db4bf9a00000b4e1df4bf9610000b422008052BBL8;FF20008052e10313aaf30b40f9fd7bc2a8c0035fd620008052e10313aa1e570194ffc307d1fd7b19a9fc6f1aa9fa671ba9f85f1ca", + "9f6571da9f44f1ea9fd430691L8;FF21203f9102028052a3fdffb063a82d91c4018052da000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f9e761ff97e10300aae15306f9e0833291L16;FFf30300aa01020054f40304aaa2020036340400b4f50303aa8adb0094e00314aa2100805283db", + "0094a00b00b4e10315aae20314aaf48300a986db0094f40f00f9BBBL8;FFf85f4ba9fd7b4aa9ff830391c0035fd6e80f40f98a0640f9490108eb631700548a0240f9e00b40f9e20315aa4801088b882600a9580040f9080740f91f0100ebL8;FF28250039f4cb00f9a00b0054e8c30091e0431691008542a", + "d0201c73ce277813de06f813de173813d018141ade807409108810991e06b813de167813df7d2ff97BL8;FF0a819f1a0928003969010d0b4a114e0b29c10011cb0d00122c1c4039092c003949c100117f2500710930003909819f1a9f7d02710a819f1a8d0d00122e204039L8;FFe20314aa0001158b92fb", + "ff97e0031f2aa802148b680a00f902000014e0031f2af44f47a9fb1b40f9f65746a9f85f45a9fa6744a9fd7b42a9ff030291c0035fd6BBL8;FF3f0500716c0400540b0180d2ea474039e80f41b20b00f0f23f01007108018b9a29019f9a0a018a1a26000014e89340b8e90f40b9ec234079ea2341b8eba34", + "039L8;FFdf0215eb60020054e0430f91f70600d138a001913a03158b0d0f0094600745adb5a201916233c03de81b42f9e10318aa408701ad610f44ad601fc03d4217803dL16;FFe22fc23de417c23d3b8108aae9ff43f9eccb43f9e00717ade02bc23de10fc23de9f200f8e9a35f3968114df8e00b18ade2", + "13c23df0435f39e9af00b9e00bc23dBBBBL8;FB2c3fe0bf14bd37d9a68e00000000000000004803821dc58802bc0000000000000000000000000000000000000000000000005849b290cb5edb1a0000f200941fL8;FFe803049194221c9bf50314aaa88640f8a80000b4a00240f901f97fd342008052858b", + "0094e8030a91930200f90001c03de81740f9a002803da80000b401f57ed3BL8;FF1c490091280280520000803dfc5b02f9e85f02f9e86702f9e94313390f000014e033c33de1d3c23de9c31291e8ab45f9fc5b02f9e037813d2181803ce86702f9L8;FFf50b40f9fd7bc3a8c0035fd600018052010380521", + "f070094fd7bbea9f44f01a9fd030091f303012af40300aa850b009400028052010180527e0b0094200100b4BBL8;FF81130054816a40f9e28b815228144038e8830039e8830091000140b28d4b0194a8064039a10a0091e2c38052e8033239e8033291000140b2864b0194a88301d1L8;FFe2020054688e4", + "8f81f0500b140020054e00313aa84ffff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb69010054L16;FF89008052e97300f91b00001428a00791fa8b00f9fa0317aa0001c03df7a349a9e9bf00f969008052ec030baae03740f9e0f3803df90304aae97300f", + "9ed030aaaBBBL8;FFf80740f9080319cb7f0208eb69efff54e0230091e10319aae20313aa2300805224008052f4f6ff97f90f40f9f80740f972ffff1720008052e10319aa16670194L8;FFa00000b4613640f9610000b422008052896b0094611e40f9e10100b408068052606a68f822008052f44f41a9fd", + "7bc2a8816b0014610a40f9e10000b408018052BL8;FFe0ffff17e08741ade00314aaa08739ade08b42ada08b3aade18340ada18338ad70f3ff97a08779ad880080d20800f0f2080500918082823ca2837aad8182833cL8;FFbfd1037141020054dfc50131ed02005441000014cd091b12bf810271e004005", + "43d000014cd410251bfc10071e301005439000014af850351ff31007102030054BBL8;FFe0031aaae10319aa220080528a2b0194e12740f9810000b4e00315aa22008052852b0194e12340f9810000b4e01f40f922008052802b0194ff830891f44f45a9L8;FFfd030091f30302aaf50301aaf40300aa8c2", + "b0094e00313aa21008052852b0094600100b4e10315aae20313aaf60300aa882b0094935a00a9930a00f9f44f42a9L16;FF1f0900716d0400541f1100710c0700541f0d0071811000546c0400f1a01200549f2900f14d018052eb031faae9031faaea031faa8c318d9a4d040091ae696a38BBBBBBL8;FB6c", + "6964204d4143206b6579206c656e677468203cc0013e00196d6573736167652077697468206f6c6420636f756e74657220c003202f20c0001b737071722076L8;FF601e00b48f9f00944000805241008052889f0094e00300f9a01d00b4899f00944000805241008052829f0094001d00b4f30300aa839f0", + "0944000805241008052BL8;FF220080528c1f0194e10313aae81f40f9c80000b4e02340f9e10308aa22008052851f0194e10313aae82b40f9c80000b4e02f40f9e10308aa220080527e1f0194L8;FF03000014b90180d21900f0f2f7031caaf8031baae003c03d280080529a6600a9976201a9951200f980", + "82823c68320039f44f4fa9f6574ea9f85f4da9fa674ca9BBL8;FFf85f03a9f65704a9f44f05a9fd030091ff0311d1ff0300f9fb0300aaf40303aa698f41f8f803012af70308aae21b00f93f0500b160050054086041b949008052L8;FFe11fc13de9830291e88344b9e1a30c91022780522041893c21418a", + "3ce983029120e10291f47312a9f53301b9e85701b9885f009448008052e9f31691ea7340f9L16;FF2a040091b41640f9490280526a0a00f909692138b60900b4c80240b20811c0da081540d2080d088b08250191c81a488b08050091f40800b4890240b22911c0daBBBL8;ZBL8;FF2200805223008052240", + "0805268a3ff97e11740f9e3fdff17e0630091e10318aae20316aa230080522400805260a3ff97f81740f9e80f40f9080118cbdf0208ebBL8;FF08c1029174d600a9780e00f9e00316aa0103805202018052680200f9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a881ff0014000180520103805215fb0", + "094L8;FF010000f981801ff8c0035fd61f2003d582001036010000b981c01fb8c0035fd6820000b4010000394200083681e01f78c0035fd60000803dc200303780009f3cBBL8;FFa10375a9e83700f9ba2378a9b80300b4f50308aa9f0700f12b010054f40300aae00319aaf60301aae1031caa220080528", + "13f0194e10316aae00314aa3f0400f1L8;FF8800805260010014607e42f9618242f9290c40f9e8032a91e1031baa20013fd6f64345f9df0a00b1c1200054a80080525501001460c643f961ca43f9290c40f9L16;FFe9d343f9f4c743f9e047803d6093c73ce93300f9e9df43f9e8e30339684740f9e0a70b", + "a9e0831d91e9e343f9e0938f3ce92300f9e88700f93d1f0094efb343f9BBBBL8;FB8b8c0000c206af7025ec4455d975990844d9eafd497e74b3dcb2e142e672185dd2a9de4b16bcdb54b1d040c5774f26232f0583d814345557dad0491d752b732cL8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b", + "4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd600feffd000600b91308b009400feffd0BL8;FFe13f833d7f0208ebe02b833da0077dade22f833de137833de033833da1efff5400230191d2adff977affff17e81f46f91f0500b1e1000054ff1f06f9f62306f9L8;FFf50301aaf6030", + "0aa8e0f0094e00314aae10313aa870f0094800200b4e80300aad5a200a9df0200f9f44f42a9f65741a9fd7bc3a8c0035fd629008052097c00a9BBL8;FF021740d2e08f06ad1a1740d217140038f44f01945f1f00f1a8010054e08744ad80020191a14301d122008052a0873dade08b45ada08b3ead1a4b01", + "9400e4006fL8;FF4a090b8b40011fd6088c40f81f0900b1411d0054e8031faa73010014e80300aa098d40f83f0500b140250054f30300aae00308aa69040094e80300aae00313aaL16;FFe85b44f9e8ef00f9e86b44f9e8e300f9e87b44f9e8f300f9e88344f9e8f700f9e88b44f9e87f00f908008092e87", + "700f9e8030eaaee0311aaf10312aa12018052BBBL8;FF091041b949000037168800f9f70300aa01500491e003082ae20303aaf80303aadcf4ff97200100b460000014f70300aa01800491e003082ae20303aaf80303aaL8;FFd2ffff17280180d2e00700f90800f0f2081500d1deffff17e90b41b2e92300", + "a9dcffff17280180d20800f0f2081100d1d7ffff173f00156b81f7ff54680240f9BL8;FFe1031faae8079f1a88820039acffff17e1031faa881a00b9a9ffff17e1010054e1031faa9cffff17c80080d2e11700f90800f0f2080900d18cffff17e80b41b2L8;FFf8ffff1704805fb8e1ff9f529f00016badf", + "dff54816c1c53e301809261c021cb0300018b016861f8260840f97f0006eb80000054000080d21f000039007d20d4BBL8;FFc4000014e8031faa00011aabe2650054e1431691400d0094df0600b18000005480220291e1431691351200943f0700b1f90b40f9e07aff5400c303913c010014L8;FFff0316b", + "9e80b00b9cb290094e0074091f90356b98100805200001891ff0316b9c5290094e0074091f60356b98100805200001891ff0316b9bf290094e0074091L16;FF68021891094080524a008052cbff9f52edff9f521c008092050000140c02003529010ecb08010e8b090700b43f0900f12e318a9a3f0500f1a", + "01c00540c014079BBBBBL8;FB0000000000000000010000000000000001000000000000005c43420000000000000000000000000000000000000000000100000000000000a036420000000000L8;FF4a1540d24a0d0a8b4a25019129194a8b29050091280108ab220a0054090140b22911c0da291540d229", + "0d098b2925019129fd46d30801098b080500911f0109ebBL8;FF0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb481f005439010014002000918903009424000014e80300aa098d40f83f0500b1L8;FFf3c4ff97e0e300b9a04700d1f0c4ff97e0df00b9a04700d1edc4ff9", + "7e0db00b9a04700d1eac4ff97e0d700b9a04700d1e7c4ff97e0d300b9a04700d1e4c4ff97BBL8;FFe20304aae30305aae40306aae50318aae60317aa70feff97e82b40f91f0900b1c10b00541803178bfa2f40f9f30f00f9080340394aff70d349ff78d35b7f0853L8;FFe0000054e1825ff881ffffb4e00", + "240f92200805288570094f8ffff17e89340f9c80000b40805088be00313aa0201805201f17dd380570094e063c13de167c13dL16;FFf40300aaf30308aa291140f93f0d00f1c3030054887200918900009029711391e8a700a9886200918900009029911d91ea230091a00700d1e8a701a968008052BBBL8", + ";FFe93740f9093100f9e9060091e083c03c892200f90001803de083c13c0005803de083c23c0009803d12ffff1780c20091cf150094e9ffff17e00313aa02860094L8;FF3f0400b140010054810000b4e08f49f92200805288770094e19749f9810000b4e09b49f92200805283770094f47749f99f0600b1", + "80aaff54f57f49f9f37b49f9BL8;FF082440f9f30300aa22008052e00308aa89f70094e00313aa012c40f9e10000b4083040f9f30300aa22008052e00308aa81f70094e00313aa088040f81f0500b1L8;FF210000b084dc43f921001e910000805273ce00a9640e00f9632200b9623e00f9614e00f9f30b4", + "0f9fd7bc2a8c0035fd600008012fcffff17fd7bbba9fd030091BBL8;FF29ffffb0294d279108c13591e94309f9290080d2e85f09f928038052091ac0f2ff3309f9e83b09f9ff3f09f9ea4709f9e85309f9e95709f938330194f6ef47f9L8;FFe0232a39e0032a910800f0f2ff272a39e84305f9ee3dff97e", + "80300aae84305f9e0032a9161fdffb021201391a201805263fdffb0637c1391240280522b000014L16;FF0a0000145cfbff17d90000b4e07f42f9e10319aa2200805287b70094e05f40f9e17740f9610000b42200805282b70094ba0000b4e05b40f9e1031aaa22008052BBBBL8;FBe802000005000000a1", + "104000000000004d000000000000005303000009000000a1104000000000004d000000000000005b03000009000000436861696e73656eL8;FF08ffff540a09098b4b0140797f01186b610000545b050079c1ffff17aa0240f93a25899a9f030aeb8003005416091a8b88031aebc900005402f57ed3c0120", + "091BL8;FF29011591e8c702f9e8ffffb008012391e9d702f9c9048052e8cf02f9e8632291c0feffb000081391e8d302f9e8feff9008810c91e1031691a30302d1a82738a9L8;FFa010005416d140a9740f00b48906148b1c1140f93aed7cd3fc0700b47c16f8b7080d40f9fb5b02a9dba20091f95f03a9e8", + "2300f968577ea9e82700f981070094BBL8;FFec7241f8684e0079e89240b8692202b8e9d2407868a202b808088052681500336a520079eaf240f8695e00796a3203a9680201397f020039b60600b538000014L8;FFe112c03d8092823c8192833ce9c700f9e10740f9010600b599feff17e8b740b92043c2", + "3cc0e200912183c33c2207c03deab341b91f010071f8c741b9801f803dL16;FF28a007910001c03deba300f92ba04fa9e0f3803dea2f13a9e8a701a939a450a92aa051a9eaa704a9e80b00f929a052a9e84300f92aa053a9e8a706a929a054a9BBBL8;FFf30308aae8030091e00309aa97640094e9034039", + "e82740393f050071e1000054e92340393f050071cc020054a9030035ea0f41b223000014e9a340b868260039L8;FF8c1d0e0b8c0102518d00f83761710c8bcb008052280000149f114071630800544d19c039ae1d00128c390e0b8c1140518d00f83761710c8beb0080521e000014BL8;FF410500343f040", + "071000200543f08007161fdff54888246f81f0500b1a10000549fe606a99ffe07a999fe08a99f9a00b981a20191e20313aa5bf8ff97600400b5L8;ZDBBL8;FFe80b40b9400504ad418147ade8a700b9e81340b9430905ade4838a3c8001803de8d302b9214b803dfafdff1788020090081140f91f0900f12", + "3030054e8b30a91L8;FF0805088be00314aa0201805201ed7cd38927009474d64fa9350200b49682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef822008052L16;FFe00316aae10315aa22008052f44f4ba9f6574aa9f85f49a9fa6748a9fc6f47a9fd7b46a9ff03039183a700", + "14b9035ff8090080921f230039090300f9880219ebBBBBBBBBL8;FB353962342f7372632f76312f756e6368756e6b65642f73656e645f656b2e727300636c692f7372632f6c69622e727300083c6572726f723a20c0013e002f6361L8;FFe6030091e00316aa85048052070c8052e20314aae00300ade003", + "01ade00302ad82080094b71e00f986a4009400048052210080527fa40094e00c00b4e00740adBL8;FF810000b4600241f9220080528a24019460220091f30b40f9fd7bc2a8a1feff17f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aaL8;FF290040f90bfc63d3536928380", + "8050091280800f9cbfdffb43f0108eb93611932a00300540cfc6ad35369283808050091280800f92c0500b5e0030baa3f0108ebBBL8;FF680e00f9000400ad742200b9750200b9f44f44a9f51b40f9fd7b42a9ff430191c0035fd620008052010480521a600194ff4301d1fd7b03a9f44f04a9fdc30091L8", + ";FF42018052a4008052a8031df87f6aff97a1035df8e80740f9f30301aac80000b4e00b40f9e10308aa2200805282640094e10313aae81340f9c80000b4e01740f9BL8;FFe8270039e90300f9dfffff17e00300f9a1feff9021c81191a3feff9063001291e0030091c2018052640080521a000014e00300f", + "9a1feff9021c8119183feffd0L8;ZDBBBL8;FBab0100001e0000006c69627369676e616c5f70726f746f636f6c3a3a73657373696f6e5f6d616e6167656d656e7443757272656e74000000bb12400000000000L8;FFc00080529ea4ff979f0f00b100020054e11740f9e80f40f91f0101eb607c0054e8134", + "0f92a040091e00315aa49038052ea1700f9096921383ff0ff97e1630091BL8;FF9f0219ebc1faff54e08756ade8830c91e2bfc03d14010291e1031f2ae0071eade08754ade2fb803df9f741f9faf341f9e0071cade08b55adf67f4e39e00b1dadL8;FF01010054f5031f2ae003152af44f43a9f65742a9f8", + "5f41a9fd7bc4a8c0035fd635008052e003152af44f43a9f65742a9f85f41a9fd7bc4a8c0035fd600000000BBL8;FF5b000014e80308ab220b0054695641b969010034290140b22911c0da291540d2290d098b2925019129fd46d329050091280108ab830000544d000014e80308abL8;FF3e40009480fdff", + "9000c020913b400094ff0301d1fd7b03a9fdc30091080040f9090540f9490d00b40a0140f9410180390101f8b7e0031faa4a050091290500d1L16;FF8801009008011591fb3300f9e8ef01f968feff9008611d91fbf346a929038052e8a303f940feff90009c1a91e8ab03f968feff9008611f91e1430f91", + "e3031d91BBBBL8;FB657273696f6e636861696e5f706172616d7345706f636845706f6368446972656374696f6e6374724b657973556e73616d706c6564506f6c796e6f6d69616c45L8;FFc0035fd6e00301aa01fefff021200291a20180521a900014fd7bbfa9fd030091082440f9080100b4080140b208", + "11c0da081540d2080d088b0825019108fd46d3BL8;FF08050091091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b2L8;FF210080528b140094605c00b4e1074091028c8152f90300aa21401d918d14009", + "408c48052e00316aa01c48052e8e301f9088c8152f6df01f9f9e701f9e8eb01f9BBL8;FFe82340391f050071e1000054e84340391f0500710c040054e8040035e90f41b22e000014e89340b8e90f40b9eba34039ea2341b8ec234079680a00b9e82f4079L8;FFe8c702f960e4ff97e20f4ba9e0031691e51", + "34ca9e11f40f949e3ff97e8c342f9200bc03dfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1404f803da90319f8L16;FF1f0900b1a2000054e00319aae10318aa2200805288d40094ff0600f1ab000054e0b740f9e10317aa2200805282d400949acd0736e2ffff17e8432d91e0430f91BBBL8;FFfd830", + "091480001ab42030054010840a9e50304aa0a018052e40303aaf30300aae023009129f87fd31f0109eb0881899abf0400f1890080524901899a1f0109ebL8;FF6000805213110094f3fbff17e8031faa00011aab62670054e14316914f0d0094df0600b18000005480220291e1431691da1200943f0700b1", + "f90b40f9c07cff54BL8;FF8df40094611a40f9c10000b4601e40f922008052f30b40f9fd7bc2a886f40014f30b40f9fd7bc2a8c0035fd6210400b4fd7bbea9f44f01a9fd030091f30301aaL8;FF03fc5f889f00036b2101005402fc038883ffff35f35341a9f51340f9fd7bc3a8c0035fd6621e00b9fbfff", + "f17bf3b03d5e3ffff172000009000201d9135000090BBL8;FF8c0d0c8b8c2501918cfd46d38c05009102000014ec031faa8b010b8b2801088b49010b8be14316910001098b3a120094da0300b4e1d342f9e8cb42f9f60700b9L8;FF2530009400018052e10315aa2230009420008052e10318aa1f3000942", + "0008052e1031caa1c30009420008052e10316aa1930009460fdff9000201d9133300094L16;FFa80317f88083833c8283823c8183813cfc15009400230291a1820791ee170094a0077bada8035af8a20f7cadf72f02f9e82b02f9e85f42f9e007813de10b813dBBBBBL8;FB1200000000000000130000000", + "00000001000000000000000160000000000000076657273696f6e20646f6573206e6f742066697420696e2075386d6964203e20L8;FFf40300aa8f9c00940030805201018052889c0094600a00b408028052f6031faa38008052f723032917038052e80300a9ff0b00f9f58300390c000014e80740f9BL8;", + "FF960640f91f0101eb800b0054680640f9490380522a040091e00315aa6a0a00f909692138e10313aa3bfaff97770a40f9680240f9080117cbbf0208eb880a0054L8;FF280340f9fb074091fa4313917b431d91090141d21f0100f128459f9a1f0500f1cc140054c82100b500e4006fa04700d1e14313913", + "7e3c0a9362340b902048052BBL8;FF683300f92758019428e37a9222174092e00301910103088be2ff01398d5c0194fc03019123000014e10b40f9020308cb8003088b188100d13500028b855c0194L8;FF6fffff17a88357f8080540f9150101ebe200005481010014a22302d1630c8052abecff97e1030", + "0aa203000b5a88357f8080540f91f0115eb09100054a02302d1L16;FF080b0054680640f9e10314aae20315aa0001168b8fdc0094c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aa2200805223008052BBBL8;FFe00313aa017d099b02018052f44f42a9f65741a9fd7bc3a", + "8877c0114f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd03009113d440a9L8;FF29011591e8bb0ef968008052e1074091e9bf0ef9e9fdffb029e11591e84b09f9a8fdffd008213e91e94f09f9aa0a8052a04700d1e85b09f9e807409121800991BL8;FF41040054680a40f96002", + "c03d61820091000080927f0a00f9a80a00f928008052a002803d7f2200a952f800941f0400f181010054688200911ffddfc8610240f9L8;FF150840f9080040f9f40302aaf30300aa080115cb5f0008eba8010054b40000b4680640f9e20314aa0001158b89fcff97a802148be0031f2a680a00f9f44f42a", + "9BBL8;FFabb31838abe35838a9c31838a9f358384a01084ac00640adaad318386a01084a2801084aaae31838e10300ada8f31838a0073ead1b380194a9035538480d8052L8;FFea4340f968c6533955ff48d3a801003661f241f9ea4300f9810000b460ee41f922008052843c009461fa41f9810000b460f", + "641f9220080527f3c0094ea4340f9L16;FF80de78b31f0500b1203900546027c03de8c301f9f7430d91e8835739695340f9e1030e91e0eb803d6093c73ce8230e39684740f9e06700f9e0831d91e9db01f9BBBBL8;FB363f00003a9fab87e0b5e16308ecbb1732b56c2356cb0e75e97ed6a11e80aa228d8a", + "9085740e8365b3e3a2d80926d66e277f6ee27fd5ee4adfdd48ead4ade658L8;FFce7c8e0a4a010b4af403152a29240a532b2c0c53fcd7532908010a4a2a300d538c010d4af07c900acf7f8f0a2d280b538c010e4a2e340e5331380f53fb875429BL8;FFc8048052ea5706f9cafefff04aed0a91e0df813df", + "f5306f9e85b06f9ff5f06f9ea6306f9e87306f9e97706f93b080194e1bb43f9810000b4e0bf43f922008052L8;FF2300805224008052f30308aa80e8ff97e80313aaf35741a9c7ffff17e0230091f30301aae10314aae20315aa230080522400805276e8ff97e10313aaf35341a9BBL8;FFe10317aa24480", + "194690308eba001005433fd45d31521009104000014730600f1b5820091e0000054a1825ff881ffffb4a00240f9220080527f4c0194f8ffff17L8;FFe20314aa0001158b924c0094a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaf60301aae10315aae20314aa9debff97", + "750a40f9L16;FF68feffd008011d91e9a703f9e9af03f9e90303aae3031d91e8b303f9e80300aa40fefff000e42091e4af02a9fb271ca9f2ab00f9f7eb10a9e8bf00f9e77b04a9BBBL8;FF8d6c01946002c03d680a40f98002803d880a00f9f44f47a9f65746a9f85f45a9fa6744a9fc6f43a9fd7b42a9ff", + "030291c0035fd6200080520104805216680194L8;FF9f1700f188fbff54ea430f91e8e3009129008052448948adec030b91408541adf81f40b9e95300b94231803d02c1853c438942ad01c1823c00c1813c02c1843cBL8;FFe20313aafb2700f9f70b00f9bc020094e08742adf50300aae21fc03df4b300f", + "9e08709ade08740ade257803de08707ade08b41ade08b08ade02400b4e19740f9L8;FFfd030091f30b00f9f30300aa018c40b9a102f836611640f9601e40f93f0000ebc0000054632640f9e00313aa020080d2010080d260003fd6618240a93f0000ebBBL8;FF2200805299100094e00319aaf90b40f9e1d", + "342f9a0fcff17f90300aae04316912200805291100094e00319aaf90b40f9e1d342f9c3fcff1720ffffb000200291L8;FF8c2c0094c0feffb40801805208000039f40000b4f60300aa00040091e10315aae20314aa8b2c0094e00316aae10313aaf44f42a9f65741a9fd7bc3a8c0035fd6L16;FFe04f42f9", + "220080528bac0094e15742f9810000b4e00340f92200805286ac0094b70000b4e01b40f9e10317aa2200805281ac0094e00319aa0110805222008052BBBBBBL8;FB7468207072654b657949643a20c00020636970686572746578742076657273696f6e2077617320746f6f206f6c64203cc0013e001e756", + "e7265636f676e697a65L8;FF295b69783701084a14000014680100d008210091f703002a00210091a22300d121008052e3031aaa04fefff084600b91e80b00f9bc831ff80a9c0094e003172aBL8;FF481d00b5e1031faa61f9ffb4f1000014e20313aa430c80529cf5ff97e10300aafaffff17e1031faae8", + "6b00b9f7ffff17680240f9080540f9190101ebe2000054L8;FFa1039d3ca8031ef8810000b4e00b40f92200805288200094a0877eada8035ff8960200f9881600f9280080528082803c8182813c68620039f44f4ca9f6574ba9BBL8;FFa5000014a0a300d10f6f0094f40301aac0ed07363d000014a0a300", + "d10a6f0094e80300aae00301aa68f8073680f5ffb420000014f5031faaf7031faa18008092L8;FF0801148b03fdff54e90f80121f00207109140033c20000540a7c0653090500394a051a320a010039e0ffff17ea0f80120b7c10530a2c0633eb0000350b7c0c53L16;FF48008052e02300390900f0f2e82", + "70039e90300f9e0030091ede6ff97e10300aae00301aaf44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd637008052BBBL8;FBc9000000120000002f72757374632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c6962726172792fL8;", + "FFe11740f9e00313aa9efbff17e063009122008052230080522400805264a4ff97e11740f9d1fbff17e0630091e10318aae20316aa23008052240080525ca4ff97BL8;FFfd7b42a9ff830191c0035fd6e0230091e20301aae10308aae1feff97eaaf40a96901158b480115eb690200f922f0ff54c0feffd0", + "00003f9133fc0094e00314aaL8;FF2301f8b7f30303aac10100b4e00302aa22008052e30313aa88000094000300b50e00001428008052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6BBL8;FFc87e0453690f00916842003908008092682600a922010014a8060091220400f1f40301aaa88b", + "32a909008092a86303d1bf8319b8bf031ab8bf831ab8bf031bb8L8;FF686e01f968a20b9169aa4ca90001803d68e20b91757201f975420e910101803d68220c910201803d698e01f96a9201f97f420e39696e41f96b220c916a7241f9L16;FFe8d740f9f88f41a9e92312a9e9a349a9e84f00f9e88740f9e", + "9af1aa9ebf340f9e8df00f9e8af40f9e88700f9c2f1ff1740fefff000a0219130bc009440fefff0BBBBL8;FBbbc3e719e8f88d8adb93c773a7c1c07bf6641f9fe4d7b2f182ca87c567f6e9b30ec6be20b2b22d7305b6c5093743000046f78321d6224f1374182d384361d948L8;FF08040091200440a9a94", + "300d1eaffffd04ad11891a8031ff8c2fdfff042a81b91e92b01a9e3430091208c0094fd7b44a9ff430191c0035fd60a20009109400091BL8;FFf6a705f9f6b305f90001803d08018052e8cb05f9e8672a9100f18f3ce8c32c91e99b05f9ea9f05f90003813c0083823cf6bf05f9e0e3823dfa1f06f9fa370", + "6f9L8;FFc182c13c1f0900b1a0873dade1050054a0877dade0030191e00702ad8d0cff97f60300aaf70301aae8f3009189008052e08702a9e0030091e163009142008052BBL8;FF890100b4e82b40f92ac100913f0108ebe8af43a9ea038a9aea2700f908059f9a7401899af99b41f9a800003779000014e", + "8d343a9f99b41f9c80e0036e0830791L8;FFaaf9ffb50a3040f9e903098b8afaffb5daffff1780fdffd000603a91374c009480fdffd000202091344c0094fd7bbfa9fd030091081840f9080100b4080140b2L16;FFe8d303f9e8d740f9e70b04f9e8db03f9e85340f9e40f04f9e8e303f9e9a358a9f61304", + "f9f01704f9e8ff03f9e8eb40f9e9f303f9e80304f9e89b40f9ec1b04f9BBBL8;FFe083c13c2005803de083c23c2009803dab000014e80741b29b000014f403042af60303aaf50300aa5f2800f1880000542800028b08f1df38682ef837e0230091L8;FFc8fdffd00845249129048052682601a9880280d20", + "90080920800f0f2692200a90d000014e08745ad08008092e237c03d680200f96082803c6182813c6282823cBL8;FFe80300aae80300f9a1fefff021d80d91a3fefff063040e91e0030091620180528401805279f6ff97e10340f9e00301aaf44f45a9f65744a9fd7b43a9ff830191L8;FFf92340f9580000", + "1400231f91110300947bffff17e10314aae003132af3fcff97f703002ae000f83720030e91f57e409302cc338b130c40b9562840f9a0ffff17BBL8;FF0825019108fd46d30900088b390500913f0308eb49100054f87749f91f0700b1a015005480220291fb170094080040b20811c0da081540d2080d088", + "b08250191L8;FFa1035df8615800b5c60200141f09007101050054090180d208df78920900f0f23a0140b2091f40921b0109aaa1035df8015700b5bb020014ba031ef8e8e35039L16;FF200080520108805223ac0094ffc301d1fd7b05a9f44f06a9fd430191f40308aa280cc0da29fefff029212591a883", + "1ff828048052f30300aae9a301a9a82300d1BBBBBL8;FB656e6465725f726174636865745f6b65795f70726976617465636861696e5f6b65796d6573736167655f6b6579730000ef104000000000004e00000000000000L8;FF4a2501914afd46d329010a8b290500913f010aebe9050054280108ab83000", + "05426000014e80308ab82040054090840f9090100b42a0140b24a11c0da4a1540d2BL8;FF00202d913d14019400ffff9000e00e913a140194fd7bbfa9fd030091083040b9c8030034080140b20811c0da081540d2080d088b0825019108fd46d308050091L8;FFc10100b4e0031baaf7c700f9f70302aa22", + "008052fb0309aaf9031aaafa030caa85180094e20317aaf7c740f9ec031aaafa0319aae9031baaff0600b1800a0054BBL8;FFe10300912200805208050091e83300f924540194ffff0039e80319aa02fd46d31ae17a9219154092e20000b4e83340f980030191e10318aa0801028be83300f9L8;FF08ffff", + "54e9feff100a6b683829090a8b20011fd6c1825ff841feffb4c00240f9eeffff17280400d11f0d00b1a8fdff54c0825ff8e9ffff17d3e640a9280340f9L16;FFa20080524401805270ffff17e0230b39e0030b91ff270b39f56301f9ecdeff97e80300aa81feffb0210c129183feffb063c80f91e86301f9", + "1d000014a0031238BBBL8;FF7c0240f9ff6b00b9ffeb00a93f7f01a93fff02a9fa1700f9fa2300f93f7f04a9faff05a9820740f9423500b4810340f9370080395704f8b728040091490400d1L8;FFe01b843d600600ad620a803de80000b4ea1740f9e90740f9682200f96a2603a9f31340f908000014080", + "08092681a00f9f30742a9810000b4e00740f922008052BL8;FF420080528cf80094681a40f9a80000b4601e40f901f97fd34200805286f80094682640f9a80000b4602a40f901f97fd34200805280f80094683240f9a80000b4L8;FFfa6741a9fd7bc5a8c0035fd6e0031f2af9ffff17ff0301d1fd7b02a9", + "f44f03a9fd8300913f0440b1e2020054080840a92a044091f30300aae023009109f97fd3BBL8;FFe8074091f6a745f90023009108810991f40740919482099177880094e1074091e0431691023f8052218009918938019488e20791000540ade8f36879e8e30a79L8;FFc80080d20800f0f2080500d1e003", + "2a91e84305f9ee3eff97f60300aa3f010014f79344f9f69744f9e0431f91fc9b44f9a16200910228805286380094ff0600b1L16;FFe3e35e39e7f343f9e4e343f9e5e743f9e27744f9fa7700f9fa5300f9fa4f40f9ea5f40f9e3b7803de20713ade8f200f888018052e0a3803de6030991683e00a9BBBBL8", + ";FB1400000000000000786f400000000000896f4000000000009d6f4000000000000000d1009300a7008a00e400eb00bd000a029100f4010000ef015601b3012001L8;FF13693738f3060091a88358f8b38319f87f0208eb01e6ff54a0e301d1e48200942dffff17a02301d1e1031faae2031caa43008052", + "440080525dacff97a84f7ca9BL8;FFf5c701f9f7cb01f9e8bb01f996010014e8031691e00316aa6e030194c8624039fbc342f9f5c742f9f7cb42f9e8631639e8feff9008c11d91e8d302f9e8018052L8;FF4a018052f6030daae1030eaa29210a1bef0310aa287d60d3a8020037bf020014e9031f2a4c018", + "052ea0100b4297dac9b3f7d60f2415600540b1540386bc10051BBL8;FF290000f9e9430591ea2314a92a210591280080524001803d0a008092ff2315a92081823ce8bb00f9e8c700f92081853c09018052e8ff1ba9ffa31ca9e8030591L8;FFe00600ad808601ade8b700f9bc0000b4e0031baae1031caa2", + "2008052864800945f0b00b1c1f2ff548082c23ce8bf40f9e0430691e1e30091022180528002803dL16;FFf29710a9f6f300f9f6030faaf7ef13a9e7fb16a98fc80094e72340f9e31340f9f70316aae14740f9fb031caa090080928a008052e80319aaea270ea9ea6341a9BBBL8;FF6d4a00396a6a0039ea6", + "340396c5e00396b32007969b201f86a8e0039f44f44a9f51b40f9fd7b42a9ff430191c0035fd67f0200b9f44f44a9f51b40f9fd7b42a9L8;FFe04300390900f0f2e8470039e90700f9e0230091ee6eff97f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316", + "aaBL8;FFe20313aa68f9ff97c01100b5e1031faad5ffff17880240f91f0500b1810000549f5e00a99f6201a99f2600f91f0800f1810e0054e00313aa68f5ff9740010036L8;ZDBBL8;FF29c4ff97e89341b91f050071610600542007c03de9b341b92143c23ce8c741b9f81f40b94003803dfacf40f9e002", + "803de9d302b9214b803dec030b915f0b00b1L8;FFf52300f9f44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054080200341f05007141030054000180521d000014280180d20800f0f2081d00d1L16;FF200080520104805223a40094200080520109805220a40094ff0303d1fd7b06a9f", + "c6f07a9fa6708a9f85f09a9f6570aa9f44f0ba9fd830191094c40b9f90300aaBBBBBBBL8;FB3a20c0001b737071722076312e73656e645f656b2e726563762065706f636820c0022d3ec0273a20456b53656e744374315265636569766564202d3e204e6f48L8;FF60040054e1830691e00315aa02328052", + "90a20094a0820791e1430091023280528ca20094000741ada8035ff8a8521da9a0860dad020340ada2820cadb60000b4BL8;FF830700544d1dc039ae1d00128c550e0b8c0148518d00f83761710c8b0b018052140000148d7d1c53ad0600340d00be528d010d0b4c2180396b710d8b8c00f8b7L8;FFf44f0", + "ca9fdc3019109604039690f0037f40308aa182040a9f30300aaa0c300d1028d40a901a3009117130094b95f7da9b55b7ea93f0b00b1e1020054760300b4BBL8;FF8d620194b80000b4e0031caae10318aa2200805288620194b60000b4e00b40f9e10316aa22008052836201949b0100b4e00314aae1031b", + "aa22008052f44f56a9L8;FF490380522a040091e00314aa6a0a00f909692138e10313aa50fbff97760a40f9680240f9080116cb9f0208ebc8060054680640f9e10315aae20314aa0001168bBL8;FFbaffff17e80b41b2e00700f9b7ffff17880080d20800f0f2080140b2b3ffff17880080d20800f0f2081", + "10091afffff17e00300f9a1feff9021d01491a3feff90L8;ZDBBBL8;FB650d40000000000011000000000000000201000005000000650d40000000000011000000000000002701000005000000650d4000000000001100000000000000L8;FFc815005435000014f7031faaf50314aab30e4ff87f0600b18", + "0160054e00315aa90ebff97080040b20811c0da081540d2080d088b0825019109fd46d30800098bBL8;FFe0179f1aa41701948812403969124039aa02000ad6020a0a1f01096be0179f1a9d1701948816403969164039f503002a1f01096be0179f1a97170194881a4039L8;ZFBBL8;FF4ab10391e8a700a", + "942ffff9042401991ea0f00f9e3430091243e0194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000b04a010491e8a700a9L8;FF2100399183fdff9063001391e023009102018052a4008052e80700f909000014e00700f941fdffb02100399183fdff9063141391e02300910201805264", + "008052L16;FFe193803df1a34ca9f7ef49a9fc0748a9ea6341a9f9fb42a9ebb344a9e0bf46a9e69f43a9e4a74ba9fadb4aa980010014fb5300f9a80100f0081140f9eabf40f9BBBBL8;FB3d044000000000004900000000000000a5010000130000003d0440000000000049000000000000009d010000160", + "000003d044000000000004900000000000000L8;FF16050091770a40f9570900b4740640f9f8031faaf90317aae00314aaddfaff97080040b20811c0da081540d2080d088b08250191081848abe2090054180118abBL8;FF8d120194af080014f7c31791e82746b9f50346b9e042c13ce142c23ce0a30c91", + "fcff42f961e2009102278052e01b813de11f813de88304b986120194f66f41f9L8;FFe0bf40f9e1a340f9220080528a120094e8af40f9a80000b4e09f40f9e1af40f92200805284120094b50000b4e0df40f9e10315aa220080527f120094f85b5ca9BBL8;FFe80b40f9490380522a040091e00314aaea0f", + "00f909692138e123009173d8ff97f60f40f9e80740f9080116cb9f0208ebc8070054e80b40f9e10315aae20314aaL8;FFfc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191350840f9fa0301aaf30300aa750500b4540740f985520094e00315aa210080527e520094601800b4L16;FF00b540f9e", + "06700f900b940f9e0ef00f900bd40f9e05700f900c140f9e06f00f900c540f9e05f00f900c940f9e0e300f900cd40f9e05b00f900d140f9e00700f9BBBL8;FF2300805224008052fbfdff97770a40f9680240f9080117cbbf0208eba9cbff54e00313aae10317aae20315aa2300805224008052f0fdff977", + "70a40f955feff17L8;FF22008052aa110094e1d342f911fcff17e043169122008052a5110094e1d342f929fcff17e043169122008052a0110094e1d342f954faff17e043169122008052BL8;FF41ee0094c0feffd000e02e913eee0094c0feffd000402f9138ee0094ffc300d1fd7b01a9f44f02a9fd4300", + "91280840f9290040f91f0002f1230f00543f0108ebL8;FFfa0180925a031bcba1000052e0c79f1a7b4300915a03038a1f00016a5a031b8b610d0054e1031aaa050080d2040080124304805262008052000080d293040094BBL8;FF7622009104000014b50600f1d662009180050054c1825ff881ffffb4c0", + "0240f92200805284320194f8ffff17f37749f97f0600b140020054e18349f93f0400b1L8;FFdf0e00b18104005488008052a2ffff17f46b40f9e807409108011891e00314aa6c2d009488624039fb034bf9f9074bf9fc0b4bf9a8e21839080180d2f80f4bf9L16;FFc0035fd6fd7bbda9fc0b00f9f44f02a", + "9fd030091ff0314d1ff0300f9f30300aa0232805200844dad0274c03de10313aaf40308aae2db803de0071aad01804cadBBBBBL8;FB560b4000000000007500000000000000250000002000000063757272656e744b7962657231303234206b657970726f746f62756620656e636f64696e67207761L8;FF", + "f90301aabc01003460021c8b3900028b909a0094a80357f8e0020191a1c303d12200805208050091a80317f81d960094bff31438f40315aa82fe46d3bcc303d1BL8;FFfc0300f9fb0f00b9f96301a9f75b02a9f54f03a9937e089b8a1a0194e00313aa01018052831a0194a0831df8201100b4080d8052b3", + "835df8fc031faa887e089bL8;FF6083893c4083c43c6183823c4183c53c6083833c4083c63c6183843c6083853ce00755ad62838c3ceabb0bf9e3e7c53de4f3c53de0d7853de2dfc53dea1b4cf9BBL8;FFe92e00d188df78925d00001408a341b8ab2b7da9a9635c78ac835cf8a88315b8a8035e78aa831a", + "f8aa135c38a9c3157869038052a8031b7888ffff9008e10591L8;FF945a009448058052a9fdffb029952f91e8c303f9c80080d20800f0f2fb9b05f908390091e9bf03f9e8bb03f9e80000b0081140f91f0500f169050054e8c32c91L16;FFa0c303d1f76301f9f77f01f973e7ff97600a0036812800b5fbd", + "340f9e8cb40f97f0308eba0110054e8cf40f9090e8052e0bfc03d6823099be1031faa000d803dBBBL8;FFf44f44a9fd7b43a9ff430191c0035fd6e80741b2e9ffff17f40301aa1f2900f1880000542a01088b4af1df384a03f837e0030091e10309aae20308aafd2b0094L8;FFe07fc13de1df843de17bc1", + "3de0d3843de077c13de2d7843de273c13de0cb843de06fc13de1cf843de16bc13de0c3843de067c13de86f09f9e2c7843de1bf843dBL8;FFa8c35e381f050071c10a0054a0d3de3ce81f8052884200398002803df44f45a9fd7b44a9ff830191c0035fd63f9800f1e00500543fb400f1a106005469024039", + "L8;FFe903891aaa018d9a6b018f9acd01096a6e0168b26f0569b270096ab2ce118b9abf010072ed118b9a0b128b9a1f004af20f781753ab018b9a1f004bf2cb018b9aBBL8;FF2911c0da291540d2290d098b2925019129fd46d32905009102000014e9031faa280108ab02060054097040b93f0500714101", + "0054097440b9290140b22911c0daL8;FFbcdafe9745050014c80080d261fdffd021b810910800f0f2e0830e91e3032a91e4430f91e2008052e9db03b9e8eb01f90a060094f5e741f9e8df41f9bf0208ebL16;FFf50314aaff0600b1c00d0054e8eb40b9e0831d91e1c31591f7bb02f9f4831d91e88f05b9e", + "87340f9f6bf02f9fcc302f9f98b05b9e8cb02f9a21c0094eeb343f9BBBBL8;FB7432000000000000b51d4000000000005600000000000000a20000003100000000000b1016201d302c4027503a603170588053904ea045b074c07fd062e069f0L8;FF908a0094e00315aa41008052898a0094e01f00f9601", + "500b48a8a0094e00315aa41008052838a0094e01b00f9a01400b4848a0094e00315aa410080527d8a0094BL8;FFe80b03f975dfff97e1a345f9810000b4e0a745f922008052870a0194f37740f9e8c31791e00313aa6a05019468624039f5f345b9e8231839e8c31791b47e0853L8;FF1f0101eba00d0054", + "e80b40f9490480522a040091e00314aaea0f00f909692138e123009186e5ff97f60f40f9e80740f9080116cb9f0208ebe80c0054e80b40f9BBL8;FF7b0200b4341f40f98e4a0194e0031baa21008052874a0194001f00b4e10314aae2031baae02f00f98a4a01940a00001437008052381740f9d8fcffb53", + "a008052L8;FF80fdffb0002020913c46009480fdffb000201591e1031faac0035fd6c0035fd6e30302aae20301aa81fdffb021603c911e460014ff4301d1fd7b03a9f32300f9L16;FFec8700f9f6bf00f9f60307aaf54712a9f5030aaae44f00f9f28f00f9ed6300f9ee3700f9f70700f9e5d300f9ffd0ff", + "97eb1b43a9ea0315aaf2d751a9ef0314aaBBBL8;FF08c93191682b05a98a068052480480527f2700a989fffff0297d2e91692b02a9290080d2c91dc0f2687f01a9682704a93a660194f47f40b99f03146bf63b00f9L8;FFa80000b4608e40f901f97fd342008052896a0094689640f9a80000b4609a40f90", + "1f97fd342008052836a009468a240f9a80000b460a640f901f97fd342008052BL8;FF215c1091a3feff906360029106000014a1feffd0215c1091a3feff9063700291e00300f9e0030091c20180528400805211000014c80080d2e0230039e0030091L8;FFe90300aa1fbd00383fcd0038e80300aae90300", + "aa1fdd00383fed0038e80300aae90300aa1ffd00383f0d0138e80300aae90300aa1f1d01383f2d0138e80300aaBBL8;FF090540f90a0140f9290100cb4a01008be0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9L8;FFff2701f9ba", + "020191e0070eada00a41ade82301f9e00b0fad23260094880201d1ffff073902fd47d31bdd799216194092420100b4e82341f9e92741f920030291L16;FFbf0208eb40010054560080520a000014bf0208eb61030054e0230091e4a4009419000014bf0208eb41040054e0230091dfa40094e80b40f98056", + "4079a9060091BBBBBBL8;FB3938352f6c6962726172792f616c6c6f632f7372632f7374722e7273002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934L8;FFff8303d1fd7b08a9fc6f09a9fa670aa9f85f0ba9f6570ca9f44f0da9fd030291368841b9f30301aaf403", + "00aa859e009400308052010180527e9e0094c01300b4BL8;FF9a020094760a40f9c1ffff17fd7bbda9f50b00f9f44f02a9fd03009148008052f40301aae10302aa000d002af30302aa39fcff97e00314aa3a0a0094e10313aaL8;FF0081c23c0181c33c0281c43ce10740f9e20304ade11f803d2b000014b", + "aef7aa917008092a003dc3cbc835bf8e00f803d0c000014e00316aa6083c23cb6eb7aa9BBL8;FFe00314aa2100805235008052895e0194600000b5f6ffff1720008052b4833ea9e0230091a16300d1b5c300d1bf831ff814eaff97680240f9a083de3ca9835ff8L8;FFe88f42b9fb2300f9e923072999f9f", + "fb53b008052f4e340f9f61b00f9b4faffb536008052e0dbc23de1dfc23de88332911f030071fa7706f900818b3ce0e3c23dL16;FF1f0101eb40040054680640f92a040091e00314aa490280526a0a00f90969213890470094e10313aafdebff97803240b980010034610a40f9680240f91f0101ebBBBL8;Z", + "BL8;FF09008092690200f96082803c680e00f965040014f4c30091a182009102288052808200918b7e0094e95b40f9e067c03de8d340f9f71b00f93f0d00b1e083833cBL8;FFe10200547ffedfc8810640f98104f8b7800240f92200805287fe0094e00314aa0103805202018052f44f42a9fd7b41a9ffc3", + "009180fe0014280000cb010102abL8;ZFBBL8;FFe11340f9a82303d1fb3b00b969f7ff97bb8353f80083c03c0183c13c0283c23c7f0700b1e08705ade237803de00a00540083c33c0183c43ce00315aa0283c53cL8;FF08411e91e3430f9162008052e9ef01f9e9f701f9e8fb01f941f4ff97680a42f9600", + "642f9e103152a080d40f900013fd6f55340f9607e02f9618202f9f5feff17L16;FFff0600b1a00b0154f6ef41f9f8eb41f9e8ff41f9e83f00f9160f01b489be0094e00316aa2100805282be0094602c01b4e10318aae20316aae06700f985be0094BBBBL8;FBe6dcac7a3c5ce0ef84ce527407242bb02949", + "34211e40d0c335297ca5adaa6b804b949a33491deae448b290f7752b1fbaf412c6b8732cac9be552e6e3a28c20d5L8;FFe81f01f9f92301f9ff2701f9e82b01f9fa2f01f9ff3301f9e83701f9e03b01f9ff3f01f9884e1c9be9f77fb2190940f938f77ed31f0309eba86f0054130540f9BL8;FFe10300aae", + "15306f9e0833291e1feff9021203f9102028052e3feffd063141c91a4028052fe000014e05306f9e0833291e1feff9021203f9102028052e3feff90L8;FFf44f42a9f65741a9fd7bc3a8c0035fd600fdfff000003d91380a0094ff8301d1fd7b03a9f65704a9f44f05a9fdc30091f30300aae00300915300", + "0094e80340f9BBL8;FF78e6ff97ff830a91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd620008052010480521a4a0194ff4301d1fd7b04a9fd0301915f2c00f1L8;FF291540d2290d098b2925019129fd46d30801098b130500917f0209eb890f0054088c5df81f0500b1c00c0054", + "7e020094080040b20811c0da081540d2080d088bL16;FFe9f741f9eb1f42f9f7f341f9f0fb41f9e84700f9e80342f9f10b42f9e11742f9fa3742f9f65342f9e82b17a9e80742f9ea1b42f9e66b42f9fe6f42f9ec7342f9BBBL8;FF680a00f9f44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd6ff", + "4301d1fd7b02a9f65703a9f44f04a9fd830091f40301aae10302aaf30303aacf6b0094L8;FF600600adff031691f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6ebab59a93f050071e89741b92083c13cec030b918033803da1090054BL8;FFe80300aaa1fefff021d41091a3fefff", + "063181191e81300f931000014c90080d2e0a30039480080520900f0f2e0830091e8a70039e91300f9e5f4ff9723000014L8;FFa10e00913f7c02f121fc44d322040011c90300542104009129c59c5269eda072e2fcff90207c025342800e910004412ae7fcff90e8e00b910008402a0010402aBBL8;FF450", + "c0094fad342f9e8cb42f908011acb1f0308eb48360054e8cf42f9e10319aae20318aa00011a8b8a2e01944803188be8d302f9f88b49f9580300b4e1d342f9L8;FFe01316b9e80f0bf9e8032491e0074091e92316b90904805200001891e8030bf9e8833f91f6074091e9070bf9d6021891e11716b9ea56ff", + "97e8f347f91f0500f1L16;FF0104815224aa0094ff4302d1fd7b06a9f65707a9f44f08a9fd830191280840f9f30301aa1f8125f181040054681640f91f010ff121040054e10313aa340c43f8BBBBBL8;FB08000000000000000800000000000000bc30420000000000506f6c796e6f6d69616c4572726f72", + "4368756e6b496e6465784465636f64696e674572726f724368L8;FFe88b00f927920094e0c30291a102178be20314aaf4bf03398e960094e00747ada8c302d1e243c03df58b40f914010191e1031f2aa0073cade10f46adb7f35838BL8;FFc1dfff54e8031faa080113aba306005400ffff9000802591381", + "20194f3031faa080c47f81f0500b121e3ff54e8031faa080113ab6305005400ffff9000203591L8;FF21401d91168c81529216009408c48052fa8301f9e88701f9fb8b01f9f68f01f98816009420c480522100805281160094809b00b408018052e1031aaa02c48052BBL8;FF08008092e83700f9e00314a", + "a91520094fc0300aaf50301aa93fcffb53a008052f90b00f99bfdffb50900809228008052e083c63ce0030291e85f1c29e85b1d29L8;FFf8c342f91f0f00b12102005468008052f53f42f9f43b42f9e8a3113929008092a80240f9690200f9680000b4e00314aa00013fd6a10640f9e12a00b4a20a40f9L1", + "6;FFe9f343f9e1f3c13de2f7c13de0df823de0dfc03de9d305f9e9c341f9e1e3823de2e7823dc082803ce9b705f9c082c03ce1dfc23de0431e91e2e3c23de3e7c23dBBBL8;FFfa6702a9f85f03a9f65704a9f44f05a9fd03009148008052f40301aae10302aa000d002af30302aa70fcff97e00314aa7c32", + "0094e10313aa6cfcff97950a40f9L8;FFf90b40f94803188be8d302f9e89f49f9f4074091948209911f0500b18000005480620391e143169166130094e8bb49f91f0500b100bdff5481420491f0010014BL8;FF600a40f9220080528bf60094611240f9810000b4601640f92200805286f60094611e40f98", + "10000b4602240f92200805281f6009460620191f30b40f9fd7bc2a8L8;FFfd030091f35301a9610000b4027cc19b220400b5337c009be00313aa31000094f40300aa600400b4210000b021d047b9c10300347ffe3ff1690400549302138bBBL8;FF4083c03ce93f49f91f0500b1e01b843de93b08f9e0110", + "054e0abc43de1a7c43deac33391e2a3c43de95b49f94081883ce01bc43d4181873c4281863cea3b48f9L8;FF43070054e8032a91e0832491aad0fe97e84345f91f0500b1403c0054e84b45f9e9730e91e002c03de94b03f9090000f029412a91e8b302f9080000f008712991L16;FFe97700f9e96744f9e1", + "1fc23de29317ade223c23de7cb43f9e95300f9e3a35d39e4bb43f9e8a301f9e8035e39e5bf43f9eaf200f8e24f44f9eb5344f9f65744f9BBBBL8;FB657373696f6e2070726f746f6275660000000000000000001000000000000000080000000000000048564500000000000000000000000000010000000", + "0000000L8;FF08db77d3800640ad80020191e103009122008052080d17aae00700ad080dc0da881e00f9820241ade20301ad1d820094882648298a2e49299682003980a20191BL8;FFa8008052a8ffff17404fc03da80359f814000014e8e322910081cb3ce8c344f94003803de8f304f943000014404fc0", + "3da80359f8e05344f94003803de8f304f9L8;FF0201805201ed7cd38b0600945f1f00f1c0140054f55243a9340200b4b982009104000014940600f139c300918001005421035ef8810000b420835ef822008052BBL8;FFe4cbff9760f4ffb44c000014e87340f91f0500b161000054ff670ea9ff7b00f9c1", + "c20091a20301d1cbcaff9720f3ffb437000014a00301d103550094f80301aaL8;FFa1e6ffb59efdff1780fdffb000e0269183fdffb063801f9184fdffb084c02791a24700d1e10680522342009420008052e10280521842009482fdffb042c00c91L16;FFe9bb43f9f0cb43f9e2d743f9ebeb43f9e51b44f", + "9e92b17a9e9bf43f9eac343f9e09b833df22f44f9e13344f9e9ff00f9e9c743f9e63b44f9fe3f44f9e44344f9BBBL8;FF88ffffd0083138918902805222000014e89343b8e93f40b9e0830091ebab44a9e1e30091a80319b8e863413909b306b8e92340f9e8230039a8f31a38a8c301d1L8;FF8af6ffb43f", + "0108eb93611932e00200547369283808050091280800f92004f8b7e0030aaa26000014e10300a9e00301aae10308aa22008052f4030caa9c050094BL8;FF04000014c80080d20800f0f2080500d1e80300f9e0030091edecff97e10300aae10300f9a1feffb021101391a3feffb063300d91e00300916201", + "805244008052L8;ZDBBL8;FF22008052f44f41a9fd7bc2a88a260114f44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd03009114d440a9f30300aaf50300b496e2009104000014L8;FF22008052f30b40f9fd7bc2a88a260014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010", + "040f9f30300aa810000b4600640f9220080527e260094L16;FFe0031caae10317aa09b2ff97e90b40f9c90000b428e179d3e0031caa02018052011109cb84a60094681a40f9600ac03d966200a9692a492988ee02a928008052" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines0 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines1.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines1.lean index 5ee24e21d..10ce4a994 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines1.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines1.lean @@ -27,361 +27,252 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub1 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF5f0109eba0060054ef030aaa5015c038e8030baa0e1e0012b0feff36ea054039df8103714b150012c3fdff54ea094039dfc103714a1500124b190b2aca110012L4;FF3f0108eb13601932200100542a0440f91f1040f15369283808050091280800f94202005400fc47d36e000014e103", - "00a9e00301aae10308aa2200805223008052L8;FF0080189109200194fd7bbda9f50b00f9f44f02a9fd030091150c40f9f30300aaf40301aafa1f01940005805201018052f81f0194600200b4a8fe45d3690640f9BBL4;FF48aeac72082000b988048052480301a9481300f9e800805248a3003908008092", - "000400ad482700a93c2400b524010014f9031caa1f03156bfa0300f9280a0054L4;FF016861f8260840f97f0006eb80000054000080d21f000039007d20d427804039e31000125f00036b4cffff54231840b96324c21ae3fe0737231c40b96324c21aL8;FF44a00094fd7b42a9ffc30091c0035fd6ff0301", - "d1fd7b02a9f44f03a9fd830091140040f9e00301aa810100d021681891e8230091a200805245a00094b30100b0BBBL4;FF2ae001941f100031218c0054f9ffff1727e00194f70300aa1f0400b141fdff54e04305918100805222e00194008b0035e85341b9e87700b957ffdfc8d70200b4L4;FB65782e637", - "2617465732e696f2d313934396366386336623562353537662f62797465732d312e31322e312f7372632f62797465732e72730022616476616e6365L8;FFed6f00f9043559a9ec5f00f910195aa93f030aebeba717a90ba546a903015da9eb9700f9e9d700f90ba547a9e04b00f9e3eb0fa9eba709a90ba5", - "48a9ebdf00f9BL8;FFf50300aa02600194000580520101805200600194400100b4155000a9e10200d021400791132000b91f900039f44f42a9f50b40f9fd7bc3a8c0035fd600018052L8;FFe023009102018052a4008052e80700f909000014e00700f9210100d021843191230100d063743691e02300910", - "2018052640080522d55ff97e10740f9b1ffff17BBBBL4;FFff0301d1fd7b01a9f65702a9f44f03a9fd43009109304039c90b0037150040f9f30300aa160840b9a21300d1f40308aaa00642a9b6c31fb8abfbff9708fc79d3L4;FF20008052e10313aa12000094955000142e5000146b62001400000000415", - "0001400000000000000000000000000000000000000000000000000000000fd610014L8;FF8d00f83761710c8bcb008052280000149f114071630800544d19c039ae1d00128c390e0b8c1140518d00f83761710c8beb0080521e0000149f01487183070054BL8;FF2403009084a02391a363009102018052", - "b30f00f94f80019468820091010300d021742a91240300b084c02791a363009122018052a80f00f94680019446800194L8;FFe16300915380ff97c80240f91f0500b1a0000054e263009120008052e10316aa7894ff97e10316aa288c43f81f0500b1e0fcff54e2630091400080527194ff97BBBL4;FFe02", - "30091f49b00f90f380094f40300aaa000f8b6f5031faae00315aae10314aa0cc00194140100b4f9bf0194e00314aa2100805235008052f6bf0194600000b5L4;FB5f6b657969767365656450656e64696e674b796265725072654b65796369706865727465787464656372797074000000d3784900000000", - "003800000000000000L8;FFe20b813de00f813da2033aad4083c53c4283c33ca103933c4183c43c4383863cfb4702f94383c63ce18301ad4083c93c4183c83ce20b803d4283c73ce18303adBL8;FFbf0208eb69f6ff54e00313aae10316aae20315aa03000094760a40f9adffff17ff0301d1fd7b02a9f44", - "f03a9fd830091480001aba2020054010840a9f30300aaL8;FF9f0208eba8040054340100b4680640f9e10315aae20314aa0001178b08400094e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00013fd6BBBBBL4;FFe90b41b2e9a300a908000014e80b41b2a0831df8130000148800", - "80d20800f0f2080140b2e80700f9e0230091ed050194e00700f9210400d021602191230400d0L4;FFe93b41b909290039e93341b9092d0039e92b41b909310039e92341b909350039e91f41b909390039e91341b9093d0039e90b41b909410039e90341b909450039L8;FF40020054e91342b8ea2740b9e1", - "430091e003c03de8830039e00313aaa91b00b9aab301b8a81b40b9e007803de81302b8ea2700b9f1faff97fd7b43a9f32340f9BL8;FF28144038e8833139e8833191000140b20b900194a88300d1e0030091e183319135900194fa8f01940004805221008052f88f0194800300b4a0077fad08048052L8;F", - "F45900014880100b0082d2c91e00301aae10308aa62028052fd7b44a9ff4301913d90001408040091200440a9a94300d1eaffff904a813291a8031ff8620100d0BBBL4;FF290080d2a14302d14926c0f2a87f38a9e82604a90ed0019436ffff1728008052e86705a9e93f40f92801403968f607372800805", - "2ff3300f9e82700f92e000014L4;FBcc94ca760e28349ef3ec27f1e8beaaf611e960475463a78121c6030a37f8a28c005b1a67000007d1fe28db6453cfe88200000000ffcec9170000000000000000L8;FFefb344a9edef49a9f1a34ca9eb030faaf00346a9f7030daaed0740f9fe1b43a9e4a74ba9fadb4", - "aa9e36742a9ef3b47a9b7faff171f0900f1fb5340f9e0bb40f9BL8;FFe237c03da1033dada2039c3cb979ff97e00640ade80b41b9010340f908830bb80083893c01838a3c810000b4000740f922008052fa4f0194a0077dad7b0200f9L8;FFe24f0094a8624039fbc342f9f5c742f9f7cb42f9e863163908", - "0100f008010391e8d302f9e80180522083c13ce8f304f94003803d28ffff17e94341f9295541b9BBBBL4;FFb50000b4e00316aae10315aa2200805203f00194b30000b4e00314aae10313aa22008052feef0194ffc30891f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L4;FB2e000000000000003102", - "00000e000000636f6e737472756374656420636f72726563746c7900000085924800000000003300000000000000350700000e000000L8;FF07000014890080d248008052e02300390900f0f2e827003928017fb2e0030091e80300f9efe5ff97e10300aae00301aaf44f47a9f92340f9f65746a9f85f45a", - "9BL8;FF2925019129fd46d329050091200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54000300b000801c91ff6f0194ea031faac9efffb584ffff17e00200d0L8;FFead302f99a0d0094df0600b18000005480c20291e1431691c01000941f0700b14086ff548122029110010014e8031faa0001", - "19ab426e0054e14316918c0d0094BBBL4;FF69b20eb8686601a9e9a345a9692a04a9e92340f96b2205a9e81b40f96232803de08746ad69220da9e80b40f9e97340b9755203a9600605ade08744ad687200f9L4;FF050080d2639440f9009840f9418440f8c807001400000000210000f0207048394003003", - "5200000f02200805222700839009c40f9a00100b4fd7bbfa9200000f0L8;FFe0030891682200394003803de80309aa49f300f8290080924003c03d690200f96092803c680e00f9cca9ff97b60000b4e00317aae10316aa22008052f8af0094BL8;FFe85746f9e95b46f9800200d000c03291e1032d91e85b", - "04f9e8c32291e95f04f929fffff029312491e8a305f9e8c32791e9a705f929300194e89b40f9e9c31691L8;FF55ff48d3e80b073652f8ff17fb5f40f91f0500f1f8830d91c902005468c21191090000d029b11691e84305f9e800009008610391e94705f969038052c00000f0BBBBBBL4;FFf44f01a9fd03", - "009108a040391f0d0071a101005413d041a9880240f9680000b4e00313aa00013fd6810640f9c10000b4820a40f9e00313aaf44f41a9fd7bc2a8L4;FFff0300f9f80304aa880d0094e86b42f9fb6f42f9fa7342f9f57742f91f0900b141040054e8431391e0031aaae10315aa0a180094e8d344b96809003", - "67f0700b1L8;FFff8301d1fd7b03a9f52300f9f44f05a9fdc30091e90300aae10700f9220d41f83f0002ebc1010054000440ad6b0200d06be10c910a0440f9000500ad4801018bBBL4;FFbd7eff97202100b5ba835cf8f9031aaa228f40f8e22000b4410340f9340080399400f8b728040091490400d1110", - "000145f2800f1880000542800028b08f1df38L4;FB6f74206f70656e2066696c6520617420c000214572726f72207768696c652072656164696e672066726f6d2066696c6520617420c0006877636170206e6f7420L8;FFab935638a97316384901084aaaa35638a98316386901084aabb35638a99316384", - "901084aaac35638a9a316386901084aabd35638a9b316384901084aaae35638BBBL4;FFc0035fd6200080520104805211d80194c20300b042603491e0031faae10315aa21d80194fd7bbda9f50b00f9f44f02a9fd030091089440f9f40302aaf30300aaL4;FB002f636172676f2d6769742f737061727365", - "706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372L8;FFed0314aae0f3803d8d020014082340391f050071c1020054e0430f91a12200910239805206d80094e0031d91e1430f91032b0091e20314aa17270094f6a343f9BL8;FF04160094e", - "10318aa288c43f81f0500b1e0fcff54e243169140008052fd150094e3ffff17e043169122008052fd170094e1d342f9e5ffff17f85f49f9580300b4L8;FFa22302d12bf4ff9740f6ffb483010014e1032d91a22302d126f4ff97a0f5ffb4650100141f0800f1c1240054a80302d1a10302d1a22302d11f7d", - "01a908018052BBBBL4;FFfd7b06a9f73b00f9f65708a9f44f09a9fd83019109704039f30300aaf40308aaa90100343f0d0071c107005460a240a9090d40f9e803009120013fd6e80340f9L4;FB7374726174696f6e20494420c000196d6573736167652077697468206f6c6420636f756e74657220c00320", - "2f20c00008696e76616c696420c00a206d65737361L8;FFf65744a9fd7b43a9ff830191c0035fd6e20313aa230c805267f1ff97e10300aac0feffb5a80640f91f0116eb09050054e00313aab6f7ff9700fe073728fc60d3BL8;FF62028052e401805209000014a0031cf80103009021182e9103030090636", - "42e91a00301d162028052e40080522f6d0094b8035cf8b7a376a9bce773a9a10375a9L8;FF88830e9170ebff97e0074091e1074091023280520080019121c0359108780094e0ffc33de103c43d80430891e207c43d8162019102328052e07f843de183843dBBBL4;FF800300d00060139108b80194800300", - "d000a0129105b80194800300d00000139105b80194820300d042400791e00315aa00b80194800300d000c01391fbb70194L4;FD10e84500000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L8;FF4d04", - "0091ae696a384a0500915f010cebcf194092ce1d0013ef21cb9ae90109aae20200546b1d0091eefeff37140000146c0400f1c00600549f2900f14d018052BL8;FFe8031faa091c40b949fbff35e9031faa0a0840f90afcffb5ea030aab23feff54a00200b000c0079100380194a00200b000e01791fd3701", - "94a00200b000c02c91L8;FF2200805206380094e16340f9810000b4e05b40f92200805201380094bb0000b4e03f40f9e1031baa22008052fc370094fb0318aaf83b40f9ea4340f9f55b00f9BBBBBL4;FF3f080071a1020054f70300aae003082ae10313aae20303aaf80303aacbf1ff97000500b47600001", - "43f0c0071c00300543f10007121010054f70300aa01600491L4;FFe0230091220080522300805224008052e8e8ff97e4ffff17ff8301d1fd7b02a9f85f03a9f65704a9f44f05a9fd830091280440f9290c40f9340108ab020e0054L8;FFfd830091490200d029813d91eafffff04ab12791400200d000403", - "e91e92b00a9490200f029a10491e1030091e92b01a92a080194fd7b42a9ffc30091c0035fd6BL8;FF76a205a9e87e045369f204f8e93f40b97a0202a978fe00396a260d2968c20139e1e7ffb4e02740f9d3ffff17a0e300d1a8ab3ca92465009420008052e10314aaL8;FFe2031faa248800944000805241", - "0080521088009440008052e10317aa0d88009440008052010980520a8800944000805281088052078800944000805281078052BBBL4;FF4801088b080300f9e90200f948ff60d3e80a00b5400b40921f1800f1e20a0054417f0353010b00343f080071ed0100543f0c0071200300543f100071e0030054L4", - ";FB706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f6c69622e7273001b737071722076312eL8;FF2200805206c80094f8ffff17353400b4a806158be00314aa0201805201f17dd3ffc700949b01001497ff48d3e0031baa080c48f8", - "1f0500b161e3ff541bffff17BL8;FFc20200b042400791e70305aae60304aae50303aae1030091e3230091e40302aa62480194420700b4fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091L8;FF140840f9f30300aa3f0002716200005435008052080000143f002071620000545500805204000", - "0143f404071680080521535889a680240f9080114cbbf0208ebBBBBL4;FFc80600f984010014e80317aae94f00f90a0d4af85f0109eba207005469040090f303042a29b140f9690400b4e9030291aa0000b04a312491e92b0aa9c90300d0L4;FB30000000000000000800000000000000009a40000000000", - "0e42040000000000020000000000000000800000000000000409b400000000000e420400000000000L8;FFa0c303d1c2e7ff9720060036a12700b4c3010014e8f340f91f0d00b1e1040054a1a303d1a2c303d1ba8311f87fecff97a083db3ca183dc3ca283dd3cf8d301f9BL8;FF04680194200400b4a106", - "009102c48052f30300aa15c48052096801942800809293d600a9880200f9f44f42a9f50b40f9fd7bc3a8c0035fd6e90f41b2090100f9L8;FFe0430f91c97bfe97f82740f9e81f40f91f0308eb61000054e0e30091149ffe97080d8052e92340f90827089b29008052097d02a9090180521a7100a91c07009", - "1BBBL4;FFe20313aa2300805224008052189bff97b9035cf8e2feff17a04301d1e10319aa220080522300805224008052109bff97b9035cf8e8feff17a04301d1e10319aaL4;FFf30b40f9fd7bc2a8c0035fd600008012fcffff17fd7bbba9fd030091f96b04a9390000b021430691f35301a9f55b02a9f6", - "188092c20200cbf76303a9f70300aaL8;FFe80319aaf90301aad4010034a8c303d13900028b0001148b09a80094a80357f880030191a1c303d12200805208050091a80317f82da80094e80313aabff31438BL8;FFa003d73ca103d83ca203d93ca303da3ce3d7803de2d3803de1cf803de0cb803da003db3", - "ca103dc3ca203dd3ca303de3ce3e7803de2e3803de1df803de0db803dL8;FFbc035ef8bb035df8d7fdff17a0c300d1e1031aaae20318aac3eaff97ba035ef881fcff1720008052011880520928009420008052e10319aa0628009420008052BBBBBBBL4;FF0800669e0801c0da0811c0da08fd43d3deffff", - "17220000d042f01091e1630091e00313aa030880521278009414008092e00314aaf44f49a9f65748a9f85f47a9L4;FF8a110094fa5f57a9f85b58a95f0b00b1e1020054760600b4e8c30591e00318aae10316aa9c57fe97fb6b57a9fc0305912083c53ce86758a9f6cb40f97f0700b1L8;FF010380520201", - "8052f44f42a9fd7b41a9ffc30091021c011460fa7f92280000cb010102ab62010054a101f8b722008052f44f42a9fd7b41a9ffc30091f81b0114BBL4;FF4a1100116d09c05aa8273429ada335296d050011ad09c05aac831ab8ada337296d090011ad09c05aa9b33629ada33929680d00110809c05aa9b33", - "829a8c31db8L4;FF000000d000001f91fd030091aefeff97fd7bc1a8000000d000e01e91c0035fd6fd7bbfa9fd030091fd7bc1a8c0035fd600000000000000000000000000000000L8;FF69070034290140b22911c0da291540d2290d098b2925019129fd46d3290500910a2440f9aa0600b44b0140b26b1", - "1c0da6b1540d26b0d0b8b6b2501914a194b8bBBBL4;FF09fb003908ff0039e84305912adc0194e0074091e1430591028c815200400f9107dc0194e00b4091e182319102c4805200c0009102dc0194f5db019400c48052L4;FB6520747970653a20c00b2028657870656374656420c001290032756e657870", - "656374656420747970652055524c2e747970655f75726c3a206578706563746564L8;FFf4031d9101210094e8a343f9eaa743f9ebab43f9e9af43f91f0900b1e9fb00f901130154e8fb40f96b2201a908008092682a00a9770e0014e8ef41f9e94f00f9BL8;FF075c0194e00314aa0104805222008052035", - "c0194e8074091e00319aa0178805208812f9135d40094e8f34df91f0900f1203c0154e0074091e107409102328052L8;FF0b0e0094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faa095c0094e00741a9075c0094ff8302d1fd7b06a9BBBBL4;FF80040", - "054e1e7076ff9031caa080700d1e9f341a9eb0b40f9180118ea0a32805261fcff54f80740f97f0500f10001005420a9200e0800669e680100b40801c0daL4;FB45014f0065001c013400a5002600e40032018501f2000e017201920194008600b9010e00a301b1015b01d60069013c001c00000097007500", - "83004000d100f500L8;FF881240f9e083c03ce1031faa2823189be90f40f92a0700910001803d090900f98a1600f9d6ffff171f0800f121090054e1230091e20313aaffdf00a9ff0f00f9BL8;FF1f0500b1c0040054080840f9090140b22911c0da291540d2290d098b292501910819498b0805009109604", - "0b93f050071e103005409a84c29290140b22911c0daL8;FFe81340f9e10316aae20315aa0001178b0b7c0094e802158be81700f9956640f9550300b4e11740f9e80f40f9966240f91f0101eb60390054e81340f949058052BBBL4;FFe10314aa5b000014a0031cf8810300b0215c3091830300b063c03091", - "a00301d122038052240280520f000014a0031cf8810300b0215c3091830300b063201f91L4;ZBL8;FFc90fc0f2a02700d1e1030191e87f05a9e82708a90ebc0094fdbb00940004815221008052fbbb0094801300b4e10313aa02048152f60300aa1c04815200bc0094BL8;FF090100b42b0140b26b11c0da", - "6b1540d26b0d0b8b6b25019129194b8b2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d3L8;FF093006910a9c41b92001c03d168841b91f0500b1ea7303b90003803d40000054eafaff9775de4ea9b70300b4b822009104000014f70600f11863009100030054BBB", - "BBL4;FFe9031faa962281b996fcff35ea031faa958e40f955fdffb52801088b49011f8be10313aa0001098b0ef8ff97b8010034610a40f9680240f9801641b91f0101ebL4;FFf85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd63a008052fc0b0094e00317aa2100805234008052f90b0094e0fc", - "ffb4fb0300aa0801805208000039L8;FFff430191c0035fd628008052e1230091e00313aaf5d300a9e8630039f7f6ff97f44f44a9f51b40f9fd7b42a9ff430191c0035fd6ff4301d1fd7b03a9f32300f9BL8;FF285440a9f4cf00a9ff0f00f9bf0214eb49f9ff54e0230091e1031faae20315aa230080522", - "4008052f30308aa107fff97e80313aaf35341a9c3ffff17e0230091L8;FF048c0094e05f00f9008000b4008c00944000805241008052fe8b0094607f00b4f50300aafa8b00944000805241008052f88b0094a07e00b4f60300aaf48b0094BBBL4;FF6012803ce00a40ad6112813c800b3fade10300b4e003", - "18aa22008052f44f4da9f6574ca9f85f4ba9fa674aa9fc6f49a9fd7b48a9e923476dff830391f8cb0114L4;FB40074b1756275d378fd784c799f792e7a397a887b5b7bea7d757dc47c177ca67fb17f007ed37e62742e649f654c65fd66ea665b6788673961a6611760c460756L8;FF04cc0094c04101b4e1", - "031caae20314aafa0300aaf60314aa09cc0094e97740f93e0700147923442977db40a97c0f40f97ad343a9e8eb00b968e342a9ff0600b1BL8;FFe8ef41f9080f00b4e9f341f9e80302f9e8830591ea0310910b0000f06b312e911a0380d2c00200b000381f9108210091e1430691ea2f19a9e90702f91a00", - "f0f2L8;FF4a25019129194a8b29050091280108ab220a0054090140b22911c0da291540d2290d098b2925019129fd46d30801098b080500911f0109eb49090054091c40f9BBBBL4;FFc0035fd6e90f41b2090100f9f44f42a9f50b40f9fd7bc3a8c0035fd6e91741b20a210039090100f9f44f42a9f50b40", - "f9fd7bc3a8c0035fd62a0480d20a00f0f2L4;FB00000000000000000100000000000000010000000000000024c442000000000057726f6e674b454d4b6579547970650000000000000000000000000000000000L8;FF1f0101eb60050054680640f9090280522a0400916a0a00f909692138e10313aa4cec", - "ff97818a40a960008052e30313aa94eaff97888240391f05007101020054BL8;FF228f40f8620f00b4010340f93a0080399a00f8b728040091490400d1110000145f2800f1880000542800028b08f1df38e80bf837a0e300d192d5ff97a8835cb8L8;FF6182833c6082843ca1037cad080b00f96182853c6", - "082863cb90000b4e0031aaae10319aa22008052fd6b0094e12740f9010b00b4e00315aa54000014e88241f8BBBL4;FFe223803d6283c03ce08700ad6183c33c6083c43ce317803de18301ade203803d37840094fcff403908088052f70301aaf80300aa02011ccb3a0002eba2010054L4;FFfb1b40f9f657", - "46a9f85f45a9fa6744a9fd7b42a9ff030291c0035fd620008052f7ffff17e00313aaf60301aae10315aae20314aa2cfeff97750a40f9e10316aaL8;FFff1f01f9ff2b01f9ea3301f9ff3701f9ff4301f9e94b01f9ff4f01f9f35701f9ff5b01f9f56301f9ff6701f9ff7301f9ff7f01f9f98701f9ff8b01f", - "9fa9301f9BL8;FF410340ad810300ad800745ad8233c03de8bb42f9766e00a9623a803d600606ad800743ad687a00f9755e01a9600604ad820344ad620205ad810341ad610202adL8;FFba031ef8062c00941b0000141a0180d2e8031faa9bff48d31a00f0f206000014090180d2fb031faae8031faa0900", - "f0f23a017fb2691f4092011880521b0109aaBBBBBBL4;FFe80b40f96a0640f9490108eb430200546a0240f9e00740f94801088b682600a9800200f9e0031faaf44f44a9fd7b43a9ff430191c0035fd6e00302aa4f150194L4;FF0083813ce0efc83d22008052e87302f92300805224008052e97f02f9e13b", - "c13de23fc13dfa6b01f9e00715ade2b3803df96f01f9fa7301f9ff7701f9f6f302b9L8;FF680200b928050091686a2af8f44f44a9f65743a9fd7b42a9ff430191c0035fd609111a33e803092a7f2200297f0600f9f44f44a9f65743a9fd7b42a9ff430191BBL4;FF370d00b48002158be10318aae20317aa", - "0b940194b502178be00318aae10317aa22008052f50f00f9fd9301945b0315cbe00316aa326c0094f60301aa3f001bebL4;FD6c0d4a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000940d4a0000000000900e4a0000000000L8;FFfd7bc2", - "a8c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa610100f021401f91e8030091e00309aae200805246940094610100f0215c1f91BBBL4;FFa0a302d15dd50094e80300aae00301aae8f10736801200b5f5031faa62feff1761360054e85340f9ff0208eb40020054080e8052a1837b", - "ade852089ba203d63cL4;FB56000000000000005c000000220000008e1949000000000057000000000000000c010000170000008e1949000000000057000000000000000d01000017000000L8;FFe91b42f9e71342f9e8bb00f9e80f42f9fa5342f9e9ab00f9e92342f9e06fc13de8cf00f9e81742f9e67f", - "42f9e9af1aa9e92b42f9eb3f42f9e8c300f9e81f42f9BL8;FFe1d342f9e8cb42f91f0101ebe0530054e8cf42f92a04009180c202914901805209692138ead302f9041d0094e1431691a70d0094e0a349f9800100b4e1d342f9L8;FFea7f06f90a078052e07f823dff5306f9e85b06f9ff5f06f9ea6706f9e", - "87306f9e97706f90a540094e1fb44f9810000b4e0ff44f922008052f9530094f4530094BBBBL4;FF4801088b480300f9e90200f988fe60d3a80500b5800a40921f1800f1a2050054817e0353c10500343f080071600100543f040071c1faff54e82b40f91f0500b1L4;FBf4c97400631e124064c5a38b1e9", - "27497d3d4786b101a623ab34a7da3954fae126b04dba9d7a3604ed88cdc8550950f0d4a9134ceb7e19b94139151d2c3d6e1c8L8;FF89060054e00313aac1f3ff97400a003728fc60d3280800b5200840921f1800f162080054217c0353810800343f0800710c0200543f040071800300543f080071BL8;FF", - "ff430591c0035fd6a8060091820601f109008092e80b06a9e8830191e93b00f9ffa300b9ffab00b9e94700f9a8031cf8400d00541a210091f7c30191fb830191L8;FFe00318aa09692138e1431691ead302f997110094fad342f9e8cb42f908011acb1f0308ebc8be0054e8cf42f9e10319aae20318aa000", - "11a8b017400944803188bBBBL4;FFc0035fd620008052e10313aa11b40194ff0302d1fd7b04a9f85f05a9f65706a9f44f07a9fd030191f70302aae20301aae10300aae0830091f60303aaf30308aaL4;ZBL8;FF6c000acb4e01198b29030ceb2be179d3691109cb6b808e9a3f030ceb29819f9a5f010beb6", - "b9284d22b49b2f2aa0301d18b24c9f24b92e4f2400700543f030cebBL8;FF69060091e0032d91000500ad0209803de9f702f97aeaff979c6300917b0700919f0314eb41efff5400030014e8cb45f9090d8052e037c33d6822099b000d803dL8;FFe20f0054217c0353011000343f0800716c0100543f0400", - "71600300543f08007161020054a1e20391a22302d16bf3ff97802a00b5e1031faae7ffff173f0c0071BBBBBL4;FF2801088b6a010c8b08cdc9ca4bc1cbca69adcb9329bdc8ca08010a8b2981c8ca200108cafd7b45a9ff830191c0035fd6ffc301d1fd7b05a9f44f06a9fd430191L4;FF3f010a6b6002005", - "4080140b949ae8c5269ccae721f01096b61410054810a41a9e0e306914ef7ff97e8df40f91f0500b1a0400054f6275ca9fc031faae82f00f9L8;FFf44f42a9f65741a9fd7bc3a8c0035fd6002000913afeff17fd7bbea9f30b00f9fd030091090040f9e8008052f30300aa2a0900d13f0500f14881889a1f", - "2500f1BL8;FF210300b021942a91030d40f942038052fd7b43a9ff03019160001fd608200091200440a9e92300910a0000b04ae11e91e8a700a9020300d042a43a91ea0f00f9L8;FF890700912e008052a90a00f908091c8b180100791b050079a2ffff17e00315aa58cdff97a80640f92e00805216091a8", - "b88031aeb48fcff54e6ffff17f44f45a9BBBL4;FF200080398004f8b728040091490400d1310000141f0800f1611d0054a18300d1a2a300d1bf633ea9bf031ff8c7adff97e01d00b5f40f42f9e80742f99f0208ebL4;FB656d6f74655f726567697374726174696f6e5f69646c6f63616c5f726567697374", - "726174696f6e5f6964616c6963655f626173655f6b657970656e64696e675fL8;FFea3f5739f00314aaebd14d78e0d7803de6030991e0a7c13de10b19ade1abc13d6a410a2aeb914db8e8ff5539e9d14878e2b3c13de00717ad7b810aaae0afc13dBL8;FF4402805286000014c90080d2a8831d384800805", - "20900f0f2a0c300d1a8931d38a9031df8ef390094e10300aa74000014c80080d2e0430039e02300910800f0f2L8;FFe81f40f9c80000b4090d8052e00314aa02018052017d099b01440094e17740f9210100b4e07b40f922008052fc43009405000014e00640ade20ac03d620a803dBBBBL4;FF810c01542", - "9e401941f100031010c0154f9ffff1726e40194f70300aa1f0400b141fdff54e04305918100805221e40194e00a0135e85341b9e82301b957ffdfc8L4;FB206d657373616765206b6579735369676e616c5f5051434b415f56315f4d4c4b454d3736383a53434b41204b6579000000000000000000000000", - "000000000000L8;FFa0020291c4deff97ff830b91f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8c0035fd6032440b97f04007108010054091840b949010037e901805209210039BL8;FFf7031faa09230091681f4092e80208aa69a200a9280080526cffff17a0e300d1a8ab3ca92841009420008052e", - "10314aa13640194fd7bbea9f44f01a9fd030091L8;FFe10316aae20315aa0001178b0c640094e802158b680a00f9186300f139630091c003005436d77fa9e00314aae10313aa8f010094e00315aae10313aa8c010094BBBL4;FF600300b00080119108a401944801c0da0811c0da280d48ab020200540801", - "018a0968e8388900f836e00308aafd7bc1a8c0035fd6000040fd00a8200e0800669eL4;FFf35301a9fb7305a9441c40b9400440f9a40200355f0000eb20020054440040f9800400f9440040a9040000f9607861f85f0000ebe0000054c0021091e12a0091L8;FF24a40094fd7b42a9ffc30091c0035fd6a8", - "0100d008310b91e00301aae10308aa620280523ca4001408004039e00301aa1f050071a1000054a10100d021f00b91BL8;FF810200b021000091a200805242240114fd7bbda9f65701a9f44f02a9fd030091140840f9f30300aa3f0002716200005435008052080000143f00207162000054BL4;FFf85f0a", - "a9f6570ba9f44f0ca9fd03029137fc413939604ca9f40301aaf30300aa08108052f51a40d2360002912000178be1031f2ae20315aa08140038f6230094L3;FB0600000004000000400000000000000040f03f000000000040f03f00000000006802000000000000680200000000000008000000000000000", - "100000004000000BBBBBBBBL4;FFe9430091e22701a9a80201ab420f0054170440f9f30300aae9060091ff2200f129fd43d32af17dd3490109cbe932899a1f0549eb290a00542a050091e0830091L4;FFe90741b20001c03d08e140f80000803d08e000f8c8028052892200a989008052802201a9c800009", - "008e92e91882602a9e10f40f9a1fcffb5e7ffff1720008052L8;FFc10100549ffedfc8610640f9e101f8b7600240f922008052011e0194e00313aa0103805202018052f44f42a9fd7b41a9ffc30091fa1d0114f44f42a9fd7b41a9BBL4;FF21040054f46f41a93b0c00b468071b8be9f301b2960a40f9695", - "595f208f17dd31a6100d148ff43d3087d099bd50208ab42010054970640f989620091e8031aaaL4;FFf40300aaf30301aa96ffff97e00314aae10313aae81a80d2010000d4e0f6ff97f35341a9fd7bc2a8c0035fd6000000002400028b0500028b5f0002f1a8070054L8;FFe40313aaa8831ff8529e00945", - "29e0094f44f43a9fd7b42a9ff030191c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa810100d021c01891BBBL4;FF1f100031414c005439feffb505000014e04305918100805226de0194804b0035e85341b9e83700b957ffdfc8770000b51fde0194f70300aaff0600b180020054L", - "4;FB48000000000000006a00000011000000f5014900000000004e0000000000000001050000140000002d004900000000004a00000000000000b602000009000000L8;FFe86b00f9292041a927104da93f0314eb36404ea9e8e700f92b2043a9e92f1fa9352c4ba9e89300f9292044a9e8cf00f93e2045a", - "9eaa317a9284446a92a684aa9BL8;FF6b09c05a892a4a29882e0129220080529f1202f82809c05a4a09c05a892e4b29882a02292809c05a6909c05a88260329884640f909208052800640ad282508aaL8;FFb60a40f9f60b00b4c90240b22911c0da291540d2290d098b29250191c91a498b29050091b416", - "40f92801088b140b00b4890240b22911c0da291540d2290d098bBBBBL4;FF43a8200e6c00669e6c0100b48c01c0da8c11c0da0c0e4c8b8c010b8a428c212e42a8302e4f00261e8f0500372f00805202000014ef031faaad210091a001108bL4;ZFL8;FF42050054217c0353610500343f040071600100543", - "f08007161fdff54e00700b5e00313aabafdff97e80301aa80010036480800b5e1031faae8ffff17c00400b5BL8;FFa8831fb8e8a341b8a9b31fb8e93f40796a820039aa835fb8abb35fb8e80b00b9e81300b96a1200b868a200b8ea2342a96012823ce91b0079e92b00796b0600b9L8;FFff0208eb490f00", - "54968248f8df0600b1801400548022029105e3ff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebBBBL4;FF690200f96082803c680e00f9600000540063009158a7ff97f3d340a9940100b47522009104000014940600f1b5620091e0000054a1825ff881ffff", - "b4a00240f9L4;FB6f6c2d613434636635613164633062366666632f6f75742f7369676e616c2e70726f746f2e73746f726167652e727300a7864900000000004e00000000000000L8;FFf44f4aa9f65749a9fd7b48a9ffc30291c0035fd608008092e90300aa1f200039e00313aa280100f9f44f4aa9f657", - "49a9fd7b48a9ffc3029126bcff17ff8301d1BL8;FF7c6605a97b6200b9682603a9686604a9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd620008052e10317aa063e019420008052L8;FF0f000014c80080d2a1831df80800f0f2080900d11a000014e80b41b2e00b00f90", - "7000014e80b41b2a0831df814000014c80080d20800f0f2080500d1e80700f9BBBBBL4;FF29040091e00315aa690a00f91b692138e10313aa13faff97770a40f9680240f9080117cbbf0208eb480f0054680640f9e10316aae20315aa0001178b000e0294L4;FFe89f40f9f9b31539e88f02f9e8bf40f9e8", - "9702f9e8a340f9e89b02f9e81f41b9e84705b9e8c340f9e8a702f9e8d740f9e8ab02f9e8cb40f9e8b302f9e86741b9L8;FF2a008052210140f90a0100b941ffffb5c0035fd6ffc301d1fd7b04a9f52b00f9f44f06a9fd0301913f9000f1c1050054092040393fb500716105005409344039BL8;FFffc3029", - "1c0035fd6ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191350840f9fa0301aaf30300aa750500b4540740f9f48d0194L8;FF2a5d105308596a780001094af44f42a9fd7b41a9ffc30091c0035fd6a80100d008010191e9030091630100b063802191640100d084001191f3", - "03002a00210091BBBL4;FF0b000014e82340f9e10317aae20316aa0001188b0ace01940803168be82700f9398300f173820091800d0054e12740f9e81f40f91f0101eb600a0054e82340f9L4;FB54b55e63313b1eb04689f4d0e7379bfb2a8a05e9e5240eb2d30c7c1c933e4688fdc52e5f7d287026a4e47", - "b400668764ed2aaa9eaaf82d9cc0b66a28cb732b4dfL8;FFe9cb40f9e4ab13a9eaa740f9e9eb00f9e9b740f9fba700f9fb0316aae9cb00f9e98b40f9fe8b00f9fe0308aae80302aae20301aae1030aaaea0308aa08018052BL8;FFe81b40f92283c33ce0e3009160838c3c2083ce3cc1e2009161838d3c21", - "83cf3cfc030b9160838e3c2083c83c61838f3c2183c93c6083883c2083ca3c6183893cL8;FF810300ade1b2ff5428008092680200f9a6fdff17000100d000f43891020100d042c03991010680521e4e0094fd7bbea9f44f01a9fd030091f40300aa2301f8b7BBBBL4;FF290d098bf35b01a9f75b02a92925", - "019129fd46d329050091200200547f0600b100010054680240b20811c0da081540d2080d088b08250191681a488b08050091L4;FB727563742054696d657374616d705072656b65794d657373616765526573656e6461626c65000000000000000000000008000000000000000800000000000000L8;FFa3", - "ffff17c80080d20800f0f2080500d19fffff17c80080d20800f0f2080900919bffff17e00300f9210200d021301d91230200d063fc1491e003009122028052BL8;FFfd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091f30302aaf40300aa020500b46806138bf60301aa15f17dd3f66d", - "0194e00315aa01018052L8;FFe1031aaae20318aaee110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aae5110094fad342f9fc0740919c830191fbf9ff17BBBL4;FFed3309b8ef330179eca700b9e7d300b97a880094a8035c38bc935c381f05007121090054a8835c3", - "81f050071ac0b005428170035e90f41b2bc000014495f40f9L4;FF08008092080300f9ff0b4091ff830091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0031faa08aeff97a0877ea906aeff97fd7bbea9L8;FF3f070031422c000a5023000af1c3911a6b31000a4901094a8a010", - "e4a4c02014a2802084a29010d4a4a010f4a8c01024a6334000a0801094a4901104a8a010b4aBL8;FF810000b4820a40f9e00313aa042e01949f0b00b101030054e89f40f9c002c03dc91240b9f59342b91f0500b1e063813de99305b9600000546063029170e4ff97L8;FFa20a40f9e00314aa052e009497", - "000014f6e742f9fb074bf9f90b4bf9fc0f4bf9f8134bf9f5174bf9c80240f9f4e342f9680000b4e00314aa00013fd6c10640f9BBBBBBL4;FFc0035fd6e80f40f98a0640f9490108eb631700548a0240f9e00b40f9e20315aa4801088b882600a9580040f9080740f91f0100eb62010054e80f41b2e80700f", - "9L4;FF08008092880200f9d300001408008092880200f9fb08001408008092880200f9e5010014fa150094c002805221008052f8150094002701b4a80000d008653491L8;FFf85f03a9f65704a9f44f05a9fd430091160440f9760200b4335040a9380200d018f30591170040f9b9730091750200d0b5a21", - "791e8164038e3030091e00313aaBBL4;FF291cc0392b1d00124a550b0b4a0148510901f83708710a8b0a01805208a800a91f0000f9fd7b44a9ff430191c0035fd6497d1c53a90700340900be524901090bL4;ZBL8;FF549600948101009021601a91840100f084a00391a363009162008052b30f00f94c96", - "00944c960094fd7b41a9f31340f9ffc30091c0035fd6fd7bbea9f30b00f9BBBL4;FF69420039f0ffff17ff0307d1fd7b16a9fc6f17a9fa6718a9f85f19a9f6571aa9f44f1ba9fd830591f30308aa08018052e00709a9ff230aa9e8430291ff5b00f9L4;FB2076657273696f6e73000000000000003c1b490", - "0000000004700000000000000b1010000120000003c1b4900000000004700000000000000b30100000d000000L8;FF29a049a9e8ab15a92aa04aa9e9a310a929a04ba9e9b700f9eaa318a929a84ca9e9eb00f929a04da9e9a700f92ba44ea9e88f00f928a007910001c03deba300f9BL8;FFe8d302f9df06", - "00b1a032005480220291911c0094080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308eb48310054e6010014L8;FFe80300aae08332912101009021803691a20180522301009063b4369144018052e85306f911000014c80080d2e0a33239e08332910800f0f2ffa7323", - "9e85306f9BBBBL4;FF1f400039602201a9090d40f9e803009120013fd6e80340f91f0d00b160fdff54e0c30591e1030091022e805204f60194755a41a9c80240f9680000b4e00315aaL4;FB74436f6e74656e744e6f53656e6465724b65795374617465436861696e73656e6465725f726174636865745f6", - "b657973656e6465725f726174636865745f6b65L8;FFf65706a9f44f07a9fdc30091081c00121f090071a1010054e00302aaf30302aaf40301aabaf5ff9720020037750240f9a80640f9160101eba2020054e80f41b2BL8;FF84a00d91a363009142018052a80f00f95076019468c2009101030090217c24", - "91040300f084200e91a363009142018052a80f00f9477601946822019101030090L8;FFe10315aa22008052057600949d000014f3031faae8031faa85000014bf0600b121fb0054f8031f2af6031faa340080521900809228008052ff1700f9e80700f9BBBL4;FFf65741a9fd7bc3a8c0035fd6f503012af", - "60308aa13b60194e80316aae90301aae103152a2a008052890600f98a420039d4ffff17ffc307d1fd7b19a9fc6f1aa9L4;ZDL8;FF00e4006f1605001189008052c80ac05af40301aaf30300aaa8c31fb8a81300d1e0030191a8a73da9c801009008a13691e9038052a1a300d142008052760000b9BL8;FFe", - "a0f03f948fd60d3fcfb42f9e9231839b47e0853e0c2c13ce1c2c03ce8a305b9e067813de163813db30700143b008052f4b340f974faffb535008052f6bf40f9L8;FFe8d70bb9210a0054e39349a9e0830991e2cb41f9e5734e39e1032a91e6031f2a24f1ff97fc3341f9f90308919f0b00b1418300540801", - "009008b140f91f0d00f1BBBBBL4;FF0801148b03fdff54e90f80121f00207109140033c20000540a7c0653090500394a051a320a010039e0ffff17ea0f80120b7c10530a2c0633eb0000350b7c0c53L4;FF57fdffb5b61640f9e803088b36feffb5e80308ab22200054b42240f9740100b4890240b22911c", - "0da291540d2290d098b29250191891a498b29050091280108abL8;FF604e40f901f57ed34200805204060194685640f9a80000b4605a40f901f57ed342008052fe050194686240f9a80000b4606640f901f57ed342008052f8050194BL8;FF8a0400542600001401860194a003805221008052ff85019460", - "1600b4280300b0088d08910900f0d20001c03d01d1c03ca80380520000803d01d0803c0e000014L8;FF80010054eb031faa4cfd41d38d010b8b4a010ccbaef57ed30e696e78df21296b6b818d9a5f0500f108ffff5408090b8b0a0140795f21296be100005415054079BBBL4;FF3700805206000014ff1e0", - "0714000005417018052ff02346b81270054580b40f9fc1b00f9380200b4530740f9f8c50194e00318aa21008052f6c50194003200b4L4;FB2e70715f726174636865742e7273002163616e6e6f7420616476616e63652070617374206072656d61696e696e67603a20c004203c3d20c0002f636172676f2d", - "L8;FF022e8052e093803d28f100f80cc60094e8c31591a012c93cea8f42f908a10291e98b42f9f7430d91e0d7803d010146ad032dc03debfb42f9f6031aaaece342f9BL8;FF2aa040a9536928380cfc5cd308050091290040f9280800f94cfeffb40a7c15533f0108eb53611932200100542a0440f90bfc6", - "3d35369283808050091280800f9L8;FF280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6000100b0BBBBL4;FF48008052a80200b983ffff17e00300b000c02d91e20300b042802e91e105805220e6019", - "4fb1f40f9e803192af90f40b954ffff17e00300b000d02f91e20300b0L4;FB72676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f70726f73742d302e31342e342f7372632f65L8;FF8401805239dbff97e16341f9e16301f92102009021881", - "f912302009063c01f91e0030b91c2018052640280522fdbff97f46341f9e0030b91e1830591022c8052BL8;FF02028052a80f00f952660194e102009021601e91e40200f084003191a363009102028052b30f00f94a66019468620091e102009021201891e40200f084803191L8;FFfd030091092040a9f3", - "0300aaa80000b4600a40f901f97fd34200805200660094681240f9a80000b4601640f901f97fd342008052fa650094681e40f9a80000b4BBBL4;FF091440f93f8100f1c1020054091040f92b9140b82a1140f82dd140782c0140390b1101b82b7d40390a9100f82af140f8297141f80d5101780d0880528c", - "111d12L4;FF9f00006b6dffff54826c1c53e001809200c022cb6500008b606860f8020840f9bf0002ebc1e7ff5402804039421000123f00026b4ce7ff54021840b94224c11aL8;FFe8079f1a68e20039f30b40f9fd7bc2a8c0035fd6000040f9080040b9280100341f050071a1010054a80100f0088d0391", - "e00301aae10308aa6200805236a60014BL8;FF810200b021e83b916200805242260114ff8300d1fd7b01a9fd430091280440a9090000b029411191820200b042b83791e02700a9e3030091e00308aa15260194L8;FF08004039c90000d029a11591e00301aa08711d5308410051081d7d92226968f8c9000", - "0d029811691286968f8e10308aa3926001408a440a9e20301aae00308aaBBBBBBBL4;FF01030054287c179b1f2100b1a8020054081d0091f422009118f17d92950218ab02020054e8ef7db2bf0208eba8010054b50200b4f603032af5190294e00315aaL4;FFf6574aa9f85f49a9fa6748a9fd7b46a9ff03", - "0391c0035fd6a00000f000602891161a0094ffc306d1fd7b15a9fc6f16a9fa6717a9f85f18a9f65719a9f44f1aa9L8;FF28008052bf0a00f9bf2200a96182009100008092748200916d1a01941f0400f140fdff54f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6f7031faae00317aaBBL4;FFea0309aa", - "cb6a69380c69693829050091ff0209eb8b010b4acb6a2a3821ffff54f7430339ebab40a908028052e94303916a7100a96a0900f92a01088b08210091L4;ZFL8;FFc0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa810100b021c01891e8030091e00309aaa2018052479a0094810100", - "b021d01391a4010090BBBL4;FF3fb20094f60301aaa100f8b6f9031faae00319aae10316aa0eda0194fa0300aa960200b4fad90194e00316aa2100805239008052f7d90194c0feffb4e1031aaaL4;FB2c0b4c57376d16620000d50046009c001400ee00fd00b50025012d001601000000000000000000000", - "8000000000000000800000000000000ecdb440000000000L8;FFe8e700f9e8ff41f9fb9f42f9faa742f9e5ab42f9e4af42f9e82b17a9e80342f9ea0b42f9f2b342f9f6b742f9edbb42f9e9231fa9e80f42f9e90742f9eebf42f9BL8;FFe167833d27000014e01bc43de83b48f96082803c09008092680e00", - "f9e0430691690200f9bb100094a80600d11f0900b163010054ab000014e801805209008092L8;FFf63b41f9e87b42b9e81f00b9b69800b4f43741f9fe590094e00316aa21008052fc590094a00001b4e10314aae20316aae00b00f9025a0094f9d740f9e98b42b9BBBBL4;FF20013fd6e80340f91f0d00b1", - "40fdff54755a41a9e00740adc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9L4;FB6861696e20666f722073657373696f6e20776974682062617365206b657920c00f2c20636861696e20636f756e743a20c00076656e646f722f6c69627369676eL8;", - "FFf8674fa9f50300aaf6df50a9202300b4080b00911f0900f143240054b80000b4e00319aae10318aa22008052fcf90094962300b4e00317aae10316aa22008052BL8;FFabbdcbcaad81cd938e010e8bccadcccace010fca23feff540b3001a90e3400a93f1100f1c2f6ff54eb031faaea031faaec0340b2", - "9f0109ebe20000542c00088bL8;FF220080522300805224008052b590ff97e11740f9e00317aa92fcff17f70300aae0630091220080522300805224008052ac90ff97e11740f9e00317aab3fcff17BBBL4;FF6a0eaef2abccadf2aaaccdf2a1c301d1abecccf2ea6deef2020180522b8fedf20a010acaa8a", - "73ca90b010bcaa86301d1aaaf3aa9aaed8dd26bae8cd28accadf2L4;ZBL8;FF200742ad9f8225f1a0073cad200b43ada00b3dad210340ada1033aad220341ada2033badc12d0054b82d00b4a8e300d1e1831391a20303d1e00318aaf8eb00a9BL8;FF691640f9090100b42a0140b24a11c0da4a1540d24a0", - "d0a8b4a25019129194a8b29050091280108ab02080054691e40f9090100b4290140b22911c0da291540d2L8;FFf54f45f9fa5345f91f0900b1c13e005476ee01f9f66340f92800805275f601f9f54740f968c6133969f201f97afa01f9bc0000b4e00317aae1031caa22008052BBBBBL4;FF880e00542904", - "0090297100918a0000102b6968384a090b8b40011fd601200591e003022ae20303aad7f4ff97403800b4210400b021a01f91230400b063c03491L4;FF070a0094f44f46a9f65745a9f85f44a9fd7b43a9ffc30191c0035fd620008052c10280520b0a009420008052e10314aa080a0094fd7bbda9f65701a", - "9f44f02a9L8;FF800100b4600640ad080180521f2000a91f0800f90080813c600ac03d0180823c0080833cf30b40f9fd7bc2a8c0035fd60001805201098052110a0194ffc300d1BL8;FF078a0194f44f4da9f95340f9f6574ca9f85f4ba9fd7b49a9ff830391c0035fd6b4835df8c7ffff17a0031df82103", - "00b021e43191230300b0638c2f91a0c300d1L8;FFe04f01f9ff5301f9fb6304a9fa2b00f908000014e00316aa42008052008a0094f53f40f9b5060091bf0219ebe0260054a8621c9b140940f974ffffb4130540f9BBBL4;FFe2031baa230080522400805218bdff97b7035ef8ba035df8480317cb7f0308e", - "b69e3ff54a0c300d1e10317aae2031baa23008052240080520dbdff97b7035ef8L4;FB0800000000000000e000460000000000000000000000000008000000000000000800000000000000e80046000000000000000000000000000800000000000000L8;FF60200054e84f00f9e8cb41f9facf41f9e0d34", - "1f9f8db41f9f9df41f91f8125f1e9c741f9e83300f9812700545f0700b120290054f4d741f9e8e341f9fce741f9BL8;FFa80000b460a240f901f57ed342008052034a019468aa40f9a80000b460ae40f901f57ed342008052fd49019468b640f9e80000b460ba40f901f57ed342008052L8;FF291540d229", - "0d098b2925019129fd46d30801098b130500917f0209eb89190054088c45f81f0500b1c0140054ce020094080040b20811c0da081540d2080d088bBBBBL4;FFe183059122008052810241ad820e40adff1701f9e81301f9610203ad620e02ad09ea0194e20f40f9f9c30891ff7f0739420100b4e81341f9e", - "91741f960020291L4;FB0800000000000000b07f420000000000000000000000000008000000000000000800000000000000c07f42000000000000000000000000000800000000000000L8;FF1f0500b160000054e10313aa3dfdff97950a40f9550300b4610a40f9680240f9960640f91f0101eb000c005", - "4680640f9490380522a040091e00315aa6a0a00f9BL8;FF29050091280108aba2020054092c40f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab42010054fd7bc1a8c0035fd6L8;FF2083c63c2183c73ce82b00b9e8430691e00705ade10240adfab30a39e103", - "02ade10ac03de10b03ad2584fe97e99341b93f09007121080054e8cf40f9e9a341b9BBBL4;FF7f220039680200f926000014f6031f2ae003162a1caa01941f1c007281f8ff54e80300b008b140f91f0900f1a3020054e8830091490000f029611a91e82703a9L4;FFe1031faa4cffff17fd7bbba9fa6701a", - "9f85f02a9f65703a9f44f04a9fd030091361040b9135040a9df060572c0170054b601e0379f8200f1e2040054e8031faaL8;FFe88300913423139b880240f9e8efffb4800640f901f57ed34200805200aa00947affff17950640f9480080520900809208200039090000f9780100b515000014BL8;FFe163", - "40f9081140f900013fd6e03b02f9e8031691e13f02f9290c40f9e103129120013fd6fbc342f97f0f00b1e1000054c800805223ffff17e8e322910081cd3cL8;FFe86304f9e85344f9e96704f9ea8304f9e88f04f9c182803ce087853de083853d33290094f90740910a088052e0833f9139031891f703279", - "1f8833f91297f4039BBBBBBL4;FF3f0500b1e0000054e003082ae10314aae20313aacdfbff9780faffb4260000149f5a00a99f0a00f9e003082ae10314aae20313aac5fbff9780f9ffb41e000014L4;FF09350039e93341b909390039e92b41b9093d0039e92341b909410039e91f41b909450039e91341b", - "909490039e90b41b9094d0039e90341b909510039e9fb40b9L8;FFc901090b0e819f1abf25007129c10011cb114b0b0e819f1a9f7d02714ac100110904003909819f1a0a0000396ac10011cb010d0b29114c0b0a0800396ac10011BBL4;FFfd7b51a9ffc30591c0035fd620008052e10315aa0f920194200", - "08052610280520c92019420008052e1031aaa09920194ff4301d1fd7b02a9f65703a9f44f04a9L4;ZDL8;FF29010aabc20600542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9050054280108ab8300005426000014e80308abBBBL4;FF8b020acbcc020beb8", - "de179d3df020beb4b01168b8b828b9aac110ccb9c819f9a6a010aebe00d00540b0e8052f8031faa59ed4092087d0b9b28a10b9b49e179d3L4;FBd5f6d5f6d5f6d5f6a28cb43fa28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28c0000ab960000c9781deea1c853ad7f83699431c20f2a", - "95e6L8;FFe99742f9e8ab03a9e88f42f9eaa742f9e81b00f9e89342f9e87b00f9e89b42f9e8d300f9e89f42f9e9230ca9e8ab42f9e9a342f9e86f00f9e8af42f9e85f00f9BL8;FF2200805207120094e1d342f942faff17f60300aae04316912200805201120094e1d342f9e00316aac6f9ff17f60300aae", - "043169122008052fa110094e1d342f9L8;FF63600491040100f084c03091e2c32291c1058052e85b04f9e95f04f91052009420008052e10319aa0a52009420008052e10314aa0752009420008052e10316aaBBBBL4;FF8b6e40f9a9035af80a1140b8150140390c5140781b7140f81cf140f87f0500b1ea8", - "300b9aa835a381a7141f8167d4039ec0b0179e94700f9ea43023920070054L4;FB00000000000000000100000000000000010000000000000004af42000000000000000000000000000400000000000000040000000000000070cb420000000000L8;FF97fe03a981620091e20313aa5bf4ff97a0fbffb45", - "4000014800b00b5e00313aabbf1ff97e80301aa60000036c8faffb45e000014e1031faa882600f9d3ffff17BL8;FF6b01084aaa531738aa8357382901084aab631738ab935738a9731738a9a357384a01084a6b01084aaa831738aab357382901084aab931738abc35738a9a31738L8;FF80220291490380", - "5209692138ead302f9212b0094e1431691950f0094e87749f91f0500b1e0070054e1d342f9e8cb42f91f0101ebe08b0054e8cf42f92a040091BBBL4;FF0a0140f94b8540f80a2500a9ab0313f871ffff17a26301d1830c8052b698ff97a0edffb4a8000014190600b428008052a14301d1a26301d1bf233b", - "a9bf031cf8L4;ZBL8;FFf85f0aa9f6570ba9f44f0ca9fdc30191092040f9f30308aa3f0009ebe2000054a8018052690a00f90903805268220039280080526b000014081c40f9f40300aaBL8;FFe0833291a10200902120099102028052a302009063040791040180528700001448008052e0a33239e8a732", - "39c80080d20800f0f229000014f30300aaa00302d1L8;FF81f4ffb40804805205000014c11240f93f0400f1ebf3ff5408028052e06a68f822008052fe3100949affff17c80080d20800f0f2080900912effff17fb5f40f9BBBBBL4;FF0800669e0cc101f2c0030054eb0700f98801c0daec0b00f90811c0d", - "a880f488b0801198a571b08cbe8025df87f0308ebe1010054e1825cf8e00309aae2031baaL4;FFe0031baa2200805205020094b80200b518000014f70400b4e02b40f9e10317aa220080523a008052fd010094b80100b510000014810000b4e00316aa22008052L8;FFe0020054611a40f93f0400b140010", - "054810000b4601e40f92200805200020194612640f9810000b4602a40f922008052fb010194b40000b4600640f9e10314aaBL8;FF49820194fd7b41a9ff830091c0035fd6010300f021702991820080523e820114080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091L8;FF4a", - "050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a250191BBBL4;FF4ac110aa29094039e0030091eb1300f908010aaaeca30039ee0300b9ed0b0079e91b0039f1f300f8e87300f8eb7301f8ec7f003932", - "9a0094f40301aa6101f8b6L4;FB676e616c2f727573742f70726f746f636f6c2f7372632f646f75626c655f726174636865742e727300c01b2073657373696f6e20737461746520636f72727570L8;FFec2b4ba9e20713ade8f200f848018052e0a3803db1fcff1720008052e1031caa0cc2009420008052", - "e1031aaa09c2009420008052e1031baa06c2009420008052BL8;FF08020094610a40f9e00315aae3ffff17fd7bbca9f85f01a9f65702a9f44f03a9fd03009148008052f50301aae10302aa000d002af30302aaa5fbff97b73240b9L8;FF5f0700b1e12700f9800b0054e00641ade0430691facb00f900838", - "23ce20242ad0183833c0083853ce10240ad0283843c0183803c0083813c29010094fc2740f9BBBBL4;FFff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb23cb00541803008bf9feffb50f0000141f0400b1L4;FB6a000000000000002001000", - "02e00000097ea4800000000004e00000000000000f90400001900000097ea4800000000004e000000000000000105000014000000L8;FFa88317f800010054e0f3c03da02302d1e1431e91f8cb03f9f9cf03f9e0eb813d89300094e0431e91a12302d1e20316aae303152af9431e91b62e0094e8cb43f9BL", - "8;FF55620194f44f43a9fd7b42a9ff030191c0035fd6fd7bbda9f50b00f9f44f02a9fd030091f40302aaf30301aaf50300aaf76101940005805201018052f5610194L8;FFf0050094e10340a9ec0314aa2aa040a9290040f90bfc63d35369283808050091280800f90bfeffb43f0108eb936119320001005", - "40dfc6ad35369283808050091BBBL4;FFe00317aae10316aa2200805204a20194f44f59a9f65758a9f85f57a9fa6756a9fc6f55a9fd7b54a9ff830691c0035fd6e0030191e10319aa2200805223008052L4;FF84fc44d304e01f786500056b20010054e103054bbf1000711fc921384d0300541fb11f3806", - "14805205c11fb801d05f382210001283060011c200020b02d01f38L8;FF84c02291e323009182008052e80700f945a20094fd7b41a9ff830091c0035fd6810100f021bc1491820080523aa20014080040f9e00301aa090140f93f0900b1BL8;FFa90213abe20900543f0102eba2831ff8a90f00f92807005", - "4098441f8f40308aa290140f920013fd6880640f90801158b88ce00a9f44f48a9f53b40f9fd7b46a9BL4;FFc10100b4820a40f9e00313aaf44f41a9fd7bc2a802220014280400d11f0d00b1c8000054000440f922008052f44f41a9fd7bc2a8fa210014f44f41a9fd7bc2a8L3;ZBBBBBBBBBBL4;FFef11c0", - "daeffd43d3ddffff172d2100d1ad01168abf2500b16819005408fd79d36d020d8b686a2938a8210039b1ffff172e2100d1ce01168adf2500b148180054L4;FFe30314aa2d140094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faa081f0094e00741a90", - "61f0094ff8303d1L8;FFf72340f9f65745a9fd7b43a9ffc30191c0035fd6a90e40f9680a40f9a082c03cf40300f9e90f00f9090116ebe083803ce3040054f50740f9bf0209ebc9000054BBL4;FF800701ade18343ad810300ad26000014c80300d008b140f91f0d00f1c3030054280100900841319149030", - "09029610391f92302a9e8630091e82703a968008052L4;FF207c0253426005910004412a070000d0e8c002910008402a0010402a0020402a0a0400114001200a007c091b007c1b53404860380004005100741e5302040011L8;FF42008052b30f00f9529f009468a20191810100d0219c1b91a40100b084e", - "00891a363009162018052a80f00f9499f0094499f0094fd7b41a9f31340f9ffc30091BBBL4;FFad000054390300eb436c00541803008b060000141f0400b1c16b005423df01941f100031416b005439feffb505000014e0430591810080521edf0194806a0035L4;FB2d004900000000004a000000000000", - "00bb010000200000002d004900000000004a00000000000000e10100000900000000000000000000000000000000000000L8;FF0e2c53a908219f5a081d0072eb3700f90ba040f9eb1f00f90bb054a9ec7b00f914b055a9ecd300f90db056a9ed6700f9ecef00f90db057a9ed5700f9ec6f00f9BL8;FFc10", - "200d021b42f91a32300d162018052e40314aaa8831ff84e5f01944e5f0194f44f43a9fd7b42a9ff030191c0035fd6ffc302d1fd7b05a9fc6f06a9fa6707a9L8;FFe10317aae20316aa0001188b0c5f00940803168b680a00f9540300b4610a40f9680240f9b51240f91f0101eb40070054680640f9490280", - "522a040091e00314aaBBBBL4;FF4f00261e8f0500372f00805202000014ef031faaad210091a001108b10000b8a426970fc438c202e7100669e32c201f2a1fbff54e8ffff17e083c43ce183c23cL4;ZFL8;FF08050091290040f9280800f9abf6ffb43f0108eb93611932400400542c0440f90afc78d3936", - "9283808050091280800f9eaf8ffb43f0108eb7361193260050054BL8;FF49010036290300d029c10f91e00301aa225968f8290300d029c11091285968f8e10308aa3c7f0114281040b96800c8376800d037397f0114397f0114397f0114L8;FF088c4df81f0500b160000054e16300914193ff97888a40f9", - "1f0500b120eaff548142049136000014e11740f9e80f40f91f0101eb60730054e81340f9938248f8BBBL4;FFe80300f9e9230039560100b4e10316aa2200805202bf019406000014f8031faa880300f008c1319157038052e80b00f9b50000b4e00314aae10315aa22008052L4;FBdf7a4900000000004e0", - "0000000000000f904000019000000df7a4900000000004e000000000000000105000014000000657d4900000000004a00000000000000L8;FFe82b01f9e93701f9e10a00ade30201ade18a0fade38210ade40242ade48211ad07bf009460220091e1c30991023e805203bf009448008052e0a3019175fe00", - "f9BL8;FFc0035fd6fd7bbea9f44f01a9fd030091f40300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aa173f0194000300b50e0000142800805209018052L8;FF0900f0f2e8470039e90700f9e0230091f434ff97f44f4ea9f95b40f9f6574da9f85f4ca9fd7b4aa9ffc30391c0035fd6f62", - "3009137008052180d8052680240f9BBBBBL4;FFfd7bc3a817fbff17e00313aa22008052230080522400805215020094610a40f9dbffff17e00313aae10316aae20314aa23008052240080520d020094760a40f9L4;FFe9d700f9f803082a93010014e0d7c53de1dbc53de0431391e2dfc53de037813de13b", - "813de23f813dd9ecff97f9575aa9f62b40f9f41740f922020014ea431391L8;FFeb1f00b9e9830039ea1302f8e89302b8410f0194fd7b46a9f33b40f9ff030291c0035fd6ff0302d1fd7b06a9f33b00f9fd8301916902009029e12c91f30301aaBL8;FFf8031a2afa031caafc0317aaf703142af40f40b90", - "e00001428008052ff2300f9e80b00f9353b40f9345341b9285741b9e83f00b915fbffb528008052e81b00f9L8;FF21f41491a32300d142008052e40314aab3831ff84f8f009468620091610100d021f01b91a32300d142008052e40314aaa8831ff8478f0094478f0094f44f43a9BBBL4;FF61fcff54e083", - "0091e5050094f81740f9dfffff17f4031faa3a0200b4f50318aaf6031aaae00315aa685e0094080040b20811c0da081540d2080d088b08250191L4;FBd1a0a28cb5814e32a71683e900000821b001438b3a1128e3102805f6cbe5d42d07a138d42ab285635bbcf5d6d23d5bfa6e900a646b4e883267f4f0d", - "814128303L8;FFfa9b00f9e4e300f9a90500543f0700b1e61f00f9e21700f9e7b300f9e0350054f60309aa28070091e97740f9e88b07f9a801009008c10491e9eb01f9e9433c91BL8;FF081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e923", - "0a29074f0194fd7b47a9ff030291c0035fd6L8;FFf83b42f940818b3ce9c304f9680000b4e00318aa00013fd6c10640f9810000b4c20a40f9e00318aafd4e00947f0b00b1c1020054f6e3229155050036e0234ea9BBBBL4;FF1f050071810100543f0c00b12904005428008052e90300f029092691680a00", - "b928038052692201a908008092680200f90d00001428008052e90300f029cd2591L4;FB6b65790000000000fe924800000000004c000000000000005900000009000000fe924800000000004c000000000000005a00000009000000fe92480000000000L8;FF81620091e20313aaddedff97000100b47d00", - "0014600d00b5e00313aabceeff97e80301aa40010036c80d00b5e1031faac1f8ffb42a000014e20313aa230c8052BL8;FF6800c8376800d037246f01141d6f0114526f0114fd7bbda9f65701a9f44f02a9fd030091140840f9f30300aa3f0002716200005435008052080000143f002071L8;FF1f0101eb4", - "03d0054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9920c0094fad342f9e8cb42f908011acb1f0308eb483c0054e8cf42f9BBBL4;FF21af01941f1c0072a0060054a18a43a9e0c30091a31245a90083c43c0183c53ce08701ad1186009440080036a88640f99f0208eb290c0054e", - "90300d029b140f9L4;FFfd7bc6a847ffff17e0031faa11afff97a0877ea90fafff973ffc3ff16900005420008052c0035fd6fd7bbba9fc6701a9f85f02a9f65703a9f44f04a9fd030091L8;FFfa0f40f9e80740f95f0308eb60040054fb0b40f99c070091410700919f021cebe10f00f9607b3a786006005", - "480ff41d31f0001eb82100054880340920800088bBL8;FFc106005488008052f46f41f9e8230b3949008092f36b41f9490300f9880240f9680000b4e00313aa00013fd6810640f9810000b4820a40f9e00313aaf82e0194L8;FF29b11691f42707a9e9230091a1a301d1e92f08a9a94302d1e92309a9a8e3", - "01d1090000d029d11691e82b0aa9e8630091e8270ba948008052c90000f029613b91BBBBBBL4;FF290400f0290100918a0000102b6968384a090b8b40011fd6010440f9410300b4000840f922008052f44f41a9fd7bc2a8fb16021413d041a9880240f9680000b4L4;FFe20319aae30316aa1af1ff97e86b", - "42f91f0500f1614f0054b60000b4e00319aae10316aa22008052fd16009408008092880200f9b70000b4e00318aae10317aaL8;FF090100f9c0035fd6290080521f7d01a9090500f9690200d029e10c91090100f9c0035fd6690200d029a11d91008500a9000d00f9090100f9c0035fd6090440a9BBL4;FF", - "a80a0091b4831df805000014e80b41b2a0831df802000014a80e0091a0c300d1a8031df8ef8c0094f40300aa59000014c08640ada88353f8c282c83ca9035cf8L4;ZBL8;FF215c1491840100f084e00991a363009182008052b30f00f94e9700944e970094fd7b41a9f31340f9ffc30091c0035fd6fd7bbc", - "a9f70b00f9f65702a9f44f03a9BBBL4;FF609a40f92200805205d70194749600f9f44f41a9fd7bc2a8c0035fd6ffc302d1fd7b06a9fa6707a9f85f08a9f65709a9f44f0aa9fd830191097c40f9f30308aaL4;FB88184900000000004c00000000000000e2000000140000000000000000000000080000000", - "0000000080000000000000050004600000000000000000000000000L8;FFe81b04f9e81740f9ed4f04f9e82304f9e8a744a9e55304f9f77304f9e82b04f9e83b40f9e92704f9e97f40f9e83304f9e84340f9e98b04f9e94b40f9e83704f9BL8;FFf3bb49f9b51300b47622009104000014b50600f1d66200", - "9100130054c1825ff881ffffb4c00240f922008052fc560194f8ffff17f37749f97f0600b140020054L8;FF0800f0f2080900d1ca000014e05706f9e80b41b2c7000014c80080d2e15706f90800f0f2080900d1d0000014c80080d20800f0f2080500d1be000014e05706f9BBBBL4;FF41030054880200f9", - "6800805235000014770240f9761a40b9f50301aafcf601940002805201018052faf60194800600b4e8420291e10315aa160800b9080000f9L4;FB080000000000000008000000000000001881420000000000000000000000000008000000000000000800000000000000708242000000000000000000000", - "00000L8;FF09000014e00300f941020090212c1b914302009063d81391e0030091420180526401805231ecff97e10340f986ffff17ff0302d1fd7b03a9fa6704a9f85f05a9BL8;FFeb2700f9e9234629e03740f9e11f40f93f0100721b119f1aa82303d16e080094a88353f80083c03c0183c13c1f0900b1", - "e08704adc1080054e03340f9e11340f9L8;FFe94f09f94ac13591e1074091e93709f96901009029d10291e84b09f96801009008dd0191e94309f9290080d2a04700d1e85b09f928038052a90fc0f2ea5f09f9BBBL4;FF9f0314eb8801005418000014f52740b988031f8be80208abe3f3ff54a0030090004", - "00a9101b70194f51b40f99f0314ebc9010054e00315aae1031caa22008052L4;ZDL8;FF09b70094740a00f9f44f41a9fd7bc2a8c0035fd6fd7bbea9fc4f01a9fd030091ff830dd100844cadf30308aae8a70891026cc03de9e70891e10300aa02328052BL8;FF29050091200108ab62000054fd7bc1a8c00", - "35fd6a00200b00020309103370194a00200b000c0279100370194a00200b000200891fd360194fd7bbfa9fd030091L8;FFe8e347b9e0032a91a126c03da002803de87303b9a142813cbef5ff97b906001438008052799240f9f6832491990100b4758e40f9f6360094e00319aa21008052BBBBBL4;FF0043", - "c63c0143c73c0243c83ce10179a9e0853ead0043c23c0143c33ce2019f3c0243c53c3f0400b1f6dd7aa9e0853cad0043c43c0143c13cf4557ca9e0893dadL4;FF010380521e070094fd7bbda9f50b00f9f44f02a9fd030091f30302aaf40301aaf50300aafa0600940004805201018052f8060094400100b", - "4155000a9810000d0L8;FFffc3009144070114410200f0219c1891e00308aae2028052fd7b42a9ffc300913d070114ff0301d1fd7b01a9f51300f9f44f03a9fd43009114cc40a9e00301aaBL8;FF4a0d0a8b4a25019129194a8b29050091280108ab8300005420000014e80308abc2030054694640f90901", - "00b42a0140b24a11c0da4a1540d24a0d0a8b4a250191L8;FFaa0a00f980fcff54c80e40929b0240791565b89bba0a40f9a80240f95f0308eb21feff54e00315aa8ad0ff97eeffff1740008052e10315aa06870094ff8300d1BBBL4;FFe9008052f51700f9fa0301aa1f01096bf503092ae05f06a9a11b005", - "4570080d2e00306911700f0f2978300f9ebafff97490080d25f0700b1f5d301390900f0f2L4;FB20c01d2c206e756d626572206f662070726576696f7573207374617465733a20c000204e6f2076616c69642073657373696f6e20666f7220726563697069656eL8;FF9c0100b4d5220091040000149c070", - "0f1b5620091e0000054a1825ff881ffffb4a00240f922008052fdc60094f8ffff17d70000b4e806178be00316aa02018052BL8;FF08070094770a40f9cfffff17a8831ff8a84300d1090000f029813691c0020090007c3691e8a700a9a82300d1c20200b042002391e1230091e8a701a906470194L8;FFca", - "010aab220200542801088b480108ab8202005409804039000509ab22020054fd7bc1a8c0035fd6e8031faa091c40b949fbff35e9031faa0a0840f90afcffb5BBBBL4;FF8b000054602a40f92200805204e7019408048052746200b9a00302d168da04a9e3830291e10315aa682e00f933008052020480522", - "4008052f3830239c3490094L4;FB000000000000000000000000000000000000000000000000000000000000000028a848000000000038a848000000000007000000000000000600000000000000L8;FF000300543f08007121020054001b00b5a0c303d1bee6ff97e80301aaa0030036c8fcffb4d800001", - "43f0c0071400200543f100071c1000054e87b41b968fb0737BL8;FF21902c91a32300d142018052e40314aab3831ff84f67019468620091e102009021b82c91a32300d1e2008052e40314aaa8831ff84767019468c20091e1020090L8;FF140040f9f30300aa880241d29f0200f108459f9aa80600b41f05", - "00f1000200541f0900f121090054610a40f9810000b4600640f922008052f9660094611240f9BBBL4;FFc0035fd6ff8301d1fd7b04a9f32b00f9fd030191098440a9f30308aae8230091e00309aa927d0094e82340391f050071e1000054e84340391f0500710c040054L4;FF600400b4210000b0211842b", - "9c10300347ffe3ff1690400549302138bf51300f9622e4092150082d2600202cb0100805264090094130014cb7ffe3ff109030054L8;FFa301009063e02491a40100d084003691a24700d14104805211a70094a001009000c03d9101a70094ff4300d1e8031f2ae93300910801204b087d1f53e8330039BL", - "8;FF3f010a6b200200543f9000f141030054f30308aae84300912a140094e81340b91f05003161020054e043c13c7f020039e003803d6012803cfd7b43a9f32340f9L8;FFb6831ef8b8431fb8f70200b4561f40f9ff260094e00317aa21008052fd260094800700b4e10316aae20317aaf40300aa0327009", - "4582f40f9d80100b5c3ffff17BBBBBBBL4;FF0b170b8b2a6b28382903098be80328aa7b0700d12a2100392817088ba90600d1610140ad3501158a010100adfbfaffb521000014090180520801098b29210091L4;FFf30300aae0030091f40308aad3120094e0630091e10316aacf140094e1030091e26300", - "91e00315aa33f6ff972800809229008052880200f969520039f44f45a9L8;FFf70300aa152001a928008052081000f9e80318aaa90216eb9402168bf533899a145500a9135d01a9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd600018052BBL4;FFe92e40390801004ae8260039e83240394a01194a29", - "01184aea2a0039ea364039e92e0039e93a40390801134ae8320039e83e40394a011a4a2901164aea360039L4;ZFL8;FF62008052419b0094a201009042e01391e0230091e10300913d9b00943d9b0094fd7b42a9ffc30091c0035fd6fd7bbfa9fd030091083040b9c8030034080140b2BBBL4;FFf3074091", - "73420f91e1074091220080526002029121400f91fb4b0af9e017853de11f853de00747ade01b853de123853da0077aadff4f0af9e0f7843da20378adL4;FBfc53440000000000080000000000000008000000000000000857440000000000fc5344000000000008000000000000000800000000000000e05", - "e440000000000L8;FF480200b0e98300f908b140f9f19300f9f69b00f91f0900f1e1b300f9ea5b00f9ef6f00f9f24b00f9e9050054a80100f008c10491e03300f9e86705f9080200b0BL8;FF075b0194e1074091e0833791023f8052218009910a5b0194000740ad08434079e8032179480300b0e01b843d", - "e11f843d08b140f91f0900f189040054a90200f0L8;FFff7b01f9e20f0fa9e41710a9e62311a920013fd6e06b01f9e8c31791f3c31791e16f01f9290c40f9e1830b9120013fd6f4fb42f99f0e00b12102005468008052BBBBL4;FFfa6715a9f85f16a9f65717a9f44f18a9fdc3049109a04039291a003715", - "5840a9f30300aa0080c13cf70308aae8030291e00316aae01f803dd4fa0194c8624039L4;FB732e696f2d313934396366386336623562353537662f70726f73742d302e31342e342f7372632f656e636f64696e672f766172696e742e7273002f636172676fL8;FF2d0200143f0900b1a0140054e80b41b2", - "3f0108eb4114005481220091e20313aa09060094f50300aa230200143f0900b180170054880080d20800f0f208190091BL8;FF68420291010300b0215435912403009084600491a363009182018052a80f00f94c7b019468220191010300b0218435912403009084e00491a3630091e2018052L8;FFb891f", - "f97e11740f97bfbff17e0630091220080522300805224008052b191ff97e11740f9b5fcff17e0630091220080522300805224008052aa91ff97e11740f9BBBL4;FFfa675ba9fc6f5aa9fd7b59a9ffc30791c0035fd6080400d0fc03152ad702008b080140f949d03bd53401088b08ee8252894240399f030", - "8eb9b33889a3f050071L4;ZBL8;FFff430291c0035fd6fd7bbca9fc5f01a9f65702a9f44f03a9fd030091ff831ad1ff0300f9f50302aaf40301aa200442adf30300aae023029102328052f60303aaBL8;FFc0140054ce020094080040b20811c0da081540d2080d088b0825019109fd46d30800098b08050", - "0911f0109eb88130054bd000014080c44f81f0900b1c1090054L8;FF703242f97fc6133920a10291693602f96c3a02f96e3e02f9774202f968fe01f96a0202f96b0602f96d0a02f96f0e02f9701202f939c143393113ff97f50300aaBBBBBL4;FF5afeff17e00313aae10317aae20315aa23008052240080", - "5215feff97770a40f9680240f9080117cbbf0208eb89cbff54e00313aae10317aae20315aa23008052L4;FFff1700f9ebebff97e81340f929068052e0030091e10313aaf61700f909010039cd04009480a20091e1630091e203009131e6ff9728008092a80200f9f44f45a9L8;FF070b0194e00313aa0109", - "805202018052f44f41a9fd7bc2a8010b011421010054810000b4601240f922008052fc0a0194611a40f9c1fdffb40804805205000014BL8;FFe00314aab273ff9715008092340300b094c238915605805260620091e143059102288052755200a9760a00f9048b0194ffc30a91f44f43a9fc0b40f9f65742", - "a9L8;FF3f9300f161060054f70314aa008b0094006c805201018052fe8a0094006500b4f30300aaf4031faa88048052750100f0b5b2039136008052e84b01f9e04f01f9BBBL4;FFa1c300d1e00316aa49038052aa031ef80969373813b7ff97b7035ef8ba035df8480317cbdf0208eb081b0054160100b4a", - "8835df8e10b40f9e20316aa0001178bL4;FB0f234900000000004a00000000000000b602000009000000d5184900000000006a00000000000000550100002a000000d5184900000000006a00000000000000L8;FFe8cf43f9e0c343f99f0700b1f6cb43f9e84b00f9e8d743f9e84300f9e8db43f9e82700f", - "9608c0054e8d343f9eac743f9fb031c91e04700f9f5ff5e39e0831d91BL8;FF610e40f9810000b4601240f922008052034b0194611a40f9c10000b4601e40f922008052f44f41a9fd7bc2a8fc4a0114f44f41a9fd7bc2a8c0035fd6010040f9L8;FF0a1440f9092040f90a0100b44b0140b26b11c0da6b15", - "40d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b250191BBBBL4;FF438742ad40e3c63c4213c03de87f15a9e043803de1238f3ce3238e3ce2238d3c09eb0194c2fe47d3d5de7992d91a4092ff3f0439020100b4e82755a960020291L4;FB804c4200000000", - "00000000000000000008000000000000000800000000000000804c420000000000000000000000000008000000000000000800000000000000L8;FFb8010094610a40f9aeffff17e00313aa220080522300805224008052b1010094610a40f9b5ffff17e00313aae10318aae20316aa2300805224008052a", - "9010094BL8;FFdf0600b1fb3f00f960060054e0e30191f253ff979f8300f1e10400545f8700f1a1040054e8e30191e00317aa210480528f410094e8e341391f050071e1050054L8;FF1f0900714c010054080200341f05007141030054000180521d000014280180d20800f0f2081d00d11e0000141f1500", - "71000200541f11007141040054280180d2BBBL4;FFa0033eada003da3ca103db3ca203dc3ca303dd3c080dc0dae333803de22f803de12b803de027803d692200a9f44f5ea9f6575da9f85f5ca9fa675ba9fc6f5aa9L4;FFed118b9a0b128b9a1f004af20f781753ab018b9a1f004bf2cb018b9a10785ed39", - "f010f6a6d0150b2ae118b9a1f0068f2ce0147b2ad018e9a9f010f6aae118b9aL8;FFa083de3ca9835ff89f0308eba0039d3ca9031ef8c1f8ff540063009194aa0094c3ffff17f7031faa18038052390080520c000014e80740f9e083c33cf7060091BL8;FF2283c93c20f18f3c2083c83ce9a70b9121f18f", - "3ce9e70b912183c33c20f18f3c2083ca3ce9270c9122f18f3ce9670c912283c53c20f18f3c2083c43ce9a70a91L8;FFe00740918100805200001891ff0316b9e83700b9362a0094e80356b9e00740918100805200001891ff0316b9e83300b92f2a0094e80356b9e007409181008052BBBBBBL4;FFe10309", - "aa220080522300805224008052f4030aaa16060094e10340a9ea0314aa2ca040a9290040f99369283808050091280800f960f9ffb63f0108ebe0000054L4;FF07130094bb0000b4e00319aae1031baa2200805202130094e043139121008052ce0a0094f66f42f9e47342f9e0074091a10000b021cc2f910", - "0401d91e2018052L8;FFf31b40f9ff030191c0035fd6e083c03c080080126042803c680200b9fd7b42a9f31b40f9ff030191c0035fd6ff4301d1fd7b03a9f32300f9fdc30091f30308aaBBL4;FF1f0500b121fcff540500001436008052280340f91f0500b181fbff54f4031f2ae82f40f9490700d13f010", - "8eba1fbff54e063019128caff97fc3340f9d9ffff17L4;ZDL8;FF40030054a1825cf83f0400b140010054810000b4a0025df82200805200930094a1025ef8810000b4a0825ef822008052fb920094a10240f93f0400b1e0fdff54BBBL4;FF480080520900f0f2e0830091e8a7003929090091e91300f9f2c", - "80094f50300aa0d000014f51740f908000014e80741b202000014e80f41b2e0830091e81300f9L4;FBb703d6ff434858191ed7683db94e69ee5cf62c0f438f5ca7a02d0b70b64fd4ad0000c45894099bfd591916cd63d6733effb86fd00756c5d6216f135c61fcd6ffL8;FFfabf40f9ee3300f9ee0305aae", - "92b01f9e9e740f9f8031caae50316aaf60318aae37b00f9e9bf00f9e92b40f9fc030faaf88f53a9efa740f9e62704a9e91740f9BL8;FFe1d342f9e8cb42f91f0101eb203f0054e8cf42f9090180522a04009109692138e1431691ead302f9a90c0094e88349f91f0500b1c0000054e8074091e1431691L8;", - "FFe8830291e0032d91e10313aa0204805214210191f3032d9108f7ff97080000f008111d91c9048052e85706f9080000b008713e91e85f06f9080100f008013091BBBBL4;FFfb0300aaa0e300d1e8270129f70f00f9f7030aaaf1dbff97e8430191e0031baae10317aafb0b00f974cd0094e843413968060", - "036e8634139e10f40f91f050071L4;FB3c000000050000009a9648000000000033000000000000004e000000050000009a96480000000000330000000000000034000000050000009a96480000000000L8;FFe007003728fc60d3c80400b5200840921f1800f1a2050054217c0353210600343f040071c00", - "100543f08007161fdff54880240f91f0500b1810000549f6200a9BL8;FFe10314aa1787ff97000200b408ff60d3e90f40b9e00fc03d765e00a96922062968008052600a803d600601a968e20039eefeff17e11740f969ffff17a0e300d1L8;FF810000b4e09349f92200805204730094b30000b4e07b49f9", - "e10313aa22008052ff720094e807409108810991006103918b0b0094f4bb49f99f0600b1e0b2ff54BBBL4;FFa06301d15db40094f40301aa80fa073618000014a0035df8010080924083c33c280400d1090080921f0d00b1696e00a96082823c0804005422008052f8b20194L4;ZBL8;FF68220039690200", - "f9f44f47a9f92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd6e9719cd2d53240f909c7b1f2691cc7f2c971fcf2a97ec99b29fd45d3BL8;FF21010054602e00b5a02302d11fecff97e80301aaa0030036c82e00b5e1031faadbffff17a22302d1630c805205e4ff97e10300aac0faffb478010014", - "e8534cb9L8;FFe0232a39e8272a39c80080d20800f0f246000014e04305f9e0032a91e100009021843d9102028052e300009063243d91040180528700001448008052e0232a39BBBBBL4;FF290040f9080140f9291902cb000540a9220101d1b4feff17080a8052090040f92a0040f948fc089b290140f92", - "00540a94801088b024101d1fefeff17080040f9L4;FFe9fb01f9890000b029693191e88f01f9e8a301f9e8b701f9e8cb01f9e8df01f9e8f301f9e80702f9e90f02f9c9008052e81302f9e81b02f9880000b008893191L8;FF610e40f9810000b4601240f92200805203030194611a40f9810000b4601e40f", - "922008052fe020194612640f9810000b4602a40f922008052f9020194613240f9BL8;FF0a0000b04a411f91e8a700a9220300b042dc2991ea0f00f9e34300911d830194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000b04a211f91L8;FF4200805285830014ffc300d1fd7b01a9f313", - "00f9fd430091e90301aaf30300aa610100d021c83b91e8030091e00309aaa20080524683009468620091610100d0BBBL4;FFe00308aa06c30194e00314aae0bf02f9810300f021883791830300f063003891e0e31591e20180522402805292ffff17e80f41b285ffff17c812009183ffff17L4;FB3060470", - "000000000a0694700000000006120446973706c617920696d706c656d656e746174696f6e2072657475726e656420616e206572726f7220756e657870L8;FF2200805206c30094dbfdffb5f9031faadcffff17e0030e912ec1ff97daf7ff17e8c315910021009135bdff97e06740f9e10f40f9610000b422", - "008052f8c20094BL8;FF200108ab02080054e10313aab0fcff97560300b4610a40f9680240f9b70640f91f0101eb00080054680640f9490180522a040091e00316aa6a0a00f909692138L8;FFf81f00b98043813c00e4006fa80319b889430df8aa0312b8a8c313b8828707adeb1300b9ebe303b9200300a", - "d30420094e9bf4639e84346390a088052a00302d1BBBBL4;FF1f0000f1cd000054390300eb23ec00541803008bf9feffb50f0000141f0400b181eb005421e301941f10003101eb0054f9ffff171ee30194f70300aa1f0400b1L4;FB756c6c79206465637279707465643b206d75737420686176652061206", - "3757272656e74207374617465000000000000008be84800000000003800000000000000L8;FF7f2200a9080080927f2201a99f0600f1ab000054e00740f9e10314aa22008052ffe20094f41b40f99f0600b1e0010054f38743a9e00313aa6ce1ff97d40000b4BL8;FF400100b4165400a9e10200d0216038", - "91144c02291f600039f44f42a9f65741a9fd7bc3a8c0035fd6000180520104805213630194ff8300d1fd7b01a9fd430091L8;FF0a63009440010090006006910a6300944001009000c0069104630094400100900020079101630094ff0301d1fd7b03a9fdc30091080040f9090540f9490d00b4BBBL4;FFf", - "f8306d1fd7b14a9fc6f15a9fa6716a9f85f17a9f65718a9f44f19a9fd030591491c0012f403042af50303aa3f190071f30308aaec030054e80301913f090071L4;FFe1031aaa050080d2040080124304805262008052000080d2930400941f0400b1a00e005402fe81d25aff4cd3631240f9c40210914108", - "d89a820600519c7e4093L8;FF810100f021cc1491a40100d084401d91e323009182008052e80700f942a30094fd7b41a9ff830091c0035fd6810100f021bc14918200805237a30014080040f9BL8;FF39230194fd7b41a9ff830091c0035fd6ff8300d1fd7b01a9fd430091080040f9e0230091e80700f93", - "2230194fd7b41a9ff830091c0035fd6e30302aae20301aaBL4;FFd6c2009180010054c1025ef8810000b4c0825ef82200805201230094c1825ff8e1feffb4c00240f922008052fc220094f3ffff17680240f9c80000b40805088bL3;ZBBBBBBBBBL4;FFe93280d2c826089b08ed7c92c902088b212500b14", - "0fdff54a00208cb02018052ff1c0294e6ffff17e003032a031d0294f40300aae3ffff17ffc302d1fd7b05a9L4;FFe8c30091e00315aae10316aa8328fe97f91b40f93f0b00b1c1070054e8fb4039e97b407937008052ea3b40b9eb5f4139fbf343f82841082ae9f344f8f67344f8L8;FFf50300aa0e1d019", - "4c142009100008092d74200916e1d01941f0400f1200100541200001435008052c142009100008092d7420091661d01941f0400f161010054BBL4;FFe10314aa9a02028b0001198b0c9d0194e83340f9e0020191e10300912200805208050091e83300f9309d0194ffff0039f50318aaf4031aaaa2fe46d3", - "b8e27a92L4;FFe00701323f00006b00ffff54e00303aa480c80d2211080d2220080d2010000d41f9800b121feff54e00303aae10302aa010000d4edffff17e80300aae00301aaL8;FF6800c8376800d037379d00144b9d00144b9d0014281040b9000040f96800c8376800d0371d9d0014169d00144b9d00", - "14e00301aaa10100b021c03b9142008052BBBL4;FFe85341b9e81700b957ffdfc8770000b527dd0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054L4;FB81000000200000006f766572666c6f7720696e204475726174696f6e3a3a6e657", - "70000000000000083094900000000004800000000000000c900000012000000L8;FF090c41a9e0b3823de8bb00f9085443a91b4446a90e9853a9e9231fa9092044a90d9455a9e8cf00f9081047a9e8a71aa9142048a9e8df00f90c2049a9e8af00f9BL8;FFe3f3863de8e34df9e10f843d0183c13ce01384", - "3d0083c03cf8031baa08011bcbf66309f93f0308ebe09b843de19f843dfb6f09f9f62b08f9e0ff833de103843dL8;FF610a40f9e00315aaadffff17e00313aa22008052eb000094610a40f9bcffff17e00313aae10317aae20315aae5000094770a40f9680240f9080117cbbf0208ebBBBBL4;FFfd7b42a9", - "ffc30191c0035fd6206300d1c9330094e9ffff17f90300aaa0c20091a24201912100805223008052ade1ff97a82643a92a01198a00696afc00a8200eL4;ZFL8;FFc3fcff9720fe073728fc60d3880a00b5200840921f1800f1c20a0054217c0353e10a00343f080071ac0100543f040071a00300543f0800", - "71a1020054400f00b5BL8;FFa9831ff8e40180525a7d0194fd7b42a9ffc30091c0035fd6092000912103009021403b91a9831ff82403009084c03a91a32300d1e00308aae20280523a7d0194L8;FF000117abc2630054e1630091517dff97df0600b1e00a0054e11740f9e80f40f91f0101ebc03b0054e81", - "340f92a0400918022029149018052ea1700f909692138BBBL4;FF220400d109008092a86301d11a00f0f2b58b3aa9e90f00f9e91b00f9e92700f9a8831bf8a21000b417210091f5630091b86301d13600805222000014f4bc0194L4;FB6b6579736964656e746974792d6b65796964656e74697469657373", - "657373696f6e737075626c69636164647265737300a7864900000000004e00000000000000L8;FF62220891e0031f2ae3031faa7bbd0094fd7bbea9fc4f01a9fd030091ff830ed100844eade10300aa02328052f30308aae0071bad00884fade00b1cad01804cadBL8;FF29fd46d30801098b080500911f0", - "109eb49090054091c40f93f0500b120060054096840b969070034290140b22911c0da291540d2290d098b2925019129fd46d3L8;FFe1031baa20013fd6fceb41f99f0f00b12112005448008092880200f9a8008052d90c00141f090071fc032a91ad0200541f0d007181080054606641f9616a41f9BBBBBL", - "4;FF90feff17e00313aa22008052230080522400805216000094610a40f997feff17e00313aae10317aae20315aa23008052240080520e000094770a40f9680240f9L4;FFb80000b4e00316aae10318aa22008052030d0094e15341f9810000b4e05741f922008052fe0c0094e00313aa29eaff97ff0b409", - "1ffc32791f44f45a9f65744a9L8;FF5ef7ff97750a40f9e10316aaeeffff17ff8301d1fd7b04a9f32b00f9fd030191f30301aae10300aae0230091e2031f2ae5faff97e90740f9e82740b9aa058052BL8;FF02018052e00301aae10308aa428d011448030090086d219142018052e00301aae10308aa3c8d", - "0114281040b96800c8376800d037398d0114398d0114398d0114L8;FF400400540a1440f9092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8bBBBL4;FF2081803c280100f9e00315aa9eb6ff975a0700f1b5c2019", - "181ffff545b0300b468e379d3e00318aa01111bcb02018052f44f50a9f6574fa9f85f4ea9fa674da9L4;FB30214900000000005800000000000000760000002f0000007370717220666978696e672062616420656e63617073756c617465312073746f7265642073746174L8;FF6aeb44a9773b5129803c0", - "054ff420171403c0054df0600b1407f00543f0400b1f70318aa20020054e10000b422008052f8030baafb030caaf9cc0094ec031baaBL8;FFe10245ade81700f9e80b40f9e9a319a9a80302d12183833c2083843c7da8ff97e11b40f9e21340f9e843069163a303916423039185830091e00316aa0604805", - "2L8;FF060000143c008052542340f9b4031df874f1ffb509018052a8035df8755a00a9755e01a9785e02a97c6605a97b6200b9682603a9686604a9f44f4ca9f6574ba9BBBBL4;FFe10740f9810000b4e00318aa2200805203ed0194130800b4e00317aae10313aa22008052feec0194680240b20811c0da0", - "81540d2080d088b08250191681a488bL4;FB000000000000000008000000000000000800000000000000b07d420000000000496e76616c6964417267756d656e740000000000000000001000000000000000L8;FF890200322911c0da291540d2290d098b2925019129fd46d3290500912001088be10313a", - "a4bedff97f502003574040034610a40f9680240f91f0101eb60040054BL8;FF280840f91f0109ebea33899a0a010acb28010acbe80208eb88010054e8031faa4901178b09000014f6031faa00018052ff7f01a9ff0300a937feffb5ea031faaL8;FF0ffeff17f60300aae043169122008052ec100094e1d3", - "42f9e00316aa32feff17e043169122008052e6100094e1d342f943feff17e0431691e1031aaae20318aaBBBL4;FFe00700ad0080c33ce00b01ad00ad01940004805221008052feac0194801200b4600644adf50300aa811a40f9000400ad810000b4801e40f922008052f8ac0194L4;FFe20314aa0001158", - "b0a0f0094a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaf60301aae10315aae20314aa2bffff97750a40f9L8;FF390440f9f8031faa5500805217038052e01f00f9ff7f1fa9ff1701f9ff1301f9ff2f01f9ff2b01f9ff4701f9ff4301f9ff5b01f9ff5f01f9ff7301f9ff", - "7701f9BL8;FFf7cb42f9e80180528083cf3c7f0b00b1a80319f8404f803dc1220054f8630191e8031691e00315aa1ba30191f54301f9f5031691c83aff97e8c342f91f0500b1L8;FFe89740f928f3ffb40805088be00313aa0201805201f17dd3fcfeff17ea074091e90756b9f7e742f94a011891f53f00f", - "9fa074bf9481140b8fb0b4bf9f90f4bf9BBBBBBL4;FFc0035fd6e80741b2e9ffff17f40301aa1f2900f1880000542a01088b4af1df384a03f837e0030091e10309aae20308aa947e0094e80340b9c8000036e00740f9L4;FFc10000b4e0031baa22008052fb030caa03150094ec031baaff0600b1e003005", - "43f1300f1c10b0054e8d340f9a30000d063a03391e0431391e1031aaae2031caaL8;FFf65703a9f44f04a9fd830091340440f9f30300aa88ba00d11fb900b128010054a8008052740600f9680200b9f44f44a9f65743a9fd7b42a9ff430191c0035fd6BBL4;FF89164039ea574039e85300394801094a891", - "a4039ea5b4039e85700394801094a891e4039ea5f4039e85b00394801094a89224039ea634039e85f00394801094aL4;ZBL8;FF1f0500b12011005409faff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebe80f00549600001473f9ff97080040b2BBBL4;FF5", - "f2800f1880000542800028b08f1df388804f837e08300919a3e0094e82340b9e8460037e81b40f98a0740f9490108eb635600548a0340f9e01740f94801088bL4;FBe81f4900000000005800000000000000a400000018000000911f4900000000005600000000000000c800000009000000911f49000000", - "00005600000000000000L8;FFe1433c918f180094b4ef7ba9e0031d91a8e779a9a082c83ca18b7aa9a182c93ce3031baaa282ca3ca4835cf8e037823de13b823dfa0301aae23f823de88304f9BL8;FFe1d342f9e8cb42f91f0101eb806f0054e8cf42f949098052f6074091d6820991f4031baa096921382", - "8040091f87749f9e8d302f91f0700b1a01a0054c0220291L8;FF29111d91e8c303f92800009008411c91e85f04f9e8c316912a0100904a013091e86304f9080000d008713e91e96f04f9e9c32291e86704f9e8c31d91a04700d1BBBBL4;FF28008052a203df3c800600ad820a803d68e20039f44f4aa9f65", - "749a9f85f48a9fd7b47a9ffc30291c0035fd6000180520106805212f50194000400b000001d91L4;FB65646973747269627574696f6e5f7575696453656e6465724b6579446973747269627574696f6e4d6573736167657369676e696e675f6b65794964656e746974L8;FF4102009021ec1c91430200906", - "3481491e0030091c2008052a4008052e80300f932eaff97e10340f9b8ffff17e80f41b2b2ffff17c80080d20800f0f208090091BL8;FFfd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa0103009021f42691e8030091e00309aa6201805244750194L8;", - "FF3900805203750094c0feffb4f90b40f95f0700b1f8cb02f9e0cf02f9ffd302f920130054e8031faa4901805209683f3808050091fa3b49f9e8d302f97a0300b4BBBL4;FFe00301910103088be2ff01390cb50194fc03019123000014e10b40f9020308cb8003088b188100d13500028b04b50194683340", - "f960030191e103019122008052L4;ZDL8;FF02018052211108cb05b50094210f40f9c11800b4201340f9a300001433008052fb1f8052e0030baaf7030baa680000147701198bd80000b4e00315aae10318aaBL8;FFfc5b42f99f0b00b1c183005408030090fb83029108b140f9fa4340f91f0d00f1430700", - "54e8c31791e0833291525dff97e8fb42f91f0500b140e90054e80343f9L8;FFdf0208eb61000054e0e30e91fe6bfe97e00640ad09068052e8e341f9e20ac03dc822099bc9060091e0832491000500ad0209803de9e701f9e4f3ff97e86340f9BBBBBL4;FF16000014a06300915c060194e80300aae00301a", - "ac8fa073610000014e0031faa0e000014880080d2a0831df80800f0f207000014e90b41b2a9233da905000014L4;FF020180522300805224008052e9e5ff97e92341a98cffff17800000f00040009102050094ff8302d1fd7b06a9f73b00f9f65708a9f44f09a9fd830191f50300aaL8;FF80f9ff543f040", - "0b140f9ff54e10000b4080840f9f30300aa22008052e00308aaff040194e00313aa011040f921f8ffb4001440f922008052f44f42a9f65741a9BL8;FF152040f9750300b4131c40f9f6031faaf70315aae00313aad21a0094080040b20811c0da081540d2080d088b08250191081848abe2020054160116a", - "b02030054L8;FF1f0500f1ab000054e06740f901f97fd34200805202850094e86f40f91f0500f1ab000054e07340f901f97fd342008052fb840094e87b40f91f0500f1ab000054BBBL4;FFc802138ba8031ff8a003de3ca8035ff8f50301914103c03d490b40f9a0c20091e10319aa02238052e013803de8", - "2b00f9e183853ce93700f901c50194a8220591L4;FBe40100001a00000064656372797074696f6e206661696c656450726576696f7573436861696e4b6579626173655f6b6579726f6f745f6b657900000000000000L8;FFe1dfc13d68e20d91e9c343f9000500ad69ce01f9c4f7ff17e11f40f9810000b4", - "e0031aaa22008052fdc40094e16f40f9810000b4e04740f922008052f8c40094BL8;FFe0060036212c00b5992240f9881a40f93f0308eb6100005480c20091147cff97881e40f9e083c33ce0031faa2823189b000d803de083c43c0011803de083c53cL8;FFe00301aa28fc073708fc60d3c80100b508084", - "0921f1900f102020054017c0353210200341f1100f160020054e003082ae20313aae303142ab5ffff97c0fdffb4BBBBL4;FF021115cbf44f44a9f90b40f9f65743a9f85f42a9fd7bc5a803e50114f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6960015eb090500541f0104ebL4;FB6167652", - "0776974682072617463686574206b65793a20c00e20616e6420636f756e7465723a20c0152e2053657373696f6e206c6f6164656420666f7220c0022eL8;FFd5160091750a00f9370200b5f403182a680240f9bf0208eb61000054e00313aa51e40094680640f9a906009114693538690a00f9f44f44a9f9", - "0b40f9f65743a9BL8;FF228f40f8420f00b4410340f9200080398000f8b728040091490400d1110000145f2800f1880000542800028b08f1df38e807f837a0e300d192ceff97a8835cb8L8;FF810000b460de40f9220080520465009461e640f9810000b460ea40f922008052ff64009460220091f4feff9", - "760a20791f30b40f9fd7bc2a887feff1760420691BBBL4;FF600300f00000369108a5019428008052ff0f00f9ffa300a957080035560300b4e10f40f9e80740f9b70640f91f0101eb80080054e80b40f9490280522a040091L4;FF621e00b9fbffff17bf3b03d5e3ffff17200000b000400691350000b000", - "0c40391f1c007221020054e103142ae00313aa24feff97f40300aaf30301aaa0420891L8;FF4b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aabBL8;FF1f01096be0179f1a1f2501948806403", - "969064039f503002a1f01096be0179f1a19250194880a4039690a4039b602000a1f01096be0179f1a13250194880e4039L8;FFe08757ade213813de0071fade08b58ade003813de18355ade207813de1031dade08b56ade00b1eade08754ade0071cadf1000094e00745ada88301d1e0830d91BBBBBBBL4;", - "FFca0640f9490108eba30d0054ca0240f9e00740f94801088bc82600a908fc60d3280700b5080840921f1900f162070054017c0353810700341f1100f1c0070054L4;FFe2030191e0031aaa3bf4ff97350080929c000014e89f4139e9534678a1035ef8fc834139fa3740f92841082ae91346b8378108aa6", - "11200b4e00318aa8f000014L8;FF618200910000809274820091701901941f0400f1a10100549ffedfc8610240f9810000b4600640f922008052fc180194e00313aa0105805202018052f44f41a9BBL4;FFfd7b44a9ff030291c0035fd6e0030091e10314aa420180522300805224008052138cff97f5d34", - "0a9e2ffff1708358c521f00007101fa805200019f5ac0035fd6L4;ZFL8;FFaa431538aa7355382901084aab531538ab835538a9631538a99355384a01084a6b01084aaa731538aaa355382901084aab831538abb35538a9931538a9c35538BBBL4;FF090180d2e8031faa0900f0f229017fb24a1d4092a0c", - "300d108010aaae81b00f9ea7343f8a9233da9aaf31df8ebc1ff97c80300d008b135916903805268a600a9L4;FB636820c01b3a204b65797353616d706c6564202d3e2048656164657253656e74002f636172676f2d6769742f737061727365706f73747175616e74756d726174L8;FFe8b740f9e68b02f9e", - "84302f9e8cb40f9eb8f02f9e84702f9e89b40f9f59702f9e84f02f9e8a740f9e59b02f9e85302f9e88f40f9fbb302f9e85702f9e8a753a9BL8;FF00030291331d0094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb499d0054180116aba20a0154b800f8b6f90", - "31faaL8;FFfafb02f9e87300b409038052fb031faa37010090f76a3f911471099bf8032d913600805210000014e8f342f909068052e02bc33d6822099b690600910001803dBBBBL4;FFe00743ade84b40f9e223c03de317c03d882200f928008052808600ad820e803d8302803d68620039f44f4ca9f6574", - "ba9fd7b4aa9ff430391c0035fd600018052L4;FB6e20c00e206661696c656420776974682027c007272c2068616420c01020726563656976657220636861696e73001243616e6469646174652073657373696f6eL8;FFe08b46ada08b3eade18343ada1833bade28344ada2833cade18341ada18339ade28", - "342ada2833aade18340ada18338adb9f3ff97a0877dad800605ada08b7eadBL8;FF5b0080d2f50300aa1b00f0f2dfc2007122010054c87e0453690b00910a000014e80b41b20900809268fe00a9690200f92a010014df3e0171e9000054c87e0453L8;FF0f790094ae010014e04fc23de8a344f909008092", - "690200f96082803c680e00f9ff0600f1eb730054e01f40f9e10317aa22008052fa7800949a030014f6df44f9BBBL4;FF2d696a38ee5b40f94df90737caffff17e923029121008052e44300f92061009124008052f90314aaeb2f00f9f70308aaf40305aa7499ff97e0074aa9e20317aaL4;ZBL8;FF010480", - "522200805205b90094e16342f9f81340f9810000b4e01f40f922008052ffb80094e11740f9810000b4e00740f922008052fab80094b70000b4e01b40f9BL8;FF3f404071680080521535889a680240f9080114cbbf0208ebe8000054680640f93f0002710801148ba20100540101003926000014e00313aa", - "f603012ae10314aaL8;FFea1349b9eb2b5279e1430f91a96207f8e94345f9ead303b96a3642f9a8e207f8e813557940210391ebab0779a96208f8e8df0779b613ff97a0110036fa031faaBBBBBL4;FFc90080d248008052e24300390900f0f2e8470039e90700f9ba000014e80741b249000014932e40f98", - "92640f9e80314aa7f0209eb802a0054090d80520a2940f9L4;FF08bd3491890000f0294d3491cb0080520a0140f9e92f02a9086140f8c9018052e00bc03d0a0000f9086000f8e80741b2600a803d682600a9602601a9f44f45a9L8;FF030d40f9e2058052fd7b43a9ff03019160001fd6202040a96102009", - "021a00c91030d40f922038052fd7b43a9ff03019160001fd6080040f9280100b4080140b2BL8;FF63a42491a0e300d1a2018052240180521d000014a0831cf8210300b021d82391230300b0630c2491a0e300d1a20180526401805214000014a0831cf8210300b0L8;FF21040054e2031f2aade2ff9708fc", - "78d36a0100f04aa13a9109fc60d3487968782821084a095d1053495969782801084ac87a337816000014a80100b008010191BBBL4;FF14c90194ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091040180520506805229f87fd33f1100f13481889ae30314aa5a000094L4;F", - "B6a00000000000000190000001c000000d5184900000000006a00000000000000e30000002e000000d5184900000000006a00000000000000800000002e000000L8;FF5a008052f70318aade000014f7031f2ae8eb41f91f0500b180000054e8030e9100410191c7c4ff97df0600b100960054f50f42f9f4", - "0b42f9950100b498220091BL8;FF602200917800009460220291f30b40f9fd7bc2a8a8feff17610640f9810000b4600a40f922008052fd480194611240f9410d00b4601640f922008052f30b40f9L8;FF180118ab020a0054390700f194c2019161feff54080317ab22070054c902158b080109ab6209005", - "4691640f9090100b42a0140b24a11c0da4a1540d24a0d0a8bBBBBL4;FFf30308aa3f0500b1e0010054141440f9173040b9740200b4161040f9fce80194e00314aa21008052fae80194c00200b4e10316aae20314aaf50300aa00e90194L4;FB0000000000000000080000000000000008000000000000008", - "04c420000000000000000000000000008000000000000000800000000000000804c420000000000L8;FFf30300aa1f0500b160030054e8630091e00301aaa8330094e80f40f9e003c23ce91b40f91f0500b1e003803de90b00f920030054e083c33ce183c43ce93740f9BL8;FF4a11c0da4a1540d24a0d0a", - "8b4a25019129194a8b29050091280108ab8300005441000014e80308abe2070054096040b93f05007141010054096440b9290140b2L8;FFa90302d1e8430f91a20302d124010191030480520502805263690094e8eb41f91f0500b1e01b0054e002c03de8f341f9e9030b91e17740f92015803de89301f9B", - "BBL4;FF7f0308eba82100541b0100b4a8835bf8e10f40f9e2031baa0001198b08a9019439031b8bb9031cf8f66740f9fa2700f9df0600b1e10000541f000014f42740f9L4;FF3f0440b1e2020054080840a92a044091f30300aae023009109f97fd3e10308aa5f0109eb4981899a0a0180523f2100f13481", - "8a9ae30314aa0b000094e80740f9L8;FF0130805213a90094fd7bbaa9fb0b00f9fa6702a9f85f03a9f65704a9f44f05a9fd030091f30306aaa600f8b6f4031faae00314aae10313aa06a90094f30200b4BL8;FF3fb5037183020054691240f86a9240f81ffd01716b1241f86c7241f829010a8a6a010c8a2", - "9010a8a200941bae0079f1afc4f58a9fd7b57a9ff430691c0035fd6L8;FFf6eb42f9f5e742f9e8e3163949008092670000141a0180d2e8031faa38ff48d31a00f0f206000014090180d2f8031faae8031faa0900f0f23a017fb2091f4092BBBBBBL4;FF28280037a8035ef88a0740f9490108eb233700548", - "a0340f9b7835df84801088b882700a9680240f9080540f91c0117eba32e00547b0240f9620740f95f001cebL4;FFe8ab4bf91f0900b121400054e8cb41b9c836003436008052f31b00f9df02086be0431391a14700d1d526961ad2ecff97e8030e91e1431391e003162a0e6bfe97L8;FFec5b40390a1c003", - "9ea6b4039f26f4039a811082a0c120c2a0e2000394a120a2a092c0039e97b4039ee7f4039083c0039280080520c300039c911092a0b340039BBL4;FF887240f90a0540f9ea1000b4150140f9a80240391f2100f1a1100054090180d25f8518f10900f0f241110054886e40f91f8131f181130054816a40f9", - "e28b8152L4;ZDL8;FF08990c91e00301aae10308aa4200805241910014880100d008910c91e00301aae10308aa420080523b910014281040b96800c8376800d0373891001438910014BBBL4;FFf90315aaf34300f91f0114eb7c0f00f9e933949af88b00b9080109cb950208cb0a01168bc90215ebf33389", - "9abf0216eb89328a9a2a0108cb89030aeb69170054L4;FBe43dd9cf5fe9d824027dd6e99c2ccb466c15544552c883e22d97733aa29aace7784aa28c75ef11ce0000a45e67f5f2609126267fe17ad077e264f960be202822L8;FFf5030aaa002100913dcbff97e0032b91d2caff9708008092745601a96866", - "00a97c030014e8e300f9e87740f9a082c63cea3f00f9740080520aad40a9e90700f9BL8;FFe1d342f9e00318aa02feff17e04316912200805203110094e1d342f913feff17e0431691e1031aaae20318aafd100094fad342f9e8cb42f908011acb1f0308ebL8;FFe56340f9e4031faa92e4ff97e8c342f92", - "00bc03dfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1404f803da90319f860420054e96301912083c33c2183c43cBBBBL4;FFa0e300d108010aaaa9a33ca9f3d9ff97080400900849359149038052682601a9e00747a908008092685e00a9a1e6ffb422008052faf0019432ffff17a9e300d1L4;FB759", - "148000000000034000000000000006f0100001d0000007591480000000000340000000000000008010000300000006d697373696e67207265636569766572L8;FFf85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf40301aab9f0ff97e80300aae00301aa080200", - "37750240f9a80640f9BL8;FFaaa35838a98318386901084aabb35838a99318384901084aaac35838a9a318386901084aabd35838a9b318384901084aaae35838a9c318386901084aabf35838L8;FF390500913f0308eb48190054da000014f6074091d6820991c022029154250094080040b20811c0da081", - "540d2080d088b0825019108fd46d30900088b20050091BBBL4;FF21040054aa435ab85ffd0371c80300544a1d00135f0100716d030054e92f03a9a98356f8a06303d1e82300f9a80358f8ea0f00b9aa0355f8e92301a9a88359f8L4;ZBL8;FFfb3b40f9f6574aa9f85f49a9fa6748a9fd7b46a9ff0303910", - "1b10014f44f4ba9fb3b40f9f6574aa9f85f49a9fa6748a9fd7b46a9ff030391c0035fd6f90300aaBL8;FFcbf3ff5408028052606a68f8220080520331019499ffff17c80080d20800f0f2080900912dffff17fb830291e8fb42f91f0500b1e0140054e80343f9e07fc13dL8;FFe8431f91e99704f9343100", - "94687a40f9e9430e910a0000f04ab11691e99304f9e9431f91e84b03f9080000f008d12191e99b04f9690000b029710391e89f04f9BBBBBL4;FF6d0d4d8bad01088a38190dcb0d035cb8df020d6b800200548d0500d1ac010ceac1feff54428c202e42a8302e4c00261e4c0100374a21009160010a8b0b00", - "088aL4;FF2002005421035ef8810000b420835ef8220080520201009421835ff8e1feffb4200340f922008052fd000094f3ffff17eb031f2af6030daae1030eaaef0310aaL8;FFf85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aa0b010194a00100b4f50300aaf7", - "000194e00315aa21008052f40315aaBL8;FFff030191c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091080040f9e00301aa14cd40a9e80300913f810194b30100b4080d8052757e089b130300f0L8;FF42de0054f50314aabc0e48f89f0f00b161000054e8031faa0d000014e00315aa06ebff9", - "7080040b20811c0da081540d2080d088b0825019109fd46d30800098bBBBL4;FF0fc10194e91740f928008052282100393f0100f9ff031191f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6a00300d000c02591fbc00194L4;FB3a20c00076656e646f722f6c69627369676e616c2f", - "727573742f70726f746f636f6c2f7372632f73657373696f6e2e727300287365745f756e61636b6e6f776cL8;FF81220091a80317f888ee40f9e007813d807ac03da98318f889565fa94083813ca2837bade81302f9e883029100a10191a103963ce91f02f9e01b813de217813dBL8;FF080116cbbf0208e", - "b48060054680640f9e10314aae20315aa0001168b08410194c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aaL8;FF07410094611a40f9810000b4601e40f92200805202410094e00313aa080c49f81f0500b1400000542d000094745a45a9f60000b4f50314aae00315aa28", - "000094BBBBL4;FFe0430591810080522ae1019400ac0035e85341b9e89700b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd6L4;FB6a00000000000000950000002e00000011000000000000001400000000000000140000000000000080f848000000", - "000091f8480000000000a5f8480000000000L8;FF00a02091030200f063602391040200f084402191e2431e9121048052e0e7813de8d303f90ee10094020200f042402091e00309aae10309aafee00094000200f0BL8;FFf30b40f9fd7bc2a8c0035fd600018052010480521a61019408004039e90200f02", - "9c11191e00301aa08711d5308410051081d7d92226968f8e90200f029a11291L8;FFe083c23c0009803d892200f90c000014e003082ae20313aa630c8052f1f5ff9780f6ffb4a9ffff17e003082ae10314aae20313aa1ffdff97601a00b5a0f5ffb4BBBL4;FF200f0037882a4039892e4039410300f02120", - "3e918a3240398bd2407808bd70d3e083c03c420300f042801891e0230091a34300d1082109aa6905c05ae083803cL4;FFe000f83720031091f57e409302cc338b130c40b9562840f9a0ffff1700430891ef030094eaffff17c1424079000000f000c00291212c46d304786178843c7cd3L8;FF21801591e0", - "230091a32300d102018052e40313aab4831ff84ea1009488620091810100f021981991a32300d1e2008052e40313aaa8831ff846a1009446a10094BL8;FF3f010aebc20d00543f0115eb830e0054ff0202eb430e0054e00316aa08210194880240f9760200f926000014760a40f9c90202ebc315005495fe", - "45d32a0115abBL4;FFa8035ef8b7031ff8140117eba3080054b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcb9f0208ebe8040054340100b4L3;ZB" + "BBBBBBBBBL8;FB06000000040000004000000000000000400040000000000040004000000000008801000000000000880100000000000008000000000000000100000004000000L8;FF099000913f0102ebe90300aae2000054499000d10b01098b610140ad6c2140b94c2100b9410100ad3f0102eb28fdf", + "f54c93200f91f0009ebe20309aae3fcff54BL8;FFc0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aa810000b4600640f92200805273250194610e40f9810000b4601240f9220080526e250194L8;FF4b01098b6bf1df388b0cf8374b05c0396c1d00128c6119538c01210b810102516b", + "00f8374b0080524c0000143f104071c30b00544b09c0396c1d00122c380c0bBBL8;FFe10317aa220080527b650194817e40f93f0400f18b000054808240f922008052756501945f03007197e20fa9e8139b9a978600f9961201b9951601b9888e00f9L8;FF40010036481d00b5e1031faa61f9ffb4f10000", + "14e20313aa430c80529cf5ff97e10300aafaffff17e1031faae86b00b9f7ffff17680240f9080540f9190101ebBL8;FFff270039e80300f9e1ebff97e80300aaa1feff9021a01091a3feff9063a80d91e0030091a2018052a4008052e80300f909000014e00300f9a1feff9021a01091L8;FDb8e24600000", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0e2460000000000dce3460000000000BBBL8;FBb00000002e000000000000000000000008000000000000000800000000000000c051450000000000506f6c796e6f6d69616c4572726f7243687", + "56e6b496e6465L8;FF8c0d0c8b8c2501918cfd46d38c05009127000014280080523f0700b1ff1700f9ffa301a9a00c0054e0630091e1031faa2200805223008052240080524ca9ff97BL8;FFeb048052a9028052ffab01a9cafeffb04a0d0891eaaf03a92a0080d2f40308aaea0bc0f2e9ff02a9e9ab05a9", + "2b010194e00313aae80314aaf44f49a9fd7b48a9L8;FF28008052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6d30100b478050094e00313aa2100805271050094400100b528008052880600f909028052BBL8;FFe02f40f9e10316aa220080527a45019468ffff17e12b40f908008092686a", + "00a9c1fdffb4e02740f9eaffff17f6031faae00315aae10314aa0bdaff97800400b4L8;FF220080527c450094c10e40f9a1fdffb4c01240f92200805277450094e9ffff17681a40f9280100b4090d8052e00314aa017d099b02018052f44f42a9f65741a9L16;FFe94f00f9e1ccff975700805220020014e", + "8f741f9eafb41f9e0030991e9f341f9eb1342f9a1e20791e8e700f9e8ff41f9022f8052e06fc13df6ef41f9fb4700f9BBBBL8;FB4e00000000000000020300001f000000ef104000000000004e000000000000000603000020000000ef104000000000004e00000000000000d00200001d000000L8;FFaad", + "358382901084aabb31838abe35838a9c31838a9f358384a01084ac00640adaad318386a01084a2801084aaae31838e10300ada8f31838a0073ead09910094BL8;FF083c40f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091092440f93f0500b1400400540a2c40f909384", + "0f90a0100b44b0140b2L8;FFa04700d1e2c2ff97e0cb00b9a04700d1dfc2ff97e0c700b9a04700d1dcc2ff97e0c300b9a04700d1d9c2ff97e0bf00b9a04700d1d6c2ff97e0bb00b9a04700d1BBL8;FFe02740f9930000b4e10313aa2200805279550194e13340f93f0400f18b000054e00317aa220080527", + "3550194df0600f14b060054e06b40f9e10316aa26000014L8;FFa8273ba968fdffb008a13291a82b3da90a078052c8048052bf2738a969fdffb029ed0a91a92b3aa9290080d2a10302d16908c0f2a87f39a9a8273ca927510094L16;FF0081c03ce8b745f9ff0600b1a0039d3ca8031ef8e00e0054e8e33b", + "91018300910270805200810091fc031a2afae33b9178d50094a003dd3ca8035ef8e0431e91BBBL8;FF610a40f9680240f9962a40f91f0101ebe00f0054680640f9290400914a058052e00315aa690a00f90a692138e10313aa5efbff97770a40f9680240f9080117cbL8;FF080d088b0825019108fd46d30", + "900088b390500913f0308eb49100054f87749f91f0700b1a0150054802202912b250094080040b20811c0da081540d2080d088bBL8;FF7df50094f8ffff17340100b48806148be00313aa01f17dd302018052f44f42a9f65741a9fd7bc3a873f50014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9L8;", + "FF020840f9bf0002ebc1e7ff5402804039421000123f00026b4ce7ff54021840b94224c11ae2e60737021c40b94224c11a82e6073702cc74923400009085c241f9BBL8;FF290d098b2925019129fd46d32905009104000014f4031faa64000014e9031faaea8b92b92a0100344a0140b24a11c0da4a1540d", + "24a0d0a8b4a2501914afd46d3L8;FF0a078052001f813dff4305f9e84b05f9ff4f05f9ea5705f9e86305f9e96705f92e310094e1eb43f9810000b4e0ef43f922008052703500947235009420028052L16;FFf7031f2a04feff17eb831d91e133c23de237c23d6091c83ceaef43f9f80316aae10b19ade127", + "c23de6030991e0d7803de023c23d01048152e8b743f9ea7202f8BBBBBL8;FB7373616765726174636865745f6b6579636f756e7465726369706865727465787470715f726174636865746164647265737365736964656e746974795f6b6579L8;FF14050079ba031ff803fdff54dc000014a8035ef8a8050", + "0b4b6835ef8b3031ff83a008052db020079d4060079dfffff175f0700f161000054e8031faa0c000014BL8;FF002029912d190194e00313aa2200805286010094610a40f9b0ffff17e00313aa2200805281010094610a40f9b9ffff17e00313aae10318aae20316aa7b010094L8;FFe11340f9610400b525", + "000014d60c00b47c1d0094c001805221008052751d0094c00b00b428fdffd0083d3e913cfdffd09ceb3391090140f9086140f897ff48d3BBL8;FF2e590194ffc307d1fd7b19a9fc6f1aa9fa671ba9f85f1ca9f6571da9f44f1ea9fd4306910080c63c0180c73cfb030191084440f9093040f9f60302aa608", + "38d3cL8;FF41050054e39348a9e0c31291e2db42f9e5f35639e1032d912600805205eeff97e85b42f91f0900b180710054c90080d20900f0f2294500911f0109eb40840054L16;FFe3fdff97950a40f9550300b4610a40f9680240f9960640f91f0101eba0080054680640f9490380522a040091e00315aa", + "6a0a00f909692138e10313aae8eaff97BBBL8;FFeaff01a9e9230a2934790194fd7b47a9ff030291c0035fd6ff8301d1fd7b03a9f65704a9f44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054L8;FF20010014e8074091f6a745f90023009108810991f40740919482099166cdff97e10", + "74091e0431691023f805221800991787d009488e20791000540ade8f36879BL8;FFf65741a9fd7bc3a8c0035fd6c0feffd00080049129f90094fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30302aae20301aae10300aa01010037e00308aaL8;FFc5050014fd7bbfa9fd030091fd7bc1a8c0035fd6", + "00000000210000d02040463940030035200000d02200805222400639009c40f9a00100b4fd7bbfa9200000d0BBL8;FFa08b7bada00b3fad1639019400e4006fbf0318f8a0833aada003973ca8da77d3a0877aada10301d1e00314aa22008052080d17aaa0073ead080dc0daa88318f8L8;FF68621c912201", + "01adc00644adc21ec03d60d6813d61da813dc0864fad62d2813d000500adc08659ad68621b91000500adc022c13dc11ec13d68e21b91010100adL16;FFe30319aae113c23de217c23d3bff48d3e0d7803de93344f9f4031aaaa8f200f8e8a35d39f7430d91e003c23de10b19ade6030991e8af00b9e84f44", + "f9e107c23dBBBBL8;FBdfdda65d48eae5dcd4ad5fc2e658d11ba28c32aeb5b9910b428b00009f809101d374fd52e29820abd553bd94d2cddccc442fb1c65491c38df289ca8267ee9d70L8;FF808d00944001805241008052798d0094a05500b4e8fdffd008a93891c9009d52080140f909100079138301a9", + "080000f9131700f9738d00944001805241008052BL8;FF69018052618e41f8280041d23f0000f10841899a1f2d00f1020b0054a80240f9a80000b4a00640f901e97bd302018052710d0194e00315aa0109805202018052L8;FF6182843c742200a9f44f47a9fd7b46a9ff030291c0035fd6e00b40f927e6f", + "f97480080d20800f0f2742200a9f44f47a9fd7b46a9ff030291c0035fd6ffc301d1BBL8;FF804d0194e00315aa21008052794d0194202100b4e10317aae20315aaf60300aa7c4d0194280340f91f0500b121fcff540500001436008052280340f91f0500b1L8;FF080040b20811c0da081540d2080d088b0", + "825019108fd46d30900088b340500919f0208eb69060054e00313aa080c48f81f0500b18002005428fdff97080040b2L16;FFe8fb03f9e8cb40f9f03304f9e8ff03f9e89f40f9e53704f9e81b04f9e80f40f9ee3b04f9e81f04f9e82b40f9eb4704f9e82704f9e83740f9f44f04f9e83f04f9BBBL8;FFe82", + "300b9a9a37da9ea2703a9a9935cb8aa635d78a80318f8a8e300d1e90f00f9a9035d38eaa700a9aa235db8a9835e38ea0300f9a983183821060094a8835c38L8;FF028300911809ff97e89341b91f050071610600542007c03de9b341b92143c23ce8c741b9f81f40b94003803dfacf40f9e002803de9d302", + "b9214b803dec030b91BL8;FFe08708ade08b42ade08b09ade08740ade08707ad002700b4e0c3039195f8ff97c8010014e1430091e20313aaf70b00f9f74b00f911090094e08744adf50300aaL8;FFe0f6ff97f35341a9fd7bc2a8c0035fd6030000d062201d91e40300aae1070132420c4039421c0013020", + "4003480fc5f88e000003581fc0088a0ffff356203f836BBL8;FF76fcff17e04316912200805287110094e1d342f981fcff17e04316912200805282110094e1d342f99efbff17e0431691220080527d110094e1d342f9fdfdff17L8;FF290c40f9e163179120013fd6fa034bf95f0f00b161030054e800805", + "2f6e742f9e8e3163949008092f5e342f9c80240f9690200f9680000b4e00315aa00013fd6L16;FF7f0700b120010054faf740f9570302f1c3360054e5020054f8031faae00318aae10317aa0ca90094e8030a91e12301910232805200a1019176ad0094800642adBBBBBBL8;FB34356363642f3036393539", + "62342f7372632f656e636f64696e672f67662e7273000f53657269616c697a6174696f6e3a20c00076656e646f722f6c6962736967L8;FF68e61f78e80309aa29f57ed3ea1740f908050091f80313aab3031df85969e978e86f03a92a3b0e1329370d133c2709133a230813361f0713351b0613a92b3d29B", + "L8;FFea0314aa2ba040a9290040f97369283808050091280800f920fcffb63f0108eb400300546a6928380805009120008052290040f9280800f93f0108eb20010054L8;FFa8577da9b6077ea91f0900b141010054e8230091e00316aa6bd9fe97950100b4e00316aae10315aa2200805272210094070000", + "14a003df3ce85701a928008052BBL8;FFf50b00f9f44f02a9fd030091a87cc39bf30300aae9031faa0a018052ff0308eb28008052a1030054b47c039b0b00f0d2f50304aa6b0104cb9f020bebe8020054L8;FF680240f9960640f91f0101eb800b0054680640f9490380522a040091e00315aa6a0a00f909", + "692138e10313aa3bfaff97770a40f9680240f9080117cbbf0208ebL16;FFe0030091220280526400805229000014e00300f981fefff021640d9183feffb063900291e003009122028052840080522000001481fefff021640d9183fefff0BBBL8;FB8d00000014000000ef104000000000004e0000000000", + "0000f904000019000000ef104000000000004e0000000000000001050000140000003d0f400000000000L8;FFe81340f9e10314aae20316aa0001178b80810094e802168be81700f97f0600b1609fff54e1630091e00315aac6000014e8031faa000117abe2570054e1630091BL8;FFe1030091e92300a91", + "ffd0094fd7bbfa9fd030091c0feffd000203c91c2feffd042403c916101805217fd0094fd7bbea9f44f01a9fd030091f40300aa2301f8b7L8;FF1b02a07217008252e1030091e0031f2ae20317aa7b140094000700b4c000f8b68d0a0094080040b91f110071e0feff54300000141f0017eb680700544803", + "19cbBBL8;FFf44f43a9f51340f9fd7b41a9ff030191c0035fd6a80240f91f0500b160020054a8630091e9fffff029813f9122fffff042843791e3030091e00314aae10313aaL8;FF607e42f9618242f9470300140043c83c0143c93ce0230391e80744b9f6e343b9a1e20091fcef41f902278052200700ad", + "e82302b977410094786a41f9756641f9L16;FFfa0317aae89300f9f70301aae18f40f9e8d740f9e2831aa9e2030baaf6034ba9e50315aaef7b18a9f9fb42a9f4bb00f9ec2b40f9f0f700f9f42f44a9f2cf00f9BBBBL8;FBdacb4f5b305c482fd6c6a960f577cf77209b5f03044339129a03457ec9d0c9c72", + "2c9f746decba9be0ec6cae9e3ee0000043dba525b25eaa4cce7fc8ed899f5e7L8;FF3a8d001409004039e80300aae00301aa2a0900d13f09007149819f9ae90000b43f0500f16102005401feffd021bc0591e2028052028d0014ff8300d1fd7b01a9BL8;FFe20314aaf60300aa82110194f803172af7031a", + "aafa0315aaf503132af30740f919000014e82b00f9facb40f99af1ffb51c018052e81b41f91f0500b1e1f5ff54L8;FFc80600b41f0500f1aa02098be1000054490140393fad0071000600543fb50071c005005402000014490140393fad0071e9179f1a090109cb48158a9a3f0d00f1BBL8;FF06000014e9", + "1741b2f4030aaa03000014290480d20900f0f2095100a9098c8152e00313aa01c4805222008052090900f9f44f43a9f70b40f9f65742a9fd7bc4a8L8;FF29194a8b29050091280108ab22030054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010", + "054092040f9L16;FF690200f961dbff97cb100014e0032b91f50301aa21200091023980527dd10094e87b45f9140340f99f0208ebe8ff00f9e8979f1a08219f5a081d0072a0c70054BBBL8;FFc5f5ff97c03300b4e00700f9a1ffff9021203f91a3ffff9063603d91e023009102028052040280529301001", + "4e10300aa280c49f81f0500b12101005428008052L8;FFe04316912200805299100094e00319aaf90b40f9e1d342f9a0fcff17f90300aae04316912200805291100094e00319aaf90b40f9e1d342f9c3fcff17c0fdffd0BL8;FFefffff17ff0301d1fd7b03a9fdc30091080040f9090540f9c90100b40a01", + "40f92d0500d1eb030aaa6c1540380b3500a981194092ac003837e0031faafd7b43a9L8;FF4d0300541fb11f380614805205c11fb801d05f382210001283060011c200020b02d01f380130009102008052641240f9842c4092641200f904d05f3884100012BBL8;FF0811c0da081540d2080d088b08250191", + "08fd46d30900088b3a0500915f0308eba82400546e010014e1d342f9e8cb42f9f6074091d68209911f0101eb807a0054L8;FFe29340f9020000143a008052e3074da9c0220a91f2c2fe97e0fbc33de1ffc33dd4220b91e207c43dd5220c91c9220d91800600ade003c43de187c53dd8a20d91L16;FFf6030", + "0aae023009159ddff976082c13c688242f8e183c23ce283c13c6402c33c690244f8e003853c6002c03de83300f9680a40f9e083833cc10201ade083c03cBBBBBL8;FB0d00000000000d1100000d000d0d160d617373657274696f6e206661696c65643a206b65792e69735f6e6f6e65282900bb114000000", + "000004700000000000000L8;FF0000669ec0035fd6283c00130a3c00122b0401132c080213290000132d0c03132e10041330180613311c071322280a13232c0b13444111536b050a0a8c090a0aBL8;FF6b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8b", + "4a2501914afd46d329010a8b290500913f010aeba9010054L8;FFec0741b22bfdffb06be12d91ed018052f003182ae2030a2a4a070014e96f42f9e87342f9e9a31ba9b60000b4e00319aae10316aa220080526f190094e80b4091BBL8;FFe1031baae20317aaf80300aa81590194fc6740b97b5901940004", + "80522100805274590194e00200b460c2c53c61c2c63cf90300aaa1835ef8000400ad810000b4L8;FF1f0500b100080054e02bc33de85b46f9e07f823de80305f949000014fa4340f9080f00b4e89b40f9e9c316910a0000d04a710891e9a305f9e9c32791e8fb04f9L16;FF022a805283d90094bf0a00b16", + "016005460420091e1030091022a80527dd90094755200a9c2000014a80a00d1e16701f905000014e80b41b2e06701f902000014BBBL8;FFe10300a9e00301aae10309aa220080522300805224008052f4030baae6040094e10340a9eb0314aa2aa040a9290040f90cfc6ad35369283808050091280800f9L", + "8;FF8c1540d28c0d0c8b8c2501918cfd46d38c05009102000014ec031faa8b010b8b2801088b49010b8be14316910001098b3a120094da0300b4e1d342f9e8cb42f9BL8;FF081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a292af500", + "94fd7b47a9ff030291c0035fd6L8;FFfd030091361040b9135040a9df060572c0170054b601e0379f8200f1e2040054e8031faad41500b4e90313aaea0314aa2b15c0387f05013108d5889a4a0500f1BBL8;FFf43349f94083c03ce83f49f99f0600b1e04f823de8a304f9c0120054f8432591fc074091a1", + "82009100830091027080529c830191f943159176390194e8a344f9L8;FFf9ff04f9a1420291a22302d182f5ff9780f8ffb444010014e82745f91f0500b1a1000054ff2705f9f82b05f9ff2f05f9ff630ab91f0800f101340054a02302d1L16;FF810000b4e0a342f9220080527ab90094e1ab42f9810000b", + "4e0af42f92200805275b90094fc031f2adf0600b141adff547cfdff17e16740f9810000b4e00315aaBBBBL8;FB73616765206c656e67746820697320746f6f206c6f6e6753657269616c697a6174696f6e20696e76616c69640000000042024000000000006a00000000000000L8;FFe84b00f9e85700f9e", + "86300f9e86f00f9e87b00f9e88700f9e89300f9e89f00f9e8ab00f9e8b700f9e8c300f9e8cf00f9e8db00f9f832f8b715fb7fd3b500f8b6BL8;FFa80c40f9e08706a9ea830aa9e00304aae18b0ba9e10302aae96300b9e28f07a9e49708a9e69f09a9ffd30879ff4b02f9e3930ca9e59b0da9e9fb00b9ea0", + "b10a9L8;FFe08f01f9f59301f9c0040054f7031faa79420091350080523a03178be8e30691400740a9a01d0094e8bb41b9a80c0037e88b41f9fb735ca9bf0208eb40010054BBL8;FF42ffffb042542c91e02700a9e3030091e00308aa15450194fd7b41a9ff830091c0035fd6ff4303d1fd7b07a9fc6f08a", + "9fa6709a9f85f0aa9f6570ba9f44f0ca9L8;FFa80302d1290000f029611f91e8a703a94800805289fdffb029211091eae30091a04700d1e8271ca948fdffd008251891e82b1ea90a078052c8048052ff2719a9L16;FFfe0310aaf00303aaf88f41a9e9df00f9ef3b40f9ed0317aaf57b40f9fc4340f9ee03", + "11aae96340f9e56f40f9f1031baafb0316aaf74f40f9f65b40f96c080014BBBL8;FFc96a0039e9fe60d3cc520079ac0356b8cdaa0039ad3356b8c97e0039a98356f8cc4600b9cd7204b8cb320079d7b201b8d9460429d0b202f8ce3203f8c9b203f8L8;FF61fe40f9810000b4600241f9220080527969009", + "460220091f30b40f9fd7bc2a8a1feff17f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9BL8;FFa10d0054e00313aa64f6ff9740010036410b00b5e0031faad3ffff17e003082ae20313aa430c805206f0ff97c0f9ffb4c3ffff17a80640f91a0101ebe2000054L8;ZDBBL8;FFe8030", + "3b928008052e8ef01f9080480520800ac72810101ade80b02f9e8430f91fff301f9e80302f9e90702f9ab270094a0420035fbef41f9e6f341f9e8430691L8;FF0081813c091500f9f44f45a9fb0b40f9f65744a9f85f43a9fa6742a9fd7bc6a8c0035fd6e00316aa91190094d90640f9ecffff17fd7bbba9", + "fa6701a9f85f02a9L16;FF0502805229f87fd33f1100f13481889ae30314aa0c000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9BBBBBBBL8;FB64202d3e2043743253616d706c6564000a4b6579206a756d703a20c003202d20c0001a53656e64", + "206b65792065706f6368206465637265617365642028c00420L8;FF0a0fc0daa9a33ba9a86300d109018052fb5f44a9a8a73ca908088052a08301d1a12301d162008052b9831df8a82b3ea9420a0094bc937aa9a82301d1e0031f2aBL8;FF0a088052f4031faaf5ff03a92911c0da490109cbea0080523f1", + "d00f129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f60300aaL8;FFa0031df841fdff9021602c9143fdff9063d42c91a0c300d1620380524401805230000014c80080d2a0831d38a0c300d10800f0f2bf931d38a8031df8d429ff97BBL8;FFe81b40f9f71b00b9f467192", + "9f32306a9f36307a9fc6308a9f66f0aa9fa6f0ba9a2280094170400b142330054b700f8b6fa031faae0031aaae10317aa065f0194L8;FFe20314aa9a020094760a40f9c1ffff17fd7bbda9f50b00f9f44f02a9fd03009148008052f40301aae10302aa000d002af30302aa39fcff97e00314aa6a170094BL", + "8;FF89000014e20313aa230c80520deaff97e10300aa210900b5a80640f91f011aeba9040054e00313aa5cf0ff976008003728fc60d3480600b5200840921f1800f1L8;ZDBBBL8;FB5807000005000000fa0840000000000029000000000000004e0100002d0000001d1c400000000000540000000000000", + "059000000050000001d1c400000000000L8;FF0825019108fd46d30900088b37050091ff0208ebc81d005420010014e11740f9e80f40f91f0101eba06c0054f50314aae81340f949068052b30e4bf809692138BL8;FFf34b40f9ff830291c0035fd620008052010480520fff0094fd7bbea9f44f01a9fd03", + "0091f40300aaf30308aa7503019400048052210080526e030194200100b4L8;ZFBBL8;FF42ffff9042b41d91ea0f00f9e3430091163f0194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000904a113f91e8a700a942ffff9042302f91L8;FF16feff97601a00b5a0f5ffb4a2ffff17898", + "244f83f0500b1810000549fde04a99f2e00f99f6200b91f0900f141180054e00313aae7feff97e0080036811400b5L16;FFea4300f9e92300f90a2554a9eaaf06a9e91f00f90a2555a9ea1b00f9e97b00f90a2556a9e9d300f90b2557a9ea2f0ca9e9ef00f90a2558a9e96f00f90b2559a9BBBBL8;FB5500", + "000000000000d601000019000000d3094000000000005500000000000000f601000021000000d30940000000000055000000000000000402000025000000L8;FF290d098b2925019129fd46d30801098b130500917f0209eb89190054088c45f81f0500b1c01400542a030094080040b20811c0da081540d", + "2080d088b08250191BL8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6e0fefff000403491220f0194e0fefff000202d911f0f0194L8;FF41050054e97342f90a0180d20a00f0f228dd78924c0140b228000014eabf40f9e97742f9f97b42f9e893", + "40f956fd60d3eaa340f93bfd60d3e9c700f93cfd78d3BBL8;FFe10319aae20315aaf60300aa81530194e00319aae10315aa2200805276530194e8230091e0820091fc4f0094f70f40f97701f8b6fa031faae0031aaae10317aaL8;FFe9cf02f9e8d302f975e3ff97a10353f8810000b4a08353f822008052", + "76530094f56340f9e8031691e00315aa594e0094a8624039f5c342f9f7c742f9e8631639L16;FF89feff9029e908918a0000102b7968784a090b8b40011fd62b0042a9291c40f9080340f92ab840a9e9ff00f9ebe700f91f0109eb0b008092e971005489008052BBBL8;FF0001198b837301942803178b68", + "0a00f9b6010034610a40f9680240f91f0101eb20310054680640f9090380522a040091e00316aa6a0a00f909692138e10313aaL8;FFead302f9450c0094fad342f9e8cb42f908011acb1f0308eb48360054e8cf42f9e10319aae20318aa00011a8b797300944803188be8d302f9f88b49f9580300b4BL8;F", + "Fb7031ff8140117eba3080054b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcb9f0208ebe8040054340100b4680640f9L8;FF440040f9800400f9440040a9040000f9607861f85f0000ebe0000054c0020e91e12a00915f7c00a9027861f8220100b57e00001440", + "0440f9607821f8f8ffff17BBL8;FF3f0700b16000005460c20091f40c0094e87349f9090d00913f0900f123c7ff54080141d2e90080521f2d00f10831899a1f2500f12823005429ffffd029f13f91L8;FF620a803d600600ade8034b391f1500714cfeff541f0d0071800600541f110071e00800541f1500", + "7101080054f46b41f9f36741f9880240f9680000b4e00313aaL16;FF950641f988e240f989d640f99c0a41f96083813ce12b803de86700f9e95b00f93502f8b6f9031faae00319aae10315aa09af0094d60900b472b30094e00316aaBBBBBL8;FB6572546578745f5832353531395f5348412d3235365f43", + "52595354414c532d4b594245522d313032346c656e67746820636865636b656420617420636f6e7374L8;FF28fc83523f0108eba228005400e4006fe8430391e00301ade00302ade00bc03de10fc03de213c03de317c03de343803de23f803de13b803de037803d08010191BL8;FFe20315aa89ffff97e00", + "3172ae80b40f9ff0202710801148b43f8ff54daffff17e083c03ce80f40f96002803d680a00f9f44f49a9f73b40f9f65748a9fd7b46a9L8;FF7d1b0094584900b4e00317aae10318aa45020014fbdcffb5eafeff17200740adbf0600b1385b42a9e00715ade00f0054fcdf00f93c1b40f9e077c03de8e34a", + "39BBL8;FFf30308aa082c40f9092040f90080c43c970280d2b86301d1a8031df8080180523f8100f11700f0f20083813c1fa004a91f2c00f9a1030054081c40f90b4840f9L8;FF61fdfff021203f910202805263fdfff063e03c9104028052c9000014c80080d2e0a33239e08332910800f0f2ffa73239e8", + "5306f9d661ff97e10300aae15306f9L16;FF1800001448008092680200f9ff830f91f44f42a9fc5741a9fd7bc3a8c0035fd6140700b4f50303aa76db0094e00314aa210080526fdb0094200900b4e10315aaBBBL8;FF62010054e80f41b2e80700f9e0230091df810094f44f4da9f6574ca9f85f4ba9fd7b", + "4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aaL8;FFe83349f94083c03ce93f49f91f0500b1e01b843de93b08f9e0110054e0abc43de1a7c43deac33391e2a3c43de95b49f94081883ce01bc43d4181873c4281863cBL8;FF29010b0b4a114c0bbf25007129c100110b819f1ad", + "f7d02710934003949c100110a819f1a0938003969010d0b4a114e0b29c10011cb0d00122c244039093c0039L8;FF20008052f7ffff17e00313aaf60301aae10315aae20314aa2cfeff97750a40f9e10316aae6ffff17280000d008f140f9680000b4e800f037c0035fd6fd7bbfa9BBL8;FF680a00b9e82f4", + "07969b200b86cf20078eca741a9a83b00796852017828008092aa1b00b9a9031ff8ab831f386a1201b86c7201f869f201f86b9e0039680200f9L8;FF483300f9400700ad430b803db7fdffb5f7031caa020000141901805268fa40f9fb5f40f91f0500b160020054690a42b9680e42b97c0241f9e9230429", + "681a42b9L16;FFe31fc23de18b14ade11bc23de203c23dea7202f8edbf43f9f9c343f9e9030caae48715ade107c23de8bb01f9e87344f9fec743f9f45300f9f4bb43f9eecf43f9BBBBL8;FB00de724e0d91c5d42c3f6555b2339157a68e00000000000000000d2a80a1c73402bc000000000000000000000", + "000000000000000000000000000fa9d698a1044L8;FFe0031aaa420080527b8b0094f41340f9f32f40f99f4200f1619eff5450000014ff0f00f915018052f63340f9f3031faaf52700f9e0430a91e10314aae20316aaBL8;FF06000014c80080d2fa4340f9fb8302910800f0f21c450091f5f742f9f4f342", + "f9150500b49642009177028052f8feffb018d3009106000014220080526e0b0194L8;FF140000f901fdfff021c00791130800b91f300039f44f41a9fd7bc2a8c0035fd600018052010280520a070094fd7bbea9f44f01a9fd030091f303012af40300aaBBL8;FFe0830091e1033291254701947d4b019400", + "04805221008052764b0194201800b4f60f40f9f40740f9f7830091e0a2c43de1a6c43d880216cb1f7d00f1000400adL8;FF000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff5480fdffd0002005912547009480fdffb00020209122470094fd7bbfa9fd030091082440f9L16;FFeb031ea", + "ae3e700f9e30311aafe030caaf04300f9f0031baafb0308aaf2ab00f9f80316aaea0314aaf56300f9ec031caae5d300f908008092f0e300f9e56f40f9BBBL8;FFfd7bbda9f50b00f9f44f02a9fd030091152040b9f40300aaf30308aa796b01940004805221008052726b0194600100b4800640ad0804805", + "2751a00b9680200a9L8;FF606a68f822008052f44f41a9fd7bc2a8796b0014f44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd03009114d440a9f30300aaf50300b496e20091BL8;FF880200f98082853ca18378ad8282843c8182803c8082813ccaffff17e08742ade00314aae21fc03de843", + "40f9a0873aade08740ada203973ca80318f8a08738adL8;FFdf010131ab03005433000014adc50351bf0900712d00805208060054df0101312e008052aa0300542d090091bf0101eb620400540d68ed38bf050131ac020054BBL8;FFf65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6ff4301d1", + "fd7b03a9f32300f9fdc300913f040071f30300aae10200542800805229ffffb029212b91L8;FFf65741a9fd7bc3a8c0035fd620008052e10313aa10270094ff8300d1fd7b01a9fd430091e80301aae00700f941fdffd021c0259144fdffd084402591e3230091L16;FF4a0500915f010cebcf194092ce1d0", + "013ef21cb9ae90109aa420c00546b1d0091eefeff375f00001448008052e91f80520840003909200039c0035fd63f050071BBBBBBL8;FB312e73656e645f656b2e726563762065706f636820c01b3a204b65797353616d706c6564202d3e2048656164657253656e74001b737071722076312e73656e64L8", + ";FF7c9f0094401c00b4f50300aa7d9f00944000805241008052769f0094801b00b4f70300aa779f00944000805241008052709f0094c01a00b4f80300aa719f0094BL8;FFe10313aae10700f901ffffd021a00f9103ffffd063881091e0230091a20080528401805269250094e00740f941feff17c80080d", + "20800f0f20809009147ffff17L8;FFfc6f4ba9fd7b4aa9ff030491c0035fd620fdfff000e031912c1b0094ff0303d1fd7b09a9f6570aa9f44f0ba9fd43029109504039a9050037011040b9155840a9BBL8;FF1f0100712801881a1f01186ba1040054084440f99f0208eb01020054540300b4134040f9f61", + "b40f9fa0300aa39008052f50314aac8164038691640381f01096bL8;FFe8f31639e8c31691eb7b40f9e9e302f9e99f40f9e8eb02f908018052e8f302f948c141393f0500b1f3db02f9ffef02f9ebab08a9e89f00b9eae702f9fff702f9L16;FF291540d2290d098b29250191891a498b29050091200108ab", + "02080054e10313aaefecff97560300b4610a40f9680240f9b70640f91f0101eb40080054680640f9BBBL8;ZBL8;FFa9bcff54e0630091e10318aae20316aa230080522400805255a3ff97f81740f9ddfdff17e06300912200805223008052240080524ea3ff97e11740f9e4fdff17BL8;FF03feff97c0fef", + "ff000e004912bfb0094fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd03009128400091f30303aaf70302aa08fddfc8f60301aaf40300aaL8;FF620028360004803d80009e3cc0035fd60004803d000001ad80003fadc0035fd6211c001203ec7c920000803d5f8002f12028407a41020054e5003bd5", + "a5104092BBL8;FF6b000054220080527b3f0194ff0600f1ab000054e03740f9e10317aa22008052753f01945f0700f12b010054e00315aae1031aaa220080526f3f019404000014L8;FFe8430f91e1031baafb5f00f920013fd6e8eb41f91f0d00b101070054e800805249010014f9030891ba0000b4e003", + "15aae1031aaa220080526f3f0094683642f9L16;FFff0900f1e17b0054e16740f9810000b4e00316aa2200805277bf00945c7900b4e05f40f9c5030014765f40f9df0600b1804b005468d340b91f010971204b0054BBBBL8;FBa28c30d697d90000aaed083d89a75e0f269acfa31bf933bbb8543cd276472", + "052e37c1b5470256922e6653d85e689d33a8fedd8868d89f5fd19435e27785ced96L8;FF006002912d8b0094e0fdfff000200c912a8b0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4311d1ff0300f9f80300aaf30308aaBL8;FFff2706f9ff530cb9ff2f06f9ff630cb91f", + "0800f1a12b0054a02302d19decff9700080036c1efffb4e5010014c01b00b5a02302d197ecff97c010003601efffb4L8;FFf44f42a9f65741a9fd7bc3a8c0035fd61fcc00a91f0000f9f44f42a9f65741a9fd7bc3a8c0035fd6d3d200a929008052c90200f9f44f42a9f65741a9fd7bc3a8BBL8;FFff6300", + "f9e08304ade02f803d28db77d3e08744ad80020191a14301d122008052080d18aaa0873dad080dc0dae86700f9e28345ada2833ead0a4b0194e8275a29L8;FF090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb492d0054080c47f81f0500b1802300546c0300940", + "80040b20811c0daL16;FFf27300f97a0e001408008092f5f316a9f57b40f9e87700f9ed074ba9e48f00f9e4ab40a9f61f14a9e7030baae8f347a9f60307aaf19700f9f10300aaf80316aaBBBL8;FFd4f4ff97400c00b5e9031faae00317aae30318aa69f4ffb48fffff17e00319aaf97d0094e30319aae80", + "300aae90301aae00318aa48f7073687ffff17c0000054L8;FFe0031faa090540f90a0140f9290100cb4a01008be0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9BL8;FFe01700f989ffff17c80080d20800f0f2080500d185ffff17c80080d2", + "0800f0f20809009181ffff17c80080d2e0a30039e08300910800f0f2ffa70039e81300f9L8;FF27804039e31000125f00036b4cffff54231840b96324c21ae3fe0737231c40b96324c21a83fe073723cc7492050000f0a5c041f9630040f97f0005ebc1fdff54BBL8;FFe8031faa000119ab62640054e143", + "1691310d0094f90b40f91f0700b1e00b0054e1d342f9e8cb42f91f0101eb00400054e8cf42f92a040091c022029149018052L8;FFfa0356b98100805200001891ff0316b9b9290094e0074091f70356b98100805200001891ff0316b9b3290094e0074091fb0356b98100805200001891ff0316b9L16;FF9", + "ffd0771cdfeff549f010b6b8d0100549f010d6b60feff541300001488050051f5031f2af60313aa1f090071030b00549f010471200500540b0000149f010871BBBBBL8;FBef104000000000004e00000000000000b904000017000000ef104000000000004e000000000000005707000005000000ef10400", + "0000000004e00000000000000L8;FF49090054091c40f93f0500b120060054096840b969070034290140b22911c0da291540d2290d098b2925019129fd46d3290500910a2440f9aa0600b44b0140b2BL8;FFe01e0054f30300aae00308aa22040094e80300aae00313aa090140b22911c0da291540d2290d", + "098b2925019129fd46d30801098b130500917f0209eb69240054L8;FFe0cf00b9a04700d1e1c4ff97e0cb00b9a04700d1dec4ff97e0c700b9a04700d1dbc4ff97e0c300b9a04700d1d8c4ff97e0bf00b9a04700d1d5c4ff97e0bb00b9BBL8;FF1f013a6b5c7f105353ff60d3e0179f1a59ff68d3eaa700a9", + "8f6c019408074039f703002a1f013b6be0179f1a8a6c0194080b4039fb02000a1f013c6be0179f1aL8;FF9f0f00b1e8a345b9e00718ade82303b9810d005448008092480300f971000014f46f41f9e8c31791e91f46b900c1c03c01c1c13cf5fb45b9880240f9f36b41f9L16;FF69fefff029810291e1a30", + "091e8a705a968feffb008811f91e8ab07a9ea08805288008052ffa702a969feffd029ed0691e9ab04a9290080d2a91ac0f2e8ff03a9BBBL8;FFe80300aae00301aaa8da0736adfeff17e00313aafc850094f70301aa20e5073657fbffb43a000014e00313aaf6850094e80300aae00301aac8f10736a0dff", + "fb4L8;FF350600b47622009104000014b50600f1d662009180050054c1825ff881ffffb4c00240f92200805273770094f8ffff17f37749f97f0600b140020054e18349f9BL8;FFe0edff5400200091f44f42a9f65741a9fd7bc3a86e000014e80300aa098d40f83f0500b1a0000054f30300aae00308aacb", + "020094e00313aa088c48f81f0500b1L8;FFf96b04a9390000b021231d91f35301a9f55b02a9f6188092c20200cbf76303a9f70300aa336041a9361040f9d60600d1002300d1d602028a381440f9f602168bBBL8;FFe01bc43de11fc43de0431691e8036179e143069102738052e057813de0fbc33de15b81", + "3de8e30a79e063813d79370194fc074091f94315919c8301919f0600b1L8;FFe04305f9e0032a9161fdffb021201391a201805223fdffd063c039910401805222000014c80080d2e0232a39e0032a910800f0f2ff272a39e84305f9d43dff97L16;FF7db70094f7031f2adf0600b1416aff54f57740f957d", + "f78b3795601a908008092770600f908f7ff172093c63ce8bf43f9f7c31591f4a35d39e082009101830091BBBBL8;FB6465725f726174636865745f6b657973656e6465725f726174636865745f6b65795f70726976617465636861696e5f6b65796d6573736167655f6b6579730000L8;FFe10316aa28880", + "0942e00805288070091d8020079db060079a80a00f9b0ffff17e00315aaa0ddff972e008052d2ffff17e00315aa9cddff97a80640f989070091BL8;FF62008052a82739a9e8feff9008411591fbc302f9f5cb02f9a8031af85fdcff97a10356f8810000b4a08356f82200805271070194e8031faa170100b", + "4e91740f9L8;FFe0031caa210080527a070094001500b4e12340f9e2031caaf60300aa7d070094a0a300d1e1031caa220080522300805224008052bcdb3da9bc831ef864e3ff97BBL8;FF081700d1b4831df805000014e80b41b2a0831df802000014081300d1a0c300d1a8031df8da4d0094f40300aaf5d", + "b44a9e11b40f9810000b4e01f40f922008052L8;FFe9079f1a818308ad0801094be99741b962c3883ce8e300b9e8cf40f9ead700b9e9bb00b9684308f87a43ff97fa0301aae106f8b6fb031faae0031baae1031aaaL16;FFe9ab03a929a855a9e81b00f9e97b00f929a056a9e9d300f9ea230ca929a857a9", + "e9ef00f929a058a9e96f00f9e85f00f929a059a9eaa30aa928e85aa9e9e300f9BBBL8;FFea1f4079eb834039ec1340f87f020039a91b00b969a200b8e92341a9aa3b00796b8200396c1200f86a1e0079692201a9fd7b43a9f32340f9ff430191c0035fd6L8;FF9f014871830700544d1dc039ae1d00128c5", + "50e0b8c0148518d00f83761710c8b0b018052140000148d7d1c53ad0600340d00be528d010d0b4c2180396b710d8bBL8;FFe1031faae3ffff17880240f91f0500b1c10000549f5e00a99f7e01a9977e02a9981a00f99f3200f9e10314aae20313aa27060094c00300b5e1031faad5ffff17L8;ZDBBL8;FFc", + "9ffffb029011f91e80302f9e8830a9100ffffd000281291e90702f92900009029610491e80b02f928ffff9008610891e90f02f949048052e82719a9e1031091L8;FF7d270094c1825ff8e1feffb4c00240f92200805278270094f3ffff17687a40f9c80000b40805088be00314aa0201805201ed7cd37027", + "0094745652a9350200b4L16;FFe833889a3f0314eb2a33949ab4835ff8ff0214ebe00314aae1038a9af303889af3b2ff97e00314aae10313aaf0b2ff97d90000b428e379d3e00314aa02018052BBBBBBBBL8;FB72676f2d6769742f737061727365706f73747175616e74756d726174636865742d6235386", + "43766353665333634356363642f303639353962342f7372632f6368L8;FFf70300aaa11240f9000400ad810000b4e00316aa2200805277a4009408048052b95240b9a85e02a9a81a00f975a4009400098052210080526ea40094200b00b4BL8;FF810000b4600640f9220080527a240194610e40f9810000", + "b4601240f92200805275240194611a40f9810000b4601e40f92200805270240194612640f9810000b4L8;FF20010054290440f90a050091206928382a0800f9f44f42a9fd7b41a9ffc30091c0035fd6f30300aae00301aaf40301aae10309aa220080522300805224008052BBL8;FFf40300aaf30308aa48", + "008052e0330091a31300d1e10314aa0204805224008052a8c31f388b140094882240b91f05003140010054e0c3c03ce1c3c13c08050011L8;FFe10308aa220080527b640094e10313aae81f40f9c80000b4e02340f9e10308aa2200805274640094e10313aae82b40f9c80000b4e02f40f9e10308aa22008", + "052BL8;FF63900291e0030091c20180528400805211000014c80080d2e0230039e00300910800f0f2ff270039e80300f9d8eaff97e80300aaa1feff9021c81191a3feff90L8;ZDBBBL8;FB3800000000000000e40100001a00000064656372797074696f6e206661696c6564436861696e73656e6465725f", + "726174636865745f6b657973656e6465725f72L8;FFf791ff979f0b00b1a1010054e083c13ce81740f96003803d680b00f9f44f48a9f65747a9f85f46a9fa6745a9fc6f44a9fd7b43a9ff430291c0035fd6880341d2BL8;FFe18352add51a40d20001168b08108052e20315aae1031aade08b53ade00b1ba", + "de08751ade00719ad08140038dd040194bf3e00f148020054e0075bada14302d1L8;ZFBBL8;FF62090054693a40f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab02080054699640f93f0500b1c00300546a4241b9L8;FF0a2500a9fd7b43a9ff030191c0035f", + "d63f2900f1880000544b01098b6bf1df388b0cf8374b05c0396c1d00128c6119538c01210b810102516b00f8374b008052L16;FF62008052f8eb01f9f80311aae9a703f9e9af03f9e8b303f9fec700f9eb5700f9e41300f9f4bb00f9f40305aaf5ef00f9f50307aae6e300f9ed7b00f9ebcaff97BBBBL8;F", + "B6e636f646572696478707473706f6c797341757468656e74696361746f726d61635f6b6579726563656976696e675f6864724865616465725265636569766564L8;FF08050091090c40f93f0500b1400400540a1440f9092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a", + "050091090100b42b0140b2BL8;FF6b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b29050091L8;FFd3050094f90300aaf60301aae8830891e043139101810091a44700d1e20319aae30316aa9ae9ff9", + "7e8d344b908540037e86f42f9f87342f9e8c700f9b60000b4BBL8;FF69b200b8e91340f9a83b0079a9031ff8e90f40f968520178a8035ff8697201f8691d001268f201f828008092aa1b00b9ab831f386cf200786a1201b8699e0039L8;FF601a00542083c33ce85f04f9e9671f91a80359f82183c43ce54", + "32591c082833c2083c63ca68302d1e87704f9e85b44f9a70302d1c082863c404fc03de203182aL16;FF611f009428c30091a02302d11b2d0094e0ffc23de103c33d19008092e207c33de0432d91e1431e91e02f823de00bc33de133823de1efc23de03b823de0f3c23dBBBL8;FF1481899ae30314aafd120", + "094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faa08700194e00741a906700194L8;FF01230491c4000014e8031faa00011aabe2650054e1431691400d0094df0600b18000005480220291e1431691351200943f0700b1f90b40f9e07aff5400c30391", + "BL8;FF14e0009104000014730600f194c20191c002005481825cf8810000b480025df82200805274f4009481025ef8810000b480825ef8220080526ff40094810240f9L8;FF000c40391f1c007221020054e103142ae00313aa24feff97f40300aaf30301aaa0221f914107009473fdffb48afdff97f5030", + "0aae10313aae00314aab30240b9BBL8;FFf63749f91f0101ebe0d50054e8cf42f9490180522a040091e0031aaa09692138e1431691ead302f92b120094fcd342f9e8cb42f908011ccb5f0308ebe8d40054L8;FF20008052210280521330009420008052a102805210300094ffc306d1fd7b15a9fc6f16a9f", + "a6717a9f85f18a9f65719a9f44f1aa9fd430591e18b00a9880000f0L16;FFa08739ad4083c63c4183c53ce313813de20f813df52342f9a203953c4283c43ce10302ad4083c33c4183c83ce84b00f9e00b01ad4083c93c4283c73ce18303adBBBBBL8;FB6c656e00000000000000000000000000000000000", + "00000000100000000000000f0ac410000000000000000000000000010000000000000000800000000000000L8;FFa083de3cd6060091a822179ba9835ff8aa060091df4200f10001803d090900f9ea0b00f9c0050054da4e179b590b40f935f77ed3390400b4729c0094e00315aaBL8;FF680640f9e10316", + "aae20315aa0001178b801c0194e802158b680a00f9951640f9550300b4610a40f9680240f9961240f91f0101eba00a0054680640f949048052L8;FFe03b813de037813ddec9ff97e9bf5339e84353390a088052e00740912a15003308111d1200401d91e8431339e8431391eabf1339e037c13de13bc13de", + "0d7853dBBL8;FF683340f960030191e10301912200805208050091683300f91258019408e37a92e0030191e20318aaa102088bf8ff013918088052775c0194e8ff4139e90740f9L8;FFb5f4ff97402f003728fc60d3c81400b5200840921f1800f102150054217c0353c11500343f040071200100543f080", + "07141fdff5401a30491a22302d1c8f3ff97L16;FF240080525a000094610a40f988ffff17f50300aae00313aa22008052230080522400805252000094610a40f9e00315aa8effff17e00313aa2200805223008052BBBL8;FFf40300aa750300b476c2009104000014b50600f1d6a20191c0020054c1025df", + "8810000b4c0825df822008052727c0194c1825ef8810000b4c0025ff822008052L8;FFe93709f9a9fdffd0294d279108c13591e94309f9290080d2e85f09f928038052091ac0f2ff3309f9e83b09f9ff3f09f9ea4709f9e85309f9e95709f927780094BL8;FF810000b4600640f9220080527afc0094e003", + "13aa010580520201805276fc0094a00640f9e10316aae20314aa1efd0094b40a00f9f44f43a9f70b40f9f65742a9L8;FFf65741a9fd7bc3a8c0035fd6e00313aaf60301aae10315aae20314aa2bffff97750a40f9e10316aaeeffff17fd7bbda9f65701a9f44f02a9fd030091140840f9BBL8;FFaa135538", + "ab235538e00740ad2901084a4a01084ae0c30291a9031538a93355386b01084aaa131538aa435538a1c302d1ab2315382901084aab535538a9331538L8;FFf86300f918ff60d37fc61339e94f40f9280080525f0d00b12801003901010054f55340f988008052a802003948008092880200f988008052730", + "70014e803172aL16;FFe092833ce8cf01f9391c0094efb343f9fa0315aaff0900f1c14c0054b60000b4e06740f9e10316aa2200805272bc0094e17740f9810000b4e05f40f922008052BBBBL8;FBa28c3854ed4511bf919500008f8136cdceac0dd8f12b1bcf3accca59fa96b5e019a5371ae52b637c2f06", + "76d13f9db4d4e9cd827c5878b5c585f3f833d6297543L8;FF297f890a6b7f8b0aaa7e8a0af69b40b90f020f4a2d7c8d0a8e7f8e0ad07e910ae901094a6a010a4a08010c4a29010d4a4a010e4a0801094a4901104a6a020013BL8;FF7d0c0194e0833291e1032d91022b8052800c0194e1fb42f9f39b45f93", + "f0400b100010054810000b4e0ff42f922008052710c0194e8c3179100810091f2e6ff97L8;FFcdffff1700fdffd000802d912b080094fd7bbea9f44f01a9fd030091f30301aaf40300aa770c00940003805201018052700c0094000100b401fdfff021400291BBL8;FFbc0000b481eb7bd3e00314aa02018", + "052794c0194f44f56a9f65755a9f85f54a9fa6753a9fc6f52a9fd7b51a9ffc30591c0035fd620008052e10315aa06480194L8;FFe10316aaeeffff17281040b96800c8376800d03741480014324800143348001409004039e80300aae00301aa2a0900d13f09007149819f9ae90000b43f0500f1L16;FFf1", + "1300f9f56300f9ef3b00f9f04300f9e61f00f9ea0700f9e5d300f9f3d2ff97e99759a9ea0740f9fb0f5ca9f04340f9ef3b40f9f56340f9edeb40f9e0bf40f9BBBL8;FFffc301d1fd7b02a9f91b00f9f85f04a9f65705a9f44f06a9fd830091f50300aa7c680094f30301aaa100f8b6f6031faae00316aae1", + "0313aa07680194f70300aaL8;FF03c1833ce80b40b9400504ad418147ade8a700b9e81340b9430905ade4838a3c8001803de8d302b9214b803dfafdff17080100b0081140f91f0900f123030054BL8;FF3f0800b1800100543f0400b140010054810000b4e09b40f92200805276ec0094e1a340f9810000b", + "4e0a740f92200805271ec0094e87b40f91f0500b120180054L8;FF60010054210000cbe00313aa632a40f922008052f30b40f9f00303aafd7bc2a800021fd61b000094ebffff17f30b40f9fd7bc2a8c0035fd6c0035fd6fd7bbea9BBL8;FF3128019420008052017880521228019420008052010880520f2", + "8019420008052010481520c280194200080520190805209280194200080520104805206280194L8;FF40fdffd0002021912c280094ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191350840f9fa0301aaf30300aa750500b4540740f9L16;FF7dac00947c008052e087c03d", + "88f242f8290080927c220039e07f803d88f200f8e07fc03d690200f96092803c680e00f9b80000b4e00315aae10318aa22008052BBBBBBL8;FB64206d6573736167652076657273696f6e203cc0013e0030696e76616c69642073656e646572206b65792073657373696f6e2077697468206469737472696", + "275L8;FF68034039e103142a1f050071c0fcff54fe060094f703002a08ffdf88c802003568034039a0024079e103132a1f050071e1f9ff54e2031f2aea06009408fc78d3BL8;FFaa000014e20313aa430c80528ff5ff97e10300aaa10a00b5680240f9080540f91f0119ebe9030054e00313aa99fdff97c0", + "09003728fc60d3a80600b520084092L8;FFfd7b4aa9ff430391c0035fd620fdfff000c030912d1c0094ff0306d1fd7b12a9fc6f13a9fa6714a9f85f15a9f65716a9f44f17a9fd83049109304039890d0037BBL8;FF14018052e0a30a91e1230091022a8052806001941f0700b1a0000054e0630591e1a30a", + "91022a80527a60019460820091e1630591022a8052755200a9776201a9L8;FF0a050039090900396a091b320a010039d6ffff170b7c1253ec0f80120a0900390c440c33090d00396a6d1c320a0100390c050039cdffff17f703002ae0230091L16;FFa80640f91f0116ebc9080054e00313aa62edff9760f", + "e073728fc60d3880800b5200840921f1800f1c2080054217c0353e10800343f080071ad0100543f0c0071BBBL8;FB636f72652f7372632f736c6963652f6d656d6368722e7273002f72757374632f3438613232396365616566643439383563353039393062313431313662366438L8;FFf81740f9e80f40", + "f9080118cbdf0208eb697aff54e0630091e10318aae20316aa230080522400805251a4ff97f81740f9cbfbff17f30300aae063009122008052BL8;FFd7feff97895a40a9ca02178b280117eb6a0200f9e2eeff54cdffff17c0feffd000e03d9128fc0094c0feffd000e03d9122fc0094c0feffd000403e91", + "1ffc0094L8;FFd30100b47f000094e00313aa2100805278000094400100b528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd620008052800600f9BBL8;FFa98313f8a90315f8a98316f8a90318f8a8831bf8201200541a210091b72303d1bc6303d13900805209000014e1f2", + "0191a22301d1c7c5ff97601700b5bc835bf8L8;FF6001c03d686641f96ba20d91699e01f9697e41f923008052616a41f9607641f90221039169ae01f9698241f96aa201f96a7a41f969b201f9698e41f96001803dL16;FF00a01e912dbc0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9f", + "d030091ff0324d1ff0300f9f30308aa090040f93f0900b18101005408008092BBBBL8;FBe28948c32841a4e766e6361ff6641a288f6aff8b89baf50c5e73e7750ec6d61d804728c505b6f24a3743000000f9690b4e804a58484b9385668f4c5814e2a74aL8;FFe8230091200440a9a9031ff8e9ffffd0297", + "11d91eaa300a9a84300d1e91700f9c2fdfff042882191e9a301a9e34300910e8c0094fd7b44a9ff430191c0035fd6BL8;FF1f7f07a9f6d705f9f6e305f9faeb05f9ffe705f9a88317f88a1000b5e0c3279101630091022880527a100194e0c32291e1c327910228805276100194e0c31d91L8;FFe8a701a9", + "87030094b70000b4e00316aae10317aa2200805277100094a0c300d1e103152a4f030094b5937da901fdfff021e83991a04301d122028052e30315aaBBL8;FF01230091022a8052825001943f0b00b1e0f7ff54e0430291e1830791022a80527c500194e83f40f91f0500b16010005415050091e0220091e", + "1430291022a8052L8;FF0811c0da081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8bL16;FFe80704f9e81740f9eb1f04f9e82304f9e82740f9f22704f9e82b04f9e80b40f9e35b04f9e82f04f9e83b40", + "f9e83304f9e84340f9e83704f9e82340f9e83b04f9BBBL8;FFfc210094e80b40b928020036e90b40f923000014f503042af70303aaf60300aa5f2800f1880000542800028b08f1df38e82df837e0230091ee210094e80b40b9L8;FFb90000b4e0031aaae10319aa2200805279700094e12740f9810000b4e", + "00315aa2200805274700094e12340f9810000b4e01f40f9220080526f700094ff830891BL8;FFc0035fd6ff8301d1fd7b03a9f65704a9f44f05a9fdc30091081c00121f09007181010054e00302aaf30302aaf40301aa5afdff9720020037750240f9a80640f9L8;FF00231f9149030094eaffff17c14240", + "79e0fcff9000e00b91212c46d304786178843c7cd3c20a40f9830014cb861000d1631000d142400091611e001265fc44d3BBL8;FF09fd46d30800098b080500911f0109eb4814005472000014fa031faaf9ab49f9f8074091188309913f0700b1a018005400c303912b1c0094080040b20811c0daL8;FF1f", + "050071a1070054e9030291e8074091e08326910801189121e50e91c72cff97e80356b9f9074bf9f80b4bf928030036281f00121f050071ec040054c8520035L16;FF09018052e28f03a9e0030091e163009162008052e8a702a948170094610a42a9e80314aaf39340a9e0031f2a2500805206048052e303", + "13aaf4ab0094e10340f9BBBBBL8;FB6402000013000000696e6465786b657950656e64696e675072654b65797072655f6b65795f69647369676e65645f7072655f6b65795f696474696d657374616dL8;FF4a0d0a8b4a25019129194a8b29050091280108ab22030054091440f9090100b42a0140b24a11c", + "0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abBL8;FF090840f9090300b40a0440f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191ad194e8bbf010ceb83050054L8;FFe0431391e10309aae9b700f9f4090094ec6b42f9ea6f42f9fb", + "7342f9e2eb44b99f0900b1010b0054e87b42f9e2c700f923fdffb063983d91f77f42f9e0431391BBL8;FF18540194e003009101031a8be20319aaf9ff00397f580194e00317aae10316aa2200805274580194e8ff4039f703082a08088052020117cbb60202ebe3f9ff54L8;FF680000b4e00313aa00013f", + "d6210740f981fcffb4220b40f9e00313aae0ffff17e8ef42f9c80000b40805088be00314aa0201805201ed7cd36f580094e9c31291L16;FF48008052a0a303d1a8131238b58311f8dfdeff97e10300aa54ffff17e0230b39e0030b91ff270b39f56301f9d8deff97e80300aae86301f981feffb0210c1291", + "BBBL8;FF2f000014e003082ae20313aae303152a02fbff97e0f6ffb4aaffff17e003082ae10314aae20313aabbfcff97603000b500f6ffb4a3ffff17898244f83f0500b1L8;FF7d780094a80600d11f0900b1e823931aa8000036e0031baae10315aa2200805275780094e13349f9f3074091738209913f0", + "400f18b000054e03749f922008052BL8;FF603640f901f97fd3420080527af80094683e40f9a80000b4604240f901f97fd34200805274f80094684a40f9a80000b4604e40f901f97fd3420080526ef80094L8;FFe10308aa5f0109eb4981899a0a0180523f2100f134818a9ae30314aa0b000094e80740f9", + "1f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191BBL8;FFe057813de15b813dbc010014f6c744f9e043169101230091027380527d380194f8031f2ab701001403e4006f0083c03c0183c13c0283c23cf6d344f9e0074091L8;FF80010054e0431a91e1431f910228805280380094e043", + "1591e1431a91022880527c380094ff0a00b181c9ff54a4010014fc032a912f010014c80080d2e14705f9L16;FFe00759ade86b40f969ba03a969ff60d3602e00f960c20891685201a968a20291000506ade20357ad69520678e9bb41f96d6602a9020104ade00758ad7e1a00f9BBBBL8;FB0b021b02ce014", + "6023b013602bb0000007b0000003c00c800e700a4002501660031003d00135a6852842b003b362c0b1640315f756f31061e110d0d0000000000L8;FFe80b00f980ffff17e82740f9a9e301d1ea1740f92001c03da98359f81f0500f14001803d490900f98b010054e02b40f901f97fd3420080526f880094", + "07000014BL8;FF8083cf3ce8f304f94003803d57000014f5c742f9f7cb42f99b0280d21b00f0f2e8a75139e8060036e14741f9a10600b4e04b41f9220080526f080194ffa71139L8;FF6901092bed379f1a7f250071eb031f2a080100544a0500d18dfe073605000014e9031f2a287d60d388550036eb031", + "f2a7f05007141300054ef2300f9fc031faaBBL8;FFe05b803de067803dffab1da9ea2701f9ea3f01f9e9d300f9a8831ff8b4835ff8820640f9620600b4810240f9200080398000f8b728040091490400d111000014L8;FFe8ab00f96082803c680e00f981480094e0430691e10315aa6ceefe97e00315aa2", + "9e3fe9728008092680200f9a6ffff17e85340b91f050071610f0054e043c73cL16;FFf9fb42a9e61f40f9ebb344a9f57b40f9e0bf46a9ed0740f9e56f40f9e45f40f9f03340f9eef347a9fadb4aa9e9474ca9f44b40f9e22f40f96d070014f7030caaBBBL8;FFff430191c0035fd688fffff008411791490", + "3805268a600a948008052680200b9f44f44a9f51b40f9fd7b42a9ff430191c0035fd688fffff0082112917f4a0039L8;FFe10314aa14640094a00100b4f50300aa7c680094e00315aa21008052f40315aa3600805273680094a0feffb4080740f9f50300aae00314aa0200001435008052BL8;FFa10c00b5", + "01f9ffb4bcffff17e20313aa430c80520befff97e10300aa40f8ffb4b6ffff17a80640f91a0101eb02010054a2000014e10314aae20313aa73f4ff97L8;ZDBBL8;FF41d6ff54f3feff178083c03ce8430f91000d803d888341f8e9035039e80b02f9e8430691a9090034e90310912a0100d04a2108911a03", + "80d200ffffb000901991L8;FF1e0000141f150071000200541f11007141040054280180d20800f0f217000014e00313aae5020094e80300aae8070036e00301aaf44f45a9f52340f9fd7b43a9L16;FFf80308aa3f090071a20700542a2f40a9e92f00b9295741a9aa031ff82a1b40f928e179d3ea0f00f92", + "a1f40f9081109cbea1300f9362b42a97401088bea0b00f9BBBBBBBL8;FB656164657252656365697665640038706f73742d7175616e74756d20726174636865743a206572726f72206372656174696e6720696e697469616c2041324220L8;FFe00317aae10316aa220080527aa2009460220091ff030e91", + "f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8d7a9ff1725feff90a5203691e123009162c20791BL8;FF61e10c8b2b0180520a0000144d254039bf0500f1c80100548c1900126ce10c8b81fd0daa3f000beb030500544b018052e0031faa4a010b8b29010bcb0a2500a9L8;FFa8c300d1e00315aae1031", + "6aa24b4fe97b9035df83f0b00b101080054a8e35d38a9c35d783a008052aa835db8ab735f38bcf35df82841082aa9f35ef8b6735ef8BBL8;FFf65755a9f85f54a9fa6753a9fc6f52a9fd7b51a9ffc3059177620114f44f56a9f65755a9f85f54a9fa6753a9fc6f52a9fd7b51a9ffc30591c0035fd6a0c300", + "d1L8;FF84620094c802148b680a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6e8031faab60a40f976f4ffb5b41640f9e803088b54f5ffb5e00308ab23f6ff54BL8;FF63141591e003009122028052a401805209000014e00300f9a1feff9021d01491a3feff9063300d91e003009122028052440", + "0805265e8ff97e10340f99fffff17L8;ZDBBBL8;FB2e01000005000000650d40000000000011000000000000004501000005000000650d40000000000011000000000000004a01000005000000650d400000000000L8;FF080500911f0109eb2815005423000014f7031faaf50314aab38e4df87f0600b18", + "0200054e00315aa2af2ff97080040b20811c0da081540d2080d088b08250191BL8;FF691a4039b502000a1f01096be0179f1a91170194881e4039691e4039aa02000ad6020a0a1f01096be0179f1a8a1701948822403969224039f503002a1f01096bL8;ZFBBL8;FF42ffffb042581d91ea0f00f9e343009", + "1163e0194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000904af13e91e8a700a942ffffb0425c1191L8;FF7248ff97e10740f9b1ffff17e80f41b2abffff17e80f41b2b9ffff17a0031df881fdff9021e4139183fdff9063341491a0c300d142018052e40080522c000014L16;FFe5b3", + "40f91f0900f1e5b300f9eabf00f9a92b0054880100900801159129038052e8ef01f968feff9008611d91e8a303f940feff90005c2091e8ab03f968feff90BBBBL8;FB950100001b0000003d0440000000000049000000000000006901000027000000617373657274696f6e206661696c65643a2065706f6", + "3685f7365637265742e65L8;FF020a0054390700f194c2019161feff54080317ab22070054c902158b080109ab62090054691640f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a250191BL8;FFf36b41f9c80240f9680000b4e00313aa00013fd6c10640f9810000b4c20a40f9e00313aa74120194", + "9f0a00b121010054e01bc13de11fc13db47e0853e88344b9L8;FF87000014e0d7c53de1dbc53de0431391e2dfc53de037813de13b813de23f813d62ebff97a90000140a0180d2e9675339e8031faa0a00f0f2eaaf00f906000014BBL8;FF0001168b83520194c802148be80f00f9e083c03ce80f40f92900", + "80926082803c680e00f9690200f9f44f46a9f91b40f9f65745a9f85f44a9fd7b42a9ffc30191L8;FFe10314aae20315aaf60300aa81520094571740f9570400b4541340f979520094e00317aa2100805272520094601500b4e10314aae20317aaf80300aa75520094L16;FF00d95aa9e03f00f900dd40f9e", + "03300f900e140f9e0f700f900e540f9e02f00f900e940f9a07a00543f050071a1200154890080520a008092790a00f969220039BBBL8;FFe00313aa220080522300805224008052e9fdff97610a40f95cfeff17e00313aae10317aae20315aa2300805224008052e1fdff97770a40f9680240f9080117cbL", + "8;FF9b110094e1d342f93efcff17e04316912200805296110094e1d342f955fcff17e04316912200805291110094e1d342f960fcff17e0431691220080528c110094BL8;FF13601932200100542a0440f91f1040f15369283808050091280800f94202005400fc47d36e000014e10300a9e00301aae10308", + "aa220080522300805224008052L8;FF1f0400b1a00e005402fe81d25aff4cd3631240f9c4020e914108d89a820600519c7e409343cf74b3631200f921040051830c40b93f00146b21b0821a63040011BBL8;FF40010054810000b4e08749f92200805279320194e18f49f9810000b4e09349f92200805274", + "320194b30000b4e07b49f9e10313aa220080526f320194f49f49f9L8;FF0800f0f21a017eb235000014b50000b4e00314aae10315aa2200805276320094080180d20800f0f21a0540b22c000014160180d21600f0f2150500b4e00314aaL16;FFe0030091e10319ad82b20094e8430691618207910232805", + "2008107917db2009488c20d91e0030091fb220094e0430691e10300910232805276b20094e1430691BBBBBL8;FB7320696e76616c69646e6f206b65792074797065206964656e7469666965720e626164206b65792074797065203cc3200080690400013e00696e76616c696420L8;FFe20000b4a80357f8", + "80030191e10319aa0801028ba80317f81296009488e27a9282164092a0c303d12103088ba2f31438789a0094f90b40f9b5c303d125000014BL8;FFfb0314aaa8031ef81100001436008052a9835ef8aa835ff868021c8b7b0700d15aa301919ca30191092900a9096501a9a9435fb8156502a9175103a917", + "6104a9L8;FFe02b813de0efc53de1db853de12f813de1e3c53de027813de00bc63de233813de2ebc53de11b813de107c63de013813de003c63de223813de2ffc53de10f813dBBL8;FFa8a73ca9b7031cf80a0c0036ea27412948bf70d3a00301d1f6030caa4941092a2a231caa08c11baab78209aa580108", + "aaf5030baa46deff97a88355b8a9c35578L8;FF69fdffd029a93791e85b04f9a80000d008611591e85f04f9e8c31691a04700d1e86304f9080000f008710891e86704f9e8c31d91e1833291e86b04f928feffd0L16;FFe0c3c03d0011803de0c7c03d0015803de0cbc03d0019803de0b3c03d0001803de0b", + "7c03d0005803de0bbc03d0009803d680700911b018052e8d300f9caffff17BBBL8;FFe80340b9c8000036e00740f9f44f44a9fd7b43a9ff430191c0035fd6e80b40f96a0640f9490108eb430200546a0240f9e00740f94801088b682600a9800200b9L8;FFe0bb843df41300f980020054e83b49f9080100", + "b4090140b22911c0da291540d2290d098b292501910819498b08050091e98792b969010034290140b22911c0daBL8;FF3fd5017141060054690640393fc90171e1050054690a40393fb9017181050054690e40393fe9007121050054691240393fd50171c1040054691640393fd50171L8;FF10785ed39f0", + "10f6a6d0150b2ae118b9a1f0068f2ce0147b2ad018e9a9f010f6aae118b9a1f0067f2ce014bb2ad018e9a8c010f6a0e9465d3ab118b9a8d01100aBBL8;FF291540d2290d098b2925019129fd46d32905009102000014e9031faa280108ab22040054097840b93f05007141010054097c40b9290140b22911", + "c0da291540d2L8;FF61000054e0e30e91afd8fe9708068052e9e341f90227c03da826089b008743ada9060091e0032a91000500ad0209803de9e701f9fb5f00f984f4ff97687a40f9L16;FFdf0500b1e00b0054eb831d91e9e343f98aa201916011c53cf7430d916281ce3ce9f200f8e91f5e396481cb3ce", + "0d7803d410146ade85744f9f40315aae6030991BBBBL8;FBbb10b000ad30a62097509c4081708a60e390e880f5b0fea0cfd0c4c0d9f0d2e076217d3160016b115a6151714c4147512ea125b13881339102e109f114c11fd1L8;FFe01700f9e01300b47e8a0094e00315aa41008052778a0094e01300f9201", + "300b4788a0094e00315aa41008052718a0094e00f00f9601200b4728a0094e00315aaBL8;FF0041c03ce183c13de8c31291e063813d01c18d3cc80080d20800f0f21c190091e14b41f9810000b4e04f41f922008052710a0194e89f40f91f0500b160000054L8;FFe10315aae20314aa0001168b810a0094", + "c802148be80f00f91b0200b4e10f40f9ea0740f95f0101ebc00d005428040091e90b40f92b0580524a0108cbe80f00f9BBL8;FF3b2340f9f54700f9fbfdffb528008052e82f00f9e10319aa294f41b9b5e301d1280c49f8f68700b9e95700b91f0500b1f85f07a9fa3700f900090054a0e301d1L8;FFfdc3", + "00913f040071f30300aae10200542800805289fdffd029212691ff2300a908048052a06300910800ac72e1630091a21b00b9e92302a9e8030091ff2301a9L16;FFe5d340f9f70740f9e70316aaee3740f9ed6340f9f4031baafecb40f9e44f40f9f19740f9f6bf40f9ec8740f9fbab40f9fab340f9e3e740", + "f9e84740f9e0b3c23dBBBL8;FF820d005433008052a00302d1e3830291e10315aa0204805224008052f38302398c1a0094776a01940004805221008052706a0194a03200b4600740adf40300aaL8;FF7d6a009468ae40f9a80000b460b240f901f97fd342008052776a009468ba40f9e80000b460be40f90", + "1f97fd342008052f30b40f9fd7bc2a86f6a0014f30b40f9BL8;FF0800f0f2ff270039e80300f9e0f0ff97e80300aae80300f9a1feffd0215c1091a3feffd063941091e0030091c20180526400805265f0ff97e10340f9e00301aaL8;FFe90300aa1f3d01383f4d0138e80300aae90300aa1f5d01383f6d01", + "38e80300aae90300aa1f7d01383f8d0138e80300aae90300aa1f9d01383fad0138e80300aaBBL8;FFf44f05a9fd030091ff0316d1f30300aae8430691e00301aaff0300f9fa03062af803052af60304aaf90303aae21b00f9f50301aab70302d1f4030591dcc2ff97L8;FFa1020191080102ab2935899ae8", + "2301f9e92701f914260094e003069141031b8be20316aaf6ff0739f6030691792a0094e8ff47391ffd007128010054e00743adL16;FFe123009116693538e90f00f940d2ff97e10f40f9e80740f9080101cb1f7d00f1c9020054e80b40f980a2c03c81a2c13c0801018b000500ad2880009105000014BBBB", + "BBL8;FB396366386336623562353537662f70726f73742d302e31342e342f7372632f656e636f64696e672f766172696e742e727300c00f204a756d70696e6720616865L8;FFf50300aa7f9e00940030805201018052789e0094001300b4f63300b908028052f60313aae85700a9ff2301a9c88640b8e07f", + "02a9a8080036fc031faaf7031faaBL8;FF35fcff97801a40b980010034610a40f9680240f91f0101ebe0050054680640f9090180522a0400916a0a00f909692138e10313aa28fcff97801e40b980010034L8;FFbbf37ba917008092e10740f9e01b803de00f803d610000b422008052761e0094e15740f98", + "10000b4e00315aa22008052711e0094e00b41ad28008052e107c03dBBL8;FFff0208eba002803da9031ef861000054e00313aa18590194740640f9d70000b4e806178b80620091e10314aa02f17dd31d5f0194a002c03da8035ef8e9060091L8;FF01818c3ce1e7c23d00818d3ce0d3c23d01818e3ce1d7c", + "23d0081893c01818a3ce92344a9fc7b06f9fa7f06f9e85306f9e95706f9e85b06f9e92347a9f98306f9L16;FF40030054680640f9090180522a0400916a0a00f909692138e10313aaf0ebff97818a40a940008052e30313aa38eaff97810a42a960008052e30313aaf44f42a9BBBL8;ZBL8;FFe82700f941", + "01005428008052ff0600f17f7e01a97f2200a9687e02a908008092681a00f98a15005449040014e807409180020291f507409108810991b5820991BL8;FF62010054a101f8b722008052f44f42a9fd7b41a9ffc3009177fe0014f44f42a9fd7b41a9ffc30091c0035fd6c0fefff00060039121fa0094c0fe", + "ffd000203d91L8;ZFBBL8;FFe10314aae00707ad0083c63ce20308ad15d3ff97600d00b4e88b40b9e9b348b8ea3b40b9e08744ad7b0200f968aa00b9eba3422969b20ab86901001260828c3cL8;FFe84745f9788242f9fa5f09a9f55300f9f74b45f9fa5745f9e84300f9e84f45f9757e42f9fba30ba9e85", + "345f9fb5b45f9e85b00f9080340f9680000b4e00315aaL16;FF70080014e9031faa08008092690600f9683601a90cfeff17f5031faadf0600b160000054e00317aa69c7ff9708008092750600f9686a01a903feff17e1e741f9BBBBL8;FB9c090000c890211f92fe5c1b8cafcb9aaf2a8825e1e1ddbeaf10", + "e5240eb2d30c7c1c68cf8a14d4c2dfa47d287026a4e47b400668764ed2aaa9eaaf82d9cc0b66L8;FF580100b47f8e0094e00318aa41008052788e0094fa0300aaf91700f9a06e00b4b90000b50c000014ff1700f95a008052390100b4e8031faa490b00916a7a6878BL8;FF63603d9104028052f50000144", + "8008052e0a33239e0833291e8a73239c80080d20800f0f2e85306f9d914009470000014e05306f9e0833291e1feff9021203f91L8;FFf40b40b91f0900b1c1030054e80f40f9160101f1e20400547a0e0094c001805221008052730e0094800800b408fdfff0083d3e91ca018052090140f90bfdfff0BBL8", + ";FF820000542800028b08f1df38680ef83728008039e800f8b72a00805208a800a91f0000f9fd7b44a9ff430191c0035fd62904c0392a1d00124a6119534801280bL8;FF0825019109fd46d30800098b080500911f0109eb880b00546d000014f30300aa1dfdff97e80300aae00313aa090140b22911c0da", + "291540d2290d098b29250191L16;FFe9231fa9e81342f9e90f42f9fb7742f9f47b42f9e37f42f9e8cf00f9e82342f9e78742f9ee8b42f9e28f42f9e4a342f9e89700f9e82742f9efaf42f9edbf42f9BBBL8;FF00010034808640a9e8330091966a0094f5334039bf0a0071e1000054e0031f2af44f44a9f6", + "5743a9fd7b42a9ff430191c0035fd6608640a9e8330091f45341f8L8;FF8031c03de8c302b98b4100f8204b803d8ac100f8204bc03de8d342b9c9fdffd029613c918101c03de01b40f92043813ce1031091e8a301b9e8b341b92007c03dBL8;FFc90080d2e0a30039480080520900f0f2e0830091e8a7003", + "9e91300f9dcf4ff9709000014e10740f9e10000b4e80b40f9f30300aa22008052e00308aa6eee0094L8;FF0020402a0a0400114001200a007c091b007c1b53404860380004005100741e530204001108d962783f0008eb69000054020c001100080011e7e00b91e0d86078BBL8;FFe8cb42f9f98749f91f0", + "101eba0360054e8cf42f9490480522a040091e00318aa09692138e1431691ead302f92a0c0094fad342f9e8cb42f908011acb1f0308ebL8;FFe1030054088341f80083c03ce983269100fdfff000383191e1432291e8db04f948ffff9008210891e84f04f9c8220091e06b823de94b04f9262a0094fb074b", + "f9L16;FF9f0600b160070054753240f9f60300aae003009156daff97688242f86082c13ce203c03d6102c03dd53200f9e82f00f9680a40f9e083843ce09340ade82300f9BBBBBL8;FB756e6b446174614465636f64696e674572726f720000000042024000000000006a00000000000000dc0000002e0000", + "0042024000000000006a00000000000000L8;FFe02fc03da2039a3cb5031bf80001178b08108052e21640d2a0873aadf81640d2a303973c08140038de9600941f1f00f1a8010054a0877aada10301d1e00314aaBL8;FF2e120194f3031faa080c47f81f0500b1e1e7ff54e8031faa080113ab2304005400f", + "fff900060319124120194f3031faa088c45f81f0500b181ebff54e8031faaL8;FFf60300aa0814003882160094e8830891e0431391a44700d101810091e20316aa23c480529aebff97e86b42f91f0500f1a10b0054e00316aa21c4805222008052BBL8;FFe83f40f9f41700f9f57308a9f54f09a9fa4f0aa", + "9e93300f9e9670ba9fb6300f9e0838c3ce86f00f931150094080400b142380054142400919f0208ebe3370054L8;FFe00314aa7c56009453010014fc831291e8db42f9f90316918043c03df7cf42f9fbc742f9f5cb42f9e0e31b9181e200910227805220af803de82304f975560094L16;FFe1030b91e9d3", + "45f9eab745f9e2031faae303152aa0039d3cf5431e91e10b17ade3c3803de98b01f98083803cea6f01f9e86301f900300094e8cb43f96083c03cBBBL8;FF550300b4610a40f9680240f9960640f91f0101eb80310054680640f9490180522a040091e00315aa6a0a00f909692138e10313aa5dfcff97770a", + "40f9680240f9L8;FFe1d342f9e8cb42f91f0101eb807d0054e8cf42f949048052f4074091948209910969213828040091f67749f9e8d302f9df0600b10026005480220291572b0094BL8;FF79fdff1761ce40f9810000b460d240f92200805278f6009461da40f9810000b460de40f92200805273f600946", + "0420091f30b40f9fd7bc2a8d4fdff1760220091L8;FFf51300f9622e4092150082d2600202cb01008052e3f6ff97130014cb7ffe3ff109030054f30300aa000440d1a40213cb650e7fa96202048b630005aa83feffb5BBL8;FFe9c706f9e25fc33de35bc33de163c33deaab06f9e053833de18b833de157c", + "33de287833de17f833de287c33dbf0600b1e07b833de07fc33df4179f1ae383833dL8;FFe84f03f9e8430e916afdffb04a211091e85303f9080000f008211f91e95f03f9e9431a91e85703f9e8431591a04700d1e85b03f968008052e1032a91e96f05f9L16;FFf85b44f9ea6344f9e9030daafa6b44f9ec", + "6f44f9ed7744f9e17344f9f14340f9f22b40f9e10b19aded7300f9ed6f40f9e0c7803df9bb48a9fe030daaf56b00f9BBBBL8;FB01000000000000002c67450000000000000000000000000001000000000000000100000000000000606445000000000000000000000000000000000000000000L8;FFe103", + "00910809c05a2909c05a9f9202f8882600294809c05a6b09c05a892a4a29882e0129220080529f1202f82809c05a4a09c05a892e4b29882a02292809c05aBL8;FF00c1ffb4e15744f9c1c0ffb4220080527906019403feff17c082c73ce8a344f94003803de8f304f9fefdff1748020090081140f91f0500", + "f149040054e12340f9L8;FF7d06009421835ff8e1feffb4200340f92200805278060094f3ffff17e81640f9c80000b40805088be00315aa0201805201ed7cd3700600945f1b00f160110054BBL8;FF00f6073647000014f8031faa45000014480b0091b8031df805000014e80b41b2a0031df80200001448", + "0f0091a0e300d1a8831cf8d64c0094f80300aa39000014L8;FFe0031faa32420094fd7bbda9f50b00f9f44f02a9fd03009108684539f30300aa1f110071cd0300541f150071400500541f190071000500541f1d0071c1070054L16;FFf94744f9e9cf00f9e9cf43f9e34b44f9ec4f44f9f15344f9f75744f", + "9e9c300f9e9d343f9fb5b44f9f66344f9ef6744f9ed6b44f9e9ab00f9e9db43f9fa6f44f9BBBL8;FF09f306f809810091e8a703a988ffffd008613e91e82700f908008012ea0300f90b7307f80af307f8e85300b97af7ff97e81340f91f0500b1c0000054e00bc03dL8;FFe10340a9ec0314aa2ba040a929", + "0040f90afc78d37369283808050091280800f98af3ffb4e8ffff17e10300a9e00301aae10309aa22008052f4030aaa8c050094BL8;FF72ecff97e00340f954ffff17c80080d20800f0f20809009146ffff17c90080d2e8230039480080520900f0f2e8270039e90300f9e8ffff17e00300f9a1feffb0L8;Z", + "DBBL8;FFb50600f1d6c2019140030054c1825cf83f0400b140010054810000b4c0025df82200805274260194c1025ef8810000b4c0825ef8220080526f260194c10240f9L8;FF610e40f9c10000b4601240f922008052f30b40f9fd7bc2a877260014f30b40f9fd7bc2a8c0035fd6ff8303d1fd7b0aa9f85", + "f0ba9f6570ca9f44f0da9fd830291L16;FF8082813c950a00f9991e00f9882608298a6a0929f44f51a9f65750a9f85f4fa9fa674ea9fc6f4da9fd7b4ca9ff830491c0035fd6ff0302d1fd7b03a9f92300f9" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines1 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines10.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines10.lean index 12d0ca57d..11fada0d5 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines10.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines10.lean @@ -27,358 +27,251 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub10 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF402a0054c906009129fd43d32af17dd3490109cb1f0549eb090200542a0500915f0108eb0895899a1f3d00f18210005409017d921f1100f18800805229210091L4;FFe10309aa220080522300805224008052f4030baa57000094e10340a9eb0314aa2aa040a9290040f90cfc6ad35369", - "283808050091280800f92cfbffb43f0108ebL8;FF3f0108eb63030054f50301aa3f0009eb69010054e10313aaf603022a22008052f40300aa50feff9788a640a9e203162ae00314aa3f0108eb23020054090040f9BBL4;FF130900f9191900b9cb02005473eb7bd306000014680700917b0700d1738200d1", - "1f451ff1e9010054946740a981830091e0031caae20313aa6b9f0194fb0a00f9L4;FFf96b04a92103005460c25f3862d25f3863e25f784410001280010034e30000343f000039007d20d4f55b42a9e00301aafd7bc5a8a2fdff1763825fb8e0ff9f52L8;FFe0030091a363009142008052a80f00f9c09f00", - "94810100d021001791a40100b084e00891a363009162018052b30f00f9b89f0094b89f0094fd7b41a9f31340f9BBBL4;FFe85341b9e86700b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eba3780054L4;FB2f7372632", - "f736c6963652f696e6465782e7273003e4e6f7420656e6f7567682062797465732072656d61696e696e6720696e2062756666657220746f20726561L8;FF009140f9e9d700f909ed40f9e03b00f900e952a93f0309ebe94b00f9e9979f1a29219f5ae04300f9009d40f9291d0072e03700f900a140f9e01f", - "00f900a540f9BL8;FF3f0400f18b000054600640f922008052735f0194610e40f9140080927f4a00b9740200f93f0400f17f5200b98b000054601240f922008052695f0194611a40f9L8;FF290500912001088be10313aa08fdff97f502003574040034610a40f9680240f91f0101eb60040054680640f92", - "a04009109028052e003142a09692138e10313aaBBBBL4;FFcd010deaa1feff54428c202e42a8302e4d00261e6d030037082100918001088b0c00098a42696cfc438c212e6d00669eadc101f221fdff54f4ffff17c80180d2L4;ZFL8;FF1f0048f1680a00f9a3fdff540b7c0e533f0108eb73611932200100", - "54536928380cfc5cd308050091290040f9280800f94c0200b500fc55d336000014e10300a9BL8;FF130040f9e00301aa010300d021e01d91e803009102028052bd7f019468620091010300d021082991040300d084e01291e0030091a363009122018052a80f00f9L8;FF080040b20811c0da081540d2080", - "d088b0825019108fd46d30900088b37050091ff0208eb482f0054e1010014e11740f9e80f40f91f0101eb807f0054e81340f9BBBL4;FFa8a300d10a960094a8835d381f050071e0040054480340b9493340b8a0a301d12a034238e10314aaa88319b8288341f8c9b20cb8a92f7ea9aa031c38a8831bf8L4;", - "FB447c4900000000002d0000000000000060000000220000006d697373696e67207071207072652d6b65792049446d697373696e67207071206369706865727465L8;FFe0030091e2031aad7dbf0094e843069161420891023280520041089178bf009488820e91e0030091d7320094e0430691e10300910", - "232805271bf0094e1430691BL8;FFe0230091e1031faa76ffff97a9ffff17ff0306d1fd7b14a9fcab00f9f65716a9f44f17a9fd030591e10b00a9080300d0e40b00f908b140f91f0900f1830b0054L8;FF8c0102518d00f83761710c8bcb008052280000149f114071630800544d19c039ae1d00128c390e", - "0b8c1140518d00f83761710c8beb0080521e0000149f014871BBBBBL4;FF63902c91a0c300d142018052440180521b000014a0031df8210400d021682c91230400d063c02991a0c300d142018052a400805212000014a0031df8210400d0L4;FFe103142ae40318aa770a0094e00b409161e20191e343139", - "100c00e91e203142a40040094e8db51f91f0900b1414f0054e00b409161620491e443139100c00e91L8;FFaab301b8a81b40b9e007803de81302b8ea2700b969faff97810240f9c10100b4e00313aa22008052f44f45a9f52340f9fd7b43a9ff830191690f0114e003c03dBL8;FFa0e301d1f70600d138a0", - "01917c03148b6e010094a08641ad94a20191a216c03da30ac03de10318aaa8835ef8808701ada083d83ca183d93c8217803d800700adL8;FFf50b00f9f44f02a9fd03009108d040a9f30300aa1f7c01a9940100b41521009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f92200805", - "2BBBL4;FFc0035fd6fd7bbea9f30b00f9fd030091f30308aa6ecf019400468052010180526ccf0194e00000b4a8008052680200a97f7e01a9f30b40f9fd7bc2a8c0035fd6L4;FB834dd1b69274d4bb3dd70e6bafeddac63c9ea28cdccbe93f5c86428b000059c77297db5b51cf7f991010f80785b478104c", - "3b620b8b914040e01f50052680a7bbL8;FFf86305f9fc0310aae9a703f9e9af03f9e8b303f9c2c8ff97e31340f9f0031caae2031baae8f341f909008092f7f300f9facf00f9e0c7c33de1f7c03de82b01f9BL8;FFa06300910800ac72e1630091a21b00b9e92302a9e8030091ff2301a9c4c0ff974003003", - "5e003c03de80b40f96002803d680a00f9fd7b43a9f32340f9ff430191L8;FF2083ce3c21f18f3ce9270d912183c73c22f18f3ce9670d912283c93c20f18f3c2083c83ce9a70b9121f18f3ce9e70b912183c33c20f18f3c2083ca3ce9270c91BBBBL4;FF008501ad020041ad028102ad600540ad000500ad0", - "92902a9f44f42a9f65741a9fd7bc3a8c0035fd6f403012af60308aaf50300aa7bef0194e80316aae90300aaL4;FB365f4352595354414c532d4b594245522d313032346c656e67746820636865636b656420617420636f6e737472756374696f6e0000000000ea98480000000000L8;FFfa6744a9fd7b43a", - "9ff030291c0035fd6370080521800809219018052a80640f91f0116eb09100054e00313aa28efff97e80300aae00301aae8fd073708fc60d3BL8;FF21401891a32300d102018052e40314aaa8831ff8bf6f019468620091e10200d021a01d91040300b084201e91a32300d102028052a8831ff8b66f01946", - "8e20091L8;FFf87f49f9b80300b4e1d342f9e8cb42f9f97b49f91f0101eb40440054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9fd0c0094fad342f9BBBL4;FFf001c0da1012c0dad00d508b10020b8a10fe0d9b9001108b118256b85f01116b60010054f00500d10f020feaa1fe", - "ff54428c202e42a8302e4f00261e0f040037L4;FFe1031f2ae20313aade110094e00314aaf44f42a9fd7b41a9ffc30091c0035fd6c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091L8;FFff7f0ba9ff7f0ea9ff7f11a9ff7f14a9ff7f17a9e8cb00f9ff630639012b009460", - "864cad68620791765e5ca9626ec03d61ea40f9000700ad0001c03d68f640f9BL8;FFe1d3c23de9c31291e8ab45f9fc5b02f9e037813d2181803ce86702f906000014c80080d2fa4340f9fb8302910800f0f21c450091f5f742f9f4f342f9150500b4L8;FF7a0080520800001400010039d502158be003019", - "1b50318f8842f00941f040031400700541f0002716200005436008052070000141f0020716200005456008052BBBBBBL4;FFfd7bc2a8c0035fd6fd7bbea9f44f01a9fd03009108e040391f0d0071a101005413d042a9880240f9680000b4e00313aa00013fd6810640f9c10000b4820a40f9L4;FFe143813", - "da2170094e037c13de13bc13da04700d1e243c13de00711ade03fc13de00b12ad9fc9ff97fa03002ae0431391e10319aa7a0e0094a10000d021a03191L8;FFe10313aa83170194fd7bbda9f65701a9f44f02a9fd030091f30301aaf40308aa810100b4f60300aa69170194e00313aa2100805267170194c0", - "0200b4e10316aaBBL4;FFbfe339a9bf831af8e1420291a2e300d13e81ff97a0edffb4b2000014bf6332a9bf0313f8e1620091a2e300d13781ff97c0ecffb48d000014bf6338a9bf0319f8L4;ZBL8;FFfc0b40f9f65743a9f85f42a9fd7bc5a8c0035fd6e00301aa810100f021241991a2018052ac970014f", - "fc300d1fd7b01a9f31300f9fd430091e90301aaf30300aaBBBL4;FFa8031fb83dd1ff97fd7b46a9f33b40f9ff030291c0035fd6ff4302d1fd7b03a9fb2300f9fa6705a9f85f06a9f65707a9f44f08a9fdc30091f40300aae00304aaL4;FB6372617465732e696f2d31393439636638633662356235353766", - "2f686b64662d302e31332e302f7372632f686d61635f696d706c2e72730012506f6c796e6f6dL8;FF0802009008c12591e8a303f929038052e00100f000e43991e8ab03f90802009008412991e1430f9162008052e8b303f9e80303aae3031d91e9a703f9e9af03f9BL8;FF4a090b8b40011fd6f37749f97", - "f0600b1e0020054e18f49f93f0400b140010054810000b4e09349f9220080526c570194e19b49f9810000b4e09f49f922008052L8;FF002c00b5e1031faae7ffff173f0c0071800300543f10007121010054602e00b5a02302d171f4ff97e80301aaa0030036c82e00b5e1031faadbffff17a22302d1BBBB", - "L4;FFe00743ad882a00f9280080528212803d800600ad68720039f44f4fa9f76b40f9f6574ea9fd7b4ca9ff030491c0035fd6000180520102805281f70194000400b0L4;FB6c696e75782d676e752f72656c656173652f6275696c642f6c69627369676e616c2d70726f746f636f6c2d6134346366356131", - "64633062366666632f6f75742fL8;FFe10300aae00301aaf44f47a9f92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd637008052180080921901805206000014e20313aa430c8052cef0ff97BL8;FF08008092686e00a957000014080080927b0600f94e000014b82303d1abab74a9081340b8a9c", - "353b8ac035438e88b00b9a8835538ea3b00f9ea4740b9e9b308b8L8;FFf6b345f9002300910881099171baff97e1074091e0431691024280522180099177770094e01fc53de123c53db8008052e82369795401805215008092e057813dBBBL4;FF3500805273b7019400ffffb4e92340b9680080527f0600", - "b1f48302a90811092a08000039400d0054680240b20811c0da081540d2080d088b08250191681a488bL4;ZDL8;FFdf0e007141030054bf0208ebe0030054760080521f000014b6010034df060071e1010054bf0208eb000300543600805218000014df16007141020054bf0208ebBL8;FF83000054100000", - "14e80308abc2010054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8L8;FF010600546a008052686209916b620a91ea730e396a2647a90001c03d081140b9fb4700f9fb830d91ffdf01f9e9cb01f9e9730e916001803deb0313aa6", - "8aa02b9BBBBBL4;FF09000014e00700f92104009021d429912304009063302a91e0230091a201805224028052a1fc0094e90740f928ffff17e0230091e8a700a993e40094e00316aaL4;FFf44f41a9fd7bc2a8c0035fd600018052010380528a070094fd7bbda9f50b00f9f44f02a9fd030091f30302aaf4", - "0301aaf50300aa660700940004805201018052L8;FFa9200091410200f021901691a9831ff8430200f063b81691460200f0c6c01591a52300d1e00308aa4201805264008052c0070194fd7b42a9ffc30091c0035fd6BL8;FF12000014e80316ab83fdff542003009000c01c9175870194e9031faa2700001", - "4e9031faa6a8640f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b250191L8;FF800f00b4f80300aa71870094e00315aa410080526f870094c00e00b4f90300aa6b870094e00315aa4100805269870094000e00b4fa0300aa65870094e00315aaBBBL4;FFa103009021242891a303009063402891e0", - "030291e2008052c4008052a3bc0094fa4340f9810350a94a0080d298e751a90a00f0f2965f53a95a0200b43f0400f1L4;FB61696c656420746f20646563727970743a20c0002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d6235386437663536L8;FF21008052", - "73c7009440af00b4e16740f9e2031baae04700f979c700940300001428008052e84700f9fb6b40f9b80000b4e0031aaae10318aa2200805268c70094BL8;FFff0208eb09010054e0e30091e10317aa2200805254260094f42344a91f0114eb23100054e81f40f9e10315aae20317aa0001148b72470194e9", - "0344a9080009ebL8;FF08fd46d308050091091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b4BBBBL4;FF5f0308ebe0080054381f40f9da0000b4080d805200a30191e10318aa427f089b71e70194080480525f3f", - "1ff11f4f00a91f2304a9142305a9480700911f7f01a9L4;FB080000000000000044ab40000000000062a2480000000000720000000000000030000000260000004f9d48000000000075000000000000007a00000026000000L8;FF37010014603a00b5a0c303d130e7ff97e80301aac0080036883a00b5e1", - "031faa9effff17003500b5a0c303d128e7ff97e80301aa20080036283500b5e1031faaBL8;FF2200805276670194e00316aae10315aaf44f52a9f65751a9fc5f50a9fd7b4fa9ffc30491c0035fd66d67019436008052e02300918750ff9713feffb5f3ffff17L8;FF20008052e1028052826700944201009", - "042c02991e0031faa93670094fd7bbca9f70b00f9f65702a9f44f03a9fd030091150040f9bf0600b1a005005414d840a9BBBL4;FF28008052e276c03de36ac03df8030491e0030491a1c302d1e2830191e00608ade0064bade24a803de256c03d030c8052e33e803d19030191e08605ade1024cadL4;FF46", - "1000f9e8ffff17200000b000c0099171ffff974cffff976000f837fd7bc1a8c0035fd6000080d21f000039007d20d440d03bd5009002d1c0035fd6c0035fd6L8;FFe28747ade01bc03da28739ad8003883ca8f35438e18346ad1f7d0071a18338ade8050054ea0f40f9a902088b08011b32b7c303d1b3c30", - "3d1400540ad200500adBL8;FFe1030091e00b803de92b01a9a3270194fd7b44a9f32b40f9ff830191c0035fd6f30308aa28008052890200b029013e91ff2302a9080480520800ac7200040091L8;FFf60300aa7e270094571740f9570400b4541340f96e270094e00317aa210080526c270094601500b4e1", - "0314aae20317aaf80300aa72270094482740f91f0500b1BBBBBBBL4;FF0801c0da0811c0da08fd43d3dcffff17220000d042601191e1a30091030a80528477009414008092e00314aaf44f4aa9f65749a9f85f48a9fa6747a9fc6f46a9L4;FFf60f49a9a0a301d1e10315aae20316aaf6100094b9df79a9b", - "8d77aa93f0b00b161050054750600b4a0a301d1e10318aae20315aacf120094bae779a96083c23cL8;FFc9fe7bd3a90000b5f716168b10000014f30315aa11000014f80308aa6c1b019400058052010180526a1b0194400200b4e81242d3155000a9f70300aa152001a9BBL4;FF7b031e4afe8740b9fba21", - "e38fbd25e3808011e4afe9340b9e8b21e38e8e25e389c031e4afe9740b9fcc21e38fcf25e387b031e4afe9b40b9fbd21e38fb025f38L4;ZFL8;FF091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b250191291", - "94b8bBBBL4;FFd6c20091e10b40913b0080529aff4439c002029121c0009122008052e047803de02f883d000941ade133883dc81f80520883313908008092e043803de037883dL4;FB080000000000000004594400000000006c656e6774682064656c696d697465722065786365656473206d6178696d75", - "6d207573697a652076616c7565696e7661L8;FFf1031baafb0308aae8030eaaee0312aa9e0d0014092340393f150071a1bf0054e0031d91e10308aa026e805274db0094e0430f91e1031d91032b0091e20319aaBL8;FFaf000014e8074091f68f45f90023009108810991f4074091948209916ea40094e10", - "74091e04316910239805221800991735b019488220791d800805294018052L8;FFd40a40f9e00313aaa81b00b9e8430191c983fe97e82b40f91f0500b1c0000054e017c03de83340f9e00f803de82300f90c000014e8a745a9200100b000801d91BBBBL4;FFfc6f09a9fa670aa9f85f0ba9f6570ca9f44f0", - "da9fd03029109804039490c0037155c40a9f40308aa0004c03df30300aa1b008092a80e40f9e01b803dfb5f04a9L4;FB722e72730076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f7365616c65645f73656e6465722e7273002b73656e646572L8;FFfd030091ff4", - "30bd1081c00121f09007181010054e00302aaf30302aaf40301aa2bfbff97200200377a0240f9480740f91c0101ebc2020054e80f41b207000014BL8;FF777b0194610e40f914008092740200f93f0400f18b000054601240f9220080526f7b0194611a40f9740e00f93f0400f18b000054601e40f922008", - "052687b0194L8;FF2892ff97e11740f924fbff17e06300912200805223008052240080522192ff97e11740f9edfbff17e06300912200805223008052240080521a92ff97e11740f9BBBL4;FF880100b40ba444a92a0c40f940010bcb1f0009eb68010054080008ab01319fda3f0009eba8010054fd7bc1a8", - "c0035fd6e1031faae0031faafd7bc1a8c0035fd6L4;ZBL8;FFa22700d1c102805285bb0094e083009102108052230080522400805221d2ff97e11b40f9a0ffff17c00100f000a03091c30100b063602291c40100f084003191BL8;FF39010014002000918903009424000014e80300aa098d40f83f0500b1", - "e01e0054f30300aae00308aa22040094e80300aae00313aa090140b22911c0da291540d2L8;FFe8eb43b9fbff41f975ce41f9e85b00f9e8ef43b9e84f00f9280340f9680000b4e00315aa00013fd6210740f9810000b4220b40f9e00315aa693b0094df0a00b1BBBBBL4;FFc80240b20811c0da081540d20", - "80d088b0825019108fd46d308050091f50100b4a90240b22911c0da291540d2290d098b29250191a91a498b290500912001088bL4;FFe00315aa22008052750b009428008092680200f9f44f4ea9f76340f9f6574da9fd7b4ba9ffc30391c0035fd6a0877dad680200f9a8835ff86082803c6182813cL8;F", - "Fe00308aae96300396cf6ff97f44f45a9fd7b44a9ff830191c0035fd6e00313aaf6ffff174900805281048052e00313aae80314aaf1ffff17ff8300d1fd7b01a9BL8;FFf30300aa1f0109eb000900540961009100e4006f0aa140a9290000f9e9430591ea2314a92a210591280080524001803d0a008092f", - "f2315a92081823ce8bb00f9L8;FF3f8700f1330080528c0d00543f1700f1801800543f7b00f1c1130054f70314aa6b8b0094005a805201018052698b0094207300b4f30300aaf4031faac8038052BBBL4;FFf60313aaf30300aa71cb0194e0031baa210080523a0080526ecb019400fdffb4e10317aae203", - "1baaf50300aa74cb0194e00313aaf30316aaf6031caafc0318aaL4;FB0800000000000000080000000000000020f4450000000000000000000000000008000000000000000800000000000000540c460000000000496e646578206465L8;FFe8e35539fac301f9e0071ead6113c13c6083c73ce8230e3968", - "1340f9e192833c6183c33ce9cb41f9e2031fad6083c23ce8cf01f93f8120f1e0071dade1040054BL8;FFc80200b008c13f9142008052e8db00f966fcff970a0380d2c80200d008a90091690480520a00f0f2e8a716a95a1100d1e10740f9a1e6ffb59efdff17c00200d0L8;FF000100d000801291784b009", - "4000100b000e03291754b0094fd7bbfa9fd030091083040b9c8030034080140b20811c0da081540d2080d088b0825019108fd46d3BBBBL4;FF000540adfb0301aa3ff401f1f3430291ff7f15a9ff230179e18302ade08708ad020141ade08b01ade28309ad080b005460027fb2e1031aaae2031baa70eb01", - "94L4;FB696420616e64206b796265725f636970686572746578742063616e2062652070726573656e740000000000000000000008000000000000000800000000000000L8;FF080d088b0825019108fd46d308050091b60a40f9f60b00b4c90240b22911c0da291540d2290d098b29250191c91a498b2905", - "0091b41640f92801088b140b00b4BL8;FF21483191e30200b063082991a0831cf8a0e300d1820380522401805214000014fa0300aa14000014a0831cf8e10200b021483191e30200b063b83191a0e300d1L8;FFe9cdad7208080079c8008052090000b9680200a9680a00f9fd7b43a9f32340f9ff430191c", - "0035fd6400100d000401191430100d063e00591440100d084201291BBBL4;FF7fab0194e83340f980030191e10300912200805208050091e83300f9a3ab0194ffff0039f50316aaf40318aaa2fe46d3b6e27a92b5164092e20000b4e83340f9L4;FF0b118b9a5f01096a700170b2a8058d9a1f005cf26dfe", - "56d30f159f9a4801096ae9119f9a5f010e6a0efc4ad30b128b9a5f010d6a6f1605536d0141b28e010e0aL8;FFe1830791023080527dab0094e8031faae7ffff17a20100d042000291e00308aae10315aa73ab0094400080524100805278ab009440008052e10315aa75ab0094BL8;FF00182d91e8d302f98", - "80200d008410591e1031691a30302d1a82738a962008052a82739a9880200d008c10f91fbc302f9f5cb02f9a8031af846dcff97a10356f8L8;FFe10318aa22008052a8031ef8742b0094090000141f090071814e0054090180d208df78920900f0f23a0140b274020014ba031ef8f7030291fb1b42f9f63b", - "00f9BBBBBBL4;FF93611932a00300540cfc6ad35369283808050091280800f92c0500b5e0030baa3f0108eb20010054290440f90a050091206928382a0800f9f44f42a9fd7b41a9L4;FFec6b42f9e96f42f9fa7342f9e27742f99f0900b101400054e0431391e1031aaaf7a714a9dc090094ec6b42f9ea6f", - "42f9e97342f9f7eb44b99f0900b181440054L8;FF09008012090100b90041803cc0035fd629008052010500f9090100b9c0035fd63f4000f181040054090c40390a0840390b0440390c3c40390911003909004039BBL4;FFe0230091e10315aae20316aa23008052240080528686ff97f45741a9fa0740f9", - "40ffff17e0230091e10315aae20317aa23008052240080527d86ff97f45741a9L4;ZDL8;FFf8031faaf90317aae00314aa3cf7ff97080040b20811c0da081540d2080d088b08250191081848abe2090054180118ab020a0054390700f194c2019161feff54BBBL4;FFe2028052640280521e000014880080", - "d20800f0f208050091e81300f9e083009160c90094e01300f9a10300f021982a91a30300f063a01d91e0830091e2028052L4;FB000073e8ba087ac2f787053e2cb4db17ce5f367c4c39ce7f02652f7fb7283c33ce9512f89694325003279672ecea93c86f09e89cfeff95cf179603b10000a1b2L8;FFeb03", - "0daaed0317aaf7ef49a9faa700f9fa0316aaf60304aaf44b40f9fe0303aae31340f9e45f40f9ee030faaef3b40f9e0f3803dea0307aae70312aa93050014BL8;FFed1a0094e1431691210d0094e0a749f9800100b4e1d342f9e8cb42f91f0101eb20460054e8cf42f9090180522a04009109692138e14316", - "91ead302f9140d0094L8;FFe16f01f9290c40f9e1830b9120013fd6fcfb42f99f0f00b1c106005488008052f46f41f9e8230b3949008092f36b41f9490300f9880240f9680000b4e00313aaBBBBL4;FFe9430191a20301d1e003082a217100914ddeff97601200b5b7035cf8fb0317aa628f40f8e20b00b4", - "e10240f9200080398000f8b728040091490400d111000014L4;FB75697265646b796265725f7072655f6b65795f6964206973207265717569726564000000000000006b796265725f7072655f6b65795f7075626c696320697320L8;FFe00300910800f0f2ff270039e80300f964e9ff97e80300aae80300", - "f9210200f021c81b91230200f063481491e003009142018052a40080529ce8ff97e10340f9BL8;FF777301949f0600f1ab000054e00315aae10314aa2200805271730194e00316aa1b5cff977f6600a960ffff17f85b47a91f0b00b140ffff54e1df48a91f0700b1L8;FFe08749f92200805275730094e80", - "740910881099100c10391010c00940ffeff17880241d2e90080521f2d00f10831899a490100d029993e918a0000102b796878BBBL4;FF682200f9f44f5aa9f65759a9fc5f58a9fd7b57a9ffc30691c0035fd620008052010280527bb30194200080520104805278b30194fd7bbaa9fc6f01a9fa6702a9L4;", - "ZBL8;FF290308eb00feff5408011b8bf50302aaf80300aa1f0103ebea33839a08010acb1f0103ebea33839a08010acb6a0008cb37010aeb69000054e90303aa03000014BL8;FF8b6aff977affff17e81f46f91f0500b1e1000054ff1f06f9f62306f9ff2706f9ff530cb9ff2f06f9ff630cb91f0800f1a12", - "b0054a02302d184ecff9700080036L8;FFe100009021843d9102028052e30000b063600591a4028052fe000014e04305f9e0032a91e100009021843d9102028052e300009063043e9104028052f5000014BBBBBL4;FFe8a701a9484c402982008052a81f00b912890094e0230091a173009182008052b31f", - "00b90d890094e8a743a9eaaf41a928e108aae9b340a90b010bca4901098bL4;FFf503152ab70000b4e1ee7cd3e00314aa0201805272030094280341d23f0300f114459f9a9f0600f1280100542900805228008052fb031faaf7031faaff2706a9L8;FF60da40f9220080527503019461e240f9810000b460", - "e640f9220080527003019461ee40f9810000b460f240f9220080526b03019461fa40f9810000b460fe40f9BL8;FF94830194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000b04ad11991e8a700a9020300d042183e91ea0f00f9e343009186830194fd7b43a9L8;FF42018052b183009", - "4620100d042803a910b00001408200091410100f021801391e80300f9e8230091e00309aa82028052a6830094620100d042803991e0230091BBBL4;FF02000014c8060091e8bf02f9e0e3159164b90094e0bf02f9810300f021883791830300f063c43791e0e31591e2018052e40180529db80094f4bf42f", - "90c000014L4;FB8d00000014000000e4674900000000006a00000000000000120100002e000000e4674900000000006a00000000000000bd0000002e000000e467490000000000L8;FFe8bf5d39e6030991e08713ade407c23de003c23d2841082a699140b8e29b803de2ffc13de10bc23de09315ad3b810", - "8aae9635e39e417c23de38b14ade213c23dBL8;FFf44f02a9fd03009148008052f503012ae10303aa000d002af30303aaf403022a1bfdff9795040034a80200320811c0da081540d2080d088b0825019108fd46d3L8;FFe00600adea1700f9000504ad020d05ade90b00f9bc0000b4e0031baae1031caa22", - "0080526e430094fbe30091a80302d1e10316aa60c30291bc0302d17c5fff97BBBBL4;FF60fa0035e85341b9e8e300b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebL4;FB75626c69634b6579436861696e73656e6465", - "725f726174636865745f6b657973656e6465725f726174636865745f6b65795f70726976617465636861696e5f6bL8;FF3f03086be8979f1a08219f5a081d0072a00900541f05007141120054e81b40f91f0500b120320054e9030091e8431e9120c10091102e0094e8cb43f96083c03cBL8;FF771640f97", - "70300b4791240f970630194e00317aa210080526e630194400500b4e10319aae20317aaf80300aa74630194792240f9590200b47b1e40f964630194L8;FF03080054090340f9d60217cbdf0208eb3501178bd732889a152300a9f7fbffb5f62b40f9f51f40f996000037180100b018e31e9113000014d7fe", - "45d3e80214abBBBL4;FFe00301aae10318aae20314aa1a693738e82200d16a0240f92801088a4801088b1a21003976a30194ebffff17680640f90905009129fd43d32af17dd3490109cbL4;FFfb7305a91a0000f040c30291017877783b6c1c53383c7cd39dfeff97f30300aa603400b4c0021091e1ea009", - "122000090bf22007144e040f9027861f8ec010054L8;FF77a30094610e40f9810000b4601240f92200805272a3009408008092680200f9f30b40f9fd7bc2a8c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaBL8;FF890200b02921009121118a9ab2230114ff4302d1fd7b07a9f44f08a9fdc3", - "01910a7c4039f40308aa08088052090040390010c03c01f0c03c48150033f30300aaBL4;FFe00301aaa8fe0737680240f9090540f91f0009eb29060054e80f41b2e80300f9e00300915f19ff97f44f45a9f52340f9fd7b43a9ff830191c0035fd6f503012aL3;ZBBBBBBBBBL4;FFdf2200f129fd43d32af1", - "7dd3490109cbc932899a1f0549eb890a00542a050091f30300aaa08300d15f0108eb013280520295899a39030094b9537ea9a1035ff8L4;FFfa03172ae00f803d20000014fa031f2a39008092b70000b4e00315aae10317aa220080526e1d00943f0b00b1c1020054e81b40f9e9e34039e81300f9e9a3003", - "9L8;FFf90b00f9f85f02a9f65703a9f44f04a9fd030091f50305aaf40304aaf90303aaf70302aaf80301aaf30300aa681d01940003805201018052661d0194600500b4BBL4;FFe84b42f9aa0216cbe94742f9f45741a9682a01a928008092682600a9950100b49322009104000014b50600f173620091e00", - "0005461825ff881ffffb4600240f9L4;FF211c001203ec7c920000803d5f8002f12028407a41020054e5003bd5a5104092bf1000f1c10100546004803d600001ad63e47a92820003cb420002d11f2003d5L8;FF215c1491a40100b084e00991a32300d182008052a8831ff8be9d0094b30100b073a203918", - "10100d021f01b91a32300d142008052e40313aab4831ff8b59d0094BBBL4;FFe2031f2ae0023fd61f0000f1ad000054390300ebe33900541803008b060000141f0400b16139005490dd01941f100031e138005439feffb505000014e0430591L4;FB70656374656420352c20666f756e6420c0001e696e76", - "616c69642067726f7570206c656e67746820696e2067726f757020c00b3a20657870656374656420c008L8;FFe8e740f9fcb703f9e8af03f9e8bf40f9fecb03f9e8b303f9e8ff40f9f1d703f9e8bb03f9e89340f9e6df03f9e8bf03f9e8db40f9fbe703f9e8c303f9e8cf40f9BL8;FF9f0600f1ea008052e", - "b672191e8b704f928818a9ae90200d029811391f4ab04f960f18f3c8a0000102b7968784a090b8b40011fd603e4006ff6c744f90083c03cL8;FFe10316aae20314aa5e010094760a40f9bdffff17fd7bbca9f70b00f9f65702a9f44f03a9fd030091f30301aa210840f9f40300aa680240f91f0101eb000b", - "0054BBBBL4;FF010f010e0b00098a02696bfc438c212e6c00669e8cc101f2a00100548d01c0daad11c0da6d0d4d8bad01098a19150dcb2d3b7c29bf01166bc001577ae0050054L4;ZFL8;FFe2030054217c0353010400343f040071200100543f08007161fdff5481620091e20313aa46fcff97000400b5e", - "1031faaeaffff17e10314aae20313aa40fcff97BL8;FF22028052a9831ff8b77d0194fd7b42a9ffc30091c0035fd6092000912103009021003691a9831ff8240300908480359126030090c6e032910340009143000014L8;FFe1630091c37dff97807240f9800100b4e11740f9e80f40f91f0101ebe06c00", - "54e81340f9090180522a040091ea1700f909692138e1630091b67dff977f0600b1BBBL4;FF620a803df44f4ba9f55340f9fd7b49a9ff030391c0035fd6e083c03ce183c13c88008052e283c23c600600ad620a803d01f17dd3e00314aa0201805268bd0194L4;FB1100000000000000b4010000110000007", - "265757365642062617365206b65790040864900000000001100000000000000a00100000500000084f3470000000000L8;FF68de01a9681600f975bd0094e10f40f9810000b4e00315aa2200805270bd0094e10340f9810000b4e00314aa220080526bbd0094f44f49a9f93340f9f65748a9BL8;FF6b2501", - "914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d2L8;FFa8031df86733ff97e80300aa0101009021a40091e30000f063c03f91a0c300d142018052a4008052a8031df89f32ff97a1035df8e80740f9f", - "30301aac80000b4BBBBBL4;FFe10317aae20315aa230080522400805287000094770a40f975ffff17e00313aa22008052230080522400805280000094610a40f97cffff17e00313aae10317aaL4;FF0801092aeadb00f9e81f01b9e8cb00f9e8c700f9e18b40f9810000b4e09340f9220080526e0d0094e1", - "3355a9ef0317aaeddf5aa9eb0316aaea1f41b9fa9740f9L8;FFfd830091f30301aae10300aae0030091e2031f2a5cfbff97e1030091e00313aa02048052ac0d0194fd7b42a9f31b40f9ff030191c0035fd6fd7bbda9f65701a9BL8;FFe20317aaf40300aa7d8d0194582f40f9d80100b5c3ffff173700805", - "2591740f9b7831ff859fcffb535008052572340f9b6831ef8b8431fb877fdffb534008052L8;FF1e000014f4031faae00313aa080c45f81f0500b1c1fdff54f40314abe2020054688e48f81f0500b140020054e00313aab1fdff97080040b20811c0da081540d2BBBL4;FF240080528ac0ff97e12740f9e0", - "0313aab9feff17e0e3009122008052230080522400805282c0ff97e12740f9c0feff17e0e30091220080522300805224008052L4;FB442553c9963421aee9eb2c3fe0bf14bd37d9a68e00000000000000004803821dc58802bc0000000000000000000000000000000000000000000000005849b290L8;FF", - "ebcf40f9e77740f9e82f40f9f0cf00f9fabb40f9ef8f40f9ec1f40f9e6e340f9e8f700f9f60740f9f23f40f9e8c340f9f16740f9e56f40f9e14740f9e45f40f9BL8;FFe0e30091c1e20091e2830b91e403182ae5031baaf81f00b91065ff97f89341b91f0b0071a1070054faa359a92083c13c2183c23ce0", - "0600ad808601ade8b700f9L8;FF5a1f40f9fc0300f9fb0f00b9f96301a9f75b02a9f54f03a9937e089b6c4d0094e00313aa010180526a4d0094a0831df8201100b4080d8052b3835df8fc031faaBBBBL4;FFfd7b44a9ff830191c0035fd620008052010480527fed0194ff8301d1fd7b04a9f44f05a9fd03", - "0191141840b9f30308aa9f06003140030054018840a948008052L4;FB74797065203cc3200080690400013e00696e76616c6964206b65792061677265656d656e74696e76616c6964207369676e617475726520646574656374656469L8;FF4fecff97000a00b5e1031faacaffff17800400b5e00313aa2d", - "edff97e80301aa40010036e80400b5e1031faac2ffff17e20313aa230c8052cfe6ff97e10300aaBL8;FF800000548a03170a5f011c6be0fbff543f0d00f10002005428611b9b1c1140b99f031a6a800100548903170a3f011c6b21010054390f0091165540a9e00313aaL8;FF220080525f110094e1d342f", - "984fdff17f40300aae04316912200805259110094e1d342f9e00314aa83fbff17e04316912200805253110094e1d342f994fbff17BBBL4;FFa8835af869da0179a9035b78a8031cf8a9831c78e9a341a9600604ade083c63ce183c73c622a803de283c93c696200f9e9fe60d3600602ade083c83ce183c23", - "cL4;FF4a050034e9031f2ae8031faaeb0301aa060000144a1d409208010a8b6b010a8b6a0140396a0300346b0500914aff3f364c1d00129f010271c10000546a014079L8;FF150900d10800001427070094a0020079a8ee5f78d60600f10801174aa8020079a0090054a002407908ffdf88e801003568e34", - "039e103142a1f05007181030054BL8;FFff0300f9a96b40b9e82f00f9ea4302f9ea4702f9aa4700d1e7a30ea9a80c40f9e08706a9ea830aa9e00304aae18b0ba9e10302aae96300b9e28f07a9e49708a9L8;FFe1e3179102278052fce314a9f5af00f97b2d009412000014da0640b27a6e00a9797201a978", - "5602a9ff074091ff433291f44f45a9f65744a9f85f43a9fa6742a9BBBBBBL4;FFf85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a99bf20094e0230091f7a700a998f20094e00313aae1031faae20314aa23008052240080527c080094L4;FFe4fb803d3f0500b140140054e12fc13de02bc13daa", - "0000d04ae12d91e233c13de86f02f9e13f813de11fc13dab0000d06b812c91e03b813de01bc13de14b813dL8;FF091840392a7d04535f1d0071200700545f190071800200545f050071e10a0054290d00120a1c4039291d48d329c10aaa0a10403929a10aaa0a14403929810aaaBBL4;FF74950194fa0300", - "aaa0fdffb4f66b0ca9b70000b4e0031aaae10319aae20317aa77950194c80217cbfb0313aaf76b00f99f0308eb281d0054f30340f9e80317aaL4;ZBL8;FFd8020094080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f0008eb29210054f30b40f9fd7bc2a8c0035fd6e803", - "00aa098d40f8BBBL4;FF200600543f14007161080054c1a20191a2a302d14cc0ff97a05d00b5f5031faad1ffff173f040071a00600543f08007121070054a88357f81f0500b181000054L4;FB611c49000000000055000000000000000402000025000000611c49000000000055000000000000000602000", - "019000000381f4900000000005800000000000000L8;FFf44b40f9f70302aae22f40f99f07001428a00791e07f00f9e00309910001c03d21000891ec0b18a9022f8052eae700f9f9030baae0f3803dfc030eaaed4700f9BL8;FFc00202914908805209692138ead302f9b91b0094e14316911d0f00949f06", - "00b180000054c0020291e1431691a8140094e8b349f9f4074091948209911f0500b1L8;FFa11a40f961f4ffb40804805205000014a11240f93f0400f1cbf3ff5408028052606a68f8220080526d55009499ffff17c80080d20800f0f2080900912dffff17BBBBL4;FF74f50194400500b4e8a20591e003c0", - "3de10315aa085800a9080400f008613b910004803d1f800039602202a9090d40f9e843009120013fd6e80b40f91f0d00b1L4;FB65797072655f6b65795f69647369676e65645f7072655f6b65795f696474696d657374616d7053656e6465724b6579537461746553747275637475726573656eL8;FFcef7", - "ff97a0fbffb454000014a00c00b5e00313aa2ef5ff97e80301aa60000036c8faffb467000014e1031faa882600f9d3ffff17010e0054e1031faa87ffff17BL8;FF691200b8a9b341b86012833ce00741ad690600b9e90340b96a120079ea0f40f969a200b8e90b40796182823c6082813c691e00796a0a00", - "f97f020039fd7b45a9L8;FFe00314aae10313aa30110094d50000b4a8e279d3e00314aa02018052011115cb6f750094e1db42f9810000b4e0df42f9220080526a750094e04306910d100094BBBL4;FF000500ad5a1400b4d602178b33008052fc0301911808805229000014020308cb8003088ba18302d17", - "5b50194683340f960030191e10301912200805208050091L4;ZDL8;FF73b50094000480522100805271b50094600200b4e00740ad08048052c80202a9dffe03a9000400ada2037fadc81a00f9d54e0929c20200add45200b9f44f4da9BL8;FFf8df40f972350194e00314aa210080527035019400fc00b4e", - "10318aae20314aaf60300aa76350194f803172af7031aaafa0315aaf503132af30740f919000014L8;FFf89704f9f8a304f90001803de88324910011803d0081853c08018052e8bb04f9e8432491e98b04f9ea8f04f9a002813ca082823cf8af04f9f9db04f9f90f05f9BBBBBL4;FFe80200f9d90100b494", - "0600f13907009118c3019173c2019121fdff54f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd620040090L4;FFc90d00543b6928f808210091e80f00f9e083c03ce80f40f96002803d680a00f9f44f47a9fb1b40f9f65746a9f85f45a9fa6744a9fd7b42a9ff030291c0035", - "fd6L8;FF77050194689e40f9a80000b460a240f901f97fd3420080527105019468aa40f9a80000b460ae40f901f97fd3420080526b05019468b640f9e80000b460ba40f9BL8;FFe00316aae10315aa2200805274850194170300b598ffff17eb031f2ae1031f2a6032ca3c6132cb3c955a00a9803e01a980", - "82873c8182883ca1037fad904602a9L8;FFa8835cf842008052a0039a3ca8031bf873850094a8035df8a80000b401f97fd3e01340f9420080526d850094f30740f9a003da3c19038052a9035bf8f80f40f9BBBL4;FF360108abc2140054b600f8b6f5031faae00315aae10316aa7ec50194ea0f00b9f52b0", - "0b96ac50194e00316aa210080523500805267c50194c0feffb408018052L4;FB37010000220000004d414320766572696669636174696f6e206661696c6564004962490000000000340000000000000017010000110000006c69627369676e61L8;FFe11bc23de203c23dea7202f8eaa35f39e8ff43f9e48", - "715ade107c23de6435f39ebbb01f9eb6740f9f4bb43f9e90316aaf60315aaf503062af8030baaeaaf00b9BL8;FF206928382a0800f9f44f42a9fd7b41a9ffc30091c0035fd6f30300aae00301aaf40301aae10309aa220080526d050094880a40f9e00313aae10314aaefffff17L8;FF84a01491a27f0091", - "e10680528445009420008052c10080527e450094ff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9BBBBL4;FFe10314aa7be50194ff0304d1fd7b0aa9fc6f0ba9fa670ca9f85f0da9f6570ea9f44f0fa9fd830291810600b4080d8052e92300913a0080d2367c089", - "bf40302aaL4;FB7372632f656e636f64696e672f766172696e742e7273002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336L8;FFa0a303d1a200805284008052a7daff97a18351f8e86341f9f40301aa1f0500b141e0ff540effff17e80f41b2f7fef", - "f17a80a0091d1feff17a80a0091f3feff17BL8;FF21803591130800b91f300039f44f41a9fd7bc2a8c0035fd6000180520102805287650194fd7bbda9f65701a9f44f02a9fd030091140440f9280440f99f0208ebL8;FF3f0400f18b000054608240f92200805273650094619640f93f0400f18b00005460", - "9a40f9220080526d650094613240f9810000b4603640f92200805268650094BBBL4;FF690600b9e90340b96a120079ea0f40f969a200b8e90b40796182823c6082813c691e00796a0a00f97f020039fd7b45a9f33340f9ffc30191c0035fd61f090071L4;FF000080d21f000039007d20d463ce749226000", - "0b0c60042f9630040f97f0006eb80000054000080d21f000039007d20d463424079682c46d31fbd007108020054L8;FFc0035fd633008052285440a9f4cf00a9ff0f00f9bf0214eb49f9ff54e0230091e1031faae20315aa2300805224008052f30308aa1bbcff97e80313aaf35341a9BL8;FF4a0200d04a", - "710391eb230091f30300aae9ab00a9490080528a0200b04a8d3a91a00700d1e1630091e9ab04a9890200b029e13691e9af06a9eb048052a9028052L8;FF09108052e1830191160101d1220108cbe98301913a01028be90306912001088b77250094e82341f9e92741f920030291e10306912200805208050", - "0b12935899aBBBBBBBL4;FF8312803d821e803d811a803d8016803de82700a9480dc0da690dc0dae82701a9880dc0daa90dc0dae82702a9c80dc0dae90dc0dae82703a9e80313aa73190294L4;FFf44f5aa9f65759a9f85f58a9fa6757a9fc6f56a9fd7b55a9ffc30691c0035fd6e90740f917008092e203", - "44adff0600b1e11fc03de28302ade113803da2033cadL8;FF350200f0b5720891f63300917a0200f05a5320917b0200f07bb70b9109000014e00313aa610200f0216020914200805280033fd680fd0737180700f120070054BBL4;FF291b40391803000a1f01096be0179f1a8d990194e83f4039291f4039", - "0a03000a5a030a0a1f01096be0179f1a86990194e843403929234039f803002a1f01096bL4;ZFL8;FFe20308aaffbf0339e08707adf50301aae88b00f9a5990094e0c30291a102178be20314aaf4bf033975990094e00747ada8c302d1e243c03df58b40f914010191BBBL4;FFff430191c0035fd63f0900", - "7161010054e80b40f90a0180d20a00f0f209dd78924a0140b2090000140a0180d2e9031faa0a00f0f205000014080180d2e9031faaL4;FB65735f6d75742e7273002f72757374632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c6962726172L", - "8;FF08234039f87700f91f150071e1220054480200b0e00309aa08b140f9e9cf40f9edeb40f91f0900f149060054a80100f008c10491e97740f9e8ef01f9080200b0BL8;FFea031faaeb7b52b97f05007181010054eb7f52b9ec8352b98b0700346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46", - "d36b0d009135000014eb031faaL8;FFe0c31291e2db42f9e5f35639e1833291e6031f2acceeff97fc5b42f99f0b00b1c1830054480100b0fb83029108b140f9fa4340f91f0d00f143070054e8c31791BBBBL4;FF28c30391e10315aa180800f9085c00a92804009008a12a911f60003916640039602200a9", - "090d40f9e803009120013fd6e80340f91f0d00b1c0fcff54755a40a9L4;FBc02020457863656564656420667574757265206d657373616765206c696d69743a20c0152c2063757272656e7420697465726174696f6e3a20c0012900175365L8;FFf8031baaf9c303913b008092171300b4e806178be00316", - "aa0201805201f17dd36ff9009492000014e08743ade00314aae227c03da0873bade08741ada203993cBL8;FF68620091010300b021bc2191a32300d142038052e40314aaa8831ff8bd79019468220191010300b0212422912403009084c00691a32300d122018052a8831ff8L8;FFe203873df60b0ef9e36", - "b873de367873de363873de35f873da5780094e05fc73de163c73de8074091e26bc73de007409108810991e01b843de067c73d00800191BBBL4;FF1f0300f1e8079f1a0801290aa81d0036e80240f9f90314aab4db77a9080118cbbf0208eb280b0054d50000b4e80640f9a2f67ed3e10316aa0009188b70b", - "90194L4;ZBL8;FF77b90094a1835cf8e00f40f9610000b42200805272b90094e00318aa01048052220080526eb90094e16342f9f81340f9810000b4e01f40f92200805268b90094BL8;FF00c0299179390194a00200d00020089176390194fd7bbfa9fd030091083c40f9080100b4080140b20811c0da081", - "540d2080d088b0825019108fd46d308050091L8;FFe10316aa2200805275390094e16340f9810000b4e05b40f92200805270390094f6fe60d3ea031caaf85b00f9f80315aa68c6533955ff48d348380036b5010014BBBBBL4;FF230400b063343791e00700f9c7000014481c00121f090071810b00542800", - "8052f40300aae1230091ffa300a940008052e20303aae8ff02a908008092e303042aL4;FF086140f8090000f9c9008052eb2702a9e08740ad086000f8e80741b2682a00a9608600adf44f45a9f65744a9fd7b43a9ff830191c0035fd6e92b41a9e00bc03dL8;FF0800009008612791e82701a9e81300f9e3", - "2300918f090194fd7b43a9ff030191c0035fd608200091200440a9a92300d10a0000904a012891a8831ff862020090BL8;FF017f0353810a00343f0c0071ec0100543f040071a00300543f080071e00500543f0c007141faff54e81b41b948000037f98f00f9c1b20191a20301d14274ff97L8;FF4a010b4", - "a497c890a6b220953ce010f4acd010d4a6e320d53f07c900a29010c4a6c260a53cb7f8b0a4901094a6a2e0c536f2a0b5329010d4a6d360e532c7f8c0aBBBL4;FF0c00669e8cc101920cad00a9c0035fd6fd7bbea9f44f01a9fd030091290400d0290140f94ad03bd55301098b694240393f050071e101005", - "4600640a9aa0300b0L4;FB00ff450000000000506f6c796e6f6d69616c4572726f724368756e6b496e6465784465636f64696e674572726f724368756e6b446174614465636f64696e6745L8;FFe90315aab40000b4e00309aae10314aa2200805272c90094fc7340f9fa031f2af9031c915c0b00b4f86f4", - "0f9f50314aaf66300f916008092f7031caae00318aaBL8;FF601e40f92200805275490194e00313aa080c49f81f0500b14000005404010094745a45a9f60000b4f50314aae00315aaff000094d60600f1b5a2019181ffff54L8;FF1f0500b1c1dfff54e8031faa080113aba3060054000100d000e00a9173", - "490094f3031faa080c47f81f0500b121e3ff54e8031faa080113ab63050054000100d0BBBBL4;FFfa2743a91f0500f1a0080054e0830091e10317aae2031baae96b01a91a480094e82b42a9fa2743a91f0500f141010054f90600b4e00f40f9e10319aa22008052L4;FB5876400000000000e41f40000000", - "000020000000000000000800000000000000cc77400000000000e41f40000000000020000000000000000800000000000000L8;FF28000094770a40f9680240f9080117cbbf0208ebc9f3ff54e00313aae10317aae20315aa23008052240080521d000094770a40f996ffff17e00313aa22008052BL8;FF4", - "b8ccdf22b6deef21f010beb08ad8cd288ecaaf2288dcef2080deaf2200148fa280e8f52880cad724001487ae80200d008612a9120f3ff5408000014f3031faaL8;FFe8bf40f9e0430691e1e30091022180528002803de8ab00f96082803c680e00f977690094e0430691e10315aa52bcfe97e00315aa5492", - "fe9728008092680200f9BBBL4;FFf75b042972a90194e00314aa21008052370080526fa90194e0feffb4e95740b988008052f60300aab4033ba90811092a29008052a9031cf808000039e0030291L4;FFe70323aae7fc47d3921852aaa01840aac21842aae31843aa52c2009200c0009242c000924f020f8", - "b5200008b4f020f8b72c000924f020f8b01fdff54d3ffff17L8;FFf65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6a00100b000603d9175a9009440008052e10317aa79a90094ff8302d1fd7b04a9fb2b00f9fa6706a9BL8;FFe80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e003", - "1faa7d290194e00741a97b290194d1290114c10600b40a1440385f150071e1060054298400d1L8;FFe13b40f9e8833f9100001891e24323918250fe97e8074091e0833f91e103279108011891e2832491504ffe97e10b46a9e0074091000018916b51fe97f4034bf9BBBBBBL4;FFc0035fd675040051f923", - "0091760800513a008052770240f9e20640f95f0018eb492a0054e10240f9200080398000f8b728040091490400d1110000145f2800f1L4;FF018c81522200805275110094fae340f91d00001458ff78d3fb031aaa5a7c085348fc60d3eb7b42f9ed7f42f937fd60d35cfc78d3f903092af003182aef031a2", - "aL8;FF29010b0b8b0d00120a819f1a29c100117f2500714a114c0b0964003909819f1a2c3c403929010b0b2b3840394ac100110a68003929c100118d0d00127f7d0271BBL4;FF7f910194d602178be00318aae10317aa22008052f60f00f97191019402000014f60f00f9e88300918082019181820291aa6", - "a0094e86342a9f71b40f91f0500f1L4;ZDL8;FF610100f021601a91a32300d162008052e40314aab3831ff8be91009468620091610100f021ec1491a32300d142008052e40314aaa8831ff8b691009468c20091BBBL4;FFab0240b26a8241f8a00240b2610240b2a8b316b868024238a98316b8e903092aa", - "8031638a8b356b8aa8315f8690100b9a9ab77a9683100b8a88355f8fbc30239L4;FB264f49b59ea9a28c74248b8c0000c206af7025ec4455d975990844d9eafd497e74b3dcb2e142e672185dd2a9de4b16bcdb54b1d040c5774f26232f0583d81434L8;FFe85f00f9e87344f9e85b00f9e87f44f9e8f300f", - "900630054ef0715a9280200f0e29309a9e4030caaf02f00f9eec300f9f2b300f9e9df00f9e98b44f9ea9700f9BL8;FF78110094e1d342f963feff17e04316912200805273110094e1d342f9abfeff17e0431691220080526e110094e1d342f92dfaff17e04316912200805269110094L8;FF290100902901", - "0391e9d302f9fbc342f9f5c742f9e8631639f7cb42f9e80180528083cf3c7f0b00b1a80319f8404f803dc1220054f8630191e8031691e00315aaBBBBL4;FFe80300f008813391a8273da9b7831cf86a0f0036e80340f9edbb40a9e92b40b917088052a0e300d108bd70d3ea2340b9d7160033b5721d12494", - "1092a08c10daaL4;FB28a64800000000000800000000000000010000000000000068ba4800000000001400000000000000020000000000000050aa4800000000000400000000000000L8;FF890080d248008052e02300390900f0f2e827003928017fb2e0030091e80300f960e7ff97e10300aae00301aaf", - "44f47a9f92340f9f65746a9f85f45a9fd7b43a9BL8;FF6901084aab535638a93316384901084aaa635638a94316386901084aab735638a95316384901084aaa835638a96316386901084aab935638a97316384901084aL8;FFb4010014e1d342f9e8cb42f91f0101ebe0770054e8cf42f949028052f60740", - "91d6820991f4031baa0969213828040091f87749f9e8d302f91f0700b1c0200054BBBL4;FF630300f063cc2791a04301d162018052c400805230000014a0031bf8610300f021f42691630300f0639c2791a04301d1620180528401805227000014610300f0L4;ZBL8;FF84b10094ff0303d1fd7b06a9fb3b", - "00f9fa6708a9f85f09a9f6570aa9f44f0ba9fd830191081c40f91f0500b1e0100054290c40f917050091f30301aa3f0117ebBL8;FFe0833291e1032d91022b80527c310194e0833291eae7ff97f30315aa69018052618e41f8280041d23f0000f10841899a1f2d00f1020b0054a80240f9a80000b4L8;FF3", - "f0400b100010054810000b4e0ef41f92200805272310094e8430f91008100915af0ff97a80359f8e05ac03de1032a91022b8052f6f701f9e8f301f9e8430f91BBBBBL4;FF8000003568835d38ff02086bc0020054e1e7076f080700d1e90740f9180118ea3b00805261fdff54208d212e00a8302e0800261", - "e48010037292100918003098bL4;FFb982009104000014940600f139c300918001005421035ef8810000b420835ef8220080526e01009421835ff8e1feffb4200340f92200805269010094f3ffff17L8;FF810240f93f0400b1e0fdff54810000b4800640f92200805271010194810e40f921fdffb480124", - "0f9220080526c010194e5ffff17f44f41a9fd7bc2a8c0035fd6BL8;FFff830091c0035fd6080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091010300f021802991240300d084402491e323009182008052L8;FFf85f46a9fd7b44a9ff430291c0035fd6ff4302d1fd7b03a9fc", - "6f04a9fa6705a9f85f06a9f65707a9f44f08a9fdc30091390040f9f40301aafb0300aa3f0700b1BBBL4;FFfbab00a9eaa303a9f7350094fc7341f99f0b00b1a1000054e81740f91f2100391f0100f96c000014570080520d000014e0031b2a84c101941f1c007261070054L4;FB666f7220c0023a20c0002", - "f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f70726f7374L8;FF81220091026e80521600f0f2f58302917bc1009488620691806ec03d89e240f90101c03d88d640f98a2207918083873c4001c03df8431091a8031df888ee40f9", - "BL8;FF080118cbdf0208eba9f7ff54e00313aae10318aae20316aa72010094780a40f9b7ffff17e00313aa220080526d010094610a40f9bfffff17e00313aae10316aaL8;FFa10640f9610300b4a20a40f9e00314aa17000014745656a9a80240f9680000b4e00314aa00013fd6a10640f9810000b4a20a4", - "0f9e00314aa6941009468664539BBBBL4;FF1803008bf9feffb50f0000141f0400b101ba005495e101941f10003181b90054f9ffff1792e10194f70300aa1f0400b141fdff54e0430591810080528de10194L4;FB090100002e00000034ed4800000000006a00000000000000b00000002e0000000000000", - "00000000008000000000000000800000000000000188b430000000000L8;FF2200805276e10094e883059100c1009114dcff975ad107369f0600f1abd0ff54e00740f9e10314aa220080526ce1009480feff17e0d7c23de8b345f909008092BL8;FF84603f91a363009142018052a80f00f9c0610194c061", - "0194fd7b41a9f31340f9ffc30091c0035fd6fd7bbea9f44f01a9fd030091f30301aaf40300aa64610194L8;FFe10313aadeffff17ffc303d1fd7b0aa9f95b00f9f85f0ca9f6570da9f44f0ea9fd830291081c00121f090071e1010054e00302aaf30302aaf40301aa6bfeff97BBBL4;FFfd030091140440f", - "9930600b162030054b300f8b6f6031faae00316aae10313aa7ca10194f50300aa69a10194e00313aa210080523600805266a10194e0feffb4L4;FF1f3000f1680d0054f303022a360d00b4c11a40b9e203014b4200016aa00c0054e003024b24c59c520000020a64eda072030000f0634004913903109121", - "00024bL8;FF82008052e80700f9b7a10094fd7b41a9ff830091c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091080040f9e00301aa14cd40a9e8030091aba10094BL8;FFe82701a9a8630091820200b042601191e1430091e82702a97f210194800200b000200f9174210194fd7bbea9f44f01a", - "9fd030091f40300aa2301f8b7f30303aaBL4;FFe80300aae00301aa08020037980240f9080740f91f0100eb42020054e80f41b2e80700f907000014c90080d248008052e04300390900f0f2e8470039e90700f9L3;ZBBBBBBBBBBL4;FFf10331aaf20320aa117971f8717a32f8eef8ffb50b000014600240", - "fd00a8200e0000669e0000c0da0010c0da00fc43d3e8ffff17e003042a681e029417000014L4;FF62038052440080521f000014a0031df8c100009021202291c300009063bc2291a0c300d1620380526401805216000014c90080d228008052a0831d380900f0f2L8;FF00801891791e0194ff0302d1fd7b", - "03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091160840f9e10300f93f0016eba8070054170c40f9f50301aaf40300aaBBL4;FFf70304aaf50303aaf60302aae94b02f9f8c30c91e8a304b93898ff97e86a40b9e90300914a0000904a611a91e94702f94903009029610391e8e301b9680000f0L4;FF", - "040000140bf7ff9741008052010000b9e00313aaf30b40f9fd7bc2a8c0035fd6c0035fd6fd7bbca9bf2c40f2fd03009181030054f35301a9f40300aae0f77fb2L8;FFffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa810100d021301d91e803009122028052b99e0094810100d021d01391a40", - "100b084401a91e0030091BBBL4;FF9bde0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300ebe35800541803008b06000014L4;FBf5014900000000004e000000000000009801000009000000f5014900000000004e000000000000", - "004901000009000000b0084400000000002c09440000000000L8;FFea5300f90a684aa9e8af00f9082c4ba9eaaf18a90a2c4ca9e8b700f9e8979f1a08219f5aeaeb00f9081d0072eb9b00f90a2c4da9eb8f00f90b444ea9eb2b14a9BL8;FF785201a9f44f4aa9f65749a9f85f48a9fa6747a9fc6f46a9fd7", - "b45a9ffc30291c0035fd620008052e1031caa795e019400018052e1031baa765e019420008052L8;FF6a0a00f92b692138a00300542800805228692a3848050091680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd6f50300aae00313aa2200805252020094610a40f9BBBBL4;FFa0010054ae01c0dace11c", - "0da8e0d4e8bce01098acefd0b9b4e010e8bcf015ab8bf020f6b20020054ae0500d1cd010deaa1feff54428c202e42a8302e4d00261eL4;ZFL8;FF6d19001221540daa2bfbff363f1100f1a0fbff544b11c0394c1500912e1500d10c3900a96d19001221700daa0bfaff363f1500f180faff544b15c0394c1", - "90091BL8;FFe20301aa00a140a9e10308aaae7e0114000040f96a580014000040f9315b0014202440a92803009008dd2891a2018052e10308aa230d40f960001fd6ff0301d1L8;FFc10c0054f7031faa70000014e11740f9e80f40f91f0101eb60680054e81340f9958248f8490980520969213828040091", - "bf0600b1e81700f9a019005480220291BBBL4;FF890119aba2040054340108ab42130054b400f8b6f5031faae00315aae10314aa7cbe0194140400b469be0194e00314aa210080523500805266be0194e0feffb4L4;FB37662f70726f73742d302e31342e342f7372632f656e636f64696e672f766172696", - "e742e7273002f636172676f2d72656769737472792f696e6465782e637261L8;FFf44f4ca9f6574ba9f85f4aa9fd7b49a9ff43039172be0014f44f4ca9f6574ba9f85f4aa9fd7b49a9ff430391c0035fd6c50100d0a5802b91e123009162e20191BL8;FF743e0194a0831df8201100b4080d8052b3835df8", - "fc031faa887e089bfb0314aaa8031ef81100001436008052a9835ef8aa835ff868021c8b7b0700d15aa30191L8;FFe00000143f040071400200543f08007121030054e1230091e20313aadffdff97400200b4e9000014c1620091e20313aadafdff97a00100b4c9000014c1c20091BBBBBL4;FF680640f90", - "90180522a040091e00316aa6a0a00f909692138e10313aa81faff97550300b4610a40f9680240f9962a40f91f0101eb802c0054680640f949028052L4;FFe19340f9177d0853750e0094ef0317aa1d0000141f090071611e00540a0180d2e97342f90a00f0f24a0140b228dd7892eaaf00f9f1000014e967", - "53390c0180d2L8;FF21c43791e200805260001fd66102009021043891c200805260001fd6fd7bbfa9fd03009108409952021840b9010840f94873a7725f00086b23010054497c0953BL8;FFf31b40f9ff030191c0035fd6082440a91f0109eb200c0054ffc302d1e923046dfd7b05a9fc6f06a9fa6707a9f", - "85f08a9f65709a9f44f0aa9fd430191154c41a9L8;FF09fc78d38801009008a13a910afc60d3097969784921094a2a5d105308596a780001094a60020079f44f42a9fd7b41a9ffc30091c0035fd6a80100d008010191BBBL4;FFe00316aa1c692138e1e30091e92700f984baff97f82740f9e81f40f90801", - "18cbdf0208eb08230054e82340f9e10317aae20316aa0001188b71ce01940803168bL4;FB95cfa28c3f14c8892782363f00003a9fab87e0b5e16308ecbb1732b56c2356cb0e75e97ed6a11e80aa228d8a9085740e8365b3e3a2d80926d66e277f6ee27fd5L8;FFe6e340f9e8f700f9e8cf40f9f60740f9f2", - "3f40f9f16740f9e56f40f9e8db00f9e45f40f9e8c340f9e9c300f9e99740f9f4cf00f9f88f41a9e8b300f9e8d740f9BL8;FF80020054881245b8e99741b9e00315aaeb2b5aa9a80318b8e8c34639e93200b8e9cf40f9e8631139a8f31938e8430691ea2b02f9e97200f8ebf200f8ea7201f8L8;FF200b02a", - "d200540ad200700ad895dfe97e0234da982e20291e16340f9081140f900013fd6e03b02f9e8031691e13f02f9290c40f9e103129120013fd6fbc342f9BBBBL4;FF7f0a00b10302005428008052e90300f029a10b91a80200b908048052f70340f9a9a200a9df0600f1eaf9ff54d2ffff1739008052e00319", - "2a83ee01947f0a00b1L4;FB7274696f6e206661696c65643a2062797465732e6c656e2829203e203130207c7c2062797465735b62797465732e6c656e2829202d20315d203c203078383000L8;FFffc301d1fd7b03a9f72300f9f65705a9f44f06a9fdc30091081c00121f090071a1010054e00302aaf303", - "02aaf40301aa27eeff9720020037750240f9a80640f9BL8;FF680a00b9e82f407969b200b86cf20078eca741a9a83b00796852017828008092aa1b00b9a9031ff8ab831f386a1201b86c7201f869f201f86b9e0039680200f9L8;FF08011acb1f0308ebe8340054e8cf42f9e10319aae20318aa00011a8b7", - "86e0094f90b40f94803188be8d302f97f0700b1fb0314aaa053ff54e807409108810991BBBL4;FF15f140f87f0500b1a98318b8097d40398a320fb8ac8317f8a9031838c0030054f903012a098449a9fa0300aae8a30091e00309aafe840094e8a340391f050071L4;FF810100b4e9074091ea030091eb07", - "4091ec0301aa0d1440382d0100392d014039adfeff348c0500f14d15003841ffff54f80308aae80300911f692138e0030091L8;FF7cae0094a20100f04240019179ae009440008052e10316aa7eae0094ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc3019148040091BL8;FFe", - "00313aa512e019468624039f5f345b9e8231839e8c31791b47e08530041c03ce183c13de8c31291e063813d01c18d3cc80080d20800f0f21c190091e14b41f9L8;FF0805088be00313aa0201805201f17dd3732e0094ffc32091f44f42a9fc5741a9fd7bc3a8c0035fd6f46b41f9f36741f9880240f96800", - "00b4e00313aa00013fd6BBBBBBL4;FF2200805276160294613240f9810000b4603640f92200805271160294613e40f9c10000b4604240f922008052f30b40f9fd7bc2a86a160214f30b40f9fd7bc2a8L4;FFe8b301b9e09b803df6e700f9fa0d0094faaf4bf9e1b34bf9e80b409108c10e91e0031aaaef16", - "0094f7db51f9ff0600b1a00d0054fbdf51f9f6e351f92c008092L8;FFb5030037a882009108fddfc81f0500f1a1050054a80a40f9a002c03da182009100008092bf0a00f9680a00f9280080526002803dbf2200a9d51601941f0400f1BBL4;FF0b0140b90a0100b98a0080522b0100b9c20008362b696a78", - "0c696a780b692a782c692a784a017fb2a20000362b696a380c696a380b692a382c692a38c0035fd6L4;ZBL8;FF2200805276960094611a40f9810000b4601e40f92200805271960094080080927f2201a9f30b40f9fd7bc2a8c0035fd6ff0301d1fd7b02a9f44f03a9fd830091BBBL4;FFf85f43a9fa6742", - "a9fc6f41a9fd7bc6a8c0035fd620008052010480527dd60194ff4301d1fd7b02a9f51b00f9f44f04a9fd830091f40300aa35008052e0030091L4;FB656976696e675f6864724865616465725265636569766564686472436861696e63757272656e745f65706f63686c696e6b736e6578745f726f6f74736", - "56e645fL8;FFe0030eaae17b44a9f0030baae3e700f9e9df40f9f91740f9ec8700f94c018052e4d309a9e2d35da9fbab00f9e45f40f9fb8f45a9f1ab12a9ea030faafab300f9BL8;FFf5a749f9f3a349f9950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f9220080", - "526b560194f8ffff1714a4ffb48806148bL8;FFe0a33239e8a73239c80080d20800f0f246000014e05306f9e08332912101009021e03391020280522301009063c43191040180528700001448008052e0a33239BBBBL4;FF8ef60194ffc302d1fd7b06a9f93b00f9f85f08a9f65709a9f44f0aa9fd830191", - "09a04039f30300aaf40308aaa90100343f0d0071e1070054602241a9090d40f9L4;FB7b00000000000000340000002e0000008c934800000000004800000000000000c800000016000000617474656d707420746f206a6f696e20696e746f20636f6cL8;FFe00313aa32f6ff97e80301aa80000036c80900", - "b5e1031faadcffff17e1031faa883600f9d9ffff17c10b0054e0031faa9affff1721050054e0031faa8dffff17BL8;FFe10314aa8e76019420008052810880528076019420008052c10680527d760194ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa0103009021e02291L8;FF08070036e93", - "b49f9ea3f49f9e86f52b9f5cb42f9692a01a9e9d742f97822012908008092680200f9490d00b4e8d342f91f0115ebea33959a08010acbaa0208cbBBBL4;FFa80214cb7f0208eb29eaff54e0a30091e10314aae20313aa230080522400805283a9ff97f41f40f9f51740f948ffff1720008052e10313aa76b", - "60194800300d0L4;ZDL8;FFff030191c0035fd6e00741a981b60094ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091440080524500805229f87fd33f1100f1BL8;FF61e2009102278052e01b813de11f813de88304b97a360194f66f41f9f36b41f9c80240f9680000b4e00", - "313aa00013fd6c10640f9810000b4c20a40f9e00313aaL8;FFe10315aae20316aae00300f97c36009405000014160080920300001428008052e80300f978b640f9684a42b97a4e42b9f71b00f9f45700f9e86b0529980100b4BBBBBL4;FFe8430091f50300aae0430091028100912100805223008052aaeb", - "ff97e00315aabbffff17000140fd00a8200e0b00669e6b01c0da6b11c0da6bfd43d30c696b38L4;FF0101805273060094200100b4140000f9810000d021c03e91130800b91f300039f44f41a9fd7bc2a8c0035fd6000180520102805282060094fd7bbda9f50b00f9L8;FFc0035fd68000805206000014e0", - "0313aa2f060094e80300aae00301aaa8fe0737680240f9090540f91f0009eb29060054e80f41b2e80300f9e003009159fcff97BL8;FFe10316aae20314aa740200a97c860194e00316aae10314aa22008052740a00f9f44f42a9f65741a9fd7bc3a86c860114280080527f2200a97f0a00f9f44f42a9L8;F", - "F6953199b7f0317ebe8031baadc26969a290940f93f011ceba20200540961199b1f3d00f1e0030054080500912a8541f81f0117ebdc26969a5f011ceb23ffff54BBBL4;FF682700a9a81301d1490100b029910c91800300f000642491682701a9e8d30191c90000b029613191e1030691a30301d1682702a", - "9a803009008b1149129048052L4;FB6e74697479206b657920c023206973206e6f74207472757374656420666f722072656d6f7465206164647265737320c000224661696c656420746f2064657465L8;FFf4030daaf5030eaa75c60094ee0315aaed0314aae14340f9010100b4e02740f922008052f4030", - "daaf5030eaa6cc60094ee0315aaed0314aaad0000b4e0030eaaBL8;FFc0035fd6e80741b2e0030091e80300f9643c0094e10300aa20008052fd7b43a9ff030191c0035fd6c4470094fd7b43a9ff030191c0035fd6c00200b000c01c91L8;FF4a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b29", - "0500913f010aeb29030054280108ab8300005410000014e80308abc2010054090840f9090100b4BBBBL4;FFe02b40f9ff8200f181090054e81f40f9f95f40b91f4100f1a1090054ed2f44a90af040f8137040f8166c4039177041b8ea1f00f9680140b9693140b8ac0140b9L4;FB5265636569766564202d", - "3e2043743153616d706c6564002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d6235386437L8;FF02000014a80600d1a0a303d1a88311f864dcff97e10300aae86341f9f40301aa1f0500b1c0010054c80000b4e06741f9e10308aa2200805269e60094e10314a", - "aBL8;FFe1020090212c2d91e40200f084002d91e0230091a32300d1e2008052a8831ff8bc660194f40200f094822d91e102009021482d91a32300d122028052e40314aaL8;FF77660014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f30b00f9fd030091080040f9f30300aaa80000b4600640f901f5", - "7ed34200805269660094680e40f9BBBL4;FF60faffb45800001481620091a2630091e003082a3d90ff97a0f9ffb449000014a2630091e003082a830c8052228dff97e0f8ffb41e000014a0630091bfa70094L4;FF340000b0810210917f0204eb207860f880fcff54620240f98102109103290091440400f", - "9620240f9820000f9227863f87f0202eb200500547f7e00a97f0200ebL8;FFe20314aa230080522400805225bdff97f55b41a9e10317aae20314aaa002168b77a60094daffff17ffc30691f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8BL8;FF20008052010480528226019400800091b2ffff17ff03", - "03d1fd7b08a9f74b00f9f6570aa9f44f0ba9fd030291210a00b4f30300aa691640383f1500f1e1090054L8;FFc10000d021001591a2008052b2260014fd7bbda9f65701a9f44f02a9fd030091140840f9f30300aa3f0002716200005435008052080000143f00207162000054BBBBBBBL4;FF6b651b9b0c2", - "10039210140ad610100ad210142ad220d41ad610102ad620d01ad284940f9228143ad2119c03d684900f9e80600d11701178a628103ad6119803dL4;FFb6035df8a083dd3ca8835ef8df0a00b1e013803de82b00f9c1000054e1a30091e2030191e00315aaa3f5ff970b000014a003df3ce113c03de82b40", - "f9e11740f9L8;FF1f0400f161010054fffedfc8c10240f9810000b4c00640f922008052701a0194e00316aa01058052020180526c1a019468fe4ad3090880520811c0da280108cbBBL4;FF0001c03da003983ce80f40f9e6a742a9fa43039108e17a922801088ba98302d108011c8b290940b2081d00910a", - "915f382e915f38c60400f10ba15f380fd15f38L4;ZFL8;FFb30f00f9c39a009468920091810100b021e81791a401009084801591a363009122018052a80f00f9ba9a009468a20091810100b0210c1891a401009084001691BBBL4;FFe8430591c0420091b85f009470da019400088052210080526eda0194", - "000a00b4600640ad01088052e8f349f9e9b340f922008052b45200b9000400ad600a41adL4;FB000000000000000008000000000000000800000000000000c458440000000000556e65787065637465645479706555726c000000000000000000000000000000L8;FFe8fb40f9fcbf03f9e8ab03f9e8bb40", - "f9f1d703f9e8b703f9e8ff40f9f7eb03f9e8bb03f9e8db40f9faf703f9e8c303f9e8b340f9ed0304f9e8cb03f9e8c340f9BL8;FF2083853ce08bc33de8cb02f92183863c2283873c2083883c2383843c20010054e0f3c63de1074091e043169121800991f53309f9fb3709f9e09f843df2a80094L8;FF696", - "24039280100d008550391ca028052e80b03f9f5fb45b9ea0f03f948fd60d3fcfb42f9e9231839b47e0853e0c2c13ce1c2c03ce8a305b9e067813de163813dBBBBL4;FFd6c2019181ffff543f0318ebe2000054f60315aae00316aa0be4ff97f70600f1d6c2019181ffff54b40300b488e279d3e00315aa02", - "018052011114cb68fa0194L4;FB74696e6720696e697469616c204232412073746174653a20c00076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f73746fL8;FFe20313aaf70b00f9f73300f9f74f00f968040094e08744adf50300aae22fc03df4d300f9e0870bad", - "e08742ade267803de08709ade08b43ade08b0aade18340adBL8;FFa8831fb83d74ff97600640a9280000d008213a9102030090428c1091a38300d1b4233ea98b7a0194e10740f9e10000b4e80b40f9f303002a22008052e00308aaL8;FF080117cbdf0208eb49c1ff54e0630091e10317aae20316aa23008", - "052240080522091ff97f71740f902feff17f50300aae0630091220080522300805224008052BBBL4;FFa0033aade84300f964a3ff97a003d43ce83340f9b5431638f70b00f90001803de92740f9bfe337a9bf8318f8993a00b4e83740f9f32340f9f6031faaf55b00b9L4;ZBL8;FF690200f96082803c680", - "e00f9e023029142b4ff97ff831a91f44f43a9f65742a9fc5f41a9fd7bc4a8c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9BL8;FF1f0500b121e3ff54e8031faa080113ab63050054a00200d000c02f91733a0194f3031faa080c47f81f0500b1e1e7ff54e8031faa080113ab23040054a0020", - "0d0L8;FF00013fd6010740f9810000b4020b40f9e00315aa723a0094f62f0036f6fe60d3f86340f9ea4340f968c6533955ff48d388580036b7020014e84300f9e8f341f9BBBBBL4;FF610a40f946ffff17e00313aae10316aae20315aa230080522400805284fdff97760a40f9680240f9080116cbbf0208", - "eb09e9ff54e00313aae10316aae20315aaL4;FF280840f9f40303aaf60302aaf50301aaf30300aac80300b40805088ba90640f918ed7cd337a100910400001418c300f1f7c20091c0020054e8825ef81f0114ebL8;FF080840a92b04009189008052f30300aae02300910af97fd37f010aeb4a95819ae103", - "08aa5f1100f15481899ae30314aac7ffff97e80b40b9c8000036e00741a9BL8;FFa8935d383f050071e1000054a9835d383f050071ac090054e90a0035f80f41b25a000014a9a35db8aae35d783f8300f1ac035f38e91b00b9a92f7ea9ea3b0079L8;FF138304a9080000f9132f00f9708a0094400180524", - "10080526e8a0094c05000b488ad8752130306a90810007908edb1d28840d6f2133b00f9080000f9a8008052BBBL4;FF4219803d485100f9e81b40b9400500ad620141ad48551d29e82740b9405d08a9420101ad2001c03d48c103394025803dab000054e01b40f9e10313aa22008052L4;FB696e6e65725f", - "6d73670000000000000000000000000000000800000000000000080000000000000028f9450000000000d5184900000000006a00000000000000L8;FFebd343f9e82709a9e8d743f9ecdf43f9e9ef43f9ede343f9eee743f9e84300f9e8db43f9e82700f928134df8e87b00f9e8435f39e9730ff8e86300b", - "9007b0054BL8;FF810000b4c00640f922008052744a0194c10e40f921fdffb4c01240f9220080526f4a0194e5ffff17680240f9c80000b409e179d3e00314aa02018052211108cbL8;FF080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb481f0054390100140020", - "00918903009424000014e80300aa098d40f8BBBBL4;FFe05bc03de15fc03de263c03de367c03de39b803de297803de193803de08f803de06bc03de16fc03de273c03de377c03de3ab803de2a7803de1a3803de09f803dL4;FB000000000000000008000000000000000800000000000000207f4200000000", - "0054727946726f6d496e744572726f72004f9d4800000000007500000000000000L8;FF0001168b7eea0094c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aa2200805223008052240080521b010094610a40f9a3ffff17BL8;FF21082a910403009084c02691e0030091a36", - "3009142018052a80f00f9bd6a019468a20091e10200b021302a910403009084402791a363009122028052a80f00f9L8;FFa80318f8680100b008b140f91f0900f103040054a80302d1290000f029b13e91e8a703a948008052490100b029013091eae30091a04700d1e8271ca9480100b0BBBL4;FF91aa01", - "9408134039e902000a1f01336b7303090ae0179f1a8baa019408174039f703002a1f01396be0179f1a86aa0194081b4039e90740f9f702000a1f01296bL4;FFa2a300d1f7fcff9728008052e80300f91c000014e003152a860d0094a083dd3ca8835ef8e91b40f9ff0300f9e083803ce80f00f9c90200b51", - "7000014e003152aL8;FFe00317aa4100805272aa0094c02000b4890a40f9e8fe42d3f60300aa33008052bf031ff835f57ef2a8033ea9800c00549c0640f9fa031faa050000141bc11f78BL8;FFe8f304f943000014404fc03da80359f8e05344f94003803de8f304f900c1ffb4e15744f9c1c0ffb4220080", - "526c2a019403feff17c082c73ce8a344f94003803dL8;FFe89b3f39e8a74829e99f3f39e8a33f39e8a74729e9a73f39e8ab3f39e8a74629e9af3f39e8b33f39e8a74529e9b73f39e8bb3f39e8a74429e9bf3f39e8c33f39BBBBBBL4;FFc0035fd6ffc301d1fd7b03a9f72300f9f65705a9f44f06a9fdc300", - "91081c00121f09007181010054550040f9f30302aaa20640f9e20100b4f40301aaa10240f9L4;FFa8c4ff97e0af00b9a04700d1a5c4ff97e0ab00b9a04700d1a2c4ff97e0a700b9a04700d19fc4ff97e0a300b9a04700d19cc4ff97e09f00b9a04700d199c4ff97L8;FF0a1d003921810baa090080120c11", - "00b9010500f9090100b9c0035fd629008052010500f9090100b9c0035fd609fc58d30afc50d30bfc48d30cfc70d3000d0039BBL4;FFfb0300aa7e920194f7031baa130000146f92019460028052210080526d920194c00d00b4480300b008211f910001c03de84d8c52a8ceac7208f000b868028052L4;ZD", - "L8;FF1f0500b1c1fdff54f40314abe2020054688e4bf81f0500b140020054e00313aab5020094080040b20811c0da081540d2080d088b0825019109fd46d30800098bBBBL4;FF63401891e0830091e2028052040180521cffff17890080d248008052e0a300390900f0f2e8a7003929090091e91300f90af", - "fff17890080d248008052e0a30039L4;FB2952c9acd0edc00d4791bbc3e719e8f88d8adb93c773a7c1c07bf6641f9fe4d7b2f182ca87c567f6e9b30ec6be20b2b22d7305b6c5093743000046f78321d622L8;FFeaa30aa9e8f345f9ea0346f9e80700f9e8f745f9e83f00f9e8fb45f9e9a31da9e9ff45f9e", - "80746f9e8a705a9e80b46f9e87f00f9e87740f909c940f900210091BL8;FFe10319aae20318aa00011a8b7c5201944803188be8d302f9f89749f9f90b40f9780300b4e1d342f9e8cb42f9f99349f91f0101ebe0350054e8cf42f949058052L8;FFe057813de15b813d680000b4e00313aa00013fd6810640", - "f9810000b4820a40f9e00313aa6e5200949f0b00b101030054e89f40f9c002c03dc91240b9f59342b9BBBBL4;FF08010aaa69a200a908008092680200f9e1f0ffb42200805271f2019484ffff17a1835df8e0031caa7af20194ff4302d1fd7b07a9f34300f9fdc301910a6840b9L4;FB9a96480000000000", - "3300000000000000d9010000050000009a964800000000003300000000000000dd010000050000009a964800000000003300000000000000L8;FFe80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e00300915ee8ff97f44f47a9f65746a9f85f45a9fa6744a9fd7", - "b43a9BL8;FF4a01084a6b01084aa9031538a9335538aa131538aa4355382901084aab231538ab535538a9331538a96355384a01084a6b01084aaa431538aa7355382901084aL8;FF800100543f0400b140010054810000b4e09749f92200805271720094e19f49f9810000b4e0a349f9220080526c720094", - "60220291fa0a009408fdff17f37749f9BBBL4;FF290300f908ff60d3881c00b5000b40921f1800f1821c0054017f0353a11c00343f1000718c0100543f0800718c0500543f040071a00900543f080071c10c0054L4;ZBL8;FFc00c00b42043c13c2143c03c9f0215eb010000ade2000054b79200d1080317", - "8b010140ad092140b9292300b9210300adff0215eb08fbff54d73200f9d6ffff17BL8;FFfe000014e05306f9e0833291a10200902120099102028052a302009063a0099104028052f500001448008052e0a33239e0833291e8a73239c80080d20800f0f2L8;FF02028052e30000b063cc0491e4018052a62", - "7ff97f64345f9e0032a91e1832491022b805276320094e0032a9157f1ff97f70316aa69018052e18e41f8280041d2BBBBBL4;FF090a0037150040f9f40308aaf30300aaa80e40f9480700b4770640f9a00642a9e20317aac1fdff9708fc79d3e1e7076fe9031faab96240a9080d010ef6d640a9L4;FFb783", - "5df819050091ca6a2838e90219cbb9831ef8bf0209eb88020054b50000b4e12740f9c002198be20315aa74020094628f7fa92103158be00316aaed020094L8;FFf44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091140040f9f30300aa9f0600b140020054610e40f93f0400b14001005", - "4810000b4601240f9BL8;FF5f050071e90300f9c1010054e9030091010300f021802991240300b084802e91e3230091e00308aa82008052e90700f9ad820194fd7b41a9ff830091c0035fd6L8;FF1ffd0371000300541f050071ed0000541f090071e00000541f0d0071400200541f110071030000144800", - "00341f050071010440f9810100b4fd7bbea9f30b00f9BBBL4;FF3f0500b180040054fd7bbca9f70b00f9f65702a9f44f03a9fd030091c3040036098840f93f0500b160040054f603022a029840f9f303032af40300aaa4030090L4;FB576869737065725072654b657953656e6465724b6579506c61696e7", - "465787400e4674900000000006a00000000000000ec0000002e000000e467490000000000L8;FF74beff97e0c3139165bfff97fc031f2aabf9ff17d60000b4e06740f9e10316aa220080526ec20094e90315aadc0000b4e05f40f9e1031caa2200805268c20094BL8;FF1f0101eb20050054680640f90902", - "80522a0400916a0a00f909692138e10313aa1bfcff97818a40a960008052e30313aa6dfaff97888240391f05007101020054L8;FFa6420094080100b008990191e9008052e8271ba9fa0741b2e8df40f92083c13ce8c700f9e8a759a98082833ce8a716a978caff34e11740f921caffb4e00b40f9BBBBL4;", - "FFf9ffff179ae20194f70300aa1f0400b141fdff54e04305918100805295e2019460d90035e85341b9e8c300b957ffdfc8d70200b4ff0600b100030054f8430591L4;FBa08f43000000000000000000000000000100000000000000010000000000000084a04300000000000000000000000000010000000", - "00000000100000000000000L8;FFe2f7c13de10310ade0fbc13de1e7c13de20311ade0ebc13de1030fade8f340f91f0d00b100eaff54e0431e91e10316aae20318aae30317aaf9830591fe290094BL8;FFe60200b0c6e0329103050091e523009182018052e90700f9c5620194fd7b41a9ff830091c0035f", - "d608050091e10200b021483591c40200f084601291e3230091L8;FF00a008917c6200944001009000000991796200944001009000600991766200944001009000c0099170620094ffc300d1fd7b01a9f44f02a9fd430091280840f9BBBL4;FF84a2019472a20194e00318aa21008052390080526fa201940", - "0ffffb4f80304a93b030036f8031faa2d00001468a20194200a80522100805266a20194001200b4L4;FF65eda072040000f0027c0253844004914204402a43c302914208422a4210422a4220422a4240422a46040011c200220a427c051b427c1b5399486238e20303aaL8;FFe80700f9b8a20094fd7b41a", - "9ff830091c0035fd6810100f021bc149182008052ada20014080040f9e00301aa090140f93f0900b1a1000054810100f021bc1491BL8;FF880200b008e10c91680200f9f44f42a9f65741a9fd7bc3a8c0035fd6880200b008a11d9175d200a9750e00f9680200f9f44f42a9f65741a9fd7bc3a8c0035fd6B", - "L4;FFc0825ef82200805275220094c1825ff8e1feffb4c00240f92200805270220094f3ffff17688e40f9280100b40805088be00314aa01ed7cd302018052f44f42a9L3;ZBBBBBBBBBL4;FFe90c80d2c826089b08e97b92c902088b212500b140fdff54a00208cb020180526f1c0294e6ffff17e003032a7", - "31c0294f40300aae3ffff17ff8302d1fd7b04a9L4;FFe383c03c882200f928008052808600ad820e803d8302803d68220039f44f4aa9f65749a9fd7b48a9ffc30291c0035fd6c000009000602591801c0094ffc301d1L8;FFf44f44a9f65743a9f85f42a9fd7b41a9ff430191721c011428008052bf0a00f", - "9bf2200a9614200910000809274420091d71c01941f0400f120fdff54f44f44a9BBL4;FFfa675aa9fd7b58a9ff830791c0035fd66003009000400b91430300f063401e916403009084801891a20700d1c10480527b9c0194fd7bbaa9fc6f01a9fa6702a9L4;FF73420091987e4093630640f9e9ffff17007", - "840b901000014c80780d2007c4093427c4093010000d44df5ff17000400b4fd7bbea9fd030091f30b00f9f30300aaL8;FF21d01391a40100b084c00e91e0030091a363009142008052a80f00f9bd9c0094810100d021001791a40100b084e00891a363009162018052b30f00f9b59c0094BBBL4;FF1f0400", - "b1611a005498dc01941f100031e119005439feffb505000014e04305918100805293dc019420190035f8074091e82b41b9e007409118430f9100400f91L4;FB7f0b00000e0000004572726f7200000039094900000000004900000000000000bb000000200000006e6f6e2d5554463820696e70757466616", - "96c656420746f20L8;FFe8ef43f9e8af15a9e8f743f9eb2b44f9e9a310a9e8fb43f9e90744f9e8b700f9e8ff43f9eaa318a9e80344f9ea0b44f9e8eb00f9e80f44f9e88f00f9e81344f9BL8;FF00802f91f5cb44f901048052e01b843de11f843de223843df6ef07f9e3ff863de3fb863dc95c0194695c01", - "940004815221008052c95c0194e07c01b4f80300aaL8;FF490580522a040091e00315aa6a0a00f909692138e10313aa05faff97760a40f9680240f9080116cbbf0208ebc8080054680640f9e10314aae20315aa0001168bBBBBL4;FF7ffc0194f5bf40f9e0430091c1220091022d80527afc0194958600f8", - "e1430091e00314aa022d805275fc01942800805268420039ff031191f44f46a9f65745a9L4;ZFL8;FFe80300aae81300f9410200d021f81b91430200d063501991e083009122028052a40080521a000014c90080d2e0a30039480080520900f0f2e0830091e8a70039BL8;FFa52300d1e00308aaa2028052", - "c87c0194fd7b42a9ffc30091c0035fd6a0831ff82103009021803a912403009084003a91a32300d1e00308aae2018052aa7c0194L8;FF490380522a040091e00316aaea1700f909692138e1630091be7cff97f71740f9e80f40f9080117cbdf0208eba83d0054e81340f9e10314aae20316aa0001178bBBB", - "L4;FF0010c33c090080920110c43c695600a9098400910a4401916082823c6182833c692a01a9681200f929000014990600f9480b009105000014800600f9e80b41b2L4;FB0800000000000000e80b48000000000080f347000000000010000000000000000800000000000000e80d48000000000080f347", - "00000000001000000000000000L8;FFff4305d1fd7b0fa9fc6f10a9fa6711a9f85f12a9f65713a9f44f14a9fdc30391292c47a92018c03d282844a9346c45a9e00b803deb0f00f92b4c43a91f8120f1BL8;FF080140b20811c0da081540d2080d088b0825019108fd46d308050091090840f9090300b40a0", - "440f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bL8;FF773c00949f0b00b1e0080054e8030c91a6000014776a41f900c3c73c01c3c83ce9ff43b9f6db43b9756641f9e80240f9200705ade9c302b9680000b4e00315aaBBBBBL4;FF680640f9490480522a040091e00315aa6a0a00f90969", - "2138e10313aa81f8ff97770a40f9680240f9080117cbbf0208eb28330054680640f9e10316aae20315aaL4;FFe00000540805403908c100511f25007168030054490180521823091b081f00131f010071cd020054b403f8b6f7031faae00317aae10314aa760c0094f8031f2aL8;FF287968b82902009029", - "710391200440a9eaa701a9ea530091e81700b92802009008610591eaa302a9a82300d1e8a703a9e3630091870c0194fd7b45a9ff830191BL8;FFe8030091e00301aab88c0194680240f9090940f9c90100b42905098b150540f95303009073a2239134f17dd3e0030091a1630091e20313aab50f00f9b562", - "0091L8;FF13693738f47f00f900880054a0867fa9e2031b2a40ddff97f47f40f9e87740f9f303002a9f0208eb61000054e0a30391bd8b0094e87b40f9697e085397060091BBBL4;FFc0035fd61f090071c1000054080180d289de78920800f0f2080140b206000014080180d2f4031faae9031faa0800f0f", - "208017fb28a1e409229010aaa68a600a9L4;FB6f2073656e642063743200000000000041204900000000005600000000000000a20000003100000000000b1016201d302c4027503a603170588053904ea045b0L8;FFe1b343f9f6b743f9f8bb43f9fcbf43f93f0400b100670054e9cf43f9e8ef42f9e0c34", - "3f9facb43f9f5db43f9e95b00f91f0500b1e9d743f9e97300f9e07b0054BL8;FFe9db01f91a00f0f2eadf01f9a34c0194e81f40b9e8c306394d0000142093c13ce9df40f9e8a30539e012803d2093c03ce9f204f8e112c03d8092823c8192833cL8;FF090040f93f0500b1600400540a0840f9091440f90a", - "0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0daBBBBL4;FFe1031faa22008052230080522400805287dfff97f72341a996ffff17f8031faae0230091e10318aa2200805223008052240080527edfff97f76741a9b9ffff17L4;FB000000000000", - "000008000000000000000800000000000000787e42000000000053657373696f6e4e6f74466f756e640000000000000000000800000000000000L8;FF080116cb9f0208eb88070054680640f9e10315aae20314aa0001168b78ec0094c802148b680a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd", - "6e8031faaBL8;FF4901098b090d00f9e00740ad600600adf44f54a9f65753a9f85f52a9fa6751a9fc6f50a9fd7b4fa9ff430591c0035fd6e0030091e1031faae20314aa03018052L8;FF7a6c0094400100f000200a91776c0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff83", - "08d1f30300aae0a30391fb0305aafc0304aaBBBL4;FFe10315aa2200805275ac01948effff1738008052fc6740b96dac019400048052210080526bac019460fdffb5200080520104805277ac0194ff4307d1fd7b1aa9L4;FFfa6701a9f30700f9002140a900013fd6600e003718070091a8024039e10315a", - "ac80c00343504009128023837770a40f9690240f9f603082a280117cb1f0116ebL8;FF73ac0094400080524100805271ac0094e01300f9a02000b46dac009440008052410080526bac0094e00f00f9e01f00b467ac0094400080524100805265ac0094BL8;FFf5c742f9f7cb42f9e8631639880200f00841", - "1891e8d302f9e80180528083cf3ce8f304f94003803d57000014f5c742f9f7cb42f99b0280d21b00f0f2e8a75139L8;FF2d0080526b5f02796ac304396aab0491490100b9e9030291e82302f928210f91ede310390001803dec631139682c00940018805221008052662c0094408d00b4BBBBBBL4;FFb5fd", - "ffb525000014e00313aaf80301aae10316aae20315aa230080522400805283070094760a40f9e10318aae6ffff17e0830091f52702a993f10094e00313aaL4;FFfae340f936008052f8db00f9da0b00b53900805265000014e00b409100c00e914d000014e00755ade96341f9e97f02f94083803c4183813", - "c45000014e9830a91L8;FF8a0000350968e2383f0501312d1b00547f0001eb800000540968e3383f0501318d1a00545f0003eba1030054e9031faa1f050071a80b0054a800805209018052BBL4;FF11ffff17e0030391e10315aae20318aa23008052240080528587ff97fad74ca912ffff1740030090006", - "038916f940194ff8307d1fd7b18a9fc6f19a9fa671aa9L4;ZBL8;FFe8031faa080113abe3000054800100f000201b9175940094e8031faa080113abc2010054090140b22911c0da291540d2290d098b2925019129fd46d30801098bBBBL4;FFe01740f94801088ba82600a9a88355f8080540f9150100ebe", - "20000541e020014a2a302d1e003082a430c805222bbff97a01f00b5bc8355f8820740f95f0015ebL4;FB4900000000000000a501000013000000982049000000000049000000000000009d0100001600000098204900000000004900000000000000950100001b000000L8;FFe8c300f9283440f9e8ab00f", - "9283840f9eb2312a92ba047a9e84f00f934a048a9eba71aa9e8df00f929a049a9e8ab15a92aa04aa9e9a310a929a04ba9e9b700f9BL8;FF0825019109fd46d30800098b080500911f0109eb481700545f000014fa031faaf9b749f9f8074091188309913f0700b18018005400230491311c0094080040b2L", - "8;FF77540094e8c3179100810091d4eeff97c80080d29c000014e85746f9e95b46f92001009000801d91e1032d91e85b04f9e8c32291e95f04f989fdffb029312491BBBBL4;FFe84340391f050071ec030054c8040035e90f41b22d000014e89340b8e90f40b9ec234079ea2341b8eba34039680a00b9e82", - "f407969b200b86cf20078eca741a9L4;FB33000000000000007e0100004600000053656e64657220636861696e20697320746f6f206c6f6e6773656e6465725f636861696e5f6b65795f6e657874576869L8;FFaae9ff97e10340f99effff17ff0302d1fd7b03a9fa6704a9f85f05a9f65706a9f44f07a9f", - "dc30091081c00121f090071e1010054e00302aaf30302aaf40301aaBL8;FFe8030091e00309aa02018052c0740194686200910103009021c029910403009084e01291e0030091a3630091a2008052a80f00f9b77401940103009021182891L8;FFe8cb42f91f0101ebc0d30054e8cf42f9090380522a0400", - "91e00318aa09692138e1431691ead302f901120094d6000034e17f52b9e28352b9e343169180008052BBBL4;FFe00743ade0430291e223c03da18302d1a0073eade00741ada2039e3ca0073cade00b42ada00b3dade00740ada0073bad2d560094a08302d1e143029102048052L4;ZDL8;FFe0031aaa8802", - "19ebe833889a3f0314eb2933949aff021aebe103899af303889ac0b2ff97e0031aaae10313aabdb2ff97d90000b428e379d3e0031aaa02018052BL8;FFea9f05f90003813c0083823cf6bf05f9e0e3823dfa1f06f9fa3706f91f7f07a9f6d705f9f6e305f9faeb05f9ffe705f9a88317f88a1000b5e0c327", - "9101630091L8;FFb87f3aa9bf233ba9bf673ca952f5ff97003000b580074dada8035ef8f6bf44f9e87305f9e8b744f9800702ad800b4baddf0208eb800b00ad80074cad800701adBBBBBL4;FF2981c9938c010a8b6901098b8d81cc938abdcaca2badcbca280108caa91d40d208010a8b6901098b0acdcac", - "a0881c8932bc1cbca4901098b6801088b2abdcacaL4;FFb5060091df0209ebf74200911b7101a9f59301f9e1fdff545d000014e0430c91e10315aa22008052030180520402805250e5ff97f48f41f9f0ffff17f8031faaL8;FF210108cb00550a9bc6020094e00315aae10314aac3020094d60000b4c8e27", - "9d3e00315aa02018052011116cb6c040194611240f9e10000b4601640f922008052BL8;FF202040a9030d40f9a900003621030090210019910201805260001fd6210300d021c02891e200805260001fd6202440a9280300d008dd2891a2018052e10308aaL8;FF1f692a381f0100f9c0035fd6090080920a", - "0180521f692a38090100f9c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd03009138404079BBBL4;FFe10316aae20313aa230080522400805287b7ff97b6035ff865ffff17a08300d1e10316aa2200805223008052240080527fb7ff97b6035ff841ffff1720008052L4;FB49000", - "0000a0000003b634900000000003800000000000000520000000c0000003b6349000000000038000000000000005b000000090000003b63490000000000L8;FF694740f9e0831d91e0cb813d6013c63ce1031c91e8231c39683b40f9f8831d91e99b03f92093803ce88f03f957170094e9b343f93f0900f1", - "61040054e16740f9BL8;FF217c0353010800343f040071000100543f08007141fdff5481220191e20313aaacfcff97000100b483000014200e00b5e00313aa85fdff97e80301aa80000036L8;FFe8cb00f9ecab4779e31b40f9eb3b00b9a00302d1e2e300918b1245f8e8fb0039e10319aae8b340f9e9730", - "4f8e9a34539ec7b0079ebf303f8e8f304f8e95f0139BBBBL4;FF99008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb831901541803008bf9feffb5110000141f0400b1e11801548ce401941f100031L4;FB47000000000000002b0100003b000000617373657274696f6e20666", - "1696c65643a20216d73672e69735f656d7074792829000000000000007fe5480000000000L8;FFe30316aae40315aa1f010a6be203182afa03881ae8a300913f411f7100010291fb03891aaefbff970800809260220091e1a30091f5df02a9f51f00f9f96b0829BL8;FFba0000b4e1031aaae00316aa2200", - "805273640194a8935cb8a9d35c78aa835c38acf35c38b7035d38bb135d38e83300b9ad235d38ab835e38e96b0079ba335db8L8;FF2200805276640094612640f93f0400f18b000054602a40f9220080527064009474d643a9750300b496c2009104000014b50600f1d6a20191c0020054c1025df8BBBL4;F", - "F345440a900e4006f16dc40a9040c40f9220840f9182040b9a0c302d19f0600b1e103959ae30317aae08300ade08301ade003803da1efff97a0877ead68030090L4;FFa0060054c10600d116ff4cd3e21a40f91500188b000700d1367c169bbf0200ea41040091e0179f1af68602a9f52600f93e000014c8", - "1a80d2000080d2010000d4L8;FFe00309aa22028052c1a4009468e20191a101009021481491a40100f084600991e0230091a32300d1a2008052a8831ff8b8a4009468220191a1010090215c1491BL8;FFe0179f1a902401948862403969624039b502000a1f01096be0179f1a8a240194886640396966403", - "9b502000a1f01096be0179f1a84240194886a4039696a4039L8;FFf70301aa72240094e00313aa2100805270240094a00800b4e10317aae20313aaf50300aa76240094d8de40a9b70000b52700001435008052d8de40a9970400b4BBBBBBBL4;FFfd03009113d840a9f40300aa360300b475c20091060000", - "14e00315aa23000094d60600f1b5a2019140020054a1025df8810000b4a0825df82200805268180294L4;FFa0835ef82200805275180094bb0000b4e00319aae1031baa22008052701800943a018052f90318aafb0316aae11340f9810000b4e00f40f92200805268180094L8;FF160115eba30200548802", - "40f9e20313aa0001158b701801947f0216eb28010054a80213ab02020054880600f9f44f43a9f65742a9fd7b41a9ff030191c0035fd6BBL4;FFe10314aae9231aa989008052e80b01f9e82301f9e80313aaf7db11a9f7e712a9f8e713a96083873ce93301f9ff3701f94ebeff97ff830a91f44f45a9f6574", - "4a9L4;ZFL8;FF6b01084aaa431838aa7358382901084aab531838ab835838a9631838a99358384a01084a6b01084aaa731838aaa358382901084aab831838abb35838a9931838BBBL4;FFc0000054e00bc03de81b40f9e003803de80b00f90c000014e8a742a9a82739a9a8c301d1890000d029312491c00", - "30090005c1491e8a703a9e8030091e1e30091L4;FB312e73656e645f63742e726563762065706f636820c0243a20456b526563656976656443743153616d706c6564202d3e2043743253616d706c6564001b737071L8;FFe9a31da9e88344f9e97f44f9e8f700f9e88744f9e8a705a9e88f44f9e98b44f9e", - "84b00f9e89b44f9e9a30fa974d80094fe0318aae69f43a9e0bf46a9ed0316aaBL8;FFe2031aaa00011c8b7d58019488031a8bfc074091f60740b99c830191e8d302f9b9010034e1d342f9e8cb42f91f0101ebe0d40054e8cf42f9090280522a040091L8;FFe8f342f909068052e02bc33de12fc33de233c3", - "3d6822099b69060091e0032d91000500ad0209803de9f702f9ccf2ff979c6300917b0700919f0314eb41efff54BBBBL4;FFe183c13ce283c23ce91f40f9c80240f9e00702ade21b803de93b00f9680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aa69f80194e00742adL4;FB65787420", - "73657269616c697a6564206279746573207765726520746f6f2073686f7274203cc0013e0020636970686572746578742076657273696f6e20776173L8;FF8082833c8182843ca0077bad8182863ca10b79ad8082853ca003d13c8082803c8182813c880200f98282823c92ffff17e08744ade00314aae22", - "fc03de86340f9BL8;FFe1b20191a22301d14f63ff9760f3ffb45d000014a88359b848000037b98319f8e1920191a22301d14763ff9760f2ffb45e000014a88356f81f0500b161000054L8;FFe8074091e2074091e00315aa0881099142c03591e1031baae30318aa04048152e50314aa06048052e05f873d", - "e163873dcb780094480340391f050071e0420154BBBL4;FF60a201a9a88357f809008092690200f948fcffb51f000014830300f063c01e91e10314aae20314aa8bb80194f5030caa7cb80194ec0315aaf60300aaf50301aaL4;ZBL8;FF63602291c40100f084403491a24700d1c102805282b80094c20100", - "f042603691e10300aa73b80094c00100b0000031916eb80094830400b4ff4302d1fd7b06a9BL8;FF6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500542a0140b2L8;FF00013fd6f7d749a9fb5f40f9fa4", - "b40f960c603f961ca03f9c9fdff1760e213915af7ff97f86340f9ac000014e10000f021e00891e0430f91c2088052c7110094BBBBBL4;FF3f040071600100543f080071a1f9ff54f40300aa01a00491e003082ae20303aaf60303aa39f2ff97200100b4d0000014f40300aa01000591e003082ae20303aaL", - "4;FFf85f04a9f65705a9f44f06a9fd830091f60302aaa200f8b6f9031faae00319aae10316aa7b080094f40304aaf50303aaf30300aa760000b5370080520c000014L8;FFffc300d1fd7b02a9fd830091490200f029813d910a0000904ab12791400200f000403e91e92b00a96902009029210691e103009", - "1e92b01a998080194fd7b42a9BL8;FFfa5b00f91f010072e83f40b908119f1a7f0700b160090054e0c30291e83f00b95e71ff97e81340f9e0230291fbf308a9e84f00f948d4ff97e83340f93f0700b1L8;FF4100805273880094e80300aa40008052e87300f9080b00b4f66f00f90300001448008052ffa3", - "0da9b60000b4e07340f9410b0091e20317aa71880094e84b41f9BBBL4;FF696a2af8680200f9f44f42a9f50b40f9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091687cc19bff0308ebc1020054747c019b0800f0d2f30302aaL4;FB00000000000000000800000000000000080000000000000", - "070054600000000000000000000000000080000000000000008000000000000004002460000000000L8;FF2200805276c80094f6031faa787201a908008092760600f932fbff17e8b743f9eb031c912093ce3c69d14b78e133c23de6030991e86b00f9e8ff5e39e237c23dBL8;FF77480194613240f9c100", - "00b4603640f922008052f30b40f9fd7bc2a870480114f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9L8;FF1f0109eb69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff54000100d0008014916f480094000100b000e032916c480094fd7bbfa", - "9BBBBL4;FFd83200b9a10100b4e00313aa22008052f44f43a9f65742a9f85f41a9fd7bc4a86fe8011437008052c10e40f93f0400f1cafdff54f0ffff17f44f43a9f65742a9L4;FBa40000002a0000004b796265723130323400000000000000e41f40000000000018000000000000000800000000000000e", - "48c400000000000e41f400000000000L8;FF08068052ff7f07a9ff7f0aa9ff7f0da9ff7f10a9ff7f13a9ff7f16a9ff7f19a9e003833cff231ca9e8008052ff4307390f00001428008052ff0f00f9ffa300a9BL8;FF21a02991144c00a91f400039f44f41a9fd7bc2a8c0035fd60001805201038052876801", - "94fd7bbda9f50b00f9f44f02a9fd030091f30302aaf40301aaf50300aaL8;FF2207c03deab341b91f010071f8c741b9801f803de9079f1a818308ad0801094be99741b962c3883ce8e300b9e8cf40f9ead700b9e9bb00b9684308f8a040ff97BBBL4;FFe0031faa0300001475a8019420008052e81740f91", - "b5f00a91b6701a9000540ad136b02a9e92344291c1b00f90083833c09230d29e85740b90183843c00d305a9L4;FF6001f83612000014e1834ca93f0000eb61fdff54e08f40f920fdffb512000014732200917f6200f180010054a000138b000c407960ff2f36080780d2600c8092L8;FFa0c303d1a15701d", - "102048052e50e0094a80351f81f0500f1e02b0054a8c303d16082cf3c6582ce3c0181c73c0281c83ce9fb8392fa6f00a9e00705ad0081c23cBL8;FF22008052080500b12935899ae87b01f9e97f01f97c280194ffbf0a39f6031caaf50313aac2fe47d3420100b4e87b41f9e97f41f940030291e10315aa0", - "80102abL8;FF5f0b00b101090054e0074091e10314aa022b805200001891ffe7163978280094f5030291e1074091a0a20291210018917865fe97e0234ea9a2a20291e16b40f9BBBBBBL4;FFe80b40b9c8150037e80f40f98a0740f9490108eba32400548a0340f9e00b40f94801088b882700a908fc60d3a", - "80b00b5080840921f1900f1420c0054017c0353L4;FFe0af00b9a04700d1a6c2ff97e0ab00b9a04700d1a3c2ff97e0a700b9a04700d1a0c2ff97e0a300b9a04700d19dc2ff97e09f00b9a04700d19ac2ff97e09b00b9L8;FF81050054690e40393fe9007121050054691240393fd50171c10400546916403", - "93fd5017161040054691a40393fa5017101040054691e40393f910171a1030054BBL4;FFa9de78920800f0f2080140b20e00001429690091e8030aaa14000014080180d2e9031faad5fe48d30800f0f206000014080180d2f5031faae9031faa0800f0f2L4;ZDL8;FF29b520918a0000102b6968384a090b", - "8b40011fd6880100d008e12b91e00301aae10308aa62028052fd7b44a9ff430191a990001408a440a9aa4300d1200440a9BBBL4;FFe10319aae20315aaf80300aa7cd001946fd00194e00315aa210080526dd00194e01800b4e10319aae20315aaf3031aaae03b00f972d00194e05340f9a0a80094L4;FB4", - "46fa28cbcdc9c090000e6dcac7a3c5ce0ef84ce527407242bb0294934211e40d0c335297ca5adaa6b804b949a33491deae448b290f7752b1fbaf412c6b8732cL8;FFe99700f9093d40f9e9ab1aa90a2548a9eaa709a90a2549a9eadf00f9e98700f90a254aa9eaaf15a9e9c700f90a254ba9ea8b00f9e9b7", - "00f90a254ca9e9eb00f9BL8;FF84500194200080522105805281500194e00200900020289174500194e002009000e0209171500194e0020090008030916e500194e0020090002020916b500194L8;FF420344ad820304ad410341ad810301ad420342ad820302ad410340ad810300ad800745ad8233c03de", - "8bb42f9766e00a9623a803d600606ad800743ad687a00f9BBBBL4;FFb6c90094a86774a9b80355f81f0500f121010054281f00121f050071cc090054880a0035381f4092e90f41b2e80318aa5a00001400e4006fe10b41a9a00303d1L4;FB33000000000000002f02000011000000696e76616c696420706", - "56e64696e67205072654b6579206d6573736167652062617365206b657900d695480000000000L8;FFc80080d2e00700f90800f0f2080900d17fffff17e90b41b2e92300a984ffff17c80080d20800f0f2080500d178ffff17c80080d2e10700f90800f0f2080900d1BL8;FF29194b8b2905009129010a8b", - "2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b290500910a1c40f95f0500b1600500540b2440f90a3040f90b0100b4L8;FF281700544c000014fa031faaf9ab49f9f8074091188309913f0700b10018005400c30391fd240094080040b20811c0da081540d2080d088b0825019109fd46d3BBB", - "L4;FF08040036e02740f9e11340f9a86303d1f99c0094a88352b81f050031c011005408008092fc2b40f9686e00a9e83b40f928fdffb4e02740f9e13b40f922008052L4;ZBL8;FFe81301f9ff1b01f9e81f01f9ff2f01f9e82b01f9ff3301f9e83701f9ff4701f9e84301f9ff4b01f9e84f01f9ff5f01f9e", - "85b01f9ff6301f9e86701f9ff7701f9BL8;FFe87306f9e97706f981300194e1bb43f9810000b4e0bf43f92200805270300194e0833291e1032d91022b805274300194e1fb42f9f39b45f93f0400b100010054L8;FFfc3301f92023803d2183863ce83f01f902000014fb5f40f9f7e741f9f6e341f9f70000", - "b4f50316aae00315aa29efff97f70600f1b5c2009181ffff54e8df41f9BBBBBL4;FF9f03116ba0030054f00500d10f020feac1feff54bf0500f10001005443a8200e6b00669e6b0100b46b01c0da6b11c0dacb0d4b8b6b010a8a428c212e42a8302eL4;FFf44f41a9fd7bc2a8c0035fd620008052800600f", - "909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6ff0301d1fd7b02a9f44f03a9fd830091010840a9L8;FF69fbff54e00313aae10317aae20314aa230080522400805222170094770a40f9680240f9080117cb9f0208eb29faff54e00313aae10317aae20314aa23008052BL8;FFfd8300910500", - "40f9e80301aa210300b021803a91230300d063400891a9800091260300d0c6c00791a9831ff8290300b02bc13a91a92300d14a008052270300d0L8;FF2a040091e00319aaea1700f909692138e1630091bf80ff97fb1740f9e80f40f908011bcb3f0308eb089b0054e81340f9e1031aaae20319aa00011b8", - "b70800094BBBL4;FF0a7d4039f43300f8f70340f9e90b00f9ea6300396ec0019400048052210080526cc00194a00600b488fe68d3ea0b40f9160000b9174000f8097d105308180079L4;FB206d657373616765206b6579737375636365737366756c206465637279707420616c7761797320686173206120", - "76616c69642062617365206b65790000000000L8;FFf56b40f916017db2a18b39ade133c03de207c13d6083853c6383843ca103953ce38301ade20b803da08779ada203d53c760200f96282823c6082803c6182813cBL8;FF6a0a00f909692138e10313aa20faff97770a40f9680240f9080117cbbf0208e", - "ba8090054680640f9e10316aae20315aa0001178b72400194e802158b680a00f9L8;FF0900f0f2e8470039e90700f9e02300916436ff97f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aaBBBBL4;FFe00318aae10319aae2031f2ae0023fd61", - "f0000f1cd000054390300eba39900541803008bf9feffb50f0000141f0400b1019900548de001941f10003181980054L4;FB352f6c6962726172792f616c6c6f632f7372632f737472696e672e727300c0012ec0006c69627369676e616c5f636f72653a3a6375727665ffffffffffffffffL8;FF8339009", - "4e203012ae103002a80390094e203012ae103002a7d390094e203012ae103002a7a390094e203012ae103002a77390094e203012ae103002a74390094BL8;FF010480528e60019408a440a9e20301aae00308aae10309aaab600114fd7bbea9f44f01a9fd030091f303012af40300aa67600194000480520", - "101805265600194L8;FF2cffff1720ebff54c80080d20800f0f20809009137000014e1010054e0031faa1affff17c80080d2e00b00f90800f0f2080900d10bffff17e90b41b2e9a300a9BBBL4;FFf90302aa1400f0f2e11b00b91f0500b1600500541c1440f9153040b9f803012af70300aabc0500b4f312", - "40f968a00194e0031caa2100805266a00194603900b4L4;FFbf1040f20000805262786678423c7cd3e10100543fcc74f2a001005421cc7492214000d13f0002ebe0279f1a0800001463141a127f003f71a1f9ff54001040f9L8;FFb30f00f9c3a00094c3a00094fd7b41a9f31340f9ffc30091c0035fd6ff", - "c300d1fd7b01a9f31300f9fd430091130040f9e00301aa810100f021401f91e8030091BL8;FFe0230091f50301aae1031faae20316aa7ffdff97e10315aae05741a9b7ffff1708010036800200b000801791820200b042201891210280527720019448060037BL4;FF6c1d00122c540c0b810148516b00f8", - "378b0080523a0000142b7c1c534b0a00344d11c0390b00be522b000b0bac1d00128d00f83761710c8bab00805230000014L3;ZB" + "BBBBBBBBBL8;FB636339653033313261616632312f6f75742f7369676e616c2e70726f746f2e70715f726174636865742e7273001b737071722076312e73656e645f656b2e7265L8;FF22008052eca40094d8ffff17880080520902805268220039280080522a0000147c0000b50b000014fb0600b48aa24", + "0a93c008052890240f91f0109ebe933899aBL8;FF22008052f30b40f9fd7bc2a8ea24011461ce40f9810000b460d240f922008052e524019461da40f9810000b460de40f922008052e024019461e640f9810000b4L8;FF00fc47d36e000014e10300a9e00301aae10308aa220080522300805224008052db", + "000094e10340a92aa040a9290040f91f1040f15369283808050091280800f9BBL8;FF682604a9755200b9f44f4aa9f65749a9f85f48a9fa6747a9fd7b46a9ffc30291c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091L8;FF63f42091e0230091a200805244028052860000", + "14c90080d2a8831d38480080520900f0f2a0c300d1a8931d38a9031df8476bff97e10300aa74000014c80080d2BL8;FF42070054217c0353610700343f040071a00200543f080071000100543f0c007100fdff54e20313aa230c805275ebff97e10300aae8ffff17888241f81f0500b1L8;ZDBBBL8;FB788", + "14000000000007f8140000000000000000000000000000000000000000000000000000000000085814000000000008e8140000000000000001b1b1b1b1b1bL8;FFe81340f9090280522a040091ea1700f909692138e16300916192ff97882240f9680500b409e179d3961e40f957038052331108cb040000", + "1473c201f1d6c20191BL8;FFe28308ade082c13ce282c63ce18306ade082c73ce182c83ce28304ade082c93ce282c23ce18305ade082c33ce182c43ce28302ade082c53ce282c03ce18303adL8;FFff071ff8f30303aaf40302aa810100b4a81300d1e9330091aa1300d1eb0301aa0c1440380c0100390c0", + "140390c0200346b0500f12c15003841ffff54e8330091BBL8;FF742a40f9f7031faaf80316aae00314aae4000094080040b20811c0da081540d2080d088b08250191081848ab42150054170117ab62150054180700f194a20191L8;FFa02301d1a9ab3ba9b848ff97a8035ef8b7031ff8140117ebe307005", + "4b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcbL16;FFe9c343f9ebfb43f9ea6b00f9e8e700f9e8b743f9f4bb43f9e0c743f9f2cb43f9eecf43f9e8bf00f9e8bf43f9efd343f9ead743f9e2df43f9e4e343f9e8ff00f9BBBBL8;FB059ea36eca27c5006c4c5c24", + "749464b03aa21632820854000000d50046009c001400ee00fd00b50025012d001601000000000000000000000800000000000000L8;FFa98317386901084aabb35738a99317384901084aaac35738a9a317386901084aabd35738a9b317384901084aaae35738a9c317386901084aabf35738a9d31738BL8", + ";FF090900394a091b320a010039080000142c7c12532a440c330b090039090d00398b6d1c320a0500390b010039a802148be0031f2a680a00f9f44f42a9f65741a9L8;FF09390039e91341b9093d0039e90b41b909410039e90341b909450039e9fb40b909490039e9f340b9094d0039e9ab5c290a510039", + "09550039e9ab5b290a590039BBL8;FF5de0ff97b9035cf8e8feff17a04301d1e10319aae2031baa230080522400805255e0ff97b9035cf8a8035bf8080119cb7f0308eb69ddff54a04301d1e10319aaL8;FF09030054080000b00871089160fdff9000683891a92338a9e8632291a900009029011591a103", + "02d1a82739a988fdfff008c11d91c9048052e8c302f9e3031691L16;FFe1431e91e0e7813d028149ade1eb813d0155c03de233823d038948ade037823de13b823d008547ade22f823de32b823d038946ade023823de127823d008545adBBBL8;FFc0035fd6e00313aa220080522300805224008052580000", + "94610a40f96ffeff17e00313aae10317aae20315aa230080522400805250000094770a40f9680240f9L8;FFf90b40f9df0a00b100040054e1d342f9e8cb42f91f0101ebe0530054e8cf42f92a04009180c202914901805209692138ead302f91b2a0094e1431691a70d0094BL8;FF8806148be00313aa01f", + "17dd302018052f44f42a9f65741a9fd7bc3a8e6f40014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091L8;FF7f0006eb80000054000080d21f000039007d20d463424079682c46d31fbd007108020054e3fcffb063e00b9163d86878867e031b9f00066b8a000054000080", + "d2BBL8;FFb800f8b6f9031faae00319aae10318aa81300194f90b00f9980300b4e9340194e00318aa2100805239008052e1340194c0feffb4f90b40f95f0700b1f8cb02f9L8;FFe8f341f9f6d743b9f5031faaf7d343b9f8ef41f97a008052e85b00f9c80080d20800f0f20a49009166f8ff17fafb41f9b7", + "028052a8028052e85b00f968c65339L16;FF880e40f9893240f98083873c8082c03cf48340f9aa831ef8a8031df8e8431091a103963c00a101918283813ca2877eada98318f8a08b3cada1833dad46180094BBBBBL8;FB70726576696f75735f73657373696f6e7300000000000000920e40000000000055", + "00000000000000ce000000010000006661696c656420746f206465636f6465L8;FF810000b4a01e40f922008052ea9c0094a12640f9810000b4a02a40f922008052e59c0094a13240f9810000b4a03640f922008052e09c0094a13e40f9810000b4BL8;FFc0035fd6e00313aa22008052f7000094610a40f", + "9a5ffff17f50300aae00313aa22008052f1000094610a40f9e00315aaadffff17e00313aa22008052eb000094L8;FFe8431391e0031aaae10315aa16310094e8d344b9680900367f0700b1a0080054e81c0094c001805221008052e11c0094e06401b428fdffd0083d3e91f60300aaBBL8;FF60030191e10", + "301912200805208050091683300f983580194e8031f2ae8ff0139e327c03da00303d1600743ada18302d16223c03d6343803dd502178b5a0317cbL8;FFe0f9ffb453010014e83746f91f0500b1a1000054ff3706f9f63b06f9ff3f06f9ff830cb91f0800f1e1350054a02302d119f5ff97800a003621f8ff", + "b4dc010014L16;FF096921380d4b0094e10313aa64eaff97803e40f9800100b4610a40f9680240f91f0101eb600d0054680640f9090180522a0400916a0a00f909692138e10313aaBBBL8;FFe92300a916000014280180d20800f0f2081100d1110000143f00156bc1f0ff54dfffff17e80b40f98a0640f9", + "490108eb830300548a0240f9e00740f94801088bL8;FFe207843de0f3863de8eb0df9ea7c0094e00314aa0104805222008052e67c0094e8074091e00319aa0178805208812f9136f2ff97e8f34df91f0900f1203c0154BL8;FFa84e00a9f44f42a9f65741a9fd7bc3a8c0035fd66efbff97fd7bbca9f85f0", + "1a9f65702a9f44f03a9fd03009109800091f30302aaf50301aa29fddfc8f60300aaL8;FF6b010a8b6a0140396a0300346b0500914aff3f364c1d00129f010271c10000546a0140796b010a8b08010a8b6b090091f5ffff174c0500124d7d01534a7d0253BBL8;FF4a01084aa2833bad6b01084aaac31638a", + "af356382901084aabd31638ab035738a9e31638a91357384a01084a6b01084aaaf31638aa2357382901084aab031738L8;FF618202f958fdff17f86340f9ea4340f9f6fe60d368c6533955ff48d3280d00365c000014f85745f9fb4740f9e93b00f9e84300f9bc0000b4e00317aae1031caaL16;FFfc7f02", + "f9e17b02f9e06b0054602bc03de88303f9e0831d9168234239695b40f9f4031c91e0cb813d6093c83ce8231c39684f40f9e10f00f9e1031c91e99b03f9BBBBL8;FB5c3f3db95a978f187637506e0d61ed3ea28c370adbfd210807340000f77bd10f9652e9a3310a8c62d40ae63074a2d6f9b981c268260bc", + "a012460c8bdd2d13e88L8;FF804400b4f5031faaf40b00f9f94b01f9e04f01f9ff5301f9fb6304a9fa2b00f908000014e00316aa42008052e28c0094f53f40f9b5060091bf0219ebe0260054BL8;FFe083329170e7ff977401001428008052e81300f9f32b41f9e83341f9f92700f91f0500b14167ff547b", + "fbff1728008052e80b00f9f9d740f9e98b42b9e88f42b9L8;FF340108ab020e00545f0800f180000054281440f9140114ab620d00549400f8b6e0031faae10314aa7b080094f70302aaf60300aaf80301aaf40700b4e10c0094BBL8;FFf4031baaa10300b4f70300aaed4c0194e0031aaa21008052e64c01", + "94800f00b4e10317aae2031aaafb0300aae94c0194f7031baa13000014e24c019460028052L8;FF62000054fd7bc1a8c0035fd680fdffd000c000919948009480fdffb000603e919648009480fdffb00020209193480094fd7bbda9f65701a9f44f02a9fd030091L16;FFe8d742f9e84b00f9e8e342f9e88", + "300f9c8008052e87300f92c000014ed634ba928a00791fa3f11a90001c03de0030aaaf1fb12a9f63f40f9b1008052fe6740f9BBBL8;FFe93200d103000014e8031faae92a00d14a1d4092a0e300d108010aaaa9a33ca9bbf0ff97a8ffff9008a1189149038052682601a9e00747a908008092685e00a9L8;", + "FFe1031baaf36c009418000014e8ef41f9080f00b4e9f341f9e80302f9e8830591ea0310912b0000f06bd108911a0380d280fdffd000b82f9108210091e1430691BL8;FFf6635ba9581400b4d922009104000014180700f139630091a013005421835ff881ffffb4200340f922008052e2ec0094f8ffff17", + "28008092e1c30391e20313aaL8;FFfd030091017c4093e20304aa060080d2050080d2040080d2000880d2d3ffff97fd7bc1a847f6ff17080000d02900805209811c39c0035fd6fd7bbfa9fd030091BBL8;FF08011acb1f0308ebc9000054e0431691e1031aaae20318aaf4100094fad342f9fc0740919c83", + "01910ffeff17f60300aae043169122008052ec100094e1d342f9L8;FFe00314aa0201805201f17dd3ea2c00943a008092a2faff17a0c300d1e1031aaae20318aad0eaff97ba035ef83cfcff17a0c300d1e1031caa02048052caeaff97L16;FF6a048052eb1f40f9fa5b42f9a00303d1f45f42f9e18313916", + "20080526901088b08010291200502ad200b43ad200903ad210340ad210100ad220341adfc2301f9BBBBBBL8;FB2c20726563697069656e743dc0001243616e6469646174652073657373696f6e20c0052068616420c01020726563656976657220636861696e730076656e646fL8;FFf44f07a9fd8300919", + "f0003eb621400545c08038b5a08048bf30302aaf60301aaf40300aa780100d01843009139feffb039833091200080527b0100d07f021cebBL8;FF0011803de083c53c0015803de93740f9093100f929070091e083c03c0001803de083c13c0005803de083c23c0009803d892200f90c000014e003082ae20", + "313aaL8;FF9cbffe97fb6b57a9fc0305912083c53ce86758a9f6cb40f97f0700b1e80300f9e80305910001803d00060054e8c30591e02300910227805201e10091e5200094BBL8;FFbf633ea9bf031ff833e5ff97e01d00b5f40f42f9e80742f99f0208eb61000054e0231091845b0194e80b42f9a003de3", + "c8a0600918822199ba9035ff80001803dL8;FF760a40f9680240f9080116cbbf0208eb69f6ff54e00313aae10316aae20315aa03000094760a40f9adffff17ff0301d1fd7b02a9f44f03a9fd830091480001abL16;FFe10314aae20313aaf0ecff97800700b5e1031faac4ffff17e1031faa883200f9c1ff", + "ff17e1010054e1031faab6ffff17c80080d2e10700f90800f0f2080900d1BBBL8;FB6d00000026000000636f696e73000000dca346000000000018000000000000000800000000000000f0a34600000000006ca44600000000007ca5460000000000L8;FFe81340f9e10316aae20315aa0001178bf080009", + "4e802158be81700f9955a40f9550300b4e11740f9e80f40f9965640f91f0101eb80390054e81340f949048052BL8;FFec000194601000b4615a40a9f58300a9ff0f00f9df0215ebc8080054f5031faae8031faab60000b40000158be20316aae8000194e80315aa958200910801168bL8;FF190082521a04", + "a05217008252e1074091e003132ae20317aaea130094000700b4c000f8b6fc090094080040b91f110071e0feff54350000141f0017eb68060054BBL8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff5440ffffb000203791903c0", + "194fd7bbca9L8;FF756641f9e80240f9208709ade95303b9680000b4e00315aa00013fd6e10640f9810000b4e20a40f9e00315aae24000949f0b00b101050054e00313aa088c4ff8L16;FF66fa14a9692204a9e9cf40f9659218a9e8b340f96dba1aa9692205a9e9c340f9e8ab40f9692206a9e89740f968", + "3a00f9e8d740f968de07a9e8df40f97ba208a9BBBBL8;FBbadecbcf9b0927aee05f00005aedbd5f63735b067e4f7d61091d8803527d77e95368b53f0b692940209bdb7f55641688e892f1fe0036dc9f52efac0948cc853bL8;FFff430191c0035fd608100091200440a9a94300d1eaffffd04a511d91a803", + "1ff8e2fdff9042483491e92b01a9e34300917e8c0094fd7b44a9ff430191c0035fd6BL8;FFe91703f9e9ff02f9e9feff9029ed0a91e81303f9e8feff9008f91491e90b03f9290080d2e82303f9c8048052a934c0f2ea2703f90a078052e07f823dfffb02f9L8;FF2100805234008052ea100094e0fcffb4f", + "b0300aa0801805208000039b90000b460070091e1031aaae20319aae9100094bc2240f99c0100b4b51e40f9e1100094BBL8;FFe84b02f9d6020acb9402098bff4702f9180300941b000014ea5001944002805221008052e3500194e01e00b4f80f40f9e90740f96affffb04a212991f70300aaL8;FF09084", + "0f9290b00b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091091440f94801088b090100b42a0140b24a11c0da4a1540d24a0d0a8bL16;FF880600913f0308eb01010154c80100d0081140f91f0900f129070054280700d1ed031caafc0309aae86305f9880100f008011591e9032b9", + "1e8ef01f9e1430f91BBBL8;FF1f0500b1e1000054280080521f8400f91fa00fa91f1001b91f8c00f91f2001b9481c00121f09007101070054740040f9820640f9020b00b4810240f929008039L8;FFe082c63ca2033cade18345ade237c03da1033dada2039c3c660cff97e00640ade80b41b9010340f908", + "830bb80083893c01838a3c810000b4000740f922008052BL8;FFf65744a9fd7b43a9ff830191c0035fd6e20313aa430c80527af7ff97e10300aac0feffb5a80640f91f0116eba9040054e00313aac9fdff9700fe073728fc60d3L8;FFa00c0054e003024b24c59c520000020a64eda072e3fcff9063600d9", + "139030e912100024b007c041bc11a00b9330f40b9007c1b5377486038f51e409200231f91BBL8;FFa01a0054c0220291f5160094080040b20811c0da081540d2080d088b0825019108fd46d30900088b390500913f0308eb48190054da000014f6074091d6820991L8;FFa1035df8616400b526030014a80", + "35df808011acb7f0308eb287e0054bb0400b420031a8be1031caae2031baae93000945a031b8be0031caae1031baa22008052L16;FFf40301aaf30300aae0030091a18300d1a3831ff8a88b3ea942008052b7031ef8b6170094880ec0da29fefff0296d2491a80f00f9a8058052e0630091a9233ea9BBBBB", + "L8;FB6f756c64206f6e6c79206661696c206261736564206f6e2073697a65732c20616c6c2073697a65732073686f756c6420626520636f7272656374000000000000L8;FFbf0209eb88050054b50000b46002148be20315aaef980094e80316aa8902158be90f00f9e083c03ce90f40f90001803d090900", + "f9f44f45a9f65744a9f85f43a9BL8;FF4a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9030054200108ab22010054fd7bc1a8c0035fd6e8031faa091c40f93f0500b1L8;FFfa6b01f9e00715ade2b3803df96f01f9fa7301f9ff7701f9f6f302b9ff6b02f9f66f02f9ff7", + "302f9d9f4ff97e86f42f929068052e0431391e1830a9109010039BBL8;FFf70301aaf80300aa02011ccb3a0002eba201005420031c8be10318aae20317aaec5801948803170be8ff0039170500b52b000014080280d20800f0f2681200a9L8;FF01080054e8ab45f9e9c32791e0d3c23de95b04f9a9fdff9", + "029c11d91e80305f9080000f008112791e85f04f928008052eac32291e96f06f9a04700d1e1833291L16;FFf56301f952dfff97e80300aae86301f981feffb021800f9183feffb063ec0f91e0030b91420280526401805209000014e06301f981feffb021800f9183feffb0BBBL8;FF1d000014e80741b21", + "b000014f603032a5f2800f1880000542800028b08f1df38e849f837e0230091622a0094e80b40b968000036e00b40f912000014e80f40f9L8;FFe243169120008052e10318aa04160094e10318aa288c43f81f0500b1e0fcff54e243169140008052fd150094e3ffff17e043169122008052fd170094e1d3", + "42f9BL8;FFa80000b4602a40f901f57ed342008052e9f80094683240f9a80000b4603640f901f57ed342008052e3f80094683e40f9a80000b4604240f901f57ed342008052L8;FF00c0009242c000924f020f8b5200008b4f020f8b72c000924f020f8b01fdff54d3ffff17c9157e92ff0500f1aa0d098b4", + "90140f9eb0329aa6bfd47d3691949aaBBL8;FFe0ff833de103843de207843dfbeb0df908590154793600b4f7e74df9e10315aae20319aae002188bea380194ae010014e04fc23de8a344f909008092690200f9L8;FF38ffff17a88357f8080540f9160101eba32a0054a88357f8080540f91f0116eb69090", + "054a02302d15af4ff972032003728fc60d3280f00b5200840921f1800f1L16;FFa89247f8e95f5739e8bb01f9e8ff42f9eb7202f8eb7f43f9e80700f9e80b43f9eba301f9e8f200f84841092aa91246b8ea435739f5a357393b8108aae8ef42f9BBBBL8;FB6e206e6f7420617661696c61626c6500420240", + "00000000006a000000000000000e0000002600000042024000000000006a00000000000000190000001c000000L8;FFe20318aafc0313aa73060091f1880094e0031aaae10319aae20317aae30315aae4031caaf1e7ff97e80b40f9200080523f0300eb601d0054497b60780a014079BL8;FF400902ad208", + "3c33cc282c93ce93304f9400500ad2a0080528083ce3ceaa71139eacf42f902f18f3ce803169122b7803d6001803dea5301f9e95f01f990a1ff97L8;FFfc031faae82f00f9e8eb40f9f90b41b2e92304a97d000014810a41a9e0e3069146f7ff97e8df40f91f0500b1003f0054f6275ca9590080d2e82f00", + "f9e8eb40f9BBL8;FF561f40f9ef480194e00317aa21008052e8480194800700b4e10316aae20317aaf40300aaeb480194582f40f9d80100b5c3ffff1737008052591740f9b7831ff8L8;FF8112c03de8bf40f97a0200f98002803df45744a9e8ab00f9610a803d6082803c680e00f9f50000b4f30314aae0", + "0313aa3b030094b50600f173a2019181ffff54L16;FFef3b40f9f1030aaaf57b40f9ea0300aafc4340f9e45f40f9e00312aae08710ade81b01f99f0100148800805209008092790a00f968220039e00301aa690200f9BBBL8;FFa80200b983ffff1780fffff00040139182fffff042001491e10580528464", + "0194fb1f40f9e803192af90f40b954ffff1780fffff00050159182fffff042201691L8;FFfd7b01a9fd430091e10b00a9c2fdff9042401f91e70305aae60304aae50303aae1030091e3230091e40302aa84640094420700b4fd7bbba9f90b00f9f85f02a9BL8;FF21a00e9183fefff063900291e0030091e", + "200805284008052dceeff97e10340f9c6ffff17e80f41b2c0ffff17c80080d20800f0f208090091bcffff17ff0302d1L8;ZDBBL8;FFe00316aa060480524bd1ff97facb40f9e86346395f0b00b161100054f7430f9108150036c08641a9a90302d1e8430f91a20302d1240101910304805205028052L8;FF", + "f51a40d2360002912000178be1031f2ae20315aa0814003852290094bf3e00f148020054800642ad80020291e103009122008052e00702ad800a43ade00b03adL16;FFf60300aa00fefff000800f9124feffb084202f91e60300910104805225048052070c8052e00300ade00301ade00302adde0c009408", + "018052bf7f3fa9bf233ea9BBBBBBBL8;FB6f6e20666f7220726563697069656e743a20c01b2c2063757272656e742073657373696f6e2062617365206b657920c01d2c206e756d626572206f6620707265L8;FFe90308916092803c21250091680e00f9480080527f2a00f968620139eda20094b6f7ffb5c", + "0ffff1725feff90a5603591e1630091a2c20091e0031f2ae3031faaBL8;FFe8a701a9901e019400fffff000c010919d1e019400fffff000a026919a1e019400fffff000002791941e019400fffff000002191941e019400fffff000602191L8;FF08fdffd008310291882602a9e10f40f9a1fcffb5e7ffff", + "1720008052c10280527d1e0094ff8302d1fd7b04a9fb2b00f9fa6706a9f85f07a9f65708a9f44f09a9BBL8;FFdae8ff97e84b40b9c8010034a1035ef8a8035df81f0101eb60200054eb2f40b9a8835df8090780522a04009109692138e0030b2aa1c300d1aa031ef8cbe8ff97L8;FFf50300aae00313aa22", + "00805208020094610a40f9e00315aae3ffff17fd7bbca9f85f01a9f65702a9f44f03a9fd03009148008052f50301aae10302aa000d002aBL8;FFfd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091081c00121f09007181010054e00302aaf30302aaf40301aacaefff9720020037750240f9a806", + "40f9L8;ZDBBBL8;FB000000000000000000000000000000001a8a400000000000238a40000000000000001b1b1b1b1b1b1b1b1b1b001b1b1b1b1b00131b1b001b0000070000000000L8;FFc9120054968248f8df0600b1c0120054802202919ff2ff97080040b20811c0da081540d2080d088b0825019109", + "fd46d30800098b080500911f0109eb68110054BL8;FF22070054490500b42a0200f04a1140f95f0900f1c3040054ff8302d1fd7b08a9f44f09a9fd030291e90300f9e90300910a0200904a611591eb230091f30300aaL8;ZFBBL8;FF42ffffb042783691e82700a9e80300910900009029613d912f000014", + "202040a941ffffd021b03091030d40f9a2038052fd7b43a9ff03019160001fd6202040a9L8;FF0bffff17e90b41b2e9a300a910ffff17c80080d20800f0f2080500d104ffff17c80080d20800f0f20809009100ffff17c80080d2e10b00f90800f0f2080900d1L16;FF09008092e4c34ca9ef0303aae82b0", + "1f948018052ee3b40f9e8270ea9e8a74ba9ecab00f9e30304aae0c7c33de5fb42a9f10303aaf9b344a9e40308aaf74b00f9BBBBL8;FB29000000000000003d044000000000004900000000000000950000000d0000003d0440000000000049000000000000009d000000300000003d04400000000000L8;F", + "Fc1dfff54e8031faa080113aba306005400feffd000003c91988e0094f3031faa080c47f81f0500b121e3ff54e8031faa080113ab6305005400fefff000400d91BL8;FF2b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4", + "a2501914afd46d329010a8bL8;FFe8c340f9e8a702f9e8d740f9e8ab02f9e8cb40f9e8b302f9e86741b9e86b05b9e813049108f14fb8e87305b949d109b8e9235c29e8d31539e8fb4379e9d71539BBL8;FF080d088b0825019108fd46d308050091b60a40f9f60500b4c90240b22911c0da291540d2290d0", + "98b29250191c91a498b29050091b41640f92801088b140500b4L8;FFe8e322910081cf3ce8e344f93dffff17e88b40f9c80000b40805088be00314aa0201805201f17dd3e3520094400745addf0a00b14233c03de85345f9800705adL16;FFe1eb41f9620a00f96822003908008092680200f9810000b4e0", + "ef41f922008052e5d20094e1f741f9810000b4e0fb41f922008052e0d20094e10342f9810000b4BBBL8;FF2a040091e00315aa6a0a00f909692138e10313aad5f8ff97770a40f9680240f9080117cbbf0208eb68220054680640f9e10316aae20315aa0001178be5720194L8;FFe10380528f6e0094e0431", + "6912200805207120094e1d342f942faff17f60300aae04316912200805201120094e1d342f9e00316aac6f9ff17f60300aae0431691BL8;FF2c540c0b810148516b00f8378b0080523a0000142b7c1c534b0a00344d11c0390b00be522b000b0bac1d00128d00f83761710c8bab008052300000144d15c03", + "9L8;FFf30300aa603400b4c0020e91e1ea009122000090bf22007144bc43f9027861f8ec010054e006178be1fcffb021000e912300008b34686038801e7ed31f0002ebBBL8;FF7f0600b140020054e18349f93f0400b140010054810000b4e08749f922008052e5320194e18f49f9810000b4e09349f9220", + "08052e0320194b30000b4e07b49f9L8;FF20013fd6fa034bf95f0f00b12102005468008052f5e742f9e8e3163949008092f4e342f9690200f9a80240f9680000b4e00314aa00013fd6a10640f9611300b4L16;FFe1034bade10300ad51ffff1736008052e00745ad88220791e233c03d89fa40f9a0073bad", + "0001c03d817ac03d88ee40f9a203983ce007813d4183813ce81302f9BBBBBL8;FB2c00000000000000330000002d000000617373657274696f6e206661696c65643a2062797465732e6c656e2829203e203130207c7c2062797465735b62797465L8;FFa8c303d100c1cb3c01c1cc3ce80f40f9000500add", + "aedffb4d602188b3b008052b5c303d10c0880522d00001409088052a002088be1830091220108cbe59a0094BL8;FF28008052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6d30100b4e81a0194e00313aa21008052e11a0194400100b528008052880600f909028052L8;FFf01a0094c00280", + "5221008052e91a0094002701b428fdffd008e53d91fb0300aa0001c03d08e140f8ec0741b2d6028052d90280520000803d08e000f8e1ab4bf9BBL8;FFac0b005428170035e90f41b2bc000014495f40f9e8d34278eabf4039e19342b83f8100f1a8c31b78aae31b38e1060054486f40f9e0031aaa1f0500b", + "1c0130054L8;FF5361ff97e80300aae85306f9e0833291a1fdffb021802291a2018052a3fdffb063dc2291240280522b000014e05306f9e0833291a1fdffb021802291a2018052L16;FF1f0800f101330054a0c303d1d3e7ff97a01e0036c12900b410020014e8cb40f91f0500b101010054ff6f19a9df7e", + "04a9fcdb00f9ffdf01b9df7e06a9df8205f8BBBL8;FF23008052240080525b060094770a40f9680240f9080117cb9f0208eb69fbff54e00313aae10317aae20314aa230080522400805250060094770a40f9680240f9L8;FF8183c03ce8eb06f9e06b833de167833d27000014e01bc43de83b48f96082803", + "c09008092680e00f9e0430691690200f9bb100094a80600d11f0900b163010054BL8;FFab110c2aef234039f0274039c911092af12b4039f22f4039ee334039e14740390c120f2aef374039f03b40394d12112af13f4039f243403908040039e84b4039L8;FF4801096ae9119f9a5f010e6a0efc4ad30b12", + "8b9a5f010d6a6f1605536d0141b28e010e0a8c01110aad118b9a5f010e6a70fe51d3ae0173b26b1a0653cd118d9aBBL8;FF29050091280108aba2020054092c40f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab42010054fd7bc1a8c0035fd6L8;FFe94f40b9", + "e8cf05f9e81f40b9e9cf0bb9e92b40b9e8a30bb9e80340f9e9d30bb9e9b340b9e8db05f9e81b40b9e8c30bb94800805208018a1a1f01096be82f40b9L16;FFb80000b4e00314aae10318aa22008052e9ba0094b90000b4e07740f9e10319aa22008052e4ba0094e86740f91f0500b1608dff54df0600b1e0", + "2d0054681f40f9BBBBL8;FB6f7272656374000074194000000000005800000000000000a00000002a00000074194000000000005800000000000000a6000000220000007419400000000000L8;FF03feff9063e0229120008052e1031faae2031faa9786009440008052410080527d86009440008052e103", + "17aa7a86009440008052010980527786009440008052BL8;FFe027c13de8a344b9b47e0853e137c13de063813de89305b921418e3c76000014e89340f9e82000b40805088be00313aa0201805201f17dd352f8ff17f96f41f9L8;FF29050091280108ab83000054f5000014e80308ab621e0054bb2640f92", + "90180527f0300f1e903899a390108aba21d0054b900f8b6fa031faae0031aaae10319aaBBL8;FFe10740f928008052680200b9810000b4e00b40f922008052e74a0194ff074091ff030c91f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8c0035fd6e0230091L8;FF3f010aeb89040054280108ab83000", + "0541b000014e80308ab22030054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091L16;FFe89745f9e92312a9e89b45f9e99f45f9e8ab1aa9e8a345f9eac745f9e9a309a9e8b345f9e9a745f9eb2318a9e8b745f9ebcb45f9e88b00f9e8bb45f9e8b700f9BBBL8;F", + "F84010014e80317aae94f00f90a0d4af85f0109eba2070054090300b0f303042a291140f9690400b4e90302914a0000904a611291e92b0aa9c90200d029611591L8;FF42008052ec6a0094689e40f9a80000b460a240f901f57ed342008052e66a009468aa40f9a80000b460ae40f901f57ed342008052e0", + "6a009468b640f9e80000b4BL8;FF20020037750240f9a80640f9160101eb02030054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e003009144f1ff97L8;FF6002803dfd7b43a9f32340f9ff430191c0035fd6ff4300d1e0330039e0334039ff430091c0035fd", + "61f000039e80300aae90300aa1f1d00383f2d0038e80300aaBBL8;FFff030291c0035fd6ff8301d1fd7b03a9f52300f9f44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054080200341f0500714103005400018052L8;FF29a12991286968f8e10308aa7c26001408a440a9e20301aae00", + "308aae10309aaad26001440fdffd000a00b91e1031faac0035fd6c0035fd6e30302aae20301aaL16;FFf44f48a9f65747a9fd7b46a9ff430291c0035fd6a85300d1490100d029511491f60301aaf30300aaa8273fa900feffd000981791e8230091a14300d1f40303aaBBBBBBL8;FB63642f303639353962", + "342f7372632f76312f756e6368756e6b65642f73656e645f63742e72730076656e646f722f6c69627369676e616c2f727573742f70726fL8;FFb3835e38289140f8290141f8bf0600b1a8031cf8e97200f86003005408038052e9830791ea7240f8da26089ba9035cf8a9031df8ea7201f8480340f908f8f", + "fb4BL8;FF6a0a00f909692138e10313aaa2fcff97780a40f9680240f9080118cbdf0208eb08070054680640f9e10317aae20316aa0001188be71e01940803168b680a00f9L8;FFffc306d1fd7b15a9fc6f16a9fa6717a9f85f18a9f65719a9f44f1aa9fd43059109304039e9130037190840b9f30300aa18", + "0040f9e0a30291f40308aae103192aBBL8;FFdf0600b100040054e00317aae10316aa22008052e85e0194e00313aa1f000094680e40f91f0500b160000054e00740f9e5e2ff9760820091e1430691022a8052L8;FFe83200f9e30a803d75fdffb5e81b41f91f0500b1600a0054f72341f9e94b42b9f54f42", + "b9e85b42b9e8270529179a00b4f31f41f9e35e0094e00317aa21008052L16;FFe10313aa66ecff97801a40b980010034610a40f9680240f91f0101ebe0050054680640f9090180522a0400916a0a00f909692138e10313aa59ecff97801e40b9BBBL8;ZBL8;FFf71740f9e80f40f9080117cbbf0208eb49c", + "6ff54e0630091e10317aae20315aa2300805224008052c1a2ff97f71740f92afeff17e0fdffd000a00a918f7a0094BL8;FF20008052e1031faaf40303aab8fa00941f0400f141020054776240a9e00313aa0103805202018052e3fe0094e00317aae10316aae20314aa8bff0094b85e00a9L8;FFfaffff17", + "220040396200003421040091fdffff17200000cbc0035fd6000000000000000000000000000000000000000000000000000000000000000000000000BBL8;FFbce733a9a88314f847e3ff97fc0300aaf90301aa4d0000141f090071e1040054aa8354f8691f009148dd7892250000149f0700b1e0070054e", + "23e019480088052L8;FF810000b4020b40f9e00315aaea3e00949f0700b1fb5f00f900380054e25b40f9e8032a91e00317aae10316aae3031aaa2501ff97e84345f9f64745f9e94b45f9L16;FFedbe0094e90316aaf57740f9947c00b4e00309aae10314aa22008052e6be0094590080527e080014f7031b", + "aaf68e40f8f81e40f91f0b00b1000d00541f0700b1BBBBL8;FB5166a96b0879a741e7598a03cada0ad6260c58b75a2e324b9da1092fa9fc8163907995cfa28c3613a54c0000c8ca3ded5182ea32be21d6d0a7765ccfc0de8bdfL8;FFc08000b4ef8e00944000805241008052e88e0094e05f00f9008000b4", + "e98e00944000805241008052e28e0094607f00b4f50300aae38e00944000805241008052BL8;FFbcffff17e1031faae8630cb9b9ffff17e1970cb9f2feff17e1930cb9f0feff1708018052ffeb05f9f6ef05f91f7f0aa91fff0ba9f6fb05f9e80706f9ff0b06f9L8;FF850a009420008052e10314aa820a0", + "094fd7bbda9f65701a9f44f02a9fd030091f30300aa020300b4280040391f21007161030054f40302aaf60301aa35cefe97BBL8;FF1f010071e80303916243c03ce8a711a908358c52e51301ad08019f5ae20f00ade00702ade28f03ade08704ade20741ade82b01b908fa80d22800c0f2684301f8L8;FF0", + "80c43f81f0900b1010b0054f3031faa64000014e80300aa098d40f83f0500b180160054f30300aae00308aaf7feff97e80300aae00313aa090140b22911c0daL16;FFe84342f9e94f42f9e8b700f988a207910001c03de85342f9e93f13a9ef030aaaea030baaeb6f42f9e8a700f9880a41f9e96b42f9e0f", + "3803d8082c03de82b01f9BBBL8;FFe0830091f40301aaff0700f9e00701adaa6a0194a2035ef8820900b5800640ada08300d1a0073fada36a01941f040031200a0054f40f40f97600805208000014L8;FF2083cc3c2183cd3ce81f00f9e81b40f92283c33ce0e3009160838c3c2083ce3cc1e2009161838d", + "3c2183cf3cfc030b9160838e3c2083c83c61838f3c2183c93cBL8;FFa00600543f080071600300543f0c0071210700541f0800f1410d0054e1230091e20313aaffdf00a9ff0f00f9e7faff97a00d00b5991640f9880e40f93f0308ebL8;FFe30000343f000039007d20d4f55b42a9e00301aafd7bc5a8a2f", + "dff1763825fb8e0ff9f527f00006bedfeff54606c1c53e101809220c020cb6102008b766a60f8BBL8;FFe8074091e14316910881099100810291cc0f0094f87f49f9780300b4e1d342f9e8cb42f9f97b49f91f0101eb403d0054e8cf42f9490380522a040091e00318aaL8;FFe9a744f900001891e027823", + "de05fc23d01048052e85304f9e89349b9eaab44f9e037823de04fc23de8f308b9e8a344f9e02f823d00e4006fe13b823de127c23dL16;FF000902ad030503ad28fefff008e12391e82704a9a86300d109018052e82705a928000291e1030191f62306a9b3150094bc937da9e8030191e0031f2ae10319aaB", + "BBBBL8;FB6a000000000000000200000026000000000000000000000008000000000000000800000000000000e830420000000000496e76616c696453657373696f6e4572L8;FF0825019108fd46d308050091090840f9090300b40a0440f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce", + "11c0dace1540d2ce0d0e8bce250191BL8;FF2011005464feff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebe80f0054960000141dfeff97080040b20811c0daL8;FFe91341b909490039e90b41b9094d0039e90341b909510039e9fb40b909550039e9f340b", + "909590039e9ab5c290a5d003909610039e9ab5b290a65003909690039BBL8;FFa3020054e8830091290000b029813f91e82703a9e8a3009160ffffd000900991e82704a968fffff008e1239189038052e1c30091e82705a9e343019142008052L8;FFe85306f9e95706f98b520094a0fdff9000e02891a2f", + "dff9042202a91e106805283520094e8ff42f9e90343f9a0fdff9000a01c91a3fdff9063403091a4fdff90L16;FFf5031faacd318d9a2e0900d12f008052df010cebc057005410696a38ff010deb4a050091111a4092101e00133122cb9a350215aaa20000546b1d0091ef050091BBBL8;FF21603f91a3fff", + "fd063743f91e0230091a200805244028052c9ffff17890080d2a8831d38480080520900f0f2a8931d38a0c300d128017fb2a8031df8447d0094L8;FF0969213828040091f67749f9e8d302f9df0600b1a032005480220291a8290094080040b20811c0da081540d2080d088b0825019108fd46d30900088b", + "3a050091BL8;FFb50600f1d6620091e0000054c1825ff881ffffb4c00240f922008052e6f60094f8ffff17680e40f9280100b40805088be00314aa01f17dd302018052f44f42a9L8;FFfd7bc1a8c0035fd6000080d21f000039007d20d440d03bd5009002d1c0035fd6c0035fd6fd7bbea9fd030091f3530", + "1a9330000b0340000b073be40f994c240f9BBL8;FF89040054690200b029011591e8633f91e9bf0ef949ffff9029a10491e8bb0ef968008052ea074091e94f09f94ac13591e1074091e93709f929ffffb0294d2791L8;FFe8df41f920854fad2285c03ddf0208eb820b803d800700ada190ff54e0e30e911", + "9d5fe9782fcff1721010054810000b4c01240f922008052df360094c11a40f9L16;FF88008052e2a3803d6dfeff1728008052e85f00f9b90000b4e0031caae10319aa22008052e4b6009454ff48d3fc7340f9f9031c917749ffb54efaff1728008052BBBBL8;FB490100000a000000bb1240000000000038", + "000000000000004a0100000a000000bb12400000000000380000000000000050010000090000006d697373696e6720L8;FF7c820094fd7b41a9ff830091c0035fd6fd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090040f9BL8;FFe803169", + "1e13f02f9290c40f9e103129120013fd6fbc342f97f0f00b1a106005488008052f43f42f9e8a3113929008092f53b42f9690200f9880240f9680000b4L8;FFe00316aa22008052eb060094b70000b4e1ee7cd3e00314aa02018052e60600945a008052b80000b401ef7cd3e00313aa02018052e0060094e0", + "031a2aff031291BBL8;FFa20301d1830c805274c9ff97201500b5bc035cf8fb031caa628f40f8620d00b4810340f9380080399800f8b728040091490400d1110000145f2800f188000054L8;FF0080c23c1a0040f901a00191e00a803d0080c33ce00e803d0080c43ce012803d0080c53ce016803d0080c0", + "3ce002803d0080c13ce006803d8b470094810700d1L16;FFe87742f9e96f42f9e8af04a9eb8b42f9e8c742f900930054f13f1ea9ef0308aae8ff40f9e55f00f9e5030faaef030caae89300f9e8bb40f9e3030aaaeafb40f9BBBL8;FFfd7b47a9f34340f9ff430291c0035fd6ffc305d1fd7b11a9fc9300f9", + "fa6713a9f85f14a9f65715a9f44f16a9fd4304915a2040b9f60302aaf50301aaf30300aaL8;FF220080520a060094e10340a92aa040a9536928380cfc5cd308050091290040f9280800f94cfeffb40a7c15533f0108eb53611932200100542a0440f90bfc63d3BL8;FFd0ffff17e003082ae20313aa430c8", + "0527cedff9760f9ffb4c0ffff17a80640f91a0101eb020100547d000014e10314aae20313aae5f2ff97401100b5e1031faaL8;ZDBBL8;FFc0035fd6010040f9810000b4000440f922008052e8260114c0035fd6fd7bbea9f44f01a9fd030091140040f9f30300aa880241d29f0200f108459f9aa80600b4L", + "8;FF000440f922008052f44f41a9fd7bc2a8e9260014f44f41a9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091011040f9f30300aa810000b4600e40f922008052L16;FF21fbff54e90800b42cc101d1ed430191ee7300918cfd44d390e300918b7dcb9b0c0e80520f010c9bac0301d111010b8b220600", + "91efd100910082c13c111640f9BBBBBBBBL8;FB20c0002173707172206e65676f74696174696e672076657273696f6e20646f776e20746f20c0001b737071722076312e73656e645f63742e726563762065706fL8;FFf4f740f99f0600b120010054faff40f9560301f183210054e5020054f9031faae003", + "19aae10316aa7b9f0094e8830f91e16301910232805200e10091e5a30094BL8;FFf44f04a9fd0300914804028b49008052f30303aa340d002a3940009118f17dd30b000014680640f9e10316aae20315aa0001178be7230194e802158b680a00f9L8;FFff030191c0035fd6e0031faa821f0094e00741a98", + "01f0094ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd83029128008052f30300aaf8430091ff2301a9BBL8;FFf85f14a9f65715a9f44f16a9fd430491e24f00b9b40040f9f60307aae52f00f9f503042af903032aa93340f9f703012afa03002ae82300f9e92b00f9140100b4L8;FF29250191891a4", + "98b29050091200108ab02080054e10313aab0fcff97560300b4610a40f9680240f9b70640f91f0101eb00080054680640f9490180522a040091BL8;FF63700e91e0030091e20180528401805209000014e00300f9a1feff9021340e91a3feff9063300d91e0030091e201805244008052d5e9ff97e10340f", + "99effff17L8;ZDBBBL8;FB65636f64652070726576696f75732073657373696f6e2070726f746f6275660073104000000000002d00000000000000370000003800000058334448206e6f20L8;FF550300b4e11740f9e80f40f9964a40f91f0101ebe0860054e81340f9490380522a040091e00315aaea170", + "0f909692138e16300915a91ff97f71740f9e80f40f9BL8;FF210480520010803c0110813cf30b40f9fd7bc2a8c0035fd620008052210480527dff0094ff4301d1fd7b03a9f32300f9fdc300913f1000f123040054090040b9L8;ZFBBL8;FFa2090054092440f93f0500b1c00300540a6040b9092c40f9ca0", + "700344a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a050091090100b42b0140b2L8;FFf30302aaf40301aa62ffff97e80300aae00301aa08020037680240f9080540f9150100eb62020054e80f41b2e80700f907000014c90080d248008052e0430039L16;FFe91700f9098540f9e92b00f9", + "098940f9e92700f9098d40f9e92b01a90a2552a9e94300f9099940f9e92300f9099d40f9e9ab06a90a2554a9e92b03a90a2555a9BBBBL8;FB000000000000000000000000000000000100000000000000507a440000000000000000000000000000000000000000000100000000000000044444000000000", + "0L8;FF0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb481f00543901001400200091db03009424000014e80300aa098d40f83f0500b1BL8;FF080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aa080c45f81f0500b1800200545afbff970800", + "40b20811c0da081540d2080d088bL8;FFe23f813dd9ecff97f9575aa9f62b40f9f41740f922020014ea431391e9d744b9eb635339481140b84aa140b8e18b40f9e8bb03b9e8bf4979eadb03b9ea7342f9BBL8;FFe007803de007c03d680200a96a2601a9e003803d6b1200f91f000014c80a0091a0831df8", + "05000014e90b41b2a9233da903000014c80e0091a8031df8a0c300d1L8;FF940100b47522009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f922008052e3530094f8ffff17e88b40f908d7ffb40805088be00313aaL16;FFfd430091c80100f0084100913400407908fddf88f3030", + "0aa68020035c80100f0e003142ae103142a080140391f050071e1030054e2031f2a5a3a009409fc78d3BBBL8;FFe20313aa36a001915cfdff97b5a201f1e10316aa41ffff54887e40f91f0500b1c0100054610a40f9680240f91f0101ebe0300054680640f9981241b949098052L8;FFb60c0094e09b49f9", + "800100b4e1d342f9e8cb42f91f0101eb203f0054e8cf42f9090180522a04009109692138e1431691ead302f9a90c0094e88349f91f0500b1BL8;FFe00301aa08020037980240f9080740f91f0100eb42020054e80f41b2e80700f907000014c90080d248008052e04300390900f0f2e8470039e90700f9e0", + "230091L8;FFbf0200ea41040091e0179f1af68602a9f52600f93e000014c81a80d2000080d2010000d4e20300cb160700d15600168ad602008b36cc01f9d606188be00316aaBBL8;FFf85f49f9580300b4e1d342f9e8cb42f9f95b49f91f0101ebc0bf0054e8cf42f9490480522a040091e00318aa096921", + "38e1431691ead302f997110094fad342f9L8;FF090000d029712991f72704a9e98300916a0000904ab11491a88318b8080000d008412a910b0000d06b811f91e92305a9e9f30091a00700d1e92b06a9090000d0L16;FF4183843ca38339ade00fc13df52342f9e10f803da003953c4c000014e0830291812", + "20091023c8052f5830291e9b30094882640f9800ac03da1420191891a40f9BBBBBL8;FB64657220636861696e206b6579696e76616c69642073656e64657220636861696e20707269766174652072617463686574206b65796d75737420686176652062L8;FFe183c93c08088052e283c43cf3430391f90b", + "00f9e08709ade083c53ce183ca3ce28307ade283c33ce083c73ce157803df53f4439e183c23ce18b06ade283c63cBL8;FF010840a9f30300aae023009129f87fd31f0109eb0881899a090180521f2100f11481899ae30314aae9000094e80740f91f0500f120010054e80b40f9742200a9L8;FF22008052e", + "c1b009408008092880200f9b70000b4e00318aae10317aa22008052e51b0094bf0600f1eb3e0154e0031caae10315aaf20900141f0900f181170054BBL8;FFc2210094a08302d1e1430291020480522e1e0094a80356f81f0500f120030054c082c63cc182c73cc282c83c600604adc082c23cc182c33c62", + "2a803dc282c53cL8;FFe0833291e85306f95162ff97f50300aa3d010014f9a345f9f5a745f9e0c32791f3ab45f90163009102288052e95b00943f0700b140270054e0c32291e1c32791L16;FF090040f9280140f93f0100f9e80000b4291040393f050071e0000054000140f9fd7bc1a800001fd680feffd", + "00060159180d700948dd70094ff4302d1fd7b07a9BBBL8;FF810000b4601e40f922008052ea7b0194614a40f93f0400b140020054810000b4604e40f922008052e37b0194615640f9810000b4605a40f922008052de7b0194L8;FF810000b4e00317aa22008052ea7b0094e1074091e0833791023f805221", + "800991ec7b0094000740ad08434079e8032179280100b0e01b843de11f843d081140f9BL8;FFf31b00f9fd830091f30308aae823009136010094e86340391ffd0371e0000054c8008052680200b9fd7b42a9f31b40f9ff030191c0035fd6e083c03c08008012L8;FFe10315aac80c0034350400912802383", + "7770a40f9690240f9f603082a280117cb1f0116eb63080054680640f9e10315aae20316aabb02168b0001178be5fbff97BBL8;FFa9e317386901084aab135838a9f317384901084aaa235838a90318386901084aab335838a91318384901084aaa435838a92318386901084aab535838a9331838L8;FFa7f", + "1ff97e19344f9810000b4e09744f922008052e83b0094eb032a9160c1c03c61c1c13ce8af4ab9f68b4ab9fc4345f9a00600ade88303b9c2060014a01ec13dL16;FFc0010054da0000b4e1031aaa22008052f40309aae8bb0094e90314aaf80000b4e00319aae10318aa22008052f40309aae1bb0094e9031", + "4aaf84f40f9f7031f2aBBBBL8;FBa28c00eef1f38ae57e800000a46dc8ec2453a8fae00193193b6f44baa9b569b2067aa4aae8600b70f9efccc6545230458baf268b711645dd061128ea31f8f897L8;FFe103152a08014039c07a73781f05007121040054e2031f2a62f2ff9708fc78d30afeff904a81309", + "109fc60d3487968782821084a095d1053495969782801084aBL8;FFeaa705f9ea032d91e86b06f9c8feffd008c52991e96306f9290080d2e87b06f9c8048052293fc0f2ea7f06f90a078052ff5306f9e85b06f9ff5f06f9ea6706f9L8;FF155000a901fdfff021400591130800f91f600039f44f42a9f50b", + "40f9fd7bc3a8c0035fd6000180520104805279070094fd7bbea9f44f01a9fd030091f303012aBBL8;FF812000b5060100141f090071e1020054080180d2e9de7892ea1e40920800f0f2080140b229010aaa68a600a9e10740f928008052680200b9c11e00b5f8000014L8;FFed031faaec030aaa6b410091", + "6e8541f8cf0140b2ce010d8bef11c0daef1540d2ef0d0f8bef250191ce194f8bdf010deb230300548c0500f1ed030eaa81feff54L16;FFf84744f9e8e700f9e8b743f9fb6b44f9f67344f9e0f3803de82b17a9e8bb43f9eac343f9e9231fa9e8c743f9e9bf43f9e8cf00f9e8cf43f9e8c300f9e8d343f9BB", + "BL8;FFe123009128070091e00315aae80f00f9d6f1ff97f70f40f9e80740f9080117cbbf0208eba8070054e80b40f9e10316aae20315aa0001178be66b0194f902158bL8;FFe10314aa22008052eb6b0094610e40f9810000b4601240f922008052e66b0094611a40f9c10000b4601e40f922008052f44f4", + "1a9fd7bc2a8df6b0014f44f41a9BL8;FF0800f0f2080900d18082873ca2037dad8182883c80828a3ca1037aad8282893c8182833ca10f7bad8082843ca003d13c8182853ca10b79ad8382863c9b000014L8;FF40feff541f0102ebc80100542a0400d120008052080100b44b696838010500d1e80301aa7f", + "01096b61ffff54fd7bc1a8c0035fd6e0031faafd7bc1a8c0035fd6BBL8;FFa0077dad7b0200f9e8a743a96082803ca003dc3c6182813c6082823ca1037bad092300a9e81b40f96182833c6082843ca1037cad080b00f96182853c6082863cL8;FFe10316aae20317aaf40300aaf12b0094582f40f9d80100", + "b5c3ffff1737008052591740f9b7831ff859fcffb535008052572340f9b6831ef8b8431fb877fdffb5L16;FFff2701f9ff2301f968fe03a948008052682600f9683200f9683e00f9684a00f9685600f9686200f9686e00f9603a803de093c03d687a00f968fe10a97fa211a9BBBBBBL8;FB6465782e63726", + "17465732e696f2d313934396366386336623562353537662f736f727465642d7665632d302e382e31312f7372632f6c69622e727300c0202044L8;FFe80316aa080000146907c05a09693778f70a0091ff0213ebfcef00f99c07009122020054810a40f9ff0201ebc2290054e00600911f0001ebe2290054", + "890640f9BL8;FFe02300910800f0f2ff470039e80700f94f260094e80300aa01ffff902100399103ffffd063201191e023009102018052a4008052e80700f909000014e00700f9L8;FFe00315aa33f6ff972800809229008052880200f969520039f44f45a9f65744a9fd7b43a9ff830191c0035fd620fdf", + "ff000803191951b0094ff0304d1fd7b0aa9BBL8;FFe20180522402805292ffff17e80f41b285ffff17c812009183ffff17e0e31591e8bf02f9eac302f95b5e0094fd7bbea9f44f01a9fd030091f30301aaf40300aaL8;FFf65756a9fd7b54a9ff030691c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f", + "65704a9f44f05a9fd030091ff033ad1a9fdffd029a11591ff0300f9e97301f9L16;FFf50b00f9f44f02a9fd03009148008052f503012ae10303aa000d002af30303aaf403022a5eedff9795040034a80200320811c0da081540d2080d088b08250191BBBL8;ZBL8;FFe11740f9e2fbff17e0630091220080", + "522300805224008052c5a3ff97e11740f91dfeff17e0630091220080522300805224008052bea3ff97e11740f978feff17BL8;FF932201a9f44f42a9f65741a9fd7bc3a8c0035fd620008052e10313aa7efb0094fd7bbda9f65701a9f44f02a9fd030091f30302aa4203f8b7f40308aa330200b4L8;FFc00", + "35fd6e2001836260040f987805ff8060000f9a7801ff8c0035fd61f2003d5c2001036260040b988c05fb8060000b9a8c01fb8c0035fd6020100b44efc41d3BBL8;FF1f000014a02301d16f4e0094f80301aae0f2073659000014f8031faa57000014680b0091b8831cf805000014e80b41b2a0831cf80200", + "0014680f0091a00301d1L8;FF69620e9168ca13916c4e42f9e92309a968420e91694a42f9e85300f96e5242f9775642f9761642f9781a42f9681e42f96a2242f96b2642f96d2a42f96f2e42f9L16;FFf60742f9e1031cad6083c23cdf0600b1e00b1dad40560054e82344b91f810771e0550054f4c341f99", + "f0600b140020054e1cf41f93f0400b140010054810000b4BBBBL8;FBa4e2a9382dc28cfc233fff9970e011ba83e2a27c2d97cce9733a9e4aa29aadaeace7eb39784a9e12a28c8ee578940000aab5409a1f48b911523a9cc27b6f7594L8;FF081540d2080d088b0825019109fd46d30800098b080500911f0", + "109eb89040054140114ab230100541e000014f4031faae00313aa080c45f81f0500b1c1fdff54BL8;FFa00a40921f1800f102240054a17e035321240034280400511f390071c806005489000010ea6a683829090a8b20011fd6a03500b5a02302d106edff97e0140036L8;FF80a20091e1630091e2030091", + "31e6ff9728008092a80200f9f44f45a9f65744a9fd7b43a9ff830191c0035fd6ff0301d1fd7b02a9f44f03a9fd830091010840a9BBL8;FF9e4b01942000805241028052824b0194ff8307d1fd7b18a9fccb00f9fa671aa9f85f1ba9f6571ca9f44f1da9fd030691f30300aae0430291f50304aaf40303aaL", + "8;FFff830091c0035fd6fd7bbfa9fd030091082440f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b140040054L16;FFe94b00f909f840f9e98300f9a0a600541f050071e1c700548800805209008092790a00f968220039690200f98dd9ff97310f00", + "14280c40f9e8fb00f9281840f9BBBL8;FFe80f41b2e80700f9e023009150760094e90300aae90700f9a1ffff9021203f91a3ffffb063c00791e023009102028052e4018052d5750094e00740f9f44f4ea9L8;FF6a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e", + "1230091ebb302a9ffa700a929008052eaff01a9e9230a29976b0094BL8;FFe8a70039e91300f9e083009150f6ff97e10300aae00301aaf44f49a9f93340f9f65748a9f85f47a9fd7b45a9ff830291c0035fd63700805218038052a80640f9L8;FF21cc7492214000d13f0002ebe0279f1a0800001463141a", + "127f003f71a1f9ff54001040f91fcc74f22101005420008052c0035fd620cc749200fc44d3000400d1BBL8;FF800100b4e1d342f9e8cb42f91f0101eb406b0054e8cf42f9090180522a04009109692138e1431691ead302f99a0d0094df0600b18000005480c20291e1431691L8;FF2d2a0094e80356b9e0", + "0740918100805200001891ff0316b9e83f00b9262a0094e80356b9e00740918100805200001891ff0316b9e83b00b91f2a0094e80356b9L16;FF023f8052f3af0094ff430e91fc4f41a9fd7bc2a8c0035fd6ff0307d1fd7b19a9fcd300f9f44f1ba9fd43069128f840f9f30301aaa20f00f95f0008eb6106", + "0054BBBBBL8;FB6b65790000000000a1104000000000004d000000000000005f0300001c00000073657373696f6e5f76657273696f6e72656d6f74655f6964656e746974795f70L8;FF29e11b91e80700f9e8230091e2fdffd042bc2391e3430091e82701a983930094fd7b42a9ffc30091c0035fd608fef", + "ff008913a91e00301aae10308aa62028052BL8;FF00e02d919d13019400ffff9000202d919a13019400ffff9000e00e9197130194e00301aa01ffff9021402e91a200805273130114fd7bbea9f30b00f9fd030091L8;FFf66f42f9e47342f9e007409121fdffb021ac399100401d91e2018052e30316aa77", + "0a0094e1074091e20b40916062049121401d9142c00e9126eeff97e16b42f9BBL8;FFf44f5ea9f6575da9f85f5ca9fa675ba9fc6f5aa9fd7b59a9ffc30791c0035fd660fffff00080229163fffff06320119164fffff084202391a24700d1c1048052L8;FFe20313aae17740f9081540f900013fd6e06b01", + "f9e8c31791e16f01f9290c40f9e1830b9120013fd6fcfb42f99f0f00b1810d0054a8008052a5ffff17e03fc13dL16;FF98fe63d319693538d5120091750a00f9d80000b5f403172a680240f9bf0208eb8102005411000014680240f9f9621932bf0208eb61000054e00313aa3cd20094BBBL8;FFe0230091", + "6b290094e80b40b9681a0037e80f40f9ea0640f9490108eb43290054ea0240f9e00b40f94801088be82600a9680240f9080540f9170100ebe2000054L8;FF9f0600b100b8ff54f5bf49f9f3bb49f9b51300b47622009104000014b50600f1d662009100130054c1825ff881ffffb4c00240f922008052df7", + "70094f8ffff17BL8;FFe00313aa144440f99f0600b180fbff54135449a9550800b47622009104000014b50600f1d6620091a0070054c1825ff881ffffb4c00240f922008052def70094L8;FF12000014732200917f6200f180010054a000138b000c407960ff2f36080780d2600c8092e2830f32010000d4", + "c0feffb6000080d21f000039007d20d4b5221d91BBL8;FFe10740910232805200c0359121802f91f4432591ef370194fc074091e00740919c83099100c0359188830e916aa80094e0074091e10740910232805200800191L8;FF21fdffd021203f910202805263fdffb0630c17919e000014e04305f9e003", + "2a9121fdffd021203f910202805263fdffb063481791c40280529600001448008052L16;FFf40309aaefb70094e00314aa21008052e8b70094605800b4e10318aae20314aae05f00f9ebb70094fb00001428008052e86300f9fb0314aaf96f00f9192000b4BBBBL8;FB6c655f72617463686574696e76616", + "c696420726563656976657220636861696e206d657373616765206b6579735369676e616c5f5051434b415f56315f4d4c4bL8;FF42200c918d83009440008052e10318aa8183009440008052e1031faae2031baae30315aae4031faaf0e6ff97e3fdfff06380229120008052e1031faae2031faaBL8;FFa0", + "0302d1e1031faaa80315b8e8e742f9e2031f2aea1700f9e80f00f9e8d345b9e93700b9e82700b9e8031691400707adbb0318f8b58318b8e31c0194e88345b9L8;FF08fdffb008493b91ff8b01f9ff9301f9ff9f01f9ff9b01f9ffa701f9ffb301f9ffbb01f9ffc701f9ffcf01f9ffdb01f9ffe301f9ffef0", + "1f9fff701f9eaff01f9BBL8;FFe10240f9340080399400f8b728040091490400d1110000145f2800f1880000542800028b08f1df386804f837a0c300d160f9ff97a8035db8a8140037a8035ef8L8;FF2007c03dfc430f912283c33ce8b341b9e0430691810f803debc741b901048052e002803de9cf40f9e", + "a9741b980c38d3c800fc03d821f803d4047803d801fc03dL16;FFe92344f9e8ab01a9ea2744f9e82b44f9e8ab04a9e82f44f9ea3344f9e80b00f9e83744f9e84300f9e83f44f9e8ab06a9e84344f9e8af03a9e84744f9e9a302a9BBBL8;FFf4670194e82300910083009173640094f80f40f97801f8b6fc0", + "31faae0031caae10318aa7c63019437008052e82300910083009169640094f80f40f9f8feffb7L8;FFe00313aae10317aae20314aa08070094770a40f9cfffff17a8831ff8a84300d1290000f02921119180fdffd000440691e8a700a9a82300d1c2fdff9042a03991BL8;FF840080521a000014e00300f9", + "a1feffb0218c1491a3feffb063901391e0030091c20080524400805211000014c80080d2e0230039e00300910800f0f2ff270039L8;ZDBBL8;FFe90702f91a00f0f2a2230194e81f40b9e8030639e10740f9c1f7ffb527feff173c008052e8430691e0430f9165bcff97f82740f9e81f40f91f0308eb6100", + "0054L8;FFc00240f922008052eb270094f3ffff17680240f9c80000b40805088be00314aa0201805201ed7cd3e3270094745643a9350200b49682009104000014b50600f1L16;FFeda70094ab835ff8e0c20191f3031f2afb031faaf91b40f926000014140100b4e00313aae10314aa22008052f3030caae", + "1a70094ab835ff8ec0313aa7701198bBBBBBBBL8;FB6c6564202d3e2043743253616d706c6564002f72757374632f343861323239636561656664343938356335303939306231343131366236643835366166303938L8;FF720800949c0700f11400144aa00400546026407861274078e8fedf8828020035", + "280340391f050071c1feff54e2031f2a5c08009408fc78d309fc60d3087b6878BL8;FF08050091280800f94b0200b5e0030caa7a000014e10300a9e00301aae10308aa22008052f4030caaf0050094e10340a9ec0314aa2aa040a9290040f90bfc63d3L8;FF37008052ea3b40b9eb5f4139fbf343f828410", + "82ae9f344f8f67344f8eba300395a8108aae91300f9580100b50d000014e017c03d1aff48d3f703182ae00b803dBBL8;FF26ffff17a0c300d12100805222008052230080522400805257edff97a8035ef891feff17a0c300d122008052230080522400805250edff97a1035ef8f8feff17L8;FFb6faff977", + "60a40f9680240f9080116cbbf0208eb48060054680640f9e10314aae20315aa0001168bea610094c802158b680a00f9f44f43a9f70b40f9f65742a9BL8;FF000300543f080071e1030054888244f81f0500b1810000549fde04a99ffe05a997fe06a981220191e20313aa66f1ff97400200b467000014e10", + "314aae20313aaL8;ZDBBBL8;FB6d652d7072652d6b6579736f6e652d74696d652d6b796265722d7072652d6b6579736c6173742d7265736f72742d6b796265722d7072652d6b6579736964656eL8;FF678fff977f0600b18000005480220291e1630091eba4ff97bf0600b180adff5481220491e26300914", + "0008052e9a2ff9767fdff17e8031faa000117ab02650054BL8;FFd6020a0a1f01096be0179f1a02170194887a4039697a4039f503002a1f01096be0179f1afc160194887e4039697e4039b302000a1f01096be0179f1af6160194L8;ZFBBL8;FFe82700a9e8030091090000b029410491200440a9e82701a", + "9e8230091e82702a9e3430091813d0194fd7b43a9ff030191c0035fd608200091200440a9e9230091L8;FFfb0302aaf30301aa28004b39f40300aaf8830d91f90308911f1100714d0200541f1900710c0300541f150071c1080054606641f9616a41f9290c40f9e8430f91L16;FFeb231ba9e82f46a9f057", + "0ea9f50316aaead700f9e4ab40a9e0030baaeb0303aaf00308aae8030eaaee031caaf9030baaed0304aafc4340f9e083803df8c741a9BBBBL8;FB9d0e8691221a34f2907934f234f200000100a421f64e4ea472c65987154357596fb299a42e0b5a2e5fe2fea5ca5700009cb37d55b2cc0d77708da9fc9d0", + "e0000L8;FF69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff5400fefff000400491948d009400feff9000200c91918d0094fd7bbfa9fd030091BL8;FFe082c13ce2e3823de82b00f9e1d3823de0d7823dfacb40f9da0e00b4080d8052f6c740f9537f089be6110194e00313aa", + "01018052df110194c00801b4080d8052L8;FFed110094e00313aa29eaff97ff0b4091ffc32791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0efc83de1f3c83de0074091e2f7c83dBBL8;FF610200ada2837bada103d93c620201ad6112803db60000b4e00317aae10316aa2200", + "8052e45101949f0600f16b020054e00315aae10314aa22008052de510194L8;FFe00318aa21008052ea510094200500b4e10313aae20318aaf60300aaed510094b3835df8acffff17e90313aaf54f43a9f75b42a9fb0f40b9f96341a9fc0340f9L16;FFedd10094e10313aa28ec40f9e80000b420f040f9f", + "30301aae10308aa22008052e5d10094e10313aa28f840f9e80000b420fc40f9f30301aae10308aa22008052BBBL8;FF6dfeff17e00313aa22008052230080522400805258fdff97610a40f972feff17e00313aa22008052230080522400805251fdff97610a40f978feff17e00313aaL8;FFe04316912200", + "805209110094e1d342f9e00318aa02feff17e04316912200805203110094e1d342f913feff17e0431691e1031aaae20318aafd100094fad342f9BL8;FF220080522300805224008052f4030baac7150094e10340a9eb0314aa2aa040a9290040f90cfc6ad35369283808050091280800f92cfbffb43f0108", + "eb73611932L8;FF4210422a4220422a4240422a46040011c200220a427c051b427c1b5399486238e20303aa3907005139771e5325070011240b001163d865781f0003eb9980991aBBL8;FF48310054e6010014e1d342f9e8cb42f9f4074091948209911f0101eb40880054e8cf42f92a0400918022029149", + "03805209692138ead302f9e61d0094e1431691L8;FF60000054e002039100ecff97f35353a9940100b47522009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f922008052df310094f8ffff17L16;FFf30301aae20700f95f0008eb410a0054f70303aa788c40a9748643a9f60302a", + "af50300aae20318aae00314aa8aad0094e81f80521f01206a4004005488018052BBBBBL8;FB656e67746873657373696f6e00000000dc1a4000000000005b000000000000005200000009000000560b4000000000007500000000000000390000002e000000L8;FFe203142a680100b0080140391f050071", + "a0faff54f303002af403022a6b000094f503002ae003132ae103142a67000094e103002ae003152af44f43a9f51340f9BL8;FF08fd46d308050091092440f93f0500b1400400540a2c40f9093840f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b4L8;FFc10b0", + "054e8d340f923fdffd063603d91e0431391e1031aaae2031caa190140b9c4018052760c0094fb6f42f9e17342f9e807409108411d91e0031baabe180094BBL8;FF000400ad810000b4801e40f922008052e9590194e90340b908048052964e01b9885603a93f050071882200f941010054e803009100017e", + "b2e6550094f50301aaL8;FFe02fc13de133c13de237c13de9f342f96826089b0dfcff17e8c31291fb8302910081c03ce86742f9a003983ca80319f8e80000b0081140f91f0d00f143070054L16;FF802100b5e1031faa812200b5e8af40f91f0114eb290a0054a0c303d1cfe6ff97c021003728fc60d3080", + "e00b5200840921f1800f1020e0054217c0353210e0034BBBL8;FF4b692838080500911f0048f1280800f9a202005400fc4ed354000014e00700f9e00301aaf30301aae10309aa220080522300805224008052f4030b2a4e050094L8;FF61000054e8031faa0d000014000302914a2a0094080040b20811c0", + "da081540d2080d088b0825019109fd46d30800098b080500911f0109eb499d0054180116abBL8;FFe40315aaebffff17fd7bbfa9fd030091010040f92f0000941f0400b161000054fd7bc1a8c0035fd67bf50094fd7bbea9f44f01a9fd0300916bfc7bd3f30300aaL8;FFa083dd3ca8835ef8e91b40f9ff0", + "300f9e083803ce80f00f9c90200b517000014e003152ad60c0094e8830091090000b029b10091a8273fa9e8030091a1fcfff0BBL8;FF892e4b29882a02292809c05a6909c05a88260329884640f909208052800640ad282508aa080dc0dae00700ad9f2203a9820241ade20301ad7a35019400e4006fL8;F", + "F2221c03d18000014c80080d2e0830e91e38324910800f0f2e4032a9121fdfff021a0389102018052e98b0ab9e84305f96a050094f6e741f9e8df41f9f7032a91L16;FFea7202f8e203c23de8ff43f9e9030caaebbb01f9eba35f39e48715ade107c23df4bb43f9edbf43f9f9c343f9fec743f9eecf43f9f", + "2d343f9f1d743f9e0db43f9BBBBL8;FB6a00000000000000bd0000002e000000496e646578206465636f64696e67206572726f7244617461206465636f64696e67206572726f7247656e6572616c2064L8;FFff0216eb940a00916907c05a09793a78aa0a00f980fcff54c80e40929b0240791565b89bba0", + "a40f9a80240f95f0308eb21feff54e00315aa3fe0ff97eeffff17BL8;FFed090194e063c13de167c13db47e0853e8a345b93c008092e00718ade82303b9e00758ad955e1833e82343b95c0300f9550b00b940c3803c41c3813c482f00b9L8;FFfd830191f50300aae8030091e00302aaf30304aaf70303aa", + "f60302aaf403012a07c9fe97e8630091c042009104c9fe97730100b4e3090094e00313aa21008052BBL8;FFf40f00b9f403172af7031caafc031aaafa03182a384340f9ea490194e00316aa21008052e3490194400b00b4e10318aae20316aaf90300aae6490194f8031a2aL8;FF1f0009eb29060054e80f", + "41b2e80300f9e00300914e50ff97f44f45a9f52340f9fd7b43a9ff830191c0035fd6f503012a74040051e00313aa56050094e80300aaL16;FFe8ff41f9f7bb42f9f1bf42f9f4c342f9e3c742f9e82b17a9e80342f9ea0b42f9edcb42f9e9231fa9e80f42f9e90742f9e8cf00f9e81742f9e8c300f9e81b42", + "f9BBBL8;FF602a40f922008052eb69019408048052746200b9a00302d168da04a9e3830291e10315aa682e00f9330080520204805224008052f3830239f6190094b42240b9L8;FFf30b40f9fd7bc2a8aefeff17602200917800009460220291f30b40f9fd7bc2a8a8feff17610640f9810000b4600a40f92", + "2008052e0690094611240f9410d00b4BL8;FF081100919fffff17e00300f9a1feffd021cc1291a3feffd063700e91e0030091420180528401805212000014e00300f9a1feffd021cc1291a3feffd063300d91L8;ZFBBL8;FF2083ca3c6183893c2183cb3c60838a3c2083c43c61838b3c2183c53ce85301f", + "9c86a40b9e00704ad2083c63c2183c73ce82b00b9e8430691e00705ade10240adL8;FFe00b1eade08754ade0071cadf1000094e00745ada88301d1e0830d91e1030e91e0071cadaf250094e08752ada80302d1a08301d1e1030e91e0071cadab250094L16;FFfd7b02a9f44f03a9fd830091010840a98800", + "8052f30300aae023009104018052050e805229f87fd33f1100f13481889ae30314aa74000094e80740f91f0500f1BBBBBBL8;FB726f6f745f6b6579d41b4000000000004800000000000000c800000016000000617474656d707420746f206a6f696e20696e746f20636f6c6c656374696f6e20L8;FF881a", + "00f951a5ff97f44f4da9f6574ca9f85f4ba9fa674aa9fc6f49a9fd7b48a9ff830391c0035fd620008052e10315aa79990094000180520130805276990094BL8;FFa5fbff97b73240b9b70c0034e80240b20811c0da081540d2080d088b0825019108fd46d308050091b60a40f9f60b00b4c90240b22911c0", + "da291540d2290d098bL8;FFfa3740f92841082ae91346b8378108aa611200b4e00318aa8f000014bb0000b4e00319aae1031baa22008052e21d0094a1035ef8810000b4e00318aa22008052BBL8;FF5b02805219f17dd30b000014e8bf40f9e10316aae20315aa0001148bed5d01949402158bf4c300f939", + "6300f15a630091c0050054e8bb40f956d77fa91f0114ebL8;FFe3833291e4c31791e2008052e9fb05b9e8fb02f992fdff97f3f742f9e8ef42f97f0208eb61000054e063179116fcfe9708068052e9f342f9e07fc13d6826089bL16;FFf65742a9f85f41a9fd7bc4a8c0035fd6e8031faab60a40f976f4ffb", + "5b41640f9e803088b54f5ffb5e00308ab23f6ff54a0feffb000a03f9190d90094e00313aaBBBL8;ZBL8;FFf97b49f9e00b843de0afc43de3f3863de8e34df9e10f843d0183c13ce013843d0083c03cf8031baa08011bcbf66309f93f0308ebe09b843de19f843dfb6f09f9BL8;FF6002f8b7c8fefff008c1", + "0291d45601a9c84e00a9f44f42a9f65741a9fd7bc3a8c0035fd6e10300aaa3fa7f92e00316aae20315aae40313aae50314aaf44f42a9L8;ZFBBL8;FFe90300b9a91b40b9ea0b0079ea234079691200b8a9b341b86012833ce00741ad690600b9e90340b96a120079ea0f40f969a200b8e90b40796182823c", + "6082813cL8;FFea4340f9fb0315aaf85b00f9be000014a82247b8e9af4779eaf741f9eb474f39ece34779e81309b9e8f341f9e92b1279e9ef41f9ea4305f9ec1315798b130036L16;FFe20713ad2181c53c699346f89b8208aaf40319aae8cb43f9e9bb01f9e93f44f9fa5f44f9e8f200f8e85b44f9ec634", + "4f9e9a301f9e95344f9e16744f9e85300f9BBBBL8;FB777a836bc6f00000459b00000000000000000000000000000000000000000000a28ce26db48f000056e2000001003110ee88093799c3175d175dd5f6fb9cd8e5L8;FF202000b5230300143f8b00f1201500543f9300f161060054f70314aae98d009", + "4006c805201018052e28d0094006500b4f30300aaf4031faa8804805215feff90BL8;FF63741191e85306f908000014e05306f9e0833291e1feffd02178129142028052e3feffd063c0129144018052d7130094e15346f906000014e80f41b2e0833291L8;FF602601a9f44f45a9f52340f9fd7b43a9ff83", + "0191c0035fd620008052c10180527d090094ffc301d1fd7b03a9f85f04a9f65705a9f44f06a9fdc30091350840f9BBL8;FFe80300aae00740f929008052092000a9fd7b44a9ff430191c0035fd660ffffb000c02b919849019460ffffb000202c919549019460ffffb000802c9192490194L8;FF08fd46d3", + "16050091770a40f9570900b4740640f9f8031faaf90317aae00314aaeafcff97080040b20811c0da081540d2080d088b08250191081848abe2090054L16;FFf87700f91f190071a1200054c80100d0e00309aa081140f9e9cf40f9edeb40f91f0900f1a9060054880100f008011591e97740f9e8ef01f968", + "fefff008611d91BBBL8;FFa9b317b8ab031af8a8831a3881070054885a40f98b6e40f9a9035af80a1140b8150140390c5140781b7140f81cf140f87f0500b1ea8300b9aa835a381a7141f8L8;FFfa9701b92183813c2083823ce10245ade81700f9e80b40f9e9a319a9a80302d12183833c2083843cb31bf", + "f97e11b40f9e21340f9e843069163a3039164230391BL8;FF081500913f0108ebe10e005481220091e20313aa89090094f50300aa390200143f0900b120130054880080d20800f0f2080900d13f0108eb8112005481220091L8;FFc0035fd6c0035fd6fd7bbca9bf2c40f2fd03009181030054f35301a9f4", + "0300aae0f77fb23f0000eba8030054f55b02a9f303032af603022af503042ab3032037BBL8;FFfa110094e1d342f9e00316aaccf9ff17e043169122008052f4110094e1d342f9fff9ff17e0431691e1031aaae20318aaee110094fad342f9e8cb42f908011acbL8;FF94c8fe97e0234fa9f4e302f9081140", + "f900013fd6e0e702f9e8074091e1eb02f908011891290c40f9e163179120013fd6fa034bf95f0f00b141080054c8008052L16;FFf77742f9e86342f9e26f42f9e47b42f9e10315aae30317aa808610ad828e803df46742f9f67342f9e84702f908140094b60000b4e00317aae10316aa22008052BBBBBL8;", + "FB2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b6c69627369676e616c5f636f72653a3aL8;FF4a01084a6b01084aaa631638aa9356382901084aab731638aba35638a9831638a9b356384a01084a6b01084aaa931638aac356382", + "901084aaba31638abd35638BL8;FF4a2501914afd46d34a05009111000014e9031faa10000014f5031faa681a40f948f6ffb5f6031faa770a40f917f7ffb5e80317ab23f9ff5400ffff9000400f91L8;FFa14700d1d526961ad2ecff97e8030e91e1431391e003162a50c2fe97e007409161220391e3030e", + "9100401d91e203162a92050094e8ab4bf91f0900b1416c0054BBL8;FFfa2700f9df0600b1e10000541f000014f42740f9f66740f9fa2700f9df0600b140030054a8035bf8fc6b4da91f0119eb40210054a8835bf82a070091a14301d1L8;FF482500a968390c91a98358780c0100f9e8031691e9df0679b1", + "f0fe97f88345b91f07003160080054e8e20b9120c3c13ce98745b9e86f04a921c3c23c1f0b0071L16;FF60feffb0000c1a91e8cb03f9e1432d91e8d303f988feffb008411991e3431e9162008052e9cf03f9e9d703f9e8db03f95edcff97e22740b95f080071c3000054BBBL8;FFe20315aa0001178bf275", + "0194e802158b680a00f994a201919f0218eb601e0054610a40f9680240f91f0101eb40110054680640f929040091e00314aa690a00f9L8;FF610d0054f9031faa75000014e1d342f9e8cb42f91f0101eb806f0054e8cf42f949098052f6074091d6820991f4031baa0969213828040091f87749f9e8d302f", + "9BL8;FFedf50094612640f9810000b4602a40f922008052e8f5009460a20191f30b40f9fd7bc2a8e0fcff17fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4L8;FF03290091440400f9620240f9820000f9227863f87f0202eb200500547f7e00a97f0200eb2005005460424079002c46d31fbc", + "0071ed070054611240f921cc74f2BBL8;FFe80180520900809268220039e0430691690200f9b1100094a80600d11f0900b142140054e0031baae10315aa22008052e13501949d000014f3031faae8031faaL8;FF02f0ff97c80080d20800f0f21c450091a2000014e84745f9e94b45f920fdffb000c01091", + "e1832491e84b03f9e8431a91e94f03f9c9fdfff029611291e89304f9L16;FFe00314aa22008052ebb50094e90315aadf0600b1f7430d91a0050054e8fb42f91f0500b1a00800546083ca3ce87b00f9e0831d91e8e35739695f40f9e1c30391BBBBL8;FB42024000000000006a00000000000000550100002", + "a00000042024000000000006a000000000000005e0100002e00000042024000000000006a00000000000000L8;FF2801088b49010b8b0801098b090140b22911c0da291540d2290d098b292501910819498b15050091f60314aad30e43f87f0600b180fcff54e00316aa39f3ff97BL8;FFea9740f9e93342", + "f908e10c91f6bb41f9fbbf41f9000545ad5f0500b10231c03df5c341f9f7c741f9e95305f9400705ad000543ad4233803dffa71139400703adL8;FFe1030eaaef0310aa7afdff17e87a40f9c80000b40805088be00315aa0201805201ed7cd3e40500945a008052d6000037e00f40f9e10340f9330100941", + "f000071BBL8;FF490080d20900f0f21f0500716c080054e08744a988090035e90f41b25000001408008092686a00a955000014e8134bb8e9b740b95a0080d2ea6740f9eb4340b9L8;FFfd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aa810000b4600640f922008052e2450", + "094610e40f9810000b4601240f922008052L16;FFf00315aa2bf7ff1756450036e86345f9e96b45f9ea7345f9ebbb45f9e00bc33de85300f9e86745f9e027833de8df00f9e86f45f9e8af00f9e87745f9e9a310a9BBBL8;FFab000054609a40f9e10308aa22008052e96501940800801274d612a9749e00f", + "9684201b9f44f42a9f50b40f9fd7bc3a8c0035fd6ff0302d1fd7b06a9f33b00f9L8;FFdf7e04a9f7ff05a923feff97e0060036212c00b5992240f9881a40f93f0308eb6100005480c200913104ff97881e40f9e083c33ce0031faa2823189b000d803dBL8;FFd6f2ff9780000036010a00b5e0031faae3ff", + "ff17a80640f9190101ebe200005480000014e20313aa230c805275ecff97e10300aaa10800b5a80640f91f0119ebL8;ZDBBL8;FF01f57ed342008052f30b40f9fd7bc2a8e9250114f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091092040a9f30300aaa80000b4600a40f901f97fd3L8;FF9f0", + "208eb08040054f7031faa08011fcb9f0208ebe8040054340100b4680640f9e10315aae20314aa0001178be9250094e802148bb502148b680a00f9081340f9L16;FFc92e40f92b0bc05a4a0108cb5f7d00f12b6921b8c83200f9a8fbff54c0420191e10308aa020480522300805224008052bfc9ff97c9a24", + "5a9d5ffff17c0420191" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines10 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines11.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines11.lean index 7c37ed299..0391507a4 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines11.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines11.lean @@ -27,358 +27,250 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub11 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF1831899a19f37dd314230091930219ab43120054f8000014c806009100e4040f130040f914fd43d31f0940f2ea0313aa8906949a410140fd290500f121a8200eL4;FF7361193240020054536928380afc71d308050091290040f9280800f9aaf6ffb43f0108eb93611932600300542b04", - "40f900fc78d37369283808050091280800f9L8;FFf40300aae103022ae20313aa2001088b611f0194e00314aae10315aa010400f9f44f42a9f65741a9fd7bc3a8c0035fd680020090004019915f1f019480020090BBL4;FFb4feffb49f0600b1c0190054e00319aae10314aa22008052619f0194eeffff17", - "e13b40f9810000b4e03f40f9220080525b9f0194f4e740a9f30318aae14740f9L4;FF7f00006bedfeff54606c1c53e101809220c020cb6102008b766a60f8c00a40f93f0000eb80000054000080d21f000039007d20d4c5824039a11000129f00016bL8;FFffc30091c0035fd6ffc300d1fd7b01a9f31300", - "f9fd430091130040f9e00301aa810100d021c81b91e803009142018052a79f0094810100d021d01391a40100b0BBBL4;FF1803008bf9feffb50f0000141f0400b10178005485df01941f10003181770054f9ffff1782df0194f70300aa1f0400b141fdff54e0430591810080527ddf0194L4;FB642076616", - "c7565202872657175657374656420c00a20627574206f6e6c7920c00b20617661696c61626c652900015cc000c0002163616e6e6f7420616476616eL8;FFe01b00f900a940f9e07b00f900ad40f9e06300f900b140f9e0d300f900b540f9e06700f900b940f9e0ef00f900bd40f9e05700f900c140f9e06f", - "00f900c540f9BL8;FF740e00f93f0400f18b000054601e40f922008052625f019408008092681a00f9f44f41a9fd7bc2a8c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaL8;FF6a0a00f9f44f42a9f50b40f9fd7bc3a8f7fcff17e8031faa94fcff35e003088be10313aaf2fcff9775fdff346", - "10a40f9680240f91f0101eb60020054680640f9BBBBL4;FFe0630191d56101d10800f0f2e82f00f952e8ff97e0630191e10315aad39b0094e08743adc282c33ce9ab45a9e83740f9e08701adc082c43ce28300ad05000014L4;ZFL8;FFe00301aae10309aa22008052230080522400805213160094e10340", - "a92aa040a9536928380cfc5cd308050091290040f9280800f90cfeffb40a7c15533f0108ebBL8;FFb47f0194010300d0213029912403009084a02391a363009182008052b30f00f9ac7f0194ac7f0194fd7b41a9f31340f9ffc30091c0035fd6ff0301d1fd7b02a9L8;FF938248f8490a805209692138280", - "400917f0600b1e81700f9c02f00548022029138edff97080040b20811c0da081540d2080d088b0825019108fd46d30900088bBBBL4;FFc9f20cf8cb720df8687301f86af301381f9a009440030037f7a201f1b5a2019118070091c1fcff54e80340f9e9234039e0031faae81300f9e9a3003908048052L4;", - "FB7874000000000000447c4900000000002d000000000000009f00000009000000447c4900000000002d00000000000000a2000000090000000000000000000000L8;FFe00314aa027480526dbf0094ffc31491f44f42a9fc0b40f9fd7bc3a8c0035fd6fd7bbda9fc0b00f9f44f02a9fd030091ff0314d1f", - "f0300f9f30300aa02328052BL8;FF155040a9f60300aae063009102048052f30303aa81e2009180ffff97886a40b9d40a40f9e00313aaa81b00b9e8430191b167ff97e82b40f91f0500b1c0000054L8;FF830700544d1dc039ae1d00128c550e0b8c0148518d00f83761710c8b0b018052140000148d7d1c", - "53ad0600340d00be528d010d0b4c2180396b710d8b8c00f8b7BBBBBL4;FF21682c91230400d063d42c91a0c300d1420180524400805209000014a0031df8210400d021682c91230400d063302991a0c300d142018052840080528b040194L4;FFa2000090424c3091e30280522a030094e8db51f91f0900b", - "1e14d0054e0431391b0edff97b80000b4e0c740f9e10318aa220080525a0f0094e0e30e9121edff97L8;FF08008012a80200b9a042803c810240f981feffb5f44f45a9f52340f9fd7b43a9ff830191c0035fd6ff4301d1fd7b03a9f32300f9fdc30091f30308aae00700f9BL8;FF883300f9830b803d97fd", - "ffb5287f40f91f0500b1400300543c8740f9371341b9381741b9282341b9e82f00b9fc0300b4348340f9568f0194e0031caa21008052L8;FF678f0094f8ffff177f820039f44f42a9f50b40f9fd7bc3a8c0035fd6ffc300d1fd7b02a9fd830091e90301aae00300f9810100b021980c91e8230091e00309a", - "aBBBL4;FF000180520146805272cf0194ff4304d1fd7b0ba9fc6f0ca9fa670da9f85f0ea9f6570fa9f44f10a9fdc30291130c40f9892489d24992a4f26ae279d32949d2f2L4;FBfdf629516faeee4ad4ecdfdda65d48eae5dcd4ad5fc2e658d11ba28c32aeb5b9910b428b00009f809101d374fd52e29820", - "abd553bd94d2cddccc442fb1c65491L8;FF68018052f57b40f9e8270ea9ed0740f9ee3f40f9e56f40f9e0f3803de193803df1a34ca9f7ef49a9fc0748a9ea6341a9f9fb42a9ebb344a9e0bf46a9e69f43a9BL8;FFc0035fd6624f0194c000805221008052604f0194c00200b4a8cc875289c78d52e9cdad7", - "208080079c8008052090000b9680200a9680a00f9fd7b43a9f32340f9L8;FF22f18f3ce9670c912283c53c20f18f3c2083c43ce9a70a9121f18f3ce9e70a9108e10c9120f18f3c2083c63ce9270b9122f18f3ce9670b9120f18f3cc082c73cBBBBL4;FFe00315aaea0301aae103142a2b0080526a0600f96", - "b420039e4ffff17fd7bbca9f85f01a9f65702a9f44f03a9fd030091150c40f9f50500b4140040f9f30300aaL4;FB2e00000000000000a90000000e000000484d41432d5348413235362073686f756c642061636365707420616e792073697a65206b65790000ea98480000000000L8;FF880f00b50808409", - "21f1900f1c20f0054017c0353e10f00343f040071200200543f08007101040054890248f83f0500b1a10000549f6608a99f7e09a9997e0aa9BL8;FFe10200d021f42a91040300b084a01e91a32300d142028052a8831ff8ad6f0194e10200d0213c2b91040300b084201f91a32300d162028052b3831ff8a", - "56f0194L8;FFe8cb42f908011acb1f0308eb48430054e8cf42f9e10319aae20318aa00011a8b676f00944803188bf90b40f9fa0740915a830991e8d302f9f88b49f9b80300b4BBBL4;FF29210091c001098be7ffff1709c201d12a0080920a2500a9f44f43a9f51340f9fd7b41a9ff030191c0035fd6e903", - "00d029010091ea230091e02700a9630300b0L4;FFff0740d1ff071ef83b008052f30308aaf5031faaf9031faa34008052180082521a02a0521b02a07217008252e1030091e0031f2ae20317aa7f120094000700b4L8;FFe00317aaa8031ff8e8830691020301ad9a270094e8d340f91f0900f160040054e1", - "830691e00315aa0232805264af0094a0820791e14300910232805260af0094BL8;FF9642009177028052980200d0181315910600001422008052612f0194b50600f1d6c20091c0030054c1025ff8280041d21f8d00f10831979a1f6d00f108ffff54L8;FF030000141f40407156379a9aa80357f8080115c", - "bdf0208eb28040054a88357f81f0002710801158b03fdff54e90f80121f00207109140033c20000540a7c0653BBBBBBL4;FFe00313aaf44f41a9fd7bc2a864170214f44f41a9fd7bc2a8c0035fd6010040f9810000b4000440f9220080525c170214c0035fd6010040f9810000b4000440f9L4;FFe343139", - "1e00313aae2008052e3f2ff97e0830891252afe97e16b02f9e343139122028052e06f02f9e00313aae17302f9a10000d021002591d8f2ff9754170094L8;FFe20313aaf50300aa6d170194020000143500805268fe4ad309088052954e00a90811c0da280108cbe90080521f1d00f10831899a2900805228", - "0908aa932201a9BBL4;FFe1e20191a2e300d13081ff97e0ebffb495000014bf6335a9bf0316f8e1220191a2e300d12981ff9700ebffb4af000014bf633ba9bf031cf8e1a20291a2e300d1L4;ZBL8;FF810100f021581991e8030091e00309aaa2008052ae97009468a200918101009021481491840100f08", - "4600991e0030091a3630091a2008052a80f00f9a5970094BBBL4;FFf303032af503022af603012ae50700f9e61300b99aaf0094f70301aaa100f8b6f9031faae00319aae10317aa69d70194b70500b4fa0300aa55d70194e00317aaL4;FB69616c206572726f723a20c0001545787065637465642030206f", - "7220312c20676f7420c0002163616e6e6f7420616476616e63652070617374206072656d6169L8;FFfecb00f9eb1b03a9e8e700f9fab300f9fbab00f9fb0314aaf4030faaec8700f9f6bf00f9f60307aaf54712a9f5030aaae44f00f9f28f00f9ed6300f9ee3700f9BL8;FF67570194b30000b4e07b49f9e", - "10313aa2200805262570194e18349f9810000b4e08749f9220080525d570194e80740910881099100c10391010c00940ffeff17L8;FF630c805257ecff97e10300aac0faffb478010014e8534cb948000037f62b06f9202a00b5a02302d160f4ff97e80301aae0010036882a00b5e1031faacaffff17BBBB", - "L4;FF00001a917df70194ff8302d1fd7b06a9f85f07a9f65708a9f44f09a9fd83019109904039f30300aaf40308aaa90100343f0d0071c1070054602241a9090d40f9L4;FB7369676e616c2e70726f746f2e776972652e7273002f72757374632f3438613232396365616566643439383563353039393062", - "31343131366236643835366166L8;FFe10300aa00feffb5a80640f91f0116eb29070054e00313aa1df7ff9740fd073728fc60d3e80600b5200840921f1800f102070054217c0353210700343f040071BL8;FF09a340b85f050071aa635478e8e30139a8135438e98300b9ea0b0179810200549f0700b1800", - "20054e84700b9e81740f9a02303d1ec0f00b9eb2700f9bce733a9L8;FFe15b813de8e30a7985000014e8d342f9e067c13de8a302f9680e00f908008092e04f813d6082803c680200f9ff0600f1cacbff54fb010014f7e74df9e8074091BBBL4;FF08050091f52740b98803088be80208ab620c0054e9f77f", - "b2f41f40b91f0109eb481f00544801805249008052e1a300910804003900028052e91f00f969a3ff97L4;ZDL8;FF40020054b600805212000014bf0208eb20010054f6031f2a22000014bf0208eb40010054560080520a000014bf0208eb61030054e0230091abb6009419000014BL8;FFc0035fd6a00200", - "b000e02e9167370194a00200b000c0279164370194a00200b0002008916137019408004039a90200b029813291e00301aa08711d5308410051L8;FFe8430e91e9d301f9694240f9e8db01f9688d4ff8ead701f9e9ab09a94ac14139090180521f0500b1686100d1e9e301f9eab300b9ebeb07a9e84b00f9f", - "fe701f9BBBBBL4;FFbe080194e30316aae80300aae90301aae00315aae403142ac8d40736c9d5ffb59bffff17e00317aab4080194e30317aae80300aae90301aae00316aae403152aL4;FF64070094400100b4155000a9810000d021403991130800f91f600039f44f42a9f50b40f9fd7bc3a8c0035fd600", - "0180520104805272070094fd7bbda9f65701a9L8;FFa9200091410200f021601b91430200f063201091460200f0c6e01a91a52300d1e00308aaa200805264018052a9831ff8b0070194fd7b42a9ffc30091c0035fd6BL8;FF4a194b8b4a0500916b2281b9cb0e00346b0140b26b11c0da6b1540d26b0d0b8", - "b6b2501916bfd46d36b0500916c8e40f90c0100b48c0140b28c11c0da8c1540d2L8;FF4100805263870094400d00b4fb0300aa5f870094e00315aa410080525d870094800c00b4fc0300aa59870094e00315aa4100805257870094c00b00b4f60300aaBBBL4;FF6b0000542200805265c701941f0700f1ab", - "000054e00319aae10318aa220080525fc70194df0600f12b010054e00317aae10316aa2200805259c7019404000014L4;FB65333634356363642f303639353962342f7372632f696e6372656d656e74616c5f6d6c6b656d3736382e7273002f636172676f2d72656769737472792f696e64L8;FFb50000b4", - "e06740f9e10315aa2200805263c700949f0600b1000b0054f50314aaff0600b1c00d0054e8eb40b9e0831d91e1c31591f7bb02f9f4831d91e88f05b9BL8;FF630e0054ff0208eb68080054340117ab420e0054f42300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889a15", - "2300a9f7fbffb5L8;FF2b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8bBBBBL4;FF137f02a91f4f03a91c6300b9282300f9e9030054281f40f9090d80523a2300f94823099b010140f93f04", - "00b1000300541bf141a9196943a914e144a9810000b4L4;FB000000000000000008000000000000000800000000000000804c420000000000000000000000000008000000000000000800000000000000704d420000000000L8;FF96ffff17e1031faae8df01b993ffff17e8af40f91b0101ebe2000054f3", - "010014a2c303d1430c8052c3e0ff97e10300aa401d00b5e8af40f91f011beb49060054BL8;FF20008052210080527d670194a0a300d1e10316aae20313aa2300805224008052735aff97b6835ef8b7835df8e80216cb7f0208eb89f8ff54a0a300d1e10316aaL8;FFf30300aa960100b4972200910400001", - "4d60600f1f7620091e0000054e1825ff881ffffb4e00240f9220080525c670094f8ffff17d50000b4a806158be00314aaBBBL4;FFe22a803da87f35a9e18206ad6af1ff9700e4006fe08209ade0820aade04ec03de152c03de256c03de35ac03de336803de232803de12e803de02a803d7f020039L4;FFfd", - "7bbea9fd030091f35301a9330000b0340000b073be40f994c240f97f0214eb89000054608e5ff800003fd6fcffff17f35341a9fd7bc2a85a0b0014fd7bbea9L8;FFa8f31438fc03082a82011ccb350302ebe3070054e10740f9f40319aaf90301aabc01003460021c8b3900028b64a70094a80357f8e0020", - "191a1c303d122008052BL8;FFe1030091e80b00f9e8830091ff1b00f9e82700a95f1a009420010035e00bc03de81b40f96002803d680a00f9fd7b44a9f32b40f9ff830191c0035fd6800200b0L8;FF20030054592f40f95b6340b9991100b4542b40f95e270094e00319aa210080525c270094c01300b4e1", - "0314aae20319aafc0300aa62270094542340f9b4031df8BBBBBBBL4;FFfd7b45a9ffc30291c0035fd6e92341a9ea0740f9480108cb395100a9280900f936feffb4080a8052e90a80d2c826089b08ed7c92c902088b212500b140fdff54L4;FFbca37aa9b5835bf8e01f803d5f0700b1600800546083c33c6", - "183c43ce80700f9e08702ade01fc03de013803da003983cb70000b4e00318aae10317aa22008052L8;FF28008052081000f9e80318aaa90216eb9402168bf533899a145500a9135d01a9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd60001805201058052701b0194BBL4;FF08011e4afe9f40b9e8e21", - "e38e8125f389c031e4afea340b9fcf21e38fc225f387b031e4afea740b9fb021f38fb325f3808011e4afeab40b9e8121f38e8425f38L4;ZFL8;FF2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7", - "bc1a8BBBL4;FFe097c93de10b07ade19bc93de23b883de017883d220341ade11b883de81200f8e02b883d210340ade89200f8e81201f8e82710f9e227883de023883de11f883dL4;FB6c696420766172696e74726563757273696f6e206c696d69742072656163686564696e76616c696420746167207661", - "6c75653a20300000006275666665722075L8;FFf5430f912e1c0094fbeb41f97f0b00f1e1220154e8ef41f9eaff41f9e9f741f9eb1f42f9f7f341f9f0fb41f9e84700f9e80342f9f10b42f9e11742f9fa3742f9BL8;FF000540ade893687915008092e8e30a79e057813de15b813d99000014e8074091f6b", - "345f90023009108810991599e0094e1074091e04316910242805221800991L8;FFa18301d1a82739a9a8c301d189fdffd029312491a8273aa9e8c300918f5b0094684e41b9290000b029411c91f52705a9e9630091aa0000f04a610391a80319b8BBBBL4;FF880800b4a00642a9e203019169f7ff9708fc7", - "9d3e1e7076fe9031faaba2a40a90d0a8052080d010ef95b46a918000a8a496b78fc208d282e0800669e0ec101f2L4;FB2063657274696669636174652069732065787069726564202865787069726174696f6e3a20c0132c2076616c69646174696f6e5f74696d653a20c00129002f63L8;FF890080d2480", - "08052e0e303390900f0f2e8e7033928017fb2e0c30391e87b00f950f1ff97e10300aae00301aaff430b91f44f45a9f65744a9f85f43a9fa6742a9BL8;FF612640f9741a00f93f0400f18b000054602a40f922008052617b0194613240f9742600f93f0400f18b000054603640f9220080525a7b0194613e4", - "0f9743200f9L8;FFfffbff17e06300912200805223008052240080521392ff97e11740f911fcff17e06300912200805223008052240080520c92ff97e11740f960fcff17e0630091BBBL4;FF800300f000000291820300f0424003914109805283bb0194800300f000a00391820300f042a00491a10f8052", - "6abb0194ffc307d1fd7b19a9fc6f1aa9fa671ba9L4;ZBL8;FFa22700d1c102805275bb009420008052011080526fbb009420008052010481526cbb0094ff4302d1fd7b06a9f65707a9f44f08a9fd830191280840f9f30301aaBL8;FF290d098b2925019129fd46d30801098b130500917f0209eb69240054", - "080c47f81f0500b1201d0054e2feff97080040b20811c0da081540d2080d088b08250191L8;FF210400545707003676b641f978ba41f971620e9168be41f96ac241f96bae41f96db241f96fa641f970aa41f9699641f96c9a41f96e9e41f977a241f9f45740f9BBBBBL4;FFe10313aa77f7ff97160100351", - "3000014e8031faa75feffb5e003088be10313aa70f7ff97b6010034610a40f9680240f91f0101eb00240054680640f909018052L4;FF681600f9f44f4ea9f76340f9f6574da9fd7b4ba9ffc30391c0035fd6ff8302d1fd7b07a9f54300f9f44f09a9fdc30191f40301aaf30300aae0230091e103022aL8;F", - "Ffd430091e80301aae00700f9410200f021003c91440200f084803b91e3230091e00308aae20180529f0b0194fd7b41a9ff830091c0035fd6e30302aae20301aaBL8;FFe8c700f92081853c09018052e8ff1ba9ffa31ca9e8030591e05b803de067803dffab1da9ea2701f9ea3f01f9e9d300f9a8831ff8b", - "4835ff8820640f9620600b4L8;FF750100d0b572039136008052e84b01f9e04f01f9ff5301f90b0000146802148bc903805294620091090100a9b5f20091090900f9f65301f9d6060091df7e00f1BBBL4;FFf80f40f9f703192af903142afa0315aa28008052020000143a008052f52b40b9e85f1829e953", - "4929f60309a9e8571a29e82f40b9e00b00f9e0830191e9231b29L4;FB636f64696e67206572726f7244617461206465636f64696e67206572726f7247656e6572616c20646573657269616c697a6174696f6e206572726f724572726fL8;FFe8e341f91f010ff181040054e8d741f91f0112f121040054f7", - "e741f9ff0600b1a00b0154f6ef41f9f8eb41f9e8ff41f9e83f00f9160f01b455cb0094e00316aaBL8;FF00802691c30200d063201b91c40200d084602791a24700d1e1068052704b019420008052e10280526a4b0194c20200b042003f91e0031faa7b4b0194fd7bbca9L8;FF08050091090840f9090300b", - "40a0440f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191ad194e8bbf010cebBBBBL4;FF680b0011e83f0439f503082a08108052020115cb140302eb630f005475020034e8430291e10317aaf903162a0001158bf602028b62eb0194e82755a9600202", - "91L4;FB804c420000000000000000000000000008000000000000000800000000000000804c420000000000000000000000000008000000000000000800000000000000L8;FF890240b22911c0da291540d2290d098b29250191891a498b29050091200108ab220a0054e10313aaaaebff97b7010034610a", - "40f9680240f91f0101eba0090054BL8;FF820380526401805209000014a0831cf8e10200b021483191e30200b063043191a0e300d182038052240280528f600094ba835cf8e18347a9f86749a9f6df4aa9L8;FFa27f0091e1068052756b009420008052c10080526f6b0094fd7bbca9f70b00f9f65702a9f", - "44f03a9fd030091350440f9f30300aad50100b4340840f9370040b9BBBL4;FF80030191e10314aa0801028be83300f996ab0194e00300918102168be20315aaf5ff003966ab0194e00743adf4430291e223c03d16108052e1031f2a95020191L4;FF8c01110aad118b9a5f010e6a70fe51d3ae0173b26b1a", - "0653cd118d9a6e0e03535f010c6aac0172b27115520a72fe52d38d118d9aec01100a5f010e6aaf017db2L8;FFa20100f042202e91e00317aa69ab0094a20100f042802e9166ab0094ff8303d1fd7b08a9fc6f09a9fa670aa9f85f0ba9f6570ca9f44f0da9fd030291368841b9BL8;FF810000b4a08356f82", - "2008052642b0194e8031faa170100b4e91740f9c900003628fd60d3e88305b9e80f40f9e8cb02f9e80317aae0832291e1031691e8c702f9L8;FF7f8318f101320054e11742f9e003279102c480526a2b0094e007409181008052ff0316b900001891912a0094e80356b9e00740918100805200001891ff03", - "16b9BBBBBBL4;FFffc30091c0035fd6f30300aae00301aaf40301aae10309aa22008052230080522400805272060094880a40f9e00313aae10314aaedffff17e10300a9e00301aaL4;FFe87b42f9f87f42f9a30000b0630c3491e0431391e10319aae2031caa04028052e9ab13a9e89b00f933f5ff97ec6b", - "42f9e16f42f9ee7342f9f97742f99f0900b1L8;FF0a1500390a1440390b1900390b104039091d0039091c40390a2100390a1840390b2500390b20403909290039092440390a2d00390a2840390b3100390b2c4039BBL4;FFfa0740f960ffff17ffc305d1fd7b11a9fc6f12a9fa6713a9f85f14a9f65715a9", - "f44f16a9fd430491480040f9f30300aae10700f9e80400b4490440f9e8a701a9L4;ZDL8;FF080317ab22070054c902158b080109ab62090054691640f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab02080054BBBL4;FF040280520f000014880080d20800f0", - "f208050091e81300f9e083009151c90094e01300f9a10300f021982a91a30300f063f42a91e0830091e202805244028052L4;FB1de3c1bf24a3cb3722a7dacb4f5b305c482fd6c6a960f577cf77209b5f03044339129a03457ec9d0c9c722c9f746decba9be0ec6cae9e3ee0000043dba525b25L8;FFe9b3", - "43f9ea4700f91f0500b1eab743f9e04bc23deb6b00f9e9e700f9e9bb43f9f0cb43f9e2d743f9ebeb43f9e51b44f9e92b17a9e9bf43f9eac343f9e09b833dBL8;FFe88f49f91f0500b1c0000054e8074091e14316910881099100e1029137100094f87f49f9b80300b4e1d342f9e8cb42f9f97b49f91f0101", - "eb40440054e8cf42f9L8;FF00013fd6810640f9810000b4820a40f9e00313aa62530094e14b41f9810000b4e04f41f9220080525d530094e89f40f91f0500b16000005460630291b8edff97BBBBL4;FF5f2800f1880000542800028b08f1df380806f837a0e300d1fa5c0094a8835cb8c80f0037a8835df8", - "6a0340f9490108eb03120054ea0240f9a0035df84801088bL4;FB7265717569726564ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6d697373696e672074686569722072656d6f74652066696eL8;FFb5ffff17c80080d20800f0f208090091adffff17ff0302d1fd7b03", - "a9f92300f9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaBL8;FFe0faff54e84f40f9e80702a9e00316aae14340f9fc5740f9fb6b5429e8c30191e55f0094e87340b91f050031e0050054380c00b4e00316aae10318aa22008052L8;FF4a090b8b40011fd6e1d342f9e8c", - "b42f91f0101eb20b50054e8cf42f9490180520969213821040091f47749f9e1d302f99f0a00b1e14a0054e8cb42f91f0101ebBBBL4;FFf85f03a9f65704a9f44f05a9fd030091ff8308d15b0080d2f30308aa09008092a8a303d1bac303d11b00f0f2a08731a9a9831cf8a8a73aa9e10a00b4f60301aaL4;", - "ZBL8;FFf7031faa0901098b0a0e8052fb6740a900710a9b210108cbb2b1ff97e0031caae10317aaafb1ff97e90b40f9c90000b428e179d3e0031caa02018052011109cbBL8;FFc1efffb4e5010014c01b00b5a02302d17eecff97c010003601efffb4e1000014c02300b5a02302d178ecff974010003641e", - "effb421010014e18f0cb96fffff17L8;FF48008052e0232a39e0032a91e8272a39c80080d20800f0f2e84305f95129ff9770000014e04305f9e0032a91e100009021843d9102028052e30000b063600491BBBBBL4;FF6c010c8b2acdcaca8bc1cbca2981c9938c010a8b6901098b8d81cc938abdcaca2bad", - "cbca280108caa91d40d208010a8b6901098b0acdcaca0881c8932bc1cbcaL4;FFe82b00f9ff3b00f906000014e8830191e7030094f72346a9fb3b40f9e82b00f9800000d000a00091e8e30691a1008052950315aadb030094e1835ba93f0400b1L8;FF220080526603019460220091f30b40f9fd7bc2a89a", - "fdff17fd7bbea9f30b00f9fd03009101c840f9f30300aa810000b460ce40f9220080525903019461d640f9BL8;FFff030191c0035fd608200091200440a9e92300910a0000b04a911e91e8a700a9020300d042643f91ea0f00f9e343009178830194fd7b43a9ff030191c0035fd6L8;FFe1030091a283009", - "4a2830094fd7b42a9ffc30091c0035fd608a440a9e20301aae00308aae10309aaa8830014fd7bbfa9fd030091083040f9080100b4080140b2BBBL4;FFf4c302f9f6bf02f906000014e80b41b2e0c302f902000014c8060091e8bf02f9e0e315914fb90094f40300aae0e31591e1231091022e8052f5e3159", - "160c30194L4;FB6a00000000000000190100002e000000e4674900000000006a00000000000000ca0000002e000000e4674900000000006a00000000000000200100002e000000L8;FFe30fc23de9af00b9e95f44f9e84b44f9ead743f9e01bc23de18f16ade97700f9e96744f9e11fc23de29317ade223c", - "23de7cb43f9e95300f9e3a35d39e4bb43f9BL8;FF08050091d4030034890200322911c0da291540d2290d098b2925019129fd46d3290500912001088be10313aa08fdff97f502003574040034610a40f9680240f9L8;FFa80358f81f0500b120120054e082c13ce80700f9e8030b91f7430f91f89301b9e9", - "1740f90029803da8835af8e0430691e10244ade1830d91e8bb01f9a8e378a9BBBBL4;FF83f800541803008bf9feffb50f0000141f0400b1e1f7005484e301941f10003161f70054f9ffff1781e30194f70300aa1f0400b141fdff54e043059181008052L4;FB65796d6573736167655f6b657973000097ea", - "4800000000004e000000000000006402000013000000696e6465786b657950656e64696e675072654b6579707265L8;FFf6432d91e9d743f91f0500b1e0df803de9c301f960320054e0efc13de9f343f9e1f3c13de2f7c13de0df823de0dfc03de9d305f9e9c341f9e1e3823de2e7823dBL8;FFe00319aa2", - "100805262630194200400b4e1031baae20319aafa0300aa686301940800001436008052771640f9f7fcffb538008052792240f919feffb53a008052L8;FF820c0054e90200aba20c0054aa0217cba8831cf8a8c300d1a02301d1a9ab3ba9124cff97a8035ef8b7031ff8140117ebe3070054b8237da9b683", - "5ef81501178bBBBL4;FF1f2100f16a0e40f90831899a08010acb680a00f9f44f44a9f65743a9f85f42a9fa6741a9fd7bc5a8c0035fd600210091e10308aa5ca3019490ffff17fd7bbda9L4;FFe006178b010000f021e004912300008b34686038801e7ed31f0002ebe902005474044039801e7ed35f0000e", - "b620200547408403911000014a1060012000000f0L8;FFf30300aa810100f021501691e8030091e00309aae2018052ada30094810100f021d01391a40100d084600d91e0030091a363009142008052b30f00f9a5a30094BL8;FFe0c3009129111d12e013833ce83f0139e8230091080140b2e9c30039e1f3", - "833cc3230194e0c3009189230194e093c13ce193c03ce18301ad600a40ad8012823cBL4;FF74040051e00313aac5020094e80300aae00301aa28fc073708fc60d3c80100b5080840921f1900f102020054017c0353210200341f1100f160020054e003082aL3;ZBBBBBBBBBL4;FF190a00b4750240f9e1cf", - "00a9f70f00f9b70a00b4a00240fdfc0f40f9fa031faa1b328052f80315aa0088202e0800669e17c10192f70000b5008f40fc5a230091L4;FFda04003668ff70d369ff60d3610a40f9a0c300d1bb031db8a8631d38e81340f9a9431d78e9a34039bc731df8b6f31df8a8731ef8a9f31e3815f8fe971a00005", - "2L8;FF880219cb080115ab82050054f60300aa192000a948008052080800f9e00317aae10316aae20318aacc1d01941f0017eb610100548802009008c11a91755a01a9BBL4;FF22008052669d0194f8ffff17e80740f9c80000b40805088be00314aa0201805201f17dd35e9d0194ff831791f44f45a9f65", - "744a9f85f43a9fa6742a9fc6f41a9L4;FF6300019123740bd5420001f1a8ffff5480003ead80003fadc0035fd6820003cb634000d1424001d1600001ad600082ad420001f1a8ffff5480003ead80003fadL8;FF88620091810100d021fc1491a32300d162008052e40313aaa8831ff8ad9d0094ad9d0094f", - "44f43a9fd7b42a9ff030191c0035fd6ffc300d1fd7b01a9f31300f9BBBL4;FF810080528bdd019420380035e85341b9e82300b957ffdfc8770000b584dd0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2aL4;FB2c20666f756e6420c00016696e76616c6964206c656e", - "6774683a20666f756e6420c000217468652073797374656d2074696d657374616d7020697320696e7661L8;FFf7ef03f9e8c703f9e8c340f9faf703f9e8cf03f9e8ab40f9f5fb03f9e8d303f9e8d740f9e70b04f9e8db03f9e85340f9e40f04f9e8e303f9e9a358a9f61304f9BL8;FF0183c13c0283c23ce", - "007409100c0359101088052f6ef07f9e0fb863de1ff863de203873df60b0ef9e36b873de367873de363873de35f873db45d0194e05fc73dL8;FF680640f92a040091e00314aa490180526a0a00f90969213820170094e10313aaf3faff97803240f9800100b4610a40f9680240f91f0101ebc00900546806", - "40f9BBBBL4;FF8d0500d1ac010ceaa1feff54428c202e42a8302e4c00261e4c0100374a2100916b010a8b6b01098a02696bfc438c212e6c00669e8cc101f221fdff54f4ffff17L4;ZFL8;FF600400b5e1031faae4ffff1761020054e1031faae00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd68", - "80080d2e10700f90800f0f2c9ffff17e80b41b2BL8;FF092000912103009021d83d91a9831ff82403009084003191f6000014092000912103009021a03d91a9831ff82403009084203d9126030090c600319103800091L8;FF80000054e1630091e00315aa9d90ff97df0600b160b6ff5481220291470000", - "14e8031faa000117ab226d0054e1630091a87dff977f0a00b100040054e11740f9BBBL4;FFf44f4ba9f55340f9fd7b49a9ff030391c0035fd600018052010480526dbd0194fd7bbfa9fd030091080040f90a0840f909696238290140924a0109eb63020054L4;FB28000000000000000800000000000000f", - "863480000000000486448000000000018f4470000000000500000000000000008000000000000006063480000000000L8;FFf85f47a9fd7b45a9ff830291c0035fd620008052010480526ebd009420008052010880526bbd0094ffc301d1fd7b05a9f44f06a9fd430191f40308aa280cc0daBL8;FF4a0d0a", - "8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54a00200f0008020915b3d0194L8;FFe00b40f9e10308aa22008052643d0094e10313aae81340f9c80000b4e01740f9e10308aa220080525d3d0094e10313aae81f40f9c80000b4e", - "02340f9e10308aaBBBBBL4;FFe20315aa230080522400805278000094770a40f9680240f9080117cbbf0208eba9efff54e00313aae10317aae20315aa23008052240080526d000094770a40f9L4;FFee0318aaf0cb40f9410200b4e0031aaa22008052ebcb00f9f9030caaeddf1aa9f7030eaafa030faaf6", - "0310aaf8030aaa5b0d0094ee0317aaeddf5aa9ebcb40f9L8;FFf44f02a9fd030091140840f9f30300aa3f0002716200005435008052080000143f0020716200005455008052040000143f404071680080521535889a680240f9BL8;FF582f40f9f8f6ffb4532b40f9608d0194e00318aa210080525e8d019", - "4200500b4e10313aae20318aaf60300aa648d0194b3835df8acffff17e90313aaf54f43a9L8;FF080d088b0825019109fd46d30800098b080500911f0109eb69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff54800100b000403191BBBL4;FF7bc0ff97e12740f906ffff17e0", - "e3009122008052230080522400805274c0ff97e12740f9d7feff17e0e300912200805223008052240080526dc0ff97e12740f9L4;FBcb5edb1a0000f200941f00de724e0d91c5d42c3f6555b2339157a68e00000000000000000d2a80a1c73402bc0000000000000000000000000000000000000000L8;FF", - "e8b300f9e8ab40f9e06746a9e8c300f9e89740f9f0b74aa9e8ab00f9e8d740f9f88f41a9e92312a9e9a349a9e84f00f9e88740f9e9af1aa9ebf340f9e8df00f9BL8;FFbc0000b4e0031baae1031caa22008052634d01945f0b00b1c1f2ff548082c23ce8bf40f9e0430691e1e30091022180528002803de8", - "ab00f96082803c680e00f9L8;FF887e089bfb0314aaa8031ef81100001436008052a9835ef8aa835ff868021c8b7b0700d15aa301919ca30191092900a9096501a9a9435fb8156502a9175103a9BBBBL4;FFe0230091a31300d124008052a8c31f382e5000945eed019400048052210080525ced0194c003", - "00b4e083c03ce183c13c8906001108048052692200b929008092L4;FB6e76616c6964207072656b6579206964656e746966696572696e76616c6964204b79626572207072656b6579206964656e74696669657273656c662073656e64L8;FFa0f7ffb4b4ffff17e1031faa883e00f9b9ffff17e1010054e1", - "031faaaeffff17c80080d2e10700f90800f0f2080900d19effff17e80b41b2e00700f99bffff17BL8;FFe10314aa62008052bb6d0194c0fa073611000014e8031f2afa0700b91a020034e8000037e10200d021e81b91e00313aa62008052b06d0194e0000037e10200d0L8;FFe0431691e1031aaae20318a", - "a4d110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aa44110094fad342f9fc0740919c830191BBBL4;FF74220ba9e8fe70d3699a0179e90b40f9600a03ade083c33ce283c53c683a0339a88354f869720df8a9035538610200ade083c43c68f20df8a8035cf8699e033", - "9L4;FF6b010a8b08010a8b6b090091f5ffff174c0500124d7d01534a7d02538c01c05a1f0100f1ad011f124a011f128c7d1d536b010d8bed179f1a6a010a8ba901092aL8;FFe2031f2a0e07009408fc78d309fc60d3287b68782821084a095d1053295b69783701084a14000014e80100d008010191f7030", - "02a00210091a22300d121008052BL8;FFe69f09a9ffd30879ff4b02f9e3930ca9e59b0da9e9fb00b9ea0b10a900013fd6e03b02f9e8031691f4031691e13f02f9290c40f9e103129120013fd6f8c342f9L8;FFfc6f41a9fd7bc6a8c0035fd6f6031faafb031faa190080921a01805200e4006fe007409101", - "04805200001891f6eb12a9f5620891fbe713a9e087853de083853dBBBBBBL4;FF770a40f9680240f9080117cb9f0208eb69fbff54e00313aae10317aae20314aa230080522400805271080094770a40f9680240f9080117cb9f0208eb29faff54L4;FFe107c13da40000d084e02a91e047813de023c13de1", - "63813de18f5fade82b42f9a60000d0c6802b91e96b02f969e20191e40fc13de15b813de1fbc03de0431391L8;FF0a00403929610aaa0a04403929410aaa0a08403929210aaa0a0c403929010aaa100000140a0040390b0440394a2d4cd34ab10baa0b0840394a910baa0b0c4039BBL4;FFbc0000b4e10740", - "f94003088be2031caa6b950194c80215cbf56b00f91f0308eb281d0054b80000b44003158be1031baae20318aa62950194fa5b4ca9b70000b4L4;ZBL8;FF3f0500b1201a0054f30300aae00308aa95040094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b1305", - "00917f0209ebBBBL4;FFbfe337a9bf8318f8bf0319b81f0800f1215f0054b58355f8a20640f9426100b4a10240f920008039001bf8b728040091490400d1e5000014a88359f81f0500b1L4;FB6a00000009000000911f49000000000056000000000000008400000009000000381f4900000000005800000", - "0000000009f00000009000000e81f490000000000L8;FFe4af00f9f51300f9f48f11a9f1df00f9f0cf00f9e6fb00f9fa2300f9f29710a9f6f300f9f6030faaf7ef13a9e7fb16a963d50094e72340f9e31340f9f70316aaBL8;FF8000005480020491e14316912a130094e8cf49f91f0500b180b5ff5481e2", - "0491b4010014e1d342f9e8cb42f91f0101ebe0770054e8cf42f949028052f6074091L8;FFfb830291e8fb42f91f0500b1e0140054e80343f9e07fc13de9c31291e0833291022b8052e86702f9e8c31791018100912081803c6255009460030291e2833291BBBBL4;FFc0fcff54755a42a9e08740adc80240", - "f9a0873eade00fc03da0039f3c680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aa59f50194a0877eadL4;FB6465725f7369676e696e675f6b657973656e6465725f6d6573736167655f6b6579736d6573736167655f76657273696f6e53656e6465724b65795265636f7264L8;FFe101", - "0054e1031faa79ffff17c80080d2e10700f90800f0f2080900d169ffff17e80b41b2e00700f966ffff17c80080d20800f0f2080500d162ffff17c80080d2BL8;FFf33340f9ffc30191c0035fd61f09007181010054ea0f40f9090180d20900f0f248dd7892290140b20a000014ea474039090180d2e8031f", - "aa0900f0f205000014L8;FFe11b40f93f0400f18b000054e01f40f92200805262750094ff0600b1e1000054e83340f91f0500b180000054e8c3009100c10091b00e0094ff074091ff833c91BBBL4;FF683300f999b50194e8031f2ae8ff0139e327c03da00303d1600743ada18302d16223c03d6343803dd", - "502178b5a0317cb608708ade08742ad624f803de213c03dL4;ZDL8;FFf6574ca9f85f4ba9fa674aa9fc6f49a9fd7b48a9ff830391c0035fd620008052010480526bb50094200080520109805268b50094ff0303d1fd7b06a9fc6f07a9BL8;FFe82b00f9facb40f99af1ffb51c018052e81b41f91f0500b1e", - "1f5ff5417008092e83341f9f92700f91f0500b1e1f7ff5416008092f9d740f9e98b42b9e88f42b9L8;FFf92705f9f8c704f9bf7e07a9f8d304f9ffd704f9a88317f8aa1000b5e0431f91a16200910228805265350094e0431a91e1431f910228805261350094e0431591BBBBBL4;FF0060349169050294ff", - "0303d1fd7b08a9f74b00f9f6570aa9f44f0ba9fd030291f30300aa29008092e8230091e18b00a9ff4b00b9e90f00f9e91b00f9a80f00f9L4;FFe0230091e1031faa22008052230080522400805247e6ff97e02341a983ffff17e023009122008052230080522400805240e6ff97e10f40f98effff17e0230", - "091L8;FF01f97fd342008052f30b40f9fd7bc2a863050114f30b40f9fd7bc2a8c0035fd6fd7bbda9f50b00f9f44f02a9fd030091150040f9bf0600b160020054148440a9BL8;FF921a00f980d28a3c8c3a00b9996a04a98e5e05a9983200f98d6a00b981260e298a9a00b98b72023981d2893c88f60239f4", - "4f4fa9f6574ea9f85f4da9fa674ca9L8;FFfa230191680240f9a0039d3ca9031ef81f0500f1ab000054600640f901f97fd3420080525e850094a003dd3ca9035ef86002803d680240f9690a00f91f0500b1BBBL4;FFb6033ea9a18300d10800003928008052e003172aa8031ff872b1ff97a1035ff8a8035", - "ef81f0101ebc0130054a8835ef8490280522a040091e0031caaaa031ff8L4;FB6c5f70726f746f636f6c3a3a747269706c655f72617463686574696e76616c696420726563656976657220636861696e206d657373616765206b657973536967L8;FFedbf43f9f9c343f9fec743f9eecf43f9f2d343f9f1d", - "743f9e0db43f9e3e35e39e7f343f9e4e343f9e5e743f9e27744f9fa7700f9fa5300f9fa4f40f9ea5f40f9BL8;FFe00301aaf30301aae10309aa22008052f4030aaa630500946ba240a9ea0314aae10313aadeffff17ffc303d1fd7b0aa9f95b00f9f85f0ca9f6570da9f44f0ea9L8;FF692841a9e08705a9", - "a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a296a450094fd7b47a9ff030291c0035fd6ff0302d1fd7b07a9fdc30191BBBBL4;FFf3031faa370140b21840009179040090fb0300907b3f3b915c048052fa2ec0f2350080520b000014e00640ade0c30091e10314aae08701ad15c0009", - "400040037L4;FB623562353537662f62797465732d312e31322e312f7372632f62797465735f6d75742e72730021706f73742d7175616e74756d20726174636865742073656e64L8;FFfd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091360840f9f30301aaf40300aa1f0002f1c2000054f5031", - "6aa680240f9df0208eb610b005458000014BL8;FF41020054f40200b4150040f9360040f933008052a8164038c91640381f01096be0179f1a78650194940600f11300130a21ffff54e003132af44f42a9f65741a9L8;FF613e40f9e10000b4604240f922008052f44f42a9f65741a9fd7bc3a860650014f4", - "4f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f30b00f9fd030091090040f9BBBL4;FF81010054ea0f40f9090180d20900f0f248dd7892290140b20a000014ea474039090180d2e8031faa0900f0f205000014090180d2e8031faa0900f0f229017fb2L4;FF2300009063c0029163d86878867e031b9f000", - "66b8a000054000080d21f000039007d20d46300060b9f00036b4b010054000080d21f000039007d20d463141a12L8;FFc3ffff17e0230091e10315aae20314aa2300805224008052f30308aa11bcff97e80313aaf35741a9c7ffff17e0230091f30301aae10314aae20315aa23008052BL8;FFffab01a98a", - "0200b04a413691eaaf03a92a0080d2f40308aaea0bc0f2e9ff02a9e9ab05a96a250194e00313aae80314aaf44f49a9fd7b48a9ff830291000440adL8;FFe82301f9e92701f96f250094c8de7992e0030691e20316aa4103088bf6ff073967250094e00751ade0430991e293c03de377c03de1030e91b6030", - "2d1e00b813dBBBBBBBL4;FFf44f4ca9f94b40f9f6574ba9f85f4aa9fd7b48a9ff430391c0035fd6ff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9L4;FFa103973cc1f3ff54810000b4e00316aa2200805262190094e15740f9810000b4e00315aa220080525d19", - "009417008092f61341b2d9ffff17e00316aabb8301d1L8;FF281740381f310071e82300392c01005488feff341f250071600400541f290071c1020054e00313aae10317aaf0ffff171f350071c00100541f89007160000054BBL4;FFe0179f1a80990194e8474039292740391803000a1f01096be0179f1a", - "7a9901940803000a4803080a00010012769901941f1c0072e0010054a06300d1e10316aaL4;ZFL8;FFe1031f2aa0073cade10f46adb7f35838e02fc03da2039a3cb5031bf80001178b08108052e21640d2a0873aadf81640d2a303973c08140038579900941f1f00f1BBBL4;FF0800f0f20a017fb2081d40", - "92e0030091280108aaea2300a950c2ff97c80300d0084935914903805268a600a92800805268020039fd7b43a9f32340f9ff430191L4;FB792f636f72652f7372632f697465722f61646170746572732f656e756d65726174652e7273002f72757374632f34386132323963656165666434393835633530L", - "8;FF08c12591e9eb01f929038052e1430f91e8a303f962008052e8ab03f9080200b008612591e9a703f9e9af03f9e90303aae3031d91e8b303f9e80300aa00020090BL8;FF3e000014f3031faa0901098b0a0e8052f4cf42f9210108cb00510a9b33110094e00314aae10313aa30110094d50000b4a8e279", - "d3e00314aa02018052011115cbL8;FFe0833291bc81fe97e8fb42f91f0500b140e90054e80343f9e9f31691e07fc13de9a305f9090000f029713e91e80305f9280000b008411c91e8a705f9e8c31691BBBBL4;FFe00740adc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9", - "810000b4c20a40f9e00315aa5bf90194e08741ad28008052e217c03dL4;FB6e6465724b657920646973747269627574696f6e20c022204475706c6963617465206d65737361676520666f7220697465726174696f6e3a20c0000d4d657373L8;FFa08739ade08b42ada08b3aade08740ada08738ad20f4ff", - "97a0077bad880080d20800f0f2880200f98082853ca2037cad8182863c8082883ca10379ad8282873cBL8;FFb479019468c20091010300b0214822912403009084400791a32300d182018052a8831ff8ab790194ab790194f44f43a9fd7b42a9ff030191c0035fd600c48052L8;FFe11f843de023843de22", - "7843dc0790094e007409100800991be790094f50300aa5b790094000880522100805259790094c09701b4a10241adf40300aaa20e40adBBBL4;FF0803158be80a00f9b40000b481f67ed3e00316aa4200805261b90194e8a746a9ec031baaf70319aabbc301d1580080521f011cebe83f40f941d6ff54ff0", - "00014L4;ZBL8;FFe11740f9810000b4e00740f92200805263b90094e14b42f9810000b4e04f42f9220080525eb90094e15742f9810000b4e00340f92200805259b90094b70000b4BL8;FF092440f93f0500b1400400540a2c40f9093840f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a1", - "94b8b4a050091090100b42b0140b26b11c0daL8;FF01ed40b9080f40f9e00316aa00013fd6f7d749a9fb5f40f9fa4b40f9607e02f9618202f9290c40f9e8430f91e1031baa20013fd6fceb41f99f0b00b181000054BBBBBL4;FFffa304a908018052f3230091ffff01a9ffa303a9a8f7ff97600c00b4e107", - "40f9f40300aa810000b4e00b40f9220080525b090294e11340f9810000b4e01740f9L4;FF680200f9e80f40b9600a803d74220129692a01a9f44f45a9f65744a9fd7b43a9ff830191c0035fd6f50b40f958090094c00180522100805256090094a00300b4L8;FF42780091e9ab00a9e323009181090194fd", - "7b43a9ff030191c0035fd608200091200440a9a92300d10a0000904a112791a8831ff86202009042000091e9ab00a9BL8;FFe0f9ffb4520000143f100071200300543f140071200500543f18007181f8ff54e87f40f91f0500b161000054ffe70fa9ff8700f9c1220191a20301d12373ff97L8;FF6a7f8a0", - "aae7e8e0a713a0f530b020b4a105d10532f7c8f0a8d7f8d0a6b010c4a4a010e4acc7e910a6b010f4af503142a4a010d4a4d5a7078f44740f929010b4aBBBL4;FF4a61199109080091400540ad690200f909040091000502a9000500ad008501ad090505a9f44f41a9fd7bc2a8c0035fd6f40308aa6bc9019", - "4e80314aa29008052L4;FB72726f7200000000d5184900000000006a00000000000000dc0000002e000000d5184900000000006a00000000000000750000002e0000007374617465206465L8;FFe10317aa2200805265c90094df0600b1e0090054e8ef42f9e0031a2a80de78b31f0500b1203900546027c", - "03de8c301f9f7430d91e8835739695340f9e1030e91BL8;FF682640f9c80000b4090d8052e00314aa02018052017d099b61490194617e40f93f0400f18b000054608240f9220080525b490194619640f93f0400f18b000054L8;FF00801a9169490094f3031faa080c47f81f0500b1e1e7ff54e8031faa08", - "0113ab23040054000100d000c016915f490094f3031faa088c45f81f0500b181ebff54BBBBL4;FFf80309aaf9030aaa65e90194e90318aa330000143f0700b1e00500549f7f00f1ea2700a94908005459e90194000480522100805257e90194200900b4810240adL4;FBc479400000000000e41f40000000", - "000010000000000000000800000000000000347b400000000000e41f40000000000010000000000000000800000000000000L8;FF230080522400805216000094610a40f99dffff17e00313aae10316aae20315aa23008052240080520e000094760a40f9680240f9080116cbbf0208ebe9f3ff54BL8;FF0", - "60000143300805204000014d37e60d30200001433408052e00313aaf44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e00301aa01030090L8;FFa6ffff17e85340b91f050071610f0054e043c73ce143c83c03e4006fe283cc3ce8430691e0c30e91808506ade083cb3cc1e20091e243", - "0e91fa030b91808907adBBBL4;FF5d2d0094e8f77fb21f0008ebe8350054f72740b99f0600f1602300542800805249018052c96a283808050091a14301d1e00315aaa8031cf86a95ff97b6035cf8L4;FFc9157e92ff0500f1aa0d098b490140f9eb0329aa6bfd47d3691949aa29c10092e00100544b0540f", - "9ff0900f1ec032baa8cfd47d38b194baa6bc100926901098bL8;FFf85f07a9f65708a9f44f09a9fd03019137c040f935204639f30301aaf40300aa5ba90094003080520101805259a90094600a00b408028052f6031faa38008052BL8;FF3f8100b122070054490500b4ea0200b04ab140f95f0900f1c304", - "0054ff8302d1fd7b08a9f44f09a9fd030291e90300f9e90300914a0200f04a710391eb230091L8;FFfa074bf9e0c31d91fb0b4bf9f90f4bf9c1e20091fc134bf9f8174bf902248052f51b4bf9662900949f0600b1e0f9ff54f6030291e1c31d9102248052c0621091BBBBBBL4;FF880000542800028b08f1", - "df388826f837e0230091fb7a0094e80b40b9e8f90737e80f40f9ea0640f9490108ebe3410054ea0240f9e00b40f94801088be82600a9L4;FFee03082aea0319aa130400140a0180d2e9031faa0a00f0f205000014080180d2e9031faa0800f0f20a017fb2081d4092e0431391ea6b02f9280108aae86f02f", - "9L8;FF6a0d0012096c003909819f1a5f25007129114b0b0b819f1a9f7d02716a010a0b0b819f1abf2500716b114c0b29c1001108819f1a0970003949c1001108010d0bBBL4;FF21060054081f00121f0500718c01005428030035171f4092e80f41b2ea1e4092e9020aaa68a600a9e10740f928008052680", - "200b9812000b5060100141f090071L4;ZDL8;FF610100f021fc1491a32300d162008052e40314aaa8831ff8ae910094ae910094f44f43a9fd7b42a9ff030191c0035fd609004039e80300aae00301aa2a0900d1BBBL4;FFa88201f8e85340f9e9ab0ba9a9035638000540adbb031738a9020238000700ad1", - "bac0094a0fa0736f80319aafaef48a9df0219ebf54340f9f94f40f9b74302d1L4;FB5557dad0491d752b732ca28c30d697d90000aaed083d89a75e0f269acfa31bf933bbb8543cd276472052e37c1b5470256922e6653d85e689d33a8fedd8868d89L8;FFea8f44f9e0cf00f908b140f9ea4b00f9e97f00f", - "91f0d00f1e3650054a80100b008c10491fb3300f9e8ef01f9e80100f008c12591fbf346a929038052e8a303f9BL8;FFe1d342f98ffcff17e04316912200805264110094e1d342f95efdff17e0431691220080525f110094e1d342f984fdff17f40300aae04316912200805259110094L8;FF1ba30191f543", - "01f9f5031691325ffe97e8c342f91f0500b1601300548043c03df6e32291f76301912183c93ceaa209912283cb3cc082893c2083ca3ce9db42f9BBBBL4;FFed0f40f9ea1b40f9eb1b00f9a98109aaca210aaae90f00f9e93740f9480108aa36fd68d3e92340f9e83302a929fd68d3e92300f949daff97a80", - "35bb8a9435b78L4;FB0400000000000000696e76616c6964207075626c6963207369676e696e67206b65796d697373696e67207369676e696e67206b6579696e76616c696420707269L8;FFff030291c0035fd637008052180080921901805206000014e20313aa430c8052c5eaff97e10300aa00feffb5a", - "80640f91f0116eb49050054e00313aa14f1ff97BL8;FFaaa35638a98316386901084aabb35638a99316384901084aaac35638a9a316386901084aabd35638a9b316384901084aaae35638a9c316386901084aabf35638L8;FFc0220291e6290094080040b20811c0da081540d2080d088b0825019108fd46", - "d30900088b390500913f0308eb681f005431010014e1d342f9e8cb42f91f0101ebBBBL4;FF21f42691630300f063202791a0031bf8a04301d162018052640180521e000014a0031bf8610300f021f42691630300f0634c2791a04301d162018052a4018052L4;ZBL8;FFc10e005400e4006f168442a9748e", - "40a9f50300aaa40100f084c03c91e6030091e00316aa85048052070c8052e20314aae00300ade00301ade00302ad82080094BL8;FFa00640f901e97bd30201805264310194e00315aa010980520201805260310194e0c31d91e1c322910228805264310194e0c32791e1c31d910228805260310194L8;FF0", - "0810091001f803d6d310094e8eb41f91f0500b121eeff54e83f40f9f50000f0f6832491090140f9a8b240f93f0500b1a0010054e81000b4e03f40f9e8032a91BBBBBL4;FF1c00198a496b7cfc208d282e0800669e18c101f2c1fbff54f4ffff172000805205000014610a40f9608300d118dc00943b00805", - "22800809280220039880200f9L4;FFe82a40f9c80000b40805088be00315aa0201805201ed7cd3610100945f1700f1000e0054f55248a9340200b4b982009104000014940600f139c3009180010054L8;FFc20700b4fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd0300914804028b49008052f3030", - "3aa340d002a3940009118f17dd30b000014680640f9e10316aaBL8;FFe80700f9a8810194fd7b41a9ff830091c0035fd6010300f021702991820080529d810114ff0301d1fd7b01a9f51300f9f44f03a9fd430091080040f9e00301aaL8;FF20060054880a40f9080100b4090140b22911c0da291540d229", - "0d098b292501910819498b08050091892680b9a9050034290140b22911c0da291540d2290d098bBBBL4;FFe0830b91bcaaff97e0830b91e1e30091e5350094fc7341f99f0b00b1e0fdff54f57741f9fb7b41f9e0430691216300910228805262c10194fa2740f95f0700b1L4;FB2d302e31342e342f73726", - "32f656e636f64696e672f766172696e742e7273002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d31L8;FF00430191a9831ef8f73f41f981220091a003963ca2837eada1039c3ca80317f88083833c8283823c8183813cfc15009400230291a1820791ee170094a0077bad", - "BL8;FFe20314aa67010094760a40f9680240f9080116cb9f0208eb69f8ff54e00313aae10316aae20314aa5e010094760a40f9bdffff17fd7bbca9f70b00f9f65702a9L8;FF1f05007161010054612640f9810000b4602240f92200805261410094612e40f9810000b4602a40f9220080525c4100947f660", - "539f44f42a9f50b40f9fd7bc3a8BBBBL4;FF60b80035e85341b9e8a300b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebL4;FB506f6c796e6f6d69616c4572726f724368756e6b496e6465784465636f64696e6745727", - "26f724368756e6b446174614465636f64696e674572726f7200000000L8;FFe0430f91690200f96082803c680e00f962ddff97080700d1fa031c2a1f0900b1a2000054e00319aae10318aa220080525be10094ff0600f1ab000054e0b740f9BL8;FF000580520101805262610194000100b4e10200d021e0", - "3f91144c00a91f800039f44f41a9fd7bc2a8c0035fd6000180520105805272610194fd7bbda9f50b00f9L8;FFe80300aae00301aa08020037680240f9080540f9150100eb62020054e80f41b2e80700f907000014c90080d248008052e04300390900f0f2e8470039e90700f9BBBL4;FF080180520800003", - "9f40000b4a10240f9f50300aa00040091e20314aa68a10194e00315aae10313aaf44f42a9f65741a9fd7bc3a8c0035fd6600300b000e01591L4;FF007c041bc11a00b9330f40b9007c1b5377486038f51e40920043089150040094c08240391f1040f2010c0054c41240f99fcc74f2a00b005484cc749284", - "4000d1L8;FFb30100b468e279d3151113cb930100f073621191e0030091a1630091e20313aab40f00f994c20191a1a10094b5c201f121ffff54e00300919ea10094f44f43a9BL8;FFc10100b4e00302aa22008052e30313aa7e210194000300b50e00001428008052090180529f6a29f8880200f9f44f41a", - "9fd7bc2a8c0035fd6d30100b454210194BL4;FFe02300915717ff97f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aa67210094a00100b4f50300aaL3;ZBBBBBBBBBBL4;FF0a0317ebe3080054335500a92a0900f936efffb4df0600b1a00800", - "54df2600b1c2080054c9f27dd302018052293d009129f17d92ca02098b000109cb41250091L4;FFa8931d38a9031df805000014e10300aa0f000014e80f41b2a8031df8a0c300d15014ff97a0031df8c100009021202291c3000090630c2391a0c300d162038052L8;FFf30308aaf7010037e18200912000", - "8052d11e01942008f8b7986640a9f50100b417040036fafe45d3a8021aab4208005409fd7bd3690100b517e97bb319000014BBL4;FF08213a91400300b000ec2b91e85302f9e8830791e1231291e85702f9e8830091ea4b02f9f84f02f9e95b02f98b9e0194e19b41f9210100b4e09f41f922008052L4;FF", - "3f0000eba8030054f55b02a9f303032af603022af503042ab3032037c27e4093a47e4093e00314aa637e4093c81b80d2010000d49f0200f1000841baa1000054L8;FFa363009142008052b30f00f9b19e009468a20191810100d021741d91a40100b084e00d91a3630091a2018052a80f00f9a89e0094a89", - "e0094fd7b41a9f31340f9BBBL4;FF1f0400b16158005488de01941f100031e157005439feffb505000014e04305918100805283de019420570035e85341b9e84300b957ffdfc8770000b57cde0194L4;FB1809440000000000600a44000000000018084400000000002d004900000000004a000000000000", - "00270500000f0000002d004900000000004a00000000000000L8;FF072853a9062c54a9ea3700f90e2857a9eab70aa90a345aa9ed3f00f90c345ba9eeb31da9ed3300f90c345ca9ecf700f9ed2f00f90c345da9ec7f00f9ed4b00f9BL8;FFe10314aa735e019420008052e10318aa705e0194ff8300d1fd7", - "b01a9fd430091080040b9a01300d1a8c31fb8b55e0194fd7b41a9ff830091c0035fd6ff8300d1L8;FFe00315aaccffff17f50300aae00313aa220080524b020094610a40f9e00315aad2ffff17e00313aa2200805245020094610a40f9680240f9deffff17e00313aaBBBBL4;FF4d0300370821009180010", - "88b0c00098a42696cfc438c212e6d00669eadc101f221fdff54f4ffff17e81341b2e0630191d56101d1e82f00f948e7ff97e0630191L4;ZFL8;FF2e1900d10c3900a96d190012218c0daaebf8ff363f1900f160f9ff544b19c0394c1d00912e1d00d10c3900a96d19001221a80daacbf7ff363f1d00f140f", - "8ff54BL8;FFfd7b01a9f51300f9f44f03a9fd430091344c40a9210300b021402591150040f9e2008052680e40f9e00314aa00013fd6e000003620008052f44f43a9f51340f9L8;FF4fd9ff97080040b20811c0da081540d2080d088b0825019108fd46d30900088b36050091df0208eb48180054d0000014", - "80220291d4e2ff97080040b20811c0daBBBL4;FFff0600b1f40317a9ffc300f960030054e8031faa49018052096828380805009100630091e8c300f967360094e1c305916caaff9700630091e1c305918fb1ff97L4;FB7465732e696f2d313934396366386336623562353537662f62797465732d312e313", - "22e312f7372632f62797465735f6d75742e7273002f72757374632f343861L8;FFe0031f2ae3031faadcbe0094ffc302d1fd7b08a9f65709a9f44f0aa9fd030291280840f9f30301aa1f0101f161060054681640f91f8120f101060054682240f9BL8;FF9ca30191092900a9096501a9a9435fb8156502a9", - "175103a9176104a9166105a9096100b9fb0800b4a8035ef81f011ceb80080054560b40f9586340b9360500b4L8;FFe20313aad5fdff97000100b4d6000014e01c00b5e00313aaaefeff97e80301aa40010036481d00b5e1031faa61f9ffb4f1000014e20313aa430c805214f9ff97BBBBBL4;FF2a040091e", - "00315aa6a0a00f909692138e10313aa73faff97770a40f9680240f9080117cbbf0208ebc82b0054680640f9e10316aae20315aa0001178b600e0294L4;FFe8031faa0c00f0f205000014090180d2e8031faa0900f0f22c017fb217fd60d3291d0012e1ab40f9fa9740f90a01092ae8c700f9f5000014e8c7", - "40f91a7d0853L8;FF6a7089528a00a072297daa9b29fd67d3210009ab420100542289081b6002009000e03491d20e01943f040031e103811ae003809afd7bc1a8c0035fd660020090BL8;FF148540f8080000f9a90e40f9490700b4a00642a9e20314aab489ff9708fc79d3e1e7076f9a624039b96240a9e", - "9031faa080d010e96d640a90a3280521c00188aL8;FFe9030091630100b063802191640100d08400119100210091e2230091f403012a21008052e82700a9918e0094e103142aa80100d008e14039600240791f050071BBBL4;FFe82700f9a81e40f91f0500b1000b0054e12740f9e81f40f91f0101eba01e", - "0054e82340f9490380520969213828040091b72640f9b63240f9e82700f9770200b4L4;FBee4adfdd48ead4ade658a28c3854ed4511bf919500008f8136cdceac0dd8f12b1bcf3accca59fa96b5e019a5371ae52b637c2f0676d13f9db4d4e9cd827c5878L8;FFe9ab00f9e06746a9eb2312a9ebf340f9e9", - "a349a9f0b74aa9e9d700f9e98740f9e84f00f9e9df00f9e9af40f9e98700f9c8f2ff17e8008052eeb300f9e3f340f9BL8;FF1175ff97e84346391f05007161050054e8a759a9e80302f9e8031091e90702f9a80318f8280300d008b140f91f0900f103040054a80302d12900009029112e91L8;FF7f0f00b", - "1e1000054c800805223ffff17e8e322910081cd3ce8d344f97effff17f63f42f92083c13ceae32291e9d742f9f5c742f9f7cb42f9c80240f9f43b42f9BBBBL4;FF42feff54080b40f9fc0340f9f903002a5f0308ebc1010054fa0100b41b0740f938008052f7031caae8164038691740381f01096be0179f", - "1a73ee01945a0700f1L4;FB259448000000000054000000000000004c0000000500000025944800000000005400000000000000590000000500000025944800000000005400000000000000L8;FF160101eb82020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e903", - "00f9e00300914ce4ff97e10300aae00301aaf44f46a9BL8;FFfd7b44a9f32b40f9ff830191c0035fd63f090071e1000054ea0f40f9080180d20800f0f249dd7892080140b205000014080180d2e9031faa0800f0f208017fb2L8;FF00210491e14316911310009497faff17400100d000002591420100d04", - "2a02591210480528f6e0094e2074091450100d0a500269142800991e0031f2ae3031faaBBBL4;FFe10d005499030090391b09913a04805204000014790300d0392320911a028052a00301d1e495ff9708008092796a01a9685e00a9f44f5ea9f6575da9f85f5ca9L4;FF0101a0521f070094a001f836f906", - "0094080040b91f11007120ffff54f5060094080040b91f090071c10a0054280080521f0b00f91f2300a954000014f303002aL8;FFf40302aae11700f917f97fd3f30300aa5fae0094e00317aa410080525dae0094c01200b488060091e00b00f9f3a301a9141000b4e20a00d1e1031f2af30300aaBL8;FF8", - "10000b4e04f41f922008052642e0194e89f40f91f0500b16000005460630291d7e4ff97f3db52a9960100b47722009104000014d60600f1f7620091e0000054L8;FF810640f9210100b4820a40f9e00313aa632e0094ffc32091f44f42a9fc5741a9fd7bc3a8c0035fd6ffc32091f44f42a9fc5741a9fd7b", - "c3a8c0035fd6e8434e39BBBBBBL4;FFc0035fd6fd7bbda9f65701a9f44f02a9fd030091010c40f9f30300aa3f0400f18b000054601240f9220080525c160294611e40f93f0400b140010054810000b4L4;FFf90317aae1ab4bf9c10000b4e0031aaa22008052fa030caa61160094ec031aaaff0600b1f8e3", - "00f9200e0054e8431391e0031baae10316aad821fe97ec6b42f9L8;FFe1020054a88200911ffddfc8a10240f9810000b4a00640f92200805260160194e00315aa01058052020180525c1601940b000014a8fe45d3890640f93f0108abBBL4;FFff4301d1fd7b04a9fd0301915f2c00f1820000542800028b", - "08f1df38680ef83728008039e800f8b72a00805208a800a91f0000f9fd7b44a9ff430191c0035fd6L4;ZBL8;FFe90301aaf30300aa8101009021641991e8230091e00309aaa2018052ac960094940100f094a203918101009021801591e0230091a32300d102018052e40314aaBBBL4;FFa3730091e10314", - "aa0204805224008052f30308aab57300392c390094942240b95bd60194000480522100805259d60194a00100b4e00740ad08048052688200a9L4;FB65706f6368706172616d7343743153616d706c656443743153656e744b65797353616d706c656473656e64696e675f68647248656164657253656e746", - "46b506fL8;FFf13f40f9fa5740f9ec7300f9ec2b40f9ed6300f9edf740f9e5d300f9e093803de1f3803de82b01f9f6bf00f9f2d711a9e70f00f9e70301aa08008092e2ef00f9BL8;FFe00313aa0201805201f17dd31afdff17e19349f9f3074091738209913f0800b1800100543f0400b140010054810000", - "b4e09749f92200805259560194e19f49f9L8;FFe8a73239c80080d20800f0f229000014f30300aaa00302d1ddf1ff97e00313aae05306f9e08332912101009021e0339102028052230100b06384009174000014BBBBL4;FFe803009120013fd6e80340f91f0d00b141030054880200f9680080522a000014", - "765e4429796240a9f50301aa58f60194000480520101805256f60194400500b4L4;FB6c656374696f6e2077697468206c656e203e207573697a653a3a4d41580000008c934800000000004800000000000000af0000000a0000003078207c20000000L8;FFc80080d2e00700f90800f0f2080900d17effff", - "17e90b41b2e92300a983ffff17c80080d20800f0f2080500d177ffff17c80080d2e10700f90800f0f2080900d1BL8;FFe8030091e00309aa42028052b07601940103009021282391040300f084a00a91e0030091a3630091e2008052b30f00f9a8760194a8760194fd7b41a9f31340f9L8;FF33010aeb091", - "d0054e90315aae8000014e81b40f91f0500b1000a0054e85b40b91f010071cd0b0054e8074091e0c30091088109915c92ff97e83349f94083c03cBBBL4;FF00a0059169b60194800300d000000691830300b063802291840300d084800691a24300d1a1038052a8273fa96cb60194092843a9eb0309aa090", - "100f929010a8bL4;ZDL8;FF3481889ae30314aa26000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a967b60094ff0301d1fd7b02a9BL8;FF673601949f0a00b121010054e01bc13de11fc13db47e0853e88344b9e063813de167813de8a305b9130", - "80014f37740f99f0600b140090054e01bc13de11fc13dL8;FF75b240f962360094e00318aa2100805260360094e0d500b4e10315aae20318aaf70300aa6636009402000014370080527ac240f91a0200b4f4031caafc031baaBBBBBL4;FFbbffff17e08740ade20fc03de80740f9000500ad0209803dff43", - "0991f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e803049120040090L4;FFf44f02a9fd030091f40302aaf303012af50300aa5e06009400038052010180525c060094400100b4155000a9810000d021403f91131000b91f500039f44f42a9L8;FFf44f45a9f52340f9fd7b43a9ff", - "830191c0035fd6f503012a74040051e00313aa1b060094e80300aae00301aa28fc073708fc60d3c80100b5080840921f1900f1BL8;FFf65741a9fd7bc3a8c0035fd6ff0304d1fd7b0ba9fa670ca9f85f0da9f6570ea9f44f0fa9fdc30291093040b9f30300aaf40308aa3f050071c1050054680e4339L8;F", - "F1b0500913a0080520851199be91b40f9bf0209eb130540f961010054e0c3009106d0ff97e01f40f9070000141b0500910851199be91b40f9bf0209eb130540f9BBBL4;FF620080526aaf11a9682713a9f5030aaa682714a9a80300b008c13d91bac31b3868ab00f9fb030baafdacff97ea0315aaf55f40b", - "9eb031baa800744ad68220191L4;FB726d696e652073656c665f73657373696f6e3a20c000124661696c656420746f206465637279707420c01b206d65737361676520776974682072617463686574L8;FFe1030daa2200805265c60094fc031faa7a6201a9080080927c0600f921f9ff17810000b4e0031", - "caa220080525cc60094b80000b4e08b42f9e10318aa22008052BL8;FF6d460194c00200b000201d916a460194c00200b000801d9167460194c00200b000e01d9164460194c00200b000401e9161460194c00200b000a01e915e460194L8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29", - "050091200108ab62000054fd7bc1a8c0035fd6000100b000a019915d460094000100b000801291BBBBL4;FFaa094079783d4039a80316b8081c40b9a93316b8a9f140f8e80f00b9a8194039e91b00f909184039a8a3173808084079ec1f00b90c0040b9a9231838697140f8L4;FB66353665333634356363", - "642f303639353962342f7372632f76312f6368756e6b65642f73656e645f63742e7273002f636172676f2d6769742f73706172736570L8;FFe86f41f9c80000b4e07341f9e10308aa2200805262e60094e10314aae87f41f91f0500b1c0010054c80000b4e08341f9e10308aa2200805259e60094e10314a", - "aBL8;FFb3831ff8b366019468620091e1020090218c2d91a32300d142028052e40314aaa8831ff8ab660194ab660194f44f43a9fd7b42a9ff030191c0035fd6ffc300d1L8;FFa80000b4601240f901f57ed34200805263660094681a40f9a80000b4601e40f901f57ed3420080525d660094682640f9a800", - "00b4602a40f901f57ed342008052BBBL4;FFe80300aae00301aaa8fb0736180000148082c23ce8031faae9031faaea031faa200080522b008052e007803de007c03d680200a96a2601a9e003803d6b1200f9L4;FF2005005460424079002c46d31fbc0071ed070054611240f921cc74f240090054340000b", - "08202109141404e393ffc0371600700542104001141400e39001c0051L8;FFc0035fd6e8a34039a00100d000c03991a301009063e02391a40100d084403a91a273009141038052a87300396ca6009420008052e10316aa66a60094283c0012BL8;FF298400d13f8100b1e2090054e90400b4ea0200904ab1", - "40f95f0900f163040054e90700f9e92300914a0200d04a710391eb430091f40300aae92b01a949008052L8;FF55008052040000143f404071680080521535889a680240f9080114cbbf0208ebe8000054680640f93f0002710801148ba20100540101003926000014e00313aaBBBBBBBL4;FF9cf9ffb5200", - "00014090180520801098b292100910801148a206b68fc00a8200e0a00669e0afbffb5f9ffff17200340fd00a8200e0800669e0801c0da0811c0daL4;FFe00700ade81300f9810000b4e01b40f922008052621a0094e10340ade81340f9960200f9880e00f9280080528082803c810a803d68520039f44f4b", - "a9f6574aa9L8;FFe90080521f1d00f10831899a29008052360908aae80313aa954e00a9885a01a9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6f8031faae00318aae10313aaBBL4;FF10e15f38ca010a4a2ea15f3824d15f3825e15f380cb15f3811f15f38cb010b4a8e000f4a21b15f380a911f38af", - "00104a2af15f38120140392c000c4a30014039L4;ZFL8;FFa363009162018052a80f00f9b19a009468620091810100b021381891a401009084801691a363009182018052a80f00f9a89a0094a89a0094fd7b41a9f31340f9BBBL4;FFa8031df8e1f7c43d08088052a9831ef8000801ade057c03da80203a9", - "e00313aa0083853ca08b7eada1039c3ca85e04a9a10200ada20a803d59da0194e09740f9L4;FB08000000000000000800000000000000c4584400000000004f74686572000000000000000000000008000000000000000800000000000000c85e440000000000L8;FFfe0704f9e8cf03f9e8ab40f9e40b04", - "f9e8d303f9e8d740f9ef0f04f9e8db03f9e9a349a9f21304f9e61704f9e8e303f9e8df40f9e9df03f9e8e703f9e8af40f9BL8;FF963b01b4e8074091c10600d1e04316910881099157a80094e86352b9f86b52b908070036e93b49f9ea3f49f9e86f52b9f5cb42f9692a01a9e9d742f978220129L8;FFb30", - "700143b008052f4b340f974faffb535008052f6bf40f996fbffb53a008052e8e740f9e98742b9f55307a9f63700f91f0500b1e96700b9fa2f00f9e0100054BBBBL4;FF17000014086aec38a805f836090a80528a2100d1ab0a40f989fd099b4a010e8a0d6a2c38ac0e40f9080140920a020a8be00f43ad68", - "0108cba18b7bad4d210039L4;FB726167652f696e6d656d2e7273002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f68L8;FFe18307ade08b41ade08b08ad402700b4e0c303918cf7ff9787010014e1430091e20313aaf70b00f9", - "f73f00f966050094e08743adf50300aaf4cb00f9e0870aadBL8;FF677a0194e003132af44f47a9fd7b46a9ff030291c0035fd6081840f9092040f90801028b081800f9a90100b408018052080109cb1f0102eb0b31829a7f1100f1L8;FF1891ff97e11740f9e00315aa21feff17e06300912200805223008", - "052240080521091ff97e11740f92efeff17e0630091e10317aae20315aa2300805224008052BBBL4;FFfb031faa1800809208050091350080525a008052e83700f9f44340f9480080d2a06301d10800f0f29702168ba8831af84aa3ff979402168b2803188b9c16c038L4;ZBL8;FFf44f05a9fd030091ff8", - "325d1ff0300f9f40301aa283040f9e22300f95f0008eb41380054f60302aaf30300aae023019181a2019102328052f50303aa60ba0094BL8;FF00002c91693a0194f3031faa088c45f81f0500b181ebff54e8031faa080113abe3020054a00200d0000029915f3a0194f3031faa088c48f81f0500b121eff", - "f54L8;FF78ca43f9fa5f09a9f7db43b9f6df43b9e86300f9e8f741f9fafb41f9f55300f9fbff41f975c643f9e85b00f9080340f9680000b4e00315aa00013fd6010740f9BBBBBL4;FF230080522400805279fdff97760a40f940ffff17e00313aa22008052230080522400805272fdff97610a40f973feff", - "17e00313aae10319aae20317aa23008052L4;FF61ffff54e0025ef8e10316aae20314aa790a0094c0feff35f40240f9d40400b4f6825ff85a0a0094e00314aa21008052580a0094a00b00b4e10316aae20314aaL8;FFf44f43a9fd7b42a9ff030191c0035fd6e80b40f900008092742200a9f44f43a9fd7b", - "42a9ff030191c0035fd6080040b20811c0da081540d2080d088b08250191BL8;FFaa135df8ec430039eb0700f9210a0054eb0740f968260039e83b40796a1200f8ea1b40b9ec434039692e01a9eb024039e91240b8681e007968111d126aa200b8L8;FFe80f00f933fb7fd3618a0094e00313aa410080525", - "f8a0094e00a00b579020014f70314aa5a8a00940066805201018052588a0094a05000b4f30300aaf4031faaBBBL4;FF67ca0194b80000b4e0031caae10318aa2200805262ca0194b60000b4e00b40f9e10316aa220080525dca01949b0100b4e00314aae1031baa22008052f44f56a9L4;FB5b0000002600", - "0000d5184900000000006a00000000000000fb0000002e000000d5184900000000006a000000000000009c0000002e0000000000000000000000L8;FF6013c93c685340f9f9030caae04700f9e0831d91e16f00f9e1030e91f5c301f9f5430d91efb702a9ee6700f9eb2b00f9ea1f00f9f4230e39a092833", - "ce8cf01f9BL8;FF674a0194610e40f9e10000b4601240f922008052f44f42a9f65741a9fd7bc3a85f4a0114f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f30b00f9fd030091L8;FF3f0500b1e01e0054f30300aae00308aa22040094e80300aae00313aa090140b22911c0da291540d2290d098b2925", - "019129fd46d30801098b130500917f0209ebBBBBL4;FFe83f40f9e92b48a9480101d12b01019109dd7992e92f02a909fd47d308194092e82701a948011a32e80f00b93e000014e8d676d3e08753adea03142aa9dad793L4;FB5c0000001c000000496e76616c69644c656e67746800000000000000000000", - "0008000000000000000800000000000000a8774200000000000000000000000000L8;FFf50300aae00313aa22008052230080522400805213010094610a40f9e00315aaa9ffff17e00313aa2200805223008052240080520b010094610a40f9b6ffff17BL8;FFb46a0194e10200b021201891e40200f084a", - "02391a363009102018052b30f00f9ac6a019468820091e10200b021742a910403009084c02791a363009122018052L8;FF08c51a91e82b1ea90a078052c8048052ff2719a9490100b029ed0c91e92b1ba9290080d2e14306918946c0f2e87f1aa9e8271da9666a0094e80342f9e9235039BBBL4;FFe0179f", - "1a80aa0194081f4039ea0b40f9e902000a7302090a1f010a6be0179f1a79aa01946802000a0001001276aa01941f1c007220050054972e40f9f30f40f9L4;FF7c0d0094e88300910900009029212191a8273fa9e8030091210000b02148019100210091a24300d1defcff9728008052e80300f9770000b4e", - "00314aa7f030094L8;FF14e11f78b51200d1b50b00b4884740b8097d10531b05c05a3405c05a9a0200b4c80a1a8b6a3f001209c15f785f01096be9979f1a29219f5a291d007200feff54BL8;FFe8f304f9fefdff17e80200b008b140f91f0500f149040054e12340f9a04303d102048052b44303d17ceaff", - "97e8ffffb008710c91e92740f9b42338a9c8fffff0L8;FFe8a74329e9c73f39e8cb3f39e8a74229e9cf3f39e8d33f39e8a74129e8db3f39e80b40b9e9d73f39e8df3f39e80356b9e8ff3f39e807409108011891d82a0094BBBBBBL4;FF20008039a001f8b728040091490400d121000014890080d2480080", - "52e02300390900f0f2e827003928017fb220000014e80741b21e0000145f2800f188000054L4;FFe09b00b9a04700d196c4ff97e09700b9a04700d193c4ff97e09300b9a04700d190c4ff97e08f00b9a04700d18dc4ff97e08b00b9a04700d18ac4ff97e08700b9L8;FF0901003909fc68d30a0500390afc", - "60d30911003909108052293408330b0900390bec78d30a1500394a0040b909210039490840796b011c320b1900390c1d0039BBL4;FF0000803da8833aa9a8831bf8090000143b00805237008052baef3aa9fb0314aaf4031caafc0340f9ba831bf8bac301d12803168ba0a300d1e1630191f9a305a9L4;ZD", - "L8;FF080500911f0109eb69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff54800100d000e028915e920094600100f000c012915b920094BBBL4;FF0900f0f2e8a7003929090091e91300f9f3feff17890080d2e0a30039480080520900f0f2e0830091e8a7003929090091e91", - "300f94bc80094dcfeff17e80741b2L4;FB4f1374182d384361d948e28948c32841a4e766e6361ff6641a288f6aff8b89baf50c5e73e7750ec6d61d804728c505b6f24a3743000000f9690b4e804a58484bL8;FFe9af08a90ba559a9eb6b00f9eaa71ea90aad5aa9eae700f90aa55ba9e9ff00f909ed40f9e", - "a2f17a90aad5ca9e9cf00f909f140f9e9b300f909f540f9e9c300f9BL8;FF2a040091e00318aa09692138e1431691ead302f90e0c0094fad342f9e8cb42f908011acb1f0308ebe8340054e8cf42f9e10319aae20318aa00011a8b60520194L8;FF1f0500b1e063813de99305b96000005460630291c2ecff", - "97f3d352a9140200b47622009104000014940600f1d662009160010054c1825ff881ffffb4c00240f9BBBBL4;FFe96a9852f30308aaa9d5bb725f01096ba1040054680400f008b140f9680300b4a91b00b9a8630091e90300b029010391ea030091a07f0091e82700a928008052L4;FBea01000005000000", - "9a964800000000003300000000000000f0010000050000009a964800000000003300000000000000fa010000050000009a96480000000000L8;FFff030291c0035fd6370080521800809219018052a80640f91f0116eb890d0054e00313aa1af2ff97e80300aae00301aae8fd073708fc60d3080d00b5080", - "84092BL8;FFab531538ab835538a9631538a99355384a01084a6b01084aaa731538aaa355382901084aab831538abb35538a9931538a9c355384a01084a6b01084aaaa31538L8;FF7f0600b180030054e19b49f93f0400b140010054810000b4e09f49f9220080525f720094e1a749f9810000b4e0ab49f9", - "220080525a720094b30000b4e07b49f9BBBL4;FFa8035ab8e8f9073728008052a8031af8ccffff17281800511f090071030600543f140071600000543f200071410b00543f140071a1c31eb8a00d00543f200071L4;ZBL8;FF68018052740e00b95dffff170801176b030800540809c05ae0031faae80b00", - "b9c82e40f904000014009000911f0002eba2f7ff54011000913f0002eb28030054BL8;FFe85306f95728009470000014e05306f9e0833291a10200902120099102028052a30200906394159184018052e3000014e05306f9e0833291a102009021200991L8;FF3f0000f10841899a1f2d00f1e20a0054c80", - "240f9a80000b4c00640f901e97bd3020180525e320094e00316aa01098052020180525a320094e0431591e1431a91BBBBBL4;FFf76240391b00188a296b7bfc208d282e0800669e1cc101f2e0020054e90700f98803c0da0811c0da680f488b0801188a3a1b08cb48035df8bf0208eb21010054L4;FFe011", - "0037b70000b4e00316aae10317aa22008052620200945ac300f17bc3009161faff542e000014a0a300d1e10319aae20315aa23008052240080523de3ff97L8;FF2200805266020194611a40f9810000b4601e40f92200805261020194b40000b4600640f9e10314aa220080525c020194742a40f99f0600b", - "1e002005473d645a9BL8;FF010300f021702991e00308aa82008052fd7b41a9ff8300919f820114ffc300d1fd7b02a9fd83009109600091e80301aae50300aaa9831ff8290300b02b812f91L8;FFfd030091080840f9f30300aa22008052e00308aa62820094e00313aaf30b40f9fd7bc2a8e81f80520800", - "0039c0035fd6fd7bbca9f85f01a9f65702a9f44f03a9BBBL4;FF84603791e0031faaf70301aae1031f2ae3031f2af50308aa91c2019402a09152a403009084c03791e204a072e3031f2a8bc201941f0017eb610100543f00166bL4;FB6a00000000000000890000002e000000e4674900000000006a00000", - "000000000f30000002e000000e4674900000000006a00000000000000950000002e000000L8;FFe90315aada0000b4e05b40f9e1031aaa2200805262c20094e90315aae0874da9810000b4220080525dc20094e90315aae12340f961f9ffb4e00309aa22008052BL8;FF610a40f9680240f91f0101ebc003", - "0054690640f92a0400910b0480521f010aeb6a0a00f92b692138a00300542800805228692a3848050091680a00f9f44f42a9L8;FF22008052664200944dfeff17fb0300aaf80b00b99a0400b4fb0300f95c420094e0031aaa210080523b0080525942009440f8ffb4fb0340f9e2031aaafc0300aaBBBBL4;", - "FF99008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb83d700541803008bf9feffb50f0000141f0400b1e1d600547ce201941f100031L4;FBb89d430000000000000000000000000000000000000000000100000000000000fc9043000000000097ea4800000000004e0000000", - "0000000b904000017000000L8;FFe8635e391ffd0371800f00546083c13c6193c03cea030b91e8e30d39e8df43f92003029140f18e3ce9cb43f9f8432d91e1eb803de0ebc03d41f1ce3ce8cf01f9BL8;FF42018052e80700f9a7620194fd7b41a9ff830091c0035fd6e10200b02130369162028052fd7b41", - "a9ff8300919a620114fd7bbea9f44f01a9fd030091010040f9L8;FF290040f91f0002f1431a00543f0108eb13601932200100542a0440f91f1040f15369283808050091280800f90202005400fc47d3c7000014e10300a9e00301aaBBBL4;FF690300b029811491880c8052200541ad084001392211c03d2", - "80a8052680201a9000401ad210140ad0900f0d2681200f9280080520210803d010000ad682600a9L4;FF3907005139771e5325070011240b001163d865781f0003eb9980991a42d879781f0002eb3997991ae003192a46feff97e103002a8002f837397f4093c0021091L8;FF82008052a4a20014ff8300d", - "1fd7b01a9fd430091810100f021cc1491a40100d084c02091e323009182008052e80700f99da20094fd7b41a9ff830091c0035fd6BL8;FF20008052e10314aa72220194ff8301d1fd7b03a9f52300f9f44f05a9fdc30091e90300aae10700f9220d41f83f0002ebc1010054000440ad8b0200b06be10c91B", - "L4;FFf65741a9fd7bc3a865220014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f44f01a9fd030091f40300aa68018052f30300aa818e41f8290041d23f0000f1L3;ZBBBBBBBBBL4;FFfc6f05a9fa6706a9f85f07a9f65708a9f44f09a9fd030191150c40f9e9430091e22701a9a80201ab420f00541", - "70440f9f30300aae9060091ff2200f129fd43d3L4;FFfd7b03a9f72300f9f65705a9f44f06a9fdc300910920403909080037010040f9f30300aac200009042a02391e0030091e3018052f40308aadc110094e80340f9L8;FFf65743a9f85f42a9fd7b41a9ff430191c0035fd6f7031faae00317aae10314a", - "a6c1c019480020090004012918302009063c011918402009084e02291a20700d1BBL4;FFf85f03a9f65704a9f44f05a9fd030091ffc324d19f8000f1f40300aaff0300f9c1040054600440ade8e31291a08301d1f30302aaf60301aaf5e31291a0073dadL4;FF018c40b9a102f836611640f9601e40f93f0", - "000ebc0000054632640f9e00313aa020080d2010080d260003fd6618240a93f0000eb60010054210000cbe00313aaL8;FFb59c0094fd7b41a9f31340f9ffc30091c0035fd6090040b9e80301aaaa0100b04a810391e00308aa620080523f010071a90100b0298d039121118a9a969c0014BBBL4;FFf74305", - "91080b0039e82341b91b030039080f0039e81341b91c07003908130039e80341b908170039e8f340b9081b0039e8a75b29091f003908230039e8a75a29L4;FB7061727365206120555549447468652055554944206973206e696c00000000000000000000000000080000000000000008000000000000001", - "447440000000000L8;FFe82b14a9e81b44f9ea2f44f9e92313a9e85344f9e94f44f9e8d300f9e85b44f9e8ef00f9e86b44f9e8e300f9e87b44f9e8f300f9e88344f9e8f700f9e88b44f9BL8;FF635c01940004805221008052c35c0194e07c01b4f40300aae0fbc63de1ffc63de8074091e2074091e00315", - "aa0881099142c03591e1031baae30318aa04048152L8;FF6f5c0094c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aa2200805246000094610a40f98affff17f50300aae00313aa22008052BBBBL4;FFf85f44a9fa6743a9fc6f42a9fd7b41a9e923c76cc0035fd6000400f0", - "0080159176fc0194e923b96dfd7b01a9fc6f02a9fa6703a9f85f04a9f65705a9f44f06a9L4;ZFL8;FFe91300f957f2ff9709000014e10740f9e10000b4e80b40f9f30300aa22008052e00308aa5efc0094e00313aae01300f9410200d021f81b91430200d063441991BL8;FFfd7b42a9ffc30091c0035fd6", - "093000912103009021d43c91a9831ff82403009084602091060300d0c6e0129103200091a52300d1e00308aa22028052ac7c0194L8;FF6f7c0094e802168be81700f97f0600b18096ff54e263009140008052e10315aa3990ff97affcff17e8031faa000116ab224f0054e1630091a67cff97bf0600b1BBB", - "L4;FF02000014480f0091a00301d1a8031cf854b20094f90300aae1db41a9f76343a9f4d744a9790200b43f0400f18b000054e00316aa2200805259bc0194ff0600f1L4;FB0800000000000000bc0e48000000000080f347000000000018000000000000000800000000000000f00f48000000000080f347", - "00000000002000000000000000L8;FFe91b00f9e82300f9396842a9e11b0054f80301aaf70300aaebab00a968021891094080524a008052cbff9f52edff9f521c008092050000140c02003529010ecbBL8;FFce11c0dace1540d2ce0d0e8bce250191ad194e8bbf010ceb830500546b0500f1ec030daa81f", - "eff54a90109abe300005423000014e8031faa090840f949fdffb5L8;FF00013fd6e10640f9810000b4e20a40f9e00315aa623c00949f0b00b101120054689a42b91f090071e005005468620a9169b20a910001c03d081140b92001803dBBBBBL4;FF0001178b6e0c0294e802158b680a00f9804e41b98001", - "0034610a40f9680240f91f0101ebe0330054680640f9090580522a0400916a0a00f909692138e10313aaL4;FFe9feffb40a1f00124a09380b4a791f535f0d1872410100540b1540386bc100517f250071c80000544a1d0012290500d158012b0b0a7f08534afe073608008092L8;FFc0035fd60820009120", - "0440a9a92300d10a0000904a711c9162020090428c2b91a8831ff8e9ab01a9e3630091790c0194fd7b45a9ff830191c0035fd6080440f9BL8;FFab8c0194946200f121ffff54e0030091a88c0194f44f43a9f51340f9fd7b41a9ff030191c0035fd6ff8301d1fd7b02a9f85f03a9f65704a9f44f05a9fd83", - "0091L8;FF09693438e87740f9f77f00f9ff0208eb01fdff54e0a30391b38b0094e5ffff17f4031faaf5031f2ae9031faa1c03805248008052f32f00f9e81b00f90a000014BBBL4;FF28008052680200b9ff030891f44f43a9f65742a9fc5f41a9fd7bc4a8c0035fd6ff8303d1e923076dfd7b08a9fc6f09a", - "9fa670aa9f85f0ba9f6570ca9f44f0da9L4;FB74c07fd062e069f0bb10b000ad30a62097509c4081708a60e390e880f5b0fea0cfd0c4c0d9f0d2e076217d3160016b115a6151714c4147512ea125b138813391L8;FF695340f96027c03de87b00f9e8835739e16700f9e1c30391e99300f9e9d343f9f4c74", - "3f9e047803d6093c73ce93300f9e9df43f9e8e30339684740f9e0a70ba9BL8;FFe9c700f9e10740f9010600b599feff17e8b740b92043c23cc0e200912183c33c2207c03deab341b91f010071f8c741b9801f803de9079f1a818308ad0801094bL8;FF6b1540d26b0d0b8b6b25019129194b8b2905009129", - "010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebBBBBL4;FFe0230091e10317aae20315aa230080522400805276dfff97f70f40f9e80740f9080117cbbf0208eb49f7ff54e0230091e10317aae20315aa2300805224008052L4;FB080000000000", - "00007085420000000000496e76616c696453657373696f6e537472756374757265496e76616c696453656e6465724b657953657373696f6e0000L8;FF74f7ffb5e00308ab43f8ff54400200b000c01a9165ec0094e00313aa2200805223008052240080520e030094610a40f99fffff17e00313aa2200805", - "223008052BL8;FF040e80527a5fff97f85f41a9f50340f9c80217cb1f0308eb69f0ff54c80218cbe90208cb1f0109eb69010054aa0216cb5f0109eb03010054080e8052e10740f9L8;FFf90303aafa0302aaf80301aaf7a30391e52b00f983f2ff97e87740f91f0500b1e00c0054e82300f9e9234fa9e082", - "c33c00630291e82703a9f62351a9e95750a9BBBL4;FFfc571ba9f44f1ca9fd83069100e4006fe40301aae30300aaa0c302d1e1031faaf30308aae00300ade00301ade00302ad92f7ff97a0877ead88030090089d0991L4;FF63080054680640f9e10315aae20316aabb02168b0001178b660e0094e802168", - "bf5031baa680a00f9ecffff171f010271800100541f01037100fcff5448030037L8;FFe00b00f9201f00b461ac009440008052410080525fac0094e00700f9601e00b45bac0094400080524100805259ac0094e00300f9a01d00b455ac009440008052BL8;FFe8060036e14741f9a10600b4e04b41f92200", - "8052622c0194ffa71139e89740f91f0500b14106005433000014a082c03ca182c13ce80200d0a282c23c400707adL8;FFe0e7076f08188052e9030291a8033da908048052f90300aaa8031ef8e8074091e10318aa08011891000000ad20a10b919a05ff97e8034bf9fc074bf9fb0b4bf9BBBBBBL4;FFe103", - "1faae20314aa230080522400805277070094e90640f9610a40f9680240f99f0209eb9532899a080101cbbf0208ebc9f9ff54e00313aae20315aa23008052L4;FF68008052eaef4bf9e96b02f9e9eb4bf9e0230891e8830a3928008052e143139142008052e86f02f9e97302f9ea7702f95a0c0094e007409", - "100401d9180f2ff97L8;FF680200b9616a29f8f44f44a9f65743a9fd7b42a9ff430191c0035fd6211a00b40900c039281d0012090cf836090440391f81037129150012430b00540a084039BBL4;FFf85f1ba9f6571ca9f44f1da9fd030691f70300aaf30308aae803039100800091f50304aafa0303aaf80", - "3022af60301aa9a6d0094e8534ca9f96b40f91f0500f1L4;ZBL8;FF000500911f0009eb28dfff548001009000c0129165940094800100f000600e9162940094fd7bbea9f30b00f9fd030091f30300aa188fff9728008092680200f9BBBL4;FFc9080054810340f9200080398000f8b728040091490400d11", - "10000145f2800f1880000542800028b08f1df388804f837e0830091f33d0094e82340b948320037L4;FB982049000000000049000000000000006901000027000000617373657274696f6e206661696c65643a2065706f63685f7365637265742e65706f6368203d3d20L8;FFeaa318a929a84ca9e9eb00f", - "929a04da9e9a700f92ba44ea9e88f00f928a007910001c03deba300f92ba04fa9e0f3803dea2f13a9e8a701a939a450a92aa051a9BL8;FF0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb281700544c000014fa031faaf9ab49f9f8074091188309913f0700b100180054L", - "8;FFe8a305f9e8c32791e9a705f993540094e89b40f9e9c316910a0000d04a713e91e9a305f9e9c32791e85b04f92800009008111d91e9ab05f9a90000d029710391BBBBL4;FFa83b0079e81b00796852017828008092aa1b00b9a9031ff8ab831f38ea0b00b96a1201b86c7201f869f201f86b9e0039680", - "200f9fd7b44a9f32b40f9ff830191L4;FB737065724d6573736167654b6579736c69627369676e616c5f70726f746f636f6c3a3a646f75626c655f72617463686574736b697070696e6720636f72727570L8;FF23f4ff97e80300aae00301aa08020037750240f9a80640f9160100eb62020054e80f41b2e", - "80300f907000014c90080d248008052e02300390900f0f2e8270039BL8;FF040300d084a02391a363009162008052b30f00f9af740194af740194fd7b41a9f31340f9ffc30091c0035fd687d2ff17e00301aa010300f021a0199122028052L8;FFd61400943f0700b1a0100054e1d342f9e8cb42f91f0101", - "eb60c10054eb074091e8cf42f92a0400916b8109914902805260c1009109692138ead302f92a2b0094BBBL4;FF75410094a80356f81f0500f120030054c082c63cc182c73cc282c83c600604adc082c23cc182c33c622a803dc282c53c600602adc082c43cc182c13c600a03adL4;ZDL8;FF011119cb66b4", - "0094e80340f91ba300a908008092080300f9950400b4e00316aae10315aa22008052f44f4ba9f6574aa9f85f49a9fa6748a9fc6f47a9fd7b46a9BL8;FF022880526e340194e0c32291e1c32791022880526a340194e0c31d91e1c322910228805266340194f3031faaf9031faa35008052e0c32791e1c31d", - "9102288052L8;FFa1eeff54a0220191796bfe9772ffff17e80f45f91f0500b1e1000054ff0f05f9f81305f9ff1705f9ff330ab9ff1f05f9ff430ab91f0800f1212a0054a02302d1BBBBBL4;FF2981c9930badcbca4801088b6901098b0acdcaca0881c8932bc1cbca4901098b6801088b2c81c99329bdcac", - "a0badcbca2801088b6a010c8b08cdc9ca4bc1cbcaL4;FF130180521f080071e2f7ff54f7031faaf5031faa14018052bf0a00f1400a0054bf0e00f1014d0054880640f91f1100f1000400541f1900f1614c0054880240f9L8;FFf44f42a9f65741a9fd7bc3a864040114f44f42a9f65741a9fd7bc3a8c0035", - "fd6fd7bbda9f50b00f9f44f02a9fd030091010040f9f30300aa3f0400f18b000054BL8;FF230d40f960001fd6ff0301d1fd7b03a9fdc30091090040f968028052290141d23f8d00f12831889a090300f029b100918a0000102b7968784a090b8b40011fd6L8;FFf30301aaf40300aaf7031faa190380522e", - "0080520600001438c11f783be11f78f7060091ff4200f1a00c0054e852199b89c240f92afd44d3290d4092ff0209ebBBBL4;FFe10318aa73c4019420008052e10313aa70c40194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff431cd1f30308aa08018052ff0300f9L4;FB38000", - "00000000000530000000d0000003b63490000000000380000000000000082000000090000007375636365737366756c6c79206465637279707465643b20L8;FF810000b4e07f42f92200805264c40094e17740f9c10100b4e05f40f90a0000145cfbff17d90000b4e07f42f9e10319aa220080525ac40094", - "e05f40f9e17740f9BL8;FF880e00b5e1031faae1ffff17e1031faa886200b9deffff17811c0054e0031faa2cffff1720ebff54c80080d20800f0f20809009137000014e1010054e0031faaL8;FF8b4ffe97e103002ae8430691e00315aacf95fe97e8cb40f98082c53c8182c63c8282c73c1f0500b1e0060", - "0ade20a803d200c0054f91300f9f9430691fbe30091BBBBL4;FF61180154f9ffff1789e40194f70300aa530080521f0400b13300a07201fdff54e04305918100805282e4019400170135fb5341b957ffdfc8d70200b4ff0600b1L4;FB4700000000000000310100000d0000007fe54800000000004700000", - "000000000320100000d00000064a543000000000074a543000000000074a5430000000000L8;FFfb630929f45300b9e82f00f9f1620094e0a300917f0200f902e0ff97f44f5ea9f6575da9f85f5ca9fa675ba9fc6f5aa9fd7b59a9ffc30791c0035fd6fd7bbba9BL8;FFeb230139a8a77da9e92300f9a973", - "5d38aa040036ff0600712c0a0054d70a0035e90f41b259000014a0035df8baffff17a0831cf8e102009021bc2e91e3020090L8;FF810000b4c0825df82200805264640094c1825ef8810000b4c0025ff8220080525f640094c10240f9810000b4c00640f9220080525a640094c10e40f9a1fdffb4BBBL4;F", - "F08f53a91a203df3ca303dc3cf943019149028052e0430191e08705ada0077cade237803da203d73ca1c302d1e2030091030a8052e32b803de00703ada1037dadL4;FFe20300cb160700d15600168ad602008b36cc01f9d606188be00316aa010000d4df0200ebc1faff5420cc41f9d50218cbe10318aa05", - "0080d20400801243068052L8;FFa40100f084e00991a32300d182008052a8831ff8afa40094b40100f094a20391a101009021ec1491a32300d142008052e40314aab3831ff8a6a4009468620091BL8;FFb502000a1f01096be0179f1a7e240194886e4039696e4039b502000a1f01096be0179f1a7824019", - "48872403969724039b502000a1f01096be0179f1a72240194L8;FFe806178b198300911aed7cd3040000145ac300f139c30091a003005428035ff81f0113eb61ffff5420835ef8e10315aae20313aa70240094c0feff35f60319aaBBBBBBBL4;FFa1825ef8810000b4a0025ff82200805263180294a10e40", - "f93f0400f1ebfdff54a01240f9220080525d180294ebffff17880240f9280100b4090d8052e00313aaL4;FFe8fe70d3e9fe60d3956e00a9995a01a9889e0039280080529c820039971202b8895202789a1600f968620039f44f4ea9f6574da9f85f4ca9fa674ba9fc6f4aa9L8;FFe0030091f35b00a98ff5", - "ff97600200f00040199168180194600200f000a0199165180194600200f0004021915f180194ff0301d1fd7b01a9f65702a9f44f03a9BBL4;FFf85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd620008052010480526d980194ff0307d1fd7b19a9fc571aa9f44f1ba9fd430691f30308aae8e30091f5e30", - "091L4;ZFL8;FFa9c358384a01084a6b01084aaaa31838aad358382901084aabb31838abe35838a9c31838a9f358384a01084ac00640adaad318386a01084a2801084aaae31838BBBL4;FF96d80194e8030091e90000d029213a91a82739a9e8830091a90300f029710391aac301d1a00700d1a8273aa9680", - "08052c90300d029c13391e1e30091f91300f9L4;FB722076312e73656e645f63742e726563762065706f636820c01f3a2043743141636b6e6f776c6564676564202d3e2043743253616d706c6564001b7370717220L8;FFea6341a9f0031baaebb344a9e30317aaf70315aafb031aaafa031caa89008052e", - "97300f91b00001428a00791fa8b00f9fa0317aa0001c03df7a349a9e9bf00f9BL8;FFe00319aa09692138e1431691ead302f90f120094f90b40f9b8010034e1d342f9e8cb42f91f0101ebc0d30054e8cf42f9090380522a040091e00318aa09692138L8;FF00030014e8cb45f9090d8052e037c33d682209", - "9b000d803de03bc33d0011803de03fc33d0015803de98346f9093100f969060091e02bc33d0001803de02fc33dBBBBL4;FF28008052e21bc03de93b40f9800600ad820a803d891a00f968720039f44f4ba9f74b40f9f6574aa9fd7b48a9ff030391c0035fd6000180520102805270f80194L4;FB20746f6f", - "206f6c64203cc0013e0025636970686572746578742076657273696f6e2077617320756e7265636f676e697a6564203cc0013e001e756e7265636f67L8;FFa0873cade08742ada2039b3ca8031cf8a0873aade28343ada2833bade18340ada18338ade28341ada28339ad1af3ff97a0877cad880080d2080", - "0f0f2a9035cf8BL8;FFbfe736a9bf8317f8e1c20091a22301d12e62ff9720f1ffb41f000014a8035bb848f00737b9031bf880ffff17a22301d1830c8052105fff9700f0ffb41f000014L8;FFf91700f962780094007880522100805260780094407801b4e807409102788052f90300aa08810991fb1300f9", - "010140b263780094567800942005805221008052BBBL4;FF2800805288420039e92347a90a0400918a0600a93caeffb58b0300b06b6119910a018052600540adffab08a9ff4f00f9f6570ca9e00705ad9f8100f142050054L4;ZBL8;FFf65707a9f44f08a9fd8301914800403909150071a8c31e38020400", - "541f0900716d0400541f1100710c0700541f0d0071811000546c0400f1a01200549f2900f1BL8;FF4a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b4L8;FFe8ef41f9e9f341f9f5031faaf6d", - "743b9f7d343b97a008052e86300f918fd60d3c80080d20800f0f2e95b00f90a490091b7000014fb5f00f9fb4740f9e86340f9BBBBBL4;FFf60303aa40f3ff97601800b5e9031faae00314aae30316aac4ffff17e00317aab6090194e30317aae80300aae90301aae00316aa88fb0736a7ffff17e80f40f9L", - "4;FFf80301aa62080094e00316aa21008052390080525f08009420feffb4e10318aae20316aaf70300aa65080094e0230091e10316aa220080522300805224008052L8;FFffc30091c0035fd6281040b96800c8376800d03782080114b3080114b3080114ffc300d1fd7b01a9f31300f9fd430091e90301a", - "af30300aa61020090215c0f91BL8;FFfa0301aaf903999ae01b00f91c159f9ae81740f9fb03889adf0600b1e0070054e82f40f9e0c30291f6230ba9e80b40f9e86300f938d4ff97f60300aae13300f9L8;FFa80000b401f97fd3e0031aaa4200805263880094e9a34da97f0600b1b6031df8e94b01f9e84f", - "01f9e8030a910005c03d0065803da002803db60a00f980110054BBBL4;FF080102cb9f0208eb08020054b40200b4f50301aaf60300aa5dc80194e00314aae10313aa5bc80194800200b4e80300aad5a200a9df0200f9f44f42a9f65741a9L4;FBd5184900000000006a00000000000000ec0000002e00000", - "0d5184900000000006a00000000000000890000002e00000028294368756e6b000000000000000000L8;FFe0d7803de023c23deaef43f92841082a69914bb8e10b19ade127c23de22fc23de417c23d3b8108aae9ff43f9eccb43f9e00717ade02bc23de10fc23de9f200f8BL8;FFf30300aa810000b46006", - "40f92200805263480194610e40f9810000b4601240f9220080525e480194612640f93f0400f18b000054602a40f92200805258480194L8;FFfd030091083c40f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091092440f93f0500b1400400540a2c40f9093840f90a0100b", - "4BBBBL4;FFf85f41a9fd7bc4a8c0035fd620008052e10314aa6fe80194ff8307d1fd7b18a9fc6f19a9fa671aa9f85f1ba9f6571ca9f44f1da9fd0306915c2040b9f403032aL4;FB20000000000000000800000000000000e48e400000000000e41f400000000000280000000000000008000000000000007", - "492400000000000e41f400000000000L8;FFa0e300d1e12300916d2a009428008052a083dc3ca183dd3ca283de3ce82300f948008052e08700ade203833ce80700f9e0230091e80313aa6a260094ff830f91BL8;FF63680194000480520101805261680194400100b4155000a90103009021202a91130800", - "f91f600039f44f42a9f50b40f9fd7bc3a8c0035fd60001805201048052L8;FFfa0301aae106f8b6fb031faae0031baae1031aaa6f6800945d680094e0028052210080525b680094c01c00b4480100b008212a911a0380d20001c03d08f140f8BBBL4;FF08c30139b50000b4e00740f9e10315aa220080526", - "2a80194e02740f9f40f40f9930000b4e10313aa220080525ca80194e13340f93f0400b160010054e00314aaL4;FFe2830f32010000d4c0feffb6000080d21f000039007d20d4b542069120008052a00a0039f35341a9f51340f9fd7bd9a8c0035fd6fd7bbea9fd030091f35301a9L8;FF0181c33ce233803", - "de00703ad0081c43c0181c13ce433c03de01704ad0081c03c08fc83924803088be00702ade00b45ad1f0109ebe50309ade01bc03de2130aadBL8;FF2935899ae87b01f9e97f01f96e280194c8de7992c21a4092e0c30891a102088be2bf0a3966280194944200919f0219ebc1faff54e08756ade8830c91e", - "2bfc03dL8;FF081140f900013fd6e0e302f9e8074091e1e702f908011891290c40f9e163179120013fd6fa034bf95f0f00b18101005408018052baffff17a0c300d101048052BBBBBBL4;FFc10c00343f040071200100543f080071c1faff5481220191e003082ae20313aa2afaff97a0faffb4990000148", - "1820191e003082ae20313aa33fbff97e0f9ffb4L4;FFa04700d197c2ff97e09700b9a04700d194c2ff97e09300b9a04700d191c2ff97e08f00b9a04700d18ec2ff97e08b00b9a04700d18bc2ff97e08700b9a04700d1L8;FF692240393fe900714103005473260091baffff17e0230091e10313aaf40308a", - "a0effff97e82340391f050071e1030054e093c03ce81f80528002803d88420039BBL4;FF08017fb2aa1e409229010aaa68a600a9e10740f928008052680200b9410100b50c0000142965009169a200a908c48052680e00f9e10740f928008052680200b9L4;ZDL8;FF620100f0429c1091a8273fa9e8ffff", - "b008b13691ea2301a9e34300917d900094fd7b44a9ff430191c0035fd608100091200440a9a94300d1eaffffb04a013791BBBL4;FFf90301aaa101f8b6f6031faae00316aae10319aa6fd0019428008052f3031aaa38008052e83b00f9e05340f994a80094f90301aaa1feffb7fa0300aa190b00b4L4;FBa", - "c9be552e6e3a28c20d59c090000c890211f92fe5c1b8cafcb9aaf2a8825e1e1ddbeaf10e5240eb2d30c7c1c68cf8a14d4c2dfa47d287026a4e47b400668764eL8;FF092d4da9eacb00f90aa107914101c03deba700f90b7140f9e99b00f9e9ab43f9eb8f00f90ba94ea9a9031ef8e9f301f9097d40f9e127", - "833de9af13a90b2550a9BL8;FFe002009000c02f9168500194e002009000002c9165500194e00200900000299162500194e002009000601f915f500194fd7bbaa9fc6f01a9fa6702a9f85f03a9L8;FF755e01a9600604ad820344ad620205ad810341ad610202ad820342ad620203ad810340ad610201adf", - "f032e91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9BBBBL4;FFe30319aae40318aafb030291e10300f9e00301ade00302ade00303ad973b009460874bad280080526267c03d635bc03dfc830391e0830391a10303d1e2830091L4;FB3200000000000000a800000014000000656d7074792073656e6", - "46572206b65792073746174656c69627369676e616c5f70726f746f636f6c3a3a73656e646572L8;FF07000014e80b41b2e00700f904000014c80080d20800f0f2080500d1e80300f9e00300914fe6ff97e10300aae10300f9210200f021b41991230200f063d01391BL8;FF6c0140b28c11c0da8c1540d2", - "8c0d0c8b8c2501916b194c8b6b0500910a0100b44c0140b28c11c0da8c1540d28c0d0c8b8c2501914a194c8b4a0500914a010babL8;FF0800098b080500911f0109eba816005439000014f9031faafbab49f9fa0740915a8309917f0700b18017005440c30391ea240094080040b20811c0da081540d2BBB", - "L4;FF67b00194e4ffff17a0877dada203dd3c680200f96282823c6082803c6182813cd90400b4e03740f9e10319aa22008052330080525ab00194f6031f2aa5ffff17L4;ZBL8;FFe87301f9ff7b01f9e87f01f9ff8f01f9e88b01f9ff9301f9e89701f9ffa701f9e8a301f9ffab01f9e8af01f9e8bb01f9f", - "fbf01f9ff230e39e80701f9ff0301f9BL8;FF810000b4e0ff42f92200805264300194e8c3179100810091d9e6ff97a80359f8a003d83ce1833291022b8052f30703f9e80303f9e8c3179100810091e07f813dL8;FFc80000b40805088be00316aa0201805201ed7cd36230009420c3c63ce87f42b99f0b00", - "b1f66b42b92013803de85302b9c1010054e85342b92013c03d69120a91BBBBBL4;FF4d00261e0d0600372d00805202000014ed031faa8c21009180010e8b0e000a8a22696efc438c202e6f00669eefc101f2c1fbff54e8ffff1701827ca915de3ca9L4;FF88008052f30300aae0230091040180520503805", - "229f87fd33f1100f13481889ae30314aa0c000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9L8;FF2400805217170094770a40f9c9ffff17a8831ff8a84300d1e900009029d12491400200f000940b91e8a700a9a82300d1620200d042001191e1230091e8a701a9BL8;FFe75c0891e003", - "08aae2018052e4008052e9af00a9ea0300f9a7800194fd7b42a9ffc30091c0035fd6080040f9290300f029c11191e00301aa0801403908711d53L8;FF6803198bfb0b40f9fa0f40b9e81700f9b8010034e11740f9e80f40f91f0101eba09b0054e81340f9090280522a040091e00318aaea1700f90969213", - "8e1630091BBBL4;FFe863403915f000f80938003929008092087c0039080480520a7001f8602201a9692200a9f44f45a9f71b40f9f65744a9fd7b42a9ff830191c0035fd6aa0300b0L4;FBd3784900000000003800000000000000ab0100001e0000006c69627369676e616c5f70726f746f636f6c3a3a73", - "657373696f6e5f6d616e6167656d656e744375L8;FFe00743ad751e00f9600604ade20344ad620205ade10341ad610202ade20342ad620203ade00740ad600606adff431691f44f45a9f65744a9f85f43a9fa6742a9BL8;FF952240f9550300b4610a40f9680240f9941e40f91f0101ebc0090054680640f", - "9490580522a040091e00315aa6a0a00f909692138e10313aa05faff97760a40f9L8;FF74400094a00100b4f50300aa60400094e00315aa21008052f40315aa360080525c400094a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad3BBBBL4;FFf9ffff178ae00194f70300aa1f0400b14", - "1fdff54e04305918100805285e0019460970035e85341b9e88300b957ffdfc8d70200b4ff0600b100030054f8430591L4;FBffffffffffffffffffffffffffffffffffffffffffff504e493a0000000000000000000000000000000000000000000000000000000000000000446a626e6f20L8;FFe003012", - "af44f42a9fd7b41a9ffc30091c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff071df82c0040f9e9008052BL8;FF200100b4140000f9e10200f021e00491131800b91f700039f44f41a9fd7bc2a8c0035fd6000180520104805274600194fd7bbda9f50b00f9f", - "44f02a9fd030091L8;FF10ffff17c80080d20800f0f2080500d104ffff17c80080d20800f0f20809009100ffff17c80080d2e10b00f90800f0f2080900d10f000014c80080d2a1831df8BBBL4;FFe10313aae2031caafb0300aa6ca001942003c03d9f0700b1f43b00f9e083873c20030054e0c301914c89", - "ff970803156bf51f00b942040054f30a40f9fc0700f9L4;FF1fcc74f22101005420008052c0035fd620cc749200fc44d3000400d11fc022eb63f8ff54e6ffff1700cc749200fc44d3000400d11fc022eb82feff54bcffff17L8;FFe2008052b2a00094810100f0215c1f91a40100d084402691e0030091a3", - "63009162018052b30f00f9aaa00094aaa00094fd7b41a9f31340f9ffc30091c0035fd6BL8;FFe0031f2af44f45a9f71b40f9f65744a9fd7b42a9ff830191c0035fd6e0230091e20301aae10308aa69fdff97eaaf40a96901158b480115eb690200f922f0ff54BL4;FF4d15c039ae1d00128c1d0e0b8c0102", - "518d00f83761710c8bcb008052280000149f114071630800544d19c039ae1d00128c390e0b8c1140518d00f83761710c8bL3;ZB" + "BBBBBBBBBL8;FB63762065706f636820c0223a204374315265636569766564202d3e20456b53656e744374315265636569766564000c73657373696f6e20666f7220c01d206861L8;FF080109cb090e80520829099b1f0900f99f031bebc20400548aa240a9a09300d1890240f908011c8b1f0109ebe9338", + "99a080109cb090e80520829099b018940a9BL8;FF60ea40f922008052db24019460220091f4feff9760a20791f30b40f9fd7bc2a887feff176042069151000094e00313aaecfeff9760420891f30b40f9fd7bc2a8L8;FF03feff540b7c07533f0108eb6b611932000100544b692838080500911f0048f128", + "0800f9a202005400fc4ed354000014e00700f9e00301aaf30301aae10309aaBBL8;FFf903002ae00301aaf40305aaf50304aaf80303aafa0302aaf30308aadd600094f60300aae0031aaaf70301aad9600094fa0300aafb0301aad264019400048052L8;FFe0430039e02300910800f0f2ff470039e80700", + "f93e6bff97e80300aa81fdffb021003991a3fdfff063602291e023009102018052a4008052e80700f909000014BL8;FF810000549fde01a99ffe02a997fe03a981620091e20313aa5bf4ff97a0fbffb454000014800b00b5e00313aabbf1ff97e80301aa60000036c8faffb45e000014L8;ZDBBBL8;FB1b1", + "b1b1b001b1b1b1b1b00131b1b001b0000070000443f350b16493a657b753a0627110000000000a4ea450000000000b4ea450000000000b4ea450000000000L8;FF60040054e11740f9e80f40f91f0101eb00030054e81340f929040091e00316aae91700f9176921382aedff97e16300914b92ff97c80240", + "f91f0500b1a0000054BL8;FFe082c13ce28301ad6f000194c81a00121f810071c21a0054e80700b9e8430691e04303919e000194c8fefff008c13991ff7f01f9000540adff7b01f9f30700f9L8;FF1f69213821488052e0330091c23680520101a072140e0094e000f836ee0d0094080040b91f110071e0f", + "eff54200080521d000014f503002af8031faaf94b1432BBL8;FF61feff54e80216abc2020054080115abe2140054697e40f93f0500b180020054691241b93f05007161020054691641b9290140b22911c0da291540d2290d098bL8;FF9f0208eba8040054340100b4680640f9e10315aae20314aa0001178", + "bdd440094e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00013fd6L16;FFe8db43f9faeb43f9f7ef43f9e1f343f9fef743f9e8a71aa9e8ff43f9e9e743f9e70b44f9ec1b44f9ed4f44f9e8b700f9e80344f9f55f44f9e66f44f9e57744f9BBBBL8;FB080000000000000078264300", + "00000000382643000000000085154000000000004c00000000000000e200000014000000a1104000000000004d00000000000000L8;FF4901084aaa035838a9e317386901084aab135838a9f317384901084aaa235838a90318386901084aab335838a91318384901084aaa435838a92318386901084aBL8", + ";FFfd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091150840f9080040f9f40302aaf30300aa080115cb5f0008eba8010054b40000b4680640f9e20314aaL8;FF095d0039e9ab5a290a61003909650039e9ab59290a690039096d0039e9ab58290a71003909750039e9ab57290a790039097d0039", + "e9ab56290a81003909850039BBL8;FFe2031baa23008052240080524ae0ff97b9035cf8e3feff17a04301d1e10319aa22008052230080522400805242e0ff97b9035cf8f0feff17a04301d1e10319aaL8;FFe8cb02f988fdfff008e1269142008052e9c702f9e9cf02f9e8d302f9d0e4ff97f58740f9e803", + "1691e00315aab94f0094a8624039fbc342f9f5c742f9f7cb42f9L16;FFe31b823de21f823d0201ca3ce117823d010d44ade013823de00bc03de20f823de0ef813de107823de30b823d944e0094e0dfc03de8c341f9e0431e91e1d7c23dBBBL8;FF080117cbbf0208eb29ceff54e00313aae10317aae20315", + "aa230080522400805245000094770a40f969feff17e00313aa2200805223008052240080523e000094L8;FFe0a349f9800100b4e1d342f9e8cb42f91f0101eb406b0054e8cf42f9090180522a04009109692138e1431691ead302f99a0d0094df0600b18000005480c20291BL8;FF140040f9f30300aa9f0", + "600b1e0020054611a40f93f0400b140010054810000b4601e40f922008052d3f40094612640f9810000b4602a40f922008052cef40094L8;FF1f000039007d20d46300060b9f00036b4b010054000080d21f000039007d20d463141a127f003f7180000054000080d21f000039007d20d4631240f97fcc74", + "f2BBL8;FFe0cf02f9ffd302f920130054e8031faa4901805209683f3808050091fa3b49f9e8d302f97a0300b4480340b20811c0da081540d2080d088b08250191481b488bL8;FF55ff48d3e80b073652f8ff17fb5f40f91f0500f1f8830d91c902005468c21191090000d029211f91e84305f968fdff9008", + "a11691e94705f96903805220fdff90L16;FFa20f7cade84f42f9a1037badf43b02f9e83b00f9480080d2e313813d0800f0f2a3137dad16090091e00b813df52342f9e20f813de41b813de317813da00b3aadBBBBBL8;FB2070726576696f75732073657373696f6e2070726f746f62756657686973706572", + "4d6573736167654b6579736c69627369676e616c5f70726f746f636f6c3a3aL8;FFa04240f922008052db9c0094a14a40f9810000b4a04e40f922008052d69c0094a15640f9810000b4a05a40f922008052d19c0094a16240f9810000b4a06640f9BL8;FF610a40f9bcffff17e00313aae10317aae20315a", + "ae5000094770a40f9680240f9080117cbbf0208eb09f8ff54e00313aae10317aae20315aadc000094770a40f9L8;FF090140f9086140f8090000f9086000f8bb0000b4e0031aaae1031baa22008052d51c0094e80741b229fdffd029613b91d5018052ea008052fa0316aadb018052BBL8;FF608708ade08", + "742ad624f803de213c03d600706ade18343ad622f803d610307adaa220094a10303d1e00316aae20317aad85c0194608744ad73060091e80b40f9L8;FF01c30091a22302d135f4ff9780f7ffb49c010014a22302d1830c8052fcecff97e0f6ffb4ea00001401630091a22302d12bf4ff9740f6ffb4830100", + "14e1032d91L16;FF57eaff97e00314aa088c44f81f0500b160000054e10313aa3dfdff97950a40f9550300b4610a40f9680240f9960640f91f0101eb000c0054680640f949038052BBBL8;FF882600a9680240f9090540f91f0009eb49010054e80f41b2e80300f9e00300913b830094f44f45a9f65744a9", + "fd7b43a9ff830191c0035fd60a0140f9290100cbL8;FFe0074091e10740910232805200c0359121802f91f4432591de7c0094fc074091e00740919c83099100c0359188830e9159edff97e0074091e107409102328052BL8;FFf40308aa3f0500f101010054c92240a9a80208cb280108eb62060054c0fef", + "fd00080079188f80094d306f8b7730200b4d4fc0094e00313aa2100805238008052L8;FF8c01c05a1f0100f1ad011f124a011f128c7d1d536b010d8bed179f1a6a010a8ba901092a4b010c8be7ffff1754fc41d30d0000141f4100f1ea279f1a29010a0aBBL8;FFab335738a9131738a94357384a01084a6", + "b01084aaa231738aa5357382901084aab331738ab635738a9431738a97357384a01084a6b01084aaa531738aa835738L8;FF22008052dc3c0094e16340f9810000b4e05b40f922008052d73c0094bb0000b4e03f40f9e1031baa22008052d23c0094fb0318aaf83b40f9ea4340f9f55b00f9L16;FF209380", + "3cf9831d91e88f03f9981c0094e8b343f91f0900f1616e0054e10f40f9416900b54c0300141f0f00b129100054fb031faa9a0200149f0600b1ed7300f9BBBBL8;FB0188114a37cd30e4feb38cbc834db69dd4bb12bdafed4fb2a28ccacbdcc9263c073400004c611516ff9bb76efd3937466151d0e29e8ff", + "a644c60b2055deee43dL8;FFa8621c9b140940f974ffffb4130540f997fa7fd3db8c0094e00317aa41008052d48c0094003e00b4e10313aae20317aaf5df07a9550b158bf60300aad58c0094BL8;FFfb2300f9e9230729b968ffb579fbff17e02fc13de133c13de1feffb021180d91e237c13de0031791e3", + "833291e4c31791e2008052e07f813de183813de287813dL8;FFe00314aa21008052da0c0094e10318aaf30300aa2000805273feffb4285440a9f4cf00a9ff0f00f9bf0214eb08070054f4031faae9031faaf50000b46002148bBBL8;FF21008052db4c0194c00d00b468ffff9008612e910001c03de84d8c", + "52a8ceac7208f000b8680280520000803da8833aa9a8831bf8090000143b00805237008052L8;FF140840f9f30300aa3f0002716200005435008052080000143f0020716200005455008052040000143f404071680080521535889a680240f9080114cbbf0208ebL16;FFef6f40f9e10310aae80740f9e9b", + "f00f9e90317aae3e700f9f7031baafa5740f9f17300f9f1d340f9e30306aaf21314a9f2e340f9e40318aaeb1b00f9f80f40f9BBBL8;FFa1e6ffb422008052db6c019432ffff17a9e300d1aa635df8288140b829c140786a6201f8a88319b8a80319b8681200b9a8e35df8a9431978692a007968e201f8L8;", + "FFea2f19a9e90702f91a00f0f291680094e81f40b9e8030639e10740f9c1f7ffb527feff173c008052e8430691e0430f915401ff97f82740f9e81f40f91f0308ebBL8;FFfb0318aae87b00f9a6060094f8674fa9f50300aaf6df50a9202300b4080b00911f0900f143240054b80000b4e00319aae10318aa", + "22008052cfec0094962300b4L8;FF007840b9cdffff97007c4093280780d2010000d43bf6ff97fd7bc1a8c0035fd6fd7bbaa9fd030091f35301a9f303019154008052f55b02a9f50302aaf76303a9BBL8;FFe00316aa32feff17e043169122008052e6100094e1d342f943feff17e0431691e1031aaae203", + "18aae0100094fad342f9e8cb42f908011acb1f0308ebc9000054L8;FFbc035ef8bb035df8d7fdff17a0c300d1e1031aaae20318aac3eaff97ba035ef881fcff1720008052011880526a28009420008052e10319aa6728009420008052L16;FF220101ad29feffd029e12391e97302f9e9030991ea7702f90", + "a018052e97b02f9ea7f02f9eb8302f9e88702f9a3130094bc9374a9e8831391e0031f2ae1031aaaBBBBBBL8;FB722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f73657373696f6e5f6d616e6167656d656e742e7273001b737071722076312e73656eL8;FF40050054754640785", + "7034079ff02156b60ffff5408ffdf88e801003568034039a102174a1f050071c1030054e2031f2a4c07009408fc78d309fc60d3287b6878BL8;FF630c8052f1f5ff9780f6ffb4a9ffff17e003082ae10314aae20313aa1ffdff97601a00b5a0f5ffb4a2ffff17898244f83f0500b1810000549fde04a99f2", + "e00f9L8;FF570400b5250000142017c03de1af40f9fc0305913b0080922003803df90318aa810000b4e00315aa22008052d22000948003c03d80e20091e123009102278052BBL8;FF090900f9ea0f02f905000014a2a300d1830c805261e3ff97601100b5bc835df8fb031caa628f40f802f4ffb5b900001", + "45f2800f1880000542800028b08f1df38L8;FFa2020054010840a9f30300aae023009129f87fd31f0109eb0881899a090180521f2100f11481899ae30314aa0b0e0094e80740f91f0500f120010054e80b40f9L16;FFa6ffff17e80b41b2e00700f9a3ffff17c80080d20800f0f2080500d19fffff17c800", + "80d20800f0f2080900919bffff17e00300f981fefff021d0149183fefff0BBBL8;FB6877636170206e6f7420666f756e642f70726f632f73656c662f61757876000000000000000000002f6465762f6e756c6c000000000000000100020003000400L8;FF2a040091e00315aaea1700f909692138e163009", + "1528eff97f71740f9e80f40f9080117cbbf0208ebc8380054e81340f9e10316aae20315aa0001178bd5800094BL8;FF00008092e10315aae80f00f9a9fc00941f0400f161010054bffedfc8810240f9810000b4800640f922008052d2000194e00314aa0105805202018052ce000194L8;FF48031ccb1f00", + "08eb080600541b001c8b7f0315eba9010054bf0200f12803959ae90308aa08f97fd33f011beba3ffff543f0148f136319a9aa9021ccbc8021ccbBBL8;FFf85f01a9f65702a9f44f03a9fd030091160440f9d30600b102050054b300f8b6f8031faae00318aae10313aa6a3c0194170040f9f40308aad2400", + "194e00313aaL8;FF093006910a9c41b92001c03d168841b91f0500b1ea7303b90003803d40000054eafaff9775de4ea9b70300b4b822009104000014f70600f11863009100030054L16;FFe98740f9e8af40f969a209a9e9c740f9e88b40f969a20aa9e9b740f9e8cb40f969a20ba9e9eb40f9e89b40f969", + "a20ca9e9a740f9e88f40f969a20da9e8a753a9BBBBL8;FBac4a6fcf314400005ec6de110faac78b3f3df3d77b69da4dff25042bdfb9e9061ab609db209b9c863aed591b16372133639d8e7052ef933fd5c22971ac4a5e8bL8;FF08200091200440a9a94300d1eaffffd04a711d91e2fdff9042102491a803", + "1ff8e92b01a9e3430091708c0094fd7b44a9ff430191c0035fd608feffd0084d0991BL8;FFe80303f9ff0703f9ea0f03f9e81b03f9e91f03f9910c0194e1fb44f9810000b4e0ff44f922008052d3100194e0c31791e1833291022b8052d610019460030291L8;FFe0031caa21008052da100094400700b4e", + "10315aae2031caaf40300aadd1000940200001434008052e8a3009189008052e0430091a1c300d162008052f82b00b9BBL8;FFe8cd8d524001c03d1f0309eb082000790000803d61000054e0230091764b019408038052e90b40f90a0700910827089b49028052095d00a9090900f9ea0f00f9L8;FF4a250", + "19129194a8b29050091280108ab220a0054090140b22911c0da291540d2290d098b2925019129fd46d30801098b080500911f0109eb49090054091c40f9L16;FFe8f701f968fefff008611d91e3ef00f9e3031d9162008052e03300f960feff9000d00b91e9eb01f929038052e8a303f9e8ab03f968fefff", + "008012291ebc301a9BBBL8;FFa90cf8b7280400914a0400d1e800001401500591e003022ae20303aa2df6ff97e01e00b4e00700f9a1ffff9021203f91a3ffffb0635408917e00001401400591L8;FFdd700094a0077dad7b0200f9e8a743a96082803ca003dc3c6182813c6082823ca1037bad092300a9e8", + "1b40f96182833c6082843ca1037cad080b00f96182853cBL8;FF080500b5200840921f1800f142050054217c0353610500343f040071600100543f08007161fdff54e00700b5e00313aabafdff97e80301aa80010036480800b5L8;FFaa030094c08240391f1040f2010c0054c41240f99fcc74f2a00b005", + "484cc7492844000d160000014ebf9ff97e10300aa82018052000080d2220000b99a000014BBL8;FFc022029119180094080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f0008eb89190054e1431691880e0094e1d342f9e8cb42f9L8;FFba031ef8dc3000941b0000141a0", + "180d2e8031faa9bff48d31a00f0f206000014090180d2fb031faae8031faa0900f0f23a017fb2691f4092011880521b0109aaL16;FFa863009109018052a18300d142008052a8273fa9a9170094f4e340a9f56742a9d8b000940008805221008052d4b00094800800b4f60300aa20feffb000800f91BBBBB", + "L8;FB741940000000000058000000000000003c0000000d0000007375636365737366756c206465637279707420616c776179732068617320612076616c6964206261L8;FFfd7b42a9ff830191c0035fd633008052285440a9f4cf00a9ff0f00f9bf0214eb49f9ff54e0230091e1031faae20315aa230080", + "5224008052f30308aaacbcff97BL8;FF21faff54e00308ab23ffff5400ffff9000c0289189140194e8031faa090840f929f5ffb5091440f9e803088b09f6ffb5b6ffff17e9031faa0a2440f9aaf9ffb5L8;FFe037c13df6b30bf9e0d7853db40d0094e107409160420191e243139121401d911cefff97f65", + "741f9e15b41f9e8431391e00316aa3313ff97e9435339e8675339BBL8;FFf0000014e80317aaf90318aa1c020034e8030091e10318aa1903028b00011c8bdc580194e83340f9e10300912200805208050091e83300f9e803009100010191L8;FFe95706f969fdffd029ed0a91e86b06f968fdffb008552c9", + "1e96306f9290080d2e87b06f9c80480524941c0f2ea7f06f90a078052e07f823dff5306f9e85b06f9L16;FF63181091e0030b914202805284018052cedeff97e16341f9e16301f981feffb02128179183feffb063601791e0030b91c201805264028052c4deff97f46341f9BBBL8;FFaa0640f9490108ebe", + "3470054aa0240f9e00b40f9e303162a4801088ba82600a9680240f9080540f9180100eba2010054e80f41b2e80700f9e0230091347f0094L8;FFe5ffff17f85f49f9580300b4e1d342f9e8cb42f9f95b49f91f0101ebc0bf0054e8cf42f9490480522a040091e00318aa09692138e1431691ead302f99711", + "0094BL8;FFddf80094684a40f9a80000b4604e40f901f57ed342008052d7f80094685640f9a80000b4605a40f901f57ed342008052d1f80094686240f9a80000b4606640f9L8;FF29c10092e00100544b0540f9ff0900f1ec032baa8cfd47d38b194baa6bc100926901098be00000544a0940f9eb032aaa6", + "bfd47d36a194aaa4ac100924901098bBBL8;FF6082803c680e00f9ff0600f1eb730054e01f40f9e10317aa22008052d63801949a030014f6df44f9e04316910123009102738052d73801949800805211020014L8;FFe20f0054217c0353011000343f0800716c0100543f040071600300543f08007161020", + "054a1e20391a22302d16bf3ff97802a00b5e1031faae7ffff173f0c0071L16;FFea1300f9e81b00f9e8035839e8af00b9e0b80094e8030e91ee2749a908210591fe9342a9000540ade50319aae87742f9e28f41a9e0cb44a9e6030991f16748a9BBBBL8;FB42024000000000006a00000000000000e30000", + "002e00000042024000000000006a00000000000000800000002e0000007a134000000000005700000000000000L8;FF000400916b03008b4901094a7f0500f109250078e1feff547f0215ebe1fcff541700001448008052bf031ef8bfa33ba9a8e301d1000dc03da0039d3c2e000014BL8;FFe80356391f0", + "50071400c0054282340b8e90f4b79eacf42f9eb075639ec434b79e86b08b9e8c742f9e9db1079e9cb42f9aa0318f8ac8318784b650036ea6b48b9L8;FFfc031faa1900f0f2e92304a96f000014280340391fad0071e8179f1a4a0308cb2817999a5f2500f1c2090054aa0b00b40901403929c100513f2500", + "71880b0054BBL8;FF59fcffb535008052572340f9b6831ef8b8431fb877fdffb534008052582f40f9f8f6ffb4532b40f9d6480194e00318aa21008052cf480194200500b4e10313aaL8;FFe81f40f9c80000b4090d8052e00314aa02018052017d099bd7480094e17740f9210100b4e07b40f922008052d2", + "48009405000014e00640ade20ac03d620a803dL16;FFff074091ffc30091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a86ed2ff1728a00791f60311aaf10315aa0001c03d08008092f50302aae4e300f9BBBL8;FF810680527a64019420008052010480527164019480fffff000001d918764", + "019482fffff042601491e00301aae10318aa7264019482fffff042801291e00301aaL8;FFf65703a9f44f04a9fd0300914804028b49008052f30303aa340d002a3940009118f17dd30b000014680640f9e10316aae20315aa0001178bd6680094e802158bBL8;FFfd7b03a9fa6704a9f85f05a9f65706a9f", + "44f07a9fdc30091081c00121f090071a1010054e00302aaf30302aaf40301aabaf5ff9720020037750240f9a80640f9L8;ZDBBL8;FF76240194e8eb41f91f0500b1e01b0054e002c03de8f341f9e9030b91e17740f92015803de89301f9a10000b4e07b40f922008052d0280194e9030b91ea0740f9L8;FF", + "810240ade10300ad820241ade20301ad7524009400e4006f808200ad808201ad808202ad8002803d28d776d3800642adea03172a09dbd99380020291080d0aaaL16;FFe0a800940009805221008052d9a80094e00900b4f70300aadaa800940004805221008052d3a80094c00800b4e80300919f020072f8", + "0300aa1b0101911c810091BBBBBBBL8;FB76696f7573207374617465733a20c0000d4964656e74697479206b657920c023206973206e6f74207472757374656420666f722072656d6f7465206164647265L8;FF619e009423feff9063c0359100088052e1031aaae2031aaa869e0094e883009125feff90a", + "5602291a1a301d102c10091e0031f2ae3031faa539e009422feffd0BL8;FF8e1e019400fffff000c021918b1e0194ff0301d1fd7b03a9fdc30091080040f9090540f9490d00b40a0140f9410180390101f8b7e0031faa4a050091290500d1L8;FFfd03019109404039a9080037f40308aa092040a9f30300", + "aae0430091028d40a921a1009168130094f85b41a9f55f42a91f0b00b1e1020054770300b4e8430091BBL8;FFba035df8b7035ef87f0600b1e81f40f9200300545f0317eb60190054a8835df8ea060091a1c300d1e00313aa49088052aa031ef809693738bce8ff97b7035ef8L8;FFf30302aaa5fbff97b7", + "3240b9b70c0034e80240b20811c0da081540d2080d088b0825019108fd46d308050091b60a40f9f60b00b4c90240b22911c0da291540d2BL8;FF160101eba2020054e80f41b207000014890080d248008052e02300390900f0f2e827003928017fb2e0030091e80300f937e9ff97e10300aae00301aaf44f", + "47a9L8;ZDBBBL8;FB08c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05bL8;FF86000014e00315aa90eaff97080040b20811c0da081540d2080d088b0825019108fd46d30900088b37050091ff", + "0208eb490f0054968248f8df0600b180140054BL8;FFe9ab00a949008052cafefff04ac13a91a00700d1e1630091e9ab04a9c9feffb029b91891e9af06a9eb048052a9028052ffab01a9cafeffb04a0d0891eaaf03a9L8;ZFBBL8;FF41ffffd021003391030d40f9e2038052fd7b43a9ff03019160001fd6", + "08200091200440a9e92300910a0000b04a210491e8a700a942ffff9042902491ea0f00f9L8;FF0f000014c80080d2a1831df80800f0f2080900d11a000014e80b41b2e00b00f907000014e80b41b2a0831df814000014c80080d20800f0f2080500d1e80700f9L16;FFe80310aae3030faaeacf00f9e1f7c", + "03def030eaaea6341a9f20319aafc0748a9f90305aae69f43a9e03717a9f45f49a9f57b40f9ed0740f9e56f40f9e03740f9BBBBL8;FB4900000000000000c00000000c0000003d044000000000004900000000000000c70000002f0000003d044000000000004900000000000000c600000019000000L8;F", + "F8e8e0094f3031faa080c47f81f0500b1e1e7ff54e8031faa080113ab2304005400fefff000800691848e0094f3031faa088c45f81f0500b181ebff54e8031faaBL8;FF290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54e0fefff000403691830e0194e0fefff00", + "0202d91800e0194e0fefff0L8;FFe9fb41b9e8f70a79e8c3473949610ab8e97740f9e8331639e8b341b949c10af8e9f740f9e8371639e80b409108c10e9149410bf8ff0300b9b5dfff97e8db51f9BBL8;FF890240b22911c0da291540d2290d098b29250191891a498b29050091380108ab22040054b800f", + "8b6f9031faae00319aae10318aa684e0194d80300b4d1520194L8;FF400743ad8233803de8bb02f9800703ad420344ad820304ad410341ad810301ad420342ad820302ad410340ad810300ade1b2ff5428008092680200f9a6fdff17L16;FFe00742f922008052dbd20094e10f42f9810000b4e01342f922", + "008052d6d20094e11b42f9810000b4e01f42f922008052d1d20094e8430f9100010291cad9ff97BBBL8;FFe802158b680a00f9954640f9550300b4610a40f9680240f9944240f91f0101eba0160054680640f9490f80522a040091e00315aa6a0a00f909692138e10313aaL8;FF22008052fa110094e1d34", + "2f9e00316aaccf9ff17e043169122008052f4110094e1d342f9fff9ff17e0431691e1031aaae20318aaee110094fad342f9e8cb42f9BL8;FFae1d00128c1d0e0b8c0102518d00f83761710c8bcb008052280000149f114071630800544d19c039ae1d00128c390e0b8c1140518d00f83761710c8beb00805", + "2L8;FFe902005474044039801e7ed35f0000eb620200547408403911000014a1060012e0fcffb000e00d9114c8613802000014947e01139400003780761e535fc020ebBBL8;FFe10313aa22008052db320194e807409108810991006103918b0b0094f4bb49f99f0600b1e0b2ff54f5c349f9f3bf49f9950", + "e00b47622009104000014b50600f1L8;FFa20a40f9e00314aadb32009497000014f6e742f9fb074bf9f90b4bf9fc0f4bf9f8134bf9f5174bf9c80240f9f4e342f9680000b4e00314aa00013fd6c10640f9L16;FFe91f02f9b70000b4e00318aae10317aa22008052d8b20094e88302918122009100010291", + "47140094a00f7bad480080d2e107c13de20bc13d0800f0f2f6d70da9BBBBBL8;FB732e6c656e2829202d20315d203c203078383000000000001d1c40000000000054000000000000004c000000050000001d1c4000000000005400000000000000L8;FFa80357f880030191a1c303d12200805208050091a", + "80317f872960094e8031f2aa0877bada0d300d1a8f31438a203d93ce1830091a303d63cd402188b5a0318cbBL8;FF936a29f8880200f9f44f41a9fd7bc2a8c0035fd620008052800600f909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6ff4303d1fd7b07a9fc6f08a9L8;FF41f1ffb58effff", + "1778ff78d3c8fe60d337ff60d3dcfe78d3cf7e08530bfdff906b3102918d008052e903192af003182aee03082ac108001418fd78d3ed7f42f9BBL8;FF087440f91f8100f1e11300540c7040f9e81341390e088052e94340b9f20b43a98d194039045840f9a6e35b38258108aaa7c35b788b094079edab003", + "98d7141f8L8;FF63fdfff063c039910401805222000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f93961ff97e80300aae0833291a1fdffb021802291a2018052L16;FFdf0207b81f0800f1812f0054a0c303d1c2e7ff9720060036a12700b4c3010014e8f340f91f0d00b1e1040054a1a3", + "03d1a2c303d1ba8311f87fecff97a083db3cBBBL8;FF080117cb9f0208eb29faff54e00313aae10317aae20314aa230080522400805245060094770a40f9c9ffff17e00315aa55890094e20315aae80300aae00301aaL8;FFab000014e80180520900809268220039e0430691690200f9b1100094a80600d", + "11f0900b142140054e0031baae10315aa22008052d07a00949d000014f3031faaBL8;FFe24f40390a080039ea110e2a2e12102a4810082a09100039e9534039ef5740390b0c00392b10122a0d180039ed634039f1674039e911092a0b240039f05f4039L8;FF6e0e03535f010c6aac0172b27115520a72fe", + "52d38d118d9aec01100a5f010e6aaf017db29055530aef118d9a5f01116a6d4e53d3f10153b210020b0a2f128f9aBBL8;FFe8031faa090840f969faffb5091440f9e803088b49fbffb5e0ffff1740ffff9000a03a9185360194fd7bbfa9fd030091086840b91f05007161040054086c40b9L8;FFe8d70bb9", + "210a0054e39349a9e0830991e2cb41f9e5734e39e1032a91e6031f2a24f1ff97fc3341f9f90308919f0b00b141830054a80000b0081140f91f0d00f1L16;FF6083c23ce9c31391e0831d91e1c31591f6bb02f9e8d302f9e8e340b9e067813d6013c13ce8e31539681340f92091883ce8c702f98e1a0094ef", + "b343f9ff0900f1BBBBL8;FB58000000000000004c00000022000000616c6c206c656e677468732073686f756c6420776f726b20666f72205348413235360000000000003213400000000000L8;FF810880527486009440008052810780527186009420008052010480526e86009400feff9000c02491e3fd", + "ffd063001a9104feff9084402591a24700d141038052BL8;FFeac31791f5e3573940c1c03cf7ef573941c1c13ce91f46b9280340f958914078f46b41f9e03f813de143813de91305b9680000b4e00314aa00013fd6210740f9L8;FF75060094790200b4de0a0094e00319aa210080523a008052d60a0094e", + "0feffb4f98300a9ff0f00f9d8010034e8031faa090180520968283808050091e1230091BBL8;FF01048052e20317aa230080522400805249d6ff97f55b41a99bfeff17e0230091e10316aae20317aa230080522400805241d6ff97f55b41a9c2feff17e0230091L8;FF280108abc2010054091440f909010", + "0b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd680fdffd0L16;FFe8bf45f9e8cb00f9e8c345f9e8eb00f9e8d345f9e82f14a9e8db45f9ebeb45f9ea2313a9e80b46f9eaef45f9e87b00f9e81346f9e8d300f9e82346f9e86f00f9BBBL8;F", + "Fe8270ba9e8530291c90200d029b11491ea830291a04700d1e8270ca9e8f30191a10302d1e8270da928008052a9ffff9029b10b91682703a988ffffd008f51b91L8;FF60ba40f901f57ed342008052f30b40f9fd7bc2a8d86a0014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091092040a9f3", + "0300aaa80000b4600a40f9BL8;FFe10300aae00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6e20313aa230c805267f1ff97e10300aac0feffb5a80640f91f0116eb09050054e00313aaL8;FFe90300aa1f3d00383f4d0038e80300aae90300aa1f5d00383f6d0038e80300aae90300aa1f7d003", + "83f8d0038e80300aae90300aa1f9d00383fad0038e80300aaBBL8;FF1d000014280180d20800f0f2081d00d11e0000141f150071000200541f11007141040054280180d20800f0f217000014e00313aaf7070094e80300aae8070036L8;FF41fdffd02120269178260014fd7bbaa9fc6f01a9fa6702a9f85", + "f03a9f65704a9f44f05a9fd030091ff4313d1ff0300f908088052f50302aa2010c03c2a7c4039L16;FFf50302aa93a60094e10740f9c10100b43f0400b121010054e8434039e00313aae10316aae20315aae30314aa1f090071cce8ff5467ffff17e00b40f922008052BBBBBBL8;FB746f636f6c2f737263", + "2f747269706c655f726174636865742e7273002f72757374632f3438613232396365616566643439383563353039393062313431313662L8;FF400740f901f97fd342008052da9e0094bbffff174800805208200039080000f9e00301aaff830e91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc", + "6a8BL8;FF540300b4610a40f9680240f9b51240f91f0101eb40070054680640f9490280522a040091e00314aa6a0a00f909692138e10313aa88fcff97760a40f9680240f9L8;FFb8110094f50f4ba9a08301d1e10318aae20315aa6c0f0094b6035af8df0a00b1e1090054b60b7ba9bb8301d1a1835af822", + "0200b4e10700f9a08301d1e10316aaBBL8;FF7c0e00f9e35e0194e91740f928008052282100393f0100f9ff031191f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd680ffffb000403a91L8;FFdc5e0094c00301b4e10313aae20317aae01300f9df5e0094f32b41f9e83341f9f92700", + "f91f0500b160080054f63b41f9e87b42b9e81f00b9b69800b4f43741f9L16;FF80010034610a40f9680240f91f0101eb60050054680640f9090280522a0400916a0a00f909692138e10313aa4cecff97818a40a960008052e30313aa94eaff97BBBL8;ZBL8;FFf50300aae06300912200805223008052240", + "08052b6a2ff97e11740f9e00315aad0fbff17f70300aae0630091220080522300805224008052ada2ff97e11740f9BL8;FFb40a00f9f44f44a9f65743a9f85f42a9fd7b41a9ff430191c0035fd63406f8b7340400b4d7fe0094e00314aa2100805237008052cffe0094600500b4e10316aaL8;ZFBBL8;FF2", + "1008052db3e0194201a00b449ffffb02959389168ae8c52200540adc88dae72084000b9880880520a008092680201a9000400ad220141ad681200f968008052L8;FFf54f45f9fa5345f91f0900b1c13e005476ee01f9f66340f92800805275f601f9f54740f968c6133969f201f97afa01f9bc0000b4e003", + "17aae1031caa22008052L16;FFc00c0054e81e4139e9524478ea224039fce644a92841082ae91244b8eae300b9ea024139288108aae9ea45a9fc6700f9542108aae97700f9e93640f9e94f00f9BBBBL8;FB601ad6a11e80aa228d8a03f6fe3c88afca08a2d80926d66e277f6ee27fd5ee4adfdd48ead4ade", + "658a28cff50fbac0000843917518b424840d225e3cbaf0f606eL8;FFdc8e0094a07e00b4f60300aadd8e00944000805241008052d68e0094e07d00b4f30300aad78e00944000805241008052d08e0094207d00b4fc0300aad18e0094BL8;FFfa0f06f901430291a22302d189edff9760dcffb46700001420", + "dcff54c8010014e0dbff54c80080d20800f0f20809009101010014c80080d2f55706f90800f0f2L8;FF1f0400b180050054080400919f0208eb41030054940600f1e0030054d90e0094e00314aa21008052d20e0094a00400b4c1060091e20314aaf50300aad50e0094BBL8;FFe8030091e20706ad457700", + "94e80340f91f0500f1a1030054e88241f8e082c03ca9c300d140fffff0001c1291a14300d1a8031ef88801009008210891a9233fa9L8;FF291540d2290d098b2925019129fd46d30801098b130500917f0209eb89190054088c45f81f0500b1c0140054ce020094080040b20811c0da081540d2080d088bL", + "16;FFe87342f9e093803de8af04a9e87742f9ebc342f9e80b00f9e87b42f9e83b00f9e87f42f9e84300f9e88342f9e82300f9e88f42f9e9a302a9e89342f9e9d342f9BBBL8;FF00010039b402148ba08300d1f40f00f9996a01941f040031e00800541f0002716200005435008052070000141f002071620", + "0005455008052030000141f404071L8;FF6083883c2083ca3c6183893c2183cb3c60838a3c2083c43c61838b3c2183c53ce85301f9c86a40b9e00704ad2083c63c2183c73ce82b00b9e8430691e00705adBL8;FF61000054806200917be90094881240f9e083c03ce1031faa2823189be90f40f92a070091", + "0001803d090900f98a1600f9d6ffff171f0800f121090054e1230091L8;FFc00a40f93f0000eb80000054000080d21f000039007d20d4c5824039a11000129f00016b4cffff54c11a40b92124c41ae1fe0737c11e40b92124c41a81fe0737BBL8;FF09692138e1431691ead302f9920c0094fad342f9e8cb", + "42f908011acb1f0308eb483c0054e8cf42f9e10319aae20318aa00011a8bd72e0194f90b40f94803188bL8;FFe86304f9e85344f9e96704f9ea8304f9e88f04f9c182803ce087853de083853d15290094f90740910a088052e0833f9139031891f7032791f8833f91297f4039L16;FFe2031aaa250080520", + "6048052e3031caa5eaa0094a1035df8810000b4e0031caa22008052d4ae0094000740ad08108052e98741a9fb2204a9f96a02a9e00600adBBBBBL8;FB726f72000000000084fa41000000000018000000000000000800000000000000c842420000000000ac414200000000001c4b4200000000006120446", + "973706c61L8;FFad194e8bbf010ceb830500546b0500f1ec030daa81feff54a90109abe300005423000014e8031faa090840f949fdffb5e90309abc2030054280108ab42040054BL8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb281000548a000014f30300aacd030094e803", + "00aae00313aa090140b22911c0da291540d2L8;FFe9ab5a290a6d003909710039e9ab59290a75003909790039e9ab58290a7d003909810039e9ab57290a85003909890039e9ab56290a8d003909910039e9ab5529BBL8;FFe82706a968fffff008812391e83b00f94cd9ff977f22003928008092680200f9", + "b50000b4e00314aae10315aa22008052d1560194f44f51a9f65750a9f85f4fa9L8;FF84601d91e2032d91c1058052e8a305f9e9a705f978520094e85746f9e95b46f9a0fdff9000a01c91a3fdff9063403091a4fdff9084801e91e2c32291c1058052L16;FF8c05009170feff37f000f837abfe60d3ab000", + "0b5eb032aaa18010a8b7701098b0a0000144800805209008092692200a9bc000014f6031faaf5031f2af9031f2aBBBL8;FFf70300aab6ffff17e80741b28dffff17e80741b29affff17e80f41b289ffff17e80f41b296ffff17a0031df8a1fffff021780391a3fffff063c80391a0c300d1L8;FF5f0308eb", + "48310054e6010014e1d342f9e8cb42f9f4074091948209911f0101eb40880054e8cf42f92a040091802202914903805209692138ead302f9162b0094BL8;FFf65741a9fd7bc3a8dbf60014f44f42a9f65741a9fd7bc3a8c0035fd6002000913afeff17fd7bbea9f30b00f9fd030091090040f9e8008052f3", + "0300aa2a0900d1L8;FF7f0214eb89000054608e5ff800003fd6fcffff17f35341a9fd7bc2a8b40a0014fd7bbea9fd030091f30b00f9f303002aecffff97ecffff97610a0094e003132aBBL8;FFe84b09f928ffffb0088d3491e94309f9290080d2a04700d1e85b09f928038052a90fc0f2ea5f09f9aa0a80", + "5221800991ff3309f9e83b09f9ff3f09f9ea4709f9L8;FF81f4ffb40804805205000014c11240f93f0400f1ebf3ff5408028052e06a68f822008052d43600949affff17c80080d20800f0f2080900912effff17fb5f40f9L16;FFe84700f9f96340f9380100b4e0031aaae10318aa22008052f4030b2af80", + "30c2ad5b60094ec03182aeb03142a38ff48d3e06b40f9fa0316aa150100b4e10315aaBBBBL8;FB72656d6f7465206964656e74697479206b65790000000000a1104000000000004d000000000000005f0300001c00000073657373696f6e5f76657273696f6e72L8;FF3f0500b1600400540a0840f909144", + "0f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d2BL8;FFe00315aa00013fd6810640f9810000b4820a40f9e00315aad7060194e863019100610c91eedfff97e8a75139c8000036e14741f9810000b4e04b41f922008052L8;FFf4", + "4f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0031faae10317aa6c020094ff2f00f9e02f40f9e1031caa680200943a00805278fdffb5BBL8;FF2800028b08f1df38680bf837a0e300d158f8ff97a8835cb8480d0037a8835df86a0340f9490108ebc33000548a0340f9b8035df8480", + "1088b880300f9690300f9L8;FF5f0700b1e12700f9800b0054e00641ade0430691facb00f90083823ce20242ad0183833c0083853ce10240ad0283843c0183803c0083813c29010094fc2740f9L16;FFec0309aae94740f9e8ff00f9e8e740f9f90301aaee2b1ca9ee6b40f9eab740f9e95b0da9e9a340f9", + "e1030daafc2317a9fc0306aae0afc23de6a341a9e91300f9BBBL8;FFf40308aadf6601940004805221008052d8660194401b00b4c00640adf70300aa000400ade00315aada620094f80301aaa100f8b6f5031faae00315aae10318aaL8;FF5369283808050091280800f94b0200b5e0030caa7a000014e10", + "300a9e00301aae10308aa22008052f4030caaf0050094e10340a9ec0314aa2aa040a9290040f9BL8;FF010b00b5a80640f91f011aeb89060054e00313aac1f3ff97400a003728fc60d3280800b5200840921f1800f162080054217c0353810800343f0800710c020054L8;ZDBBL8;FF1f0500f1000200541", + "f0900f121090054610a40f9810000b4600640f922008052d5260194611240f9410900b408038052606a68f822008052f44f41a9fd7bc2a8L8;FFdd260094610240f9810000b4600640f922008052d8260094602e40f9a00000b4613240f9610000b422008052d2260094611a40f9c10000b4601640f92200", + "8052L16;FF29c101f112025ff80102de3c8081813c0082dc3c918102f811825df8b28102f8120a40f9e017803d0002c03da181813c4109c03db2031df8123240b9a0039c3cBBBBBBBBL8;FB636820c0243a204e6f4865616465725265636569766564202d3e2048656164657252656365697665640010456", + "e636f64696e67206572726f723a20c000c02020L8;FFa00640ad09008092a20ac03da81a40f9e1830f91698600f8e00313aa02398052c08602adc21e803de80b02f9d9a30094b4000014f5fb40f9561700b4d1a30094BL8;FF186300f139630091c003005436d77fa9e00314aae10313aa8f010094e00315", + "aae10313aa8c010094770a40f9680240f9080117cbbf0208eb6800005455fdffb5L8;FFe87f03a9ff2304a9e8030091e10b00a9ff6300b9ff7f02a9ff7f05a9a8831cf80800001401630091a2e300d15ffdff97c00d00b5a8835cf8080540f9280900b4BBL8;FFe82f40f9130540f91301f8b6f7031faae0", + "0317aae10313aa6f5f0194ff4b00b9130080921b000014e82f40f9081140b9e82f00b9730200b4e61f00f9fb03192aL8;FFe00316aa6a0a00f909692138e10313aaa2fcff97780a40f9680240f9080118cbdf0208eb08070054680640f9e10317aae20316aa0001188bd66300940803168bBL8;FFff0302d", + "1fd7b03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf40301aab9f0ff97e80300aae00301aaL8;ZDBBBL8;FB6c6f6e67657220737570706f727465646a7573742070726f6d6f74656420612073657373696f6e0073104000000000002d00000000", + "0000006a0000000e000000L8;FF080117cbbf0208eb28860054e81340f9e10316aae20315aa0001178bdd830094e802158be81700f9e00314aa088c4df81f0500b160000054e163009139a5ff97BL8;FF0aca89522a49a7723f010a6b200200543f9000f141030054f30308aae8430091e6070094e81340b", + "91f05003161020054e043c13c7f020039e003803d6012803cL8;ZFBBL8;FF6b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010a8b2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091340108ab83000054L8;FF0900f0f2e8470039e90700f9e02300913f4aff97f44f4e", + "a9f95b40f9f6574da9f85f4ca9fd7b4aa9ffc30391c0035fd6f623009137008052180d8052680240f9L16;FFea7b00f9e96300f90a2556a9ead300f9e96700f90a2557a9e95700f9092158a9e85f00f9e89b47f9e96f00f9e9bb47f9eaa31da9e8a347f9ea9f47f9e8f700f9BBBBL8;FB94b842000000000", + "018000000000000000800000000000000e0784400000000000000000000000000010000000000000001000000000000004450440000000000L8;FFe01e0054f30300aae00308aa8a0c0094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb69", + "240054BL8;FF0825019109fd46d30800098b080500911f0109eb89040054140114ab230100541e000014f4031faae00313aa080c45f81f0500b1c1fdff54f40314abe2020054L8;FF09b303b8e97742f9ea7700f9ea675339e8bb0779e8c35339ea2f1c29e91301f9e8a30839810000b4e09340f92200805", + "2d1130094e0bf40f9e8431391e1031baaBBL8;FF435a0094f45745a9e11f40f9e10000b4e82340f9f70300aa22008052e00308aad5530194e00317aaf40000b4f70300aae00315aae10314aa22008052ce530194L8;FF0201805201f17dd3db530094b2feff17f63f42f92083c13ceae32291e9d742f9f5c", + "742f9f7cb42f9c80240f9f83b42f940818b3ce9c304f9680000b4e00318aaL16;FF88feffd0088130910afc60d3097969784921094a2a5d105308596a780001094a14000014c80100f008210091e903009183feff9063c00a9184feff9084600b91BBBL8;FF09692138280400911f070071680a00f961050", + "054881641b9080140b20811c0da081540d2080d088b0825019108fd46d308050091978640f9970400b4e90240b2L8;FFc0000054e8074091e14316910881099100810291cc0f0094f87f49f9780300b4e1d342f9e8cb42f9f97b49f91f0101eb403d0054e8cf42f9490380522a040091BL8;FF43faff97f4", + "4f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aa69ef0094a00100b4f50300aad1f30094L8;FF010000d4df0200ebc1faff5420cc41f9d50218cbe10318aa050080d2040080124306805202008052e805009481020e9100ff4cd3201400f936cc0", + "1f925000014BBL8;FFe8cb42f908011acb1f0308ebc8be0054e8cf42f9e10319aae20318aa00011a8bdc3301944803188be8d302f9e06749f9f90b40f9800100b4e1d342f9e8cb42f9L8;FF29211f91f42707a9e9230091a1a301d1e92f08a9a94302d1e92309a9a8e301d1090000d029411f91e82b0aa9e", + "8630091e8270ba94800805269fdff9029211091L16;FF8182c33ca80317f8880e40f98083873c8082c03cf47740f9a9831ef8a8031df8e8431091a103963ca2877ead00410191a0039c3c8083813c8183833c8283823cBBBBBL8;FB65656e20736574206966206b7962657220707265206b6579206973207", + "0726573656e74000000000039074000000000003300000000000000210200000e000000L8;FF020115cb140302ebe28308ad22010054e8430391e10317aae20318aa0001158bdc9b0094a802180be83f04392100001415020034e8430391e10317aaf902028bBL8;FFf44f43a9fd7b42a9ff030191c0035f", + "d6e0031faa70170194e00741a96e170194ff8302d1fd7b06a9f73b00f9f65708a9f44f09a9fd83019128008052f30300aaL8;FF2083c03c2183c13cbf0600b1e00719ad601c0054e077c03de30b409125fdffd0a520359127fdffd0e7c03591e8431391e2830c9163c00e9164c20391e00317aaBBL8;FF60", + "0602adc082c43cc182c13c600a03adc082c03c600601ade28344ad620200adf44f5aa9fcb340f9f65759a9f85f58a9fa6757a9fd7b55a9ffc30691c0035fd6L8;FF02288052e35b0094e0c31d91e1c3229102288052df5b00943f0b00b1e1c8ff54a3010014c80080d2e15706f90800f0f2080900d1ca000", + "014e05706f9e80b41b2L16;FFf34300f9fdc30191280040f9f30300aa1f0500b160030054e8630091e00301aa4e330094e80f40f9e003c23ce91b40f91f0500b1e003803de90b00f920030054BBBL8;FF616e40f93f0400f18b000054607240f922008052d87b01946002039154ffff976022019125ffff9", + "7617e40f93f0400f18b000054608240f922008052ce7b0194L8;FF1f0900f189040054e90000d029011591e8633f91e9bf0ef9e9fdffb029e11591e8bb0ef968008052ea074091e94f09f94ac13591e1074091e93709f9a9fdffd0BL8;FF6042803c680200b9fd7b42a9f31b40f9ff030191c0035fd62a00", + "4039e8048052e90080525f0000712b0440392c0840392811881a5f7d0271490d00120e819f1aL8;FFe802168bf5031baa680a00f9ecffff171f010271800100541f01037100fcff5448030037090480520900ac7248030836aa26407848031036ab26407848031837BBL8;FF4901084aaa635838a9431838", + "6901084aab735838a95318384901084aaa835838a96318386901084aab935838a97318384901084aaaa35838a98318386901084aL8;FFe8e347b9e0032a91a126c03da002803de87303b9a142813cbef5ff97b906001438008052799240f9f6832491990100b4758e40f9d33b0094e00319aa21008052L16", + ";FF784200b408008092f90309aae95b00f9e86700f9120400141f0700b120030054b80100b4e0031aaae10318aa22008052f40309aaf9030eaaf6030b2af8030c2aBBBBL8;FBdfcbda279d1878f1a28c05788f73f4657e8000009e631f3781786668be5c19652b1d1b9de8f4e756a07fc24b89660aed2859", + "ec3fdc32444a9c6621ed2c81d73cL8;FFc87a337816000014480100b008210091a98300d100210091a20301d121008052e3fdffd063c00a91e4fdffd084600b91a8031ef8a9031cf85a870094480100b0BL8;FFe87306f9e97706f994070194e1fb44f9810000b4e0ff44f922008052d60b0194681240f92", + "80700b4e1f342f9e2f742f9e8833291e0db42f9e44b40f963030291L8;FFf40300aadf0b00940002805201018052d80b0094200100b4140000f901fdfff021c00591130800b91f300039f44f41a9fd7bc2a8c0035fd60001805201028052BBL8;FF17ff48d3080180d20800f0f2ea1e409268aa00a9e1074", + "0f928008052680200b9811d00b5ee000014080180d2ea1f40920800f0f208017fb268aa00a9e10740f9L8;FFca010aab220200542801088b480108ab8202005409804039000509ab22020054fd7bc1a8c0035fd6e8031faa091c40b949fbff35e9031faa0a0840f90afcffb5L16;FFe8ab00f9e8d743f9e9", + "2312a9e8db43f9e9f343f9e8ab1aa9e8e743f9eaf743f9e8df00f9e8ef43f9e8af15a9e8fb43f9eb0b44f9e8b700f9e8ff43f9e9a318a9BBBL8;FFf8df40a9f90f00f91f0319ebe9010054390100b4e00317aae10318aa22008052e30319aad56b0194600a00b4f70300aa06000014e00317aae10318aa22", + "008052L8;FFfd7bc2a8c0035fd6010040f9810000b4000440f922008052d76b0014c0035fd6fd7bbea9f44f01a9fd030091140040f9f30300aa880241d29f0200f108459f9aBL8;FFe08745ade00314aaa0873dade08b46ada08b3eade18343ada1833bade28344ada2833cade18341ada18339ade28342a", + "da2833aade18340ada18338adb9f3ff97L8;FFc3fcfff063000f91e0031faae10308aa88e7ff97c3fcfff063600f91e10302aa84e7ff97293c00f1ea33899a211000b40b1c0091e9031faaccfcfff08c891291BBL8;FFb90000b4e0031aaae10319aa22008052d92b0194e12740f9010b00b4e00315aa540", + "00014e88241f8e082c03ce9c302912a0100f04a21089100fffff000e02c91L8;FF34008052582f40f9f8f6ffb4532b40f9dc2b0094e00318aa21008052d52b0094200500b4e10313aae20318aaf60300aad82b0094b3835df8acffff17e90313aaL16;FF68fe13a97fa214a968fe16a97fa217a968fe19a9", + "7fa21aa9080680527fa21ba9080480527ffe12a97ffe15a97ffe18a97c42003960828f3c7f220739686a1da9BBBBBBL8;FB75706c6963617465206d65737361676520666f7220636f756e7465723a20c000394c6f63616c6c7920737570706c69656420616464726573736573206e6f7420L8;FFeae740f9", + "8b0700d13b6977787f010aebc1fdff54e023079137f6ff97e8eb40f9eaffff1717038052e88307911323179b680240f9a80000b4600640f901f97fd3BL8;FF01ffff902100399103ffffd063341191e02300910201805264008052cb250094e10740f9b1ffff17e80f41b2abffff17e80f41b2b9ffff17a0", + "031df801ffffd0L8;FFfc6f0ba9fa670ca9f85f0da9f6570ea9f44f0fa9fd83029109304039a90b0037010840b9f30300aa150040f9e0e30091f40308aabbe300d1aa120094f60f44a9BBL8;FF16010094888e41f81f0500b160000054e00314aadce3ff97e00314aae10313aa022b8052f44f41a9fd7bc2", + "a8d95f0114088c41f81f0500b160010054fd7bbea9L8;FFfa0308aaa84700d1e97701f9890c40f9e0070aa9e0070ea9e00303aae20f0ba9e4170ca9e6230da9ff230b39ff7b01f9e20f0fa9e41710a9e62311a920013fd6L16;FF08fd46d308050091d4030034890200322911c0da291540d2290d098b292", + "5019129fd46d3290500912001088be10313aa4bedff97f502003574040034610a40f9BBBL8;ZBL8;FFe0630091220080522300805224008052b7a3ff97e11740f9bafeff17e0630091220080522300805224008052b0a3ff97e11740f97bfbff17e063009122008052BL8;FFf50301aadfff0094e00313aa", + "2100805236008052d7ff0094400200b4e10315aae20313aa930200a9daff0094930a00f9f44f42a9f65741a9fd7bc3a8c0035fd6L8;FF260040398af05f3828686e380600003908682e38aaf01f38c0035fd61f2003d5261c40a9282441a98a2c7ea98c347fa95f0001f1e8000054061c00a9082401a9BBL", + "8;FFa8031cf842460094f80300aa4b000014b8835cf849000014a0031cf841ffffb021ec039143ffffb063d00191a00301d162028052840180523e000014f80300aaL8;FF703242f97fc6133920a10291693602f96c3a02f96e3e02f9774202f968fe01f96a0202f96b0602f96d0a02f96f0e02f9701202f", + "939c14339d63bff97f50300aaL16;FFe0d341f922008052dbbf0094e1db41f9810000b4e0df41f922008052d6bf0094b40000b4e0c741f9e10314aa22008052d1bf0094570080529f0300146083c63cBBBBL8;FB8df2bb4c89b684d4d43b935d81b3bf6d7914105cfeb39fd5846b834dd1b69274d4bb3dd7", + "0e6bafeddac63c9ea28cf671789400007713cb6fffb07e75a21a01f8L8;FFf40314abe2020054688e48f81f0500b140020054e00313aa8effff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebBL8;FFe1fcffb4b001001401830191a22302d122ecff9740fcf", + "fb46f010014e02e00b5a02302d1fbecff97a00d003681fbffb47a01001401e30191a22302d117ecff97L8;FF88008052f30300aae0230091040180520506805229f87fd33f1100f13481889ae30314aa0c000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9BBL8;FF22120094e84b40f91", + "f0500f160160054f643029108088052f7030091c082c63cc182c73cc282c23ce00703adc082c33cc182c83ce20301adc282c13cc082c53cL8;FF0a1440f9092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25", + "0191L16;FFe1030aaae80317a948008052e87300f908008092e87700f9e8030eaad40e0014e8af43f9eab343f9e9cf00f9e9ab43f9ebcb43f9f25744f9e8e700f9e8b743f9BBBL8;FFf95b40f9f6574da9f85f4ca9fd7b4aa9ffc30391c0035fd69404005136008052770040f9e20640f95f0015eb290d00", + "54e10240f9290080398900f8b728040091L8;FFfd7b47a9ff030291c0035fd6ff8301d1fd7b03a9f52300f9f44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054080200341f05007141030054BL8;FF1f0116ebc90a0054e00313aac3fcff9720fe073728fc60d3880a00b5200840921f1", + "800f1c20a0054217c0353e10a00343f080071ac0100543f040071a0030054L8;FF1fc022eb63f8ff54e6ffff1700cc749200fc44d3000400d11fc022eb82feff54bcffff173f1c00f169020054fd7bbea9e30301aae10302aafd030091f30b00f9BBL8;FFc01000941f0700b14086ff54812202911001001", + "4e8031faa000119ab426e0054e14316918c0d0094f90b40f9df0a00b100040054e1d342f9e8cb42f91f0101ebL8;FFe00740918100805200001891ff0316b9e83700b9182a0094e80356b9e00740918100805200001891ff0316b9e83300b9112a0094e80356b9e007409181008052L16;FF48008052f403", + "00aae0030091ff2300a9e10303aae87f02a9ff2303a9e87f05a9ff2306a9e87f08a9ff2309a9e87f0ba9ff230ca9e87f0ea9ff230fa9e87f11a9BBBBBL8;FB75626c696373656e6465725f636861696e72656365697665725f636861696e7370656e64696e675f7072655f6b657972656d6f74655f726567", + "69737472617469L8;FF6f930014080040f9e00301aa080140391f050071a100005401fefff021503b91020580526693001401fefff021dc3a91a203805262930014080040f9e00301aaBL8;FF080040f91f0900b1a1000054e0031faaf30b40f9fd7bc2a8c0035fd6080141d2e90080521f2d00f10831899", + "a09ffff90296900918a0000102b6968384a090b8bL8;FF810000b4e00316aa22008052da170094a04700d13ec5ff97e0ab01b9a04700d13bc5ff97e09b01b9a04700d138c5ff97e09301b9a04700d135c5ff97e08b01b9BBL8;FF7d530194ff0302d1fd7b04a9f72b00f9f65706a9f44f07a9fd030191f50", + "301aa298440a9f30300aaa85300d1f40302aae00309aaec530094b6c35e38df0a0071L8;FFe143c13d1443172ae81345b9e063813de167813de8a305b93a000014e8000090081140f91f0500f1a9040054e8830291e0032d91e10313aa0204805214210191L16;FF680640f997fe6ad319693538d5160091", + "750a00f9370200b5f403182a680240f9bf0208eb61000054e00313aa30d20094680640f9a906009114693538690a00f9BBBL8;FF06010014e003082ae20313aae303162a62faff97c01100b57c0240f9820740f95f0017eba9060054810340f9200080398000f8b728040091490400d111000014L8;FFf37", + "749f97f0600b140020054e18349f93f0400b140010054810000b4e08749f922008052d4770094e18f49f9810000b4e09349f922008052cf770094b30000b4BL8;FFf8ffff17010440f93f0800b180f9ff543f0400b140f9ff54e10000b4080840f9f30300aa22008052e00308aad2f70094e00313aa01104", + "0f921f8ffb4001440f9L8;FF20008052a00a0039f35341a9f51340f9fd7bd9a8c0035fd6fd7bbea9fd030091f35301a9330000b0340000b056faff9773b640f994ba40f97f0214eb82000054BBL8;FF21c03591e3370194e0ffc33de103c43d80430891e207c43d8162019102328052e07f843de183843de", + "287843dd9370194e0074091e10740910238805200800991L8;FFe0232a39e8272a39c80080d20800f0f246000014e04305f9e0032a9121fdffd021203f910202805223fdffd063003a91040180528700001448008052e0232a39L16;FFf4030b2adfb70094e00319aa21008052d8b70094c05600b4e16b40", + "f9e20319aae04700f9dbb70094eccb40b9eb03142af500001428008052e85f00f9fc7340f9BBBBL8;FB454d3736383a53434b41204b657973686f756c64206f6e6c79206661696c206261736564206f6e2073697a65732c20616c6c2073697a65732073686f756c6420L8;FF8c83009440008052e10317aa", + "7283009400feff9000c00b9189830094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd03009138404079f30301aaBL8;FFe9c742f902a09152e4feff9084e01491e0031baa1f010071e103152ae204a072e813899ae3031f2ae84f04f96e1d0194e8fb40b9e97b40f93f00086be8279f1aL8", + ";FFff0302f9ff0b02f9ff1702f9ff1f02f9e82302f9e92702f9cceaff97e8df40f91f0500b1c01b0054e0e30191e1e3069102288052f70b00f9f9430c91f7e30191BBL8;FFca0240f9490108ebe3160054ea0240f9b4835df84801088be80200f9c90200f988fe60d3e80a00b5800a40921f1800f1e20a00", + "54817e0353010b00343f080071L8;FFf81f00b98043813c00e4006fa80319b889430df8aa0312b8a8c313b8828707adeb1300b9ebe303b9200300ad12420094e9bf4639e84346390a088052a00302d1L16;FFe84b44f9e94f44f9e87b00f9e85344f9e8d300f9e85744f9e9230ca9e85b44f9e95f44f9e8e", + "f00f9e86344f9e86f00f9e86744f9e85f00f9e86b44f9e8e300f9BBBL8;FFfb0b40f9580800b4f90314aaf4031c2adc670194e00318aa210080523c008052d4670194c0fdffb4e1031baae20318aae00300f9d7670194fc03142af40319aaL8;FFe1230091e8a701a97f630094c0fdff90000022918c6300", + "94c0fdff9000e0379189630094c0fdff900040389183630094c0fdff900040329183630094c0fdff90BL8;FFe80300f942eeff97e80300aaa1feffb0218c1491a3feffb063a80d91e0030091c2008052a4008052e80300f9c7edff97e10340f9b8ffff17e80f41b2b2ffff17L8;ZDBBL8;FFe0e300912ac6", + "ff97080d8052e92340f90827089b29008052097d02a9090180521a7100a91c0700911a7d01a91f2503a91f2100f92003c03d0081843c2007c03dL8;FFd6c2009180010054c1025ef8810000b4c0825ef822008052d7270094c1825ff8e1feffb4c00240f922008052d2270094f3ffff17681640f9280100b", + "40805088bL16;FFda0000b4e0030caae1031aaa22008052d9a70094ab835ff8f40740f9d80000b4e00315aae10318aa22008052d2a70094ab835ff8f91b40f9bb0d00b4e0031caaBBBBBBBL8;FB352f6c6962726172792f636f72652f7372632f697465722f7472616974732f616363756d2e72730076656", + "e646f722f6c69627369676e616c2f727573742f7072L8;FF2821084a095d1053095b69782001084a9c0700f11400144ac1fdff5411000014680100f008210091e103002900210091a22300d121008052e30315aae40316aaBL8;FF5369283808050091280800f90bfeffb43f0108eb93611932000100540d", + "fc6ad35369283808050091280800f94d0200b5e0030baa61000014e10300a9e00301aaL8;FF20000014f7031f2a39008092b80000b4e00315aae10318aa22008052d62100943f0b00b1c1020054e81340f9e9a34039e80b00f9e96300399704003648ff70d3BBL8;FFf52b40b9f44f40b9f30309aa13ffff", + "1780ffffd000601d91885d0194a0a33ea980ffffd000c01d9183ffffd063a0119184ffffd084401e91a26300d141038052L8;FFfd7bc4a8c0035fd6e00313aa22008052f7000094610a40f9a5ffff17f50300aae00313aa22008052f1000094610a40f9e00315aaadffff17e00313aa22008052BL8;FFe2e", + "dff97a00100b46b00001481620091e20313aaddedff97000100b47d000014600d00b5e00313aabceeff97e80301aa40010036c80d00b5e1031faac1f8ffb4L8;ZDBBBL8;FB746974792d6b65796964656e7469746965737075626c69636164647265737300ef104000000000004e00000000000000b90400", + "0017000000ef10400000000000L8;FFe1630091568fff977f0600b18000005480220291e163009134a4ff97df0600b1210c00545afdff17e8031faa000117abc2630054e1630091498fff97df0600b1BL8;FF6802000ac802080a00010012f44f42a9f65741a9fd7bc3a8ef160114ff8300d1fd7b01a9fd4", + "30091280440a90900009029d13d91c2feff9042542c91e02700a9L8;ZFBBL8;FF0a0000b04a010491e8a700a942ffff9042e83391ea0f00f9e3430091733d0194fd7b43a9ff030191c0035fd6202040a941ffffd0217c3391030d40f982048052L8;FFe1031baa20013fd6fceb41f99f0f00b12112005448", + "008092880200f9a8008052d90c00141f090071fc032a91ad0200541f0d007181080054606641f9616a41f9L16;FFe74b44a9f6134ba9e30311aaf1031eaafe1b40f9eb0312aad5000014f7d300f9a80100f0edc70ba9e51300f9f40307a9e64300f9e78700a9fe4b04a9eabb1da9BBBBL8;FB8691a48b907", + "9000034f200008e416dc05bb5716b5b831f32a1133a41d5a392c40dc427c5ecf10920f664dc58ca0fa03c48c688b4623f12397ee018d8c52dab9cL8;FF083c40f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091092440f93f0500b1400400540a2c40f9093840f90a0100", + "b44b0140b2BL8;FFfc0300aaf3031faa547f089bf5031aaae10316aa9f0213eba0020054e0c31791b50600d136a001919703138b02f7ff97e08bc13de18fc13d73a20191e293c13dL8;FF00401d91e0d7853de1db853de2df853dc6eaff97e043139139ebff97380100b4e0c740f9e10318aa04000014b60", + "000b4e00319aae10316aa22008052ce110094BBL8;FF0e0000140040c23c0140c33c290040f90240c43c085440b9600601ad3f0500b10040c03c0140c13c6212803d685200b9600600ad21010054f44f5ea9fcd340f9L8;FF060000143c008052542340f9b4031df874f1ffb509018052a8035df8755a00a", + "9755e01a9785e02a97c6605a97b6200b9682603a9686604a9f44f4ca9f6574ba9L16;FFddd10094e10313aa20200091f30301aa3ed9ff9760420891ff074091ffc30091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8cbd8ff17e00301aaBBBL8;FF2200805223008052240080524afdff976", + "10a40f9dbfeff17e00313aa22008052230080522400805243fdff97610a40f9e2feff17e00313aae10317aae20315aaL8;FFe8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aaf4100094fad342f9fc0740919c8301910ffeff17f60300aae043169122008052ec100094BL8;FF200300", + "54536928380bfc71d308050091290040f9280800f9abf6ffb43f0108eb93611932400400542c0440f90afc78d39369283808050091280800f9eaf8ffb4L8;FF42d879781f0002eb3997991ae003192a46feff97e103002a8002f837397f4093c0020e91242b009143e30b91020c40b9077864f865787978e", + "0804039a56c1c53BBL8;FF950f0094e87749f91f0500b1e0070054e1d342f9e8cb42f91f0101ebe08b0054e8cf42f92a040091802202914901805209692138ead302f91e1e0094e1431691L8;FFe89740f928f3ffb40805088be00313aa0201805201f17dd3fcfeff17ea074091e90756b9f7e742f94a011", + "891f53f00f9fa074bf9481140b8fb0b4bf9f90f4bf9L16;FFe10240f9a822003908008092a80200f9810000b4e00318aa22008052d6b10094610240f9810000b4600640f922008052d1b10094610e40f9810000b4601240f9BBBBBL8;FBcb1440000000000072000000000000001100000026000000560b4", + "0000000000075000000000000006400000026000000576869737065725072654b657953656eL8;FFfd7b41a9ff030191c0035fd6fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9fd030091ffc306d1f40304aaf70303aaf60302aaf30300aaa20400b4f80301aaBL8;FF2b0140b26b11c0da6b1540d26b", + "0d0b8b6b25019129194b8b2905009129010aabc20600542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8bL8;FFf7ab4bf9f96701b9ff0600b180270054e9af4bf9e2b34bf92c008092f7bb00f947010014da7e0853fb0308aaef031a2ac2070014e9ef59a93a7f085328ff60d3BBL8;", + "FF6107f8b6f7031faae00317aae10315aa7155019415008092814a40f93f0400b140020054810000b4804e40f922008052d1590194815640f9810000b4805a40f9L8;FFe8833291e0032d91fbf3fe97e85346f91f0500b120600054e85b46f9e9f31691e02bc33de95b04f92900009029112791e8c303f92", + "800009008412691e85f04f9L16;FF3f0800718c0100543f040071000300543f08007121020054001b00b5a0c303d1bee6ff97e80301aaa0030036c8fcffb4d80000143f0c0071400200543f100071BBBL8;FF6aa240a9e00740f9690240f9e10313aa54692838080500911f0048f1680a00f9a3fdff540b7", + "c0e533f0108eb7361193220010054536928380cfc5cd308050091L8;FFa20a0154b800f8b6f9031faae00319aae10318aa70750094f90b00f9980300b4d8790094e00318aa2100805239008052d0790094c0feffb4f90b40f95f0700b1BL8;FFe9031faa280080520a0180528b0300b574e87bd3ebef7db2", + "9f020beb08030054010100b421e87bd3e00302aa02018052e30314aad1f90094a00100b507000014L8;FF215c1f9100210091a24300d1defcff9728008052e80300f9770000b4e00314aa7f030094e81b40f9880000b4f31f40f9e00313aa7a030094e85b40a9f40341a9BBL8;FF9ffe003988264d298a2e", + "4e298c364f29e00300ad0809c05a2909c05ae00301ad8e3e5029e003c03de107c03de20bc03de30fc03d830e803d820a803d8106803dL8;FFdf0208eb61000054e0e30e910ed8fe97e00640ad09068052e8e341f9e20ac03dc822099bc9060091e0832491000500ad0209803de9e701f9e4f3ff97e86340f", + "9L16;FFe3e35e39e7f343f9e4e343f9e5e743f9f5435f39fc7300f9e27744f9fc6f40f9ebaf00b9eb0316aaf66740f9f02340f9e3b7803de20713adec2b4ba9e8f200f8BBBBL8;FB6573657269616c697a6174696f6e206572726f724572726f72207769746820656e636f6465722f6465636f6465722073", + "657269616c697a6174696f6e56305631L8;FF40008052e10315aa73850094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0309d1092046398900003609008092090100f944000014BL8;FFff033a91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0fef", + "fb000601691e2feffb042401791210680526e050194e8ff42f9e90343f9L8;FFdc090094400300b4e10317aae20313aaf60300aadf0900940200001436008052e80b40f9e083c13ce103c03db35a03a9e82300f9e81740f9e083843ce82f00f9BBL8;FFfa031caafc0317aaf703142af40f40b90e0000142", + "8008052ff2300f9e80b00f9353b40f9345341b9285741b9e83f00b915fbffb528008052e81b00f9364740f9L8;FFe00301aa28fc073708fc60d3c80100b5080840921f1900f102020054017c0353210200341f1100f160020054e003082ae20313aae303142ab5ffff97c0fdffb4L16;FFe8ab00f9e81f42", + "f9e92312a9e82342f9e92742f9e8ab1aa9e82b42f9ea3342f9e9a309a9e83742f9e92f42f9e8af15a9e83f42f9eb3b42f9eaa310a9e84342f9BBBL8;FFe06901940004805221008052d9690194c01f00b4600740ad08048052e93b40f9330100b9000400ad288100a9280d00f9342100b9670000140b257e", + "a9e00308aaL8;FF601640f922008052f30b40f9fd7bc2a8d969001461ce40f9810000b460d240f922008052d469009461da40f9810000b460de40f922008052cf69009461e640f9BL8;FFe0030091420180524400805209000014e00300f9a1feffd021cc1291a3feffd063380d91e003009142018052640", + "18052c6efff97e10340f986ffff17ff0302d1L8;ZFBBL8;FFfab30a39e10302ade10ac03de10b03ad1ac1ff97e99341b93f09007121080054e8cf40f9e9a341b9ec030b91eaa741b9e86301f9e9cb02b9eacf02b9080380d2L8;FFe08753ada203d83cb4f35938a2039e3ca0073eadc0f2c03cc0f2863cd9", + "2900940008805221008052d2290094c00200b4a0077ead971a0033a203de3c08088052L16;FFe0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a96da50094ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aaBBBBBBL8;FB77697468206c656e203e20757", + "3697a653a3a4d4158000000d41b4000000000004800000000000000af0000000a000000a1104000000000004d00000000000000L8;FFfd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0307d1380840f9f40301aa1f4300f1e1140054950640f9f9031faa4800805213038052BL8;", + "FF29250191c91a498b29050091b41640f92801088b140b00b4890240b22911c0da291540d2290d098b29250191891a498b29050091200108ab220a0054e10313aaL8;FFdd1d0094e0030191e103172ab5100094e12b40f9e92340f9280101cb1f2500f149150054e91300f9e22740f928fdfff008c133910", + "80140f938280091296f8e52BBL8;FFe0010054e8bf40f989060091e1c30591e00315aa1b693438e9c300f9c3e3ff97f4c340f9e8bb40f9080114cbbf0208eb68010054d5fcffb5ecffff17e0c30591L8;FFe183c13de287c13d69060091e0833291000500ad0209803de9f702f96bf3ff97fc9740f9e89b4", + "0f91a008092fafb02f9e87300b409038052fb031faab7fdffd0L16;FF220080522300805224008052b8010094610a40f9aeffff17e00313aa220080522300805224008052b1010094610a40f9b5ffff17e00313aae10318aae20316aaBBBL8;ZBL8;FFf62b08f9e0ff833de103843de207843dfbeb0df908", + "590154793600b4f7e74df9e10315aae20319aae002188bd97d0094ae010014e04fc23de8a344f909008092BL8;FFf65741a9fd7bc3a820feff1760fcff97fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30302aae20301aaf40300aa34010037e00308aae10314aae30313aaL8;ZFBBL8;FF691e0079", + "6a0a00f97f020039fd7b45a9f33340f9ffc30191c0035fd61f09007181010054ea0f40f9090180d20900f0f248dd7892290140b20a000014ea474039L8;FFea1349b9eb2b5279e1430f91a96207f8e94345f9ead303b96a3642f9a8e207f8e813557940210391ebab0779a96208f8e8df0779213bff97a01", + "10036fa031faaL16;FFe86b44f9fc6f44f9ea7202f8ea035e39f07744f9e8270ea9e87344f9f14340f9eaaf00b9ea5744f9e39314adf9bb48a9e9030daae1a3803ded6f40f9e86300f9BBBBL8;FBd8e5d5f6d5f6d5f6d5f6a28c21e7e717e717a28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28c", + "0000e26d56e256e2000005881fc4602ec6c02b1a57caL8;FFb58a399136008052e84b01f9e04f01f9ff5301f90b0000146802148b8904805294620091090100a9b5220191090900f9f65301f9d6060091df9600f180170054BL8;FFe85306f942140094e10300aae15306f9e0833291e1feff9021203f910", + "2028052e3feffd063a01c91a40280524c000014e80f41b2e0833291e85306f934140094L8;FFb500f8b6f8031faae00318aae10315aa71090094f40301aaf30300aa750000b5360080520c000014970640f9d50d0094e00315aa2100805238008052cd0d0094BBL8;FF60ffffb000e02c918f49019460fff", + "fb000402d918c49019460ffffb000a02d918949019460ffffb000002e9183490194ffc305d1fd7b11a9fc6f12a9fa6713a9L8;FF180118ab020a0054390700f194c2019161feff54080317ab22070054c902158b080109ab62090054691640f9090100b42a0140b24a11c0da4a1540d24a0d0a8bL16;FFe9", + "eb01f929038052e1430f91e8a303f962008052e8ab03f968fefff008411e91e9a703f9e9af03f9e90303aae3031d91e8b303f9e80300aa40fefff000b40a91BBBL8;FF167d4039ec0b0179e94700f9ea43023920070054887640f91f8100f121070054887240f94b0080528df240b9818247a9090940790a", + "1940390f7140f80e0140b9L8;FF85830091e00316aa060480523a16ff97facb40f9e86346395f0b00b161100054f7430f9108150036c08641a9a90302d1e8430f91a20302d12401019103048052BL8;FFe20313aafe040094f50300aa2d0200143f0900b1a0140054e80b41b23f0108eb411400548122009", + "1e20313aa09060094f50300aa230200143f0900b180170054L8;FFc27e4093a47e4093e00314aa637e4093c81b80d2010000d49f0200f1000841baa100005473061c12600180927f82007100009fdaf35341a9f55b42a9fd7bc4a8BBL8;FF1f0308ebc9000054e0431691e1031aaae20318aae5110094fad", + "342f9fc0740919c830191fbf9ff17f60300aae043169122008052dd110094e1d342f9e00316aaL8;FFf6eb42f9f5e742f9e8e3163949008092670000141a0180d2e8031faa38ff48d31a00f0f206000014090180d2f8031faae8031faa0900f0f23a017fb2091f4092L16;FFddad0094b40000b4e00315aa", + "e10314aa22008052d8ad009408008092e1230b9102398052688600f8e00313aad9ad009430000014e8431291e123029102328052BBBBBL8;FB6375727665446a62d095420000000000a0964200000000000c9642000000000040974200000000007895420000000000c91c40000000000048000000000000", + "00L8;FFa9b31638a9e356384a01084aa2833bad6b01084aaac31638aaf356382901084aabd31638ab035738a9e31638a91357384a01084a6b01084aaaf31638aa235738BL8;FF8e110194490080524afdff35ea031faa4901098b200108aba2010054f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c00", + "35fd600ffff9000201a917f110194L8;FFe007409161620491e2030e9100401d913c050094e8ab4bf91f0900b1416b0054d4060031f53f00b922860054a04700d1f50316aa36c3ff97e08b01b9a04700d1BBL8;FFe0031aaa4906805209693938aa031cf8c6dbff97b9035cf8a8035bf8080119cb5f0308e", + "ba82000541a0100b4a8835bf8e1031caae2031aaa0001198bd5550194L8;FFf59b45b9e8bf45b9e1c20891eac742f9fbcb42f9208717ade89308b9e11f00f9a1170054e20f4ba9e0031691e56340f9e4031faa92e4ff97e8c342f9200bc03dL16;FF080080927f220039680200f974f5ffb5aeffff17e393", + "40a9e0431e91a1035db842faff97e8030091e0432d91e203009101c10091f1f9ff97e8432d91e9b745f9BBBL8;FF19692138c73a0094e10313aac7fbff97806240b960010034610a40f9680240f91f0101eb60100054680640f929040091690a00f91a692138e10313aabbfbff97L8;FF1f0700b1a01a005", + "4c022029125240094080040b20811c0da081540d2080d088b0825019108fd46d30900088b390500913f0308eb48190054da000014f6074091BL8;FF600640f922008052dbf50094610e40f9810000b4601240f922008052d6f50094611a40f9810000b4601e40f922008052d1f50094612640f9810000b46", + "02a40f9L8;FF40090054340000b082020e9141404e393ffc0371600700542104001141400e39001c00511f7c0071a800005481020e9120c0208b21404e3901400d39611240f9BBL8;FF85000014bf0600b121fb0054f8031f2af6031faa340080521900809228008052ff1700f9e80700f9e0074091e8c33", + "f91e103182a00c035910c8b0094e80348f9L8;FFe8431f91e99704f992310094687a40f9e9430e910a0000f04a211f91e99304f9e9431f91e84b03f9080000f008412a91e99b04f9690000b029611591e89f04f9L16;FFe047803d6013c93ce8e30339685340f9e99300f9e0938f3ce88700f994150094ef", + "b343f9ff0900f1010b0054b60000b4e06740f9e10316aa22008052ceb50094BBBBL8;FB6e0000002e00000042024000000000006a000000000000000200000026000000000000000000000008000000000000000800000000000000ec51450000000000L8;FF080040b20811c0da081540d2080d088b0825", + "019109fd46d30800098b080500911f0109eba96f0054170115ab42de0054f50314aabc0e48f89f0f00b161000054BL8;FF020144ad420304ad010141ad410301ad020142ad420302ad010140ad410300ad60000054e02b40f957e0ff97f4e351a9180200b49922009104000014180700f1L8;FF5a139f1ae", + "1d340a9810000b4e00f40f922008052d805009474deffb4e02b40f9e10314aa22008052d3050094eefeff17e1e740f9e02740f96701009408014039BBL8;FF1a00f0f2e88300b9e8434339f8e34239e93308b87f050071e9a34bb8ea3700f9ea7f4179e8c30139e86340f9e97b00b9e9e74239eafb0079fa", + "5b00f9c1050054L8;FFdd450094611a40f9810000b4601e40f922008052d8450094e00313aa080c49f81f0500b1400000542d000094745a45a9f60000b4f50314aae00315aa28000094L16;FFe87b45f9e98745f9e8b700f9e87f45f9eaa318a9e88345f9ea8b45f9e8eb00f9e88f45f9e88f00f9e89345f", + "9e82b14a9e89b45f9ea9745f9e92313a9e89f45f9BBBL8;FFfd830191094840f9f30308aa3f0500b180010054098449a9a8a300d1e00309aa38600094a8835d381f050071e101005488fffff008010e910904805204000014L8;FFe083c43c0011803de083c53c0015803de93740f9093100f929070091e0", + "83c03c0001803de083c13c0005803de083c23c0009803d892200f90c000014e003082aBL8;FFa9040054e00313aac4f2ff97e007003728fc60d3c80400b5200840921f1800f1a2050054217c0353210600343f040071c00100543f08007161fdff54880240f9L8;ZDBBL8;FF42008052dc250194681240f9", + "a80000b4601640f901f97fd342008052d6250194681e40f9a80000b4602240f901f97fd342008052d0250194682a40f9a80000b4L8;FFe00316aae10315aae2031faa00013fd6e0031faaf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a94824ff97e0230091f7a700a9L16", + ";FF820080522300805224008052b8c9ff97c13240f9ca2a40f9e9ffff1769018052eae701b28b0480d2e97ea99b4a0941d2c23240f9297dca9b8a048052292d0a9b" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines11 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines12.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines12.lean index ef23335f9..5628164ca 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines12.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines12.lean @@ -27,358 +27,250 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub12 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF211ca00e418500fc61ffff54df1e00f123210054690240f9696a28f8e9031faaeaef7fb20b098052ec1f8052040000143f0116eb29050091000b0054686a6938L4;FFc00400b5e0030aaac6ffff17e10300a9e00301aae10309aa220080522300805224008052f4030caa32000094e103", - "40a9ec0314aa2aa040a9536928380afc71d3L8;FF00a019915c1f0194fd7bbda9f50b00f9f44f02a9fd030091f30300aa4003f8b7f40308aa130100b4491f0194e00313aa2100805235008052a81f0194600000b5BBL4;FF810000b4e04b40f922008052549f0194e15340f9f803162a810000b4e0031aaa", - "220080524e9f0194bf0600310004005448008052e0c30191e3830091e10319aaL4;FF4cffff54c11a40b92124c41ae1fe0737c11e40b92124c41a81fe0737c1ce7492060000f0c60042f9210040f93f0006ebc1fdff54c7424079e62c46d3dfbc0071L8;FF84803391e0030091a363009142008052b30f00", - "f99f9f009468420191810100d021901c91a40100b084e00891a363009142018052a80f00f9969f009468220291BBBL4;FF60760035e85341b9e86300b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebL4;FB636520706", - "17374206072656d61696e696e67603a20c004203c3d20c0000000002d004900000000004a00000000000000760100001c0000000409440000000000L8;FFe05f00f900c940f9e0e300f900cd40f9e05b00f900d140f9e00700f900d95aa9e03f00f900dd40f9e03300f900e140f9e0f700f900e540f9e02f", - "00f900e940f9BL8;FFf30300aac10200d021483191e8030091e00309aa820380529d5f0194c10200d021043191e40200d084000b91e0030091a363009122028052b30f00f9955f0194L8;FF090180522a040091e003152a6a0a00f909692138e10313aae5fcff97f4fbff35f44f42a9f50b40f9fd7bc3a8c", - "0035fd6e00313aa2200805232030094610a40f9BBBBL4;FFe8031faaca0180d2090080920a00f0f2e08741ad880a00f928008052892a00a98082813c8182823ce08740ad8082833c8182843c68320039f44f4ea9f76340f9L4;ZFL8;FF53611932200100542a0440f90bfc63d35369283808050091280800", - "f98b0200b5e0030caa1b000014e10300a9e00301aae10308aa220080522300805224008052BL8;FFf44f03a9fd830091140040f9e00301aa010300d021a01e91e8230091020280529b7f01943303009073a22391010300d021283091e0230091a32300d1c2008052L8;FF36050091df0208eb682e0054c80", - "10014e11740f9e80f40f91f0101eb407d0054e81340f92a0400918022029149038052ea1700f909692138aef1ff97e1630091BBBL4;FF60a200a928008092680200f91e00001408008092a9030090296d0091680200f9c8028052692202a91700001457048052940300f094c2349109000014e0c30091L4;", - "FB100000000000000008000000000000003ce64700000000000000000000000000000000000000000001000000000000007ce6470000000000df7a490000000000L8;FF00844dad0274c03de10313aaf40308aae2db803de0071aad01804cade0030091e10319ad56bf0094e843069161820791023280520", - "081079151bf009488c20d91BL8;FFe017c03de83340f9e00f803de82300f90c000014e8a745a9a00200d000c03291a18301d1a82739a9a8c301d149fffff029312491a8273aa9e8c30091773f0194L8;FF61e10c8b2b0180520a0000144d254039bf0500f1c80100548c1900126ce10c8b81fd0daa3f000b", - "eb030500544b018052e0031faa4a010b8b29010bcb0a2500a9BBBBBL4;FFb7035df86bffff17880080d20800f0f20811009154ffff17880080d20800f0f2081100915fffff17e0230091e8ab00a975ec0094a0c300d1a82b3da972ec0094L4;FFe0030e91bfedff97e8cb41b9f31b40f9bf02086ba200005", - "4f53f40b9bf02086bf603152ac9c9ff54e0830c919dedff97e8cf40f9880000b4e00759a922008052L8;FFe8630091e11300b9e0230091e1031faae2031f2a800f0194e80f40f91f0500f1a10100546802009008e1369109018052ca068052690a00b9682a01a928008052BL8;FF548f0194e01400b4e103", - "14aae2031caae01300f95a8f019416000014e82700f93a2f40f9fb3300f9daf8ffb51b018052287f40f91f0500b101fdff541c008092L8;FF42008052918f0094820100b042402f91e0230091e10300918d8f00948d8f0094fd7b42a9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301a", - "aBBBL4;FF8924e0f2551113cb7f0209ebe80c0054f90308aa150300b4f40300aa4ccf0194e00315aa010180521601805249cf0194e00b00b4f80300aae00314aaf36302a9L4;FBc38df289ca8267ee9d7080ad40d8754378a67d5115cbd89342e67621ca0d44d47397a28c5497f732d380428b0000d140cb", - "9f0bb09dc267489853730a01dd45e4L8;FFe4a74ba9fadb4aa980010014fb5300f9280200d008b140f9eabf40f9e5b340f91f0900f1e5b300f9eabf00f9a92b0054a801009008c1049129038052e8ef01f9BL8;FFff430191c0035fd6c00200f000802691c30200f063201b91c40200f084602791a27f009", - "1e10680525d4f019420008052c1008052574f0194fd7bbca9f70b00f9L8;FFe9a344f9fbbf01f9f5c301f9f7c701f90001803de9d301f9e0234ea9e3031f2ae16340f9e22340f9081940f900013fd6e03b02f9e8031691e13f02f9290c40f9BBBBL4;FFf60314aaf70314aac08640fc0088202e0800669e1", - "8c1019205000014080700d1b50600d11801188a750200b4f80000b5c08640fcf70208d10088202e0800669eL4;FB2e00000000000000e00000000e000000ea984800000000002e00000000000000cd0000000d0000006c69627369676e616c5f70726f746f636f6c3a3a70726f74L8;FF9fb200b98102029", - "1e003082ae20313aa02f3ff97201200b520fcffb4d6ffff17890240f93f0500b1e10000549f5e00a99f7e01a9977e02a99f5e03a99f6204a9BL8;FFa56f0194f44f43a9fd7b42a9ff030191c0035fd6fd7bbea9f44f01a9fd03009113d040a91f0800f9d40000b4e00313aae558ff97940600f173c201918", - "1ffff54L8;FFe1d342f9e8cb42f9f98749f91f0101eb40430054e8cf42f9490480522a040091e00318aa09692138e1431691ead302f9df0c0094fad342f9e8cb42f908011acbBBBL4;FF63000491640300d084a00f9120c10091a263009121008052aa0f00f9f30308aa83af0194e00340f9e80313aae903", - "00d0290d40f9a9f7ffb50a8046b8c90380d2L4;FFc000f8b6eb070094080040b91f110071e0feff54300000141f0017eb68070054480319cb1f0008eb080700541c00198b9f0315eba9010054bf0200f10803959aL8;FF000741ada8035ff8a8521da9a0860dad020340ada2820cadb60000b4e00317aae1", - "0316aa220080524daf009460220091ff030e91f44f44a9fc0b40f9f65743a9BL8;FFe9feff100a6b683829090a8b20011fd6c1825ff841feffb4c00240f9eeffff17280400d11f0d00b1a8fdff54c0825ff8e9ffff17d3e640a9280340f9680000b4L8;FF090500394a051a320a010039e0ffff17ea0f801", - "20b7c10530a2c0633eb0000350b7c0c530a050039090900396a091b320a010039d6ffff170b7c1253ec0f8012BBBBBBL4;FF2200805256170214c0035fd6fd7bbea9f44f01a9fd030091f40300aa68018052f30300aa818e41f8290041d23f0000f12841889a1f2d00f1a2010054680240f9L4;FF8000805", - "22100805252170094c05001b488008052e06f02f9a10000d021a023911a0000b9e3431391e00313aae2018052f6cb01b9e86b02f9e87302f9c7f2ff97L8;FFf44f42a9f65741a9fd7bc3a8c0035fd620008052e10313aa5e170194e10300aae00308aa72f7ff17fd7bbda9f65701a9f44f02a9fd03009115", - "0840f9160040f9BBL4;FF2281ff9720eaffb47e000014a0e300d1aa980094f40301aa00ed0736ad000014c08640adc282c93ca88353f8c382c83ca9035cf8e0070cadc082ca3cc182c43cL4;ZBL8;FF68c20091810100f0216c1991840100f084600a91a3630091a2008052a80f00f99c970094810100f02", - "1001a91840100f084801991a363009122018052b30f00f9BBBL4;FF210080523900805252d70194c0feffb4e1031aaae20317aaf80300aaf9031aaa57d70194e8630091e0230091e1031faae2031f2a78d70194faef41a9e00319aaL4;FB6e696e67603a20c004203c3d20c0002f636172676f2d72656769", - "737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662fL8;FFf70700f9e5d300f9a5d0ff97eb1b43a9ea0315aaf2d751a9ef0314aae5d340f9f70740f9e70316aaee3740f9ed6340f9f4031baafecb40f9e44f40f9f19740f9BL8;FF880241d2e90080521f2d00f10", - "831899ae902009029d913918a0000102b7968784a090b8b40011fd6e1d342f9e8cb42f91f0101eb20b50054e8cf42f949018052L8;FFe02500b5a02302d158f4ff97e80301aa40010036482600b5e1031faac2ffff17e1031faae82f06f9bfffff17e1031faae8570cb9bcffff17e1031faae8630cb9BBBB", - "L4;FFe803009120013fd6e80340f91f0d00b141030054880200f9680080522a000014785e40a9f50301aa762240b948f70194000380520101805246f70194200500b4L4;FB303938352f6c6962726172792f616c6c6f632f7372632f737472696e672e72730006207769746820c0000c206e6f7420666f75", - "6e643a20c00076656e646f722fL8;FFc00300543f080071e00100543f0c007121fdff5488824bf81f0500b1810000549fe60ba99ffe0ca99f820d3881e20291e20313aa16faff97200600b5e1031faaBL8;FFa88314f834c3ff97fc0300aaf90301aa4d0000141f090071e1040054aa8354f8691f009148d", - "d7892250000149f0700b1e0070054467701948008805221008052L8;FF0103198be00317aa08812f918befff97e8f34df91f0900f160220154e0074091e10740910232805200c0359121802f9153770094e8074091e007409108810991BBBL4;FFe11f40f9e81740f9090101cb3f3d00f1e9110054e91b40", - "f92a4000912003c03d1f010aebea1f00f92069a13c401300540802805228692a38e003152a48050091L4;ZDL8;FFbf0208eb41040054e0230091a6b60094e80b40f980564079a9060091e123009116693538e90f00f9e6d1ff97e10f40f9e80740f9080101cb1f7d00f1c9020054BL8;FF081d7d92226968", - "f8a90200b029613391286968f8e10308aa8f37011408a440a9e20301aae00308aae10309aa86370114fd7bbfa9fd030091083040f9080100b4L8;FFe0370054778640f9684242b9e8c300b9970a00b4758240f94d370094e00317aa210080524b37009420f200b4e10315aae20317aaf80300aa513700944", - "a000014BBBBBL4;FF48e1073649e2ffb591ffff17fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4309d1a80400b0080140f949d03bd5e00700f93301088bL4;FFf44f02a9fd030091f303032af40302aaf50301aaf60300aa4d07009400048052010180524b070094600100b416", - "5400a9810000d021c03991140800f91f600039L8;FF410200f021f81891e00308aaa2028052fd7b42a9ffc300918f070114410200f021501591e00308aaa2028052fd7b42a9ffc3009188070114a9200091410200f0BL8;FF8c0d0c8b8c2501918cfd46d38c0500914901098b6a010c8b29010a8b2a0140b", - "24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abe20c0054L8;FF53870094e00315aa4100805251870094000b00b4eaa743a9ecaf42a9eeb741a9f0bf40a91100001440008052560080525c0080525b0080525a00805259008052BBBL4;FF3f0800b101020054fa0300aa540080d2e0", - "031aaa1400f0f2fdafff9708008092685200a9ffc30b91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8L4;FB65782e6372617465732e696f2d313934396366386336623562353537662f70726f73742d302e31342e342f7372632f656e636f64696e672e72730076656e646fL8;FFe87340f9", - "f6bf02f9fcc302f9f98b05b9e8cb02f9a21c0094eeb343f9df0500b1e00b0054eb831d91e9e343f98aa201916011c53cf7430d916281ce3ce9f200f8BL8;FFf62b40f9f51f40f996000037d80200d018e31e9113000014d7fe45d3e80214ab820c0054e90200aba20c0054aa0217cba8831cf8a8c300d1a0", - "2301d1a9ab3ba9L8;FF290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8bBBBBL4;FF000540f92200805255e70194bb0000b4e0031caae1031baa2200805250e70194b90000b4e0031aaae103", - "19aa220080524be70194bb0302d1b40000b4e00318aaL4;FB000000000000000008000000000000000800000000000000704d420000000000000000000000000008000000000000000800000000000000804c420000000000L8;FFa0c303d112e7ff97801c003728fc60d3e81a00b5200840921f1800f1e2", - "1a0054217c0353011b00343f040071200200543f08007161fdff54e87f41f91f0500b1BL8;FFe20313aa2300805224008052685aff97b6835ef8b7835df8bbffff17e00200f000202c91e30200b063802291e40200f084a02c91a24300d141038052a8273fa9L8;FF0201805201f17dd355670094745642a", - "9950100b49622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f92200805249670094f8ffff17BBBL4;FFe08e41ade123c03de216c03d6112803ce30a03ade10204ad6012813c6312823c6212833cb40000b4e00315aae10314aa220080524aa70194e10740f9c10300b4L4;FFfd", - "030091f30b00f9f303002aecffff97ecffff97070b0094e003132a01000094017c4093c80b80d2e00301aa010000d4e00301aaa80b80d2010000d4fdffff17L8;FF08050091a80317f888a70094bff31438f40315aa82fe46d3bcc303d1e20000b4a80357f880030191e10319aa0801028ba80317f87da70", - "09488e27a9282164092BL8;FF00c03e91830200b063c03491840200b084a03f91a27f0091e106805260270194ff0302d1fd7b06a9f44f07a9fd83019109004039f303012af40308aa3f050071L8;FFb40100b58200001436008052571740f917fcffb538008052482740f91f0500b121fdff541900809254", - "2340f9b4031df8f40e00b4080d80525a1f40f9fc0300f9BBBBBBBL4;FFa00208cb02018052551b0294e6ffff17e003032a591b0294f40300aae3ffff17ff8302d1fd7b04a9fc6f05a9fa6706a9f85f07a9f65708a9f44f09a9fd030191L4;FF571b0094e14740f9810000b4e00316aa22008052521b0094c", - "80180d25f0700b10800f0f2a88319f800030054e18b42ada0a301d1a003d83ce20301ade107803dL8;FF600200f000201c91581b0194fd7bbda9f65701a9f44f02a9fd030091f30302aae20301aaf40300aaf50308aa14010037e00315aae10314aae30313aaf44f42a9BBL4;FF9c031e4afeaf40b9fc221", - "f38fc525f387b031e4afeb340b9fb321f38fb625f3808011e4afeb740b9e8421f38e8725f389c031e4afebb40b9fc521f38fc825f38L4;ZFL8;FFc0035fd6e00308aba3ffff54a001009000201291559b0094a001009000c01a91529b0094800100b000c012914f9b009408004039e00301aae80000341f0", - "50071BBBL4;FFfb7b10f9ff7f10f95fdb0194e87b50f9e97f50f9c00202912103019162018052fffe0139082d00b12935899ae87b10f9e97f10f954db01942083c13d2187c13dL4;FB6e646572666c6f777576776e6ca16e38f3f16cbcc2c834f7387e01cf81572df8f55c4e96a73a64c764656c696d6974", - "6564206c656e6774682065786365656465L8;FFf65342f9e82b17a9e80742f9ea1b42f9e66b42f9fe6f42f9ec7342f9e9231fa9e81342f9e90f42f9fb7742f9f47b42f9e37f42f9e8cf00f9e82342f9e78742f9BL8;FF5f5b0194e01fc53de123c53db8008052e82369795401805215008092e057813de15", - "b813de8e30a7985000014e8d342f9e067c13de8a302f9680e00f908008092L8;FF280000b008111d910b0000f06bd13e91e92306a9a9630091a07f0091e92b07a9090000f029713e91f42708a9e9030091a18301d1e92f09a9e9c30091e9230aa9BBBBL4;FFe0040054f50a40f9eaa700a9c801c0daee0f0", - "0f90811c0da080f488b08010a8a08fd0d9b5b03088be8031baa6a835bf8090d5bf83f0500b15c01889a880b40f9L4;FB6172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f6861736862726f776e2d302e31372e312fL8;FFfc6f41a9fd7", - "bc6a8c0035fd65802009018531f91f9c303913b0080921600f0d21700809207000014e103082ae20313aa630c8052b0f4ff97e10300aa60fdffb5BL8;FF3f0400f18b000054604240f922008052537b0194614a40f9743e00f93f0400f18b000054604e40f9220080524c7b0194615640f9744a00f93f040", - "0f18b000054L8;FF2200805223008052240080520592ff97e11740f972fcff17e0630091220080522300805224008052fe91ff97e11740f9b6fbff17e06300912200805223008052BBBL4;FFf85f1ca9f6571da9f44f1ea9fd430691f30308aa410300b41a004039481b1f121f8900712105005416040091", - "340400f1f6d308a940050054d5028039e00707a9L4;ZBL8;FF1f8125f181040054681640f91f010ff121040054e10313aa340c43f89f0600b160070054753240f9f60300aae003009156daff97688242f86082c13ce203c03dBL8;FF09fd46d30800098b080500911f0109ebe81b00541401001497010094", - "080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f0008ebL8;FFf14b00f971ca1391761602f9781a02f9681e02f96a2202f96b2602f96d2a02f96f2e02f9703202f9694a02f96c4e02f96e5202f9775602f9f14f00f97fca1339BBBBBL4;FF2a040091e00316aa6a0a00f90", - "9692138e10313aa63f7ff97550300b4610a40f9680240f9969a40f91f0101eb20230054680640f9490280522a040091e00315aaL4;FFf50303aa25030094a8c300d1e00315aa0566fe97a8035df8a083dd3ca9835ef81f0900b1e00b803de91b00f981010054e1230091e2830091e00314aa7ee6ff97L8;F", - "F410200f021203891720b0114fd7bbea9f44f01a9fd030091f40301aaf303002a4b0b01940001805201018052490b0194400100b4e10300aa140000f962020090BL8;FF810240f9200080398000f8b728040091490400d1110000145f2800f1880000542800028b08f1df384803f837e0030091e4f4ff97e", - "80340b9880a0037e80b40f9L8;FFe0240054528b00948007805241008052508b0094206b00b4a00640adc90600d1e84b41f9a20ac03d000400ada0c2c23c3f0108eb0208803d00c0823c01fdff54BBBL4;FFe81b40f9f71b00b9f4671929f32306a9f36307a9fc6308a9f66f0aa9fa6f0ba9126200941704", - "00b142330054b700f8b6fa031faae0031aaae10317aa55cb0194L4;FB72207769746820656e636f6465722f6465636f6465722073657269616c697a6174696f6e56305631d5184900000000006a00000000000000190100002e000000L8;FF2100805253cb0094602c01b4e10318aae20316aae06700f959", - "cb009470080014e9031faa08008092690600f9683601a90cfeff17f5031faadf0600b160000054BL8;FFf70b00f9f65702a9f44f03a9fd030091150040f9bf0600b1a005005414d840a9f30300aa960100b49722009104000014d60600f1f7620091e0000054e1825ff8L8;FF830500546b0500f1ec030da", - "a81feff54a90109abe300005423000014e8031faa090840f949fdffb5e90309abc2030054280108ab42040054091440f9090300b4BBBBL4;FFe143029122008052080500b12935899ae82715a95ceb0194ff3f0439f80314aaf70316aaf603192a02ff47d314df7992181b4092020100b4e82755a9600202", - "91L4;FB804c420000000000000000000000000008000000000000000800000000000000804c420000000000000000000000000008000000000000000800000000000000L8;FF680640f9090180522a040091e00317aa6a0a00f909692138e10313aa9debff97560300b4610a40f9680240f9b70640f91f01", - "01ebc0080054680640f949028052BL8;FF5a0200b43f0400f16b00005422008052536b01941f0700f1ab000054e00319aae10318aa220080524d6b0194df0600f14b040054e00317aae10316aa22008052L8;FF340200b4526b0094e00314aa21008052506b0094800200b4e10315aae20314aaf60300aa5", - "66b0094080000147f0200f9f44f43a9f70b40f9f65742a9fd7bc4a8BBBL4;FFe08707ade00741ade247803de21340adf87b40f9e133803de40305ade00f42adf73f4339e227803d8002178be21640d2e08f06adf91640d21614003846ab0194L4;FF9055530aef118d9a5f01116a6d4e53d3f10153b21002", - "0b0a2f128f9a5f01106ab201120af00152b2714a12530f128f9a900180525f01126aea0151b212b06cd3L8;FFf30301aaf40300aa51ab009400308052010180524fab0094c01300b4f50300aa4bab0094003080520101805249ab0094001300b4f63300b908028052f60313aaBL8;FF0edcff97e20f4ba9e", - "0031691e5134ca9e11f40f9f7daff97e8c342f9200bc03dfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1404f803da90319f8601a0054L8;FFe86b00b98a2a0094e80356b9e00740918100805200001891ff0316b9e86300b9832a0094e80356b9e00740918100805200001891ff0316b9e85f00b97c2a", - "0094BBBBBBL4;FFe10309aa220080522300805224008052f4030baa66060094e10340a9eb0314aa2aa040a9290040f90cfc6ad35369283808050091280800f92cfbffb43f0108ebL4;FF21440054fc0318aaf8030e91ee6b12a9998600b4e18b00f9e0431391e1030eaae20319aa160a0094e86b42f9e9db", - "44b91f0900b1e91f01b9a1860054e07342f9L8;FF09350039093040390a3900390a3440390b3d00390b38403909410039090080120a4500390b4900390c4d0039090100b9c0035fd629008052010500f9090100b9BBL4;FF08008092e80b00f9bac301d11f0500b1a30c00b4280300b008710391290000b0", - "29711e91400f0054ea1340f9eb230091200300d000bc3091eba305a9e1630191L4;ZDL8;FF691e40f9090100b4290140b22911c0da291540d2290d098b2925019129fd46d329050091280108aba2060054694240b93f0500716102005469aa4829c9030034BBBL4;FF8ac80094f51340f960000014f65340", - "f9df0600b10012005417efffb4e8e279d3151117cb4ad30194e00315aa0101805248d30194802200b4e8031faae9031faaL4;FBeaa4cce7fc8ed899f5e70095d67df89b9afc3602efec209b380346baef67b60c4ea708f7eb0e22c9a7f233e3a7780ec62907e3ee000054fa4eedcafd06cdc134L8;FFf22f", - "44f9e13344f9e9ff00f9e9c743f9e63b44f9fe3f44f9e44344f9f94744f9e9cf00f9e9cf43f9e34b44f9ec4f44f9f15344f9f75744f9e9c300f9e9d343f9BL8;FF490380522a040091e00318aa09692138e1431691ead302f9fd0c0094fad342f9e8cb42f908011acb1f0308eb48430054e8cf42f9e10319", - "aae20318aa00011a8bL8;FFf3d352a9940200b47522009104000014940600f1b5620091e0010054a1825ff881ffffb4a00240f9220080524c530094f8ffff17e027c13de8a344b9b47e0853BBBBL4;FFe80200f9690300f908fc60d3a80500b5080840921f1900f1a2050054017c0353c10500343f080071", - "000100543f04007141020054e96b40b949fa073729008052L4;FB6765727072696e74696e76616c69642073656e64657220636861696e2072617463686574206b6579617373657274696f6e206661696c65643a2069203c207365L8;FFf30302aaf40301aa11f3ff97e80300aae00301aa08020037750240", - "f9a80640f9160100eb62020054e80f41b2e80300f907000014c90080d248008052e0230039BL8;FF577301945c000014b6035df8d7ffff17a0831cf8e10200f021601f91e30200f063542491a0e300d102028052440180521b000014a0831cf8e10200f021601f91L8;FF00ba0054e8cf42f9290400911f6", - "92138e9d302f985ffff17f37749f97f0600b1e0020054e18f49f93f0400b140010054810000b4e09349f92200805248730094BBBL4;FFf70300aa19210091b54301d1bca303d138008052e20301aa09000014a26301d1830c8052049aff97200c00b5bc835af8f9031caa228f40f8e20e00b4810340f9L4;", - "ZBL8;FF57b30094681a40f9600ac03d966200a9692a492988ee02a9280080528082813c950a00f9991e00f9882608298a6a0929f44f51a9f65750a9f85f4fa9fa674ea9BL8;FFa88357f8080540f9150101ebe200005481010014a22302d1630c805259e4ff97e10300aa203000b5a88357f8080540f91f0", - "115eb09100054a02302d163ecff97L8;FF84018052e3000014e04305f9e0032a91e100009021843d9102028052e30000b063b40591c4018052da000014c80080d2e0232a39e0032a910800f0f2ff272a39BBBBBL4;FF4901098b6801088b2abdcaca2981c9930badcbca4801088b6901098b0acdcaca0881", - "c8932bc1cbca4901098b6801088b2c81c99329bdcaca0badcbca2801088bL4;FFa0020054ff0600b1600200544a0080d2e8e740f9890000f00a00f0f2202900f9890000f03f030aeb282d00f9e103005408488852e801a0727f0308eb69030054L8;FF810000b460da40f9220080525403019461e240f981", - "0000b460e640f9220080524f0301946022009185fdff9760820791f30b40f9fd7bc2a818fdff17fd7bbea9BL8;FF08200091200440a9e92300910a0000b04ae11e91e8a700a9020300d042383b91ea0f00f9e34300916a830194fd7b43a9ff030191c0035fd608200091200440a9L8;FF0811c0da081540d", - "2080d088b0825019108fd46d308050091091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140b26b11c0da6b1540d26b0d0b8bBBBL4;FFe8cb42f91f0500b160000054a0620091a9acff97f7c742f9f5c342f9970100b4b822009104000014f70600f118630091e000005401835ff881ffffb", - "4000340f9L4;FB47654900000000004e00000000000000f90400001900000047654900000000004e0000000000000001050000140000004d6573736167654c656e677468457665L8;FFe8a301f9e8035e39e5bf43f9eaf200f8e24f44f9eb5344f9f65744f9f85b44f9ea6344f9e9030daafa6b44f9ec6f4", - "4f9ed7744f9e17344f9f14340f9f22b40f9BL8;FF1f0101eb60040054680640f92a04009109028052e003142a09692138e10313aa6a0a00f9f44f42a9f50b40f9fd7bc3a8f7fcff17e8031faa94fcff35e003088bL8;FFfa9701b92183813c2083823ce10245ade81700f9e80b40f9e9a319a9a80302d121", - "83833c2083843cca9efe97e11b40f9e21340f9e843069163a3039164230391BBBBL4;FF7ce3019440f60035e85341b9e8df00b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054L4;FB5f6b65795f69647369676e65645f7072655f", - "6b65795f696474696d657374616d704d6573736167654b65796369706865725f6b65796d61635f6b657969767365L8;FFc082803ce9b705f9c082c03ce1dfc23de0431e91e2e3c23de3e7c23de1030b91e9d345f9eab745f9e2031faae303152aa0039d3cf5431e91e10b17ade3c3803dBL8;FF682640f99", - "c5200b9955a00a9955e01a9985e02a9996a03a9992204a9f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd620008052e10315aaL8;FF680240f97f0a00f99f0208eb08040054f7031faa08011fcb9f0208eba8040054340100b4680640f9e10315aae20314aa0001178b52630094e802", - "148bb502148bBBBL4;FFfc0b00f9f44f02a9fd030091ff0740d1ff0300f9ff830ad1290440f9090600b4340040f98a0240395f2100f1c10500542a0480d23f8518f10a00f0f281050054L4;FF00c0049114c8613802000014947e01139400003780761e535fc020eb83ffff54e14f40b202000014947e011", - "3607f349b1f0001eba8ffff549c7e40939f060071L8;FF68020291810100f0218c1691a40100d084e00d91a363009182018052a80f00f99ca300949ca30094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9BL8;FFe08741ad8212833c8012803c8112813c9f020039f44f48a9fd7b47a9ff43", - "0291c0035fd6ff8300d1fd7b01a9fd430091280440a90900009029a1109182020090BL4;FFe20313aae303142ab5ffff97c0fdffb4d2ffff17280180d2e00700f90800f0f2081500d1deffff17e90b41b2e92300a9dcffff17280180d20800f0f2081100d1L3;ZBBBBBBBBBL4;FF0088202e0800669e17c1", - "01f260ffff54e802c0dae91340f90811c0da200540a9530f488b68fe1b9ba802088b024106d19e1800940800148a206b68fc00a8200eL4;FF17000014f5031caae91b40f9eae340397a5f1833e89343b8eb3f40b9e91300f9eaa30039e80b00b968ff58d3ebb300b8e90b00f9ea63003914000014baf37da", - "9L8;FF685200a9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6f80300aa0140009120008052bb1d01944002f8b78802009008c11a9174d600a9780e00f9BBL4;FFfd7bc6a8c0035fd63f0700b1c0e9ff54e0c30c91a886ff974bffff1738008052df0215ebf54702f9f84b02f9ff4f02f929f", - "7ff54e0231291e1031faae20316aaL4;FFc0035fd6030000f062400691e40300aae1070132420c4039421c00130204003480fc5f88e000003581fc0088a0ffff356203f836634006917f0c003918000014L8;FFfd430091130040f9e00301aa810100d021ec1c91e8030091c20080529c9d0094682201918", - "10100d021481491a40100b084600991e0030091a3630091a2008052BBBL4;FFe0023fd61f0000f1ad000054390300eb033600541803008b060000141f0400b18135005471dd01941f1000310135005439feffb505000014e043059181008052L4;FB6c69643a20c000003909490000000000490000000000", - "0000550000004e00000039094900000000004900000000000000500000004e00000075726e3a75756964L8;FFf01704f9e8ff03f9e8eb40f9e9f303f9e80304f9e89b40f9ec1b04f9e80704f9e81740f9eb1f04f9e82304f9e82740f9f22704f9e82b04f9e80b40f9e35b04f9BL8;FFe163c73de8074091e", - "26bc73de007409108810991e01b843de067c73d00800191e11f843de023843de227843da85d0194e007409100800991a65d0194f50300aaL8;FF090180522a0400916a0a00f909692138e10313aae6faff97e00314aa080c43f81f0500b160000054e10313aa0bfeff97950a40f9550300b4610a40f96802", - "40f9BBBBL4;FFaa2240f9aa0a00b42a01008a00696afc00a8200e0c00669e8c0b00b48b01c0da6b11c0da4a0d4b8b4a01098a0b69ea38eb0bf8364c2100d118692a386b014092L4;ZFL8;FFe00700f9c6ffff17880080d20800f0f2080140b2c2ffff17880080d20800f0f208110091beffff17e00300f94", - "10200d021641991430200d063981991e0030091BL8;FFa52300d1e00308aac2018052a87d0194fd7b42a9ffc30091c0035fd62103009021703291e00308aae2028052fd7b42a9ffc30091887d01142103009021343891L8;FFe80f40f91f0101ebe04b0054e81340f92a040091e00315aa49018052ea1700", - "f90969213891d9ff97e1630091997dff97807a40f9800100b4e11740f9e80f40f9BBBL4;FF090440f94b2000d10a0800f929010b8a3f2500b1080200540a0c40f90901098b01692238212100395f0500b1a0010054080d02cb49050091090c00f903811ff8L4;FBac634800000000009862480000000000f", - "862480000000000486248000000000084f3470000000000280000000000000008000000000000005c65480000000000L8;FFc90100d029012f91a8831ff828048052f30300aae9a301a9a82300d109018052e28f03a9e0030091e163009162008052e8a702a97f170094610a42a9e80314aaBL8;FFa00200", - "f000c02791583d0194a00200f000200891553d0194080040f9a90200f029413191e00301aa08014039227968f8a90200f029a13191287968f8e10308aaL8;FF22008052563d0094e10313aae82b40f9c80000b4e02f40f9e10308aa220080524f3d0094e10313aae10700f9e10000f021443e91e30000f06", - "32c3f91e0230091BBBBBL4;FF75ffff17e00313aa22008052230080522400805266000094610a40f97cffff17f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e00313aaL4;FFea0318aaf00316aaef031aaaec0319aae2c740f9e08756a9610200b4e2af18a922008052f9030caaf8", - "030daafcdf1aa9f7030eaafc030faafa0310aaf6030aaaL8;FF080114cbbf0208ebe8000054680640f93f0002710801148ba20100540101003926000014e00313aaf603012ae10314aae20315aaa1f7ff97e103162a680640f9BL8;FFf75b42a9fb0f40b9f96341a9fc0340f9060000143c008052542340f", - "9b4031df874f1ffb509018052a8035df8755a00a9755e01a9785e02a97c6605a97b6200b9L8;FF5a8d0094600100d000c01291578d0094fd7bbca9f70b00f9f65702a9f44f03a9fd030091140040f9f30300aa9f0600b140020054610e40f93f0400b140010054BBBL4;FFdefeff17e0e30091e10318aae2", - "0316aa230080522400805265c0ff97f82740f9e81f40f9080118cbdf0208ebe9dbff54e0e30091e10318aae20316aa23008052L4;FB00000000fa9d698a1044db1a000000008e194900000000005700000000000000890000003c0000008e1949000000000057000000000000007b00000040000000L8;FF", - "e8af40f9e88700f9c2f1ff17e00100d000002a9155cd0094e00100d00000279152cd0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091BL8;FF5f4d0194e0430691e10315aa3aa0ff97e00315aa3c76ff9728008092680200f9a6ffff17e85340b91f050071610f0054e043c73ce1", - "43c83c03e4006fe283cc3cL8;FF176104a9166105a9096100b9fb0800b4a8035ef81f011ceb80080054560b40f9586340b9360500b4540740f9484d0094e00316aa21008052464d0094000c00b4BBBBL4;FF602201a9000400ad692200a9f44f45a9fd7b44a9ff830191c0035fd6e023009167eaff97e043", - "c13ce143c23ce83740b9e90740f9ea1340b960c2803c61c2813cL4;FB206f662061207365616c65642073656e646572206d65737361676512626164204b454d206b65792074797065203cc3200080690400013e0019756e6578706563L8;FFc80080d20800f0f2080500d197ffff17c80080d20800f0f208", - "09009193ffff17c80080d2e0230039e00300910800f0f2ff270039e80300f93ae3ff97e80300aaBL8;FF21e01b91e00313aa42008052aa6d0194800100362000805202000014e0031f2af44f47a9f65746a9f85f45a9fa6744a9fc6f43a9fd7b42a9ff030291c0035fd6L8;FF90fbff17f60300aae043169", - "1220080523c110094e1d342f9e00316aacafdff17e04316912200805236110094e1d342f9dbfdff17e0431691e1031aaae20318aaBBBL4;FFa9835c78600a01ad78f20cf876e20ef875620ff868e20ff8690e0279f6feff17790300f0391f36911a038052edfeff1728028052bf231b38790300f039fb289", - "1L4;FF4b010c8be7ffff1754fc41d30d0000141f4100f1ea279f1a29010a0ae9000036f4031faa0700001428008052ff0f00f9ffa300a91000001414f97fd33402f8b7L8;FFe3031aaaa40100d084001191e80b00f9bc831ff886ad0094e003172a68e34039e103142a1f050071c0fcff54fe060094f7030", - "02a08ffdf88c802003568e34039BL8;FF1f0f00b12102005468008052f53f42f9f43b42f9e8a3113929008092a80240f9690200f9680000b4e00314aa00013fd6a10640f9e12a00b4a20a40f9e00314aaL8;FF8b2c0094f4833f910a088052e0833f9189fe5839888258392a15003308111d1288821839e8", - "6208918afe1839e083c53de187c53de0fb833de1ff833ddb03ff97BBBBBBL4;FFe00313aae10317aae20314aa230080522400805266080094770a40f9c9ffff17e00315aaa5160194e20315aae80300aae00301aac8e707374cffff17e0230091L4;FFe243813de227c13de1830891e04f813de00bc13de2", - "830991e157813de113c13d63c20391e8e302f96842019167220391e9ab01a9aa0000d04a412d91e8ab00a9L8;FF4a710baa0b1040394a510baa0b1440394a310baa2a0d78b3091c4039490109aa0a0098d28d0c8052ca8fbdf2aa45dcf2aac9fff229010a8baa5788d24aafbcf2BBL4;FFe00319aae10317", - "aa2200805254950194bc0000b4e00740f9e1031caa220080524f950194b80000b4e0031baae10318aa220080524a95019400e4006fe0030391L4;ZBL8;FF691e0054080c47f81f0500b16018005457faff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb2817", - "0054e4000014BBBL4;FFc10000542800805238008052dffe04a9bfa339a9a8ff3ba91f0800f1c15b0054b58355f8a20640f9a25e00b4a10240f920008039c003f8b728040091490400d1L4;FB58000000000000007e000000090000005369676e616c5f5051434b415f56315f4d4c4b454d3736383a63697", - "0686572746578745369676e616c5f5051434b415fL8;FFe14740f9fb031caa090080928a008052e80319aaea270ea9ea6341a9f9fb42a9e61f40f9ebb344a9f57b40f9e0bf46a9ed0740f9e56f40f9e45f40f9f03340f9BL8;FFd6820991f4031baa0969213828040091f87749f9e8d302f91f0700b1c020", - "0054c0220291c41c0094080040b20811c0da081540d2080d088b0825019108fd46d3L8;FFe10313aa8392fe973c008092fa4340f9fc5b02f97e010014c80080d2fa4340f9fb8302910800f0f2084500919f0308eba1020054e0833291a9efff9774010014BBBBL4;FF28008052a203df3c800600ad820a80", - "3d68c20039f44f4aa9f74340f9f65749a9fd7b47a9ffc30291c0035fd6000180520105805262f50194000400b000a01c91L4;FB53747275637475726573656e6465725f6b65795f7374617465734d6573736167654b65796369706865725f6b65796d61635f6b65796976436f6d62696e656446L8;FF0800", - "f0f2080900915effff17c80080d2e10700f90800f0f2080900d107000014e80b41b2e00700f904000014c80080d20800f0f2080500d1e80300f9e0030091BL8;FF090180d2e8031faa0900f0f229017fb24a1d409208010aaa69a200a92800805268020039fd7b45a9f33340f9ffc30191c0035fd6ffc300", - "d1fd7b01a9f31300f9L8;FFf44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e067c13de8d342f933ffff174b0080522c0100348c0140b28c11c0da8c1540d28c0d0c8bBBBL4;FF600706ade18343ad622f803d610307ad15570094a10303d1e00316aae20317aa57b50194608744ad7", - "3060091e80b40f9f60315aa000500adba0e00b48082c63cL4;ZDL8;FFfa6708a9f85f09a9f6570aa9f44f0ba9fd830191094c40b9f90300aaf80308aa3f090071a20700542a2f40a9e92f00b9295741a9aa031ff82a1b40f928e179d3BL8;FFfb2300f9e923072999f9ffb53b008052f4e340f9f61b00f9b", - "4faffb536008052e0dbc23de1dfc23de88332911f030071fa7706f900818b3ce0e3c23d01818c3cL8;FFe1431a91022880525d350094fc031faaf7031faa36008052e0431f91e14315910228805256350094a0620091e1431f9102288052fa8b04f951350094e86b4ab9BBBBBL4;FFe20a00b416210091f4", - "630091f7230091350080520e000014e90f40f9e1630091a2630091e003082a3f0900b129119fdae90f00f9d4f2ff97c01100b5b70f40f9L4;FFe10319aae20317aa230080522400805238e6ff97f90f40f9e80740f9080119cbff0208eb09f2ff54e0230091e10319aae20317aa23008052240080522de6f", - "f97L8;FFf30300aae00314aac8030094d50000b4a8e279d3e00314aa02018052011115cb4f050194610e40f9e10000b4601240f922008052f44f42a9f50b40f9fd7bc3a8BL8;FFfd7b4ba9ff030491c0035fd620008052610380525f85019420008052a10280525c85019420008052a10380525985019420", - "008052210480525685019420008052L8;FFe0130054608640a9c2fe44d322d6ff97b78359f8f503002a133c0853a88358f8ff0208eb61000054a0e301d19e840094a80359f813693738f3060091a88358f8BBBL4;FF09692138a18300d166b1ff97b6035ff8a8035ef8080116cb9f0308eb081300541c010", - "0b4a8835ef8e10f40f9e2031caa0001168b52c50194d6021c8bb6031ff8L4;FB6e616c5f5051434b415f56315f4d4c4b454d3736383a53434b41204b657900000000000000000000000000000000000000000000000000000000000000000000L8;FFe3b7803de20713ade8f200f888018052e0a3803de60", - "30991683e00a9e00759ade86b40f969ba03a969ff60d3602e00f960c20891685201a968a20291000506adBL8;FFfd830291081c00121f090071e1010054e00302aaf30302aaf40301aa6bfeff97e80300aae00301aa08020037680240f9080540f9150100eb62020054e80f41b2L8;FF6a2440a9681040f9", - "0b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a2954450094BBBBL4;FFd6a201f118a30191730600916003005400877fa9e8230091e5bb0094e82340391f05007121feff5428b340f91f0900f183feff5448008052a00700d", - "1e1c30091L4;FB206572726f723a20c0001a73657373696f6e20737461746520636f727275707420666f7220c0001c706f73742d7175616e74756d207261746368657420657272L8;FF680240f997621932df0208eb61000054e00313aaa4e40094680640f9d50600919f1240f117693638750a00f9c2000", - "05494fe47d3680240f9bf0208eb41090054BL8;FFfd7bc3a870650114f3031f2ae003132af44f42a9f65741a9fd7bc3a86a65011433008052e003132af44f42a9f65741a9fd7bc3a864650114fd7bbda9f65701a9L8;FFe8008052f30300aa2a0900d13f0500f14881889a1f2500f148100054290100f029", - "413f918a0000102b6968384a090b8b40011fd661ce40f9810000b460d240f9BBBL4;FF4a1d409208010aaa69a200a92800805268020039fd7b45a9f33340f9ffc30191c0035fd6ffc301d1fd7b02a9f91b00f9f85f04a9f65705a9f44f06a9fd830091L4;FF7f003f7180000054000080d21f000039007d2", - "0d4631240f97fcc74f2200d005463cc749266fc44d3c60400d1dfc024eb220c0054000080d21f000039007d20d4L8;FF2400805207bcff97e10313aaf35341a9cdffff17a001009000e01e9153a5009408004039e00301aa1f0900710c010054e80100341f050071a1020054a1010090BL8;FF1f01003900", - "11803c0111813cc0035fd6290080521f0500f909010039c0035fd6290080520a2500390921003909010039c0035fd649008052098500a929008052L8;FFe10f813de0074fade213813de3f7803de0071fade00b50ade003813de1834cade207813de263c03de1831cade1834dade2e3803de1831dad3f010", - "09401bb40f9BBBBBBBL4;FF692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a295a190294fd7b47a9ff030291c0035fd6ff8301d1fd7b03a9f65704a9L4;FFc7ffff17a00000f000c028916b190094ff8301d1fd7b03a9f65704a9f44f05a9fdc3009109504039e902", - "0037011040b9155840a9f30300aae0030091f40308aaL8;FF1f710171a1010054e3430091e00313aae10314aae2031baae80f00b9f65701a96c190194a0fc0736cfffff17e00313aae1031aaadeffff17098100513f7d0171BBL4;FFe20317aae30315aae40314aaeafcff97a8835ef81f0500b160020054", - "a083de3ca8835ff86002803d680a00f907000014e8028052490300b029d1159169a200a9L4;ZFL8;FFa8010054a0877aada10301d1e00314aa22008052a0073eada08b7bada00b3fad8299009400e4006fbf0318f8a0833aada003973ca8da77d3a0877aada10301d1BBBL4;FFc0035fd6ff4302d1fd7b07", - "a9f34300f9fdc30191011440f9f30308aaa10100b4001040f9a8c300d1c4b30094a8035d381f05007181010054a8835d381f050071L4;FB3939306231343131366236643835366166303938352f6c6962726172792f636f72652f7372632f697465722f7472616974732f616363756d2e7273002f636172L", - "8;FF009c3091e4af02a9fb271ca9f2ab00f9f7eb10a9e8bf00f9e77b04a9f11300f9f56300f9ef3b00f9f04300f9e61f00f9ea0700f9e5d300f999d2ff97e99759a9BL8;FF57590194e1db42f9810000b4e0df42f92200805252590194e04306910d100094e11b40f93f0400f18b000054e01f40f9220080", - "524a590194ff0600b1e1000054L8;FFea032d91e9af05f9290000b029111d91e8ab05f9e8c32791a04700d1e9b705f9290100b029013091e8b305f968008052e1c31791e91703f9e9ff02f9290100b0BBBBL4;FF800600ad820a803d68a20039f44f4aa9f93b40f9f65749a9f85f48a9fd7b46a9ffc30291", - "c0035fd6000180520104805263f90194000400d000c017915ff90194L4;FB6167652066726f6d20c02e206661696c656420746f20646563727970743b2073656e6465722072617463686574207075626c6963206b657920c011206d657373L8;FFa203d13c8182813ca10f7aad8082823c8282803c818283", - "3c8382843c76000014e08744ade00314aae85b40f9a0873cade08742ada8031bf8a0873aade08b43adBL8;FFc0035fd6e10300aae00308aa79e9ff17fd7bbea9f44f01a9fd030091890300d0290140f94ad03bd55301098b694240393f050071e1010054600640a90a0300b0L8;FF010001ad020c00ade00", - "7409100800991b1790094f70300aa4d79009400908052210080524b790094c09601b4e10317aa02908052f50300aa5179009444790094BBBL4;FF36230daaf55f40f9ea031faaed0308aaad010c8a20696dfc00a8200e0e00669e4e0100b55f2100b1e02b00544a210091f32b40f9fa2f40b9fc1b40f9ad0", - "10aabL4;ZBL8;FFe01b40f9e10317aa2200805254b90094e00319aa011080522200805250b900947c008052e087c03d88f242f8290080927c220039e07f803d88f200f8e07fc03dBL8;FF6b1540d26b0d0b8b6b25019129194b8b2905009129010aabc20600542a0140b24a11c0da4a1540d24a0d0a8b4a2", - "501914afd46d329010a8b290500913f010aebL8;FF68008052e8020039b7010014e8f741f9788242f9e90342f9fa5f09a9f6ef41f9f7f341f9e86300f9e8fb41f9faff41f9f55300f9757e42f9e85b00f9080340f9BBBBBL4;FF2200805256090294e12b40f93f0400f18b000054e02f40f9220080525009", - "029460c2009101f1ff97e00314aa3f000014f30300aa688e4ff81f0500b1e1000054L4;FF880000f008bd3491090140f9086140f8090000f9890000f0294d3491086000f8c8008052e92302a9c8018052e90741b2e02301a9e0030091e92300a924e7ff97L8;FFe323009173090194fd7b43a9ff030191c0", - "035fd6202040a96102009021040d91030d40f902038052fd7b43a9ff03019160001fd6202040a96102009021280b91BL8;FFe0f7ffb44b000014e85b40f91f0500b161000054ff670ba9ff6300f9e1c30291a20301d11973ff97a0f6ffb44a000014e86740f91f0500b161000054ffe70ca9L8;FF4a010c4", - "aa801084a20010a4a097c18535a0b0091080300795f0314eb495a69780920094a2a5d10534a5a6a784901094a090700791813009128060054400b00d1BBBL4;FF610600f969420039edffff17ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091040180520509805229f87fd", - "33f1100f13481889aL4;FB636f6465206661696c65646e6f742079657420696d706c656d656e7465646d657373616765206465636f6465206661696c65644d414320766572696669636174L8;FFe0eb803d6093c73ce8230e39684740f9e06700f9e0831d91e9db01f9e092833ce8cf01f9391c0094efb34", - "3f9fa0315aaff0900f1c14c0054b60000b4e06740f9BL8;FF609a40f92200805255490194613240f9810000b4603640f92200805250490194613e40f9e10000b4604240f922008052f44f42a9f65741a9fd7bc3a848490114L8;FFe8031faa080113abe3020054000100d000c0139155490094f3031faa08", - "8c48f81f0500b121efff54e8031faa080113aba3010054000100d000200a914b490094BBBBL4;FFfc0300aa7f7f00f1010000adc90700544fe9019400048052210080524de90194e00700b4ea2741a9b86200b9e10240adb92600a9e92340a9010000adba2202a9L4;FB7c7b40000000000063616e20616c", - "7761797320656e636f646520746f206120566563000000000000ea984800000000002e00000000000000440300000e000000L8;FFe00313aae10316aae20315aa230080522400805203000094760a40f997ffff17ff0301d1fd7b02a9f44f03a9fd830091480001ab42030054010840a9e50304aaBL8;FF2", - "1c028916200805293690114fd7bbea9f44f01a9fd030091010040f9f30300aa1f3000b93f0400f18b000054600640f9220080524a690194610e40f934008092L8;FFe3838b3ce3838c3c839cfe97e89341b9080e00362007c03de9b341b92143c23ce8c741b9a6000014480100b008e13e9169038052d0fe", - "ff17eaa759a9e8430f91BBBL4;FFb4035bf8880216cbbf0208ebc8220054150100b4a8835bf8e1031caae20315aa0001168b56a90194d602158bb6031cf89f0216eb00240054a8835bf809028052L4;FFe00000544a0940f9eb032aaa6bfd47d36a194aaa4ac100924901098b2afd48d3299d00924a9d009", - "24901098bea8300b2297d0a9b08c1498b292840791f0109ebL8;FFf723032917038052e80300a9ff0b00f9f58300390c000014e80740f9a083de3cd6060091a822179ba9835ff8aa060091df4200f10001803d090900f9ea0b00f9BL8;FFf30300aae9ab00a9490080528a0200d04a8d3a91a00700d1e163", - "0091e9ab04a9890200d029e13691e9af06a9eb048052a9028052ffab01a98a0200d04a413691L8;FF5f29009428008052f43302f9d4820f91e8e71639e80000b0fa3702f9fb3b02f9f93f02f9fc4302f9f84702f9f54b02f908b140f91f0d00f1c3040054e10343b9BBBBBBL4;FF08fc60d3882700b50808", - "40921f1900f1a2270054017c0353c12700343f0800716c0100543f040071c00400543f080071c103005481620091e003082ae20313aaL4;FF33efff97e15341f9810000b4e00316aa2200805252110094e15f41f9810000b4e06341f9220080524d1100941a4affb4e00319aae1031aaa220080524811009", - "4L8;FF0974003969c1001108c1001109780039087c0039c0035fd600e4006fe8031f2ae9031faae003bfadea0300912b6869386cc100516b011b328d1d00126e9d0151BBL4;FFe1020054080180d2e9de7892ea1e40920800f0f2080140b229010aaa68a600a9e10740f928008052680200b9c11e00b5f80", - "0001417ff48d3080180d20800f0f2L4;ZDL8;FF3f09007149819f9ae90000b43f0500f161020054810100d0215c2a91e20280528d910014ff8300d1fd7b01a9fd430091810100d021202a91840100d084a02991BBBL4;FF48f3ff5413008092e8af40b9fc031faad60e00b5e9031faa3f0116eb620800546", - "a0b40f99f0316eb0c0e80528b83969aed0d80924e01098bd0690c9bee0309aaL4;FBf5fd19435e27785ced96d7a7d1a0a28ca70f97d90000ece3dee68cee90b7e2ccac4e990e5381b2b867f9c9292ab285635bbcf5d6567a35cbfa1ce97a6b4e8832L8;FFe00100d000f03591e8ab03f9e80100f008c1279", - "1e1430f91e3031d9162008052f8eb01f9f80311aae9a703f9e9af03f9e8b303f9fec700f9eb5700f9e41300f9BL8;FFe1d342f9e00314aa83fbff17e04316912200805253110094e1d342f994fbff17e0431691e1031aaae20318aa4d110094fad342f9e8cb42f908011acb1f0308ebL8;FF4221803d2283", - "c83cebe20891410103ad2083c53c2183c63ce84701f9e8a70691e04341f9400501ad2083c73c2183c43ce9b304f9400902ad2083c33cc282c93cBBBBL4;FFea0f40f9765a0179687a00b9a8035af869fa0079a9835a78a8831cf8a88357b8a9031d78a9b357b8681a00b9c87e105369b201b8a9035c3868b", - "a0239a8835bf8L4;FB76617465207369676e696e67206b657945974800000000003100000000000000dc0000002c00000045974800000000003100000000000000e700000036000000L8;FF40fd073728fc60d3080500b5200840921f1800f122050054217c0353410500343f040071e00100543f0800716", - "1fdff54880248f81f0500b1810000549f6608a9BL8;FFa9d316384901084aaa035738a9e316386901084aab135738a9f316384901084aaa235738a90317386901084aab335738a91317384901084aaa435738a9231738L8;FF00750054e8cf42f949068052f4074091948209910969213828040091f68b49", - "f9e8d302f9df0a00b1410f0054f9031faa84000014e1d342f9e8cb42f91f0101ebBBBL4;FF15000014f80300aa150000142800805269130091a0831b38a8931b38a9031bf803000014e80f41b2a8031bf8a04301d13ca70094a0031bf8610300f021f42691L4;ZBL8;FFb71e00f952b10094000480522100", - "805250b10094e00c00b4e00740adf70300aaa11240f9000400ad810000b4e00316aa220080524ab1009408048052b95240b9BL8;FF48058052a902009029ed1891e8c303f9c80080d20800f0f2fb9b05f908390091e9bf03f9e8bb03f9e80200f008b140f91f0500f169050054e8c32c91890200f0L8;FFa", - "d59fe97e84345f91f0500b140080054e002c03de84b45f9001f813de8f303f94b000014680f00b4687a40f9e9430e910a0000f04ab11691e99304f9e9431f91BBBBBL4;FF7b620039f44f47a9f65746a9f85f45a9fa6744a9fc6f43a9fd7b42a9e923416dff030291c0035fd620040090002011916201029", - "40920403989010037090040f9L4;FF21035ef8810000b420835ef8220080525301009421835ff8e1feffb4200340f9220080524e010094f3ffff17e83e40f9c80000b40805088be00315aa02018052L8;FFe20315aa0001178b5d010194e802158b680a00f9186300f1396300914004005436d77fa9e0031", - "4aae10313aa99010094e00315aae10313aa96010094770a40f9BL8;FF14cd40a9e803009198810194b30100b468e279d3151113cb130300f073621091e0030091a1630091e20313aab40f00f994c201918e810194b5c201f121ffff54L8;FF2925019129fd46d3290500918a2a80b9ea0400344a0140b24a", - "11c0da4a1540d24a0d0a8b4a2501914afd46d34a0500918b1a40b97f050071210400548bb24329BBBL4;FFa00b005448070091e0430191e143069102288052e82700f959c101949f0700b1e003005420630091e14301910228805253c10194e82b44b9fc7301f9f57701f9L4;FB393439636638633662356", - "2353537662f62797465732d312e31322e312f7372632f62797465735f6d75742e7273001c706f73742d7175616e74756d2072617463L8;FFa8035af8a20f7cadf72f02f9e82b02f9e85f42f9e007813de10b813da08739ad4083c63c4183c53ce313813de20f813df52342f9a203953c4283c43ce10302ad", - "BL8;FFf44f03a9fd030091f30301aa210840f9f40300aa680240f91f0101eb000b0054680640f92a040091e00314aa490180526a0a00f909692138fe090094e10313aaL8;FFc0035fd6735256a9880240f9680000b4e00313aa00013fd6810640f9c1feffb4820a40f9e00313aaf44f42a9f50b40f9fd7bc", - "3a84a410014010040f9810000b4BBBBL4;FF83b600541803008bf9feffb50f0000141f0400b1e1b5005474e101941f10003161b50054f9ffff1771e10194f70300aa1f0400b141fdff54e043059181008052L4;FB34ed4800000000006a00000000000000dc0000002e00000034ed4800000000006a00000", - "000000000750000002e00000034ed4800000000006a00000000000000L8;FFe10317aa2200805255e100949acd0736e2ffff17e8432d91e0430f91611f009428c30091a02302d11b2d0094e0ffc23de103c33d19008092e207c33de0432d91BL8;FFf44f02a9fd030091f30302aaf40301aaf50300aa4e61", - "019400068052010180524c610194400100b4155000a9e10200f021600091130800f91fa00039f44f42a9L8;FFe02300914757ff97f44f4ea9f95b40f9f6574da9f85f4ca9fd7b4aa9ffc30391c0035fd6f623009137008052180d8052680240f9080540f91f0115ebe91a0054BBBL4;FF5aa10194ff0302d", - "1fd7b04a9f72b00f9f65706a9f44f07a9fd0301915f7800f1f30300aae200005428008052690300b0290117914a068052680a00b9b2000014L4;FF60000014ebf9ff97e10300aa82018052000080d2220000b99a00001495520091050080d2e10315aa040080124304805262008052000080d2db020094f3", - "0300aaL8;FFf51340f9fd7b41a9ff030191c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091080040f9e00301aa15d140a9e80300918da10094740100b4930100f0BL8;FFe00313aa2100805252210194400100b528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd", - "620008052800600f909028052936a29f8BL4;FF53210094e00315aa21008052f40315aa360080524f210094a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad30a088052f4031faaf5ff03a9L3;ZBBBBBBBBBBL4;FF571e02946cffff17e003152a01018052e20313aa531e0294f44f45", - "a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6f50300aa60220091f80302aaL4;FF240180528913ff97a1035df8e80341a9f6df42a9f45744a9e10200b409008092690600a9880000b4e10308aa220080524b1e0094b60000b4e00317aae10316aaL8;FFe00314aa4100805250feff97965e", - "41a9986640a975feffb5e80319aa160000144b1e01940005805201018052491e0194600500b428031aab42060054490316abBBL4;FF579e0194f70f40f9e80740f9ff0208eb6000005404000014f7031faae0230091e39d019408038052e90b40f9e00bc03de826089be91b40f9ea0600910001803dL4;FF", - "73061c12600180927f82007100009fdaf35341a9f55b42a9fd7bc4a830f7ff17e4f6ff97c1028052010000b900008092fd7bc4a8c0035fd6def6ff9781018052L8;FFffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa810100d021801391e803009182028052979e0094810", - "100d021d01391a40100b0BBBL4;FFf70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300eb035500541803008b060000141f0400b1L4;FB28050000320000002d004900000000004a00000000000000d9040000130000002d004900000000", - "004a00000000000000bd040000130000002d00490000000000L8;FF009c00541f05007101bf00548800805209008092790a00f968220039690200f907dbff97cb100014e0032b91f50301aa212000910239805251de0094e87b45f9BL8;FFfd7b01a9fd430091e80301aae00700f9e10200d021000e91e40", - "200d084800d91e3230091e00308aae20180528e5e0194fd7b41a9ff830091c0035fd6ff8300d1L8;FFe10308aa220080523e02009469aa40a9dfffff17fd7bbda9f50b00f9f44f02a9fd030091f30301aa210840f9f40300aa680240f91f0101eb40040054680640f9BBBBL4;FFe10315aac99a0094e0874", - "3adc282c33ce9ab45a9e83740f9e08701adc082c43ce28300ad04000014e8031faa09008092ea1341b2e08741ad880a00f928008052L4;ZFL8;FF4b1dc0394c2100912e2100d10c3900a96d19001221c40daaabf6ff363f2100f120f7ff544b21c0394c2500912e2500d10c3900a96d19001221e00daa8bf", - "5ff36BL8;FFfd7b41a9ff030191c0035fd6a80240f91f0500b160020054a86300910900009029611a91020300d042840c91e3030091e00314aae10313aab50f00f9e82700a9L8;FF081540d2080d088b0825019108fd46d30900088b200500911f0008eb89180054e16300919b7eff97e11740f9e80f40f9", - "1f0101ebc0680054e81340f92a040091BBBL4;FF0e000014e8031faaf6e740a9b9f9ffb5e90319aba3fbff54800300d000001c9152be019428008052ff0600b1ffc300f9ff2317a9a10c0054d90700b42807198bL4;FB3232396365616566643439383563353039393062313431313662366438353661663", - "03938352f6c6962726172792f636f72652f7372632f697465722f74726169L8;FF1f010ff1a1050054e10313aa348c44f89f0600b1000a0054753e40f9f60300aae023009159ddff976082c13c688242f8e183c23ce283c13c6402c33c690244f8BL8;FF540740f9523e0194e00316aa21008052503e0194", - "000c00b4e10314aae20316aaf70300aa563e0194591740f9b7831ff8190400b4541340f9453e0194e00319aaL8;FFe10300aafaffff17e1031faae86b00b9f7ffff17680240f9080540f9190101ebe2000054aa000014e20313aa430c805207f9ff97e10300aaa10a00b5680240f9BBBBBL4;FFe802158b6", - "80a00f9882240f9a82000b4090d8052941e40f9590480521851099b5b0380525c0280521a0180520b000014680640f9e10316aae20315aa0001178bL4;FFef031a2ae13355a9ee031baafa9740f9eabf40f9eb0319aaedd740f9fba340f9f00318aaf70316aae8000014fa031f2ae88343b9093340b8eb13", - "0491ea0343b9L8;FF002031916202009042a0319121038052740e0194000040f99a0e0114080040f9e20301aa002140a9e10308aa860e0114ff8301d1fd7b04a9f32b00f9fd030191BL8;FF296b7cfc208d282e0800669e17c101f280030054e90700f9e802c0da0811c0da880f488b0801188a08fd0a9b3", - "b03088b680306d1080140f9bf0208eb61010054L8;FFc0fbff5408e8ff9760020079f44f42a9fd7b41a9ffc30091c0035fd6ffc300d1fd7b01a9f44f02a9fd430091a80100d00821019108fddf8888020035a80100d0BBBL4;FFe80240b20811c0da081540d2080d088b08250191e81a488b08050091b601", - "00b4c90240b22911c0da291540d2290d098b29250191c91a498b29050091200108abL4;FBb5c585f3f833d62975437d51d893762144d4a28c553b7cd0802a919500003ed264954975f6b2fd2aa293a553a68ef934db4e9b662f005e16bc2dfeb016de8495L8;FFe87300f9ee734ca9e8db40f9e4a709a9e4", - "030caae50700f9e9031aaafa0317aae89300f9f70301aae18f40f9e8d740f9e2831aa9e2030baaf6034ba9e50315aaBL8;FFe8a703a948008052c90200f029410591eae30091a04700d1e8271ca9c80200d008053091e82b1ea90a078052c8048052ff2719a9c90200d0292d2291e92b1ba9L8;FF40818f3", - "ce9e304f9680000b4e00314aa00013fd6c10640f9810000b4c20a40f9e00314aa4e4e00947f0b00b141050054e8630191ea9740f9e93342f908e10c91BBBBL4;FF1800180a21ffff5404000014f8031f2a0200001438008052e003182a6aee01943f1f007209008012e8079f1a1f1c0072a90200b9e80388", - "1aa8120039b60000b4L4;FB5f000000050000002594480000000000540000000000000065000000050000002594480000000000540000000000000073000000050000002594480000000000L8;FFf72340f9f65745a9fd7b43a9ffc30191c0035fd637008052a80640f91f0116ebc9070054e00313aa09ee", - "ff9760fe073728fc60d3880700b5200840921f1800f1BL8;FF4a1d409229010aaa682600a9fd7b44a9f32b40f9ff830191c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091344c40a9f50300aa010300b021402591L8;FF340a0094e0431691220080523d120094e1d342f9f2f9ff1748074039e", - "2074091400100d000802d91430100f063e00491440100d084802e9142c0359181078052BBBL4;FFfa675ba9fc6f5aa9fd7b59a9ffc30791c0035fd6e4031faaa78358b899324fb8bc8357f8be035838ba035df8a70317b8074c41b999b20db8bb677ca9bc0316f8L4;FFf5031faafc031faa340080521900", - "82521a04a05217008252e1074091e003132ae20317aa74110094000700b4c000f8b6e0060094080040b91f110071e0feff54L8;FF55ae00947306148be9031faa28008052d7010090f7a23a911b00809268e61f78e80309aa29f57ed3ea1740f908050091f80313aab3031df85969e978e86f03a9BL8;FFe", - "1825ff881ffffb4e00240f922008052532e0194f8ffff17e89340f9c80000b40805088be00313aa0201805201f17dd34b2e0194e063c13de167c13d9f0f00b1L8;FF1f110071c00100541f0d007101f9ff54f4d341f9f3cf41f9880240f9680000b4e00313aa00013fd6810640f901f8ffb4820a40f9e003", - "13aabcffff17e8030091BBBBBBL4;FF602240f92200805255160294612a40f9810000b4602e40f9220080525016029474d640a9950100b49622009104000014b50600f1d6820091e0000054c1825ff8L4;FFe96f42f9e87342f9f67742f9eb7b42f99f0900b1410e0054e8d700f9e9c300f9ebcb00f9b900", - "00b4e0031baae10319aa220080524a160094fae740f9a30000d0L8;FFe2050054890a40f9290108abe20500548a0240f9480108cb692200a9815640a9600640f9e20315aa4f160194750a00f9f44f43a9f70b40f9f65742a9fd7bc4a8BBL4;FF2904c0392a1d00124a6119534801280b08010251e900f837", - "4a00805208a800a91f0000f9fd7b44a9ff430191c0035fd61f114071c30f00542908c0392a1d0012L4;ZBL8;FFb3831ff8a3960094686200918101009021981991a32300d1e2008052e40314aaa8831ff89b9600949b960094f44f43a9fd7b42a9ff030191c0035fd6ffc300d1BBBL4;FF680e00f9000400", - "ad742200b9750200b9f44f44a9f51b40f9fd7b42a9ff430191c0035fd6200080520104805259d60194ff4301d1fd7b03a9f44f04a9fdc30091L4;FB6c796e6f6d69616c4465636f6465727074735f6e656564656469735f636f6d706c65746573656e64696e675f656b726563656976696e675f637431456", - "b53656eL8;FFe2031baae87700f9fba34ca9f65340f9f4371ea9eb031eaae1d348a9fe0310aaf00303aaf88f41a9e9df00f9ef3b40f9ed0317aaf57b40f9fc4340f9ee0311aaBL8;FF810000b4e0a349f9220080525456019460220291fa0a009408fdff17f37749f97f0600b180030054e19b49f93f0400", - "b140010054810000b4e09f49f922008052L8;FFc80080d2e0a33239e08332910800f0f2ffa73239e85306f9424cff97e80300aae08332912101009021c83791420280522301009063b43691e85306f908000014BBBBL4;FF28430291e10315aa165c0229086000a9080400f0086138911f600039602201a9", - "090d40f9e803009120013fd6e80340f91f0d00b100fdff54755a41a9e00740adL4;FBd5934800000000004d00000000000000e802000005000000d5934800000000004d000000000000005303000009000000d5934800000000004d00000000000000L8;FF07000014e80b41b2e00700f904000014c80080", - "d20800f0f2080500d1e80300f9e00300913fecff97e10300aae10300f94102009021d816914302009063d01391BL8;FFffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa0103009021442391e8030091e00309aa22028052967601940103009021882391L8;FFe93f49f91f0", - "500b1e067813de9d302f960200054e0abc43de1a7c43deac33391e2a3c43de95b49f94081833ce067c13d4181823c4281813cead342f9e99f06f9BBBL4;FF608540fc0a2440f9290500910088202e09a901a90c00669e8cc101920cad00a9c0035fd6092849a9eb0309aa090100f929010a8b608540fc0a5", - "440f929050091L4;ZDL8;FFf44f03a9fd830091010840a988008052f30300aae0230091040180520502805229f87fd33f1100f13481889ae30314aa0c000094e80740f91f0500f1e0000054BL8;FFe9830291e88344b9e1a30c91022780522041893c21418a3ce983029120e10291f47312a9f53301b9e85", - "701b95436019448008052e9f31691ea7340f9e8f31639L8;FF7bbe40f952360094e0031aaa210080525036009460d200b4e1031baae2031aaaf50300aa56360094fb031caafc0314aa0200001435008052e9832491e8032a91BBBBBL4;FF006839910081c03c230400b063401f912404009084803991a003", - "923ca28303d1a10080525e060294e803049120040090006839910081c03c0181c13c0281c23cL4;FFf50b40f9fd7bc3a8c0035fd600018052010380526a060094fd7bbda9f65701a9f44f02a9fd030091f50303aaf303022af403012af60300aa4506009400048052L8;FF02020054017c0353210200341f", - "1100f160020054e003082ae20313aae303142ab5ffff97c0fdffb4d2ffff17280180d2e00700f90800f0f2081500d1deffff17BL8;FF48070034693a40b96a8241392b010a0a7f050071a10000546012c63c6112c73c693e40b9e00700ad6a4240b9ea0800366a0642396a0a0036750240f9bf0600b1L8;F", - "Fe0feff540810158bb50600917f4300f1137100a9f52300f941fbff543a020036eaa342a909008092490100f9a80000b4e01f40f901ed7cd30201805248860094BBBL4;FF897b40f9e03340f9746201a96b2200f960828c3c61828d3c800745ad699e00f9690605917a02053960828e3c61828f3ce00746a", - "d76de14a9756601b96082883cL4;FB206b65793a20c00e20616e6420636f756e7465723a20c0152e2053657373696f6e206c6f6164656420666f7220c0022e20c0172073657373696f6e2068617320L8;FF57c60094e19342f9810000b4e09742f92200805252c60094e19f42f9810000b4e0a342f922008", - "0524dc60094e1ab42f9810000b4e0af42f92200805248c60094BL8;FFc00200b000001f9158460194ffc300d1fd7b01a9f44f02a9fd430091280840f9290040f91f0002f1431a00543f0108eb13601932200100542a0440f91f1040f1L8;FF5a4600940001009000e032915746009408004039090100b029", - "411d91e00301aa08711d5308410051081d7d92226968f8090100b029211e91286968f8e10308aaBBBBL4;FFaa831778aa7140f8e90b00f9a97d4039a8031878a87141f8ea1300f9aa0302d1ec2f00b9533100f8a88316f8a9031738ba0000b4e1031aaa2200805248e60194L4;FB6f73747175616e74756d", - "726174636865742d623538643766353665333634356363642f303639353962342f7372632f76312f6368756e6b65642f73656e645f65L8;FFe88b41f9c80000b4e08f41f9e10308aa2200805252e60094e10314aae16301f921020090216c1a912302009063b41a91e0030b91a2008052a40080527bdbff9", - "7BL8;FFfd7b01a9f31300f9fd430091e90301aaf30300aae102009021d42d91e8030091e00309aa2202805299660194e102009021882391e40200f084002e91e0030091L8;FF57660094683240f9a80000b4603640f901f57ed34200805251660094683e40f9a80000b4604240f901f57ed3420080524b66", - "0094684a40f9a80000b4604e40f9BBBL4;FF1f000014c80a0091a0831df805000014e90b41b2a9233da903000014c80e0091a8031df8a0c300d13e9c0094f45745a9e11f40f9e10000b4e82340f9f70300aaL4;FF1f7c0071a80000548102109120c0208b21404e3901400d39611240f9600a40f921cc749", - "2940210917f7e00a97f7e01a9820a40f97f1200f9020f00b4620600f9L8;FF493c4092288108aa093c40922101679e0001679e20e0e00e013c184e0000669ec0035fd6283c00130a3c00122b0401132c080213290000132d0c03132e100413BL8;FF8a0200b04a8d3a91a07f0091e1830091e92b05a98902", - "00b029e13691e92f07a9eb048052a9028052ff2b02a98a0200b04a413691ea2f04a92a0080d2f50308aaL8;FFf603012ae10314aae20315aa16e9ff97e103162a680640f9df0202710801148ba3feff54e90f80123f002071ea0f801229140033c20000542a7c065309050039BBBBBBBL4;FF08fd43d3d6f", - "fff17220000d042601291e1a30091031380526676009414008092e00314aaf44f4aa9f65749a9f85f48a9fa6747a9fc6f46a9fd7b45a9ffc30291L4;FFfd7b49a9ff030391c0035fd6a00000f000002891691a0094ff0303d1fd7b06a9fb3b00f9fa6708a9f85f09a9f6570aa9f44f0ba9fd830191093040", - "39e9080037L8;FF641a0194fd7bbca9f70b00f9f65702a9f44f03a9fd03009109800091f40302aaf60301aa29fddfc8f30300aaf50308aa3f0500f141040054680a40f96002c03dBBL4;FF000540394a01114a0ba11f382b0540390cb11f380c02124a0ed11f380e0d4039101140396b01004a0af11f382a", - "0d4039321140390dc15f3822c15f384a010e4aL4;ZFL8;FFffc30091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aa810100b021681891e8230091e00309aaa2008052969a0094b401009094021791BBBL4;FF01c480522200805255da0194e09340f9018c81522200805251da0194", - "ff0b4091ffc32191f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6L4;FB0000000000000000080000000000000008000000000000008c59440000000000456e636f64654572726f7272656d61696e696e676465736372697074696f6e28L8;FFe72304f9e8ef03f9e8c740f9ea2b04", - "f9e8f303f9e8b740f9fb2f04f9e8fb03f9e8cb40f9f03304f9e8ff03f9e89f40f9e53704f9e81b04f9e80f40f9ee3b04f9BL8;FF08008092680200f9490d00b4e8d342f91f0115ebea33959a08010acbaa0208cb33010aeb091d0054e90315aae8000014e81b40f91f0500b1000a0054e85b40b9L8;FFe88", - "30291e0c3179101a104919b0c0094e082c23ce182c33ce282c43ce8fb42f9e0db823de082c53ce1df823de182c03ce0e7823de082c13ce2e3823de82b00f9BBBBL4;FF8a050091a82a01a90802098b03853eade117c03d02019f3c01813dadea2740f92800809229008052480100f969a20039f44f58a9f6", - "5757a9f85f56a9fa6755a9L4;FB6b64662d302e31332e302f7372632f6c69622e7273002c7265636569766564207365727665722063657274696669636174652077697468207265766f6b656420L8;FFe28344ade2830bade18341ade18308ade28342ade28309ade18340ade18307ad800d00b5e08743ad", - "e00314aaa0873bade08b44ada08b3cade18341ada18339adBL8;FFa30200542a0040b98c0080528d0140b2bf010beba302005419000014e8031faa49001fcb2af17d9229094092ff030aeb030700543f1100f1830900542a6868b8L8;FF0891ff97f71740f9e80f40f9080117cbbf0208eb09c6ff54e0630", - "091e10317aae20315aa2300805224008052fd90ff97f71740f928feff17e063009122008052BBBL4;FF5c040034fc35f8371f0500f1c9360054480080d2a06301d1b30600d10800f0f2a8831af83da3ff97a88357f8970240797f0208eb20020054e80ac05a49031b8bL4;ZBL8;FFe0230191e10315aae63", - "50094e8630791e0230191bb330094fbef40f97f0700b120010054faf740f9570302f1c3360054e5020054f8031faae00318aae10317aaBL8;FFe8031faa080113aba3010054a00200d000601f91553a0194e8031faa080113abe3000054a00200d0002028914f3a0194e8031faa080113abc201005409014", - "0b2L8;FF810000b4020b40f9e00315aa543a0094e84340f91f0900b1213c0054682a43f9e0430f9161e21391022b8052175501b9683642f9754242f908e940b9684a06b9BBBBBL4;FF240080526afdff97790a40f9680240f9080119cbff0208eba9ceff54e00313aae10319aae20317aa23008052240080", - "525ffdff97790a40f96dfeff17e00313aaL4;FFf50300aa5e0a00941c000014a21240f9020100b4a10e40f9e0630091e30316aae40314aad4010094f55342a91f000014b400f8b6f7031faae00317aae10314aaL8;FF00fd46d3c0035fd6ff4302d1fd7b04a9fa6705a9f85f06a9f65707a9f44f08a9fd03", - "0191f30301aaf40300aa6102009021200991e00313aa62048052860a0194BL8;FFea72407868860039e8524078eb7e40396c820039ec7241f8684e0079e89240b8692202b8e9d2407868a202b808088052681500336a520079eaf240f8695e0079L8;FF48048052750100d0b5921f9136008052e84b01f9e", - "04f01f9ff5301f90b0000146802148b4904805294620091090100a9b5120191090900f9f65301f9d6060091BBBL4;FFf65755a9f85f54a9fa6753a9fc6f52a9fd7b51a9ffc3059151ca0114f44f56a9f65755a9f85f54a9fa6753a9fc6f52a9fd7b51a9ffc30591c0035fd6a0c300d1L4;FB080000000000", - "0000080000000000000070f8450000000000d5184900000000006a00000000000000020100002e00000000000000000000000800000000000000L8;FFf7d301f9a61f0094e7b343f9ff0400b100ad00540093c03ce8bf43f9e30319aae113c23de217c23d3bff48d3e0d7803de93344f9f4031aaaa8f200f", - "8e8a35d39BL8;FF080040f9f30300aaa80000b4600640f901f57ed342008052514a0194680e40f9a80000b4601240f901f57ed3420080524b4a0194681a40f9a80000b4601e40f9L8;FF69240054080c47f81f0500b1201d0054e2feff97080040b20811c0da081540d2080d088b0825019109fd46d30800", - "098b080500911f0109ebe81b005414010014BBBBL4;FF20030291080d0aaaa14302d122008052a0873dade08751ad290dc0da080dc0dae95301f9e85701f9a0873bade28354ada2833eade18352ada1833cad52ea0194L4;FB08000000000000000800000000000000684e420000000000c1200080600000", - "004f9d4800000000007500000000000000810000001c0000006120446973706c61L8;FFe00313aae10317aae20315aa230080522400805203010094770a40f9680240f9080117cbbf0208eb09f7ff54e00313aae10317aae20315aa2300805224008052BL8;FFa80f00f9a36a0194a36a0194fd7b41a9f31", - "340f9ffc30091c0035fd6ffc300d1fd7b02a9fd830091090040f9e80300aae00301aa3f0500b140010054e80300f9L8;FF1f0100f1e8179f1a0101090a24000014e1031f2a22000014882245b8e92f4379eb4746398c9246f8edc74639eaa34639e8d303b9e9ab0779e8a759a9ecb300f9BBBL4;FF770500", - "b4e0430191e10316aae20315aa68ffff97f52b40f9bf0600b120050054883240f9f4e345a91f0308eb0109005436008052580100b4f90314aa28174038L4;FFe81b40f9880000b4f31f40f9e00313aa7a030094e85b40a9f40341a91f0500f161000054f30314aa4000001408fc43d30900fe921f0109eb4", - "1000054200020d4L8;FF3f05007141020054a9035ef85f0309eb000700545a0700b11b01007914050079ba031ff803fdff54dc000014a8035ef8a80500b4b6835ef8b3031ff83a008052BL8;FF08d12d91a92339a9880200d008410591c9048052e8c302f9800200b000302f91e8cb02f9880200d0088110", - "91a10302d1e303169142008052e9c702f9e9cf02f9L8;FFe1074091e0833f9102c48052210018915b2a0094e00bc73de10fc73da0873dad4b2a00940004805221008052492a0094604a00b4a0877dadfa0300aa000400adBBBBBBL4;FF2800028b08f1df38a812f837e0030091ec7b0094e80340b9080100", - "36e00740f9f44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd6e80b40f9aa0640f9L4;FFa04700d187c4ff97e08300b9a04700d184c4ff97e07f00b9a04700d181c4ff97e07b00b9a04700d17ec4ff97e07700b9a04700d17bc4ff97e07300b9a04700d1L8;FF012500390aa100b8091d0079c003", - "5fd609fc68d30afc60d30bfc58d30cfc48d3001500390901003909fc50d30a0500392a0040390b0900390b0e8052090d0039BBL4;FF280300f008211d91e83700f908008012e87300b9198cff97b80000b4e00319aae10318aa220080524d920194a8a300d1a96301d1e1630191e82f00f968000090L4;ZD", - "L8;FFfd7bbca9f70b00f9f65702a9f44f03a9fd030091080040f9f30300aa1f0500b160000054e00313aa7a90ff97e00313aa14008092080c48f8740200f91f0500b1BBBL4;FFf5feff17e80741b2e4feff17e80741b2cbfeff17e80f41b2e0feff17e80f41b2edfeff17e80f41b2c5feff17880080d2080", - "0f0f20811009150ffff17e0830091L4;FB9385668f4c5814e2a74a03680f3d2088b345ca57446b14a881bae51f14c27b7799f0ed28a3e8081261d832f54bd0e658000026bf4ce1dbf2175bb41cf8c041f0L8;FF09f940f9e9ab00f909fd40f9ea2712a9090141f9e9af1aa9090541f9e94f00f987ccff975", - "700805220020014e8f741f9eafb41f9e0030991e9f341f9eb1342f9BL8;FFf90b40f94803188be8d302f97f0700b1fb0314aaa053ff54e80740910881099100210491e14316911310009497faff17c00200f000403a91c20200f042e03a91L8;FF2200805256520094f8ffff17e057c13de15bc13de87345", - "b9cfffff17e89340f9c80000b40805088be00313aa0201805201f17dd34a520094e063c13de167c13dBBBBL4;FFe90300f029b11491e1430091e82704a9e80300d008591c91e82b06a96a06805228048052ff2701a9e90300d029150a91e92b03a9290080d24914c0f2e87f02a9L4;FB3300000000000000", - "08020000050000009a9648000000000033000000000000000c020000050000009a9648000000000033000000000000002202000005000000L8;FF1f1900f1420d0054017c0353610d00343f040071000200543f08007181030054890245f83f0500b1810000549f6605a99f7e06a99f02073881420191e00", - "3082aBL8;FFaad355382901084aabb31538abe35538a9c31538a9f355384a01084a6b01084aaad31538aa0356382901084aabe31538ab135638a9f31538a92356384a01084aL8;FFe10313aa2200805255720094e18349f9810000b4e08749f92200805250720094e18f49f9810000b4e09349f922008052", - "4b720094e80740910881099100210491BBBL4;FF41550054b88358f81f0700b1a0110054a14301d1a26301d1bf031bb82a9dff97a01600b5b9035bb81f0700f10b010054a80359f8fc0300aae10318aa22008052L4;ZBL8;FF0a01008be90b40b94b0140b92909c05a6b09c05a3f010b6b89feff54099000", - "913f0102ebe90300aae2000054499000d10b01098b610140ad6c2140b94c2100b9BL8;FF02028052a302009063e81691c4018052da000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f93d280094e10300aae15306f9e0833291a1020090L8;FF022880525e320094e0431f91e1431591022", - "880525a32009448058052e90000b029ad0691e8b302f9c80080d20800f0f2fa8b04f908390091e9af02f9e8ab02f9BBBBBL4;FF41835cf8e00316aae20315aa6a0202948000003548835d38ff02086b60020054e1e7076f880700d1e90740f91c011cea81fdff54208d212e00a8302e0800261eL4;FFb667", - "7ea9b7835df8e6ffff17f95f03a9d9a20091fb5b02a937835ef8d70df8b7f70200b435035ef849020094e00317aa2100805247020094f60300aa20008052L8;FF950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f9220080524d020194f8ffff17340100b48806148", - "be00313aa01f17dd3BL8;FF210300b021003091030300f063902991a92300d1260300b0c6002f912a018052070300f0e7142f91e00308aae201805284008052e9af00a9ea0300f98e820194L8;FFfd030091140040f9f30300aa9f0600b1e0020054611a40f93f0400b140010054810000b4601e40f92200", - "80524c820094612640f9810000b4602a40f922008052BBBL4;FFe80315aae00314aae303132a420100540d0000141f21003929008092090100f9c0035fd6e80315aae00314aae303132aab000054c3000836096041b93f110071L4;FB1100000000000000140000000000000014000000000000003073490", - "00000000041734900000000005573490000000000f8754900000000000a76490000000000L8;FF57c20094f4031faa2bf9ff17e0c3159150beff97e0c3139163bfff97f7031f2a04feff17eb831d91e133c23de237c23d6091c83ceaef43f9f80316aae10b19adBL8;FFf50b40f9fd7bc3a8c0035fd6f503", - "00aae00313aa2200805252020094610a40f9e00315aaccffff17f50300aae00313aa220080524b020094610a40f9e00315aaL8;FFe1031baa5e42009418000014e8ef41f9080f00b4e9f341f9e80302f9e8830591ea0310912b0000f06b1117911a0380d20001009000f4229108210091e1430691BBBBL4;", - "FF61d60054f9ffff1779e20194f70300aa1f0400b141fdff54e04305918100805274e2019440d50035e85341b9e8bf00b957ffdfc8d70200b4ff0600b100030054L4;FB97ea4800000000004e00000000000000570700000500000097ea4800000000004e00000000000000580700000500000042ea48000", - "00000005400000000000000L8;FFe8432d91e9bb01f940918b3c41818c3c05150094e8432d91f7ab45f90081c03ce8b745f9ff0600b1a0039d3ca8031ef8e00e0054e8e33b910183009102708052BL8;FFf30300aa3f0400f18b000054600640f92200805252620194610e40f914008092740200f93f0400", - "f18b000054601240f9220080524a620194611a40f9740e00f9L8;FFe10308aa220080523e060094e10340a92aa040a9290040f91f1040f15369283808050091280800f943feff540b7c07533f0108eb6b611932000100544b692838BBBL4;FF540000144801805229008052e103019108000039e00316aae", - "92b00f9618eff97f82b40f9f92340f9280318cbdf0208ebe80b0054160100b4e82740f9e10317aaL4;FF242b009143c30291020c40b9077864f865787978e0804039a56c1c53a51000511f1040f2a37c4093c1020054e01040f91fcc74f26002005400cc7492064000d1L8;FF080040f9e00301aa090140f", - "93f0500b1e0010054ff8300d1fd7b01a9fd430091810100f021cc1491a40100d084402191e323009182008052e80700f98aa20094BL8;FF0a0440f9000500ad4801018b0b2000a93f7d00a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6e10200b43f0002ebe80300540a2440a9f40300aa00600091B", - "L4;FF2841889a1f2d00f1a2010054680240f9a80000b4600640f901e97bd3020180524f220094e00313aa0109805202018052f44f41a9fd7bc2a84922001421010054L3;ZBBBBBBBBBL4;FF2af17dd3490109cbe932899a1f0549eb290a00542a050091e0830091010880525f0108eb0295899a1c020094f", - "95342a9e11b40f9f90900b4780240f9e15700a9L4;FFf52b41a9f62741291f0900b181010054d78209aa5f1100f161010054b60240b9b70000b4e00315aae10317aa220080524b1c0094280080921c000014eb3342a9L8;FF61058052661c0194ffc300d1fd7b01a9f44f02a9fd430091a00200371340009", - "1f40300aa0140009100008092b81c01941f0400f1e10200547ffedfc8810640f9BBL4;FF8e9c019400e4006ffa430391e1e3129140430091027b8052ff8b08b9a0f2803d579c019408028052ff130df8e8430339ff6f00f9930200b4459c0194e00313aaL4;FF632a40f922008052f30b40f9f00303aafd7", - "bc2a800021fd61b000094ebffff17f30b40f9fd7bc2a8c0035fd6c0035fd6fd7bbea9fd030091f30b00f940000094L8;FFffc300d1fd7b02a9fd830091091c0072e0330039200100543f050071a10100540a008092090900b90a0100f9fd7b42a9ffc30091c0035fd6090080921f0900b9BBBL4;FF092700", - "39082b0039e8a75929092f003908330039e8a7582909370039083b0039e8a75729093f003908430039e8a7562909470039084b0039e8a75529094f0039L4;FB53797374656d54696d654572726f72005b3d4519636b5385357d08270063454c1e6a715c903e89072e0000000000000000000000000000000", - "800000000000000L8;FFe87f00f908008092e87700f9e8030eaaee0311aaf10312aa12018052f27300f97a0e001408008092f5f316a9f57b40f9e87700f9ed074ba9e48f00f9e4ab40a9BL8;FFe50314aa06048052e05f873de163873db35c0194480340391f050071e0420154f91700f94a5c0194007880", - "5221008052485c0194407801b4e807409102788052L8;FF40000094610a40f9e00315aa92ffff17e00313aa220080523a000094610a40f9a1ffff17e00313aae10317aae20315aa34000094770a40f9680240f9080117cbBBBBL4;FFfd430091ffc312d1ff0300f909604039c91a0037155840a9f30300aa", - "f90308aae8c30091e00316aa28fc0194610a40f9c9624039f40301aa288c41f8e92f00b9L4;ZFL8;FFe0830091220280526400805287f1ff97e11340f93dffff17ff8302d1fd7b05a9f93300f9f85f07a9f65708a9f44f09a9fd430191081c00121f090071a1010054BL8;FFfd7b42a9ffc30091c0035fd6", - "092000912103009021683f91a9831ff8040300d084601291a32300d1e00308aa420380528d7c0194fd7b42a9ffc30091c0035fd6L8;FF400e0054e11740f9e80f40f91f0101eb20280054e81340f92a0400918022029149018052ea1700f90969213834d7ff97e1630091977cff97808240f9800100b4BBB", - "L4;FFab000054e00318aae10317aa2200805253bc01949f0600f12b010054e00315aae10314aa220080524dbc0194040000143f0800b1c1010054f90316aae00319aaL4;FB0800000000000000641148000000000080f3470000000000100000000000000008000000000000003c1248000000000080f347", - "00000000001800000000000000L8;FF08010e8b090700b43f0900f12e318a9a3f0500f1a01c00540c0140799ffd0771cdfeff549f010b6b8d0100549f010d6b60feff541300001488050051f5031f2aBL8;FFe90309abc2030054280108ab42040054091440f9090300b40a1040f9ec031faaeb0309aa4a4", - "100914d8541f8ae0140b2ad010c8bce11c0dace1540d2ce0d0e8bL8;FF69b642b968be02b9c903003660a24ca9693a40f961ba42b962be42b923a10291081540f900013fd6606601f9616a01f987ffff17776a41f900c3c73c01c3c83cBBBBBL4;FF68f8ff97e10314aa280c49f81f0500b180000054c000", - "8052e20313aa65fdff97882e40f9680100b4090d8052812a40f9157d099be0008052e20313aa36a00191L4;FF680200f9f44f45a9f65744a9f85f43a9fd7b42a9ff830191c0035fd6940100b44b0c0094e00314aa2100805237008052480c0094e0fbffb4e10315aae20314aaL8;FF200440a9a92300d12a", - "0200904a710391a8831ff86202009042282b91e9ab01a9e36300916b0c0194fd7b45a9ff830191c0035fd66202009042403a91e00308aaBL8;FF280440f9290c40f9340108ab020e00545f0800f180000054281440f9140114ab620d00549400f8b6e0031faae10314aa588c0194f70302aaf60300aaf803", - "01aaL8;FFe87b40f9e93740f9940a00912905009113693638f32f40f93f4100f1f47f00f940830054e93700f915030036284d1c9be2031b2a008540a917ddff97f47f40f9BBBL4;FFfd030291f60301aa280442a9f30300aaf70303aaf40302aae00308aaa3c7ff97c80a40f9680e00b40bfc79d3e1e7076", - "f9a624039ce3640a9ef031faa680d010eL4;FB02e109f114c11fd1cd31c621db11d001e171ea61f751fc4195b19ea183918881b9f1b2e1afd1a4c1ec42e752fa62f172c002cb12d622dd32b4c2bfd2a2e2a9f2L8;FFe0831d91e9e343f9e0938f3ce92300f9e88700f93d1f0094efb343f9ff0900f1e17b0", - "054e16740f9810000b4e00316aa220080524acc00945c7900b4e05f40f9BL8;FFe99741b962c3883ce8e300b9e8cf40f9ead700b9e9bb00b9684308f888240094fa0301aae106f8b6fb031faae0031baae1031aaa574c0194454c0194e0028052L8;FFa9010054200108aba2000054fd7bc1a8c0035fd6e0", - "0308aba3ffff54000100f000400b91514c0094000100f0008012914e4c0094000100d000e032914b4c0094BBBBL4;FF6bdfff97f70f40f9b2ffff17e0230091e10319aae20313aa230080522400805263dfff97f90f40f9f80740f9080319cb7f0208eb69efff54e0230091e10319aaL4;FBf42240000000", - "000020000000000000000800000000000000dc76420000000000496e76616c6964526567697374726174696f6e49644475706c6963617465644dL8;FF2400805207030094610a40f9b9ffff17e00313aae10318aae20316aa2300805224008052ff020094780a40f9680240f9080118cbdf0208eb69f7ff5", - "4e00313aaBL8;FFc006089b28e179d3021109cb5c6c019475ffff17090e8052ea0740f9012b099bb80208cb002b099b09e179d3221108cb4d6c0194f80b00f96bffff17e00200d0L8;FFa0839d3ca8031df8e8a30391e92700f9e495fe97e8630191e0a30391a1c300d1f4630191cbc7fe97e8c30291e263", - "019184020191e0031aaae10319aa03048052BBBL4;FFa203df3ca303dc3cf4830191c9058052e0830191e00706ada0077cade23b803da203d73ca1c302d1e2030091030c8052e32f803de08703ada1037dade21b803dL4;FF090480520900ac7248030836aa26407848031036ab264078480318371a00001", - "4760a40f9680240f9370c009135104078080116cb1f0115eb63050054d5000034L8;FF4100805253ac0094001d00b4f30300aa4fac009440008052410080524dac0094401c00b4f50300aa49ac0094400080524100805247ac0094801b00b4f70300aaBL8;FF4243803d08b140f9a80300b4e8ffff9008d1", - "2d9149ffffd029213b91bb2336a9a84303d1a82737a928008052890200f029410591aa8302d1a04700d1a8273ba9L8;FF1f0500f121010054881f00121f0500718c030054c80900359b1f4092fa0f41b2e8031baa540000147f8702f1627e00547b0300b4f70315aaf50314aaf40316aaBBBBBBL4;FF2400", - "80526a070094e80640f99f0208eb9532889ad5f8ffb5608640a9e82300915e140294e80740f91f0500f101020054c80080d20800f0f208110091e81300f9L4;FF1400001408018052f6af4bf9f7b34bf9e9830a91e8830a3928008052e0230891e143139142008052e96b02f9e86f02f9f67302f9f77702f", - "9480c0094b70000b4L8;FF1fc103714a1500124a19092a0911001262f9ff544831092a54000014e9031faaea031faa0b00038b0f00028b4c008052ed03009107000014aa7929f829050091BBL4;FFc1010054881e00121f050071cc0700548afe48d30c0180d2891e4092eb0f41b20c00f0f21f010071680", - "18c9a39018a9a29019f9a99000014e0031aaaf9d300a9L4;ZBL8;FFf30b40f9fd7bc2a8c0035fd6fd7bbca9f85f01a9f65702a9f44f03a9fd030091140040f9f30300aa9f0600b140020054610e40f93f0400b140010054810000b4BBBL4;FFe81b40f98a0740f9490108eb834100548a0340f9e01740f94", - "801088b882700a908fc60d3481600b5080840921f1900f142170054017c0353a11a00343f040071L4;FB73656c662e63757272656e745f65706f6368202b203100009820490000000000490000000000000069010000090000005369676e616c20505120526174636865L8;FFeaa704a9e80b00f929a052a", - "9e84300f92aa053a9e8a706a929a054a9e9ab03a929a855a9e81b00f9e97b00f929a056a9e9d300f9ea230ca929a857a9e9ef00f9BL8;FF00c30391db170094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eba816005439000014f9031faafbab49f9fa074091L", - "8;FFe8af05f9e8c32291a04700d1e9b705f92901009029013091e8b305f928008052e1833291e96f06f9e95706f92901009029ed0c91eaa705f9ea032d91e86b06f9BBBBL4;FFc0035fd61f09007181010054ea0f40f9090180d20900f0f248dd7892290140b20a000014ea474039090180d2e8031faa090", - "0f0f205000014090180d2e8031faaL4;FB7420726563656976657220636861696e207769746820696e76616c69642072617463686574206b657957686973706572526174636865746661696c656420746fL8;FFe90300f9e003009146eaff97f44f47a9f65746a9f85f45a9fa6744a9fd7b43a9ff030291c", - "0035fd6370080521800809219018052a80640f91f0116eb090f0054BL8;FF95740114ff8300d1fd7b01a9fd430091e80301aae00700f9010300f021801a91040300f084001a91e3230091e00308aae20180528c740194fd7b41a9ff830091L8;FFe1431691ea110094e0df92b980010034e1d342f9e8cb42", - "f91f0101eba0c60054e8cf42f9090180522a04009109692138e1431691ead302f9dd110094e06349f9BBBL4;FFc082c03c600601ade28344ad620200adf44f5aa9fcb340f9f65759a9f85f58a9fa6757a9fd7b55a9ffc30691c0035fd6800300d0006c1f91830300b063401e91L4;ZDL8;FFff03039156b4", - "0014b9035ff8090080921f230039090300f9880219ebe833889a3f0314eb2a33949ab4835ff8ff0214ebe00314aae1038a9af303889a99b2ff97BL8;FF5f34019400630091e1c3279102288052fb9b05f95a340194e88b4cb949008052f9a305f9f5a705f91f010071f3ab05f92801881ae99f40b91f0109", - "6b41050054L8;FFa4f4ff9700080036c1eeffb4d9010014401a00b5a02302d19ef4ff97c010003601eeffb4d5000014402200b5a02302d198f4ff974010003641edffb415010014BBBBBL4;FF69adcb9329bdc8ca08010a8b2981c8ca200108cafd7b45a9f33340f9ffc30191c0035fd6ff8301d1fd7b05a", - "9fd430191a8ae8cd2294c8ed2aaed8dd2680eaef2L4;FF6aad8c522aefac72090140b9080940793f010a6ba9cc8d520001497a414b0054810a41a9e0e30691996a42a99cf7ff97e1df40f93f0400b1604a0054f63f5ca9L8;FF600640f92200805255040194751a40f9bf0600b1e0010054748643a9e0031", - "4aac2020094d50000b4a8e279d3e00314aa02018052011115cb49040194612640f9BL8;FF08200091200440a9e92300910a0000d04af11991e8a700a9020300f042dc3891ea0f00f9e34300916a840194fd7b43a9ff030191c0035fd608200091200440a9L8;FF49258a9a1c0940f93f0118eb809349fa82", - "feff54f552199b687a77781b05c05a9c0200b4a80640f909091c8b2ac15f781f030a6bea979f1a4a219f5a4a1d0072BBBL4;FF15008092e80b02f9e8e30f91e0ff01f9e10302f9f51302f9ff0702f9ff0f02f9a8831df8a11700b4960080d2e20301aa1b210091f72310911600f0f2fce30f91L4;FB6d757", - "374206861766520612063757272656e74207374617465000000000000003b634900000000003800000000000000470100000a0000007375636365737366L8;FF610000b42200805255c40094ba0000b4e05b40f9e1031aaa2200805250c40094f7031f2adf0600b1416aff54f57740f957df78b3795601a9", - "08008092770600f9BL8;FF1affff17c80080d2e00b00f90800f0f2080900d10bffff17e90b41b2e9a300a910ffff17c80080d20800f0f2080500d104ffff17c80080d20800f0f208090091L8;FF2083cc3c2183cd3ce81f00f9e81b40f92283c33ce0e3009160838c3c2083ce3cc1e2009161838d3c2183c", - "f3cfc030b9160838e3c2083c83c61838f3c2183c93cBBBBL4;FF00030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb431501541803008bf9feffb50f0000141f0400b1a1140154L4;FB74a5430000000000e8ee48000000000000000000000000007370717", - "23a3a76313a3a6368756e6b65643a3a73746174657373686f756c642062652061626c6520L8;FFfc0b00f9f85f02a9f65703a9f44f04a9fd030091ff830bd1f30308aae8030691f6030691fefbff97f4c340f9e827029100f1cf3ce8cf40f99f0a00b1e05b803dBL8;FF63142f910f000014a0831cf8e102", - "009021bc2e91e3020090630c2491a0e300d1c20280526401805209000014e102009021bc2e91e302009063742a91a0831cf8L8;FFc01240f92200805255640094e9ffff17681a40f9280100b4090d8052e00314aa017d099b02018052f44f42a9f65741a9fd7bc3a84a640014f44f42a9f65741a9BBBL4;F", - "Fe217803d3a030191a82735a9e10304ad59eeff9700e4006fa0833aada0833bada003d53ca103d63ca203d73ca303d83ce323803de21f803de11b803de017803dL4;FF02008052e80500948102109100ff4cd3201400f936cc01f925000014152440f9000700d1bf0200eae0179f1a1f000014e10318aae0", - "0315aa6200805208060094L8;FFa101009021f41491a32300d142008052e40314aaa8831ff89ea4009468c20091a101009021fc1491a32300d162008052e40314aaa8831ff896a4009496a40094BL8;FF8876403969764039aa02000ad6020a0a1f01096be0179f1a6b240194887a4039697a4039f503002", - "a1f01096be0179f1a65240194887e4039697e4039b302000aL8;FFc18e5ff8810000b4200340f922008052532400948002c03d880a40f9c002803dc80a00f9f30200b4e00315aae10313aa22008052f44f44a9f65743a9f85f42a9BBBBBBBL4;FF017d099b02018052f44f42a9f65741a9fd7bc3a8521802", - "14f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd03009113d440a9f40300aaL4;FFfd7b49a9ffc30391c0035fd6680316cbb5035ef89f0308ebc8030054e80b40f90001168be10318aae2031caa54180094c8021c8be81f00f9b50000b4e00318aaL8;FFfd43009115a040a90901", - "15ebe3030054f30302aaf40300aa5f0009eb09010054e00314aaf50301aae10313aa220080522df7ff97e10315aa95a240a9160115ebBBL4;FF60ffff97e00742adf41f40f9e203c63c9f0600b1e00700ade20b803d4002005460420191a1e200910224805254980194e00740ade20bc03d09018052740e0", - "0f9L4;ZFL8;FFe10300ada8f31838a0073ead87980094a9035538480d8052aa135538ab235538e00740ad2901084a4a01084ae0c30291a9031538a93355386b01084aaa131538BBBL4;FFe8a706a9c803009008892091e8ab08a96a06805248048052ffa703a9c903009029c92191e9ab05a9290080d2c92", - "cc0f2e8ff04a9e8a707a955d80194e10340f9L4;FB76312e73656e645f63742e726563762065706f636820c0022d3ec01b3a2043743253616d706c6564202d3e204b65797353616d706c6564002f636172676f2d67L8;FF69008052ec030baae03740f9e0f3803df90304aae97300f9ed030aaaeb031eaae", - "3e700f9e30311aafe030caaf04300f9f0031baafb0308aaf2ab00f9f80316aaBL8;FFe1431691ead302f901120094d6000034e17f52b9e28352b9e343169180008052d61400943f0700b1a0100054e1d342f9e8cb42f91f0101eb60c10054eb074091L8;FF0005803de033c33d0009803de9cf05f9a88357", - "f8080540f9882600b4a02302d152f5ff97f50301aa804d0037a8fe60d3c82300b5a00a40921f1800f102240054BBBBL4;FF000400d000e018916cf80194ff8302d1fd7b06a9f85f07a9f65708a9f44f09a9fd83019109904039f30300aaf40308aaa90100343f0d0071c1070054602241a9L4;FB6e697a65", - "64206d6573736167652076657273696f6e203cc0013e0010626164206b6579206c656e677468203cc0153e20666f72206b6579207769746820747970L8;FF081100918082883ca003db3c8182893c80828a3ca1837aad880200f989820bf88182843c8082853ca1837bad8182863c8082873ca18378ad818", - "2803c8082813cBL8;FFa02301d1ad790094f80301aae0f2073659000014f8031faa57000014680b0091b8831cf805000014e80b41b2a0831cf802000014680f0091a00301d1a8031cf8L8;FF54780094007901b4690100b029f52b91280f8052200540ad08800039c80ec0dafc0300aa01048052081002f8", - "e8074091e20314aa000400ad600100b000802c91BBBL4;FF490080d2080080920900f0f2682600a9e85740f9c80100b41f0500b1800700541f2500b1a207005409f17dd3ea5340f902018052293d009129f17d920801098bL4;ZBL8;FF4d018052eb031faae9031faaea031faa8c318d9a4d040091ae696a", - "384a0500915f010cebcf194092ce1d0013ef21cb9ae90109aa420c00546b1d0091eefeff37BL8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a250191L8;FFea0316aa18fd60d3e86300f9f6f", - "e60d355ff48d3ae000014fb4740f9f86340f9ea0317aa57000014e8874ab9eb032a91ec832491691140b8ea5f45f9fa4b40f9BBBBBL4;FF890640f92a0108eb431d0054890240f9e00316aae30317aae403152a2801088be90b40f9882a00a9680040f9080540f9150109ebe2020054e80f41b2e80700f9L", - "4;FFf6df00a9f60f00f93ae9ff97ea2341a9eb058052e90740f9160500914b692838290116cbf60f00f99f0209eb68020054d40000b4e80b40f9e10315aae20314aaL8;FFe8030091e00309aa62018052a0080194730240f961020090212010916402009084a00f91e003009163620091620180529808019", - "46102009021e0109164020090BL8;FF37000014e08744a91f090071a1010054ea6340f9291d009148dd78920b000014e08744a908008092686a00a90c000014eae74239e8031faa2919009103000014L8;FFf63340f973060091b5620091df0213eba1f8ff54e00314aae10318aa420080524f880094f8eb", - "44a9f40319aaf90316aad3fa7fd346880094e00313aa41008052BBBL4;FFfd7bc3a8c0035fd629008052097c00a9f44f42a9f65741a9fd7bc3a8c0035fd61fcc00a91f0000f9f44f42a9f65741a9fd7bc3a8c0035fd6d3d200a929008052L4;FB08000000000000000800000000000000700c46000000000", - "054727946726f6d536c6963654572726f7200000000000000d5184900000000006a00000000000000L8;FFe9a35f3968114df8e00b18ade213c23df0435f39e9af00b9e00bc23de31fc23de18b14ade11bc23de203c23dea7202f8edbf43f9f9c343f9e9030caae48715adBL8;FF74d643a9750300b496c2", - "009104000014b50600f1d6a20191c0020054c1025df8810000b4c0825df8220080524c480194c1825ef8810000b4c0025ff822008052L8;FF4b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aa", - "bBBBBL4;FFfa0301aaf70300aaf60308aabb0302d169001c6be37f00b9e51b08a9fc9700b942090054f8d640a9e2031aaae00318aae10315aad50200941f0400f181020054L4;FB3000000000000000080000000000000030944000000000000000000000000000080000000000000008000000000000008", - "04c4200000000000000000000000000L8;FFf44f42a9fc5741a9fd7bc3a8c0035fd620008052e10314aa5ee80094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4314d1ff0300f9BL8;FF6f680194fd7bbda9f65701a9f44f02a9fd030091f303032af40302aaf50301aaf60300", - "aa4a680194000480520101805248680194600100b4165400a901030090L8;FFe90280521a00f0f2e98316a90000803d08f000f8e9bf00f9e81f40b9e8030639e10740f961cdffb4e01740f91a000014e9031091aaffffd04ab13991400100b0BBBL4;FF22008052f44f59a9f65758a9f85f57a9fa6756a9f", - "c6f55a9fd7b54a9ff8306914fa80114f44f59a9f65758a9f85f57a9fa6756a9fc6f55a9fd7b54a9ff830691L4;FF330000d0340000d03ef8ff9773b640f994ba40f97f0214eb82000054608640f800003fd6fcffff17f35341a9fd7bc2a8c0035fd6fd7bbda9fd030091f55b02a9L8;FFe28f43ade413c03", - "de347803de48706ade08b07ad42030054e90340f928fc83523f0108eba228005400e4006fe8430391e00301ade00302ade00bc03de10fc03dBL8;FF14010291e1031f2ae0071eade08754ade2fb803df9f741f9faf341f9e0071cade08b55adf67f4e39e00b1dade18352add51a40d20001168b08108052e", - "20315aaL8;FFe2031baaf70315aaf50314aaf40316aa15ebff97b9db7da90bfcff17f6e742f9fb074bf9f90b4bf9fc0f4bf9f8134bf9f5174bf9c80240f9f7e342f9680000b4BBBBBBL4;FF9c000014e00313aaac110194e80300aae00301aaa8fc073656000014611f0054e0031faadcfeff17811f00549", - "72240f9881a40f9ff0208ebc0020054881e40f9L4;FF88c2ff97e08300b9a04700d185c2ff97e07f00b9a04700d182c2ff97e07b00b9a04700d17fc2ff97e07700b9a04700d17cc2ff97e07300b9a04700d179c2ff97L8;FFf44f45a9fd7b44a9ff830191c0035fd6690240393fed0171c10000546996403", - "93ff501716100005473060091a3ffff17130500a91f410039f44f45a9fd7b44a9BBL4;FF810000b4e00b40f92200805254900194ff074091ff030c91f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8c0035fd6e023009101048052e20317aa23008052L4;ZDL8;FFa8031ff8620100f042a00f91e92b01", - "a9e34300916f900094fd7b44a9ff430191c0035fd608200091200440a9a94300d1eaffffb04a213791620100f042100e91BBBL4;FF53d00194e00319aa210080523600805250d00194c0fdffb4e1031aaae20319aae02b00f956d00194e93f40f9f92f00f928014039e80900362011c03c2111c13cL4;FBd", - "2aaa9eaaf82d9cc0b66a28c926eed22000052a40c87415afd8c210dbdee0afa8b2e98bb0f14d86a9b2209ee06fade90efd5fa320668af820d0e7026764ed9ccL8;FFebab01a9e91700f90a2551a9e9ab04a90a2d52a9ea0b00f90a2553a9ea4300f9e92300f90a2554a9eaaf06a9e91f00f90a2555a9ea1b", - "00f9e97b00f90a2556a9BL8;FFf65704a9f44f05a9fd030091ff8308d1f30300aae0a30391fb0305aafc0304aaf90303aafa0302aaf80301aaf7a30391e52b00f983f2ff97e87740f91f0500b1L8;FFfd7bc6a8c0035fd6404fc03da80359f84003803de8f304f9e89740f91f0500b121f7ff54baffff17e", - "89348b9208757adf7e342f9a00302d1e1031faaa80315b8BBBBL4;FF600706ad600749ad623b803d6247c03d030c8052632f803d9a030191608703ad61034aad621b803da87f34a9618304ad513a009400e4006f608307ad608308adL4;FB5f6b657973000000ea984800000000002e000000000000006b0", - "100003100000063616e20616c7761797320617070656e6420746f206120566563000000000000L8;FFe0030091020280524400805287e5ff97e00340f968ffff17c80080d20800f0f2080900915affff17c90080d2e8230039480080520900f0f2e8270039e90300f9BL8;FFa20c00544b0140b26b11c0da", - "6b1540d26b0d0b8b6b2501916bfd46d34a010b8b4a0500915f010bebc90b00542801088b480108aba30100544b000014e8031faaL8;FF080d088b0825019109fd46d30800098b080500911f0109eb2816005426000014fa031faaf69f49f9f407409194820991df0600b180220054806203911a290094BBB", - "L4;FFe93b40f9e82740f9e92310a9e81340f9e88b00f9e82b40f9bb8312f81f0500b180020054a06303d13c99ff97e01f40f9e10f40f9a84301d1c08a0094a8035b38L4;ZBL8;FFb88319f8a1150054a90100f029012f9128048052f50b00f9f50317aa0a0fc0daa9a33ba9a86300d109018052fb5f44a9a", - "8a73ca908088052a08301d1a12301d1BL8;FF5f300194e8fb42f91f0500b161ebff54e99f40f9f30200f068b240f93f0500b1c0010054fa4340f9a81000b4e883329160630291a058ff97e85346f91f0500b1L8;FF60aa49a9768202b9689602b9e10b48a92001803d481540f900013fd6606601f9616a01", - "f945f3ff172013c03de85342b92123c03d205b803de87303b90143813cBBBBBL4;FF165e7ea915e23da919e23ea93f0400b11b821fb8c0050054610000b4220080524f000294560500b4e00317aae10316aa220080524a0002942500001437008052L4;FFfd7b42a9ff030191c0035fd6e00741a96000009", - "4fd7bbda9f50b00f9f44f02a9fd030091a87cc39bf30300aae9031faa0a018052ff0308eb28008052a1030054L8;FF65000194400200f0004017915a000194600200d000400f9157000194600200d000a00f9151000194400200f000203e9151000194400200f000803e914b000194BL8;FF08410051081d", - "7d92226968f8290300f029a11291286968f8e10308aa8e800114080040f9290300f029410e91e00301aa08014039227968f8290300f029010f91L8;FFa480ff97b7010034e11740f9e80f40f91f0101ebe09a0054e81340f9090380522a040091e00317aaea1700f909692138e16300919780ff97ba00003", - "4818a4329BBBL4;FF4a050091090100f9490380520a2502a9f44f45a9f71b40f9f65744a9fd7b42a9ff830191c0035fd6890300f0290110918a02805207000014a9030090291d3691L4;FB7272656e74000000d3784900000000003800000000000000e40100001a00000064656372797074696f6e206661", - "696c656450726576696f7573436861696e4b65L8;FFfc6f41a9fd7bc6a8c0035fd68862069197e25fa9806ec03d0101c03d950641f988e240f989d640f99c0a41f96083813ce12b803de86700f9e95b00f93502f8b6BL8;FF680240f9080116cbbf0208ebc8080054680640f9e10314aae20315aa0001168", - "b57400194c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6L8;FF0a088052f4031faaf5ff03a92911c0da490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f60300aaBBBBL4;FF99008052e00318aae10319aae2031f2ae", - "0023fd61f0000f1cd000054390300eb839500541803008bf9feffb50f0000141f0400b1e19400546ce001941f100031L4;FB6b65792074797065206964656e7469666965720e626164206b65792074797065203cc3200080690400013e00696e76616c6964206b65792061677265656d656eL8;FFf5433c9", - "1fc233391f80302aaf30300aa880900d19f0500f10881899a090200d029811f918a0000102b7968784a090b8b40011fd62b0042a9291c40f9080340f9BL8;FFf40302aaf303012af50300aa5060019400058052010180524e600194400100b4155000a9e10200f021600591132000b91f900039f44f42a9f", - "50b40f9fd7bc3a8L8;FF0800f0f2080900d11a000014e80b41b2e00b00f907000014e80b41b2a0831df814000014c80080d20800f0f2080500d1e80700f9e02300913a56ff97e10300aaBBBL4;FFfc031aaa732a00b468ea7bd3e00640f9fa031faa028100d1081840b91f01186ba0250054428000d10080", - "00915a0700915f8000b121ffff54460100142003c03dL4;FF3f1c00f169020054fd7bbea9e30301aae10302aafd030091f30b00f9f30300aae00303aa0d000094e10300aac00000b400008052610200f9f30b40f9fd7bc2a8L8;FF080040f9a90100d029813d91e00301aa08014039227968f8a90100d029", - "e13d91287968f8e10308aa8ba00014ffc300d1fd7b01a9f31300f9fd430091130040f9BL8;FF800200b000e014915b200194e00314aa5ffdff97895a40a9ca02178b280117eb6a0200f9e2eeff54cdffff17800200b000c0139150200194800200b000c01391BL4;FFeb0080521e0000149f014871830700", - "544d1dc039ae1d00128c550e0b8c0148518d00f83761710c8b0b018052140000148d7d1c53ad0600340d00be528d010d0bL3;ZB" + "BBBBBBBBBL8;FB7320696e76616c696420726567697374726174696f6e20494420c0001f756e6b6e6f776e207365727665722063657274696669636174652049443a20c0001b73L8;FF03c100918dfbff97a0077fadb4c35db8e00701adcba400940004805221008052c4a40094c00300b4e00741ade8031", + "faa0904805201048052740a00b9690201a9BL8;FF7ffeff17610640f9810000b4600a40f922008052c8240194611240f9810000b4601640f922008052c324019460020191f30b40f9fd7bc2a871feff17610640f9L8;FF220080522300805224008052f4030b2abf0000946aa240a9e00740f9690240f9e1", + "0313aa54692838080500911f0048f1680a00f9a3fdff540b7c0e533f0108ebBBL8;FF21008052cb640194600400b4000740adfc0300aa381f0012000400ade00315aacc600094080480528002c03d09008092687203a9687e04a908018052687e05a9L8;FFe00700f981fdffb021003991a3fdfff0637422", + "91e02300910201805264008052ba6aff97e10740f9b1ffff17e80f41b2abffff17e80f41b2b9ffff17a0031df8BL8;FFe1031faa882600f9d3ffff17e10c0054e0031faa93ffff1721050054e0031faa86ffff17c80080d2e00700f90800f0f2080900d177ffff17e90b41b2e92300a9L8;ZDBBBL8;FBb4e", + "a450000000000e88240000000000000000000000000006d697373696e672073656e64657220636861696e000000009f1b4000000000003400000000000000L8;FFe263009120008052e10316aa70a6ff97e10316aa288c43f81f0500b1e0fcff54e26300914000805269a6ff97e3ffff17e0630091220080", + "522300805224008052BL8;FFe08715ad000941ad08088052e8bf0a39e08b16ad600640ade08711ade2834bade28312ad350700b49912158bfac308911b1080520a0000144003188be10315aaL8;FF680218eb1f0119eb1631999a7f0218ebf7979f1a290200548102188be003152ae20316aad4170094600", + "100b4c000f8b6d90d0094080040b91f110071e0feff54BBL8;FF2925019129fd46d3290500916a8640f98a0100b512000014e80316ab83fdff5440ffffb000803c9174400194e9031faa27000014e9031faa6a8640f90a0100b4L8;FFe0031faaf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd", + "6e0230091f7a300a93c43ff97e0230091f7a700a93943ff97e00313aae1031faae20314aaL16;FFf17b44f9e8cb00f9e80744f9fb8344f9f08744f9e8eb00f9e80f44f9e8a700f9e81344f9eb2311a9eb1744f9e81f44f9e8af13a9e82744f9eb2344f9e81700f9BBBBL8;FBe802000005000000a1104000", + "000000004d000000000000005303000009000000a1104000000000004d000000000000005b03000009000000456b526563656976L8;FFab535838a93318384901084aaa635838a94318386901084aab735838a95318384901084aaa835838a96318386901084aab935838a97318384901084aaaa35838BL8", + ";FF0001158bd3140194a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaf60301aae10315aae20314aacdf8ff97750a40f9e10316aaL8;FFe9ab55290a890039098d0039e9ab54290a91003909950039e9ab53290a990039099d0039e9ab52290aa1003909a50039e9ab5129", + "0aa9003909ad0039e9ab5029BBL8;FFe2031aaa23008052240080523ae0ff97b9035cf8a8035bf8080119cb5f0308eb69deff54a04301d1e10319aae2031aaa23008052240080522fe0ff97b9035cf8L8;FFe863163988fdfff008012f91e8d302f9e80180522083c13ce8f304f94003803d28ffff17e943", + "41f9295541b9e91700b9081140f9fb2740f91f0900f1c9040054L16;FFc082813ce8bf05f9e0dbc23de2dfc23d610200ad620a803d95ddff97b1feff17ff632d39e8b745f9c082c03ca8031ef8680e00f908008092a0039d3c6082803cBBBL8;FF610a40f970feff17e00313aae10317aae20315aa230080", + "522400805236000094770a40f9680240f9080117cbbf0208eb49ceff54e00313aae10317aae20315aaL8;FFe1431691c01000941f0700b14086ff548122029110010014e8031faa000119ab426e0054e14316918c0d0094f90b40f9df0a00b100040054e1d342f9e8cb42f9BL8;FFb40000b4600640f9e10", + "314aa22008052c9f40094610e40f9810000b4601240f922008052c4f40094743640f99f0600b1e0020054735647a9950100b476220091L8;FF200d005463cc749266fc44d3c60400d1dfc024eb220c0054000080d21f000039007d20d482c05fb85f1000f188000054000080d21f000039007d20d486b05f", + "38BBL8;FF0805009114000014280080525f0700b1ffcb02f9e8cf02f9ffd302f980100054e0431691e1031faa22008052cf180094e8d342f9e0cf42f94901805209682838L8;FF00401891e8eb01f9e1032a91e8f301f968fdff9008a11e91e3430f9142008052e9ef01f9e9f701f9e8fb01f97ceaff97f5", + "5340f97fc21239681242f9600e42f9L16;FF4283c43c4083c33ce107813da103933c4183c63ce00b01ad4083c73c4283c53ce18302ade213803d29010014e08302918122009102428052c6b40094f8d750a9BBBBBL8;FB646f75626c655f72617463686574736b697070696e6720636f7272757074207265", + "63656976657220636861696e207769746820696e76616c6964207261746368L8;FF22008052cc9c0094a16e40f9810000b4a07240f922008052c79c0094a17a40f9810000b4a07e40f922008052c29c0094a18640f9810000b4a08a40f922008052BL8;FFbaffff17e00313aa22008052d7000094610a40f", + "9c3ffff17e00313aae10316aae20315aad1000094760a40f9680240f9080116cbbf0208ebe9f8ff54e00313aaL8;FF03000014e97b42f9ea7f42f9e0431391e86b02f9fb6f02f9fa7302f9f57702f9e97b02f9ea7f02f9b0f5ff9708008092e00313aa880200f9fdf4ff97210340f9BBL8;FFf60315aa000", + "500adba0e00b48082c63c8182c73caa8302d1890246f8888248f85f8300f14081823c4181833c800642ad696b00f909048052488104f85733899aL8;FFa22302d126f4ff97a0f5ffb4650100141f0800f1c1240054a80302d1a10302d1a22302d11f7d01a908018052bf5b38a9b67f3aa9bf233ba9bf6b3c", + "a97ef6ff97L16;FF2a040091e00315aa6a0a00f909692138e10313aa42eaff97770a40f9680240f9080117cbbf0208eb480b0054680640f9e10316aae20315aa0001178bc5dc0094BBBL8;FF4a01008be0031faa0a2500a9f44f45a9f65744a9fd7b43a9ff830191c0035fd6e82b00a9e00300913b7b0094", + "e00313aa458b0094e80300aa28f70736e00301aaL8;FF0080019121c03591d27c0094e0ffc33de103c43d80430891e207c43d8162019102328052e07f843de183843de287843dc87c0094e0074091e107409102388052BL8;FFccfc0094000600b4e10315aae20313aaf70300aacffc0094f50317aac1820", + "09100008092d782009192f800941f0400f1200100541200001435008052c1820091L8;FFe9000036f4031faa0700001428008052ff0f00f9ffa300a91000001414f97fd33402f8b7340100b4e00314aaf50301aaf60302aa6b060094600100b4e20316aaBBL8;FF2901084aab631738ab935738a9731738a", + "9a357384a01084a6b01084aaa831738aab357382901084aab931738abc35738a9a31738a9d357384a01084a6b01084aL8;FFc8fe60d355ff48d3f703162af603082a4c000014e8d743b9eb830d91ea0742f9691147b86081c73c6181c83c683104b8e8435039f55340f9e9a303b9e903092aL16;FF401b00", + "54fb0314aa5f0101f1ea2b00f9411e00541f0700b140210054ee6b00f9e84300f9e94b00f9eccb00b9169c00b4fb0316aaebbb00b9c2bc0094e00316aaBBBBL8;FBd9cf6d5766386d5557369c2ccb466c15544552c883e22d97733aa29aace7784aa28cf860264a7dc3363f00003997fac8ef9f75d889218", + "9734e57714ca87d0f9dL8;FFb50640799f0600f161000054f3031faad7000014a87a1f53a9661a53f80316aa5a00805212feff9052823091e8e300b9a8761e53f63b00f9e8db00b9a8721d53BL8;FF66f1ff97f3f742f9e8ef42f97f0208eb61000054e0631791fbaaff9708068052e02fc13de133c13de2", + "37c13de9f342f96826089b0dfcff17e8c31291fb830291L8;FFe10308aae20315aad20c0094e10318aae90314aae80740f93501158bf50f00f9090115cb285041a99f0209eb48060054d40000b46002158be10308aae20314aaBBL8;FFbaef3aa9fb0314aaf4031caafc0340f9ba831bf8bac301d1280316", + "8ba0a300d1e1630191f9a305a948fffff008613e91e83700f908008012e87300b9c6ddff97L8;FFe8000054680640f93f0002710801148ba20100540101003926000014e00313aaf603012ae10314aae20315aae0ebff97e103162a680640f9df0202710801148bL16;FFeb0300aae61f40f9e03740f9f90", + "307aae0f3803df00315aafb031eaafc9300f9fc0305aae7030eaaf46300f9ee0316aaf6030daaea0317aae5030faaef0301aaBBBL8;FFedffff17ff0302d1fd7b02a9fc6f03a9fa6704a9f85f05a9f65706a9f44f07a9fd83009114b840b9f30300aaf80301aac46c01940004805221008052bd6c0194L8;", + "FF61000054e0e30091190bff97080d8052e92340f90827089b29008052097d02a9090180521a7100a91c0700911a7d01a91f2503a91f2100f92003c03d0081843cBL8;FFe00317aae10316aa22008052caec009417010014e1430091e20313aaf70b00f9f73f00f97d050094e08743adf50300aaf4cb00f9", + "e0870aade28344ade2830badL8;FFf70300aa580080d2161440f9e10b05a9001c40f9d60200cbe05b04a9d602028b1b000014e18a45a9e00315aae11600f9e11e00f92100028be11200f9f35341a9BBL8;FFe0431691e1031aaae20318aad7100094fad342f9fc0740919c8301913ffeff17e04316912200", + "8052d0100094e1d342f948feff17e0431691e1031aaae20318aaL8;FF01048052632800942000805201c4805260280094fd7bbea9f44f01a9fd030091f40300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aabf2c0094L16;FFe20314aa2500805206048052fa0300f9e3031caa4da80094a", + "10354f8810000b4e0031caa22008052c3ac0094fc7742f9370d00b4e80b40f9e07b42f9080502d1BBBBBBL8;FB645f63742e726563762065706f636820c0022d3ec01b3a2043743253616d706c6564202d3e204b65797353616d706c6564002f636172676f2d6769742f737061L8;FF2821084a095d10532", + "95b69782001084aebffff17680100d008210091e9430091e00f00b900210091a22300d12100805203fefff063c00a9104fefff084600b91BL8;FF9f6200b91f0900f141180054e00313aaf0fdff97e0080036811400b5e0031faa9effff17680240f9080540f9190101eb031e0054680240f9080540f91f0", + "119ebL8;FF9b6a00a9976601a9961200f98082823cd02000942800805268420039ffc30b91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6fc030591BBL8;FFc808f837e0e315914a120094e87b45b9c8150037e8c742f98a0640f9490108ebe31b00548a0240f9e0c342f94801088", + "b882600a9a8835df8080540f9140100ebL8;FF742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faa5f5c0094e00741a95d5c0094ff8302d1fd7b06a9f73b00f9f65708a9f44f09a9fd83019128008052L16;FF63cc0d91e0030091220280526400805223000014c80080d2e0230039e00300910800", + "f0f2ff270039e80300f928e7ff97e80300aa81fefff021d0149183fefff0BBBL8;FB050006000700080009000a000c000f001200140019001f0024002a0032003f004800540066007f009200aa00cc00ff00240154019901ff014802aa023203ff03L8;FFe802158be81700f9956640f9550300b4e11740f", + "9e80f40f9966240f91f0101eb60390054e81340f9490580522a040091e00315aaea1700f909692138e1630091BL8;FF20008052eaa340a9090817aa680200f96a2601a9f44f45a9f71b40f9f65744a9fd7b42a9ff830191c0035fd6750a00f920008052f44f45a9f71b40f9f65744a9L8;FF1f0109eb2802", + "0054f70300aaf60315aa80021c8be1074091e20317aacd00009428008052f50316aafc031baa0804a07208011bcb1f0540f11731999a7f0348f1BBL8;FF2100805238008052ca400194c0feffb4f50300aa0801805208000039b60000b4a0060091e10317aae20316aac9400194c4400194e00313aa21008", + "052bd400194L8;FF01835ff881ffffb4000340f922008052c9400094f8ffff17ff0600b17582039180050054200740ad69d20391e82342b960620491e12303910227805276f200b9L16;FF698e0ea968e20fa9e8d340f968c616a9e8ef40f968ea17a9e8e340f968da19a9e9235ea9688a1ca9e87f40f902", + "2f805269c21ba968d21da968a207910001803dBBBBL8;FB314400002fe1d3fd806cb7b851af23f1482e7e66d45d1498ba3550678ff94ac5d6ff9008f73a20674d27b73876f7a0175c2933c525a346ffa9fc7e6b06070000L8;FFe00301aae10308aa22058052fd7b44a9ff4301915a8c00140a1000910920", + "0091e8230091200440a9a9031ff8e9ffffd029511d91eaa300a9a84300d1e91700f9BL8;FFe1c31791fbb0ff9754050014c80080d2e1feffd021180d910800f0f2e0031791e3833291e4c31791e2008052e9fb05b9e8fb02f959f5ff97f3f742f9e8ef42f9L8;FFa8273da9bb5f3ea9b4733fa9d5030094b", + "c0000b4e00314aae1031caa22008052c5100094e0031baae10317aa22008052c1100094b90000b4e0031aaae10319aaBBL8;FFaca640a9080680520a038052c852089bf6e300912b008052e0231291c182009129310a9bffff06a9f7231291ebff03a9ff3f00f9f4a304a9eca705a924080094L8;FF3f050", + "0b120060054096840b969070034290140b22911c0da291540d2290d098b2925019129fd46d3290500910a2440f9aa0600b44b0140b26b11c0da6b1540d2L16;FFf22b00f9f8f301f9e9a703f9e9af03f9e8b303f9f7fb15a9f19700f9fbdf00f9ecdb13a9f60307aaee4700f9fceb10a9fc030daae64f00f", + "9e48f00f9f5b700f9BBBL8;FFe003022ae20303aa22f6ff97801d00b4e00700f9a1ffff9021203f91a3ffffb063fc0791e023009102028052c4028052e1000014c90080d248008052e2430039L8;FF6082863cb90000b4e0031aaae10319aa22008052c8700094e12740f9010b00b4e00315aa54000014e8", + "8241f8e082c03ce9c30291caffff904a210891a0fdff90BL8;FFe1031faae8ffff17c00400b5e00313aab2fdff97e80301aae0000036280500b5e1031faae0ffff17e1031faa880600b9ddffff17e1031faa880200b9daffff17L8;FF95520091050080d2e10315aa040080124304805262008052000080d", + "2db020094f30300aa1f0400b140060054000000f000201d91180000f0000c40391f1c0072BBL8;FF1f0101ebc06d0054e8cf42f92a040091c02202914901805209692138ead302f902180094e14316917b0e0094e08f49f9800100b4e1d342f9e8cb42f91f0101ebL8;FF050300141f09007121070054090", + "180d268df78920900f0f23a0140b2691f40921b0109aaa1035df8415f00b5fd020014ba031ef8e8074091e0832691e10318aaL16;FF01048052e20314aae30318aae40315aae50319aae60316aa07088052c3140094c8b000940004805221008052c1b00094200600b4c00640adf80300aa610240f9BBBBB", + "L8;FB7365206b65790000bb124000000000003800000000000000ab0100001e0000006c69627369676e616c5f70726f746f636f6c3a3a73657373696f6e5f6d616e61L8;FFe80313aaf35341a9c3ffff17e0230091e10315aae20314aa2300805224008052f30308aaa2bcff97e80313aaf35741a9c7ffff", + "17e0230091f30301aae10314aaBL8;FF0a3040f9e903098b8afaffb5daffff1700ffff90002029917814019400ffff9000e00e9175140194fd7bbfa9fd030091081840f9080100b4080140b20811c0daL8;FF3f05007101010054e96353393f050071cc160054f8db40f9894e0035ea0f41b27a02001409a", + "340b8eabf4979e0074091eb7742f9ecc3533900401d910d1340f8BBL8;FF68540194ffff0039e8031aaa02fd46d31ce17a921a154092020100b4e83340f9e10319aa0801028be83300f9e8030091000101915b540194e003009121031c8bL8;FFff5f06f9ea6706f9e87306f9e97706f982540094e1fb44f", + "9810000b4e0ff44f922008052c4580094c65800942002805221008052bf580094804000b4880c8052L16;FFe0030b91e1830591022c8052d1d80094e0030b9196e1ff97f50314aa69018052a18e41f8280041d23f0000f10841899a1f2d00f1c2020054880240f9a80000b4BBBL8;FFf44f4fa9f6574ea9f", + "85f4da9fa674ca9fc6f4ba9fd7b4aa9ff030491c0035fd675040051f9230091760800513a008052770240f9e20640f95f0018eb492a0054L8;FFfad342f9e8cb42f908011acb1f0308ebc8be0054e8cf42f9e10319aae20318aa00011a8bcb7800944803188be8d302f9e06749f9f90b40f9800100b4e1d3", + "42f9BL8;FF01f57ed342008052cbf80094686e40f9a80000b4607240f901f57ed342008052c5f80094687a40f9a80000b4607e40f901f57ed342008052bff80094688640f9L8;FF2afd48d3299d00924a9d00924901098bea8300b2297d0a9b08c1498b292840791f0109eb22010054ca7a1d53f7031f2a3", + "801084b5f050071cc0100540a020034BBL8;FFf6eb44f953000014e8074091f69b45f900230091088109913b860094e1074091e0431691026e805221800991c9380194e077c53de17bc53d58008052e8e36b79L8;FF800300543f10007121010054e02c00b5a02302d13ff4ff97e80301aaa0030036482d0", + "0b5e1031faadbffff17a22302d1630c8052a6eeff97e10300aac0faffb4L16;FFe13340f9ed6f40f9e8c303f9eb6740f9e7a340a9e0db813de1df813defc343a9ec2b4ba946000014eb831d91e8b743f9e133c23d6091c83ce237c23df7430d91BBBBL8;FBb2030000330000007a13400000000000570000", + "0000000000c50300004e000000616c726561647920636f6d7075746564206c617a696c79007a13400000000000L8;FF3b008052e11340f9e0031aaae20318aa73070091cf880094e0031aaae10319aae20317aae30315aae4031baacfe7ff97bf0213ebfb0313aa61feff54a8e301d1BL8;FFebdb5079ece", + "20b91e04341f98a0100b90afb0b918b090079eb630191ac0358f8482500a968390c91a98358780c0100f9e8031691e9df067989a3ff97f88345b9L8;FF5f0500f1000b00540b0540396bc100517f250071c80a00544c0180525f0900f1292d0c1b000a00540b0940396bc100517f250071c8090054292d0c", + "1b5f0d00f1BBL8;FFe20318aaf60300aad2480194b3835df8acffff17e90313aaf54f43a9f75b42a9fb0f40b9f96341a9fc0340f9060000143c008052542340f9b4031df874f1ffb5L8;FF600600adff031691f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6ebab59a93f050071e8", + "9741b92083c13cec030b918033803da1090054L16;FFe29349a9e8d30ea9f8030eaae03340f9fbbb4ca9ed5b00f9e8a74ba9f79f00f9f70310aaf00306aaf4030aaae60307aaca008052e7030baaeb0316aafadb4aa9BBBL8;FFe10315aa6d64019420008052810480526164019482fffff042801691e003", + "18aae10317aa6564019482fffff042e01291e0031baa76640194ff4301d1fd7b02a9L8;FF680a00f9186300f139630091c003005436d77fa9e00314aae10313aa8f010094e00315aae10313aa8c010094770a40f9680240f9080117cbbf0208eb68000054BL8;FF160101eba2020054e80f41b2e80300f90", + "7000014c90080d248008052e02300390900f0f2e8270039e90300f9e003009127efff97e10300aae00301aaf44f47a9L8;ZDBBL8;FFe81740f92015c03df87f00f9eaa30ea9e89341f98082823ce8bf00f972ffff1728ffff9008e1069189028052e86301f9e96701f9f2feff172143c23c2007c03dL8;FF", + "e103009122008052e00702ad800640ad290dc0da080dc0da892207a9e00700ad820243ade20303ad810241ade10301ad5d24009400e4006f9ffe0139e0030091L16;FF68139c9a000540ad000400adcda800940009805221008052c6a80094800700b4f90300aac7a800940004805221008052c0a8009460", + "0600b49f020072fa0300aaBBBBBBBL8;FB737320c0000d4b6579207472696d6d65643a20c000c0001243616e6469646174652073657373696f6e20c00e206661696c656420776974682027c007272c2068L8;FF42402c91e10300aa6c9e0094fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9fd030091f", + "f030ed128f840f9f30301aae20700f95f0008ebc109005448008052BL8;FF0a2500a9fd7b43a9ff030191c0035fd63f2900f1880000544b01098b6bf1df388b0cf8374b05c0396c1d00128c6119538c01210b810102516b00f8374b008052L8;FFe00315aae10317aa75b4fe97f80b40f91f0b00b1610500", + "54e87b4039e93b407939008052ea1b40b9ebdf4039fbf341f82841082ae9f342f8f77342f8eb230039BBL8;FFba035df8480317cb7f0208ebc8180054e81f40f9130100b4a8835df8e11b40f9e20313aa0001178bca620194e81f40f9f702138ba0835df85f0317ebc9010054L8;FF290d098b29250191c9", + "1a498b29050091b41640f92801088b140b00b4890240b22911c0da291540d2290d098b29250191891a498b29050091200108ab220a0054BL8;FFf92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd637008052180080921901805206000014e20313aa430c805254e9ff97e10300aa00feffb5a806", + "40f9L8;ZDBBBL8;FBef104000000000004e0000000000000064020000130000005369676e65645072654b65795265636f726453747275637475726569647075626c69635f6b657970L8;FF80220291d7ebff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb28", + "1300546a000014f7031faaf50314aab60e4ff8BL8;FF2a0080d2f40308aaea0bc0f2e9ff02a9e9ab05a981fe0094e00313aae80314aaf44f49a9fd7b48a9ff830291000440ad1f0100390011803c0111813cc0035fd6L8;ZFBBL8;FFe3430091693e0194fd7b43a9ff030191c0035fd6202040a941ffffd0", + "21243191030d40f9c2028052fd7b43a9ff03019160001fd6088000910920009142ffffb0L8;FFe02300913249ff97e10300aae10700f981fdff902184119183fdff9063481291e0230091a200805224018052a7000014c80080d20800f0f2080500d1a0c300d1L16;FFee3f40f9ebe300f9eb0312aae0f38", + "03dfadb4aa9e193803de2c345a9c4010014e027c33d8103c03de86f46f9e0c7833de1f7803de8f301f9a80100f0081140f9BBBBL8;FB3d044000000000004900000000000000bf000000090000003d044000000000004900000000000000e7000000090000005369676e616c20505120526174636865L8;F", + "F080113abe302005400fefff0008003917a8e0094f3031faa088c48f81f0500b121efff54e8031faa080113aba301005400feffd000803991708e0094e8031faaBL8;FF00e00e917d0e0194e0fefff000e00391e1031faac0035fd6c0035fd6e30302aae20301aae1fefff021202b915f0e0114fd7bbaa9f", + "c6f01a9fa6702a9f85f03a9L8;FF1f0d00b1a00600541f0900b1a104005428008052ff0701f9e80b01f9e89340f9ff0f01f9a80000b4e08b40f9e19340f922008052c0120094e8a340f9a80000b4BBL8;FFe00318aa2100805239008052c9520194e0feffb4e8031faaf88300a9ff0f00f91703003409018", + "0520968283808050091e1230091e00317aae80f00f9abd8ff97L8;FF80fdfff000e4249182fdfff042c0259101068052664e0094fd7bbea9f44f01a9fd030091f40300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aaL16;FF1d120014e80301aa190340f90dadc0a907014ba91cf940f909", + "7942a9062941a9fc8300f9e0cb00f902014ca9e9bf00f9090d43a9e2eb00f90e4548a9e09b00f9BBBL8;FFbaf8ff97760a40f9680240f9080116cbbf0208ebe8150054680640f9e10314aae20315aa0001168bca720194c802158b680a00f9f44f44a9f90b40f9f65743a9L8;FF08011acb1f0308ebc9000", + "054e0431691e1031aaae20318aae5110094fad342f9fc0740919c830191fbf9ff17f60300aae043169122008052dd110094e1d342f9BL8;FF1e0000149f014871830700544d1dc039ae1d00128c550e0b8c0148518d00f83761710c8b0b018052140000148d7d1c53ad0600340d00be528d010d0b4c21803", + "9L8;FF83ffff54e14f40b202000014947e0113607f349b1f0001eba8ffff549c7e40939f06007181fc41d380030054007f1c9b034000917f0001eba918005486761e53BBL8;FFd6620091e00d0054c1825ff881ffffb4c00240f922008052c7320194f8ffff1760020291b10b0094e807409108810991000", + "10491740b0094f4cf49f99f0600b1L8;FF810000b4c20a40f9e00314aaca3200945f0b00b141100054f5833f91bb070036e88340f9e0074091f69340f90000189109a941a90081c23ce087853de9030bf9L16;FF161900916383853ca303d83c6083843ce00fc13d6383863ce10b05ade033803da2033aad", + "6083c63c6283c43ca103933c6183c53cfc8f00f9e10302ad6083c33cBBBBBL8;FB59000000050000001d1c40000000000054000000000000005f000000050000001d1c400000000000540000000000000065000000050000001d1c400000000000L8;FFe00704ada00779ade22b803da203d13ce31f803de", + "08701ada1037aade20b803de18302ad16140094a1d300d1e00316aae20318aac79a0094a8c303d17b070091BL8;FFfa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191350840f9fa0301aaf30300aa750500b4540740f9c61a0194e00315aa21008052bf1a0194601800b4e10314aaL8;FFcefe60d337fd60", + "d3dcfe78d3f003182ab91e00b4ca7e0853e0031baae10319aa22008052f9030baafb030caaeadb19a9f60313aaf30314aaf40315aaf50309aaBBL8;FF8f7140f8a6a31a3886504078907c4039917d4039ad0319f88df140f80e160033f0fd68d3a7831a78123300f883004039897040f802b300f8a2a0c29", + "38af040f8L8;FFa3fdffb063b4229144018052e85306f911000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f92861ff97e80300aae85306f9e0833291a1fdffb0L16;FFa183dc3ca283dd3cf8d301f9e0071bada083de3ca183d73ce2031cada083d83ca283d93ce10319ada083da3ca183", + "d33ce2031aada083d43ca283d53ce10317adBBBL8;FFc8e707374cffff17e0230091e8ab00a941790094a8831ff8a84300d18900009029f11e91a0fffff000440691e8a700a9a82300d1c2ffff9042c03691e1230091L8;FFe8031faa85000014bf0600b121fb0054f8031f2af6031faa340080521900809", + "228008052ff1700f9e80700f9e0074091e8c33f91e103182a00c03591fbcfff97BL8;FF2b120d2a08280039e8734039ed7740390c140039ec5b40390a1c0039ea6b4039f26f4039a811082a0c120c2a0e2000394a120a2a092c0039e97b4039ee7f4039L8;FF5f01106ab201120af00152b2714a12530f12", + "8f9a900180525f01126aea0151b212b06cd34a118f9a1f02206a101c0653e2179f1a527e65d30f1c05530201020aBBL8;FF080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b180030054091440f92a0140b24a11c0da4a1540d24a0d0a8b4a250191L8;FF43070054", + "e8430f91e0032a91ead4fe97e8eb41f91f0500b1a0c20054e8f341f9e9730e91001fc03de99304f92900009029211f91e8f303f92800009008712991L16;FF41410054e16740f9810000b4e00315aa22008052c8ba0094ba2b00b5f5031faa53fcff17e96b40f948fcff17960000b4e10316aa22008052bf", + "ba0094e17740f9BBBBL8;FB4700000000000000110000000a0000009d0540000000000048000000000000001d0000001700000011104000000000004f00000000000000d000000040000000L8;FF6d86009440008052410180526286009440008052e10313aa5f86009440008052c10080525c8600944000", + "8052e10318aa59860094000180520109805256860094BL8;FF810000b4220b40f9e00314aaca0a01949f0b00b14102005435030036e0a350a9e20313aae17740f9081540f900013fd6e06b01f9e8c31791e16f01f9290c40f9L8;FFe00318aae80f00f9cde5ff970500001428008052ff0f00f9ffa300a97", + "80d0035570300b4e10f40f9e80740f9b80640f91f0101eba00d0054e80b40f949028052BBL8;FFe10316aae20317aa230080522400805239d6ff97f55b41a903ffff17f40300aae0230091e10316aa02048052230080522400805230d6ff97e00314aaf60f40f9L8;FF00c006917d46009480fdffb000603", + "e917a46009480fdffb00020209177460094fd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088bL16;FFe84346f9e8f700f9e8008052e87300f908008092e99b1ba9e60307aae87700f9e70314aaf57b40f9e58f1da9e8174da9e18f00f9e3031baae9030eaaf7af00f9BBBL8;F", + "F682b05a98a068052480480527f2700a989fffff0297d2e91692b02a9290080d2891cc0f2687f01a9682704a97b660194c46a01948004805221008052bd6a0194L8;FF01f97fd342008052cb6a0094681240f9a80000b4601640f901f97fd342008052c56a0094681e40f9a80000b4602240f901f97fd342", + "008052bf6a0094682a40f9BL8;FFb6f7ff9700fe073728fc60d3680500b5200840921f1800f1a2050054217c0353c10500343f040071200200543f080071200100543f0c007121fdff5481620091L8;FFe90300aa1fbd00383fcd0038e80300aae90300aa1fdd00383fed0038e80300aae90300aa1ffd003", + "83f0d0138e80300aae90300aa1f1d01383f2d0138e80300aaBBL8;FFe00301aaf44f45a9f52340f9fd7b43a9ff830191c0035fd68000805206000014e00313aaeb070094e80300aae00301aaa8fe0737680240f9090540f91f0009ebL8;FF2900403921f0c03cf30300aae1830191e013843c00e4006f481", + "5003329111d12e00304aa02088052f40303aae1f3843cf9030691e9030139e87f0139e00303adL16;FFcdaa009448008052e91f80526842003969220039f44f48a9f65747a9fd7b46a9ff430291c0035fd6ff4301d1fd7b02a9f65703a9f44f04a9fd830091f503012aBBBBBBL8;FB366438353661663039", + "38352f6c6962726172792f636f72652f7372632f697465722f61646170746572732f656e756d65726174652e72730021706f73742d7175L8;FFc3a7ff17e91f40f948008052e083079133210039280100f92ca6ff97e12340f9f0ffff17f5031faaf70316aae00315aae10317aa589a0094e0230191e1830", + "791BL8;FF080116cb9f0208eb48060054680640f9e10315aae20314aa0001168bcd1e0194c802148b680a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6e8031faaL8;FF3e110094b7035af8ff0600b1400900546083c23c6183c33c6283c43ca9eb7aa9e10740f9e20304adbbf37ba9e11f803d02", + "00001417008092e20344adff0600b1BBL8;FF7e5a019482ffffb042a01e91e0031aaae10314aa7e5a0194ff4307d1fd7b19a9fc5f1aa9f6571ba9f44f1ca9fd430691160c40f908008092080c00f9df0600b1L8;FFd05e0094e00316aa21008052c95e0094a00001b4e10314aae20316aae00b00f9cc5e00", + "94f9d740f9e98b42b9e88f42b9fb2300f9e9230729d90600b4f4d340f9L16;FF888240391f05007101020054610a40f9680240f91f0101eb40040054690640f92a0400910b0480521f010aeb6a0a00f92b692138600400542800805228692a38BBBL8;ZBL8;FFe00317aa92fcff17f70300aae0630091220", + "080522300805224008052a4a2ff97e11740f9e00317aab3fcff17e0fdffd000c00291717a0094e0fdffb000c03c91BL8;FFe20314aab40200a9d2fe0094b40a00f961420091000080927442009195fa00941f0400f1210300549ffedfc8610640f90104f8b7600240f922008052befe0094L8;ZFBBL8;FF6", + "95b009168a20039880700d11f0900b1020001ad6a2600a922150054e00319aae1031caaa4000014aa135438e8031faa691b009103000014e8031faa69230091L8;FFcd3e0094fa5f49a9b60000b4e05b40f9e10316aa22008052c73e0094fc032a91b50000b4e03f40f9e10315aa22008052c13e00947536", + "42f9b60e49f8c13e0094L16;FF5c7700b4cfbe0094e0031caa21008052c8be0094403301b4e10314aae2031caaf50300aacbbe0094b10300146083c83c6183c93c6283ca3c685f40f9e07f813dBBBBL8;FBe5e7b92e90c1371ae52b637c2f061db1cc44c6f59026827c5878b5c585f3f833d62975437d51d", + "893762144d4a28c04fcfbac0000354c97021be16a616a70eec3L8;FF4000805241008052ca8e0094607c00b4f40300aacb8e00944000805241008052c48e0094a07b00b4f70300aac58e00944000805241008052be8e0094e07a00b4BL8;FF080900d107000014e05706f9e80b41b204000014c80080d208", + "00f0f2080500d1e0833291e85306f929150094f50300aa3d010014f9a345f9f5a745f9e0c32791L8;FF16000014e80f41b2680200f9f44f42a9f65741a9fd7bc3a8c0035fd6e91741b268220039690200f9f44f42a9f65741a9fd7bc3a8c0035fd6280480d20800f0f2BBL8;FFc8220091a0039d3c824a01", + "946083c03ce89b40f909008092610bc03de03b803de043803de03bc03de88b00f9e87b00f9681200f90800f0d26182823c6006803dL8;FF0825019109fd46d30800098b080500911f0109eb88130054bd000014080c44f81f0900b1c1090054f3031faa5a000014e80300aa098d40f83f0500b1e0120054L", + "16;FFe87b00f9e89742f9e86300f9e89b42f9e8d300f9e8a342f9e8ef00f9e8cb42f9e8f700f9e8e342f9e9a30fa969018052e97300f9e6e300f908008092ee6b40f9BBBL8;FFd536969ae80740f9080114cbbf0208eb28040054e80b40f91f0002710801148b03fdff54e90f80121f00207109140033c20", + "000540a7c0653090500394a051a32L8;FFe10240adfab30a39e10302ade10ac03de10b03ad0906ff97e99341b93f09007121080054e8cf40f9e9a341b9ec030b91eaa741b9e86301f9e9cb02b9eacf02b9BL8;FFe20313aaffdf00a9ff0f00f9cffaff97c00c00b5990a40f9880240f93f0308eb61000054", + "e00314aa63e90094880640f9e083c03ce1031faa2823189be90f40f9L8;FFc1ce7492060000f0c6c041f9210040f93f0006ebc1fdff54c7424079e62c46d3dfbc0071a80d0054e1fcff9021e00b9121d86678887c011b7f00086b8bfcff54BBL8;FFe8d302f9df0600b14064ff5481620391e24316914000", + "80523d1000941dfbff17e8031faa000119ab224e0054e1431691790c0094f90b40f91f0700b1c00e0054L8;FF280340392a15003308111d1228030039e80327912a7f0039e083c53de187c53de0fb833de1ff833d2529ff97e0fbc33de1ffc33de0833f91e07b823de17f823dL16;FFe013c03de92203a9e", + "82b40f9e016803de83200f9810000b4e00316aa22008052c5ae0094e10740f9810000b4e00313aa22008052c0ae0094e10b40f9810000b4BBBBBL8;FB7920696d706c656d656e746174696f6e2072657475726e656420616e206572726f7220756e65787065637465646c7900c50f4000000000004b00000", + "000000000L8;FF091440f9090300b40a1040f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191ad194e8bbf010cebe3010054BL8;FF290d098b2925019129fd46d30801098b130500917f0209eb890f0054088c5df81f0500b1c00c00547e0200940800", + "40b20811c0da081540d2080d088b08250191L8;FF0a95003909990039e9ab54290a9d003909a10039e9ab53290aa5003909a90039e9ab52290aad003909b10039e9ab51290ab5003909b90039e9ab50290abd0039BBL8;FFfa674ea9fc6f4da9fd7b4ca9ff830491c0035fd660fffff000a4219162fffff0", + "42202291c103805261520194ff8306d1fd7b14a9fc6f15a9fa6716a9f85f17a9L8;FFe85b04f9e95f04f96b52009420008052e10319aa6052009420008052e10314aa5d52009420008052e10316aa5a52009400018052e10313aa5752009420008052L16;FFf7031faa38008052e8431e91fb431e91fa431", + "e91a5fbff97f4cb43f96083c03ce8d743f99f0a00b1e0d7823de8b305f901010054e0d7c23de8b345f909008092BBBL8;FF42018052e400805224000014a0031df8a1fffff021780391a3fffff063a00391a0c300d142018052440180521b000014a0031df8a1fffff021780391a3fffff0L8;FFe1431691", + "950f0094e87749f91f0500b1e0070054e1d342f9e8cb42f91f0101ebe08b0054e8cf42f92a040091802202914901805209692138ead302f94e2b0094BL8;FF3f0500f14881889a1f2500f1c8090054c9feffb0299508918a0000102b6968384a090b8b40011fd660220091f30b40f9fd7bc2a8a500001460", + "220091f30b40f9L8;FF01000094017c4093c80b80d2e00301aa010000d4e00301aaa80b80d2010000d4fdffff17fd7bbba9fd030091f30b00f9f303012ae22700f9e20300aad3003037BBL8;FFe85309f9e95709f984320194f6ef47f9e01bc43de11fc43de0431691e8036179e1833791023f8052e05781", + "3de15b813de8e30a79c73601943800805274008052L8;FFf9030891f8830d91f7032a91e8eb41f91f0500b120120054e8f341f9001fc03de0032a91022b8052e83f01f9e8430f91018100912083863cc6360094e04b40f9L16;FF22008052f4030b2af5030c2acab60094ec03152aeb03142a5f0700b1800", + "b0054f503192a9f0700b115df78b3600e0054e8274ea9e0831d91e1c31591fcbb02f9BBBBL8;FB656d6f74655f6964656e746974795f7075626c696373656e6465725f636861696e72656365697665725f636861696e7370656e64696e675f7072655f6b657972L8;FF6b0d0b8b6b25019129194b8b29050", + "09129010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054BL8;FFcd060194e89740f9ffa711391f0500b160000054e02b40f94be1ff97f3d351a9940100b47522009104000014940600f1b5620091e0000054a1825ff881ffffb4L8;FFee", + "ffff17e81f40f9e8df00f9970000b507000014e81f40f9e8df00f9e00316aae10317aa22008052c3060094f6e742a9f71340f9d582009104000014940600f1BBL8;FF08ff60d3680a00b5000b40921f1800f1620a0054017f0353810a00343f0c0071ec0100543f040071a00300543f080071e00500543f0", + "c007141faff54e81b41b9L8;FF9f1700f188fbff54ea430f91e8e3009129008052448948adec030b91408541adf81f40b9e95300b94231803d02c1853c438942ad01c1823c00c1813c02c1843cL16;FFe98f40f9f8ef00f9f89f40f9e7b300f9e7b744a9e8a713a9e9eb40f9e8a740f9f6031baafb030baa", + "cb008052e99b00f9e9cb40f9e06700f9e00302aae22f40f9BBBL8;FF65620194f80600b4f60300aacd660194e00318aa2100805235008052c5660194c0feffb4e10316aae20318aaf90300aac8660194e00316aae10318aa22008052L8;FF0bfc63d35369283808050091280800f90bfeffb43f0108eb936", + "11932000100540dfc6ad35369283808050091280800f94d0200b5e0030baa61000014e10300a9BL8;FF3f040071800300543f080071a1020054880243f81f0500b1810000549f5e03a99f7e04a9977e05a981c20091e20313aa45f6ff9740fcffb4610000143f0c0071L8;ZDBBL8;FFcd260114604a40f9a", + "00000b4614e40f9610000b422008052c7260194611240f9810000b4600e40f922008052c2260194b40000b4600640f9e10314aa22008052L8;FFf30b40f9fd7bc2a8cb260014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091f30300aa004840f9a00000b4614e40f9610000b422008052be26", + "0094L16;FFc141823ca1037eadf13300f911825fb810c20191c041813ce20343adc141803ce117c03df1c11fb8e0c19e3ce2c19d3ce1c19c3ce0c3c33ce1c3c23ce2c3c13cBBBBBBBBL8;FB457863656564656420667574757265206d657373616765206c696d69743a20c0092c20696e6465783a20c00b2", + "c20636f756e7465723a20c00076656e646f722fL8;FFe00316aa2100805239008052c9a3009480fcffb4a1020191e20316aaf70300aacca30094c7a300940008805221008052c0a30094201600b409488052a10241adBL8;FFf0ffff17e00313aae10317aae20315aad6070094770a40f9680240f9080117", + "cbbf0208eb09fcff54e00313aae10317aae20315aacd070094770a40f9daffff17L8;FFa0e300d13dfeff970011003728fc60d3880600b5200840921f1800f1c2060054217c0353e10600343f0800714d0200543f0c007180fdff543f100071e0020054BBL8;FFf903172acf630194e00313aa2100805237", + "008052c7630194c0fdffb4e10314aae20313aae01b00f9ca630194e61f40f928008052f703192af9031b2a04000014L8;FF680a00f9540300b4610a40f9680240f9b51240f91f0101eb40070054680640f9490280522a040091e00314aa6a0a00f909692138e10313aa88fcff97760a40f9BL8;FF0802003", + "7750240f9a80640f9160100eb62020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e003009124eaff97L8;ZDBBBL8;FB72656d6f7465206964656e74697479206b6579206e6f7420636f6e73697374656e7420776974682070726576696f75736c792d6573", + "7461626c69736865642073L8;FF888a40f91f0500b120eaff548142049136000014e11740f9e80f40f91f0101eb60730054e81340f9938248f84904805209692138280400917f0600b1e81700f9BL8;FFfd7b43a9f32340f9ff430191c0035fd63fa000f141010054f30308aae8430091001000918104805", + "2d4070094e81340b91f05003100010054e80313aa49008052L8;ZFBBL8;FF2d000014f40308ab62050054152040f9750300b4131c40f9f6031faaf70315aae00313aaaf080094080040b20811c0da081540d2080d088b08250191081848abL8;FF080540f91f0115ebe91a0054e00313aa40ffff97e80300", + "aae00301aac8fd073708fc60d3681a00b5080840921f1900f1a21a0054017c0353c11a00343f080071L16;FFe8a747f9e8ab05a9e8ab47f9e8a70fa9e8af47f9e84b00f9e0032b91ebfb00f9f74700f9c0caff97f70314aa68000014e8031d91e1032b910232805200410091BBBBL8;FB000000000000000", + "0000000000000000001000000000000003c7a4400000000000000000000000000000000000000000001000000000000000444440000000000L8;FF080c47f81f0500b1201d0054d5fcff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebe81b00541401001497", + "010094BL8;FF688e48f81f0500b140020054e00313aa84ffff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb69010054000114abL8;FF300eff97e8435339e8000036e86353391f0500714c090054e80d0035ec0f41b276000014e8431391e1a740f9e043139", + "1099140b80a1140f81bd140b822008052BBL8;FFe00317aa79d7ff97e003c03d08008092685a00a96082823cf44f4da9f75b40f9f6574ca9fd7b4aa9ff830391c0035fd6e88343a98082c23ce92f45a9ea2740f9L8;FF00013fd6c10640f9810000b4c20a40f9e00318aac85300947f0b00b1c1020054f6e", + "3229155050036e0234ea9e16340f9e22340f9081540f900013fd6e03b02f9L16;FF00210091e223009121008052e82700a954cf0094c80100f0e003142ae103142a080140391f05007160fcff54473a009462024079e103002a9e390094e203012aBBBL8;FF2911c0da291540d2290d098b29250191e91a4", + "98b29050091962281b9d6030034ca0240b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a050091958e40f9L8;FFe00318aa09692138e1431691ead302f9920c0094fad342f9e8cb42f908011acb1f0308eb483c0054e8cf42f9e10319aae20318aa00011a8bc6730094f90b40f9BL8;FFe00315aa21", + "008052f40315aa36008052c8f30094a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad30a088052f4031faaf5ff03a92911c0daL8;FF152440f9000700d1bf0200eae0179f1a1f000014e10318aae00315aa620080520806009460030034dbfcff97000040b91f980071e0020054f55b4", + "2a9f76343a9BBL8;FF1f0101eb20bf0054e8cf42f9090580522a04009109692138e1431691ead302f97d110094e8d352b91f050071c1000054e1d752b9e2db52b9e3431691c0008052L8;FFea030191a8a73ca928fdff90084d1491a8ab3ea90a078052c8048052bfa739a929fdffb029ed0a91a9ab3ba92", + "90080d2e92fc0f2a8ff3aa9a8a73da9772f0094L16;FF35170094a0077bada8035af8a20f7cadf42f02f9e82b02f9480080d2e007813d0800f0f2e10b813d16017eb2a08739ad4083c63c4183c53ce313813de20f813dBBBBBL8;FB390740000000000033000000000000002f02000011000000696e76616", + "c69642070656e64696e67205072654b6579206d6573736167652062617365206b657900L8;FF0001158bd39b0094e89b40f960020191e14303912200805208050091e89b00f960970094ff3f0439f80314aaf70319aa02ff46d314e37a9218174092e20000b4BL8;FF3500028bffa300a9f6fefff0d6623e", + "9117008012a88300d1e0830091f40301aaff8701a9f5db02a9f73b00b983170194a2035ef8a20a00b5a08300d1b4573ea9L8;FFe10318aae60313aae0f3883df6431391f5db11f9fcdf11f9ff0b00b9ff0300f90dc5ff97e86b42f91f0900b1403300541f0500b1c03200544083cb3c4183cc3cBBL8;FF80", + "ffff9000ac2e9183ffff906320119184ffff9084402f91a20700d1e103805265570194fd7bbda9f65701a9f44f02a9fd030091150840f9080040f9f30302aaL8;FFc7000014c80080d2e15706f90800f0f2080900d1d0000014c80080d20800f0f2080500d1be000014e05706f9e80b41b2c9000014c8008", + "0d20800f0f2080500d1L16;FFe083c33ce183c43ce93740f9e283c53c680200f9600601ade003c03d692a00f9e90b40f96212803d6082803c690e00f9fd7b47a9f34340f9ff430291c0035fd6BBBL8;FF619640f93f0400f18b000054609a40f922008052c87b0194613240f9810000b4603640f92200805", + "2c37b0194613e40f9c10000b4604240f922008052f30b40f9L8;FF294d2791e84b09f9a8fdffd0088d3491e94309f9290080d2a04700d1e85b09f928038052a90fc0f2ea5f09f9aa0a805221800991ff3309f9e83b09f9ff3f09f9BL8;FF3f2500716d0d0012ca114a0b0e819f1a7f7d0271c901090b0e81", + "9f1abf25007129c10011cb114b0b0e819f1a9f7d02714ac100110904003909819f1a0a000039L8;FF1a000014760a40f9680240f9370c009135104078080116cb1f0115eb63050054d5000034680640f9e10317aae20315aa0001168bc7fbff97c802158bf502158bBBL8;FFabb35838a99318384901084a", + "aac35838a9a318386901084aabd35838a9b318384901084aaae35838a9c318386901084aabf35838a9d318384901084a22008052L8;FFcc3b0094a0e700b4e10315aae20319aae03b00f9cf3b00940300001428008052e83b00f97a9e40f99a0100b4759a40f9c43b0094e0031aaa21008052bd3b0094L16", + ";FFcdbb0094ee0319aaec03182aeb03162ae90314aa750100b4e0030eaae10315aa22008052f40309aaf5030b2af6030c2ac1bb0094ec03162aeb03152ae90314aaBBBBL8;FB087a35f466406696050db7b8a1869574a28c00fc1fd27df57e800000065499d66f5e7039138ff872a9b2cc3089f331fe2fa7", + "485fa235154c8ad52be204e85309L8;FFe103152a08014039c07a73781f05007120fcff544df2ff97c07a3378e14340f9f45341f9f3031faaf50301aa09000014e84f41f9c97a73780a7973784901094aBL8;FF8bbaff97e8833291fc5346f90081c03ce85f46f99f0b00b1e0d3823de8ab05f901080054e", + "8ab45f9e9c32791e0d3c23de95b04f9e9feffb029810c91e80305f9L8;FF64070094fd7bbda9f50b00f9f44f02a9fd030091f40302aaf303012af50300aac80b00940003805201018052c10b0094400100b4155000a901fdfff021400691BBL8;FF28008052680200b9411c00b5e4000014e80740f908011", + "6cbff0208eb081f0054f70100b4a002168be10318aae20317aac84b0194c802178be00318aae10317aaL8;FFea030aab23feff5480fdffb000c01f917a47009480fdffb000a02e917747009480fdffd000600391744700940800403969fdff9029011091e00301aa227968f8L16;FFe80344f9e90744f9e8", + "eb00f9e80f44f9ea2311a9e81344f9ea2744f9e82f14a9e81b44f9e92313a9e82b44f9e91f44f9e8ab04a9e82f44f9ea3b44f9e82701a9BBBL8;FFcd6b019437008052b30000b4e00314aae10313aa22008052c76b0194b50000b4e00316aae10315aa22008052c26b0194e00317aae10319aaf44f46a9f9", + "1b40f9L8;FFa80600b41f0500f1000200541f0900f121090054610a40f9810000b4600640f922008052c46b0094611240f9410900b408038052606a68f822008052f44f41a9BL8;FFa0877dad800605ada08b7ead800a06ada1837bad810203ada2837cad820204ada18379ad810201ada2837aad820202a", + "da18378ad810200ad10000014e88340f9L8;FF6bf17d926b0100cb04000014a90500913f0101ebe20e00540d68e938cd02f8376d01094bbf0940f28000005429050091f8ffff17294100913f010aebc2000054BBL8;FFe86300f9e863019108210091a10303d1a92b34a9e02f803d7e270194e83b40f929f", + "fffb029e91291e003c63c682602a9e8008052e90741b2681a00f908008092L8;FFf54f43a9f75b42a9fb0f40b9f96341a9fc0340f9060000143c008052542340f9b4031df874f1ffb509018052a8035df8755a00a9755e01a9785e02a97c6605a9L16;FF685a1ea998ebffb55fffff1725feffd0a5802791", + "e103019182820191e0031f2ae3031faa48a7009423feffd063e0279100108052e1031aaae2031aaa6da70094BBBBBBL8;FB76616c69642053657276696365204944733a2073656e6465723dc00c2c20726563697069656e743dc0001a696e76616c696420737461746520666f722063616cL8;FF42008052", + "cc9f0094e827039118070091e1031aaa00f1cf3ce8ef40f91f4300f16002803d680a00f941f8ff541c010014ffd71ca956008052ffef00f9e8830791BL8;FF2104129103ffffd063541291a0c300d142018052e40080522c000014a0031df801ffffd02104129103ffffb063500291a0c300d14201805284", + "00805223000014L8;FFa0e300d1e10315aae20316aa5e100094b9df7ca9b8d77da93f0b00b121030054350400b4a8e300d1e00318aae10315aa71cbfe97bae77ca96083c23cbcef7da9BBL8;FFf44f01a9fd030091f30300aaf40301aacde3ff97e10314aae00313aaf44f41a9fd7bc2a8022b8052ca5f01", + "14fd7bbca9f85f01a9f65702a9f44f03a9fd030091L8;FFe06b01f9e8c31791f3c31791e16f01f9290c40f9e1830b9120013fd6f4fb42f99f0e00b12102005468008052f46f41f9f36b41f9e8230b3949008092880240f9L16;FF680240f91f0101eb60040054680640f92a04009109028052e003142a096", + "92138e10313aa6a0a00f9f44f42a9f50b40f9fd7bc3a83aedff17e8031faa94fcff35BBBL8;ZBL8;FF2300805224008052a9a3ff97e11740f9b5fcff17e0630091220080522300805224008052a2a3ff97e11740f979fdff17e0630091220080522300805224008052BL8;FF280080529f0a00f99f2200a9", + "f44f42a9f65741a9fd7bc3a8c0035fd6f6031faae00316aae10313aa5bfb009408fcdfc8080940f91f0500f1e0179f1ac0035fd6L8;FFaa2c3ea9ac343fa9c0035fd61f2003d52e3c42a9304443a95f8001f1a9000054820c7ca981107da9a20c3ca9a1103da9061c00a9082401a90e3c02a9104403a9BBL", + "8;FF3e000014a0031cf841ffffb021ec039143ffff9063e03d9118000014a0031cf841ffffb021ec039143ffffb063100391a00301d162028052240280522d000014L8;FFfa0301aae8430f91e00317aae103192ae20315aae3031aaa37e0fe97f7eb41f9770200b4e8ef41f9f6fe60d3e86300f918fd60d", + "3c80080d20800f0f20a390091L16;FF6183c73c6283c83c6383c13ce077813d6083c93ce17b813d6183c03ce083813d6083c23ce15f813d6183c43ce8bb42f9e27f813d6283c33ce067813d6083c53cBBBBL8;FBfaa35c68840fd9ee27558b914040e01f50050368a5e314df7fd56faeee4ad4ecdfdda65d", + "48eae5dcd4ad5fc2e658d11ba28c82efe99f0000b9a8a3f8a46a1c27L8;FF69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff5400feffd000000b91748b0094e0fdfff000200c91718b0094fd7bbfa9fd030091BL8;FFe0faffb449010014e8eb45f91f0500b1801c005401430", + "291a22302d175eeff97e0f9ffb453010014e83746f91f0500b1a1000054ff3706f9f63b06f9ff3f06f9L8;FFfd7b42a9ff030191c0035fd6e00741a9610b0094fd7bbda9f50b00f9f44f02a9fd030091a87cc39bf30300aae9031faa0a018052ff0308eb28008052a1030054BBL8;FFe123803df9ff4039c", + "182c03ce10b00adc282c43c020119cbb80202ebe20302ad02010054e002198be10314aae20315aac84f01942803150be8ff003920000014L8;FF29194b8b2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb29030054280108ab8300", + "0054L16;FFf17744f9eea743f9f7df43f9fbe343f9e82b17a9e8bb43f9eac343f9e31744f9f81f44f9f92344f9e9231fa9e8cf43f9e9bf43f9ec2744f9ef3344f9fc3744f9BBBL8;FF4a0400d115000014f90303aaf80300aa5f2800f1880000542800028b08f1df38e809f837e023009142210094e80b40", + "b9a8ea0737e80f40f9e90640f92a0108ebL8;FF000180521d000014280180d20800f0f2081d00d11e0000141f150071000200541f11007141040054280180d20800f0f217000014e00313aaf7070094e80300aaBL8;FF3f080071a1020054400f00b5e00313aab2fcff97e80301aac0060036a80f00b5e10", + "31faae6ffff173f0c0071200300543f10007121010054800900b5e00313aaL8;FFf30300aae00303aa0d000094e10300aac00000b400008052610200f9f30b40f9fd7bc2a8c0035fd6dbf8ff97000040b9fbffff17c0028052c0035fd6fd7bbea9BBL8;FF204f0054e8cf42f92a040091800203914901805", + "209692138ead302f92d160094e14316917c0d0094e0ab49f9800100b4e1d342f9e8cb42f91f0101ebe0660054L8;FF00001891ff0316b9e82f00b90a2a0094e80356b9e00740918100805200001891ff0316b9e82b00b9032a0094e80356b9e00740918100805200001891ff0316b9L16;FFff2312a9e87f", + "14a9ff2315a9e87f17a9080a8052ff7f01a9ff7f04a9ff7f07a9ff7f0aa9ff7f0da9ff7f10a9ff7f13a9ff7f16a9e8c300f9ff230639e8270094BBBBBL8;FB6f6e5f69646c6f63616c5f726567697374726174696f6e5f6964616c6963655f626173655f6b657970656e64696e675f6b796265725f707265", + "5f6b65796c6f63L8;FF08014039e80000341f0500712101005421feff9021f40091420380525893001421feff9021600091a20480525493001421feff90215c0191a202805250930014BL8;FF40011fd6088c40f81f0900b1411d0054e8031faa73010014e80300aa098d40f83f0500b140250054f30300a", + "ae00308aa69040094e80300aae00313aa090140b2L8;FFa04700d132c5ff97e08301b9a04700d12fc5ff97e07b01b9a04700d12cc5ff97e07301b9a04700d129c5ff97e06b01b9a04700d126c5ff97e06701b9a04700d1BBL8;FF20010054808640a9a85300d1a0d3de3ce003803de4530094b7c35e38ff0", + "a00712101005408008092680200f9f44f47a9f72b40f9f65746a9fd7b44a9ff030291L8;FFf3032d9108f7ff97080000f008112791c9048052e85706f9080000d008710891e85f06f9a8fdff9008c11d91e8fb02f960fdffb000402b91e80303f9a8fdff90L16;FFf44f44a9f90b40f9f65743a9f85f42a9", + "fd7bc5a8c0035fd6680240f919631932bf0208eb61000054e00313aa20d20094680640f998fe71d319693538d51a0091BBBL8;FF5f2800f1880000542800028b08f1df388804f837e023009146290094e80b40b9c8150037e80f40f98a0740f9490108eba32400548a0340f9e00b40f94801088bL8;FFe07", + "b49f9e10313aa22008052ca770094e807409108810991006103918b0b0094f4bb49f99f0600b1e0b2ff54f5c349f9f3bf49f9950e00b47622009104000014BL8;FF22008052f44f42a9f65741a9fd7bc3a8c9f7001400200091f44f42a9f65741a9fd7bc3a81b0200141f0500b180000054f30300aa1a030", + "094e00313aae80300aaL8;FF608640f800003fd6fcffff17f35341a9fd7bc2a8c0035fd6fd7bbda9fd030091f55b02a956cc218bf50300aad6220091f35301a9f303012af40302aae7ffff97BBL8;FF21800191d3370194e92342a9e00319aae0f3c63d0178805222008052f5170af9e8130af908048152e", + "91b0af9e9eb4df9e81f0af9e8270af908788052e82b0af9L8;FFe8272a39c80080d20800f0f229000014f60300aaa00302d121f2ff97e00316aae04305f9e0032a9121fdffd021203f910202805263fdffb063d0179174000014L16;FFba0000b4e06f40f9e1031aaa22008052c9b70094fafe48d3b80000", + "b4e00319aae10318aa22008052c3b70094f96740f93f0700b18006005448ff70d349ff60d3BBBBL8;FB626520636f7272656374000000000000741940000000000058000000000000003c0000000d0000007375636365737366756c206465637279707420616c776179L8;FFf40300aaf7031faa19038052", + "2e0080520600001438c11f783be11f78f7060091ff4200f1a00c0054e852199b89c240f92afd44d3290d4092ff0209eb49258a9aBL8;FF1f0009ebe9a79f1a0901891a48020090a9050036081140f9e92740f91f0500f109030054e8ffff9008610491c0feffb000683891a92338a9e8632291090200b0L8", + ";FFf4e30691d3070094e00745ade1430c91e86340f9ea8b40f902288052e94f40f9ebdb40f92083823ce083cc3c2183833ce183cd3ce8af01f9e87740f9e0071badBBL8;FF00fbff543f040071c1000054e1c30091a263009110ccff97c0faffb48e000014a2630091830c80524ccaff9720faffb44e0000", + "14a063009143560094f40301aaL8;FFf80310912a15003308111d12e8430639e8031091eabf0639200740ade00600ad2742ff97e00640ada00302d1808702ad1e5d0094e8430691a08303d1c1e20091L16;FFe86f44f9e9a30aa9e87344f9e80700f9e87744f9e83f00f9e88344f9e8f700f9810000b4e00", + "31baa22008052c2c70094b90000b4e0031aaae10319aa22008052BBBL8;FFe10740f9810000b4e0031baa22008052c9670194b60000b4e0031aaae10316aa22008052c4670194614a40f93f0400b140020054810000b4604e40f922008052L8;FF00a032917d630094c0fdff90000033917a630094ff0301", + "d1fd7b03a9fdc30091080040f9090540f9490d00b40a0140f9410180390101f8b7e0031faa4a050091BL8;FFc80080d20800f0f208090091aeffff17ff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091081c00121f09007181010054e00302aaf30302aaL8;ZDBBL8;FF0081853cfc27", + "00f9da0000b4e0031baae1031aaa22008052c7270194fc2740f99f1b00f103050054f8430691fb0c8092e02340f9080d8052826f089b0080c23cL8;FFe00314aa01ed7cd302018052f44f42a9f65741a9fd7bc3a8c7270014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd03009", + "1f30300aaL16;FFe1031baa22008052cba70094ab835ff8f3031f2afb031faaf60300f902000014f3031f2ab6577ea9e0c20191b8835df8e9b68dd28a0200cbe8020bcb69dbb6f2BBBBBBBL8;FB6f746f636f6c2f7372632f726174636865742f6b6579732e7273001f756e74727573746564206964656e7", + "469747920666f72206164647265737320c0002f6361L8;FFa86b3fa9579d0094e1034029280340391f05007161fbff54e5ffff17f4031f2ae80740f9a80000b4e00b40f901f97fd342008052c0a10094e003142af44f48a9BL8;FFe10309aa22008052f4030baad7050094e10340a9eb0314aa2aa040a929", + "0040f90dfc6ad35369283808050091280800f90dfeffb43f0108eb7361193220010054L8;FF49ff60d3610a40f9e0c30091fa3300b9e8db0039e80b40f9e96b0079e9634039fb7303f8f6f303f8e87304f8e93f0139121fff97f703002a15000014f5031baaBBL8;FF6d5d0194ff0301d1fd7b02a9f44f03", + "a9fd830091010840a988008052f30300aae0230091040180520506805229f87fd33f1100f13481889ae30314aa40000094L8;FFeb000094610a40f9bcffff17e00313aae10317aae20315aae5000094770a40f9680240f9080117cbbf0208eb09f8ff54e00313aae10317aae20315aadc000094BL8;FF2a0", + "00014e20313aa230c80525de8ff97e10300aafaffff17e1031faa883e00f9f7ffff17c10e0054e0031faa7fffff1721050054e0031faa72ffff17c80080d2L8;ZDBBBL8;FB4e000000000000005707000005000000ef104000000000004e000000000000005807000005000000fa08400000000000290000", + "0000000000440100001b000000L8;FFe00a0054e11740f9e80f40f91f0101ebc03b0054e81340f92a0400918022029149018052ea1700f90969213865f0ff97e16300913a8fff97807640f9800100b4BL8;FFe3030091e00308aa68fd0094fd7b41a9ff830091c0035fd6ffc300d1fd7b02a9fd830091080", + "0009008813d9109600091e02300a9200440a90800009008713b91L8;ZFBBL8;FFfd7b43a9ff03019160001fd6082000910960009142ffffb042c02891e82700a9e8030091090000b029b10391200440a9e82701a9e82300910900009029b13e91L8;FF250000141f1d007181070054606641f9616a41f929", + "0c40f9e8430f91e1031baa20013fd6fceb41f99f0f00b1a10c005448008092880200f9e8008052c20c0014L16;FFf51306a9ef6f00f9f6f30aa9fb6700f9ec7b00f9fae300f9e36703a9081140f91f0900f1a9230054880100900801159129038052e86705f968feff9008611d91BBBBL8;FBa73a242ae5e", + "90000f47e6095901ae72819332dbc29975402450c6ce25c9af5b3ff7cff44f664686f19e88885911c4791f9366cd97ee0109087fe0ca6a73ac1c3L8;FF6b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010a", + "abc2060054BL8;FFe387c13de10316aae08601ade07fc13de183c13de82b43f9e216803de00600ade83200f9e30a803d75fdffb5e81b41f91f0500b1600a0054f72341f9e94b42b9L8;FFe0e30e91a6eaff97e0030e9144ebff97f9575aa9f62b40f9f4cf42a9f8db40f9e0830c9126ebff97e1cf40f9e16", + "affb4e0cb40f922008052bf11009453fbff17BBL8;FFf6575da9f85f5ca9fa675ba9fd7b59a9ffc30791c0035fd660ffffd00040269162ffffd042e0269161048052654d0194fd7bbca9f70b00f9f65702a9f44f03a9L8;FFf85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd620008052e10317a", + "a5d4d009420008052e10319aa5a4d009420008052e10318aa574d009420008052L16;FF190340f909a0c0a90a0c41a90078c03d0c5455a9e94700f90e584fa9e86b00f9092042a9ec7b00f9053056a9ee9f00f9047050a9e8bb00f90b2043a9ec6700f9BBBL8;FF23008052240080523bfdff97770a40f96", + "80240f9080117cbbf0208eb89dcff54e00313aae10317aae20315aa230080522400805230fdff97770a40f9dcfeff17L8;FFe1d342f9e00316aa32feff17e043169122008052e6100094e1d342f943feff17e0431691e1031aaae20318aae0100094fad342f9e8cb42f908011acb1f0308ebBL8;FF3f0108", + "eb73611932600500549369283808050091280800f9e006f8b7e0030aaabfffff17e10300a9e00301aae10309aa220080522300805224008052f4030caaL8;FFa51000511f1040f2a37c4093c1020054e01040f91fcc74f26002005400cc7492064000d115000014d6020e917f7e00a97f7e01a9c10a40f97", + "f1200f9810000b4BBL8;FF850f0094e09b49f9800100b4e1d342f9e8cb42f91f0101eb008f0054e8cf42f9090180522a04009109692138e1431691ead302f9780f0094e88349f91f0500b1L8;FFfc134bf94a014139f8174bf9e85b07b9e8631d91f51b4bf9093100b8e91f4bf9e80240f9f4e342f9ea431", + "d39e9a703f9680000b4e00314aa00013fd6e10640f9L16;FF22008052ccb10094611a40f9810000b4e00314aa22008052c7b10094612640f9810000b4602a40f922008052c2b10094613240f9410400b4603640f919000014BBBBBL8;FB6465724b6579506c61696e7465787400000000000000000008000", + "000000000000800000000000000bca7410000000000456e636f64654572726f7272656d6169L8;FFd0990094e00316aa21008052c9990094200800b4e10318aae20316aaf50300aaf68300a9cb990094f60f00f9940300b5c102148be8830091e00315aae10f00f9BL8;FF290500913f010aebe905005428", + "0108ab8300005426000014e80308ab82040054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8bL8;FF3cff78d30bfdff906b3102918d008052ef031a2a78ff78d337fd60d3f603192aee03082af003182ab4070014e02bc13de12fc13d24fdffd084203591e233c13dBBL8;", + "FF22008052cc590194816e40f93f0400f18b000054807240f922008052c65901948002039142ddff970801805280220191955a09a99f220ca908048052955e0aa9L8;FFe8c31691aafdffb04ac11d91e86304f9080000f008710891e96f04f9e9c32291e86704f9e8c31d91a04700d1e86b04f968008052e", + "1833291e97f06f909078052L16;FFc1000054e87b41b968fb0737fcbf00f9ff8301b9d8ffff17a2c303d1630c805258e0ff97e10300aad8ffff17e1830591a2c303d1c5e5ff9760faffb4b6000014BBBL8;FF290040f9280800f94c0200b500fc55d336000014e10300a9e00301aae10309aa22008052230", + "080522400805232050094e10340a92aa040a9536928380cfc5cd3L8;FFf8cb02f9e0cf02f9ffd302f920130054e8031faa4901805209683f3808050091fa3b49f9e8d302f97a0300b4480340b20811c0da081540d2080d088b08250191BL8;FF540100b4cff90094e00314aa01018052c8f90094c00000b5", + "08018052680600f9280080520400001400018052e8031faa600600f90a028052e90314aa696a2af8L8;FF1f0500f161000054f30314aa4000001408fc43d30900fe921f0109eb41000054200020d417050091f30300aa21008052e0f27dd33203009440ffffb4e10314aaBBL8;FF8002803d682600294809", + "c05a6909c05a682601298809c05aa909c05a68260229c809c05ae909c05a68260329f44f48a9f92b40f9f65747a9f85f46a9fd7b44a9L8;FF7b6300915a0700917f0308eb01efff54fb020014e8bb44f9090d8052800fc03dc822099b000d803d8013c03d0011803d8017c03d0015803de97345f9093100f", + "9L16;FF68008052e0a3803d4d0100149afdff175f030014290100b4f50300aae0031aaaf40301aae10309aa22008052c2b90094e00315aae10314aa213300b59a010014BBBBL8;FB42024000000000006a00000000000000190100002e00000042024000000000006a00000000000000ca0000002e000000", + "42024000000000006a00000000000000L8;FFf40300aae81700f9ce8900940020805201018052c7890094c03a00b489c240f9f5031faafa031f2afb031faa0802805298a2009136fd44d3370d409219038052BL8;FFe0feffb000a01791e3feffb063001f91e4feffb084801891e2833291e1068052e8530", + "6f9e95706f963050194e0feffb000a01791e2feffb042e01891e1068052L8;FFe00b42adb37e04a9a10200ada20a803db45200b9f44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd620008052e10313aa58050094fd7bbaa9fc6f01a9BBL8;FF16fcffb539008052e88740b9ea4740f9e93f40f9e", + "08745ad7b6a05a9684a01b96a2600a9e9a346a960828b3c61828c3ce08746ad6a2201a9692202a9e9a345a9L8;FFd2ffff17280180d2e00700f90800f0f2081500d1deffff17e90b41b2e92300a9dcffff17280180d20800f0f2081100d1d7ffff173f00156b81f7ff54680240f9L16;FFea4f42f9e8b700", + "f9e84742f9eba318a9e84b42f9eb5342f9e8eb00f9e85742f9e88f00f9e85b42f9e82f14a9e86342f9eb5f42f9ea2313a9e86742f9ea7742f9BBBL8;FF0005c03d0a657da91a8c5cf801c10091e92300f917257fa9eb3300f9e9db06a90b2540a9b60302d1c002803de91f00f9092940b9151140f9ebab04", + "a9e95f00b9L8;FF810000b460ea40f922008052ca69009460220091f4feff9760a20791f30b40f9fd7bc2a887feff176042069151000094e00313aaecfeff9760420891f30b40f9BL8;FFfd7b03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf40", + "301aaaaf6ff97e80300aae00301aa08020037L8;ZFBBL8;FF0800f0f21a1100d1e9d342b9204bc03d8101c03de88f01b9e94303b98041883c8021c03de95343b9811d803d8182823c8082833ce98b01b98082c23c8112c03dL8;FF7f0200f917fc0039000400adc0f2c63c0208803d00f0823c60a200a9e0", + "030191223f0094ff431391f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8L16;FFe0230091440080528500805229f87fd33f1100f13481889ae30314aa5a000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191BBBBBBL8;FBe802000005000000a11040000", + "00000004d000000000000005303000009000000a1104000000000004d000000000000005b0300000900000070726576696f7573L8;FFe00700f9ff7f03a9ff7f06a9ff7f09a9ff7f0ca9ff7f0fa9ff7f12a9ff7f15a9ff7f18a9ff2302a9e87f04a9ff2305a9e87f07a9ff2308a9e87f0aa9ff230ba9BL8;", + "FF85fbff97b7010034610a40f9680240f91f0101eba0090054680640f9090180522a040091e00317aa6a0a00f909692138e10313aa78fbff97560300b4610a40f9L8;FF4a00018be003019141a30091e30318aa49110079480100f9e20f00f95a0e0094f56f44a9f95b45a9bf0a00b1c1070054600640f9f", + "be702a9f61f00f9bcc31fb8BBL8;FFe10314aa22008052230080522400805239e9ff97f4c340f9ebffff17e0c30591e10314aae20315aa230080522400805231e9ff97f4c340f9e8bb40f9080114cbL8;FFf7aa11911471099bf8032d913600805210000014e8f342f909068052e02bc33d6822099b69060", + "0910001803de02fc33de9f702f90005803de033c33d0009803dL16;FF2300805224008052a9010094780a40f9680240f9080118cbdf0208ebe9f6ff54e00313aae10318aae20316aa23008052240080529e010094780a40f9afffff17BBBL8;ZBL8;FF690200f96082803c680e00f9ff0600f1eb730054e0", + "1f40f9e10317aa22008052c57d00949a030014f6df44f9e04316910123009102738052c67d009498008052BL8;FFf44f43a9f65742a9f85f41a9fd7bc4a850feff17560014cbd50213ab82050054a9fe4ad30a0880522911c0da490109cbea0080523f1d00f129318a9a2a008052L8;ZFBBL8;FF090180d2", + "e8031faa0900f0f205000014090180d2e8031faa0900f0f229017fb24a1d409208010aaa69a200a92800805268020039fd7b45a9f33340f9ffc30191L8;FFf5031faa570080522a008092ff6300f94f010014e8bb43b9f6830d916b7e0e91ea4340f9c9b245b8770502f9689a07b9e86340f9f78324916a0", + "102f96a621e91L16;FFc8008052e0cf803de43f43a9e0cb44a9e37b42a94a0500141f0500b1003200546083c43c6183c53ce0831d916283c63ce8bb02f9e1c31591e06f813d6083c73cBBBBL8;FB2eed7623ac24c2a6615336201b10088004403c955af7ce03e701514dadae53dface7d673eb39f094784a", + "3c259e124f09a28c0000f136a7d456e2000006f0ebafL8;FFd08d00940009805241008052c98d0094005d00b4a00641adca0600d1e94b41f9a82240f9000401ada10240ad5f0109eb082000f9010000ad01fdff54f30300aaBL8;FFe10300aa3e000014c80080d2e0a33239e08332910800f0f2ffa73239e", + "85306f92b140094e80300aae85306f9e0833291e1feffd021401191a2018052e3feffd0L8;FF40feffb4e10317aae20315aaf60300aad00d0094e0030091e10315aa220080522300805224008052f55b00a9f50b00f9b7e9ff97e9a340a9ca05805281624039BBL8;FFf85f14a9f65715a9f44f16a9fd430", + "491480040f9f30300aae10700f9e80400b4490440f9e8a701a908008092e80b00f9bac301d11f0500b1a30c00b4880200f0L8;FF4a25019129194a8b29050091280108ab02080054691e40f9090100b4290140b22911c0da291540d2290d098b2925019129fd46d329050091280108aba2060054L16;FFe7", + "af02a9e9e700f9f7eb10a9e8bf00f9ee2b04a9fc4712a9f21314a9ecd705a9f5031eaaef8f00f9e61300f9f46300f9f03b00f9e54300f93cd4ff97e7af42a9BBBL8;FF0cf140f8a9831c78894a41b9aaa31c380a7141f8087d40393f010071afb31cf8aa831bf86901891aaa835cf88b4640f93ffd0371a8", + "031c38280080529f4600f9L8;FF0502805265690094e8eb41f91f0500b1e01b0054e002c03de8f341f9e9030b91e17740f92015803de89301f9a10000b4e07b40f922008052bf6d0094e9030b91BL8;FF880080d20800f0f2081900913f0108ebed160054e10314aae20313aa5e030094f50300aa1702001", + "43f0900b1401f0054e80741b23f0108ebe11e005481220091L8;FF30f7ff17e4f6ff97c1028052010000b900008092fd7bc4a8c0035fd6def6ff9781018052010000b9f35341a9f9ffff17e11703a9d4ffff97e11743a9e1ffff17BBL8;FF02faff17e043169122008052d7110094e1d342f94ef9ff17e04", + "31691e1031caae2031aaad1110094fcd342f9e8cb42f908011ccb5f0308eb492aff54e0431691L8;FFf70302911b0109aaa1035df8a10000b4b9835df8e00319aa22008052c62d0094f99f44f9fca344f9f8a744f9f5ab44f9e11b42f9ffe71639810000b4e01742f9L16;FF00e10191d3ad00948082c43c", + "8182c53ce0230b918282c63c883e40f9e1431291e037813d8082c03c02398052e13b813d8182c13ce23f813d8282c23ce027813dBBBBBL8;FBcf0000000500000061626f7274000000c91c40000000000048000000000000006e000000090000000000000000000000000000000000000001000000000000", + "00L8;FF2901084aab031738ab335738a9131738a94357384a01084a6b01084aaa231738aa5357382901084aab331738ab635738a9431738a97357384a01084a6b01084aBL8;FF00ffff9000601d917c11019400ffff9000c02e9179110194fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e00", + "30054e00313aa40000094080040b2L8;FF33c3ff97e08301b9a04700d130c3ff97e07b01b9a04700d12dc3ff97e07301b9a04700d12ac3ff97e06b01b9a04700d127c3ff97e06701b9a04700d124c3ff97BBL8;FF39031a8bb9031cf8ba835bf8e10b43a9e32340f9a0e300d1e40314aae5031aaae60319a", + "aacfcff97a8d37ca91f0900b121060054a1035bf8280019cb1f1d00f1L8;FFfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1404f803da90319f860420054e96301912083c33c2183c43c29610d912283c53cea670a91200500ad2083c63cL16;FF0081c03ce8ab45f9e9c301f91f0500b1e0df803da021", + "0054e0dfc23de9d345f9ea030b91e1e3c23de2e7c23de0630c914081873ce0dfc03de9b701f9e9c341f9BBBL8;FF950a40f9350300b4610a40f9680240f9960640f91f0101ebe00f0054680640f929040091e00315aa690a00f91c692138e10313aaadfbff97770a40f9680240f9L8;FFd6820991c022029", + "149250094080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f0008eb89190054e1431691880e0094e1d342f9BL8;FF22008052ccf50094613240f9c10000b4603640f922008052f30b40f9fd7bc2a8c5f50014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd0300910", + "10040f9L8;FF600a40f921cc749294020e917f7e00a97f7e01a9820a40f97f1200f9020f00b4620600f9420040f9620200f9530400f9620640f9530000f98f000014620640f9BBL8;FFc8f100b4e1ff47f92800805248030039280040391f050071c1f10054e0074091e14306910274805200800991f8074", + "09118830991c7350194e0074091e8431691L8;FFe8431a91a04700d1e9a704f969fdffb029211091e8a304f928008052e1032a91e95f05f9e94705f929fdffd029ed0a91ea9704f9ea832491e85b05f928fdffb0L16;FFe05f40f99c0000b4e1031caa22008052c9b50094e05b40f99a0000b4e1031aaa22", + "008052c4b50094e0874da9610000b422008052c0b50094e12340f9e90315aaBBBBL8;FB496e76616c696453657373696f6e4572726f720000000000c8e644000000000018000000000000000800000000000000cc63450000000000b062450000000000L8;FFe8031faa0d000014e00315aa8af1ff970800", + "40b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb296d0054170117abc2db0054BL8;FF396300916001005421835ff881ffffb4200340f922008052c7050194f8ffff17e8e322910081cf3ce8e344f93dffff17e88b40f9c80000b40805088be00314aaL8;FF294080520", + "8c100511f290071282080522831889ac8aa073715fd60d3bf9601f1eb279f1a53fdff17000180520108805259010094fd7bbba9f90b00f9f85f02a9BBL8;FFe0c30291e90f00b9e82300f9a0c9ff97e83340b9fa5b00f91f010072e83f40b908119f1a7f0700b160090054e0c30291e83f00b996c9ff97e8", + "1340f9e0230291L8;FFd60600f1b5a2019181ffff54682640f9c80000b4090d8052e00314aa02018052017d099bc4450094617e40f93f0400f18b000054608240f922008052be450094L16;FFe9a745f9e8ab01a9e8ab45f9eaa345f9e8a704a9e8af45f9e9b345f9e80b00f9e8b745f9e84300f9e8bf45f", + "9e8a706a9e9c345f9e8032b9108e10591e9af03a9BBBL8;FF88ffffd0083138918902805268a600a909008092690200f9fd7b46a9f33b40f9ff030291c0035fd6a8935db8a9c35db8a1a300d1abab7ea9e00313aae80b00b9L8;FFe20313aa630c8052f1f5ff9780f6ffb4a9ffff17e003082ae10314aae2", + "0313aa1ffdff97601a00b5a0f5ffb4a2ffff17898244f83f0500b1810000549fde04a9BL8;FF1f0500b1810000549f6200a99f7e01a9987e02a9e10314aae20313aa4af5ff97000100b454000014400800b5e00313aaaaf2ff97e80301aa80000036a80800b5L8;ZDBBL8;FF602e40f901f97fd342008052", + "ca250194683640f9a80000b4603a40f901f97fd342008052c4250194684240f9a80000b4604640f901f97fd342008052be250194L8;FF4524ff97e00313aae1031faae20314aa2300805224008052bd010094770a40f9680240f9080117cb9f0208eb69fbff54e00313aae10317aae20314aa23008052L16", + ";FF5f0009eb62070054c10a44a9e0230091e30315aa89fcff97caa500940004805221008052c3a50094a01000b4e0c3c03ce1c3c13c000400ad08048052602201a9" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines12 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines13.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines13.lean index 02c9ea43f..f408cedde 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines13.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines13.lean @@ -27,358 +27,250 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub13 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF1f01027161ffff543f010aeb082100546e0e09cbc8815ff81f0103eba2210054ed0329aa08090b9bef031faa081540f9f00308aa1002168a606a70fc00a8200eL4;FF08050091290040f9280800f92af3ffb4e4ffff17e10300a9e00301aae10308aa220080522300805224008052f403", - "0aaa20000094e10340a9ea0314aa2ba040a9L8;FF120000142000805268fe4ad309088052804e00a90811c0da280108cbe90080521f1d00f10831899a29008052280908aa932201a9f44f42a9f50b40f9fd7bc3a8BBL4;FFe20313aa24008052e88300390f0200943f9f019400048052210080523d9f0194", - "801300b4e08743adfa0300aaf3031faab5060011190480521b048052000400adL4;FFa80d0054010000d021c0029121d86678887c011b7f00086b8bfcff542100080b7f00016b2afcff54c11240f93fcc74f22001005434cc749288fe44d3080500d1L8;FF810100d021b81c91a40100b084e00d91a36300", - "91a2018052a80f00f98d9f00948d9f0094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9BBBL4;FF837400541803008bf9feffb50f0000141f0400b1e173005464df01941f10003161730054f9ffff1761df0194f70300aa1f0400b141fdff54e043059181008052L4;FBd40944000", - "00000004009440000000000740a440000000000ac08440000000000b1004900000000004800000000000000cf00000005000000b100490000000000L8;FFa07a00543f050071a1200154890080520a008092790a00f969220039e00308aa6a0200f9ff074091ffc30091f44f45a9f65744a9f85f43a9fa67", - "42a9fc6f41a9BL8;FF68220191c10200d021401891e40200d084800b91a363009102018052a80f00f98c5f019468420191c10200d021082991e40200d084000c91a363009122018052L8;FFdaffff17e00313aa220080522d030094610a40f9eaffff17fd7bbca9f85f01a9f65702a9f44f03a9fd030091f", - "30301aa210840f9f50300aa680240f91f0101ebBBBBL4;FFf6574da9fd7b4ba9ffc30391c0035fd6000400f00060139158ff0194ff0304d1fd7b0ca9f85f0da9f6570ea9f44f0fa9fd0303910950403929140037150440a9L4;ZFL8;FFf4030caaf7150094e10340a9ec0314aa2aa040a9290040f90bfc63", - "d35369283808050091280800f9cbfdffb43f0108eb93611932a00300540cfc6ad353692838BL8;FFe40313aab4831ff8927f019488620091010300d021403091a32300d1e2008052e40313aaa8831ff88a7f01948a7f0194f44f43a9fd7b42a9ff030191c0035fd6L8;FF947fff97888248f81f0500b1800", - "70054e11740f9e80f40f91f0101eb20830054e81340f92a0400918022029149018052ea1700f90969213825f2ff97e1630091BBBL4;FFe10315aa41310094f55343a9f72340f9f84f00f9bf0a00b161020054f8fe58d3880280d2e97e1053772200790800f0f2783201b8685200a908ff60d3694a0039L4;", - "FB4e00000000000000b904000017000000df7a4900000000004e000000000000005707000005000000df7a4900000000004e000000000000005807000005000000L8;FFe0030091b0320094e0430691e1030091023280524abf0094e1430691e00314aa026e805246bf0094ff031491f44f42a9fc0b40f9f", - "d7bc3a8c0035fd6fd7bbca9BL8;FF684e41b9090000d029a10b91f52705a9e96300918a0200904a610391a80319b8080000d008710c910b0000906b312e91e92306a9a9630091a07f0091e92b07a9L8;FFfd7b43a9ff030191c0035fd6e80741b2e0030091e80300f93235ff97e10300aa20008052fd7b43", - "a9ff030191c0035fd69240ff97fd7b43a9ff030191c0035fd6BBBBBL4;FFe00313aa9d100194e80300aae00301aae303162a88b70736c3fdff17fd7bbda9f65701a9f44f02a9fd03009148008052f50301aae10302aa000d002af30302aaL4;FF470f0094e0030c910eedff97e0830a9194edff97e8e340f", - "9880000b4e0875ba9220080523e0f009428008052ff0701f9e80b01f9ff0f01f9b70000b4e0db40f9L8;FF680200f9fd7b43a9f32340f9ff430191c0035fd6e91340f9ea2b40b97f7e01a9691200f96a2a00b97fb200397f0200f9fd7b43a9f32340f9ff430191c0035fd6BL8;FF289740f91f0500b1e101", - "0054e82300f9353b40f9345341b9285741b9e83f00b9b50300b54500001428008052e81300f9288f40f9e80f00f9289740f91f0500b1L8;FFf30300aa610100d021701b91e8030091e00309aa620180528d8f0094610100d021d01391840100b084c02f91e0030091a363009142008052b30f00f9858f009", - "4BBBL4;FFff1b00f9130200b4090040f9080840f91f0109ebea33899a08010acb2a0108cb6a020aeb68010054ea031faa0901138b0800001418018052ff6302a9ff1b00f9L4;FBc4149d8afc081a8924dda1938a4c17e19d149064a88a5511296483e2513ecce93c95a29a53dfeb393c25a28cea1bdc4d29", - "3c83e9000084d2fa23d4da034e301eL8;FFe80100d008c12591e8a303f9e00100b000003991e8ab03f9e80100d008e12891e1430f91fc3340f9e3031d9162008052f8eb01f9e9a703f9e9af03f9e8b303f9BL8;FFf65702a9f44f03a9fd030091350440f9f30300aad50100b4340840f9370040b9340200b", - "43a4f0194e00314aa21008052384f0194800200b4e10315aae20314aaL8;FFe103129120013fd6fbc342f97f0f00b1a106005488008052f43f42f9e8a3113929008092f53b42f9690200f9880240f9680000b4e00315aa00013fd6810640f9BBBBL4;FF18c1019278ffffb40803c0da0811c0da08f17dd30", - "80d7a92e80208cb01015cf8e1fdffb400815cf8220080523cef0194ebffff17750640f9950100b4a2260091L4;FB6f636f6c00000000ea984800000000002e000000000000006900000031000000ea984800000000002e000000000000006d0000000e0000007a94480000000000L8;FF9f3e00f91f0900f", - "1a1110054e00313aaffeeff9740010036210e00b5e0031faacfffff17e003082ae20313aa430c8052a1e8ff9740f9ffb4bfffff17a80640f9BL8;FFf44f41a9fd7bc2a8c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aae10200d021c42b91e8030091e00309aa02038052856f0194e", - "10200d0L8;FF1f0308eb48420054e8cf42f9e10319aae20318aa00011a8b496f00944803188bf90b40f9fa0740915a830991e8d302f97f0700b1fb0314aa806dff5440c30391BBBL4;FF0a0900b90900f0f2090100f9f44f43a9f51340f9fd7b41a9ff030191c0035fd6ff8303d1fd7b09a9f95300f9f85f", - "0ba9f6570ca9f44f0da9fd430291f30308aaL4;FFe90308aa08f97fd33f011ceba3ffff543f0144f136319a9aa90219cbc80219cb1f0109ebe8010054f70300aaf60315aa8002198be1030091e20317aa3d110094L8;FFf85f42a9fd7bc5a87da9ff17a50100f0a5000091e123009162c20791e0031f2ae3", - "031faab5af0094e8a34639a00100f000600091a30100d063e02391a40100f0BL8;FFe00313aa00013fd6210740f981fcffb4220b40f9e00313aae0ffff17e8ef42f9c80000b40805088be00314aa0201805201ed7cd33a2f0194e9c31291e8cf44b9L8;FF0a0900390c440c33090d00396a6d1c320a01003", - "90c050039cdffff17fb03002aa04302d1e10315aae20316aafef1ff97e0031b2aa88357f87f0302710801158bBBBBBBL4;FFa80000b4600640f901e97bd30201805243170294e00313aa0109805202018052f44f41a9fd7bc2a83d17021421010054810000b4601240f92200805238170294L4;FFe083089", - "17eeffe97e16b02f9e343139182018052e06f02f960620491e17302f9a10000d021103191bcf2ff9738170094800080522100805236170094404d01b4L8;FFf40300aaf30308aabf0216ebc1010054f50300b4890640f9e904003769d600a9290140b2680200d008411e91690e00f9680200f9f44f42a9f6", - "5741a9fd7bc3a8BBL4;FFe8d300f908008092e2830aadc082c53cc282c33ce353803de10308adc182c63cc082c73ce9bb00f9e10309ade23f803de0074cade9030091e33fc03deabb40f9L4;ZBL8;FF9497009494970094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e", - "90301aaf30300aa8101009021301d91e8030091e00309aaBBBL4;FFe10317aa2200805245d70194817e40f93f0400f18b000054808240f9220080523fd701945f03007197e20fa9e8139b9a978600f9961201b9951601b9888e00f9L4;FB62797465732d312e31322e312f7372632f62797465732e727300", - "2745787065637465642061206e756d626572206265747765656e203020616e6420362c20676fL8;FFf6bf40f9ec8740f9fbab40f9fab340f9e3e740f9e84740f9e0b3c23de0430f91e1031d91e20319aae3af03f9e8a303f9e86b40f9e04b823de0c7c33de8a703f9BL8;FF0969213821040091f47749f9e", - "1d302f99f0a00b1e14a0054e8cb42f91f0101eb00ba0054e8cf42f9290400911f692138e9d302f985ffff17f37749f97f0600b1L8;FFb9ffff17e1970cb9f2feff17e1930cb9f0feff1708018052ffeb05f9f6ef05f91f7f0aa91fff0ba9f6fb05f9e80706f9ff0b06f9fa0f06f901430291a22302d1BBBB", - "L4;FF08830191e10315aa161000b9085c00a9080400f008e136911f500039602201a9090d40f9e803009120013fd6e80340f91f0d00b100fdff54755a41a9e00740adL4;FB6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f74696d657374616d702e7273002f636172676f2d746172", - "6765742f616172636836342d75L8;FFe2ffff17880248f81f0500b1a10000549f6608a99f7e09a9997e0aa99fb200b981020291e20313aaecfaff97c00600b5e1031faad5ffff17880240f91f0500b1BL8;FF44770194201a00b4090300f02989099168ae8c52200540adc88dae72084000b9880880520a0", - "08092680201a9000400ad220141ad681200f968008052695b0091L8;FF00c0359118e1079108e10791aeeaff97e0074091e1074091023280520080019121c0359146770094e00fc43de113c43de0074091e82b48f9e20bc43de1074091BBBL4;FFe1a30091e81f00f956a3ff97e11f40f9e81740f91f0101", - "ebe0120054e81b40f9090380522a040091e003142aea1f00f909692138e1a300914aa3ff97f41f40f9L4;ZDL8;FFe80b40f980a2c03c81a2c13c0801018b000500ad288000910500001496008052e80b40f916693538a8060091e083c03c6002803d680a00f9f44f44a9f65743a9BL8;FF080140b20811c0", - "da081540d2080d088b0825019108fd46d308050091091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140b26b11c0da6b1540d2L8;FF608652ad08010090629ec03df5830d91600500ad6209803d08b140f9080600b4640247a9e8430f91e1032a916382039122008052ac98fe97fceb41f9a", - "0c2c73cBBBBBL4;FF684240391f050071e1200054600640a9290400902961199108040091200540ad680200f9e8430091e00703a9e0430091028100916100805223008052e08700adL4;FF13640039f44f42a9f65741a9fd7bc3a8c0035fd6000180520104805258070094fd7bbea9f30b00f9fd030091f3", - "0300aa37070094000280520101805235070094L8;FF21401691a9831ff8430200f0637c1691460200f0c6c01591a52300d1e00308aae2018052a400805292070194fd7b42a9ffc30091c0035fd6410200f021601891BL8;FF695241b969010034290140b22911c0da291540d2290d098b2925019129fd46d", - "329050091280108ab830000545b000014e80308ab220b0054695641b969010034L8;FF5800805257008052500080524f0080524e0080524d0080524c0080524b0080524a00805249008052a8fe41d3eaff06a9ecff09a9e8a704a9ffa305a9e8af07a9BBBL4;FFc0035fd6e8cb41b91f05007181030054e8", - "cf41b98c9740f98d8b40f989a340f9eed341b9ebd741b91f190071eb5f00b94c0100541f050071e00400541f090071L4;FB722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f73657373696f6e5f6d616e6167656d656e742e7273000a64656372797074656420c0L8;FFe91f5e39", - "6481cb3ce0d7803d410146ade85744f9f40315aae60309916381cd3cfb6b00f9ef0314aae10319ad6081cf3cecd343f9e8a301f9e86b44f9f2b743f9BL8;FFfa2f0094a8035ef8b7031ff8140117ebe3070054b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcb9f", - "0208eba8040054L8;FF29050091280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6BBBBL4;FFe10314aa2200805245e7019448008052a00302d1e3830291e10315aa0204805224008052e8830239084a", - "0094a82240b91f05003120290054600740ad1c050011L4;FB000000000000000008000000000000000800000000000000804c420000000000000000000000000008000000000000000800000000000000a07d420000000000L8;FFe1000054ff7f01f9fc8301f93fff04a9fc8f01f9ff9301f9ff2b03b921", - "e30091a2c303d118efff97e00100b4c0010014e86341f91f0500b1e1000054ff6301f9BL8;FF5767019420008052e10315aa51670194ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aae102009021e01d91e8030091e00309aa0202805284670194L8;FF680e40f9480100b40805088be00314a", - "a01f17dd302018052f44f43a9f70b40f9f65742a9fd7bc4a83d670014f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6BBBL4;FFe00316aa1a0000141f09007161010054090180d288de78920900f0f2290140b20b000014090180d2e8031faab4fe48d30900f0f206000014090180d2f4031faaL4;FFfd", - "7bbba9fd030091f30b00f9f303012ae22700f9e20300aad300303720201212040080d200600a121f10507101010054e44b40b9e1030191e3430191e0008012L8;FFa0c303d12103088ba2f314384ca70094f90b40f9b5c303d125000014e10f40f9820108cba002088b198100d1b3c303d13400028b42a70", - "094a80357f880030191BL8;FF6102005428008052090000b029910991e8730039e87300910010c03ce82702a9a88300d1290000d029413191800200b000a43791e82703a9e8030091e1830091L8;FFfb0f00b9f96301a9f75b02a9f54f03a9937e089b3e270094e00313aa010180523c270094a0831df820", - "1100b4080d8052b3835df8fc031faa887e089bfb0314aaBBBBBBBL4;FF150c40f9e9430091e22701a9a80201ab020f0054170440f9f30300aae9060091ff2200f129fd43d32af17dd3490109cbe932899a1f0549ebe90900542a050091L4;FF23f9ff97f80740f912000014600bc03de00f803de14740f98", - "10000b4e00316aa220080523e1b00941a0080920a0000141a008092e01fc03de013803da003983cL8;FFf65741a9fd7bc3a891feff17480014cb160113ab62010054e00314aae10302aae20313aa401b0194b65200a9b30a00f9f44f42a9f65741a9fd7bc3a8c0035fd6BBL4;FF7b031e4afebf40b9fb621", - "f38fb925f3808011e4afec340b9e8721f38e8a25f389c031e4afec740b9fc821f38fcb25f387b031e4afecb40b9fb921f38fbc25f38L4;ZFL8;FF21010054a10100902114139142038052819b0014a101009021801291a20480527d9b0014a1010090217c1391a2028052799b0014ffc300d1fd7b02a9fd8", - "30091BBBL4;FFe10b40912273c13d28835839c0020291e01f883d2077c13d21c00091e97b50f9ea7f50f922008052e013883d207bc13de123883d217fc13de20f883de29fc93dL4;FB64756e657870656374656420656e642067726f757020746167696e76616c696420737472696e672076616c75653a20", - "64617461206973206e6f74205554462d38L8;FFee8b42f9e28f42f9e4a342f9e89700f9e82742f9efaf42f9edbf42f9e0cb42f9f2db42f9e8a71aa9e92b42f9e82f42f9e9a309a9e83342f9e95b42f9e8df00f9BL8;FFe04f813d6082803c680200f9ff0600f1cacbff54fb010014f7e74df9e8074091010", - "3198be00317aa08812f9173d30094e8f34df91f0900f160220154e0074091L8;FFa8c301d1090000f029913e91e82b0ba9e8430091e8270ca948008052290100b029013091ea430191a8273da9280100b008591b91a82b3fa90a078052c8048052BBBBL4;FFbf0208ebc1010054810740f9e00640f9e2031", - "5aa58fb019420010035e8624039896340391f01096ba100005469237da9df0208eb200349fa00030054e93b41a9L4;FB7372632f7261772e7273003e696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a20696e76616c6964205369L8;FF480740f91f0", - "11ceb49600054e00313aafffaff97a0fc073728fc60d3086000b5200840921f1800f122600054287c0353486000343f8001f182fdff5408050051BL8;FF605a40f922008052457b0194745600f9f44f41a9fd7bc2a8c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091e90301aaf30300aa01030", - "0b021a01f91L8;FF24008052f791ff97e11740f984fcff17e0630091220080522300805224008052f091ff97e11740f996fcff17e0630091220080522300805224008052e991ff97BBBL4;FF7506f8b63f2c00f1880000540800018b08f1df380864f837e80300aaa06301d1e20314aa01050091d6240094", - "a8835ab868040036b5035bf81e00001434bb0194L4;ZBL8;FF6102c03dd53200f9e82f00f9680a40f9e083843ce09340ade82300f9e10f803dc20200ade30342adc40601adc30202adb40000b4601e40f9e10314aa22008052BL8;FF29210054f30b40f9fd7bc2a8c0035fd6e80300aa098d40f83f0500b1", - "201a0054f30300aae00308aab3020094e80300aae00313aa090140b22911c0da291540d2L8;FF4100001448431c2afa0314aaec4f40f9f4ab4aa9f50316aa088308aaf86340f9f9030891bb0300141f150071e01000541f19007101120054607e42f9618242f9BBBBBL4;FF6a0a00f909692138e10313aa5", - "5f7ff97770a40f9680240f9080117cbbf0208eb68220054680640f9e10316aae20315aa0001178b420b0294e802158b680a00f9L4;FF28008092680200f9f44f49a9f54340f9fd7b47a9ff830291c0035fd6a003df3ce10bc03de91b40f9e10740f9680200f9600a803d6182803c690e00f961feffb4L8;F", - "F42801191e003132aba0b0194f44f41a9fd7bc2a8b80b01140001805201018052570b0194fd7bbda9f50b00f9f44f02a9fd030091f40302aaf50301aaf303002aBL8;FF8a0640f9490108eb430a00548a0240f9e00740f94801088b882600a908fc60d3080500b5020840925f1800f122050054017c03534", - "1050034e0430591a32300d1L8;FFf30300aae0430a91b8d4ff97e00313aaf34f41f9e2ffff1733008052590d00b43f0700f1c02300543f0f00f1210d0054378b00940009805201018052358b0094BBBL4;FFfa0300f942cb0194e00317aa210080523a0080523fcb0194e0feffb4e92740b988008052b703", - "3da90811092a29008052a9031ef808000039e0830191fb610094L4;FBd5184900000000006a00000000000000ca0000002e000000000000000000000008000000000000000800000000000000e0f94500000000000000000000000000L8;FFe00317aa0fc7ff9708008092750600f9686a01a903feff17e1", - "e741f93f0400b140010054810000b4e0eb41f9220080523bcb0094e1f341f9810000b4e0f741f9BL8;FF81ffffb4e00240f922008052444b0194f8ffff17d50000b4a806158be00314aa0201805201f17dd33d4b0194745642a9950100b49622009104000014b50600f1L8;FF0a1040f9ec031faaeb0309a", - "a4a4100914d8541f8ae0140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191ad194e8bbf010cebe30100546b0500f1ec030daaBBBBL4;FFe10317aa080102ab2935899ae82715a94deb0194e0430291e102148be20318aaf83f043946eb0194e83f4439f503082a08108052020115cb740302ebc30b00", - "54L4;FB704d420000000000000000000000000008000000000000000800000000000000704d420000000000000000000000000008000000000000000800000000000000L8;FF2a040091e00316aa6a0a00f909692138e10313aa8febff97780a40f9680240f9080118cbdf0208eb08080054680640f9e103", - "17aae20316aa0001188b40eb0094BL8;FF476b01941d0000143f0800b1400300543f0400b1200a0054e85340f9fc0301aae14740f9fa0300aae80f00f9e85f40f9e85f02a9e9235829e80f00b9e85f5929L8;FFc0035fd636008052765200a9771200b9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd62", - "0008052e10314aa546b0094ff0302d1fd7b07a9fdc301916a2440a9BBBL4;FF3f1f00f1a8010054e08744ad80020191a18301d122008052a0073dade08b45ada00b3ead71ab019400e4006fff6300f9e08304ade02f803d08db77d3e08744adL4;FF4a118f9a1f02206a101c0653e2179f1a527e65d30f1c", - "05530201020a5f000e6a0e02110a31017eb2508a03aa2912899a114c1353ef01010a0e010e0adf010d6aL8;FFe85700a9ff2301a9c88640b8e07f02a9a8080036fc031faaf7031faaf8030091190380523a0080520c000014e81340f9a003dd3cf70600918823199ba9035ef8BL8;FF2083c33ce85f04f9e", - "9671f91a80359f82183c43ce5432591c082833c2083c63ca68302d1e87704f9e85b44f9a70302d1c082863c404fc03de203182a2283c53cL8;FFe80356b9e00740918100805200001891ff0316b9e85b00b9752a0094e80356b9e00740918100805200001891ff0316b9e85700b96e2a0094e80356b9e007", - "4091BBBBBBL4;FF7361193220030054536928380bfc71d308050091290040f9280800f9abf6ffb43f0108eb93611932400400542c0440f90afc78d39369283808050091280800f9L4;FFe17742f9e8431391d9e9fe97e84353391f05007141890054e86353391f050071ac99005448b70035e90f41b2c205", - "0014eabb40f938fd78d35a7c085348fc60d3L8;FFc0035fd609fc58d30afc50d30bfc48d30cfc70d3000d00390901003909fc68d30a0500390afc60d30911003909108052293408330b0900390bec78d30a150039BBL4;FFaa831df8aa6301d1eaa706a9a9a300d1e9a307a9e8a30091a3831af86f930194", - "740a40f9680240f99f0208eb61000054e00313aace92019408038052690640f9L4;ZDL8;FF290140b22911c0da291540d2290d098b2925019129fd46d3290d00910a0300344a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a05009111000014BBBL4;FF9802158b8ac20191190e8052ff7f01", - "a9f70300a9fa030aaaf5030aaa5b0f59f84083c23c4183c13c4283c03c7f0700b1e18301ade20b803d4a3740f94083c53cL4;FB0c36e3244eb67cbdd768ff92a0035f2ac6a51ca82011eec4a26d12210932fd6eb394c1276d9a0a18af863985fcd632f50000bd7ecd09206045036f2e47ac3eabL8;FFfb5b", - "44f9f66344f9ef6744f9ed6b44f9e9ab00f9e9db43f9fa6f44f9fc7344f9e77744f9e07b44f9e9ab1aa9eadf43f9e9e343f9ee7f44f9f58344f9eaa709a9BL8;FF4f5301944803188bf90b40f9fa0740915a830991e8d302f9f88b49f9b80300b4e1d342f9e8cb42f9f98749f91f0101eb40430054e8cf42", - "f9490480522a040091L8;FFe137c13de063813de89305b921418e3c76000014e89340f9e82000b40805088be00313aa0201805201f17dd352f8ff17f96f41f9eac31791f5e3573940c1c03cBBBBL4;FFe93700f9cfffff17e92b40f93f0500b18100005429008052ff3300f9ff2705a9e1430191a20301d1", - "e003082a07ddff9740f9ffb464000014a20301d1e003082aL4;FB6c662e6c656e28296c656e67746820636865636b6564206f6e20696e697469616c697a6174696f6e6c69627369676e616c5f70726f746f636f6c3a3a67726f75L8;FF0900f0f2e8270039e90300f9e003009134e9ff97f44f47a9f92340", - "f9f65746a9f85f45a9fd7b43a9ff030291c0035fd6170080923800805206000014e003082aBL8;FFe30200f063043191a0e300d1020280522402805212000014a0831cf8e10200f021601f91e30200f063082991a0e300d1020280522401805209000014a0831cf8L8;FFe19b49f9810000b4e09f49f9220", - "0805243730094b30000b4e07b49f9e10313aa220080523e730094e18349f9810000b4e08749f92200805239730094f4ab49f9BBBL4;FF340080399400f8b728040091490400d1110000145f2800f1880000542800028b08f1df38e806f837a06303d1d51c0094a88352b868110037a88353f82a0340f9L4;", - "ZBL8;FFfc6f4da9fd7b4ca9ff830491c0035fd6ff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091f403032af30300aae20000b5d400003528008052BL8;FF402f003728fc60d3c81400b5200840921f1800f102150054217c0353c11500343f040071200100543f08007141fdff5401a", - "30491a22302d176ebff97602b00b5L8;FFe84305f93729ff97e10300aae14305f9e0032a91e100009021843d9102028052e300009063c43d9104028052c9000014c80080d2e0232a39e0032a910800f0f2BBBBBL4;FF6a010c8b08cdc9ca4bc1cbca69adcb9329bdc8ca08010a8b2981c8ca200108cafd7b", - "45a9f33340f9ffc30191c0035fd6ff4301d1fd7b03a9f32300f9fdc30091L4;FFfb0316aaf62f40f93a008052b70100b510000014280400d11f0900b162000054220080523e030094e80600d1fb0316aaf62f40f91f0900b15a008052a2000054L8;FFf30b00f9fd03009101c840f9f30300aa810000b460", - "ce40f9220080524003019461d640f9810000b460da40f9220080523b03019461e240f9810000b460e640f9BL8;FFe92300910a0000b04ad11991e8a700a9020300d042b43f91ea0f00f9e34300915c830194fd7b43a9ff030191c0035fd6202040a9210300b021fc2a91030d40f9L8;FF6b2501914a194b8", - "b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500542a0140b24a11c0da4a1540d2BBBL4;FF2200805246c30194f8ffff17e8bf42f9c80000b40805088be00315aa0201805201f17dd33ec30194e00314aae8abff97880300f008dd3c910905805", - "2682601a9L4;FB6e4d6573736167654c656e677468546f6f4c6f6e6753657269616c697a6174696f6e496e76616c69640000000000000079684900000000004a00000000000000L8;FFe10b19aded7300f9ed6f40f9e0c7803df9bb48a9fe030daaf56b00f9f503082a08018052edfdff1719df78b3f5774", - "0f99f0700b160020054970100b4b4220091BL8;FFe10313aaf2fcff9775fdff34610a40f9680240f91f0101eb60020054680640f9090180522a040091e003152a6a0a00f909692138e10313aae5fcff97f4fbff35L8;FF85830091e00316aa060480529598fe97facb40f9e86346395f0b00b161100054f7", - "430f9108150036c08641a9a90302d1e8430f91a20302d12401019103048052BBBBL4;FF390300eb63f400541803008bf9feffb50f0000141f0400b1c1f3005463e301941f10003141f30054f9ffff1760e30194f70300aa1f0400b141fdff54e0430591L4;FB656450656e64696e674b796265725072654b", - "657963697068657274657874656e6372797074696e76616c69642073656e64657220636861696e206d6573736167L8;FFe98b01f98083803cea6f01f9e86301f900300094e8cb43f96083c03ce9d743f91f0500f1e0d7823de9b305f9412e0054e0d7c23de8b345f909008092e0030b91BL8;FF546301942", - "0008052e10317aa5163019420008052e10319aa4e630194fd7bbea9f44f01a9fd030091f303012af40300aa37630194000280520101805235630194L8;FF680a00f9081340f9e00316aae10315aae2031faa00013fd6e0031faaf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a3", - "00a96240ff97BBBL4;FF090440f93f8131f181060054010040f9f30308aae28b815228144038e8030039e8030091000140b245a3019488064039810a0091e2c38052e8833139e8833191L4;FF81fc41d380030054007f1c9b034000917f0001eba918005486761e53c67c4093c5021091a31e00517f7c007", - "1a1404e3948030054a3c0238b69404d3968c04d39L8;FFf31300f9fd430091e90301aaf30300aa810100f021bc1691e8030091e00309aae20080528aa3009468c20091810100f021481491a40100d084600991e0030091BL8;FF42c83791e02700a9e3030091e00308aa60230194fd7b41a9ff830091c003", - "5fd6ffc300d1fd7b02a9fd830091080000900851109109600091e02300a9200440a9BL4;FFd7ffff173f00156b81f7ff54680240f9e0031faa090540f90a0140f9290100cb4a01008be0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6L3;ZBBBBBBBBBL4;FF0a00669e2a0300b44901", - "c0da2911c0da080d498b0901148a286be9388803f836e80333aa2a2100d10bfc79d301551b9be80329aa4a01148aec0600d12b6b2938L4;FFa003df3cb6835ef8e00f803d5bff48d357faffb5d5ffff17fa031f2a688240a915d940a976f5fe97a1033da900a30091a3c300d1a1031ef8e10315aae20316a", - "aL8;FFe00316aa0103805202018052680200f9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a83e1d01140001805201038052531d019482faff978002009000e01c91BBL4;FF23008052240080525990ff97f94f42f9f84b42f9b3ffff17400300f000181e91420300d042401a91610280524a9d0194600", - "300b000c025913c9d019420008052L4;FFbf3b03d5a200f837430180520600b012e50701320a000014634006917f0c0039faffff170200060be103002a07000014bf3b03d5630400714001005440ffff37L8;FFa80f00f9939d009468620091810100d0215c1491a40100b084e00991a363009182008052a", - "80f00f98a9d0094810100d021f01b91a40100b084a00391a3630091BBBL4;FF6cdd019440340035e85341b9e81f00b957ffdfc8770000b565dd0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd6L4;FB3a000000000000003909490000000000490000000000", - "00006000000039000000390949000000000049000000000000006a0000002c0000003909490000000000L8;FFe82f04f9e83b40f9e83304f9e84340f9e83704f9e82340f9e83b04f9e83740f9e83f04f9e82743a9e84704f9e87b40f9e94304f9e84b04f9e86340f9e84f04f9BL8;FF435d0194000880522", - "1008052415d0194c09701b4a10241adf40300aaa20e40ad010001ad020c00ade007409100800991995d0194f70300aa355d019400908052L8;FF960640f91f0101eb20080054680640f9490380522a040091e00315aa6a0a00f909692138e10313aad1faff97770a40f9680240f9080117cbbf0208eb2807", - "0054BBBBL4;FF8901098a19150acb0901098b38210039a92240f928010bcba82200f928008052365f3c293fa33ea93f831ff8a82640f908050091a82600f929237fa9750640f9L4;ZFL8;FFa2018052e400805209000014e00300f9410200d021641991430200d063801591e0030091a2018052040180526", - "ff2ff97e10340f9e00301aaf44f45a9f65744a9BL8;FFe00308aa82028052fd7b42a9ffc30091817d01140920009121030090216033912403009084e03291a32300d1e00308aa22038052a9831ff87b7d0194fd7b42a9L8;FF1f0101ebc0680054e81340f9090180522a040091ea1700f909692138e16300", - "918c7dff977f0600b180000054e1630091e00315aa7390ff97df0600b120b1ff54BBBL4;FFfd7bc1a8c0035fd6a00300900000139149bd0194a003009000a0129143bd0194a00300900060139140bd0194ffc304d1fd7b0da9fc6f0ea9fa670fa9f85f10a9L4;FBb06548000000000010664800000000008", - "4f347000000000028000000000000000800000000000000a864480000000000fc6448000000000018f4470000000000L8;FFf39340a9e0031f2a2500805206048052e30313aabbbd0094e10340f9810000b4e00313aa220080523dbd0094f44f46a9fd7b45a9ffc30191c0035fd6ffc302d1BL8;FF853d01", - "14080040f9e20301aa002140a9e10308aa8d3d0114281040b9000040f96800c8376800d0376f3d0114833d0114833d0114000040f9fa190014000040f9L8;FFa2008052840180527832ff97e00740f941feff17c80080d20800f0f20809009147ffff17ff0301d1fd7b02a9f44f03a9fd830091480001aba", - "2020054010840a9BBBBBL4;FF22008052230080522400805258000094610a40f96ffeff17e00313aae10317aae20315aa230080522400805250000094770a40f9680240f9080117cbbf0208ebL4;FF470d0094e2af58a9ef031caaee0317aafcdf5aa9ea0316aaf0031aaaed0318aaec0319aae1cf40f961", - "0300b4e0d340f9e2c700f922008052f6030baaf9030caaL8;FFdf0202710801148ba3feff54e90f80123f002071ea0f801229140033c20000542a7c0653090500394a051a320a01003912000014eb0f80122c7c10532b2c0633BL8;FF682603a9686604a9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a", - "9fd7b47a9ff430391c0035fd620008052e10317aa488d019420008052e10319aa458d0194L8;FF810000b4601240f922008052448d0094611a40f9810000b4601e40f9220080523f8d0094b40000b4600640f9e10314aa220080523a8d0094e00313aa14008092BBBL4;FF240080525ac0ff97f82740f9d7", - "feff17e0e3009122008052230080522400805253c0ff97e12740f904ffff17e0e30091e10319aae20317aa2300805224008052L4;FB8e194900000000005700000000000000f00000003d0000008e194900000000005700000000000000b80000001f0000008e194900000000005700000000000000L8;FF", - "ff0324d1ff0300f9f30308aa090040f93f0900b181010054080080927f220039680200f9ff032491f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8BL8;FFe8430691e0c30e91808506ade083cb3cc1e20091e2430e91fa030b91808907ade3838b3ce3838c3c6b80ff97e89341b9080e003620", - "07c03de9b341b92143c23cL8;FFe10314aae20316aaf70300aa4c4d0094591740f9b7831ff8190400b4541340f93b4d0094e00319aa21008052394d0094a00900b4e10314aae20319aaf50300aaBBBBL4;FF682e00b9690200f96a0a00b9f44f45a9fd7b44a9ff830191c0035fd620008052010480524bed", - "0194ffc301d1fd7b02a9f91b00f9f85f04a9f65705a9f44f06a9L4;FB746564204b454d206b65792074797065203cc32000806904000d3e20286578706563746564203cc3200080690400023e2900746f6f2066617220696e20746865L8;FFe80300f9210200d021541b91230200d063481491e0030091e2", - "008052a400805221000014e00300f9210200d021541b91230200d063fc14910f000014e00300f9BL8;FF600640a9e8130091e9230091eaffff904a611f91e20200b0428c1091e3430091e8a700a9ea0f00f95a6d0194edffff17ff8300d1fd7b01a9fd430091e80301aaL8;FF30110094fad342f9e8cb42f", - "908011acb1f0308ebc9000054e0431691e1031aaae20318aa27110094fad342f9fc0740919c830191d7fdff17e043169122008052BBBL4;FFa8031b78bf731b381fb300b8ba035bf8e4feff17e8031faae93200d103000014e8031faae92a00d18a1f4092a00301d108010aaaa9233ca92896ff97680300f", - "0L4;FF340100b4e00314aaf50301aaf60302aa6b060094600100b4e20316aae10315aa0200001420008052f48300a9ff0f00f9a2000037e0230091ad000094c0010034L8;FFa0024079e103132a1f050071e1f9ff54e2031f2aea06009408fc78d309fc60d3287b68782821084a095d1053295b697820010", - "84aa0020079a8ee5f78d60600f1BL8;FF472d019453010014fc831291e8db42f9f90316918043c03df7cf42f9fbc742f9f5cb42f9e0e31b9181e200910227805220af803de82304f9412d0194f63f42f9L8;FFe0fbc33de1ffc33de8e20891e0833f91000500ad6e2d0094e88340f90aad41a90961019100", - "81c23ce97f01f9e9a20991ea6f01f9e02b4fa9eb7301f92001803dBBBBBBL4;FFe8ab00a970f20094a8831ff8a84300d1490100d029f117914004009000b40791e8a700a9a82300d1420400f042a00391e1230091e8a701a94715029440040090L4;FFe8830c91e50313aae35f813de253813de16f813de4", - "6b813de067813deb0300f96ee6ff97e043139165f3ff9785000014c022009116f3ff9708008092880200f9L8;FFaa9ad2f2ead7faf22a7dca9b4bfd57d30ad092520a13a0726ca50a9b092040390a2440392a151833c90180521a0000140b0040390c044039edf99ed26d6abcf2BBL4;FFa402188be1031f", - "aae30316aae08300ad7ae0ff97e0074aad480300d008011e91e25bc03de34fc03df5c3009189028052e0c30091e08704ade08747ade22f803dL4;ZBL8;FF080c43f81f0900b1010b0054f3031faa64000014e80300aa098d40f83f0500b180160054f30300aae00308aa74feff97e80300aae00313aa0901", - "40b22911c0daBBBL4;FF2b0000141f0800f1615c0054b58355f8bf031fb8bfe33da9a20640f9bf831ef8625d00b4a10240f920008039600cf8b728040091490400d170000014c1b20191L4;FB56315f4d4c4b454d3736383a41757468656e74696361746f722055706461746500000000000000000000000", - "00000000000000000000000000000000000000000L8;FFeef347a9fadb4aa9e9474ca9f44b40f9e22f40f96d070014f7030caaf6031f2a20844eade0032b91e17700f902328052e0af833d20884fade1b3833de0b7833dBL8;FF0900088b390500913f0308eb681f005431010014e1d342f9e8cb42f91f01", - "01eb00750054e8cf42f949068052f4074091948209910969213828040091f68b49f9L8;FF28008052e81300f9f32b41f9e83341f9f92700f91f0500b14167ff547bfbff1728008052e80b00f9f9d740f9e98b42b9e88f42b9fb2300f9e9230729b968ffb5BBBBL4;FF5ef50194ffc302d1fd7b07a9f85f08", - "a9f65709a9f44f0aa9fdc3019109e04039f30300aaf40308aaa90100343f0d00714108005460a242a9090d40f9e8430091L4;FB696e6765727072696e747376657273696f6e6c6f63616c5f66696e6765727072696e7472656d6f74655f66696e6765727072696e7453656e6465724365727469L8;FF38eb", - "ff97e10300aae10300f94102009021c81b914302009063d01391e0030091420180524400805270eaff97e10340f94fffff17c90080d248008052e0230039BL8;FFfd430091e90301aaf30300aa0103009021f42691e8030091e00309aa620180528b75019468c200910103009021202791040300f0842013", - "91e0030091a3630091L8;FF8c2501918cfd46d38c05009102000014ec031faa8b010b8b2801088b49010b8b0801098b090140b22911c0da291540d2290d098b292501910819498b14050091BBBL4;FF8182c73caa8302d1890246f8888248f85f8300f14081823c4181833c800642ad696b00f9090480524", - "88104f85733899a600702ad608705ad628346ad620303adL4;ZDL8;FFea0f00f92a1f40f9081109cbea1300f9362b42a97401088bea0b00f9ab831ff8e90700b46901088bf91b00f9f9031faae90700f9b8db3da9b5831ef87701198bBL8;FFe1e7c23d00818d3ce0d3c23d01818e3ce1d7c23d0081893c0", - "1818a3ce92344a9fc7b06f9fa7f06f9e85306f9e95706f9e85b06f9e92347a9f98306f9fb8706f9L8;FF49008052f79304f9f69704f91f010071fc9b04f92801881ae9b340b91f01096b41050054e39349a9e0830991e2cb41f9e5734e39e1832491260080525df0ff97BBBBBL4;FFf60317aac28e40f8a2", - "0800b4e10240f9200080398000f8b728040091490400d1110000145f2800f1880000542800028b08f1df388806f837a0c300d1d16e0094L4;FFf90f40f988ffff17e023009122008052230080522400805226e6ff97e10f40f98effff17e0230091e10318aae20316aa23008052240080521ee6ff97f80f4", - "0f9L8;FF47050114f44f42a9f50b40f9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091080040f91f0900b1a1000054f44f42a9f65741a9fd7bc3a8c0035fd6BL8;FF8104805253850194200080528103805250850194fd7bbca9f70b00f9f65702a9f44f03a9fd030091080840f9080100b409", - "0140b22911c0da291540d2290d098bL8;FFb38319f87f0208eb01e6ff54a0e301d1958400942dffff17a02301d1e1031faae2031caa4300805244008052ed9bff97a84f7ca9e80b00f980ffff17e82740f9BBBL4;FF1f0700b120030054a8035ef81f0116ebc0130054a8835ef8ca060091a18300d1e0031", - "8aa49038052aa031ff8096936384cb1ff97b6035ff8a8035ef8080116cbL4;FB120000000000000013000000000000001000000000000000160000000000000073686f756c64206f6e6c79206661696c206261736564206f6e2073697a65732cL8;FFe20357ad69520678e9bb41f96d6602a9020104ade00", - "758ad7e1a00f972c604a9000505ade00b56ade1d7c03d638201397b1206b8000903ad68ff70d36112893cBL8;FFe80700f907000014c90080d248008052e04300390900f0f2e8470039e90700f9e02300912f3b0094f44f4ea9f95b40f9f6574da9f85f4ca9fd7b4aa9ffc30391L8;FFfd7b47a9ff030291", - "c0035fd6ff8301d1fd7b03a9f52300f9f44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054080200341f05007141030054BBBBL4;FFe86f06a9e803009009c53b91280e8052ff6f03a9e92308a9c80300f009d5059188068052fc7f04a9e92305a9fc6b07a947e50194e3ffff17f5031fa", - "ae00315aaL4;FB6f723a20c000234275696c64696e67205072654b6579576869737065724d65737361676520666f723a20c0102077697468207072654b657949643a20c0152028L8;FF47000014680240f9897e0753bf0208eb3761193261000054e00313aa92e40094680640f99f0248f117693538d50a0", - "091750a00f9c200005494fe4ed3680240f9BL8;FFf44f02a9fd030091140440f9280440f99f0208ebc1010054f40100b4150040f9360040f933008052a8164038c91640381f01096be0179f1a53650194940600f1L8;FF220080524665009461da40f9810000b460de40f9220080524165009461e640f981", - "0000b460ea40f9220080523c65009461f240f9a11100b460f640f989000014BBBL4;FF173040b9f50300aaf30308aab7060034e80240b20811c0da081540d2080d088b0825019108fd46d308050091b60a40f9f60500b4c90240b22911c0da291540d2L4;FF82c05fb85f1000f188000054000080d21f000", - "039007d20d486b05f3886000034000080d21f000039007d20d4860000cbdf0002eb82000054000080d21f000039L8;FF21002e910204805283a500141f0d0071600100541f11007121020054a10100f021140691820780527ba50014a10100f0212004912203805277a50014a10100f0BL8;FF09010039c0", - "035fd636000014fd7bbfa9fd030091330000941f1c0072e0079f1afd7bc1a8c0035fd6ff8301d1fd7b04a9f44f05a9fd030191f30301aaf40300aaL8;FFe8030e91e04309916d250094e8c30991e0030e916b250094e00741ad9ffe00f1f8430a91ffaf01f9ffab01f9e18318ade00740ade18319ade0875", - "3ade08714adBBBBBBBL4;FFf44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054080200341f05007121030054000180528d000014280180d20800f0f2081d00d18e000014L4;FF16110094e0630091e10316aa12130094e1030091e2630091e00315aa76f4ff9728008092290080528802", - "00f969520039f44f45a9f65744a9fd7b43a9ff830191L8;FFa2010054e80f00b9e3430091e00313aaf65701a9e10314aa620200f042c40b91f0ffff17e00313aa610200f021582091cfffff17e8230091e3430091e00313aaBBL4;FF08008092680200f9f44f48a9f65747a9f85f46a9fa6745a9fd7b44a9", - "ff430291c0035fd6687e00a9f8ffff17ff0302d1fd7b04a9f72b00f9f65706a9f44f07a9L4;ZFL8;FFe00314aa22008052080d17aaa0073ead080dc0daa88318f8a2837bada2033fad7299009400e4006fbff31838b0c302d1a8277229aa2f7329ac377429a0033eadBBBL4;FF6c06005448070035e90f41", - "b2410000147f020079fd7b47a9f34340f9ff430291c0035fd6a8135db8a9435db8ab035f38aaa35db8ac835d78e83300b9a8e35d78L4;FB676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f6c6962L", - "8;FFea0740f9fb0f5ca9f04340f9ef3b40f9f56340f9edeb40f9e0bf40f9f2ab40f9eb1b43a9e77b44a9f11342a9f7eb50a9e84740f9e90f02f9e1430f91e0b3c23dBL8;FFe83340f91f0500b180000054e8c3009100c10091b00e0094ff074091ff833c91f44f45a9f65744a9f85f43a9fa6742a9fc6f41", - "a9fd7bc6a8c0035fd6e067c13dL8;FF29ed0c91e81303f9280100b008d10d91e90b03f9290080d2e82303f9c8048052a934c0f2ea2703f90a078052e07f823dfffb02f9e80303f9ff0703f9ea0f03f9BBBBL4;FFff4303d1fd7b0aa9f6570ba9f44f0ca9fd83029109604039f30300aaf40308aa49020034", - "3f0d00710109005460a240a9090d40f9e823009120013fd6e8234039L4;FB61676520636f756e74657220c00076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f63727970746f2e7273002f63617267L8;FFa08b3bade18340ada18338ade08b41ada08b39ad00f4ff", - "97a0077cad880080d2a203da3c0800f0f2a9035bf8081500918082873c8182883ca0077aad8282893cBL8;FF4a61199109080091400540ad690200f909040091000502a9000500ad008501ad090505a9f44f41a9fd7bc2a8c0035fd6f40308aa4b790194e80314aa29008052L8;FF002c815221008052427", - "90094609601b4e1074091022c8152fb07409121800991f70300aa192c81527b83099144790094e007409168030291e10316aa00802f91BBBL4;FF83feff545b010014ca01c0da4a11c0daaa0d4aab022900544a010c8a2d69ea384d06f836ad1d0012ee5b40f94d0000360e0700b4ad010012cd010debe32", - "60054L4;ZBL8;FF690200f96092803c680e00f9b80000b4e00315aae10318aa2200805240b90094e02301910db3ff97ff832591f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9BL8;FFe9050054280108ab8300005426000014e80308ab82040054090840f9090100b42a0140b24a11c0da4a1540d24a0", - "d0a8b4a25019129194a8b29050091280108abL8;FFe94700f9e90742f9e93f00f9680000b4e00315aa00013fd6010740f9810000b4020b40f9e00315aa3d3900949f0700b1201c0054e25b40f9e8032a91e00316aaBBBBBL4;FF280080521f8400f91fa00fa91f1001b91f8c00f91f2001b9481c00121f09", - "007101070054740040f9820640f9020b00b4810240f929008039a90cf8b728040091L4;FFa802168b0908805275da00a9682602a928008092741a00b9680200f9f44f45a9f65744a9fd7b43a9ff830191c0035fd620008052c101805246090094ff8301d1L8;FF030d40f9e2028052fd7b43a9ff03019160", - "001fd608200091200440a9a92300d10a0000904a0128916202009042080091a8831ff8e9ab00a9e323009155090194BL8;FFff6f00f9c1620091a20301d10f73ff9760f5ffb428000014e81341b948000037f98b00f9c1920191a20301d11674ff9760f4ffb44c000014e87340f91f0500b1L8;FF1f0014e", - "bc2250054a80100b0082101910103c0791307c07908fddf8848020035a80100b008e140391f050071c1eeff54e003152ae203132ae1e2ff9708fc78d3BBBL4;FFe30314aaa8000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a948c90194ff0301d", - "1fd7b02a9f44f03a9L4;FB696f6e206661696c656456657273696f6e206d69736d61746368206166746572206e65676f74696174696f6e4d696e696d756d2076657273696f6e4572726f6eL8;FFe10316aa2200805245c90094e17740f9810000b4e05f40f92200805240c900941a3700b4e05b40f9e1031", - "aaab3010014f6031faae8ef42f91f0500b180180054BL8;FFf44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f30b00f9fd030091090040f9e8008052f30300aa2a0900d13f0500f14881889a1f2500f148100054c90200b0L8;FFe8031faa080113abe3000054000100d000e0129145490094e8031faa08", - "0113abc2010054090140b22911c0da291540d2290d098b2925019129fd46d30801098bBBBBL4;FF08048052aa2601a9a87203a9a82204a9a02205a9b60000b4e00317aae10316aa220080523ee90194d30200b5f44f49a9f65748a9f85f47a9fa6746a9fc6f45a9L4;FB0000000000000000080000000000", - "00000800000000000000704d4200000000000000000000000000080000000000000008000000000000004c77420000000000L8;FF0a018052e40303aaf30300aae023009129f87fd31f0109eb0881899abf0400f1890080524901899a1f0109eb1481899ae30314aafb320094e80740f91f0500f1BL8;FF7", - "40200f93f0400f18b000054601240f92200805242690194740e00f9f44f41a9fd7bc2a8c0035fd6fd7bbfa9fd030091086840b91f05007161040054086c40b9L8;FF2083c13c2183c23c2283c33c2383c43cfa9741b9e00600adea1700f9000504ad020d05ade90b00f9bc0000b4e0031baae1031caa2200", - "805239690094fbe30091BBBL4;FFca060091a14301d109693638e82340b9aa031cf8e003082a5295ff97a1035cf8a8035bf81f0101eb60230054a8835bf8f43340f9090380522a040091e003172aL4;FF22010054ca7a1d53f7031f2a3801084b5f050071cc0100540a020034f703182a0e000014202040a", - "9e10313aa030d40f9e20314aaf44f44a9f65743a9f85f42a9L8;FFc0050054da4e179b590b40f935f77ed3390400b43ea90094e00315aa210080523ca90094600600b4480740f9e1031faab5833ea9bf831ff815090091a8835ef8BL8;FFeaaf03a92a0080d2f40308aaea0bc0f2e9ff02a9e9ab05a94d29", - "0194e00313aae80314aaf44f49a9fd7b48a9ff830291000440ad1f0100390011803c0111813cL8;FFe20743b9e8030291e003279115410191f603279198e3ff97080000b008b11691e3074091e8f707f9080000b008d12191e8ff07f9c80000f00861039169038052BBBBBBL4;FF12fbff97800400b49501", - "00143f0c0071600400543f100071810200541f0900f1013500547c0240f9ff6b00b9ffeb00a93f7f01a93fff02a9fa1700f9fa2300f9L4;FFe0df40f9e1031aaa47faff17eeef44b948fd60d338fd78d3eb7b42f9ed7f42f9fb0309aae903172ae1ab40f9ef7e0853dc7d1853f003182ae9c700f9f703082", - "aL8;FF6b5d0151bf250071cd1d0012ee979f1a6b818c1abfe903714b69293829050091eb238e1a3f8100f108010b2a01feff541f1d0072800000541f000039ff830091BBL4;FFea1e409268aa00a9e10740f928008052680200b9811d00b5ee000014080180d2ea1f40920800f0f208017fb268aa00a9e10", - "740f928008052680200b9411c00b5L4;ZDL8;FFe3230091e2018052e80700f986910094fd7b41a9ff830091c0035fd6810100d021b82a91c20280527b910014ffc300d1fd7b02a9fd830091091c0012e0330039BBBL4;FF4f010e8bff0114ebef33949aef410d9bf16d40b93f02086bc1000054ce0500911", - "0c20191df0116ebc3feff542c0000149f030beb8031005489030a8b9c070091L4;FB67f4f0d8141283035e3c0e7dc2729373a237a28c9fbdba520000b263b3429c4c636a42620cbd3e8cd8b8b7a55040900e5001414aaed1575a926d18dad4b0b553L8;FFf4bb00f9f40305aaf5ef00f9f50307aae6e300f", - "9ed7b00f991caff97e83340f9e95740f9f10314aae46f40f9f2d340f9e30318aae8f700f9e8ff40f9e7031baaBL8;FFc9000054e0431691e1031aaae20318aa44110094fad342f9fc0740919c83019190fbff17f60300aae0431691220080523c110094e1d342f9e00316aacafdff17L8;FFe93304f94005", - "00ad2a0080528083ce3ceaa71139eacf42f902f18f3ce803169122b7803d6001803dea5301f9e95f01f9e577fe97e80356391f050071400c0054BBBBL4;FF69de023968f20af8e82747a96a5a00b979f201f8692200a9e82740f9e94740f9787202f8680a00f9e843423969f202f8e98340b968de0039e80", - "b4179699203b8L4;FB759148000000000034000000000000004a0100002d00000075914800000000003400000000000000540100001b00000073746f72655f736b69707065645f6b65L8;FF9f7e09a99f020a3881020291e20313aa0ff4ff97800400b5e1031faae4ffff17880240f91f0500b1e10000549", - "f5e00a99f7e01a9977e02a99f5e03a99f6204a9BL8;FF6901084aab535738a93317384901084aaa635738a94317386901084aab735738a95317384901084aaa835738a96317386901084aab935738a97317384901084aL8;FFa0730054e8cf42f949078052f8074091188309910969213828040091f97749", - "f9e8d302f93f0700b1c01d00540023029126260094080040b20811c0da081540d2BBBL4;FF630300f063802791a04301d162018052e400805275a60094b8035bf8a9a373a9ac8354f8bc2f77a9b9ab78a9e82707a9a8a775a9ea3700f9d80300b4f7030caaL4;ZBL8;FFa85e02a9a81a00f941b100940009", - "8052210080523fb10094200b00b4f60300aa3bb10094000480522100805239b10094000a00b4e80300913f030071f70300aaBL8;FF29492891e85b04f9680200b008710391e85f04f9e8c31691a04700d1e86304f9e8ffffb008d12d91e86704f9e8c31d91e1833291e86b04f948fffff008213b91L8;FFe", - "8eb03f9680000b008710391e99b04f9e900009029613b91e89f04f928008052a04700d1e95f05f9e1032a91e94705f9e9000090294d2391ea9704f9ea832491BBBBBL4;FF1f010039208541ad0011803c208942ad290080520111813c092000390011823c0211833cc0035fd6fd7bbfa9fd0300912004009", - "0008011915001029409204039L4;FF01ed7cd3460100945f1300f1a00a0054f5d24aa9340200b4b982009104000014940600f139c300918001005421035ef8810000b420835ef82200805238010094L8;FF680240f9080117cbbf0208eb6800005455fdffb5f0ffff17e00313aae10317aae20315aa23008", - "05224008052ed170094770a40f9680240f9080117cbbf0208ebBL8;FFe00300918b810194f44f43a9f51340f9fd7b41a9ff030191c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091080040f9e00301aa14cd40a9e8030091L8;FF2b0400346b0140b26b11c0da6b1540d26b0d0b8b6b2501916b", - "fd46d36b0d00916c0300348c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c050091BBBL4;FF1f010071fb7b01f9e802881a1f01186b81fbff54e8ab41f99f0208ebfb179f1a81faff5474faffb4f5a741f9f31b40f93b008052f60314aa68164038a9164038L4;FB686574206572726f723a2", - "0c000224661696c656420746f2064657465726d696e652073656c665f73657373696f6e3a20c000124661696c656420746f20646563L8;FF4083c33c4183c83ce84b00f9e00b01ad4083c93c4283c73ce18303ade21b803dd2000014806ec03d8a220791886206910101c03d88d640f989e240f98083813c", - "BL8;FFf3faff97803240f9800100b4610a40f9680240f91f0101ebc0090054680640f9090180522a0400916a0a00f909692138e10313aae6faff97e00314aa080c43f8L8;FF000440f92200805245410014c0035fd6fd7bbea9f44f01a9fd030091010040f968028052290041d23f8d00f12831889a1f6d0", - "0f1480400540901009029011f91BBBBL4;FF6ce1019440b40035e85341b9e89f00b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054L4;FB0e00000026000000496e76616c6964496e7075744c656e677468496e76616c69644f757", - "47075744c656e677468496e73756666696369656e7452616e646f6d6eL8;FFe1431e91e02f823de00bc33de133823de1efc23de03b823de0f3c23de237823de2f7c23de023823de0fbc23de11f823de1dfc23de02b823de0e3c23de227823dBL8;FFf50b40f9fd7bc3a8c0035fd600018052010680525a61", - "0194fd7bbda9f65701a9f44f02a9fd030091f303032af40302aaf50301aaf60300aa3561019400068052L8;FFe00313aa49feff97e80300aae00301aac8fd073708fc60d3681a00b5080840921f1900f1a21a0054017c0353c11a00343f0800716c0100543f04007160070054BBBL4;FFf40301aa42a1019", - "4c00380522100805240a10194a01700b48802403989064039156983d28a0a40398b324078f588b5f208bd70d3b5f8d4f2b76300d1560300b0L4;FF1f0400b140060054200000900040069138000090000c40391f1c007261030054390000902203109140404e391ffc0371200300540004001140400e3964", - "fcff97L8;FF73e21191e0030091a1630091e20313aab50f00f9b506009185a10094940600f121ffff54e003009182a10094f44f43a9f51340f9fd7b41a9ff030191c0035fd6BL8;FF9f0200f9f44f41a9fd7bc2a8c0035fd6fd7bbfa9fd030091290840f9890200b40b2840a92c0040f96b010a8b7f010ce", - "b610200540b0c40f92b0200372c0c40f9BL4;FF2911c0da490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f60300aa080014ebe3100054ff0208ebL3;ZBBBBBBBBBBL4;FFc2060091e10313aaf90303aa461e0294e20318aae30319aae00315", - "aaf0feff176004009000a01691401e0294400400d0000017913e1e02946004009000c01391L4;FF22008052461e0094b40000b4e00315aae10314aa22008052411e0094f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6090345f80003c43c680200a9L8;FF620600540a031acb092800a9e912", - "42d3f70300aa082401a928008052081000f9d60215eb23040054280315eb1803158be833889abf0219eb782200a9a932999aBBL4;FF090900f9e80315aa098d41f8ea0f00f93f0500b1e0010054df0200f109068052e0230091e303949aea079f1ae903899ae2231291e1031faae84b02f9d6020acbL4;FF", - "010000b9f35341a9f9ffff17e11703a9d4ffff97e11743a9e1ffff17fd7bbfa9040000f0e30300aafd03009184e040f9481c80d2427c4093800400d1e40304cbL8;FF84600891e0030091a363009142008052b30f00f98f9e009468020291810100d021d81391a40100b084e00891a363009162018052a80", - "f00f9869e0094869e0094BBBL4;FF8154005469de01941f1000310154005439feffb505000014e04305918100805264de019440530035e85341b9e83f00b957ffdfc8770000b55dde0194f70300aaL4;FB4a00000000000000d3050000120000002d004900000000004a00000000000000910500002a0000", - "0004114400000000000c134400000000000412440000000000L8;FF140340f99f0208ebe8ff00f9e8979f1a08219f5a081d0072a0c700541f05007161ca005488008052e16345f9740a00f96822003908008092680200f9810000b4BL8;FFfd7b01a9fd430091080040b9a01300d1a8c31fb89c5e0194fd7", - "b41a9ff830091c0035fd6ff4302d1fd7b04a9f92b00f9f85f06a9f65707a9f44f08a9fd030191L8;FF2a040091e00314aa490280526a0a00f909692138d1120094e10313aad4fbff97803240b980010034610a40f9680240f91f0101eb00030054680640f909018052BBBBL4;FF892a00a98082813c81828", - "23ce08740ad8082833c8182843c68320039f44f4ea9f76340f9f6574da9fd7b4ba9ffc30391c0035fd6000400f0002014914ffe0194L4;ZFL8;FF3f2500f100f6ff544b2580394a290091292900d10a2500a96bf5ffb77f05007128f5ff5421fc0baae0031faafd7b43a9ff030191c0035fd6ff8301d1fd7", - "b03a9BL8;FF647e0194e000003620008052f44f43a9f51340f9fd7b41a9ff030191c0035fd6a8820091c9fffff029312491020300d042a80c91e3030091e00314aae10313aaL8;FF8022029149018052ea1700f909692138bde2ff97e16300918e7eff97805e40f9800100b4e11740f9e80f40f91f0101eb", - "20850054e81340f9090180522a040091BBBL4;FFf4c340f9da4200915b02805219f17dd30b000014e8bf40f9e10316aae20315aa0001148b46be01949402158bf4c300f9396300f15a630091c0050054e8bb40f9L4;FB74732f616363756d2e727300636c692f7372632f6c69622e72730076656e646f722", - "f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f6b65L8;FFe003853c6002c03de83300f9680a40f9e083833cc10201ade083c03ce82700f9e383c43cc00a00ade083c53ce483863ce93f00f9c312803dc09202adc95607a9BL8;FF21008052433e0194a00900b4e10314aae20319aa", - "f50300aa493e0194572340f9b6831ef8b8431fb8f70200b4561f40f9373e0194e00317aa21008052353e0194L8;FF080540f91f0119ebe9030054e00313aa90feff97c009003728fc60d3a80600b5200840921f1800f182070054217c0353010800343f040071000100543f080071BBBBBL4;FF4f0e0294e", - "802158b680a00f994a201919f0218eb601e0054610a40f9680240f91f0101eb40110054680640f929040091e00314aa690a00f91969213809a40094L4;FFe80302b9e80b467969f10fb8e99341f9e8fb0379e8a34c39eafb01b9e8c30739e8ab40f9e9f700f9a80000b4e09740f9e1ab40f922008052390e", - "0094e8bb40f9L8;FFf30301aae10300aae0230091e2031f2a2dfcff97e90740f9e82740b9aa058052e1230091e00313aa82048052e90700f9e92f4229a8831fb8ea430039e91301b8BL8;FF682306d1e00316aae20315aa010140f9598e0194a000003568e305d1080140395f03086be0050054e1e7076fe", - "80600d1e90740f9170117ea0a328052e1fcff54L8;FF08e140391f05007181040054e2031f2aebe7ff9709fc78d38801009008a13a910afc60d3097969784921094a2a5d105308596a780001094af44f42a9fd7b41a9BBBL4;FFc30000546e010014e8031faab6feffb5e00308ab422d0054e1e3009151ba", - "ff97570300b4e12740f9e81f40f9b82240f91f0101ebe01e0054e82340f929040091L4;FBd6d3a0230e34e2c4c47b8b98c369fbd6ecaba79744f74abfa951a28c14efbf333884919500003a14f87636c5995579b0016372f75a0f7686425460cd361e4895L8;FFef7b18a9f9fb42a9f4bb00f9ec2b40f9f0", - "f700f9f42f44a9f2cf00f9f2031baafb0304aaeaab00f9e40300aaf00312aaea6341a9f2031caae0bf46a9ed7b00f9BL8;FF290080d2e14306918946c0f2e87f1aa9e8271da94e4e0194e80342f9e92350391f0100f1e8179f1a0101090a24000014e1031f2a22000014882245b8e92f4379L8;FFf6bb41f", - "9fbbf41f9000545ad5f0500b10231c03df5c341f9f7c741f9e95305f9400705ad000543ad4233803dffa71139400703ad020144ad420304ad010141adBBBBL4;FFe00314aae10316aa2200805244ee01947f0600f16b000054e0031caaa9ffff17f44f49a9f65748a9f85f47a9fa6746a9fc6f45a9fd7b44", - "a9ff830291c0035fd6L4;FB54000000000000007900000005000000259448000000000054000000000000007f00000005000000259448000000000054000000000000008d00000014000000L8;FFc2070054217c0353e10700343f0800712c0200543f040071e00300543f080071e1020054880243f81f05", - "00b1810000549f5e03a99f7e04a9977e05a981c20091BL8;FFe2008052680e40f9e00314aa00013fd6e000003620008052f44f43a9f51340f9fd7b41a9ff030191c0035fd6a80240f91f0500b160020054a8630091e9ffff90L8;FF48432c39566e0094e0074091e10318aae20319aa00002f912a120094f", - "8eb4df934f5ff1748236639e2074091400100d000602891430100f063600591440100d0BBBL4;FFbe8316387f0700b100fdff54bc0357b89eb24db83f000071e86300b9fcab00b9bc0356f89e3208b8be835638bc8317f8bc035ab8be031838be435a78bc0316b8L4;FF350000141f0017eb680600544803", - "1ccb1f0008eb080600541b001c8b7f0315eba9010054bf0200f12803959ae90308aa08f97fd33f011beba3ffff543f0148f1L8;FF2a3b0e1329370d133c2709133a230813361f0713351b0613a92b3d292a330c13292f0b13a92b3c29292b0a13a9c31db8e80100d008210191002f407808fddf88BL8;FFe", - "8a345b9e00718ade82303b9810d005448008092480300f971000014f46f41f9e8c31791e91f46b900c1c03c01c1c13cf5fb45b9880240f9f36b41f9e94305b9L8;FF00610e91a1ecff97b9ffff17fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9ff4332d1f303", - "08aaa86340b9ff0300f9BBBBBBL4;FF81ffffb4c00240f92200805244160294f8ffff17680240f9080100b401e97bd3e00314aa02018052f44f42a9f65741a9fd7bc3a83a160214f44f42a9f65741a9L4;FF63a02391e0431391e2031caae4018052e1031aaac80d0094fb6f42f9e17342f9e80740910841", - "1d91e0031baabd160094f7ab4bf9ff0600b140240054e8af4bf9L8;FFc0035fd6950640f97504f8b7750200b4960240f93e160194e00315aa21008052370080523b160194800300b4e10316aae20315aa750200a941160194750a00f9BBL4;FF08390a0b08114051e900f8376a00805208a800a91f0000f9", - "fd7b44a9ff430191c0035fd61f014871830e0054290cc0392a1d001208550a0b08014851e900f837L4;ZBL8;FFfd7b01a9f31300f9fd430091e90301aaf30300aa8101009021b41991e8030091e00309aa020280528996009468a200918101009021d01391840100f084e01b91BBBL4;FFf40300aaf30308", - "aa48008052e0330091a31300d1e10314aa0204805224008052a8c31f3809390094882240b91f05003140010054e0c3c03ce1c3c13c08050011L4;FB744374315265636569766564456b53656e744374315265636569766564726563656976696e675f63743200000000000088184900000000004c0000000", - "0000000L8;FFe96340f9e56f40f9f1031baafb0316aaf74f40f9f65b40f96c08001428a00791e07f00f9e00309910001c03d21000891ec0b18a9022f8052eae700f9f9030baaBL8;FF47560194e1a749f9810000b4e0ab49f92200805242560194b30000b4e07b49f9e10313aa220080523d560194e18349", - "f9810000b4e08749f92200805238560194L8;FFe05306f9e08332912101009021c8379142028052230100906310389144018052724bff97e15346f906000014e80f41b2e0833291e85306f92a4cff97e10300aaBBBBL4;FFc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9", - "810000b4c20a40f9e00315aa3cf60194e08741ad28008052e217c03d800600adL4;FB5b030000090000003031323334353637383961626364656670726576696f75735f636f756e74657273656e6465725f636861696e5f6b657953656e6465724d65L8;FFe0030091420180524400805277ebff97e00340", - "f967ffff17c80080d20800f0f20809009159ffff17c90080d2e8230039480080520900f0f2e8270039e90300f9BL8;FF040300f084200b91e0030091a363009162018052b30f00f98e760194686200910103009021b42391040300f084a00b91a363009122018052a80f00f985760194L8;FFe24bc33de34", - "7c33de14fc33dea8306f9e03f833de18b833de143c33da7ffff17e8f342f9e06fc13de0074091e173c13df64349f900800991e85b09f9e83b49f9BBBL4;FF0088202e09a901a90c00669e8cc101920cad00a9c0035fd6092846a9eb0309aa090100f929010a8b608540fc0a3c40f9290500910088202e09a", - "901a90c00669eL4;ZDL8;FFe80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a94db60094fd7bbda9f50b00f9f44f02a9fd030091a87cc39bf30300aae9031faa0a018052BL8;FFe8c31691eb7b40f9e9e302f9e99f40f9e8eb02f908018052e8f302f948c141393f0500b1f3db02f9ffe", - "f02f9ebab08a9e89f00b9eae702f9fff702f9fa4300f9L8;FFf45740f9200541adf87305f9f87b05f9f8830d91f96b05f900818b3c01818c3c200542adf77705f9fa7f05f900818d3c01818e3c200540adf58305f9fa8705f9BBBBBL4;FF230400b0638020912404009084e03991a00739ada203943ca283", - "03d1a10080524f0602944f06029428008052610600f968420039f7feff17ff8302d1fd7b06a9L4;FF0101805243060094400100b4165400a9810000d021c03f91144c02291f600039f44f42a9f65741a9fd7bc3a8c0035fd6000180520104805251060094281040b9L8;FFe90b41b2e92300a9dcffff1728", - "0180d20800f0f2081100d1d7ffff173f00156b81f7ff54680240f9e0031faa090540f90a0140f9290100cb4a01008be0031faaBL8;FF200f00546a4a40b9760640f92a110036772a40f9971300b4790e40f9782e40f93f0700b1a01400546a8a42397a1240f9aa1500366a3640b96c4640b96f2248f8L8;F", - "Fff030991f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6f80f40f908008092e82700f9e83300f9e83f00f9e84b00f9e85700f9e86300f9BBBL4;FF6182893ce00747ad60828a3c61828b3ce00744ad6082843c6182853ce00745ad6082863c6182873c800746ad000506ad803bc03", - "d0039803de80f40f9742200a9L4;FB62617365206b65793a20c00e20616e6420636f756e7465723a20c0022e20c000083c6572726f723a20c0013e002f72757374632f343861323239636561656664L8;FFfc031f2adf0600b141adff547cfdff17e16740f9810000b4e00315aa220080523fc60094bad4f", - "fb4e05f40f9e1031aaa220080523ac60094f5031faaf3faff17BL8;FF5369283808050091280800f90202005400fc47d3c7000014e10300a9e00301aae10308aa220080523e060094e10340a92aa040a9290040f91f1040f153692838L8;FF8546001408a440a9e20301aae00308aae10309aa7c460014fd", - "7bbfa9fd030091083040f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d3BBBBL4;FFf95f40b9e13340f9a10000b4e02340f92200805242e60194f95f40b9f78216aa7afe68d3e13740f9a10000b4e02740f9220080523ae60194f95f40b9e15340f9L4;FB6b2e72730076656e646f", - "722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f646f75626c655f726174636865742e727300c01b20736573L8;FFe16341f906000014e80f41b2e86301f9e0030b9133dcff97e10300aae16301f92102009021881f912302009063202091e0030b91c2018052a40080523c00001", - "4BL8;FFa363009162018052b30f00f99166019468620091e102009021b42391e40200f084802e91a363009122018052a80f00f98866019488660194fd7b41a9f31340f9L8;FF01f57ed34200805245660094685640f9a80000b4605a40f901f57ed3420080523f660094686240f9a80000b4606640f901f5", - "7ed34200805239660094686e40f9BBBL4;FF22008052e00308aa45a60194e00317aaf40000b4f70300aae00315aae10314aa220080523ea60194e00317aae88eff97e003c03d08008092685a00a96082823cL4;FF420040f9620200f9530400f9620640f9530000f98f000014620640f9227823f8d6ffff1", - "70229009180021091047862f8a4faffb4801840b920efff35800840f9L8;FF30180613311c071322280a13232c0b13444111536b050a0a8c090a0a2f1405133220081325300c131f05003129010a0aad0d0a0ace110a0a101a0a0a20240913BL8;FFea0bc0f2e97f03a9f70302aae92b06a9f60303aa4e26", - "0194e30316aae00314aae20317aae80315aa7f8000f1010600540a0c40f90b804039e9031f2a6c0240b9L8;FF4a051a320a01003912000014eb0f80122c7c10532b2c0633ec0000352a7c0c530b050039090900394a091b320a010039080000142c7c12532a440c330b090039BBBBBBBL4;FFc0035fd6e92", - "341a9ea0740f9480108cb395100a9280900f936feffb408138052e91380d2c826089b08f17d92c902088b212500b140fdff54a00208cb02018052L4;FF170840b9f30300aa160040f9a06300d1f40308aae103172a10120094b50f7fa9e0630091e10316aae20315aabf0f0094fae341a9f9ef42a95f0b00", - "b1e1020054L8;FF61820091000080927f0a00f9a80a00f928008052a002803d7f2200a9ac1a01941f0400f181010054688200911ffddfc8610240f9810000b4600640f922008052BBL4;FF0fe11f380f1540394d000d4a0c0100392c15403903094039210940390b0500394b02104a8c010f4a1119403920", - "1940390a0d00390a1d40392e1d40390b110039L4;ZFL8;FF810100b0216c1491e0230091a32300d182008052e40314aab3831ff88d9a009468e20091810100b0217c1491a32300d182008052e40314aaa8831ff8859a0094BBBL4;FFf303002af35301b9c00300d000c01f91c30300d063802191c40300f0", - "84403091e2430591610580524dda0194200080520108805252da0194e8af40f9e96341b9L4;FB2920697320646570726563617465643b2075736520446973706c61790000000006000000000000000c000000000000000f000000000000000a00000000000000L8;FFe81f04f9e82b40f9eb4704f9e82704", - "f9e83740f9f44f04f9e83f04f9e81f40f9f57f04f9e84304f9e87b40f9ec8704f9e84b04f9e8d340f9e04b823de85304f9BL8;FF1f010071cd0b0054e8074091e0c300910881099144760094e83349f94083c03ce93f49f91f0500b1e067813de9d302f960200054e0abc43de1a7c43deac33391L8;FFe1d", - "3823de0d7823dfacb40f9da0e00b4080d8052f6c740f9537f089b3c5a0094e00313aa010180523a5a0094c00801b4080d8052fc0300aaf3031faa547f089bBBBBL4;FFfc6f54a9fd7b53a9e923526dff430691c0035fd6a2820091f60313aaf30300aae00315aa21008052230080525ddeff97e00313aaf3", - "0316aa4effff17000240fdL4;FB494420c00076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f73656e6465725f6b6579732e727300c00f204a756d70696eL8;FFe28342ada2833aade18340ada18338ad01f5ff97a0877bade80b41b277010014e1430091e20313aa", - "f70b00f9f74b00f9f76700f9a5020094e08745adf50300aaBL8;FF8b0080526c0140b29f0109eb8309005451000014ec031faaea031faaed0340b2bf010bebc20000542d686c788ef17dd38c017fb2ad21ce9aaa010aaa9f010bebL8;FF2300805224008052f690ff97e11740f92ffeff17e0630091e1031", - "7aae20315aa2300805224008052ee90ff97f71740f9e80f40f9080117cbbf0208eb29c6ff54BBBL4;FF0a751053087d10133c0100392a050079b58318f8c802f836d60e0091b50600917b1300913f0316eb180f00d1f30314aa41fbff549e010014a02302d180f1ff97L4;ZBL8;FF54ba0094e8030a91e12", - "301910232805200a101914aba0094800642ade1030a91883240f9e00313aa023f8052e00716ad800640ade87301f9e00714ad800a41adBL8;FF2911c0da291540d2290d098b2925019129fd46d30801098b000500911f0009eb28dfff54a00200d0002008913f3a0194a00200d000e020913c3a0194fd7bb", - "ba9L8;FF4f3a0094e1430f91e00315aa5177fe97683642f9619243f9094940f915ed40b918a140b917594f293f0100f1e8079f1ae86300f9810000b4608e43f922008052BBBBBL4;FF22008052230080522400805258fdff97610a40f972feff17e00313aa22008052230080522400805251fdff97610a40", - "f978feff17e00313aa2200805223008052L4;FF540a0094d40200b4410a0094e00314aa21008052370080523e0a0094e0feffb4e10316aae20314aaf50300aa440a00940c0000143500805228008092755201a9L8;FF600000362000805223000014950240f9a80a40f9e80200b4b60640f9f80300911900", - "009039b32791fa430091540200f094e23f91d716088bc82640a9e3830091BL8;FF6a3203a9680201397f020039b60600b538000014081700d1b4831df805000014e80b41b2a0831df802000014081300d1a0c300d1a8031df82a800094f40300aaL8;FFdf8e00f1c0020054418a009480088052410080523", - "f8a0094a04800b4a00641adca0600d1e94b41f9a84240b9000401ada10240ad5f0109eb084000b9010000adBBBL4;FF22008052230080522400805258bdff97a1035ef822ffff17a0c300d1e10317aae20318aa230080522400805250bdff97b7035ef8ba035df8480317cb1f0308ebL4;FB080000000000", - "000080fb45000000000000000000000000000800000000000000080000000000000008fc45000000000000000000000000000800000000000000L8;FFf7430d91e003c23de10b19ade6030991e8af00b9e84f44f9e107c23de9a301f9e94744f9e20fc23de85300f9e85f44f9e4f7c13de00717ade00bc23", - "de1efc13dBL8;FF01f57ed342008052454a0194682640f9a80000b4602a40f901f57ed3420080523f4a0194683240f9a80000b4603640f901f57ed342008052394a0194683e40f9L8;FF97010094080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f0008eb29210054f30b", - "40f9fd7bc2a8c0035fd6e80300aa098d40f8BBBBL4;FF00e4006fffbf0a39e85b41f9e95f41f9ea6341f9d6060071eb6741f9ec6b41f91a0dc0daed6f41f9ee7341f93c0dc0daa0833badef7741f95b0dc0daa0833cadL4;FB7920696d706c656d656e746174696f6e2072657475726e656420616e206572", - "726f7220756e65787065637465646c7900d5a24800000000004b00000000000000L8;FFf8000094770a40f9b0ffff17e00313aa220080522300805224008052f1000094610a40f9b7ffff17e00313aae10316aae20315aa2300805224008052e9000094BL8;FFe10200b021f42691e8230091620180527e6", - "a0194e20200f042a023910a000014082100910103009021402891e80300f9e823009142008052746a0194e20200b0L8;FFeda305392b1f0036ebd343b9e96306394921c993e8cb00f9ecab4779e31b40f9eb3b00b9a00302d1e2e300918b1245f8e8fb0039e10319aae8b340f9e97304f8BBBL4;FFe91640", - "381f01096be0179f1a5eaa0194180700f11600160a21ffff54e003162a59aa01941f1c0072c0070054280080526822003928008092680200f9b50a00b5L4;FF17050091f30300aa21008052e0f27dd33203009440ffffb4e10314aae20313aaf50300aa430c0094e8031faae9031f2a4a008052eb0315aa0", - "50000148d0200b4L8;FFdb020079d4060079dfffff175f0700f161000054e8031faa0c000014e8031faae9031aaa2afd41d34b01088b29010acb6cf57ed3cc6a6c789f213b6b08818b9aBL8;FFe8d302f923dbff97a10353f8810000b4a08353f822008052412a0194f56340f9e8031691e00315aa182a01", - "94a8624039f5c342f9f7c742f9e8631639880280d2L8;FF432a009400c4805221008052412a0094c04900b4e1833f9102c48052f90300aa16c48052462a0094e0074091f9030bf900001891f6070bf9bf88fe97e00706a9BBBBBBL4;FF490108eb63100054aa0240f9e00740f94801088ba82600a9680240", - "f9080540f9150100eb62010054e80f41b2e80300f9e00300912b080194f44f46a9f72340f9L4;FF78c4ff97e06f00b9a04700d175c4ff97e06b00b9a04700d172c4ff97e06700b9a04700d16fc4ff97e06300b9a04700d16cc4ff97e05f00b9a04700d169c4ff97L8;FF290840394b0d00332a0440390c11", - "00390c1080522c1500330b190039293040b80a1d00392a7040782b2440390c210039099100b80ad100780b3d0039c0035fd6BBL4;FF08213a91e82706a9200300d000e83291e83b00f9a80301d170920194a1835df8810000b4a0035ef8220080523c920194760a40f9680240f9df0208eb61000054L4;ZD", - "L8;FF400000540f8eff97755e40f9744200f9bf0600b180020054745a4ca9960100b49722009104000014d60600f1f7620091e0000054e1825ff881ffffb4e00240f9BBBL4;FFe82b02a970af0094880080d20800f0f208110091d1feff17880080d20800f0f208110091b6feff17880080d20800f0f2081", - "10091d8feff17a08302d1a82b36a9L4;FBff6021ea8e1dfbcafb2f0c877912ca577a54bb5743503ac2b6e5700774d8ed28555fdcbf532d32f5ad88e65800002af4096b557e2ddf654f1812424f6624a0f3L8;FFa1e20791e8e700f9e8ff41f9022f8052e06fc13df6ef41f9fb4700f9e82b17a9e80342f9e", - "a0b42f9f73342f9f86742f9fa6b42f9e9231fa9e80f42f9e90742f9BL8;FF2104805277520194e2074091c50200f0a5403b9142800991e0031f2ae3031faa340a0094e0431691220080523d120094e1d342f9f2f9ff1748074039e2074091L8;FFb47e0853e8a345b93c008092e00718ade82303b9e00758", - "ad955e1833e82343b95c0300f9550b00b940c3803c41c3813c482f00b9ff033a91f44f45a9f65744a9BBBBL4;FFe82705a952f201947f22003928008092680200f9fd7b47a9f34340f9ff430291c0035fd6080842a9039043a9e00301aae10308aa4dc900946022003928008092L4;FB9a96480000000000", - "330000000000000017020000050000005369676e616c5f504e495f5369676e617475726576657273696f6e20646f6573206e6f7420666974L8;FFe20313aa12f5ff97c00f00b540fcffb4d7ffff17890240f93f0500b1810000549f5e00a99f6201a99f2600f91f0900f1a10f0054e00313aaf5f1ff97400", - "10036BL8;FF6b01084aaa031638aa3356382901084aab131638ab435638a9231638a95356384a01084a6b01084aaa331638aa6356382901084aab431638ab735638a9531638L8;FFd70a0094e5fcff17e1d342f9e8cb42f91f0101eb008e0054e8cf42f949058052f4074091948209910969213828040091", - "f67749f9e8d302f9df0600b1a0330054BBBL4;FFe00308aa46b20194e0031caa08008092b90319b8a88318f8a70000143f0c0071c00500543f10007161070054a80357f81f0500b18100005428008052bf0318f8L4;ZBL8;FF410100ad3f0102eb28fdff54c93200f91f0009ebe20309aae3fcff54a2ffff", - "17a30100f0636034915bb20094a30100f06380359160910091e20315aa56b20094BL8;FF2120099102028052a30200906360099104028052c9000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f92c280094e10300aae15306f9e0833291L8;FFe80000f008b140f91f0500f169050054e84", - "32491e900009029692991e84b03f9680000b008710391e84f03f9e8430e91a04700d1e85303f9080000f008b11691BBBBBL4;FFc8010037292100916003098b1b00188a296b7bfc208d282e0800669e1cc101f2e1fbff54f4ffff1740077fad28008052e08700ad02000014e8031f2ae08740adL4;FFd60c", - "00b4e00316aae10315aae20317aa4b020094228f7fa9e00316aae10317aac4020094400d0037e00316aae10317aa220080523a02009406000014228f7fa9L8;FF02018052f44f42a9f65741a9fd7bc3a843020114f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091011440f", - "9f30300aa3f0800b1BL8;FFfd7b42a9ffc30091c0035fd6080040f9e00301aa090140f93f0900b1a1000054010300f021702991820080527a820114ff8300d1fd7b01a9fd430091010300f0L8;FF47820094b40000b4600640f9e10314aa2200805242820094610e40f9810000b4601240f9220080523d82", - "0094763640f915008092750200f9df0600b180020054BBBL4;FF62000054e9031f2a0500001463001036095040f9490000b429008052f44f43a9f70b40f9f65742a9fd7bc4a80921003929008092090100f9c0035fd6ff8302d1L4;FB286d4900000000001d7649000000000007000000000000000600000", - "0000000000000000000000000000000000000000000000000000000000900000000000000L8;FFe127c23de6030991e0d7803de023c23d01048152e8b743f9ea7202f80a788052e22fc23de00717ade02bc23de86b00f9e8ff5e3969d14578ea3b00f90a908052BL8;FFd2ffff17e00313aa220080524502", - "0094610a40f9680240f9deffff17e00313aae10308aa220080523e02009469aa40a9dfffff17fd7bbda9f50b00f9f44f02a9L8;FFea2f19a9e90702f91a00f0f273420094e81f40b9e8030639e10740f9c1f7ffb527feff173c008052e8430691e0430f91fe55fe97f82740f9e81f40f91f0308ebBBBBL4;", - "FFf843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb63d300541803008bf9feffb50f0000141f0400b1c1d200545be20194L4;FB590000000500000042ea48000000000054000000000000005f0000000500000042ea4800000000005400000000000000650000000", - "500000042ea480000000000L8;FF00810091fc031a2afae33b914ce20094a003dd3ca8035ef8e0431e91e1e33b91e2c30d91f77f07f94083803cf8431e91e88b07f9d8010094f7cb43f96083c03cBL8;FF3f0400f18b000054601e40f9220080524362019408008092681a00f9f44f41a9fd7bc2a8c0035f", - "d6fd7bbea9f44f01a9fd030091010040f9f30300aa3f0400f1L8;FF080500911f0048f1280800f96202005400fc4ed3af000014e00700f9e00301aaf30301aae10309aa22008052f4030b2a240600946aa240a9e00740f9690240f9BBBL4;FFe20316aa0001188b4da201941803168bf82b00f93f0318ebc", - "0080054e82740f90a070091e1030191e00315aa0902805209693838ea2b00f94a8eff97e12b40f9L4;FF15000014d60210917f7e00a97f7e01a9c10a40f97f1200f9810000b400008012610600f964000014734e00a900008012d30a00f9f35341a9fb7345a9b2feff17L8;FFfd7b41a9ff830091c0035fd", - "6810100f021bc1491820080527fa20014080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091810100f0BL8;FFf50301aaf30308aa4a0140f9e10309aa40013fd68a0a40f94a0115eb230400548b0640f9750a00f96b01158b8baa00a9f44f45a9f52340f9fd7b43a9ff830191B", - "L4;FF810000b4601240f92200805244220094611a40f9c1fdffb40804805205000014611240f93f0400f12bfdff5408028052806a68f82200805239220094e4ffff17L3;ZBBBBBBBBBL4;FFb50a00b4000340fdfb0740f9fa031faafc0318aa0088202e0800669e15c10192f50000b5808f40fc5a2300910", - "088202e0800669e15c101f260ffff54a802c0daL4;FF1a000014421c0094c001805221008052401c0094800400b4c800009008bd3491f60300aa090140f9086140f8090000f9086000f8b70000b4e00315aae10317aaL8;FF8104f8b7800240f922008052441c0194e00314aa0103805202018052f44f42a", - "9fd7b41a9ffc300913d1c0114280000cb010102ab62010054a101f8b722008052BBL4;FF21008052439c0194c05100b4e10316aae20313aaf50300aa499c0194e8434339e803082a09028052290108cb7f0209eb620100541000001408008092880200f9L4;FF130040f9e00313aa930000b4d8ffff97733", - "a40f9fcffff17000000f000d843f9d3ffff97000000f000d843f9d0ffff97000000f0f30b40f9fd7bc2a8008840f9L8;FF090100f9fd7b42a9ffc30091c0035fd6e93300914a0100904a910491800100d000340b91e1430091e92b01a96b9c0094fd7b42a9ffc30091c0035fd6fd7bbfa9BBBL4;FF085300", - "39e8a7542909570039085b0039e8a75329095f003908630039e8a7522909670039086b0039e8a75129096f003908730039e8a7502909770039087b0039L4;FB08000000000000001859440000000000676f6f676c652e70726f746f62756600500f4900000000000f00000000000000427974657356616c7", - "565000000000000L8;FFf61f14a9e7030baae8f347a9f60307aaf19700f9f10300aaf80316aae3ef00f9e30310aaf0030daafbdf00f9fb0308aa8d018052e9eb10a9e0bf46a9f7fb15a9BL8;FFf90300aa08810991fb1300f9010140b24b5c01943e5c019420058052210080523c5c0194007901b4e90200", - "f029350191280f8052200540ad08800039c80ec0daL8;FFbf0208eba9f4ff54e00313aae10317aae20315aa2b000094770a40f99fffff17e00313aa2200805226000094610a40f9a8ffff17e00313aae10317aae20315aaBBBBL4;FF1f0500b1e923013940010054e0430c91f7430c91676c0094f68b41f9", - "e0030791e1220091022a805245fc01940200001416008092818a40a9e0430191f4430191L4;ZFL8;FFe00302aaf30302aaf40301aa00fcff9720020037750240f9a80640f9160101eba2020054e80f41b2e81300f907000014c90080d248008052e0a300390900f0f2BL8;FF2103009021d03f91e00308aa", - "82028052fd7b42a9ffc300917f7c0114096000912103009021a03e91a9831ff82403009084c0319126030090c6203e9103200091L8;FFe11740f9e80f40f91f0101eb003b0054e81340f9090180522a040091ea1700f909692138e16300918a7cff97e00314aa080c4df81f0500b160000054e1630091BBB", - "L4;FFf3a4ff9728008092686a00a9f44f52a9f65751a9f85f50a9fa674fa9fc6f4ea9fd7b4da9ffc30491c0035fd6fc2f40f9fb2340f93f0400b1f91740f9fa0f00f9L4;FB08000000000000001c1448000000000080f3470000000000100000000000000008000000000000009c1448000000000080f347", - "00000000001800000000000000L8;FFf60313aa1f090071030b00549f010471200500540b0000149f010871c0040054e8df9f529f01086b60040054c8ff9f52f5031f2af60313aa9f01086b60090054BL8;FFce250191ad194e8bbf010cebe30100546b0500f1ec030daa81feff54a90109abe2000054200", - "108ab62010054fd7bc1a8c0035fd6e90309ab63ffff54a00200f0L8;FFe9ff43b9f6db43b9756641f9e80240f9208706ade9f302b9680000b4e00315aa00013fd6e10640f9810000b4e20a40f9e00315aa3a3c00949f0b00b1410d0054BBBBBL4;FF5cfdff97b5a201f1e10316aa41ffff54887e40f91f05", - "00b1c0100054610a40f9680240f91f0101ebe0300054680640f9981241b9490980520969213828040091L4;FFf60300aa4e0c00940200001436008052745a00a9740a00f978620039f44f45a9f65744a9f85f43a9fd7b42a9ff830191c0035fd6ff4303d1fd7b07a9fc6f08a9L8;FFa10080524b0c0194ff", - "c301d1fd7b05a9f33300f9fd430191082440a9f30301aae0630091e1030091e2031f2a080dc0da290dc0dae92300a923faff97e90f40f9BL8;FFf40700b4428c0194e00314aa21008052408c0194e10318aaf30300aa2000805273feffb4285440a9f4cf00a9ff0f00f9bf0214eb08070054f4031faae903", - "1faaL8;FF163c0853f303002a35008052e87740f99f0208eb61000054e0a30391928b0094e87b40f91669343896060091e87740f9f67f00f9df0208eb41fcff54e0a30391BBBL4;FF98ee40a9e9031faa15000d8ac96975fc208d282e0800669e19c101f260030054e92f02a9ee3701a9ef0700f92803c0d", - "a0811c0daa80e488b08010d8adc1908cbL4;FB988293928ea285b257525c4241724a627b1270026d3266220fd204c219f212e22392288235b23ea29a6391738c438753b623bd33a003ab13c2e3c9f3d4c3dfd3L8;FFc5030014765f40f9df0600b1804b005468d340b91f010971204b00543f0500b160000", - "054e0031baa6acaff975c008052590300146083c63c6183c73c6283c83cBL8;FF21008052434c0194c01c00b4c80200d008613f911a0380d20001c03d08f140f8e90280521a00f0f2e98316a90000803d08f000f8e9bf00f9e81f40b9e8030639L8;FF080040f9090100f029011c91e00301aa0801403922", - "7968f8090100f029611c91287968f8e10308aa7b4c0014080040f9e20301aa002140a9e10308aa834c0014BBBBL4;FFe20313aa230080522400805258dfff97f90f40f9f80740f972ffff1720008052e10319aa4bec0194fd7bbda9f50b00f9f44f02a9fd030091152040b9f40300aaL4;FB657373616765", - "000000000000000000000100000000000000010000000000000058fc420000000000496e76616c69644d65737361676546666942696e64696e67L8;FFe10318aae20316aa2300805224008052f4020094780a40f9b3ffff17e00313aa220080522300805224008052ed020094610a40f9b9ffff17e00313a", - "ae10316aaBL8;FF00603491496c0194ffc305d1fd7b11a9fc6f12a9fa6713a9f85f14a9f65715a9f44f16a9fd430491f40301aa3f0001f1f30308aac8000054e80b41b209008092L8;FF05028052a76c0094f95b40f93f0700b1a00c0054faa74ba90a630191061f57290083c13c0003433908e301910183", - "c23cea2301a9e8a3039181820091a50303d1BBBL4;FF95020191a82735a9e18304ad4af6ff9700e4006fa0833aada0833bada003d53ca103d63ca203d73ca303d83ce327803de223803de11f803de01b803de20f41adL4;FF680640f9e10317aae20315aa0001168b480e0094c802158bf502158b680a00f", - "9ceffff17291040b83514009108fd0f37ea031faa08fd1737eb031faa48001836L8;FF43ac0094400080524100805241ac0094c01a00b4f80300aa3dac009440008052410080523bac0094001a00b4f90300aa37ac0094400080524100805235ac0094BL8;FF880200d0084d3491a82b3da90a078052c804", - "8052bf2738a9890200d0292d2291a92b3aa9290080d2a10302d16908c0f2a87f39a9a8273ca9452c01944083cf3cL8;FF160480522003168be1031caae2031baa4b2c0094da021b8be0031caae1031baa22008052ba031ef83d2c0094f60314aaf40315aaf50317aaf70302910a000014BBBBBBL4;FFe083", - "0091370a0194f40300aa7f0a00f9e00314aaf44f48a9f65747a9f85f46a9fd7b45a9ff430291c0035fd6f4031faaf8ffff17ff4301d1fd7b03a9f44f04a9L4;FFe00316aae10317aa2200805244140094b50000b4e0031caae10315aa220080523f140094e19341f9810000b4e09741f9220080523a14009", - "4e0431391e10313aaL8;FF4a010ecbff010beb4a010f8b20fbff54ee030faaf115c038301e00127102f83711c200513f2a0071c3feff54117a1a12310601513f1a007143feff541f050071BBL4;FFf90f00f97e6c0094e11500b5fa0319aa280319cbf90f00f91f7d00f129180054a10240ad88021a8b558", - "30091f9c30091010100adf50f00f958050034e00316aaL4;ZBL8;FF601240f92200805245940094611a40f9810000b4601e40f92200805240940094b40000b4600640f9e10314aa220080523b940094762a40f915008092750200f9BBBL4;FF200100543f080071c1faff54c1620091a2a302d1e003082a0", - "cbeff97a0faffb49a010014c1c20091a2a302d1e003082a15bfff97e0f9ffb48b010014a0a302d1L4;FB7420563120436861696e204164642045706f636800000000e2204900000000004d00000000000000a40100000a000000df1b4900000000004700000000000000L8;FF29a058a9e96f00f9e85f00f", - "929a059a9eaa30aa928e85aa9e9e300f9e80700f929a05ca9e9f700f929ec5da9e82f00f928fc40f921000891e9a30fa940d40094BL8;FF5a8309917f0700b18017005440c30391c8170094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb2816005426000014L", - "8;FF28010090080d1091e96306f9290080d2e87b06f9c8048052293fc0f2ea7f06f90a078052ff5306f9e85b06f9ff5f06f9ea6706f9e87306f9e97706f944540094BBBBL4;FF0900f0f229017fb24a1d409208010aaa692200a9fd7b44a9f32b40f9ff830191c0035fd6ffc304d1fd7b0da9fc6f0ea9fa6", - "70fa9f85f10a9f65711a9f44f12a9L4;FB206465636f64652073657373696f6e207265636f72642070726f746f6275666c6f61645f6578697374696e675f73657373696f6e734d65737361676520776173L8;FFe00313aa02f4ff97e80300aae00301aae8fd073708fc60d3880e00b5080840921f1900f1c", - "20e0054017c0353e10e00343f040071200200543f080071e1030054BL8;FFc0035fd6fd7bbea9f44f01a9fd030091f30300aa088c41f81f0500b140000054955dff9768d240a9090080927f2601a9940100b41321009104000014940600f1L8;FF800100b4e1d342f9e8cb42f91f0101ebe0c50054e8cf42", - "f9090280522a04009109692138e1431691ead302f9d0110094e85349f9280500b409e179d3f84f49f9BBBL4;FF840300d084002091a20700d1e103805253b40194fd7bbda9f65701a9f44f02a9fd030091150840f9080040f9f30302aaf40300aa080115cb5f0008eb88010054L4;ZDL8;FFe00314aae103", - "13aa96b2ff97d90000b428e379d3e00314aa02018052011119cb3fb40094d5fbffb5f44f4ba9f6574aa9f85f49a9fa6748a9fc6f47a9fd7b46a9BL8;FFe39348a9e0c31291e2db42f9e5f35639e1032d9126008052b3e5ff97e85b42f91f0900b180710054c90080d20900f0f2294500911f0109eb408400", - "54e02fc13dL8;FFe16f0ab967ffff17a88357f8080540f9160101ebe200005475010014a22302d1630c8052faeeff97e10300aaa02e00b5a88357f8080540f91f0116eb490e0054BBBBBL4;FFa9ccadf28accadf2a8accdf2a9ecccf22a4ccef2e86deef2298fedf2ea8decf2080008ca090009cae00702a", - "9e82700a928000aca6aae8cd28a2eaff2e0030091L4;FFe8eb40f9e82700f9fa1800b45f0700f1c10b005428034039eb031f2a1fad0071401800541fb500710018005458000014880240f929cd8d52298dae72080140b9L8;FF810000b4602a40f92200805244040194680e48f81f0d00b1a1000054f44f4", - "2a9f50b40f9fd7bc3a8c0035fd6e00313aaf44f42a9f50b40f9fd7bc3a8f6feff17BL8;FFe92300910a0000d04af11991e8a700a92203009042340391ea0f00f9e34300915c840194fd7b43a9ff030191c0035fd608200091094000912203009042a80591L8;FFc0fcff545f05007121020054a80240f99f", - "0308eb00070054880700b1380100793b050079a80a00f9c3fbff544b000014a80240f9880500b4a80640f9ae0a00f9BBBL4;FF38008052190380521a018052810340f9340080399400f8b728040091490400d1110000145f2800f1880000542800028b08f1df38a813f837e0e31591d12d0094L4;FB756c6", - "c79206465637279707465643b206d757374206861766520612072656d6f7465206964656e74697479206b6579003b634900000000003800000000000000L8;FF08f7ff172093c63ce8bf43f9f7c31591f4a35d39e082009101830091022e8052e03f803de8f30ff8e91f00f944c40094e81f40f9e03fc03d", - "df0600b1e9c31391BL8;FF00ffff17c80080d2e10b00f90800f0f2080900d10f000014c80080d2a1831df80800f0f2080900d11a000014e80b41b2e00b00f907000014e80b41b2a0831df8L8;FF6083883c2083ca3c6183893c2183cb3c60838a3c2083c43c61838b3c2183c53ce85301f9c86a40b9e0070", - "4ad2083c63c2183c73ce82b00b9e8430691e00705adBBBBL4;FF6ae401941f10003121140154f9ffff1767e40194f70300aa1f0400b141fdff54e04305918100805262e4019400130135fc5341b957ffdfc8d70200b4ff0600b1L4;FB746f2073656e6420435453495a45000097e64800000000005600000", - "000000000830000002700000073686f756c642062652061626c6520746f20656e636f6465L8;FFe8bb00f9c1000054e05bc03de8bb40f96002803d680a00f93c000014f5030091c182009102288052a082009144e40094f64340f9e05bc03de8bb40f9f40300f9BL8;FFa0e300d1c2028052240180527759", - "0094a0835cf8a0ffff17fc031f2ae80700f910000014ea3340b9eb6b40793c008052a9831c38e92340f9ea2b00b9ea234139L8;FFfd7bc3a8c0035fd6210400b4fd7bbea9f44f01a9fd030091f30301aa14e0009104000014730600f194c20191c002005481825cf8810000b480025df822008052BBBL4;F", - "F785200b9e20f41ade413c03de10340ada403993ca28f3bada1833aad610200ada2837bada103d93c620201ad6112803db60000b4e00317aae10316aa22008052L4;FF60030034dbfcff97000040b91f980071e0020054f55b42a9f76343a90b000014151c00f91b000014201040f920f4ffb4330c40f900", - "0400d19402109161a20091L8;FFf44f43a9fd7b42a9ff030191c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aaa101009021081591e8230091e00309aa6201805284a40094BL8;FF1f01096be0179f1a5f2401946802000ac802080a00010012f44f42a9f65741a9fd7bc3a85824011", - "4ff4301d1fd7b04a9fd030191e8330091090000b029910991L8;FFfa6741a9fd7bc5a845240014c80240f9ff0208eb20020054080680528002c03d890a40f9e862089bea060091ca0a00f9135500a9130900f90081813c091500f9BBBBBBBL4;FF750300b476c2009104000014b50600f1d6a20191c00200", - "54c1025df8810000b4c0825df8220080523d180294c1825ef8810000b4c0025ff82200805238180294L4;FFe10315aa2200805245180094e8a741a940a30091e1030191e2a30091e92304a9e80740f9e82b00f938ffff17e00301914201805223008052240080521df9ff97L8;FFa3020054880240f9e203", - "13aa0001158b4b1801947f0216eb28010054a80213ab02020054880600f9f44f43a9f65742a9fd7b41a9ff030191c0035fd6e0030091BBL4;FF69fe00a9600601ad6212803d7f0200f9f44f5ba9fc575aa9fd7b59a9ff030791c0035fd6e00740ad08008092e20bc03d6082803c6182813c6282823c68020", - "0f9L4;ZFL8;FFaa435538a1c302d1ab2315382901084aab535538a93315384901084aaa635538a94315386901084aab735538a95315384901084aaa835538a96315386901084aBBBL4;FF810000b4e00740f92200805244d80194c082c23cd70240f9080d8052e90c80922227089bc1a20191a0039b3ce00", - "316aac082c33ca0039c3cc082c43ca0039d3cL4;FB69742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f76312f756e6368L8;FFea0314aaf56300f9ec031caae5d300f908008092f0e300f9e56f40f9e87700f9f", - "6134ba9eef347a9fa8700f9e96340f9f57b40f9fa5740f9f1a34ca9e2c345a9BL8;FFe8cf42f92a0400916b8109914902805260c1009109692138ead302f9081e0094e1431691ea110094e0df92b980010034e1d342f9e8cb42f91f0101eba0c60054L8;FFa17e035321240034280400511f390071c80600", - "5489000010ea6a683829090a8b20011fd6a03500b5a02302d13ff5ff97e0140036e1fcffb4b001001401830191BBBBL4;FF090d40f9e803009120013fd6e80340f91f0d00b141030054880200f9680080522a000014785e40a9f50301aa762240b937f80194000380520101805235f80194L4;FB65203cc0", - "013e001f756e74727573746564206964656e7469747920666f72206164647265737320c00018696e76616c6964204d4143206b6579206c656e677468L8;FFa18379ad8182823c8082833c6affff17c1010054e1031faae4fcff17880080d2e17f00f90800f0f2dcfcff17e80b41b2e07f00f9d9fcff17880", - "080d20800f0f2BL8;FF386e0094f80300aa4b000014b8835cf849000014a0031cf8010300b021182e91030300b0639c2791a00301d162028052840180523e000014f80300aa3e000014L8;FF08c1359103048052e4031caa25058052060480523dcfff97e2bf4ef9e3c34ef9e007409100800191e10316aa", - "74baff97e01bc43de11fc43de223c43de09b843dBBBL4;FF400109cb0125009145b80194f35349a9b40100b47522009104000014940600f1b522019100010054a8825ff888ffffb4a00240f901f57ed34200805238b80194L4;ZBL8;FF5f00001448008052e91f80520840003909200039c0035fd63f0500", - "71a8100054e84300391f090071ecfbff54a80c00341f050071610500546c0400f1800e0054BL8;FF29194a8b29050091200108ab62000054fd7bc1a8c0035fd6a00200d000602c9142380194a00200d000c027913f380194a00200d0002008913c380194fd7bbfa9L8;FF883100b8e8036b396081c03ce92", - "309b9e903092a6181c13ce8630f39883140b86c7e0e91eaeb01f9ea5745f9eb5b45f9490300b9693e0f91f55340f9483300b8BBBBBL4;FFe023009137fe0094e90300aae90700f9210400b021a01f91230400b063c03591e023009102028052e40180526ffd0094e00740f9f44f4ea9f95b40f9f6574da9L", - "4;FF0001168b4e080094e083c03cc802148be80f00f96002803d680a00f9f44f46a9f91b40f9f65745a9f85f44a9fd7b42a9ffc30191c0035fd6e0230091e10316aaL8;FF84601091a2008052e30313aa9108019491080194fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b02a9fd830091490200f", - "029813d910a0000904ab12791BL8;FFe8031faa292100914a1d409208010aaa69a200a908008092680200f9610000b4220080523e880194680700d11f0d00b1a8000054e0031caae1031baa22008052L8;FF4488009480c7ffb55e000014e0430a91e10304910230805249880094e00313aa7782ff97f807", - "40f928008052e1430a91e00313aa02308052080300f940880094BBBL4;FFc90200f9f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ffc30bd1590080d2f40301aaf50300aaL4;FBf30000002e000000d5184900000000006a0000000000000", - "0950000002e0000001100000000000000140000000000000014000000000000000054490000000000L8;FFe107c23de8bb01f9e87344f9fec743f9f45300f9f4bb43f9eecf43f9f2d343f9f1d743f9e0db43f9e3e35e39e7f343f9e4e343f9e5e743f9fc7700f9fc0315aaBL8;FF47480194c10240f98100", - "00b4c00640f92200805242480194c10e40f9a1fdffb4c01240f9220080523d480194e9ffff17681a40f9280100b4090d8052e00314aaL8;FFc20600542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9050054280108ab8300005426000014e80308ab8204005", - "4BBBBL4;FF3f0015eba24b0054080d80523360089b782240f9d80100b4097f089b681e40f9fb031faa08e1009122a101d1092940b93f01146b402a005442a001d17b070091L4;FB08000000000000000800000000000000804c4200000000000000000000000000080000000000000008000000000000008", - "04c4200000000000000000000000000L8;FFf30308aa090840f9c93000b4080440f917008092f6830591d50080d2e9df15a9d8020291e8ab00f91500f0f248008092e9430591f9030b913a0080921b018052BL8;FF21a02a91140800f91f60003913640039f44f42a9f65741a9fd7bc3a8c0035fd6000180", - "520104805255680194fd7bbea9f30b00f9fd030091f30300aa34680194L8;FF005c179108210091e1c30e91e9db01f9eadf01f971680094480100b008d93891e9008052e8271ba9fa0741b2e8df40f92083c13ce8c700f9e8a759a98082833cBBBL4;FFc0035fd6a04301d12100805222008052230080522", - "4008052559bff97b6a37ba9e0feff17a04301d1e10316aae20315aa23008052240080524d9bff97b6035cf8L4;FF56cc218bf50300aad6220091f35301a9f303012af40302aae7ffff97e20316aae10314aae003132aa0023fd6e4000094fd7bbda9fd030091f35301a9f30302aaL8;FFe213c03de317c03", - "de343803de23f803de13b803de037803d08010191ff430991f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd66082c73cBL8;FFe1031aade08b53ade00b1bade08751ade00719ad081400383f280194bf3e00f148020054e0075bada14302d1e00314aa22008052a0873dade00b5cada", - "08b3eadL8;FFe00317aa00013fd6c10640f9810000b4c20a40f9e00317aa412800945f0b00b121020054e11b42f9ffe71639810000b4e01742f92200805239280094e8a340f9BBBBBBL4;FF090d8052e083c33ce822099be0031faa000d803de083c43c0011803de083c53c0015803de93740f9093100f9e", - "9060091e083c03c892200f90001803de083c13cL4;FFe06f00b9a04700d176c2ff97e06b00b9a04700d173c2ff97f803002aa04700d170c2ff97e06700b9a04700d16dc2ff97e06300b9a04700d16ac2ff97e05f00b9L8;FFff830191c0035fd6890480524a008052132500a90a410039f44f45a9fd7b44a", - "9ff830191c0035fd60a048052932a00a99f420039f44f45a9fd7b44a9ff830191BBL4;FF240080525a83ff97f55b41a99bfeff17e0230091e10316aae20317aa23008052240080525283ff97f55b41a9c2feff17e0230091e10316aae20317aa23008052L4;ZDL8;FFa8031ff8e92b01a9e3430091619000", - "94fd7b44a9ff430191c0035fd6880100d008ed2d91e00301aae10308aa22058052fd7b44a9ff430191779000140a100091BBBL4;FFe8c30291a04302d1a0873badbba90094f66340f97609f8b6f9031faae00319aae10316aa4bd00194f7031aaa5a011ceb20010054090e8052085d099b9823099bL4;FBd", - "4c2a4e4d2aa0b66dfa47b40a9eaa28c7f4ced22000064d9cf570f76474c51260eab9a3bed455ac556b9af8723172e1b28e25b63c480bec65123f7fa89134893L8;FFe9d300f90b2557a9ea2f0ca9e9ef00f90a2558a9e96f00f90b2559a9eb5f00f9e9e300f90b255aa9eaaf0aa90a2d5ba9e90700f9ea3f", - "00f90a255ca9eb271ea9BL8;FFe00c0054e82300f9e9234fa9e082c33c00630291e82703a9f62351a9e95750a9a0839d3ca8031df8e8a30391e92700f9cc79ff97e8630191e0a30391a1c300d1L8;FFe8e742f9e2031f2aea1700f9e80f00f9e8d345b9e93700b9e82700b9e8031691400707adbb0318f8b", - "58318b86a500094e88345b9e9c742f902a09152040100f0BBBBL4;FF603fc03d6143c03d6247c03d634bc03d6327803d6223803d611f803d601b803dff020039e28f42ade51fc03de00741ade413c03d6507803de323803d6507c03dL4;FBea984800000000002e000000000000006f0100000e000000aa9", - "14800000000005e00000000000000060400000900000085924800000000003300000000000000L8;FFe8ffff17e00300f9210200f021b41991230200f063f41991e003009102028052a4018052eaffff17c80080d2e0230039e00300910800f0f2ff270039e80300f9BL8;FF090c40f93f0500b1c1f7ff54", - "e9031faa0a1c40f95f0500b1e1faff542801088be80308ab02080054090840f9490500b40a0440f9ec031faaeb0309aa4a610091L8;FF080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb2821005413000014f9031faafbb749f9e8074091088109917f0700b1BBB", - "L4;FF08020036a8835b3849a34ab8abe35b78aa935b381f050071a98311b8abc311788c0d0054280e0035e90f41b274000014686e00a97d000014f6031f2a84ffff17L4;ZBL8;FF62008052b9831df8a82b3ea9790a0094bc937aa9a82301d1e0031f2ae1031baae20317aa2500805206048052fb0700f9e", - "3031caab3b00094a1035af8810000b4BL8;FF00080054e02bc33de85b46f9e07f823de80305f949000014fa4340f9080f00b4e89b40f9e9c31691eaffffb04ad12d91e9a305f9e9c32791e8fb04f9680200b0L8;FFe00313aa088c4ff81f0500b1400000542eefff9775de4ea9970100b4b8220091040000", - "14f70600f118630091e000005401835ff881ffffb4000340f922008052BBBBBL4;FF381740f9b8f5ffb539008052c00642a9a21300d1bcc31fb8f3fbff97c80a40f9c8f6ffb5c2820091fa0300aae00316aa2100805223008052d0e3ff97e0031aaaL4;FFb47c039b0b00f0d2f50304aa6b0104cb9f020be", - "be8020054010100b4a17c019be00302aae20315aae30314aa57000094800100b507000014340100b434000094L8;FF400200f000e03e9148000194ff0301d1fd7b03a9fdc30091080040f9090540f9490d00b40a0140f9410180390101f8b7e0031faa4a050091290500d10a2500a9BL8;FF287968f8e103", - "08aa83800114ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa010300f021e02291e80300914202805286800194010300f021282391L8;FFe3630091800080522a93ff977f0600b160100054e11740f9e80f40f91f0101eb008c0054e81340f92a040091e00316aa49028052ea1700f90969213", - "8a5ecff97BBBL4;FF03000014a9030090297d36910a0380528b0280d20a0900f90b00f0f20b2500a9f44f45a9f71b40f9f65744a9fd7b42a9ff830191c0035fd62000805201048052L4;FB79626173655f6b6579726f6f745f6b65793031323334353637383961626364656653657373696f6e5374727563", - "7475726570726576696f75735f636f756e7465L8;FFf9031faae00319aae10315aa51c00094d60900b43ec00094e00316aa21008052390080523bc0009460e5ffb4e10318aae20316aaf50300aa41c0009444000014BL8;FFe00313aa2200805246000094610a40f98affff17f50300aae00313aa2200805", - "240000094610a40f9e00315aa92ffff17e00313aa220080523a000094610a40f9L8;FF080014eb23100054ff0208eb09010054e0e30091e10317aa22008052221fff97f42344a91f0114eb23100054e81f40f9e10315aae20317aa0001148b40400094BBBBL4;FF61940054f9ffff1769e00194f70300aa1", - "f0400b141fdff54e04305918100805264e0019440930035e85341b9e87f00b957ffdfc8d70200b4ff0600b100030054L4;FB74206f75747075742028616c6c2d7a65726f207368617265642073656372657429646576696365204944206973206f7574206f662072616e6765000000000000L8;FF2ab840a", - "9e9ff00f9ebe700f91f0109eb0b008092e971005489008052680a00f9692200396b0200f9ea0000b4e1030aaaf40300aae0030eaa2200805238e00094BL8;FFc0035fd600018052010580525c60019408a440a9e20301aae00308aae10309aa8a600114ffc300d1fd7b02a9fd83009109200091e80301aae", - "50300aaa9831ff8L8;FFe10700f9210100f021e03491230100f063a43591e0230091a200805224018052a7000014c80080d20800f0f2080500d1a0c300d1a8031df82a56ff97e10300aaBBBL4;FFe083873ce8a747a9482701a908008092485300a96a0100142003c03df43b00f93b008052e083873ce0c3", - "01912b89ff970803156bf51f00b903fcff5409358c52L4;FFc0035fd6dbf8ff97000040b9fbffff17c0028052c0035fd6fd7bbea9e20300cb1f0022eafd0300914200008ae1030054e30322aaf35301a9f40301aa7f0014ebL8;FFe00301aa810100f021a01791e8030091420280528ea00094810100f021", - "601591a40100d084a00391e0030091a363009102018052b30f00f986a0009468920091BL8;FF4a200194800200b00020149147200194800200b00080149144200194f6031faae00316aae10315aa4a200194800200b000a015913d200194800200b000001691BL4;FF4c2180396b710d8b8c00f8b761e10c", - "8b2b0180520a0000144d254039bf0500f1c80100548c1900126ce10c8b81fd0daa3f000beb030500544b018052e0031faaL3;ZB" + "BBBBBBBBBL8;FB7071722076312e73656e645f656b2e726563762065706f636820c01b3a2048656164657253656e74202d3e204374315265636569766564003c5472696d6d696eL8;FF000400ad616a29f8680200f9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd620fef", + "f9000a42f9122feff904260309181028052BL8;FF810000b4600a40f922008052ba240194611240f9810000b4601640f922008052b5240194611e40f9810000b4602240f922008052b024019460620191f30b40f9L8;FF7361193220010054536928380cfc5cd308050091290040f9280800f94c0200b500", + "fc55d336000014e10300a9e00301aae10309aa220080522300805224008052BBL8;FF880a40f9775a00a968a608a968320591776e01a97a6e02a9610206a9613a00f96082873c697e00f9699600f9784a01b91f0100f97f5601b9f44f45a9f65744a9L8;FFa1fdfff021442391a3fdfff063942391a0c300", + "d142018052e40080522c000014a0031df8a1fdfff02144239183fdffd063500291a0c300d14201805284008052BL8;FF7cffff17c80080d20800f0f2080500d170ffff17c80080d2e10700f90800f0f2080900d107000014e80b41b2e00700f904000014c80080d20800f0f2080500d1L8;ZDBBBL8;FB370", + "10000220000004d414320766572696669636174696f6e206661696c656400a71a400000000000340000000000000017010000110000006c69627369676e61L8;FF9ba8ff97e11740f9e3ffff17962e40f9560300b4e11740f9e80f40f9972a40f91f0101eb40850054e81340f9490480522a040091e00316", + "aaea1700f909692138BL8;FFe20316aac30401940803160be8bf0a39944200919f0219eb80050054f8bf4a39955a40a9620318cbdc0202eb63feff54580200344003188be10315aab302028bL8;FF050000141f0016eb1800188ba9fdff540200001437008052e003152aa8170094e003172aff074091ff4", + "30091f44f44a9f65743a9f85f42a9fc6741a9fd7bc5a8BBL8;FF4b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a0500916b2281b9cb0e00346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b050091L8;FFa9020094770a40f9680240f9080117cb9f0208eba9fbff54e00313a", + "ae10317aae20314aaa0020094770a40f9680240f9080117cb9f0208eba9faff54e00313aaL16;FFe82b44f9e82b00f9e82f44f9e82700f9e83344f9e82f01a9e83b44f9eb3744f9e84300f9e83f44f9e82300f9e84344f9e8af06a9eb4744f9e84b44f9e82f03a9BBBBL8;FB656443743153616d706c6564", + "756373656e64696e675f63743143743153656e74456b526563656976656465706f63686573656b637431436861696e506172616dL8;FFa98318386901084aabb35838a99318384901084aaac35838a9a318386901084aabd35838a9b318384901084aaae35838a9c318386901084aabf35838a9d31838BL8", + ";FFeeffff17281040b96800c8376800d03782100114731001147410011409004039e80300aae00301aa2a0900d13f09007149819f9ae90000b43f0500f161020054L8;FF0ab1003909b50039e9ab4f290ab9003909bd0039e9ab4e290ac1003909c50039e9ab4d290ac9003909cd0039e9ab4c290ad10039", + "09d90039e9ab4b290add0039BBL8;FFebfeff17a04301d1e10319aa02018052230080522400805227e0ff97bae77ba9a1035bf83c230091546b39f83f001ceb28dfff54fefeff1760ffffd000602491L8;FFe23740b9a08302d1e103182ab58302d153e4ff97080000b008710891a900009029011591e8c7", + "02f9080000d008112791e9d702f9c9048052e8cf02f9e8632291L16;FF680200f91e000014e8c341f9e9cb43f9e0dfc03d680e00f9080080923f0d00b16082803c680200f9a0020054e0431e919cdcff9712000014e0dfc13de8c343f9BBBL8;FF23008052240080522b000094770a40f96afeff17e00313", + "aa22008052230080522400805224000094610a40f971feff17e00313aa220080522300805224008052L8;FF1f0101eb204f0054e8cf42f92a040091800203914901805209692138ead302f95d230094e14316917c0d0094e0ab49f9800100b4e1d342f9e8cb42f91f0101ebBL8;FF04000014b50600f1d66", + "20091e0000054c1825ff881ffffb4c00240f922008052b5f40094f8ffff17340100b48806148be00313aa01f17dd302018052f44f42a9L8;FF86000034000080d21f000039007d20d4860000cbdf0002eb82000054000080d21f000039007d20d4840002cb8200403982000034000080d21f000039007d20", + "d4BBL8;FF08050091fa3b49f9e8d302f9fafcffb5e8031faaf98792b939010034290340b22911c0da291540d2290d098b2925019129fd46d32905009102000014e9031faaL8;FF080d40f900013fd6607e02f9618202f9acf4ff1760fdff9000401b9162fdff9042a01b91e102805251300094e8ef41f9e9", + "f341f960fdff9000f40e9163fdff90L16;FF800ac03d8182c03c881a40f9890e40f9f78340f9fb8f40f94083813ce107813de81f02f9e91302f9f527f8b7552b00b4b4b40094e00315aa2100805239008052BBBBBL8;FB6574206b657957686973706572526174636865746661696c656420746f20646563", + "6f64652073657373696f6e207265636f72642070726f746f62756600000000L8;FFbd9c0094a19240f9810000b4a09640f922008052b89c0094a19e40f9810000b4a0a240f922008052b39c0094a1aa40f9810000b4a0ae40f922008052ae9c0094BL8;FFe10316aae20315aac8000094760a40f9c1ffff1", + "7fd7bbca9f70b00f9f65702a9f44f03a9fd030091f30301aa210840f9f40300aa680240f91f0101eb600e0054L8;FF280041d23f0000f108459f9a1f0500f14c010054480100b4810000b4200740f922008052b41c0094211340f9015901b4201740f9050000141f0900f1210740f9BBL8;FF600702ad608", + "705ad628346ad620303ad820641ad603fc03de20703ad6003883ce8ff4139810240ad1f810071e10302adc2050054ea0b40f98903088b08011b32L8;FFe03100b5a0077eada8035ef8f3cf45f9e88306f9e8c745f9e03b833da00b7cade13f833d7f0208ebe02b833da0077dade22f833de137833de03383", + "3da1efff54L16;FFe802158b680a00f9951640f9550300b4610a40f9680240f9961240f91f0101ebe00b0054680640f9490480522a040091e00315aa6a0a00f909692138e10313aaBBBL8;FFf44f45a9f65744a9fd7b43a9ff830191c0035fd6e00313aa3b8b0094e80300aae00301aa88f70737d7ffff17", + "e92b00a9e0030091287b0094fd7bbda9f65701a9L8;FF0080099121800191c27c0094e92342a9e00319aae0f3c63d0178805222008052f5170af9e8130af908048152e91b0af9e9eb4df9e81f0af9e8270af908788052BL8;FF00008092d78200918af800941f0400f161010054fffedfc8c10240f981000", + "0b4c00640f922008052b3fc0094e00316aa0105805202018052affc009468fe4ad3L8;FFe10315aa0200001420008052f48300a9ff0f00f9a2000037e0230091ad000094c0010034200020d455fc41d3bf0214eb68020054f4031faae8031faab50000b4BBL8;FFaab31738aae357382901084aabc31738a", + "bf35738a9d31738a90358384a01084a6b01084aaae31738aa1358382901084aabf31738ab235838a9031838a9335838L8;FFea3301f96ac61291e8a30939683144b8490100b969e21291ea0342f968b604b9682213912001803de9ff41f90101803de83341f9696e02f9e9a34939687602f9L16;FF210080", + "52bbbc009460f200b4e1031aaae2031baae06300f9bebc0094ebbb40b9eccb40b9d40400143f0700b1e0010054f90000b4e0031caae10319aa22008052BBBBL8;FB441906a28a4ae7347b43050a50be8658d2c5bb819168e296f6c95b3cfeb3846bd1b6d4bb0e6bdac6a28c95d610754bfc363f00000abad", + "f8326a4bf3f2a760c8eL8;FFf44700f9e8d300b9a86e1c53e8cb00b9a86a1b53e8c300b9a8621953e8a71629a95e1853a85a1753e8a71529a9561653a8521553e8a71429a94e1453a84a1353BL8;FF0081c03ce86742f9a003983ca80319f8480200b0081140f91f0d00f143070054e8833291e0032d91d3", + "a6ff97e85346f91f0500b120600054e85b46f9e9f31691L8;FFc40c0094e10318aab402148bff0a00f1e80316aaf40f00f9a0010054e90740f9215442a9290114cbbf0209eb88050054b50000b46002148be20315aab50c0094BBL8;FFb80000b4e00319aae10318aa22008052b94c0194a8a300d1a96301", + "d1e1630191e82f00f92800009008113491e82706a940ffffd000d83291e83b00f9a80301d1L8;FFa3feff54e90f80123f002071ea0f801229140033c20000542a7c0653090500394a051a320a01003912000014eb0f80122c7c10532b2c0633ec0000352a7c0c53L16;FFe2030caaed0308aaf2e300f9f7c", + "b49a908008092e1d348a9e98700f9ec2b40f9f57b40f9e87700f9fe1b40f9e96340f9e86b40f9f1d300f9f1031baafb0312aaBBBL8;FFa00700b4164b40f96082c93c6182ca3cb4c31fb8df0600b1000400ad4002005415074da91ce749a91adf4aa90bef4ba9280400d11f0d00b1086740f968020054L8;", + "FF2007c03d0081853cfc2700f9da0000b4e0031baae1031aaa22008052b66c0094fc2740f99f1b00f103050054f8430691fb0c8092e02340f9080d8052826f089bBL8;FFe18341ade18308ade28342ade28309ade18340ade18307ada02100b4e0c3039147f7ff9707010014e1430091e20313aafb1f00f9", + "f70b00f9d2080094e08741adL8;FFf55b42a9f76343a9fd7bc6a8c0035fd6e10240b99f0a0071ff7e02a9000080d221001b32e10200b9ff1e00f980feff54600640f9a00200cbf1ffff17640240f9BBL8;FFca100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aac110", + "0094fad342f9fc0740919c83019144feff17e043169122008052L8;FF000300b50e00001428008052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6d30100b4b62c0094e00313aa21008052af2c0094400100b528008052L16;FF1f0008ebc9230054e91b40f9e0031f2ae80317aaea031caa2", + "b154038080500f14c1540388b010b4a6001002a61ffff5487120094e17342f9fa03002a810000b4BBBBBBL8;FB727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f6b64662e7273002f636172676fL8;FFe80b00f9a9831ff84", + "69c0094e00f40b968034039a102174a1f05007180fcff543a070094d6ffff1748074079a0831f78e0430091a12300d1fc430091e8230079BL8;FF690d0054e00313aae2fdff972024003728fc60d3681000b5200840921f1800f102110054217c0353211300343f0800718d0100543f0c0071600200543f1", + "00071L8;FF1b008092b70000b4e00318aae10317aa22008052b8200094e1af40f9f70340f921fcffb5e3ffff173b008092f7feffb5faffff1720fdfff000603091631c0094BBL8;FF631a0054bb835df8620740f95f0014eb69050054610340f9200080398000f8b728040091490400d1110000145f2800f", + "1880000542800028b08f1df384803f837L8;FFf30300aa3500028bffa300a996fdff90d6623e9117008012a88300d1e0830091f40301aaff8701a9f5db02a9f73b00b9725c0094a2035ef8a20a00b5a08300d1L16;FF63a80d91e003009122028052a4008052e80300f912000014e00300f981fefff021d0", + "149183feffb063900291e0030091220280528400805209000014e00300f9BBBL8;FB910454056506ff072409aa0acc0cff0f481254159819ff1f000117021d1813031e1b190b1408040d1f161c121a0a070c1511090610050f0e1c18142000000000L8;FF378eff97f71740f9e80f40f9080117cbbf0208e", + "ba8380054e81340f9e10316aae20315aa0001178bba800094e802158be81700f97f0600b1a086ff5480220491BL8;FFfd7b42a9ff830191c0035fd62805003628f97fd35f0108eb4881889ae10202ab620b0054020101eb810a00f9630b0054280101cb5f0008eb28060054ca02178bL8;FF69faff541200", + "0014df021ceba3040054f70300aaa08300d1e10315aae20314aae30316aa23000094a8035ef81f0500f1c0030054b4835ef8e6ffff17155300a9BBL8;FF200200b4e10315aae20313aa930200a9c0400194e00315aae10313aa22008052930a00f9f44f43a9f65742a9f85f41a9fd7bc4a8b040011440fff", + "fb000602891L8;FF60428f3c681601b92105803dc140009424000014e8c30c9114000014687240f9281600b40805088be00315aa0201805201f17dd3b04000943c008092aa0b0014L16;FFe88340f968fe00f9c2c00094e08750ad68e20d91e91b41f974d601f9000500ade87740f9e083c03d69ce01f968", + "d201f960ee803dff074091ffc30091f44f45a9BBBBL8;FB9bf974a41c7a8bf16c5e0bdbc2f8c63bbd36dd94c5363bc85f019c3ad6ffb68a1a9b7e7db8f2459d2cd9fc3e5c2981098a58ef03a9fc786c06070000150efe54L8;FFc2fdfff042402191e9a301a9e3430091568c0094fd7b44a9ff430191c003", + "5fd608feffd008d90791e00301aae10308aaa2028052fd7b44a9ff430191408c0014BL8;FF7f0208eb61000054e0631791eeaeff9708068052e9f342f9e07fc13d6826089be183c13de287c13d69060091e0833291000500ad0209803de9f702f932ebff97L8;FF22008052bc100094a0c300d1e103182a9", + "4030094b4937da9e0a30091e20340f9e10316aae30314aa45030094e00740f9e1a30091e2430091f6e6ff97a1035df8BBL8;FFe84742f91f0900b121040054f46f41a93b0c00b468071b8be9f301b2960a40f9695595f208f17dd31a6100d148ff43d3087d099bd50208ab42010054970640f9L8;FF6b0d0", + "b8b6b2501914a194b8b4b0500910a3040f96901098b0a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091490109abc2040054L16;FF3ad7ff97ebc341a9e70316aafe5756a9f22b40f9ecdb53a9e64f40f9e98740f9e03340f9e3ef40f9f7af40f9ee4740f9fbdf40f9f19740f", + "9fa1351a9e86b40f9BBBL8;FF0900f0f2e8470039e90700f961000014c90080d248008052a0c300d10900f0f2a2831d38a8931d38a9031df818770094e00700f9a1ffff9021203f91a3ffffb0L8;FF00e02c91e86300f9e863019108210091a10303d1a92b34a9e02f803d6d6c0094e83b40f9c9fdffd029", + "292491e003c63c682602a9e8008052e90741b2681a00f9BL8;FF81020054e1031faae00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6c80080d2e10700f90800f0f2080900d1b7ffff17e80b41b2e00700f9b4ffff17L8;FF61030054190000f022030e9140404e391ffc0371200300540004001", + "140400e3964fcff97f60300aaa00300b420030e91d30a00f9760200f9610282d28202018bBBL8;FFe0840054e8cf42f9090180522a04009109692138e1431691ead302f96e0e00949f0600b160a1ff54c0220291e14316919411009407fdff1780c20291a81d0094L8;FF080118910d2dff97e8034bf9f90", + "74bf9f80b4bf91f0500f181010054281f00121f0500714c05005448090035381f4092fa0f41b2091f40921b0309aaa1035df8L16;FF000400ad810000b4e00317aa22008052b9b0009408048052686200a9680a00f9b8b000940004805221008052b1b00094200400b4c00641adf70300aa610e40f9BBBBB", + "L8;FB67656d656e7443757272656e74000000bb124000000000003800000000000000e40100001a00000064656372797074696f6e206661696c656400000000000000L8;FFe20315aa230080522400805298bcff97e10313aaf35341a9cdffff1700feffb00080169165940094fd7bbfa9fd030091083c40", + "f9080100b4080140b20811c0daBL8;FF081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b250191L8;FF68230039e87342f9f62b00f9f9d300f9e98303b9ea0b0779eb9301f9eca30c39edab0bf96ad", + "30078699300b868f300f86c7f00396b7301f8b614ff97f90300aaBBL8;FFe2031aaafaff0039c2580194e00318aae10317aa22008052b7580194e00316aabc540094faff403908088052f60301aaf70300aafc03009102011acb390002ebL8;FFa9fdff9029e11e9108400039c80080d22001c03d0800f0f", + "2e9f35639e06302f91c490091280280520000803dfc5b02f9e85f02f9e86702f9e94313390f000014L16;FF800640f901e97bd302018052bad80094e00314aa0109805202018052b6d80094280080927f220039680200f9ff431491f44f45a9f65744a9f85f43a9fa6742a9BBBL8;FFe10240f9200080398", + "000f8b728040091490400d1110000145f2800f1880000542800028b08f1df388826f837e0230091302a0094e80b40b9e8f90737e80f40f9L8;FFe8cb42f91f0101eb20bf0054e8cf42f9090580522a04009109692138e1431691ead302f97d110094e8d352b91f050071c1000054e1d752b9e2db52b9e343", + "1691BL8;FFa80000b4608a40f901f57ed342008052b9f80094689240f9a80000b4609640f901f57ed342008052b3f80094689e40f9a80000b460a240f901f57ed342008052L8;FFf703182a0e000014202040a9e10313aa030d40f9e20314aaf44f44a9f65743a9f85f42a9fa6741a9fd7bc5a860001fd65", + "f09007141000054173f0153356440a9BBL8;FF9400805215008092e057813de15b813de8e30a79fc010014e8074091f6a745f90023009108810991f407409194820991a1880094e1074091e0431691023f8052L8;FF6c010014e8334ab948000037f81b05f9a02800b5a02302d12ef4ff97e80301aae0010", + "036082900b5e1031faacaffff17602400b5a02302d126f4ff97e80301aaL16;FFe86b00f9e8ff5e3969d14578e0d7803de023c23deaef43f92841082ae10b19ade127c23d699145b8e22fc23de417c23de00717ade02bc23de10fc23d3b8108aaBBBBL8;FB5700000000000000c903000016000000420240", + "00000000006a00000000000000ec0000002e00000042024000000000006a00000000000000890000002e000000L8;FFe0031aaae10318aa000dc03da8835cf842008052a0039a3ca8031bf8b6880094a8035df8a80000b401f97fd3e01340f942008052b0880094f30740f9a003da3cBL8;FF1f070031600", + "80054e8e20b9120c3c13ce98745b9e86f04a921c3c23c1f0b0071f59b45b9e8bf45b9e1c20891eac742f9fbcb42f9208717ade89308b9e11f00f9L8;FF200900540b0d4039f0030faaee0301aaed0316aa6bc100517f250071e8580054292d0c1b5f1100f1f6030daae1030eaaef0310aa800700540b1140", + "396bc10051BBL8;FF09018052a8035df8755a00a9755e01a9785e02a97c6605a97b6200b9682603a9686604a9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391L8;FF8031c03de8c302b98b4100f8204b803d8ac100f8204bc03de8d342b989fdffb0292126918101c03de01b40f920", + "43813ce1031091e8a301b9e8b341b92007c03dL16;FFfcbb00f9e14740f9fc0305aae56f40f9ec0311aaf10310aaea7300f9f00315aaf57b40f9ea0300aae00312aaf20304aae0f3803df9030faaed0317aaef031eaaBBBL8;FFf51b00f9f44f04a9fd83009115d040a9e20301aaf30308aae00315aae103", + "14aa590000941f0400f1410600543f0014eb020a0054080d80522854089b092540f9L8;FF55fdffb5f0ffff17e00313aae10317aae20315aad6070094770a40f9680240f9080117cbbf0208eb09fcff54e00313aae10317aae20315aacd070094770a40f9BL8;FFf65746a9f85f45a9fa6744a9fd7b43a9f", + "f030291c0035fd6370080521800809219018052a80640f91f0116eb090f0054e00313aa99f5ff9700fe073728fc60d3L8;ZDBBL8;FFfc430f912283c33ce8b341b9e0430691810f803debc741b901048052e002803de9cf40f9ea9741b980c38d3c800fc03d821f803d4047803d801fc03df81f00b9L8;FF", + "882648a98a2e49a98c364aa9e00300ad8e3e4ba9e00301ad080dc0da290dc0dae08302ade01f803de013803de007c03de10bc03de20fc03de303c03d8302803dL16;FF88139b9a000540ad000400ada08300d164feff97a9237fa9aa2f7ea92901088b080500913f010aeba8831ff808098052ea338a9a29", + "010acb0a0e8052292d0a9bBBBBBBBL8;FB616420c01020726563656976657220636861696e73002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e2d6c696e75782d676e752f7265L8;FFf50300aae0430091ff2301a9e10303aaf40302aae87f03a9b84301d1ff2304a9e87f06a9f", + "f2307a9e87f09a9ff230aa9e87f0ca9ff230da9e87f0fa9ff2310a9BL8;FF4c0000143f104071c30b00544b09c0396c1d00122c380c0b811140516b00f8376b008052430000143f004871030b00544b0dc0396c1d00122c540c0b81014851L8;FF5a8108aae90300f9560100b50d000014e00fc03ddafe48", + "d3f903162ae003803d09000014f9031f2a38008092b60000b4e00315aae10316aa22008052ae220094BBL8;FFe1031aaa22008052170100b4e30317aaba620194e81f40f9e00000b520008052e10317aa4c5e0194b3620194e81f40f920008052000540ad7f0600f1ea2340f9L8;FFe10313aa85fbff97b7", + "010034610a40f9680240f91f0101eba0090054680640f9090180522a040091e00317aa6a0a00f909692138e10313aa78fbff97560300b4BL8;FF1f0116eb29050054e00313aaa3efff9740fd073728fc60d3e80400b5200840921f1800f102050054217c0353210500343f040071e00100543f0c007161fd", + "ff54L8;ZDBBBL8;FB7269766174655f6b65797369676e617475726574696d657374616d7000000000920e4000000000005500000000000000ce000000010000007265676973747261L8;FFdf0600b180170054e00315aa71f2ff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b08", + "0500911f0109eb2816005458000014f6031faaBL8;FF290080521f0500f909010039c0035fd6290080520a2500390921003909010039c0035fd649008052098500a92900805209010039c0035fd6fd7bbfa9fd030091L8;ZFBBL8;FF42a81c91e82700a9e8030091090000b029b10391200440a9e82701a9", + "e82300910900009029113f91e82702a9e34300914e3e0194fd7b43a9ff030191c0035fd6L8;FFa8031df82249ff97e10300aa7a000014e00700f981fdff902184119183fdff9063e01191e0230091a20080524403805296000014c90080d2e843003948008052L16;FFe2c345a9ebbf40f9facf40f9e3134", + "0f9f7f340f9f44b40f91f0900f1ebbf00f949030054880100900801159129038052e86705f968feff9008611d91e8a303f9BBBBL8;FB7420563120436861696e204e657874003d044000000000004900000000000000e6000000090000003d044000000000004900000000000000fb00000014000000L8;F", + "F080113abe300005400fefff000c002916a8e0094e8031faa080113abc2010054090140b22911c0da291540d2290d098b2925019129fd46d30801098b00050091BL8;FFf65704a9f44f05a9fd030091ff033ad1e9fefff029610491ff0300f9e97301f9fa0308aaa84700d1e97701f9890c40f9e0070aa9e", + "0070ea9e00303aae20f0ba9L8;FFe0bf40f9e1a340f922008052ba120094e8af40f9a80000b4e09f40f9e1af40f922008052b4120094b50000b4e0df40f9e10315aa22008052af120094e8e340f9BBL8;FF10000014e8031faab60a40f976faffb5b41640f9e803088b54fbffb5f80308ab23fcff5460fff", + "fd000603b91634e019428008052ff0f00f9ffa300a957080035L8;FFbe520094000300b50e00001428008052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6d30100b4b5520094e00313aa21008052ae520094400100b5L16;FF00514da9e9ff00f9094144a9121149a9e0a700f917014fa9e9", + "db00f9093145a902154aa9e00f00f9008140f9e9b300f9093140f9e01700f9008540f9e9ab00f9BBBL8;FFf85f42a9fd7bc5a8c0035fd6f50300aae00313aa22008052230080522400805225feff97610a40f9e00315aa53feff17e00313aa220080522300805224008052L8;FFe00316aa02faff17e0431", + "69122008052d7110094e1d342f94ef9ff17e0431691e1031caae2031aaad1110094fcd342f9e8cb42f908011ccb5f0308eb492aff54BL8;FF6b710d8b8c00f8b761e10c8b2b0180520a0000144d254039bf0500f1c80100548c1900126ce10c8b81fd0daa3f000beb030500544b018052e0031faa4a010b8", + "bL8;FFc67c4093c5020e91a31e00517f7c0071a1404e3948030054a3c0238b69404d3968c04d391f8d0171e5979f1ae7879f1aa90200342900094b3f2500714c020054BBL8;FF00b0ff54f5d749f9f3d349f9b50b00b47622009104000014b50600f1d6620091000b0054c1825ff881ffffb4c00240f9220", + "08052b0320194f8ffff17e17749f9L8;FFea070bf9c32eff97e88340f9f40300aaf50301aae00316aae10314aae20315aa039140a9962dff9720070036b50000b4e00314aae10315aa22008052ae320094L16;FF6183ca3ce00b01ad6083c93c6283c83ce00704ad6183c73ce10b03ad1cffff17fd7bbda9", + "fc0b00f9f44f02a9fd030091ffc314d1ff0300f9f30300aa02328052BBBBBL8;FB540000000000000073000000050000001d1c400000000000540000000000000079000000050000001d1c40000000000054000000000000007f00000005000000L8;FFf60314aa00c1cb3c01c1cc3ce80f40f90c0880520", + "00500ad3ae7ffb4eb430391ea8300915f8300f16081c63c6181c73c690146f8688148f84081823c4181833cBL8;FFe20315aaf60300aac21a0194571740f9570400b4541340f9ba1a0194e00317aa21008052b31a0194601500b4e10314aae20317aaf80300aab61a0194482740f9L8;FFe8df1aa9f7031c", + "aafc030daaf8030eaafa0310aab81a0094ed031caafc0317aae90315aaf50314aaf40313aaf30316aaefdb59a9ec031baafbdf5aa9f0031aaaBBL8;FF63701d12eb5300798b7041f8efb302f8affd68d3871040b824008052a6431a78e85344b8848001aae103192ab1831938910140b90cf040b9f21740f", + "9a7031ab8L8;FF21802291a2018052a3fdffb06320239124018052ad60ff97e15346f9e15306f9e083329161fdfff021203f9102028052a3fdffb063c02c91e4018052a360ff97L16;FFa083d63ca183d13ce20318ada083d23ce10316ad002100b4f40300aae0030b91a0e2ff97e00314aa342300b45801", + "0014a2c303d1830c805242e1ff97802200b4BBBL8;FFe8a701a960760194c0ffff90008000916d760194c0ffff90000036916a760194c0ffff900060369164760194c0ffff900020259164760194c0ffff9000802591L8;FFe80348f9c8f100b4e1ff47f92800805248030039280040391f050071c1f1005", + "4e0074091e14306910274805200800991f807409118830991b67a0094e0074091BL8;FF083c0039280080520c300039c911092a0b3400390a3800390940003908000039ff830091c0035fd6ff8301d1fd7b04a9f44f05a9fd030191f30300aa3f9400f1L8;FF5f000e6a0e02110a31017eb2508a03aa2912", + "899a114c1353ef01010a0e010e0adf010d6aec010c0a0f3211aa30017ab20d1c00128c01080a0912899a0e1c0453BBL8;FF29194a8b290500910a1840f92801088b5f0500b180020054092040f92a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab83010054L8;FFe89704f9", + "e8430e91ea832491e99f04f92900009029412a91e89b04f9e8431f91a04700d1e9a704f969fdffd029211091e8a304f968008052e1430f91e90702f9L16;FF810000b4e05f40f922008052baba0094b50000b4e05b40f9e10315aa22008052b5ba0094bc0000b4e06f40f9e1031caa22008052b0ba0094fa", + "031faa762201a9BBBBL8;FB1d1c400000000000540000000000000059000000050000001d1c40000000000054000000000000005f000000050000001d1c4000000000005400000000000000L8;FF00018052010380525386009400018052016c80525086009400018052016680524d86009400018052015a", + "80524a86009400018052010f805247860094e0fdffd0BL8;FFe1830b9120013fd6fcfb42f99f0f00b1810d0054a8008052a5ffff17e03fc13de143c13d1443172ae81345b9e063813de167813de8a305b93a000014480200b0L8;FF2a040091e00317aaea0f00f909692138e1230091bae5ff97f90f40f9e", + "80740f9080119cbff0208ebe80c0054e80b40f9e10318aae20317aa0001198bb50a0094BBL8;FFf40740f950ffff1720008052011880525146019420008052810380524e46019420008052010480524a460194ff4307d1fd7b17a9fc6f18a9fa6719a9f85f1aa9L8;FF0825019108fd46d30805009109004", + "0f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091L16;FFf7ef49a9e1d348a9ee0311aafa8700f9fa0302aae22f40f9f10312aab409001408234039e90318aa1f0d0071c00000541f110071e1200054282540391f050071BBBL8;F", + "F403e00b488ae8e52a9ffff9029c1149148aeac72200540ad082000b9880280d2890480520800f0f2c0a601a908110091000400adc8a600a948008052d3a20039L8;FFa80000b4602e40f901f97fd342008052b96a0094683640f9a80000b4603a40f901f97fd342008052b36a0094684240f9a80000b460", + "4640f901f97fd342008052BL8;FFe20313aac1f6ff97800500b5e1031faae8ffff17e10314aae20313aabbf6ff97800500b5e1031faae2ffff17400600b5e00313aa99f7ff97e80301aa80000036L8;FFe90300aa1f3d01383f4d0138e80300aae90300aa1f5d01383f6d0138e80300aae90300aa1f7d013", + "83f8d0138e80300aae90300aa1f9d01383fad0138e80300aaBBL8;FF29060054e80f41b2e80300f9e00300911f310094f44f45a9f52340f9fd7b43a9ff830191c0035fd6f503012a74040051e00313aad7070094e80300aae00301aaL8;FFe00304ad1fd8ff97e8830291e00301913f260094980000b0e80", + "30391e0830291011740f973260094e8830591e00303914526009448fdffd008012b91f7ff4539L16;FFf40300aaf30308aabeaa0094000580522100805236008052b6aa0094c00b00b40805805216000039e1230091e88300a9800240f9f60f00f975d2ff97e003152aBBBBBBL8;FB616e74756d20726174", + "636865742073656e64206572726f723a20c0001b737071722076312e73656e645f63742e726563762065706f636820c0243a2043743153L8;FF02308052c39e0094f42340f928008052f51f40f9933240b9e123019102308052a0220091a80200f9ba9e0094b38a01b9e10314aadbffff17e91f40f948008", + "052BL8;FF74f7ffb5e00308ab43f8ff5400ffffd000202d91691a0194e00313aa22008052c2020094610a40f9a1ffff17e00313aa22008052bd020094610a40f9bdffff17L8;FFe11fc03de28302ade113803da2033cada103973c20010054a2037cade00316aaa103d73cf60309aae20301ade107803d41", + "0700b53b000014e90700f9810000b4BBL8;FFa00a0054f30300aae8230091022a80520021009161820091f60700f9bd5e0194770a40f9ff9e00f1a9010054f70600d108038052690640f9e826089b770a00f9L8;FFc05e0094e00319aa21008052b95e0094e0fd00b4e10314aae20319aafb0300aabc5e00", + "94f4e340f9f61b00f9b40500b4f30700f9f303152af5031aaafa0317aaL16;FF48050091680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd6f50300aae00313aa22008052230080522400805290020094610a40f9e00315aacaffff17f50300aaBBBL8;ZBL8;FF6e7a0094e0fdffd000000f916b7a0094e0f", + "dffb000003c91687a0094e0fdffd000400d91657a0094e0fdffd000800691627a0094e0fdffd0008003915f7a0094BL8;FFe00313aa0103805202018052f44f44a9f65743a9f85f42a9fd7b41a9ff430191b5fe001428008052bf0a00f9bf2200a96142009100008092744200917dfa0094L8;ZFBBL8;FF4", + "a1d409208010aaa69a200a908008092e03340f9680200f99a0000b4e1031aaa22008052b43e0194b70000b4e03740f9e10317aa22008052af3e0194e12f40f9L8;FFa002805221008052ba3e0094004801b468fdfff008d51d91690080520001c03d08d140f8e9c30f39c90080d2f80300aae0f301f90900", + "f0f20000803d08d000f8L16;FF6083c43ce183813d6183c53ce287813d6283c03ce06f813d6083c63ce173813d6183c13ce25f813d6283c73cfabb42f9e077813d6083c23ce163813d6183c33cBBBBL8;FB3090a9c57de84c2d12022f005e16bc2dfeb0758af76124dfd9c80e34e2c4c47b8b98c369fbd6e", + "caba79744f74abfa951a28cf47c80e10000c867bc1790884b4fL8;FFf80300aabf8e00944000805241008052b88e0094207a00b4f90300aab98e00944000805241008052b28e0094607900b4fa0300aab38e00944000805241008052BL8;FFf3ab45f90163009102288052c10e01943f0700b140270054e0", + "c32291e1c3279102288052bb0e0194e0c31d91e1c3229102288052b70e01943f0b00b1e1c8ff54L8;FF685200a9f44f42a9f65741a9fd7bc3a8c0035fd63500805275d200a928008092680200f9f44f42a9f65741a9fd7bc3a8c0035fd600fdfff000a03c915f0a0094BBL8;FF692200a930000014e082c0", + "3ce88241f8e00315aae003803de80b00f9bd4a0094f60300aaa0020291f70301aab94a0094f80300aaf90301aab24e019400048052L8;FFf30300aae00308aa06fdff97e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eba9140054088c48f8L", + "16;FFebf300f9fb0311aaf10300aae7af00f9e70316aae00319aaf4031eaae6030caaef8f00f9ebb344a9e87700f9f9fb42a9fc4340f9f74f40f9ef3b40f9e8030aaaBBBL8;FF0a010039e0ffff17ea0f80120b7c10530a2c0633eb0000350b7c0c530a050039090900396a091b320a010039d6ffff170b7", + "c1253ec0f80120a0900390c440c33L8;FF080380d20800f0f21a1100d1e9d342b9204bc03d8101c03de88f01b9e94303b98041883c8021c03de95343b9811d803d8182823c8082833ce98b01b98082c23cBL8;FF2a0700910001803d090900f98a0a00f9beffff17800400b5e00313aa9ffbff97e80301aa", + "40010036e80400b5e1031faab6ffff17e20313aa230c805241f5ff97L8;FF2100080b7f00016b2afcff54c11240f93fcc74f22001005434cc749288fe44d3080500d11fc123eb23fbff54834200d1bf1040f2a0000054e3fcff9063e00b91BBL8;FFe1d342f9e8cb42f91f0101eb402a0054e8cf42f92a04", + "0091c02202914901805209692138ead302f9bd140094e1431691690c0094e0b349f9800100b4e1d342f9L8;FF1a440094e8074091e13b40f9e0c3229108011891e282009153cafe97e80356b91f05007141020054fa074bf9fb0b4bf9f90f4bf9fc134bf9f8174bf9f51b4bf9L16;FFe00314aa22008052b", + "bae0094f44f54a9f65753a9f85f52a9fa6751a9fc6f50a9fd7b4fa9ff430591c0035fd622feff9042c0389145feffb0a5602991e1030191BBBBBL8;FB7f0b00000e00000042024000000000006a000000000000005b0000002600000042024000000000006a00000000000000fb0000002e0000004202400", + "000000000L8;FF6b0500f1ec030daa81feff54a90109abe2000054200108ab62010054fd7bc1a8c0035fd6e90309ab63ffff5400feffb000c00b916192009400feffb000801691BL8;FF09fd46d30800098b080500911f0109eb880b00546d000014f30300aa1dfdff97e80300aae00313aa090140b22911", + "c0da291540d2290d098b2925019129fd46d3L8;FF09c10039e9ab4f290ac5003909c90039e9ab4e290acd003909d10039e9ab4d290ad5003909d90039e9ab4c290add003909e10039e9ab4b290ae5003909e90039BBL8;FFf65718a9f44f19a9fd030591e10b04a9f603072af703062ae05700b9f40305aa", + "f80308aaa96f48a9e92f00f9a93f40f9e91f00f9a93b40f9e91b00f9b94f46a9L8;FFe10317aa54520094200080522102805251520094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff032ed1f30308aaa83340f9aafdff90L16;FF690200f96082803c680e00f9a5000014e8030", + "091418300910228805200810091fc030b91bbd60094fa4340f9e8b345f9e0d7c23df40300f95f0f00b1e80f00f9BBBL8;FF63a00291a0c300d142018052a400805212000014a0031df8a1fffff021780391a3fffff063e40391a0c300d1420180524400805209000014a0031df8a1fffff0L8;FFe1431691", + "850f0094e09b49f9800100b4e1d342f9e8cb42f91f0101eb008f0054e8cf42f9090180522a04009109692138e1431691ead302f9780f0094e88349f9BL8;FFfd7bc2a8bd00001460220091d700009460220291f30b40f9fd7bc2a8b2fdff17610640f9810000b4600a40f922008052b1f60094611240f9a1", + "0800b4601640f9L8;FF20201212040080d200600a121f10507101010054e44b40b9e1030191e3430191e0008012e30f02a9e11b00f9e07f072963020f32060080d2050080d2610c8092BBL8;FF15008092e8d342f9e067c13de94306912081009102708052e8a302f9e843169101610091e04f813dba3601", + "94e063c13de8a342f9e907409129c13591f73340f9L8;FFe2032a91e10316aaf9d6fe973c008092fc3301f95e010014c80080d20800f0f2084500919f0308eb81000054e0032a91c6f0ff9769010014200743ad61fdffb0L16;FFf7c302f9e9bf02f9eb8b05b9ec8f05b9e8cb02f9db180094e0b343f91f0", + "400b1200f0054eb831d91f7430d91ed031baa681142f869d140786091c33ce1f7c13dBBBBL8;FB656d6f74655f726567697374726174696f6e5f69646c6f63616c5f726567697374726174696f6e5f6964616c6963655f626173655f6b657970656e64696e675fL8;FF200108aba2000054fd7bc1a8c0035", + "fd6e00308aba3ffff5400feff9000600f916682009400feff900060029163820094e0fdffb000200c9160820094ff4302d1BL8;FFa00240f922008052bb060194f8ffff17e88b40f908d7ffb40805088be00313aa0201805201f17dd3b3060194b2feff17f63f42f92083c13ceae32291e9d742f9L8;FFb5", + "c2009180010054a1025ef8810000b4a0825ef822008052b7060094a1825ff8e1feffb4a00240f922008052b2060094f3ffff17d70000b4e806178be00316aaBBL8;FF48000037f98f00f9c1b20191a20301d110ccff97e0f9ffb4520000143f100071200300543f140071200500543f18007181f8ff54e87", + "f40f91f0500b161000054L8;FF03c1833ce80b40b9400504ad418147ade8a700b9e81340b9430905ade4838a3c8001803de8d302b9214b803dfafdff17c8000090081140f91f0900f123030054L16;FFe9eb00f9e98b40f9f73b00f9f70301aae9b700f9e9c740f9fed300f9fe030faaef0319aae92311a9", + "f90306aae6031baae9e342f9eefb00f9ee0310aaf1a34ca9BBBL8;FFbd660194752e40f9682640f9bf0208eb20050054080d8052762a40f929008052a85a089bbf1600f1097d02a909018052186500a9b90600911f2503a909048052L8;FFe00301aae10309aa22008052f4030baad7050094e10340a9eb0", + "314aa2aa040a9290040f90dfc6ad35369283808050091280800f90dfeffb43f0108eb73611932BL8;FF60fbff543f100071c100005481620091e20313aabdf2ff9720fbffb452000014e20313aa230c805246edff97e10300aad4ffff17800c00b5e00313aa97f3ff97L8;ZDBBL8;FFbd260194602e40f9a", + "00000b4613240f9610000b422008052b7260194611a40f9810000b4601640f922008052b2260194614640f9e10400b408108052606a68f8L8;FF611240f9810000b4600e40f922008052b9260094610240f9810000b4600640f922008052b4260094602e40f9a00000b4613240f9610000b422008052ae26", + "0094L16;FFf14f40b9e18100ade201803df1490629efc1019121fbff546801088b08050091290308eb41020054f50302aaf80300aaf7031faae8031faa1d000014f6031faaBBBBBBBBL8;FB6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f73746174652f73657373696f6e2e72730", + "012696e76616c696420617267756d656e743a20L8;FFa20e40adf90300aae9c301f9e92b40f948008052010001ad1f0309eb020c00adff0f01f9ff0b01f9ff2701f9ff2301f9ff3f01f9ff3b01f9ff5701f9ff5301f9BL8;FFf44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6ff8303d1fd7b0a", + "a9f85f0ba9f6570ca9f44f0da9fd830291081c00121f090071e1010054e00302aaL8;FF3f140071010400541f0400f1010c0054a8835cf8090540f9292100f1a30c00540a0140f94b8540f80a2500a9eb2f00f9e1ffff173f040071a00100543f080071BBL8;FF28008052e81b00f928008052e84b00b9e0", + "0306aaf40306aabe5f0094fc0300aae00316aaf80301aaba5f0094e92b40f93b1940f9bb00f8b6fa031faae0031aaaL8;FF680240f9080116cb9f0208eb48060054680640f9e10315aae20314aa0001168bbc630094c802148b680a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6BL8;FFf44f47a", + "9f65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6170080923800805219018052a80640f91f0116eb890c0054e00313aa98f0ff97e80300aaL8;ZDBBBL8;FB657373696f6e000073104000000000002d0000000000000060000000220000006d697373696e67207071207072652d6b6579204944", + "6d697373696e6720707120L8;FF00240054802202916bfcff97080040b20811c0da081540d2080d088b0825019108fd46d30900088b37050091ff0208eba822005459010014e11740f9e80f40f9BL8;FF09010039fd7b43a9f32340f9ff430191c0035fd6e043c13c2800805268020039e003803d6012803", + "cfd7b43a9f32340f9ff430191c0035fd6ff8302d1fd7b08a9L8;ZFBBL8;FFe2020054160116ab02030054f70600f173a2019161feff54c80215ab42010054000114ab82020054f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e80315abL8;FF6c0100543f040071600700543f08007161060054816200", + "91e003082ae20313aa4efeff97200700b4fa0000143f0c0071000700543f100071210500541f0900f1L16;FFf4032b91c3c30094e87740f981220091023180520aa540a90081c03da0039d3cea4700f9e96b00f90aa541a9e0f7803de9e700f90ba542a9e92f17a90ba543a9BBBBL8;FBd30940000000000", + "055000000000000002901000019000000737071723a3a76313a3a6368756e6b65643a3a73746174657300000000000000d309400000000000L8;FF080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f0008eb29210054f30b40f9fd7bc2a8c0035fd6e80300aa098d40f83f", + "0500b1BL8;FFc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff54e0fefff000e03391660f0194e0fefff000e00e91630f0194fd7bbfa9fd030091082440f9080100b4L8;FF23008052e97b00f9091141f8089141f8e92b10a9e87f00f91c040094e86b42f9e96f42f91f0500f1e99300f9c03f005", + "4fa7342f9e8a740f9a80000b4e1af40f9BBL8;FFe007803d1f0500b1e1f9ff54eeffff17a0835df8dcffff17a0031df861ffffd02190049163ffffd0630c0591a0c300d1a20280526401805212000014a0031df8L8;FFe8031691e13f02f9290c40f9e103129120013fd6fbc342f97f0f00b1410a0054a80", + "08052a8ffff17404fc03da80359f814000014e8e322910081cb3ce8c344f9L16;FFe103002a9b390094e203012ae103002a98390094e203012ae103002a95390094e203012ae103002a92390094e203012ae103002a8f390094e203012ae103002aBBBL8;FF150300b4ab0240b26b11c0da6b1540d26b0d0", + "b8b6b2501916bfd46d36b0500912801088b49010b8be10313aa0001098b9ef9ff97380200351c000014e8031faaL8;FF4803188be8d302f9df0600b14064ff5481620391e2431691400080523d1000941dfbff17e8031faa000119ab224e0054e1431691790c0094f90b40f91f0700b1BL8;FF490109cbea", + "0080523f1d00f129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f60300aa080014ebe3100054ff0208eb09010054L8;FF0b000014151c00f91b000014201040f920f4ffb4330c40f9000400d194020e9161a20091818201a97f7e00a9e00313aaf35341a9fd7bc5a8c0035", + "fd6352440f9BBL8;FF501400949f0e00b140020054e1d342f9e8cb42f91f0101eb60b70054eb074091e8cf42f92a0400916b810991490380526001029109692138ead302f9ce1b0094L8;FFa10357f8810000b4a08357f822008052b9330094e11340f9810000b4e01740f922008052b4330094f44f5aa9f", + "65759a9f85f58a9fa6757a9fc6f56a9fd7b55a9L16;FFf52342f9a203953c4283c43ce10302ad4083c33ce00b01ad1d0000148862069189565ca9806ec03d0101c03de083029188d640f9812200914083813ce107813dBBBBBL8;FBe80e4000000000003200000000000000a800000014000000770d40000", + "00000002e000000000000006b0100003100000063616e20616c7761797320617070656eL8;FFe89b40f960020191e10317aa0801028be89b00f953970094e0430391e102148be20318aaf83f0439ba9b0094f90b40f9e08749ada05701d1e257c03de1830091BL8;FFb6031ff8b7831fb87b1701941f0400", + "3180080054f40f40f9760080520800001400010039b402148ba08300d1f40f00f9711701941f040031400700541f000271L8;FF090141d21f0100f1e8ab0bf960838b3c4083cd3c29459f9a61838c3c4183ce3c3f0500f160838d3c4083c73c61838e3c4183c83c6083873c4083c93c6183883cBBL8;FFf4", + "0300aa080115cb5f0008eb88010054b30000b4880640f9e20313aa0001158bbc5b0194a802138b880a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00314aaL8;FFc5000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f91c62ff97e10300aae15306f9e083329161fdfff021203f9102028", + "052a3fdffb063542d91L16;FF420200b4432440b97f040071e8020054481840b9a8030037e801805214000014e003c03de80b40f9090080926082803c680e00f9690200f9fd7b47a9f34340f9BBBL8;FFfd7bc2a8bc7b0114f30b40f9fd7bc2a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da", + "9fd830291081c00121f09007181010054540040f9880640f9L8;FFea4709f9e85309f9e95709f973770094f6ef47f9e01bc43de11fc43de0431691e8036179e1833791023f8052e057813de15b813de8e30a79b67b009438008052BL8;FF6ac10011cb010d0b29114c0b0a0800396ac100118b0d00122c0c", + "403929c100117f2500710a0c00390910003909819f1a9f7d02710a819f1a8d0d00122e104039L8;FF680a00f9ceffff17291040b83514009108fd0f37ea031faa08fd1737eb031faa48001836b8264078c80120376800283688120b8b0b1140798812188be1230091BBL8;FF6801084aa9e31838a8f31838", + "e18305adf46b00f953370194e08745ada8035ef87f1e0139e82300f9e86b40f9e083843ce183853ce00742ade83700f97f0200f9L8;FF00e500b4e10315aae2031aaae02300f9c03b00940300001428008052e82300f968c640f9694642b91f0500b1e94f00b900020054e0430f9161220691340f0094L16", + ";FFf9031f2a7b3e00b41a008092e00309aaf5031baae94b00f9e9040014c10000b4f40300aae00316aa22008052b2bb0094e00314aa9c0000b4e1031caa22008052BBBBL8;FB339df3ec27f1e8beaaf611e960475463a78121c6030a37f8a28c1c5b615203757e800000fa111a782e830d0e9152b1952c3f", + "1eb49aa770d4a68e000000000000L8;FF09793378b50a00f173060091c0daff547f0214ebe3feff54e84b41f9d77a73789f0208eb20010054e84f41f91779347894060091f45301f9b50a00f173060091BL8;FFe8ffffd008012391e85f04f928008052eac32291e96f06f9a04700d1e1833291e95706f9c", + "9fefff029ed0a91e86b06f9c8feffd008552c91e96306f9290080d2L8;FF131000b91f500039f44f42a9f50b40f9fd7bc3a8c0035fd600018052010380524c070094fd7bbea9f44f01a9fd030091f303012af40300aab20b009400028052BBL8;FF22008052e80f00f9bb4b019488a243391f050071c0000", + "0541d000014f60f00f988a243391f05007121030054e8830091802604918182029100480094f6d742a9L8;FF89fdffd029a10891287968f8e10308aa4b470014fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e0030054e00313aa40000094080040b20811c0daL16;FFe83744f9e93344f9e8", + "4300f9e83f44f9e8a706a9e84344f9e94f44f9e8ab03a9e84b44f9ea5f44f9e87b00f9e85344f9e8d300f9e85744f9e9230ca9e86344f9BBBL8;FFf65745a9f85f44a9fd7b42a9ffc30191c0035fd6e0230091e1031faa22008052230080522400805223f7ff97f72341a996ffff17f8031faae0230091e1", + "0318aaL8;FFfd7bc2a8bc6b0014604a40f9a00000b4614e40f9610000b422008052b66b0094611240f9810000b4600e40f922008052b16b0094b40000b4600640f9e10314aaBL8;FFe00314aae80700f9a6f3ff970800f0d2965e02a9886200a9e80740f9992201a9e8c303910081c23c8002833cf8031ba", + "af9c303913b0080921600f0d217008092L8;FF0d00098bae3540a9ad010eaabfc101f220ffff543f0101ebc2fdff540d68e9388dfdff37290500913f0009eb81ffff5460000014ae1d4092ad1d00128e696e38BBL8;FF6006803d682600a93c000014880200b0081140f9480300b4e8430191290000b0296", + "10491a82734a92800805229ffffb029610891aa0303d1a04700d1e8a711a9L8;FF7b6200b9682603a9686604a9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd620008052e10317aa4827009420008052e10319aaL16;FF40feff9000c0299123feffd063001a9144feff90", + "84802a91a24700d1c102805255a70094e0031391017880520210805223008052240080528dcfff97e86b42f9BBBBBBL8;FB6c20746f20c00d20746f20737563636565643a20c00025636970686572746578742076657273696f6e2077617320756e7265636f676e697a6564203cc0013e00L8;FF1323179b", + "680240f988fdffb5efffff173f4100f1011c0054e08703a9b99f00944000805241008052b29f0094002300b4f40300aab39f00944000805241008052BL8;FFa0031df801ffffd02104129103ffffd063701291a0c300d142018052440080521a000014a0031df801ffffd02104129103ffffd0632c1291a0", + "c300d142018052L8;FFb5835ef8e00b803d5f0700b1e1020054e00bc03de00300adb70000b4e00318aae10317aa22008052b31f0094f7031caaf8031baae11f40f9c10000b508000014BBL8;FF150840f9f60301aa3f0015eba204005408038052f30300aa090440f9c026089be80336aaf40302aaa80208", + "8b0805088b02f17dd3176040a9016000915a600194L8;FF490300f9680000b4e00313aa00013fd6810640f9611601b4820a40f9e00313aab55f0094af080014f7c31791e82746b9f50346b9e042c13ce142c23ce0a30c91L16;FFe003088be10313aa35edff9775fdff34610a40f9680240f91f0101eba00", + "20054680640f9090180522a040091e003152a6a0a00f909692138e10313aa28edff97BBBL8;ZBL8;FF9ba3ff97e11740f99cfdff17f30300aae063009122008052230080522400805293a3ff97e11740f9e00313aab7fbff17e0630091220080522300805224008052BL8;FFe0031f2ac0035fd6fd7bbba9", + "f90b00f9f85f02a9f65703a9f44f04a9fd030091f50305aaf40304aaf90303aaf70302aaf80301aaf30300aab2ff009400038052L8;FFaa2c3ea9ac343fa9c0035fd61f2003d52c3440a90e0c409203ec7c9221000ecb42000e8b261c41a90c3400a9282442a92a2c43a92c34c4a9424002f169010054BBL", + "8;FFa0031cf841ffffb021ec039143ffff9063c03991a00301d162028052040180522400001441ffffb021ec039143ffff9063203e91a0031cf8a00301d162028052L8;FF1a0100b4e00315aae1031aaa22008052f5030aaab83f0094ea0315aafa031faaf5031faaf903089139030014e8634f39a807003", + "6f9030891ba0000b4e00315aaL16;FF1f0500b1e26b813de16f813de073813de363813d006a00546083c33c6183c43ce0831d91693740f96283c23ce1030e91e0871dad6083c53ce9f301f9e9e35539BBBBL8;FB3dbf33e7d7f748dc6b8c0c470171b1c65491c38df289529f333222ddd62940d8754378a6", + "7d5115cbd89342e67621ca0d44d47397a28c6b70e99f000079840a54L8;FF082440f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b1400400540a1440f9092040f90a0100b44b0140b2BL8;FFff830cb91f0800f1e1350054a02302d1e0ecff97800a0", + "03621f8ffb4dc01001401c30091a22302d1fcebff9780f7ffb49c010014a22302d1830c8052c3e4ff97L8;FFb47c039b0b00f0d2f50304aa6b0104cb9f020bebe8020054010100b4a17c019be00302aae20315aae30314aab30f0094800100b507000014340100b4b10f0094BBL8;FF19020034e8030091e", + "10314aa9a02028b0001198bbf4f0194e83340f9e0020191e10300912200805208050091e83300f94c4b0194ffff0039f50318aaf4031aaaL8;FF10000014e80308abc2010054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c003", + "5fd6L16;FFe8c300f9e8d343f9e73b44f9e03f44f9e64344f9fe4744f9e8ab00f9e8d743f9f54b44f9fa5f44f9e56344f9e46744f9e92312a9e8db43f9e9eb43f9f66f44f9BBBL8;FFc3150054e90240f9e00318aae30319aa2801088be90b40f9e82a00a928fd60d3880a00b5280940921f1900f1220b00", + "54217d0353c10b00343f080071ac010054L8;FFe8070036e00301aaf44f45a9f52340f9fd7b43a9ff830191c0035fd68000805206000014e00313aaeb070094e80300aae00301aaa8fe0737680240f9090540f9BL8;FFa6fcff97e80301aaa0050036e80900b5e1031faadaffff17e20313aa230c805248f", + "6ff97e10300aaa0faffb4caffff17e00900b5e00313aa98fcff97e80301aaL8;FFe20300cb1f0022eafd0300914200008ae1030054e30322aaf35301a9f40301aa7f0014ebe18b40b2422041fae8030054010000f021d047b981000034010000f0BBL8;FFe8cf42f9090180522a04009109692138e143169", + "1ead302f96f0d0094df0600b18000005480020391e1431691951000941f0700b1e080ff54802202916c010014L8;FFe82700b9fc290094e80356b9e00740918100805200001891ff0316b9e82300b9f5290094e80356b9e00740918100805200001891ff0316b9e81f00b9ee290094L16;FF60864ead80a2", + "019168fa40f9e103009102328052800602ad60864cad883200f9800600ad608a4dad800a01adb9af009460220091f44f5ba9fcd340f9fd7b59a9BBBBBL8;FB616c5f6964656e746974795f7075626c6963000000000000920e4000000000005500000000000000ce000000010000006d6573736167655f65", + "6e63727970746dL8;FF082440a9e20301aae00308aae10309aa81930014000040f975930014000040f978930014090040b9e80301aa0afefff04a613991e00308aa620080523f010071BL8;FF2911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb492d0054080c47f81f0500b", + "1802300546c030094080040b20811c0da081540d2L8;FF23c5ff97e05b01b9a04700d120c5ff97e05301b9a04700d11dc5ff97e04b01b9a04700d11ac5ff97e04301b9a04700d117c5ff97e03b01b9a04700d114c5ff97BBL8;FFc0035fd6a0d3de3ce007803dbd5701948004805221008052b6570194600", + "200b4a8624039e10340ad1600003908440039886240390110803c088c003988048052L8;FF08812a91e1833291e3c3179142008052f35306f9f45b06f9e9ff02f9e90703f9e80b03f9aee7ff97e1a345f9810000b4e0a745f922008052af570094f37740f9L16;FF750a00f998faffb4680240f9f9621932", + "bf0208eb61000054e00313aa14d20094680640f997fe78d319693538d51e0091750a00f937fbffb4680240f918631932BBBL8;FF882700a908fc60d3a80b00b5080840921f1900f1420c0054017c0353c10c00343f040071200100543f080071c1faff5481220191e003082ae20313aaf6fbff97L8;FFb50", + "600f1d6620091e00d0054c1825ff881ffffb4c00240f922008052b6770094f8ffff1760020291b10b0094e80740910881099100010491740b0094f4cf49f9BL8;FF090d48f83f0500b1a0000054f30300aae00308aaae000094e00313aa145c40f99f0600b1c0f4ff5413544ca9950100b47622009104000", + "014b50600f1d6620091L8;FFe20316aae10314aae003132aa0023fd6e4000094fd7bbda9fd030091f35301a9f30302aaf403012af51300f942cc218bf50300aa40200091610240f961ffff97BBL8;FFe8330af988230f91f8230af9fb2f0af9f6370af90001803de91f0bf9f6230bf9b5370194f43349f9e", + "04306918123009102738052b7370194e083c53d89630f91L8;FFc80080d2e0232a39e0032a910800f0f2ff272a39e84305f91d3eff97e80300aae0032a9161fdffb0215814914202805263fdffb063541391e84305f908000014L16;FFeac313915a9100b8fa4f40f9e8ff1339e87740f949d10078e9034b", + "a9e88702f9e88f02f9e8eb41f9e99702f9e93340f91f0500b1f97b02f9f7e31339f98302f9BBBBL8;FB732068617320612076616c69642062617365206b65790000bb124000000000003800000000000000ab0100001e0000006c69627369676e616c5f70726f746f63L8;FF1c0940f93f0118eb809349fa", + "82feff54f552199b687a77781b05c05a9c0200b4a80640f909091c8b2ac15f781f030a6bea979f1a4a219f5a4a1d0072c0fcff54BL8;FF29011591a10302d1a82739a9e8feff9008810c91c9048052e8c302f9e3031691e8cb02f9e8feff9008a1159142008052e9c702f9e9cf02f9e8d302f997dcff97L8", + ";FFe082c83ce182c73ce8c301f9e89f40f92083883ce20245ad2183873ce182cd3cead701f9eab340f9e2831dade082cc3c21838d3c20838c3c99420091e18247adBBL8;FF00fd07364a000014f9031faaf6031faaf5031faa3400805237008052a8c300d1e00314aac1440094a9035d38a8935d383f0500", + "71e1000054a9835d383f050071L8;FF0283009158e3fe97e89341b91f050071610600542007c03de9b341b92143c23ce8c741b9f81f40b94003803dfacf40f9e002803de9d302b9214b803dec030b91L16;FFbdc70094e87740f9f48f00f9002100911ecfff97ebfb40f994008052f53300f9f6f300f9ed0", + "3001429a041a9e003099135f040a9f80301aa36dc5ba9022f8052BBBL8;FFbd670194615640f9810000b4605a40f922008052b8670194616e40f93f0400f18b000054607240f922008052b2670194600203912eebff97e80340f9765e09a9L8;FF290500d10a2500a9fd7b43a9ff030191c0035fd63f2900", + "f1880000544b01098b6bf1df388b0cf8374b05c0396c1d00128c6119538c01210b810102516b00f837BL8;FFf40301aaa5f4ff9720020037750240f9a80640f9160101eba2020054e80f41b207000014890080d248008052e02300390900f0f2e827003928017fb2e0030091L8;ZDBBL8;FF1a0040f901a0", + "0191e00a803d0080c33ce00e803d0080c43ce012803d0080c53ce016803d0080c03ce002803d0080c13ce006803d5c280194810700d15f0700b1L8;FFbdffff9774d645a9350200b49682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef822008052b1270094c1825ff8e1feffb", + "4c00240f9L16;FF4afd44d308fd44d3a96ddbf2fa030baac9b6edf2417d099b147d099b56b3ff9713020036284340b928060036a9237fa9ea1340f91f5301a9155b02a9092300a9BBBBBBBL8;FB72676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353", + "537662f62797465732d312e31322e312f7372632f62L8;FFf65747a9f85f46a9fa6745a9fc6f44a9fd7b43a9ff430291c0035fd648008052e0230091ff0f00f9ffa300a912f8ff97e88340a9290080521f0500f109000079BL8;FF536928380cfc71d308050091290040f9280800f94c0200b5e0030daa47", + "000014e10300a9e00301aae10309aa22008052f4030daabd050094e10340a9ed0314aaL8;FFe81340f9e9a34039ea9342b8eb2f40b9e80b00f9e9630039aa1b00b9abb301b8e80300f9e92300390a000014f7ef43a9e017c03df62740f9e00b803dfafe48d3BBL8;FFe80740f91f0500f1e0000054e80b40", + "f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a94b5d0194ff0301d1fd7b02a9f44f03a9fd830091010840a9L8;FF770a40f9baffff17e00313aa22008052d7000094610a40f9c3ffff17e00313aae10316aae20315aad1000094760a40f9680240f9080116cbbf0208ebe9f8ff54BL8;FFe00", + "700f90800f0f2080900d163ffff17e90b41b2e92300a968ffff17c80080d20800f0f2080500d15cffff17c80080d2e10700f90800f0f2080900d107000014L8;ZDBBBL8;FBfa0840000000000029000000000000004e0100002d0000007369676e65642d7072652d6b65796b796265722d7072652d6b6579", + "62756e646c6566696c6520636fL8;FFe11740f9e80f40f91f0101eb60440054e81340f9090180522a040091ea1700f909692138e16300912d8fff97e00314aa088c4bf81f0500b160000054e1630091BL8;FFc2feff9042803591e3030091e92301a956fd0094fd7b42a9ffc30091c0035fd608a440a9e20", + "301aae00308aae10309aa79fd0014ff8300d1fd7b01a9fd430091L8;ZFBBL8;FFe82702a9e3430091583d0194fd7b43a9ff030191c0035fd6080040f949ffffd029813d91e00301aa0801403908711d5308410051081d7d92226968f849ffffd0L8;FFa8a40135680640a96082c23c69aa43a96082893c60", + "82c43c680607a9680241a960828b3c6082c53c69aa0aa9693640f9680208a9681240f960828c3c684a00f9L16;FFe8a303f940feffb000c42291e8ab03f968feff9008412191e1032b91e3031d9162008052f86305f9f40310aae9a703f9e9af03f9e8b303f92cc8ff9788018052BBBBL8;FBe5e90000918", + "64aa1c58c1c90802c01aa08e64ef1ef85cbd2f19584a62bd9d2aa0000315ed27995339d879781d3361233702688af989c4cb8a28c8c21d2aa0000L8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9050054280108ab8300005426000014e80308ab820400", + "54090840f9BL8;FFf54f42b9e85b42b9e8270529179a00b4f31f41f9bb110194e00317aa21008052b4110194c00301b4e10313aae20317aae01300f9b7110194f32b41f9e83341f9L8;FF2000805281008052530d009420008052c1018052500d009420008052e1031aaa4d0d0094e17342f9e09340f94a0", + "d009420008052c1028052470d0094e17342f9BBL8;FFfd030091c10500b40a0040395f2100f1a10500543f8418f1c1050054f70300aaf40303aaf60302aaf50308aab551019400c4805221008052ae510194400800b4L8;FFe10316aa544d009420008052e10315aa514d009400018052e10313aa4e4d009", + "4fd7bbfa9fd030091083c40f9080100b4080140b20811c0da081540d2080d088bL16;FF0d3058a9e0b3823d1e5051a9ea2f1fa90f4052a9e89300f90a2044a9ed6f00f91b3459a9ec5f00f9e8cf00f90b2045a9e8c300f9122046a9ebb300f9e89700f9BBBL8;FFf80300aae00313aa22008052230080522", + "400805228fdff97610a40f9e00318aa1bfeff17ffc303d1fd7b0aa9f95b00f9f85f0ca9f6570da9f44f0ea9fd830291L8;FFc9000054e0431691e1031aaae20318aad7100094fad342f9fc0740919c8301913ffeff17e043169122008052d0100094e1d342f948feff17e0431691e1031aaaBL8;FF9b1500", + "94e10340a9ec0314aa2aa040a9536928380bfc71d308050091290040f9280800f94bf2ffb4ddffff17e10300a9e00301aae10308aa2200805223008052L8;FF00008012610600f964000014734e00a900008012d30a00f9f35341a9fb7345a9b2feff17e04040795ae30b91002c46d3407b6078063c7cd3e", + "40840f9207c4093BBL8;FFc0000054e8074091e143169108810991008102919b120094f87f49f9780300b4e1d342f9e8cb42f9f97b49f91f0101eb208d0054e8cf42f9490380522a040091L8;FF810000b4e20a40f9e00314aaba31009476000036f7030291fc030014e8631d91f6030291e95b47b908314", + "0b8ca220a91eb030291e29340f9f7030291483100b8L16;FF600640ad682e40f9e90a40f9e502c03d620ac03d6382c43ce82b00f9641ac03de93700f9683a40f9611a40f9e583853ce08700ade28f01ada00600ada20e01adBBBBBL8;FB6e696e6700000000560b40000000000075000000000000007a000", + "000260000000700000000000000060000000000000000000000000000000000000000000000L8;FF120f0094e81340f91f0900f1e0040054e1830091e00313aa02328052bd990094e10740f9410300b4e00315aa22008052ffc30691f44f44a9fc0b40f9f65743a9BL8;FF29050091280108ab2203005409", + "1440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054092040f9090100b4L8;FFe86b02f94083803ce01bc13d26fdffd0c6c035914183813ce11fc13d4083833ce023c13de8830c914183843ce127c13de0431391e1830891e283099163c20391BBL8;", + "FF985e0ba99f220da999220ea99cf200b90addff97f50314aa6002c03d680a40f9a18e47f88082843c882e00f9810000b4804240f922008052af590194602ec03dL8;FFe86b06f968fdffd008a52891e96706f9290080d2ea6f06f9c93bc0f2e87b06f9c8048052ea5706f96afdfff04aed0a91e0df813df", + "f5306f9e85b06f9ff5f06f9L16;FFa01900b5a0c303d1a4e6ff97e80301aac000003688f9ffb4cd000014e1031faae88701b9c9ffff17e1031faae88b01b9c6ffff17a083db3ca183dc3ca283de3cBBBL8;FF08050091290040f9280800f90cfeffb40a7c15533f0108eb53611932200100542a0440f90bf", + "c63d35369283808050091280800f98b0200b5e0030caa1b000014L8;FF481b488b0805009114000014280080525f0700b1ffcb02f9e8cf02f9ffd302f980100054e0431691e1031faa22008052cf180094e8d342f9e0cf42f949018052BL8;FF680200f9f44f41a9fd7bc2a8c0035fd6ff0301d1fd7b02a9", + "f44f03a9fd830091080840a92b04009189008052f30300aae02300910af97fd37f010aeb4a95819aL8;FFe20313aaf50300aac2f9ff97e8031faae9031f2a4a008052eb0315aa050000148d0200b46b0d0c8bf7020ccb370200b46d0140f9ff0a00f1ec328a9abf4100f1BBL8;FFff430291c0035fd6fd7b", + "baa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9ff833cd1e8074091f30300aafa07409108810991L8;FFc90600918003c03d0001803d8007c03d0005803d800bc03d0009803de9bf04f9a88357f8080540f9c82500b4a02302d128f5ff97f60301aa004d0037c8fe60d", + "3L16;FFaa0100b4f50300aae0031caaf40301aae1030aaa22008052f6030daaf7030eaab5b90094ee0317aaed0316aae00315aae10314aaf44f40f9e10000b422008052BBBBL8;FB200100002e000000ef104000000000004e00000000000000f904000019000000ef104000000000004e00000000000000", + "01050000140000004d6573736167654cL8;FFe80303a9ff2300f9e90f00f96953199b7f0317ebe8031baadc26969a290940f93f011ceba20200540961199b1f3d00f1e0030054080500912a8541f81f0117ebBL8;FF5b050194e8ff42f9e90343f9e0feffb000600b91e3feffb063001f91e4feffb084200", + "c91e2032d91c1058052e8a305f9e9a705f950050194e85746f9e95b46f9L8;FFfa6702a9f85f03a9f65704a9f44f05a9fd030091ff0312d1167c4093e8ef7db2ff0300f9df0200f1e9079f1ad80209cb09ff7cd314ef7cd33f0100f1820248faBBL8;FF60828d3c61828e3ce08744ad682603a9e95740b96", + "86a04a9694e01b9e92740f96082893c694a00f9e8a741a961828a3c7c8600f9688e00f9e82f40b97ca60fa9L8;FFe0031faa090540f90a0140f9290100cb4a01008be0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9L16;FFe8af01a9e87b42", + "f9eb9742f9e83b00f9e87f42f9e84300f9e89342f9e87b00f9e89b42f9e8d300f9e89f42f9eb230ca9e8b342f9ebab42f9e8e300f9e8b742f9BBBL8;FF696a0194010700d15f0700b1612200f9c01e0054c002c03daa0302d1e02b803d950a00b4e8434179e98b4239f3334af8f6bf4239f7b34ab8a80318", + "78a9231838L8;FFfd7bc2a87ffeff17610640f9810000b4600a40f922008052b7690094611240f9810000b4601640f922008052b269009460020191f30b40f9fd7bc2a871feff17BL8;FF750240f9a80640f9160100eb62020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e82", + "70039e90300f9e003009115f0ff97f44f47a9L8;ZFBBL8;FFe8bf40f97a0200f98002803df45744a9e8ab00f9610a803d6082803c680e00f9f50000b4f30314aae00313aa52050094b50600f173a2019181ffff54e81f40f9L8;FFc0035fd6200080520108805251250094fd7bbaa9fb0b00f9fa6702a9f8", + "5f03a9f65704a9f44f05a9fd03009119e040a9f60300aa344c40a9f50302aa370840f9L16;FFc0035fd6e00741a953a50094ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091040180520503805229f87fd33f1100f13481889aBBBBBBL8;FB5f636f756e7465726f6e652d7", + "4696d652d7072652d6b657970715f726174636865745f73746174654e6f48656164657252656365697665646b796265725f6369L8;FFe87f0da9ff230ea9e87f10a9ff2311a9e87f13a9ff2314a9e87f16a9ff2317a9e87f19a9f45701a909000014a003de3c39070091a8035ff8f50f40f93f4300f1BL8;", + "FF680240f9b70640f91f0101eb80080054680640f9490280522a040091e00316aa6a0a00f909692138e10313aa6afbff97780a40f9680240f9080118cbdf0208ebL8;FFc419ff97f70300aaf50301aaa81300d189008052e00705a9a08300d1e103019142008052e82704a9be100094b50000b4e00317aae", + "10315aa22008052ae1d0094BBL8;FFbf0208eb49faff54e0c30591e10314aae20315aa230080522400805226e9ff97f4c340f9caffff17e05fc03de8c340f929008092ff0600b1690200f96082803cL8;FF9c6300917b0700919f0314eb0071005400e4006f0823059189ab40a9ffa305f9f6a705f9f6b30", + "5f90001803d08018052e8cb05f9e8672a9100f18f3ce8c32c91L16;FFe00313aa22008052230080522400805297010094610a40f9b5ffff17e00313aae10316aae20314aa23008052240080528f010094760a40f9680240f9080116cbBBBL8;ZBL8;FF11020014f6eb44f953000014e8074091f69b45f900", + "230091088109912acbff97e1074091e0431691026e805221800991b87d0094e077c53de17bc53d58008052BL8;FF5f0014eb570909aaa0000054c9fe7bd3a90000b5f716168b10000014f30315aa11000014f80308aab6fd00940005805201018052affd0094400200b4e81242d3L8;ZFBBL8;FFc0035fd6", + "fbebff17fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9fd030091ff4307d100e4006ff30300aa5f0401f156ffffb0d6820e91e08303ade08304adL8;FFf84b40f9680902f9e85b40f960621e91493100b8a90358f8613e42f9680d02f9a8835838633a42f97a1102f9754642f97b1502f96b3e1f91400", + "540ad685e1f39L16;FFf8831d91e173813d6183c23c681340f9e07b813d6083c33ce277813de06b813d6013c13ce167813de9e31539a091883ce8c702f91f0c0094eab343f9fcb743f9BBBBL8;FBec12f9642770675a24c6a2247dcaca6ebfd56e4223cee145a6ccb69d1352b36191204c693dd712bd0e6b", + "fa26afed655bdac64fb23c9eed85a28c0000a7d4f136L8;FFe0430a9102e4ff97e00313aaf34f41f9e2ffff1718018052ff0f00f9a9000014f90314aab78d0094e00318aa41008052b08d0094a05d00b4ea3340f9f40300aaBL8;FF639c1191240280522b000014e05306f9e0833291e1feffd021401191a", + "2018052e3feff9063c039910401805222000014c80080d2e0a33239e08332910800f0f2L8;FFe06300912a69283808050091e80b00f994000094f60b40f9e80340f9f45742a9080116cbbf0208eb88030054d50000b4e80740f9e10314aae20315aa0001168bBBL8;FF086115912900009029910391400f0", + "054ea1340f9eb23009140fffff0005c2c91eba305a9e1630191aa831df8aa6301d1eaa706a9a9a300d1e9a307a9e8a30091L8;FF694240b93f0500716102005469aa4829c9030034290140b22911c0da291540d2290d098b2925019129fd46d3290d00910a0300344a0140b24a11c0da4a1540d2L16;FFfe", + "0315aaee2b44a9e54340f9f21354a9f03b40f9f46340f9e61340f9e0bf40f9f78740f9e9cf40f9ecd745a9e3b75ca9fa3f51a9fc4752a9e84740f9e9c703f9BBBL8;FF9fa207a909050054a8ffffb00881109109fd78d3684200390afd68d308fd48d3695e0039681201b848038052680e00f9080080926a", + "520178d1000014a8ffffb0L8;FFea0740f9e81740f92015c03df87f00f9eaa30ea9e89341f98082823ce8bf00f972ffff17c8fdffd00821189189028052e86301f9e96701f9f2feff172143c23cBL8;FFe20313aa75060094f50300aa0d0200143f0900b1a0200054880080d20800f0f2080500913f0108e", + "b0120005481220091e20313aad3090094f50300aa01020014L8;FFfd7bbfa9040000f0e30300aafd03009184bc43f9481c80d2427c4093800400d1e40304cb0100018b6000048a6300018b6100048a210000cb010000d411f7ff97BBL8;FFe1031caae2031aaac8110094fcd342f94cf9ff17e0431691220", + "08052c3110094e1d342f956f9ff17e043169122008052be110094e1d342f95ff9ff17e0431691L8;FF22008052bc2d0094e8a340f91f0500b160000054e0020391cce7ff97f45b53a9960100b49722009104000014d60600f1f7620091e0000054e1825ff881ffffb4L16;FF8082c33cf40340f9e88302f9", + "e12b813de22f813de033813dbead009460220091e1230b9102398052740200f9b9ad0094e0864aad60860eade08a4bad608a0fadBBBBBL8;FB64a642000000000063616c6c65642060526573756c743a3a756e77726170282960206f6e20616e2060457272602076616c75650000000000ef104000000000", + "00L8;FFaa531738aa8357382901084aab631738ab935738a9731738a9a357384a01084a6b01084aaa831738aab357382901084aab931738abc35738a9a31738a9d35738BL8;FF0811c0da081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aa080c48f81f0500b1800", + "2005428fdff97080040b20811c0daL8;FFe05b01b9a04700d121c3ff97e05301b9a04700d11ec3ff97e04b01b9a04700d11bc3ff97e04301b9a04700d118c3ff97e03b01b9a04700d115c3ff97e03301b9BBL8;FF292000543c230091546b39f83f001cebe9000054e0031aaa22008052e3031caab655019", + "4fa0300aa402300b4b30800b4b4550194e00313aa21008052ad550194L8;FF414fc03de8bf01f90800f0d2220101ada90359f841f18f3ce9d701f9fbc301f9f5c701f9f7cb01f9e8bb01f996010014e8031691e00316aa96500094c8624039L16;FFe88f01f9e883059108c100914181883c4281893c4001", + "863ce99b01f9572e0094e00fc23de113c23d08008092e21bc23d3a008052e8b300f9e00714ade017c23dBBBL8;FF080117cbbf0208eb480f0054680640f9e10316aae20315aa0001178bbd750194e802158b680a00f9951640f9350300b4610a40f9680240f9961240f91f0101ebL8;FFe8cb42f91f0101e", + "bc06d0054e8cf42f92a040091c02202914901805209692138ead302f932250094e14316917b0e0094e08f49f9800100b4e1d342f9e8cb42f9BL8;FFf30300aa810000b4600640f922008052b9f50094610e40f9810000b4601240f922008052b4f50094611a40f9c10000b4601e40f922008052f30b40f9f", + "d7bc2a8L8;FF227823f8d6ffff170229009180020e91047862f8a4faffb4801840b920efff35800840f9450080528270009100204039001040d3a520c01aa6040051e503054bBBL8;FF00800991a0800094e08741ade217c03de8eb46f9f94b09f9e2a3843de267c33de09b843de06bc33de19f843de16fc", + "33d4083843ce073c33d4183853ce197c13dL8;FF08c52991e95305f9290080d2e86b05f9c8048052293fc0f2ea6f05f90a078052ff4305f9e84b05f9ff4f05f9ea5705f9e86305f9e96705f968310094e1eb43f9L16;FFe10600b5f4031faa64f9ff17e96740f928dd789267f7ff17e02200911bbdff97e1", + "6740f9810000b4e07f42f922008052b1b50094e17740f9810000b4e05f40f9BBBBL8;FB206c4500000000006120446973706c617920696d706c656d656e746174696f6e2072657475726e656420616e206572726f7220756e65787065637465646c7900L8;FFb700f8b6f8031faae00318aae10317aa5181", + "0094170800b4ba850094e00317aa2100805238008052b2850094e0feffb43f0700b1f78301a9ff1700f9e0130054BL8;FF0201805201f17dd3bb050194400745addf0a00b14233c03de85345f9800705ad400743ad8233803de8bb02f9800703ad420344ad820304ad410341ad810301adL8;FFf65703a9f", + "44f04a9fd03009156000090570000b0f30301aac10e40f9e8ee43f9f40300aa1f0113eb1531939ae20315aa3800158b190115cbb6050094620215cbBBL8;FFfbf308a9e84f00f917eaff97e83340f93f0700b1fa0301aaf903999ae01b00f91c159f9ae81740f9fb03889adf0600b1e0070054e82f40f9e0", + "c30291f6230ba9L8;FF619640f93f0400f18b000054609a40f922008052b8450094613240f9810000b4603640f922008052b3450094613e40f9e10000b4604240f922008052f44f42a9L16;FFe9c745f90001c03de8d345f9eb0f46f9eaa702a9eacb45f9e91b46f9e8d300f9e8d745f9ea7b00f9eacf45f", + "9e98300f9e92746f9ea230ca9e8e345f9eadf45f9BBBL8;FFa8835f38e9b300b8a9035ef8e8c30039e89f0039e8230091e9f300f809810091a8a73da988ffffd008613e91a8831ef808008012ea1700f9eb7301f8eaf301f8L8;FF9f2e00f99f6200b91f0900f141180054e00313aaf0fdff97e008003681", + "1400b5e0031faa9effff17680240f9080540f9190101eb031e0054680240f9080540f9BL8;FFe1031faadcffff17e1031faa881a00f9d9ffff17a10a0054e0031faab0ffff1721050054e0031faa9effff17c80080d2e10700f90800f0f2080900d10f000014L8;ZDBBL8;FF684e40f9a80000b4605240f9", + "01f97fd342008052b8250194685a40f9a80000b4605e40f901f97fd342008052b2250194686640f9a80000b4606a40f901f97fd3L8;FF24008052b2010094770a40f9680240f9080117cb9f0208eb29faff54e00313aae10317aae20314aa2300805224008052a7010094770a40f9c9ffff17a8831ff8L16", + ";FF680600f95affff17d82e40f9880ac05a6b0480920a9300d1779100913f0117eb2004005461a100913f0015eb280900544b2540b959910091ea0319aa7f01086b" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines13 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines14.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines14.lean index 1026993de..0dd5d9806 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines14.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines14.lean @@ -27,358 +27,250 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub14 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF1100669ef10000b5ff2100b1c0230054ef21009110020fabe3feff541d0100142f02c0daef11c0da0f0e4fab621e0054ef01168a706aef38d003f8361001168aL4;FF290040f900fc78d37369283808050091280800f980fbffb43f0108eb4a611932a00000546a692838080500912808", - "00f99cffff17e00700f9e00301aaf30301aaL8;FFc0035fd6f5031faae00315aae10313aa401f0194ffc301d1fd7b03a9f72300f9f65705a9f44f06a9fdc30091160440f9f30300aaf50301aab60300b4a80a40f9BBL4;FFd4f0ffb58affff1734008052fb0a40f9e80240f9fc0700f97f0308eb61f6ff54", - "e00317aa5cd6ff97b0ffff17e0c30191439cff97e96f47a9f59340b9fa6748a9L4;FF1fc123eb23fbff54834200d1bf1040f2a0000054030000d063c0029174d86678833e7cd305400091941c4092681000d15f7c0271497c0553421c45d39416039bL8;FFfd430091130040f9e00301aa810100d021041d", - "91e8030091620180527c9f0094810100d021d01391a40100b084401a91e0030091a363009142008052b30f00f9BBBL4;FF5cdf019440720035e85341b9e85f00b957ffdfc8770000b555df0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd6L4;FB480000000", - "0000000d70000000500000061626f7274000000b10049000000000048000000000000006e000000090000002d004900000000004a00000000000000L8;FFfd7bc6a8d5dbff17e00301aa190340f909a0c0a90a0c41a90078c03d043c4da9e94700f912184ea9e86b00f9092042a9e0b3823d101452a9e8bb", - "00f9087043a9BL8;FFa80f00f9835f019468620091c10200d021242291e40200d084800c91a363009122018052a80f00f97a5f019468c20091c10200d021b83191e40200d084000d91L8;FF800b0054680640f9b60a40f92a040091b41640f9490280526a0a00f909692138b60900b4c80240b20811c0da0", - "81540d2080d088b08250191c81a488b08050091BBBBL4;FFf30300aa161040b9e0230091f40308aaa69b0094a00642a9e2830191f66300b9e1faff97a80a40f9a81000b409fc79d3e1e7076fef031faaaa2e40a9ed031faaL4;ZFL8;FF08050091280800f92c0500b5e0030baa3f0108eb20010054290440", - "f90a050091206928382a0800f9f44f42a9fd7b41a9ffc30091c0035fd6f30300aae00301aaBL8;FF000040f902060014000040f9e4140014000040f912180014ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa010300d021001891e803009102018052L8;FF847fff97806a40f9800100b4e11", - "740f9e80f40f91f0101eb40880054e81340f9090180522a040091ea1700f909692138e1630091777fff97e00314aa080c4af8BBBL4;FF685e0039f44f5ba9f6575aa9f85f59a9fa6758a9fc6f57a9fd7b56a9ff030791c0035fd6e083c63ce183c73cbf0600b1c282c53ce84f40f9e00706ade083c43cL4;", - "FB117d49000000000029000000000000004e0100002d0000008a7a490000000000540000000000000059000000050000008a7a4900000000005400000000000000L8;FFfc5f01a9f65702a9f44f03a9fd030091ff8317d1ff0300f9f40301aa28ec40f9e20700f95f0008ebe10a005480064dadf50302aa8", - "366c03df30300aae0a30191BL8;FF0900009029d12d91f42708a9e9030091a18301d1e92f09a9e9c30091e9230aa9a8c301d10900009029f12d91e82b0ba9e8430091e8270ca948008052a90200f0L8;FF0001009000600e913b3f00940001009000c00e91383f00940001009000200f91353f0094000100", - "9000800f91323f00940001009000e00f912f3f009400010090BBBBBL4;FF48fbff97a80240f91f0500b120050054b40a40f9e10313aa880240b20811c0da081540d2080d088b08250191881a488b000500913bfbff97610a40f9680240f9L4;FFe10317aa22008052350f0094e0431391e10313aa0228805", - "2390f0094e8270491e01740f9e143139100f1cf3ce80f41f9022b8052e087813de81303f9300f0094L8;FFff0301d1fd7b02a9f31b00f9fd830091f30301aae10300aae00300912200805219fdff97e1030091e00313aa02048052690f0194fd7b42a9f31b40f9ff030191BL8;FF60feff54359f40f92843", - "41b9e82b00b9550600b4349b40f92d8f0194e00315aa210080522b8f0194e00d00b4e10314aae20315aae00b00f9f52300f9308f0194L8;FF68a20191610100d0219c1b91840100b084e00891a363009162018052a80f00f97c8f00947c8f0094fd7b41a9f31340f9ffc30091c0035fd6ff0301d1fd7b02a", - "9BBBL4;FF53feffb5e8031faae9031faaea031faa0b0e8052140440f9f3031faa08510b9bfa031faa37510b9b56510b9b18000014fb1340f9f50308aae0e30091e10315aaL4;FB5a38f3f75bff44b2dc763c0f4580f2af1be7031fe25776b0a750139071529f46342f216e259727c600a60016264f49b59e", - "a9a28c9c835fa4aad583e90000baf5L8;FF87c8ff970900809288018052f0031caae8270ea9fadb4aa9ef3b47a9e03740f9f88f41a9f57b40f9fc0748a9e45f40f9f7ef49a9e8174da9f9fb42a9ebb344a9BL8;FFf60300aa3e4f0194080000147f0200f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd", - "636008052765200a9771200b9f44f43a9f70b40f9f65742a9fd7bc4a8L8;FF810000b4820a40f9e00315aa344f0094e863019100610c9127e8ff97e8a75139c8000036e14741f9810000b4e04b41f9220080522a4f0094e89740f9ffa71139BBBBL4;FFe00314aae11f805233ef0194a8060091bf2200f10", - "8fd43d309f17dd3280108cba832889a02000014e8031faa687e01a9f44f43a9f65742a9f85f41a9fd7bc4a8L4;FB4e00000000000000b9040000170000007a944800000000004e0000000000000057070000050000007a944800000000004e000000000000005807000005000000L8;FF1a0101eba310005", - "4a80640f91f011aeb49080054e00313aaedeeff97000c003728fc60d3e80900b5200840921f1800f1220a0054217c0353410a00343f080071BL8;FF21242c91040300b084a01f91e0030091a363009122028052b30f00f97d6f01947d6f0194fd7b41a9f31340f9ffc30091c0035fd6e00301aa010300b02", - "1202091L8;FFd1000014e8031faa00011aab62570054e1431691c60c00943f0700b1f90b40f9e0070054e1d342f9e8cb42f91f0101eb40330054e8cf42f92a04009100230291BBBL4;FFe8c30091f40302aaf70301aaf50300aa93ffff97e86343a91f0900b1610a0054f96a9852e0031f2ab9d5bb7246af", - "0194086b40b9f603002a1f01196be1090054L4;FF68031ccbf50316aaf9031caa1f0540f11731989a9f0344f1a9faff541c000014df0219eb23050054f70300aaa08300d1e10315aae20314aae30316aa30010094L8;FF84e00091a21300d121038052a8c31f3843af0094ff4302d1fd7b03a9fc6f04a9fa", - "6705a9f85f06a9f65707a9f44f08a9fdc30091f503022af40301aaf30300aaBL8;FFf5bb44b920c1c03c9f0b00b1e8a304b9e027813d410a0054e8830291e99f40f9e027c13d16d10791e8a344b9f59302b93f0500b1c002803de8a702b9002c0054L8;FF43f8ff54daffff17a80358f82003c03de00313a", - "a096b40b9940a40f9e81b00f9e8030191e00b803de93f00b98257fe97e82340f91f0500b1c0000054e013c03dBBBBBBL4;FF611a40f9c1fdffb40804805205000014611240f93f0400f12bfdff5408028052806a68f8220080522d170294e4ffff17fd7bbea9f30b00f9fd030091010040f9L4;FF8800805", - "2e06f02f9a10000d021a023911a0000b960620491e3431391e2018052e86b02f9e87302f9acf2ff9700e4006fa04700d1e143139102048052e03b813dL8;FFc0035fd632170194000380520101805230170194200400b4880640f929008052600e00f916a400a9080000f968d600a9680200d008c11a9168", - "0200f9f44f42a9BBL4;FFe85300a9e00706ade2034aade383833cea5f00f92281883ce25bc03d2081893c22818a3ce00b48ade9d340f9e083843ce00749ade97300f9e95740f9e87340f9L4;ZBL8;FF22028052829700948101009021d01391840100f084401a91e0030091a363009142008052b30f00f97", - "a97009468a201918101009021741d91840100f084e00d91BBBL4;FF932201b9f44f48a9fb2340f9f65747a9f85f46a9fa6745a9fd7b43a9ff430291c0035fd6e8630091e0230091e1031faae2031f2a58d70194faef41a938008052L4;FB7420c0001a65706f6368206e6f7420696e2076616c6964207261", - "6e67653a20c00010456e636f64696e67206572726f723a20c0000f53657269616c697a617469L8;FFe8fb40f9f6b303f9e8ab03f9e8bb40f9f5bf03f9e8b703f9e8ff40f9facb03f9e8bb03f9e8db40f9fbd303f9e8c303f9e8cf40f9f1d703f9e8c703f9e8c340f9BL8;FFe0020054e18f49f93f0400b14", - "0010054810000b4e09349f92200805230570194e19b49f9810000b4e09f49f9220080522b570194b30000b4e07b49f9e10313aaL8;FFc2f5ff9760dcffb46700001420dcff54c8010014e0dbff54c80080d20800f0f20809009101010014c80080d2f55706f90800f0f2080900d107000014e05706f9BBBB", - "L4;FFc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aa2cf70194e08741ad28008052e217c03d800600adL4;FB6e6b6e6f776e2d6c696e75782d676e752f72656c656173652f6275696c642f6c69627369676e616c2d70726f746f636f6c2d61", - "34346366356131646330623666L8;FFe10000549f5e00a99f7e01a9977e02a99f5e03a99f6204a99f3e00f9e10314aae20313aa5e090094c00300b5e1031faac6ffff17c1010054e1031faab2ffff17BL8;FF68a20039880700d11f0900b1020001ad6a2600a922150054e00319aae1031caaa4000014aa1", - "35438e8031faa691b009103000014e8031faa692300914a1d4092L8;FFe08f843de0ffc33d00800991e193843de103c43d21800191e07f843de007c43d023f8052e82b09f9e183843de28b843de087843d32770094f9431591b40000b4BBBL4;FFf51740f97f0600b100030054bf0214eb80150054e81b40", - "f98a060091e1a30091e00313aa49048052ea1f00f9096934383ca3ff97f41f40f9f51740f9a80214cbL4;ZDL8;FFfd7b42a9ff430191c0035fd6d6008052e0ffff17e0230091020480522300805224008052dfcdff97e10f40f9e5ffff17200080520105805236b70094fd7bbea9BL8;FF6b0d0b8b6b2501", - "914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500542a0140b24a11c0daL8;FFe8ef43b9f6db43b99f0b00b1a01e813de8e307b941050054e8e347b9a01ec13de9832491e00000b000602991e1431a91e83709b9e8832491e3430f912", - "041803cBBBBBL4;FF70ecff97e8030491fa031faabcc302d11b0140b2f8330191330400b073820591191380524a0000140e000a8a01696efc228c202e4f00669ef0c101f2a0010054L4;FF000100b4810000d021403a91130000f91f200039f30b40f9fd7bc2a8c0035fd6000180520102805245070094fd", - "7bbea9f30b00f9fd030091f30300aa24070094L8;FFe00308aae2018052fd7b42a9ffc3009171070114410200f0211c1591e00308aaa2018052fd7b42a9ffc300916a070114410200f021c41691e00308aa42018052BL8;FF290140b22911c0da291540d2290d098b2925019129fd46d329050091280108a", - "b830000544d000014e80308ab62090054693a40f9090100b42a0140b24a11c0daL8;FFffa308a9e8b70aa9ffa30ba9e8bf0da9ffa30ea9e8df10a9ffa311a9e8e713a9ffa314a9e8ef16a9ffa317a9e8db19a9ffa31aa9a80a00f1eeff0ca9f0ff0fa9BBBL4;FFe1010054ee4f00b9ed2b00f9ec2703a949", - "0080522c0000141f1d0071c00400541f210071c1000054ec2703a909018052ee4f00b9ed2b00f923000014280400d1L4;FB0e206d6573736167652066726f6d20c02620776974682063757272656e742073657373696f6e207374617465202862617365206b657920c00129000a64656372L8;FFe20317ad", - "6281c93cf1bb43f9ed7344f9e0bf43f9e3035e39e4c743f9e5cb43f9e7d743f9ed5300f9ed6f40f9e25b44f9f66344f9f86744f9fa7744f9fe030daaBL8;FF340100b4680640f9e10315aae20314aa0001178b3a470194e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00013fd6e0", - "031faaf44f4da9L8;FF000100b00020179138470094000100b000801291354700940001009000e0329132470094fd7bbfa9fd030091081840b9c8050034080140b20811c0da081540d2BBBBL4;FFe97f40b9fa0316aabc2200b99f03096be00705ada00600ada3f3ff540600001420c30091421e0094381f", - "40f93af7ffb5bdffff1748008052a00302d1e3830291L4;FB53797374656d54696d654572726f720005000000000000000c000000000000000b000000000000000b0000000000000004000000000000000e00000000000000L8;FFfc6701f93f7f01a9fc7301f9ff7701f9fff302b9e1030b91a2c303d10a", - "efff97a03500b5e1031faad3ffff17e1031faae8e300f959ffff17e1031faae8e700f9BL8;FF68620091e102009021082991e402009084e01291e0030091a363009122018052a80f00f97b670194e102009021302991e40200d084a02391a363009182008052L8;FFfd7bbea9f44f01a9fd030091140040f", - "99f0600b1e0030054012440f9f30300aa3f0400b140010054810000b4602a40f9220080522a670094613240f9810000b4BBBL4;FFe8031faa0900f0f229017fb28a1e4092e10740f908010aaa69a200a92900805269020039810000b4e00b40f9220080522ba70194ff030991f44f44a9f65743a9L4;FFe3", - "0f02a9e11b00f9e07f072963020f32060080d2050080d2610c8092637c4093000780d23e0a0094037c4093e000f837d3009836280380d2e00303aa410080d2L8;FFa1c303d122008052b7c303d108050091a80317f865a7009428e37a92b9f31438a0c303d18102088be20319aaf90b40f933a70094a8f35", - "4380c088052fc03082aBL8;FFa0039e3c652701941300001428008052890200b029013e91bf233ea908048052000400910800ac72e1830091bf031ff8e81b00f9a88300d1e82702a9251a0094L8;FFa8031ef81100001436008052a9835ef8aa835ff868021c8b7b0700d15aa301919ca30191092900a909", - "6501a9a9435fb8156502a9175103a9176104a9166105a9BBBBBBBL4;FFe0830091010480525f0108eb0295899a02010094f95342a9e11b40f9b90900b4780240f9e15700a9750a00b4000340fdfb0740f9fa031faafc0318aa0088202eL4;FFb7fbffb5e0ffff17d90180d21900f0f2f7031caae00b41ad2", - "8008052e107c03d9a6600a9976201a9951200f98282823c8182833c8082843c68320039f44f57a9L8;FF600200f000801c91381b0194fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30302aae20301aae10300aa01010037e00308aae30313aaf44f43a9f65742a9BBL4;FF08011e4afecf40b9e8a21", - "f38e8d25f389c031e4afe6b40b9fcb21f38fce25f387b031e4afe7740b9fbc21f38fbf25f3808011e4afe8340b9e8d21f38e8024039L4;ZFL8;FF09004039e80300aae00301aa3f0900716c01005408210091490200343f050071c1030054e80300f9a101009021601491e823009142008052230000143f0", - "d0071BBBL4;FFe017883d80f3c23ce8820139280500b149358a9ae11b883de212863ce02b883de87b10f9e97f10f937db019428048052897f413980f3c43ce8fe013981f3c33cL4;FB20656e636f646564566172696e745369787479466f75724269744c656e67746844656c696d69746564537461727447", - "726f7570456e6447726f75706578706563L8;FFe83b42f9eb2315a9e83f42f9eb5742f9ea2318a9e84742f9ea4342f9e8b700f9e84b42f9ea2711a9e99b42f9eabb42f9e8cb00f9e84f42f9e8eb00f9a8a20791BL8;FFe10740910232805200c0359121802f913b5b0194e8074091e00740910881099100c", - "0359118e1079108e1079196ce0094e0074091e10740910232805200800191L8;FFbf273aa9290100b029ed0c91a92b3ca9290080d2e92fc0f2a87f3ba9a8273ea93b5b0094e11b40f9810000b4e01f40f9220080522a5b0094e10f40f9810000b4BBBBL4;FFe1e7076fea0740f91b0080920d0a8052c8050", - "0d10e010eeaa1fbff54208d212e00a8302e0800261e48010037292100910003098b18000a8a496b78fc208d282eL4;FB676e6572207461673a20c0002f72757374632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c696272L8;FF890240f98a0", - "000100b6b68384a090b8b40011fd63f0900b1802400543f0116eb4124005481220091e20313aaca070094f50300aa500200143f0900b1400e0054BL8;FFe8030091e00309aa02028052807b0194150300b0b5e2129168220591010300b021c03491e0030091a3630091e2018052e40315aaa80f00f9767b0", - "194140300f0L8;FFe11740f99efcff17e0630091220080522300805224008052e291ff97e11740f9b0fcff17e0630091220080522300805224008052db91ff97e11740f9b8fcff17BBBL4;FF200280522100805232bb0194406300b4280f8052890300b029d53d914a0080d22001c03d0840003928038052", - "0a00f0f229028052480108aa690201a90000803dL4;ZBL8;FF37bb0094612640f9610500b4080a805218000014611a40f9080080921f200039080000f93f0400b140010054810000b4601e40f92200805229bb0094612640f9BL8;FF290d098b2925019129fd46d30801098b130500917f0209eb691e0054", - "080c47f81f0500b160180054b2feff97080040b20811c0da081540d2080d088b08250191L8;FF290c40f9e8430f91e1031baa20013fd6f6434f39df0a007141140054c8008052d90100143c008092ff0a0014759a41f9e8430f91e00315aa043b0094a8624039BBBBBL4;FF954640f9550300b4610a40f96", - "80240f9944240f91f0101eba0160054680640f9490f80522a040091e00315aa6a0a00f909692138e10313aa3af7ff97760a40f9L4;FFe00b40f922008052350b0094f44f49a9f54340f9fd7b47a9ff830291c0035fd6ff8301d1fd7b03a9f52300f9f44f05a9fdc30091f40301aaf50300aae0030091L8;F", - "F330b01940002805201018052310b0194600100b4e10300aa155000a96202009042601391e003132aa20b0194f44f42a9f50b40f9fd7bc3a89f0b011400018052BL8;FF840c80522681ff9760fbffb42a000014a02300d1898c0094e80300aae00301aae8fd07362400001428008092680200f9ffc30a91f", - "44f43a9fc0b40f9f65742a9L8;FF206b00b4f80300aa318b0094c0008052410080522f8b009473008052806900b4a8009152130300a908080079280080528800b172130b00f9080000b9248b0094BBBL4;FFe8f77fb21f0008eba83000549f060071e1010054a8035df81f0500f1402d005428008052a983", - "5df80b050091e003192aa1c300d10a018052ab031ef82a692838L4;FB080000000000000008000000000000007cf4450000000000d5184900000000006a00000000000000200100002e00000000000000000000000800000000000000L8;FF2200805236cb0094ba0000b4e0c741f9e1031aaa2200805231", - "cb0094e1cf41f9810000b4e0d341f9220080522ccb0094e1db41f9810000b4e0df41f922008052BL8;FFd6620091e0000054c1825ff881ffffb4c00240f922008052314b0194f8ffff17680e40f9480100b40805088be00314aa01f17dd302018052f44f43a9f70b40f9L8;FF81feff54a90109abe200005", - "4200108ab62010054fd7bc1a8c0035fd6e90309ab63ffff54000100b0008032912f4b0094000100d000a002912c4b0094000100d0BBBBL4;FFe8031baaf7031aaa15020034e8430291e1031aaa5703028b0001158b38eb0194e82755a960020291e143029122008052080500b12935899ae82715a932eb01", - "94L4;FB804c420000000000000000000000000008000000000000000800000000000000804c420000000000000000000000000008000000000000000800000000000000L8;FF0803168b680a00f9540300b4610a40f9680240f9b51240f91f0101ebc0080054680640f9490380522a040091e00314aa6a0a", - "00f909692138e10313aa75ebff97BL8;FFe8270229e8e30191bb570094e87b40b91f050031c0010054f71740f9fc0700b4e0031aaae1031caa220080522c6b01943a000014fa0300aae0031aaad453ff97L8;FF681040f90b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091e", - "bb302a9ffa700a929008052eaff01a9e9230a29356b0094fd7b47a9BBBL4;FF80020191a18301d122008052080d17aaa0073dad080dc0dae86700f9e28345ada2033ead61ab0194e8275a29ea2f5b29f6c3023980a20191a18301d10809c05aL4;FFec010c0a0f3211aa30017ab20d1c00128c01080a0912", - "899a0e1c045310c471d3ad0501539f010b6a2b017bb26911899a0bfc5bd30ce873d3df010d6aee8510aaL8;FF9c070091ff4200f10001803d090900f9fc1700f9800d0054e85a199b1b0940f975fb7fd39b0400b41c0540f928ab0094e00315aa2100805226ab0094400e00b4BL8;FFc182843c4143cf3c2", - "0f18f3ce963019120cbc03de8b304f928210a91e9e32291c082893c4043ce3ce0234d39c282853ce11740b9e33740b9408708ade42740b9L8;FF8100805200001891ff0316b9e85300b9672a0094e80356b9e00740918100805200001891ff0316b9e84f00b9602a0094e80356b9e0074091810080520000", - "1891BBBBBBL4;FFeaf8ffb43f0108eb73611932600500549369283808050091280800f9e006f8b7e0030aaabfffff17e10300a9e00301aae10309aa220080522300805224008052L4;FF5cfc78d3ab0000b06be92e9157fd60d38d008052fb0309aaf003182aef031a2aee03082af0050014eeef44b978ff", - "78d357fd60d3eb7b42f9ed7f42f94f7c0853L8;FF4a0040b909210039490840796b011c320b1900390c1d0039012500390aa100b8091d0079c0035fd609fc74d30afc6cd30bfc64d30c0c8052001d003909010039BBL4;FFe083c23c8826089be91f40f998000014490440f90a018052e30300f9282545a9", - "ffab05a9ff3700f9c90600b40a0d8052192101911c018052387d0a9b3a008052L4;ZDL8;FFe9031faa10000014f5031faa681a40f948f6ffb5f6031faa770a40f917f7ffb5e80317ab23f9ff54600100f0002013912e930094490080524afdff35ea031faaBBBL4;FF4183c33c4283c43cea4300f9e20303", - "ade117803dc0ebff54e00743ad3f0117ebea4340f9a0073dade00741adaa031cf8a0073bade00b42ada00b3cad40030054L4;FB0077c1c564f4dabfeb077177da0d1ca8c7d4c1c454fcea8348cc0ebc72b3c1273fa2016896033985ce2332f500004ce53f8dc4ce7f41060177d62f226b023393L8;FFe9e7", - "43f9eaf743f9e9df00f9e9ef43f9e9af00f9e9f343f9e97700f9e9fb43f9eba710a9e9ff43f9e9b700f9e90344f9eaa718a9e90744f9ea0f44f9e9eb00f9BL8;FFe00318aa09692138e1431691ead302f9df0c0094fad342f9e8cb42f908011acb1f0308eb48420054e8cf42f9e10319aae20318aa00011a", - "8b315301944803188bL8;FFf7ef573941c1c13ce91f46b9280340f958914078f46b41f9e03f813de143813de91305b9680000b4e00314aa00013fd6210740f9810000b4220b40f9e00314aaBBBBL4;FF830c8052ecd9ff9780f8ffb417000014a00301d189f40094e80300aae00301aa48fb073611000014", - "a80600d1090080921f0d00b1697200a9e8edff5442000014L4;FB705f636970686572696e76616c6964207369676e6564207072656b6579206964656e74696669657267e6096a85ae67bb72f36e3c3af54fa57f520e518c68059bL8;FFe20313aa430c80529becff9740feffb5a80640f91f0116ebe90900", - "54e00313aaebf2ff97e80300aae00301aa48fd073708fc60d3080a00b5080840921f1900f1BL8;FFe10200f021601f91e30200f063401891a0e300d1020280520401805263680094b6835cf8b1ffff17e043c73cfb1f00b9fc0b00f9fa0f00b9e00f803db80000b4L8;FF9f0600b1a0baff54f5b349f9f3a", - "f49f9551600b47622009104000014b50600f1d6620091a0150054c1825ff881ffffb4c00240f92200805229730094f8ffff17BBBL4;FF490108eb633600548a0340f9b40353f84801088b880300f9290300f988fe60d3280700b5800a40921f1800f122070054817e0353410700343f08007160010054L4;", - "ZBL8;FF7f0600f9687e01a97f0200f92f000014281c40f9080102ebe3040054290c40f91f0109eb82040054e80328aa280108ab831e005429ac40a92a0040f96801088bBL8;FFe1031faae9ffff17002900b5a02302d14eecff97e80301aa80000036682900b5e1031faae1ffff17e1031faae8830cb9def", - "fff17e18b0cb940ffff17a88357f8L8;FFff272a39e84305f92629ff97e10300aae14305f9e0032a91e100009021843d9102028052e30000b063080591c4028052b8000014e04305f9e0032a91e1000090BBBBBL4;FF080040f9130140f91f0100f9f30100b4281040391f050071e0010054690240f9e803", - "009120013fd6e00740ade20bc03d600600ad620a803dfd7b43a9f32340f9L4;FFe02b40f9e10317aa2200805234030094542500b49f0600f1e0230054e10316aa9f0a00f126010014e32345a94a018052eaaf01f9ea028052e0e30691f9a307a9L8;FF220080523603019461ee40f9810000b460f240f922", - "0080523103019460220091f30b40f9fd7bc2a865fdff17fd7bbea9f30b00f9fd030091010040f9f30300aaBL8;FF22038052fd7b43a9ff03019160001fd608200091200440a9e92300910a0000b04a211f91e8a700a9020300d042e03b91ea0f00f9e343009146830194fd7b43a9L8;FF4a0d0a8b4a25019", - "14afd46d329010a8b290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b42a0140b24a11c0daBBBL4;FFc842009109008092692200a9ff431c91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0c342f9b9ffff17e8231091f50742f", - "9f40b42f9L4;FBb602000009000000e4674900000000006a00000000000000550100002a000000e4674900000000006a000000000000005e0100002e000000e467490000000000L8;FF04000014f70600f194620091e000005481825ff881ffffb4800240f9220080522fc30094f8ffff17dc0000b488071", - "c8be00315aa0201805201f17dd328c30094BL8;FFf44f42a9f50b40f9fd7bc3a8c0035fd6e00313aa2200805232030094610a40f9daffff17e00313aa220080522d030094610a40f9eaffff17fd7bbca9f85f01a9L8;FF0502805298430094e8eb41f91f0500b1e01b0054e002c03de8f341f9e9030b91e1", - "7740f92015803de89301f9a10000b4e07b40f92200805229430094e9030b91BBBBL4;FF810080525be3019420f20035e85341b9e8db00b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1L4;FB65206b657973646563727970747365737369", - "6f6e207761732076616c69643b206d75737420686176652072656d6f7465206964656e74697479206b6579000000L8;FF690200f96082803c680e00f9a5deff97c20100143f03086b02010054080180520900809268220039690200f99f0600f12a0500542c000014410300545f0f00b1BL8;FF200100b41", - "40000f9e10200d021603791130800b91f300039f44f41a9fd7bc2a8c0035fd6000180520102805244630194fd7bbda9f50b00f9f44f02a9fd030091L8;FFe0230091f7a700a95f40ff97e00313aae1031faae20314aa1a070094770a40f9680240f9080117cb9f0208eba9fbff54e00313aae10317aae203", - "14aa11070094BBBL4;FF000140b23ea30194a88300d1e0030091e183319168a301942da3019400048052210080522ba30194600400b4a0077fad0804805260a200a928008092680200f9L4;FF1f8d0171e5979f1ae7879f1aa90200342900094b3f2500714c0200541f8d017108050011290d80122821881", - "a68c00d390c000014004300911f0001eb88000054L8;FFa3630091a2008052a80f00f981a30094810100f0215c1491a40100d084e00991a363009182008052b30f00f979a3009479a30094fd7b41a9f31340f9ffc30091BL8;FF0800009008910c918202009042783a91e3030091e92301a94e230194fd7b", - "42a9ffc30091c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091155040a9BL4;FFc0035fd6fd7bbda9f65701a9f44f02a9fd03009113d440a9f40300aa350200b47682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef8L3;ZBBBBBBBBBL4;FF29030a8b08651b9b0232", - "80529701178a9c0700d12b210039e00308aa381d0294bcfaffb520000014090180520801098b292100910801148a206b68fc00a8200eL4;FFb6f8ff97390080929a220129e80b40f9e9634039990200f9881200f9e80b40b989a20039e9b340b8889202b828008052955a01a9892e00b968620039f44f4ca", - "9L8;FF3a1d0194fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd03009128400091f30303aaf70302aa08fddfc8f60301aaf40300aa1f0500f101030054d56240a9BBL4;FF41028052439d0194ff8307d1fd7b18a9fccb00f9fa671aa9f85f1ba9f6571ca9f44f1da9fd030691f30300aae0430291f50", - "304aaf40303aa372a0094e84b40f9L4;FF0100050be203002a80fc5f885f00006b01ffff5481fc008880ffff35c0035fd685fc5f88a504001185fc0088a0ffff350700b0120600b05211000014e00304aaL8;FF42008052b30f00f9829d0094829d0094fd7b41a9f31340f9ffc30091c0035fd6000040f99", - "60b0014ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aaBBBL4;FF1f0000f1ad000054390300eb233200541803008b060000141f0400b1a131005452dd01941f1000312131005439feffb505000014e0430591810080524ddd0194L4;FB4900000000000000a400000016000000000000000000", - "000009000000000000000e00000000000000130000000000000018000000000000003909490000000000L8;FFe8d340f9e85304f9e86740f9e85704f9e85740f9e85f04f9e86f40f9e86304f9e85f40f9e86704f9e8e340f9e86b04f9e85b40f9e86f04f9e80740f9e87304f9BL8;FF21008052335d0194c", - "09601b4e10317aa02908052f50300aa395d01942c5d0194002c8152210080522a5d0194609601b4e1074091022c8152fb07409121800991L8;FF680640f9e10316aae20315aa0001178b3b5d0094e802158b680a00f9951640f9550300b4610a40f9680240f9941240f91f0101eb40070054680640f94904", - "8052BBBBL4;FF17e97bd3368100d1b70200b4d6820091e10315aaf78200d1e00316aaecd7009440ff07362afd0194e00180522100805228fd0194200900b4080400f008e11491L4;ZFL8;FFfd7b43a9ff830191c0035fd6ff8302d1fd7b05a9f93300f9f85f07a9f65708a9f44f09a9fd430191081c00121", - "f090071a1010054e00302aaf30302aaf40301aaBL8;FFffc30091c0035fd62103009021fc3491e00308aa62028052fd7b42a9ffc300916d7d01140920009121030090214032912403009084c0319126030090c6003191L8;FF8022029154010014e8031faa000117ab42680054e16300917e7dff977f0600", - "b18000005480220291e16300915c92ff97df0600b160afff54e263009160008052BBBL4;FFf65711a9f44f12a9fd430391f30308aa610700b4f50300aa090400d0b40301d1a8164038087d0453e853003929b140f93f0d00f109040054e853009189030090L4;FB500000000000000008000000000000006", - "466480000000000b86648000000000018674800000000006b657967656e696e697473656e6472656376726561640000L8;FFfd7b07a9f85f08a9f65709a9f44f0aa9fdc30191280441f9f30301aae20300f95f0008eb81040054f60300aae023009161420691b3000094f58b44a9e00316aaBL8;FFd2b8ff", - "17000040f961abff17082440a9e20301aae00308aae10309aa6a3d0114fd7bbfa9fd030091080040f91f0500b1000b0054083040b9e80b0034080140b2L8;FFf30300aae023009129f87fd31f0109eb0881899a090180521f2100f11481899ae30314aa3c150094e80740f91f0500f120010054e80b40f97", - "42200a9f44f43a9BBBBBL4;FF29ceff54e00313aae10317aae20315aa230080522400805245000094770a40f969feff17e00313aa2200805223008052240080523e000094610a40f970feff17L4;FFf8030daaf5df1aa9f7030eaafa031caafc030faaf5031baafb0310aaeabf00f92f0d0094f0031baafb", - "0315aaee0317aaf5df5aa9ef031caafc031aaaed0318aaL8;FFec0000352a7c0c530b050039090900394a091b320a010039080000142c7c12532a440c330b090039090d00398b6d1c320a0500390b010039a802148be0031f2aBL8;FF20008052e10318aa428d019420008052e10316aa3f8d01942000805", - "2e10315aa3c8d019400018052e10313aa398d0194e00301aa4103009021e02091c2028052L8;FF080c45f8740200f91f0500b140000054fc88ff97754640f9742a00f9bf0600b180020054745a49a9960100b49722009104000014d60600f1f7620091e0000054BBBL4;FF4bc0ff97f92740f9e81f40f908", - "0119cbff0208ebc9e0ff54e0e30091e10319aae20317aa230080522400805240c0ff97f92740f9fefeff17e0e3009122008052L4;FBcb000000130000008e194900000000005700000000000000700200003d0000008e194900000000005700000000000000700200004500000073686f756c642062L8;FF", - "c0035fd6280141d2ea008052f9031c911f2d00f1f5c31591edc3139108318a9aea0100b04ad91f91cb0000104c7968786b090c8bf7430d91fb0300aa60011fd6BL8;FFe8c741b9a6000014c80200f00821149169038052d0feff17eaa759a9e8430f912083c13c2183c23c2283c33c2383c43cfa9741b9e0", - "0600adea1700f9000504adL8;FF3f4d0094572340f9b6831ef8b8431fb8f70200b4561f40f92d4d0094e00317aa210080522b4d0094800700b4e10316aae20317aaf40300aa314d0094582f40f9BBBBL4;FFfd830091f50300aa6dc50094f30301aaa100f8b6f6031faae00316aae10313aa3ced0194f703", - "00aa930200b428ed0194e00313aa210080523600805225ed0194L4;FB2070617374746f6f2066617220696e20746865206675747572650000000000000000000000000000080000000000000008000000000000008084420000000000L8;FF210200d021541b91230200d0635c1491e0030091e200805284", - "00805212000014210200d021541b91230200d063601a91e00300f9e0030091e200805264008052BL8;FFe00700f9010300b021a02691040300b084202691e3230091e00308aae2008052716d0194fd7b41a9ff830091c0035fd6ff4305d1fd7b0fa9fc6f10a9fa6711a9L8;FF20110094e1d342f9e3fdff1", - "7e0431691e1031aaae20318aa1a110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aa11110094BBBL4;FF0849359149038052682601a908008092685e00a9b40000b4e00315aae10314aa220080522ead0194e0a30091b294ff97d1feff17c88240b8c9c240780a6342f", - "8L4;FF200020d455fc41d3bf0214eb68020054f4031faae8031faab50000b40000148be20315aa330f0094e80314aa0801158be80f00f9e083c03ce80f40f96002803dL8;FF0801174aa8020079e1f8ff5412000014e80100d008010191a22300d10021009121008052e3031aaaa40100d084001191e80b0", - "0f9bc831ff85dad009468e34039BL8;FFf43b42f9c80240f9680000b4e00314aa00013fd6c10640f9810000b4c20a40f9e00314aa2e2d01941f0b00b1fa432791c100005420afc03de82344f94003803dL8;FF09214e29e90303b9e80703b9480d40f900013fd6e0e302f9e8074091e1e702f90801189129", - "0c40f9e163179120013fd696825839df0a007121050054a8008052BBBBBBL4;FF008022913c150294400400f000e0029139150294400400f00040039133150294400400d000e00d9133150294400400d000400e912d150294400400d000a00e91L4;FFb50000b4e0031caae10315aa2200805233150094e1", - "9341f9810601b4e09741f9300800143f0900f1e11a0054e8008052f6b74bf9f7bb4bf9e9830a91e8830a39L8;FFea031f2ae9031f2a6b5d58d3ad74d3f28d18e4f26b810caa0c0840396b610caa0c0c40396b410caa0c1040396b210caa0c1440396c010caa8bfd43d36b7dcd9bBBL4;FFe23bc03de10303", - "91e243009103048052e323803de00702ade18348ade20f803db7020191e8270ca9e10303ad32dfff9700e4006fe00306ade00307ade033c03dL4;ZBL8;FF291540d2290d098b2925019129fd46d30801098b130500917f0209eb89190054088c45f81f0500b1c014005472050094080040b20811c0da0815", - "40d2080d088bBBBL4;FFa2a302d110c0ff97405700b5f5031faa95ffff17a2a302d1630c8052e6bbff97f50300aa00f2ffb4380200145f2800f1880000542800028b08f1df384822f837L4;FB456e63617073756c6174696f6e206b6579204d414320697320696e76616c696467e6096a85ae67bb72f36e3", - "c3af54fa57f520e518c68059babd9831f19cde05bL8;FF21804cade2bb833de0a3833d22804dad21400891e19f833de2a7833de0ab833d37d50094e0032b91012b0091bd500094e8e33b91e0032b91924e0094e87f47f9BL8;FFe8d302f9df0a00b1410f0054f9031faa84000014e1d342f9e8cb42f91f01", - "01eba0730054e8cf42f949078052f8074091188309910969213828040091f97749f9L8;FF79fbff17e02fc13de133c13d2101009021983091e237c13de0031791e3833291e4c31791e2008052e07f813de183813de287813d9ff9ff97f3f742f9e8ef42f9BBBBL4;FF20013fd6e80b40f91f0d00b1c10300", - "54880200f9680080522e0000146082c13c785a40a9770a40f9f50301aae003803d27f50194000680520101805225f50194L4;FB6669636174655072654b65795369676e616c4d6573736167656d657373616765726567697374726174696f6e5f696444656372797074696f6e4572726f724d65L8;FF0900", - "f0f2e8270039e90300f9ecffff17e00300f94102009021c81b914302009063b81c91e003009142018052a4018052eeffff17e00300f94102009021c81b91BL8;FF62018052a80f00f98275019468e2019101030090214c2791040300f084a01391a3630091a2018052a80f00f97975019401030090218027", - "91040300f084201491L8;FF3f0700b1f60f00f9c001005400c30091052c0094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb68000054fe040014BBBL4;FF820641ad603fc03de20703ad6003883ce8ff4139810240ad1f810071e10302adc2050054ea0b40f98", - "903088b08011b32400540ad200500ade8ff0139e90740f9L4;ZDL8;FFf80240f9f4ce43a9fa3245a91f0700b1600b0054e96e41a9fc1240f9f50640f93ff97af2a10800549f0600b120060054f62640f9dffa7af2010e0054f5a600a9BL8;FFe85f06f9e86706f9e83740f9e96306f9e86b06f9e87306f9e", - "82745a9e96f06f9e89b06f9e81340f9f98b06f9e8d306f9e8274529f48f06f9f69306f9e9b30db9L8;FFe83341f91f0900b1606e0054c90080d20900f0f23c4500911f011ceb60810054e8030891e0830e91e3832491000543ad0221c03de8032a91e4032a91e10000b0BBBBBL4;FFa8035db8e80c0037a8", - "035ef8ca0240f9490108eb43100054ea0240f9a0835df84801088be80200f9c90200f908fc60d3a80500b5080840921f1900f1c2050054L4;FFe80740f9080118cbdf0208eb09f2ff54e0230091e10318aae20316aa230080522400805213e6ff97f80f40f988ffff17e0230091220080522300805224008", - "052L8;FF090141d2ea0080523f2d00f129318a9a3f2500f1480e00544a0200f04a011f918b0000104c6969386b090c8b60011fd600200091f44f42a9f65741a9fd7bc3a8BL8;FF292501910819498b08050091091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2905009128", - "0108aba2090054092440f93f0500b1L8;FFa9e301d1ea1740f92001c03da98359f81f0500f14001803d490900f98b010054e02b40f901f97fd3420080522c85009407000014a8e301d1e91740f90001c03dBBBL4;FF1f0308eb28130054180100b4a8835ef8e1031baae20318aa0001168b38c50194d6021", - "88bb6031ff8e80f40b9a8010034a8035ef81f0116eb20170054eb1340f9L4;FB20616c6c2073697a65732073686f756c6420626520636f727265637400000000946249000000000058000000000000003c0000000d0000007375636365737366L8;FFe08754ad689e0139e87242f8649606a9681e08a9e8f", - "240f8699207f8e9af40b9685200f9e8a341f960828d3ce0afc03d688a18a9e87740f90229805269420239BL8;FFc0035fd6f623009137008052180d8052680240f9080540f91f0115ebe91a0054e00313aa49feff97e80300aae00301aac8fd073708fc60d3681a00b508084092L8;FF000180521d000014", - "280180d20800f0f2081d00d11e0000141f150071000200541f11007141040054280180d20800f0f217000014e00313aa76050094e80300aaBBBBL4;FFe10313aaf44f4fa9f6574ea9f85f4da9fa674ca9fc6f4ba9fd7b4aa9ff030491c0035fd6fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd03009", - "1680002ebL4;FB73657373696f6e206372656174656420617420c0012900217374616c6520756e61636b6e6f776c65646765642073657373696f6e20666f7220c00d2028637265L8;FFbf0208eb0107005435000014680240f9897e0e53bf0208eb3861193261000054e00313aa80e40094680640f997fe5", - "cd318693538d50e0091750a00f9d70000b5BL8;FF1300130a21ffff5404000014f3031f2a0200001433008052e003132a4a6501941f1c0072e0079f1af44f42a9f65741a9fd7bc3a8c0035fd6ff4304d1fd7b0ba9L8;FF610640f9810000b4600a40f92200805233650094611240f9810000b4601640f922", - "0080522e650094611e40f9810000b4602240f92200805229650094612a40f9BBBL4;FF290d098b29250191c91a498b29050091b41640f92801088b140500b4890240b22911c0da291540d2290d098b29250191891a498b29050091380108ab22040054L4;FF007d20d4840002cb820040398200003400008", - "0d21f000039007d20d4a268633882000034000080d21f000039007d20d44600805225008052c620c91a270000b0L8;FF21780591e204805273a50014a10100f021840491a20780526fa50014a10100f021040791c20480526ba50014fd7bbea9f44f01a9fd030091080040f9f30300aaBL8;FF3325019420", - "0480522100805231250194200400b4800640ada800805208000039280480520900009029f12091e0a300a9a80700d10010803c820200b042803891L8;FFe2034bade28315ad0801005400030191e10315aae20314aa3925009488021a32e83f0c3921000014a00640ad2800805200030291e1430a9122008", - "052ffaf01f9BBBBBBBL4;FF1f150071e00100541f11007101030054280180d20800f0f287000014740240f9820640f9620800b4810240f92800c0394808f837480400d1290400914e000014L4;FFc0035fd6a00000f0002029914b190094ffc303d1fd7b09a9fc6f0aa9fa670ba9f85f0ca9f6570da9f44f", - "0ea9fd43029109604039e91f003717704229f30300aaL8;FFe80b00f9280200f008e10591e80f00f9e10314aa620200f042682091e1ffff17610200f021942091e00313aa2200805280033fd6f44f47a9f65746a9f85f45a9BBL4;FFfd030191f70304aae40303aae30302aae20301aae10300aae0830091", - "f60305aaf30308aac4fcff97e81340f91f0500b100040054e00bc03df41b40f9e0830091L4;ZFL8;FF0809c05a2909c05aa0033fadae3f7529a003dc3ca103dd3ca203de3ca303df3ca303983ca203973ca103963ca003953ce8270e294809c05a6909c05ae8270f29BBBL4;FFe93303b8a9835ef8a83b00", - "79e91300f9e93340b9e8d30378e83343b8ec730378e8b300b8681d0012e90b00b9e91340f9e863003908208052e90b00f9e90b40b9L4;FB2e727300237370717220696e6974696174696e6720737461746520776974682076657273696f6e20c00f20616e6420646972656374696f6e20c0002173707172L", - "8;FFe3f701f9e20319aae8eb01f9e86b40f9e0fb01f9e0031d91e8ef01f9e8fb40f9f21b02f9e8f301f9e8bb40f9f73302f9e8ff01f9e8ff40f9fa3f02f9e80302f9BL8;FFe8d342f933ffff174b0080522c0100348c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c05009102000014ec031f", - "aa8b010b8b2801088b49010b8bL8;FFe81b03f9e91f03f941590094e1fb44f9810000b4e0ff44f92200805230590094e0c31791e1833291022b80523459009460030291e1c317914796fe9754050014BBBBL4;FF1f090071a1030054880200396800805268620039f44f4ca9f6574ba9fd7b4aa9ff430391", - "c0035fd6760240f9f50301aa27f90194000280520101805225f90194L4;FB6f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f6369706865722d302e352e322f7372632f737472L8;FF880200f98082833ca00f7bad8182843ca10b79ad89820a", - "f88082853ca003d13c8382863c8082803c8182813c8282823c4f000014e08744ade00314aae22fc03dBL8;FF610600f969420039edffff17ffc300d1fd7b02a9fd830091e80300aae00301aa098540f83f0500f141010054e80300f921030090218c0891e823009122018052L8;FFe20314aa030880521b0", - "88052d7bbff97089080520083c23cf54f09f9e84b09f9f57749f9fb6709f9f46b09f9f47349f9e0a3843de0a7c43d4383c63ce85309f9BBBL4;FF4e2100d1ed5b00f9cc010c8a9f2500b1e82500542c010c8bbf0600b12b692a388b210039e0240054290d0acbab060091f90314aaeb5f00f935811ff8e94", - "740f9L4;ZBL8;FFfd7bc6a8c0035fd628008052e81b00f92fb9009400108052210080522db9009480e1ffb5200080520110805239b90094e0031f2a2d120094e17342f9fa03002aBL8;FF22030054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc20", - "10054092040f9090100b42a0140b24a11c0daL8;FFe10317aae3031aaaa3c3fe97e8036a391f050071a11c0054e84745f9f74b45f9f85345f9fa5745f9f55b45f9fb5f00f9e84300f9e84f45f9e83b00f9bc0000b4BBBBBL4;FF4a0400d1e800001401500591e003022ae20303aa0cf4ff97e01e00b4e007", - "00f9210400b021a01f91230400b0635436917e00001401400591e003022ae20303aaL4;FFfd7b03a9f52300f9f44f05a9fdc300915f0c00f1f30300aa89040054f50302aaf40301aa2a090094c00180522100805228090094e00600b4880000f008bd3491L8;FFfd7b43a9ff030191c0035fd6202040a961", - "02009021e00b91030d40f902028052fd7b43a9ff03019160001fd6202040a96102009021f00a91030d40f9c2018052BL8;FF61000054ff670ea9ff7b00f9c1c20091a20301d1fd72ff9720f3ffb437000014a00301d1858a0094f80301aa00f6073647000014f8031faa45000014480b0091L8;FF720100f", - "052a23a9109fc60d3487a68782821084a095d1053495a69782801084adbffff17a80100b008010191a98300d100210091a20301d1e10700b921008052BBBL4;FFfd830091010840a988008052f30300aae0230091240080520504805229f87fd33f1100f13481889ae30314aa8e000094e80740f91f0500f", - "1e0000054e80b40f9L4;FB656f757320646174612072656365697665642066726f6d2072656d6f7465207061727479436861696e206e6f7420617661696c61626c6500d518490000000000L8;FFe8c3159100a10191fec4ff97c0000014fa031faa1f000014f4031faae8fb42f91f0500b180000054e8c31", - "59100010291f4c4ff9708008092740600f9687201a9BL8;FF298114918a0000102b6968384a090b8b40011fd661ce40f9810000b460d240f9220080522e49019461da40f9810000b460de40f9220080522949019461e640f9L8;FF000500911f0009eb28dfff54000100b000e0329135490094000100d000", - "a00b9132490094fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091084c80b9BBBBL4;FFfd7b44a9ff830291c0035fd6f9030aaa03000014fa6741a9e9030aaa08008092ba2601a9a86600a9b60000b4e00317aae10316aa2200805229e9019493fdffb4L4;FB0000000000000000080000000000", - "00000800000000000000804c420000000000000000000000000008000000000000000800000000000000804c420000000000L8;FF20010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faa3ce90094e00741a93ae90094fd7bbfa9fd030091090040f9280140f93f0100f9BL8;FF0", - "80140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b180030054091440f92a0140b24a11c0da4a1540d24a0d0a8b4a250191L8;FFa80302d1e10316aa60c30291bc0302d14785ff97a80358f81f0500b120120054e082c13ce80700f9e8030b91f7430f91f89301b9e917", - "40f90029803da8835af8BBBL4;FF09692138a14301d1aa031cf84595ff97a1035cf8a8035bf8f90f00f91f0101eb80220054a8835bf8490480522a040091e00313aa09692138a14301d1aa031cf8L4;FFfa6741a9fd7bc5a860001fd65f09007141000054173f0153356440a9fa031f2a483f00121f21376", - "b02010054281340f9c1520012e00315aa5a07001100013fd6L8;FFba024079bbe25f78080101cb1f0d00f14901005448431b2a390700f1b51200910809c05a086821b821100091a1831ff861feff540a000014a06300d182008052BL8;FFc0035fd61f0500f92900805209010039c0035fd6290080520a25", - "00390921003909010039c0035fd649008052098500a92900805209010039c0035fd6ff4306d1L8;FFe8030bf9c00000d000c83191e80b0bf9c80000f008010391e1833f916300189162008052f5f307f9f6fb07f9e9070bf9e90f0bf9e8130bf9b9e3ff97e1e344f9BBBBBBL4;FF3f7f04a9faff05a98207", - "40f9423500b4810340f9370080395704f8b728040091490400d12f000014e003082ae20313aae303152ae0f7ff97e0f6ffb4aaffff17L4;FFd2030014d8fd78d3e9031aaa3a7f085328ff60d3eb7b42f9ed7f42f937fc60d33cff78d3ea03012ae1ab40f9fb030eaaf003182aef031a2afa0309aaf9c700f", - "9L8;FFc0035fd6e8034039e9074039ea0b4039eb0f4039ec134039ed1740392811082ae91b4039ee1f40396a110a2aab110c2aef234039f0274039c911092af12b4039BBL4;FFe4000014e80740f9080116cbff0208eb081f0054f70100b4a002168be10318aae20317aa36910194c802178be00318aae10", - "317aa22008052e80f00f928910194L4;ZDL8;FF3f0900710d0100543f1100718c0100543f0d0071c00100543f1100718001005417000014090200343f050071000100543f090071c0000054110000143f150071BBBL4;FF3f0114ebf033949a290110cb29690c9b200dc03da0039a3c2011c03de012803d2", - "015c03de016803d2019c03de01a803d2001c03da003973c2005c03da003983cL4;FB25ea49159797525496eabc8150faacf151ba31ff00bba28c25efba520000cd83e6ac8cbb47a8daba1ae730adbc541aa187b21a2b5a6c0f0a035f86ec4d14e8bcL8;FFe96f00f9ee7b40f9e1a740f9e89300f9eb2b40f", - "9e83357a9f8ef53a9e2c35da9e8ff00f9e8275ca9ed1b4ba9e02b44a9ec2717a9e9174ca9ef6741a9e9d300f9BL8;FFe04316912200805236110094e1d342f9dbfdff17e0431691e1031aaae20318aa30110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaaL8;FF282340b8e90f", - "4b79eacf42f9eb075639ec434b79e86b08b9e8c742f9e9db1079e9cb42f9aa0318f8ac8318784b650036ea6b48b9ebdb5079ece20b91e04341f9BBBBL4;FF49fd60d368d2037848fd70d369ba0079e9ab43a9687a0139e81340f975e2003968f205f8a8835838697206f8a90358f868de013969f206f8e8a", - "742a97bf203f8L4;FB792063616c6c656420666f72206e6f6e2d6578697374656e7420636861696e00759148000000000034000000000000005d0100000e0000007591480000000000L8;FF9f3e00f9e10314aae20313aa64030094c00300b5e1031faad5ffff17c1010054e1031faac1ffff17880080d2e", - "10700f90800f0f2b9ffff17e80b41b2e00700f9BL8;FFaaa35738a98317386901084aabb35738a99317384901084aaac35738a9a317386901084aabd35738a9b317384901084aaae35738a9c317386901084aabf35738L8;FF080d088b0825019108fd46d30900088b3a0500915f0308eb681c0054060100", - "14e1d342f9e8cb42f91f0101ebe0700054e8cf42f9490b8052f407409194820991BBBL4;FF1f0500f1eb000054e00309aae10308aa22008052f6030baa31b10194eb0316aa9f0700f1ab000054e0030baae1031caa220080522ab10194e12347a91f0900f1L4;ZBL8;FF1a0101911b81009148139b9a0005", - "40ad000400ad2eb1009400098052210080522cb10094c00800b4f80300aa28b10094000480522100805226b10094a00700b4BL8;FFe86f04f948008052e86b06f9a802009008410591e86f06f9e85706f9880200f0082d2291e86306f908078052e97b06f9e9c32291e86706f9280080d2e97f06f9L8;FFe", - "85b05f9e800009008e92791e95305f9290080d2e86b05f9c80480526940c0f2ea6f05f90a078052ff4305f9e84b05f9ff4f05f9ea5705f9e86305f9e96705f9BBBBBL4;FF29010037090040f92a0080920a0100f92a008052297140b90a200039090900b9c0035fd6fd7bbfa9fd0300912004009000e0119", - "141010294ff4302d1fd7b04a9L4;FF21835ff8e1feffb4200340f92200805233010094f3ffff17e85240f9c80000b40805088be00315aa0201805201ed7cd32b0100945f0f00f140070054f5524da9L8;FFc9fbff54e00313aae10317aae20315aa2300805224008052e2170094770a40f9d6ffff17f44f4", - "4a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6ff8303d1BL8;FF7a810194b30100b4080d8052757e089b130300f073e21091e0030091a1630091e20313aab40f00f994a2019170810194b5a201f121ffff54e00300916d810194L8;FF14000014f5031faaf60314aad30e43f87f0600b1c1030054e8", - "031faa28000014e9031faa8a2a80b96afbff35ea031faa8b1a40b97f05007120fcff54eb031faaBBBL4;FF1f01096be0179f1a4fc10194d60600f11b001b0a21ffff54c6ffff17e81740f9156d00a92c000014e043069121230091022a805232c10194f41340f95f0314ebL4;FB7279707420c01b206d657", - "37361676520776974682072617463686574206b65793a20c00e20616e6420636f756e7465723a20c0152e2053657373696f6e206c6fL8;FF4001c03d81220091a80317f888ee40f9e007813d807ac03da98318f889565fa94083813ca2837bade81302f9e883029100a10191a103963ce91f02f9e01b813d", - "BL8;FF1f0500b160000054e10313aa0bfeff97950a40f9550300b4610a40f9680240f9960640f91f0101eb20080054680640f9490380522a040091e00315aa6a0a00f9L8;FF8a0000102b6968384a090b8b40011fd6010440f9410300b4000840f922008052f44f41a9fd7bc2a82d41001413d041a988024", - "0f9680000b4e00313aa00013fd6BBBBL4;FF390300eb63b200541803008bf9feffb50f0000141f0400b1c1b1005453e101941f10003141b10054f9ffff1750e10194f70300aa1f0400b141fdff54e0430591L4;FB657373000000000034ed4800000000006a00000000000000190000001c00000034ed480", - "0000000006a00000000000000e30000002e00000034ed480000000000L8;FFe2e7c23de013823de0ebc23de10f823de1d7c23de01b823de0dbc23df9cb03f9e217823de107823de00b823db95f0094e8b345f9e0d7c23da8031ef8a0039d3cBL8;FF0101805233610194600100b4165401a9e10200f021e0", - "0091141000f91fa0003913a40039f44f42a9f65741a9fd7bc3a8c0035fd6000180520106805240610194L8;FF3f0800716106005481620091e003082ae20313aa57fdff97200700b4fa0000143f0c0071000700543f100071210500541f0900f1a1210054e00313aaff6b00b9BBBL4;FFd6c20491410300f", - "021203e91082109aa6905c05a420300f042801891a34300d108010aaa0ad49052b6831ff8284108aa2a00a072097dd59b28a10a9bc9038052L4;FFf60300aaa00300b420031091d30a00f9760200f9610282d28202018bdf1e00b9010c40b942cc749242187bb2150080d23304001117008052130c00b9df", - "1a00b9L8;FFff0301d1fd7b02a9f44f03a9fd830091140040f9e00301aa810100f021081591e82300916201805279a10094b30100d073620a91810100f021401591e0230091BL8;FF7f010cebc1010054ac0100372b0440f96a010aabc20100540b0840f90a0400f9690109aba2010054090800f9e00301a", - "a1f0100f9fd7bc1a80f080014200440adBL4;FF09010054e0e30091e10317aa220080521500ff97f42344a91f0114ebe3100054e81f40f9e10315aae20317aa0001148b33210094e90344a9080009eb230f0054L3;ZBBBBBBBBBBL4;FF3a1e02946004009000a01291371e0294420400d042203391e00308", - "aae10303aa341e0294400400d0000017912f1e029460040090004016912c1e0294420400d0L4;FFe81f40f9745603a9692a00f9e91340f96012803d695a01a9772202a9f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6ff4301d1fd7b03a9f44f04a9L8;FF89d600a9765e01a9f44f47a9f657", - "46a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6e8030091090000d029911f91f6a300a9e823009180020090004c0791BBL4;FF9402098bff4702f9d00a00941b0000142f9e019440028052210080522d9e0194e01e00b4f80f40f9e90740f96a0300904ac91791f70300aae8cd8d524001c03dL4;FF", - "0100018b6000048a6300018b6100048a210000cb010000d411f7ff97fd7bc1a8c0035fd6fd7bb9a9fd030091f30b00f9f303032ae43700f9e3f77fb25f0003ebL8;FFfd7b41a9f31340f9ffc30091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091140040f9e00301aa810100d021c81b91e8230091420", - "18052759e009488820191BBBL4;FFff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300eb235100541803008b060000141f0400b1a1500054L4;FBe410440000000000080f440000000000841144000000000094144400000000008c134400000000", - "00e410440000000000f40f4400000000007815440000000000L8;FFe06745f92200805235de0094e16f45f9810000b4e07345f92200805230de0094e8032b9100e10091fcd7ff97a9100014e0031d9121200091023c805230de0094BL8;FF37fc4039f40301aaf30300aa1610805235000191383040f9200", - "0178be21640d2e1031f2af91640d2161400382a5e01943f1f00f1a8010054800640ad80020191L8;FF2a0400916a0a00f909692138e10313aac7fbff97818a40a940008052e30313aa19faff97810a42a960008052e30313aaf44f42a9f50b40f9fd7bc3a812faff17BBBBL4;FFff0304d1fd7b0ca9f85f0", - "da9f6570ea9f44f0fa9fd0303910950403929140037150440a9f30300aa161040b9e0230091f40308aa9d9a0094a00642a9e2830191L4;ZFL8;FFf65704a9f44f05a9fdc30091081c00121f090071a1010054e00302aaf30302aaf40301aaeafdff9720020037750240f9a80640f9160101eb02030054e80", - "f41b2BL8;FFe82700a9537e0194f44f43a9f51340f9fd7b41a9ff030191c0035fd6000040f9caf9ff17080040f9e20301aa002140a9e10308aa647e0114000040f95a7e0114L8;FFea1700f909692138e1630091817eff977f0600b160d0ff5480220291e16300916891ff977ffeff17e00315aa0efcff97", - "080040b20811c0da081540d2080d088bBBBL4;FF56d77fa91f0114ebe0010054e8bf40f989060091e1c30591e00315aa1b693438e9c300f93faaff97f4c340f9e8bb40f9080114cbbf0208eb68010054d5fcffb5L4;FB6d2e7273002163616e6e6f7420616476616e63652070617374206072656d61696e6", - "96e67603a20c004203c3d20c0002f636172676f2d72656769737472792f69L8;FFb40000b4602a40f9e10314aa2200805233be0094613240f9410500b4603640f922008052f44f4aa9f65749a9fd7b48a9ffc302912abe0014612640f908008092BL8;FF800700b4e10316aae20317aaf40300aa3b3e0194", - "582f40f9d80100b5c3ffff1737008052591740f9b7831ff859fcffb535008052572340f9b6831ef8b8431fb8L8;FF41fdff5481220191e20313aaa3fdff97000100b483000014200e00b5e00313aa7cfeff97e80301aa80000036880e00b5e1031faae1ffff17e1031faa886200b9BBBBBL4;FFe10313aa4", - "7faff97806240b960010034610a40f9680240f91f0101eb60100054680640f929040091690a00f91a692138e10313aa3bfaff97950a40f9350300b4L4;FF880000b4e08756a922008052340e0094787f60d3e8cf40f9880000b4e18359a9220080522e0e0094e8df40f9ea431391e09bc03da300009063e0", - "2a91a5000090L8;FFe91b40b9eb6301b8ebc341f8ea570039ea6b0039e9b301b8ea7f0039eb1300f9e82b00b96c0e0194fd7b44a9f32b40f9ff830191c0035fd6fd7bbea9f44f01a9BL8;FF208d212e00a8302e0800261e48010037292100918003098b1c00188a296b7cfc208d282e0800669e17c101f24", - "1fbff54f4ffff17e8430091e00314aaf5430091L8;FFffc30091c0035fd6a80100d008010191e9030091630100b063802191640100d084001191f303002a00210091e2230091f403012a21008052e82700a95c8e0094BBBL4;FF4a018052e00317aa0a692138e1e30091e92700f943baff97f92740f9e81f", - "40f9080119cbff0208eb281e0054e82340f9e10318aae20317aa0001198b30ce0194L4;FB49405c3c31bef99879f22ea0a686816f443e29147616b47240e1051b0595e8330bdda28c02cd2ea6a91191950000ea2740508d60a1644ed5151b26d3654b4a93L8;FFe89f12a9e71f40f9ed0740f9fc4340f997", - "f6ff17e8ff40f9f0f340f9e10315aaf16f1ea9f10305aaeabf40f9e89300f9e85b40f9f50316aae65b00f9e65f40f9BL8;FFeb4746398c9246f8edc74639eaa34639e8d303b9e9ab0779e8a759a9ecb300f9eda305392b1f0036ebd343b9e96306394921c993e8cb00f9ecab4779e31b40f9L8;FF410301a", - "d020142ad420302ad010140ad410300ad60000054e02b40f990e8ff97f4e351a9180200b49922009104000014180700f1396300916001005421835ff8BBBBL4;FFff8302d1fd7b05a9fa6706a9f85f07a9f65708a9f44f09a9fd430191130840f9183040b9f70300aaf40308aa330300b4f60640f926ee01", - "94e00313aa21008052L4;FB5365616c65642053656e6465722076323a2044485365616c65642053656e6465722076323a2044482d73656e6465720085924800000000003300000000000000L8;FFe20313aa8df0ff97200a00b5e1031faae2ffff173f0c0071e00200543f100071e100005481620091e203", - "13aa04edff97a00500b5e1031faad8ffff17e20313aaBL8;FF29611a91e20200d042840c91e3030091e00314aae10313aab50f00f9e82700a94c6e0194e000003620008052f44f43a9f51340f9fd7b41a9ff030191c0035fd6L8;FF84002991428009918104805248030039436e009448236639e20740914", - "00100d000842791430100f063600591440100d08400289142800991a103805248030039BBBL4;FFbc0359f8be431678be835938a8435678bc831af8be031b38e8930678087e1053e9b306f8e84b0239a8fd60d3fcb309f8a98357f8e85f0239e87d1053ea3307f8L4;FF36319a9aa9021ccbc8021ccb1f01", - "09eb28020054f70300aaf60315aa80021c8be1074091e20317aa3210009428008052f50316aafc031baa0804a07208011bcbL8;FF48010035e80100d008e140391f05007101030054e103192ae2031f2ad807009408fc60d33d000014e80100d008010191a94300d1e00f00b900210091a22300d1BL8;FFe", - "04b813de14f813d680000b4e00313aa00013fd6810640f9810000b4820a40f9e00313aa2e2e01949f0b00b121020054e0a34fa962030291e17740f9081140f9L8;FFe90300aae00709a9aa4700d1e88b00b9cb0000f06b412091e81301b9a81840f9e20f0aa9e0070da9e00304aae10309aae20f0ea9c2e0", - "0191e3031f2ae74300f9BBBBBBL4;FFfd7bc3a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f09007181010054540040f9880640f9080200b4f30301aa810240f9L4;FFf9b34bf92c008092f7a319a92c0100142083c03c2183c13cbf0600b1e00711adc0050054e077", - "c03df53301f9fc3701f9e09f803d384100b4e80240391f0d0071L8;FFe00314aaf44f43a9f70b40f9f65742a9fd7bc4a818fdff17280080527f0a00f97f2200a9e00314aaf44f43a9f70b40f9f65742a9fd7bc4a80ffdff17600200d0BBL4;FF8a00805208a800a91f0000f9fd7b44a9ff430191c0035fd6", - "097d1c53490d00342910c0390a00be5208010a0b2a1d00120901f83708710a8baa00805208a800a9L4;ZBL8;FFe0030091a363009142008052a80f00f9809600948101009021f41991840100f084e00d91a3630091a2018052b30f00f97896009478960094fd7b41a9f31340f9BBBL4;FF600600ad682200", - "b9f44f44a9fd7b43a9ff430191c0035fd6c00300b000e03a9132d60194092840a9eb0309aa090100f929010a8b608540fc0a0c40f929050091L4;FBe20000003100000040194900000000004d000000000000005f0300001c0000008a1a4900000000005b000000000000008d00000011000000e61a49000", - "0000000L8;FFe0f3803dfc030eaaf48f11a9f4030faaf1df00f9f0cf00f9e6fb00f9f29710a9f6f300f9f6030daae4af00f9f51300f9f7ef13a9fa2300f9e7fb16a930d60094BL8;FFe18f49f9810000b4e09349f92200805233560194e80740910881099100210491d70a0094e5fcff17e1d342f9e8cb42", - "f91f0101eb008e0054e8cf42f949058052L8;FFe15306f9e08332912101009021e0339102028052230100b063e00191a40280524c000014e80f41b2e0833291e85306f91c4cff97e10300aa3e000014c80080d2BBBBL4;FF820a803d68a20039f44f4aa9f93b40f9f65749a9f85f48a9fd7b46a9ffc30291", - "c0035fd6000180520104805244f60194000400b000801b9140f60194fd7bbca9L4;FB73736167654b65796b796265725f7072655f6b65795f69646b796265725f6369706865727465787453656e6465725369676e696e674b6579657068656d657261L8;FFe8ffff17e00300f94102009021d81691430200", - "9063001791e00300914201805264018052eaffff17c80080d2e0230039e00300910800f0f2ff270039e80300f9BL8;FF85760194fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa0103009021d82391e8030091e00309aaa2018052L8;FFe277c13de0a", - "3843de067c13de81700f9e83f49f9e1a7843de16bc13de80700f9e807409108810191e2ab843de09b843de19f843df8c1ff978083c23c8183c33cBBBL4;FF8cc101920cad00a9c0035fd6fd7bbda9f65701a9f44f02a9fd030091090400b0f30300aa290140f94ad03bd55401098b894240393f050071a10", - "40054802640a9L4;ZDL8;FFff0308eb28008052a1030054b47c039b0b00f0d2f50304aa6b0104cb9f020bebe8020054010100b4a17c019be00302aae20315aae30314aa44b60094800100b5BL8;FF00330054f9a740f9f88342b9190700b4f3a340f92e360194e00319aa210080522c360194201301b4e10", - "313aae20319aafb0300aa32360194f4b340f9f40500b4L8;FF0081893c01818a3ce92346a9fcbf05f9fcc705f9e94705f9e93b40f9e84305f9e84b05f9e82b45a9e95305f9e92340f9f6d705f9e85b05f9e95f05f9e86305f9BBBBBL4;FFf73b00f9f65708a9f44f09a9fd830191200440ad28008052f303", - "00aae87f01a9a88300d1e0830091f40301aaff0700f9e00701ad3c060294a2035ef8820900b5L4;FF6800c8376800d037550600148606001486060014ff0302d1fd7b02a9fb1b00f9fa6704a9f85f05a9f65706a9f44f07a9fd830091385040b9f50301aaf30300aaL8;FF0a2500a9f44f45a9f52340f9fd", - "7b43a9ff830191c0035fd6fd7bbea9f30b00f9fd030091080040f9f30300aaa80000b4600640f901f57ed34200805228060194BL8;FF70a248f8712249f872a249f8600a40f96d4e40b96e1640f90b180036e00740ad2b00805221008052a0073fadbd00001427860194600380522100805275038052L8;F", - "Fe86f00f9e87b00f9e88700f9e89300f9e89f00f9e8ab00f9e8b700f9e8c300f9e8cf00f9e8db00f9f832f8b715fb7fd3b500f8b6f6031faae00316aae10315aaBBBL4;FFe81b40f9792202a9e82b40f9682a03a9e87b40b9eab347b8280100b9e88743a96a4601b968ae00f9e84f40b9686201b9e82740b", - "968a2053981e2ffb5dafeff17L4;FB343938356335303939306231343131366236643835366166303938352f6c6962726172792f636f72652f7372632f697465722f7472616974732f616363756d2eL8;FF8092c63cf40308aae8bf43f9fc6700f9fca35d3921830091e0e3803d022e8052e8f203f8e8c31", - "591f7430d910081009133c60094e0e3c03de8f243f8df0600b1BL8;FF08050091280800f943feff540b7c07533f0108eb6b611932000100544b692838080500911f0048f1280800f96202005400fc4ed3af000014e00700f9e00301aaL8;FF08050091091840f93f0500b1400400540a2040f9092c40f90a", - "0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b2BBBBL4;FFf63b40f9f3031f2ae10600b4e85740f9fb1f40f9e90f40b9e82700f97fffff17f60746a9f30300d073a61091e02b40f9540380520a000014f63340f9f30300d0L4;FB73696f6e207374617465", - "20636f727275707420666f7220c00076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f74726970L8;FFe80f41b29dffff17e06301f92102009021a017912302009063601591e0030b91420280520401805227000014e0230b39e0030b91ff270b39f56301f919dcff9", - "7BL8;FFffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aae102009021182e91e8030091e00309aa620280527666019468820191e1020090L8;FFa80000b4607240f901f57ed34200805233660094687a40f9a80000b4607e40f901f57ed3420080522d660094688640f9a800", - "00b4608a40f901f57ed342008052BBBL4;FFf44f4da9f75b40f9f6574ca9fd7b4aa9ff830391c0035fd6e88343a98082c23ce92f45a9ea2740f9e007803d1f0500b1e1f9ff54eeffff17a0835df8dcffff17L4;FF450080528270009100204039001040d3a520c01aa6040051e503054b02000014bf3b03d", - "5831c40b96100050a40fc5f887f00006b61ffff5441fc008880ffff35L8;FF311e0a0a42280a0a632c0a0a28340d13e4c3841aef150a0a52220a0a21380e13a5300a0a2901044a6b010c4a00240a0a08350a0a29010b4aab010e4a0c02114aBL8;FF4d7c40390080c03c0a0d00f96a3240b84e7041f80b81", - "00394b0040390c1100b84c1c40390a0500b96a111d124b5040780a8500394a1040b80b4d00794bb040b8L8;FF090d00398b6d1c320a0500390b010039a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091150840f9BBBBBBBL4;FF371a0294e6f", - "fff17e003032a3b1a0294f40300aae3ffff17fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30300aa220100b45f3c00f10202005448007d92L4;FFdb0300b4b80000b4e00319aae10318aa22008052321a0094a1835ef8810000b4e00315aa220080522d1a0094a06300d1e103172af9110094280080", - "52a16300d1L8;FF371a0194e00313aa0105805202018052331a0194a00640f9e10316aae20314aa311a0194b40a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6f405f8b7BBL4;FF0b2140392f214039294100910dc11f382d00034aca010a4a0c150039eb010b4a0d0900390d00114a0d1900390a", - "1d00390b21003908410091a1f7ff54ec0f40f9L4;ZFL8;FF859a0094f44f43a9fd7b42a9ff030191c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aa810100b0217c1891e8230091e00309aac2018052BBBL4;FFe2074091c00300d000283291c30300d063c01e91c40300d084a03291", - "42400f9101038052e8eb09f9e9db13b93cda019448008052c00300d000003391c30300d0L4;FB08000000000000000c0000000000000088134900000000008e134900000000009a13490000000000a913490000000000b313490000000000cb13490000000000L8;FFe86740f9e85704f9e8ef40f9e85b04", - "f9e85740f9e85f04f9e86f40f9e86304f9e85f40f9e86704f9e8e340f9e86b04f9e85b40f9e86f04f9e80740f9e87304f9BL8;FFe2a3c43de95b49f94081833ce067c13d4181823c4281813cead342f9e99f06f9e24bc33de347c33de14fc33dea8306f9e03f833de18b833de143c33da7ffff17L8;FFf50", - "31aaae10316aa9f0213eba0020054e0c31791b50600d136a001919703138b760c0094e08bc13de18fc13d73a20191e293c13de387c13de10316aae08601adBBBBL4;FF00a8200e0800669e0801c0da0811c0da0cfd43d3086a6c38cdffff17000400d000a0169145fa0194ff8302d1fd7b06a9f73b00f9f6", - "5708a9f44f09a9fd830191L4;FB6720616865616420c012206d657373616765732028696e6465783a20c00b2c20636f756e7465723a20c0012900c0202045786365656465642066757475726520L8;FFf4eb00f9e0870cade28346ade2830dade18343ade1830aade28344ade2830bade18341ade18308ad", - "e28342ade28309ade18340ade18307ade02300b4e87b40f9BL8;FFa20000542b686c388cf17dd36b21cc9a6a010aaa2b097dd35f0008eb4a21cb9a0b1c40f96a010aaa0a1c00f9820000542901028b092000f9c0035fd60b2441a9L8;FFe0630091e10317aae20315aa2300805224008052e390ff97f7174", - "0f929feff17e0630091220080522300805224008052dc90ff97e11740f930feff17e0630091BBBL4;FFba0358f8edffff17bf0600f1a1310054fb0308aa28008052f32300f9f5031faaff0700f9f40600911e000014e84340f90901168b280316cb2a050091380d0091L4;ZBL8;FFe00b15ad3eba0094f80", - "00014f5f340f9d71f00b42eba0094e00317aa21008052380080522bba009480fcffb4a1020291e20317aae01b00f931ba009424ba0094BL8;FFf90b00f9f85f02a9f65703a9f44f04a9fd030091084c80b9f30300aac80a0034080140b20811c0da081540d2080d088b0825019108fd46d315050091681a4", - "0f9L8;FF373a0094619a43f9f55b00f9810000b4609643f922008052313a0094fa031faaf5031faa7fc613392a00809288020014e8f741f9788242f9e90342f9fa5f09a9BBBBBL4;FF240080524afdff97610a40f9dbfeff17e00313aa22008052230080522400805243fdff97610a40f9e2feff17e00313", - "aae10317aae20315aa2300805224008052L4;FF685200a9f44f46a9f65745a9f85f44a9fd7b43a9ffc30191c0035fd635008052f4d701a9f41700f9e8030091e00315aae10314aaab0a0094e80340f91f0500b1L8;FF600640a9e20314aae82700a9c82641a9f86702a9fa6703a9e82701a94d0a019420fd", - "0737d6820091df0217eb61feff54600640a9a86200910900009029212891BL8;FFf5db44a9e11b40f9810000b4e01f40f922008052328a0194b50000b4e00316aae10315aa220080522d8a0194e00314aad772ff97081f00d129008052680600f9L8;FF01fdff54f30300aae0430a91a7d3ff97e00313aaf", - "34f41f9e2ffff17e84b41f9f84f41f9f40317aae80f00f9990300b548008052ff5301f9f3031faae84f01f9BBBL4;FFa9e4ff54a0c300d1e10317aae20318aa230080522400805245bdff97b7035ef8ba035df81cffff17a0c300d1e1031aaa2200805223008052240080523cbdff97L4;FB080000000000", - "000090fc45000000000000000000000000000800000000000000080000000000000060fd45000000000000000000000000000800000000000000L8;FFe8270ea9e96744f9e87b40f9e00b18ade2f3c13dee6344f9e96300f9e9734ff8ed6f44f9e18b14ade1fbc13de0ebc13de8bb01f9e87344f9e3ffc13", - "da97202f8BL8;FFa80000b4604240f901f57ed342008052334a0194684a40f9a80000b4604e40f901f57ed3420080522d4a0194685640f9a80000b4605a40f901f57ed342008052L8;FF3f0500b1201a0054f30300aae00308aab3020094e80300aae00313aa090140b22911c0da291540d2290d098b2925", - "019129fd46d30801098b130500917f0209ebBBBBL4;FF740dc0da980dc0daa0833dadd50dc0daf70dc0daa0833eada003d73ca103d83ca203d93ca303da3ce39b803de297803de193803de08f803da003db3ca103dc3cL4;FB7f0b00000e0000000000000000000000080000000000000008000000000000", - "001879420000000000000000000000000008000000000000000800000000000000L8;FF760a40f9680240f9080116cbbf0208eb29f7ff54e00313aae10316aae20315aa2300805224008052de000094760a40f9b1ffff17fd7bbca9f70b00f9f65702a9BL8;FF42e01291e0230091e1030091706a0194706", - "a0194fd7b42a9ffc30091c0035fd6fd7bbfa9fd030091086040b9a8060034080140b20811c0da081540d2080d088bL8;FFe9a34539ec7b0079ebf303f8e8f304f8e95f01395675fe97e103002ae8430691e00315aa9abbfe97e8cb40f98082c53c8182c63c8282c73c1f0500b1e00600adBBBL4;FF580000", - "14e00743ade92f40f9682600a9608600ad53000014e90f40f9280080923f210039280100f94e000014280080522900809268220039690200f949000014L4;FF6b0d0c8bf7020ccb370200b46d0140f9ff0a00f1ec328a9abf4100f1e0000054bf6900f1c1feff54ff0600f180fcff54680540f9f3ffff17f", - "f0600f100fcff54L8;FF3f0500f108ffff54c90a088b2a0140795f213b6b6100005434050079caffff17a9035ef81325889a5f0309eb40030054d70a138b480313eba900005402f57ed3BL8;FF2007c03d0800f0f21b2100d14003803de863019100610c913fdfff97c8fdff17f83f42f92083c13ce9d742", - "f9f5c742f9f7cb42f9080340f9c0828d3cf63b42f9L8;FFe00319aa01c4805222008052342a0094bc035ef8bb035df868031ccb1f7d00f189440054b9835df8400740ade0031aaa010480522200805228031c8bf6032491BBBBBBL4;FFf65745a9fd7b43a9ffc30191c0035fd63600805206000014e00308", - "2ae20313aa630c8052e4f8ff97c0fbffb5770240f9e20640f95f0015eb09070054e10240f9L4;FFfa03002aa04700d166c4ff97f603002aa04700d163c4ff97f903002aa04700d160c4ff97fb03002aa04700d15dc4ff97e8074091e9ab41b908411d9109010039L8;FF09fc74d30afc6cd30bfc64d30c0c", - "8052001d00390901003909fc5cd30c2c08330a0500390afc54d3090d003909108052293408330b0900390bfc4cd30a110039BBL4;FFe00313aaca910194680640f909038052400fc03dc822099ba9035df80001803d090900f9c8060091a1835af8680a00f9810000b4a0035bf82200805228920194L4;ZD", - "L8;FF2200805236920094f8ffff17d50000b4a806158be00314aa0201805201f17dd32f92009408008092685e00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6BBBL4;FF61af009400018052e10315aa41d20194090c40f9490100b40ba440a90a0040f93f010aebea338a9a29010acb0a0e8052292", - "d0a9b1f2500a9c0035fd6ca030090L4;FB2061370cf575f1db175d3c3317640cc06fcb39780cfd72f23b99e3eedec2bbe9f44d37430607d11b0000fb887781f1db4c69aaefa9449d928f4307a6ff0d3c7cL8;FFfb6f42f9f97342f9fcbb42f9e8cf00f9e81742f9f4c742f9e0f3803de8c300f9e81b42f9e", - "8ab00f9e81f42f9e92312a9e82342f9e92742f9e8ab1aa9e82b42f9BL8;FFe002009000c00291e302009063201a91e402009084c0039142c035918107805248432c393e520194e0074091e10318aae20319aa00002f912a120094f8eb4df9L8;FFf85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6000100", - "f000a03b91020100f042803c91210680524e520094e8ff42f9e90343f9000100f000e03c9123010090BBBBL4;FF680200f9fd7b47a9f34340f9ff430291c0035fd6ff0306d1fd7b12a9fc6f13a9fa6714a9f85f15a9f65716a9f44f17a9fd830491f30308aa084840f9970280d2L4;FB20696e2075386d69", - "64203e206c656e00000000000000000000000000000000000100000000000000c4f442000000000000000000000000001000000000000000L8;FF210c00b5e0031faad3ffff17e003082ae20313aa430c805297ebff97c0f9ffb4c3ffff17a80640f91a0101eb0201005499000014e10314aae20313aa00f", - "1ff97BL8;FFa98356384a01084a6b01084aaa631638aa9356382901084aab731638aba35638a9831638a9b356384a01084a6b01084aaa931638aac356382901084aaba31638L8;FF80220291f52b0094080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308eb48320054", - "01020014e1d342f9e8cb42f91f0101ebBBBL4;FFbf2337a9a86303d1a26301d101210191fe9bff9700f4ffb4c0000014b98353f83f18007120060054990a003728008052a14301d1a26301d1bf233ba9bf031cf8L4;ZBL8;FFa00100f000843991a20100f042e039918102805253b20094a20100f042a015", - "91a50100f0a5e03591e1230091e0031f2ae3031faaa5b20094a30100f063203591BL8;FFa10200902120099102028052a3020090633c1691c4028052b8000014e05306f9e0833291a10200902120099102028052a302009063741791a4028052af000014L8;FFe85703f9e8431591e1032a91e85b03f948f", - "dfff008213b91e85f03f948008052e85b05f9e800009008613b91e85f05f9e84705f9e8000090084d2391e85305f9BBBBBL4;FF290080928822003928008052890200f98092803c8192813c68420039f44f49a9f65748a9f85f47a9fa6746a9fc6f45a9fd7b44a9e923436dff830291c0035fd6L4;FF2000", - "8052e1031faaba020094c00c00375ac300f139c3009101fcff54f6e742a91a058052f71f40f9fb1340f9d582009104000014940600f1b5c2009180010054L8;FF800100543f0400b140010054810000b4601a40f92200805231020194612240f9810000b4602640f9220080522c020194740240f99f0600b", - "1e002005473d640a9BL8;FF21802991240300d084402091e323009182008052e80700f973820194fd7b41a9ff830091c0035fd6080040f9e00301aa090140f93f0500b1e0010054ff8300d1L8;FF745e47a9970100b49822009104000014f70600f118630091e000005401835ff881ffffb4000340f92200", - "80522c820094f8ffff17d60000b4c806168be00314aaBBBL4;FFfd7b06a9f73b00f9f65708a9f44f09a9fd830191090c40f9f30308aa3f0500b140020054090442a9e8c30091f4c30091e00309aaa19c0094e9c34039e8e74039L4;FB0900000000000000807649000000000087764900000000000000000", - "000000000000000000000000000000000000000008d764900000000009676490000000000L8;FFe10fc23d2841082aea6300f9ea435f39e00b18ade213c23d699145b8ea6300b9eaa35f39e417c23d3b8108aae18b14ade11bc23deccb43f9e97344f96b1147f8BL8;FFfd030091f30301aa210840f9f403", - "00aa680240f91f0101eb40040054680640f92a040091e00314aa490280526a0a00f909692138af050094e10313aad4fbff97L8;FF61000054e0e300914979fe97080d8052e92340f90827089b29008052097d02a9090180521a7100a91c0700911a7d01a91f2503a91f2100f92003c03d0081843cBBBBL4;", - "FF1f10003141d20054f9ffff1758e20194f70300aa1f0400b141fdff54e04305918100805253e2019420d10035e85341b9e8bb00b957ffdfc8d70200b4ff0600b1L4;FB5400000000000000730000000500000042ea4800000000005400000000000000790000000500000042ea480000000000540000000", - "00000007f00000005000000L8;FFe8d743f9ff0600b1e0df813de8c303f920160054e8430f9101830091027080520081009136e20094e0d3c23de1dfc13de9670b91e8c343f9f89b45f9f99f45f9BL8;FF8b000054600640f92200805234620194610e40f9140080927f3200b9740200f93f0400f17f3a00", - "b98b000054601240f9220080522a620194740e00f9f44f41a9L8;FFe10313aa54692838080500911f0048f1680a00f9e3fdff540b7c0e533f0108eb7361193220010054536928380cfc5cd308050091290040f9280800f90c0200b5BBBL4;FFe82340f91f0101eb40080054e82740f9090380522a040091e", - "003142a09692138e1030191ea2b00f93e8eff97e0e344a9e12340f93f0018eb2903005422008052L4;FFe04040795ac30291002c46d3407b6078063c7cd3e40840f9207c4093c30003cbc81000d184400091631000d1421c001269fc44d30010069b0800088b06d05f38L8;FF21cc1491a40100d084c0219", - "1e323009182008052e80700f973a20094fd7b41a9ff830091c0035fd6810100f021bc14918200805268a20014080040f9e00301aaBL8;FFc0035fd6090440f98a0200b04ae10c911f7d01a90a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6e8230091090000f029911f91a20f00f9800200b0B", - "L4;FFfd7bbea9f30b00f9fd030091010440f9f30300aa810000b4600240f9220080522f220094610e40f9c10000b4600a40f922008052f30b40f9fd7bc2a828220014L3;ZBBBBBBBBBL4;FF0811c0da560f488be80b40f9091b16cb000540a9220101d1e31700940800148a206b68fc00a8200e0a00669e4", - "a0300b44901c0da2911c0da080d498b0801148aL4;FF22008052361c0094ca018052e9031f2ae80741b2cb0000906ba12391ec018052f50316aaf6030a2a880200f92800805296260129952a01a98b3202a968220039L8;FFf44f42a9fd7b41a9ffc30091341c0114f44f42a9fd7b41a9ffc30091c0035fd", - "68002009000601b91301c019480020090004012918302009063c0119184020090BBL4;FF6f02001435008052e803082a09028052290108cb7f0209ebe3000054eab344b96b02088b6b0500d1ea032a2a5f114beb634d00547f0209ebf4cf00a96a32899aL4;FFcbffff1741d03bd5258055b8018c40b9217", - "801123f00056be00400540430029180fc5f888000003585fc0088a0ffff351f000014bf3b03d5a500023218000014L8;FFfd030091080040f91f0500b1000b0054083040b9e80b0034080140b20811c0da081540d2080d088b0825019108fd46d308050091090840f9290b00b42a0140b2BBBL4;FFe8a74f", - "29097f003908830039e8a74e2909870039088b0039e8a74d29098f003908930039e8a74c2909970039089b0039e8a74b29099f003908a30039e8a74a29L4;FB700f4900000000000a0000000000000014747970652e676f6f676c65617069732e636f6d2fc0012ec0002f636172676f2d726567697374727", - "92f696e6465782eL8;FFf9fb42a9ed7300f9e72f44a9e8174da9f60310aaed0304aae40301aae1030eaaee031baaf00311aaf70306aafb6b4aa9e61f40f9e9474ca9ec9f00f9ec0312aaBL8;FFfc0300aa01048052081002f8e8074091e20314aa000400ade00200f000c0019108c1359103048052e4031c", - "aa250580520604805225b30094e2bf4ef9e3c34ef9L8;FF20000094770a40f9680240f9080117cbbf0208eb89f5ff54e00313aae10317aae20315aa17000094770a40f9a6ffff17e00313aa2200805212000094610a40f9BBBBL4;FF308e009480820091e1030791022a8052f63700f93afc0194a00642a9", - "e2c3009182f7ff97a80a40f9081400b41cfc79d3e1e7076feb031faaba6e40a9e9031faaL4;ZFL8;FFe8a70039e91300f9e083009125f2ff97e10300aae00301aaf44f49a9f93340f9f65748a9f85f47a9fd7b45a9ff830291c0035fd63700805218038052a80640f9BL8;FFa52300d1e00308aa02038052", - "887c0194fd7b42a9ffc30091c0035fd6a7550014fd7bbea9f30b00f9fd030091010040f9f30300aa3f0400f18b000054600640f9L8;FF708fff97954e40f9550300b4e11740f9e80f40f9964a40f91f0101eba0390054e81340f9490380522a040091e00315aaea1700f909692138e1630091757cff97BBB", - "L4;FF60030054e0630091e10700f923a5ff97ff0600b1fa0f00f9e0030054e06300911ea5ff979f0600b1fa0f00f920080054e063009119a5ff97e8630091e00316aaL4;FB0800000000000000401648000000000080f347000000000010000000000000000800000000000000181748000000000080f347", - "00000000001000000000000000L8;FF080200d008b140f91f0500f1c902005448008052e901009029313291e82707a9e801009008993291ea0d8052ff2704a9c90100d029c10491e82b09a90a0b8052BL8;FF00c00791393c0194a00200f000e01791363c0194a00200f000802491333c0194ff8300d1fd7", - "b01a9fd430091e80301aae00700f9a10200f021602591a40200f0L8;FF68ae42b90801003660a24aa961b242b9081540f900013fd6606601f9616a01f93dffff1760a248a962820391613e40f9081140f900013fd6606601f9616a01f9BBBBBL4;FF1f070071680a00f961050054881641b9080140b20811", - "c0da081540d2080d088b0825019108fd46d308050091978640f9970400b4e90240b22911c0da291540d2L4;FFfa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191970840f9f30300aaf70300b4940440f9880240391f2100f1a1030054985040b9f60302aae30700a9f50304aaL8;FFe83740b9aa058052e1", - "630091e00313aa82048052e90f00f9e92f4429a8831fb8ea830039e91302b8e92b40b9eb6302b8ebc342f8ea970039eaab0039e9b302b8BL8;FFf50000b46002148be10308aae20315aa3b8c0194e10318aae90314aae80740f93501158bf50f00f9090115cb285041a99f0209eb48060054d40000b46002", - "158bL8;FF898b0094dfffff17284d1c9b090940f93f011beb29010054080540f9f5031f2a13797b78767e0853e87740f99f0208eb40fdff54ebffff17f80700f9248c0094BBBL4;FF88035df87f0308eb2101005481835cf8e00318aae2031baa47cc01948000003588835d385f03086b40040054e1e7076", - "fe92f42a9ee3741a9280700d1ef0740f9L4;FBeea3e5b3f883f39321732a6337533c430d3306231b13100379f372e36fd364c355b35ea343934883d885d395cea5c5b5f4c5ffd5e2e5e9f580058b1596259d35L8;FF6383c13ce077813d6083c93ce17b813d6183c03ce083813d6083c23ce15f813d6183c", - "43cf4bb42f9e27f813d6283c33ce067813d6083c53c9f0600b1e26b813dBL8;FFe10740f961cdffb4e01740f91a000014e90310916a0100f04ab13991c00200d0009c2c9108210091e1c30e91e9db01f9eadf01f9594c0194c80200f008190e91L8;FF281040b9000040f96800c8376800d037654c001479", - "4c0014794c0014000040f9f028ff17000040f9c8c7fe17000040f957bafe17082440a9e20301aae00308aaBBBBL4;FFf30308aa32ec0194000480522100805230ec0194600100b4800640ad08048052751a00b9680200a9000400ad680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd6L4;FB4572726f7200", - "0000000000000000000008000000000000000800000000000000307d4200000000004170706c69636174696f6e43616c6c6261636b4572726f72L8;FFe20314aa2300805224008052e5020094760a40f9680240f9080116cb9f0208eb69f7ff54e00313aae10316aae20314aa2300805224008052da02009", - "4760a40f9BL8;FF68d200a9690200f911000014080040395b0080d2f50300aa1b00f0f21fc1007182000054087d0453690b0091050000141ffd0071c9010054087d0453690f0091L8;FF02048052e3031caae4031baaa0073aadf55b02a9fa2700a960c2fe97fb7740f9e082c03ce182c13ce282c23c7f07", - "00b1e08705ade237803d000e0054e082c33cBBBL4;FFe10340ada28f3bade40b42ada1833aad610200ada48b3cada2837bad620202ada1837cad610201ad7f6200b9f44f5ca9fc575ba9fd7b5aa9ff430791c0035fd6L4;FFb8264078c80120376800283688120b8b0b1140798812188be1230091e91b00b", - "9ea3b0079002140a9eb3f0079f3eb00a900013fd600f70736290000148a120a8bL8;FF401900b4fa0300aa31ac009440008052410080522fac0094801800b4fb0300aa2bac0094400080524100805229ac0094c01700b4e9ab42a928008052e8531ea9BL8;FFa88355f8bb0353f8b5df73a920b7803de833", - "04f9e8f304f94003803dffa71139e89740f91f0500b160000054e02b40f9a3e2ff97f4db51a9960100b498220091L8;FF1f090071e1060054090180d268df78920900f0f23a0140b2370000141a048052ba031ef8e8030291e13f40f9e083269108a10c91000540ade807409108011891BBBBBBL4;FFfdc3", - "00911f1c007280010054c80080d2e0230039ff2700390800f0f2e0030091e80300f91f0a0194f44f44a9fd7b43a9ff430191c0035fd6530040f9680640f9L4;FF022880523e140094e8270491e1431391e00314aa00f1cf3ce80f41f9022b8052e087813de81303f93514009431070014e9830c91e0d3c03", - "d2181c03c298141f8L8;FF600b00541fb60071c10c00541f0100718801881a3f1100f103fdff543f0500b1e1fcff5496000014cf0540391f820371f115001203020054cf0940391fc20371BBL4;FF6f6c0094fa0740f9f60301aaf80300aa5b0315cb3f001beb48170054561100b48002158be10318aae20", - "316aa34940194b502168be00318aae10316aa22008052L4;ZBL8;FFdf0600b18002005474de45a9970100b49822009104000014f70600f118630091e000005401835ff881ffffb4000340f9220080522a940094f8ffff17d60000b4BBBL4;FF8ed50094e80300aae00301aaa8fc0736c5000014a13e0054f", - "5031faa92feff17c13d0054bc0357f8a80356f89f0308eba0010054a88356f8a083dd3cf5031faaL4;FB9b0000001b0000003b1a4900000000004e00000000000000b9040000170000003b1a4900000000004e0000000000000057070000050000003b1a490000000000L8;FFf2031aaa08e30d91f6f300f", - "9000540ad08cf41f9f8c341a9ea0312aaedcb40a9e30317aae4031baaec0b45a9e95f4ca9fb0314aafadb4aa9e10315aae72f44a9BL8;FFfa031faaf69f49f9f407409194820991df0600b18022005480620391f81b0094080040b20811c0da081540d2080d088b0825019109fd46d30800098b08050091L", - "8;FFe1fb44f9810000b4e0ff44f9220080523354009468b240f9280700b4e1f342f9e2f742f9e8833291e0db42f9e44b40f9630302919cb5fe97e8833291fc5346f9BBBBL4;FFfd4303915c0080d2f30308aa08008092a94301d11c00f0f2a0073ba9e82b00f9e83700f9a9031cf8410e00b4f80301aaf90", - "300aa37210091f5430191ba4301d1L4;FB20656d7074790000dc224000000000001800000000000000080000000000000078c542000000000054c44200000000002c0943000000000063616e20616c7761L8;FF898246f83f0500b1a10000549fe606a99ffe07a999fe08a99f9a00b981a20191e003082ae", - "20313aadcf7ff97001200b520fcffb4d6ffff17890240f93f0500b1BL8;FF73620091e000005461825ff881ffffb4600240f92200805231740194f8ffff17f44f41a9fd7bc2a8c0035fd6ff4305d1fd7b0fa9fc6f10a9fa6711a9f85f12a9L8;FF59038052361108cb04000014d6c201f118c30191200400", - "54e1d342f9e8cb42f91f0101eb00030054e8cf42f929040091e00318aa19692138e9d302f903280094BBBL4;FFb30000b4880640f9e20313aa0001158b3bb40194a802138b880a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00314aaf60301aae10315aae20313aa23008052L4;ZDL8;FFff030391c003", - "5fd6f3031f2af60300f99cffff17ff8304d1fd7b0ca9fc6f0da9fa670ea9f85f0fa9f65710a9f44f11a9fd030391190c40f9892489d24992a4f2BL8;FFe133c13de0031791e237c13de3032d91e4833291a10200b021a4069102018052e02b833de12f833de233833db9f4ff97f3f742f9e8ef42f97f0208", - "eb61000054L8;FFa02302d183f4ff97c02d003728fc60d3481300b5200840921f1800f182130054217c0353411400343f040071200100543f08007141fdff54a1a20491a22302d1BBBBBL4;FFffff03a94a8cccf2ff1b00f9aa8ceef229000acaa11300d1e82701a9480040b982008052a8c31fb8cc89009", - "4e82743a9ea2f41a928e108aae93340a90b010bcaL4;FF1f01096b01480054810a41a9e0e306919b6a42a982f7ff97f9df40f93f0700b120470054f55b5ca9e0e30691fceb40f9e1031aaa22008052230080527cf9ff97L8;FFfd7bbda9f65701a9f44f02a9fd03009114d440a9f30300aa950100b496220", - "09104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f922008052BL8;FF200440a9e82700a9e8030091090000d029011f912000001408200091200440a9e92300910a0000d04a011f91e8a700a9020300f042a43d91ea0f00f9e3430091L8;FF180100791b050079d6ffff179f0700f161", - "000054e9031faa0c000014e9031faaea031caa4bfd41d36c01098b4a010bcb8df57ed30d696d78bf01186b29818c9aBBBL4;FFe87b45b908230037e8c742f96a0340f9490108eb632700548a0340f9f4c342f94801088b880300f9690300f988fe60d3881800b5800a40921f1800f182180054L4;FB49010", - "0000a0000003b6349000000000038000000000000004a0100000a0000003b63490000000000380000000000000050010000090000006d697373696e6720L8;FFf4e31539e8bb02f9e8f34ff82091883ce8c702f900350054e8435039f7430d91e91742f9e012cc3ce0831d91e1e31c91e8031d39e81342f9", - "f69f03f9f6831d91BL8;FF14000014c80080d20800f0f2080500d1e80700f9e0230091223a0094e10300aae10700f9c10200b021200a91c30200b063e40a91e0230091a200805224018052L8;FFe10240adfab30a39e10302ade10ac03de10b03ad5a5efe97e99341b93f09007121080054e8cf40f9e9a34", - "1b9ec030b91eaa741b9e86301f9e9cb02b9eacf02b9BBBBL4;FF00030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb431101541803008bf9feffb50f0000141f0400b1a1100154L4;FB206865616465722073697a6500000000eee64800000000005600000", - "0000000003f000000270000006d697373696e672073656e64657220636861696e00000000L8;FFdf0e00b1e083803cf7079f1a9f0600b1e80f00f9c0010054f82b40b9e00740f91f070071a90100547f020039940000b4e10314aa2200805229e40094f41b40f9BL8;FFa8931cf808fd78d3b8835cf8ed33", - "0029eb5b0079e90f00f9e80700f9ea8300392b640194e00314aa2100805229640194c00500b4e10315aae20314aaf60300aaL8;FF3764009481025ef8810000b480825ef82200805232640094810240f9810000b4800640f9220080522d640094810e40f9a1fdffb4801240f92200805228640094BBBL4;F", - "F37a401949f0600f16b020054e00315aae10314aa2200805231a401940e0000140040c23c0140c33c290040f90240c43c085440b9600601ad3f0500b10040c03cL4;FF818201a97f7e00a9e00313aaf35341a9fd7bc5a8c0035fd6352440f9000700d1bf0200eae0179f1a40fcff3580021091a206409101", - "1440f9022400f9022040f9L8;FFb40100f094620a91a101009021401591e0230091a32300d102018052e40314aab3831ff87ba4009468120091a101009021201691a32300d182018052e40314aaBL8;FF0010c03ce82702a908004039200440a9e9430091e8330039280000d008413191820200b04224399", - "1e3830091e007803de92303a947240194fd7b44a9ff430191L8;FFf44f44a9f65743a9f85f42a9fa6741a9fd7bc5a8c0035fd6e00316aa3d190094d80640f9edffff1720008052e10313aa38240094ff8301d1fd7b04a9f32b00f9BBBBBBBL4;FFc10240f9810000b4c00640f92200805233180294c10e40", - "f9a1fdffb4c01240f9220080522e180294e9ffff17880240f9280100b4090d8052e00313aa017d099bL4;FFe12b40f9e82340f9e81300f950ffff17e0a30091e10316aae2031caa230080522400805213f9ff97e85b43a9ddffff17a00000f000802a914018009420008052L8;FFf35b00a960f5ff976002", - "00f00040199139180194600200f000a0199136180194600200f00040219130180194ff8301d1fd7b01a9f91300f9f85f03a9f65704a9BBL4;FFf44f5ba9fc575aa9fd7b59a9ff030791c0035fd6fd7bbaa9fc0b00f9fa6702a9f85f03a9f65704a9f44f05a9fd030091ffc30ad1f30308aa610300b408000", - "18bL4;ZFL8;FFab935538a97315384901084aaaa35538a98315386901084aabb35538a99315384901084aaac35538a9a315386901084aabd35538a9b315384901084aaae35538BBBL4;FFc082c53ca0039e3cc082c03ca003993cc082c13ca0039a3c33d80194ff0600b1752e00f960050054a0877dadf71", - "f00f9e00703ada2837ead0083853ca1837cadL4;FB756e6b65642f73656e645f63742e7273002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d6235386437663536653336L8;FFe1d348a9610a0014e9030eaafcbb00f9fc0305aafa0302aae4e300f9e50314aaf", - "40310aae29349a9f80309aaf0a74ba928a00791fbbb4ca9e03340f90001c03dBL8;FFe8cf42f9090180522a04009109692138e1431691ead302f9dd110094e06349f9800100b4e1d342f9e8cb42f91f0101ebe0c50054e8cf42f9090280522a040091L8;FFa22302d15bf4ff9740fcffb46f010014e02e00", - "b5a02302d134f5ff97a00d003681fbffb47a01001401e30191a22302d150f4ff97e0faffb449010014e8eb45f9BBBBL4;FF200500b408c30091e10315aa161000b9085c00a928040090080135911f500039602201a9090d40f9e803009120013fd6e80340f91f0d00b100fdff54755a41a9L4;FB203cc001", - "3e002d6d697373696e672073656e646572206b657920737461746520666f7220646973747269627574696f6e20494420c0001d70726f746f636f6c20L8;FF08050091d5fcff17880080d20800f0f208110091d1fcff17410200b021401f91430200b0635c1f91e0c30391e200805264018052f57b00f95ce", - "dff97e17b40f9BL8;FFa0031cf8010300b021182e91030300b063601e9118000014a0031cf8010300b021182e91030300b063302a91a00301d162028052240280522d000014a0031cf8L8;FFe19f843de2a3843d3178009400788052210080522f780094207201b4e10319aa02788052fb0300aa35780094", - "e09bc43de19fc43de0031caae2a3c43de8c34ef9BBBL4;FFf7ffff17e84740f968a5ffb4080d088be00313aa0201805201f17dd330b8019425fdff17e083ca3ce183cb3ce283c83cea6740f9685e05a9600601ade083c93cL4;ZBL8;FF9f2900f14d018052eb031faae9031faaea031faa8c318d9a4d0400", - "91ae696a384a0500915f010cebcf194092ce1d0013ef21cb9ae90109aa220800546b1d0091BL8;FFfd030091081840b9c8050034080140b20811c0da081540d2080d088b0825019108fd46d308050091091c40b909050034290140b22911c0da291540d2290d098bL8;FFf86340f98a2d02a9e8eb41f9ea6", - "34f39800500ad280100f96a5e0f39bc0000b4e00316aae1031caa220080522c380094f74f40f9b80000b4e05b40f9e10318aaBBBBBL4;FFf85f4ca9fd7b4aa9ffc30391c0035fd69404005136008052770040f9e20640f95f0015eb290d0054e10240f9290080398900f8b7280400914a0400d115000014L", - "4;FFe20314aa230080522400805219e9ff97f60f40f9e8ffff17ff4301d1fd7b02a9f51b00f9f44f04a9fd830091f403012a3f240071f30300aaa9030054a8999952L8;FF400200f000403e91e92b00a96902009029210591e1030091e92b01a95f080194fd7b42a9ffc30091c0035fd6000040fd2801805", - "20820601e00119f9ac0035fd6BL8;FF37880194280700d11f0d00b1a8000054e03340f9e10319aa2200805230880194c80600d11f0d00b1a8edff54e02f40f9e10316aa220080522988019468ffff17L8;FFe93740f9eafbff179f8200f121080054e1834ea9e81f40f91b410079000440ad000500ad6100", - "00b4220080522c880094088b41b908050011088b01b9ff431191BBBL4;FFf30308aafb030691fc03029109008092a80301d11900f0f2600713a9898300f9898f00f9ffcb01b9ffd301b9899b00f9688f00f9810f00b417210091b80301d1L4;FB115449000000000025544900000000000000d1009300a70", - "08a00e400eb00bd000a029100f4010000ef015601b30120010b021b02ce0146023b013602bb000000L8;FFf503102ae27744f9eb6740f9f02340f9e13340f9e3b7803de20713adec2b4ba9e8a301f9a8008052e0a3803ddb020014f60301aa9f0700b1f70318aa60020054BL8;FF017d099b02018052f44f", - "42a9f65741a9fd7bc3a832480114f44f42a9f65741a9fd7bc3a8c0035fd6210400b4fd7bbea9f44f01a9fd030091f30301aa14e00091L8;FF090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab22030054091440f9090100b42a0140b24a11c0da4a1540d", - "2BBBBL4;FF08a101915fa001b121ffff54530080527f0a0071c1320054680400b008b140f91f0d00f123040054e8030291a90000d029312491e8270aa9e8f30191c90300f0L4;FB08000000000000000800000000000000804c4200000000000000000000000000080000000000000008000000000000007", - "04d4200000000000000000000000000L8;FF3c008052f7cb00f9e8f300f9a90311f8a0c303d1eee7ff97f40301aac046003788fe60d3a82e00b5800a40921f1800f1a22e0054817e0353c12e00343f0c0071BL8;FF000280520101805232680194000100b40103009021202b91130000f91f200039f30b40", - "f9fd7bc2a8c0035fd6000180520102805242680194fd7bbea9f30b00f9L8;FFe8a716a978caff34e11740f921caffb4e00b40f922008052316800944dfeff17fb0300aaf80b00b99a0400b4fb0300f927680094e0031aaa210080523b008052BBBL4;FFb4035bf8880216cbbf0208eb49dcff54a04301d1e", - "10316aae20315aa2300805224008052429bff97b6035cf8b4035bf8d9feff17a04301d1e10314aa22008052L4;FFf403012af51300f942cc218bf50300aa40200091610240f961ffff97e20313aae103142ae00315aa0300009063d03c91f35341a9f00303aaf51340f9fd7bc3a8L8;FFe8af40f90a04805", - "26182c63ce99b40f9bcc303d1e083853cf50340f9e83700f9a85701d1e183843ce18f48ade08b42adbf8200f1e92300f909088052b8328a9aBL8;FFe10359ada1833bade2035aada2833cad3d28019400e4006fe00319ade0031aade0031bade0e3803d48d776d3e0075badea03162a29dbda93a14302d10", - "80d0aaaL8;FF1f0500b180000054e8030291000103911ee7ff97f45753a9f50200b49622009109000014e8e7563908d40736e00314aa16e7ff979dfeff17b50600f1d6620091BBBBBBL4;FF0005803de083c23c0009803d12ffff1780c2009146470094e9ffff17e00313aa86110194e80300aae00301aaa", - "8da0736adfeff17e00313aa80110194f70301aaL4;FFa04700d167c2ff97e04f00b9a04700d164c2ff97e04b00b9a04700d161c2ff97e04700b9a04700d15ec2ff97e04300b9a04700d15bc2ff97f903002aa04700d1L8;FFc0035fd68804805249008052932200a989420039f44f45a9fd7b44a9ff83019", - "1c0035fd6ff0301d1fd7b03a9fdc30091600200b000e03491e82300919b100194BBL4;FF240080524a83ff97f55b41a903ffff17f40300aae0230091e10316aa0204805223008052240080524183ff97e00314aaf60f40f9f40740f950ffff1720008052L4;ZDL8;FF09200091e8230091200440a9a9031f", - "f8e9ffffb029013791eaa300a9a84300d1e91700f9620100f042180f91e9a301a9e343009147900094fd7b44a9ff430191BBBL4;FFe00318aad0b9ff975a0700f118c3019181ffff54bf0216ebfa0317aab74302d1e2000054f8031aaae00318aac6b9ff97730600f118c3019181ffff54df021cebL4;FB9", - "9b1a49da30cd1a7fd217d479d423f94da7da28c1dbe03560000b714bd6ced05dafccf73a2ccc74918d9b1c272282b2fa4aae8600b70f9ef08d994ca63628cacL8;FF0b255da9e97f00f909f140f908fd40f9ebab05a9e88300f9e8430f9100610091e94b00f936d00094e0233391e1430f91022f8052fa43", - "0f9131d0009448e30591BL8;FFf4630191b3abff97e8c30291e263019184020191e0031aaae10319aa03048052050280528f500194f95b40f93f0700b1a00c0054faa74ba90a630191061f5729L8;FF84203a91e0031baa1f010071e103152ae204a072e813899ae3031f2ae84f04f95f500094e8fb40b9e", - "97b40f93f00086be8279f1a1f0009ebe9a79f1a0901891aBBBBL4;FFe323c03d640b01ad600702ad608707ad648b08ad639709ade112813ce012803ce212833ce412823ce512853ce312843cb80000b4e00319aae10318aa22008052L4;FB1d0200000900000072984800000000003300000000000000220", - "3000020000000536b697070696e6720617263686976652c2063757272656e742073657373696fL8;FF28e6ff97e80300aa210200f021b41991230200f063481491e003009102028052a4008052e80300f909000014e00300f9210200f021b41991230200f0635c1491BL8;FF4d0140b90d040034ad0140b2", - "ad11c0daad1540d2ad0d0d8bad250191adfd46d3ad0500914e815ff80e0100b4cf0140b2ef11c0daef1540d2ef0d0f8bef250191L8;FFc029005400210491c4240094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb68280054400100f000e032912b700094BBB", - "L4;FF48134ab8a9435bb84aa34ab8ab035d38a80311b8a8e35b78493300b8a9835cf8a8c31178e98f00f9a9035cf8a8c31078e82b40f9e93f00f9a9835b38aa8311b8L4;ZBL8;FFe0031caa2200805235b00094bc035cf8f70315aa760a00b4a0835cf8480701d11f0008eba9110054e0031f2ae80316aae", - "90317aaea031caa2b154038080500f1BL8;FF08710391e9ab05f9a902009029410591e8af05f928008052a04700d1e96f06f9e1833291e95706f9890200f0292d2291eaa705f9ea032d91e86b06f9880200f0L8;FF37300094f8ffff17687240f9c80000b40805088be00315aa0201805201f17dd32f3000", - "9420074bad28008052e98343b99c0200f9960a00b980c2803c81c2813cBBBBBL4;FFaeffff172c69eb38ac03f8366d2100d18c014092aa010a8ace3641a928692b382a010a8bcc010ccb4821003928190bcba9050091cc2601a91c011cb815dd3ca9L4;FFe00314aae10315aa32000094a00000b52800805", - "2750600f904000014e00315aae8031faa600600f90a028052e90314aa696a2af8680200f9f44f42a9f50b40f9L8;FFfd7b43a9ff030191c0035fd63f2900f1880000544b01098b6bf1df388b0cf8374b05c0396c1d00128c6119538c01210b810102516b00f8374b0080524c000014BL8;FF240300d084a0", - "0a91e0030091a3630091e2008052b30f00f97e8001947e800194fd7b41a9f31340f9ffc30091c0035fd6000040f9ea040014000040f998100014L8;FFe16300918380ff97807e80b980010034e11740f9e80f40f91f0101ebe08b0054e81340f9090180522a040091ea1700f909692138e16300917680ff9", - "7803240f9BBBL4;FF44c00194ff4307d1fd7b19a9fc5f1aa9f6571ba9f44f1ca9fd430691160c40f908008092080c00f9df0600b1a00a0054f30300aae8230091022a805200210091L4;FB7270715f726174636865745f7374617465436861696e73656e6465725f726174636865745f6b657973656e6465", - "725f726174636865745f6b65795f7072697661L8;FF550f00b432c00094e00315aa21008052390080522fc0009460fdffb4e10318aae20315aaf60300aa35c000947000001436008052e007c13de10bc13de20fc13dBL8;FFa1ffff17e00313aae10317aae20315aa34000094770a40f9680240f9080117c", - "bbf0208eba9f4ff54e00313aae10317aae20315aa2b000094770a40f99fffff17L8;FFe90344a9080009eb630e0054ff0208eb68080054340117ab420e0054f42300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889aBBBBL4;FFf843059199008052e00318aae10319aae", - "2031f2ae0023fd61f0000f1cd000054390300eb639100541803008bf9feffb50f0000141f0400b1c19000544be00194L4;FB18da430000000000180000000000000008000000000000006cf143000000000050f043000000000078f44300000000006120446973706c617920696d706c656dL8;FFe00314a", - "ae8e740f9485602b4e1e740f922008052ff074091ffc30091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a82ae00014e80301aa190340f9BL8;FFe90200b02be13291e10200f021600691c30200f063401991a92300d1e60200f0c6e005912a018052e70200f0e78c0691e00308aa620180520", - "4018052e9af00a9L8;FF7a000014e00700f9210100f021e03491230100f0633c3591e0230091a20080524403805296000014c90080d2e8430039480080520900f0f2e8470039e90700f9BBBL4;FF1f01096b69070054c80300f008b140f9480400b4280100b008413191490300b029710391f92302a94803", - "00f008c11891ea830091a02700d1e82703a9e8730091L4;FFe18b40b2422041fae803005421000090211842b98100003421000090211442b9210300341f4000f1814200d1130280d21320939a2000138b61feff97201400b4L8;FF810100f021e81791a40100d084801591a363009122018052a80f00f97d", - "a0009468a20091810100f0210c1891a40100d084001691a363009162018052a80f00f9BL8;FFa4200194800200b000801791820200b042c01791210280523f200194800200b00060169131200194800200b000c0169131200194fd7bbea9f44f01a9fd030091BL4;FF4a010b8b29010bcb0a2500a9fd7b43", - "a9ff030191c0035fd6e80741b2e0030091e80300f91f16ff97e10300aa20008052fd7b43a9ff030191c0035fd67f21ff97L3;ZB" + "BBBBBBBBBL8;FB67206578636573736976652072656365697665725f636861696e20666f722073657373696f6e20776974682062617365206b657920c00f2c20636861696e2063L8;FF4ba0009420feff9000a42f9122feff9042c030918102805245a0009420008052010480523ca00094ff0303d1fd7b0", + "6a9fb3b00f9fa6708a9f85f09a9f6570aa9BL8;FFfd7bc2a85efeff1761ce40f9810000b460d240f922008052a724019461da40f9810300b460de40f91800001461ce40f9810000b460d240f9220080529e240194L8;FFa3000094e10340a92aa040a9536928380cfc5cd308050091290040f9280800f90c", + "feffb40a7c15533f0108eb53611932200100542a0440f90bfc63d353692838BBL8;FFf85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd620008052010480523e600194ff4301d1fd7b02a9f51b00f9f44f04a9fd830091f40300aa35008052e0030091L8;FF23000014a0031df8a1fdfff021442391a3fdff", + "f063b02391a0c300d142018052440080521a000014a0031df8a1fdfff021442391a3fdfff0636c2391a0c300d1BL8;FFe80300f9e003009111ebff97e10300aae10300f9a1feff9021c81191a3feff9063300d91e0030091c20180524400805296eaff97e00340f960ffff17c80080d2L8;ZDBBBL8;FB6c5", + "f70726f746f636f6c3a3a747269706c655f72617463686574696e76616c696420726563656976657220636861696e206d657373616765206b657973737563L8;FFe16300912692ff97f81740f9e80f40f9080118cbdf0208eb88840054e81340f9e10317aae20316aa0001188ba98400940803168be81700", + "f9803640f9800100b4BL8;FFb4040194e87b41f9e97f41f940030291e1c3089122008052080500b12935899ae87b01f9e97f01f93f000194ffbf0a39f6031caaf50313aac2fe47d3420100b4L8;FFc0035fd6fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30301aaf40300aaf7031faaf84b1432680", + "217eb1f0118eb1631989a7f0217ebf5979f1a69020054BBL8;FF6c8e40f90c0100b48c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c0500914901098b6a010c8b29010a8b2a0140b24a11c0da4a1540d24a0d0a8bL8;FFe10317aae20314aa97020094770a40f9cfffff17a8831ff8a84300d", + "1290000d02911299140fdffb000440691e8a700a9a82300d182fdff9042e02491e1230091L16;FFe85744f9eb5344f9e8d300f9e85b44f9eb230ca9e86744f9eb6344f9e86f00f9e86b44f9e85f00f9e87344f9e85b00f9e87f44f9e8f300f900630054ef0715a9BBBBL8;FB736d61785f6f6f6f5f6b6579", + "7343743141636b6e6f776c6564676564726563656976696e675f656b43743253656e7443743253616d706c656473656e64696e67L8;FF4901084a220080526801084aa9e31838a8f31838e18305adf46b00f941900094e08745ada8035ef87f1e0139e82300f9e86b40f9e083843ce183853ce00742adBL8", + ";FFe1fefff0219c3091e20280523c100114ff8300d1fd7b01a9fd430091e1fefff021603091e4fefff084e02f91e3230091e2018052e80700f92e100194fd7b41a9L8;FF09e10039e92b49290ae5003909e90039e92b48290aed003909f10039e843139151100094e0074091e1431391028c815200401d91", + "a7140094e00b4091e8431391BBL8;FF5e50019420008052e1031baa4250019420008052e10313aa3f500194a0a33ca960ffffd000001f9163ffffd063a0119164ffffd084c02491a2e300d1a1038052L8;FF60fdff9000081391e8d302f988fdfff008c11d91e1031691a30302d1a82738a962008052a827", + "39a988fdfff008812691fbc302f9f5cb02f9a8031af898e4ff97L16;FF09008092690200f9fa031c2a6082803c680e00f9e1b340f93f0400f18b000054e0b740f922008052a3d40094e883059100c100916edcff975ad107369f0600f1BBBL8;FF1d000094610a40f990feff17e00313aa22008052230080", + "522400805216000094610a40f997feff17e00313aae10317aae20315aa23008052240080520e000094L8;FFe0660054e8cf42f9090180522a04009109692138e1431691ead302f96f0d0094df0600b18000005480020391e1431691951000941f0700b1e080ff5480220291BL8;FFf65741a9fd7bc3a8abf", + "40014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f30b00f9fd030091012440f9f30300aa3f0400b140010054810000b4602a40f9L8;FFa268633882000034000080d21f000039007d20d44600805225008052c620c91a27000090c6040051e7201d9102008012a520d41a02d01f381fe01f78641e40", + "b9BBL8;FFf88b92b9380100340a0340b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a05009102000014ea031faaf67b52b9df06007181010054eb7f52b9ec8352b9L8;FF63001f9164fdff9084c00f91e2832491c1058052e89304f9e99704f946300094e84745f9e94b45f960fdff9000f40e9163", + "fdff9063001f9164fdff9084e01091L16;FFacb40094202700b4e10318aae20315aaf60300aaafb4009450010014560080d2e083029181220091026e80521600f0f2f5830291a7b4009488620691806ec03dBBBBBL8;FB696e76616c69642073656e64657220636861696e2072617463686574206b657967", + "e6096a85ae67bb72f36e3c3af54fa57f520e518c68059babd9831f19cde05bL8;FFa1b640f9810000b4a0ba40f922008052a99c0094680240f928f3ffb5ff030791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd600feffd0BL8;FF680640f92a040091e00314aa490180526a0a00f", + "90969213828070094e10313aa5dfaff97803e40f9800100b4610a40f9680240f91f0101eb200d0054680640f9L8;FF615801b4200b40f922008052ff0b4091ffc32791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8a21c0014e86f42f9fb031aaafa0315aaf50308aaBBL8;FF400540ad200", + "500ade8ff0139e90740f9f503082a020315cb386540a93c0302eba3070054350200340803028be10318aae80300f9e80301910001158ba55c0194L8;FF00230191fafafe977affff17e81f46f91f0500b1e1000054ff1f06f9f62306f9ff2706f9ff530cb9ff2f06f9ff630cb91f0800f1a12b0054a02302", + "d1d6f4ff97L16;FF27eaff97770a40f9680240f9080117cbbf0208eb280b0054680640f9e10316aae20315aa0001178baadc0094e802158b680a00f9952240f9550300b4610a40f9BBBL8;FFf44f02a9fd03009113d840a9f40300aa360300b475c2009106000014e00315aa23000094d60600f1b5a20191", + "40020054a1025df8810000b4a0825df822008052L8;FFe82b0af9e8330af988230f91f8230af9fb2f0af9f6370af90001803de91f0bf9f6230bf9a47c0094f43349f9e04306918123009102738052a67c0094e083c53dBL8;FF090880520811c0da280108cbe90080521f1d00f10831899a2900805236090", + "8aae80313aa954e00a9885a01a9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6L8;FF0000148be20315aab2fcff97e80314aa0801158be80f00f9e083c03ce80f40f96002803d680a00f9f44f44a9f65743a9fd7b42a9ff430191c0035fd6e0230091BBL8;FF4a01084a6b01084aaa131838aa4358382", + "901084aab231838ab535838a9331838a96358384a01084a6b01084aaa431838aa7358382901084aab531838ab835838L8;FF280080526a7202f969c2133968c21239b60000b4e04340f9e10316aa22008052a53c0094fa5f49a9b80000b4e05b40f9e10318aa220080529f3c0094fb5f40f9L16;FFf50309", + "aaacbc0094e90315aaf70000b4e00318aae10317aa22008052f50309aaa5bc0094e90315aab40000b4e00309aae10314aa220080529fbc0094fc7340f9BBBBL8;FB69b4dd02e71be172d18f0f826bea9651aaf59e9ae0bab3571a5b081a4ed735daf8a2296006a897900b70265932f53743a28ce620feb61", + "1bd363f000081ebda9dL8;FFe8a71329a9461253a8421153e8a712297f00001428000013290402532a0803532b0c0453e0e340b9e2db40b9e3d340b9f79740b92c100553e4cb40b93f040031BL8;FFe02bc33de95b04f9e9ffffd029012391e8c303f9e8ffffd008312291e85f04f9e8c31691eafeffb04a", + "810c91e86304f9e8ffffb008610491e96f04f9e9c32291L8;FFe80316aa8902158be90f00f9e083c03ce90f40f90001803d090900f9f44f45a9f65744a9f85f43a9fd7b42a9ff830191c0035fd633008052285440a9f4cf00a9BBL8;FF64480194a1835df8810000b4a0035ef822008052a84c0194760a40", + "f9680240f9df0208eb61000054e00313aa42470194680640f909038052400fc03dc822099bL8;FF0b050039090900394a091b320a010039080000142c7c12532a440c330b090039090d00398b6d1c320a0500390b010039a802148be0031f2a680a00f9f44f42a9L16;FFab0b0014082340391f090071808", + "700541f0d0071a19e0054f7030caa360080523904001408234039f87700f91f150071e1220054c80100b0e00309aa081140f9BBBL8;FFe88300a9087340f922008052f4030baae00308aaa86c0194e88340a9eb0314aa0a000014f9031faaf6031faafa031faaeb031faafb031faaf5031faa08018052L8;", + "FF0080c23c1a0040f901a00191e00a803d0080c33ce00e803d0080c43ce012803d0080c53ce016803d0080c03ce002803d0080c13ce006803d4b6d0094810700d1BL8;FFf50300aaf4ab00f9e08708ade28342ade28309ade18340ade18307ad402300b4e0c3039193f7ff97f6000014e1430091e20313aa", + "f70b00f9f73300f93f070094L8;FF630001cb8100018b610e00a9e07a80b9e10313aae20318aa480880d2010000d408f6ff97e10300aadf0200ebc0fbff54d60200cbe0fcffb7630640f91f0003ebBBL8;FFba100094e1d342f94efeff17e0431691e1031aaae20318aab4100094fad342f9e8cb42f90801", + "1acb1f0308ebc9000054e0431691e1031aaae20318aaab100094L8;FF880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd620008052800600f909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6fd7bbda9L16;FFe0031caa22008052abac00945f1f0072f4c30791c00a0054e", + "0031baa0104805222008052a4ac0094a1835cf8e00f40f9610000b4220080529fac0094e00318aaBBBBBBL8;FB2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f656e636f64L8;FFbdccff97df0a00f18", + "30b00548806168b54034079f303002a1afefff05ac30a91d60600d1150900d10800001427070094a0020079a8ee5f78d60600f10801174aBL8;FFc00200543f14007141040054c1220191e20313aaf1fcff97600300b4e00000143f040071400200543f08007121030054e1230091e20313aae8fcff97400", + "200b4L8;FFff4303d1fd7b0aa9f6570ba9f44f0ca9fd83029109604039a9050037150440a9f30300aae0230091f40308aabe120094600a40f9e80301913fc2fe97f62340f9BBL8;FFe0e315912b120094e87b45b9e8110037e8c742f96a0740f9490108eb031800546a0340f9e0c342f94801088b682700a", + "908fc60d3a80600b5020840925f1800f1L8;FFb4573ea9b6031ff8b7831fb86a5c00941f04003180080054f40f40f9760080520800001400010039b402148ba08300d1f40f00f9605c00941f04003140070054L16;FF81fefff021d0149183fefff063901391e003009122028052440080529be6ff97e103", + "40f978ffff17ffc301d1fd7b03a9f72300f9f65705a9f44f06a9fdc30091BBBL8;FB1e1e1e1f0f0f140a0a1f0f07190c06150a051208041f0f071c0e060000000000000117021d1813031e1b190b1408040d1f161c121a0a070c1511090610050f0eL8;FFe163009117a2ff9731fcff17e06300912200805", + "2230080522400805284a4ff97e11740f99bfbff17e06300912200805223008052240080527da4ff97e11740f9BL8;FF280117eb6a0200f942f5ff54c0fefff0004001915cfc009420008052615a40a9f58300a9ff0f00f9df0215eb89f7ff54e0230091f50301aae1031faae20316aaL8;FF1c0b00f90900", + "0014f60315aa08008092080300f9b60000b4e00314aae10316aa22008052a4000094e003132a941300940300001408008092080300f9ff0b4091BBL8;FF5e3c019420008052e10313aa423c019400c48052c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0308d1f3030", + "8aa410100b4L8;FFa805003460fdfff000801a915f3c009460ce41f961d241f946000014e8830a9102000014e8430b91000540ad082140b9614241f9e88303b9000700ad217001b4L16;FFf65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd688018052e92b5ba9e87300f9ebcf40f9e77740f9e8", + "2f40f9f0cf00f9fabb40f9ef8f40f9ec1f40f9BBBBL8;FB9c2ac0c444ad2180d087cc97cc842e81dd8cbdef99c96998eaccb19f4b9fac970b00bfd78bf5c716bfc7d674adae2be49ebf5e8bd71c0000efa3893d51951778L8;FF08feffd008f10991e00301aae10308aa62028052fd7b44a9ff430191388c", + "001408feffd0082d0891e00301aae10308aae2028052fd7b44a9ff430191308c0014BL8;FFfc9740f9e89b40f91a008092fafb02f9e87300b409038052fb031faaf7feffd0f79600911471099bf8032d913600805210000014e8f342f909068052e02bc33dL8;FF810000b4e00314aa22008052aa1000942", + "8008092680200f9afffff1700fdfff000a03c91550c009420008052e10319aa380c009420008052e1031caa360c0094BBL8;FF89620091e8031aaa880100b42a0940f929610091086100d1550115ab63ffff5460ffff9000803a9162ffff9042603b91a10680523e4c01949509f8b6f9031faaL8;FF2a014", + "0b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9030054200108ab22010054fd7bc1a8c0035fd6e8031faa091c40f9L16;FFe9eb03f9e1031d91e07f04f9e0430f91e20319aae8a703f9e8fb40f9eea303f9e8ab03f9e8e740f9fcb703f9e8af03f9e8bf40f9fecb03f", + "9e8b303f9e8ff40f9BBBL8;FF63840791c9000014c90080d248008052e24300390900f0f2e8470039e90700f9ba000014e80741b249000014932e40f9892640f9e80314aa7f0209eb802a0054L8;FF080080926006803d682600a93c000014080100d0081140f9480300b4e84301914900009029710891a8", + "2734a928008052c9fdffd029a11991aa0303d1a04700d1BL8;FFc80080d20800f0f2080500d1b0ffff17c80080d20800f0f208090091acffff17c80080d2e0230039e00300910800f0f2ff270039e80300f905f7ff97e80300aaL8;FFdf1e00b9010c40b942cc749242187bb2150080d2330400111700805", + "2130c00b9df1a00b9c21200f9c5ffff1700231f9128030094e4ffff1741400d9142c00d91BBL8;FF080040b20811c0da081540d2080d088b0825019108fd46d30900088b390500913f0308ebc9130054f87749f91f0700b1c0130054802202915a1c0094080040b2L8;FF815c00b5e7020014a8035df8080", + "11acb1f0308eb28780054180500b4a8835df8e10319aae20318aa00011a8ba93000945a03188be00319aae10318aa22008052L16;FF000400ad810000b4601240f922008052a9b0009408048052e00316aa010880522200805268de01a9681600f9a2b00094e10f40f9810000b4e00315aa22008052BBBBB", + "L8;FB000000000000000008000000000000000800000000000000fc30420000000000a1104000000000004d00000000000000e802000005000000a110400000000000L8;FF081540d2080d088b0825019108fd46d308050091092440f93f0500b1400400540a2c40f9093840f90a0100b44b0140b26b11c0", + "da6b1540d26b0d0b8b6b250191BL8;FF4a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8bL8;FFfb0301aa280080523a1400b4ad180094e0031aaa21008052a6180094f8db40f9c0dd00b4e1d", + "340f9e2031aaaf60300aaa81800942800805297000014a1180094BBL8;FFc2020054e8030091e10317aae20316aa00011a8baf5801944803160be8ff0039d60500b5f703082a08088052020117cbb60202eb62060054e8030091e10314aaL8;FFe033c33de1d3c23de9c31291e8ab45f9fc5b02f9e037813", + "d2181803ce86702f906000014c80080d2fa4340f9fb8302910800f0f21c450091f5f742f9f4f342f9L16;FFfc6f41a9fd7bc6a8c0035fd621010054810000b4801240f922008052a6d80094811a40f9a1fcffb40804805205000014811240f93f0400f10bfcff5408028052BBBL8;FFea0640f9490108ebe", + "3410054ea0240f9e00b40f94801088be82600a908fc60d3882700b5080840921f1900f1a2270054017c0353c12700343f0800716c010054L8;FFc0008052501400949f0e00b140020054e1d342f9e8cb42f91f0101eb60b70054eb074091e8cf42f92a0400916b810991490380526001029109692138ead3", + "02f9BL8;FFadf8009468aa40f9a80000b460ae40f901f57ed342008052a7f8009468b640f9e80000b460ba40f901f57ed342008052f30b40f9fd7bc2a89ff80014f30b40f9L8;FFfa031f2a483f00121f21376b02010054281340f9c1520012e00315aa5a07001100013fd600ff073612000014280f40f9e", + "00315aae10313aae20314aa00013fd6BBL8;FF21800991b338019488e2079178008052b4008052000540ade8f3687915008092e8e30a79e057813de15b813de6010014e8074091f6af45f9e043259108810991L8;FF40010036c82400b5e1031faac2ffff17e1031faae81f05f9bfffff17e1031faae8370", + "ab9bcffff17e1031faae8430ab9b9ffff17e1770ab9eafeff17e1730ab9L16;FFe97344f96b1147f8e00b18ade213c23de00bc23de9a301f9e31fc23df6cb43f9e18b14ade11bc23de203c23dea7202f8eaa35f39e8ff43f9e48715ade107c23dBBBBL8;FB28290000000000000000000000000000080000", + "00000000000800000000000000203644000000000054727946726f6d536c6963654572726f7200000000000000L8;FF19038052a9035bf8f80f40f9fa230191680240f9a0039d3ca9031ef81f0500f1ab000054600640f901f97fd342008052a1880094a003dd3ca9035ef86002803dBL8;FFa1170054e20", + "f4ba9e0031691e56340f9e4031faa59dcff97e8c342f9200bc03dfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1404f803da90319f860420054L8;FF7f250071a8570054292d0c1b5f1500f1f6030daae1030eaaef0310aa400600540b1540396bc100517f25007168560054292d0c1b5f1900f1f6030d", + "aae1030eaaBBL8;FFc0035fd620008052e10317aa4244019420008052e10319aa3f44019420008052e10318aa3c44019420008052e10316aa3944019420008052e10315aa36440194L8;FFffeb01f9e80303b928008052e8ef01f9080480520800ac72810101ade80b02f9e8430f91fff301f9e80302f9e9", + "0702f9da46ff97a0420035fbef41f9e6f341f9L16;FFfe0310aaf0030aaaea0314aae40308aae8030eaaee0311aaf1031baafb0312aae31340f9f44b40f9f70302aae22f40f99f07001428a00791e07f00f9e0030991BBBL8;FF3f0500b120060054092d40f93f8100f121070054092940f92d0080520861", + "40b92a0940792b1940392c7140f8682600b9ea0300792a7141f8eb0b00392b7d4039L8;FFdaffff17f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f090071e1010054BL8;FFc80e00b5200840921f1800f1020f00542", + "17c0353210f00343f040071c00300543f080071e00100543f0c007101050054888248f81f0500b1810000549fe608a9L8;ZDBBL8;FF8043813c00e4006fa80319b889430df8aa0312b8a8c313b8828707adeb1300b9ebe303b9200300ad74240194e9bf4639e84346390a088052a00302d1f8031091L8;FF", + "820e803d810a803d8006803de017c03de11bc03de21fc03de313c03d8312803d821e803d811a803d8016803de82700a9480dc0da690dc0dae82701a9880dc0daL16;FF0a0480522a6100a92a2101a9377d02a93f3100b92ae903a92aa104a939fd05a93f6900b9a7a800940004805221008052a0a8009460", + "0200b4e00740ad08048052BBBBBBBL8;FB6c656173652f6275696c642f6c69627369676e616c2d70726f746f636f6c2d613434636635613164633062366666632f6f75742f7369676e616c2e70726f746fL8;FFe87f12a9ff2313a9e87f15a9ff2316a9e87f18a9083c8052ff7f02a9ff7f05a9ff7f08a9f", + "f7f0ba9ff7f0ea9ff7f11a9ff7f14a9ff7f17a9e8cb00f9ff630639BL8;FF6b00f8378b0080523a0000142b7c1c534b0a00344d11c0390b00be522b000b0bac1d00128d00f83761710c8bab008052300000144d15c039ae1d00128c1d0e0bL8;FFf5031baa59df78b3e003c03d28008052955e01a9986600", + "a9800a803d68420039f44f49a9fb2b40f9f65748a9f85f47a9fa6746a9fd7b44a9ff830291c0035fd6BBL8;FFe80740f9eb2745a940818a3c000940ad41818b3c683940f954650f29f40340f940818c3c600542ad42818d3c6219c03d483900f9280940f9400502ad600540adL8;FF610a40f9680240f9b7", + "0640f91f0101eb80080054680640f9490280522a040091e00316aa6a0a00f909692138e10313aa6afbff97780a40f9680240f9080118cbBL8;FF888246f81f0500b1810000549fe606a99ffe07a99f82083881a20191e20313aa9ef2ff97600400b5e1031faae4ffff17880240f91f0500b1c10000549f5e", + "00a9L8;ZDBBBL8;FB74696f6e2d696400650d40000000000011000000000000001d01000005000000650d40000000000011000000000000000a01000005000000650d400000000000L8;FF958640f9bf0600b1401700548022049160f2ff97080040b20811c0da081540d2080d088b0825019109fd46d308", + "00098b080500911f0109ebe815005447000014BL8;FF050000941f1c0072e0079f1afd7bc1a8c0035fd6fd7bbda9f65701a9f44f02a9fd0300910800403929004039f40300aaf30301aa1f01096be0179f1ab6170194L8;ZFBBL8;FF08200091200440a9e92300910a0000b04a610491e8a700a942ffffd0", + "420c3491ea0f00f9e3430091403e0194fd7b43a9ff030191c0035fd608200091200440a9L8;FF0900f0f2e8470039e90700f9ddffff17e00700f981fdff902184119183fdff9063981191e0230091a20080524402805286000014c90080d2a8831d3848008052L16;FF40feffb000cc2191e8ab03f968fef", + "f9008c11f91e1032b91fb0302aae3031d9162008052f86305f9fc0310aae9a703f9e9af03f9e8b303f91cc9ff97e31340f9BBBBL8;FB3d0440000000000049000000000000000a010000110000003d0440000000000049000000000000000f010000140000003d044000000000004900000000000000L8;F", + "F1f0009eb28dfff5400feff9000200c915a8e009400feffd000c03c91578e0094fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091084c80b9f30300aaBL8;FFe4170ca9e6230da9ff230b39ff7b01f9e20f0fa9e41710a9e62311a920013fd6e06b01f9e8c31791f3c31791e16f01f9290c40f9e", + "1830b9120013fd6f4fb42f9L8;FF880000b4e1035ca922008052aa120094e15341f90130ffb4e05741f97cf9ff17e90b4091ea074091e007409129c10e914a411d9100401d912081c03c2181c13cBBL8;FF560300b4e10f40f9e80740f9b70640f91f0101eb80080054e80b40f9490280522a040091e0031", + "6aaea0f00f909692138e12300918dd8ff97f80f40f9e80740f9L8;FF28008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd620008052800600f909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6L16;FF093540f9e02b00f9008940f9e99700f9093d47a9e02700f900", + "8d40f91b554ea9e00b00f9009140f9e9d700f909ed40f9e03b00f900e952a93f0309ebe94b00f9BBBL8;FF1dfeff97610a40f95afeff17e00313aae10317aae20315aa230080522400805215feff97770a40f9680240f9080117cbbf0208eb89cbff54e00313aae10317aaL8;FFe0431691e1031caae2031", + "aaac8110094fcd342f94cf9ff17e043169122008052c3110094e1d342f956f9ff17e043169122008052be110094e1d342f95ff9ff17BL8;FF29010bcb0a2500a9fd7b43a9ff030191c0035fd6e80741b2e0030091e80300f90bf9ff97e10300aa20008052fd7b43a9ff030191c0035fd623010094fd7b43a", + "9L8;FF1f8d017108050011290d80122821881a68c00d390c000014004300911f0001eb880000545c0080d2f4031c2ae0ffff17e00318aa860080d2e3ffff1727008052BBL8;FF3f0800b1e0adff543f0400b1a0adff54810000b4e07b49f922008052a6320194e18349f9e1acffb4e08749f963fdff17e18", + "b49f93f0800b1800100543f0400b1L8;FFe88340f9f69340f9008545a90c060094e88340f9f40300aaf50301aae00316aae10314aae20315aa039144a9842dff9700060036b50000b4e00314aae10315aaL16;FF00844eade10313aaf40308aae0071bad00884fade00b1cad01804cade10319ad02804dad", + "e0030091e2031aada9b20094e8430691614208910232805200410891BBBBBL8;FB1d1c40000000000054000000000000008d000000140000006d697373696e6720696e2070726f746f627566484d41432063616e2074616b652061206b6579206fL8;FF600542ade92300f909048052488104f85833899ae", + "00701ad800702ade20342ad820303ade28747ade01bc03da28739ad8003883ca8f35438e18346ad1f7d0071BL8;FF1f0500b120030054592f40f95b6340b9991100b4542b40f9aa1a0194e00319aa21008052a31a0194c01300b4e10314aae20319aafc0300aaa61a0194542340f9L8;FFee0318aaeb0319", + "aa9c080014010700d1e8431391e006009100dafe97e96b42f9e03bc13de13fc13dea8342f9e86f42f93f0500b1e00715adea6301f920280054BBL8;FFa59b7aa96affff1799ffff9039e31f915a04805258ffff17a9735c3808d34178e00316aaf9d701a9159341b8b60301d1e8270129a9237da9b9835c3", + "8bbe35c78L8;FFf55346f9e0833291e1032d91022b8052b05a0094e08332913cf0ff97f30315aa69018052618e41f8280041d23f0000f10841899a1f2d00f1020b0054a80240f9L16;FF2b010014c1020291a2c303d15aecff97e02100b44e010014e8af40f9140101eba3310054e8af40f91f0114eba921", + "0054a0c303d189e7ff978031003728fc60d3BBBL8;FF5e760194c0ffff9000e025915b760194ff4301d1fd7b03a9f44f04a9fdc300911f1c007280010054c80080d2e0230039ff2700390800f0f2e0030091e80300f9L8;FFe8431691008009918fc5ff97e08741ade217c03de8eb46f9f94b09f9e2a3843", + "de267c33de09b843de06bc33de19f843de16fc33d4083843ce073c33d4183853cBL8;FF6c0500543f8000f1400900543f9000f1e10b0054692240393fb50071410c0054693640393fb50071e10b0054694a40393fb50071810b0054695e40393fb50071L8;FF10c471d3ad0501539f010b6a2b017bb26911", + "899a0bfc5bd30ce873d3df010d6aee8510aa0dc070d36b0179920ffc4ed30c020c0a10b46dd3cb010baa2e017cb2BBL8;FF59000014e8031faa090c40f93f0500b1c1fcff540a1840f9e803088b5f0500b1c1fdff54e80308abe2090054092440f93f0500b180010054092c40f92a0140b2L8;FFe9ef01f9", + "29fdfff029ed0a91e80302f928fdfff008f91491e9fb01f9290080d2e81302f9c8048052a934c0f2ea1702f90a078052001f813dffeb01f9e8f301f9L16;FF080080927a0600f93ffaff1729008052e96b00f9880100b4fb0308aaa9ba0094e0031baa21008052a2ba009440af00b4e16740f9e2031baae0", + "4700f9a5ba0094BBBBL8;FB65000000050000001d1c400000000000540000000000000073000000050000001d1c400000000000540000000000000079000000050000001d1c400000000000L8;FF002016915d860094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4307d1f503", + "01aaf30308aa15010037bf0244f14901005428008052BL8;FF081140f91f0500f1a9040054e8830291e0032d91e10313aa0204805214210191f3032d91cfeeff97e8ffffd008012391c9048052e85706f9e8ffffb008610491L8;FF2803178be80f00f9560300b4e10f40f9e80740f9b71240f91f0101eba", + "00d0054e80b40f9490380522a040091e00316aaea0f00f909692138e1230091a0e5ff97BBL8;FFf6571ba9f44f1ca9fdc30591350840f9364841b9f90301aaf30300aab50400b4340740f9a74a0194e00315aa21008052a04a0194602100b4e10314aae20315aaL8;FF090100b42b0140b26b11c0da6b154", + "0d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d3L16;FF81200054c80100b0081140f91f0900f149070054880100d008011591e9eb01f9e8ef01f968feffd008611d91e8a303f92903805240feffd0003c3991e8ab03f9BBBL8;F", + "Fc80200b94301001408358c52f50302aa3f01086b29050054080300b0081140f91f0d00f1a3040054e80302914900009029611291e8270aa9e8630291c90200d0L8;FFad6a0094684e40f9a80000b4605240f901f97fd342008052a76a0094685a40f9a80000b4605e40f901f97fd342008052a16a009468", + "6640f9a80000b4606a40f9BL8;FFa80600b5e1031faadaffff17e1031faa883200b9d7ffff1781020054e1031faae00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6c80080d2e10700f9L8;FFe90300aa1fbd01383fcd0138e80300aae90300aa1fdd01383fed01381ffc0138c0035fd6c1ffff1", + "71f000039e80300aae90300aa1f1d00383f2d0038e80300aaBBL8;FF28fc073708fc60d3c80100b5080840921f1900f102020054017c0353210200341f1100f160020054e003082ae20313aae303142ab5ffff97c0fdffb4d2ffff17L8;FF000540ad9ffe00f1ff2701f9ff2301f9e10301ade00710ad000", + "941adc81f8052e803063908008092e20300ade00b11ade00742ad281300f8289300f8281301f8L16;FFe123009172d2ff9796224039f50f40f9e80740f9df0a00712d010054df120071cc010054df0e007141030054bf0208ebe0030054760080521f000014b6010034BBBBBBL8;FB616d706c6564202d3e", + "20456b526563656976656443743153616d706c65640076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372L8;FFe0830791f30301aa28210039280100f90ea6ff97e10313aad2ffff17e0230191f40301aae183079102308052a99e0094e8031faae7ffff1702fefff042203", + "891BL8;FFe00313aae10318aae20316aab7020094780a40f9680240f9080118cbdf0208eb29f8ff54e00313aae10318aae20316aaae020094780a40f9bbffff17e00313aaL8;FFe00316aa22008052ab1e0094e15740f9810000b4e00315aa22008052a61e0094e0a30291e103192a7e110094f50f4ba9a0", + "8301d101a30091e20315aa320f0094BBL8;FF010140f9290400d13f0d00b188000054000540f922008052a75e0194e18340f93f0400f18b000054e08740f922008052a15e0194e19b40f914008092f48300f9L8;FFf703182af8df40f9ae5e0094e00314aa21008052a75e009400fc00b4e10318aae20314", + "aaf60300aaaa5e0094f803172af7031aaafa0315aaf503132af30740f9L16;FFe00313aa22008052230080522400805287020094610a40f9e00315aaceffff17e00313aa2200805223008052240080527f020094610a40f9680240f9d8ffff17BBBL8;ZBL8;FFe0fdffb0008039915c7a0094fd7bbaa9fc6", + "f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9ff833cd1e8074091f30300aafa074091BL8;FF1f0400f120fdff54f44f44a9f65743a9f85f42a9fd7b41a9ff430191c0035fd6f7031faae00317aae10314aa3afa0094c0feffd000203d91c3feffd063a03c91L8;ZFBBL8;FF8", + "10000b4e02b40f922008052aa3e0194880700d11f0d00b128e8ff54e00319aae1031caa22008052a33e01943cffff17df020171e20b0054fc031faaec0f00b9L8;FFa80280522a490091e8f701f9e8ef01f9eaeb01f9d63801b4e0430f918df8ff97683642f9754602f9aa0000d009554f29481140f93f05", + "0071a1380154fb5f40f9L16;FF5f0700b1e81303f9e27b813de067813de16b813d404900546083c43c6183c53c6283c63ce8e35539fac301f9e0071ead6113c13c6083c73ce8230e39681340f9BBBBL8;FB7b29d8f0e734cf9f7b3e5c53e9a9361e489549405c3caaf9f387f215574ba686816f443e29147", + "616b47240e1051b0595e8330bdda28c749d80e100009519f911L8;FFac8e0094a07800b4eaa74da928008052e84f1ca9f32f40f9fc7f1ea91c038052e82710a9ea7f12a9eaa74ca9e8531fa9f4031faaff2311a9e82713a9ea7f15a9BL8;FFa3010014c80080d2e15706f90800f0f2080900d1ca000014e0", + "5706f9e80b41b2c7000014c80080d2e15706f90800f0f2080900d1d0000014c80080d20800f0f2L8;FF20008052e10314aa420a0094fd7bbda9f65701a9f44f02a9fd030091330400b182030054b300f8b6f6031faae00316aae10313aa380a0094f40301aaf50300aaBBL8;FF21008052ab4e0194e00400", + "b4e08743adfa0300aa000400ada0820291ad4a009408048052e90b40f9e003c03de8eb14a9e2430291e8ff15a908018052e8ff16a9L8;FF1f0500b12011005464feff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebe80f0054960000141dfeff97080040b2L", + "16;FFea0b40f9e96340f9f6030daaed0307aae72340f9f57b40f9fabb00f9fa0310aaf00311aaf1031baafb0308aae8030eaaee0312aa9e0d0014092340393f150071BBBL8;FF090d00396a6d1c320a0100390c050039cdffff17f703002ae0230091e10314aae20315aa230080522400805212faff97e00", + "3172ae80b40f9ff0202710801148bL8;FF8112c03de8bf40f97a0200f98002803df45744a9e8ab00f9610a803d6082803c680e00f9f50000b4f30314aae00313aa52050094b50600f173a2019181ffff54BL8;FFe10300aa20f6ffb4a6ffff17e1031faa883200b9adffff17e1010054e1031faaa0ffff17", + "c80080d2e11700f90800f0f2080900d190ffff17e80b41b2e01700f9L8;FF74d86678833e7cd305400091941c4092681000d15f7c0271497c0553421c45d39416039b8502088b090100543f150071e1f8ff54a2c05fb85f1000f189f8ff54BBL8;FFe8cb42f91f0101eb20390054e8cf42f9090180522a04", + "009109692138e1431691ead302f95c0c0094e89b49f91f0500b1c0000054e8074091e143169108810991L8;FF450000140a0180d20804805209c480520a00f0f2e89f04f9e9a704f95a650091a1035df8611b00b5de0000142183c03ce90f4bf9a84301d1ea0756b9eb134bf9L16;FFe0031f2ae3031faa2", + "eaa009440feffb000c0299123fefff063001a9144feffb084e02a91a22700d1c102805242aa0094e0830091021080522300805224008052BBBBBL8;FB6a000000000000009c0000002e0000004572726f7200000042024000000000006a00000000000000020100002e00000042024000000000006a00000", + "000000000L8;FF5e92009420feff9000c001915b920094fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9fd030091ff4307d100e4006ff30300aa5f0401f1f6fdfff0d6820e91BL8;FF0801098b130500917f0209ebe90b0054088c5cf81f0500b1e00900541efeff97080040b20811c0da081540d2080d", + "088b0825019109fd46d30800098b08050091L8;FFe843139158120094e0074091e1431391028c815200401d91ae160094e00b4091e843139102c4805200c00e9101813191a8160094a316009400c4805221008052BBL8;FF030400b4e0a30191e10303aae20304aacdfeff97e00314aaae520094fc0300aa", + "f50301aad30300b4a6560194e00313aa210080529f560194c03e00b4e10319aaL8;FF4aa11591ff0300f9a96b40b9e82f00f9ea4302f9ea4702f9aa4700d1e7a30ea9a80c40f9e08706a9ea830aa9e00304aae18b0ba9e10302aae96300b9e28f07a9L16;FFe8079f1a9f0600b1e083803c60090054e9a34", + "0393f03096b430900545f0f00b1000e00543f03086be8979f1a08219f5a081d0072a00900541f05007141120054BBBL8;FF21780391a3fffff063500291a0c300d142018052840080529c7c0094b7035df86bffff17880080d20800f0f20811009154ffff17880080d20800f0f208110091L8;FF1f0500b1", + "c0000054e8074091e143169108810991008102919b120094f87f49f9780300b4e1d342f9e8cb42f9f97b49f91f0101eb208d0054e8cf42f949038052BL8;FF22008052f30b40f9fd7bc2a8aaf6001460220091f30b40f9fd7bc2a87200001460420691c10000946022009107feff9760420891f30b40f9fd", + "7bc2a89afdff17L8;FF637c4093000780d298090094037c4093e000f837d3009836280380d2e00303aa410080d2220080d2010000d4e00303aa04000094f30b40f9fd7bc5a8c0035fd6BBL8;FFe157c13de0f3863de05bc13dea670291e8d700f928e341f8ff0600b120a1813ce04fc13de8cf0ef9280080", + "5221a1803c40f18f3cf6bb0ef93821003928250039L8;FF21b810912223c03de0830e91e3032a91e4430f91e2008052008703ad0227803d2e020094f5e741f9e8df41f9bf0208eb61000054e0e30e91d3d4fe97200743adL16;FFe2efc13de3fbc13de8bb01f9e8c743f9f4031aaae0d7803de0f3c13def0", + "314aae87202f8e8bf5d39e6030991e08713ade407c23de003c23d2841082a699140b8BBBBL8;FB6b796265725f7072655f6b65796c6f63616c5f6964656e746974795f7075626c6963000000000000920e4000000000005500000000000000ce00000001000000L8;FFfd7b04a9f92b00f9f85f06a9f6570", + "7a9f44f08a9fd03019137fc4039f40301aaf30300aa1610805235000191383040f92000178be21640d2e1031f2af91640d2BL8;FFf5c742f9f7cb42f9c80240f9f83b42f940818b3ce9c304f9680000b4e00318aa00013fd6c10640f9810000b4c20a40f9e00318aaa00601947f0b00b1c1020054L8;FF02", + "01805201ed7cd3ab060094f71f40f936008052ff2200f18018005408058052fa0317aaf766089bf5d240a9340200b4b982009104000014940600f139c30091BBL8;FFffe70fa9ff8700f9c1220191a20301d1f1caff97e0f7ffb44b000014e85b40f91f0500b161000054ff670ba9ff6300f9e1c30291a20", + "301d1e7caff97a0f6ffb4L8;FFe8b30a9109feffb029011f91e80302f9e8830a9140fdffd000281291e90702f9290000f029211f91e80b02f988fdffb008e10d91e90f02f949048052e82719a9L16;FFf00305aaf5a70fa9e5a74da9e1030eaaf50314aae9ab18a90a008092e9031eaaeb2b0ea9eb030daa", + "ed0317aaf7ef49a9faa700f9fa0316aaf60304aaf44b40f9BBBL8;FF187d01a91f2504a9172505a91a6100b9792e00f9cb13005408030090f8e30091081140f91f0d00f1030d0054684a40f91f0500b160020054608649a9e8e30091L8;FF20010054536928380cfc71d308050091290040f9280800f94c0", + "200b5e0030daa47000014e10300a9e00301aae10309aa22008052f4030daabd050094e10340a9BL8;FFe80301aa60000036a8f9ffb466000014e1031faa883200f9caffff17a10d0054e0031faa87ffff1721050054e0031faa7affff17c80080d2e00700f90800f0f2L8;ZDBBL8;FF22008052f44f41a9f", + "d7bc2a8aa260114611640f9810000b4601240f922008052a5260194610640f9810000b4600a40f922008052a0260194603240f9a00000b4L8;FF611a40f9810000b4601640f922008052a9260094614640f9c10000b4604240f922008052f30b40f9fd7bc2a8a2260014f30b40f9fd7bc2a8c0035fd6fd7b", + "bea9L16;FF0001805299eeffb5f80300aaf5031faaf7031faae9031faae8031faa14000014e20308aa290308eb00feff5408011b8bf50302aaf80300aa1f0103ebea33839aBBBBBBBBL8;FBc000204e6f2076616c69642073657373696f6e20666f7220726563697069656e743a20c0392c20286e6f20637", + "57272656e742073657373696f6e207374617465L8;FFff6b01f9ff6f01f9ff8301f9ff8701f9ff9b01f9ff9f01f9ffb301f9ffb701f9ff1701f9e81301f9ff1b01f9e81f01f9ff2f01f9e82b01f9ff3301f9e83701f9BL8;FFf40302aaf30301aad2000094e80300aae00301aa08020037980240f9080740", + "f91f0100eb42020054e80f41b2e80700f907000014c90080d248008052e0430039L8;FF21020054e1430091a2e300d137fdff9720fbffb42b00001401c30091a2e300d132fdff9780faffb420000014c00500b5a0e300d111feff9700010036c1f9ffb4BBL8;FFe1031baa445f0194e80316aaf60301aaf4", + "1f00f9e80700f928008052fad70429db0300b4e82b40f9f403192af903172af80f00f9f8031caafc0316aa171540f9L8;FFe8031faa74f7ffb5e00308ab43f8ff54a0fdfff000603e91585f0094e00313aa22008052c2020094610a40f9a1ffff17e00313aa22008052bd020094610a40f9BL8;FFe00301a", + "ae8fd073708fc60d3080c00b5080840921f1900f1420c0054017c0353610c00343f040071000200543f08007161030054890240f93f0500b181000054L8;ZDBBBL8;FB6369706865727465787400000000000073104000000000002d000000000000009f0000000900000073104000000000002d00000000", + "000000a200000009000000L8;FF1f0101eb20710054e81340f92a040091e00315aa49088052ea1700f9096921387ef1ff97e16300911d91ff979f0700b180000054e1630091e00315aaa1a6ff97BL8;FFf34b00f9fd0302910010c03c01f0c03cf30308aa08004039097c40390a088052e013803ce003009", + "1e1f3803c200440ad08111d122a150033a18300d1e8030039L8;ZFBBL8;FF03ffff5440ffffb000803c915b3f0194ea031faa49f9ffb5d0ffff1740ffffd000600691553f019440ffffd000600a91523f019440ffffd0000030914f3f0194L8;FFa1210054e00313aaff6b00b9ffdf00a9df7e01a9dffe02", + "a9f71700f9f72300f9df7e04a9f7ff05a91affff97e0060036212c00b5992240f9881a40f93f0308ebL16;FFea2f1fa9e99300f90aa544a9e9cf00f90ba545a9e9c300f9093540f9e9ab00f9093940f9e99700f9093d40f9e9ab1aa90a2548a9eaa709a90a2549a9eadf00f9BBBBL8;FB550000000000000", + "04001000021000000d30940000000000055000000000000005401000019000000d30940000000000055000000000000006e01000025000000L8;FF201a0054f30300aae00308aa4d020094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb69", + "1e0054BL8;FF080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b1400400540a1440f9092040f90a0100b44b0140b26b11c0da6b1540d2L8;FFe2a740f9e0031aaab2130094e28753a9e0431391fa8b00f9be040094e96f42f9e86b42f9e9bf00f9e97342f91f0900b", + "1e8af00f9e9a300f921050054e0431391BBL8;FF61ffffd02190049163ffffd063000291a0c300d1a20280524400805209000014a0031df861ffffd02190049163ffffd063e40491a0c300d1a202805244018052L8;FF4003803de8f304f943000014404fc03da80359f8e05344f94003803de8f304f900c", + "1ffb4e15744f9c1c0ffb422008052a153009403feff17c082c73ce8a344f9L16;FF8c390094e203012ae103002a89390094e203012ae103002a86390094e203012ae103002a83390094e203012ae103002a80390094e203012ae103002a7d390094BBBL8;FF978640f9d7fbffb5e9031faa962281b996fcf", + "f35ea031faa958e40f955fdffb52801088b49011f8be10313aa0001098b8ef9ff97b8010034610a40f9680240f9L8;FFc00e0054e1d342f9e8cb42f91f0101eb402a0054e8cf42f92a040091c02202914901805209692138ead302f9ed210094e1431691690c0094e0b349f9800100b4BL8;FFe0e30091e1", + "0317aa2200805262f2ff97f42344a91f0114ebe3100054e81f40f9e10315aae20317aa0001148ba9f30094e90344a9080009eb230f0054ff0208ebL8;FF000700d1bf0200eae0179f1a40fcff3580020e91a2064091011440f9022400f9022040f9210400d1011400f9c2fcffb4550400f981020e91a30c8", + "05282c241f9BBL8;FFe1431691641100949f0a00b1e10b0054e1ffc33de8d342f9e90348f9e067c13d8183813ce83b08f9e80f40f9e94708f9e11fc43de223c43de0fb863de01b843dL8;FFffc30691c0035fd6a04302d1e1031faa95f1ff9752ffff17fd7bbda9fc5701a9f44f02a9fd030091ffc320d1f", + "30308aaa08741ada82b40f9a90700d1ff0300f9L16;FFe81302f9e91f02f91e150094e10b45ad480080d2e00fc13de30bc13d0800f0f2f52b00f9f56b40f916017db2a18b39ade133c03de207c13d6083853c6383843cBBBBBL8;FB6420746f206120566563000000000000770d4000000000002e0000000", + "00000006f0100000e000000390740000000000033000000000000002203000020000000L8;FFe00704ade08747ade22b803de00702ade08b48ade00b03ade08746ade00701adf7140094a0c303d1a15701d102048052f8040094a80351f81f0500f1e02b0054BL8;FF6200005435008052070000141f0020", + "716200005455008052030000141f404071d536969ae80740f9080114cbbf0208eb28040054e80b40f91f0002710801148bL8;FF4183ca3c6083893c4083c33c61838a3c4183c43c6083833c4083c53c6183843c4183c63c6083853cc082c03c6183863cc182c13c6083803cc082c23c6183813cBBL8;FFf6", + "0301aae10315aae20313aa230080522400805218e7ff97950a40f9e10316aaedffff17fd7bbea9f30b00f9fd030091010040f9130840f93f0013eb69010054L8;FFa4028052fe000014e05306f9e083329161fdfff021203f910202805263fdfff063603d9104028052f500001448008052e0a33239e0833", + "291e8a73239c80080d2L16;FFff430291c0035fd6e80180520900809268220039690200f9fd7b47a9f34340f9ff430291c0035fd6e8031f2a6822003908008092680200f9fd7b47a9f34340f9BBBL8;FF080200b4f30301aa810240f920008039c001f8b729040091080500d1892200a925000014c90080d", + "248008052e04300390900f0f2e8470039e90700f924000014L8;FF7400805215008092e8d342f9e067c13de94306912081009102708052e8a302f9e843169101610091e04f813da97b0094e063c13de8a342f9e907409129c13591BL8;FF29010b0b4a114c0bbf25007129c100110b819f1adf7d02710914", + "003949c100110a819f1a0918003969010d0b4a114e0b29c10011cb0d00122c144039091c0039L8;FFe91b00b9ea3b0079002140a9eb3f0079f3eb00a900013fd600f70736290000148a120a8b4a11407948fe2f37f3ffff17e00313aae10317aae20316aa53feff97BBL8;FF6082863ca00b7ead6182873c", + "e11bc03d6282853ce00b01ad6182883c6082843cff430791f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8c0035fd6281040b9L8;FF6083c93c6183ca3c6283cb3ce8eb41f9c00601ad6083cc3c6183c73ce81f00f9c20202ad6083c83cc10200ad02000014e81f00f9f73700f977aa40f9f9e305a9L16", + ";FFadbb0094ba0000b4e05b40f9e1031aaa22008052a8bb0094e17340f9810000b4e00315aa22008052a3bb0094f6031faa787201a908008092760600f932fbff17BBBBL8;FB0000798b9ccdcae002bc000000000000000000000000000000000000000000000000c8c5defb7d6bdb1a0000ce4611267d94", + "01f6bd6d9daa2c3f52493c29d65aL8;FF81feff54c8feff17e0430a910ae2ff97e14340f9f5ffff17e8430a91f34b41f9142300910081c03ce8030a910001803d04000014390700f19462009100010054BL8;FFe87b06f9c80480524941c0f2ea7f06f90a078052e07f823dff5306f9e85b06f9ff5f06f9e", + "a6706f9e87306f9e97706f95a070194e1fb44f9810000b4e0ff44f9L8;FF01018052ab0b0094200100b4140000f901fdfff021c00691130800b91f300039f44f41a9fd7bc2a8c0035fd6000180520102805237070094fd7bbda9f50b00f9BBL8;FFe82340b928010036c81e00121f0500718c130054a8140", + "035d51e4092e80f41b2e90315aaab000014e0230091e10316aae20315aadcefff97b50000b4e00316aaL8;FF081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aa080c45f81f0500b1800200545afbff97080040b20811c0da081540d2L16;FFe95b44f9e86f00f9e8", + "6744f9e85f00f9e86f44f9eaa30aa9e87744f9e83f00f9e87b44f9e9a31da9e88344f9e97f44f9e8f700f9e88744f9e8a705a9e88f44f9BBBL8;FF2200805223008052240080521af7ff97f76741a9b9ffff17e0230091e10317aae20315aa230080522400805212f7ff97f70f40f9e80740f9080117cbbf", + "0208ebL8;FF22008052ac6b0094602e40f9a00000b4613240f9610000b422008052a66b0094611a40f9810000b4601640f922008052a16b0094614640f9e10400b408108052BL8;FF351500b5e1031faa91fdff17e08743ade00314aaa0873bade08b44ada08b3cade18341ada18339ade28342ada2833aa", + "de18340ada18338ad8af3ff97a0877badL8;FFdf11007100030054df0d007140010054df090071010c00542d050091bf0101ebe20a00540e68ed38df0501310dfbff54590000142e050091df0101eb020a0054BBL8;FF08fffff008053691e8ab13a98a06805248048052ffa70ea909fffff0299d2a91e9a", + "b10a9290080d2e1a30391090ec0f2e8ff0fa9e8a712a95827019428ffffb0L8;FF4527009420008052e10318aa4227009420008052e10316aa3f27009420008052e10315aa3c27009400018052e10313aa39270094080040f9e20301aa002140a9L16;FFe96742f9e91f00f9bdfeff172000805201048052", + "40a7009440feff9000c0299123feffd063001a9144feff9084202a91a24700d1c10280523fa7009442feff90BBBBBBL8;FB2f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f737263L8;FFac9f0094", + "e01b00f9202200b4ad9f00944000805241008052a69f0094e01700f9602100b4a79f00944000805241008052a09f0094e01300f9a02000b4a19f0094BL8;FF4401805211000014c80080d2a0831d38a0c300d10800f0f2bf931d38a8031df80b260094e80300aa01ffffd02104129103ffffd063201191a0", + "c300d142018052L8;FF600bc03de003803de11f40f9810000b4e00316aa22008052a71f00941a0080921d0000141a008092e00bc03de007803de017803db70000b4e00318aae10317aaBBL8;FFb50600d1750a00f9f70000b4ff0600b180020054e00318aae10317aa22008052a55f0194e00313aadc0000", + "94688e41f81f0500b160000054e00313aaa2e3ff97L8;FFfcff42f961e2009102278052e01b813de11f813de88304b9ae5f0094f66f41f9f36b41f9c80240f9680000b4e00313aa00013fd6c10640f9810000b4c20a40f9L16;FFf4fbff35f44f42a9f50b40f9fd7bc3a8c0035fd6e00313aa22008052230", + "080522400805282030094610a40f9d8ffff17e00313aa220080522300805224008052BBBL8;ZBL8;FF8ba3ff97e11740f9c4fbff17e0630091e10317aae20315aa230080522400805283a3ff97f71740f9e80f40f9080117cbbf0208ebc978ff54e0630091e10317aaBL8;FF01018052abff0094600500b4", + "880219cb080115ab82050054f60300aa192000a948008052080800f9e00317aae10316aae20318aa6efb00941f0017eb61010054L8;FF661c01a9261c41a9682402a9282442a96a2c03a92a2c43a96c3484a92c34c4a9420001f1e8feff548e3c7ca9661c01a9861c7da9682402a988247ea96a2c03a9BBL", + "8;FF040280521b000014a0031cf841ffffb021ec039143ffffb063e80291a00301d1620280524401805212000014a0031cf841ffffb021ec039143ffffb063540491L8;FFe1031aaa22008052ab3f0094604242f9f5830d91088c41f81f0500b1c05d0154e8430f9156d8fe97e8434f3928370036e8f341f", + "9f6df43b9fa031faaf7db43b9L16;FFe0f7803d6013c13ce8c301f9681340f9e2eb803de9230e39e092833ce8cf01f91a110094e1b343f9f6b743f9f8bb43f9fcbf43f93f0400b100670054e9cf43f9BBBBL8;FB3aafb1f977b68dfb72793ab885b4161fe047fc081a8924dda1931a954aac60ab6c15a88a", + "5511296483e2513ecce93c95a29a53dfeb393c25a28cffa88b8c0000L8;FF6b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab02040054BL8;FFe0f6ffb4ea00001401630091a22302d1f2ebff9740f6f", + "fb483010014e1032d91a22302d1edebff97a0f5ffb4650100141f0800f1c1240054a80302d1a10302d1L8;FFe00314aae10315aaaa0f0094a00000b528008052750600f904000014e00315aae8031faa600600f90a028052e90314aa696a2af8680200f9f44f42a9f50b40f9BBL8;FFa2fe46d3b8e27a92b", + "5164092e20000b4e83340f9e0020191e10314aa0801028be83300f93f4b0194e00300918102188be20315aaf5ff0039a64f0194e00743adL8;FF80fdffd000203f915c4b009480fdffd000603e91594b009480fdffd000202091564b0094e00301aa81fdffd021803f91a2008052324b0014fd7bbea9f30b", + "00f9L16;FFed7344f9f07f44f9e8ab1aa9e8e743f9eaf343f9e28744f9f48f44f9e1a343f9e8df00f9e8ef43f9e8af15a9e8f743f9eb2b44f9e9a310a9e8fb43f9e90744f9BBBL8;FF3f040071e00300543f080071a1020054f70300aae003082ae10313aae20303aaf80303aaecf3ff97000500b4760000", + "143f0c0071c00300543f10007121010054L8;FF1f0009eb29060054e80f41b2e80300f9e00300910e76ff97f44f45a9f52340f9fd7b43a9ff830191c0035fd6f503012a74040051e00313aad7070094e80300aaBL8;FF80040036480a00b5e1031faaccffff171f0800f1010d0054e1230091e20313aaffd", + "f00a9ff0f00f9a8fbff97600d00b5990a40f9880240f93f0308eb61000054L8;FF21cc47b9210300341f4000f1814200d1130280d21320939a2000138b61feff97201400b4030c40f26104005401c05f3802d05f3804e05f7842100012c1020034BBL8;FFe8031faa00011aab42690054e1431691610d009", + "4df0600b18000005480220291e1431691561200943f0700b1f90b40f9007fff5401c30391e243169160008052L8;FFe80356b9e00740918100805200001891ff0316b9e81b00b9e7290094e80356b9e00740918100805200001891ff0316b9e81700b9e0290094e80356b9e0074091L16;FFff03079111b7", + "ff1725fefff0a5202691a163009162c20791e0031f2ae3031faa29ab0094ff4305d1fd7b0fa9fc6f10a9fa6711a9f85f12a9f65713a9f44f14a9BBBBBL8;FB6573736167655f646563727970745f7369676e616c6661696c656420746f206465636f64652070726576696f75732073657373696f6e207072", + "6f746f62756600L8;FF09fefff0296d399121118a9a3c930014fd7bbfa9fd030091080040f91f0500b1000b0054083040b9e80b0034080140b20811c0da081540d2080d088b08250191BL8;FF080d088b0825019109fd46d30800098b080500911f0109eb482200545b010014e80300aa098d40f83f0500b", + "140220054f30300aae00308aa20020094e80300aaL8;FFe03301b9a04700d111c5ff97e02b01b9a04700d10ec5ff97e02301b9a04700d10bc5ff97e01f01b9a04700d108c5ff97e01301b9a04700d105c5ff97e00b01b9BBL8;FF174800390030813c680200a9680a00f9f44f47a9f72b40f9f65746a9fd7", + "b44a9ff030291c0035fd6200080528104805239530194ff8304d1fd7b0ca9fc6f0da9L8;FFe8c31791e00313aa9252009468624039f5f345b9e8231839e8c31791b47e08530041c03ce183c13de8c31291e063813d01c18d3cc80080d20800f0f21c190091L16;FFbf0208eb61000054e00313aa08d20094", + "680640f918693538d5220091750a00f9b4f7ffb6680240f9bf0208eb61000054e00313aafed10094680640f934008052BBBL8;FFa0faffb49900001481820191e003082ae20313aafffcff97e0f9ffb49c000014e00313aa28860094e80300aae00301aaa8fc073656000014611f0054e0031faaL8;FF9f0", + "600b100b0ff54f5d749f9f3d349f9b50b00b47622009104000014b50600f1d6620091000b0054c1825ff881ffffb4c00240f9220080529f770094f8ffff17BL8;FFe0000054c1825ff881ffffb4c00240f922008052a8f70094f8ffff1714f3ffb48806148be00313aa01f17dd302018052f44f42a9f6574", + "1a9fd7bc3a89ef70014L8;FFe20313aae103142ae00315aa0300009063601c91f35341a9f00303aaf51340f9fd7bc3a800021fd6fd7bbea9fd030091f30b00f9f30300aa00200391730200f9BBL8;FFe187c53de8436c79f5174bf9fb1b4bf9e01b843d2001c03de11f843de8032179a8020090e0fb833d0", + "81140f91f0900f189040054e8633f91690200b029011591L8;FFe04305f9e0032a9161fdffb0215814914202805263fdffb063a01491440180529a3dff97e14345f906000014e80f41b2e0032a91e84305f9053eff97e10300aaL16;FFe08b02f9fa9302f9e99b02f9fc9f02f9c00300546083c73ce88303", + "f9f9031c91e8634f39694740f9e0831d91e0cb813d6013c63ce1031c91e8231c39683b40f9BBBBL8;FB6f6c3a3a73657373696f6e5f6d616e6167656d656e7443757272656e74000000bb124000000000003800000000000000e40100001a0000006465637279707469L8;FF5f05007121020054a80240f9", + "9f0308eb00070054880700b1380100793b050079a80a00f9c3fbff544b000014a80240f9880500b4a80640f9ae0a00f918010079BL8;FFf58740f9e8031691e00315aa91020194a8624039fbc342f9f5c742f9f7cb42f9e8631639e8feff9008c11d91e8d302f9e80180522083c13ce8f304f94003803dL8", + ";FFe00319aae8eb01f9c8620491eaff01f9eac740f9e007813de103813d010140ade99b01f9e98341f9a8620491ea1302f9ea7f41f9010100ade083c83ce183c73cBBL8;FFac090054e90a0035f80f41b25a000014a9a35db8aae35d783f8300f1ac035f38e91b00b9a92f7ea9ea3b0079aa135df8ec4300", + "39eb0700f9210a0054eb0740f9L8;FF5f0b00b141d6ff54f3feff178083c03ce8430f91000d803d888341f8e9035039e80b02f9e8430691a9090034e90310916affffd04a2108911a0380d240fdffb0L16;FFe8e700f92aa042a9ec7300f9e82b17a92aac43a9e92b1fa929a044a9e8cf00f92aa045a9e8c", + "300f9283440f9e8ab00f9283840f9eb2312a92ba047a9e84f00f9BBBL8;FFe00314aa76620aa9e10313aa022b805268620ba9080180527f220ca9080480527f220da975220ea97cf200b9f44f47a9f65746a9f85f45a9fa6744a9fc6f43a9L8;FF4b0080524c0000143f104071c30b00544b09c0396c1d00", + "122c380c0b811140516b00f8376b008052430000143f004871030b00544b0dc0396c1d00122c540c0bBL8;FFe80300f912eeff97e10300aae00301aaf44f47a9f92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd637008052180080921901805206000014e20313aaL8;ZDBBL8;FFe12700f9800b", + "0054e00641ade0430691facb00f90083823ce20242ad0183833c0083853ce10240ad0283843c0183803c0083813c40030094fc2740f99f1700f1L8;FF22008052ac270094f3ffff17682a40f9c80000b40805088be00314aa0201805201ed7cd3a427009460e20191a2ffff9774564da9350200b49682009", + "104000014L16;FFe92341a90a2300f9092303a928a7482908270929e82f40b9085300b93c000014b9035ff8e0031aaa880219ebe833889a3f0314eb2933949aff021aebe103899aBBBBBBBL8;FB797465732e7273001b737071722076312e73656e645f63742e73656e642065706f636820c01e3a2048656", + "16465725265636569766564202d3e2043743153616dL8;FFe90f00f9a1ecff54e02300910af8ff97e00b40f961ffff1722feff9042c03791e00308aa459d009422feff9042603791429d009440008052e10316aa369d0094BL8;FF2aa040a9536928380cfc71d308050091290040f9280800f90cfeffb43f", + "0108ebb3611932000200542b0440f90afc78d37369283808050091280800f98af6ffb4L8;FF98faffb5d7ffff17370080523900809248ff70d349ff60d3990200f997220039883e0039e80340f989d20078e9234039881200f9a81b40b989a20039a9b341b8BBL8;FF88008052f30300aae0230091040180", + "52050d805229f87fd33f1100f13481889ae30314aa26000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9L8;FFe00313aae10316aae20315aac8000094760a40f9c1ffff17fd7bbca9f70b00f9f65702a9f44f03a9fd030091f30301aa210840f9f40300aa680240f91f0101ebBL8;FFe80", + "b41b2e00700f904000014c80080d20800f0f2080500d1e80300f9e00300910be8ff97e10300aae10300f9a1feff9021e00c91a3feff9063300d91e0030091L8;ZDBBBL8;FB756c64206e6f7420626520726561646d616c666f726d65642066696c650000001d1c4000000000005400000000000000590000", + "00050000001d1c400000000000L8;FF13a2ff97964e40f9560300b4e11740f9e80f40f9974a40f91f0101eb00430054e81340f9490380522a040091e00316aaea1700f909692138e1630091188fff97BL8;FF08004039a01300d1a8c31f3862fd0094fd7b41a9ff830091c0035fd6ff0301d1fd7b02a9f44", + "f03a9fd830091480001aba2020054010840a9f30300aae0230091L8;ZFBBL8;FF29613e91286968f8e10308aa3c3d0114281040b9000040f96800c8376800d0376e3d01145f3d0114603d0114080040f9002540a9221140f940001fd6000040f9L8;FF696e00f9080d40f900013fd6606601f9616a01f929", + "0c40f9e8430f91e1031baaf5430f9120013fd6f7eb41f9ff0e00b1e104005448008092880200f968008052L16;FFeb2b5ba9e87300f9e9ab40f9e14740f9e82f40f9e77740f9fabb40f9ef8f40f9ec1f40f9e6e340f9e8f700f9e8cf40f9f60740f9f23f40f9f16740f9e56f40f9BBBBL8;FBed5dea1973d", + "2900cd2a9b9f378c0466add7306d95319235ef973d2aa00006dbd045484954f2d782971ba62157026a08ce8baee34a28c5e8bd2aa000067bc8ee2L8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab22030054091440f9090100b42a0140b24a11c0da4a1540", + "d24a0d0a8bBL8;FFf92700f91f0500b160080054f63b41f9e87b42b9e81f00b9b69800b4f43741f9a8110194e00316aa21008052a1110194a00001b4e10314aae20316aae00b00f9L8;FFe0af40f9440d00942000805201c48052400d009420008052018c81523d0d00942000805221c480523b0d009420f", + "dff9000e03891510d0094ff8301d1fd7b02a9BBL8;FFe106009102c48052f30300aab1510194540500b4ca024039e80315aa5f2100f1210500549f8631f141050054a5510194008c8152210080529e510194a00600b4L8;FF0825019108fd46d308050091092440f93f0500b1400400540a2c40f9093840f", + "90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091L16;FF0b2047a9ebab1aa90bf840f9e84f00f90a2048a93f030bebeb8300f9e8df00f9172049a9ea5300f90a684aa9e8af00f9082c4ba9eaaf18a90a2c4ca9e8b700f9BBBL8;FF280400511f390071880e0054a9ffff902", + "9b107918a0000102b6968384a090b8b40011fd601200591e003022ae20303aaf8f6ff97403800b4a1ffffb021203f91L8;FFe20318aaca100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aac1100094fad342f9fc0740919c83019144feff17e0431691BL8;FF240080", + "52f4030baa89150094e10340a9eb0314aa2ca040a9290040f90afc78d39369283808050091280800f96af3ffb4d4ffff17e10300a9e00301aae10309aaL8;FFc30003cbc81000d184400091631000d1421c001269fc44d30010069b0800088b06d05f388600003402e05f7842040011421c001206c05f38c", + "6eaff353fc122ebBBL8;FFe00318aa09692138e1431691ead302f9610f0094fad342f9e8cb42f908011acb1f0308eb288c0054e8cf42f9e10319aae20318aa00011a8ba6310194f90b40f9L8;FF683d0a91eb435d39e90b03b9c9fe0a911a6d00a9fb0308aa197101a9e8a743f9400540ad785702a928010", + "0f9e83f40f9e9620991eb1f0d39e0fb833d400941adL16;FFe08b42ade41f803de84300f9a29202ada012803da85a07a9210100b4e00314aa22008052f44f4ca9f6574ba9f85f4aa9fd7b49a9ff4303919fb10014f44f4ca9BBBBBL8;FB000000000000000009000000000000000900000000000000f02e4", + "00000000000f72e400000000000000000000000000000000000000000000000000000000000L8;FFf85f42a9fd7bc5a8ab99001435008052ff0f00f9ffd700a9d4fcffb4e0230091e10316aae20314aa23008052240080527fbdff97f55b41a9e10317aae20314aaBL8;FF2a0140b24a11c0da4a1540d24a", + "0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd600ffffb0002025915115019400ffffb000202d91L8;FFe50313aa4283823c4083853c4183863cc0b9ff97e0431391c2f2ff97e89341f91f0d00b1801200541f0900b101110054e89741f9e0cfc03d1f0500b1e0e3803dBBL8;", + "FF686240f9a002803da80a00f9f44f4da9f6574ca9f85f4ba9fa674aa9fc6f49a9fd7b48a9ff830391c0035fd6fa0300aab50200b4a3590194e00315aa21008052L8;FFea6306f9e87306f9e97706f963550094e1bb43f9810000b4e0bf43f922008052a5590094e0833291e1032d91022b8052a8590094e", + "1fb42f9f39b45f93f0400b1L16;FF000705ada083dd3ca183d73c000b06ada083d83ca283d93c010303ada083da3ca183d33c020304ada083d43ca283d53c010301ada083d63ca183d13c020302adBBBL8;FFe10300a9e00301aae10308aa220080522300805224008052f4030caa16050094e10340a9ec0", + "314aa2aa040a9290040f90bfc63d35369283808050091280800f9L8;FF0968283808050091fa3b49f9e8d302f9fafcffb5e8031faaf98792b939010034290340b22911c0da291540d2290d098b2925019129fd46d32905009102000014BL8;FFe10308aa5f1100f15481899ae30314aac7ffff97e80b40b9", + "c8000036e00741a9f44f43a9fd7b42a9ff030191c0035fd6e80b40f900008092742200a9f44f43a9L8;FFe0000054bf6900f1c1feff54ff0600f180fcff54680540f9f3ffff17ff0600f100fcff54730540f929008052eeffff1789000036f70308aa180080920d000014BBL8;FFe00301aaf5074091ff03", + "00f95a830991b5820991855e0094f73349f94083c03ce83f49f9ff0a00b1e067803de8d300f901010054e067c03de8d340f909008092L8;FF082300b5c00a40921f1800f142230054c17e035361230034280400511f390071280800546bfdffd06b510b91890000106a69683829090a8b20011fd6e03400b", + "5L16;FFf5030daaf6030eaaabb90094ee0316aaed0315aa340100b4e04b40f9e10314aa22008052f4030daaf5030eaaa2b90094ee0315aaed0314aae14340f9010100b4BBBBL8;FB656e6774684576656e4d6573736167654c656e677468546f6f4c6f6e6753657269616c697a6174696f6e496e76616c69", + "64000000000000003d0f400000000000L8;FFdc26969a5f011ceb23ffff541b0500913a0080520851199be91b40f9bf0209eb130540f961010054e0c300911ce0ff97e01f40f9070000141b0500910851199bBL8;FFe0feffb000600b91e3feffb063001f91e4feffb084400d91e2c32291c1058052e85b0", + "4f9e95f04f94305019420008052e10319aa3805019420008052e10314aaL8;FFa9000054f5031faae00315aae10314aa41050094940900b4f70301aaf90300aaa8090094e00314aa0101805215018052a0090094a0feffb4f30300aae00319aaBBL8;FFe90b40f9682201b9e82340f9771201b968a612a96", + "89e00f9e82b40b9781601b9684201b9e83f40b9745201b9685601b9e81b40f9755a07a9752206a9795a08a9L8;FFf65704a9f44f05a9fd030091ff0316d1f30300aae8430691e00301aaff0300f9fa03062af803052af60304aaf90303aae21b00f9f50301aab70302d1f4030591L16;FFe85b00f9880180", + "52eba30da92400001428a00791fecb00f92080c03d0101c03d280841f9e0030eaae17b44a9f0030baae3e700f9e9df40f9f91740f9ec8700f9BBBL8;FF533100f8ba0000b4e02b40f9e1031aaa22008052a8690194fb8216aaa85e58d37afe68d3e13340f9e81f00f9810000b4e02340f9220080529f6901", + "94f95f40b9L8;FF610640f9810000b4600a40f922008052a9690094611240f9810000b4601640f922008052a4690094611e40f9810000b4602240f9220080529f69009460620191BL8;FFf65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6170080923800805219018052a80640f91f0116eba90", + "c0054e00313aa89f6ff97e80300aae00301aaL8;ZFBBL8;FFc80000b4090d8052e00314aa02018052017d099ba8290194e17740f9210100b4e07b40f922008052a329019405000014e00640ade20ac03d620a803d600600adL8;FFb80400b40807188b3a8300911bed7cd3040000147bc300f15ac30091c0", + "03005448035ff81f0117eb61ffff5440835ef8e10313aae20317aaa22a0094c0feff35L16;FFe30314aa40000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a939a50094ff0301d1fd7b02a9f44f03a9BBBBBBL8;FB70686572746578746b7962657", + "25f7072655f6b65795f696430313233343536373839616263646566696e76616c696420726f6f74206b6579496e76616c696450L8;FF8002803d880a00f9201500543457139b970a40f9ff0640f261100054d70d00b4a89d0094e00317aa41008052a19d0094c02000b4890a40f9e8fe42d3f60300aaBL8;", + "FF88070054680640f9e10317aae20316aa0001188baf1d01940803168b680a00f9540300b4610a40f9680240f9b51240f91f0101ebc0070054680640f949038052L8;FFbc035ff85c0600b4c80adc9a08d91c9b080600b5f8e700a9b8835ef8760c00b4f50b40f9f90316aa04000014390317cbb502178bb", + "90b00b49f0319eb9733999aBBL8;FF680e00f96000005400630091aee1ff97f3d340a9940100b47522009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f9220080529e5d0194L8;FFe99b05f9ea9f05f90003813c0083823cf6bf05f9e0e3823dfa1f06f9fa3706f91f7f07a9f6d70", + "5f9f6e305f9faeb05f9ffe705f9a88317f88a1000b5e0c32791L16;FF9f0208ebe9f6ff54e00313aae10316aae20314aa230080522400805284010094760a40f9afffff17fd7bbca9f70b00f9f65702a9f44f03a9fd030091f30301aaBBBL8;ZBL8;FFe8e36b799400805215008092e057813de15b813de8", + "e30a79fc010014e8074091f6a745f90023009108810991f40740919482099190cdff97e1074091e0431691BL8;FF155000a9f70300aa152001a928008052081000f9e80318aaa90216eb9402168bf533899a145500a9135d01a9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6L8;ZFBBL8;FF82000054", + "e0c30191b23d01945d000014c00640ad48fc46d3e9c3029157e07a925414409220010191e20308aaffbf0339e08707adf50301aae88b00f939390194L8;FF690100f968c25339693642f9e00600ad22210391400941ade00a01ad010341ad020f40ade843103968620f917fc61339810301ad6032c13d613", + "6c13d820f00adL16;FFfabb43f9e1bf43f95f0500b1404d0054e9cb43f9e8cf43f9bf0600b1e0c343f9efc743f9ebd343f9e82709a9e8d743f9ecdf43f9e9ef43f9ede343f9eee743f9BBBBL8;FB56e20000f02c262a66d154ce8391271a8b429c3385f592d3e1bca9382dc28cfc233fab8ad5a05f8bd566", + "a27c2d97cce9733a9e4aa29aadaeace7eb39784a9e12L8;FF08080091e9031aaa2b4540784a0500f10be11f781345007881ffff54e93340f92805098b01f17dd3e8f300b2a8aae0f23f0108eb48540054fa2b00f9214500b4BL8;FFffa73239e85306f911140094e80300aae0833291e1feffd021401191a", + "2018052e3feffd06374119144018052e85306f911000014c80080d2e0a33239e0833291L8;FFb40d0094e003c03de10f40f9c802158be80b00f96002803d680a00f9210100b4e00314aa22008052f44f46a9f65745a9f85f44a9fd7b43a9ffc301919e0d0014BBL8;FFa3831af863490194740a40f968024", + "0f99f0208eb61000054e00313aa4648019408038052690640f9e083c23c8826089be91f40f998000014490440f90a018052L8;FF4a0d0a8b4a2501914afd46d34a05009111000014e9031faa10000014f5031faa681a40f948f6ffb5f6031faa770a40f917f7ffb5e80317ab23f9ff5480fdffd0L16;FFe1", + "031d91e0b3c23de3af03f9e20319aae8a303f9e86b40f9e0b303f9e0430f91e8a703f9e8fb40f9fcbf03f9e8ab03f9e8bb40f9f1d703f9e8b703f9e8ff40f9BBBL8;FF08351a9109058052682601a908008092685e00a9f44f57a9f65756a9f85f55a9fa6754a9fc6f53a9fd7b52a9ff030691c0035fd6a8", + "ffffb00875199103000014L8;FF2007c03dfc430f912283c33ce8b341b9e0430691810f803debc741b901048052e002803de9cf40f9ea9741b980c38d3c800fc03d821f803d4047803d801fc03dBL8;FF3f0900b140210054880080d20800f0f2080900913f0108eba120005481220091e20313aa4508009", + "4f50300aaf50100143f0900b140220054880080d20800f0f2L8;FFfd7bc1a8c0035fd6fd7bb9a9fd030091f30b00f9f303032ae43700f9e3f77fb25f0003eb48010054040080d2d3010837637e4093081b80d2010000d401f7ff97BBL8;FF22008052b9110094e1d342f98dfbff17e043169122008052b41", + "10094e1d342f9a3fbff17e043169122008052af110094e1d342f9bbfbff17e043169122008052L8;FFe00240f922008052ab2d0094f8ffff17e89740f9c80000b40805088be00314aa0201805201f17dd3a32d00945f0f00b1616bff5448008092680200f95bfbff17L16;FFff831a91f44f43a9f65742a9", + "fc5f41a9fd7bc4a8c0035fd6e08fc03de82341f929008092690200f96082803c680e00f9e02302919cb4ff97ff831a91f44f43a9BBBBBL8;FB4e000000000000008f02000014000000ef104000000000004e000000000000005707000005000000ef104000000000004e0000000000000058070000050000", + "00L8;FF4a01084a6b01084aaab31738aae357382901084aabc31738abf35738a9d31738a90358384a01084a6b01084aaae31738aa1358382901084aabf31738ab235838BL8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab230100541e000014f4031faae00", + "313aa080c48f81f0500b1c1fdff54L8;FFa04700d112c3ff97e02b01b9a04700d10fc3ff97e02301b9a04700d10cc3ff97e01f01b9a04700d109c3ff97e01301b9a04700d106c3ff97e00b01b9a04700d1BBL8;FF202200b4e10b40f9e20313aaf90300aab0550194bb0700b4aa550194e0031baa2100805", + "2a3550194e01e00b4e12f40f9e2031baaf70300aaa6550194df0600b1L8;FFfbc342f9f5c742f9f7cb42f9e8631639a8fdff9008012f91e8d302f9e80180528083cf3ce8f304f94003803d57000014f5c742f9f7cb42f99b0280d21b00f0f2L16;FFe1ffc13de00b15ade003c23de207c23de10312ade00b", + "c23de1efc13de20313ade0f3c13de2f7c13de10310ade0fbc13de1e7c13de20311ade0ebc13de1030fadBBBL8;FFe00f0054680640f929040091e00315aa690a00f91b692138e10313aa93fbff97770a40f9680240f9080117cbbf0208eb480f0054680640f9e10316aae20315aaL8;FF1f0101ebe084005", + "4e8cf42f9090180522a04009109692138e1431691ead302f96e0e00949f0600b160a1ff54c0220291e14316919411009407fdff1780c20291BL8;FFadf50014f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091140040f9f30300aa9f0600b140020054610e40f93f0400b1400100548", + "10000b4L8;FF02000014bf3b03d5831c40b96100050a40fc5f887f00006b61ffff5441fc008880ffff35c300030a831800b9bfffff1766824039087c4093c61000127affff17BBL8;FF4083863ce09bc13d4283833ce293c13dfa3349f9e0ef843de08fc13d5f0700b1e1eb843de18bc13de0e3843de087c", + "13de2e7843de283c13de0db843de07fc13dL8;FF810000b4e0ef43f922008052aa350094a81240f9280700b4e1e341f9e2e741f9e8032a91e0cb41f9e34b40f9e45340f95fe4fe97fc4345f9e082c03ce9032a91L16;FF22008052acb50094da0500b4e05b40f9e1031aaa22008052a7b5009429000014e0", + "c31591cebeff97e0c31391bfbfff97fc031f2aabf9ff17d60000b4e06740f9BBBBL8;FBc50f4000000000004b000000000000007f0b00000e00000042024000000000006a000000000000005b0000002600000042024000000000006a00000000000000L8;FFe8031faa990a40f94901805209683f380805", + "0091e81700f9390800b4280340b20811c0da081540d2080d088b08250191281b488b08050091982680b978070034BL8;FF420342ad820302ad410340ad810300ade1b2ff5428008092680200f9a6fdff17e0feff9000a41391e2feff9042801491010680523e0101947ebeff175a010114L8;FF8002158be", + "1031f2a16060094d80e00f9f9ee03f9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6ff0301d1fd7b02a9f44f03a9fd830091010840a9BBL8;FFe80b40f9e86300f907eaff97f60300aae13300f937000014e08744a91f090071a1010054ea6340f9291d009148dd78920b000014e08744a908", + "008092686a00a9L8;FFf65741a9fd7bc3a8ab450014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aa810000b4600640f922008052L16;FFe9f301f9e9db45f9e86f00f9e8e745f9e0f7803de85f00f9e8eb45f9e8e300f9e8ef45f9eaa30aa9e8f345f", + "9ea0346f9e80700f9e8f745f9e83f00f9e8fb45f9BBBL8;FFa8031fb8b4f6ff97fd7b46a9f33b40f9ff030291c0035fd6ff4302d1fd7b03a9fb2300f9fa6705a9f85f06a9f65707a9f44f08a9fdc30091f40300aae00304aaL8;FF1f0119eb690d0054e00313aae2fdff972024003728fc60d3681000b520", + "0840921f1800f102110054217c0353211300343f0800718d0100543f0c007160020054BL8;FFc80080d2e00700f90800f0f2080900d18affff17e80b41b2e00700f907000014e90b41b2e92300a98cffff17c80080d20800f0f2080500d1e80300f9e0030091L8;ZDBBL8;FF42008052ac250194687240f9", + "a80000b4607640f901f97fd342008052a6250194687e40f9a80000b4608240f901f97fd342008052a0250194688a40f9a80000b4L8;FFa84300d1290000f02911269100fdffd000440691e8a700a9a82300d142fdffd042e00191e1230091e8a701a94621009440fdffb000002c915321009440fdffd0L16", + ";FFeb0317aaa1feff54f49200919f0215eb680a0054aba500940004805221008052a4a50094c00c00b42043c13c2143c03c9f0215eb010000ade2000054b79200d1" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines14 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines15.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines15.lean index 8dc355da6..3f11030d6 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines15.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines15.lean @@ -27,358 +27,250 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub15 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF310110cbf00110cb100211ca1002168a1f1e00f1c9030054ff010aeb881c0054f02100d11002168a1f2600b1c81c0054716a6f3812fd79d37002108be8032faaL4;FFe10309aa220080522300805224008052f4030a2a070000946ba240a9ea03142ae00740f9690240f9e10313aaeeff", - "ff17ff0301d1fd7b02a9f44f03a9fd830091L8;FF280900b4690240f9b40240f92901168b3f0114eb01040054690e40f9c9030037aa0e40f93f010aeb610300544a030037a90640f9290116abc20900546a0a40f9BBL4;FF3f0900b1610d0054737f609274eeffb577ffff170080c03cf6031baa1b0040f9", - "01800091e017803d080c40f9e83300f91d9f0194610600d17f0700b1e10a00f9L4;FF8502088b090100543f150071e1f8ff54a2c05fb85f1000f189f8ff54a3b05f3843f8ff35a30013cb7f0002ebe3f7ff54b70002cbe202403982f7ff35986a6838L8;FF749f009468a20191810100d021901c91a40100", - "b084e00891a363009142018052a80f00f96b9f00946b9f0094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1BBBL4;FF1f0000f1ad000054390300eb237000541803008b060000141f0400b1a16f005442df01941f100031216f005439feffb505000014e0430591810080523ddf0194L4;FB150200000", - "90000002d004900000000004a000000000000008c020000090000002d004900000000004a00000000000000aa010000090000002d00490000000000L8;FFea231fa90a2044a9e8cf00f90b2045a9e8c300f9084446a9e8ab00f9083840f9e8ab1aa90aa047a9eaa309a908dc48a90af840f9e8df00f9084c", - "40f93f030aebBL8;FFa363009162018052a80f00f9715f0194715f0194fd7b41a9f31340f9ffc30091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aac10200d0L8;FFf40800b4890240b22911c0da291540d2290d098b29250191891a498b29050091200108ab02080054e10313aab", - "0fcff97560300b4610a40f9680240f9b70640f9BBBBL4;FF200d010ea87301d10e0c805210000b8a426970fc438c202e7100669e32c201f2a00100545102c0da3112c0da110e518b31020b8a31fe0e9b5101118b20025ab8L4;ZFL8;FFf40301aae10309aa220080522300805224008052d3150094880a40", - "f9e00313aae10314aaedffff17e10300a9e00301aae10309aa220080522300805224008052BL8;FF737f019468620091010300d021c02991040300d084e01291e0030091a3630091a2008052a80f00f96a7f0194010300d0211828912403009084a02391a3630091L8;FF1f0500b160000054e16300915d9", - "2ff97954e40f9550300b4e11740f9e80f40f9964a40f91f0101ebe0860054e81340f9490380522a040091e00315aaea1700f9BBBL4;FFe183c53ce23b803de87b00f9e00705adc0f8ff54e08746adf55303a9f72300f9e083873ce08b45adc182853ce12bc03df63f40f9e083853cdf0600b1e283863cL4;", - "FB5f000000050000008a7a490000000000540000000000000065000000050000008a7a490000000000540000000000000073000000050000008a7a490000000000L8;FF8182079102328052f60303aae00701ad82024eadf7430891e307803de20302ad27bf0094e0a30191e10316aaad3a0094e8e30791e", - "0a3019182380094e8ff40f9BL8;FF29410591ea430191a8273da9a80200d008993091a82b3fa90a078052c8048052bf273aa9a90200d0292d2291a92b3ca9290080d2e92fc0f2a87f3ba9a8273ea9L8;FF004010912c3f00940001009000a01091263f0094ffc303d1fd7b0aa9f95b00f9f85f0ca9f6570d", - "a9f44f0ea9fd830291081c00121f090071e1010054e00302aaBBBBBL4;FFb50640f91f0101eb00040054680640f9490180522a040091e00314aa6a0a00f909692138e10313aa2efbff97760a40f9680240f9080116cb9f0208eb48030054L4;FFe8d740f91f0500f14b450054e1d740f9e0031caa2200805", - "2210f0094250200143a000014e0d7c53de1dbc53de0431391e2dfc53de037813de13b813de23f813dL8;FFc0035fd6ff0302d1fd7b06a9f33b00f9fd8301916902009029e12c91f30301aa290140f9e10300aa48078052a08300d1e2031f2ae8230039e90300f902fdff97BL8;FF353b40f9345341b92857", - "41b9e83f00b9550500b4363740f91d8f0194e00315aa210080521b8f0194e00b00b4e10316aae20315aae01b00f9218f0194364740f9L8;FFf44f03a9fd830091e90301aaf30300aa610100d021c81b91e8230091e00309aa420180526a8f009468820191610100d021481491840100b084600991e023009", - "1BBBL4;FF2c7000945f031bebe0030054e083c53ce183c33c0803138be283c43c5a07009173c201910101803d028100ade083c93ce183c83ce283c63ce383c73cfa1b00f9L4;FB2c8912bf6024cb6d8e4645aa04a478a45732a17fe142e672185dd2a9fd84b312de084da140c5774f26232f0583d8143455", - "57dad0491d752b732ca28cdf4ccddbL8;FFedab40a9e69f43a9e9474ca94f010014e0afc23de22300f9e20309aaeefb0ba9eb9b06a9e6030aaae1df00a9fcbf00f9fba31da9280200d0ef3300f9e56f00f9BL8;FFc0035fd620008052e10314aa3c4f0194ff0302d1fd7b07a9fdc301916a2440a9681040f", - "90b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1L8;FF1f0500b160000054e02b40f984e9ff97f3d351a9940100b47522009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f922008052184f0094BBBBL4;FFc0035fd6ffc301d1fd7b04a9f52b00f9f44f06a9f", - "d030191e20301aae10300aae0230091f30308aab8e9ff97e10740f93f0c00b101020054e00b40f9c4d7ff97L4;FB617373657274696f6e206661696c65643a207071725f6b65792e69735f6e6f6e6528290000000000d69548000000000032000000000000002800000011000000L8;FF8d0100543f0c007", - "1200300543f100071800300543f1400710105005481c20091e20313aaf6edff97200400b46d0000143f040071000300543f080071e1030054BL8;FFa2008052646f0114090040f9e80300aae00301aa3f0500b1e0010054ff8300d1fd7b01a9fd430091e10200d0218029910403009084e03691e32300918", - "2008052L8;FF4901805209692138ead302f90f240094e1431691b60c0094e09b49f9800100b4e1d342f9e8cb42f91f0101eb203f0054e8cf42f9090180522a04009109692138BBBL4;FFe80300d008b140f9680300b4e82300916903009029010391e82701a928008052690300d029b11491ea430091a07f", - "0091e82706a9680300b008591c91e82b08a9L4;FFa8035ef81f0500f140040054b4835ef8e8ffff171f25007181010054755200a9790a00f9ff074091ff830091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L8;FFc11300b496fa7fd321af0094e00316aa410080521faf0094c01500b4f48300a929", - "0080529f0600f109000079e90f00f9a01300541504007941008052f70100d0BL8;FFe8c3179160630291cf55ff97e8c357391f050071002c0054e9c31791e8c757392021c03c2121c13ce02b833de12f833dc82c0036e8830291e02bc33de12fc33dL8;FFe82b40f92003803da80318f80c000014e8a744a", - "9c00000f000f02f91a1a301d1a8a738a9a8e301d129fdfff029312491a8a739a9a84302d1482f0094684e41b9BBBBBBL4;FF3f0400b140020054f30300aa810000b4600640f92200805221170294610e40f9810000b4601240f9220080521c170294611a40f9c10000b4601e40f922008052L4;FFe037813", - "d54c9ff97e9bf5339e84353390a088052e0074091fa8309912a15003308111d1200401d91e8431339e8830991eabf1339e037c13de13bc13de0d7853dL8;FFf65741a9fd7bc3a8c0035fd6280080527f7e01a9680600f9680200d008e10c91680200f9f44f42a9f65741a9fd7bc3a8c0035fd6680200d008", - "a11d9169d600a9BBL4;FFe283853ce083863c3f0500b1e183873ce00746ade81b00f9e08700ada0000054e0074ba9e80313aaf43100941200001417970194e00580522100805215970194L4;ZBL8;FFa3630091a2018052a80f00f97197009471970094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1f", - "d7b01a9f31300f9fd430091e90301aaf30300aa81010090BBBL4;FF817e40f93f0400f18afcff54e6ffff17089440f91f0500b160000054014001b9c0035fd6fd7bbfa9fd030091c00300b000c03891c20300b042803991c1058052L4;FB6f6e3a20c0000a4b6579206a756d703a20c003202d20c0000d4b", - "6579207472696d6d65643a20c000174b657920616c7265616479207265717565737465643a20L8;FFe4df03f9e8cf03f9e8d740f9f4e303f9e8db03f9e8df40f9eceb03f9e8e703f9e8af40f9feff03f9e8ef03f9e8c740f9ea0704f9e8f303f9e88b40f9f20f04f9BL8;FF2200805226570194e18349f98", - "10000b4e08749f92200805221570194f4ab49f99f0600b1a0baff54f5b349f9f3af49f9551600b47622009104000014b50600f1L8;FFe80b41b204000014c80080d20800f0f2080500d1e0833291e85306f9114dff97f50300aa3d010014f9a345f9f5a745f9e0c32791f3ab45f90163009102288052BBBB", - "L4;FF820a803d68920039f44f49a9f65748a9f85f47a9fd7b46a9ff830291c0035fd6000180520103805235f70194000400b000601a9131f70194ff0304d1fd7b0ca9L4;FB66632f6f75742f7369676e616c2e70726f746f2e66696e6765727072696e742e727300000000000028914800000000004c0000", - "0000000000e200000014000000L8;FF880080d2e10700f90800f0f2aaffff17e80b41b2e00700f9a7ffff17880080d20800f0f2080140b2a3ffff17880080d20800f0f2081100919fffff17e00300f9BL8;FF08010aaa69a200a908008092e03340f9680200f99a0000b4e1031aaa220080521f770194b70", - "000b4e03740f9e10317aa220080521a770194e12f40f9810000b4L8;FFe00315aae10314aa2200805224770094e1e34df9810000b4e00317aa220080521f770094e1074091e0833791023f80522180099122770094000740ad08434079BBBL4;FF7f0208ebe8140054130100b4e81b40f9e1031aaae20313", - "aa0001148b28b701949402138bf41f00f9bf0214eb200f0054e81b40f98a060091e1a30091e0031baaL4;ZDL8;FFf44f01a9fd030091140040f9f30300aa62000094682a41a989020acb1f0109eb49030054890208cb6b0240f94a0109cb3f010aeb890100546c0114cb9f010aebBL8;FF4a1540d24a0d0a", - "8b4a2501914afd46d329010a8b290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b42a0140b2L8;FF2900009029d12191e84b03f9e80000b008613b91e94f03f9c904805222008052e8eb01f9e8f301f9e80000d008210291f62309b9e9ef01f9e9f701f9e", - "8fb01f9BBBBBL4;FF0f02c0daef11c0dacf0d4f8bef010a8aeffd199b0f010f8bf18156b89f02116b000300540f0600d1f00110eaa1feff54bf0500f10001005422a8200e4b00669eL4;FF000280520101805222070094000100b4810000d021c03a91130000f91f200039f30b40f9fd7bc2a8c0035fd600", - "0180520102805232070094fd7bbea9f44f01a9L8;FFfd7b42a9ffc3009163070114a9240091410200f021001891a9831ff8490200f02b811791a92300d1430200f063481891460200f0c60017910a018052470200f0BL8;FF4a1540d24a0d0a8b4a25019129194a8b29050091280108ab02080054699640f", - "93f0500b1c00300546a4241b9699e40f92a0600344a0140b24a11c0da4a1540d2L8;FFf8ff12a9faff15a9fcff18a9e0ff1ba9e201005460220091e123019102308052278700947f0200f97f8a01b9ff430791f44f45a9f65744a9f85f43a9fa6742a9BBBL4;FF090080921f0d00b1692a00a96800005422", - "00805222c70194080700d11f0d00b1a8000054e00319aae10318aa220080521bc70194c80600d11f0d00b148f9ff54L4;FB797074656420c00e206d6573736167652066726f6d20c02720776974682050524556494f55532073657373696f6e207374617465202862617365206b657920c0L8;FFf94740f9", - "e3b7803de87700f9e8008052400545ad6a5142784941092a6a1142b8e00718ad6181ca3c6081c83c5b8109aae9635e39eac35e39e28714ad6181cc3cBL8;FFf6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a94a240094e0230091f7a700a947240094e00313aae1031faae20314aa1a", - "070094770a40f9L8;FF080d088b0825019108fd46d308050091091c40b909050034290140b22911c0da291540d2290d098b2925019129fd46d3290500910a0840f94a0400b40b0440f9BBBBL4;FFe10315aa0204805224008052e8830239ee4900949f07003100260054f4de40a9e2031aaa600740ade003", - "14aae10317aae00705ada50100941f0400f1c1230054L4;FB38de4800000000003dde48000000000049de48000000000054de4800000000006caa4800000000005fde4800000000000d000000000000000700000000000000L8;FF56ffff1740eeff54bc010014c0c200916230009472ffff17e8af40f914", - "0101eb02010054e7000014c1720091a2c303d1e2e8ff97802100b5e1031faa812200b5BL8;FFb30f00f97367019473670194fd7b41a9f31340f9ffc30091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aae102009021682c91e8230091L8;FF603640f92200805225670094b40000b", - "4600640f9e10314aa2200805220670094610e40f9810000b4601240f9220080521b670094611a40f9c10000b4601e40f9BBBL4;FFf85f42a9fc6741a9fd7bc5a8c0035fd6091440f93f8100f1c1020054091040f92b9140b82a1140f82dd140782c0140390b1101b82b7d40390a9100f82af140f8L4;FF22", - "0080d2010000d4e00303aa04000094f30b40f9fd7bc5a8c0035fd6fd7bbea91f0440b1fd030091f30b00f9f30300aa88000054f30b40f9fd7bc2a8c0035fd6L8;FF82011ccb350302eb62f8ff54b5c303d1e10740f9e20319aaa0021c8b28a700948803190bbcc303d1a8f314387fff03f160030054a8f35", - "43869070011e9830039BL8;FFc0010035a003de3ca8035ff8e003803de80b00f9e003c03de80b40f98002803d880a00f993620039f44f47a9fd7b46a9ff030291c0035fd6800200b000c03e91L8;FF096100b9fb0800b4a8035ef81f011ceb80080054560b40f9586340b9360500b4540740f91a270094e0", - "0316aa2100805218270094000c00b4e10314aae20316aaBBBBBBBL4;FF0800669e15c10192f50000b5808f40fc5a2300910088202e0800669e15c101f260ffff54a802c0da0811c0da560f488be80b40f9091716cb000540a9228100d1L4;FFf65756a9f85f55a9fa6754a9fc6f53a9fd7b52a9ff030691c", - "0035fd6e01fc03de08301ad170100b4e00318aae10317aa22008052f80308aa191b0094f7031caaL8;FFf85f41a9fd7bc4a8effdff1734f87f92560014cbd50213ab82050054a9fe4ad30a0880522911c0da490109cbea0080523f1d00f129318a9a2a0080525f0014ebBBL4;FF6a030a4afb064039eaf21", - "f389c031e4a0801094ae90a4039fce21f38e8020039e80e40396a030b4a29010c4aea060039ea124039e90a0039e916403908010d4aL4;ZFL8;FF80010054082100913f11007121030054e80300f9a10100902100159118000014e80300f9a101009021d013911400001408050091a101009021681491e80", - "300f9BBBL4;FFa08303d1e237c83de33bc83de1430591e43fc83de9820039e1830aade28f0fade227c83de32bc83de487803de433c83de28f0dade22fc83de317c83de013883dL4;FB746564726571756972656454686972747954776f4269744465636f64654572726f72000000000000a0544400000000", - "0030000000000000000800000000000000L8;FFf5a742f90001c03de85f42f9e82f14a9e86342f9eb9342f9e0c7833de81300f9e86742f9e89f00f9e88342f9e84300f9e89742f9e87b00f9e89f42f9e8d300f9BL8;FF21c035912e5b0194e00fc43de113c43de0074091e82b48f9e20bc43de1074091e08", - "f843de0ffc33d00800991e193843de103c43d21800191e07f843de007c43dL8;FFe01340f922008052255b0094f44f57a9fcab40f9f65756a9fd7b54a9ff030691c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091BBBBL4;FF0800669e0ec101f2e1f9ff54f4ffff17fb130", - "0f904000014618300d1e0830091f48d0094e00741ad28008092880200f9280080528082803c8182813c68820039L4;FB6172792f616c6c6f632f7372632f7374722e7273002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d3139343963663863366235L8;FF880080d2080", - "0f0f23f0108ebc10d005481220091e20313aa060b0094f50300aa450200143f0900b1800f0054880080d20800f0f2081500913f0108ebe10e0054BL8;FF94a22391010300b021343791a3630091a2028052e40314aab30f00f96d7b019468620091010300b021fc3491a3630091c2028052e40314aaa80f0", - "0f9657b0194L8;FFe0630091220080522300805224008052d491ff97e11740f9e2fbff17e0630091220080522300805224008052cd91ff97e11740f91dfeff17e063009122008052BBBL4;FF691200f91a000014480080d27a4200390800f0f20869009115000014e80741b2a06301d1a8831af80eb10094", - "f50300aae00315aac6a3ff970b000014a8835bf8L4;ZBL8;FF810000b4602a40f92200805224bb0094610240f9810000b4600640f9220080521fbb0094610e40f9610200b408048052606a68f822008052f44f48a9f65747a9BL8;FF09fd46d30800098b080500911f0109eb28170054e4000014080c43f8", - "1f0900b1010b0054f3031faa64000014e80300aa098d40f83f0500b180160054f30300aaL8;FFf7eb41f9c90080d2f8ef41f9eae343b90900f0f2e8a30f39ece743b9e8fe48d3faf741f9f45740f935190091f9030891eb032a9198030014fb5f00f9c86d0135BBBBBL4;FF680240f9080116cbbf0208ebe", - "8150054680640f9e10314aae20315aa0001168b270b0294c802158b680a00f9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8L4;FFe103022af30303aaf4020094e0630091e10313aaf0040094e1030091e2630091e00314aa54e6ff9728008092a80200f9f44f45a9f52340f9fd7b43a9ff830191L8;F", - "F010280523e0b0194080040f9a80000b4000440f901e97bd302018052200b0114c0035fd6010040f9810000b4000440f9220080521a0b0114c0035fd6fd7bbea9BL8;FFfd7bc4a8c0035fd6f55355a9e8430591f6b340f9e00300910161009102288052278b0194bf0600b1c0020054e0430591e10300910", - "2288052218b019417000014L8;FFc000805241008052228b0094006800b4c8009e52138301a908080079e800be52080000b9131700f9198b0094c000805241008052178b0094a06600b468008f52BBBL4;FF38b7ff97a1035ef80200001421008052a8035df81f0101eb201b0054a8835df8490280522a04", - "0091e00318aaaa031ef809692138a1c300d12ab7ff97b7035ef8L4;FB08000000000000003cfa4500000000003b1a4900000000004e00000000000000f9040000190000003b1a4900000000004e000000000000000105000014000000L8;FF27cb0094e8031faae9031faa291d4092340108aaf2010014df", - "0600b1a04200546003c63ce1d302f9e1c31591e0d702f9e0831d91ef7300f9eeeb00b9eccb02f9BL8;FFf65742a9fd7bc4a8254b0114f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6fd7bbea9f44f01a9fd030091140040f99f0600b1e0030054012440f9f30300aaL8;FF00400f91294b0094ff8300d", - "1fd7b01a9fd430091e80301aae00700f9010100d021201091040100d084a00f91e3230091e00308aa620280525b4b0094fd7b41a9BBBBL4;FFff3f0439e80314aa02fd47d314dd799218194092020100b4e82755a960020291e10317aa080102ab2935899ae82715a925eb0194e0430291e102148be20318", - "aaL4;FB804c420000000000000000000000000008000000000000000800000000000000804c420000000000000000000000000008000000000000000800000000000000L8;FF760a40f9680240f9080116cb9f0208eb08080054680640f9e10315aae20314aa0001168b26eb0094c802148b680a00f9f44f", - "43a9f65742a9f85f41a9fd7bc4a8BL8;FF08008092686e00a901ffff17e0c3c73cf70b00b9e00f803dbc0000b4e0031aaae1031caa220080521d6b0194e0e30191fb3f00f90954ff97e81740b9fa5f42a9L8;FFff030291c0035fd6ff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e", - "2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9BBBL4;FF2909c05a7f9302f8e82712294809c05a6b09c05ae92b5c29e82f1329220080527f1302f82809c05a4a09c05ae92f5d29e82b14292809c05a6909c05ae8271529L4;FF0dc070d36b0179920ffc4ed30c020c0a10b46dd3cb01", - "0baa2e017cb229018e9aed030d2a0e0090526b650daa1f020f6a2d017db210009052ad11899a89010f6aL8;FFe1031faab5833ea9bf831ff8a8835ef895274078080101cb1f0500f109010054a806c05a08682178210800917b0700f1a1831ff8c1feff540d000014a06300d1BL8;FFfb6304f9020140ade", - "8031691f56704f9f76b04f9428309ade90300f9555fff97e8c342f9200bc03dfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1c082873cL8;FFff0316b9e84b00b9592a0094e80356b9e00740918100805200001891ff0316b9e84700b9522a0094e80356b9e00740918100805200001891ff0316b9e843", - "00b9BBBBBBL4;FFf4030caa3a060094e10340a9ec0314aa2aa040a9536928380bfc71d308050091290040f9280800f94bf2ffb4ddffff17e10300a9e00301aae10308aa22008052L4;FFdc7d1853f003182ad3050014f8db40f93f09007141380054e87342f90a0180d20a00f0f209dd78924a0140b2c001", - "0014f8db40f936008052e00b4091e82303b9L8;FF09fc5cd30c2c08330a0500390afc54d3090d003909108052293408330b0900390bfc4cd30a1100394a0040b909210039490840790b1500390c19003901250039BBL4;FF9b03805212000014371b40b934008052e82f40f9490700d13f0108eba0040054", - "88031b8b18a301f17b83009115411ef839a3019116c11ef815411ff814dd3f29L4;ZDL8;FF4901098b200108aba2010054f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6600100f000201e911f930094600100f000e01e911c930094800100d0BBBL4;FF0a01098b290500915f0117ebe90f00", - "f9eb33979a4a010bcb4b01199b7b0100f9a1837bada203d63c6281803c6081823c6181813caa035cf8a2037dada103d93cL4;FBc80edefa5788cdc1dab2eacc85377a8be8b5beb2cebd33236d7fcfe1221e893d1ef33c3308ae05b60000e32f536492bad99bf75aca140a0f60a97adc044a0805L8;FFe90b", - "44f9e2a712a9e91344f9e98f00f9e91744f9e92b14a9eb9b44f9ea1f44f9e9a744f9ea9f00f98ae20791f43744f9e92b07f9e92344f94001c03dea5f44f9BL8;FFf90b40f9fa0740915a830991e8d302f97f0700b1fb0314aa806dff5440c30391d1000014e8031faa00011aab62570054e1431691c60c00", - "943f0700b1f90b40f9L8;FF275300949f0b00b14102005435030036e0a350a9e20313aae17740f9081540f900013fd6e06b01f9e8c31791e16f01f9290c40f9e1830b9120013fd6fcfb42f9BBBBL4;FF880b0091a0031df805000014e90b41b2a9a33ca903000014880f0091a8831cf8a0e300d10fe90094", - "e12b40f9280400d11f0d00b1e8000054e82f40f9f70300aaL4;FBabd9831f19cde05b6b796265725f7072655f6b65795f7369676e61747572652069732072657175697265646964656e746974795f6b6579206973207265717569L8;FFa20a0054017c0353010d00343f04007161fdff54890240f93f0900", - "b161000054970200f99f1a00f91f0900f1e10c0054e00313aad6f2ff9780000036010a00b5BL8;FFe00316aae10318aa2200805224730194e0c30191f93b00f9105cff97e81f40b9f61340f9f93b00f91f05007141040054e0c30191095cff97f80b40f9f93b00f9L8;FFe80740910881099100210291ed0", - "b0094f4b749f99f0600b100b8ff54f5bf49f9f3bb49f9b51300b47622009104000014b50600f1d662009100130054c1825ff8BBBL4;FF3f040071c1faff54a8035bf81f0500b1c0010054a14301d1a26301d1eb9cff9760faffb47a000014a8835cf81f0500b1a0010054a1620091a26301d1e39cff97L4;", - "ZBL8;FF1f010aebea338a9a08010acb0a0e805216250a9bf50316aaa88e46b89f02086be9979f1a29219f5a291d0072a01600542a4c40b93f050071610300548902086bBL8;FF080540f9150101eb232c0054a88357f8080540f91f0115eb290b0054a02302d13aecff97a033003728fc60d3a81000b5200", - "840921f1800f162110054217c0353L8;FF21843d9102028052e30000b063400691a4028052af000014c80080d2e0232a39e0032a910800f0f2ff272a39e84305f90c29ff97e10300aae14305f9e0032a91BBBBBL4;FFff430191c0035fd6000400f0006032913703029437030294080040f9290040f90801", - "40f9291902cb000540a9220101d16efeff1708328052090040f92a0040f9L4;FFe92344a9ead701f92a028052e1e30191e2430c91e4031baafa5700f9f6a708a929008052f6e30191e99701f9890000b029413191e9ab01f9890000b029cd2f91L8;FF810000b4600640f92200805224030194610e40f981", - "0000b4601240f9220080521f030194611a40f9810000b4601e40f9220080521a030194612640f9810000b4BL8;FFff030191c0035fd60820009109800091020300d042d83e91e82700a9e8030091090000b029f11991200440a9e82701a9e8230091090000b029211f91e82702a9L8;FF4a1540d24a0d0a8", - "b4a25019129194a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091BBBL4;FFf70f42f9f81342f9e023009101810091022a80522ac30194bf0600b161f2ff54e2ffff17f4c342f9c1ffff1748008052c90a0091e0031639e807163", - "9e9bf02f9L4;FB6a000000000000006e0000002e000000e4674900000000006a000000000000000200000026000000000000000000000008000000000000000800000000000000L8;FFe86f40f9790600f97a2201a908008092e4f5ff17ba0000b4e00315aae1031aaa220080521ec30094e16f40f981000", - "0b4e04740f92200805219c300949b0200b4BL8;FFf65702a9f44f03a9fd030091f30301aa210840f9f50300aa680240f91f0101eb800b0054680640f9b60a40f92a040091b41640f9490280526a0a00f909692138L8;FFea0740f9e81740f92015c03df87f00f9eaa30ea9e89341f98082823ce8bf00f972", - "ffff17080100900881209189028052e86301f9e96701f9f2feff172143c23cBBBBL4;FFcd000054390300eb43f000541803008bf9feffb50f0000141f0400b1a1ef005442e301941f10003121ef0054f9ffff173fe30194f70300aa1f0400b141fdff54L4;FB8be848000000000038000000000000004900", - "00000a0000008be84800000000003800000000000000520000000c0000008be84800000000003800000000000000L8;FFe0030054e0830591e1030091022c80522be30094fa031f2ae8f340f91f0d00b141160054e1b340f9280080527f2200a9080080923f0400f17f2201a98b000054BL8;FFf40302aaf", - "303012af50300aa2063019400038052010180521e630194400100b4155000a9e10200d021e03791131000b91f500039f44f42a9f50b40f9fd7bc3a8L8;FF770a40f9680240f9080117cb9f0208eba9faff54e00313aae10317aae20314aa08070094770a40f9cfffff17a8831ff8a84300d1290000f02921", - "0791200100f0BBBL4;FF000400adff074091ff830a91f44f42a9fc0b40f9fd7bc3a8c0035fd6eb0f41b205000014eb1741b2030000144b050091ea0309aa09c480520b2900a9090900f9L4;FF5c0080d2f4031c2ae0ffff17e00318aa860080d2e3ffff172700805205008052c30210913ffc0371800a005", - "42104001161400e39bf7e0071e1c79f1a3f00356aL8;FFc0035fd6080040f9e00301aa094540b83f050071e1010054ff8300d1fd7b01a9fd430091810100f021cc1491a40100d084c01c91e323009182008052e80700f9BL8;FFe00301aae803009168230194740100b49302009073423491e0030091a163", - "0091e20313aab50f00f9b506009160230194940600f121ffff54e00300915d230194BL4;FF2200805226230094c1825ff8e1feffb4c00240f92200805221230094f3ffff17880240f9280100b40805088be00313aa01ed7cd302018052f44f42a9f65741a9L3;ZBBBBBBBBBL4;FF0a00669e2afcffb5f9ff", - "ff17200340fd00a8200e0800669e0801c0da0811c0da09fd43d3dfffff17220000f042d00f91e1a30091033280522e79009414008092L4;FFf6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd6c000009000402491351d0094ff0303d1fd7b06a9fb3b00f9fa6708a9f85f09a9f6570aa", - "9L8;FFe00316aa0103805202018052241d0194f90215cb330313ab420b005408ff4ad3090880520811c0da280108cbe90080521f1d00f10831899a29008052ff0215ebBBL4;FF1f0500f160160054f643029108088052f7030091c082c63cc182c73cc282c23ce00703adc082c33cc182c83ce20301adc28", - "2c13cc082c53ce123803df9ff4039L4;FFa27c4093480c80d2011080d2030080d2010000d41f9800b160000054a500070b08000014e00304aa010080d2010000d4fbffff17bf3b03d5e503002a05feff37L8;FF810100d021bc1691e8030091e20080526f9d009468c20091810100d021481491a40100b08", - "4600991e0030091a3630091a2008052a80f00f9669d0094810100d0BBBL4;FF60300035e85341b9e81b00b957ffdfc8770000b546dd0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1L4;FB49000000000000009b0000001e000000390949000000", - "000049000000000000009c00000020000000390949000000000049000000000000009200000018000000L8;FFe83f40f9e87704f9e9235ea9e97b04f9e88304f942260094e8f741f9eafb41f9e9f341f9eeef41f9e1eb41f9e8e700f9e8ff41f9e82b17a9e80342f9e9231fa9BL8;FFf70300aa192c81527", - "b8309912c5d0194e007409168030291e10316aa00802f91e20314aa030880521b088052bf9f0094089080520083c23cf54f09f9e84b09f9L8;FF2a040091e00315aa6a0a00f909692138e10313aab6faff97760a40f9680240f9080116cbbf0208eb48060054680640f9e10314aae20315aa0001168b205d", - "0094BBBBL4;FF090140f9087140f8090000f9087000f8080380d20800f0f20f000014680640f9000540ade00700ad35835ff828835ef8bf0208ebc002005428035ff8e00740adL4;ZFL8;FFe3fcff9720020037750240f9a80640f9160101eba2020054e80f41b2e81300f907000014c90080d248008052e", - "0a300390900f0f2e8a70039e91300f9e0830091BL8;FF03800091a9831ff8a52300d1e00308aa82018052767d0194fd7b42a9ffc30091c0035fd609200091210300b021b80091040300d084601291a32300d1e00308aaL8;FFc7000014e8031faa000116abc2660054e16300916f7dff977f0600b1800000", - "5480220291e1630091f392ff97bf0600b180adff5481220491e263009140008052BBBL4;FF29910491890600f989008052aa0301d1a8031cf8880300d008b11491e9a304a9890300b0297d2591e9ab06a96a06805229048052ffa301a9880300b008150a91L4;FB4c874900000000000e00000000000000e", - "c0000002c0000006368756e6b2073697a65206d757374206265206e6f6e2d7a65726f7369676e65642d7072652d6b65L8;FFf7e345a9e083c03ce8d343a9e183c13ce10315aae283c23ce43740f9e30318aac0860cadc26e803dc8e200f96f160094b70000b4e00318aae10317aa22008052BL8;FF0811c0", - "da081540d2080d088b0825019108fd46d308050091090840f9290b00b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091091440f9L8;FFfd7b42a9ff030191c0035fd6e0031faa303d0094e00741a92e3d0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091f", - "f8331d1ff0300f9BBBBBL4;FFe00313aae10317aae20315aa230080522400805236000094770a40f9680240f9080117cbbf0208eb49ceff54e00313aae10317aae20315aa2300805224008052L4;FFec0319aaeb0316aae9bf40f9f6c740f903000014e9030a2af603022ac85d0012ea5d1853e903092a08", - "7d60d31b1e48b3298117aaca1e40b3e0431391ec6b02f9L8;FF680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091150840f9080040f9f40302aaf30300aa080115cb5f0008eba8010054BL8;FF658d0114000040f9080040b9080500511f1d0071a80100546918805", - "22925c81a49010036490300d029c10f91e00301aa225968f8490300d029c11091285968f8L8;FFe1825ff881ffffb4e00240f922008052238d0094f8ffff17d50000b4a806158be00314aa0201805201f17dd31c8d009408008092684600f9f44f43a9f70b40f9BBBL4;FF230080522400805239c0ff97e1", - "2740f904ffff17e0e30091e10318aae20316aa230080522400805231c0ff97f82740f9e81f40f9080118cbdf0208eba9e0ff54L4;FB652065786163746c792033322062797465730000000000008e194900000000005700000000000000dc0200001200000070745f7665632073686f756c64206265L8;FF", - "760740f9df0a00b1c03a0054df0600b1803a005475b742a9681f40f97ad341a9780b40f9e84f00f9fb030daabaa400b417cd0094e0031aaa2100805215cd0094BL8;FF020d05ade90b00f9bc0000b4e0031baae1031caa22008052214d0194fbe30091a80302d1e10316aa60c30291bc0302d12f690094a8", - "0358f81f0500b120120054L8;FFd80100b5c3ffff1737008052591740f9b7831ff859fcffb535008052572340f9b6831ef8b8431fb877fdffb534008052582f40f9f8f6ffb4532b40f9144d0094BBBBL4;FFc0feffb4e10317aae20313aaf40300aa2bed0194e8230091a082009197c60094f50f40f97501", - "f8b6f9031faae00319aae10315aa27ed019434008052e8230091L4;FBdc224000000000001800000000000000080000000000000050ff420000000000000000000000000008000000000000000800000000000000347e420000000000L8;FF09000014e00300f9210200d021541b91230200d063ec1491e0", - "030091e20080524400805251e2ff97e10340f96affff17fd7bbda9f50b00f9f44f02a9fd030091BL8;FFf85f12a9f65713a9f44f14a9fdc30391370c40f9882489d24892a4f2e9e279d32849d2f28824e0f2341117cbff0208eba9000054f5031faae00315aae10314aaL8;FFfad342f9fc0740919c83019", - "1dffdff17f80300aae04316912200805209110094e1d342f9e00318aa02feff17e04316912200805203110094e1d342f913feff17BBBL4;FFa80319b8a88317b8681200b908e342f8a9c31778692a00796a6201f868e201f808008092f51340f9685e00a974fdffb5eeffff17ff8303d1fd7b08a9fc6f09a", - "9L4;FF680a00f9f44f44a9f65743a9fd7b42a9ff430191c0035fd6e0230091f40301aae1031faae20315aa4fffff97e10314aae05341a9eaffff17080040f9680000b4L8;FFa0024079e103132a1f050071e1f5ff54e0ffff17f44f47a9f65746a9f85f45a9fa6744a9fc6f43a9fd7b42a9ff030291c0035", - "fd6c201009042c02d91e00304aaBL8;FFe8f304f910010014f68740f91f0700b1e014005420afc03de82344f9f4630191e9c7009180c20391e1e31b9120f18f3c8942039102278052f86f11a9f55f12a9L8;FFf5e742f9f4e342f9e8e3163949008092a80240f9690200f9680000b4e00314aa00013fd6a1", - "0640f9810000b4a20a40f9e00314aa1a2d0094e8a340f91f0500b1BBBBBBL4;FF2a150294ff4301d1fd7b03a9f44f04a9fdc300911f1c007280010054c80080d2e0230039ff2700390800f0f2e0030091e80300f90b0b0194f44f44a9fd7b43a9L4;FF28008052e0230891e143139142008052e96b02f9e8", - "6f02f9f67302f9f77702f91e0d0094e1b34bf9810000b4e0af4bf9220080521a150094571a00b5d5000014L8;FF0d7d80526bfd44d36cb10d9b0d488852ed01a0728c7d0d1bea030a2a1fad01a90a0900f92a00805209b100390c2900b90a7d00a9c0035fd61f7d00a9c0035fd6BBL4;FFe137c03de23bc0", - "3de33fc03de31b803de217803de113803de00f803d88024039e94340398a064039eb4740398c0a4039ed4b40392801084aeeb740398f7a4039L4;ZBL8;FF0825019109fd46d30800098b080500911f0109eb88130054bd000014080c44f81f0900b1c1090054f3031faa5a000014e80300aa098d40f83f05", - "00b1e0120054BBBL4;FFe0830091bf3e0094e82340b9884b0037e81b40f9aa0640f9490108eb035b0054aa0240f9e01740f94801088ba82600a9a88355f8080540f9150100ebe2000054L4;FB5369676e616c5f5051434b415f56315f4d4c4b454d3736383a656b686561646572000000000000004120490", - "0000000005600000000000000ed00000009000000L8;FF1f0500b1004d0054e0031d91e1c33991e3e33b91e20314aa5a160094e8a343f9f9a743f9e9ab43f9eaaf43f91f0500b140820054e0e3c13de1e7c13de2efc13dBL8;FFe8d302f93f0700b1c01d00540023029104190094080040b20811c0da0815", - "40d2080d088b0825019108fd46d30900088b3a0500915f0308eb681c005406010014L8;FF7f0208eb61000054e06317911e8cfe9708068052e02fc13de133c13de237c13de9f342f96826089b0dfcff17e8c31291fb8302910081c03ce86742f9a003983cBBBBL4;FF600500b408a30591e003c03de10315", - "aa085800a9080400f008e13b91170800f90080813c1fa0003960a202a9090d40f9e843009120013fd6e80b40f91f0d00b1L4;FB73736167656465766963655f69645072654b65795265636f72645374727563747572657075626c69635f6b6579707269766174655f6b657950656e64696e674bL8;FF4302", - "009063901c91e00300914201805244018052e5ffff17e00300f94102009021ec1c9143020090635c1491e0030091c2008052840080521a000014e00300f9BL8;FFa3630091e2008052b30f00f9717501946822019101030090219c2791040300f084a01491a363009182018052a80f00f968750194684200", - "910103009021e42791L8;FFe8031faa160114ab020d0154f47349f99f0e00b161000054e8031faa0d00001400030291552a0094080040b20811c0da081540d2080d088b0825019109fd46d3BBBL4;FFf503082a020315cb386540a93c0302eba3070054350200340803028be10318aae80300f9e80301910", - "001158b24b50194683340f960030191e103019122008052L4;ZDL8;FFe91640f9ea3240b939c30191fbf201a9e91600f9e93240f91f0119ebea3200b9ea6a40b9f4ce03a9f6ea04a9eca605a9ea6a00b941fcff54f40740f9b6577ea9BL8;FFe90b40f9e8c30db9e81b40f9e9eb06f9e96740b9e8e706f9e", - "8ef06f9e81f40b9e9ef0db9e93b40b9e8e30db948008052e9f30db9e99f40b90801981af49706f9L8;FF21c43c91020180520209803d000500ad82050094f6e741f9e8df41f9df0208eb61000054e0e30e91176cfe97e8e341f909068052c822099be9030891200543adBBBBBL4;FF017c0353e10500343f", - "0c0071c00100543f08007120faff543f04007181020054e94b40b949000037f52700f981d20091a2630091e003082af3efff9700faffb4L4;FF0ce6ff97e10f40f98effff17e0230091e10316aae20314aa230080522400805204e6ff97f60f40f9e80740f9080116cb9f0208eb09f2ff54e0230091e1031", - "6aaL8;FF8c02001400200091f44f42a9f65741a9fd7bc3a814030014e80300aa098d40f83f0500b1a0000054f30300aae00308aa48030094e00313aa144440f99f0600b1BL8;FFc00300540a6040b9092c40f9ca0700344a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a050091090100b42b", - "0140b26b11c0da6b1540d26b0d0b8bL8;FFa88359f82001803d280900f9e83340f91f0500f1ab000054e03740f901f97fd3420080521e850094e83f40f91f0500f1ab000054e04340f901f97fd342008052BBBL4;FFa8835ef8ca060091a18300d109048052aa031ff8607d40930969363831b1ff977f060", - "0b120030054a1035ff8a8035ef81f0101eb00120054a8835ef849058052L4;FB756c206465637279707420616c776179732068617320612076616c69642062617365206b657900003b634900000000003800000000000000ab0100001e000000L8;FF78a21aa9e85340f960828f3ce08b53ad6aa21ba9e87", - "340f961828e3ce19bc03d61a21da9e86340f9e1c3039160828b3ce093c03d7ca21ea9e9a346a961828a3cBL8;FF1f1900f1a21a0054017c0353c11a00343f0800716c0100543f040071600700543f0800716106005481620091e003082ae20313aa57fdff97200700b4fa000014L8;FFe8070036e00301aa", - "f44f45a9f52340f9fd7b43a9ff830191c0035fd68000805206000014e00313aa6a050094e80300aae00301aaa8fe0737680240f9090540f9BBBBL4;FFe0040054c40400b40a0100ab090002cb150003cb4821889a960009ebc90400541f0104ebc2060054f70302aa9f0015ebc90a0054380115cbc9e279d", - "3f40301aaL4;FB6174656420617420c00129000d4964656e74697479206b657920c023206973206e6f74207472757374656420666f722072656d6f7465206164647265737320c0L8;FF94fe55d3680240f9bf0208ebc104005423000014680240f9897e1553bf0208eb3961193261000054e00313aa6ee40", - "094680640f998fe63d319693538d5120091BL8;FFfc6f0ca9fa670da9f85f0ea9f6570fa9f44f10a9fdc30291f30308aa08008092580080d2e82b00f9e8c300911800f0f2e00703a9ff2300f9ff6b00b9a8031cf8L8;FF810000b4602e40f9220080522465009460c20191f30b40f9fd7bc2a8aefeff1760", - "2200917800009460220291f30b40f9fd7bc2a8a8feff17610640f9810000b4BBBL4;FFb800f8b6f9031faae00319aae10318aa30a50194d80300b41da50194e00318aa21008052390080521aa50194e0feffb4e8031faaf88300a9ff0f00f917030034L4;FFc6040051e740069102008012a520d41a02d01", - "f381fe01f78641e40b9601a40b90000042abf00006a80000054000080d21f000039007d20d4c4020034a000000bL8;FF1f0500b160000054e00313aa51a3ff9714008092740200f9680e48f81f0500b160000054e00313aae6a0ff97740200f9f44f41a9fd7bc2a8c0035fd6fd7bbfa9BL8;FF0110813c60", - "0640a9e8a701a9e8230091090000b029a10e91e3630091e8a702a93c250194e10b40f9e10000b4e80740f9f303002a22008052e00308aa18250194L8;FFe08716ada00a41adb5020191e8ab01f9e08b17ad2c250094880201d1ff3f0c3902fd47d319dd799214194092420100b4e8ab41f9e9af41f900030", - "291e10315aaBBBBBBBL4;FF8000805277000014740240f9820640f9020700b4810240f9200080396009f8b728040091490400d16d000014f503012a74040051760240f9c20640f9a20500b4L4;FF1a0040f9a08300d1f40308aae103172af2100094b88f7ea9e0030191e1031aaae20318aaa10e0094f56f", - "44a9f95b45a9bf0a00b101030054560400b4bb0000b4L8;FFfa6744a9fc6f43a9fd7b42a9ff030291c0035fd6fd7bbfa9fd030091600200f000982091620200f042e02091c10180524c190194fd7bbea9f44f01a9fd030091BBL4;FFe10317aae20316aae003803de40314aaf50740f9f40b00f9e30315aa", - "ebfbff97e80340f9080114cb1f2500f109030054e81340f9eb534079892a0091e003c03dL4;ZFL8;FF8809c05aa909c05ae8271029c809c05ae909c05ae8271129e08743adc806805234008052a00301d1a1c302d122008052b4031ef8a0873aade28344ada9035538BBBL4;FF68020079e8b340b8692200", - "b8a9035ef8ea9303b8aa1b00b9ea7343f8685200b8e80b40f9691201f8e9634039eba300396a9200f8689201f869860039fd7b47a9L4;FB206e65676f74696174696e672076657273696f6e20646f776e20746f20c0002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d31L", - "8;FFe89340f9ed4b02f9e80702f9e8db40f9f15f02f9e80b02f9e8b340f9f66702f9e81302f9e8c340f9e46b02f9e81702f9e89740f9fc6f02f9e81f02f9e8d740f9BL8;FF0801098b090140b22911c0da291540d2290d098b292501910819498b140500913f0700b1f60f00f9c001005400c30091e31e00", - "94080040b20811c0da081540d2L8;FFc80080d2210100b0219830910800f0f2e0031791e3833291e4c31791e2008052e9fb05b9e8fb02f992fdff97f3f742f9e8ef42f97f0208eb61000054e0631791BBBBL4;FFe00500b4c8c20391e10315aa1f200039080000f92804009008212b9160a200a9090d40f9", - "e823009120013fd6e82340391f090071a0fcff5475da40a9e083c23cL4;FB65616d2e7273001243616e6469646174652073657373696f6e20c0052068616420c01020726563656976657220636861696e73001243616e6469646174652073L8;FFa0873cade08742ada2039b3ca0873aade08b43ada08b3b", - "ade18340ada18338ade08b41ada08b39addbf3ff97a0077cad880080d20800f0f2080900d18082873cBL8;FF62790194020300f042a0239109000014e80300f92103009021640891e82300914201805259790194020300f042003191e0230091e10300915579019455790194L8;FFe2a3c43df95709f9f75", - "b09f9e1abc43df95f09f9f97b49f9e00b843de0afc43de3f3863de8e34df9e10f843d0183c13ce013843d0083c03cf8031baa08011bcbBBBL4;FF7f0009eb80070054e94b40f90a098052a083d73c69240a9baa8358f861040091bf0203ebe14f00f92a6101a9ea0740f92001803d2a2102a925010139361", - "103a9L4;ZBL8;FFe1f4ffb5a9ffff17c80600b1e2160054e80300f91eb9009400048052210080521cb90094201400b4600740ade84312910291c03ce94b42f9fa0300aafc635239BL8;FF4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6a00200d000202a911f3", - "90194a00200d000c027911c390194a00200d0L8;FFe00316aae1031caa2200805224390094f64740f9e16340f9810000b4e05b40f9220080521e390094b60000b4e03f40f9e10316aa2200805219390094e83b40f9BBBBBL4;FF01f4ff97801d00b4e00700f9210400b021a01f91230400b063fc3591e023", - "009102028052c4028052e1000014c90080d248008052e24300390900f0f2e8470039L4;FFb51200d1090140f9086140f8090000f9890000f0294d3491086000f8c8008052e92302a9c8018052e90741b2e88300a9e0030091e80f00f9e90300f9f4e6ff97L8;FFfd7b43a9ff03019160001fd6202040a961", - "02009021840b91030d40f982028052fd7b43a9ff03019160001fd60a20009109240091e8030091200440a9a9831ff8BL8;FFb8031df805000014e80b41b2a0031df802000014480f0091a0e300d1a8831cf8107f0094f80300aa39000014b8035df837000014210300b021d82391230300b0L8;FF6301009", - "063802191640100b084001191a8031ef8a9031cf855890094e10740b9720100f052a23a91a80100b008e140391f05007181eaff54deffff17fb6344a9BBBL4;FF742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a92ec90194ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300a", - "ae023009104018052L4;FB6a000000000000000e000000260000000000000000000000080000000000000008000000000000009cfe45000000000000000000000000000800000000000000L8;FFe8fbff175b0080521e020014ea6700f9e94f00f9e86f00f9943400b4fb0314aa1bc90094e00314aa21008", - "05219c9009400e400b4e1031aaae2031baae06b00f9BL8;FF810000b460ea40f9220080522449019461f240f9a11100b460f640f989000014610640f9810000b4600a40f9220080521b490194611240f9810000b4601640f9L8;FFf30300aac80a0034080140b20811c0da081540d2080d088b0825019108", - "fd46d315050091681a40f9080a00b4080140b20811c0da081540d2080d088b08250191BBBBL4;FFe00314aae10313aa22008052f44f49a9f65748a9f85f47a9fa6746a9fc6f45a9fd7b44a9ff8302911de90114e30300d063402791e0031faa01048052e2031caaL4;FB0000000000000000080000000000", - "00000800000000000000704d420000000000000000000000000008000000000000000800000000000000704d420000000000L8;FFe80000b4291040393f050071e0000054000140f9fd7bc1a800001fd6200200b000c01d9132e9009432e90094fd7bbfa9fd030091090040f9280140f93f0100f9BL8;FF2", - "9194a8b290500910a1840f92801088b5f0500b180020054092040f92a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab83010054L8;FFe0430691e10244ade1830d91e8bb01f9a8e378a9fa9701b92183813c2083823ce10245ade81700f9e80b40f9e9a319a9a80302d12183", - "833c2083843c95c4fe97BBBL4;FF3895ff97b9035cf8a8035bf8080119cb7f0208ebc8210054130100b4a8835bf8e1031aaae20313aa0001198b24a901943903138bb9031cf89f0600b1fc0700f9L4;FF00ff073612000014280f40f9e00315aae10313aae20314aa00013fd680010037f3031f2a1403174", - "b683e00121f21346bc2010054281340f9c1520012e00315aaL8;FF2300805224008052d6bfff97a0077fa9f1ffff17b5e33ea9bf831ff8f50b40f9e80340f9bf0208eb81f9ff54e0030091afa80094c9ffff17e00740ade00313aaBL8;FFfd7b17a9fc4f18a9fdc30591000440adf30300aae8a30091e003", - "0091e1031f2ae00700ad83290194e82b40b9a8040036e8a30091a08302d10081c63c0181c73cL8;FF810000b4e0e744f92200805224290094e81750a9e00314aae20743b9e10343b9e61341b9033940b9e803029104610891aa51fe97e88340f9e00314aa016940b9BBBBBBL4;FFe003082ae10314aae203", - "13aaeffaff97603000b500f6ffb4a3ffff17898244f83f0500b1810000549fea04a99f2e00f99f6200b91f0900f1412e0054770240f9L4;FFee03082ac1030014e96f42f9e87342f9e00316aa21c4805222008052e92319a91f110094e31359a9e0830c91e2030c91210080521c0c0094e007409161e2019", - "1L8;FFf22f4039ee334039e14740390c120f2aef374039f03b40394d12112af13f4039f243403908040039e84b4039e24f40390a080039ea110e2a2e12102a4810082aBBL4;FF88a243391f050071c00000541d000014f60f00f988a243391f05007121030054e883009180260491818202915b6a0094f6d", - "742a9e82340b928010036c81e0012L4;ZDL8;FF600000543f190071a10100540a008092092100390a0100f9fd7b42a9ffc30091c0035fd6090080921f210039090100f9fd7b42a9ffc30091c0035fd6e9330091BBBL4;FF2009c03da003993ce10140ade609c03de38942ade59141ad210100ad2219803d2", - "61501ad240d02adc9050091a1037cada203d73c3f0116ebe201803de18100adL4;FB2cfe6a12b8bec41f23695c3f3db95a978f187637506e0d61ed3ea28c3f90a8ea0000136ad750c24776c7543c9f1d48f267050a21aeb7487cc268260bca012460L8;FFe97b43a9e97b00f9e9fb40f9e9e700f9e96b40f", - "9e9fb00f9f42748a9f64700f9f60308aae8af40f9e96b00f9e93342a9e99f00f9e98f40f9e95714a9e9eb40f9BL8;FFe20318aa27110094fad342f9fc0740919c830191d7fdff17e04316912200805220110094e1d342f9e3fdff17e0431691e1031aaae20318aa1a110094fad342f9L8;FF8a0100b90afb", - "0b918b090079eb630191ac0358f8482500a968390c91a98358780c0100f9e8031691e9df06791c7afe97f88345b91f07003160080054e8e20b91BBBBL4;FF7c7204f868e207f8a8035d78696208f8a9835cf8682e0179e85f40b969e208f8e92b40f9689a00b9487d105369c209f8e93740f9689a023928f", - "d60d369720ab8L4;FB34000000000000005e0100002d0000006d6573736167652066726f6d20746f6f2066617220696e746f20746865206675747572657365745f7265636569766572L8;FFb6ffff17880080d20800f0f2080140b2b2ffff17880080d20800f0f208110091aeffff17e00300f9210200f02", - "1501691230200f0638c1691e0030091e2018052BL8;FFa9d317384901084aaa035838a9e317386901084aab135838a9f317384901084aaa235838a90318386901084aab335838a91318384901084aaa435838a9231838L8;FF0969213828040091f69349f9e8d302f9df0a00b1610d0054f9031faa750000", - "14e1d342f9e8cb42f91f0101eb806f0054e8cf42f949098052f6074091d6820991BBBL4;FFa0000054810000b4e00317aa2200805223b101943f0700f14b010054e03740f9e10319aa220080521db1019405000014fc2b00f9bce372a99f0b00f1a1010054L4;ZBL8;FF3f030071a80e40f9a90240f96a13", - "9a9a400540ad1f0109eb000400ad00050054abaa40a9610240f94a01088b080500915f0109eba80e00f908098052e933899aBL8;FFc90480524838c0f2ff5306f9e95b06f9ff5f06f9e97306f9e87706f92c310194f3f742f9e8ef42f9e0dfc13de1e3c13de2e7c13d7f0208ebe02b833de12f833dL8;FF3", - "331009453000014e08324910ff0ff97e1eb41f9f9030891f8830d913f0400b1a0150054fb5f40f9810000b4e0ef41f9220080521a310094e8430f9100810091BBBBBL4;FFfa6705a9f85f06a9f65707a9f44f08a9fd03019109304039490c0037170040f9f40308aa160840b9b50180d2f30300aae80e40f", - "91500f0f2f60f00b9e80400b4L4;FF340200b4b982009104000014940600f139c300918001005421035ef8810000b420835ef8220080521d01009421835ff8e1feffb4200340f92200805218010094L8;FFfd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f090071e1010054e00302aaf4030", - "2aaf30301aad8000094e80300aae00301aa08020037980240f9BL8;FFf44f43a9f51340f9fd7b41a9ff030191c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9fd430091080040f9e00301aa14cd40a9e80300915c810194930100b4L8;FF050000144b008052ecfcff35ec031faa8b010b8b2801088b49", - "010b8b0801098b090140b22911c0da291540d2290d098b292501910819498b15050091f60314aaBBBL4;FF0206005408038052e90b40f94027089be8033aaa8802088b0805088b02f17dd3165c40a9016000911fc10194f30f40f9940600d1740a00f9f60000b4df0600b1L4;FB6164656420666f7220c00", - "22e20c0172073657373696f6e206861732062617365206b65793a20c00e20616e6420636f756e7465723a20c0022e20c000083c6572L8;FFe217813de113813dc5150094e20fc13de313c13df60b41b22f00001488a2069198da5fa98066c03d0101c03d88de40f989d240f997fa40f99c0641f9e02b803d", - "BL8;FF09692138e10313aad1faff97770a40f9680240f9080117cbbf0208eb28070054680640f9e10316aae20315aa0001178b23410194e802158b680a00f9951640f9L8;FF810640f9c10100b4820a40f9e00313aaf44f41a9fd7bc2a821410014280400d11f0d00b1c8000054000440f922008052f44f4", - "1a9fd7bc2a819410014f44f41a9BBBBL4;FF810080524be1019420b00035e85341b9e89b00b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1L4;FB6a00000000000000800000002e000000576869737065725072654b657953656e6465724", - "b6579506c61696e746578740034ed4800000000006a00000000000000L8;FF6002803d680a00f9980000b475da01a9781600f907000014790e00f9b50000b4e00316aae10315aa220080521ce10094e0431e91bbdcff97ff0600f1ebc0ff54BL8;FFfd7bbea9f30b00f9fd030091f30300aa1f6101940004", - "8052010180521d610194000100b4e10200f021600191130000f91f600039f30b40f9fd7bc2a8c0035fd6L8;FFffdf00a9df7e01a9dffe02a9f71700f9f72300f9df7e04a9f7ff05a923feff97e0060036212c00b5992240f9881a40f93f0308eb6100005480c200912c98fe97BBBL4;FFe98300a9e023009", - "1ffa301a9a8df3ea940a101948012003788164039891a4039410300f021203e918a1e40398b12407908bd70d3e083c03c420300f042801891L4;FFc21200f9c5ffff1700430891ce030094e4ffff1741400d9142c00d913f1400385f0001ebc1ffff54200310912100805201400e39e2ffff170043089108", - "040094L8;FFa32300d102018052e40313aab4831ff870a1009488120091810100f021201691a32300d182018052e40313aaa8831ff868a1009468a10094f44f43a9fd7b42a9BL8;FF000500adfd7bc1a8c0035fd6800200b00000139125210194800200b00060139122210194ff8301d1fd7b02a9f71b00f", - "9f65704a9f44f05a9fd830091e803022aBL4;FFff0208eb68080054340117ab020f0054f42300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889a152300a9f7fbffb5f62b40f9L3;ZBBBBBBBBBBL4;FF422033912b1e0294400400d000601791261e029460040090004012", - "91261e0294400400d000a01691231e0294400400d0004016911d1e0294400400f000402991L4;FFfdc30091f40300aae0630091aa150094f30742a9e8030091e00313aaa11e0094e80340f91f0500b1e0010054e003c03de80741a929008092890200f98082803cL8;FF8202009042601a91e1430091e9a3", - "01a9e91700f9301e019469fbff970001805201058052361e01948002009000e01891211e019480020090008018911b1e0194BBL4;FF1f0309eb082000790000803d61000054e0230091b69d019408038052e90b40f90a0700910827089b49028052095d00a9090900f9ea0f00f9aca640a908068052L4;FF", - "48010054040080d2d3010837637e4093081b80d2010000d401f7ff97f30b40f9fd7bc7a8c0035fd6b2f6ff97e10300aa8201805200008092220000b9f8ffff17L8;FF810100d021481491a40100b084600991e0230091a32300d1a2008052a8831ff86c9e009488c20091810100d0215c1491a40100b084e", - "00991a32300d182008052BBBL4;FF4ade01941f1000312150005439feffb505000014e04305918100805245de0194604f0035e85341b9e83b00b957ffdfc8770000b53ede0194f70300aaff0600b1L4;FB0417440000000000cc1544000000000088184400000000001415440000000000f5014900000000", - "004e0000000000000091070000130000004402490000000000L8;FFe9c743f9080340f91f0109eb892f0054e1a343f989008052680a00f90800809269220039680200f9810000b4e0a743f9220080521ade0094e1af43f9810000b4BL8;FFe103009122008052e00700ad800a41ade00b01ad555e019400e", - "4006f9f1a00f9808200ad8002803d08db77d3800640ad80020191e103009122008052080d17aaL8;FFe00313aa220080520e020094610a40f9dbffff17f50300aae00313aa2200805208020094610a40f9e00315aae3ffff17fd7bbca9f85f01a9f65702a9f44f03a9BBBBL4;FFf66300b9d8f9ff97a80a4", - "0f9a81000b409fc79d3e1e7076fef031faaaa2e40a9ed031faa200d010ea87301d10e0c805210000b8a426970fc438c202e7100669eL4;ZFL8;FFe80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e00300910ff4ff97e10300aae00301aaf44f45a9f65744a9fd7b43a9ff8", - "30191BL8;FF000040f9467e0114000040f9437e0114000040f9697e0114000040f9397e0114000040f96d7e0114ff8301d1fd7b04a9f44f05a9fd030191f30308aae8430091L8;FF0825019108fd46d30900088b37050091ff0208ebc9120054968248f8df0600b1c01200548022029163eeff97080040b2", - "0811c0da081540d2080d088b08250191BBBL4;FFecffff17e0c30591e10314aa22008052230080522400805235b1ff97f4c340f9ebffff17e0c30591e10314aae20315aa23008052240080522db1ff97f4c340f9L4;FB6e6465782e6372617465732e696f2d313934396366386336623562353537662f627", - "97465732d312e31322e312f7372632f62797465732e7273002f636172676fL8;FF1f200039080000f93f0400b140010054810000b4602a40f92200805220be0094613240f9810000b4603640f9220080521bbe0094610240f9810000b4600640f9BL8;FF77fdffb534008052582f40f9f8f6ffb4532b40f9", - "1e3e0194e00318aa210080521c3e0194200500b4e10313aae20318aaf60300aa223e0194b3835df8acffff17L8;FFdeffff17811c0054e0031faa2cffff1720ebff54c80080d20800f0f20809009137000014e1010054e0031faa1affff17c80080d2e00b00f90800f0f2080900d1BBBBBL4;FF610a40f96", - "80240f9960640f91f0101ebe00f0054680640f929040091e00315aa690a00f91c692138e10313aa2dfaff97770a40f9680240f9080117cbbf0208ebL4;FFa5802b91e89701f9e89340f9e0830a91e1830c91e40313aae86b02f9e9a350a962c20391e6431391e7031faaf59301f9e86f02f9e8a740f9e977", - "02f9e87302f9L8;FFfd030091f40300aaf30308aa200e019400028052210080521e0e0194200100b48002c03d08028052680200a90000803d680a00f9f44f41a9fd7bc2a8c0035fd6BL8;FF028e019488624039f40341a9290300d0297d3d91ca028052e8a300399f0a00b1e92b03a900020054680240f91", - "f0900b1a0000054f60300aae00313aa0777ff97L8;FFe003132ae103142aa80100d008e140391f050071c0fbff54d3e7ff97f44f42a9fd7b41a9ffc30091c0035fd6ffc300d1fd7b01a9f44f02a9fd430091a80100d0BBBL4;FF2803178be82700f9360300b4e12740f9e81f40f9b72e40f91f0101ebe01e", - "0054e82340f929040091e00316aa1c692138e1e30091e92700f92abaff97f82740f9L4;FBa242c8b33943df5d95600f26341bda8b07e91c6d4a2c7a47a1b3d7a7539ac0e0f1fbd1a00da647de446fa28cd20aeaedc4ad92840000ba67f34e46444ac5f0cfL8;FFfb0307aae80700f9ee234da9e9e740f9f2", - "d340f9f4ff00f9e85f00f9e3db53a9ea2717a9e9030daaec1740f9f80303aaeb6f00f9eb2b40f9e3f340f9e8174ca9BL8;FFeb3b00b9a00302d1e2e300918b1245f8e8fb0039e10319aae8b340f9e97304f8e9a34539ec7b0079ebf303f8e8f304f8e95f01393e59ff97e103002ae8430691L8;FF81ffffb", - "4200340f922008052244e0094f8ffff17e8e322910081cf3ce8e344f93dffff17e88b40f9c80000b40805088be00314aa0201805201f17dd3184e0094BBBBL4;FF24ee0194a01100b4e10316aae20313aaf50300aa2aee0194f61640f93a008052160200b4f91240f919ee0194e00316aa2100805217ee01", - "94601000b4e10319aaL4;FB89060000180000006d697373696e6720696e2070726f746f627566484d41432063616e2074616b652061206b6579206f6620616e792073697a65000000000000L8;FF230c80528ce7ff97e10300aa60faffb4caffff17a00500b5e00313aadcedff97e80301aa400100360806", - "00b5e1031faacaffff17e10314aae20313aaf0ecff97BL8;FFa8820091a9fffff029312491e20200d042a80c91e3030091e00314aae10313aae82700a93b6e0194f44f43a9f51340f9fd7b41a9ff030191c0035fd6e9f99ed2L8;FF376e0094400100d000400091420100d042402491e1038052526e0094e", - "04316912200805207120094e1d342f942faff17f60300aae04316912200805201120094BBBL4;FF0a358c52e86b0239c81f0012897209f8098440a9e88f0239a8035838e22f00f9a20356b8e81f033948019fda967208f8f60300aa95f208f814d447a9e86700f9L4;FF1f0540f11731999a7f0348f169fa", - "ff5412000014df021ceba3040054f70300aaa08300d1e10315aae20314aae30316aa23000094a8035ef81f0500f1c0030054L8;FF21008052a30100b063802191a40100d084001191a8273fa955ae0094e00f40b9e80100d008e140391f05007140fdff542b07011328030013290f0313a18b7b29BL8;FF0", - "0013fd6e06b01f9e8c31791e16f01f9290c40f9e1830b9120013fd6fcfb42f99f0f00b101010054c800805217ffff17e04bc13de14fc13de84345b9b47e0853L8;FFe4170ba9e62b0ca9ff730b79ebef02f9ebf302f9fff702f9e4170fa9e61f10a9ea8b11a900013fd6e0e302f9e8074091e1e702f90801", - "1891290c40f9e1631791BBBBBBL4;FF20008039c001f8b729040091080500d1892200a925000014c90080d248008052e04300390900f0f2e8470039e90700f924000014e80741b221000014f50302aaL4;FF800d00541f09007181400054010700d1e8431391e0060091518cfe97e86b42f94083c03c4183", - "c13c4283c23c1f0500b1e0ef883de1f3883de2f7883de0340054L8;FF0020149129160194600200d00080149126160194f7031faae00317aae10315aa2c160194281040b96800c8376800d0373b1601146c1601146c160114ff8300d1BBL4;FF1f0000f9fd7b44a9ff430191c0035fd62914c0392b1d0012", - "4a1d0b0b4a0102510901f83708710a8bca00805208a800a91f0000f9fd7b44a9ff430191c0035fd6L4;ZBL8;FFffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa8101009021281a91e8030091e00309aac2018052669600946822019181010090BBBL4;FF0088202e09a901", - "a90c00669e8cc101920cad00a9c0035fd6fd7bbea9f44f01a9fd030091490400b0290140f94ad03bd55301098b694240393f05007181010054L4;FB5500000000000000ce0000000100000056315374617465696e6e65725f7374617465507152617463686574537461746576657273696f6e5f6e65676f7", - "4696174L8;FFe72340f9e31340f9f70314aafb031caae10316aacd00001429a041a9e003099136dc40a9f80301aa3af05aa9022f8052e8e700f92aa042a9ec7300f9e82b17a9BL8;FFf4074091948209910969213828040091f67749f9e8d302f9df0600b1a033005480220291d31e0094080040b20811c0", - "da081540d2080d088b0825019108fd46d3L8;FFe0a33239e08332910800f0f2ffa73239e85306f9134cff97e80300aae85306f9e08332912101009021803691a20180522301009063dc3691240280522b000014BBBBL4;FFfc5f01a9f65702a9f44f03a9fd030091ff830bd109804039f30300aaf40308aa", - "a90100343f0d007161070054602241a9090d40f9e803009120013fd6e80340f9L4;FB6c5f7075626c6963656e637279707465645f73746174696353656e6465724b65794d65737361676553657373696f6e53747275637475726570715f7261746368L8;FF18ecff97e80300aa4102009021bc1691430200", - "9063481491e0030091e2008052a4008052e80300f909000014e00300f94102009021bc169143020090635c1491BL8;FF7376019401030090210c2491040300f084200c91e0030091a363009162018052b30f00f96b760194688201910103009021382491040300f084a00c91a3630091L8;FFe85748f9f93", - "348f9e06f833d8083c13ce173833d8183c03ce8eb06f9e06b833de167833d27000014e01bc43de83b48f96082803c09008092680e00f9e0430691BBBL4;FF600640ad8a0300904a6119910b1c0091002502a98b0200f90b180091000509ad620241ad016101b902010aad400540ad0a0400910a2505a90a0", - "800910a2508a9L4;ZDL8;FF07000014340100b421b60094e00314aae10315aa1fb60094a00000b528008052750600f904000014e00315aae8031faa600600f90a028052e90314aa696a2af8BL8;FFf3af40f922360194e00314aa2100805220360194001201b4e10313aae20314aaf50300aa26360194f6b", - "f40f9d60400b4f3bb40f916360194e00316aa21008052L8;FFe92343a9ea4f05f9ea5705f9eac340b9e88b05f9e80b40f9e96705f95f010071e96f05f9e8c305f9e9234429f6df05f9eacb0bb9e8970bb9e80740f9e9930bb9BBBBBL4;FF800640ada08300d1a0073fad370602941f040031200a0054f40f", - "40f9760080520800001400010039b402148ba08300d1f40f00f92d0602941f040031e0080054L4;FFd8030034080340b20811c0da081540d2080d088b0825019108fd46d308050091b70a40f9170300b4e90240b22911c0da291540d2290d098b29250191e91a498bL8;FF680e40f9a80000b4601240f901", - "f57ed34200805222060194681a40f9a80000b4601e40f901f57ed3420080521c060194682640f9a80000b4602a40f901f57ed3BL8;FF24860194401a00b4280300b008210891957e02290001c03d01b1c03c0000803d01b0803c1100001419860194a002805221008052b502805216860194e01800b4L8;F", - "F34860094150100b421860094e00315aa21008052360080521e860094600000b5f6ffff1720008052b58338a9bf8319f8381e00b4f7031faaf6031faa19038052BBBL4;FFe0030291e82b08a94fa30094a00300d000202491a20300d042602591010a805250c6019420008052e10314aa29c60194fd7bbaa", - "9fc6f01a9fa6702a9f85f03a9L4;FB7273001a73657373696f6e20737461746520636f727275707420666f7220c0023a20c0002f636172676f2d7461726765742f616172636836342d756e6b6e6f77L8;FFe9c31391f40b00f9f4bb02f9fce315392091883ce8c702f940640054680343396013cc3cea031", - "c91e0831d91e1e31c91f69f03f9e8031d3968274da94011843cBL8;FFf30301aae10309aa22008052f4030b2a240600946aa240a9e00740f9690240f9e10313aa54692838080500911f0048f1680a00f9e3fdff540b7c0e533f0108ebL8;FF6b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129", - "010aab620500542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b29050091BBBBL4;FF734a1091f402805205000014f63340f9f30300d07302109154028052f53b40f9ba0000b4e1031aaa220080521ce60194e13740f9d60000b4e02340f9e10316aaL4;FB6c655f72617463686574", - "2e727300136661696c656420746f20646563727970743a20c0002f636172676f2d6769742f737061727365706f73747175616e74756dL8;FFe80300aae86301f92102009021a017912302009063e81791e0030b91420280522401805218000014e0230b39e0030b91ff270b39f56301f90adcff97e80300a", - "aBL8;FF21802e91e40200f084002f91e0030091a3630091e2018052a80f00f96d66019468a20191e102009021082a91e40200f084802f91a363009142018052a80f00f9L8;FF27660094689240f9a80000b4609640f901f57ed34200805221660094689e40f9a80000b460a240f901f57ed3420080521b66", - "009468aa40f9a80000b460ae40f9BBBL4;FFa0031df86103009021382f916303009063b42f91a0c300d1a20280526401805212000014a0031df86103009021382f916303009063102891a0c300d1a2028052L4;FFc300030a831800b9bfffff1766824039087c4093c61000127affff17210000b042c00d9", - "121401d913f1400385f0001ebc1ffff54810210912200805222400e39L8;FF4d00034a2a380a0a6b010f4a8c01124aad01054a29010b4a8b01004aa801084a29010b4a08010a4aaa0100d04aa13a912801084a097d1853495969780821094aBL8;FF0a2102b84a0840b90ca100394cf040f80a9102b80a08", - "8052aa1500330081803c0b2d00b90c3903a90a01013909000014e9031faa050000142a008052492109aaL8;FF080040f9f40302aaf30300aa080115cb5f0008eba8010054b40000b4680640f9e20314aa0001158b25260094a802148be0031f2a680a00f9f44f42a9f65741a9BBBBBBBL4;FF5f1000f1890", - "08052082100913731889a1a000014480400b008611991000540ad600600adf44f43a9f65742a9f85f41a9fd7bc4a8c0035fd648fc7dd3a80800b5L4;FFe2630091e00316aaffa301a9ff1700f959f5ff9713000014e083c33ca1835ef8e003803de10100b4e00315aa220080521b1a00940b000014b80000", - "b4e00319aaL8;FF140400b4221a0194e00314aa21008052370080521f1a0194200500b4e10316aae20314aab40200a9251a0194b40a00f9618200910000809274820091841a0194BBL4;FFe8430391530340b255830f9114410f91970d4092970400b4e95342f9e8b344b900e4006feb1b40f940430091a1", - "8301d1a9031af8e9af44b90a050011eab304b9L4;ZFL8;FF739a009468c20091810100b021b41891a401009084600a91e0230091a32300d162008052a8831ff86a9a0094b401009094a20391810100b0218c1491a32300d1BBBL4;FF63002191c40300d084603391e243059161028052e843053931da0194", - "20008052010880522bda0194ff0302d1fd7b02a9fc6f03a9fa6704a9f85f05a9f65706a9L4;FB220036000561663b870a0e001a000426341e55080042202c094c5836701464000000a901ab0015012100fd011f02660138037b003f020000ed00580086001700L8;FFe83f40f9e87704f9e9235ea9e88304", - "f9e87f40f9e97b04f9e88b04f9e84b40f9e88f04f9e88340f9e89b04f9e87740f903290091601d0094e8eb41f9eafb41f9BL8;FFe8f342f9e06fc13de0074091e173c13df64349f900800991e85b09f9e83b49f9e277c13de0a3843de067c13de81700f9e83f49f9e1a7843de16bc13de80700f9L8;FFe07", - "fc13de183c13de82b43f9e216803de00600ade83200f9e30a803d75fdffb5e81b41f91f0500b1600a0054f72341f9e94b42b9f54f42b9e85b42b9e8270529BBBBL4;FF09804039f30300aaf40308aaa90100343f0d007181070054602241a9090d40f9e803009120013fd6e80340f91f0d00b10103005488", - "0200f96800805228000014L4;FB6d657373616765206c696d69743a20c0092c20696e6465783a20c00b2c20636f756e7465723a20c00076656e646f722f6c69627369676e616c2f727573742f70L8;FF1f0500b160000054e0c3039151f8ff97e8bb40f91f0500b16000005420030291e8f5ff97f7d740f9", - "ff0600b100280054fb0318aaf6635ba9581400b4d9220091BL8;FF0c3440a929010aca6c010c8bad01098b8bcdcbca8c81cc93a9c1c9caad010b8b2c010c8babbdcbca89adc9caad81cd930b2401a989010aca093400a9490008cbL8;FFe10317aae20315aa2300805224008052d490ff97f71740f9e80f4", - "0f9080117cbbf0208eb49c6ff54e0630091e10317aae20315aa2300805224008052c990ff97BBBL4;FFe90340f91b0d00d1ea2300f9550200b4f32b40f9fc1b40f97fbf00f109310054e94340f91bcd00d1480080d20800f0f2a06301d12901168ba8831af834cd0091L4;ZBL8;FF001080522100805222b", - "a0094c01e00b4a00642adf90300aa882e40f9896243a9000402ada00a43ad1f010ff1e91700f9e86b02f9000803ada10240ad010000adBL8;FF080a00b4080140b20811c0da081540d2080d088b0825019108fd46d316050091770a40f9570900b4740640f9f8031faaf90317aae00314aaeafcff9708004", - "0b2L8;FFf7ef41f9f6f341f9e86300f9e8fb41f9faff41f9f55300f9757e42f9e85b00f9080340f9e94700f9e90742f9e93f00f9680000b4e00315aa00013fd6010740f9BBBBBL4;FF3bfdff97770a40f9680240f9080117cbbf0208eb89dcff54e00313aae10317aae20315aa230080522400805230fdff", - "97770a40f9dcfeff17f80300aae00313aaL4;FF20010054e003c03de80741a929008092690200f96082803c680e00f9e10200b5e9ffff171a0a0094c002805221008052180a0094400300b4880000f008653491L8;FF6202009042000091e3830091e82702a9400a0194f44f48a9f65747a9f85f46a9fa67", - "45a9fd7b44a9ff430291c0035fd6080040b928010034080140b20811c0daBL8;FF69020039200000143f090071a1010054a8035ef809dd78920c000014f65343a9df0600b140feff54f76745a9e15744a9a0ffff17e9031faa180700d103000014L8;FFe8430a910081c03ce8030a910001803de80f40f90", - "82e00b5740100141c8a009400038052010180521a8a0094204800b4f80300aa168a00944000805241008052BBBL4;FFb7035ef81dffff17a0c300d1e10317aae20316aa230080522400805234bdff97b7035ef8ba035df8480317cbdf0208eb09e4ff54a0c300d1e10317aae20316aaL4;FB080000000000", - "00000cfe4500000000000000000000000000080000000000000008000000000000002cff45000000000000000000000000000800000000000000L8;FFe2e3c13de23744f9e48715ade1e7c13deb3b44f9eda306a9e87744f9f63f44f9fc6b00f9fc030eaaf84344f9ea4b44f9fa5344f9ec5744f9e15b44f", - "9f06b44f9BL8;FF274a0194686240f9a80000b4606640f901f57ed342008052214a0194686e40f9a80000b4607240f901f57ed3420080521b4a0194687a40f9a80000b4607e40f9L8;FF691e0054080c47f81f0500b160180054b2feff97080040b20811c0da081540d2080d088b0825019109fd46d30800", - "098b080500911f0109eb28170054e4000014BBBBL4;FFa203dd3ca303de3ce3ab803de2a7803de1a3803de09f803db90dc0dae83f40f9000c0054e08742ade24740f9ff1701f95ffc00f1ff1301f9610204ade08741adL4;FB74794200000000000000000000000000080000000000000008000000000000", - "00d47b420000000000000000000000000008000000000000000800000000000000L8;FFf44f03a9fd030091f30301aa210840f9f40300aa680240f91f0101eb600e0054680640f92a040091e00314aa490180526a0a00f909692138f2570094e10313aaBL8;FF0825019108fd46d308050091090840f9e90", - "500b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091091440f94801088b090100b42a0140b2L8;FFe20a803d200c0054f91300f9f9430691fbe300912083cc3c2183cd3ce81f00f9e81b40f92283c33ce0e3009160838c3c2083ce3cc1e2009161838d3c2183cf3cBBBL4;FFe80300", - "b008b140f91f0500f189030054e8830091490000f029611a91e82703a9e8a30091eac30091e82704a948008052690300f029a10c91a02700d1e1430191L4;FF730540f929008052eeffff1789000036f70308aa180080920d000014e001805247030094c0faffb4280000b008d90191f30300aa090140f90", - "87140f8f7018052L8;FFe0120091e10317aa27aa00945a070091fb02007933008052f4060079ba031ff8b9ffff17a08300d176f3ff97d2ffff17a08300d173f3ff97b6835ef8c80a1a8bBL8;FFe9d304f9680000b4e00316aa00013fd6010740f9810000b4020b40f9e00316aa1f2a01947f0b00b1810400", - "54e91f40f9e14341f9e0031691ffa71139200545adL8;FF000500ad262a0094e883249181830091e00319aa08410091b87dfe97bb0000b4e00319aae1031baa220080521c2a0094c082c53ce8b744f9e0074091e163c23dBBBBBBL4;FF200080398000f8b728040091490400d1110000145f2800f1880000", - "542800028b08f1df38e804f837e0030091b57b0094e80340b9080a0037e80b40f9ea0640f9L4;FFe99b41b900fd0039e007409109050039e99341b900401d911aed003909090039e98b41b916f10039090d0039e98341b919f5003909110039e97b41b91bf90039L8;FF4a0040b909210039490840790b15", - "00390c190039012500390aa100b8091d0079c0035fd6fd7bbfa9fd030091600200b000003391620200b042803491a1168052BBL4;FFa88200911f011beba802019181f2ff5412000014e0031faae10317aa2d920194690308eba001005433fd45d31521009104000014730600f1b5820091e0000054L4;ZD", - "L8;FFfd7bbfa9fd030091083c40f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091092440f93f0500b1400400540a2c40f9093840f9BBBL4;FF4a413b91c90280520a2500a9c0035fd6ff8307d1fd7b18a9fc6f19a9fa671aa9f85f1ba9f6571ca9f44f1da9fd030691160", - "c40f9140040f9f50305aafb0300aaL4;FBf8dc1cf32b6e3c339a56f9154dcaedd571644007d877e3ee71395db1c30e3743d71cd11b0100744059e124d3e459e4590000dd84009d009d0000000000000000L8;FFea3f42f9e9a309a9e82f42f9e93b42f9e8df00f9e83742f9e8af15a9e84342f9eb5342f9e", - "8b700f9e84742f9e9a318a9e84b42f9e94f42f9e8eb00f9e85742f9BL8;FF34f5ff1748236639e2074091c00200f000a03d91e302009063a01a91c40200f084403e914280099181048052480300392b52019448236639e2074091c00200f0L8;FF63600491040100f084c03d91e2833291e1068052e85306", - "f9e95706f930520094000100f000e03c91020100f042203e91e10680523b520094e8ff42f9e90343f9BBBBL4;FF1700f0f21f0500b1a0010054f40300aa004c40f9a8e300d1815240f9b4c80094a8835c381f050071210100540804009008210c91090480524f000014e80300f0L4;FB0800000000000000", - "fc0643000000000000000000000000001000000000000000080000000000000028f642000000000063616c6c65642060526573756c743a3aL8;FF000e00b5e1031faae10900b5a80640f91f011aeb69050054e00313aadcf1ff972009003728fc60d3080700b5200840921f1800f142070054217c0353610", - "70034BL8;FFabd35638a9b31638a9e356384a01084aa2833bad6b01084aaac31638aaf356382901084aabd31638ab035738a9e31638a91357384a01084a6b01084aaaf31638L8;FF408b0054e8cf42f9490a8052f4074091948209910969213828040091f67749f9e8d302f9df0600b1a032005480220291", - "b3290094080040b20811c0da081540d2BBBL4;FFf29bff97a1637ba9a00e00b4a11000b4f90300aae00318aa2200805220b20194e00319aa7f000014a88355f81f0500b18100005428008052bf8316f8bfa335a9L4;ZBL8;FFe0120091e10314aae20315aa42b20094a00100f000e03291a20100f0420034", - "91210880524fb20094a00100f0004038911eb20094a00100f000a038911bb20094BL8;FFc80080d2e0a33239e08332910800f0f2ffa73239e85306f912280094e10300aae15306f9e0833291a10200902120099102028052a3020090630015919e000014L8;FF08078052e96b05f9e9431a91e85705f9280", - "080d2e96f05f9c90480524838c0f2ff4305f9e94b05f9ff4f05f9e96305f9e86705f926320094e9830d91f6e741f9BBBBBL4;FF20040090006010913c020294ffc303d1e923086dfd7b09a9fc6f0aa9fa670ba9f85f0ca9f6570da9f44f0ea9fd43029109604039290e0037156040a9f40308aaL4;FFa102", - "5ef8810000b4a0825ef82200805223020094a1825ff8e1feffb4a00240f9220080521e020094f3ffff17db0000b468071b8be00316aa0201805201ed7cd3L8;FF950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f9220080521d020194f8ffff17340100b48806148", - "be00313aa01f17dd3BL8;FFfd7b01a9fd430091010300f021802991240300d084c02091e323009182008052e80700f960820194fd7b41a9ff830091c0035fd6010300f02170299182008052L8;FF0201805201f17dd325820094753600f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6fd7bbfa9fd03", - "0091081840f9080100b4080140b20811c0da081540d2BBBL4;FF3f050071a1020054e9e34039140180d21400f0f23f050071cc05005489080035ea0f41b24800001408008092a903009029413f91680200f908038052692202a9L4;FB00001b1b1b1b1b1b1b1b1b1b001b1b1b1b1b00131b1b001b0000070", - "000443f350b16493a657b753a062711000000000088e847000000000098e8470000000000L8;FFeaaf00b9e00bc23de31fc23de203c23de48715ade107c23de8ff43f9e9a301f9e9030caaf4bb43f9edbf43f9f9c343f9fec743f9eecf43f9f2d343f9f1d743f9BL8;FF803240b980010034610a40f96802", - "40f91f0101eb00030054680640f9090180522a0400916a0a00f909692138e10313aac7fbff97818a40a940008052e30313aaL8;FF2007c03d0081853cfc2700f9da0000b4e0031baae1031aaa2200805220420094fc2740f99f1b00f103050054f8430691fb0c8092e02340f9080d8052826f089bBBBBL4;", - "FF00030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb43cf00541803008bf9feffb50f0000141f0400b1a1ce0054L4;FB42ea48000000000054000000000000008d0000001400000034ed4800000000006a00000000000000120100002e00000034ed48000", - "00000006a00000000000000L8;FFe0f3803d21f18f3ce8f701f9f7eb01f9762500b4f7b340f9e8830591e0431e9101c10091ff0600b1e203889a10f9ff97e8cb43f96083c03ce9d743f91f0500b1BL8;FFfd7bc2a8c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aac10200f021a01e", - "91e8230091e00309aa0202805266620194f40200b094a22391L8;FF00fc55d393000014e10300a9e00301aae10309aa220080520a060094e10340a92aa040a9536928380cfc5cd308050091290040f9280800f94cfeffb40a7c1553BBBL4;FFb80200b4e30318aa40a20194800200b520008052e10318aa2", - "ea20194e08742ade83b40f9681a00f928008052608600ad686200a917000014e08742ade83b40f9L4;FF8600003402e05f7842040011421c001206c05f38c6eaff353fc122eb82010054231543aaea03292a630843aa631043aa4b00030a4200030a3f0102eb62010a0bL8;FF090140f93f0900b1a100005", - "4810100f021bc1491820080525fa20014ff8300d1fd7b01a9fd430091810100f021cc1491a40100d084402291e323009182008052BL8;FF00f80491e82701a9a8630091820200b042c00e91e1430091e82702a92e220194800200b000200f9123220194088441f8010d40f920001fd6ff4302d1fd7b06a9B", - "L4;FFf30b40f9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091010040f968028052290041d23f8d00f12831889a1f6d00f148040054c90000b0296117918a000010L3;ZBBBBBBBBBL4;FF296be838a903f836092100d10afc79d3eb0336aa2901148a0b1b0b8b2a6b28382903098be80328aa7b0700d12", - "a210039281b088ba90600d1610141ad3501158aL4;FFf44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd6c000009000c02591361c009420008052c1018052291c0094fd7bbaa9fc6f01a9fa6702a9f85f03a9L8;FF84c01b91a20700d161058052341c019480020090004012918302009063c0119", - "18402009084e02291a20700d1610580522b1c0194ffc300d1fd7b01a9f44f02a9BBL4;FF09010a0b6d020acbea1b00f9e9430339e94303914a0100b4ea1b40f92801088be90315aa2b0140390c1540384a0500f18b010b4a2b15003861ffff54b4fd46d3L4;FF81fc5f883f00006b8100005482fc018881f", - "fff350a000014bf3b03d510000014e00304aa010080d2010000d40c000014bf3b03d50200023240fef736427c4093L8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091091440f94801088b090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091BBBL4;FF09a700", - "3908ab0039e8a7492909af003908b30039e8a7482909b7003908bb0039e8a7472909bf003908c30039e8a7462909c7003908cb0039e8a7452909cf0039L4;FB6372617465732e696f2d313934396366386336623562353537662f70726f73742d302e31342e342f7372632f656e636f64696e672e727300c", - "0012ec0023a2000L8;FF520e0014092340393f190071a1cf0054e0031d91e10308aa023f805228dc0094e0430f91e1031d91032b0091e20319aaaf210094eaeb41f9efef41f9f7f341f9BL8;FFe007409100800191e10316aa5c9e0094e01bc43de11fc43de223c43de09b843de19f843de2a3843d195c01", - "940078805221008052175c0194207201b4e10319aaL8;FFafffff17e00313aae10316aae20315aa0c000094760a40f9680240f9080116cbbf0208eb69f6ff54e00313aae10316aae20315aa03000094760a40f9adffff17BBBBL4;FF880f010ef6df43a90a32805214001b8a496b74fc208d282e0800669e", - "18c101f220040054e9f301a9eb0b00f90803c0dafc0319aa0811c0da880e488b08011b8aL4;ZFL8;FF1f0116eb490a0054e00313aae0fbff9720fe073728fc60d3080a00b5200840921f1800f1420a0054217c0353610a00343f040071a00600543f08007160030054BL8;FF22008052267c019408008092", - "680200f9f30b40f9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091010040f9f30300aa3f0400f18b000054600640f922008052L8;FFf71740f9e80f40f9080117cbbf0208ebe8380054e81340f9e10316aae20315aa0001178b267c0094e802158be81700f9955a40f9550300b4e11740f9e80f40f9BBB", - "L4;FFe10319aa9d960094e863403988070036e8834039e10740f91f050071cc0a0054680b0035e90f41b25f000014e80600d1290080921f0d00b1696a00a9a8010054L4;FB0800000000000000641848000000000080f347000000000018000000000000000800000000000000101b48000000000080f347", - "00000000002000000000000000L8;FFe92b06a9290080d2480380528910c0f2a02700d1e1030191e87f05a9e82708a92bbc0094f5031f2a1c008092f60313aa2e000014080200d008b140f91f0d00f1BL8;FF84e02491e3230091e00308aa62028052653c0194fd7b41a9ff830091c0035fd6fd7bbfa9fd0", - "30091082440f9080100b4080140b20811c0da081540d2080d088bL8;FF290c40f9e8430f91e1031baa20013fd6fceb41f99f0f00b1a100005448008092880200f908018052f70b0014776a41f900c3c73c01c3c83ce9ff43b9f6db43b9BBBBBL4;FF290d098b29250191e91a498b29050091962281b9d603", - "0034ca0240b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a050091958e40f9150300b4ab0240b2L4;FFcf92fe971f0400b1c00d005408040091ff0208eba1020054f90600f1e00300541b0c0094e00319aa21008052190c0094e00c00b481060091e20319aafa0300aaL8;FFeabf0039eb1b00f9e8", - "3b00b9620c0194fd7b45a9f33340f9ffc30191c0035fd6ff4301d1fd7b02a9f51b00f9f44f04a9fd830091f40301aaf50300aa3f8000f1BL8;FFe10308aae20314aa2d8c0194e10318aab402148bff0a00f1e80316aaf40f00f9a0010054e90740f9215442a9290114cbbf0209eb88050054b50000b46002", - "148bL8;FF4000805241008052228c0094e07300f9c08300b41e8c009440008052410080521c8c0094e06f00f9008300b4188c00944000805241008052168c0094e06b00f9BBBL4;FF190119ea41fdff54ff0500f12001005420a9200e0800669e880100b40801c0da0811c0daa80e488b08010d8ae80300f", - "9208d212e00a8302e0800261e28040037L4;FBac45a755ba65b1756395688575b57ea54fd544c559f552e53b1530052d35262517551c4501750a65aea4a5b4b884b39482e489f494c49fd4f624fd34e004eb14L8;FFe16f813de073813de363813d205e0054e9cb42f9e8c742f9f6cf42f9f9d342f9fcd74", - "2f9f7df42f9df8225f1f8e342f9e9a30da9e9bf42f961520054e8c342f9BL8;FFe9008052e8271ba9fa0741b2e8df40f92083c13ce8c700f9e8a759a98082833ce8a716a978caff34e11740f921caffb4e00b40f922008052194c01944dfeff17L8;FFe10309aa604c0014fd7bbfa9fd030091080040f91f", - "0500b1000b0054083040b9e80b0034080140b20811c0da081540d2080d088b0825019108fd46d308050091BBBBL4;FF200080520104805232ec0194fd7bbda9f50b00f9f44f02a9fd030091091440f9290300b4141040f98a0240395f210071610300543f8531f101040054f50308aaL4;FB496e76616c69", - "645365616c656453656e6465724d657373616765556e6b6e6f776e5365616c656453656e64657256657273696f6e5365616c656453656e646572L8;FFb3ffff17fd7bbda9f50b00f9f44f02a9fd03009148008052f40301aae10302aa000d002af30302aa6aecff97e00314aa615c0094e10313aa66ecff9", - "7801a40b9BL8;FF6842003908008092682600a9f44f56a9f65755a9f85f54a9fa6753a9fc6f52a9fd7b51a9ffc30591c0035fd6a8060091820600d1f8a30191e88b06a908008092L8;FFe182c43ce8a30391e282c53c00630291a0073bade082c63ca2033cade18345ade237c03da1033dada2039c3cd195", - "fe97e00640ade80b41b9010340f908830bb8BBBL4;FFffc307d1fd7b19a9fc6f1aa9fa671ba9f85f1ca9f6571da9f44f1ea9fd4306919f8000f1f30300aac1050054f60302aaf70301aae0430291e10303aa02048052L4;FF4a11407948fe2f37f3ffff17e00313aae10317aae20316aa53feff97770a40f", - "9b9ffff17e00313aae10316aae20315aa4dfeff97760a40f9d2ffff17750a40f9L8;FFfc031faaf6031faaff231fa9ea0301f9e90f01f9e9ab41a9e80b01f9e81701f9ea1b01f9e92701f9e9ab40a9e82301f9e82f01f9e83b01f9e84701f9e85301f9BL8;FF04000014d60600f118630091e00000540183", - "5ff881ffffb4000340f9220080521f2c0194f8ffff17e88b40f9c80000b40805088be00314aa0201805201f17dd3L8;FFe06b823de16f823d6405ff97e8034bf9fc074bf9fb0b4bf91f0500f181010054881f00121f050071ec040054080b00359b1f4092fa0f41b2691f40927b0309aaBBBBBBL4;FFa801", - "00b4690240f9200180398001f8b729050091080500d1692200a9200000f9e0031faaf44f44a9fd7b43a9ff430191c0035fd6e80741b2e9ffff17f40301aaL4;FFe03f813d4183803ce97702f9e0431391e86b02f9fef1ff9708008092880200f9b50000b4e0031caae10315aa220080521b140094e11341f", - "981e300b4e01741f9L8;FFef150012f119112a0f12001223020054d00d403910160012101a112af0090e33cf11009111c200513f2a007102fcff54d4ffff1711121a33cf090091f003112aBBL4;FFf50f00f9269401945b0315cbe00317aa5b6c0094f60301aa3f001bebf70300aa49050054e0230091e10", - "315aae20316aa23008052240080522d87ff97f45741a9L4;ZBL8;FFc806168be00314aa0201805201f17dd323940094752a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6fd7bbea9f30b00f9fd030091011840f9f30300aaBBBL4;FFa183de3c8907009108151c8b000500ada90317f884feff178", - "13b0054f5031faa81feff17a08302d14b0b0094f2ffff17a0a302d171d50094f50301aaa0d20736L4;FB4e00000000000000580700000500000041204900000000005600000000000000570000000900000041204900000000005600000000000000600000001f000000L8;FFee031caae0bf46a9f40304a", - "afe1b43a9f1030aaae81b01f9f57b40f9e80303aafc4340f9e56f40f9e30310aae45f40f9e08710adf00308aaea0312aa08008092BL8;FF1f0109eb2821005413000014f9031faafbb749f9e8074091088109917f0700b1c029005400210491a2170094080040b20811c0da081540d2080d088b08250191L", - "8;FF0081c03ce85f46f99f0b00b1e0d3823de8ab05f901080054e8ab45f9e9c32791e0d3c23de95b04f92901009029013091e80305f92800009008111d91e85f04f9BBBBL4;FF36008052e20301aa09000014a20301d1830c8052d8daff97a00a00b5ba035cf8f7031aaae28e40f8620d00b4410340f9340", - "080399400f8b728040091490400d1L4;FB797320777269746520746f206120537472696e67000000002d9648000000000031000000000000003a00000021000000436f6e74656e7420646f6573206e6f74L8;FFc10000549f5e00a99f7e01a9977e02a9981a00f99f3200f91f0900f1a10f0054e00313aad", - "af3ff9740010036410d00b5e0031faad0ffff17e003082ae20313aaBL8;FFf65713a9f44f14a9fdc30391f40301aa3f0001f1f30308aaa8000054e80b41b27f0200f968d200a91000001408004039590080d2f50300aa1900f0f21fc10071L8;FFe1431691ba110094080340f91f0500b1a0000054e24316", - "9120008052e10318aa04160094e10318aa288c43f81f0500b1e0fcff54e243169140008052fd150094BBBL4;FF240080523aa7ff97950a40f9e10316aaedffff17fd7bbea9f30b00f9fd030091010040f9130840f93f0013eb69010054000440f922008052b30100b4e30313aaL4;ZDL8;FF2ae379d32949", - "d2f28924e0f2571119cb3f0309eba9000054f8031faae00318aae10317aa2bb40094f40308aa09a043a9037040a9f30300aa1a5040b91b0840f9BL8;FFe0631791206bff97e8f342f909068052e02fc13d6822099be133c13de237c13d18000014c80080d2e0031791e3032d910800f0f2e4833291a10200", - "b021a40691L8;FF96f3ff97e02900b5e1031faae9ffff17802700b5a02302d16ef4ff97e80301aa80000036e82700b5e1031faae1ffff17e1031faae8630ab9deffff17e16b0ab9BBBBBL4;FF4901098b6c010c8b2acdcaca8bc1cbca2981c9938c010a8b6901098b8d81cc938abdcaca2badcbca280108c", - "aa91d40d208010a8b6901098b0acdcaca0881c893L4;FFe8bb41b9e9e340f9e92700f9e8680037f52f00f9f5e740f9fc2300f9ba0000b4e00315aae1031baae2031aaa24040094bc7e6092a3000014e88b41f9e84400b4L8;FF27040194f8ffff17680240f9c80000b40805088be00314aa0201805201f17", - "dd31f040194745642a9950100b49622009104000014b50600f1d6620091e0000054BL8;FF44840194fd7b43a9ff030191c0035fd6202040a9210300b021200e91030d40f902048052fd7b43a9ff03019160001fd608200091094000912203009042e80491L8;FF5f0500f108ffff540a09098b4b0140797f", - "01186b610000545b050079c1ffff17aa0240f93a25899a9f030aeb8003005416091a8b88031aebc900005402f57ed3BBBL4;FF817e0353a11800343f080071400400543f040071e1060054e81342f91f0500b141020054ff1302f9f81702f9fffe02a9ff7e04a9f82302f9f82f02f9fffe05a9L4;FB72656", - "d6f7465206964656e74697479206b65790000000000ed624900000000004d000000000000005f0300001c00000073657373696f6e5f76657273696f6e72L8;FF2013843ce8ab03f9e9af03f974190094e8b343f91f0500b1e86f00f980390054e8b743f9e9bf43f9f80314aa2013c93cf4bb43f9e0c30391", - "e86300f9e8c343f9BL8;FFa7000014c80080d20800f0f2080500d1a0c300d1a8031df8123a0094e10300aa7a000014e00700f9c10200b021200a91c30200b0637c0a91e0230091a2008052L8;FF080380d20800f0f21a1100d1e9d342b9204bc03d8101c03de88f01b9e94303b98041883c8021c03de9534", - "3b9811d803d8182823c8082833ce98b01b98082c23cBBBBL4;FF4ae401941f10003121100154f9ffff1747e40194f70300aa1f0400b141fdff54e04305918100805242e40194000f0135e85341b9e82b01b957ffdfc8d70200b4L4;FB45e7480000000000340000000000000037010000220000004d41432", - "0766572696669636174696f6e206661696c65640099e74800000000003400000000000000L8;FF9f0600b1e10100541c000014f803172a5700805205000014940000b4e10314aa220080521ee40094f41b40f9e81f805277e20029680200399f0600b1e0010054BL8;FF2f640194e82b41a9e98340397922", - "00b969120139e95b4079742201a9e82b40b969920278685202b8e82740296ac203f87c92003968ba0039e80740f969ae0039L8;FFe9ffff17f44f41a9fd7bc2a8c0035fd6ff8300d1fd7b01a9fd430091e10b00a94201009042003291e70305aae60304aae50303aae1030091e3230091e40302aaBBBL4;F", - "F0140c13c6212803d685200b9600600ad21010054f44f5ea9fcd340f9f6575da9f85f5ca9fa675ba9fd7b59a9ffc30791c0035fd6600300d000000f91620300d0L4;FF210400d1011400f9c2fcffb4550400f981021091a30c8052820242f9800c80d2352000f9a20200f9222040f9431000b9332040f9f5", - "5b42a973620091f76343a9L8;FFa8831ff873a4009473a40094f44f43a9fd7b42a9ff030191c0035fd608004039090900d11f09007128819f9a280100b41f0500f1e1020054a80100f008e10a91BL8;FFc0035fd63f8000f1e10200540c5040780a1040b80b0040390d7c40390e7041f81f0100396b111d1", - "20c0d00790c0840b90a2100b80a1c40390c9100b80c088052L8;FFfd03019100e4006fe80301aaf30300aae1830091e00308aa02048052e00301ad4dd6ff97e9ff4039e88340390a088052e00300912a15003308111d12e8830039BBBBBBBL4;FF02018052f44f42a9f65741a9fd7bc3a823180214f44f42", - "a9f65741a9fd7bc3a8c0035fd6c0035fd6fd7bbea9f44f01a9fd030091088040391f0d0071a1010054L4;FFc101805233180094a00000f000602f91a20000f042e02991e10680522e18009420008052e10180522a180094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9L8;FFf44f05a9fd4300911608", - "40f9760200b4335040a9380200f018f30591170440f9b9730091750200f0b5a21791e8164038e3030091e00313aae10314aae20315aaBBL4;FF08f15f381f010271e1020054220400f109008092e8a30691b6e303d1e08b1aa9a98310f8a90312f8a98313f8a90315f8a98316f8a90318f8a98319f8a9031", - "bf8L4;ZFL8;FFa9c315386901084aabf35538a9d315384901084aaa035638a9e315386901084aab135638a9f315384901084aaa235638a90316386901084aab335638a9131638BBBL4;FF0283843ce10302adb70000b4e02340f9e10317aa2200805221d80194e12b40f9810000b4e02f40f9220080521cd", - "80194e14340f93f0400f18b000054e04740f9L4;FB34356363642f303639353962342f7372632f76312f6368756e6b65642f73656e645f656b2e7273002f636172676f2d6769742f737061727365706f7374717561L8;FF08008092f9030faaf60312aaed5b00f9ed030aaaf26f40f9ca008052ea230ea9e", - "14740f9f79f00f9f70311aaf10306aae8031aaaea0304aae40310aaf00300aaBL8;FF09692138e1431691ead302f9d0110094e85349f9280500b409e179d3f84f49f959038052361108cb04000014d6c201f118c3019120040054e1d342f9e8cb42f9L8;FF1f0500b1801c005401430291a22302d1aef6ff", - "97e0f9ffb453010014e83746f91f0500b1a1000054ff3706f9f63b06f9ff3f06f9ff830cb91f0800f1e1350054BBBBL4;FFe00740adc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aa1bf80194e08741ad28008052e217c03dL4;FB61646472", - "65737320697320696e76616c69643a20c0012ec00011696e76616c69642073657373696f6e3a20c00030696e76616c69642073656e646572206b6579L8;FFcafcff17ff8301d1fd7b03a9f65704a9f44f05a9fdc30091081c00121f090071a1010054e00302aaf30302aaf40301aad7f7ff9720020037750", - "240f9a80640f9BL8;FF010300b021182e91030300b063201891a00301d1620280520401805224000014010300b021182e91030300b063201e91a0031cf8a00301d16202805204028052L8;FF21058052e0ff833de05fc73d22008052e103843de207843de0f3863de8eb0df91f780094e00314aa01048052", - "220080521b780094e8074091e00319aa01788052BBBL4;FF6a2604a9620200ad6c3200f97aa2013919fdff17e02302913ca5ff97f50301aa80a007370afdff17a06301d1a8d33aa945950094200080522102805225b80194L4;ZBL8;FFeefeff373e0000141f150071210500546c0400f1c00b00549f2900", - "f14d018052eb031faae9031faaea031faa8c318d9a4d040091ae696a384a0500915f010cebBL8;FF2925019129fd46d3290500910a0840f94a0400b40b0440f9ed031faaec030aaa6b4100916e8541f8cf0140b2ce010d8bef11c0daef1540d2ef0d0f8bef250191L8;FF2200805226380094e14740f9810", - "000b4e03f40f92200805221380094683642f9094940f9290001b4690242f901a140b960fe41f9280d40f900013fd6607e02f9BBBBBL4;FFf90303aaf80300aa5f2800f1880000542800028b08f1df38e809f837e0230091b8710094e80b40b9a8ea0737e80f40f9e90640f92a0108ebc3150054e90240f9L", - "4;FFe02300918899b972887ea89b01fd63d3f2ffff97f50f40f9e10740f93f0015eb00030054a899995249018052e083c03c8899b972aa060091887ea89b6002803dL8;FFffc300d1fd7b02a9fd830091490200f029813d910a0000904ab12791400200f000403e91e92b00a96902009029a10591e103009", - "1e92b01a948080194fd7b42a9BL8;FFe12b40f908008092686a00a9c1fdffb4e02740f9eaffff17f6031faae00315aae10314aa2f9cff97800400b4e88340b9e93348b8611a00f9ea1f40b9e12b40f9L8;FFf44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6ff1b00f9e01b40f9e103", - "18aa2a880094e0031faa28880094e10317aa26880094620100f0BBBL4;FF36008052e20314aa0900001461530191a26301d1fcb2ff97601000b5788f40f9f70318aae28e40f8e20d00b4010340f93a0080399a00f8b728040091490400d1L4;FB7b0000003c00c800e700a4002501660031003d00135a685", - "2842b003b362c0b1640315f756f31061e110d0d000000000000000000000d00000000000d1100000dL8;FF940100b4f522009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f9220080521dc80094f8ffff17dc0000b488071c8be00317aa02018052BL8;FF04000014730600f194c2", - "0191c002005481825cf8810000b480025df8220080521f48019481025ef8810000b480825ef8220080521a480194810240f9810000b4L8;FF4a0d0a8b4a25019129194a8b29050091280108abc2010054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108a", - "bBBBBL4;FF29610391ab0302d1ea830291e8270ba968008052e90300b0293d3b91a04700d1a10302d1682503a9e803009008251891682905a98a068052480480527f2500a9L4;FB08000000000000000800000000000000704d4200000000000000000000000000080000000000000008000000000000008", - "04c420000000000e81f400000000000L8;FFa00400543f080071400200543f040071a1080054e8b340f91f0500b1c1000054e8170291ff7316a9ffbb00f9ff7b01b91ff10ff81f0800f101330054a0c303d1BL8;FFfd030091f30300aa2168019400028052010180521f680194000100b40103009021a02b", - "91130000f91f200039f30b40f9fd7bc2a8c0035fd60001805201028052L8;FF2468009440f8ffb4fb0340f9e2031aaafc0300aae1031baa2968009418000014e8ef41f9080f00b4e9f341f9e80302f9e8830591ea0310912b0000f06bd13e91BBBL4;FF2300805224008052399bff97b6035cf8dafeff17a", - "04301d1220080522300805224008052329bff97a1035cf8e0feff17a04301d1220080522300805224008052L4;FF00021fd6fd7bbea9fd030091f30b00f9f30300aa00200391730200f9310b00941f0000714b03005481000054200000d0210080520140063941008052200000d0L8;FFe10f01ad0805009", - "1a00b3cade213c03de80f00f9a30b3bade28347ada0073aade08746adb4f35438220114cba10b39ad330302eba003913c22020054e10740f9BL8;FFe00314aa22008052a0873dade00759ad290dc0da080dc0dae9cb01f9e8cf01f9a0873bade2035cada2833eade1035aada1833cad2428019400e4006ff", - "f7f0e39L8;FFa0010054c1825ff881ffffb4c00240f92200805222280094f8ffff17a0c300d1e1031aaae2031baadfeaff97b9eb7da90cfcff17e89740f9c80000b40805088bBBBBBBL4;FF20e5073657fbffb43a000014e00313aa7a110194e80300aae00301aac8f10736a0dfffb423000014210a0054e", - "0031faa9dfeff17880080d2e00b00f90800f0f2L4;FF58c2ff97f603002aa04700d155c2ff97e8074091e98b41b908411d9109010039e98341b900fd0039e007409109050039e97b41b900401d9118d5003909090039L8;FFe80740f91f0500f1c0000054e00b40f9e11b40b9fd7b43a9ff030191c0035fd", - "6e80b40f9e91b40b9600200b000203591630200b063003291640200b084803691BBL4;FF0118805233900194200080528103805230900194200080520104805238900194fd7bbda9fc5701a9f44f02a9fd030091ff0740d1ff0300f9ff830ad1090440f9L4;ZDL8;FFc0035fd6880100d008792c91e00301", - "aae10308aaa2028052fd7b44a9ff4301915d900014880100d008912e91e00301aae10308aa62028052fd7b44a9ff430191BBBL4;FFf50319aaa1000054f94f40f9f88b40b9f34340f957ffff17280400f008b140f9f94f40f9f88b40b9f34340f91f0500f109eaff54e8b30291a90300b029610391L4;FB2", - "68b711645dd061128ea31f8f897dfcbda279d1878f1a28c1ee803560000a338555bbb2f39fc95452cdbd73b3e26877c8b338d2ac24b89660aed28599ff515afL8;FFff0200f1e9b742f9000540ade8079f1ae80208cbe96306f91f0500f1e02b833de12f833d8c040054a81000b5e027c33de0030991e123", - "3391022f8052f77300f9BL8;FF0083c13c0003433908e301910183c23cea2301a9e8a3039181820091a50303d102048052e3031caae4031baaa0073aadf55b02a9fa2700a948a6ff97fb7740f9L8;FF280100f0a905003608b140f9e92740f91f0500f109030054080000b008713e91000100f0001c1991a", - "92338a9e8632291a90000b029c10491a10302d1a82739a9BBBBL4;FF27f00194e10740f9c10300b4e00340f91a0000141f09007161010054090180d208df78920900f0f2290140b20b000014090180d2e8031faa38ff48d30900f0f2L4;FB6e2073746174652069732066726573686c6f63616c5f6964656", - "e746974795f6b65795f627974657372656d6f74655f6964656e746974795f6b65795f62797465L8;FFe0030091020280528400805257e5ff97e10340f9c6ffff17e80f41b2c0ffff17c80080d20800f0f208090091bcffff17ff0302d1fd7b03a9f92300f9f85f05a9BL8;FFce194f8bce050091cd010d8b", - "ae0140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191ad194e8bbf010ceb830400546b0500f14a810091ec030daa21fcff54L8;FFe8031faa000119ab42730054e1431691b70d0094f90b40f9df0a00b100040054e1d342f9e8cb42f91f0101ebe0530054e8cf42f92a04009180c2029149018052BBB", - "L4;FFe96b00b9a9935b38eb830439e97300b9aa8310b8a80000b4e01f40f9e12b40f9220080521eb00194a06303d1e10316aa2200805223008052a8e7ff97a8e772a9L4;ZBL8;FF4c1540388b010b4a6001002a61ffff5426090094a1835bf8fa03002a810000b4e0031caa220080521db000945f1f00724", - "0080054e00319aa0108805222008052BL8;FF08c92691e96306f9290080d2e87b06f9c80480526940c0f2ea7f06f90a078052ff5306f9e85b06f9ff5f06f9ea6706f9e87306f9e97706f92530019450000014L8;FF892e00b968020b39ff833191f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6", - "a8c0035fd6e10000b021600a91e0430f91a2028052fb5f00f977090094BBBBBL4;FF15e13da919e13ea91b811fb82800809229008052880200f969520039f44f46a9f65745a9f85f44a9fa6743a9fc6f42a9fd7b41a9ffc30191c0035fd6200140fdL4;FFfd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a", - "9fd030091130840f9f40308aa330200b4160440f919000094e00313aa2100805217000094400200b4e10316aaL8;FF3f104071c30b00544b09c0396c1d00122c380c0b811140516b00f8376b008052430000143f004871030b00544b0dc0396c1d00122c540c0b810148516b00f837BL8;FFffc300d1fd7b", - "01a9f31300f9fd430091130040f9e00301aa010300f021d42991e8030091a20180526980019468620091010300f021082a91240300d084c02691L8;FF800100b4e11740f9e80f40f91f0101eb608b0054e81340f9090280522a040091ea1700f909692138e16300916980ff97882240f9680500b409e179d", - "3961e40f9BBBL4;FF61820091f60700f92dc00194770a40f9ff9e00f1a9010054f70600d108038052690640f9e826089b770a00f9010140f9290400d13f0d00b188000054000540f9L4;FB7465636861696e5f6b65796d6573736167655f6b65797300df7a4900000000004e000000000000006402000013", - "000000696e6465786b657950656e64696e6750L8;FF882640f9893240f9a0073ead8082c33c8116c03da2039e3ca003963c8183813ca80317f8a98318f8b70000b4e00318aae10317aa2200805219c00094e8830291BL8;FFe00313aa2200805226000094610a40f9a8ffff17e00313aae10317aae20315a", - "a20000094770a40f9680240f9080117cbbf0208eb89f5ff54e00313aae10317aaL8;FF152300a9f7fbffb5f62b40f9f51f40f996000037d80000b018e31e9113000014d7fe45d3e80214ab820c0054e90200aba20c0054aa0217cba8831cf8a8c300d1BBBBL4;FF1f10003141900054f9ffff1748e00194f", - "70300aa1f0400b141fdff54e04305918100805243e00194208f0035e85341b9e87b00b957ffdfc8d70200b4ff0600b1L4;FB656e746174696f6e2072657475726e656420616e206572726f7220756e65787065637465646c790052fe4800000000004b000000000000007f0b00000e000000L8;FF0aa5c0a", - "90b7142a90e3156a9143555a9ea4700f903015ba9e96b00f90a2541a9eed300f91b695ca9e9e700f9091940f9ed330ca90d3157a9ea271fa90aa543a9BL8;FFea0300f96c600194fd7b42a9ffc30091c0035fd6fd7bbea9f44f01a9fd030091f303012af40300aa196001940004805201018052176001942", - "00100b4140000f9L8;FFddffff17e00700f9210100f021e03491230100f063f43491e0230091a20080524402805286000014c90080d2a8831d38480080520900f0f2a0c300d1a8931d38BBBL4;FF490300b029610391e1c30191e82704a9280080526903009029a10d91e8270aa9480300d008a12991e82b", - "0ca94a06805208048052ff2707a9490300d029d52891L4;FF030c40f26104005401c05f3802d05f3804e05f7842100012c1020034240200347f000039007d20d4b2f8ff97e10300aac2028052000080d2220000b9fd7bc2a8L8;FF74a0009468620091810100f021381891a40100d084801691a363009182", - "018052a80f00f96ba000946ba00094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1BL8;FF210300b4080c40f9c8010036291448ab620300542afd7bd38a0000b528e97bb3080c00f907000014f40301aa21008052f30300aa15000094e10314aae00313aaBL4;FFfd7b43a9ff030191c0035fd6c00000", - "b00000359128200094c00000b00060359125200094c00000b000c0359122200094c00000b0002036911f200094c00000b0L3;ZB" + "BBBBBBBBBL8;FB6f756e743a20c0002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639L8;FFf44f0ba9fd830191081c40f91f0500b1e0100054290c40f917050091f30301aa3f0117ebc10e005400e4006f16844", + "2a9748e40a9f50300aa24feff9084e03291BL8;FF61da40f9810000b460de40f9220080529924019461e640f9810000b460ea40f9220080529424019461f240f9810000b460f640f9220080528f24019461fe40f9L8;FF08050091280800f98b0200b5e0030caa1b000014e10300a9e00301aae10308aa22", + "0080522300805224008052f4030caa87000094e10340a9ec0314aa2aa040a9BBL8;FFa3730091e10314aa0204805224008052f30308aab5730039ae140094942240b998640194000480522100805291640194a00100b4e00740ad08048052688200a9L8;FF420180524401805211000014c80080d2a0831d", + "38a0c300d10800f0f2bf931d38a8031df8fa6aff97e80300aaa1fdfff021442391a3fdfff063602291a0c300d1BL8;FF0800f0f20809009152ffff17e00300f9a1feff9021c81191a3feff9063700e91e0030091c201805284018052f1ffff17c90080d2e8230039480080520900f0f2L8;ZDBBBL8;FB636", + "5737366756c206465637279707420616c776179732068617320612076616c69642062617365206b65790000000000bb124000000000003800000000000000L8;FFe11740f9e80f40f91f0101eb40850054e81340f9090580522a040091ea1700f909692138e16300910d92ff97887240b91f050071a10000", + "54818a4e29e3630091BL8;FFe87b41f9e97f41f940030291e10315aa080102ab2935899ae87b01f9e97f01f931000194c8de7992c21a4092e0c30891a102088be2bf0a399604019494420091L8;FF8102178b20008052e20316aaaa170094800200b4c000f8b6af0d0094080040b91f110071e0feff54050", + "000141f0016eb1700178ba9fdff54040000141f250071BBL8;FF4a25019129194a8b29050091280108abe20c0054695241b969010034290140b22911c0da291540d2290d098b2925019129fd46d329050091280108ab83000054L8;FFe8a701a94040009480fdff9000a012914d40009480fdff900020249", + "14a40009480fdff90008024914440009480fdff90000020914440009480fdff9000602091L16;FFa80100f0e29309a9e4030caaf02f00f9eec300f9f2b300f9e9df00f9e98b44f9ea9700f9ea8f44f9e0cf00f9081140f9ea4b00f9e97f00f91f0d00f1e3650054BBBBL8;FB5f63743200000000ef104000", + "000000004e00000000000000640200001300000056657273696f6e4e65676f74696174696f6e646972656374696f6e6d696e5f76L8;FFe83700f97f0200f96082863ca00b7ead6182873ce11bc03d6282853ce00b01ad6182883c6082843cff430791f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8BL8", + ";FFff830091c0035fd6e1fefff021f83091c20280522a100114fd7bbfa9fd030091083040f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d3L8;FF02c4805200c00e9101813191a11400949c14009400c480522100805295140094405d00b4e10b409102c48052f60300aa21c00e91", + "9714009492140094008c8152BBL8;FF3d50019420008052e10313aa3150019420008052e1031caa2f500194ff8301d1fd7b04a9f32b00f9fd030191098440a9f30308aae8230091e00309aaf14e0094L8;FFa10356f8810000b4a08356f82200805299540094e8031faa170100b4e91740f9c900003628fd", + "60d3e88305b9e80f40f9e8cb02f9e80317aae0832291e1031691L16;FFabd0ff54e00740f9e10314aa2200805299d4009480feff17e0d7c23de8b345f909008092e0430f91690200f96082803c680e00f9bcddff97080700d1fa031c2aBBBL8;FF770a40f9680240f9080117cbbf0208eb29d3ff54e00313", + "aae10317aae20315aa230080522400805203000094770a40f991feff17ff0301d1fd7b02a9f44f03a9L8;FF6c010014e8031faa00011aab42690054e1431691610d0094df0600b18000005480220291e1431691561200943f0700b1f90b40f9007fff5401c30391e2431691BL8;FF220080529cf40094613", + "240f9810000b4603640f92200805297f40094610240f9810000b4600640f92200805292f40094610e40f9810000b4601240f922008052L8;FF601a40b90000042abf00006a80000054000080d21f000039007d20d4c4020034a000000b1f00066b60020054e00c4039a200040b1f1c007260010054607200", + "91BBL8;FF6b0100346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0d009104000014eb031faa0d0000144b0080522c0100348c0140b28c11c0da8c1540d2L8;FFe2431a91c1058052e84b03f9e94f03f93930009460fdff90000015914b30009420008052e1031aaa2b30009420008052e1", + "0317aa2830009420008052e10319aaL16;FF89e240f90101c03d88d640f98a2207918083873c4001c03df8431091a8031df888ee40f900430191a9831ef8f73f41f981220091a003963ca2837eada1039c3cBBBBBL8;FB696e76616c6964207369676e6564207072656b6579206964656e74696669657200", + "00000000000000000000000000000000000000000000000000000000000000L8;FF008033915098009440008052e10317aa31980094ff8302d1fd7b04a9fb2b00f9fa6706a9f85f07a9f65708a9f44f09a9fd03019137c040f935204639f30301aaBL8;FF090180522a0400916a0a00f909692138e10313a", + "a50faff97e00314aa088c44f81f0500b160000054e10313aa75fdff97950a40f9550300b4610a40f9680240f9L8;FFe0074091e1031aaae20315aa00401d91fa0a0094f5ab4bf9bf0600b1c0230054e0dbc53dfcaf4bf9e077803dbb0000b4e0031aaae1031baa220080528e1c0094BBL8;FF683340f9600", + "30191e10301912200805208050091683300f932580194f80340f9ffff0139f9031caa22ff46d3e20000b4683340f960030191e10318aa0801028bL8;FF00080036c1efffb4e5010014c01b00b5a02302d1d0f4ff97c010003601efffb4e1000014c02300b5a02302d1caf4ff974010003641eeffb4210100", + "14e18f0cb9L16;FF680240f9941e40f91f0101ebc00b0054680640f9490580522a040091e00315aa6a0a00f909692138e10313aa0ceaff97760a40f9680240f9080116cbbf0208ebBBBL8;FF9d7c0194a1825ef8810000b4a0025ff822008052987c0194a10e40f93f0400f1ebfdff54a01240f922008052", + "927c0194ebffff17880240f9280100b4090d8052L8;FF89630f91e187c53de8436c79f5174bf9fb1b4bf9e01b843d2001c03de11f843de8032179280100b0e0fb833d081140f91f0900f189040054e8633f91e90000d0BL8;FFf8031faae00318aae10313aa32f80094fd7bbca9f70b00f9f65702a9f44f0", + "3a9fd03009109800091f40302aaf60301aa29fddfc8f30300aaf50308aa3f0500f1L8;FFf40301aae1031faae20315aa4fffff97e10314aae05341a9eaffff17080040f9680000b4000440f93d060014c0035fd6fd7bbda9f65701a9f44f02a9fd030091BBL8;FFa9631838a99358384a01084a6b01084aa", + "a731838aaa358382901084aab831838abb35838a9931838a9c358384a01084a6b01084aaaa31838aad358382901084aL8;FFf8830d91dd070014f74300f9f7031c2af65b00f996ff60d3619243f9810000b4608e43f922008052933c0094619a43f9810000b4609643f9220080528e3c0094L16;FFfa031f", + "2af9031c915c0b00b4f86f40f9f50314aaf66300f916008092f7031caae00318aae10317aa2200805292bc0094df0600b1e0090054e8ef42f9e0031a2aBBBBL8;FB4950a269a4d10129996f60636a2a0576d286d9af5166a96b08796ed2d1356d5b4b050ad6260c58b75a2e324b9da1092fa9fc816390799", + "5cfa28c3f14c8892782L8;FF2d140653e5c340b90801150a097c890ae79b56294a7c8a0a6b7c8b0a2e180753efc3971a8c7c8c0aad7c8d0a08010f4a301c08532f200953f9fb55290801094aBL8;FFe86704f9e8c31d91a04700d1e86b04f968008052e1833291e97f06f909078052e86b06f9c8feffd008", + "a52891e96706f9290080d2ea6f06f9c93bc0f2e87b06f9L8;FFff0f00f9bf0214eb49f9ff54e0230091e1031faae20315aa2300805224008052f30308aa8ae8ff97e80313aaf35341a9c3ffff17e0230091e10315aae20314aaBBL8;FFa9035df80001803d090900f9c8060091a1835af8680a00f9810000", + "b4a0035bf822008052944c0194a88200911f011beba802019181f2ff5412000014e0031faaL8;FFf65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091150840f9080040f9f40302aaf30300aa080115cb5f0008eba8010054b40000b4680640f9L16;FFe9cf40f9edeb40f91f0900f1490", + "60054880100d008011591e97740f9e8ef01f968feffd008611d91e9eb01f929038052e1430f91e8a303f962008052e8ab03f9BBBL8;FF3c00805237008052f40318aa818e47f89ba204a90804805296f201a995a205a980a206a9a8c35fb899ea02a997ae03a9887a00b9810000b4004340f922008052L8;", + "FF5f0700b1e12700f9800b0054e00641ade0430691facb00f90083823ce20242ad0183833c0083853ce10240ad0283843c0183803c0083813c40030094fc2740f9BL8;FFe08742adf50300aae21fc03de84340f9e08709ade08740ade257803de85316a9e08707ade28341ade28308ad802300b4e0c30391", + "49f7ff97e2000014e1430091L8;FFe9fdff5494060051010003cb73420091987e4093630640f9e9ffff17007840b901000014c80780d2007c4093427c4093010000d4f3f5ff17000400b4fd7bbea9BBL8;FFfad342f9fc0740919c8301914afeff1720ffffb00080339148280194f80300aae04316912200", + "8052a0100094e1d342f9e00318aad4fbff17f90300aae0431691L8;FFf65701a9f44f02a9fd030091330400b182030054b300f8b6f6031faae00316aae10313aa2c280094f40301aaf50300aa942c0094e00313aa2100805236008052L16;FF01048052220080529bac0094e16342f9f81340f9810000b4e", + "01f40f92200805295ac0094e11740f9810000b4e00740f92200805290ac0094e14b42f9810000b4BBBBBBL8;FB696e672f706f6c796e6f6d69616c2e727300287365745f756e61636b6e6f776c65646765645f7072655f6b65795f6d65737361676520666f723a20c010207769L8;FFa8020079a0090054a", + "002407908ffdf88e801003568034039e103142a1f05007181030054e2031f2a0e07009408fc78d309fc60d3287b68782821084a095d1053BL8;FFe9000014c1620091e20313aae3fcff97a00100b4c9000014c1c20091e20313aadefcff97000100b4d6000014e01c00b5e00313aab7fdff97e80301aa400", + "10036L8;FFe083c43ce82f40f9df0a00b1e00b803de81b00f9c1000054e1230091e2830091e00315aadbf6ff970c000014e01bc03de10bc03de81b40f9e10740f9a0839e3cBBL8;FFa2060054017c0353c1060034e0620091a3a300d1640c8052e3eeff9740fbffb434000014a0a300d1176f0094e80300a", + "ae00301aae8fd07362e00001400f7ff54L8;FF1f0002716200005435008052070000141f0020716200005455008052030000141f404071d536969ae80740f9080114cbbf0208eb28040054e80b40f91f000271L16;FF081c00121f090071a1010054e00302aaf30302aaf40301aa80edff97200200377502", + "40f9a80640f9160101eb82020054e80f41b2e80300f907000014c90080d2BBBL8;FB08944000000000005000000000000000a00000000900000008944000000000005000000000000000840000001e00000059944000000000004800000000000000L8;FF18fcff17f30300aae0630091220080522300805", + "22400805275a4ff97e11740f9e00313aa9afbff17f30300aae06300912200805223008052240080526ca4ff97BL8;FFf7feff97e10315aae05741a9b7ffff1708010036c0feff9000803991c2fefff0420002912102805237fc009448060037e0031f2af44f45a9f71b40f9f65744a9L8;FFff830091f44f", + "45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0031faa2cfcff97a0877ea92afcff97fd7bbea9f44f01a9fd030091f40300aaBBL8;FF160040395b0080d2f50300aa1b00f0f2dfc2007122010054c87e0453690b00910a000014e80b41b20900809268fe00a9690200f92a010014df3e0", + "171e9000054L8;FF604641f9220080529b4000947d0b0014f7031faa080080921c0180527f220fa9601ec03d684240f969220b916182ca3c6282cb3c77720ea92001803d6082c93cL16;FFe6e340f9e8f700f9f60740f9f23f40f9e8c340f9f16740f9e56f40f9e14740f9e45f40f9e8b300f9e8ab40f9e0", + "6746a9e8c300f9e89740f9f0b74aa9e8ab00f9BBBBL8;FB04010a82858c137a8600c502a9ff2ee5a4198354eacc567290a06a1d2a78c564e32e78d1bfc74716e40db55b9ebf8997d71c000019312952c9acd0edc00d4791L8;FF08feffd008890891e00301aae10308aa42048052fd7b44a9ff430191288c", + "001408feffd0088d0791e00301aae10308aa62028052fd7b44a9ff430191208c0014BL8;FF6822099b690600910001803de02fc33de9f702f90005803de033c33d0009803d9c6300917b0700919f0314eb0071005400e4006f0823059189ab40a9ffa305f9L8;FFffc303d1fd7b0ba9f76300f9f6570da9f", + "44f0ea9fdc30291553040b9f30300aaa8c300d1e00302aaf40301aab6c300d1f53f00b9fabbfe97a8035df8c082c03cBBL8;FFe00319aae10315aa334c0194f8c30c9107000014e0231291c1820091fc070094e84742f91f0900b120fbff54e0c30c91e1231291022b805296500194e92740f9L8;FF3f050", + "0b121faff54e00308ab23ffff5480fdffd000003a91484c0094e8031faa090840f929f5ffb5091440f9e803088b09f6ffb5b6ffff17e9031faa0a2440f9L16;FFf1d703f9e8bb03f9e89340f9e6df03f9e8bf03f9e8db40f9fbe703f9e8c303f9e8cf40f9f7ef03f9e8c703f9e8c340f9faf703f9e8cf03f", + "9e8ab40f9f5fb03f9BBBL8;FF090d80520a2940f9e083c33c692a099be0031faa200d803de083c43c2011803de083c53c2015803dea3740f92a3100f96a060091e083c03c0a2d00f92001803dL8;FFe8a711a9a8fdff9008053691e8ab13a98a06805248048052ffa70ea9a9fdff90299d2a91e9ab10a929", + "0080d2e1a30391090ec0f2e8ff0fa9e8a712a9476c0094BL8;FFa1fefff021d80d91a3feff9063803891e00300916201805204018052e80300f911000014c80080d2e0230039e00300910800f0f2ff270039e80300f9f4f6ff97L8;FF3f1400385f0001ebc1ffff5420030e912100805201400e39e2ffff1", + "700231f9162030094e10315aae00313aa0b030094000080d2f35341a9f55b42a9f76343a9BBL8;FF0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb681200548e00001480020391f9160094080040b20811c0da081540d2080d088bL8;FFba031ef89c3000941d0000141a0", + "180d29bff48d31a00f0f2691f4092fb0309aaa1035df8615900b5ce020014090180d20900f0f23a017fb2e91f4092fb0309aaL16;FF9db00094e10340f9810000b4e00314aa2200805298b00094f44f49a9f93340f9f65748a9f85f47a9fd7b45a9ff830291c0035fd6200080520104805226ac0094BBBBB", + "L8;FB4d000000000000005303000009000000a1104000000000004d000000000000005b03000009000000436861696e73656e6465725f726174636865745f6b657973L8;FF4a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aabc20600542a0140", + "b24a11c0da4a1540d24a0d0a8bBL8;FF4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff5400ffff90008029914014019400ffff90L8;FFc0028052210080529a18009420dd00b428fdffb008e53d91e90300aa0001c03d08e140f8ec0", + "741b2c20280520000803d08e000f8c8028052e8bb00f9e16b42f9BBL8;FFe20315aa0001178ba2580194e802150be8ff00394a000014e80316aaf80317aafa010034e8030091e10317aaf802028b00011a8b97580194e83340f980030191L8;FF150500b49642009177028052b8fdff9018e711910600001", + "42200805296580094b50600f1d6c20091c0030054c1025ff8280041d21f8d00f10831979a1f6d00f1L16;FFa06a68f8220080529bd80094dbffff17e0230b39e0030b91ff270b39f56301f9fbdeff97e80300aae86301f981feffb0210c129183feffb0638c1291e0030b91BBBL8;FF3f040071c00400543", + "f080071c103005481620091e003082ae20313aadefcff97800400b4950100143f0c0071600400543f100071810200541f0900f101350054L8;FFfe280094e1431691641100949f0a00b1e10b0054e1ffc33de8d342f9e90348f9e067c13d8183813ce83b08f9e80f40f9e94708f9e11fc43de223c43de0fb", + "863dBL8;FFfd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091080040f9f30300aaa80000b4600640f901f97fd34200805292f80094680e40f9a80000b4601240f901f97fd3L8;FF80010037f3031f2a1403174b683e00121f21346bc2010054281340f9c1520012e00315aa7306001100013fd600ffff342", + "0008052f44f44a9f65743a9f85f42a9BBL8;FFf5074091b5820991e6850094f43349f9e0431691a1220091027380529d380194e083c53de187c53d15008092e8436c79e057813de15b813de8e30a7920010014L8;FFe8feff17e0dcff54c9010014a0dcff54c80080d20800f0f20809009103010014c8008", + "0d2f64705f90800f0f2080900d107000014e04705f9e80b41b204000014L16;FFe6435f39ebbb01f9eb6740f9f4bb43f9e90316aaf60315aaf503062af8030baaeaaf00b9edbf43f9f9c343f9fec743f9eecf43f9f2d343f9f1d743f9e0db43f9BBBBL8;FB42024000000000006a00000000000000f30000", + "002e00000042024000000000006a00000000000000950000002e00000011000000000000001400000000000000L8;FF680240f9690a00f91f0500b1e0130054608640a9c2fe44d338e6ff97b78359f8f503002a133c0853a88358f8ff0208eb61000054a0e301d1ed820094a80359f8BL8;FFe9630191208", + "3c33c2183c43c29610d912283c53cea670a91200500ad2083c63c414fc03de8bf01f90800f0d2220101ada90359f841f18f3ce9d701f9fbc301f9L8;FFef0310aa000500540b1940396bc100517f25007128550054292d0c1b5f1d00f1f6030daae1030eaaef0310aac0030054081d403908c100511f2500", + "71e8530054BBL8;FF00018052e10313aa33440194fd7bbca9fc0b00f9f65702a9f44f03a9fd030091ffc30ad1282440a9f30300aa1f0109eb000900540961009100e4006f0aa140a9L8;FFe8430691e32b40b9fceb41f9e0e30091c1e20091e2830b91e403182ae5031baaf81f00b94cddfe97f89341b91f", + "0b0071a1070054faa359a92083c13c2183c23cL16;FF0001c03d21000891ec0b18a9022f8052eae700f9f9030baae0f3803dfc030eaaed4700f9e4af00f9f51300f9f48f11a9f1df00f9f0cf00f9e6fb00f9fa2300f9BBBL8;FFec3300f8ea0b00f98afd68d32c0140b9eb630039eb0340f929f140f86d32", + "00294d7d10536b0600f92bfd68d32cfd60d36a2200796a7d1053693201b8e90b40f9L8;FFe00302aaf40302aaf30301aad2000094e80300aae00301aa08020037980240f9080740f91f0100eb42020054e80f41b2e80700f907000014c90080d248008052BL8;FF9ffe09a99f820a3881220291e20313aa9", + "2f8ff97401200b5e1031faae2ffff17880245f81f0500b1a10000549f6605a99f7e06a9997e07a99f8200b981420191L8;ZDBBL8;FF2a15003308111d12e8430639e8031091eabf0639200740ade00600adf8220094e00640ada00302d1808702adef3d0194e8430691a08303d1c1e2009102830091L8;FF", + "a90dc0dae82702a9c80dc0dae90dc0dae82703a9e80313aa1e240094f44f4ca9f94b40f9f6574ba9f85f4aa9fd7b48a9ff430391c0035fd6ff8301d1fd7b03a9L16;FFc80202a9dffe03a9000400ada2037fadc81a00f9d54e0929c20200add45200b9f44f4da9f6574ca9f85f4ba9fa674aa9fc6f49a9fd", + "7b48a9ff830391c0035fd6BBBBBBBL8;FB2e73746f726167652e7273001f696e76616c6964207365616c65642073656e646572206d6573736167653a20c000136661696c656420746f2064656372797074L8;FFc71a009460864cad68620791765e5ca9626ec03d61ea40f9000700ad0001c03d68f640f9e", + "00317aaa8031ff8e8830691020301ade5170094e8d340f91f0900f1BL8;FF8c0102518d00f83761710c8bcb008052280000149f114071630800544d19c039ae1d00128c390e0b8c1140518d00f83761710c8beb0080521e0000149f014871L8;FFf9ef41a9e00fc03df71740f9e003803d3aff48d3f6fcff", + "b5eaffff1740fdff9000202e91491e0094ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9BBL8;FF4219803d485100f9e81b40b9400500ad620141ad48551d29e82740b9405d08a9420101ad2001c03d48c103394025803dab000054e01b40f9e10313aa22008052L8;FFdf0208eb8807005468", + "0640f9e10317aae20316aa0001188b9e6200940803168b680a00f9540300b4610a40f9680240f9b51240f91f0101ebc0070054680640f9BL8;FF9f7e01a9977e02a9981a00f99f3200f9e10314aae20313aa4d010094c00300b5e1031faad6ffff17c1010054e1031faac2ffff17880080d2e10700f90800", + "f0f2L8;ZDBBBL8;FB110000000000000014010000050000006964656e746974792d6b65792d7061697200000000000000650d4000000000001100000000000000fe00000005000000L8;FFf7031faaf50314aab60e4ff8df0600b120170054e00315aaa2ebff97080040b20811c0da081540d2080d088b08", + "25019109fd46d30800098b080500911f0109ebBL8;FF8806403969064039f503002a1f01096be0179f1ab0170194880a4039690a4039b602000a1f01096be0179f1aaa170194880e4039690e4039f503002a1f01096bL8;ZFBBL8;FFe92300910a0000904af13e91e8a700a942ffff9042542591ea0f00f9", + "e3430091323e0194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000b0L8;FF0900f0f2a0c300d1a8931d38a9031df8ff48ff97e10300aa74000014c80080d2e0430039e02300910800f0f2ff470039e80700f9f648ff97e80300aa41fdffb0L16;FFf0031caae2031baae8f341f909008", + "092f7f300f9facf00f9e0c7c33de1f7c03de82b01f968018052f57b40f9e8270ea9ed0740f9ee3f40f9e56f40f9e0f3803dBBBBL8;FB18010000100000005369676e616c205051205261746368657420563120436861696e202053746172744f7574206f6620626f756e647320616363657373000000L8;F", + "Fc80a0034080140b20811c0da081540d2080d088b0825019108fd46d315050091681a40f9080a00b4080140b20811c0da081540d2080d088b0825019108fd46d3BL8;FF9f0e00b12102005468008052f46f41f9f36b41f9e8230b3949008092880240f9490300f9680000b4e00313aa00013fd6810640f96", + "11601b4820a40f9e00313aaL8;FFe9ef51f9e8ab0bf94081803c4181813ce9bf0bf985ebff9708008092880200f9e89340f9a80000b4e08b40f9e19340f92200805290120094e8a340f9a80000b4BBL8;FF080118cbdf0208ebc8070054e80b40f9e10317aae20316aa0001188b9d5201940803168be80f0", + "0f9540300b4e10f40f9e80740f9b51240f91f0101eb80080054L8;FFe00301aae10302aadb4c0014ff8300d1fd7b01a9fd430091a01300d181008052bfc31fb8d44c0094a0c35fb8fd7b41a9ff830091c0035fd6ff4303d1fd7b07a9L16;FFe9979f1a29219f5ae04300f9009d40f9291d0072e03700f900", + "a140f9e01f00f900a540f9e01b00f900a940f9e07b00f900ad40f9e06300f900b140f9e0d300f9BBBL8;FFe20315aa23008052240080520afeff97770a40f954feff17e00313aa22008052230080522400805203feff97610a40f95bfeff17e00313aae10317aae20315aaL8;FFe043169122008052b9110", + "094e1d342f98dfbff17e043169122008052b4110094e1d342f9a3fbff17e043169122008052af110094e1d342f9bbfbff17e0431691BL8;FFff030191c0035fd6c0feffd000002d914dee0094c0feffd000602d914aee0094c0feffd000c02d9147ee0094c0feffd000202e9144ee0094c0feffd000802e9", + "1L8;FF05008052c3020e913ffc0371800a00542104001161400e39bf7e0071e1c79f1a3f00356ae10a0054ff000071421046fa430b00547b7f349b9f1e0071830400d1BBL8;FF40010054810000b4e08f49f92200805299320194e19749f9810000b4e09b49f92200805294320194f47749f99f0600b180a", + "aff54f57f49f9f37b49f9350600b4L8;FF220080529c320094e0234ea9e16b40f9080d40f900013fd6e0e302f9e8074091f4074091e1e702f90801189194021891290c40f9e163179120013fd6f6034bf9L16;FFa4b2009488820e91e003009122230094e0430691e1030091023280529db20094e1430691", + "e00314aa0274805299b20094ffc31491f44f42a9fc0b40f9fd7bc3a8BBBBBL8;FB6620616e792073697a6500000000000085094000000000004d000000000000001800000026000000560b4000000000007500000000000000020000001c000000L8;FFa18338ade8050054ea0f40f9a902088b08011b32b", + "7c303d1b3c303d1400540ad200500ada8f31438fc03082a82011ccb350302ebe3070054e10740f9f40319aaBL8;FFb4031df8b40100b58200001436008052571740f917fcffb538008052482740f91f0500b121fdff5419008092542340f9b4031df8f40e00b4080d80525a1f40f9L8;FF4083cb3c4183cc", + "3c4283cd3cea6341f960838a3c4083ce3c61838b3c4183c73c60838d3c4083c83c6183863c4183c93c6083873c4083ca3c6183883c4183c33cBBL8;FF1a2342b8e90b00f9a9035e38a88314f8a80301d1a903153849f3ff97a8035c381f05007141010054a8a77ca9682601a9810000141f090071e10b005", + "4bc035df8L8;FFa80000b4a00640f901e97bd302018052995a0094e00315aa0109805202018052955a0094e0c31d91e1c3229102288052985a0094e0c32791e1c31d9102288052L16;FFc82600b5200840921f1800f1c2260054217c0353e12600343f0c00712c0500543f040071e00600543f0800712009", + "00543f0c0071210800541f0800f101420054BBBL8;FF03810094f44f44a9fd7b43a9ff430191c0035fd6530040f9680640f9a80100b4690240f9200180398001f8b729050091080500d1692200a9200000b9e0031faaL8;FFe197c13d4083863ce09bc13d4283833ce293c13dfa3349f9e0ef843de08fc13", + "d5f0700b1e1eb843de18bc13de0e3843de087c13de2e7843de283c13de0db843dBL8;FF210b0054f40308aa680240f9699240b86ae240b8a05300d1e1230091e80700f9683241b8e92b0229690e40f9e81b00b9682240b9e9c301f8e82700b97cffff97L8;FF29018e9aed030d2a0e0090526b650daa1f02", + "0f6a2d017db210009052ad11899a89010f6a1004a0726b010aaa0c380e530a128e9a0ed074d31f004ef24f010baaBBL8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab8300005441000014e80308abe2070054096040b93f05007141010054096440b9290140b2L8;FFfff701f9", + "eaff01f9e80b02f9e90f02f952360094e1eb43f9810000b4e0ef43f922008052943a0094e0430f91e1032a91022b8052973a0094e04b40f9e1430f91L16;FF0300001428008052e84700f9fb6b40f9b80000b4e0031aaae10318aa2200805295ba0094b50000b4e06740f9e10315aa2200805290ba00949f", + "0600b1000b0054BBBBL8;FB54000000000000007f000000050000001d1c40000000000054000000000000008d0000001400000073686f756c642062652061626c6520746f2073656e642063L8;FF4900805268220039690200f99c000014480080527f220039680200f998000014f40300aab50c00b4968a", + "0094e00315aa410080528f8a0094e02300f9201600b4BL8;FFe85f06f9e8feffb008810c91e8fb02f9c0feffd000402b91e80303f9e8feffb008411991e1833291e3c3179142008052f35306f9f45b06f9e9ff02f9e90703f9L8;FFf80f40f9e80740f9080118cbdf0208ebe80c0054e80b40f9e10317aae", + "20316aa0001188b9b0a00940803168be80f00f9540300b4e10f40f9e80740f9b51e40f9BBL8;FFf70300aaa34a0194381740f9980300b4341340f99b4a0194e00318aa21008052944a0194402000b4e10314aae20318aafa0300aa974a01943b2340f9f54700f9L8;FF29010a8b290500913f010aeba9010", + "054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff5480fdffd0008007914246009480fdffb000603e913f460094L16;FF68feffd008e12091e1430f9162008052e8b303f9e80303aae3031d91e9a703f9e9af03f9fecb00f9eb1b03a9e8e700f9fab300f9fbab00f9fb0314aaf4030faaBBBL8;F", + "F29611591ea830291a04700d1e8270ba9e8530291c90200d029b11491a10302d1e8270ca9e8f30191e8270da968008052a9ffff9029b10b91682703a988fffff0L8;FF01f97fd3420080529b6a0094687240f9a80000b4607640f901f97fd342008052956a0094687e40f9a80000b4608240f901f97fd342", + "0080528f6a0094688a40f9BL8;FF0800f0f2080900d1b4ffff17e80b41b2e00700f9b1ffff17c80080d20800f0f2080500d1adffff17c80080d20800f0f208090091a9ffff17e00300f9a1feffd0L8;FFe90300aa1f3d00383f4d0038e80300aae90300aa1f5d00383f6d0038e80300aae90300aa1f7d003", + "83f8d0038e80300aae90300aa1f9d00383fad0038e80300aaBBL8;FF280180d2e00700f90800f0f2081500d1deffff17e90b41b2e92300a9dcffff17280180d20800f0f2081100d1d7ffff173f00156b81f7ff54680240f9e0031faaL8;FFe8cf00f9e0070dad2801005420030191e10315aae20314aa9e2", + "a009488021a32e8ff0739081d40922d000014a00640ad2800805220030291e103069122008052L16;FFdf060071e1010054bf0208eb000300543600805218000014df16007141020054bf0208eb40020054b600805212000014bf0208eb20010054f6031f2a22000014BBBBBBL8;FB632f646f75626c655f", + "726174636865742e7273002f72757374632f34386132323963656165666434393835633530393930623134313136623664383536616630L8;FFe00308aae10315aa3c9a00944000805241008052309a009440008052e10315aa2d9a009422feffb042002491e00317aa329a009422feffb0426024912f9a0", + "094BL8;FF22008052a9020094610a40f9c3ffff17e00313aae10316aae20314aaa3020094760a40f9680240f9080116cb9f0208ebe9f8ff54e00313aae10316aae20314aaL8;FFb6035af8df0a00b1a1020054b60b7ba9a1835af8420700b4e10700f9a08301d1e10316aa05110094b7035af8ff0600b120", + "090054a88301d1a9eb7aa9bbf37ba9BBL8;FF3f0400f18b000054e09f40f922008052995e0194e0230091f49b00f94f190094f40300aaa000f8b6f5031faae00315aae10314aa285a0194140100b4915e0194L8;FF19000014e82b00f9facb40f99af1ffb51c018052e81b41f91f0500b1e1f5ff54170080", + "92e83341f9f92700f91f0500b1e1f7ff5416008092f9d740f9e98b42b9L16;FFe00313aae10308aa2200805223008052240080527602009469aa40a9d7ffff17fd7bbda9f50b00f9f44f02a9fd030091f30301aa210840f9f40300aa680240f9BBBL8;ZBL8;FF08810991e00301aaf5074091ff0300f95a8", + "30991b582099174a3ff97f73349f94083c03ce83f49f9ff0a00b1e067803de8d300f901010054e067c03de8d340f9BL8;FFc4fefff084e00791a20700d16105805239fa0094ffc300d1fd7b01a9f44f02a9fd430091a002003713400091f40300aa01400091000080925efa00941f0400f1L8;ZFBBL8;FFe", + "84700b9eb2700f9e9234629e03740f9e11f40f93f0100721b119f1aa82303d1fd020094a88353f80083c03c0183c13c1f0900b1e08704adc1080054e03340f9L8;FF1f0900f1c902005468c21191290000b029211f91e84305f968fdfff008a11691e94705f96903805240fdff9000a41291e8eb01f9e103", + "2a91e8f301f968fdfff0L16;FFe192833c6183c33ce9cb41f9e2031fad6083c23ce8cf01f93f8120f1e0071dade1040054e8e341f91f010ff181040054e8d741f91f0112f121040054f7e741f9BBBBL8;FB65044fb8612e25ec7d294fe76f6a0a95624a3943df5d95600f26e72afff0c709ed964a2c7a47a", + "1b3d7a7539ac0e0f1fbd1a00da647de446fa28cbcdc9c090000L8;FFeaa74ba9ff2314a9ff2317a9e82716a9ea7f18a9e85719a9ff231aa9f67f1ba9ff231da9ff0301f9e80701f9f70b01f9ff0f01f9e81301f9f81701f9ff1b01f9BL8;FF080500d1be000014e05706f9e80b41b2c9000014c80080d208", + "00f0f2080500d1c5000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f9f4140094L8;FFa00e0094e00313aa2100805236008052980e0094c0feffb40801805208000039f40000b4f60300aa00040091e10315aae20314aa970e0094e00316aae10313aaBBL8;FF08008092e18317a9e06304", + "91e1c700f9e10314aae9231aa989008052e80b01f9e82301f9e80313aaf7db11a9f7e712a9f8e713a96083873ce93301f9ff3701f9L8;FF0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb281000548a000014f30300aacd030094e80300aae00313aa090140b22911c0daL", + "16;FFa1bf0054e0031d91e10308aa026e8052a0ce0094e0430f91e1031d91032b0091e20319aaf5430f912e1c0094fbeb41f97f0b00f1e1220154e8ef41f9eaff41f9BBBL8;FF03f8ff54d8ffff17e0230091e1031faa230080522400805207faff97800640ada08300d1a0073fad536a01941f04003121f", + "6ff54e083c03ce80f40f96002803dL8;FFe81f40f9c80000b4090d8052e00314aa02018052017d099b976e0094e17740f9210100b4e07b40f922008052926e009405000014e00640ade20ac03d620a803dBL8;FF8dffff17c80080d20800f0f2080500d189ffff17c80080d20800f0f20809009185ffff17", + "c80080d2e0a30039e08300910800f0f2ffa70039e81300f9f4f4ff97L8;FFa3b05f3843f8ff35a30013cb7f0002ebe3f7ff54b70002cbe202403982f7ff35986a683858f7ff3562fd9fd22200a0f27f0002eb6890829abf0208ebc80a0054BBL8;FF004103917f0f0094f87f49f9580300b4e1d342f9e8cb", + "42f9f97b49f91f0101eb40370054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9L8;FF2083c33c0141803ce0675139094101f868fd60d3e9174bf9aa031bb8ea1b4bf9c042833cabc31cb8e82309b9c94202f8cac202f872dffe972800c0d229008052L16;FF7bd2ff97e11b40f9a", + "0ffff1740feffb00080269123fefff063001a9144feffb084e02691a22700d1c102805232aa0094200080520110805227aa009420008052BBBBBL8;FB440100001c00000042024000000000006a00000000000000090100002e00000042024000000000006a00000000000000b00000002e0000000000000", + "000000000L8;FFe08303ade08304ad82000054e0c30191a09600945d000014c00640ad48fc46d3e9c3029157e07a925414409220010191e20308aaffbf0339e08707adf50301aaBL8;FF1f0109eba808005450000014f3031faa080c47f81f0500b1c1dcff54e8031faa080113abe307005400ffff9000e0", + "359142120194f3031faa088c48f81f0500b1L8;FF9c160094209e00b4e10b409102c48052fa0300aa21c00e919e16009499160094008c81522100805292160094f9d340f9209d00b4e1074091028c8152fb0300aaBBL8;FFe20313aafa0300aaa2560194f90b00f9db0200b49b560194e0031baa21008052", + "94560194003d00b4e12f40f9e2031baaf90300aa97560194e9031baa0c000014L8;FFe49708a9e69f09a9ffd30879ff4b02f9e3930ca9e59b0da9e9fb00b9ea0b10a900013fd6e03b02f9e8031691f4031691e13f02f9290c40f9e103129120013fd6L16;FFe81b40f91f0500b120320054e9030091e8431", + "e9120c10091102e0094e8cb43f96083c03cf6432d91e9d743f91f0500b1e0df803de9c301f960320054e0efc13dBBBL8;FF5fffff17e0230091e8ab00a912750094a0c300d1a82b3da90f750094e00313aa19850094e80300aae00301aae303162a88b70736c3fdff17fd7bbaa9fc6f01a9L8;FF2a040091", + "e00318aa09692138e1431691ead302f9610f0094fad342f9e8cb42f908011acb1f0308eb288c0054e8cf42f9e10319aae20318aa00011a8b95760094BL8;FF610640f9810000b4600a40f92200805299f60094611240f9810000b4601640f92200805294f6009460020191f30b40f9fd7bc2a88cfdff1761", + "0640f9810000b4L8;FFfd7bbea91f0440b1fd030091f30b00f9f30300aa88000054f30b40f9fd7bc2a8c0035fd6acffff97e10300aaf303134b00008092330000b9f8ffff17fd7bbda9BBL8;FFf4cb00f9a00b0054e8c30091e0431691008542ad0201c73ce277813de06f813de173813d018141ade80740", + "9108810991e06b813de167813d088e0094e83349f9L8;FF080680522223c03de9e341f9a826089b24fcff17f9030891e83f41f9f7032a912083c63cf8830d91a80319f8a8000090e05a803d081140f9fb5f40f91f0d00f1L16;FFe29b803de2ffc13de10bc23de09315ad3b8108aae9635e39e417c23de38", + "b14ade213c23de30fc23de9af00b9e95f44f9e84b44f9ead743f9e01bc23de18f16adBBBBL8;FB6d6573736167655f656e63727970746d6573736167655f646563727970745f7369676e616c6661696c656420746f206465636f64652070726576696f75732073L8;FF16140038078700943f1f00f1a8010", + "054800640ad80020191e103009122008052e00700ad800a41ade00b01ad2d82009400e4006f9f1a00f9808200ad8002803dBL8;FFf6e3229155050036e0234ea9e16340f9e22340f9081540f900013fd6e03b02f9e8031691e13f02f9290c40f9e103129120013fd6fbc342f97f0f00b1410a0054L8;FF80", + "01005421035ef8810000b420835ef8220080529806009421835ff8e1feffb4200340f92200805293060094f3ffff17e80240f9c80000b40805088be00315aaBBL8;FF4a000014e86740f91f0500b161000054ffe70ca9ff6f00f9c1620091a20301d1ddcaff9760f5ffb428000014e81341b948000037f98", + "b00f9c1920191a20301d1L8;FFe1031091e3430691e8271aa988fdffb008810d9142008052e8db00f966fcff970a0380d288fdffb008690e91690480520a00f0f2e8a716a95a1100d1e10740f9L16;FFfe0303aae31340f9e45f40f9ee030faaef3b40f9e0f3803dea0307aae70312aa93050014e9b343f9", + "ea4700f91f0500b1eab743f9e04bc23deb6b00f9e9e700f9BBBL8;FF00610094e8e340391f0500712102005488fffff008010e91090480522e00001439008052752e40f9682640f9bf0208eb21fbff5460220191dd040094d6ffff17L8;FFed0314aa2aa040a9536928380cfc71d308050091290040f9280", + "800f90cfeffb43f0108ebb3611932000200542b0440f90afc78d37369283808050091280800f9BL8;FF080900d16bffff17e90b41b2e92300a970ffff17c80080d20800f0f2080500d164ffff17c80080d2e10700f90800f0f2080900d107000014e80b41b2e00700f9L8;ZDBBL8;FF613640f9610000b42", + "20080529a260194611e40f9e10100b408068052606a68f822008052f44f41a9fd7bc2a892260114610a40f9e10000b408018052606a68f8L8;FFf30b00f9fd030091010040f9f30300aa810000b4600640f92200805296260094610e40f9810000b4601240f92200805291260094611a40f9c10000b4601e", + "40f9L16;FF08010acb1f0103ebea33839a08010acb6a0008cb37010aeb69000054e90303aa03000014f7031faa0901098b0a0e8052fb6740a900710a9b210108cb0cb2ff97BBBBBBBBL8;FB292c206e756d626572206f662070726576696f7573207374617465733a20c000237370717220696e697469617", + "4696e6720737461746520776974682076657273L8;FFff4701f9e84301f9ff4b01f9e84f01f9ff5f01f9e85b01f9ff6301f9e86701f9ff7701f9e87301f9ff7b01f9e87f01f9ff8f01f9e88b01f9ff9301f9e89701f9BL8;FF0900f0f2e8470039e90700f9e0230091ff290094f44f4da9f6574ca9f85f4b", + "a9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aaL8;FF31000014a2e300d1830c80520bfbff9720f9ffb445000014e16300b9c6ffff17c80080d2a1831df80800f0f2080900d107000014e80b41b2a0831df804000014BBL8;FFf60313aaf30300aa9e630194e0031baa21", + "0080523a0080529663019400fdffb4e10317aae2031baaf50300aa99630194e00313aaf30316aaf6031caafc0318aaL8;FFbdffff17e00313aae10318aae20316aab7020094780a40f9680240f9080118cbdf0208eb29f8ff54e00313aae10318aae20316aaae020094780a40f9bbffff17BL8;FF9f6600a", + "99f7e01a99f020238e003082ae10314aae20313aa90f3ff97a00f00b540fcffb4d7ffff17898242f83f0900b161000054971600f99f2e00f91f0900f1L8;ZDBBBL8;FB00000000000000001000000000000000080000000000000058e8450000000000000000000000000000000000000000000100000000", + "00000098e8450000000000L8;FF888240f91f0500b18000005480020491e163009103a5ff97889e40f91f0500b160e3ff5481e20491e26300916000805298a4ff9716ffff17e11740f9e80f40f9BL8;FFe8030191ea7f0039a0073fad28ff0094e00742ade0030191e00701adf2180194c1feffd021800f9", + "1e0830091ea0000941f1c0072a00000546800805268220039L8;ZFBBL8;FF09004039202040a9030d40f9a900003641ffffb021e038910201805260001fd641ffffd021603091e200805260001fd6ff0301d1fd7b03a9fdc30091090040f9L8;FF6100005480c20091e9e1fe97881e40f9e083c33ce0031f", + "aa2823189b000d803de083c43c0011803de083c53c0015803de93740f9093100f929070091e083c03cL16;FFe98700f90a254aa9eaaf15a9e9c700f90a254ba9ea8b00f9e9b700f90a254ca9e9eb00f9092d4da9eacb00f90aa107914101c03deba700f90b7140f9e99b00f9BBBBL8;FBd30940000000000", + "055000000000000006b01000021000000d30940000000000055000000000000008a01000021000000d3094000000000005500000000000000L8;FF080c47f81f0500b160180054a5fcff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb28170054e400001408", + "0c43f8BL8;FF6b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab020400542a0140b24a11c0daL8;FFe1031caa2200805223008052ff030094e86b42f9e96f42f91f0500f1e9af00f9e03c0054e87342f9e89f00f99c0000b", + "4e10353a9e2031caa96130094790a00b4BBL8;FF92590094a0035df8bfffff17a0c300d1a82b3da910520094ffc301d1fd7b02a9fa6703a9f85f04a9f65705a9f44f06a9fd830091f303002ae00301aaf70301aaL8;FF4003803de8f304f9fefdff17c80000f0081140f91f0500f149040054e12340f9a04", + "303d102048052b44303d1cef2ff97080000d008112791e92740f9b42338a9L16;FFe203012ae103002a7a390094e203012ae103002a77390094e203012ae103002a74390094e003012af44f42a9fd7b41a9ffc30091c0035fd6fd7bbaa9fc6f01a9BBBL8;FF801641b91f0101ebc03b0054680640f909018", + "0522a0400916a0a00f909692138e10313aa81f9ff97570300b4610a40f9680240f9988240f91f0101eb00310054L8;FFe1d342f9e8cb42f91f0101eb20390054e8cf42f9090180522a04009109692138e1431691ead302f95c0c0094e89b49f91f0500b1c0000054e8074091e1431691BL8;FF6808005434", + "0117ab020f0054f42300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889a152300a9f7fbffb5f62b40f9f51f40f9L8;FF800c80d2352000f9a20200f9222040f9431000b9332040f9f55b42a973620091f76343a9deffff17fd7bbaa9fd030091f76303a9177c4093f55b0", + "2a936000090BBL8;FF600600ad620a803de80000b4ea1740f9e90740f9682200f96a2603a9f31340f90800001408008092681a00f9f30742a9810000b4e00740f9220080528e330194L8;FFe00700a9a0e300d1e1030091e20f01a9a26301d1e82706a968fdff9008210c91e41702a9e61f03a9e00702adf", + "f030b39a8a33aa9bf831bf899f1ff97a8835cf8L16;FFa103953ce38301ade20b803da08779ada203d53c760200f96282823c6082803c6182813ce00743ad751e00f9600604ade20344ad620205ade10341ad610202adBBBBBL8;FB63616e20616c7761797320617070656e6420746f20612062756666657", + "2000000870840000000000047000000000000009b0000001b000000696e76616c696420L8;FFa8c303d16082cf3c6582ce3c0181c73c0281c83ce9fb8392fa6f00a9e00705ad0081c23c0181c33ce233803de00703ad0081c43c0181c13ce433c03de01704adBL8;FF03fdff54e90f80121f002071091400", + "33c20000540a7c0653090500394a051a320a010039e0ffff17ea0f80120b7c10530a2c0633eb0000350b7c0c530a050039L8;FF6083823cec2f0054894800b548008052f7c34bf9f8c74bf9e9830a91e8830a3928008052e0230891e143139142008052e96b02f9e86f02f9f77302f9f87702f9BBL8;FF00", + "0440f922008052b30100b4e30313aa9a5b0194000200b4e10313aaf30b40f9fd7bc2a8c0035fd6000440f9e10313aaf30b40f9fd7bc2a8c0035fd68e5b0194L8;FF0800f0f2e85306f90162ff9770000014e05306f9e083329161fdfff021203f9102028052a3fdffb063542c9184018052e3000014e0530", + "6f9e083329161fdfff0L16;FFff430291c0035fd641a040a9e00313aa44944329e20308aafd7b47a9f34340f9ff43029199320014fd7bbda9fc5701a9f44f02a9fd030091ff830fd13f040071BBBL8;FFe80741b221000014f50302aa1f2900f1880000542900088b29f1df388918f837e0230091e20308a", + "a122d0094e80b40b908010036e00b40f9f44f4da9f6574ca9L8;FFf73340f9e157c13de0f3863de05bc13dea670291e8d700f928e341f8ff0600b120a1813ce04fc13de8cf0ef92800805221a1803c40f18f3cf6bb0ef938210039BL8;FF49c100117f2500710920003909819f1a9f7d02710a819f1a8d0d", + "00122e18403929010b0b4a114c0bbf25007129c100110b819f1adf7d02710924003949c10011L8;FF770a40f9b9ffff17e00313aae10316aae20315aa4dfeff97760a40f9d2ffff17750a40f9680240f994fe41d3080115cb9f0208eba8020054b40000b4680640f9BBL8;FF6800c8376800d03764370114", + "5537011456370114ff8301d1fd7b04a9f32b00f9fd030191f30308aae82300919f380094e82340391f050071a1010054e9434039L8;FFfa2b00f9b70400b4080d805278a640f9f57e089b9b3b0094e00315aa01018052943b009400e100b4080d8052f90300aaf5031faaf67e089bfc0317aae10318aaL16", + ";FFe8b743f9eb031c912093ce3c69d14b78e133c23de6030991e86b00f9e8ff5e39e237c23de0d7803de023c23deaef43f92841082a69914bb8e10b19ade127c23dBBBBL8;FBa68e00000000000000002d1a9e71c85c02bc000000000000000000000000000000000000000000000000b04f05e1a671db1a", + "0000f740442553c9963421aee9ebL8;FF88825ff888ffffb4800240f901f97fd342008052988b0094f7ffff17f42341a9c80000b40805088be00318aa0201805201f17dd3908b00947f0600b100130054BL8;FF220080529c0b01949e0b01942002805221008052970b0194804000b4880c8052e9feffb02", + "9a10d9108400039c80080d22001c03d0800f0f2e9f35639e06302f9L8;FFf44f02a9fd030091f40302aaf303012af50300aa9b0b00940003805201018052940b0094400100b4155000a901fdfff021400791131000b91f500039f44f42a9BBL8;FFe10315aa220080529b4b0194887240f90a0540f9ea100", + "0b4150140f9a80240391f2100f1a1100054090180d25f8518f10900f0f241110054886e40f91f8131f1L8;FF080d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab230100541e000014f4031faae00313aa080c45f81f0500b1c1fdff54f40314abL16;FFe98b44f9e84b00f9e8", + "9b44f9e9a30fa9a0cb0094fe0318aae69f43a9e0bf46a9ed0316aaea6341a9f0031baaebb344a9e30317aaf70315aafb031aaafa031caaBBBL8;FF49f7ff54e0230091e10317aae20315aa230080522400805207f7ff97f70f40f9b2ffff17e0230091e10319aae20313aa2300805224008052fff6ff97f9", + "0f40f9L8;FF606a68f822008052f44f41a9fd7bc2a8996b0014611640f9810000b4601240f922008052946b0094610640f9810000b4600a40f9220080528f6b0094603240f9BL8;FFe80741b28082863c8182873ca0877cad8082883c8182893ca08779ad8082823c8182833ca0877aad8082843c8182853", + "ca08778ad8082803c880200f98182813cL8;FF0e686e38bf81037160020054ce1d0013bfb5037101030054df850131ed0600544d0000142e050091df0101eb820800540e686e38bfc1037160010054ce1d0013BBL8;FF0805139129048052682601a9880280d2090080920800f0f2692200a90d000014e08", + "745ad08008092e237c03d680200f96082803c6182813c6282823cb90000b4L8;FFe10308aa63270014000040f9d329ff17000040f907e8fe17000040f92fdffe17082440a9e20301aae00308aae10309aa59270014fd7bbda9f65701a9f44f02a9L16;FF42402c91e10300aa3ca7009420feffd000202791", + "49a70094830400b4ff4302d1fd7b06a9f65707a9f44f08a9fd8301914800403909150071a8c31e3802040054BBBBBBL8;FB2f76312f6368756e6b65642f73656e645f656b2e727300214572726f72207768696c652072656164696e672066726f6d2066696c6520617420c00018696e7661L8;FF40008052", + "410080529a9f0094e00f00f9e01f00b49b9f00944000805241008052949f0094e00b00f9201f00b4959f009440008052410080528e9f0094e00700f9BL8;FFa4008052a8031df890250094a1035df8e80740f9f30301aac80000b4e00b40f9e10308aa22008052931f0194e10313aae81340f9c80000b4e0", + "1740f9e10308aaL8;FF220080529c1f0094e11f40f9810000b4e00316aa22008052971f0094a80180d25f0700b10800f0f2a8831cf8c0000054e017c03da0e300d1e003803d7bf8ff97BBL8;FFe00313aae10314aa022b8052f44f43a9f65742a9f85f41a9fd7bc4a89d5f011482ffffb042a01e91e00316", + "aae10315aa475b0194fd7bbaa9fc6f01a9fa6702a9L8;FFe00313aa9c5f00949f0a00b121010054e01bc13de11fc13db47e0853e88344b9e063813de167813de8a305b913080014f37740f99f0600b140090054e01bc13dL16;FF7b030094610a40f9e6ffff17fd7bbca9f85f01a9f65702a9f44f03a9fd0", + "30091f30301aa210840f9f50300aa680240f91f0101eb800b0054680640f9b60a40f9BBBL8;ZBL8;FFe20315aa230080522400805278a3ff97f71740f9befbff17f60300aae063009122008052230080522400805270a3ff97e11740f9e00316aad6fdff17e0630091BL8;FFc8fefff008c10291755a01a9", + "685200a9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6f80300aa014000912000805260fb00944002f8b7c8fefff0L8;FF8a2c7fa96c3404a9ae3c3ca9a61c3da9a8243ea9aa2c3fa9c0035fd600000000200c014e0400028b5f8001f1a80300545f4000f102020054013c084ea2001836BBL", + "8;FFa00301d162028052e401805209000014a0031cf841ffffb021ec039143ffffb063380491a00301d162028052e400805286450094b8035cf8b7a376a9bce773a9L8;FFf5031faae86300f918fd60d3c80080d20800f0f20a3900911d030014607e42f9618242f9290c40f9e8430f91e1031baa20013fd", + "6fceb41f99f0b00b1a1110054L16;FFe8ef42f9e0c343f9facb43f9f5db43f9e95b00f91f0500b1e9d743f9e97300f9e07b0054695340f96027c03de87b00f9e8835739e16700f9e1c30391e99300f9BBBBL8;FBc40d1af1e6e32b5021934ee3f2840f0cf92f73b041c24580f2af1be7031f2e0dd78ca69e", + "efe171529f46342f216e259727c600a60016264f49b59ea9a28c7424L8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb29030054280108ab8300005410000014e80308abc2010054090840f9BL8;FFa22302d11f7d01a908018052bf5b38a9b67f3aa9bf233", + "ba9bf6b3ca945eeff97e03100b5a0077eada8035ef8f3cf45f9e88306f9e8c745f9e03b833da00b7cadL8;FFfd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091687cc19bff0308ebc1020054747c019b0800f0d2f30302aa080102cb9f0208eb08020054b40200b4BBL8;FFf4430291e223c03d1", + "7108052e1031f2a95020191e08707ade00741ade247803de21340adf97b40f9e133803de40305ade00f42adf83f4339e227803d8002188bL8;FFfd030091080040f91f0900b1a1000054e0031faaf30b40f9fd7bc2a8c0035fd6080141d2e90080521f2d00f10831899a89fdffd0295512918a0000102b69", + "6838L16;FFe8b700f9e8ff43f9eaa318a9e80344f9ea0b44f9e8eb00f9e80f44f9e88f00f9e81344f9e82b14a9e81b44f9ea2f44f9e92313a9e85344f9e94f44f9e8d300f9BBBL8;FFf70300aa01600491e003082ae20303aaf80303aa3af5ff97800300b461000014f70300aae003082af80303aae20303", + "aae303142a19f2ff97e90300aa14000014L8;FFe00301aa28fc073708fc60d3c80100b5080840921f1900f102020054017c0353210200341f1100f160020054e003082ae20313aae303142ab5ffff97c0fdffb4BL8;FFe00314aa3cea0094880640f9e083c03ce1031faa2823189be90f40f92a070091000", + "1803d090900f98a0a00f9b4ffff17e1031faa881e00b9b1ffff171f0100f1L8;FF240200347f000039007d20d4b2f8ff97e10300aac2028052000080d2220000b9fd7bc2a8c0035fd6abf8ff97e10300aa82018052000080d2220000b9f35341a9BBL8;FF13110094f3fbff17e8031faa00011aab6267005", + "4e14316914f0d0094df0600b18000005480220291e1431691da1200943f0700b1f90b40f9c07cff5401230491L8;FF8100805200001891ff0316b9e81300b9d9290094e80356b9e00740918100805200001891ff0316b9e80f00b9d2290094e80356b9e00740918100805200001891L16;FFfdc30391292c", + "47a92018c03d282844a9346c45a9e00b803deb0f00f92b4c43a91f8120f1e91b00f9e82300f9396842a9e11b0054f80301aaf70300aaebab00a9BBBBBL8;FB000000000000000010000000000000000800000000000000443542000000000000000000000000000100000000000000010000000000000028", + "46420000000000L8;FF08fd46d308050091090840f9290b00b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091091440f94801088b090100b42a0140b24a11c0daBL8;FFe00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb0929005", + "4088c48f81f0500b1802000544a030094080040b2L8;FFa04700d102c5ff97e00301b9a04700d1ffc4ff97e0fb00b9a04700d1fcc4ff97e0f300b9a04700d1f9c4ff97e0eb00b9a04700d1f6c4ff97e0e700b9a04700d1BBL8;FFfa670ea9f85f0fa9f65710a9f44f11a9fd030391f30308aa081840f9e10", + "b02a9172100f183190054181440f9f40300aaf50302aaf60301aae0430191e10303aaL8;FFe14b41f9810000b4e04f41f92200805299570094e89f40f91f0500b1600000546063029129edff97f3db52a9960100b47722009104000014d60600f1f7620091L16;FF17693538d5260091750a00f9680240f9", + "bf0208ebe1f8ff54c4ffff17ffc307d1fd7b19a9fc6f1aa9fa671ba9f85f1ca9f6571da9f44f1ea9fd430691e9010090BBBL8;FFdcfeff17811f0054972240f9881a40f9ff0208ebc0020054881e40f9090d8052e083c33ce822099be0031faa000d803de083c43c0011803de083c53c0015803dL8;FFe17", + "749f93f0800b1e0adff543f0400b1a0adff54810000b4e07b49f92200805295770094e18349f9e1acffb4e08749f963fdff17e18b49f93f0800b180010054BL8;FF00200091f44f42a9f65741a9fd7bc3a88802001400200091f44f42a9f65741a9fd7bc3a84d020014012040f93f0800b1400200543f040", + "0b100020054e10000b4L8;FF8b0a00941f0000714b03005481000054200000b02100805201201d3941008052200000b0080c80d200c01e91612a00b9010000d4240000b0e30300aa62e20191BBL8;FFe8bb0ef968008052e1074091e9bf0ef949ffff9029a10491e84b09f928ffffb008213e91e94f09f9a", + "a0a8052a04700d1e85b09f9e807409121800991e93709f9L8;FFe14305f9e0032a9121fdffd021203f910202805263fdffb0632c1991a40280524c000014e80f41b2e0032a91e84305f9f73dff97e10300aa3e000014c80080d2L16;FFf8831d91e99b03f92093803ce88f03f957170094e9b343f93f0900", + "f161040054e16740f9810000b4e07f42f92200805291b70094e17740f9c10100b4e05f40f9BBBBL8;FB6f6e206661696c6564000000000000000000000000000000080000000000000008000000000000000052450000000000a1104000000000004d00000000000000L8;FF1b050079d6ffff179f0700f1", + "61000054e9031faa0c000014e9031faaea031caa4bfd41d36c01098b4a010bcb8df57ed30d696d78bf01186b29818c9a5f0500f1BL8;FF28ffff17e94341f9295541b9e91700b9081140f9fb2740f91f0900f1c9040054e23740b9a08302d1e103182ab58302d11adcff97e8ffff9008610491090200b0L8", + ";FFe90f00f9e98741f908018052eb2702f9e18318ade92b00a9e8e300f99d070094f7031faa1a05805228008052e82f00f9e8661a9bf70600911b0140f97f0700b1BBL8;FF68260039e83b40796a1200f8ea1b40b9ec434039692e01a9eb024039e91240b8681e007968111d126aa200b8ea724078688600", + "39e8524078eb7e40396c820039L8;FF0090199108210091e1c30e91e9db01f91a00f0f2eadf01f94e430094e81f40b9e8c306394d0000142093c13ce9df40f9e8a30539e012803d2093c03ce9f204f8L16;FF34a048a9eba71aa9e8df00f929a049a9e8ab15a92aa04aa9e9a310a929a04ba9e9b700f9eaa", + "318a929a84ca9e9eb00f929a04da9e9a700f92ba44ea9e88f00f9BBBL8;FFfd7b42a9ff030291a267011428008052e80300f9e10740f981f9ffb5ceffff1720008052010480522b630194ff4301d1fd7b03a9f32300f9fdc30091098440a9L8;FF810148516b00f8378b0080523a0000142b7c1c534b0a00", + "344d11c0390b00be522b000b0bac1d00128d00f83761710c8bab008052300000144d15c039ae1d0012BL8;FF430c80522feeff97e10300aa00feffb5a80640f91f0116eb49050054e00313aa7ef4ff9740fd073728fc60d3080500b5200840921f1800f122050054217c0353L8;ZDBBL8;FF88fbff54ea43", + "0f91e8e3009129008052448948adec030b91408541adf81f40b9e95300b94231803d02c1853c438942ad01c1823c00c1813c02c1843c03c1833cL8;FFb50600f1d6c2009180010054c1025ef8810000b4c0825ef82200805296270094c1825ff8e1feffb4c00240f92200805291270094f3ffff17686640f", + "9c80000b4L16;FFf303889a1ab3ff97e0031aaae10313aa17b3ff97d90000b428e379d3e0031aaa02018052011119cb93a70094e80340f91ba300a908008092080300f9950400b4BBBBBBBL8;FB706c6564002f72757374632f3438613232396365616566643439383563353039393062313431313662366", + "43835366166303938352f6c6962726172792f616c6cL8;FFff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc3019148040091f40302aae11700f917f97fd3f30300aa93a10094e00317aa41008052BL8;FF3f0108eb93611932e00200547369283808050091280800f92004f8b7e0", + "030aaa26000014e10300a9e00301aae10308aa22008052f4030caa9c050094e10340a9L8;FF889202b8280080529a9200b8955a01a9892e00b968620039f44f4ba9fb3b40f9f6574aa9f85f49a9fa6748a9fd7b46a9ff030391c0035fd640fdff9000e02e91BBL8;FFfd7b42a9ff030191c0035fd6e00741", + "a9315d0194ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091040180520504805229f87fd3L8;FF600e0054680640f92a040091e00314aa490180526a0a00f90969213858140094e10313aa5dfaff97803e40f9800100b4610a40f9680240f91f0101eb200d0054BL8;FF820", + "280524400805290e7ff97e00340f94cffff17c80080d20800f0f2080900913effff17e00300f9a1feff9021e00c91a3feff9063380d91e003009182028052L8;ZDBBBL8;FB54000000000000005f000000050000001d1c400000000000540000000000000065000000050000001d1c400000000000540000", + "00000000007300000005000000L8;FFf81740f9e80f40f9080118cbdf0208eb48420054e81340f9e10317aae20316aa0001188b9b8100940803168be81700f9965a40f9560300b4e11740f9e80f40f9BL8;FF29f87fd31f0109eb0881899a090180521f2100f11481899ae30314aa24000094e80740f91f0", + "500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191L8;ZFBBL8;FF70470014080040f9e20301aa00a140a9e10308aa603d0114000040f99e3e0014000040f9cd3f0014202440a948ffffd0087d3091a2018052e10308aa230d40f9L8;FFa10c0014606641f9616a41f9290c40f9e8430f91e1", + "031baa20013fd6fceb41f99f0f00b1810e005448008092880200f9c8008052940c0014606641f9616a41f9L16;FFe8db00f9e45f40f9e8c340f9e9c300f9e99740f9f4cf00f9f88f41a9e8b300f9e8d740f9e9ab00f9e06746a9eb2312a9ebf340f9e9a349a9f0b74aa9e9d700f9BBBBL8;FB67ce5d4bcb6", + "e039a74ec24e695ad626d6783b22610fd8b1b3c336a5c5bf0b0d63457fe50060b7f2293c8f8827ee26b3095cf142703b1000073e8ba087ac2f787L8;FF4a25019129194a8b29050091280108abc2010054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108", + "ab62000054BL8;FFa4110194f9d740f9e98b42b9e88f42b9fb2300f9e9230729d90600b4f4d340f998110194e00319aa2100805291110194e0fd00b4e10314aae20319aafb0300aaL8;FFf85f03a9f65704a9f44f05a9fd830091f60302aaf50301aaf30300aaf40302aa030000149f0216eb88090054c00", + "58052e10315aae20314aa712500941f0400f1BBL8;FFc1060091028c8152f40300aa168c8152a051019408c48052b61200f9a85201a928008092a84e00a9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e90f41b2L8;FF090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009", + "129010aabc20600542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d3L16;FFe8979f1a08219f5aeaeb00f9081d0072eb9b00f90a2c4da9eb8f00f90b444ea9eb2b14a9072853a9062c54a9ea3700f90e2857a9eab70aa90a345aa9ed3f00f9BBBL8;FFa3ffffd063c00691e00700f9b70100140", + "1800191e003022ae20303aadef5ff97e03600b4e00700f9a1ffffb021203f91a3ffffd063a80891e023009102028052L8;FF22008052ba100094e1d342f94efeff17e0431691e1031aaae20318aab4100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aaBL8;FF220080", + "522300805224008052f4030aaa77150094e10340a9ea0314aa2ca040a9290040f99369283808050091280800f960f9ffb63f0108ebe00000548a692838L8;FF82010054231543aaea03292a630843aa631043aa4b00030a4200030a3f0102eb62010a0b42308b1a3fc122eb23e9ff5422010034436c1c53e", + "403801204d01f38BBL8;FF4803188be8d302f9e89f49f9f4074091948209911f0500b18000005480620391e143169166130094e8bb49f91f0500b100bdff5481420491f0010014e1d342f9L8;FFe1ff833de003843d000540ade207843de083853d020141ade187853de87f41f9e28b853de08f853d4000c", + "03de04b823d4004c03de04f823d210140ade173823dL16;FFf6574ba9f85f4aa9fd7b49a9ff430391c0035fd645feff90a5202391e123009162e20191e0031f2ae3031faa16ad0094ffc302d1fd7b08a9f65709a9f44f0aa9BBBBBL8;FBfd2e400000000000062f4000000000000000d1009300a7008a00e", + "400eb00bd000a029100f4010000ef015601b30120010b021b02ce0146023b013602bb000000L8;FFa002168ba3990094daffff17ffc30691f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a8c0035fd6e8a3403920feff9000a02f9103feffd063801b9124feff90BL8;FF4e15019400ffffb000e00e914b", + "150194fd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090040f9L8;FFa0110054e0e3c03de9470491e80701f920f18f3cb50000b4e0031caae10315aa2200805294190094e11341f9410d00b4e01741f96600001492190094c0018052BBL8;", + "FF370080529b59019400f8ffb4e1031aaae20315aaf60300aa9e590194e9030091a86300d1209100911c560094b7835ff89701f8b6f9031faae00319aae10317aaL8;FF00010054810000b4e0ff42f92200805299590094e8c31791008100912befff97a80359f8a003d83ce1833291022b8052f30703f9e", + "80303f9e8c3179100810091L16;FFa083d23c010300ad200800b5f4af40f974d2ffb518000014c0ffff545801001480ffff54a80a00917c0000140800809249008092680200f9681a00f9694200f9BBBL8;FFcbfdffb43f0108eb93611932a00300540cfc6ad35369283808050091280800f92c0500b5e00", + "30baa3f0108eb20010054290440f90a050091206928382a0800f9L8;FFe9031faaf88b92b9380100340a0340b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a05009102000014ea031faaf67b52b9df06007181010054eb7f52b9BL8;FFfd7b42a9ff030191c0035fd6fd7bbea9f30b00f9fd030091", + "f30300aa99f90094000980520101805292f90094800100b4600640ad080180521f2000a91f0800f9L8;FFe001805247030094c0faffb4e8fcfff008010b91f30300aa090140f9087140f8f7018052f8018052090000f9087000f8e00315aa3a030094760000b4e00314aaBBL8;FF690200f96082803c680e", + "00f965040014f4c30091a182009102288052808200919c390194e95b40f9e067c03de8d340f9f71b00f93f0d00b1e083833ce82700f9L8;FFa02302d113f5ff97a0150036a1fcffb4aa010014a1820191a22302d12ff4ff9700fcffb469010014202e00b5a02302d108f5ff97600e003641fbffb47401001", + "4L16;FFe02740f922008052f4030daaf5030eaa99b90094ee0315aaed0314aaad0000b4e0030eaae1030daa2200805292b90094fc031faa7a6201a9080080927c0600f9BBBBL8;FB4a00000000000000b60200000900000042024000000000006a00000000000000550100002a0000004202400000000000", + "6a000000000000005e0100002e000000L8;FFe91b40f9bf0209eb130540f9e0feff540810158bb50600917f4300f1137100a9f52300f941fbff543a020036eaa342a909008092490100f9a80000b4e01f40f9BL8;FF3505019420008052e10316aa3205019400018052e10313aa2f05019420008052e1031", + "7aa2c050194200080522102805229050194fd7bbaa9fc6f01a9fa6702a9L8;FFe10317aa1f08007163080054f9031faa35200091d70600d1f60313aab47a79f8e00314aa980a009439070091d40281a8ff0219eb41ffff54600640a9e8e30691BBL8;FFf44f5ca9f6575ba9f85f5aa9fa6759a9fc6f58a9f", + "d7b57a9ff430791c0035fd620008052e10315aa2b45019420008052e10318aa2845019420008052e1031baaL8;FF0be2fe97e84346391f05007180020054881245b8e99741b9e00315aaeb2b5aa9a80318b8e8c34639e93200b8e9cf40f9e8631139a8f31938e8430691ea2b02f9L16;FF4c018052e4d309", + "a9e2d35da9fbab00f9e45f40f9fb8f45a9f1ab12a9ea030faafab300f9f13f40f9fa5740f9ec7300f9ec2b40f9ed6300f9edf740f9e5d300f9BBBL8;FFe1db46a9b7fe58d333008052e903192a610100b4e02740f922008052f5031baafb031aaafa03092a93690194e803192af9031a2afa031baafb0315", + "aaee2b43a9L8;FFf30b40f9fd7bc2a85efeff1761ce40f9810000b460d240f9220080529669009461da40f9810300b460de40f91800001461ce40f9810000b460d240f922008052BL8;FFe8fd073708fc60d3280c00b5080840921f1900f1620c0054017c0353810c00343f040071200200543f080071810", + "30054890240f93f0500b1a10000549f6600a9L8;ZFBBL8;FFff031691f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6ebab59a93f050071e89741b92083c13cec030b918033803da10900548031c03dL8;FFf6031aaac18e5ff8810000b4400340f92200805298290094a002c03da8", + "0a40f9c002803dc80a00f9140300b4e00313aae10314aa22008052f44f45a9fb0b40f9L16;FFfd830091010840a988008052f30300aae0230091440080524500805229f87fd33f1100f13481889ae30314aa26000094e80740f91f0500f1e0000054e80b40f9BBBBBBL8;FB75626c69634b6579536573736", + "96f6e537472756374757265436861696e73656e6465725f726174636865745f6b657973656e6465725f726174636865745f6b65L8;FF33008052bf031ff835f57ef2a8033ea9800c00549c0640f9fa031faa050000141bc11f7814e11f78b51200d1b50b00b4884740b8097d10531b05c05a3405c05aBL8;", + "FF2a040091e00314aa6a0a00f909692138e10313aa50fbff97760a40f9680240f9080116cb9f0208ebc8060054680640f9e10315aae20314aa0001168b951d0194L8;FF9f0319eb48ffff54e00315aae10318aae2031caa9b1e0094a0feff35991d0094e001805221008052921d0094801000b428fdfff00", + "8813491150380d2090140f9BBL8;FFf8ffff17e80340f9c80000b40805088be00313aa0201805201f17dd3965d0194ff030b91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6L8;FF0163009102288052a25d0094e0c32291e1c32791022880529e5d0094e0c31d91e1c3229102288", + "0529a5d0094f3031faaf9031faa35008052e0c32791e1c31d91L16;FF210840f9f40300aa680240f91f0101eb000b0054680640f92a040091e00314aa490180526a0a00f90969213842560094e10313aa0aebff97803240f9800100b4BBBL8;ZBL8;FF023f805221800991a27d009488e2079178008052b4", + "008052000540ade8f3687915008092e8e30a79e057813de15b813de6010014e8074091f6af45f9e0432591BL8;FF000180520105805232f90094c0fefff00020049149f90094fd7bbda9f65701a9f44f02a9fd030091f30302aae20301aaf40300aaf50308aa14010037e00315aaL8;ZFBBL8;FFe0c30291", + "a102178be20314aaf4bf0339a03d0194e00747ada8c302d1e243c03df58b40f914010191e1031f2aa0073cade10f46adb7f35838e02fc03da2039a3cL8;FF622ec13dc00604ad603ac13dc21e803d2281cc3cc02a803d000540adc0860fad2081cd3c2181ca3cc28219ad2281cb3cc11e813dc222813d09c", + "ffe97e00640adL16;FFe84300f9e8db43f9e82700f928134df8e87b00f9e8435f39e9730ff8e86300b9007b00546013c93c685340f9f9030caae04700f9e0831d91e16f00f9e1030e91BBBBL8;FBa28c2bf9abb41e0d428b000097756460c5accfeb824580d679cbd3e4be0fe17bcce884d4d43b935d81b3", + "568b8ad008e9a8379fd5846b834dd1b69274d4bb3dd7L8;FFf30301aa9f8d0094e00313aa01018052988d0094e83340f9e10313aaf50300aa00018052e80f00f9154400b595020014948d0094000f8052010180528d8d0094BL8;FF0800f0f2ffa73239e85306f900140094e80300aae85306f9e0833291e", + "1feffd021401191a2018052e3feffd063e011912401805285130094e15346f9e15306f9L8;FFf44f46a9f65745a9f85f44a9fd7b43a9ffc30191c0035fd6e0030091e10316aae20315aa230080522400805288e9ff97f60b40f9dfffff17ff0302d1fd7b06a9BBL8;FFe30300f9282545a9ffab05a9ff370", + "0f9c90600b40a0d8052192101911c018052387d0a9b3a0080529b03805212000014371b40b934008052e82f40f9490700d1L8;FF008020914d490094490080524afdff35ea031faa4901098b200108aba2010054f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd680fdffd000602b91L16;FFf7", + "eb03f9e8bb03f9e8db40f9faf703f9e8c303f9e8b340f9ed0304f9e8cb03f9e8c340f9fe0704f9e8cf03f9e8ab40f9e40b04f9e8d303f9e8d740f9ef0f04f9BBBL8;FFa8ffffb008d51991680a00f9080380527f6a0039683200797f7e00397fb201b8ebffff17ec8306a9a8e300d1e13f00f9808640a9ef", + "2f04a9ea2b00f9eea70b29L8;FFf81f00b98043813c00e4006fa80319b889430df8aa0312b8a8c313b8828707adeb1300b9ebe303b9200300add2670094e9bf4639e84346390a088052a00302d1BL8;FF081900913f0108eba121005481220091e20313aaca030094f50300aae90100143f0900b14025005", + "4880080d20800f0f2081100913f0108eba124005481220091L8;FFf30b40f9fd7bc7a8c0035fd6b2f6ff97e10300aa8201805200008092220000b9f8ffff17e08702a9e21f00f9a6ffff97e0c30191e5830191e3008012e00304a9BBL8;FFaa110094e1d342f911fcff17e043169122008052a5110094e1d", + "342f929fcff17e043169122008052a0110094e1d342f954faff17e0431691220080529b110094L8;FFf6eb42f9fb074bf9f90b4bf9fc0f4bf9f8134bf9f5174bf9c80240f9f7e742f9680000b4e00317aa00013fd6c10640f9810000b4c20a40f9e00317aa8e2d0094L16;FFf65742a9fc5f41a9fd7bc4a8", + "c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff8325d1ff0300f9f40301aa283040f9e22300f9BBBBBL8;FBef104000000000004e00000000000000aa02000020000000ef104000000000004e000000000000009d02000015000000ef104000000000004e000000000000", + "00L8;FFa9031838a93358384a01084a6b01084aaa131838aa4358382901084aab231838ab535838a9331838a96358384a01084a6b01084aaa431838aa7358382901084aBL8;FFf40314abe2020054688e4bf81f0500b140020054e00313aa52010094080040b20811c0da081540d2080d088b0825019109f", + "d46d30800098b080500911f0109ebL8;FF03c3ff97e00301b9a04700d100c3ff97e0fb00b9a04700d1fdc2ff97e0f300b9a04700d1fac2ff97e0eb00b9a04700d1f7c2ff97e0e700b9a04700d1f4c2ff97BBL8;FFa0060054e0534da9df0214ebc9060054e10316aa22008052340600b4e30314aa9655019", + "4000600b520008052e10314aa29510194a083dd3ca183de3c09008092L8;FFe8a75139e8060036e14741f9a10600b4e04b41f92200805297550094ffa71139e89740f91f0500b14106005433000014a082c03ca182c13ce8000090a282c23cL16;FFe8f340f91f0d00b100eaff54e0431e91e10316aae203", + "18aae30317aaf9830591fe290094e8635e391ffd0371800f00546083c13c6193c03cea030b91e8e30d39BBBL8;FF0001178ba3750194e802158b680a00f9952240f9350300b4610a40f9680240f9961e40f91f0101ebe00f0054680640f929040091e00315aa690a00f919692138L8;FFd82a0094080040b", + "20811c0da081540d2080d088b0825019108fd46d30900088b390500913f0308ebc9130054f87749f91f0700b1c0130054802202918a290094BL8;FF601240f9220080529bf50094611a40f9810000b4601e40f92200805296f50094b40000b4600640f9e10314aa2200805291f50094e00313aa080c45f81", + "f0500b1L8;FF210000b042c00d9121401b913f1400385f0001ebc1ffff5481020e912200805222400e39bfffff17630a40f9620c40f2600000543f000039007d20d460c05f38BBL8;FFe1df843de17bc13de0d3843de077c13de2d7843de273c13de0cb843de06fc13de1cf843de16bc13de0c3843de067c", + "13de86f09f9e2c7843de1bf843de0bb843dL8;FFe84f45f99f0b00b1c002803de89b04f921090054e89b44f9e9431f91c002c03de94b03f969fdffb029211091e8f303f9080000f008412a91e84f03f928008052L16;FFe10316aa220080529bb50094e90315aadc0000b4e05f40f9e1031caa2200805295", + "b50094e90315aada0000b4e05b40f9e1031aaa220080528fb50094e90315aaBBBBL8;FBfb0000002e00000042024000000000006a000000000000009c0000002e0000004572726f7200000042024000000000006a00000000000000020100002e000000L8;FF090340b22911c0da291540d2290d098b2925", + "019129fd46d329050091972a80b9b7060034ea0240b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a050091BL8;FFc10600b40a1440385f150071e1060054298400d13f8100b122070054490500b44a0200904a1140f95f0900f1c3040054ff8302d1fd7b08a9f44f09a9fd030291L8;FF08018052f", + "30300aae023009129f87fd33f2100f13481889ae30314aa0c000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191BBL8;FF0c000014eae74239e8031faa2919009103000014e8031faa292100914a1d409208010aaa69a200a908008092680200f9610000b4220080528f", + "450194680700d1L8;FF9d450094610e40f9810000b4601240f92200805298450094612640f93f0400f18b000054602a40f9220080529245009474d643a9750300b496c2009104000014L16;FFe9a31da9e9ff45f9e80746f9e8a705a9e80b46f9e87f00f9e87740f909c940f900210091e9af08a90ba559a", + "9eb6b00f9eaa71ea90aad5aa9eae700f90aa55ba9BBBL8;FFf303032af503022af603012ae50700f9e61300b99f610094f70301aaa100f8b6f9031faae00319aae10317aa2a610194b70500b4fa0300aa92650194e00317aaL8;FF3f100071c00200543f14007141040054c1220191e20313aaf1fcff9760", + "0300b4e00000143f040071400200543f08007121030054e1230091e20313aae8fcff97BL8;FF03ecff97e10300aae10300f9a1feffb021a01091a3feffb063300d91e0030091a20180524400805288ebff97e00340f97cffff17c80080d20800f0f2080500d1L8;ZDBBL8;FF608e40f901f97fd342008052", + "9a250194689640f9a80000b4609a40f901f97fd3420080529425019468a240f9a80000b460a640f901f97fd3420080528e250194L8;FF002001915021009440fdffd0008001914a21009440fdffb000803b914a21009440fdffb000e03b914421009440fdffb000403c9141210094ff0301d1fd7b03a9L16", + ";FF0803178b010140ad092140b9292300b9210300adff0215eb08fbff54d73200f9d6ffff1768018052740e00b95dffff170801176b030800540809c05ae0031faa" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines15 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines2.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines2.lean index bf63a578f..0df11c750 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines2.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines2.lean @@ -27,360 +27,252 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub2 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF83020054ee0d4039ce150012ce190b2a4e090e33ea110091e5ffff17df81007100fdff54df15027163040054cf7d0853ff7d00714c0100540f020034ff590071L4;FF24008052db000094e10340a92aa040a9290040f91f1040f15369283808050091280800f903feff540b7c07533f01", - "08eb6b611932000100544b69283808050091L8;FF290108ab420200546a0a40f94a0108ab420200546c0240f9ab1242d3141000f9880108cb092c01a90a2000a9600e00f9f44f42a9f50b40f9fd7bc3a8c0035fd6BBL4;FFfa031baabf060031a024005448008052e0c30191e3830091e1031aaae20319aa", - "24008052e8830039b8020094e89f01940004805221008052e69f0194a02800b4L4;FF83fe073723cc7492050000f0a50042f9630040f97f0005ebc1fdff5423404079652c46d3bfbc007168080054030000d063c0029163d86578487c031b9f00086bL8;FF73021791810100d0216c1491e0230091a32300", - "d182008052e40313aab4831ff83ca0009488e20091810100d0217c1491a32300d182008052e40313aaa8831ff8BBBL4;FFff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb238900541803008bf9feffb50f0000141f0400b1L4;FB206f75742", - "06f6620626f756e64733a20746865206c656e20697320c0122062757420616476616e63696e6720627920c0002f636172676f2d7265676973747279L8;FFe98700f90ba549a9ea2f15a9e9c700f90ba54aa9e9b700f90aa54ba9eacb00f9e9eb00f90aa54ca9ea9b00f90a6d40f9e9a700f9e9979f1aeb2b", - "11a90b294ea9BL8;FF010580520e600194fd7bbda9f65701a9f44f02a9fd030091f50303aaf303022af403012af60300aae95f01940006805201018052e75f0194400100b4165400a9L8;FFe80f41b2abffff17e80f41b2b9ffff17a0031df8210100d021443791230100d063943791a0c300d142018052e", - "40080522c000014a0031df8210100d021443791BBBBL4;FFe0e7076fec031faa010d010ea82a40a90d000a8a02696dfc438c212e6900669e2ec101f280010054c901c0da2911c0daa90d498b2b010a8a09190bcb2f015cb8L4;ZFL8;FF4d1dc039ae1d00128c550e0b8c0148518d00f83761710c8b0b0180", - "52140000148d7d1c53ad0600340d00be528d010d0b4c2180396b710d8b8c00f8b761e10c8bBL8;FFfd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa010300d021e02f91e8030091420280523580019468620091L8;FFe3ffff17e063009122008052230", - "0805224008052a396ff97e11740f9e3ffff17962e40f9560300b4e11740f9e80f40f9972a40f91f0101eb40850054e81340f9BBBL4;FFf6ffff1720008052b4833ea9e0230091a16300d1b5c300d1bf831ff827b3ff97680240f9a083de3ca9835ff8ff0208eba002803da9031ef861000054e00313aaL4;", - "FBd900000016000000d3784900000000003800000000000000f00000000d0000006d697373696e672072656d6f7465206964656e74697479206b65790000000000L8;FFe38b02ad89ffff1735008052e00745ad89620791e233c03d88ea40f98af640f9a0073bad8072c03da203983ce007813d2001c03de", - "81302f9ea1f02f94083813cBL8;FFe023009129f87fd31f0109eb0881899a090180521f2100f11481899ae30314aae9000094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9L8;FFe0031faaf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a9181dff", - "97e0230091f7a700a9151dff97e00313aae1031faae20314aaBBBBBL4;FF63242291e0230091a20080522401805224000014880080d20800f0f2080140b2a0c300d1a8031df8de050194f70300aae10740f9810000b4e00b40f922008052L4;FFe9fb40b909490039e9f340b9094d0039e9ab5c290a51003", - "909550039e9ab5b290a590039095d0039e9ab5a290a61003909650039e9ab59290a690039096d0039L8;FFff430191c0035fd6e003c03d08008012680200b96042803cfd7b43a9f32340f9ff430191c0035fd6ffc301d1fd7b05a9f33300f9fd430191082440a9f30301aaBL8;FF602200a9000400adff07", - "4091ff830a91f44f42a9fc5741a9fd7bc3a8c0035fd67f2200397f0200f9ff074091ff830a91f44f42a9fc5741a9fd7bc3a8c0035fd6L8;FF42840e91e92b01a9e343009111900094fd7b44a9ff430191c0035fd60a20009109400091e8230091200440a9a9031ff8e9ffff9029213791eaa300a9a84300d", - "1BBBL4;FFe85f40f9f63300f9e85300f9760400b4efcf0194e00316aa2100805239008052eccf0194c0f5ffb4e15340f9e20316aae02700f9f2cf0194f92f40f919000014L4;FB00000000bbda11b800000000000000000000000000000000000000000000000000000000df35da5e000036c6254cdb64bb", - "4de8820000000036d9c91700000000L8;FFebe340f9e93f40f9e88340f9e31340f9ec3340f9f74b40f9ec3300f981130054e88300f9e027c33d8103c03de86f46f9e93f00f9ecab40f9e0c7833deda757a9BL8;FFe8a743a96082803ca003dc3c6182813c6082823ca1037bad092300a9e81b40f96182833", - "c6082843ca1037cad080b00f96182853c6082863cb90000b4e0031aaaL8;FFe91700b908b140f9fb2740f91f0900f1c9040054e23740b9a08302d1e103182ab58302d153e4ff970800009008713e91a900009029c10491e8c702f9080000d0BBBBL4;FFfd7bc6a8c0035fd6ff4303d1fd7b0ba9f36300f9f", - "dc30291e40301aae30300aae0030091e1031faaf30308aa233b0094e00744ade22bc03d6222803d600603adL4;FB27726563697069656e7427206973206e6f74206f6e65206f662074686520726563697069656e747320696e2074686973205365616c656453656e646572563253L8;FFfd7b43a9ff03029", - "1c0035fd637008052180080921901805206000014e20313aa430c805254e9ff97e10300aa00feffb5a80640f91f0116eb29050054e00313aaBL8;FF00603891f96f0194e00200d000c01c91f66f0194000300b000c03991f36f0194e00200d000601c91f06f0194fd7bbda9f50b00f9f44f02a9fd0300910", - "10c40f9L8;FFf90b40f9df0a00b100040054e1d342f9e8cb42f91f0101eb204f0054e8cf42f92a040091800203914901805209692138ead302f968230094e14316917c0d0094BBBL4;FFe86b40b969c20339a98350b8600603ade08b45ad68be0339a8c3507869120fb8e93f40f9600a04ade043c03d6852", - "0f78e883443969720ff8e98f40f96002803dL4;FFfd030091000c40f901000094200000f000a040f9600100b4fd7bc1a820dbff900000009101000014200000f000a040f9c00000b420dbff900000009101000014L8;FFb40000b4e00315aae10314aa22008052f3af0094e0630191c0a9ff97ff431891f4", - "4f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd637008052BL8;FFeaffff904ad12d91e9a305f9e9c32791e85b04f9e8ffffd008710c91e9ab05f96902009029710391e8af05f9e8c32291a04700d1e9b705f9890200f029410591L8;FF00443391e8eb01f9e1032a91e8f301f9e800009", - "008810b91e3430f9142008052e9ef01f9e9f701f9e8fb01f97ceaff97f55340f97fc21239681242f9600e42f9BBBBBBL4;FFf7170214f44f41a9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd03009108a040391f0d0071a1010054135040a9880240f9680000b4e00313aa00013fd6810640f9L4;FFa008005", - "4f2170094c001805221008052f0170094e06401b4a80000d008bd3491f60300aa090140f9086140f8090000f9086000f8bb0000b4e0031aaae1031baaL8;FF0b2000a93f7d00a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6e10200b43f0002ebe80300540a2440a9f40300aa00600091f50301aaf3", - "0308aa4a0140f9BBL4;FF6814f837a0c300d18e010094a8035db8c8210037a8035ef82a0340f9490108ebc32b00544a0340f9b4835df84801088b480300f9290300f988fe60d3281c00b5L4;FB666f756e642f70726f632f73656c662f617578760000000000000000000000002f6465762f6e756c6c0000", - "000000000001000200030004000500060007000800L8;FFa9c316386901084aabf35638a9d316384901084aaa035738a9e316386901084aab135738a9f316384901084aaa235738a90317386901084aab335738a9131738BBBL4;FFf50301aa1f0500f1ab000054609a40f9e10308aa22008052f1d701940", - "800801274d612a9749e00f9684201b9f44f42a9f50b40f9fd7bc3a8c0035fd6094840f9L4;FB632f76312f6368756e6b65642f73656e645f63742e7273002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d62353864L8;FFe9a743f9eaab43f9e8af43f9df0a00b", - "1e8fb00f9e1c50054e8fb40f96a2201a908008092682600a96a0a0014e86345f9e97345f9ea8345f9eb8f45f9faab45f9BL8;FFe1d342f9e8cb42f9f95b49f91f0101ebc0bf0054e8cf42f9490480522a040091e00318aa09692138e1431691ead302f997110094fad342f9e8cb42f908011acbL8;FFbf5b", - "38a9b67f3aa9bf233ba9bf6b3ca97ef6ff97e03100b5a0077eada8035ef8f3cf45f9e88306f9e8c745f9e03b833da00b7cade13f833d7f0208ebe02b833dBBBBL4;FF1f0d00b141030054880200f9680080522a000014770240f9761a40b9f50301aaebf701940002805201018052e9f70194200500b4e8c", - "20091e10315aa160800b9L4;FB67653a20c000266572726f72207768696c6520696e766f6b696e6720616e206666692063616c6c6261636b3a20c000166572726f7220696e206d6574686f6420L8;FF680500b5200840921f1800f1a2050054217c0353c10500343f040071200200543f080071200100543", - "f0c007121fdff5481620091e20313aac1f6ff97800500b5BL8;FFe83700f9ba2378a9b80300b4f50308aa9f0700f12b010054f40300aae00319aaf60301aae1031caa22008052ec770194e10316aae00314aa3f0400f16b000054L8;FFe287843dfe770094e0074091e10740910238805200800991218001", - "91f8770094e92342a9e00319aae0f3c63d0178805222008052f5170af9e8130af908048152BBBL4;FF20008052c104805202b80194800300d000000891f8b70194800300d000a00791f2b70194800300d000201191efb70194800300d000801191ecb70194a0077ba9L4;ZDL8;FFeb031faae9031faaea03", - "1faa8c318d9a4d040091ae696a384a0500915f010cebcf194092ce1d0013ef21cb9ae90109aa620000546b1d0091eefeff378e04f837BL8;FFfa37019408004039a90200b029410291e00301aa227968f8a90200b029013291287968f8e10308aa2b380114fd7bbea9f44f01a9fd030091080040f9f30300", - "aaL8;FFc8fe60d355ff48d3f703162af603082a4c000014e8d743b9eb830d91ea0742f9691147b86081c73c6181c83c683104b8e8435039f55340f9e9a303b9e903092aBBBBBL4;FFe003082ae20303aaf80303aabaf3ff97800300b461000014f70300aae003082af80303aae20303aae303142aa2eeff9", - "7e90300aa14000014091041b949000037L4;FF5f0800f180000054281440f9140114ab620d00549400f8b6e0031faae10314aafc070094f70302aaf60300aaf80301aaf40700b4e6070094e00314aa21008052L8;FFffc300d1fd7b02a9fd830091490200d029813d91eafffff04ab12791400200d000403", - "e91e92b00a9490200d029013e91e1030091e92b01a918080194fd7b42a9BL8;FF0f880194fd7bbca9f85f01a9f65702a9f44f03a9fd030091084841b9f30300aa88060034080140b20811c0da081540d2080d088b0825019108fd46d308050091L8;FF04880094200080520104805201880094600100d000", - "e02e916301009063602291640100d084602f91a24700d141038052fb8700944000805241018052f5870094BBBL4;FF3f14007121050054889b40f91f0500b14006005461c30091a26301d1bbb1ff97e0f9ffb46d0000143f040071e00200543f080071a1030054888340f91f0500b1L4;FB73656e645f656", - "b2e73656e642065706f636820c01e3a204b657973556e73616d706c6564202d3e204b65797353616d706c6564002f636172676f2d6769742f73L8;FF28008052e86b00f9cd0300b4fc031aaafa030daaeec70094e0031aaa21008052ecc7009400be00b4e10315aae2031aaaf90300aaf2c70094ed031aaa", - "fa031caaBL8;FF4804028b49008052f30303aa340d002a3940009118f17dd30b000014680640f9e10316aae20315aa0001178bf4470194e802158b680a00f9186300f139630091L8;FFe8000054680640f93f0002710801148ba20100540101003926000014e00313aaf603012ae10314aae20315aad5ebf", - "f97e103162a680640f9df0202710801148bBBBBL4;FF29710391e8270ba9e8530291c90300d029610391ea830291a04700d1e8270ca9e8f30191a10302d1e8270da928008052e9030090293d3b91682703a9c80300f0L4;FB20000000000000000800000000000000949c400000000000576869737065725", - "072654b657953656e6465724b6579506c61696e746578745369676e6564507265L8;FFe0071bada083de3ca183d73ce2031cada083d83ca283d93ce10319ada083da3ca183d33ce2031aada083d43ca283d53ce10317ada083d63ca183d13ce20318adBL8;FFf44f42a9f50b40f9fd7bc3a8c0035fd6ea17", - "41b2092100390a0100f9f44f42a9f50b40f9fd7bc3a8c0035fd6290480d20900f0f2090500a9f44f42a9f50b40f9L8;FF1a7d01a91f2503a91f2100f92003c03d0081843c2007c03d0081853cfc2700f9da0000b4e0031baae1031aaa22008052eb670094fc2740f99f1b00f103050054BBBL4;FFe2031ba", - "a2300805224008052089bff97b9035cf8a8035bf8080119cb7f0308eb69ddff54a04301d1e10319aae2031baa2300805224008052fd9aff97b9035cf8L4;FF336041a9361040f9d60600d1002300d1d602028a381440f9f602168bd5220391180c18cbfa02188b54230091530100b4611640f9a102018b81", - "8600f8618a40a9L8;FF02fd46d313e17a921a154092e20000b4a80357f880030191e10319aa0801028ba80317f821a80094a0c303d12103138be2031aaabaf31438f1a70094a8f35438BL8;FFa82737a9480dc0da690dc0daa82738a9880dc0daa90dc0daa82739a9c80dc0dae90dc0daa8273aa9e8030c9", - "1f7270194f30740f9e80740b9e0830c916002c23cL8;FF010480520e2800942000805201c480520b280094fd7bbea9f44f01a9fd030091f40300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aa03280094BBBBBBBL4;FFfa6746a9fc6f45a9fd7b44a9ff830291c0035fd6e92340a9795200", - "a9280108cb680a00f957feffb4e8e67ad3081d019108e57a92e902088b212500b180fdff54L4;FFe80300f9e80305910001803d00060054e8c30591e02300910227805201e10091f71b0094570400b5250000142017c03de1af40f9fc0305913b0080922003803dL8;FFf44f42a9fd7b41a9ffc30091c003", - "5fd6600200f000601b91f41b0194600200f000401291630200f063c01191640200f084c01b91a20700d161058052f81b0194BBL4;FFe8e31291eab304b9a9b33a292c9c0194eaeb5239fcbb5339940600f1eb0f5339ec4f5339fedf5339ea730729eaef5239e8e35239fcbf5339e9e75239ea730829L4;ZF", - "L8;FF4b0500910a3040f96901098b0a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091490109abc20400542a0140b24a11c0da4a1540d2BBBL4;FF21008052f3db0194e09700f9600b00b4e10b4091e09740f902c4805221c00091f7db0194eadb0194008c815221008052e8d", - "b0194e09300f9600a00b4f99340f9L4;FB20747970652055524c3a2022c009222028676f743a2022c0022229004b6661696c656420746f20656e636f64652050726f746f627566206d6573736167653b20L8;FFe9f341f9eafb41f9eb0b42f9ef6342f9e86b00f9e8f741f9ec5b42f9e1eb41f9faff41f9e", - "73742f9e8e700f9e80342f9e35f42f9eca300f9f86742f9f98742f9BL8;FF00c0359121802f91f4432591fc5b0194fc074091e00740919c83099100c0359188830e9158cf0094e0074091e1074091023280520080019121c03591f05b0194L8;FFf73b00f9f65708a9f44f09a9fd83019128008052f30300", - "aa3500028bffa300a9360100b0d6a2339117008012a88300d1e0830091f40301aaff8701a9f5db02a9BBBBL4;FF0811c0da880e488b18011b8a208d212e00a8302e0800261e680700372b00805202000014eb031faa29210091f80700f92001148b14001b8a496b74fc208d282eL4;FB90001b0154001401", - "39004700ee0028007c001b00b400fc005501c400de004501610165005e008501040071017e012801a70035012f000b000000000000000000L8;FFcffaff97c00c00b5990a40f9880240f93f0308eb61000054e00314aa84fb0094880640f9e083c03ce1031faa2823189be90f40f92a0700910001803d090", - "900f9BL8;FF291540d2290d098b2925019129fd46d3290500912801088b5f050071000300540a0c40f908011f8b5f0500b100040054091440f92a0140b24a11c0da4a1540d2L8;FF2a040091e00315aaea1700f909692138e16300913f7cff97f71740f9e80f40f9080117cbbf0208eba8380054e81340f9", - "e10316aae20315aa0001178bf07b0094BBBL4;FF06000014810300b0215c3091830300b063e01e91a0031cf8a00301d1220380520402805221b10094b9035cf88bffff1728008092686a00a935000014e89341b8L4;ZBL8;FFe8031faac902088b080900912a0540392b0140391f0120f12a0100392b0500", - "3921ffff54350080527f0312f1e10d0054d40d00b4e8030191e00316aae10314aaBL8;FF29010a8b290500913f010aeb29030054280108ab8300005410000014e80308abc2010054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a250191L8;FF01835ff881ffffb4000340f922008052f33", - "b0094f8ffff17ff0600b17582039180050054200740ad69d20391e82342b960620491e12303910227805276f200b9BBBBBL4;FFc03b0054680640f9090180522a0400916a0a00f909692138e10313aa01f8ff97570300b4610a40f9680240f9988240f91f0101eb00310054680640f949028052L4;FFb900", - "00b460070091e1031aaae20319aafb0b0094bc2240f99c0100b4b51e40f9eb0b0094e0031caa21008052e90b0094400700b4e10315aae2031caaf40300aaL8;FFfdc300913fb400f1e1050054090040393fd5017181050054090440393fc9017121050054090840393fb90171c1040054090c40393fe9007", - "16104005409104039BL8;FFe10315aae20314aa2300805224008052f30308aa067fff97e80313aaf35741a9c7ffff17e0230091f30301aae10314aae20315aa2300805224008052fc7eff97L8;FF4000805241008052f28b0094e07d00b4f30300aaee8b00944000805241008052ec8b0094207d00b4fc03", - "00aae88b00944000805241008052e68b0094607c00b4BBBL4;FFec0340f9c869ec384804f836c92a41a908014092800640adcb692c387f020039280108cb892100d14a05009129010d8ac82a01a9c801098bc9190ccb0b210039L4;FB36263d3620062b16f9f6f2e6efd6e4c6d5b6dea6c396c886a176aa6", - "6b756bc468d3686269b169006484d41432063616e2074616b652061206b6579206f662061L8;FF75ab44a9e87300f968a745a9c04900543fc3007180490054080b00911f0900f123590054f80000b4e0031aaae10318aa22008052f4030aaae9cb0094ea0314aaBL8;FF264c0194e81f40b9e8030639e107", - "40f9c1f7ffb527feff173c008052e8430691e0430f91b15fff97f82740f9e81f40f91f0308eb61000054e0e30091fc82ff97L8;FF3f0500b120060054096840b969070034290140b22911c0da291540d2290d098b2925019129fd46d3290500910a2440f9aa0600b44b0140b26b11c0da6b1540d2BBBBL4;", - "FF0a2500a9f44f42a9f50b40f9fd7bc3a8c0035fd620008052018c815208ec0194fd7bbda9f50b00f9f44f02a9fd030091f30301aa210200b4f40300aae4eb0194L4;FB0100000000000000d8f44200000000004261644b454d4b65794c656e6774684261644b454d436970686572746578744c656e67746", - "80000007a94480000000000L8;FF610a40f9680240f91f0101eb40040054690640f92a0400910b0480521f010aeb6a0a00f92b692138600400542800805228692a3848050091680a00f9f44f42a9BL8;FFc80d0037a8835df82a0340f9490108ebe32400540a0340f9ba035df84801088b080300f9290300", - "f948ff60d3a80a00b5400b40921f1800f1a20a0054417f0353L8;FFe082c03ce9c30291aaffffd04ab13991400100b000581691e86300f9e863019108210091a10303d1a92b34a9e02f803d1a6c0094e83b40f9490100b029393891BBBL4;FF20031c8be10318aae20317aafcab01948803170be8ff00391", - "70500b52b000014080280d20800f0f2681200a9f0000014e80317aaf90318aa1c020034e8030091L4;FFe6ffff17280000d0083141f9680000b4e800f037c0035fd6fd7bbfa9fd03009104000094fd7bc1a860fff7362c0f0014ffc302d1fd7b07a9f85f08a9f65709a9L8;FFff9701f9fb9f01f9ffa301f", - "9e0ab01f9ffaf01f90a000014a8035df8e97241f89f0306f1f60314aa550300f953230039489300f8490b00f9e00a005408031c8bBL8;FF820342ad620203ad810340ad610201adff032e91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6404fc03da80359f84003803de8f304f9L", - "8;FF050300141f09007121070054090180d268df78920900f0f23a0140b2691f40921b0109aaa1035df8415f00b5fd020014ba031ef8e8074091e0832691e10318aaBBBBBBL4;FFe80300aae00301aae10314aae8f80737d3ffff17e0030091e82b00a91af10094ffc300d1fd7b01a9f44f02a9fd4300912", - "80840f9290040f91f0002f1230f0054L4;FFff6b02f9f66f02f9ff7302f9d9f4ff97e86f42f929068052e0431391e1830a9109010039e037c13df6b30bf9e0d7853db90d0094e107409160420191e2431391L8;FFc0035fd6e80340f91f2100f121060054e80740f91f3500f1a1070054e80b40f91f4900f", - "181070054e80f40f91f5d00f161070054286000f1830d00548a008052BBL4;FFf70300aa08fbff54960100b48002158be10317aae20316aaf9930194b502168be00317aae10316aa22008052f50f00f9eb93019402000014f50f00f9e0030391L4;FDb0374a0000000000000000000000000000000000000", - "0000000000000000000000200000000000000000000000000000000000000ffffffffffffffff00000000L8;FF840100d084402691e0030091a363009162018052b30f00f93e9400943e940094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091BBBL4;FFf7060091018100", - "ad0201803da1837dadf75b00f9a28f7cad018102ad028d01adbc8355f8f9031caa228f40f802c0ffb597000014e0830291c90a0094f45740f9L4;FB8e1949000000000057000000000000006801000011000000010004880588000007f006f0000003780378010005b405960378025a0000035007c003780", - "6e80000L8;FFf28342f9f87700f9e28742f9ea8f42f9e89700f9e82742f9f49342f9f76b00f9f77b42f9ec9742f9e8a709a9e82f42f9e93342f9ef4700f9fe9b42f9e09f42f9BL8;FFe8cb42f91f0101eb406b0054e8cf42f9090180522a04009109692138e1431691ead302f99a0d0094df0600b1800000", - "5480c20291e1431691c01000941f0700b1L8;FF2002805221008052f2530094804000b4880c8052090100f02921319108400039c80080d22001c03d0800f0f2e9f35639e06302f91c490091280280520000803dBBBBL4;FFc0010054e1430191a20301d1bfddff9760faffb460000014e83740f91f0500b1", - "a0010054a1620091a20301d1b7ddff9760f9ffb461000014ff5b05a9ff3300f9L4;FB1e9d1128aafca8060a250803122105bc9d1d290be964810dfa7e94856480a3f7060d004c9762c24c575a1522353a5a1240c11ec3c401eb0107ab38f8600e8720L8;FFa1020054880243f81f0500b1810000549f5e03", - "a99f7e04a9977e05a981c20091e20313aa45f6ff9740fcffb4610000143f0c007160fbff543f100071c1000054BL8;FF3800805209000014a20301d1830c8052a95aff97800e00b5bb035cf8fa031baa428f40f8421000b4610340f9360080399600f8b728040091490400d111000014L8;FFe8d302f9e06", - "749f9f90b40f9800100b4e1d342f9e8cb42f91f0101eb20bf0054e8cf42f9090580522a04009109692138e1431691ead302f97d110094e8d352b9BBBL4;FFa1120094e85342a9f56343a91f0500f14101005408008092756201a9685200a9f44f47a9f65746a9f85f45a9fd7b44a9ff030291c0035fd6e08", - "30091e10317aaL4;ZBL8;FF0e0e805210d0009128338c9a0ce179d38c1108cb687f0e9b8fc101d1a8a10e9bedfd44d3ee430191ef730091b27dcb9bad0301d108011c8b11e1009148060091BL8;FFe03bc33d0011803de03fc33d0015803de98346f9093100f969060091e02bc33d0001803de02fc33d000", - "5803de033c33d0009803de9cf05f9a88357f8080540f9L8;FF800300543f10007121010054e02c00b5a02302d13ff4ff97e80301aaa0030036482d00b5e1031faadbffff17a22302d1630c8052a6eeff97e10300aac0faffb4BBBBBL4;FFa8ae8cd2294c8ed2aaed8dd2680eaef2a9ccadf28accadf2a8ac", - "cdf2a9ecccf22a4ccef2e86deef2298fedf2ea8decf2080008ca090009caf30302aae82700a9L4;FFe8eb40f9f90b41b2e92304a97d000014810a41a9e0e3069141f7ff97e8df40f91f0500b1003f0054f6275ca9590080d2e82f00f9e8eb40f9fc031faa1900f0f2L8;FFc8090054490200d029291f918a", - "0000102b6968384a090b8b40011fd660220091f30b40f9fd7bc2a8a500001460220091f30b40f9fd7bc2a8bd00001460220091BL8;FFe343009113840194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000b04a611a91e8a700a9020300d0421c3d91ea0f00f9e343009105840194L8;F", - "Ff65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6400100f000603d91f58300940a0040f9e80080524a0141d25f2d00f14831889affc300d1fd7b02a9BBBL4;FF61000054e023109189c30194e80b42f9a003de3c8a0600918822199ba9035ff80001803d090900f9ea0f02f905000014a2a300d", - "1830c80529faaff97601100b5L4;FB6b796265725f7072655f6b65796c6f63616c5f6964656e746974795f7075626c69630000000000006d674900000000005500000000000000ce00000001000000L8;FFecf742f92841082aea114ff8e99148b8e193c13de00b18ade097c13d29dd78d3ec7202f8e49bc", - "13deabb01f9ea7b43f9ebe3573928a108aae18314ade09fc13dBL8;FFff470039e80700f9e6390094e80300aac102009021c40691c302009063a00b91e023009102018052a4008052e80700f909000014e00700f9c102009021c40691L8;FF600600adff031691f44f45a9f65744a9f85f43a9fa6742a9fc", - "6f41a9fd7bc6a8c0035fd6ebab59a93f050071e89741b92083c13cec030b918033803da1090054BBBBL4;FFd70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb030901541803008bf9feffb50f000014L4;FB00000000000000000000", - "000000000000120000000000000013000000000000001000000000000000160000000000000073686f756c64206f6e6c79206661696cL8;FF09008092090100f9c0035fd61f21003909008092090100f9c0035fd6018840a904944329e00308aa1f2e0014fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a", - "9BL8;FFf303012af40300aaf16301940002805201018052ef630194200100b4140000f9e10200d021603691130800b91f300039f44f41a9fd7bc2a8c0035fd600018052L8;FF770a40f9680240f9080117cbbf0208eb6800005455fdffb5f0ffff17e00313aae10317aae20315aad6070094770a40f96802", - "40f9080117cbbf0208eb09fcff54BBBL4;FF0801c0da0811c0da08fd43d3e00308aafd7bc1a8c0035fd6600300b000c01391f2a30194600300b000201191efa30194fd7bbba9fa6701a9f85f02a9f65703a9L4;FF5f7c00a9027861f8220100b57e000014400440f9607821f8f8ffff177f7821f8f6ffff1", - "7e20300aa607821f84180403940008052441c40b9231040d30020c31aL8;FF0205805234a40014a10100d0217c0b91a203805230a40014090040b9e80301aaaa0100d04a910c91e00308aa420080523f010071a90100d029990c9121118a9aBL8;FF55008052040000143f404071680080521535889a6802", - "40f9080114cbbf0208ebe8000054680640f93f0002710801148ba20100540101003926000014e00313aaBL4;FFbf3e00f148020054800642ad80020291e103009122008052e00702ad800a43ade00b03ad810240ade10300ad820241ade20301adf423009400e4006f808200adL3;FB00000000000000000", - "0f03f000000000000f03f0000000000a802000000000000a802000000000000001000000000000001000000050000000010000000000000BBBBBBBBL4;FF010880525f0108eb0295899ac3030094f95342a9e11b40f9f90900b4780240f9e15700a9b50a00b4000340fdfb0740f9fa031faafc0318aa0088", - "202e0800669eL4;FFc1028052031e0094ff8302d1fd7b04a9fb2b00f9fa6706a9f85f07a9f65708a9f44f09a9fd03019109404039a9080037f40308aa092040a9f30300aae0430091L8;FFffc30091c0035fd680020090004012918302009063c011918402009084e02291a20700d161058052fd1d0194c0", - "035fd6fd7bbda9f65701a9f44f02a9fd030091BBL4;FF880100b42a0940f929610091086100d1550115ab63ffff54400300d000a01a91420300d042801b91a10680520d9e01949509f8b6f9031faae00319aae10315aaL4;FF5f8000f1e80300545f4000f1c3000054261c40a98c347fa9061c00a9ac343f", - "a9c0035fd6e2001836260040f987805ff8060000f9a7801ff8c0035fd61f2003d5L8;FFe8030091a2018052419e009468c20091810100d021481491a40100b084600991e0030091a3630091a2008052a80f00f9389e0094810100d0215c1491a40100b0BBBL4;FFf843059199008052e00318aae10319aae", - "2031f2ae0023fd61f0000f1ad000054390300eb634900541803008b060000141f0400b1e14800540cde01941f100031L4;FB567461626c6500000000000000000000080000000000000008000000000000009829440000000000636c6f6e6564726f70000000000000002d00490000000000L8;FFe8ab00f", - "9281847a9eaaf18a92a2c4ca9e8a71aa9286c48a9eaeb00f92a4850a9295c49a9eb9b00f9e85300f9e8979f1a08219f5a2c2c4fa9081d00121f050071BL8;FF080dc0dae00700ad9f2203a9820241ade20301ad255e019400e4006f9ffe003988264d298a2e4e298c364f29e00300ad0809c05a2909c05ae", - "00301ad8e3e5029L8;FF29250191891a498b29050091200108ab220a0054e10313aa85fbff97b7010034610a40f9680240f91f0101eba0090054680640f9090180522a040091e00317aaBBBBL4;FF10000b8a426970fc438c202e7100669e32c201f2a1fbff54e8ffff17e083c43ce183c23ce82f40f9218", - "27aa920829e3ce083c33c385e7ca921829c3c3f0400b1L4;ZFL8;FFe00313aab2fdff97e80301aae0000036280500b5e1031faae0ffff17e1031faa880600b9ddffff17e1031faa880200b9daffff1781020054e1031faae00301aaBL8;FF6c120079691e00796a2201a96112833c7f020039f44f45a9fd7", - "b44a9ff830191c0035fd61f09007181010054ea1340f9090180d20900f0f248dd7892290140b2L8;FF281300546a000014f7031faaf50314aab60e4ff8df0600b180170054e00315aa35eeff97080040b20811c0da081540d2080d088b0825019109fd46d30800098bBBBL4;FF22008052f6bd0194f8ffff", - "17e80340f9c80000b40805088be00313aa0201805201f17dd3eebd0194ff030b91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L4;FB64020000130000005369676e65645072654b65795265636f726453747275637475726569647075626c69635f6b6579707269766174655f6b65797369676e6174L", - "8;FFfd7b03a9f52300f9f44f05a9fdc30091f40301aaf30300aaedbd009400048052210080524dbe0094400400b4f50300aae7bd0094000480522100805247be0094BL8;FFe10319aa033e019420008052e10318aa003e019420008052e10316aafd3d019420008052e10315aafa3d019400018052e10313", - "aaf73d0194fd7bbfa9fd030091L8;FFe0230091e733ff97e10300aae10700f9e10000f021443e91e30000f063083f91e0230091a200805224018052a7000014c80080d20800f0f2080500d1a0c300d1BBBBBL4;FFe802158b680a00f9952240f9350300b4610a40f9680240f9961e40f91f0101ebe00f005", - "4680640f929040091e00315aa690a00f919692138e10313aaf9f9ff97L4;FFe86b05b9e813049108f14fb8e87305b949d109b8e9235c29e8d31539e8fb4379e9d71539e9fb41b9e8f70a79e8c3473949610ab8e97740f9e8331639e8b341b9L8;FF3fb5007101050054094840393fb50071a1040054095c4", - "0393fb5007141040054f30308aa080040f9099040b80ae040b8f40301aaf50300aae80700f9083041b8BL8;FFe00315aa21008052f28d0194601800b4e10314aae20315aaf60300aaf88d0194571740f9570400b4541340f9e88d0194e00317aa21008052e68d0194601500b4L8;FFe2230091f40301aa21", - "008052e82700a9278e0094e003132aa80100d008e14039810240791f050071c0fbff549ee7ff97f44f42a9fd7b41a9ffc30091c0035fd6BBBL4;FF2904009114692138e92700f9770240b976825ff8b7020034e80240b20811c0da081540d2080d088b0825019108fd46d308050091f60100b4c90240b229", - "11c0daL4;FBebb49284000043059f581fbbd45ae8e86b075100c3eb485852d972939b2209ee06fade900044c755de945e790d0e7026764ed9ccd4c2a4e4d2aa0b66dfa47b40L8;FFe9b700f9e9af40f9e87300f9ef6741a9e9c700f9e9df40f9f6134ba954f6ff170a00809288018052ebe300f9e82b0ea9", - "fbbb4ca9f4b344a9f57b40f9e80309aaBL8;FF2183cb3c60838a3c2083c43c61838b3c2183c53ce85301f9c86a40b9e00704ad2083c63c2183c73ce82b00b9e8430691e00705ade10240adfab30a39e10302adL8;FFf30303aac10100b4e00302aa22008052e30313aa0d4e0094000300b50e00001428008", - "052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6d30100b4BBBBL4;FF0a0140b24a11c0da4a1540d24a0d0a8b4a25019108194a8b08050091ea031faadf0a00b12801088b20020054df0600b100010054c90240b22911c0da291540d2L4;FBe48442000000000000000000000000000800000", - "00000000008000000000000005885420000000000000000000000000008000000000000000800000000000000L8;FF6400805223000014c80080d2e0230039e00300910800f0f2ff270039e80300f9e0e3ff97e80300aa210200d021301d91230200d063481491e003009122028052BL8;FFf46d0194a005", - "00b4f70300aa1b400091fc0313aa08000014390080529c0700d1d6620091b56200d178673fa9788701f8dc0200b4b50200b4d80a40f9f8feffb4L8;FFf60300aae043169122008052dd110094e1d342f9e00316aa02faff17e043169122008052d7110094e1d342f94ef9ff17e0431691e1031caae2031aa", - "ad1110094BBBL4;FFe8d34278eabf4039e19342b83f8100f1a8c31b78aae31b38e1060054486f40f9e0031aaa1f0500b1c0130054087440f91f8100f1e11300540c7040f9e8134139L4;FFf44f01a9fd030091f40300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aa30feff97000300b50e", - "00001428008052090180529f6a29f8880200f9L8;FFabc35eb80801094a4901034a6b39000a0801094a08010b4a89021b8b3f0500b160040054097d18536a0240797b0700b1e95a69780821094a095d10534801084aBL8;FFf3d352a9140200b47622009104000014940600f1d662009160010054c1825ff", - "881ffffb4c00240f922008052ec2d0194f8ffff17e057c13de15bc13de87345b9L8;FF810000b4c20a40f9e00314aaf42d00945f0b00b141100054f5833f91bb070036e88340f9e0074091f69340f90000189109a941a90081c23ce087853de9030bf9BBBBBBL4;FFe0230091e70b0194f44f4da9f6574ca", - "9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aaf7150294a00100b4f50300aaL4;FFfb0300aa0001c03d08e140f8ec0741b2d6028052d90280520000803d08e000f8e1ab4bf941f1ffb58effff1778ff78d3c8fe60d337ff60d3dcfe78d3cf7e0853L8;FFe1031", - "4aae20315aaf96300a9a873003910160194a0000035d60600f1c1feff54e0031f2a0200001420008052f44f45a9f91340f9f65744a9f85f43a9fd7b41a9BBL4;FF2a2080390871098bca01f8b708e10a8b2a01805208a800a91f0000f9fd7b44a9ff430191c0035fd6400300d000f01991420300d042001b", - "916108805219960194L4;ZBL8;FFfd030091080040f91f0900b1a1000054e0031faaf30b40f9fd7bc2a8c0035fd6080141d2e90080521f2d00f10831899a690100f0298920918a0000102b696838BBBL4;FFa88315f8614300b4e20301aaf7031faa19210091b68302d1fc4302911a0180521b0080923800", - "805214018052810340f9350080399500f8b728040091490400d1L4;FB3c1b4900000000004700000000000000ce0100002100000000000000000000000000000000000000010000000000000034764600000000000000000000000000L8;FF2ba04fa9e0f3803dea2f13a9e8a701a939a450a92aa051a9ea", - "a704a9e80b00f929a052a9e84300f92aa053a9e8a706a928d054a9e8ab03a929a855a9e97b00f9BL8;FFe1d342f9e8cb42f9f4074091948209911f0101eb40880054e8cf42f92a040091802202914903805209692138ead302f9ff1d0094e1431691950f0094e87749f9L8;FFe84bff97e80300aae85306f", - "9e08332912101009021803691a2018052230100906320379124018052204bff97e15346f9e15306f9e08332912101009021e03391BBBBL4;FF00013fd6c10640f9810000b4c20a40f9e00315aaf2f50194e1c30591e00314aa022e8052f6f501942800805268820039ff830b91f44f43a9f65742a9fc5f41", - "a9L4;FB795f70726976617465636861696e5f6b65796d6573736167655f6b65797300007a944800000000004e0000000000000064020000130000004c6f676963616c46L8;FFe80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e0030091dfebff97e10300aae00301aaf44f", - "47a9f65746a9f85f45a9fa6744a9BL8;FF21a42491040300f084a00e91a363009122018052a80f00f93e7601943e760194fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091L8;FFe0074091e8c33f91e103182a00c035915dbeff97e80348f9c8f100b4e1ff47f9280080524", - "8030039280040391f050071c1f10054e0074091e143069102748052BBBL4;FFfa671ba9f85f1ca9f6571da9f44f1ea9fd4306910080c63c0180c73cfb030191084440f9093040f9f60302aa60838d3c396840a961838e3c7f8000f10a048052L4;ZDL8;FFe00300ade00301ada8a73ea929100094f59744a", - "9c001009000802d91e603009101048052e20314aa0304805207088052e40315aa140d0094e12340f9810000b4BL8;FF96fbffb53a008052e8e740f9e98742b9f55307a9f63700f91f0500b1e96700b9fa2f00f9e0100054e8830291e0c3179101a1049127f7ff97e082c23ce182c33cL8;FF43070054e843", - "0f91e0032a914a5efe97e8eb41f91f0500b1a0c20054e8f341f9e9730e91001fc03de99304f92900009029b11691e8f303f92800009008012191BBBBBL4;FF0a050039090900396a091b320a010039d6ffff170b7c1253ec0f80120a0900390c440c33090d00396a6d1c320a0100390c050039cdffff17f7", - "03002ae0230091L4;FF83000054f5000014e80308ab621e0054bb2640f9290180527f0300f1e903899a390108aba21d0054b900f8b6fa031faae0031aaae10319aaf6050094790200b4L8;FF686e40f9a80000b4607240f901f57ed342008052f2050194687a40f9a80000b4607e40f901f57ed342008052", - "ec050194688640f9a80000b4608a40f901f57ed3BL8;FFf38501942004805221008052f1850194001500b4290300b029010991880c8052200540ad088000390900f0d228048052000400ad89a200a980a201a908008092L8;FFb37e0853a88358f8ff0208ebe0140054a80000141368b99b680240f91f050", - "0b121130054e12340f91f0001eb22280054e81f40f90811008b150540f9f50a00b4BBBL4;FFe10313aae20318aafb0300aafcc501943c1740f91c01f8b6f6031faae00316aae1031caafbc501943b0080523c1740f95cffffb7f62f00b91c0300b4331340f9L4;FB72656769737472792f696e6465782e63", - "72617465732e696f2d313934396366386336623562353537662f62797465732d312e31322e312f7372632f6279746573L8;FFeddf42f9e0c30391e10319ad028543ad0019c03de1030e9102298052ec4300f9ece742f9fa9742f9e28716adfca742f9f4c742f9f9f342f9e3c7803decb704a9BL8;FF4b020", - "0b5e0030caa7a000014e10300a9e00301aae10308aa22008052f4030caaf0050094e10340a9ec0314aa2aa040a9290040f90bfc63d35369283808050091L8;FF00e01a91f9450094000100b000801291f64500940001009000e03291f3450094fd7bbfa9fd030091081840f9080100b4080140b20811c0da", - "081540d2080d088bBBBBL4;FF42a030918106805216e601942000805201048052ffe50194e00300b000e03a91f2e50194e20300b042e02e91e00301aae10318aaefe50194e20300b042002d91L4;FB6e636f64696e672e72730076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c", - "2f7372632f73657373696f6e5f6d616e6167656d656e74L8;FFffe50094e0030b9196e1ff97f50314aa69018052a18e41f8280041d23f0000f10841899a1f2d00f1c2020054880240f9a80000b4800640f901e97bd302018052BL8;FFa363009102018052a80f00f94166019468c20091e1020090219c279", - "1e40200f084003291a363009182018052a80f00f93866019468220191e102009021642e91L8;FF602240f901f97fd342008052f4650094682a40f9a80000b4602e40f901f97fd342008052ee650094683640f9a80000b4603a40f901f97fd342008052e8650094BBBL4;FF6d15003309f101f8290080920c", - "2100390a7101f80d9d0039090100f9c0035fd6090500f9290180d20900f0f2090100f9c0035fd6ffc301d1fd7b02a9fa6703a9L4;FFe2e60737021c40b94224c11a82e6073702cc7492340000b0850242f9420040f95f0005ebc1e5ff5402404079452c46d3bfbc0071a80200542200009042c00291L8;FF", - "a80100f008810391e00301aae10308aa6200805230a60014281040b96800c8376800d0372da600142da600142da60014ff0301d1fd7b01a9f51300f9f44f03a9BL8;FFfd7b41a9ff830091c0035fd6ffc300d1fd7b02a9fd830091e82300910900009029e12791e0a300a9200440a9820200b042c83791e3", - "430091e90f00f905260194L8;FFe10309aa30260014c00000b000c01f91e1031faac0035fd6c0035fd6e30302aae20301aac10000d02100139109260014fd7bbaa9fc6f01a9fa6702a9f85f03a9BBBBBBBL4;FF01018052f3190294000200b5e003162a01018052e20315aafa19029403000014e003032af", - "5190294608600a97f0200f9f44f43a9f65742a9f85f41a9fd7bc4a8L4;FFfd43059109304039e9130037190840b9f30300aa180040f9e0a30291f40308aae103192abd110094f50f4ba9a08301d1e10318aae20315aa6c0f0094b6035af8L8;FFe10314aa031a019408fcdfc8081140f91f0500f1e0179f1", - "ac0035fd6ffc300d1fd7b02a9fd830091280200f00871039109200091e02300a9200440a9620200f0BBL4;FF5f0100f91f410ff181ffff54ffb304b9e8430391ffa304b909510f91ffa704b90a0540b2ffab04b909610f91ffaf04b909710f91ff43033909017fb2ff470339L4;ZFL8;FF84801791e00300", - "91a363009142008052b30f00f93f9a00943f9a0094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaBBBL4;FFe20316aaf70300aafdd90194e82300910083009169b30094f80f40f97801f8b6fc031faae0031caae10318aaf9d9019437008052e8230091008300", - "915fb30094L4;FBacdb4400000000002f72757374632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c6962726172792fL8;FFf0c742f9e2cf42f9e8cf00f9e81742f9e0f3803de8c300f9e81b42f9e8ab00f9e81f42f9e92312a9e82342f9e927", - "42f9e8ab1aa9e82b42f9ea3b42f9e9a309a9BL8;FF68220039e0430691690200f9b1100094a80600d11f0900b142140054e0031baae10315aa22008052ed5901949d000014f3031faae8031faa85000014bf0600b1L8;FFe88f42b9fb2300f9e9230729d90600b4f4d340f9ee590094e00319aa21008052e", - "c590094e0fd00b4e10314aae20319aafb0300aaf2590094f4e340f9f61b00f9BBBBL4;FFe00315aaf6f90194e08741ad28008052e217c03d800600ad820a803d68820039f44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd60001805201038052L4;FB616c2f727573742f70726f746f636f6c2f7", - "372632f73746174652f73657373696f6e2e7273001d52656d6f7665642061206d61746368696e6720636861696e5fL8;FFf7f9009417010014e1430091e20313aaf70b00f9f73f00f97d050094e08743adf50300aaf4cb00f9e0870aade28344ade2830bade18341ade18308ade28342adBL8;FF6df17dd3", - "8c696b786b017fb28c21cd9a8a010aaa7f0109eb630000540aa403a9c0035fd66801088b6bf17dd3286868380821cb9a0a010aaa0aa403a9c0035fd6L8;FF6001009000201b91f87900946001009000600e91f57900946001009000c03c91f27900946001009000a00c91ef7900946001009000003b91ec7", - "9009460010090BBBL4;FF8b2eaff21ffd03a92a4ccef24b8cccf21f0103f8e85b40b9ea8decf2ab8ceef22a010aca2b010bcaf903082aaaaf3ba9b90319f8893f0094e13340f9a06301d1L4;ZBL8;FFb40303d1fb1300f971ba0094f0b900940004805221008052eeb90094602e00b4a8e300d1f80300aad", - "c0ec0da000540adc80100b00861309129048052e1831391BL8;FF290d098b2925019129fd46d329050091280108aba2060054694240b93f0500716102005469aa4829c9030034290140b22911c0da291540d2290d098b29250191L8;FFf7390094fa5f49a9b60000b4e05b40f9e10316aa22008052f13900", - "94fc032a91b50000b4e03f40f9e10315aa22008052eb390094753642f9b60e49f8e4390094BBBBBL4;FFe00700f9b701001401800191e003022ae20303aabdf3ff97e03600b4e00700f9210400b021a01f91230400b063a83691e023009102028052c4018052ac010014L4;FFfd030091f30300aa020300b", - "4280040391f21007161030054f40302aaf60301aa9790fe971f0400b180050054080400919f0208eb41030054940600f1e0030054L8;FFfd7b02a9fd830091490200f029813d910a0000904ab12791400200f000403e91e92b00a96902009029210791e1030091e92b01a9190a0194fd7b42a9ffc30091BL", - "8;FF020380524401805209000014a0031df8210300b021e43191230300b063b42f91a0c300d102038052640180521f7f0094b4035df8b3ffff17a0c300d1a82b3da9L8;FF97fa7fd3f2890094e00317aa41008052f0890094003e00b4e10313aae20317aaf5df07a9550b158bf60300aaf4890094b506407", - "99f0600f161000054f3031faaBBBL4;FFba035df812ffff17a0c300d1e1031aaa22008052230080522400805204bdff97b7035ef813ffff17a0c300d1220080522300805224008052fdbcff97a1035ef8L4;FB08000000000000009007460000000000000000000000000008000000000000000800000000", - "000000600846000000000000000000000000000800000000000000L8;FFe95b00f9e87700f9e0f30da9f46700f974a400b4eec90094e00314aa21008052ecc90094c0fe00b4e16f40f9e20314aaf70300aaf2c900941a0500143f0500b1BL8;FFf30b40f9fd7bc2a8f5490114f30b40f9fd7bc2a8c0035fd", - "6fd7bbea9f30b00f9fd030091092040a9f30300aaa80000b4600a40f901f97fd342008052e8490194L8;FF0825019109fd46d30800098b080500911f0109eb88130054bd000014080c44f81f0900b1c1090054f3031faa5a000014e80300aa098d40f83f0500b1e0120054BBBBL4;FF81020191080102ab2", - "935899ae81301f9e91701f9fce90194e92342a9e0830591e20b40f90101098be27f0739f4e90194e00750ad08108052e28bc03de1031f2aL4;FB08000000000000009080420000000000000000000000000008000000000000000800000000000000e8814200000000000000000000000000080000000000", - "0000L8;FF09692138e10313aa42eaff97770a40f9680240f9080117cbbf0208eb480b0054680640f9e10316aae20315aa0001178bf3e90094e802158b680a00f9951640f9BL8;FFe8031faa090840f969faffb5091440f9e803088b49fbffb5e0ffff170003009000602891f1690194fd7bbaa9fc6f01a9f", - "a6702a9f85f03a9f65704a9f44f05a9L8;FFec030b91eaa741b9e86301f9e9cb02b9eacf02b9080380d20800f0f21a1100d1e9d342b9204bc03d8101c03de88f01b9e94303b98041883c8021c03de95343b9BBBL4;FFe8a3009160030090005c2691e82704a9680300f008a10c9189038052e1c30091e827", - "05a9e343019142008052e82706a9680300f008410c91e83b00f98890ff97L4;FFd41500b4e90313aaea0314aa2b15c0387f05013108d5889a4a0500f181ffff54a6000014282c4079080a00b46a02148b6b008052ec0313aae90308aaf4031faaL8;FFea0740f94800805209008092e08300914821003949", - "0100f9c0a3ff97f40b40f9980100b4b322009104000014180700f173620091e000005461825ff881ffffb4BL8;FFe8d344f97effff17f63f42f92083c13ceae32291e9d742f9f5c742f9f7cb42f9c80240f9f43b42f940818f3ce9e304f9680000b4e00314aa00013fd6c10640f9L8;FF280340392a15003", - "308111d1228030039e80327912a7f0039e083c53de187c53de0fb833de1ff833d8000ff97e0fbc33de1ffc33de0833f91e07b823de17f823dBBBBBBL4;FFe00313aa4d130194e80300aae00301aa48fc0736a3ffff1761020054e0031faaf44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd68800", - "80d2e00700f9L4;FF09550039e9f340b909590039e9ab5c290a5d003909610039e9ab5b290a65003909690039e9ab5a290a6d003909710039e9ab59290a75003909790039e9ab5829L8;FF8b0d00122c0c403929c100117f2500710a0c00390910003909819f1a9f7d02710a819f1a8d0d00122e10403929", - "010b0b4a114c0bbf25007129c100110b819f1aBBL4;FFfd830091f40300aa081440f9f30301aa00a440a9811240f995620091360108eb2231889a0a920194087c40931f000071c802889ae800f8b7600640a968000090L4;ZDL8;FF82040054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4", - "a25019129194a8b29050091280108ab22030054091440f9090100b42a0140b24a11c0daBBBL4;FFeb031aaada0140b233110acb08010b8b1be100910500001473c201f17bc3019118070091c00b0054683740b91f01176b41ffff54680340f91f0500b1e0feff54L4;FBd8806c4036201b100880044088ec", - "0b924f25a29a514dadae53dface7d673eb39f094784a3c259e124f09a28cd01d49fb00008e502bac2cb119e16cc6462b3be9L8;FFe8b342f9e8e300f9e8b742f9eaa30aa9e8bf42f9e83f00f9e8c342f9e9a31da9e8cb42f9e9d342f9e8f700f9e8cf42f9e82f00f9e8d742f9e84b00f9e8e342f9BL8;FFe", - "00316aaccf9ff17e043169122008052f4110094e1d342f9fff9ff17e0431691e1031aaae20318aaee110094fad342f9e8cb42f908011acb1f0308ebc9000054L8;FF0452009400018052e10313aa0152009420008052e10317aafe5100942000805221028052fb510094fd7bbaa9fc6f01a9fa6702a9f85f", - "03a9f65704a9f44f05a9BBBBL4;FF887640f91f8100f121070054887240f94b0080528df240b9818247a9090940790a1940390f7140f80e0140b90cf140f8a9831c78894a41b9aaa31c380a7141f8L4;FB000000000000000000000000000000000100000000000000b4c342000000000000000000000000", - "001000000000000000080000000000000064ff420000000000L8;FFe10c0054e0031faa93ffff1721050054e0031faa86ffff17c80080d2e00700f90800f0f2080900d177ffff17e90b41b2e92300a97cffff17c80080d20800f0f2BL8;FFa9d357384a01084a6b01084aaab31738aae357382901084aabc", - "31738abf35738a9d31738a90358384a01084a6b01084aaae31738aa1358382901084aabf31738L8;FF802202914901805209692138ead302f9592b0094e1431691850f0094e09b49f9800100b4e1d342f9e8cb42f91f0101eb008f0054e8cf42f9090180522a040091BBBL4;FF1c9dff97a1637ba9800600", - "b4a10a00b4f90300aae00318aa22008052f0b10194e00319aa99ebffb46d000014a88358f81f0d00b1e902005428008052a14301d1L4;ZBL8;FF080101eb230700549b0e40f91f011bebc2060054e80328aa3f0101eb7c03088b600800549f0b00f1812200f983060054892240a9960a40f9e8a700a9e803", - "1baaBL8;FF8be9ff97e00313aae05306f9e0833291a10200902120099102028052a302009063c4159174000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f9L8;FFf9030891f8830d91f7032a91e8eb41f91f0500b120120054e8f341f9001fc03de0032a91022b8052e83f01f9e8430f910", - "18100912083863cf1310094e04b40f9BBBBBL4;FFf80309aaf60314aaf4030a2a0a020294ea03142af40316aae90318aa80000035e8825d385f01086b60020054ebb340a9e1e7076f880500d10c010ceaa1fcff54L4;FFf7010094b70000b4e1ee7cd3e00314aa02018052f20100945a008052b80000b401", - "ef7cd3e00313aa02018052ec010094e0031a2aff031291f44f45a9f65744a9L8;FF22008052f6010194610e40f9810000b4601240f922008052f1010194743640f99f0600b1e0020054735647a9950100b47622009104000014b50600f1d6620091BL8;FF010300f021802991240300d084c02191e323009", - "182008052e80700f932820194fd7b41a9ff830091c0035fd6010300f0217029918200805227820114080040f9L8;FF4afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54600100d000203d91ed810094600100d000c01a91BBBL4;FFf6031faae0", - "0316aae10314aa01c201943f09007141030054e82340f98a06009109dd789215000014140500b4f70300aae7c10194e00314aa2100805236008052L4;FB7420666f7220c00076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f747269706c655f726174636865742e7", - "27300136661L8;FFe10314aa03c2009420008052e10319aa00c2009420008052e10316aafdc10094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4316d1BL8;FFb70c0034e80240b20811c0da081540d2080d088b0825019108fd46d308050091b60a40f9f60b00b4c90240b229", - "11c0da291540d2290d098b29250191c91a498bL8;FF9f1700f188fbff54ea430f91e8e3009129008052448948adec030b91408541adf81f40b9e95300b94231803d02c1853c438942ad01c1823c00c1813c02c1843cBBBBL4;FF81ca005419e201941f10003101ca0054f9ffff1716e20194f70300aa1f04", - "00b141fdff54e04305918100805211e20194e0c80035e85341b9e8b300b957ffdfc8L4;FB4d6573736167654c656e6774684576656e4d6573736167654c656e677468546f6f4c6f6e6753657269616c697a6174696f6e496e76616c696400000000000000L8;FFf5cf43f9fa031c2af6d343f9f8d743f91f", - "0500f10114005408008092a02302d1766201a9685600a95eddff97e0430f91eaddff9790000014e8db43f9e0ebc13dBL8;FF600100b48002c03d154c00a9e10200d021603b910004803d1f800039f44f42a9f50b40f9fd7bc3a8c0035fd6000180520105805202620194fd7bbda9f65701a9L8;FF280800f", - "94d0200b5e0030baa61000014e10300a9e00301aae10309aa22008052f4030baad7050094e10340a9eb0314aa2aa040a9290040f90dfc6ad353692838BBBL4;FF240080520a95ff97f82b40f9b4ffff17e00301912200805223008052240080520395ff97e12b40f9b9ffff17e0030191e10318aae20316a", - "a2300805224008052L4;FF0130009102008052641240f9842c4092641200f904d05f388410001284641a3204d01f383f000039420400115f00036b2100188b81ffff5482060051e103022aL8;FFa1000054810100f021bc14918200805231a20014ff8300d1fd7b01a9fd430091810100f021cc1491a4010", - "0d084402391e323009182008052e80700f92aa20094BL8;FFff430291c0035fd6290080528a0200b04ae10c911f7d01a90a2500a9f44f48a9f53b40f9fd7b46a9ff430291c0035fd6a9831ff8a82300d1090000f029612691BL4;FFc0035fd6fd7bbea9f30b00f9fd030091011040f9f30300aa810000b46", - "00e40f922008052ee210094610240f9810000b4600640f922008052e9210094602e40f9L3;ZBBBBBBBBBBL4;FF6e020e8b6c6a2938cc2100396d7a6df86d7a28f8a7ffff1788f27dd3df2200f1080114cbc832889a080117eb43190054080800f9000080929800001409fd7dd3L4;FFfd7b0aa9f85f0ba9f", - "6570ca9f44f0da9fd83029128008052f30300aaf8430091ff2301a9e87f03a9ff2304a9e8030091e10b00a9ff6300b9ff7f02a9ff7f05a9L8;FFe00313aae10315aa22008052d6fdff9776a240a9170116eb03040054680240f9e10314aae20315aa0001168bf41e0194bf0217eb68020054c80215ab4203", - "0054BBL4;FF490300f029a10d91ea830091a02700d1e8270aa9480300b008f52a91e82b0ca94a06805208048052ff2707a9490300b029d52891e92b09a9290080d2e1c30191L4;FF08d962783f0008eb69000054020c001100080011e7c00291e0d860783f0000eb4294821adf00026b8d030054e00315aa", - "23fdff97f40300aac00b00b4e20213cbL8;FFc0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa810100d021c01891e8030091a2018052389f0094810100d021d01391a40100b084801791BBBL4;FFe85341b9e85700b957ffdfc8770000b517df0194f70300aaff0600b180020054f84", - "3059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054L4;FB0100000000000000f02844000000000063616c6c65642060526573756c743a3a756e77726170282960206f6e20616e2060457272602076616c75650000000000L8;FF0db058a9ed5f00f9ece300f90db059a9ed5b00f9e", - "c0700f90cb45aa9edf300f915b45ba9ec3f00f9edf700f90cb45ca9ed7f00f90dec40f9ed4b00f9e0840054BL8;FFf85f08a9f65709a9f44f0aa9fd430191280c40f9f90301aaf30300aa365c4d291f0500b140020054341740f93a3340b9f40500b4351340f9e55e0194e00314aaL8;FF6a0a00f9096921", - "38e10313aa88fcff97760a40f9680240f9080116cb9f0208eb48060054680640f9e10315aae20314aa0001168bf25e0094c802148b680a00f9BBBBL4;FFe82f40f921827aa920829e3ce083c33c385e7ca921829c3c3f0400b1e183c03c28821ff835da7da920829d3ce083c13c21829a3c20829b3ce0060", - "054610000b4L4;ZFL8;FF9369283808050091280800f9e006f8b7e0030aaabfffff17e10300a9e00301aae10309aa220080522300805224008052f4030caa9b150094e10340a9ec0314aaBL8;FF080040f9000140f9080040b91f050071200100541f090071a1010054080300d008e1189102018052e0030", - "1aae10308aa297f011428030090086d219142018052L8;FF4904805209692138280400917f0600b1e81700f9002400548022029194fbff97080040b20811c0da081540d2080d088b0825019108fd46d30900088b37050091BBBL4;FFf7be0194e12740f9810000b4e02b40f922008052f2be0194e8c30091", - "00c10091a2a6ff97f40b40f9df0600b1a0f5ff54e80340f9e9234039e81300f9e9a30039L4;FBb60200000900000000000000000000000800000000000000080000000000000098e5470000000000496e76616c696453657373696f6e4572726f720000000000L8;FF680200f9c5b8ff97ff831791f44f43", - "a9f65742a9fc5f41a9fd7bc4a8c0035fd6e8c30991e1a301910232805200810791f3be009480864dade0c309918276c03dBL8;FF9f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6d30100b4ed3e0194e00313aa21008052eb3e0194400100b528008052880600f909028052936a29f8880200f9L8;FF080", - "540f91f0115ebe91a0054e00313aa40ffff97e80300aae00301aac8fd073708fc60d3681a00b5080840921f1900f1a21a0054017c0353c11a00343f080071BBBBBL4;FF680240f9080116cb9f0208ebc9fbff54e00313aae10316aae20314aa230080522400805202020094760a40f9d6ffff17fd7bbaa9f", - "c6f01a9fa6702a9f85f03a9L4;FFe9d744b9eb635339481140b84aa140b8e18b40f9e8bb03b9e8bf4979eadb03b9ea7342f909b303b8e97742f9ea7700f9ea675339e8bb0779e8c35339ea2f1c29L8;FF290140f9e10300aa48078052a08300d122008052e8230039e90300f9dafcff97aa035ef8a8c35fb", - "8a9058052e1030091e00313aaa2058052ea9300f8ab2b7d29BL8;FF364740f916fcffb539008052e88740b9ea4740f9e93f40f9e08745ad7b6a05a9684a01b96a2600a9e9a346a960828b3c61828c3ce08746ad6a2201a9692202a9L8;FFfd7b42a9ff030191c0035fd6ffc300d1fd7b01a9f44f02a9fd43", - "0091a80100d008210191f30300aa08fddf88e8020035a80100d008e140396002407921004079BBBL4;FF081848ab02430054140114ab22430054d60600f1b5c2019161feff5495021aab42430054b500f8b6f6031faae00316aae10315aaf7ce0194d53e00b4e4ce0194L4;FB5e3c0e7dc2729373a237a28", - "c3d71c72d2f6007340000af1ffc3dda06237d14b52c23a274b7ec20cdc1e561f35001414aaed1575a0f8995f5a322564d25ea4915L8;FFfb0301aae8ef01f9e00100b000c83491e8f701f9e80100d008c12591e9f301f929038052e1430f91e8a303f9e3031d9162008052e8ab03f9e80100d008612791BL", - "8;FFff8301d1fd7b03a9f52300f9f44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054080200341f05007141030054000180521d000014280180d2L8;FFe16340f9e22340f9081540f900013fd6e03b02f9e8031691e13f02f9290c40f9e103129120013fd6fbc342f97f0f00b1410a005", - "4a8008052a8ffff17404fc03dBBBBL4;FF680a00b9e80180523f0400f1692201a908008092680200f96b00005422008052efee0194a80600d11f1100b1a8fbff54e00314aae10315aa22008052f44f46a9L4;FB4c00000000000000f00700001d000000fe924800000000004c00000000000000020c00001", - "d000000fe924800000000004c000000000000001d0a000016000000L8;FF5de8ff97e10300aafaffff17e1031faa883e00f9f7ffff17c10e0054e0031faa7fffff1721050054e0031faa72ffff17c80080d2e00700f90800f0f2080900d1BL8;FF6200005455008052040000143f40407168008052153588", - "9a680240f9080114cbbf0208ebe8000054680640f93f0002710801148be20100540101003928000014L8;FFe10319aae20318aa00011a8bfc6e0094f90b40f94803188be8d302f9df0600b14064ff5481620391e2431691400080523d1000941dfbff17e8031faa000119abBBBL4;FF890a00b4e85300a9e", - "80300916903009029c10491ea430091e82701a9e8230091e82702a928008052690300d029b11491e82706a9680300b008e50a91e82b08a9L4;FFff0740d1ff071ff8f30303aaf40302aa810100b4a81300d1e9330091aa1300d1eb0301aa0c1440380c0100390c0140390c0200346b0500f12c15003841ff", - "ff54L8;FF1f0101eb820f0054607b6078617b6878e8fedf88c802003528e340391f050071e1fcff54e2031f2a9508009408fc78d309fc60d3087b68782821084a095d1053BL8;FFe14b41f9810000b4e04f41f922008052f32e0194e89f40f91f0500b1600000546063029166e5ff97f3d352a9940200b47", - "522009104000014940600f1b5620091L8;FFea030191a8a73ca9c80000f008c92d91a8ab3ea90a078052c8048052bfa739a9c90000f0294d2391a9ab3ba9290080d2e92fc0f2a8ff3aa9a8a73da9f42e0094BBBBBBL4;FFe00313aa00013fd6810640f9c10100b4820a40f9e00313aaf44f41a9fd7bc2a8e", - "f160214280400d11f0d00b1c8000054000440f922008052f44f41a9fd7bc2a8L4;FF22008052f6160094bf0600f1eb3e0154e0031caae10315aaf20900141f0900f1811700542083c03c2183c13cbf0600b1e00719ad601c0054e077c03de30b4091L8;FF020041a9230940f960001fd6fd7bbda9f65701a", - "9f44f02a9fd03009114d840a9f30308aa150040f9df0215eba1010054b50300b4d4040037890240b274d600a9BBL4;FFe8d300f9a8d370a9e0070cadc082c93cc182ca3ce9bb00f91f0900b1e0870aadc082c53cc182c63ce08708adc082c73cc182c43ce08b09adc082c33ce08707adL4;ZBL8;FFfd0300", - "91011440f9f30300aa3f0800b1800100543f0400b140010054810000b4601a40f922008052ed960094612240f9810000b4602640f922008052e8960094BBBL4;FF3f0500b140020054f40300aa161041b9171441b9152041b9008040f9e8c30091818640f982ad0094e8c3403968010036c80300b008413a", - "91e904805268a600a9L4;FB08000000000000000800000000000000380c46000000000040194900000000004d00000000000000e80200000500000040194900000000004d00000000000000L8;FFe82340f9e98f04f9e83b04f9e87b40f9fca704f9e84b04f9e86740f9e85704f9e8ef40f9e85b04f9e857", - "40f9e85f04f9e86f40f9e86304f9e85f40f9e86704f9BL8;FFe18349f93f0400b140010054810000b4e08749f922008052f1560194e18f49f9810000b4e09349f922008052ec560194b30000b4e07b49f9e10313aa22008052L8;FFe80b41b2c9000014c80080d20800f0f2080500d1c5000014c80080d2e", - "0a33239e08332910800f0f2ffa73239e85306f9dc4cff97e10300aae15306f9e0833291BBBBL4;FF080400f0086137911f30003960a200a9090d40f9e823009120013fd6e80740f91f0900b100fdff5475de40a9f6830191e183c33ce083c43ce82f40f9e283c23cL4;FB080000000000000008000000000", - "000009083420000000000000000000000000008000000000000000800000000000000d8854200000000000000000000000000L8;FFf65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf40301aaaaf6ff97e80300aae00301aa08020037750240f9a80640f9160100ebBL8;FF", - "a82303d1fb3b00b925edff97bb8353f80083c03c0183c13c0283c23c7f0700b1e08705ade237803de00a00540083c33c0183c43ce00315aa0283c53ce10314aaL8;FFaa0a805221800991ff3309f9e83b09f9ff3f09f9ea4709f9e85309f9e95709f9fb760094f6ef47f9e01bc43de11fc43de0431691e80", - "36179e1833791023f8052BBBL4;FF140100b4e30314aa10b70194f50300aac00000b520008052e10314aafdb60194efb60194350080522003c03de80740f97f0600f1e92740b9d41200f9c082823cL4;ZDL8;FF00f18f3c08e040f9e023009121f18f3ce927099122f18f3ce8af01f9f8b6009468220791e", - "0230091572a0094e0630691e123009102328052f1b60094e1630691BL8;FF081840f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b2L8;FFf4360094a0e700b4e10315aae20319aae03b00f9fa3600", - "940300001428008052e83b00f97a9e40f99a0100b4759a40f9e7360094e0031aaa21008052e5360094BBBBBL4;FF0043c03ce0853badc0010054610000b422008052f2060294b60000b4e00317aae10316aa22008052ed060294b40000b4e00315aae10314aa22008052e8060294L4;FF21c03b91130800f", - "91f600039f44f42a9f50b40f9fd7bc3a8c0035fd6000180520104805206070094fd7bbea9f44f01a9fd030091f303012af40300aae4060094L8;FFe803009139070194930100b475ea7bd3530200d073c23c91e0030091a1630091e20313aab40f00f99482009130070194b58200f121ffff54e00300912d", - "070194BL8;FF29194a8b29050091200108ab62020054f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6eb031faa6c8e40f94cf2ffb598ffff17ea031faae9faffb5ddffff17L8;FFfd7b01a9fd430091a0c31f78a01300d130a6ff97fd7b41a9ff830091c0035fd6ffc300d1fd7b01a9f31300f9fd43009", - "1e90301aaf30300aa6101009021c81b91BBBL4;FF978300f9600a0054e0030691f52700b9fa2300f9e1afff97490080d2f73740f91f0700b10900f0f2898300f9000a0054e0030691d9afff97f55f40b9e94f40b9L4;FB743a20c0392c20286e6f2063757272656e742073657373696f6e20737461746529", - "2c206e756d626572206f662070726576696f7573207374617465733a20c000L8;FF01f17dd3f6c60094e96f40f9080080927b0600f9682601a9b2f9ff17b50000b4e0031baae10315aa22008052ecc60094e16f40f9217b00b4e04740f922008052BL8;FFc00200b000400b91fb460194c00200b00040219", - "1f8460194c00200b000a02191f2460194c00200b000a01b91f2460194c00200b000001c91ec460194c00200b0L8;FFea030aab23feff540001009000803291f6460094000100b000a00291f3460094000100b000801791f0460094080040390901009029012d91e00301aa227968f8BBBBL4;FFb42240b9f", - "2e601940004805221008052f0e60194c01f00b4600740ad08048052e93b40f9330100b9000400ad288100a9280d00f9342100b9670000140b257ea9L4;FB0000000000000000000000000000000000000000000000000900000000000000090000000000000098e04800000000009fe04800000000000000", - "000000000000L8;FFfcbf00f9ff8301b9d8ffff17a2c303d1630c805258e0ff97e10300aad8ffff17e1830591a2c303d1c5e5ff9760faffb4b6000014a01900b5a0c303d1a4e6ff97BL8;FF21d42c91a32300d142008052e40314aaa8831ff83f67019468220191e102009021302991a32300d182008052e", - "40314aaa8831ff83767019437670194f44f43a9L8;FF410900b408038052606a68f822008052f44f41a9fd7bc2a8f1660014604a40f9a00000b4614e40f9610000b422008052eb660094611240f9810000b4600e40f9BBBL4;FFe8040035e90f41b22e000014e89340b8e90f40b9eba34039ea2341b8ec23", - "4079680a00b9e82f407969b200b8e91340f9a83b0079a9031ff8e90f40f968520178L4;FFf30300aa000440d1a40213cb650e7fa96202048b630005aa83feffb5734200d11f0013eb41ffff54020080d2efffff1780ffff97140080d281018052010000b9L8;FFe0334039ff430091c0035fd6ff0301d1fd", - "7b01a9f51300f9f44f03a9fd430091e80100900821019108fddf8848030035e801009008e140391f050071a1050054BL8;FFff430191c0035fd63fa000f141010054f30308aae8430091001000918104805218140094e81340b91f05003100010054e80313aa4900805209010039fd7b43a9L8;FF3700805", - "2591740f9b7831ff859fcffb535008052572340f9b6831ef8b8431fb877fdffb534008052582f40f9f8f6ffb4532b40f9e6260094e00318aa21008052BBBBBBBL4;FF0801148a206b68fc00a8200e0a00669e4afcffb5f9ffff17200340fd00a8200e0800669e0801c0da0811c0da08fd43d3e0ffff17220", - "000d042f01191e1630091L4;FFf65744a9fd7b43a9ff830191c0035fd6a00000f000402791081b0094ff0304d1fd7b0aa9fc6f0ba9fa670ca9f85f0da9f6570ea9f44f0fa9fd83029109304039L8;FF010580520e1b0194600200f000201c91f61a0194fd7bbda9f65701a9f44f02a9fd030091f30302aae", - "20301aae10300aaf40308aae1000037e00314aae30313aaBBL4;FFea424039e93a0039e94640390801154ae83e0039e84a40394a01014a2901024aea420039ea4e4039e9460039e95240390801034ae84a0039e85640394a01044aL4;ZFL8;FF0811c0da081540d2080d088b0825019108fd46d308050091", - "090840f9090300b40a0440f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0daBBBL4;FFe1fb843de2ff843d220741ade003853de113853d210340ade20f853de00b853de107853df8da0194e84b4af9e94f4af96002029121030191620180521fff0139L4;FB0857440000000000401", - "4490000000000686544000000000074654400000000005865440000000000686544000000000070654400000000000000000000000000L8;FF08c1259129038052e8a303f90002009000dc3291e8ab03f9080200b008412691e1032b91f20302aaf00303aae3031d9162008052f86305f9f60306aaf8030c", - "aaBL8;FF29c10491e8633f91e9bf0ef9e90200b029613c91e8bb0ef968008052ea074091e94f09f94ac13591e1074091e93709f9e90200b029111891e84b09f9e80200b0L8;FFf46f41f9f36b41f9e8230b3949008092880240f9490300f9680000b4e00313aa00013fd6810640f9611601b4820a40f9e00", - "313aaea5a0094af080014f7c31791BBBBL4;FF610a40f9a04302d1e8630239e00744ade08702adc78d0094a00642a9e2430191f4430191f3f6ff97a80a40f9481500b40dfc79d3fb2745a9e1e7076fb03a40a9L4;FB2d72656769737472792f696e6465782e6372617465732e696f2d31393439636638633", - "6623562353537662f62797465732d312e31322e312f7372632f62797465L8;FF3f0108ebed160054e10314aae20313aa5e030094f50300aa170200143f0900b1401f0054e80741b23f0108ebe11e005481220091e20313aa75060094f50300aaBL8;FFa80f00f9437b019468e20391010300b021c0359124", - "03009084600591a3630091e2018052a80f00f93a7b019468a20491010300b021e036912403009084e00591L8;FF79fdff17e0630091220080522300805224008052a391ff97e11740f99cfdff17f30300aae06300912200805223008052240080529b91ff97e11740f9e00313aaBBBL4;FF6151005496564", - "0a9e92347a9ca0600918a0200f93c5200b49f3f00f1ec4300f9f72f00f9e200005468037d929f1300f189008052082100913431889a0f000014L4;ZBL8;FFf7230291e00702ad200843ade00b03ad210040ade10300ad220041ad21000291e20301adf6ba0094e0230291e10316aa7c360094e8630891e02", - "3029151340094BL8;FFf3031faa5a000014e80300aa098d40f83f0500b1e0120054f30300aae00308aa06fdff97e80300aae00313aa090140b22911c0da291540d2290d098b29250191L8;FFfa0301aae8430f91e00317aae103192ae20315aae3031aaa3679fe97f7eb41f9770200b4e8ef41f9f6fe60d3", - "e86300f918fd60d3c80080d20800f0f20a390091BBBBBL4;FF240080520afeff97770a40f954feff17e00313aa22008052230080522400805203feff97610a40f95bfeff17e00313aae10317aae20315aa2300805224008052L4;FFf65744a9fd7b43a9ff830191c0035fd6ff0301d1fd7b02a9f44f03a9f", - "d830091010840a988008052f30300aae0230091040180520506805229f87fd33f1100f1L8;FF611240f93f0400f12bfdff5408028052806a68f822008052f10a0194e4ffff17010040f968018052290041d23f0000f12841889a1f2d00f142000054c0035fd6BL8;FFfd7bc4a8c0035fd6e00740f9eaffff", - "17e0030091e82b00a91b680094ff8300d1fd7b01a9fd430091090040f9e80301aa2a8540f85f01007129119f9a5f0500f1L8;FFff5301f90b0000146802148b8904805294620091090100a9b5220191090900f9f65301f9d6060091df9600f180170054e78a00940009805241008052e58a0094BBBL4;FFf", - "fca0194f702168bb7031ef85f0317eb401c0054a8835df8ea060091a1c300d1e0031baa49048052aa031ef809693738fcb6ff97b7035ef8ba035df8480317cbL4;FB5e0100002e000000d5184900000000006a000000000000006e0000002e0000004d657373616765206c656e677468206d757374206265", - "20646976697369626c65L8;FFe82b00f9e8e35e39e16f00f9e1030e91e82b02a9e8e343f9f8c701f978d34b78e82703a9e8eb40b9f4cb01f974934bb8e89f03b9e87340f9fcc301f9f79b03b9BL8;FF810000b4000440f922008052f44a0114c0035fd6fd7bbea9f44f01a9fd030091140040f9f30300aa8", - "80241d29f0200f108459f9aa80600b41f0500f100020054L8;FF29194b8b2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb29030054280108ab83000054BBBBL4;FF41fb0191080102ab2935899ae82715a9fdea0194e0430291810", - "2158be20319aaf93f0439f6ea0194e83f4439f6031c2af503082a08108052020115cb140302ebL4;FB804c420000000000000000000000000008000000000000000800000000000000804c420000000000000000000000000008000000000000000800000000000000L8;FF780a40f9680240f9080118cbd", - "f0208ebe9f6ff54e00313aae10318aae20316aa23008052240080529e010094780a40f9afffff17e00313aa2200805223008052BL8;FFe80342391f0500712c0b0054c80b0035e90f41b262000014080700d1090080921f0d00b1696e00a9a8000054e00319aae10318aa22008052e96a0194c80600d1L8;", - "FF0800f0f217000014e00313aaf7070094e80300aae8070036e00301aaf44f45a9f52340f9fd7b43a9ff830191c0035fd68000805206000014e00313aaeb070094BBBL4;FFfd7b59a9ffc30791c0035fd6600300f000400b91630300d063401e91640300f084e00b91a24700d1c1048052fcaa0194ff0302", - "d1fd7b04a9f72b00f9f65706a9L4;FF1f0067f2ce014bb2ad018e9a8c010f6a0e9465d3ab118b9a8d01100a6f0148b21f010d6ae8118b9a9f010e6a0b014fb26d11889a1f005af2ad014eb26b018d9aL8;FFa822189be92740f9aa060091ff4200f10001803d090900f9ea0b00f940050054fb5a189b7a0b", - "40f955fb7fd3ba0300b4e7aa0094e00315aa21008052e5aa0094BL8;FF21f18f3ce9e70a9108e10c9120f18f3c2083c63ce9270b9122f18f3ce9670b9120f18f3cc082c73ce9a344f9fbbf01f9f5c301f9f7c701f90001803de9d301f9L8;FF00001891ff0316b9e82f00b9282a0094e80356b9e00740918", - "100805200001891ff0316b9e82b00b9212a0094e80356b9e00740918100805200001891ff0316b9BBBBBBL4;FF8a6928380805009120008052290040f9280800f983ffff17e00301aaf30301aae10309aa220080522300805224008052f4030aaafe0500946ca240a9ea0314aaL4;FFe30316aa7c0a0094e", - "1074091e20b40916062049121401d9142c00e9126eeff97e16b42f9810000b4e00316aa22008052eb120094a04700d11ac5ff97e0ab01b9L8;FFe843009142020094e8834039e007c03d1ffd0371e003803d40020054e91342b8ea2740b9e1430091e003c03de8830039e00313aaa91b00b9aab301b8a81b", - "40b9BBL4;FFe083c53ce83740f9e30340f9e007803de81300f9e80b40f9bac301d11f0500b1a3f3ffb5e0060054e81340f9e92300912a0300b04a710391200300d0001c2f91L4;ZDL8;FF810000b4a00640f922008052f4920094a10e40f921fdffb4a01240f922008052ef920094e5ffff177f1600f97f1", - "e00f97f4200b9f44f42a9f50b40f9fd7bc3a8BBBL4;FFe8c80094f50300aaa08302d18ebcff97f45740f9a10300f021c42b91a30300f063242c91a08302d10203805224028052b50316f81dc80094b50356f8f95340f9L4;FB1b75f6bfad4e4f42c2bb914c70f92c0fd697837aab5d0b7062e2d4ad0000c6", - "07ee11b0212ac77878408a0eb7e00103a04962db261c916bcb6e7e1ca83fd17f0bL8;FFe20300aaf5f700f9f5030aaae09bc33de92b00f9e90f40f9e193c33deb2b5fa9ec6300f9ec030daae91700f9e98f40f9e6030caaed6b40f9e13b00f9e10308aaBL8;FF0881099100810291cc0f0094f87f49f9780", - "300b4e1d342f9e8cb42f9f97b49f91f0101eb403d0054e8cf42f9490380522a040091e00318aa09692138e1431691L8;FFe8fb02f9000100f000f01991e80303f9080100f008813e91e1833291e3c3179142008052f35306f9f45b06f9e9ff02f9e90703f9e80b03f9aee7ff97e1a345f9BBBBL4;FF2c0e0", - "054e00b40f9f71740f9c80e0035e90f41b27a000014a083de3c6082823c08008092f71740f9687200a9b60000b4e00317aae10316aa22008052e8f20194L4;FB330000000000000038000000050000009a96480000000000330000000000000080000000050000009a964800000000003300000000000000", - "8800000005000000L8;FF9f7e01a9987e02a9e10314aae20313aa4af5ff97000100b454000014400800b5e00313aaaaf2ff97e80301aa80000036a80800b5e1031faadcffff17e1031faaBL8;FFa8ab3ca92050009420008052e10314aa0b730194fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9fd030", - "091ff4307d100e4006ff30300aa5f0401f116030090L8;FFf5c349f9f3bf49f9950e00b47622009104000014b50600f1d6620091e00d0054c1825ff881ffffb4c00240f922008052eb720094f8ffff1760020291b10b0094BBBL4;FF1d000014680b0091b40313f805000014e80b41b2a00313f802000014", - "680f0091a06303d1a88312f8dea80094f40300aaa1035bf8b5db7ca93f0400f18b000054L4;ZBL8;FF290d098b29f57ed3ab0209ebeb0700f9411800545f0100710bfa80526a018a1a4a01142b421b00545f01086bc20b005448018052840000145f01007109fa8052BL8;FF48000037f62b06f9202a00b5", - "a02302d10eecff97e80301aae0010036882a00b5e1031faacaffff17e02500b5a02302d106ecff97e80301aa40010036482600b5L8;FFe8272a39c80080d20800f0f229000014f60300aaa00302d121f2ff97e00316aae04305f9e0032a91e100009021843d9102028052e30000b06390049174000014BBB", - "BBL4;FF290040f9080140f9291502cb000540a9228100d15dffff1708138052090040f92a0040f948fc089b290140f9200540a94801088b026102d19bfeff17fd7bbea9L4;FFff8b01f9ff9301f9ff9f01f9ff9b01f9ffa701f9ffb301f9ffbb01f9ffc701f9ffcf01f9ffdb01f9ffe301f9ffef01f9fff7", - "01f9eaff01f9ff0302f9ff0b02f9L8;FFc10000b4603640f922008052f30b40f9fd7bc2a8f2020114f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4600640f9BL8;FFe8a700a9020300f042600491ea0f00f9e34300910f830194fd7b43a9ff030191c0035fd60", - "820009109240091220300b042e02c91e82700a9e8030091090000b0L8;FF216c1991640100d084600a91e0030091a3630091a2008052a80f00f93d830094410100f021dc1491640100d084a00391a363009182008052b30f00f935830094BBBL4;FFe0e31591e8bf02f9eac302f91ea00094fd7bbea9f44f", - "01a9fd030091f30301aaf40300aab8020094888e41f81f0500b160000054e00314aa3facff97e00314aaL4;FB65637465646c7900c4684900000000004b000000000000007f0b00000e000000e4674900000000006a000000000000005b00000026000000e467490000000000L8;FFb80000b4e08b42f9e1", - "0318aa22008052f3c20094e19342f9810000b4e09742f922008052eec20094e19f42f9810000b4e0a342f922008052e9c20094e1ab42f9BL8;FFe10313aaa2fcff97780a40f9680240f9080118cbdf0208eb08070054680640f9e10317aae20316aa0001188bf44201940803168b680a00f9540300b4610a", - "40f9L8;FFf80310912a15003308111d12e8430639e8031091eabf0639200740ade00600ad8219ff97e00640ada00302d1808702ad17430094e8430691a08303d1c1e20091BBBBL4;FF41fdff54e04305918100805219e30194e0e90035e85341b9e8d300b957ffdfc8d70200b4ff0600b100030054f84305", - "9199008052e00318aae10319aae2031f2aL4;FB470100000a0000007375636365737366756c6c79206465637279707465643b206d757374206861766520612072656d6f7465206964656e74697479206b657900L8;FF88e279d3e00313aa02018052011114cbf3e20094e12740f9810000b4e02b40f92200", - "8052eee200945f0f00b180000054e803009100010291a7ddff97ff074091BL8;FF080040b9a01300d1a8c31fb80d630194fd7b41a9ff830091c0035fd6ff8300d1fd7b01a9fd430091080040b9a01300d1a8c31fb839630194fd7b41a9ff830091L8;FF0a0140f9410180390101f8b7e0031faa4a0500912", - "90500d10a2500a9fd7b43a9ff030191c0035fd63f2900f1880000544b01098b6bf1df388b0cf8374b05c039BBBL4;FF6104005426190094f96344a93f0700b1601a0054e08745a9e083c73cf6df46a9e183c83cfaef49a9e00701ad610000b422008052eaa20194b90000b4e00318aaL4;FF43cf74b36312", - "00f921040051830c40b93f00146b21b0821a630400113f000071830c00b921a09f1ad6021091e6ea009143008052b51600126420c11a84040051L8;FFe00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091810100f021cc1491a40100d084c01d91e323009182008052e80700f92ba3009", - "4fd7b41a9BL8;FF8102009021003e9112230114ff0301d1fd7b02a9f44f03a9fd830091480001aba2020054010840a9f30300aae023009129f87fd31f0109eb0881899a09018052BL4;FFe00314aa0201805201ed7cd3f4220094745643a9350200b49682009104000014b50600f1d6c2009180010054c10", - "25ef8810000b4c0825ef822008052e8220094L3;ZBBBBBBBBBL4;FFfc6f06a9fa6707a9f85f08a9f65709a9f44f0aa9fd430191170c40f9e9830091e22702a9e80201ab02100054160440f9c9060091df2200f129fd43d32af17dd3L4;FFeba300395a8108aae91300f9580100b50d000014e017c03d1aff", - "48d3f703182ae00b803d20000014f7031f2a39008092b80000b4e00315aae10318aa22008052L8;FFfffedfc8c10640f90107f8b7c00240f922008052f21c0194e00316aa0103805202018052ee1c019468fe4ad309088052f80313aa0811c0da280108cbe9008052BBL4;FFb5164092e20000b4e83340f9", - "e0020191e10314aa0801028be83300f9239d0194e00300918102188be20315aaf5ff0039f39c0194e00743adf4430291e223c03dL4;FFe10302aae20303aae30304aae40305aae50306aa010000d4c0035fd6f7ffff1740d01bd500008052c0035fd6c0035fd6fd7bbfa9fd030091fdffff97017c4093L8;", - "FF769d0014281040b9000040f96800c8376800d037279d0014419d0014419d0014080040f9090140392a0900d13f09007149819f9a290100b43f0500f1e1020054BBBL4;FF390300eb632a00541803008b060000141f0400b1e129005414dd01941f1000316129005439feffb505000014e0430591810080", - "520fdd0194a0280035e85341b9L4;FB000000000000000010000000000000000800000000000000b8524400000000000000000000000000000000000000000001000000000000005049440000000000L8;FF09204aa9ea2718a909e007912001c03d097040f9e88b00f908784ba9e92f14a90ba44ea9e0c7", - "833de8b700f908284ca9e99f00f907a44fa9e8eb00f9e8979f1aBL8;FFe207843dfbeb0df908590154793600b4f7e74df9e10315aae20319aae002188bf75c0194ae010014e04fc23de8a344f909008092690200f96082803c680e00f9L8;FF09f8ff54e00313aae10317aae20315aadc000094770a40f9b", - "affff17e00313aa22008052d7000094610a40f9c3ffff17e00313aae10316aae20315aad1000094BBBBL4;FF0c00669eccf4ffb50b0180524a010b8b6b2100914a01098a00696afc00a8200e0c00669eccf3ffb5f9ffff17000140fd00a8200e0a00669e4a01c0da4a11c0daL4;ZFL8;FFe00313aab2fcff", - "97e80301aac0060036a80f00b5e1031faae6ffff173f0c0071200300543f10007121010054800900b5e00313aaa6fcff97e80301aaa0050036BL8;FFfd7b42a9ffc30091c0035fd6092000912103009021203491040300d084601291a32300d1e00308aaa2038052a9831ff82d7d0194fd7b42a9ffc30091", - "c0035fd6L8;FF29ecff97e1630091427dff97807640f9800100b4e11740f9e80f40f91f0101eb60440054e81340f9090180522a040091ea1700f909692138e1630091357dff97BBBL4;FF2002805221008052f2bc0194002a00b4280f8052890300d029d53d914a0080d22001c03d08400039280380520a0", - "0f0f229028052480108aa690201a90000803dL4;FBb904000017000000a7864900000000004e000000000000005707000005000000a7864900000000004e0000000000000058070000050000005b87490000000000L8;FFe10319ad02804dade0030091e2031aadfbbc009468420891e00300915a300094e", - "0430691e103009102328052f4bc0094e1430691e00313aa02428052f0bc0094BL8;FF290500910a2440f9aa0600b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4b0500910a3040f96901098b0a0100b44b0140b26b11c0da6b1540d2L8;FF250000141f1d007181070054606641f9616a41", - "f9290c40f9e8430f91e1031baa20013fd6fceb41f99f0f00b1a10c005448008092880200f9e8008052c20c0014BBBBBL4;FF080117cbbf0208eb29d3ff54e00313aae10317aae20315aa230080522400805203000094770a40f991feff17ff0301d1fd7b02a9f44f03a9fd830091480001abL4;FFf85f43a", - "9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0efc83de1f3c83de0074091e2f7c83d00401d91e0d7853de1db853de2df853dc6eaff97e043139139ebff97L8;FFe1230091e00313aa82048052e90700f9e92f4229a8831fb8ea430039e91301b8e91b40b9eb6301b8ebc341f8ea570039ea6b0039e9b301b8ea", - "7f0039eb1300f9BL8;FFff8300d1fd7b01a9fd430091090040f9e80301aa2a0140f95f0500b1e903899ae90300f9c0010054e9030091210300d0218029914403009084a02191e3230091L8;FF6b25019129194b8b2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d", - "329010a8b290500913f010aeb29030054280108abBBBL4;FFfc6f4ca9fd7b4ba9ff430491f4cc011420008052f58303a9ff2700f93ac2ffb5e82740f9e083c33ce81b00f9280f00f928008092e00b803d2083803c280300f9L4;FB6520656e6469616e6e657373737071723a3a696e6372656d656e74616c", - "5f6d6c6b656d3736387370717220756e61626c6520746f2066697820656e6361707375L8;FFeb0318aa3a0100b4e00319aae1031aaa22008052f8030baaf9030caaf0cc0094ec0319aaeb0318aaf60000b4e0030baae10316aa22008052f6030caae8cc0094BL8;FF48a2ff97facb40f9e86346395f0b00b", - "161100054f7430f9108150036c08641a9a90302d1e8430f91a20302d12401019103048052050280524b4d0194e8eb41f9L8;FFf85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd620008052e10317aafc4c009420008052e10319aaf94c009420008052e10318aaf64c009420008052BBBBL4;FF0", - "8050091d50600b4a90240b22911c0da291540d2290d098b29250191a91a498b29050091380108abe2050054b800f8b6f9031faae00319aae10318aaf5ec0194L4;FB0800000000000000c485420000000000496e76616c69645374617465496e76616c696450726f746f627566456e636f64696e67000000", - "00000000000000000000L8;FF680640f92a04009109028052e003142a09692138e10313aa6a0a00f9f44f42a9f50b40f9fd7bc3a83aedff17e8031faa94fcff35e003088be10313aa35edff97BL8;FFe9031faae8031faa4be179d32ce179d36a110acb891109cbecb68dd26cdbb6f22b010acbac6ddbf26", - "bfd44d3ccb6edf274210c9b0c0e80522b0440f9082d0c9bL8;FFe0100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aad7100094fad342f9fc0740919c8301913ffeff17e043169122008052BBBL4;FFe90340b908048052964e01b9885603a93f050071882200f94101", - "0054e803009100017eb226850094f50301aa6107f8b6f7031faae00317aae10315aaf5ac0194L4;FFe10316aaeeffff17fd7bbda9f65701a9f44f02a9fd030091140840f9f30300aa3f0002716200005435008052080000143f002071620000545500805204000014L8;FFff8b01f9ff8f01f9ffa301f9ff", - "a701f9ff571ea9ff0701f9f50301f9ff0b01f9f50f01f9ff1f01f9f51b01f9ff2301f9f52701f9ff3701f9f53301f9ff3b01f9BL8;FF601300548043c03df6e32291f76301912183c93ceaa209912283cb3cc082893c2083ca3ce9db42f94221803d2283c83cebe20891410103ad2083c53c2183c63cL8;F", - "Ffc134bf94a014139f8174bf9e85b07b9e8631d91f51b4bf9093100b8e91f4bf9e80240f9f4e342f9ea431d39e9a703f9680000b4e00314aa00013fd6e10640f9BBBBBBL4;FFf44f44a9fd7b43a9ff430191c0035fd6e80b40f96a0640f9490108eb430200546a0240f9e00740f94801088b682600a98002", - "00b9e0031faaf44f44a9fd7b43a9L4;FF190140b9c40180527b0c0094fb6f42f9e17342f9e807409108411d91e0031baa70150094f7ab4bf9f96701b9ff0600b180270054e9af4bf9e2b34bf92c008092L8;FF350040f9f60301aae8030091e10314aae00315aa01150194e80340f91f0500f10101005488", - "008052680200b9f44f44a9f65743a9fd7b42a9ff430191c0035fd6BBL4;FF89264039ea674039e86300394801094a892a4039ea6b4039e86700394801094a892e4039ea6f4039e86b00394801094a89324039ea734039e86f00394801094aL4;ZBL8;FF0811c0da081540d2080d088b0825019109fd46d30", - "800098b080500911f0109eb281000548a000014f30300aace120094e80300aae00313aa090140b22911c0daBBBL4;FF882700a908fc60d3a82a00b5080840921f1900f1822c0054017c0353613100343f040071200100543f080071c1faff54c1420191a2a302d1e003082ab3beff97L4;FBd10000001f00", - "0000381f4900000000005800000000000000cb00000014000000381f4900000000005800000000000000cb00000009000000617373657274696fL8;FF4a2e0094e8a743f9eab343f9e10314aae9ab43f9ebcb43f9f7a343f9e86b00f9e8af43f9f40f44f9f67b44f9f57f44f9e8e700f9e8b743f9e82b17a", - "9e8bb43f9BL8;FF0e170094080040b20811c0da081540d2080d088b0825019108fd46d30900088b390500913f0308eb48190054da000014f6074091d6820991c022029132180094L8;FFe86b04f968008052e1833291e97f06f909078052e86b06f92801009008ed0e91e96706f9290080d2ea6f06f9c93b", - "c0f2e87b06f9c8048052ea5706f92a010090BBBBL4;FF0ef50194ff4301d1fd7b03a9f32300f9fdc30091080040f9130140f91f0100f9f30100b4281040391f050071e0010054690240f9e803009120013fd6e00740adL4;FB794b6579506169725374727563747572650000000000000028914800000000", - "004c00000000000000e200000031000000c9944800000000004d00000000000000L8;FFaeffff17ff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091081c00121f09007181010054e00302aaf30302aaf40301aaa5f4ff9720020037BL8;FF686200910103009021102891040300f0842", - "01691e0030091a363009142008052a80f00f93b7501940103009021182891040300f084a01691a363009162008052L8;FF480340b20811c0da081540d2080d088b08250191481b488b0805009114000014280080525f0700b1ffcb02f9e8cf02f9ffd302f980100054e0431691e1031faaBBBL4;FF080500", - "91683300f928b5019408e37a92e0030191e20318aaa102088bf8ff013918088052f6b40194e8ff4139e90740f9f503082a020315cb386540a93c0302ebL4;ZDL8;FF22008052f6b40094ab835ff8f91b40f9f40740f95b0b00b4e0031caae1031baa22008052eeb40094ab835ff8f3031f2afb031faa5300", - "0014e90300f9180100b4BL8;FFe9f31691e07fc13de9a305f9e9ffffd029d12d91e80305f90800009008a10b91e8a705f9e8c31691ea032d91e9af05f90900009029710c91e8ab05f9e8c32791L8;FF7b6300915a0700917f0308eb01efff54fb020014e8bb44f9090d8052800fc03dc822099b000d803d8", - "013c03d0011803d8017c03d0015803de97345f9093100f9BBBBBL4;FF880080d20800f0f2080140b2a8031df8a0c300d1e3fa0094e1a341a9f45743a9800200b4490080923f0400f1690200a98b000054e00308aa22008052e8040294L4;FFe8030091e00302aaf30304aaf70303aaf60302aaf403012a34", - "8afe97e8630091c0420091318afe97730100b4e8040094e00313aa21008052e6040094400300b4L8;FFfd7bc3a8f604011400200091f44f42a9f65741a9fd7bc3a81b0200141f0500b180000054f30300aa1a030094e00313aae80300aa090d48f83f0500b1a0000054BL8;FFf70600f173a2019161feff5", - "4c80215ab42010054000114ab82020054f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e80315ab03ffff542003009000c01c91L8;FFe07f40f901f97fd342008052f4840094e88740f91f0500f1ab000054e08b40f901f97fd342008052ed840094e89340f91f0500f1ab000054e09740f901f97fd3BB", - "BL4;FFf52743a9e1030191022c80522001c03d290940f9e00315aa0001803de9cf00f9f7c40194e8274529b4a20539a96201b9a86601b9bc0000b4e00f40f9e1031caaL4;FB000000000000000008000000000000000800000000000000804f470000000000ed624900000000004d00000000000000e8020", - "00005000000ed62490000000000L8;FFb60000b4e04b40f9e10316aa22008052f3c40094e14340f9e10300b4e02740f922008052eec40094fa031faad7fcff17e11f40f9810000b4e0031caa22008052BL8;FF0015803de93740f9093100f929070091e083c03c0001803de083c13c0005803de083c23c00", - "09803d892200f90c000014e003082ae20313aa630c8052f1f5ff97L8;FFd2ffff17280180d2e00700f90800f0f2081500d1deffff17e90b41b2e92300a9dcffff17280180d20800f0f2081100d1d7ffff173f00156b81f7ff54680240f9BBBBL4;FF82080054170e8052a8e279d3c9e279d35304179b1411", - "15cb221116cbf50301aae00315aaf60303aa6102148beee40194c056179be10313aa2f0000140a0e8052L4;FB20c0172073657373696f6e206861732062617365206b65793a20c00e20616e6420636f756e7465723a20c0022e20c000083c6572726f723a20c0013e002f7275L8;FFf85f42a9fd7bc5a8c0", - "035fd6680240f919631932bf0208eb61000054e00313aa41e40094680640f998fe71d319693538d51a0091750a00f998faffb4680240f9BL8;FF48130037a8835df82a0340f9490108eb631e00544a0340f9a0035df84801088b480300f9290300f908fc60d3080800b5080840921f1900f102080054017c", - "0353L8;FF51000094e00313aaecfeff9760420891f30b40f9fd7bc2a87ffeff17610640f9810000b4600a40f922008052ec640094611240f9810000b4601640f922008052BBBL4;FFe00316aaea0f00f909692138e12300910491ff97f80f40f9e80740f9080118cbdf0208ebc8070054e80b40f9e10317a", - "ae20316aa0001188bf1a401940803168bL4;FFe707009473fdffb48afdff97f50300aae10313aae00314aab30240b9e6060094b30200b9e3ffff17a042089196070094eeffff17634000d1ff1040f2a0000054L8;FFc20600542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b29050", - "0913f010aebe9050054280108ab8300005426000014e80308ab82040054BL8;FF690e4039f503002a1f01096be0179f1a0d2501948812403969124039aa02000ad6020a0a1f01096be0179f1a062501948816403969164039f503002a1f01096bL8;FFe1030e91e0071cad1f250094e08752ada80302d1a0", - "8301d1e1030e91e0071cad1a250094e08753ada203d83cb4f35938a2039e3ca0073eadc0f2c03cc0f2863cBBBBBBBL4;FFe003082ae20313aae303142aaaffff9720fbffb427000014e00313aa471a0194e80300aae00301aaa8fd073621000014e80741b2400000145f2800f188000054L4;FFbb0000b4e", - "00319aae1031baa22008052f3180094a1035ef8810000b4e00318aa22008052ee180094e0030191e103172aba100094e12b40f9e92340f9280101cbL8;FFfd7bc2a8f6180114f44f41a9fd7bc2a8c0035fd6600200f000201491f3180194600200f000801491f0180194ff8301d1fd7b01a9f91300f9f85f", - "03a9f65704a9BBL4;FFfd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff830ad1f30308aae8630491f40301aaf50300aafb6304911b070094e81b41b91f050071L4;ZFL8;FF4a01084a6b01084aaaa31538aad355382901084aabb31538abe35538a9c31538a9f355384a01084a6b0", - "1084aaad31538aa0356382901084aabe31538ab135638BBBL4;FF2800805268020039fd7b47a9f34340f9ff430291c0035fd6ffc305d1fd7b11a9fc9300f9fa6713a9f85f14a9f65715a9f44f16a9fd4304915a2040b9f60302aaL4;FB636865742d623538643766353665333634356363642f3036393539", - "62342f7372632f76312f6368756e6b65642f7374617465732e7273001b737071722076312eL8;FFeabb02f9e06f813de86302f9e83740f9e95b02f9e88702f9e87b40f9e89302f9e86740f9e89f02f9e8ef40f9e8a302f9e85740f9e8a702f9e86f40f9e8ab02f9BL8;FFe00319aae10318aa02590194f90", - "b00f9980300b4ee580194e00318aa2100805239008052eb580194c0feffb4f90b40f95f0700b1f8cb02f9e0cf02f9ffd302f9L8;FFe02fc33de9f702f90005803de033c33d0009803d9c6300917b0700919f0314eb0071005400e4006f0823059189ab40a9ffa305f9f6a705f9f6b305f90001803dBBBBL4", - ";FF010280520ef90194000400d0002018910af90194ff4302d1fd7b06a9f65707a9f44f08a9fd83019109604039f30300aaf40308aa490200343f0d007101080054L4;FB20c00e206661696c656420776974682027c023273b2063616e6e6f742067657420726563656976657220636861696e20696e666f", - "2028c00129002e5265636569L8;FF800a06ada1837bad810203ada2837cad820204ada18379ad810201ada2837aad820202ada18378ad810200ad10000014e88340f9e00314aae80700f9a6f3ff97BL8;FF690f00916842003908008092682600a922010014a8060091220400f1f40301aaa88b32a909008", - "092a86303d1bf8319b8bf031ab8bf831ab8bf031bb8a98313f8L8;FFe04316910123009102738052fc7800949800805211020014f6eb44f953000014e8074091f69b45f900230091088109918cb9ff97e1074091e0431691026e8052BBBL4;FFe3140094e8230291e20300aae12f40f900610091e30315aa", - "92fbff97e42748a9e34f40f9e50314aae80317aa7f0009ebc1f8ff54e81300f9e9234ba9e52f00f9L4;ZBL8;FFe10317aa22008052f5b80094e00319aa0110805222008052f1b80094e90b40f93f0500b100f4ff5488f242f8e087c03d8172c33cff2f01f988f200f8e07f803dBL8;FFe20315aaf7f8ff97", - "e103162a680640f9df0202710801148ba3feff54e90f80123f002071ea0f801229140033c20000542a7c0653090500394a051a320a010039L8;FFf5031faa570080522a008092ff6300f94f010014e8bb43b9f6830d916b7e0e91ea4340f9c9b245b8770502f9689a07b9e86340f9f78324916a0102f96a6", - "21e91BBBBBL4;FFe083c33c692a099be0031faa200d803de083c43c2011803de083c53c2015803dea3740f92a3100f96a060091e083c03c0a2d00f92001803de083c13c2005803dL4;FFf52340f9fd7b43a9ff830191c0035fd620008052c1018052fe080094ffc301d1fd7b03a9f85f04a9f65705a9f44f", - "06a9fdc30091350840f9b500f8b6f8031faaL8;FF0811c0da081540d2080d088b0825019108fd46d300050091c0035fd6e0031faac0035fd6080040396902009029811d91e00301aa227968f86902009029411e91BL8;FF21d82391230300b0637c2491a0e300d1a2018052440180520b000014f80300aa0", - "b000014a0831cf8210300b021d82391230300b063382491a0e300d1a2018052L8;FFa98300d100210091a20301d1210080526301009063802191640100b084001191a8031ef8a9031cf821890094a80100b0e103152a08e14039c07a73781f050071BBBL4;FFe80740f91f0500f1e0000054e80b40f97422", - "00a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9fac80194ff0301d1fd7b02a9f44f03a9fd830091010840a9L4;FB00000000000000000800000000000000080000000000000090f545000000000000000000000000000800000000000000080000000000000034f5450000000000L8;FF04000014b5", - "0600f118630091e000005401835ff881ffffb4000340f922008052efc80094f8ffff17f57740f9369400b4c806168be00314aa0201805201f17dd3BL8;FFfd7bc2a8f648011461ce40f9810000b460d240f922008052f148019461da40f9810000b460de40f922008052ec48019461e640f9810000b460ea", - "40f922008052L8;FF4a25019129194a8b29050091280108ab02080054691e40f9090100b4290140b22911c0da291540d2290d098b2925019129fd46d329050091280108aba2060054BBBBL4;FF0900001408008092680200f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd635008052745600a9740a00", - "f9771a00b9f44f43a9f70b40f9f65742a9fd7bc4a8L4;FB000000000000000008000000000000000800000000000000804c420000000000000000000000000008000000000000000800000000000000804c420000000000L8;FFe283c53c680200f9600601ade003c03d692a00f9e90b40f96212803d6082", - "803c690e00f9fd7b47a9f34340f9ff430291c0035fd6420200b4432440b97f040071BL8;FF2911c0da291540d2290d098b2925019129fd46d32905009102000014e9031faa280108ab02060054097040b93f05007141010054097440b9290140b22911c0daL8;FFa10000b4e07b40f922008052f4680094e", - "9030b91ea0740f9e81740f92015c03df87f00f9eaa30ea9e89341f98082823ce8bf00f972ffff17480100b008612991BBBL4;FFf66740f9fa2700f9df0600b140030054a8035bf8fc6b4da91f0119eb40210054a8835bf82a070091a14301d1e0031aaa4906805209693938aa031cf8f994ff97L4;FF1f05", - "00f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6200020d4fd7bbea9f44f01a9fd030091f40300aaa300f8b6f3031faa28008052L8;FFf50300aaf60301aaf70302aaf80303aaf90308aafa0304aafb0305aaeca80094e00313aa21008052340080524ba9009400feffb4e60300a", - "ae5031baae4031aaaBL8;FFe0031f2afc4f58a9fd7b57a9ff430691c0035fd620008052fc4f58a9fd7b57a9ff430691c0035fd6ff8300d1fd7b01a9fd430091e10b00a9e103009122008052L8;FFf70302911b0109aaa1035df8a10000b4b9835df8e00319aa22008052f0280094f99f44f9fca344f9f8a7", - "44f9f5ab44f9e11b42f9ffe71639810000b4e01742f9BBBBBBL4;FF49150054610340f9370080399700f8b728040091490400d1110000145f2800f1880000542800028b08f1df388808f837a0c300d1837a0094a8035db848240037L4;FFe007409161220391e3030e9100401d91e203162a92050094e8ab", - "4bf91f0900b1416c0054e007409161620491e2030e9100401d913c050094e8ab4bf91f0900b1L8;FF0a3800390940003908000039ff830091c0035fd65f9000f181050054282040391fb50071a1050054283440391fb5007141050054284840391fb50071e1040054BBL4;FF28144038e8830039e8830091", - "000140b2fb900194a8064039a10a0091e2c38052e8033239e8033291000140b2f4900194a88301d1e0830091e10332911e910194L4;ZDL8;FF38910014fd7bbea9f44f01a9fd030091140040f9f30300aa9f0600b1e0020054611a40f93f0400b140010054810000b4601e40f922008052e9900094612640", - "f9BBBL4;FF730209ebc0190054080e80523869089be00318aa8cbaff97730600f118c3019181ffff54c6000014faef48a913008092f54340f9f94f40f9b74302d1e8af40b9L4;FB06a28a4ae7347b43675f6f7d68af531abb819168e296f6c95b3cfeb3846bd1b6d4bb0e6bdac6a28c642111ce00003f332", - "563ff46b0582749c6e6f794d196024bL8;FFe9c747f9a0039d3ce0dbc33dea6b00f9a9031ef80aa541a9e027833da082c63ceae700f9e9bf00f90aa542a9e0f7803deabb00f9e9ff00f90aa543a9e9db00f9BL8;FFc9000054e0431691e1031aaae20318aaf4100094fad342f9fc0740919c8301910ffeff", - "17f60300aae043169122008052ec100094e1d342f9e00316aa32feff17L8;FF29610d912283c53cea670a91200500ad2083c63c414fc03de8bf01f90800f0d2220101ada90359f841f18f3ce9d701f9fbc301f9f5c701f9f7cb01f9e8bb01f9BBBBL4;FFaa635df8288140b829c140786a6201f8a88319b8", - "a80319b8681200b9a8e35df8a9431978692a007968e201f8edffff17ff0302d1fd7b02a9fc6f03a9fa6704a9L4;FB20636861696e206b657954696d652073686f756c64206d6f766520666f7277617264000000000000e9974800000000003800000000000000410000000e000000L8;FF160100eb620200", - "54e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e0030091dce6ff97f44f47a9f65746a9f85f45a9BL8;FFa9d318384901084a220080526801084aa9e31838a8f31838e18305adf46b00f922710194e08745ada8035ef87f1e0139e82300f9e86b40f9e083843c", - "e183853cL8;FF1f0008eb89190054e1431691880e0094e1d342f9e8cb42f91f0101ebc06d0054e8cf42f92a040091c02202914901805209692138ead302f93d250094e1431691BBBL4;FFbb8312f8ea2302a9e499ff979f0700f181070054a06303d1bb8312f8df99ff97fc2b40f93f0b00b1bb8312f8c10", - "7005408008092f6031f2a686e00a933008052L4;ZBL8;FFe00315aacef9ff97a80e40f9a90240f9e00319aad3ffff17a00100f000603b91a20100f042603c91c10780521db100942000805201048052f6b0009420008052BL8;FFe9c31291e0833291022b8052e86702f9e8c31791018100912081803cf83", - "0019460030291e2833291e10313aa196eff973c008092fa4340f9fc5b02f97e010014L8;FFe8431a91a04700d1e9a704f9e900009029613b91e8a304f928008052e1032a91e95f05f9e94705f9e9000090294d2391ea9704f9ea832491e85b05f9e8000090BBBBBL4;FF22696bfc438c212e6c00669e8cc1", - "01f241fdff54f4ffff17f6031faa0800809223000014e0430091f50b00f9dbe9ff9716835df81a835fb8160300b417035df8L4;FF7afdff17e87a40f9c80000b40805088be00315aa0201805201ed7cd3f00000945a008052d6000037e00f40f9e10340f9710100941f0000715a139f1ae1d340a9L8;FF36", - "008052f3000194a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad30a088052f4031faaf5ff03a92911c0da490109cbea0080523f1d00f1BL8;FF73e21191e0030091a1630091e20313aab40f00f994a2019135810194b5a201f121ffff54e003009132810194f44f43a9f51340f9fd7b", - "41a9ff030191c0035fd6L8;FF080500911f0109eb296d0054170117abc2db0054b700f8b6f8031faae00318aae10317aafb800094170800b4e8800094e00317aa2100805238008052e5800094BBBL4;FFa203009042203e91e0031aaae10314aa15c10194ff0302d1fd7b04a9f72b00f9f65706a9f44f07a", - "9fd030191098c41f8f30308aa3f0500b100020054e8630091L4;FB65646765645f7072655f6b65795f6d65737361676520666f723a20c0102077697468207072654b657949643a20c0001f70726f63657373696e67205072654b65L8;FFe113813d96150094e20fc13de313c13df60741b2e41bc13de00bc", - "13de107c13de20f06ade317c13de89f40f9f58300f9f56b40f9e10305ade31307ad6383c63cBL8;FF22008052f7000094610a40f9a5ffff17f50300aae00313aa22008052f1000094610a40f9e00315aaadffff17e00313aa22008052eb000094610a40f9bcffff17L8;FFd60600f1b5a2019181ffff5468", - "2640f9c80000b4090d8052e00314aa02018052017d099bee400094617e40f93f0400f18b000054608240f922008052e8400094BBBBL4;FF1f0000f1cd000054390300eb23aa00541803008bf9feffb50f0000141f0400b181a9005411e101941f10003101a90054f9ffff170ee10194f70300aa1f0400b1L", - "4;FB48fb4800000000005afb48000000000078f24800000000006dfb4800000000000700000000000000060000000000000000000000000000000000000000000000L8;FF00002291fce00094fd7bbca9f85f01a9f65702a9f44f03a9fd030091330840f9f70301aaf40300aa130300b4f60640f9e7e0009", - "4e00313aa21008052e5e00094BL8;FF286968f8e10308aa33610114ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aae10200f021dc0291e8230091e00309aa620380523561019468420191L8;FFa2ffff17898244f83f0500b1810000549fde04a99f2e00f99f6200b91f0900f141180054e003", - "13aaf0fdff97e0080036811400b5e0031faa9effff17680240f9BBBL4;FFb6831ff808010aaa0ad49052284108aa2a00a072097dd59b28a10a9be90f40f9e9a301a9a8df3ea90aa10194c00b0037883e403989424039410300f021203e91L4;FFc20a40f9830014cb861000d1631000d142400091611e001", - "265fc44d38008159b0600068b04d05f388400003401e05f7821040011211c001204c05f3884000034L8;FFf44f43a9fd7b42a9ff030191c0035fd6ff0301d1fd7b02a9f44f03a9fd830091140040f9e00301aa810100f021f81b91e82300912202805235a10094b30100d0BL8;FFc2150054bf0202ebe301", - "00545f0101eba3010054610240f9200015cb370015cbf720019489124092c80215ab770200f9690e00f963020054800200b000401591BL4;FF680640f9e10315aae20314aa0001178bfb200094e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00013fd6e0031faaf44f4da9f6574c", - "a9L3;ZB" + "BBBBBBBBBL8;FB000000000000000000004000000000000000400000000000069600000000000006960000000000000000010000000000010000000500000000a0000000000000L8;FFa2ffff1723feff9063802a9119a1009423feff9063a02b9160910091e20315aa14a1009420feff9000a42f9122fef", + "f904200309181028052fda0009402feffb0BL8;FF611a40f9810000b4601e40f92200805269250194e00313aa080c49f81f0500b14000005404010094745a45a9f60000b4f50314aae00315aaff000094d60600f1L8;FF811140516b00f8376b008052430000143f004871030b00544b0dc0396c1d00122c", + "540c0b810148516b00f8378b0080523a0000142b7c1c534b0a00344d11c039BBL8;FF932201b9f44f48a9fb2340f9f65747a9f85f46a9fa6745a9fd7b43a9ff430291c0035fd6e8630091e0230091e1031faae2031f2a647a0194faef41a938008052L8;FFe2000054aa000014e20313aa430c80528ff5ff", + "97e10300aaa10a00b5680240f9080540f91f0119ebe9030054e00313aa99fdff97c009003728fc60d3a80600b5BL8;FF83feffd063900291e0030091a2018052840080525debff97e10340f9cbffff17e80f41b2c5ffff17c80080d20800f0f208090091c1ffff17ff0302d1fd7b03a9L8;FD30074700000", + "000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000ffffffffffffffff00000000BBBL8;FB784465636f64696e674572726f724368756e6b446174614465636f64696e674572726f720000000042024000000000006a00000000000000dc0", + "000002e000000L8;FFe02342a9990a40f9490180520968283808050091e81700f939f8ffb5e8031faa982680b9f8f8ff35e9031faa972a80b9b7f9ff35ea031faa9a1a40b95f070071BL8;FFff830291000440ad1f0100390011803c0111813cc0035fd61f0500f92900805209010039c0035fd629008052", + "0a2500390921003909010039c0035fd649008052L8;FF936a29f8880200f9f44f41a9fd7bc2a8c0035fd620008052800600f909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6ff0301d1fd7b02a9f44f03a9BBL8;FFe88340b9e93348b8611a00f9ea1f40b9e12b40f9797200a9683a00b9e81b", + "40f969b203b8e90f40b97b2201a9e87b40b969020139e9fb4079681204b8e8c34139L8;FFfd7bc3a86c450014f44f42a9f65741a9fd7bc3a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f090071e1010054e00302aaL16;FFe82b17a9e80342f9ea0b42f9f73342f9f", + "86742f9fa6b42f9e9231fa9e80f42f9e90742f9fb6f42f9f97342f9fcbb42f9e8cf00f9e81742f9f4c742f9e0f3803dBBBBL8;FBef104000000000004e00000000000000bc02000015000000ef104000000000004e000000000000001a040000090000007c95420000000000f895420000000000L8;FFa90", + "35538480d8052aa135538ab235538e00740ad2901084a4a01084ae0c30291a9031538a93355386b01084aaa131538aa435538a1c302d1ab2315382901084aBL8;FF6b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b29050", + "09129010aabc2060054L8;FFd3c2ff97e0b700b9a04700d1d0c2ff97e0b300b9a04700d1cdc2ff97e0af00b9a04700d1cac2ff97e0ab00b9a04700d1c7c2ff97e0a700b9a04700d1c4c2ff97BBL8;FF39008052bbf8ffb537008052df0600b1a1f9ff54e0031faa030000146655019420008052e81740f91", + "b5f00a91b6701a9000540ad136b02a9e92344291c1b00f9L8;FF4083cf3ca88355f8bb0353f8b5df73a920b7803de83304f9e8f304f94003803dffa71139e89740f91f0500b160000054e02b40f9f5eaff97f4db51a9960100b4L16;FFe1e33b91e2c30d91f77f07f94083803cf8431e91e88b07f9d80100", + "94f7cb43f96083c03ce8d743f9ff0600b1e0df813de8c303f920160054e8430f9101830091BBBL8;FFbf0208eba9efff54e00313aae10317aae20315aa2300805224008052d6000094770a40f9680240f9080117cbbf0208eb49eeff54e00313aae10317aae20315aaL8;FF0825019109fd46d30800098b0", + "80500911f0109eb4814005472000014fa031faaf9ab49f9f8074091188309913f0700b1a018005400c303915b290094080040b2BL8;FFf44f01a9fd030091140040f9f30300aa9f0600b1e0020054611a40f93f0400b140010054810000b4601e40f92200805261f50094612640f9810000b4602a40f9L8;", + "FF420040f95f0005ebc1e5ff5402404079452c46d3bfbc0071a8020054e2fcffb042e00b9142d86578257c021b9f00056b8be4ff544200050b9f00026b2ae4ff54BBL8;FF4a05009102000014ea031faaeb7b52b97f05007181010054eb7f52b9ec8352b98b0700346b0140b26b11c0da6b1540d26b0d0b8", + "b6b2501916bfd46d36b0d0091L8;FF210080526b350094c01d00b4880c805269fdff902941119108400039c80080d22001c03d0800f0f2e9734e39e03b01f91c490091280280520000803dfc3301f9L16;FF0a788052e22fc23de00717ade02bc23de86b00f9e8ff5e3969d14578ea3b00f90a908052e10f", + "c23d2841082aea6300f9ea435f39e00b18ade213c23d699145b8BBBBBL8;FB69646b6579000000726563767265616473656e6473656564707265766e6578747370717261757468696e64657850656e64696e675072654b65797072655f6b65L8;FFe8031faae9031aaa2afd41d34b01088b29010acb6cf57", + "ed3cc6a6c789f213b6b08818b9a3f0500f108ffff54c90a088b2a0140795f213b6b6100005434050079BL8;FF780a40f9680240f9080118cbdf0208eba9f7ff54e00313aae10318aae20316aa72010094780a40f9b7ffff17e00313aa220080526d010094610a40f9bfffff17L8;FFf80300aaf50741b2d6", + "018052090000f9086000f8a1035ef8810000b4a0835ef822008052641d0094bb0000b4e00319aae1031baa220080525f1d00943a018052BBL8;FF396840a961838e3c7f8000f10a048052687f00f9000442ad630b47ade87f0091696b00f909088052f80303aa608705ad6437c03df40300aa638b03ad030", + "841adL8;FFe02fc13de133c13de0031791e237c13de3032d91e483329161fdfff021a0389102018052e02b833de12f833de233833d0bfdff97f3f742f9e8ef42f97f0208ebL16;FF770a40f9680240f9080117cbbf0208ebe8070054680640f9e10316aae20315aa0001178b6bdd0094e802158b680a00f9", + "951640f9550300b4610a40f9680240f9BBBL8;FF080200341f05007121030054000180528d000014280180d20800f0f2081d00d18e0000141f150071e00100541f11007101030054280180d20800f0f287000014L8;FFe8e30a79e057813de15b813dbc010014f6c744f9e043169101230091027380526c7", + "d0094f8031f2ab701001403e4006f0083c03c0183c13c0283c23cf6d344f9BL8;FFe30313aaf44f43a9f65742a9f85f41a9fd7bc4a8effdff1734f87f92560014cbd50213ab82050054a9fe4ad30a0880522911c0da490109cbea0080523f1d00f1L8;FFfd030091000c40f901000094200000d000a040f9", + "600100b4fd7bc1a8a0dcffd00000009101000014200000d000a040f9c00000b4a0dcffd00000009101000014BBL8;FFa2837bada2033fad0639019400e4006fbff31838b0c302d1a8277229aa2f7329ac377429a0033ead0809c05a2909c05aa0033fadae3f7529a003dc3ca103dd3cL8;FFe8430f9153ee", + "fe97f5eb41f9f7ef41f9fcf341f9f8f741f9f6fb41f9faff41f9bf0600b1fb0342f900190054e8430f91e0032a910224805201e10091653d0094L16;FFe9a301f9e94744f9e20fc23de85300f9e85f44f9e4f7c13de00717ade00bc23de1efc13de8270ea9e96744f9e87b40f9e00b18ade2f3c13dee6344", + "f9e96300f9BBBBL8;FB80ad40d8754378a67d5115cbd89342e67621ca0d44d47397a28c5497f732d380428b0000d140cb9f0bb09dc267489853730a01dd45e4c4149d8afc081a8924ddL8;FF6c8d0094005400b4e8fdffd008d13891a9809352080140f909100079130303a9080000f9132300f9668d0094", + "40018052410080525f8d0094605200b4e8fdffd0BL8;FF6d0d0194e0c31d91e1c3229102288052700d0194e0c32791e1c31d91022880526c0d019448058052e9feffb029551e91e8c303f9c80080d20800f0f2fb9b05f9L8;FFfd7b02a9f91b00f9f85f04a9f65705a9f44f06a9fd830091f60302aaa200f", + "8b6f9031faae00319aae10316aafa080094f40304aaf50303aaf30300aa760000b5BBL8;FF81fbff54f4031f2ae82f40f9490700d13f0108eba1fbff54e0630191ceebff97fc3340f9d9ffff17e083c53ce83740f9e30340f9e007803de81300f9e80b40f9L8;FF0811c0da081540d2080d088b082501910", + "9fd46d30800098b080500911f0109eb89040054140114ab230100541e000014f4031faae00313aa080c48f81f0500b1L16;FFe81f40f9f57f04f9e84304f9e87b40f9ec8704f9e84b04f9e8d340f9e04b823de85304f9e86740f9e85704f9e8ef40f9e85b04f9e85740f9e85f04f9e86f40f9BBBL8;FF1f0", + "5007121010054a8277da9890000141f090071a10f0054aa835df8e92e00d148dd789278000014a8a35cb8abab7da9a9e35c78ac035df8a8031bb8a8835e78L8;FF5f0b00b141d6ff54f3feff178083c03ce8430f91000d803d888341f8e9035039e80b02f9e8430691a9090034e9031091aafffff04a2108", + "911a0380d280fdffd0BL8;FFe85b40f9e0870bade08742ade85319a9e08709ade08b43ade08b0aade18340ade18307ade08b41ade08b08ad002800b4e87b40f91f0500b160000054e0c30391L8;FF63201d917f0c003918000014bf3b03d5a200f837430180520600b012e50701320a00001463201d917f0", + "c0039faffff170200060be103002a07000014bf3b03d5BBL8;FFe04316912200805278110094e1d342f963feff17e04316912200805273110094e1d342f9abfeff17e0431691220080526e110094e1d342f92dfaff17e0431691L8;FFc10640f9810000b4c20a40f9e00315aa692d0094e8e756396800003", + "6e00314aa7ae7ff97e11b42f9f7030291ffe71639416effb4e01742f9220080526efbff17L16;FFe1030a91883240f9e00313aa023f8052e00716ad800640ade87301f9e00714ad800a41ade00b15ad6aad0094f8000014f5f340f9d71f00b462ad0094e00317aaBBBBBBL8;FB6e616c2f727573742f7072", + "6f746f636f6c2f7372632f73657373696f6e2e7273002f636172676f2d72656769737472792f696e6465782e6372617465732e696fL8;FF2a330c13292f0b13a92b3c29292b0a13a9c31db8680100d008410091002f407808fddf8848010035680100d0080140391f05007101030054e103192ae2031f2aB", + "L8;FF290440f90a050091206928382a0800f9f44f42a9fd7b41a9ffc30091c0035fd6f30300aae00301aaf40301aae10309aa220080526d050094880a40f9e00313aaL8;FFf60702a9e003833ce8230039e82740f9e083c13ce183c23ce283c33ce383c03c882200f928008052808600ad820e803d830280", + "3d68220039f44f4aa9f65749a9BBL8;FF010100b4a17c019be00302aae20315aae30314aa69610194800100b507000014340100b467610194e00314aae10315aa60610194a00000b528008052750600f9L8;FF880a0054680640f9e10316aae20315aa0001178b6f610094e802158b680a00f9951640f955", + "0300b4610a40f9680240f9961240f91f0101eba00a0054680640f9L16;FF63bc0d91e00300f917000014c80080d2e0230039e00300910800f0f2ff270039e80300f9cae7ff97e80300aae80300f981fefff021640d9183fefff063a80d91BBBL8;FB4a00000000000000b6020000090000009cf545000000", + "000018000000000000000800000000000000a40a4600000000009cf54500000000002000000000000000L8;FFe78eff97df0600b180070054e11740f9e80f40f91f0101eb60300054e81340f92a0400918022029149018052ea1700f909692138d9ecff97e1630091d88eff97BL8;FFf30303aac10100b4e", + "00302aa22008052e30313aa69010194000300b50e00001428008052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6d30100b4L8;FF1f0008eb080700541c00198b9f0315eba9010054bf0200f10803959ae90308aa08f97fd33f011ceba3ffff543f0144f136319a9aa90219cbc80219cb1f01", + "09ebBBL8;FFb50f00f9e82700a9083d0194e000003620008052f44f43a9f51340f9fd7b41a9ff030191c0035fd6a8820091e9ffffb02961129142ffff90427c1991e3030091L8;FF080340f9680000b4e00315aa00013fd6010740f9810000b4020b40f9e00315aa65410094ff0a00b181130054200740ad", + "e82342b9e88303b920070bad5a0c0014L16;FFf2031baafb0304aaeaab00f9e40300aaf00312aaea6341a9f2031caae0bf46a9ed7b00f9e89f12a9e71f40f9ed0740f9fc4340f997f6ff17e8ff40f9f0f340f9BBBBL8;FB0095d67df89b9afc3602efec209b380346baef67b60c4ea708f7eb0e22c9a7f23", + "3e3a7780ec62907e3ee000054fa4eedcafd06cdc1340c36e3244eb67cbdd768L8;FFfd43009101feffd02180059104feffd084000591e3230091e2018052e80700f9f48c0094fd7b41a9ff830091c0035fd601feffd021180691c2028052f08c0014BL8;FF17008092e83341f9f92700f91f0500b1e1f7ff", + "5416008092f9d740f9e98b42b9e88f42b9fb2300f9e923072999f9ffb53b008052f4e340f9f61b00f9b4faffb5L8;FFc2020054a90400b40a01403958c100511f270071280400543f0500f1e00000540805403908c100511f25007168030054490180521823091b081f00131f010071BBL8;FF6d51011420", + "00805201c48052014d019420008052018c8152fe4c0194fd7bbda9f65701a9f44f02a9fd030091140440f9930600b162030054b300f8b6f6031faaL8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd680fdffd000603691104d0", + "09480fdffd0L16;FF1f05007161ca005488008052e16345f9740a00f96822003908008092680200f9810000b4e06745f92200805262d10094e16f45f9810000b4e07345f922008052BBBL8;FF1f7c0aa91f2009a9087c0ba9080180521f200ca9080080921f200da9e003022ae20303aae303042a5af8ff9", + "7803000b4e00700f9a1ffff9021203f91a3ffffb0L8;FF00601391206d00942000805201788052016d00942000805201088052fe6c00942000805201048152fb6c00942000805201908052f86c00942000805201048052BL8;FFff030191c0035fd63f0500f141010054e80741b2e0030091e80300f9ccf7", + "ff97e10300aa20008052fd7b43a9ff030191c0035fd64b05c0394c0900912e0900d1L8;FF84641a3204d01f383f000039420400115f00036b2100188b81ffff5482060051e103022afafeff1701d05f38a6081b53e9ffff17600240f9600000b43f000039BBL8;FFe8cf42f92a040091c002029149088052", + "09692138ead302f9a01b0094e14316911d0f00949f0600b180000054c0020291e1431691a8140094e8b349f9f4074091L8;FFc8220d91d6220e91800a01ade083c53de28bc53de83f00f9e88340f9a00600ade08fc53de14fc23dffe31039a20201ade24bc23de0dfc13dfa1702f9220500adL16;FFe8270", + "0f9e383c43cc00a00ade083c53ce483863ce93f00f9c312803dc09202adc95607a9b40000b4602a40f9e10314aa2200805260b10094613240f9410500b4BBBBBL8;FB2401000015000000bb1140000000000047000000000000002b0100003b000000617373657274696f6e206661696c65643a20216d736", + "72e69735f656d70747928L8;FF2f1405133220081325300c131f05003129010a0aad0d0a0ace110a0a101a0a0a20240913311e0a0a42280a0a632c0a0a28340d13e4c3841aef150a0a52220a0aBL8;FF200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff5400ffff9000e025911615019400ffff90", + "00202d911315019400ffff9000e00e9110150194080040f9L8;FFe083099108c10e913fd5fe97e80740914083009108411d9124d8fe97fae340f936008052f8db00f9da0b00b53900805265000014e00b409100c00e914d000014BBL8;FFe0031baa220080526b59019475f2ffb4e0031aaae10315aa2200", + "8052665901948effff1738008052fc6740b96559019400048052210080525e59019460fdffb5L8;FFa80000b008611591e9ab05f9a9fdff9029c11d91e8af05f928008052a04700d1e96f06f9e1833291e95706f969fdffd029ed0a91eaa705f9ea032d91e86b06f9L16;FFa80600d1e86301f9e0030b91d", + "0dfff97e10300aa91000014a80a00d1e16701f94e000014e80b41b2e06701f94b000014a80600d14900001448008052e0230b39BBBL8;FF2cfbffb43f0108eb7361193220030054536928380bfc71d308050091290040f9280800f9abf6ffb43f0108eb93611932400400542c0440f90afc78d393692838L", + "8;FFf60700b9f63749f91f0101ebe0d50054e8cf42f9490180522a040091e0031aaa09692138e1431691ead302f92b120094fcd342f9e8cb42f908011ccb5f0308ebBL8;FFff8301d1fd7b03a9f52300f9f44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054080200341f050071410300", + "54000180521d000014280180d2L8;FF81ffff54a6000014282c4079080a00b46a02148b6b008052ec0313aae90308aaf4031faa09000014bfbd03716d958b9a8d010d8bac010ccb290500f19401148bBBL8;FFe04fc23d890a00d19f0600f1ea008052eb672191e8b704f928818a9a29fffff029413f91f4", + "ab04f960f18f3c8a0000102b7968784a090b8b40011fd603e4006fL8;FFe4f4ff97200a0036c1f6ffb4cd010014a1c20091a22302d100f4ff9720f6ffb48d010014a22302d1830c805248efff9780f5ffb4d9000014a1620091a22302d1L16;FF220080526cb90094bad4ffb4e05f40f9e1031aaa2200805", + "267b90094f5031faaf3faff178092c63cf40308aae8bf43f9fc6700f9fca35d3921830091e0e3803dBBBBL8;FB0200000026000000496e76616c69644c656e67746800000042024000000000006a000000000000005b0000002600000042024000000000006a00000000000000L8;FFf6031faae00316aae", + "10315aa02850094150100b46b890094e00315aa210080523600805263890094600000b5f6ffff1720008052b58338a9bf8319f8381e00b4BL8;FF00013fd6e03b02f9e8031691f4031691e13f02f9290c40f9e103129120013fd6f8c342f91f0f00b12102005468008052f53f42f9f43b42f9e8a31139290", + "08092L8;FF494300918802178bb5060091df0209ebf74200911b7101a9f59301f9e1fdff545d000014e0430c91e10315aa22008052030180520402805255e5ff97f48f41f9BBL8;FFfdc30191350840f9fa0301aaf30300aa750500b4540740f96a490194e00315aa2100805263490194601800b4e10314a", + "ae20315aaf60300aa66490194571740f9L8;FF49fdffd029ed0a91e92b1ba9290080d2e14306918946c0f2e87f1aa9e8271da91e450094e80342f9e92350391f0100f1e8179f1a0101090a24000014e1031f2aL16;FF28a00791e07f00f9e00309910001c03d21000891ec0b18a9022f8052eae700f9f903", + "0baae0f3803dfc030eaaf48f11a9f4030faaf1df00f9f0cf00f9e6fb00f9BBBL8;FFca0e0139d2b204f8d84e0139c85600b9f44f5da9f6575ca9f85f5ba9fa675aa9fc6f59a9fd7b58a9ff830791c0035fd63f8300f141090054e13740f9e02b40f9L8;FFf30300aa810000b4600640f9220080526969009", + "4610e40f9810000b4601240f92200805264690094611a40f9810000b4601e40f9220080525f690094612640f9BL8;FF89000014e20313aa230c8052fdefff97e10300aa210900b5a80640f91f011aeba9040054e00313aa4cf6ff976008003728fc60d3480600b5200840921f1800f1L8;ZDBBL8;FFe32b4", + "0b9fceb41f9e0e30091c1e20091e2830b91e403182ae5031baaf81f00b91dbeff97f89341b91f0b0071a1070054faa359a92083c13c2183c23ce00600adL8;FFf65703a9f44f04a9fd030091f40303aaf30302aaf60300aac20100b4f70301aa68290094e00313aa2100805261290094a00800b4e10317aa", + "e20313aaf50300aaL16;FF05a50094fd7bbda9f50b00f9f44f02a9fd030091a87cc39bf30300aae9031faa0a018052ff0308eb28008052a1030054b47c039b0b00f0d2f50304aa6b0104cbBBBBBBBL8;FB2d3e20c00129002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d", + "313934396366386336623562353537662f686b64662d302e31L8;FFe1031baae20317aa2500805206048052fb0700f9e3031caaec9e0094a1035af8810000b4e0031caa2200805262a30094bc035cf8f70315aa760a00b4a0835cf8BL8;FF080014eb23100054ff0208eb09010054e0e30091e10317aa220", + "080521e220094f42344a91f0114eb23100054e81f40f9e10315aae20317aa0001148b65230194L8;FFe10300aaa1031df841fdff9021602c9143fdff9063cc2c91a0c300d162038052440080521f000014a0031df841fdff9021602c9143fdff9063fc2c91a0c300d1BBL8;FFfa0300f96f630194e00317a", + "a210080523a00805267630194e0feffb4e92740b988008052b7033da90811092a29008052a9031ef808000039e08301918b280094L8;FFe10313aa35fcff97801a40b980010034610a40f9680240f91f0101ebe0050054680640f9090180522a0400916a0a00f909692138e10313aa28fcff97801e40b9BL", + "8;FF82060054217c0353a10600343f040071c00100543f08007161fdff54888242f81f0500b1810000549fe202a99ffe03a998fe04a981a20091e20313aae2f2ff97L8;ZDBBBL8;FB54000000000000005f000000050000001d1c400000000000540000000000000065000000050000001d1c40000000000", + "054000000000000007300000005000000L8;FF280400917f0a00b1e81700f9410e0054f7031faa7c000014e11740f9e80f40f91f0101eba06b0054e81340f9968248f8490780520969213828040091df0600b1BL8;FF800640ad08048052680200a9000400ad680a00f9f44f41a9fd7bc2a8c0035fd62000", + "805201048052fbfe0094ff0303d1fd7b08a9f74b00f9f6570aa9f44f0ba9L8;ZFBBL8;FFea0f00f9e3430091083f0194fd7b43a9ff030191c0035fd6082000910940009142ffffb042481791200440a9e82700a9e8030091090000b02921049120000014L8;FFe0031faa9effff17680240f9080540f9190", + "101eb031e0054680240f9080540f91f0119eb690d0054e00313aad9feff972024003728fc60d3681000b520084092L16;FFeb5f00f9e9e300f90b255aa9eaaf0aa90a2d5ba9e90700f9ea3f00f90a255ca9eb271ea90b255da9e97f00f909f140f908fd40f9ebab05a9e88300f9e8430f91BBBBL8;FBd309", + "400000000000550000000000000006020000190000004e1a40000000000058000000000000006a0000000900000080174000000000005600000000000000L8;FF09fd46d30800098b080500911f0109eb88130054bd000014080c44f81f0900b1c1090054f3031faa5a000014e80300aa098d40f83f0500b", + "1e0120054f30300aaBL8;FFe0fefff000e00e911c0f019408004039e9fefff029e13791e00301aa08711d5308410051081d7d92226968f8e9fefff029c13891286968f8e10308aaf00e0114L8;FFe97f42f958fd78d3e9d700f9480400b4e8c740f9e08b40f922008052e19340f9177d085364130094ef03", + "17aa1d0000141f090071611e00540a0180d2e97342f9BBL8;FF054f019436008052e8230091e0820091f24f0094f70f40f9f7feffb7f80b40f9770300b467530194e00317aa210080523a0080525f53019400feffb4e10318aaL8;FF880280d22007c03d0800f0f21b2100d14003803de863019100610c91", + "91e7ff97c8fdff17f83f42f92083c13ce9d742f9f5c742f9f7cb42f9080340f9c0828d3cL16;FF680a00f9692200396b0200f9ea0000b4e1030aaaf40300aae0030eaa2200805265d30094e00314aae8e740f9485602b4e1e740f922008052ff074091ffc30091BBBL8;FF5af9ff97b50100b4610a40f968", + "0240f91f0101eb60300054680640f9090480522a040091e00315aa6a0a00f909692138e10313aa4df9ff97805241b980010034L8;FFe1d342f9e8cb42f9f98749f91f0101eba0360054e8cf42f9490480522a040091e00318aa09692138e1431691ead302f92a0c0094fad342f9e8cb42f908011acbBL8;F", + "Fe10315aae20314aa0001178b71f30094e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00013fd6e0031faaf44f4da9f6574ca9f85f4ba9L8;FF7f7821f8f6ffff17e20300aa607821f84180403940008052441c40b9231040d30020c31a000400519f00006b80030054450840f940", + "008052a120403923100012BBL8;FF8a0000102b7968784a090b8b40011fd6f37749f97f0600b1e0020054e18f49f93f0400b140010054810000b4e09349f92200805260330194e19b49f9810000b4L8;FF00013fd6810640f9810000b4820a40f9e00313aa68330094e14341f9810000b4e04741f9220080", + "5263330094e87f40f91f0500b180000054e803009100e10391L16;FF21008052390080526ab3009460e5ffb4e10318aae20316aaf50300aa6db3009444000014550f00b466b30094e00315aa21008052390080525eb3009460fdffb4BBBBBL8;FB72756374696f6e00770d4000000000002e000000000000", + "00a90000000e000000484d41432d5348413235362073686f756c642061636365707420616e79207369L8;FFff430991f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd66082c73ce8af40f90a0480526182c63ce99b40f9bcc303d1e083853cf50340f9BL8;FFff830291c0035fd6e02", + "30091e1031faa76ffff97a9ffff17ff0306d1fd7b14a9fcab00f9f65716a9f44f17a9fd030591e10b00a9680200b0e40b00f9081140f9L8;FFe007409123fdffd063f03a9100401d91e10316aae2031caa84018052e8b301b9e09b803df6e700f9f50d0094faaf4bf9e1b34bf9e80b409108c10e91e0031a", + "aaBBL8;FFf4a30091090140b90a3140b80c7141f8167140f815f140f87f0500b1a98318b8097d40398a320fb8ac8317f8a9031838c0030054f903012a098449a9fa0300aaL8;FFe083329161fdfff021203f9102028052a3fdffb063fc2c91c4028052b8000014e05306f9e083329161fdfff021203f9102", + "028052a3fdffb063342e91a4028052L16;FFe20314aaf48300a972db0094f40f00f92f00001428008052ff0f00f9ffa300a9a0e300d1e12300913e2a0094a083dc3ca183dd3c28008052a8831ff8e08700adBBBL8;FF05770194a00100b4f50300aa6d7b0194e00315aa21008052f40315aa36008052647b", + "0194a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad3L8;FFea3b48f9e9c706f9e25fc33de35bc33de163c33deaab06f9e053833de18b833de157c33de287833de17f833de287c33dbf0600b1e07b833de07fc33df4179f1aBL8;FF49c100117f2500710940003909819f1a9f7d02710", + "a819f1a8d0d00122e28403929010b0b4a114c0bbf25007129c100110b819f1adf7d02710944003949c10011L8;FFfd03009104000094fd7bc1a860fff736860e0014ffc302d1fd7b07a9f85f08a9f65709a9f44f0aa9fdc30191000280525c0d0094f30300aa40038052590d0094BBL8;FFfd7b44a9f32b4", + "0f9ff830191c0035fd63f090071e1000054ea0f40f9080180d20800f0f249dd7892080140b205000014080180d2e9031faa0800f0f208017fb2L8;FFe81f00b9dc0100b475fe40f96d3b0094e0031caa21008052663b009400dc00b4e10315aae2031caae00b00f9693b0094050000141c00809205000014", + "28008052L16;FFf2d343f9f1d743f9e0db43f9e3e35e39e7f343f9e4e343f9e5e743f9fc7700f9fc0315aaf503102ae27744f9eb6740f9f02340f9e13340f9e3b7803de20713adBBBBL8;FBdb1a0000000000007a134000000000005700000000000000890000003c0000007a13400000000000570000000", + "00000007b000000400000007a13400000000000L8;FFd0e9ff97fa4f41f9f75341f9e20314aae30316aae40313aae0031aaae10317aa72eaff97f70e00b4f60600f1e0031faad7fa7fd3840c0054e8f77fb2ff0208ebBL8;FFb50600f1d6c20091c0030054c1025ff8280041d21f8d00f10831979a1f6d00", + "f108ffff54e9feff100a6b683829090a8b20011fd6c1825ff841feffb4c00240f9L8;FF700b00940002805201018052690b0094200100b4140000f901fdfff021400891130800b91f300039f44f41a9fd7bc2a8c0035fd60001805201028052f5060094BBL8;FFe9140054f50b40f9000440ad0104805222", + "008052a802168b000500ad664b019400e4006fe0830091c4820091e1031faae30315aae0b6843de0b2843de0ae843dL8;FF080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b1400400540a1440f9092040f90a0100b44b0140b26b11c0daL16;FFe87700f", + "9f6134ba9eef347a9fa8700f9e96340f9f57b40f9fa5740f9f1a34ca9e2c345a9e1d348a9610a0014e9030eaafcbb00f9fc0305aafa0302aae4e300f9BBBL8;FF000400ad680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd62000805201048052fd660194fd7bbda9f50b00f9f44f02a9fd030091f30301a", + "a210200b4f40300aaL8;FF04000014b50600f1d6c2019140030054c1825cf83f0400b140010054810000b4c0025df822008052636b0094c1025ef8810000b4c0825ef8220080525e6b0094BL8;FFe28341ada28339ad56f3ff97a0877aad880080d20800f0f2a90358f8080900918082843ca003d73c8182", + "853c8082863ca18378ad880200f9898207f88182803cL8;FF2d0d0091bf0101eba20300540e68ed38df010131cbf3ff5427000014ad191f12bfb903712d00805281030054df0101312e0080522a0100542d090091bf0101ebBBL8;FFff2300a908048052a06300910800ac72e1630091a21b00b9e92302a9", + "e8030091ff2301a9e1e1ff9740030035e003c03de80b40f96002803d680a00f9fd7b43a9L8;FFe00308aa62028052fa260094fd7b41a9ff830091c0035fd6e00301aa41fdffd021202891a2008052f5260014fd7bbda9f65701a9f44f02a9fd030091140840f9L16;FFa8100054e84300391f090071ecfbf", + "f54a80c00341f050071610500546c0400f1800e00549f2900f14d018052eb031faae9031faaea031faa8c318d9a4d040091BBBBBBL8;FB5f63742e726563762065706f636820c01f3a2043743153616d706c6564202d3e2043743141636b6e6f776c6564676564001b737071722076312e73656e645f63L8", + ";FF40008052410080526a9f0094001a00b4f90300aa6b9f00944000805241008052649f0094401900b4fa0300aa659f009440008052410080525e9f0094801800b4BL8;FFfd7bbda9f50b00f9f44f02a9fd03009148008052f503012ae10303aa000d002af30303aaf403022a1bfdff9795040034a802003", + "20811c0da081540d2080d088bL8;FFf30300aae0a30091f40308aa45120094a8c300d1e00316aa6cccfe97b6035df8a083dd3ca8835ef8df0a00b1e013803de82b00f9c1000054e1a30091e2030191BBL8;FFe0179f1a84740194b50600f11900190a21ffff5403000014fa0300aaf9031f2ae003192a7c7", + "401941f1c0072e0031aaa8001005428008052ff0200f9e8220039L8;FFfa4300f900330054f9a740f9f88342b9190700b4f3a340f96a5f0094e00319aa21008052635f0094201301b4e10313aae20319aafb0300aa665f0094f4b340f9L16;FF490180522a040091e00316aa6a0a00f909692138e10313aa", + "e1ecff97780a40f9680240f9080118cbdf0208eb88070054680640f9e10317aae20316aa0001188bBBBL8;ZBL8;FFe0630091e10317aae20316aa230080522400805246a3ff97f71740f9e80f40f9080117cbdf0208ebc9bcff54e0630091e10317aae20316aa2300805224008052BL8;FF1f0500f101030", + "054d56240a9e00316aa010380520201805267ff0094f90215cb330313ab420b005408ff4ad3090880520811c0da280108cbe90080521f1d00f1L8;FFbf1000f1c10100546004803d600001ad63e47a92820003cb420002d11f2003d56300019123740bd5420001f1a8ffff5480003ead80003fadc0035fd6", + "820003cbBBL8;FF9f0b00b1c1010054f80319aae00318aa16c3ff9708008092686e00a9ff030891f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e83300f9L8;FF09c143393f0d0071c125005461fdfff021e01a91e0430f910203805228020014081347b8e9d743b9ea0742f9fa5f", + "09a9f7f341f9faff41f9e8bb03b9e8435039L16;FF3f0500b160000054e0031baac4caff975c008052590300146083c63c6183c73c6283c83c6383c13ce077813d6083c93ce17b813d6183c03ce083813d6083c23cBBBBL8;FBd7a7d1a0a28ca70f97d90000ece3dee68cee90b7e2ccac4e990e5381b2b86", + "7f9c9292ab285635bbcf5d6567a35cbfa1ce97a6b4e883267f4f0d8141283035e3cL8;FF1b1043796f8f00940004805221008052688f0094009200b4f31f00f9f30318aa08048052698640b8e8830ea9ff7f00f909040036156300911602805208000014BL8;FFe1000014c02300b5a02302d191ecff9740", + "10003641eeffb421010014e18f0cb96fffff17a88357f8080540f9150101ebe200005481010014a22302d1630c8052L8;FFc0035fd6ffc301d1fd7b03a9f85f04a9f65705a9f44f06a9fdc30091280840f9f40303aaf60302aaf50301aaf30300aac80300b40805088ba90640f918ed7cd3BBL8;FFea2f5b", + "29f7c3023980a20191a14301d10809c05a2909c05adf9202f8e82712294809c05a6b09c05ae92b5c29e82f132922008052df1202f82809c05a4a09c05aL8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb482200545b010014e80300aa098d40f83f0500b140220054f30300aae", + "00308aa20020094L16;FFe3ef00f9e30310aaf0030daafbdf00f9fb0308aa8d018052e9eb10a9e0bf46a9f7fb15a9f9fb42a9ed7300f9e72f44a9e8174da9f60310aaed0304aae40301aaBBBL8;FFc80080d20800f0f20809009110ffff1761030054e0031faa89ffff17c80080d2e90b00f90800f0f2080", + "900d108ffff17c80080d2e90b00f90800f0f2080900d1L8;FFf65704a9f44f05a9fd030091ff0316d1f30300aae8430691e00301aaff0300f9fa03062af803052af60304aaf90303aae21b00f9f50301aab70302d1f4030591BL8;FFd3f5ff97e80300aae81300f9a1fefff021981391a3fefff063041491", + "e083009122028052640180523c000014c80080d2e0a30039e08300910800f0f2ffa70039L8;FF23404079652c46d3bfbc007168080054e3fcff9063e00b9163d86578487c031b9f00086b8bfcff546300080b9f00036b2afcff54211040f93fcc74f220010054BBL8;FF09692138ead302f9d41a0094e143", + "1691210d0094e0a749f9800100b4e1d342f9e8cb42f91f0101eb20460054e8cf42f9090180522a04009109692138e1431691L8;FFad290094e0074091fc0356b98100805200001891ff0316b9a7290094e0074091f80356b98100805200001891ff0316b9a1290094e86b40b9e0032791e1833f91L16;FFc", + "0040054e8df9f529f01086b60040054c8ff9f52f5031f2af60313aa9f01086b60090054880100d0081140f91f0500f1c90200544800805249feffb029112891BBBBBL8;FB58070000050000001d1c400000000000540000000000000059000000050000001d1c40000000000054000000000000005f00000", + "0050000001d1c400000000000L8;FF6b11c0da6b1540d26b0d0b8b6b2501914a194b8b4b0500910a3040f96901098b0a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091BL8;FF080c47f81f0500b1201d0054e2feff97080040b20811c0da081540d2080d088b0825019109fd", + "46d30800098b080500911f0109ebe81b00541401001497010094L8;FFa04700d1d2c4ff97e0b700b9a04700d1cfc4ff97e0b300b9a04700d1ccc4ff97e0af00b9a04700d1c9c4ff97e0ab00b9a04700d1c6c4ff97e0a700b9a04700d1BBL8;FF856c0194080f4039f703002a1f615a6be0179f1a806c0194", + "08134039e902000a1f01336b7303090ae0179f1a7a6c019408174039f703002a1f01396be0179f1aL8;FFe94305b9e04b813de14f813d680000b4e00313aa00013fd6810640f9810000b4820a40f9e00313aa635700949f0b00b121020054e0a34fa962030291e17740f9L16;FFe8a706a925d30094881e4", + "0b91f050071e1000054950640f93501f8b6f8031faae00318aae10315aafbd20094280080527f7e00a9687e01a92c000014960240f9BBBL8;FF23000014210a0054e0031faa9dfeff17880080d2e00b00f90800f0f296feff17e90b41b2e9a300a994feff17880080d20800f0f2080140b28ffeff1788008", + "0d2L8;FF3f0400b140010054810000b4e08749f92200805268770094e18f49f9810000b4e09349f92200805263770094b30000b4e07b49f9e10313aa220080525e770094BL8;FFe0ebff54f44f42a9f65741a9fd7bc3a85f000014010040f9810000b4000440f92200805264f70014c0035fd6fd7bbda9f6", + "5701a9f44f02a9fd030091090c40f9L8;FFd5220391180c18cbfa02188b54230091530100b4611640f9a102018b818600f8618a40a9601640f9a002008b69f7ff97730240f9f7ffff1739231d91e00316aaBBL8;FFa0050054b8008052af000014e8074091f68f45f90023009108810991f4074091948209", + "91358d0094e1074091e043169102398052218009916637019488220791L8;FFe80300aae0032a9161fdffb021201391a201805263fdffb06354139144018052e84305f911000014c80080d2e0232a39e0032a910800f0f2ff272a39e84305f9L16;FF022e8052e03f803de8f30ff8e91f00f970b70094e81", + "f40f9e03fc03ddf0600b1e9c31391f4e31539e8bb02f9e8f34ff82091883ce8c702f900350054e8435039BBBBL8;FBef104000000000004e000000000000006402000013000000696e6465786b657950656e64696e675072654b65797072655f6b65795f69647369676e65645f7072L8;FF2e008052a90a0", + "0f908091c8b180100791b050079a2ffff17e00315aa92ddff97a80640f92e00805216091a8b88031aeb48fcff54e6ffff17f44f45a9f65744a9BL8;FFc900003628fd60d3e88305b9e80f40f9e8cb02f9e80317aae0832291e1031691e8c702f927dcff97e20f4ba9e0031691e5134ca9e11f40f910dbff9", + "7e8c342f9L8;FFb6237ea9ea058052b7835df819050091ca6a2838e90219cbb9831ef8bf0209eb88020054b50000b4e12740f9c002198be20315aa67070094628f7fa92103158bBBL8;FF6d470194b50000b4e00316aae10315aa2200805268470194e00314aa13cbff97081f00d129008052680600f9690", + "20039200000143f090071a1010054a8035ef8L8;FF054300946f470094e00280522100805268470094c01c00b488fdffb008210d911a0380d20001c03d08f140f8e90280521a00f0f2e98316a90000803d08f000f8L16;FFe80700f929a05ca9e9f700f929ec5da9e82f00f928fc40f921000891e9a30fa9", + "6cc70094f2031aaa08e30d91f6f300f9000540ad08cf41f9f8c341a9ea0312aaBBBL8;FF3f09007161010054e80b40f90a0180d20a00f0f209dd78924a0140b2090000140a0180d2e9031faa0a00f0f205000014080180d2e9031faa0800f0f20a017fb2L8;FF8c00f8b761e10c8b2b0180520a0000144d2", + "54039bf0500f1c80100548c1900126ce10c8b81fd0daa3f000beb030500544b018052e0031faa4a010b8b29010bcbBL8;FFc1010054e1031faac1ffff17880080d2e10700f90800f0f2b9ffff17e80b41b2e00700f9b6ffff17880080d20800f0f2080140b2b2ffff17880080d20800f0f2L8;ZDBBL8;FFe", + "3430691e8271aa928ffff900801089142008052e8db00f966fcff970a0380d228ffff9008e90891690480520a00f0f2e8a716a95a1100d1e10740f9a1e6ffb5L8;FF9682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef82200805264270094c1825ff8e1feffb4c00240f92200", + "80525f270094f3ffff17L16;FF011119cb6ca70094d5fbffb5f44f4ba9f6574aa9f85f49a9fa6748a9fc6f47a9fd7b46a9ff030391c0035fd6f3031f2af60300f99cffff17ff8304d1fd7b0ca9BBBBBBBBL8;FB61696e2e72730038706f73742d7175616e74756d20726174636865743a206572726f72206", + "372656174696e6720696e697469616c204232412073746174653a20L8;FFf60300aa6fa40094000480522100805268a40094000a00b4e80300913f030071f70300aa1a0101911b81009148139b9a000540ad000400ad62a4009400098052BL8;FF602a40f9220080526b240194613240f9c10000b4603640", + "f922008052f30b40f9fd7bc2a864240114f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9L8;FF63000094880a40f9e00313aae10314aaedffff17e10300a9e00301aae10309aa220080522300805224008052f4030baa57000094e10340a9eb0314aa2aa040a9BBL8;FF600600ad682200b9f4", + "4f44a9fd7b43a9ff430191c0035fd680ffffd000001d9116600194fd7bbca9fc5f01a9f65702a9f44f03a9fd030091ff0308d1f60300aaL8;FF6d640094e10313aae10700f9a1fdfff021e02091a3fdfff063c82191e0230091a200805284018052586aff97e00740f941feff17c80080d20800f0f208090", + "091BL8;FF63a80d91e0030091c2018052a4008052e80300f95deaff97e10340f9bdffff17e80f41b2b7ffff17c80080d20800f0f208090091b3ffff17ff0302d1fd7b03a9L8;ZDBBBL8;FB6174636865745f6b65795f70726976617465636861696e5f6b65796d6573736167655f6b65797300ef10400000", + "0000004e000000000000006402000013000000L8;FFe90080521f2d00f10831899ae9fdff9029610a918a0000102b7968784a090b8b40011fd6e11740f9e80f40f91f0101eba0880054e81340f9938248f849018052BL8;FFe00314aa22008052a0873dade00b5cada08b3eade10359ada1833bade2035aa", + "da2833cad0000019400e4006fe00319ade0031aade0031bade0e3803d48d776d3L8;ZFBBL8;FF699e40f92a0600344a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8bL8;FF4c0000143f104071c30b00544b09c0", + "396c1d00122c380c0b811140516b00f8376b008052430000143f004871030b00544b0dc0396c1d00122c540c0b81014851L16;FFe83340f9e95740f9f10314aae46f40f9f2d340f9e30318aae8f700f9e8ff40f9e7031baae96f00f9ee7b40f9e1a740f9e89300f9eb2b40f9e83357a9f8ef53a9BBBBL8;F", + "B686472436861696e63757272656e745f65706f63686c696e6b736e6578745f726f6f7473656e645f65706f6368706172616d7343743153616d706c6564437431L8;FF6b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914a", + "fd46d329010a8b29050091BL8;FF3f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091L8;FFe00319aae10316aa220080526a140094e3c740f9e0431391e2e30e91e103142ae40318aa720a009", + "4e00b409161e20191e343139100c00e91e203142a40040094BBL8;FF680200f9fd7b44a9f32b40f9ff830191c0035fd61f09007181010054ea0f40f9090180d20900f0f248dd7892290140b20a000014ea474039090180d2e8031faaL8;FF2283c53cc182843c4143cf3c20f18f3ce963019120cbc03de8b", + "304f928210a91e9e32291c082893c4043ce3ce0234d39c282853ce11740b9e33740b9408708adL16;FFe237823de2f7c23de023823de0fbc23de11f823de1dfc23de02b823de0e3c23de227823de2e7c23de013823de0ebc23de10f823de1d7c23de01b823de0dbc23dBBBL8;FFfd7bbba9f90b00f9f85f0", + "2a9f65703a9f44f04a9fd030091f40300aa004841b9f30301aa80010034610a40f9680240f91f0101ebc0340054680640f909018052L8;FF3c010014e8031faa000119ab62640054e1431691310d0094f90b40f91f0700b1e00b0054e1d342f9e8cb42f91f0101eb00400054e8cf42f92a040091c0220291", + "BL8;FF810000b4800640f9220080526af40094810e40f9a1fdffb4801240f92200805265f40094e9ffff17f44f41a9fd7bc2a8c0035fd6a10400b4fd7bbea9f44f01a9L8;FFe6060094b30200b9e3ffff17a0221f91f0060094eeffff17634000d1ff1040f2a0000054e3fcffb063e00b9163d86878633c7", + "cd3841e4092661000d1a5400091BBL8;FFe8cf42f9e10316aae2031aaa00011c8b7034019488031a8bfc074091f60740b99c830191e8d302f9b9010034e1d342f9e8cb42f91f0101ebe0d40054e8cf42f9L8;FFe40f00f9081140f91f0900f1e3160054176040a928008052f40300aaa8ff37a939fdffb03", + "9633e911a008012e803019115e3009116630191a0a301d1f30303aaL16;FFe21b803dd2000014806ec03d8a220791886206910101c03d88d640f989e240f98083813c4001c03d81220091a80317f888ee40f9e007813d807ac03da98318f8BBBBBL8;FB18ad410000000000696e76616c696420636861696", + "e206b6579000000000000009f1b40000000000034000000000000004a0100002d0000009f1b400000000000L8;FF210080526b9c0094600600b4480740f9e1031faab5833ea9bf831ff815090091a8835ef8ba024079bbe25f78080101cb1f0d00f14901005448431b2a390700f1BL8;FF2a040091e00315", + "aa6a0a00f909692138e10313aa20faff97770a40f9680240f9080117cbbf0208eba8090054680640f9e10316aae20315aa0001178b651c0194L8;FFe1db853dce16ff97e0d7c53de1dbc53de007409100401d91e03f813de143813dc2310094e037c13de13bc13da04700d1e243c13de00711ade03fc13de", + "00b12adBBL8;FFf503082a020315cb386540a93c0302eba2f8ff54fc030191e10318aae20319aa8003158b6b5c0194a802190be8ff01397ffe03f11808805220020054e8ff4139L8;FF602b00b5e1031faae9ffff17002900b5a02302d1a0f4ff97e80301aa80000036682900b5e1031faae1ffff17e1031", + "faae8830cb9deffff17e18b0cb940ffff17L16;FF240080524a000094610a40f99bffff17e00313aae10317aae20315aa230080522400805242000094770a40f9680240f9080117cbbf0208eba9f3ff54e00313aaBBBL8;FF6d7c0194c10240f9810000b4c00640f922008052687c0194c10e40f9a1fdffb", + "4c01240f922008052637c0194e9ffff17880240f9280100b4090d8052e00313aaL8;FFf6ef47f9e01bc43de11fc43de0431691e8036179e143069102738052e057813de0fbc33de15b813de8e30a79e063813d687c0094fc074091f94315919c830191BL8;FFfd7bc4a8c0035fd6f405f8b7140400b46cfc", + "0094e00314aa210080523700805264fc0094200500b4e10316aae20314aab40200a967fc0094b40a00f961820091L8;FFf30300aa3f0002716200005435008052080000143f0020716200005455008052040000143f404071680080521535889a680240f9080114cbbf0208eb28050054BBL8;FF4901084a", + "aa635538a94315386901084aab735538a95315384901084aaa835538a96315386901084aab935538a97315384901084aaaa35538a98315386901084aL8;FFe04b40f9fc031baa168116aae86340f9fb0315aaf5030aaa087f60b3f80308aaeaf5ff97c8fe48d3bf0a00b1a10000547a9a41f97bc641f9ea5", + "b40f905000014L16;FF6dbc00941a3700b4e05b40f9e1031aaab3010014f6031faae8ef42f91f0500b180180054e8c3159100a1019158c5ff97c0000014fa031faa1f000014f4031faaBBBBL8;FB7d51d893762144d4a28c553b7cd0802a919500003ed264954975f6b2fd2aa293a553a68ef934db4e9b66", + "2f005e16bc2dfeb016de8495d6d3a0230e34e2c4c47bL8;FF0801094a7f0600316b060253097d18536c0e04534a01140aedc3971a6e1205536f160653495a69784a010d4a6d1a07530b7c8b0a6c7c8c0a8e7c8e0a0821094aBL8;FFa80359f8a003d83ce1833291022b8052f30703f9e80303f9e8c317910", + "0810091e07f813d6b0c0194e8fb42f91f0500b161ebff54e99f40f9530200b0681240f9L8;FF144c00a91f400039f44f41a9fd7bc2a8c0035fd60001805201038052fd070094fd7bbda9f50b00f9f44f02a9fd030091f30302aaf40301aaf50300aa610c0094BBL8;FF20008052610280520348019420008", + "052e1031aaa00480194082440a9e20301aae00308aae10309aa2b480114fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9L8;FF6102005481fdffd021dc0191e2028052fb470014ff8300d1fd7b01a9fd43009181fdffd021a0019184fdffd084200191e3230091e2018052e80700f9ed470094L16;FFf2", + "ab40f9eb1b43a9e77b44a9f11342a9f7eb50a9e84740f9e90f02f9e1430f91e0b3c23de3f701f9e20319aae8eb01f9e86b40f9e0fb01f9e0031d91e8ef01f9BBBL8;FF930200b46f6c0194e00313aa2100805236008052676c0194c0feffb4e10317aae20313aaf40300aa6a6c0194e8230091a0820091e9", + "680094f50f40f97501f8b6L8;FFe8b30a9149feffd029011f91e80302f9e8830a9180fdfff000281291e90702f9290000f029710891e80b02f9c8fdffb008a11991e90f02f949048052e82719a9BL8;FFe0c3039162f5ff97be000014e1430091e20313aaf70b00f9f74b00f9f9090094e08744adf50300a", + "ae22fc03de86340f9e0870bade08742ade267803de8531aa9L8;FFfd030091f30b00f940000094130040f9e00313aa930000b4d8ffff97733a40f9fcffff17000000d0009843f9d3ffff97000000d0009843f9d0ffff97000000d0BBL8;FF20008052012c81520328019420008052210580520028019420f", + "fffb000802d911628019420ffffb0004026911328019420ffffb000e035911028019420ffffb0L8;FF702c0094e00315aa21008052692c0094601800b4e10314aae20315aaf60300aa6c2c0094571740f9570400b4541340f9642c0094e00317aa210080525d2c0094L16;FF6dac0094e023019167b3ff97", + "ff832591f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd628008052e81b00f963ac00940010805221008052BBBBBBL8;FB74696f6e20494420c000c01b2073657373696f6e20737461746520636f727275707420666f7220c0001f70726f63657373696e67205072654b6579206d657", + "373L8;FF09fc60d3287b68782821084a095d1053295b69782001084aa0020079a8ee5f78d60600f10801174aa8020079e1f8ff5412000014680100d008210091a22300d1BL8;FF1f1800f182070054217c0353010800343f040071000100543f08007141fdff5481220191e20313aaacfcff97000100b483", + "000014200e00b5e00313aa85fdff97L8;FF010840b9f30300aa150040f9e0230291f40308aabba301d142130094f60f49a9a0a301d1e10315aae20316aaf6100094b9df79a9b8d77aa93f0b00b161050054BBL8;FF7460019449000014e0c302f9f6bf02f906000014e80b41b2e2c302f902000014c80600", + "91e8bf02f9e0e31591c8660094e0bf02f981ffffb02188099183ffffb0L8;FFe10314aae20315aa89ffff97e003172ae80b40f9ff0202710801148b43f8ff54daffff17e083c03ce80f40f96002803d680a00f9f44f49a9f73b40f9f65748a9L16;FF600300543f100071e00300543f1400716105005481c", + "20091e20313aa6becff97800a00b5e1031faae6ffff173f040071600300543f08007121040054888244f8BBBL8;FB35366166303938352f6c6962726172792f636f72652f7372632f74696d652e727300010101010101010101010101010101010101010101010101010101010101L8;FF23008052240080", + "5249a4ff97e11740f9e00313aacffbff17e063009122008052230080522400805241a4ff97e11740f91dfbff17e0630091e1031baae20319aaBL8;FFc0feffd000a03e911cfc0094f6031faae00316aae10315aafffb0094c0feffd000c03f9115fc0094c0fefff00020009114fc0094c0feff9000803991", + "c2fefff0L8;FF09028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd63f4000f1e20300aaa80000543f0002eb68000054e00302aa0c0a0014ff8300d1fd7b01a9fd430091BBL8;FFfa031caa428f40f8821000b4810340f9380080399800f8b728040091490400d1110000145f2800f1880000542800", + "028b08f1df38880ef837a00301d1ddf1ff97L8;FF6b9241f9689601f9619a01f960a601f96aaa01f969be01f96bc201f962c601f9481940f900013fd660ce01f961d201f9290c40f9e8430f91e1031baafb5f00f9L16;FF7f220039680200f9ff032491f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9f", + "d7bc6a8c0035fd6280141d2ea008052f9031c911f2d00f1f5c31591edc31391BBBBL8;FB03680f3d2088b345ca57446b14a881bae51f14c27b7799f0ed28a3e8081261d832f54bd0e658000026bf4ce1dbf2175bb41cf8c041f0ff6021ea8e1dfbcafb2fL8;FF08040091200440a9a94300d1eaffffd04a1", + "11b91a8031ff8e2fdff9042840191e92b01a9e3430091008c0094fd7b44a9ff430191c0035fd608100091200440a9BL8;FFe1c322910228805272100194f3031faaf9031faa35008052e0c32791e1c31d91022880526b10019400630091e1c3279102288052fb9b05f966100194e88b4cb9L8;FFff020094", + "a14301d1e2030091e00314aab0e6ff97a1035df8810000b4e00315aa220080526410009428008092680200f9f44f4ea9f76340f9f6574da9fd7b4ba9BBL8;FFf53f00f9735001943f0700b1f94702f960000054ff5f08a904000014e84b42f9e94f42f9e82708a9e0230091e2030291e10315aae30314aa8", + "e020094e84742f9L8;FF6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d2L16;FFe83740f9e83f04f9e82743a9e84704f9e87b40f9e94304f9e84b04f9e86340f9e84f04f9e8d340f9e85304", + "f9e86740f9e85704f9e85740f9e85f04f9e86f40f9BBBL8;FF280e0036e90b40f983000014e80f40f9690640f92a0108eb032b0054690240f9e00315aae30316aae403142a2801088be90b40f9682a00a9680040f9080540f9L8;FFf44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6f", + "f4301d1fd7b03a9f32300f9fdc300913f040071f30300aae102005428008052c9fdffd0BL8;FF160101eb02030054e80f41b207000014890080d248008052e02300390900f0f2e827003928017fb2e0030091e80300f9c7f6ff97e10300aae00301aaf44f45a9L8;FF8008159b0600068b04d05f38840000", + "3401e05f7821040011211c001204c05f3884000034000080d21f000039007d20d4bfc021eb82010054a31443aae703252aBBL8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb481700545f000014fa031faaf9b749f9f8074091188309913f0700b18018005400230491L8;FF38", + "1f4092fa0f41b2e80318aa9c02001438ff48d31a0180d21a00f0f2091f4092fb0309aaa1035df8415300b59d020014090180d20900f0f23a017fb2e91f4092L16;FF810000b4e00313aa220080526ab00094f44f46a9fd7b45a9ffc30191c0035fd6ffc302d1fd7b07a9f85f08a9f65709a9f44f0aa9fdc3", + "0191280441f9f30301aaBBBBBL8;FB704d6573736167654b65796369706865725f6b65796d61635f6b6579697650656e64696e674b796265725072654b657963697068657274657874656e63727970L8;FFc2010054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050", + "091200108ab62000054fd7bc1a8c0035fd600fefff000e03991BL8;FF6b0500f1ec030daa81feff54a90109abe300005423000014e8031faa090840f949fdffb5e90309abc2030054280108ab42040054091440f9090300b40a1040f9L8;FFe1031aaae2031caaa4018052eabf00f9f9031aaae8af00f94e", + "f5ff97ec6b42f9e96f42f9fa7342f9e27742f99f0900b101400054e0431391e1031aaaf7a714a9BBL8;FF17020034e8030091e10314aa9802028b0001178b6f580194e83340f980030191e10300912200805208050091e83300f9fc530194ffff0039f50316aaf40318aaL8;FFe8cf44b9f5bb44b920c1c0", + "3c9f0b00b1e8a304b9e027813d410a0054e8830291e99f40f9e027c13d16d10791e8a344b9f59302b93f0500b1c002803de8a702b9L16;FF83feffb063201291e0030b91a2008052a40180524dffff17e06301f981feffb0210c129183feffb063681291e0030b91a20080522401805244ffff17e06301f9", + "BBBL8;FF810000549fea04a99f2e00f99f6200b91f0900f1412e0054770240f9e20640f9423100b4e10240f920008039000ef8b728040091490400d17d0000145f2800f1L8;FF6d7800943f0700b16000005460c20091f40c0094e87349f9090d00913f0900f123c7ff54080141d2e90080521f2d00f1083", + "1899a1f2500f128230054e9fdff90BL8;FF685640f9a80000b4605a40f901f97fd34200805268f80094686240f9a80000b4606640f901f97fd34200805262f80094686e40f9a80000b4607240f901f97fd3L8;FFc0035fd6200020d4fd7bbea9f44f01a9fd030091f40300aaa300f8b6f3031faa28008052", + "0901805210000014f30303aa010100b4e00302aae10313aa5c090094BBL8;FFfbcf44f9f9c744f900802f91f5cb44f901048052e01b843de11f843de223843df6ef07f9e3ff863de3fb863d3334019464380194000481522100805260380194L8;FF0800f0f2080900d1ca000014e04705f9e80b41b2c700", + "0014c80080d2e14705f90800f0f2080900d1d0000014c80080d20800f0f2080500d1be000014e04705f9L16;FF72c604a9000505ade00b56ade1d7c03d638201397b1206b8000903ad68ff70d36112893ce08754ad689e0139e87242f8649606a9681e08a9e8f240f8699207f8BBBBL8;FB00000000000d0", + "0000000000d1100000d000d0d160d007c494c059ea36eca27c5617373657274696f6e206661696c65643a206b65792e69735f6e6f6e65282900L8;FFa8e301d1e91740f90001c03da88359f82001803d280900f9e83340f91f0500f1ab000054e03740f901f97fd34200805261880094e83f40f91f0500f1", + "ab000054BL8;FFe89740f91f0500b14106005433000014a082c03ca182c13c48020090a282c23c400707ad4243803d081140f9a80300b4e8ffff900861049189ffffb029c11f91L8;FF1900f0d2e12f00f9f503152ab70000b4e1ee7cd3e00314aa0201805266080094280341d23f0300f114459f9a9f060", + "0f1280100542900805228008052fb031faaBBL8;FF5f2800f1880000542800028b08f1df384803f837e0030091e6f9ff97e80340b9880a0037e80b40f98a0640f9490108eb430a00548a0240f9e00740f94801088bL8;FFe143c83c03e4006fe283cc3ce8430691e0c30e91808506ade083cb3cc1e20091e", + "2430e91fa030b91808907ade3838b3ce3838c3cfce3fe97e89341b9080e0036L16;FFf6031f2a20844eade0032b91e17700f902328052e0af833d20884fade1b3833de0b7833d21804cade2bb833de0a3833d22804dad21400891e19f833de2a7833dBBBL8;FF680600f92802805268220079480080527f5", + "e00397f3201b8680200b9f44f44a9f51b40f9fd7b42a9ff430191c0035fd682fffff042e01691e00301aae10314aaL8;FF09fc4ad30a088052f4031faaf5ff03a92911c0da490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9BL8;FF401000b5", + "e1031faa610a00b5a80640f91f011aeb69050054e00313aa4ff5ff97a009003728fc60d3880700b5200840921f1800f1c2070054217c0353e1070034L8;ZDBBL8;FF08210091e1c30e91e9db01f91a00f0f2eadf01f91f240194e81f40b9e8c306394d0000142093c13ce9df40f9e8a30539e012803d2093", + "c03ce9f204f8e112c03dL8;FFff830191c0035fd68000805206000014e00313aad9020094e80300aae00301aaa8fe0737680240f9090540f91f0009eb29060054e80f41b2e80300f9e0030091L16;FFab831ff8e90700b46901088bf91b00f9f9031faae90700f9b8db3da9b5831ef87701198bf80240f9f", + "4ce43a9fa3245a91f0700b1600b0054e96e41a9fc1240f9BBBBBBBL8;FB73746174653a20c00076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f63727970746f2e7273002e526563656976657220L8;FFe0031f2ae3031faaef9d0094e8a3463920feff9000803691", + "23feff9063801b9124feff9084003791a21300d121038052a8c31f38009e0094ff4302d1fd7b03a9BL8;FFfd7b43a9ff030191c0035fd6e80741b2e0030091e80300f9cd280094e10300aa20008052fd7b43a9ff030191c0035fd6e5300094fd7b43a9ff030191c0035fd6L8;FFebe300395b8108aae91b0", + "0f9570100b50d000014a003df3cfbfe48d3fa03172ae00f803d20000014fa031f2a39008092b70000b4e00315aae10317aa22008052BBL8;FF220080522300805224008052daedff97a1035ef822ffff17a0c300d1e10317aae20318aa2300805224008052d2edff97b7035ef8ba035df8480317cb1f0308", + "ebL8;FFa0fdfff000603a911c5e0094e00313aa2200805286010094610a40f9b0ffff17e00313aa2200805281010094610a40f9b9ffff17e00313aae10318aae20316aaBL8;FFff0302d1fd7b03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf40", + "301aa49efff97e80300aae00301aaL8;ZDBBBL8;FB11000000000000006001000005000000650d40000000000011000000000000006501000005000000650d40000000000011000000000000006901000005000000L8;FF09fd46d30800098b080500911f0109eb281f005411000014f6031faa938640f97", + "f0600b180270054802204916debff97080040b20811c0da081540d2080d088bBL8;FFe0179f1a841701948826403969264039b502000a1f01096be0179f1a7e170194882a4039692a4039b502000a1f01096be0179f1a78170194882e4039692e4039L8;ZFBBL8;FFea0f00f9e3430091083e0194fd7b43a", + "9ff030191c0035fd6202040a941ffffd0219c3291030d40f922038052fd7b43a9ff03019160001fd608200091200440a9L8;FFa0031df881fdff9021e4139143fdffd063500291a0c300d1420180528400805223000014a0031df881fdff9021e4139183fdff9063501491a0c300d142018052L16;FF0881", + "2091e1430f91fc3340f9e3031d9162008052f8eb01f9e9a703f9e9af03f9e8b303f9e1c8ff970900809288018052f0031caae8270ea9fadb4aa9ef3b47a9BBBBL8;FB706f6368203d3d2073656c662e63757272656e745f65706f6368202b203100003d04400000000000490000000000000069010000090", + "000005369676e616c2050L8;FF29194a8b29050091280108ab02080054691e40f9090100b4290140b22911c0da291540d2290d098b2925019129fd46d329050091280108aba2060054694240b9BL8;FFe063813de167813de8a305b913080014f37740f99f0600b140090054e01bc13de11fc13de9830291", + "e88344b9e1a30c91022780522041893c21418a3ce9830291L8;FF090180d2e8031faa0900f0f229017fb2e9af00f9291d00120afd60d30801092aeadb00f9e81f01b9e8cb00f9e8c700f9e18b40f9810000b4e09340f922008052BBL8;FFc0035fd6e0230091e1031faa220080522300805224008052d7dd", + "ff97e02341a9a1ffff17e0230091220080522300805224008052d0ddff97e10f40f9b7ffff17L8;FF482740f91f0500b120030054592f40f95b6340b9991100b4542b40f969520094e00319aa2100805262520094c01300b4e10314aae20319aafc0300aa65520094L16;FFe00308aa6a0200f9ff074091f", + "fc30091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a82fdcff17e00301aa190340f909a0c0a90a0c41a90078c03dBBBL8;FFbf0208ebc9cbff54e00313aae10317aae20315aa2300805224008052d6fdff97770a40f956feff17f50300aae00313aa220080522300805224008052cefdff97L", + "8;FFe1d342f976fcff17e04316912200805287110094e1d342f981fcff17e04316912200805282110094e1d342f99efbff17e0431691220080527d110094e1d342f9BL8;FF4b160094e10340a92aa040a9290040f91f1040f15369283808050091280800f903feff540b7c07533f0108eb6b611932000100", + "544b692838080500911f0048f1L8;FF3f000071830c00b921a09f1ad6020e91e6ea009143008052b51600126420c11a84040051c57a66f86320c21a42100012bc001c8bdc7a26f8641a00b942001b32BBL8;FF9f0600b1e0a5ff54f5a749f9f3a349f9950100b47622009104000014b50600f1d6620091e0", + "000054c1825ff881ffffb4c00240f9220080525f320194f8ffff17L8;FFe10315aa220080526b320094da0e009123000014fa074bf9fb0b4bf9e0e31791f90f4bf9fc134bf981e20091f8174bf9f51b4bf90227805266320094f7e742f9L16;FFe00314aa026e805272b20094ff031491f44f42a9fc0b40f", + "9fd7bc3a8c0035fd6fd7bbca9fc5f01a9f65702a9f44f03a9fd030091ff8317d1ff0300f9f40301aaBBBBBL8;FB6b65792061677265656d656e74696e76616c6964207369676e6174757265206465746563746564696e76616c6964207072656b6579206964656e746966696572L8;FFe10f40f9820108cb", + "a002088b198100d1b3c303d13400028b6e9a0094a80357f880030191a1c303d122008052b7c303d108050091a80317f8fa95009428e37a92BL8;FF166105a9096100b9fb0800b4a8035ef81f011ceb80080054560b40f9586340b9360500b4540740f9661a0194e00316aa210080525f1a0194000c00b4e1", + "0314aaL8;FFe1f7c53de00b813de0fbc53de31f813de207813de1831fadea2b02f9e4fb803d3f0500b140140054e12fc13de02bc13d2afdffd04a213891e233c13de86f02f9BBL8;FFe083ca3ce183cb3ce283cc3c77ca00b968ea00b9a8835af869da0179a9035b78a8031cf8a9831c78e9a341a9600604", + "ade083c63ce183c73c622a803de283c93cL8;FF08c11f91e86f04f948008052e86b06f9a8fdffb008c11d91e86f06f9e85706f968fdfff008ed0a91e86306f908078052e97b06f9e9c32291e86706f9280080d2L16;FF3f100071e00200543f140071200500543f18007121030054e8d341b968000037fce", + "b00f9ffdb01b9c1d20191a2c303d155e9ff97404000b5e1031faabaffff17BBBL8;FFe0031faaf44f44a9fd7b43a9ff430191c0035fd6e00302aaeb880094e80300aae00301aae10314aae8f80737d3ffff17e0030091e82b00a9d7780094ff4301d1L8;FF291540d2290d098b2925019129fd46d3290500", + "9104000014f4031faa64000014e9031faaea8b92b92a0100344a0140b24a11c0da4a1540d24a0d0a8b4a250191BL8;FF61040054691a40393fa5017101040054691e40393f910171a1030054692240393fe900714103005473260091baffff17e0230091e10313aaf40308aa4cffff97L8;FF6f0148b21f0", + "10d6ae8118b9a9f010e6a0b014fb26d11889a1f005af2ad014eb26b018d9a9f010e6a0d40c4d26f11889abf0120eaed014db2ab018b9a9f010e6aBBL8;FF290d098b2925019129fd46d32905009102000014e9031faa280108ab42020054090040f93f0500b1a0010054090840f92a0140b24a11c0da4a15", + "40d24a0d0a8bL8;FF19008092f9eb01f9a87300b4090380527b7640f9fa031faa086d099bf583249138008052e86300f911000014e8e341f9090680528003c03dc822099bc9060091L16;FF6381cd3cfb6b00f9ef0314aae10319ad6081cf3cecd343f9e8a301f9e86b44f9f2b743f9e20317ad6281c93cf", + "1bb43f9ed7344f9e0bf43f9e3035e39e4c743f9BBBBL8;FBcd31c621db11d001e171ea61f751fc4195b19ea183918881b9f1b2e1afd1a4c1ec42e752fa62f172c002cb12d622dd32b4c2bfd2a2e2a9f2988293928ea285b2L8;FF410080526b8a0094e00b00f9a01100b46c8a0094e00315aa41008052658", + "a0094e00700f9e01000b4668a0094e00315aa410080525f8a0094401000b4f70300aaBL8;FF60630291f0e4ff97f3db52a9960100b47722009104000014d60600f1f7620091e0000054e1825ff881ffffb4e00240f922008052600a0194f8ffff17e89340f9L8;FF5f1d00f12b692138c90d00543b6928f8", + "08210091e80f00f9e083c03ce80f40f96002803d680a00f9f44f47a9fb1b40f9f65746a9f85f45a9fa6744a9fd7b42a9BBL8;FFf9000094a082c23ca182c33ca282c43ca88358f8e08705ada082c53ca103d93ce82700f9e28306ada082c13ce18304ad3a2f40f9fb3300f99a0700b4080d8052L8;FFea00", + "ff9740030035e003c03de80b40f96002803d680a00f9fd7b43a9f32340f9ff430191c0035fd6664a0094c0008052210080525f4a0094c00200b4a8cc8752L16;FFe0430f91e1031d91e20319aae3af03f9e8a303f9e86b40f9e04b823de0c7c33de8a703f9e8fb40f9f6b303f9e8ab03f9e8bb40f9f5bf03", + "f9e8b703f9e8ff40f9BBBL8;FFf9e240a9e2031aaa000400ade00319aae10318aa0c0200941f0400f1612f00543f0018ebe2310054080d8052f6031aaa3964089b3a2340f9281b40f95f0308ebL8;FFfd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aa810000b4600640f92", + "2008052626a0094610e40f9810000b4601240f922008052BL8;FFf44f45a9f65744a9fd7b43a9ff830191c0035fd6ff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091081c00121f09007181010054e00302aaL8;FFe90300aa1fbd01383fcd0138e80300aae90300aa1fdd01383fed01", + "381ffc0138c0035fd6000002abe8779f1a5f0000f1e9579f1a2801084a8801003708409952BBL8;FFe84346391f05007180020054881245b8e99741b9e00315aaeb2b5aa9a80318b8e8c34639e93200b8e9cf40f9e8631139a8f31938e8430691ea2b02f9e97200f8L8;FFc902088b08011a32200500ade0", + "0b44ad200901ade8ff07391a00001409108052e1830191160101d1220108cbe98301913a01028be90306912001088b652a0094L16;FF96008052e80b40f916693538a8060091e083c03c6002803d680a00f9f44f44a9f65743a9fd7b42a9ff430191c0035fd6d6008052e0ffff17e023009102048052BBBB", + "BBL8;FB616420c012206d657373616765732028696e6465783a20c00b2c20636f756e7465723a20c00129001a73657373696f6e20737461746520636f72727570742066L8;FFf8030091190380523a0080520c000014e81340f9a003dd3cf70600918823199ba9035ef89c070091ff4200f10001803d0909", + "00f9fc1700f9800d0054e85a199bBL8;FF610a40f9680240f91f0101eb20050054680640f9090280522a0400916a0a00f909692138e10313aa1bfcff97818a40a960008052e30313aa6dfaff9788824039L8;FF975a00a99a6e01a99c1200f98282823c8182833c8082843c68320039f44f5aa9f65759a9f", + "85f58a9fa6757a9fc6f56a9fd7b55a9ffc30691c0035fd6e90740f9BBL8;FFe02300918002803d880a00f9690a00f96de2ff97df0600b1e0079f1af44f5ca9f6575ba9fc5f5aa9fd7b59a9ff430791c0035fd6fd7bbaa9fc6f01a9fa6702a9L8;FFfb8706f9e85f06f9e86706f9e83740f9e96306f9e86b0", + "6f9e87306f9e82745a9e96f06f9e89b06f9e81340f9f98b06f9e8d306f9e8274529f48f06f9f69306f9L16;FFf50b40f9fd7bc3a831eaff17e00313aa22008052230080522400805244020094610a40f9d9ffff17f50300aae00313aa2200805223008052240080523c020094BBBL8;ZBL8;FFf2bdff97f4", + "3349f94083c03ce83f49f99f0600b1e04f823de8a304f9c0120054f8432591fc074091a182009100830091027080529c830191f9431591657e0094BL8;FFc3feffd063a03c91c4fefff084c00391a20700d16105805207fa0094c0feffd000203d91c3feffd063a03c91c4fefff084e00791a20700d16105", + "8052fef90094L8;ZFBBL8;FF61828d3ce08745ad69220f29e8a741296182813ce20748ad6082803ce037c03d69a200b9e94740b968be0239e88340b969c20239e90b417968120bb8e8e34139L8;FF00013fd6010740f9810000b4020b40f9e00315aa683e0094df0600b1602f0054e84340f9f86340f9e08", + "32491f69304f9e89704f9e85b40f9f79b04f9e8a304f9L16;FF3f0400b140010054810000b4e0eb41f92200805268be0094e1f341f9810000b4e0f741f92200805263be0094ba0000b4e0c741f9e1031aaa220080525ebe0094BBBBL8;FBa28c926eed22000052a40c87415afd8c210dbdee0afa8b2e98bb", + "0f14d86a9b2209ee06fade90efd5fa320668af820d0e7026764ed9ccd4c2a4e4d2aa0b66dfa4L8;FF28e11f78080500913f0308eb2a45007861ffff54e8031faae9031faa8a060091ea1300f91f0308ebe00000544a6b6878081100915f21296b2905009140ffff54BL8;FF02028052e3feffd063141b918", + "4018052e3000014e05306f9e0833291e1feff9021203f9102028052e3feffd063681c91c4018052da000014c80080d2e0a33239L8;FF6bcd3d91e02b01a9086140f8090000f9c9008052eb2702a9e08740ad086000f8e80741b2682a00a9608600adf44f45a9f65744a9fd7b43a9ff830191c0035fd6BBL8", + ";FF08010251e900f8374a00805208a800a91f0000f9fd7b44a9ff430191c0035fd61f114071c30f00542908c0392a1d001208390a0b08114051e900f8376a008052L8;FF29fd46d30801098b130500917f0209ebe90b0054088c5cf81f0500b1e00900541efeff97080040b20811c0da081540d2080d088b", + "0825019109fd46d30800098bL16;FFe0cb42f9f2db42f9e8a71aa9e92b42f9e82f42f9e9a309a9e83342f9e95b42f9e8df00f9e83b42f9eb2315a9e83f42f9eb5742f9ea2318a9e84742f9ea4342f9BBBL8;FFf6d340f8886a0094e83340391f090071a0010054bf02086b61010054e9d340f8e85341f8df", + "0209eb800248fae0179f1af44f44a9f65743a9fd7b42a9ff430191L8;FFffeb01f9e80303b928008052e8ef01f9080480520800ac72810101ade80b02f9e8430f91fff301f9e80302f9e90702f99a6cff97a0420035fbef41f9e6f341f9BL8;FFe00313aae01300f9a1fefff021d41091a3fefff06330119", + "1e083009122028052a400805211000014e10740f9e10000b4e80b40f9f30300aa22008052e00308aaL8;FF3f0000eb4294821adf00026b8d030054e00315aa23fdff97f40300aac00b00b4e20213cbe10313aa5f0015eb4290959a68eeff97e00313aa37f9ff97f76343a9BBL8;FFa8350054e8cf42f9e10", + "319aae20318aa00011a8b6f2e01944803188be8d302f9f89749f9f90b40f9780300b4e1d342f9e8cb42f9f99349f91f0101ebe0350054L8;FFf90b4bf91a00f0d2fc0f4bf9f8134bf9f5174bf9e83740f9880000b4e00746a922008052642e0094f7030291e11b42f9ffe71639411400b5a4000014e8833f", + "91L16;FFe10f803dc20200ade30342adc40601adc30202adb40000b4601e40f9e10314aa2200805264ae0094612640f9610500b4080a805218000014611a40f908008092BBBBBL8;FB750000002e00000042024000000000006a000000000000000e00000026000000496e76616c6964496e7075744c656e", + "677468496e76616c69644f75747075744cL8;FF22008052a0073eada08b7bada00b3fad0492009400e4006fbf0318f8a0833aada003973ca8da77d3a0877aada10301d1e00314aa22008052080d17aaa0073eadBL8;FF080113abe302005400ffff9000602e911a120194f3031faa088c48f81f0500b121e", + "fff54e8031faa080113aba301005400ffff9000c0249110120194e8031faaL8;FF6d160094f62b40f9e0031aaa01c480522200805268160094e0031baa018c81522200805264160094fae340f91d00001458ff78d3fb031aaa5a7c085348fc60d3BBL8;FFb400f8b6f7031faae00317aae10314aa0152019", + "4f75b04296a560194e00314aa210080523700805262560194e0feffb4e95740b988008052f60300aab4033ba9L8;FFf63f42f9f43b42f9c80240f9680000b4e00314aa00013fd6c10640f9810000b4c20a40f9e00314aa635600941f0b00b1fa432791c100005420afc03de82344f9L16;FFe9d743f91f05", + "00f1e0d7823de9b305f9412e0054e0d7c23de8b345f909008092e0030b91690200f96082803c680e00f9ffdeff97c20100143f03086b02010054BBBL8;FF080117cbbf0208ebc8300054680640f9e10316aae20315aa0001178b6d760194e802158b680a00f9951640f9550300b4610a40f9680240f99612", + "40f91f0101ebL8;FF080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308eba82400546e010014e1d342f9e8cb42f9f6074091d68209911f0101ebBL8;FFf30b40f9fd7bc2a816000014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd03009101c840f9f30300aa8", + "10000b460ce40f9220080525ff6009461d640f9L8;FF734200d11f0013eb41ffff54020080d2efffff1780ffff97140080d281018052010000b9030000143406009440fcff34e00314aaf35341a9fd7bc3a8c0035fd6BBL8;FFe37bc33de183c33d2083853ce08bc33de8cb02f92183863c2283873c20838", + "83c2383843c20010054e0f3c63de1074091e043169121800991f53309f9fb3709f9L8;FF09078052e85b05f928fdffb008a52891e95705f9290080d2ea5f05f9c93bc0f2e86b05f9c8048052ea4705f92afdffd04aed0a91007f803dff4305f9e84b05f9L16;FFf503082a08018052edfdff1719df78b3f5", + "7740f99f0700b160020054970100b4b422009104000014f70600f194620091e000005481825ff881ffffb4800240f9BBBBL8;FB0100000000000000a457450000000000ef104000000000004e00000000000000b904000017000000ef104000000000004e000000000000005707000005000000L8;FF6909", + "c05a88260329884640f909208052800640ad282508aa080dc0dae00700ad9f2203a9820241ade20301adfd81009400e4006f9ffe003988264d298a2e4e29BL8;FFa04303d102048052b44303d195eaff97e8ffffb008012391e92740f9b42338a9e8ffff9008610491a92339a9e8feff9008810c91c90480", + "52e8c302f9c0feffb0L8;FFf5d245a9340200b4b982009104000014940600f139c300918001005421035ef8810000b420835ef8220080526206009421835ff8e1feffb4200340f922008052BBL8;FFb8035df83700001441fffff021e0009143fffff0635c0191a0831cf821000014a0831cf841fffff021", + "e0009143ffffd063e03c91a0e300d1a201805204028052L8;FF75fe41f974fa41f9a80240f9680000b4e00314aa00013fd6a10640f9810000b4a20a40f9e00314aa63460094608205917600009461c641f9810000b460c241f9L16;FFfc7344f9e77744f9e07b44f9e9ab1aa9eadf43f9e9e343f9ee7f44f", + "9f58344f9eaa709a9e9e743f9eaf743f9e9df00f9e9ef43f9e9af00f9e9f343f9e97700f9BBBL8;FFe81b40f9e003803de80b00f90c000014e8a742a9a82739a9a8c301d1290000f02961129180ffffb000c01091e8a703a9e8030091e1e3009116620194e8030091L8;FFe10340a9ea0314aa2ba040a929", + "0040f97369283808050091280800f920fcffb63f0108eb400300546a6928380805009120008052290040f9280800f93f0108ebBL8;FF21101391a3feffb0633c1391e00300916201805264018052eaffff17e80f41b2dcffff17e00300f9a1feffb021681391a3feffb0639013910f000014e00300f9L8;Z", + "DBBL8;FF3f0400b1e0fdff54810000b4c00640f92200805268260194c10e40f921fdffb4c01240f92200805263260194e5ffff17680240f9c80000b409e179d3e00314aaL8;FF081c00121f090071e1010054e00302aaf40302aaf30301aad8000094e80300aae00301aa08020037980240f9080740f91f0", + "100eb42020054e80f41b2e80700f9L16;FFf85f05a9f65706a9f44f07a9fdc30091f403032af30300aae20000b5d4000035280080527f0600f9687e01a97f0200f92f000014281c40f9080102ebe3040054" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines2 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines3.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines3.lean index 90942b46e..2b9b2bfc3 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines3.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines3.lean @@ -27,360 +27,252 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub3 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FFa1030054df010d6bc0fbff541a0000146e310a2aea0d0091d5ffff17ff81007140010054ffc1007161020054df0d407180faff5410000014ce1d40928e696e38L4;FF1f0048f1280800f9a202005400fc4ed354000014e00700f9e00301aaf30301aae10309aa22008052230080522400", - "8052f4030b2abf0000946aa240a9e00740f9L8;FF0001805201058052fd1f01948002009000201491e51f01948002009000801491e21f0194010440f918010014ffc301d1fd7b03a9f85f04a9f65705a9f44f06a9BBL4;FFe08743adf80300aab40600111b04805216048052000400addd9f0194e00316aa", - "21008052db9f0194802300b4e10318aae20316aaf30300aae19f0194e10e40f9L4;FF8bfcff546300080b9f00036b2afcff54211040f93fcc74f22001005421cc749223fc44d3630400d17fc024eb23fbff54244000d1ff1040f2a0000054010000d0L8;FF34a0009434a00094f44f43a9fd7b42a9ff0301", - "91c0035fd6000040f9a6040014000040f9f01b0014ff0301d1fd7b02a9f44f03a9fd830091140040f9e00301aaBBBL4;FF8188005409e001941f10003101880054f9ffff1706e00194f70300aa1f0400b141fdff54e04305918100805201e00194e0860035e85341b9e87300b957ffdfc8L4;FB2f696e646", - "5782e6372617465732e696f2d313934396366386336623562353537662f62797465732d312e31322e312f7372632f6c69622e7273002973697a6520L8;FF29219f5a291d0072eba300f90b4953a9ea1300f9112951a9607700543f05007141f50054890080520a008092790a00f969220039e00308aa6a02", - "00f9ff074091BL8;FFe10200d021c00791144c04291fa00039f44f42a9f65741a9fd7bc3a8c0035fd60001805201068052f55f0194fd7bbea9f44f01a9fd030091f30301aaf40300aaL8;FF230100d063b83791a0c300d1420180528400805223000014a0031df8210100d021443791230100d063b03791a", - "0c300d142018052440080521a000014a0031df8BBBBL4;FFdf020f6b20020054c90500d12e010eeac1feff54428c202e42a8302e4900261e690600378c210091a0010c8b0d000a8a02696dfc438c212e6900669e2ec101f2L4;FF00000000000000002750001400000000000000000000000000000000000", - "000000000000000000000000000000000000000000000000000000000000000000000L8;FF2b0180520a0000144d254039bf0500f1c80100548c1900126ce10c8b81fd0daa3f000beb030500544b018052e0031faa4a010b8b29010bcb0a2500a9fd7b43a9BL8;FF010300d021082a91040300d084e01291", - "e0030091a363009142018052a80f00f92c800194010300d0215424912403009084a02391a363009142018052b30f00f9L8;FF490480522a040091e00316aaea1700f909692138e16300912e80ff97f81740f9e80f40f9080118cbdf0208eb88840054e81340f9e10317aae20316aa0001188bBBBL4;FF7bb", - "f0194740640f9d70000b4e806178b80620091e10314aa02f17dd3e2bf0194a002c03da8035ef8e9060091e02300918002803d880a00f9690a00f92ea9ff97L4;FB447c4900000000002d0000000000000008010000050000006c69627369676e616c5f70726f746f636f6c3a3a73657373696f6e73657373", - "696f6e5f7665727369L8;FFb70000b4e00318aae10317aa22008052e3bf0094f7830291e10314aae00202917f140094e0e202918142089171160094e00fc13de20bc13de107c13df66b00f9BL8;FFff030191c0035fd6e0031faaf13f0194e00741a9ef3f0194ff8302d1fd7b06a9f73b00f9f65708a9f44", - "f09a9fd83019128008052f30300aa3500028bffa300a9L8;FFa9020094770a40f9680240f9080117cb9f0208eba9fbff54e00313aae10317aae20314aaa0020094770a40f9680240f9080117cb9f0208eba9faff54e00313aaBBBBBL4;FFe70f0294e11340f9810000b4e01740f922008052e20f0294e11f", - "40f9810000b4e02340f922008052dd0f0294e12b40f9810000b4e02f40f922008052d80f0294L4;FFe9ab58290a71003909750039e9ab57290a790039097d0039e9ab56290a81003909850039e9ab55290a890039098d0039e9ab54290a91003909950039e9ab5329L8;FFe0630091e1030091e2031f2a08", - "0dc0da290dc0dae92300a9cbfdff97e90f40f9e83740b9aa058052e1630091e00313aa82048052e90f00f9e92f4429a8831fb8BL8;FF280080527f0200f968220039ff074091ff830a91f44f42a9fc5741a9fd7bc3a8c0035fd62000805201048052f48f0194ff4307d1fd7b17a9fc6f18a9fa6719a9L8;F", - "Fe91700f9620100d042081091e9a301a9e3430091ff8f0094fd7b44a9ff430191c0035fd608040091200440a9a94300d1eaffff904ac13491a8031ff8620100d0BBBL4;FFe0031baa40060094746b40a97c0f40f941ffff1748040091e00314aae1031aaa1f0114ebe40318aae933949a030109cb630b00f", - "9aceaff97d60600d1f803132aL4;FB0000000000000000aa6211b800000000000000000000000000000000000000000000000000000000056bda5e01003010df98e7bf90f48e9e0000c2ab2e6a2379L8;FFe1f7803de8f301f9280200d008b140f9eacf40f91f0900f1e9030054a801009008c1049129038", - "052e86705f9e80100d008c12591e8a303f9e00100b000f43791BL8;FFe10319aa22008052e54f0194e12740f9010b00b4e00315aa54000014e88241f8e082c03ce9c302916a0100f04ab13991c00200d000982b91e86300f9e8630191L8;FF08111d91e9d702f9c9048052e8cf02f9e8632291000100d000", - "d81791e8d302f9080100d008013091e1031691a30302d1a82738a962008052a82739a9080100d0BBBBL4;FFe00742ad600601ade00b43ad600a02ade00741ad600600adfd7b4ba9f36340f9ff430391c0035fd6ff0303d1fd7b0aa9f35b00f9fd83029100e4006ff30308aaL4;FB656e744d657373616765", - "00000000000085924800000000003300000000000000210700000e000000696e76616c69642027726563697069656e74272070617373L8;FFa3efff9740fd073728fc60d3e80400b5200840921f1800f102050054217c0353210500343f040071e00100543f0c007161fdff54888246f81f0500b18100005", - "4BL8;FFf30300aa1f6c00b93f0400f18b000054601240f922008052e16f0194611e40f914008092740e00f93f0400b140010054810000b4602240f922008052d86f0194L8;FFe0ab49f9800100b4e1d342f9e8cb42f91f0101ebe0660054e8cf42f9090180522a04009109692138e1431691ead302f96f0d", - "0094df0600b18000005480020391BBBL4;FF681e043969f20ff8788600f97c42043909fdff1740c3c13ce0030491a14301d1a0039b3c2a400094e83b40f948f1ffb4e02740f9e13b40f922008052d8af0194L4;FFfd7bc1a8c0035fd6c0035fd600000000210000f02074483960010035200000f02200805", - "22274083900a440f9c00000b4210000f020dbff902180089100000091L8;FFe3af00940008805221008052e1af009420eaffb52000805201088052edaf0094e0031f2ae1080094a1835bf8fa03002a81f7ffb5beffff17e91340f9e093c23cBL8;FFe8b305f928008052e1833291e96f06f9e95706f98902", - "00d0292d2291eaa705f9ea032d91e86b06f9880200d0084d2591e96306f9290080d2e87b06f9c8048052L8;FF080d40f900013fd6607e02f9618202f9acf4ff17e000009000200891e200009042800891e1028052fe2f0094e8ef41f9e9f341f9c00000f000343a91e3000090BBBBBBL4;FFc10000b4820a", - "40f9e00313aaf44f41a9fd7bc2a8e2170214f44f41a9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091086040391f0d0071a101005413d040a9L4;FF22008052e6170094e80741b2a90000d029a13191d5018052ea008052fa0316aadb01805203000014e97b42f9ea7f42f9e0431391e86b02f9fb6f02f", - "9fa7302f9L8;FFe10309aa40013fd68a0a40f94a0115eb230400548b0640f9750a00f96b01158b8baa00a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6090440f96a0200d0BBL4;FF800a40921f1800f1221c0054817e0353411c00343f100071ec0100543f0800716c0300543f040071200600543f0", - "8007141faff54a80352f81f0500b1000d0054L4;FB09000a000c000f001200140019001f0024002a0032003f004800540066007f009200aa00cc00ff00240154019901ff014802aa023203ff03910454056506ff07L8;FF4901084aaa435738a92317386901084aab535738a93317384901084aaa635738a", - "94317386901084aab735738a95317384901084aaa835738a96317386901084aBBBL4;FF3f0500b180040054fd7bbca9f70b00f9f65702a9f44f03a9fd030091a3040036097c40f93f0500b140040054f603022a028c40f9f303032af40300aac40300b0L4;FB3766353665333634356363642f3036393539", - "62342f7372632f636861696e2e7273002f636172676f2d72656769737472792f696e6465782e6372617465732e69L8;FFf7af45f9e84700f9e86745f9e1cf45f9fbd745f9f8df45f9f9e345f9e86b00f9e86b45f9ece745f9eff345f9fcf745f9f4fb45f9e8fb00f9e86f45f9e0ff45f9BL8;FF1f0308ebc", - "8be0054e8cf42f9e10319aae20318aa00011a8be95701944803188be8d302f9e06749f9f90b40f9800100b4e1d342f9e8cb42f91f0101eb20bf0054L8;FFa0077dade22f833de137833de033833da1efff5400230191f58efe977affff17e81f46f91f0500b1e1000054ff1f06f9f62306f9ff2706f9ff53", - "0cb9ff2f06f9BBBBL4;FF080000f9080400f0088135911f30003960a200a9090d40f9e803009120013fd6e80340f91f0d00b100fdff5475da40a9e00740adc80240f9e08701ade00bc03dL4;FB63616c6c2027c003273a20c0001f696e76616c6964207365616c65642073656e646572206d657373616765", - "3a20c00026756e6b6e6f776e207365616c65642073L8;FFe1031faae8ffff17e10314aae20313aabbf6ff97800500b5e1031faae2ffff17400600b5e00313aa99f7ff97e80301aa80000036a80600b5e1031faadaffff17BL8;FF22008052e6770194ff0600f1ab000054e03740f9e10317aa22008052e07", - "701945f0700f12b010054e00315aae1031aaa22008052da770194040000149f0b00b1L8;FFe91b0af9e9eb4df9e81f0af9e8270af908788052e82b0af9e8330af988230f91f8230af9fb2f0af9f6370af90001803de91f0bf9f6230bf9d9770094f43349f9BBBL4;FFf4b70194ffc302d1fd7b05a9fc6f06", - "a9fa6707a9f85f08a9f65709a9f44f0aa9fd430191fb0305aaf80304aafc03032af503022af90301aaf703002af60308aaL4;ZDL8;FF4b8500917f0103eb280400542bfd50d3eb0300b54a0500d14a000a8b4b2140b84c0d40794091c03c4121c13c4a214039ab431eb8ac831e78e00b803de193823cBL8;", - "FF1f0500b1e0030054e00313aa40000094080040b20811c0da081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aa080c45f8L8;FFea3301f96ac61291e8a30939683144b8490100b969e21291ea0342f968b604b9682213912001803de9ff41f90101803de83341f96", - "96e02f9e9a34939687602f9BBBBBL4;FF168800f9f70300aa01500491e003082ae20303aaf80303aabbf2ff97200100b460000014f70300aa01800491e003082ae20303aaf80303aab3f2ff97400c00b5L4;FFe4070094e10318aaf30300aa2000805273feffb4285440a9f4cf00a9ff0f00f9bf0214eb08", - "070054f4031faae9031faaf50000b46002148be10308aae20315aaL8;FFffc30091c0035fd6080840f9880100b4090140b22911c0da291540d2290d098b2925019129fd46d30801098b000500911f0009eb89000054c0035fd6e0031faaBL8;FF690a40f9c90500b42a0140b24a11c0da4a1540d24a0d0a8", - "b4a25019129194a8b2a050091691640f94801088b090100b42a0140b24a11c0da4a1540d24a0d0a8bL8;FF40008052e10313aaf287009440008052c1008052ef87009440008052e10318aaec8700940001805201098052e98700940001805201038052e687009400018052BBBL4;FFa0050054e1030691a2", - "6301d1afb1ff9760f8ffb44d000014888f40f91f0500b1e002005461630091a26301d1a7b1ff9760f7ffb44e000014e8d341b988f60737L4;FB7061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f76312f6368756e6b656", - "42fL8;FF11000014350080527a0400b4fc031aaadfc70094e0031aaa21008052ddc70094c0bb00b4e17740f9e2031caae05f00f9e3c700941a000014590080529f040014BL8;FFc003005436d77fa9e00314aae10313aa8f010094e00315aae10313aa8c010094770a40f9680240f9080117cbbf0208eb68", - "00005455fdffb5f0ffff17e00313aaL8;FFa3feff54e90f80123f002071ea0f801229140033c20000542a7c0653090500394a051a320a01003912000014eb0f80122c7c10532b2c0633ec0000352a7c0c53BBBBL4;FF08b51e91682b05a98a068052480480527f2700a9c90300f029d50591692b02a92900", - "80d2891cc0f2687f01a9682704a9e7e70194d6e701948004805221008052L4;FB4b65795265636f7264537472756374757265000000000000382140000000000020000000000000000800000000000000c89d4000000000008c21400000000000L8;FFa083d23ce10316ad002100b4f40300aae0030b91a0", - "e2ff97e00314aa342300b458010014a2c303d1830c805242e1ff97802200b42b010014c1020291a2c303d1BL8;FFfd7bc3a8c0035fd62000805201c48052fb670194ffc304d1fd7b0fa9fc5f10a9f65711a9f44f12a9fdc30391130440f9b300f8b6f6031faae00316aae10313aaL8;FFf8430691fb0c809", - "2e02340f9080d8052826f089b0080c23c1a0040f901a00191e00a803d0080c33ce00e803d0080c43ce012803d0080c53ce016803d0080c03cBBBL4;FFe3feff17a04301d1e10319aa220080522300805224008052f59aff97b9035cf8f0feff17a04301d1e10319aae2031aaa2300805224008052ed9aff9", - "7b9035cf8L4;FF601640f9a002008bea090094730240f9f7ffff1739430691e00316aa211740f9e16a38f8da6200f9f35341a9f55b42a9f76343a9f96b44a9fd7bc5a8c0035fd6L8;FFf90b40f9290080521ffd0071ba0218cbe803082ae9830039a1faff5409088052e1830091220108cba9c303d120010", - "88be3a70094a80357f880030191a1c303d1BL8;FF61f2c23ce8ff0c39a84302d1e0cb803de1f2803c09280194e8830c91e0030c91e1430691a24302d145280194a84302d1e0830c9103280194a04302d1e10313aaL8;FF000300b50e00001428008052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0", - "035fd6d30100b4d9270094e00313aa21008052d7270094400100b528008052BBBBBBBL4;FF000308cb02018052e51b0294e8ffff17e003032ae91b0294f40300aae5ffff17ffc302d1fd7b05a9fc6f06a9fa6707a9f85f08a9f65709a9f44f0aa9fd430191L4;FFf90318aa810000b4e00315aa22008052e", - "31b00948003c03d80e20091e1230091022780529b6a00a9976601a9961200f98082823ce21b00942800805268420039L8;FF600200f000401291630200f063c01191640200f084e02291a20700d161058052ef1b019408fcdfc8a8000037080940f91f0500f1e0179f1ac0035fd620008052BBL4;FFeaf35", - "239ed6b5339fcc35339ee6f5339ea730929eaf75239ef735339fcc75339f0775339ea730a29eafb5239f17b5339fccb5339f27f5339ea730b29eaff5239L4;ZFL8;FF4a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9030054200108ab22010054fd7bc1a8c0035fd6e8031faa091c40f93f0", - "500b121faff54e00308abBBBL4;FFe1074091028c815221400f91178c8152e00319aaeadb0194e99740f908c48052f95f14a9e92313a9d9db019420c4805221008052d7db0194c00800b4e19740f9L4;FB696e73756666696369656e7420627566666572206361706163697479202872657175697265643a", - "20c00d2c2072656d61696e696e673a20c00129001a756e6b6eL8;FFe9231fa9e80f42f9e90742f9ec8b42f9f19f42f9f0a742f9e8cf00f9e81342f9e5ab42f9e4af42f9e6b342f9edb742f9e8b300f9e81742f9f6bb42f9f2bf42f9BL8;FFe0ffc33de103c43d80430891e207c43d8162019102328052e07", - "f843de183843de287843de65b0194e0074091e1074091023880520080099121800191e05b0194L8;FFf73b00b9f85b0094a2035ef8a20a00b5a08300d1b4573ea9b6031ff8b7831fb8f25b00941f04003180080054f40f40f9760080520800001400010039b402148bBBBBL4;FF0800669e18c101f2e1f8f", - "f54e6ffff1735c305d1e0430c91022e8052e10315aae7fb0194e1430191e00315aa022e8052e3fb0194e11b40f9810000b4e00316aaL4;FB08c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b", - "L8;FF8a0a00f9beffff17800400b5e00313aa9ffbff97e80301aa40010036e80400b5e1031faab6ffff17e20313aa230c805241f5ff97e10300aa20f6ffb4a6ffff17BL8;FF4a0d0a8b4a25019129194a8b29050091280108ab0303005438000014e8031faa096040b93f05007160fcff540a6840b9e8030", - "88b5f05007141fdff54096c40b9L8;FFe802158be81700f97f0600b1a086ff5480220491e16300911f90ff9731fcff17e06300912200805223008052240080528c92ff97e11740f99bfbff17e0630091BBBL4;FFe91f40b9ebe34039ea2342b8e10740f9776200a9683200b9e84f4079693203b8e91b40f9", - "a8c31a78a9031cf8e9434079e83b007969720378e91740f968d20378L4;ZBL8;FF61bc0094e2bb00940010805221008052e0bb0094c00f00b4e00744adfb0300aa000402ade00b45ad000803ade10342ad010000ade20343ad020001adb5000034BL8;FF29194a8b29050091200108ab62000054fd7bc1a8", - "c0035fd6a00200d000802891e23b0194a00200d000c02791df3b0194a00200d000200891dc3b0194e00301aaL8;FF60428f3c681601b92105803dec3b009424000014e8c30c9114000014687240f9281600b40805088be00315aa0201805201f17dd3da3b00943c008092aa0b0014BBBBBL4;FF2a040091e", - "00317aa6a0a00f909692138e10313aaf3f7ff97790a40f9680240f9080119cbff0208eb48300054680640f9e10318aae20317aa0001198be00b0294L4;FFef0b00940200001434008052e8a3009189008052e0430091a1c300d162008052f82b00b9a8273da9bb5f3ea9b4733fa9da030094bc0000b4e003", - "14aae1031caaL8;FF3fd5017101040054091440393fd50171a1030054091840393fa5017141030054091c40393f910171e1020054092040393fe9007181020054e90300aae0430091BL8;FFe10313aaf35341a9cdffff17200300b000603891e58b01941f180071cc0000541f0400710101005468008052e", - "003082ac0035fd61f1c0071a1000054e8008052L8;FFf40300aae28b00944000805241008052e08b0094a07b00b4f70300aadc8b00944000805241008052da8b0094e07a00b4f80300aad68b00944000805241008052BBBL4;FF20053eade00a40ad20093fadf44f4da9f6574ca9f85f4ba9fa674aa9fc6f", - "49a9fd7b48a9e923476dff830391c0035fd6c2820091f50300aae00316aa21008052L4;FB6e792073697a65006a224900000000004d0000000000000018000000260000004132424232410000000000000000000008000000000000000800000000000000L8;FF355800b4e0030aaae10315aa22008052e3", - "cb00945b008052da0400147caf45a9773740f974a740a96d3f40f96ae341a99f0700b1eb7700f97adb42a975bb43a9BL8;FF080d8052e92340f90827089b29008052097d02a9090180521a7100a91c0700911a7d01a91f2503a91f2100f92003c03d0081843c2007c03d0081853cfc2700f9L8;FF6b0d0b8", - "b6b2501914a194b8b4b0500910a3040f96901098b0a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091490109abc2040054BBBBL4;FFe00313aa21008052e2eb0194c00000b4e10314aae20313aaf50300aae8eb0194e00315aae10313aaf44f42a9f50b40f9fd7bc3a8c0035f", - "d620008052e10313aaL4;FB4e00000000000000f9040000190000007a944800000000004e00000000000000010500001400000017a24800000000004a00000000000000b602000009000000L8;FFf50b40f9fd7bc3a8c0035fd6f50300aae00313aa22008052230080522400805290020094610a40f9e003", - "15aacaffff17f50300aae00313aa2200805223008052BL8;FFc10a00343f080071ed0100543f0c0071200300543f100071600300543f14007121050054e85740f91f0500b120070054c1c20091a20301d1a455ff97e0f9ffb4L8;FFe003c63c682602a9e8008052e90741b2681a00f9080080926006803d6", - "82600a93c000014680100b008b140f9480300b4e8430191290000f029713e91a82734a9BBBL4;FFe10318aa1903028b00011c8becab0194e83340f9e10300912200805208050091e83300f9e8030091000101910fac0194ffff0039e8031aaa02fd46d31ce17a92L4;FFf44f0aa9fdc30191000280525c0d", - "0094f30300aa40038052590d0094080013aae82500b4880080527f0277f28a0080520802a072e903332a6b7e03534a01889aL8;FF53008052150940f9d50800b4b5080037130540f9deab0094e00315aa41008052dcab0094800e00b4a8fe41d3fa031faa9c630091d40600913b008052bf031ff8BL8;FFe", - "89740f91f0500b121f7ff54baffff17e89348b9208757adf7e342f9a00302d1e1031faaa80315b8e8e742f9e2031f2aea1700f9e80f00f9e8d345b9e93700b9L8;FF080118912505ff97e8034bf9f9074bf9f80b4bf91f0500f181010054281f00121f0500714c05005448090035381f4092fa0f41b2091f", - "40921b0309aaa1035df8BBBBBBL4;FF3f0108eb13601932200100542a0440f91f1040f15369283808050091280800f94202005400fc47d36e000014e10300a9e00301aae10308aa2200805223008052L4;FF21401d911cefff97f65741f9e15b41f9e8431391e00316aa75eafe97e9435339e86753393f05", - "007101010054e96353393f050071cc160054f8db40f9894e0035L8;FF690080526aa200a908038052690200b949640091696a28f8f44f44a9f65743a9fd7b42a9ff430191c0035fd61fb6007181010054480102ab220b0054a905c0d2BBL4;FFe1031faae30314aae40315aaff7f02a91adfff97208748ad", - "480300b008511e91224fc03d2343c03df5c3009169038052e0c30091200703ad200746ad2223803dL4;ZDL8;FFe90301aaf30300aa610100f021281a91e8030091e00309aac20180522c940094610100f021d01391840100d084c02691e0030091a363009142008052b30f00f9BBBL4;FFecffff17a0a302", - "d13cd50094f50301aae0c10736fa000014a0a302d137d50094f50301aa80c70736f5fbffb4e7000014f6031faa1401805208018052ff7f01a9L4;FB06f000140378059c0000689b06f003786d130000688f04b200006c3d0100a521526fb8ea3c622b414cc4421a38ebf616b7af742505cca14734f2ca579", - "cb3e1e6L8;FFe8df00f9e83742f9f8a342f9fba742f9f6ab42f9e5af42f9e8af00f9e83b42f9eeb342f9e4b742f9edbb42f9e1bf42f9e87300f9e84342f9f1c342f9efcb42f9BL8;FF4086ff548122029110010014e8031faa000119ab426e0054e14316918c0d0094f90b40f9df0a00b100040054e1d342", - "f9e8cb42f91f0101eb204f0054e8cf42f9L8;FFfc5b02f9e85f02f9e86702f9e94313390f000014e033c33de1d3c23de9c31291e8ab45f9fc5b02f9e037813d2181803ce86702f906000014c80080d2fa4340f9BBBBL4;FFe1430191a20301d1b0ddff9780f8ffb451000014ffdb06a9ff3f00f9a1620091", - "a20301d1a9ddff97a0f7ffb453000014a00301d131f50094f40301aa80fa0736L4;FBa63169e0e2eb8a3fae24f63099f85ea319c3c1c46d3454706ae2a679d1fee690a488adda98a2290b66c906bb60295ed7810a2908d786df9a07122105847c0d2cL8;FF81620091e20313aabdf2ff9720fbffb4520000", - "14e20313aa230c805246edff97e10300aad4ffff17800c00b5e00313aa97f3ff97e80301aa60000036a8f9ffb4BL8;FF5f2800f1880000542800028b08f1df38a809f837a0e300d17addff97a8835cb848110037a8835df84a0340f9490108eb631c00546a0340f9b6035df84801088bL8;FF1f050071c10", - "00054e1d752b9e2db52b9e3431691c0008052501400949f0e00b140020054e1d342f9e8cb42f91f0101eb60b70054eb074091e8cf42f92a040091BBBL4;FFe20316aa90120094e81340f9e083c23ce91f40f91f0500f1e003803de90b00f941020054e003c03de80b40f909008092690200f96082803c680", - "e00f934fdffb4L4;ZBL8;FF2082c13c321640f98cc101f122025ff82102de3ca081813c2082dc3cb28102f832825df8c28102f8220a40f9e017803d2002c03dc181813c4109c03da2031df8BL8;FF882600b4a02302d100edff97f50301aa804d0037a8fe60d3c82300b5a00a40921f1800f102240054a17", - "e035321240034280400511f390071c806005489000010L8;FF6c010014e8334ab948000037f81b05f9a02800b5a02302d12ef4ff97e80301aae0010036082900b5e1031faacaffff17602400b5a02302d126f4ff97e80301aaBBBBBL4;FF28000aca6aae8cd28a2eaff2e00702a9e00300914a8cccf2ffff", - "03a9aa8ceef2ff1b00f929000acae82701a9482440a91f0500b13401829a818a40a977890094L4;FFe92304a96f000014280340391fad0071e8179f1a4a0308cb2817999a5f2500f1c2090054aa0b00b40901403929c100513f250071880b00545f0500f1000b0054L8;FFd700009460220291f30b40f9fd", - "7bc2a8b2fdff17610640f9810000b4600a40f922008052de030194611240f9a10800b4601640f922008052f30b40f9fd7bc2a8BL8;FFfd7b43a9ff030191c0035fd60820009109400091020300d0426c3c91e82700a9e8030091090000b029011f91200440a9e82701a9e8230091090000b029411a91L8;F", - "Ffd8300914a0100d04af52091e90301aa8b0000104c6968386b090c8b60011fd608200091410100f021c01891e80300f9e8230091e00309aaa201805213840094BBBL4;FFbc835df8fb031caa628f40f802f4ffb5b90000145f2800f1880000542800028b08f1df38c808f837e0e31591752d0094e87b45b", - "9c8150037e8c742f98a0640f9L4;FB6d6573736167655f656e63727970743c6e6f6e653e6d6573736167655f646563727970745f7369676e616c6661696c656420746f206465636f64652070726576L8;FFeaa301f9ea7740f9e1d342f9080118aae90743f9e28fc13de3a3c13de187c13de48315ade08bc", - "13debaf00b9eb6740f9ea5300f9f67f42f9f4c342f9f8030baaBL8;FFc302009063b40b91e0230091020180526400805215390094e10740f9b1ffff17e80f41b2abffff17e80f41b2b9ffff17a0031df8c102009021840c91c3020090L8;FF8031c03de8c302b98b4100f8204b803d8ac100f8204bc03de8", - "d342b9090100b0290113918101c03de01b40f92043813ce1031091e8a301b9e8b341b92007c03dBBBBL4;FF1f0400b16108015408e401941f100031e1070154f9ffff1705e40194f70300aa1f0400b141fdff54e04305918100805200e40194c0060135e85341b9e81301b9L4;FB206261736564206f6e20", - "73697a65732c20616c6c2073697a65732073686f756c6420626520636f727265637400000000e4e74800000000005800000000000000L8;FFf44f05a9fd030091ff0740d1ff0300f9ff830cd1290840f9f30308aaa90700b4280500f1e00600542b0440f91f2900f14c018052ea031faaf6031faa0c318c9", - "aBL8;FF01028052fe630194fd7bbda9f50b00f9f44f02a9fd030091f40302aaf303012af50300aada6301940003805201018052d8630194400100b4155000a9e10200d0L8;FFe00313aae10317aae20315aacd070094770a40f9daffff17f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6ff83", - "03d1fd7b0aa9f85f0ba9f6570ca9BBBL4;FFf44f04a9fd030091086440a9f50302aaf30300aa220700b1e300005400210091e10308aae0a30194e9031faa080080927400001400e4040f49fc43d35f0840f2L4;FF000400519f00006b80030054450840f940008052a120403923100012211040d30020c11", - "a000400511f00046a01010054440440f95f0004ebe0020054c0021091L8;FF25a40014fd7bbca9f85f01a9f65702a9f44f03a9fd030091080040f9f30300aa1f0500b160000054e00313aa09a2ff97764240f915008092750200f9df0600b1BL8;FFf603012ae10314aae20315aa59faff97e103162a6806", - "40f9df0202710801148ba3feff54e90f80123f002071ea0f801229140033c20000542a7c065309050039BL4;FF808201ad808202ad8002803d28d776d3800642adea03172a09dbd99380020291080d0aaae103009122008052e00702ad800640ad290dc0da080dc0da892207a9L3;FB00004000000000000", - "000400000000000788208000000000078820800000000000010000000000000010000000400000000a00800000000000090480000000000BBBBBBBBL4;FF15c10192f50000b5808f40fc5a2300910088202e0800669e15c101f260ffff54a802c0da0811c0da560f488be80b40f9091b16cb000540a92201", - "01d12b190094L4;FF028d40a921a1009168130094f85b41a9f55f42a91f0b00b1e1020054770300b4e8430091e00315aae10317aa5b29fe97f80b40f91f0b00b161050054e87b4039L8;FF160040f9f30301aa20008052f40302aaf50308aac14200914f1e01942001f8b78802009008c11a91b45a01a9a8", - "4e00a9f44f42a9f65741a9fd7bc3a8c0035fd6BBL4;FFf49d0194f8c30c9107000014e0231291c182009164120094e84742f91f0900b120fbff54e0c30c91e1231291022b8052e39d0194e92740f9890100b4e82b40f9L4;FFc2001036260040b988c05fb8060000b9a8c01fb8c0035fd6020100b44efc41", - "d3260040398af05f3828686e380600003908682e38aaf01f38c0035fd61f2003d5L8;FF84e00991a363009182008052b30f00f9309e0094309e0094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aaBBBL4;FF6148005439feffb505000014e04305918", - "100805207de0194a0470035e85341b9e83300b957ffdfc8770000b500de0194f70300aaff0600b180020054f8430591L4;FB4a000000000000003f05000049000000556e696e6974536c6963655b2e2e2e5d4c61796f75744572726f722f636172676f2d72656769737472792f696e646578L8;FF288840f", - "9e82700f9288c40f9e80b00f9289040f9e83b00f9289440f9e84300f9289840f9e82300f9289c40f9e83700f928a040f9e81f00f928a440f9eaa302a9BL8;FFe003c03de107c03de20bc03de30fc03d830e803d820a803d8106803d8002803d682600294809c05a6909c05a682601298809c05aa909c05a6", - "8260229c809c05aL8;FF6a0a00f909692138e10313aa78fbff97560300b4610a40f9680240f9b70640f91f0101eb80080054680640f9490280522a040091e00316aa6a0a00f909692138BBBBL4;FFe183c03c28821ff835da7da920829d3ce083c13c21829a3c20829b3ce0060054610000b422008052ddf", - "d0194b80000b4e00317aae10318aa22008052d8fd0194L4;ZFL8;FFf44f45a9f65744a9fd7b43a9ff830191c0035fd6c80080d2e10700f90800f0f2080900d1b7ffff17e80b41b2e00700f9b4ffff17c80080d20800f0f2080500d1BL8;FF0a000014ea674039090180d2e8031faa0900f0f205000014090", - "180d2e8031faa0900f0f229017fb24a1d409208010aaa69a200a92900805269020039f44f45a9L8;FF080500911f0109eb2816005458000014f6031faa958640f9bf0600b1401700548022049124eeff97080040b20811c0da081540d2080d088b0825019109fd46d3BBBL4;FFfd7bc6a8c0035fd6e0c305", - "91e1031faa220080522300805224008052f4b0ff97e0a357a97cffff17800300d000603891debd0194a00300b000c01a91dbbd0194L4;FB75726574696d657374616d7000000000f6864900000000005500000000000000ce00000001000000726567697374726174696f6e2d6964004086490000000000L", - "8;FF800300b40804805221008052e85700a9958e40a9e02302a9e0030091e82301a9e20315aa16000094e00740ade20bc03d810240f9620a803d600600ad010100b4BL8;FF083c40f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091092440f93f0500b1400400540a2c40", - "f9093840f90a0100b44b0140b2L8;FFa8031df8d733ff97e10300aa7a000014e00700f9e10000f021443e91e30000f063a03e91e0230091a20080524403805296000014c90080d2e843003948008052BBBBBL4;FF770a40f9680240f9080117cbbf0208eb480f0054680640f9e10316aae20315aa0001178", - "be60d0294e802158b680a00f9952e40f9d5f2ffb4610a40f9680240f9L4;FF49c10af8e9f740f9e8371639e80b409108c10e9149410bf8ff0300b99cdfff97e8db51f91f0d00b1a00600541f0900b1a104005428008052ff0701f9e80b01f9L8;FFe1230091e92b0229090c40f9e81b00b9082040b9a0530", - "0d1e9c301f8e82700b98efcff97a8c35e3888010036a8d35ef8a9535ff8684200f80800801269c200f8BL8;FFe10314aae20317aaf80300aaec8d0194482740f91f0500b120030054592f40f95b6340b9991100b4542b40f9d88d0194e00319aa21008052d68d0194c01300b4L8;FFff8300d1fd7b01a9fd", - "430091e00301aa810100b021c03091e8030091e20080522b8e0094e00300912b8e0094fd7b41a9ff830091c0035fd6fd7bbea9f30b00f9BBBL4;FF291540d2290d098b29250191c91a498b290500912001088be1e30091f1b9ff971701003513000014e8031faa76feffb5e003088be1e30091eab9ff97b7", - "010034L4;FBa9eaa28c7add265b7930928400006dbe567c6ed0d7cb8272c358661d9f9e6fe7607682d223172e1b28e25b639423795d0507f0f98913489399b1a49da30cd1a7L8;FFebbf46a9f10308aaea6341a9f9fb42a9e8030eaafc0748a9ee0311aae69f43a9f1031baae4a74ba9ed0740f9e56f40f9", - "f03340f9e0bb00f9e0030baaeb0314aaBL8;FFe10ac03de10b03ad0d68ff97e99341b93f09007121080054e8cf40f9e9a341b9ec030b91eaa741b9e86301f9e9cb02b9eacf02b9080380d20800f0f21a1100d1L8;FFe34d0094e00313aa21008052e14d0094400100b528008052880600f909028052936a2", - "9f8880200f9f44f41a9fd7bc2a8c0035fd620008052800600f909028052BBBBL4;FF290d098b29250191c91a498b2a050091490140b22911c0da291540d2290d098b292501914919498b2a050091590108abe2070054b900f8b6fa031faae0031aaaL4;FB848542000000000000000000000000000800000", - "00000000008000000000000002084420000000000000000000000000008000000000000000800000000000000L8;FFa4008052e80300f912000014e00300f9210200d021301d91230200d0635c1491e0030091220280528400805209000014e00300f9210200d021301d91230200d0BL8;FFda0640f9e26d", - "0194e00318aa21008052e06d0194c00200b4e1031aaae20318aaf90300aae66d01949c0700d1d6620091b56200d178673fa9788701f8dcfdffb5L8;FFfcd342f9e8cb42f908011ccb5f0308eb492aff54e0431691e1031caae2031aaac8110094fcd342f94cf9ff17e043169122008052c3110094e1d342f", - "956f9ff17BBBL4;FF0e088052e94340b9f20b43a98d194039045840f9a6e35b38258108aaa7c35b788b094079edab00398d7141f88f7140f8a6a31a3886504078907c4039917d4039L4;FFf44f41a9fd7bc2a8c0035fd6d30100b474feff97e00313aa210080520bfeff97400100b528008052880600f909", - "028052936a29f8880200f9f44f41a9fd7bc2a8L8;FFe95a69780801094a68020079f30318aa03f5ff54e96f43a9b3035df8730a00d13f0114eb7b0700d1c1f1ff54040000141f0000792800805208783478e9a341a9BL8;FFcfffff17e89340f9c80000b40805088be00313aa0201805201f17dd3e02d019", - "4e063c13de167c13db47e0853e8a345b93c008092e00718ade82303b9e00758adL8;FFea070bf91e06ff97e88340f9f40300aaf50301aae00316aae10314aae20315aa039140a9f104ff9720070036b50000b4e00314aae10315aa22008052d82d0094BBBBBBL4;FFe3150294e00315aa21008052f40315a", - "a36008052df150294a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad30a088052f4031faaf5ff03a9L4;FFab0000d06be92e918d008052e903192af003182aee03082ac108001418fd78d3ed7f42f9cefe60d337fd60d3dcfe78d3f003182ab91e00b4ca7e0853e0031baaL8;FFff830", - "191c0035fd6ff8300d1fd7b01a9fd43009108a440a9e0030091e82700a950fcff97fd7b41a9ff830091c0035fd6e00301aa610200d02180239162018052BBL4;FF29244039e00700f93f0900f1a20100544a1900120ae10a8b4afd09aa5f0108eba3040054e00740f9480180520aa000a91f0000f9fd7b44", - "a9ff430191c0035fd6L4;ZBL8;FF4a090b8b40011fd6088c40f81f0900b1411d0054e8031faa73010014e80300aa098d40f83f0500b140250054f30300aae00308aa7e120094e80300aae00313aaBBBL4;FF110000145f2800f1880000542800028b08f1df38883ff837a08302d1793f0094a80356b84862", - "0037a80357f82a0340f9490108eb237400548a0340f9b58356f8L4;FB000000000000000001000000000000009422460000000000086e44000000000018000000000000000800000000000000d8724600000000000000000000000000L8;FF29a056a9ea230ca92ba058a9e9d300f929a857a9eb6f00f9e8", - "5f00f92ba059a9eaa30aa92aa05ba9ebe300f9e83300f928ec5ca9e9ab1da929d45da9e8f700f9BL8;FF1f0500b1e0070054e1d342f9e8cb42f91f0101ebe08b0054e8cf42f92a040091802202914901805209692138ead302f9371e0094e1431691850f0094e09b49f9L8;FF02028052230100b063c0009", - "1e4018052164bff97f55346f9e0833291e1032d91022b8052e6550094e08332913cf0ff97f30315aa69018052618e41f8280041d2BBBBL4;FFfd7bc4a8c0035fd60001805201038052fbf50194000400b000e01b91f7f50194ff8302d1fd7b06a9f85f07a9f65708a9f44f09a9fd83019109a04039f30300", - "aaL4;FB696e6765727072696e74636f6e74656e74536572766572436572746966696361746563657274696669636174657369676e61747572655369676e616c4d657373L8;FFfd7b43a9ff030291c0035fd6370080521800809219018052a80640f91f0116eb090f0054e00313aa99f5ff9700fe073728fc", - "60d3c80e00b5200840921f1800f1BL8;FFe90301aaf30300aa0103009021c82491e8030091e00309aae20080522c7601940103009021e42491040300f084200f91e0030091a363009182018052b30f00f9L8;FF00800991f807409118830991ec750094e0074091e843169100800991f1b3ff97e08741ade", - "217c03de8eb46f9f94b09f9e2a3843de267c33de09b843de06bc33dBBBL4;FF687f00f9000442ad630b47ade87f0091696b00f909088052f80303aa608705ad6437c03df40300aa638b03ad030841ade127803d77308a9a08050091641b803dL4;ZDL8;FFe00315aa22008052e5b50094e00740ad800600a", - "de00b41ad6042803c6242813c760200b9f44f4aa9f65749a9fd7b48a9ffc30291c0035fd6c201009042c01591BL8;FFe282c43ce8fb42f9e0db823de082c53ce1df823de182c03ce0e7823de082c13ce2e3823de82b00f9e1d3823de0d7823dfacb40f9da0e00b4080d8052f6c740f9L8;FFe89704f9e843", - "0e91ea832491e99f04f92900009029d12191e89b04f9e8431f91a04700d1e9a704f9e90000b029613b91e8a304f968008052e1430f91e90702f9BBBBBL4;FFe10314aae20315aa2300805224008052f7f8ff97e003172ae80b40f9ff0202710801148b03f8ff54d8ffff17e0230091e1031faa2300805224", - "008052ecf8ff97L4;FFe3050094e00319aa210080523a008052e0050094e0feffb4f98300a9ff0f00f9d8010034e8031faa090180520968283808050091e1230091e00318aae80f00f9L8;FF42008052e6050194689240f9a80000b4609640f901f57ed342008052e0050194689e40f9a80000b460a240f9", - "01f57ed342008052da05019468aa40f9a80000b4BL8;FF880200f9610240f93f0400f18b000054600640f922008052e1850194602a40f9a00000b4612e40f9610000b422008052db850194610e40f93f0400f1ab0f0054L8;FF1b0140f9b7fa7fd3e1850094e00317aa41008052df850094002900b4f8030", - "0aab5833ba9a0c300d1e1031baae20315aabf831cf86ad7ff97b9035ef8792600b4BBBL4;FFe3c50194e0031caa2100805236008052e0c5019440feffb4e10313aae2031caae00f00f9e6c50194f62f40b9c80600511f090071c20100542a008052e803162aL4;FB2e7273002f72757374632f3438613232", - "39636561656664343938356335303939306231343131366236643835366166303938352f6c6962726172792f616c6c6fL8;FF028544ade89342f9e85300f9e89b42f9e28717ada182cf3ca282ce3ce82b0ba9e8a342f9ea9f42f9e18315ada182ca3ca082cb3ce8270ea9e8ab42f9e9af42f9BL8;FF28080", - "0f90bfeffb43f0108eb93611932000100540dfc6ad35369283808050091280800f94d0200b5e0030baa61000014e10300a9e00301aae10309aa22008052L8;FF0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b250191", - "4a194b8b4a050091BBBBL4;FFe00301aae10315aaeae501942000805281048052efe50194e20300b042003191e00318aae10317aae2e50194e20300b042602d91e0031baafbe50194ff4301d1L4;FB2e7273000a64656372797074656420c00e206d6573736167652066726f6d20c0262077697468206375", - "7272656e742073657373696f6e20737461746520286261L8;FFe7e50094e00314aa0109805202018052e3e50094280080927f220039680200f9ff431491f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6BL8;FFe40200f084803291a3630091e2008052a80f00f92f6601942f66019", - "4fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaL8;FF684240f9a80000b4604640f901f97fd342008052e2650094684e40f9a80000b4605240f901f97fd342008052dc650094685a40f9a80000b4605e40f901f97fd3BBBL4;FFf85f04a9f65705a9f44f06a9fd", - "830091f303002ae00301aaf70301aaf40308aa177e0094f50301aaa100f8b6f8031faae00318aae10315aae6a50194350300b4L4;FF42d86578257c021b9f00056b8be4ff544200050b9f00026b2ae4ff54021040f95fcc74f2c000005442cc749242fc44d3420400d15fc024eb23e3ff547f0000f9L8;FF", - "fd430091f30300aae8030091e00301aa26a60094680240f9090940f9c90100b42905098b150540f9b30100f073a2039134f17dd3e0030091a1630091e20313aaBL8;FFfd7b42a9ffc30091c0035fd6ff0301d1fd7b03a9fdc30091080040391f0500714c010054c8030035202040a9810200b021f43b9103", - "0d40f9c2028052fd7b43a9L8;FFf65704a9f44f05a9fd030091ff4313d1ff0300f908088052f50302aa2010c03c2a7c40392900403921f0c03cf30300aae1830191e013843c00e4006f48150033BBBBBBBL4;FFc0035fd600018052e8fe43d31500188bf60600d1ff2600f1e00315aae11f805209f17dd3e", - "20314aa280108cbd732889ad9190294755a00a9777e01a9f44f43a9L4;FFdf0a00b1e1090054b60b7ba9bb8301d1a1835af8220200b4e10700f9a08301d1e10316aa43110094b7035af8ff0600b1400900546083c23c6183c33c6283c43cL8;FF42500a91e3030091e92301a9011a0194fd7b42a9ffc3009", - "1c0035fd60b0c40f92b0200b4090040f9080840f91f0109ebea33899a08010acb2a0108cb6a010aebBBL4;FFff4b0339ff4f033909017eb2ff530339aa008052ff5703390a010aaaff5b03390a057fb2ff5f03390a0940b2ff630339290180520a017db2ff670339090109aaL4;ZFL8;FFf30300aa810100", - "b021c01891e8030091e00309aaa20180522d9a009468c20091810100b021481491a401009084600991e0030091a3630091a2008052a80f00f9BBBL4;FFf80f40f9f8feffb7fb0b40f9580800b4f90314aaf4031c2addd90194e00318aa210080523c008052dad90194c0fdffb4e1031baae20318aae00300", - "f9e0d90194L4;FB7374642f7372632f73796e632f6f6e63652e7273002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e2d6c696e75782d676e752f72656cL8;FFe82f42f9e93342f9e8df00f9e83742f9e8af15a9e84342f9eb3f42f9e8b700f9e84742f9eaa318a9e84b42f9ea4f", - "42f9e8eb00f9e85342f9e8a700f9e85742f9BL8;FF21fb0054f8031f2af6031faa340080521900809228008052ff1700f9e80700f9e0074091e8c33f91e103182a00c0359145a20094e80348f9c8f100b4e1ff47f9L8;FFb40500b4f30700f9f303152af5031aaafa0317aaf703182af8df40f9dc590094e", - "00314aa21008052da59009400fc00b4e10318aae20314aaf60300aae0590094BBBBL4;FFfff90194000400d000001791fbf90194ff8302d1fd7b06a9f85f07a9f65708a9f44f09a9fd83019109a04039f30300aaf40308aaa90100343f0d0071c1070054L4;FB69642028c0232920666f756e64207769746", - "8206120646966666572656e74207075626c6963206b65790076656e646f722f6c69627369676e616c2f727573742fL8;FFe28309ade18340ade18307ada02100b4e0c3039147f7ff9707010014e1430091e20313aafb1f00f9f70b00f9d2080094e08741adf50300aaf4ab00f9e08708adBL8;FFfd7bbea9", - "f44f01a9fd030091011840f9f30300aa3f0400f18b000054601e40f922008052de790194612640f9140080927f7a00b9741a00f93f0400f17f0200f9L8;FF00202b91e97900946001009000601c91e67900946001009000a00791e3790094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd0", - "30091ff0740d1BBBL4;FF02028052853f0094a8a77da9ea031faaabb37ba9f04340f9e20f49a9a543573828e108aa0102168ba4c356f8a9b77aa9af5356f80c010ccafa2f40b9e12700f9L4;ZBL8;FFe87302f90801805242008052000400ada0e300d1bc0314f8e97702f9f47b02f9e87f02f913140094b", - "a537da9d8b90094000480522100805238ba0094602b00b4BL8;FF29fd46d3290d00910a0300344a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a05009111000014e9031faa10000014f5031faa681a40f948f6ffb5L8;FFa002805221008052e2390094004801b4e80000f008b50a91690080", - "520001c03d08d140f8e9c30f39c90080d2f80300aae0f301f90900f0f20000803d08d000f8BBBBBL4;FF01300591e003022ae20303aabef4ff97203500b4210400b021a01f91230400b063601d91e00700f90b00001401e00191e003022ae20303aaa4f3ff97c03300b4L4;FFe3090094e00314aa2100805", - "2e1090094a00400b4c1060091e20314aaf50300aae709009416000014e80f41b2680200f9f44f42a9f65741a9fd7bc3a8c0035fd6L8;FFc0035fd6080040f9e20301aa00a140a9e10308aa2d0a0114080040f96902009029811d91e00301aa08014039227968f86902009029411e91287968f8e10308aaBL", - "8;FF11670094e803002a001c00121f180071ac0000541f080071c000005420008052c0035fd61f1c007140000054000180521f00286b41000054c0035fd6fd7bbfa9L8;FFd7000014a87a1f53a9661a53f80316aa5a008052720100f052a23a91e8e300b9a8761e53f63b00f9e8db00b9a8721d53f44700f", - "9e8d300b9a86e1c53e8cb00b9BBBL4;FF19ffff17a0c300d1e1031aaa220080522300805224008052f5bcff97b7035ef82fffff17a0c300d1e10317aae20313aa2300805224008052edbcff97b7035ef8L4;FB0800000000000000e808460000000000000000000000000008000000000000000800000000", - "000000940946000000000000000000000000000800000000000000L8;FF80200054600742ade0831d9168234039e1c30391e97b00f9e08709ad600b43ade8e30339680f40f9e08b0aad610341ade18308ad6093c03ce0938f3ce88700f9BL8;FF681240f9a80000b4601640f901f97fd342008052e249019", - "4681e40f9a80000b4602240f901f97fd342008052dc490194682a40f9a80000b4602e40f901f97fd3L8;FFf30300aae00308aa06fdff97e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eba9140054088c48f8BBBBL4;FFe08716ade0074eade", - "2bf803df57f41f9f77b41f9e08714ade00b4fadf4bf4a39e08b15ade1034cad2003148b821a40d2981a40d2e18312ade00b4dade08b13adL4;FB0800000000000000f88242000000000000000000000000000800000000000000080000000000000080834200000000000000000000000000080000000000", - "0000L8;FF550300b4610a40f9680240f9961240f91f0101ebe00b0054680640f9490480522a040091e00315aa6a0a00f909692138e10313aa27eaff97770a40f9680240f9BL8;FFfd030091f40301aaf50300aacd49ff97610f00b4f7031faaf6031f2afc031faa3320805218068f52fb0200d07bc32a910", - "e000014c9e98dd2080040f9896eaaf2L8;FF811d803d8182823c8082833ce98b01b98082c23c8112c03de8bf40f97a0200f98002803df45744a9e8ab00f9610a803d6082803c680e00f9f50000b4f30314aaBBBL4;FF7f22003928008092680200f9b50000b4e00314aae10315aa22008052e0a90194f44f", - "51a9f65750a9f85f4fa9fa674ea9fc6f4da9fd7b4ca9ff830491c0035fd6L4;FF09000014bfbd03716d958b9a8d010d8bac010ccb290500f19401148bec030daa600100549f010aeb20010054ed030caaae15c038eefeff36cd1d0012bf810371L8;FF600240f922008052e5a90094f8ffff17880240f928", - "0d00b40805088be00315aa0201805201f17dd3ff030791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9BL8;FF810000b4c20a40f9e00314aae42901947f0b00b141050054e8630191ea9740f9e93342f908e10c91f6bb41f9fbbf41f9000545ad5f0500b10231c03df5c341f9L8;FF132a0094e807409", - "1e13b40f9e0c3229108011891e28200910f5dfe97e80356b91f05007141020054fa074bf9fb0b4bf9f90f4bf9fc134bf9f8174bf9f51b4bf9BBBBBBL4;FF0800f0f2aaffff17e90b41b2e92300a9a8ffff17880080d20800f0f2080140b2a3ffff17880080d20800f0f2081100919fffff17e00300f92104", - "00f021e02291L4;FF0a7d003909810039e9ab57290a85003909890039e9ab56290a8d003909910039e9ab55290a95003909990039e9ab54290a9d003909a10039e9ab53290aa50039L8;FFdf7d02710914003949c100110a819f1a0918003969010d0b4a114e0b29c10011cb0d00122c144039091c003949", - "c100117f2500710920003909819f1a9f7d0271BBL4;FF08213a91f40b00f9f52300a906000014600640a96800009008213a91f50b00f9f42300a9220300d042f83391e3030091e80f00f9f7910194f44f44a9f65743a9L4;ZDL8;FF4a1540d24a0d0a8b4a25019129194a8b29050091280108abc20100540", - "92040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091BBBL4;FF608740a9a84302d15cac0094a80357381f05007120feff54483340b8490340b9ab4302d16a8141f8ac0240b2a00240b2a8b316b868014238610140b2a98316b8L4;FBf5da491bdd5bb2c66e4223cee145", - "a6cc973c07ac77dcd4bb4c693dd712bd0e6bfa26afed655bdac64fb23c9eed85a28c99e649fb0000c51089d1efc0ecfb514aL8;FFe9a30fa9eed10094eb1b43a9ed031caae0bf46a9f00314aaf16740f9f5ef40f9ec031baaea0b40f9e72340f9fe031aaafa0317aaf70316aa89008052e97300f9BL8;FFe", - "0431691e1031aaae20318aae5110094fad342f9fc0740919c830191fbf9ff17f60300aae043169122008052dd110094e1d342f9e00316aa02faff17e0431691L8;FFfd030091ff032ed1f30308aaa83340f90a0100f04ae12691ff0300f9a96b40b9e82f00f9ea4302f9ea4702f9aa4700d1e7a30ea9a80c", - "40f9e08706a9ea830aa9BBBBL4;FF087d40393f010071afb31cf8aa831bf86901891aaa835cf88b4640f93ffd0371a8031c38280080529f4600f99fa207a9090500540804009008b11d9109fd78d3L4;FB000000000000000000000000000000000100000000000000f0ae420000000000556e6964656e74", - "696669656444656c69766572795365616c65642053656e6465L8;FF080500d170ffff17c80080d2e10700f90800f0f2080900d107000014e80b41b2e00700f904000014c80080d20800f0f2080500d1e80300f9e0030091c9e7ff97BL8;FFab235838a9031838a93358384a01084a6b01084aaa131838aa4", - "358382901084aab231838ab535838a9331838a96358384a01084a6b01084aaa431838aa735838L8;FF09692138e1431691ead302f9780f0094e88349f91f0500b1c0000054e8074091e143169108810991008102919b120094f87f49f9780300b4e1d342f9e8cb42f9BBBL4;FFa26301d1bf233ba9bf031c", - "f8af9bff97a1237ba9a00800b4e10800b4f80300aae00308aa22008052ddb10194e00318aa38e9ffb460000014a86303d1a26301d1L4;ZBL8;FF05000014e8031baa9c0700d19f0700f1a9050054a8ffffb4e9af40a90a0e8052c9260a9bca0600911b0500d15f010bebeb338b9a56010bcb210140f9966e", - "01a9BL8;FFd8270094e80300aae0833291a102009021080d9142028052a302009063f40b91e85306f908000014e05306f9e0833291a102009021080d9142028052a3020090L8;FFe2032a91e10316aa126ffe973c008092fc3301f95e010014c80080d20800f0f2084500919f0308eb81000054e0032a91c", - "6f0ff9769010014200743ade1000090BBBBBL4;FF208d212e00a8302e0800261ec80300376b21009180030b8b1c00198a496b7cfc208d282e0800669e0cc101f201fbff54f4ffff17610a40f9e08200d194dc0094L4;FFf85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0031faae10317aaed010094ff", - "2f00f9e02f40f9e1031caae90100943a00805278fdffb5eeffff17e81f40f9L8;FFe0000054c1825ff881ffffb4c00240f922008052e2010194f8ffff17340100b48806148be00313aa01f17dd302018052f44f42a9f65741a9fd7bc3a8d8010114BL8;FFe00301aa090140f93f0500b1e0010054ff8300d", - "1fd7b01a9fd430091010300f021802991040300f084e01091e323009182008052e80700f91b820194fd7b41a9L8;FFea810094400100f000c01291e7810094ff4302d1fd7b04a9f92b00f9f85f06a9f65707a9f44f08a9fd03019137fc4039f40301aaf30300aa1610805235000191BBBL4;FFe4c1019400", - "feffb4e10317aae20314aaf50300aaeac10194e00317aae10314aa22008052dec10194190000140a0180d2e9031faa0a00f0f203000014e9031faaL4;FB696c656420746f20646563727970743a20c00076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f736573736", - "96f6e5f6d61L8;FFff0300f9f30308aabc8302d1080040f9fa431091fb830291f40300aa090900d11f0500f1e80080522881889ac90100d0293120918a0000102b7968784a090b8bBL8;FF29050091b41640f92801088b140b00b4890240b22911c0da291540d2290d098b29250191891a498b2905009120", - "0108ab220a0054e10313aa85fbff97b7010034L8;FF03c1833ce80b40b9400504ad418147ade8a700b9e81340b9430905ade4838a3c8001803de8d302b9214b803dfafdff17080100f008b140f91f0900f123030054BBBBL4;FFd70200b4ff0600b100030054f843059199008052e00318aae10319aae203", - "1f2ae0023fd61f0000f1cd000054390300eb03c700541803008bf9feffb50f000014L4;FBc9ed4800000000004a00000000000000b60200000900000034ed4800000000006a00000000000000550100002a00000034ed4800000000006a00000000000000L8;FFe9030b912003029128710ff8680e00f908", - "00809220718e3c6082803c680200f99ddcff9763000014e32740b9f6432d917f04007148080054e81b40b9c8180037BL8;FFf44f02a9fd030091f30303aaf40302aaf50301aaf60300aadd6101940006805201018052db610194800100b48002c03d165400a9e10200d021e03b91130800f9L8;FF0805009", - "1280800f90dfeffb43f0108eb7361193220010054536928380cfc71d308050091290040f9280800f94c0200b5e0030daa47000014e10300a9e00301aaBBBL4;FFfb94ff97f82b40f9f92340f9280318cbdf0208eb29f3ff54e0030191e10318aae20316aa2300805224008052f094ff97f82b40f9f92340f", - "990ffff1720008052L4;FFfafeff1701d05f38a6081b53e9ffff17600240f9600000b43f000039007d20d4f72a0091c17a77f8610100b400008052610600f9210040f9610200f9330400f9L8;FFfd7b41a9ff830091c0035fd6080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430", - "091810100f021cc1491a40100d084c02391e3230091BL8;FFa10f00f9800200b0007c0591e8a701a9a8630091820200b042800f91e1630091e8a702a9ec210194a90f00f9a82300d1090000f0296126914a0200b04a710391BL4;FFa00000b4613240f9610000b422008052e3210094611a40f9c10000b46", - "01640f922008052f30b40f9fd7bc2a8dc210014f30b40f9fd7bc2a8c0035fd6fd7bbea9L3;ZBBBBBBBBBBL4;FFa90f00b5699284d208f17dd32949b2f28924c9f24992e4f2097dc99b080109cb2805488b0900809208fd42d3080500d10811c0da2825c89ae9ef7fb21f0109ebL4;FFa8831cf8080000140", - "1630091a2e300d15ffdff97c00d00b5a8835cf8080540f9280900b4a0e300d13dfeff970011003728fc60d3880600b5200840921f1800f1L8;FFe0030091680600f9cb050094f44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd6e00315aaf44f46a9f72340f9f65745a9fd7b43a9ffc30191be05", - "0014BBL4;FF290bc0f2e87f08a9e8270ba9f09e0194f81b40b9880a00910900809295630229892300a9fc0740f9bc0000b4e0031baae1031caa22008052d99e0194f44f53a9L4;FFe10313aa5f0015eb4290959ae9000094e00313aa37f9ff97f76343a9f96b44a9e00314aaf35341a9f55b42a9fd7bc5a8", - "c0035fd6e1141a123f003f7161efff54L8;FFe0030091a363009142008052b30f00f9309f0094309f0094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aaBBBL4;FF390300eb636800541803008b060000141f0400b1e167005404df01941f100031616", - "7005439feffb505000014e043059181008052ffde0194a0660035e85341b9L4;FBf5014900000000004e00000000000000450400000d000000f5014900000000004e00000000000000460400000d000000f5014900000000004e00000000000000L8;FF1f050071401200542c050014280441f9140340f99", - "f0208ebe8979f1a08219f5a081d0072e0ab00541f050071611701548900805228c840f9740a00f969220039BL8;FF21008052e35e0194a00f00b4e10315aae20314aafb0300aae95e0194281f40f91f0500b1c10000542500001414008092281f40f91f0500b120040054382740f9L8;FFf44f43a9f65742", - "a9f85f41a9fd7bc4a8c0035fd6e8031faa74f7ffb5e00308ab43f8ff54200100f000801291df5e0094e00313aa22008052c2020094610a40f9BBBBL4;FF22008052e6fe0194b80000b4e00317aae10318aa22008052e1fe0194d50500b4e00316aae10315aa22008052dcfe0194290000144d69ec382d07f", - "836e083c13cL4;ZFL8;FF2aa040a9536928380bfc71d308050091290040f9280800f94bf2ffb4ddffff17e10300a9e00301aae10308aa220080522300805224008052f4030baa89150094BL8;FFe00301aae10308aa237f0114281040b96800c8376800d037207f0114207f0114207f0114ff0301d1fd7b0", - "1a9f51300f9f44f03a9fd430091080040f9e00301aaL8;FFff0208eba822005459010014e11740f9e80f40f91f0101eb20710054e81340f92a040091e00315aa49088052ea1700f9096921383becff97e1630091257fff97BBBL4;FFe3be01940004805221008052e1be0194000500b4e87e105309ff68d3", - "190000b9144000f80838003908ff60d309280079084c0039287d1053e91340f917180079L4;FB387b47000000000018000000000000000800000000000000ace747000000000090e64700000000009ce84700000000006120446973706c617920696d706c656dL8;FFe10314aa02328052e08610ad81824c", - "ade28e803de1820fade9be0094e1c30991e00313aa026e8052e5be0094ff831791f44f43a9f65742a9fc5f41a9fd7bc4a8BL8;FFf44f41a9fd7bc2a8c0035fd620008052800600f909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6e00301aae10302aa353f0114ff8300d1fd7b01a9L8;FF6c0", - "100543f040071600700543f0800716106005481620091e003082ae20313aa4efeff97200700b4fa0000143f0c0071000700543f100071210500541f0900f1BBBBBL4;FFf65704a9f44f05a9fd03009148008052f40301aae10302aa000d002af30302aaf0faff97e00314aa9b890094e10313aaecfaff979", - "50a40f9550300b4610a40f9L4;FFe91301f9e8a30839810000b4e09340f922008052e20e0094e0bf40f9e8431391e1031baa72e5fe97e8435339e8000036e86353391f0500714c090054e80d0035L8;FFe9470039e83b00b9eb2301b8ab035fb8ea7301b8aa435ff8e95b0039e96f0039eb1f00b9e983003", - "9ea1302f8e89302b8190f0194fd7b46a9f33b40f9ff030291BL8;FFe9a345a960828d3c61828e3ce08744ad682603a9e95740b9686a04a9694e01b9e92740f96082893c694a00f9e8a741a961828a3c7c8600f9688e00f9e82f40b9L8;FF1f05007181040054e2031f2a8ce8ff9709fc78d38801009008a1", - "3a910afc60d3097969784921094a2a5d105308596a780001094a60020079f44f42a9fd7b41a9BBBL4;FFe00315aa2100805236008052e1ce0194e0feffb4f58303a9ff2700f93a3e00b40803138b540480525c028052f50318aaf9e300a9e80f00f90c000014e82340f9L4;FB9797525496eabc8150faacf", - "151ba31ff00bba28cd208c019285407340000d02cc16b5181327d23749560ac55ca5195df0e01ebd65a6c0f0a035f86ecf00540b0L8;FFfa0310aaf4030eaae9a703f9e9af03f9e8b303f932c8ff97f19f55a9e1031baaedc340f9e21740f9ee0314aaeb2b40f9e61f40f9f0031aaae90316aaeadb40f9BL", - "8;FF0800f0f2081d00d11e0000141f150071000200541f11007141040054280180d20800f0f217000014e00313aaf7070094e80300aae8070036e00301aaf44f45a9L8;FFa80359f814000014e8e322910081cb3ce8c344f94003803de8f304f943000014404fc03da80359f8e05344f94003803de8f304f", - "900c1ffb4e15744f9c1c0ffb4BBBBL4;FFf52b40f9fd7b44a9ffc30191e4ee0114bf0a00b16301005428008052e90300f0296d2691680a00b948038052692201a908008092680200f901feffb5c9ffff17L4;FBfe924800000000004c000000000000009b09000009000000fe924800000000004c0000000", - "00000009f09000009000000fe924800000000004c00000000000000L8;FF63ffff17e90b41b2e92300a968ffff17c80080d20800f0f2080500d15cffff17c80080d2e10700f90800f0f2080900d107000014e80b41b2e00700f904000014BL8;FFe00313aaf603012ae10314aae20315aa23008052240080", - "52f561ff97e103162a680640f9df0202710801148b63feff54e90f80123f002071ea0f801229140033L8;FF224e0054e1431691790c0094f90b40f91f0700b1c00e0054e1d342f9e8cb42f91f0101eb402a0054e8cf42f92a040091c02202914901805209692138ead302f9BBBL4;FF6a06805228048052f", - "f2703a9690300b029150a91e92b05a9290080d2492dc0f2e87f04a937000014e00742ad686200a9608600ad3a000014010b42a9e00317aaL4;FFe83300911f69213821488052e0330091c23680520101a0729a070094e000f83674070094080040b91f110071e0feff54200080521d000014f503002af803", - "1faaL8;FF095b69782001084afa0f40f9e80740f95f0308ebe1fbff54fb03002ae02300916cf8ff97e0031b2adaffff17e80100d008010191a94300d1fa03002a00210091BL8;FFe0010054a1825ff881ffffb4a00240f922008052e22e0194f8ffff17e027c13de8a344b9b47e0853e137c13de063813de", - "89305b921418e3c76000014e89340f9L8;FFa10357f8810000b4a08357f822008052e32e0094e11340f9810000b4e01740f922008052de2e0094f44f5aa9f65759a9f85f58a9fa6757a9fc6f56a9fd7b55a9BBBBBBL4;FFe7160214f44f41a9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9f", - "30300aa3f0400f18b000054600640f922008052da160294610e40f93f0400f1L4;FFa50000d0a5e02a91a70000d0e7802b91e8431391e2830c9163c00e9164c20391e00317aae10318aae60313aae0f3883df6431391f5db11f9fcdf11f9ff0b00b9L8;FF680200d008411e91690e00f9680200f9f44f42a", - "9f65741a9fd7bc3a8c0035fd6db1601940003805201018052d9160194000400b428008052145400a9080800f9BBL4;FF81f5ff5445000014b4835df841000014a0031df84103009021c82491430300906344259136000014a0031df84103009021c82491430300906314259130000014L4;ZBL8;FF750240", - "f928008092681600f9bf0600b18002005474da40a9960100b49722009104000014d60600f1f7620091e0000054e1825ff881ffffb4e00240f922008052BBBL4;FF08008012680200b93000001448008052680200b92d000014e81343b8e93740b9c40300b084e03991f9e343a9a8831fb8e8434139e0031f", - "aaa9b31fb8e92740f9L4;FB530300000900000040194900000000004d000000000000005b03000009000000456b526563656976656443743153616d706c6564756373656e64696e675f6374L8;FFe8e340f9e86b04f9e85b40f9e86f04f9e83f40f9e87704f9e8f340f9e87b04f9e83340f9e87f04f9e8f7", - "40f9e88304f9e82f40f9e88704f9e8031d9108e10791BL8;FFe7560194e807409108810991006103918b0b0094f4bb49f99f0600b1e0b2ff54f5c349f9f3bf49f9950e00b47622009104000014b50600f1d6620091e00d0054L8;FF2101009021e0339102028052230100b063540191a4028052fe000014e", - "05306f9e08332912101009021e0339102028052230100906360349104028052f5000014BBBBL4;FFc18201ade083c03ce183c13ce85b00f9e80240f9e01b803de18b03ad680000b4e00315aa00013fd6e10640f9810000b4e20a40f9e00315aad9f60194c18a41adL4;FB080000000000000008000000000", - "000002c8642000000000073656e64657220636572746966696361746520636f6e7461696e6564207365727665722063657274L8;FF62020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e0030091cdecff97f44f47a9f65746a9f85f45a9fa6744a9BL8;FF", - "e00707ad0083c63ce20308adf58aff97600d00b4e88b40b9e9b348b8ea3b40b9e08744ad7b0200f968aa00b9eba3422969b20ab86901001260828c3c61828d3cL8;FFe057813de15b813de8e30a79ec760094380080527400805215008092e8d342f9e067c13de94306912081009102708052e8a302f9e84", - "3169101610091e04f813dBBBL4;FF010140ad080b40f9c85601a9eaa34329c182833c0103c03dc082843cc102803dc92a0b29c8820139ab000054e0031aaae10313aa22008052d9b601949b0100b4L4;ZDL8;FFe00313aa02398052edb60094ff830d91fc4f41a9fd7bc2a8c0035fd6ff8300d1fd7b01a9f", - "d43009129e040f9e20300f93f0500b1c0020054290500913f0102ebBL8;FF6b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab82020054L8;FF00e500b4e10315aae2031aaae02300f9eb360094030000", - "1428008052e82300f968c640f9694642b91f0500b1e94f00b900020054e0430f91612206914d0f0094BBBBBL4;FF5a0700915f0f00f1e00f00540807805221048052554f089be8030491e00315aa144440b872dd0094e80344391f05007140100054600740ade8030491a08642a9L4;FF000280520101805", - "2e2060094200100b4140000f9810000d021403c91130800b91f300039f44f41a9fd7bc2a8c0035fd60001805201028052f1060094fd7bbda9L8;FFf44f43a9f51340f9fd7b41a9ff030191c0035fd608a440a9e20301aae00308aae10309aa29070114ffc300d1fd7b02a9fd83009109200091e80301aae5", - "0300aaBL8;FF2003009000003491e88601942003009000603891e5860194200300d000002891e28601942003009000601c91df860194fd7bbda9f50b00f9f44f02a9fd030091L8;FFe8030091e00309aa42018052308700946101009021d01391640100f084803391e0030091a363009142008052b30f00f", - "928870094684201916101009021901c91BBBL4;FF68008052e03340f9e12b40f9fa030691bf0e0071a832881a3f01007208119f1ae84f00b9e803069173130094882b50a96083c13c6183c23c8b8b40f91f0500b1L4;FBc00022536b697070696e6720636f72727570742070726576696f75732073657373", - "696f6e20c00520666f7220c0023a20c0002f636172676f2d72656769737472L8;FFe7c60094fb031faaf0ffff17e8b743f929d34b78eb031c912093ce3ce133c23df80316aae86b00f9e8ff5e39e6030991e237c23de0d7803d019080522841082aBL8;FF00601c91e9460194ff0301d1fd7b03a9fdc3009", - "1080040f9090540f9490d00b40a0140f9410180390101f8b7e0031faa4a050091290500d10a2500a9fd7b43a9L8;FF090100b029c11c91287968f8e10308aa21470014fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e0030054e00313aa40000094080040b20811c0daBBBBL4;FFe00308aa0", - "005c03d0a657da91a8c5cf801c10091e92300f917257fa9eb3300f9e9db06a90b2540a9b60302d1c002803de91f00f9092940b9151140f9ebab04a9L4;FB00000000000000000000000000000000a5e0480000000000aee04800000000000000d1009300a7008a00e400eb00bd000a029100f4010000ef01", - "5601b3012001L8;FFe80301aac000003688f9ffb4cd000014e1031faae88701b9c9ffff17e1031faae88b01b9c6ffff17a083db3ca183dc3ca283de3c000705ada083dd3ca183d73cBL8;FFfd7b42a9ff030191c0035fd6fd7bbda9f50b00f9f44f02a9fd030091210300b4090040393f210071810300543", - "f8431f121040054f50300aaf40308aad4660194L8;FF22008052e6660094b40000b4600640f9e10314aa22008052e1660094602e40f9a00000b4613240f9610000b422008052db660094611a40f9810000b4601640f9BBBL4;FFa8035ff8697201f8691d001268f201f828008092aa1b00b9ab831f386cf2", - "00786a1201b8699e0039680200f9fd7b44a9f32b40f9ff830191c0035fd61f090071L4;FF030000143406009440fcff34e00314aaf35341a9fd7bc3a8c0035fd6f51340f9e20313aae00314aa01008052f35341a9fd7bc3a8430900142e01001410050014L8;FF8f00009409fc78d30a7c1853a80100d008", - "a13a910bfc60d3097969780a596a786921094a0a200a4a2b5d10534c5d10530b596b7808596c786001094a01010a4aBL8;FFf32340f9ff430191c0035fd6e043c13c2800805268020039e003803d6012803cfd7b43a9f32340f9ff430191c0035fd6ff0301d1fd7b02a9f31b00f9fd830091L8;FFe426009", - "4200500b4e10313aae20318aaf60300aaea260094b3835df8acffff17e90313aaf54f43a9f75b42a9fb0f40b9f96341a9fc0340f9060000143c008052BBBBBBBL4;FFe00313aa03048052fa76009414008092e00314aaf44f49a9f65748a9f85f47a9fa6746a9fc6f45a9fd7b44a9ff830291c0035fd6e92", - "340a9795200a9280108cbL4;FFa90b0037010840b9f30300aa150040f9e0e30091f40308aabbe300d1af120094f60f44a9a0e300d1e10315aae20316aa5e100094b9df7ca9b8d77da93f0b00b1L8;FFf44f42a9f65741a9fd7bc3a830feff1735f87f92480015cb160113ab62010054e00315aae10302aae", - "20313aade1a0194965600a9930a00f9f44f42a9f65741a9BBL4;FF2901054aeb3f40b9ea4e0039e9520039e95e4039ea5a40390801064afa430391e8560039e862403929010b4aeb4740b94a01074ae95e0039ea5a0039ea664039L4;ZFL8;FFce1540d2ce0d0e8bce250191ad194e8bbf010ceb83050054", - "6b0500f1ec030daa81feff54a90109abe300005423000014e8031faa090840f949fdffb5e90309abBBBL4;FF082d00b12935899ae84b0af9e94f0af9edda0194280c8052237bc13d2077c13d08ff013928835839a08302d1e3ff843de313c53de1430591088301392173c13dL4;FB1000000000000000080", - "0000000000000985d440000000000000000000000000010000000000000000800000000000000e864440000000000985d440000000000L8;FFf5ef00f9e9a703f9e9af03f9e8b303f9e46700f9feaf02a9fa8700f9e76f04a9fb030eaaf03b00f9f21f00f9ed0700f92bd4ff97eb0b43a9ee031baae76f44", - "a9BL8;FF081d1791e94309f9290080d2a04700d1e85b09f928038052a90fc0f2ea5f09f9aa0a805221800991ff3309f9e83b09f9ff3f09f9ea4709f9e85309f9e95709f9L8;FFe82746b9f50346b9e042c13ce142c23ce0a30c91fcff42f961e2009102278052e01b813de11f813de88304b9e45a0094f66", - "f41f9f36b41f9c80240f9680000b4BBBBL4;FFa80d010efa5b47a97f0700b1ec031faaea031faa3901949a110a8052f72700f914000e8a096a74fc208d282e0800669e1cc101f240050054380b40f9e9cf03a9L4;FB735f6d75742e7273002f636172676f2d72656769737472792f696e6465782e6372617", - "465732e696f2d313934396366386336623562353537662f696e6465786dL8;FF0d0200143f0900b1a0200054880080d20800f0f2080500913f0108eb0120005481220091e20313aad3090094f50300aa010200143f0900b140210054880080d2BL8;FFa3630091a2028052a80f00f9317b01946842059101", - "0300b021fc3591a3630091c2028052e40315aaa80f00f9297b019468520591010300b021543691a3630091L8;FFb7fbff17e06300912200805223008052240080529391ff97e11740f9c4fbff17e0630091e10317aae20315aa23008052240080528b91ff97f71740f9e80f40f9BBBL4;FF68731d536a928", - "45209311d12297d0a1b297d10530801094b08391f122805480b09008092087d0253080500d10811c0da2825c89a1405009198f27dd399220091L4;ZBL8;FFe80f41f91f0500b140080054e0431291e1030091e3630891e20315aa19fcff97e84b42f9e9670e9120f1cf3ce95742f91f0500b1e08f803de92", - "301f9c00b0054BL8;FF29fd46d30801098b130500917f0209eba9140054088c48f81f0500b12011005464feff97080040b20811c0da081540d2080d088b0825019109fd46d30800098bL8;FF1a0100b4e00315aae1031aaa22008052f5030aaae23a0094ea0315aafa031faaf5031faaf903089139030014", - "e8634f39a8070036f9030891ba0000b4e00315aaBBBBBL4;FFfbfdff97770a40f9680240f9080117cbbf0208eba9cbff54e00313aae10317aae20315aa2300805224008052f0fdff97770a40f955feff17e00313aa22008052L4;FF3481889ae30314aa0c000094e80740f91f0500f1e0000054e80b40f97", - "42200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9e70a0094fd7bbda9f50b00f9L8;FF61020054810100b4fd7bbea9f30b00f9fd030091080440f9f30300aa22008052e00308aade0a0194e00313aaf30b40f9fd7bc2a8010c40f921feffb408048052BL8;FFe90300f9c1010054e9030091210300", - "b021802991240300f084c02591e3230091e00308aa82008052e90700f91e8b0194fd7b41a9ff830091c0035fd6210300b0L8;FF005d00b4a00641adca0600d1e94b41f9a82240f9000401ada10240ad5f0109eb082000f9010000ad01fdff54f30300aae0430a914dd4ff97e00313aaf34f41f9BBBL4;FF7", - "f0308eba81b00541b0100b4a8835df8e10340f9e2031baa0001178be8ca0194f7021b8bb7031ef85f0317ebe01c0054a8835df809058052ea060091a1c300d1L4;FB20627920324d657373616765206c656e67746820697320746f6f206c6f6e6753657269616c697a6174696f6e20696e76616c69644864", - "72000000000000000000L8;FFf7831d91e8d301f935200094e5b343f9bf0400b120bc0054e9831d916013c83ce8e200912181cf3c2281ce3c2381cc3ce0d7803d0035c03d0843152ae28718adBL8;FF1f0900f121090054610a40f9810000b4600640f922008052e14a0194611240f9410900b4080380526", - "06a68f822008052f44f41a9fd7bc2a8d94a0114604a40f9L8;FF10000014e80308abc2010054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6BBBBL4;FFe2f0ff54e8430291e10317aae20318aa0001158beaea0194a80", - "2180be83f0439f503082a08108052020115cb740302eb82f4ff54e8430291e1031aaae2031baaL4;FB804c420000000000000000000000000008000000000000000800000000000000f84c420000000000000000000000000008000000000000000800000000000000L8;FF2400805297010094610a40f9b", - "5ffff17e00313aae10316aae20314aa23008052240080528f010094760a40f9680240f9080116cb9f0208ebe9f6ff54e00313aaBL8;FF1f0d00b148d8ff54e00317aae10316aa22008052e26a0194bdfeff1708008092686e00a9c80600d11f0d00b108d7ff54f6ffff1708008092686e00a9160100b4L8;", - "FFe80300aae00301aaa8fe0737680240f9090540f91f0009eb29060054e80f41b2e80300f9e0030091ce60ff97f44f45a9f52340f9fd7b43a9ff830191c0035fd6BBBL4;FFf44f07a9fd030191f50301aa298440a9f30300aaa85300d1f40302aae00309aacf830094b6c35e38df0a007120010054808640", - "a9a85300d1a0d3de3ce003803dL4;FF9f010e6a0d40c4d26f11889abf0120eaed014db2ab018b9a9f010e6a6d11889a1f0056f2ad014cb26b018d9a8c010e6a0ee479d30d7c1f536811889a3f010072L8;FF200600b4f58303a9750740f9e1031faaff2700f9e81f40f9bb264078080101cb1f0500f10901", - "00546807c05a08682178210800915a0700f1e12700f9c1feff54BL8;FFe0234ea9e3031f2ae16340f9e22340f9081940f900013fd6e03b02f9e8031691e13f02f9290c40f9e103129120013fd6fbc342f97f0f00b1a106005488008052L8;FFe82700b91a2a0094e80356b9e00740918100805200001891f", - "f0316b9e82300b9132a0094e80356b9e00740918100805200001891ff0316b9e81f00b90c2a0094BBBBBBL4;FFe10313aaefffff17ff0301d1fd7b03a9fdc30091080440f9c80100b4090040f90c0500d1ea0309aa4b1540380a3000a961194092ab003837e0031faafd7b43a9L4;FFa04700d117c5ff97e", - "09b01b9a04700d114c5ff97e09301b9a04700d111c5ff97e08b01b9a04700d10ec5ff97e08301b9a04700d10bc5ff97e07b01b9a04700d1L8;FFe007803de81302b8ea2700b9dbfdff97fd7b43a9f32340f9ff430191c0035fd6e003c03d08008012680200b96042803cfd7b43a9f32340f9ff430191c003", - "5fd6BBL4;FFe9ab05a9a9a300d1e1630191a8831df8e8230291e9ab06a910930194740a40f9680240f99f0208eb61000054e00313aa6f92019408038052690640f9e083c83cL4;ZDL8;FFc0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aa610100f0216c1a91e8230091e00309aaa20", - "080522793009468320191610100f021e81791BBBL4;FFf70000b4f60314aae00316aa7ebcff97f70600f1d6c2019181ffff54d90000b428e379d3e00314aa02018052011119cbdbd20194e00315aa85bbff97880080d2L4;FBe1a5f018c1cb9347f044b1019f9bc18850c69b09c7f1e05f0000b8876ba8a3", - "082d69c3b57daea31ec61b153b2b5d5c872222973c72d61ca8f0dc178b9b37da10L8;FFeea713a9e99b40f9ea9300f9eabb40f9e87740f9e9a700f9e9eb40f9e03340f9ed2b1fa9eab740f9e99b00f9e9cb40f9fbef00f9fb0304aae4031caaec031baaBL8;FFead302f9920c0094fad342f9e8cb42f9080", - "11acb1f0308eb483c0054e8cf42f9e10319aae20318aa00011a8be4520194f90b40f94803188be8d302f9df0600b1L8;FF810000b4e0a745f922008052e4520094f37740f9e8c31791e00313aabb52009468624039f5f345b9e8231839e8c31791b47e08530041c03ce183c13de8c31291BBBBL4;FFb5e5f", - "fb4e00314aae10315aa22008052e3f2019428ffff17a0035df8c3ffff17a0831cf8e10300f021f42691e30300f063102891a0e300d16201805244008052L4;FB9a9648000000000033000000000000008e000000050000009a964800000000003300000000000000b1000000050000009a96480000000000", - "3300000000000000L8;FF881a00f9d9ffff17a10a0054e0031faab0ffff1721050054e0031faa9effff17c80080d2e10700f90800f0f2080900d10f000014c80080d2e00700f90800f0f2BL8;FFd6a20e91e08303ade08304ad82000054e0c30191ea7201945d000014c00640ad48fc46d3e9c3029157e07", - "a925414409220010191e20308aaffbf0339e08707adL8;FFe80740910881099100010491740b0094f4cf49f99f0600b100b0ff54f5d749f9f3d349f9b50b00b47622009104000014b50600f1d6620091000b0054c1825ff8BBBL4;FFa0835bf822008052e5b20194bf0600f1ab000054e00316aae10315aa", - "22008052dfb20194e00314aa899bff9708008092686e00a9ff830891f44f45a9f65744a9L4;ZBL8;FF37018a1a0901172be21a00549f02096b49000054df3200f91f05003160180054f82300910b0000140043c03c2901088b2001803d0043c13c2005803d09810091BL8;FFe1031faac2ffff17e1031faa", - "e82f06f9bfffff17e1031faae8570cb9bcffff17e1031faae8630cb9b9ffff17e1970cb9f2feff17e1930cb9f0feff1708018052L8;FFc80080d2e0232a39e0032a910800f0f2ff272a39e84305f9d228ff97e80300aae0032a91e10000b02128019142028052e30000b063140091e84305f908000014BBB", - "BBL4;FFf30b00f9fd030091f30300aae00202940003805221008052de020294400200b4080400f008413a91090400f029a13a910001c03d080940f9080800f9a8028052L4;FFff1702f9ff1f02f9e82302f9e92702f9c7eaff97e8df40f91f0500b1c01b0054e0e30191e1e3069102288052f70b00f9f943", - "0c91f7e30191f4e30691e0020094L8;FF22008052e6020194610e40f9810000b4601240f922008052e1020194611a40f9c10000b4601e40f922008052f30b40f9fd7bc2a8da020114f30b40f9fd7bc2a8BL8;FF29411f912900001408a0009109200091020300f042800091e82700a9e8230091090000b02", - "9611a91200440a9e82701a9e8030091090000b029811f91e82702a9L8;FF35830094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa410100f021041d91e8030091e00309aa62018052BBBL4;FFe10313aa022b8052f44f41a9fd7bc2a8ebc20114088c", - "41f81f0500b160010054fd7bbea9f44f01a9fd030091f30300aaf40301aa30acff97e10314aae00313aaL4;FB6a00000000000000fb0000002e000000e4674900000000006a000000000000009c0000002e0000004572726f72000000e4674900000000006a00000000000000L8;FF610e00b4e0af42f922", - "008052e4c200946f00001428008052e86700f9fcfb41f9f4f741f97c0100b4d9c20094e0031caa21008052d7c20094001b00b4e10314aaBL8;FF680240f9b51240f91f0101eb40070054680640f9490280522a040091e00314aa6a0a00f909692138e10313aa88fcff97760a40f9680240f9080116cb9f02", - "08ebL8;FF028300911476fe97e89341b91f050071610600542007c03de9b341b92143c23ce8c741b9f81f40b94003803dfacf40f9e002803de9d302b9214b803dec030b91BBBBL4;FFe0023fd61f0000f1cd000054390300eb03e800541803008bf9feffb50f0000141f0400b161e7005400e301941f1000", - "31e1e60054f9ffff17fde20194f70300aaL4;FB8be84800000000003800000000000000490100000a0000008be848000000000038000000000000004a0100000a0000008be84800000000003800000000000000L8;FFff830c91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6f9c3", - "0d39390200343f070071e0010054e8c30d91c90100b029910491e8cb03f9BL8;FFc0035fd6e00301aae10200d021201b91a201805220630114e00301aae10200d021203a91220180521b630114fd7bbea9f44f01a9fd030091f30301aaf40300aaL8;FF6c1d00128c6119538c01210b810102516b00f8374", - "b0080524c0000143f104071c30b00544b09c0396c1d00122c380c0b811140516b00f8376b00805243000014BBBL4;FFe10319aa22008052e5a20194da0000b4bb0000b4e0031aaae1031baa22008052dfa20194d70800b4e00316aa410000143f1d0071c10d0054fa031f2ae8031faaL4;FFc57a66f86320", - "c21a42100012bc001c8bdc7a26f8641a00b942001b32600a00f94218152a641a40b9e403242a6300040b631e00b9130000f9600a40f903204039L8;FFff830091c0035fd6810100f021bc14918200805220a30014080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091810100f", - "021cc1491BL8;FF1f2100f11481899ae30314aa77010094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faae6220194e00741a9BL4;FFc1825ff8e1feffb4c00240f922008052e3220094f3ffff17681640f9280100b40805088be00314aa01ed7cd3020", - "18052f44f42a9f65741a9fd7bc3a8d8220014L3;ZBBBBBBBBBL4;FF490109cbc932899a1f0549ebe90a00542a050091f30300aaa08300d15f0108eb010c80520295899aac020094b9537ea9a1035ff8790a00b4750240f9e1cf00a9L4;FFe71c00943f0b00b1c1020054e81340f9e9a34039e80b00f9e963", - "00399704003648ff70d349ff60d3610a40f9e0c30091fa3300b9e8db0039e80b40f9e96b0079L8;FF1f1d00f10831899a29008052360908aa11000014de1c01940005805201018052dc1c0194800200b4c81242d3f60300aa185400a9132001a928008052081000f9BBL4;FF17108052e1031f2a95020191", - "e08707ade00741ade247803de21340adf97b40f9e133803de40305ade00f42adf83f4339e227803d8002188b021740d2e08f06adL4;FF060080d2050080d2040080d2030080d2020080d2200780d2f1ffff971f10003100109f1a007c4093bdf5ff97fd7bc1a8c0035fd6fd7bbfa9e40301aae30302aaL8;", - "FFa80100b008e10a91e00301aae10308aa82028052209d0014ffc300d1fd7b02a9fd830091200440a90900009029913591e80700f9e8230091820100d042e00a91BBBL4;FFe81300b957ffdfc8770000b508dd0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023f", - "d61f0000f1ad000054390300ebL4;FB6054696d657374616d703a3a746f5f756e69785f6e616e6f73282960206973206465707265636174656420616e642077696c6c2062652072656d6f7665643a20L8;FFeb2702a90ba450a908219f5a081d0072e9af04a90fa451a9e93b00f90ba452a9eb4300f9e923", - "00f90ba454a9e97b00f909b440f9e96700f909b840f9e9ef00f9BL8;FFff0600f1eb730054e01f40f9e10317aa22008052e25c01949a030014f6df44f9e04316910123009102738052e45c01949800805211020014f6eb44f953000014L8;FF760a40f9680240f9080116cbbf0208ebe9f8ff54e00313aae", - "10316aae20315aac8000094760a40f9c1ffff17fd7bbca9f70b00f9f65702a9f44f03a9fd030091BBBBL4;FF4afd43d30b696a389bffff17000400f000201591f9fc019420008052e1018052ecfc0194e923b96dfd7b01a9fc6f02a9fa6703a9f85f04a9f65705a9f44f06a9L4;ZFL8;FFe80900b5e1031f", - "aadaffff17e20313aa230c805248f6ff97e10300aaa0faffb4caffff17e00900b5e00313aa98fcff97e80301aa80040036480a00b5e1031faaBL8;FF0920009121030090219c3b91a9831ff8230300906360399126030090c6e03891a52300d1e00308aae2028052e4018052307d0194fd7b42a9ffc30091", - "c0035fd6L8;FFe00314aa088c4bf81f0500b160000054e16300911b90ff97964e40f9560300b4e11740f9e80f40f9974a40f91f0101eb00430054e81340f9490380522a040091BBBL4;FF691200f96a000014a10c0054284401f1820d0054480080d20800f0f264000014a22301d1830c805293a3ff97400", - "f00b5b8835bf8f70318aae28e40f8e20b00b4L4;FB2900000000000000440100001b0000005b8749000000000029000000000000004e0100002d0000007369676e65642d7072652d6b65796b796265722d7072652dL8;FFff830e91fc4f41a9fd7bc2a8c0035fd6fd7bbea9fc4f01a9fd030091ff430ed10", - "0844eade9a70991f30308aa08f840f9e10300aa0232805220f18f3ce9e70991BL8;FF6b0d0b8b6b2501914a194b8b4a050091490109abc20400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9030054L8;FFa8a40135680640a96082c23c69aa43a9608289", - "3c6082c43c680607a9680241a960828b3c6082c53c69aa0aa9693640f9680208a9681240f960828c3c684a00f9BBBBBL4;FF42030054010840a9e50304aa0a018052e40303aaf30300aae023009129f87fd31f0109eb0881899abf0400f1890080524901899a1f0109eb1481899ae30314aaL4;FF380100b", - "4e0c740f9e10318aa04000014b60000b4e00319aae10316aa22008052df0c0094e0e30e91a6eaff97e0030e9144ebff97f9575aa9f62b40f9f4cf42a9L8;FFe82b00b9240d0194fd7b44a9f32b40f9ff830191c0035fd6ff8301d1fd7b05a9fd430191080040b91f0d0071ed0100541f1500718d0600541f", - "19007180070054BL8;FFe00308aa82008052e90700f9268d0194fd7b41a9ff830091c0035fd6210300d021702991e00308aa82008052fd7b41a9ff830091188d0114ff8300d1fd7b01a9L8;FF8300005410000014e80308abc2010054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019", - "129194a8b29050091200108ab62000054fd7bc1a8BBBL4;FF1bfdffb5f44f50a9f6574fa9f85f4ea9fa674da9fc6f4ca9fd7b4ba9ff430491c0035fd6a00300d000003491dfcc0194a00300d000603891dccc0194c00300b0L4;FB6c617465312073746f72656420737461746520656e6469616e6e657373", - "000000302149000000000058000000000000005f0000000500000073697a652073686fL8;FFec0316aab50000b4e0030caae10315aa22008052e2cc00945a008052b9040014e0031baa088c40f809204039155048a9164840f9175040f9bf0600b1c0470054BL8;FF1f0500b1e01b0054e002c03de8f341f", - "9e9030b91e17740f92015803de89301f9a10000b4e07b40f922008052dc4c0194e9030b91ea0740f9e81740f92015c03dL8;FFe10316aaf34c009420008052e10315aaf04c009400018052e10313aaed4c0094fd7bbfa9fd030091083c40f9080100b4080140b20811c0da081540d2080d088bBBBBL4;FF9", - "80500b4e2ec0194e00318aa2100805239008052dfec0194e0feffb4f70300aaf88300a9ff0f00f9530500b4e8031faa49018052e96a283808050091e1230091L4;FB08000000000000000800000000000000f485420000000000436970686572746578744d657373616765546f6f53686f72744c65676163", - "79436970686572746578L8;FF75fdff34610a40f9680240f91f0101eba0020054680640f9090180522a040091e003152a6a0a00f909692138e10313aa28edff97f4fbff35f44f42a9f50b40f9BL8;FF6a010a8b6901098bea2702a99f0216ebeb2303a9e80e0054f8031faaf7031faaf50316aae802188be", - "00741ad1f0115ebe933959a160109cbe9a30191e8030091L8;FFd0100094e1d342f948feff17e0431691e1031aaae20318aaca100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aac1100094BBBL4;FF15008092814a40f93f0400b140020054810000b4804e40f92200", - "8052e0ac0194815640f9810000b4805a40f922008052dbac0194816e40f93f0400f18b000054L4;FF3f404071680080521535889a680240f9080114cbbf0208eb28050054680640f93f0002710801148b62000054010100391c000014e90f80123f002071ea0f8012L8;FFf53f01f9ff4f01f9f54b01f9ff", - "5301f9f55701f9ff6701f9f56301f9ff6b01f9f56f01f9ff7f01f9f57b01f9ff8301f9f58701f9ff9701f9f59301f9ff9b01f9BL8;FFe84701f9e8a70691e04341f9400501ad2083c73c2183c43ce9b304f9400902ad2083c33cc282c93ce93304f9400500ad2a0080528083ce3ceaa71139eacf42f9L8;F", - "F810000b4e20a40f9e00314aae42c009476000036f7030291fc030014e8631d91f6030291e95b47b9083140b8ca220a91eb030291e29340f9f7030291483100b8BBBBBBL4;FFff430191c0035fd6e00302aa3b160194e80300aae00301aae10314aae8f80737d3ffff17e0030091e82b00a906f20094ff43", - "02d1fd7b05a9f85f06a9f65707a9L4;FFf7bb00f947010014da7e0853fb0308aaef031a2ac2070014e9ef59a93a7f085328ff60d33cff78d3ab0000d06be92e918d008052ef031a2a78ff78d337fd60d3L8;FFe08740a9830600f1c9424039c9010054a80240391fed017161010054a86a63381ff5017101", - "010054ea031f2a3f0d00716800805222008052400b0054290b0034BBL4;FF89364039ea774039e87300394801094a893a4039ea7b4039e87700394801094a89424039ea834039e87b00394801094a89464039ea874039e88300394801094aL4;ZBL8;FF291540d2290d098b2925019129fd46d30801098b1", - "30500917f0209eb890f0054088c5df81f0500b1c00c005422050094080040b20811c0da081540d2080d088bBBBL4;FFa0faffb457020014c1e20091a2a302d1e003082aadbeff97e0f9ffb429020014a0a302d135d60094e80300aae00301aaa8fc07367b0100145f2800f188000054L4;FB6e206661696c", - "65643a2063757272656e745f6b6579203e3d20706172616d732e6d61785f6f6f6f5f6b6579735f6f725f64656661756c74282900000000000000L8;FFeac343f9e9231fa9e8c743f9e9bf43f9e8cf00f9e8cf43f9e8c300f9e8d343f9e8ab00f9e8d743f9e92312a9e8db43f9e9df43f9e8ab1aa9e8e343f", - "9eaf343f9BL8;FF080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f0008eb89190054e1431691880e0094e1d342f9e8cb42f91f0101ebc06d0054L8;FF4aed0c91e0df813dff5306f9e85b06f9ff5f06f9ea6306f9e87306f9e97706f9eb540094e1bb43f9810000b4e0bf", - "43f922008052da540094e0833291e1032d91BBBBL4;FFe20bc03d600600ad620a803dfd7b43a9f32340f9ff430191c0035fd60004009000603291f2f40194f2f40194ff4301d1fd7b02a9f65703a9f44f04a9fd830091L4;FB2e0000001b000000c9944800000000004d00000000000000260000000f0000", - "006d697373696e672072656d6f7465206964656e74697479206b65790000000000L8;FF750240f9a80640f9160101eba2020054e80f41b207000014890080d248008052e02300390900f0f2e827003928017fb2e0030091e80300f9caeaff97e10300aaBL8;FFb30f00f93375019433750194fd7b41a9f31", - "340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa0103009021242891e8030091L8;FF22008052cf180094e8d342f9e0cf42f9490180520968283808050091fa3b49f9e8d302f9fafcffb5e8031faaf98792b939010034290340b22911c0da291540d2BBBL4;FFa2f8ff", - "54fc030191e10318aae20319aa8003158beab40194a802190be8ff01397ffe03f11808805220020054e8ff413969060011a90316381ffd007100edff54L4;ZDL8;FFe00315aae10318aa22008052f5030caae3b40094ab835ff8ec0315aa1b0100b4e0031caae1031baa22008052f5030caadbb40094ab83", - "5ff8ec0315aab6577ea9BL8;FFa04700d1e9b705f9a90200b029410591e8b305f968008052e1c31791e91703f9e9ff02f9a9020090292d2291e81303f9a802009008112391e90b03f9290080d2L8;FFc90600918003c03d0001803d8007c03d0005803d800bc03d0009803de9bf04f9a88357f8080540f9c", - "82500b4a02302d128f5ff97f60301aa004d0037c8fe60d3BBBBBL4;FF9f0600f1ab000054e00315aae10314aa22008052e2040294f44f4ba9f74b40f9f6574aa9fd7b48a9ff030391c0035fd6e003c43ce91740f9612200a9751200f9L4;FFe10317aae20313aaf60300aaec0400940200001436008052e8", - "0b40f9e083c13ce103c03db35a03a9e82300f9e81740f9e083843ce82f00f9e00b42adb37e04a9L8;FFf30300aae00308aaae000094e00313aa145c40f99f0600b1c0f4ff5413544ca9950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4BL8;FFea840194ea031faa49f9ffb", - "5d0ffff172003009000003491e48401942003009000603891e1840194200300d000602891de840194fd7bbea9f44f01a9fd030091L8;FF42008052e6840094e89f40f91f0500f1ab000054e0a340f901f97fd342008052df840094e8ab40f91f0500f1ab000054e0af40f901f97fd342008052d8840094BB", - "BL4;FF22008052e6c401941f0700f1ab000054e0031baae10318aa22008052e0c401947f0600f12b020054e00b40f9e10313aa22008052ff030791f44f45a9f65744a9L4;FB4d000000000000005303000009000000ed624900000000004d000000000000005b03000009000000303132333435363738396", - "1626364656653657373696f6e53L8;FFe7c40094e16f40f9f44f40f9810000b4e04740f922008052e1c40094b40000b4e04b40f9e10314aa22008052dcc40094e14340f9810000b4e02740f922008052BL8;FF80f6ffb4a9ffff17e003082ae10314aae20313aa1ffdff97601a00b5a0f5ffb4a2ffff1789", - "8244f83f0500b1810000549fde04a99f2e00f99f6200b91f0900f1L8;FFe0031faa090540f90a0140f9290100cb4a01008be0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9BBBBL4;FF970015eb48040a9b73040a9b2ae179d3690800545411", - "09cbb60209cbe00313aaf50301aae10308aae20314aadee40194c8e279d36002148be10315aa161116cbL4;FB7374632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c6962726172792f636f72652f7372632f6974L8;FFf9621932bf0208eb61", - "000054e00313aa35e40094680640f997fe78d319693538d51e0091750a00f937fbffb4680240f918631932bf0208eb61000054e00313aaBL8;FF210800343f0c0071400200543f080071800100543f040071e1020054e92b40f93f0500b140030054c1420091a20301d1e003082aa54eff9700faffb48300", - "0014L8;FFe764009460020191f30b40f9fd7bc2a871feff17610640f9810000b4600a40f922008052de640094611240f9810000b4601640f922008052d9640094611e40f9BBBL4;FFe80f00f9540300b4e10f40f9e80740f9b51240f91f0101eb80080054e80b40f9490380522a040091e00314aaea0f00f", - "909692138e1230091ea90ff97f60f40f9L4;FF2300009063c0029163d86878633c7cd3841e4092661000d1a54000915f7c0271477c0553421c45d38318039ba400038be9f3ff54ff14007140f2ff54000080d2L8;FF090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050", - "091280108ab22030054091440f9090100b42a0140b24a11c0da4a1540d2BL8;FFe0179f1a00250194881a4039691a4039b502000a1f01096be0179f1afa240194881e4039691e4039aa02000ad6020a0a1f01096be0179f1af324019488224039L8;FFe32400940008805221008052e1240094c00200b4a0", - "077ead971a0033a203de3c080880527f0200f917fc0039000400adc0f2c63c0208803d00f0823c60a200a9BBBBBBBL4;FF2800028b08f1df38080af837e00300917c820094e80340b9a8020037e90b40f98a0640f9480109eb030b00548a0240f94901098b892200a9680240f9e0031faaL4;FF1f2500f14", - "9150054e91300f9e22740f9a80000f008812991080140f938280091296f8e524a00018be003019141a30091e30318aa49110079480100f9e20f00f9L8;FFf44f05a9fd430091160840f9760200b4335040a9380200f018e30591170440f9b9730091750200f0b5a21791e8164038e3030091e00313aae103", - "14aae20315aaBBL4;FFa10100546083c03c6183c13c080080926283c23c680200f9e043803ce143813ce243823c6082803c6182813c6282823c71000014e87f41b9e90300b26343c13cL4;ZFL8;FFa9f31538a92356384a01084a6b01084aaa031638aa3356382901084aab131638ab435638a9231638a95", - "356384a01084a6b01084aaa331638aa6356382901084aBBBL4;FFf50301aaf30300aaf40308aae0d801940004805221008052ded80194401b00b4c00640adf70300aa000400ade00315aa13b10094f80301aaa100f8b6f5031faaL4;FB73656e645f656b2e726563762065706f636820c01b3a2048656164", - "657253656e74202d3e204374315265636569766564001b737071722076312e73656e645f65L8;FFe8274ba9e8b702f9e83f40f9e9af02f9e8bf02f9e8f340f9e8c302f9e83340f9e8c702f9e8f740f9e8cb02f9e82f40f9e8cf02f9e87f40f9e8d302f9e84b40f9BL8;FF20130054e8031faa49018052096", - "83f3808050091fa3b49f9e8d302f97a0300b4480340b20811c0da081540d2080d088b08250191481b488b0805009114000014L8;FF08018052e8cb05f9e8672a9100f18f3ce8c32c91e99b05f9ea9f05f90003813c0083823cf6bf05f9e0e3823dfa1f06f9fa3706f91f7f07a9f6d705f9f6e305f9BBBBL4", - ";FF60a240a9090d40f9e803009120013fd6e80340f91f0d00b1a1030054880200f96800805268620039f44f48a9f65747a9fd7b46a9ff430291c0035fd6760240f9L4;FB76657220636861696e20776974682073656e6465722072617463686574207075626c6963206b657920c01120636861696e206b65", - "7920696e64657820c000c0c0L8;FF0800f0d2965e02a9886200a9e80740f9992201a9e8c303910081c23c8002833cf8031baaf9c303913b0080921600f0d217008092351500b5e1031faa91fdff17BL8;FFa90315f8a98316f8a90318f8a8831bf8201200541a210091b72303d1bc6303d13900805209000", - "014e1f20191a22301d1b563ff97601700b5bc835bf8fa031caaL8;FF21800991ee780094e077c53de17bc53d58008052e8e36b799400805215008092e057813de15b813de8e30a79fc010014e8074091f6a745f90023009108810991BBBL4;FFe44300f9280108ab821e0054e9388ed2f40303aa89e3b8f2", - "298ec3f2e938e0f21f0109eb1731899a1f0103eb031d0054e80214cb1f0500f1a9030054fa4b40f9L4;ZBL8;FFe07fc03d88f240f8e123813dff2b01f9e09b803d88f207f808008092e09bc03dff7702f9ff7302f96012813ce023c13dbf7f34a96082823ce097c03dff4f02f9BL8;FF12000014eb0f8012", - "2c7c10532b2c0633ec0000352a7c0c530b050039090900394a091b320a010039080000142c7c12532a440c330b090039090d00398b6d1c32L8;FFf84b40f9680902f9e85b40f960621e91493100b8a90358f8613e42f9680d02f9a8835838633a42f97a1102f9754642f97b1502f96b3e1f91400540ad685", - "e1f39BBBBBL4;FFe083c23c2009803dab000014e80741b29b000014f403042af60303aaf50300aa5f2800f1880000542800028b08f1df38682ef837e023009172720094e80b40b9L4;FFe00318aae10315aaf2080094f40301aaf30300aa750000b5360080520c000014970640f9da080094e00315aa2100", - "805238008052d708009440feffb4e10317aaL8;FF287968f8e10308aa23090114ffc300d1fd7b02a9fd830091490200f029813d910a0000904ab12791400200f000403e91e92b00a96902009029810891e1030091BL8;FFe4008052197e0094b8835cf8e1034ba9fbf34ca9f9274ea9f6a34fa9e8a705a91", - "80300b43f0400f16b00005422008052db8801947f0700f1ab000054e0031caaL8;FF20fcff5498e2ff97c07a3378e14340f9f45341f9f3031faaf50301aa09000014e84f41f9c97a73780a7973784901094a09793378b50a00f173060091c0daff54BBBL4;FF88008052f30300aae023009104018052050d", - "805229f87fd33f1100f13481889ae30314aa40000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9L4;FB000000000000000008000000000000000800000000000000ecf545000000000000000000000000000800000000000000080000000000000084f9450000000000L8;FFe7c800949b", - "0400145c008052d4000014fc031f2ae0031baa080c48f81f0500b140000054a7c4ff97df0600b18002005474674ca9990100b49b22009104000014BL8;FFe748019460220091f4feff9760a20791f30b40f9fd7bc2a887feff176042069151000094e00313aaecfeff9760420891f30b40f9fd7bc2a87ffe", - "ff17610640f9L8;FF694240b93f0500716102005469aa4829c9030034290140b22911c0da291540d2290d098b2925019129fd46d3290d00910a0300344a0140b24a11c0da4a1540d2BBBBL4;FFc0035fd620008052e10314aaf1e80194ff4301d1fd7b03a9f32300f9fdc30091091c40f9f30308aa3f0500", - "b160010054090444a9e8230091e00309aa4fc30094L4;FB000000000000000008000000000000000800000000000000804c4200000000000000000000000000080000000000000008000000000000009c54420000000000L8;FFe8020054481840b9a8030037e801805214000014e003c03de80b40f90900", - "80926082803c680e00f9690200f9fd7b47a9f34340f9ff430291c0035fd6e8018052BL8;FF291540d2290d098b2925019129fd46d32905009102000014e9031faa280108ab22040054097840b93f05007141010054097c40b9290140b22911c0da291540d2L8;FF89028052e86301f9e96701f9f2feff172", - "143c23c2007c03dfc430f912283c33ce8b341b9e0430691810f803debc741b901048052e002803de9cf40f9ea9741b9BBBL4;FFb9035cf8a8035bf8080119cb5f0308eba82000541a0100b4a8835bf8e1031caae2031aaa0001198be5a8019439031a8bb9031cf8ba835bf8e10b43a9e32340f9L4;FF0901", - "805210000014f30303aa010100b4e00302aae10313aa5c090094e00000b4e8031faa800600f906000014e00313aa0302009460ffffb528008052880600f9L8;FFe80319aae30318aae20317aae10316aae00315aa0200001426008052131900a9e70313aa130900f9f44f45a9fb0b40f9f65744a9f85f43a", - "9fa6742a9fd7bc6a8BL8;FF04000094fd7b41a9ff830091c0035fd69f0001f1e1210054fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0312d1ff0300f9f40301aaL8;FF22008052e6280094e8a340f91f0500b160000054e0020391cce7ff97f45b53a9960100b4972200910400", - "0014d60600f1f7620091e0000054e1825ff881ffffb4BBBBBBL4;FFa8035ef86a0740f9490108eb433300546a0340f9b7835df84801088b682700a9e8fe60d3681a00b5e00a40921f1800f1e21a0054e17e0353e11c00343f080071L4;FF416b0054d4060031f53f00b922860054a04700d1f50316aa12c3", - "ff97e08b01b9a04700d10fc3ff97e08301b9a04700d10cc3ff97e07b01b9a04700d109c3ff97L8;FF285c40391fb5007181040054ff8301d1fd7b04a9f44f05a9fd030191280040f9299040b8f30300aa2ae040b8f40301aaa05300d1e80700f9283041b8e92b0229BBL4;FFe39001940004805221008052", - "e1900194201800b4f60f40f9f40740f9f7830091e0a2c43de1a6c43d880216cb1f7d00f1000400ade9140054f50b40f9000440adL4;ZDL8;FF810000b4602a40f922008052e4900094b40000b4600640f9e10314aa22008052df900094610e40f9810000b4601240f922008052da90009414008092740200", - "f9BBBL4;FFfc031faa360100b593ffff1713008092f54340f9f94f40f9b74302d1e8af40b9fc031faa96f1ffb46a0b40f9090e8052ec0d80924969099b2bb1019149011c8bL4;FBe482bdb40f826bea9651aaf507e25709d5d09b84081a4ed735daf8a2296006a897900b70265932f53743a28c935fa54c0", - "0002c5d04c6d549f47937ce5561074fL8;FF092540f9e9cf00f9092940f9e9b300f9092d40f9e9c300f9093140f9e9ab00f9093540f9ea2712a90a2547a9ead700f9e94f00f90a2548a9ea5300f9e9df00f9BL8;FFe043169122008052e6100094e1d342f943feff17e0431691e1031aaae20318aae01000", - "94fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaaL8;FF96010014e8031691e00316aabf500094c8624039fbc342f9f5c742f9f7cb42f9e86316392801009008010391e8d302f9e80180528083cf3ce8f304f94003803dBBBBL4;FFf85f05a9f65706a9f44f07a9fd83009114b840b9", - "f30300aaf80301aadcf001940004805221008052daf00194a00700b4164b40f96082c93c6182ca3cb4c31fb8L4;FB54696d657374616d7020746f6f206c617267650000000000e9974800000000003800000000000000450000003f0000006c69627369676e616c5f70726f746f63L8;FFfa6744a9fd7b43", - "a9ff030291c0035fd6170080923800805219018052a80640f91f0116eb890c0054e00313aa98f0ff97e80300aae00301aae8fd073708fc60d3BL8;FFe00742ade83700f97f0200f96082863ca00b7ead6182873ce11bc03d6282853ce00b01ad6182883c6082843cff430791f44f44a9fc0b40f9f65743a9", - "f85f42a9L8;FF7b0e0094e08f49f9800100b4e1d342f9e8cb42f91f0101ebe0840054e8cf42f9090180522a04009109692138e1431691ead302f96e0e00949f0600b160a1ff54BBBL4;FF690000140a008092fc2b40f9360080526a6e00a9330080520a0500d15f0d00b1a8010054e00309aae10308aa220", - "08052f7030baadab00194e00748a9eb0317aaL4;ZBL8;FF01098052f3b00094a00100f000003b91e6b00094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4318d1ff0300f9f50301aa281840f9BL8;FFc80080d2fa4340f9fb8302910800f0f2084500919f0308eba1020054e08", - "3329157e7ff977401001428008052e81300f9f32b41f9e83341f9f92700f91f0500b1L8;FF086d2691e95305f9290080d2e86b05f9c8048052293fc0f2ea6f05f90a078052ff4305f9e84b05f9ff4f05f9ea5705f9e86305f9e96705f9e5300094e1eb43f9BBBBBL4;FFe3000294e00316aa21008052e100", - "0294e00400b4e10317aae20316aaf50300aae700029417035ff8f70100b419835ef8d7000294e00317aa21008052d5000294L4;FF810000b4e00f40f922008052e400009474deffb4e02b40f9e10314aa22008052df000094eefeff17e1e740f9e02740f9e8000094080140392940805208c10051L8;FF29", - "318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f60300aa080014ebe3100054ff0208eb09010054e0e30091e10317aa22008052BL8;FFff0301d1fd7b01a9f51300f9f44f03a9fd430091080040f9e00301aa15d140a9e803009121810194740100b4130300f073621291e003", - "0091a1630091e20313aaL8;FFe0feffb43f0700b1f78301a9ff1700f9e0130054e8031faa990a40f94901805209683f3808050091e81700f9390800b4280340b20811c0da081540d2080d088bBBBL4;FF91e7ff97e863403908030036e92b42a9880280d20800f0f2682600a96a0a00f9f44f47a9f72b40f", - "9f65746a9fd7b44a9ff030291c0035fd608008092a9030090L4;FB79206d6573736167652066726f6d20c0001f70726f63657373696e67205072654b6579206d6573736167652066726f6d20c01d20776869636820686164206e6fL8;FFa00b3aad6283c53c6083c43ca103933c6183c33ce08b01ad6083c", - "83ce10b803d6183c73ce84300f9e10303ade317803d6e000014e08302918122009102398052BL8;FFe00313aae10317aae20315aae5000094770a40f9680240f9080117cbbf0208eb09f8ff54e00313aae10317aae20315aadc000094770a40f9baffff17e00313aaL8;FF619640f93f0400f18b00005460", - "9a40f922008052e2400094613240f9810000b4603640f922008052dd400094613e40f9e10000b4604240f922008052f44f42a9BBBBL4;FF41fdff54e04305918100805209e10194e0a70035e85341b9e89300b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2aL", - "4;FB000000000000000009000000000000000900000000000000d0fb480000000000d7fb480000000000000000000000000000000000000000000000000000000000L8;FFc00300b4e10316aae20313aaf50300aaebe00094f61640f9f60100b4f81240f9dbe00094e00316aa21008052d9e00094a00200b", - "4e10318aae20316aaf70300aaBL8;FFc10200f021102891c40200f084e01291e0230091a32300d142008052a8831ff82c610194f40200b094a22391c10200f0218c2f91a32300d142018052e40314aaL8;FF080540f9190101eb031e0054680240f9080540f91f0119eb690d0054e00313aae2fdff972024", - "003728fc60d3681000b5200840921f1800f102110054217c0353BBBL4;FF8a4640398b26407908bd70d3e083c03c420300f042801891e0230091a34300d1082109aa6905c05ae083803cb6831ff808010aaa0ad49052284108aa2a00a072L4;FF000080d21f000039007d20d4bfc021eb82010054a31443a", - "ae703252a630843aa631043aa2800030a2100030abf0001eb0101070b2130881abfc021eb23feff54L8;FF73620a9188620091810100f0213c1c91e0230091a32300d142018052e40313aaa8831ff82ba1009488720091810100f021501991a32300d1a2008052e40313aaBL8;FFea200194e80f0036a802", - "02abc2130054ca0215abe21300546b0240f93f0009ebe80f00f96b0115cbeaaf00a9880f00546901158b480115eb690200f923100054BL4;FFf85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a90bfefe97e0230091f7a700a908fefe97e00313aae1031faae20314aa2300805224008052bd0100", - "94L3;ZB" + "BBBBBBBBBL8;FB00a040000000000000a04000000000007ce50500000000007ce50500000000000000010000000000010000000500000000900600000000000090460000000000L8;FF4240399125feff90a5002c91e1230091e0031f2ae3031faadaa0009423feff9063402b91e0120091e10314aae2031", + "5aa00a1009420feff900000299122feff90BL8;FFb5a2019181ffff54682640f9c80000b4090d8052e00314aa02018052017d099b55250194617e40f93f0400f18b000054608240f9220080524f250194619640f9L8;FF0b00be522b000b0bac1d00128d00f83761710c8bab008052300000144d15c039ae", + "1d00128c1d0e0b8c0102518d00f83761710c8bcb008052280000149f114071BBL8;FF817e40f93f0400f18afcff54e6ffff17089440f91f0500b160000054014001b9c0035fd6fd7bbfa9fd03009180ffffd000d41a9182ffffd042a01b91c1058052L8;FF200840921f1800f182070054217c0353010800", + "343f040071000100543f08007141fdff5481220191e20313aaacfcff97000100b483000014200e00b5e00313aaBL8;FFfa6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf40301aa3bf2ff97e80300aae00301aa08020037750240f9L8;ZDBBBL8;FB420", + "24000000000006a00000000000000750000002e00000042024000000000006a000000000000000e00000026000000496e76616c6964496e7075744c656e67L8;FF60faff542801088b49011f8be16300910001098bd292ff97990100b5280000144b0080528cfaff35ec031faa8b010b8b2801088b49010b", + "8be16300910001098bBL8;FF098500a92900805209010039c0035fd6ff4306d1fd7b17a9fc4f18a9fdc30591000440adf30300aae8a30091e0030091e1031f2ae00700addb000194e82b40b9L8;FFfd830091010840a988008052f30300aae0230091040180520503805229f87fd33f1100f13481889ae30", + "314aa0c000094e80740f91f0500f1e0000054e80b40f9BBL8;FF69520478e92340f9685e0139697204f8e82746a976a205a9e87e045369f204f8e93f40b97a0202a978fe00396a260d2968c20139e1e7ffb4e02740f9d3ffff17L8;FFf40302aaf30301aad2000094e80300aae00301aa08020037980240f", + "9080740f91f0100eb42020054e80f41b2e80700f907000014c90080d248008052e0430039L16;FFe8c300f9e81b42f9e8ab00f9e81f42f9e92312a9e82342f9e92742f9e8ab1aa9e82b42f9ea3f42f9e9a309a9e82f42f9e93b42f9e8df00f9e83742f9e8af15a9BBBBL8;FBe4954200000000002c974200", + "00000000e4944200000000003d0f4000000000004a00000000000000270500000f0000003d0f4000000000004a00000000000000L8;FFab535538a93315384901084aaa635538a94315386901084aab735538a95315384901084aaa835538a96315386901084aab935538a97315384901084aaaa35538BL8", + ";FF2a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9050054280108ab8300005426000014e80308ab82040054090840f9L8;FFe0a300b9a04700d1c1c2ff97e09f00b9a04700d1bec2ff97e09b00b9a04700d1bbc2ff97e09700b9a04700d1b8c2ff97e09300b9", + "a04700d1b5c2ff97e08f00b9BBL8;FF0083833c09230d29e85740b90183843c00d305a908c30139b50000b4e00740f9e10315aa2200805253550194e02740f9f40f40f9930000b4e10313aa22008052L8;FF9822009104000014d60600f118630091e000005401835ff881ffffb4000340f9220080525455", + "0094f8ffff17e88b40f9c80000b40805088be00314aa02018052L16;FF027080520081009162d50094e0d3c23de1dfc13de9670b91e8c343f9f89b45f9f99f45f9e0f3803d21f18f3ce8f701f9f7eb01f9762500b4f7b340f9e8830591BBBL8;FF2300805224008052cb000094770a40f96affff17e00313", + "aa220080522300805224008052c4000094610a40f971ffff17f50300aae00313aa2200805223008052L8;FF0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb481700545f000014fa031faaf9b749f9f8074091188309913f0700b180180054BL8;FF220080525cf50094b40", + "000b4600640f9e10314aa2200805257f50094610e40f9810000b4601240f92200805252f50094688e46f81f0500b1a0000054e00313aaL8;FF021040f95fcc74f2c000005442cc749242fc44d3420400d15fc024eb23e3ff547f0000f900ffff9788ffff1742141a125f003f7161e2ff54f2ffff17734e00", + "a9BBL8;FF35000014eb031faa3e000014f3031faa0901098b0a0e8052f4cf42f9210108cb00510a9b33110094e00314aae10313aa30110094d50000b4a8e279d3e00314aaL8;FFe83701f9e83f01f9e9030a39f7e741f9f6e341f9570300b4f50316aae00315aa3cefff97f70600f1b5c2009181ffff5413", + "0000142009c03dc102c03de89b44f9L16;FFea6300b9eaa35f39e417c23d3b8108aae18b14ade11bc23deccb43f9e97344f96b1147f8eaaf00b9e00bc23de31fc23de203c23de48715ade107c23de8ff43f9BBBBBL8;FB795f69647369676e65645f7072655f6b65795f696474696d657374616d704d6573", + "736167654b65796369706865725f6b65796d61635f6b657969765072654b65L8;FFcaffff17a9035ef81325889a5f0309eb40030054d70a138b480313eba900005402f57ed3e0120091e10317aafe9d00945a070091fb02007933008052f4060079BL8;FFe00313aae10316aae20314aa67010094760a40f", + "9680240f9080116cb9f0208eb69f8ff54e00313aae10316aae20314aa5e010094760a40f9bdffff17fd7bbca9L8;FFf90318aafb0316aae11340f9810000b4e00f40f922008052571d0094e8fe70d3e9fe60d3956e00a9995a01a9889e0039280080529c820039971202b889520278BBL8;FFe127803d773", + "08a9a08050091641b803de28303ad000440adf3ff4139e1a300a9220113cbe18f02ad5c0302ebe013803d220200546003138be10319aae2031aaaL8;FF61000054e06317918ffbfe97e8f342f909068052e02fc13d6822099be133c13de237c13d18000014c80080d2e0031791e3032d910800f0f2e48332", + "9161fdfff0L16;FF941240f91f0101eb80080054680640f9490480522a040091e00315aa6a0a00f909692138e10313aacdeaff97760a40f9680240f9080116cbbf0208ebc8070054BBBL8;FF740240f9820640f9620800b4810240f92800c0394808f837480400d1290400914e0000148000805277000014", + "740240f9820640f9020700b4810240f920008039L8;FFe0074091fbcf44f9f9c744f900802f91f5cb44f901048052e01b843de11f843de223843df6ef07f9e3ff863de3fb863d91770094537d00940004815221008052BL8;FF29318a9a2a0080525f0014eb570909aaa0000054c9fe7bd3a90000b5f7161", + "68b10000014f30315aa11000014f80308aa54fd009400058052010180524dfd0094L8;FFfd7bc1a8c0035fd6c0035fd600000000210000d02044463960010035200000d0220080522244063900a440f9c00000b4210000d0a0dcffd02180069100000091BBL8;FFa203de3ca303df3ca303983ca203973ca", + "103963ca003953ce8270e294809c05a6909c05ae8270f298809c05aa909c05ae8271029c809c05ae909c05ae8271129L8;FF60c21491e1032a9102248052757e02f9778202f97c8602f9788a02f9768e02f97a9202f97b9602f95a3d0094681242f969e21391600e42f9692a03f9081140f9L16;FFe9734f", + "f8ed6f44f9e18b14ade1fbc13de0ebc13de8bb01f9e87344f9e3ffc13da97202f8e2e3c13de23744f9e48715ade1e7c13deb3b44f9eda306a9e87744f9BBBBL8;FBa1938a4c17e19d149064a88a5511296483e2513ecce93c95a29a53dfeb393c25a28cea1bdc4d293c83e9000084d2fa23d4da034e301e5", + "a38f3f75bff44b2dc76L8;FF08f93891a96d8252080140f909100079138304a9080000f9132f00f9598d00944001805241008052528d0094c05000b488ad8752130306a90810007908edb1d2BL8;FF08390091e9bf03f9e8bb03f9480200b0081140f91f0500f169050054e8c32c91c9feffd029a93791e8", + "5b04f9080200d008611591e85f04f9e8c31691a04700d1L8;FF370080520c000014f80301aa5d0d0094e00316aa2100805239008052550d009420feffb4e10318aae20316aaf70300aa580d0094e0230091e10316aa22008052BBL8;FFbac301d11f0500b1a3f3ffb5e0060054e81340f9e92300918a0200", + "d04a61159140fffff000380a91e9ab05a9a9a300d1e1630191a8831df8e8230291e9ab06a9L8;FFc1fdff54f40314abe2020054688e4bf81f0500b140020054e00313aa52010094080040b20811c0da081540d2080d088b0825019109fd46d30800098b08050091L16;FFe86304f9e85f40f9e86704f9e8e", + "340f9e86b04f9e85b40f9e86f04f9e80740f9e87304f9e83f40f9e87704f9e9235ea9e88304f9e87f40f9e97b04f9e88b04f9BBBL8;FFaa031af8aa935c38a9431b7869038052a8831a78a8ffff9008e10591a8273da9b7831cf86a0f0036e80340f9edbb40a9e92b40b917088052a0e300d108bd70d3L8;", + "FF0090199108210091e1c30e91e9db01f91a00f0f2eadf01f90e690094e81f40b9e8c306394d0000142093c13ce9df40f9e8a30539e012803d2093c03ce9f204f8BL8;FFb7f8ff97f7bb40f9ff0600b160350054fb0318aaf6e357a9b82100b4d922009104000014180700f1396300910021005421835ff8", + "81ffffb4200340f922008052L8;FF630400714001005440ffff370100050be203002a80fc5f885f00006b01ffff5481fc008880ffff35c0035fd685fc5f88a504001185fc0088a0ffff350700b012BBL8;FF2200805269110094e1d342f98ffcff17e04316912200805264110094e1d342f95efdff17e043", + "1691220080525f110094e1d342f984fdff17f40300aae0431691L8;FFf6e742f9fb074bf9f90b4bf9fc0f4bf9f8134bf9f5174bf9c80240f9f7e342f9680000b4e00317aa00013fd6c10640f9810000b4c20a40f9e00317aa4e2d0094L16;FF21008052380080525aad009480fcffb4a1020291e20317aae", + "01b00f95dad009458ad0094001080522100805251ad0094c01e00b4a00642adf90300aa882e40f9BBBBBBL8;FB2d313934396366386336623562353537662f70726f73742d302e31342e342f7372632f656e636f64696e672e7273002f636172676f2d72656769737472792f69L8;FFd807009408fc60d33", + "d000014680100d008210091a94300d1e00f00b900210091a22300d12100805203fefff063c00a9104fefff084600b91a8273fa9d99c0094BL8;FFe10314aaefffff17e00301aaf30301aae10309aa22008052f4030aaa630500946ba240a9ea0314aae10313aadeffff17ffc303d1fd7b0aa9f95b00f9f85", + "f0ca9L8;FFfd7b48a9ffc30291c0035fd620fdfff000a02f910d1d0094ffc301d1fd7b03a9f72300f9f65705a9f44f06a9fdc300910920403909080037010040f9f30300aaBBL8;FF04000014e00315aae8031faa600600f90a028052e90314aa696a2af8680200f9f44f42a9f50b40f9fd7bc3a8c0035fd", + "6fd7bbaa9fc6f01a9fa6702a9f85f03a9L8;FF490480522a040091e00315aa6a0a00f909692138e10313aa20faff97770a40f9680240f9080117cbbf0208eba8090054680640f9e10316aae20315aa0001178bL16;FFe003009122028052a400805209000014e00300f981fefff021640d9183fefff063c4", + "0d91e0030091220280524400805246e7ff97e10340f9acffff17c80080d2BBBL8;FB0800000000000000e80b4600000000009cf545000000000020000000000000000800000000000000040e4600000000009cf54500000000001000000000000000L8;FF806a40f9800100b4e11740f9e80f40f91f0101e", + "bc03f0054e81340f9090180522a040091ea1700f909692138e1630091cb8eff97e00314aa080c4af81f0500b1BL8;FF60010194e00313aa2100805259010194400100b528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd620008052800600f909028052L8;FFe8010054f703", + "00aaf60315aa8002198be1030091e20317aa5e01009468031ccbf50316aaf9031caa1f0540f11731989a9f0344f1a9faff541c000014df0219ebBBL8;FFe00314aae10313aae82700a9f73c0194f44f43a9f51340f9fd7b41a9ff030191c0035fd6000040f9c2fdff17080040f9e20301aa002140a9e1030", + "8aa163d0114L8;FF776a41f900c3c73c01c3c83ce9ff43b9f6db43b9756641f9e80240f9200708ade92303b9680000b4e00315aa00013fd6e10640f9810000b4e20a40f9e00315aaL16;FFe10315aaf16f1ea9f10305aaeabf40f9e89300f9e85b40f9f50316aae65b00f9e65f40f9fb0307aae80700f9ee", + "234da9e9e740f9f2d340f9f4ff00f9e85f00f9BBBBL8;FBff92a0035f2ac6a51ca82011eec4a26d12210932fd6eb394c1276d9a0a18af863985fcd632f50000bd7ecd09206045036f2e47ac3eab0077c1c564f4dabfeb07L8;FFfd7bbfa9fd030091083040f9080100b4080140b20811c0da081540d2080d", + "088b0825019108fd46d308050091091840f93f0500b1400400540a2040f9092c40f9BL8;FF36008052e0dbc23de1dfc23de88332911f030071fa7706f900818b3ce0e3c23d01818c3ce1e7c23d00818d3ce0d3c23d01818e3ce1d7c23d0081893c01818a3cL8;FFcd020054b403f8b6f7031faae00317aae", + "10314aaf00c0094f8031f2ae9feffb40a1f00124a09380b4a791f535f0d1872410100540b1540386bc100517f250071BBL8;FFe00316aae10313aaf34c0194f50300aa5c510194e00313aa210080523600805254510194e0feffb40801805208000039f40000b4a10240f9f50300aa00040091L8;FF00603", + "e910d4d009480fdffd0002020910a4d0094fd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091L16;FF5dd10094e8032b9100e1009156d8ff97a9100014e0031d9121200091023c80525cd10094e9c743f9080340f91f0109eb892f0054e1a343f", + "989008052680a00f9BBBL8;FF63540791e0230091020280528401805279010014089440f91f0500b1a1000054280080521f9c00f91fa012a91f4001b9481c00121f090071e1110054730040f9L8;FFf56c009420008052012c8152f26c00942000805221058052ef6c0094c0fdffd000c03e91056d0094c0", + "fdffd000803791026d0094c0fdfff000200791ff6c0094BL8;FF0c3900a96d190012211c0daa6bfdff363f0900f1e0fdff544b09c0394c0d00912e0d00d10c3900a96d19001221380daa4bfcff363f0d00f1c0fcff544b0dc039L8;FF007d20d4f72a0091c17a77f8610100b400008052610600f9210040f", + "9610200f9330400f9610640f9330000f9f35341a9fb7345a94dfeff17734e00a900008052BBL8;FF948209911f0500b18000005480020491e14316912a130094e8cf49f91f0500b180b5ff5481e20491b4010014e1d342f9e8cb42f91f0101ebe0770054e8cf42f9L8;FFe1e3c13df91b02f9000700ade07", + "3c23de177c23de0671139c00600ad097142396902003609dd49b8ea0308aa4b4d40780c7d40394a09403900f1c03c087140f8L16;FF603640f922008052f44f4aa9f65749a9fd7b48a9ffc3029157b10014612640f9080080921f200039080000f93f0400b140010054810000b4602a40f922008052BBBBB", + "L8;FB2900000000000000bb114000000000004700000000000000310100000d000000bb114000000000004700000000000000320100000d000000084b420000000000L8;FF21380e13a5300a0a2901044a6b010c4a00240a0a08350a0a29010b4aab010e4a0c02114a4d00034a2a380a0a6b010f4a8c0112", + "4aad01054a29010b4a8b01004aBL8;FF09ffff9029a13691e00301aa08014039227968f809ffff9029013791287968f8e10308aae6140114080040f9e20301aa002140a9e10308aa16150114281040b9L8;FFe00755ade96341f9e97f02f94083803c4183813c45000014e9830a9168008052eaef4bf9e96", + "b02f9e9eb4bf9e0230891e8830a3928008052e143139142008052BBL8;FF2000805201048052f3540194ff4307d1fd7b1aa9fc571ba9f44f1ca9fd83069100e4006fe40301aae30300aaa0c302d1e1031faaf30308aae00300ade00301adL8;FF68fdffb008091e91e96306f9290080d2e87b06f9c804805", + "26940c0f2ea7f06f90a078052ff5306f9e85b06f9ff5f06f9ea6706f9e87306f9e97706f907550094L16;FFe8270b39f56301f945000014e06301f981feffb02128179183feffb063ac17914700001448008052e0230b39e8270b39f56301f9e5ffff17a80a00d1a10312f8BBBL8;FF08050091280800f9e", + "af8ffb43f0108eb73611932600500549369283808050091280800f9e006f8b7e0030aaabfffff17e10300a9e00301aae10309aa22008052L8;FFe8d40054e8cf42f9e10316aae2031aaa00011c8b5f79009488031a8bfc074091f60740b99c830191e8d302f9b9010034e1d342f9e8cb42f91f0101ebe0d4", + "0054BL8;FF0800f0f2081d00d11e0000141f150071000200541f11007141040054280180d20800f0f217000014e00313aa3b060094e80300aae8070036e00301aaf44f45a9L8;FFec030daa600100549f010aeb20010054ed030caaae15c038eefeff36cd1d0012bf81037122feff548d090091f2ffff170", + "80109cb8a000014681e00910af17d92BBL8;FFf6c744f90083c03c0183c13c0283c23ce007409100c0359101088052f6ef07f9e0fb863de1ff863de203873df60b0ef9e36b873de367873de363873de35f873dL8;FFf6f3ff97e0f4ffb474010014e1832491a22302d1f1f3ff9740f4ffb4560100141f080", + "0f1e1220054a80302d1a10302d1a22302d11f7d01a908018052bf6338a9L16;FF022e8052e8f203f8e8c31591f7430d91008100915fb90094e0e3c03de8f243f8df0600b1e9c31391f40b00f9f4bb02f9fce315392091883ce8c702f940640054BBBBL8;FBfb0000002e00000042024000000000006a0000", + "00000000009c0000002e00000042024000000000006a00000000000000020100002e0000004202400000000000L8;FFf7031faaf6031faa19038052fa23019108000014a80359f8d6060091f70a0091df0218eb15693338b78319f8e01a0054c00e40920850b99b0a0940f92a0300b4BL8;FFa80240f9690", + "200f9680000b4e00314aa00013fd6a10640f9e12a00b4a20a40f9e00314aa5409019453010014fc831291e8db42f9f90316918043c03df7cf42f9L8;FFf0ffff17f8031faa130180521f080071e2f7ff54f7031faaf5031faa14018052bf0a00f1400a0054bf0e00f1014d0054880640f91f1100f1000400", + "541f1900f1BBL8;FF570400b4541340f95e490194e00317aa2100805257490194601500b4e10314aae20317aaf80300aa5a490194482740f91f0500b120030054592f40f95b6340b9L8;FF22000014882245b8e92f4379eb4746398c9246f8edc74639eaa34639e8d303b9e9ab0779e8a759a9ecb300f9ed", + "a305392b1f0036ebd343b9e96306394921c993L16;FFf29710a9f6f300f9f6030daae4af00f9f51300f9f7ef13a9fa2300f9e7fb16a95cc90094e72340f9e31340f9f70314aafb031caae10316aacd00001429a041a9BBBL8;FFff8200f181090054e81f40f9f95f40b91f4100f1a1090054ed2f44a90af0", + "40f8137040f8166c4039177041b8ea1f00f9680140b9693140b8ac0140b9aa094079L8;FF810000b4602a40f9220080525a690094613240f9c10000b4603640f922008052f30b40f9fd7bc2a853690014f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9BL8;FF82060054217c0353a10600343f040071c", + "00100543f08007161fdff54888243f81f0500b1810000549fe203a99ffe04a998fe05a981e20091e20313aad2f8ff97L8;ZDBBL8;FF808601ade8b700f9bc0000b4e0031baae1031caa22008052572901945f0b00b1c1f2ff548082c23ce8bf40f9e0430691e1e30091022180528002803de8ab00f9L8;FF", + "64290094d8de40a9b70000b52700001435008052d8de40a9970400b4e806178b198300911aed7cd3040000145ac300f139c30091a003005428035ff81f0113ebL16;FF9f020bebe8020054010100b4a17c019be00302aae20315aae30314aa57a90094800100b507000014340100b455a90094e00314aae1", + "0315aa4ea90094a00000b5BBBBBBBL8;FB332e302f7372632f6c69622e7273001545787065637465642030206f7220312c20676f7420c00010496e76616c696420706172616d733a20c00076656e646f72L8;FF480701d11f0008eba9110054e0031f2ae80316aae90317aaea031caa2b154038080500f14", + "c1540388b010b4a6001002a61ffff5426090094a1835bf8fa03002aBL8;FFe90344a9080009eb630e0054ff0208eb68080054340117ab420e0054f42300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889aL8;FF620380526401805216000014c90080d228008052a0831d", + "380900f0f2a8931d38a9031df805000014e10300aa0f000014e80f41b2a8031df8a0c300d1b429ff97BBL8;FFe8f77fb21f0008eba83000549f060071e1010054a8035df81f0500f1402d005428008052a9835df80b050091e003192aa1c300d10a018052ab031ef82a692838L8;FF80010034610a40f968", + "0240f91f0101eb20050054680640f9090280522a0400916a0a00f909692138e10313aa1bfcff97818a40a960008052e30313aa6dfaff97BL8;FF000100b45d000014600900b5e00313aa42f0ff97e80301aa80000036c80900b5e1031faadcffff17e1031faa882e00f9d9ffff17c10b0054e0031faa9bff", + "ff17L8;ZDBBBL8;FB1d1c400000000000540000000000000079000000050000001d1c40000000000054000000000000007f000000050000001d1c4000000000005400000000000000L8;FFe81700f9601c005480220291d3eeff97080040b20811c0da081540d2080d088b0825019108fd46d30900088b37", + "050091ff0208eb081b0054f8000014e11740f9BL8;FFfd030291210a00b4f30300aa691640383f1500f1e1090054298400d13f8100b1e2090054e90400b42a0200f04a1140f95f0900f163040054e90700f9e9230091L8;ZFBBL8;FF08200091200440a9e92300910a0000b04a210491e8a700a942ffffb0", + "42ec1f91ea0f00f9e3430091f03e0194fd7b43a9ff030191c0035fd6202040a941ffffd0L8;FF1f1800f102110054217c0353211300343f0800718d0100543f0c0071600200543f100071c00200543f14007141040054c1220191e20313aae8fdff97600300b4L16;FF00610091e94b00f962c30094e0233", + "391e1430f91022f8052fa430f915dc3009448e30591ff0200f1e9b742f9000540ade8079f1ae80208cbe96306f91f0500f1BBBBL8;FB84000000090000004e1a40000000000058000000000000009f00000009000000c80340000000000058000000000000007e000000090000005369676e616c5f50L8;F", + "Fe00308aaa9faff97e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eba9140054088c48f81f0500b1BL8;FF08a440a9e20301aae00308aae10309aa210f0114fd7bbfa9fd030091083040f9080100b4080140b20811c0da081540d2080d088b0", + "825019108fd46d308050091L8;FF0a00f0f24a0140b228dd7892eaaf00f9f1000014e96753390c0180d2e8031faa0c00f0f205000014090180d2e8031faa0900f0f22c017fb217fd60d3291d0012BBL8;FFe20317aaf90300aa62530194e10740f9810000b4e00318aa2200805256530194955a00a9955e0", + "1a9995e02a9933200b9f44f46a9f65745a9f85f44a9fa6743a9L8;FFf63b42f9e9d304f9680000b4e00316aa00013fd6010740f9810000b4020b40f9e00316aa545300947f0b00b181040054e91f40f9e14341f9e0031691ffa71139L16;FFf44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a857", + "d30014e80301aa190340f90aa5c0a90b7142a90e3156a9143555a9ea4700f903015ba9e96b00f9BBBL8;FF610a40f9680240f91f0101ebe0200054680640f9090a80522a0400916a0a00f909692138e10313aa40f9ff97805641b980010034610a40f9680240f91f0101ebL8;FF1f0308eba8350054e8cf4", + "2f9e10319aae20318aa00011a8b5e7300944803188be8d302f9f89749f9f90b40f9780300b4e1d342f9e8cb42f9f99349f91f0101ebBL8;FFfd7b4aa9ff830391c0035fd6e0230091f7a300a9d0f1ff97e0230091f7a700a9cdf1ff97e00313aae1031faae20314aa23008052240080522d170094770a40f", + "9L8;FF211040d30020c11a000400511f00046a01010054440440f95f0004ebe0020054c0020e91e12a0091e20304aa047821f8401840b9e0200035400840f943008052BBL8;FFe09f49f9220080525b330194b30000b4e07b49f9e10313aa2200805256330194e18349f9810000b4e08749f922008052513", + "30194e80740910881099100c10391L8;FF72edff97f3d34ea9940100b47522009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f92200805251330094f8ffff17e87340f9680300b4L16;FFe10318aae20315aaf60300aa61b300947000001436008052e007c13de10bc13de20fc13d", + "882640f9893240f9a0073ead8082c33c8116c03da2039e3ca003963cBBBBBL8;FB7a65206b65790000770d4000000000002e00000000000000e00000000e000000770d4000000000002e00000000000000cd0000000d0000006c69627369676e61L8;FFe83700f9a85701d1e183843ce18f48ade08b42adb", + "f8200f1e92300f909088052b8328a9ae10f01ad08050091a00b3cade213c03de80f00f9a30b3bade28347adBL8;FF1f0900f1830b0054155040a9f60300aae063009102048052f30303aa81e2009180ffff97886a40b9d40a40f9e00313aaa81b00b9e84301916fb5ff97e82b40f9L8;FF3d1a0094f7db51", + "f9ff0600b1a00d0054fbdf51f9f6e351f92c008092f90317aae1ab4bf9c10000b4e0031aaa22008052fa030caa501b0094ec031aaaff0600b1BBL8;FFe8a30091e00309aabe550094e8a340391f050071e10d005499ffff90396b20913a0480520400001479fffff039a33e911a028052a00301d1a0deff9", + "708008092L8;FFaf000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f9bc61ff97e10300aae15306f9e083329161fdfff021203f9102028052a3fdffb063c02b91L16;FFa083de3ce87f04a948008052e87f05a9ff2306a9e87f08a9ff2309a9e87f0ba9ff230ca9e87f0ea9ff230fa9e87f", + "11a9ff2312a9e87f14a9ff2315a9e87f17a9BBBL8;FF0a088052f4031faaf5ff03a92911c0da490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f60300aaL8;FFe383833de37bc33de183c33d2083853ce08bc33de8cb02f92183863c2283873", + "c2083883c2383843c20010054e0f3c63de1074091e043169121800991f53309f9BL8;FF0a819f1a0948003969010d0b4a114e0b29c10011cb0d00122c2c4039094c003949c100117f2500710950003909819f1a9f7d02710a819f1a8d0d00122e304039L8;FF080013aae82500b4880080527f0277f28a00", + "80520802a072e903332a6b7e03534a01889a68020072293977924a119f9a3fc969f26c7e015349016fb20dfc50d3BBL8;FF4a1d409229010aaa682600a9fd7b44a9f32b40f9ff830191c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091f30302aaf40300aaL8;FFe80b00f9", + "680a41f9e80700f9681241f91f0500b100020054761a41f9683a42b9e81b00b9d60100b4751641f9553b0094e00316aa210080524e3b009460d900b4L16;FFec2b4ba9e8a301f9a8008052e0a3803ddb020014f60301aa9f0700b1f70318aa60020054940100b4f522009104000014940600f1b5620091e0", + "000054a1825ff8BBBBL8;FB5700000000000000f00000003d0000007a134000000000005700000000000000b80000001f0000007a134000000000005700000000000000cb00000013000000L8;FF280c0054770100b45e8b0094e00317aa41008052578b0094e80300aa40008052e87300f9080b00b4f66f", + "00f90300001448008052ffa30da9b60000b4e07340f9BL8;FFeeffff17280400d11f0d00b1a8fdff54c0825ff8e9ffff17d3e640a9280340f9680000b4e00313aa00013fd6210740f981fcffb4220b40f9e00313aae0ffff17L8;FFfd7bbda9f50b00f9f44f02a9fd030091f40302aaf303012af50300aa5", + "90b00940003805201018052520b0094400100b4155000a901fdfff021c00891131000b9BBL8;FFe0aa843de0a6843de0a2843d0fefff97e08643ad68ffff9008ed2091f6033291c9058052e0033291e1830091a28301d1e02e833de08a44ade132833d030c8052L8;FF6b1540d26b0d0b8b6b2501914a194", + "b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab020400542a0140b2L16;FFe50314aaf40310aae29349a9f80309aaf0a74ba928a00791fbbb4ca9e03340f90001c03d08008092f9030faaf60312aaed5b00f9ed030aaaf26f40f9ca008052BBBL8;F", + "F606b0194e00313aa21008052596b0194c00000b4e10314aae20313aaf50300aa5c6b0194e00315aae10313aaf44f42a9f50b40f9fd7bc3a8c0035fd620008052L8;FFc10240f93f0400b1e0fdff54810000b4c00640f922008052576b0094c10e40f921fdffb4c01240f922008052526b0094e5ffff1768", + "0240f9c80000b409e179d3BL8;FF8082813ca18379ad8182823c8082833cacffff17e08742ade00314aae21fc03da0873aade08740ada203973ca08738ade08b41ada08b39ad3af3ff97a0077aadL8;FFe20100540e68ed38df0501310df2ff542e0080524d008052090500f9290080520e4100390d45003", + "9090100f9c0035fd6008500a91f0100f9c0035fd6090500f9BBL8;FFf32340f9ff430191c0035fd65d2b0194c000805221008052562b0194c00200b4a8cc875289c78d52e9cdad7208080079c8008052090000b9680200a9680a00f9L8;FFf30300aa3f0002716200005435008052080000143f002071620", + "0005455008052040000143f404071680080521535889a680240f9080114cbbf0208ebe8000054L16;FFae696a384a0500915f010cebcf194092ce1d0013ef21cb9ae90109aa220800546b1d0091eefeff373e0000141f150071210500546c0400f1c00b00549f2900f1BBBBBBL8;FB742e72656376206570", + "6f636820c01f3a2043743141636b6e6f776c6564676564202d3e2043743253616d706c65640012506f6c796e6f6d69616c206572726f72L8;FFfb0300aa5f9f00944000805241008052589f0094c01700b4e9ab42a928008052e8531ea9fc031faaf6031faaff231fa9ea0301f9e90f01f9e9ab41a9e80b0", + "1f9BL8;FF0825019108fd46d308050091d4030034890200322911c0da291540d2290d098b2925019129fd46d3290500912001088be10313aa08fdff97f502003574040034L8;FFe00315aaa3f5ff970b000014a003df3ce113c03de82b40f9e11740f9e00700ade81300f9810000b4e01b40f92200805251", + "1f0094e10340ade81340f9960200f9BBL8;FF86000014fa0300aa39008052e003192a717401941f1c0072e0031aaac1feff540aa440a908038052e00f00f9e0830b91e1e30091ff2700f9f9830b912829089bL8;FFf40500b4f3af40f95e5f0094e00314aa21008052575f0094001201b4e10313aae20314", + "aaf50300aa5a5f0094f6bf40f9d60400b4f3bb40f9525f0094e00316aaL16;FF64df00940803168b680a00f9540300b4610a40f9680240f9b51240f91f0101eb40080054680640f9490280522a040091e00314aa6a0a00f909692138e10313aaBBBL8;ZBL8;FF3ba3ff97f71740f9defdff17f60300aae06", + "3009122008052230080522400805233a3ff97e11740f9e00316aafbfdff17e0630091220080522300805224008052BL8;FF0831899a29008052ff0215eb360908aa8008005428ff7bd3480600b5d616198b3b000014b309f8b7530200b455ff0094e00313aa21008052380080524dff0094L8;FF634000d1", + "424001d1600001ad600082ad420001f1a8ffff5480003ead80003fadc0035fd6e70300aae40301aa1f0001ebe30302aa80080054250002cbe60702cbBBL8;FFb20356f8b08354f8af3b7329aa277429b8237529b12f7629ad8357f83f0400b1ac0359f8bb8313f880040054f28304a9a02303d1f14700b9e", + "c4302a9ef3b0629L8;FF09b305b8788242f9e9ef41f9a8831838e8f741f9aa0318f8fba30ba9e8fb41f9fb0342f9f55300f9757e42f9e85b00f9080340f9e94300f9680000b4e00315aaL16;FFe15f813d6183c43cf4bb42f9e27f813d6283c33ce067813d6083c53c9f0600b1e26b813de16f813de07381", + "3de363813d205e0054e9cb42f9e8c742f9f6cf42f9BBBBL8;FB0e7dc2729373a237a28c9fbdba520000b263b3429c4c636a42620cbd3e8cd8b8b7a55040900e5001414aaed1575a926d18dad4b0b55325ea49159797525496eaL8;FFe87b40f9940a0091d60600f1b562009113693738f47f00f900880054", + "a0867fa9e2031b2af5ecff97f47f40f9e87740f9f303002a9f0208eb61000054e0a30391BL8;FF72e4ff97e10300aa203000b5a88357f8080540f91f0115eb09100054a02302d17cecff97402f003728fc60d3c81400b5200840921f1800f102150054217c0353L8;FF37a100910400001418c300f1f7c20", + "091c0020054e8825ef81f0114eb61ffff54e0025ef8e10316aae20314aa55100094c0feff35f40240f9d40400b4f6825ff8BBL8;FFe92f5d29e82b14292809c05a6909c05ae8271529e88f40f909208052e08744ad282508aa080dc0daa0873dadff230ca9e28345ada2833eadea4a019400e4006fL8;FFe", + "80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb09290054088c48f81f0500b1802000544a030094L16;FFe1030eaaee031baaf00311aaf70306aafb6b4aa9e61f40f9e9474ca9ec9f00f9ec0312aa520e0014092340393f190071a1cf0054e00", + "31d91e10308aa023f8052BBBL8;FF71ffff17e90b41b2e9a300a901ffff17e90b41b2e9a300a96cffff17c80080d20800f0f2080500d1f9feff17c80080d20800f0f2080500d163ffff17c80080d2L8;FFcb07ff97e84346391f05007180020054881245b8e99741b9e00315aaeb2b5aa9a80318b8e8c346", + "39e93200b8e9cf40f9e8631139a8f31938e8430691ea2b02f9BL8;FFe81300f9c2f5ff97e80300aaa1fefff021981391a3fefff063dc1391e08300912202805244018052e81300f92b000014c80080d2e0a30039e08300910800f0f2L8;FF21cc749223fc44d3630400d17fc024eb23fbff54244000d1ff1", + "040f2a0000054e1fcff9021e00b9124d86578843c7cd343040011c6400091730600d1e10300cbBBL8;FFead302f9140d0094e88f49f91f0500b1c0000054e8074091e14316910881099100e1029137100094f87f49f9b80300b4e1d342f9e8cb42f9f97b49f91f0101ebL8;FFf9e33f39e8833f39e8a74b2", + "9f6e73f39faeb3f39e9873f39e88b3f39e8a74a29f7ef3f39fbf33f39e98f3f39e8933f39e8a74929fcf73f39f8fb3f39e9973f39L16;FFe82707a948feffb008792891ea0d8052ff2704a929feff9029d12591e82b09a90a0b8052e92b06a9290080d2480380528910c0f2a02700d1e1030191e87f05a9B", + "BBBBL8;FB540000000000000065000000050000001d1c400000000000540000000000000073000000050000001d1c40000000000054000000000000007900000005000000L8;FF490109abc20400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe903005420", + "0108ab22010054fd7bc1a8c0035fd6BL8;FF080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f0008eb29210054f30b40f9fd7bc2a8c0035fd6e80300aa098d40f83f0500b1L8;FFc3c4ff97e0a300b9a04700d1c0c4ff97e09f00b9a04700d1bdc4ff97e09b00b9a04700d", + "1bac4ff97e09700b9a04700d1b7c4ff97e09300b9a04700d1b4c4ff97BBL8;FF756c0194081b4039e90740f9f702000a1f01296be0179f1a6f6c0194081f4039ea0b40f9e902000a7302090a1f010a6be0179f1a686c01946802000a00010012L8;FF081140f900013fd6e06b01f9e8c31791e16f01f9290", + "c40f9e1830b9120013fd6fcfb42f99f0f00b101010054c800805217ffff17e04bc13de14fc13de84345b9L16;FF39008052950100b45ed70094e00315aa210080523800805256d7009420feffb4e10316aae20315aaf70300aa59d700940200001437008052882642290a358c52BBBL8;FFe00b00f90800f", + "0f20e000014880080d2b7831df80800f0f219000014e90b41b2e9a300a908000014e80b41b2a0831df813000014880080d20800f0f2080140b2L8;FFf49f49f99f0600b1e0a5ff54f5a749f9f3a349f9950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f922008052", + "4e770094BL8;FF160040f9f30300aa490100b4680a40f91f0116ebea33969a08010acbca0208cb34010aebc9000054e90316aa06000014f4031faae8031faa03000014f4031faaL8;FF211740f9e16a38f8da6200f9f35341a9f55b42a9f76343a9f96b44a9fd7bc5a8c0035fd6fd7bbfa9250000b02aaa9", + "c52fd030091090c40f9270000b0a58c40f9BBL8;FFd800805294018052000540ade893687915008092e8e30a79e057813de15b813d99000014e8074091f6b345f9002300910881099120870094e1074091e0431691L8;FFc33dff97e80300aae84305f9e0032a9161fdffb021201391a201805263fdffb06", + "3c0139124018052483dff97e14345f9e14305f9e0032a9121fdffd021203f91L16;FFf7430d91e91742f9e012cc3ce0831d91e1e31c91e8031d39e81342f9f69f03f9f6831d912013843ce8ab03f9e9af03f974190094e8b343f91f0500b1e86f00f9BBBBL8;FB655f6b65795f696474696d657374616d70", + "4d6573736167654b65796369706865725f6b65796d61635f6b6579697650656e64696e674b796265725072654b6579L8;FFf85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e0fdffb0008033910a83009408a440a9e20301aae00308aae10309aa18830014fd7bbfa9fd030091083040f9BL8;FF200bc03", + "dfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1404f803da90319f8601a00542083c33ce85f04f9e9671f91a80359f82183c43ce5432591c082833cL8;FFe00316aa64020094e0110037b70000b4e00316aae10317aa22008052560700945ac300f17bc3009161faff542e000014a0a300d1e10319aae2", + "0315aa23008052BBL8;FF09dd78920c000014f65343a9df0600b140feff54f76745a9e15744a9a0ffff17e9031faa180700d103000014e9031faa18070091081d4092390108aa28008052L8;FFe9bf00f9e81f40b9e8030639e10740f961cdffb4e01740f91a000014e90310916affffd04a21089140fdff", + "b00090199108210091e1c30e91e9db01f9eadf01f9L16;FFedcb40a9e30317aae4031baaec0b45a9e95f4ca9fb0314aafadb4aa9e10315aae72f44a9ee031caae0bf46a9f40304aafe1b43a9f1030aaae81b01f9f57b40f9BBBL8;FF081d4092e0030091280108aaea2300a92febff9788fffff008a11891", + "4903805268a600a92800805268020039fd7b43a9f32340f9ff430191c0035fd6ff4302d1L8;FF0a2500a9fd7b43a9ff030191c0035fd6e80741b2e0030091e80300f9bc6dff97e10300aa20008052fd7b43a9ff030191c0035fd6d475ff97fd7b43a9ff030191BL8;FF08110091aeffff17e00300f9a1fef", + "fb021a41491a3feffb063301491e0030091620180524401805209000014e00300f9a1feffb021a41491a3feffb063300d91L8;ZDBBL8;FF9efdff1720ffff9000e02b9123ffff906380209124ffff9084c02c91a24700d1e1068052f422019420008052e1028052e922019422ffff9042400791e0031faaL", + "8;FF688e40f9280100b40805088be00314aa01ed7cd302018052f44f42a9f65741a9fd7bc3a854270014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f44f01a9L16;FFfc6f0da9fa670ea9f85f0fa9f65710a9f44f11a9fd030391190c40f9892489d24992a4f22ae379d32949d2f28924e0f2571119", + "cb3f0309eba9000054f8031faaBBBBBBBBL8;FBc000234275696c64696e67205072654b6579576869737065724d65737361676520666f723a20c0102077697468207072654b657949643a20c015202873657373L8;FF210080525ba40094c00800b4f80300aa5ca40094000480522100805255a40094a007", + "00b43f030071a80e40f9a90240f96a139a9a400540ad1f0109eb000400adBL8;FFfd030091010040f9f30300aa810000b4600640f92200805257240194610e40f9810000b4601240f92200805252240194612640f93f0400f18b000054602a40f9L8;FF290040f90cfc6ad35369283808050091280800f92", + "cfbffb43f0108eb7361193240020054536928380afc71d308050091290040f9280800f9aaf6ffb43f0108ebBBL8;FFf30308aaa8c302d1e00302aaab600094a85775a9b40356f81f0500f1c1010054a81e00121f0500716c090054aafe48d30c0180d2a91e4092eb0f41b20c00f0f2L8;FF47ffff17fd7bb", + "da9f50b00f9f44f02a9fd03009148008052f503012ae10303aa000d002af30303aaf403022a1bfdff9795040034a80200320811c0da081540d2BL8;FFf92300f9f85f05a9f65706a9f44f07a9fdc30091081c00121f09007181010054e00302aaf30302aaf40301aa3bf1ff9720020037750240f9a80640f", + "9160101ebL8;ZDBBBL8;FB696e6465786b657950656e64696e675072654b65797072655f6b65795f69647369676e65645f7072655f6b65795f696474696d657374616d704d657373616765L8;FF09692138210400917f0a00b1e11700f961260054e80f40f91f0101eb00900054e81340f929040091e9170", + "0f91f692138d7ffff17e11740f9e80f40f91f0101ebBL8;FFe0075badea03162a29dbda93a14302d1080d0aaae00314aa22008052a0873dade00759ad290dc0da080dc0dae9cb01f9e8cf01f9a0873bade2035cada2833eadL8;ZFBBL8;FF2905009129010a8b2a0140b24a11c0da4a1540d24a0d0a8b4a2", + "5019129194a8b29050091280108ab8300005420000014e80308abc2030054694640f9090100b4L8;FF6b00f8378b0080523a0000142b7c1c534b0a00344d11c0390b00be522b000b0bac1d00128d00f83761710c8bab008052300000144d15c039ae1d00128c1d0e0bL16;FFe2c35da9e8ff00f9e8275ca9", + "ed1b4ba9e02b44a9ec2717a9e9174ca9ef6741a9e9d300f9e97b43a9e97b00f9e9fb40f9e9e700f9e96b40f9e9fb00f9f42748a9BBBBL8;FB53656e744b65797353616d706c656473656e64696e675f68647248656164657253656e74646b506f6c796e6f6d69616c4465636f6465727074735f6e6565646", + "5L8;FF3f010aeb29030054280108ab8300005410000014e80308abc2010054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091BL8;FF280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab6200", + "0054fd7bc1a8c0035fd6e0fefff0L8;FFe8db51f91f0900b1414f0054e00b409161620491e443139100c00e9122fdff90422c3a91e30280522a030094e8db51f91f0900b1e14d0054e0431391b0edff97BBL8;FF0900f0f205000014090180d2e8031faa0900f0f229017fb24a1d409208010aaa692200a9", + "fd7b44a9f32b40f9ff830191c0035fd6ff8303d1fd7b0aa9f75b00f9L8;FFe42740b9fb6304f9020140ade8031691f56704f9f76b04f9428309ade90300f964f0fe97e8c342f9200bc03dfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1L16;FFf9cb03f9e217823de107823de00b823d1b4e0094e8b34", + "5f9e0d7c23da8031ef8a0039d3c6002803d680a00f9980000b475da01a9781600f907000014790e00f9BBBL8;FF2a0400916a0a00f909692138e10313aa46faff97950a40f9550300b4610a40f9680240f9960640f91f0101eb20340054680640f9490280522a040091e00315aaL8;FF4901805209692138", + "ead302f904280094e1431691210d0094e0a749f9800100b4e1d342f9e8cb42f91f0101eb20460054e8cf42f9090180522a04009109692138BL8;FFfd030091f30301aa14e0009104000014730600f194c201914003005481825cf83f0400b140010054810000b480025df82200805250f4009481025ef881", + "0000b4L8;FF5f7c0271477c0553421c45d38318039ba400038be9f3ff54ff14007140f2ff54000080d21f000039007d20d4c0035fd6fd7bbba9fd030091f35301a934000090BBL8;FF090280522a040091e00319aa09692138e1431691ead302f90f120094f90b40f9b8010034e1d342f9e8cb42f91f0101", + "ebc0d30054e8cf42f9090380522a040091L8;FFbf0317f8b5db39a9b9831af8ba031bb81a300094e22340f9821500b5e0030191f55b04a9f92b00f9b94302d1fa5b00b9113000941f04003180080054b50358f8L16;FF89565fa94083813ca2837bade81302f9e883029100a10191a103963ce91f02f9e01", + "b813de217813de113813dc5150094e20fc13de313c13df60b41b22f000014BBBBBL8;FB3400000000000000540100001b00000073746f72655f736b69707065645f6b65792063616c6c656420666f72206e6f6e2d6578697374656e7420636861696e00L8;FFb51200910809c05a086821b821100091a183", + "1ff861feff540a000014a06300d182008052230080522400805230c0ff97a0077fa9f1ffff17b5e33ea9bf831ff8BL8;FFe802158b680a00f9952240f9550300b4610a40f9680240f9941e40f91f0101ebc0090054680640f9490580522a040091e00315aa6a0a00f909692138e10313aaL8;FFc3c9ff97f", + "a03002ae0431391e10319aa750e009421fdffd021603b91e3431391e00313aae2008052e3f2ff97e0830891d4affe97e16b02f9e343139122028052BBL8;FF69060011a90316381ffd007100edff54896b28380805001171ffff17f44f5ea9f6575da9f85f5ca9fa675ba9fc6f5aa9fd7b59a9ffc30791c0", + "035fd680ffff90L8;FFa88357f8080540f9150101eb232c0054a88357f8080540f91f0115eb290b0054a02302d18cf4ff97a033003728fc60d3a81000b5200840921f1800f162110054L16;FFe10317aae20315aa230080522400805237000094770a40f995ffff17e00313aa22008052230080522400805", + "230000094610a40f99cffff17e00313aae10317aaBBBL8;FF017d099b02018052f44f42a9f65741a9fd7bc3a8587c0114f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f44f01a9fd030091f40300aa68018052f30300aaL8;FF9f0600b1a0050054b8008052af000014e8074091f68f45f90023009108", + "810991f40740919482099124d2ff97e1074091e04316910239805221800991557c0094BL8;FF00008092748200912af800941f0400f1010300549ffedfc8610240f9810000b4600640f92200805253fc0094e00313aa0105805202018052f44f43a9f70b40f9L8;FF680640f93f0002710801148b6200005", + "4010100391c000014e90f80123f002071ea0f801229140033c20000542a7c0653090500394a051a320a01003912000014BBL8;FFabb35538a99315384901084aaac35538a9a315386901084aabd35538a9b315384901084aaae35538a9c315386901084aabf35538a9d315384901084aaa035638L8;FFea5", + "b40f97adf78b3fb031caa4cfd60d3eb032a9117dd78b328008052bf0a00b1752a01f968420e39772e01f9783201f96a6a02b96c6e02b97a3a01f97b3e01f9L16;FFe8fb42f91f0500b180000054e8c31591000102914ec5ff9708008092740600f9687201a9e8fbff175b0080521e020014ea6700f9e94f0", + "0f9e86f00f9943400b4BBBBL8;FB8b98c369fbd6ecaba79744f74abfa951a28c14efbf333884919500003a14f87636c5995579b0016372f75a0f7686425460cd361e489549405c3c31bef99879f2L8;FF690a0353af7c8f0acd7c8d0a701e08534a010b4a497c890a6b220953ce010f4acd010d4a6e320d5", + "3f07c900a29010c4a6c260a53cb7f8b0a4901094a6a2e0c53BL8;FF3f0500b1c0010054fa4340f9a81000b4e88332916063029177a6ff97e85346f91f0500b100080054e02bc33de85b46f9e07f823de80305f949000014fa4340f9L8;FF00048052010180525a0c0094400100b4155000a901fdfff021c0", + "0291130800f91f600039f44f42a9f50b40f9fd7bc3a8c0035fd60001805201048052e5070094BBL8;FFfd030091ff0740d1ff0300f9ff030cd1f40300aa00800291f30308aafd46009480040036574c01940018805221008052504c0194a03200b4e0e7076f08188052L8;FFfd7b41a9ff830091c0035fd6", + "81fdffd021380291c2028052e9470014fd7bbfa9fd030091083040f9080100b4080140b20811c0da081540d2080d088b08250191L16;FFe8fb40f9f21b02f9e8f301f9e8bb40f9f73302f9e8ff01f9e8ff40f9fa3f02f9e80302f9e89340f9ed4b02f9e80702f9e8db40f9f15f02f9e80b02f9e8b340f9BB", + "BL8;FFf9031faae00319aae10315aaf267019434008052e8230091a0820091df680094f50f40f9f5feffb7f80b40f9950900b4546c0194e00315aa2100805239008052L8;FFe1031091e3430691e8271aa9c8fdffb00841199142008052e8db00f966fcff970a0380d2c8fdffb008291a91690480520a00f", + "0f2e8a716a95a1100d1e10740f9BL8;FFe08709ade28343ade2830aade18340ade18307ade28341ade28308ad002300b4e87b40f91f0500b160000054e0c30391abf7ff97e8bb40f91f0500b120140054L8;FFf30b40f9fd7bc2a8008840f9cbffff1741d03bd5258055b8018c40b9217801123f00056be0", + "0400540430029180fc5f888000003585fc0088a0ffff351f000014BBL8;FF008025910d28019420ffffb0002035910a28019420ffffb0006031910728019420ffffb000602e910428019420ffffb000c0249101280194fd7bbaa9fc6f01a9L8;FF601500b4e10314aae20317aaf80300aa602c0094482740", + "f91f0500b120030054592f40f95b6340b9991100b4542b40f9542c0094e00319aa210080524d2c0094L16;FF5cac009480e1ffb52000805201108052f1a70094e0031f2a2d120094e17342f9fa03002ae1f4ffb5a9ffff17c80600b1e2160054e80300f952ac009400048052BBBBBBL8;FB6167652066726", + "f6d20c0002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e2d6c696e75782d676e752f72656c656173652f6275696c64L8;FF0021009121008052e3031aaa04fefff084600b91e80b00f9bc831ff8e19b009468034039a0024079e103132a1f050071e1f5ff54e0ffff17f44f47a9", + "f65746a9BL8;FFe80301aa80000036880e00b5e1031faae1ffff17e1031faa886200b9deffff17811c0054e0031faa2cffff1720ebff54c80080d20800f0f20809009137000014L8;FF750600b4a0a301d1e10318aae20315aaca120094bae779a96083c23cbca37aa9b5835bf8e01f803d5f0700b160080", + "0546083c33c6183c43ce80700f9e08702adBBL8;FF63c40991e0e31591e2018052e40180524e660094f4bf42f90c000014f4c302f9f6bf02f906000014e80b41b2e0c302f902000014c8060091e8bf02f9e0e31591L8;FFfd7b46a9ff830291c0035fd6e0230091e1031faa76ffff97a9ffff17ff0306d1f", + "d7b14a9fcab00f9f65716a9f44f17a9fd030591e10b00a9e80000d0e40b00f9L16;FF1f0500b1810000549fde04a99ffe05a997fe06a981220191e20313aadaefff97400900b5e1031faad6ffff17e10314aae20313aa55ecff97a00900b5e1031faaBBBL8;FB01010101010101010101010101010101010", + "101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101L8;FF230080522400805239a4ff97fb1740f9e80f40f908011bcb3f0308ebe963ff54e0630091e1031baae20319aa23008052240080522ea4ff97fb1740f917fbff17BL8;FF42a00191", + "21028052fffb0094c0fefff00080009109fc0094c0fefff000e0009109fc0094ffc300d1fd7b01a9f44f02a9fd430091f30300aa1440009101400091L8;FF3f2000f108018052e02300912180889aff0700f984100094e80740f91f00007100019f9afd7b41a9ff830091c0035fd6fb090014ff0301d1fd7", + "b01a9f65702a9BBL8;FFa8035cb868100037a8035df84a0340f9490108eb034900548a0340f9b8835cf84801088b880300f9490300f908ff60d3880d00b5000b40921f1800f1820d0054L8;FF20013fd6f6eb41f9df0e00b16100005468008052e5030014e8830d9179d241f9f5530aa91ad14778189147b", + "8e8f341f9f7634f39fc7f4f39f4fb41f9e86300f9L16;FF08318a9a4afefff04a410991cb0000104c7968786b090c8bf7430d91fb0300aa60011fd6760740f9df0a00b1c03a0054df0600b1803a005475b742a9681f40f9BBBBL8;FB0c877912ca577a54bb5743503ac2b6e5700774d8ed28555fdcbf532d", + "32f5ad88e65800002af4096b557e2ddf654f1812424f6624a0f32061370cf575f1db175dL8;FFa94300d1eaffffd04a511d91a8031ff8c2fdfff042142c91e92b01a9e3430091f28b0094fd7b44a9ff430191c0035fd608feffd008110991e00301aae10308aaBL8;FF49008052f9a305f9f5a705f91f010", + "071f3ab05f92801881ae99f40b91f01096b41050054e39348a9e0c31291e2db42f9e5f35639e1032d9126008052cce5ff97L8;FFffc30391c0035fd6a0877dad680200f9a8835ff86082803c6182813c681600f9f44f4ea9f76340f9f6574da9fd7b4ba9ffc30391c0035fd6ff8302d1fd7b07a9BBL8;FF1", + "f0500b180f8ff54e02312915ed4ff97c1ffff1728008052687e01a928008092687e00a93c000014f50900b455500194e00315aa21008052390080524d500194L8;FF4a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff5480fd", + "ffd000c03a91ff4b0094L16;FFe86304f9e85f40f9e86704f9e8e340f9e86b04f9e85b40f9e86f04f9e80740f9e87304f9e83f40f9e87704f9e9235ea9e97b04f9e88304f942260094e8f741f9BBBL8;FF150109ebe2010054e80f41b2e80700f9e0230091be760094e90300aae90700f9a1ffff9021203f", + "91a3ffffb063e00891e023009102028052a40280526e000014L8;FF29613c91ff2300a908048052a06300910800ac72e1630091a21b00b9e92302a9e8030091ff2301a9d026ff9740030035e003c03de80b40f96002803d680a00f9BL8;FFf65744a9fd7b43a9ff830191c0035fd6e20313aa030c8052eaf", + "6ff97e10300aac0feffb5a80640f91f0116eb69030054e00313aa39fdff9700fe073728fc60d3L8;FF630843aa631043aa2800030a2100030abf0001eb0101070b2130881abfc021eb23feff5421010034226c1c53e303801203d01f3801e01f7800c0228b1fc01f38BBL8;FF181c0094080040b20811c0d", + "a081540d2080d088b0825019109fd46d30800098b080500911f0109eb281700544c000014fa031faaf9ab49f9f807409118830991L8;FFfb0309aaa1035df8415200b595020014a8035df808011acb1f0308eb886f0054980200b4a8835df8e10319aae20318aa00011a8b573000944803188be00319aaL1", + "6;FFe20300f95f0008eb81040054f60300aae023009161420691b3000094f58b44a9e00316aaf7e345a9e083c03ce8d343a9e183c13ce10315aae283c23ce43740f9BBBBBL8;FB74696e76616c69642073656e64657220636861696e206d657373616765206b6579736465637279707473657373696f6e20", + "7761732076616c69643b206d757374L8;FF0e94009420feff90006002910b94009400feffb000200c9108940094090040b9e80301aa0afefff04af13b91e00308aa420080523f01007109fefff029f93b91BL8;FFec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0dace1540d2ce0d0e8", + "bce250191ad194e8bbf010cebe30100546b0500f1ec030daa81feff54L8;FFd7090094ec6b42f9ea6f42f9e97342f9f7eb44b99f0900b181440054e87b42f9f87f42f9e3fcffd063203d91e0431391e10319aae2031caa04028052e9ab13a9BBL8;FFa2fe46d3b6e27a92b5164092e20000b4e83340f9800", + "30191e10314aa0801028be83300f9ef530194e00300918102168be20315aaf5ff003956580194e00743adL8;FF002c0054e8c31791606302910cf1fe97e8c357391f050071002c0054e9c31791e8c757392021c03c2121c13ce02b833de12f833dc82c0036e8830291e02bc33dL16;FF81feffb0210c1291", + "83feffb063b41291e0030b91a2008052c40080523bffff1781feffb02148109163fefff063400291a08311f806000014a08311f881feffb0BBBL8;FF880000542800028b08f1df38281cf837a0c300d1d7290094a8035db828280037a8035ef88a0740f9490108eb233700548a0340f9b7835df84801088b", + "882700a9L8;FF293111918a0000102b7968784a090b8b40011fd6f37749f97f0600b1e0020054e18f49f93f0400b140010054810000b4e09349f9220080524f780094e19b49f9BL8;FF420080525cf80094687a40f9a80000b4607e40f901f97fd34200805256f80094688640f9a80000b4608a40f901f97", + "fd34200805250f80094689240f9a80000b4L8;FFe00000b4e8031faa800600f906000014e00313aa0302009460ffffb528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd6c0035fd6BBL8;FFe07c01b4f80300aa5e38019400048052210080525a380194e07c01b4f40300aae", + "0fbc63de1ffc63de8074091e2074091e00315aa0881099142c03591e1031baaL8;FFe80b41b2c9000014c80080d20800f0f2080500d1c5000014c80080d2e0232a39e0032a910800f0f2ff272a39e84305f9b73eff97e10300aae14305f9e0032a91L16;FFe9af40b9685200f9e8a341f960828d3ce0afc0", + "3d688a18a9e87740f9022980526942023978a21aa9e85340f960828f3ce08b53ad6aa21ba9e87340f961828e3cBBBBL8;FBbb1140000000000047000000000000002401000015000000bb1140000000000047000000000000002b0100003b000000617373657274696f6e206661696c6564L8;FFe04340f9", + "01f97fd3420080525a880094e84b40f91f0500f1ab000054e04f40f901f97fd34200805253880094e85740f91f0500f1ab000054e05b40f901f97fd3BL8;FFbb2336a9a84303d1a82737a928008052e9feff9029810c91aa8302d1a04700d1a8273ba9c8feffd008a13291a82b3da90a078052c8048052bf", + "2738a9c9feffd0L8;FFf7031faaff2706a9e82b00f9ff3b00f906000014e8830191ca060094f72346a9fb3b40f9e82b00f900fdffd000200a91e8e30691a1008052950315aa2e070094BBL8;FF882600a908fc60d3080500b5020840925f1800f122050054017c035341050034e0430591a32300d1840c80", + "529ed6ff9760fbffb42a000014a02300d1d2560094L8;FF2007c03de9b341b92143c23ce8c741b9a600001488fdffb008c1159169038052d0feff17eaa759a9e8430f912083c13c2183c23c2283c33c2383c43cfa9741b9L16;FFe0ab833d63c80094e0032b91012b009183400094e8e33b91e0032b917c3", + "e0094e87f47f91f0500b1004d0054e0031d91e1c33991e3e33b91e20314aa5a160094BBBL8;FFfe630194ff0304d1fd7b0aa9fc6f0ba9fa670ca9f85f0da9f6570ea9f44f0fa9fd830291810600b4080d8052e92300913a0080d2367c089bf40302aaf3031faaL8;FFf60300aa080014eb23100054ff0208", + "eb09010054e0e30091e10317aa220080520d67ff97f42344a91f0114eb23100054e81f40f9e10315aae20317aa0001148bBL8;FF3f040071a00200543f080071000100543f0c007100fdff54e20313aa230c8052e8eeff97e10300aae8ffff17888241f81f0500b1810000549fde01a99ffe02a9L8;ZDBBL", + "8;FF8092823c8192833ce9c700f9e10740f9010600b599feff17e8b740b92043c23cc0e200912183c33c2207c03deab341b91f010071f8c741b9801f803de9079f1aL8;FFc32eff97f44f45a9f52340f9fd7b43a9ff830191c0035fd6f503012a74040051e00313aac5020094e80300aae00301aa28fc073", + "708fc60d3c80100b508084092L16;FFf50640f93ff97af2a10800549f0600b120060054f62640f9dffa7af2010e0054f5a600a9e91640f9ea3240b939c30191fbf201a9e91600f9e93240f91f0119ebBBBBBBBL8;FB636861696e20776974682073656e6465722072617463686574207075626c6963206b6", + "57920c01120636861696e206b657920696e64657820c00026756e6b6e6fL8;FFfc6f04a9fa6705a9f85f06a9f65707a9f44f08a9fdc30091f503022af40301aaf30300aac11300b496fa7fd355a20094e00316aa410080524ea20094c01500b4BL8;FF00fffff0002022910f1e019400fffff0008022910c", + "1e019400fffff000e02291091e019400fffff000402391061e019400fffff000a02391031e019400fffff0L8;FF5d2200943f0b00b1c1020054e81b40f9e9e34039e81300f9e9a30039da04003668ff70d369ff60d3610a40f9a0c300d1bb031db8a8631d38e81340f9a9431d78BBL8;FFa9e4ff54a0c300", + "d1e10317aae20318aa2300805224008052c7edff97b7035ef8ba035df81cffff17a0c300d1e1031aaa220080522300805224008052beedff97L8;FF7b010094780a40f9680240f9080118cbdf0208eba9f7ff54e00313aae10318aae20316aa72010094780a40f9b7ffff17e00313aa220080526d0100946", + "10a40f9BL8;FF08020037750240f9a80640f9160100eb62020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e0030091b4e8ff97L8;ZDBBBL8;FB650d40000000000011000000000000008e01000005000000650d4000000000001100000000000000980100", + "00050000002e626173652d6b657973626173652d6bL8;FF0825019109fd46d30800098b080500911f0109eb28260054e0fdff9000200c91067e0094e8031faa000117ab02720054e1630091ca8fff977f0a00b100040054BL8;FFaa02000ad6020a0a1f01096be0179f1a711701948832403969324039f50", + "3002a1f01096be0179f1a6b1701948836403969364039b502000a1f01096be0179f1aL8;ZFBBL8;FFe92300910a0000b04a410491e8a700a942ffffb042d01091ea0f00f9e3430091f23d0194fd7b43a9ff030191c0035fd6082000910980009142ffffb042f80491L8;FF440080521a000014a0031df881", + "fdff9021e4139183fdff90630c1491a0c300d1420180524401805211000014c80080d2a0831d38a0c300d10800f0f2bf931d38L16;FFe03740f9f88f41a9f57b40f9fc0748a9e45f40f9f7ef49a9e8174da9f9fb42a9ebb344a9edab40a9e69f43a9e9474ca94f010014e0afc23de22300f9e20309aaBBBB", + "L8;FB51205261746368657420563120436861696e204164642045706f6368000000006e164000000000004d00000000000000a40100000a0000008708400000000000L8;FF3f0500716102005469aa4829c9030034290140b22911c0da291540d2290d098b2925019129fd46d3290d00910a0300344a0140", + "b24a11c0da4a1540d24a0d0a8bBL8;FF20e10291f47312a9f53301b9e85701b96012019448008052e9f31691ea7340f9e8f31639e8c31691eb7b40f9e9e302f9e99f40f9e8eb02f908018052e8f302f9L8;FF5d120094e13355a9ef0317aaeddf5aa9eb0316aaea1f41b9fa9740f9ee0318aaf0cb40f9410", + "200b4e0031aaa22008052ebcb00f9f9030caaeddf1aa9f7030eaaBBL8;FFe0230091e10318aae20316aa2300805224008052c8ddff97f80f40f9e80740f9080118cbdf0208eb29f7ff54e0230091e10318aae20316aa2300805224008052L8;FF542340f9b4031df8b40100b58200001436008052571740f", + "917fcffb538008052482740f91f0500b121fdff5419008092542340f9b4031df8f40e00b4080d8052L16;FF043c4da9e94700f912184ea9e86b00f9092042a9e0b3823d101452a9e8bb00f9087043a9ea231fa90a2044a9e8cf00f90b2045a9e8c300f9084446a9e8ab00f9BBBL8;FF610a40f9e00315aa5", + "afeff17e00313aa220080522300805224008052c6fdff97610a40f974feff17f50300aae00313aa220080522300805224008052befdff97L8;FFfdfdff17e04316912200805278110094e1d342f963feff17e04316912200805273110094e1d342f9abfeff17e0431691220080526e110094e1d342f92dfa", + "ff17BL8;FF280800f9a202005400fc4ed354000014e00700f9e00301aaf30301aae10309aa220080522300805224008052f4030b2a2f1600946aa240a9e00740f9690240f9L8;FF600a00f94218152a641a40b9e403242a6300040b631e00b9130000f9600a40f9032040392310003303200039754240796", + "01a40b9610640f9b54e14124200152aBBL8;FF14a4ffb48806148be00313aa0201805201f17dd31afdff17e19349f9f3074091738209913f0800b1800100543f0400b140010054810000b4e09749f922008052L8;FFf4e342f9e80240f9680000b4e00314aa00013fd6e10640f9810000b4e20a40f9e0031", + "4aa54320094df0a00b100960054df0600b1f7030291a0020054e0820391L16;FF28ec40f9e20700f95f0008ebe10a005480064dadf50302aa8366c03df30300aae0a301918182079102328052f60303aae00701ad82024eadf7430891e307803dBBBBBL8;FB696e76616c6964204b79626572207072656b6", + "579206964656e74696669657273656c662073656e64206f662061207365616c65642073656e646572206d657373L8;FFb9f31438a0c303d18102088be20319aaf90b40f95f9a0094a8f354380c088052fc03082a82011ccb350302eb62f8ff54b5c303d1e10740f9e20319aaa0021c8bBL8;FFe20316aaf7", + "0300aa621a0194591740f9b7831ff8190400b4541340f9591a0194e00319aa21008052521a0194a00900b4e10314aae20319aaf50300aa551a0194L8;FFe13f813de11fc13d2bfdffd06bc13691e03b813de01bc13de14b813de107c13d24fdffd084203591e047813de023c13de163813de18f5fade82b4", + "2f926fdffd0BBL8;FF696200f9e9fe60d3600602ade083c83ce183c23c74220ba9e8fe70d3699a0179e90b40f9600a03ade083c33ce283c53c683a0339a88354f869720df8a9035538L8;FFe97f06f9c90480524838c0f2ff5306f9e95b06f9ff5f06f9e97306f9e87706f90e560094f3f742f9e8ef42f9e", + "0dfc13de1e3c13de2e7c13d7f0208ebe02b833dL16;FF603a00b5a0c303d144e7ff97e80301aa00040036883a00b5e1031faab2ffff17c1220191a2c303d158e6ff97603d00b5e1031faaacffff17a2c303d1630c8052BBBL8;FFfd7b03a9f44f04a9fdc300911f1c007280010054c80080d2e0230039ff2", + "700390800f0f2e0030091e80300f9b8800094f44f44a9fd7b43a9ff430191c0035fd6L8;FF4afd46d34a05009102000014ea031faaeb7b52b97f05007181010054eb7f52b9ec8352b98b0700346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46d3BL8;FFe82340391f050071e1030054e093c03c", + "e81f80528002803d88420039f44f45a9fd7b44a9ff830191c0035fd6690240393fed0171c1000054699640393ff50171L8;FF6d11889a1f0056f2ad014cb26b018d9a8c010e6a0ee479d30d7c1f536811889a3f01007208e90eaaeb030d2a0d0045924b210baa0a0149b20e054ab24a11889aBBL8;FF4a25", + "019129194a8b29050091200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff5440ffff9000003b9103360194e00301aa41ffff9021e03991a2018052L8;FF0001803d8007c03de9e701f90005803d800bc03d0009803de86340f97b6300915a0700917f0308eba070005400e4006fa8220591fc032a9", + "169ab40a9ff9304f9L16;FFe5cb43f9e7d743f9ed5300f9ed6f40f9e25b44f9f66344f9f86744f9fa7744f9fe030daaf94740f9e3b7803de87700f9e8008052400545ad6a5142784941092aBBBBL8;FB57525c4241724a627b1270026d3266220fd204c219f212e22392288235b23ea29a6391738c438753", + "b623bd33a003ab13c2e3c9f3d4c3dfd3eea3e5b3f883f393L8;FF608a0094e00315aa41008052598a0094800f00b4f80300aa5a8a0094e00315aa41008052538a0094c00e00b4f90300aa548a0094e00315aa410080524d8a0094BL8;FFc80000b40805088be00313aa0201805201f17dd3580a0194e063c", + "13de167c13d9f0f00b1e8a345b9e00718ade82303b9810d005448008092480300f971000014L8;FFff030291c0035fd6e0230091e1031faa2200805223008052240080524ce6ff97e02341a983ffff17e023009122008052230080522400805245e6ff97e10f40f9BBL8;FF382b40f9547f089b5e4a0194e", + "00314aa01018052574a0194601900b4080d8052fb0300aaf4031faa567f089bf7031aaae10318aadf0214eb80020054a0e301d1L8;FF89c78d52e9cdad7208080079c8008052090000b9680200a9680a00f9fd7b43a9f32340f9ff430191c0035fd680fdffd000e0269183fdffd063801f9184fdffd0L16;", + "FFfacb03f9e8bb03f9e8db40f9fbd303f9e8c303f9e8cf40f9f1d703f9e8c703f9e8c340f9e4df03f9e8cf03f9e8d740f9f4e303f9e8db03f9e8df40f9eceb03f9BBBL8;FFe0080054381f40f9da0000b4080d805200a30191e10318aa427f089b026b0194080480525f3f1ff11f4f00a91f2304a9142305", + "a9480700911f7f01a9137f02a9L8;FF5d6a0094611a40f9810000b4601e40f922008052586a0094e00313aa080c49f81f0500b14000005404010094745a45a9f60000b4f50314aae00315aaff000094BL8;FFf30302aaf40301aa44f7ff9720020037750240f9a80640f9160101eba2020054e80f41b2070", + "00014890080d248008052e02300390900f0f2e827003928017fb2L8;FF6100010b4873a7723f00086bc3000054000400b1a600005408c08652a88cb8722100080bc0035fd6fd7bbfa9fd030091c0fcfff000641791a1058052e20304aaBBL8;FFebf200f8ea7201f80dc3ff97e84346391f0500716105005", + "4e8a759a9e80302f9e8031091e90702f9a80318f8880200b0081140f91f0900f103040054a80302d1L8;FFe82341f9e92741f920030291e103069122008052080500b12935899ae82301f9e92701f9f0250094c8de7992e0030691e20316aa4103088bf6ff0739552a0094L16;FF230080522400805239ce", + "ff97e10f40f9e5ffff172000805201058052eea50094fd7bbea9f44f01a9fd030091140040f9f30300aa62000094682a41a989020acbBBBBBBL8;FB6f7220c0023a20c0002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f62797", + "465732dL8;FF1b0940f975fb7fd39b0400b41c0540f95c9e0094e00315aa21008052559e0094400e00b4e1031faab5833ea9bf831ff8a8835ef895274078080101cb1f0500f1BL8;FF1f05007101020054610a40f9680240f91f0101ebc0030054690640f92a0400910b0480521f010aeb6a0a00f92b6921", + "38a00300542800805228692a3848050091L8;FF17008092e20344adff0600b1e11fc03de28302ade113803da2033cada103973cc1f3ff54810000b4e00316aa22008052511e0094e15740f9810000b4e00315aaBBL8;FFf85f03a9f65704a9f44f05a9fd030091ff030bd1e10300aaf40300aaf30308aa29", + "8c41f83f0500b140010054e0030091f50300919e130094f70340f9e0c30591L8;FFe9b30db9e90b40f9e8c30db9e81b40f9e9eb06f9e96740b9e8e706f9e8ef06f9e81f40b9e9ef0db9e93b40b9e8e30db948008052e9f30db9e99f40b90801981aL16;FF610a40f9e00315aadfffff17fd7bbca9f85f01a", + "9f65702a9f44f03a9fd03009148008052f50301aae10302aa000d002af30302aacaebff97b73240b9b70c0034BBBL8;ZBL8;FFe8a344f9e04fc23d890a00d19f0600f1ea008052eb672191e8b704f928818a9ae9fdffd029811091f4ab04f960f18f3c8a0000102b7968784a090b8b40011fd6BL8;FFffc3", + "00d1fd7b01a9f44f02a9fd430091f30300aa9302003761420091000080927442009123fa00941f0400f1010300549ffedfc8610640f9a104f8b7600240f9L8;ZFBBL8;FF69520b78e92740f96082823c69720bf8e93b40f96182863ce10347ad681e0339c87e045369f20bf8e91f40b96282853c6082843c", + "6182833c600608a97c6609a9L8;FFe8430f91f89f04f9faa704f9fbab04f913ebfe97e8434f391f050071c1310054fcef41f9f7f341f9f5f741f9f8fb41f9faff41f9fb0342f9b60000b4e04340f9L16;FFe1cf41f9810000b4e0d341f92200805259be0094e1db41f9810000b4e0df41f92200805254be0", + "094e8031faae9031faa291d4092340108aaf2010014df0600b1BBBBL8;FB7b40a9eaa28c7f4ced22000064d9cf570f76474c51260eab9a3bed455ac556b9af8723172e1b28e25b63c480bec65123f7fa8913489399b1a49da30cd1a7fd21L8;FF670300143f1300f1f93300f9ed0600543f8700f13300805", + "28c0d00543f1700f1801800543f7b00f1c1130054f70314aa548e0094005a8052010180524d8e0094BL8;FFe08332910800f0f2ffa73239e85306f9bf140094e10300aae15306f9e0833291e1feff9021203f9102028052e3feff9063e03c9104028052c9000014c80080d2L8;FFe92b41a9e00bc03d6802", + "00f9e80f40b9600a803d74220129692a01a9f44f45a9f65744a9fd7b43a9ff830191c0035fd6f50b40f9530e0094c001805221008052BBL8;FF08a800a91f0000f9fd7b44a9ff430191c0035fd61f014871830e0054290cc0392a1d001208550a0b08014851e900f8378a00805208a800a91f0000f9fd7b4", + "4a9L8;FF080500911f0109eba808005450000014f3031faa080c47f81f0500b1c1dcff54e8031faa080113abe307005480fdfff000200791014a0094f3031faa088c48f8L16;FFe8b700f9e84b42f9ea2711a9e99b42f9eabb42f9e8cb00f9e84f42f9e8eb00f9a8a20791f5a742f90001c03de85f42f9e8", + "2f14a9e86342f9eb9342f9e0c7833dBBBL8;FFc0035fd6e0031f2af44f44a9f65743a9fd7b42a9ff430191c0035fd6ff8301d1fd7b04a9f32b00f9fd030191f30308aae82300915d6b0094e82340391f050071L8;FFe8430691e32b40b9fceb41f9e0e30091c1e20091e2830b91e403182ae5031baaf81f0", + "0b90c03ff97f89341b91f0b0071a1070054faa359a92083c13c2183c23cBL8;FF5dee0094e00313aae01300f9a1fefff021d41091a3fefff063241191e0830091220280526400805248f4ff97e11340f94cffff17fd7bbaa9fc6f01a9fa6702a9L8;FFf96b44a9e00314aaf35341a9f55b42a9fd7bc5a8c0", + "035fd6e1141a123f003f7161efff549affff176bf7ff97140080d281018052010000b9f3ffff177500156bBBL8;FFe8cf42f9490580522a040091e00318aa09692138e1431691ead302f90e0c0094fad342f9e8cb42f908011acb1f0308ebe8340054e8cf42f9e10319aae20318aaL8;FFe23f40f9a34301", + "d10081c03ce8ff47f9a5c300d180008052e10314aae40315aaa8031ef8e8074091f607409108011891a0039d3cd60218916bc9fe97e0074091L16;FF1f200039080000f93f0400b140010054810000b4601e40f92200805256ae0094612640f9810000b4602a40f92200805251ae0094610240f9810000b4", + "600640f9BBBBBL8;FB656e677468496e73756666696369656e7452616e646f6d6e657373000000000042024000000000006a00000000000000190000001c0000004202400000000000L8;FF080dc0daa88318f8a2837bada2033fadf491009400e4006fbff31838b0c302d1a8277229aa2f7329ac377429a", + "0033ead0809c05a2909c05aa0033fadae3f7529BL8;FF080113abe300005400ffff9000802d910a120194e8031faa080113abc2010054090140b22911c0da291540d2290d098b2925019129fd46d30801098b00050091L8;FFeb7b42f9ed7f42f937fd60d35cfc78d3f903092af003182aef031a2aee0308", + "2aea0319aa130400140a0180d2e9031faa0a00f0f205000014080180d2e9031faaBBL8;FF0811092a29008052a9031cf808000039e003029116150094e8f77fb21f0008ebe8350054f72740b99f0600f1602300542800805249018052c96a283808050091L8;FF4003803de8f304f910010014f68740f91f", + "0700b1e014005420afc03de82344f9f4630191e9c7009180c20391e1e31b9120f18f3c8942039102278052f86f11a9L16;FF080180520900809268220039690200f99f0600f12a0500542c000014410300545f0f00b1e0030054e0830591e1030091022c805257d60094fa031f2ae8f340f9BBBL8;FF6031", + "0054680640f9490280522a040091e00315aa6a0a00f909692138e10313aa42fcff97770a40f9680240f9080117cbbf0208eba8300054680640f9e10316aaL8;FF807a0054e8cf42f92a040091c00202914908805209692138ead302f9d0280094e14316911d0f00949f0600b180000054c0020291e143169", + "1a8140094e8b349f9BL8;FF810000b460da40f9220080525af6009460220091f30b40f9fd7bc2a8bbfdff17fd7bbea9f30b00f9fd03009101c840f9f30300aa810000b460ce40f922008052L8;FFf51340f9e20313aae00314aa01008052f35341a9fd7bc3a8c2f6ff172e01001410050014fd7bbea94200", + "8052fd030091f35301a9f30300aa200080520120c11aBBL8;FFe09f843db9910094963b01b4e8074091c10600d1e0431691088109911e910094e86352b9f86b52b908070036e93b49f9ea3f49f9e86f52b9f5cb42f9692a01a9L8;FFff4f05f9ea5305f9e86305f9e96705f912320094e1ab42f9810000b4", + "e0af42f92200805254360094e0032a91e1832491022b805257360094e1eb41f9f68b44f9L16;FF220080525cb60094f8ffff17dc0000b488071c8be00315aa0201805201f17dd355b60094e86f40f9790600f97a2201a908008092e4f5ff17ba0000b4e00315aaBBBBL8;FBef104000000000004e0000000", + "000000058070000050000001d1c400000000000540000000000000059000000050000001d1c4000000000005400000000000000L8;FF8c364f29e00300ad0809c05a2909c05ae00301ad8e3e5029e003c03de107c03de20bc03de30fc03d830e803d820a803d8106803d8002803d682600294809c05aBL8;", + "FF00402b91e8cb02f9e8feff9008011691a10302d1e303169142008052e9c702f9e9cf02f9e8d302f93cdbff97a10353f8810000b4a08353f8220080524e060194L8;FF5d060094f3ffff17e82a40f9c80000b40805088be00315aa0201805201ed7cd3550600945f1700f1000e0054f55248a9340200b4b", + "982009104000014940600f1BBL8;FF26000014a0831cf841fffff021e0009143fffff063ac0191a0e300d1a2018052240180521d000014a0831cf841fffff021e0009143fffff063140191a0e300d1L8;FF220080525c46009461ce41f9810300b460ca41f922008052180000141f0d0071200500541f110", + "07161040054745656a9a80240f9680000b4e00314aa00013fd6L16;FFe9fb43f9eba710a9e9ff43f9e9b700f9e90344f9eaa718a9e90744f9ea0f44f9e9eb00f9e90b44f9e2a712a9e91344f9e98f00f9e91744f9e92b14a9eb9b44f9BBBL8;FF490000f029113491a82739a9e8830091c90200b02961159", + "1aac301d1a00700d1a8273aa96800805289fffff029a91791e1e30091f91300f9e8a706a988ffffb0L8;FF20010054290440f90a050091206928382a0800f9f44f42a9fd7b41a9ffc30091c0035fd6f30300aae00301aaf40301aae10309aa220080526d050094880a40f9BL8;FFa1feffb02168139183fe", + "fff063900291e003009142018052840080521a000014a1feffb021681391a3feffb063c40d91e00300f9e00300914201805244008052L8;ZDBBL8;FF02018052211108cb5b260194610e40f9e10000b4601240f922008052f44f42a9f65741a9fd7bc3a853260114f44f42a9f65741a9fd7bc3a8c0035fd6", + "fd7bbea9L8;FF07000014c90080d248008052e04300390900f0f2e8470039e90700f9e0230091bb2cff97f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6L16;FF290c40f91f0109eb82040054e80328aa280108ab831e005429ac40a92a0040f96801088b1f010aebea338a9a08010", + "acb0a0e805216250a9bf50316aaa88e46b8" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines3 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines4.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines4.lean index b00d77f9f..fd4ea526e 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines4.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines4.lean @@ -27,360 +27,252 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub4 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF0efa07370c000014ce1d40928e696e388ef90f3708000014e8031faaeb031faa610108cb0000088bc0035fd6e8031faaea0300aa5f0109eb40ffff54cc0400d0L4;FF690240f9e10313aa54692838080500911f0048f1680a00f9a3fdff540b7c0e533f0108eb73611932200100545369", - "28380cfc5cd308050091290040f9280800f9L8;FFfdc30091280c40f9880100372a2440a9092001a98802009008e11e91082800a9f44f46a9f65745a9f85f44a9fd7b43a9ffc30191c0035fd614fd45d3330440f9BBL4;FF3f0400f18b000054e01240f922008052d39f0194f6ce01a9f61600f9f43200b9", - "bb0000b4e00318aae1031baa22008052cb9f019428008052e0c30191e3430191L4;FF21c0029124d86578843c7cd343040011c6400091730600d1e10300cb637c4093210013ea6318049b631000d1c00400540000018be5ff9f52010006cb21fc44d3L8;FF810100d0217c1891e8230091c20180521fa000", - "9488c20091810100d021b41891a40100b084600a91e0230091a32300d162008052a8831ff816a00094b30100b0BBBL4;FFd70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eb038500541803008bf9feffb50f000014L4;FB746f6f206", - "c617267653a2074686520696e746567657220747970652063616e2066697420c0162062797465732c20627574206e627974657320697320c0001873L8;FFffc30091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8a4dcff17e0430f91f40301aa2120009102428052d3df0094e92742f90203", - "40f95f0009ebBL8;FFd35f01940005805201018052d15f0194000100b4e10200d021400891144c00a91f800039f44f41a9fd7bc2a8c0035fd60001805201058052e15f0194fd7bbda9L8;FF210100d021443791230100d0636c3791a0c300d1420180524401805211000014c80080d2a0831d38a0c300d10", - "800f0f2bf931d38a8031df8ba55ff97e80300aaBBBBL4;FF41fdff54f4ffff17e0e7076f01696bfc6c2100d18a010a8a0a010a8b420140fd218c202e408c202e2c00669e0d00669e8c01c0daad11c0da8c11c0da8cfd43d3L4;ZFL8;FFff030191c0035fd6e80741b2e0030091e80300f9c3f5ff97e10300", - "aa20008052fd7b43a9ff030191c0035fd623010094fd7b43a9ff030191c0035fd660020090BL8;FF2480019424800194fd7b41a9f31340f9ffc30091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091140040f9e00301aa010300d021602191e8230091a2008052L8;FFdf7f00940803168be81700f9803", - "640f9800100b4e11740f9e80f40f91f0101eb40850054e81340f9090580522a040091ea1700f909692138e16300911580ff97BBBL4;FFdf0600b1e0079f1af44f5ca9f6575ba9fc5f5aa9fd7b59a9ff430791c0035fd6ff0302d1fd7b06a9f44f07a9fd830191090c40f9f30308aa3f0500b100020054L4;", - "FB6f6e72656d6f74655f6964656e746974795f7075626c696373656e6465725f636861696e72656365697665725f636861696e7370656e64696e675f7072655f6bL8;FFe28305ada00b7bade12b803da103d83cfc8f00f96083843c6083c23c6183863c6183c13c6283853c6283c03ca1033aade10348adf", - "67300f9f65340f9a203933cBL8;FFb60200f0d6e2089117008012a88300d1e0830091f40301aaff8701a9f5db02a9f73b00b9e03f0194a2035ef8a20a00b5a08300d1b4573ea9b6031ff8b7831fb8L8;FFe10317aae20314aa97020094770a40f9cfffff17a8831ff8a84300d1290000d029a12091e00000", - "f000ec3491e8a700a9a82300d10201009042c01191e1230091BBBBBL4;FFf70700f9210400d021602191230400d063482291e0230091a20080528401805202050194e00740f94ffeff17880080d20800f0f20811009148feff17e00b40f9L4;FF0a990039099d0039e9ab52290aa1003909a50039e9ab512", - "90aa9003909ad0039e9ab50290ab1003909b50039e9ab4f290ab9003909bd0039e9ab4e290ac10039L8;FFea830039e91302b8e92b40b9eb6302b8ebc342f8ea970039eaab0039e9b302b8eabf0039eb1b00f9e83b00b90a100194fd7b45a9f33340f9ffc30191c0035fd6BL8;FFf85f1aa9f6571ba9f44f", - "1ca9fdc30591350840f9364841b9f90301aaf30300aab50400b4340740f9c98f0194e00315aa21008052c78f0194602100b4e10314aaL8;FF42d00e91e92b01a9e3430091f18f0094fd7b44a9ff430191c0035fd608100091200440a9a94300d1eaffff904a013791a8031ff8620100d042600f91e92b01a", - "9BBBL4;FFf3031caa760f00f9e8af40b9fc031faad6deffb580feff1728008052e82700f9e15b40f9810000b4e05340f922008052cbcf0194b90000b4e0031aaae10319aaL4;FB00000d13000000000000777a836bc6f00000459b00000000000000000000000000000000000000000000a28ce26db48f00", - "0056e2000001003110ee88093799c3L8;FFe8ab03f9e80100d008812891e1032b91e3031d9162008052f86305f9f6030daaf5030aaae9a703f9e9af03f9e8b303f91bc9ff97ebe340f9e31340f9ea0315aaBL8;FF08210091a10303d1a92b34a9e02f803d02500194e83b40f9c90200f029790d91e003c63", - "c682602a9e8008052e90741b2681a00f9080080926006803d682600a9L8;FF08813a91fbc302f9f5cb02f9a8031af898e4ff97a10356f8810000b4a08356f822008052ce4f0094e8031faa170100b4e91740f9c900003628fd60d3e88305b9BBBBL4;FFe80300f008d12391a9038052e1230191e20300910", - "3048052e8a704a9e00300add5390094e8230191e003009101048052a5cb0094e82341391f05007180020054L4;FB656420746f2072616e67655f666f725f726563697069656e745f6b65795f6d6174657269616c0000859248000000000033000000000000002307000009000000L8;FF9fe606a99ffe07a", - "99f82083881a20191e20313aa9ef2ff97600400b5e1031faae4ffff17880240f91f0500b1c10000549f5e00a99f7e01a9977e02a9981a00f9BL8;FF612a40f9810000b4602e40f922008052d36f019468d640a9741e00f97f0a00f9950100b41421009104000014b50600f194820091e000005481825ff88", - "1ffffb4L8;FFe1431691951000941f0700b1e080ff54802202916c010014e8031faa00011aab42690054e1431691610d0094df0600b18000005480220291e143169156120094BBBL4;FF85ffff17a04301d1a82b3ba9fe8c00941f09007101010054aa035cf8691f009148dd789206000014e8031faa691b", - "009103000014e8031faa692300914a1d4092L4;FF01000014c0035fd63f4000f1e20300aaa80000543f0002eb68000054e00302aaf7080014ff8300d1fd7b01a9fd4300913f2000f108018052e02300912180889aL8;FFfa430e91e193c33cea2740f9e8a34039f50b40f93f0500b1400701ad4af303f8c0", - "f8ff542a018052eb830091e013c03d690200f969010aaa60660191600a803dBL8;FF293fc0f2ea7f06f90a078052ff5306f9e85b06f9ff5f06f9ea6706f9e87306f9e97706f9da2f0194e1fb44f9810000b4e0ff44f922008052c92f019468b240f9L8;FF63e00b91c40000f084003b91e2832491c105805", - "2e89304f9e99704f9e02f0094e84745f9e94b45f9c00000f000343a91e300009063e00b91c40000f084203c91BBBBBBL4;FF880240f9680000b4e00313aa00013fd6810640f9c10000b4820a40f9e00313aaf44f41a9fd7bc2a8cd170214f44f41a9fd7bc2a8c0035fd6fd7bbea9f44f01a9L4;FFf57702f", - "9e97b02f9ea7f02f9b0f5ff9708008092e00313aa880200f9fdf4ff97210340f9280041d23f0000f108459f9a1f0500f14c010054480100b4810000b4L8;FF4ae10c911f7d01a90a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6e82300910900009029911f91a20f00f9600200d000f80491e8", - "2701a9a8630091BBL4;FFe1620091a2e300d1a081ff97e0f9ffb4f60000143f1800712c0300543f140071600500543f18007181f8ff54a80358f81f0500b1200c0054e1e20191a2e300d1L4;FB2409aa0acc0cff0f481254159819ff1f000117021d1813031e1b190b1408040d1f161c121a0a070c151109", - "0610050f0e1c181420000000001e1e1e1f0f0f140aL8;FFab935738a97317384901084aaaa35738a98317386901084aabb35738a99317384901084aaac35738a9a317386901084aabd35738a9b317384901084aaae35738BBBL4;FF84603791e0031faaf70301aae1031f2ae3031f2af50308aa01d801940", - "2a09152c40300b084c03791e204a072e3031f2afbd701941f0017eb410100543f00166bL4;FB6f2d313934396366386336623562353537662f736f727465642d7665632d302e382e31312f7372632f6c69622e7273002f636172676f2d6769742f7370617273L8;FFe70346f9fe0746f9ee0f46f9e8e700f", - "9e87745f9f21746f9e51b46f9e21f46f9e42746f9e82717a9e88745f9e97f45f9e62b46f9f62f46f9ed3346f9e8cf00f9BL8;FFe8cf42f9090580522a04009109692138e1431691ead302f97d110094e8d352b91f050071c1000054e1d752b9e2db52b9e3431691c0008052501400949f0e00b1L8;FFff63", - "0cb91f0800f1a12b0054a02302d1d6f4ff9700080036c1efffb4e5010014c01b00b5a02302d1d0f4ff97c010003601efffb4e1000014c02300b5a02302d1BBBBL4;FFe017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aacff70194e08741ad28008052e217c03d800600ad820", - "a803d68720039f44f49a9L4;FB656e646572206d6573736167652076657273696f6e20c0001f756e6b6e6f776e207365727665722063657274696669636174652049443a20c00014626164204bL8;FFe1031faa883200b9d7ffff1781020054e1031faae00301aaf44f45a9f65744a9fd7b43a9ff830191c", - "0035fd6c80080d2e10700f90800f0f2080900d1b4ffff17BL8;FFc1010054f80319aae00318aa8060ff9708008092686e00a9ff030891f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6e83300f9b20356f8L8;FFe04306918123009102738052dc770094e083c53d89630f91e187c5", - "3de8436c79f5174bf9fb1b4bf9e01b843d2001c03de11f843de803217988010090e0fb833dBBBL4;FFd3b70194130b40f9930200b4140740f9cfb70194e00313aa21008052cdb70194802c00b4e10314aae20313aafa0300aad3b70194e0031baa01900094e8031baaL4;ZDL8;FF0820003928008052ab43", - "5eb808240039a8835e78e00bc03de193c23c010000f90ba000b8081c00790a4000390010813c01a0813c09540079f44f48a9f65747a9BL8;FF1f0500b1800200545afbff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab230100541e0000", - "14L8;FF280080526a7202f969c2133968c21239b60000b4e04340f9e10316aa22008052cf370094fa5f49a9b80000b4e05b40f9e10318aa22008052c9370094fb5f40f9BBBBBL4;FFe9031faae00317aae30318aa69f4ffb48fffff17e00319aa28090194e30319aae80300aae90301aae00318aa48f7073", - "687ffff17c0000054c80080d20800f0f2L4;FFdf070094e10318aae90314aae80740f93501158bf50f00f9090115cb285041a99f0209eb48060054d40000b46002158be10308aae20314aad1070094e10318aaL8;FFc0035fd6fd7bbfa9fd030091400200f000c00891d5070194080840f9080300b408004", - "0f9490200d029411e911f0109ebe0000054490200d029a11d911f0109ebBL8;FF4a25019129194a8b29050091280108ab421e0054692240f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abe21c0054L8;FF016c8052e38700940001805201668052e087009400", - "018052015a8052dd87009400018052010f8052da8700946001009000801e91cd870094fd7bbaa9fc6f01a9BBBL4;FF96ab00f9b2ffff17e8cb41b94800003796a700f961330191a26301d1aab2ff97e0f5ffb456000014a26301d1830c805281aeff9740f5ffb4460000149fdb11a9L4;FB7374617465732", - "e7273001b737071722076312e73656e645f63742e73656e642065706f636820c01e3a204865616465725265636569766564202d3e2043743153L8;FF39008052d60000b4e00318aae10316aa22008052d2c70094ed031baad40000b4e00315aae10314aa22008052ccc70094ed031baa5f0700b140060054", - "f4031aaaBL8;FFe10317aae20315aad6070094770a40f9680240f9080117cbbf0208eb09fcff54e00313aae10317aae20315aacd070094770a40f9daffff17f44f44a9f90b40f9L8;FF0b050039090900394a091b320a010039080000142c7c12532a440c330b090039090d00398b6d1c320a0500390b010", - "039a802148be0031f2a680a00f9f44f42a9BBBBL4;FFd4e70194403e00b488ae8e52e90300b029412f9148aeac72200540ad082000b9880280d2890480520800f0f2c0a601a908110091000400adc8a600a948008052L4;FB280000000000000008000000000000000c9f400000000000382140000000000", - "0200000000000000008000000000000003ca04000000000003821400000000000L8;FF5aecff97e02100b44e010014e8af40f9140101eba3310054e8af40f91f0114eba9210054a0c303d189e7ff978031003728fc60d3c82600b5200840921f1800f1BL8;FFe4670194140040f9730000b5350080520b00", - "0014ce670194e00313aa2100805236008052cb67019480feffb4e10314aae20313aaf50300aad167019408008092L8;FFe002803d0080c13ce006803dd6670094810700d15f0700b1e12700f9800b0054e00641ade0430691facb00f90083823ce20242ad0183833c0083853ce10240adBBBL4;FFa8035bf", - "8080119cb5f0308eb69deff54a04301d1e10319aae2031aaa2300805224008052e29aff97b9035cf8ebfeff17a04301d1e10319aa0201805223008052L4;FFfd7bbfa9250000b02aaa9c52fd030091090c40f9270000b0a58c40f9e7800091e10309aa030080d2060080d28a8eac720b10a0d2041440f90a", - "000014230840f9L8;FF2200805208050091a80317f807a80094e8031f2aa0877bada0d300d1a8f31438a203d93ce1830091e00704ada08779ade22b803de00702ada08b7aade00b03adBL8;FFc80200941f1c0072e0079f1a04000014e0031f2ac0035fd6e0031f2aff031291f44f45a9f65744a9f85f43a", - "9fa6742a9fc6f41a9fd7bc6a8c0035fd6fd7bbea9L8;FF880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd620008052800600f909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6fd7bbda9BBBBBBBL4;FF170c40f9e9830091e22702a9e80201ab02100054160440f9c90600", - "91df2200f129fd43d32af17dd3490109cbc932899a1f0549ebe90a00542a050091f30300aaL4;FFffc30b91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6fc0305911b008092b70000b4e00318aae10317aa22008052c91b0094e1af40f9L8;FFc0035fd6fd7bbda9f65701a9f44f", - "02a9fd03009115fcdfc8f40302aaf30301aaf60308aab5010037a142009120008052391c01946002f8b7680200f008c11a91BBL4;FFe0835339fccf5339f9875339ea730c29ea035339f88b5339fcd35339f38f5339eaf30d29ea075339fa935339fcd75339f6975339ea730f29ea0b5339f59b5339L4;ZF", - "L8;FF23ffff54a001009000601191d79b0094e8031faa090840f929f5ffb5091440f9e803088b09f6ffb5b6ffff17e9031faa0a2440f9aaf9ffb50a3040f9e903098bBBBL4;FFfc0b409108018052f70b409102c48052f90300aa9c431991f7c2009108140038d7db0194c012c03cc97e40390a088052c80", - "24039c1f2c03c8013803c00e4006fL4;FB6f776e20656e756d65726174696f6e2076616c756520c000537472696e6756616c7565000000000018114900000000000b00000000000000426f6f6c56616c75L8;FFe0c742f9e2cf42f9eaa317a9e81b42f9ea4742f9fed742f9e8ab00f9e81f42f9eacb00f9e", - "a4b42f9e92312a9e82342f9e93342f9eaeb00f9ea5742f9e8af1aa9BL8;FFe92342a9e00319aae0f3c63d0178805222008052f5170af9e8130af908048152e91b0af9e9eb4df9e81f0af9e8270af908788052e82b0af9e8330af988230f91L8;FFa08300d1f40f00f9e85b00941f040031400700541f0002", - "716200005435008052070000141f0020716200005455008052030000141f404071d536969ae80740f9BBBBL4;FF22008052d6fb0194f48b41f9f9031caa9f0600b100070054e89741f91f0500b180000054e8430c910061009122e5ff97f69341f9f58f41f9960100b4b7220091L4;FB0000000000000000", - "0800000000000000080000000000000084ac40000000000070734000000000002f72757374632f3438613232396365616566643439383563L8;FFe1031faa883200b9adffff17e1010054e1031faaa0ffff17c80080d2e11700f90800f0f2080900d190ffff17e80b41b2e01700f98dffff17c80080d2080", - "0f0f2BL8;FF290140b22911c0da291540d2290d098b2925019129fd46d3290500910a0c40f90801098b5f0500b141fcff54e80308ab42040054091840f93f0500b180010054L8;FF2200805223008052240080528592ff97e11740f918fcff17f30300aae06300912200805223008052240080527d92ff97", - "e11740f9e00313aa9afbff17f30300aaBBBL4;FFa8035cf869f203f8691d0012aa831ab8ab831c38ea1b00b97b5201a9757202a96a9203b8687204f8693e0139010400b587ffff171f09007121010054ea1740f9L4;ZBL8;FFe00316aae1031caa22008052d4bb0094e11b40f9e81340f9080101cb1ffd01", - "f1690b0054f61740f9610341ad630b40ada0c300d1c802018be90f40f962008052BL8;FFa10200d021e02891a2008052123c0114fd7bbea9f30b00f9fd030091080040f91f0900b1a1000054e0031faaf30b40f9fd7bc2a8c0035fd6080141d2e9008052L8;FFa8050034e00000f000600791eb3b009460c", - "e41f961d241f946000014e8830a9102000014e8430b91000540ad082140b9614241f9e88303b9000700ad217001b4BBBBBL4;FF2803178b680a00f9b6010034610a40f9680240f91f0101eb20310054680640f9090380522a040091e00316aa6a0a00f909692138e10313aadaf7ff97b50100b4L4;FF2200", - "8052d60b0094e0031baae10317aa22008052d20b0094b90000b4e0031aaae10319aa22008052cd0b0094a0c300d1e103182a99030094b4937da9e0a30091L8;FF8204805221250091f30308aae2faff97e9834039e80313aa3ffd037181010054e007c03d09008012090100b9e003803d0041803cfd7b43a", - "9f32340f9ff430191BL8;FF040000144800805202000014080180521f00086b61000054e003082ac0035fd6fd7bbfa9fd030091200300f000202491220300f042602591010a8052f98b0194L8;FFd48b0094207a00b4f90300aad08b00944000805241008052ce8b0094607900b4fa0300aaca8b00944000", - "805241008052c88b0094a07800b4eaa74da928008052BBBL4;FF23008052c6adff97e00315aa87ffff17c00140fd00a8200e0800669e0801c0da0811c0da0cfd43d3c8696c38d8ffff17ffc305d1fd7b11a9fc6f12a9fa6713a9L4;FB10fb45000000000043697068657274657874204d414320697320696", - "e76616c696441757468656e74696361746f722070726576696f757320726f6f74206b6579L8;FF79a344a96b334e29604600547f010971204600549f0600b1a06100541f0700b120020054380100b4e0031aaae10318aa22008052f60309aaf9030eaac8cb0094BL8;FFda0000b4e0031baae1031aaa2200", - "8052d34b0194fc2740f99f1b00f103050054f8430691fb0c8092e02340f9080d8052826f089b0080c23c1a0040f901a00191L8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9030054200108ab22010054fd7bc1a8c0035fd6e8031faa091c40f9BBBBL4;", - "FFf44f42a9f50b40f9fd7bc3a8c0035fd6ffc301d1fd7b04a9f65705a9f44f06a9fd030191f40300aa091440f9f30308aa00a840a9811240f928008052ff0b00f9L4;FB62a248000000000072000000000000000200000026000000000000000000000008000000000000000800000000000000bc7842000", - "00000000000000000000000L8;FF2400805287020094610a40f9e00315aaceffff17e00313aa2200805223008052240080527f020094610a40f9680240f9d8ffff17e00313aae10308aa22008052BL8;FF6a0000143f040071e00200543f080071a1030054e8c340b948000037f76300f9c1320191a20301", - "d1a756ff9760f8ffb44a000014e8cb40b988f70737f76700f9L8;FF28008052490100b029e12a91aa0303d1a04700d1e8a711a9480100b008e91691e8ab13a98a06805248048052ffa70ea9490100b029250991e9ab10a9290080d2BBBL4;FF1a154092020100b4e83340f9e10319aa0801028be83300f9e", - "80300910001019102ac0194e003009121031c8be2031aaafaff0039d2ab0194e00318aae10317aaL4;FF68020072293977924a119f9a3fc969f26c7e015349016fb20dfc50d36e6619532a018a9a290080521000a8d23f65536a0f00a8523000c0f26b011f128c011a12L8;FFa8033ea9080000142807c05", - "a08683a785a0b00915f0315ebbb031ff87b070091a2010054480700911f0115eb420b0054a8035ef8690700d1796a7a783f0108ebBL8;FFe82700b9e8031691400707adbb0318f8b58318b8002c0194e88345b9e9c742f902a09152840200d084600f91e0031baa1f010071e103152ae204a072e813899aL", - "8;FF815c00b5e7020014a8035df808011acb1f0308eb28780054180500b4a8835df8e10319aae20318aa00011a8bd42b00945a03188be00319aae10318aa22008052BBBBBBL4;FF24008052ea060094e10340a92aa040a9290040f91f1040f15369283808050091280800f903feff540b7c07533f0108eb6", - "b611932000100544b69283808050091L4;FFea0f41b27a02001409a340b8eabf4979e0074091eb7742f9ecc3533900401d910d1340f868230039e87342f9f62b00f9f9d300f9e98303b9ea0b0779eb9301f9L8;FF0a018052690200f9686a2af8f44f44a9f65743a9fd7b42a9ff430191c0035fd6480102a", - "ba2080054090180527f420029686a29f8f44f44a9f65743a9fd7b42a9BBL4;FF222fc03de1030391e283009103028052e323803de00702ad210347ade20f803db6020191e8270ca9e10303add2ddff9700e4006f28008092208304ad208305adL4;FD0000000000000000000000000000000028304a00000", - "00000000000000000000060104a000000000000c0490000000000306d4800000000000000000000000000L8;FF2494009468420191610100f0218c1691840100d084e00d91a363009182018052a80f00f91b9400941b940094fd7b41a9f31340f9ffc30091c0035fd6ff0301d1BBBL4;FFf80314aaff2300", - "a9f50314aa080315eb80010054699284d208fd44d32949b2f28924c9f24992e4f2177dc99be00315aa65bdff97f70600f1b5c2019181ffff54L4;FBcf99bfbb7dfad97134f29d0e8691221a34f2907934f234f200000100a421f64e4ea472c65987154357596fb299a42e0b5a2e5fe2fea5ca5700009cb37", - "d55b2ccL8;FFe32f00f9f5d342f9e9a310a9e84742f9e95742f9e3d742f9e0af823de8b700f9e84b42f9e34b00f9eba318a9e84f42f9eb7342f9e8eb00f9e85b42f9e88f00f9BL8;FF2a040091800203914901805209692138ead302f946160094e14316917c0d0094e0ab49f9800100b4e1d342f9e8cb42", - "f91f0101ebe0660054e8cf42f909018052L8;FFfb8302910800f0f21c450091f5f742f9f4f342f9150500b49642009177028052180100d018a73f910600001422008052cb530094b50600f1d6c20091c0030054BBBBL4;FF0c000014880b0091b4031df805000014e80b41b2a0031df802000014880f0091", - "a0e300d1a8831cf8bee90094f40300aae12b40f9f5db46a93f0400f18b000054L4;FB375234f365e660955187a3735a0f7613d1609d3a6a4d8c53aeaa5a221240e0b9ebacdfc3aa2827f7924b697784d1c25e44ca05dd433e1a38dc6382eb2730d419L8;FF66000014e1031faa883200f9caffff17a10d00", - "54e0031faa87ffff1721050054e0031faa7affff17c80080d2e00700f90800f0f2080900d16bffff17e90b41b2BL8;FF680300f9490300f9c8fe60d3880900b5c00a40921f1800f182090054c17e0353a10900343f080071ac0100543f040071e00200543f08007181faff54e8a340b9L8;FF6b810991490", - "380526001029109692138ead302f909290094e1431691641100949f0a00b1e10b0054e1ffc33de8d342f9e90348f9e067c13d8183813ce83b08f9BBBL4;FFe00315aae10314aa22008052d4b30194f44f47a9f65746a9f85f45a9fd7b44a9ff030291c0035fd6e003c03de80b40f9745600a9780a00f9608", - "2813c681600f9L4;ZBL8;FF223240b9a0039c3ce141823ca1037eadf23300f932825fb831c20191e041813ce20343ade141803ce117c03d12c21fb800c29e3c02c29d3c01c29c3ce0c3c33cBL8;FFea6a683829090a8b20011fd6a03500b5a02302d1edecff97e0140036e1fcffb4b001001401830191a22", - "302d109ecff9740fcffb46f010014e02e00b5a02302d1L8;FF40010036c82400b5e1031faac2ffff17e1031faae81f05f9bfffff17e1031faae8370ab9bcffff17e1031faae8430ab9b9ffff17e1770ab9eafeff17e1730ab9BBBBBL4;FFe81f8052e0030091a11300d122008052a8c31f38718900948862", - "4039e0030091a11300d122008052a8c31f386b890094e0030091618200910202805267890094L4;FF0b0540396bc100517f250071c80a00544c0180525f0900f1292d0c1b000a00540b0940396bc100517f250071c8090054292d0c1b5f0d00f1200900540b0d4039L8;FFd703011460220091f30b40f9fd", - "7bc2a87200001460420691c10000946022009107feff9760420891f30b40f9fd7bc2a89afdff17610640f9810000b4600a40f9BL8;FFe82702a9e3430091f2830194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000b04af11991e8a700a9020300f042180291ea0f00f9e3430091L8;F", - "F620100d0428035916d00001408200091410100f021301d91e80300f9e8230091e00309aa2202805208840094620100d0428037916200001408200091410100f0BBBL4;FF490108ebe31b00548a0240f9e0c342f94801088b882600a9a8835df8080540f9140100eb631a0054bb835df8620740f95f0014e", - "b69050054610340f920008039L4;FB696f75732073657373696f6e2070726f746f627566000000000000000000000010000000000000000800000000000000c8534700000000000000000000000000L8;FFedc742f9f9cb42f9fecf42f9eed742f9f2db42f9f1df42f9e0e342f9e3235739e7fb42f9e4eb4", - "2f9e5ef42f9f5835739e9f200f8e90301aae27f43f9fc7300f9BL8;FF63d40c91a0c300d142018052e40080522c000014a0031df8c102009021840c91c302009063f80c91a0c300d1420180528400805223000014a0031df8c1020090L8;FFffeb01f9e80303b928008052e8ef01f9080480520800ac7281", - "0101ade80b02f9e8430f91fff301f9e80302f9e90702f98c20ff97a0420035fbef41f9e6f341f9BBBBL4;FF57ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebe30401541803008bf9feffb5L4;FB3c0000000d0000007375", - "636365737366756c206465637279707420616c776179732068617320612076616c69642062617365206b657900008be8480000000000L8;FF79014039680500912e0080526d696e38df010cebaf194092f021ca9aaf1d0013cd050091160216aa820000544a1d0091ee030daacffeff374f04f837360400b", - "4BL8;FF21e03691131000b91f500039f44f42a9f50b40f9fd7bc3a8c0035fd60001805201038052e6630194ff8300d1fd7b01a9fd430091080040b9a01300d1a8c31fb8L8;FFf44f0da9fd830291081c00121f090071e1010054e00302aaf40302aaf30301aad2000094e80300aae00301aa080200379802", - "40f9080740f91f0100eb42020054BBBL4;FFf40303aaf60301aaea0308aa2905899a410140fd290500f121a8200e211ca00e418500fc61ffff545f2000f1030e0054090140f9096922f8f7031faafa1f8052L4;FFe12a0091e20304aa047821f8401840b9e0200035400840f943008052457000910020403", - "9001040d36320c01a60040051e303034b25000014a1fc2f36c0021091L8;FF8002005474de48a9970100b49822009104000014f70600f118630091e000005401835ff881ffffb4000340f922008052cba30094f8ffff17d60000b4c806168bBL8;FF4a051a320a01003912000014eb0f80122c7c10532b2c", - "0633ec0000352a7c0c530b050039090900394a091b320a010039080000142c7c12532a440c330b090039BL4;FFe00700ad820243ade20303ad810241ade10301addc23009400e4006f9ffe0139e0030091882648a98a2e49a98c364aa9e00300ad8e3e4ba9e00301ad080dc0daL3;FB00904800000000000", - "01001000000000000100100000000000010000000000000010000000600000000b009000000000000a049000000000000a0490000000000BBBBBBBBL4;FF0800148a206b68fc00a8200e0a00669e4a0300b44901c0da2911c0da080d498b0801148a296be838a903f836092100d10afc79d3eb0336aa2901", - "148a0b1b0b8bL4;FFe93b407939008052ea1b40b9ebdf4039fbf341f82841082ae9f342f8f77342f8eb2300395a8108aae90300f9560100b50d000014e00fc03ddafe48d3f903162aL8;FF1ffbff978902009029e10c91027d01a9090500a9c0035fd6e30302aae20301aae10300aae00308aa97000014e3", - "0302aae20301aae10300aae00308aa14010014BBL4;FF2ac100913f0108ebe8af43a9ea038a9aea2700f908059f9a7401899af99b41f9a800003779000014e8d343a9f99b41f9c80e0036e083079101230091022a8052L4;FF261c40a9282441a98a2c7ea98c347fa95f0001f1e8000054061c00a9082401", - "a9aa2c3ea9ac343fa9c0035fd61f2003d52e3c42a9304443a95f8001f1a9000054L8;FF810100d021281a91e8030091c20180521f9e009468220191810100d021481491a40100b084600991e0030091a3630091a2008052a80f00f9169e009468620091BBBL4;FF99008052e00318aae10319aae2031f2ae", - "0023fd61f0000f1ad000054390300eb834500541803008b060000141f0400b101450054eddd01941f10003181440054L4;FB2e6372617465732e696f2d313934396366386336623562353537662f757569642d312e32362e312f7372632f74696d657374616d702e7273002f636172676f2dL8;FF2a2055a", - "9ea7b00f9e86300f92a2056a9e86700f928c040f9ead300f9232857a9e86f00f928c440f9e85f00f928c840f9e8e300f928cc40f9eaa30aa92a205aa9BL8;FFe909c05a68260329f44f48a9f92b40f9f65747a9f85f46a9fd7b44a9ff430291c0035fd6e00308aa7956ff17e30302aae20301aac10200d02", - "1203e91e55d0114L8;FFe10313aa6afbff97780a40f9680240f9080118cbdf0208eb88070054680640f9e10317aae20316aa0001188bd45d00940803168b680a00f9540300b4610a40f9BBBBL4;FFd50500b4e00316aae10315aa22008052d3fd0194290000144d69ec382d07f836e083c13c0e0c8052ef2", - "f40f98efd0e9be183c23ce283c03ca0839b3ce083c33cL4;ZFL8;FFb0ffff17c80080d20800f0f208090091acffff17c80080d2e0230039e00300910800f0f2ff270039e80300f9bdf3ff97e80300aa410200d021081591430200d0BL8;FFfd7b44a9ff830191c0035fd6ffc300d1fd7b02a9fd8300910a0", - "040f969028052e80301aa4a0141d25f8d00f14931899a0a0300b04ac901918b0000104c796978L8;FF0800098b080500911f0109ebe815005447000014f7031faaf50314aab60e4ff8df0600b120170054e00315aad0e2ff97080040b20811c0da081540d2080d088bBBBL4;FF800300d000601c91d8bd01", - "94ff0303d1fd7b09a9f55300f9f44f0ba9fd430291f30308aa28008092290c028be80700f9e8230091e0a304a9e0e30091e1a703a9L4;FB11000000000000001d01000005000000408649000000000011000000000000000a01000005000000408649000000000011000000000000001401000005000000L", - "8;FFe00315aa22008052f44f45a9f52340f9fd7b43a9ff830191d1bd0014f44f45a9f52340f9fd7b43a9ff830191c0035fd62000805201048052d6bd0094ff8302d1BL8;FF6b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b", - "8b2905009129010aabc2060054L8;FF0900f0f2e8470039e90700f9ddffff17e00700f9e10000f021443e91e30000f063583e91e0230091a20080524402805286000014c90080d2a8831d3848008052BBBBBL4;FF962a40f91f0101ebe00f0054680640f9290400914a058052e00315aa690a00f90a69213", - "8e10313aadef9ff97770a40f9680240f9080117cbbf0208eba9efff54L4;FFe89340f9ff0f01f9a80000b4e08b40f9e19340f922008052d10d0094e8a340f9a80000b4e0bf40f9e1a340f922008052cb0d0094e8af40f9a80000b4e09f40f9L8;FF680200b9f44f46a9f52b40f9fd7b44a9ffc30191c0035", - "fd6e80313aae10314aae00315aae08700a949008052e1230091e00308aae9630039c0f8ff97f44f46a9BL8;FFe10314aae20319aafc0300aadc8d0194542340f9b4031df8b40100b58200001436008052571740f917fcffb538008052482740f91f0500b121fdff5419008092L8;FFfd030091f30300aa12", - "adff9760020079f30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aa3f0400f18b000054600640f9BBBL4;FFe12740f9e81f40f91f0101eba0060054e82340f9290400910a018052e00317aa0a692138e1e30091e92700f9ddb9ff9796f9ffb4e12740f9e81f40f977", - "025ff8L4;FBfd217d479d423f94da7da28c00eef1f38ae57e800000a46dc8ec2453a8fae00193193b6f44baa9b569b2067aa4aae8600b70f9efccc6545230458baf268b7116L8;FFfadb4aa9f7ef49a9680a00f9e8fb40f9e0f3c03d75a615a9f27340f9680e00f9e9e740f9720600a9e1030991e8bf40f9", - "678213a960020891692202a9e9bb40f9BL8;FFe9d342b9204bc03d8101c03de88f01b9e94303b98041883c8021c03de95343b9811d803d8182823c8082833ce98b01b98082c23c8112c03de8bf40f97a0200f9L8;FF936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6e00301aae10302aa044d0014ff830", - "0d1fd7b01a9fd430091a01300d181008052bfc31fb8fd4c0094a0c35fb8BBBBL4;FFe10319aae3ed0194d1ed0194e00319aa210080523a008052ceed019400ffffb408018052b9833ea9a16300d10800003928008052e00318aaa8831ff8d9d9ff97L4;FBc07c420000000000617373657274696f6e20666", - "1696c65643a20726573756c74203d3d2053656c663a3a5072654b6579207c7c206d6573736167655f74797065L8;FF63f01b91e0030091220280524400805206e3ff97e10340f978ffff17ffc301d1fd7b03a9f72300f9f65705a9f44f06a9fdc30091081c00121f090071a1010054BL8;FF020000141701", - "8052935e00a9930a00f9f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd620008052e10318aad76d019400018052e10315aaL8;FFe043169122008052be110094e1d342f95ff9ff17e043169122008052b9110094e1d342f98dfbff17e043169122008052b4110094e1d342f9a3fbff1", - "7e0431691BBBL4;FFad0319f88df140f80e160033f0fd68d3a7831a78123300f883004039897040f802b300f8a2a0c2938af040f863701d12eb5300798b7041f8efb302f8affd68d3L4;FFc0035fd620008052800600f909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6ff0301d1fd7b02a9f4", - "4f03a9fd830091480001aba2020054010840a9L8;FFea0b40f9282900a9280900f9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd6c001009000602d91d0ad009440008052e10317aaBL8;FF955e1833e82343b95c0300f9550b00b940c3803c41c3813c482f00b9ff033a9", - "1f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6800200f0L8;FFe88340f9f69340f9008545a90c060094e88340f9f40300aaf50301aae00316aae10314aae20315aa039144a9df04ff9700060036b50000b4e00314aae10315aaBBBBBBL4;FF2911c0da490109cbea0080523f1d00f", - "129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f60300aa080014eb23120054ff0208ebL4;FFe10319aa22008052f9030baafb030caaeadb19a9f60313aaf30314aaf40315aaf50309aae8df1aa9f7031caafc030daaf8030eaafa0310aac9150094ed031caaL8;FF15160", - "114fd7bbda9f65701a9f44f02a9fd030091130440f9f40308aa930100b4160040f9ca150194e00313aa21008052c8150194c00200b4e10316aae20313aaBBL4;FFe80741b2e0430091e80b00f9c58b0094e80300aae00740f929008052092000a9fd7b44a9ff430191c0035fd6400300d000601b91d09501", - "94400300d000c01b91L4;ZBL8;FF090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb492d0054080c47f81f0500b18023005410060094080040b20811c0daBBBL4;FF4801088b880300f9290300f9a8fe60d3e84200b5a00a40921f1800f102430054a17e03532143", - "00343f040071010200541f0800f121580054b98355f8bf831cf8L4;FB01000000000000000100000000000000f03a46000000000000000000000000000000000000000000010000000000000034744600000000000000000000000000L8;FF28fc40f921000891e9a30fa9dcd5009408e30d91f04b46a9ed", - "031aaae10316aaee0317aa000540ad08cf41f9e95f4ca9e00b40f9fadb4aa9e2031baaf88f41a9BL8;FF800100b4e1d342f9e8cb42f91f0101eb008f0054e8cf42f9090180522a04009109692138e1431691ead302f9780f0094e88349f91f0500b1c0000054e8074091L8;FF3f0000f10841899a1f2d00f", - "1020b0054a80240f9a80000b4a00640f901e97bd302018052ce550094e00315aa0109805202018052ca550094e0c31d91e1c32291BBBBL4;FFf40308aaa90100343f0d0071a107005460a241a9090d40f9e803009120013fd6e80340f91f0d00b121030054880200f96800805229000014765e40a9f50301", - "aaL4;FB616765726174636865745f6b6579636f756e7465726369706865727465787470715f72617463686574616464726573736573436f6e74656e74646174615f6d65L8;FF020f0054217c0353210f00343f040071c00300543f080071e00100543f0c007101050054888248f81f0500b1810000549fe6", - "08a99ffe09a99f820a3881220291BL8;FF24760194686200910103009021142591040300f084a00f91a363009182018052a80f00f91b76019468c200910103009021442591040300f084201091a3630091L8;FFe19f843de16fc33d4083843ce073c33d4183853ce197c13d4083863ce09bc13d4283833ce", - "293c13dfa3349f9e0ef843de08fc13d5f0700b1e1eb843de18bc13dBBBL4;FFe28303ad000440adf3ff4139e1a300a9220113cbe18f02ad5c0302ebe013803d220200546003138be10319aae2031aaad3b5019468021a0be8ff0139081d0012L4;ZDL8;FFc5010090a5203791e1030091e0031f2ae3031fa", - "a4db60094c001009000403691d2b50094ff8303d1fd7b08a9fc6f09a9fa670aa9f85f0ba9f6570ca9f44f0da9BL8;FF537f089bd2350194e00313aa01018052d0350194c00801b4080d8052fc0300aaf3031faa547f089bf5031aaae10316aa9f0213eba0020054e0c31791b50600d1L8;FFe9ef01f9e900", - "00b0294d2391e80302f9e80000b008312491e9fb01f9290080d2e81302f9c8048052a934c0f2ea1702f90a078052001f813dffeb01f9e8f301f9BBBBBL4;FF800640ada08300d1a0073fade70502941f04003121f6ff54e083c03ce80f40f96002803d680a00f9f44f49a9f73b40f9f65748a9fd7b46a9ff", - "830291c0035fd6L4;FFc8e5ff970500001428008052ff0f00f9ffa300a9780d0035570300b4e10f40f9e80740f9b80640f91f0101eba00d0054e80b40f9490280522a040091e00317aaL8;FF60ae40f901f57ed342008052d405019468b640f9e80000b460ba40f901f57ed342008052f30b40f9fd7bc2a8", - "cc050114f30b40f9fd7bc2a8c0035fd6fd7bbea9BL8;FF601240f922008052f44f4fa9f6574ea9f85f4da9fa674ca9fd7b4ba9ff030491cf850114ca8501948004805221008052c8850194401000b4284d8e52290300b0L8;FFb7835df8f80b00f938fb7fd3d0850094e00318aa41008052ce85009400250", - "0b4e10317aae20318aafa0300aaf30700f9f71300f9d2850094e0031aaae10319aaBBBL4;FFe91f40f9e81300f9280140f91f0500b1c10200542e00001428008052e80f00f9c80600511f09007183feff5416010035ea031f2ae91f40f9e81300f9280140f9L4;FB632f7372632f737472696e672e727300", - "2f60490000000000470000000000000024010000150000002f6049000000000047000000000000002b0100003b000000L8;FFe10313ada182cd3ca082cc3ce86300f9e8b342f9e2ab803dea2306a9e8b742f9aa524678e00714ade83b00f9e8bf42f9e8a703a9e9c342f9e8cb42f9e9230da9BL8;FFf4030", - "baad7050094e10340a9eb0314aa2aa040a9290040f90dfc6ad35369283808050091280800f90dfeffb43f0108eb7361193220010054536928380cfc71d3L8;FF090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8b", - "4a2501914afd46d3BBBBL4;FFfd7b02a9f51b00f9f44f04a9fd83009115d040a9e20301aaf30308aae00315aae10314aa590000941f0400f1410600543f0014eb020a0054080d80522854089bL4;FB7365206b657920c00129000a64656372797074656420c00e206d6573736167652066726f6d20c02720", - "776974682050524556494f55532073657373696f6e2073L8;FF21010054810000b4801240f922008052d3e50094811a40f9a1fcffb40804805205000014811240f93f0400f10bfcff5408028052a06a68f822008052c8e50094BL8;FFf30300aae102009021bc2e91e8030091e00309aac20280521d66019", - "468420091e1020090210c2491e40200f084003391e0030091a363009162018052a80f00f9L8;FF42008052d6650094686640f9a80000b4606a40f901f97fd342008052d0650094687240f9a80000b4607640f901f97fd342008052ca650094687e40f9a80000b4BBBL4;FFf90300aad2a50194e00315aa21", - "00805238008052cfa50194c0feffb4e10319aae20315aaf60300aad5a50194e00319aae10315aa22008052c9a50194e8230091L4;FF00ffff9788ffff1742141a125f003f7161e2ff54f2ffff17734e00a9930a00f91c000014007c4093220000b00028009142001091437860f87f0013ebc0010054L8;FF", - "b50f00f9b562009119a60094946200f121ffff54e003009116a60094f44f43a9f51340f9fd7b41a9ff030191c0035fd6ff8301d1fd7b02a9f85f03a9f65704a9BL8;FFff03019160001fd61f090071410400540820009109040091820200b042d03791e82700a9e80300910900009029a12891200440a9e8", - "2701a9e823009109000090L8;FF29111d12e00304aa02088052f40303aae1f3843cf9030691e9030139e87f0139e00303ade00304adfbd7ff97e8830291e0030191f1250094f8000090e8030391BBBBBBBL4;FFf65742a9f85f41a9fd7bc4a8c0035fd6e003032ad91902947f0200a9610a00f9f44f43a9f", - "65742a9f85f41a9fd7bc4a8c0035fd6ff4303d1fd7b08a9f94b00f9L4;FFa9eb7aa9e10740f9e20304adbbf37ba9e11f803d0200001417008092e20344adff0600b1e11fc03de28302ade113803da2033cada103973c20010054a2037cadL8;FF68000054ea031faa09010b8b0b0440f9290108ebe803889", - "a4101899a6001088bc0035fd60b0440f9e9031febe8039f9ae103899a6001088bc0035fd6020c40f9BBL4;FF4a018052ff6b0339690180520a010aaaff6f0339090109aaff73033909057eb2aa018052ff77033909010aaaff7b033909097fb2ff7f0339080d40b2ffc32491L4;ZFL8;FF249a0094810100", - "b0215c1491a401009084e00991a363009182008052b30f00f91c9a00941c9a0094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9BBBL4;FFfc03142af40319aae10740f9810000b4e0031baa22008052d1d90194b60000b4e0031aaae10316aa22008052ccd90194614a40f93f0400b1400200", - "54810000b4L4;FB656173652f6275696c642f737071722d383934636339653033313261616632312f6f75742f7369676e616c2e70726f746f2e70715f726174636865742e727300L8;FFeb2311a9e85b42f9eb7342f9e8a300f9e86342f9ea2313a9e86f42f9ea7742f9e82b00f9e88f42f9e81b00f9e893", - "42f9e87b00f9e89742f9e86300f9e8a342f9BL8;FF2800805248030039280040391f050071c1f10054e0074091e14306910274805200800991f807409118830991d4590194e0074091e843169100800991d9970094L8;FFf803172af7031aaafa0315aaf503132af30740f919000014e82b00f9facb40f99", - "af1ffb51c018052e81b41f91f0500b1e1f5ff5417008092e83341f9f92700f9BBBBL4;FF60a241a9090d40f9e803009120013fd6e80340f91f0d00b141030054880200f9680080522a000014785a40a9f50301aa770a40f9c6f901940004805201018052L4;FB70726f746f636f6c2f7372632f70726f746", - "f636f6c2e72730033646573657269616c697a656420556e6964656e74696669656453656e6465724d657373616765L8;FFe28342ade28309ade18340ade18307ad402300b4e0c3039193f7ff97f6000014e1430091e20313aaf70b00f9f73300f93f070094e08742adf50300aae21fc03dBL8;FF8b000054", - "602a40f922008052d4790194613240f9742600f93f0400f18b000054603640f922008052cd790194680a40f929008092693200f91f0900f1c0000054L8;FFff0300f9ff833cd1e8074091f30300aafa07409108810991e00301aaf5074091ff0300f95a830991b58209917c91ff97f73349f94083c03ce83", - "f49f9ff0a00b1BBBL4;FF6901098b8d010d8b2bcdcbcaacc1ccca2981c993ad010b8b8901098bae81cd93abbdcbca2cadccca280108cac91d40d208010b8baed356f88901098b0bcdcbcaL4;ZBL8;FFfb0300aac00100b000802d9101048052e20318aa03048052e4031aaae50314aae6031baa07048052f", - "a0f00f9f6100094e0431291e10316aae2031baa03048052BL8;FFf6031faa770a40f917f7ffb5e80317ab23f9ff54a00200d000800891d3390194490080524afdff35ea031faa4901098b200108aba2010054f44f44a9f90b40f9L8;FFa80280522a490091e8f701f9e8ef01f9eaeb01f9d63801b4e0430f", - "918df8ff97683642f9754602f90a0100b009554f2948b140f93f050071a1380154fb5f40f9BBBBBL4;FFe00700f9210400b021a01f91230400b063e01f91e0230091020280520402805293010014e10300aa280c49f81f0500b121010054280080521f7c0aa91f2009a9L4;FFe91741b268220039690200f", - "9f44f42a9f65741a9fd7bc3a8c0035fd6280480d20800f0f2685200a9f44f42a9f65741a9fd7bc3a8c0035fd63500805275d200a9L8;FF150a0114080040f9e20301aa002140a9e10308aa1d0a0114ff0301d1fd7b02a9f31b00f9fd830091130040f9e00301aae803009121008052e2031faa030a0194BL", - "8;FFfd030091200300f000402691220300f042a02791e10a8052028a0194ff0307d1fd7b16a9fc6f17a9fa6718a9f85f19a9f6571aa9f44f1ba9fd830591f40301aaL8;FFa86a1b53e8c300b9a8621953e8a71629a95e1853a85a1753e8a71529a9561653a8521553e8a71429a94e1453a84a1353e8a7132", - "9a9461253a8421153e8a71229BBBL4;FFba035df8e90313aa480317cb7f0208eb89030054a0c300d1e10317aae20309aa2300805224008052f30309aae0bcff97b7035ef8ba035df8f52b40b9f44f40b9L4;FB08000000000000001c0a460000000000000000000000000008000000000000000800000000", - "000000240a46000000000000000000000000000800000000000000L8;FF730b0094e1b343f9fcb743f9fabb43f9f8bf43f93f0400b1803a0054e0ebc13de1efc13d684340f9e2f7c13dfa8302f9e04f813d1f0500b1e0f3c13de153813dBL8;FF42008052d6490194683640f9a80000b4603a40f901f97fd", - "342008052d0490194684240f9a80000b4604640f901f97fd342008052ca490194684e40f9a80000b4L8;FF1f0500b12011005464feff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebe80f0054960000141dfeff97080040b2BBBBL4;FFe0074bade08711ad0", - "8140038d2e901941f3f00f1e8eeff54e08753ad20030291a14302d122008052a0873dade08b54ada08b3eade18351ada1833bade28352adL4;FB0800000000000000888342000000000000000000000000000800000000000000080000000000000098834200000000000000000000000000080000000000", - "0000L8;FF080117cbbf0208eb280b0054680640f9e10316aae20315aa0001178bd8e90094e802158b680a00f9952240f9550300b4610a40f9680240f9941e40f91f0101ebBL8;FF892eccf289adecf21f0109ebe80200d008012a91210e0054081140b91601162afc031aaa590d00359f0217eba20000543", - "90080522e000014ff0214eba8ffff54L8;FFe00313aa52050094b50600f173a2019181ffff54e81f40f9c80000b4090d8052e00314aa02018052017d099bcc690094e17740f9210100b4e07b40f922008052BBBL4;FF600300f000540a91620300f042e00a91c1038052f3a90194ff8306d1fd7b14a9fc6f", - "15a9fa6716a9f85f17a9f65718a9f44f19a9fd030591e10b04a9f603072aL4;FF22feff548d090091f2ffff17080109cb8a000014681e00910af17d92480113eb8c0208cb5f0113ebe8031faa8b0940920001005469020acbed0313aaae15c038L8;FFfd7bc6a8d6a90014f6a340a9e18300910230805213", - "1940b914814039e00316aad7a90094a10240f9d3c200f9d4220639810000b4a00640f922008052c8a90094BL8;FFf7c741f9e95305f9400705ad000543ad4233803dffa71139400703ad020144ad420304ad010141ad410301ad020142ad420302ad010140ad410300ad60000054L8;FF450000140a0180d", - "20804805209c480520a00f0f2e89f04f9e9a704f95a650091a1035df8611b00b5de0000142183c03ce90f4bf9a84301d1ea0756b9eb134bf9BBBBBBL4;FF230400f063282391e003009142028052e400805205070194e00340f9f44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd6e00740f9f44f", - "46a9f72340f9L4;FF09a90039e9ab52290aad003909b10039e9ab51290ab5003909b90039e9ab50290abd003909c10039e9ab4f290ac5003909c90039e9ab4e290acd003909d10039L8;FF0a819f1a8d0d00122e18403929010b0b4a114c0bbf25007129c100110b819f1adf7d02710924003949c100110a", - "819f1a0928003969010d0b4a114e0b29c10011BBL4;FFfd7b42a9ff430191c0035fd6082440a9e20301aae00308aae10309aa0a920114fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9fd030091ff0740d1ff0300f9L4;ZDL8;FF200108ab62000054fd7bc1a8c0035fd6800100d000402991d49100948", - "00100d000c01a91d1910094600100f000c01291ce910094281040b96800c8376800d037BBBL4;FFe903092aa8031638a8b356b8aa8315f8890100b9a9ab77a9883100b8a88355f8a88201f8e85340f9e9ab0ba9a9035638000540ada902023829008052e9c30239L4;FB39aa89e616d7f3568dbaa4e2a938", - "2dc28cfc233fff9970e011ba83e2a27c2d97cce9733a9e4aa29aadaeace7eb39784a9e12a28c8ee578940000aab5409a1f48L8;FFf6ef49a908008092f4030baafa8700f9eb0319aae87700f9e4a74ba9eef347a9f9031eaafe0314aae80317aaf70316aae1d348a9f5ef00f9fadb4aa9e31340f9BL8;FF2", - "2008052d7110094e1d342f94ef9ff17e0431691e1031caae2031aaad1110094fcd342f9e8cb42f908011ccb5f0308eb492aff54e0431691e1031caae2031aaaL8;FFe00304aae18b0ba9e10302aae96300b9e28f07a9e49708a9e69f09a9ffd30879ff4b02f9e3930ca9e59b0da9e9fb00b9ea0b10a90001", - "3fd6e03b02f9e8031691BBBBL4;FF684200390afd68d308fd48d3695e0039681201b848038052680e00f9080080926a520178d1000014080400900821389109058052682601a908008092685e00a9L4;FB722076323a20722028323032332d30382900000000000000859248000000000033000000000000", - "002a0400003200000063616e20646572697665207075626c69L8;FFe10300aae10300f9210200f021281a91230200f063d01391e0030091c20180524400805201e7ff97e00340f960ffff17c80080d20800f0f20809009152ffff17BL8;FF2901084aab531838ab835838a9631838a99358384a01084a6b0", - "1084aaa731838aaa358382901084aab831838abb35838a9931838a9c358384a01084a6b01084aL8;FFf97b49f91f0101eb208d0054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9610f0094fad342f9e8cb42f908011acb1f0308eb288c0054BBBL4;FF01610091a19bff9760e8ff", - "b454000014a86303d1a26301d1018101919b9bff97a0e7ffb454000014a86303d1a26301d101610091ef9cff97e0e6ffb448000014L4;ZBL8;FF3f0400b100feff5439e941a937e143a9352145a9e80f00f9810000b4200540f922008052ceb10094b90000b4e0031aaae10319aa22008052c9b10094b700", - "00b4BL8;FF63500d914401805208270094e15346f906000014e80f41b2e0833291e85306f9c0270094e10300aae15306f9e0833291a10200902120099102028052a3020090L8;FF21f83b912223c03de0830e91e3032a91e4430f91e2008052008703ad0227803d2e020094f5e741f9e8df41f9bf0208eb6", - "1000054e0e30e91c368fe97200743adBBBBBL4;FFe0030037760640f9e8030191e00316aaae010294680a40f9c9624039e07f0091e2030191a3c300d1e10315aa000540ade9630139a0873ead6a35009428008052L4;FFe8df00f9970000b507000014e81f40f9e8df00f9e00316aae10317aa22008052cf", - "010094f6e742a9f71340f9d582009104000014940600f1b5c2009180010054L8;FFf44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f30b00f9fd030091012440f9f30300aa3f0400b140010054810000b4602a40f922008052c9010194613240f9BL8;FFff830091c0035fd6010300f0217029918200805", - "210820114080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091010300f021802991L8;FF383040f92000178be21640d2e1031f2af91640d216140038cf8100943f1f00f1a8010054800640ad80020191e103009122008052e00700ad800a41ade00b01adBBBL4;FF8a0a009108", - "1d4092e0c30091280108aaea2303a9c1aaff9788320091a903009029493591682600a948038052680a00f9f44f49a9f73b40f9f65748a9fd7b46a9L4;FB6e6167656d656e742e7273000a64656372797074656420c00e206d6573736167652066726f6d20c02620776974682063757272656e74207365737", - "3696f6e2073L8;FF40011fd6895643a91600f0d28082c03c880e40f9810ac03da003933ca80314f841838c3ca98315f860010014e083029181220091023f8052f5830291d0c10094BL8;FF610a40f9680240f91f0101eba0090054680640f9090180522a040091e00317aa6a0a00f909692138e10313aa78", - "fbff97560300b4610a40f9680240f9b70640f9L8;FFe8b30a9169fdfff029f13991e80302f9e8830a910001009000a42191e90702f9290000f029b11691e80b02f90801009008213991e90f02f949048052e82719a9BBBBL4;FF1f0400b161c60054f8e101941f100031e1c50054f9ffff17f5e10194f703", - "00aa1f0400b141fdff54e043059181008052f0e10194c0c40035e85341b9e8af00b9L4;FB5e0100002e00000034ed4800000000006a000000000000006e0000002e00000034ed4800000000006a0000000000000002000000260000000000000000000000L8;FFe8018052e8632d393e000014a003dd3ca8", - "035ef809008092690200f953000014e0dfc03de8c341f9c082803ce8b705f934000014e8b345f9e0d7c23de0030b91BL8;FF0080813c1fa00039f44f42a9f65741a9fd7bc3a8c0035fd60001805201068052e7610194ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aac10200f0L8;FFe10309a", - "a22008052f4030daabd050094e10340a9ed0314aa2aa040a9536928380cfc71d308050091290040f9280800f90cfeffb43f0108ebb361193200020054BBBL4;FF210a8052e3a10194fd7bbca9f70b00f9f65702a9f44f03a9fd030091c10500b40a0040395f2100f1a10500543f8418f1c1050054f70300a", - "af40303aaf60302aaL4;FF610640f9330000f9f35341a9fb7345a94dfeff17734e00a900008052d37a37f8f35341a9fb7345a947feff1700008012f35341a9fb7345a943feff17fd7bbba9L8;FF82008052e80700f917a20094fd7b41a9ff830091c0035fd6810100f021bc1491820080520ca2001408004", - "0f9e00301aa090140f93f0500b1e0010054ff8300d1BL8;FFe8a701a9e8230091800200b000580691e8ab02a9a8630091a1831ff8820200b042a01091e8a703a9e8430091e1630091e8ab04a9d8210194a8630091090000f0BL4;FFf30b00f9fd030091f30300aa004840f9a00000b4614e40f9610000b42", - "2008052cf210094611240f9810000b4600e40f922008052ca210094610240f9810000b4L3;ZBBBBBBBBBBL4;FFa80d00541805009119f37dd314230091930219ab020d0054e8ef7db27f0208eba80c0054f503042afb0302aafa0303aafc0300aac61e0294e00313aa01018052L4;FFc2060054217c0353e", - "10600343f0800714d0200543f0c007180fdff543f100071e00200543f140071010400541f0400f1010c0054a8835cf8090540f9292100f1L8;FFa04300d1b55f3fa9fffbff978002009000401991d81e01948002009000a01991d51e01948002009000402191cf1e01948002009000001391cc1e01948002", - "0090BBL4;FFf65752a9f85f51a9fa6750a9fc6f4fa9fd7b4ea9ff030591c0035fd6e0c30191fc0700f9e69bff97e96f47a9f49340b9f85b48a93f0900b161010054f60300b4L4;FF9affff176bf7ff97140080d281018052010000b9f3ffff177500156b60010054e003154bbf120071bfc820388d010054", - "bfb01f38b5c01fb875d25f38b5120012L8;FF810100d021281a91e8030091c20180521f9f0094810100d021d01391a40100b084c02691e0030091a363009142008052b30f00f9179f009468420191810100d0BBBL4;FFe85300b957ffdfc8770000b5f8de0194f70300aaff0600b180020054f8430591990", - "08052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300ebL4;FB8f02000014000000f5014900000000004e000000000000005707000005000000f5014900000000004e000000000000005807000005000000f501490000000000L8;FF09008092690200f9e80000b420cc40f9f30301aae", - "10308aa22008052d0de0094e10313aa28d440f9e80000b420d840f9f30301aae10308aa22008052c8de0094BL8;FFd80900b4352340f9d15e0194e00318aa21008052cf5e0194800d00b4e10315aae20318aaa0031ff8d55e01943c3340f9b8831ff8bc0800b4352f40f9c45e0194L8;FFa1ffff17e00313", - "aa22008052bd020094610a40f9bdffff17e00313aae10318aae20316aab7020094780a40f9680240f9080118cbdf0208eb29f8ff54e00313aaBBBBL4;FF0e0c8052ef2f40f98efd0e9be183c23ce283c03ca0839b3ce083c33c0f4105f88f2100d10041833ce083c43ceb010b8a0141823c4b010b8b00418", - "43ca043dc3cL4;ZFL8;FFe10340a9eb0314aa2ca040a9290040f90afc78d39369283808050091280800f96af3ffb4d4ffff17e10300a9e00301aae10309aa220080522300805224008052BL8;FF080140f915d140a9e8030091177f0194740100b4130300d073621291e0030091a1630091e20313aab50f0", - "0f9b50600910f7f0194940600f121ffff54e0030091L8;FF9f0700b180000054e1630091e00315aaa994ff97888240f91f0500b18000005480020491e16300910b93ff97889e40f91f0500b160e3ff5481e20491e2630091BBBL4;FF08580039e8a3403918f000b8097001f8087c00397affff17960000b4", - "e10316aa22008052cebe0194b50000b4e00314aae10315aa22008052c9be0194e12740f9L4;FB656e746174696f6e2072657475726e656420616e206572726f7220756e65787065637465646c7900b07d4900000000004b000000000000007f0b00000e000000L8;FFc0035fd6c50100d0a5202b91e12300", - "9182620791e0031f2ae3031faa47bf0094e8430091c50100d0a5e02b91e1c3099102210191e0031f2ae3031faa3fbf0094BL8;FFfd430091a01300d181008052bfc31fb82e3f0194a0c35fb8fd7b41a9ff830091c0035fd6ff8300d1fd7b01a9fd430091e023009101018052ff0700f9233f0194L8;FFa12", - "10054e00313aaff6b00b9ffdf00a9df7e01a9dffe02a9f71700f9f72300f9df7e04a9f7ff05a91affff97e0060036212c00b5992240f9881a40f93f0308ebBBBBBL4;FF680240f9960640f91f0101eb80310054680640f9490180522a040091e00315aa6a0a00f909692138e10313aaddfaff97770a40f96", - "80240f9080117cbbf0208ebL4;FFec0f41b276000014e8431391e1a740f9e0431391099140b80a1140f81bd140b82200805223008052e97b00f9091141f8089141f8e92b10a9e87f00f91c040094L8;FFc0035fd6ff8301d1fd7b04a9f32b00f9fd030191f30301aae10300aae0230091e2031f2ab8fcff9", - "7ea0740f9e8c341f8690f8052ec374229eb2740b9ea9300f8BL8;FF7ca60fa9e90b40f9682201b9e82340f9771201b968a612a9689e00f9e82b40b9781601b9684201b9e83f40b9745201b9685601b9e81b40f9755a07a9752206a9L8;FFffc30091c0035fd6a80100d008010191e9030091630100b06380", - "2191640100d08400119100210091e2230091f40301aa21008052e82700a9fd8e0094a80100d0BBBL4;FF290400910a0580520a692138e1e30091e92700f9e3baff97e80f40f9b5c201911f0115ebe0370054e12740f9e81f40f91f0101eb00290054e82340f929040091L4;FB7e4f890cb8bec41f23695c3", - "f3db95a978f187637506e0d61ed3ea28c370adbfd210807340000f77bd10f9652e9a3310a8c62d40ae63074a2d6f9b981c268260bL8;FFfb0309aaeec300f9e82f40f9f07315a9ec030baaf67b40f9ef7347a9e8f700f9f0008052e30302aaebcf40f9ee174da9e97b4ca9e7cf00f9e8d740f9e0b3c23dBL", - "8;FFf52340f9fd7b43a9ff830191c0035fd68000805206000014e00313aaeb070094e80300aae00301aaa8fe0737680240f9090540f91f0009eb29060054e80f41b2L8;FF22008052d64e009403feff17c082c73ce8a344f94003803de8f304f9fefdff17280100d008b140f91f0500f149040054e12340f", - "9a04303d102048052b44303d1BBBBL4;FFe80f40f9e91b40f9610200a9685601a9e83f40b9742602a9683200b9f44f46a9f52b40f9fd7b44a9ffc30191c0035fd6ff8302d1fd7b04a9fc6f05a9fa6706a9L4;FBda060000120000000b9a48000000000029000000000000004e0100002d00000063616e6e6", - "f742063726561746520612044656372797074696f6e4572726f724dL8;FFc80080d20800f0f2080500d1e80300f9e0030091c3e4ff97e10300aae10300f9210200d021801391230200d063d01391e00300918202805244008052fbe3ff97BL8;FFc20000542a7c0653090500394a051a320a010039120000", - "14eb0f80122c7c10532b2c0633ec0000352a7c0c530b050039090900394a091b320a01003908000014L8;FFf8210094e1431691690c0094e0b349f9800100b4e1d342f9e8cb42f91f0101eb20390054e8cf42f9090180522a04009109692138e1431691ead302f95c0c0094BBBL4;FF039343a9e9850094e", - "fae01940000162aedae01941f1c0072a1f9ff54e80300d008b140f9680500b428008052690300d029b11491e82706a9680300d008611391L4;FFf94b1432680218eb1f0119eb1631999a7f0218ebf7979f1a290200548102188be003152ae20316aa00120094600100b4c000f8b65f070094080040b91f11", - "0071L8;FFa22300d1fb03012a21008052e30315aae40316aaa8273fa905af0094e0031a2ae1031b2a28e340391f05007181f8ff54ddffff173f0014eb3c30949afc0500b4BL8;FFe82000b40805088be00313aa0201805201f17dd352f8ff17f96f41f9eac31791f5e3573940c1c03cf7ef573941c1c13ce", - "91f46b9280340f958914078f46b41f9L8;FFffc30691c0035fd6a04302d1e1031faa95f1ff9752ffff17fd7bbda9fc5701a9f44f02a9fd030091ffc320d1f30308aaa08741ada82b40f9a90700d1ff0300f9BBBBBBL4;FF8b000054601240f922008052d4160294611a40f93f0400f18b000054601e40f92", - "2008052ce160294612640f93f0400f18b000054602a40f922008052c8160294L4;FFff0300f9e9c4ff97e86b42f91f0900b1403300541f0500b1c03200544083cb3c4183cc3c090141d21f0100f1e8ab0bf960838b3c4083cd3c29459f9a61838c3cL8;FF680200d008c11a9174da00a9600e00f9680200f", - "9f44f42a9f65741a9fd7bc3a8c0035fd6280080527f7e01a9680600f9680200d008e10c91680200f9f44f42a9BBL4;FFa0031df84103009021c824914303009063942691a0c300d1e2008052040380522a000014a0031df84103009021c824914303009063e02591a0c300d1e2008052L4;ZBL8;FFd79600", - "94f8ffff17d50000b4a806158be00314aa0201805201f17dd3d096009408008092680200f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6fd7bbfa9BBBL4;FFe1031f2a828e40f99a9640f9e3031f2ae8630039e90b00f901d701945f0700b1a0000054882653a92b0080528a4241b903000014eb031f", - "2ae8031faaac835fb8L4;FB3143743153656e74456b526563656976656465706f63686175746873656e64726563766e65787470726576737071724e6f6e65536f6d65646174616573656b63L8;FF0001803de88340f9e89b04f99c190094e8eb41f9eafb41f9e9f341f9eb1342f9f96b42f9ec6f42f9e847", - "00f9e8ef41f9fe7342f9e78342f9e08742f9e68b42f9BL8;FFc1825ff881ffffb4c00240f922008052d3560194f8ffff1760020291b10b0094e80740910881099100010491740b0094f4cf49f99f0600b100b0ff54f5d749f9L8;FF48008052e0a33239e0833291e8a73239c80080d20800f0f2e85306f9c", - "14cff9770000014e05306f9e08332912101009021e0339102028052230100b063540091BBBBL4;FFe023c03de85b40f9800601ade00743ad882a00f9280080528212803d800600ad68720039f44f4fa9f76b40f9f6574ea9fd7b4ca9ff030491c0035fd600018052L4;FB696669636174652074686174207", - "761736e2774207369676e656420627920616e7920747275737420726f6f746c69627369676e616c5f70726f746f636f6c3a3aL8;FFfd7b43a9ff030291c0035fd6170080923800805219018052a80640f91f0116eba90c0054e00313aa89f6ff97e80300aae00301aae8fd073708fc60d3280c00b5BL8;FF", - "e08745ad69220f29e8a741296182813ce20748ad6082803ce037c03d69a200b9e94740b968be0239e88340b969c20239e90b417968120bb8e8e3413969520b78L8;FFdf760094e063c13de8a342f9e907409129c13591f73340f9e157c13de0f3863de05bc13dea670291e8d700f928e341f8ff0600b120a", - "1813ce04fc13de8cf0ef9BBBL4;FFe00b40f9e1031baa22008052f44f4aa9f65749a9f85f48a9fa6747a9fc6f46a9fd7b45a9ffc30291cdb60114f44f4aa9f65749a9f85f48a9fa6747a9fc6f46a9L4;ZDL8;FFe90700f96101005420844cade80300aa226cc03d000400ad202000910209803d021900f9f", - "d7b41a9ff83009104b1ff17c5010090a5803291e1230091e2030091BL8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54L8;FF6083c93c6183ca3c6283cb3ce8eb41f9c00601ad6083cc", - "3c6183c73ce81f00f9c20202ad6083c83cc10200ad02000014e81f00f9f73700f977aa40f9f9e305a9BBBBBL4;FFe00707ad98120094e88340f91f0500b1c0100054e1034aade2030491e00743a9810303ade20349ad820302ade00748ade25bc03df40301b9800701ade10347adL4;FFf50b00f9f44f02a", - "9fd030091f40302aaf303012af50300aacd0600940003805201018052cb060094400100b4155000a9810000d021c03c91131000b91f500039L8;FFa9831ff8490200f02b011c91410200f021801c91430200f0630c0f91a92300d1460200f0c6801b912a018052470200f0e7ac1c91e00308aa6201805204", - "018052BL8;FF014840f9f30300aa1fa400f91f0800f93f0400b11f1400f91f2000f940020054810000b4604e40f922008052cc860194615640f9810000b4605a40f922008052L8;FF640100f084e00891a363009142018052a80f00f91f870094682202916101009021b81c91640100f084e00d91a363009", - "1a2018052a80f00f91687009416870094BBBL4;FF608709ad000800546083cd3c6183ce3c6283cf3ce82b00f9688740f9e99742b9800706ad6083c93c6183ca3c823b803d6283cb3c800704ad6083cc3c6183c53cL4;FB792f696e6465782e6372617465732e696f2d313934396366386336623562353537", - "662f70726f73742d302e31342e342f7372632f656e636f64696e672f766172L8;FF69914bb8e023c23de10b19ade127c23de22fc23d3b8108aae97344f9eaef43f9e00717ade02bc23de10fc23de9a301f9e97740f96b114df8e00b18ade213c23dBL8;FFff030191c0035fd63f2900f1880000544b01098", - "b6bf1df388b0cf8374b05c0396c1d00128c6119538c01210b810102516b00f8374b0080524c0000143f104071L8;FF081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aa080c45f81f0500b1800200545afbff97080040b20811c0da081540d2BBBBL4;FFe95f00b9d", - "8e60194010700d15f0700b1612200f9c01e0054c002c03daa0302d1e02b803d950a00b4e8434179e98b4239f3334af8f6bf4239f7b34ab8a8031878L4;FB0b021b02ce0146023b013602bb0000007b0000003c00c800e700a4002501660031003d00135a6852842b007c494c059ea36eca27c5003b362c0b", - "1640315f756fL8;FF000b06ada083d83ca283d93c010303ada083da3ca183d33c020304ada083d43ca283d53c010301ada083d63ca183d13c020302ada083d23c010300ad200800b5BL8;FF008c815221008052d2660194200400b4a1060091028c8152f30300aa158c8152d76601942800809293d600a98", - "80200f9f44f42a9f50b40f9fd7bc3a8c0035fd6L8;FF22008052d6660094614640f9e10400b408108052606a68f822008052f44f41a9fd7bc2a8ce660014611640f9810000b4601240f922008052c9660094610640f9BBBL4;FF81010054ea0f40f9090180d20900f0f248dd7892290140b20a000014ea47", - "4039090180d2e8031faa0900f0f205000014090180d2e8031faa0900f0f229017fb2L4;FFfd7bbea942008052fd030091f35301a9f30300aa200080520120c11a60824039641e40b9631a40b90610001265424079001040d38300032a4220c01a2400030bL8;FFf44f43a9f51340f9fd7b41a9ff030191c0", - "035fd6e801009008010191e9230091830100f063802191a401009084001191f303002a00210091f403022aa2630091BL8;FF0a7c4039f30308aa08088052090040390010c03c01f0c03c48150033e003009129111d12e013803ce87f003968060091e9030039e1f3803c2d270194e0030091L8;FF542340f", - "9b4031df874f1ffb509018052a8035df8755a00a9755e01a9785e02a97c6605a97b6200b9682603a9686604a9f44f4ca9f6574ba9f85f4aa9fa6749a9BBBBBBBL4;FF680a00f957feffb4e8ea7bd3089d009108e97b92e902088b212500b180fdff54000308cb02018052cd1a0294e8ffff17e003032ad11", - "a0294f40300aae5ffff17L4;FF21030054350400b4a8e300d1e00318aae10315aa1274fe97bae77ca96083c23cbcef7da9b5835ef8e00b803d5f0700b1e1020054e00bc03de00300adb70000b4L8;FFfd7bc3a8c0035fd6600200f000801c91d61a0194fd7bbea9f44f01a9fd030091f30300aa148000910", - "180009100008092371b01941f0400f1a10100549ffedfc8BBL4;FFe96a403908010b4aeb4f40b9e8620039e86e40394a010b4aeb5740b9ea660039ea72403929010b4aeb5f40b9e96a0039e976403908010b4aeb6740b9e86e0039L4;ZFL8;FFc2030054280108ab42040054091440f9090300b40a1040f9", - "ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191BBBL4;FF2587c13de40fc53de0fb843d227fc13de1830aade023c53de617c53de48f0dad2383c13de7ffc43de1f7843de127c53de307853de78b0bade3970cade31fc53dL4;FBb814490000000000686", - "544000000000088654400000000005865440000000000686544000000000070654400000000004c656e67746844656c696d6974657254L8;FFec0318aae46740f9ed0740f9e60316aae33b40f9fe1740f9e03340f9f5ef40f9fa8740f9e0c7c33da8008052f80306aae87300f9e60302aaea0314aae0f380", - "3dBL8;FFe35a0194f6ef47f9e01bc43de11fc43de0431691e8036179e1833791023f8052e057813de15b813de8e30a79d45a0194380080527400805215008092e8d342f9L8;FFe00313aa00013fd6c10640f9810000b4c20a40f9e00313aad15a00949f0a00b121010054e01bc13de11fc13db47e0853e88", - "344b9e063813de167813de8a305b9BBBBL4;FFeab702a9f0bb01a9ec0b00f98803c0da0811c0da880e488b08010e8a08fd119b1702088be80317aaea825bf8090d5bf83f0500b15301889a680a40f91f0308ebL4;FB61702d322e31342e322f7372632f696e6e65722e727300083c6572726f723a20c0013", - "e002f72757374632f343861323239636561656664343938356335303939L8;FF0800f0f2080900913f0108eba120005481220091e20313aa45080094f50300aaf50100143f0900b140220054880080d20800f0f2081900913f0108eba1210054BL8;FFa2028052e40315aaa80f00f9217b01946882019101", - "0300b021a83691a3630091c2018052e40314aaa80f00f9197b019468e20191010300b021e01f91a3630091L8;FF080117cbbf0208ebc978ff54e0630091e10317aae20315aa23008052240080528091ff97f71740f9befbff17f60300aae0630091220080522300805224008052BBBL4;FFd3ba019420031", - "88b01018052d1ba0194a00100b488fe43d31800188b970600d19f2600f1e00318aae11f805209f17dd3e20319aa280108cbf432889ac6ba0194L4;ZBL8;FFe037c13de13bc13df4230991e243c13de92341f9e0431291e00610ade03fc13de1230991e12fc13de82701f9e00a11ade033c13de28fc03de93", - "301f9e1020fadBL8;FF080500911f0109ebe80f0054960000141dfeff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb281000548a000014L8;FFe1031aaa22008052d53a0094604242f9f5830d91088c41f81f0500b1c05d0154e8430f917861fe97e8434f39", - "28370036e8f341f9f6df43b9fa031faaf7db43b9BBBBBL4;FF2300805224008052e9fdff97610a40f95cfeff17e00313aae10317aae20315aa2300805224008052e1fdff97770a40f9680240f9080117cbbf0208ebc9cbff54L4;FFf44f02a9fd030091a87cc39bf30300aae9031faa0a018052ff0308eb2", - "8008052a1030054b47c039b0b00f0d2f50304aa6b0104cb9f020bebe8020054010100b4L8;FF006868f822008052d50a0114010440f93f0400f14bfdff5408028052006868f822008052ce0a0114fd7bbca9f85f01a9f65702a9f44f03a9fd030091130040f9BL8;FF21702991e00308aa82008052fd7b41", - "a9ff830091108b0114ff8303d1fd7b09a9f95300f9f85f0ba9f6570ca9f44f0da9fd430291f30308aa28008052380180d2L8;FFe2ffff1718018052ff0f00f9a9000014f90314aace8a0094e00318aa41008052cc8a0094a05d00b4ea3340f9f40300aa08080091e9031aaa2b4540784a0500f1BBBL4;FFa", - "a031ef809693738e81b40b9e003082ae4b6ff97a1035ef8a8035df81f0101eb401c0054a8835df8090680522a040091e003152aaa031ef809692138a1c300d1L4;FB0800000000000000080000000000000014fe450000000000456b43743141636b00000000000000000800000000000000080000000000", - "0000300c460000000000L8;FF2181cd3cf7430d912281ca3c2481c73ced0316aae38717ad2181cb3ce60309912381c83ceabb43f9fa6b00f9e28716ad2181c93c2281c33ce7bf43f9f5a35d39BL8;FFa00000b4614e40f9610000b422008052d34a0194611240f9810000b4600e40f922008052ce4a0194b", - "40000b4600640f9e10314aa22008052c94a0194602e40f9L8;FF000100d000401391d84a0094000100d000801291d54a0094000100b000e03291d24a0094e00301aa010100d021a01391a2008052084b0014fd7bbea9f30b00f9BBBBL4;FF0001158bdeea0194a8021b0be83f0439e08749adf8c30891e25", - "7c03d08030291e1031f2ae83f00f908108052e08716ade08747ade2bf803df47f41f9f57b41f9L4;FB704d4200000000000000000000000000080000000000000008000000000000009c54420000000000000000000000000008000000000000000800000000000000L8;FFe10316aae20314aa230080522", - "400805284010094760a40f9afffff17fd7bbca9f70b00f9f65702a9f44f03a9fd030091f30301aa210840f9f40300aa680240f9BL8;FFe00317aae10316aa22008052d46a01940300001408008092686e00a998d5ffb4e00319aae10318aaeaffff17a0e300d1a8ab3ca9f4470094faab48a9e00315aaL8;", - "FFf503012a74040051e00313aad7070094e80300aae00301aa28fc073708fc60d3c80100b5080840921f1900f102020054017c0353210200341f1100f160020054BBBL4;FFc7830094b7c35e38ff0a00712101005408008092680200f9f44f47a9f72b40f9f65746a9fd7b44a9ff030291c0035fd6a0d3de", - "3ce007803dc5aa019480048052L4;FF08e90eaaeb030d2a0d0045924b210baa0a0149b20e054ab24a11889ace11889a1f0046f24a018e9abf0100f10df07cd30a018a9a6e018b9a9f0500710a118a9aL8;FF0a000014e0e3009142008052230080522400805283c1ff97e00744a9f3ffff17f5e703a9ff27", - "00f9f50b40f9e80340f9bf0208eb01faff54e00300915caa0094BL8;FFf43f42f9e8a3113929008092f53b42f9690200f9880240f9680000b4e00315aa00013fd6810640f9810000b4820a40f9e00315aaca2a0194e863019100610c91L8;FFe80356b9e00740918100805200001891ff0316b9e81b00b90", - "52a0094e80356b9e00740918100805200001891ff0316b9e81700b9fe290094e80356b9e0074091BBBBBBL4;FFff030191c0035fd61f0500f141010054e80741b2e0030091e80300f9c1080194e10300aa20008052fd7b43a9ff030191c0035fd62a05c0392b0900910d0900d1L4;FF08c5ff97e07301b9a", - "04700d105c5ff97e06b01b9a04700d102c5ff97e06701b9a04700d1ffc4ff97e05b01b9a04700d1fcc4ff97e05301b9a04700d1f9c4ff97L8;FFff0301d1fd7b02a9f31b00f9fd830091f30308aae82300911d020094e86340391ffd0371e0000054c8008052680200b9fd7b42a9f31b40f9ff030191c003", - "5fd6BBL4;FF8826089be94f40f939000014eb230091ea430091200300d000b83191eba305a9a86301d1e8a706a9a8a300d1290000b029911e914a017db2e1630191e8a707a9L4;ZDL8;FF840100d084e02791e0230091a32300d122018052a8831ff81e930094940100d09462099168c20091610100f0218", - "01a91a32300d1a2018052e40314aaa8831ff8BBBL4;FF0800f0f2080900d1680200f9f44f5ba9f6575aa9f85f59a9fa6758a9fc6f57a9fd7b56a9ff030791c0035fd6b58356f8f95340f997fcffb5e9ffff17e01740f9L4;FB3467c2194145b101b272badecbcf9b0927aee05f00005aedbd5f63735b067e", - "4f7d61091d8803527d77e95368b53f0b692940209bdb7f55641688e892f1fe0036L8;FFeba71ca9eb0302aae98b40f9f91b00f9f9031eaaf20b00f9f20307aae7af40f9e9b700f9e9c740f9edfb48a9e8ab18a9ea5340f9e22f40f9e98b00f969018052BL8;FF4064ff5481620391e2431691400080523d1", - "000941dfbff17e8031faa000119ab224e0054e1431691790c0094f90b40f91f0700b1c00e0054e1d342f9e8cb42f9L8;FFe063813d01c18d3cc80080d20800f0f21c190091e14b41f9810000b4e04f41f922008052ce520094e89f40f91f0500b1600000546063029129edff97f3db52a9BBBBL4;FF09000", - "014a0831cf8e10300f021f42691e30300f063182891a0e300d1620180526400805201e80094a0835cf8afffff17a0e300d1a8ab3ca9f3cf0094e81345b8L4;FBb9000000050000009a964800000000003300000000000000e5000000050000009a964800000000003300000000000000ed00000005000000", - "7265757365642062L8;FF080900d18affff17e80b41b2e00700f907000014e90b41b2e92300a98cffff17c80080d20800f0f2080500d1e80300f9e0030091bbe8ff97e10300aae10300f9BL8;FFf50301aae88b00f908730194e0c30291a102178be20314aaf4bf0339d8720194e00747ada8c302d1e243c", - "03df58b40f914010191e1031f2aa0073cade10f46adL8;FF81ffffb4c00240f922008052d4720094f8ffff17e17749f93f0800b1e0adff543f0400b1a0adff54810000b4e07b49f922008052ca720094e18349f9e1acffb4BBBL4;FFf85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6b5537ba9bf0a00b1", - "40feff54a0637da9bf0600b1b9077ca9bb8312f860f9ff54e00708a9a06303d1b79bff97L4;ZBL8;FFc86a40b9c93200f91f050031e0160054090500119f02096b09050054c10a44a9e0230091e30315aabbfcff97c86a40b90901172b021600543f01146b63feff54BL8;FFffeb05f9f6ef05f91f7f0aa9", - "1fff0ba9f6fb05f9e80706f9ff0b06f9fa0f06f901430291a22302d170edff9760dcffb46700001420dcff54c8010014e0dbff54L8;FFe04305f9e0032a91e10000b02128019142028052e30000b063700191440180520228ff97e14345f906000014e80f41b2e0032a91e84305f9ba28ff97e10300aaBBB", - "BBL4;FF692202a908038052e90741b20000803d602201a9692200a9f30b40f9fd7bc2a8c0035fd62000805201038052d9020294fd7bbea9f30b00f9fd030091f30300aaL4;FFe00745ade1430c91e86340f9ea8b40f902288052e94f40f9ebdb40f92083823ce083cc3c2183833ce183cd3ce8af01f9e877", - "40f9e0071bade082c83ce182c73cL8;FFc0035fd6fd7bbda9f65701a9f44f02a9fd030091140040f9f30300aa9f0600b140020054610e40f93f0400b140010054810000b4601240f922008052c8020194BL8;FFe3430091f3820194fd7b43a9ff030191c0035fd6e00700f9200440a9e8230091090000b02", - "9f11a91e82701a9020300d0428c1091e3430091e6820194fd7b43a9L8;FF23830094410100f021d01391640100d084401a91e0030091a363009142008052b30f00f91b83009468a20191410100f021901c91640100d084e00891a3630091BBBL4;FFf44f41a9fd7bc2a8022b8052dcc20114fd7bbca9f85f", - "01a9f65702a9f44f03a9fd030091150840f9f60301aa3f0015eba204005408038052f30300aa090440f9L4;FB020100002e000000e4674900000000006a00000000000000440100001c000000e4674900000000006a00000000000000090100002e000000e467490000000000L8;FFe2031caae05f00f9dd", - "c200940300001428008052e85f00f9e8db41f9ead341f9e9df41f9e82300f9e8cf41f9f50309aaeaa30da9e8c741f9e85b00f9d70000b4BL8;FF48060054680640f9e10315aae20314aa0001168bda420194c802148b680a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6e8031faa74f7ffb5e003", - "08abL8;FF5f0b00b141d6ff54f3feff178083c03ce8430f91000d803d888341f8e9035039e80b02f9e8430691a9090034e90310916affff904ab139911a0380d200010090BBBBL4;FF1f0400b141fdff54e043059181008052f8e20194c0e50035e85341b9e8cf00b957ffdfc8d70200b4ff0600b1000300", - "54f843059199008052e00318aae10319aaL4;FB50010000090000006d697373696e672072656d6f7465206964656e74697479206b657900000000003de84800000000004d000000000000005f0300001c000000L8;FF000200f000340b91e8432d91e1431e91e9cf03f901e30094e8ab45f91f0500b1a138", - "0054f95b4bb9b9031db8480200f008b140f91f0d00f1c3020054a8c300d1BL8;FFd36201940003805201018052d1620194000100b4e10200d021603a91144c00a91f400039f44f41a9fd7bc2a8c0035fd60001805201038052e1620194fd7bbda9L8;FF3f004871030b00544b0dc0396c1d00122c540c0b8", - "10148516b00f8378b0080523a0000142b7c1c534b0a00344d11c0390b00be522b000b0bac1d00128d00f837BBBL4;FF160080923b0080524c000014c2290094fb6b44a97f0700b100170054e9e345a9e083c73ceae746a9e183c83ce86340f9fcdb49a9e00701adf7834ca9ea2301a9L4;FF231000330320", - "003975424079601a40b9610640f9b54e14124200152a00040051601a00b962420079411d00b4000080d21f000039007d20d461400d9163c00d91L8;FFa40100d084401e91e323009182008052e80700f914a30094fd7b41a9ff830091c0035fd6810100f021bc14918200805209a30014080040f9e00301a", - "a090140f9BL8;FFe4220194ffc300d1fd7b02a9fd830091480200b00871039109200091e02301a9800200b000e00191820200b042800d91e1030091e92300a9d7220194ff0301d1BL4;FFf44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091f30300aabdffff9774d645a9350", - "200b49682009104000014b50600f1d6c20091L3;ZBBBBBBBBBL4;FFf70f00f9170b00b4a00240fdfc0f40f9fa031faa1b0c8052f80315aa0088202e0800669e17c10192f70000b5008f40fc5a2300910088202e0800669e17c101f2L4;FFe9634039fb7303f8f6f303f8e87304f8e93f01398ef7fe97f703", - "002a15000014f5031baae81340f9e9a34039ea9342b8eb2f40b9e80b00f9e9630039aa1b00b9L8;FF180319ebc3020054680219ebb502198bf333889a954e00a9985a01a9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd60001805201058052e01c0194BBL4;FF1a1740d217140038d39c0194", - "5f1f00f1a8010054e08744ad80020191a14301d122008052a0873dade08b45ada08b3eadfe9c019400e4006fff6300f9e08304adL4;FFfd030091017c4093e20304aa060080d2050080d2040080d2e00780d2e0ffff97fd7bc1a8aef5ff17fd7bbfa9e40301aae30302aafd030091017c4093e20304aaL8;", - "FFe3430091e82701a9f29c0094fd7b42a9ffc30091c0035fd6a80100b008310b91e00301aae10308aa620280520a9d0014080040f9e00301aa080140391f050071BBBL4;FF832600541803008b060000141f0400b101260054f5dc01941f1000318125005439feffb505000014e043059181008052f0dc01", - "94c0240035e85341b9e80f00b9L4;FB757365206054696d657374616d703a3a746f5f756e6978282960000000000000eb084900000000004d00000000000000ba000000090000000000000000000000L8;FF09bc40f9e95700f909c040f9e96f00f909c440f9e95f00f909c840f9e9e300f909dc59a9e95b", - "00f909d440f9e93f00f909d840f9e9f300f909dc40f9e93300f9BL8;FFe8074091f69b45f90023009108810991749d0094e1074091e0431691026e805221800991d65c0194e077c53de17bc53d58008052e8e36b799400805215008092L8;FFf30301aa210840f9f40300aa680240f91f0101eb600e00546", - "80640f92a040091e00314aa490180526a0a00f90969213863140094e10313aa5dfaff97803e40f9BBBBL4;FFfd430091ff0311d1ff0300f909404039490e0037150040f9f40308aaf30300aaa80e40f9680700b4770640f9a00642a9e20317aa1df8ff9708fc79d3e1e7076fL4;ZFL8;FFccffff171f0800", - "f1010d0054e1230091e20313aaffdf00a9ff0f00f9a8fbff97600d00b5990a40f9880240f93f0308eb61000054e00314aa5dfc0094880640f9BL8;FF2103009021a43791e00308aae2018052fd7b42a9ffc300910f7d0114092000912103009021943491040300d084e01291a9831ff87c00001409800091", - "21030090L8;FFe00316aaea1700f909692138e1630091207dff97f81740f9e80f40f9080118cbdf0208eb48420054e81340f9e10317aae20316aa0001188bd17c00940803168bBBBL4;FF010340f9390080399900f8b728040091490400d1110000145f2800f1880000542800028b08f1df380809f837a00", - "301d164260094a8035cb8a8160037880a40f9L4;FB6b65796f6e652d74696d652d7072652d6b657962756e646c6566696c6520636f756c64206e6f7420626520726561646d616c666f726d65642066696c65000000L8;FF21f18f3c00844cade8c701f9e8a7089100f18f3c00884dade8e70891e02300910", - "1f18f3ce867099102f18f3ce827099100f18f3cd2bc009468e20791e0230091BL8;FF200108ab22010054fd7bc1a8c0035fd6e8031faa091c40f93f0500b121faff54e00308ab23ffff54a00200f000602391ce3c0194e8031faa090840f929f5ffb5L8;FF696e00f9080d40f900013fd6606601f9616a01", - "f9290c40f9e8430f91e1031baaf5430f9120013fd6f7eb41f9ff0e00b1e104005448008092880200f968008052BBBBBL4;FF39440094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faad90c0294e00741a9d70c0294fd7bbba9f90b00f9L4;FFf8db40f", - "9e0830c9126ebff97e1cf40f9e16affb4e0cb40f922008052d00c009453fbff172000805281008052d90c009420008052c1018052d60c009420008052L8;FF1f1d0071010e0054202040a96102009021303b91030d40f9e2018052fd7b45a9ff83019160001fd61f050071cc020054e8060035080440b909", - "0440f962020090BL8;FFfd430091090040f9e80301aa2a0140f95f0500b1e903899ae90300f9c0010054e9030091210300d0218029914403009084202291e3230091e00308aa82008052L8;FFc0035fd6800100b000a03191d78c0094800100b000c01a91d48c0094600100d000c01291d18c0094ff8300d", - "1fd7b01a9fd430091e0130079e0230091a1c31f78BBBL4;FF00c03991d9cc0194a00300d000c01c91d6cc0194fd7bbca9fc5f01a9f65702a9f44f03a9fd030091ff0308d1f60300aaf30308aaa8c302d1e00302aa07a60094L4;FB756c6420626520636f7272656374000030214900000000005800000000", - "000000a00000002a00000030214900000000005800000000000000a600000022000000L8;FF0a9840b95f010971604700541f0500b1c07d0054ffcaff975c008052c00400146183c93c6283ca3c6083c43c6383c83ce107813d6183c53ce20b813d6283c73cBL8;FFf87f00f9eaa30ea9e89341f98082823", - "ce8bf00f972ffff17c80200d008a13e9189028052e86301f9e96701f9f2feff172143c23c2007c03dfc430f912283c33cL8;FF0825019108fd46d308050091092440f93f0500b1400400540a2c40f9093840f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091BBBBL4;FFe", - "00313aae80f00f9e6d8ff97f90f40f9f80740f9080319cb7f0208eb880f0054f70b40f9e10314aae20313aae002198bd3ec01943903138bf90f00f9f50200b5L4;FB7456657273696f6e556e7265636f676e697a65644369706865727465787456657273696f6e556e7265636f676e697a65644d65737361", - "676556657273696f6e4eL8;FFfd7bc3a8c0035fd6e00313aa22008052230080522400805282030094610a40f9d8ffff17e00313aa2200805223008052240080527b030094610a40f9e6ffff17BL8;FFb70216cb35210091e00702adff0214ebe8ff06a9c2040054170a00b4f85344a91f0314eb00050054c", - "8e279d3f9031faafb0600d11a1116cbe10318aaa0c301d1L8;FFfad342f9fc0740919c83019144feff17e043169122008052ba100094e1d342f94efeff17e0431691e1031aaae20318aab4100094fad342f9e8cb42f908011acbBBBL4;FF807240f922008052d5ac0194800203918694ff97080180528022", - "0191955a09a99f220ca908048052955e0aa9985e0ba99f220da999220ea99cf200b94e94ff97L4;FF29140033c20000542a7c0653090500394a051a320a01003912000014eb0f80122c7c10532b2c0633ec0000352a7c0c530b050039090900394a091b320a010039L8;FFf59f01f9f5ab01f9ffaf01f914", - "67179b9c0a40f91c2a003788ff7ed3282700b5fa0301aa5c0700b497fb7fd3c8ac0094e00317aa41008052c6ac0094602600b4BL8;FF02f18f3ce803169122b7803d6001803dea5301f9e95f01f97b53ff97e80356391f050071400c0054282340b8e90f4b79eacf42f9eb075639ec434b79e86b08b9L8;F", - "F683d0a91eb435d39e90b03b9c9fe0a911a6d00a9fb0308aa197101a9e8a743f9400540ad785702a9280100f9e83f40f9e9620991eb1f0d39e0fb833d400941adBBBBBBL4;FFf44f08a9fd430191081c0012f30301aa1f090071a1010054570040f9e80640f9280200b4e10240f9340080391402f8b72904", - "0091080500d1e92200a91f0114ebL4;FFf603192aee03082af003182ab4070014e02bc13de12fc13da40000d084e02a91e233c13de86b02f94083803ce01bc13da60000d0c6802b914183813ce11fc13dL8;FF1a0000143f0d007101030054a80240391fed0171410e0054e12700b40a00018be9030aaa28", - "fddf382822f836e9030aaa2beddf387f0101318a200054e9030aaaBBL4;FF894a4039ea8b4039e88700394801094a894e4039ea8f4039e88b00394801094a89524039ea934039e88f00394801094a89564039ea974039e89300394801094aL4;ZBL8;FF0825019109fd46d30800098b080500911f0109eb8", - "80b00546d000014f30300aa12f1ff97e80300aae00313aa090140b22911c0da291540d2290d098b29250191BBBL4;FF2800028b08f1df38e818f837e08300916c3e0094e82340b9a8410037e81b40f9aa0640f9490108eba3500054aa0240f9e01740f94801088ba82600a9a88355f8L4;FB982049000000", - "00004900000000000000950000000d000000982049000000000049000000000000009d0000003000000098204900000000004900000000000000L8;FFe9a309a9e8e743f9e9eb43f9e8df00f9e8ef43f9e8af15a9e8f743f9eb3b44f9e9a310a9e8fb43f9e90744f9e8b700f9e8ff43f9eaa318a9e80344f", - "9ea0b44f9BL8;FFe8cf42f92a040091c02202914901805209692138ead302f91b180094e14316917b0e0094e08f49f9800100b4e1d342f9e8cb42f91f0101ebe0840054e8cf42f9L8;FF022b8052de540094e1fb42f9f39b45f93f0400b100010054810000b4e0ff42f922008052ce540094e8c317910081", - "00912befff97a80359f8a003d83ce1833291BBBBL4;FFf40301aae10302aaf30303aa90cf009400010034808640a9e8330091c0cd0094f5334039bf0a0071e1000054e0031f2af44f44a9f65743a9fd7b42a9ff430191L4;FBd5934800000000004d000000000000005f0300001c00000024954800000000", - "005b000000000000008d0000001100000073657373696f6e5f76657273696f6e72L8;FFe00301aaf44f47a9f92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd637008052180080921901805206000014e20313aa430c80522feeff97e10300aaBL8;FFe00309aae20080522175019468220191010", - "3009021402891040300f084201791e0030091a3630091c2008052a80f00f9187501940103009021582891040300f0L8;FF290d098b2925019129fd46d32905009102000014e9031faaf88b92b9380100340a0340b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a05009102000014BBBL4;FF896b28", - "380805001171ffff17f44f5ea9f6575da9f85f5ca9fa675ba9fc6f5aa9fd7b59a9ffc30791c0035fd6800300d000e00691cdb40194ffc306d1fd7b15a9L4;ZDL8;FFe0c20191b8835df8140200b49f0600b1c1000054f91b40f9f40740f9f3031f2afb031faa3a000014e00313aae10314aa22008052f303", - "0caac9b40094ab835ff8BL8;FFe82303f9c8048052a934c0f2ea2703f90a078052e07f823dfffb02f9e80303f9ff0703f9ea0f03f9e81b03f9e91f03f9d7340194e1fb44f9810000b4e0ff44f9L8;FF082300b5c00a40921f1800f142230054c17e035361230034280400511f39007128080054eb0000b06", - "b711f91890000106a69683829090a8b20011fd6e03400b5BBBBBL4;FF6082823c695201a9f44f4ba9f74b40f9f6574aa9fd7b48a9ff030391c0035fd6a0835df8ddffff17a0031df82104009021dc2c9123040090638c2d91a0c300d1L4;FFa10200ada20a803db45200b9f44f49a9f73b40f9f65748a9fd", - "7b46a9ff830291c0035fd620008052e10313aad9040094fd7bbaa9fc6f01a9fa6702a9f85f03a9L8;FFc00240f922008052d5040194f8ffff1714f3ffb48806148be00313aa01f17dd302018052f44f42a9f65741a9fd7bc3a8cb04011400200091f44f42a9f65741a9BL8;FF012440f9f30300aa1f0800f", - "91f1400f93f0400f18b000054602a40f922008052cf84019468d243a9090080927f2604a9740300b413c1009104000014940600f1L8;FFe8b740f91f0500f1ab000054e0bb40f901f97fd342008052d1840094e8c340f91f0500f1ab000054e0c740f901f97fd342008052ca840094e8cf40f91f0500f1BB", - "BL4;FFf85f43a9fa6742a9fc6f41a9fd7bc6a8d3c40114f60308ab83ebff54a00300f000600691d1c40194ff030791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L4;FB747275637475726570726576696f75735f636f756e74657270715f726174636865745f7374617465496e76616c69645075626", - "c69634b6579436861696e73656eL8;FFd7c40094ed1b40f9ee6740f98dcdffb56ffeff17fa031faabcfcff1737008052fc7740f97c0500b4c9c40094e0031caa21008052c7c40094005900b4e10319aaBL8;FF41180054e00313aaf0fdff97e0080036811400b5e0031faa9effff17680240f9080540f919", - "0101eb031e0054680240f9080540f91f0119eb690d0054e00313aaL8;FFf65704a9f44f05a9fd030091ff0316d1f30300aae8430691e00301aaff0300f9fa03062af803052af60304aaf90303aae21b00f9f50301aab70302d1f4030591BBBBL4;FFe20316aad8e40194e8e279d3a102168b021117cb2b00", - "0014090e80524804099b6004099b89e079d3221104cbe10308aaf44f44a9f90b40f9f65743a9f85f42a9L4;FB65722f7472616974732f616363756d2e7273001a73657373696f6e20737461746520636f727275707420666f7220c0023a20c0002f636172676f2d7461726765L8;FF29e40094680640f918", - "693538d5220091750a00f9b4f7ffb6680240f9bf0208eb61000054e00313aa1fe40094680640f93400805217693538d5260091750a00f9BL8;FFe94340b909f90737f77f04a9c6ffff17e96b40b949000037f73700f9c1b20091a20301d1e003082aa74fff9760f8ffb470000014a20301d1e003082a830c", - "8052L8;FF810000b4602240f922008052d464009460620191f30b40f9fd7bc2a85efeff1761ce40f9810000b460d240f922008052cb64009461da40f9810300b460de40f9BBBL4;FFe80740f9080116cb9f0208ebc8070054e80b40f9e10315aae20314aa0001168bd7a40194c802148be80f00f9e083c03", - "ce80f40f9290080926082803c680e00f9L4;FF1f000039007d20d4c0035fd6fd7bbba9fd030091f35301a9340000b080021091000840b92002003481021091330840f9d31100b4600640f97f0200eb60050054L8;FF4a0d0a8b4a25019129194a8b29050091280108abc2010054092040f9090100b42a014", - "0b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108abBL8;FF69224039f503002a1f01096be0179f1aed2401948826403969264039b502000a1f01096be0179f1ae7240194882a4039692a4039b502000a1f01096be0179f1aL8;FFe003019102250094ff431391f44f45a9f65744a9f8", - "5f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd62000805201088052e3240094fd7bbaa9fb0b00f9fa6702a9BBBBBBBL4;FF090540f9340000145f2800f1880000542800028b08f1df38c808f837e003009168820094e80340b9c8020036e00740f9f44f45a9f65744a9fd7b43a9ff830191L4;FF5a0e0094f", - "56f44a9f95b45a9bf0a00b1c1070054600640f9fbe702a9f61f00f9bcc31fb806f1fe97f70300aaf50301aaa81300d189008052e00705a9a08300d1L8;FFf96300a9a8730039f2180194a0000035d60600f1c1feff54e0031f2a0200001420008052f44f45a9f91340f9f65744a9f85f43a9fd7b41a9ff83", - "0191c0035fd6BBL4;FF6443c33c6543c23ce0630491e86300b96043c43cf7030091e8b300b9a8a64439f663049169c301f8090480526143c53c1f010071e80303916243c03ce8a711a9L4;ZFL8;FFab431638ab735638a9531638a98356384a01084a6b01084aaa631638aa9356382901084aab731638aba", - "35638a9831638a9b356384a01084a6b01084aaa931638BBBL4;FFe00315aae10318aae2d80194f80600b4f60300aaced80194e00318aa2100805235008052cbd80194c0feffb4e10316aae20318aaf90300aad1d80194e00316aaL4;FB6b2e726563762065706f636820c0223a2043743152656365697665", - "64202d3e20456b53656e744374315265636569766564001b737071722076312e73656e645fL8;FFe8d702f9e88340f9e8e302f9e87740f90329009135290094e8a343f9eab343f9e0030991e9ab43f9ebcb43f981e20791e84700f9e8a743f9022f8052e04bc23dBL8;FF280080525f0700b1ffcb02f9e8c", - "f02f9ffd302f980100054e0431691e1031faa22008052cf180094e8d342f9e0cf42f9490180520968283808050091fa3b49f9L8;FFfaeb05f9ffe705f9a88317f88a1000b5e0c327910163009102288052d8580094e0c32291e1c3279102288052d4580094e0c31d91e1c3229102288052d0580094BBBBL4", - ";FFf50301aad2f801940002805201018052d0f80194e00400b4c8c20391e10315aa1f200039080000f92804009008a12b9160a200a9090d40f9e803009120013fd6L4;FB002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f686b", - "64662d302e31332e302f7372L8;FFe08743ade00314aaa0873bade08b44ada08b3cade18341ada18339ade28342ada2833aade18340ada18338ad8af3ff97a0877bade80741b28082863c8182873cBL8;FF428f40f8821000b4810340f9380080399800f8b728040091490400d1110000145f2800f188000", - "0542800028b08f1df38880ef837a00301d162e2ff97a8035cb8L8;FFf407409194820991f2bbff97e1074091e0431691023f805221800991d878009488e2079178008052b4008052000540ade8f3687915008092e8e30a79e057813dBBBL4;FFa06301d1e10314aae30317aa0401805205098052e2031aaa", - "33f0ff97a8835af81f0500f160020054a8035bf8f31745a9fa2f40b9e30314aaff0214ebf7a308a9L4;ZBL8;FF6016803de03bc13dff4b02f96082863ca003d43cff0f01f96022803de027c13dff0b01f96082893ce087c03dbfff3ca9682600a988f247f8a9e300d1602e803dBL8;FF0a0500390b010039", - "a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091150840f9080040f9f40302aaL8;FF690100f968c25339693642f9e00600ad22210391400941ade00a01ad010341ad020f40ade843103968620f917fc61339810301ad6032c13d6136c13d820", - "f00adBBBBBL4;FF28020036e90b40f923000014f503042af70303aaf60300aa5f2800f1880000542800028b08f1df38e82df837e023009164720094e80b40b9280e0036e90b40f9L4;FFe20315aaf60300aadd080094e0030091e10315aa220080522300805224008052f55b00a9f50b00f9b2e9ff97e9a3", - "40a9ca05805281624039e06300912a692838L8;FFe92b01a905090194fd7b42a9ffc30091c0035fd6e10300aaa00280527cfdff17080080b928010034080140b20811c0da081540d2080d088b0825019108fd46d3BL8;FFe1031baa22008052d58801943f0700f1ab000054e03340f9e10319aa22008052c", - "f880194df0600f12b010054e02f40f9e10316aa22008052c988019404000014L8;FF7f0214ebe3feff54e84b41f9d77a73789f0208eb20010054e84f41f91779347894060091f45301f9b50a00f17306009181feff54c8feff17e0430a9155d2ff97BBBL4;FFfd7b42a9ff030191c0035fd6e00741a9e0c8", - "0194ff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091040180520504805229f87fd3L4;FB8e194900000000005700000000000000b2030000330000008e194900000000005700000000000000c50300004e000000616c726561647920636f6d7075746564L8;FF390700f17b", - "630091e000005461835ff881ffffb4600340f922008052d0c80094f8ffff17d60000b4c806168be00314aa0201805201f17dd3c9c80094fcde78b3BL8;FF810000b4600a40f922008052d4480194611240f9810000b4601640f922008052cf48019460020191f30b40f9fd7bc2a871feff17610640f98100", - "00b4600a40f9L8;FF4a0d0a8b4a2501914afd46d34a05009111000014e9031faa10000014f5031faa681a40f948f6ffb5f6031faa770a40f917f7ffb5e80317ab23f9ff54000100b0BBBBL4;FFe8234039e8010036e80300d008212b914903805204000014e80300d008892b916902805268a600a9280080", - "5268020039fd7b43a9f32340f9ff430191c0035fd6L4;FB000000000000000008000000000000000800000000000000704d420000000000e41f40000000000010000000000000000800000000000000b87b400000000000L8;FF0900809268220039690200f9fd7b47a9f34340f9ff430291c0035fd6e803", - "1f2a6822003908008092680200f9fd7b47a9f34340f9ff430291c0035fd641a040a9BL8;FF290d098b2925019129fd46d32905009102000014e9031faa280108ab42020054090040f93f0500b1a0010054090840f92a0140b24a11c0da4a1540d24a0d0a8bL8;FF80c38d3c800fc03d821f803d4047803d8", - "01fc03df81f00b98043813c00e4006fa80319b889430df8aa0312b8a8c313b8828707adeb1300b9ebe303b9200300adBBBL4;FFa0e300d1e40314aae5031aaae60319aaacfcff97a8d37ca91f0900b121060054a1035bf8280019cb1f1d00f1292000543c230091546b39f83f001cebe9000054L4;FF0902", - "8052936a29f8880200f9f44f41a9fd7bc2a8c0035fd6c0035fd6fd7ba7a9022680d2e4830191fd030091f35301a9f30300aaf40301aae00304aa01008052L8;FF01000014fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4309d1f70302aae20301aae10300aae0830091fa0307a", - "af60306aaf90305aaBL8;FFe8830c9176fc4039000440ade0430091f50302aaf30303aac17e0753e08700ad34290194e89341f91f0500f1611f0054f7830c91e8c30591e0c30091e082c63cL8;FFe00240f922008052d5280094f8ffff17e89740f9c80000b40805088be00314aa0201805201f17dd3cd28", - "00945f0f00b1616bff5448008092680200f95bfbff17BBBBBBL4;FFad0100543f0c0071a00200543f100071200300543f1400716104005421230191e20313aa99faff97a02d00b5f7031faad1ffff173f040071a00200543f080071L4;FFe07301b9a04700d106c3ff97e06b01b9a04700d103c3ff97e067", - "01b9a04700d100c3ff97e05b01b9a04700d1fdc2ff97e05301b9a04700d1fac2ff97e04b01b9L8;FF290c40f9e81b00b9282040b9e1230091e9c301f8e82700b980ffff97a8c35e381f05007141020054a0d3de3ce81f80526002803d68420039f44f45a9fd7b44a9BBL4;FF0104805222008052a802168b", - "000500add390019400e4006fe0830091c4820091e1031faae30315aae0b6843de0b2843de0ae843de0aa843de0a6843de0a2843dL4;ZDL8;FF688e46f81f0500b160000054e00313aa9c8cff97740200f9f44f41a9fd7bc2a8c0035fd6fd7bbfa9fd030091083040f9080100b4080140b20811c0da081540", - "d2BBBL4;FF3f0114ebe933949a297d0c9b696969b83f01086b8907009100f0ff54df0209eb6bc10191fc0309aaa1feff54fc0316aa7f0600b160090054f90313aa9f1700f1L4;FBe06ce3416cbdbebdd9af5166a96b0879a741e7598a03cada0ad6260c58b75a2e324b9da1092fa9fc8163907995cfa28c3", - "613a54c0000c8ca3ded5182ea32be21L8;FF0a2549a9e9af00f9095140f9e9c700f9095540f9eaa710a90a254ba9eab700f9e9cb00f90a254ca9eaeb00f9e99b00f90a254da9e98f00f9097140f9e92b14a9BL8;FFe20318aad7100094fad342f9fc0740919c8301913ffeff17e043169122008052d01000", - "94e1d342f948feff17e0431691e1031aaae20318aaca100094fad342f9L8;FF57000014f5c742f9f7cb42f99b0280d21b00f0f2e8a75139e8060036e14741f9a10600b4e04b41f922008052cc500094ffa71139e89740f91f0500b141060054BBBBL4;FFdf0600b1000400ad4002005415074da91ce749a9", - "1adf4aa90bef4ba9280400d11f0d00b1086740f968020054e88300a9087340f922008052f4030baae00308aaL4;FB6f6c3a3a73746174653a3a73657373696f6e000000000000729848000000000033000000000000006c0100002a000000696e76616c6964207265636569766572L8;FF080c00b5080840", - "921f1900f1420c0054017c0353610c00343f040071000200543f08007161030054890240f93f0500b1810000549f6600a99f7e01a99f020238BL8;FFfd7bc5a8c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aae10200f021883791e8030091e00309aae20180521671019468620091", - "e10200f0L8;FFc0220291e14316919411009407fdff1780c20291e32a0094080040b20811c0da081540d2080d088b0825019108fd46d30900088b390500913f0308ebc9130054BBBL4;FF880700d11f0d00b1c9000054930200360a000014880700d11f0d00b188ffff54e0030baae1031caa22008052ccb", - "00194e00748a953010036e82747a93f0900f1L4;ZBL8;FFe20f00f95f0008ebe1230054a00640adf80302aaa20ac03da81a40f9f30300aae0630191a1e2009102328052f40303aae00701adf6430e91e213803de82b00f9BL8;FF4167ff547bfbff1728008052e80b00f9f9d740f9e98b42b9e88f42b9fb2", - "300f9e9230729b968ffb579fbff17e02fc13de133c13da102009021d80591e237c13dL8;FF810000b4e0ef43f922008052d4300094a8b240f9280700b4e1e341f9e2e741f9e8032a91e0cb41f9e34b40f9e45340f93d92fe97fc4345f9e082c03ce9032a91BBBBBL4;FFc00300b4e10319aae20317aaf803", - "00aadb000294050000143500805217035ff877feffb538008052e80316aa885600a928008052965e01a9985e02a99a3200b9L4;FF1f290071282080522831889ac8aa073715fd60d3bf9601f1eb279f1a53fdff170001805201088052da000094fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9L8;FFb9", - "dfff97f42344a91f0114ebe3100054e81f40f9e10315aae20317aa0001148bd7000194e90344a9080009eb230f0054ff0208eb68080054340117ab020f0054BL8;FFb50f00f9b506009119810194940600f121ffff54e003009116810194f44f43a9f51340f9fd7b41a9ff030191c0035fd6080040f90025", - "40a9220d40f940001fd6L8;FF08250191281b488b08050091982680b978070034090340b22911c0da291540d2290d098b2925019129fd46d329050091972a80b9b7060034ea0240b24a11c0daBBBL4;FF29a13f91680200f928038052692202a9f44f47a9f72b40f9f65746a9fd7b44a9ff030291c0035fd", - "6e8a341b8e93f4079eb674039ec734079a81b00b9e8ab42a9L4;FB206f6e652d74696d65207072656b65790076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f6b656d2e7273002163616e6eL8;FFf5830291dec00094800ac03d8182c03ce0431091881a40f9890e4", - "0f9a1e20091f46b40f98083813ca103963ca88318f8a90317f85f170094a00b7bad480080d2BL8;FF22008052d7000094610a40f9c3ffff17e00313aae10316aae20315aad1000094760a40f9680240f9080116cbbf0208ebe9f8ff54e00313aae10316aae20315aaL8;FFf65741a9fd7bc3a8d5400014f4", - "4f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aa810000b4600640f922008052BBBBL4;FFe0023fd61f0000f1cd000054390300eb03a600541803008bf9feffb50f0000141f0400b161a50054f0e001941f100031e1a40054f9ffff17ede00194f70300aaL", - "4;FBddfb480000000000e6fb480000000000000000000000000008000000000000000800000000000000c8e943000000000000000000000000000000000000000000L8;FFdfe000940500001435008052f61640f976feffb537008052935600a9935a01a9975a02a9f44f43a9f65742a9f85f41a9fd7bc4a", - "8c0035fd620008052e10313aaBL8;FFb3831ff82361019468620091c10200f021b42f91a32300d162018052e40314aaa8831ff81b61019468c20091c10200f021b42391a32300d122018052e40314aaL8;FF211300343f0800718d0100543f0c0071600200543f100071c00200543f14007141040054c122", - "0191e20313aaf1fcff97600300b4e00000143f04007140020054BBBL4;FF097dd59b28a10a9be90f40f9e9a301a9a8df3ea9efa00194600800378852403989564039410300f021203e918a5a40398b72417808bd70d3e083c03c420300f0L4;FF21010034226c1c53e303801203d01f3801e01f7800c0228", - "b1fc01f38c20a40f942400091020002cbe11e001201d01f38c30000cb42fc44d302e01f787400146bL8;FFa8831ff823a10094810100f021441991a40100d084403091a32300d162008052b4831ff81ba1009488820091810100f021641c91a40100d084801491a32300d1BL8;FF680a00f93f000014c80d", - "0036970e40f9570100b4ff2a00b1a8120054e82600911f0101f1a2120054290080522821c89a1f0115eb1581959a3511f8b7750900b4BL4;FF770a40f9680240f9080117cb9f0208eb69fbff54e00313aae10317aae20314aa2300805224008052b2010094770a40f9680240f9080117cb9f0208eb29faff", - "54L3;ZB" + "BBBBBBBBBL8;FB0090460000000000045d000000000000045d0000000000000000010000000000010000000600000000f006000000000000f046000000000000f0460000000000L8;FF42202a9121088052eea0009420feff9000602e91f9a0009420feff9000c02e91f6a0009420feff9000a02d91f6a00", + "09420feff9000e02a91f0a0009420008052BL8;FF3f0400f18b000054609a40f92200805249250194613240f9810000b4603640f92200805244250194613e40f9e10000b4604240f922008052f44f42a9f65741a9L8;FF630800544d19c039ae1d00128c390e0b8c1140518d00f83761710c8beb0080521e", + "0000149f014871830700544d1dc039ae1d00128c550e0b8c0148518d00f837BBL8;FFeb600194fd7bbea9f44f01a9fd030091017c40f9f30300aa3f0400f18b000054608240f92200805243650194619640f914008092747e00f93f0400f18b000054L8;FF85fdff97e80301aa80000036880e00b5e1031f", + "aae1ffff17e1031faa886200b9deffff17811c0054e0031faa2cffff1720ebff54c80080d20800f0f208090091BL8;FFa80640f9160100eb62020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e0030091a6ebff97f44f47a9f65746a9L8;FD00000000000", + "00000000000000000000028004700000000000000000000000000ace546000000000044a0460000000000386f4600000000000000000000000000BBBL8;FB7468496e76616c69644f75747075744c656e677468496e73756666696369656e7452616e646f6d6e657373000000000042024000000000006a0", + "0000000000000L8;FFc792ff97d90300b4e11740f9e80f40f9fa0f00b99a0640f9fb0b00f91f0101ebc09b0054e81340f9490180522a040091e00319aaea1700f909692138e1630091BL8;FFa8040036e8a30091a08302d10081c63c0181c73c0281c83ca0073ead0081c93ca2033fade18342ade203c73c", + "a1033cad0081c53ca2033dade18341ada1033badL8;FF742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9df000094fd7bbda9f50b00f9f44f02a9fd030091a87cc39bf30300aae9031faa0a018052ff0308ebBBL8;FFa0e300d1a8ab3ca9c343009420008052e10314aadf400194fd7bbca9f85f", + "01a9f65702a9f44f03a9fd030091084841b9f30300aa88060034080140b20811c0daL8;FF0900f0f2e8470039e90700f9e0230091af4bff97f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aaL16;FFe84342f9eb5342f9e8b700f9e84742f9e", + "9a318a9e84b42f9e94f42f9e8eb00f9e85742f9ea2311a9e85b42f9ea8342f9e82f14a9e85f42f9e81300f9e86342f9BBBBL8;FB28050000320000003d0f4000000000004a00000000000000d9040000130000003d0f4000000000004a00000000000000bd040000130000003d0f400000000000L8;FFa98", + "315386901084aabb35538a99315384901084aaac35538a9a315386901084aabd35538a9b315384901084aaae35538a9c315386901084aabf35538a9d31538BL8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab22030054091440f9090100b42a0140b24a11c", + "0da4a1540d24a0d0a8bL8;FFa04700d1b2c2ff97e08b00b9a04700d1afc2ff97e08700b9a04700d1acc2ff97e08300b9a04700d1a9c2ff97e07f00b9a04700d1a6c2ff97e07b00b9a04700d1BBL8;FF4d550194e13340f93f0400b160010054e00314aa22008052f44f59a9f65758a9f85f57a9fa6756a9f", + "c6f55a9fd7b54a9ff83069140550114f44f59a9f65758a9L8;FF01f17dd34c550094400745ad160080924233c03de85345f9800705ad400743ad8233803de8bb02f9800703ad420344ad820304ad410341ad810301ad420342adL16;FFe0431e9101c10091ff0600b1e203889a6af9ff97e8cb43f96083c0", + "3ce9d743f91f0500b1e0d7823de9b305f960150054e0efc13de1f3c13d1f0700b1e2f7c13dBBBL8;FF24008052bc000094610a40f9e00315aa76ffff17e00313aa220080522300805224008052b4000094610a40f97cffff17e00313aae10317aae20315aa23008052L8;FF0023049148290094080040b20", + "811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb281700544c000014fa031faaf9ab49f9f8074091BL8;FFf44f41a9fd7bc2a841feff17f44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091140040f9f30300aa9f0600b140020054610e40f93f0400b1L8;", + "FF930a00f91c000014007c4093220000900028009142000e91437860f87f0013ebc0010054640640f9c4e0ffb5650240f9650000b49f000039007d20d4230200b4BBL8;FF02018052011115cb4b350194e1db42f9810000b4e0df42f92200805246350194e04306910d100094e11b40f93f0400f18b00005", + "4e01f40f9220080523e350194L8;FFfc3301f92023803d2183863ce83f01f902000014fb5f40f9f7e741f9f6e341f9f70000b4f50316aae00315aa29efff97f70600f1b5c2009181ffff54e8df41f9L16;FFe9a301f9e9030caaf4bb43f9edbf43f9f9c343f9fec743f9eecf43f9f2d343f9f1d743f9e0db", + "43f9e7f343f9e3e35e39ebbb01f9eb0316aae4e343f9e5e743f9BBBBBL8;FB795369676e616c4d6573736167656d657373616765726567697374726174696f6e5f69645072654b65795265636f72645374727563747572657075626c69635fL8;FFba031ff8b9ffff17a08300d176f3ff97d2ffff17a0830", + "0d173f3ff97b6835ef8c80a1a8b5a070091ba031ff81b01007914050079adffff17a08300d16af3ff97BL8;FFf70b00f9f65702a9f44f03a9fd030091f30301aa210840f9f40300aa680240f91f0101eb000b0054680640f92a040091e00314aa490180526a0a00f909692138L8;FF9a1600f968620039f4", + "4f4ea9f6574da9f85f4ca9fa674ba9fc6f4aa9fd7b49a9ffc30391c0035fd6680316cbb5035ef89f0308ebc8030054e80b40f90001168bBBL8;FF545d019468021a0be8ff0139081d0012290080521a0317cba90316381ffd007140050054ea03019149692838080500113400001413020034e8030191e10", + "319aaL8;FF21a0389102018052e9ab0cb9e85306f9f3fcff97f3f742f9e8ef42f97f0208eb61000054e063179177fbfe97e8f342f909068052e02bc33de12fc33de233c33dL16;FF680640f9e10314aae20315aa0001168b50dd0094c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6", + "e00313aa220080522300805224008052BBBL8;FF6009f8b728040091490400d16d000014f503012a74040051760240f9c20640f9a20500b4c10240f9200080398000f8b728040091490400d1110000145f2800f1L8;FF4f7d0094e07c01b4f80300aa4d7d00940004805221008052497d0094e07c01b4f40", + "300aae0fbc63de1ffc63de8074091e2074091e00315aa0881099142c03591BL8;FF400200b4e81242d3155000a9f70300aa152001a928008052081000f9e80318aaa90216eb9402168bf533899a145500a9135d01a9f44f43a9f65742a9f85f41a9L8;FF01000014c0035fd6ff0301d1fd7b02a9f44f03a9", + "fd830091480001aba2020054010840a9f30300aae023009129f87fd31f0109eb0881899a090180521f2100f1BBL8;FFe08743adc806805234008052a00301d1a1c302d122008052b4031ef8a0873aade28344ada9035538aa135538ab2355382901084a4a01084a6b01084aa9031538L8;FF00013fd6f7d7", + "49a9fb5f40f9fa4b40f960c603f961ca03f9c9fdff1760e213915af7ff97f86340f9ac00001461fdffd021001c91e0430f91c2088052ae110094L16;FFf63f44f9fc6b00f9fc030eaaf84344f9ea4b44f9fa5344f9ec5744f9e15b44f9f06b44f9ed6f40f9e56740f9fe1740f9f56340b9e3b7803dee2749", + "a9e20713adBBBBL8;FB3c0f4580f2af1be7031fe25776b0a750139071529f46342f216e259727c600a60016264f49b59ea9a28c9c835fa4aad583e90000baf52c8912bf6024cb6d8e46L8;FF8840d6f2133b00f9080000f9a8008052e80f00f933fb7fd34a8d0094e00313aa41008052438d0094e00a00b5", + "79020014f70314aa438d00940066805201018052BL8;FFe86304f9e8ffffb008610491e86704f9e8c31d91e1833291e86b04f988ffffd008c11f91e86f04f948008052e86b06f9e8feffb008810c91e86f06f9e85706f9L8;FF2300805224008052f6df00a9f60f00f93fe9ff97ea2341a9eb058052e9074", + "0f9160500914b692838290116cbf60f00f99f0209eb68020054d40000b4e80b40f9BBL8;FF04490194740a40f9680240f99f0208eb61000054e00313aae747019408038052690640f9e083c83c8826089be94f40f939000014eb230091ea43009140fffff0L8;FF1f0109eb69010054000114abc2000054f", + "44f41a9fd7bc2a8c0035fd6e00314ab83ffff5480fdffd000600091f348009480fdffb000202091f0480094fd7bbfa9L16;FFe84b40f9e88f04f9e88340f9e89b04f9e87740f903290091601d0094e8eb41f9eafb41f9e9f341f9eb1342f9e35f42f9f86742f9e84700f9e8ef41f9e06fc13dBBBL8;FFea2", + "340b9d7160033b5721d124941092a08c10daaed0f40f9ea1b40f9eb1b00f9a98109aaca210aaae90f00f9e93740f9480108aa36fd68d3e92340f9e83302a9L8;FFe112c03d8092823c8192833ce9c700f9e10740f9010600b599feff17e8b740b92043c23cc0e200912183c33c2207c03deab341b91f0100", + "71f8c741b9801f803dBL8;FF4ded0094f8ffff17e1430091e20313aaf70b00f9f73300f9f74f00f968040094e08744adf50300aae22fc03df4d300f9e0870bade08742ade267803de08709adL8;FF0600b05211000014e00304aaa27c4093480c80d2011080d2030080d2010000d41f9800b160000054a50", + "0070b08000014e00304aa010080d2010000d4fbffff17BBL8;FF2200805259110094e1d342f9e00314aa83fbff17e04316912200805253110094e1d342f994fbff17e0431691e1031aaae20318aa4d110094fad342f9e8cb42f9L8;FF5f0b00b101090054e0074091e10314aa022b805200001891ffe7163", + "94d2d0094f5030291e1074091a0a20291210018915fcdfe97e0234ea9a2a20291e16b40f9L16;FF896243a9000402ada00a43ad1f010ff1e91700f9e86b02f9000803ada10240ad010000ada20241ad020001ad810240ad820ac03de02b813d8082c43c942240f9BBBBBBL8;FB6e6465782e637261746573", + "2e696f2d313934396366386336623562353537662f62797465732d312e31322e312f7372632f62797465735f6d75742e7273001d70L8;FFe00f40b9680100d0080140391f05007140fdff542b07011328030013290f0313a18b7b296b05000a2a0b02132c1705130801000a2d130413290d000a08010b4aB", + "L8;FFf6570da9f44f0ea9fd830291081c00121f090071e1010054e00302aaf30302aaf40301aa6bfeff97e80300aae00301aa08020037680240f9080540f9150100ebL8;FF22fdfff042e02d91e0030091e3018052f40308aadc110094e80340f9f52b41a9f62741291f0900b181010054d78209aa5f1100", + "f161010054b60240b9b70000b4BBL8;FFf65704a9f44f05a9fd030091ff431cd1f30308aa08018052ff0300f915008092e80b02f9e8e30f91e0ff01f9e10302f9f51302f9ff0702f9ff0f02f9a8831df8L8;FF54610094e802158b680a00f9952240f9550300b4610a40f9680240f9941e40f91f0101ebc0", + "090054680640f9490580522a040091e00315aa6a0a00f909692138L16;FF0800f0f208090091a4ffff17ffc301d1fd7b03a9f72300f9f65705a9f44f06a9fdc30091081c00121f090071a1010054e00302aaf30302aaf40301aa27eeff97BBBL8;FB080000000000000004104600000000009cf545000000", + "000010000000000000000800000000000000d8104600000000009cf54500000000001800000000000000L8;FF60000054e1630091b1a1ff97964e40f9560300b4e11740f9e80f40f9944a40f91f0101eb603e0054e81340f9490380522a040091e00316aaea1700f909692138BL8;FF936a29f89f0200f9f", + "44f41a9fd7bc2a8c0035fd6ff8301d1fd7b02a9f71b00f9f65704a9f44f05a9fd830091e803022a140c40f9020440f9f30300aa14030037L8;FF23050054f70300aaa08300d1e10315aae20314aae30316aab6000094a8035ef81f0500f140040054b4835ef8e8ffff171f25007181010054755200a9790a", + "00f9BBL8;FF000040f9043d0114000040f9133d0114000040f9063d0114000040f90b3d0114000040f9103d0114cc3d0014fd7bbfa9fd030091080040f91f0500b1c0040054L8;FF4d4100949f0b00b1e0080054e8030c91a6000014776a41f900c3c73c01c3c83ce9ff43b9f6db43b9756641f9e80240f9", + "200705ade9c302b9680000b4e00315aaL16;FFe3db53a9ea2717a9e9030daaec1740f9f80303aaeb6f00f9eb2b40f9e3f340f9e8174ca9e00b44a9f43748a9f54700f9e8d300f9ea2343a9e7f346a9ed6b00f9BBBBL8;FB7177da0d1ca8c7d4c1c454fcea8348cc0ebc72b3c1273fa2016896033985ce233", + "2f500004ce53f8dc4ce7f41060177d62f226b023393c80edefa5788cdc1dab2L8;FF0a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b29050091BL8;FFe92344a9fc7b06f9fa7f06f9e85306f9e95706", + "f9e85b06f9e92347a9f98306f9fb8706f9e85f06f9e86706f9e83740f9e96306f9e86b06f9e87306f9e82745a9L8;FFc80000544a1d0012290500d158012b0b0a7f08534afe073608008092680200f9f44f45a9f65744a9f85f43a9fd7b42a9ff830191c0035fd6940100b441110094BBL8;FFe20314aa53", + "510194e00315aae10313aaf44f42a9f65741a9fd7bc3a8c0035fd660ffffb000c02891f44c0194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9L8;FF090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b014", + "0b26b11c0daL16;FF0800809269220039680200f9810000b4e0a743f92200805247d10094e1af43f9810000b4e0b343f92200805242d10094e1bb43f9810000b4e0bf43f922008052BBBL8;FF620640f9021500b4610240f9290080396918f8b7280400914a0400d1e600001401c00091e003022ae20303a", + "a8af5ff97602c00b4e00700f9a1ffff9021203f91L8;FFc0fdffd000c03691fc6c0094c0fdfff000600691f96c0094c0fdfff000a00291f66c0094c0fdffd000a03f91f36c0094c0fdffd000003691f06c0094fd7bbaa9BL8;FF4c1100912e1100d10c3900a96d19001221540daa2bfbff363f1100f1a0fb", + "ff544b11c0394c1500912e1500d10c3900a96d19001221700daa0bfaff363f1500f1L8;FFd37a37f8f35341a9fb7345a947feff1700008012f35341a9fb7345a943feff17fd7bbba921008292e1ffeff2fd0300911f0001eba80d0054f35301a9f40300aaBBL8;FF49028052f6074091d6820991f4031baa", + "0969213828040091f87749f9e8d302f91f0700b1c0200054c0220291ab1c0094080040b20811c0da081540d2080d088bL8;FF2d0080526b5f02796ac304396aab0491490100b9e9030291e82302f928210f91ede310390001803dec6311394531009400188052210080523e310094408d00b4L16;FF4db10", + "094613240f9810000b4603640f92200805248b10094610240f9810000b4600640f92200805243b10094610e40f9810000b4601240f9220080523eb10094BBBBBL8;FB184b420000000000184b420000000000184b420000000000f8304000000000000000000000000000737071723a3a76313a3a6368756", + "e6b65643a3a7374617465L8;FFa801084a29010b4a08010a4a0afefff04a8130912801084a097d1853495969780821094a095d1053495969782001084ac0035fd6fd7bbea9f30b00f9fd030091BL8;FF000040f96800c8376800d037021501140e1501140e150114000040f97f170014000040f9b3d5ff17", + "000040f9dbccff17082440a9e20301aae00308aae10309aaL8;FFe86f02f9e97302f9ea7702f9550c0094e007409100401d9180f2ff971400001408018052f6af4bf9f7b34bf9e9830a91e8830a3928008052e0230891e1431391BBL8;FFe00302ad01fdff97a0877ead68fffff008ed2091a203df3ca303", + "dc3cf4830191c9058052e0830191e00706ada0077cade23b803da203d73ca1c302d1e2030091L8;FF50000014e0032d91e0eeff97e1fb42f93f0400b180140054fa4340f9fb830291810000b4e0ff42f92200805242590094e8c3179100810091d4eeff97c80080d2L16;FF05000014e80b41b2a00312f80", + "2000014a80600d1a0a303d1a88311f8acdfff97e10300aae86341f9f40301aa1f0500b1c0010054c80000b4e06741f9e10308aaBBBL8;FF2300805224008052f4030caaba040094e10340a9ec0314aa2aa040a9536928380bfc71d308050091290040f9280800f94bf2ffb4ddffff17e10300a9e00301aaL", + "8;FFe8cf42f9090280522a040091e00319aa09692138e1431691ead302f90f120094f90b40f9b8010034e1d342f9e8cb42f91f0101ebc0d30054e8cf42f909038052BL8;FFf52340f9fd7b43a9ff830191c0035fd68000805206000014e00313aa2f060094e80300aae00301aaa8fe0737680240f9090540", + "f91f0009eb29060054e80f41b2L8;FF480113eb8c0208cb5f0113ebe8031faa8b0940920001005469020acbed0313aaae15c038df05013108d5889a290500b183ffff5489fd43d30b0500b48ced7d92BBL8;FF1e350194e05fc73de163c73de8074091e26bc73de007409108810991e01b843de067c73d00", + "800191e11f843de023843de227843dca340194e007409100800991L8;FFb87f3aa9bf233ba9bf673ca952f5ff97003000b580074dada8035ef8f6bf44f9e87305f9e8b744f9800702ad800b4baddf0208eb800b00ad80074cad800701adL16;FF680343396013cc3cea031c91e0831d91e1e31c91f69f03f", + "9e8031d3968274da94011843cf6831d91e8ab03f9e9af03f9641b0094e8b343f91f0500b120730054BBBBL8;FB6a00000000000000440100001c00000042024000000000006a00000000000000090100002e00000042024000000000006a00000000000000b00000002e000000L8;FF080540f9c97e04535", + "f0500f180010054eb031faa4cfd41d38d010b8b4a010ccbaef57ed30e696e78df21296b6b818d9a5f0500f108ffff5408090b8b0a014079BL8;FFfbc742f9f5cb42f9e0e31b9181e200910227805220af803de82304f94d090194f63f42f9f43b42f9c80240f9680000b4e00314aa00013fd6c10640f9810", + "000b4L8;FF614c0054880240f96aad8c522aefac72090140b9080940793f010a6ba9cc8d520001497a414b0054810a41a9e0e30691996a42a9a1f7ff97e1df40f93f0400b1BBL8;FF991100b4542b40f94e490194e00319aa2100805247490194c01300b4e10314aae20319aafc0300aa4a490194542340f", + "9b4031df8b40100b58200001436008052L8;FFe8cb00f9ecab4779e31b40f9eb3b00b9a00302d1e2e300918b1245f8e8fb0039e10319aae8b340f9e97304f8e9a34539ec7b0079ebf303f8e8f304f8e95f0139L16;FFe003099136dc40a9f80301aa3af05aa9022f8052e8e700f92aa042a9ec7300f9e82b", + "17a92aac43a9e92b1fa929a044a9e8cf00f92aa045a9e8c300f9283440f9BBBL8;FF783d4039a80316b8081c40b9a93316b8a9f140f8e80f00b9a8194039e91b00f909184039a8a3173808084079ec1f00b90c0040b9a9231838697140f8aa831778L8;FFf44f02a9fd030091010040f9f30300aa810000b", + "4600640f92200805246690094610e40f9810000b4601240f92200805241690094612640f93f0400f18b000054BL8;FF000100b45d000014600900b5e00313aa32f6ff97e80301aa80000036c80900b5e1031faadcffff17e1031faa883600f9d9ffff17c10b0054e0031faa9affff17L8;ZDBBL8;FF60828", + "03c680e00f952290194e0430691e10315aa3dcfff97e00315aafac3ff9728008092680200f9a6ffff17e85340b91f050071610f0054e043c73ce143c83cL8;FF61ffff5420835ef8e10315aae20313aa4c2a0094c0feff35f60319aac18e5ff8810000b4200340f922008052422900948002c03d880a40f9", + "c002803dc80a00f9L16;FF28008052750600f904000014e00315aae8031faa600600f90a028052e90314aa696a2af8680200f9f44f42a9f50b40f9fd7bc3a8c0035fd6ffc302d1fd7b08a9BBBBBBBL8;FB2f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f6b656d2e7273002c6369", + "70686572746578742073657269616c697a6564206279746573L8;FF810000b4e0031caa220080524aa300945f1f007240080054e00319aa010880522200805244a30094e11340f9f50b40f9fa430e91810000b4e01740f922008052BL8;FF152300a9f7fbffb5f62b40f9f51f40f99600003738ffff9018e", + "3069113000014d7fe45d3e80214ab820c0054e90200aba20c0054aa0217cba8831cf8a8c300d1L8;FFa0031df841fdff9021602c9143fdff90634c2d91a0c300d162038052240180523a29ff97a1035df8e80341a9f6df42a9f45744a9e10200b409008092690600a9BBL8;FF3ae9ff97a1035ef80200001", + "421008052a8035df81f0101eb201b0054a8835df8490280522a040091e00318aaaa031ef809692138a1c300d12ce9ff97b7035ef8L8;FF888240391f05007101020054610a40f9680240f91f0101ebc0030054690640f92a0400910b0480521f010aeb6a0a00f92b692138a00300542800805228692a38BL", + "8;FF21050054e0031faa8effff17c80080d2e00700f90800f0f2080900d17fffff17e90b41b2e92300a984ffff17c80080d20800f0f2080500d178ffff17c80080d2L8;ZDBBBL8;FB8d00000014000000ef104000000000004e00000000000000f904000019000000ef104000000000004e0000000000000", + "001050000140000003d0f400000000000L8;FFe80f40f91f0101eb60690054f50314aae81340f9490b8052b30e4cf809692138280400917f0a00b1e81700f9c10c0054f7031faa70000014e11740f9e80f40f9BL8;FF0a0200904a611591eb430091f40300aae92b01a949008052cafefff04ac13a91a07f", + "0091e1830091e92b05a9c9feffb029b91891e92f07a9eb048052a9028052L8;ZFBBL8;FF21000f91030d40f902048052fd7b43a9ff03019160001fd6082000910940009142ffffb042840591e82700a9e8030091090000b029210491200440a9e82701a9L8;FFe00000143f040071400200543f080071210", + "30054e1230091e20313aadffdff97400200b4e9000014c1620091e20313aadafdff97a00100b4c9000014c1c20091L16;FFe02b833de12f833d8c040054a81000b5e027c33de0030991e1233391022f8052f77300f9e0f3803d4ac30094e86346f9f80748a9ea2f41a9e02bc33de81b01f9BBBBL8;FB5143", + "4b415f56315f4d4c4b454d3736383a636970686572746578745369676e616c5f5051434b415f56315f4d4c4b454d3736383a41757468656e74696361746fL8;FF2011005457fcff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebe80f00549600001410fcff9", + "7080040b20811c0daBL8;FF091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0daL8;FFe1ab40f9fa9740f90a01092ae8c700f9f5000014e8c740f91a7d0853ef031a2ae13355a9ee031baafa97", + "40f9eabf40f9eb0319aaedd740f9fba340f9f00318aaBBL8;FFfd7b42a9ffc30191c0035fd639008052e10740f901feffb5f2ffff17ffc301d1fd7b05a9f33300f9fd430191098440a9f30308aa020c42a9e8230091e00309aaL8;FF200545ad286140f9e82303f9200705ad200543ad200703ad200944ad", + "200b04ad210141ad210301ad200942ad200b02ad200540ad200700ad73e6fe97e0234da9L16;FF0a2541a9eed300f91b695ca9e9e700f9091940f9ed330ca90d3157a9ea271fa90aa543a9e36f1ea917394fa9edef00f90f5550a9ea9300f91e1552a9e9db00f9BBBL8;FF60200054680640f9090b80522a", + "0400916a0a00f909692138e10313aa33f9ff97953a40f9550300b4610a40f9680240f9963640f91f0101ebc01f0054680640f9L8;FFe0350054e8cf42f9490580522a040091e00318aa09692138e1431691ead302f90e0c0094fad342f9e8cb42f908011acb1f0308ebe8340054e8cf42f9e10319aaBL8;F", + "F680240f9080117cb9f0208eb69fbff54e00313aae10317aae20314aa230080522400805222170094770a40f9680240f9080117cb9f0208eb29faff54e00313aaL8;FF4570009100204039001040d36320c01a60040051e303034b25000014a1fc2f36c0020e91e12a0091420440f9027821f8441c40b9df", + "ffff1781404079e0fcffb0BBL8;FF010c00940ffeff17880241d2e90080521f2d00f10831899a29ffffd029993f918a0000102b7968784a090b8b40011fd6e1d342f9e8cb42f91f0101eb20b50054L8;FF0805088be00313aa0201805201f17dd349330094ffc32091f44f42a9fc5741a9fd7bc3a8c0035f", + "d6f46b41f9f36741f9880240f9680000b4e00313aa00013fd6L16;FF8183813ca80317f8a98318f8b70000b4e00318aae10317aa2200805246b30094e8830291e94310912001029101010291a9160094a00f7ead480080d2a10b7badBBBBBL8;FB6c5f70726f746f636f6c3a3a70726f746f636f6c000000", + "00770d4000000000002e000000000000006900000031000000770d4000000000002e00000000000000L8;FFa0073aade08746adb4f35438220114cba10b39ad330302eba003913c22020054e10740f98003148be20319aa499b00948802190ba8f31438290080521ffd0071BL8;FF1f0500b1c0000054e01", + "7c03de83340f9e00f803de82300f90c000014e8a745a9e0feffd000c01091a18301d1a82739a9a8c301d1a9ffff9029611291a8273aa9L8;FFf8e300f9200e0054e8431391e0031baae10316aaf2acfe97ec6b42f9e96f42f9e87342f9f67742f9eb7b42f99f0900b1410e0054e8d700f9e9c300f9ebcb00", + "f9BBL8;FF796a01a9685e00a9f44f5ea9f6575da9f85f5ca9fa675ba9fc6f5aa9fd7b59a9ffc30791c0035fd6e4031faaa78358b899324fb8bc8357f8be035838ba035df8L8;FF9e000014e05306f9e083329161fdfff021203f9102028052a3fdffb063fc2b91c40280529600001448008052e0a33239e8", + "a73239c80080d20800f0f246000014L16;FFff2318a9e87f1aa9ff231ba908068052ff7f07a9ff7f0aa9ff7f0da9ff7f10a9ff7f13a9ff7f16a9ff7f19a9e003833cff231ca9e8008052ff4307390f000014BBBL8;FF080014eb23120054ff0208eb09010054e0e30091e10317aa22008052fe790094f423", + "44a91f0114eb23120054e81f40f9e10315aae20317aa0001148b457b0194L8;FFfb3709f9e09f843da8d6ff97963b01b4e8074091c10600d1e0431691088109910dd6ff97e86352b9f86b52b908070036e93b49f9ea3f49f9e86f52b9f5cb42f9BL8;FF29010b0b4a114c0bbf25007129c100110b819f1ad", + "f7d02710954003949c100110a819f1a0958003969010d0b4a114e0b29c10011cb0d00122c344039095c0039L8;FF6e6619532a018a9a290080521000a8d23f65536a0f00a8523000c0f26b011f128c011a120f128f9aad016192ce7d60d36b010caaac010faa7f0218724a010baaBBL8;FF020500b468061", + "38bf60301aa15f17dd34c3b0194e00315aa01018052453b0194a00500b4f70300aa1b400091fc0313aa08000014390080529c0700d1d6620091L8;FFe10315aae20316aae00300f9513b009405000014160080920300001428008052e80300f978b640f9684a42b97a4e42b9f71b00f9f45700f9e86b0529", + "980100b4L16;FF81ffffb4a00240f9220080524abb0094f8ffff17dc0000b488071c8be00317aa0201805201f17dd343bb0094795a01a994000014f80301aabf0600b1c0350054BBBBL8;FB7a134000000000005700000000000000700200003d0000007a134000000000005700000000000000700200004", + "500000073686f756c642062652065786163746cL8;FF410b0091e20317aa528b0094e84b41f9a80000b401f97fd3e0031aaa42008052458b0094e9a34da97f0600b1b6031df8e94b01f9e84f01f9e8030a910005c03dBL8;FFe8ef42f9c80000b40805088be00314aa0201805201ed7cd3470b0194e9c312", + "91e8cf44b9f5bb44b920c1c03c9f0b00b1e8a304b9e027813d410a0054e8830291L8;FF1f500039f44f42a9f50b40f9fd7bc3a8c0035fd60001805201038052dd060094fd7bbda9f65701a9f44f02a9fd030091f50303aaf303022af403012af60300aaBBL8;FFd8020191e82702a9e036833de08742ade2", + "3a833de213c03de01e833de122833de08743ade21a833de026833de12a833dc5edff9700e4006fe00301ade00302adL8;FF4a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb29030054280108ab8300005410000014e80308abc2010054090840f9090100b4L16;FFea230ea", + "9e14740f9f79f00f9f70311aaf10306aae8031aaaea0304aae40310aaf00300aae00316aaefdb4aa9e60307aaec0315aae7030baaeb0317aafa030faaBBBL8;FFe10313aaf44f42a9f50b40f9fd7bc3a8c0035fd6ff8307d1fd7b18a9fc6f19a9fa671aa9f85f1ba9f6571ca9f44f1da9fd0306915c2040b", + "9f403032afa0301aaL8;FFe00314aa02018052211108cb4a6b0094610e40f9e10000b4601240f922008052f44f42a9f65741a9fd7bc3a8426b0014f44f42a9f65741a9fd7bc3a8c0035fd6BL8;FF880080d20800f0f2081900918082833c8182843ca0077bad8182863ca10b79ad8082853ca003d13c8082", + "803c8182813c880200f98282823c92ffff17e08744adL8;FF290080521f4100390d450039090100f9c0035fd62d0080522e008052090500f9290080520e4100390d450039090100f9c0035fd62e0080526d008052090500f9BBL8;FFfd7b43a9f32340f9ff430191c0035fd620ffffb000e02b9123ffffb0", + "6380209124ffffb084c02c91a27f0091e1068052e126019420008052c1008052d6260194L8;FF680640f93f0002710801148ba20100540101003926000014e00313aaf603012ae10314aae20315aa2fe9ff97e103162a680640f9df0202710801148ba3feff54L16;FF4d018052eb031faae9031faaea031", + "faa8c318d9a4d040091ae696a384a0500915f010cebcf194092ce1d0013ef21cb9ae90109aa620500546b1d0091eefeff37BBBBBBL8;FB3a20c0001a65706f6368206e6f7420696e2076616c69642072616e67653a20c0000d4d6573736167652066726f6d20c02e206661696c656420746f2064656372L8", + ";FFe81701f9ea1b01f9e92701f9e9ab40a9e82301f9e82f01f9e83b01f9e84701f9e85301f9e85f01f9e86b01f9e87701f9e88301f9e88f01f9e89b01f9e8a701f9BL8;FF610a40f9680240f91f0101eb60040054680640f92a04009109028052e003142a09692138e10313aa6a0a00f9f44f42a9f50b40f", + "9fd7bc3a8f7fcff17e8031faaL8;FF880e00f9280080528082803c810a803d68520039f44f4ba9f6574aa9fd7b49a9ff030391c0035fd620fdfff000403291f61a0094ff0303d1fd7b06a9fb3b00f9BBL8;FFe95f02a9fbab00a9eaa303a9b0160094fc7341f99f0b00b1a1000054e81740f91f2100391f0", + "100f96c000014570080520d000014e0031b2a577401941f1c0072L8;FF210080524b5f0094e01001b4e10313aae20316aafa0300aa4e5f00941c000014e8c31791e00313aa2a5a009469624039a8fdffd0083d2f91ca028052e80b03f9L16;FFc7ecff97760a40f9680240f9080116cb9f0208eb88070054", + "680640f9e10315aae20314aa0001168b4adf0094c802148b680a00f9f44f43a9f65742a9f85f41a9BBBL8;ZBL8;FF2ba3ff97e11740f908feff17e0630091e10317aae20316aa230080522400805223a3ff97f71740f9e80f40f9080117cbdf0208eb49c1ff54e0630091e10317aaBL8;FFe00800b4e1031", + "7aae20313aaf50300aa50ff0094c142009100008092d742009114fb00941f0400f1200100541200001435008052c142009100008092d7420091L8;FFa80000cb1f0106eb29020054210000ca1f0004eb2108409242040054210300b5a204028b8300038be10300aa400004cb250840f2e00000549f0003eb", + "40060054BBL8;FFed1f00f9eb2b0229e9230329e12f00f91fc3ff97ff0600b1bb8313f8c0040054a02303d11ac3ff975f0700b1bb8313f8a0060054a02303d115c3ff97bb8313f8L8;FF00013fd6010740f9810000b4020b40f9e00315aa483f0094f62f0036f6fe60d3f86340f9ea4340f968c6533955ff", + "48d388580036b7020014e84300f9e8f341f9L16;FFf9d342f9fcd742f9f7df42f9df8225f1f8e342f9e9a30da9e9bf42f961520054e8c342f91f0112f1015200543f0700b1c0530054e95b00f9f50314aaf4db42f9BBBBL8;FBbc8150faacf151ba31ff00bba28c25efba520000cd83e6ac8cbb47a8daba1", + "ae730adbc541aa187b21a2b5a6c0f0a035f86ec4d14e8bc2cfe6a12b8bec41f2369L8;FFab890094e87b40f9697e08539706009109693438e87740f9f77f00f9ff0208eb01fdff54e0a30391a1890094e5ffff17f4031faaf5031f2ae9031faa1c038052BL8;FFc11500343f040071200100543f08007141", + "fdff5401a30491a22302d18febff97602b00b5e1031faae9ffff17002900b5a02302d167ecff97e80301aa80000036L8;FF500f0094e00314aa21008052490f0094a00b00b4e10316aae20314aaf50300aa4c0f00941c000014a21240f9020100b4a10e40f9e0630091e30316aae40314aaBBL8;FFff3f03", + "39ea0341b9e8275f29eb0741b9ec0b41b9ed0f41b9ee1341b9ef1741b9a0833dad0809c05a2909c05aa0833eada003db3ca103dc3ca203dd3ca303de3cL8;FF080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb481f005439010014002000918903009424000014e", + "80300aa098d40f8L16;FF54cf0094e0430f91e1031d91032b0091e20319aaaf210094eaeb41f9efef41f9f7f341f9e9f741f95f0900b1e9fb00f961000154e8fb40f9772201a908008092BBBL8;FF0800f0f2080900915fffff1780220191970d0094e80314aaaafeff17a1ffffb021380591a3ffffb063e", + "80291e00700f906000014e00700f9a1ffffb021380591L8;FFe97200f8ebf200f8ea7201f8fc07ff97e84346391f05007161050054e8a759a9e80302f9e8031091e90702f9a80318f8080100d0081140f91f0900f103040054BL8;FFffa70039e81300f9b1f5ff97e80300aae81300f9a1fefff021981391", + "a3fefff063301191e083009122028052a40080521a000014c90080d2e0a3003948008052L8;FF637c4093210013ea6318049b631000d1c00400540000018be5ff9f52010006cb21fc44d33f00056ba80600541fc01f3801e01f7802d01f38610000cb2100146bBBL8;FF40440054e8cf42f9490380522a04", + "0091e00318aa09692138e1431691ead302f9fd0c0094fad342f9e8cb42f908011acb1f0308eb48430054e8cf42f9e10319aaL8;FFe89b3f39e8a74829e99f3f39e8a33f39e8a74729e9a73f39e8ab3f39e8a74629e9af3f39e8b33f39e8a74529e9b73f39e8bb3f39e8a74429e9bf3f39e8c33f39L16;FFe", + "82708a905ab0094f5031f2a1c008092f60313aa2e000014880100d0081140f91f0d00f1c30200546800805249feffb029112891e82707a948feffb008412791BBBBBL8;FB1d1c40000000000054000000000000007f000000050000001d1c40000000000054000000000000008d000000140000004202400", + "0000000006a00000000000000L8;FFe8031faa091c40f93f0500b121faff54e00308ab23ffff5400fefff000403f91f6920094e8031faa090840f929f5ffb5091440f9e803088b09f6ffb5b6ffff17BL8;FF201a0054f30300aae00308aab3020094e80300aae00313aa090140b22911c0da291540d2290d", + "098b2925019129fd46d30801098b130500917f0209eb691e0054L8;FFe08f00b9a04700d1b1c4ff97e08b00b9a04700d1aec4ff97e08700b9a04700d1abc4ff97e08300b9a04700d1a8c4ff97e07f00b9a04700d1a5c4ff97e07b00b9BBL8;FF656c01941f1c007220050054972e40f9f30f40f9770500b4", + "e0430191e10316aae20315aa68ffff97f52b40f9bf0600b120050054883240f9f4e345a91f0308ebL8;FFb47e085372ffff17f46f41f9e8c31791e91f46b900c1c03c01c1c13cf5fb45b9880240f9f36b41f9e97305b9e057813de15b813d680000b4e00313aa00013fd6L16;FF981a40b9942240b921008", + "052e30316aae40315aa1f010a6be203182afa03881ae8a300913f411f7100010291fb03891aaefbff970800809260220091e1a30091BBBL8;FFe80700f9e0230091b17d0094e00700f9a1ffffd021603f91a3fffff063240091e0230091a20080522401805224000014880080d20800f0f2080140b2a0c30", + "0d1L8;FFf8ffff1714a4ffb48806148be00313aa0201805201f17dd31afdff17e19349f9f3074091738209913f0800b1800100543f0400b140010054810000b4e09749f9BL8;FF0901098b0a0e8052750640f9210108cb00550a9bc6020094e00315aae10314aac3020094d60000b4c8e279d3e00315aa02", + "018052011116cb3ff70094611240f9L8;FFe7800091e10309aa030080d2060080d28a8eac720b10a0d2041440f90a000014230840f9230103cb040000145f1c0071e1010054e60301aa021040f9840400d1BBL8;FF024280522180099152370194e01fc53de123c53db8008052e823697954018052150080", + "92e057813de15b813de8e30a7985000014e8d342f9e067c13de8a302f9L8;FF0202805263fdffb0630c1891e40180523e3dff97f64345f9e0032a91e1832491022b80524b370094e0032a9157f1ff97f70316aa69018052e18e41f8280041d2L16;FF80390054e8b743f9e9bf43f9f80314aa2013c93cf4b", + "b43f9e0c30391e86300f9e8c343f9c122019102298052e093803de9a306a9e9c743f9e8d343f9e93f00f9BBBBL8;FB63697068657274657874656e6372797074696e76616c69642073656e64657220636861696e206d657373616765206b6579736465637279707473657373696f6eL8;FF080100b408014", + "0b20811c0da081540d2080d088b0825019108fd46d308050091091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140b26b11c0daBL8;FF2083c63ca68302d1e87704f9e85b44f9a70302d1c082863c404fc03de203182a2283c53cc182843c4143cf3c20f18f3ce963019120cbc03de8b304f", + "928210a91L8;FF2400805242e3ff97b6677ea9b7835df8e6ffff17f95f03a9d9a20091fb5b02a937835ef8d70df8b7f70200b435035ef844070094e00317aa210080523d070094BBL8;FF78e600a968020039b60000b4e00314aae10316aa2200805247470194b50000b4e00317aae10315aa22008052424", + "70194f44f4da9f95340f9f6574ca9f85f4ba9L8;FF0443009488fdffb008c91491e9008052e8271ba9fa0741b2e8df40f92083c13ce8c700f9e8a759a98082833ce8a716a978caff34e11740f921caffb4e00b40f9L16;FFe80303aafc4340f9e56f40f9e30310aae45f40f9e08710adf00308aaea0312aa", + "08008092e87700f9e8030eaaee0311aaf10317aaf74f40f93d060014e8fb41f9BBBL8;FFfd7b07a9f34300f9fdc30191011440f9f30308aaa10100b4001040f9a8c300d152640094a8035d381f05007181010054a8835d381f0500716c06005448070035L8;FFc0035fd6c0fdff9000603391fe620094c0f", + "dff9000c03391fb620094c0fdff9000203491f8620094c0fdff9000803491f5620094c0fdff9000e03491f2620094BL8;FFe003009162018052440080523fedff97e10340f99effff17ff0302d1fd7b03a9fa6704a9f85f05a9f65706a9f44f07a9fdc30091081c00121f090071e1010054L8;ZDBBL8;FF0", + "3230194fd7bbca9f70b00f9f65702a9f44f03a9fd030091150040f9bf0600b1a005005414d840a9f30300aa960100b49722009104000014d60600f1f7620091L8;FFfd030091f40300aa68018052f30300aa818e41f8290041d23f0000f12841889a1f2d00f1a2010054680240f9a80000b4600640f901e9", + "7bd3020180523e270094L16;FFe00318aae10317aae3a20094f40308aa09a043a9037040a9f30300aa1a5040b91b0840f9e92300a9e30b00f9971200b444a70094e00317aa0101805218018052BBBBBBBBL8;FB696f6e206372656174656420617420c0012900124661696c656420746f206465637279707", + "420c01b206d65737361676520776974682072617463686574206b65L8;FF00050054abaa40a9610240f94a01088b080500915f0109eba80e00f908098052e933899a490109cb0a0e8052292d0a9b0a0480522a5d00a92a2101a9367d02a9BL8;FF220080524c24019474d643a9750300b496c20091040000", + "14b50600f1d6a20191c0020054c1025df8810000b4c0825df82200805240240194c1825ef8810000b4L8;FF93611932600300542b0440f900fc78d37369283808050091280800f9c00400b5e0030aaac6ffff17e10300a9e00301aae10309aa220080522300805224008052BBL8;FF1f01007168018c9a34", + "018a9a29019f9a4d00001400e4006fa0c302d1e10316aa02048052e30315aae40314aae00302ade00303adf5070094a0877ead88ffffd0L8;FF080d088b0825019108fd46d308050091d4030034890200322911c0da291540d2290d098b2925019129fd46d3290500912001088be10313aa08fdff97f5020", + "035BL8;FFa2020054e80f41b207000014890080d248008052e02300390900f0f2e827003928017fb2e0030091e80300f9a8eaff97e10300aae00301aaf44f47a9f92340f9L8;ZDBBBL8;FB4b65796369706865725f6b65796d61635f6b6579697650656e64696e674b796265725072654b65796369706865", + "72746578746465637279707400000000000000L8;FFc0810054e81340f9938248f84905805209692138280400917f0600b1e81700f9a030005480220291f3fcff97080040b20811c0da081540d2080d088b08250191BL8;FFe1035aada1833cade7ff009400e4006fff7f0e39e8d341f9e9d741f9eadb41f", + "9f0830c91ebdf41f9ece341f9080dc0daede741f9eeeb41f9290dc0daa0833badL8;ZFBBL8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62020054f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6eb031faa6c8e40f9L8;FF8c0102518d00f83761710c8bcb0080", + "52280000149f114071630800544d19c039ae1d00128c390e0b8c1140518d00f83761710c8beb0080521e0000149f014871L16;FFf64700f9f60308aae8af40f9e96b00f9e93342a9e99f00f9e98f40f9e95714a9e9eb40f9e99b00f9e9cb40f9e9eb00f9e9b740f9e9cb00f9e98b40f9e9b700f9BBBBL8;F", + "B6469735f636f6d706c65746573656e64696e675f656b726563656976696e675f637431456b53656e744374315265636569766564456b53656e74437431526563L8;FF200108ab62000054fd7bc1a8c0035fd600fefff000200391f88f009400fefff000600291f58f009400feff9000200c91f28f0094fd", + "7bbea9f30b00f9fd030091BL8;FF00c03191fd0f0194e0fefff000202d91fa0f0194e0fefff000e00e91f70f0194fd7bbfa9fd030091081840b9c8050034080140b20811c0da081540d2080d088bL8;FFb80000b4e0c740f9e10318aa2200805249140094e0e30e9121edff97e0030e91bfedff97e8cb41b", + "9f31b40f9bf02086ba2000054f53f40b9bf02086bf603152aBBL8;FFf6570ca9f44f0da9fd830291f30308aa28008052f4e30091ffa303a9e8ff05a9e8a30091e08702a9ff6b00b9ffff04a9a80f00f9a10900b4560080d2e20301aaL8;FFc082873ce9a304f9801500542083cb3c2183cc3ce9a70c91228", + "3cd3ce8bb01f9e863019120f18f3ce9e70c912083ce3c21f18f3ce9270d912183c73c22f18f3cL16;FFb50000b4e00316aae10315aa2200805249d40094e0431e9115ddff97ff0600f1ebc0ff54e0b740f9e10317aa2200805241d4009402feff17e18b40a9e0432d91BBBL8;FF6a0a00f909692138e1031", + "3aa37faff97770a40f9680240f9080117cbbf0208eb68330054680640f9e10316aae20315aa0001178b47740194e802158b680a00f9L8;FFe1431691ead302f9140d0094e88f49f91f0500b1c0000054e8074091e14316910881099100e1029137100094f87f49f9b80300b4e1d342f9e8cb42f9f97b49f9", + "BL8;FF80825ef8220080524bf40094810240f93f0400b1e0fdff54810000b4800640f92200805244f40094810e40f921fdffb4801240f9220080523ff40094e5ffff17L8;FF80020e91000840b92002003481020e91330840f9d31100b4600640f97f0200eb60050054620240f9400400f9620240f902000", + "0f9200840f97f0200eb61110054BBL8;FFe00318aa09692138e1431691ead302f901120094d6000034e17f52b9e28352b9e343169180008052d61400943f0700b1a0100054e1d342f9e8cb42f91f0101ebL8;FF7a0080520800001400010039d502158be0030191b50318f8073000941f040031400700541", + "f0002716200005436008052070000141f0020716200005456008052L16;FF88a2069198da5fa98066c03d0101c03d88de40f989d240f997fa40f99c0641f9e02b803d6183813ce86700f9e95b00f9361af8b6f9031faae00319aae10316aaBBBBBL8;FB9f1b40000000000034000000000000005d0100000", + "e0000009f1b40000000000034000000000000005e0100002d0000006d6573736167652066726f6d20746f6fL8;FFf50b40f9e80340f9bf0208eb81f9ff54e0030091e8960094c9ffff17e00740ade00313aae81340f9800600ad881200f93da3ff97f44f49a9fb2b40f9f65748a9BL8;FF05faff97760a40", + "f9680240f9080116cbbf0208ebc8080054680640f9e10314aae20315aa0001168b4a1c0194c802158b680a00f9f44f43a9f70b40f9f65742a9L8;FFe06f02f9e00313aae17302f921fdffd021402f91d8f2ff974a1c00948000805221008052431c0094c05001b488008052e06f02f921fdffd021e02d911", + "a0000b9BBL8;FF00801f91fd570194ffc306d1fd7b15a9fcb300f9fa6717a9f85f18a9f65719a9f44f1aa9fd43059100e4006fe8430291090480523f0000f1f30300aaa08302d1L8;FF217c0353811100343f0800716c0100543f040071600300543f0800716102005401e30391a22302d19df3ff97002c0", + "0b5e1031faae7ffff173f0c007180030054L16;FFe20315aa230080522400805228000094770a40f9680240f9080117cbbf0208ebc9f3ff54e00313aae10317aae20315aa23008052240080521d000094770a40f9BBBL8;FF818e41f8290041d23f0000f12841889a1f2d00f1a2010054680240f9a80000b", + "4600640f901e97bd302018052427c0194e00313aa0109805202018052f44f41a9L8;FF88220791d800805294018052000540ade893687915008092e8e30a79e057813de15b813d99000014e8074091f6b345f900230091088109910fccff97e1074091BL8;FFf65742a9fd7bc4a84bfc001428008052bf0a", + "00f9bf2200a961820091000080927482009113f800941f0400f140fdff54f44f43a9f70b40f9f65742a9fd7bc4a8L8;FFeb0f80122c7c10532b2c0633ec0000352a7c0c530b050039090900394a091b320a010039080000142c7c12532a440c330b090039090d00398b6d1c320a050039BBL8;FFa9e31538", + "6901084aab135638a9f315384901084aaa235638a90316386901084aab335638a91316384901084aaa435638a92316386901084aab535638a9331638L8;FF010600546a008052686209916b620a91ea730e396a2647a90001c03d081140b9fb4700f9fb830d91ffdf01f9e9cb01f9e9730e916001803deb0", + "313aa68aa02b9L16;FFfb0314aa4fbc0094e00314aa2100805248bc009400e400b4e1031aaae2031baae06b00f94bbc0094e86f40f99a0100149ade78b3e8ef42f91f0500b180000054BBBBL8;FB2ea0a686816f443e29147616b47240e1051b0595e8330bdda28c02cd2ea6a91191950000ea2740508d60", + "a1644ed5151b26d3654b4a93a242c8b33943df5d9560L8;FF6f2a0b5329010d4a6d360e532c7f8c0a6a7f8a0aae7e8e0a713a0f530b020b4a105d10532f7c8f0a8d7f8d0a6b010c4a4a010e4acc7e910a6b010f4af503142aBL8;FF080f00b4e89b40f9e9c31691eaffffb04a610491e9a305f9e9c32791e", + "8fb04f9080200d008611591e9ab05f9e9feffb029810c91e8af05f928008052a04700d1L8;FFfd7bbda9f65701a9f44f02a9fd030091f303032af40302aaf50301aaf60300aa480c00940004805201018052410c0094600100b4165400a901fdfff021400391BBL8;FFf50300aae88300a90804805281020", + "291e80f00f9e8830091000000ad8082019196480094e86342a9f71b40f91f0500f100090054ff8602f1222c005416048052L8;FF08fd46d308050091091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b4L16;FFf6", + "6702f9e81302f9e8c340f9e46b02f9e81702f9e89740f9fc6f02f9e81f02f9e8d740f9fe7302f9e82302f9e9a349a9f47702f9f4031d91ef7b02f9e82b02f9BBBL8;FF4c6c019400feffb4e10318aae20315aaf60300aa4f6c0194e10740f9810000b4e00318aa22008052436c0194130800b4e00317aae1", + "0313aa220080523e6c0194L8;FFa1e6ffb59efdff17c0fdffb000203d91c3fdffb063c03191c4fdffb084003e91a24700d1e1068052e367009420008052e1028052d8670094c2fdffb042801891BL8;FF2003029142f5ff979e000014f8031baaf9c303913b008092171300b4e806178be00316aa0201805", + "201f17dd342ec009492000014e08743ade00314aae227c03dL8;FFbf3b03d5a50002321800001481fc5f883f00006b8100005482fc018881ffff350a000014bf3b03d510000014e00304aa010080d2010000d40c000014bf3b03d5BBL8;FFfa6702a9f85f03a9f65704a9f44f05a9fd030091ff8308d1f30", + "300aae0a30391fb0305aafc0304aaf90303aafa0302aaf80301aaf7a30391e52b00f983f2ff97L8;FFc01300b4e10314aae20319aafc0300aa502c0094542340f9b4031df8b40100b58200001436008052571740f917fcffb538008052482740f91f0500b121fdff54L16;FF210080524bac0094201400b4", + "600740ade84312910291c03ce94b42f9fa0300aafc6352390104805222008052000400ad0091c13ce85f42f9e0031baae90b00f9BBBBBBL8;FB2f6c69627369676e616c2d70726f746f636f6c2d613434636635613164633062366666632f6f75742f7369676e616c2e70726f746f2e776972652e7273000", + "a64L8;FFf85f45a9fa6744a9fc6f43a9fd7b42a9ff030291c0035fd622feffb042a02391e00304aae10303aae49b0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9BL8;FFe1010054e0031faa1affff17c80080d2e00b00f90800f0f2080900d10bffff17e90b41b2e9a300a910ffff17c80080d208", + "00f0f2080500d104ffff17c80080d2L8;FFe01fc03de013803da003983cb70000b4e00318aae10317aa2200805246200094e14740f9810000b4e00316aa2200805241200094c80180d25f0700b10800f0f2BBL8;FFb3660094f40300aae0e31591e1231091022e8052f5e315914e600194e8cb42f91f0500", + "b160000054a062009146e4ff97f7c742f9f5c342f9970100b4b8220091L8;FF081140f91f0900f1830b0054155040a9f60300aae063009102048052f30303aa81e2009180ffff97886a40b9d40a40f9e00313aaa81b00b9e84301915efafe97L16;FFd0ffff1781620091e20313aa4fecff97000a00b5e10", + "31faacaffff17800400b5e00313aa2dedff97e80301aa40010036e80400b5e1031faac2ffff17e20313aaBBBL8;FB01010101010101010101010101010101010101010101010101010101010101010101000000000000000000000000000000000000000000000000000000000000L8;FFe0630091220080", + "52230080522400805227a4ff97e11740f91efbff17e063009122008052230080522400805220a4ff97e11740f924fbff17e063009122008052BL8;FF000080921bfc00941f0400f1c10100549ffedfc8610640f9e101f8b7600240f92200805244000194e00313aa0103805202018052f44f42a9fd7b41a9", + "ffc30091L8;FFf44f03a9fd430091f30303aaf40301aa5f4000f1280100545f0013ebe8000054e10313aaf44f43a9f65742a9fd7b41a9ff0301913e1100145f2000f108018052BBL8;FF017f0353a10d00343f1000712c0200543f080071ac0300543f040071e00600543f080071610a0054a80355f81f05", + "00b161000054bf6735a9bf0316f8e1620091L8;FFe8eb43b9fbff41f975ce41f9e85b00f9e8ef43b9e84f00f9280340f9680000b4e00315aa00013fd6210740f9810000b4220b40f9e00315aa3f400094df0a00b1L16;FF7ad341a9780b40f9e84f00f9fb030daabaa400b44bc00094e0031aaa210080524", + "4c00094206301b4e10318aae2031aaae06b00f947c00094ed031baa1c050014BBBBL8;FB3c3317640cc06fcb39780cfd72f23b99e3eedec2bbe9f44d37430607d11b0000fb887781f1db4c69aaefa9449d928f4307a6ff0d3c7cf8dc1cf32b6e3c339a56L8;FFe2018052fd7b44a9ff430191dc8b0014fd7", + "bbfa9fd030091081840b9c8050034080140b20811c0da081540d2080d088b0825019108fd46d308050091091c40b9BL8;FFe85b42f91f0900b180710054c90080d20900f0f2294500911f0109eb40840054e02fc13de133c13de0031791e237c13de3032d91e4833291e1feff9021a03891L8;FFf54300f9", + "f44f09a9fdc30191f40301aaf30300aae0230091e103022af50303aa20030094a8c300d1e00315aa47bdfe97a8035df8a083dd3ca9835ef81f0900b1BBL8;FFf80300aae0f5ffb4df0215ebf54702f9f84b02f9ff4f02f928090054f9031faae8031faad60000b40003198be10317aae20316aa47500194e", + "80319aa0801168bL8;FF80fdffd000603e91fc4b009480fdffd000202091f94b0094fd7bbfa9fd030091083040b9c8030034080140b20811c0da081540d2080d088b0825019108fd46d3L16;FFeafb41f9e9f341f9eeef41f9e1eb41f9e8e700f9e8ff41f9e82b17a9e80342f9e9231fa909008092480080", + "52e8270ea9e8030eaa3e0f0014e00301aa190340f9BBBL8;FF930400510b000014f40300aae003082af60303aae20303aae303132acff2ff97e90300aae00314aae30316aa89fdffb5740040f9820640f95f0015eb091a0054L8;FFfd7b43a9f32340f9ff430191c0035fd64c700094c0008052210080524", + "5700094c00200b4a8cc875289c78d52e9cdad7208080079c8008052090000b9680200a9BL8;FFc80300b5200840921f1800f1e2030054217c0353010400343f040071200100543f08007161fdff5481620091e20313aa46fcff97000400b5e1031faaeaffff17L8;FFc20a40f942400091020002cbe11e00", + "1201d01f38c30000cb42fc44d302e01f787400146b20010054e103144b9f120071dfc82138cd010054dfb01f3804148052BBL8;FF3f0700b10018005400c30391c2170094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eba816005439000014f9031faaL8;FFe1", + "0318aa22008052a8031ef84a300094090000141f090071814e0054090180d208df78920900f0f23a0140b274020014ba031ef8f7030291fb1b42f9f63b00f9L16;FFe30318aac0860cadc26e803dc8e200f96f160094b70000b4e00318aae10317aa2200805244b00094b40000b4e00315aae10314aa2200", + "80523fb0009460220091BBBBBL8;FB20686176652072656d6f7465206964656e74697479206b657900000000000000bb124000000000003800000000000000490000000a000000bb12400000000000L8;FF21118a9ade930014fd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d0", + "88b0825019108fd46d308050091090040f93f0500b160040054BL8;FFa90109abe2000054200108ab62010054fd7bc1a8c0035fd6e90309ab63ffff5400ffff9000800e91f413019400ffff9000601d91f113019400ffff9000e02991L8;FFe89b00f933f5ff97ec6b42f9e16f42f9ee7342f9f97742f99f", + "0900b121440054fc0318aaf8030e91ee6b12a9998600b4e18b00f9e0431391e1030eaae20319aaBBL8;FFf4430291e223c03d16108052e1031f2a95020191e08707ade00741ade247803de21340adf87b40f9e133803de40305ade00f42adf73f4339e227803d8002178bL8;FFe12fc33d13210891e0a350", + "a9600600ade17740f9e20313aa23008052081940f900013fd6e06b01f9e8c31791e16f01f9290c40f9e1830b9120013fd6fcfb42f9L16;FF2148109163fefff063200291a0a303d1a2008052840080523cdeff97a18351f8e86341f9f40301aa1f0500b141e0ff540effff17e80f41b2f7feff17a80a0091", + "BBBL8;FF680240f9080540f91c0117eba32e00547b0240f9620740f95f001ceb49150054610340f9370080399700f8b728040091490400d1110000145f2800f188000054L8;FF810000b4e09f49f9220080524a780094b30000b4e07b49f9e10313aa2200805245780094e18349f9810000b4e08749f9220", + "0805240780094e807409108810991BL8;FF609640f901f97fd3420080524af80094689e40f9a80000b460a240f901f97fd34200805244f8009468aa40f9a80000b460ae40f901f97fd3420080523ef80094L8;FFfd7ba7a9022680d2e4830191fd030091f35301a9f30300aaf40301aae00304aa01008052", + "f51300f9aef8ff97e40300aa200000b0020080d200a840f9130000f9BBL8;FFe30318aa04048152e50314aa06048052e05f873de163873ded330194480340391f050071e0420154f91700f94538019400788052210080523e380194407801b4L8;FF21fdffd021203f910202805263fdffb063a01891a402", + "8052fe000014e04305f9e0032a9121fdffd021203f910202805223fdffd063603d9104028052f5000014L16;FFe19bc03d61a21da9e86340f9e1c3039160828b3ce093c03d7ca21ea9e9a346a961828a3c75e20139680601f9e83f40f970a61fa9e95f40b9680a01f9c8f040f8BBBBL8;FB3a20216d73672", + "e69735f656d707479282900000000000000bb114000000000004700000000000000310100000d000000bb114000000000004700000000000000L8;FF420080524c880094e86340f91f0500f1ab000054e06740f901f97fd34200805245880094e86f40f91f0500f1ab000054e07340f901f97fd342008052", + "3e880094BL8;FF29ed0a91a92b3aa9290080d2a10302d16908c0f2a87f39a9a8273ca9ff0301944083cf3ca88355f8bb0353f8b5df73a920b7803de83304f9e8f304f94003803dL8;FFe1835ba93f0400b1a0020054ff0600b1600200544a0080d2e8e740f9490000900a00f0f2200d00f9490000b03f030", + "aeb28ed03f9e103005408488852e801a072BBL8;FFe80300aae00301aae8fd07362400001428008092680200f9ffc30a91f44f43a9fc0b40f9f65742a9fd7bc4a8c0035fd6f55355a9e8430591f6b340f9e0030091L8;FFe00600adea1700f9000504ad020d05ade90b00f9bc0000b4e0031baae1031caa2", + "200805244480094fbe30091a80302d1e10316aa60c30291bc0302d12571ff97L16;FFe8a343f9f9a743f9e9ab43f9eaaf43f91f0500b140820054e0e3c13de1e7c13de2efc13de88b07f9e0d7833de0ebc13de1db833de1dbc13de0df833de0dfc13dBBBL8;FF370140b218400091190300909bfffff07bb", + "30b915c048052fa2ec0f2350080520b000014e00640ade0c30091e10314aae08701ad9165009400040037d6a201f1L8;FF54680094e90344a9080009eb630e0054ff0208eb68080054340117ab420e0054f42300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bBL8;FF97fe03a9", + "81620091e20313aacef7ff97a0fbffb454000014a00c00b5e00313aa2ef5ff97e80301aa60000036c8faffb467000014e1031faa882600f9d3ffff17L8;ZDBBL8;FF818308ad0801094be99741b962c3883ce8e300b9e8cf40f9ead700b9e9bb00b9684308f84b240094fa0301aae106f8b6fb031faae003", + "1baae1031aaad6230194L8;FF1f1900f102020054017c0353210200341f1100f160020054e003082ae20313aae303142ab5ffff97c0fdffb4d2ffff17280180d2e00700f90800f0f2081500d1L16;FFea3200b9ea6a40b9f4ce03a9f6ea04a9eca605a9ea6a00b941fcff54f40740f9b6577ea9b8835df8f", + "b1f805233008052e00314aaf70314aa57000014338740a9BBBBBBBL8;FB776e207365616c65642073656e646572206d6573736167652076657273696f6e20c0001b737071722076312e73656e645f656b2e73656e642065706f636820c0L8;FFf48300a9290080529f0600f109000079e90f00f9a0130054", + "1504007941008052770100f0f7420091fb0b40f99f0e00f138feffd018833091790100f0e10f00f9BL8;FF00002491001e019400fffff000602491fa1d0194ffc300d1fd7b01a9f44f02a9fd430091280840f9290040f91f0002f1431a00543f0108eb1360193220010054L8;FFe9a34039bc731df8b6f31", + "df8a8731ef8a9f31e38991fff971a00005217000014f5031caae91b40f9eae340397a5f1833e89343b8eb3f40b9e91300f9eaa30039BBL8;FFb7035ef81dffff17a0c300d1e10317aae20316aa2300805224008052b6edff97b7035ef8ba035df8480317cbdf0208eb09e4ff54a0c300d1e10317aae20316", + "aaL8;FFbfffff17e00313aae10316aae20314aa67010094760a40f9680240f9080116cb9f0208eb69f8ff54e00313aae10316aae20314aa5e010094760a40f9bdffff17BL8;FFf44f47a9f65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6370080521800809219018052a80640f91f0116eb091", + "00054e00313aa28efff97e80300aaL8;ZDBBBL8;FB6579730000000000650d4000000000001100000000000000b4010000110000007265757365642062617365206b657900650d4000000000001100000000000000L8;FFe11740f9e80f40f91f0101eb40500054e81340f92a040091e00315aa49018052e", + "a1700f9096921385afbff97e1630091bb8fff97807240f9800100b4e11740f9BL8;FF65170194883a4039693a4039b502000a1f01096be0179f1a5f170194883e4039693e4039b502000a1f01096be0179f1a591701948842403969424039aa02000aL8;ZFBBL8;FFe82700a9e80300910900009029113f9", + "1200440a9e82701a9e8230091090000b029410491e82702a9e3430091df3d0194fd7b43a9ff030191c0035fd6202040a9L8;FFa8031df8b248ff97e80300aa81fdff9021e4139183fdff9063001391a0c300d142018052a4008052a8031df83748ff97a1035df8e80740f9f30301aac80000b4L16;FFeefb", + "0ba9eb9b06a9e6030aaae1df00a9fcbf00f9fba31da9a80100f0ef3300f9e56f00f9f6b70aa9f86700f9e0d300f9f1cb07a9ec7b00f9e0b3823d081140f9BBBBL8;FB47000000000000009b0000001b000000ef104000000000004e00000000000000b904000017000000ef104000000000004e000000000", + "000005707000005000000L8;FF4a2501914afd46d34a05009111000014e9031faa10000014f5031faa681a40f948f6ffb5f6031faa770a40f917f7ffb5e80317ab23f9ff5400feff9000800c91BL8;FF48c141393f0500b1f3db02f9ffef02f9ebab08a9e89f00b9eae702f9fff702f9fa4300f900330054", + "f9a740f9f88342b9190700b4f3a340f942120194e00319aaL8;FFfa030faaf60310aaf8030aaa4a120094ee0317aaeddf5aa9ebcb40f9ea0318aaf00316aaef031aaaec0319aae2c740f9e08756a9610200b4e2af18a922008052BBL8;FFbdddff97f80f40f9b1ffff17e023009122008052230080522400", + "8052b6ddff97e10f40f9b7ffff17e0230091e10316aae20314aa2300805224008052aeddff97L8;FF5a1f40f9fc0300f9fb0f00b9f96301a9f75b02a9f54f03a9937e089b49520094e00313aa0101805242520094a0831df8201100b4080d8052b3835df8fc031faaL16;FF083840f9e8ab1aa90aa047a9e", + "aa309a908dc48a90af840f9e8df00f9084c40f93f030aebea8300f90e284fa9e8af15a908684aa9ee9f00f9e8c700f9082c4ba9BBBL8;FF610a40f9e00315aaf2feff17f50300aae00313aa220080522300805224008052b5fdff97610a40f9e00315aaf6feff17e00313aa220080522300805224008052L", + "8;FFe04316912200805269110094e1d342f98ffcff17e04316912200805264110094e1d342f95efdff17e0431691220080525f110094e1d342f984fdff17f40300aaBL8;FFe10313aa54692838080500911f0048f1680a00f9a3fdff540b7c0e533f0108eb7361193220010054536928380cfc5cd3080500", + "91290040f9280800f94c0200b5L8;FF00040051601a00b962420079411d00b4000080d21f000039007d20d461400d9163c00d913f1400387f0001ebc1ffff54c1020e912300805223400e39a7ffff17BBL8;FF4d320194e19f49f9810000b4e0a349f9220080524832019460220291fa0a009408fdff17f3", + "7749f97f0600b180030054e19b49f93f0400b140010054810000b4L8;FFe1e3179102278052fce314a9f5af00f95032009412000014da0640b27a6e00a9797201a9785602a9ff074091ff433291f44f45a9f65744a9f85f43a9fa6742a9L16;FFe20302ad53b20094e0a30191e10316aa732a0094e8e3079", + "1e0a301916c280094e8ff40f91f0500b1e0040054e82f40f9f53b01f9bf0208eb61080054e8e70391BBBBBL8;FB61676512626164204b454d206b65792074797065203cc3200080690400013e0019756e6578706563746564204b454d206b65792074797065203cc32000806904L8;FF549a00948803190b", + "bcc303d1a8f314387fff03f160030054a8f3543869070011e98300391ffd007120ecff54a96a2838080500116bffff1720feff9000803891BL8;FF572340f9b6831ef8b8431fb8f70200b4561f40f94b1a0194e00317aa21008052441a0194800700b4e10316aae20317aaf40300aa471a0194582f40f9d8", + "0100b5L8;FFc6c03591e96b02f969e20191e40fc13de15b813de1fbc03de0431391e243813de227c13de1830891e04f813de00bc13de2830991e157813de113c13d63c20391BBL8;FF610200ade083c43c68f20df8a8035cf8699e0339a9835c78600a01ad78f20cf876e20ef875620ff868e20ff8690e02", + "79f6feff1799ffff90397719911a038052L8;FFe12f833de233833d6190ff54e06317917df8fe9780fcff1721010054810000b4a01240f922008052435a0094a11a40f961f4ffb40804805205000014a11240f9L16;FFe0e0ff97e10300aae0f4ffb437010014603a00b5a0c303d130e7ff97e80301aac00", + "80036883a00b5e1031faa9effff17003500b5a0c303d128e7ff97e80301aaBBBL8;FF530040f9680640f9a80100b4690240f9200180398001f8b729050091080500d1692200a9200000f9e0031faaf44f44a9fd7b43a9ff430191c0035fd6e80741b2L8;FF6b0d009135000014eb031faa3e000014f3031f", + "aa0901098b0a0e8052f4cf42f9210108cb00510a9b33110094e00314aae10313aa30110094d50000b4a8e279d3BL8;FF6100005473060091a3ffff17130500a91f410039f44f45a9fd7b44a9ff830191c0035fd6890480524a008052132500a90a410039f44f45a9fd7b44a9ff830191L8;FFce11889a1f0", + "046f24a018e9abf0100f10df07cd30a018a9a6e018b9a9f0500710a118a9a88010d0a61118e9a0901096a480142b208118a9a0001e8b6480543b2BBL8;FFdf35011408a440a9e20301aae00308aae10309aa10360114ffc300d1fd7b02a9fd83009109200091e80301aae50300aaa9831ff849ffff902b81", + "359141ffff90L8;FFf89704f9f8a304f90001803de88324910011803d0081853c08018052e8bb04f9e8432491e98b04f9ea8f04f9a002813ca082823cf8af04f9f9db04f9f90f05f9L16;FF6a1142b8e00718ad6181ca3c6081c83c5b8109aae9635e39eac35e39e28714ad6181cc3c6281c63cf503092ae", + "aaf00b9ea6f44f9e48715ad6181c73c6b9143f8BBBBL8;FB21732a6337533c430d3306231b13100379f372e36fd364c355b35ea343934883d885d395cea5c5b5f4c5ffd5e2e5e9f580058b1596259d35ac45a755ba65b175L8;FF000e00b4fa0300aa4e8a0094e00315aa41008052478a0094400d00b4fb0", + "300aa488a0094e00315aa41008052418a0094800c00b4fc0300aa428a0094e00315aaBL8;FFf46f41f9e8c31791e91f46b900c1c03c01c1c13cf5fb45b9880240f9f36b41f9e94305b9e04b813de14f813d680000b4e00313aa00013fd6810640f9810000b4L8;FF8effff17e0230091e10319aae20317aa", + "23008052240080523de6ff97f90f40f9e80740f9080119cbff0208eb09f2ff54e0230091e10319aae20317aa23008052BBL8;FFf70600d138a001917c03148bd6000094a08641ad94a20191a216c03da30ac03de10318aaa8835ef8808701ada083d83ca183d93c8217803d800700ad883300f9L8;FF84c0", + "2791a27f0091e1068052ea45009420008052c1008052df450094ff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9L16;FFe8e703f9e8af40f9feff03f9e8ef03f9e8c740f9ea0704f9e8f303f9e88b40f9f20f04f9e8f703f9e8b740f9e71f04f9e8fb03f9e8eb40", + "f9ef2f04f9e80304f9BBBL8;FF1f4f03a91c6300b9282300f9e9030054281f40f9090d80523a2300f94823099b010140f93f0400b1000300541bf141a9196943a914e144a9810000b4000540f9L8;FFd60600f1b5a2019181ffff54682640f9c80000b4090d8052e00314aa02018052017d099b446a00946", + "17e40f93f0400f18b000054608240f9220080523e6a0094BL8;FFe0030091e80300f9b1f0ff97e10300aae00301aaf44f47a9f92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd637008052180080921901805206000014L8;FFebe5ff970000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000000000BBL8;FF290000b029a10491e8a703a94800805229ffffb029810c91eae30091a04700d1e8271ca908fffff008251891e82b1ea90a078052c8048052ff2719a909fffff0L8;FFe00751ade0430991e293c03de3", + "77c03de1030e91b60302d1e00b813de10f813de0074fade213813de3f7803de0071fade00b50ade003813de1834cade207813dL16;FF1f0109eb49030054890208cb6b0240f94a0109cb3f010aeb890100546c0114cb9f010aeb23010054080e8052610640f98006089b48e179d302110acbf44f41a9BBBB", + "BBL8;FB312e31322e312f7372632f6c69622e727300174b657920616c7265616479207265717565737465643a20c00010626164206b6579206c656e677468203cc0153eL8;FF09010054a806c05a08682178210800917b0700f1a1831ff8c1feff540d000014a06300d14200805223008052240080521fc2", + "ff97a0077fa9a806c05a08682178BL8;FF680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd6f50300aae00313aa2200805252020094610a40f9e00315aaccffff17f50300aae00313aa220080524b020094L8;FF220080524c1e009417008092f61341b2d9ffff17e00316aabb8301d1c7ffff1720fdfff00", + "0003391f8190094ff8301d1fd7b03a9f65704a9f44f05a9fdc30091BBL8;FFa1220091022a8052525e01940200001417008092818a40a9e0030091f8030091ef22009400830091e1c30591022a8052f70f00f9475e0194ff0600b100080054L8;FFf49706f91f01096be83f40b9f7cf06f9f7d706f9f5b70", + "db9f3df06f9f8eb0db9e8f70db9410a0054e39348a9e0c31291e2db42f9e5f35639e1833291e6031f2aL16;FFe80240b20811c0da081540d2080d088b0825019108fd46d308050091b60a40f9f60b00b4c90240b22911c0da291540d2290d098b29250191c91a498b29050091BBBL8;ZBL8;FF03e4006ff6", + "c744f90083c03c0183c13c0283c23ce007409100c0359101088052f6ef07f9e0fb863de1ff863de203873df60b0ef9e36b873de367873de363873dBL8;FF220080524cfe0094e00313aa0103805202018052f44f42a9fd7b41a9ffc3009145fe001460fa7f92280000cb010102ab62010054a101f8b72200", + "8052f44f42a9L8;ZFBBL8;FF6a261d2968c20339da0500b531000014e08744ada90356f8691a00f909008092608600ad692200a91c0400b524000014443e0194c0068052210080523d3e0194L8;FFe10316aa220080524b3e0094e16340f9810000b4e05b40f922008052463e0094f6fe60d3ea031caaf85", + "b00f9f80315aa68c6533955ff48d348380036b5010014L16;FFa04200546003c63ce1d302f9e1c31591e0d702f9e0831d91ef7300f9eeeb00b9eccb02f9e9cf02f9eadb02f9fadf02f9f9e302f9a0818d3cf6bb02f9ebbf02f9BBBBL8;FB7d479d423f94da7da28c1dbe03560000b714bd6ced05dafccf73", + "a2ccc74918d9b1c272282b2fa4aae8600b70f9ef08d994ca63628cac268b711645dd061128eaL8;FF207300b4f30300aaf4031faac8038052f5fdfff0b54a399136008052e84b01f9e04f01f9ff5301f90b0000146802148bc903805294620091090100a9b5f20091BL8;FFe0a33239e08332910800f0f2f", + "fa73239e85306f9ae140094e10300aae15306f9e0833291e1feff9021203f9102028052e3feffd063bc1b91c4028052b8000014L8;FF4c0e0094a00300b408fdfff0083d3e91090140f9086140f8090000f909fdfff029cd3d91086000f8c8008052e92302a9c8018052e90741b2e02301a9e0030091BBL8", + ";FFff430191c0035fd6097d1c53490d00342910c0390a00be5208010a0b2a1d00120901f83708710a8baa00805208a800a91f0000f9fd7b44a9ff430191c0035fd6L8;FF1f0500b1c1dfff54e8031faa080113aba306005480fdffd000c03691f7490094f3031faa080c47f81f0500b121e3ff54e8031faa", + "080113ab6305005480fdfff0L16;FFe81300f9e86742f9e89f00f9e88342f9e84300f9e89742f9e87b00f9e89f42f9e8d300f9e8ab42f9e85700f9e8b342f9e8a70ba9e8b742f9e9c742f9e8431ca9BBBL8;FFe1000054e84340391f050071ec030054c8040035e90f41b22d000014e89340b8e90f40b9ec", + "234079ea2341b8eba34039680a00b9e82f407969b200b86cf20078L8;FFe00600ad808601ade8b700f9bc0000b4e0031baae1031caa22008052466e00945f0b00b1c1f2ff548082c23ce8bf40f9e0430691e1e30091022180528002803dBL8;FFf85f03a9f65704a9f44f05a9fd030091ff430bd1081c001", + "21f09007181010054e00302aaf30302aaf40301aa2bfbff97200200377a0240f9480740f91c0101ebL8;FF60010054e003154bbf120071bfc820388d010054bfb01f38b5c01fb875d25f38b5120012b5820151a41e001264d21f38f40313aaf76343a9f96b44a9e2ffff17BBL8;FF00011a8b532e0194f90", + "b40f94803188be8d302f97f0700b1fb0314aaa053ff54e80740910881099100210491e14316911310009497faff1720ffffd000800291L8;FFe13b40f9e8833f9100001891e243239160c7fe97e8074091e0833f91e103279108011891e28324912ec6fe97e10b46a9e00740910000189149c8fe97f4034b", + "f9L16;FF220080524cae0094610e40f9610200b408048052606a68f822008052f44f48a9f65747a9fd7b46a9ff43029142ae0014610240f9080080921f200039080000f9BBBBBL8;FB6a00000000000000e30000002e00000042024000000000006a00000000000000800000002e00000057686973706572", + "5072654b657953656e6465724b6579506cL8;FFa003dc3ca103dd3ca203de3ca303df3ca303983ca203973ca103963ca003953ce8270e294809c05a6909c05ae8270f298809c05aa909c05ae8271029c809c05aBL8;FF1f0009eb28dfff5400ffff9000e00e91fa11019400ffff9000402691f7110194fd7", + "bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091084c80b9f30300aaL8;FF0800f0f20a017fb2081d4092e0431391ea6b02f9280108aae86f02f933efff97e15341f9810000b4e00316aa2200805241160094e15f41f9810000b4e06341f9BBL8;FFa14301d1e00315aaa8031cf837dcff97b6035cf", + "8b4035bf8880216cbbf0208ebc8220054150100b4a8835bf8e1031caae20315aa0001168b46560194d602158bL8;FFf55f12a9e92b00f9e8a300f951560094ff0600b19542039141020054e8031691e00316aa2b510094c8624039a9fdff9029012f91e9d302f9fbc342f9f5c742f9L16;FF1f0d00b14116", + "0054e1b340f9280080527f2200a9080080923f0400f17f2201a98b000054e0b740f92200805242d60094e883059100c100910ddeff973a050034BBBL8;FFe20315aa0001178b52760194e802158b680a00f9882640f91f0500b1a0090054610a40f9680240f91f0101eb40310054680640f9966240b92a04", + "0091952e40f9L8;FFf4074091948209911f0500b18000005480020491e14316912a130094e8cf49f91f0500b180b5ff5481e20491b4010014e1d342f9e8cb42f91f0101ebe0770054BL8;FF4df6009461d640f9810000b460da40f92200805248f6009461e240f9810000b460e640f92200805243f600946", + "1ee40f9810000b460f240f9220080523ef60094L8;FF60824039641e40b9631a40b90610001265424079001040d38300032a4220c01a2400030b42040051a02c46d39f00026be0000054232100351fbc00716d1e0054BBL8;FFe9d742f97822012908008092680200f9490d00b4e8d342f91f0115ebea339", + "59a08010acbaa0208cb33010aeb091d0054e90315aae8000014e81b40f91f0500b1L8;FF3f0400b100010054810000b4e0ef41f92200805248360094e8430f91008100915af0ff97a80359f8e05ac03de1032a91022b8052f6f701f9e8f301f9e8430f91L16;FFe1031aaa220080524bb60094e16f40f981", + "0000b4e04740f92200805246b600949b0200b4e04b40f9e1031baa2200805241b60094f9031faaebffff17fb031faaBBBBL8;FB5f000000050000001d1c400000000000540000000000000065000000050000001d1c400000000000540000000000000073000000050000001d1c400000000000L8;FF6909", + "c05a682601298809c05aa909c05a68260229c809c05ae909c05a68260329f44f48a9f92b40f9f65747a9f85f46a9fd7b44a9ff430291c0035fd6ff4302d1BL8;FFf56340f9e8031691e00315aa31010194a8624039f5c342f9f7c742f9e8631639880280d22007c03d0800f0f21b2100d14003803de86301", + "9100610c9158dfff97L8;FF39c300918001005421035ef8810000b420835ef8220080524706009421835ff8e1feffb4200340f92200805242060094f3ffff17e83e40f9c80000b40805088bBBL8;FFa20180526401805214000014a0831cf841fffff021e0009143fffff063840191a0e300d1a201805244", + "0180520b000014f80300aa0b000014a0831cf841fffff0L8;FFa10640f9610300b4a20a40f9e00314aa17000014745656a9a80240f9680000b4e00314aa00013fd6a10640f9810000b4a20a40f9e00314aa3f46009468664539L16;FFea1f44f9e9a744f9ea9f00f98ae20791f43744f9e92b07f9e92344f", + "94001c03dea5f44f9e90f00f9e92744f9e093833de91700f9e92b44f9e92b00f9e98744f9BBBL8;FF08e10d91e8ab08a96a06805248048052ffa703a989ffffb029e51c91e9ab05a9290080d2c92cc0f2e8ff04a9e8a707a9fa610194e10340f9810000b4e00740f9L8;FFe00313aae10314aaefffff17e0", + "0301aaf30301aae10309aa22008052f4030aaa630500946ba240a9ea0314aae10313aadeffff17ffc303d1fd7b0aa9f95b00f9BL8;FF11000014c80080d2e0230039e00300910800f0f2ff270039e80300f9acecff97e80300aae80300f9a1feffb021681391a3feffb063a80d91e003009142018052L8;Z", + "DBBL8;FFf30b00f9fd030091080040f9f30300aaa80000b4600640f901f57ed34200805245260194680e40f9a80000b4601240f901f57ed3420080523f260194681a40f9L8;FFf40300aaf6031faae00316aae10314aae1210094a00100b4f50300aa49260094e00315aa21008052f40315aa36008052402", + "60094a0feffb4080740f9f50300aaL16;FF9f02086be9979f1a29219f5a291d0072a01600542a4c40b93f050071610300548902086b032000542b4840b90c358c527f0100718b018b1a3f010b6b09050054" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines4 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines5.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines5.lean index af878020e..8751ac9d5 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines5.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines5.lean @@ -27,360 +27,252 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub5 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF8c8101910dd082520900001410120012ef150012ef19102af02500511f160071820200545f0109ebc0fdff54ee0309aa2ffddf382fffff36e9030eaa30eddf38L4;FF4c0200b500fc55d336000014e10300a9e00301aae10309aa220080522300805224008052a3000094e10340a92aa0", - "40a9536928380cfc5cd308050091290040f9L8;FF750214ab02080054280840f9170114ab02080054290040f97f0208eb360114cbe1000054950200b416030037c80240b28902009029411e9117000014f80300aaBBL4;FFe1031aaae20319aa24008052e84301398e020094be9f01940004805221008052", - "bc9f0194602300b4e08743ad08048052e80302a9e2830091e103152ae81b00f9L4;FF3f00056ba80600541fc01f3801e01f7802d01f38610000cb2100146be503022a60010054e503014b3f1000717fc82538ed0500547fb01f3861c01fb801d05f38L8;FF73a20391810100d0218c1491a32300d1820080", - "52e40313aab4831ff80da0009488620091810100d0219c1491a32300d182008052e40313aaa8831ff805a00094BBBL4;FF1f0400b161840054e8df01941f100031e1830054f9ffff17e5df0194f70300aa1f0400b141fdff54e043059181008052e0df0194c0820035e85341b9e86f00b9L4;FB706c69745", - "f746f206f7574206f6620626f756e64733a20c004203c3d20c0001073756273657420706f696e7465722028c0202920697320736d616c6c65722074L8;FFe8979f1a08219f5a081d0072c07600541f0500712179005488008052e1eb41f9620a00f96822003908008092680200f9810000b4e0ef41f92200", - "8052b8df0094BL8;FFf50b00f9f44f02a9fd030091f30302aaf40301aaf50300aabd5f01940006805201018052bb5f0194400100b4155000a9e10200d021c00891130800f91fa00039L8;FF210100d021443791230100d063603691a0c300d142018052a4008052a8031df8f254ff97a1035df8e80740f9f", - "30301aac80000b4e00b40f9e10308aa22008052BBBBL4;FF8c0d4d8b9f1d00f1690000540c10805205000014ac0a40f98c050091ac0a00f9ec1f80520c692b38a80e40f94c21003921815cf8080500d1a80e00f93f0400b1L4;ZFL8;FF00203791ccff00946002009000803791c9ff00946002009000e037", - "91c6ff00946002009000403891c3ff00946002009000a03891c0ff00946002009000003991BL8;FF138001943303009073a22391010300d021742191e0230091a32300d142028052e40313aab4831ff80a80019488620091010300d021bc2191a32300d142038052L8;FF887240b91f050071a1000054818", - "a4e29e3630091c0008052a692ff979f0f00b100020054e11740f9e80f40f91f0101eb607c0054e81340f92a040091e00315aaBBBL4;FF085440f91f0500b180020054f40301aa09044ba9a8a300d1e00309aa54960094a8835d381f050071e1020054880300f008210c91090480520b00001428008092L4;", - "FB657972656d6f74655f726567697374726174696f6e5f69646c6f63616c5f726567697374726174696f6e5f6964616c6963655f626173655f6b657970656e6469L8;FFe10302ade20347ade20301ade1034aade10304ade20349ade20303ade1034bade10300ad51ffff1736008052e00745ad88220791e", - "233c03d89fa40f9a0073badBL8;FFda3f01941f04003180080054f40f40f9760080520800001400010039b402148ba08300d1f40f00f9d03f01941f040031400700541f0002716200005435008052L8;FFe8a701a9d43f0094e00000f000603f91c93f00940001009000001191c63f009400010090006011", - "91c03f00940001009000e00c91c03f00940001009000400d91BBBBBL4;FFccffff17b7835df8daffff17e00700f9210400d021001891230400d063182891e0230091020180526400805209000014e00700f9210400d021001891230400d0L4;FF09c50039e9ab4d290ac9003909cd0039e9ab4c290ad1003", - "909d90039e9ab4b290add003909e10039e92b49290ae5003909e90039e92b48290aed003909f10039L8;FFff4302d1fd7b07a9f34300f9fdc30191f30308aa28008052e10300aaffa300a90804805269020090292138910800ac72e0e30091e9a302a9e8230091e2031f2aBL8;FFe20315aaf70300aacd8f", - "0194381740f9980300b4341340f9bd8f0194e00318aa21008052bb8f0194402000b4e10314aae20318aafa0300aac18f01943b2340f9L8;FFe3430091e38f0094fd7b44a9ff430191c0035fd6880100b008b12d91e00301aae10308aae2018052fd7b44a9ff430191f98f0014fd7bbfa9fd030091081840b", - "9BBBL4;FF22008052c6cf0194b50000b4e00318aae10315aa22008052c1cf0194e86b40b9f88b40b9fa0313aaf3031faaf5e702a9081d0012f50f00f9e81700b908018052L4;FB175d175dd5f6fb9cd8e5d8e5d5f6d5f6d5f6d5f6a28c21e7e717e717a28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca2", - "8ca28c0000e26d56e256e200000588L8;FFecab40f9e0bb40f9ed0316aafb5340f9e9c340f9e8f341f9e9c300f909008092e4c34ca9ef0303aae82b01f948018052ee3b40f9e8270ea9e8a74ba9ecab00f9BL8;FF3c000014280300d008b140f9480300b4e84301912900009029d12d91a82734a92800805", - "2c90200f029210091aa0303d1a04700d1e8a711a9c80200d008292c91L8;FFe80f40f9e8cb02f9e80317aae0832291e1031691e8c702f960e4ff97e20f4ba9e0031691e5134ca9e11f40f949e3ff97e8c342f9200bc03dfbc742f9e9db42f9BBBBL4;FFe093c43ce193c53ce8230191e0830091e00701ad4", - "fcc0094e82341391f050071c0020054e093c43ce193c53ce293c63c600600ade093c73c620201adfd7b4aa9L4;FB726563697069656e7420726564756e64616e746c7920656e636f64656420617320656d7074790000ea984800000000002e00000000000000a702000031000000L8;FF9f3200f9e10314a", - "ae20313aa4d010094c00300b5e1031faad6ffff17c1010054e1031faac2ffff17880080d2e10700f90800f0f2baffff17e80b41b2e00700f9BL8;FF800240f922008052c56f0194f8ffff177f6a00b9f44f42a9f50b40f9fd7bc3a8c0035fd6ff8300d1fd7b01a9fd430091080040b9a01300d1a8c31fb80", - "7700194L8;FF3f0700b1f90b40f9007fff5401c30391e24316916000805213110094f3fbff17e8031faa00011aab62670054e14316914f0d0094df0600b18000005480220291BBBL4;FF08010aaa69a200a908008092680200f9e82b40f9a80000b4e01f40f9e12b40f922008052beaf0194e82340f90805", - "00d11f0d00b1a8000054e01b40f9e12340f9L4;FFff0700f96f0f0094e80740f91f00007100019f9afd7b41a9ff830091c0035fd6e6080014ff0301d1fd7b01a9f65702a9f44f03a9fd430091f30303aaf40301aaL8;FF2001c03de23080526822003928f140f809088052696603a9696204a9e903089160", - "92803c21250091680e00f9480080527f2a00f968620139c1af0094b6f7ffb5BL8;FF280700b4e1f342f9e2f742f9e8833291e0db42f9e44b40f9630302913291ff97e8833291fc5346f90081c03ce85f46f99f0b00b1e0d3823de8ab05f901080054L8;FFe2431a91c1058052e84b03f9e94f03f9d32f009", - "4e000009000c00191d72f009420008052e1031aaaca2f009420008052e10317aac72f009420008052e10319aaBBBBBBL4;FFfd030091087040391f0d0071a101005413d040a9880240f9680000b4e00313aa00013fd6810640f9c10000b4820a40f9e00313aaf44f41a9fd7bc2a8b8170214L4;FF200740f", - "922008052c5170094211340f9015901b4201740f9050000141f0900f1210740f9615801b4200b40f922008052ff0b4091ffc32791f44f45a9f65744a9L8;FF620200d042c00e91e1430091e82702a9d1170194600200d000200f91c6170194ff8301d1fd7b01a9f91300f9f85f03a9f65704a9f44f05a9fd", - "430091160440f9BBL4;FF9281ff9720f8ffb4f70000143f0c0071e00400543f10007101f7ff54a80355f81f0500b1800b0054e1220191a2e300d18681ff97a0f6ffb40c0100143f1c0071L4;FB0a1f0f07190c06150a051208041f0f071c0e060000000000000117021d1813031e1b190b1408040d1f161c", - "121a0a070c1511090610050f0e0000000000000000L8;FFa9c317386901084aabf35738a9d317384901084aaa035838a9e317386901084aab135838a9f317384901084aaa235838a90318386901084aab335838a9131838BBBL4;FFe80315aae00314aae303132a220100540c0000141f2100391f0100f9c", - "0035fd6e80315aae00314aae303132aab000054c3000836094841b93f11007162000054L4;FB65706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f696e6372656d656e74616c5f6d6c6bL8;FFe88b45f9f13746f9e33b46f9f03f46f", - "9e8b300f9e89345f9e8ab00f9e89745f9e92312a9e89b45f9e99f45f9e8ab1aa9e8a345f9eac745f9e9a309a9e8b345f9BL8;FF40020054e1d342f9e8cb42f91f0101eb60b70054eb074091e8cf42f92a0400916b810991490380526001029109692138ead302f9e71b0094e143169164110094L8;FFcaf4", - "ff974010003641eeffb421010014e18f0cb96fffff17a88357f8080540f9150101ebe200005481010014a22302d1630c8052abecff97e10300aa203000b5BBBBL4;FFf73b40f9f65748a9fd7b46a9ff830291c0035fd60001805201028052d8f70194000400b000a01991d4f70194ff0304d1fd7b0ca9f76", - "b00f9f6570ea9f44f0fa9L4;FB454d206b6579206c656e677468203cc0153e20666f72206b657920776974682074797065203cc0013e001b626164204b454d2063697068657274657874206c65L8;FFe80b41b2e00700f9b1ffff17c80080d20800f0f2080500d1adffff17c80080d20800f0f208090091a", - "9ffff17e00300f941020090217c189143020090639c1491BL8;FFb08354f8af3b7329aa277429b8237529b12f7629ad8357f83f0400b1ac0359f8bb8313f880040054f28304a9a02303d1f14700b9ec4302a9ef3b0629ed1f00f9L8;FF08b140f91f0900f189040054e8633f91e90000d029c10491e8bb0e", - "f968008052e1074091e9bf0ef96901009029212791e84b09f96801009008290491e94f09f9BBBL4;FFfb0301aa6101f8b6f4031faae00314aae1031baacfb701943a008052e0031baaf78f0094e8031baafb0301aae1feffb7e80700f9f52700b95b0200b4f50300aaL4;ZDL8;FFfd7b46a9ff430291c003", - "5fd648008052e91f80520840003909200039f44f48a9f65747a9fd7b46a9ff430291c0035fd6a85300d1690100d029910491f60301aaBL8;FFf4031faae00313aa080c45f81f0500b1c1fdff54f40314abe2020054688e48f81f0500b140020054e00313aa84ffff97080040b20811c0da081540d2080d08", - "8bL8;FFf8830d91dd070014f74300f9f7031c2af65b00f996ff60d3619243f9810000b4608e43f922008052bd370094619a43f9810000b4609643f922008052b8370094BBBBBL4;FF0809009110ffff1761030054e0031faa89ffff17c80080d2e90b00f90800f0f2080900d108ffff17c80080d2e90b00f", - "90800f0f2080900d171ffff17e90b41b2L4;FFb402148bff0a00f1e80316aaf40f00f9a0010054e90740f9215442a9290114cbbf0209eb88050054b50000b46002148be20315aac2070094e80316aa8902158bL8;FF600000541f0800f9c0035fd6ffc300d1fd7b02a9fd830091e8030091e1031faa0be6f", - "f97e80740a9e20341a9081140f900013fd6fd7b42a9ffc30091c0035fd6BL8;FF694e41b949020034290140b22911c0da291540d2290d098b2925019129fd46d329050091340108ab63010054db000014e8031faa690a40f989faffb5691640f9L8;FFfa6702a9f85f03a9f65704a9f44f05a9fd030091ff", - "4307d1f50301aaf30308aa15010037bf0244f149010054280080524900805268220039690200f99c000014BBBL4;FF9f9700f961630091a26301d18fb1ff9760f4ffb4360000149f5b13a99fa300f961c30091a26301d188b1ff9780f3ffb43a0000149f5b10a99f8b00f9e1030691L4;FB616d706c65640", - "02f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f30363935L8;FF48008052fe030daaef0314aae94f40f97102001428008052e85f00f9b80000b4e00314aae10318aa22008052bcc70094b90000b4e07740f9e10319aa", - "22008052BL8;FFf65743a9f85f42a9fd7bc5a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f090071e1010054e00302aaf40302aaf30301aaL8;FFf65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091150840f9080040f9f40302aaf30300aa08011", - "5cb5f0008eba8010054b40000b4680640f9BBBBL4;FFd3a20039c80200b94301001408358c52f50302aa3f01086b290500546804009008b140f91f0d00f1a3040054e8030291a90000b029312491e8270aa9e8630291L4;FB200000000000000008000000000000006ca14000000000008c2140000000000", - "028000000000000000800000000000000c8a24000000000000000000000000000L8;FFc2260054217c0353e12600343f0c00712c0500543f040071e00600543f080071200900543f0c0071210800541f0800f101420054a0c303d1f76301f9f77f01f9BL8;FFf3570ba9e80700f9e81300f9e81f00f9e82b", - "00f9e83700f9e84300f9e84f00f9f36300f9ba6701942000805221008052b8670194600a00b4680240b209188052L8;FF0283843c0183803c0083813c40030094fc2740f99f1700f188fbff54ea430f91e8e3009129008052448948adec030b91408541adf81f40b9e95300b94231803dBBBL4;FF2400805", - "2da9aff97bae77ba9a1035bf83c230091546b39f83f001ceb28dfff54fefeff17600300d000200d91bfa7019420008052e1031baac6a7019420008052L4;FF230103cb040000145f1c0071e1010054e60301aa021040f9840400d12100028b840200b4220040b95f18007180feff545f080071a1feff54e5", - "feffb4230840f9L8;FFa08778ade00701ade2250094a1d300d1e00316aae20318aac9a70094a8c303d100c1cb3c01c1cc3ce80f40f9000500addaedffb4d602188b3b008052b5c303d1BL8;FFf30b00f9fd030091f30300aac02701942004805221008052be270194400100b4600640ada80080520800003", - "9210480520010803c0110813cf30b40f9fd7bc2a8L8;FFf65701a9f44f02a9fd030091330400b182030054b300f8b6f6031faae00316aae10313aacb270094f40301aaf50300aab7270094e00313aa2100805236008052BBBBBBBL4;FFa08300d15f0108eb010a80520295899a92010094b9537ea9a1035f", - "f8790a00b4750240f9e1cf00a9f70f00f9170b00b4a00240fdfc0f40f9fa031faa1b0a8052L4;FFf70340f921fcffb5e3ffff173b008092f7feffb5faffff17a00000f000202691d61b0094ff4303d1fd7b0aa9f6570ba9f44f0ca9fd83029109604039a9050037L8;FFd45601a9c84e00a9f44f42a9f657", - "41a9fd7bc3a8c0035fd6e10300aae00316aae20315aae30315aae40313aae50314aaf44f42a9f65741a9fd7bc3a840feff17BBL4;FFec6b00b9ec535339e19f5339eafb1029ea135339e2a35339fcdb5339e3a75339eb2b1229eb175339ea1b5339ec7700b9ec575339e4ab5339eb2b1329eb1f5339L4;ZF", - "L8;FF8afaffb5daffff17a001009000c01191c69b0094800100b000c01291c39b0094fd7bbea9f44f01a9fd030091010040f9f30300aa3f0400b140010054810000b4BBBL4;FF2a15003308111d1281f3803ce88218398a7f0039e0ab893de0a7893de0a3893de09f893d56ffdfc8760000b5e0db0194f60", - "300aadf0600b120050054fa0b4091L4;FB650000000000000038114900000000000900000000000000446f75626c6556616c7565000000000058114900000000000b00000000000000466c6f617456616cL8;FFe82f42f9eb2b42f9e8df00f9e83b42f9e8c700f9e83f42f9e9a310a9e84342f9e94f42f9e", - "8b700f988a207910001c03de85342f9e93f13a9ef030aaaea030baaBL8;FFf8230af9fb2f0af9f6370af90001803de91f0bf9f6230bf9c15b0194f43349f9e04306918123009102738052c45b0194e083c53d89630f91e187c53de8436c79L8;FF080114cbbf0208eb28040054e80b40f91f000271080114", - "8b03fdff54e90f80121f00207109140033c20000540a7c0653090500394a051a320a010039e0ffff17BBBBL4;FF04000014d60600f1f7620091e0000054e1825ff881ffffb4e00240f922008052bffb0194f8ffff17740400b48806148be00315aa0201805201f17dd3b8fb0194L4;FB3530393930623134", - "3131366236643835366166303938352f6c6962726172792f7374642f7372632f73796e632f6f6e63652e72730076656e646f722f6c696273L8;FF080500d189ffff17c80080d20800f0f20809009185ffff17c80080d2e0a30039e08300910800f0f2ffa70039e81300f9acf1ff97e80300aa410200b021f", - "41891BL8;FF092040f92a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab8300005414000014e80308ab42020054092440f93f0500b1a0010054L8;FFe06300912200805223008052240080527492ff97e11740f9e00313aa9efbff17e0630091220080522300805224008052", - "6c92ff97e11740f9d1fbff17e0630091BBBL4;FF491f009148dd789207000014ea874039e8031faa491b009103000014e8031faa492300914a1d409208010aaa69a200a928008092680200f9d40000b4e00315aaL4;ZBL8;FF010101ad030900ad290dc0da600b42ada9831ef8630743ad69048052000902", - "ad030503adc80100b008412c91e82704a9a86300d109018052e82705a928000291BL8;FF1f2d00f10831899aa90200b029a914918a0000102b6968384a090b8b40011fd6088c40f81f0900b1411d0054e8031faa73010014e80300aa098d40f83f0500b1L8;FF604641f922008052c53b00947d0b0014f70", - "31faa080080921c0180527f220fa9601ec03d684240f969220b916182ca3c6282cb3c77720ea92001803d6082c93cBBBBBL4;FF610a40f9680240f91f0101eb60300054680640f9090480522a040091e00315aa6a0a00f909692138e10313aacdf7ff97805241b980010034610a40f9680240f9L4;FFe203", - "40f9e10316aae30314aa4a030094e00740f9e1a30091e2430091f6e6ff97a1035df8810000b4e00314aa22008052bb0b009428008092680200f9afffff17L8;FFc0035fd6e00701a989008052ea1342b8eb2740b9e1430091e9830039e007c03de00308aaaa1b00b9abb301b8a91b40b9e00300ade91302b", - "8eb2700b9aff6ff97BL8;FFff4301d1fd7b03a9f32300f9fdc30091f30308aae00700f9e8630091e11300b9e0230091e1031faae2031f2aea8b0194e80f40f91f0500f1e10000547f060039L8;FFe84f1ca9f32f40f9fc7f1ea91c038052e82710a9ea7f12a9eaa74ca9e8531fa9f4031faaff2311a9e827", - "13a9ea7f15a9eaa74ba9ff2314a9ff2317a9e82716a9BBBL4;FFf85f14a9f65715a9f44f16a9fd430491e24f00b9b40040f9f60307aae52f00f9f503042af903032aa93340f9f703012afa03002ae82300f9e92b00f9140100b4L4;FB2070726573656e74207768656e2073686f756c64206265206572617", - "3656441757468656e74696361746f722070726576696f757320726f6f74206b6579206d69L8;FFee0319aae90316aaf50000b4e0030eaae10315aa22008052f60309aac0cb0094e90316aaf57740f9947c00b4e00309aae10314aa22008052b9cb009459008052BL8;FFe00a803d0080c33ce00e803d0080", - "c43ce012803d0080c53ce016803d0080c03ce002803d0080c13ce006803dbe4b0194810700d15f0700b1e12700f9800b0054L8;FF3f0500b121faff54e00308ab23ffff54000100d000200e91c44b0094e8031faa090840f929f5ffb5091440f9e803088b09f6ffb5b6ffff17e9031faa0a2440f9BBBBL4;", - "FF95620091ff2300a9560109eb4231899adfeb0194087c40931f000071c802889ae802f8b7080100d008213a91e10300b021203e91e203009042f83391e0030091L4;FB080000000000000008000000000000005c7b420000000000000000000000000008000000000000000800000000000000047842000", - "00000000000000000000000L8;FF23008052240080527602009469aa40a9d7ffff17fd7bbda9f50b00f9f44f02a9fd030091f30301aa210840f9f40300aa680240f91f0101eb40040054680640f9BL8;FFbaffff17e84b40f91f0500b160020054c1620091a20301d18c55ff97e0f6ffb438000014e83f40", - "f91f0500b140020054e1e30191a20301d18455ff97e0f5ffb4L8;FFe1a30391090ec0f2e8ff0fa9e8a712a9cf6b0094480100b00855389129048052682601a9880280d2090080920800f0f2692200a90d000014e08745ad08008092BBBL4;FF22008052c6ab0194e00316aafc830094faff403908088052f", - "60301aaf70300aafc03009102011acb390002ebc2020054e8030091e10317aae20316aa00011a8bL4;FF0f128f9aad016192ce7d60d36b010caaac010faa7f0218724a010baa8b118e9a7f0271f20835530a4a010baa6e3a4ed311fc4bd34b0158b24c0558b24d0958b2L8;FF41feff54a08300d152f5ff9", - "7a0835ef8eeffff17b5035ef8a98300d1b3835e38289140f8290141f8bf0600b1a8031cf8e97200f86003005408038052e9830791BL8;FFe3031f2ae84f04f9f52b0194e8fb40b9e97b40f93f00086be8279f1a1f0009ebe9a79f1a0901891ae80200b0a905003608b140f9e92740f91f0500f109030054L", - "8;FFba031ef8c62b00941d0000141a0180d29bff48d31a00f0f2691f4092fb0309aaa1035df8615900b5ce020014090180d20900f0f23a017fb2e91f4092fb0309aaBBBBBBL4;FF1f0048f1280800f9a202005400fc4ed354000014e00700f9e00301aaf30301aae10309aa220080522300805224008052f", - "4030b2ace0600946aa240a9e00740f9L4;FFeca30c39edab0bf96ad30078699300b868f300f86c7f00396b7301f8f8ebfe97f90300aafb0301aa280080523a1400b4b7130094e0031aaa21008052b5130094L8;FFff430191c0035fd66a11001206000014e9031faa130000148c0d00126a1500124a190c2", - "a0815001208190a2a290100cb7f220029690600f9f44f44a9f65743a9BBL4;FF2027c03d212bc03d222fc03d2333c03de31b803de217803de113803de00f803d680200f9e00bc03de10740f96082803ca10100b4e00314aa22008052b8930194L4;FD0000000000000000000000000000000068324a00000", - "00000f8334a0000000000f0334a000000000000304a000000000010304a000000000018304a0000000000L8;FFfd7b02a9f44f03a9fd830091e90301aaf30300aa810100d021402791e8230091e00309aa420180520994009468820191610100f021481491840100d084600991BBBL4;FFd60000b4c8e279", - "d3e00314aa02018052011116cbc2d30194e00740ad280080926082803c6182813ce8000014880080d2b58316f80800f0f207000014e80b41b2L4;FB0d77708da9fc9d0e00008691a48b9079000034f200008e416dc05bb5716b5b831f32a1133a41d5a392c40dc427c5ecf10920f664dc58ca0fa03c48c68", - "8b4623fL8;FFe85f42f9e82714a9e86742f9e96342f9e89f00f9e86b42f9e8a701a9e87742f9e96f42f9e8af04a9eb8b42f9e8c742f900930054f13f1ea9ef0308aae8ff40f9BL8;FF2a04009109692138e1431691ead302f96f0d0094df0600b18000005480020391e1431691951000941f0700b1e080ff", - "54802202916c010014e8031faa00011aabL8;FFc1025ff8280041d21f8d00f10831979a1f6d00f108ffff54e9feff100a6b683829090a8b20011fd6c1825ff841feffb4c00240f9eeffff17280400d11f0d00b1BBBBL4;FFe02f40f922008052c5f30194bf0600f1ab000054e00316aae10315aa22008052", - "bff30194e00314aa69dcff9708008092687200a9f44f52a9f65751a9f85f50a9L4;FBca9a250b1be9d5a9463e61efd6781777a91b83c97b844d014206e2829785000002000000058854ead3e3a8fe3a286644cd1b3538be14dfd5797653c9fd7d3d85L8;FFe92300a970ffff17c80080d20800f0f2080500", - "d164ffff17c80080d2e10700f90800f0f2080900d107000014e80b41b2e00700f904000014c80080d20800f0f2BL8;FF48000037f85300f9e1d20091a20301d19d5eff9720faffb4890000143f0c0071600200543f10007101f9ff54e84740f91f0500b1c0020054e1620091a20301d1L8;FFe80f40f9e94", - "708f9e11fc43de223c43de0fb863de01b843d600600ad620a803de80000b4ea1740f9e90740f9682200f96a2603a9f31340f90800001408008092BBBL4;FFf44f47a9f65746a9f85f45a9fd7b44a9ff030291c0035fd6ffc306d1fd7b17a9fc5f18a9f65719a9f44f1aa9fdc3059100e4006f439040a9f50", - "3012af30300aaL4;ZBL8;FFe1c3c23ce2c3c13cf24f40b9018200ad0202803d120a062910c2019121fbff54e90800b42cc101d1ed430191ee7300918cfd44d390e300918b7dcb9b0c0e8052BL8;FFe2ecff97a00d003681fbffb47a01001401e30191a22302d1feebff97e0faffb449010014e8eb45f91f0", - "500b1801c005401430291a22302d15ceeff97e0f9ffb4L8;FFe8feff17e0dcff54c9010014a0dcff54c80080d20800f0f20809009103010014c80080d2f64705f90800f0f2080900d107000014e04705f9e80b41b204000014BBBBBL4;FFe82743a9ea2f41a928e108aae93340a90b010bca4901098b6c01", - "0c8b2acdcaca8bc1cbca2981c9938c010a8b6901098b8d81cc938abdcaca2badcbca280108caL4;FFf0030faaee0301aaed0316aa6bc100517f250071e8580054292d0c1b5f1100f1f6030daae1030eaaef0310aa800700540b1140396bc100517f250071a8570054L8;FF22008052c6030194611240f981", - "0000b4601640f922008052c103019460020191f30b40f9fd7bc2a88cfdff17610640f9810000b4600a40f922008052b8030194BL8;FFe4830194fd7b43a9ff030191c0035fd60880009109200091020300f042bc0191e82700a9e80300910900009029a13b912f000014202040a9210300b021102991L8;F", - "F21501691e80300f9e8230091e00309aae2018052fd830094620100d042003a915700001408200091410100f021c81b91e80300f9e8230091e00309aa42018052BBBL4;FF8000f8b728040091490400d1110000145f2800f1880000542800028b08f1df384803f837e0e31591562d0094e87b45b9e811003", - "7e8c742f96a0740f9490108ebL4;FB01000000000000000100000000000000ac64470000000000000000000000000001000000000000000100000000000000e0614700000000000000000000000000L8;FFfc6f40f9ef1f40f9e13340f9e3b7803de10313adec2b4ba9e86b00f988008052e2a3803d6dfef", - "f1728008052e85f00f9b90000b4e0031caae10319aa22008052BL8;FF21840c91c302009063f00c91a0c300d142018052440080521a000014a0031df8c102009021840c91c302009063ac0c91a0c300d1420180524401805211000014L8;FFe8430691e32b40b9fceb41f9e0e30091c1e20091e2830b91e4", - "03182ae5031baaf81f00b95d5bfe97f89341b91f0b0071a1070054faa359a92083c13c2183c23cBBBBL4;FF0f0000141f0400b141040154e7e301941f100031c1030154f9ffff17e4e30194f70300aa1f0400b141fdff54e043059181008052dfe30194a0020135e85341b9L4;FB3800000000000000ab01", - "00001e0000006c69627369676e616c5f70726f746f636f6c3a3a73657373696f6e5f6d616e6167656d656e7443757272656e74000000L8;FF2e010debe9030054aa0500d1ac0900d1df2900f14d018052eb031faaf5031faacd318d9a2e0900d12f008052df010cebc057005410696a38ff010deb4a05009", - "1BL8;FF20640194fd7b41a9ff830091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aac10200f021382f91e8230091e00309aaa202805204640194L8;FFe80f41b2e80700f907000014c90080d248008052e04300390900f0f2e8470039e90700f9e0230091ae59ff97f44f4da9f657", - "4ca9f85f4ba9fd7b4aa9ff830391BBBL4;FF48000014e00316aae10313aae20317aaa0023fd6692240a90a01008a20696afc00a8200e0d00669ecd0300b40b01008aac01c0da8c11c0da6b0d4c8b6b01088aL4;FFe12a0091420440f9027821f8441c40b9dfffff1781404079000000f000c002916308001", - "1212c46d306786178c66c1c53607c061b014000110300001463040011L8;FFe00314aa0201805201f17dd3c4a30094754200f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6fd7bbfa9fd030091081840f9080100b4080140b20811c0daBL8;FF090d00398b6d1c320a0500390b010039a802148be003", - "1f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091150840f9BL4;FF290dc0dae08302ade01f803de013803de007c03de10bc03de20fc03de303c03d8302803d820e803d810a803d8006803de017c03de11bc03de21fc03de313c03dL3;FB78010000000000007", - "8010000000000000010000000000000010000000400000000c009000000000000b049000000000000b04900000000000010000000000000BBBBBBBBL4;FF2a6b28382903098be80328aa7b0700d12a210039281b088ba90600d1610141ad3501158a620d40ad010101ad020d00adbbfaffb5210000140901", - "80520801098bL4;FFe003803d09000014f9031f2a38008092b60000b4e00315aae10316aa22008052bf1d0094f5031baa59df78b3e003c03d28008052955e01a9986600a9800a803dL8;FFfd7bbda9f65701a9f44f02a9fd030091f30302aaf40308aa820100b4f60301aabb1d0194e00313aa21008052b9", - "1d0194c00200b4e10316aae20313aaf50300aaBBL4;FFcf9d01943f0b00b1e0f7ff54e0430291e1830791022a8052c99d0194e83f40f91f0500b16010005415050091e0220091e1430291022a8052f53f00f9c09d0194L4;FF820c7ca981107da9a20c3ca9a1103da9061c00a9082401a90e3c02a9104403", - "a9aa2c3ea9ac343fa9c0035fd61f2003d52c3440a90e0c409203ec7c9221000ecbL8;FF810100d0215c1491a40100b084e00991a363009182008052a80f00f90d9e0094810100d021601a91a40100b084a00391a363009162008052b30f00f9059e0094BBBL4;FF39feffb505000014e043059181008052e", - "8dd0194c0430035e85341b9e82f00b957ffdfc8770000b5e1dd0194f70300aaff0600b180020054f843059199008052L4;FB72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f757569642d312e32362e312f7372632f6572726f722eL8;FFe83f00f", - "928d840f9ea0700f9e8531ea9a12e00549f0600b1a00d0254880600913f0308eb01010154480200d008b140f91f0900f129070054280700d1ed031caaBL8;FFfd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9ff833cd1e8074091f30300aafa07409108810991e", - "00301aaf5074091L8;FF680240f9b51240f91f0101ebc0070054680640f9490380522a040091e00314aa6a0a00f909692138e10313aa50fbff97760a40f9680240f9080116cb9f0208ebBBBBL4;FF0f4105f88f2100d10041833ce083c43ceb010b8a0141823c4b010b8b0041843ca043dc3ca2839a3c496", - "92c386921003949010e8bab0e40f920419c3c018141adL4;ZFL8;FF63401591e00300916201805204018052e80300f911000014c80080d2e0230039e00300910800f0f2ff270039e80300f9acf3ff97e80300aae80300f9410200d0BL8;FF6b090c8b60011fd60920009121030090218031915e000014092", - "000912103009021003f91a9831ff824030090840031916d01001409200091210300b0217c0291L8;FF0825019109fd46d30800098b080500911f0109ebc815005435000014f7031faaf50314aab30e4ff87f0600b180160054e00315aabee2ff97080040b20811c0daBBBL4;FF532f0094e00600b4f50300", - "aac0bd01940004805201018052bebd0194c00b00b488008052e083c33ce183c43cf40300aa150000f9a8833ca928008052a08300d1L4;FB6964656e746974792d6b65792d706169720000000000000040864900000000001100000000000000fe0000000500000040864900000000001100000000000000L", - "8;FFfd7b05a9f93300f9f85f07a9f65708a9f44f09a9fd43019117a040a9f40301aaf30300aae0030091a18300d1a3831ff8a88b3ea942008052b7031ef8ed170094BL8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9050054280108ab83000054260000", - "14e80308ab82040054090840f9L8;FF0900f0f2a0c300d1a8931d38a9031df8b433ff97e10300aa74000014c80080d2e0430039e02300910800f0f2ff470039e80700f9ab33ff97e80300aae10000f0BBBBBL4;FFe00313aae10317aae20315aa2300805224008052d6000094770a40f9680240f9080117c", - "bbf0208eb49eeff54e00313aae10317aae20315aa2300805224008052L4;FFe1af40f922008052c50d0094b50000b4e0df40f9e10315aa22008052c00d0094e8e340f9880000b4e1035ca922008052bb0d0094e15341f90130ffb4e05741f9L8;FFf52b40f9fd7b44a9ffc30191c0035fd6e00301aa61020", - "09021203a91a2008052fd0d0114ff8301d1fd7b04a9f32b00f9fd030191f30301aae10300aae0230091BL8;FF542340f9b4031df8f40e00b4080d80525a1f40f9fc0300f9fb0f00b9f96301a9f75b02a9f54f03a9937e089bb88d0194e00313aa01018052b68d0194a0831df8L8;FF22008052c68d009476", - "1a40f915008092750200f9df0600b1e0010054748643a9e00314aa318cff97d60000b4c8e279d3e00314aa02018052011116cbb88d0094BBBL4;FF1f0101ebc0050054e82340f929040091e00316aa1c692138e1e30091e92700f9d0b9ff97f82740f9e81f40f9080118cbdf0208eb89f6ff54e0e30091e1", - "0318aaL4;FB45dd061128ea31f8f897dfcbda279d1878f1a28c05788f73f4657e8000009e631f3781786668be5c19652b1d1b9de8f4e756a07fc24b89660aed2859ec3fdc32L8;FF79b210a9e8ff40f96baa11a9692203a9e99340f96ff212a9e8db40f966fa14a9692204a9e9cf40f9659218a9e8b340f9", - "6dba1aa9692205a9e9c340f9e8ab40f9BL8;FF8002803df45744a9e8ab00f9610a803d6082803c680e00f9f50000b4f30314aae00313aa52050094b50600f173a2019181ffff54e81f40f9c80000b4090d8052L8;FFfd7b41a9ff830091c0035fd6ff8300d1fd7b01a9fd430091e023009101018052ff070", - "0f9f24c0094e00740f9fd7b41a9ff830091c0035fd6ff4303d1fd7b07a9BBBBL4;FF7f0a00b1a0000054e1030091a26300d14000805282deff97df0a00b1c0000054e8030091a26300d160008052016100917bdeff97a083de3ca8835ff87f0600f1L4;FB20617320693332203d3d20726573756c7420617", - "32069333285924800000000003300000000000000b80100000900000000000000000000000800000000000000L8;FFe00302aaf30302aaf40301aa80edff9720020037750240f9a80640f9160101eb82020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2BL8;FFd46d0194ff03", - "02d1fd7b02a9fc6f03a9fa6704a9f85f05a9f65706a9f44f07a9fd830091170040b9b70d0034f30301aaf80200f018032a91f7000037b7010837L8;FF22008052af110094e1d342f9bbfbff17e043169122008052aa110094e1d342f911fcff17e043169122008052a5110094e1d342f929fcff17e043169", - "122008052BBBL4;FF871040b824008052a6431a78e85344b8848001aae103192ab1831938910140b90cf040b9f21740f9a7031ab8a59b7aa96affff1799030090399308915a048052L4;FFf30300aae023009129f87fd31f0109eb0881899a090180521f2100f11481899ae30314aa0b000094e80740f91f", - "0500f1e0000054e80b40f9742200a9f44f43a9L8;FFd4ad0094ff0302d1fd7b02a9fc6f03a9fa6704a9f85f05a9f65706a9f44f07a9fd8300919f0003eb621400545c08038b5a08048bf30302aaf60301aaf40300aaBL8;FF00e01091820200f042c0119121068052e42d0194e8ff42f9e90343f9800200f", - "000201291830200f063a01991840200f084001391e2833291e1068052e85306f9L8;FF22008052c62d0094e0234ea9e16b40f9080d40f900013fd6e0e302f9e8074091f4074091e1e702f90801189194021891290c40f9e163179120013fd6f6034bf9BBBBBBL4;FF09010054e0e30091e10317aa2200805", - "2a5f40094f42344a91f0114eb23120054e81f40f9e10315aae20317aa0001148bc3150294e90344a9080009eb63100054L4;FFfc0317aae90315aaf50314aaf40313aaf30316aaefdb59a9ec031baafbdf5aa9f0031aaaee0318aaeb0319aa9c080014010700d1e8431391e0060091a69cfe97L8;FFf5030", - "0aace150194020000143500805268fe4ad309088052954e00a90811c0da280108cbe90080521f1d00f10831899a29008052280908aa932201a9f44f42a9BBL4;FFcd950194400300d000201c91ca950194400300d000801c91c7950194400300d000e01c91c4950194400300d000401d91c1950194400300", - "d000a01d91bb950194L4;ZBL8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb482200545b010014e80300aa098d40f83f0500b140220054f30300aae00308aa91030094BBBL4;FFbb8319f8bf6b36a9bf6f37a9220740f9e25800b4210340f935008039b501f8b7280400914904", - "00d11a000014a2a302d1830c805270bcff97404100b5bc8355f8L4;FB000000000000000001000000000000009422460000000000611c49000000000055000000000000002901000019000000737071723a3a76313a3a6368756e6b65L8;FFfe0314aae69f43a9f40315aaebb344a9e56f40f9ea031caafb", - "5340f9ef3b40f9f1030aaaf57b40f9ea0300aafc4340f9e45f40f9e00312aae08710ade81b01f9BL8;FFe143169108810991008102919b120094f87f49f9780300b4e1d342f9e8cb42f9f97b49f91f0101eb208d0054e8cf42f9490380522a040091e00318aa09692138L8;FF02288052ce550094e0c3279", - "1e1c31d9102288052ca55009448058052290100b029ad0391e8c303f9c80080d20800f0f2fb9b05f908390091e9bf03f9e8bb03f9BBBBL4;FF780a40f9c2f501940004805201018052c0f50194000500b4080400f008e13a91e10315aa165c00a9180800f91f60003960a201a9090d40f9e803009120013f", - "d6L4;FB737361676573796e635f6d65737361676563616c6c5f6d6573736167656e756c6c5f6d657373616765726563656970745f6d657373616765747970696e675f6dL8;FFe20313aa92f8ff97401200b5e1031faae2ffff17880245f81f0500b1a10000549f6605a99f7e06a9997e07a99f8200b98142", - "0191e20313aa68f9ff97c01100b5BL8;FF82018052a80f00f912760194682201910103009021742591040300f084a01091a363009182018052a80f00f909760194688201910103009021a42591040300f0L8;FFe0e3843de087c13de2e7843de283c13de0db843de07fc13de1df843de17bc13de0d3843de", - "077c13de2d7843de273c13de0cb843de06fc13de1cf843de16bc13dBBBL4;FF290080521a0317cba90316381ffd007140050054ea03019149692838080500113400001413020034e8030191e10319aa3503028b0001138bc1b50194683340f9L4;ZDL8;FFfd03029100e4006ff303052af503042af403032", - "ae30302aae20301aaf60300aac001009000802d91c401009084003991e60300910104805225048052070c8052BL8;FF36a001919703138b02f7ff97e08bc13de18fc13d73a20191e293c13de387c13de10316aae08601ade07fc13de183c13de82b43f9e216803de00600ade83200f9L8;FFfff701f9eaff", - "01f9e80b02f9e90f02f9cf350094e1eb43f9810000b4e0ef43f922008052be350094e0430f91e1032a91022b8052c2350094e04b40f9e1430f91BBBBBL4;FFff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191142440a96a9284d2136041a92a49b2f2355840a98a24c9f237", - "2041a99f0209ebL4;FFea0f00f909692138e1230091b5e5ff97f90f40f9e80740f9080119cbff0208ebe80c0054e80b40f9e10318aae20317aa0001198bc20500942803178be80f00f9L8;FFf30b00f9fd030091080040f9f30300aaa80000b4600640f901f97fd342008052bf050194680e40f9a80000b4", - "601240f901f97fd342008052b9050194681a40f9BL8;FF29850991a88cac72200540ad082000b9880480520900f0d2880201a9881200f908008092000400ad882600a9dcffff17b7850194800380522100805297038052L8;FFe2031baae30315aae4031faafed7ff97280700d1f7031baa1cf940929f031", - "5ebc80f005428fb4092f3031faa1f0500f1e8031faae0000054e80b40f982fb7fd3BBBL4;FF1f0500b121010054210000142a008052e803152ae91f40f9e81300f9280140f91f0500b140030054330940f9130300b4360540f9f52b00b9f5031aaafa03142aL4;FB617373657274696f6e206661696c6564", - "3a20216d73672e69735f656d7074792829000000000000002f604900000000004700000000000000310100000d000000L8;FFe8d342f9e9cf42f9e81700f9e8d742f9e84f00f9e8db42f9e9a308a9a89247f8e95f5739e8bb01f9e8ff42f9eb7202f8eb7f43f9e80700f9e80b43f9eba301f9BL8;FF08050", - "091290040f9280800f94c0200b5e0030daa47000014e10300a9e00301aae10309aa22008052f4030daabd050094e10340a9ed0314aa2aa040a953692838L8;FF29010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54000100b000a01b91be450094000100b0", - "00801291bb450094BBBBL4;FF092540f93f0500b120060054092d40f93f8100f121070054092940f92d008052086140b92a0940792b1940392c7140f8682600b9ea0300792a7141f8eb0b0039L4;FB74617465202862617365206b657920c0012900204e6f2076616c69642073657373696f6e20666f7220", - "726563697069656e743a20c01b2c2063757272656e7420L8;FFdbffff17e0230b39e0030b91ff270b39f56301f9b3dbff97e80300aae86301f921020090216c1a912302009063ec1a91e0030b91a20080524401805270ffff17BL8;FF14660194e102009021742a91e40200f084803391a36300912201805", - "2b30f00f90c66019468a20091e102009021142f91e40200f084003491a363009122018052L8;FF608240f901f97fd342008052c4650094688a40f9a80000b4608e40f901f97fd342008052be650094689640f9a80000b4609a40f901f97fd342008052b8650094BBBL4;FFe08200913d7f0094f70f40f977", - "01f8b6fa031faae0031aaae10317aacda5019436008052e8230091e0820091337f0094f70f40f9f7feffb7f80b40f9770300b4L4;FF640640f9c4e0ffb5650240f9650000b49f000039007d20d4230200b4630600f9600040f9600200f9130400f9600640f9130000f96272009140fc5f882000002aL8;FF", - "f44f05a9fd830091280440f9290c40f9340108ab020e00545f0800f180000054281440f9140114ab620d00549400f8b6e0031faae10314aac6a50094f70302aaBL8;FF29912791e82702a9e3430091e1250194fd7b43a9ff030191c0035fd608040091200440a9e92300910a0000904ac12891820200b042", - "4c3c91e8a700a9ea0f00f9L8;FFe083029101bb40f9ed250094e8830591e0030391eb250094c80000d008011891f7ff4539000540ad9ffe00f1ff2701f9ff2301f9e10301ade00710ad000941adBBBBBBBL4;FFf85f0aa9f6570ba9f44f0ca9fd03029137fc413939604ca9f40301aaf30300aa08108052f", - "51a40d2360002912000178be1031f2ae20315aa08140038b6190294L4;FFe00316aaa103d73cf60309aae20301ade107803d410700b53b000014e90700f9810000b4e00316aa22008052bc190094e15740f9810000b4e00315aa22008052L8;FF480001eb83010054610000541f2001a9c0035fd6090840f", - "90a0040f92901018b3f010aebea338a9a29010acb092001a9c0035fd6fd7bbfa9fd030091630200f0BBL4;FFf44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6400300f000e01891430300d063002391440300f084401991a24700d101038052c8990194L4;ZFL8;FFf31300f9fd4300", - "91e90301aaf30300aa810100b021f41891e8030091e00309aa220280520a9a009468c20091810100b021381991a401009084600a91e0030091BBBL4;FF604e40f922008052c5d90194615640f9810000b4605a40f922008052c0d90194616e40f93f0400f18b000054607240f922008052bad90194600203", - "916bc1ff97L4;FB2f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f70726f73742d302e31342e342f7372L8;FFe8ef00f9e8c342f9e8f300f9e8cb42f9e8f700f9e8d342f9e87f00f9e8d742f9e84b00f9e8e342f9e88300f9c800", - "8052e87300f92c000014ed634ba928a00791BL8;FFe08741ade217c03de8eb46f9f94b09f9e2a3843de267c33de09b843de06bc33de19f843de16fc33d4083843ce073c33d4183853ce197c13d4083863ce09bc13dL8;FF1f0500b1e1f7ff5416008092f9d740f9e98b42b9e88f42b9fb2300f9e92307299", - "9f9ffb53b008052f4e340f9f61b00f9b4faffb536008052e0dbc23de1dfc23dBBBBL4;FFc4f90194200500b408c30391e10315aa170800f9085800a92804009008212a911f60003960a201a9090d40f9e803009120013fd6e80340f91f0d00b100fdff54L4;FB436f6e74656e742066726f6d20c0012ec00", - "b2077697468207479706520c00035646573657269616c697a696e6720556e6964656e74696669656453656e646572L8;FFe84340f9e08709ade08740ade257803de85316a9e08707ade28341ade28308ad802300b4e0c3039149f7ff97e2000014e1430091e20313aafb2700f9f70b00f9BL8;FF610e40f9", - "810000b4601240f922008052c379019448008052680a00f9f44f41a9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aa1f1800b9L8;FFe067803de8d300f901010054e067c03de8d340f909008092690200f96082803c680e00f965040014f4c30091a18200910228805280820091c17", - "90094e95b40f9BBBL4;FF0881c8932cc1ccca6901098b8801088b2bbdcbca2981c9930cadccca6801088b8901098b0bcdcbca0881c8932cc1ccca6901098b8801088b2d81c99329bdcbcaL4;ZBL8;FFfffbff97e86342f908010fd11ffd01f18927005408788052200742ad6a048052eb1f40f9fa5b42f9a", - "00303d1f45f42f9e1831391620080526901088b08010291BL8;FFf65743a9f85f42a9fd7bc5a8c0035fd6a00200d000a01491c4390194a00200d000e01791c1390194a00200d000602991be390194fd7bbea9f44f01a9fd030091L8;FF1f0900f1c902005468c21191290000b029b11691e84305f9e80000", - "f008610391e94705f969038052e00000d000bc3291e8eb01f9e1032a91e8f301f9e80000f0BBBBBL4;FF087c0ba9080180521f200ca9080080921f200da9e003022ae20303aae303042a05f8ff97803000b4e00700f9210400b021a01f91230400b063543591e0230091L4;FF28008092680200f9f44f42a", - "9f65741a9fd7bc3a8c0035fd6800000f000e03291c209009420008052e10314aad4090094fd7bbda9f65701a9f44f02a9fd030091L8;FFb3831ff8684200917302009073c20991e0030091a12300d1e20313aaa80f00f9fb090194e0030091a1630091e20313aaf7090194e0030091f6090194fd7b42a9BL", - "8;FF3f2000f1f30308aac8000054e80b41b20900809268d200a9690200f900010014170040395a0080d2f50300aa1a00f0f2ffc2007182000054e87e0453490b0091L8;FF7f00001428000013290402532a0803532b0c0453e0e340b9e2db40b9e3d340b9f79740b92c100553e4cb40b93f0400312d14065", - "3e5c340b90801150a097c890aBBBL4;FF26ffff17a0c300d121008052220080522300805224008052d5bcff97a8035ef891feff17a0c300d1220080522300805224008052cebcff97a1035ef8f8feff17L4;FB0800000000000000f40a460000000000000000000000000008000000000000000800000000", - "000000a00b46000000000000000000000000000800000000000000L8;FFe1e3c13de057813de0e7c13de25b813de147813de04b813df88702f9fc7f02f9e17b02f9e06b0054602bc03de88303f9e0831d9168234239695b40f9f4031c91BL8;FF605240f901f97fd342008052c4490194685a40f9a80000b", - "4605e40f901f97fd342008052be490194686640f9a80000b4606a40f901f97fd342008052b8490194L8;FF0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb281000548a000014f30300aacd030094e80300aae00313aa090140b22911c0daBBBBL4;FFa2833cadd0e901940", - "0e4006fe08311ade08312ade08313ade0a7803d65ffff17bbe901940008805221008052b9e90194c00200b4e90340f9e14740f908088052L4;FB0800000000000000407d42000000000073657373696f6e0039a34800000000002f00000000000000210000000900000024954800000000005b0000000000", - "0000L8;FFc00b0054680640f9490580522a040091e00315aa6a0a00f909692138e10313aa0ceaff97760a40f9680240f9080116cbbf0208eb080b0054680640f9e10314aaBL8;FF880217cba902178b1f4100f1c2010054e1031faa680200b42a6961385ff1017180020054210400911f0101eb61ffff54e", - "0031faa810217cb1f0400f100020054L8;FFc769009405000014e00640ade20ac03d620a803d600600adff031691f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6ebab59a93f050071BBBL4;FFf703062ae05700b9f40305aaf80308aaa96f48a9e92f00f9a93f40f9e91f00f9a93b", - "40f9e91b00f9b94f46a9030400b4e0a30191e10303aae20304aacdfeff97L4;FFdf05013108d5889a290500b183ffff5489fd43d30b0500b48ced7d924d010c8bac01c0399f050131ecd79f1a7f0500f140040054ae05c039df0501318cd58c9aL8;FFa10e40f9810000b4a01240f922008052c3a90094a1", - "1a40f9f30b40f9810000b4a01e40f922008052bda90094a12640f9810000b4a02a40f922008052b8a90094BL8;FFe02b40f93ee0ff97f4e351a9180200b49922009104000014180700f1396300916001005421835ff881ffffb4200340f922008052ba290194f8ffff17e8e32291L8;FF2083c33c0141803", - "ce0675139094101f868fd60d3e9174bf9aa031bb8ea1b4bf9c042833cabc31cb8e82309b9c94202f8cac202f8be90fe972800c0d229008052BBBBBBL4;FFf65745a9fd7b43a9ffc30191c0035fd6e0030091e82b00a9ebee0094e00313aa16130194e80300aae00301aaa8ed07377affff17ff0304d1fd7b", - "0aa9fc6f0ba9L4;FFe9ab4d290ad5003909d90039e9ab4c290add003909e10039e9ab4b290ae5003909e90039e8431391e3110094e0074091e1431391028c815200401d91c0110094L8;FFcb0d00122c1c4039092c003949c100117f2500710930003909819f1a9f7d02710a819f1a8d0d00122e20403929", - "010b0b4a114c0bbf25007129c100110b819f1aBBL4;FFff030cd1f40300aa00800291f30308aa9b68009480040036bd9101940018805221008052bb910194a03200b4e0e7076f08188052f50300aae88300a908048052L4;ZDL8;FFe79100141892001418920014ffc300d1fd7b01a9f31300f9fd430091e", - "90301aaf30300aa610100f0212c1b91e8030091e00309aa4201805205920094610100f0BBBL4;FF400700ada903173881ac009460fa0736faef48a9df0218ebf54340f9f94f40f9b74302d1090d0054620b40f90a0e80524800188b1f0114ebe933949a030109cbL4;FBb911523a9cc27b6f75948df2bb4c", - "89b684d4d43b935d81b3bf6d7914105cfeb39fd5846b834dd1b69274d4bb3dd70e6bafeddac63c9ea28cf671789400007713L8;FFe22f40f9f57b40f9e56f40f9ef030014e8b343f9e94700f9df0600b1e9c343f9ebfb43f9ea6b00f9e8e700f9e8b743f9f4bb43f9e0c743f9f2cb43f9eecf43f9BL8;FFc", - "8110094fcd342f94cf9ff17e043169122008052c3110094e1d342f956f9ff17e043169122008052be110094e1d342f95ff9ff17e043169122008052b9110094L8;FFf4031691e13f02f9290c40f9e103129120013fd6f8c342f91f0f00b12102005468008052f53f42f9f43b42f9e8a3113929008092a802", - "40f9690200f9680000b4BBBBL4;FFf44f57a9f65756a9f85f55a9fa6754a9fc6f53a9fd7b52a9ff030691c0035fd608040090081d36910300001408040090087d3691680a00f9080380527f6a0039L4;FB63206b6579000000859248000000000033000000000000002b040000220000005365616c656420", - "53656e6465722076323a204b6d697373696e67207665727369L8;FFe00300f9210200f021281a91230200f0638c1691e0030091c201805284018052f1ffff17c90080d2e8230039480080520900f0f2e8270039e90300f9dfffff17BL8;FFaaa31838aad358382901084aabb31838abe35838a9c31838a9f", - "358384a01084ac00640adaad318386a01084a2801084aaae31838e10300ada8f31838a0073eadL8;FFe8cf42f9e10319aae20318aa00011a8bcb710094f90b40f94803188be8d302f9e89f49f9f4074091948209911f0500b18000005480620391e143169166130094BBBL4;FFa86303d1a26301d101a101", - "919e9cff9720e6ffb448000014bc035cf83f0b00f180010054a80354f8480100b4a98354f8e03f00f9f90301aae10308aa22008052L4;ZBL8;FFe00318aae10317aa22008052c4b10094b5fbffb4e00f40f9e10315aa22008052bfb10094d8ffff17880080520902805268220039280080522a0000147c00", - "00b5BL8;FF63201791a40280524c000014e80f41b2e0833291e85306f9b2270094e10300aa3e000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f9a9270094L8;FF080680522223c03de9e341f9a826089b24fcff17f9030891e83f41f9f7032a912083c63cf8830d91a80319f8e80000f0e", - "05a803d08b140f9fb5f40f91f0d00f1BBBBBL4;FF10000014780640f9e8030191e00318aa9e010294680a40f909634039e07f0091e2030191a3c300d1e10315aa000540ade9630139a0873ead5a350094e8031f2aL4;FFa1025ef8810000b4a0825ef822008052c3010094a1825ff8e1feffb4a00240f922", - "008052be010094f3ffff17d70000b4e806178be00316aa0201805201ed7cd3L8;FF810000b4603640f922008052c4010194610240f9810000b4600640f922008052bf010194610e40f9810000b4601240f922008052ba010194611a40f9c10000b4BL8;FF240300d084402291e323009182008052e80700f", - "904820194fd7b41a9ff830091c0035fd6010300f02170299182008052f9810114080040f9e00301aa090140f9L8;FFfa81009400e4006f9f1a00f9808200ad8002803d08db77d3800640ad80020191e103009122008052080d17aae00700ad080dc0da881e00f9820241ade20301adBBBL4;FFff830291c0", - "035fd63500805228008092755201a9685200a9f44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9L4;FB74617465202862617365206b657920c00129000a64656372797074656420c00e206d6573736167652066726f6d20c027207769746820505245564", - "94f55532073L8;FF882640f9800ac03da1a201918a1a40f98182c33c8216c03da80317f8880e40f9893240f98083873c8082c03cf48340f9aa831ef8a8031df8e8431091a103963cBL8;FF1f0101eb80080054680640f9490280522a040091e00316aa6a0a00f909692138e10313aa6afbff97780a40f968", - "0240f9080118cbdf0208eb88070054680640f9L8;FFe1031091e3430691e8271aa90801009008c1389142008052e8db00f966fcff970a0380d20801009008a93991690480520a00f0f2e8a716a95a1100d1e10740f9BBBBL4;FF57ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae103", - "19aae2031f2ae0023fd61f0000f1cd000054390300ebe3c200541803008bf9feffb5L4;FB08000000000000000800000000000000448b430000000000496e76616c696453657373696f6e4572726f7200000000007c544300000000001800000000000000L8;FFe8c301f9a8c20091e0df803d922d0094e0", - "0740ade8030091e0432d91e1431e91e0e7813d028149ade1eb813d0155c03de233823d038948ade037823de13b823dBL8;FF215c3091e8030091e00309aa220380520f620194c10200f021e01e91e40200d084603c91e0030091a363009102028052b30f00f90762019468620091c10200f0L8;FF2b0440f", - "90afc78d37369283808050091280800f98af6ffb43f0108eb93611932e00200547369283808050091280800f92004f8b7e0030aaa26000014e10300a9BBBL4;FFf50308aac2a1019400c4805221008052c0a10194400800b4e106009102c48052f30300aac6a10194540500b4ca024039e80315aa5f2100f", - "1210500549f8631f1L4;FF21008292e1ffeff2fd0300911f0001eba80d0054f35301a9f40300aa60fd9fd2f55b02a92000a0f29f0200ebf76303a9f92300f9480d0054930e00917f7e02f1L8;FFfd7b01a9fd430091810100f021cc1491a40100d084402491e323009182008052e80700f900a20094fd7b4", - "1a9ff830091c0035fd6810100f021bc149182008052BL8;FF29911f91e8a701a9a82300d1800200b0002c0091820200b042800c91e1630091e8a702a9cc210194800200b000e00f91be210194800200b000401091bb210194BL4;FF600640f922008052c5210094602e40f9a00000b4613240f9610000b42", - "2008052bf210094611a40f9810000b4601640f922008052ba210094614640f9c10000b4L3;ZBBBBBBBBBBL4;FFc41e0294200e00b408ff43d31300198b150700d11f2700f1e00313aae11f805209f17dd3e20314aa280108cbb832889ab91e0294880340f9e9031caa370a00b4L4;FFa30c00540a0140f94", - "b8540f80a2500a9eb2f00f9e1ffff173f040071a00100543f08007121020054e1430091a2e300d137fdff9720fbffb42b00001401c30091L8;FF00601391c91e0194ff8301d1fd7b03a9f52300f9f44f05a9fdc30091f40308aa080440f9e10700f93f0008eb68060054080c40f9f30301aaf50300aac801", - "0037BBL4;FFfc0740f9c29e0194e00316aa21008052c09e0194c0dcffb520008052e10316aacc9e0194ea9740b9eb4f40f907000014ea9740b9eb4f40f9f8031aaafa0b40f9L4;FFb5820151a41e001264d21f38f40313aaf76343a9f96b44a9e2ffff1760d25f38001000121514150ba41e0012f7ffff17", - "dfbc0071a08242faa9f9ff54e7141a12L8;FF218c1691a40100b084e00d91a363009182018052a80f00f90e9f00940e9f0094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091BBBL4;FF836400541803008b060000141f0400b101640054e5de01941f1000318163005439f", - "effb505000014e043059181008052e0de0194c0620035e85341b9e84f00b9L4;FB4e00000000000000aa02000020000000f5014900000000004e000000000000009d02000015000000f5014900000000004e00000000000000450600000a000000L8;FFe10313aa28e040f9e80000b420e440f9f30301aae", - "10308aa22008052c0de0094e10313aa28ec40f9e80000b420f040f9f30301aae10308aa22008052b8de0094BL8;FFe0031caa21008052c25e0194c00a00b4e10315aae2031caaa0733ea9c85e0194380b40f9380100b53c0000143b008052281f40f91f0500b121fcff54a8831ff8L8;FFe10318aae20316", - "aaae020094780a40f9bbffff17e00313aa22008052a9020094610a40f9c3ffff17e00313aae10316aae20314aaa3020094760a40f9680240f9BBBBL4;FFa2839a3c49692c386921003949010e8bab0e40f920419c3c018141adaa01409236011ab821419d3c01c1c43ca80a40f920419e3ca043da3c21019", - "f3ca143db3cL4;ZFL8;FFf4030aaa77150094e10340a9ea0314aa2ca040a9290040f99369283808050091280800f960f9ffb63f0108ebe00000548a6928380805009120008052290040f9BL8;FF0c7f0194f44f43a9f51340f9fd7b41a9ff030191c0035fd6080040f9e20301aa080140f900a140a9e1030", - "8aa077f0114080040f9e20301aa002140a9e10308aaL8;FF60008052a092ff9716ffff17e11740f9e80f40f91f0101ebe06e0054e81340f9968248f8490280520969213828040091df0600b1e81700f9201f005480220291BBBL4;FF810000b4e02b40f922008052c4be0194e8c3009100c1009174a6ff97", - "f8031faa940300f094de3691570380527dffff172000805201048052d1be0194fd7bbaa9L4;FB4572726f72576869737065725072654b657953656e6465724b6579506c61696e7465787400000000070000000000000006000000000000000000000000000000L8;FFff4303d1fd7b09a9f85f0aa9f6570b", - "a9f44f0ca9fd430291283c40f9f30301aae20700f95f0008eb410a0054f70303aa788c40a9748643a9f60302aaf50300aaBL8;FFe00740f9fd7b41a9ff830091c0035fd6ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191350840f9fa0301aaf30300aa750500b4L8;FF610", - "0005480c20091d975fe97881e40f9e083c33ce0031faa2823189b000d803de083c43c0011803de083c53c0015803de93740f9093100f929070091e083c03cBBBBBL4;FFc8300054680640f9e10316aae20315aa0001178bca0e0294e802158b680a00f9951640f9550300b4610a40f9680240f9961240f91", - "f0101eb60310054680640f9L4;FFe86b42f9e96f42f91f0500f1e99300f9c03f0054fa7342f9e8a740f9a80000b4e1af40f9e2a740f9e0031aaac40e0094e28753a9e0431391fa8b00f9be040094L8;FFe1230091ea1b40b9e9230039a9058052a8031ff8e00313aac2048052e81302f8a80f8052ab831fb", - "8e9470039ec2301b8e95b0039ed7301b8e96f0039ea1f00b9BL8;FF795a08a9f44f5ca9f6575ba9f85f5aa9fa6759a9fc6f58a9fd7b57a9ff430791c0035fd620008052e10315aac98e019420008052e10318aac68e019420008052L8;FF08e1403960024079810240791f050071c0fbff5474e8ff976002", - "0079f44f42a9fd7b41a9ffc30091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaBBBL4;FFe00315aa4a0180520a692138e92700f92e5e0094e1e30091d2baff97a06e40b980010034e12740f9e81f40f91f0101eb00280054e82340f9290400910a018052L4;FBca012460c8bdd2d13e88018", - "8114a37cd30e4feb38cbc834db69dd4bb12bdafed4fb2a28ccacbdcc9263c073400004c611516ff9bb76efd3937466151d0e29e8fL8;FFedb300f9fa5740f9f44b40f9ea2312a9e88740f9f18700f9eadf49a9eb231ba9e82f46a9f0570ea9f50316aaead700f9e4ab40a9e0030baaeb0303aaf00308aaBL", - "8;FFe80300f9e0030091b6440094f44f45a9f52340f9fd7b43a9ff830191c0035fd6f503012a74040051e00313aad7070094e80300aae00301aa28fc073708fc60d3L8;FFcef2ff97080000d008111d91e92740f9b42338a90800009008713e91a92339a9080100d008013091c9048052e8c302f9000100d", - "000f01991e8cb02f9080100d0BBBBL4;FFf85f07a9f65708a9f44f09a9fd030191f80300aae0230091f50308aa5be9ff97f60740f9df0e00b141010054e00b40f967d7ff9728008052e90300f0297d2891L4;FB65737361676520666f7220706c61696e7465787420636f6e74656e743b206974206973206", - "e6f7420656e63727970746564000000000000000b9a480000000000L8;FFe00340f94cffff17c80080d20800f0f2080900913effff17e00300f9210200d021801391230200d063d81391e00300918202805264018052f1ffff17c90080d2BL8;FF2c7c12532a440c330b090039090d00398b6d1c320a0500", - "390b010039a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9L8;FFe89b49f91f0500b1c0000054e8074091e143169108810991004103917f0f0094f87f49f9580300b4e1d342f9e8cb42f9f97b49f91f0101eb40370054e8cf42f9BBBL4;FF2a158052ff2703a96", - "90300b029150a91e82b08a96a06805228048052e92b05a9290080d2e87f04a9692bc0f215000014e80300d008b140f9c80200b428008052L4;FFe0feff54050000141f0016eb1800188ba9fdff540200001437008052e003152ad4110094e003172aff074091ff430091f44f44a9f65743a9f85f42a9fc67", - "41a9L8;FFf4031f2ab50100b0b5822191ba4300d1b60100d0d602119105000014720800949c0700f11400144aa00400546026407861274078e8fedf882802003528e34039BL8;FFe03f813de143813de91305b9680000b4e00314aa00013fd6210740f9810000b4220b40f9e00314aabd2e01949f0b00b14", - "102005435030036e0a350a9e20313aaL8;FFe00700a9a0e300d1e1030091e20f01a9a26301d1e82706a9c80000f008412091e41702a9e61f03a9e00702adff030b39a8a33aa9bf831bf899f1ff97a8835cf8BBBBBBL4;FF613240f93f0400f18b000054603640f922008052c2160294613e40f93f0400f18", - "b000054604240f922008052bc160294614a40f93f0400f18b000054604e40f9L4;FF4183ce3c3f0500f160838d3c4083c73c61838e3c4183c83c6083873c4083c93c6183883c4183ca3c6083893c4083c33c61838a3c4183c43c6083833c4083c53cL8;FFf65741a9fd7bc3a8c0035fd6680200d008a11d9", - "174d600a9740e00f9680200f9f44f42a9f65741a9fd7bc3a8c0035fd60001805201038052d1160194090440a9BBL4;FFc4018052210000144103009021c824914303009063e42491a0031df818000014a0031df84103009021c824914303009063182691a0c300d1e2008052e4038052L4;ZBL8;FFfd0300", - "91082440f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b1400400540a1440f9092040f90a0100b4BBBL4;FFadb35fb86b2a0129765e0029ec0b00b9edb300b8ea4340f8600a00f9611a00b96ac201f8ea6340396d3202b8eb0b40f9797202f878f202", - "f86afe00396b7203f8L4;FB7431436861696e506172616d730000006d61785f6a756d70617574685f6b6579726f6f745f6b6579000000000000000020000000000000002008000000000000L8;FFe86b00f9e8f741f9f08f42f9e2a342f9faa742f9e4af42f9e8e700f9e8ff41f9f7bb42f9f1bf42f9f4c3", - "42f9e3c742f9e82b17a9e80342f9ea0b42f9edcb42f9BL8;FFf3d349f9b50b00b47622009104000014b50600f1d6620091000b0054c1825ff881ffffb4c00240f922008052bc560194f8ffff17e17749f93f0800b1e0adff54L8;FF84018052e3000014e05306f9e08332912101009021e03391020280522", - "30100b063a80191c4018052da000014c80080d2e0a33239e08332910800f0f2ffa73239BBBBL4;FF01028052def60194000400b000c01a91daf60194ff8302d1fd7b06a9f85f07a9f65708a9f44f09a9fd83019109904039f30300aaf40308aaa90100343f0d0071L4;FB7365616c65645f73656e6465727", - "3656e646572206365727469666963617465206e6f74207369676e6564206279207365727665724d4143207665726966696361L8;FF080840921f1900f1620c0054017c0353810c00343f040071200200543f08007181030054890240f93f0500b1a10000549f6600a99f7e01a9997e02a99f3200b9BL8;FF", - "e92740f96082823c69720bf8e93b40f96182863ce10347ad681e0339c87e045369f20bf8e91f40b96282853c6082843c6182833c600608a97c6609a96a261d29L8;FF2800805221a1803c40f18f3cf6bb0ef93821003928250039f4cb00f9a00b0054e8c30091e0431691008542ad0201c73ce277813de06", - "f813de173813d018141adBBBL4;FFfd7b45a9ffc30291c0035fd6e0a30091020280522300805224008052d4a9ff97e11f40f9e81740f9090101cb3f3d00f128edff54e0a300910202805223008052L4;ZDL8;FFe0031f2ae3031faa3cb70094c001009000203291c5b60094ff0301d1fd7b02a9f44f03a9f", - "d830091010840a988008052f30300aae023009104018052050e8052BL8;FFa00200b000e03091c8360194a00200b000c02791c5360194a00200b000200891c2360194a002009000a03b91e1031faac0035fd6c0035fd6e30302aae20301aaL8;FFfa2b00f9b70400b4080d805278a640f9f57e089bbe3600", - "94e00315aa01018052bc36009400e100b4080d8052f90300aaf5031faaf67e089bfc0317aae10318aaBBBBBL4;FF8203883ca1833aada2037eada303d53c0243873ca2077dad0043883c0343803c0243853c0143863ca2077bad0243813ca2037cad0143823c0243833c0043843cL4;FFf44f42a9f50b40f", - "9fd7bc3a8c0035fd60001805201038052d9060094fd7bbea9f44f01a9fd030091f303012af40300aab70600940002805201018052b5060094L8;FFe9af00a9ea0300f90b070194fd7b42a9ffc30091c0035fd6400200f000d01c9101058052c0035fd6e0031faac0035fd6c0035fd6490200f029210c9120", - "01c03dBL8;FFc7860194616e40f93f0400f18b000054607240f922008052c186019460020391726eff97685645a909008092694a00f97f2e00f9350300b414c1009106000014L8;FFfd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa6101009021ec1c9", - "1e8030091e00309aac200805204870094BBBL4;FF887b00f948470491fa434a39820305ad6083c63c6283c73c080140b9e10306ad6083c83c6183c33ce87b00b9e20307ad6083c43ce9b307b8e10305ad608749adL4;FB696e742e7273002f636172676f2d72656769737472792f696e6465782e63726174", - "65732e696f2d313934396366386336623562353537662f62797465732d312eL8;FFe417c23de95300f9eccb43f9e00bc23de18b14ade11bc23de31fc23dea7202f8e203c23de8ff43f9e9030caaebbb01f9eba35f39e48715ade107c23df4bb43f9BL8;FFc30b00544b09c0396c1d00122c380c0b8111405", - "16b00f8376b008052430000143f004871030b00544b0dc0396c1d00122c540c0b810148516b00f8378b008052L8;FF080d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab230100541e000014f4031faae00313aa080c45f81f0500b1c1fdff54f40314abBBBBL4;FFa92318385", - "33100f8ba0000b4e02b40f9e1031aaa22008052c1e60194fb8216aaa85e58d37afe68d3e13340f9e81f00f9810000b4e02340f922008052b8e60194L4;FB31061e110d0d000000000000000000000d00000000000d1100000d000d0d160d617373657274696f6e206661696c65643a206b65792e69735f6e", - "6f6e6528292fL8;FFf4af40f974d2ffb518000014c0ffff545801001480ffff54a80a00917c0000140800809249008092680200f9681a00f9694200f9db000014a80a00d1f46701f9BL8;FFe90f41b2090100f9f44f42a9f50b40f9fd7bc3a8c0035fd6ea1741b2092100390a0100f9f44f42a9f50b40f9f", - "d7bc3a8c0035fd6290480d20900f0f2090500a9L8;FF810000b4600a40f922008052c4660094603240f9a00000b4613640f9610000b422008052be660094611e40f9e10100b408068052606a68f822008052f44f41a9BBBL4;FF4a1d409208010aaa692200a9fd7b44a9f32b40f9ff830191c0035fd6ff83", - "03d1fd7b0aa9f75b00f9f6570ca9f44f0da9fd830291f30308aa28008052f4e30091L4;FF42040051a02c46d39f00026be0000054232100351fbc00716d1e0054000080d21f000039007d20d46282403922ff2f361fbc0071640640f98c210054651240f9L8;FFf503012a21008052e80700f9a90f00f9f7", - "a60094e103152ae003132ae203142ae801009008e140391f050071a0faff54f303002af403022a6b000094f503002aBL8;FFf32601947f020039fd7b42a9f31b40f9ff030191c0035fd6ff8302d1fd7b08a9f34b00f9fd0302910010c03c01f0c03cf30308aa08004039097c40390a088052L8;FFfc6f48a", - "9fd7b47a9ff430391c0035fd620008052e10317aace26009420008052e10319aacb26009420008052e10318aac826009420008052e10316aac5260094BBBBBBBL4;FFffc302d1fd7b05a9fc6f06a9fa6707a9f85f08a9f65709a9f44f0aa9fd430191170c40f9e9830091e22702a9e80201abc2100054160", - "440f9c9060091df2200f1L4;FFe00318aae10317aa22008052c41a0094f7031caaf8031baae11f40f9c10000b508000014600bc03de003803de11f40f9810000b4e00316aa22008052b81a0094L8;FF610240f9810000b4600640f922008052c31a0194e00313aa0105805202018052f44f41a9fd7bc2a8b", - "d1a0114f44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9BBL4;FFe87a40394a010b4aeb7340b9ea720039ea7e403929010b4aeb7f40b9e9760039e982403908010b4ae87a0039e82f51294a010b4a2801084aea7e0039e8820039L4;ZFL8;FFad194e8bbf010cebe30100546b0500f1ec030daa81feff54", - "a90109abe2000054200108ab62010054fd7bc1a8c0035fd6e90309ab63ffff54800100b000601291BBBL4;FFe203853de3830fade31bc53de50b853de187803de68f0eadf7c0ff97e0afc93de1b3c93da88301d1a08302d1e1430591e0870aade4da0194a00779ada80302d1L4;FB6f6f4c61726765496e7", - "6616c6964566172696e74526563757273696f6e4c696d6974526561636865640000000000000000000000000000000800000000000000L8;FFf00300aae0030eaaf9031baaef0303aaf10304aaeb08001408234039f87700f91f190071a1200054480200b0e00309aa08b140f9e9cf40f9edeb40f91f0900", - "f1BL8;FFe067c13de94306912081009102708052e8a302f9e843169101610091e04f813dc75a0194e063c13de8a342f9e907409129c13591f73340f9e157c13de0f3863dL8;FF13080014f37740f99f0600b140090054e01bc13de11fc13de9830291e88344b9e1a30c91022780522041893c21418a3ce98", - "3029120e10291f47312a9f53301b9BBBBL4;FFc1010054610640f9200740f9e20318aad9fa01942001003528634039696240391f01096ba1000054e9227da9df0208eb400349faa0040054e1e7076fe9cf43a9L4;FB306231343131366236643835366166303938352f6c6962726172792f636f72652f737", - "2632f697465722f61646170746572732f656e756d65726174652e727300L8;FF81220091e20313aaca030094f50300aae90100143f0900b140250054880080d20800f0f2081100913f0108eba124005481220091e20313aa1f0b0094f50300aaBL8;FF02028052e40314aaa80f00f9117b0194117b0194f4", - "4f43a9f51340f9fd7b41a9ff030191c0035fd6fd7bbca9f85f01a9f65702a9f44f03a9fd030091160440f9L8;FF7891ff97e11740f9e00316aad6fdff17e06300912200805223008052240080527091ff97e11740f9e3fdff17e0630091e10318aae20316aa2300805224008052BBBL4;FF0800001422031", - "88b2000805201018052c4ba0194f70300aaf40301aaf8031faa680f1b8b19f17dd3b9ba0194e00319aa01018052b7ba0194405400b4a86301d1L4;ZBL8;FF8282803c4ffeff97e027c13de12bc13de0230b91e22fc13df56b42f9f77742f9e86342f9e26f42f9e47b42f9e10315aae30317aa808610ad828", - "e803df46742f9BL8;FFf30300aacd030094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb890f0054088c5df81f0500b1L8;FFf5031faae86300f918fd60d3c80080d20800f0f20a3900911d030014607e42f9618242f9290c40f9e8430f91", - "e1031baa20013fd6fceb41f99f0b00b1a1110054BBBBBL4;FFe00313aae10317aae20315aa2300805224008052d6fdff97770a40f956feff17f50300aae00313aa220080522300805224008052cefdff97610a40f9e00315aaL4;FFa17c019be00302aae20315aae30314aade0a0094800100b5070000143", - "40100b4bb0a0094e00314aae10315aab90a0094a00000b528008052750600f904000014L8;FF740a40f9680240f99f0208eb80010054680640f9890600910815148b010900a9031101a9690a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6e00313aaBL8;FFff2303a91800f0f2e87f05a9e88300", - "91e00702a9ff7f04a9a80f00f9010800b4e20301aa16210091f5c30091f783009109000014a1620091a26300918374ff97L8;FF0be11f781345007881ffff54e93340f92805098b01f17dd3e8f300b2a8aae0f23f0108eb48540054fa2b00f9214500b4f30301aab68a0094e00313aa01018052BBBL4;FFd", - "8b6ff97e84b40b9c8010034a1035ef8a8035df81f0101eb60200054eb2f40b9a8835df8090780522a04009109692138e0030b2aa1c300d1aa031ef8c9b6ff97L4;FB4374314374320000d5184900000000006a00000000000000020000002600000000000000000000000800000000000000080000000000", - "000054e8450000000000L8;FFe24344f9e38715ad2181c43c2381c63ceb4744f9f64b44f9f84f44f9e20713ad2181c53c699346f89b8208aaf40319aae8cb43f9e9bb01f9e93f44f9fa5f44f9BL8;FFa00000b4613240f9610000b422008052c34a0194611a40f9810000b4601640f922008052be4a01946", - "14640f9e10400b408108052606a68f822008052f44f41a9L8;FFfd030091080040f91f0900b1a1000054e0031faaf30b40f9fd7bc2a8c0035fd6080141d2e90080521f2d00f10831899a090100b0291500918a0000102b696838BBBBL4;FFfa6f08a9e08714ade08b48adf3bf4a39e08b15ade18345ad771", - "a40d20003138be20317aae18312ade08b46ade08b13ade08744ade08711ad08140038b6ea0194L4;FB804c420000000000000000000000000008000000000000000800000000000000d079420000000000000000000000000008000000000000000800000000000000L8;FF1f0101eb000b0054680640f92", - "a040091e00314aa490180526a0a00f90969213863670094e10313aa0aebff97803240f9800100b4610a40f9680240f91f0101ebBL8;FFe89347b8e97f40b9e10314aafc034239fb074239e86300b9e8634239e93306b8e92348b8ea2700f9ea0f4179e8430139e95b00b9eabb0079ca7eff97000600b4L8;", - "FFe003082ae20313aae303142ab5ffff97c0fdffb4d2ffff17280180d2e00700f90800f0f2081500d1deffff17e90b41b2e92300a9dcffff17280180d20800f0f2BBBL4;FF21008052c3aa0194600200b4a8624039e10340ad1600003908440039886240390110803c088c00398804805217480039003081", - "3c680200a9680a00f9f44f47a9L4;FF88010d0a61118e9a0901096a480142b208118a9a0001e8b6480543b23f01007208118a9a8000f0b6480944b23f01007208118a9a090141b22a0000d0e00308aaL8;FFcdffff17e00740ad60220091e20bc03de81b40f9800600ad820a803d881a00f9f7a4ff97f44f", - "4da9f6574ca9f85f4ba9fa674aa9fc6f49a9fd7b48a9ff830391BL8;FFd5dfff97e8a75139c8000036e14741f9810000b4e04b41f922008052c02a0194e89740f9ffa711391f0500b160000054e02b40f932e1ff97f3d351a9940100b4L8;FF8100805200001891ff0316b9e81300b9f7290094e80356b9e", - "00740918100805200001891ff0316b9e80f00b9f0290094e80356b9e00740918100805200001891BBBBBBL4;FF0b3400a94c190012211c0caa6afdff361f0900f1e0fdff542a09c0392b0d00910d0d00d10b3400a94c19001221380caa4afcff361f0d00f1c0fcff542a0dc039L4;FFe04b01b9a04700d1f", - "6c4ff97e04301b9a04700d1f3c4ff97e03b01b9a04700d1f0c4ff97e03301b9a04700d1edc4ff97e02b01b9a04700d1eac4ff97e02301b9L8;FFe083c03c080080126042803c680200b9fd7b42a9f31b40f9ff030191c0035fd6fd7bbea9f44f01a9fd030091f40300aa2301f8b7f30303aac10100b4e003", - "02aaBBL4;FFe8030191a3831af8aa831df8f3920194740a40f9680240f99f0208eb61000054e00313aa5292019408038052690640f9e013c03d8826089be92b40f91c000014L4;ZDL8;FF14930094610100f021b41a91840100d084602891a32300d1a2008052b3831ff80c93009468620091610100f021c", - "81a91840100d084a00391a32300d122018052BBBL4;FF68ffff17e01740f957ffff17e01740f93effff17f50314aae7ffff17e01300f9a10300f021e01d91a30300f063302991e0830091020280528400805226000014L4;FBdc9f52efac0948cc853bac4a6fcf314400005ec6de110faac78b3f3df3d77b", - "69da4dff25042bdfb9e9061ab609db209b9c863aed591b16372133639d8e7052efL8;FFe0f3803de193803df1d300f9f10317aaf44300f9ed6b00f9ed0310aaf00315aa2bf7ff1756450036e86345f9e96b45f9ea7345f9ebbb45f9e00bc33de85300f9BL8;FF1f0101eb402a0054e8cf42f92a040091c02", - "202914901805209692138ead302f9d6140094e1431691690c0094e0b349f9800100b4e1d342f9e8cb42f91f0101ebL8;FF960100b47722009104000014d60600f1f7620091e0000054e1825ff881ffffb4e00240f922008052bd520094f8ffff17e89340f9c80000b40805088be00313aaBBBBL4;FFe9574", - "0b9ebc34139eaa345b8e10f40f9e84b00b9e8bf4079e9b304b8fb2746a9ebe30039eb634139aa031bb8e91b00f9e9674139a8431b78eb270029ea4300b9L4;FB617365206b6579009a964800000000003300000000000000f7000000050000009a9648000000000033000000000000003901000005000000", - "9a96480000000000L8;FF210200f021c01891230200f063d01391e0030091a201805244008052f3e7ff97e00340f97cffff17c80080d20800f0f2080500d16effff17c80080d20800f0f2BL8;FFb7f35838e02fc03da2039a3cb5031bf80001178b08108052e21640d2a0873aadf81640d2a303973c08140", - "038ba7201941f1f00f1a8010054a0877aada10301d1L8;FFe08749f963fdff17e18b49f93f0800b1800100543f0400b140010054810000b4e08f49f922008052bd720094e19749f9810000b4e09b49f922008052b8720094BBBL4;FFe84740f9bb8312f81f0500b160050054a06303d1b19bff9708008092", - "29008092b4e731a9a88315f8a80317f848008052a88313f8a8a303d1bf031ab8bf8312f8L4;ZBL8;FFc13240f9ca2a40f9f90b40b9480101cb1f0d00f12902005428100091c92e40f92b0bc05a4a0108cb5f7d00f12b6921b8c83200f9a8fbff54c0420191e10308aaBL8;FFc80080d20800f0f208090091", - "01010014c80080d2f55706f90800f0f2080900d107000014e05706f9e80b41b204000014c80080d20800f0f2080500d1e0833291L8;FFe14305f9e0032a91e100009021843d9102028052e30000b063ec0591a40280524c000014e80f41b2e0032a91e84305f9ac28ff97e10300aa3e000014c80080d2BBB", - "BBL4;FFc30202940004805221008052c1020294800100b42804009008a10a910900f0d2000540ad08048052602201a9000400ad692200a9f30b40f9fd7bc2a8c0035fd6L4;FFe8c301f9e89f40f92083883ce20245ad2183873ce182cd3cead701f9eab340f9e2831dade082cc3c21838d3c20838c3c9942", - "0091e18247ade00319aae8eb01f9L8;FF611a40f9810000b4601e40f922008052c3020194b40000b4600640f9e10314aa22008052be020194e00313aa080c45f81f0500b14000005482feff97744640f9BL8;FFff030191c0035fd60820009109300091020300f042380191e82700a9e8030091090000b02", - "9211f91200440a9e82701a9e8230091e82702a9e3430091d5820194L8;FF42018052a80f00f91283009412830094fd7b41a9f31340f9ffc30091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aa410100f021301d91BBBL4;FFc026089be80336aaf40302aaa802088b0805088b02f1", - "7dd3176040a901600091c1c20194b50600d1750a00f9f70000b4ff0600b180020054e00318aae10317aaL4;FB6a00000000000000b00000002e000000000000000000000008000000000000000800000000000000404f470000000000506f6c796e6f6d69616c4572726f7243L8;FFe00318aae10317aa22", - "008052c4c20094e90315aae1f341f9a10000b4e00314aa22008052bec20094e90315aadf0600b1f7430d91a0050054e8fb42f91f0500b1BL8;FF43f8ff54c002009000c02791c7420194e00313aa22008052c2020094610a40f9a1ffff17e00313aa22008052bd020094610a40f9bdffff17e00313aae103", - "18aaL8;FF00b82c9108210091e1c30e91e9db01f91a00f0f2eadf01f9f0420094e81f40b9e8c306394d0000142093c13ce9df40f9e8a30539e012803d2093c03ce9f204f8BBBBL4;FFe2031f2ae0023fd61f0000f1cd000054390300ebe3e300541803008bf9feffb50f0000141f0400b141e30054dfe201", - "941f100031c1e20054f9ffff17dce20194L4;FB73657373696f6e5f76657273696f6e72656d6f74655f6964656e746974795f7075626c696373656e6465725f636861696e72656365697665725f636861696e73L8;FF8900009029610291e8ab05f9080200f008ad1491e9af05f989008052000200d000ec", - "2e91e8cb03f9e1432d91e8d303f9080200f008a12191e3431e9162008052BL8;FFf50b00f9f44f02a9fd030091f30302aaf40301aaf50300aabd6201940004805201018052bb620194400100b4155000a9e10200d021e03a91130800f91f600039L8;FF61710c8bab008052300000144d15c039ae1d00128", - "c1d0e0b8c0102518d00f83761710c8bcb008052280000149f114071630800544d19c039ae1d00128c390e0bBBBL4;FFa00200b4e16f40f9610200b422008052fa0700f9fa031caafc0316aaf60319aaf90315aaf50317aaf703142af40309aabba20194e90314aaf403172af70315aaL4;FF3f1400387f00", - "01ebc1ffff54c10210912300805223400e39a7ffff17a1060011c302109161cc218b21e840f94200018ba5ffff17a10600123f04007160010054L8;FF3f0500b1e0010054ff8300d1fd7b01a9fd430091810100f021cc1491a40100d084c01e91e323009182008052e80700f9fda20094fd7b41a9ff83009", - "1c0035fd6BL8;FFfd7b03a9fdc30091e8030091490200b029710391e00700a9800200b000e80391e82701a9e8230091820200b042e00d91e1430091e82702a9c7220194fd7bbfa9BL4;FF80010054c1025ef8810000b4c0825ef822008052c2220094c1825ff8e1feffb4c00240f922008052bd220094f3f", - "fff17682a40f9c80000b40805088be00314aaL3;ZBBBBBBBBBL4;FF60ffff54e802c0dae91340f90811c0da200540a9530f488b68fe1b9ba802088b028101d1701800940800148a206b68fc00a8200e0a00669e8a0300b44901c0daL4;FFabb301b8e80300f9e92300390a000014f7ef43a9e017c03df627", - "40f9e00b803dfafe48d398faffb5d7ffff17370080523900809248ff70d349ff60d3990200f9L8;FF8002009000401d91c81c0194f8031faae00318aae10313aace1c01948002009000e01891c41c019480020090004012918302009063c011918402009084e02291BBL4;FFe02f803d28db77d3e08744ad", - "80020191a14301d122008052080d18aaa0873dad080dc0dae86700f9e28345ada2833eadee9c0194e8275a29ea2f5b29f7c30239L4;FF060080d2050080d2040080d2000880d2d3ffff97fd7bc1a8a1f5ff17080000f02900805209811e39c0035fd6fd7bbfa9fd030091007840b9cdffff97007c4093L8;", - "FFa1000054a10100b021f00b9102058052019d0014a10100b0217c0b91a2038052fd9c0014080040f9e00301aa08014039e80000341f05007121010054a10100b0BBBL4;FF57ffdfc8770000b5e9dc0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000", - "f1ad000054390300eba3220054L4;FB000000000000000047657474696e6720656c61707365642074696d652073696e636520554e49585f45504f43482e2049662074686973206661696c732c207765L8;FF09e040f9e9f700f909e440f9e92f00f909e840f9e97f00f909ec40f9e94b00f909f840f9e983", - "00f9a0a600541f050071e1c700548800805209008092790a00f9BL8;FFe057813de15b813de8e30a79fc010014e8074091f6a745f90023009108810991f407409194820991da9f0094e1074091e0431691023f805221800991c05c0194L8;FF800100b4610a40f9680240f91f0101eb200d0054680640f90", - "90180522a0400916a0a00f909692138e10313aa50faff97e00314aa088c44f81f0500b160000054BBBBL4;FFe9031faaba6640a90a328052080d010ef6d640a9f76240391800198a496b78fc208d282e0800669e1bc101f280030054e90700f96803c0da0811c0da080f488bL4;ZFL8;FFe083c03ce1031f", - "aa2823189be90f40f92a0700910001803d090900f98a0a00f9b4ffff17e1031faa881e00b9b1ffff171f0100f1e1031faae8079f1a88820039BL8;FF219c3991a9831ff8090300d02be11291030300d063902991a92300d126030090c6002f912a018052070300d0e7142f9105200091e00308aac2028052", - "84008052L8;FFe81700f9965a40f9560300b4e11740f9e80f40f9945640f91f0101ebe0420054e81340f9490480522a040091e00316aaea1700f909692138e1630091057dff97BBBL4;FFea0240f9490108eba32300540a0340f9990640f94801088b080300f9e90200f928ff60d3480a00b5200b40921f1", - "800f1420a0054217f0353610a00343f0c0071L4;FB528649000000000054000000000000005900000005000000528649000000000054000000000000005f0000000500000052864900000000005400000000000000L8;FF31300094e0630691e123009102328052cbbc0094e1630691e00313aa023f8052c", - "7bc0094ff430e91fc4f41a9fd7bc2a8c0035fd6ff0307d1fd7b19a9fcd300f9BL8;FF091440f9e803088b09f6ffb5b6ffff17e9031faa0a2440f9aaf9ffb50a3040f9e903098b8afaffb5daffff17a00200f000c02391bd3c0194a00200f000200891L8;FFa10c0014606641f9616a41f9290c40f9e8430f", - "91e1031baa20013fd6fceb41f99f0f00b1810e005448008092880200f9c8008052940c0014606641f9616a41f9BBBBBL4;FFf85f02a9f65703a9f44f04a9fd030091f40300aa004841b9f30301aa80010034610a40f9680240f91f0101ebc0340054680640f9090180522a0400916a0a00f9L4;FFe1031aa", - "ad30c0094e17342f9e09340f9d00c009420008052c1028052cd0c0094e17342f9e0af40f9ca0c00942000805201c48052d20c009420008052018c8152L8;FF42602891200440a9e80b00b9e8230091a9831ff82902009029710891e8a701a9a82300d12902009029710391e8a702a9e3630091d70c0194fd", - "7b45a9ff830191BL8;FFe90700f9088d0194fd7b41a9ff830091c0035fd6210300d021702991e00308aa82008052fd7b41a9ff830091fa8c0114ff8300d1fd7b01a9fd430091090040f9L8;FFa11300d103acff97fd7b41a9ff830091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300a", - "a610100d021881f91e8030091e00309aac2018052BBBL4;FFa85775a9b40356f81f0500f1c1010054a81e00121f0500716c090054aafe48d30c0180d2a91e4092eb0f41b20c00f0f21f01007168018c9a34018a9a29019f9aL4;FB302149000000000058000000000000004c00000022000000616c6c206c", - "656e677468732073686f756c6420776f726b20666f7220534841323536000000000000L8;FFe0071ead6083c63c6183c03ce28f1fad6283c33ce0fb803d6083c13cf60742f9e1031cad6083c23cdf0600b1e00b1dad40560054e82344b91f810771e0550054BL8;FFe8b341b9e0430691810f803debc741b", - "901048052e002803de9cf40f9ea9741b980c38d3c800fc03d821f803d4047803d801fc03df81f00b98043813c00e4006fL8;FF090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aabc20600542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d3BBBBL4;FF2", - "c00001436008052e10740f9e1f7ffb5c1ffff17e8031faa95f9ffb5f80308ab63faff54000400d000a00a91bfec019428008052ff0f00f9ffa300a9130800b5L4;FB6f4b6579547970654964656e7469666965724261644b6579547970650000000000000000000000000000000000000000010000000000", - "0000f8da420000000000L8;FFfd7bbca9f85f01a9f65702a9f44f03a9fd030091f30301aa210840f9f50300aa680240f91f0101eb800b0054680640f9b60a40f92a040091b41640f949028052BL8;FF18c30191cb0d0094e80740f9a0877eada203df3c7f0319eb08011a8b000502ada0877cad0219803d0", - "00500ada08b7dade93b40f9000901ad28050091e83b00f9L8;FF1f0308ebc9000054e0431691e1031aaae20318aaab100094fad342f9fc0740919c8301914afeff17400100f000e01891be6c0094f80300aae043169122008052BBBL4;FFf50314aa6002c03d680a40f9a18e47f88082843c882e00f98100", - "00b4804240f922008052beac0194602ec03d686240f9a002803da80a00f9f44f4da9f6574ca9L4;FF080000142c7c12532a440c330b090039090d00398b6d1c320a0500390b010039a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaL8;FF930a40f9f60300aafc831ca9ff", - "ef00f9930300b4f7031faa3c008052e80316aa080000146907c05a09693778f70a0091ff0213ebfcef00f99c07009122020054BL8;FFe8c742f9e9db1079e9cb42f9aa0318f8ac8318784b650036ea6b48b9ebdb5079ece20b91e04341f98a0100b90afb0b918b090079eb630191ac0358f8482500a9L8;F", - "Fe1ff833de003843d000540ade207843de083853d020141ade187853de87f41f9e28b853de08f853d4000c03de04b823d4004c03de04f823d210140ade173823dBBBBBBL4;FF2304005430000014c90080d248008052e0a300390900f0f2e8a70039e91300f978000014e80741b2750000141f2900f18800", - "00542900088b29f1df388902f837L4;FF4083833ce023c13de8830c914183843ce127c13de0431391e1830891e283099163c20391e50313aa4283823c4083853c4183863c9cb9ff97e0431391c2f2ff97L8;FF6b1d00122cdddf389f0101316a200054891d00124dcd5f382c150012e9030aaaac091a33fe", - "0000149f2200f189040054a80240391fd5017121040054a8064039BBL4;FF895a4039ea9b4039e89700394801094a895e4039ea9f4039e89b00394801094a89624039eaa34039e89f00394801094a89664039eaa74039e8a300394801094aL4;ZBL8;FF29fd46d30801098b130500917f0209ebe90b00540", - "88c5cf81f0500b1e0090054c3f9ff97080040b20811c0da081540d2080d088b0825019109fd46d30800098bBBBL4;FF080540f9150100ebe200005476020014a2a302d1e003082a430c805276bbff97402700b5bc8355f8820740f95f0015eb89110054810340f9200080398000f8b7L4;FBc00000000c00", - "000098204900000000004900000000000000c70000002f00000098204900000000004900000000000000c6000000190000009820490000000000L8;FFe8eb00f9e81344f9e82b14a9e81b44f9ea1744f9e92313a9e81f44f9e92344f9e8ab01a9ea2744f9e82b44f9e8ab04a9e82f44f9ea3344f9e80b00f", - "9e83744f9BL8;FF090180522a04009109692138e1431691ead302f96e0e00949f0600b160a1ff54c0220291e14316919411009407fdff1780c20291c11d0094080040b20811c0daL8;FF022b8052f30703f9e80303f9e8c3179100810091e07f813dc9540094e8fb42f91f0500b161ebff54e99f40f95301", - "009068b240f93f0500b1c0010054fa4340f9BBBBL4;FFc0035fd6608640a9e8330091f45341f8f6d340f8b2cd0094e83340391f090071a0010054bf02086b61010054e9d340f8e85341f8df0209eb800248fae0179f1aL4;FB656d6f74655f6964656e746974795f7075626c696373656e6465725f636861", - "696e72656365697665725f636861696e7370656e64696e675f7072655f6b657972L8;FF00feffb5a80640f91f0116eb49050054e00313aa7ef4ff9740fd073728fc60d3080500b5200840921f1800f122050054217c0353410500343f04007100020054BL8;FF84a01791a363009142028052b30f00f9107", - "50194686200910103009021282391040300f084201891a3630091e2008052a80f00f9077501946842019101030090L8;FFea031faaf67b52b9df06007181010054eb7f52b9ec8352b96b0100346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0d009104000014eb031faaBBBL4;FFfcb300", - "f9fa6717a9f85f18a9f65719a9f44f1aa9fd43059100e4006fe8430291090480523f0000f1f30300aaa08302d10101819a2201829af50304aaf40303aaL4;ZDL8;FFec0313aae0c20191f40740f9fa0000b4e0030caae1031aaa22008052c0b40094ab835ff8e0c20191f3031f2afb031faaf91b40f92600", - "0014140100b4e00313aaBL8;FF22008052c6340194e0c31791e1833291022b8052ca34019460030291e1c31791dd71ff9754050014c80080d2a10200b021d805910800f0f2e0031791e3833291L8;FFa02302d113f5ff97a0150036a1fcffb4aa010014a1820191a22302d12ff4ff9700fcffb4690100142", - "02e00b5a02302d108f5ff97600e003641fbffb474010014BBBBBL4;FF820280524402805212000014a0031df82104009021dc2c9123040090632c2d91a0c300d182028052e400805209000014a0031df82104009021dc2c9123040090L4;FFf65704a9f44f05a9fd030091ff0312d1167c4093e8ef7db2ff", - "0300f9df0200f1e9079f1ad80209cb09ff7cd314ef7cd33f0100f1820248faa9000054f5031faaL8;FFfd7bc3a88802001400200091f44f42a9f65741a9fd7bc3a84d020014012040f93f0800b1400200543f0400b100020054e10000b4082440f9f30300aa22008052BL8;FF73a20191c002005461025df", - "8810000b460825df822008052c184019461825ef8810000b460025ff822008052bc840194610240f9810000b4600640f922008052L8;FFab000054e0d340f901f97fd342008052c3840094e8db40f91f0500f1ab000054e0df40f901f97fd342008052bc840094e81b40f9e8cdffb572feff17600100f0BB", - "BL4;FFfd7bc6a8c0035fd6a00300d000402691a20300d042a02791e10a8052f1c40194a08300d1220080522300805224008052cfb7ff97a1035ff85dffff17a08300d1L4;FB6465725f726174636865745f6b657973656e6465725f726174636865745f6b65795f70726976617465636861696e5f6b65796", - "d6573736167655f6b6579730000L8;FFe2031caae05f00f9cdc4009423000014f60314aa3a008052892000b4f40309aabbc40094e00314aa21008052b9c40094605800b4e10318aae20314aae05f00f9BL8;FFe2fdff972024003728fc60d3681000b5200840921f1800f102110054217c0353211300343f", - "0800718d0100543f0c0071600200543f100071c00200543f140071L8;FF2d6bfe97e84346391f05007180020054881245b8e99741b9e00315aaeb2b5aa9a80318b8e8c34639e93200b8e9cf40f9e8631139a8f31938e8430691ea2b02f9BBBBL4;FFfd7bc5a8c8e40114180e805228e179d3cae279d37304", - "189bf50301aa141109cb421116cb6002148bbfe40194e156189be00313aae20314aaf44f44a9f90b40f9L4;FB742f616172636836342d756e6b6e6f776e2d6c696e75782d676e752f72656c656173652f6275696c642f737071722d383934636339653033313261616632312fL8;FF680240f9bf0208ebe1", - "f8ff54c4ffff17ffc307d1fd7b19a9fc6f1aa9fa671ba9f85f1ca9f6571da9f44f1ea9fd43069169020090f40300aaf30308aa29b140f9BL8;FF7d4bff97a0f7ffb423000014ff5f05a9ff3300f9c1420091a20301d1e003082a8a4eff97a0f6ffb468000014a00301d112660094e80300aae00301aa68f9", - "0736L8;FF1800001461ce40f9810000b460d240f922008052c264009461da40f9810000b460de40f922008052bd64009461e640f9810000b460ea40f922008052b8640094BBBL4;FF690200f9f44f46a9f91b40f9f65745a9f85f44a9fd7b42a9ffc30191c0035fd6e0230091e1031faa220080522300805", - "224008052ce97ff97e02341a9a1ffff17L4;FF620240f9400400f9620240f9020000f9200840f97f0200eb61110054600640f9200800f988000014a1cd89d2f55b02a9f5230191c138a8f2200000b000400691L8;FF62000054fd7bc1a8c0035fd6a00100f000000891c5a40094a00100f000c01a91c2a40", - "094a001009000c01291bfa40094fd7bbea9f30b00f9fd030091012440f9BL8;FFe1240194882e4039692e4039aa02000ad6020a0a1f01096be0179f1ada2401948832403969324039f503002a1f01096be0179f1ad42401948836403969364039L8;FFf85f03a9f65704a9f44f05a9fd03009119e040a9f6", - "0300aa344c40a9f50302aa370840f9b80400b40807188b3a8300911bed7cd3040000147bc300f15ac30091BBBBBBBL4;FFc0035fd6280180d2e00700f90800f0f2081500d118000014e90b41b2e92300a916000014280180d20800f0f2081100d1110000143f00156bc1f0ff54dfffff17L4;FFe10301914", - "2008052e82704a9c3100094b50000b4e00317aae10315aa22008052bf180094bc035ff85c0600b4c80adc9a08d91c9b080600b5f8e700a9b8835ef8L8;FFff8300d1fd7b01a9fd430091082440a9e0030091e82700a932ffff97fd7b41a9ff830091c0035fd6ff0301d1fd7b02a9f31b00f9fd830091f303", - "08aae8030091BBL4;FF08358c52e51301ad08019f5ae20f00ade00702ade28f03ade08704ade20741ade82b01b908fa80d22800c0f2684301f8e8030091e20706adf6b30094e80340f9L4;ZFL8;FFaac356382901084aaba31638abd35638a9b31638a9e356384a01084aa2833bad6b01084aaac31638aaf", - "356382901084aabd31638ab035738a9e31638a9135738BBBL4;FFe10318aa22008052c5d80194752e40f9682640f9bf0208eb20050054080d8052762a40f929008052a85a089bbf1600f1097d02a909018052186500a9b9060091L4;FB656b2e726563762065706f636820c0022d3ec0273a20456b53656e", - "744374315265636569766564202d3e204e6f4865616465725265636569766564001b737071L8;FFf5df43f9fae343f9e86b00f9e8af43f9fceb43f9f71744f9f92344f9f84744f9e8e700f9e8b743f9fb6b44f9f67344f9e0f3803de82b17a9e8bb43f9eac343f9BL8;FFe8d302f9fafcffb5e8031faaf98", - "792b939010034290340b22911c0da291540d2290d098b2925019129fd46d32905009102000014e9031faaf88b92b938010034L8;FFf3031faaf9031faa35008052e0c32791e1c31d9102288052c958009400630091e1c3279102288052fb9b05f9c4580094e88b4cb949008052f9a305f9f5a705f9BBBBL4", - ";FFe80340f91f0d00b1a0fcff5475da40a9e00740adc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aaL4;FB632f686d61635f696d706c2e7273002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e2d6c696e75782d67", - "6e752f72656c656173652f62L8;FFa0877cad8082883c8182893ca08779ad8082823c8182833ca0877aad8082843c8182853ca08778ad8082803c880200f98182813ce0ffff17e08741ade00314aaBL8;FF68100037a8035df84a0340f9490108eb034900548a0340f9b8835cf84801088b880300f949030", - "0f908ff60d3880d00b5000b40921f1800f1820d0054017f0353L8;FFe15b813de6010014e8074091f6af45f9e043259108810991f5074091b582099137b9ff97f43349f9e0431691a122009102738052c2780094e083c53de187c53dBBBL4;FFe81340f9fc1b40f9e44340f9e1f3ff54e02302916eefff97", - "e52f40f9e44340f9e30314aae81340f998ffff17fa4b40f9e10314aaa06301d183060091e2031aaaL4;ZBL8;FF2001c03dff6702f9ff6302f9681200f9e80340f960828c3ce033c13dff2701f9ff2301f968fe03a948008052682600f9683200f9683e00f9684a00f9685600f9BL8;FFf30300aa080115cb", - "5f0008eba8010054b40000b4680640f9e20314aa0001158bc7380194a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6L8;FF622ec13dc00604ad603ac13dc21e803d2281cc3cc02a803d000540adc0860fad2081cd3c2181ca3cc28219ad2281cb3cc11e813dc222813ddd43fe97e00", - "640adBBBBBL4;FF83000014e80f40f9690640f92a0108eb032b0054690240f9e00315aae30316aae403142a2801088be90b40f9682a00a9680040f9080540f9150109ebe2010054L4;FF08050091e80b00f994000094f60b40f9e80340f9f45742a9080116cbbf0208eb88030054d50000b4e80740f9e103", - "14aae20315aa0001168bc1080094e003c03dL8;FF00050091c0035fd6e0031faac0035fd6ffc300d1fd7b02a9fd830091490200f029813d910a0000904ab12791400200f000403e91e92b00a96902009029a10691BL8;FF3f0800b1c1010054f80300aae00318aa6f71ff9708008092686a00a9f44f5ba9f", - "6575aa9f85f59a9fa6758a9fc6f57a9fd7b56a9ff030791c0035fd6eb6f40f9L8;FFe14340f9f5ffff17e8430a91f34b41f9142300910081c03ce8030a910001803d04000014390700f1946200910001005488825ff888ffffb4800240f901f97fd3BBBL4;FF3f1100f13481889ae30314aa26000094e807", - "40f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9c6c80194ff0301d1L4;FB206c617a696c79008e194900000000005700000000000000c9030000160000000000000000000000080000000000000008000000000000008404460000000000L8;FF64020014f9", - "031faa89050014f57740f959008052890500145f0700b1c0010054da0000b4e1031aaa22008052f40309aabbc80094e90314aaf80000b4e00319aaBL8;FF22008052c6480194611240f9810000b4601640f922008052c1480194611e40f9810000b4602240f922008052bc48019460620191f30b40f9fd7b", - "c2a85efeff17L8;FF00403391c9480094490080524afdff35ea031faa4901098b200108aba2010054f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6000100b000603f91BBBBL4;FFe093c03ce193c13c6012803c6112813c7f020039fd7b43a9f32340f9ff430191c0035fd6091c40f93f0500", - "b160030054093040f93f8100f1e10300540a2c40f9L4;FBe41f40000000000018000000000000000800000000000000847d400000000000e41f400000000000100000000000000008000000000000004080400000000000L8;FFe00313aa44944329e20308aafd7b47a9f34340f9ff430291f3320014fd7b", - "bda9fc5701a9f44f02a9fd030091ff830fd13f040071f30300aa01020054f40304aaBL8;FF4a25019129194a8b29050091200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff540003009000402991bf680194fd7bbea9f44f01a9fd030091010c40f9L8;FFfb670094e9bf4639e84346390a088052a", - "00302d1f80310912a15003308111d12e8430639e8031091eabf0639200740ade00600ad4d3fff97e00640ada00302d1BBBL4;FFe0031aaa22008052e3031caadfa80194fa0300aa402300b4b30800b4bca80194e00313aa21008052baa80194202200b4e10b40f9e20313aaf90300aac0a80194L4;FFf513", - "00f92f0b0094e40300aa200000d0020080d200a840f9130000f9637a62f842040091c3ffffb5350000d0a1420691620e028be00302aa220400f902000014L8;FFfb0304aaf80303aa360f0094e81340f91f0500f100360054e083c83ce183c93c08088052e283c43cf3430391f90b00f9e08709ade083c53", - "ce183ca3ce28307adBL8;FFe182c73ce282c83ce08709ade082c93ce182c23ce2830aade082c33ce282c43ce18307ade082c53ce182c03ce28308ade082c13ce282c63ce18306ade082c73cL8;FFf6eb42f9fb074bf9f90b4bf9fc0f4bf9f8134bf9f5174bf9c80240f9f7e742f9680000b4e00317aa0001", - "3fd6c10640f9810000b4c20a40f9e00317aab8280094BBBBBBL4;FF21030054e1230091e20313aa8ffaff97002900b5f7031faac7ffff1721630091e20313aa89faff97202700b5f7031faac1ffff1721c30091e20313aa83faff97L4;FFa04700d1f7c2ff97e04301b9a04700d1f4c2ff97e03b01b9a047", - "00d1f1c2ff97e03301b9a04700d1eec2ff97e02b01b9a04700d1ebc2ff97e02301b9a04700d1L8;FFff830191c0035fd648008052010800a908400039c0035fd68804805249008052012000a909400039c0035fd688048052742200a94800805268420039f44f45a9BBL4;FFfedbff97e08643ad480300b0", - "089d0991f6033291c9058052e0033291e1830091a28301d1e02e833de08a44ade132833d030c8052d8020191e82702a9e036833dL4;ZDL8;FF080d088b0825019108fd46d308050091091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b", - "8bBBBL4;FF43040054680b40f9090e8052f60d80928803088b0969099b150500d133c101d1050000149f1300f173c201d1b50600d1a9020054bf0214eb9c0700d1e833949aL4;FBd6d0a7765ccfc0de8bdf601ad6a11e80aa228d8a03f6fe3c88afca08a2d80926d66e277f6ee27fd5ee4adfdd48ead4ade", - "658a28cff50fbac0000843917518b42L8;FF0a7540f9e9c747f9ea1300f90a7940f9e9f301f9ea9f00f90aa54fa9e91700f9098540f9e92b00f9098940f9e92700f9098d40f9e92b01a90a2552a9e94300f9BL8;FFe8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aac1100094fad342", - "f9fc0740919c83019144feff17e043169122008052ba100094e1d342f9L8;FF33000014a082c03ca182c13c280100f0a282c23c400707ad4243803d08b140f9a80300b4080000b008713e9189fdfff029213b91bb2336a9a84303d1a82737a9BBBBL4;FFc7f00194e88340a9eb0314aa0a000014f9031faa", - "f6031faafa031faaeb031faafb031faaf5031faa080180523c00805237008052f40318aa818e47f89ba204a9L4;FB20636861696e2072617463686574206b6579696e76616c6964206c6f63616c206964656e74697479206b6579696e76616c69642072656d6f7465206964656e74L8;FFe003082ae10314", - "aae20313aa90f3ff97a00f00b540fcffb4d7ffff17898242f83f0900b161000054971600f99f2e00f91f0900f1a10d0054e00313aa74f0ff97BL8;FF21c43791040300d084601b91e0030091a3630091e2018052a80f00f90d710194e10200f021003891040300d084e01b91a363009122028052b30f00f9", - "05710194L8;FFf87749f91f0700b1c01300548022029195290094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb681200548e000014BBBL4;FFe0000054c80000b4e02740f9e10308aa22008052c2b00194e00748a9d6f50736280700d11f1100b168f5ff54e03", - "740f9e10319aa22008052b9b00194a5ffff17L4;ZBL8;FFcfb00094e0630191e10314aa552c0094e8a30791e06301912a2a0094f4f740f99f0600b120010054faff40f9560301f183210054e5020054f9031faae00319aaBL8;FFe0031791e3833291e4c31791e2008052e07f813de183813de287813d4df", - "1ff97f3f742f9e8ef42f97f0208eb61000054e0631791b467ff9708068052e02fc13dL8;FFe84f45f99f0b00b1c002803de89b04f921090054e89b44f9e9431f91c002c03de94b03f9e900009029613b91e8f303f9080000f008d12191e84f03f928008052BBBBBL4;FF68320039f44f48a9f65747a9f85f", - "46a9fa6745a9fd7b44a9ff430291c0035fd62004009000401291d400029420008052e10316aac700029420008052e10317aaL4;FFfd030091960000f0970000f0f30301aac12a40f9e82e40f9f40300aa1f0113eb1531939ae20315aa3800158b190115cbc3000094620215cb8002158be1031f2aL8;FFf4", - "2300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889a152300a9f7fbffb5f62b40f9f51f40f996000037580200b018e31e91BL8;FFff8300d1fd7b01a9fd430091080040f9a01300d109014039281040b9a9c31f38c800c8372801d037ef800194fd7b41a9ff830091c003", - "5fd600810194fd7b41a9L8;FF4a1540d24a0d0a8b4a2501914afd46d34a0500919a1a40b95f070071e10500548bb243298b0600346b0140b26b11c0da6b1540d26b0d0b8b6b2501916bfd46d3BBBL4;FFa93b0079e91340f9ec230079ea0700f96b020036aa1b40b9ab3b4079e0630091e9e301f8e90740f", - "9e86302f8e8234079ea1b00b9eb3b0079e9e302f8e86f0079L4;FB6f7420616476616e63652070617374206072656d61696e696e67603a20c004203c3d20c0002f636172676f2d72656769737472792f696e6465782e6372617465L8;FFa103d83ce307c13d0800f0f2f42300f9160d00914083823ce00bc", - "13d4183843ca38339ade00fc13df52342f9e10f803da003953c4c000014e083029181220091BL8;FFc8000094760a40f9c1ffff17fd7bbca9f70b00f9f65702a9f44f03a9fd030091f30301aa210840f9f40300aa680240f91f0101eb600e0054680640f92a040091L8;FFc7400094610e40f9810000b460", - "1240f922008052c2400094612640f93f0400f18b000054602a40f922008052bc40009474d643a9750300b496c2009104000014BBBBL4;FF1f0400b141fdff54e043059181008052e8e00194c0a30035e85341b9e88f00b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aaL", - "4;FB01000000000000003cf043000000000008c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059bL8;FFd4e0009420008052e10316aad1e00094ffc300d1fd7b01a9f44f02a9fd430091480200f0082101913400407908fddf88f30300a", - "a68020035480200f0e003142aBL8;FFa8831ff81361019468220191c10200f021742a91e40200d084c02791a32300d122018052a8831ff80a6101940a610194f44f43a9fd7b42a9ff030191c0035fd6L8;FF3f08007121030054e1230091e20313aae8fcff97400200b4e9000014c1620091e20313aae3fc", - "ff97a00100b4c9000014c1c20091e20313aadefcff97000100b4BBBL4;FF42801891e0230091a34300d1082109aa6905c05ae083803cb6831ff808010aaa0ad49052284108aa2a00a072097dd59b28a10a9be90f40f9e9a301a9a8df3ea9L4;FF20010054e103144b9f120071dfc82138cd010054dfb01f3", - "804148052d4c01fb801d05f38211000128100010b01d01f38f35341a9f55b42a9f76343a9f92340f9L8;FF62018052a8831ff812a1009412a10094f44f43a9fd7b42a9ff030191c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa810100f021f41891BL8;FFc3200194e00315aa2100", - "805236008052c0200194601000b4615a40a9f58300a9ff0f00f9df0215ebc8080054f5031faae8031faab60000b40000158be20316aaBL4;FFe00313aae10317aae20314aa2300805224008052a7010094770a40f9c9ffff17a8831ff8a84300d1290000f029f11d91c00000b000141e91e8a700a9a82300", - "d1L3;ZB" + "BBBBBBBBBL8;FB8811000000000000e017000000000000000001000000000007000000040000000000000000000000000000000000000000000000000000000000000000000000L8;FF01048052d4a0009420feff9000002e91eaa00094ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0", + "ca9fdc30191092040f9f30308aa3f0009ebBL8;FFfd7bc3a83c250114f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f30b00f9fd030091090040f9e8008052f30300aa2a0900d13f0500f14881889a1f2500f1L8;FF61710c8b0b018052140000148d7d1c53ad0600340d00be528d010d0b4c2180396b", + "710d8b8c00f8b761e10c8b2b0180520a0000144d254039bf0500f1c8010054BBL8;FF609a40f9220080523b650194749600f9f44f41a9fd7bc2a8c0035fd6ffc302d1fd7b06a9fa6707a9f85f08a9f65709a9f44f0aa9fd830191097c40f9f30308aaL8;FF37000014e1010054e0031faa1affff17c80080", + "d2e00b00f90800f0f2080900d10bffff17e90b41b2e9a300a910ffff17c80080d20800f0f2080500d104ffff17BL8;FFf85f45a9fa6744a9fd7b43a9ff030291c0035fd6370080521800809219018052a80640f91f0116eb890d0054e00313aa1af2ff97e80300aae00301aae8fd0737L8;FD00000000000", + "000000000000000000000e80147000000000078034700000000007003470000000000000047000000000010004700000000001800470000000000BBBL8;FB190000001c00000042024000000000006a00000000000000e30000002e00000042024000000000006a00000000000000800000002e000000576", + "8697370657250L8;FFb792ff97fb1740f9e80f40f908011bcb3f0308eb089b0054e81340f9e1031aaae20319aa00011b8b3a8500946803198bfb0b40f9fa0f40b9e81700f9b8010034BL8;FFd300019400020034687ec0394802f837690240393fb5037183020054691240f86a9240f81ffd01716b1241f8", + "6c7241f829010a8a6a010c8a29010a8a200941baL8;FF28008052a1030054b47c039b0b00f0d2f50304aa6b0104cb9f020bebe8020054010100b4a17c019be00302aae20315aae30314aa31050094800100b507000014BBL8;FF081540d2080d088b0825019108fd46d308050091690a40f9c90500b42a01", + "40b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091691640f94801088bL8;FFd5400094a00100b4f50300aa3d450094e00315aa21008052f40315aa3600805234450094a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad3L16;FFe92313a9e87742f9e97b42f9e80b00f9e", + "87f42f9e84300f9e88742f9e8a706a9e88b42f9e99742f9e8ab03a9e88f42f9eaa742f9e81b00f9e89342f9e87b00f9BBBBL8;FB4a00000000000000d3050000120000003d0f4000000000004a00000000000000910500002a000000d09d420000000000d89f420000000000d09e420000000000L8;FF490", + "1084aaa035638a9e315386901084aab135638a9f315384901084aaa235638a90316386901084aab335638a91316384901084aaa435638a92316386901084aBL8;FF4a25019129194a8b29050091280108abc2010054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050", + "091200108ab62000054L8;FFa3c2ff97e07700b9a04700d1a0c2ff97e07300b9a04700d19dc2ff97e06f00b9a04700d19ac2ff97e06b00b9a04700d197c2ff97f803002aa04700d194c2ff97BBL8;FFf85f57a9fa6756a9fc6f55a9fd7b54a9ff830691c0035fd6a04301d12100805222008052230080522", + "4008052a2e0ff97b6a37ba9e0feff17a04301d1e10316aaL8;FF820302ad410340ad810300ad800745ad8233c03de8bb42f9766e00a9623a803d600606ad800743ad687a00f9755e01a9600604ad820344ad620205ad810341adL16;FFe9f343f9d60600d140071eade0d7c23deab345f942fb803da9831c", + "f8a003983caa0319f8a88317f800010054e0f3c03da02302d1e1431e91f8cb03f9f9cf03f9BBBL8;FF24008052ac000094770a40f9680240f9080117cbbf0208eba9efff54e00313aae10317aae20315aa2300805224008052a1000094770a40f975ffff17e00313aaL8;FF188309913f0700b1001800540", + "0c30391f2240094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eba816005439000014BL8;FF40010054810000b4601240f92200805239f50094611a40f9810000b4601e40f92200805234f50094b40000b4600640f9e10314aa220080522ff50094742a40f9L8;", + "FF630600f9600040f9600200f9130400f9600640f9130000f96272009140fc5f882000002a40fc0388a3ffff35000080d2010080d2f35341a9fd7bc2a8c0035fd6BBL8;FFff0600b1e1000054e83340f91f0500b180000054e8c3009100c10091b00e0094ff074091ff833c91f44f45a9f65744a9f85f43a", + "9fa6742a9fc6f41a9fd7bc6a8L8;FFc80000b40805088be00316aa0201805201ed7cd33835009420c3c63ce87f42b99f0b00b1f66b42b92013803de85302b9c1010054e85342b92013c03d69120a91L16;FFe27744f9fc7700f9f66740f9f02340f9fc5300f9fc6f40f9f53700f9f56340b9e3b7803dec2b", + "4ba9e20713ade8f200f848018052e0a3803db1fcff1720008052BBBBBL8;FB6b6579707269766174655f6b657950656e64696e674b796265725072654b65794964656e746974794b6579506169725374727563747572656d697373696e6720L8;FFb6835ef8d70a138b480313eba8fcff54e8ffff1748008", + "052bf031ff8bf233ea913038052e88300913423139b880240f9e8efffb4800640f901f57ed342008052BL8;FFe5090094e10313aaf3faff97803240f9800100b4610a40f9680240f91f0101ebc0090054680640f9090180522a0400916a0a00f909692138e10313aae6faff97L8;FFe10318aae2031caa42", + "1d0094c8021c8be81f00f9b50000b4e00318aae10315aa22008052341d0094e8a741a940a30091e1030191e2a30091e92304a9e80740f9BBL8;FF3503028b0001138b425d0194683340f960030191e10301912200805208050091683300f9cf580194fa031caaf90315aaffff013942ff46d353e37a925a1", + "74092L8;FF6822099b69060091e0032d91000500ad0209803de9f702f9ccf2ff979c6300917b0700919f0314eb41efff5400030014e8cb45f9090d8052e037c33d6822099bL16;FF1b010094610a40f9a3ffff17f50300aae00313aa22008052230080522400805213010094610a40f9e00315aaa9ffff17", + "e00313aa220080522300805224008052BBBL8;FF880000542800028b08f1df388803f837e0030091b72e0094e80340b9a8070037e80b40f9ca0640f9490108eba30d0054ca0240f9e00740f94801088bc82600a9L8;FFe1031baae30318aa04048152e50314aa06048052e05f873de163873ddc780094480", + "340391f050071e0420154f91700f9347d009400788052210080522d7d0094BL8;FFfd7bc4a8c0035fd60001805201058052d0f80094c0feffd000200491e7f80094fd7bbda9f65701a9f44f02a9fd030091f30302aae20301aae10300aaf40308aaL8;FF1481899ae30314aa0b000094e80740f91f0500f1", + "e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6200020d4fd7bbea9f44f01a9fd030091BBL8;FFa9335538aa131538aa4355382901084aab231538ab535538a9331538a96355384a01084a6b01084aaa431538aa7355382901084aab531538ab835538a9631538L8;FFe8ef41f9e9f3", + "41f9f5031faaf6d743b9f7d343b97a008052e86300f918fd60d3c80080d20800f0f2e95b00f90a490091b7000014fb5f00f9fb4740f9e86340f9L16;FFf16748a9e83f00f968018052e0a3803de43f43a9e0cb44a9b9040014e8c341f91f0500b160200054e84f00f9e8cb41f9facf41f9e0d341f9f8db41", + "f9f9df41f9BBBBL8;FB45aa04a478a45732a17fe142e672185dd2a9fd84b312de084da140c5774f26232f0583d814345557dad0491d752b732ca28cdf4ccddb24ff83e900003a05aaddL8;FF3c8d0094a05000b4f30300aaf4031faa48048052f5fdfff0b56a159136008052e84b01f9e04f01f9ff5301f9", + "0b0000146802148b4904805294620091090100a9BL8;FFc8fefff008ed0a91e86306f908078052e97b06f9e9c32291e86706f9280080d2e97f06f9c90480524838c0f2ff5306f9e95b06f9ff5f06f9e97306f9e87706f9L8;FFe10315aae20314aa0001168b410d0094e083c03cc802148be80f00f960028", + "03d680a00f9f44f46a9f91b40f9f65745a9f85f44a9fd7b42a9ffc30191c0035fd6BBL8;FF00902791eba305a9a86301d1e8a706a9a8a300d1090000f029b103914a017db2e1630191e8a707a9e8030191a3831af8aa831df8e7480194740a40f9680240f9L8;FFfd030091083c40f9080100b4080140b20", + "811c0da081540d2080d088b0825019108fd46d308050091092440f93f0500b1400400540a2c40f9093840f90a0100b4L16;FFf96b42f9ef7b42f9fc7f42f9e86b00f9e8f741f9e78342f9e08742f9e68b42f9f19b42f9e8e700f9e8ff41f9fb9f42f9faa742f9e5ab42f9e4af42f9e82b17a9BBBL8;FF29f", + "d68d3e92300f911f1ff97a8035bb8a9435b78ea0f40f9765a0179687a00b9a8035af869fa0079a9835a78a8831cf8a88357b8a9031d78a9b357b8681a00b9L8;FFe9079f1a818308ad0801094be99741b962c3883ce8e300b9e8cf40f9ead700b9e9bb00b9684308f83a69ff97fa0301aae106f8b6fb031f", + "aae0031baae1031aaaBL8;FFe08b43ade08b0aade18340ade18307ade08b41ade08b08ad402700b4e0c303918cf7ff9787010014e1430091e20313aaf70b00f9f73f00f966050094e08743adL8;FFbf3b03d5e503002a05feff37a100060b80fc5f88bf00006b41ffff5481fc008880ffff35e1ffff17e30", + "300aa000040b94000f837c0035fd60400b01261fc5f88BBL8;FF08011acb1f0308ebc9000054e0431691e1031aaae20318aa44110094fad342f9fc0740919c83019190fbff17f60300aae0431691220080523c110094e1d342f9L8;FF081140f900013fd6e0e302f9e8074091e1e702f908011891290c40f", + "9e163179120013fd6fa034bf95f0f00b18101005408018052baffff17a0c300d101048052L16;FFe127813de22f813de033813d61320054e16742f9e083139102788052e11f00f93cad0094200742ad9f8225f1a0073cad200b43ada00b3dad210340ada1033aadBBBBBBL8;FB726f746f636f6c20616464", + "7265737320697320696e76616c69643a20c0012ec00014626164204b454d206b6579206c656e677468203cc0153e20666f72206b65L8;FF4a09000a8c15000aab8f7c29ae1a000a114011539227000a2128000aad11000acf1e000a3f070031422c000a5023000af1c3911a6b31000a4901094a8a010e4aB", + "L8;FF62020054e80f41b2e80700f907000014c90080d248008052e04300390900f0f2e8470039e90700f9e023009198270094f44f4ea9f95b40f9f6574da9f85f4ca9L8;FFe00315aae10317aa220080523a210094280080921c000014eb3342a91a00001438210094c00180522100805231210094800400", + "b428fdfff0083d3e91f60300aaBBL8;FFa11700b4960080d2e20301aa1b210091f72310911600f0f2fce30f9138008052190380521a018052810340f9340080399400f8b728040091490400d111000014L8;FFe10313aa05faff97760a40f9680240f9080116cbbf0208ebc8080054680640f9e10314aae2", + "0315aa0001168b39610094c802158b680a00f9f44f43a9f70b40f9L16;FF20020037750240f9a80640f9160101eb82020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e003009194e7ff97BBBL8;FB08000000000000000c124600000000009cf545000000", + "00002000000000000000080000000000000080134600000000009cf54500000000001000000000000000L8;FFe1630091b68eff97f71740f9e80f40f9080117cbdf0208eba83d0054e81340f9e10314aae20316aa0001178b39810094e802168be81700f97f0600b18096ff54BL8;FF550001ab621400548", + "982009129fddfc83f0500f121070054960640f9610240f9370016cbea0215ab22140054890240f93f010aebc20d00543f0115eb830e0054L8;FFff074091ff830091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6f60315aa08008092680200f996feffb4e00314aae10316aa2200", + "8052BBL8;FF080840f9090140b22911c0da291540d2290d098b292501910819498b08050091096040b93f050071e103005409a84c29290140b22911c0da291540d2290d098bL8;FF00013fd6e10640f9810000b4e20a40f9e00315aa384100949f0b00b101120054689a42b91f090071e005005468620a91", + "69b20a910001c03d081140b92001803dL16;FFed0740f9ea7b00f9eafb40f9eefb00f9ee0309aae9eb40f9eae700f9ea8f40f9e99b00f9e9cb40f9e4ab13a9eaa740f9e9eb00f9e9b740f9fba700f9fb0316aaBBBBL8;FBeacc85377a8be8b5beb2cebd33236d7fcfe1221e893d1ef33c3308ae05b60000e", + "32f536492bad99bf75aca140a0f60a97adc044a0805a72f22bb307eeacc7240L8;FF29010aab620500542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb89040054280108ab830000541b000014e80308abBL8;FFe96f06f9e89b06f9e81340f9f98b06f9e8d306", + "f9e8274529f48f06f9f69306f9e9b30db9e90b40f9e8c30db9e81b40f9e9eb06f9e96740b9e8e706f9e8ef06f9L8;FFe00314aa210080523700805239110094e0fbffb4e10315aae20314aaf60300aa3c1100940200001436008052745a00a9740a00f978620039f44f45a9f65744a9BBL8;FFf44f05a9fd", + "030091ff8317d1f30308aa08018052ff0300f9e87f01a988e00091f40301aae84702f968ffff9008613e91e07f00a989600191e0c30c91e84f02f9L8;FF6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b29050", + "0913f010aebL16;FF3dd10094e8031d910041019136d8ff97891000142ea0c0a92a7042a9190340f920d05ba9e86b00f9292041a927104da93f0314eb36404ea9e8e700f92b2043a9BBBL8;FFa3ffff9063003a91e0230091020280520401805258010014e003022ae20303aae303042af44f4ea9f95b40f", + "9f6574da9f85f4ca9fd7b4aa9ffc30391b7f3ff17L8;FFfc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff8308d1f30300aae0a30391fb0305aafc0304aaf90303aafa0302aaf80301aaf7a30391e52b00f9BL8;FF80faff544b15c0394c1900912e1900d10c3900a96d190012218c0daaebf8", + "ff363f1900f160f9ff544b19c0394c1d00912e1d00d10c3900a96d19001221a80daaL8;FF60fd9fd2f55b02a92000a0f29f0200ebf76303a9f92300f9480d0054930e00917f7e02f173fe44d3c90300546106009124c59c5264eda072e3fcff90207c0253BBL8;FF0825019108fd46d30900088b39050091", + "3f0308eb681f005431010014e1d342f9e8cb42f91f0101eb00750054e8cf42f949068052f40740919482099109692138L8;FFe0e7076f08188052e9030291a8033da908048052f90300aaa8031ef8e8074091e10318aa08011891000000ad20a10b91822dff97e8034bf9fc074bf9fb0b4bf9L16;FF611a4", + "0f9010100b4601e40f922008052f44f4aa9f65749a9fd7b48a9ffc3029135b10014f44f4aa9f65749a9fd7b48a9ffc30291c0035fd608008092e90300aaBBBBBL8;FB7373686f756c642062652061626c6520746f2073656e6420435453495a450000b51d400000000000560000000000000083000000270", + "0000073686f756c642062L8;FF73010090680240391ffd037180000054f30b40f9fd7bc2a8c0035fd6db9400941f047df2e8079f1a68020039f30b40f9fd7bc2a8c0035fd6ff8301d1fd7b02a9BL8;FF05150114fd7bbfa9fd030091080040f91f0500b1000b0054083040b9e80b0034080140b20811c0da", + "081540d2080d088b0825019108fd46d308050091090840f9L8;FF42008052e96b02f9e86f02f9f67302f9f77702f9430c0094b70000b4e00316aae10317aa2200805233190094b50000b4e0031caae10315aa220080522e190094BBL8;FF030c8052e32f803de08703ada1037dade21b803d95020191a827", + "35a9e18304adb9fbff9700e4006fa0833aada0833bada003d53ca103d63ca203d73ca303d83cL8;FF9c000014e85746f9e95b46f960fdffb000c01091e1032d91e85b04f9e8c32291e95f04f909fefff029611291e8a305f9e8c32791e9a705f9e6540094e89b40f9L16;FF220080523cd90094e10314aae", + "86f41f9c80000b4e07341f9e10308aa2200805235d90094e10314aae87f41f91f0500b1c0010054c80000b4e08341f9e10308aaBBBL8;FFe10308aa220080522300805224008052f4030baaa8040094e10340a9eb0314aa2ca040a9290040f90afc78d39369283808050091280800f96af3ffb4d4ffff17L", + "8;FF2a040091e00318aa09692138e1431691ead302f901120094d6000034e17f52b9e28352b9e343169180008052d61400943f0700b1a0100054e1d342f9e8cb42f9BL8;FFe80300f9e0030091a1ffff97f44f45a9f52340f9fd7b43a9ff830191c0035fd6f503012a74040051e00313aa1b060094e80300", + "aae00301aa28fc073708fc60d3L8;FF4d010c8bac01c0399f050131ecd79f1a7f0500f140040054ae05c039df0501318cd58c9a7f0900f1a0030054ae09c039df0501318cd58c9a7f0d00f100030054BBL8;FFc5340194f50300aa3e390194000880522100805237390194c09701b4a10241adf40300aaa2", + "0e40ad010001ad020c00ade007409100800991b8340194f70300aaL8;FFa1eeff54a022019189d7fe9772ffff17e80f45f91f0500b1e1000054ff0f05f9f81305f9ff1705f9ff330ab9ff1f05f9ff430ab91f0800f1212a0054a02302d1L16;FFe83f00f9e8831d91e9a35d390091c03ce8bf43f9e0030e9", + "1e95f00b9e9030991c1820091022e8052e093803d28f100f838b90094e8c31591a012c93cea8f42f9BBBBL8;FB000000000000000008000000000000000800000000000000f435440000000000506f6c796e6f6d69616c4572726f724368756e6b496e6465784465636f64696eL8;FF5f21296be10000541", + "5054079b37e0853a88358f8ff0208ebe0140054a80000141368b99b680240f91f0500b121130054e12340f91f0001eb22280054e81f40f9BL8;FFc20a40f9e00314aa3b0901941f0b00b1fa432791c100005420afc03de82344f94003803de8f304f910010014f68740f91f0700b1e014005420afc03de82", + "344f9L8;FF604a0054f63f5ca9e8eb40f9e82700f9fa1800b45f0700f1c10b005428034039eb031f2a1fad0071401800541fb500710018005458000014880240f929cd8d52BBL8;FF571740f917fcffb538008052482740f91f0500b121fdff5419008092542340f9b4031df8f40e00b4080d80525a1f40f", + "9fc0300f9fb0f00b9f96301a9f75b02a9L8;FFb7dafe97e103002ae8430691e00315aab4edfe97e8cb40f98082c53c8182c63c8282c73c1f0500b1e00600ade20a803d200c0054f91300f9f9430691fbe30091L16;FFe8ab00f9283840f9eb2312a92ba047a9eba71aa9e84f00f929a048a9e95300f9e8df", + "00f929a049a9e8ab15a92aa04aa9e9a310a929a04ba9e9b700f9eaa318a9BBBL8;FFaa7140f8e90b00f9a97d4039a8031878a87141f8ea1300f9aa0302d1ec2f00b9533100f8a88316f8a9031738ba0000b4e1031aaa220080522f690194f95f40b9L8;FF602a40f9220080523b69009474d643a9750300b", + "496c2009104000014b50600f1d6a20191c0020054c1025df8810000b4c0825df8220080522f690094c1825ef8BL8;FF21050054e0031faa8dffff17c80080d2e00700f90800f0f2080900d17effff17e90b41b2e92300a983ffff17c80080d20800f0f2080500d177ffff17c80080d2L8;ZDBBL8;FF03e40", + "06fe283cc3ce8430691e0c30e91808506ade083cb3cc1e20091e2430e91fa030b91808907ade3838b3ce3838c3ccdc4ff97e89341b9080e00362007c03dL8;FFf30200b4e00315aae10313aa22008052f44f44a9f65743a9f85f42a9fa6741a9fd7bc5a834290014c80240f9ff0208eb2002005408068052", + "8002c03d890a40f9L16;FFf65709a9f44f0aa9fd0302915f8000f1e20300f941060054680040b91f050031e006005400e4006f1605001189008052c80ac05af40301aaf30300aaa8c31fb8BBBBBBBL8;FB207765726520746f6f2073686f7274203cc0013e002d6d697373696e672073656e646572206b65", + "7920737461746520666f7220646973747269627574696f6e20L8;FF3da30094e11f40f9810000b4e00740f92200805238a3009468008052400bc03d49f342f8e0030891682200394003803de80309aa49f300f8290080924003c03dBL8;FFa02301d1a9ab3ba908270094a8035ef8b7031ff8140117ebe30", + "70054b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcbL8;FF880000b4e10308aa220080523a230094b60000b4e00317aae10316aa2200805235230094b40000b4e00315aae10314aa2200805230230094f44f4da9f6574ca9BBL8;FFba035df8480317cb1f0308e", + "b681a0054180100b4a8835df8e1031caae20318aa0001178b3b630194f702188bb7031ef85f0317eba01b0054a8835df8ea060091L8;FF48050091680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd6f50300aae00313aa2200805252020094610a40f9e00315aaccffff17f50300aae00313aa22008052BL", + "8;FFe10700f90800f0f2080900d107000014e80b41b2e00700f904000014c80080d20800f0f2080500d1e80300f9e003009197e9ff97e10300aae10300f981feffb0L8;ZDBBBL8;FB4a00000000000000b602000009000000000000000000000008000000000000000800000000000000b4e745000000000", + "0496e76616c696453657373696f6e4572L8;FF1f0101eb60680054e81340f9958248f8490980520969213828040091bf0600b1e81700f9a0190054802202917feaff97080040b20811c0da081540d2080d088bBL8;FFff2b02a9cafeffb04a0d0891ea2f04a92a0080d2f50308aaea0bc0f2e97f03a9f703", + "02aae92b06a9f60303aaebfe0094e30316aae00314aae20317aae80315aaL8;ZFBBL8;FFe82300910900009029a13f91e82702a9e3430091d53e0194fd7b43a9ff030191c0035fd6202040a941ffffd021343291030d40f942038052fd7b43a9ff030191L8;FFe20313aad5fdff97000100b4d6000014e01", + "c00b5e00313aaaefeff97e80301aa40010036481d00b5e1031faa61f9ffb4f1000014e20313aa430c805214f9ff97L16;FF08008092e12fc33dfc0318aae87700f9f57b40f9f8030baae56f40f9e72340f9e08710adefb344a9edef49a9f1a34ca9eb030faaf00346a9f7030daaed0740f9BBBBL8;FB7220", + "5570646174655369676e616c5f5051434b415f56315f4d4c4b454d3736383a656b68656164657200000000000000b51d4000000000005600000000000000L8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb281000548a000014f30300aa4a0c0094e80300aae00313aa090140b", + "22911c0da291540d2BL8;FF6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebL8;FFf70316aae8000014fa031f2ae88343b9093340b8eb130491ea0343b9e80302b9e80b467969f10fb8e993", + "41f9e8fb0379e8a34c39eafb01b9e8c30739e8ab40f9BBL8;FFdb4f0094e82340391f050071e1000054e84340391f0500714c04005428050035e90f41b230000014e99340b8ea0f40b9e093c33ca91b00b9e92341b8aab301b8L8;FF82e20291e16340f9081140f900013fd6e03b02f9e8031691e13f02f9", + "290c40f9e103129120013fd6fbc342f97f0f00b1e1000054c800805223ffff17e8e32291L16;FF0aa544a9ec5700f90d3158a9fa8305a91af940f9eacf00f9070954a9e9b300f909a945a9ed6f00f9043559a9ec5f00f910195aa93f030aebeba717a90ba546a9BBBL8;FF490d80522a040091e00315aa6a", + "0a00f909692138e10313aa24f9ff97770a40f9680240f9080117cbbf0208eb081f0054680640f9e10316aae20315aa0001178bL8;FFe20318aa00011a8b42730094f90b40f94803188be8d302f97f0700b1fb0314aaa053ff54e80740910881099100210491e14316911310009497faff17c0fdfff0BL8;F", + "Fe10317aae20314aa230080522400805217170094770a40f9c9ffff17a8831ff8a84300d1c90000b029b10091a0feffb000440691e8a700a9a82300d1c2feffd0L8;FF00e00b9163080011212c46d306786178c66c1c53607c061b014000110300001463040011e103022ac200010b400400510000014a1f", + "fc3f714dffff5480804039BBL8;FFe8cf42f9490180520969213821040091f47749f9e1d302f99f0a00b1e14a0054e8cb42f91f0101eb00ba0054e8cf42f9290400911f692138e9d302f985ffff17L8;FF810640f9210100b4820a40f9e00313aa39330094ffc32091f44f42a9fc5741a9fd7bc3a8c0035f", + "d6ffc32091f44f42a9fc5741a9fd7bc3a8c0035fd6e8434e39L16;FF0800f0f2f62702f9161d00914083843ca003d83c4383853ca303de3cf52b02f9e107813de20b813de00f813da2033aad4083c53c4283c33ca103933c4183c43cBBBBBL8;FB6d0000000e000000ef104000000000004e000000000000", + "00b904000017000000ef104000000000004e000000000000005707000005000000ef10400000000000L8;FFba0218cbe803082ae9830039a0050054aac303d1496928380805001137000014e10740f9e80319aaf90301aad4010034a8c303d13900028b0001148b359b0094BL8;FFe8c30091f3160194684", + "e41b9090000d029312291f52705a9e96300912a0200d04ab11491a80319b8080000d0080123910b0000b06bc10491e92306a9a9630091L8;FFb90000b4e0031baae10319aa22008052391b0094fae740f923fdffd063e02d91e0431391e2031caae4018052e1031aaac30d0094fb6f42f9e17342f9e80740", + "91BBL8;FFa70317b8074c41b999b20db8bb677ca9bc0316f8be8316387f0700b100fdff54bc0357b89eb24db83f000071e86300b9fcab00b9bc0356f89e3208b8be835638L8;FFe05306f9e083329161fdfff021203f910202805263fdfff063003a91040180528700001448008052e0a33239e8a73239c8", + "0080d20800f0f229000014f30300aaL16;FF28008052ff0f00f9ffa300a9a0e300d1e1230091132a009428008052a083dc3ca183dd3ca283de3ce82300f948008052e08700ade203833ce80700f9e0230091BBBL8;FFe90344a9080009eb63100054ff0208eb68080054340117ab42100054f42300f90907", + "40f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889aL8;FF692a01a9e9d742f97822012908008092680200f9490d00b4e8d342f91f0115ebea33959a08010acbaa0208cb33010aeb091d0054e90315aae8000014e81b40f9BL8;FF49c100117f2500710960003909819f1a9f7d02712", + "9010b0b8b0d00120a819f1a29c100117f2500714a114c0b0964003909819f1a2c3c403929010b0b2b384039L8;FF8b118e9a7f0271f20835530a4a010baa6e3a4ed311fc4bd34b0158b24c0558b24d0958b24b018b9a4c018c9a7f0271f24a018d9a1f0052f26d6218538a018a9aBBL8;FFb56200d178673", + "fa9788701f8dc0200b4b50200b4d80a40f9f8feffb4da0640f9383b0194e00318aa21008052313b0194c00200b4e1031aaae20318aaf90300aaL8;FF75b240f93f3b0094e00318aa21008052383b0094e0d500b4e10315aae20318aaf70300aa3b3b009402000014370080527ac240f91a0200b4f4031caa", + "fc031baaL16;FF960100b49722009104000014d60600f1f7620091e0000054e1825ff881ffffb4e00240f92200805233bb0094f8ffff17353400b4a806158be00314aa02018052BBBBL8;FB792033322062797465730000000000007a134000000000005700000000000000dc0200001200000070745f766", + "5632073686f756c6420626520636f6d706c6574L8;FF0065803da002803db60a00f980110054f63340f973060091b5620091df0213eba1f8ff54e00314aae10318aa42008052318b0094f8eb44a9f40319aaf90316aaBL8;FFe99f40f9e027c13d16d10791e8a344b9f59302b93f0500b1c002803de8a702", + "b9002c0054e8c3179160630291e4a3ff97e8c357391f050071002c0054e9c31791L8;FF400b00940004805201018052390b0094400100b4165400a901fdfff021400991144c02291f600039f44f42a9f65741a9fd7bc3a8c0035fd60001805201048052BBL8;FFe00bc03de10fc03de213c03de317c03de3", + "26833de222833de11e833de01a833d7f6600b9e2aac43de3aec43de4b2c43de0a6c43de1a2c43d7f0200b9e20f02adL8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd680fdffd000800591e146009480fdffb000603e91L16;FFf50305a", + "ae50312aaef031eaafe0308aae8030eaaee0311aaf1031baafb030aaaea030daaed0314aae0f3803d8d020014082340391f050071c1020054e0430f91BBBL8;FFf70300aaf60308aabb0302d169001c6be37f00b9e51b08a9fc9700b942090054f8d640a9e2031aaae00318aae10315aad50200941f0400f", + "1810200543f0015ebL8;FFfd7bbea9f30b00f9fd030091080040f9f30300aaa80000b4600640f901f57ed342008052346b0094680e40f9a80000b4601240f901f57ed3420080522e6b0094BL8;FFe00314aae22fc03de86340f9a0873cade08742ada2039b3ca8031cf8a0873aade28343ada2833bade183", + "40ada18338ade28341ada28339ad1af3ff97a0877cadL8;FF290080520e4100390d450039090100f9c0035fd6ff0301d1fd7b02a9f31b00f9fd8300912c0840b94a0840b9f30300aa290040f94b0040f99f010a6bed379f1aBBL8;FFfd7bbca9f70b00f9f65702a9f44f03a9fd030091350440f9f30300aa", + "d50100b4340840f9370040b9340200b4352b0194e00314aa210080522e2b0194800200b4L8;FFe90f80123f002071ea0f801229140033c20000542a7c0653090500394a051a320a01003912000014eb0f80122c7c10532b2c0633ec0000352a7c0c530b050039L16;FF280000146c0400f1400900549f290", + "0f14d018052eb031faae9031faaea031faa8c318d9a4d040091ae696a384a0500915f010cebcf194092ce1d0013ef21cb9aBBBBBBL8;FB7970743b2073656e6465722072617463686574207075626c6963206b657920c011206d65737361676520636f756e74657220c0002f636172676f2d6769742f73L8", + ";FFe82340f9e93f01f9e90340f9f87b01f9181140f9f76f01f9b70301d1ff0701f9ff1301f9ff1f01f9ff2b01f9ea3301f9ff3701f9ff4301f9e94b01f9ff4f01f9BL8;FF94fcff35e003088be10313aaf2fcff9775fdff34610a40f9680240f91f0101eb60020054680640f9090180522a040091e003152", + "a6a0a00f909692138e10313aaL8;FFfa6708a9f85f09a9f6570aa9f44f0ba9fd83019109304039e9080037170840b9f30300aa160040f9a06300d1f40308aae103172a0b120094b50f7fa9e0630091BBL8;FF61070054e0830b913fe3ff97e0830b91e1e300919e160094fc7341f99f0b00b1e0fdff54f57", + "741f9fb7b41f9e04306912163009102288052365f0194fa2740f9L8;FFf5fb45b9ea0f03f948fd60d3fcfb42f9e9231839b47e0853e0c2c13ce1c2c03ce8a305b9e067813de163813db30700143b008052f4b340f974faffb535008052L16;FFfd7bc4a8c0035fd6e8031faa74f7ffb5e00308ab43f8ff54", + "a0feffd000600291e6da0094e00313aa2200805223008052240080520e030094610a40f99fffff17BBBL8;ZBL8;FFe20316aa230080522400805218a3ff97f71740f902feff17f50300aae063009122008052230080522400805210a3ff97e11740f9e00315aa21feff17e0630091BL8;FF0cfb00941f040", + "0f161010054fffedfc8c10640f90107f8b7c00240f92200805235ff0094e00316aa010380520201805231ff009468fe4ad309088052f80313aaL8;FF8514403825140038f9ffff1741ffff1703fc43d306f07d9204000014826865f8226825f8a5200091bf0006eb81ffff54030c03cb2200058b8400058b", + "02000014BBL8;FF98060036a02303d111c3ff97e18344a9a82303d19b390094a883533808060036a80354381f0500718c090054e80d0035e90f41b273000014880700d109008092L8;FF78ca43f9fa5f09a9f7db43b9f6df43b9e86300f9e8f741f9fafb41f9f55300f9fbff41f975c643f9e85b00f90803", + "40f9680000b4e00315aa00013fd6010740f9L16;FFe9e742f9e8eb42f9f66300f9e82300f9e97700f914e900b43abf0094e00314aa2100805233bf0094c04101b4e1031caae20314aafa0300aaf60314aa35bf0094BBBBL8;FB5c3f3db95a978f187637506e0d61ed3ea28c3f90a8ea0000136ad750c2477", + "6c7543c9f1d48f267050a21aeb7487cc268260bca0124606c0f99c38f27e296114aL8;FF48008052f32f00f9e81b00f90a000014e87b40f9e93740f9940a00912905009113693638f32f40f93f4100f1f47f00f940830054e93700f915030036284d1c9bBL8;FF682900b5e1031faae1ffff17e1031faae8", + "830cb9deffff17e18b0cb940ffff17a88357f8080540f9150101eb232c0054a88357f8080540f91f0115eb290b0054L8;FFcf010094f55342a91f000014b400f8b6f7031faae00317aae10314aace0a0094d40200b4370f0094e00314aa21008052370080522f0f0094e0feffb4e10316aaBBL8;FFe33380", + "3de22f803de12b803de027803d682600294809c05a6909c05a682601298809c05aa909c05a68260229c809c05ae909c05a68260329f44f5da9fccb40f9L8;FF3f0500b1e01e0054f30300aae00308aa22040094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b1", + "30500917f0209ebL16;FF683e00a98c0e00140823403908051f121f09007141020054e0031d9181220091032b0091f4031d9101210094e8a343f9eaa743f9ebab43f9e9af43f91f0900b1BBBL8;FFa3ffffb0635c0191e023009142028052440180522d750094e90740f9e0feff17e00700f9a1ffffb021b", + "40291a3ffffb063540391e0230091a201805224018052L8;FFa80302d14900009029b10891e8a703a948008052c9fdffd029c11d91eae30091a04700d1e8271ca9a8fdff9008251891e82b1ea90a078052c8048052ff2719a9BL8;FF0900f0f2e0830091e8a70039e91300f99ff5ff9709000014e10740f9", + "e10000b4e80b40f9f30300aa22008052e00308aa31ef0094e00313aae01300f9a1fefff0L8;FFe503022a60010054e503014b3f1000717fc82538ed0500547fb01f3861c01fb801d05f382110001221800151251c0012421c409205d01f38e30380124418049bBBL8;FFe20318aa00011a8b422f01944803", + "188bf90b40f9fa0740915a830991e8d302f9f88b49f9b80300b4e1d342f9e8cb42f9f98749f91f0101eb40430054e8cf42f9L8;FFe8a74329e9c73f39e8cb3f39e8a74229e9cf3f39e8d33f39e8a74129e8db3f39e80b40b9e9d73f39e8df3f39e80356b9e8ff3f39e807409108011891d92a0094L16;FF2", + "a0d8052ff2704a929feff9029d12591e82b09a90a0b8052e92b06a9290080d248038052c90fc0f2a02700d1e1030191e87f05a9e82708a9e8aa009431af0094BBBBBL8;FB120100002e00000042024000000000006a00000000000000bd0000002e00000042024000000000006a000000000000001901000", + "02e0000004202400000000000L8;FFe9031faa0a2440f9aaf9ffb50a3040f9e903098b8afaffb5daffff1700fefff000a03f91e592009400feffb000200c91e2920094fd7bbfa9fd030091081840f9BL8;FF080c47f81f0500b160180054b2feff97080040b20811c0da081540d2080d088b0825019109fd", + "46d30800098b080500911f0109eb28170054e4000014080c43f8L8;FFa04700d1a2c4ff97e07700b9a04700d19fc4ff97e07300b9a04700d19cc4ff97e06f00b9a04700d199c4ff97e06b00b9a04700d196c4ff97e06700b9a04700d1BBL8;FF0109005436008052580100b4f90314aa28174038e9164038", + "1f01096be0179f1a4d6c0194180700f11600160a21ffff54e003162a486c01941f1c0072c0070054L8;FF810640f9810000b4820a40f9e00313aa395700949f0b00b101030054e89f40f9c002c03dc91240b9f59342b91f0500b1e063813de99305b96000005460630291L16;FFf5df02a9f51f00f9f96b0", + "829fb630929f45300b9e82f00f9f9500094e0a300917f0200f902e0ff97f44f5ea9f6575da9f85f5ca9fa675ba9fc6f5aa9fd7b59a9BBBL8;FFa8031df8a27d0094f70300aae10740f9810000b4e00b40f92200805236770194e11340f9810000b4e01740f92200805231770194e11f40f9810000b4e0234", + "0f9L8;FF220080523c770094e19f49f9810000b4e0a349f9220080523777009460220291fa0a009408fdff17f37749f97f0600b180030054e19b49f93f0400b140010054BL8;FFe10000b4601640f922008052f44f42a9f65741a9fd7bc3a837f70014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f5", + "0b00f9f44f02a9fd030091010040f9L8;FF2100028b840200b4220040b95f18007180feff545f080071a1feff54e5feffb4230840f9a30003cbf4ffff175f000a6b41feff54221440f9e80040b95f0008ebBBL8;FF680e00f908008092e04f813d6082803c680200f9ff0600f1cacbff54fb010014f7e74d", + "f9e80740910103198be00317aa08812f9185ac0094e8f34df91f0900f1L8;FF3f0000f10841899a1f2d00f1e20a0054c80240f9a80000b4c00640f901e97bd30201805234370094e00316aa010980520201805230370094e0431591e1431a91L16;FFe9435e39e95f00b9e903099128f100f840b70094efc", + "31391a092c83ce1b7c13de2bbc13dea3f5739f00314aaebd14d78e0d7803de6030991e0a7c13de10b19adBBBBL8;FB207761732076616c69643b206d75737420686176652072656d6f7465206964656e74697479206b657900000000000000bb124000000000003800000000000000L8;FF6b1540d26b0d0", + "b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500542a0140b2BL8;FFe9e32291c082893c4043ce3ce0234d39c282853ce11740b9e33740b9408708ade42740b9fb6304f9020140ade8031691f56704f9f76b04f9428309a", + "de90300f9L8;FFf60300aa20008052d60c00b4e00316aae10315aae20317aa3e070094228f7fa9e00316aae10317aa3b020094400d0037e00316aae10317aa220080522e070094BBL8;FFfd7b49a9ff830391c0035fd6b4835df8c7ffff17a0031df841fffff02180059143fffff063e40491a0c300d1020", + "380524401805209000014a0031df841fffff0L8;FF220080523c4700944dfeff17fb0300aaf80b00b99a0400b4fb0300f939470094e0031aaa210080523b0080523147009440f8ffb4fb0340f9e2031aaafc0300aaL16;FFe90742f9f0030aaaeb0b42f9e3cf42f95f0500b1e8e700f9e80342f9fcff41f9", + "e9ff00f9e91b42f9e71342f9e8bb00f9e80f42f9fa5342f9e9ab00f9e92342f9BBBL8;FFe90f41b2410000147f020079fd7b47a9f34340f9ff430291c0035fd6a8135db8a9435db8ab035f38aaa35db8ac835d78e83300b9a8e35d78e93303b8a9835ef8L8;FFc0fdff9000403591ef620094c0fdff9000a", + "03591e9620094ffc300d1fd7b01a9f44f02a9fd430091280840f9290040f91f0002f1431a00543f0108eb13601932BL8;FFe00302aaf30302aaf40301aa23f4ff97e80300aae00301aa08020037750240f9a80640f9160100eb62020054e80f41b2e80300f907000014c90080d248008052L8;ZDBBL8;FFe", + "0000054e1825ff881ffffb4e00240f92200805238270194f8ffff17d50000b4a806158be00314aa0201805201f17dd331270194745642a9950100b496220091L8;FFe00313aa0109805202018052f44f41a9fd7bc2a83827001421010054810000b4601240f92200805233270094611a40f9c1fdffb40804", + "805205000014611240f9L16;FF3ca70094e30b40f9f60319aaa0fdffb4d91100b47f0303ebe8031faaed33839a6a030dcb6c000acb4e01198b29030ceb2be179d3691109cb6b808e9a3f030cebBBBBBBBBL8;FB793a20c00e20616e6420636f756e7465723a20c0152e2053657373696f6e206c6f6164656", + "420666f7220c0022e20c0172073657373696f6e2068617320626173L8;FF3f3100b92a8103a92aa104a938fd05a93f6900b9610100b4e00314aa22008052f44f4ba9fb3b40f9f6574aa9f85f49a9fa6748a9fd7b46a9ff0303912ea40014BL8;FFc0025ff8220080523b240194c10240f9810000b4c00640", + "f92200805236240194c10e40f9a1fdffb4c01240f92200805231240194e9ffff17681a40f9280100b4L8;FFf4030caa32000094e10340a9ec0314aa2aa040a9536928380afc71d308050091290040f9280800f92af3ffb4e4ffff17e10300a9e00301aae10308aa22008052BBL8;FF08190d91a203df3ca3", + "03dc3cf6030391c9018052e0030391e00709ada0077cade253803da203d73ca1c302d1e203019103088052e347803de08706ada1037dadL8;FF74040034610a40f9680240f91f0101eb60040054680640f92a04009109028052e003142a09692138e10313aa6a0a00f9f44f42a9f50b40f9fd7bc3a8f7fcf", + "f17BL8;FFf65746a9f85f45a9fd7b43a9ff030291c0035fd637008052180080921901805206000014e20313aa430c8052c5eaff97e10300aa00feffb5a80640f91f0116ebL8;ZDBBBL8;FBbb124000000000003800000000000000d900000016000000bb124000000000003800000000000000f00000000d", + "0000006d697373696e672072656d6f74652069L8;FF08fd46d30900088b37050091ff0208eb482f0054e1010014e11740f9e80f40f91f0101eb807f0054e81340f9938248f8490a805209692138280400917f0600b1BL8;FFefef41f9a04302d1a0833cada0833dada0833eada003d73ca103d83ca203d93", + "ca303da3ce3d7803de2d3803de1cf803de0cb803da003db3ca103dc3ca203dd3cL8;ZFBBL8;FF4cf2ffb598ffff17ea031faae9faffb5ddffff1740ffffd000600691e73f019440ffffd000600a91e43f019440ffffd000a02f91e13f019440ffffb000203c91L8;FF830700544d1dc039ae1d00128c550e", + "0b8c0148518d00f83761710c8b0b018052140000148d7d1c53ad0600340d00be528d010d0b4c2180396b710d8b8c00f8b7L16;FFe9c740f9e8c700f908018052e98b00f9e9df40f9e87300f96ef9ff17e87740f9f40309aaf5030aaa0021009197cbff97e0032b912ccbff9708008092745601a9BBBBL8;F", + "B6569766564726563656976696e675f63743200000000000085154000000000004c00000000000000e200000031000000a1104000000000004d00000000000000L8;FF080040f91f0900b1a1000054e0031faaf30b40f9fd7bc2a8c0035fd6080141d2e90080521f2d00f10831899a09feff9029f109918a", + "0000102b6968384a090b8bBL8;FF0825019108fd46d308050091091c40b909050034290140b22911c0da291540d2290d098b2925019129fd46d3290500910a0840f94a0400b40b0440f9ed031faaL8;FFc9c9ff54e0830c919dedff97e8cf40f9880000b4e00759a92200805236140094e0030c910eedff9", + "7e0830a9194edff97e8e340f9880000b4e0875ba922008052BBL8;FF152100911600f0f2f7a300910a000014e1e30091a2630091e003082a7ed8ff97001200b5b70f40f9f50317aaa28e40f8020e00b4e10240f9200080398000f8b7L8;FFe9670d912283c93c20f18f3c2083c83ce9a70b9121f18f3ce9e", + "70b912183c33c20f18f3c2083ca3ce9270c9122f18f3ce9670c912283c53c20f18f3c2083c43cL16;FFe4974329412b0094e8ab45f91f0500b1e1b6ff5474ffff17e0d7c23de8b345f980feff900040189183feff9063001b9184feff9084e01891e2431e9121048052BBBL8;FF951640f9550300b4610a4", + "0f9680240f9961240f91f0101eb00340054680640f9490380522a040091e00315aa6a0a00f909692138e10313aa1cfaff97770a40f9L8;FF1f0101eb40440054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9fd0c0094fad342f9e8cb42f908011acb1f0308eb48430054e8cf42f9", + "BL8;FFf44f41a9fd7bc2a8c0035fd6c20700b4fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd0300914804028b49008052f30303aa340d002a3940009118f17dd3L8;FF600640f9200800f988000014a1cd89d2f55b02a9f5230191c138a8f22000009000201d91130080d2a17e019bf60300aae1270", + "0f9000440f9090000140100138bBBL8;FF60c10054eb074091e8cf42f92a0400916b8109914902805260c1009109692138ead302f9ef1d0094e1431691ea110094e0df92b980010034e1d342f9e8cb42f9L8;FF030000141f40407156379a9aa80357f8080115cbdf0208eb28040054a88357f81f0002710", + "801158b03fdff54e90f80121f00207109140033c20000540a7c0653L16;FFd5af0094806ec03d8a220791886206910101c03d88d640f989e240f940838f3c4001c03d81220091a80317f888ee40f9e007813d807ac03da98318f889565fa9BBBBBL8;FB2066617220696e746f20746865206675747572657", + "365745f72656365697665725f636861696e5f6b65792063616c6c656420666f72206e6f6e2d657869737465L8;FFf85f47a9fa6746a9fd7b44a9ff830291c0035fd620008052e10315aace9700940001805201308052cb970094fd7bbaa9fb0b00f9fa6702a9f85f03a9f65704a9BL8;FFfd7bc4a8c0035f", + "d6e00313aa2200805246000094610a40f98affff17f50300aae00313aa2200805240000094610a40f9e00315aa92ffff17e00313aa22008052L8;FFe3431391e00313aae2018052f6cb01b9e86b02f9e87302f9c7f2ff97e08308913c18ff97e16b02f9e343139182018052e06f02f960620491e17302f92", + "1fdffd0BBL8;FF0101819a2201829af50304aaf40303aae08304ad7d1e0094a80356f81f0500f1000d0054b68302d108088052f7030091c082c63cc182c73cc282c23ce00703adL8;FF3f10007121010054602e00b5a02302d171f4ff97e80301aaa0030036c82e00b5e1031faadbffff17a22302d1630c8", + "05257ecff97e10300aac0faffb478010014L16;FF96ffff17e00313aa22008052230080522400805216000094610a40f99dffff17e00313aae10316aae20315aa23008052240080520e000094760a40f9680240f9BBBL8;FFfd7bc2a83c7c011421010054810000b4601240f922008052377c0194611a40f", + "9c1fdffb40804805205000014611240f93f0400f12bfdff5408028052806a68f8L8;FFe04316910242805221800991417c0094e01fc53de123c53db8008052e82369795401805215008092e057813de15b813de8e30a7985000014e8d342f9e067c13dBL8;FFc0035fd6f7031faae00317aae10314aad1f7", + "009408fcdfc8081140f91f0500f1e0179f1ac0035fd6fd7bbda9f65701a9f44f02a9fd030091150840f9160040f9L8;FF0b010039a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaf603012ae10314aae20315aae6feff97e103162ad2ffff17fd7bbda9BBL8;FF4901084a", + "aa635638a94316386901084aab735638a95316384901084aaa835638a96316386901084aab935638a97316384901084aaaa35638a98316386901084aL8;FFe8430e91e9d301f9694240f9e8db01f9688d4ff8ead701f9e9ab09a94ac14139090180521f0500b1686100d1e9e301f9eab300b9ebeb07a9e84", + "b00f9ffe701f9L16;FFe8c3159100a1019131c5ff97e87740f98b010014fa031faae0000014fc031faaf60000145a008052f70318aade000014f7031f2ae8eb41f91f0500b180000054BBBBL8;FB0f26341bda8b07e91c6d4a2c7a47a1b3d7a7539ac0e0f1fbd1a00da647de446fa28cd20aeaedc4ad9284", + "0000ba67f34e46444ac5f0cf39795cde26cba649360fL8;FF4a010d4a4d5a7078f44740f929010b4a4a010c4aa801084a20010a4a097c18535a0b0091080300795f0314eb495a69780920094a2a5d10534a5a6a784901094aBL8;FFe96f06f9e1833291e95706f9c9fefff029ed0a91eaa705f9ea032d91e", + "86b06f9c8feffd008091e91e96306f9290080d2e87b06f9c80480526940c0f2ea7f06f9L8;FF140800f91f60003913640039f44f42a9f65741a9fd7bc3a8c0035fd60001805201048052cb070094fd7bbea9f30b00f9fd030091f30300aa320c009400028052BBL8;FF570400b4a002168be10318aae2031", + "7aa404c0194d602178be00318aae10317aa22008052f60f00f9334c019418000014344c0194800380522100805234008052L8;FF2b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8bL16;FFe8", + "df40f9e92702f9e82f02f9e8af40f9f07f02f9e83702f9e8c740f9e78302f9e83b02f9e8b740f9e68b02f9e84302f9e8cb40f9eb8f02f9e84702f9e89b40f9BBBL8;FF680240b20811c0da081540d2080d088b08250191681a488b08050091d50600b4a90240b22911c0da291540d2290d098b29250191a9", + "1a498b29050091380108abL8;FFe0031faaf2670094fd7bbca9f70b00f9f65702a9f44f03a9fd030091150040f9bf0600b1a005005414d840a9f30300aa960100b49722009104000014d60600f1BL8;FFa0873bade08741ada203993ca08739ade08b42ada08b3aade08740ada08738ad20f4ff97a0077ba", + "d880080d20800f0f2880200f98082853ca2037cad8182863cL8;FF0200023240fef736427c4093e00304aa480c80d2011080d2030080d2010000d41f9800b140feff5480fc5f8880feff3585fc0088a0ffff3520008052c0035fd6BBL8;FFe87740f91f0500b1e00c0054e82300f9e9234fa9e082c33c006", + "30291e82703a9f62351a9e95750a9a0839d3ca8031df8e8a30391e92700f98ac7ff97e8630191L8;FF19008092542340f9b4031df8f40e00b4080d80525a1f40f9fc0300f9fb0f00b9f96301a9f75b02a9f54f03a9937e089b342c0094e00313aa010180522d2c0094L16;FFe28310ad88f203f83bac0094", + "a1835cf8810000b4e00f40f92200805236ac0094e00318aa010480522200805232ac0094e16342f9f81340f9810000b4e01f40f9BBBBBBL8;FB656372797074656420c00e206d6573736167652066726f6d20c02620776974682063757272656e742073657373696f6e207374617465202862617365206b6", + "579L8;FFf44f05a9fd030091ff830ed1280840f9291440f9e80f00b4e92b00b51f4100f1a12b0054390440f9f8031faa5500805217038052e01f00f9ff7f1fa9ff1701f9BL8;FF0800f0f20809009100ffff17c80080d2e10b00f90800f0f2080900d10f000014c80080d2a1831df80800f0f2080900d11a", + "000014e80b41b2e00b00f907000014L8;FFa88319f800030054e18b42ada0a301d1a003d83ce20301ade107803d23f9ff97f80740f912000014600bc03de00f803de14740f9810000b4e00316aa22008052BBL8;FF04000014f70600f118630091e000005401835ff881ffffb4000340f922008052356001", + "94f8ffff17e8bf42f9c80000b40805088be00315aa0201805201f17dd3L8;FFe82b40f91f0500b1c0000054e017c03de83340f9e00f803de82300f90c000014e8a745a960fdfff000c01091a18301d1a82739a9a8c301d129feffb029611291L16;FF230c8052cfe6ff97e10300aaa0f7ffb4b4ffff17e10", + "31faa883e00f9b9ffff17e1010054e1031faaaeffff17c80080d2e10700f90800f0f2080900d19effff17BBBL8;FB00000000000000000000000000000000000000000000000000000000000000000000000002020202020202020202020202020202020202020202020202020202L8;FF23008052240080", + "5219a4ff97e11740f9edfbff17e063009122008052230080522400805212a4ff97e11740f9fffbff17e0630091220080522300805224008052BL8;FF3d000114f44f42a9fd7b41a9ffc30091c0035fd6c0feffd000203d91c3feffd063a03c91c4fefff084e00791a20700d161058052d0fb0094c0035fd6", + "fd7bbda9L8;FFf60300aa4180889ae0230091e20313aaff0700f964100094e803002ae0031faa68010035f50740f9350100b47f0214ebe00315aae10316aa6232949a35000094BBL8;FFa22301d184c4ff97a0f9ffb47d0000143f1800716c0300543f140071e00500543f18007161080054a8835ab84800", + "0037b9831af8e1d20191a22301d185c5ff97L8;FF210400545707003676b641f978ba41f971620e9168be41f96ac241f96bae41f96db241f96fa641f970aa41f9699641f96c9a41f96e9e41f977a241f9f45740f9L16;FF7c6347a9792f40f976af40a9744340f96f4b40f968d741a99f0700b16ca742a96", + "18343a96aeb44a9773b5129803c0054ff420171403c0054df0600b1407f0054BBBBL8;FBf9154dcaedd571644007d877e3ee71395db1c30e3743d71cd11b0100744059e124d3e459e4590000dd84009d009d00000000000000000000777a16b316b30000L8;FF09050034290140b22911c0da291540d2290", + "d098b2925019129fd46d3290500910a0840f94a0400b40b0440f9ed031faaec030aaa6b4100916e8541f8cf0140b2BL8;FF02018052e02b833de12f833de233833dd2f4ff97f3f742f9e8ef42f97f0208eb61000054e063179167aeff97e8f342f909068052e02fc13d6822099be133c13dL8;FFe00b803d", + "e91b00f981010054e1230091e2830091e00314aa7ee6ff9728008092680200f9f44f49a9f54340f9fd7b47a9ff830291c0035fd6a003df3ce10bc03dBBL8;FF7f0700f1b60208cb000200541703088b94a2009158018052560800b4818a7fa9c80600d1f8020039160102eba3070054e0060091946200911", + "700028b35500194L8;FF08050091090840f9090300b40a0440f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191ad194e8bbf010cebL16;FF09a0c0a91a2845a90078c03d0b484da91c0441f9e86b00f9162042a93f031cebe94700f9090c41a9e0b382", + "3de8bb00f9085443a91b4446a90e9853a9e9231fa9BBBL8;FF810240f9290080398900f8b7280400914a0400d115000014f70303aaf60300aa5f2800f1880000542800028b08f1df38a805f837e0230091ae210094e80b40b9L8;FF680a00f9fd7b43a9f32340f9ff430191c0035fd6c0fdffd000203d91c", + "3fdffd063c03191c4fdffd084003e91a27f0091e1068052d06b009420008052c1008052BL8;FFe10314aae20313aa40fcff97600400b5e1031faae4ffff1761020054e1031faae00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6880080d2e10700f9L8;FFd4c01fb801d05f3821100012810001", + "0b01d01f38f35341a9f55b42a9f76343a9f92340f9fd7bc5a8c0035fd601d05f38840a1b53f5ffff17040c40f2a1020054BBL8;FFfbab49f9fa0740915a8309917f0700b18017005440c30391af170094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebL8;FF7f", + "8318f101320054e11742f9e003279102c480523f300094e007409181008052ff0316b900001891732a0094e80356b9e00740918100805200001891ff0316b9L16;FFf44f4aa9f65749a9f85f48a9fd7b47a9ffc302919db7ff1725fefff0a5c02591e103009162220891e0031f2ae3031faab5ab0094fd7b", + "bea9fc4f01a9fd030091BBBBBL8;FB3800000000000000520000000c000000bb1240000000000038000000000000005b00000009000000bb124000000000003800000000000000530000000d000000L8;FF0a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050", + "091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b250191BL8;FFee130194ff8300d1fd7b01a9fd430091e80301aae00700f901ffff9021c02a9104ffff9084402a91e3230091e00308aa62028052bf130194fd7b41a9ff830091L8;FF110a0094e86b42f9e9db44b91f0900b1e91f01b9a1860054e0", + "7342f9e17742f9e84313919712ff97e84353391f05007141890054e86353391f050071ac990054BBL8;FFe21640d2e08f06adf91640d216140038a45801943f1f00f1a8010054e08744ad80020191a18301d122008052a0073dade08b45ada00b3eadca53019400e4006fL8;FF9f0f00b1c1060054880080", + "52f46f41f9e8230b3949008092f36b41f9490300f9880240f9680000b4e00313aa00013fd6810640f9810000b4820a40f9e00313aaL16;FFd1feff17a80a0091f3feff17fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091360840f9f30301aaf40300aa1f0002f1c2000054f50316aa680240f9", + "BBBL8;FF2800028b08f1df388808f837a0c300d1b8290094a8035db848240037a8035ef86a0740f9490108eb433300546a0340f9b7835df84801088b682700a9e8fe60d3L8;FF00c10391010c00940ffeff17880241d2e90080521f2d00f10831899ae9fdff9029d910918a0000102b7968784a090b8b400", + "11fd6e1d342f9e8cb42f91f0101ebBL8;FF68b640f9e80000b460ba40f901f97fd342008052f30b40f9fd7bc2a836f80014f30b40f9fd7bc2a8c0035fd6fd7bbda9f50b00f9f44f02a9fd030091150040f9L8;FF637a62f842040091c3ffffb5350000b0a1221d91620e028be00302aa220400f902000014", + "00400091130040f9d30000b47f9600f188ffff54010440f9817833f8BBL8;FFe807409102788052f90300aa08810991fb1300f9010140b23e38019439380194200580522100805232380194007901b449ffff9029750991280f8052200540adL8;FF48008052e0232a39e0032a91e8272a39c80080d20800", + "f0f2e84305f99c3eff9770000014e04305f9e0032a9121fdffd021203f910202805263fdffb063a01791L16;FF696208396966089162828c3c6bda19a97ab21ca9681601f92001803d3db80094e0dbc13de1dfc13d68e20d91e9c343f9000500ad69ce01f9c4f7ff17e11f40f9BBBBL8;FB320100000d000", + "0000c6c4500000000001c6c4500000000001c6c4500000000001c6c45000000000048754000000000000000000000000000737071723a3a7631L8;FFe87b40f91f0500f1ab000054e07f40f901f97fd34200805237880094e88740f91f0500f1ab000054e08b40f901f97fd34200805230880094e89340f9", + "1f0500f1BL8;FFffa71139e89740f91f0500b160000054e02b40f9bce2ff97f4db51a9960100b49822009104000014d60600f118630091e000005401835ff881ffffb4000340f9L8;FF7f0308eb69030054fb0316aaf62f40f93a008052b70100b510000014280400d11f0900b1620000542200805232080", + "094e80600d1fb0316aaf62f40f91f0900b1BBL8;FF016100910228805242480194bf0600b1c0020054e0430591e1030091022880523c48019417000014880080d2e00700f90800f0f207000014e80b41b2e20700f9L8;FFa80358f81f0500b120120054e082c13ce80700f9e8030b91f7430f91f89301b9e", + "91740f90029803da8835af8e0430691e10244ade1830d91e8bb01f9a8e378a9L16;FFe2e3833de1cf833de0d3833df95b00f9f98f07f9e99307f9ea9707f976810036a06302d1e1433c918f180094b4ef7ba9e0031d91a8e779a9a082c83ca18b7aa9BBBL8;FF18a30191730600916003005400877fa9e82", + "300919b620094e82340391f05007121feff54281340f91f0900f183feff5448008052a00700d1e1c30091e86f06a9L8;FFd732889a152300a9f7fbffb5f62b40f9f51f40f996000037b8fdffb018e3069113000014d7fe45d3e80214ab820c0054e90200aba20c0054aa0217cba8831cf8BL8;FF010e0054", + "e1031faa87ffff17e1010054e1031faa79ffff17c80080d2e10700f90800f0f2080900d169ffff17e80b41b2e00700f966ffff17c80080d20800f0f2L8;ZDBBL8;FF40280194e00280522100805239280194c01c00b428ffff9008a107911a0380d20001c03d08f140f8e90280521a00f0f2e98316a90000", + "803d08f000f8e9bf00f9L8;FFdeffff17e90b41b2e92300a9dcffff17280180d20800f0f2081100d1d7ffff173f00156b81f7ff54680240f9e0031faa090540f90a0140f9290100cb4a01008bL16;FF080080921f230039080300f9e00313aad9b3ff97280340f9c80000b409e179d3e00313aa020180522", + "11108cb32a80094210f40f9c11800b4201340f9a3000014BBBBBBBL8;FB1e3a204b657973556e73616d706c6564202d3e204b65797353616d706c656400c0012ec000636c692f7372632f73746f7265732e72730076656e646f722f6c69L8;FFc30800544100805235feff90b5c20a9136feff90d6620b91", + "5c0080520d000014ba080094fa0f40f9e80740f95f0308eb60040054fb0b40f99c07009141070091BL8;FF2a0440f91f1040f15369283808050091280800f90202005400fc47d3c7000014e10300a9e00301aae10308aa220080523e060094e10340a92aa040a9290040f9L8;FFe80b00b968ff58d3ebb30", + "0b8e90b00f9ea63003914000014baf37da9a003df3cb6835ef8e00f803d5bff48d357faffb5d5ffff17fa031f2a688240a915d940a9BBL8;FF2300805224008052abedff97b7035ef8ba035df817ffff17a0c300d1e1031aaa220080522300805224008052a2edff97b7035ef818ffff17a0c300d1e10317", + "aaL8;FFfd7bbca9f70b00f9f65702a9f44f03a9fd030091f30301aa210840f9f40300aa680240f91f0101eb000b0054680640f92a040091e00314aa490180526a0a00f9BL8;FFe00301aae8fd073708fc60d3880f00b5080840921f1900f1c20f0054017c0353e10f00343f040071200200543f080071010", + "40054890248f83f0500b1a1000054L8;ZDBBBL8;FBa001000005000000a0f5450000000000280000000000000008000000000000000066460000000000506646000000000034f64500000000005000000000000000L8;FFe80f40f91f0101ebe06c0054e81340f9090180522a040091ea1700f909692138e", + "1630091ae8fff977f0600b180000054e1630091e00315aa95a2ff97df0600b1BL8;FFd6020a0a1f01096be0179f1a521701948846403969464039f503002a1f01096be0179f1a4c170194884a4039694a4039b502000a1f01096be0179f1a46170194L8;ZFBBL8;FF41ffffd021e03191030d40f9a202805", + "2fd7b43a9ff03019160001fd608200091200440a9e92300910a0000b04a610491e8a700a942ffffd0427c3191ea0f00f9L8;FFe00b40f9e10308aa220080523a420094e10313aae81340f9c80000b4e01740f9e10308aa2200805233420094e10313aae81f40f9c80000b4e02340f9e10308aaL16;FFee47", + "55a9e14740f9e9df40f9f09740f9edc340f9eb2b40f9fc7340f91f0900f1f41b00f9fa9b00f9e4e300f9a90500543f0700b1e61f00f9e21700f9e7b300f9BBBBL8;FBef104000000000004e000000000000005807000005000000b51d40000000000056000000000000005700000009000000b51d4000000", + "000005600000000000000L8;FFee8d0094490080524afdff35ea031faa4901098b200108aba2010054f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd600feff9000c01591df8d0094BL8;FF210080523b120194201301b4e10313aae20319aafb0300aa3e120194f4b340f9f40500b4f3af40f9", + "36120194e00314aa210080522f120194001201b4e10313aaL8;FFf9030caaf8030daafcdf1aa9f7030eaafc030faafa0310aaf6030aaa36120094e2af58a9ef031caaee0317aafcdf5aa9ea0316aaf0031aaaed0318aaec0319aaBBL8;FFf60f40f9e80740f9080116cb9f0208eb29f7ff54e0230091e103", + "16aae20314aa2300805224008052a3ddff97f60f40f9b1ffff17ffc307d1fd7b19a9fcd300f9L8;FF887e089bfb0314aaa8031ef81100001436008052a9835ef8aa835ff868021c8b7b0700d15aa301919ca30191092900a9096501a9a9435fb8156502a9175103a9L16;FFea0f00f9072850a9ebcb00f90", + "b784ca9e8b700f9e8979f1aea2b00f90a6c51a9ebeb00f90e2c53a908219f5a081d0072eb3700f90ba040f9eb1f00f90bb054a9BBBL8;FFadfdff97610a40f9fdfeff17e00313aae10317aae20315aa2300805224008052a5fdff97770a40f9680240f9080117cbbf0208ebe9dfff54e00313aae10317aaL", + "8;FFe04316912200805259110094e1d342f9e00314aa83fbff17e04316912200805253110094e1d342f994fbff17e0431691e1031aaae20318aa4d110094fad342f9BL8;FF00fc55d336000014e10300a9e00301aae10309aa22008052230080522400805213160094e10340a92aa040a9536928380cfc5c", + "d308050091290040f9280800f9L8;FFa1060011c3020e9161cc218b21e840f94200018ba5ffff17a10600123f040071600100543f080071c001005441f4ff351f0c04eba80100541f0404ebc9f3ff54BBL8;FFe09f49f9220080523b320194e1a749f9810000b4e0ab49f92200805236320194b30000b4e0", + "7b49f9e10313aa2200805231320194e18349f9810000b4e08749f9L8;FFfc6f41a9fd7bc6a8c0035fd6f6031faafb031faa190080921a01805200e4006fe00740910104805200001891f6eb12a9f5620891fbe713a9e087853de083853dL16;FF83824dad04f1cf3c88ea40f9e0c30991e90741f9818a4ca", + "de482843ce10314aa02328052e82b01f9e93701f9e10a00ade30201ade18a0fade38210ade40242adBBBBBL8;FB000d3e20286578706563746564203cc3200080690400023e2900000000000000000000000000000008000000000000000800000000000000908f410000000000L8;FF03feffd063801a91", + "24feff9084003991a24700d1e1038052d795009420feff9000402b9103feffd063801c9124feff9084e02b91a24700d141048052ce950094BL8;FFc3ffff1737008052591740f9b7831ff859fcffb535008052572340f9b6831ef8b8431fb877fdffb534008052582f40f9f8f6ffb4532b40f9321a0194e0", + "0318aaL8;FFe8e302f96842019167220391e9ab01a92afdffd04a813791e8ab00a9e8830c91e50313aae35f813de253813de16f813de46b813de067813deb0300f987e6ff97BBL8;FFedfeff1728028052bf231b3899ffff9039231291a8031b78bf731b381fb300b8ba035bf8e4feff17e8031faae93200", + "d103000014e8031faae92a00d18a1f4092L8;FF3f0400f1cbf3ff5408028052606a68f822008052385a009499ffff17c80080d20800f0f2080900912dffff17fb830291e8fb42f91f0500b1e0140054e80343f9L16;FF20080036283500b5e1031faa96ffff17e1031faae8df01b993ffff17e8af40f91b0", + "101ebe2000054f3010014a2c303d1430c8052c3e0ff97e10300aa401d00b5BBBL8;FFe9ffff17f40301aa1f2900f1880000542a01088b4af1df384a03f837e0030091e10309aae20308aab22b0094e80340b9c8000036e00740f9f44f44a9fd7b43a9L8;FFe00314aa02018052011115cb3a7a0094e1db42", + "f9810000b4e0df42f922008052357a0094e04306910d100094e11b40f93f0400f18b000054e01f40f922008052BL8;FFc0035fd60a048052932a00a99f420039f44f45a9fd7b44a9ff830191c0035fd68804805249008052932200a989420039f44f45a9fd7b44a9ff830191c0035fd6L8;FF3f010072081", + "18a9a8000f0b6480944b23f01007208118a9a090141b22a0000d0e00308aa49f100f9f44f4aa9f65749a9f85f48a9fd7b47a9ffc30291c0035fd6BBL8;FF21c03c9123fffff063203991a92300d146ffff90c6403c912a01805247ffff90e7ec3c91e00308aa6201805204018052e9af00a9ea0300f9bf35", + "0194fd7b42a9L8;FFf92705f9f8c704f9bf7e07a9f8d304f9ffd704f9a88317f8aa1000b5e0431f91a1620091022880523a3a0094e0431a91e1431f9102288052363a0094e0431591L16;FFe94f40f9e0a3803debbb01f9eb5f44f9e20713adec7202f8b9010014ff0600b1600200549c0100b4d52200910", + "40000149c0700f1b5620091e0000054a1825ff8BBBBL8;FB6395688575b57ea54fd544c559f552e53b1530052d35262517551c4501750a65aea4a5b4b884b39482e489f494c49fd4f624fd34e004eb14da64d174cc44c754L8;FF410080523b8a0094c00b00b4f60300aa3c8a0094e00315aa41008052358", + "a0094000b00b4eaa743a9ecaf42a9eeb741a9f0bf40a9110000144000805256008052BL8;FF820a40f9e00313aa3b0a01949f0b00b121020054e0a34fa962030291e17740f9081140f900013fd6e06b01f9e8c31791e16f01f9290c40f9e1830b9120013fd6L8;FF2400805232e6ff97f90f40f988ffff17", + "e02300912200805223008052240080522be6ff97e10f40f98effff17e0230091e10318aae20316aa2300805224008052BBL8;FF830b803d97fdffb5287f40f91f0500b1400300543c8740f9371341b9381741b9282341b9e82f00b9fc0300b4348340f9344a0194e0031caa210080522d4a0194L8;FF6928", + "41a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a29ed450094fd7b47a9ff030291c0035fd6ff0302d1fd7b07a9fdc30191L16;FFe82754a9ee3f04f9e64304f9e81304f9e81340f9e90b04f9e81704f9e89f40f9eb4704f9e81b04f9e81740f9ed4f04f9e82304f9e8a744", + "a9e55304f9f77304f9BBBL8;FF220080523c6a0194bb0000b4e0031caae1031baa22008052376a0194b90000b4e0031aaae10319aa22008052326a0194bb0302d1b40000b4e00318aae10314aaL8;FF619640f93f0400f18b000054609a40f922008052386a0094613240f9810000b4603640f9220080523", + "36a0094613e40f9e10000b4604240f922008052f44f42a9BL8;FFe20313aa430c8052cef0ff97e10300aa00feffb5a80640f91f0116eb29070054e00313aa1df7ff9740fd073728fc60d3e80600b5200840921f1800f102070054L8;ZFBBL8;FF29ed0a91e92b1ba9290080d2e14306918946c0f2e87f1aa", + "9e8271da9ef250194e80342f9e92350391f0100f1e8179f1a0101090a24000014e1031f2a22000014L8;FFe263c03de1831cade1834dade2e3803de1831dad3f010094011740f9e8030e91e0430991f3250094e8c30991e0030e91c5250094e00741ad9ffe00f1f8430a91L16;FFfd7bc2a843aa00140a0e", + "8052740109cb6c0640f901310a9b28e179d380320a9b021109cbe0aa0094740a00f9f44f41a9fd7bc2a8c0035fd6fd7bbea9fc4f01a9BBBBBBL8;FB20666f72206b657920776974682074797065203cc0013e00266572726f72207768696c6520696e766f6b696e6720616e206666692063616c6c6261636", + "b3a20c0L8;FF210800917b0700f1a1831ff821fdff54fc1740f903000014b5eb3ea9bf831ff8e80f40f9a083de3ca9835ff89f0308eba0039d3ca9031ef8c1f8ff5400630091BL8;FF610a40f9e00315aad2ffff17e00313aa2200805245020094610a40f9680240f9deffff17e00313aae10308aa220080", + "523e02009469aa40a9dfffff17fd7bbda9L8;FF09504039e9020037011040b9155840a9f30300aae0030091f40308aa11110094e0630091e10316aa0d130094e1030091e2630091e00315aa76f4ff9728008092BBL8;FF00630091f5180094080040b20811c0da081540d2080d088b0825019109fd46d308", + "00098b080500911f0109eb69160054f6e740a9b90600b4eb031faac9420091L8;FFcceeff97fc5b42f99f0b00b1c1830054e80000d0fb830291081140f9fa4340f91f0d00f143070054e8c31791e083329151f8fe97e8fb42f91f0500b140e90054L16;FFb41640f92801088b140b00b4890240b22911c0d", + "a291540d2290d098b29250191891a498b29050091200108ab220a0054e10313aaaaebff97b7010034610a40f9BBBL8;ZBL8;FFe35f873d7c780094e05fc73de163c73de8074091e26bc73de007409108810991e01b843de067c73d00800191e11f843de023843de227843db9790094e0074091BL8;FFfd7b", + "41a9ffc300913bfe0014f44f42a9fd7b41a9ffc30091c0035fd6c0fefff000600391e5f90094c0feffd000203d91c3feffd063a03c91c4fefff084c00391L8;ZFBBL8;FFc00600b448ffffb008813791695b0091000940ad0109c03d08e142f80108803d08e002f8c8068052680201a9681200f968008052", + "68a2003908008092000800adL8;FF01ed40b9080f40f9e00316aa00013fd6f7d749a9fb5f40f9fa4b40f9607e02f9618202f9290c40f9e8430f91e1031baa20013fd6fceb41f99f0b00b181000054L16;FFe8c302f9f5c702f9b00f0094e9b343f9fab743f9f9bb43f9e1bf43f93f0500b1a05b0054e8cf4", + "3f9e0c343f99f0700b1f6cb43f9e84b00f9e8d743f9e84300f9BBBBL8;FB31f8f897dfcbda279d1878f1a28c1ee803560000a338555bbb2f39fc95452cdbd73b3e26877c8b338d2ac24b89660aed28599ff515af1e689b6521ed2c81d73cL8;FF090900f9f65301f9d6060091df7e00f1e02400543b8e009", + "48007805241008052348e0094206b00b4a00640adc90600d1e84b41f9a20ac03d000400ada0c2c23cBL8;FFe05306f9e0833291e1feff9021203f9102028052e3feffd063f41c91a4028052af000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f994140094L8;FFe92300a929e7ff97a802", + "168b0908805275da00a9682602a928008092741a00b9680200f9f44f45a9f65744a9fd7b43a9ff830191c0035fd620008052c1018052BBL8;FF2914c0392b1d00124a1d0b0b4a0102510901f83708710a8bca00805208a800a91f0000f9fd7b44a9ff430191c0035fd65f114071630a00542918c0392b1d0", + "012L8;FF00600691ed490094f3031faa080c47f81f0500b1e1e7ff54e8031faa080113ab2304005480fdfff000a00291e3490094f3031faa088c45f81f0500b181ebff54L16;FFe8c342f9e83f00f9e8cf42f9e9231ea9e9d742f9e8d342f9e97f00f9e9e742f9e82f00f9c80100d0e98300f9081140f9f1", + "9300f9f69b00f91f0900f1e1b300f9BBBL8;FFeca741a9a83b0079e81b00796852017828008092aa1b00b9a9031ff8ab831f38ea0b00b96a1201b86c7201f869f201f86b9e0039680200f9fd7b44a9f32b40f9L8;FFe8ab00f96082803c680e00f9416e0094e0430691e10315aa2c14ff97e00315aae908f", + "f9728008092680200f9a6ffff17e85340b91f050071610f0054e043c73cBL8;FFc2020054e80f41b207000014890080d248008052e0e303390900f0f2e8e7033928017fb2e0c30391e87b00f998f4ff97e10300aae00301aaff430b91f44f45a9L8;FF60d25f38001000121514150ba41e0012f7ffff17df", + "bc0071a08242faa9f9ff54e7141a12ff003f7121ebff54740214cb620282d2b902028b21cc74923903148bBBL8;FF22ffffd04220039121048052dd290194e207409125ffffd0a580039142800991e0031f2ae3031faa340a0094e0431691220080523d120094e1d342f9f2f9ff17L8;FFfa074bf9e0c31d", + "91fb0b4bf9f90f4bf9c1e20091fc134bf9f8174bf902248052f51b4bf93b2e00949f0600b1e0f9ff54f6030291e1c31d9102248052c0621091L16;FF810000b4600640f9220080523aae0094618241f8e1fdffb5f44f48a9f65747a9fd7b46a9ff430291c0035fd6fd7bbca9fc5f01a9f65702a9f44f03a9", + "fd030091BBBBBL8;FB61696e746578740042024000000000006a00000000000000ec0000002e00000042024000000000006a00000000000000890000002e0000004202400000000000L8;FFe909c05ae8271129e08743adc806805234008052a00301d1a1c302d122008052b4031ef8a0873aade28344ada", + "9035538aa135538ab2355382901084a4a01084aBL8;FFc80a0034080140b20811c0da081540d2080d088b0825019108fd46d315050091681a40f9080a00b4080140b20811c0da081540d2080d088b0825019108fd46d3L8;FF220080523c1600941a4affb4e00319aae1031aaa2200805237160094e0df40", + "f9e1031aaa47faff17eeef44b948fd60d338fd78d3eb7b42f9ed7f42f9fb0309aaBBL8;FFb6031cf89f0216eb00240054a8835bf809028052ca060091a14301d109693638e82340b9aa031cf8e003082a1fdcff97a1035cf8a8035bf81f0101eb60230054L8;FFe8631639f7cb42f9e80180528083cf3c7f", + "0b00b1a80319f8404f803dc1220054f8630191e8031691e00315aa1ba30191f54301f9f50316911ce8fe97e8c342f9L16;FF9f0100145f0f00b1c0000054e80080520900809268220039690200f90b000014280080527f2200a9080080927f2201a99f0600f1ab000054e00740f9e10314aaBBBL8;FF4903", + "80526a0a00f909692138b6020034c80240b20811c0da081540d2080d088b0825019108fd46d308050091f50100b4a90240b22911c0da291540d2290d098bL8;FFe8cf42f949028052f6074091d6820991f4031baa0969213828040091f87749f9e8d302f91f0700b1c0200054c0220291db290094080040b", + "20811c0da081540d2BL8;FF61fa40f9810000b460fe40f92200805239f6009460220091f30b40f9fd7bc2a89afdff17fd7bbea9f30b00f9fd03009101c840f9f30300aa810000b460ce40f9L8;FF000080d21f000039007d20d46282403922ff2f361fbc0071640640f98c210054651240f95f1040f2a2cc", + "7492a1020054087c4093420100b4e7fcffd0e7e00b91BBL8;FF000a0054e85b40b91f010071cd0b0054e8074091e0c30091088109910b5f0094e83349f94083c03ce93f49f91f0500b1e067813de9d302f960200054e0abc43dL8;FF00810091001f803d42360094e8eb41f91f0500b121eeff54e83f40f9", + "b5000090f6832491090140f9a81240f93f0500b1a0010054e81000b4e03f40f9e8032a91L16;FF1bfcff17ba0000b4e00315aae1031aaa2200805238b60094e16f40f9810000b4e04740f92200805233b60094dbfdffb5f9031faadcffff17e0030e9188c1ff97BBBBL8;FB5400000000000000790000000", + "50000001d1c40000000000054000000000000007f000000050000001d1c40000000000054000000000000008d00000014000000L8;FFfd7b03a9fc6f04a9fa6705a9f85f06a9f65707a9f44f08a9fdc30091390040f9f40301aafb0300aa3f0700b120060054880a40f9080100b4090140b22911c0daBL8;", + "FFc8fdff17f83f42f92083c13ce9d742f9f5c742f9f7cb42f9080340f9c0828d3cf63b42f9e9d304f9680000b4e00316aa00013fd6010740f9810000b4020b40f9L8;FFe00315aa0201805201ed7cd33a0600945f1300f1a00a0054f5d24aa9340200b4b982009104000014940600f139c30091800100542", + "1035ef8810000b420835ef8BBL8;FF21e0009143fffff063400191a0e300d1a2018052e40080522c4c0094b8835cf8e1034ba9fbf34ca9f9274ea9f6a34fa9e8a705a9180300b43f0400f16b000054L8;FF1f05007161010054612640f9810000b4602240f92200805237460094612e40f9810000b4602a4", + "0f922008052324600947f660539f44f42a9f50b40f9fd7bc3a8L16;FFe92f00f9e98b44f9e9af0fa9e98f44f9e94b00f9408c0054e92b47f9f0b300f9f0031aaafabf40f9ee3300f9ee0305aae92b01f9e9e740f9f8031caae50316aaBBBL8;FF220080523c660194c082c23cd70240f9080d8052e90c809", + "22227089bc1a20191a0039b3ce00316aac082c33ca0039c3cc082c43ca0039d3cc082c53ca0039e3cL8;FFf85f0ca9f6570da9f44f0ea9fd830291081c00121f090071e1010054e00302aaf30302aaf40301aa6bfeff97e80300aae00301aa08020037680240f9080540f9BL8;FFa400805231ecff97e103", + "40f9b5ffff17c80080d20800f0f208090091adffff17ff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091081c0012L8;ZDBBL8;FFa80000b4601e40f901f57ed34200805239260194682640f9a80000b4602a40f901f57ed34200805233260194683240f9a80000b4603640f901f57ed3", + "42008052L8;FFe00314aa020000143500805209fc4ad30a088052f4031faaf5ff03a92911c0da490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aa1730889aL16;FF2901805268d201292800805269220039680200f90600001488008052620a00f92900805268220039690200f9f44f4", + "7a9f92340f9f65746a9f85f45a9fd7b43a9" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines5 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines6.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines6.lean index f592d4f38..3957a5dbb 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines6.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines6.lean @@ -27,359 +27,252 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub6 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF1f0201314afeff54e9030eaa31dddf383f0201318a020054e9030eaa311e001232cd5f3831160012510a1a330f000014ff81007180fdff54ff150271a3030054L4;FF280800f90cfeffb40a7c15533f0108eb53611932200100542a0440f90bfc63d35369283808050091280800f98b02", - "00b5e0030caa1b000014e10300a9e00301aaL8;FFb31f01940003805201018052b11f0194400500b42a008052e80300aa165c00a98902009029c11a910a0800f9e00318aa09000014e8031faa8902009029e10c91BBL4;FF000400ade00340f9f4ebff979c1b00b4e0031aaad7000014e00b40f9e10314aa", - "22008052ae9f0194f81b40b9e8031b2abf02186bfb031aaa7c0208aa42f6ff54L4;FF2110001221800151251c0012421c409205d01f38e30380124418049b010004cb21fc44d383d01f3881e01f78f35341a993ffff1763141a127f003f71a1f4ff54L8;FF05a00094f44f43a9fd7b42a9ff030191c0035f", - "d6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aa810100d0212c1b91e803009142018052f49f0094BBBL4;FF57ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebe38000541803008bf9feffb5L4;FB68616e207", - "3656c6620706f696e7465722028c001290021737562736574206973206f7574206f6620626f756e64733a2073656c66203d2028c0022c20c00d292cL8;FFe1f741f9810000b4e0fb41f922008052b3df0094e10342f9810000b4e00742f922008052aedf0094e10f42f9810000b4e01342f922008052a9df", - "0094e11b42f9BL8;FFf44f42a9f50b40f9fd7bc3a8c0035fd60001805201068052c95f0194fd7bbda9f50b00f9f44f02a9fd030091f40302aaf30301aaf50300aaa55f019400078052L8;FFb75f0094e10313aae81340f9c80000b4e01740f9e10308aa22008052b05f0094e10313aae81f40f9c80000b4e", - "02340f9e10308aa22008052a95f0094e10313aaBBBBL4;FF6001005435597ea9810000b420015df822008052b2ff0194b50000b4e00316aae10315aa22008052adff01942800809229008052880200f969320039f44f43a9L4;ZFL8;FFbdff00946002009000603991b7ff0094ffc300d1fd7b01a9f44f02", - "a9fd430091280840f9290040f91f0002f1230f00543f0108eb13601932200100542a0440f9BL8;FFe40313aaa8831ff80280019488220191010300d021242291240300b084c00691a32300d122018052a8831ff8f97f019488c20091010300d021482291240300b0L8;FF49038052ea1700f909692138bbe", - "9ff97e1630091ff7fff979f0b00b1a1010054e083c13ce81740f96003803d680b00f9f44f48a9f65747a9f85f46a9fa6745a9BBBL4;FF7f220039680200f9f44f47a9fd7b46a9ff030291c0035fd6880300d008011091890280528a0280d2690a00f90a00f0f26a2200a9f44f47a9fd7b46a9ff030291L4;", - "FB6e675f6b796265725f7072655f6b65796c6f63616c5f6964656e746974795f7075626c69633c6e6f6e653e6661696c656420746f206465636f64652070726576L8;FF0001c03d817ac03d88ee40f9a203983ce007813d4183813ce81302f9e91f02f9b70000b4e00318aae10317aa22008052abbf0094e", - "88302918122009100010291BL8;FF070000141f0020716200005455008052030000141f404071d536969ae80740f9080114cbbf0208eb28040054e80b40f91f0002710801148b03fdff54e90f8012L8;FFba3f00940001009000a00d91b73f0094ff0301d1fd7b03a9fdc30091080040f9090540f9490d00", - "b40a0140f9410180390101f8b7e0031faa4a050091290500d1BBBBBL4;FF63c02991e023009102018052a4008052e6040194e00740f9b6ffff17e00700f9210400d021602191230400d063bc2191e0230091a200805244038052d9ffff17L4;FFe8431391dc0f0094e0074091e1431391028c815200401d9", - "1b90f0094e00b4091e843139102c4805200c00e9101813191b30f0094a60f009400c4805221008052L8;FFffa301a9a0fdff97e91f40f9e85740b9aa058052e0830091e1e3009182048052e91f00f9e92f4829a8831fb8ea030139e91304b8e94b40b9eb6304b8ebc344f8BL8;FFf54700f97b0200b4341f", - "40f9b08f0194e0031baa21008052ae8f0194001f00b4e10314aae2031baae02f00f9b48f01940a00001437008052381740f9d8fcffb5L8;FFc8050034080140b20811c0da081540d2080d088b0825019108fd46d308050091091c40b909050034290140b22911c0da291540d2290d098b2925019129fd46d", - "3BBBL4;FFe8ff03a9e83340f9e80700f9e86f40b9e82700b9f90313aa9f1700f142ddff540affff17a00300f000a00c91a20300f042603d9101048052dacf019420008052L4;FB1fc4602ec6c02b1a57ca2eed7623ac24c2a6615336201b10088004403c955af7ce03e701514dadae53dface7d673eb39f0", - "94784a3c259e124f09a28c0000f136L8;FFe30304aae0c7c33de5fb42a9f10303aaf9b344a9e40308aaf74b00f9e80310aae3030faaeacf00f9e1f7c03def030eaaea6341a9f20319aafc0748a9f90305aaBL8;FFe8ab13a98a06805248048052ffa70ea9c90200d029651e91e9ab10a9290080d2e1a3039", - "1090ec0f2e8ff0fa9e8a712a9b74f0194c80200f008950d9129048052L8;FFf5cb42f9f7cf42f91f0500b1404f803da90319f8601a00542083c33ce85f04f9e9671f91a80359f82183c43ce5432591c082833c2083c63ca68302d1e87704f9BBBBL4;FFf35b40f9ff030391c0035fd6e003c53ce00300d00", - "0602091e30300f063401f91e40300f084602491e283009101028052e00b803dbaef0194e003c53ce00300f0L4;FB63616e20616c7761797320617070656e6420746f206120627566666572000000ea984800000000002e00000000000000ab0200000e000000ce96480000000000L8;FFb7ffff17880080d", - "20800f0f2080140b2b3ffff17880080d20800f0f208110091afffff17e00300f9210200d021301d91230200d063741d91e003009122028052BL8;FFfd7b41a9ff830091c0035fd6ff4301d1fd7b03a9f32300f9fdc3009129008052e80301aaf30300aaff2700a909048052ea0200d04a213e910900ac72e", - "1630091L8;FFe1431691da1200943f0700b1f90b40f9c07cff5401230491c4000014e8031faa00011aabe2650054e1431691400d0094df0600b18000005480220291e1431691BBBL4;FF22008052b6af0194e18340f9810000b4e08740f922008052b1af0194e04302918498ff979bfeff17a85300d16903", - "009029610391600300b0002c0d91620300d0L4;FF5f4000f1280100545f0013ebe8000054e10313aaf44f43a9f65742a9fd7b41a9ff030191291000145f2000f108018052f60300aa4180889ae0230091e20313aaL8;FFc0ffff17a50100d0a5403f91e1630091a2c20091e0031f2ae3031faa27b00094a3", - "0100d063a03f9100088052e1031aaae2031aaac8af0094e8830091a50100d0BL8;FFe8ab45f9e9c32791e0d3c23de95b04f9890200f029410591e80305f9e8ffffd008710c91e85f04f928008052eac32291e96f06f9a04700d1e1833291e95706f9L8;FFc42f009400018052e10315aac12f00942000805", - "2e10318aabe2f009420008052e1031caabb2f009420008052e10316aab82f0094e000009000000a91bf2f0094BBBBBBL4;FFf44f41a9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091089040391f0d0071a1010054135041a9880240f9680000b4e00313aa00013fd6810640f9c10000b4L4;FFf85f43a", - "9fa6742a9fc6f41a9fd7bc6a8b3170014e86f42f9fb031aaafa0315aaf50308aae0074091e1031aaae20315aa00401d91fa0a0094f5ab4bf9bf0600b1L8;FF760200b4335040a9380200d018f30591170040f9b9730091750200d0b5a21791e8164038e3030091e00313aae10314aae20315aaf96300a9a8", - "730039c5170194BBL4;FF600400543f20007181f5ff54a8035bf81f0500b1e00a0054e1a20291a2e300d17a81ff9720f5ffb4d6000014a88350f81f0500b1c0030054a1e303d1a2e300d1L4;ZBL8;FF4901084aaa435838a92318386901084aab535838a93318384901084aaa635838a94318386901084aa", - "b735838a95318384901084aaa835838a96318386901084aBBBL4;FFe9031f2a0500001463001036094440f9490000b429008052f44f43a9f70b40f9f65742a9fd7bc4a8092100391f0100f9c0035fd6ff0302d1fd7b06a9f33b00f9L4;FB656d3736382e7273002f636172676f2d6769742f737061727365", - "706f73747175616e74756d726174636865742d623538643766353665333634356363642f3036L8;FFe9a745f9eb2318a9e8b745f9ebcb45f9e88b00f9e8bb45f9e8b700f9e8bf45f9e8cb00f9e8c345f9e8eb00f9e8d345f9e82f14a9e8db45f9ebeb45f9ea2313a9BL8;FF9f0a00b1e10b0054e1ffc33de", - "8d342f9e90348f9e067c13d8183813ce83b08f9e80f40f9e94708f9e11fc43de223c43de0fb863de01b843d600600ad620a803dL8;FFa88357f8080540f91f0115eb09100054a02302d1b5f4ff97402f003728fc60d3c81400b5200840921f1800f102150054217c0353c11500343f04007120010054BBBB", - "L4;FFfd03039109704039f30300aaf40308aaa90100343f0d00712109005460a240a9090d40f9e823009120013fd6e80740f91f0900b141030054880200f968008052L4;FB6e677468203cc0153e20666f72206b657920776974682074797065203cc0013e002f636172676f2d72656769737472792f696e", - "6465782e6372617465732e696fL8;FF0600001441020090217c189143020090638c1491e00300f9e0030091c20180528400805211000014c80080d2e0230039e00300910800f0f2ff270039e80300f9BL8;FFeb2b0229e9230329e12f00f9a360ff97ff0600b1bb8313f8c0040054a02303d19e60ff975f0", - "700b1bb8313f8a0060054a02303d19960ff97bb8313f898060036L8;FFaa0a8052a04700d1e85b09f9e807409121800991e93709f96901009029d1029108c13591e94309f9290080d2e85f09f928038052091ac0f2ff3309f9e83b09f9BBBL4;FFb3b70194e0031baa2100805234008052b0b70194c0fdff", - "b4e10315aae2031baae00b00f9b6b70194e00315aae1031baa22008052aab70194f52740b903000014L4;ZDL8;FFf30300aaa8273fa9c001009000680d91e8230091a14300d1f40303aaf50302aadeb70094e10740f9c10100b43f0400b121010054e8434039e00313aae10316aaBL8;FF0825019109fd46", - "d30800098b080500911f0109eb69010054000114abc2000054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff54a00200b000802e91ab370194L8;FFea4340f968c6533955ff48d3a801003661f241f9ea4300f9810000b460ee41f922008052ae37009461fa41f9810000b460f641f922008052a9370094e", - "a4340f9BBBBBL4;FFe9a300a901ffff17e90b41b2e9a300a96cffff17c80080d20800f0f2080500d1f9feff17c80080d20800f0f2080500d163ffff17c80080d20800f0f208090091L4;FFe90f00f9e083c03ce90f40f90001803d090900f9f44f45a9f65744a9f85f43a9fd7b42a9ff830191c0035fd633", - "008052285440a9f4cf00a9ff0f00f9bf0214ebL8;FFffc300d1fd7b02a9fd830091490200d029813d91eafffff04ab12791400200d000403e91e92b00a9490200f029810791e1030091e92b01a9d8070194fd7b42a9BL8;FFe803088b69fbffb5e1ffff17f40308ab421a0054e00313aa080c49f81f0500b", - "1e00100546c020094080040b20811c0da081540d2080d088b0825019109fd46d3L8;FF480080527f220039680200f998000014f40300aab50c00b4ad870094e00315aa41008052ab870094e02300f9201600b4a7870094e00315aa41008052a5870094BBBL4;FFa26301d181b1ff97a0f2ffb41f000014a0", - "6301d109c90094fa0301aa80f5073641000014fa031faa3f000014280b0091fa4700f905000014e80b41b2e04700f9L4;FB3962342f7372632f76312f6368756e6b65642f73656e645f63742e7273002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865L8;FFb7c70094", - "e86740f91f0500b1608dff54df0600b1e02d0054681f40f96083c23ce9c31391e0831d91e1c31591f6bb02f9e8d302f9e8e340b9e067813d6013c13cBL8;FFd2000094e80300aae00301aa08020037980240f9080740f91f0100eb42020054e80f41b2e80700f907000014c90080d248008052e043003909", - "00f0f2e8470039L8;FFe20314aa0001158bbd470094a802148be0031f2a680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaf60301aae10315aae20314aa92ebff97750a40f9BBBBL4;FFc90300d029710391ea830291a04700d1e8270ba9e8530291c90300d029610391a10302d1e8270ca9e8f3", - "0191e8270da968008052e9030090293d3b91682703a9L4;FB08000000000000000800000000000000fcc5420000000000456e636f64654572726f7272656d61696e696e670000000038214000000000002000000000000000L8;FF73e7ff97600a0036812800b5fbd340f9e8cb40f97f0308eba0110054e8", - "cf40f9090e8052e0bfc03d6823099be1031faa000d803de0c3c03d0011803de0c7c03dBL8;FF2a0080520811c0da09000039e9f77fb2081540d2aa833da9080d088baa831ef808250191681a488b080500911f0109eb680b0054a0a300d12100805222008052L8;FF02c1853c438942ad01c1823c00c1813", - "c02c1843c03c1833ce80b40b9400504ad418147ade8a700b9e81340b9430905ade4838a3c8001803de8d302b9214b803dBBBL4;FFe10313aac3a70194a0a33ca9600300d000000691630300b063802291640300d084800d91a2e300d1a1038052bca7019420008052e10313aac1a7019420008052L4;FFa3", - "0003cbf4ffff175f000a6b41feff54221440f9e80040b95f0008ebc9fdff545f0060f142908b9ae20000b9eaffff17220000b0660500b4c50840f940000f91L8;FF0c0880522d00001409088052a002088be1830091220108cbb9a70094a80357f880030191a1c303d12200805208050091a80317f8dda70", - "094e8031f2aa0877badBL8;FFc0035fd62000805221048052c1270194fd7bbea9f44f01a9fd030091f40300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aac4270194000300b5L8;FFb4270094c0feffb40801805208000039f40000b4f60300aa00040091e10315aae20314aab6270094e0", - "0316aae10313aaf44f42a9f65741a9fd7bc3a8c0035fd6BBBBBBBL4;FFf80315aa0088202e0800669e17c10192f70000b5008f40fc5a2300910088202e0800669e17c101f260ffff54e802c0dae91340f90811c0da200540a9530f488bL4;FF150440a9f30300aae0230091f40308aac3120094600a40f9e", - "8030191f85cfe97f62340f9e083c43ce82f40f9df0a00b1e00b803de81b00f9c1000054e1230091L8;FFfff8ff97fd7bbda9f65701a9f44f02a9fd03009115fcdfc8f40302aaf30301aaf60308aab5010037a142009120008052191c01946002f8b7680200f008c11a91BBL4;FFea235339fc8f00b9fc325", - "e38e5af5339eb2b1429eb275339ea2b5339fe3b40b9e6b35339eb2b1529eb2f5339ea3353399c031e4aec8300b9ec675339eb2b1629L4;ZFL8;FF600640f922008052b59b0094610e40f9810000b4601240f922008052b09b0094611e40f914008092740200f93f0400b140010054810000b4602240f9220", - "08052BBBL4;FF1b0880525ac31991e0031aaae1031baae2031f2ac0023fd61f0000f1ad0000547b0300eb032d00545a03008b060000141f0400b1812c0054ccdb01941f100031L4;FB756500000000000078114900000000000a00000000000000496e74333256616c756500000000000098114900000000", - "000a0000000000000055496e7433325661L8;FFeb6f42f9e8a700f9880a41f9e96b42f9e0f3803d8082c03de82b01f9e87342f9e093803de8af04a9e87742f9ebc342f9e80b00f9e87b42f9e83b00f9e87f42f9BL8;FFf5174bf9fb1b4bf9e01b843d2001c03de11f843de8032179480300b0e0fb833d08b", - "140f91f0900f189040054e8633f91a90200f029c10491e8bb0ef968008052L8;FFea0f80120b7c10530a2c0633eb0000350b7c0c530a050039090900396a091b320a010039d6ffff170b7c1253ec0f80120a0900390c440c33090d00396a6d1c32BBBBL4;FF1d000014546bf8381406f836e08741ade8430", - "c9100810091e1430191022e8052e08718adb6fb0194a80a40f9890240920a2300d14a011b8ae1430c9102328052L4;FB69676e616c2f727573742f70726f746f636f6c2f7372632f646f75626c655f726174636865742e7273002f72757374632f343861323239636561656664343938L8;FF430200b0633", - "81991e81300f931000014c90080d2e0a30039480080520900f0f2e0830091e8a70039e91300f99df1ff9723000014c90080d2e0a3003948008052BL8;FF092c40f92a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff5420030", - "09000000491L8;FFe10318aae20316aa23008052240080526492ff97f81740f9e80f40f9080118cbdf0208eb697aff54e0630091e10318aae20316aa23008052240080525992ff97BBBL4;FFe10314aa22008052b5bb0194e10740f9d70000b4e00318aae10317aa22008052afbb0194e10740f921edffb4", - "e00316aa22008052aabb019465ffff17a00301d1L4;ZBL8;FFe1030191f62306a9ea150094bc937da9e8030191e0031f2ae10319aae2031aaa2500805206048052e3031caa25bc0094a1035df8810000b4e0031caa22008052BL8;FF40250054f30300aae00308aa69040094e80300aae00313aa090140b2", - "2911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb492d0054L8;FF686e01f968a20b9169aa4ca90001803d68e20b91757201f975420e910101803d68220c910201803d698e01f96a9201f97f420e39696e41f96b220c916a7241f9BBBBBL4;FF1f0101ebe0200054680640f90", - "90a80522a0400916a0a00f909692138e10313aac0f7ff97805641b980010034610a40f9680240f91f0101eb60200054680640f9L4;FF800000f000e03291b80b009420008052e10319aaca0b009420008052e1031caabc0b0094ffc303d1fd7b0ba9f76300f9f6570da9f44f0ea9fdc30291553040b9L8;F", - "Ffd7b43a9f32340f9ff430191c0035fd6ff8301d1fd7b04a9f44f05a9fd0301913f9800f121060054090040393fed017101060054099440393ff50171a1050054BL8;FF68020039fd7b43a9f32340f9ff430191c0035fd6e81340f9097d8052eb2b40b90a7dc99b087d099b69d09b526963a872697da99b0", - "9c949ab48358a9a080100b4L8;FFea7f18a9e85719a9ff231aa9f67f1ba9ff231da9ff0301f9e80701f9f70b01f9ff0f01f9e81301f9f81701f9ff1b01f9e81f01f9f92301f9ff2701f9e82b01f9BBBL4;FFe82f40f9130540f91301f8b6f7031faae00317aae10313aabecb0194ff4b00b9130080921b00", - "0014e82f40f9081140b9e82f00b9730200b4e61f00f9fb03192aL4;FB7373696e6741757468656e74696361746f722070726576696f7573204d4143206b65792070726573656e74207768656e2073686f756c64206265206572617365L8;FF7e080014f7031baaf68e40f8f81e40f91f0b00b1000d00541f", - "0700b1c00c0054e81e4139e9524478ea224039fce644a92841082ae91244b8eae300b9ea024139BL8;FFe00641ade0430691facb00f90083823ce20242ad0183833c0083853ce10240ad0283843c0183803c0083813c40030094fc2740f99f1700f188fbff54ea430f91L8;FFaaf9ffb50a3040f9e903098", - "b8afaffb5daffff17000100d000800e91b34b0094000100b000e03291b04b0094fd7bbfa9fd030091081840f9080100b4080140b2BBBBL4;FFe3630091f5a301a9f4a302a9d1eb0194e0020035e003c03de80b40f96082803c680e00f97f0200f9f44f46a9f65745a9fd7b44a9ffc30191c0035fd6080100", - "d0L4;FB08000000000000000800000000000000607842000000000009924800000000007b00000000000000480000002a00000000000000000000000800000000000000L8;FF2a040091e00314aa490280526a0a00f909692138b6500094e10313aafdebff97803240b980010034610a40f9680240f91f01", - "01eb40030054680640f909018052BL8;FF53000014a20301d1830c80526a52ff9740f5ffb443000014ff5f09a9ff5300f9c1620091a20301d17855ff9760f4ffb424000014ffdf07a9ff4700f9e1e30191L8;FFe237c03d680200f96082803c6182813c6282823cb90000b4e0031aaae10319aa22008052a", - "e6b0094e12740f9810000b4e00315aa22008052a96b0094e12340f9BBBL4;FFbfab01944803160be8ff0039d60500b5f703082a08088052020117cbb60202eb62060054e8030091e10314aae20315aa0001178bb2ab0194e802150be8ff0039L4;FF4b018b9a4c018c9a7f0271f24a018d9a1f0052f26d62", - "18538a018a9a7f0206720ccc74d36a018a9a6b6e1b531f1d00724a210daa8c016d924d008052720a1b12L8;FFea7240f8da26089ba9035cf8a9031df8ea7201f8480340f908f8ffb4400740f901f97fd342008052adab0094bbffff174800805208200039080000f9e00301aaBL8;FFc8fffff008d12d918", - "00200b0005c2e91a92338a9e8632291490200f029c10491a10302d1a82739a9880200d008410591c9048052e8c302f9e3031691e8cb02f9L8;FFa1035df8615800b5c60200141f09007101050054090180d208df78920900f0f23a0140b2091f40921b0109aaa1035df8015700b5bb020014ba031ef8e8e3", - "5039BBBBBBL4;FF690240f9e10313aa54692838080500911f0048f1680a00f9a3fdff540b7c0e533f0108eb7361193220010054536928380cfc5cd308050091290040f9280800f9L4;FFf8db40f9c0dd00b4e1d340f9e2031aaaf60300aaba1300942800805297000014ab130094c002805221008052a913", - "009420dd00b4a80000b008653491e90300aaL8;FFfd7b42a9ff430191c0035fd629008052040000144900805202000014690080526a0200b04a412e914a7969f808010aeb030500544a0102aba20300545f0500b1BBL4;FF09000014080180d2f9031faae9031faa0800f0f208017fb22a1f409229010aaa", - "682600a9f44f5da9f6575ca9f85f5ba9fa675aa9fc6f59a9fd7b58a9ff830791L4;FD10304a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L8;FFe0230091a32300d1a2008052a8831ff8009400", - "9468c20091610100f0215c1491840100d084e00991a32300d182008052a8831ff8f7930094940100d094a20391BBBL4;FFa08316f804000014880080d20800f0f208050091a08302d1a80316f8a1c90094f50300aaf95340f9f71800b5cc000014880080d2f51700f90800f0f2af000014L4;FB12397ee01", - "8d8c52dab9ca73a242ae5e90000f47e6095901ae72819332dbc29975402450c6ce25c9af5b3ff7cff44f664686f19e88885911c4791f9366cd97ee0L8;FFe55f00f9e5030faaef030caae89300f9e8bb40f9e3030aaaeafb40f9ec0309aae94740f9e8ff00f9e8e740f9f90301aaee2b1ca9ee6b40f9eab7", - "40f9e95b0da9BL8;FF42690054e1431691610d0094df0600b18000005480220291e1431691561200943f0700b1f90b40f9007fff5401c30391e24316916000805213110094f3fbff17L8;FFa8fdff54c0825ff8e9ffff17d3e640a9280340f9680000b4e00313aa00013fd6210740f981fcffb4220b40f9e", - "00313aae0ffff17e8ef42f9c80000b40805088bBBBBL4;FFfa674fa9fc6f4ea9fd7b4da9ffc30491c0035fd6f52b40f9f68346a9bf0600b120060054f42f40f9bf0a00b1c0fdff54df0600b1a00f0054e01700f9f73f40f9L4;FBae2b12b9260000001fb0480000000000690000000000000003000000054", - "918d08fbdfa83e00c29f8f8073a22ef35df2bea903aff81af03ccbc45c6e93a000000L8;FF080500d1e80300f9e0030091a5e9ff97e10300aae10300f9210200f021701b91230200f063d01391e00300916201805244008052dde8ff97e00340f954ffff17BL8;FF825dff97a0f8ffb462000014e83b40f9", - "1f0500b1a0020054e1c30191a20301d17a5dff97a0f7ffb463000014e8ab40b948000037f85700f9e1f20091a20301d1L8;FF681a00f9f30742a9810000b4e00740f922008052b2730094a80600d11f0900b1e823931aa8000036e0031baae10315aa22008052aa730094e13349f9f3074091BBBL4;FFa0c", - "302d1e1031faaf40302aae08300ade003803de9feff97a0877ead880300b008610891a203df3ca303dc3cf6c3009189018052e0c30091e08704ada0077cadL4;ZBL8;FF0f010c9bac0301d111010b8b22060091efd100910082c13c111640f929c101f112025ff80102de3c8081813c0082dc3c918102f81", - "1825df8b28102f8120a40f9BL8;FF53010014e83746f91f0500b1a1000054ff3706f9f63b06f9ff3f06f9ff830cb91f0800f1e1350054a02302d1c7ecff97800a003621f8ffb4dc01001401c30091L8;FFc80080d20800f0f2080500d1e0032a91e84305f9a329ff97f60300aa3f010014f79344f9f69744", - "f9e0431f91fc9b44f9a162009102288052b1330094ff0600b1BBBBBL4;FFa91d40d208010a8b6901098b0acdcaca0881c8932bc1cbca4901098b6801088b2abdcaca2981c9930badcbca4801088b6901098b0acdcaca0881c8932bc1cbcaL4;FF292d0c1b5f1500f1f6030daae1030eaaef0310aa4006005", - "40b1540396bc100517f25007168560054292d0c1b5f1900f1f6030daae1030eaaef0310aa00050054L8;FF611240f9810000b4601640f922008052b3030194611e40f9810000b4602240f922008052ae03019460620191f30b40f9fd7bc2a879fdff1761ce40f9810000b4BL8;FF030d40f9a2038052fd7b", - "43a9ff03019160001fd6202040a9210300b021602b91030d40f9e2038052fd7b43a9ff03019160001fd608200091200440a9e9230091L8;FFf2830094620100d0428036914c00001408200091410100f021041d91e80300f9e8230091e00309aa62018052e7830094620100d04200379141000014e00300f", - "9BBBL4;FF031800546a0340f9e0c342f94801088b682700a908fc60d3a80600b5020840925f1800f1a2060054017c0353c1060034e0620091a3a300d1640c805298b9ff97L4;FB00000000000000000100000000000000245547000000000047654900000000004e00000000000000b90400001700000047", - "654900000000004e00000000000000L8;FFb7c3009454ff48d3fc7340f9f9031c917749ffb54efaff1728008052e84700f9f96340f9380100b4e0031aaae10318aa22008052f4030b2af8030c2aa8c30094BL8;FFc80080d2a0831d38a0c300d10800f0f2bf931d38a8031df8a2390094e80300aac102009", - "021840c91c302009063a00b91a0c300d142018052a4008052a8031df8L8;FFe00600ad808601ade8b700f9bc0000b4e0031baae1031caa22008052b04300945f0b00b1c1f2ff548082c23ce8bf40f9e0430691e1e30091022180528002803dBBBBL4;FFe80301b957ffdfc8d70200b4ff0600b100030054f", - "843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebc30001541803008bL4;FB8be84800000000003800000000000000e40100001a00000064656372797074696f6e206661696c656450726576696f7573436861696e4b6579626173655f6b65L8;FF111a4092101e001", - "33122cb9a350215aaa20000546b1d0091ef0500918c05009170feff37f000f837abfe60d3ab0000b5eb032aaa18010a8b7701098b0a000014BL8;FF68c20091c10200f021102891c40200f084e01291e0230091a32300d142008052a8831ff8fb630194f40200b094a22391c10200f0218c2f91a32300d14", - "2018052L8;FFc0035fd6c000f8b6f40300aaf6031faae00316aae10314aabe630094a00100b4f50300aaaa630094e00315aa21008052f40315aa36008052a6630094a0feffb4BBBL4;FF2c69eb382c04f836ec020acb6a010acb4a010cca4a01088a5f2100f1e3040054ea032baa0cfc79d381260a9b2a69", - "6b382c692b38692100d16b0240f92801088aL4;FFe103022ac200010b400400510000014a1ffc3f714dffff5480804039e20304aaa120403900100012000400111f00036b00d0831a0004005101100033a1200039L8;FF081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a", - "0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b250191BL8;FF080040f9f40302aaf30300aa080115cb5f0008eba8010054b40000b4680640f9e20314aa0001158bb5230194a802148be0031f2a680a00f9f44f42a9f65741a9BL4;FF8312803d821e803d811a803d8016803de82700", - "a9480dc0da690dc0dae82701a9880dc0daa90dc0dae82702a9c80dc0dae90dc0dae82703a9e80313aab3230094L3;FB00100000000000000010000000000000010000000500000000d009000000000000c049000000000000c049000000000070500000000000007050000000000000BBBBBBBBL4;FF2921", - "00910801148a206b68fc00a8200e0a00669e0afcffb5f9ffff17200340fd00a8200e0800669e0801c0da0811c0da08fd43d3deffff17220000f042600f91L4;FF68420039f44f49a9fb2b40f9f65748a9f85f47a9fa6746a9fd7b44a9ff830291c0035fd6f9ef41a9e00fc03df71740f9e003803d3aff48d", - "3f6fcffb5eaffff17L8;FFbf1d0194020000143500805268fe4ad309088052954e00a90811c0da280108cbe90080521f1d00f10831899a29008052280908aa932201a9f44f42a9f65741a9BBL4;FF3f0700b1f94702f960000054ff5f08a904000014e84b42f9e94f42f9e82708a9e0230091e2030291e10", - "315aae30314aa460a0094e84742f91f0500b180f8ff54L4;FF42000e8b261c41a90c3400a9282442a92a2c43a92c34c4a9424002f169010054661c01a9261c41a9682402a9282442a96a2c03a92a2c43a96c3484a92c34c4a9L8;FF059e0094fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f", - "31300f9fd430091130040f9e00301aa810100d021b41991e803009102028052f49d0094BBBL4;FFe00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300eba34100541803008b060000141f0400b121410054cedd01941f100031a140005439feffb5L4;FB7273002f72757374632f34386132", - "3239636561656664343938356335303939306231343131366236643835366166303938352f6c6962726172792f636f72652fL8;FFfc0309aae86305f9c801009008c10491e9032b91e8ef01f9e1430f91e8f701f9080200d008c12591e3ef00f9e3031d9162008052e03300f9000200b000e83b91BL8;FFf", - "f0300f95a830991b582099164750094f73349f94083c03ce83f49f9ff0a00b1e067803de8d300f901010054e067c03de8d340f909008092690200f96082803cL8;FFc8060054680640f9e10315aae20314aa0001168bba5d0094c802148b680a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6e803", - "1faab60a40f976f4ffb5BBBBL4;FFaa01409236011ab821419d3c01c1c43ca80a40f920419e3ca043da3c21019f3ca143db3c08010acb6a05009120419a3ca82a01a921419b3c2800809229008052L4;ZFL8;FF21081591430200d063201691e00300916201805284018052e4f2ff97e10340f9e00301aaf", - "44f45a9f65744a9fd7b43a9ff830191c0035fd6ff8301d1fd7b03a9BL8;FF240300b084c0019126030090c6e0329103400091a52300d1e00308aac2028052a9831ff8027e0194fd7b42a9ffc30091c0035fd6092000912103009021843891L8;FF081540d2080d088b0825019109fd46d30800098b080500", - "911f0109eb2815005423000014f7031faaf50314aab38e4df87f0600b180200054e00315aaeeedff97BBBL4;FFa8831df8a0073fad412f0094800500b43500805207000014807a35f8b5060091a08300d1b5831df8392f0094c00100b4a8835cf8bf0208eb01ffff54f40300aaL4;FB02010000050000004", - "08649000000000011000000000000002701000005000000408649000000000011000000000000002e010000050000004086490000000000L8;FF880ec0dac90100d029cd2c91a80f00f9a8058052e0630091a9233ea9a863009109018052a18300d142008052a8273fa9e0170094f4e340a9f56742a9a4bd", - "0094BL8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab22030054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8bL8;FF21e43c91e30000f063c03f91e023009102018052a4008052e80700f909000014e00700f9e10000f021e43c91e30000f06", - "3d43f91e02300910201805264008052BBBBBL4;FFcb000094770a40f96affff17e00313aa220080522300805224008052c4000094610a40f971ffff17f50300aae00313aa220080522300805224008052bc000094L4;FF7cf9ff17e90b4091ea074091e007409129c10e914a411d9100401d912081c03c21", - "81c13ce9ef51f9e8ab0bf94081803c4181813ce9bf0bf985ebff9708008092L8;FFe2031f2aa0fbff97e90740f9e82740b9aa058052e1230091e00313aa82048052e90700f9e92f4229a8831fb8ea430039e91301b8e91b40b9eb6301b8ebc341f8BL8;FF201100b4080d8052b3835df8fc031faa887e089", - "bfb0314aaa8031ef81100001436008052a9835ef8aa835ff868021c8b7b0700d15aa301919ca30191092900a9L8;FF612640f9810000b4602a40f922008052b38d0094680e48f875021bf81f0d00b160000054e00313aa6b88ff9748008092680200f9f44f42a9f65741a9fd7bc3a8BBBL4;FFe20316aa23", - "00805224008052c8c0ff97f82740f9e81f40f9080118cbdf0208eb29f5ff54e0e30091e10318aae20316aa2300805224008052bdc0ff97f82740f9L4;FB444a9c6621ed2c81d73c087a35f466406696050db7b8a1869574a28c00fc1fd27df57e800000065499d66f5e7039138ff872a9b2cc3089f331fe2", - "fa7485fa235L8;FF692206a9e89740f9683a00f9e8d740f968de07a9e8df40f97ba208a9e98740f9e8af40f969a209a9e9c740f9e88b40f969a20aa9e9b740f9e8cb40f969a20ba9BL8;FFe00314aa02018052017d099bb44d0194e17740f9210100b4e07b40f922008052af4d019405000014e00640ade2", - "0ac03d620a803d600600adff031691f44f45a9L8;FFfc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191350840f9fa0301aaf30300aa750500b4540740f9a84d0094e00315aa21008052a64d0094601800b4BBBBL4;FF9f0200f98082803c880e00f9ab000054e00315aae10313aa22008052b0ed", - "0194df0600f16b010054e00317aae10316aa22008052f44f49a9f65748a9f85f47a9L4;FB0800000000000000a485420000000000617373657274696f6e206661696c65643a20726573756c74203d3d2053656c663a3a5072656b65794d65737361676520L8;FFe8270039e90300f9e0030091a5e3ff97e1", - "0300aae00301aaf44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd637008052a80640f91f0116ebc9080054BL8;FFb702103728008052f70700b9b70a0035630000143400801239008052010b40a9e00313aa046e0194600200365a00001454008012e80200f008612a9159008052L8;FFa011009", - "4e1d342f954faff17e0431691220080529b110094e1d342f93efcff17e04316912200805296110094e1d342f955fcff17e04316912200805291110094BBBL4;FF58ffff17a9735c3808d34178e00316aaf9d701a9159341b8b60301d1e8270129a9237da9b9835c38bbe35c781a2342b8e90b00f9a9035e3", - "8a88314f8a80301d1L4;FFfd7b42a9ff030191c0035fd6200020d4fd7bbea9f44f01a9fd030091f40300aa4301f8b7f30303aa810100b4e00302aae10313aa250e0094600100b4e8031faaL8;FFf80100d018230191d901009039a33a9120008052fb0100d07f021ceb400500547546407857034079ff021", - "56b60ffff5408ffdf88e801003568e34039a102174aBL8;FFe95706f9c62d0194800200f000201291820200f042601391e1068052d12d0194e8ff42f9e90343f9800200f000200491830200f063a01991840200f084e00491L8;FFdf0e00b18104005488008052a2ffff17f46b40f9e807409108011891e0", - "0314aa8a2d009488624039fb034bf9f9074bf9fc0b4bf9a8e21839080180d2f80f4bf9BBBBBBL4;FFff0208eb68080054340117ab42100054f42300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889a152300a9f7fbffb5f62b40f9L4;FFe96b42f9e03bc13de13fc13dea", - "8342f9e86f42f93f0500b1e00715adea6301f9202800544083cb3c4183cc3c4283cd3cea6341f960838a3c4083ce3c61838b3cL8;FFf65741a9fd7bc3a8c0035fd620008052e10313aabf150194000040f921160114010040f9810000b4000440f922008052ab150114c0035fd6ff0301d1fd7b02a9BBL4;", - "FFff8307d1fd7b18a9fc6f19a9fa671aa9f85f1ba9f6571ca9f44f1da9fd030691f30308aae8030391f40303aaf803022af50301aaf60300aa356f0094e8674ca9L4;ZBL8;FFe80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb09290054088c", - "48f81f0500b180200054ee050094BBBL4;FFf9031caa228f40f822f9ffb5600200145f2800f1880000542800028b08f1df38c839f837e0830091463f0094e82340b9a8550037e81b40f92a0740f9490108ebL4;FB643a3a73746174657300000000000000611c49000000000055000000000000004001000", - "021000000611c49000000000055000000000000005401000019000000L8;FF9f0100148800805209008092790a00f968220039e00301aa690200f9ff074091ffc30091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a814d2ff17BL8;FFe1431691ead302f9610f0094fad342f9e8cb42f90801", - "1acb1f0308eb288c0054e8cf42f9e10319aae20318aa00011a8bb3550194f90b40f94803188be8d302f9L8;FF4801009008b140f91f0500f169050054e8c32c912901009029091391e85b04f9a80000d008710391e85f04f9e8c31691a04700d1e86304f9080000d008713e91BBBBL4;FFe80340f91f0d00", - "b120fdff5475da41a9e00740adc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aaL4;FB65737361676573656e6465725f6b65795f646973747269627574696f6e5f6d65737361676564656372797074696f6e5f6572726f725f6d65737361676", - "5436572L8;FFe1031faad5ffff17880240f91f0500b1810000549f5e00a99f6201a99f2600f91f0800f1810e0054e00313aa68f5ff9740010036a10c00b501f9ffb4bcffff17BL8;FF84201191a3630091e2018052a80f00f90076019468e201910103009021e02591040300f084a01191a3630091c20180", - "52a80f00f9f77501946842029101030090L8;FFe0c3843de067c13de86f09f9e2c7843de1bf843de0bb843df41300f980020054e83b49f9080100b4090140b22911c0da291540d2290d098b292501910819498bBBBL4;FF60030191e10301912200805208050091683300f9e5b50194fa031caaf90315aaf", - "fff013942ff46d353e37a925a174092e20000b4683340f960030191e10319aaL4;ZDL8;FFe00300ade00301ade00302adde0c009408018052bf7f3fa9bf233ea9acb500940009805221008052aab50094e00900b4f70300aaa6b500940004805221008052BL8;FFe30a803d75fdffb5e81b41f91f0500b16", - "00a0054f72341f9e94b42b9f54f42b9e85b42b9e8270529179a00b4f31f41f9a7350194e00317aa21008052a5350194L8;FFd572fe9745050014c80080d2e10000b021f83b910800f0f2e0830e91e3032a91e4430f91e2008052e9db03b9e8eb01f90a060094f5e741f9e8df41f9bf0208ebBBBBBL4;FF4a", - "92e4f2a0040054290114cbfb0308cb190e805229fd44d33a7dca9b09e179d33c1108cbe0030091e10314aab1a60094c80240f9a90640f97b0700f1e00742adL4;FF560300b4e10f40f9e80740f9b71240f91f0101eba00d0054e80b40f9490380522a040091e00316aaea0f00f909692138e12300919be5f", - "f97f80f40f9e80740f9L8;FFa80000b4601e40f901f97fd342008052b3050194682640f9a80000b4602a40f901f97fd342008052ad050194683240f9a80000b4603640f901f97fd342008052BL8;FFb4850194200e00b4280300b008150a91090080920001c03d01c1c03c0800f0d2977e02290000803d01", - "c0803c80de01a9892200a955f9ffb4e00316aae10315aaL8;FF410b00910005138bbd850094e80313aa08011c8bbf0600f1a8831cf8a0060054a80400b4fb0308cb33008052e11340f9e0031aaae20318aafc0313aa73060091BBBL4;FFf40319aaf9031baafb030a2ab0c50194e00313aa21008052aec50", - "194602900b4e10316aae20313aae00b00f9b4c50194ea031b2afb0319aaf90314aaf4031a2aL4;FB2f604900000000004700000000000000320100000d0000008c694700000000009c694700000000009c694700000000009c694700000000009869490000000000L8;FFe8f200f84841092aa91246b8ea4", - "35739f5a357393b8108aae8ef42f9ea1300f9e81b00f9e8035839e8af00b9b4c50094e8030e91ee2749a908210591fe9342a9BL8;FF0cfc71d308050091290040f9280800f90cfeffb43f0108ebb3611932000200542b0440f90afc78d37369283808050091280800f98af6ffb43f0108eb93611932L8;FF", - "0001009000e03291b84500940001009000602691e1031faac0035fd6c0035fd6e30302aae20301aa010100b021801091c8450014ff4301d1fd7b03a9f32300f9BBBBL4;FF2b7d4039ec3300f8ea0b00f98afd68d32c0140b9eb630039eb0340f929f140f86d3200294d7d10536b0600f92bfd68d32cfd60d", - "36a2200796a7d1053693201b8L4;FB73657373696f6e2062617365206b657920c01d2c206e756d626572206f662070726576696f7573207374617465733a20c000204e6f2076616c69642073657373L8;FFe0230b39e0030b91ff270b39f56301f9a4dbff97e80300aa21020090216c1a912302009063e81", - "791e86301f91d000014a003123848008052a0a303d1a8131238BL8;FFa80f00f90366019403660194fd7b41a9f31340f9ffc30091c0035fd6fd7bbea9f44f01a9fd030091f303012af40300aaa76501940002805201018052a5650194L8;FF68a240f9a80000b460a640f901f97fd342008052b265009468", - "ae40f9a80000b460b240f901f97fd342008052ac65009468ba40f9e80000b460be40f901f97fd3BBBL4;FFb3a50194e00317aa210080523a008052b0a5019400feffb4e10318aae20317aaf90300aab6a50194e10740f9810000b4e00318aa22008052a9a50194955a00a9L4;FF40fc0388a3ffff3500008", - "0d2010080d2f35341a9fd7bc2a8c0035fd6734e00a9537820f8f4ffff17a4ddffb54affff17c01a00b4050c40f280000054000080d2L8;FFf60300aaf80301aaf40700b4b0a50094e00314aa21008052aea50094e10318aaf30300aa2000805273feffb4285440a9f4cf00a9ff0f00f9bf0214eb08070054", - "BL8;FFe3430091d3250194fd7b43a9ff030191c0035fd6202040a9810200b021b03c91030d40f9a2068052fd7b43a9ff03019160001fd6e00301aa810200b021843d91L8;FFc81f8052e803063908008092e20300ade00b11ade00742ad281300f8289300f8281301f8e8cf00f9e0070dad2801005420030", - "191e10315aae20314aab0250094BBBBBBBL4;FFbf3e00f148020054800642ad80020291e103009122008052e00702ad800a43ade00b03ad810240ade10300ad820241ade20301adb419029400e4006f808200adL4;FFb7190094e0a30291e103192a83110094f50f4ba9a08301d101a30091e20315aa320f", - "0094b6035af8df0a00b1a1020054b60b7ba9a1835af8420700b4e10700f9L8;FF63e01f91e0031faad3190194ff8301d1fd7b01a9f91300f9f85f03a9f65704a9f44f05a9fd430091160440f9760200b4335040a9380200f018e30591170040f9BBL4;FF20008052e10313aac2990194ff4302d1fd7b04a9", - "fa6705a9f85f06a9f65707a9f44f08a9fd030191372800f1f30308aaa200005488028052490300f029a11991L4;ZFL8;FFa363009162008052a80f00f9019a0094810100b021441991a401009084001891a363009162008052b30f00f9f999009468620091810100b021501991a4010090BBBL4;FFe80340", - "f9765e09a9e00314aa76620aa9e10313aa022b805268620ba9080180527f220ca9080480527f220da975220ea97cf200b9f44f47a9f65746a9f85f45a9L4;FB632f656e636f64696e672e7273002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d6235386437663", - "536653336343563L8;FFfa3f11a90001c03de0030aaaf1fb12a9f63f40f9b1008052fe6740f9ef6f40f9e10310aae80740f9e9bf00f9e90317aae3e700f9f7031baafa5740f9f17300f9BL8;FF4283833ce293c13dfa3349f9e0ef843de08fc13d5f0700b1e1eb843de18bc13de0e3843de087c13de2e784", - "3de283c13de0db843de07fc13de1df843de17bc13dL8;FFe88332911f030071fa7706f900818b3ce0e3c23d01818c3ce1e7c23d00818d3ce0d3c23d01818e3ce1d7c23d0081893c01818a3ce92344a9fc7b06f9fa7f06f9BBBBL4;FF75da41a9e00740adc80240f9e08701ade00bc03de017803d680000b4", - "e00315aa00013fd6c10640f9810000b4c20a40f9e00315aaaaf90194e08741ad28008052L4;FB4d65737361676520776974682076657273696f6e20c0001941646472657373206d69736d617463683a2073656e6465723dc00c2c20726563697069656e743dc0L8;FFbc020094e08742adf50300aae21fc0", - "3df4b300f9e08709ade08740ade257803de08707ade08b41ade08b08ade02400b4e19740f93f0800b1800100543f0400b1BL8;FF3f0400f18b000054600640f922008052b379019408008092680200f9f30b40f9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091010040f9f30300aa1f4800b9L8;FFe06", - "7c03de8d340f9f71b00f93f0d00b1e083833ce82700f94101005428008052ff0600f17f7e01a97f2200a9687e02a908008092681a00f98a15005449040014BBBL4;FF0cadccca2801088b8b010d8b08cdc9ca6cc1ccca89adcc93ac93567829bdc8ca08010b8babb356382981c8ca280108ca89410b2aac5", - "356b80bfd79d3f00308aaL4;ZBL8;FF200502ad200b43ad200903ad210340ad210100ad220341adfc2301f9220101adc90100b029412c91e97302f9e9030991ea7702f90a018052e97b02f9ea7f02f9BL8;FF080040f9f30300aa1f0500b1e0030054e00313aa40000094080040b20811c0da081540d2080", - "d088b0825019108fd46d30900088b340500919f0208eb69060054L8;FF08210b91e3430f9162008052e9ef01f9e9f701f9e8fb01f941f4ff97680a42f9600642f9e103152a080d40f900013fd6f55340f9607e02f9618202f9f5feff17BBBBBL4;FF020280528401805279010014089440f91f0500b1a100", - "0054280080521f9c00f91fa012a91f4001b9481c00121f090071e1110054730040f9620640f9021500b4L4;FF330400b182030054b300f8b6f6031faae00316aae10313aabe090094f40301aaf50300aaaa090094e00313aa2100805236008052a7090094c0feffb408018052L8;FFf31b40f9ff030191c0", - "035fd6281040b9000040f96800c8376800d037d0090114010a0114010a0114281040b9000040f96800c8376800d037de090114f8090114BL8;FF05000014ff3e0171e9000054e87e0453490f00916842003908008092682600a9ef000014a8060091822600f109008092e80b0aa9e8830291ff1301b9ff1b", - "01b9L8;FFe79b56294a7c8a0a6b7c8b0a2e180753efc3971a8c7c8c0aad7c8d0a08010f4a301c08532f200953f9fb55290801094ace7c8e0a4a010b4af403152a29240a53BBBL4;FFf52b40b9f44f40b9f30309aa13ffff17a00300d000203c91b4c90194a0a33ea9a00300d000803c91a30300d06380229", - "1a40300d084003d91a26300d141038052L4;FB0800000000000000a80b460000000000000000000000000008000000000000000800000000000000a4f645000000000000000000000000000800000000000000L8;FFe0cb813d6093c83ce8231c39684f40f9e10f00f9e1031c91e99b03f92093803cf9831", - "d91e88f03f9981c0094e8b343f91f0900f1616e0054e10f40f9416900b5BL8;FF687240f9a80000b4607640f901f97fd342008052b2490194687e40f9a80000b4608240f901f97fd342008052ac490194688a40f9a80000b4608e40f901f97fd3L8;FF291540d2290d098b2925019129fd46d30801098b13", - "0500917f0209eb890f0054088c5df81f0500b1c00c00547e020094080040b20811c0da081540d2080d088bBBBBL4;FF1a7000a91b5001a9186402a9155c03a9202101a93f2100a9810000b4e04340f922008052aee90194ff430e91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L4;FB520000000900", - "0000000000000000000008000000000000000800000000000000a87d4200000000004f734572726f720000000000000000000800000000000000L8;FFe20315aa0001168bbde90094c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e00313aa2200805223008052240080525a00009", - "4610a40f9BL8;FF19000014a102178b820217cb800f80520a6a01941f0400f12001005412000014e0031faa1f0400f1a00000540e000014200080521f0400f1610100542800178bL8;FFe89741b92083c13cec030b918033803da10900548031c03de8c302b98b4100f8204b803d8ac100f8204bc03de8d3", - "42b9490100d0298110918101c03de01b40f9BBBL4;FFe00314aaee810094fc0300aaf50301aad30300b4aea90194e00313aa21008052aca90194c03e00b4e10319aae20313aafa0300aab2a90194f90b00f9db0200b4L4;FF7f0900f1a0030054ae09c039df0501318cd58c9a7f0d00f100030054ae0dc03", - "9df0501318cd58c9a7f1100f160020054ae11c039df0501318cd58c9a7f1500f1L8;FFa13240f9810000b4a03640f922008052b3a90094a13e40f9810000b4a04240f922008052aea90094a14a40f9810000b4a04e40f922008052a9a90094a15640f9BL8;FF0081cf3ce8e344f93dffff17e88b40f9c800", - "00b40805088be00314aa0201805201f17dd3ae290194400745addf0a00b14233c03de85345f9800705ad400743adL8;FFe01316b9e80f0bf9e8032491e0074091e92316b90904805200001891e8030bf9e8833f91f6074091e9070bf9d6021891e11716b9e744ff97e8f347f91f0500f1BBBBBBL4;FFfa67", - "0ca9f85f0da9f6570ea9f44f0fa9fd830291081c00121f09007181010054550040f9f30302aaa20640f9e20100b4f40301aaa10240f920008039a001f8b7L4;FFe00b4091e843139102c4805200c00e9101813191ba110094ad11009400c4805221008052ab110094209e00b4e10b409102c48052fa0300a", - "a21c00e91b0110094L8;FFdf7d02710934003949c100110a819f1a0938003969010d0b4a114e0b29c10011cb0d00122c244039093c003949c100117f2500710940003909819f1a9f7d0271BBL4;FF81020291e80f00f9e8830091000000ad80820191f16a0094e86342a9f71b40f91f0500f100090054ff8", - "602f1222c005416048052570400b4a002168be10318aaL4;ZDL8;FF21d01391840100d084600d91e0030091a363009142008052b30f00f9fd91009468020291610100f021d81391840100d084e00891a363009162018052a80f00f9BBBL4;FF68680a9b1c2940a90b2541a9eaaf03a90b2942a9e91700f9e", - "90338aac402098bea0f00f99f0018eb0a254629eb3b00f9ea2700b90aad43a9e90700b9ea1b00f9L4;FBcb6fffb07e75a21a01f8faa35c68840fd9ee27558b914040e01f50050368a5e314df7fd56faeee4ad4ecdfdda65d48eae5dcd4ad5fc2e658d11ba28c82efe99fL8;FFe8bf00f9e8bf43f9efd343f", - "9ead743f9e2df43f9e4e343f9e8ff00f9e8db43f9faeb43f9f7ef43f9e1f343f9fef743f9e8a71aa9e8ff43f9e9e743f9e70b44f9BL8;FFe1d342f98dfbff17e043169122008052b4110094e1d342f9a3fbff17e043169122008052af110094e1d342f9bbfbff17e043169122008052aa110094e1d342f9L", - "8;FFe00314aa00013fd6a10640f9e12a00b4a20a40f9e00314aab151009453010014fc831291e8db42f9f90316918043c03df7cf42f9fbc742f9f5cb42f9e0e31b91BBBBL4;FF683200797f7e00397fb201b8ebffff17ec8306a9a8e300d1e13f00f9808640a9ef2f04a9ea2b00f9eea70b29ed6700b922c", - "c0094a8835c38aa135d381f050071L4;FB6f6e6d697373696e67206c6f63616c2066696e6765727072696e746d697373696e672072656d6f74652066696e6765727072696e746661696c656420746f2064L8;FFe00300f9210200f021281a91230200f063601a91e0030091c2018052640080521a000014e", - "00300f9210200f021281a91230200f0635c1491e0030091c2018052BL8;FFea710194a9035538480d8052aa135538ab235538e00740ad2901084a4a01084ae0c30291a9031538a93355386b01084aaa131538aa435538a1c302d1ab231538L8;FFe8bb49f91f0500b100bdff5481420491f0010014e1d342", - "f9e8cb42f91f0101eb807d0054e8cf42f949048052f4074091948209910969213828040091f67749f9BBBL4;FFe00309aab6b10194e03f40f9e10319aabf8733a9b8f334a912000014bc035cf83f0b00f180010054a80354f8480100b4a98354f8e03f00f9f90301aae10308aaL4;ZBL8;FF0b000014fb06", - "00b48aa240a93c008052890240f91f0109ebe933899a080109cb090e80520829099b1f0900f99f031bebc20400548aa240a9a09300d1890240f9BL8;FFe80300aae85306f9e0833291a102009021c00b91a2018052a3020090631c0c91240280522b000014e05306f9e0833291a102009021c00b91a20180", - "52a3020090L8;FF43070054e8032a91e08324910a5afe97e84345f91f0500b1403c0054e84b45f9e9730e91e002c03de94b03f9090000f029d12191e8b302f9080000f008012191BBBBBL4;FF29008092880a00b928008052890200f968620039f44f4ea9f6574da9f85f4ca9fa674ba9fc6f4aa9fd7b49a", - "9e923486dffc30391c0035fd62004009000c01091L4;FFb7010094f71f40f936008052ff2200f18018005408058052fa0317aaf766089bf5d240a9340200b4b982009104000014940600f139c300918001005421035ef8L8;FF601e40f922008052f30b40f9fd7bc2a8b3010114f30b40f9fd7bc2a8c0035", - "fd6210400b4fd7bbea9f44f01a9fd030091f30301aa14e0009104000014730600f1BL8;FF3f0500b1e0010054ff8300d1fd7b01a9fd430091010300f021802991240300d084c02291e323009182008052e80700f9ed810194fd7b41a9ff830091c0035fd6L8;FFea810094882648298a2e49299682003980", - "a20191e10300910809c05a2909c05a9f9202f8882600294809c05a6b09c05a892a4a29882e0129220080529f1202f8BBBL4;FFf65704a9f44f05a9fd030091ff0311d1ff0300f9fb0300aaf40303aa698f41f8f803012af70308aae21b00f93f0500b160050054086041b9490080521f010071L4;FB65737", - "3696f6e207374617465202862617365206b657920c0012900204e6f2076616c69642073657373696f6e20666f7220726563697069656e743a20c01b2c20L8;FF00a101918283813ca2877eada98318f8a08b3cada1833dad46180094a20f7cade84f42f9a1037badf43b02f9e83b00f9480080d2e313813d", - "0800f0f2a3137dadBL8;FFe10317aae20316aa0001188bbc4101940803168b680a00f9540300b4610a40f9680240f9b51240f91f0101ebc0070054680640f9490380522a040091e00314aaL8;FFa1e6ffb59efdff17000100b000c01391030100b063600c91040100b084a01491a24700d1e1068052bd410", - "09420008052e1028052b74100940201009042003891BBBBL4;FF0f0000141f0400b141c20054d7e101941f100031c1c10054f9ffff17d4e10194f70300aa1f0400b141fdff54e043059181008052cfe10194a0c00035e85341b9L4;FB0800000000000000249d430000000000089c43000000000078a5430", - "0000000006120446973706c617920696d706c656d656e746174696f6e2072657475726e65L8;FF008547ade22f823de32b823d038946ade023823de127823d008545ade31b823de21f823d0201ca3ce117823d010d44ade013823de00bc03de20f823de0ef813dBL8;FF21201f91e40200d084e03c91a363", - "009102028052a80f00f9fe61019468c20091c10200f021c03091e40200d084603d91a363009122028052a80f00f9f5610194L8;FFe00301aae10308aa22008052f4030caa9c050094e10340a9ec0314aa2ba040a9290040f90afc78d37369283808050091280800f98af3ffb4e8ffff17e10300a9BBBL4;F", - "F41050054b2a10194008c815221008052b0a10194a00600b4c1060091028c8152f40300aa168c8152b5a1019408c48052b61200f9a85201a928008092a84e00a9L4;FF73fe44d3c90300546106009124c59c5264eda072030000f0207c0253634004910004412a020000f042c002910008402a0010402a00", - "20402a05040011a000200aL8;FFf5a10014080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091810100f021cc1491a40100d084c02491e323009182008052e80700f9BL8;FF800200b000001191b8210194ff8301d1fd7b03a9f52300f9f44f05a9fdc30091e90300aae10700f", - "9220d41f83f0002eb81010054090440f98a0200b04ae10c91BL4;FF604240f922008052f30b40f9fd7bc2a8b3210014f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4600640f922008052L3;ZBBBBBBBBBBL4;FF000140fde1031aaaea031baaeb031faa0c0980", - "52ee0317aa0088202eef0308aa0d00669eb0c10192edef7fb2300100b57f2500b1680d0054e08d40fc6b210091L4;FFa2e300d132fdff9780faffb420000014c00500b5a0e300d111feff9700010036c1f9ffb431000014a2e300d1830c80520bfbff9720f9ffb445000014e16300b9L8;FF018100912000", - "8052231f01940007f8b7a00640ad800600adb30100b593ce00a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6e00315aa41008052a3feff97BBL4;FFf60319aaf403152aec0340f908008092882500a9e80740f99b6101a9961100f9942905298b1900f9a8faffb4e10740f9e0031aaad0ffff17fc074", - "0f933008052L4;FFff003f7121ebff54740214cb620282d2b902028b21cc74923903148b3acf74923f001aebe10300541f0400b100f8ff54c21240f9014000915a5300d139ff4cd3L8;FF130040f9e00301aa810100d021501691e8030091e2018052fd9e0094810100d021d01391a40100b084600d91e00", - "30091a363009142008052b30f00f9f59e0094BBBL4;FF57ffdfc8770000b5d9de0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300eba3600054L4;FBf5014900000000004e000000000000004506000005000000f5014900000000", - "004e00000000000000010300001f000000f5014900000000004e00000000000000L8;FFe10313aa28f840f9e80000b420fc40f9f30301aae10308aa22008052b0de0094e10313aa20200091f30301aae4d8ff9760420891ff074091ffc30091f44f45a9BL8;FF380b40f9b80600b4f41700f9340740f9fb0", - "b00f91beb7bd3fadf0329f62700b9ab5e0194e0031baa01018052a95e0194000800b416400091fa0318aae00700f9L8;FF080116cb9f0208ebe9f8ff54e00313aae10316aae20314aa9a020094760a40f9c1ffff17fd7bbda9f50b00f9f44f02a9fd03009148008052f40301aae10302aaBBBBL4;FF08010", - "acb6a05009120419a3ca82a01a921419b3c2800809229008052880200f969520039f44f4fa9f6574ea9f85f4da9fd7b4ca9ff030491c0035fd6a2820091L4;ZFL8;FF280800f983ffff17e00301aaf30301aae10309aa220080522300805224008052f4030aaa5f1500946ca240a9ea0314aae10313aaeff", - "fff17ff0301d1fd7b03a9BL8;FF027f0114090040f9281040b9200140f96800c8376800d037d07e0114c97e0114fe7e0114090040f9281040b9200140f96800c8376800d037de7e0114f87e0114L8;FFe9edff97080040b20811c0da081540d2080d088b0825019108fd46d30900088b37050091ff0208eb", - "c81d005420010014e11740f9e80f40f91f0101eba06c0054BBBL4;FFfc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff030bd1e10300aaf40300aaf30308aa298c41f83f0500b140010054e0030091f5030091cd2e0094L4;FB000000000000000000000000000000000900000000000000090", - "000000000000045854900000000004c8549000000000000000000000000000000000000000000L8;FFe20318aae00314aa2dbf0094e81f80521f01206a4004005488018052e10240f9a822003908008092a80200f9810000b4e00318aa22008052a9be0094610240f9BL8;FF540740f9b23e0194e00315aa", - "21008052b03e0194601800b4e10314aae20315aaf60300aab63e0194571740f9570400b4541340f9a63e0194e00317aa21008052L8;FF0001803de083c13c0005803de083c23c0009803d892200f90c000014e003082ae20313aa630c805269f9ff9780f6ffb4a9ffff17e003082ae10314aae20313aaBBB", - "BBL4;FF490280522a040091e00315aa6a0a00f909692138e10313aac2faff97770a40f9680240f9080117cbbf0208eba8300054680640f9e10316aae20315aa0001178bL4;FFe96f42f9e86b42f9e9bf00f9e97342f91f0900b1e8af00f9e9a300f921050054e0431391e1031caa2200805223008052ff03", - "0094e86b42f9e96f42f91f0500f1L8;FFe9830039eb9302b8e8b70039f20e0194fd7b44a9f32b40f9ff830191c0035fd6ff8301d1fd7b04a9f32b00f9fd030191f30301aae10300aae023009122008052BL8;FFe1031baac38e019400018052e10314aac08e019420008052e10316aabd8e019420008052e", - "1031caaba8e0194ff8300d1fd7b01a9fd430091280440a929030090L8;FFf30300aa610100d021f81b91e8230091e00309aa22028052fd8e0094940100b094620a9168620091610100d0213c1c91e0230091a32300d142018052e40314aaBBBL4;FF0a692138e1e30091e92700f9c5baff97a80e40f91f05", - "00b160090054e12740f9e81f40f91f0101eb60270054e82340f91c69213828040091b73240b9b61640f9L4;FBfa644c60b2055deee43dd9cf6d5766386d5557369c2ccb466c15544552c883e22d97733aa29aace7784aa28cf860264a7dc3363f00003997fac8ef9f75d88921L8;FFe8030eaaee031caaf9", - "030baaed0304aafc4340f9e083803df8c741a9e74b44a9f6134ba9e30311aaf1031eaafe1b40f9eb0312aad5000014f7d300f9280200d0BL8;FFc80100b5080840921f1900f102020054017c0353210200341f1100f160020054e003082ae20313aae303142ab5ffff97c0fdffb4d2ffff17280180d2e007", - "00f9L8;FF08413b91a10302d1e303169142008052e9c702f9e9cf02f9e8d302f975e3ff97a10353f8810000b4a08353f822008052ab4e0094f56340f9e8031691e00315aaBBBBL4;FFa80200b9e8038052a9a200a975000014e8274729f35f42a9f40b40f91f010072083340b929119f1a3f01086b410100", - "54df0e00b1a903005428008052e90300f0L4;FB2900000000000000fc0100002d000000fe924800000000004c00000000000000680f00001d000000fe924800000000004c00000000000000890f000011000000L8;FFe8230039480080520900f0f2e8270039e90300f9dfffff17e80f41b2dcffff17e003", - "00f9210200d021041491230200d063fc1491e00300912202805264008052BL8;FFf44f02a9fd030091150840f9080040f9f40302aaf30300aa080115cb5f0008eba8010054b40000b4680640f9e20314aa0001158bb26e0194a802148be0031f2aL8;FF490380522a040091e00318aa09692138e1431691e", - "ad302f9450c0094fad342f9e8cb42f908011acb1f0308eb48360054e8cf42f9e10319aae20318aa00011a8bBBBL4;FF690300d029b11491e82706a9680300d008351591ea098052ff2703a9690300b029150a91e82b08a96a06805228048052e92b05a9290080d2e87f04a9a92cc0f2L4;FFfd7bc5a8c003", - "5fd6fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30301aaf40300aaf7031faaf84b1432680217eb1f0118eb1631989a7f0217ebf5979f1aL8;FF1f050071c1feff54e2031f2a5c08009408fc78d309fc60d3087b68782821084a095d1053095b69782001084a9c0700f11400144ac1fdff541100001", - "4e80100d0BL8;FFe17740f9081540f900013fd6e06b01f9e8c31791e16f01f9290c40f9e1830b9120013fd6fcfb42f99f0f00b1810d0054a8008052a5ffff17e03fc13de143c13dL8;FF1f0d00b181010054680200f9e8034b391f1500710d0200541f190071800200541f1d0071400200541f2100710002", - "00544e000014a8e300d1000540ad0209c03dBBBBBBL4;FF22008052b6160294615640f93f0400f1cb000054605a40f922008052f30b40f9fd7bc2a8ae160214f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091L4;FF6183843c4183c63c6083853cc082c03c6183863cc182c13c6083803cc082", - "c23c6183813c6083823cec2f0054894800b548008052f7c34bf9f8c74bf9e9830a91L8;FF020041a9230540f960001fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aa610200d021002291e8030091e00309aac2008052f5160194680240f9BBL4;FF12000014a0031df84103009021c82491", - "4303009063a42591a0c300d1e2008052e401805209000014a0031df84103009021c824914303009063742591a0c300d1L4;ZBL8;FF4b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aabBBBL4;", - "FF682604a9755200b9f44f4aa9f65749a9f85f48a9fa6747a9fd7b46a9ffc30291c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091L4;FB456b43743141636b6d61785f6f6f6f5f6b65797343743141636b6e6f776c6564676564726563656976696e675f656b43743253656", - "e7443743253616d706c6564L8;FFe9231fa9e80f42f9e90742f9e8cf00f9e81742f9e8c300f9e81b42f9e8ab00f9e81f42f9e92312a9e82342f9e92742f9e8ab1aa9e82b42f9ea3342f9e9a309a9BL8;FF3f0400b1a0adff54810000b4e07b49f922008052b2560194e18349f9e1acffb4e08749f963fdff", - "17e18b49f93f0800b1800100543f0400b140010054810000b4L8;FFe85306f9a74cff97e10300aae15306f9e08332912101009021e0339102028052230100906320349104028052c9000014c80080d2e0a33239e08332910800f0f2BBBBL4;FFc1070054602241a9090d40f9e803009120013fd6e80340f9", - "1f0d00b141030054880200f9680080522a000014785e40a9f50301aa762240b9a5f6019400038052L4;FB74696f6e206661696c65640000000000fe924800000000004c000000000000004b0a000009000000fe924800000000004c00000000000000810b000009000000L8;FFe003082ae10314aae20313", - "aa63faff97a00f00b520fcffb4d6ffff17898243f83f0900b161000054971e00f99f3600f91f0900f1a10d0054e00313aa64f6ff97BL8;FF68c20339da0500b531000014e08744ada90356f8691a00f909008092608600ad692200a91c0400b524000014a8760194c006805221008052a6760194c00600b4", - "L8;FFe807409108810991e06b813de167813d59c1ff97e83349f94083c03ce93f49f91f0500b1e01b843de93b08f9e0110054e0abc43de1a7c43deac33391e2a3c43dBBBL4;FF24008052caa9ff97e11f40f9e81740f961ffff17e0a30091e10308aa220080522300805224008052c1a9ff97e92b43a960f", - "fff17e0a300912200805223008052L4;ZDL8;FF29f87fd33f1100f13481889ae30314aa74000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9b5b60094BL8;FFa10200b021c02591d2360114fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44", - "f05a9fd030091ff033ad1a902009029213c91ff0300f9e97301f9fa0308aaL8;FFdf0215eb60020054e0430f91f70600d138a001913a03158b260f0094600745adb5a201916233c03de81b42f9e10318aa408701ad610f44ad601fc03d4217803dBBBBBL4;FF69020094e81340f9c80700b409fc79d3e82b", - "41a9ed031faaec031faa200d010e82ffff170c69eb38ec07f8360043c43c0143c33c8c014092ed1340f96e2100d1L4;FF200100b4140000f9810000d021403d91130800b91f300039f44f41a9fd7bc2a8c0035fd60001805201028052c4060094fd7bbda9f50b00f9f44f02a9fd030091L8;FF0001803dc0", - "035fd6490200f029610c912001c03d0001803dc0035fd6ff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9BL8;FFe00314aa696eff97b50600f194a201914002005481025df8810000b480825df822008052ae86019481825ef8810000b480025ff822008052a986", - "0194810e40f9L8;FF682201916101009021481491640100f084600991e0030091a3630091a2008052a80f00f9fb8600946862009161010090215c1491640100f084e00991a3630091BBBL4;FFe00704add40600b4fa0f00b9fa03152af5030aaaeb0b00f9adc60194e00314aa21008052abc60194e01100b", - "4e11740f9e20314aae00f00f9b1c60194ea0315aaL4;FB31322e312f7372632f62797465735f6d75742e72730021706f73742d7175616e74756d20726174636865742073656e64206572726f723a20c0001a7365737369L8;FFedbf43f9f9c343f9fec743f9eecf43f9f2d343f9f1d743f9e0db43f9e3e35", - "e39e7f343f9e4e343f9e5e743f9f5435f39fc7300f9e27744f9fc6f40f9ebaf00b9BL8;FF3a0000142b7c1c534b0a00344d11c0390b00be522b000b0bac1d00128d00f83761710c8bab008052300000144d15c039ae1d00128c1d0e0b8c0102518d00f837L8;FFe2020054688e48f81f0500b140020054e0", - "0313aa84ffff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb69010054BBBBL4;FFf95f40b9e1db46a9b7fe58d333008052e903192a610100b4e02740f922008052f5031baafb031aaafa03092aace60194e803192af9031a2afa031baafb0315aaL4;FB6361", - "72676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632fL8;FF05000014e80b41b2e06701f902000014a80600d1e0030b91e86301f9a1dcff97f40300aab4000014f55356a9e0030091c1420091022a805", - "2b1e60094bf0a00b1BL8;FFf44f42a9f50b40f9fd7bc3a8c0035fd620008052018c8152c9660194fd7bbda9f65701a9f44f02a9fd030091e10200b4090040393f01037141030054f30301aaL8;FFfd7bc2a8b6660014610a40f9e10000b408018052606a68f822008052f44f41a9fd7bc2a8ae660014f44f", - "41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9BBBL4;FFffa303a9e8ff05a9e8a30091e08702a9ff6b00b9ffff04a9a80f00f9a10900b4560080d2e20301aa152100911600f0f2f7a300910a000014e1e30091a2630091L4;FF5f1040f2a2cc7492a1020054087c4093420100b427000090e7c0029", - "1a2cc7492087c4093424000d1e5d86078a53c7cd35f0005eb82010054240600b5340000b0L8;FFe003132ae103142a67000094e103002ae003152af44f43a9f51340f9fd7b41a9ff030191c0035fd6fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9fd030091BL8;FFe013803ce0030091e1f3803c2004", - "40ad08111d122a150033a18300d1e8030039e8030191ea7f0039a0073fad15270194e00742ade0030191e00701ad12270194L8;FF20008052e10315aac226009400018052e10313aabf260094080040f9e20301aa002140a9e10308aaf8260014000040f96c03ff17000040f944a2fe17000040f9BBBBBBB", - "L4;FF29fd43d32af17dd3490109cbc932899a1f0549eba90b00542a050091f30300aaa08300d15f0108eb011380520295899a7a000094b9537ea9a1035ff8390b00b4L4;FF1a0080921d0000141a008092e00bc03de007803de017803db70000b4e00318aae10317aa22008052ad1a0094e11f40f9810000", - "b4e00316aa22008052a81a0094L8;FFf44f02a9fd030091160040f9f30301aa20008052f40302aaf50308aac18200911d1b01942001f8b7680200f008e11e91b45a01a9a84e00a9f44f42a9f65741a9BBL4;FFf7020191e1d4ff5400e4006ffc6f42a9a0033bada0033cad3b1100b4f3b344b9f7af44b940", - "430091f6ab44b9f4a344b9a18301d16802170bf5a744b979060011L4;ZFL8;FFba9a0094800100b000e01e91b79a0094a001009000201591b49a0094fd7bbda9f50b00f9f44f02a9fd03009108d040a9f30300aa1f3000b91f0800f9940100b4BBBL4;FFa08301d1e1430591e0870aaddfda0194a0077aad", - "a80302d1a203d83c167d4039b80302d1e0870aad00f1c03ce8030291e25f803d00f18f3ca5da019400088052L4;FB0800000000000000a859440000000000496e76616c6964576972655479706576616c7565496e76616c69644b65796b6579496e76616c69645461670000000000L8;FFa9060054a80100", - "f008c10491e97740f9e8ef01f9080200b008c12591e9eb01f929038052e1430f91e8a303f962008052e8ab03f9080200b008a12691e9a703f9BL8;FFe05bc13dea670291e8d700f928e341f8ff0600b120a1813ce04fc13de8cf0ef92800805221a1803c40f18f3cf6bb0ef93821003928250039f4cb00f9", - "a00b0054L8;FFe85701b9be5a009448008052e9f31691ea7340f9e8f31639e8c31691eb7b40f9e9e302f9e99f40f9e8eb02f908018052e8f302f948c141393f0500b1f3db02f9BBBBL4;FFeab742a9880700d1f0bb41a91c011ceaec0b40f9110a8052a1fbff549f0500f1ec0740f90001005420a9200e08", - "00669e880100b40801c0da0811c0da880e488bL4;FB2f72757374632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c6962726172792f636f72652f737263L8;FFdd010014e1430091e20313aaf70b00f9f73f00f9970a0094e08743adf50300aa", - "e227c03df4c300f9e0870aade08741ade25f803de08708ade08b42ade08b09adBL8;FFd30600b102050054b300f8b6f8031faae00318aae10313aabe7a0194170040f9f40308aaaa7a0194e00313aa2100805238008052a77a0194c0feffb4f50300aaL8;FF6891ff97f81740f9e80f40f9080118cbdf020", - "8eba9bcff54e0630091e10318aae20316aa23008052240080525d91ff97f81740f9ddfdff17e063009122008052BBBL4;FFf7d30aa9ec4340f908017eb2f72f40f9fb8308a9fc2303a9a87302d1bbc301d1080140b2ffe309a958008052e87f06a9ffdb0ba9f56700f9f32b00f9fa2f00b9L4;ZBL8;FFf67", - "342f9e84702f908140094b60000b4e00317aae10316aa22008052b0ba0094b40000b4e00315aae10314aa22008052abba009408008092e1230b9102398052BL8;FFc00c00547e020094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb880b00546d000014f3030", - "0aa1dfdff97e80300aaL8;FF8800805260010014607e42f9618242f9290c40f9e8032a91e1031baa20013fd6f64345f9df0a00b1c1200054a80080525501001460c643f961ca43f9290c40f9BBBBBL4;FF5afeff17e00313aa220080522300805224008052c6fdff97610a40f974feff17f50300aae00313", - "aa220080522300805224008052befdff97610a40f9e00315aaL4;FFe00315aae8031faa600600f90a028052e90314aa696a2af8680200f9f44f42a9f50b40f9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091687cc19bL8;FFf50304aaf70303aaf60302aaf80301aa06000094e10318aae203", - "16aae30317aae40315aaebffff17fd7bbfa9fd030091010040f92f0000941f0400b161000054BL8;FF601800b5b70f40f9f60317aac28e40f8621200b4e10240f9340080399400f8b728040091490400d1110000145f2800f1880000542800028b08f1df386804f837L8;FFb48a0094e83340f9e10313aaf", - "50300aa00018052e80f00f9154400b595020014ab8a0094000f805201018052a98a0094805b00b4f80300aaa58a009440018052BBBL4;FFba035df8b7035ef87f0600b1e81f40f9200300545f0317eb60190054a8835df8ea060091a1c300d1e00313aa49088052aa031ef809693738bab6ff97b7035ef8L", - "4;FB000000000000000008000000000000000800000000000000283c460000000000000000000000000008000000000000000800000000000000c4f3450000000000L8;FFe8f200f8e85b44f9ec6344f9e9a301f9e95344f9e16744f9e85300f9e86b44f9fc6f44f9ea7202f8ea035e39f07744f9e8270ea", - "9e87344f9f14340f9eaaf00b9BL8;FFfd7bc2a8b64a0114611640f9810000b4601240f922008052b14a0194610640f9810000b4600a40f922008052ac4a0194603240f9a00000b4613640f9610000b4L8;FF4a090b8b40011fd6088c40f81f0900b1411d0054e8031faa73010014e80300aa098d40f83f05", - "00b140250054f30300aae00308aa69040094e80300aae00313aaBBBBL4;FFff3e00f148020054e08753ad00030291e183059122008052e0070dade08b54ade00b0eade18351ade1030bade28352ade2030cadb4ea019400e4006fe08311adL4;FB2c7a420000000000000000000000000008000000000000", - "000800000000000000704d420000000000000000000000000008000000000000000800000000000000L8;FF000a0054680640f9090180522a0400916a0a00f909692138e10313aafdeaff97e00314aa080c43f81f0500b160000054e10313aae3fdff97950a40f9550300b4BL8;FFe86340b9e9bb4079e00", - "fc03d786600a9683a00b9e83346b869520478e943413968b203b808048052680201a9e85b40b9695e0139681204b8e82740f96082823cL8;FF081100d1d7ffff173f00156b81f7ff54680240f9e0031faa090540f90a0140f9290100cb4a01008be0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff8301", - "91BBBL4;FFf72b40f9f65746a9fd7b44a9ff030291c0035fd62000805281048052bdaa0194ff8304d1fd7b0ca9fc6f0da9fa670ea9f85f0fa9f65710a9f44f11a9fd030391L4;FF493101f9f44f4aa9f65749a9f85f48a9fd7b47a9ffc30291c0035fd6330000b073160291e8018052e0018052f32302a9d", - "3030094400c00b4690240f96a7240f8L8;FFc0035fd620008052e10315aac1aa00940001805201308052beaa0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0307d1380840f9BL8;FF7522009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f9220080", - "52ae2a0194f8ffff17e88b40f908d7ffb40805088be00313aa02018052L8;FFff0316b9e80b00b9e9290094e0074091f90356b98100805200001891ff0316b9e3290094e0074091f60356b98100805200001891ff0316b9dd290094e0074091BBBBBBL4;FF2b1100910d1100d10b3400a94c19001221540c", - "aa2afbff361f1100f1a0fbff542a11c0392b1500910d1500d10b3400a94c19001221700caa0afaff361f1500f1L4;FFa04700d1e7c4ff97e01f01b9a04700d1e4c4ff97e01301b9a04700d1e1c4ff97e00b01b9a04700d1dec4ff97e00301b9a04700d1dbc4ff97e0fb00b9a04700d1L8;FF22008052e303", - "13aad0120194000300b50e00001428008052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6d30100b4a6120194e00313aa21008052BBL4;FFe8430091e92300912a0300b04a71039108017db2200300d000d02f91e9ab05a9a9a300d1a8831df8280000b008911e91e9a306a9a8c301d1e1630", - "191d7920194L4;ZDL8;FFa8831ff80393009468e20091610100f021ec1a91a32300d142018052e40314aaa8831ff8fb92009468020191610100f021141b91840100d084801691a32300d1BBBL4;FFe01300f9a10300f021a01e91a30300f063283091e083009102028052c400805228000014e01300f9a10", - "300f021d02891a30300f063082991e0830091c2018052L4;FB933fd5c22971ac4a5e8b314400002fe1d3fd806cb7b851af23f1482e7e66d45d1498ba3550678ff94ac5d6ff9008f73a20674d27b73876f7a0175c2933c525a3L8;FFe86745f9e027833de8df00f9e86f45f9e8af00f9e87745f9e9a310a9e", - "87b45f9e98745f9e8b700f9e87f45f9eaa318a9e88345f9ea8b45f9e8eb00f9e88f45f9BL8;FF20390054e8cf42f9090180522a04009109692138e1431691ead302f95c0c0094e89b49f91f0500b1c0000054e8074091e143169108810991004103917f0f0094L8;FF0201805201f17dd3b5520094e063c1", - "3de167c13d9f0f00b1e8a345b9e00718ade82303b9810d005448008092480300f971000014f46f41f9e8c31791e91f46b9BBBBL4;FFe88b0079810000b4e00b40f922008052b3f20194e80f40b9bc831cf828f80736a0e300d1f7031baa9cdbff97a0e300d1e10318aa2200805223008052372a0094L4;FB", - "330000000000000040010000050000009a96480000000000330000000000000070010000050000009a9648000000000033000000000000006301000005000000L8;FF080900916affff17c90080d2e8230039480080520900f0f2e8270039e90300f9e4ffff17c80080d2e0230039e00300910800f0f2ff2", - "70039e80300f999e8ff97BL8;FFe00314aa22008052a0073eada08b7bada00b3fade572019400e4006fbf0318f8a0833aada003973ca8da77d3a0877aada10301d1e00314aa22008052080d17aaL8;FFf47749f99f0600b180aaff54f57f49f9f37b49f9350600b47622009104000014b50600f1d6620091", - "80050054c1825ff881ffffb4c00240f922008052a8720094BBBL4;FFa98318f8a8831af8f9e305a9392400b4e20319aa19210091bca303d122000014b40353f8c3ffff17a08312f8610300f021d42d91630300f063b42391a06303d1L4;ZBL8;FF02048052230080522400805265c9ff97c9a245a9d5ffff", - "17c04201918200805223008052240080525ec9ff97c13240f9ca2a40f9e9ffff1769018052eae701b2BL8;FFe85306f9a7280094f50300aa3d010014f9a345f9f5a745f9e0c32791f3ab45f90163009102288052b53201943f0700b140270054e0c32291e1c3279102288052L8;FFe0232a39e0032a91080", - "0f0f2ff272a39e84305f9a328ff97e80300aae84305f9e0032a91e100009021e03f91a2018052e30000b0633c0091240280522b000014BBBBBL4;FF2000805201048052c2020294fd7bbea9f30b00f9fd030091f30300aaac0202946004805221008052aa020294e00100b42904009029210f91284d8e522", - "00540adL4;FFc8620491eaff01f9eac740f9e007813de103813d010140ade99b01f9e98341f9a8620491ea1302f9ea7f41f9010100ade083c83ce183c73ce90f00f9e98741f9L8;FF9f0600b1e0020054735649a9950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f", - "922008052aa020194f8ffff17340100b4BL8;FFfd7b43a9ff030191c0035fd608200091200440a9e92300910a0000b04ae11e91e8a700a9020300f042bc0391ea0f00f9e3430091c7820194fd7b43a9ff030191L8;FFe8230091e00309aa220280520083009468820191410100f021481491640100d08460", - "0991e0230091a32300d1a2008052a8831ff8f782009468c20091410100f0BBBL4;FF22008052b6c20194e00313aa7e020094688e41f81f0500b160000054e00313aa05acff97e00313aae10314aa022b8052f44f43a9f65742a9f85f41a9fd7bc4a8L4;FB68756e6b496e6465784465636f64696e6745727", - "26f724368756e6b446174614465636f64696e674572726f7200000000e4674900000000006a00000000000000L8;FFa00800546083ca3ce87b00f9e0831d91e8e35739695f40f9e1c30391e047803d6013c93ce8e30339685340f9e99300f9e0938f3ce88700f994150094efb343f9BL8;FFe20316aab702", - "0094780a40f9680240f9080118cbdf0208eb29f8ff54e00313aae10318aae20316aaae020094780a40f9bbffff17e00313aa22008052a9020094L8;FFe112c03d8092823c8192833ce9c700f9e10740f9010600b599feff17e8b740b92043c23cc0e200912183c33c2207c03deab341b91f010071f8c741b", - "9801f803dBBBBL4;FFf70300aa1f0400b141fdff54e043059181008052d7e20194a0e10035e85341b9e8cb00b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aaL4;FB70656e64696e675f7072655f6b657972656d6f74655f726567697374726174696f6e5f69646c6f63616c5f726", - "567697374726174696f6e5f6964616c6963655fL8;FFe9cf03f9e9d703f9e8db03f904dcff97e22740b95f080071c3000054080080927f220039680200f974f5ffb5aeffff17e39340a9e0431e91a1035db8e8f9ff97BL8;FFf44f42a9f50b40f9fd7bc3a8c0035fd60001805201048052c9620194ffc300", - "d1fd7b01a9f31300f9fd430091e90301aaf30300aac10200f021e02f91e8030091L8;FF8c1140518d00f83761710c8beb0080521e0000149f014871830700544d1dc039ae1d00128c550e0b8c0148518d00f83761710c8b0b018052140000148d7d1c53BBBL4;FFf50319aaf90316aaf6031caafc031aaaf", - "a0740f9b80000b4e00309aae10318aa22008052aea20194bb0000b4e0031aaae1031baa22008052a9a20194dc0000b4L4;FF3f080071c001005441f4ff351f0c04eba80100541f0404ebc9f3ff54a00080d2f403002a0a0000141f0c04eb29f3ff54400080d2f403002a050000141f0804ebL8;FF810100f", - "021bc149182008052f2a20014080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091810100f021cc1491a40100d084401f91BL8;FFfd030091800200b000400e91820200b042600e9161018052bf220194fd7bbea9f44f01a9fd030091f40300aa098441f8f30308aa290d40f92", - "0013fd640010036BL4;FF0201805201ed7cd3b522009460e20191a2ffff9774564da9350200b49682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef822008052L3;ZBBBBBBBBBL4;FF2911c0da080d498b0801148a296be838e903f836e90333aa0a2100d1eb0328aa29551b9b0", - "cfc79d34a01148a2c6b283828030a8b9c0700d16b651b9b0c210039L4;FF97220039883e0039e80340f989d20078e9234039881200f9a81b40b989a20039a9b341b8889202b8280080529a9200b8955a01a9892e00b968620039f44f4ba9L8;FFa27f009161058052c51c0194ff4301d1fd7b01a9f85f02a", - "9f65703a9f44f04a9fd430091f60302aaf30301aaf50300aa2240009120008052e1031faaf40303aaBBL4;FF80a20191a14301d10809c05a2909c05adf9202f8e82712294809c05a6b09c05ae92b5c29e82f132922008052df1202f82809c05a4a09c05ae92f5d29e82b1429L4;FF280780d2010000d495f", - "5ff97fd7bc1a8c0035fd6fd7bbaa9fd030091f35301a9f303019154008052f55b02a9f50302aaf76303a9f70300aa580080d2161440f9L8;FF2114139142038052f39c0014a10100b021801291a2048052ef9c0014a10100b0217c1391a2028052eb9c0014082440a9e20301aae00308aae10309aae29c00", - "14BBBL4;FF1803008b060000141f0400b121220054d6dc01941f100031a121005439feffb505000014e043059181008052d1dc0194e0200035e85341b9e80b00b957ffdfc8L4;FB27766520736f6d65686f772076696f6c617465642063617573616c6974790000eb084900000000004d000000000000008", - "60100003b000000756e61626c652074L8;FF68220039690200f933d9ff97310f0014280c40f9e8fb00f9281840f9e1030aaae80317a948008052e87300f908008092e87700f9e8030eaad40e0014e8af43f9BL8;FF88e2079178008052b4008052000540ade8f3687915008092e8e30a79e057813de15b81", - "3de6010014e8074091f6af45f9e043259108810991f5074091b5820991L8;FFe10313aa75fdff97950a40f9550300b4610a40f9680240f9960640f91f0101eb800b0054680640f9490380522a040091e00315aa6a0a00f909692138e10313aaBBBBL4;FF0801198a08fd0a9b5c03088b880306d1080140f9", - "bf0208eb61010054882306d1e00316aae20315aa010140f9c2fc0194a000003588e305d108014039ff02086bL4;ZFL8;FFacffff17e1031faa881a00b9a9ffff17e1010054e1031faa9cffff17c80080d2e11700f90800f0f2080900d18cffff17e80b41b2e01700f989ffff17c80080d2BL8;FFe9af00a9", - "ea0300f9fb7c0194fd7b42a9ffc30091c0035fd62103009021303691e00308aa62028052fd7b42a9ffc30091e97c0114092000912103009021483591L8;FFf71740f9e80f40f9080117cbdf0208eb28420054e81340f9e10314aae20316aa0001178bb67c0094e802168be81700f97f0600b1609fff54e16", - "30091e00315aaBBBL4;FFa00200543f080071600100543f04007181faff54e80f40f91f0500b180040054e1630091a22301d178a6ff9720faffb4b5000014e81b40f91f0500b1c0010054L4;FB65000000050000005286490000000000540000000000000073000000050000005286490000000000540000", - "000000000079000000050000005286490000000000L8;FFf44f1ba9fd43069128f840f9f30301aaa20f00f95f0008eb6106005448008052f40300aae0030091ff2300a9e10303aae87f02a9ff2303a9e87f05a9ff2306a9BL8;FFba3c0194fd7bbfa9fd030091081840f9080100b4080140b20811c0da081", - "540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9L8;FF9000001468424e3975420e911f0900718d1b00541f110071c11b005468ca533977ca13917a620e911f110071ec2d00541f0900712d3200541f0d0071013d0054BBBBBL4;FF09692138e10313aac6f8ff97950a", - "40f9550300b4610a40f9680240f9960640f91f0101eb20340054680640f9490280522a040091e00315aa6a0a00f909692138L4;FFcf0c00942000805221c48052c10c0094a000009000002f91b40c0094ff8301d1fd7b02a9f85f03a9f65704a9f44f05a9fd830091f60302aaf50301aaf30300aaL8;FFc0", - "035fd61f090071e1050054080440f9200440a9a92300d12a0200904a710391a8831ff86202009042a02991e9ab01a9e3630091c70c0194fd7b45a9ff830191BL8;FFe80301aa2a4540b85f01007129119f9a5f050071e90300f9c1010054e9030091210300d0218029914403009084a02291e3230091e003", - "08aa82008052e90700f9L8;FF038d0094610100d021c01f91840100b084003291e0030091a363009162028052b30f00f9fb8c009468c20091610100d021202091840100b084803291a3630091BBBL4;FF4d00001400e4006fa0c302d1e10316aa02048052e30315aae40314aae00302ade00303ade517009", - "4a0877eada80300d008a53c91a203df3ca303dc3cf6030391L4;FB89214900000000004700000000000000110000000a000000d12149000000000048000000000000001d000000170000001a224900000000004f00000000000000L8;FFf4c341f99f0600b140020054e1cf41f93f0400b14001005481000", - "0b4e0d341f922008052aecc0094e1db41f9810000b4e0df41f922008052a9cc0094b40000b4BL8;FFa80319b889430df8aa0312b8a8c313b8828707adeb1300b9ebe303b9200300ad0a4d0194e9bf4639e84346390a088052a00302d1f80310912a15003308111d12L8;FF29010a8b290500913f010aebe9", - "050054280108ab8300005426000014e80308ab82040054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a250191BBBBL4;FFf50800b5f9031faa3700805233000014f9031faaf50200b41f0319eb2008005448028052e86a3938e123009128070091e00315aae80f00f9bad8ff97f70f40f9L", - "4;FB4261644b65794c656e677468496e76616c69644b657941677265656d656e745369676e617475726556616c69646174696f6e4661696c65640000000000000000L8;FF6a0a00f909692138b60900b4c80240b20811c0da081540d2080d088b08250191c81a488b08050091f40800b4890240b22911c0d", - "a291540d2290d098b29250191BL8;FFa00600541f0314eb390700915ac3019141fdff54f70219cbf46b45a9f82300f99f021aeba101005429000014e9e30191e0830091f63f00f9a82739a9b57f3aa9L8;FFa0100094e1d342f9e00318aad4fbff17f90300aae04316912200805299100094e00319aaf90b", - "40f9e1d342f9a0fcff17f90300aae04316912200805291100094BBBL4;FFf85f4ba9fa674aa9fc6f49a9fd7b48a9ff830391c0035fd6fa0300aab50200b4abac0194e00315aa2100805237008052a8ac019400f8ffb4e1031aaae20315aaL4;FFf603012ae10314aae20315aae6feff97e103162ad2ffff1", - "7fd7bbda9f50b00f9f44f02a9fd030091f30300aac2000037e00313aaf44f42a9f50b40f9fd7bc3a8L8;FF810a40f9ff0201ebc2290054e00600911f0001ebe2290054890640f9eae740f98b0700d13b6977787f010aebc1fdff54e023079137f6ff97e8eb40f9eaffff17BL8;FF68390c91a98358780c01", - "00f9e8031691e9df0679b255ff97f88345b91f07003160080054e8e20b9120c3c13ce98745b9e86f04a921c3c23c1f0b0071f59b45b9L8;FFe077823d210140ad190540f9e1df813de0e3813db90100b4140140f9ac2c0094e00319aa21008052aa2c0094209600b4e10314aae20319aafa0300aab02c009", - "4BBBBBBL4;FFe0830091e20308aa4e7e0094e82340b968000036f41740f96d000014e91b40f9ea0640f9480109eb03020054ea0240f9f41740f94901098be92200a91f0114ebL4;FFe89341f91f0d00b1801200541f0900b101110054e89741f9e0cfc03d1f0500b1e0e3803da0110054e0e3c03de947049", - "1e80701f920f18f3cb50000b4e0031caaL8;FF1fc90171c1030054a80a40391fb9017161030054a80e40391fe9007101030054a81240391fd50171a1020054a81640391fd5017141020054a81a40391fa50171BBL4;FF896a4039eaab4039e8a700394801094a896e4039eaaf4039e8ab0039c8010d4a490", - "1094a8a010b4a8c3e4039e9af0039897e40390b020f4aeab30039eabf4039L4;ZBL8;FF080500911f0109eba808005450000014f3031faa080c47f81f0500b1c1dcff54e8031faa080113abe3070054800100f000c03c91ad940094f3031faa088c48f8BBBL4;FF28040091490400d1110000145f2800f18", - "80000542800028b08f1df38a804f837e0830091473e0094e82340b9083d0037e81b40f98a0740f9490108eb034c0054L4;FB4900000000000000bf0000000900000098204900000000004900000000000000e7000000090000005369676e616c205051205261746368657420563120436861L8;FFe84300f", - "9e83f44f9e8ab06a9e84344f9e8af03a9e84744f9e9a302a9e84b44f9e94f44f9e87b00f9e85344f9e8d300f9e85744f9e9230ca9e85b44f9e95f44f9BL8;FF081540d2080d088b0825019108fd46d30900088b390500913f0308ebc9130054f87749f91f0700b1c013005480220291731c0094080040b20", - "811c0da081540d2L8;FFa81000b4e8833291606302910a7dfe97e85346f91f0500b100080054e02bc33de85b46f9e07f823de80305f949000014fa4340f9080f00b4e89b40f9e9c31691BBBBL4;FFf44f44a9f65743a9fd7b42a9ff430191c0035fd6e0031f2af44f44a9f65743a9fd7b42a9ff430191c00", - "35fd6ffc301d1fd7b03a9f85f04a9f65705a9f44f06a9L4;FB656d6f74655f726567697374726174696f6e5f69646c6f63616c5f726567697374726174696f6e5f6964616c6963655f626173655f6b657970656e64696e675fL8;FF3f08007161fdff54888246f81f0500b1a10000549fe606a99ffe07a99", - "9fe08a99f9a00b981a20191e20313aa5bf8ff97600400b5e1031faae3ffff17880240f9BL8;FF21a02891040300f084a01891a363009182018052a80f00f9fe74019468c200910103009021e01791040300f084201991a363009102018052a80f00f9f5740194L8;FF0d0000144b0080522c0100348c0140", - "b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c05009102000014ec031faa8b010b8b2801088b49010b8be1431691BBBL4;FFe08304adc4410094a80356f81f0500f1000d0054b68302d108088052f7030091c082c63cc182c73cc282c23ce00703adc082c33cc182c83ce20301adc282c13cL4;ZDL", - "8;FFe10314aa22008052f3030caab4b40094ab835ff8ec0313aa7701198bda0000b4e0030caae1031aaa22008052acb40094ab835ff8f40740f9d80000b4e00315aaBL8;FFe4c31791e2008052e9fb05b9e8fb02f940f5ff97f3f742f9e8ef42f97f0208eb61000054e0631791a76bff9708068052e9f342", - "f9e07fc13d6826089be183c13dL8;FFa1e20191a22302d124f4ff97a0faffb443010014e8db44f91f0500b14101005408018052ffdb04f9f8df04f9bf7e0aa9bffe0ba9f8eb04f9e8f704f9fffb04f9BBBBBL4;FF63482d91a0c300d18202805224028052e6f90094a0035df8c0ffff17a0c300d1a82b3da", - "9d8e10094ffc301d1fd7b05a9f33300f9fd430191a8ae8cd2294c8ed2L4;FFe00315aae10314aac2040094940900b4f70301aaf90300aaad040094e00314aa0101805215018052aa040094a0feffb4f30300aae00319aae10317aa1f080071L8;FFe00308aab6040194e00313aa012c40f9e10000b408304", - "0f9f30300aa22008052e00308aaae040194e00313aa088040f81f0500b1e0edff5400200091f44f42a9BL8;FFb7840194610e40f9a1fdffb4601240f922008052b2840194e9ffff17f44f41a9fd7bc2a8c0035fd6ff0301d1fd7b03a9fdc30091080040b9280200341f050071L8;FF00c03491620100f042", - "203591e1028052d4840094620100d042402c91e10319aab48400940001805201208052b9840094620100f042603491ae84009440008052BBBL4;FFe10316aae2031caa2300805224008052c7b7ff97b6035ff8a8035ef8080116cb9f0308eb09ecff54a08300d1e10316aae2031caa2300805224008052bc", - "b7ff97L4;FB47654900000000004e000000000000006402000013000000696e6465786b657950656e64696e675072654b65797072655f6b65795f69647369676e65645f7072L8;FFbfc40094fb00001428008052e86300f9fb0314aaf96f00f9192000b4f4030b2aabc40094e00319aa21008052a9c40094", - "c05600b4e16b40f9e20319aae04700f9BL8;FF41040054c1220191e20313aaf1fcff97600300b4e00000143f040071400200543f08007121030054e1230091e20313aae8fcff97400200b4e9000014c1620091L8;FFe97200f8ebf200f8ea7201f85e6bfe97e84346391f05007161050054e8a759a9e8030", - "2f9e8031091e90702f9a80318f82801009008b140f91f0900f103040054BBBBL4;FFf65743a9f85f42a9fd7bc5a8b6e40114080e80525304089b6004089ba8e279d3141115cbf50301aae10313aae20314aaade40194c8e279d36102148b021116cbL4;FB6f75742f7369676e616c2e70726f746f2e70715", - "f726174636865742e7273002163616e6e6f7420616476616e63652070617374206072656d61696e696e67603aL8;FF3f0d00f1c303005488720091890000b029610291e8a700a988620091890000d029513b91ea230091a00700d1e8a701a9680080522902009029ad1491e1a30091BL8;FF150000140100", - "8092280400d1290080521f0d00b1696200a9a8030054e00316aa22008052ae64019419000014080b0091a0031df805000014e90b41b2a9a33ca9L8;FF61f240f9810000b460f640f922008052b364009461fe40f9810000b4600241f922008052ae64009460220091f30b40f9fd7bc2a8a1feff17f30b40f", - "9fd7bc2a8BBBL4;FFe0230091220080522300805224008052c797ff97e10f40f9b7ffff17e0230091e10318aae20316aa2300805224008052bf97ff97f80f40f9e80740f9080118cbL4;FF130080d2a17e019bf60300aae12700f9000440f9090000140100138b020180d2e00315aa210440f92100028bb1", - "060094c00640f973420091016873f83f6400f1L8;FFf30300aa1f3c00f93f0400b140010054810000b4602a40f922008052b0a40094613240f9810000b4603640f922008052aba40094080080927f0a00f97f1600f9BL8;FFb502000a1f01096be0179f1ace240194883a4039693a4039b502000a1f01096", - "be0179f1ac8240194883e4039693e4039b502000a1f01096be0179f1ac2240194L8;FFc003005448035ff81f0117eb61ffff5440835ef8e10313aae20317aac6240094c0feff35f6031aaac18e5ff8810000b4400340f922008052a9240094a002c03dBBBBBBBL4;FFe80b40f98a0640f9490108eb830300", - "548a0240f9e00740f94801088b882600a9680240f9090540f91f0009eb49010054e80f41b2e80300f9e0030091990e0194L4;FF760c00b4f50b40f9f90316aa04000014390317cbb502178bb90b00b49f0319eb9733999a9f0319eb48ffff54e00315aae10318aae2031caabf180094a0feff35L8;FFf2f9", - "ff97e1030091e00313aad8f8ff97fd7b42a9f31b40f9ff030191c0035fd6ff8301d1fd7b01a9f91300f9f85f03a9f65704a9f44f05a9fd430091160440f9BBL4;FF1f0500f1a1030054e88241f8e082c03ca9c300d140030090007c1991a14300d1a8031ef8080200d008b13991a9233fa9c8220091a0039", - "d3cd89801946083c03cL4;ZFL8;FF4a01084a6b01084aaaf31638aa2357382901084aab031738ab335738a9131738a94357384a01084a6b01084aaa231738aa5357382901084aab331738ab635738BBBL4;FF1f2503a909048052187d01a91f2504a9172505a91a6100b9792e00f9cb130054480400b0f8e", - "3009108b140f91f0d00f1030d0054684a40f91f0500b160020054L4;FB722076312e73656e645f63742e726563762065706f636820c0243a204e6f4865616465725265636569766564202d3e204865616465725265636569766564001bL8;FFe9231fa9e8c743f9e9bf43f9e8cf00f9e8cf43f9e8c300f9e", - "8d343f9e8ab00f9e8d743f9e92312a9e8db43f9e9f343f9e8ab1aa9e8e743f9eaf743f9e8df00f9BL8;FF0a0340b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a05009102000014ea031faaf67b52b9df06007181010054eb7f52b9ec8352b96b0100346b0140b2L8;FF1f010071f3ab05f9280188", - "1ae99f40b91f01096b41050054e39348a9e0c31291e2db42f9e5f35639e1032d912600805205eeff97e85b42f91f0900b180710054BBBBL4;FFb7f80194e08741ad28008052e217c03d800600ad820a803d68620039f44f48a9f65747a9fd7b46a9ff430291c0035fd60001805201028052c1f8019400040", - "0d0L4;FB75696c642f6c69627369676e616c2d70726f746f636f6c2d613434636635613164633062366666632f6f75742f7369676e616c2e70726f746f2e73746f726167L8;FFa08739ade08b42ada08b3aade18340ada18338ad70f3ff97a08779ad880080d20800f0f2080500918082823ca2837aad818", - "2833c880200f98082853ca18378adBL8;FFa10d00343f1000712c0200543f080071ac0300543f040071e00600543f080071610a0054a80355f81f0500b161000054bf6735a9bf0316f8e1620091a22301d1L8;FF15008092e8436c79e057813de15b813de8e30a7920010014e8074091f6a745f900230091", - "08810991f407409194820991c8bbff97e1074091e0431691023f8052BBBL4;FF04018052050980529306009116f0ff97a8835af81f0500f120190054a8035bf8fa2f40b9e30314aafc1b40f9e44340f9f3a308a9f31745a9e81340f983ffff17L4;ZBL8;FF686200f9686e00f9603a803de093c03d687a00", - "f968fe10a97fa211a968fe13a97fa214a968fe16a97fa217a968fe19a97fa21aa9080680527fa21ba908048052BL8;FFe00313aaf60301aae10315aae20314aab4f8ff97750a40f9e10316aaeeffff17281040b96800c8376800d037cc380114fd380114fd38011409004039e80300aaL8;FF68621991696", - "21a91c32ac03d60061e3960621991e10318aa759e03f9000500ade00a41ad63de813d000901ad800740ade8435039200500ad820341ad68021e39BBBBBL4;FFe80f41b2e80700f9e0230091a5fe0094e90300aae90700f9210400b021a01f91230400b063e03691e023009102028052a40280526e0000149", - "30400510b000014L4;FFe10f40f9c802158be80b00f96002803d680a00f9210100b4e00314aa22008052f44f46a9f65745a9f85f44a9fd7b43a9ffc30191aa080014f44f46a9f65745a9L8;FFe1030091e92b01a9e4080194fd7b42a9ffc30091c0035fd6ffc300d1fd7b02a9fd830091080200f00871039", - "109200091e02300a9200440a96202009042700291BL8;FFf86340f93f0400b1ea7b40f9e98740f9ee1341b9e81741b9ed1b41b9ec1f41b9fa5b00f940030054fa0300aae0c30291ecbb0729ed3300b9eb2b02a9e90b00f9L8;FF42008052b6880094f7ffff17f42341a9c80000b40805088be00318aa0201", - "805201f17dd3ae8800947f0600b100130054e803049194221c9bf50314aaa88640f8BBBL4;FFfd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091440080528500805229f87fd33f1100f13481889ae30314aa0c000094e80740f91f0500f1L4;FB0000000000000000080000000000000", - "00800000000000000fc03460000000000000000000000000008000000000000000800000000000000c802460000000000L8;FFe10318aa22008052f40309aab4c80094e90314aaf84f40f9f7031f2a784200b408008092f90309aae95b00f9e86700f9120400141f0700b120030054b80100b4BL8;FF61ce", - "40f9810000b460d240f922008052b348019461da40f9810300b460de40f91800001461ce40f9810000b460d240f922008052aa48019461da40f9810000b4L8;FFba480094000100d000a00291b7480094000100d000201491b4480094fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e003005", - "4e00313aa40000094BBBBL4;FF1f0100394b1140b84e1d40394c5140784d0140390b2100b84b0940b90e2100394e7d40390c0d0079ac111d124db140b80b9100b80b0880520c0500394cf140f8L4;FB4f9d48000000000075000000000000006400000026000000e41f40000000000010000000000000000", - "800000000000000dc81400000000000e41f400000000000L8;FFa2020036340400b4f50303aab0e80094e00314aa21008052aee80094a00b00b4e10315aae20314aaf48300a9b4e80094f40f00f91800001448008092680200f9BL8;FFf30300aa1f6800b93f0400f18b000054601240f922008052b16801", - "94611a40f914008092740e00f93f0400f18b000054601e40f922008052a9680194612640f9L8;FF808702ade2680094e8430691a08303d1c1e2009102830091df9bfe97e89341b91f050071610600542007c03de9b341b92143c23ce8c741b9f81f40b94003803dBBBL4;FFbb0700b4b2a80194e0031baa2", - "1008052b0a80194e01e00b4e12f40f9e2031baaf70300aab6a80194df0600b1a0060054e0534da9df0214ebc9060054e10316aaL4;FF00400091130040f9d30000b47f9600f188ffff54010440f9817833f8f9ffff17210000d0e0b340f9e27340f9220401f9600000b4210000d0200001f9a0420691L8;F", - "Fe283c33ce083c73ce157803df53f4439e183c23ce18b06ade283c63c020115cb140302ebe28308ad22010054e8430391e10317aae20318aa0001158bb0a80094BL8;FFe182c83ce28304ade082c93ce282c23ce18305ade082c33ce182c43ce28302ade082c53ce282c03ce18303ade082c13ce28301add", - "3280194c81a00121f810071L8;FF5f0b00b101110054e8e342f9e29340f9e07b40f9e16b40f91b5501b9e8a74fa9299940b9e9b305b9081540f900013fd6e0e302f9e8074091e1e702f908011891BBBBBBL4;FFc02900b5f7031faabbffff1721830191e20313aa8cfbff97e02700b5f7031faab5ffff17e", - "20313aae303162a62f7ff97f70300aa00f6ffb4be000014e00313aaL4;FFe8c2ff97e01f01b9a04700d1e5c2ff97e01301b9a04700d1e2c2ff97e00b01b9a04700d1dfc2ff97e00301b9a04700d1dcc2ff97e0fb00b9a04700d1d9c2ff97L8;FFfd7b44a9ff830191c0035fd6ff8301d1fd7b04a9f44f05a", - "9fd030191f30300aa3f9400f16c0500543f8000f1400900543f9000f1e10b0054692240393fb50071BBL4;FFe08742ade23a833de213c03de01e833de122833de08743ade21a833de026833de12a833db4daff9700e4006fe00301ade00302ade00bc03de10fc03de213c03dL4;ZDL8;FF4a050091090100", - "b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab620500542a0140b24a11c0da4a1540d24a0d0a8b4a250191BBBL4;FF7c0f00f9084d169b000540ad0209c03da203993ca0873bad008541ad038942ada80357f81f0500b1a0039a3ce38a02ade112803d80fdff54a04302", - "d142baff97L4;FB4840d225e3cbaf0f606ee5e7b92e90c1371ae52b637c2f061db1cc44c6f59026827c5878b5c585f3f833d62975437d51d893762144d4a28c04fcfbac0000354cL8;FF099940f9e92300f9099d40f9e9ab06a90a2554a9e92b03a90a2555a9ea7b00f9e96300f90a2556a9ead300f9e967", - "00f90a2557a9e95700f9092158a9e85f00f9BL8;FF4efeff17e0431691e1031aaae20318aab4100094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aaab100094fad342f9fc074091L8;FF28008052090100f029013091aa8302d1a04700d1a8273ba9080100f0080d1f91a", - "82b3da90a078052c8048052bf2738a9090100f029ed0c91a92b3aa9290080d2BBBBL4;FF0804805296f201a995a205a980a206a9a8c35fb899ea02a997ae03a9887a00b9810000b4004340f922008052acf001946002c03d680a40f98002803d880a00f9L4;FB697479206b65796d697373696e672073656", - "e64657220636861696e206b6579696e76616c69642073656e64657220636861696e206b6579696e76616c69642072L8;FF40010036410b00b5e0031faad4ffff17e003082ae20313aa430c805216eaff97e0f9ffb4c4ffff17a80640f91a0101ebe200005489000014e20313aa230c8052BL8;FF05710194", - "fd7b41a9f31340f9ffc30091c0035fd6080040b948000034ea020014ff8300d1fd7b01a9fd430091200440a9e80200f008a12991e90200b029010391L8;FF8002039134240094080040b20811c0da081540d2080d088b0825019108fd46d30900088b390500913f0308eb49100054f87749f91f0700b1a01", - "5005480220291BBBL4;FF0800809236008052686e00a933008052e00748a9e91b40f9eba343a9fc2b40f9ceffff17a06303d19c99ff973f0700b1e0030054e03740f9e11740f9a86303d1L4;ZBL8;FFe10316aac3b00094e8830f91e16301910232805200e10091b9b00094a00640ad09008092a20ac03da", - "81a40f9e1830f91698600f8e00313aa02398052c08602adBL8;FFe133c13de237c13de9f342f96826089b0dfcff17e8c31291fb8302910081c03ce86742f9a003983ca80319f8e80200f008b140f91f0d00f143070054e8833291L8;FFea431a91e95f05f9a04700d1e1032a91e94705f9e9000090294d23", - "91e85b05f9e800009008612991e95305f9290080d2e86b05f9c80480524941c0f2ea6f05f9BBBBBL4;FFc4000294ffc301d1fd7b01a9fc6f02a9fa6703a9f85f04a9f65705a9f44f06a9fd43009109504039a9130037166440a9f30300aa1c1040b9f40308aa350b40f9L4;FFb5000094d82a00f9f92e00f", - "9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6ff0301d1fd7b02a9f44f03a9fd830091010840a908018052f30300aaL8;FF13000014d7fe45d3e80214ab420d0054e90200ab620d0054aa0217cba8831cf8a8c300d1a02301d1a9ab3ba95fe9ff97a8035ef8b7031ff8140117eba3080054BL", - "8;FFff830091c0035fd6fd800194fd7b41a9ff830091c0035fd6000040f965720014000040f9f7800114000040f9f6800114080040f9e20301aa00a140a9e10308aaL8;FF6b0d0091cc0500348c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c05009127000014280080523f0700b1ff1700f", - "9ffa301a9a00c0054e0630091BBBL4;FFef980094f40301aae100f8b6f6031faae00316aae10314aabec001941400809213000014340200b4f70300aaa8c00194e00314aa2100805236008052a5c00194L4;FB732e696f2d313934396366386336623562353537662f62797465732d312e31322e312f7372", - "632f62797465732e7273002f72757374632f343861323239636561L8;FF023c8052f5830291bdc00094882640f9800ac03da1420191891a40f98182c33ca80317f8880e40f98083873c8082c03cf47740f9a9831ef8a8031df8e8431091BL8;FFe00314aa490180526a0a00f90969213841070094e10313a", - "a5dfaff97803e40f9800100b4610a40f9680240f91f0101eb200d0054680640f9090180522a040091L8;FFb50600f1d6a20191c0020054c1025df8810000b4c0825df822008052b0400094c1825ef8810000b4c0025ff822008052ab400094c10240f9810000b4c00640f9BBBBL4;FFe2031f2ae0023fd61", - "f0000f1cd000054390300ebe3a100541803008bf9feffb50f0000141f0400b141a10054cfe001941f100031c1a00054f9ffff17cce00194L4;FB6bbd41fbabd9831f79217e1319cde05b76656e646f722f6c69627369676e616c2f727573742f636f72652f7372632f63757276652e7273001e4543507562", - "6c69L8;FFe103142a08e140391f050071e1030054e2031f2a5a3a009409fc78d3280200b008a13a910afc60d3097969784921094a2a5d105308596a780001094a14000014BL8;FFfd7bbea9f44f01a9fd030091f303012af40300aaae6001940004805201018052ac600194200100b4140000f9e10200f02", - "1600391131800b91f700039f44f41a9L8;FFd6000014e01c00b5e00313aab7fdff97e80301aa40010036481d00b5e1031faa61f9ffb4f1000014e20313aa430c80529cf5ff97e10300aafaffff17e1031faaBBBL4;FFd4a001940005003788664039896a4039410300f021203e918a6e40398b3a407908bd", - "70d3e083c03c420300f042801891e0230091a34300d1082109aa6905c05aL4;FFfd7bc5a8c0035fd601d05f38840a1b53f5ffff17040c40f2a102005403c05f3801d05f3802e05f782110001203010034620000349f000039007d20d402805fb8L8;FFe80300912202805201a1009468c20091810100f021", - "381991a40100d084600a91e0030091a363009162008052a80f00f9f8a00094810100f021441991a40100d0BL8;FFbf200194e80315aa958200910801168b00008092e10315aae80f00f91c2101941f0400f161010054bffedfc8810240f9810000b4800640f922008052a8200194BL4;FFc20000b0426038", - "91e1230091e8a701a9c1200094c00000b000c02191b6200094c00000b000a03791b3200094c00000b000003891ad200094c00000b000c03191L3;ZB" + "BBBBBBBBBL8;FB0000000000000000000000000000000051e574640600000000000000000000000000000000000000000000000000000000000000000000000000000000000000L8;FFe2000054a8018052690a00f90903805268220039280080526b000014081c40f9f40300aa080101eb230700549b0e4", + "0f91f011bebc2060054e80328aa3f0101ebBL8;FF4810005409fffff0294100918a0000102b6968384a090b8b40011fd661ce40f9810000b460d240f9220080522225019461da40f9810000b460de40f922008052L8;FF8c1900126ce10c8b81fd0daa3f000beb030500544b018052e0031faa4a010b8b29", + "010bcb0a2500a9fd7b43a9ff030191c0035fd6e80741b2e0030091e80300f9BBL8;FF3f0500b140020054f40300aa161041b9171441b9152041b9008040f9e8c30091818640f9875f0094e8c340396801003688ffffd008611c91e904805268a600a9L8;FFc80080d20800f0f20809009100ffff17c80080", + "d2e10b00f90800f0f2080900d10f000014c80080d2a1831df80800f0f2080900d11a000014e80b41b2e00b00f9BL8;FF08fc60d3080d00b5080840921f1900f1420d0054017c0353610d00343f040071000200543f08007181030054890245f83f0500b1810000549f6605a99f7e06a9L8;FD10004700000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BBBL8;FB72654b657953656e6465724b6579506c61696e746578740042024000000000006a00000000000000ec0000002e00000042024000000000006a0", + "0000000000000L8;FFe11740f9e80f40f91f0101eba09b0054e81340f9090280522a040091e00318aaea1700f909692138e16300919c92ff97b7010034e11740f9e80f40f91f0101ebBL8;FFe0079f1afc4f58a9fd7b57a9ff430691c0035fd6e0031f2afc4f58a9fd7b57a9ff430691c0035fd620008052", + "fc4f58a9fd7b57a9ff430691c0035fd6ff8300d1L8;FF340100b42f050094e00314aae10315aa28050094a00000b528008052750600f904000014e00315aae8031faa600600f90a028052e90314aa696a2af8680200f9BBL8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2905", + "0091280108ab421e0054692240f9090100b42a0140b24a11c0da4a1540d24a0d0a8bL8;FF0a088052f4031faaf5ff03a92911c0da490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f60300aaL16;FFe89b42f9e8d300f9e89f42f9e9230ca9e", + "8ab42f9e9a342f9e86f00f9e8af42f9e85f00f9e8b342f9e8e300f9e8b742f9eaa30aa9e8bf42f9e83f00f9e8c342f9BBBBL8;FBb09d420000000000d49b420000000000509e42000000000060a142000000000058a0420000000000b09d420000000000c09c42000000000044a2420000000000L8;FFab5", + "35638a93316384901084aaa635638a94316386901084aab735638a95316384901084aaa835638a96316386901084aab935638a97316384901084aaaa35638BL8;FFfd7bc1a8c0035fd6e0fefff000802f91da100194e0fefff000202d91d7100194e0fefff000e00e91d4100194fd7bbda9f65701a9f44f0", + "2a9fd030091140840f9L8;FFe06700b9a04700d191c2ff97e06300b9a04700d18ec2ff97e05f00b9a04700d18bc2ff97e04f00b9a04700d188c2ff97e04b00b9a04700d185c2ff97e04700b9BBL8;FFe20315aa23008052240080529ae0ff97b6035cf8b4035bf8880216cbbf0208eb49dcff54a04301d1e", + "10316aae20315aa23008052240080528fe0ff97b6035cf8L8;FF610202ad820342ad620203ad810340ad610201adff032e91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6404fc03da80359f84003803dL16;FFe0eb813d89300094e0431e91a12302d1e20316aae303152af9431e", + "91b62e0094e8cb43f9f5cf43f9fa031c2af6d343f9f8d743f91f0500f10114005408008092BBBL8;FF2200805223008052240080529a000094610a40f97cffff17e00313aae10317aae20315aa230080522400805292000094770a40f9680240f9080117cbbf0208ebL8;FFf9031faafbab49f9fa0740915", + "a8309917f0700b18017005440c30391df240094080040b20811c0da081540d2080d088b0825019109fd46d30800098b08050091BL8;FF9f0600b1e002005473d645a9950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f92200805220f50094f8ffff17340100b4L8;", + "FF734e00a9537820f8f4ffff17a4ddffb54affff17c01a00b4050c40f280000054000080d21f000039007d20d4fd7bbda9fd030091f35301a9f51300f903c05f38BBL8;FFc0035fd6e067c13de8d342f933ffff174b0080522c0100348c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c05009", + "102000014ec031faa8b010b8bL8;FF60aa49a9768202b9689602b9e10b48a92001803d481540f900013fd6606601f9616a01f945f3ff172013c03de85342b92123c03d205b803de87303b90143813cL16;FFe1031caac4b0009420008052e1031aaac1b0009420008052e1031baabeb0009420008052e103", + "14aabbb0009420008052e10319aab8b0009420008052e10316aaBBBBBL8;FB72656d6f7465206964656e74697479206b65790000000000a1104000000000004d000000000000005f0300001c00000073657373696f6e5f76657273696f6e72L8;FF2d9d00947affff17950640f9480080520900809208200", + "039090000f9780100b515000014ea0740f94800805209008092e083009148210039490100f91aa4ff97BL8;FFe00314aa080c43f81f0500b160000054e10313aa0bfeff97950a40f9550300b4610a40f9680240f9960640f91f0101eb20080054680640f9490380522a040091L8;FFe82b00f938ffff17e0", + "0301914201805223008052240080521df9ff97e12b40f9e82340f9e81300f950ffff17e0a30091e10316aae2031caa2300805224008052BBL8;FFe20000b4683340f960030191e10319aa0801028b683300f9c2580194e00301912103138be2031aaafaff0139295d0194e8ff4139290080521a0317cba90", + "31638L8;FF000d803de03bc33d0011803de03fc33d0015803de98346f9093100f969060091e02bc33d0001803de02fc33d0005803de033c33d0009803de9cf05f9a88357f8L16;FF0b010094610a40f9b6ffff17e00313aae10317aae20315aa230080522400805203010094770a40f9680240f9080117cb", + "bf0208eb09f7ff54e00313aae10317aaBBBL8;FF08fc60d3280700b5080840921f1900f162070054017c0353810700341f1100f1c0070054e003082ae20313aae303142aaaffff9720fbffb427000014e00313aaL8;FF407801b4e807409102788052f90300aa08810991fb1300f9010140b22d7d0094287", + "d00942005805221008052217d0094007901b4e9fdffb029b51a91280f8052BL8;FFe1000037e00314aae30313aaf44f42a9f65741a9fd7bc3a830feff1735f87f92480015cb160113ab62010054e00315aae10302aae20313aacbfd0094965600a9L8;FFf40300aa4301f8b7f30303aa810100b4e00302aa", + "e10313aa250e0094600100b4e8031faa800600f90a000014f3031faa280080520901805207000014e00313aaBBL8;FFa99355384a01084a6b01084aaa731538aaa355382901084aab831538abb35538a9931538a9c355384a01084a6b01084aaaa31538aad355382901084aabb31538L8;FFea0316aa18fd", + "60d3e86300f9f6fe60d355ff48d3ae000014fb4740f9f86340f9ea0317aa57000014e8874ab9eb032a91ec832491691140b8ea5f45f9fa4b40f9L16;FF1f8125f1e9c741f9e83300f9812700545f0700b120290054f4d741f9e8e341f9fce741f9e95b00f9e87700f9e0f30da9f46700f974a400b422bd00", + "94e00314aaBBBBL8;FBbdd27e5b35f1d99e1a8ab274f443629e0b8a2052e37c1b547025166ebfbac4a81af8d33a8fedd8868d89f5fd19435e27785ced96d7a7d1a0a28cb5814e32a716L8;FFb5120191090900f9f65301f9d6060091df8e00f1c00200542a8d00948008805241008052238d0094a04800b4", + "a00641adca0600d1e94b41f9a84240b9000401adBL8;FFe6080194f3f742f9e8ef42f9e0dfc13de1e3c13de2e7c13d7f0208ebe02b833de12f833de233833d6190ff54e063179155abff9780fcff1721010054810000b4L8;FFe0230091e10316aae20314aa23008052240080521ee9ff97f60f40f9e8fff", + "f17ff4301d1fd7b02a9f51b00f9f44f04a9fd830091f403012a3f240071f30300aaBBL8;FF9f0208eb61000054e00313aaca47019408038052690640f9e013c03d8826089be92b40f91c000014e8430091e92300918a0200d04a61159108017db240ffffd0L8;FF4b0140b26b11c0da6b1540d26b0d0b8b6", + "b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aabL16;FFe80342f9ea0b42f9f2b342f9f6b742f9edbb42f9e9231fa9e80f42f9e90742f9eebf42f9f0c742f9e2cf42f9e8cf00f9e81742f9e0f3803de8c300f9e81b42f9BBBL8;FFc87", + "e105369b201b8a9035c3868ba0239a8835bf869de023968f20af8e82747a96a5a00b979f201f8692200a9e82740f9e94740f9787202f8680a00f9e8434239L8;FFc56800942f6d0094e002805221008052286d0094c01c00b4c8fdffb008e118911a0380d20001c03d08f140f8e90280521a00f0f2e98316", + "a90000803d08f000f8BL8;FFf50300aaf4cb00f9e0870aade28344ade2830bade18341ade18308ade28342ade28309ade18340ade18307ad800d00b5e08743ade00314aaa0873bade08b44adL8;FF2000040b60fc0288a2ffff35e00701323f00006b00ffff54e00303aa480c80d2211080d2220080d2010", + "000d41f9800b121feff54e00303aae10302aa010000d4BBL8;FFe00316aacafdff17e04316912200805236110094e1d342f9dbfdff17e0431691e1031aaae20318aa30110094fad342f9e8cb42f908011acb1f0308ebc9000054L8;FFe2031baaf70315aaf50314aaf40316aa15ebff97b9db7da90bfcff1", + "7f6e742f9fb074bf9f90b4bf9fc0f4bf9f8134bf9f5174bf9c80240f9f7e342f9680000b4L16;FF220341ada2033badc12d0054b82d00b4a8e300d1e1831391a20303d1e00318aaf8eb00a9b40303d1fb1300f9cba8009424ad009400048052210080521dad0094BBBBBBL8;FB7920776974682074797065", + "203cc0013e002163616e6e6f7420616476616e63652070617374206072656d61696e696e67603a20c004203c3d20c0002f63617267L8;FF4c02014a2802084a29010d4a4a010f4a8c01024a6334000a0801094a4901104a8a010b4aabc35eb80801094a4901034a6b39000a0801094a08010b4a89021b8bB", + "L8;FFfd7b4aa9ffc30391c0035fd6f623009137008052180d8052680240f9080540f91f0115ebe91a0054e00313aa49feff97e80300aae00301aac8fd073708fc60d3L8;FF090140f9086140f8090000f9086000f8b70000b4e00315aae10317aa2200805225210094ca018052e9031f2ae80741b22bfdff", + "f06be12d91ec018052f50316aaBBL8;FF5f2800f1880000542800028b08f1df38a813f837e0e31591a6120094e87b45b908230037e8c742f96a0340f9490108eb632700548a0340f9f4c342f94801088bL8;FFf65742a9fd7bc4a8c0035fd6e00313aa2200805246000094610a40f98affff17f50300aae0", + "0313aa2200805240000094610a40f9e00315aa92ffff17e00313aaL16;FFe10300aae00301aaf44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd637008052a80640f91f0116ebc9070054e00313aa09eeff9760fe073728fc60d3BBBL8;FB080000000000000058144600000000009cf545000000", + "00001800000000000000080000000000000038164600000000009cf54500000000001000000000000000L8;FFe263009140008052e10315aa31a2ff97affcff17e8031faa000116ab224f0054e16300919e8eff97bf0600b1400e0054e11740f9e80f40f91f0101eb20280054BL8;FFff0202eb430e0054e", + "00316aa31010194880240f9760200f926000014760a40f9c90202ebc315005495fe45d32a0115abc2150054bf0202ebe30100545f0101ebL8;FFff074091ff830091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a825010014e0031faabbfcff97a0877ea9b9fcff97fd7bbaa9fc6f01a9fa67", + "02a9BBL8;FF2925019129fd46d3290500912801088b5f050071000300540a0c40f908011f8b5f0500b100040054091440f92a0140b24a11c0da4a1540d24a0d0a8b4a250191L8;FF69b642b968be02b9c903003660a24ca9693a40f961ba42b962be42b923a10291081540f900013fd6606601f9616a01f9", + "87ffff17776a41f900c3c73c01c3c83cL16;FFe9cb00f9e98b40f9fe8b00f9fe0308aae80302aae20301aae1030aaaea0308aa08018052e9b700f9e9af40f9e87300f9ef6741a9e9c700f9e9df40f9f6134ba9BBBBL8;FB8843d6594d605218f974a29ecfe184fbb0b822c03c330d1805b600000dea74489", + "3d76342c9befb1d89ce94573302d5ae1859337f110eb703d6ff434858191ed7L8;FF22030054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0daBL8;FFe81f40b9e9ef0db9e93b40b9e8e30db9480080", + "52e9f30db9e99f40b90801981af49706f91f01096be83f40b9f7cf06f9f7d706f9f5b70db9f3df06f9f8eb0db9L8;FFf85f43a9fd7b42a9ff830191c0035fd6ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc30191970840f9f30300aaf70300b4940440f9BBL8;FF08008012e1", + "231291f70304aaf50303aaf60302aae94b02f9f8c30c91e8a304b92de2ff97e86a40b9e90300910a0000f04a813f91e94702f9890200f029b11491L8;FFa9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff5480fdffd000203791d54c009480fdffd000603e91d24c009480fdffd000202", + "091cf4c0094L16;FFe92f1fa9352c4ba9e89300f9292044a9e8cf00f93e2045a9eaa317a9284446a92a684aa9e8ab00f9281847a9eaaf18a92a2c4ca9e8a71aa9286c48a9eaeb00f9BBBL8;FF01600091e003022ae20303aa72f5ff97602900b4a1ffff9021203f91a3ffffb063fc0691e00700f95f00001", + "4e10300aae003022ae20303aa67f5ff97002800b4L8;FF83f2ff97e87740f91f0500b1e00c0054e82300f9e9234fa9e082c33c00630291e82703a9f62351a9e95750a9a0839d3ca8031df8e8a30391e92700f9790cff97BL8;FFcbf7ff363f1d00f140f8ff544b1dc0394c2100912e2100d10c3900a96d19", + "001221c40daaabf6ff363f2100f120f7ff544b21c0394c2500912e2500d10c3900a9L8;FF63600d910004412ae2fcff9042e00b910008402a0010402a0020402a05040011a000200a007c041b007c1b53734860387306005173761e5363060011600a0011BBL8;FF28040091f68b49f9e8d302f9df0a00b1", + "410f0054f9031faa84000014e1d342f9e8cb42f91f0101eba0730054e8cf42f949078052f80740911883099109692138L8;FF1f0500f121010054881f00121f0500718c030054c80900359b1f4092fa0f41b2e8031baa540000147f8702f1627e00547b0300b4f70315aaf50314aaf40316aaL16;FF1f200", + "039e00313aa280100f9f44f4aa9f65749a9fd7b48a9ffc3029180bcff17ff8301d1fd7b03a9f52300f9f44f05a9fdc30091f40301aaf30300aa21b10094BBBBBL8;FB652061626c6520746f20656e636f6465206865616465722073697a6500000000801740000000000056000000000000003f000000270", + "000006d697373696e6720L8;FFf85f03a9f65704a9f44f05a9fd830091280440f9290c40f9340108ab020e00545f0800f180000054281440f9140114ab620d00549400f8b6e0031faae10314aaBL8;FF290b00b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091091440f94801088b", + "090100b42a0140b24a11c0da4a1540d24a0d0a8b4a250191L8;FFe19341f9810000b4e09741f92200805229190094e0431391e10313aa022880522c190094e8270491e1431391e00314aa00f1cf3ce80f41f9022b8052e087813dBBL8;FFe327803de223803de11f803de01b803de20f41ade10340ada28f", + "3bade40b42ada1833aad610200ada48b3cada2837bad620202ada1837cad610201ad7f6200b9L8;FFe9c316910a0000d04a710891e9a305f9e9c32791e85b04f9080000f008112791e9ab05f9a90000b029611591e8af05f9e8c32291a04700d1e9b705f9a9fdff90L16;FF220080522cd90094e10314aae", + "88b41f9c80000b4e08f41f9e10308aa2200805225d90094e10314aae16301f981feffb0210c129183feffb063541291e0030b91BBBL8;FFe10300a9e00301aae10309aa220080522300805224008052f4030aaa96040094e10340a9ea0314aa2ca040a9290040f99369283808050091280800f960f9ffb6L", + "8;FF1f0101eb60c10054eb074091e8cf42f92a0400916b8109914902805260c1009109692138ead302f91f2b0094e1431691ea110094e0df92b980010034e1d342f9BL8;FFc80100b5080840921f1900f102020054017c0353210200341f1100f160020054e003082ae20313aae303142ab5ffff97c0fdff", + "b4d2ffff17280180d2e00700f9L8;FFae0dc039df0501318cd58c9a7f1100f160020054ae11c039df0501318cd58c9a7f1500f1c0010054ae15c039df0501318cd58c9a7f1900f120010054ab19c039BBL8;FF30390194009080522100805229390194c09601b4e10317aa02908052f50300aa2c39019427", + "390194002c81522100805220390194609601b4e1074091022c8152L8;FFa4f4ff9700080036c1eeffb4d9010014401a00b5a02302d19ef4ff97c010003601eeffb4d5000014402200b5a02302d198f4ff974010003641edffb415010014L16;FF08a10291e98b42f9f7430d91e0d7803d010146ad032dc03", + "debfb42f9f6031aaaece342f9eddf42f9e0c30391e10319ad028543ad0019c03de1030e9102298052BBBBL8;FB674572726f724368756e6b446174614465636f64696e674572726f720000000042024000000000006a00000000000000dc0000002e0000004202400000000000L8;FF0811008b150540f9f", + "50a00b41b0140f9b7fa7fd32b890094e00317aa4100805224890094002900b4f80300aab5833ba9a0c300d1e1031baae20315aabf831cf8BL8;FFf4630191e9c7009180c20391e1e31b9120f18f3c8942039102278052f86f11a9f55f12a9e92b00f9e8a300f929090194ff0600b19542039141020054e80", + "31691L8;FF298dae72080140b91f01096b01480054810a41a9e0e306919b6a42a987f7ff97f9df40f93f0700b120470054f55b5ca9e0e30691fceb40f9e1031aaa22008052BBL8;FFf54f03a9937e089b2e490194e00313aa0101805227490194a0831df8201100b4080d8052b3835df8fc031faa887e089", + "bfb0314aaa8031ef81100001436008052L8;FF2083cc3c2183cd3ce81f00f9e81b40f92283c33ce0e3009160838c3c2083ce3cc1e2009161838d3c2183cf3cfc030b9160838e3c2083c83c61838f3c2183c93cL16;FF29a84ca9e9eb00f929a04da9e9a700f92ba44ea9e88f00f928a007910001c03deba3", + "00f92ba04fa9e0f3803dea2f13a9e8a701a939a450a92aa051a9eaa704a9BBBL8;FFe13340f9a10000b4e02340f92200805229690194f95f40b9f78216aa7afe68d3e13740f9a10000b4e02740f92200805221690194f95f40b9e15340f9f63b40f9L8;FF810000b4c0025ff8220080522a690094c10240f", + "9810000b4c00640f92200805225690094c10e40f9a1fdffb4c01240f92200805220690094e9ffff17681a40f9BL8;FFe10700f90800f0f2080900d107000014e80b41b2e00700f904000014c80080d20800f0f2080500d1e80300f9e003009187efff97e10300aae10300f9a1feffb0L8;ZDBBL8;FFe9b34", + "1b92143c23ce8c741b9a600001428ffff9008a1199169038052d0feff17eaa759a9e8430f912083c13c2183c23c2283c33c2383c43cfa9741b9e00600adL8;FFe862089bea060091ca0a00f9135500a9130900f90081813c091500f9f44f44a9f65743a9f85f42a9fa6741a9fd7bc5a8c0035fd6e00316aa", + "3d190094d80640f9L16;FFa81300d1e0030191a8a73da928feffb008c12c91e9038052a1a300d142008052760000b9e00300ade00301ada8a73ea9f20f0094f59744a900fefff000800f91BBBBBBBL8;FB494420c0002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d3139", + "34396366386336623562353537662f686b64662d302e31332eL8;FF690200f96092803c680e00f926aaff97b60000b4e00317aae10316aa2200805225a30094b40000b4e00315aae10314aa2200805220a30094e06301911aaaff97BL8;FF9f0208eba8040054340100b4680640f9e10315aae20314aa000", + "1178b2d230194e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00013fd6L8;FFf85f4ba9fd7b4aa9ff830391c0035fd6090345f80003c43c680200a9e81f40f9745603a9692a00f9e91340f96012803d695a01a9772202a9f44f4da9f6574ca9BBL8;FFa1c300d1e00316aa4903805", + "2aa031ef80969373815e9ff97b7035ef8ba035df8480317cbdf0208eb081b0054160100b4a8835df8e10b40f9e20316aa0001178bL8;FF4b020094610a40f9e00315aad2ffff17e00313aa2200805245020094610a40f9680240f9deffff17e00313aae10308aa220080523e02009469aa40a9dfffff17BL", + "8;FF21a03d91a3feff9063300d91e003009102028052440080521ce9ff97e00340f968ffff17c80080d20800f0f2080900915affff17c90080d2e823003948008052L8;ZDBBBL8;FB726f720000000000b87d45000000000018000000000000000800000000000000c8e9450000000000ace845000000000", + "0b8ea4500000000006120446973706c61L8;FF0825019108fd46d30900088b36050091df0208eb48180054d000001480220291f5ebff97080040b20811c0da081540d2080d088b0825019108fd46d30900088bBL8;FF7f8000f1010600540a0c40f90b804039e9031f2a6c0240b94d7c40390080c03c0a0d", + "00f96a3240b84e7041f80b8100394b0040390c1100b84c1c40390a0500b9L8;ZFBBL8;FF60001fd608200091200440a9e92300910a0000b04a010491e8a700a942ffffb0423c1091ea0f00f9e3430091bf3e0194fd7b43a9ff030191c0035fd608200091L8;FFe10300aafaffff17e1031faae86b00b9f7f", + "fff17680240f9080540f9190101ebe2000054aa000014e20313aa430c805207f9ff97e10300aaa10a00b5680240f9L16;FFfe1b43a9e4a74ba9fadb4aa9e36742a9ef3b47a9b7faff171f0900f1fb5340f9e0bb40f9ebe340f9e93f40f9e88340f9e31340f9ec3340f9f74b40f9ec3300f9BBBBL8;FBed00", + "00000900000080174000000000005600000000000000a6000000090000005369676e616c5f5051434b415f56315f4d4c4b454d3736383a53434b41204b65L8;FF290d098b2925019129fd46d30801098b130500917f0209eb890f0054088c5df81f0500b1c00c0054da020094080040b20811c0da081540d", + "2080d088b08250191BL8;FF89040054280108ab830000541b000014e80308ab22030054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abL8;FFe9f700f9a80000b4e09740f9e1ab40f92200805228130094e8bb40f9880000b4e08756a9220080522313", + "0094787f60d3e8cf40f9880000b4e18359a922008052BBL8;FFea2f4079e90300b9a91b40b9ea0b0079ea234079691200b8a9b341b86012833ce00741ad690600b9e90340b96a120079ea0f40f969a200b8e90b40796182823cL8;FF0081cd3ce8d344f97effff17f63f42f92083c13ceae32291e9d742f9", + "f5c742f9f7cb42f9c80240f9f43b42f940818f3ce9e304f9680000b4e00314aa00013fd6L16;FF03015da9eb9700f9e9d700f90ba547a9e04b00f9e3eb0fa9eba709a90ba548a9ebdf00f9e98700f90ba549a9ea2f15a9e9c700f90ba54aa9e9b700f90aa54ba9BBBL8;FF34730194e802158b680a00f988", + "9640f91f0500b1a0090054610a40f9680240f91f0101eba01f0054680640f9964241b92a040091959e40f9490e80526a0a00f9L8;FF00c01391c2fdfff04260149121048052cc6e0094e2074091c5fdfff0a5c0149142800991e0031f2ae3031faa340a0094e0431691220080523d120094e1d342f9BL8;F", + "F42e03e91e1230091e8a701a9ceee0094c0feff9000200f91dbee0094c0feffd000203d91d8ee0094c0feffd000803d91d2ee0094c0feff9000403491d2ee0094L8;FFe20304aaa120403900100012000400111f00036b00d0831a0004005101100033a1200039d3ffff17bf3b03d5411c40b92400030aa6", + "fc5f883f00066b61ffff54BBL8;FFf37749f97f0600b1e0020054e18f49f93f0400b140010054810000b4e09349f92200805224330194e19b49f9810000b4e09f49f9220080521f330194b30000b4L8;FF1f110071c00100541f0d007101f9ff54f4d341f9f3cf41f9880240f9680000b4e00313aa00013f", + "d6810640f901f8ffb4820a40f9e00313aabcffff17e8030091L16;FF4383863cfb4702f94383c63ce18301ad4083c93c4183c83ce20b803d4283c73ce18303ade38b02ad89ffff1735008052e00745ad89620791e233c03d88ea40f9BBBBBL8;FB4e00000000000000580700000500000061737365727469", + "6f6e206661696c65643a207071725f6b65792e69735f6e6f6e6528290000000000e80e400000000000L8;FFa80357f880030191a1c303d12200805208050091a80317f8c2960094e80313aabff3143802fd46d313e17a921a154092e20000b4a80357f880030191e10319aaBL8;FFa07f0091e92b07a9090", + "000b029610491f42708a9e9030091a18301d1e92f09a9e9c30091e9230aa9a8c301d1090000b029810491e82b0ba9e8430091e8270ca9L8;FF08411d91e0031baa0b1a0094f7ab4bf9ff0600b140240054e8af4bf9f9b34bf92c008092f7a319a92c0100142083c03c2183c13cbf0600b1e00711adc00500", + "54BBL8;FFbc8317f8bc035ab8be031838be435a78bc0316b8bc0359f8be431678be835938a8435678bc831af8be031b38e8930678087e1053e9b306f8e84b0239a8fd60d3L8;FFa00302d1ddf1ff97e00313aae05306f9e083329161fdfff021203f9102028052a3fdffb063842c9174000014c80080d2e0", + "a33239e08332910800f0f2ffa73239L16;FFe80313aa10260094ff830f91f44f42a9fc5741a9fd7bc3a8c0035fd620008052e10314aabcd60094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9BBBL8;FF152300a9f7fbffb5f62b40f9f51f40f996000037d8ffffd018e3069113000014d7fe", + "45d3e80214ab820e0054e90200aba20e0054aa0217cba8831cf8a8c300d1L8;FF1f0500b1000a0054e85b40b91f010071cd0b0054e8074091e0c3009108810991faa3ff97e83349f94083c03ce93f49f91f0500b1e067813de9d302f960200054BL8;FF4ac100110a68003929c100118d0d00127f7d02716", + "a0d0012096c003909819f1a5f25007129114b0b0b819f1a9f7d02716a010a0b0b819f1abf2500716b114c0bL8;FF7f0206720ccc74d36a018a9a6b6e1b531f1d00724a210daa8c016d924d008052720a1b1203ac6bd3615615534a490baa6b721c534a010caa6c761d534aed0baaBBL8;FF343b01949c070", + "0d1d6620091b56200d178673fa9788701f8dcfdffb50200001417018052935e00a9930a00f9f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L8;FF7bbe40f92f3b0094e0031aaa21008052283b009460d200b4e1031baae2031aaaf50300aa2b3b0094fb031caafc0314aa0200001435008052e9832491", + "e8032a91L16;FF01f17dd32cbb00949b01001497ff48d3e0031baa080c48f81f0500b161e3ff541bffff1728008052e86b00f9cd0300b4fc031aaafa030daa22bb0094e0031aaaBBBBL8;FB65000000000000007a134000000000005700000000000000a6020000200000006368756e6b2073686f756c642", + "062652073697a65203200007419400000000000L8;FFd3fa7fd32f8b0094e00313aa41008052288b009480c7ffb55e000014e0430a91e1030491023080522a8b0094e00313aa8692ff97f80740f928008052e1430a91BL8;FFe8c757392021c03c2121c13ce02b833de12f833dc82c0036e8830291e02bc3", + "3de12fc33d13210891e0a350a9600600ade17740f9e20313aa23008052081940f9L8;FFc4060094281040b96800c8376800d037f2060014e3060014e4060014ff0302d1fd7b02a9fb1b00f9fa6704a9f85f05a9f65706a9f44f07a9fd830091385040b9BBL8;FFe2b6c43de10301ade40b03ade213c03de0", + "1e833de11a833de08742ade22a833de02e833de01fc03de122833de026833de022c33de126c33d6042823ce02ac33dL8;FFde46009480fdffb000202091db4600940800403989fdffd029210991e00301aa08711d5308410051081d7d92226968f889fdffd029010a91286968f8e10308aaL16;FFa122009", + "10239805232cb0094e0031d91e1430f91032b0091e20314aa17270094f6a343f9e9a743f9eaab43f9e8af43f9df0a00b1e8fb00f9e1c50054e8fb40f9BBBL8;FFa24b0054080d80523360089b782240f9d80100b4097f089b681e40f9fb031faa08e1009122a101d1092940b93f01146b402a005442a001d", + "17b07009108a10191L8;FF681a40f9a80000b4601e40f901f57ed342008052286b0094682640f9a80000b4602a40f901f57ed342008052226b0094683240f9a80000b4603640f901f57ed3BL8;FF880080d20800f0f2a9035cf8081100918082883ca003db3c8182893c80828a3ca1837aad880200f98982", + "0bf88182843c8082853ca1837bad8182863c8082873cL8;FF3f010bebeeb79f1aad018e1a0d0300360d4099529f010a6b4d73a77288010d0b08318c1aec030bcb08010a4b8a218bda1f010d6b4901098be30000543f0500b1BBL8;FFe10315aae20314aaf60300aa312b0194080000147f0200f9f44f43a9", + "f70b40f9f65742a9fd7bc4a8c0035fd636008052765200a9771200b9f44f43a9f70b40f9L8;FF090900394a091b320a010039080000142c7c12532a440c330b090039090d00398b6d1c320a0500390b010039a802148be0031f2a680a00f9f44f42a9f65741a9L16;FFe90109aae20200546b1d0091eefef", + "f37140000146c0400f1c00600549f2900f14d018052eb031faae9031faaea031faa8c318d9a4d040091ae696a384a050091BBBBBBL8;FB7061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f696e6372656d656e74616cL8", + ";FFf35701f9ff5b01f9f56301f9ff6701f9ff7301f9ff7f01f9f98701f9ff8b01f9fa9301f9ff9701f9fb9f01f9ffa301f9e0ab01f9ffaf01f90a000014a8035df8BL8;FFe5fcff97f4fbff35f44f42a9f50b40f9fd7bc3a8c0035fd6e00313aa2200805232030094610a40f9daffff17e00313aa2200805", + "22d030094610a40f9eaffff17L8;FFe10316aae20315aabf0f0094fae341a9f9ef42a95f0b00b1e1020054db0300b4b80000b4e00319aae10318aa22008052211f0094a1835ef8810000b4e00315aaBBL8;FF5f0700b1a00b005448070091e0430191e143069102288052e82700f92d5f01949f0700b1e00", + "3005420630091e143019102288052275f0194e82b44b9fc7301f9L8;FFf6bf40f996fbffb53a008052e8e740f9e98742b9f55307a9f63700f91f0500b1e96700b9fa2f00f9e0100054e8830291e0c3179101a10491900c0094e082c23cL16;FFe00313aa22008052230080522400805207030094610a40f9", + "b9ffff17e00313aae10318aae20316aa2300805224008052ff020094780a40f9680240f9080118cbBBBL8;ZBL8;FF22008052230080522400805208a3ff97e11740f92efeff17e0630091e10317aae20315aa230080522400805200a3ff97f71740f9e80f40f9080117cbbf0208ebBL8;FF0811c0da28010", + "8cbe90080521f1d00f10831899a29008052360908aa1100001428ff0094000580520101805221ff0094800200b4c81242d3f60300aa185400a9L8;FFe20300aa010080d27f0001ebc0030054856861384568213821040091fbffff17c10000b4030300b4630400d181686338e1682338fcffff17e100038b", + "620400d1BBL8;FF1f0d00b1696e00a9a8000054e00319aae1031caa22008052273f0194e80600d11f0d00b148020054e03740f9e10317aa0d000014e12f40f908008092686e00a9L8;FF810000b4020b40f9e00315aa2a3f0094e84340f91f0900b1213c0054682a43f9e0430f9161e21391022b80521755", + "01b9683642f9754242f908e940b9684a06b9L16;FFe97740f93e0700147923442977db40a97c0f40f97ad343a9e8eb00b968e342a9ff0600b175ab44a9e87300f968a745a9c04900543fc3007180490054080b0091BBBBL8;FB37cd30e4feb38cbc834db69dd4bb12bdafed4fb2a28c977aa8ea00004997a", + "c90a79f0ae7cc47c16fff71cf51a3a927e2205bb2055deee43dd9cf5fe9d824027dL8;FFe2031b2a008540a9ccecff97f47f40f9163c0853f303002a35008052e87740f99f0208eb61000054e0a3039180890094e87b40f91669343896060091e87740f9BL8;FFa02302d153ecff97a033003728fc60d3a8", + "1000b5200840921f1800f162110054217c0353811100343f0800716c0100543f040071600300543f08007161020054L8;FFe20314aaf50300aa320f00940c0000143500805228008092755201a9685200a9f44f46a9f65745a9f85f44a9fd7b43a9ffc30191c0035fd635008052f4d701a9BBL8;FFf6575c", + "a9f85f5ba9fa675aa9fd7b58a9ff830791c0035fd660ffffb00080229163ffffb06320119164ffffb084e02991a20700d1c1048052bf4a019408358c52L8;FF69240054080c47f81f0500b1201d0054e2feff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebe", + "81b005414010014L16;FFe9fb00f901130154e8fb40f96b2201a908008092682a00a9770e0014e8ef41f9e94f00f9e9f341f9eafb41f9eb0b42f9ef6342f9e86b00f9e8f741f9ec5b42f9BBBL8;FF1b000014e00700f9a1ffffb021b40291a3ffff9063c03991e0230091a20180520401805212000014e00", + "700f9a1ffffb021b40291a3ffffb063e80291e0230091L8;FFa9fdff9029ed0a91e92b1ba9290080d2e14306918946c0f2e87f1aa9e8271da9de6a0094e80342f9e92350391f0100f1e8179f1a0101090a24000014e1031f2aBL8;FF21981391a3fefff063241191e083009122028052640080521cf5ff97", + "e11340f93dffff17ff8302d1fd7b05a9f93300f9f85f07a9f65708a9f44f09a9fd430191L8;FF010004cb21fc44d383d01f3881e01f78f35341a993ffff1763141a127f003f71a1f4ff54c4ffff17610000cb2100146b60010054e203014b3f1000717fc82238BBL8;FF490480522a040091e00318aa0969", + "2138e1431691ead302f9df0c0094fad342f9e8cb42f908011acb1f0308eb48420054e8cf42f9e10319aae20318aa00011a8bL8;FFe1074091e0833f9102c4805221001891302f0094e00bc73de10fc73da0873dad282f00940004805221008052212f0094604a00b4a0877dadfa0300aa000400adL16;FF0", + "0048152210080522aaf0094801300b4e10313aa02048152f60300aa1c0481522caf0094e8031faac902088b080900912a0540392b0140391f0120f12a010039BBBBBL8;FB6a00000000000000ca0000002e00000042024000000000006a00000000000000200100002e000000ef104000000000004e00000", + "000000000f904000019000000L8;FF080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0daBL8;FF1f0900b1010b0054f3031faa64000014e80300aa098d40f83f0500b180160054f30300aae003", + "08aaf7feff97e80300aae00313aa090140b22911c0da291540d2L8;FF93c4ff97e06300b9a04700d190c4ff97e05f00b9a04700d18dc4ff97fa03002aa04700d18ac4ff97f603002aa04700d187c4ff97f903002aa04700d184c4ff97BBL8;FF280080526822003928008092680200f9b50a00b558000014", + "e00743ade92f40f9682600a9608600ad53000014e90f40f9280080923f210039280100f94e000014L8;FFc2ecff97f3d352a9140200b47622009104000014940600f1d662009160010054c1825ff881ffffb4c00240f92200805221570094f8ffff17e057c13de15bc13dL16;FFffc30791c0035fd603244", + "0b97f04007108010054091840b949010037e90180520921003909008092090100f9c0035fd61f21003909008092090100f9c0035fd6BBBL8;FF220080522c770194e12b40f9810000b4e02f40f92200805227770194f70700f9a1ffffd021603f91a3fffff063480091e0230091a200805284018052137d0", + "094L8;FF810000b4e09f49f9220080522a770094e1a749f9810000b4e0ab49f92200805225770094b30000b4e07b49f9e10313aa2200805220770094e18349f9810000b4BL8;FFf30300aa3f0400f18b000054600640f92200805228f70094751a40f9bf0600b1e0010054748643a9e00314aac2020094d5", + "0000b4a8e279d3e00314aa02018052L8;FFc9fdff545f0060f142908b9ae20000b9eaffff17220000b0660500b4c50840f940000d91240000b081201d916300058b270080d2c81040f903a000a9c51840f9BBL8;FF60220154e0074091e10740910232805200c0359121802f912e370194e8074091e00740", + "910881099100c0359118e1079108e10791a8a70094e0074091e1074091L8;FF0228805233370094e0431f91e1431591022880522f3700944805805269fdffb029d51991e8b302f9c80080d20800f0f2fa8b04f908390091e9af02f9e8ab02f9L16;FFe1abc13d6a410a2aeb914db8e8ff5539e9d14878e2b", + "3c13de00717ad7b810aaae0afc13decf742f92841082aea114ff8e99148b8e193c13de00b18ade097c13dBBBBL8;FB490000000a000000bb124000000000003800000000000000520000000c000000bb1240000000000038000000000000005b00000009000000bb12400000000000L8;FF4a11c0da4a154", + "0d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b4BL8;FF3ca3ff97e8c342f9200bc03dfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1c082873ce9a304f9801500542083cb3c2183cc3ce9a70c912283cd3", + "ce8bb01f9L8;FF06000014228f7fa920008052e1031faa31020094c00c00375ac300f139c3009101fcff54f6e742a91a058052f71f40f9fb1340f9d582009104000014940600f1BBL8;FF2180059143fffff0630c0591a0c300d102038052640180521c4d0094b4035df8b3ffff17a0c300d1a82b3da99a4", + "50094ff0307d1fd7b16a9fc6f17a9fa6718a9L8;FFe1031baa3347009418000014e8ef41f9080f00b4e9f341f9e80302f9e8830591ea0310912b0000f06b811f911a0380d240fdffb000b82f9108210091e1430691L16;FFe06fc13de8cf00f9e81742f9e67f42f9e9af1aa9e92b42f9eb3f42f9e8c300f9", + "e81f42f9f28342f9f87700f9e28742f9ea8f42f9e89700f9e82742f9f49342f9BBBL8;FFa83b0079e91300f9e93340b9e8d30378e83343b8ec730378e8b300b8681d0012e90b00b9e91340f9e863003908208052e90b00f9e90b40b968020079e8b340b8L8;FF200100542a0440f91f1040f153692838080", + "50091280800f90202005400fc47d3c7000014e10300a9e00301aae10308aa220080523e060094e10340a92aa040a9BL8;FFe02300390900f0f2e8270039e90300f9e00300918eedff97f44f47a9f65746a9f85f45a9fa6744a9fd7b43a9ff030291c0035fd6370080521800809219018052L8;ZDBBL8;FF0", + "4000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f92200805225270194f8ffff17680e40f9480100b40805088be00314aa01f17dd302018052L8;FF3f0400f12bfdff5408028052806a68f82200805228270094e4ffff17fd7bbea9f30b00f9fd030091010440f9f30300aa810000b46002", + "40f9220080521e270094L16;FF29819f9a5f010beb6b9284d22b49b2f2aa0301d18b24c9f24b92e4f2400700543f030ceb0e0e805210d0009128338c9a0ce179d38c1108cb687f0e9b8fc101d1BBBBBBBBL8;FB65206b65793a20c00e20616e6420636f756e7465723a20c0022e20c0002f636172676f2d6", + "769742f737061727365706f73747175616e74756d72617463686574L8;FFf44f4ba9fb3b40f9f6574aa9f85f49a9fa6748a9fd7b46a9ff030391c0035fd6f90300aae00315aacef9ff97a80e40f9a90240f9e00319aad3ffff1720feff90BL8;FF090d8052e00314aa017d099b02018052f44f42a9f65741", + "a9fd7bc3a826240114f44f42a9f65741a9fd7bc3a8c0035fd6210400b4fd7bbea9f44f01a9fd030091L8;FF2300805224008052f4030aaa20000094e10340a9ea0314aa2ba040a9290040f900fc78d37369283808050091280800f980fbffb43f0108eb4a611932a0000054BBL8;FFe233803dd7020191a8", + "2735a9e18307adad06009400e4006fa0833aada0833bada003d53ca103d63ca203d73ca303d83ce33f803de23b803de137803de033803dL8;FFe8031faa94fcff35e003088be10313aaf2fcff9775fdff34610a40f9680240f91f0101eb60020054680640f9090180522a040091e003152a6a0a00f909692", + "138BL8;FF49050054e00313aa14f1ff9740fd073728fc60d3080500b5200840921f1800f122050054217c0353410500343f040071e00100543f08007161fdff54880248f8L8;ZDBBBL8;FB64656e74697479206b6579000000000073104000000000002d0000000000000008010000050000006c69627369", + "676e616c5f70726f746f636f6c3a3a73657373L8;FFe81700f9c02f0054802202914bf2ff97080040b20811c0da081540d2080d088b0825019108fd46d30900088b36050091df0208eb682e0054c8010014e11740f9BL8;FFa303de3ce3e7803de2e3803de1df803de0db803da82737a9480dc0da690dc0d", + "aa82738a9880dc0daa90dc0daa82739a9c80dc0dae90dc0daa8273aa9e8030c91L8;ZFBBL8;FFde3f0194fd7bbda9f65701a9f44f02a9fd030091f30308aa2e400094f40301aaa100f8b6f5031faae00315aae10314aab93f0194940200b4f60300aa21440194L8;FF61e10c8b2b0180520a0000144d2540", + "39bf0500f1c80100548c1900126ce10c8b81fd0daa3f000beb030500544b018052e0031faa4a010b8b29010bcb0a2500a9L16;FF686600a97c030014e8e300f9e87740f9a082c63cea3f00f9740080520aad40a9e90700f9e9c747f9a0039d3ce0dbc33dea6b00f9a9031ef80aa541a9e027833dBBBBL8;F", + "B5f0300001c000000dc1a4000000000005b000000000000008d00000011000000920e4000000000005500000000000000ce000000010000005631537461746569L8;FF40011fd6088c40f81f0900b1411d0054e8031faa73010014e80300aa098d40f83f0500b140250054f30300aae00308aad10c0094e8", + "0300aae00313aa090140b2BL8;FFec030aaa6b4100916e8541f8cf0140b2ce010d8bef11c0daef1540d2ef0d0f8bef250191ce194f8bdf010deb230300548c0500f1ed030eaa81feff54ca010aabL8;FF2d14009428008052ff0701f9e80b01f9ff0f01f9b70000b4e0db40f9e10317aa220080522414009", + "4e0431391e10313aa0228805227140094e8270491e01740f9BBL8;FF28040091490400d1110000145f2800f1880000542800028b08f1df38a805f837a0c300d1a3050094a8035db8280d0037a8035ef8aa0240f9490108eb83100054L8;FFe9a70a9121f18f3ce9e70a9108e10c9120f18f3c2083c63ce92", + "70b9122f18f3ce9670b9120f18f3cc082c73ce9a344f9fbbf01f9f5c301f9f7c701f90001803dL16;FFe0e7813de8d303f9cbcf009482feff9042e01791e00309aae10309aac7cf009480feff9000a01991d7cf0094fd7bbca9f85f01a9f65702a9f44f03a9fd030091BBBL8;FF680240f9080117cbbf020", + "8eb48330054680640f9e10316aae20315aa0001178b2c740194e802158b680a00f9952240f9550300b4610a40f9680240f9961e40f9L8;FFe10319aae20318aa00011a8b317400944803188bf90b40f9fa0740915a830991e8d302f9f88b49f9b80300b4e1d342f9e8cb42f9f98749f91f0101eb40430054", + "BL8;FF0b000014680640f9e10316aae20315aa0001178b2ff40094e802158b680a00f9186300f1396300914004005436d77fa9e00314aae10313aa99010094e00315aaL8;FF020180d2e00315aa210440f92100028b30f4ff97c00640f973420091016873f83f6400f1610000b481ffff54f4ffff1780020", + "e9121008052e22740f982c201f9BBL8;FF1f0101eba0c60054e8cf42f9090180522a04009109692138e1431691ead302f9dd110094e06349f9800100b4e1d342f9e8cb42f91f0101ebe0c50054e8cf42f9L8;FF090500394a051a320a010039e0ffff17ea0f80120b7c10530a2c0633eb0000350b7c0c530", + "a050039090900396a091b320a010039d6ffff170b7c1253ec0f8012L16;FF4083813ca2837bade81302f9e883029100a10191a103963ce91f02f9e01b813de217813de113813d96150094e20fc13de313c13df60741b2e41bc13de00bc13dBBBBBL8;FB6e7420636861696e9f1b400000000000340000000", + "00000006e0100000e0000009f1b40000000000034000000000000006f0100001d0000009f1b400000000000L8;FFf44f05a9fd030091f30306aaa600f8b6f4031faae00314aae10313aabe970094f30200b4f50300aaf60301aaf70302aaf80303aaf90308aafa0304aafb0305aaBL8;FF3a000094610a40", + "f9a1ffff17e00313aae10317aae20315aa34000094770a40f9680240f9080117cbbf0208eba9f4ff54e00313aae10317aae20315aa2b000094L8;FF21f03a91bcf2ff972e1c00948000805221008052271c0094404d01b488008052e06f02f921fdffd021e02d911a0000b960620491e3431391e2018052e", + "86b02f9BBL8;FFc082c33cc182c83ce20301adc282c13cc082c53ce123803df9ff4039c182c03ce10b00adc282c43c020119cbb80202ebe20302ad02010054e002198be10314aaL8;FFe8534cb948000037f62b06f9202a00b5a02302d160f4ff97e80301aae0010036882a00b5e1031faacaffff17e0250", + "0b5a02302d158f4ff97e80301aa40010036L16;FF080116cbbf0208ebe9f3ff54e00313aae10316aae20315aa230080522400805203000094760a40f997ffff17ff0301d1fd7b02a9f44f03a9fd830091480001abBBBL8;FF220080522c7c0194e4ffff17fd7bbea9f44f01a9fd030091010040f96802805", + "2290041d23f8d00f12831889a1f6d00f148040054a9ffffd0294107918a000010L8;FFe8a302f9680e00f908008092e04f813d6082803c680200f9ff0600f1cacbff54fb010014f7e74df9e80740910103198be00317aa08812f9174f1ff97e8f34df9BL8;FFf40300aaf30308aabf0216ebc1010054f503", + "00b4890640f9e904003769d600a9290140b2c8feffd008410691690e00f9680200f9f44f42a9f65741a9fd7bc3a8L8;FFf50b00f9f44f02a9fd030091f30300aac2000037e00313aaf44f42a9f50b40f9fd7bc3a81b000014750a40f9680240f954fc41d3080115cb9f0208eba8010054BBL8;FFabb35638", + "a99316384901084aaac35638a9a316386901084aabd35638a9b316384901084aaae35638a9c316386901084aabf35638a9d316384901084aaa035738L8;FFe0370054778640f9684242b9e8c300b9970a00b4758240f92a3c0094e00317aa21008052233c009420f200b4e10315aae20317aaf80300aa263", + "c00944a000014L16;FFe8030e910041019121c5ff97df0600b100960054f50f42f9f40b42f9950100b49822009104000014b50600f118630091e000005401835ff881ffffb4000340f9BBBBL8;FBb4b9d0c335297ca5adaaacd19f14ab28b8e6eae448b290f7752b1fbaf412c6b8732cac9be552e6e3a28c", + "6ece7869562992840000fab454b55e63313b1eb04689L8;FF090700791813009128060054400b00d11f0014ebc2250054480100b0084100910103c0791307c07908fddf8848020035480100b0080140391f050071c1eeff54BL8;FF0a078052ff5306f9e85b06f9ff5f06f9ea6706f9e87306f9e97706f9d", + "f07019450000014e0032d91a7e6ff97e1fb42f93f0400b180140054fa4340f9fb830291L8;FF010180522b0c0094000100b401fdfff021c00391130000f91f200039f30b40f9fd7bc2a8c0035fd60001805201028052b8070094fd7bbea9f30b00f9fd030091BBL8;FF2c4c0194802e00b468ffff9008692", + "991890380520001c03d01c1c03c080180d20800f0f260a601a908017cb20000803d68a600a96800805201c0803c68a20039L8;FF290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8bL16;FFf5", + "9702f9e84f02f9e8a740f9e59b02f9e85302f9e88f40f9fbb302f9e85702f9e8a753a9eabb02f9e06f813de86302f9e83740f9e95b02f9e88702f9e87b40f9BBBL8;FFe2050054b800f8b6f9031faae00319aae10318aac0670194980500b4296c0194e00318aa2100805239008052216c0194e0feffb4f7", + "0300aaf88300a9ff0f00f9L8;FFf7620091e0000054e1825ff881ffffb4e00240f922008052276c0094f8ffff17d50000b4a806158be00314aa0201805201f17dd3206c0094745642a9950100b4BL8;FF8082883ca10379ad8282873ca203d13c8182813ca10f7aad8082823c8282803c8182833c8382843", + "c76000014e08744ade00314aae85b40f9a0873cade08742adL8;FF00008052feffff17fd7bbfa9000000d000001d91fd030091aefeff97fd7bc1a8000000d000e01c91c0035fd6fd7bbfa9fd030091fd7bc1a8c0035fd6fd7bbfa9BBL8;FFe0a30391a1c300d1f4630191fad9ff97e8c30291e2630191840", + "20191e0031aaae10319aa0304805205028052bc270194f95b40f93f0700b1a00c0054faa74ba9L8;FFa0831df8201100b4080d8052b3835df8fc031faa887e089bfb0314aaa8031ef81100001436008052a9835ef8aa835ff868021c8b7b0700d15aa301919ca30191L16;FF220080522cac0094e11740f9", + "810000b4e00740f92200805227ac0094b70000b4e01b40f9e10317aa2200805222ac0094e00319aa01108052220080521eac0094BBBBBBL8;FB20c00129002f72757374632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c6962726172792f737", + "464L8;FFff1301f9ff2f01f9ff2b01f9ff4701f9ff4301f9ff5b01f9ff5f01f9ff7301f9ff7701f9ff8b01f9ff8f01f9ffa301f9ffa701f9ff571ea9ff0701f9f50301f9BL8;FFe80b41b2a0831df814000014c80080d20800f0f2080500d1e80700f9e02300918b260094e10300aae10700f901ffffd021", + "a00f9103ffffd063641091e0230091L8;FF2d2000941a0080920a0000141a008092e01fc03de013803da003983cb7fbffb5e0ffff17d90180d21900f0f2f7031caae00b41ad28008052e107c03d9a6600a9BBL8;FF2d600194e00314aad8e3ff9788ffffb008510d9109058052682601a9c8420091090080", + "92692200a9ff431c91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9L8;FFa8273aa9e8c30091e25b0094684e41b9290000b029412691f52705a9e9630091aa0000f04ab11491a80319b8280000b0081127912b0000906bd10891e92306a9L16;FFe80b41b2e00700f99bffff17c80080d20800f0f2080", + "500d197ffff17c80080d20800f0f20809009193ffff17c80080d2e0230039e00300910800f0f2ff270039BBBL8;FB02020303030303030303030303030303030304040404040000000000000000000000000000000000000000000000000001000000000000000000000000000000L8;FF0ba4ff97e11740", + "f911fcff17e063009122008052230080522400805204a4ff97e11740f960fcff17e0630091220080522300805224008052fda3ff97e11740f9BL8;FFf65701a9f44f02a9fd030091160040f9f30301aa20008052f40302aaf50308aac1420091f4fb00942001f8b7c8fefff008c10291b45a01a9a84e00a9", + "f44f42a9L8;FFe00316aad6090094e00315aaf44f43a9f65742a9fd7b41a9ff030191c0035fd6ffc300d1fd7b01a9f44f02a9fd4300913f4000f1f30300aa280100543f0013ebBBL8;FFe0f7ffb4660000143f0c0071600500543f100071e1060054a80358f81f0500b161000054bf6738a9bf0319f8e122", + "0191a22301d168c4ff9720f6ffb485000014L8;FFf14b00f971ca1391761602f9781a02f9681e02f96a2202f96b2602f96d2a02f96f2e02f9703202f9694a02f96c4e02f96e5202f9775602f9f14f00f97fca1339L16;FF3f0400b1f70318aa20020054e10000b422008052f8030baafb030caa26c00094e", + "c031baaeb0318aa3a0100b4e00319aae1031aaa22008052f8030baaf9030caaBBBBL8;FB000000000000000000000000000000000000000000000000a28cab96ab960000010075402ca10872ec2b08720872d5f6d56bd5f6d5f6d5f6d5f6d5f6d5f6a28cL8;FFce010d8bef11c0daef1540d2ef0d0f8bef2", + "50191ce194f8bdf010deb230300548c0500f1ed030eaa81feff54ca010aab220200542801088b480108ab82020054BL8;FFe237c13d18000014c80080d2e0031791e3032d910800f0f2e4833291e1feff9021a0389102018052e9ab0cb9e85306f9baf4ff97f3f742f9e8ef42f97f0208ebL8;FFe91b40f9", + "e10740f9680200f9600a803d6182803c690e00f961feffb4e00b40f92200805224100094f44f49a9f54340f9fd7b47a9ff830291c0035fd6ff8301d1BBL8;FF5a6300f1a1feff54e84b42f9aa0216cbe94742f9f45741a9682a01a928008092682600a9950100b49322009104000014b50600f173620091e", + "000005461825ff8L8;FF830500546b0500f1ec030daa81feff54a90109abe300005423000014e8031faa090840f949fdffb5e90309abc2030054280108ab42040054091440f9090300b4L16;FF092044a90d9455a9e8cf00f9081047a9e8a71aa9142048a9e8df00f90c2049a9e8af00f909204aa9ea2718", + "a909e007912001c03d097040f9e88b00f908784ba9BBBL8;FF68f60737e80f40f9890640f92a0108eb43230054890240f9e00316aae30317aa2801088be90b40f9882a00a928fd60d3681700b5280940921f1900f142180054L8;FFc56b0094fd7bbca9f70b00f9f65702a9f44f03a9fd030091350440f9f", + "30300aad50100b4340840f9370040b9340200b424700094e00314aa210080521d700094BL8;FF0800f0f2c9ffff17e80b41b2e00700f9c6ffff17880080d20800f0f2080140b2c2ffff17880080d20800f0f208110091beffff17e00300f9a1fefff021441191L8;FF03c05f3801d05f3802e05f78211000", + "1203010034620000349f000039007d20d402805fb8e3ff9f525f00036b6dffff54436c1c53e401809283c023cb0400038bBBL8;FF2816005426000014fa031faaf69f49f9f407409194820991df0600b18022005480620391df1b0094080040b20811c0da081540d2080d088b0825019109fd46d3L8;FFe8", + "6b00b96c2a0094e80356b9e00740918100805200001891ff0316b9e86300b9652a0094e80356b9e00740918100805200001891ff0316b9e85f00b95e2a0094L16;FFff830ed100844eade10300aa02328052f30308aae0071bad00884fade00b1cad01804cade10319ad02804dade0030091e2031aad27b0", + "009468420891e0030091BBBBBL8;FBbb12400000000000380000000000000082000000090000007375636365737366756c6c79206465637279707465643b206d757374206861766520612063757272L8;FF29194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd4", + "6d329010a8b290500913f010aeba9010054200108aba2000054BL8;FFc0035fd6fd7bbfa9fd030091082440f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b1400400540a1440f9L8;FF48b70035e90f41b2c2050014eabb40f938fd78d35a7c085348", + "fc60d35cfc78d3ebfcfff06b31029157fd60d38d008052fb0309aaf003182aef031a2aee03082aBBL8;FFff6300f9e08304ade02f803d08db77d3e08744ad80020191a18301d122008052080d17aaa0073dad080dc0dae86700f9e28345ada2033eadba530194e8275a29L8;FF2d580094e14b41f9810000", + "b4e04f41f92200805228580094e89f40f91f0500b16000005460630291b8edff97f3d352a9940200b47522009104000014940600f1L16;FFdf0208eb610b005458000014680240f997621932df0208eb61000054e00313aa83d20094680640f9d50600919f1240f117693638750a00f9c200005494fe47d3", + "BBBL8;FF681a00b5e00a40921f1800f1e21a0054e17e0353e11c00343f080071ad0100543f0c0071a00200543f100071200300543f1400716104005421230191e20313aaL8;FF20b50054e8cf42f9490180520969213821040091f47749f9e1d302f99f0a00b1e14a0054e8cb42f91f0101eb00ba0054e8c", + "f42f9290400911f692138e9d302f9BL8;FFbf0600b160020054148440a9f30300aae00314aac8030094d50000b4a8e279d3e00314aa02018052011115cb22f80094610e40f9e10000b4601240f922008052L8;FFf9ffff17210000b0e0b340f9e27340f922e003f9600000b4210000b020dc03f9a0221d91", + "e14b40f9011800f9540100b4220000b0210000b08006009142ac40f9BBL8;FF08800039c80ec0dafc0300aa01048052081002f8e8074091e20314aa000400ad20fffff000800f9108c1359103048052e4031caa2505805206048052ec9b0094L8;FF84018052e3000014e04305f9e0032a9121fdffd02120", + "3f910202805263fdffb063f41891c4018052da000014c80080d2e0232a39e0032a910800f0f2ff272a39L16;FF810000b4e0031aaa220080522ab80094e16f40f9810000b4e04740f92200805225b80094b60000b4e04b40f9e10316aa2200805220b80094e14340f9e10300b4BBBBL8;FB3a3a6368756e6", + "b65643a3a73746174657373686f756c642062652061626c6520746f2073656e6420435453495a450000b51d4000000000005600000000000000L8;FFab000054e09740f901f97fd34200805229880094e89f40f91f0500f1ab000054e0a340f901f97fd34200805222880094e8ab40f91f0500f1ab000054", + "e0af40f9BL8;FF220080522c080194f8ffff17e88b40f9c80000b40805088be00314aa0201805201f17dd324080194400745ad160080924233c03de85345f9800705ad400743adL8;FF5a008052a2000054e02b40f9e10317aa2200805228080094542500b49f0600f1e0230054e10316aa9f0a00f126010", + "014e32345a94a018052eaaf01f9ea028052BBL8;FF04000014880080d20800f0f2080140b2e0030091e80300f98d4e0094f40300aae043059128ccff97e00314aacfcbff971500809254fffff094c20a9156058052L8;FFfa9701b92183813c2083823ce10245ade81700f9e80b40f9e9a319a9a80302d12", + "183833c2083843cf3f5fe97e11b40f9e21340f9e843069163a3039164230391L16;FFa182c93ce3031baaa282ca3ca4835cf8e037823de13b823dfa0301aae23f823de88304f94a2e0094e8a743f9eab343f9e10314aae9ab43f9ebcb43f9f7a343f9BBBL8;FF88fffff009390c91280e8052ff6f03a9e92", + "308a988ffffd0097d2e9188068052fc7f04a9e92305a9fc6b07a9db630194e3ffff17f5031faae00315aae10313aaL8;FFa8c300d1a02301d1a9ab3ba9f76bff97a8035ef8b7031ff8140117ebe3070054b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faaBL8;FF080500d1", + "62ffff17c80080d20800f0f2080900915effff17c80080d2e10700f90800f0f2080900d107000014e80b41b2e00700f904000014c80080d20800f0f2L8;ZDBBL8;FFe81f40b9e8030639e10740f961cdffb4e01740f91a000014e90310912a0100d04a21089100ffffb00090199108210091e1c30e91e9db", + "01f9eadf01f9d5230194L8;FFe0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6c0035fd6fd7bbda9f65701a9f44f02a9fd03009113d440a9f40300aa350200b476820091L16;FF33008052fb1f8052e0030baaf7030baa680000147701198bd80000b4e00315aae10318aa220080522", + "3a80094ab835ff8f91b40f9f40740f95b0b00b4e0031caaBBBBBBBL8;FB627369676e616c2f727573742f70726f746f636f6c2f7372632f70726f746f636f6c2e7273001243616e6469646174652073657373696f6e20c0223a2063616eL8;FF9f021cebe10f00f9607b3a786006005480ff41d31f0001eb", + "82100054880340920800088b1f0101eb820f0054607b6078617b6878e8fedf88c802003528034039BL8;FF1f1040f15369283808050091280800f943feff540b7c07533f0108eb6b611932000100544b692838080500911f0048f1280800f96202005400fc4ed3af000014L8;FF341eff97a1033da900a30", + "091a3c300d1a1031ef8e10315aae20316aab6f8ff97390080929a220129e80b40f9e9634039990200f9881200f9e80b40b989a20039BBL8;FFe2031baa23008052240080529aedff97b7035ef8ba035df8480317cb7f0308eb69e3ff54a0c300d1e10317aae2031baa23008052240080528fedff97b7035e", + "f8L8;FF0969213815170094e10313aaf3faff97803240f9800100b4610a40f9680240f91f0101ebc0090054680640f9090180522a0400916a0a00f909692138e10313aaBL8;FF9f6608a99f7e09a9997e0aa99fb200b981020291e003082ae20313aa02f3ff97201200b520fcffb4d6ffff17890240f93f0", + "500b1e10000549f5e00a99f7e01a9L8;ZDBBBL8;FB08000000000000006865460000000000b465460000000000a06446000000000000654600000000005064460000000000a0f54500000000002800000000000000L8;FF60b6ff548122029147000014e8031faa000117ab226d0054e1630091a08fff977", + "f0a00b100040054e11740f9e80f40f91f0101ebe04b0054e81340f92a040091BL8;FF884e4039694e4039b502000a1f01096be0179f1a401701948852403969524039b502000a1f01096be0179f1a3a1701948856403969564039b502000a1f01096bL8;ZFBBL8;FFe3430091c93d0194fd7b43a9ff03019", + "1c0035fd608200091200440a9e92300910a0000b04a410491e8a700a942ffff9042700c91ea0f00f9e3430091bb3d0194L8;FF220080522c420094e10313aae82b40f9c80000b4e02f40f9e10308aa2200805225420094e10313aae10700f981fdff902184119183fdff90636c1291e0230091L16;FFe035", + "0054f60309aa28070091e97740f9e88b07f98801009008011591e9eb01f9e9433c91fb0301aae8ef01f940feff9000103091e8f701f968feff9008611d91BBBBL8;FB600000001f00000080174000000000005600000000000000560000000900000073686f756c642062652061626c6520746f2073656e6", + "420656b00000000000000L8;FF00feff9000801691dc8d009400fefff000e00391d98d0094fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e0030054e00313aa40000094080040b2BL8;FFe20314aaf50300aa32120194f6bf40f9d60400b4f3bb40f92a120194e00316aa2100805223120194", + "e01001b4e10313aae20316aafa0300aa261201941c000014L8;FFe1cf40f9610300b4e0d340f9e2c700f922008052f6030baaf9030caaf8030daaf5df1aa9f7030eaafa031caafc030faaf5031baafb0310aaeabf00f91e120094BBL8;FFfa671ba9f85f1ca9f6571da9f44f1ea9fd430691090040b9f303", + "08aa3f05007121090054345440a900e4006f16dc40a9040c40f9220840f9182040b9a0c302d1L8;FF176104a9166105a9096100b9fb0800b4a8035ef81f011ceb80080054560b40f9586340b9360500b4540740f925520094e00316aa210080521e520094000c00b4L16;FFec7b00f914b055a9ecd300f90", + "db056a9ed6700f9ecef00f90db057a9ed5700f9ec6f00f90db058a9ed5f00f9ece300f90db059a9ed5b00f9ec0700f90cb45aa9BBBL8;FFe20315aa23008052240080529afdff97770a40f9f7feff17e00313aa22008052230080522400805293fdff97610a40f9fefeff17e00313aa2200805223008052L", + "8;FFe8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aa44110094fad342f9fc0740919c83019190fbff17f60300aae0431691220080523c110094BL8;FF0cfeffb40a7c15533f0108eb53611932200100542a0440f90bfc63d35369283808050091280800f98b0200b5e0030caa1b0000", + "14e10300a9e00301aae10308aaL8;FFa00080d2f403002a0a0000141f0c04eb29f3ff54400080d2f403002a050000141f0804eb89f2ff54600080d2f403002a007f009b830400d1fa0180925a0300cbBBL8;FF220080522c320194e18f49f9810000b4e09349f92200805227320194e80740910881099100", + "210491d70a0094e5fcff17e1d342f9e8cb42f91f0101eb008e0054L8;FF6d2c0094f4833f910a088052e0833f9189fe5839888258392a15003308111d1288821839e86208918afe1839e083c53de187c53de0fb833de1ff833d802cff97L16;FFe48211ad33b2009460220091e1c30991023e80522fb2009", + "448008052e0a3019175fe00f9680200f91fb9ff97ff831791f44f43a9f65742a9fc5f41a9fd7bc4a8BBBBBL8;FBef104000000000004e00000000000000f904000019000000ef104000000000004e0000000000000001050000140000003d0f4000000000004a00000000000000L8;FF00feffd000e03391", + "dc950094ff4300d1e8031f2ae93300910801204b087d1f53e8330039e0334039ff430091c0035fd6ff0301d1fd7b01a9f51300f9f44f03a9BL8;FF210080522b1a0194200500b4e10313aae20318aaf60300aa2e1a0194b3835df8acffff17e90313aaf54f43a9f75b42a9fb0f40b9f96341a9fc0340f906", + "000014L8;FFe043139165f3ff9785000014c022009116f3ff9708008092880200f9b50000b4e0031caae10315aa22008052221a0094e19341f9810601b4e09741f930080014BBL8;FFa00301d108010aaaa9233ca900deff9788ffff9008a1189149038052682601a908008092685e00a9b40000b4e00315", + "aae10314aa220080521f5a0194e0a30091L8;FFe07fc13de9c31291e0833291022b8052e86702f9e8c31791018100912081803c2c5a009460030291e2833291e10313aa5ffafe973c008092fa4340f9fc5b02f9L16;FFe8af40f91f011beb49060054a0c303d112e7ff97801c003728fc60d3e81a00b5200", + "840921f1800f1e21a0054217c0353011b00343f040071200200543f080071BBBL8;FFff430191c0035fd6e80b40f96a0640f9490108eb430200546a0240f9e00740f94801088b682600a9800200f9e0031faaf44f44a9fd7b43a9ff430191c0035fd6L8;FF2d7a0094ff0600b1e1000054e83340f91f0500", + "b180000054e8c3009100c10091b00e0094ff074091ff833c91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9BL8;FFff8301d1fd7b04a9f32b00f9fd030191f30301aae10300aae0230091e2031f2a4efeff97e90740f9e82740b9aa058052e1230091e00313aa82048052e90700f9L8;FFf3fcfff0733", + "e0b91e8018052e0018052f32302a9d3030094400c00b4690240f96a7240f8e8018052e80303a9090000f90a7000f8e0c30091e82300f90bfdff97BBL8;FFffc30091c0035fd6ff4302d1fd7b04a9f92b00f9f85f06a9f65707a9f44f08a9fd03019137fc4039f40301aaf30300aa16108052350001913830", + "40f92000178bL8;FFe1431a9102288052323a0094fc031faaf7031faa36008052e0431f91e1431591022880522b3a0094a0620091e1431f9102288052fa8b04f9263a0094e86b4ab9L16;FF81ffffb4a00240f9220080522aba0094f8ffff17d70000b4e806178be00316aa0201805201f17dd323ba0094e", + "96f40f9080080927b0600f9682601a9b2f9ff17BBBBL8;FB15b41ea40394088439f432e42fd424c44d3446245b14500461746a6477547c4434c73fd722e729f7188713970ea705b76c4767577a67717740074b1756275d37L8;FF5c0080525b0080525a008052590080525800805257008052500080524f0", + "080524e0080524d0080524c0080524b0080524a00805249008052a8fe41d3eaff06a9BL8;FFfcfb42f99f0f00b101010054c800805217ffff17e04bc13de14fc13de84345b9b47e085372ffff17f46f41f9e8c31791e91f46b900c1c03c01c1c13cf5fb45b9L8;FF23e6ff97f80f40f9e80740f9080118cb", + "df0208eb09f2ff54e0230091e10318aae20316aa230080522400805218e6ff97f80f40f988ffff17e023009122008052BBL8;FFe01400b4e10314aae2031caae01300f9304a019416000014e82700f93a2f40f9fb3300f9daf8ffb51b018052287f40f91f0500b101fdff541c008092289740f9L8;FF6a24", + "40a9681040f90b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a29d7450094L16;FFe82b04f9e83b40f9e92704f9e97f40f9e83304f9e84340f9e98b04f9e94b40f9e83704f9e82340f9e98f04f9e83b04f9e87b40f9fca704", + "f9e84b04f9e86740f9BBBL8;FF220080522c6a019448008052a00302d1e3830291e10315aa0204805224008052e88302393b1a0094a82240b91f05003120290054600740ad1c050011e97f40b9L8;FFf65741a9fd7bc3a82b6a0014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbea9f30b00f9fd0300910", + "90040f9e8008052f30300aa2a0900d13f0500f14881889aBL8;FF217c0353210700343f040071c00300543f080071e00100543f0c007121fdff5488824bf81f0500b1810000549fe60ba99ffe0ca99f820d3881e20291e20313aaL8;ZFBBL8;FF882245b8e92f4379eb4746398c9246f8edc74639eaa3463", + "9e8d303b9e9ab0779e8a759a9ecb300f9eda305392b1f0036ebd343b9e96306394921c993e8cb00f9L8;FFffaf01f9ffab01f9e18318ade00740ade18319ade08753ade08714ade2034bade28315ad0801005400030191e10315aae20314aa272a009488021a32e83f0c39L16;FFfd030091ff830dd10084", + "4cadf30308aae8a70891026cc03de9e70891e10300aa0232805200f18f3c08e040f9e023009121f18f3ce927099122f18f3ce8af01f9BBBBBBL8;FB001a73657373696f6e20737461746520636f727275707420666f7220c00008696e76616c696420c00a206d6573736167653a20c0002f636172676f2d6", + "769742fL8;FFcd980094c3ffff17f7031faa18038052390080520c000014e80740f9e083c33cf7060091a822189be92740f9aa060091ff4200f10001803d090900f9ea0b00f9BL8;FFf50b00f9f44f02a9fd030091f30301aa210840f9f40300aa680240f91f0101eb40040054680640f92a040091e00314", + "aa490280526a0a00f90969213896050094L8;FF29008052880200f969520039f44f45a9f65744a9fd7b43a9ff830191c0035fd620fdfff000603391d8190094ffc303d1fd7b09a9fc6f0aa9fa670ba9f85f0ca9BBL8;FFea0319aa2c8541f88d0140b28c010b8bad11c0daad1540d2ad0d0d8bad2501918c", + "194d8b9f010bebc31300544a0500f1eb030caa81feff54890119aba2040054L8;FFe80343f9e9f31691e07fc13de9a305f92900009029710891e80305f9280000b008412691e8a705f9e8c31691ea032d91e9af05f9290000b029112791e8ab05f9L16;FF680240f91f0101eba0090054680640f90901805", + "22a040091e00317aa6a0a00f909692138e10313aa9debff97560300b4610a40f9680240f9b70640f91f0101ebBBBL8;ZBL8;FF00800991b4790094f50300aa2d7e00940008805221008052267e0094c09701b4a10241adf40300aaa20e40ad010001ad020c00ade007409100800991a7790094BL8;FFa207", + "00d161058052cbf90094c0feffd000203d91c3feffd063a03c91c4fefff084e00791a20700d161058052c2f9009408fcdfc8a8000037080940f91f0500f1L8;ZFBBL8;FF682600a90e000014e08745ad08008092e237c03d680200f96082803c6182813c6282823cdc0000b4b90000b4e0031caae10319aa", + "220080521f3e0194ba0000b4L8;FF68008052e8020039b7010014e8f741f9788242f9e90342f9fa5f09a9f6ef41f9f7f341f9e86300f9e8fb41f9faff41f9f55300f9757e42f9e85b00f9080340f9L16;FFe8db43f9e82700f9608c0054e8d343f9eac743f9fb031c91e04700f9f5ff5e39e0831d91e82b0", + "0f9e8e35e39e16f00f9e1030e91e82b02a9e8e343f9f8c701f9BBBBL8;FB087a35f466406696050db7b8a1869574a28c1a3c1a67000021113f11fdf9cd2cc4b031ea5594c733cb2e70ce02f2485fa235154c8ad5cc94ca760e28349ef3ecL8;FF3f0108eb0208803d00c0823c01fdff54f30300aae0430a9", + "16de4ff97e00313aaf34f41f9e2ffff1733008052590d00b43f0700f1c02300543f0f00f1210d0054BL8;FFe10300aae15306f9e0833291e1feff9021203f9102028052e3feffd063801a919e000014e05306f9e0833291e1feff9021203f9102028052e3feffd063bc1a91L8;FFc5090094ff8301d1fd7b", + "03a9f52300f9f44f05a9fdc300915f0c00f1f30300aa89040054f50302aaf40301aa250e0094c0018052210080521e0e0094e00600b4BBL8;FF4a390b0b4a1140510901f83708710a8bea00805208a800a91f0000f9fd7b44a9ff430191c0035fd65f01487103090054291cc0392b1d00124a550b0b4a014", + "851L8;FFe8031faa080113abe302005480fdffd000a03f91d9490094f3031faa088c48f81f0500b121efff54e8031faa080113aba301005480fdffd000003691cf490094L16;FFea5b00f9ef6f00f9f24b00f9e9050054880100f008011591e03300f9e86705f968fefff008611d9129038052e8a303f940", + "fefff000f80c91e8ab03f968fefff0BBBL8;FFff830191c0035fd61f09007181010054ea0f40f9090180d20900f0f248dd7892290140b20a000014ea474039090180d2e8031faa0900f0f205000014090180d2L8;FFe143c83c03e4006fe283cc3ce8430691e0c30e91808506ade083cb3cc1e20091e2430", + "e91fa030b91808907ade3838b3ce3838c3cbc09ff97e89341b9080e0036BL8;FFf65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6b8fefff018bf0891f9c303913b0080921600f0d21700809207000014e103082ae20313aa630c8052L8;FF3acf74923f001aebe10300541f0400b100f8ff54c2", + "1240f9014000915a5300d139ff4cd3c00a00f9400314cb22cf74b3c21200f93f683a381500156b3400148bBBL8;FF48074039e207409120ffffd000f8099123ffffd063801f9124ffffd084000b9142c035918107805248432c39c2290194e0074091e10318aae20319aa00002f91L8;FF342e0094280080", + "52f43302f9d4820f91e8e71639880000d0fa3702f9fb3b02f9f93f02f9fc4302f9f84702f9f54b02f9081140f91f0d00f1c3040054e10343b9L16;FFff831ad1ff0300f9f50302aaf40301aa200442adf30300aae023029102328052f60303aaf7230291e00702ad200843ade00b03ad210040ade10300ad", + "220041adBBBBBL8;FB6a00000000000000f30000002e00000042024000000000006a00000000000000950000002e000000110000000000000014000000000000001400000000000000L8;FF6b01084aa9031538a9335538aa131538aa4355382901084aab231538ab535538a9331538a96355384a01084a6", + "b01084aaa431538aa7355382901084aab531538BL8;FF16050091770a40f9570900b4740640f9f8031faaf90317aae00314aaeafcff97080040b20811c0da081540d2080d088b08250191081848abe2090054180118abL8;FFe903172ae1ab40f9ef7e0853dc7d1853f003182ae9c700f9f703082ad20300", + "14d8fd78d3e9031aaa3a7f085328ff60d3eb7b42f9ed7f42f937fc60d33cff78d3BBL8;FFa8835bf8f43340f9090380522a040091e003172a09692138a14301d1aa031cf812dcff97a1035cf8a8035bf8f90f00f91f0101eb80220054a8835bf849048052L8;FF1f0500b1601300548043c03df6e32291f7", + "6301912183c93ceaa209912283cb3cc082893c2083ca3ce9db42f94221803d2283c83cebe20891410103ad2083c53cL16;FF220080522cd60094f41b40f99f0600b1e0010054f38743a9e00313aac6e1ff97d40000b488e279d3e00313aa02018052011114cb20d60094e12740f9810000b4BBBL8;FF2925", + "0191a91a498b290500912001088be10313aa15fcff971601003513000014e8031faa75feffb5e003088be10313aa0efcff97b6010034610a40f9680240f9L8;FF080d088b0825019108fd46d30900088b390500913f0308eb681f005431010014e1d342f9e8cb42f91f0101eb00750054e8cf42f94906805", + "2f407409194820991BL8;FF220080522cf6009461d640f9810000b460da40f92200805227f6009461e240f9810000b460e640f92200805222f600946022009185fdff9760820791f30b40f9L8;FFa2cc7492087c4093424000d1e5d86078a53c7cd35f0005eb82010054240600b5340000b094020e9102e9", + "0091c6040011817a62f821c026cb817a22f83f000014BBL8;FFe1a7c43deac33391e2a3c43de95b49f94081833ce067c13d4181823c4281813cead342f9e99f06f9e24bc33de347c33de14fc33dea8306f9e03f833de18b833dL8;FF4dd0fe97e84345f91f0500b140080054e002c03de84b45f9001f813d", + "e8f303f94b000014680f00b4687a40f9e9430e910a0000f04a211f91e99304f9e9431f91L16;FFdaf7ff17e8c31591002100918fbdff97e06740f9e10f40f9610000b42200805225b60094b80000b4e08b42f9e10318aa2200805220b60094e19342f9810000b4BBBBL8;FB42024000000000006a0000000", + "0000000120100002e00000042024000000000006a00000000000000bd0000002e00000042024000000000006a00000000000000L8;FF291540d2290d098b292501910819498b08050091892680b9a9050034290140b22911c0da291540d2290d098b2925019129fd46d3290500918a2a80b9ea040034BL8;", + "FFe00316aa2c0601947f0b00b181040054e91f40f9e14341f9e0031691ffa71139200545ad286140f9e82303f9200705ad200543ad200703ad200944ad200b04adL8;FF220080522c06009421835ff8e1feffb4200340f92200805227060094f3ffff17e85240f9c80000b40805088be00315aa020180520", + "1ed7cd31f0600945f0f00f1BBL8;FF220080522c4601947f0700f1ab000054e0031caae1031baa22008052264601943f0700f1ab000054e03340f9e10319aa2200805220460194df0600f12b010054L8;FFc0035fd6735256a9880240f9680000b4e00313aa00013fd6810640f9c1feffb4820a40f9e0031", + "3aaf44f42a9f50b40f9fd7bc3a820460014010040f9810000b4L16;FFf60318aae37b00f9e9bf00f9e92b40f9fc030faaf88f53a9efa740f9e62704a9e91740f9e20300aaf5f700f9f5030aaae09bc33de92b00f9e90f40f9e193c33dBBBL8;FFc082c03ca003993cc082c13ca0039a3cd5660194ff0600b", + "1752e00f960050054a0877dadf71f00f9e00703ada2837ead0083853ca1837cad0283843ce10302adL8;FF150100eb62020054e80f41b2e80700f907000014c90080d248008052e04300390900f0f2e8470039e90700f9e0230091876cff97f44f4ea9f95b40f9f6574da9BL8;FF1f090071e1010054e003", + "02aaf30302aaf40301aa11f3ff97e80300aae00301aa08020037750240f9a80640f9160100eb62020054e80f41b2e80300f907000014L8;ZDBBL8;FF2d260194683e40f9a80000b4604240f901f57ed34200805227260194684a40f9a80000b4604e40f901f57ed34200805221260194685640f9a80000b4", + "605a40f9L8;FFe0db04a9f70400b4150340f9f60300aa080014ebe3100054ff0208eb09010054e0e30091e10317aa22008052da24ff97f42344a91f0114ebe3100054e81f40f9L16;FFff030291c0035fd6e9719cd2d53240f909c7b1f2691cc7f2c971fcf2a97ec99b29fd45d3290d098b29f57ed3ab020", + "9ebeb0700f9411800545f0100710bfa8052" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines6 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines7.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines7.lean index a7c99568b..26e4b7a1b 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines7.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines7.lean @@ -27,359 +27,251 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub7 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FFf07d08531f7e00718c010054500200341f5a0071e1020054ff010d6b40fcff5414000014310e0012101e001210160012101a112ad7ffff171f82007140010054L4;FFe10308aa220080522300805224008052f4030caa87000094e10340a9ec0314aa2aa040a9290040f90bfc63d35369", - "283808050091280800f9cbfdffb43f0108ebL8;FF36008052040000148902009029a11d91e80316aa9f0215ebf40300f948010054ca02148b132001a9092800a9f44f46a9f65745a9f85f44a9fd7b43a9ffc30191BBL4;FF28008052e0c30191e3430191e1031baae20319aa24008052f603182ae8430139", - "f80319aa69020094999f01940004805221008052979f0194c01e00b4e08743adL4;FFc4ffff17610000cb2100146b60010054e203014b3f1000717fc822384d0100547fb01f3861c01fb802d05f384210001242800151421c001202d01f38f35341a9L8;FF810100d021d01391a40100b084600d91e00300", - "91a363009142008052b30f00f9ec9f009468020291810100d021d81391a40100b084e00891a363009162018052BBBL4;FF0f0000141f0400b141800054c7df01941f100031c17f0054f9ffff17c4df0194f70300aa1f0400b141fdff54e043059181008052bfdf0194a07e0035e85341b9L4;FB207375627", - "36574203d2028c0022c20c00129001973706c69745f6f6666206f7574206f6620626f756e64733a20c004203c3d20c0002f636172676f2d72656769L8;FF810000b4e01f42f922008052a4df0094e8430f910001029170d9ff971d120014e80301aa190340f90dadc0a907014ba91cf940f9097942a90629", - "41a9fc8300f9BL8;FF01018052a35f0194600100b48002c03d154c00a9e10200d0214009910004803d1fc00039f44f42a9f50b40f9fd7bc3a8c0035fd60001805201078052b05f0194L8;FFe82b40f9c80000b4e02f40f9e10308aa22008052a25f0094e10313aae10700f9210100d021e03491230100d06", - "3c83591e0230091a200805284018052cb54ff97BBBBL4;FFf65742a9fd7b41a9ff030191c0035fd6000400f000001391b8ff0194ffc303d1fd7b0ba9f76300f9f6570da9f44f0ea9fdc3029109304039c90a0037170040f9L4;FF0000000000000000000000000000000000000000000000000e500014000", - "000000000000000000000000000000000000000000000000000000000000000000000L8;FF1f1040f15369283808050091280800f94202005400fc47d36e000014e10300a9e00301aae10308aa2200805223008052240080524b160094e10340a92aa040a9BL8;FF84400791a32300d182018052a8831ff8", - "f07f0194f07f0194f44f43a9fd7b42a9ff030191c0035fd6ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aaL8;FFfc6f44a9fd7b43a9ff430291c0035fd6880341d2e90080521f2d00f10831899a490100b0292121918a0000102b7968784a090b8b40011fd6e11740f9e80f40f9BBBL4;FFc00", - "35fd6a8935db8a9c35db8e0230091abab7ea9e10314aae80b00b9a8835f38e9b300b8a9035ef8ea1700f9e8c30039e9f300f8eb7301f8e89f0039eaf301f8L4;FB696f75732073657373696f6e2070726f746f627566000000447c4900000000002d00000000000000370000003800000058334448206e6f", - "206c6f6e6765722073L8;FF47140094a00f7bad480080d2e107c13de20bc13d0800f0f2f6d70da9161900916383853ca303d83c6083843ce00fc13d6383863ce10b05ade033803da2033aadBL8;FF1f00207109140033c20000540a7c0653090500394a051a320a010039e0ffff17ea0f80120b7c10530a2", - "c0633eb0000350b7c0c530a050039090900396a091b32L8;FF0a2500a9fd7b43a9ff030191c0035fd63f2900f1880000544b01098b6bf1df388b0cf8374b05c0396c1d00128c6119538c01210b810102516b00f8374b008052BBBBBL4;FF890080d2e8430039480080520900f0f2e847003928017fb2a3ff", - "ff17e00700f9210400d021602191230400d063742191e0230091a200805244028052c9ffff17L4;FFa40f0094405d00b4e10b409102c48052f60300aa21c00e91a90f00949c0f0094008c8152210080529a0f0094605c00b4e1074091028c8152f90300aa21401d91L8;FFea170139ea2b0139e9b304b8ea", - "3f0139eb2b00f9e85b00b9df0f019420010035e083c03ce80f40f96002803d680a00f9fd7b47a9f34340f9ff430291c0035fd6BL8;FF3a0080523b2340f9f54700f9fbfdffb528008052e82f00f9e10319aa294f41b9b5e301d1280c49f8f68700b9e95700b91f0500b1f85f07a9fa3700f900090054L8;F", - "F290500910a0840f94a0400b40b0440f9ed031faaec030aaa6b4100916e8541f8cf0140b2ce010d8bef11c0daef1540d2ef0d0f8bef250191ce194f8bdf010debBBBL4;FFe10315aab3cf01940c0c40f98c0100b4090040f90a0840f95f0109ebeb33899a4a010bcb2b010acb8b010bebe8000054eb031fa", - "a49010c8b04000014ea031faaL4;FBa7d456e2000006f0ebafec12f9642770675a24c6a2247dcaca6ebfd56e4223cee145a6ccb69d1352b36191204c693dd712bd0e6bfa26afed655bdac64fb23c9eL8;FFe69f43a9e03717a9f45f49a9f57b40f9ed0740f9e56f40f9e03740f9ee3f40f9ebe300f9eb031", - "2aae0f3803dfadb4aa9e193803de2c345a9c4010014e027c33dBL8;FF682601a9880280d2090080920800f0f2692200a90d000014e08745ad08008092e237c03d680200f96082803c6182813c6282823cb90000b4e0031aaae10319aaL8;FFe85b44f9a70302d1c082863c404fc03de203182a2283c53cc1", - "82843c4143cf3c20f18f3ce963019120cbc03de8b304f928210a91e9e32291c082893c4043ce3cBBBBL4;FF00c02491e30300f063401f91e40300f084202591a24300d1a1028052a0039f3cafef0194ff4301d1fd7b03a9f32300f9fdc3009100e4006ff30308aae80300f0L4;FB47000000000000009b00", - "00001b000000c9944800000000004d00000000000000f70100001a000000fe924800000000004c000000000000002d05000009000000L8;FFa401805209000014e00300f9210200d021301d91230200d063d01391e00300912202805244008052d0e4ff97e10340f99fffff17ff0302d1fd7b03a9fa6704a", - "9BL8;FFea2702a9e9030091e00308aaff2701a9a062009420010035e003c03de80b40f96002803d680a00f9fd7b43a9f32340f9ff430191c0035fd6000300b000e01c91L8;FF351200943f0700b1f90b40f9e07aff5400c303913c010014e8031faa000119ab62640054e1431691310d0094f90b40f91f07", - "00b1e00b0054e1d342f9e8cb42f9BBBL4;FF42e01991a14301d1a8273ba9b2af0194a18353f8e00319aaaeaf0194e90300aa2a0d46f85f0500b1800000542a0080920a2500a9c0035fd6ff0301d1fd7b01a9L4;FFff0700f94f0f0094e803002ae0031faa68010035f50740f9350100b47f0214ebe00315a", - "ae10316aa6232949aa1110094e00316aac1080094e00315aaf44f43a9L8;FFa5c02a91a1a301d102c10091e0031f2ae3031faa19b00094c201009042603691e10300aaa3af0094fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9fd030091BL8;FF890200d0292d2291e86b06f9880200d008412891e963", - "06f9290080d2e87b06f9c80480524941c0f2ea7f06f90a078052e07f823dff5306f9e85b06f9ff5f06f9L8;FF2000805221028052b22f009420008052a1028052af2f0094ffc306d1fd7b15a9fc6f16a9fa6717a9f85f18a9f65719a9f44f1aa9fd430591e18b00a9e80000d0BBBBBBL4;FF820a40f9e003", - "13aaf44f41a9fd7bc2a8a3170214f44f41a9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd03009108a040391f0d0071a1010054135041a9880240f9L4;FFc0230054e0dbc53dfcaf4bf9e077803dbb0000b4e0031aaae1031baa220080529f170094280340f9fb074091fa4313917b431d91090141d21f0100f", - "128459f9aL8;FFa0000035d60600f1c1feff54e0031f2a0200001420008052f44f45a9f91340f9f65744a9f85f43a9fd7b41a9ff830191c0035fd6fd7bbda9f65701a9f44f02a9BBL4;FF7281ff9720f4ffb4e0000014a88356f81f0500b1a0030054e1820191a2e300d16a81ff9720f3ffb4e7000014a88", - "353f81f0500b180030054e1c20091a2e300d1L4;ZBL8;FFab935838a97318384901084aaaa35838a98318386901084aabb35838a99318384901084aaac35838a9a318386901084aabd35838a9b318384901084aaae35838BBBL4;FFfd830191094840f9f30308aa3f0500b180010054098449a9a8a300d1e", - "00309aa33ae0094a8835d381f050071e1010054c80300b008210c910904805204000014L4;FB39353962342f7372632f6b64662e7273002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d6235386437663536653336L8;FFe80b46f9eaef45f9e87b00f9e81346f", - "9e8d300f9e82346f9e86f00f9e84346f9e8f700f9e8008052e87300f908008092e99b1ba9e60307aae87700f9e70314aaBL8;FFe80000b4ea1740f9e90740f9682200f96a2603a9f31340f90800001408008092681a00f9f30742a9810000b4e00740f9220080529a570194a80600d11f0900b1L8;FF3f08", - "007141fdff5401a30491a22302d1c8f3ff97602b00b5e1031faae9ffff17002900b5a02302d1a0f4ff97e80301aa80000036682900b5e1031faae1ffff17BBBBL4;FF35000014770240f9761a40b9f50301aa9ff7019400028052010180529df70194800600b4e8820191e10315aa160800b9080000f9080", - "400f0086136911f300039L4;FB2d313934396366386336623562353537662f72616e645f636f72652d302e392e352f7372632f6c69622e7273002163616e6e6f7420616476616e636520706173L8;FF98edff97e80300aae80300f941020090217c18914302009063b41891e0030091c201805264008052d", - "0ecff97e10340f9e00301aaf44f45a9f65744a9fd7b43a9BL8;FFa02303d19560ff97e18344a9a82303d1374e0094a883533808060036a80354381f0500718c090054e80d0035e90f41b273000014880700d1090080921f0d00b1L8;FFff3f09f9ea4709f9e85309f9e95709f9af770094f6ef47f9e01bc4", - "3de11fc43de0431691e8036179e143069102738052e057813de0fbc33de15b813de8e30a79BBBL4;FF28008052e80b00f9a8020032890300327f0600b10811c0da2911c0dafcdf0329081540d2291540d2080d088b290d098b082501912925019108fd46d329fd46d3L4;ZDL8;FFe20315aae30314aa1f09", - "0071cce8ff5467ffff17e00b40f922008052a0b7009448008052e91f80526842003969220039f44f48a9f65747a9fd7b46a9ff430291BL8;FFa00200b000200891a8370194fd7bbfa9fd030091082440f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500", - "b1L8;FFf86300f918ff60d37fc61339e94f40f9280080525f0d00b12801003901010054f55340f988008052a802003948008092880200f98800805273070014e803172aBBBBBL4;FF5fffff1780220191b93e0094e80314aaaafeff172104009021e02f912304009063082a91e00700f906000014e00700f", - "92104009021e02f912304009063542491L4;FF49f9ff54e0230091e1031faae20315aa2300805224008052f30308aa85e8ff97e80313aaf35341a9c3ffff17e0230091e10315aae20314aa2300805224008052L8;FFffc30091c0035fd6ffc300d1fd7b02a9fd8300910a0040f969018052e80301aae5030", - "0aa4b0141d25f0100f14a0200d04a713c916941899a8b0000104c696938BL8;FF0800098b080500911f0109ebc9180054150114ab83000054c0000014f50314abc2170054762e40f9f60400b4742a40f9f7031faaf80316aae00314aa56020094L8;FFe01f00f9601500b4a1870094e00315aa410080529f", - "870094e01b00f9a01400b49b870094e00315aa4100805299870094e01700f9e01300b495870094e00315aaBBBL4;FF02000014280f0091e0030291e84300f994bd0094fa0300aa33000014fa4740f931000014e04300f9a103009021242891a303009063a02891e0030291e2008052L4;FB742d623538643", - "766353665333634356363642f303639353962342f7372632f76312f6368756e6b65642f73656e645f656b2e72730076656e646f722f6c696273L8;FFe8e31539681340f92091883ce8c702f98e1a0094efb343f9ff0900f141410054e16740f9810000b4e00315aa220080529bc70094ba2b00b5f5031faa", - "53fcff17BL8;FFe90700f9e0230091963d0094f44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6c000f8b6f40300aaf6031faae00316aae10314aaa6470194a00100b4L8;FFe10316aaeeffff17281040b96800c8376800d037c2470014f3470014f347001409004039e80300aae00301aa2a090", - "0d13f09007149819f9ae90000b43f0500f1BBBBL4;FFc80300f008dd1d91682b05a98a068052480480527f2700a9c90300f029d50591692b02a9290080d2c91dc0f2687f01a9682704a9a6e70194f47f40b99f03146bL4;FB0800000000000000f8a34000000000008c21400000000000280000000000000", - "0080000000000000054a5400000000000e0214000000000003000000000000000L8;FF0015803de0cbc03d0019803de0b3c03d0001803de0b7c03d0005803de0bbc03d0009803d680700911b018052e8d300f9caffff173f100071e00200543f140071BL8;FF2300805224008052b95aff97a8277ea94a08", - "8052a1a300d1e00313aa0a69293828050091a8831ef8ae53ff97b6835ef8b7835df8e80216cb7f0208eb88060054L8;FFfafdff176801009008b140f91f0900f123030054e8b30a91c9fdff9029f13991e80302f9e8830a914001009000a80891e90702f9290000d029713e91e80b02f9BBBL4;FFe1031ca", - "ab3a70194fd7bbba9fc6701a9f85f02a9f65703a9f44f04a9fd030091ff0309d1f30308aa08048052f40301aaf50300aaa22335a9e0230091a1c302d1L4;FF240000b0814006916300058b270080d2c81040f903a000a9c51840f9200800f9051000f9c61440f9271400f942000f91c100038ba00400d1e1", - "0301cb634000d1L8;FFa0d300d1a8f31438a203d93ce1830091a303d63cd402188b5a0318cbe00704ada00779ade22b803da203d13ce31f803de08701ada1037aade20b803de18302adBL8;FF0e00001428008052090180529f6a29f8880200f9f44f41a9fd7bc2a8c0035fd6d30100b49a270194e00313a", - "a2100805298270194400100b528008052880600f9L8;FFc00000d000000e91a8270094e00301aae10302aad6260014ff8300d1fd7b01a9fd430091a01300d181008052bfc31fb8cf260094a0c35fb8fd7b41a9ff830091BBBBBBBL4;FF68fe1b9ba802088b024101d1a91700940800148a206b68fc00a820", - "0e0a00669e8a0300b44901c0da2911c0da080d498b0801148a296be838e903f836e90333aaL4;FFe2830091e00315aadbf6ff970c000014e01bc03de10bc03de81b40f9e10740f9a0839e3ca1039d3ca8031ef8810000b4e00b40f922008052991b0094a0877eadL8;FFd45601a9c84e00a9f44f42a9f657", - "41a9fd7bc3a8c0035fd6e10300aaa3fa7f92e00316aae20315aae40313aae50314aaf44f42a9f65741a9fd7bc3a820feff17BBL4;FFeb375339ea3b5339e7b75339fe4340b9eb2b1729eb3f5339ea435339eb2b1829eb475339ea4b5339eb2b1929ea125e38eb225e385b01084a6801094aea5b5339L4;ZF", - "L8;FFa79b0094612a40f9810000b4602e40f922008052a29b0094741e00f9f44f41a9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aa3f0800b1BBBL4;FF012c00543bfeffb51a000014f303002ac00300d000c01f91c30300d063802191c40300f084a03091f35301b9e2430591610", - "58052aadb01942000805201c48052L4;FB6c75650000000000b8114900000000000b00000000000000456d707479000000d8114900000000000500000000000000496e74363456616c7565000000000000L8;FFe84300f9e88342f9e82300f9e88f42f9e9a302a9e89342f9e9d342f9e87b00f9e89742f9e", - "86300f9e89b42f9e8d300f9e8a342f9e8ef00f9e8cb42f9e8f700f9BL8;FFe1074091e9bf0ef9e90200b029613c91e84b09f9e80200b008691991e94f09f9aa0a8052a04700d1e85b09f9e807409121800991e93709f9e90200b029111891L8;FF0a0100390c050039cdffff17f703002ae0230091e10314", - "aae20315aa89ffff97e003172ae80b40f9ff0202710801148b43f8ff54daffff17e083c03ce80f40f9BBBBL4;FF080109cb0932805209ff099ba80a00f948030a8b5c6b38381c210039a80e40f94903098b08050091204106d1a80e00f9a3fb01942800809229008052280300f9L4;FB3563353039393062", - "31343131366236643835366166303938352f6c6962726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f7665635f64657175L8;FF0900f0f2e0830091e8a70039e91300f994f1ff9709000014e10740f9e10000b4e80b40f9f30300aa22008052e00308aa9bfb0094e00313aae01300f9410", - "200b0BL8;FFaa7b0194fd7bbea9f44f01a9fd030091010040f9f30300aa3f0400f18b000054600640f9220080529d7b0194610e40f9140080927f6200b9740200f93f0400f1L8;FFf81740f9cbfbff17f30300aae06300912200805223008052240080525192ff97e11740f9e00313aacffbff17e0630091", - "2200805223008052240080524992ff97BBBL4;FFa8031cf88a0600f9cf9800942000805221028052afbb0194fd7bbea9f30b00f9fd030091090c40f9220101f1c3010054f30308aa080840f9e00301aa04088052L4;ZBL8;FFa7bb0094000740ad08108052e98741a9fb2204a9f96a02a9e00600ade013c0", - "3de92203a9e82b40f9e016803de83200f9810000b4e00316aa2200805298bb0094BL8;FF080c47f81f0500b1802300546c030094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb482200545b010014e80300aaL8;FF6001c03d686641f96ba20d91699e01f9697", - "e41f923008052616a41f9607641f90221039169ae01f9698241f96aa201f96a7a41f969b201f9698e41f96001803dBBBBBL4;FF090b80522a0400916a0a00f909692138e10313aab3f7ff97953a40f9550300b4610a40f9680240f9963640f91f0101ebc01f0054680640f9490d80522a040091L4;FFf303", - "00aaa8c300d1e00302aaf40301aab6c300d1f53f00b99b64fe97a8035df8c082c03cc182c13c1f0900b1a0873dade1050054a0877dade0030191e00702adL8;FF0924403913040091810480523fb5007149008052410600540a3840395fb50071e10500540a4c40395fb50071810500540a6040395fb5007", - "121050054f40308aaBL8;FF280080526806003968020039fd7b43a9f32340f9ff430191c0035fd6690600f968020039fd7b43a9f32340f9ff430191c0035fd6fd7bbea9f44f01a9fd030091L8;FFfa2f01f9ff3301f9e83701f9e03b01f9ff3f01f9884e1c9be9f77fb2190940f938f77ed31f0309eba86f", - "0054130540f9580100b4968b0094e00318aa41008052BBBL4;FFf903172aa2cb0194e00313aa21008052370080529fcb0194c0fdffb4e10314aae20313aae01b00f9a5cb0194e61f40f928008052f703192af9031b2a04000014L4;FB6441757468656e74696361746f722070726576696f7573204d41432", - "06b6579206d697373696e6700d5184900000000006a00000000000000120100002e000000L8;FF288108aae9ea45a9fc6700f9542108aae97700f9e93640f9e94f00f95c7700b49bcb0094e0031caa2100805299cb0094403301b4e10314aae2031caaf50300aaBL8;FFe8e3009129008052448948adec03", - "0b91408541adf81f40b9e95300b94231803d02c1853c438942ad01c1823c00c1813c02c1843c03c1833ce80b40b9400504adL8;FF0811c0da081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8bBBBBL4;", - "FF08213a91e10300b021203e91e203009042f83391e0030091e3630091f4a301a9f5a302a9bbeb019460fd07360004009000e01c91e30300d06300229104040090L4;FB0800000000000000887a420000000000000000000000000008000000000000000800000000000000487c420000000000541e40000", - "00000002000000000000000L8;FF2a0400916a0a00f909692138e10313aaf0ebff97818a40a940008052e30313aa38eaff97810a42a960008052e30313aaf44f42a9f50b40f9fd7bc3a831eaff17BL8;FFa20301d17155ff9780f3ffb440000014ffdf0aa9ff5f00f9c1c20091a20301d16a55ff97a0f2ff", - "b430000014a00301d1f26c0094fa0301aa80f507363e000014L8;FF810000b4e01f40f922008052a46b0094ff830891f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6ff4301d1fd7b03a9f32300f9fdc30091BBBL4;FF4a000014e80316aaf80317aafa010034e8030091e10317aaf", - "802028b00011a8ba7ab0194e83340f980030191e10300912200805208050091e83300f9cbab0194L4;FF03ac6bd3615615534a490baa6b721c534a010caa6c761d534aed0baa6b7a1e534ab10caa6c7e1f534a910baa6b4210534a950caa0c4010534a250baa0b000012L8;FFff830e91f44f45a9f65744a", - "9f85f43a9fa6742a9fc6f41a9fd7bc6a869a7ff17e91f40f948008052e083079133210039280100f9d2a5ff97e12340f9f0ffff17BL8;FF880200d00821109142008052e9c702f9e9cf02f9e8d302f97edcff97f58740f9e8031691e00315aa782b0194a8624039fbc342f9f5c742f9f7cb42f9e8631639L", - "8;FF1f050071a1070054e9030291e8074091e08326910801189121e50e91df04ff97e80356b9f9074bf9f80b4bf928030036281f00121f050071ec040054c8520035BBBBBBL4;FF4c0200b500fc55d336000014e10300a9e00301aae10309aa220080522300805224008052b2060094e10340a92aa040a95", - "36928380cfc5cd308050091290040f9L4;FF0001c03d08e140f8ec0741b2c20280520000803d08e000f8c8028052e8bb00f9e16b42f9c10100b4e0031baaf7c700f9f70302aa22008052fb0309aaf9031aaaL8;FF600300546b00805269a200a9080380526b0200b949050091696a28f8f44f44a9f65743a", - "9fd7b42a9ff430191c0035fd6640200b084802d910b140194600200b0BBL4;FFc0035fd6f50f00f9e00317aadc6b0094f60301aa3f001bebf70300aa69f5ff5481ffff17f50f00f9e00316aad46b0094f60301aa3f001bebf70300aa69f4ff54L4;ZDL8;FF610100f021601a91a32300d162008052e40314", - "aab3831ff8ee93009468620091610100f021f41491a32300d142008052e40314aaa8831ff8e6930094e6930094BBBL4;FFe80b41b2e01700f9ac000014880080d20800f0f208050091a8000014880080d2e01700f90800f0f23b000014880080d2e01700f90800f0f228000014880080d2L4;FB109087fe0", - "ca6a73ac1c3e5e9000091864aa1c58c1c90802c01aa08e64ef1ef85cbd2f19584a62bd9d2aa0000315ed27995339d879781d3361233702688af989cL8;FFe9a340f9e1030daafc2317a9fc0306aae0afc23de6a341a9e91300f9e98f40f9f8ef00f9f89f40f9e7b300f9e7b744a9e8a713a9e9eb40f9e8a7", - "40f9f6031baaBL8;FFe8031faa00011aab62670054e14316914f0d0094df0600b18000005480220291e1431691da1200943f0700b1f90b40f9c07cff5401230491c4000014e8031faaL8;FFe00314aa0201805201ed7cd3a4530094e9c31291e8cf44b9f5bb44b920c1c03c9f0b00b1e8a304b9e027813d4", - "10a0054e8830291e99f40f9e027c13d16d10791BBBBL4;FFfa3340f9a0e300d1bc831cf893dcff97a0e300d1bc831cf890dcff9709008092a84301d1b46b3ba9ff6b00b9e92b00f9a8031cf83a1500b4f71300f91b210091L4;FB88b0480000000000690000000000000057c35773052fe57da347cd62431", - "528daac5fbb290730fff684afc4cfc2ed90995f58cb3b74000000f1b0480000000000L8;FFc80080d20800f0f20809009146ffff17c90080d2e8230039480080520900f0f2e8270039e90300f9e8ffff17e00300f9210200f021701b91230200f0639c1b91BL8;FF815eff97a0f6ffb464000014ffe308a9", - "ff4f00f9e1620091a20301d16b5dff97c0f5ffb44b000014ff6307a9ff4300f9e1c30191a20301d1645dff97e0f4ffb4L8;FF738209913f0400f18b000054e03749f922008052a27300943f0700b16000005460c20091f40c0094e87349f9090d00913f0900f123c7ff54080141d2e9008052BBBL4;FFe22", - "f803da203d73ca1c302d1e203009103068052e323803de00702ada1037dade20f803dd7020191a82735a9e10303ada1fdff9700e4006fa0833aada0833badL4;ZBL8;FFe017803d0002c03da181813c4109c03db2031df8123240b9a0039c3cc141823ca1037eadf13300f911825fb810c20191c041813ce", - "20343adc141803ce117c03dBL8;FFa22302d1e3ebff9780f7ffb49c010014a22302d1830c8052aae4ff97e0f6ffb4ea00001401630091a22302d1d9ebff9740f6ffb483010014e1032d91a22302d1L8;FF80010054e0431a91e1431f9102288052ab330094e0431591e1431a9102288052a7330094ff0a00", - "b181c9ff54a4010014fc032a912f010014c80080d2e14705f9BBBBBL4;FF4901098b6801088b2c81c99329bdcaca0badcbca2801088b6a010c8b08cdc9ca4bc1cbca69adcb9329bdc8ca08010a8b2981c8ca200108caf44f46a9fd7b45a9L4;FF0b1940396bc100517f25007128550054292d0c1b5f1d00f", - "1f6030daae1030eaaef0310aac0030054081d403908c100511f250071e85300544a018052f6030daaL8;FF60d240f922008052a503019461da40f9810000b460de40f922008052a003019460420091f30b40f9fd7bc2a8d4fdff1760220091f30b40f9fd7bc2a816000014BL8;FF0a0000b04a011f91e8a7", - "00a9020300d042e03991ea0f00f9e3430091bd830194fd7b43a9ff030191c0035fd6202040a9210300b021842991030d40f9c2028052L8;FF410100f0212c1b91e8230091e00309aa42018052dd830094620100d0420039913700001408200091410100f021701b91e80300f9e8230091e00309aa6201805", - "2BBBL4;FF40fbffb434000014a0a300d1fbc40094e80300aae00301aae8fd07362e00001400f7ff54a5000014a0a300d1f3c40094f40301aac0ed07363d000014a0a300d1L4;FB570700000500000047654900000000004e000000000000005807000005000000f264490000000000540000000000000059", - "00000005000000f264490000000000L8;FFec03182aeb03142a38ff48d3e06b40f9fa0316aa150100b4e10315aa22008052f4030b2af5030c2a9dc30094ec03152aeb03142a5f0700b1800b0054f503192aBL8;FFda380094a1035df8e80740f9f30301aac80000b4e00b40f9e10308aa220080529f43019", - "4e10313aae81340f9c80000b4e01740f9e10308aa2200805298430194L8;FFe8ab00f96082803c680e00f9ac430094e0430691e10315aa8796fe97e00315aa896cfe9728008092680200f9a6ffff17e85340b91f050071610f0054e043c73cBBBBL4;FFf9feffb50f0000141f0400b121000154c6e301941", - "f100031a1ff0054f9ffff17c3e30194f70300aa1f0400b141fdff54e043059181008052bee3019480fe0035L4;FB79726f6f745f6b657900000000000000000000000000000008000000000000000800000000000000588b4300000000003de84800000000004d00000000000000L8;FF480080520900809", - "2692200a9bc000014f6031faaf5031f2af9031f2af7031faa38008052e8431e91fb431e91fa431e914bfbff97f4cb43f96083c03ce8d743f9BL8;FFe40314aab3831ff8f263019468620091c10200f021b42f91a32300d162018052e40314aaa8831ff8ea630194ea630194f44f43a9fd7b42a9ff030191c", - "0035fd6L8;FF080740f9f50300aae00314aa020000143500805209fc4ad30a088052f4031faaf5ff03a92911c0da490109cbea0080523f1d00f129318a9a2a0080521f0008ebBBBL4;FF5ffd03716801088b0c21003980050054e00318aae20314aa160d0094daffff170c0180520b01008a6b010c8b8c21", - "00916b01088a20696bfc00a8200e0d00669eL4;FFd3ffff17bf3b03d5411c40b92400030aa6fc5f883f00066b61ffff54a4fc068886ffff350000010a401800b9001a003441404079212c46d3211c00513f7c0071L8;FF4a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129", - "194b8b2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8bBL8;FFfd7bc3a8c0035fd6e00313aaf60301aae10315aae20314aa16faff97750a40f9e10316aaeeffff17ffc300d1fd7b01a9f31300f9fd430091f30308aac10000b4BL4;FFf44f4ca9f94b40f9f6574ba9f85f4aa9fd7b48", - "a9ff430391c0035fd6ff8301d1fd7b03a9f52300f9f44f05a9fdc3009143010034081c0012f30302aa1f090071L3;FB0010000000000000010000000400000000300a000000000000204a000000000000204a0000000000780100000000000078010000000000000010000000000000BBBBBBBBL4;FFe163", - "0091e00313aa03088052b979009414008092e00314aaf44f49a9f65748a9f85f47a9fa6746a9fc6f45a9fd7b44a9ff830291c0035fd6e92340a9795200a9L4;FFc000009000e02391bc1d0094ff4303d1fd7b07a9fc6f08a9fa6709a9f85f0aa9f6570ba9f44f0ca9fdc3019109604039690f0037f40308a", - "a182040a9f30300aaL8;FFfd7bc3a8c0035fd620008052e10313aab01d0194fd7bbda9f65701a9f44f02a9fd030091f30302aa4203f8b7f40308aa330200b4f50301aa951d0194e00313aaBBL4;FFe0231291fc86ff97c1ffff1728008052687e01a928008092687e00a93c000014f50900b49a9d0194e00", - "315aa2100805239008052979d0194f80300aae0f5ffb4L4;FF420001f1e8feff548e3c7ca9661c01a9861c7da9682402a988247ea96a2c03a98a2c7fa96c3404a9ae3c3ca9a61c3da9a8243ea9aa2c3fa9c0035fd600000000L8;FF68c20091810100d021481491a40100b084600991e0030091a3630091a", - "2008052a80f00f9eb9d0094810100d0215c1491a40100b084e00991a363009182008052BBBL4;FF05000014e043059181008052c9dd0194e03f0035e85341b9e82b00b957ffdfc8770000b5c2dd0194f70300aaff0600b180020054f843059199008052e00318aaL4;FB7372632f74696d652e7273002f72", - "757374632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c696272L8;FFe9eb01f929038052e8a303f9e8ab03f9080200d008612a91ebc301a9f22b00f9f8f301f9e9a703f9e9af03f9e8b303f9f7fb15a9f19700f9fbdf00f9ecdb13a9BL8;FF6", - "80e00f965040014f4c30091a18200910228805280820091a95d0194e95b40f9e067c03de8d340f9f71b00f93f0d00b1e083833ce82700f94101005428008052L8;FFb41640f9e803088b54f5ffb5e00308ab23f6ff54200100f000800e91a35d0094e00313aa2200805286010094610a40f9b0ffff17e003", - "13aa2200805281010094BBBBL4;FF880200f969520039f44f4fa9f6574ea9f85f4da9fd7b4ca9ff030491c0035fd6a2820091f70300aae00315aa2100805223008052a1e0ff97e00317aa75ffff17L4;ZFL8;FFf65704a9f44f05a9fdc30091081c00121f09007181010054e00302aaf30302aaf40301aa5", - "afdff9720020037750240f9a80640f9160101eb02030054e80f41b2BL8;FF2403009084e03291a32300d1e00308aa62028052a9831ff8e37d0194fd7b42a9ffc30091c0035fd62103009021e03791e00308aaa2028052fd7b42a9ffc30091L8;FF080040b20811c0da081540d2080d088b0825019109fd46", - "d30800098b080500911f0109eb281f005411000014f6031faa938640f97f0600b18027005480220491BBBL4;FFa0e300d1e10315aa220080520301805204018052b6b0ff97e00314aab4035df8eeffff17e90740f9a8d37ca93f0900b100030054e083c03ce183c13ce283c23cL4;FB11000000000000004", - "501000005000000408649000000000011000000000000004a01000005000000408649000000000011000000000000006001000005000000L8;FF000880522100805204be0094800800b4f60300aac00100d000802d9101048052e20314aae30318aae40315aae50319aae60316aa07088052c314009494bd", - "0094BL8;FF4a25019129194a8b29050091280108abc2010054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054L8;FFda32ff97e10740f9b1ffff17e80f41b2abffff17e80f41b2b9ffff17a0031df80101009021a400910301009063f40091a", - "0c300d142018052e40080522c000014BBBBBL4;FF610a40f9e00315aa76ffff17e00313aa220080522300805224008052b4000094610a40f97cffff17e00313aae10317aae20315aa2300805224008052ac000094L4;FF880200f9e89340f9a80000b4e08b40f9e19340f922008052a10d0094e8a340f9a8", - "0000b4e0bf40f9e1a340f9220080529b0d0094e8af40f9a80000b4e09f40f9L8;FFea570039ea6b0039e9b301b8ea7f0039eb1300f9e82b00b9df0d0194fd7b44a9f32b40f9ff830191c0035fd6ff8301d1fd7b04a9f32b00f9fd030191f30301aaBL8;FF096501a9a9435fb8156502a9175103a9176104a", - "9166105a9096100b9fb0800b4a8035ef81f011ceb80080054560b40f9586340b9360500b4540740f9948d0194L8;FFc0035fd6fd7bbea9f30b00f9fd030091a13b0079a1730091f30300aaddacff9760020079f30b40f9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091080040f9BBBL4;FFa1ffff17e0", - "e30091220080522300805224008052b6c0ff97e12740f9a8ffff17e0e30091220080522300805224008052afc0ff97e12740f9c6ffff17e0e30091L4;FB154c8ad52be204e85309339df3ec27f1e8beaaf611e960475463a78121c6030a37f8a28c1c5b615203757e800000fa111a782e830d0e9152b1952", - "c3f1eb49aa7L8;FFe9eb40f9e89b40f969a20ca9e9a740f9e88f40f969a20da9e8a753a9698e0ea968e20fa9e8d340f968c616a9e8ef40f968ea17a9e8e340f968da19a9e9235ea9BL8;FFf65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6ebab59a93f050071e89741b92083c13cec030b9180", - "33803da10900548031c03de8c302b98b4100f8L8;FFe10314aae20315aaf60300aaac4d0094571740f9570400b4541340f99c4d0094e00317aa210080529a4d0094601500b4e10314aae20317aaf80300aaa04d0094BBBBL4;FFfa6746a9fd7b45a9ff830291a4ed0114f44f49a9f65748a9f85f47a9fa67", - "46a9fd7b45a9ff830291c0035fd6000400b000e028919ded019420008052e10313aaL4;FB7c7c206d6573736167655f7479706520617320693332203d3d20726573756c74206173206933320085924800000000003300000000000000c601000009000000L8;FFe00313aa62edff9760fe073728fc60d388", - "0800b5200840921f1800f1c2080054217c0353e10800343f080071ad0100543f0c0071600300543f100071e0030054BL8;FF010940a9e00313aafb6d0194400100365100001494008012e80200f008c12a9179008052010940a9e00313aaf26d019420090037fa02140a1b038052f40200d0L8;FFe1d342f", - "960fcff17e0431691220080528c110094e1d342f976fcff17e04316912200805287110094e1d342f981fcff17e04316912200805282110094e1d342f9BBBL4;FFa903153850d4ff97a8035c381f05007141010054a8a77ca9682601a9810000141f090071e10b0054bc035df8e92e00d188df78925d00001", - "408a341b8ab2b7da9L4;FF800600f90a000014f3031faa280080520901805207000014e00313aac8060094e0feffb528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8L8;FF1f050071c1030054e2031f2a4c07009408fc78d309fc60d3287b68782821084a095d1053295b697820010", - "84aebffff17e80100d008010191e9430091e00f00b9BL8;FFe2032d91c1058052e8a305f9e9a705f9b32d0194e85746f9e95b46f9800200f000200491830200f063a01991840200f084000691e2c32291c1058052e85b04f9L8;FF0800f0f21a017eb235000014b50000b4e00314aae10315aa22008052a0", - "2d0094080180d20800f0f21a0540b22c000014160180d21600f0f2150500b4e00314aaBBBBBBL4;FFf51f40f996000037780400d018e31e9113000014d7fe45d3e80214ab820e0054e90200aba20e0054aa0217cba8831cf8a8c300d1a02301d1a9ab3ba94bfe0094L4;FF4183c73c60838d3c4083c83c61", - "83863c4183c93c6083873c4083ca3c6183883c4183c33c6083893c4083c43c6183823c4183c53c6083833c4083c63c6183843cL8;FFf44f03a9fd830091480001aba2020054010840a9f30300aae023009129f87fd31f0109eb0881899a090180521f2100f11481899ae30314aada020094e80740f9BBL4;", - "FFf76b40f91f0500f1c1010054281f00121f050071ac0300542aff48d30c0180d2291f4092eb0f41b20c00f0f21f01007168018c9a37018a9a29019f9a08010014L4;ZBL8;FF080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb481f005439010014002000910008", - "009424000014e80300aa098d40f8BBBL4;FFe36b00542a0340f9f51740f94801088b282700a9a88355f8080540f9190115eba3540054bc8355f8820740f95f0019eb89330054810340f9350080399500f8b7L4;FB611c49000000000055000000000000006e01000025000000611c4900000000005500000", - "0000000006b01000021000000611c4900000000005500000000000000L8;FF28a00791f60311aaf10315aa0001c03d08008092f50302aae4e300f9e29349a9e8d30ea9f8030eaae03340f9fbbb4ca9ed5b00f9e8a74ba9f79f00f9f70310aaBL8;FFe89f49f9f4074091948209911f0500b1800000548062", - "0391e143169166130094e8bb49f91f0500b100bdff5481420491f0010014e1d342f9e8cb42f91f0101ebL8;FFe86704f9e8c31d91e1833291e86b04f9a8fdff9008213b91e86f04f948008052e86b06f92801009008013091e86f06f9e85706f92801009008ed0c91e86306f9BBBBL4;FFa7f50194e08741", - "ad28008052e217c03d800600ad820a803d68a20039f44f49a9f65748a9f85f47a9fd7b46a9ff830291c0035fd60001805201048052b0f50194L4;FB746966696361746573656e6465725f6531363473656e6465725f646576696365657870697265736964656e746974795f6b65797369676e657273656e6", - "465725fL8;FFe20313aa430c80520befff97e10300aa40f8ffb4b6ffff17a80640f91a0101eb02010054a2000014e10314aae20313aa73f4ff97401000b5e1031faa610a00b5BL8;FF21182691040300f084201291a3630091e2038052a80f00f9ee75019468a202910103009021942691040300f084a012", - "91a363009102038052a80f00f9e5750194L8;FF08050091e98792b969010034290140b22911c0da291540d2290d098b2925019129fd46d32905009104000014f4031faa64000014e9031faaea8b92b92a010034BBBL4;FF0801028b683300f9d8b50194e00301912103138be2031aaafaff0139a8b50194e", - "8ff4139290080521a0317cba90316381ffd007101fbff5409088052a18302d1L4;ZDL8;FFa4b50094c00800b4e80300919f020072f80300aa1b0101911c81009168139c9a000540ad000400ad99b50094000980522100805297b50094800700b4f90300aaBL8;FFc00301b4e10313aae20317aae01300f9a", - "b350194f32b41f9e83341f9f92700f91f0500b160080054f63b41f9e87b42b9e81f00b9b69800b4f43741f994350194L8;FF61000054e0e30e919f6cfe9708068052e9e341f90227c03da826089b008743ada9060091e0032a91000500ad0209803de9e701f9fb5f00f984f4ff97687a40f9BBBBBL4;FFe2", - "1bc03d0825199b08011c8b000502ade00740ad0219803d000500ade00b41ad000901ade80240f908050091e80200f9600600545a0700f19cc3019194c20191L4;FF080118cbdf0208ebe80c0054e80b40f9e10317aae20316aa0001188ba80500940803168be80f00f9540300b4e10f40f9e80740f9b51e4", - "0f91f0101eba00d0054L8;FFa7050194683e40f9a80000b4604240f901f97fd342008052a1050194684a40f9a80000b4604e40f901f97fd3420080529b050194685640f9a80000b4605a40f9BL8;FFc5ffff17a04301d1da82ff97a8835df8a083dc3ca103db3ca9035cf8881a00f908008092800a803d81", - "82803c890e00f9880200f922000014a04301d1e482ff97L8;FFaf850094e0031aaae10319aae20317aae30315aae4031caadbd7ff97e80b40f9200080523f0300eb601d0054497b60780a014079000400916b03008b4901094aBBBL4;FFfa0315aaf52b40b90200001413008092880340b21f0700b10811c", - "0da081540d2080d088b08250191881b488b080d009160010054090340b22911c0da291540d2L4;FB0000000000000000737071723a3a76313a3a6368756e6b65643a3a73746174657373686f756c642062652061626c6520746f2073656e6420435453495a450000L8;FF000540ade50319aae87742f9e28", - "f41a9e0cb44a9e6030991f16748a9e13340f9ed6f40f9e8c303f9eb6740f9e7a340a9e0db813de1df813defc343a9ec2b4ba9BL8;FFe00200547369283808050091280800f92004f8b7e0030aaa26000014e10300a9e00301aae10308aa22008052f4030caa9c050094e10340a9ec0314aa2ba040a9L8;FF", - "fdc300913f040071f30300aae102005428008052090100d029011391ff2300a908048052a06300910800ac72e1630091a21b00b9e92302a9e8030091ff2301a9BBBBL4;FFe90b40f96d4a00396a6a0039ea6340396c5e00396b32007969b201f86a8e0039f44f44a9f51b40f9fd7b42a9ff430191c0035fd", - "67f0200b9f44f44a9f51b40f9L4;FB696f6e20666f7220726563697069656e743a20c0392c20286e6f2063757272656e742073657373696f6e207374617465292c206e756d626572206f6620707265L8;FFb58311f897dbff97e10300aa54ffff17e0230b39e0030b91ff270b39f56301f990dbff97e8030", - "0aae86301f921020090216c1a912302009063801a91e0030b91BL8;FF200100b4140000f9e10200f021803491130800b91f300039f44f41a9fd7bc2a8c0035fd60001805201028052b4650194fd7bbda9f50b00f9f44f02a9fd030091L8;FF42008052f30b40f9fd7bc2a8a4650014f30b40f9fd7bc2a8c0", - "035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aa810000b4600640f922008052BBBL4;FF955e01a9995e02a9933200b9f44f46a9f65745a9f85f44a9fa6743a9fd7b42a9ffc30191c0035fd639008052e10740f901feffb5f2ffff17ffc301d1fd7b05a9L4;FF1f000039007d20d4fd7bb", - "da9fd030091f35301a9f51300f903c05f3802d05f3804e05f78541000124301003464000034bf000039007d20d404805fb8e3ff9f52L8;FFf4031faae9031faaf50000b46002148be10308aae20315aaa9a50094e10318aae90314aae80740f93501158bf50f00f9090115cb285041a99f0209eb48060054", - "BL8;FF22038052e4250114281040b9000040f96800c8376800d037d3250114e7250114e7250114e00301aa810200b021e83b9162008052d8250114090040f9e80301aaL8;FF88021a32e8ff0739081d40922d000014a00640ad2800805220030291e103069122008052ff2701f9ba020191e0070eada00a4", - "1ade82301f9e00b0fada2250094BBBBBBBL4;FF808201ad808202ad8002803d28d776d3800642adea03172a09dbd99380020291080d0aaae103009122008052e00702ad800640ad290dc0da080dc0da892207a9L4;FFa08301d1e10316aa0a110094b7035af8ff0600b120090054a88301d1a9eb7aa9bbf3", - "7ba90081c23c0181c33c0281c43ce10740f9e20304ade11f803d2b000014L8;FFb9730091750200f0b5a21791e8164038e3030091e00313aae10314aae20315aaf96300a9a8730039ba190194a0000035d60600f1c1feff54e0031f2a02000014BBL4;FF5f000014f60300aaf40303aaf50302aa1900178b", - "e0230091e10304aae20305aae30316aae40317aa68fcff97e8234039290340391f01096be0179f1ab2990194L4;ZFL8;FF84801891a3630091a2008052a80f00f9f0990094f0990094fd7b41a9f31340f9ffc30091c0035fd6ff8300d1fd7b01a9fd430091e00301aaa101009021001991BBBL4;FFfa6744", - "a9fc6f43a9fd7b42a9ff030291abd9011428008052e80300f9e10740f981f9ffb5ceffff172000805201048052a8d90194ff4301d1fd7b03a9f32300f9L4;FB63642f303639353962342f7372632f656e636f64696e672f706f6c796e6f6d69616c2e7273002f636172676f2d72656769737472792f696e6", - "465782e63726174L8;FFf1d340f9e30306aaf21314a9f2e340f9e40318aaeb1b00f9f80f40f9eb0300aae61f40f9e03740f9f90307aae0f3803df00315aafb031eaafc9300f9fc0305aaBL8;FFe0d3843de077c13de2d7843de273c13de0cb843de06fc13de1cf843de16bc13de0c3843de067c13de86f09", - "f9e2c7843de1bf843de0bb843df41300f980020054L8;FFe85306f9e95706f9e85b06f9e92347a9f98306f9fb8706f9e85f06f9e86706f9e83740f9e96306f9e86b06f9e87306f9e82745a9e96f06f9e89b06f9e81340f9BBBBL4;FFe217c03d800600ad820a803d68a20039f44f49a9f65748a9f85f47a9", - "fd7b46a9ff830291c0035fd60001805201048052b3f90194000400d000601791aff90194L4;FB00394c6f63616c6c7920737570706c69656420616464726573736573206e6f742076616c69642053657276696365204944733a2073656e6465723dc00c2c2072L8;FF40010054810000b4e09b40f9220080", - "52a3f90094e1a340f9810000b4e0a740f9220080529ef90094e87b40f91f0500b120180054e0c3039162f5ff97be000014BL8;FF3f0400f18b000054600640f922008052a3790194610e40f914008092740200f93f0400f18b000054601240f9220080529b790194611a40f9740e00f97f5200b9L8;FFe80", - "7409180020291f507409108810991b582099154acff97f43349f94083c03ce83f49f99f0600b1e04f823de8a304f9c0120054f8432591fc074091a1820091BBBL4;FF8d8109aae9334aa9600d010e10020c8ae65b40b9216970fc228c202e5100669e31c20192f10200b43202c0da5212c0da120e52ab823", - "1005452020c8a320d12cbL4;ZBL8;FFeb8302f9e88702f9da130094bc9374a9e8831391e0031f2ae1031aaae20314aa2500805206048052fa0300f9e3031caa14ba0094a10354f8810000b4e0031caaBL8;FFe00313aa080c48f81f0500b18002005428fdff97080040b20811c0da081540d2080d088b082", - "5019109fd46d30800098b080500911f0109eb89040054140114abL8;FFe84745f9788242f9fa5f09a9f55300f9f74b45f9fa5745f9e84300f9e84f45f9757e42f9fba30ba9e85345f9fb5b45f9e85b00f9080340f9680000b4e00315aaBBBBBL4;FF610240f9290080396918f8b7280400914a0400d1e600", - "001401c00091e003022ae20303aa69f3ff97602c00b4e00700f9210400b021a01f91230400b063601891L4;FF08000039f40000b4f60300aa00040091e10315aae20314aaa9090094e00316aae10313aaf44f42a9f65741a9fd7bc3a8c0035fd6800000f0004033919b090094L8;FFf8090114080040f9e2", - "0301aa00a140a9e10308aadc090114080040f9e20301aa00a140a9e10308aad7090114082440a9e20301aae00308aae10309aad2090114BL8;FFe95b00f9e96700f9e97300f9e97f00f9a8031cf8000f00541b210091f6c30291fc8302913900805209000014a20301d1830c80525070ff97201500b5bc03", - "5cf8L8;FF2b2c0c53fcd7532908010a4a2a300d538c010d4af07c900acf7f8f0a2d280b538c010e4a2e340e5331380f53fb875429297f890a6b7f8b0aaa7e8a0af69b40b9BBBL4;FFb7c90194fd7bbea9f44f01a9fd030091140040f9f30300aa81000094682a41a989020acb1f0109eb49030054890208c", - "b6b0240f94a0109cb3f010aeb89010054L4;FB080000000000000014f8450000000000456b5265636569766564000000000000d5184900000000006a00000000000000440100001c0000000000000000000000L8;FF4c0300141f0f00b129100054fb031faa9a0200149f0600b1ed7300f9401b0054fb031", - "4aa5f0101f1ea2b00f9411e00541f0700b140210054ee6b00f9e84300f9BL8;FF42008052a6490194689640f9a80000b4609a40f901f97fd342008052a049019468a240f9a80000b460a640f901f97fd3420080529a49019468ae40f9a80000b4L8;FF0825019109fd46d30800098b080500911f0109eb88", - "0b00546d000014f30300aa1dfdff97e80300aae00313aa090140b22911c0da291540d2290d098b29250191BBBBL4;FFfd7bc6a8c0035fd62000805201088052b0e90194ff8302d1fd7b04a9fc6f05a9fa6706a9f85f07a9f65708a9f44f09a9fd030191f803002ae0830091f60307aaL4;FB080000000000", - "0000704d420000000000000000000000000008000000000000000800000000000000108642000000000000000000000000000800000000000000L8;FF88ffff17f50300aae00313aa22008052230080522400805252000094610a40f9e00315aa8effff17e00313aa2200805223008052240080524a00009", - "4610a40f9BL8;FF1f0114eb1705009182fbff54a96a68383ff1017121fbff54f9031f2a1a0500910500001439008052f70314aafa031caae80314aa01011ccba0021c8b8149ff97L8;FF2043813ce1031091e8a301b9e8b341b92007c03dffeb01f9e80303b928008052e8ef01f9080480520800ac728101", - "01ade80b02f9e8430f91fff301f9e80302f9BBBL4;FFa3a90194e0031baa21008052a1a90194003d00b4e12f40f9e2031baaf90300aaa7a90194e9031baa0c00001408008092e83700f9e00314aad1810094fc0300aaL4;FFc0010054ae15c039df0501318cd58c9a7f1900f120010054ab19c0397f05013", - "18cd58c9a05000014f4031faa08011fcb52000014ec031faa8801088b0b188052L8;FF810000b4a05a40f922008052a4a90094a16240f9810000b4a06640f9220080529fa90094a16e40f9810000b4a07240f9220080529aa90094a17a40f9810000b4BL8;FF8233803de8bb02f9800703ad420344ad8203", - "04ad410341ad810301ad420342ad820302ad410340ad810300ade1b2ff5428008092680200f9a6fdff17800200d0L8;FFe1030054088341f80083c03ce9832691c00000d000243091e1432291e8db04f928ffffd008b13991e84f04f9c8220091e06b823de94b04f9c8290094fb074bf9BBBBBBL4;FF2804", - "0091490400d11e000014890080d248008052e04300390900f0f2e847003928017fb21d000014e80741b21b000014f603032a5f2800f1880000542800028bL4;FFa3110094008c815221008052a1110094f9d340f9209d00b4e1074091028c8152fb0300aa21401d91168c8152a411009408c48052fa8301f", - "9e88701f9fb8b01f9L8;FF0a819f1a8d0d00122e28403929010b0b4a114c0bbf25007129c100110b819f1adf7d02710944003949c100110a819f1a0948003969010d0b4a114e0b29c10011BBL4;FFe20317aaae910194d602178be00318aae10317aa22008052f60f00f9a0910194180000149a910194800", - "38052210080523400805297910194802e00b4480300b0L4;ZDL8;FFf491009468e20291610100f0218c1691840100d084e00d91a363009182018052a80f00f9eb910094eb910094fd7b41a9f31340f9ffc30091c0035fd6ff0301d1BBBL4;FF0aa544a9eb2b05a9e90700f90aa545a9e93300f9094d4d29e", - "a2700f9e91700b9a237005468040091e00314aae1031aaa1f0114ebe933949a020109cbbe010014L4;FB0000b9a8a3f8a46a1c273dbf33e7d7f748dc6b8c0c470171b1c65491c38df289529f333222ddd62940d8754378a67d5115cbd89342e67621ca0d44d47397a28cL8;FFec1b44f9ed4f44f9e8b700f", - "9e80344f9f55f44f9e66f44f9e57744f9f17b44f9e8cb00f9e80744f9fb8344f9f08744f9e8eb00f9e80f44f9e8a700f9e81344f9BL8;FF11fcff17e043169122008052a5110094e1d342f929fcff17e043169122008052a0110094e1d342f954faff17e0431691220080529b110094e1d342f93efcff17L", - "8;FF81e200910227805220af803de82304f9ab510094f63f42f9f43b42f9c80240f9680000b4e00314aa00013fd6c10640f9810000b4c20a40f9e00314aa98510094BBBBL4;FFe1000054a8035d381f0500718c030054c8120035e90f41b299000014a8f35c38e00314aae82b00b9a8d35c78e82300b9a9a", - "37da9ea2703a9a9935cb8aa635d78L4;FB65636f64652070726f746f62756600002d964800000000003100000000000000560000002c0000002d964800000000003100000000000000570000002e000000L8;FF8400805211000014c80080d2e0230039e00300910800f0f2ff270039e80300f990e7ff97e", - "80300aa210200f021281a91230200f063481491e0030091c2018052BL8;FF2901084aab535538a93315384901084aaa635538a94315386901084aab735538a95315384901084aaa835538a96315386901084aab935538a97315384901084aL8;FFe8d302f9df0600b10026005480220291622b0094080040", - "b20811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308eba82400546e010014BBBL4;FF22008052e00309aaa5b10194e03f40f9e10319aa28008052b8f334a9a88733a9a0e1ffb41e000014a9035cf8a1a338a9a98319f800e1ffb41f000014a06301d1L4;ZBL8;FF08011c8b1f01", - "09ebe933899a080109cb090e80520829099b018940a903c100918dfbff97a0077fadb4c35db8e00701ad97b10094000480522100805295b10094BL8;FF63e406910401805222000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f98f270094e80300aae0833291a102009021c00b91a20180", - "52a3020090L8;FFe84f03f9e8430e91ea0000904a613b91e85303f9080000f008b11691e95f03f9e9431a91e85703f9e8431591a04700d1e85b03f968008052e1032a91e96f05f9BBBBBL4;FFbe010294ff0302d1e923016dfd7b02a9fc6f03a9fa6704a9f85f05a9f65706a9f44f07a9fd8300910960403", - "9e9090037150040f9f40308aaf30300aa3b008052L4;FF810000b420835ef822008052a401009421835ff8e1feffb4200340f9220080529f010094f3ffff17e80240f9c80000b40805088be00315aa0201805201ed7cd3L8;FF94c20191c002005481825cf8810000b480025df822008052a101019481025", - "ef8810000b480825ef8220080529c010194810240f9810000b4800640f922008052BL8;FF010300f02170299182008052e2810114080040f9e00301aa090140f93f0900f1a1000054010300f02170299182008052d9810114ff8300d1fd7b01a9fd430091L8;FF2809c05a4a09c05a892e4b29882a022928", - "09c05a6909c05a88260329884640f909208052800640ad282508aa080dc0dae00700ad9f2203a9820241ade20301adBBBL4;FF2801881a1f01186ba1040054084440f99f0208eb01020054540300b4134040f9f61b40f9fa0300aa39008052f50314aac8164038691640381f01096be0179f1aL4;FB63757", - "272656e742073657373696f6e2062617365206b657920c01d2c206e756d626572206f662070726576696f7573207374617465733a20c000204e6f207661L8;FF16090091e00b813df52342f9e20f813de41b813de317813da00b3aad4283c43c4083c33ce107813da103933c4183c63ce00b01ad4083c73c", - "4283c53ce18302adBL8;FF6a0a00f909692138e10313aa50fbff97760a40f9680240f9080116cb9f0208ebc8060054680640f9e10315aae20314aa0001168ba2410194c802148b680a00f9L8;FFe0031faac8410094fd7bbda9f50b00f9f44f02a9fd03009108684539f30300aa1f110071cd0300541f150", - "071400500541f190071000500541f1d0071c1070054BBBBL4;FFe8ab00b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebc3be00541803008bL4;FB6420616e206572726f7220756e65787065637465646c790014ee480", - "0000000004b000000000000007f0b00000e00000034ed4800000000006a00000000000000L8;FFe107823de30b823d32600094e0dfc03de8c341f9e0431e91e1d7c23dc082813ce8bf05f9e0dbc23de2dfc23d610200ad620a803d3bddff97b1feff17ff632d39BL8;FFf5610194fd7b41a9f31340f9ffc3", - "0091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aac10200f021601f91e8030091e00309aa02028052L8;FFe00301aae10309aa22008052f4030aaa8c050094e10340a9ea0314aa2ba040a9290040f97369283808050091280800f920fcffb63f0108eb400300546a692838BBBL4;F", - "Ff44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6e90f41b206000014e91741b2e1030aaa03000014290480d20900f0f2090500a909c48052090900f9f44f43a9L4;FF007c041b007c1b53734860387306005173761e5363060011600a001143d863783f0003eb1380931a757e409340d873783f0000eb69", - "00005473060011757e4093L8;FFe9a10094fd7b41a9ff830091c0035fd6810100f021bc149182008052dea10014080040f9e00301aa090140f93f0500b1e0010054ff8300d1fd7b01a9fd430091BL8;FF1f7d01a92901018b0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6e10200b43f0002e", - "b080400540a2440a9f50300aa00600091f40301aaf30308aaBL4;FFa7210094610e40f9810000b4601240f922008052a2210094611a40f9c10000b4601e40f922008052f30b40f9fd7bc2a89b210014f30b40f9fd7bc2a8c0035fd6L3;ZBBBBBBBBBBL4;FF0088202e1000669e10c201f220ffff541102c0", - "da3112c0da710d51aba20e0054120d11cb40825ff81f0001eb820e005412280c9b000600d1e2031faa1000108aL4;FFc6ffff17c80080d2a1831df80800f0f2080900d107000014e80b41b2a0831df804000014c80080d20800f0f2080500d1a0c300d1a8031df88a14ff97e10300aaL8;FFa00640ad8006", - "00adb3feffb4a80e40f968010036691648ab220500542afd7bd38a0000b528e97bb3a80e00f904000014e00315aa2100805294feff97a82640a9BBL4;FFe10e40f93f0400f10adaff54d2feff172000805201048052ae9e019420008052e10313aaab9e019420008052e1031caaa89e01942000805281048", - "052a59e0194L4;FFc00a00f9400314cb22cf74b3c21200f93f683a381500156b3400148b3a001a8b20010054e003154bb80a1b53bf1200715fcb20388d000054181480525fb31f38L8;FF68020291810100d0218c1691a40100b084e00d91a363009182018052a80f00f9ec9e0094ec9e0094fd7b41a9f31", - "340f9ffc30091c0035fd6ffc300d1fd7b01a9BBBL4;FF1803008b060000141f0400b121600054c6de01941f100031a15f005439feffb505000014e043059181008052c1de0194e05e0035e85341b9e84b00b957ffdfc8L4;FB020300001f000000f5014900000000004e0000000000000006030000200000", - "006f766572666c6f77c320000069020000f5014900000000004e00000000000000L8;FFf65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a871d8ff17e00301aa190340f909a0c0a90a0c41a90078c03d0c5455a9e94700f90e584fa9e86b00f9092042a9BL8;FF0a00001435008052dc563fa95a0700d1948", - "20091dc0200f97b8300d1d90a00b9d68200911a0200b4fb0100b49c0a40f9991a40b99cfeffb4970640f9945e0194L8;FF000d002af30302aa39fcff97e00314aa75170094e10313aa35fcff97801a40b980010034610a40f9680240f91f0101ebe0050054680640f9090180522a040091BBBBL4;FFf7030", - "0aae00315aa2100805223008052aae1ff97e00317aa75ffff17400140fd00a8200e0c00669e8c01c0da8c11c0da8cfd43d34d696c38c1ffff17000400f0L4;ZFL8;FFfdc30091080040f9090540f9c90100b40a0140f92d0500d1eb030aaa6c1540380b3500a981194092ac003837e0031faafd7b43a9ff0", - "30191c0035fd63f0500f1BL8;FFf87e0114082440a9e20301aae00308aae10309aaed7e0114281040b9000040f96800c8376800d037cf7e0114e37e0114e37e0114281040b9000040f96800c837L8;FFf50314aae81340f949068052b30e4bf809692138280400917f0a00b1e81700f9410e0054f7031faa", - "7c000014e11740f9e80f40f91f0101eba06b0054e81340f9BBBL4;FFf70340f9e0c30591a1220091022a8052abbe01940200001417008092818a40a9e0030091f80300919650009400830091e1c30591022a8052f70f00f9a0be0194L4;FB000000000000000052854900000000005b85490000000000000", - "01b1b1b1b1b1b1b1b1b1b001b1b1b1b1b00131b1b001b00000700000000000000000000000000L8;FF810000b4600640f922008052a4be0094610e40f9810000b4601240f9220080529fbe0094611a40f9810000b4e00314aa220080529abe0094612640f9810000b4BL8;FFa43e0194601500b4e10314aa", - "e20317aaf80300aaaa3e0194482740f91f0500b120030054592f40f95b6340b9991100b4542b40f9963e0194e00319aa21008052L8;FF16feff97601a00b5a0f5ffb4a2ffff17898244f83f0500b1810000549fde04a99f2e00f99f6200b91f0900f141180054e00313aae7feff97e0080036811400b5BBB", - "BBL4;FFaf0e0294e802158b680a00f9882640f91f0500b1a0090054610a40f9680240f91f0101eb40310054680640f9966240b92a040091952e40f9490380526a0a00f9L4;FFe9af00f9e03c0054e87342f9e89f00f99c0000b4e10353a9e2031caaa80e0094790a00b4e8bb43b909b343b839008052eadb", - "43b93a008052e88303b9e8bb4779L8;FF91fcff97ea0740f9e8c341f8690f8052ec374229eb2740b9ea9300f8e1230091ea1b40b9e9230039a9058052a8031ff8e00313aac2048052e81302f8a80f8052BL8;FF29610391220300b0428c1091e02700a9e3030091e00308aabe8e0194fd7b41a9ff830091c", - "0035fd6ff0301d1fd7b02a9f31b00f9fd830091080040b9f30300aaL8;FFa8831ff8f38e009468720091610100d021501991a32300d1a2008052e40314aaa8831ff8eb8e0094610100d021441991840100b084403091a32300d162008052BBBL4;FFe82700f9b7020034e80240b20811c0da081540d2080d", - "088b0825019108fd46d308050091f60100b4c90240b22911c0da291540d2290d098b29250191c91a498bL4;FB89734e57714ca87d0f9d441906a28a4ae7347b43050a50be8658d2c5bb819168e296f6c95b3cfeb3846bd1b6d4bb0e6bdac6a28c95d610754bfc363f00000abaL8;FFedc70ba9e51300f9f4", - "0307a9e64300f9e78700a9fe4b04a9eabb1da9f51306a9ef6f00f9f6f30aa9fb6700f9ec7b00f9fae300f9e36703a908b140f91f0900f1BL8;FF0800f0f2081500d1deffff17e90b41b2e92300a9dcffff17280180d20800f0f2081100d1d7ffff173f00156b81f7ff54680240f9e0031faa090540f90a01", - "40f9L8;FF824e0094a8624039f5c342f9f7c742f9e8631639880280d22007c03d0800f0f21b2100d14003803de863019100610c9191e7ff97c8fdff17f83f42f92083c13cBBBBL4;FF29012891a80200b9e8038052a9a200a909000014bf260029a80a00b9df0600f1ab000054e00314aae10316aa220080", - "529bee01947f0600f14b0b0054e00317aaL4;FB446973706c617961626c6546696e6765727072696e74206372656174656420776974682073686f727420656e636f64696e674e6f2063757272656e7420736573L8;FF29000014e00300f9210200d021041491230200d0635c1491e0030091220280528400", - "805220000014210200d021041491230200d063ec1491e00300f917000014BL8;FF680a00f9f44f42a9f65741a9fd7bc3a8c0035fd6e00313aaf60301aae10315aae20314aa2300805224008052b061ff97750a40f9e10316aaecffff17281040b9L8;FFaf6e00944803188be8d302f9f88b49f9580300b4e", - "1d342f9e8cb42f9f98749f91f0101eba0360054e8cf42f9490480522a040091e00318aa09692138e1431691BBBL4;FFa07f0091e1c30091e82707a9b0ae0194280080927f220039680200f9f44f4da9f95340f9f6574ca9f85f4ba9fd7b49a9ff830391c0035fd62800805229008092L4;FF690200548102", - "178b20008052e20316aad6110094800200b4c000f8b635070094080040b91f110071e0feff54050000141f0016eb1700178ba9fdff5404000014L8;FF08010191e103002900210091a22300d121008052e30315aae40316aaa86b3fa9d3ae0094e103402928e340391f05007161fbff54e5ffff17f4031f2", - "ae80740f9BL8;FF1443172ae81345b9e063813de167813de8a305b93a000014e80200d008b140f91f0500f1a9040054e8830291e0032d91e10313aa0204805214210191f3032d91L8;FF620a803d600600ade8034b391f1500714cfeff541f0d0071800600541f110071e00800541f15007101080054f46b", - "41f9f36741f9880240f9680000b4e00313aaBBBBBBL4;FF010040f9f30300aa810000b4600640f922008052a2160294610e40f9810000b4601240f9220080529d160294611a40f9810000b4601e40f92200805298160294L4;FFe8830a3928008052e0230891e143139142008052e96b02f9e86f02f9f773", - "02f9f87702f99d0e0094e1bf4bf9810000b4e0bb4bf92200805299160094e1af4bf9L8;FF740200d094222291610200d021a02291e0030091e3430091a2008052e40314aae80b00f9eb160194681240f9610200d021b42291a32300d182008052e40314aaBBL4;FFe200805284018052d88b0094b4035df8", - "a0e303d1bf7fff97e00314aa4c7fff97e00746ade87340f9681a00f928008052608600ad685600a9ffc30a91f44f45a9L4;ZBL8;FF020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb29030054280108ab8300005410000014e80308abc2010054BBBL4;", - "FFf903002ae00301aaf40305aaf50304aaf80303aafa0302aaf30308aad8ae0094f60300aae0031aaaf70301aad4ae0094fa0300aafb0301aa95d6019400048052L4;FB73656e64696e675f63743200000000003b1a4900000000004e00000000000000640200001300000056657273696f6e4e65676f746", - "96174696f6e646972656374L8;FFe83742f9e92f42f9e8af15a9e83f42f9eb3b42f9eaa310a9e84342f9ea4f42f9e8b700f9e84742f9eba318a9e84b42f9eb5342f9e8eb00f9e85742f9e88f00f9BL8;FFe08f49f922008052a5560194e19749f9810000b4e09b49f922008052a0560194f47749f99f0600", - "b180aaff54f57f49f9f37b49f9350600b47622009104000014L8;FFffa73239e85306f9964cff97e10300aae15306f9e08332912101009021e0339102028052230100b063fc0091c4028052b8000014e05306f9e083329121010090BBBBL4;FF01018052a3f60194200500b408430291e10315aa161000b9", - "085c00a9080400f008e137911f500039602201a9090d40f9e803009120013fd6e80340f91f0d00b1L4;FBfe924800000000004c000000000000005e09000016000000fe924800000000004c00000000000000bd0000000a000000ffffffffffffffff67726f75705f6964L8;FF40010036410b00b5e0031f", - "aad3ffff17e003082ae20313aa430c805206f0ff97c0f9ffb4c3ffff17a80640f91a0101ebe200005489000014e20313aa230c8052BL8;FF080300f008b10891695b0091000940ad0109c03d08e142f80108803d08e002f8c8068052680201a9681200f96800805268a2003908008092000800ad682600a9", - "L8;FFe95b49f94081883ce01bc43d4181873c4281863cea3b48f9e9c706f9e25fc33de35bc33de163c33deaab06f9e053833de18b833de157c33de287833de17f833dBBBL4;FF24008052baa9ff97e11f40f964ffff17e0a30091e10315aa220080522300805224008052b2a9ff97f41f40f981ffff17e0a", - "30091e10314aae2031baa23008052L4;ZDL8;FFff0301d1fd7b02a9f44f03a9fd830091010840a988008052f30300aae0230091440080528500805229f87fd33f1100f13481889ae30314aa5a000094e80740f9BL8;FFa84700d1e97701f9890c40f9e0070aa9e0070ea9e00303aae20f0ba9e4170ca9e62", - "30da9ff230b39ff7b01f9e20f0fa9e41710a9e62311a920013fd6e06b01f9L8;FF483300f9400700ad430b803db7fdffb5f7031caa020000141901805268fa40f9fb5f40f91f0500b160020054690a42b9680e42b97c0241f9e9230429681a42b9BBBBBL4;FF8043843c0043c23cca010a8a8143833c0143", - "c13cac010ccb8043823c0043c83c0a010a8b8143813c0143c73c8043883c0043c63c8143873c0143c03c8043863cL4;FFf40302aaf303012af50300aaa006009400038052010180529e060094400100b4155000a9810000d021c03d91131000b91f500039f44f42a9f50b40f9fd7bc3a8L8;FF692841a9e0", - "8705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a29aa060194fd7b47a9ff030291c0035fd6ff8301d1fd7b03a9f52300f9BL8;FF3f0400f1ebfdff54801240f922008052a3860194ebffff17617e40f93f0400f18b000054608240f9220080529c860194619640f9140080927faa", - "00f9747e00f9L8;FF82008052a80f00f9f28600946101009021f01b91640100f084a00391a363009142008052b30f00f9ea860094ea860094fd7b41a9f31340f9ffc30091c0035fd6BBBL4;FFf5031a2aeb0b40f9fa0f40b92600001408008092f73740f9682600a9080700d11f0d00b109f0ff5483ffff1", - "7e12340f908008092682600a9e1efffb4e03340f9L4;FB6f6e20737461746520636f727275707420666f7220c0001c706f73742d7175616e74756d2072617463686574206572726f723a20c000234275696c64696e6720L8;FFeb0316aaf66740f9f02340f9e3b7803de20713adec2b4ba9e8f200f868008", - "052e0a3803d4d0100149afdff175f030014290100b4f50300aae0031aaaf40301aaBL8;FF61710c8bcb008052280000149f114071630800544d19c039ae1d00128c390e0b8c1140518d00f83761710c8beb0080521e0000149f014871830700544d1dc039L8;FF000114abc2000054f44f41a9fd7bc2a8c0", - "035fd6e00314ab83ffff54000100b000401991a14600940001009000e032919e460094fd7bbfa9fd030091082440f9BBBBL4;FFee2b43a9a90302d1290140f9ef2f40b9f01340f9f11f40b9f20b40f94bfd68d34a631baa7f0a007180cdff54c9aa00a9697d1053ac835778ada35738aa035738L4;FB6c69", - "622e7273001b737071722076312e73656e645f656b2e73656e642065706f636820c01e3a204b657973556e73616d706c6564202d3e204b65797353616d70L8;FF6016005460420091e1030091022a8052abe60094755200a9c2000014a80a00d1e16701f905000014e80b41b2e06701f902000014a80600d", - "1e86301f9e0030b91BL8;FFf40300aaf60308aaa1660194e00313aa210080529f660194400300b4e10314aae20313aaf50300aaa566019428008092d5ce00a9c80200f9f44f42a9f65741a9L8;FFfd03009114d440a9f30300aaf50300b496e2009104000014b50600f1d6c2019140030054c1825cf83f04", - "00b140010054810000b4c0025df82200805298660094BBBL4;FFe003082a7190ff97001200b5b70f40f9f50317aaa28e40f8020e00b4e10240f9200080398000f8b728040091490400d1110000145f2800f1880000542800028bL4;FF9402109102e90091c6040011817a62f821c026cb817a22f83f00001", - "4087c4093c2feffb47f0204ebe000005484feffb400290091340000b081021091207860f8L8;FFffc306d1f40304aaf70303aaf60302aaf30300aaa20400b4f80301aa9ca60094e00316aa210080529aa60094200800b4e10318aae20316aaf50300aaf68300a9BL8;FF810200b021683b91e08300919501", - "00941f1c0072a00000546800805268220039280080520b00001499260194000480522100805297260194a00100b4e00741adL8;FFd394fe17082440a9e20301aae00308aae10309aadc260014fd7bbda9f65701a9f44f02a9fd030091f30302aaf50301aaf40300aa96260094e00313aa21008052BBBBBBB", - "L4;FF750240f9e1cf00a9f70f00f9d70b00b4a00240fdfc0f40f9fa031faa1b138052f80315aa0088202e0800669e17c10192f70000b5008f40fc5a2300910088202eL4;FFa80180d25f0700b10800f0f2a8831cf8c0000054e017c03da0e300d1e003803d7bf8ff9703000014b90180d21900f0f2f7031c", - "aaf8031baae003c03d28008052L8;FFfd7bc3a8c0035fd6edf7ff97fd7bbca9f85f01a9f65702a9f44f03a9fd03009109800091f30302aaf50301aa29fddfc8f60300aaf40308aa3f0500f101010054BBL4;FF0809c05aa0033eadb88301d1b6233529e8e31291a0039b3cf9b304b9b4573429d79a0194e8", - "e312917f0700f1fb4303910001c03da003963c8004005400e4006fL4;ZFL8;FF1521009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f9220080529e9a0094f8ffff17685242a97f1600f9940100b41321009104000014BBBL4;FF21008052a3da0194200d00b4e0874aade8030291", - "e25fc03dda1a0033f30300aa000400ad00f1cf3c0208803d00f0823c1afc0039e00b409100401991c4da0194L4;FB000000000000000001000000000000000100000000000000a45c440000000000000000000000000008000000000000000800000000000000d858440000000000L8;FFe9af03f9e90303", - "aae3031d91e8b303f9e80300aa0002009000c43391e7af02a9e9e700f9f7eb10a9e8bf00f9ee2b04a9fc4712a9f21314a9ecd705a9f5031eaaBL8;FFe8c30091e0431691008542ad0201c73ce277813de06f813de173813d018141ade807409108810991e06b813de167813d41a50094e83349f94083c03c", - "e93f49f9L8;FFffef02f9ebab08a9e89f00b9eae702f9fff702f9fa4300f900330054f9a740f9f88342b9190700b4f3a340f9985a0094e00319aa21008052965a0094201301b4BBBBL4;FF0c010e8a208d212e00a8302e0800261ea8070037ec0700f92c00805202000014ec031faa4a2100914001148b14", - "000e8a096a74fc208d282e0800669e1cc101f2L4;FB2f697465722f7472616974732f616363756d2e72730076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f72617463686574L8;FFe08740ade08707ad002700b4e0c3039195f8ff97c8010014e1430091e20313aa", - "f70b00f9f74b00f911090094e08744adf50300aae85b40f9e0870bade08742adBL8;FF0801805208000039b60000b4a0060091e10317aae20316aaa97a01949c7a0194e00313aa210080529a7a0194200200b4e10315aae20313aa930200a9a07a0194L8;FF23008052240080525691ff97e11740f9e4fdf", - "f17e0630091e10317aae20316aa23008052240080524e91ff97f71740f9e80f40f9080117cbdf0208ebc9bcff54BBBL4;FF5f8b0071610200549f3d00f149430054e8420091a06301d1994100d1e84300f9480080d20800f0f2a8831af88ba3ff97e002c03de83340f9f5031f2abf431638L4;ZBL8;FF688", - "600f8e00313aaadba009430000014e8431291e12302910232805200e10191a7ba00948082c43c8182c53ce0230b918282c63c883e40f9e1431291e037813dBL8;FFe00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209ebe90b0054088c5cf81f0500b1e0090", - "0541efeff97080040b2L8;FFe8430f91e1031baafb5f00f920013fd6e8eb41f91f0d00b101070054e800805249010014f9030891ba0000b4e00315aae1031aaa22008052993a0094683642f9BBBBBL4;FFf2feff17f50300aae00313aa220080522300805224008052b5fdff97610a40f9e00315aaf6feff", - "17e00313aa220080522300805224008052adfdff97610a40f9L4;FFff0308ebc1020054747c019b0800f0d2f30302aa080102cb9f0208eb08020054b40200b4f50301aaf60300aa980a0094e00314aae10313aa960a0094800200b4L8;FFfd7bc1a8c0035fd6b20a0194fd7bbea9f44f01a9fd0300916bfc", - "7bd3f30300aae9031faa280080520a0180528b0300b574e87bd3ebef7db29f020beb08030054BL8;FFa0c300d13ff4ff97a8035db8a8140037a8035ef8ca0240f9490108ebe3160054ea0240f9b4835df84801088be80200f9c90200f988fe60d3e80a00b5800a4092L8;FF41008052a38a0094b30080524", - "05700b4680100d008a9029149408b52080140f909100079130300a9080000f9130b00f9978a00944001805241008052958a0094BBBL4;FFba035df8480317cb7f0208ebc8180054e81f40f9130100b4a8835df8e11b40f9e20313aa0001178ba5ca0194e81f40f9f702138ba0835df85f0317ebc9010054L", - "4;FB00000000000000000800000000000000080000000000000000f7450000000000000000000000000008000000000000000800000000000000b8f7450000000000L8;FFea5744f9e39314adf9bb48a9e9030daae1a3803ded6f40f9e86300f9c8008052e0cf803de43f43a9e0cb44a9e37b42a94a05001", - "41f0500b1003200546083c43cBL8;FF22008052a64a0194611e40f9e10100b408068052606a68f822008052f44f41a9fd7bc2a89e4a0114610a40f9e10000b408018052606a68f822008052f44f41a9L8;FF090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb492d", - "0054080c47f81f0500b1802300546c030094080040b20811c0daBBBBL4;FFe08312ade08313ade0a7803da8d676d3e08753adea03132a89dad59300030291080d0aaae183059122008052e0070dade08751ad290dc0da080dc0daf3830591L4;FB804c420000000000000000000000000008000000000000", - "000800000000000000ec4d420000000000000000000000000008000000000000000800000000000000L8;FF610a40f9680240f9960640f91f0101eba0080054680640f9490380522a040091e00315aa6a0a00f909692138e10313aae8eaff97770a40f9680240f9080117cbBL8;FF68f204f8e8274129611", - "200f97cfe003969220b29680080527b0201397a7204f86882013936f7ffb579feff171f09007121010054ea4740f9691f009148dd7892L8;FFc0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0316d1f30300aae8430691e00301aaff0300f9fa03062af803052af60304", - "aaBBBL4;FFf30308aa081840f9e10b02a9172100f183190054181440f9f40300aaf50302aaf60301aae0430191e10303aae20304aae30305aae40306aae50318aae60317aaL4;FFe8018052e80303a9090000f90a7000f8e0c30091e82300f90bfdff97f31f40f908028052e1031f2ae82300f9e00313aa7", - "f3e0039530300941f04003120030054L8;FFf40301aa1f4300f1e1140054950640f9f9031faa4800805213038052e00700f9ff7f03a9ff7f06a9ff7f09a9ff7f0ca9ff7f0fa9ff7f12a9ff7f15a9ff7f18a9BL8;FF01f17dd3a62a0194b2feff17f63f42f92083c13ceae32291e9d742f9f5c742f9f7cb42", - "f9c80240f9f83b42f940818b3ce9c304f9680000b4e00318aa00013fd6L8;FFfa0356b98100805200001891ff0316b9d7290094e0074091f70356b98100805200001891ff0316b9d1290094e0074091fb0356b98100805200001891ff0316b9BBBBBBL4;FF80faff542a15c0392b1900910d1900d10b3400", - "a94c190012218c0caaeaf8ff361f1900f160f9ff542a19c0392b1d00910d1d00d10b3400a94c19001221a80caaL4;FFd8c4ff97e0f300b9a04700d1d5c4ff97e0eb00b9a04700d1d2c4ff97e0e700b9a04700d1cfc4ff97e0e300b9a04700d1ccc4ff97e0df00b9a04700d1c9c4ff97L8;FFa41201944001", - "00b528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd620008052800600f909028052936a29f89f0200f9f44f41a9BBL4;FF740a40f9680240f99f0208eb61000054e00313aa3692019408038052690640f94003c03d8826089ba9035af80001803d8a060091090900f9fc0b4", - "0f96a0a00f9L4;ZDL8;FFc2008052a8831ff8f2920094f2920094f44f43a9fd7b42a9ff030191c0035fd6fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e0030054e00313aaBBBL4;FF2401805209000014e01300f9a10300f021d02891a30300f063302991e0830091c201805284008052d0c", - "70094e01340f92dffff17e01300f9a10300f021e01d91L4;FB46ffa9fc7e6b060700009bf974a41c7a8bf16c5e0bdbc2f8c63bbd36dd94c5363bc85f019c3ad6ffb68a1a9b7e7db8f2459d2cd9fc3e5c2981098a58ef03a9fcL8;FFe88f00f9e89345f9e82b14a9e89b45f9ea9745f9e92313a9e89f45f9e", - "9a745f9e8ab01a9e8ab45f9eaa345f9e8a704a9e8af45f9e9b345f9e80b00f9e8b745f9BL8;FFf87f49f9580300b4e1d342f9e8cb42f9f97b49f91f0101eb40370054e8cf42f9490380522a040091e00318aa09692138e1431691ead302f9450c0094fad342f9L8;FF00c1c03c01c1c13cf5fb45b9880240", - "f9f36b41f9e94305b9e04b813de14f813d680000b4e00313aa00013fd6810640f9810000b4820a40f9e00313aa98520094BBBBL4;FFa8835cb8bc035df8c8060037bb835df8e10319aae20318aae0031baaa8f20194e84b40b9e9b344b87c6e00a9785601a9684a00b969b204b8e82742a9746a02a9L4;FB", - "9a964800000000003300000000000000c3010000050000009a964800000000003300000000000000b0010000050000009a964800000000003300000000000000L8;FFe80300aa210200f021c01891230200f063481491e0030091a2018052a4008052e80300f909000014e00300f9210200f021c01891230", - "200f0635c1491e0030091BL8;FFa0073ead080dc0daa88318f8a2837bada2033fadd572019400e4006fbff31838b0c302d1a8277229aa2f7329ac377429a0033ead0809c05a2909c05aa0033fadL8;FFf8ffff17f37749f97f0600b140020054e18349f93f0400b140010054810000b4e08749f922008052", - "9d720094e18f49f9810000b4e09349f92200805298720094BBBL4;FF220280522401805209000014a08312f8610300f021d42d91630300f063882391a06303d12202805264018052cfa70094b48352f8afffff17686e00a989010014L4;ZBL8;FF8b0480d2e97ea99b4a0941d2c23240f9297dca9b8a0480", - "52292d0a9b5f0009eb62070054c10a44a9e0230091e30315aa89fcff9796b200940004805221008052BL8;FFaf320194e0c31d91e1c3229102288052ab3201943f0b00b1e1c8ff54a3010014c80080d2e15706f90800f0f2080900d1ca000014e05706f9e80b41b2c7000014L8;FFe04305f9e0032a91e10", - "0009021e03f91a2018052e300009063043d910401805222000014c80080d2e0232a39e0032a910800f0f2ff272a39e84305f98928ff97BBBBBL4;FFa88cac7208f001b8680480520900f0d2602201a9000400ad692200a9f30b40f9fd7bc2a8c0035fd62000805261048052a8020294fd7bbea9f30b00f9f", - "d030091L4;FF08018052eb2702f9e18318ade92b00a9e8e300f9aa020094f7031faa1a05805228008052e82f00f9e8661a9bf70600911b0140f97f0700b1a010005416d140a9L8;FF8806148be00313aa01f17dd302018052f44f42a9f65741a9fd7bc3a8a0020114f44f42a9f65741a9fd7bc3a8c0035fd", - "6fd7bbea9f44f01a9fd030091140040f9BL8;FFc0035fd6202040a9210300b021dc2b91030d40f982048052fd7b43a9ff03019160001fd60820009109600091020300f042bc0291e82700a9e8030091090000b0L8;FF215c1491640100d084e00991a32300d182008052a8831ff8ee820094740100d094a2", - "0391410100f021f01b91a32300d142008052e40314aab3831ff8e5820094BBBL4;FFafc20114a203009042203e91e00316aae10315aac4c20194ff0302d1fd7b06a9f33b00f9fd830191f30308aa6602009440030037080400f008b140f91f0900f1L4;FBdc0000002e000000e4674900000000006a00000", - "000000000750000002e000000e4674900000000006a000000000000000e00000026000000496e76616c696449L8;FFff0900f1010b0054b60000b4e06740f9e10316aa22008052a1c20094e05f40f99c0000b4e1031caa220080529cc20094e05b40f99a0000b4e1031aaa22008052BL8;FF610a40f9c3ff", - "ff17e00313aae10316aae20314aaa3020094760a40f9680240f9080116cb9f0208ebe9f8ff54e00313aae10316aae20314aa9a020094760a40f9L8;FFe9079f1a818308ad0801094be99741b962c3883ce8e300b9e8cf40f9ead700b9e9bb00b9684308f8d51aff97fa0301aae106f8b6fb031faae0031ba", - "ae1031aaaBBBBL4;FFe10319aae2031f2ae0023fd61f0000f1cd000054390300ebc3df00541803008bf9feffb50f0000141f0400b121df0054bee201941f100031a1de0054f9ffff17L4;FB626173655f6b657970656e64696e675f6b796265725f7072655f6b65796c6f63616c5f6964656e746974795f7", - "075626c6963000000000000bdec480000000000L8;FFe8030091e0432d91e203009101c1009197f9ff97e8432d91e9b745f90081c03ce8ab45f9e9c301f91f0500b1e0df803da0210054e0dfc23de9d345f9ea030b91BL8;FFe00309aa42028052f162019468620091c10200f021082a91c40200f084e012", - "91e0030091a363009142018052a80f00f9e8620194c10200f021542491e40200b0L8;FFad0600340d00be528d010d0b4c2180396b710d8b8c00f8b761e10c8b2b0180520a0000144d254039bf0500f1c80100548c1900126ce10c8b81fd0daa3f000bebBBBL4;FFb60000b4e0031caae10316aa22008052a", - "3a20194b90000b4e00b40f9e10319aa220080529ea20194b70000b4e00f40f9e10317aa2200805299a20194e00741adL4;FF89f2ff54600080d2f403002a007f009b830400d1fa0180925a0300cb004000915a03038a5a03008b60028092000019cb0000038a395300911900198b00430091L8;FFe323009", - "182008052e80700f9e6a20094fd7b41a9ff830091c0035fd6810100f021bc149182008052dba20014080040f9e00301aa090140f93f0d00b1a1000054BL8;FF880640a9820241a9090940f96822009120013fd67f0200f9f44f41a9fd7bc2a8c0035fd6800640ad280080526082803c6182813c680200f9f", - "44f41a9fd7bc2a8BL4;FFa7220094c1825ff8e1feffb4c00240f922008052a2220094f3ffff17686640f9c80000b40805088be00314aa0201805201ed7cd39a22009474d64fa9350200b4L3;ZBBBBBBBBBL4;FFe80600d11701178a210140ad610100ad210142ad220d41ad610102ad620d01ad5cfaffb52", - "0000014090180520801098b292100910801148a206b68fc00a8200eL4;FFfb3b40f9f6574aa9f85f49a9fa6748a9fd7b46a9ff030391c0035fd6c000009000a02491b51c0094ffc302d1fd7b08a9f65709a9f44f0aa9fd03029109204039L8;FF161d01941f0400f141020054776240a9e00313aa0103805", - "202018052a01c0194e00317aae10316aae20314aa9e1c0194b85e00a9b40a00f9f44f44a9f65743a9BBL4;FF2809c05a6909c05ae8271529e88f40f909208052e08744ad282508aa080dc0daa0873dadff230ca9e28345ada2833eadce9c019400e4006fff3f0339ea0341b9L4;FFe10b05a9001c40f9d60", - "200cbe05b04a9d602028b1b000014e18a45a9e00315aae11600f9e11e00f92100028be11200f9f35341a9f55b42a9f76343a9fd7bc6a8L8;FF000040f9c59c0014000040f9d99c0014fd7bbea9f30b00f9fd030091011c40f9f30300aa3f0800b1800100543f0400b140010054810000b4602240f9220080", - "52BBBL4;FF770000b5cadc0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300ebc31e00541803008bL4;FB6f20636f6e76657274207468652073797374656d2074696520696e746f206120556e69782074696d657374616d704e435", - "3524643343132324d6963726f736f66L8;FFeab343f9e9cf00f9e9ab43f9ebcb43f9f25744f9e8e700f9e8b743f9f17744f9eea743f9f7df43f9fbe343f9e82b17a9e8bb43f9eac343f9e31744f9f81f44f9BL8;FF1f9d0094f43349f9e0431691a122009102738052aa5c0194e083c53de187c53d150080", - "92e8436c79e057813de15b813de8e30a7920010014e8074091f6a745f9L8;FF3bfaff97770a40f9680240f9080117cbbf0208eb880a0054680640f9e10316aae20315aa0001178ba55c0094e802158b680a00f9951640f9550300b4610a40f9BBBBL4;FFc0020054e1e7076f680700d1e90740f91b011bea", - "0a328052e1fcff54208d212e00a8302e0800261e48010037292100910003098b1800198a496b78fc208d282eL4;ZFL8;FF0800f0f2080500d185ffff17c80080d20800f0f20809009181ffff17c80080d2e0a30039e08300910800f0f2ffa70039e81300f98bf2ff97e80300aae81300f9BL8;FF040300d0", - "84601291a32300d1e00308aa42018052a9831ff8e37c0194fd7b42a9ffc30091c0035fd609200091210300b021200091040300d084e01291a32300d1L8;FFc6000014e8031faa000117abe2570054e1630091ef7cff97df0600b180070054e11740f9e80f40f91f0101eb60300054e81340f92a040091802", - "2029149018052BBBL4;FFa1620091a22301d170a6ff9720f9ffb4a7000014e82740f91f0500b1a0010054a1c20091a22301d168a6ff9720f8ffb496000014ff5b03a9ff2300f9a1620091L4;FB54000000000000007f00000005000000528649000000000054000000000000008d00000014000000a78649", - "00000000004e00000000000000f904000019000000L8;FFe87f08a9ff2309a9e87f0ba9ff230ca9e87f0ea9ff230fa9e87f11a9ff2312a9e87f14a9ff2315a9e87f17a9080a8052ff7f01a9ff7f04a9ff7f07a9ff7f0aa9BL8;FF091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a1", - "94b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8bL8;FF607e42f9618242f9470300140043c83c0143c93ce0230391e80744b9f6e343b9a1e20091fcef41f902278052200700ade82302b9a23c0094786a41f9756641f9BBBBBL4;FFe10313aab7f8ff97770a40f96802", - "40f9080117cbbf0208eb68330054680640f9e10316aae20315aa0001178ba40c0294e802158b680a00f9951640f9550300b4L4;FFf40302aa030000149f0216eb88090054c0058052e10315aae20314aa220d00941f0400f1c1080054f40301aa3f0016ebc2feff54a86a74381fb9007161feff54L8;FFc0", - "035fd61f110071a1090054202040a96102009021a03a91030d40f9c2018052fd7b45a9ff83019160001fd6202040a96102009021d83a91030d40f9c2028052BL8;FFe98c0194fd7b41a9ff830091c0035fd6210300d021702991e00308aa82008052fd7b41a9ff830091db8c0114ff8300d1fd7b01a9fd43", - "0091090040f9e80301aaL8;FFa2008052a80f00f9f28c009468020291610100d0210c2091840100b084003391a3630091a2008052a80f00f9e98c0094e98c0094fd7b41a9f31340f9ffc30091BBBL4;FFc9018052e0030391e00709ada0077cade253803da203d73ca1c302d1e203019103088052e347803", - "de08706ada1037dade233803dd7020191a82735a9e18307adL4;FBd000000040000000e61949000000000054000000000000005900000005000000e61949000000000054000000000000005f00000005000000e619490000000000L8;FFe0c741f9e10314aa22008052a4cc0094570080529f0300146083c", - "63c6183c73c6283c83c6383c13ce077813d6083c93ce17b813d6183c03ce083813d6083c23cBL8;FFe8430639e8031091eabf0639200740ade00600ad35230094e00640ada00302d1808702adca4c0194e8430691a08303d1c1e2009102830091c77fff97e89341b9L8;FF29194a8b29050091280108ab22", - "030054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054092040f9BBBBL4;FFe80740f9080117cbbf0208eba8070054e80b40f9e10316aae20315aa0001178ba7ec0194f902158bf8df40a9f90f00f91f0319ebe9010054390100b4e00317aaL", - "4;FB08000000000000000800000000000000c47d420000000000556e747275737465644964656e74697479496e76616c69645072654b65794964496e76616c696453L8;FF891a498b29050091200108ab02080054e10313aaefecff97560300b4610a40f9680240f9b70640f91f0101eb40080054680640f", - "9490180522a040091e00316aaBL8;FF2c000014f9031faaf46b45a9f82300f99f021aebc0030054080e805238070091f70600d1c97e089b3627089ba0c301d1e10314aa9f0d0094e80740f9a0877eadL8;FFe00319aaf90b40f9e1d342f9c3fcff17400100d000a02491a76c00942000805201788052ab6c", - "00942000805201088052a86c00942000805201048152a56c0094BBBL4;FFf60300aaaeac0194e9030091a86300d12091009119860094b7835ff89701f8b6f9031faae00319aae10317aaa9ac019436008052e9030091a86300d120910091L4;FF1b000014750a40f9680240f954fc41d3080115cb9f0208e", - "ba8010054b40000b4680640f9e20314aa0001158ba10e0094a802148be0031f2a680a00f9f44f42a9L8;FF17038052e88307911323179b680240f9a80000b4600640f901f97fd3420080529fac0094e827039118070091e1031aaa00f1cf3ce8ef40f91f4300f16002803dBL8;FFe8bf45b9e1c20891eac7", - "42f9fbcb42f9208717ade89308b9e11f00f9a1170054e20f4ba9e0031691e56340f9e4031faa40dcff97e8c342f9200bc03dfbc742f9L8;FFe29340f9020000143a008052e3074da9c0220a91c637fe97e0fbc33de1ffc33dd4220b91e207c43dd5220c91c9220d91800600ade003c43de187c53dd8a20d9", - "1BBBBBBL4;FF22020054e80f41b25d000014e00302aaf50302aaf9150194f40301aac0000036740b00b54d000014e0830091e92b02a9c5f10094b70240f9e80640f91f0114ebL4;FFe10315aa22008052a5140094e11341f9410d00b4e01741f9660000149c140094c0018052210080529a14009420fa00b", - "4a80000d008bd349118fc78d3090140f9L8;FFe1010054a81e40391f91017181010054a82240391fe9007121010054280500511f0d007163030054ea031f2a8800805222018052e30314aa1a0000143f110071BBL4;FFe8b70039e87f40394901094aebbb003908010c4ae9bf0039e87f003928008092e18", - "340ad680200f96082813c6182803cda0100b4e00316aae1031aaa22008052L4;ZBL8;FF1f0500b1c1dfff54e8031faa080113aba3060054800100f000a00c91a3940094f3031faa080c47f81f0500b121e3ff54e8031faa080113ab63050054800100f0BBBL4;FF8a0340f9e01740f94801088b882700a90", - "8fc60d3482100b5080840921f1900f162210054017c0353412200343f040071200100543f080071c1faff54a1a300d1L4;FB696e204e6578740098204900000000004900000000000000e60000000900000098204900000000004900000000000000fb000000140000009820490000000000L8;FFe8ef00f", - "9e86344f9e86f00f9e86744f9e85f00f9e86b44f9e8e300f9e86f44f9e9a30aa9e87344f9e80700f9e87744f9e83f00f9e88344f9e8f700f9810000b4BL8;FF080d088b0825019109fd46d30800098b080500911f0109eb681200548e0000148002039112170094080040b20811c0da081540d2080d088b0", - "825019108fd46d3L8;FF0a0000d04a713e91e9a305f9e9c32791e8fb04f9a80000d008710391e9ab05f92901009029013091e8af05f928008052a04700d1e96f06f9e1833291e95706f9BBBBL4;FFfdc30091f60300aae00301aaf40303aaf50302aaf70308aad9cc009408048052090400b029210b91f30", - "300aaf80301aae92300a9080400b008611d9189028052L4;FB6b796265725f7072655f6b65796c6f63616c5f6964656e746974795f7075626c69635265636f726453747275637475726563757272656e745f73657373696f6eL8;FF1f0500b1c10000549f5e00a99f7e01a9977e02a9981a00f99f3200f9e", - "10314aae20313aa27060094c00300b5e1031faad5ffff17c1010054e1031faac1ffff17BL8;FFf5740194fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa0103009021d02891e8030091e00309aac2018052L8;FF0001098b3a120094da0300b4e1d342", - "f9e8cb42f9f60700b9f63749f91f0101ebe0d50054e8cf42f9490180522a040091e0031aaa09692138e1431691ead302f9BBBL4;FFc082c53ce123803df9ff4039c182c03ce10b00adc282c43c020119cbb80202ebe20302ad02010054e002198be10314aae20315aaa2b401942803150be8ff0039L4;ZDL", - "8;FFe10318aa22008052a5b40094ab835ff8f91b40f9bb0d00b4e0031caae1031baa220080529eb40094ab835ff8f3031f2afb031faaf60300f902000014f3031f2aBL8;FFe287c13d69060091e0833291000500ad0209803de9f702f919ebff97fc9740f9e89b40f91a008092fafb02f9e87300b4090380", - "52fb031faab7020090f7d61491L8;FFf9ff04f9a1420291a22302d182f5ff9780f8ffb444010014e82745f91f0500b1a1000054ff2705f9f82b05f9ff2f05f9ff630ab91f0800f101340054a02302d1BBBBBL4;FFaaed8dd2680eaef2a9ccadf28accadf2a8accdf2a9ecccf22a4ccef2e86deef2298fedf", - "2ea8decf2080008ca090009caf30302aae8a700a928000aca6aae8cd2L4;FF63080054f9031faa35200091d70600d1f60313aab47a79f8e00314aa2305009439070091d40281a8ff0219eb41ffff54600640a9e8e30691a8040094e8df40f9L8;FFf65741a9fd7bc3a86e000014e80300aa098d40f83f050", - "0b1a0000054f30300aae00308aacb020094e00313aa088c48f81f0500b1e0ebff54f44f42a9f65741a9BL8;FF2104005408200091200440a9a92300d10a0000d04a911e91a8831ff8020300f042dc3791e9ab00a9e3230091b9840194fd7b43a9ff030191c0035fd60a100091L8;FFe10318aab384009440", - "008052e1031faae2031baae30315aae4031faadad6ff97630100d063a02c9120008052e1031faae2031faab884009440008052e10317aaBBBL4;FFb6035ff858ffff17a08300d1e10316aa220080522300805224008052b4b7ff97b6035ff85cffff17a08300d1e10316aae20318aa2300805224008052ac", - "b7ff97L4;FB655f6b65795f696474696d657374616d704d6573736167654b65796369706865725f6b65796d61635f6b657969767365656450656e64696e674b796265725072L8;FFafc40094eccb40b9eb03142af500001428008052e85f00f9fc7340f9ba0000b4e06f40f9e1031aaa220080529cc40094", - "fafe48d3b80000b4e00319aae10318aaBL8;FFe20313aae3fcff97a00100b4c9000014c1c20091e20313aadefcff97000100b4d6000014e01c00b5e00313aab7fdff97e80301aa40010036481d00b5e1031faaL8;FFa80302d14900009029f11691e8a703a948008052090100b029613b91eae30091a0470", - "0d1e8271ca9080100b008352d91e82b1ea90a078052c8048052ff2719a9BBBBL4;FFe00315aaf44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8a3e40114541109cbe00313aaf50301aae10308aae20314aa9de40194c8e279d36002148b021116cbL4;FB20c004203c3d20c0002f636172676f2d7265676", - "9737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f62797465732dL8;FFe8a705a9080200f008112e91e8ab07a9ea08805288008052ffa702a9090200f029f12c91e9ab04a9290080d2a91ac0f2e8ff03a9e8a706a9a5e40094881e40b9BL8;FF03000014080f", - "0091a8831cf8a0e300d1945a0094e12b40f9280400d11f0d00b1e8000054e82f40f9f40300aa22008052e00308aa9a640194e00314aa444dff97L8;FFc0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4600640f9220080529e640094610e40f9810000b4601240f9220080529964009", - "4611a40f9BBBL4;FFdf0208eb29f7ff54e0230091e10318aae20316aa2300805224008052b497ff97f80f40f9b1ffff17e0230091220080522300805224008052ad97ff97e10f40f9L4;FF610000b481ffff54f4ffff178002109121008052e22740f9820202f9010800b9f55b42a9d1ffff173f0800f966", - "000014200000b0f55b02a9030082d2f76303a9L8;FF7f2204a9f30b40f9fd7bc2a8c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aaa101009021801391e8030091e00309aa82028052e4a40094BL8;FF8842403969424039aa02000ad6020a0a1f01096be0179f1abb2401948846403", - "969464039f503002a1f01096be0179f1ab5240194884a4039694a4039b502000aL8;FFa80a40f9c002803dc80a00f9140300b4e00313aae10314aa22008052f44f45a9fb0b40f9f65744a9f85f43a9fa6742a9fd7bc6a89a240014c80240f91f0308ebBBBBBBBL4;FFf44f45a9f65744a9fd7b43a9ff8301", - "91c0035fd60a0140f9290100cb4a01008be0031faa0a2500a9f44f45a9f65744a9fd7b43a9ff830191c0035fd6e82b00a9L4;FFa3180094e001805221008052a1180094801000b4a80000f008412a91150380d2090140f9087140f8f90b40f9f80300aa1500f0f27c008052090000f9f6018052L8;FF7602", - "00b4335040a9380200f018e30591170040f9b9730091750200f0b5a21791e8164038e3030091e00313aae10314aae20315aaf96300a9a8730039b5180194BBL4;FFe89b40f909008092610bc03de03b803de043803de03bc03de88b00f9e87b00f9681200f90800f0d26182823c6006803d692200a930000", - "014e082c03ce88241f8L4;ZFL8;FFa9431738a97357384a01084a6b01084aaa531738aa8357382901084aab631738ab935738a9731738a9a357384a01084a6b01084aaa831738aab357382901084aBBBL4;FF608649a9e8e3009139af0094e8e340391f05007121020054c80300d008210c91090480522e0", - "0001439008052752e40f9682640f9bf0208eb21fbff5460220191L4;FB737071722076312e73656e645f63742e726563762065706f636820c01f3a2043743153616d706c6564202d3e2043743141636b6e6f776c6564676564001b7370L8;FFe8ef43f9e8af15a9e8fb43f9eb0b44f9e8b700f9e8ff43f9e", - "9a318a9e80344f9e90744f9e8eb00f9e80f44f9ea2311a9e81344f9ea2744f9e82f14a9e81b44f9BL8;FF6b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0d009104000014eb031faa0d0000144b0080522c0100348c0140b28c11c0da8c1540d28c0d0c8b8c250191L8;FFc90080d20900f0f2294500", - "911f0109eb40840054e02fc13de133c13de0031791e237c13de3032d91e4833291210100b02164319102018052e02b833de12f833dBBBBL4;FF00801891bdf80194ff0303d1fd7b08a9f74b00f9f6570aa9f44f0ba9fd03029109704039f30300aaf40308aaa90100343f0d00716108005460a240a9090d4", - "0f9L4;FB652e7273002966696e6765727072696e742076657273696f6e206e756d626572206d69736d61746368207468656d20c00420757320c0001b66696e6765727072L8;FF8282843c8182803c8082813ccaffff17e08742ade00314aae21fc03de84340f9a0873aade08740ada203973ca80318f8a08", - "738ade28341ada28339ad56f3ff97BL8;FF7262ff97a0f9ffb47d0000143f1800716c0300543f140071e00500543f18007161080054a8835ab848000037b9831af8e1d20191a22301d17363ff97e0f7ffb4L8;FF21800991ae78009488e20791000540ade8f36879e8e30a79e057813de15b813dbc010014", - "f6c744f9e04316910123009102738052a2780094f8031f2ab7010014BBBL4;FFf32b40f9480080d20800f0f2680600f9a88357f809008092690200f9e80100b54c000014e90313aa04000014e84340f90801168b090d00d1f32b40f9480080d2L4;ZBL8;FF7ffe12a97ffe15a97ffe18a97c42003960828f", - "3c7f220739686a1da9685a1ea998ebffb55fffff17c50100b0a5603191e103019182820191e0031f2ae3031faaBL8;FFe00301aa2a0900d13f09007149819f9ae90000b43f0500f161020054a10200d0213c2b91e2028052db380114ff8300d1fd7b01a9fd430091a10200d021002b91L8;FF68621c91220", - "101adc00644adc21ec03d60d6813d61da813dc0864fad62d2813d000500adc08659ad68621b91000500adc022c13dc11ec13d68e21b91010100adBBBBBL4;FFf40300aae003082af60303aae20303aae303132a58efff97e90300aae00314aae30316aa89fdffb5740040f9820640f95f0015eb091a00548", - "10240f929008039L4;FFf85f44a9fd7b43a9ffc30191c0035fd6e0030091e10316aae20315aa230080522400805283e9ff97f60b40f9dfffff17ff0302d1fd7b06a9f44f07a9fd830191L8;FFe3030091e92301a9c2080194fd7b42a9ffc30091c0035fd6ffc300d1fd7b02a9fd830091490200f029813d9", - "10a0000904ab12791400200f000403e91e92b00a9BL8;FFe81f00b9e12b00f99471ff97e8c30291e0031aaae10318aafa2700f9345f0094e8c34239a8010036e8e34239490080d20900f0f21f0500716c080054e08744a9L8;FFa80000b4a00240f901f97fd342008052a3880094e8030a91930200f90001", - "c03de81740f9a002803da80000b401f57ed3e0031aaa4200805299880094f41340f9BBBL4;FFe0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9acc80194fd7bbda9f50b00f9f44f02a9fd030091a87cc39bf30300aae9031faaL4;FB0000000000000000080000000000000", - "0080000000000000074034600000000000000000000000000080000000000000008000000000000008006460000000000L8;FFe0031aaae10318aa22008052f40309aaf9030eaaf6030b2af8030c2aa0c80094ee0319aaec03182aeb03162ae90314aa750100b4e0030eaae10315aa22008052BL8;FF60de", - "40f922008052a548019461e640f9810000b460ea40f922008052a048019461f240f9810000b460f640f9220080529b48019461fe40f9810000b4600241f9L8;FF080040b20811c0da081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aa080c48f81f0500b18002005", - "428fdff97080040b2BBBBL4;FF4a7141f8cb1500330d0d00b90c2901a90b810039c0035fd6e90300d029892b916a02805209a900a92900805209010039c0035fd6e90300d029d52b916a038052L4;FB180000000000000008000000000000005c83400000000000e41f40000000000010000000000000000", - "8000000000000000886400000000000e41f400000000000L8;FFff830f91f44f42a9fc5741a9fd7bc3a8c0035fd6140700b4f50303aa9ce80094e00314aa210080529ae80094200900b4e10315aae20314aaf48300a9a0e80094BL8;FF741a00f93f0400f18b000054602a40f922008052a2680194610240", - "f9742600f97f6200b93f0400f17f7200b97f7a00b98b000054600640f92200805298680194L8;FFfacf40f9e002803de9d302b9214b803dec030b915f0b00b141d6ff54f3feff178083c03ce8430f91000d803d888341f8e9035039e80b02f9e8430691a9090034BBBL4;FF22008052340600b4e30314aab", - "fa80194000600b520008052e10314aaada80194a083dd3ca183de3c0900809208d300a9a1035bf8f40740f90083813c0183823cL4;FFe14b40f9011800f9540100b4220000d0210000d08006009142ac40f921b040f9540000f9e20301aa340000f907000014f4af40f9d4feffb5340000b094620291L8;F", - "Fa802180be83f04392100001415020034e8430391e10317aaf902028b0001158ba7a80094e89b40f960020191e14303912200805208050091e89b00f9cba80094BL8;FFc21a0054e80700b9e8430691e04303910a290194880200d008413591ff7f01f9000540adff7b01f9f30700f9e08715ad000941ad0", - "8088052e8bf0a39e08b16adL8;FF290c40f9e163179120013fd6fa034bf95f0f00b161030054e8008052f6e742f9e8e3163949008092f5e342f9c80240f9690200f9680000b4e00315aa00013fd6BBBBBBL4;FFfe110194f70301aac0f80736b90000145f2800f1880000542800028b08f1df38680ff837e", - "0230091367a0094e80b40b9681a0037e80f40f9ea0640f9490108ebL4;FFe0f300b9a04700d1d6c2ff97e0eb00b9a04700d1d3c2ff97e0e700b9a04700d1d0c2ff97e0e300b9a04700d1cdc2ff97e0df00b9a04700d1cac2ff97e0db00b9L8;FF410c0054693640393fb50071e10b0054694a40393fb5007", - "1810b0054695e40393fb50071210b0054f40308aa680240f9699240b86ae240b8a05300d1e1230091BBL4;FFe317c03de326833de222833de11e833de01a833d7f6600b9e2aac43de3aec43de4b2c43de0a6c43de1a2c43d7f0200b9e20f02ade2b6c43de10301ade40b03adL4;ZDL8;FF4afd46d329010a", - "8b290500913f010aeb89040054280108ab830000541b000014e80308ab22030054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8bBBBL4;FFe9ffff179c008052f3d745a99f0314eb80170054680b40f98a070091080500d1090114ab2821889a090e80520969099b682b01a9e81740f9eaaf43", - "a9392900a9L4;FB97021be16a616a70eec33090a9c57de84c2d12022f005e16bc2dfeb0758af76124dfd9c80e34e2c4c47b8b98c369fbd6ecaba79744f74abfa951a28cf47c80e1L8;FFe89b47f9e96f00f9e9bb47f9eaa31da9e8a347f9ea9f47f9e8f700f9e8a747f9e8ab05a9e8ab47f9e8a70fa9e8af", - "47f9e84b00f9e0032b91ebfb00f9f74700f9BL8;FF9c8301914afeff17e002009000202e91a6500194f80300aae043169122008052a0100094e1d342f9e00318aad4fbff17f90300aae04316912200805299100094L8;FFa10302d16908c0f2a87f39a9a8273ca9af5000944083cf3ca88355f8bb0353f8b", - "5df73a920b7803de83304f9e8f304f94003803dffa71139e89740f91f0500b1BBBBL4;FFf44f47a9f65746a9f85f45a9fa6744a9fc6f43a9fd7b42a9ff030291c0035fd62000805201048052aaf00194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9L4;FB6563656976657220636861696e206b65790", - "000000000000072984800000000003300000000000000110100001500000072984800000000003300000000000000L8;FF0deaff97e10300aa210900b5a80640f91f011aeba9040054e00313aa5cf0ff976008003728fc60d3480600b5200840921f1800f182060054217c0353a1060034BL8;FF020300d0", - "42601c91e3030091e82700a9c0700194fd7b41a9ff830091c0035fd6ff8300d1fd7b01a9fd430091080040b9a01300d1a8c31fb8b2700194fd7b41a9L8;FF36250094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb4814005472000014fa031faaf9ab49f9f80", - "7409118830991BBBL4;FF69bcff97400741ada88352f84203c43c1f0500b1a0873dada2039d3c60070054408742ad4203c73ca90359f8e84b00f9e2838e3ce0838c3ce1838d3ca0877dadL4;ZBL8;FFc21e803de80b02f9adb00094b4000014f5fb40f9561700b49db00094e00316aa21008052390080529", - "ab0009480fcffb4a1020191e20316aaf70300aaa0b00094BL8;FFe0032d91fc58ff97e85346f91f0500b120600054e85b46f9e9f31691e02bc33de95b04f9e9fffff029710c91e8c303f9e8fffff008a10b91e85f04f9e8c31691L8;FF0a078052001f813dff4305f9e84b05f9ff4f05f9ea5705f9e86305", - "f9e96705f9ab300094e1eb43f9810000b4e0ef43f9220080529a3000949530009420028052BBBBBL4;FF3b3340b9d50b00b4380740f9a0000294e00315aa210080529e000294601200b4e10318aae20315aaf70300aaa4000294381740f9b80a00b43a1340f994000294L4;FFe023009129f87fd33f2100f", - "13481889ae30314aa0c000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a9L8;FFb8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcb9f0208ebe8040054340100b4680640f9e10315aae20314aa0001178bBL", - "8;FFf2800114ffc300d1fd7b02a9fd830091050040f9e80301aa210300b021003091030300f063902991a9600091260300b0c6002f91a9831ff8290300b02b812f91L8;FFe1031faa2200805223008052240080525497ff97e02342a9990a40f9490180520968283808050091e81700f939f8ffb5e8031fa", - "a982680b9f8f8ff35e9031faaBBBL4;FF80feffb4e10317aae20314aaf50300aaabc00194e00317aae10314aa220080529fc00194020000143500805228008092755201a9685200a9f44f47a9f72b40f9L4;FB656664343938356335303939306231343131366236643835366166303938352f6c69627261", - "72792f616c6c6f632f7372632f737472696e672e72730000000000L8;FFa103963ca2877ead00410191a0039c3c8083813c8183833c8283823c35170094a0077bada8035af8a20f7cadf42f02f9e82b02f9480080d2e007813d0800f0f2BL8;FF6a0a00f909692138e10313aa50faff97e00314aa088c44f", - "81f0500b160000054e10313aa75fdff97950a40f9550300b4610a40f9680240f9960640f91f0101ebL8;FF22008052a6400094c10e40f9a1fdffb4c01240f922008052a1400094e9ffff17681a40f9280100b4090d8052e00314aa017d099b02018052f44f42a9f65741a9BBBBL4;FFf70300aa1f0400b14", - "1fdff54e043059181008052c7e00194a09f0035e85341b9e88b00b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aaL4;FB634b657920646573657269616c697a6564207769746820c00f20747261696c696e6720627974657300c0013ac000012bc000c00010626164206b6579206c", - "656eL8;FF480200f008010191e9030091030200d063802191040200f08400119100210091e223009121008052e82700a9d0e00094480200f0e003142ae103142a08e14039BL8;FFfd7bc2a8c0035fd60001805201048052bb600194fd7bbda9f50b00f9f44f02a9fd030091f40302aaf303012af50300aa9", - "7600194000580520101805295600194L8;FFe86b00b9f7ffff17680240f9080540f9190101ebe2000054aa000014e20313aa430c80528ff5ff97e10300aaa10a00b5680240f9080540f91f0119ebe9030054BBBL4;FFe083803cb6831ff808010aaa0ad49052284108aa2a00a072097dd59b28a10a9be90f", - "40f9e9a301a9a8df3ea9b9a00194a0010037eba740a9e8031faaea0f40f9L4;FFe3ff9f525f00036b6dffff54436c1c53e401809283c023cb0400038b006863f8030840f99f0003eb80000054000080d21f000039007d20d405804039a3100012L8;FF84001891a363009162008052b30f00f9f0a0009468", - "620091810100f021501991a40100d084801891a3630091a2008052a80f00f9e7a00094e7a00094fd7b41a9BL8;FFe00314aa0105805202018052a420019420008052eaa340a9090817aa680200f96a2601a9f44f45a9f71b40f9f65744a9fd7b42a9ff830191c0035fd6750a00f9BL4;FFad200094c00000", - "b000203291a7200094c00000b000803291a4200094ff0301d1fd7b03a9fdc30091080040f9090540f9490d00b40a0140f9410180390101f8b7L3;ZB" + "BBBBBBBBBL8;FB0000000000000000000000000000000000001b1b1b1b1b1b1b1b1b1b001b1b1b1b1b00131b1b001b000007000082775f19328d6db5d6cb6d0b4c24000000c300L8;FF7c03088b600800549f0b00f1812200f983060054892240a9960a40f9e8a700a9e8031baa05000014e8031baa9c070", + "0d19f0700f1a9050054a8ffffb4e9af40a9BL8;FF1d25019461e640f9810000b460ea40f9220080521825019461f240f9a11100b460f640f989000014610640f9810000b4600a40f9220080520f250194611240f9L8;FF832bff97e10300aa20008052fd7b43a9ff030191c0035fd69b33ff97fd7b43a9ff", + "030191c0035fd640fdff9000803e91c520009440fdff9000e03e91c2200094BBL8;FF08008012680200b93000001448008052680200b92d000014e81343b8e93740b984ffffd084001c91f9e343a9a8831fb8e8434139e0031faaa9b31fb8e92740f9L8;FF07000014e80b41b2a0831df814000014c80080", + "d20800f0f2080500d1e80700f9e02300917a6bff97e10300aae10700f9a1fdfff021e02091a3fdfff063a42191BL8;FF9f02073881420191e003082ae20313aa12f5ff97c00f00b540fcffb4d7ffff17890240f93f0500b1810000549f5e00a99f6201a99f2600f91f0900f1a10f0054L8;ZDBBBL8;FB890", + "000002e00000042024000000000006a00000000000000f30000002e00000042024000000000006a00000000000000950000002e0000001100000000000000L8;FFe09a0054e81340f9090380522a040091e00317aaea1700f909692138e16300918f92ff97ba000034818a4329e36300918000805222a5ff", + "977f0600b160100054BL8;FFfd7b01a9fd430091e10b00a9e10300912200805204000094fd7b41a9ff830091c0035fd69f0001f1e1210054fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9L8;FFf44f42a9f50b40f9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091130840f9f40308aa330", + "200b4160440f914050094e00313aa210080520d050094BBL8;FF4a25019129194a8b29050091280108abe21c0054694e41b949020034290140b22911c0da291540d2290d098b2925019129fd46d329050091340108ab63010054L8;FF080014eb23100054ff0208eb09010054e0e30091e10317aa2200805", + "2ce43ff97f42344a91f0114eb23100054e81f40f9e10315aae20317aa0001148b15450094L16;FFe9a31da9e8cb42f9e9d342f9e8f700f9e8cf42f9e82f00f9e8d742f9e84b00f9e8e342f9e9a30fa91ac50094eb1b43a9ed031caae0bf46a9f00314aaf16740f9BBBBL8;FBd0a342000000000098a24200", + "0000000054a5420000000000e0a1420000000000ef104000000000004e0000000000000091070000130000003d0f400000000000L8;FFa98316386901084aabb35638a99316384901084aaac35638a9a316386901084aabd35638a9b316384901084aaae35638a9c316386901084aabf35638a9d31638BL8", + ";FFf30300aa3f0002716200005435008052080000143f0020716200005455008052040000143f404071680080521535889a680240f9080114cbbf0208ebe8000054L8;FFa04700d182c2ff97e04300b9a04700d17fc2ff97f903002aa04700d17cc2ff97f603002aa04700d179c2ff97e8074091e98b41b9", + "08411d9109010039e98341b9BBL8;FFb4035bf8d9feff17a04301d1e10314aa22008052230080522400805286e0ff97b6035cf8dafeff17a04301d12200805223008052240080527fe0ff97a1035cf8L8;FFe8f304f9e89740f91f0500b121f7ff54baffff17e89348b9208757adf7e342f9a00302d1e103", + "1faaa80315b8e8e742f9e2031f2aea1700f9e80f00f9e8d345b9L16;FFa02302d1766201a9685600a9b8ddff97e0430f9144deff9790000014e8db43f9e0ebc13de9030b912003029128710ff8680e00f90800809220718e3c6082803cBBBL8;FFa9efff54e00313aae10317aae20315aa23008052240080", + "5287000094770a40f975ffff17e00313aa22008052230080522400805280000094610a40f97cffff17L8;FF1f0109eb2816005426000014fa031faaf69f49f9f407409194820991df0600b180220054806203910f290094080040b20811c0da081540d2080d088b08250191BL8;FF8806148be00313aa01f", + "17dd302018052f44f42a9f65741a9fd7bc3a816f50014f44f42a9f65741a9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091L8;FF02d05f3804e05f78541000124301003464000034bf000039007d20d404805fb8e3ff9f529f00036b6c000054bf000039007d20d4836c1c53e5018092a3c023", + "cbBBL8;FF2801088b49010b8b0801098b090140b22911c0da291540d2290d098b292501910819498b140500913f0700b1f60f00f9c001005400c30091ca1e0094080040b2L8;FFe00313aa088c4ff81f0500b1400000542eefff9775de4ea9970100b4b822009104000014f70600f118630091e000005401", + "835ff881ffffb4000340f922008052L16;FFb5b00094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4316d1ff0300f9f30308aabc8302d1080040f9fa431091fb830291f40300aaBBBBBL8;FB656d6f74655f6964656e746974795f7075626c696373656e6465725f636861696e", + "72656365697665725f636861696e7370656e64696e675f7072655f6b657972L8;FFf40b40f9980100b4b322009104000014180700f173620091e000005461825ff881ffffb4600240f922008052129d0094f8ffff17880240f9280d00b40805088bBL8;FFe00315aa6a0a00f909692138e10313aad1faff9", + "7770a40f9680240f9080117cbbf0208eb28070054680640f9e10316aae20315aa0001178b161d0194e802158bL8;FF13f9ff97e85b43a9ddffff1720fdffd000c03491cd18009420008052c1018052ad18009420fdffd00040399122fdffd042203491e1068052b318009420008052BBL8;FF1ffd007101f", + "bff5409088052a18302d1220108cbe90301912001088b1d5d0194683340f960030191e10301912200805208050091683300f9aa580194e8031f2aL8;FF080540f9882600b4a02302d152f5ff97f50301aa804d0037a8fe60d3c82300b5a00a40921f1800f102240054a17e035321240034280400511f3900", + "71c8060054L16;FFe20315aa2300805224008052f8000094770a40f9b0ffff17e00313aa220080522300805224008052f1000094610a40f9b7ffff17e00313aae10316aae20315aaBBBL8;FFa18b0094e80300aae00301aaa8fd073621000014e80741b2400000145f2800f1880000542800028b08f1df38", + "080af837e00300918f2e0094e80340b9a8020037L8;FF200540ad08800039c80ec0dafc0300aa01048052081002f8e8074091e20314aa000400adc0fdff9000800f9108c1359103048052e4031caa2505805206048052BL8;FF930a00f9f44f42a9f65741a9fd7bc3a8c0035fd6c0feffd000800491c7f80", + "094fd7bbea9f44f01a9fd030091f30300aa148000910180009100008092ddf80094L8;FFc8060094e0feffb528008052880600f909028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd6ff0301d1fd7b02a9f44f03a9fd830091010840a908018052BBL8;FFabe35538a9c31538a9f355384a01084a6", + "b01084aaad31538aa0356382901084aabe31538ab135638a9f31538a92356384a01084a6b01084aaa031638aa335638L8;FF883100b8e8036b396081c03ce92309b9e903092a6181c13ce8630f39883140b86c7e0e91eaeb01f9ea5745f9eb5b45f9490300b9693e0f91f55340f9483300b8L16;FF210080", + "521bbd0094c0fe00b4e16f40f9e20314aaf70300aa1ebd00941a0500143f0500b180200054600742ade0831d9168234039e1c30391e97b00f9e08709adBBBBL8;FB83e900000821b001438b3a1128e3102805f6cbe5d42d07a138d42ab285635bbcf5d6d23d5bfa6e900a646b4e883267f4f0d8141283035", + "e3c0e7dc2729373a237L8;FFa10240ad5f0109eb084000b9010000ad01fdff54f30300aae0430a915ce3ff97e00313aaf34f41f9e2ffff17e84b41f9f84f41f9f40317aae80f00f9990300b5BL8;FFa01240f9220080521b0d0194a11a40f961f4ffb40804805205000014a11240f93f0400f1cbf3ff5408", + "028052606a68f822008052100d019499ffff17c80080d2L8;FFa9030054a8999952e02300918899b972887ea89b01fd63d3f2ffff97f50f40f9e10740f93f0015eb00030054a899995249018052e083c03c8899b972aa060091BBL8;FF00983691e9ab05a9a9a300d1a8831df8080000f008b10391e9a306", + "a9a8c301d1e1630191cb480194740a40f9680240f99f0208eb61000054e00313aaae470194L8;FFc20600542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aebe9050054280108ab8300005426000014e80308ab82040054L16;FFe8ab00f9e81f42f9e92312a9e82", + "342f9e92742f9e8ab1aa9e82b42f9ea3b42f9e9a309a9e82f42f9e93342f9e8df00f9e83742f9e8af15a9e84342f9eb3f42f9BBBL8;FF69f202f8e98340b968de0039e80b4179699203b849fd60d368d2037848fd70d369ba0079e9ab43a9687a0139e81340f975e2003968f205f8a8835838697206f8L8;", + "FFe9bf00f9e81f40b9e8030639e10740f961cdffb4e01740f91a000014e9031091aafffff04a21089180fdffd00090199108210091e1c30e91e9db01f9eadf01f9BL8;FFa08b3cade18341ada18339ade28342ada2833aade18340ada18338ad01f5ff97a0877bade80b41b277010014e1430091e20313aa", + "f70b00f9f74b00f9f76700f9L8;FFedffff17e80300aae00301aae10302aae20303aae30304aae40305aae50306aa010000d4c0035fd6f7ffff1740d01bd500008052c0035fd6c0035fd6fd7bbfa9BBL8;FFe0431691e1031aaae20318aa27110094fad342f9fc0740919c830191d7fdff17e04316912200", + "805220110094e1d342f9e3fdff17e0431691e1031aaae20318aaL8;FFe00317aa00013fd6c10640f9810000b4c20a40f9e00317aa172d00945f0b00b121020054e11b42f9ffe71639810000b4e01742f9220080520f2d0094e8a340f9L16;FF602e00b4a8e300d1f80300aadc0ec0da000540ad28feffd00", + "881269129048052e1831391e87302f90801805242008052000400ada0e300d1bc0314f8e97702f9BBBBBBL8;FB6f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f6c69622eL8;FF3f0500b1600400540", + "97d18536a0240797b0700b1e95a69780821094a095d10534801084ae95a69780801094a68020079f30318aa03f5ff54e96f43a9b3035df8BL8;FF681a00b5080840921f1900f1a21a0054017c0353c11a00343f0800716c0100543f040071600700543f0800716106005481620091e003082ae20313aa57f", + "dff97L8;FFf6030a2a880200f92800805296260129952a01a98b3202a968220039f44f46a9f72340f9f65745a9fd7b43a9ffc30191c0035fd620fdfff000003091c31c0094BBL8;FF880300f9690300f988fe60d3881800b5800a40921f1800f182180054817e0353a11800343f080071400400543f04007", + "1e1060054e81342f91f0500b141020054L8;FF220080523a000094610a40f9a1ffff17e00313aae10317aae20315aa34000094770a40f9680240f9080117cbbf0208eba9f4ff54e00313aae10317aae20315aaL16;FF880700b5200840921f1800f1c2070054217c0353e10700343f0800712c0200543f04", + "0071e00300543f080071e1020054880243f81f0500b1810000549f5e03a9BBBL8;FB0800000000000000b8164600000000009cf5450000000000180000000000000008000000000000005c184600000000009cf54500000000001000000000000000L8;FFe81340f92a0400918022029149018052ea1700f", + "90969213864e8ff97e16300918f8eff97808240f9800100b4e11740f9e80f40f91f0101eb003b0054e81340f9BL8;FFa3010054610240f9200015cb370015cb2001019489124092c80215ab770200f9690e00f963020054c0feffd000603f91c2fc0094e80f0036a80202abc2130054L8;FFf85f03a9f657", + "04a9f44f05a9fd030091ff0740d1ff0300f9ff0740d1ff071ef83ffc3ff18900005409008092090100f973000014810100b4e9074091ea030091BBL8;FF29194a8b29050091280108ab0303005438000014e8031faa096040b93f05007160fcff540a6840b9e803088b5f05007141fdff54096c40b929014", + "0b22911c0daL8;FFe9ff43b9f6db43b9756641f9e80240f9208706ade9f302b9680000b4e00315aa00013fd6e10640f9810000b4e20a40f9e00315aa104100949f0b00b1410d0054L16;FF54f6ff170a00809288018052ebe300f9e82b0ea9fbbb4ca9f4b344a9f57b40f9e80309aaebbf46a9f10308aaea", + "6341a9f9fb42a9e8030eaafc0748a9ee0311aaBBBBL8;FB683db94e69ee5cf62c0f438f5ca7a02d0b70b64fd4ad0000c45894099bfd591916cd63d6733effb86fd00756c5d6216f135c61fcd6ff1b75f6bfad4e4f42c2bbL8;FF4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7b", + "c1a8c0035fd600feffd000e00691c38c009400feffd000600291c08c0094e0fdfff0BL8;FFe8f70db9410a0054e39348a9e0c31291e2db42f9e5f35639e1833291e6031f2a93e6ff97fc5b42f99f0b00b1c1830054480200d0fb830291081140f9fa4340f9L8;FF880240391f2100f1a1030054985040b9f", + "60302aae30700a9f50304aa6dd0fe971f0400b1c00d005408040091ff0208eba1020054f90600f1e003005411110094BBL8;FFe8e301b9280000b00811349160ffff9000842491e85302f9e8830791e1231291e85702f9e8830091ea4b02f9f84f02f9e95b02f9c74c0194e19b41f9210100b4L8;FF08004", + "0f989fdfff029e10791e00301aa08014039227968f889fdfff029410891287968f8e10308aaa54c0014080040f9e20301aa002140a9e10308aad54c0014L16;FF2a4850a9295c49a9eb9b00f9e85300f9e8979f1a08219f5a2c2c4fa9081d00121f050071288840f9e82700f9288c40f9e80b00f9289040f", + "9e83b00f9289440f9BBBL8;FFa1ffff9021203f91a3ffffb063340991e00700f9c7000014481c00121f090071810b005428008052f40300aae1230091ffa300a940008052e20303aae8ff02a9L8;FFe8630191e0a30391a1c300d1f4630191e91eff97e8c30291e263019184020191e0031aaae10319aa03", + "04805205028052ab6c0094f95b40f93f0700b1a00c0054BL8;FF6d19001221e00daa8bf5ff363f2500f100f6ff544b2580394a290091292900d10a2500a96bf5ffb77f05007128f5ff5421fc0baae0031faafd7b43a9ff030191L8;FF43d863783f0003eb1380931a757e409340d873783f0000eb6900005", + "473060011757e4093000000f000201d91180000f0000c40391f1c007281100054a02a0091BBL8;FF28040091f97749f9e8d302f93f0700b1c01d005400230291eb180094080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a0500915f0308ebL8;FF160480522003168be1031caae20", + "31baa20310094da021b8be0031caae1031baa22008052ba031ef813310094f60314aaf40315aaf50317aaf70302910a000014L16;FF00048052210080521db10094400400b4f50300aa1bb10094000480522100805217b10094800300b40804805221008052e85700a9958e40a9e02302a9e0030091BBBBB", + "L8;FB73656e64657220636861696e000000009f1b400000000000340000000000000037010000220000004d414320766572696669636174696f6e206661696c656400L8;FFb5940094f70302aaf60300aaf80301aaf40700b41b990094e00314aa2100805214990094e10318aaf30300aa2000805273feff", + "b4285440a9f4cf00a9ff0f00f9BL8;FF29194a8b29050091280108ab220a0054090140b22911c0da291540d2290d098b2925019129fd46d30801098b080500911f0109eb49090054091c40f93f0500b1L8;FFe81303f92319009431070014e9830c91e0d3c03d2181c03c298141f8e03f813d4183803ce97", + "702f9e0431391e86b02f9fef1ff9708008092880200f9b50000b4BBL8;FFf44f5ca9fc575ba9fd7b5aa9ff430791c0035fd6ffc307d1fd7b19a9fc6f1aa9fa671ba9f85f1ca9f6571da9f44f1ea9fd4306919f8000f1f30300aac1050054L8;FF29c11d91e8b305f928008052e1833291e96f06f9e95706f", + "969fdffd029ed0a91eaa705f9ea032d91e86b06f968fdffb008c52991e96306f9290080d2e87b06f9L16;FFa2008052a400805210dfff97e16341f906000014e80f41b2e86301f9e0030b917bdfff97e10300aae16301f981feffb02128179183feffb063c01791e0030b91BBBL8;FF3f0108ebe00000548", + "a6928380805009120008052290040f9280800f983ffff17e00301aaf30301aae10309aa220080522300805224008052f4030aaa7e040094L8;FFe8cb42f91f0101eba0c60054e8cf42f9090180522a04009109692138e1431691ead302f9dd110094e06349f9800100b4e1d342f9e8cb42f91f0101ebe0c5", + "0054BL8;FF0800f0f2081500d1deffff17e90b41b2e92300a9dcffff17280180d20800f0f2081100d1d7ffff173f00156b81f7ff54680240f9e0031faa090540f90a0140f9L8;FF7f0501318cd58c9a05000014f4031faa08011fcb52000014ec031faa8801088b0b188052ec8300b20b000014f0fd48d3e", + "f9d0092aa010a8b29010ecb109e0092BBL8;FFfb07409121800991f70300aa192c81527b8309911f390194e007409168030291e10316aa00802f91e20314aa030880521b08805286880094089080520083c23cL8;FFe16f0ab967ffff17a88357f8080540f9160101ebe200005475010014a22302d1630c8", + "052faeeff97e10300aaa02e00b5a88357f8080540f91f0116eb490e0054L16;FFec4300f9ece742f9fa9742f9e28716adfca742f9f4c742f9f9f342f9e3c7803decb704a9028544ade89342f9e85300f9e89b42f9e28717ada182cf3ca282ce3cBBBBL8;FB6a00000000000000750000002e000000737461", + "7465206465636f6465206661696c65646e6f742079657420696d706c656d656e7465646d657373616765206465L8;FF80e7ff97b9035ef8792600b4b7835df8f80b00f938fb7fd31a890094e00318aa4100805213890094002500b4e10317aae20318aafa0300aaf30700f9f71300f9BL8;FFe00316aa030", + "40194c8624039e9feff9029c11d91e9d302f9fbc342f9f5c742f9e8631639f7cb42f9e80180528083cf3c7f0b00b1a80319f8404f803dc1220054L8;FF2300805281f9ff97e8bb41b9e9e340f9e92700f9e8680037f52f00f9f5e740f9fc2300f9ba0000b4e00315aae1031baae2031aaa17090094bc7e60", + "92a3000014BBL8;FFa9835ef8aa835ff868021c8b7b0700d15aa301919ca30191092900a9096501a9a9435fb8156502a9175103a9176104a9166105a9096100b9fb0800b4a8035ef8L8;FF6083883c2083ca3c6183893c2183cb3c60838a3c2083c43c61838b3c2183c53ce85301f9c86a40b9e00704ad20", + "83c63c2183c73ce82b00b9e8430691e00705adL16;FFe80b00f929a052a9e84300f92aa053a9e8a706a928d054a9e8ab03a929a855a9e97b00f929a056a9ea230ca92ba058a9e9d300f929a857a9eb6f00f9e85f00f9BBBL8;FFf3031f2ae10600b4e85740f9fb1f40f9e90f40b9e82700f97fffff17f607", + "46a993fffff073e62791e02b40f9540380520a000014f63340f993fffff0738a2791L8;FF280100b4090d8052e00314aa017d099b02018052f44f42a9f65741a9fd7bc3a815690014f44f42a9f65741a9fd7bc3a8c0035fd6210400b4fd7bbea9f44f01a9BL8;FF21bc0e91a3feffb063300d91e00300914", + "2018052440080520cefff97e00340f967ffff17c80080d20800f0f20809009159ffff17c90080d2e823003948008052L8;ZDBBL8;FFea1700f9000504ad020d05ade90b00f9bc0000b4e0031baae1031caa2200805215290194fbe30091a80302d1e10316aa60c30291bc0302d1f6510094a80358f8L8;FF", + "edffff1720008052e10313aab2240094ff8301d1fd7b04a9f32b00f9fd03019100e4006fe80301aaf30300aae1830091e00308aa02048052e00301ad71d6ff97L16;FFe603009101048052e20314aa0304805207088052e40315aa140d0094e12340f9810000b4e00315aa2200805212a90094e00740ad80", + "0600ade00b41ad6042803cBBBBBBBL8;FB302f7372632f686d61635f696d706c2e7273002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665L8;FFff431891f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6370080521", + "7a30094000880522100805210a3009420eaffb52000805201088052BL8;FFe0031faaf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a98c210094e0230091f7a700a989210094e00313aae1031faae20314aaL8;FFf85f4ba9fd7b4aa9ff830391c0035fd6ff4301d1fd7b03", + "a9f44f04a9fdc30091f40300aae0630091a5150094f30742a9e8030091e00313aaef210094e80340f9BBL8;FF24630194f702168bb7031ef85f0317eb401c0054a8835df8ea060091a1c300d1e0031baa49048052aa031ef809693738fee8ff97b7035ef8ba035df8480317cbL8;FFfd7bbda9f50b00f9f4", + "4f02a9fd030091f30301aa210840f9f40300aa680240f91f0101eb40040054680640f92a040091e00314aa490280526a0a00f909692138BL8;FF0900f0f2e8270039e90300f9e8ffff17e00300f981feffb021a03d91a3feff9063941191e003009102028052a4018052eaffff17c80080d2e0230039e003", + "0091L8;ZDBBBL8;FB7920696d706c656d656e746174696f6e2072657475726e656420616e206572726f7220756e65787065637465646c7900c50f4000000000004b00000000000000L8;FF200500911f0008eb89180054e16300919390ff97e11740f9e80f40f91f0101ebc0680054e81340f92a04009180", + "22029149018052ea1700f909692138deebff97BL8;FF6a111d124b5040780a8500394a1040b80b4d00794bb040b80a2102b84a0840b90ca100394cf040f80a9102b80a088052aa1500330081803c0b2d00b90c3903a9L8;ZFBBL8;FF200440a9e92300910a0000904a813f91e8a700a942ffff90426c3c91", + "ea0f00f9e3430091b13e0194fd7b43a9ff030191c0035fd6082000910940009142ffffb0L8;FF080540f91f0119ebe9030054e00313aa90feff97c009003728fc60d3a80600b5200840921f1800f182070054217c0353010800343f040071000100543f080071L16;FF81130054e88300f9e027c33d8103c", + "03de86f46f9e93f00f9ecab40f9e0c7833deda757a9e1f7803de8f301f9a80100f0081140f9eacf40f91f0900f1e9030054BBBBL8;FB7900000000000000c8034000000000005800000000000000a40000001800000080174000000000005600000000000000c8000000090000008017400000000000L8;F", + "F09fd46d30800098b080500911f0109eb880b00546d000014f30300aacbfaff97e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d3BL8;FFc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c", + "0035fd6e0fefff000803591L8;FF1d130094e8df40f9ea431391e09bc03d23fdff906320359125fdff90a5c03591e89701f9e89340f9e0830a91e1830c91e40313aae86b02f9e9a350a962c20391BBL8;FF6082813c691e00796a0a00f97f020039fd7b45a9f33340f9ffc30191c0035fd61f09007181010", + "054ea0f40f9090180d20900f0f248dd7892290140b20a000014L8;FFc10640f9810000b4c20a40f9e00314aa195300947f0b00b141050054e8630191ea9740f9e93342f908e10c91f6bb41f9fbbf41f9000545ad5f0500b10231c03dL16;FFeacb00f9e9eb00f90aa54ca9ea9b00f90a6d40f9e9a700f9e9", + "979f1aeb2b11a90b294ea929219f5a291d0072eba300f90b4953a9ea1300f9112951a960770054BBBL8;FF09692138b6020034c80240b20811c0da081540d2080d088b0825019108fd46d308050091f50100b4a90240b22911c0da291540d2290d098b29250191a91a498bL8;FFf2f9ff1748074039e2074", + "091c0fdfff000381b91c3fdfff063c03091c4fdfff084401c9142c035918107805248432c39b16e0094e0074091e10318aae20319aaBL8;FFc0feff9000a03491ccee0094c0feff9000003591c9ee0094ff0301d1fd7b03a9fdc30091080040f9090540f9490d00b40a0140f9410180390101f8b7e0031fa", + "aL8;FFa4fc068886ffff350000010a401800b9001a003441404079212c46d3211c00513f7c0071c9020054f35341a9fb7345a9e303004b0100230a411800b96000006aBBL8;FFe07b49f9e10313aa220080521a330194e18349f9810000b4e08749f92200805215330194f4ab49f99f0600b1a0baff54f5b", + "349f9f3af49f9551600b476220091L8;FF00610e91a1ecff97b9ffff17fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9ff4332d1f30308aaa86340b9ff0300f9L16;FF8af640f9a0073bad8072c03da203983ce007813d2001c03de81302f9ea1f02f94083813c", + "b70000b4e00318aae10317aa2200805210b30094f7830291e10314aaBBBBBL8;FB32000000000000002800000011000000696e76616c6964206d657373616765204956696e76616c6964206d657373616765204d4143206b6579696e76616c6964L8;FF0801028ba80317f8b6960094a0c303d12103138be", + "2031aaabaf314381d9b0094a8f35438f90b40f9290080521ffd0071ba0218cbe803082ae9830039a1faff54BL8;FF4800805209ffffb029810c91ea430191a8273da9e8feffd0084d1491a82b3fa90a078052c8048052bf273aa9e9fefff029ed0a91a92b3ca9290080d2e92fc0f2L8;FFe077c03df53301", + "f9fc3701f9e09f803d384100b4e80240391f0d0071800d00541f09007181400054010700d1e8431391e0060091efd3fe97e86b42f94083c03cBBL8;FFfcb309f8a98357f8e85f0239e87d1053ea3307f80a358c52e86b0239c81f0012897209f8098440a9e88f0239a8035838e22f00f9a20356b8e81f033", + "948019fdaL8;FFe85306f98261ff97e80300aae0833291a1fdffb021b8239142028052a3fdffb063b42291e85306f908000014e05306f9e0833291a1fdffb021b8239142028052L16;FFfd030091ff4314d1ff0300f9f30308aa090840f9c93000b4080440f917008092f6830591d50080d2e9df15a9d802", + "0291e8ab00f91500f0f248008092e9430591BBBL8;FFa02301d1a9ab3ba9e87e0094a8035ef8b7031ff8140117ebe3090054b8237da9b6835ef81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcbL8;FFe0abc43de1a7c43deac33391e2a3c43de95b49f94081833ce067c13d4181823", + "c4281813cead342f9e99f06f9e24bc33de347c33de14fc33dea8306f9e03f833dBL8;FF29c1001108819f1a0970003949c1001108010d0b0974003969c1001108c1001109780039087c0039c0035fd600e4006fe8031f2ae9031faae003bfadea030091L8;FF6b7a1e534ab10caa6c7e1f534a910baa6b42", + "10534a950caa0c4010534a250baa0b0000124a290baa0bfc4cd34a9d0caa0c4812536b017b924a010baa6b320c53BBL8;FFfd7bc6a8c0035fd620008052e10318aab136019400018052e10315aaae360194fd7bbfa9fd030091086040b9a8060034080140b20811c0da081540d2080d088bL8;FFf45740f9", + "200541adf87305f9f87b05f9f8830d91f96b05f900818b3c01818c3c200542adf77705f9fa7f05f900818d3c01818e3c200540adf58305f9fa8705f9L16;FF210080521bbb009400be00b4e10315aae2031aaaf90300aa1ebb0094ed031aaafa031caa11000014350080527a0400b4fc031aaa13bb0094e0", + "031aaa21008052BBBBL8;FB5800000000000000760000002f0000007370717220666978696e672062616420656e63617073756c617465312073746f72656420737461746520656e6469616eL8;FFe00313aa02308052080300f9218b0094e93740f9eafbff179f8200f121080054e1834ea9e81f40f91b41", + "0079000440ad000500ad610000b4220080520e8b0094BL8;FF00013fd6e06b01f9e8c31791e16f01f9290c40f9e1830b9120013fd6fcfb42f99f0f00b1c106005488008052f46f41f9e8230b3949008092f36b41f9490300f9L8;FFf50301aaf30300aad8030034080340b20811c0da081540d2080d088b0", + "825019108fd46d308050091b70a40f9170300b4e90240b22911c0da291540d2290d098bBBL8;FF6142833ce12ec33d6042843ce01ac33d6142853ce11ec33d6042803c6142813cf40500b4e00315aae10314aa2a000014e90f41b220000014e91741b21e000014L8;FFaf46001408a440a9e20301aae0030", + "8aae10309aae0460014fd7bbfa9fd030091083040f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d3L16;FF6a2201a908008092682600a96a0a0014e86345f9e97345f9ea8345f9eb8f45f9faab45f9f7af45f9e84700f9e86745f9e1cf45f9fbd745f9f8df45f9f9e345f9BBBL8;F", + "F5fa001b121ffff54530080527f0a0071c1320054080300b0081140f91f0d00f123040054e80302914900009029611291e8270aa9e8f30191c90200d029b11491L8;FF420080521c6b0094683e40f9a80000b4604240f901f57ed342008052166b0094684a40f9a80000b4604e40f901f57ed34200805210", + "6b0094685640f9a80000b4BL8;FFa18378ad8182803c8082813ca18379ad8182823c8082833c6affff17c1010054e1031faae4fcff17880080d2e17f00f90800f0f2dcfcff17e80b41b2e07f00f9L8;FF600300540ac0865229050091aa8cb87208010a0b681200b97f2600a9fd7b42a9f31b40f9ff03019", + "1c0035fd6e80301aae0030091e10302aae20308aad6ffff97BBL8;FFf65742a9fd7bc4a8c0035fd620008052e10314aaaf260194ff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9692841a9L8;FFfd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091150", + "840f9080040f9f40302aaf30300aa080115cb5f0008eba8010054b40000b4680640f9e20314aaL16;FF5f010cebcf194092ce1d0013ef21cb9ae90109aa620000546b1d0091eefeff378e04f8374b8500917f0103eb280400542bfd50d3eb0300b54a0500d14a000a8bBBBBBBL8;FB5f6d6c6b656d373638", + "2e7273001443616e6e6f74206f70656e2066696c6520617420c0001243616e6469646174652073657373696f6e20c00e206661696c6564L8;FFe97241f89f0306f1f60314aa550300f953230039489300f8490b00f9e00a005408031c8b53008052150940f9d50800b4b5080037130540f9129f0094e0031", + "5aaBL8;FFfd7bbca9f85f01a9f65702a9f44f03a9fd030091f30301aa210840f9f50300aa680240f91f0101eb800b0054680640f9b60a40f92a040091b41640f949028052L8;FF220080521c1f0094a06300d1e103172af411009428008052a16300d1e2630091e00316aaffa301a9ff1700f959f5ff9713", + "000014e083c33ca1835ef8e003803dBBL8;FFf57701f91f010071fb7b01f9e802881a1f01186b81fbff54e8ab41f99f0208ebfb179f1a81faff5474faffb4f5a741f9f31b40f93b008052f60314aa68164038L8;FFe182c33ce282c43ce8fb42f9e0db823de082c53ce1df823de182c03ce0e7823de082c1", + "3ce2e3823de82b00f9e1d3823de0d7823dfacb40f9da0e00b4080d8052L16;FFdf0208eb69f7ff54e00313aae10318aae20316aa2300805224008052f4020094780a40f9b3ffff17e00313aa220080522300805224008052ed020094610a40f9BBBL8;ZBL8;FF09c6ff54e0630091e10317aae20315aa230", + "0805224008052f5a2ff97f71740f928feff17e0630091220080522300805224008052eea2ff97e11740f92ffeff17BL8;FF132001a928008052081000f9180319ebc3020054680219ebb502198bf333889a954e00a9985a01a9f44f44a9f90b40f9f65743a9f85f42a9fd7bc5a8c0035fd6L8;FF3f0840f2", + "c0000054e30100b481686238e30302aae1682238f8ffff1762084092e10303aa03000014806861f8e06821f83f0002eb212000d181ffff5463084092BBL8;FF810000b4e02b40f9220080521a3f0194880700d11f0d00b1a8000054e00319aae1031caa22008052133f0194480700d11f0d00b148f5ff54e", + "03340f9e1031aaaL8;FF243f0094e1430f91e00315aa38dffe97683642f9619243f9094940f915ed40b918a140b917594f293f0100f1e8079f1ae86300f9810000b4608e43f922008052L16;FF1f0900f123590054f80000b4e0031aaae10318aa22008052f4030aaa16bf0094ea0314aa355800b4e0030a", + "aae10315aa2200805210bf00945b008052da040014BBBBL8;FBd6e99c2ccb466c15544552c883e22d97733aa29aace7784aa28c75ef11ce0000a45e67f5f2609126267fe17ad077e264f960be20282206a28a4ae7347b43675fL8;FFf67f00f9df0208eb41fcff54e0a3039177890094dfffff17284d1c9b", + "090940f93f011beb29010054080540f9f5031f2a13797b78767e0853e87740f99f0208ebBL8;FF01e30391a22302d164ebff97002c00b5e1031faae7ffff173f0c0071800300543f10007121010054602e00b5a02302d138ecff97e80301aaa0030036c82e00b5L8;FFf41700f9e8030091e00315aae1031", + "4aaf90d0094e80340f91f0500b120010054e003c03de80741a929008092690200f96082803c680e00f9e10200b5e9ffff17BBL8;FF1f00007101fa805200019f5ac0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff830ad1f30308aae8630491f40301aaf50300aaL8;FF9", + "7010094080040b20811c0da081540d2080d088b0825019108fd46d30900088b200500911f0008eb29210054f30b40f9fd7bc2a8c0035fd6e80300aa098d40f8L16;FFe1eb41f9faff41f9e73742f9e8e700f9e80342f9e35f42f9eca300f9f86742f9f98742f9e9231fa9e80f42f9e90742f9ec8b42f9f19", + "f42f9f0a742f9e8cf00f9BBBL8;FFa20180524401805209000014e00700f9a1ffffb021b40291a3ffffb063100391e0230091a20180522402805207750094e90740f928ffff17e0230091e8a700a9L8;FF22000014882245b8e92f4379eb4746398c9246f8edc74639eaa34639e8d303b9e9ab0779e8a759", + "a9ecb300f9eda305392b1f0036ebd343b9e96306394921c993BL8;FF081c00121f090071a1010054e00302aaf30302aaf40301aa00fcff9720020037750240f9a80640f9160101eba2020054e80f41b2e81300f907000014c90080d2L8;FF4d0100547fb01f3861c01fb802d05f384210001242800151421", + "c001202d01f38f35341a97fffff1702d05f38421000124114010b221c0012f9ffff1725008052BBL8;FF242f01944803188bf90b40f9fa0740915a830991e8d302f97f0700b1fb0314aa806dff5440c30391d1000014e8031faa00011aab62570054e1431691c60c0094L8;FF202f009400c480522100805", + "2192f0094c04900b4e1833f9102c48052f90300aa16c480521b2f0094e0074091f9030bf900001891f6070bf9a9ddfe97e00706a9L16;FF2b05003921ffff54350080527f0312f1e10d0054d40d00b4e8030191e00316aae10314aabbaa009416af009400108052210080520faf0094c00f00b4e00744adB", + "BBBBL8;FBef104000000000004e0000000000000001050000140000004d6573736167654c656e6774684576656e4d6573736167654c656e677468546f6f4c6f6e67536572L8;FF6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b29", + "05009129010aab820200542a0140b2BL8;FF290d098b2925019129fd46d30801098b130500917f0209eb89190054088c45f81f0500b1c0140054ce020094080040b20811c0da081540d2080d088b08250191L8;FFfb03002aa04700d181c4ff97e8074091e9ab41b908411d9109010039e99b41b900fd003", + "9e007409109050039e99341b900401d911aed003909090039e98b41b9BBL8;FF280080522900809268220039690200f949000014e8020090081140f91f0500f189030054e8830091290000b029813f91e82703a9e8a30091eac30091e82704a9L8;FFe87345b9cfffff17e89340f9c80000b40805088be00", + "313aa0201805201f17dd315570094e063c13de167c13db47e0853e8a345b93c008092e00718ade82303b9L16;FF018840a904944329e00308aa1f2e0014fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9ff830cd1290840f9f30308aaBBBL8;FFe00740f94ffef", + "f17880080d20800f0f20811009148feff17e00b40f9ccffff17b7835df8daffff17e00700f9a1ffffd021003991a3fffff063080291e0230091L8;FFe08749f9220080521b770094e18f49f9810000b4e09349f92200805216770094e80740910881099100210491d70a0094e5fcff17e1d342f9e8cb42f9", + "1f0101ebBL8;FF011115cb1cf70094612640f9810000b4602a40f92200805217f70094680e48f81f0d00b1a1000054f44f42a9f50b40f9fd7bc3a8c0035fd6e00313aaf44f42a9L8;FF200800f9051000f9c61440f9271400f942000d91c100038ba00400d1e10301cb634000d12100008a6000008a21000", + "68b00400091410c00f9401400f9bf1c00f1BBL8;FF023280520080019121c0359121370194e00fc43de113c43de0074091e82b48f9e20bc43de1074091e08f843de0ffc33d00800991e193843de103c43d21800191L8;FFa8000090081140f91f0500f169050054e843249129fdffb029a93791e84b03f96", + "80000b008611591e84f03f9e8430e91a04700d1e85303f9080000f008211f91L16;FF29dd78d3ec7202f8e49bc13deabb01f9ea7b43f9ebe3573928a108aae18314ade09fc13deaa301f9ea7740f9e1d342f9080118aae90743f9e28fc13de3a3c13dBBBBL8;FB3800000000000000530000000d000000bb", + "12400000000000380000000000000082000000090000007375636365737366756c6c79206465637279707465643b20L8;FF2a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a250191BL8;FFe863019", + "120f18f3ce9e70c912083ce3c21f18f3ce9270d912183c73c22f18f3ce9670d912283c93c20f18f3c2083c83ce9a70b9121f18f3ce9e70b912183c33cL8;FFb5c2009180010054a1025ef8810000b4a0825ef82200805217070094a1825ff8e1feffb4a00240f92200805212070094f3ffff17db0000b468", + "071b8be00316aaBBL8;FFf85f19a9f6571aa9f44f1ba9fd830591f40301aa3f2000f1f30308aac8000054e80b41b20900809268d200a9690200f900010014170040395a0080d2f50300aaL8;FFea2f19a9e90702f91a00f0f2d1420094e81f40b9e8030639e10740f9c1f7ffb527feff173c008052e84306", + "91e0430f9194dbfe97f82740f9e81f40f91f0308ebL16;FFf76b00f9f77b42f9ec9742f9e8a709a9e82f42f9e93342f9ef4700f9fe9b42f9e09f42f9e8df00f9e83742f9f8a342f9fba742f9f6ab42f9e5af42f9e8af00f9BBBL8;FF692200b8a9035ef8ea9303b8aa1b00b9ea7343f8685200b8e80b40f9", + "691201f8e9634039eba300396a9200f8689201f869860039fd7b47a9f34340f9ff430291L8;FF290040f91f1040f15369283808050091280800f943feff540b7c07533f0108eb6b611932000100544b692838080500911f0048f1280800f96202005400fc4ed3BL8;FFa80640f91f0116eb090f0054e0031", + "3aa02f4ff97e80300aae00301aae8fd073708fc60d3880e00b5080840921f1900f1c20e0054017c0353e10e00343f040071L8;ZDBBL8;FFf44f43a9f70b40f9f65742a9fd7bc4a819270114f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6fd7bbea9f44f01a9fd030091140040f99f0600b1e0030054L", + "8;FF610e40f9c10000b4600a40f922008052f30b40f9fd7bc2a817270014f30b40f9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091010040f968028052290041d2L16;FFa8a10e9bedfd44d3ee430191ef730091b27dcb9bad0301d108011c8b11e10091480600912082c13c321640f98cc101f122025f", + "f82102de3ca081813c2082dc3cBBBBBBBBL8;FB2d623538643766353665333634356363642f303639353962342f7372632f7574696c2e7273002745787065637465642061206e756d626572206265747765656eL8;FF0080319122feff9042803291c1078052bc9f00942000805201048052ae9f00942000", + "805201098052ab9f009420feff9000203191c19f0094fd7bbaa9fc6f01a9BL8;FFf30301aa14e0009104000014730600f194c20191c002005481825cf8810000b480025df8220080521324019481025ef8810000b480825ef8220080520e240194L8;FF6a69283808050091280800f99cffff17e00700f9e", + "00301aaf30301aae10309aa220080522300805224008052f4030a2a070000946ba240a9ea03142ae00740f9BBL8;FF7f4600b9e00742ad7f0200b9e30b43ade00705ade30b04ad6042803c6142813c6342823c6242833cb40000b4e00315aae10314aa220080520f640194ff030891L8;FFe10313aae5fcf", + "f97f4fbff35f44f42a9f50b40f9fd7bc3a8c0035fd6e00313aa2200805232030094610a40f9daffff17e00313aa220080522d030094610a40f9BL8;FF1f0500b1810000549f6608a99f7e09a99f020a3881020291e20313aa0ff4ff97800400b5e1031faae4ffff17880240f91f0500b1e10000549f5e00a", + "99f7e01a9L8;ZDBBBL8;FB696f6e73657373696f6e5f76657273696f6e72656d6f74655f6964656e746974795f7075626c696373656e6465725f636861696e72656365697665725f636861L8;FFe80f40f91f0101eb407d0054e81340f92a0400918022029149038052ea1700f9096921380df4ff97e1630", + "0918c91ff97888248f81f0500b180070054e11740f9BL8;FFa4ff0094f30740f9e80740b9e0830c916002c23c61f2c23ce8ff0c39a84302d1e0cb803de1f2803c99ff0094e8830c91e0030c91e1430691a24302d1a3ff0094L8;ZFBBL8;FFe00314aa210080523500805219440194c0feffb4e10316aae20", + "314aa740200a91c440194e00316aae10314aa22008052740a00f9f44f42a9f65741a9fd7bc3a8L8;FFfd7b43a9ff030191c0035fd6e80741b2e0030091e80300f97d4aff97e10300aa20008052fd7b43a9ff030191c0035fd69552ff97fd7b43a9ff030191c0035fd6L16;FFa082c63ceae700f9e9bf00f9", + "0aa542a9e0f7803deabb00f9e9ff00f90aa543a9e9db00f9092540f9e9cf00f9092940f9e9b300f9092d40f9e9c300f9093140f9BBBBL8;FB6e6e65725f7374617465507152617463686574537461746576657273696f6e5f6e65676f74696174696f6e696e6e6572636861696e000000bb1140000000000", + "0L8;FF2911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb492d0054080c47f81f0500b180230054c8030094080040b20811c0da081540d2BL8;FF220200542801088b480108ab8202005409804039000509ab22020054fd7bc1a8c0035fd6e8031faa091c40b949fbff35e903", + "1faa0a0840f90afcffb5ea030aabL8;FFe143139100f1cf3ce80f41f9022b8052e087813de81303f91e140094e8d740f91f0500f14b450054e1d740f9e0031caa2200805210140094250200143a000014BBL8;FFea0240f9a0835df84801088be80200f9a90200f908fc60d3280600b5080840921f1900f1", + "22060054017c0353410600343f0c0071600100543f080071a0faff54L8;FFe9d301f9e0234ea9e3031f2ae16340f9e22340f9081940f900013fd6e03b02f9e8031691e13f02f9290c40f9e103129120013fd6fbc342f97f0f00b1a1060054L16;FF330840f9f70301aaf40300aa130300b4f60640f91bd40", + "094e00313aa2100805214d40094c00300b4e10316aae20313aaf50300aa17d40094f61640f9f60100b4BBBL8;FF1f0101ebe0330054680640f9490480522a040091e00315aa6a0a00f909692138e10313aa01faff97770a40f9680240f9080117cbbf0208eb28330054680640f9L8;FFe8cf42f949048052", + "2a040091e00318aa09692138e1431691ead302f9df0c0094fad342f9e8cb42f908011acb1f0308eb48420054e8cf42f9e10319aae20318aaBL8;FFe10313aa96010094770a40f9680240f9080117cbbf0208eb6800005455fdffb5f0ffff17e00313aae10317aae20315aa2300805224008052ed17009477", + "0a40f9L8;FF010800b9f55b42a9d1ffff173f0800f96600001420000090f55b02a9030082d2f76303a900bc43f9221440f91f0003eb1820839a420c00b535cc41f9bf0600b1BBL8;FF090280522a04009109692138e1431691ead302f9d0110094e85349f9280500b409e179d3f84f49f959038052361108", + "cb04000014d6c201f118c3019120040054L8;FF0a0900390c440c33090d00396a6d1c320a0100390c050039cdffff17fb03002aa04302d1e10315aae20316aafef1ff97e0031b2aa88357f87f0302710801158bL16;FFe107c13de20f06ade317c13de89f40f9f58300f9f56b40f9e10305ade31307ad638", + "3c63ca00b3aad6283c53c6083c43ca103933c6183c33ce08b01ad6083c83cBBBBBL8;FB340000000000000008010000300000006d697373696e6720726563656976657220636861696e206b65796c69627369676e616c5f70726f746f636f6c3a3a7374L8;FF209c0094e00313aa21008052340080521b9c", + "009400feffb4e60300aae5031baae4031aaae80319aae30318aae20317aae10316aae00315aa0200001426008052BL8;FF770a40f99fffff17e00313aa2200805226000094610a40f9a8ffff17e00313aae10317aae20315aa20000094770a40f9680240f9080117cbbf0208eb89f5ff54L8;FFe87302f9a", + "cf2ff9700e4006fa04700d1e143139102048052e03b813de037813d78c9ff97e9bf5339e84353390a088052e0074091fa8309912a15003308111d12BBL8;FFe20315aa235c01942803150be8ff00392000001419020034e8030091e10314aa9a02028b0001198b1a5c0194e83340f9e0020191e103009122", + "00805208050091L8;FF482600b5e1031faac2ffff17e1031faae82f06f9bfffff17e1031faae8570cb9bcffff17e1031faae8630cb9b9ffff17e1970cb9f2feff17e1930cb9f0feff17L16;FF42030054010840a9e50304aa0a018052e40303aaf30300aae023009129f87fd31f0109eb0881899abf0400f", + "1890080524901899a1f0109eb1481899ae30314aaBBBL8;FF2b6968384a090b8b40011fd6010440f9410300b4000840f922008052f44f41a9fd7bc2a8147c011413d041a9880240f9680000b4e00313aa00013fd6810640f9L8;FF1f0900f160220154e0074091e10740910232805200c0359121802f911d", + "7c0094e8074091e00740910881099100c0359118e1079108e1079197ecff97e0074091BL8;FFc0035fd61ffc0094000380520101805218fc0094200400b4880640f929008052600e00f916a400a9080000f968d600a9c8feffd008c10291680200f9f44f42a9L8;FFb40000b4680640f9e20314aa0001158", + "b20fcff97a802148be0031f2a680a00f9f44f42a9f50b40f9fd7bc3a8c0035fd6e00313aaa10f00f9e10315aae20314aaBBL8;FFa9e316386901084aab135738a9f316384901084aaa235738a90317386901084aab335738a91317384901084aaa435738a92317386901084aab535738a9331738L8;FF608", + "652ada80000b0629ec03df5830d91600500ad6209803d081140f9080600b4640247a9e8430f91e1032a916382039122008052ceeafe97fceb41f9a0c2c73cL16;FF220080521cbc0094f8ffff17f57740f9369400b4c806168be00314aa0201805201f17dd314bc00949b0400145c008052d4000014fc031", + "f2ae0031baa080c48f8BBBBL8;FBf4d0e7379bfb2a8a05e9e5240eb2d30c7c1c933e4688fdc52e5f7d287026a4e47b400668764ed2aaa9eaaf82d9cc0b66a28cb732b4dfebb49284000043059f58L8;FFe003152ae203132a96f2ff9708fc78d312feff905282309109fc60d3487a68782821084a095d105", + "3495a69782801084adbffff17480100b008210091a98300d1BL8;FF810000b4e0ff42f9220080521a0c0194e8c31791008100919be6ff97c80080d29c000014e85746f9e95b46f9c0feffd000c01091e1032d91e85b04f9e8c32291L8;FFf30300aa1f0c00940002805201018052180c0094000100b401fd", + "fff021400491130000f91f200039f30b40f9fd7bc2a8c0035fd60001805201028052a5070094BBL8;FF740200b936010014f60f00f9e8830091808200918182029168480094e86342a9f71b40f91f0500f140030054e80740f9080116cbff0208eb28270054970100b4L8;FF29050091280108abc2010054", + "091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6L16;FFe89302f9e86740f9e89f02f9e8ef40f9e8a302f9e85740f9e8a702f9e86f40f9e8ab02f9e8274ba9e8b702f9e83f40f9e9af02f9e8bf02f9e8f340f9e8c302f9BB", + "BL8;FF530500b4e8031faa49018052e96a283808050091e1230091e00313aae80f00f902f2ff97f90f40f9f80740f9080319cb7f0208eb880f0054f70b40f9e10314aaL8;FF9622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f922008052146c0094f8ffff17680e40f948010", + "0b40805088be00314aa01f17dd3BL8;FFa8031bf8a0873aade08b43ada08b3bade18340ada18338ade08b41ada08b39ad00f4ff97a0077cad880080d2a203da3c0800f0f2a9035bf8081500918082873cL8;FFfd030091291c0091e803002ae00302aa29f17d92ea0302aa290101cb5f0009ebc30000544a", + "00094b4a0d409240000aeb23070054ea0309aa4c00018beb031faaBBL8;FF0a630191061f57290083c13c0003433908e301910183c23cea2301a9e8a3039181820091a50303d102048052e3031caae4031baaa0073aadf55b02a9fa2700a9L8;FF092900a9096501a9a9435fb8156502a9175103a9176104", + "a9166105a9096100b9fb0800b4a8035ef81f011ceb80080054560b40f9586340b9360500b4540740f9L16;FFe90b40f93f0500b100f4ff5488f242f8e087c03d8172c33cff2f01f988f200f8e07f803de07fc03d88f240f8e123813dff2b01f9e09b803d88f207f808008092BBBBBBL8;FB2f7372632f737", + "96e632f6f6e63652e7273001b626164204b454d2063697068657274657874206c656e677468203cc0153e20666f72206b657920776974682074L8;FFff0b01f9f50f01f9ff1f01f9f51b01f9ff2301f9f52701f9ff3701f9f53301f9ff3b01f9f53f01f9ff4f01f9f54b01f9ff5301f9f55701f9ff6701f9", + "f56301f9BL8;FFa200805224018052a7000014c80080d20800f0f2080500d1a0c300d1a8031df87b260094e10300aa7a000014e00700f901ffffd021a00f9103ffffd063fc0f91L8;FF976201a9951200f98282823c8182833c8082843c68320039f44f57a9f65756a9f85f55a9fa6754a9fc6f53a9fd7b5", + "2a9ff030691c0035fd6e01fc03de08301adBBL8;FFfd7bc6a8c0035fd6e0c342f9b9ffff17e8231091f50742f9f40b42f9f70f42f9f81342f9e023009101810091022a805218600194bf0600b161f2ff54e2ffff17L8;FFa9630091a07f0091e92b07a92900009029710891f42708a9e9030091a18301d1e", + "92f09a9e9c30091e9230aa9a8c301d12900009029910891e82b0ba9e8430091L16;FFe80300f982e6ff97e80300aae80300f981fefff021f4129183fefff063a80d91e0030091e2008052a400805221000014e00300f981fefff021f4129183fefff0BBBL8;FB6f766572666c6f7720696e2044757261746", + "96f6e3a3a6e65776f766572666c6f77207768656e20616464696e67206475726174696f6e20746f20605379737465L8;FF72fcff17e0630091220080522300805224008052f6a3ff97e11740f9b6fbff17e0630091220080522300805224008052efa3ff97e11740f984fcff17e0630091BL8;FFf65741a9", + "fd7bc3a8c0035fd6a0feff97c9feffd029213b91027d01a9090500a9c0035fd6e30302aae20301aae10300aae00308aa97000014e30302aae20301aaL8;FFe8000054e00313aa21008052f44f42a9fd7b41a9ffc30091890900143f2000f108018052e02300912180889ae20313aaff0700f93c100094e80", + "3002ae0031faaBBL8;FF3f1c0071e00400543f20007121050054a88353f81f0500b161000054bfe733a9bf8314f8a12303d1a22301d15ac4ff9760f4ffb444000014a8035ab848000037L8;FF4100001448431c2afa0314aaec4f40f9f4ab4aa9f50316aa088308aaf86340f9f9030891bb0300141f15007", + "1e01000541f19007101120054607e42f9618242f9L16;FF1dc00094ec0319aaeb0318aaf60000b4e0030baae10316aa22008052f6030caa15c00094ec0316aab50000b4e0030caae10315aa220080520fc000945a008052BBBBL8;FBb43fa28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28ca28c", + "a28c0000ab960000c9781deea1c853ad7f83699431c20f2a95e6d8806c4036201b100880L8;FF09804039000509ab22020054fd7bc1a8c0035fd6e8031faa091c40b949fbff35e9031faa0a0840f90afcffb5ea030aab23feff54e0fdfff000c00b91bf8b0094BL8;FF61000054e06317914faeff97e8f34", + "2f909068052e02bc33de12fc33de233c33d6822099b69060091e0032d91000500ad0209803de9f702f993eaff979c630091L8;FFfd7b03a9f52300f9f44f05a9fdc30091f40301aaf50300aae0030091e103022af30303aaef020094e0630091e10313aaeb040094e1030091e2630091e00314aaBBL8;FF8", + "1ffffb4600240f9220080521a500194f8ffff17e80740f9c80000b40805088be00314aa0201805201f17dd312500194ff831791f44f45a9f65744a9f85f43a9L8;FF0a1040f9ec031faaeb0309aa4a4100914d8541f8ae0140b2ad010c8bce11c0dace1540d2ce0d0e8bce250191ad194e8bbf010cebe301", + "00546b0500f1ec030daaL16;FFe92f14a90ba44ea9e0c7833de8b700f908284ca9e99f00f907a44fa9e8eb00f9e8979f1aeb2702a90ba450a908219f5a081d0072e9af04a90fa451a9e93b00f9BBBL8;FF217d0353c11800343f040071600100543f080071a1f9ff54f40300aa01a00491e003082ae20303", + "aaf60303aa5af4ff97200100b4d0000014f40300aa01000591L8;FF800200b4e10315aae20314aaf60300aa20700094080000147f0200f9f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd636008052765200a9771200b9f44f43a9BL8;FFa3fefff063781191e0030091a2018052e400805209000014e00", + "300f9a1fefff021441191a3feff9063003a91e0030091a20180520401805204f6ff97e10340f9L8;FF006863f8030840f99f0003eb80000054000080d21f000039007d20d405804039a31000123f00036b4cffff54031840b96324c11ae3fe0737031c40b96324c11aBBL8;FF0800098b080500911f0109e", + "b2821005413000014f9031faafbb749f9e8074091088109917f0700b1c02900540021049189170094080040b20811c0da081540d2L8;FFe80356b9e00740918100805200001891ff0316b9e85b00b9572a0094e80356b9e00740918100805200001891ff0316b9e85700b9502a0094e80356b9e0074091L1", + "6;FFa5200094e0430691e10300910232805220b00094e1430691e00313aa024280521cb00094ff830e91fc4f41a9fd7bc2a8c0035fd6fd7bbea9fc4f01a9fd030091BBBBBL8;FB656e7420737461746500000000000000bb124000000000003800000000000000470100000a000000737563636573736675", + "6c6c79206465637279707465643b20L8;FFfd7bc1a8c0035fd6e00308aba3ffff5400fefff000603c91c893009420feff9000600291c593009400feffb000200c91c2930094080040f929feff9029c10f91BL8;FF092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a05009", + "1090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8bL8;FFf0050014eeef44b978ff78d357fd60d3eb7b42f9ed7f42f94f7c0853dc7d1853f003182ad3050014f8db40f93f09007141380054e87342f90a0180d20a00f0f2BBL8;FFea2f5b29f6c3023980a20191a18301d10809c05a290", + "9c05a7f9302f8e82712294809c05a6b09c05ae92b5c29e82f1329220080527f1302f82809c05a4a09c05aL8;FFb5620091e0010054a1825ff881ffffb4a00240f92200805217580094f8ffff17e027c13de8a344b9b47e0853e137c13de063813de89305b921418e3c76000014L16;FF680240f9bf0208eb", + "4109005447000014680240f9897e0753bf0208eb3761193261000054e00313aa71d20094680640f99f0248f117693538d50a0091750a00f9BBBL8;FF65fcff97a02d00b5f7031faad1ffff173f040071a00200543f08007121030054e1230091e20313aa5bfcff97002900b5f7031faac7ffff1721630091", + "e20313aaL8;FF85ffff17f37749f97f0600b1e0020054e18f49f93f0400b140010054810000b4e09349f92200805213780094e19b49f9810000b4e09f49f9220080520e780094BL8;FFf44f42a9f50b40f9fd7bc3a81af80014f44f42a9f50b40f9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030", + "091080040f91f0900b1a1000054f44f42a9L8;FF21b040f9540000f9e20301aa340000f907000014f4af40f9d4feffb5f4fcffd094820b91f3ffff170004009101f05f38a10000343fbc007181ffff54400000f9BBL8;FFe2bf4ef9e3c34ef9e007409100800191e10316aa23870094e01bc43de11fc43de", + "223c43de09b843de19f843de2a3843d1438019400788052210080520d380194L8;FFe84305f9823eff97e10300aae14305f9e0032a9121fdffd021203f910202805223fdffd063e03c9104028052c9000014c80080d2e0232a39e0032a910800f0f2L16;FFe02740f9220080521bb80094fa031faad7fcff", + "17e11f40f9810000b4e0031caa2200805214b80094e16f40f9f44f40f9810000b4e04740f9220080520eb80094BBBBL8;FB830000002700000073686f756c642062652061626c6520746f20656e636f6465206865616465722073697a650000000080174000000000005600000000000000L8;FF01f97fd3", + "420080521b880094e8b740f91f0500f1ab000054e0bb40f901f97fd34200805214880094e8c340f91f0500f1ab000054e0c740f901f97fd342008052BL8;FF8233803de8bb02f9800703ad420344ad820304ad410341ad810301ad420342ad820302ad410340ad810300ad800745ad8233c03de8bb42f976", + "6e00a9623a803dL8;FFe0e30691f9a307a9e92344a9ead701f92a028052e1e30191e2430c91e4031baafa5700f9f6a708a929008052f6e30191e99701f909fdffb029213b91e9ab01f9BBL8;FF60620091e143059102288052755200a9760a00f91f480194ffc30a91f44f43a9fc0b40f9f65742a9fd7bc4", + "a8c0035fd6e00740f9eaffff17e0030091e82b00a9L8;FF85830091e00316aa060480527af0fe97facb40f9e86346395f0b00b161100054f7430f9108150036c08641a9a90302d1e8430f91a20302d12401019103048052L16;FFe86b00f9e8af43f9f40f44f9f67b44f9f57f44f9e8e700f9e8b743f9e82", + "b17a9e8bb43f9eac343f9e9231fa9e8c743f9e9bf43f9e8cf00f9e8cf43f9e8c300f9BBBL8;FFf44f4fa9f6574ea9f85f4da9fa674ca9fc6f4ba9fd7b4aa9ff030491c0035fd6ff0302d1fd7b02a9fc6f03a9fa6704a9f85f05a9f65706a9f44f07a9fd830091L8;FF08011fcb9f0208eba8040054340100", + "b4680640f9e10315aae20314aa0001178b1c680094e802148bb502148b680a00f9081340f9e00316aae10315aae2031faaBL8;FF080500d1e80300f9e003009180eeff97e10300aae10300f9a1feffb021681391a3feffb063300d91e0030091420180524400805205eeff97e10340f94fffff17L8;ZDBBL", + "8;FF28ffff9008891391e9008052e8271ba9fa0741b2e8df40f92083c13ce8c700f9e8a759a98082833ce8a716a978caff34e11740f921caffb4e00b40f922008052L8;FF04000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef82200805215280094c1825ff8e1feffb4c00240f92200805", + "210280094f3ffff17880240f9L16;FFe1031baa220080521ba80094ab835ff8f3031f2afb031faa53000014e90300f9180100b4e00315aae10318aa22008052f5030caa10a80094ab835ff8ec0315aaBBBBBBBL8;FB6e6f742067657420726563656976657220636861696e20696e666f2028c0012900062", + "07769746820c00022536b697070696e6720636f72727570742070726576L8;FF1f050071e1fcff54e2031f2a9508009408fc78d309fc60d3087b68782821084a095d1053095b69782001084afa0f40f9e80740f95f0308ebe1fbff54fb03002aBL8;FFe00700f9e00301aaf30301aae10309aa22008052f4", + "030b2a240600946aa240a9e00740f9690240f9e10313aa54692838080500911f0048f1680a00f9e3fdff54L8;FFe9b340b8889202b828008052955a01a9892e00b968620039f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd640fdff9000802e91BBL8;FFba035df812ffff", + "17a0c300d1e1031aaa22008052230080522400805286edff97b7035ef813ffff17a0c300d12200805223008052240080527fedff97a1035ef8L8;FFe6faff97e00314aa080c43f81f0500b160000054e10313aa0bfeff97950a40f9550300b4610a40f9680240f9960640f91f0101eb20080054680640f94", + "9038052BL8;FF977e02a99f5e03a99f6204a99f3e00f91f0900f1a1110054e00313aaffeeff9740010036210e00b5e0031faacfffff17e003082ae20313aa430c8052a1e8ff97L8;ZDBBBL8;FB08000000000000006467460000000000b8674600000000001868460000000000a0f5450000000000280000", + "00000000000800000000000000b066460000000000L8;FFe00315aa49018052ea1700f909692138cee9ff97e1630091918fff97807a40f9800100b4e11740f9e80f40f91f0101ebc0680054e81340f9090180522a040091BL8;FFe0179f1a34170194885a4039695a4039aa02000ad6020a0a1f01096be01", + "79f1a2d170194885e4039695e4039f503002a1f01096be0179f1a2717019488624039L8;ZFBBL8;FFfd7b43a9ff030191c0035fd6082000910924009142ffffd042803491e82700a9e8030091090000b0296104912900001408a000910920009142ffff9042b80b91L8;FFa2008052840180521048ff97e0", + "0740f941feff17c80080d20800f0f20809009147ffff17ff0301d1fd7b02a9f44f03a9fd830091480001aba2020054010840a9L16;FFe9f301f929038052e1430f91e8a303f9e3031d9162008052e8ab03f968feff9008011f91fa0310aaf4030eaae9a703f9e9af03f9e8b303f98cc8ff97f19f55a9BBBB", + "L8;FB801740000000000056000000000000005c000000220000007a1340000000000057000000000000000c010000170000007a134000000000005700000000000000L8;FF0811c0da081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aa080c48f81f0500b1800200", + "541bfbff97080040b20811c0daBL8;FFe8c31791e00313aa020d019469624039e8fefff008fd1d91ca028052e80b03f9f5fb45b9ea0f03f948fd60d3fcfb42f9e9231839b47e0853e0c2c13ce1c2c03cL8;FFf0031baafb0315aaee0317aaf5df5aa9ef031caafc031aaaed0318aaec0319aaeb0316aae9b", + "f40f9f6c740f903000014e9030a2af603022ac85d0012ea5d1853BBL8;FF9f0600b1e103959ae30317aae08300ade08301ade003803dccf5ff97a0877ead68ffffd008690b91a203df3ca303dc3cf943019149028052e0430191e08705adL8;FFe10314aae20316aaf70300aa21520094591740f9b7831ff", + "8190400b4541340f918520094e00319aa2100805211520094a00900b4e10314aae20319aaf50300aaL16;FFedf300f915b45ba9ec3f00f9edf700f90cb45ca9ed7f00f90dec40f9ed4b00f9e08400541f050071401200542c050014280441f9140340f99f0208ebe8979f1aBBBL8;FF240080528cfdff976", + "10a40f946ffff17e00313aae10316aae20315aa230080522400805284fdff97760a40f9680240f9080116cbbf0208eb09e9ff54e00313aaL8;FFe1d342f9e00316aacafdff17e04316912200805236110094e1d342f9dbfdff17e0431691e1031aaae20318aa30110094fad342f9e8cb42f908011acb1f03", + "08ebBL8;FF220080522300805224008052f4030caaf7150094e10340a9ec0314aa2aa040a9290040f90bfc63d35369283808050091280800f9cbfdffb43f0108eb93611932L8;FF004000915a03038a5a03008b60028092000019cb0000038a395300911900198b004300913f0300eb230100543f0b04eba", + "3f1ff54807a1f53007c40935f0000ebBBL8;FFe8cf42f949058052f4074091948209910969213828040091f67749f9e8d302f9df0600b1a033005480220291ba1e0094080040b20811c0da081540d2080d088bL8;FFe0fbc33de1ffc33de8e20891e0833f91000500ad75470094e88340f90aad41a909610", + "1910081c23ce97f01f9e9a20991ea6f01f9e02b4fa9eb7301f92001803dL16;FFc0035fd6e8c30991e1a3019102328052008107911fb2009480864dade0c309918276c03de10314aa02328052e08610ad81824cade28e803de1820fad15b20094BBBBBL8;FBb602000009000000cb1440000000000072000", + "0000000000002000000260000004b7962657220707265206b6579206d7573742062652070726573656e7420666fL8;FFfd430091680100b00841009108fddf8848030035680100b0080140391f050071a10500548f00009409fc78d30a7c185328feff90088130910bfc60d309796978BL8;FF3c00805254", + "2340f9b4031df874f1ffb509018052a8035df8755a00a9755e01a9785e02a97c6605a97b6200b9682603a9686604a9f44f4ca9f6574ba9f85f4aa9L8;FF3f0900f1e11a0054e8008052f6b74bf9f7bb4bf9e9830a91e8830a3928008052e0230891e143139142008052e96b02f9e86f02f9f67302f9f7770", + "2f9190d0094BBL8;FF6eddff97d1feff17c88240b8c9c240780a6342f8a80319b8a88317b8681200b908e342f8a9c31778692a00796a6201f868e201f808008092f51340f9685e00a9L8;FF7e010014c80080d2fa4340f9fb8302910800f0f2084500919f0308eba1020054e0833291a9efff97740100142", + "8008052e81300f9f32b41f9e83341f9f92700f9L16;FF61fdff54e87f41f91f0500b1e1000054ff7f01f9fc8301f93fff04a9fc8f01f9ff9301f9ff2b03b921e30091a2c303d118efff97e00100b4c0010014e86341f9BBBL8;FFe00302aaa0880094e80300aae00301aae10314aae8f80737d3ffff17e00", + "30091e82b00a98c780094ffc300d1fd7b01a9f44f02a9fd430091280840f9290040f9L8;FFfd7bc6a8c0035fd6e067c13de8d342f933ffff174b0080522c0100348c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c05009102000014ec031faaBL8;FFe92f4229a8831fb8ea430039e91301b8", + "e91b40b9eb6301b8ebc341f8ea570039ea6b0039e9b301b8ea7f0039eb1300f9e82b00b9a2f50094fd7b44a9f32b40f9L8;FFf31f40f908028052e1031f2ae82300f9e00313aa7f3e0039530300941f04003120030054f503002af7031faaf6031faa34008052bfd33da9e20216cbb6831ef8BBL8;FFe216", + "40d2e1031f2af91640d216140038843a01943f1f00f1a8010054800640ad80020191e103009122008052e00700ad800a41ade00b01adaa35019400e4006fL8;FF49008052f79304f9f69704f91f010071fc9b04f92801881ae9b340b91f01096b41050054e39349a9e0830991e2cb41f9e5734e39e183249", + "1260080525df0ff97L16;FFb50000b4e0031baae10315aa2200805219ba0094e16f40f9217b00b4e04740f92200805214ba0094fb031faaf0ffff17e8b743f929d34b78eb031c912093ce3cBBBBL8;FB8fd784c799f792e7a397a887b5b7bea7d757dc47c177ca67fb17f007ed37e62742e649f654c65fd6", + "6ea665b6788673961a6611760c46075636263d3620062b16L8;FFecff09a9e8a704a9ffa305a9e8af07a9ffa308a9e8b70aa9ffa30ba9e8bf0da9ffa30ea9e8df10a9ffa311a9e8e713a9ffa314a9e8ef16a9ffa317a9e8db19a9BL8;FF880240f9f36b41f9e97305b9e057813de15b813d680000b4e0031", + "3aa00013fd6810640f9810000b4820a40f9e00313aa110a01949f0b00b101030054e89f40f9L8;FF230080522400805211e6ff97e10f40f98effff17e0230091e10316aae20314aa230080522400805209e6ff97f60f40f9e80740f9080116cb9f0208eb09f2ff54BBL8;FF1f0500b1e1010054e82300f93", + "53b40f9345341b9285741b9e83f00b9b50300b54500001428008052e81300f9288f40f9e80f00f9289740f91f0500b160feff54L8;FFfd7b47a9ff030291c0035fd6ff8301d1fd7b03a9f52300f9f44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054080200341f05007141030054L16;", + "FFe85704f9e8ef40f9e85b04f9e85740f9e85f04f9e86f40f9e86304f9e85f40f9e86704f9e8e340f9e86b04f9e85b40f9e86f04f9e83f40f9e87704f9e8f340f9BBBL8;FFfa0316aabc2200b99f03096be00705ada00600ada3f3ff540600001420c3009163080094381f40f93af7ffb5bdffff17480080", + "52a00302d1e3830291e10315aaL8;FF1f2500f148100054c9fdffb0298111918a0000102b6968384a090b8b40011fd661ce40f9810000b460d240f922008052116a009461da40f9810000b460de40f9BL8;FF16faff97200600b5e1031faae2ffff17880248f81f0500b1a10000549f6608a99f7e09a9997", + "e0aa99fb200b981020291e20313aaecfaff97c00600b5e1031faaL8;ZFBBL8;FFecab4779e31b40f9eb3b00b9a00302d1e2e300918b1245f8e8fb0039e10319aae8b340f9e97304f8e9a34539ec7b0079ebf303f8e8f304f8e95f013988bbff97L8;FF21000014a00640ad2800805200030291e1430a9122", + "008052ffaf01f9e08716ada00a41adb5020191e8ab01f9e08b17adad250094880201d1ff3f0c3902fd47d3L16;FF24aa009468220791e0230091a21a0094e0630691e1230091023280521daa0094e1630691e00313aa0239805219aa0094ff830d91fc4f41a9fd7bc2a8c0035fd6BBBBBBL8;FB737061727", + "365706f73747175616e74756d726174636865742d623538643766353665333634356363642f303639353962342f7372632f76312f6368756e6b6564L8;FF40050054fb5a189b7a0b40f955fb7fd3ba0300b41b9e0094e00315aa21008052149e0094200600b4f58303a9750740f9e1031faaff2700f9e81f", + "40f9bb264078BL8;FFe10313aad4fbff97803240b980010034610a40f9680240f91f0101eb00030054680640f9090180522a0400916a0a00f909692138e10313aac7fbff97818a40a9L8;FFf6570da9f44f0ea9fd43029109604039e91f003717704229f30300aa1a0040f9a08300d1f40308aae103172ae", + "d100094b88f7ea9e0030191e1031aaae20318aaBBL8;FF340108ab42130054b400f8b6f5031faae00315aae10314aaaf590194140400b4185e0194e00314aa2100805235008052105e0194e0feffb4ff0600b1f40317a9L8;FFe8c32791a04700d1e9b705f9a9fdffd029c11d91e8b305f968008052e1c31", + "791e91703f9e9ff02f989fdff9029ed0a91e81303f988fdff9008f91491e90b03f9L16;FFc0080054680640f9490280522a040091e00316aa6a0a00f909692138e10313aa8febff97780a40f9680240f9080118cbdf0208eb08080054680640f9e10317aaBBBL8;ZBL8;FFf70300aa1f7e00940090805221", + "008052187e0094c09601b4e10317aa02908052f50300aa1b7e0094167e0094002c8152210080520f7e0094609601b4e1074091BL8;FFe0179f1ac0035fd620008052c0035fd6fd7bbda9f65701a9f44f02a9fd03009115fcdfc8f40302aaf30301aaf60308aab5010037a142009120008052def90094L8;Z", + "FBBL8;FFe03340f9e1031aaa220080521a3e0194b70000b4e03740f9e10317aa22008052153e0194e12f40f9a1d5ffb4e02b40f96dffff17a00301d1a82b3ca9863c0094L8;FFe94700f9e90742f9e93f00f9680000b4e00315aa00013fd6010740f9810000b4020b40f9e00315aa133e00949f0700b1201", + "c0054e25b40f9e8032a91e00316aaL16;FF78d34b78e82703a9e8eb40b9f4cb01f974934bb8e89f03b9e87340f9fcc301f9f79b03b9f7831d91e8d301f935200094e5b343f9bf0400b120bc0054e9831d91BBBBL8;FB27f1e8beaaf611e960475463a78121c6030a37f8a28c005b1a67000007d1fe28db64", + "53cfe88200000000ffcec917000000000000000000000000bbda11b80000L8;FF208e00940009805201018052198e0094206b00b4f80300aa1a8e0094c000805241008052138e009473008052806900b4a8009152130300a90808007928008052BL8;FFc40280529600001448008052e0a33239e8a73239c", + "80080d20800f0f246000014e05306f9e0833291e1feff9021203f9102028052e3feff9063003a9104018052L8;FF08fdfff0083d3e91b51200d1090140f9086140f8090000f909fdfff029cd3d91086000f8c8008052e92302a9c8018052e90741b2e88300a9e0030091e80f00f9BBL8;FF0901f83708710", + "a8b0a01805208a800a91f0000f9fd7b44a9ff430191c0035fd6497d1c53a90700340900be524901090b2a2080390871098bca01f8b708e10a8bL8;FFe8031faa080113abe300005480fdffd000c03e91c9490094e8031faa080113abc2010054090140b22911c0da291540d2290d098b2925019129fd46d3", + "0801098bL16;FF08e11d91e1032b91f20302aaf00303aae3031d9162008052f86305f9f60306aaf8030caaf5ef00f9e9a703f9e9af03f9e8b303f9e46700f9feaf02a9fa8700f9BBBL8;FFe8031faa0900f0f229017fb24a1d409208010aaa692200a9fd7b44a9f32b40f9ff830191c0035fd6ff0306d1fd", + "7b12a9fc6f13a9fa6714a9f85f15a9f65716a9L8;FF2007c03de9b341b92143c23ce8c741b9a6000014c8fdffd008e12a9169038052d0feff17eaa759a9e8430f912083c13c2183c23c2283c33c2383c43cfa9741b9BL8;FFb0f4ff97e10300aa60fdffb5480740f91f011ceb49600054e00313aafffaff9", + "7a0fc073728fc60d3086000b5200840921f1800f122600054287c035348600034L8;FF3a001a8b20010054e003154bb80a1b53bf1200715fcb20388d000054181480525fb31f3855c31fb880d25f38001000121803000b98d21f38f76343a9f96b44a9BBL8;FF2a120094f8eb4df934f5ff1748236639e20", + "7409120ffffd000e0059123ffffd06300209124ffffd084800691428009918104805248030039af29019448236639L8;FFe20743b9e8030291e003279115410191f603279198e3ff97080000b008211f91e3074091e8f707f9080000b008412a91e8ff07f948fdfff008a1169169038052L16;FF21000291", + "e20301ad22ae0094e0230291e10316aa42260094e8630891e02302913b240094e80f41f91f0500b140080054e0431291e1030091e3630891e20315aaBBBBBL8;FBd839400000000000e939400000000000fd39400000000000a03c400000000000b23c400000000000b81f400000000000c53c4000000000", + "000700000000000000L8;FFab835538a9631538a99355384a01084a6b01084aaa731538aaa355382901084aab831538abb35538a9931538a9c355384a01084a6b01084aaaa31538aad35538BL8;FF020a0054390700f194c2019161feff54080317ab22070054c902158b080109ab62090054691640f9090", + "100b42a0140b24a11c0da4a1540d24a0d0a8b4a250191L8;FFea03012ae1ab40f9fb030eaaf003182aef031a2afa0309aaf9c700f9ee03082ac1030014e96f42f9e87342f9e00316aa21c4805222008052e92319a90e160094BBL8;FF2a040091e00313aa09692138a14301d1aa031cf805dcff97b9035cf", + "8a8035bf8080119cb7f0208ebc8210054130100b4a8835bf8e1031aaae20313aa0001198bL8;FF2183c63ce84701f9e8a70691e04341f9400501ad2083c73c2183c43ce9b304f9400902ad2083c33cc282c93ce93304f9400500ad2a0080528083ce3ceaa71139L16;FFe02b40f9220080521bd600945f0f", + "00b180000054e80300910001029101deff97ff074091ff830c91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8BBBL8;FF1f0101eb602d0054680640f9090180522a040091e00316aa6a0a00f909692138e10313aa01fcff97550300b4610a40f9680240f9962a40f91f0101eb802c0054L8;F", + "F0969213828040091f68b49f9e8d302f9df0a00b1410f0054f9031faa84000014e1d342f9e8cb42f91f0101eba0730054e8cf42f949078052f807409118830991BL8;FFfd7bc2a818fdff17fd7bbea9f30b00f9fd03009101c840f9f30300aa810000b460ce40f92200805213f6009461d640f9810000b46", + "0da40f9220080520ef60094L8;FF087c4093c2feffb47f0204ebe000005484feffb400290091340000b081020e91207860f825000014001c0051340000b01f7c00710901005480020e9101290091BBL8;FFe143c33da7ffff17e8f342f9e06fc13de0074091e173c13df64349f900800991e85b09f9e83b4", + "9f9e277c13de0a3843de067c13de81700f9e83f49f9e1a7843dL8;FFe8eb03f9680000b008611591e99b04f969fdffb029211091e89f04f928008052a04700d1e95f05f9e1032a91e94705f929fdffd029ed0a91ea9704f9ea832491L16;FFe09742f9220080521bb60094e19f42f9810000b4e0a342f922", + "00805216b60094e1ab42f9610e00b4e0af42f92200805211b600946f00001428008052e86700f9BBBBL8;FB190100002e00000042024000000000006a00000000000000ca0000002e00000042024000000000006a00000000000000200100002e000000ef10400000000000L8;FF4a0140b24a11c0da4a15", + "40d24a0d0a8b4a2501914afd46d34a0500918b1a40b97f050071210400548bb243292b0400346b0140b26b11c0da6b1540d26b0d0b8bBL8;FF210141ad210301ad200942ad200b02ad200540ad200700ad4b99ff97e0234da982e20291e16340f9081140f900013fd6e03b02f9e8031691e13f02f9290c40", + "f9L8;FF40070054f5524da9340200b4b982009104000014940600f139c300918001005421035ef8810000b420835ef8220080521106009421835ff8e1feffb4200340f9BBL8;FFe02f40f9e10316aa220080521a460194040000143f0800b1c1010054f80300aae00318aac1c9ff9708008092686a00a9f4", + "4f5ba9f6575aa9f85f59a9fa6758a9L8;FF000440f9220080521b460014c0035fd6fd7bbea9f44f01a9fd030091010040f968028052290041d23f8d00f12831889a1f6d00f14804005489fdffb029e10a91L16;FFeb2b5fa9ec6300f9ec030daae91700f9e98f40f9e6030caaed6b40f9e13b00f9e10308a", + "aeea713a9e99b40f9ea9300f9eabb40f9e87740f9e9a700f9e9eb40f9BBBL8;FFb70000b4e02340f9e10317aa2200805219660194e12b40f9810000b4e02f40f92200805214660194e14340f93f0400f18b000054e04740f9220080520e660194L8;FFf85f4ca9fd7b4aa9ffc30391c0035fd6f623009137", + "008052180d8052680240f9080540f91f0115ebe91a0054e00313aa49feff97e80300aae00301aac8fd0737BL8;FFc90080d248008052e02300390900f0f2e8270039e90300f9e00300917cecff97f44f47a9f92340f9f65746a9f85f45a9fd7b43a9ff030291c0035fd617008092L8;ZDBBL8;FF01f57ed3", + "420080521b260194686240f9a80000b4606640f901f57ed34200805215260194686e40f9a80000b4607240f901f57ed3420080520f260194687a40f9L8;FFe10315aae20317aa0001148b21260094e90344a9080009eb230f0054ff0208eb68080054340117ab020f0054f42300f9090740f9280117eb030", + "80054090340f9L16;FF6a018a1a4a01142b421b00545f01086bc20b005448018052840000145f01007109fa805237018a1a0901172be21a00549f02096b49000054df3200f91f050031" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines7 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines8.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines8.lean index adbdc6d13..9c88fee23 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines8.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines8.lean @@ -27,358 +27,251 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub8 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FF1fc2007161010054ff0d4071c0faff5408000014ef1d40928f696f384ffa073704000014ef1d40928f696f38cff90f3769010acb2b010e8b610108cb0000088bL4;FF93611932a00300540cfc6ad35369283808050091280800f92c0500b5e0030baa3f0108eb20010054290440f90a05", - "0091206928382a0800f9f44f42a9fd7b41a9L8;FFc0035fd6e8030091090000d029911f91f5a300a9e82300918002009000cc0b918202009042a02191e1430091e9a301a9e91700f9981f01940001805201038052BBL4;FF08048052e80302a9e2830091e103152ae81b00f9000400ade0c30191cfebff97", - "facf4aa9f9bb40b9fb0b00f9f30a00b4879f0194e00313aa21008052859f0194L4;FF7fffff1702d05f38421000124114010b221c0012f9ffff172500805201801fb805c01f381fe01f78caffff1703d05f38631000126114010b251c0012d4ffff17L8;FFa80f00f9e39f009468e20291810100d0218c16", - "91a40100b084e00d91a363009182018052a80f00f9da9f0094da9f0094fd7b41a9f31340f9ffc30091c0035fd6BBBL4;FFe86b00b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300ebc37c00541803008bL4;FB737472792", - "f696e6465782e6372617465732e696f2d313934396366386336623562353537662f62797465732d312e31322e312f7372632f62797465735f6d7574L8;FFe0cb00f902014ca9e9bf00f9090d43a9e2eb00f90e4548a9e09b00f900514da9e9ff00f9094144a9121149a9e0a700f917014fa9e9db00f90931", - "45a902154aa9BL8;FFfd7bbda9f65701a9f44f02a9fd030091f30303aaf40302aaf50301aaf60300aa8b5f01940008805201018052895f0194800100b48002c03d165400a9e10200d0L8;FFe00740f941feff17c80080d20800f0f20809009147ffff17fd7bbda9f50b00f9f44f02a9fd03009148008052f", - "503012ae10303aa000d002af30303aaf403022aBBBBL4;FFf40308aa150840b9f30300aae80e40f9f50f00b9880700b4e00642a9e2330091f663019140fbff9709fc79d3e0e7076fe8031faa0b0c8052210d010eea2640a9L4;ZFL8;FF290040f91f1040f15369283808050091280800f903feff540b7c07", - "533f0108eb6b611932000100544b692838080500911f0048f1280800f9a202005400fc4ed3BL8;FF010300d021d02891e8030091c2018052df7f019468620091010300d021082991040300d084e01291e0030091a363009122018052a80f00f9d67f0194010300d0L8;FF1f0101eba0880054e81340f9938", - "248f84901805209692138210400917f0a00b1e11700f961260054e80f40f91f0101eb00900054e81340f929040091e91700f9BBBL4;FF539a00942800809260220039680200f9f44f47a9fd7b46a9ff030291c0035fd6ff0307d1fd7b16a9fc6f17a9fa6718a9f85f19a9f6571aa9f44f1ba9fd830591L4;", - "FB7570706f727465646a7573742070726f6d6f74656420612073657373696f6e00447c4900000000002d000000000000006a0000000e00000072656d6f74652069L8;FF6083c63c6283c43ca103933c6183c53cfc8f00f9e10302ad6083c33c6183ca3ce00b01ad6083c93c6283c83ce00704ad6183c73ce", - "10b03ad1cffff17fd7bbda9BL8;FF0a010039d6ffff170b7c1253ec0f80120a0900390c440c33090d00396a6d1c320a0100390c050039cdffff17f703002ae0230091e10314aae20315aa89ffff97L8;FF4c0000143f104071c30b00544b09c0396c1d00122c380c0b811140516b00f8376b008052430000", - "143f004871030b00544b0dc0396c1d00122c540c0b81014851BBBBBL4;FF890080d2a8831d38480080520900f0f2a8931d38a0c300d128017fb2a8031df880050194f70300aab6ffff17e80741b28dffff17e80741b29affff17e80f41b2L4;FF9f0f009408c48052e00316aa01c48052e8e301f9088c815", - "2f6df01f9f9e701f9e8eb01f9d3050094f90300aaf60301aae8830891e043139101810091a44700d1L8;FF6002009000e0389163020090638032916402009084c03991a27f0091e10680529f0f0194ff8301d1fd7b03a9f52300f9f44f05a9fdc30091138440a9f40300aaBL8;FFa0e301d191010094a082", - "c23ca182c33ca282c43ca88358f8e08705ada082c53ca103d93ce82700f9e28306ada082c13ce18304ad3a2f40f9fb3300f99a0700b4L8;FF230300548c0500f1ed030eaa81feff54ca010aab220200542801088b480108ab8202005409804039000509ab22020054fd7bc1a8c0035fd6e8031faa091c40b", - "9BBBL4;FFe9031faaeb031faa0c0e80520d0440f94a350c9b29350c9b6b350c9b0a2500a90d2d01a9c0035fd60aa040a9090e80520b0040f9ec0d80920929099b0a0c40f9L4;FBed85a28c0000a7d4f13656e20000f02c262a66d154ce8391271a8b429c3385f592d3e1bca9382dc28cfc233fab8ad5a05f", - "8bd566a27c2d97cce9733a9e4aa29aL8;FF8103c03de86f46f9e0c7833de1f7803de8f301f9280200d008b140f9e2c345a9ebbf40f9facf40f9e31340f9f7f340f9f44b40f91f0900f1ebbf00f949030054BL8;FF22008052964f0194e12740f9810000b4e00315aa22008052914f0194e12340f9810000b", - "4e01f40f9220080528c4f0194ff830891f44f45a9f65744a9f85f43a9L8;FFe0234d39c282853ce11740b9e33740b9408708ade42740b9fb6304f9020140ade8031691f56704f9f76b04f9428309ade90300f9bf83fe97e8c342f9200bc03dBBBBL4;FF0881259169028052a14300d1e203009103048052a", - "8273fa9e00300ad96390094e00740ad600600adfd7b43a9f32340f9ff430191c0035fd6fd7bbda9f65701a9L4;FBc9944800000000004d00000000000000e8010000170000005768697370657247726f7570696e76616c69642073656e6465722072617463686574207072697661L8;FFf85f05a9f65706a", - "9f44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf40301aa49efff97e80300aae00301aa08020037750240f9a80640f9BL8;FFe30200f063002291040300b084c01d91a27f0091e1068052a16f0194ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aae10200d021982a91e", - "8230091L8;FF1f0101eb00400054e8cf42f92a040091c02202914901805209692138ead302f90f280094e1431691210d0094e0a749f9800100b4e1d342f9e8cb42f91f0101ebBBBL4;FFf51300f9f44f03a9fd430091e90300d029c1009129fddf88a9060035e90300d0290d40f9a90800b4f40300d09402", - "0091f30308aa880642a902a00191f50300aaL4;FFf65742a9fd7b41a9ff030191c0035fd6ffc300d1fd7b01a9f44f02a9fd4300913f4000f1f30300aa280100543f0013ebe8000054e00313aa21008052f44f42a9L8;FFff030ed128f840f9f30301aae20700f95f0008ebc109005448008052f50300aae0", - "430091ff2301a9e10303aaf40302aae87f03a9b84301d1ff2304a9e87f06a9BL8;FFea6706f9e87306f9e97706f9a02f0194e1fb44f9810000b4e0ff44f9220080528f2f01948a2f01942002805221008052882f0194804000b4880c8052890200f0L8;FFe40f00f908b140f91f0900f1e3160054176040a", - "928008052f40300aaa8ff37a9d90000f039473d911a008012e803019115e3009116630191a0a301d1f30303aaBBBBBBL4;FF680000b4e00313aa00013fd6810640f9c10000b4820a40f9e00313aaf44f41a9fd7bc2a88e170214f44f41a9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091L4;FF1f0500f", - "1cc140054c82100b500e4006fa04700d1e143139137e3c0a9362340b902048052e03b813de037813dbac9ff97e9bf5339e84353390a088052e0074091L8;FFfd030091f30301aaf40308aa810100b4f60300aa8e170194e00313aa210080528c170194c00200b4e10316aae20313aaf50300aa9217019402", - "00001435008052BBL4;FF6281ff9720f2ffb4b2000014a88359f81f0500b160030054e1420291a2e300d15a81ff9720f1ffb4ce000014bfe330a9bf8311f8a1e303d1a2e300d15381ff97L4;ZBL8;FFa9c318386901084aabf35838a9d318384901084a220080526801084aa9e31838a8f31838e18305adf", - "46b00f9bf970094e08745ada8035ef87f1e0139e82300f9BBBL4;FFc8030090080110918902805268a600a909008092690200f9fd7b46a9f33b40f9ff030291c0035fd6a8935db8a9c35db8a1a300d1abab7ea9e00313aae80b00b9L4;FB34356363642f303639353962342f7372632f7574696c2e727300", - "2f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d6235L8;FFf57b40f9e58f1da9e8174da9e18f00f9e3031baae9030eaaf7af00f9f7ef49a9e1d348a9ee0311aafa8700f9fa0302aae22f40f9f10312aab409001408234039BL8;FFe823931aa8000036e0031baae", - "10315aa2200805292570194e13349f9f3074091738209913f0400f18b000054e03749f9220080528a5701943f0700b160000054L8;FFe1031faae8830cb9deffff17e18b0cb940ffff17a88357f8080540f9150101eb232c0054a88357f8080540f91f0115eb290b0054a02302d18cf4ff97a0330037BBBB", - "L4;FF60a200a9090d40f9e823009120013fd6e80740f91f0900b100fdff5475de40a9f6830191e183c33ce083c43ce82f40f9e283c23cc18201ade083c03ce183c13cL4;FB74206072656d61696e696e67603a20c004203c3d20c0002f636172676f2d72656769737472792f696e6465782e637261746573", - "2e696f2d313934396366386336L8;FFff830191c0035fd6ff0302d1fd7b03a9f92300f9f85f05a9f65706a9f44f07a9fdc30091081c00121f09007181010054e00302aaf30302aaf40301aa44f7ff97BL8;FF696e00a9a8000054e00319aae1031caa2200805292770194e80600d11f0d00b148020054e03", - "740f9e10317aa0d000014e12f40f908008092686e00a9810000b4L8;FFe063813d9e770094fc074091f94315919c8301919f0600b1a0050054b8008052af000014e8074091f68f45f90023009108810991f40740919482099186c0ff97BBBL4;FF200100546a0240b24a11c0da4a1540d24a0d0a8b4a2501", - "916a1a4a8b4a05009102000014ea031faa6b0340b20801098b6b11c0da1c5100916b1540d288030a8bL4;ZDL8;FFc0035fd6ff4301d1fd7b02a9f65703a9f44f04a9fd830091f503012af40300aaf30308aa8ab7009400058052210080523600805287b70094c00b00b408058052BL8;FF400400540a1440", - "f9092040f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b26b11c0da6b1540d26b0d0b8bL8;FFe04b40f9fc031baa168116aae86340f9fb0315aaf5030aaa087f60b3f80308aaeaf5ff97c8fe48d3bf0a00b1a10000547a9a41f97bc641f9ea5b40f90", - "5000014BBBBBL4;FFe02300914202805244018052c7fc0094e90740f9e0feff17e00700f92104009021d429912304009063742a91e0230091a2018052240180521b000014e00700f9L4;FFf30308aa7be8ff97e80313aaf35741a9c7ffff17e0230091f30301aae10314aae20315aa230080522400805271", - "e8ff97e10313aaf35341a9cdffff17800000d0L8;FF6b090c8b60011fd6410200f021c01491e00308aae2028052fd7b42a9ffc30091cd070114a9600091410200f021801a91a9831ff8490200f02b011a91430200f0BL8;FF080040b20811c0da081540d2080d088b08250191081848ab42150054170117a", - "b62150054180700f194a2019161feff54e80216abc2020054080115abe2140054L8;FF4100805293870094e01300f9201300b48f870094e00315aa410080528d870094e00f00f9601200b489870094e00315aa4100805287870094e00b00f9a01100b4BBBL4;FF8401805226000014e04300f9a103009021", - "242891a303009063582891e0030291e2008052440280521d000014e04300f9a103009021242891a303009063282391L4;FB69676e616c2f727573742f70726f746f636f6c2f7372632f646f75626c655f726174636865742e727300c01b2073657373696f6e20737461746520636f727275L8;FFe96b40f9", - "48fcff17960000b4e10316aa2200805292c70094e17740f9810000b4e05f40f9220080528dc70094b50000b4e05b40f9e10315aa2200805288c70094BL8;FFf50300aa92470194e00315aa21008052f40315aa360080528e470194a0feffb4080740f9f50300aae00314aa020000143500805209fc4ad30a", - "088052f4031faaL8;FF61020054010100b021fc1591e2028052d1470014ff8300d1fd7b01a9fd430091010100b021c01591040100b084401591e3230091e2018052e80700f9ca470094BBBBL4;FFf63b00f9820d005433008052a00302d1e3830291e10315aa0204805224008052f3830239594a009489e7", - "0194000480522100805287e70194a03200b4600740adL4;FB080000000000000084a6400000000000e81f40000000000028000000000000000800000000000000bca74000000000003c204000000000003000000000000000L8;FF200500543f18007121030054e8d341b968000037fceb00f9ffdb01b9c1", - "d20191a2c303d155e9ff97404000b5e1031faabaffff17603a00b5a0c303d144e7ff97BL8;FF130100b4a8035ef8e10315aae20313aa0001168b9a670194d602138bb6831ef8df0217eb61000054a0a300d1de660194a8035ef809108052d506009109693638L8;FF4801009008e12a91e90f02f94904805", - "2e82719a9e1031091e3430691e8271aa94801009008812a9142008052e8db00f966fcff970a0380d24801009008692b91BBBL4;FF42008052a31336a9381b0094a8c302d1a0820091e10314aad0800094a85775a9b40356f81f0500f121010054a81e00121f050071ac08005468090035b41e4092L4;FF21", - "00008a6000008a2100068b00400091410c00f9401400f9bf1c00f1c9020054a37c0391824006912100008b2100038b21f07d92419401a93f4005f169020054L8;FFb4250094a1d300d1e00316aae20318aa9ba70094a8c303d17b070091f60314aa00c1cb3c01c1cc3ce80f40f90c088052000500ad3ae7f", - "fb4eb430391ea830091BL8;FF09028052936a29f8880200f9f44f41a9fd7bc2a8c0035fd620008052800600f909028052936a29f89f0200f9f44f41a9fd7bc2a8c0035fd6ff8301d1fd7b04a9L8;FFc0035fd6ff8300d1fd7b01a9fd430091e023009101018052ff0700f9c4260094e00740f9fd7b41a9ff", - "830091c0035fd6ff4303d1fd7b07a9fc6f08a9fa6709a9BBBBBBBL4;FF0a2100d1eb0328aa29551b9b0cfc79d34a01148a2c6b283828030a8b9c0700d16b651b9b0c210039e80600d11701178a2001c03d6001803d218141ad228d40adL4;FFa8035ff8960200f9881600f9280080528082803c8182813c6", - "8620039f44f4ca9f6574ba9fd7b4aa9ff430391c0035fd6a00000f000802691a01b0094ff0306d1L8;FFdff8ff97fd7bbca9f85f01a9f65702a9f44f03a9fd030091f30302aae20301aaf40300aa34010037e00308aae10314aae30313aaf44f43a9f65742a9f85f41a9BBL4;FFe95f5339eb635339fb121", - "e38fb425e38e8221e38e8525e38fc321e38fc625e387b031e4afe4b40b9fb421e38fb725e3808011e4afe5340b9e8521e38e8825e38L4;ZFL8;FF800100543f0400b140010054810000b4600640f922008052919b0094610e40f9810000b4601240f9220080528c9b009428008092680200f9f30b40f9fd7", - "bc2a8BBBL4;FFafdb019420008052018c8152acdb01942000805221c480529edb0194e00b40910108805200c01991b2db0194a0280035e80b4091e00b409108c11a9100401991L4;FBf0114900000000000a0000000000000055496e74363456616c7565000000000010124900000000000b000000000000", - "00aa0f4900000000004d00000000000000L8;FFe8e342f9e9a30fa969018052e97300f9e6e300f908008092ee6b40f9ebf300f9fb0311aaf10300aae7af00f9e70316aae00319aaf4031eaae6030caaef8f00f9BL8;FF08c13591e94309f9290080d2e85f09f928038052091ac0f2ff3309f9e83b09f9ff3", - "f09f9ea4709f9e85309f9e95709f9975b0194f6ef47f9e01bc43de11fc43dL8;FF6002803d680a00f9f44f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd6e0230091e1031faa76ffff97a9ffff17ff0306d1fd7b14a9fcab00f9f65716a9BBBBL4;FF69620039ffc31291f44f46a9f65745a9f85f4", - "4a9fa6743a9fc6f42a9fd7b41a9e923c76cc0035fd6a2820091f40300aae00315aa210080522300805202deff97L4;FB652f6d6f642e7273002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e2d6c696e75782d676e752f72656c656173652f6275696c642f6cL8;FF21f41891430", - "200b063501991e083009122028052a400805211000014e10740f9e10000b4e80b40f9f30300aa22008052e00308aa8afb0094e00313aae01300f9BL8;FF7f6a00b98b000054601240f922008052937b0194611a40f9740e00f93f0400f18b000054601e40f9220080528c7b0194612640f9741a00f93f040", - "0f18b000054L8;FFe11740f91dfbff17e0630091e1031baae20319aa23008052240080524192ff97fb1740f9e80f40f908011bcb3f0308ebe963ff54e0630091e1031baae20319aaBBBL4;FF0301028be10308aaa89200942800809260220039680200f9f30b40f9fd7bc2a8c0035fd6800300d000200d91", - "820300f042e0009101048052aabb01940a2045a9L4;ZBL8;FFe10740f9810000b4e00313aa2200805293bb0094e10b40f9810000b4e00314aa220080528ebb0094f44f54a9f65753a9f85f52a9fa6751a9fc6f50a9fd7b4fa9BL8;FF098d40f83f0500b140220054f30300aae00308aa20020094e80300aa", - "e00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b13050091L8;FF6b9241f9689601f9619a01f960a601f96aaa01f969be01f96bc201f962c601f9481940f900013fd660ce01f961d201f9290c40f9e8430f91e1031baafb5f00f9BBBBBL4;FFe00315aa6a0a00f909692138e", - "10313aaa4f7ff97770a40f9680240f9080117cbbf0208eb081f0054680640f9e10316aae20315aa0001178b910b0294e802158bL4;FFcfe3fe97f60300aaf70301aae8f3009189008052e08702a9e0030091e163009142008052e8a701a98c030094b70000b4e00316aae10317aa22008052880b0094L8;F", - "F081040f809a040b80af040b8e1230091e80700f9081440b9e92b0229099041f8e81b00b9081042b8a05300d1e9c301f8e82700b939faff97a8c35e3848030036BL8;FFa90300d0290140f94ad03bd55301098b694240393f05007181010054600640a92a0300b04a61199109040091400540ad690200f90", - "00500ad000502a9f44f41a9L8;FF948b0094fa0300aaf91700f9a06e00b4b90000b50c000014ff1700f95a008052390100b4e8031faa490b00916a7a687828e11f78080500913f0308eb2a450078BBBL4;FF28008052e81b00f928008052e84b00b9e00306aaf40306aac9a30094fc0300aae00316aaf803", - "01aac5a30094e92b40f93b1940f9bb00f8b6fa031faae0031aaaL4;FBd5184900000000006a00000000000000bd0000002e000000000000000000000008000000000000000800000000000000ccf84500000000000000000000000000L8;FF9fcb0094b10300146083c83c6183c93c6283ca3c685f40f9e0", - "7f813d6083c43ce183813d6183c53ce287813d6283c03ce06f813d6083c63ce173813d6183c13cBL8;FF418147ade8a700b9e81340b9430905ade4838a3c8001803de8d302b9214b803dfafdff17280300b008b140f91f0900f123030054e8b30a9189ffffb029f13991L8;FF6b2501914a194b8b4a05009", - "1090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab820200542a0140b24a11c0da4a1540d2BBBBL4;FF84c01d91a20700d1e1068052a4eb0194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff430ed1e8b79752f603012a08febf72290008", - "0bL4;FB0800000000000000c8c3420000000000616464726573736f7055756964537472696e675575696442797465734b7962657220707265206b6579206d7573742062L8;FFe00313aa22008052230080522400805244020094610a40f9d9ffff17f50300aae00313aa2200805223008052240080523c02", - "0094610a40f9e00315aadfffff17BL8;FF680b0091ba031df805000014e80b41b2a0031df802000014680f0091a0e300d1a8831cf87f610094fa0300aa32000014fa031faa30000014ba035df82e000014L8;FF3f040071f30300aae102005428008052490100d029811091ff2300a908048052a06300910", - "800ac72e1630091a21b00b9e92302a9e8030091ff2301a9dcdcfe97BBBL4;FFffff0039e80319aa02fd46d31ae17a9219154092e20000b4e83340f980030191e10318aa0801028be83300f9bfab0194e003009101031a8be20319aaf9ff0039L4;FF4a290baa0bfc4cd34a9d0caa0c4812536b017b924a01", - "0baa6b320c534a8d0caa6c5a1653480163b24801889a6a5214533f39406a08ad0baa0b200853082d0aaaL8;FFf5031faaf70316aae00315aae10317aaa0ab0094e0230191e18307910230805297ab0094f42340f928008052f51f40f9933240b9e123019102308052a0220091BL8;FF880200d008411891e", - "8d302f9e80180522083c13ce8f304f94003803d28ffff17e94341f9295541b9e91700b908b140f9fb2740f91f0900f1c9040054e23740b9L8;FF381f4092fa0f41b2e80318aa9c02001438ff48d31a0180d21a00f0f2091f4092fb0309aaa1035df8415300b59d020014090180d20900f0f23a017fb2e91f", - "4092BBBBBBL4;FF280800f90cfeffb40a7c15533f0108eb53611932200100542a0440f90bfc63d35369283808050091280800f98b0200b5e0030caa1b000014e10300a9e00301aaL4;FFfa030caa96130094e20317aaf7c740f9ec031aaafa0319aae9031baaff0600b1800a0054e0431391e10309aae9b7", - "00f9f9090094ec6b42f9ea6f42f9fb7342f9L8;FF0060309199130194600200b000202d91a7130194600200b000202c91a4130194600200b000802c91a1130194600200b000402f918d130194600200b000c03091BBL4;FF79ffff17fc0301aafb0300aae0230091e10319aae2031caa2300805224008052", - "a386ff97f46741a9e1031baae2031caa8002198b92930194e0031baae1031caaL4;ZDL8;FFf44f43a9fd7b42a9ff030191c0035fd6fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091084c80b9f30300aac80a0034080140b20811c0da081540d2BBBL4;FFe01700f90800f0f20d000014e90b41", - "b2e92302a90b000014e90b41b2e92302a91f000014e90b41b2e92302a92b000014880080d20800f0f208050091e81300f9L4;FB4cb8a28c8c21d2aa0000ed5dea1973d2900cd2a9b9f378c0466add7306d95319235ef973d2aa00006dbd045484954f2d782971ba62157026a08ce8baee34a28cL8;FFfb03", - "0baacb008052e99b00f9e9cb40f9e06700f9e00302aae22f40f9e9eb00f9e98b40f9f73b00f9f70301aae9b700f9e9c740f9fed300f9fe030faaef0319aaBL8;FF00011aabe2650054e1431691400d0094df0600b18000005480220291e1431691351200943f0700b1f90b40f9e07aff5400c303913c0100", - "14e8031faa000119abL8;FFe8a344b9f59302b93f0500b1c002803de8a702b9002c0054e8c3179160630291397afe97e8c357391f050071002c0054e9c31791e8c757392021c03c2121c13cBBBBL4;FFb74301d1e2031aaa28000014b4035df8c8ffff17a0831cf8e10300f021442391e30300f063882391", - "a0e300d1220280526401805209000014a0831cf8e10300f0L4;FB6d00000000000000726567697374726174696f6e5f69642069732072657175697265647369676e65645f7072655f6b65795f6964206973207265717569726564L8;FFe00300916201805264018052eaffff17e80f41b2dcffff17e00300", - "f9210200f021c81b91230200f063f01b910f000014e00300f9210200f021c81b91230200f0BL8;FF4d000014a00301d1ec740094f60301aac0f707361500001401008092280400d17f6600a91f0d00b108f0ff54e00317aa220080528a7301947cffff17280b0091L8;FF1f2d00f10831899a1f2500f1282", - "30054490100d029f13e918a0000102b7968784a090b8b40011fd6f37749f97f0600b1e0020054e18f49f93f0400b140010054BBBL4;FFa003d53ca103d63ca203d73ca303d83ce31b803de217803de113803de00f803d8bb30194000280522100805289b30194600300b4e003c03df60300aa0000803dL4;", - "ZBL8;FFf1c11fb8e0c19e3ce2c19d3ce1c19c3ce0c3c33ce1c3c23ce2c3c13cf14f40b9e18100ade201803df1490629efc1019121fbff546801088b08050091290308ebBL8;FFd4ebff97a0f5ffb4650100141f0800f1c1240054a80302d1a10302d1a22302d11f7d01a908018052bf5b38a9b67f3aa9bf2", - "33ba9bf6b3ca92ceeff97e03100b5L8;FF0800f0f2080900d1ca000014e04705f9e80b41b2c7000014c80080d2e14705f90800f0f2080900d1d0000014c80080d20800f0f2080500d1be000014e04705f9BBBBBL4;FFffc30191c0035fd6ffc301d1fd7b05a9f33300f9fd430191a8ae8cd2294c8ed2aaed", - "8dd2680eaef2a9ccadf28accadf2a8accdf2a9ecccf22a4ccef2e86deef2L4;FFe1030eaa29210a1bef0310aa287d60d3a8020037bf020014e9031f2a4c018052ea0100b4297dac9b3f7d60f2415600540b1540386bc100516901092bed379f1aL8;FFf30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd", - "03009101c840f9f30300aa810000b460ce40f9220080528c03019461d640f9810000b460da40f922008052BL8;FFfd7b43a9ff03019160001fd60880009109200091020300d042303991e82700a9e8030091090000b029911e91200440a9e82701a9e8230091090000b029f11991L8;FFd2830094620100d", - "0420036912c00001408200091410100f021b41991e80300f9e8230091e00309aa02028052c7830094620100d0420038912100001408200091BBBL4;FFeec40094e80300aae00301aa68f8073680f5ffb420000014f5031faaf7031faa1800809214018052e0a30a91e1230091022a805292c301941f0700b", - "1a0000054L4;FB54000000000000005f00000005000000f26449000000000054000000000000006500000005000000f26449000000000054000000000000007300000005000000L8;FF9f0700b115df78b3600e0054e8274ea9e0831d91e1c31591fcbb02f9f7c302f9e9bf02f9eb8b05b9ec8f05b9e8cb0", - "2f9db180094e0b343f91f0400b1200f0054BL8;FFe10313aae81f40f9c80000b4e02340f9e10308aa2200805291430194e10313aae82b40f9c80000b4e02f40f9e10308aa220080528a430194e10313aae10700f9L8;FFe143c83c03e4006fe283cc3ce8430691e0c30e91808506ade083cb3cc1e20091e2", - "430e91fa030b91808907ade3838b3ce3838c3cb876fe97e89341b9080e0036BBBBL4;FFe85341b9e8f300b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eba3fc0054L4;FBe8020000050000003de84800000000004d00", - "00000000000053030000090000003de84800000000004d000000000000005b030000090000003031323334353637L8;FF9f0a00b1e0d7823de8b305f901010054e0d7c23de8b345f909008092690200f96082803c680e00f9a5000014e8030091418300910228805200810091fc030b91BL8;FFff8300d1f", - "d7b01a9fd430091080040b9a01300d1a8c31fb8eb630194fd7b41a9ff830091c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9L8;FF560909aa1730889ae0db04a9f70400b4150340f9f60300aa080014eb23100054ff0208eb09010054e0e30091e10317aa220080526c42ff97f423", - "44a91f0114ebBBBL4;FF8dfbffb5f9ffff17200140fd00a8200e0b00669e6b01c0da6b11c0da6bfd43d3ec020acb6a010acb4a010cca4a01088a5f2100f162fbff540afc79d32a693738L4;FFc9020054f35341a9fb7345a9e303004b0100230a411800b96000006a00030054e303004b22c59c526000000", - "a62eda072010000f021400491007c021b007c1b53L8;FF4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54a00100d000000d918ca30094a00100d0BL8;FF080040391fad007161000054210400d100040091e8030091fc230194e803", - "40391f05007121010054e8074039680600392800805268020039fd7b41a9f31340f9BL4;FF4c010054080200341f05007141030054000180521d000014280180d20800f0f2081d00d11e0000141f150071000200541f11007141040054280180d20800f0f2L3;FB010000000600000000400a00000000000", - "0304a000000000000304a00000000008801000000000000c40700000000000000100000000000000700000004000000BBBBBBBBL4;FF280108cb680a00f957feffb4e8e67ad3081d019108e57a92e902088b212500b180fdff54000308cb020180528c1d0294e8ffff17e003032a901d0294f40300aaL4;F", - "Fa0c300d1028d40a901a3009117130094b95f7da9b55b7ea93f0b00b1e1020054760300b4a8c300d1e00315aae10316aa0a29fe97b9035df83f0b00b101080054L8;FF2100805236008052921d0194400200b4e10315aae20313aa930200a9981d0194930a00f9f44f42a9f65741a9fd7bc3a8c0035fd628", - "0080529f0a00f99f2200a9BBL4;FFdf0215ebf54702f9f84b02f9ff4f02f928090054f9031faae8031faad60000b40003198be10317aae20316aa949d0194e80319aa0801168b7f0700f1b60208cbL4;FF200c014e0400028b5f8001f1a80300545f4000f102020054013c084ea2001836010000f981801f", - "f8c0035fd61f2003d582001036010000b981c01fb8c0035fd6L8;FFb30f00f9e39d0094e39d0094fd7b41a9f31340f9ffc30091c0035fd6000040f90ff9ff17ff0301d1fd7b02a9f44f03a9fd830091140040f9e00301aa810100d0BBBL4;FFe10319aae2031f2ae0023fd61f0000f1ad000054390300ebc", - "33d00541803008b060000141f0400b1413d0054afdd01941f100031c13c005439feffb505000014L4;FB6172792f616c6c6f632f7372632f737472696e672e7273001a696e76616c6964206368617261637465723a20666f756e642060c0056020617420c00029696e76L8;FFf60307aaee4700f9fceb10a", - "9fc030daae64f00f9e48f00f9f5b700f9e0d6ff97ebc341a9e70316aafe5756a9f22b40f9ecdb53a9e64f40f9e98740f9e03340f9BL8;FFff0600f17f7e01a97f2200a9687e02a908008092681a00f98a15005449040014e807409180020291f507409108810991b58209913c900094f43349f94083c03cL", - "8;FF610a40f9b9ffff17e00313aae10318aae20316aa7b010094780a40f9680240f9080118cbdf0208eba9f7ff54e00313aae10318aae20316aa72010094780a40f9BBBBL4;FF400140fd00a8200e0c00669e8c01c0da8c11c0da8cfd43d34d696c38c1ffff17000400f000801491a4fd0194ffc301d1fd7", - "b02a9f91b00f9f85f04a9f65705a9L4;ZFL8;FF07000014890080d248008052e02300390900f0f2e827003928017fb2e0030091e80300f97ff3ff97e10300aae00301aaf44f45a9f65744a9fd7b43a9ff830191BL8;FFd57d011409200091210300b021400291a9831ff8240300b084c0019126030090c6e", - "03291034000910601001421030090217c3691e00308aa22038052fd7b42a9L8;FF9be2ff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb28260054400100d000c012918d7d0094e8031faa000117abBBBL4;FF600600ad620a803d480500b5f44f4ba9f55340", - "f9fd7b49a9ff030391c0035fd6e80740f91f0900b141020054e8031faaf5031faa1401805206000014e80740f9L4;FB40864900000000001100000000000000650100000500000040864900000000001100000000000000690100000500000040864900000000001100000000000000L8;FF000480522100", - "805292bd0094200600b4c00640adf80300aa610240f9000400ad810000b4e00317aa220080528cbd009408048052686200a9680a00f984bd0094BL8;FFfd7bc1a8c0035fd6a00200f000c01f91963d0194a00200f000c02791933d0194a00200f000200891903d0194fd7bbfa9fd030091081840f9080100", - "b4080140b2L8;FFa0031df80101009021a400910301009063180191a0c300d1420180528400805223000014a0031df80101009021a400910301009063100191a0c300d142018052BBBBBL4;FF770a40f9680240f9080117cbbf0208eba9efff54e00313aae10317aae20315aa2300805224008052a100009", - "4770a40f975ffff17e00313aa2200805223008052L4;FFe1af40f922008052950d0094b50000b4e0df40f9e10315aa22008052900d0094f85b5ca987000014e0d7c53de1dbc53de0431391e2dfc53de037813de13b813dL8;FFe10300aae0230091220080527efbff97e90740f9e82740b9aa058052e1230", - "091e00313aa82048052e90700f9e92f4229a8831fb8ea430039e91301b8e91b40b9BL8;FFe00316aa21008052928d0194000c00b4e10314aae20316aaf70300aa988d0194591740f9b7831ff8190400b4541340f9878d0194e00319aa21008052858d0194L8;FFf30300aa1f0500b1e0030054e00313aa7f", - "000094080040b20811c0da081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aaBBBL4;FF220080522300805224008052a8c0ff97e12740f9cdffff17a06a40b9e0d7ff34e12740f9e81f40f91f0101eb81d6ff54f30300aae0e300912200805223008052L4;FB70d4a", - "68e0000000000000000798b9ccdcae002bc000000000000000000000000000000000000000000000000c8c5defb7d6bdb1a0000ce4611267d9401f6bd6dL8;FF688a1ca9e87f40f9022f805269c21ba968d21da968a207910001803de88340f968fe00f996cd0094e08750ad68e20d91e91b41f974d601f9", - "000500ade87740f9BL8;FF204b803d8ac100f8204bc03de8d342b9c90200f029c125918101c03de01b40f92043813ce1031091e8a301b9e8b341b92007c03dffeb01f9e80303b928008052L8;FF482740f91f0500b120030054592f40f95b6340b9991100b4542b40f98c4d0094e00319aa210080528a4d0", - "094c01300b4e10314aae20319aafc0300aa904d0094BBBBL4;FFa4ed019420008052e10316aaa1ed0194ff8301d1fd7b04a9f44f05a9fd030191018840a9f30308aa28008052141840b9e0830091e373009124008052e8730039L4;FB4f9d4800000000007500000000000000020000001c0000004f9d480", - "0000000007500000000000000250000002000000063757272656e744b7962657231303234L8;FF3f1400716105005481c20091e20313aa6becff97800a00b5e1031faae6ffff173f040071600300543f08007121040054888244f81f0500b1810000549fde04a9BL8;FF94ea1b910e000014f90309aa1655", - "40a9e00313aae10314aa62008052e66d0194a0070037e00313aae10316aae20315aa5a033c0ae06d0194e00600353f0b00f1L8;FF9efbff17e0431691220080527d110094e1d342f9fdfdff17e04316912200805278110094e1d342f963feff17e04316912200805273110094e1d342f9abfeff17BBBL4;F", - "Fa9635c78ac835cf8a88315b8a8035e78aa831af8aa135c38a9c3157869038052a8031b78680300d008813391a8a73ca9b7031cf80a0c0036ea27412948bf70d3L4;FFc0035fd6ff0301d1fd7b02a9f44f03a9fd830091010840a908018052f30300aae023009129f87fd33f2100f13481889ae30314aad7", - "ffff97e80740f91f0500f1L8;FF00210091a22300d121008052a30100b063802191a40100d084001191e80b00f9a9831ff8c2ad0094e00f40b968e34039a102174a1f05007180fcff543a070094BL8;FFe95f04f9a62d019420008052e10319aaa02d019420008052e10314aa9d2d019420008052e10316a", - "a9a2d019400018052e10313aa972d019420008052e10317aaL8;FFe10315aa22008052952d0094da0e009123000014fa074bf9fb0b4bf9e0e31791f90f4bf9fc134bf981e20091f8174bf9f51b4bf902278052912d0094f7e742f9BBBBBBL4;FFa8035ef8b7031ff8140117ebe3090054b8237da9b6835ef", - "81501178b680240f97f0a00f99f0208eb08040054f7031faa08011fcb9f0208ebe8040054340100b4L4;FF6083853ce00755ad62838c3ceabb0bf9e3e7c53de4f3c53de0d7853de2dfc53dea1b4cf9e02b813de0efc53de1db853de12f813de1e3c53de027813de00bc63dL8;FF1f0500f120010054e80b4", - "0f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031faa9b150194e00741a99915019408184039087d04531f1900710419417aBBL4;FF1f030071a012969ad512959acc6d0094fa0300aae00315aafc0301aac86d0094950317ab02240054f80301aa360015aba22300549601f8b6fb031faae0031b", - "aaL4;ZBL8;FF3f0500b1e01e0054f30300aae00308aa37120094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209ebBBBL4;FF28040091490400d1110000145f2800f1880000542800028b08f1df38a82ef837e0830091273f0094e82340b9c851", - "0037e81b40f98a0740f9490108eb03680054L4;FB8a01000021000000611c4900000000005500000000000000af01000021000000611c4900000000005500000000000000b701000021000000611c490000000000L8;FFf00306aaf4030aaae60307aaca008052e7030baaeb0316aafadb4aa9fcbb00f9e1", - "4740f9fc0305aae56f40f9ec0311aaf10310aaea7300f9f00315aaf57b40f9BL8;FF807d0054e8cf42f949048052f4074091948209910969213828040091f67749f9e8d302f9df0600b10026005480220291401e0094080040b20811c0da081540d2L8;FF08078052e97b06f9e9c32291e86706f9280080d", - "2e97f06f9c90480524838c0f2ff5306f9e95b06f9ff5f06f9e97306f9e87706f996550094f3f742f9e8ef42f9BBBBL4;FF000400b000401c91acf50194ffc302d1fd7b07a9f74300f9f65709a9f44f0aa9fdc3019109c04039f30300aaf40308aaa90100343f0d007101080054602242a9L4;FB757569646", - "9646b65794d65737361676572237479706573656e6465725f6365727469666963617465636f6e74656e745f68696e7453656e646572436861696e4bL8;FFa80640f91f011aeb69050054e00313aa4ff5ff97a009003728fc60d3880700b5200840921f1800f1c2070054217c0353e10700343f040071a002", - "00543f080071BL8;FFe5750194fd7b41a9f31340f9ffc30091c0035fd6ffc301d1fd7b05a9f33300f9fd430191f30308aae82300911a4f0094e82340391f050071e1000054e8434039L8;FF4a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a05009102000014ea031faaeb7b52b97f0500718", - "1010054eb7f52b9ec8352b98b0700346b0140b2BBBL4;FF220108cbe90301912001088b9cb50194683340f960030191e10301912200805208050091683300f9c0b50194e8031f2ae8ff0139a00303d1a18302d1600743adL4;ZDL8;FF93b50094000480522100805291b50094600600b49f020072fa0300a", - "a88139b9a000540ad000400ada08300d164feff97a9237fa9aa2f7ea92901088b08050091BL8;FFe00316aa2100805292350194a00001b4e10314aae20316aae00b00f998350194f9d740f9e98b42b9e88f42b9fb2300f9e9230729d90600b4f4d340f984350194L8;FF19008092f9eb01f9a87300b40903", - "80527b7640f9fa031faa086d099bf583249138008052e86300f911000014e8e341f9090680528003c03dc822099bc9060091BBBBBL4;FF21fdff546a9284d2e8031bcb2a49b2f28a24c9f24a92e4f27f0218eb00040054090313cb190500911a0e805229fd44d3347dca9b09e179d3381108cbe0030091L4", - ";FFe80b40f9490480522a040091e00314aaea0f00f909692138e123009181e5ff97f60f40f9e80740f9080116cb9f0208ebe80c0054e80b40f9e10315aae20314aaL8;FF01f97fd34200805295050194686240f9a80000b4606640f901f97fd3420080528f050194686e40f9a80000b4607240f901f97fd3", - "4200805289050194687a40f9BL8;FFa8277ca9a003dd3ca103db3c8082823c88a601a9080080928182803c880200f912000014a04301d1f382ff97a8835df8a083db3ca183dc3ca9035bf8881a00f9L8;FF7f0500f109250078e1feff547f0215ebe1fcff541700001448008052bf031ef8bfa33ba9a8e30", - "1d1000dc03da0039d3c2e0000143b008052e11340f9e0031aaaBBBL4;FF290d098b29250191091b498b29050091280108ab83000054c1000014e80308abe21700546a010034e91340f929010032297d40932911c0da291540d2290d098bL4;FB476149000000000056000000000000008300000027000000", - "73686f756c642062652061626c6520746f20656e636f6465206865616465722073697a6500000000L8;FF46000014eb831d91e8b743f9e133c23d6091c83ce237c23df7430d91e86b00f9e8ff5e3969d14578e0d7803de023c23deaef43f92841082ae10b19ade127c23dBL8;FF290040f90afc78d373692", - "83808050091280800f98af3ffb4e8ffff17e10300a9e00301aae10309aa22008052f4030aaa8c050094e10340a9ea0314aa2ba040a9L8;FFebb6fe9740030035e003c03de80b40f96002803d680a00f9fd7b43a9f32340f9ff430191c0035fd689450094c00080522100805287450094c00200b4a8cc8752", - "BBBBL4;FFfd7b42a9ff430191c0035fd6e80300b008c131914903805268a600a948008052680200b9f44f44a9f51b40f9fd7b42a9ff430191c0035fd6e80300b008f92891L4;FB76696f7573207374617465733a20c000c00022536b697070696e6720636f72727570742070726576696f75732073657373", - "696f6e20c00520666f7220c0023a20L8;FFa2008052a40180524dffff17e06301f921020090216c1a912302009063c81a91e0030b91a20080522401805244ffff17e06301f921020090216c1a9123020090BL8;FFf40302aaf303012af50300aa9065019400038052010180528e650194400100b4155000a", - "9e10200f021003591131000b91f500039f44f42a9f50b40f9fd7bc3a8L8;FF97650094610e40f9810000b4601240f92200805292650094611a40f9810000b4601e40f9220080528d650094e00313aa080c49f81f0500b14000005404010094BBBL4;FFf33300f9fd430191098440a9f30308aa020c42a9e8", - "230091e00309aa1e7f0094e82340391f050071e1000054e84340391f0500714c04005428050035e90f41b2L4;FF9f00036b6c000054bf000039007d20d4836c1c53e5018092a3c023cb0600038b136863f8650a40f9df0005eb80000054000080d21f000039007d20d467824039L8;FFd40000b46002158b", - "e10308aae20314aa9ba50094e10318aab402148bff0a00f1e80316aaf40f00f9a0010054e90740f9215442a9290114cbbf0209eb88050054BL8;FF8a0200d04a150091e00308aa62008052290140393f010071890200d02921009121118a9acc250114000040f9ac250114000040f9d1250114c10600b40a", - "144038L8;FF880201d1ffff073902fd47d31bdd799216194092420100b4e82341f9e92741f920030291a1020191080102ab2935899ae82301f9e92701f993250094e0030691BBBBBBBL4;FFe00700ad820243ade20303ad810241ade10301ad9c19029400e4006f9ffe0139e0030091882648a98a2e49a98", - "c364aa9e00300ad8e3e4ba9e00301ad080dc0daL4;FFbaef7aa917008092a003dc3cbc835bf8e00f803d0c000014e00316aa6083c23cb6eb7aa9bbf37ba917008092e10740f9e01b803de00f803d610000b422008052L8;FF20008052f44f45a9f91340f9f65744a9f85f43a9fd7b41a9ff830191c0035fd", - "6ff0302d1fd7b02a9fc6f03a9fa6704a9f85f05a9f65706a9f44f07a9fd830091BBL4;FFe827403929074039f803002a1f01096be0179f1aac990194e82b4039290b40391a03000a1f01096be0179f1aa6990194e82f4039290f4039f803002a1f01096bL4;ZFL8;FFe803009122018052e1990094e00300", - "91e1990094fd7b41a9ff830091c0035fd6fd7bbba9fc0b00f9f85f02a9f65703a9f44f04a9fd030091ff4307d100e4006fBBBL4;FFfdc30091098440a9f30308aae8030091e00309aa09b40094e9034039e82740393f050071e1000054e92340393f050071cc020054a9030035ea0f41b223000014L4;FB6", - "5732e696f2d313934396366386336623562353537662f70726f73742d302e31342e342f7372632f656e636f64696e672f766172696e742e7273002f63617267L8;FFe7030eaaf46300f9ee0316aaf6030daaea0317aae5030faaef0301aae2030caaed0308aaf2e300f9f7cb49a908008092e1d348a9e987", - "00f9ec2b40f9f57b40f9BL8;FFe83b49f9080100b4090140b22911c0da291540d2290d098b292501910819498b08050091e98792b969010034290140b22911c0da291540d2290d098b29250191L8;FFf98b06f9e8d306f9e8274529f48f06f9f69306f9e9b30db9e90b40f9e8c30db9e81b40f9e9eb06f9e", - "96740b9e8e706f9e8ef06f9e81f40b9e9ef0db9e93b40b9BBBBL4;FFffc302d1fd7b06a9f93b00f9f85f08a9f65709a9f44f0aa9fd83019109a04039f30300aaf40308aaa90100343f0d007121080054602240a9090d40f9e8030091L4;FB6563697069656e743dc00076656e646f722f6c69627369676e6", - "16c2f727573742f70726f746f636f6c2f7372632f6b656d2e72730076656e646f722f6c696273L8;FFe1430091e20313aaf70b00f9f74b00f9f9090094e08744adf50300aae22fc03de86340f9e0870bade08742ade267803de8531aa9e08709ade28343ade2830aadBL8;FF3f0400f18b000054601e40f9", - "220080529379019408008092681a00f9f44f41a9fd7bc2a8c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aaL8;FF00830091027080529c830191f94315919b790094e8a344f9e04fc23d890a00d19f0600f1ea008052eb672191e8b704f928818a9a6901009029413e91f4ab04f9BBB", - "L4;FF40825ff81f0003eb42310054120980521708129b200600d11100118af2c24039df00126b01feff54f29243f8e01243f8df0112ebe00140fa00020054eaffff17L4;ZBL8;FF2200805296b90094fc7742f9370d00b4e80b40f9e07b42f9080502d11f0008ebc9230054e91b40f9e0031f2ae80317aae", - "a031caa2b154038080500f14c154038BL8;FF230100541e000014f4031faae00313aa080c48f81f0500b1c1fdff54f40314abe2020054688e4bf81f0500b140020054e00313aa52010094080040b20811c0daL8;FF00013fd6010740f9810000b4020b40f9e00315aa92390094df0600b1602f0054e84340", - "f9f86340f9e0832491f69304f9e89704f9e85b40f9f79b04f9e8a304f9BBBBBL4;FFe0230091020280520401805258010014e003022ae20303aae303042af44f4ea9f95b40f9f6574da9f85f4ca9fd7b4aa9ffc3039140f0ff1701600091e003022aL4;FFa80000b0a90000b0002900f9212d00f9c0035fd", - "6ff8301d1fd7b03a9f65704a9f44f05a9fdc30091f30300aae003009153000094e80340f9f40b40b91f0900b1L8;FF000040f9cb090114ff0301d1fd7b03a9fdc30091090040f9680180522a0141d23f0100f1490200f0293d3c914841889a8a0000102b6968384a090b8b40011fd6BL8;FFfb031caa628f", - "40f8620d00b4810340f9380080399800f8b728040091490400d1110000145f2800f1880000542800028b08f1df38680bf837a0e300d121f3ff97L8;FF0f020f4a2d7c8d0a8e7f8e0ad07e910ae901094a6a010a4a08010c4a29010d4a4a010e4a0801094a4901104a6a0200130801094a7f0600316b06025", - "3097d1853BBBL4;FF6c0114cb9f010aeb23010054080e8052610640f98006089b48e179d302110acbf44f41a9fd7bc2a895c901140a0e8052740109cb6c0640f901310a9b28e179d3L4;FB0800000000000000080000000000000054e8450000000000000000000000000008000000000000000800000000", - "00000098fa450000000000d518490000000000L8;FFe94b00f9eccb00b9169c00b4fb0316aaebbb00b98ec90094e00316aa210080528cc9009460f200b4e1031aaae2031baae06300f992c90094ebbb40b9eccb40b9BL8;FF60b240f901f97fd3420080529449019468ba40f9e80000b460be40f901f97fd", - "342008052f30b40f9fd7bc2a88c490114f30b40f9fd7bc2a8c0035fd6fd7bbda9L8;FF29fd46d30801098b130500917f0209ebe90b0054088c5cf81f0500b1e00900541efeff97080040b20811c0da081540d2080d088b0825019109fd46d30800098bBBBBL4;FFf70306aaf90305aafa03012af50308aa0", - "0feff97e84f42a9f47343a91f0500f1a100005408008092b47201a9a84e00a94f000014e0830091e1031a2ae20319aaL4;FB0800000000000000488642000000000049640000000000004f9d4800000000007500000000000000390000002e000000446a62000000000069a3480000000000L8;FF9bffff1", - "7e00313aae10317aae20315aa230080522400805242000094770a40f9680240f9080117cbbf0208eba9f3ff54e00313aae10317aae20315aa23008052BL8;FF210600b43f0400f180060054080040791f01186bc00100543f5000f1a00200543f2000f180f6ff543f1000f161050054080040b9690a8e522", - "94eae721f01096bL8;FFe90702f95746ff97a0420035fbef41f9e6f341f9e8430691e32b40b9fceb41f9e0e30091c1e20091e2830b91e403182ae5031baaf81f00b92881fe97f89341b9BBBL4;FFf50301aa93fcffb53a008052f90b00f99bfdffb50900809228008052e083c63ce0030291e85f1c29e85b", - "1d29e83f40f9f41700f9f57308a9f54f09a9fa4f0aa9L4;FFec8300b20b000014f0fd48d3ef9d0092aa010a8b29010ecb109e00920f020f8bf07d0c9bcf05409208c1508baf0400b5490800b43f0103f1ed030aaaef031faaL8;FFa07e40f92200805295a90094a18640f9810000b4a08a40f92200805290", - "a90094a19240f9810000b4a09640f9220080528ba90094a19e40f9810000b4a0a240f9BL8;FF00340e91820200d042000f9101068052b4290194c29fff17010040f9810000b4000440f9220080528d290114c0035fd6ff0301d1fd7b02a9f44f03a9fd830091L8;FFf90b4bf91a00f0d2fc0f4bf9f8134bf", - "9f5174bf9e83740f9880000b4e00746a9220080528e290094f7030291e11b42f9ffe71639411400b5a4000014e8833f91BBBBBBL4;FF08f1df38e849f837e02300912d7b0094e80b40b968000036e00b40f912000014e80f40f9aa0640f9490108ebe3470054aa0240f9e00b40f9e303162a4801088bL4;F", - "Ff68f01f99211009420c480522100805290110094809b00b408018052e1031aaa02c48052f60300aa0814003894110094e8830891e0431391a44700d101810091L8;FFcb0d00122c2c4039094c003949c100117f2500710950003909819f1a9f7d02710a819f1a8d0d00122e30403929010b0b4a114c0bbf", - "25007129c100110b819f1aBBL4;FF08111891890380520001c03d01c1c03c080180d20800f0f260a601a908017cb20000803d68a600a96800805201c0803c68a20039740200b936010014f60f00f9L4;ZDL8;FFfd7b02a9f44f03a9fd830091e90301aaf30300aa610100f021541b91e8230091e00309aae", - "2008052d991009468e20191610100f021481491840100d084600991BBBL4;FF7a0740f9e8af40b9fc031faae9031faa13008092b74302d140000014faef48a97c1500b4b34302d15ae300913b008052780240b2050000149cc301f15ac30191L4;FB6b70e99f000079840a543aafb1f977b68dfb72793ab8", - "85b4161fe047fc081a8924dda1931a954aac60ab6c15a88a5511296483e2513ecce93c95a29a53dfeb39L8;FFeb2311a9eb1744f9e81f44f9e8af13a9e82744f9eb2344f9e81700f9e82b44f9e82b00f9e82f44f9e82700f9e83344f9e82f01a9e83b44f9eb3744f9e84300f9BL8;FFe0431691220080529", - "6110094e1d342f955fcff17e04316912200805291110094e1d342f960fcff17e0431691220080528c110094e1d342f976fcff17e0431691L8;FF1f0b00b1fa432791c100005420afc03de82344f94003803de8f304f910010014f68740f91f0700b1e014005420afc03de82344f9f4630191e9c7009180c2", - "0391BBBBL4;FFa80318f8a8e300d1e90f00f9a9035d38eaa700a9aa235db8a9835e38ea0300f9a983183838180094a8835c381f05007121010054a8277da9890000141f090071L4;FB6d697373696e67207468656972206c6f63616c2066696e6765727072696e746661696c656420746f206465636f6465", - "2074686569722070726f746f627566696eL8;FFa4008052e80300f9c8e6ff97e10340f9bdffff17e80f41b2b7ffff17c80080d20800f0f208090091b3ffff17ff0302d1fd7b03a9f92300f9f85f05a9f65706a9BL8;FFaaa35538a98315386901084aabb35538a99315384901084aaac35538a9a31538690", - "1084aabd35538a9b315384901084aaae35538a9c315386901084aabf35538L8;FFe1d342f9e8cb42f9f6074091d68209911f0101eb807a0054e8cf42f92a040091c00202914908805209692138ead302f9db280094e14316911d0f00949f0600b1BBBL4;FFeeb20094f80301aae0e3073654000014f8031f", - "aa52000014680b0091b8831bf805000014e80b41b2a0831bf802000014680f0091a04301d1a8031bf879a70094L4;ZBL8;FFc00300b4e00741ade8031faa0904805201048052740a00b9690201a9000400ad616a29f8680200f9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9BL8;FF63f40b", - "9144018052e85306f911000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f97e270094e80300aae85306f9e0833291a102009021c00b91L8;FF09078052e85b05f9e8000090084d2591e95705f9290080d2ea5f05f9c93bc0f2e86b05f9c8048052ea4705f9ea0000904a4d2391007f803df", - "f4305f9e84b05f9BBBBBL4;FFa80e40f9c80600b4770640f9a00642a9e20317aae5fcff9708fc79d3e1e7076fe9031faaba6640a9080d010ef6d640a9f76240391c00198a496b7cfc208d282eL4;FF970100945f1f00f1c0140054f55243a9340200b4b982009104000014940600f139c300918001005421", - "035ef8810000b420835ef8220080528901009421835ff8L8;FF97010194810e40f9a1fdffb4801240f92200805292010194e9ffff17f44f41a9fd7bc2a8c0035fd6a10400b4fd7bbea9f44f01a9fd030091f30301aa14e00091BL8;FF010300f021802991240300d084402391e323009182008052e80700f", - "9d2810194fd7b41a9ff830091c0035fd6080040f9e00301aa090140f93f0900b1a1000054L8;FFca81009400e4006f9ffe003988264d298a2e4e298c364f29e00300ad0809c05a2909c05ae00301ad8e3e5029e003c03de107c03de20bc03de30fc03d830e803dBBBL4;FFb1c10194b50600f11900190a21", - "ffff5403000014fa0300aaf9031f2ae003192aa9c101941f1c0072e0031aaa8001005428008052ff0200f9e822003986000014L4;FB6c69642073657373696f6e20666f7220726563697069656e743a20c0392c20286e6f2063757272656e742073657373696f6e207374617465292c206e756d6265L8;FF", - "e213803d29010014e083029181220091024280529ac10094f8d750a9800ac03d8182c03c881a40f9890e40f9f78340f9fb8f40f94083813ce107813de81f02f9BL8;FFf44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6e8031faab60a40f976f4ffb5b41640f9e803088b54f5ffb5e00308ab23f6ff54c0", - "02009000c023918b410194L8;FF75fe41f974fa41f9a80240f9680000b4e00314aa00013fd6a10640f9810000b4a20a40f9e00314aa8d410094608205917600009461c641f9810000b460c241f9BBBBL4;FFf9feffb50f0000141f0400b121be0054b6e101941f100031a1bd0054f9ffff17b3e10194f703", - "00aa1f0400b141fdff54e043059181008052aee1019480bc0035L4;FB5b0000002600000034ed4800000000006a00000000000000fb0000002e00000034ed4800000000006a000000000000009c0000002e0000004572726f72000000L8;FFe8b745f9c082c03ca8031ef8680e00f908008092a0039d3c60", - "82803c680200f91e000014e8c341f9e9cb43f9e0dfc03d680e00f9080080923f0d00b16082803cBL8;FFe3610194c10200f021043191e40200d084e03d91e0030091a363009122028052b30f00f9db61019468c20091c10200f021401891e40200d084603e91a3630091L8;FF0805009120008052290040f", - "9280800f93f0108eb20010054290440f90a050091206928382a0800f9f44f42a9fd7b41a9ffc30091c0035fd6f30300aae00301aaBBBL4;FFf70b40f9f65742a9fd7bc4a8c0035fd6e90f41b2e80315aa06000014e91741b2f4030aaa03000014290480d20900f0f2095100a9098c8152e00313aa01c4805", - "2L4;FF200000900040069138000090000c40391f1c007281100054a02a00913900009021031091367860f8df0200f1640a437aed0200547f7e007164da467aa00f0054L8;FF810100f021cc1491a40100d084402591e323009182008052e80700f9d2a10094fd7b41a9ff830091c0035fd6810100f021bc1", - "49182008052c7a10014080040f9BL8;FF4a0140f9e10309aa40013fd6690a40f9b40a00f9290114eb230400546a0640f94801148b68a600a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6000440adBL4;FFfd7bbea9f30b00f9fd030091010040f9f30300aa810000b4600640f9220080528f2100946", - "10e40f9c10000b4601240f922008052f30b40f9fd7bc2a888210014L3;ZBBBBBBBBBBL4;FFce0500d1521640f9e00312aa0000158a606a60fc00a8200e0300669ee30000b55f2000b1000f005442200091000002abe3feff54770000146200c0da4210c0daL4;FF43000014e1031faa41000014c10000902", - "1202291c300009063e82291a0031df836000014a0031df8c100009021202291c300009063942291a0c300d162038052L8;FFaa0a40f90b01138b280113ebe933889a480113ebab2600a9c3020054a80a00f993ce00a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6a80f00f9e8230091BBL4;FF42030", - "0f042402c91e0031faae1031baab59e0194420300f042a02c91e0031aaab19e0194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091L4;FF55c31fb880d25f38001000121803000b98d21f38f76343a9f96b44a9b1ffff17e2031aaa230080525f000094dfffff17f76343a9f96b44a9", - "aaffff17fd7bbea9L8;FFf31300f9fd430091130040f9e00301aa810100d021b41991e803009102028052db9e009468a20091810100d021d01391a40100b084e01b91e0030091a3630091BBBL4;FF770000b5bade0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae00", - "23fd61f0000f1ad000054390300ebc35c00541803008bL4;FBd00200001d000000f5014900000000004e00000000000000bc02000015000000f5014900000000004e000000000000000804000017000000f501490000000000L8;FFec7b00f9053056a9ee9f00f9047050a9e8bb00f90b2043a9ec6700f90", - "d3058a9e0b3823d1e5051a9ea2f1fa90f4052a9e89300f90a2044a9ed6f00f91b3459a9BL8;FFe0031caa21008052925e0194c00400b4e10317aae2031caaf50300aa985e0194eaffff17f75b4429eaef40a9f41740f9fa1f40b90a00001428008052a8633fa9L8;FF6a0a00f909692138e10313aa28fcff", - "97801e40b980010034610a40f9680240f91f0101eb20050054680640f9090280522a0400916a0a00f909692138e10313aaBBBBL4;FF00c01391adfe0194ffc303d1fd7b0ba9f76300f9f6570da9f44f0ea9fdc3029109304039890a0037170040f9f40308aa150840b9f30300aae80e40f9f50f00b9L4;ZF", - "L8;FF41010054e80741b2e0030091e80300f984f4ff97e10300aa20008052fd7b43a9ff030191c0035fd64b05c0394c0900912e0900d10c3900a96d190012211c0daaBL8;FF6800d037b67e0114e77e0114e77e0114281040b9000040f96800c8376800d037ce7e0114ce7e0114ce7e0114281040b900004", - "0f96800c8376800d037a77e0114L8;FF968248f8490780520969213828040091df0600b1e81700f9601c005480220291c7e7ff97080040b20811c0da081540d2080d088b0825019108fd46d30900088bBBBL4;FFff0600b100080054006300919e360094080040b20811c0da081540d2080d088b08250191", - "09fd46d30800098b080500911f0109eb69160054f6e740a9b90600b4L4;FB08c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05bL8;FF602a40f92200805295be0094613240f9410400b4603640", - "f919000014600640ad682e40f9e90a40f9e502c03d620ac03d6382c43ce82b00f9641ac03de93700f9BL8;FF943e0194c01300b4e10314aae20319aafc0300aa9a3e0194542340f9b4031df8b40100b58200001436008052571740f917fcffb538008052482740f91f0500b1L8;FFe0031faa9effff17680", - "240f9080540f9190101eb031e0054680240f9080540f91f0119eb690d0054e00313aad9feff972024003728fc60d3681000b520084092BBBBBL4;FF09692138b6020034c80240b20811c0da081540d2080d088b0825019108fd46d308050091f50100b4a90240b22911c0da291540d2290d098b29250191a", - "91a498bL4;FF093300b8e91341f9e80b0679e8a34839ea0303b9e99301f9e8a30c39450000141f09007141050054e97342f90a0180d20a00f0f228dd78924c0140b228000014L8;FFab831fb8e9470039ec2301b8e95b0039ed7301b8e96f0039ea1f00b9e9830039eb9302b8e8b70039cb0e0194fd7b44a", - "9f32b40f9ff830191c0035fd608004039BL8;FFe00301aa1f05007101020054210300d021602991e823009182008052cb8e01944203009042602091e023009161820091c78e0194c78e0194fd7b42a9f31b40f9L8;FFb3831ff8e38e009468820091610100d021641c91840100b084801491a32300d16201", - "8052a8831ff8da8e0094da8e0094f44f43a9fd7b42a9ff030191c0035fd6BBBL4;FF290500912001088be1e30091a5baff971701003513000014e8031faa76feffb5e003088be1e300919ebaff97b7010034e12740f9e81f40f91f0101eb80240054L4;FBdf8326a4bf3f2a760c8e69b4dd02e71be172d18", - "f0f826bea9651aaf59e9ae0bab3571a5b081a4ed735daf8a2296006a897900b70265932f53743a28ce620feb6L8;FFa9230054a801009008c1049129038052e86705f9e80100d008c12591e8a303f9e00100b000f03a91e8ab03f9e80100d008a12991e1032b91e3031d9162008052BL8;FF290100cb4a01", - "008be0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091L8;FFe9d742f9f5c742f9f7cb42f9080340f9c0828d3cf63b42f9e9d304f9680000b4e00316aa00013fd6010740f9810000b4020b40f9e00316aa894e009", - "47f0b00b1BBBBL4;FFe10313aa22008052f44f49a9f65748a9f85f47a9fa6746a9fc6f45a9fd7b44a9ff8302918eee0114081740f9fb0f40f9fa1b40f9f70300f91f011bebc1010054L4;FB73696f6e696e636f6d696e672062617365206b657920697320696e76616c69644e9b4800000000002c0000000", - "0000000330000002d000000656e64206f66206bL8;FFc80080d2e0230039e00300910800f0f2ff270039e80300f982e4ff97e80300aae80300f9210200d021041491230200d063481491e003009122028052a4008052BL8;FF6800c8376800d037b56e0114e66e0114e66e0114ff8301d1fd7b04a9f32b00", - "f9fd030191f30308aae823009103490094e82340391f050071a1010054e9434039L8;FFead302f92a0c0094fad342f9e8cb42f908011acb1f0308eba8350054e8cf42f9e10319aae20318aa00011a8b946e00944803188be8d302f9f89749f9f90b40f9BBBL4;FF68220039690200f9f5ffff17ffc307d1f", - "d7b19a9fc6f1aa9fa671ba9f85f1ca9f6571da9f44f1ea9fd430691f30308aa082c40f9092040f90080c43c970280d2L4;FF1f25007101010054f5031f2ae003152af44f43a9f65742a9f85f41a9fd7bc4a8c0035fd635008052e003152af44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6L8;FFa80000b", - "4e00b40f901f97fd34200805293ae0094e003142af44f48a9f65747a9f85f46a9fa6745a9fc6f44a9fd7b43a9ff430291c0035fd648008052e0230091BL8;FFb6eeff97e8ffffd008710c91c9048052e85706f9e8ffff9008d12d91e85f06f9880200f008410591e8fb02f9800200d000302f91e80303f98", - "80200f008c11391L8;FF00013fd6810640f9810000b4820a40f9e00313aa922e0094e14341f9810000b4e04741f9220080528d2e0094e87f40f91f0500b180000054e803009100e10391BBBBBBL4;FF614a40f93f0400b140020054810000b4604e40f92200805291160294615640f9810000b4605a40f92", - "20080528c160294616e40f93f0400f18b000054607240f9L4;FF810000b4e0b34bf92200805294160094e0db4bf9a00000b4e1df4bf9610000b4220080528e160094584900b4e00317aae10318aa45020014fbdcffb5eafeff17L8;FFa8831ff8e3160194e3160194f44f43a9fd7b42a9ff030191c0035fd", - "6010440f98100f8b7000040f9220080528c160114ff8300d1fd7b01a9fd430091600200d0BBL4;FFfc0b40f9f65744a9f85f43a9fa6742a9fd7bc6a8c0035fd6a0c300d1a82b3da9b973009420008052e10580529996019448fc43d3e90300aaea0301aa4b0140f9L4;ZBL8;FF090840f9090100b42a0140", - "b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6800100f000801b918b960094BBBL4;FF2100805293d60194600400b4000740adfc0300aa381f0012000400ade00315aac7ae0094080480528002c03d09008092687203a9687e04a908018052687e05", - "a9L4;FB696f6e6d696e5f76657273696f6e636861696e5f706172616d7345706f636845706f6368446972656374696f6e6374724b657973556e73616d706c6564506f6cL8;FFe85b42f9e82f14a9e86342f9eb5f42f9ea2313a9e86742f9ea7742f9e8af01a9e87b42f9eb9742f9e83b00f9e87f42f9e843", - "00f9e89342f9e87b00f9e89b42f9BL8;FFb50600f1d662009180050054c1825ff881ffffb4c00240f92200805290560194f8ffff17f37749f97f0600b140020054e18349f93f0400b140010054810000b4L8;FF21e0339102028052230100b063340291a4028052af000014c80080d2e0a33239e08332910", - "800f0f2ffa73239e85306f97c4cff97e10300aae15306f9e0833291BBBBL4;FF00fdff54755a41a9e00740adc80240f9e08701ade00bc03de017803d680000b4e00315aa00013fd6c10640f9810000b4c20a40f9e00315aa89f60194e08741adL4;FB436861696e4b6579626173655f6b6579636861696e5", - "f6964726f6f745f6b6579c3200000690500004e6f745374616c65a861000000000000496d706c69636974L8;FFfdefff97e10300aa210900b5a80640f91f011aeba9040054e00313aa4cf6ff976008003728fc60d3480600b5200840921f1800f182060054217c0353a1060034BL8;FF0e000014e08745ad", - "08008092e237c03d680200f96082803c6182813c6282823cdc0000b4b90000b4e0031caae10319aa220080528a760194ba0000b4e03340f9L8;FFe287c33dbf0600b1e07b833de07fc33df4179f1ae383833de37bc33de183c33d2083853ce08bc33de8cb02f92183863c2283873c2083883c2383843c200", - "10054BBBL4;FF24008052aaa9ff97f41f40f9fc1740f9880314cb7f0308eb89f0ff54e0a30091e10314aae2031baa23008052240080529fa9ff97f41f40f9fc1740f97bffff17L4;ZDL8;FF1f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e00741a99bb60094ff0301d1f", - "d7b02a9f44f03a9fd830091010840a988008052BL8;FFe8c31791f3c31791e16f01f9290c40f9e1830b9120013fd6f4fb42f99f0e00b12102005468008052f46f41f9f36b41f9e8230b3949008092880240f9490300f9L8;FFe81f00b9dc0100b475fe40f990360094e0031caa210080528e36009400dc00", - "b4e10315aae2031caae00b00f994360094050000141c0080920500001428008052BBBBBL4;FF0043c53cec1300f96cfd199b8043853c8143803ca0877dad09692b384921003908010c8be91740f900c19c3ca003dd3c01c19d3c2905009100c19e3ca1837badL4;FFc0035fd60001805201038052ac06009", - "4fd7bbea9f44f01a9fd030091f303012af40300aa8a060094000280520101805288060094200100b4140000f9810000d0L8;FFf44f05a9fdc3009143010034081c0012f30302aa1f0900714c010054080200341f05007141030054000180521d000014280180d20800f0f2081d00d11e000014BL8;FF3f04", - "00f17f3a00f98b000054609a40f92200805292860194749600f97f4600f9f44f42a9f50b40f9fd7bc3a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091L8;FFfd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0309d1092046398900003609008092090100f944000014f40300a", - "ae81700f984860094BBBL4;FF7bffff17608749adc80600d1090080921f0d00b16aae00a9690200f96082813c6182823ca8000054e00317aae10316aa220080528ac60194b80000b4e00319aaL4;FB5072654b6579576869737065724d65737361676520666f723a20c0102077697468207072654b657949", - "643a20c015202873657373696f6e206372656174656420L8;FFe10309aa2200805295c60094e00315aae10314aa213300b59a010014aa0100b4f50300aae0031caaf40301aae1030aaa22008052f6030daaf7030eaa88c60094BL8;FFae1d00128c550e0b8c0148518d00f83761710c8b0b0180521400001", - "48d7d1c53ad0600340d00be528d010d0b4c2180396b710d8b8c00f8b761e10c8b2b018052L8;FF080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b1400400540a1440f9092040f90a0100b44b0140b26b11c0daBBBBL4;FFd33e0029c96a0039e9fe60d3c", - "c520079ac0356b8cdaa0039ad3356b8c97e0039a98356f8cc4600b9cd7204b8cb320079d7b201b8d9460429d0b202f8ce3203f8L4;FB6c6564002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d623538643766353665333634356363642f30363935396234L8;F", - "F88dcff97e10300aa91000014a80a00d1e16701f94e000014e80b41b2e06701f94b000014a80600d14900001448008052e0230b39e8270b39f56301f945000014BL8;FFfd7bc3a8c0035fd6e90b41b2097d00a9f44f42a9f65741a9fd7bc3a8c0035fd6ca0080d2090900b90a00f0f20a0100f9f44f42a9f", - "65741a9fd7bc3a8c0035fd6L8;FFc1025ef8810000b4c0825ef82200805293660094c10240f93f0400b1e0fdff54810000b4c00640f9220080528c660094c10e40f921fdffb4c01240f922008052BBBL4;FF08f1df38a805f837a0c300d12d100094a8035db8280d0037a8035ef8aa0240f9490108eb8310", - "0054ea0240f9a0835df84801088be80200f9a90200f908fc60d3L4;FF25000014001c0051340000b01f7c0071090100548002109101290091007861f881021091022900913f7822f8230000148402109180c0208b00c04d391f8c0171L8;FF9fa60094f60f00f9940300b5c102148be8830091e00315aae1", - "0f00f9c71e0094e81340f91f0900f1e0040054e1830091e00313aa0232805291a60094e10740f9BL8;FF09048052e8031faa60a600a9000400ade0030091680200f9bd260194fd7b48a9f34b40f9ff830291c0035fd62000805201048052a2260194fd7bbea9f44f01a9L8;FF94260094600100b4e10315a", - "ae20313aaf60300aa9a260094935a00a9930a00f9f44f42a9f65741a9fd7bc3a8c0035fd620008052e10313aa96260094ff8300d1BBBBBBBL4;FF0800669e17c101f260ffff54e802c0dae91340f90811c0da200540a9530f488b68fe1b9ba802088b026102d13e1600940800148a206b68fc00a8200e0a0", - "0669eL4;FF9a6600a9976201a9951200f98082823c68320039f44f4fa9f6574ea9f85f4da9fa674ca9fc6f4ba9fd7b4aa9ff030491c0035fd6a00000f000a027919f1a0094L8;FFc92240a9a80208cb280108eb62060054600200f000801f91971a0194d306f8b7730200b48a1a0194e00313aa210080523", - "8008052871a0194000600b4e10315aaBBL4;FF2803170b7a0a00110809c05a60430091a18301d1b6233529e8e31291b4573429fab304b9000301ad0003813cc49a0194e8e312910001c03de81740f91f0900f1L4;ZFL8;FF940600f173620091e000005461825ff881ffffb4600240f922008052909a0094", - "f8ffff17f44f42a9f50b40f9fd7bc3a8c0035fd6ffc300d1fd7b01a9f31300f9BBBL4;FFe00319aa21c480522200805294da0194c0da0194e01b10f9e00b4091e8430591e13b20b900c00091e1031faae2031f2ab9da0194e8ab40f91f0500f1e0090054L4;FB556e6578706563746564576972655479706", - "561637475616c427566666572556e646572666c6f7744656c696d697465644c656e6774684578636565646564556eL8;FFef8f00f9e61300f9f46300f9f03b00f9e54300f9e2d3ff97e7af42a9fe0315aaee2b44a9e54340f9f21354a9f03b40f9f46340f9e61340f9e0bf40f9f78740f9BL8;FF1f0500b1", - "e01b843de93b08f9e0110054e0abc43de1a7c43deac33391e2a3c43de95b49f94081883ce01bc43d4181873c4281863cea3b48f9e9c706f9e25fc33dL8;FFe10313aae20319aafb0300aa9c5a0094f4b340f9f40500b4f3af40f98c5a0094e00314aa210080528a5a0094001201b4e10313aae20314aaf50", - "300aa905a0094BBBBL4;FFc1f7ff54e6ffff17a0877bad7f0700f1f4567ea9f9627fa9e0063fadab000054e01f40f9e1031baa220080528cfa0194f32340f99f0600b120070054780300b4L4;FB2f6b6579732e727300c020204475706c6963617465206d65737361676520666f7220636f756e7465723a2", - "0c00076656e646f722f6c69627369676e616c2f7275L8;FFe85319a9e08709ade08b43ade08b0aade18340ade18307ade08b41ade08b08ad002800b4e87b40f91f0500b160000054e0c30391b7f8ff97f7bb40f9ff0600b1BL8;FFe00315aae10313aa22008052930a00f9f44f43a9f65742a9f85f41a9fd", - "7bc4a88f7a0114000300f0002014918f7a019420008052e10313aa967a0194ff0302d1L8;FFe0630091e10317aae20316aa23008052240080524391ff97f71740f9defdff17f60300aae06300912200805223008052240080523b91ff97e11740f9e00316aaBBBL4;FF6003803d6003c03df70f00f924000", - "0149f4100f1c9400054480080d2a06301d1f4030caa0800f0f2a8831af87ba3ff97a86301d1e0060091010280520ea70094L4;ZBL8;FF8082c03c02398052e13b813d8182c13ce23f813d8282c23ce027813d8082c33cf40340f9e88302f9e12b813de22f813de033813d92ba009460220091e1230b91BL8", - ";FF0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eba808005450000014f3031faa080c47f81f0500b1c1dcff54e8031faa080113abL8;FF09c143393f0d0071c1250054e10000f021c00791e0430f910203805228020014081347b8e9d743b9ea0742f9fa5f09a9f7f341f9", - "faff41f9e8bb03b9e8435039BBBBBL4;FFfdfeff17e00313aae10317aae20315aa2300805224008052a5fdff97770a40f9680240f9080117cbbf0208ebe9dfff54e00313aae10317aae20315aa23008052L4;FFe80300aad5a200a9df0200f9f44f42a9f65741a9fd7bc3a8c0035fd629008052097c00a9f", - "44f42a9f65741a9fd7bc3a8c0035fd61fcc00a91f0000f9f44f42a9L8;FF010100b421e87bd3e00302aa02018052e30314aaad0a0194a00100b507000014540100b48a0a0194e00314aa01018052880a0194c00000b508018052680600f9BL8;FF1f1800f1e20a0054817e0353010b00343f08007100fbff", - "543f040071c1000054e1c30091a26300915874ff97c0faffb48e000014a2630091830c80523e71ff97L8;FFa05500b4680100d008d10291c9009d52080140f909100079138301a9080000f9131700f98a8a00944001805241008052888a0094005400b4680100d008f90291BBBL4;FFe1031aaa220080521", - "70100b4e30317aaaeca0194e81f40f9e00000b520008052e10317aa9bca01948dca0194e81f40f920008052000540ad7f0600f1ea2340f9L4;FB000000000000000008000000000000000800000000000000b0e8450000000000000000000000000008000000000000000800000000000000b0e845000000", - "0000L8;FF6183c53ce0831d916283c63ce8bb02f9e1c31591e06f813d6083c73cf8831d91e173813d6183c23c681340f9e07b813d6083c33ce277813de06b813d6013c13cBL8;FFfd7bc2a8964a0114f44f41a9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd03009114d440a9f30300aaf50300b49", - "6e2009104000014b50600f1d6c20191L8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb482200545b010014e80300aa098d40f83f0500b140220054f30300aae00308aa20020094BBBBL4;FFe95301f9e85701f9e0070bade28354ade2030eade18352ade1030cad9aea019400e", - "4006fffbf0a39e85b41f9e95f41f9ea6341f9d6060051eb6741f9ec6b41f9L4;FB804c420000000000000000000000000008000000000000000800000000000000804c420000000000000000000000000008000000000000000800000000000000L8;FFbf0208ebe8070054680640f9e10316aae20315aa0", - "001178b99ea0094e802158b680a00f9951640f9550300b4610a40f9680240f9941240f91f0101eb80080054BL8;FF07000014ea074239e8031faa691b009103000014e8031faa692300914a1d4092f71740f908010aaa69a200a908008092680200f976f6ffb5b9ffff1720008052L8;FFf90303aae21b00", - "f9f50301aab70302d1f4030591f890fe97e84346391f05007180020054881245b8e99741b9e00315aaeb2b5aa9a80318b8e8c34639e93200b8BBBL4;FF70feff97e82b40f91f0900b1c10b00541803178bfa2f40f9f30f00f9080340394aff70d349ff78d35b7f08531f013a6b5c7f105353ff60d3e0179f", - "1a59ff68d3L4;FFf503002af7031faaf6031faa34008052bfd33da9e20216cbb6831ef85ffc3ff1290100548102168be003152ab20d00941f0400b140040054e00200b41600168bL8;FFff2302a9e87f04a9ff2305a9e87f07a9ff2308a9e87f0aa9ff230ba9e87f0da9ff230ea9e87f10a9ff2311a9e87f", - "13a9ff2314a9e87f16a9ff2317a9e87f19a9BL8;FFc10640f9810000b4c20a40f9e00318aa932a01947f0b00b1c1020054f6e3229155050036e0234ea9e16340f9e22340f9081540f900013fd6e03b02f9e8031691L8;FFcb290094e0074091fc0356b98100805200001891ff0316b9c5290094e0074091f", - "80356b98100805200001891ff0316b9bf290094e86b40b9e0032791e1833f91BBBBBBL4;FFcaf7ff361f1d00f140f8ff542a1dc0392b2100910d2100d10b3400a94c19001221c40caaaaf6ff361f2100f120f7ff542a21c0392b2500910d2500d10b3400a9L4;FFe0db00b9a04700d1c6c4ff97e0d700b9a", - "04700d1c3c4ff97e0d300b9a04700d1c0c4ff97e0cf00b9a04700d1bdc4ff97e0cb00b9a04700d1bac4ff97e0c700b9L8;FFfd7bc2a8c0035fd63f4000f1210100540b0040b90a0c40b9014040f8090080120a1100b9010500f9092d0029c0035fd629008052010500f9090100b9c0035fd6BBL4;FF9f070", - "0b140110054f4a741a99b16098be80314aa690e00b488820091f50308aab80e5ef81f0700b1c00d0054b9da40a9a81a40b9e8020036a01e40b9e1630191L4;ZDL8;FF70000094080040b20811c0da081540d2080d088b0825019108fd46d30900088b340500919f0208eb69060054e00313aa080c48f81f0", - "500b1800200548cf7ff97BBBL4;FFa30300f063082991e08300910202805224018052c5c70094e01340f90bffff17e01300f9a10300f021a01e91a30300f063403091e083009102028052e4008052L4;FB786c06070000150efe549c2ac0c444ad2180d087cc97cc842e81dd8cbdef99c96998eaccb19f4b", - "9fac970b00bfd78bf5c716bfc7d674adae2be49ebf5e8bd71cL8;FFe84300f9e8bf45f9e8a706a9e9c345f9e8032b9108e10591e9af03a9e9c745f90001c03de8d345f9eb0f46f9eaa702a9eacb45f9e91b46f9e8d300f9e8d745f9BL8;FFe8cb42f908011acb1f0308eb48360054e8cf42f9e10319aae20", - "318aa00011a8b975201944803188be8d302f9f88b49f9580300b4e1d342f9e8cb42f9f98749f9L8;FF9f0b00b121020054e0a34fa962030291e17740f9081140f900013fd6e06b01f9e8c31791e16f01f9290c40f9e1830b9120013fd6fcfb42f99f0f00b101010054BBBBL4;FF777205f8762603a968220", - "0f9e8274029683e0139e88b407969420139e94340b968520578e8e34039691205b8e91b40f9689e0139e80b40b969f205f8686a00b9L4;FBb8010000050000009a964800000000003300000000000000a8010000050000009a964800000000003300000000000000ac010000050000009a96480000000000", - "L8;FFa201805284008052c8e7ff97e10340f9cbffff17e80f41b2c5ffff17c80080d20800f0f208090091c1ffff17ff0302d1fd7b03a9fa6704a9f85f05a9f65706a9BL8;FFae3f7529a003dc3ca103dd3ca203de3ca303df3ca303983ca203973ca103963ca003953ce8270e294809c05a6909c05ae8270", - "f298809c05aa909c05ae8271029L8;FFb30000b4e07b49f9e10313aa2200805293720094f49f49f99f0600b1e0a5ff54f5a749f9f3a349f9950100b47622009104000014b50600f1d6620091e0000054BBBL4;FFa86303d1a26301d101f101916e9dff97802600b5bc835af8f9031caa228f40f8821f00b4", - "810340f9380080399800f8b728040091490400d1110000145f2800f1L4;ZBL8;FF94b20094a01000b4e0c3c03ce1c3c13c000400ad08048052602201a9680600f95affff17d82e40f9880ac05a6b0480920a9300d1779100913f0117eb20040054BL8;FFc80080d2e15706f90800f0f2080900d1d0000014", - "c80080d20800f0f2080500d1be000014e05706f9e80b41b2c9000014c80080d20800f0f2080500d1c5000014L8;FFe80300aae0032a91e100009021e03f91a2018052e30000b06314009144018052e84305f911000014c80080d2e0232a39e0032a910800f0f2ff272a39e84305f9BBBBBL4;FFf30300aa9", - "2020294000380522100805290020294c00100b42804009008ad0f910900f0d20001c03d080940f9080800f9080380520000803d602201a9692200a9L4;FF740f00b48906148b1c1140f93aed7cd3fc0700b47c16f8b7080d40f9fb5b02a9dba20091f95f03a9e82300f968577ea9e82700f986020094e003", - "1caa21008052L8;FFf30300aa9f0600b1e0020054611a40f93f0400b140010054810000b4601e40f9220080528e020194612640f9810000b4602a40f92200805289020194b40000b4BL8;FF29911e91200440a9e82701a9e8230091090000b029911991e82702a9e3430091ac820194fd7b43a9ff030191c", - "0035fd609004039202040a9030d40f9a9000036L8;FF68620091410100f021fc1491a32300d162008052e40314aaa8831ff8dd820094dd820094f44f43a9fd7b42a9ff030191c0035fd6ff8300d1fd7b01a9fd430091BBBL4;FFc902005468008052a903009029c13391e82703a9a803009008813e912a0c", - "8052ff2700a9890300d029c92191e82b05a96a068052e92b02a9290080d248048052L4;FB6e7075744c656e677468496e76616c69644f75747075744c656e677468496e73756666696369656e7452616e646f6d6e6573730000000000e467490000000000L8;FF97c20094e0874da9610000b42200805293", - "c20094e12340f9e90315aae10600b5f4031faa64f9ff17e96740f928dd789267f7ff17e0220091c1bcff97e16740f9BL8;FFc1ffff17fd7bbda9f50b00f9f44f02a9fd03009148008052f40301aae10302aa000d002af30302aa39fcff97e00314aa530a0094e10313aa35fcff97801a40b9L8;FFa442009", - "492420094e00280522100805290420094c01c00b408010090086138911a0380d20001c03d08f140f8e90280521a00f0f2e98316a90000803d08f000f8BBBBL4;FFbbe20194f70300aa1f0400b141fdff54e043059181008052b6e2019480dd0035e85341b9e8c700b957ffdfc8d70200b4ff0600b1000300", - "54f843059199008052L4;FB5500000000000000ce000000010000006d6573736167655f656e63727970743c6e6f6e653e6d6573736167655f646563727970745f7369676e616c6661696c65L8;FFe1e3c23de2e7c23de0630c914081873ce0dfc03de9b701f9e9c341f9e88f01f9e883059108c100914181", - "883c4281893c4001863ce99b01f9572e0094e00fc23dBL8;FF84a02391a363009142018052b30f00f9e0620194e0620194fd7b41a9f31340f9ffc30091c0035fd6ff8300d1fd7b01a9fd43009109004039e80300aae00301aaL8;FF030500544b018052e0031faa4a010b8b29010bcb0a2500a9fd7b43a9f", - "f030191c0035fd6e80741b2e0030091e80300f97c58ff97e10300aa20008052fd7b43a9BBBL4;FFe0030191e00702adcd7a0094280040b2f70300aaf60301aa0811c0dafb031f2a3a008052081540d2080d088b082501912818488b08050091a90240b28a020032L4;FF3f0300eb230100543f0b04eba3f1", - "ff54807a1f53007c40935f0000eb5a23999a94269f1a87ffff17fa0319aa3400805284ffff17d60210917f7e00a97f7e01a9L8;FF810100f021bc149182008052d2a20014ff8300d1fd7b01a9fd430091810100f021cc1491a40100d084c01f91e323009182008052e80700f9cba20094fd7b41a9BL8;FFc", - "0035fd6fd7bbda9f65701a9f44f02a9fd030091f30308aae10200b4f40301aaf60300aa8a220194e00314aa2100805288220194600400b4e10316aae20314aaBL4;FF9682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef8220080528e220094c1825ff8e1feffb4c00240f9220", - "0805289220094f3ffff17L3;ZBBBBBBBBBL4;FF0a00669ecafbffb5f9ffff17200340fd00a8200e0800669e0801c0da0811c0da08fd43d3dcffff17220000f042601091e1a30091030c80529e78009414008092L4;FF89050037010040f9f30300aac200009042002591a0c300d123028052f40308aa1212", - "0094a8577da9b6077ea91f0900b141010054e8230091e00316aab791fe97L8;FFf85f42a9fd7b41a9ff430191c0035fd63406f8b7340400b48d1c0194e00314aa21008052370080528a1c0194600500b4e10316aae20314aab40200a9901c0194BBL4;FFe8275f29eb0741b9ec0b41b9ed0f41b9ee1341b9", - "ef1741b9a0833dad0809c05a2909c05aa0833eada003db3ca103dc3ca203dd3ca303de3ce333803de22f803dL4;FFc0035fd6e10240b99f0a0071ff7e02a9000080d221001b32e10200b9ff1e00f980feff54600640f9a00200cbf1ffff17640240f9630001cb8100018b610e00a9L8;FF979c0094612a40", - "f9810000b4602e40f922008052929c0094680240f929008092691e00f91f0500b160000054e00313aa5498ff9708008092680200f9f30b40f9BBBL4;FF060000141f0400b1411e0054b7dc01941f100031c11d005439feffb505000014e043059181008052b2dc0194001d0035e85341b9e80700b957ffdf", - "c8770000b5L4;FB7446757475726500a02944000000000018000000000000000800000000000000d44b440000000000b84a440000000000f8524400000000006120446973706c61L8;FFf92344f9e9231fa9e8cf43f9e9bf43f9ec2744f9ef3344f9fc3744f9e8c300f9e8d343f9e73b44f9e03f44f9e643", - "44f9fe4744f9e8ab00f9e8d743f9f54b44f9BL8;FF0023009108810991f407409194820991b09f0094e1074091e0431691023f805221800991965c019488e20791000540ade8f36879e8e30a79e057813de15b813dL8;FF680240f9961240f91f0101eba00a0054680640f9490480522a040091e00315aa6", - "a0a00f909692138e10313aa20faff97770a40f9680240f9080117cbbf0208ebBBBBL4;FF0800669e1bc101f241fbff54f4ffff171500809221000014886305d1080140f91f0500b160010054e0e30591816305d1f6e30591af6c0094f5bf40f9e0a30b91L4;ZFL8;FF410200d021f81b91430200d063641c", - "91e083009122028052640180523c000014c80080d2e0a30039e08300910800f0f2ffa70039e81300f97af2ff97e80300aaBL8;FFe00308aac2048052a9831ff8d67c0194fd7b42a9ffc30091c0035fd609240091210300b021800191240300b084000191060300d0c660129103200091a9831ff8L8;FFea1", - "700f909692138cde5ff97e1630091e07cff97806a40f9800100b4e11740f9e80f40f91f0101ebc03f0054e81340f9090180522a040091ea1700f909692138BBBL4;FFa22301d161a6ff9740f7ffb498000014ffdb04a9ff2f00f9a1c20091a22301d15aa6ff9760f6ffb488000014ffdb01a9ff1700f9e16", - "30091a22301d153a6ff97L4;FBa7864900000000004e000000000000000105000014000000af874900000000004a00000000000000b60200000900000080f34700000000001800000000000000L8;FFff7f0da9ff7f10a9ff7f13a9ff7f16a9e8c300f9ff2306392238009460864ead80a2019168fa40f9e", - "103009102328052800602ad60864cad883200f9800600adBL8;FF2905009129010aab820200542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8L8;FF080340f9680000b4e00315aa00013fd6010740f9810000b4020b40", - "f9e00315aa8f3c0094ff0a00b181130054200740ade82342b9e88303b920070bad5a0c0014BBBBBL4;FF610a40f9680240f9961240f91f0101eb00340054680640f9490380522a040091e00315aa6a0a00f909692138e10313aa9cf8ff97770a40f9680240f9080117cbL4;FFe8330091e00315aae10314a", - "a84e5fe97e83340391f0900712007005489060091c80209cbc80600b41f0500f1aa02098be1000054490140393fad007100060054L8;FFfd7b45a9ff83019160001fd6080440f9200440a9a92300d12a0200904a710391a8831ff86202009042f02891e9ab01a9e3630091a70c0194fd7b45a9ff830191BL", - "8;FF2a4540b85f01007129119f9a5f050071e90300f9c1010054e9030091210300d0218029914403009084202391e3230091e00308aa82008052e90700f9ca8c0194L8;FFc0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff4311d1ff0300f9f80300aaf30308aa1b10437", - "9868c00940004805221008052BBBL4;FF9d16009400e4006fa0833aada0833bada003d53ca103d63ca203d73ca303d83ce33f803de23b803de137803de033803d7f4600b9e00742ad7f0200b9e30b43adL4;FB54000000000000006500000005000000e61949000000000054000000000000007300000005", - "000000e61949000000000054000000000000007900000005000000L8;FFe15f813d6183c43ce8bb42f9e27f813d6283c33ce067813d6083c53c1f0500b1e26b813de16f813de073813de363813d006a00546083c33c6183c43ce0831d91BL8;FF1f050071610600542007c03de9b341b92143c23ce8c741b", - "9f81f40b94003803dfacf40f9e002803de9d302b9214b803dec030b915f0b00b141d6ff54f3feff17L8;FF090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd6000100f000800a918c4c0094000100f0BBBBL4;FFe10318aa22008052e", - "30319aaafec0194600a00b4f70300aa06000014e00317aae10318aa220080528dec019437008052b30000b4e00314aae10313aa22008052L4;FB69676e65645072654b65794964496e76616c69644b796265725072654b65794964496e76616c69644d61634b65794c656e67746800000000000000000000", - "0000L8;FF6a0a00f909692138e10313aae1ecff97780a40f9680240f9080118cbdf0208eb88070054680640f9e10317aae20316aa0001188b92ec00940803168b680a00f9BL8;FFa203df3c0801168b000502ada0877cad0219803d000500ada08b7dade93b40f9000901ad28050091e83b00f9980800b49", - "4c20191d70000b49f021aeb18070091L8;FF2000805201908052a26c009420008052010480529f6c009420008052012c81529c6c00942000805221058052996c0094400100f000e012918c6c0094400100f0BBBL4;FF0e860094b7835ff8d7feffb7bb035ff8170400b48eac0194e00317aa210080523900", - "80528bac0194e0fdffb4e1031baae20317aaf80300aa91ac0194fc6740b9L4;FFf50b40f9fd7bc3a8c0035fd6e00313aaa10f00f9e10315aae20314aac2feff97a10f40f9750a40f9eeffff17ff0302d1fd7b02a9fb1b00f9fa6704a9f85f05a9L8;FF680a00f941f8ff541c010014ffd71ca956008052ff", - "ef00f9e88307911323179b680240f988fdffb5efffff173f4100f1011c0054e08703a985ac009440008052BL8;FFe9db42f9f5cb42f9f7cf42f91f0500b1404f803da90319f860420054e96301912083c33c2183c43c29610d912283c53cea670a91200500ad2083c63c414fc03dL8;FFc8220d91d6220e9", - "1800a01ade083c53de28bc53de83f00f9e88340f9a00600ade08fc53de14fc23dffe31039a20201ade24bc23de0dfc13dfa1702f9220500adBBBBBBL4;FF23feff54680240f97f0a00f99f0208eb68050054e1031faaf50314aa08011fcb9f0208eb88060054950700b4e10240f9760a40f9680240f90801", - "16cbbf0208ebL4;FF086140f8ca018052fb0300aaef031f2aee031f2afc031f2af7031f2a090000f9086000f8ec0741b2ab0000d06ba12391ed018052f003182ae2030a2a4a070014L8;FF81020054212000b40900c039281d0012c912f836090440391f81037129150012031200540a0840391fc103714a", - "1500124a19092a09110012e3060054080c4039BBL4;FF9794019409000014080180d2f7031faae9031faa0800f0f208017fb2ea1e409229010aaa682600a9f44f5da9f6575ca9f85f5ba9fa675aa9fc6f59a9fd7b58a9L4;ZBL8;FF00003b9199940094f3031faa080c47f81f0500b1e1e7ff54e8031faa0", - "80113ab23040054800100f000202b918f940094f3031faa088c45f81f0500b181ebff54BBBL4;FFa2a302d1e003082a60beff97a0faffb4d3010014a9a300d1a2a302d1e003082a2161009168bfff97c0f9ffb4f2010014a0a302d1e1d50094e80300aae00301aaL4;FB49000000000000000a0100001100", - "0000982049000000000049000000000000000f01000014000000982049000000000049000000000000001801000010000000L8;FFe0031baa2200805295d40094b90000b4e0031aaae10319aa2200805290d40094e87740f9f48f00f900210091c4ceff97ebfb40f994008052f53300f9f6f300f9BL8;FF0", - "900088b390500913f0308eb49100054f87749f91f0700b1a01500548022029114180094080040b20811c0da081540d2080d088b0825019109fd46d30800098bL8;FF2901009029ed0c91eaa705f9ea032d91e86b06f92801009008891191e96306f9290080d2e87b06f9c80480526940c0f2ea7f06f90a07", - "8052ff5306f9e85b06f9BBBBL4;FFe00702a9e1030091e00316aa62008052e30315aae40314aae82701a9adcb009428008092e0220039e80200f9b80000b4e00313aae10318aa2200805288f40194L4;FB70726576696f75735f73657373696f6e7300000000000000809548000000000055000000000000", - "00ce000000010000006661696c656420746f206465636f6465L8;FF880080d2e10700f90800f0f2b9ffff17e80b41b2e00700f9b6ffff17880080d20800f0f2080140b2b2ffff17880080d20800f0f208110091aeffff17e00300f9BL8;FFe37401946862009101030090210829910403009084e01291e00", - "30091a363009122018052a80f00f9da7401940103009021302991040300d084a02391a3630091L8;FF2b120094fcd342f9e8cb42f908011ccb5f0308ebe8d40054e8cf42f9e10316aae2031aaa00011c8b9574009488031a8bfc074091f60740b99c830191e8d302f9BBBL4;FF2000001419020034e80300", - "91e10314aa9a02028b0001198b99b40194e83340f9e0020191e10300912200805208050091e83300f9bdb40194ffff0039f50318aaL4;ZDL8;FFb6577ea9e0c20191b8835df8e9b68dd28a0200cbe8020bcb69dbb6f24afd44d308fd44d3a96ddbf2fa030baac9b6edf2417d099b147d099bfcb2ff971302", - "0036BL8;FF1471099bf8032d913600805210000014e8f342f909068052e02bc33d6822099b690600910001803de02fc33de9f702f90005803de033c33d0009803d9c630091L8;FFe4f4ff97200a0036c1f6ffb4cd010014a1c20091a22302d100f4ff9720f6ffb48d010014a22302d1830c805248efff978", - "0f5ffb4d9000014a1620091a22302d1BBBBBL4;FF8a2eaff2e08702a9e02300914a8cccf2ff7f04a9aa8ceef2ff1f00f929000aca418840a9e8a701a92c8a0094e81f8052e0230091a173009122008052a8730039L4;FF1f0500f1a0540054f55f5ca99004009400088052010180528e040094207800b4f4", - "0300aa155c00a997008052350080523f0700f1f78b01f9e08f01f9f59301f9L8;FFfd7bc3a85f000014010040f9810000b4000440f92200805291040114c0035fd6fd7bbda9f65701a9f44f02a9fd030091090c40f9160040f9f30300aa490100b4BL8;FF09200091e8030091200440a9a9831ff8090000d", - "029211f91ea2300a9a82300d1e91300f9020300f042143791e92301a9e3230091a7840194fd7b43a9ff030191L8;FFa4840094600100f00000349198840094e00300374a0080521ffd02a90afd00a91fa901a90afd03a91fa904a90afd06a91fa907a90afd09a91fa90aa90afd0ca9BBBL4;FFb6035ff8a8", - "035ef8080116cb1f0308ebe9ebff54a08300d1e10316aae20318aa2300805224008052a1b7ff97b6035ff857ffff17a08300d12200805223008052L4;FB654b657963697068657274657874656e6372797074696e76616c69642073656e64657220636861696e206d657373616765206b657973646563727", - "97074736573L8;FF2200805296c40094f96740f93f0700b18006005448ff70d349ff60d3eac313915a9100b8fa4f40f9e8ff1339e87740f949d10078e9034ba9e88702f9e88f02f9BL8;FF61f9ffb4f1000014e20313aa430c80529cf5ff97e10300aafaffff17e1031faae86b00b9f7ffff17680240f908", - "0540f9190101ebe2000054aa000014e20313aaL8;FF090100b0294d2391e92b1ba9290080d2e14306918946c0f2e87f1aa9e8271da99b440094e80342f9e92350391f0100f1e8179f1a0101090a24000014e1031f2aBBBBL4;FFe10315aaf44f44a9f90b40f9f65743a9f85f42a9fd7bc5a893e40114fd7b", - "baa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9L4;FB312e31322e312f7372632f62797465732e7273002f72757374632f34386132323963656165666434393835633530393930623134313136623664383536616630L8;FF1f050071e1000054950640f93501f8b6f8", - "031faae00318aae10315aa9de40094280080527f7e00a9687e01a92c000014960240f939008052950100b484e40094BL8;FF28008052780600f9680200f9f44f50a9f6574fa9f85f4ea9fa674da9fc6f4ca9fd7b4ba9ff430491c0035fd6e92b4d29e80344a93f01007259119f1a1f0900f1L8;FF810000b", - "4601e40f92200805294640094612640f9810000b4602a40f9220080528f640094613240f9c10000b4603640f922008052f30b40f9fd7bc2a888640014BBBL4;FFb7ffff17e0230091e10316aae20314aa2300805224008052a597ff97f60f40f9e80740f9080116cb9f0208eb29f7ff54e0230091e10316a", - "ae20314aa23008052L4;FF00e040f9221440f91f0003eb1820839a420c00b535cc41f9bf0600b1a0010054b50400b4b602188bc81a80d2e00316aa010000d4df0200eb8006005480021091L8;FFa101009021d01391a40100f084600891e0030091a363009142008052b30f00f9dca4009468020291a1010", - "09021d81391a40100f084e00891a363009162018052BL8;FF1f01096be0179f1aaf240194884e4039694e4039b502000a1f01096be0179f1aa92401948852403969524039b502000a1f01096be0179f1aa324019488564039L8;FF4002005408068052a002c03da90a40f90867089b0a070091ca0a00f914", - "4d00a9170900f90081813c091500f9f44f45a9fb0b40f9f65744a9f85f43a9fa6742a9BBBBBBBL4;FFe0030091c0f50094e00313aaeb190194e80300aa28f70736e00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6e00313aae1190194e80300aae00301aaL4;FF087000f81d000014e89f4139e", - "9534678fc834139fa3740f92841082ae91346b8378108aae11340f9610400b525000014d60c00b486180094c001805221008052L8;FFa0000035d60600f1c1feff54e0031f2a0200001420008052f44f45a9f91340f9f65744a9f85f43a9fd7b41a9ff830191c0035fd6ff0301d1fd7b01a9f65702a9BBL4", - ";FFe00315aae003803de80b00f9cc700094f60300aaa0020291f70301aac8700094f80300aaf90301aa89980194000480522100805287980194e00400b4e08743adL4;ZFL8;FFab931738abc35738a9a31738a9d357384a01084a6b01084aaab31738aae357382901084aabc31738abf35738a9d31738a90", - "358384a01084a6b01084aaae31738BBBL4;FFab0f0094d6ffff17c80300b0080110918902805222000014e89343b8e93f40b9e0830091ebab44a9e1e30091a80319b8e863413909b306b8e92340f9e8230039L4;FB71722076312e73656e645f63742e726563762065706f636820c0243a2043743153616d", - "706c6564202d3e20456b526563656976656443743153616d706c656400L8;FFe92313a9e82b44f9e91f44f9e8ab04a9e82f44f9ea3b44f9e82701a9e83744f9e93344f9e84300f9e83f44f9e8a706a9e84344f9e94f44f9e8ab03a9e84b44f9BL8;FF8cfd46d38c05009102000014ec031faa8b010b8b280", - "1088b49010b8be14316910001098b3a120094da0300b4e1d342f9e8cb42f9f60700b9f63749f91f0101ebL8;FFe233833d0bfdff97f3f742f9e8ef42f97f0208eb61000054e06317918a8ffe97e8f342f909068052e02fc13d6822099be133c13de237c13d18000014c80080d2BBBBL4;FFe823009120013", - "fd6e80740f91f0900b141030054880200f9680080522f000014770240f9761a40b9f50301aa88f80194000280520101805286f80194c00500b4L4;FB696e742070617273696e67206572726f723a20c0001f496e76616c69642066696e6765727072696e7420697465726174696f6e7320c00012696e7661", - "6c696420L8;FFa0877aad880080d20800f0f2a90358f8080900918082843ca003d73c8182853c8082863ca18378ad880200f9898207f88182803c8082813ca18379ad8182823cBL8;FF660000143f0c0071600500543f100071e1060054a80358f81f0500b161000054bf6738a9bf0319f8e1220191a2230", - "1d15662ff9720f6ffb4850000143f1c0071L8;FF03e4006f0083c03c0183c13c0283c23cf6d344f9e0074091fbcf44f9f9c744f900802f91f5cb44f901048052e01b843de11f843de223843df6ef07f9e3ff863dBBBL4;FF0800f0f268a600a9a88357f809008092690200f9e80700b4a00358f801f57ed3", - "420080528eb801943a000014e80b40f902000014e80f40f9680a00f931000014L4;ZBL8;FF0eb90094c30100b063c0319100108052e1031aaae2031aaaafb80094c00100f000e03391c30100b063602291c40100f084a03491a24700d1c102805298b80094BL8;FFa40200d084802a91e3230091e2018052", - "e80700f9d4380194fd7b41a9ff830091c0035fd6a10200d021982b91c2028052c9380114fd7bbfa9fd030091083040f9L8;FFe8430f919f9ffe97f5eb41f9f7ef41f9fcf341f9f8f741f9f6fb41f9faff41f9bf0600b1fb0342f900190054e8430f91e0032a910224805201e1009190380094BBBBBL4;FF8", - "900f8b7280400914a0400d115000014f70303aaf60300aa5f2800f1880000542800028b08f1df38a805f837e023009124720094e80b40b968f60737e80f40f9L4;FFf30300aae02300919de9ff97f40740f99f0600b1e0010054e083c13ce183c23ce81f40f9608600ade00742ad681a00f9e80b40f96082", - "833c6182843c742200a9L8;FF6902009029010891e1030091e92b01a9c2080194fd7b42a9ffc30091c0035fd6e20301aae10300aa800280524efdff17000040bda80080520820201e00119f9aBL8;FF88090035e90f41b25000001408008092686a00a955000014e8134bb8e9b740b95a0080d2ea6740f9e", - "b4340b91a00f0f2e88300b9e8434339f8e34239e93308b8L8;FFf32f40f99f4200f1619eff5450000014ff0f00f915018052f63340f9f3031faaf52700f9e0430a91e10314aae20316aa1bdaff97fa4f41f9f75341f9e20314aaBBBL4;FF0a018052ff0308eb28008052a1030054b47c039b0b00f0d2f503", - "04aa6b0104cb9f020bebe8020054010100b4a17c019be00302aae20315aae30314aaa3c80194L4;FB000000000000000008000000000000000800000000000000f805460000000000000000000000000008000000000000000800000000000000e804460000000000L8;FFf40309aaf5030b2af6030c2a94", - "c80094ec03162aeb03152ae90314aaf9031f2a7b3e00b41a008092e00309aaf5031baae94b00f9e9040014c10000b4f40300aaBL8;FF220080529648019460220091f30b40f9fd7bc2a8a1feff17f30b40f9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4600640f9L8;F", - "F0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab230100541e000014f4031faae00313aa080c48f81f0500b1BBBBL4;FF09a900a92900805209010039c0035fd6fd7bbca9f85f01a9f65702a9f44f03a9fd03009133d040a9f50301aa381840b9f60300", - "aa940300b485e80194e00314aaL4;FB180000000000000008000000000000008087400000000000e41f400000000000200000000000000008000000000000002c8a400000000000456d707479496e76L8;FFf40f00f92f00001428008052ff0f00f9ffa300a9a0e300d1e1230091982a0094a083dc3ca183", - "dd3c28008052a8831ff8e08700ada083de3ce87f04a948008052BL8;FF740200f9f44f41a9fd7bc2a8c0035fd6fd7bbea9f30b00f9fd030091010840f9f30300aa3f0400f18b000054600e40f9220080528a680194080080927f0200f9L8;FFe9031091aaffffd04ab139911a0380d2400100b0005c17910", - "8210091e1c30e91e9db01f91a00f0f2eadf01f9bb680094e81f40b9e8c306394d0000142093c13cBBBL4;FF090300f9810000b4e0031aaa2200805293a80194f70f40f9b50000b4e00314aae10315aa220080528da80194e02740f9930000b4e10313aa2200805288a80194L4;FFf3ffff170004009101f0", - "5f38a10000343fbc007181ffff54400000f9faffff17e00304aab7000094e09740f9bbffff97e1834ba93f0000eb80020054e5230191L8;FFff3f0439f80314aaf70319aa02ff46d314e37a9218174092e20000b4e89b40f960020191e10317aa0801028be89b00f9bea80094e0430391e102148be20318a", - "aBL8;FF600640ade08711ade2834bade28312ad350700b49912158bfac308911b1080520a0000144003188be10315aae20316aa932801940803160be8bf0a3994420091L8;FFc10640f9810000b4c20a40f9e00315aa93280094e8e7563968000036e00314aa7ae7ff97e11b42f9f7030291ffe71639416e", - "ffb4e01742f9220080526efbff17BBBBBBL4;FF43290054ea0240f9e00b40f94801088be82600a9680240f9080540f9170100ebe200005406010014e003082ae20313aae303162a40f7ff97c01100b57c0240f9L4;FFa04700d1c7c2ff97e0d700b9a04700d1c4c2ff97e0d300b9a04700d1c1c2ff97e0cf", - "00b9a04700d1bec2ff97e0cb00b9a04700d1bbc2ff97e0c700b9a04700d1L8;FFe80700f9683241b8e92b0229690e40f9e81b00b9682240b9e9c301f8e82700b93effff97a8c35e381f050071c10a0054a0d3de3ce81f8052884200398002803dBBL4;FFe213c03de01e833de11a833de08742ade22a833d", - "e02e833de01fc03de122833de026833de022c33de126c33d6042823ce02ac33d6142833ce12ec33d6042843cL4;ZDL8;FF4a25019129194a8b29050091280108abc2010054091440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054BBBL4;FFea3b40", - "f92b2101a9e80f40f92a2102a9ea2740b9e80740b92a210629ea1b40f9e82b40f92aa103a9e80740f933a104a9e82740f928d505a9e81740b928610d29L4;FB0000c867bc1790884b4f7b29d8f0e734cf9f7b3e5c53e9a9361e489549405c3caaf9f387f215574ba686816f443e29147616b47240e1051b0", - "595e8330bdda28cL8;FF66caff97f70314aa68000014e8031d91e1032b910232805200410091f4032b9197d00094e87740f981220091023180520aa540a90081c03da0039d3cea4700f9BL8;FFe00319aaf90b40f9e1d342f9a0fcff17f90300aae04316912200805291100094e00319aaf90b40f9e1d342", - "f9c3fcff17c00200f000e039918f50019420008052L8;FF60000054e02b40f9f5eaff97f4db51a9960100b49822009104000014d60600f118630091e000005401835ff881ffffb4000340f92200805289500094f8ffff17BBBBL4;FFf44f05a9fd030091ffc308d1f803022af90301aafa0300aaf70308aa", - "c8c80094f40300aae00319aaf30301aac4c8009408040090088123911f03007189028052L4;FB1201000014000000696e76616c69642073656e64657220636861696e20707269766174652072617463686574206b65796d7573742068617665206265656e2073L8;FF3f040071c00100543f08007161fdff", - "54888242f81f0500b1810000549fe202a99ffe03a998fe04a981a20091e20313aae2f2ff97000100b45d000014600900b5BL8;FFff830091c0035fd6fd7bbfa9fd030091086c40b948090034080140b20811c0da081540d2080d088b0825019108fd46d308050091090c40f93f0500b180080054L8;FF3f0", - "700b1a018005400c3039166290094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb481700545f000014fa031faaBBBL4;FFe97f00f9e083893ca003dd3ce1838a3ce0838b3c590100b4e03740f9e10319aa220080528eb0019405000014e83740f9e89b00b9080", - "08092e84b00f9e83f40f9L4;ZBL8;FF93b00094000880522100805291b00094201600b409488052a10241ada20e40adf90300aae9c301f9e92b40f948008052010001ad1f0309eb020c00adff0f01f9BL8;FFaa0200904a410591e86304f9e8ffffb008d12d91e96f04f9e9c32291e86704f9e8c31d91a04", - "700d1e86b04f968008052e1833291e97f06f909078052e86b06f9L8;FF2100805293300094c01d00b4880c8052e900009029813c9108400039c80080d22001c03d0800f0f2e9734e39e03b01f91c490091280280520000803dfc3301f9BBBBBL4;FFe00318aa2100805292000294401100b4e1031aaae203", - "18aaf90300aa98000294c00642a9a21300d1bcc31fb83efcff97c80a40f9880900b408fc79d3e1e7076fL4;FFa4000094fd7bbea9f44f01a9fd030091f40300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aaa7000094000300b50e0000142800805209018052L8;FF9f000194e802148bb5", - "02148b680a00f9081340f9e00316aae10315aae2031faa00013fd6e0031faaf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6BL8;FFa92300d12a018052070300f0e7142f91e00308aae201805284008052e9af00a9ea0300f9d4800194fd7b42a9ffc30091c0035fd6ff8300d1fd7b01a9fd43", - "0091L8;FF972a80b9b7f9ff35ea031faa9a1a40b95f07007160faff542801088b49011f8be16300910001098bda80ff97990100b5280000144b0080528cfaff35ec031faaBBBL4;FFf65746a9fd7b44a9ff030291c0035fd6ff8301d1fd7b02a9f71b00f9f65704a9f44f05a9fd830091090c40f93f0500b", - "160060054095440f93f0500b160070054L4;FB3478490000000000340000000000000037010000220000004d414320766572696669636174696f6e206661696c65640088784900000000003400000000000000L8;FFe10b813d16017eb2a08739ad4083c63c4183c53ce313813de20f813df52342f9a2039", - "53c4283c43ce10302ad4083c33ce00b01ad1d0000148862069189565ca9BL8;FF800b0054680640f9490380522a040091e00315aa6a0a00f909692138e10313aa3bfaff97770a40f9680240f9080117cbbf0208eb880a0054680640f9e10316aaL8;FFfd7bc3a896400014f44f42a9f65741a9fd7bc3a8c0", - "035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f090071e1010054e00302aaBBBBL4;FFe10319aae2031f2ae0023fd61f0000f1cd000054390300ebc39d00541803008bf9feffb50f0000141f0400b1219d0054aee001941f100031a19c0054f9ffff17L4;FB677468203cc0", - "153e20666f72206b657920776974682074797065203cc0013e00155075626c69634b6579207b206b65795f747970653dc00c2c2073657269616cL8;FF1f05007160fcff54473a009462024079e103002a9e390094e203012ae103002a9b390094e203012ae103002a98390094e203012ae103002a9539009", - "4e203012aBL8;FF400100b4155000a9e10200f021e00391132000b91f900039f44f42a9f50b40f9fd7bc3a8c0035fd60001805201058052a3600194fd7bbea9f44f01a9fd030091L8;FFe00313aa99fdff97c009003728fc60d3a80600b5200840921f1800f182070054217c0353010800343f0400710001", - "00543f08007141fdff5481220191e20313aaBBBL4;FF6b0600f9692a01a9680200f9f44f47a9f72b40f9f65746a9fd7b44a9ff030291c0035fd6400300f000e03e916303009063002291440300f084603f91a27f0091L4;FF3f00036b4cffff54031840b96324c11ae3fe0737031c40b96324c11a83fe073", - "703cc749224000090840042f9630040f97f0004ebc1fdff5403404079642c46d3L8;FFf31340f9ffc30091c0035fd6000040f9ad0d0014ffc300d1fd7b01a9f31300f9fd430091130040f9e00301aaa10100d021c83b91e8030091a2008052d4a00094BL8;FF20008052f44f45a9f71b40f9f65744a9fd7b", - "42a9ff830191c0035fd62805003628f97fd35f0108eb4881889ae10202ab620b0054020101eb810a00f9630b0054BL4;FFe0031faa4a050091290500d10a2500a9fd7b43a9ff030191c0035fd63f2900f1880000544b01098b6bf1df388b0cf8374b05c0396c1d00128c6119538c01210bL3;ZB" + "BBBBBBBBBL8;FB9d00ad00570000012401bb004d01730045014f0065001c013400a5002600e40032018501f2000e017201920194008600b9010e00a301b1015b01d60069013c00L8;FF0a0e8052c9260a9bca0600911b0500d15f010bebeb338b9a56010bcb210140f9966e01a93f0400b100feff5439e94", + "1a937e143a9352145a9e80f00f9810000b4BL8;FF810000b4601640f9220080520a250194611e40f9810000b4602240f92200805205250194612a40f9810000b4602e40f9220080520025019460c20191f30b40f9L8;FF40fdff9000403f91bf20009440fdff9000a03f91bc20009440fdffb000000091b9", + "20009440fdffb000600091b620009440fdffb000c00091b0200094ffc300d1BBL8;FFe1031f2a828e40f99a9640f9e3031f2ae8630039e90b00f9a37a01945f0700b1a0000054882653a92b0080528a4241b903000014eb031f2ae8031faaac835fb8L8;FFe0230091a200805224018052a7000014c80080", + "d20800f0f2080500d1a0c300d1a8031df86a6bff97e10300aa7a000014e00700f9a1fdfff021e02091a3fdfff0BL8;FFe00313aaf5f1ff9740010036210c00b5e0031faad3ffff17e003082ae20313aa430c805297ebff97c0f9ffb4c3ffff17a80640f91a0101eb0201005499000014L8;ZDBBBL8;FB140", + "00000000000001400000000000000287e400000000000397e4000000000004d7e400000000000f0804000000000000281400000000000b81f400000000000L8;FFe11740f9e80f40f91f0101eb008c0054e81340f92a040091e00316aa49028052ea1700f9096921385ef2ff97e16300917b92ff97807e80", + "b980010034e11740f9BL8;FFf44f05a9fd030091ff0312d1ff0300f9f40301aae8830c9176fc4039000440ade0430091f50302aaf30303aac17e0753e08700ad8c000194e89341f91f0500f1L8;FF400200b4e10316aae20313aaf50300aa10050094935600a9930a00f9f44f42a9f65741a9fd7bc3a8c00", + "35fd635008052935600a9930a00f9f44f42a9f65741a9BBL8;FFdb000014e8031faa690a40f989faffb5691640f9e803088b69fbffb5e1ffff17f40308ab421a0054e00313aa080c49f81f0500b1e0010054fa000094080040b2L8;FFe90344a9080009eb630e0054ff0208eb68080054340117ab420e005", + "4f42300f9090740f9280117eb03080054090340f9d60217cbdf0208eb3501178bd732889aL16;FFf5ef40f9ec031baaea0b40f9e72340f9fe031aaafa0317aaf70316aa89008052e97300f9f6ef49a908008092f4030baafa8700f9eb0319aae87700f9e4a74ba9BBBBL8;FB4a000000000000003f050000", + "490000004c61796f75744572726f72220036000561663b870a0e001a000426341e55080042202c094c58367014640000a901ab00L8;FF4901084aaa035738a9e316386901084aab135738a9f316384901084aaa235738a90317386901084aab335738a91317384901084aaa435738a92317386901084aBL8", + ";FF680640f93f0002710801148ba20100540101003926000014e00313aaf603012ae10314aae20315aa10f9ff97e103162a680640f9df0202710801148ba3feff54L8;FF00fd0039e007409109050039e97b41b900401d9118d5003909090039e97341b919f50039090d0039e96b41b916f9003909110039", + "e96741b909150039e95b41b9BBL8;FFe0feff17a04301d122008052230080522400805278e0ff97a1035cf8e7feff17a04301d1e10319aae20313aa230080522400805270e0ff97b9035cf8a8035bf8L8;FFe93700b9e82700b9e8031691400707adbb0318f8b58318b80b6a0094e88345b9e9c742f902a0", + "915284fdfff084202691e0031baa1f010071e103152ae204a072L16;FF680200f9f7dcff9763000014e32740b9f6432d917f04007148080054e81b40b9c8180037e8018052e8632d393e000014a003dd3ca8035ef809008092690200f9BBBL8;FFe00313aae10317aae20315aa2300805224008052780000", + "94770a40f9680240f9080117cbbf0208eba9efff54e00313aae10317aae20315aa2300805224008052L8;FF09fd46d30800098b080500911f0109eb2821005413000014f9031faafbb749f9e8074091088109917f0700b1c029005400210491b9240094080040b20811c0daBL8;FF011440f9f30300aa3f0", + "800b1800100543f0400b140010054810000b4601a40f92200805204f50094612240f9810000b4602640f922008052fff40094740240f9L8;FF0600038b136863f8650a40f9df0005eb80000054000080d21f000039007d20d467824039e31000129f02036be91040d38d000054000080d21f000039007d20", + "d4BBL8;FF0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb68000054fe040014e8031faa160114ab020d0154f47349f99f0e00b161000054L8;FF0d350094f8ffff17687240f9c80000b40805088be00315aa0201805201f17dd30535009420074bad28008052e98343b99c", + "0200f9960a00b980c2803c81c2813cL16;FF090900d11f0500f1e80080522881889a49feff90299909918a0000102b7968784a090b8b40011fd6895643a91600f0d28082c03c880e40f9810ac03da003933cBBBBBL8;FB656d6f74655f726567697374726174696f6e5f69646c6f63616c5f726567697374", + "726174696f6e5f6964616c6963655f626173655f6b657970656e64696e675fL8;FFe00315aa0201805201f17dd3ff030791f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8039d0014f6a340a9e183009102308052131940b914814039BL8;FF680a00f9951640f9550300b4610a40f9680240f", + "9941240f91f0101eb40070054680640f9490480522a040091e00315aa6a0a00f909692138e10313aab6faff97L8;FFe1018052a4180094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9ff0740d1ff0300f9ffc327d1f30302aaf70303aaBBL8;FFe8ff0139a00", + "303d1a18302d1600743ad6223c03d624f803d608708ade00743ad608706ade00b44ad608b07ade00742ad608705add5220094a10303d1e00316aaL8;FF89000010ea6a683829090a8b20011fd6a03500b5a02302d13ff5ff97e0140036e1fcffb4b001001401830191a22302d15bf4ff9740fcffb46f0100", + "14e02e00b5L16;FF2300805224008052e9000094760a40f9680240f9080116cbbf0208eb29f7ff54e00313aae10316aae20315aa2300805224008052de000094760a40f9b1ffff17BBBL8;FFe90b40f98a0640f9480109eb030b00548a0240f94901098b892200a9680240f9e0031faa090540f934000014", + "5f2800f1880000542800028b08f1df38c808f837L8;FFdbe0ff97e2bf4ef9e3c34ef9e007409100800191e10316aa12ccff97e01bc43de11fc43de223c43de09b843de19f843de2a3843d037d00940078805221008052BL8;FF1f0400f1a10100549ffedfc8610240f9810000b4600640f92200805206fd0", + "094e00313aa0105805202018052f44f41a9fd7bc2a800fd0014f44f41a9fd7bc2a8L8;FFf30300aae023009129f87fd33f2100f13481889ae30314aad7ffff97e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6BBL8;FF2901084aab131638ab435638a9231638a", + "95356384a01084a6b01084aaa331638aa6356382901084aab431638ab735638a9531638a98356384a01084a6b01084aL8;FFf86340f98a2d02a9e8eb41f9ea634f39800500ad280100f96a5e0f39bc0000b4e00316aae1031caa22008052023d0094f74f40f9b80000b4e05b40f9e10318aaL16;FF600b43", + "ade8e30339680f40f9e08b0aad610341ade18308ad6093c03ce0938f3ce88700f9730b0094e1b343f9fcb743f9fabb43f9f8bf43f93f0400b1803a0054BBBBL8;FBa28c3d71c72d2f6007340000af1ffc3dda06237d14b52c23a274b7ec20cdc1e561f35001414aaed1575a0f8995f5a322564d25ea49159", + "797525496eabc8150faL8;FF48008052ff5301f9f3031faae84f01f9e8430a910081c03ce8030a910001803de80f40f9082e00b574010014058d00940003805201018052fe8c0094204800b4BL8;FF0800f0f2080900912dffff17fb830291e8fb42f91f0500b1e0140054e80343f9e07fc13de9c31291e0", + "833291022b8052e86702f9e8c31791018100912081803cL8;FF887ea89b6002803d08fd63d308d1091be90b40f908051c32286935386a0a00f9f44f44a9f51b40f9fd7b42a9ff430191c0035fd628008052f5031faae1031faaBBL8;FF08038052690640f94003c03d8826089ba9035af80001803d8a0600", + "91090900f9fc0b40f96a0a00f99f0700b140110054f4a741a99b16098be80314aa690e00b4L8;FF090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab22030054091440f9090100b42a0140b24a11c0da4a1540d2L16;FFe8b700f9e84742f9eaa318a9e84", + "b42f9ea4f42f9e8eb00f9e85342f9e8a700f9e85742f9eb2311a9e85b42f9eb7342f9e8a300f9e86342f9ea2313a9e86f42f9BBBL8;FFa90358f868de013969f206f8e8a742a97bf203f87c7204f868e207f8a8035d78696208f8a9835cf8682e0179e85f40b969e208f8e92b40f9689a00b9487d1053L8;", + "FFc4680094c8fdffb008c92491e9008052e8271ba9fa0741b2e8df40f92083c13ce8c700f9e8a759a98082833ce8a716a978caff34e11740f921caffb4e00b40f9BL8;FFa5020094e08745adf50300aaf4eb00f9e0870cade28346ade2830dade18343ade1830aade28344ade2830bade18341ade18308ad", + "e28342ade28309ade18340adL8;FFfd030091fdffff97017c4093060080d2050080d2040080d2030080d2020080d2200780d2f1ffff971f10003100109f1a007c409363f6ff97fd7bc1a8c0035fd6BBL8;FF1a110094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aa1111", + "0094fad342f9fc0740919c830191dffdff17f80300aae0431691L8;FF1f0500b180000054e8030291000103911ee7ff97f45753a9f50200b49622009109000014e8e7563908d40736e00314aa16e7ff979dfeff17b50600f1d6620091L16;FFf47b02f9e87f02f9dc130094ba537da90cad0094000480522", + "100805208ad0094602b00b4fb0300aa20feff9000800f9101048052e20318aa03048052e4031aaaBBBBBBL8;FB72730076656e646f722f6c69627369676e616c2f727573742f636f72652f7372632f63757276652e72730022616476616e6365206f7574206f6620626f756e64L8;FF730a00d13f0114eb7", + "b0700d1c1f1ff54040000141f0000792800805208783478e9a341a9ea0b40f9282900a9280900f9f44f4ca9f6574ba9f85f4aa9fa6749a9BL8;FF200700b4fa0000143f0c0071000700543f100071210500541f0900f1a1210054e00313aaff6b00b9ffdf00a9df7e01a9dffe02a9f71700f9f72300f9df7", + "e04a9L8;FF20008052c1018052a31c0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ffc30bd109404039290a0037160440a9f30300aae0630591BBL8;FFff1302f9f81702f9fffe02a9ff7e04a9f82302f9f82f02f9fffe05a9ff7e07a9fa3b02f9f84702f9fffe08a9f85302f", + "9ff5702f9f55b02f9f58f02f9f5a702f9L8;FF2b000094770a40f99fffff17e00313aa2200805226000094610a40f9a8ffff17e00313aae10317aae20315aa20000094770a40f9680240f9080117cbbf0208ebL16;FF9f7e04a9977e05a981c20091e20313aa8df0ff97200a00b5e1031faae2ffff173f0c", + "0071e00200543f100071e100005481620091e20313aa04edff97a00500b5BBBL8;FB080000000000000034194600000000009cf545000000000010000000000000000800000000000000801a4600000000009cf54500000000001800000000000000L8;FF090180522a040091ea1700f909692138e163009", + "1828eff97e00314aa080c4df81f0500b160000054e163009168a1ff97954e40f9550300b4e11740f9e80f40f9BL8;FFca0215abe21300546b0240f93f0009ebe80f00f96b0115cbeaaf00a9880f00546901158b480115eb690200f923100054680a00f93f000014c80d0036970e40f9L8;FFeb074091ec03", + "01aa0d1440382d0100392d014039adfeff348c0500f14d15003841ffff54f80308aae80300911f692138e00300910101a0523b0a0094a001f836BBL8;FF291540d2290d098b2925019129fd46d3290500910a0c40f90801098b5f0500b141fcff54e80308ab42040054091840f93f0500b18001005409204", + "0f92a0140b2L8;FF68ae42b90801003660a24aa961b242b9081540f900013fd6606601f9616a01f93dffff1760a248a962820391613e40f9081140f900013fd6606601f9616a01f9L16;FFe69f43a9f1031baae4a74ba9ed0740f9e56f40f9f03340f9e0bb00f9e0030baaeb0314aafadb4aa9f7ef49a968", + "0a00f9e8fb40f9e0f3c03d75a615a9f27340f9BBBBL8;FB914c70f92c0fd697837aab5d0b7062e2d4ad0000c607ee11b0212ac77878408a0eb7e00103a04962db261c916bcb6e7e1ca83fd17f0be1a5f018c1cb9347f044L8;FF00200c91bd8c0094ff4301d1fd7b04a9fd03019108004039e9fdfff0291d", + "0a918a0000102b6968384a090b8b40011fd608feffd008410791e00301aae10308aaBL8;FF1f0d00f143070054e8c31791e083329129abff97e8fb42f91f0500b140e90054e80343f9e9f31691e07fc13de9a305f9e9ffffd029610491e80305f9e8fffff0L8;FFe00319aa210080520a110094e00c00b48", + "1060091e20319aafa0300aa0d110094d702f8b6f4031faae00314aae10317aa990c0094e90f41b206000014e91741b2BBL8;FFe09f41f9220080520b510194f70f40f9e80740f9ff0208eb6000005404000014f7031faae0230091a34b019408038052e90b40f9e00bc03de826089be91b40f9L8;FF28104", + "0b9000040f96800c8376800d037c14c0014cd4c0014cd4c0014000040f93e4fff17000040f9720dff17000040f99a04ff17082440a9e20301aae00308aaL16;FFe84300f9289840f9e82300f9289c40f9e83700f928a040f9e81f00f928a440f9eaa302a92a2055a9ea7b00f9e86300f92a2056a9e86700f", + "928c040f9ead300f9BBBL8;FF08008092e303042affa304a908018052f3230091ffff01a9ffa303a9fdf7ff97600c00b4e10740f9f40300aa810000b4e00b40f922008052ff700194e11340f9L8;FFfaa74ba90a630191061f57290083c13c0003433908e301910183c23cea2301a9e8a3039181820091a5", + "0303d102048052e3031caae4031baaa0073aadf55b02a9BL8;FFc0035fd6ff8301d1fd7b03a9f65704a9f44f05a9fdc30091081c00121f090071a1010054e00302aaf30302aaf40301aaeafdff9720020037750240f9a80640f9L8;FF190000f021030e91367860f8df0200f1640a437aed0200547f7e007", + "164da467aa00f0054930f0037b5ea0091207875f8200f00b562020032407c409303280091BBL8;FF681c005406010014e1d342f9e8cb42f91f0101ebe0700054e8cf42f9490b8052f4074091948209910969213828040091f69349f9e8d302f9df0a00b1610d0054L8;FF1f090071e1060054090180d268d", + "f78920900f0f23a0140b2370000141a048052ba031ef8e8030291e13f40f9e083269108a10c91000540ade807409108011891L16;FFe82301a9e20315aa16000094e00740ade20bc03d810240f9620a803d600600ad010100b4e00315aa22008052f44f45a9f52340f9fd7b43a9ff830191feb00014BBBBB", + "L8;FBa71a400000000000340000000000000017010000110000006c69627369676e616c5f70726f746f636f6c3a3a747269706c655f72617463686574696e76616c69L8;FFbf0214eb08070054f4031faae9031faaf50000b46002148be10308aae20315aa0c990094e10318aae90314aae80740f9350115", + "8bf50f00f9090115cb285041a9BL8;FF20060054096840b969070034290140b22911c0da291540d2290d098b2925019129fd46d3290500910a2440f9aa0600b44b0140b26b11c0da6b1540d26b0d0b8bL8;FFe0031caae10315aa220080520a190094e11341f981e300b4e01741f91807001408190094e00", + "31aaa210080520119009440e900b4e1df40f9e2031aaaf90300aaBBL8;FFf60302aaf70301aae0430291e10303aa02048052f50306aaf40305aa4b1b0094e84b40f91f0500f1c0230054fb430291e00317aaf90300916083c63c6183c73cL8;FFc8048052293fc0f2ea7f06f90a078052ff5306f9e85b06f", + "9ff5f06f9ea6706f9e87306f9e97706f9bc540094e1fb44f9810000b4e0ff44f922008052fe580094L16;FFc2018052a40080523c000014e80f41b29dffff17e06301f981feffb021800f9163feffd063a03991e0030b91420280520401805227000014e0230b39e0030b91BBBL8;FF6ca240a9ea0314aae", + "10313aaefffff17ff0304d1fd7b0aa9fc6f0ba9fa670ca9f85f0da9f6570ea9f44f0fa9fd830291081c00121f09007181010054550040f9L8;FFe8cf42f9090280522a04009109692138e1431691ead302f9d0110094e85349f9280500b409e179d3f84f49f959038052361108cb04000014d6c201f118c3", + "0191BL8;FF290100cb4a01008be0031faa0a2500a9f44f45a9f52340f9fd7b43a9ff830191c0035fd6fd7bbea9f30b00f9fd030091080040f9f30300aaa80000b4600640f9L8;FF0f020f8bf07d0c9bcf05409208c1508baf0400b5490800b43f0103f1ed030aaaef031faa2e318b9acaf17dd350157bf2e", + "0fdff54b001108bf1030daa320240a9BBL8;FFf54f09f9e84b09f9f57749f9fb6709f9f46b09f9f47349f9e0a3843de0a7c43d4383c63ce85309f9e2a3c43df95709f9f75b09f9e1abc43df95f09f9f97b49f9L8;FFa02302d183f4ff97c02d003728fc60d3481300b5200840921f1800f182130054217c0", + "353411400343f040071200100543f08007141fdff54a1a20491a22302d1L16;FFe82b0ba9e8a342f9ea9f42f9e18315ada182ca3ca082cb3ce8270ea9e8ab42f9e9af42f9e10313ada182cd3ca082cc3ce86300f9e8b342f9e2ab803dea2306a9BBBBL8;FB636f6465206661696c65644d41432076657269", + "6669636174696f6e206661696c656456657273696f6e206d69736d61746368206166746572206e65676f746961L8;FF14890094e0031aaae10319aae2031baae30315aae4031faa14e8ff97280700d1f7031baa1cf940929f0315ebc80f005428fb4092f3031faa1f0500f1e8031faaBL8;FFf8630191e80", + "31691e00315aa1ba30191f54301f9f5031691f49aff97e8c342f91f0500b1601300548043c03df6e32291f76301912183c93ceaa209912283cb3cL8;FFe88b41f9e84400b4e08f41f901ed7cd322020014f78b41f9ff0600b120440054f48f41f9bf0a00f101f6ff54880640f91f1100f1c1420054880240", + "f96aae8c52BBL8;FF1f011ceb80080054560b40f9586340b9360500b4540740f90a490194e00316aa2100805203490194000c00b4e10314aae20316aaf70300aa06490194591740f9L8;FFe10240adfab30a39e10302ade10ac03de10b03ad49e0fe97e99341b93f09007121080054e8cf40f9e9a341b9ec", + "030b91eaa741b9e86301f9e9cb02b9eacf02b9L16;FF2ba059a9eaa30aa92aa05ba9ebe300f9e83300f928ec5ca9e9ab1da929d45da9e8f700f928fc40f921000891e9a30fa908c9009408e30d91f04b46a9ed031aaaBBBL8;FFf402805205000014f63340f993fffff07342279154028052f53b40f9ba00", + "00b4e1031aaa2200805203690194e13740f9d60000b4e02340f9e10316aa22008052L8;FFfd030091f30301aa14e0009104000014730600f194c20191c002005481825cf8810000b480025df8220080520269009481025ef8810000b480825ef822008052BL8;FF0900f0f2e8270039e90300f9e8ffff17e", + "00300f9a1feffb021bc0e91a3feffb063e40e91e00300914201805264018052eaffff17c80080d2e0230039e0030091L8;ZDBBL8;FF1f0500b120120054e082c13ce80700f9e8030b91f7430f91f89301b9e91740f90029803da8835af8e0430691e10244ade1830d91e8bb01f9a8e378a9fa9701b9L8;FF", + "e9ff4039e88340390a088052e00300912a15003308111d12e8830039e80313aaeaff0039e00741ade00700ad6423ff97e00740ade0030091600601ad5b3e0094L16;FF6242813c760200b9f44f4aa9f65749a9fd7b48a9ffc30291c0035fd602feffd04260399125feffb0a5402d91e1030091e0031f2ae3", + "031faa82a4009420feffb0BBBBBBBL8;FB333634356363642f303639353962342f7372632f76312f6368756e6b65642f7374617465732e7273000a64656372797074656420c00e206d6573736167652066L8;FFa59e0094e0031f2ae1080094a1835bf8fa03002a81f7ffb5beffff17e91340f9e093c23cf", + "a430e91e193c33cea2740f9e8a34039f50b40f93f0500b1400701adBL8;FF1a070094770a40f9680240f9080117cb9f0208eba9fbff54e00313aae10317aae20314aa11070094770a40f9680240f9080117cb9f0208eba9faff54e00313aaL8;FF1f0500b1e0010054e003c03de80741a929008092890200", + "f98082803c880e00f9810000b4e00313aa2200805202230094f44f44a9fd7b43a9ff430191c0035fd6BBL8;FF7f0308eba81b00541b0100b4a8835df8e10340f9e2031baa0001178b0d630194f7021b8bb7031ef85f0317ebe01c0054a8835df809058052ea060091a1c300d1L8;FFc6120094e10313aad4", + "fbff97803240b980010034610a40f9680240f91f0101eb00030054680640f9090180522a0400916a0a00f909692138e10313aac7fbff97BL8;FF0800f0f2ff270039e80300f970e9ff97e80300aa81feffb021a03d91a3feff9063a80d91e003009102028052a4008052e80300f909000014e00300f981fe", + "ffb0L8;ZDBBBL8;FB7f0b00000e0000004572726f72576869737065725072654b657953656e6465724b6579506c61696e746578740000000007000000000000000600000000000000L8;FFe16300918690ff97805e40f9800100b4e11740f9e80f40f91f0101eb20850054e81340f9090180522a040091ea", + "1700f909692138e16300917990ff977f0600b1BL8;FF0a01013909000014e9031faa050000142a008052492109aa0200001449008052098500a92900805209010039f44f4ba9f74b40f9f6574aa9fd7b48a9ff030391L8;ZFBBL8;FF42b03491e82700a9e8030091090000b029210491200440a9e82701a9", + "e82300910900009029613f91e82702a9e34300919e3e0194fd7b43a9ff030191c0035fd6L8;FF41fdff5481220191e20313aaa3fdff97000100b483000014200e00b5e00313aa7cfeff97e80301aa80000036880e00b5e1031faae1ffff17e1031faa886200b9L16;FF880100900801159129038052e8670", + "5f968feff9008611d91e8a303f940feffb000702d91e8ab03f968feff9008212091e1032b91e3031d9162008052f86305f9BBBBL8;FB5600000000000000d10000001f0000004e1a4000000000005800000000000000cb000000140000004e1a4000000000005800000000000000cb00000009000000L8;F", + "F0801098b130500917f0209ebe90b0054088c5cf81f0500b1e009005411fcff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b08050091BL8;FFbe0e0194e0fefff000202d91bb0e0194e0fefff000e00e91b80e0194fd7bbfa9fd030091081840f9080100b4080140b20811c0da0", + "81540d2080d088b08250191L8;FFe6431391e7031faaf59301f9e86f02f9e8a740f9e97702f9e87302f9e87b40f9e0cf803d080308aafc9302f9e87b02f9e8a74fa9f73b05b9fa4305b9e88302f9BBL8;FFea474039090180d2e8031faa0900f0f205000014090180d2e8031faa0900f0f229017fb24a1d4", + "09208010aaa69a200a92800805268020039fd7b45a9f33340f9L8;FFf5c341f9f7c741f9e95305f9400705ad000543ad4233803dffa71139400703ad020144ad420304ad010141ad410301ad020142ad420302ad010140ad410300adL16;FF3f05007141f50054890080520a008092790a00f969220039e0", + "0308aa6a0200f9ff074091ffc30091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8BBBL8;FF290500912001088be10313aaf7f8ff971601003513000014e8031faa75feffb5e003088be10313aaf0f8ff97b6010034610a40f9680240f91f0101eb00240054L8;FF00002f912a120094f8eb4", + "df934f5ff1748236639e2074091c0fdfff000201791c3fdfff063403191c4fdfff084c017914280099181048052480300399e6e0094BL8;FF4a050091290500d10a2500a9fd7b43a9ff030191c0035fd63f2900f1880000544b01098b6bf1df388b0cf8374b05c0396c1d00128c6119538c01210b8101025", + "1L8;FF00030054e303004b22c59c526000000a62eda072e1fcffb021600d91007c021b007c1b5320486038f55b42a9f76343a9f96b44a9fd7bc6a8c0035fd6c3020e91BBL8;FF04000014b50600f1d6620091a0150054c1825ff881ffffb4c00240f92200805205330194f8ffff17e807409108810991002", + "10291ed0b0094f4b749f99f0600b1L8;FFe90300aae00709a9aa4700d1e88b00b96bfdff906b210c91e81301b9a81840f9e20f0aa9e0070da9e00304aae10309aae20f0ea9c2e00191e3031f2ae74300f9L16;FFe00202917f140094e0e202918142089171160094e00fc13de20bc13de107c13df66b00f9", + "e28305ada00b7bade12b803da103d83cfc8f00f96083843c6083c23cBBBBBL8;FB206d65737361676520636970686572206b65790000000000fa0840000000000029000000000000004e0100002d000000fa084000000000002900000000000000L8;FF09088052e1830091220108cba9c303d12001088b0", + "f9b0094a80357f880030191a1c303d12200805208050091a80317f89c960094e8031f2aa0877bada0d300d1BL8;FFa87f3ba9a8273ea9c4160194e11b40f9810000b4e01f40f922008052061b0194e10f40f9810000b4e01340f922008052011b0194f44f57a9fcab40f9f65756a9L8;FF4183c13c4283c2", + "3c1f0500b1e0ef883de1f3883de2f7883de03400544083c33c4183c43c090080924283c53ce01b813d4083c63ce11f813de1efc83de223813dBBL8;FF967208f8f60300aa95f208f814d447a9e86700f928008052fbe702a9194440f91fa007a9a80301d11f4400f9e00309aafa9303a9e59b04a9e393013", + "9e25306b8L8;FFa3fdffb06300249144018052ff60ff97e15346f906000014e80f41b2e0833291e85306f96a61ff97e10300aae15306f9e083329161fdfff021203f9102028052L16;FFf9030b913a0080921b0180523c008052f7cb00f9e8f300f9a90311f8a0c303d1eee7ff97f40301aac046003788fe", + "60d3a82e00b5800a40921f1800f1a22e0054BBBL8;FF9f0208ebe8040054340100b4680640f9e10315aae20314aa0001178b0d7b0194e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00013fd6L8;FFe18b833de143c33da7ffff17e8f342f9e06fc13de0074091e173c13df64349f", + "900800991e85b09f9e83b49f9e277c13de0a3843de067c13de81700f9e83f49f9BL8;FF2b6869386cc100516b011b328d1d00126e9d01516b5d0151bf250071cd1d0012ee979f1a6b818c1abfe903714b69293829050091eb238e1a3f8100f108010b2aL8;FF4a8d0caa6c5a1653480163b24801889a6a52", + "14533f39406a08ad0baa0b200853082d0aaa0a340d5308690baa0b1c015308710aaa09017cb22811889a7f021f72BBL8;FF0825019108fd46d308050091090840f9e90500b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b2a050091091440f94801088b090100b42a0140b2L8;FF0081893c", + "01818a3ce92346a9fcbf05f9fcc705f9e94705f9e93b40f9e84305f9e84b05f9e82b45a9e95305f9e92340f9f6d705f9e85b05f9e95f05f9e86305f9L16;FF0cbb0094c0bb00b4e17740f9e2031caae05f00f90fbb00941a000014590080529f04001439008052d60000b4e00318aae10316aa22008052ff", + "ba0094ed031baaBBBBL8;FB6e657373737071723a3a696e6372656d656e74616c5f6d6c6b656d3736387370717220756e61626c6520746f2066697820656e63617073756c61746531207374L8;FF088b41b908050011088b01b9ff431191f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c003", + "5fd6ff1b00f9e01b40f9e10318aa97860094e0031faaBL8;FF880240f9680000b4e00313aa00013fd6810640f9810000b4820a40f9e00313aa050b0194e14b41f9810000b4e04f41f922008052000b0194e89f40f91f0500b1L8;FF29250191e91a498b29050091b61640f92801088b360200b4c90240b22", + "911c0da291540d2290d098b29250191c91a498b29050091280108ab4301005409010014BBL8;FF1f090071c1010054080180d2a9de78920800f0f2080140b20e00001429690091e8030aaa14000014080180d2e9031faad5fe48d30800f0f206000014080180d2L8;FF08050091091840f93f0500b140040", + "0540a2040f9092c40f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091090100b42b0140b2L16;FFe86b00f9e86b45f9ece745f9eff345f9fcf745f9f4fb45f9e8fb00f9e86f45f9e0ff45f9e70346f9fe0746f9ee0f46f9e8e700f9e87745f9f21746f9e51b46f9BBBL8;F", + "Fab0302d1ea830291e8270ba968008052a9ffff9029b10b91a04700d1a10302d1682503a988fffff008f11a91682905a98a068052480480527f2500a989fffff0L8;FF605a40f901f57ed3420080520a6b0094686240f9a80000b4606640f901f57ed342008052046b0094686e40f9a80000b4607240f901", + "f57ed342008052fe6a0094BL8;FFd9fcff17880080d20800f0f208050091d5fcff17880080d20800f0f208110091d1fcff17a1feffd021e01691a3feffd063fc1691e0c30391e200805264018052L8;FFc8fcfff0e003c03d016dc13de81340b9001c216e681200b96002803dfd7b42a9f31b40f9ff03019", + "1c0035fd6c0fcfff000001791c2fcfff042c00f9121038052BBL8;FFe08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a29be260194fd7b47a9ff030291c0035fd6ff0302d1fd7b07a9fdc301916a2440a9L8;FF0001158b132b0094a802148be0031f2a680a00f9f44f42a9f65", + "741a9fd7bc3a8c0035fd6e00313aaf60301aae10315aae20314aaece8ff97750a40f9e10316aaL16;FF4b2140b84c0d40794091c03c4121c13c4a214039ab431eb8ac831e78e00b803de193823c0820003928008052ab435eb808240039a8835e78e00bc03de193c23cBBBBBBL8;FB20776974682027c023", + "273b2063616e6e6f742067657420726563656976657220636861696e20696e666f2028c0012900166572726f7220696e206d6574686f64L8;FF410080520b9f0094800e00b4a8fe41d3fa031faa9c630091d40600913b008052bf031ff8a8033ea9080000142807c05a08683a785a0b00915f0315ebbb031", + "ff8BL8;FF6a0a00f909692138b60900b4c80240b20811c0da081540d2080d088b08250191c81a488b08050091f40800b4890240b22911c0da291540d2290d098b29250191L8;FFe10100b4e00315aa220080520a1f00940b000014b80000b4e00319aae10318aa22008052041f0094a1835ef8810000b4e0", + "0315aa22008052ff1e0094e003c03dBBL8;FFa91640381f01096be0179f1a22740194d60600f11b001b0a21ffff54c6ffff17e81740f9156d00a92c000014e043069121230091022a8052065f0194f41340f9L8;FFf6c740f9537f089b0e5f0094e00313aa01018052075f0094c00801b4080d8052fc0300", + "aaf3031faa547f089bf5031aaae10316aa9f0213eba0020054e0c31791L16;FFb9ffff17e00313aae10316aae20314aa2300805224008052e5020094760a40f9680240f9080116cb9f0208eb69f7ff54e00313aae10316aae20314aa23008052BBBL8;ZBL8;FFe0630091e10317aae20315aa23008052240", + "08052e6a2ff97f71740f9e80f40f9080117cbbf0208eb29c6ff54e0630091e10317aae20315aa2300805224008052BL8;FF0001805201058052a2fa0094c0fefff000400591b9fa0094f8031faae00318aae10313aa9cfa0094c0fefff000600291b5fa0094c0feffd000203d91c3feffd0L8;FFe9ffff17", + "e00307aac0035fd6210400d1030080d27f0002eb000100540468633863040091256863389f00056b40ffff548000054b0200001400008052c0035fd6BBL8;FF6900001408008092686e00a957000014080080927b0600f94e000014b82303d1abab74a9081340b8a9c353b8ac035438e88b00b9a8835538e", + "a3b00f9ea4740b9L8;FF0d3f0094619a43f9f55b00f9810000b4609643f922008052073f0094fa031faaf5031faa7fc613392a00809288020014e8f741f9788242f9e90342f9fa5f09a9L16;FF7caf45a9773740f974a740a96d3f40f96ae341a99f0700b1eb7700f97adb42a975bb43a979a344a96b334e", + "29604600547f010971204600549f0600b1a0610054BBBBL8;FB6f7d68af531abb819168e296f6c95b3cfeb3846bd1b6d4bb0e6bdac6a28c642111ce00003f332563ff46b0582749c6e6f794d196024be482bdb40f826bea9651L8;FF40fdff54ebffff17f80700f90d8f00944000805241008052068f0094", + "e07300f9c08300b4078f00944000805241008052008f0094e06f00f9008300b4018f0094BL8;FFe1031faadbffff17a22302d1630c80521ee4ff97e10300aac0faffb478010014e8534cb948000037f62b06f9202a00b5a02302d127ecff97e80301aae0010036L8;FF100f0094c002805221008052090f0", + "094400300b408fdfff008e53d91e90741b20001c03d08e140f80000803d08e000f8c8028052692200a989008052602201a9BBL8;FFfb630491aa020094e81b41b91f050071a10100546083c03c6183c13c080080926283c23c680200f9e043803ce143813ce243823c6082803c6182813c6282823cL8;FF3", + "f0500b1201a0054f30300aae00308aab3020094e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209ebL16;FFe81342f9e5ab42f9e4af42f9e6b342f9edb742f9e8b300f9e81742f9f6bb42f9f2bf42f9e0c742f9e2cf42f9eaa317a9e81b42f9ea4", + "742f9fed742f9e8ab00f9BBBL8;FF856d0094e00316aa8f7d0094e30316aae80300aae90301aae00315aae403142ac8d40736c9d5ffb59bffff17e00317aa857d0094e30317aae80300aae90301aaL8;FFe8cb00f9ecab4779e31b40f9eb3b00b9a00302d1e2e300918b1245f8e8fb0039e10319aae8b340", + "f9e97304f8e9a34539ec7b0079ebf303f8e8f304f8e95f0139BL8;FF48008052e0a300390900f0f2e8a70039e91300f9e08300916df5ff97e10300aae00301aaf44f49a9f93340f9f65748a9f85f47a9fd7b45a9ff830291c0035fd6L8;FF01801fb805c01f381fe01f78caffff1703d05f3863100012611", + "4010b251c0012d4ffff17f35341a96effff1701000014fd7bbba9fd030091f55b02a9f50301aaBBL8;FF3f0700b1f90b40f9e0070054e1d342f9e8cb42f91f0101eb40330054e8cf42f92a040091002302914901805209692138ead302f9d4160094e1431691b60c0094L8;FFe00319aa01c480522200805", + "20a2f0094bc035ef8bb035df868031ccb1f7d00f189440054b9835df8400740ade0031aaa010480522200805228031c8bf6032491L16;FFfb0300aa000402ade00b45ad000803ade10342ad010000ade20343ad020001adb5000034e00316aae1031caa2200805201af0094e11b40f9e81340f9080101cbB", + "BBBBL8;FB69616c697a6174696f6e496e76616c6964000000000000003d0f4000000000004a00000000000000b60200000900000042024000000000006a00000000000000L8;FF4a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0", + "035fd6e00308aba3ffff5420feff90BL8;FF09fd46d30800098b080500911f0109eb88130054bd000014080c44f81f0900b1c1090054f3031faa5a000014e80300aa098d40f83f0500b1e0120054f30300aaL8;FF16f10039090d0039e98341b919f5003909110039e97b41b91bf9003909150039e97341b", + "909190039e96b41b9091d0039e96741b909210039e95b41b909250039BBL8;FF4800805269fffff029e12391a02700d1e1430191e82708a968ffffd008811b91e82b0aa9ca05805288038052ff2705a969ffffb029dd3591e92b07a9290080d2L8;FFe00758ad955e1833e82343b95c0300f9550b00b940c", + "3803c41c3813c482f00b9ff033a91f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6L16;FFa90700b4280500f1e00600542b0440f91f2900f14c018052ea031faaf6031faa0c318c9a79014039680500912e0080526d696e38df010cebaf194092f021ca9aBBBL8;FF0201805264008", + "05209000014e00700f9a1ffffd021003991a3fffff063a00291e023009102018052a4008052f77c0094e00740f9b6ffff17e00700f9a1ffffd0L8;FF008e0054e8cf42f949058052f4074091948209910969213828040091f67749f9e8d302f9df0600b1a033005480220291ea2b0094080040b20811c0da", + "081540d2BL8;FFf50b40f9fd7bc3a8f6feff17fd7bbda9f65701a9f44f02a9fd03009114d440a9f30300aa950100b49622009104000014b50600f1d6620091e0000054c1825ff8L8;FFc9020054a37c039182201d912100008b2100038b21f07d92419401a93f4005f169020054c81b80d2000080d262008", + "0d2430480d204008092050080d2010000d4BBL8;FFe07f843de007c43d023f8052e82b09f9e183843de28b843de087843d0d370194f9431591b40000b4e00315aae10314aa2200805200370194e1e34df9810000b4L8;FFe85703f9e8431591e1032a91e85b03f9e8fdffb008c11f91e85f03f948008052e", + "85b05f968fdffb008211091e85f05f9e84705f928fdffd008ed0a91e85305f9L16;FFe187c13de48315ade08bc13debaf00b9eb6740f9ea5300f9f67f42f9f4c342f9f8030baaedc742f9f9cb42f9fecf42f9eed742f9f2db42f9f1df42f9e0e342f9BBBBL8;FB6d75737420686176652061206375727265", + "6e7420737461746500000000000000bb124000000000003800000000000000470100000a0000007375636365737366L8;FF29194a8b29050091200108ab62000054fd7bc1a8c0035fd600feff9000a00d91b682009400feff9000600291b3820094e0fdffb000200c91b0820094e00301aaBL8;FF20f18f3", + "c2083ca3ce9270c9122f18f3ce9670c912283c53c20f18f3c2083c43ce9a70a9121f18f3ce9e70a9108e10c9120f18f3c2083c63ce9270b9122f18f3cL8;FF0201805201ed7cd30b070094ff2200f101efff54f6031f2a5f000014b90000b4e00316aae10319aa2200805202070094e12740f9fb0315aa81", + "0000b51a000014BBL8;FF1a00f0f2ffc2007182000054e87e0453490b009105000014ff3e0171e9000054e87e0453490f00916842003908008092682600a9ef000014a8060091822600f1L8;FF61000054e0e3009159e5fe97080d8052e92340f90827089b29008052097d02a9090180521a7100a91c0700", + "911a7d01a91f2503a91f2100f92003c03d0081843cL16;FFe83b42f9eeb342f9e4b742f9edbb42f9e1bf42f9e87300f9e84342f9f1c342f9efcb42f9e32f00f9f5d342f9e9a310a9e84742f9e95742f9e3d742f9e0af823dBBBL8;FFc0035fd61f09007181010054aa035ef8090180d20900f0f248dd7892", + "290140b20a000014aa935d38090180d2e8031faa0900f0f205000014090180d2e8031faaL8;FFaf000014e00700f9e00301aaf30301aae10309aa22008052f4030b2a240600946aa240a9e00740f9690240f9e10313aa54692838080500911f0048f1680a00f9BL8;FF200200543f080071e103005489824", + "6f83f0500b1a10000549fe606a99ffe07a999fe08a99f9a00b981a20191e003082ae20313aadcf7ff97001200b520fcffb4L8;ZDBBL8;FF012440f9f30300aa3f0400b140010054810000b4602a40f92200805206270194613240f9810000b4603640f92200805201270194b40000b4600640f9e10314aaL", + "8;FF3f8d00f12831889a1f6d00f14804005449fdffb029812a918a0000102b6968384a090b8b40011fd6010440f9410300b4000840f922008052f44f41a9fd7bc2a8L16;FFb28102f832825df8c28102f8220a40f9e017803d2002c03dc181813c4109c03da2031df8223240b9a0039c3ce141823ca1037e", + "adf23300f932825fb831c20191BBBBBBBBL8;FB203020616e6420362c20676f7420c0001f70726f63657373696e67205072654b6579206d6573736167652066726f6d20c01d20776869636820686164206e6f20L8;FFfa6702a9f85f03a9f65704a9f44f05a9fd030091ff4318d1ff0300f9f50301aa2818", + "40f9e20f00f95f0008ebe1230054a00640adf80302aaa20ac03da81a40f9BL8;FF810240f9810000b4800640f92200805209240194810e40f9a1fdffb4801240f92200805204240194e9ffff17f44f41a9fd7bc2a8c0035fd6ff8300d1fd7b01a9L8;FF690240f9e10313aaeeffff17ff0301d1fd7b02a9f", + "44f03a9fd830091480001ab42030054010840a9e50304aa0a018052e40303aaf30300aae023009129f87fd3BBL8;FFf44f43a9f65742a9fc5f41a9fd7bc4a8c0035fd61f090071c1000054080180d289de78920800f0f2080140b206000014080180d2f4031faae9031faa0800f0f2L8;FFeaffff17fd7bb", + "ca9f85f01a9f65702a9f44f03a9fd030091f30301aa210840f9f50300aa680240f91f0101eb800b0054680640f9b60a40f92a040091b41640f9BL8;FF977e02a99f5e03a99f6204a99f3e00f9e10314aae20313aa64030094c00300b5e1031faad5ffff17c1010054e1031faac1ffff17880080d2e10700f", + "90800f0f2L8;ZDBBBL8;FB696e7370656e64696e675f7072655f6b657972656d6f74655f726567697374726174696f6e5f69646c6f63616c5f726567697374726174696f6e5f6964616c69L8;FFe80f40f91f0101eb20830054e81340f92a0400918022029149018052ea1700f90969213845f4ff97e1630", + "0917c91ff97806a40f9800100b4e11740f9e80f40f9BL8;FFa84302d1e0830c919fff0094a04302d1e10313aa600100941f1c0072e0079f1a04000014e0031f2ac0035fd6e0031f2aff031291f44f45a9f65744a9f85f43a9L8;ZFBBL8;FF0d440114280080527f2200a97f0a00f9f44f42a9f65741a9fd7", + "bc3a8c0035fd6fd7bbca9f70b00f9f65702a9f44f03a9fd030091080840f9080100b4090140b2L8;FF80fdff9000802191bf3f009480fdff9000e02191bc3f009480fdff9000402291b93f009480fdff9000a02291b63f009480fdff9000002391b33f009480fdff90L16;FFe9ab00f9093540f9ea2712a9", + "0a2547a9ead700f9e94f00f90a2548a9ea5300f9e9df00f90a2549a9e9af00f9095140f9e9c700f9095540f9eaa710a90a254ba9BBBBL8;FB47000000000000001d0200001400000073686f756c6420737570706f727420616c6c206c6f7765722076657273696f6e7300000000000000bb1140000000000", + "0L8;FF080d088b0825019109fd46d30800098b080500911f0109eb482200545b010014e80300aa098d40f83f0500b140220054f30300aae00308aa20020094e80300aaBL8;FF23feff54e0fefff000800e91bb0f0194e0fefff000601d91b80f0194e0fefff000203291b50f019408004039e9feffd02901", + "1091e00301aa227968f8e9fefff0L8;FFe0d7c53de1dbc53de0431391e2dfc53de037813de13b813de23f813df3ecff97f62b40f93f020014e8af00f9e87342f9f97742f9e9df44b9f67b42f9fb0308aaBBL8;FF3f040071a101005481c20091a2630091e003082a5fd9ff9760faffb45800001481620091", + "a2630091e003082a4ad8ff97a0f9ffb449000014a2630091e003082aL8;FF88008052f43f42f9e8a3113929008092f53b42f9690200f9880240f9680000b4e00315aa00013fd6810640f9810000b4820a40f9e00315aaff530094e8630191L16;FFf81240f90fd40094e00316aa2100805208d40094a0020", + "0b4e10318aae20316aaf70300aa0bd400940500001435008052f61640f976feffb537008052935600a9BBBL8;FFe10316aae20315aa0001178b11740194e802158b680a00f9804e41b980010034610a40f9680240f91f0101ebe0330054680640f9090580522a0400916a0a00f9L8;FF00011a8b13740094", + "4803188bf90b40f9fa0740915a830991e8d302f97f0700b1fb0314aa806dff5440c30391d1000014e8031faa00011aab62570054e1431691BL8;FF680240f9080117cbbf0208ebc9fbff54e00313aae10317aae20315aa2300805224008052e2170094770a40f9d6ffff17f44f44a9f90b40f9f65743a9f8", + "5f42a9L8;FFa0010054b50400b4b602188bc81a80d2e00316aa010000d4df0200eb8006005480020e9102008092011440f902cc01f9810600b597020e91560080d2050080d2BBL8;FFe1d342f9e8cb42f91f0101eb00030054e8cf42f929040091e00318aa19692138e9d302f9c81a0094e1431691ba1100", + "94080340f91f0500b1a0000054e2431691L8;FF43f8ff54daffff17a80358f82003c03de00313aa096b40b9940a40f9e81b00f9e8030191e00b803de93f00b922cefe97e82340f91f0500b1c0000054e013c03dL16;FFe10b803d6183c73ce84300f9e10303ade317803d6e000014e083029181220091023", + "98052f58302910ab40094800ac03d8182c03ce0431091881a40f9890e40f9BBBBBL8;FB6174653a3a73657373696f6e00000000390740000000000033000000000000006c0100002a000000696e76616c6964206c6f63616c206964656e74697479206bL8;FF131900a9e70313aa130900f9f44f45a9fb0b", + "40f9f65744a9f85f43a9fa6742a9fd7bc6a801000014fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9BL8;FFe00313aae10317aae20315aa17000094770a40f9a6ffff17e00313aa2200805212000094610a40f9afffff17e00313aae10316aae20315aa0c000094760a40f9L8;FF00401d91e", + "8431339e8830991eabf1339e037c13de13bc13de0d7853de1db853d6716ff97e0d7c53de1dbc53de007409100401d91e00714ad5c310094e0830991BBL8;FFe83300f9a7570194ffff0039f50318aaf4031aaaa2fe46d3b8e27a92b5164092e20000b4e83340f9e0020191e10314aa0801028be83300f99a", + "570194e0030091L8;FF08018052ffeb05f9f6ef05f91f7f0aa91fff0ba9f6fb05f9e80706f9ff0b06f9fa0f06f901430291a22302d1c2f5ff9760dcffb46700001420dcff54c8010014L16;FFa1320094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6e0031fa", + "a9ad70094e00741a998d70094fd7bbfa9fd030091BBBL8;FFc10100b4820a40f9e00313aaf44f41a9fd7bc2a8087c0114280400d11f0d00b1c8000054000440f922008052f44f41a9fd7bc2a8007c0114f44f41a9fd7bc2a8L8;FFe1074091023280520080019121c03591107c0094e00fc43de113c43de0", + "074091e82b48f9e20bc43de1074091e08f843de0ffc33d00800991e193843de103c43dBL8;FFf65741a9fd7bc3a8c0035fd6280080527f7e01a9680600f9c8feffb008213b91680200f9f44f42a9f65741a9fd7bc3a8c0035fd6c8feffd008a1059169d600a9L8;FFc2feff97a10f40f9750a40f9eeffff1", + "7ff0302d1fd7b02a9fb1b00f9fa6704a9f85f05a9f65706a9f44f07a9fd830091f40302aaf30300aa540d003728004039BBL8;FF4901084aaa635738a94317386901084aab735738a95317384901084aaa835738a96317386901084aab935738a97317384901084aaaa35738a98317386901084aL8;FFe8e", + "f43b9f6db43b99f0b00b1a01e813de8e307b941050054e8e347b9a01ec13de983249120fdffd000542c91e1431a91e83709b9e8832491e3430f912041803cL16;FF1f0500b14000005401c5ff97df0600b18002005474674ca9990100b49b22009104000014390700f17b630091e000005461835ff881fff", + "fb4600340f922008052BBBBL8;FB1fbbd45ae8e86b075100c3eb485852d972939b2209ee06fade900044c755de945e790d0e7026764ed9ccd4c2a4e4d2aa0b66dfa47b40a9eaa28c7add265b7930L8;FF00210091a20301d1e10700b921008052e3fdffd063c00a91e4fdffd084600b91a8031ef8a9031cf", + "88e870094e10740b912feff9052823091480100b008014039BL8;FFe95f04f989ffff9029611291e8a305f9e8c32791e9a705f9be070194e89b40f9e9c31691eaffffb04a610491e9a305f9e9c32791e85b04f9e8ffffd008012391L8;FFfd7bbea9f44f01a9fd030091f30301aaf40300aa0b0c00940003", + "805201018052040c0094000100b401fdfff021c00491144c00a91f400039f44f41a9fd7bc2a8BBL8;FFa002168be10318aae20317aa114c0194d602178be00318aae10317aa22008052f60f00f9044c019402000014f60f00f9e883009180820191818202914f480094L8;FF80fdffd000000391bc470094", + "80fdffb000603e91b947009480fdffb000202091b6470094fd7bbfa9fd030091081840b9c8050034080140b20811c0da081540d2L16;FFe83340f9e8c702f9e8f740f9e8cb02f9e82f40f9e8cf02f9e87f40f9e8d302f9e84b40f9e8d702f9e88340f9e8e302f9e87740f90329009135290094e8a343f9BB", + "BL8;FFe20313aae002198b126c01943903138bf90f00f9f50200b52c00001436008052e10740f9e1f7ffb5c1ffff17e8031faa95f9ffb5f80308ab63faff54a0ffff90L8;FF02018052f44f43a9f70b40f9f65742a9fd7bc4a8086c0014f44f43a9f70b40f9f65742a9fd7bc4a8c0035fd6fd7bbea9f44f0", + "1a9fd030091140040f99f0600b1BL8;FF8182883ca0077aad8282893c880200f98082833ca00f7bad8182843ca10b79ad89820af88082853ca003d13c8382863c8082803c8182813c8282823c4f000014L8;FF091d0012480000cb8c0500d11f010beb200100548df55f386b050091bf01096b61ffff5441", + "000bcb20008052fd7bc1a8c0035fd6e8c300b2ecc300b2edc301b2BBL8;FF4bd5ff97fb7740f9e082c03ce182c13ce282c23c7f0700b1e08705ade237803d000e0054e082c33ce182c43ce8a30391e282c53c00630291a0073bade082c63cL8;FF102c0094e00316aa21008052092c0094000c00b4e10314", + "aae20316aaf70300aa0c2c0094591740f9b7831ff8190400b4541340f9032c0094e00319aa21008052L16;FFe09bc03dff7702f9ff7302f96012813ce023c13dbf7f34a96082823ce097c03dff4f02f96016803de03bc13dff4b02f96082863ca003d43cff0f01f96022803dBBBBBBL8;FB797065203cc00", + "13e00224661696c656420746f2064657465726d696e652073656c665f73657373696f6e3a20c0001e45435075626c69634b6579206465736572L8;FFff6b01f9f56f01f9ff7f01f9f57b01f9ff8301f9f58701f9ff9701f9f59301f9ff9b01f9f59f01f9f5ab01f9ffaf01f91467179b9c0a40f91c2a0037", + "88ff7ed3BL8;FFe0230091a20080524403805296000014c90080d2e8430039480080520900f0f2e8470039e90700f9ddffff17e00700f901ffffd021a00f9103ffffd063b40f91L8;FF170100b4e00318aae10317aa22008052f80308aa08200094f7031caad5ffff17f7031caaf80308aad2ffff1720fdf", + "ff000203191b51b0094ff8301d1fd7b03a9BBL8;FFf4c342f9c1ffff1748008052c90a0091e0031639e8071639e9bf02f9a3ffff17e003163948008052c90a0091e0e31591e8071639e9bf02f9656600940b000014L8;FFe8270ca948008052a9fdffd029c11d91ea430191a8273da968fdfff0084d1491a", + "82b3fa90a078052c8048052bf273aa989fdff9029ed0a91a92b3ca9290080d2L16;FF63cc0d910f000014e00300f981fefff021f4129183feffb063900291e0030091e2008052840080521200001481fefff021f4129183fefff063001291e00300f9BBBL8;FB6d54696d656000000000000000000000000", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L8;FF220080522300805224008052e8a3ff97e11740f996fcff17e0630091220080522300805224008052e1a3ff97e11740f99efcff17e06300912200805223008052BL8;FFe10300aa", + "e00308aa14010014fd7bbda9f65701a9f44f02a9fd030091f30302aaf40308aa820100b4f60301aa05000194e00313aa21008052feff0094c00200b4L8;FF08010035f40740f9d40000b4e00314aae1031f2ae20313aa72000094e00314aaf44f42a9fd7b41a9ffc30091c0035fd69affff17afffff17aff", + "fff17d9ffff17BBL8;FFb9031af8e1b20191a22301d161c5ff9760f3ffb45d000014a88359b848000037b98319f8e1920191a22301d159c5ff9760f2ffb45e000014a88356f81f0500b1L8;FF290c40f9e8430f91e1031baa20013fd6f6434f39df0a007141140054c8008052d90100143c008092ff0a001", + "4759a41f9e8430f91e00315aae63a0094a8624039L16;FFb9040014e0031baa088c40f809204039155048a9164840f9175040f9bf0600b1c04700540a9840b95f010971604700541f0500b1c07d005459cbff975c008052BBBBL8;FB044088ec0b924f25a29a514dadae53dface7d673eb39f094784a3c25", + "9e124f09a28cd01d49fb00008e502bac2cb119e16cc6462b3be9f5da491bdd5bb2c66e42L8;FFe0fdfff000801691bc8b009400feffd000400a91b98b0094fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e0030054e00313aa40000094080040b2BL8;FF7b0700919f0314eb41efff5400030", + "014e8cb45f9090d8052e037c33d6822099b000d803de03bc33d0011803de03fc33d0015803de98346f9093100f969060091L8;FF54e6ff9728008092a80200f9f44f45a9f52340f9fd7b43a9ff830191c0035fd6ff8301d1fd7b03a9f65704a9f44f05a9fdc30091f30302aaf40301aaf50300aaBBL8;FFf", + "a6742a9fc6f41a9fd7bc6a8c0035fd63f0700b1c0e9ff54e0c30c910ad4ff974bffff1738008052df0215ebf54702f9f84b02f9ff4f02f929f7ff54e0231291L8;FF81feff54a90109abe2000054200108ab62010054fd7bc1a8c0035fd6e90309ab63ffff5480fdffd000c01f91b34b009480fdffd000a0", + "2e91b04b009480fdffd0L16;FF0ba452a9eb4300f9e92300f90ba454a9e97b00f909b440f9e96700f909b840f9e9ef00f909bc40f9e95700f909c040f9e96f00f909c440f9e95f00f909c840f9BBBL8;FFe003082ae20303aaf60303aa61f5ff97601800b5e9031faae00314aae30316aac4ffff17e00317", + "aa877e0094e30317aae80300aae90301aae00316aa88fb0736L8;FFf70b40f9f65742a9fd7bc4a8c0035fd620008052e10314aa9e6b0094ff0302d1fd7b07a9fdc301916a2440a9681040f90b3140a9081140b9e2ab03a9e92700f9BL8;FFe00301aaf44f45a9f65744a9fd7b43a9ff830191c0035fd6ff8", + "302d1fd7b05a9f93300f9f85f07a9f65708a9f44f09a9fd430191081c00121f090071a1010054L8;FF83fe073703cc7492040000f084c041f9630040f97f0004ebc1fdff5403404079642c46d39fbc007168030054e3fcff9067e00b91867c4093e4d86478217c041bBBL8;FF080d088b0825019109fd46d", + "30800098b080500911f0109eb6828005420ffffd000e00e91b52b0194e8031faa000119ab42730054e1431691b70d0094f90b40f9L8;FF8100805200001891ff0316b9e85300b9492a0094e80356b9e00740918100805200001891ff0316b9e84f00b9422a0094e80356b9e00740918100805200001891L1", + "6;FFff430ed100844eade9a70991f30308aa08f840f9e10300aa0232805220f18f3ce9e7099121f18f3c00844cade8c701f9e8a7089100f18f3c00884dade8e70891BBBBBL8;FB6d757374206861766520612072656d6f7465206964656e74697479206b657900bb12400000000000380000000000000049", + "0100000a000000bb12400000000000L8;FFe00301aa08014039227968f829feff9029211091287968f8e10308aa98930014e00301aa21feff9021000e914200805292930014080040f9090140392a0900d1BL8;FF2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d", + "329010a8b290500913f010aeb29030054280108ab8300005410000014L8;FF09dd78924a0140b2c0010014f8db40f936008052e00b4091e82303b9e8830c918900805200c00e91e143139162008052e86b02f9e96f02f9f97302f9fb7702f9BBL8;FFe92f5d29e82b14292809c05a6909c05ae8271529e88", + "f40f909208052e08744ad282508aa080dc0daa0073dadff230ca9e28345ada2033ead9a53019400e4006fL8;FFe89340f9e82000b40805088be00313aa0201805201f17dd352f8ff17f96f41f9eac31791f5e3573940c1c03cf7ef573941c1c13ce91f46b9280340f958914078L16;FFc200005494fe4ed3", + "680240f9bf0208eb0107005435000014680240f9897e0e53bf0208eb3861193261000054e00313aa5fd20094680640f997fe5cd318693538BBBL8;FF55fcff97202700b5f7031faac1ffff1721c30091e20313aa4ffcff97c02900b5f7031faabbffff1721830191e20313aa58fdff97e02700b5f7031faa", + "b5ffff17L8;FFb30000b4e07b49f9e10313aa2200805209780094e18349f9810000b4e08749f92200805204780094f4ab49f99f0600b1a0baff54f5b349f9f3af49f9551600b4BL8;FFf65741a9fd7bc3a8c0035fd6090141d2ea0080523f2d00f129318a9a3f2500f1480e0054cafeffb04a6d08918b000", + "0104c6969386b090c8b60011fd600200091L8;FFfaffff17e00304aab7000094e09740f9bbffff97e1834ba93f0000eb80020054e5230191ffff04a927008052ff2f00f946008052e00305aae2e30091280980d2BBL8;FF207201b4e10319aa02788052fb0300aa10380194e09bc43de19fc43de0031caae", + "2a3c43de8c34ef921058052e0ff833de05fc73d22008052e103843de207843dL8;FFff272a39e84305f9713eff97e10300aae14305f9e0032a9121fdffd021203f910202805263fdffb063481891c4028052b8000014e04305f9e0032a9121fdffd0L16;FFb40000b4e04b40f9e10314aa2200805209b800", + "94e14340f9810000b4e02740f92200805204b80094ed1b40f9ee6740f98dcdffb56ffeff17fa031faabcfcff17BBBBL8;FB3f000000270000006d697373696e672073656e64657220636861696e000000009f1b400000000000340000000000000037010000220000004d41432076657269L8;FF0d880094", + "e8cf40f91f0500f1ab000054e0d340f901f97fd34200805206880094e8db40f91f0500f1ab000054e0df40f901f97fd342008052ff870094e81b40f9BL8;FF600606ad800743ad687a00f9755e01a9600604ad820344ad620205ad810341ad610202ad820342ad620203ad810340ad610201adff032e91f4", + "4f45a9f65744a9L8;FF09fdffb029ad3991e9bf01f9e9018052e9c301f909fdffb0292d3a91e9d301f909fdffb029893a91e9e701f949038052e9eb01f909fdffb029e93991e8d709a9BBL8;FF85460094ff8303d1fd7b09a9f95300f9f85f0ba9f6570ca9f44f0da9fd430291f30308aa28008052380180", + "d2ff2303a91800f0f2e87f05a9e8830091e00702a9L8;FF05028052a5430094e8eb41f91f0500b1e01b0054e002c03de8f341f9e9030b91e17740f92015803de89301f9a10000b4e07b40f922008052ff470094e9030b91L16;FFe8d343f9e8ab00f9e8d743f9e92312a9e8db43f9e9df43f9e8ab1aa9e8e", + "343f9eaf343f9e9a309a9e8e743f9e9eb43f9e8df00f9e8ef43f9e8af15a9e8f743f9BBBL8;FF5c2040b9f60302aaf80301aaf30300aaf40308aa0b680194000480522100805204680194e00d00b4c00640adf50300aa000400ade00318aa06640094f60301aaL8;FF00013fd6e0031faaf44f4da9f6574c", + "a9f85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a97b66ff97e0230091f7a700a97866ff97e00313aae1031faaBL8;FFc90080d248008052e02300390900f0f2e8270039e90300f9ecffff17e00300f9a1feffb021681391a3feffb063581491e003009142018052a4018052eeffff17L8;ZDBBL", + "8;FF0d2801944dfeff17fb0300aaf80b00b99a0400b4fb0300f90a280194e0031aaa210080523b0080520228019440f8ffb4fb0340f9e2031aaafc0300aae1031baaL8;FF280100b40805088be00313aa01ed7cd302018052f44f42a9f65741a9fd7bc3a805280014f44f42a9f65741a9fd7bc3a8c0035fd", + "6fd7bbda9f65701a9f44f02a9L16;FF1b0100b4e0031caae1031baa22008052f5030caa08a80094ab835ff8ec0315aab6577ea9e0c20191b8835df8140200b49f0600b1c1000054f91b40f9f40740f9BBBBBBBL8;FB696f75732073657373696f6e20c00520666f7220c0023a20c000217374616c6520756", + "e61636b6e6f776c65646765642073657373696f6e20666f7220c00d2028L8;FFe02300916cf8ff97e0031b2adaffff17680100f008210091a94300d1fa03002a00210091a22300d1fb03012a21008052e30315aae40316aaa8273fa9899d0094BL8;FF0b7c0e533f0108eb7361193220010054536928380c", + "fc5cd308050091290040f9280800f90c0200b500fc55d393000014e10300a9e00301aae10309aa22008052L8;FFc21d0094ff0303d1fd7b06a9fb3b00f9fa6708a9f85f09a9f6570aa9f44f0ba9fd83019109604039890e0037f40308aa092040a9f30300aae0c30091028d40a9BBL8;FF19ffff17a0c300", + "d1e1031aaa22008052230080522400805277edff97b7035ef82fffff17a0c300d1e10317aae20313aa23008052240080526fedff97b7035ef8L8;FF2a040091e00315aa6a0a00f909692138e10313aad1faff97770a40f9680240f9080117cbbf0208eb28070054680640f9e10316aae20315aa0001178b0", + "5620094BL8;FF40f9ffb4bfffff17a80640f91a0101eba3100054a80640f91f011aeb49080054e00313aaedeeff97000c003728fc60d3e80900b5200840921f1800f1220a0054L8;ZDBBBL8;FB046746000000000034f6450000000000500000000000000008000000000000006c68460000000000c06846", + "000000000020694600000000002104400000000000L8;FFea1700f909692138e1630091848fff977f0600b180000054e1630091e00315aa6ba2ff97df0600b120b1ff548022029154010014e8031faa000117ab42680054BL8;FF69624039b502000a1f01096be0179f1a211701948866403969664039b50", + "2000a1f01096be0179f1a1b170194886a4039696a4039b502000a1f01096be0179f1aL8;ZFBBL8;FFe82700a9e82300910900009029813f91200440a9e82701a9e8030091090000b029810491e82702a9e34300919f3d0194fd7b43a9ff030191c0035fd6e00700f9L8;FFf30300aae023009129f87fd31f", + "0109eb0881899a090180521f2100f11481899ae30314aa3c150094e80740f91f0500f120010054e80b40f9742200a9f44f43a9L16;FFe1031baaedc340f9e21740f9ee0314aaeb2b40f9e61f40f9f0031aaae90316aaeadb40f9fb0309aaeec300f9e82f40f9f07315a9ec030baaf67b40f9ef7347a9BBBB", + "L8;FB0d010000170000007a1340000000000057000000000000006801000011000000010005b405960378025a0000035007c0037806e8000006f000140378059c0000L8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab230100541e000014f4031faae00313", + "aa080c48f81f0500b1c1fdff54BL8;FFe8a305b9e067813de163813db30700143b008052f4b340f974faffb535008052f6bf40f996fbffb53a008052e8e740f9e98742b9f55307a9f63700f91f0500b1L8;FFe903092a087d60d31b1e48b3298117aaca1e40b3e0431391ec6b02f908e11caae96f02f9fb7", + "302f908010aaaeb7b02f9e87702f9ed7f02f9eceaff97f85b5ca9BBL8;FFa0077cade237803da203d73ca1c302d1e2030091030a8052e32b803de00703ada1037dade217803d3a030191a82735a9e10304ad84f4ff9700e4006fa0833aadL8;FF14520094572340f9b6831ef8b8431fb8f70200b4561f40f", + "90a520094e00317aa2100805203520094800700b4e10316aae20317aaf40300aa06520094582f40f9L16;FF08219f5a081d0072e0ab00541f050071611701548900805228c840f9740a00f96922003909008092690200f9e80000b420cc40f9f30301aae10308aa22008052BBBL8;FFe10316aae20315aa2", + "30080522400805279fdff97760a40f940ffff17e00313aa22008052230080522400805272fdff97610a40f973feff17e00313aae10319aaL8;FFc9000054e0431691e1031aaae20318aa27110094fad342f9fc0740919c830191d7fdff17e04316912200805220110094e1d342f9e3fdff17e0431691e103", + "1aaaBL8;FFa00300540cfc6ad35369283808050091280800f92c0500b5e0030baa3f0108eb20010054290440f90a050091206928382a0800f9f44f42a9fd7b41a9ffc30091L8;FF5a23999a94269f1a87ffff17fa0319aa3400805284ffff17d6020e917f7e00a97f7e01a9c10a40f97f1200f9610000b46", + "10600f9a9000014734e00a9d30a00f9BBL8;FF0825019108fd46d30900088b3a0500915f0308eb4832005401020014e1d342f9e8cb42f91f0101eb408b0054e8cf42f9490a8052f40740919482099109692138L8;FF09214e29e90303b9e80703b9480d40f900013fd6e0e302f9e8074091e1e702f908011", + "891290c40f9e163179120013fd696825839df0a007121050054a8008052L16;FFe1c30991e00313aa026e805211b20094ff831791f44f43a9f65742a9fc5f41a9fd7bc4a8c0035fd645feff90a5c02291e123009182620791e0031f2ae3031faaBBBBBL8;FB7220746869732073657373696f6e207665727", + "3696f6e426f7468206f72206e656974686572206b79626572207072655f6b65795f696420616e64206b79626572L8;FF0a596a786921094a0a200a4a2b5d10534c5d10530b596b7808596c786001094a01010a4af44f43a9f51340f9fd7b41a9ff030191c0035fd6680100b008210091BL8;FFfa6749a9fc", + "6f48a9fd7b47a9ff430391c0035fd620008052e10317aa9e15019420008052e10319aa9b15019420008052e10318aa9815019420008052e10316aaL8;FFe1b34bf9810000b4e0af4bf922008052091a0094571a00b5d5000014091a0094c002805221008052021a0094200a01b428fdffd008e53d91ec074", + "1b20001c03dBBL8;FF74fdffb5eeffff17ff8303d1fd7b08a9fc6f09a9fa670aa9f85f0ba9f6570ca9f44f0da9fd0302910080c53c0180c63cf40301aa083c40f90280c43cf30300aaL8;FF1f0500b14167ff547bfbff1728008052e80b00f9f9d740f9e98b42b9e88f42b9fb2300f9e9230729b968ffb57", + "9fbff17e02fc13de133c13da1fdffb021581e91L16;FF1f0500b1e1000054ff6301f9fc6701f93f7f01a9fc7301f9ff7701f9fff302b9e1030b91a2c303d10aefff97a03500b5e1031faad3ffff17e1031faae8e300f9BBBL8;FF1f0002f1230f00543f0108eb13601932200100542a0440f91f1040f1536", + "9283808050091280800f94202005400fc47d36e000014e10300a9e00301aae10308aaL8;FF8b010b8b2801088b49010b8b0801098b090140b22911c0da291540d2290d098b292501910819498b140500913f0700b1f60f00f9c001005400c30091fa2b0094BL8;FFff830191c0035fd6fd7bbca9f85f01a9", + "f65702a9f44f03a9fd030091130040f9740a40f9680240f99f0208eb80010054680640f9890600910815148b010900a9L8;FF5ffc3ff1290100548102168be003152a0c0d00941f0400b140040054e00200b41600168bf5ffff17a0a300d1e10316aa79010094b45b7ea9b7835df8e20216cbBBL8;FF9f1a", + "00f9808200ad8002803d08db77d3800640ad80020191e103009122008052080d17aae00700ad080dc0da881e00f9820241ade20301ad9a35019488264829L8;FFe83341f91f0900b1606e0054c90080d20900f0f23c4500911f011ceb60810054e8030891e0830e91e3832491000543ad0221c03de8032a9", + "1e4032a9121fdfff0L16;FFe133c23df80316aae86b00f9e8ff5e39e6030991e237c23de0d7803d019080522841082a69914bb8e023c23de10b19ade127c23de22fc23d3b8108aae97344f9BBBBL8;FBf9f6f2e6efd6e4c6d5b6dea6c396c886a176aa66b756bc468d3686269b169006484d41432063616e", + "2074616b652061206b6579206f6620616e792073697a6500L8;FFffa31aa9a80a00f1eeff0ca9f0ff0fa9f8ff12a9faff15a9fcff18a9e0ff1ba9e201005460220091e123019102308052088a00947f0200f97f8a01b9ff430791BL8;FFc002c03dc91240b9f59342b91f0500b1e063813de99305b960000", + "0546063029189e4ff97f3d352a9140200b47622009104000014940600f1d662009160010054L8;FFe0230091e10316aae20314aa2300805224008052fee5ff97f60f40f988ffff17e0230091220080522300805224008052f7e5ff97e10f40f9ea0740f98cffff17BBL8;FF359f40f9284341b9e82b00b95", + "50600b4349b40f90b4a0194e00315aa21008052044a0194e00d00b4e10314aae20315aae00b00f9f52300f9064a0194353b40f9L8;FF000180521d000014280180d20800f0f2081d00d11e0000141f150071000200541f11007141040054280180d20800f0f217000014e00313aa76050094e80300aaL16;", + "FFe87b04f9e83340f9e87f04f9e8f740f9e88304f9e82f40f9e88704f9e8031d9108e107910001803de88340f9e89b04f99c190094e8eb41f9eafb41f9e9f341f9BBBL8;FF0204805224008052e8830239211a00949f07003100260054f4de40a9e2031aaa600740ade00314aae10317aae00705ada50100", + "941f0400f1c1230054f80301aaL8;FF220080520c6a009461e640f9810000b460ea40f922008052076a009461f240f9a11100b460f640f989000014610640f9810000b4600a40f922008052fe690094BL8;FFd5ffff17880240f91f0500b1e10000549f5e00a99f7e01a9977e02a99f5e03a99f6204a99f3", + "e00f9e10314aae20313aa5e090094c00300b5e1031faac6ffff17L8;ZFBBL8;FFe103002ae8430691e00315aa85ceff97e8cb40f98082c53c8182c63c8282c73c1f0500b1e00600ade20a803d200c0054f91300f9f9430691fbe300912083cc3cL8;FF19dd799214194092420100b4e8ab41f9e9af41f900", + "030291e10315aa080102ab2935899ae8ab01f9e9af01f99e250094e0430a91a102198be20314aaf43f0c39L16;FFff8300d1fd7b01a9fd43009129e040f9e20300f93f0500b1c0020054290500913f0102ebe90700f96101005420844cade80300aa226cc03d000400ad20200091BBBBBBL8;FB2f73656e6", + "45f63742e7273006d697373696e672073656e64657220636861696e6d61785f6a756d7050726576696f7573200800000000000070726576696f7573L8;FF080101cb1f0500f1090100546807c05a08682178210800915a0700f1e12700f9c1feff540a000014e0e30091420080522300805224008052ddc1", + "ff97e00744a9BL8;FF40008052e30313aa19faff97810a42a960008052e30313aaf44f42a9f50b40f9fd7bc3a812faff17e00313aa220080520e020094610a40f9dbffff17f50300aaL8;FFa10e0094f56f44a9f95b45a9bf0a00b101030054560400b4bb0000b4e00319aae1031baa22008052031e0094a", + "1035ef8810000b4e00318aa22008052fe1d0094BBL8;FFffc300f960030054e8031faa49018052096828380805009100630091e8c300f9be180094e1c30591f0e3ff9700630091e1c3059193e9ff970e000014e8031faaL8;FF290080d2e82303f9c8048052a934c0f2ea2703f90a078052e07f823dfffb0", + "2f9e80303f9ff0703f9ea0f03f9e81b03f9e91f03f9b9590094e1fb44f9810000b4L16;FFe20316aa0001188b12de00940803168b680a00f9540300b4610a40f9680240f9b51240f91f0101ebc0080054680640f9490380522a040091e00314aa6a0a00f9BBBL8;ZBL8;FF022c8152fb07409121800991f7", + "0300aa192c81527b8309910e7e0094e007409168030291e10316aa00802f91e20314aa030880521b08805275cdff9708908052BL8;FF6002f8b7c8fefff008c10291d45601a9c84e00a9f44f42a9f65741a9fd7bc3a8c0035fd6e10300aae00316aae20315aae30315aae40313aae50314aaf44f42a9L8;Z", + "FBBL8;FF20008052e10314aaa23901942000805281088052a039019420008052c10680529d390194ffc301d1fd7b05a9f33300f9fd430191f30308aae82300919c3a0094L8;FFe10317aae3031aaa0700ff97e8036a391f050071a11c0054e84745f9f74b45f9f85345f9fa5745f9f55b45f9fb5f00f9e84", + "300f9e84f45f9e83b00f9bc0000b4L16;FF6013c83ce8e200912181cf3c2281ce3c2381cc3ce0d7803d0035c03d0843152ae28718ad2181cd3cf7430d912281ca3c2481c73ced0316aae38717ad2181cb3cBBBBL8;FB0000000000000000000000000000000000000000000000000000df35da5e000036c6", + "254cdb64bb4de8820000000036d9c917000000000000000000000000aa62L8;FF8800b172130b00f9080000b90d8e0094c000805241008052068e0094006800b4c8009e52138301a908080079e800be52080000b9131700f9028e0094c0008052BL8;FF8700001448008052e0a33239e8a73239c80080d20", + "800f0f229000014f30300aaa00302d1a4e9ff97e00313aae05306f9e0833291e1feff9021203f9102028052L8;FFe90300f9f9e6ff97884640b829008092745601a9680a00b9690200f9f44f45a9f52340f9fd7b43a9ff830191c0035fd6040e0094c001805221008052fd0d0094BBL8;FF2a01805208a80", + "0a91f0000f9fd7b44a9ff430191c0035fd660ffffb000402a9162ffffb042602b9161088052a549019429244039e00700f93f0900f1a2010054L8;FF000500911f0009eb28dfff5480fdffd000202091b949009480fdffd000803791b6490094fd7bbba9f90b00f9f85f02a9f65703a9f44f04a9fd030091", + "084c80b9L16;FFe76f04a9fb030eaaf03b00f9f21f00f9ed0700f985d4ff97eb0b43a9ee031baae76f44a9ec0318aae46740f9ed0740f9e60316aae33b40f9fe1740f9e03340f9BBBL8;FFf44f17a9fd830491f30308aa084840f9970280d21700f0f21f0500b1a0010054f40300aa004c40f9a8e300d181", + "5240f964680094a8835c381f05007121010054L8;FFe00600adea1700f9000504ad020d05ade90b00f9bc0000b4e0031baae1031caa22008052046e0094fbe30091a80302d1e10316aa60c30291bc0302d1e596ff97BL8;FF3f8001f182fdff5408050051890240f98a0000100b6b68384a090b8b40011fd", + "63f0900b1802400543f0116eb4124005481220091e20313aaca070094f50300aaL8;FFb1ffff17e2031aaa230080525f000094dfffff17f76343a9f96b44a9aaffff17fd7bbea91f5c00f1fd030091f30b00f920010054010000f021a843f9330040f9BBL8;FFe207409120ffffd00004059123ffffd0630", + "0209124ffffd08480059142800991a103805248030039a329019420ffffd00040019122ffffd042c00191e1038052L8;FFe8030bf920fdff9000480f91e80b0bf948fdfff008411691e1833f916300189162008052f5f307f9f6fb07f9e9070bf9e90f0bf9e8130bf9b9e3ff97e1e344f9L16;FF19fcff97", + "e84b42f9e9670e9120f1cf3ce95742f91f0500b1e08f803de92301f9c00b0054e037c13de13bc13df4230991e243c13de92341f9e0431291e00610adBBBBBL8;FB060000000000000000000000000000000000000000000000000000000000000009000000000000000900000000000000283d4000000000", + "002f3d400000000000L8;FF2901084aabb31538abe35538a9c31538a9f355384a01084a6b01084aaad31538aa0356382901084aabe31538ab135638a9f31538a92356384a01084a6b01084aBL8;FF29194a8b29050091280108ab02080054691e40f9090100b4290140b22911c0da291540d2290d098b292", + "5019129fd46d329050091280108aba2060054694240b9L8;FFe31359a9e0830c91e2030c9121008052170c0094e007409161e20191e2830c9100401d91ff050094e8ab4bf91f0900b1813e0054e007409122fdffb042883a91BBL8;FF145601943903138bb9031cf89f0600b1fc0700f9e0030054a8035bf", + "8f42740f91f0119eb40220054a8835bf82a070091a14301d1e0031baa4905805209693938L8;FFeacf42f902f18f3ce803169122b7803d6001803dea5301f9e95f01f9b8eefe97e80356391f050071400c0054282340b8e90f4b79eacf42f9eb075639ec434b79L16;FFc0035fd6f9c30d39390200343f07", + "0071e0010054e8c30d91a90100b029511491e8cb03f960feffb0003c2391e8432d91e1431e91e9cf03f9b6d10094e8ab45f9BBBL8;FF680640f9490280522a040091e00315aa6a0a00f909692138e10313aaf3fbff97770a40f9680240f9080117cbbf0208ebc82b0054680640f9e10316aae20315aaL8;F", + "F0969213828040091f97749f9e8d302f93f0700b1c01d0054002302911b260094080040b20811c0da081540d2080d088b0825019108fd46d30900088b3a050091BL8;FF61e240f9810000b460e640f92200805209f6009461ee40f9810000b460f240f92200805204f6009460220091f30b40f9fd7bc2a86", + "5fdff17fd7bbea9f30b00f9L8;FF007861f881020e91022900913f7822f82300001484020e9180c0208b00c04d391f8c0171a9feff5402e90091c6040011c07c7d93827862f800c0268b5f0000ebBBL8;FFe16bc13de80700f9e807409108810191e2ab843de09b843de19f843da78e00948083c23c8183c", + "33ce85748f9f93348f9e06f833d8083c13ce173833d8183c03cL8;FFe85b05f928fdffb008091e91e95305f9290080d2e86b05f9c80480526940c0f2ea6f05f90a078052ff4305f9e84b05f9ff4f05f9ea5705f9e86305f9e96705f9L16;FFfcfb41f9f4f741f97c0100b40db60094e0031caa2100805206", + "b60094001b00b4e10314aae2031caae05f00f909b600940300001428008052e85f00f9e8db41f9BBBBL8;FB4e00000000000000f904000019000000ef104000000000004e0000000000000001050000140000004d6573736167654c656e6774684576656e4d657373616765L8;FF6b2501916bfd46d36b0d", + "00916c0300348c0140b28c11c0da8c1540d28c0d0c8b8c2501918cfd46d38c05009114000014f5031faaf60314aad30e43f87f0600b1BL8;FFe103129120013fd6fbc342f97f0f00b1e1000054c800805223ffff17e8e322910081cd3ce8d344f97effff17f63f42f92083c13ceae32291e9d742f9f5c742", + "f9L8;FF220080520c060094f3ffff17e86640f9c80000b40805088be00315aa0201805201ed7cd3040600945f0b00f1e0030054f5d24fa9d40200b4b982009104000014BBL8;FFfc6f57a9fd7b56a9ff030791c0035fd6eb6f40f9f86340f93f0400b1ea7b40f9e98740f9ee1341b9e81741b9ed1b41b9ec", + "1f41b9fa5b00f940030054fa0300aaL8;FF8a0000102b6968384a090b8b40011fd6010440f9410300b4000840f922008052f44f41a9fd7bc2a80346001413d041a9880240f9680000b4e00313aa00013fd6L16;FFe03340f9ed2b1fa9eab740f9e99b00f9e9cb40f9fbef00f9fb0304aae4031caaec031ba", + "aeba71ca9eb0302aae98b40f9f91b00f9f9031eaaf20b00f9f20307aaBBBL8;FFe8e3009100c1009189e9ff97e00314aae10313aa022b80520e660194f44f56a9fc9340f9f65755a9f85f54a9fa6753a9fd7b51a9ffc30591c0035fd620008052L8;FF08fc60d3681a00b5080840921f1900f1a21a005401", + "7c0353c11a00343f0800716c0100543f040071600700543f0800716106005481620091e003082ae20313aaBL8;FF3800805206000014e003082ae20313aa430c80529becff9740feffb5a80640f91f0116ebe9090054e00313aaebf2ff97e80300aae00301aa48fd073708fc60d3L8;ZDBBL8;FFa80000b4", + "607e40f901f57ed34200805209260194688640f9a80000b4608a40f901f57ed34200805203260194689240f9a80000b4609640f901f57ed342008052L8;FFd60217cbdf0208eb3501178bd732889a152300a9f7fbffb5f62b40f9f51f40f99600003738fdffb018e3069113000014d7fe45d3e80214ab420", + "d0054e90200abL16;FF60180054f82300910b0000140043c03c2901088b2001803d0043c13c2005803d09810091c86a40b9c93200f91f050031e0160054090500119f02096b09050054" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines8 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines9.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines9.lean index fe7370e06..3a9bf13de 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines9.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseLines9.lean @@ -27,359 +27,251 @@ set_option maxRecDepth 2000000 in set_option maxHeartbeats 2000000 in def sub9 : BinTree Line64 := ckpt_line_tree [ - "BBBBBBBBBBL4;FFc0035fd6fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091170c40f9e80201ab62220054160440f9df2200f1e90316aae3000054df0600b1L4;FFffc30091c0035fd6f30300aae00301aaf40301aae10309aa22008052230080522400805263000094880a40f9e003", - "13aae10314aaedffff17e10300a9e00301aaL8;FF9f1f01948002009000201491871f01948002009000801491841f0194fd7bbda9f65701a9f44f02a9fd030091080440f9330008eb4303005440030054090840f9BBL4;FFe01c00b4e1031aaae20313aaf40300aa8b9f0194fb0a40f9e80240f9fc0700f9", - "7f0308ebe0090054fc0640f9690700917f431ff1e90a00f988171b8b135100a9L4;FFf35341a96effff1701000014fd7bbba9fd030091f55b02a9f50301aa600200b4f35301a9f30300aa20008292e0ffeff23f0000eb88140054f76303a9610e40f2L8;FFffc300d1fd7b01a9f31300f9fd430091130040", - "f9e00301aa810100d021d81691e803009142018052c99f009468e20091810100d021d01391a40100b084c00e91BBBL4;FFf9feffb50f0000141f0400b1217c0054a6df01941f100031a17b0054f9ffff17a3df0194f70300aa1f0400b141fdff54e0430591810080529edf0194807a0035L4;FB2e7273002", - "f72757374632f343861323239636561656664343938356335303939306231343131366236643835366166303938352f6c6962726172792f636f7265L8;FFe00f00f9008140f9e9b300f9093140f9e01700f9008540f9e9ab00f9093540f9e02b00f9008940f9e99700f9093d47a9e02700f9008d40f91b55", - "4ea9e00b00f9BL8;FF21c00991130800f90080813c1fe00039f44f42a9f65741a9fd7bc3a8c0035fd60001805201088052955f0194fd7bbea9f44f01a9fd030091010040f9f30300aaL8;FF1bfdff9795040034a80200320811c0da081540d2080d088b0825019108fd46d308050091d4030034890200322", - "911c0da291540d2290d098b2925019129fd46d3BBBBL4;FF0c00098a42696cfc438c212e6d00669eadc101f2a0010054ae01c0dace11c0da8e0d4e8bce01098acefd0b9b4e010e8bcf015ab8bf020f6b20020054ae0500d1L4;FF00000000000000000000000000000000000000000000000000000000000", - "00000f850001400000000000000000e50001400000000000000000000000000000000L8;FF54000014e00700f9e00301aaf30301aae10309aa220080522300805224008052f4030b2a2f1600946aa240a9e00740f9690240f9e10313aa5469283808050091BL8;FF213029912403009084a02391a3630091", - "82008052b30f00f9ce7f0194ce7f0194fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091L8;FF1f692138d7ffff17e11740f9e80f40f91f0101ebc0810054e81340f9938248f84905805209692138280400917f0600b1e81700f9a0300054802202911cfcff97BBBL4;FF090", - "c40f9f30308aa3f0500b120060054083840f9a80400b4090d8052153440f9b9a300d1177d099bf40301aaf8031faaf6c300913a0340b2bba301d1a08640a9L4;FB64656e74697479206b6579206e6f7420636f6e73697374656e7420776974682070726576696f75736c792d65737461626c697368656420", - "73657373696f6e0000L8;FFfc0b00f9f44f02a9fd030091ffc314d1ff0300f9f30300aa0232805200844eade10313aaf40308aae0071bad00884fade00b1cad01804cade10319ad02804dadBL8;FFe003172ae80b40f9ff0202710801148b43f8ff54daffff17e083c03ce80f40f96002803d680a00f9f44", - "f49a9f73b40f9f65748a9fd7b46a9ff830291c0035fd6L8;FF6b00f8378b0080523a0000142b7c1c534b0a00344d11c0390b00be522b000b0bac1d00128d00f83761710c8bab008052300000144d15c039ae1d00128c1d0e0bBBBBBL4;FF89ffff17e80f41b296ffff17a0031df8210400d021682c912304", - "00d063b82c91a0c300d142018052e400805224000014a0031df8210400d021682c91230400d0L4;FFe20319aae30316aa9ae9ff97e8d344b908540037e86f42f9f87342f9e8c700f9b60000b4e00319aae10316aa220080527b0f0094e3c740f9e0431391e2e30e91L8;FFf50308aae8430091e00313aad0", - "feff97e8834039e007c03d1ffd0371e003803de0020054e91342b8ea2740b9e1430091e003c03de8830039e00315aaa91b00b9BL8;FF080d8052382b40f9547f089b808f0194e00314aa010180527e8f0194601900b4080d8052fb0300aaf4031faa567f089bf7031aaae10318aadf0214eb80020054L8;F", - "F49fbff35e9031faa0a0840f90afcffb5ea030aab23feff54600100d000601291828f0094600100d000e01e917f8f0094800100b000e02e917c8f0094fd7bbda9BBBL4;FF29b10191ca0100b41f010beb080500914a0500d1ed338b9aae7d0c9b2e696eb829c10191df01016be1feff54e80d8092a825089", - "b007103d1c0035fd6e0031faaL4;FBadaeace7eb39784a9e12a28c2bf9abb41e0d428b000097756460c5accfeb824580d679cbd3e4be0fe17bcce884d4d43b935d81b3568b8ad008e9a8379fd5846bL8;FFa801009008c1049129038052e86705f9e80100d008c12591e8a303f9e00100b000fc3691e8ab0", - "3f9e80100d008212891e1032b91fb0302aae3031d9162008052BL8;FFfa6742a9fc6f41a9fd7bc6a8c0035fd6ff4301d1fd7b03a9f32300f9fdc300913f040071f30300aae102005428008052c90200f029c12591ff2300a908048052L8;FFfbc742f9e9db42f9f5cb42f9f7cf42f91f0500b1c082873ce9", - "a304f9801500542083cb3c2183cc3ce9a70c912283cd3ce8bb01f9e863019120f18f3ce9e70c91BBBBL4;FFf44f02a9fd030091690400f0290140f94ad03bd55301098b694240393f05007141020054692a40a9000440ad2b0500916b0200f9eb0300d06b611991017100b9L4;FB7465206b6579696e7661", - "6c69642073656e6465722072617463686574207075626c6963206b657957686973706572546578745f5832353531395f5348412d3235L8;FF160100eb62020054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e00300916ce5ff97f44f47a9f65746a9f85f45a", - "9BL8;FFe00309aae2028052d16f0194f40200d094e2129168a20191e10200d021882b91e0230091a32300d1e2018052e40314aaa8831ff8c76f019468b20191e10200d0L8;FF20460054e8cf42f9090180522a04009109692138e1431691ead302f9140d0094e88f49f91f0500b1c0000054e8074091e143", - "16910881099100e1029137100094BBBL4;FFe00308aa38abff9708fc79d3e0e7076faa8246b88c2e40a9e9031faa010d010e0d1380520e000b8a82696efc438c212e6800669e0fc101f2e80313aaa0010054L4;FFfd7b41a9ffc30091740800143f2000f108018052e02300912180889ae20313aaff0700f", - "9270f0094e803002ae0031faa08010035f40740f9d40000b4e00314aaL8;FFff2307a9e87f09a9ff230aa9e87f0ca9ff230da9e87f0fa9ff2310a9e87f12a9ff2313a9e87f15a9ff2316a9e87f18a9083c8052ff7f02a9ff7f05a9ff7f08a9BL8;FF2961069108400039c80080d22001c03d0800f0f2e9f3", - "5639e06302f91c490091280280520000803dfc5b02f9e85f02f9e86702f9e94313390f000014e033c33dL8;FFbf0317f8b5db39a9b9831af8ba031bb8952f0094e22340f9821500b5e0030191f55b04a9f92b00f9b94302d1fa5b00b98e2f00941f04003180080054b50358f8BBBBBBL4;FF08c040391f0d", - "0071a1010054135042a9880240f9680000b4e00313aa00013fd6810640f9c10000b4820a40f9e00313aaf44f41a9fd7bc2a879170214f44f41a9L4;FF2a15003308111d1200401d91e8431339e8431391eabf1339e037c13de13bc13de0d7853de1db853d10eefe97e0d7c53de1dbc53de007409100401d9", - "1e03f813dL8;FF68fe4ad309088052954e00a90811c0da280108cbe90080521f1d00f10831899a29008052280908aa932201a9f44f42a9f65741a9fd7bc3a8c0035fd620008052BBL4;FF40f0ffb4c1000014bfe336a9bf8317f8e1820191a2e300d14c81ff9760efffb4c9000014bfe333a9bf8314f8e1c", - "20091a2e300d14581ff9780eeffb495000014L4;ZBL8;FFe86b40f9e083843ce183853ce00742ade83700f97f0200f96082863ca00b7ead6182873ce11bc03d6282853ce00b01ad6182883c6082843cff430791f44f44a9BBBL4;FFa8835f38e9b300b8a9035ef8e8c30039e89f0039e8230091e9f300f80", - "9810091a8a73da9c803009008211d91a8831ef808008012ea1700f9eb7301f8eaf301f8L4;FB38643766353665333634356363642f303639353962342f7372632f656e636f64696e672f67662e7273002f636172676f2d72656769737472792f696e6465782eL8;FFe90318aa1f0d0071c00000541f11007", - "1e1200054282540391f050071812000544802009008b140f91f0900f149070054a80100d008c10491e9eb01f9e8ef01f9BL8;FF60c20091f40c0094e87349f9090d00913f0900f123c7ff54080141d2e90080521f2d00f10831899a1f2500f128230054e9020090293114918a0000102b796878L8;FF28fc", - "60d3a81000b5200840921f1800f162110054217c0353811100343f0800716c0100543f040071600300543f0800716102005401e30391a22302d19df3ff97BBBBL4;FFe85b00f9e80240f9e01b803de18b03ad680000b4e00315aa00013fd6e10640f9810000b4e20a40f9e00315aa7cf70194c18a41ade02", - "3c03de85b40f9800601adL4;FB623562353537662f62797465732d312e31322e312f7372632f62797465732e7273002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e2dL8;FF20020037750240f9a80640f9160101eba2020054e80f41b207000014890080d248008052e02300390", - "900f0f2e827003928017fb2e0030091e80300f969edff97BL8;FFe02b40f92200805285770194880700d11f0d00b1a8000054e00319aae1031caa220080527e770194480700d11f0d00b148f5ff54e03340f9e1031aaa69000014L8;FFe1074091e043169102398052218009918b77009488220791d80080", - "5294018052000540ade893687915008092e8e30a79e057813de15b813d99000014e8074091BBBL4;FF6b0d0b8b6b250191691b4b8b37050091e80208ab42100054140500b102230054b400f8b6f5031faae00315aae10314aa88b7019476b70194e00314aa21008052L4;ZDL8;FF16000039e1230091e883", - "00a9800240f9f60f00f91bd2ff97e003152ae123009118d2ff9796224039f50f40f9e80740f9df0a00712d010054df120071cc010054BL8;FF6b25019129194b8b2905009129010aab020400542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b290500913f010aeb29030054280108", - "abL8;FFea5b40f97adf78b3fb031caa4cfd60d3eb032a9117dd78b328008052bf0a00b1752a01f968420e39772e01f9783201f96a6a02b96c6e02b97a3a01f97b3e01f9BBBBBL4;FF2104009021d429912304009063201891e0230091a20180520401805212000014e00700f92104009021d429912304009", - "063082a91e0230091a201805244018052L4;FF0040239189070094fd7bbea9f44f01a9fd030091f30301aaf40300aa7c07009400038052010180527a070094000100b4810000d021c03891144c00a91f400039L8;FF63481891a92300d1460200f0c68019910a018052470200f0e7ec0e91e00308aa22028", - "052e9af00a9c4008052ea0300f9c1070194fd7b42a9ffc30091c0035fd6BL8;FF697e40f93f0500b180020054691241b93f05007161020054691641b9290140b22911c0da291540d2290d098b2925019129fd46d3290500916a8640f98a0100b5L8;FF83870094e00315aa4100805281870094e00700f9e0", - "1000b47d870094e00315aa410080527b870094401000b4f70300aa77870094e00315aa4100805275870094BBBL4;FFe0030291e2008052e400805214000014fa0300aa14000014e04300f9a103009021242891a303009063e01791e0030291e20080520401805209000014e04300f9L4;FB707420666f722", - "0c00076656e646f722f6c69627369676e616c2f727573742f70726f746f636f6c2f7372632f747269706c655f726174636865742e7273001366L8;FFbc0000b4e06f40f9e1031caa2200805283c70094fa031faa762201a9080080927a0600f93ffaff1729008052e96b00f9880100b4fb0308aa75c70094", - "e0031baaBL8;FFf5ff03a92911c0da490109cbea0080523f1d00f129318a9a2a0080521f0008eb560909aa1730889ae0db04a9f70400b4150340f9f60300aa080014eb23100054L8;FFfd7b41a9ff830091c0035fd6010100b021581691c2028052bf470014fd7bbfa9fd030091083040f9080100b408014", - "0b20811c0da081540d2080d088b08250191BBBBL4;FFf40300aaf9e240a9e2031aaa000400ade00319aae10318aa0c0200941f0400f1612f00543f0018ebe2310054080d8052f6031aaa3964089b3a2340f9281b40f9L4;FB0800000000000000e0a84000000000003422400000000000380000000000000", - "008000000000000000caa40000000000088224000000000004000000000000000L8;FFe80301aa00040036883a00b5e1031faab2ffff17c1220191a2c303d158e6ff97603d00b5e1031faaacffff17a2c303d1630c8052e0e0ff97e10300aae0f4ffb4BL8;FFa1db7da9b5831ef83f0015eb09010054e003", - "16aa22008052950200b4e30315aa9a670194f60300aae00600b4e02300919850ff97b30000b4e00314aae10313aaL8;FF690480520a00f0f2e8a716a95a1100d1e10740f9a1e6ffb59efdff17400100b000401191430100b063e00591440100b084201291a24700d1e106805288670094BBBL4;FFe90f41b", - "2e80314aa5100001400e4006ff60b41a9f7830191a0c302d1e30315aae40314aae10316aae00202ade00e803de08303ade01b803db0f2ff97e0864dadL4;FFc81b80d2000080d2620080d2430480d204008092050080d2010000d40d00001440000f91240000b0030440f9069441a9dfffff17060180d2e3", - "1c80d2e50306aaL8;FF5f8300f16081c63c6181c73c690146f8688148f84081823c4181833c600542ade92300f909048052488104f85833899ae00701ad800702ade20342ad820303adBL8;FFf32b00f9fd030191090040393f050071810200540010c03ca9730039a97300910a0000b04a910991800200b", - "000a43791e92b00a9e98300912a0000d04a413191L8;FFf85f0aa9f6570ba9f44f0ca9fdc30191350840f9fa0301aaf30300aa750500b4540740f97a270094e00315aa2100805278270094601800b4e10314aae20315aaBBBBBBBL4;FF618101ad628d00ad5cfaffb520000014090180520801098b292100", - "910801148a206b68fc00a8200e0a00669ecafbffb5f9ffff17200340fd00a8200e0800669eL4;FFfd7b12a9fc6f13a9fa6714a9f85f15a9f65716a9f44f17a9fd83049109304039890d0037010840b9f30300aa150040f9e0230291f40308aabba301d147130094L8;FFfd7bc4a850feff17560014cbd502", - "13ab82050054a9fe4ad30a0880522911c0da490109cbea0080523f1d00f129318a9a2a0080525f0014eb570909aaa0000054BBL4;FF9c031e4afe5b40b9fc621e38fc925e387b031e4afe6340b9fb721e38fba25e3808011e4afe6f40b9e8821e38e8b25e389c031e4afe7b40b9fc921e38fcc25e38L4;ZF", - "L8;FFc0035fd6fd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9BBBL4;FFaedb0194530400b0e80b4091e00b409161ba40f908411b9100c01a91a8db0194e00b4091a80304d100401b91a5db0194c80", - "3009008010391f60b4091000540adL4;FBe8020000050000006661696c656420746f206465636f64652050726f746f627566206d6573736167653a20000000000000000000000000000800000000000000L8;FFebb344a9e87700f9f9fb42a9fc4340f9f74f40f9ef3b40f9e8030aaaea0b40f9e96340f9f", - "6030daaed0307aae72340f9f57b40f9fabb00f9fa0310aaf00311aaBL8;FFe0431691e8036179e143069102738052e057813de0fbc33de15b813de8e30a79e063813d865b0194fc074091f94315919c8301919f0600b1a0050054b8008052L8;FFf44f17a9fd030591e10b00a9480100b0e40b00f908b140", - "f91f0900f1830b0054155040a9f60300aae063009102048052f30303aa81e2009180ffff97886a40b9BBBBL4;FFe00314aa5affff17400340fd00a8200e0800669e0801c0da0811c0da18fd43d3546b7838caffff17000400d000e0159192fb0194ff8303d1e923076dfd7b08a9L4;FB69627369676e616c", - "2d70726f746f636f6c2d613434636635613164633062366666632f6f75742f7369676e616c2e70726f746f2e7365616c65645f73656e6465L8;FF410200b021f41891430200b063441991e08300912202805264008052b3f0ff97e11340f94cffff17fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44", - "f05a9BL8;FF602a40f922008052857b0194742600f9f44f41a9fd7bc2a8c0035fd6fd7bbea9f44f01a9fd030091010040f9f30300aa3f0400f18b000054600640f922008052L8;FF23008052240080523692ff97fb1740f917fbff17e06300912200805223008052240080522f92ff97e11740f91efbff17", - "e0630091220080522300805224008052BBBL4;FF092440f9000109cb1f000aeb48000054c0035fd6fd7bbfa9fd030091800300f000400191820300f042a00191a10280529cbb0194fd7bbfa9fd030091281040f9L4;ZBL8;FFff430591c0035fd6c20100b042e01591c50100f0a5803391e1030191e0031f", - "2ae3031faaf9bb0094c00100f000e03391c30100b063602291c40100f084003591BL8;FF7f0209eb09290054088c48f81f0500b1802000544a030094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb481f0054L8;FF20013fd6f6eb41f9df0e00b161000054680", - "08052e5030014e8830d9179d241f9f5530aa91ad14778189147b8e8f341f9f7634f39fc7f4f39f4fb41f9e86300f9BBBBBL4;FF680a00f9889640f91f0500b1a0090054610a40f9680240f91f0101eba01f0054680640f9964241b92a040091959e40f9490e80526a0a00f909692138b6020034L4;FFa0c3", - "00d1e103152a54030094b5937da9810000f021083091a04301d122028052e30315aa04030094a14301d1e2030091e00314aab0e6ff97a1035df8810000b4L8;FFa8d35ef8a9535ff8884200f80800801289c200f8880200b9f44f45a9fd7b44a9ff830191c0035fd6690080520300001469008052c104805", - "2e08700a9e1230091BL8;FFfd7bc2a8c0035fd6f40308aa958b0194e80314aa29008052610600f969420039f0ffff17fd7bbca9fc0b00f9f65702a9f44f03a9fd030091ffc30ad1282440a9L8;FF61ffff54e8031faae9031faa8a060091ea1300f91f0308ebe00000544a6b6878081100915f21296b2905", - "009140ffff54670300143f1300f1f93300f9ed060054BBBL4;FFe1031baa93cb0194e80316aaf60301aaf41f00f9e80700f928008052fad70429db0300b4e82b40f9f403192af903172af80f00f9f8031caafc0316aa171540f9L4;FB08000000000000000800000000000000d8f44500000000000000000", - "00000000008000000000000000800000000000000840c4600000000000000000000000000L8;FFe25f813d6283c73cfabb42f9e077813d6083c23ce163813d6183c33c5f0700b1e81303f9e27b813de067813de16b813d404900546083c43c6183c53c6283c63cBL8;FFe80302f9e8830a91c00200b000e8", - "1d91e90702f9090000f029d12d91e80b02f9c80200d008210091e90f02f949048052e82719a9e1031091e3430691e8271aa9L8;FF4a0d0a8b4a2501914afd46d329010a8b290500913f010aeba9010054200108aba2000054fd7bc1a8c0035fd6e00308aba3ffff54000100d000e00e917b4b0094BBBBL4;", - "FF080900113f01086bc2000054480080520858012928008052080000f9d3010014e00300f9e00304aaf80303aaf70302aab3c30094e803009008010391fa0300aaL4;FB652070726573656e7420666f7220746869732073657373696f6e2076657273696f6e426f7468206f72206e656974686572206b796", - "26572207072655f6b65795fL8;FFfd7bbca9f85f01a9f65702a9f44f03a9fd03009148008052f50301aae10302aa000d002af30302aacaebff97b73240b9b70c0034e80240b20811c0da081540d2BL8;FFa0831cf8e10200b021483191e30200b0632422910f000014a0831cf8e10200b021483191e30200", - "b063401891a0e300d182038052040180521d000014e10200b0L8;FF40030035e003c03de80b40f96002803d680a00f9fd7b43a9f32340f9ff430191c0035fd67a6b0094c000805221008052786b0094c00200b4a8cc875289c78d52BBBL4;FF8fab0194e00317aae10316aa2200805283ab0194e8ff4039f", - "703082a08088052020117cbb60202ebe3f9ff5417020034e8030091e10314aa9802028b0001178bL4;FF0a340d5308690baa0b1c015308710aaa09017cb22811889a7f021f7269067792ea179f1a3f0108f14901332aea079f1a3f01007269010c0a0b010aaaea138a1aL8;FFa80200f98eab0094b38a01b", - "9e10314aadbffff17e91f40f948008052e0830791f30301aa28210039280100f9b4a5ff97e10313aad2ffff17e0230191f40301aaBL8;FFa08302d1e103182ab58302d101dcff97c8fffff008d12d91490200f029c10491e8c702f9e8ffffb008710c91e9d702f9c9048052e8cf02f9e8632291800200b0L", - "8;FFfb0309aaa1035df8415200b595020014a8035df808011acb1f0308eb886f0054980200b4a8835df8e10319aae20318aa00011a8b822b00944803188be00319aaBBBBBBL4;FFe10308aa220080522300805224008052f4030caa96060094e10340a9ec0314aa2aa040a9290040f90bfc63d3536928380", - "8050091280800f9cbfdffb43f0108ebL4;FFe2eb44b99f0900b1010b0054e87b42f9e2c700f9a30000b063d83391f77f42f9e0431391e1031aaae2031caaa4018052eabf00f9f9031aaae8af00f94ef5ff97L8;FF8a130194600200b000a02f9187130194600200b000e02e9187130194600200b00000309", - "181130194600200b000e02d91811301943f4000f1c10000540000c03dBBL4;FF220080523a031c8b85930194f90740f928031acbfa0f00f91f7d00f128e8ff54e0230091e1031aaa0204805223008052240080528e86ff97f46b41a939ffff17L4;ZDL8;FF080d088b0825019108fd46d315050091681a40", - "f9080a00b4080140b20811c0da081540d2080d088b0825019108fd46d316050091770a40f9570900b4740640f9BBBL4;FFe083009177c90094a1835df8e10000b4a8035ef8f40300aa22008052e00308aa7fd30194e00314aae01300f9a10300f021982a91a30300f0633c2b91e0830091L4;FB5e8bd2aa0", - "00067bc8ee267ce5d4bcb6e039a74ec24e695ad626d6783b22610fd8b1b3c336a5c5bf0b0d63457fe50060b7f2293c8f8827ee26b3095cf142703b1L8;FFe92311a9f90306aae6031baae9e342f9eefb00f9ee0310aaf1a34ca9f00305aaf5a70fa9e5a74da9e1030eaaf50314aae9ab18a90a008092e903", - "1eaaeb2b0ea9BL8;FF62640054e1431691310d0094f90b40f91f0700b1e00b0054e1d342f9e8cb42f91f0101eb00400054e8cf42f92a040091c02202914901805209692138ead302f9L8;FFe02b833de12f833dc82c0036e8830291e02bc33de12fc33d13210891e0a350a9600600ade17740f9e20313aa2", - "3008052081940f900013fd6e06b01f9e8c31791BBBBL4;FF21442391e30300f063b42391a0e300d12202805224018052b4e80094b4835cf8b4ffff17c80600d1090080921f0d00b1697200a908f8ff54e10316aa94000014L4;FB7369676e65645f7072655f6b65795f7075626c696320697320726571756", - "97265647369676e65645f7072655f6b65795f7369676e617475726520697320726571L8;FF635c1491e003009142018052840080521a000014210200f021c81b91230200f063f41491e00300f9e0030091420180524400805211000014c80080d2e0230039BL8;FFb6031df805000014e80b41b2a0031df8", - "02000014280f0091a0e300d1a8831cf870690094f60300aae13b40f9f4d748a93f0400f18b000054e03f40f922008052L8;FF810000b4e09349f92200805284730094e19b49f9810000b4e09f49f9220080527f730094b30000b4e07b49f9e10313aa220080527a730094e18349f9810000b4BBBL4;FF83b", - "30194000480522100805281b30194c00200b4e08740ad0802805209048052685a00a9682601a9880a40f9000400ad8002c03d754a00b9602602a9600e803dL4;ZBL8;FF41020054f50302aaf80300aaf7031faae8031faa1d000014f6031faa0001805299eeffb5f80300aaf5031faaf7031faae9031faae", - "8031faa14000014e20308aaBL8;FFa0077eada8035ef8f3cf45f9e88306f9e8c745f9e03b833da00b7cade13f833d7f0208ebe02b833da0077dade22f833de137833de033833da1efff5400230191L8;FFe80b41b2c9000014c80080d20800f0f2080500d1c5000014c80080d2e0232a39e0032a910800f0", - "f2ff272a39e84305f96c29ff97e10300aae14305f9e0032a91BBBBBL4;FF298fedf2ea8decf2080008ca090009cae08702a9e8a700a928000aca6aae8cd28a2eaff2e0230091ff7f04a94a8cccf2ff1f00f9aa8ceef229000acaa1730091L4;FF7f250071eb031f2a080100544a0500d18dfe07360500001", - "4e9031f2a287d60d388550036eb031f2a7f05007141300054ef2300f9fc031faa1900f0d2e12f00f9L8;FF8703019460220091f30b40f9fd7bc2a8bbfdff17fd7bbea9f30b00f9fd03009101c840f9f30300aa810000b460ce40f9220080527a03019461d640f9810000b4BL8;FFe82702a9e3430091a283", - "0194fd7b43a9ff030191c0035fd608200091200440a9e92300910a0000b04a411f91e8a700a9220300b0426c2c91ea0f00f9e3430091L8;FF410100f021281a91e80300f9e8230091e00309aac2018052bc830094620100d0428038911600001408200091410100f021d81691e80300f9e8230091e00309a", - "aBBBL4;FFe0630591e1a30a91022a80528cc3019460820091e1630591022a8052755200a9776201a986c3019449000014e0c302f9f6bf02f906000014e80b41b2e2c302f9L4;FBf26449000000000054000000000000007900000005000000f26449000000000054000000000000007f00000005000000f2", - "644900000000005400000000000000L8;FFeb831d91f7430d91ed031baa681142f869d140786091c33ce1f7c13de2efc13de3fbc13de8bb01f9e8c743f9f4031aaae0d7803de0f3c13def0314aae87202f8BL8;FFc102009021200a91c302009063080b91e0230091a200805284018052b3380094e00740f", - "941feff17c80080d20800f0f20809009147ffff17fd7bbda9f50b00f9L8;FF2007c03de9b341b92143c23ce8c741b9a6000014080100b00881029169038052d0feff17eaa759a9e8430f912083c13c2183c23c2283c33c2383c43cfa9741b9BBBBL4;FF1803008bf9feffb50f0000141f0400b101fc0054a", - "5e301941f10003181fb0054f9ffff17a2e30194f70300aa1f0400b141fdff54e0430591810080529de30194L4;FB383961626364656653657373696f6e53747275637475726570726576696f75735f636f756e74657270715f726174636865745f7374617465496e76616c696450L8;FF8fe30094fa4340f", - "9e8b345f9e0d7c23df40300f95f0f00b1e80f00f9e8079f1a9f0600b1e083803c60090054e9a340393f03096b430900545f0f00b1000e0054BL8;FFfd030091350840f93c5040b9f30301aaf40300aa950400b4770640f97c630194e00315aa210080527a630194600600b4e10317aae20315aaf60300aa8", - "0630194L8;FF23100054e81f40f9e10315aae20317aa0001148b8a630094e90344a9080009eb630e0054ff0208eb68080054340117ab420e0054f42300f9090740f9280117ebBBBL4;FFe92200d16b0240f90801098a6801088b0a210039ff0219ebf706009180020054680240f9096977383f01027141ff", - "ff54e90337aa9822099bb3ffff17682640a9L4;FF20486038f55b42a9f76343a9f96b44a9fd7bc6a8c0035fd6c302109161c0218b23c04d3903fdff346304005123c00d39f35341a9fb7345a9e5ffff17f35301a9L8;FF00c01a9189a30094800100f000c0129186a30094fd7bbea9f30b00f9fd03009101", - "0040f9f30300aa1f1800f93f0400b140010054810000b4600640f922008052BL8;FFffc30091c0035fd6e90740f9690600f97f020039fd7b41a9f31340f9ffc30091c0035fd609004039e80301aa8a0200b04a150091e00308aa620080523f010071BL4;FF17000014e00313aae5020094e80300aae80700", - "36e00301aaf44f45a9f52340f9fd7b43a9ff830191c0035fd68000805206000014e00313aad9020094e80300aaL3;FB00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000051e57464060000000000000000000000BBBBBBBBL4;FFe5ff", - "ff17ffc302d1fd7b05a9fc6f06a9fa6707a9f85f08a9f65709a9f44f0aa9fd430191170c40f9e9830091e22702a9e80201aba20f0054160440f9c9060091L4;FFa8e35d38a9c35d783a008052aa835db8ab735f38bcf35df82841082aa9f35ef8b6735ef8ebe300395b8108aae91b00f9570100b50d00001", - "4a003df3cfbfe48d3L8;FFf44f42a9f65741a9fd7bc3a8c0035fd6f6031faae00316aae10313aa8d1d019408fcdfc8080940f91f0500f1e0179f1ac0035fd6e0031f2ac0035fd6fd7bbba9BBL4;FF000200541703088b94a2009158018052560800b4818a7fa9c80600d1f8020039160102eba3070054e00", - "60091946200911700028b829d01945a6300f1a1feff54L4;FF820000b4010000394200083681e01f78c0035fd60000803dc200303780009f3c620028360004803d80009e3cc0035fd60004803d000001ad80003fadc0035fd6L8;FF21301d91e823009122028052d09d009488820191810100d021481491a", - "40100b084600991e0230091a32300d1a2008052a8831ff8c79d009488c20091810100d0BBBL4;FFe043059181008052aadd0194003c0035e85341b9e82700b957ffdfc8770000b5a3dd0194f70300aaff0600b180020054f843059199008052e00318aae10319aaL4;FB616c6964206c656e6774683a2065", - "787065637465642031362062797465732c20666f756e6420c00027696e76616c69642067726f757020636f756e743a206578L8;FFe3ef40f9f7af40f9ee4740f9fbdf40f9f19740f9fa1351a9e86b40f9e9eb03f9e1031d91e07f04f9e0430f91e20319aae8a703f9e8fb40f9eea303f9e8ab03f9BL8;FFe", - "83f49f99f0600b1e04f823de8a304f9c0120054f8432591fc074091a182009100830091027080529c830191f9431591835d0194e8a344f9e04fc23d890a00d1L8;FFb7ffff17e00313aa220080526d010094610a40f9bfffff17e00313aae10316aae20314aa67010094760a40f9680240f9080116cb9f02", - "08eb69f8ff54e00313aaBBBBL4;FFf44f06a9fd8300910960403909140037150040f9f30300aae2030091165c4229a00645a9f40308aaf65f0029e7f9ff9718fc79d3e0e7076fea031faaa82643a9L4;ZFL8;FFc0035fd6e20313aa030c8052eaf6ff97e10300aac0feffb5a80640f91f0116eb69030054e", - "00313aa39fdff9700fe073728fc60d3c80300b5200840921f1800f1BL8;FFffc30091c47d0114092000912103009021c43391040300d084601291a9831ff8840000140920009121030090216037912403009084e03691a32300d1e00308aaL8;FF02720054e1630091d27dff977f0a00b100040054e11740", - "f9e80f40f91f0101eb40500054e81340f92a040091e00315aa49018052ea1700f9096921385afbff97BBBL4;FF1f0900b1a1020054350080528800805229008092745601a9692200a9f44f4ba9f55340f9fd7b49a9ff030391c0035fd6e083c03ce183c13ce283c23c600600adL4;FB8e010000050000004", - "086490000000000110000000000000098010000050000002e626173652d6b657973626173652d6b65797300000000004086490000000000L8;FF000480522100805282bd0094200400b4c00641adf70300aa610e40f9000400ad810000b4601240f9220080527cbd009408048052e00316aa010880522200", - "8052BL8;FF0811c0da081540d2080d088b0825019108fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8bL8;FF440080521a000014a0031df80101009021a400910301009063cc0091a0c300d1420180524401805211000014c80080d2a", - "0831d38a0c300d10800f0f2bf931d38BBBBBL4;FF240080529a000094610a40f97cffff17e00313aae10317aae20315aa230080522400805292000094770a40f9680240f9080117cbbf0208eba9efff54e00313aaL4;FFe23f813d62ebff97a90000140a0180d2e9675339e8031faa0a00f0f2eaaf00f906", - "000014090180d2e8031faa0900f0f229017fb2e9af00f9291d00120afd60d3L8;FFeb6301b8ebc341f8ea570039ea6b0039e9b301b8ea7f0039eb1300f9e82b00b9bd0d0194fd7b44a9f32b40f9ff830191c0035fd6ff0301d1fd7b02a9f31b00f9BL8;FFa00900b4e10314aae20319aaf50300aa8b8d019", - "4572340f9b6831ef8b8431fb8f70200b4561f40f9798d0194e00317aa21008052778d0194800700b4e10316aaL8;FF080c45f81f0500b18002005488f2ff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab23010054BBBL4;FF240080529a", - "c0ff97e12740f9e00313aaabfeff17e0e3009122008052230080522400805292c0ff97e12740f9b3feff17f30300aae0e300912200805223008052L4;FB9daa2c3f52493c29d65aa68e00000000000000002d1a9e71c85c02bc000000000000000000000000000000000000000000000000b04f05e1a671d", - "b1a0000f740L8;FFe083c03d69ce01f968d201f960ee803dff074091ffc30091f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd688018052e92b5ba9e87300f9BL8;FFe8ef01f9080480520800ac72810101ade80b02f9e8430f91fff301f9e80302f9e90702f93f2a0094a0420035fb", - "ef41f9e6f341f9e8430691e32b40b9fceb41f9L8;FF542340f9b4031df8b40100b58200001436008052571740f917fcffb538008052482740f91f0500b121fdff5419008092542340f9b4031df8f40e00b4080d8052BBBBL4;FF5250009482ed0194000480522100805280ed0194c00100b4e00741ad0804", - "8052e80300a9e2030091e103142ae80b00f9000400ade00313aab8390094f44f45a9L4;FB206b657970726f746f62756620656e636f64696e672077617320696e76616c69646e6f206b65792074797065206964656e7469666965720e626164206b657920L8;FF9ffe05a997fe06a981220191e20313aada", - "efff97400900b5e1031faad6ffff17e10314aae20313aa55ecff97a00900b5e1031faad0ffff1781620091e20313aaBL8;FFa8040054da06003428631b9b1c1140b989031a0a8a03170a3f0100712907009140115c7a20fdff543f0d00f14003005428611b9b290b00911c1140b99f031a6aL8;FFe043169", - "1220080526e110094e1d342f92dfaff17e04316912200805269110094e1d342f98ffcff17e04316912200805264110094e1d342f95efdff17e0431691BBBL4;FFa00301d1f6030caa4941092a2a231caa08c11baab78209aa580108aaf5030baa6e96ff97a88355b8a9c35578e083ca3ce183cb3ce283cc3", - "c77ca00b968ea00b9L4;FFe0000054e80b40f9742200a9f44f43a9fd7b42a9ff030191c0035fd6200020d4ff4301d1fd7b02a9f65703a9f44f04a9fd830091f30300aa820400372a004039L8;FFd6ffff1748074079a0831f78e0430091a12300d1fc430091e8230079bdccff97df0a00f1830b005488061", - "68b54034079f303002aba0100b05a832191d60600d1BL8;FF942d01942000805221028052912d0194fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff032ed1f30308aaa83340f98a0200d04a213c91L8;FFf4e342f9e80240f9680000b4e00314aa00013fd6e10640f9810000b4e2", - "0a40f9e00314aa7e2d0094df0a00b100960054df0600b1f7030291a0020054e0820391BBBBBBL4;FF680640f9e10315aae20314aa0001178b8b150294e802148bb502148b680a00f9081340f9e00316aae10315aae2031faa00013fd6e0031faaf44f4da9f6574ca9L4;FFe233813de2ebc53de11b813de1", - "07c63de013813de003c63de223813de2ffc53de10f813de1f7c53de00b813de0fbc53de31f813de207813de1831fadea2b02f9L8;FF01010054080c40b909144079284108aa29008052e903092a202108aac0035fd6e9031f2a202108aac0035fd6092840290929002909200091090500f9c0035fd6BBL4;", - "FFe10316aa939501941f090071e11d0054080180d2e9de78920800f0f2080140b2ef000014f36b00a9f30300aaf61e00b477950194e00316aa210080523b008052L4;ZBL8;FF69240054080c47f81f0500b1201d005487faff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b0805", - "00911f0109ebe81b005414010014BBBL4;FF8a0340f9f51740f94801088b882700a9a8fe60d3e83a00b5a00a40921f1800f1023b0054a17e0353213b00343f080071ad0100543f0c0071000400543f100071L4;FB5500000000000000bf01000021000000611c4900000000005500000000000000d601000", - "019000000611c4900000000005500000000000000f601000021000000L8;FFea0300aae00312aaf20304aae0f3803df9030faaed0317aaef031eaafe0310aaf0030aaaea0314aae40308aae8030eaaee0311aaf1031baafb0312aae31340f9BL8;FF080d088b0825019108fd46d30900088b3a0500915f03", - "08eba82400546e010014e1d342f9e8cb42f9f6074091d68209911f0101eb807a0054e8cf42f92a040091L8;FFe0dfc13de1e3c13de2e7c13d7f0208ebe02b833de12f833de233833d6190ff54e0631791788cfe9780fcff1721010054810000b4a01240f92200805278550094BBBBL4;FF090d40f9e84300", - "9120013fd6e80b40f91f0d00b181030054880200f9680080522c0000146006c03d775a40a9f50301aae003803d76f501940005805201018052L4;FB6579697465726174696f6e0073656564537071724b657973536565644e6f6e65536f6d656e616d65000000005a65726f696e64657850656e64696e675", - "072654bL8;FF000100543f0c007100fdff54e20313aa230c8052e8eeff97e10300aae8ffff17888241f81f0500b1810000549fde01a99ffe02a997fe03a981620091e20313aaBL8;FF1f0500714c04005428050035e90f41b230000014e99340b8ea0f40b9e093c33ca91b00b9e92341b8aab301b8ea2f40", - "79e90300b9a91b40b9ea0b0079ea234079L8;FF6b11c0da6b1540d26b0d0b8b6b2501916bfd46d36b0d009135000014eb031faa3e000014f3031faa0901098b0a0e8052f4cf42f9210108cb00510a9b33110094BBBL4;FF6223c03d624f803d608708ade00743ad608706ade00b44ad608b07ade00742ad6", - "08705ad40570094a10303d1e00316aae20317aa82b50194608744ade80b40f9L4;ZDL8;FF3f010aeba8831ff808098052ea338a9a29010acb0a0e8052292d0a9b0a0480522a6100a92a2101a9377d02a93f3100b92ae903a92aa104a939fd05a93f6900b9BL8;FFe00319aa2100805282350194e0fd00b4e", - "10314aae20319aafb0300aa88350194f4e340f9f61b00f9b40500b4f30700f9f303152af5031aaafa0317aaf703182aL8;FF0001803d8007c03de9e701f90005803d800bc03d0009803de86340f97b6300915a0700917f0308eba070005400e4006fa8220591fc032a9169ab40a9ff9304f9BBBBBL4;FFe1", - "0313aa8ba60094c80240f9a90640f9e21bc03de00742ad08251a9b0801188b000502ade00740ad0219803d000500ade00b41ad000901ade80240f908050091L4;FF0001168b8e050094c802148be80f00f91b0200b4e10f40f9ea0740f95f0101ebc00d005428040091e90b40f92b0580524a0108cbe80f0", - "0f95f1d00f12b692138L8;FFa80000b4607e40f901f97fd34200805283050194688640f9a80000b4608a40f901f97fd3420080527d050194689240f9a80000b4609640f901f97fd342008052BL8;FF08008092e18301ade00b803d808600ad882600a9b90000b4e0031aaae10319aa220080527e850194b8", - "0000b4e00317aae10318aa2200805279850194b50000b4L8;FFe20318aa730700918d850094e0031aaae10319aae20317aae30315aae4031baab9d7ff97bf0213ebfb0313aa61feff54a8e301d1e0031aaae10318aa000dc03dBBBL4;FF2925019129fd46d32905009102000014e9031faa280108ab22160", - "0547f0600b1a0150054690240b22911c0da291540d2290d098b29250191691a498b29050091L4;FB9e6149000000000056000000000000003f000000270000006d697373696e672073656e64657220636861696e00000000f5614900000000003400000000000000L8;FF699145b8e22fc23de417c23de00", - "717ade02bc23de10fc23d3b8108aae97344f96b1147f8e00b18ade213c23de00bc23de9a301f9e31fc23df6cb43f9e18b14adBL8;FF290040f97369283808050091280800f920fcffb63f0108eb400300546a6928380805009120008052290040f9280800f93f0108eb20010054290440f90a050091L8;FF", - "89c78d52e9cdad7208080079c8008052090000b9680200a9680a00f9fd7b43a9f32340f9ff430191c0035fd6000100d000c01391030100d063600c91040100d0BBBBL4;FF7f4a0039680600f92802805268220079480080527f5e00397f3201b8680200b9f44f44a9f51b40f9fd7b42a9ff430191c0035fd", - "6e20300b042603191e00301aaL4;FBc0002f636172676f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f70726f73742d302e31342e342fL8;FF63141b91e0030b91a2008052c40080523bffff17210200902168189123020090636c1491a0831", - "1f806000014a08311f8210200902168189123020090637c1491BL8;FFc0035fd600018052010380529c650194fd7bbea9f44f01a9fd030091f303012af40300aa7a650194000280520101805278650194200100b4140000f9e10200f0L8;FF745a45a9f60000b4f50314aae00315aaff000094d60600f1b5", - "a2019181ffff54682640f9c80000b4090d8052e00314aa02018052017d099b79650094617e40f9BBBL4;FF30000014e99340b8ea0f40b9e093c33ca91b00b9e92341b8aab301b8ea2f4079e90300b9a91b40b9ea0b0079ea234079691200b8a9b341b86012833ce00741adL4;FFe31000129f02036be9104", - "0d38d000054000080d21f000039007d20d4631a40b96324d41a83000036000080d21f000039007d20d4631e40b96324d41a83000036L8;FFb50000b46002148be20315aa8ca50094e80316aa8902158be90f00f9e083c03ce90f40f90001803d090900f9f44f45a9f65744a9f85f43a9fd7b42a9ff830191", - "BL8;FF5f150071e1060054298400d13f8100b122070054490500b4ea0200904ab140f95f0900f1c3040054ff8302d1fd7b08a9f44f09a9fd030291e90300f9e9030091L8;FF41031b8be20316aaf6ff0739f60306918b250094e8ff47391ffd007128010054e00743adc902088b08011a32200500ade00b4", - "4ad200901ade8ff07391a000014BBBBBBBL4;FF290dc0dae08302ade01f803de013803de007c03de10bc03de20fc03de303c03d8302803d820e803d810a803d8006803de017c03de11bc03de21fc03de313c03dL4;FF87190094e15740f9810000b4e00315aa2200805282190094e00b41ad28008052e107", - "c03d975a00a99a6e01a99c1200f98282823c8182833c8082843c68320039L8;FF335040a9f90300aa610200f021402091420080529c0e40f9e00313aa80033fd6600000362000805253000014380740f9980900b4390340f9770200f0f74a2091BBL4;FFe0179f1aa0990194e8334039291340390a03000a", - "5a030a0a1f01096be0179f1a99990194e837403929174039f803002a1f01096be0179f1a93990194e83b4039L4;ZFL8;FFf30300aa5f0401f1960100b0d6822e91e08303ade08304ad82000054e0c30191879900945d000014c00640ad48fc46d3e9c3029157e07a925414409220010191BBBL4;FFe9a340", - "b868260039ea1f4079eb834039ec1340f87f020039a91b00b969a200b8e92341a9aa3b00796b8200396c1200f86a1e0079692201a9fd7b43a9f32340f9L4;FB6f2d72656769737472792f696e6465782e6372617465732e696f2d313934396366386336623562353537662f62797465732d312e31322e312", - "f7372632f627974L8;FFe87700f9fe1b40f9e96340f9e86b40f9f1d300f9f1031baafb0312aaab0b0014082340391f090071808700541f0d0071a19e0054f7030caa3600805239040014BL8;FF29fd46d32905009104000014f4031faa64000014e9031faaea8b92b92a0100344a0140b24a11c0da4a1540", - "d24a0d0a8b4a2501914afd46d34a05009102000014L8;FFe8e30db948008052e9f30db9e99f40b90801981af49706f91f01096be83f40b9f7cf06f9f7d706f9f5b70db9f3df06f9f8eb0db9e8f70db9410a0054e39348a9BBBBL4;FF20013fd6e80340f91f0d00b181030054880200f9680080522c000014", - "795e41a9f50301aa76a64039781240f978f90194000480520101805276f90194600500b4L4;FB69676e616c2f727573742f70726f746f636f6c2f7372632f67726f75705f6369706865722e7273001753656e6465724b657920646973747269627574696f6e20L8;FFe18340ade18307ade28341ade28308", - "ad002300b4e87b40f91f0500b160000054e0c30391abf7ff97e8bb40f91f0500b1201400542003029142f5ff979e000014BL8;FF010300b021602191e8230091e00309aaa2008052ce790194140300f094a22391010300b021742191e0230091a32300d142028052e40314aab3831ff8c5790194L8;FF60f", - "18f3c8a0000102b7968784a090b8b40011fd603e4006ff6c744f90083c03c0183c13c0283c23ce007409100c0359101088052f6ef07f9e0fb863de1ff863dBBBL4;FFe2e7076f218c222e21a8302e3100261e910500375f2100b1603200544a210091f32b40f9fa2f40b9fc1b40f9500110abe3faff548f0", - "10014f80a40f9e91340f9L4;ZBL8;FF8b010b4a6001002a61ffff5487120094e17342f9fa03002a810000b4e0031caa220080527eb900945f1f0072f4c30791c00a0054e0031baa0104805222008052BL8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb69010054000114abc20", - "00054f44f41a9fd7bc2a8c0035fd6e00314ab83ffff54a00200d0L8;FFe8430f91f89f04f9faa704f9fbab04f9ea93fe97e8434f391f050071c1310054fcef41f9f7f341f9f5f741f9f8fb41f9faff41f9fb0342f9b60000b4e04340f9BBBBBL4;FFe20303aa51f3ff97602900b4210400b021a01f912304", - "00b063fc3491e00700f95f000014e10300aae003022ae20303aa46f3ff97002800b4210400b021a01f91L4;FFc1030054e80f40f9160101f1e20400547f090094c0018052210080527d090094800800b4880000f008bd3491ca018052090140f98b0000f06b4d3491e02b01a9L8;FF202040a96102009021", - "400a91030d40f982058052fd7b43a9ff03019160001fd6a92300d1086000916202009042640191e02700a9e9030091200440a9a8831ff8BL8;FFa8835cb8480d0037a8835df86a0340f9490108ebc33000548a0340f9b8035df84801088b880300f9690300f908ff60d3680a00b5000b40921f1800f1620a", - "0054L8;FF6c0e04534a01140aedc3971a6e1205536f160653495a69784a010d4a6d1a07530b7c8b0a6c7c8c0a8e7c8e0a0821094a690a0353af7c8f0acd7c8d0a701e0853BBBL4;FF80320a9b021109cb87c90194740a00f9f44f41a9fd7bc2a8c0035fd6092840a9eb0309aa090100f929010a8b608540f", - "c0a0c40f9290500910088202e09a901a9L4;FB6a00000000000000090100002e000000d5184900000000006a00000000000000b00000002e000000000000000000000008000000000000000800000000000000L8;FFd40400143f0700b1e0010054f90000b4e0031caae10319aa22008052f50309aa7fc90", - "094e90315aaf70000b4e00318aae10317aa22008052f50309aa78c90094BL8;FFf65701a9f44f02a9fd030091010040f9f30300aa810000b4600640f9220080527f490194610e40f9810000b4601240f9220080527a490194611a40f9810000b4L8;FF080500911f0109eba808005450000014f3031faa08", - "0c47f81f0500b1c1dcff54e8031faa080113abe3070054000100d000401b917d490094f3031faa088c48f8BBBBL4;FFe30317aae40316aaf2fdff97e85b42a9f76f43a91f0500f1a100005408008092b76e01a9a85a00a955000014e0830091e10314aae2031caa23480094e86742a9L4;FB790000000000", - "0000080000002600000062a248000000000072000000000000001100000026000000e41f40000000000018000000000000000800000000000000L8;FF2400805237000094770a40f995ffff17e00313aa22008052230080522400805230000094610a40f99cffff17e00313aae10317aae20315aa2300805", - "224008052BL8;FFe8031baaa0f6ff5424000014210800d100080091da690194e003003708fc60d31601162afc031aaa19f6ff3418000014ab688ed2082440a98b2eacf20a1040b9L8;FF1f0b0071a1070054faa359a92083c13c2183c23ce00600ad808601ade8b700f9bc0000b4e0031baae1031caa2200", - "80527b6900945f0b00b1c1f2ff548082c23cBBBL4;FFe93300f9e9670ba9fb6300f9e0838c3ce86f00f9782d0094080400b142380054142400919f0208ebe3370054b400f8b6f7031faae00317aae10314aa85a90194L4;FF2e318b9acaf17dd350157bf2e0fdff54b001108bf1030daa320240a9220e41a", - "9318200913f0210ebe40332aae50320aae60322aa84fc47d3a5fc47d3c6fc47d3L8;FF2200805286a90094a1aa40f9810000b4a0ae40f92200805281a90094a1b640f9810000b4a0ba40f9220080527ca90094680240f928f3ffb5ff030791f44f45a9BL8;FF480001aba2020054010840a9f30300aae023", - "009129f87fd31f0109eb0881899a090180521f2100f11481899ae30314aac8010094e80740f91f0500f120010054L8;FFe23f40f9a34301d10081c03ce8ff47f9a5c300d180008052e10314aae40315aaa8031ef8e8074091f607409108011891a0039d3cd6021891cb52fe97e0074091BBBBBBL4;FFa826", - "00a9680240f9080540f9180100eba2010054e80f41b2e80700f9e023009170070194f44f4fa9f6574ea9f85f4da9fa674ca9fc6f4ba9fd7b4aa9ff030491L4;FFe20316aa23c480529aebff97e86b42f91f0500f1a10b0054e00316aa21c48052220080527e110094f62b40f9e0031aaa01c480522200805", - "279110094e0031baaL8;FFdf7d02710954003949c100110a819f1a0958003969010d0b4a114e0b29c10011cb0d00122c344039095c003949c100117f2500710960003909819f1a9f7d0271BBL4;FFe88300918082009181820291c36a0094e86342a9f71b40f91f0500f140030054e80740f9080116cbff0", - "208eb28270054970100b4a002168be10318aae20317aaL4;ZDL8;FFe0230091a32300d1a2008052a8831ff8d091009468220191610100f0215c1491840100d084e00991a32300d182008052a8831ff8c7910094940100d094a20391BBBL4;FF3907009120130054483740b91f01176b41ffff54480340f91", - "f0500b1e0feff54408740a9a84302d1f4ab0094a80357381f05007120feff54083340b8090340b9L4;FB3c25a28cffa88b8c0000c40d1af1e6e32b5021934ee3f2840f0cf92f73b041c24580f2af1be7031f2e0dd78ca69eefe171529f46342f216e259727c600a60016L8;FFe83f44f9e82300f9e84344f", - "9e8af06a9eb4744f9e84b44f9e82f03a9e85744f9eb5344f9e8d300f9e85b44f9eb230ca9e86744f9eb6344f9e86f00f9e86b44f9BL8;FF2200805287110094e1d342f981fcff17e04316912200805282110094e1d342f99efbff17e0431691220080527d110094e1d342f9fdfdff17e043169122008052L", - "8;FFe1e31b9120f18f3c8942039102278052f86f11a9f55f12a9e92b00f9e8a300f987510094ff0600b19542039141020054e8031691e00316aa54510094c8624039BBBBL4;FFa10f0054aa835df8e92e00d148dd789278000014a8a35cb8abab7da9a9e35c78ac035df8a8031bb8a8835e78aa031af8aa9", - "35c38a9431b7869038052a8831a78L4;FB76616c696420636861696e206b657900fe924800000000004c00000000000000df0000002b00000045737461626c697368656457697468507178646800000000L8;FFf44f07a9fdc30091081c00121f09007181010054e00302aaf30302aaf40301aa3bf1ff972", - "0020037750240f9a80640f9160101eba2020054e80f41b207000014BL8;FFa9d315384901084aaa035638a9e315386901084aab135638a9f315384901084aaa235638a90316386901084aab335638a91316384901084aaa435638a9231638L8;FF80000054c0020291e1431691a8140094e8b349f9f40740", - "91948209911f0500b18000005480020491e14316912a130094e8cf49f91f0500b180b5ff5481e20491BBBL4;FFf80300aa46000014b8835bf844000014a06303d1a8ab32a9ab8e0094a0031bf8610300f021f42691630300f063e4279118000014a0031bf8610300f021f42691L4;ZBL8;FFff430391c003", - "5fd6a00100f000843991a20100f042403a9181028052a1b10094a00100f000843991a20100f042a03a91810280529bb100942000805201048052BL8;FFa2018052a302009063600c9124018052b6260094e15346f9e15306f9e0833291a10200902120099102028052a302009063001691e4018052ac2600", - "94f55346f9L8;FFff4f05f9ea5305f9e86305f9e96705f98f310094e1ab42f9810000b4e0af42f9220080527e310094e0032a91e1832491022b805282310094e1eb41f9f68b44f9BBBBBL4;FF0800669e18c101f200030054e90700f90803c0da0811c0da880f488b0801198a5b1b08cb68035df8bf0208e", - "b2101005461835cf8e00316aae20315aa8e010294L4;FFe1feffb4200340f92200805284010094f3ffff17e81640f9c80000b40805088be00315aa0201805201ed7cd37c0100945f1b00f160110054f5d245a9340200b4L8;FF04000014730600f194c201914003005481825cf83f0400b14001005481000", - "0b480025df8220080527d01019481025ef8810000b480825ef82200805278010194BL8;FF010300f02170299182008052c2810114ff8300d1fd7b01a9fd430091010300f021802991240300d084c02391e323009182008052e80700f9bb810194fd7b41a9L8;FF820a803d8106803d8002803d6826002948", - "09c05a6909c05a682601298809c05aa909c05a68260229c809c05ae909c05a68260329f44f48a9f92b40f9f65747a9BBBL4;FFfa0300aa39008052e003192a9ec101941f1c0072e0031aaac1feff540aa440a908038052e00f00f9e0830b91e1e30091ff2700f9f9830b912829089be95f02a9L4;FB72206", - "f662070726576696f7573207374617465733a20c000c00022536b697070696e6720636f72727570742070726576696f75732073657373696f6e20c00520L8;FFe91302f9f527f8b7552b00b480c10094e00315aa21008052390080527dc10094202700b4e10318aae20315aaf60300aa83c1009450010014", - "560080d2e0830291BL8;FFe00313aa2200805286010094610a40f9b0ffff17e00313aa2200805281010094610a40f9b9ffff17e00313aae10318aae20316aa7b010094780a40f9680240f9L8;FF220080528641009461ce41f9810300b460ca41f922008052180000141f0d0071200500541f11007161040", - "054745656a9a80240f9680000b4e00314aa00013fd6BBBBL4;FFe85341b9e8a700b957ffdfc8d70200b4ff0600b100030054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eba3ba0054L4;FB34ed4800000000006a00000000000000020100002e00000034ed480", - "0000000006a00000000000000440100001c00000034ed4800000000006a00000000000000L8;FF680200f9a0020054e0431e9142dcff9712000014e0dfc13de8c343f909008092690200f9fa031c2a6082803c680e00f9e1b340f93f0400f18b000054e0b740f9BL8;FF02018052a80f00f9d261019468e2", - "0091c10200f021082991e40200d084e03e91a363009122018052a80f00f9c961019468620091c10200f021542491e40200d0L8;FFf40301aae10309aa220080526d050094880a40f9e00313aae10314aaefffff17e00301aaf30301aae10309aa22008052f4030aaa630500946ba240a9ea0314aaBBBL4;F", - "F22008052090900f9f44f43a9f70b40f9f65742a9fd7bc4a881a101142000805201c4805296a1019420008052018c815293a10194fd7bbda9f65701a9f44f02a9L4;FF930f0037b5ea0091207875f8200f00b562020032407c40930328009100e80091367863f8207860f8b60000b4c11a40b981000035c1", - "1e40b941000035000c0091L8;FFe00301aa090140f93f0900b1a1000054810100f021bc149182008052bea10014ff8300d1fd7b01a9fd430091810100f021cc1491a40100d084c02591e3230091BL8;FF8a0200b04ae10c910a0000f9000500ad3f7d00a9f44f45a9f52340f9fd7b43a9ff830191c0035fd", - "6e8230091090000f029911f91a20f00f9800200b0004c0791BL4;FFf30b40f9fd7bc2a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f090071e1010054e00302aaf40302aaf30301aad8000094L3;ZBBBBBBBBBBL4;FF000c428b0000158a626ae0386202f836022000", - "d152fe79d33f0600b14200158a726a20386202028b52200039c00900543f020debc80700541f000deb88070054L4;FF4401805230000014c80080d2a0831d38a0c300d10800f0f2bf931d38a8031df87014ff97e10300aaa1031df8c100009021202291c3000090638c2291a0c300d1L8;FF090000d02991", - "1f918002009000f80491e82701a9a86300918202009042001a91e1430091e82702a98b1e0194c4fbff978002009000e018917f1e019480020090BBL4;FFff8317d1f30308aa08018052ff0300f9e87f01a988e00091f40301aae84702f9480300d008211d91e07f00a989600191e0c30c91e84f02f908008", - "012e1231291L4;FF1f5c00f1fd030091f30b00f920010054010000f021cc40f9330040f97f0200eb330100b4c000005421400091fbffff17000000f01348463906000014330440f9L8;FF42008052a80f00f9d29e0094810100d021f41991a40100b084e00d91a3630091a2018052b30f00f9ca9e0094ca9", - "e0094fd7b41a9f31340f9ffc30091c0035fd6BBBL4;FF060000141f0400b1415c0054a7de01941f100031c15b005439feffb505000014e043059181008052a2de0194005b0035e85341b9e84700b957ffdfc8770000b5L4;FB4e000000000000001a04000009000000f5014900000000004e000000000000", - "006402000013000000f5014900000000004e00000000000000b904000017000000L8;FFec5f00f9e8cf00f90b2045a9e8c300f9122046a9ebb300f9e89700f90b2047a9ebab1aa90bf840f9e84f00f90a2048a93f030bebeb8300f9e8df00f9172049a9BL8;FF3c3340f9bcf7ffb528008052a87f3ea9380", - "b40f9b8f9ffb50a018052a92f7fa9765e0d297b5202a97a3200b96ba603a9a9237ea9782a00a96ba204a969a205a9L8;FF1bfcff97818a40a960008052e30313aa6dfaff97888240391f05007101020054610a40f9680240f91f0101ebc0030054690640f92a0400910b0480521f010aebBBBBL4;FF68070", - "0b4e00642a9e2330091f663019135faff9709fc79d3e0e7076fe8031faa0b0c8052210d010eea2640a90c00098a42696cfc438c212e6d00669eadc101f2L4;ZFL8;FF6bfdff363f0900f1e0fdff544b09c0394c0d00912e0d00d10c3900a96d19001221380daa4bfcff363f0d00f1c0fcff544b0dc0394c1", - "100912e1100d10c3900a9BL8;FFa07e0114d57e0114281040b9000040f96800c8376800d037b67e0114d07e0114d07e0114080040f9002540a9221140f940001fd6000040f976710014080040f9L8;FF37050091ff0208eb081b0054f8000014e11740f9e80f40f91f0101eb60690054f50314aae81340f9", - "490b8052b30e4cf809692138280400917f0a00b1e81700f9BBBL4;FFeb031faac9420091ea0319aa2c8541f88d0140b28c010b8bad11c0daad1540d2ad0d0d8bad2501918c194d8b9f010bebc31300544a0500f1eb030caa81feff54L4;FB636c692f7372632f73746f7265732e7273002f636172676f2d7", - "2656769737472792f696e6465782e6372617465732e696f2d3139343963663863366235623535L8;FF683a40f9611a40f9e583853ce08700ade28f01ada00600ada20e01ade08b42ade41f803de84300f9a29202ada012803da85a07a9210100b4e00314aa22008052BL8;FF21fdff5419008092542340f9", - "b4031df8f40e00b4080d80525a1f40f9fc0300f9fb0f00b9f96301a9f75b02a9f54f03a9937e089b763e0194e00313aa01018052L8;FF1f1800f102110054217c0353211300343f0800718d0100543f0c0071600200543f100071c00200543f14007141040054c1220191e20313aae8fdff97600300b4BBB", - "BBL4;FF290500912001088be10313aa95faff971601003513000014e8031faa75feffb5e003088be10313aa8efaff97b6010034610a40f9680240f91f0101eb602d0054L4;FFeabf40f9e97742f9f97b42f9e89340f956fd60d3eaa340f93bfd60d3e9c700f93cfd78d3e97f42f958fd78d3e9d700f94804", - "00b4e8c740f9e08b40f922008052L8;FF202440a91f050071230d40f9cc000054680100356102009021b837916200805260001fd61f090071210100546102009021e037912201805260001fd661020090BL8;FFff030191c0035fd6210300d021502991e823009182008052bc8e0194685640b9420300904", - "2602091e0230091a1730091a81f00b9b68e0194b68e0194fd7b42a9L8;FFffc300d1fd7b01a9f44f02a9fd430091a80100d008210191f30300aa08fddf88c8020035a80100d008e14039600240791f05007181040054e2031f2a20e8ff97BBBL4;FFe82340f9290400910a018052e00317aa0a692138e1e3", - "0091e92700f991baff97360300b4e12740f9e81f40f9b71240f91f0101eba0230054e82340f929040091L4;FB11bd363f000081ebda9d4950a269a4d10129996f60636a2a0576d286d9af5166a96b08796ed2d1356d5b4b050ad6260c58b75a2e324b9da1092fa9fc81639079L8;FFf86305f9f40310aae9", - "a703f9e9af03f9e8b303f9d2c7ff9788018052eb2b5ba9e87300f9e9ab40f9e14740f9e82f40f9e77740f9fabb40f9ef8f40f9ec1f40f9BL8;FFff0316d1f30300aae8430691e00301aaff0300f9fa03062af803052af60304aaf90303aae21b00f9f50301aab70302d1f4030591e074ff97e84346391f05", - "0071L8;FF81040054e91f40f9e14341f9e0031691ffa71139200545ad286140f9e82303f9200705ad200543ad200703ad200944ad200b04ad210141ad210301ad200942adBBBBL4;FF9b0300b41c1340f939008052f70314aae8164038891740381f01096be0179f1a99ee01947b0700f11900190a21ffff", - "5402000014f9031f2ae003192a92ee0194L4;FB657973747265616d20726561636865647b9b4800000000004b00000000000000bb0000000e0000007472756e6361746564206369706865727465787461737365L8;FF09000014e00300f9210200d021041491230200d063f41491e0030091220280524400", - "8052b1e3ff97e10340f9acffff17c80080d20800f0f208090091a4ffff17BL8;FF3f0500716c0400540b0180d2ea474039e80f41b20b00f0f23f01007108018b9a29019f9a0a018a1a26000014e89340b8e90f40b9ec234079ea2341b8eba34039L8;FF780300b4e1d342f9e8cb42f9f99349f91f0101ebe", - "0350054e8cf42f9490580522a040091e00318aa09692138e1431691ead302f90e0c0094fad342f9e8cb42f9BBBL4;FFb86301d1a8031df8080180523f8100f11700f0f20083813c1fa004a91f2c00f9a1030054081c40f90b4840f9f4a30091090140b90a3140b80c7141f8167140f8L4;FFfd7bbaa9fc6f", - "01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff0740d1ff0300f9ff0740d1ff071ef83ffc3ff18900005409008092090100f973000014L8;FFff0f00f9ffa300a912f8ff97e88340a9290080521f0500f109000079e90f00f9a1ecff54e02300910af8ff97e00b40f961ffff17a20100f042a0019", - "1e00308aaBL8;FFe1833291e3c3179142008052f35306f9f45b06f9e9ff02f9e90703f9e80b03f95cdfff97e1a345f9810000b4e0a745f9220080527a2e0194f37740f9e8c31791L8;FF72edff97f3d34ea9940100b47522009104000014940600f1b5620091e0000054a1825ff881ffffb4a00240f92200", - "80527b2e0094f8ffff17e87340f9680300b4BBBBBBL4;FF22008052861602946002039137feff976022019108feff97617e40f93f0400f18b000054608240f9220080527c160294619640f93f0400f18b000054609a40f9L4;FF200740adbf0600b1385b42a9e00715ade00f0054fcdf00f93c1b40f9e077", - "c03de8e34a39e0074091a30000d06310319100401d91e10316aae2031caa84018052L8;FF00401291630200d063c01191640200d084e02291a20700d16105805290160194fd7bbca9f70b00f9f65702a9f44f03a9fd030091150c40f9f40300aaf30308aaBBL4;FF2c0140f9080500f12b8500f84c8500f8", - "61ffff54480840f22003005449147d921f1100f10800098b2900098b82000054ea031faa020108370c0000142a0140b9L4;ZBL8;FF800100f000c01a91889600948001009000c0129185960094fd7bbea9f30b00f9fd030091010c40f9f30300aa1f2400f93f0400b140010054810000b4601240f9BBBL4;", - "FF880a40f9775a00a968a608a968320591776e01a97a6e02a9610206a9613a00f96082873c697e00f9699600f9784a01b91f0100f97f5601b9f44f45a9f65744a9L4;FB796e6f6d69616c456e636f646572696478707473706f6c797341757468656e74696361746f726d61635f6b65794e6f48656164657", - "25265636569766564726563L8;FFe8d300f9e89f42f9eb230ca9e8b342f9ebab42f9e8e300f9e8b742f9e85b00f988018052eba30da92400001428a00791fecb00f92080c03d0101c03d280841f9BL8;FFe08749f92200805285560194e18f49f9810000b4e09349f92200805280560194b30000b4e07b49", - "f9e10313aa220080527b560194f49f49f99f0600b1e0a5ff54L8;FF2101009021e03391020280522301009063c03f919e000014e05306f9e08332912101009021e03391020280522301009063fc3f91c40280529600001448008052BBBBL4;FF28008052e217c03d800600ad820a803d68920039f44f49a9", - "f65748a9f85f47a9fd7b46a9ff830291c0035fd6000180520103805292f60194000400b000201b91L4;FB70726576696f757344657669636549647265717569726564f0a54800000000000000000000000000000000000000000000000000000000000992480000000000L8;FF3f040071c00100543f0800", - "7161fdff54888243f81f0500b1810000549fe203a99ffe04a998fe05a981e20091e20313aad2f8ff97000100b45d000014600900b5BL8;FFe1031aaa2200805285760194b70000b4e03740f9e10317aa2200805280760194e12f40f9a1d5ffb4e02b40f96dffff17a00301d1a82b3ca9a353009420008052", - "L8;FFe0f3c63de1074091e043169121800991f53309f9fb3709f9e09f843d0ac5ff97963b01b4e8074091c10600d1e0431691088109916fc4ff97e86352b9f86b52b9BBBL4;FFe0a30091e10314aa22008052230080522400805296a9ff97f41f40f94effff17e0a30091e10314aae20313aa23008052240", - "080528ea9ff97f41f40f9f51740f9L4;ZDL8;FFf30300aae0230091040180520503805229f87fd33f1100f13481889ae30314aa40000094e80740f91f0500f1e0000054e80b40f9742200a9f44f43a9fd7b42a9BL8;FF680000b4e00313aa00013fd6810640f9611601b4820a40f9e00313aa80360194af0", - "80014f7c31791e82746b9f50346b9e042c13ce142c23ce0a30c91fcff42f9L8;FFe80b00f9680a41f9e80700f9681241f91f0500b100020054761a41f9683a42b9e81b00b9d60100b4751641f978360094e00316aa210080527636009460d900b4BBBBBL4;FFe91700f9a9035eb8148116b801c1983c00c1", - "993ca1837cad09c11fb801c19a3c00c19b3ca1837aad01c1963c00c1973c5a0700915f0f00f1a1f2ff5412000014L4;FF21403e91130800b91f300039f44f41a9fd7bc2a8c0035fd6000180520102805297060094fd7bbea9f44f01a9fd030091f303012af40300aa7506009400028052L8;FF1f15007100", - "0200541f11007141040054280180d20800f0f217000014e00313aa3b060094e80300aae8070036e00301aaf44f45a9f52340f9fd7b43a9ff830191BL8;FFf30308aabe5e0094f40301aaa100f8b6f5031faae00315aae10314aa8d860194940200b4f60300aa79860194e00314aa21008052350080527686", - "0194c0feffb4L8;FF002080520101805282860094c03a00b489c240f9f5031faafa031f2afb031faa0802805298a2009136fd44d3370d409219038052e80303a9ff2300f9e90f00f9BBBL4;FFe10318aa2200805285c60194e12340f9a1e6ffb4e03340f96cffff1728008052e80f00f92804009008b140f", - "91f0900f149040054a86301d1690000b029312491L4;FB617420c0012900217374616c6520756e61636b6e6f776c65646765642073657373696f6e20666f7220c00d20286372656174656420617420c00129000d496465L8;FFee0317aaed0316aae00315aae10314aaf44f40f9e10000b422008052f5030", - "daaf6030eaa7ec60094ee0316aaed0315aa340100b4e04b40f9e10314aa22008052BL8;FF0a0000144d254039bf0500f1c80100548c1900126ce10c8b81fd0daa3f000beb030500544b018052e0031faa4a010b8b29010bcb0a2500a9fd7b43a9ff030191L8;FF6b1540d26b0d0b8b6b2501914a194b8b4a", - "050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b25019129194b8b2905009129010aab020400542a0140b2BBBBL4;FFc9b203f8ca0e0139d2b204f8d84e0139c85600b9f44f5da9f6575ca9f85f5ba9fa675aa9fc6f59a9fd7b58a9ff830791c0035fd63f8300f141090054e13740f9L4;FB2f73", - "72632f76312f6368756e6b65642f7374617465732e7273001b737071722076312e73656e645f63742e73656e642065706f636820c01e3a20486561646572L8;FFe06301f92102009021881f9123020090630c20914700001448008052e0230b39e8270b39f56301f9e5ffff17a80a00d1a10312f80500001", - "4e80b41b2a00312f8BL8;FF20008052e10313aa9d660194ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aae102009021dc2c91e8230091e00309aa82028052c566019468c20091L8;FF87660094e5ffff17680240f9c80000b409e179d3e00314aa02018052211108cb7f660094610e40f9e100", - "00b4601240f922008052f44f42a9f65741a9fd7bc3a8BBBL4;FF280600b5080840921f1900f122060054017c0353410600343f0c0071600100543f080071a0faff543f040071a101005481c20091a2630091e003082a5291ff97L4;FFa9feff5402e90091c6040011c07c7d93827862f800c0268b5f0000e", - "bc028537aadfdff548318003502290091807862f81f0013eb41f7ff54bf00001400290091L8;FF410300b4e00315aa22008052ffc30691f44f44a9fc0b40f9f65743a9f85f42a9fd7bc5a87ea6001435008052ff0f00f9ffd700a9d4fcffb4e0230091e10316aaBL8;FFfd030091f40300aaf30308aa8026", - "019400048052210080527e260194200100b4800640ad08048052680200a9000400ad680a00f9f44f41a9fd7bc2a8c0035fd6L8;FFfd7b01a9fd430091e80301aae00700f9c10000d021a01291c40000d084201291e3230091e00308aa62028052be260094fd7b41a9ff830091c0035fd6e00301aaBBBBBBB", - "L4;FF4a0400b44901c0da2911c0da080d498b0801148a296be838a904f836e90333aa0a2100d1eb0328aa29551b9b0cfc79d34a01148a2c6b283828030a8b9c0700d1L4;FFff0303d1fd7b09a9f6570aa9f44f0ba9fd43029109504039a9050037011040b9155840a9f30300aae0a30091f40308aa4a1200", - "94a8c300d1e00316aa2a75fe97L8;FFe20313aaf70300aa8d1a0194f50317aac182009100008092d7820091ec1a01941f0400f1200100541200001435008052c182009100008092d7820091e41a0194BBL4;FFa003973c20020054680e001100e4006f60430091e8b304b94803170ba18301d10809c05ab4", - "573429b6233529e8e31291000301ad0003813cb19a0194e8e31291L4;ZFL8;FFfd430091e90301aaf30300aa810100b021a01791e8030091e00309aa42028052cb9a0094810100b021601591a401009084a00391e0030091a363009102018052BBBL4;FFe8af40f9097d8052eb6341b90a7dc99b087d099b", - "69d09b526963a872697da99b17c949ab48358a9a480a00b5e8074091e0c30491f6c3049108410f91bb5f0094L4;FB6578706563746564456e6447726f7570546167496e76616c6964537472696e67e45344000000000018000000000000000800000000000000d464440000000000L8;FFe9cf40f9ecd745", - "a9e3b75ca9fa3f51a9fc4752a9e84740f9e9c703f9e1031d91e0b3c23de3af03f9e20319aae8a303f9e86b40f9e0b303f9e0430f91e8a703f9BL8;FFe35bc33de163c33deaab06f9e053833de18b833de157c33de287833de17f833de287c33dbf0600b1e07b833de07fc33df4179f1ae383833de37bc33d", - "e183c33dL8;FFf6bf40f9d60400b4f3bb40f9805a0094e00316aa210080527e5a0094e01001b4e10313aae20316aafa0300aa845a00941c000014e8c31791e00313aa535a0094BBBBL4;FF3f0314ebe833949a280308cb990208cb0a01188b090319ebf733899a3f0318eb89328a9a3a0108eb0001005409", - "0e80521655099be00316aa13e4ff975a0700f1L4;FB73742f70726f746f636f6c2f7372632f66696e6765727072696e742e72730038706f73742d7175616e74756d20726174636865743a206572726f722063726561L8;FF60350054fb0318aaf6e357a9b82100b4d922009104000014180700f139630091", - "0021005421835ff881ffffb4200340f9220080527afa0094f8ffff17e1430091BL8;FFfd7b06a9f44f07a9fd830191e8830091000440ad09810091f30301aae0230091a8273ea9080300b008211d91a8031ff808008012a18300d1e00701adf4230091L8;FFfbfdff17e0630091220080522300805224008", - "0523391ff97e11740f908feff17e0630091e10317aae20316aa23008052240080522b91ff97f71740f9e80f40f9BBBL4;FFa8835ab81f050031c1450054e81f40f9f50240390001c03dbf0600716003803d08450054480080d26003c03da06301d10800f0f2994600d1a8831af8e8460091L4;ZBL8;FF023", - "98052740200f98dba0094e0864aad60860eade08a4bad608a0fadff831a91f44f43a9f65742a9fc5f41a9fd7bc4a8c0035fd6e08fc03de82341f929008092BL8;FFe3070054a00200d000803091873a0194f3031faa088c48f81f0500b1c1dfff54e8031faa080113aba3060054a00200d0002020917d3a0", - "194f3031faa080c47f8L8;FF09b305b8788242f9e9ef41f9a8831838e8f741f9aa0318f8fba30ba9e8fb41f9fb0342f9f55300f9757e42f9e85b00f9080340f9e94300f9680000b4e00315aaBBBBBL4;FF240080529afdff97770a40f9f7feff17e00313aa22008052230080522400805293fdff97610a40", - "f9fefeff17e00313aa2200805223008052240080528cfdff97L4;FFf65741a9fd7bc3a8c0035fd6d3d200a929008052c90200f9f44f42a9f65741a9fd7bc3a8c0035fd6ffc301d1fd7b03a9f85f04a9f65705a9f44f06a9fdc30091L8;FF280080520400001400018052e8031faa600600f90a028052e903", - "14aa696a2af8680200f9f44f41a9fd7bc2a8c0035fd6ff0301d1fd7b02a9f44f03a9fd830091BL8;FF20faffb44e000014a0630091db8b0094f40301aa00fd07364a000014f9031faaf6031faaf5031faa3400805237008052a8c300d1e00314aaf0640094a9035d38L8;FFa9809352080140f9091000791", - "30303a9080000f9132300f97d8a009440018052410080527b8a0094605200b4680100d008210391a96d8252080140f909100079BBBL4;FFe80740f9eb2745a940818a3c000940ad41818b3c683940f954650f29f40340f940818c3c600542ad42818d3c6219c03d483900f9280940f9400502ad600540adL", - "4;FB556e6368756e6b6564496e76616c69644c656e67746856314d7367696e64657800000000000000000800000000000000080000000000000048f6450000000000L8;FFe167813de9e31539a091883ce8c702f91f0c0094eab343f9fcb743f9fabb43f9e1bf43f95f0500b1404d0054e9cb43f9e8cf43f", - "9bf0600b1e0c343f9efc743f9BL8;FF40030054c1825cf83f0400b140010054810000b4c0025df822008052804a0194c1025ef8810000b4c0825ef8220080527b4a0194c10240f93f0400b1e0fdff54L8;FFe80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b1305", - "00917f0209eb09290054088c48f81f0500b1802000544a030094BBBBL4;FF1a0dc0daed6f41f9ee7341f9e8c30891e0030badef7741f93c0dc0dae0030cad5b0dc0da740dc0dae0030dad980dc0dab90dc0dae0030eadd50dc0daf70dc0daL4;FB6076420000000000000000000000000008000000000000", - "000800000000000000804c42000000000053747265616d4369706865724572726f7200000000000000L8;FF680640f9490480522a040091e00315aa6a0a00f909692138e10313aacdeaff97760a40f9680240f9080116cbbf0208ebc8070054680640f9e10314aae20315aaBL8;FFe10314aa9e6a0194ffc", - "300d1fd7b01a9f31300f9fd430091e90301aaf30300aae10200b021d42991e8030091e00309aaa2018052c66a019468620091e10200b0L8;FFe9cf40f9e8631139a8f31938e8430691ea2b02f9e97200f8ebf200f8ea7201f82991fe97e84346391f05007161050054e8a759a9e80302f9e8031091e90702", - "f9BBBL4;FFeaa700a9a0aa019408074039f703002a1f013b6be0179f1a9baa0194080b4039fb02000a1f013c6be0179f1a96aa0194080f4039f703002a1f615a6be0179f1aL4;FFf5ffff17a0a300d1e10316aa79010094b45b7ea9b7835df8e20216cbf2ffff17e88300910900009029212191a8a73da9e", - "8030091210000b021ec009100210091L8;FFf45701a909000014a003de3c39070091a8035ff8f50f40f93f4300f18002803d880a00f9201500543457139b970a40f9ff0640f261100054d70d00b474aa0094BL8;FFe13f02f9290c40f9e103129120013fd6fbc342f97f0f00b1410a0054a8008052a8ffff", - "17404fc03da80359f814000014e8e322910081cb3ce8c344f94003803dL8;FFf9e33f39e8833f39e8a74b29f6e73f39faeb3f39e9873f39e88b3f39e8a74a29f7ef3f39fbf33f39e98f3f39e8933f39e8a74929fcf73f39f8fb3f39e9973f39BBBBBBL4;FF4c19001221e00caa8af5ff361f2500f100f6ff", - "542a25803929290091082900d1092000a96af5ffb75f05007128f5ff5421fc0aaae0031faafd7b43a9ff030191L4;FFa04700d1b7c4ff97e0c300b9a04700d1b4c4ff97e0bf00b9a04700d1b1c4ff97e0bb00b9a04700d1aec4ff97e0b700b9a04700d1abc4ff97e0b300b9a04700d1L8;FF3f4000f1c102", - "0054090840790a1840390b0c40390c0840390d1c40390e0440392905c05a0b11003929610aaa0c1500390a0040390b30412929410daa0e190039BBL4;FF42018052bf920194610cf8b7fa0301aafc0300f9fc0314aaf4031baaa10300b4f70300aa7a920194e0031aaa2100805278920194800f00b4e1031", - "7aae2031aaaL4;ZDL8;FF080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb89040054140114ab230100541e000014f4031faae00313aa080c48f8BBBL4;FFbac70094e01340f926ffff17e01300f9a10300f021982a91a30300f063882b91e0830091e2028052e40", - "1805225ffff17e01300f9a10300f021982a91a30300f0L4;FB0000efa3893d5195177804010a82858c137a8600c502a9ff2ee5a4198354eacc567290a06a1d2a78c564e32e78d1bfc74716e40db55b9ebf8997d71c00001931L8;FFea7b00f9eacf45f9e98300f9e92746f9ea230ca9e8e345f9eadf45f9e", - "9f301f9e9db45f9e86f00f9e8e745f9e0f7803de85f00f9e8eb45f9e8e300f9e8ef45f9BL8;FF1f0101eba0360054e8cf42f9490480522a040091e00318aa09692138e1431691ead302f92a0c0094fad342f9e8cb42f908011acb1f0308eba8350054e8cf42f9L8;FFc800805217ffff17e04bc13de14fc1", - "3de84345b9b47e085372ffff17f46f41f9e8c31791e91f46b900c1c03c01c1c13cf5fb45b9880240f9f36b41f9e97305b9BBBBL4;FFcdfeff17e00b40f9f71740f91f09007121010054ea3340f9891f009148dd789207000014ea674139e8031faa891b009103000014e8031faa892300914a1d4092L4;FB", - "3300000000000000ca010000050000009a964800000000003300000000000000ce010000050000009a964800000000003300000000000000d201000005000000L8;FFf44f07a9fdc30091081c00121f090071e1010054e00302aaf30302aaf40301aa3bf2ff97e80300aae00301aa08020037750240f9a80", - "640f9160100eb62020054BL8;FFc809c05ae909c05ae8271129e08743adc806805234008052a00301d1a1c302d122008052b4031ef8a0873aade28344ada9035538aa135538ab2355382901084aL8;FFc1825ff881ffffb4c00240f92200805283720094f8ffff1714a4ffb48806148be00313aa02018052", - "01f17dd31afdff17e19349f9f3074091738209913f0800b1BBBL4;FF880000542800028b08f1df38881df837a04301d11b1c0094a8035bb8681f0037a8035cf82a0340f9490108ebc35400548a0340f9b8835bf84801088b880300f9L4;ZBL8;FF61a100913f0015eb280900544b2540b959910091ea0319", - "aa7f01086beb0317aaa1feff54f49200919f0215eb680a005477b20094000480522100805275b20094BL8;FFc80080d2e0a33239e08332910800f0f2ffa73239e85306f972280094e10300aae15306f9e0833291a10200902120099102028052a302009063941691a4028052L8;FF7828ff97e80300aae84", - "305f9e0032a91e100009021e03f91a2018052e30000b06380009124018052b027ff97e14345f9e14305f9e0032a91e100009021843d91BBBBBL4;FFf30b40f9fd7bc2a8c0035fd620008052010380528f020294ff8302d1e923036dfd7b04a9fc6f05a9fa6706a9f85f07a9f65708a9f44f09a9fd0301910", - "9404039L4;FF84020094001500b4e12340f9e2031caaf60300aa8a020094a0a300d1e1031caa220080522300805224008052bcdb3da9bc831ef85fe3ff97b6237ea9ea058052L8;FF600640f9e10314aa2200805284020194610e40f9810000b4601240f9220080527f020194688e46f81f0500b1a000005", - "4e00313aaf44f41a9fd7bc2a841feff17BL8;FF210300b021142e91a202805260001fd6210300b021c82d916202805260001fd6ff8300d1fd7b01a9fd430091090040f9e80301aa2a4540b85f01007129119f9aL8;FFe80301aae00700f9610100d021603c91640100d084e03b91e3230091e00308aa2202", - "8052c0820094fd7b41a9ff830091c0035fd6080040391f1400f91f3000b9BBBL4;FFc967c0f2a07f0091e1030091e87f01a9e82704a98ec2019428008092680200f9fd7b46a9f33b40f9ff030291c0035fd6090c40f93f0500b1e0040054095440f9L4;FB6a00000000000000190000001c000000e467490", - "0000000006a00000000000000e30000002e000000e4674900000000006a00000000000000800000002e000000L8;FF810000b4e07f42f92200805284c20094e17740f9810000b4e05f40f9220080527fc20094da0500b4e05b40f9e1031aaa220080527ac2009429000014e0c31591BL8;FF80010034610a", - "40f9680240f91f0101ebe0050054680640f9090180522a0400916a0a00f909692138e10313aa28fcff97801e40b980010034610a40f9680240f9L8;FFe9bf00f9e81f40b9e8030639e10740f961cdffb4e01740f91a000014e90310916affff904ab139910001009000b82c9108210091e1c30e91e9db01f", - "9eadf01f9BBBBL4;FFe00318aae10319aae2031f2ae0023fd61f0000f1cd000054390300eba3db00541803008bf9feffb50f0000141f0400b101db00549de201941f10003181da0054L4;FB6420746f206465636f64652070726576696f75732073657373696f6e2070726f746f627566000000000000000", - "000000010000000000000000800000000000000L8;FFe113c23d08008092e21bc23d3a008052e8b300f9e00714ade017c23de1ffc13de00b15ade003c23de207c23de10312ade00bc23de1efc13de20313ade0f3c13dBL8;FF3f0500710c01005409030035e10200b021fc349162028052fd7b41a9ff8300", - "91bd6201143f0900718103005409210091e10200b021003691e40200b084803591L8;FFff030191c0035fd6dc63ff97fd7b43a9ff030191c0035fd64001009000800791856200944001009000e007918262009440010090004008917f62009440010090BBBL4;FF2911c0da4a11c0da291540d24a1540d22", - "90d098b4a0d0a8b292501914a25019129fd46d329194a8b2801088b180900b1a5000054f9031faae00319aae10318aaL4;FFc10a40f97f1200f9610000b4610600f9a9000014734e00a9d30a00f9f35341a9fb7345a9f8feff171f4002f10130009119fc44d3a90300542007009125c59c52L8;FFff83009", - "1c0035fd6080040f9e00301aa090140393ffd0371e0010054ff8300d1fd7b01a9fd430091810100f021cc1491a40100d084402091e323009182008052BL8;FFf50300aa8e220194b5020037a90240b275d200a9880200b008411e91690e00f9680200f9f44f42a9f65741a9fd7bc3a8c0035fd6280080527", - "f7e01a9680600f9BL4;FF687a40f9c80000b40805088be00314aa0201805201ed7cd381220094745652a9350200b49682009104000014b50600f1d6c2009180010054c1025ef8810000b4L3;ZBBBBBBBBBL4;FFe00314aaf44f4aa9f65749a9f85f48a9fa6747a9fc6f46a9fd7b45a9ffc30291c0035fd6e", - "92341a9ea0740f9480108cb395100a9280900f936feffb4080c8052L4;FF950100b4e00316aae10315aa22008052831c009407000014a003df3ce85701a928008052f60702a9e003833ce8230039e82740f9e083c13ce183c23ce283c33cL8;FFb40a00f9614200910000809274420091ef1c01941f0400f", - "1210300549ffedfc8610640f90104f8b7600240f9220080527b1c0194e00313aa0103805202018052BBL4;FFe12b803de027803d682600294809c05a6909c05a682601298809c05aa909c05a68260229c809c05ae909c05a68260329f44f5da9fccb40f9f6575ca9f85f5ba9L4;FFe07a80b9e10313aae20", - "318aa480880d2010000d462f5ff97e10300aadf0200ebc0fbff54d60200cbe0fcffb7630640f91f0003ebe9fdff5494060051010003cbL8;FFfd7bc2a8c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa810100d021d81691e8030091e00309aa42018052c69c009468e20091810100", - "d0BBBL4;FFabdc0194f70300aaff0600b180020054f843059199008052e00318aae10319aae2031f2ae0023fd61f0000f1ad000054390300ebe31a00541803008b06000014L4;FB7920696d706c656d656e746174696f6e2072657475726e656420616e206572726f7220756e65787065637465646c7900c", - "c094900000000004b00000000000000L8;FFfa5f44f9e56344f9e46744f9e92312a9e8db43f9e9eb43f9f66f44f9ed7344f9f07f44f9e8ab1aa9e8e743f9eaf343f9e28744f9f48f44f9e1a343f9e8df00f9BL8;FFbc010014f6c744f9e043169101230091027380528a5c0194f8031f2ab701001403e400", - "6f0083c03c0183c13c0283c23cf6d344f9e0074091fbcf44f9f9c744f9L8;FFa8090054680640f9e10316aae20315aa0001178b8a5c0094e802158b680a00f9952240f9550300b4610a40f9680240f9941e40f91f0101ebc0090054680640f9BBBBL4;FFc1220091022a80528dfc01940200001415008092", - "88a305d1898305d1e0e30591010140f9220140f9f6e30591758e0094c0820091e1a30b91022a8052f5cb00f9L4;ZFL8;FF410200d021f81b91430200d0633c1c91e08300912202805244018052e81300f92b000014c80080d2e0a30039e08300910800f0f2ffa70039e81300f969f2ff97BL8;FFa52300d1", - "e00308aae2018052d87c0194fd7b42a9ffc30091c0035fd609a000912103009021803c91a9831ff82403009084003c91060300d0c6e0129103200091L8;FFe1630091d37cff97e00314aa080c4af81f0500b160000054e1630091b98fff97964e40f9560300b4e11740f9e80f40f9944a40f91f0101eb603", - "e0054e81340f9BBBL4;FF80f5ffb490000014a02301d1dbbd0094f90301aa60f8073620000014490080d2684200390900f0f22869009129008092692200a936000014f9031faa17000014L4;FB0800000000000000880848000000000080f347000000000020000000000000000800000000000000cc0948", - "000000000080f34700000000002000000000000000L8;FF608a4dad800a01ad8dbc009460220091f44f5ba9fcd340f9fd7b59a9ff030791b7b6ff17c50100d0a5003091a163009162c20791e0031f2ae3031faaefbc0094BL8;FFc0035fd6e00308aba3ffff54a00200f000202491853c0194a00200f000c", - "02791823c0194a00200f0002008917f3c0194fd7bbfa9fd030091083040b9c8030034L8;FF776a41f900c3c73c01c3c83ce9ff43b9f6db43b9756641f9e80240f9200708ade92303b9680000b4e00315aa00013fd6e10640f9810000b4e20a40f9e00315aaBBBBBL4;FFbf0208eb48330054680640f9e103", - "16aae20315aa0001178b890c0294e802158b680a00f9952240f9550300b4610a40f9680240f9961e40f91f0101ebe0330054L4;FF3fb50071c005005402000014490140393fad0071e9179f1a090109cb48158a9a3f0d00f1c2020054a90400b40a01403958c100511f270071280400543f0500f1L8;FFc0", - "035fd608a440a90a0180d28a00c0f2a9831ff8e9031eb21f1500f1eaa701a989018052e80700f9e92b00b942060054e9630091ea2300916202009042482a91BL8;FFfd7b41a9ff830091c0035fd6210300d021702991e00308aa82008052fd7b41a9ff830091bc8c0114ff0301d1fd7b01a9f51300f9f44f", - "03a9fd430091f30300aaL8;FF848c0094009200b4f31f00f9f30318aa08048052698640b8e8830ea9ff7f00f909040036156300911602805208000014e87b40f9940a0091d60600f1b5620091BBBL4;FFe00705ade30b04ad6042803c6142813c6342823c6242833cb40000b4e00315aae10314aa2200805", - "27dcc0194ff030891f44f43a9f65742a9fc5f41a9fd7bc4a8L4;FBe61949000000000054000000000000007f00000005000000e61949000000000054000000000000008d0000001400000073686f756c642062652061626c652074L8;FF693740f96283c23ce1030e91e0871dad6083c53ce9f301f9e9e35", - "539e0f7803d6013c13ce8c301f9681340f9e2eb803de9230e39e092833ce8cf01f91a110094BL8;FF8083c03ce8430f91000d803d888341f8e9035039e80b02f9e8430691a9090034e90310916a0100f04ab139911a0380d2c00200d0009c2c9108210091e1c30e91L8;FF00801291894c0094000100d000", - "e03291864c0094fd7bbfa9fd030091081840f9080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091BBBBL4;FF87ec0194b50000b4e00316aae10315aa2200805282ec0194e00317aae10319aaf44f46a9f91b40f9f65745a9f85f44a9fd7b42a9ffc30191c0035fd6e0230091L", - "4;FB08000000000000000800000000000000987d420000000000646973747269627574696f6e5f6964496e76616c696450726f746f636f6c41646472657373000000L8;FF540300b4610a40f9680240f9b51240f91f0101eb40080054680640f9490280522a040091e00314aa6a0a00f909692138e10313a", - "ac7ecff97760a40f9680240f9BL8;FFd6c20191f70600d121fdff54f42b00f902000014f82300f9e83740f9e9e30191ff3f00f9b57f3aa9e0030191a82739a9a1c301d1b366ff97e8a746a90a0d40f9L8;FF00a00b91896c0094400100f000401b91866c0094400100f000e00a91836c0094400100f00080", - "1a91806c0094400100f000c016917d6c0094400100f000c01391BBBL4;FF83ac0194000480522100805281ac0194e00200b460c2c53c61c2c63cf90300aaa1835ef8000400ad810000b4e0031baa220080527aac019475f2ffb4e0031aaaL4;FFf65706a9f44f07a9fd830091f40302aaf30300aa540d003", - "728004039e80e003419048052f8031faa3a0000d05a0300911900ac720c0000148812188be1230091L8;FF4100805283ac0094002300b4f40300aa7fac009440008052410080527dac0094e01b00f9202200b479ac0094400080524100805277ac0094e01700f9602100b4BL8;FFe8bf01f90800f0d22201", - "01ada90359f841f18f3ce9d701f9fbc301f9f5c701f9f7cb01f9e8bb01f996010014e8031691e00316aa552c0194c8624039fbc342f9L8;FFe1e3c13df91b02f9000700ade073c23de177c23de0671139c00600ad097142396902003609dd49b8ea0308aa4b4d40780c7d40394a09403900f1c03c087140f", - "8BBBBBBL4;FF48020054680640f9e20315aa0001168b8b140294e90640f9d602158b760a00f9280115eb63020054e90240f9940215cb9f0208eb2101158b9532889ae12200a9L4;FFe96f42f9e87342f9e9a31ba9b60000b4e00319aae10316aa2200805280140094e80b4091e083099108c10e91f18dfe9", - "7e80740914083009108411d914898fe97L8;FF0815001208190a2a28090e3387000014e2031faa2a008052e30314aae803092a00e4006f7f0001ebe00300ad281c00545f0003ebe81b00545f0001eb40010054BBL4;FFff830791c0035fd63a008052f66b0ca937e2ffb514ffff17e0030391e10317aae20", - "31caa23008052240080529087ff97faa34ca9f66340f9f30340f915011c8bL4;ZBL8;FFe8031faa080113abe3020054800100f000601c9185940094f3031faa088c48f81f0500b121efff54e8031faa080113aba3010054800100f000a007917b940094BBBL4;FF88fc0736010100145f2800f1880000542", - "800028b08f1df38480ff837e0830091183e0094e82340b9e8360037e81b40f9aa0640f9490108eb23460054aa0240f9L4;FB5369676e616c205051205261746368657420563120436861696e202053746172744f7574206f6620626f756e6473206163636573730000009820490000000000L8;FFed03001", - "429a041a9e003099135f040a9f80301aa36dc5ba9022f8052e8e700f92aa042a9ec7300f9e82b17a92aac43a9e92b1fa929a044a9e8cf00f92aa045a9BL8;FF080500911f0109eb4814005472000014fa031faaf9ab49f9f8074091188309913f0700b1a018005400c30391441c0094080040b20811c0da0", - "81540d2080d088bL8;FFff5f06f9ea6706f9e87306f9e97706f98f54009450000014e0032d91e0eeff97e1fb42f93f0400b180140054fa4340f9fb830291810000b4e0ff42f922008052BBBBL4;FFf44f46a9f65745a9f85f44a9fd7b43a9ffc30191c0035fd6ff8301d1fd7b04a9f32b00f9fd030191f30", - "308aae8230091f2ce0094e82340391f050071e1000054L4;FB2070726576696f75732073657373696f6e2070726f746f62756676616c696400859248000000000033000000000000007d010000440000008592480000000000L8;FF4102009021041d914302009063901c91e003009162018052440180520", - "9000014e00300f94102009021041d914302009063d01391e00300916201805244008052BL8;FF82008052b30f00f9d2740194d2740194fd7b41a9f31340f9ffc30091c0035fd6ffc300d1fd7b01a9f31300f9fd430091e90301aaf30300aa0103009021001891L8;FFb9010034e1d342f9e8cb42f91f0101", - "ebe0d40054e8cf42f9090280522a040091e00319aa09692138e1431691ead302f90f120094f90b40f9b8010034e1d342f9BBBL4;FFf4031aaaa2fe46d3b8e27a92b5164092e20000b4e83340f9e0020191e10314aa0801028be83300f9b0b40194e00300918102188be20315aaf5ff003980b40194L4;ZDL", - "8;FF284340b928060036a9237fa9ea1340f91f5301a9155b02a9092300a9e92341a90a2300f9092303a928a7482908270929e82f40b9085300b93c000014b9035ff8BL8;FF7b0700919f0314eb0071005400e4006f0823059189ab40a9ffa305f9f6a705f9f6b305f90001803d08018052e8cb05f9e8672a", - "9100f18f3ce8c32c91e99b05f9L8;FFf6f3ff97e0f4ffb474010014e1832491a22302d1f1f3ff9740f4ffb4560100141f0800f1e1220054a80302d1a10302d1a22302d11f7d01a908018052bf6338a9BBBBBL4;FF268a009468624039e0230091a173009122008052a8730039208a0094e8a743a9eaaf41a", - "928e108aae9b340a90b010bca4901098b6c010c8b2acdcaca8bc1cbcaL4;FFc0040054f7031faa79420091350080523a03178be8e30691400740a98f040094e8bb41b9a80c0037e88b41f9fb735ca9bf0208eb40010054494300918802178bL8;FF680a40f91f0116ebea33969a08010acbca0208cb34010", - "aebc9000054e90316aa06000014f4031faae8031faa03000014f4031faa0901098b0a0e8052750640f9BL8;FFc0035fd608100091200440a9a92300d10a0000d04a211f91020300f042543891a8831ff8e9ab00a9e323009199840194fd7b43a9ff030191c0035fd609004039L8;FF1fa90da90afd0fa91f", - "a910a90afd12a91fa913a90afd15a91fa916a90afc41d31ffd05a91fa917a90a3180521ffd08a91ffd0ba91ffd0ea91ffd11a91ffd14a9BBBL4;FF240080529ab7ff97a1035ff86bffff17a08300d1e10316aae20313aa230080522400805292b7ff97b6035ff8a8035ef8080116cb7f0208eba9edff54a0", - "8300d1L4;FB73696f6e207761732076616c69643b206d75737420686176652072656d6f7465206964656e74697479206b65790000003b634900000000003800000000000000L8;FFe8eb41f9e99702f9e93340f91f0500b1f97b02f9f7e31339f98302f9e08b02f9fa9302f9e99b02f9fc9f02f9c0030054", - "6083c73ce88303f9f9031c91e8634f39BL8;FF430c80528ff5ff97e10300aaa10a00b5680240f9080540f91f0119ebe9030054e00313aa99fdff97c009003728fc60d3a80600b5200840921f1800f182070054L8;FF22000014882245b8e92f4379eb4746398c9246f8edc74639eaa34639e8d303b9e9ab0", - "779e8a759a9ecb300f9eda305392b1f0036ebd343b9e96306394921c993BBBBL4;FFff0740d1ff0300f9ffc321d1ff0300f97a0400905aa3059157ffdfc8f60301aaf403002af50308aa170300b453008052ff0600b13300a07240030054f8430591L4;FB3938352f6c6962726172792f616c6c6f632f737", - "2632f737472696e672e7273007fe5480000000000470000000000000024010000150000007fe5480000000000L8;FFe00315aa210080523800805281e4009420feffb4e10316aae20315aaf70300aa87e400940200001437008052882642290a358c52981a40b9942240b921008052BL8;FFe0fdff54e15b", - "45a91f0500f1e1f9ff54e00b00f9f73340f9a0e300d1b8831cf8fa0301aa6d4dff975f0700b160070054a8e300d1e00316aae10317aa0c3b0094L8;FFf30b40f9fd7bc2a8c0035fd6fd7bbda9f65701a9f44f02a9fd030091010040f9f30300aa810000b4600640f9220080527b640094610e40f9810000b", - "4601240f9BBBL4;FF240080529a97ff97f60f40f9b1ffff17ffc307d1fd7b19a9fcd300f9fa671ba9f85f1ca9f6571da9f44f1ea9fd430691090040b9f30308aa3f05007121090054L4;FF02008092011440f902cc01f9810600b597021091560080d2050080d2040080124304805202008052e11a40f900", - "0080d2d622c19a017f169b0b0600941f0400b1L8;FFa80f00f9d3a40094d3a40094fd7b41a9f31340f9ffc30091c0035fd6ff0301d1fd7b02a9f44f03a9fd830091e90301aaf30300aaa101009021041491e8230091BL8;FF69564039b502000a1f01096be0179f1a9d240194885a4039695a4039aa02000", - "ad6020a0a1f01096be0179f1a96240194885e4039695e4039f503002a1f01096bL8;FFfd7bc6a8c0035fd6e00316aa91190094d90640f9ecffff17fd7bbba9fa6701a9f85f02a9f65703a9f44f04a9fd030091f40303aaf30302aaf60300aac20100b4BBBBBBBL4;FF88f70737d7ffff17e92b00a9e00300", - "91adf50094010040f93f0400b1a0000054810000b4000440f9220080527c180214c0035fd6fd7bbda9f65701a9f44f02a9L4;FF84180094c00b00b4a80000f008bd3491bc0000f09cab2991090140f9086140f897ff48d3f80300aaf50741b2d6018052090000f9086000f8a1035ef8810000b4L8;FFf44f", - "03a9fd43009115a040a9090115ebe3030054f30302aaf40300aa5f0009eb09010054e00314aaf503012ae10313aa220080525cf7ff97e103152a95a240a9BBL4;FFfa0300aa000400ada0820291bc70009408048052e90b40f9e003c03de8eb14a9e2430291e8ff15a908018052e8ff16a908008092e1831", - "7a9e0630491e1c700f9L4;ZFL8;FFaa1358382901084aabf31738ab235838a9031838a93358384a01084a6b01084aaa131838aa4358382901084aab231838ab535838a9331838a96358384a01084aBBBL4;FFa8f31a38a8c301d109f306f809810091e8a703a9c80300b008211d91e82700f908008012ea0", - "300f90b7307f80af307f8e85300b941d2ff97e81340f91f0500b1L4;FB1b737071722076312e73656e645f63742e726563762065706f636820c01a3a2043743153616d706c6564202d3e2043743253616d706c6564001b737071722076L8;FFea5f44f9e87b00f9e85344f9e8d300f9e85744f9e9230ca9e", - "86344f9e95b44f9e86f00f9e86744f9e85f00f9e86f44f9eaa30aa9e87744f9e83f00f9e87b44f9BL8;FFe0d50054e8cf42f9490180522a040091e0031aaa09692138e1431691ead302f92b120094fcd342f9e8cb42f908011ccb5f0308ebe8d40054e8cf42f9e10316aaL8;FFe0031791e3032d910800f0", - "f2e4833291210100b02164319102018052e9ab0cb9e85306f9f3fcff97f3f742f9e8ef42f97f0208eb61000054e0631791728ffe97BBBBL4;FFe8c20091e10315aa160800b9080000f928040090088134911f30003960a200a9090d40f9e823009120013fd6e80740f91f0900b100fdff5475da40a9e083c", - "03cL4;FB617267756d656e743a20c0001a696e76616c696420737461746520666f722063616c6c20746f20c00d20746f20737563636565643a20c0002c63697068657274L8;FF8082833cacffff17e08742ade00314aae21fc03da0873aade08740ada203973ca08738ade08b41ada08b39ad3af3ff97a00", - "77aad880080d20800f0f208190091BL8;FFe00400543f20007121050054a88353f81f0500b161000054bfe733a9bf8314f8a12303d1a22301d14862ff9760f4ffb444000014a8035ab848000037b9031af8L8;FFe3fb863dba770094817800940004815221008052e1780094e07c01b4f80300aa7b780094", - "0004805221008052db780094e07c01b4f40300aae0fbc63de1ffc63dBBBL4;FF83b80194c00480522100805281b80194801100b4880300f008010591490080d2000540ad08e141f80900f0f229650091000400ad08e001f8c804805269a200a9L4;ZBL8;FFe0031391017880520210805223008052240080", - "5233cfff97e86b42f9e96742f9e91f00f9bdfeff17200080520104805288b80094c00100f000e03391c30100b0BL8;FF080100b4080140b20811c0da081540d2080d088b0825019108fd46d308050091091840f93f0500b1400400540a2040f9092c40f90a0100b44b0140b26b11c0daL8;FF60c21491e10", - "32a9102248052757e02f9778202f97c8602f9788a02f9768e02f97a9202f97b9602f985380094681242f969e21391600e42f9692a03f9081140f9BBBBBL4;FF890640f92a0108eb43230054890240f9e00316aae30317aa2801088be90b40f9882a00a928fd60d3681700b5280940921f1900f1421800542", - "17d0353c1180034L4;FFf44f47a9fd7b46a9ff030291c0035fd6e00b40f922e6ff97480080d20800f0f2742200a9f44f47a9fd7b46a9ff030291c0035fd6ffc301d1fd7b02a9f91b00f9L8;FFc0035fd6ff8300d1fd7b01a9fd430091280440a9090200f0296105916202009042ec0391e02700a9e303009", - "1e00308aa98080194fd7b41a9ff830091c0035fd6BL8;FF7f050071e9a34bb8ea3700f9ea7f4179e8c30139e86340f9e97b00b9e9e74239eafb0079fa5b00f9c1050054e0c30291e90f00b9e82300f96871ff97e83340b9L8;FFe30316aae40313aae0031aaae10317aabddaff97f70e00b4f60600f1e003", - "1faad7fa7fd3840c0054e8f77fb2ff0208eb280c0054770100b475880094e00317aaBBBL4;FF800100b507000014340100b480c80194e00314aae10315aa7ec80194a00000b528008052750600f904000014e00315aae8031faa600600f90a028052e90314aaL4;FB0000000000000000080000000000000", - "0080000000000000094014600000000000000000000000000080000000000000008000000000000000807460000000000L8;FFe00316aa2200805285c80094e00314aa9c0000b4e1031caa2200805280c80094ba0000b4e05b40f9e1031aaa220080527bc80094e17340f9810000b4e00315aaBL8;FF2200", - "805286480194610e40f9810000b4601240f92200805281480194611a40f9810000b4601e40f9220080527c480194612640f9810000b4602a40f922008052L8;FFc1fdff54f40314abe2020054688e4bf81f0500b140020054e00313aa52010094080040b20811c0da081540d2080d088b0825019109fd46d", - "30800098b08050091BBBBL4;FF2100805283e80194200400b4e10313aae20314aaf70300aa89e80194c10e40f93f0400f18b000054c01240f9220080527be80194a10240f9d4de01a9d41600f9L4;FB616c69644469676974506f734f766572666c6f774e65674f766572666c6f774e6f7441506f7765724", - "f6654776f0000004f9d4800000000007500000000000000L8;FFe87f05a9ff2306a9e87f08a9ff2309a9e87f0ba9ff230ca9e87f0ea9ff230fa9e87f11a9ff2312a9e87f14a9ff2315a9e87f17a9ff2318a9e87f1aa9ff231ba9BL8;FF680a00f97f2a00b9f30b40f9fd7bc2a8c0035fd6fd7bbea9f44f01", - "a9fd030091f30301aaf40300aa79680194000380520101805277680194000100b401030090L8;FFe9df40f9e8a30539e012803d2093c03ce9f204f8e112c03d8092823c8192833ce9c700f9e10740f9010600b599feff17e8b740b92043c23cc0e200912183c33cBBBL4;FFe13340f93f0400f18b000054e", - "00317aa2200805282a80194df0600f14b060054e06b40f9e10316aa2600001439008052bbf8ffb537008052df0600b1a1f9ff54L4;FFffff04a927008052ff2f00f946008052e00305aae2e30091280980d2610080d2030080d2040180d2ffff03a9e75300b9e65b00b9010000d4210000b021800291L8;F", - "Ff83f04398ea80094f90b40f9e08749ada05701d1e257c03de1830091e00704ade08747ade22b803de00702ade08b48ade00b03ade08746ade00701ad95260094BL8;FF9f0219eb80050054f8bf4a39955a40a9620318cbdc0202eb63feff54580200344003188be10315aab302028b84280194e87b41f9e", - "97f41f940030291e1c30891L8;FFf6e742f9fb074bf9f90b4bf9fc0f4bf9f8134bf9f5174bf9c80240f9f7e342f9680000b4e00317aa00013fd6c10640f9810000b4c20a40f9e00317aa78280094BBBBBBL4;FF820740f95f0017eba9060054810340f9200080398000f8b728040091490400d1110000145", - "f2800f1880000542800028b08f1df388804f837e0230091117a0094L4;FFb8c2ff97e0c300b9a04700d1b5c2ff97e0bf00b9a04700d1b2c2ff97e0bb00b9a04700d1afc2ff97e0b700b9a04700d1acc2ff97e0b300b9a04700d1a9c2ff97L8;FFf44f45a9fd7b44a9ff830191c0035fd63f9800f1e005005", - "43fb400f1a1060054690240393fd5017141060054690640393fc90171e1050054690a40393fb90171BBL4;FFe01ac33d6142853ce11ec33d6042803c6142813cf40500b4e00315aae10314aa2a000014e90f41b220000014e91741b21e0000141f090071c1010054080180d2L4;ZDL8;FFfd7bc1a8c0035f", - "d6800100d000802b9186900094800100d000c01a9183900094600100f000c0129180900094ff4301d1fd7b04a9fd03019108004039690100d0BBBL4;FFf44f5da9f6575ca9f85f5ba9fa675aa9fc6f59a9fd7b58a9ff830791c0035fd6e8af40b9e88b00b9950300b478d00194e00315aa2100805276d001", - "94001a00b4L4;FB749d80e100009519f91165044fb8612e25ec7d294fe76f6a0a95624a3943df5d95600f26e72afff0c709ed964a2c7a47a1b3d7a7539ac0e0f1fbd1a00da647deL8;FFe96b00f90aa541a9e0f7803de9e700f90ba542a9e92f17a90ba543a9ea2f1fa9e99300f90aa544a9e9cf00f90ba5", - "45a9e9c300f9093540f9e9ab00f9093940f9BL8;FF017880529350019420008052010880529050019420008052010481528d50019420008052019080528a50019420008052010480528750019420008052012c8152L8;FFe88b40f9c80000b40805088be00314aa0201805201f17dd381500094400745ad1", - "60080924233c03de85345f9800705ad400743ad8233803de8bb02f9800703adBBBBL4;FFf60300aaf50301aaa82734a98812809a6912819aa82735a90810949a2910939ae0230091a10303d162008052a82736a91e640094a80303d140830091e10319aaL4;FB6574206966206b7962657220707265206b6", - "5792069732070726573656e74000072984800000000003300000000000000210200000e0000007298480000000000L8;FFe00313aa42f0ff97e80301aa80000036c80900b5e1031faadcffff17e1031faa882e00f9d9ffff17c10b0054e0031faa9bffff1721050054e0031faa8effff17BL8;FF0a3040b9", - "091440f94a1100344a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d34a050091090100b42b0140b26b11c0da6b1540d26b0d0b8b6b250191L8;FFf9b749f9f8074091188309913f0700b1801800540023049153290094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080", - "500911f0109ebBBBL4;FFbb8312f81f0900f16101005408008092686e00a9e04302915699ff97f3031f2af6031f2ae00748a9e91b40f9eba343a99affff17a06303d16899ff97e83f40f9L4;ZBL8;FFff0b01f9ff2701f9ff2301f9ff3f01f9ff3b01f9ff5701f9ff5301f9ff6b01f9ff6f01f9ff8301f9f", - "f8701f9ff9b01f9ff9f01f9ffb301f9ffb701f9ff1701f9BL8;FF880200f0082d2491e96706f9290080d2ea6f06f9c93bc0f2e87b06f9c8048052ea5706f98a0200f04a2d2291e0df813dff5306f9e85b06f9ff5f06f9ea6306f9L8;FFe83701f9e83f01f9e9030a39f7e741f9f6e341f9570300b4f50316", - "aae00315aa3cefff97f70600f1b5c2009181ffff54130000142009c03dc102c03de89b44f9BBBBBL4;FFed031faac92a40a9ec031faa000d010e0e000a8a22696efc438c202e6f00669eefc101f280010054f001c0da1012c0dad00d508b10020a8a301910cb11025cb8L4;FF9f6a29f8880200f9f44f41a", - "9fd7bc2a8c0035fd6d30100b47d000094e00313aa210080527b000094400100b528008052880600f909028052936a29f8880200f9L8;FFe0230091f7a300a9afddff97e0230091f7a700a9acddff97e00313aae1031faae20314aa23008052240080522d170094770a40f9680240f9080117cb9f0208ebBL", - "8;FFe80301aa090040f9010300f021201991240300d084c02491e3230091e00308aa02018052e90700f9bf800194fd7b41a9ff830091c0035fd6ffc300d1fd7b02a9L8;FF8b010b8b2801088b49010b8be16300910001098bcf80ff97d90300b4e11740f9e80f40f9fa0f00b99a0640f9fb0b00f91f0101e", - "bc09b0054e81340f949018052BBBL4;FF097840f93f0500b180070054098040f93f8100f181070054f30308aa087c40f9090940790a194039147140f8160140b915f140f8e9030079097141f8ea0b0039L4;FB17010000110000006c69627369676e616c5f70726f746f636f6c3a3a747269706c655f7261", - "7463686574696e76616c696420726563656976657220636861696eL8;FF806ec03d0101c03de083029188d640f9812200914083813ce107813de81302f9e91f02f91e150094e10b45ad480080d2e00fc13de30bc13d0800f0f2f52b00f9BL8;FFe20315aa0001178b8d400194e802158b680a00f9951640f", - "9550300b4610a40f9680240f9961240f91f0101eba00a0054680640f9490480522a040091e00315aaL8;FFf40302aaf30301aad2000094e80300aae00301aa08020037980240f9080740f91f0100eb42020054e80f41b2e80700f907000014c90080d248008052e0430039BBBBL4;FFabe00194f70300aa1", - "f0400b141fdff54e043059181008052a6e00194809b0035e85341b9e88700b957ffdfc8d70200b4ff0600b100030054f843059199008052L4;FB697a653dc002207d00013cc0013ac0013e002f72757374632f34386132323963656165666434393835633530393930623134313136623664383536616630", - "3938L8;FFe103002a92390094e203012ae103002a8f390094e203012ae103002a8c390094e203012ae103002a89390094e203012ae103002a86390094e203012ae103002aBL8;FFf303012af40300aa8160019400048052010180527f600194200100b4140000f9e10200f021600491131800b91f700039f", - "44f41a9fd7bc2a8c0035fd600018052L8;FFacfcff97000100b483000014200e00b5e00313aa85fdff97e80301aa80000036880e00b5e1031faae1ffff17e1031faa886200b9deffff17811c0054e0031faaBBBL4;FF8103805296a0019420008052c103805290a00194ff0305d1fd7b0ea9fc6f0fa9fa67", - "10a9f85f11a9f65712a9f44f13a9fd830391fa0308aa080c40f9b40280d2L4;FF9fbc007168030054030000f067c00291867c4093e4d86478217c041b5f00016b6bfcff548100010b5f00016b0afcff54011040f93fcc74f2c102005463c00291L8;FF68620091a10100d0216c1991a40100d084600a91e0", - "030091a3630091a2008052a80f00f9cba00094810100f021dc1491a40100d084a00391a363009182008052BL8;FF280101cb5f0008eb28060054ca02178b280117eb6a0200f942f5ff54800200b0002017918420019420008052615a40a9f58300a9ff0f00f9df0215eb89f7ff54BL4;FF810102516b00f8", - "374b0080524c0000143f104071c30b00544b09c0396c1d00122c380c0b811140516b00f8376b008052430000143f004871030b00544b0dc039L3;ZB" + "BBBBBBBBBL8;FB1c002f636172676f2d7461726765742f616172636836342d756e6b6e6f776e2d6c696e75782d676e752f72656c656173652f6275696c642f737071722d383934L8;FF200540f922008052fba40094b90000b4e0031aaae10319aa22008052f6a40094b70000b4e00318aae10317aa22008", + "052f1a40094b5fbffb4e00f40f9e10315aaBL8;FFfd7bc2a8aefeff17602200917800009460220291f30b40f9fd7bc2a8a8feff17610640f9810000b4600a40f922008052f1240194611240f9410d00b4601640f9L8;FFfd7b01a9f44f02a9fd430091280840f9290040f91f0002f1230f00543f0108eb13", + "601932200100542a0440f91f1040f15369283808050091280800f942020054BBL8;FFadb35fb86b2a0129765e0029ec0b00b9edb300b8ea4340f8600a00f9611a00b96ac201f8ea6340396d3202b8eb0b40f9797202f878f202f86afe00396b7203f8L8;FF633c2191e0230091a200805244038052960000", + "14c90080d2e8430039480080520900f0f2e8470039e90700f9ddffff17e00700f9a1fdfff021e02091a3fdfff0BL8;FFe10314aae20313aa00f1ff97000e00b5e1031faae10900b5a80640f91f011aeb69050054e00313aadcf1ff972009003728fc60d3080700b5200840921f1800f1L8;ZDBBBL8;FB158", + "14000000000000700000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000900000000000000L8;FFe80f40f91f0101ebe08b0054e81340f9090180522a040091ea1700f909692138e16300916e92ff97803240f9800100b4e11740f9e80f40", + "f91f0101eb608b0054BL8;FF611f0054f7830c91e8c30591e0c30091e082c63ce182c73ce282c83ce08709ade082c93ce182c23ce2830aade082c33ce282c43ce18307ade082c53ce182c03cL8;FFfd7bc3a8c0035fd620008052e10313aa910000943ffc3ff16900005420008052c0035fd6fd7bbba9fc6", + "701a9f85f02a9f65703a9f44f04a9fd030091ff0740d1BBL8;FF0811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebc9180054150114ab83000054c0000014f50314abc2170054762e40f9f60400b4L8;FF152300a9f7fbffb5f62b40f9f51f40f99600003778fdff9018e3069", + "113000014d7fe45d3e80214ab820c0054e90200aba20c0054aa0217cba8831cf8a8c300d1L16;FFeef347a9f9031eaafe0314aae80317aaf70316aae1d348a9f5ef00f9fadb4aa9e31340f9e22f40f9f57b40f9e56f40f9ef030014e8b343f9e94700f9df0600b1BBBBL8;FB15012100fd011f0266013803", + "7b003f020000ed0058008600170029014701e1009201480071010000c7005d0098000a00fc001d01b600820141004d01007c494cL8;FFab535738a93317384901084aaa635738a94317386901084aab735738a95317384901084aaa835738a96317386901084aab935738a97317384901084aaaa35738BL8", + ";FFe90f80123f002071ea0f801229140033c20000542a7c0653090500394a051a320a01003912000014eb0f80122c7c10532b2c0633ec0000352a7c0c530b050039L8;FF09190039e95341b9091d0039e94b41b909210039e94341b909250039e93b41b909290039e93341b9092d0039e92b41b909310039", + "e92341b909350039e91f41b9BBL8;FF080119cb7f0208eb49ddff54a04301d1e10319aae20313aa230080522400805265e0ff97b9035cf8e2feff17a04301d1e10319aa220080522300805224008052L8;FFe813899ae3031f2ae84f04f9966a0094e8fb40b9e97b40f93f00086be8279f1a1f0009ebe9a7", + "9f1a0901891ac80000f0a9050036081140f9e92740f91f0500f1L16;FF53000014e0dfc03de8c341f9c082803ce8b705f934000014e8b345f9e0d7c23de0030b91e8c301f9a8c20091e0df803d922d0094e00740ade8030091e0432d91BBBL8;FF6d000094770a40f975ffff17e00313aa22008052230080", + "522400805266000094610a40f97cffff17f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8L8;FF081540d2080d088b0825019109fd46d30800098b080500911f0109eb68280054c0fdfff000202091a4700094e8031faa000119ab42730054e1431691b70d0094BL8;FF9f0600b1e002005473d", + "640a9950100b47622009104000014b50600f1d6620091e0000054c1825ff881ffffb4c00240f922008052f0f40094f8ffff17340100b4L8;FF631a40b96324d41a83000036000080d21f000039007d20d4631e40b96324d41a83000036000080d21f000039007d20d463ce749226000090c6c041f9630040", + "f9BBL8;FFe8031faa0d000014000302911a1d0094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb499d0054180116aba20a0154L8;FF892e00b968020b39ff833191f44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd661fdff9021801d91e0", + "430f91a2028052fb5f00f95e090094L16;FFa80314f841838c3ca98315f860010014e083029181220091023f8052f5830291fcb40094882640f9800ac03da1a201918a1a40f98182c33c8216c03da80317f8BBBBBL8;FB6b796265725f7072655f6b65796c6f63616c5f6964656e746974795f7075626c69", + "635265636f726453747275637475726563757272656e745f73657373696f6eL8;FFe00316aa039d0094a10240f9d3c200f9d4220639810000b4a00640f922008052f59c0094a10e40f9810000b4a01240f922008052f09c0094a11a40f9f30b40f9BL8;FF760a40f9680240f9080116cbbf0208eb4806005", + "4680640f9e10314aae20315aa0001168bfb1c0194c802158b680a00f9f44f43a9f70b40f9f65742a9fd7bc4a8L8;FFf90301aaf40300aa22fdffd042603b91e0431391e10313aae3008052ff0300f9f80304aa880d0094e86b42f9fb6f42f9fa7342f9f57742f91f0900b141040054BBL8;FFe20317aa035", + "d0194608744ade80b40f9000500ad5a1400b4d602178b33008052fc0301911808805229000014020308cb8003088ba18302d1f65c0194683340f9L8;FFa02302d134f5ff97a00d003681fbffb47a01001401e30191a22302d150f4ff97e0faffb449010014e8eb45f91f0500b1801c005401430291a22302", + "d1aef6ff97L16;FFfd7bbca9f70b00f9f65702a9f44f03a9fd030091f30301aa210840f9f40300aa680240f91f0101eb600e0054680640f92a040091e00314aa490180526a0a00f9BBBL8;FFe00300917b2e0094e80340b9c8020036e00740f9f44f45a9f65744a9fd7b43a9ff830191c0035fd6280180d2", + "e00700f90800f0f2081500d118000014e90b41b2L8;FFfc7c0094207201b4e10319aa02788052fb0300aaff7c0094e09bc43de19fc43de0031caae2a3c43de8c34ef921058052e0ff833de05fc73d22008052e103843dBL8;FFc0035fd6fd7bbda9f65701a9f44f02a9fd030091160040f9f30301aa20008", + "052f40302aaf50308aac1820091c2f800942001f8b7c8feffd008e10691b45a01a9L8;FF200020d4ff4301d1fd7b02a9f65703a9f44f04a9fd830091f30300aa820400372a0040394a050034e9031f2ae8031faaeb0301aa060000144a1d409208010a8bBBL8;FFaa631638aa9356382901084aab731638a", + "ba35638a9831638a9b356384a01084a6b01084aaa931638aac356382901084aaba31638abd35638a9b31638a9e35638L8;FF22008052fc3c0094e14740f9810000b4e03f40f922008052f73c0094683642f9094940f9290001b4690242f901a140b960fe41f9280d40f900013fd6607e02f9L16;FFe0ebc1", + "3de1efc13d684340f9e2f7c13dfa8302f9e04f813d1f0500b1e0f3c13de153813de1e3c13de057813de0e7c13de25b813de147813de04b813df88702f9BBBBL8;FBacf151ba31ff00bba28cd208c019285407340000d02cc16b5181327d23749560ac55ca5195df0e01ebd65a6c0f0a035f86ecf00540b07", + "e4f890cb8bec41f2369L8;FFf80300aaff8c00944000805241008052f88c0094204200b42800805213000079130300a9e80f00f9130b00f933fb7fd3f48c0094e00313aa41008052ed8c0094BL8;FF040d019460030291e2833291e10313aa37adff973c008092fa4340f9fc5b02f97e010014c80080d2fa", + "4340f9fb8302910800f0f2084500919f0308eba1020054L8;FFffa300a9ff0f00f9e0230091220080522300805224008052ede8ff97e4ffff17ff8301d1fd7b02a9f85f03a9f65704a9f44f05a9fd830091280440f9290c40f9BBL8;FF88820091f50308aab80e5ef81f0700b1c00d0054b9da40a9a81a40", + "b9e8020036a01e40b9e16301914201805285480194610cf8b7fa0301aafc0300f9fc0314aaL8;FF4a0d0a8b4a25019129194a8b29050091280108abc2010054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108abL16;FFea7742f9e82b00f9e88f42f9e81", + "b00f9e89342f9e87b00f9e89742f9e86300f9e8a342f9e8ef00f9e8c342f9e8f300f9e8cb42f9e8f700f9e8d342f9e87f00f9BBBL8;FF69c209f8e93740f9689a023928fd60d369720ab8e96740b97af204f868ae0239884e41b9775e013969221729e86340b96a4a01796802033947ffff17e8031faaL8;", + "FF22008052fc6c00944dfeff17fb0300aaf80b00b99a0400b4fb0300f9f96c0094e0031aaa210080523b008052f16c009440f8ffb4fb0340f9e2031aaafc0300aaBL8;FFe18307ade02300b4e87b40f91f0500b160000054e0c3039151f8ff97e8bb40f91f0500b16000005420030291e8f5ff97f7d740f9", + "ff0600b100280054fb0318aaL8;FFfd7bbfa9e40301aae30302aafd030091017c4093e20304aa060080d2050080d2040080d2e00780d2e0ffff97fd7bc1a854f6ff17fd7bbfa9e40301aae30302aaBBL8;FF2200805209110094e1d342f9e00318aa02feff17e04316912200805203110094e1d342f913fe", + "ff17e0431691e1031aaae20318aafd100094fad342f9e8cb42f9L8;FFa0010054c1825ff881ffffb4c00240f922008052f82c0094f8ffff17a0c300d1e1031aaae2031baadfeaff97b9eb7da90cfcff17e89740f9c80000b40805088bL16;FFe50314aae6031baa07048052fa0f00f9f6100094e0431291e", + "10316aae2031baa03048052fffbff97e86342f908010fd11ffd01f18927005408788052200742adBBBBBBL8;FB733a20746865206c656e20697320c0122062757420616476616e63696e6720627920c0001941646472657373206d69736d617463683a2073656e6465723dc00cL8;FFfc6f48a9fd7b47a9f", + "f430391c0035fd620feffb000402391ab9c009440008052e10317aa8c9c0094ff0302d1fd7b02a9fc6f03a9fa6704a9f85f05a9f65706a9BL8;FFf7ff05a923feff97e0060036212c00b5992240f9881a40f93f0308eb6100005480c2009142bfff97881e40f9e083c33ce0031faa2823189b000d803de08", + "3c43cL8;FFf40308aaf903059117130094f50f56a9e0c30591e10316aae20315aa8a110094fa5f57a9f85b58a95f0b00b1e1020054760600b4e8c30591e00318aae10316aaBBL8;FFff7e16a91f0800f1011e0054b4835df8820640f9621f00b4810240f9200080398004f8b728040091490400d13100001", + "41f0800f1611d0054a18300d1a2a300d1L8;FF89f5ff54e00313aae10317aae20315aa17000094770a40f9a6ffff17e00313aa2200805212000094610a40f9afffff17e00313aae10316aae20315aa0c000094L16;FFe1031faad8ffff17e20313aa230c80528ce7ff97e10300aa60faffb4caffff17a005", + "00b5e00313aadcedff97e80301aa40010036080600b5e1031faacaffff17BBBL8;FB08000000000000002c1d4600000000009cf545000000000020000000000000000800000000000000ac1d460000000000560b4000000000007500000000000000L8;FF964a40f91f0101eba0390054e81340f94903805", + "22a040091e00315aaea1700f909692138e16300916d8eff97f71740f9e80f40f9080117cbbf0208ebe8380054BL8;FF570100b4ff2a00b1a8120054e82600911f0101f1a2120054290080522821c89a1f0115eb1581959a3511f8b7750900b4f4000194e00315aa2100805236008052L8;FF150a00940800", + "40b91f11007120ffff54110a0094080040b91f090071c10a0054280080521f0b00f91f2300a954000014f303002af5031faafc031faa34008052BBL8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab8300005414000014e80308ab42020054092440f93f0500b1a0010054092c4", + "0f92a0140b2L8;FF290c40f9e8430f91e1031baa20013fd6fceb41f99f0f00b1a100005448008092880200f908018052f70b0014776a41f900c3c73c01c3c83ce9ff43b9f6db43b9L16;FF680e00f9e9e740f9720600a9e1030991e8bf40f9678213a960020891692202a9e9bb40f979b210a9e8ff40f96b", + "aa11a9692203a9e99340f96ff212a9e8db40f9BBBBL8;FBb1019f9bc18850c69b09c7f1e05f0000b8876ba8a3082d69c3b57daea31ec61b153b2b5d5c872222973c72d61ca8f0dc178b9b37da103467c2194145b101b272L8;FF62028052fd7b44a9ff4301918c8c001408a440a9aa4300d1200440a9c2fd", + "fff0429c2391a8273fa9e8ffffd008011d91ea2301a9e34300918c8c0094fd7b44a9BL8;FF08312291e8a705f9e8c31691ea032d91e9af05f9e9fffff029012391e8ab05f9e8c32791a04700d1e9b705f9e9feffd029810c91e8b305f968008052e1c31791L8;FF04000014290480d2e80317aa0900f0f26", + "92200a9f44f4ca9f6574ba9f85f4aa9fa6749a9fc6f48a9fd7b47a9ff430391c0035fd63a008052f2100094e00317aaBBL8;FFea0600910001803d090900f9e80315aa098d41f8ea0f00f93f0500b1e0010054df0200f109068052e0230091e303949aea079f1ae903899ae2231291e1031faaL8;FFe1030", + "9aac44c0014fd7bbfa9fd030091080040f91f0500b1000b0054083040b9e80b0034080140b20811c0da081540d2080d088b0825019108fd46d308050091L16;FF232857a9e86f00f928c440f9e85f00f928c840f9e8e300f928cc40f9eaa30aa92a205aa9e83f00f928d840f9ea0700f9e8531ea9a12e005", + "49f0600b1a00d0254BBBL8;FF810000b4e01740f922008052fa700194e12b40f93f0400f18b000054e02f40f922008052f470019460c2009170f4ff97e00314aa3f000014f30300aa688e4ff8L8;FFfa2700a93a1aff97fb7740f9e082c03ce182c13ce282c23c7f0700b1e08705ade237803d000e0054e0", + "82c33ce182c43ce8a30391e282c53c00630291a0073badBL8;FF160101eb02030054e80f41b2e80300f907000014c90080d248008052e02300390900f0f2e8270039e90300f9e003009157f7ff97e10300aae00301aaf44f45a9L8;FF00e80091367863f8207860f8b60000b4c11a40b981000035c11e40b", + "941000035000c00911f3000f1680d0054f303022a360d00b4c11a40b9e203014b4200016aBBL8;FFf9031faa75000014e1d342f9e8cb42f91f0101eb806f0054e8cf42f949098052f6074091d6820991f4031baa0969213828040091f87749f9e8d302f91f0700b1L8;FFe06b823de16f823d4c2dff97e80", + "34bf9fc074bf9fb0b4bf91f0500f181010054881f00121f050071ec040054080b00359b1f4092fa0f41b2691f40927b0309aaL16;FFf44f45a9f52340f9fd7b43a9ff830191c0035fd620008052010480528eac0094ff8302d1fd7b05a9f93300f9f85f07a9f65708a9f44f09a9fd43019117a040a9BBBBB", + "L8;FB6420726563656976657220636861696e206d657373616765206b6579735369676e616c5f5051434b415f56315f4d4c4b454d3736383a53434b41204b65797368L8;FF9f0209eb48060054d40000b46002158be10308aae20314aafe980094e10318aab402148bff0a00f1e80316aaf40f00f9a00100", + "54e90740f9215442a9290114cbBL8;FF6b2501914a194b8b4b0500910a3040f96901098b0a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914a194b8b4a050091490109abc20400542a0140b2L8;FF04190094e0d7c53de8e351f9f8431391e9b34bf9e0431391e1031faa0083813ce0efc83d220", + "08052e87302f92300805224008052e97f02f9e13bc13de23fc13dBBL8;FF6283c83c6383c53ce00703ad6083c13c6183c23ce223803d6283c03ce08700ad6183c33c6083c43ce317803de18301ade203803df7540094fcff403908088052L8;FF681240f9280700b4e1f342f9e2f742f9e8833291e0db42f", + "9e44b40f963030291b307ff97e8833291fc5346f90081c03ce85f46f99f0b00b1e0d3823de8ab05f9L16;FFff270b39f56301f961dfff97e80300aae86301f981feffb021800f9183feffb063c80f91e0030b91420280522401805218000014e0230b39e0030b91ff270b39BBBL8;FFf30302aaa20640f9e", + "20100b4f40301aaa10240f920008039a001f8b728040091490400d11e000014890080d248008052e04300390900f0f2e847003928017fb2L8;FF20040054e1d342f9e8cb42f91f0101eb00030054e8cf42f929040091e00318aa19692138e9d302f9f8270094e1431691ba110094080340f91f0500b1a000", + "0054BL8;FF01f57ed342008052fbf80094680e40f9a80000b4601240f901f57ed342008052f5f80094681a40f9a80000b4601e40f901f57ed342008052eff80094682640f9L8;FF220e41a9318200913f0210ebe40332aae50320aae60322aa84fc47d3a5fc47d3c6fc47d3e70323aae7fc47d3921852aaa", + "01840aac21842aae31843aa52c20092BBL8;FFe00b843de0afc43de3f3863de8e34df9e10f843d0183c13ce013843d0083c03cf8031baa08011bcbf66309f93f0308ebe09b843de19f843dfb6f09f9f62b08f9L8;FF96f3ff97e02900b5e1031faae9ffff17802700b5a02302d16ef4ff97e80301aa80000", + "036e82700b5e1031faae1ffff17e1031faae8630ab9deffff17e16b0ab9L16;FFe8b742f9aa524678e00714ade83b00f9e8bf42f9e8a703a9e9c342f9e8cb42f9e9230da9e8d342f9e9cf42f9e81700f9e8d742f9e84f00f9e8db42f9e9a308a9BBBBL8;FB74696f6e4d696e696d756d2076657273696f6e", + "4572726f6e656f757320646174612072656365697665642066726f6d2072656d6f746520706172747943686169L8;FFe0000054e80b40f982fb7fd3410b00910005138bff880094e80313aa08011c8bbf0600f1a8831cf8a0060054a80400b4fb0308cb33008052e11340f9e0031aaaBL8;FFc082893c208", + "3ca3ce9db42f94221803d2283c83cebe20891410103ad2083c53c2183c63ce84701f9e8a70691e04341f9400501ad2083c73c2183c43ce9b304f9L8;FFca8dac72090140b93f010a6b60020054080140b949ae8c5269ccae721f01096b61410054810a41a9e0e3069153f7ff97e8df40f91f0500b1a04000", + "54f6275ca9BBL8;FFb7831ff8190400b4541340f9fd480194e00319aa21008052f6480194a00900b4e10314aae20319aaf50300aaf9480194572340f9b6831ef8b8431fb8f70200b4L8;FF080380d20800f0f21a1100d1e9d342b9204bc03d8101c03de88f01b9e94303b98041883c8021c03de95343b981", + "1d803d8182823c8082833ce98b01b98082c23cL16;FFe10316aaee0317aa000540ad08cf41f9e95f4ca9e00b40f9fadb4aa9e2031baaf88f41a9fe0314aae69f43a9f40315aaebb344a9e56f40f9ea031caafb5340f9BBBL8;FFfd680194e13740f9810000b4e02740f922008052f8680194e15340f98100", + "00b4e05740f922008052f3680194880280d2b40e00f90800f0f2a8ce00a948008052L8;FFfd680094810240f9810000b4800640f922008052f8680094810e40f9a1fdffb4801240f922008052f3680094e9ffff17f44f41a9fd7bc2a8c0035fd6ff8300d1BL8;FF0800f0f2ff270039e80300f960efff97e", + "80300aaa1feffb021a00e91a3feffb063a80d91e0030091e2008052a4008052e80300f909000014e00300f9a1feffb0L8;ZDBBL8;FF2183813c2083823ce10245ade81700f9e80b40f9e9a319a9a80302d12183833c2083843cc4d6ff97e11b40f9e21340f9e843069163a303916423039185830091L8;FF", + "fd7b44a9f32b40f9ff830191c0035fd6ff4303d1fd7b08a9f94b00f9f85f0aa9f6570ba9f44f0ca9fd03029137fc413939604ca9f40301aaf30300aa08108052L16;FF00602c91ada40094ff8303d1fd7b08a9fc6f09a9fa670aa9f85f0ba9f6570ca9f44f0da9fd03029100e4006ff303052af503042af4", + "03032ae30302aae20301aaBBBBBBBL8;FB726f6d20c02720776974682050524556494f55532073657373696f6e207374617465202862617365206b657920c0012900204e6f2076616c6964207365737369L8;FF4af303f8c0f8ff542a018052eb830091e013c03d690200f969010aaa60660191600a803d2", + "001c03de23080526822003928f140f809088052696603a9696204a9BL8;FFe10317aae20314aa08070094770a40f9cfffff17a8831ff8a84300d12900009029110d9100ffffb000440691e8a700a9a82300d102fffff042602891e1230091L8;FF00230094c002805221008052f9220094400200b448fdff", + "9008e53d91e90741b20001c03d08e140f80000803d08e000f8c8028052892200a989008052802201a9BBL8;FFaa031ef809693738e81b40b9e003082ae6e8ff97a1035ef8a8035df81f0101eb401c0054a8835df8090680522a040091e003152aaa031ef809692138a1c300d1L8;FF818a40a940008052e3", + "0313aa19faff97810a42a960008052e30313aaf44f42a9f50b40f9fd7bc3a812faff17e00313aa220080520e020094610a40f9dbffff17BL8;FF21a03d9183feffd063900291e00300910202805284008052ece8ff97e10340f9c6ffff17e80f41b2c0ffff17c80080d20800f0f208090091bcffff17ff03", + "02d1L8;ZDBBBL8;FB000000000000000000000000000000000000000000000000090000000000000009000000000000000d8a400000000000148a4000000000000000000000000000L8;FF60d0ff5480220291e163009160a3ff977ffeff17e00315aa0efcff97080040b20811c0da081540d2080d088b08", + "25019108fd46d30900088b37050091ff0208ebBL8;FFc0035fd649008052030900f909210039f5ffff17e00301aac1fefff021143b916200805286fe0014c10600b40a1440385f150071e1060054298400d13f8100b1L8;ZFBBL8;FF08200091200440a9e92300910a0000904a113f91e8a700a942ffffb0", + "42603591ea0f00f9e3430091903e0194fd7b43a9ff030191c0035fd60880009109200091L8;FFdeffff17811c0054e0031faa2cffff1720ebff54c80080d20800f0f20809009137000014e1010054e0031faa1affff17c80080d2e00b00f90800f0f2080900d1L16;FFf6030daaf5030aaae9a703f9e9af0", + "3f9e8b303f975c9ff97ebe340f9e31340f9ea0315aaecab40f9e0bb40f9ed0316aafb5340f9e9c340f9e8f341f9e9c300f9BBBBL8;FB617373657274696f6e206661696c65643a2063757272656e745f6b6579203e3d20706172616d732e6d61785f6f6f6f5f6b6579735f6f725f64656661756c7428L8;F", + "F1f0109eba808005450000014f3031faa080c47f81f0500b1c1dcff54e8031faa080113abe307005400fefff000000f91a28e0094f3031faa088c48f81f0500b1BL8;FF08fd46d308050091090040f93f0500b1600400540a0840f9091440f90a0100b44b0140b26b11c0da6b1540d26b0d0b8b6b2501914", + "a194b8b4a050091090100b4L8;FFe8c740f9e97f02f9e90342b9e80b05b9e8af40f9f6af02f9e88b02f9e89f40f9f9b31539e88f02f9e8bf40f9e89702f9e8a340f9e89b02f9e81f41b9e84705b9BBL8;FFffc30191c0035fd6ffc301d1fd7b02a9f91b00f9f85f04a9f65705a9f44f06a9fd83009117304", + "0b9f50300aaf30308aab7060034e80240b20811c0da081540d2L8;FF60000054e02b40f990e8ff97f4e351a9180200b49922009104000014180700f1396300916001005421835ff881ffffb4200340f922008052ef520094f8ffff17L16;FFfedcff17e0430f91f40301aa2120009102428052ffd20094e9", + "2742f9020340f95f0009ebe8979f1a08219f5a081d0072c07600541f0500712179005488008052BBBL8;FF680640f9090180522a040091e00316aa6a0a00f909692138e10313aae3f8ff97550300b4610a40f9680240f9969a40f91f0101eb20230054680640f949028052L8;FF48236639e2074091c0fdf", + "ff000441691c3fdfff063403191c4fdfff084c0169142800991a103805248030039926e0094c0fdfff000801291c2fdfff042001391BL8;FF6b00f8374b0080524c0000143f104071c30b00544b09c0396c1d00122c380c0b811140516b00f8376b008052430000143f004871030b00544b0dc0396c1d001", + "2L8;FF61c0218b23c04d3903fdff346304005123c00d39f35341a9fb7345a9e5ffff17f35301a9fb7305a9fafcffb040e30b91017877783b6c1c53383c7cd39dfeff97BBL8;FF00b8ff54f5bf49f9f3bb49f9b51300b47622009104000014b50600f1d662009100130054c1825ff881ffffb4c00240f9220", + "08052f0320194f8ffff17f37749f9L8;FFe4170ba9e62b0ca9ff730b79ebef02f9ebf302f9fff702f9e4170fa9e61f10a9ea8b11a900013fd6e0e302f9e8074091e1e702f908011891290c40f9e1631791L16;FF6183863c6183c13c6283853c6283c03ca1033aade10348adf67300f9f65340f9a203933c", + "e10302ade20347ade20301ade1034aade10304ade20349ade20303adBBBBBL8;FBfc0100002d0000004e6f2063757272656e742073657373696f6e696e636f6d696e672062617365206b657920697320696e76616c69640000890c400000000000L8;FFa8f31438a203d93ce1830091e00704ada08779ade", + "22b803de00702ada08b7aade00b03ada08778ade00701ad44140094a1d300d1e00316aae20318aaf59a0094BL8;FFfd7b54a9ff030691c0035fd6fd7bbea9f44f01a9fd030091f40300aa2301f8b7f30303aac10100b4e00302aa22008052e30313aaf11a0194000300b50e000014L8;FFe2f7c83de02781", + "3de0f3c83de12b813de02f813de233813d9200001408008092880200f9d300001408008092880200f9fb08001408008092880200f9e5010014BBL8;FFebb307f8ee0f0239f18700b9f24700f9f0230179ed3309b8ef330179eca700b9e7d300b901580094a8035c38bc935c381f05007121090054a8835c3", + "81f050071L8;FFa3fdffb063e02d91a40280524c000014e80f41b2e0833291e85306f95c61ff97e10300aa3e000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f9L16;FF817e0353c12e00343f0c0071a00400543f080071400200543f040071a1080054e8b340f91f0500b1c1000054e817", + "0291ff7316a9ffbb00f9ff7b01b91ff10ff8BBBL8;FFe0031faaf44f4da9f6574ca9f85f4ba9fd7b4aa9ff830391c0035fd6e0230091f7a300a96c790094e0230091f7a700a969790094e00313aae1031faae20314aaL8;FFe1a7843de16bc13de80700f9e807409108810191e2ab843de09b843de19f843", + "d96d3ff978083c23c8183c33ce85748f9f93348f9e06f833d8083c13ce173833dBL8;FF01feff541f1d0072800000541f000039ff830091c0035fd6e8034039e9074039ea0b4039eb0f4039ec134039ed1740392811082ae91b4039ee1f40396a110a2aL8;FF69067792ea179f1a3f0108f14901332aea07", + "9f1a3f01007269010c0a0b010aaaea138a1a0b118b9a5f01096a700170b2a8058d9a1f005cf26dfe56d30f159f9aBBL8;FF4a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108ab02040054092040f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8bL8;FFe92343a9", + "ea4f05f9ea5705f9eac340b9e88b05f9e80b40f9e96705f95f010071e96f05f9e8c305f9e9234429f6df05f9eacb0bb9e8970bb9e80740f9e9930bb9L16;FFd40000b4e00315aae10314aa22008052f9ba0094ed031baa5f0700b140060054f4031aaa48008052fe030daaef0314aae94f40f97102001428", + "008052e85f00f9BBBBL8;FB6f72656420737461746520656e6469616e6e657373000000741940000000000058000000000000005f0000000500000073697a652073686f756c642062652063L8;FF95860094e10317aa9386009402feff9042a02c91e10314aa9886009400feff9000a02591e3fdffd06300", + "1c9104feff9084202691a24700d1210380528e860094BL8;FF60000054606302917fe5ff97f3d352a9940200b47522009104000014940600f1b5620091e0010054a1825ff881ffffb4a00240f922008052ef0a0194f8ffff17L8;FFe8031faab70a40f957fdffb5b61640f9e803088b36feffb5e80308ab2", + "2200054b42240f9740100b4890240b22911c0da291540d2290d098b29250191891a498bBBL8;FFf5031faae9031faa0800f0f208017fb2aa1e409229010aaa68a600a9e10740f928008052680200b9410100b50c0000142965009169a200a908c48052680e00f9L8;FF6b11c0da6b1540d26b0d0b8b6b250", + "19129194b8b2905009129010aab620500542a0140b24a11c0da4a1540d24a0d0a8b4a2501914afd46d329010a8b29050091L16;FFe21f46f9e42746f9e82717a9e88745f9e97f45f9e62b46f9f62f46f9ed3346f9e8cf00f9e88b45f9f13746f9e33b46f9f03f46f9e8b300f9e89345f9e8ab00f9BBBL8;F", + "F297d2e91692902a9290080d2691bc0f2687d01a9682504a9b0660194fc9740b9f47f40b9880280d249008052dc5202290800f0f2c90200b9080540b2c80600f9L8;FF687a40f9a80000b4607e40f901f57ed342008052f86a0094688640f9a80000b4608a40f901f57ed342008052f26a0094689240f9a8", + "0000b4609640f901f57ed3BL8;FFf57b00f9f1f0ff97e17b40f9cafcff17ff8301d1fd7b03a9f65704a9f44f05a9fdc30091081c00121f090071a1010054e00302aaf30302aaf40301aad7f7ff97L8;FF9be6ff97ff4301d1fd7b03a9f32300f9fdc30091e90300aae10300f9e0430091e20b00b9e203009", + "1e10309aaf30308aab9ffff97e82340b9e007c03d681200b9BBL8;FF681040f90b3140a9081140b9e2ab03a9e92700f9692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a29a8260194fd7b47a9L8;FFeeffff17281040b96800c8376800d037c2260014b3260014b42", + "600140800403949fdffd029c12891e00301aa08711d5308410051081d7d92226968f849fdffd0L16;FF010000f90ba000b8081c00790a4000390010813c01a0813c09540079f44f48a9f65747a9fd7b46a9ff430291c0035fd648008052e91f80520840003909200039BBBBBBL8;FB2063616c6c2027c003", + "273a20c0002f636172676f2d6769742f737061727365706f73747175616e74756d726174636865742d6235386437663536653336343563L8;FF7b070091a2010054480700911f0115eb420b0054a8035ef8690700d1796a7a783f0108eb41feff54a08300d152f5ff97a0835ef8eeffff17b5035ef8a9830", + "0d1BL8;FF891a498b29050091200108ab02080054e10313aab0fcff97560300b4610a40f9680240f9b70640f91f0101eb00080054680640f9490180522a040091e00316aaL8;FF280080529a6200a9996e01a9800a803d68320039f44f4ba9fb3b40f9f6574aa9f85f49a9fa6748a9fd7b46a9ff030391c0", + "035fd620fdfff000a03291a31a0094BBL8;FF5f0314eb0206005408038052e90b40f94027089be8033aaa8802088b0805088b02f17dd3165c40a9016000919e5f0194f30f40f9940600d1740a00f9f60000b4L8;FFb50600d136a001919703138b6b0c0094e08bc13de18fc13d73a20191e293c13de387c1", + "3de10316aae08601ade07fc13de183c13de82b43f9e216803de00600adL16;FF24008052da020094760a40f9b3ffff17fd7bbda9f50b00f9f44f02a9fd03009148008052f40301aae10302aa000d002af30302aa6aecff97e00314aaa54e0094BBBL8;ZBL8;FFdba2ff97f71740f929feff17e0630091220", + "080522300805224008052d4a2ff97e11740f930feff17e0630091e10317aae20315aa2300805224008052cca2ff97BL8;FF63a03c91c4fefff084e00791a27f00916105805298fa0094ff4301d1fd7b01a9f85f02a9f65703a9f44f04a9fd430091f60302aaf30301aaf50300aa22400091L8;FFf3ffff17", + "e10300aa3f0840f2a0000054220040390202003421040091fbffff17e4db07b2e4df9ff2220040f94300048b6200228a5fc001f26100005421200091BBL8;FFe9b308b809a340b85f050071aa635478e8e30139a8135438e98300b9ea0b0179810200549f0700b180020054e84700b9e81740f9a02303d1e", + "c0f00b9eb2700f9L8;FFf7ef41f9f6f341f9e86300f9e8fb41f9faff41f9f55300f9757e42f9e85b00f9080340f9e94700f9e90742f9e93f00f9680000b4e00315aa00013fd6010740f9L16;FF1f0700b120020054380100b4e0031aaae10318aa22008052f60309aaf9030eaaf5be0094ee0319aae90316", + "aaf50000b4e0030eaae10315aa22008052f60309aaBBBBL8;FBaaf507e25709d5d09b84081a4ed735daf8a2296006a897900b70265932f53743a28c935fa54c00002c5d04c6d549f47937ce5561074fe06ce3416cbdbebdd9afL8;FF4000805241008052fa8e0094e06b00f9408200b4fb8e009440008052", + "41008052f48e0094e06700f9808100b4f58e00944000805241008052ee8e0094e06300f9BL8;FF882a00b5e1031faacaffff17e02500b5a02302d11fecff97e80301aa40010036482600b5e1031faac2ffff17e1031faae82f06f9bfffff17e1031faae8570cb9L8;FFe8fcffb008310291682602a9e10f4", + "0f981faffb4e00315aa22008052f60e0094f44f46a9f65745a9f85f44a9fd7b43a9ffc30191c0035fd620008052c1028052BBL8;FF71000014e87f41b9e90300b26343c13c6443c33c6543c23ce0630491e86300b96043c43cf7030091e8b300b9a8a64439f663049169c301f8090480526143c53cL8;FF6", + "91e0054080c47f81f0500b160180054b2feff97080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109eb28170054e4000014L16;FFe81f42f9eacb00f9ea4b42f9e92312a9e82342f9e93342f9eaeb00f9ea5742f9e8af1aa9e82f42f9eb2b42f9e8df00f9e83b42f9e8c", + "700f9e83f42f9e9a310a9BBBL8;FFe00316aae403152a48e1073649e2ffb591ffff17ff8302d1fd7b06a9f73b00f9f65708a9f44f09a9fd830191200440ad28008052f30300aae87f01a9a88300d1L8;FF7700ff97e103002ae8430691e00315aa7413ff97e8cb40f98082c53c8182c63c8282c73c1f0500", + "b1e00600ade20a803d200c0054f91300f9f9430691fbe30091BL8;FF3700805218038052a80640f91f0116eb490a0054e00313aae0fbff9720fe073728fc60d3080a00b5200840921f1800f1420a0054217c0353610a00343f040071L8;FF600200b4f35301a9f30300aa20008292e0ffeff23f0000eb881", + "40054f76303a9610e40f2f96b04a92103005460c25f3862d25f3863e25f784410001280010034BBL8;FFe09b49f9800100b4e1d342f9e8cb42f91f0101eb203f0054e8cf42f9090180522a04009109692138e1431691ead302f9a90c0094e88349f91f0500b1c0000054L8;FF000500adfc2e0094e883249", + "181830091e00319aa084100919dd5fe97bb0000b4e00319aae1031baa22008052f22e0094c082c53ce8b744f9e0074091e163c23dL16;FF1ffd01f1690b0054f61740f9610341ad630b40ada0c300d1c802018be90f40f962008052010101ad030900ad290dc0da600b42ada9831ef8630743ad69048052B", + "BBBBL8;FB550100002a00000042024000000000006a000000000000005e0100002e00000042024000000000006a000000000000006e0000002e0000004202400000000000L8;FF00000091ad92009420feff9000600291aa92009400feffb000200c91a7920094fd7bbfa9fd030091083040b9c803003408", + "0140b20811c0da081540d2080d088bBL8;FFe00308aa06fdff97e80300aae00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eba9140054088c48f81f0500b1L8;FFe95341b909290039e94b41b9092d0039e94341b909310039e93b41b909350039e93341b", + "909390039e92b41b9093d0039e92341b909410039e91f41b909450039BBL8;FF4918c0f2e87f06a9e82709a9b3520194280080927f220039680200f926000014f6031f2ae003162a0b6c01941f1c007281f8ff54e8020090081140f91f0900f1L8;FFa0fdff9000a02791a2fdff904280289121068052965", + "20094e8ff42f9e90343f9a0fdff9000e02891a3fdff9063403091a4fdff9084c02991e2833291e1068052L16;FFaf1d0013cd050091160216aa820000544a1d0091ee030daacffeff374f04f837360400b42e010debe9030054aa0500d1ac0900d1df2900f14d018052eb031faaBBBL8;FF21603f91a3fff", + "fd063bc3f91e0230091a200805244038052d9ffff17890080d2e8430039480080520900f0f2e847003928017fb2a3ffff17e00700f9a1ffffd0L8;FF080d088b0825019108fd46d30900088b3a0500915f0308eb4832005401020014e1d342f9e8cb42f91f0101eb408b0054e8cf42f9490a8052f4074091", + "94820991BL8;FF81ffffb4c00240f922008052faf60094f8ffff17680240f9c80000b40805088be00314aa0201805201f17dd3f2f60094745642a9950100b49622009104000014L8;FF0d00001440000d91240000b0030440f9069441a9dfffff17060180d2e31c80d2e50306aa461000f9e8ffff1720000", + "0b000c0079171ffff974cffff976000f837BBL8;FFe00317aa22008052fb360194e1074091e0833791023f805221800991fd360194000740ad08434079e8032179a8020090e01b843de11f843d081140f91f0900f1L8;FF08078052e96b05f9e9431a91e85705f9280080d2e96f05f9c90480524838c0f2f", + "f4305f9e94b05f9ff4f05f9e96305f9e86705f9a9320094e9830d91f6e741f9L16;FFe3235739e7fb42f9e4eb42f9e5ef42f9f5835739e9f200f8e90301aae27f43f9fc7300f9fc6f40f9ef1f40f9e13340f9e3b7803de10313adec2b4ba9e86b00f9BBBBL8;FB756c6c79206465637279707465643b206d", + "757374206861766520612072656d6f7465206964656e74697479206b657900bb124000000000003800000000000000L8;FF01feff9021000e91420080528b820014ff8300d1fd7b01a9fd430091e80301aae00700f901feff9021a00e9104feff9084200e91e3230091e00308aa22028052BL8;FFe9670b9", + "120f18f3cc082c73ce9a344f9fbbf01f9f5c301f9f7c701f90001803de9d301f9e0234ea9e3031f2ae16340f9e22340f9081940f900013fd6e03b02f9L8;FFe10316aa160300b4e0031baa22008052f9060094b80200b518000014f70400b4e02b40f9e10317aa220080523a008052f1060094b80100b510", + "000014810000b4BBL8;FF09008092e80b0aa9e8830291ff1301b9ff1b01b9e95b00f9e96700f9e97300f9e97f00f9a8031cf8000f00541b210091f6c30291fc8302913900805209000014L8;FF2007c03d0081853cfc2700f9da0000b4e0031baae1031aaa22008052f6460094fc2740f99f1b00f1030500", + "54f8430691fb0c8092e02340f9080d8052826f089bL16;FFe8b700f9e84b42f9e34b00f9eba318a9e84f42f9eb7342f9e8eb00f9e85b42f9e88f00f9e85f42f9e82714a9e86742f9e96342f9e89f00f9e86b42f9e8a701a9BBBL8;FF0900f0f229017fb24a1d4092a0c300d108010aaae81b00f9ea7343f8", + "a9233da9aaf31df8caeaff9788fffff0080919916903805268a600a92800805268020039L8;FFe3fdff540b7c0e533f0108eb7361193220010054536928380cfc5cd308050091290040f9280800f90c0200b500fc55d393000014e10300a9e00301aae10309aaBL8;FFd6ffff17890240f93f0500b1c1000", + "0549f5e00a99f7e01a9977e02a9981a00f99f3200f91f0900f1a10f0054e00313aadaf3ff9740010036410d00b5e0031faaL8;ZDBBL8;FF22008052fc260194610e40f9810000b4601240f922008052f7260194611a40f9c10000b4601e40f922008052f44f41a9fd7bc2a8f0260114f44f41a9fd7bc2a8L", + "8;FFfd26001413d041a9880240f9680000b4e00313aa00013fd6810640f9c10100b4820a40f9e00313aaf44f41a9fd7bc2a8f1260014280400d11f0d00b1c8000054L16;FFe041813ce20343ade141803ce117c03d12c21fb800c29e3c02c29d3c01c29c3ce0c3c33ce1c3c23ce2c3c13cf24f40b9018200", + "ad0202803d120a062910c20191BBBBBBBBL8;FB6f6e652d74696d65207072656b65790011696e76616c69642073657373696f6e3a20c0001c706f73742d7175616e74756d2072617463686574206572726f723aL8;FFf30300aae0630191a1e2009102328052f40303aae00701adf6430e91e213803de82b", + "00f9fba30094e0630191e10314aa1b1c0094e8a30791e0630191141a0094BL8;FFfd430091e10b00a902fffff042000e91e70305aae60304aae50303aae1030091e3230091e40302aa951f0194420700b4fd7bbba9f90b00f9f85f02a9f65703a9L8;FF1f0109eb0881899abf0400f1890080524901899a1", + "f0109eb1481899ae30314aa2d140094e80740f91f0500f120010054e80b40f9742200a9f44f43a9fd7b42a9BBL8;FF08017fb28a1e409229010aaa68a600a928008052680200b9ff030891f44f43a9f65742a9fc5f41a9fd7bc4a8c0035fd6ffc305d1fd7b11a9fc6f12a9fa6713a9L8;FF490280526a0a0", + "0f909692138b60900b4c80240b20811c0da081540d2080d088b08250191c81a488b08050091f40800b4890240b22911c0da291540d2290d098bBL8;FFb9ffff17e80b41b2e00700f9b6ffff17880080d20800f0f2080140b2b2ffff17880080d20800f0f208110091aeffff17e00300f9a1feff9021340e9", + "1a3feff90L8;ZDBBBL8;FB63655f626173655f6b657970656e64696e675f6b796265725f7072655f6b65796c6f63616c5f6964656e746974795f7075626c69636661696c656420746f2064L8;FF1f0101eb40880054e81340f9090180522a040091ea1700f909692138e16300916f91ff97e00314aa080c4", + "af81f0500b160000054e163009155a4ff97954e40f9BL8;FFfa6742a9fc6f41a9fd7bc6a8c0035fd6fd7bbea9f30b00f9fd030091f30300aaf80301942004805221008052f1030194400100b4600640ada800805208000039L8;ZFBBL8;FF2911c0da291540d2290d098b292501910819498b08050091091", + "440f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091280108abL8;FF00602391b03f009480fdff9000c02391aa3f0094ffc303d1fd7b0aa9f95b00f9f85f0ca9f6570da9f44f0ea9fd830291081c00121f090071e1010054e00302aaL16;FFeab700f9e9cb00f90a254ca9", + "eaeb00f9e99b00f90a254da9e98f00f9097140f9e92b14a90a7540f9e9c747f9ea1300f90a7940f9e9f301f9ea9f00f90aa54fa9BBBBL8;FB4700000000000000b101000012000000bb114000000000004700000000000000b30100000d000000bb114000000000004700000000000000ce0100002100000", + "0L8;FFe00313aa090140b22911c0da291540d2290d098b2925019129fd46d30801098b130500917f0209eb09290054088c48f81f0500b180200054a6030094080040b2BL8;FF29613791287968f8e10308aa8c0f0114fd7bbea9f44f01a9fd030091080040f9f30300aa1f0500b1e0030054e00313aa4000", + "0094080040b20811c0da081540d2L8;FF18fd78d328ff60d3e9db00f9e97f42f9377f08533cff78d3f9e318a9e9d700f9f803082a93010014e0d7c53de1dbc53de0431391e2dfc53de037813de13b813dBBL8;FF830c805285d6ff97e0f8ffb41e000014a06300917c620094e80300aae00301aaa8fb0736", + "180000148082c23ce8031faae9031faaea031faa200080522b008052L8;FF00610c9127e8ff97e8a75139c8000036e14741f9810000b4e04b41f922008052f5530094e89740f9ffa711391f0500b160000054e02b40f984e9ff97f3d351a9L16;FF935a01a9975a02a9f44f43a9f65742a9f85f41a9fd7bc", + "4a8c0035fd620008052e10313aa8ccf009420008052e10316aa89cf0094ffc300d1fd7b01a9f44f02a9BBBL8;FF09692138e10313aae8f9ff97e10314aa280c49f81f0500b180000054c0008052e20313aa65fdff97882e40f9680100b4090d8052812a40f9157d099be0008052L8;FFc60c00943f0700b1", + "f90b40f9e0070054e1d342f9e8cb42f91f0101eb40330054e8cf42f92a040091002302914901805209692138ead302f904240094e1431691BL8;FFfd7bc5a8c0035fd6ff8303d1fd7b0aa9f85f0ba9f6570ca9f44f0da9fd830291081c00121f090071e1010054e00302aaf40302aaf30301aad8000094e8", + "0300aaL8;FF040080124304805202008052e11a40f9000080d2d622c19a017f169b0b0600941f0400b1a0060054c10600d116ff4cd3e21a40f91500188b000700d1367c169bBBL8;FF20008052e10318aa04160094e10318aa288c43f81f0500b1e0fcff54e243169140008052fd150094e3ffff17e04316", + "9122008052fd170094e1d342f9e5ffff17L8;FFe82b40f92003803da80318f80c000014e8a744a920fdff9000c01091a1a301d1a8a738a9a8e301d1c9fdffd029611291a8a739a9a84302d1a62f0094684e41b9L16;FFa1e20091f46b40f98083813ca103963ca88318f8a90317f85f170094a00b7bad480", + "080d2a103d83ce307c13d0800f0f2f42300f9160d00914083823ce00bc13dBBBBBL8;FB6579696e76616c69642072656d6f7465206964656e74697479206b65796d697373696e672073656e64657220636861696e206b6579696e76616c69642073656eL8;FFfd030091ff4309d1f70302aae20301aae103", + "00aae0830091fa0307aaf60306aaf90305aafb0304aaf80303aa49050094e81340f91f0500f100360054e083c83cBL8;FF680240f9080116cbbf0208eb69f6ff54e00313aae10316aae20315aa03000094760a40f9adffff17ff0301d1fd7b02a9f44f03a9fd830091480001aba2020054L8;FF0418ff97f", + "90300aaf60301aae8830891e043139101810091a44700d1e20319aae30316aa1af1ff97e86b42f91f0500f1614f0054b60000b4e00319aae10316aaBBL8;FF8102188be20315aaf5ff0039015c0194e00743ade0430291e223c03da18302d1a0073eade00741ada2039e3ca0073cade00b42ada00b3dade0", + "0740ada0073badL8;FFe0dbff54c80080d20800f0f20809009101010014c80080d2f55706f90800f0f2080900d107000014e05706f9e80b41b204000014c80080d20800f0f2080500d1L16;FF090040f9280140f93f0100f9e80000b4291040393f050071e0000054000140f9fd7bc1a800001fd680feffd", + "00060159190d700949dd70094fd7bbfa9fd030091BBBL8;FFc0035fd6fd7bbea9f30b00f9fd030091010040f9f30300aa810000b4600640f922008052f47b0194610e40f9810000b4601240f922008052ef7b0194611a40f9L8;FF21800191e07f843de007c43d023f8052e82b09f9e183843de28b843de0", + "87843dfc7b0094f9431591b40000b4e00315aae10314aa22008052ef7b0094e1e34df9BL8;FF690e00f9680200f9f44f42a9f65741a9fd7bc3a8c0035fd600018052010380528cf70094e00301aac1feffd0214008916201805282f70014ff0301d1fd7b02a9L8;FFe80e003419048052f8031faafafcfff", + "05a430a911900ac720c0000148812188be1230091fa6701a9f30700f9002140a900013fd6600e003718070091a8024039BBL8;FFabb35738a99317384901084aaac35738a9a317386901084aabd35738a9b317384901084aaae35738a9c317386901084aabf35738a9d317384901084aaa035838L8;FF290", + "0009029412a91e84b03f968fdffd008211091e94f03f9c904805222008052e8eb01f9e8f301f968fdffd008611591f62309b9e9ef01f9e9f701f9e8fb01f9L16;FFfdbb0094f8ffff17d60000b4c806168be00314aa0201805201f17dd3f6bb0094fcde78b364020014f9031faa89050014f57740f959008", + "052890500145f0700b1BBBBL8;FB928400006dbe567c6ed0d7cb8272c358661d9f9e6fe7607682d223172e1b28e25b639423795d0507f0f98913489399b1a49da30cd1a7fd217d479d423f94da7dL8;FF1f05007181eaff54deffff17fb6344a9530b00d1fa2b40f9f93340f97f0214ebf63b40f91c03805", + "2a2050054480100b00841009108fddf8888020035480100b0BL8;FFe9ab05f9090200d029611591e8af05f9e8c32291a04700d1e9b705f9e9feffb029810c91e8b305f928008052e1833291e96f06f9e95706f9c9fefff029ed0a91L8;FFc0035fd6000180520103805291070094fd7bbda9f50b00f9f44f", + "02a9fd030091f30302aaf40301aaf50300aaf50b00940004805201018052ee0b0094400100b4BBL8;FFe86342a9f71b40f91f0500f121060054081f00121f0500718c01005428030035171f4092e80f41b2ea1e4092e9020aaa68a600a9e10740f928008052680200b9L8;FF080d088b0825019108fd46d3", + "08050091091c40b909050034290140b22911c0da291540d2290d098b2925019129fd46d3290500910a0840f94a0400b40b0440f9L16;FFeab343f9e0030991e9ab43f9ebcb43f981e20791e84700f9e8a743f9022f8052e04bc23df5df43f9fae343f9e86b00f9e8af43f9fceb43f9f71744f9f92344f9BB", + "BL8;FF00203d91ad67019428008052ff0f00f9ffa300a9130800b5f50800b5f9031faa3700805233000014f9031faaf50200b41f0319eb2008005448028052e86a3938L8;FFe0030054012440f9f30300aa3f0400b140010054810000b4602a40f922008052f56b0094613240f9810000b4603640f922008", + "052f06b0094b40000b4600640f9BL8;FFe08744ade00314aae22fc03da0873cade08742ada2039b3ca0873aade08b43ada08b3bade18340ada18338ade08b41ada08b39addbf3ff97a0077cad880080d2L8;FF2b7d089b0c2080f2e80300aa1f000aeba90100542e00088b004100d1cf397fa9ef010bcace", + "010bca90010fcb91010ecb0f020faa2e020eaaee010e8abf012eeaBBL8;FFa2033cade18345ade237c03da1033dada2039c3c77c7ff97e00640ade80b41b9010340f908830bb80083893c01838a3c810000b4000740f922008052ee2b0194L8;FFfc2b0094a00900b4e10314aae20319aaf50300aaff2b00", + "94572340f9b6831ef8b8431fb8f70200b4561f40f9f52b0094e00317aa21008052ee2b0094800700b4L16;FFe027c13dff0b01f96082893ce087c03dbfff3ca9682600a988f247f8a9e300d1602e803d2001c03dff6702f9ff6302f9681200f9e80340f960828c3ce033c13dBBBBBBL8;FB69616c697a656", + "4207769746820c00f20747261696c696e67206279746573000c206e6f7420666f756e643a20c0002f636172676f2d72656769737472792f696eL8;FF282700b5fa0301aa5c0700b497fb7fd3fc9f0094e00317aa41008052f59f0094602600b4930a40f9f60300aafc831ca9ffef00f9930300b4f7031faa", + "3c008052BL8;FFe0230091a20080524402805286000014c90080d2a8831d38480080520900f0f2a0c300d1a8931d38a9031df858260094e10300aa74000014c80080d2e0430039L8;FFf65704a9f44f05a9fdc3009109504039e9020037011040b9155840a9f30300aae0030091f40308aace120094e0630", + "091e10316aaca140094e1030091e2630091BBL8;FFe80741b298ffff17a1035ef8e10000b4a8835ef8f40300aa22008052e00308aaf55f0194e00314aae0bf02f981ffffb02188099183ffffb063000a91e0e31591L8;FFe92fc0f2a87f3ba9a8273ea9b35b0094e11b40f9810000b4e01f40f922008052f", + "55f0094e10f40f9810000b4e01340f922008052f05f0094f44f57a9fcab40f9L16;FFe0030091e20080526400805209000014e00300f981fefff021f4129183fefff063bc0d91e0030091e200805244008052e6e5ff97e10340f96affff17fd7bbda9BBBL8;ZBL8;FF24008052daa3ff97e11740f9b0fcff", + "17e0630091220080522300805224008052d3a3ff97e11740f9b8fcff17e0630091220080522300805224008052cca3ff97BL8;FFe10316aae20313aaf50300aa01000194020000143500805268fe4ad309088052954e00a90811c0da280108cbe90080521f1d00f10831899a29008052280908aaL8;FFc00", + "35fd60000000000000000000000002400028b0500028b5f0002f1a80700545f8000f1e80300545f4000f1c3000054261c40a98c347fa9061c00a9ac343fa9BBL8;FF61000054bfe736a9bf8317f8e1c20091a22301d140c4ff9720f1ffb41f000014a8035bb848f00737b9031bf880ffff17a22301d1830c", + "805278c2ff9700f0ffb4L8;FFf7eb41f9c90080d2f8ef41f9eae343b90900f0f2e8a30f39ece743b9e8fe48d3faf741f9f45740f935190091f9030891eb032a9198030014fb5f00f9c86d0135L16;FFc00400146183c93c6283ca3c6083c43c6383c83ce107813d6183c53ce20b813d6283c73ce0071ead6", + "083c63c6183c03ce28f1fad6283c33ce0fb803d6083c13cBBBBL8;FB23cee145a6cc973c07ac77dcd4bb4c693dd712bd0e6bfa26afed655bdac64fb23c9eed85a28c99e649fb0000c51089d1efc0ecfb514a39aa89e616d7f3568dbaL8;FF0811c0da081540d2080d088b0825019108fd46d30900088b340", + "500919f0208eb69060054e00313aa080c45f81f0500b180020054fbf8ff97080040b20811c0daBL8;FFe02bc33d0001803de02fc33d0005803de033c33d0009803de9cf05f9a88357f8080540f9882600b4a02302d119edff97f50301aa804d0037a8fe60d3c82300b5L8;FF36008052e0630091e1031faa", + "220080522300805224008052ffdb01a9ff1700f9ebebff97e81340f929068052e0030091e10313aaf61700f909010039c8040094BBL8;FFe1031faae20316aa230080522400805269dbff97f94f42f9f84b42f9b3ffff1760ffffb000e8109162ffff9042203a9161028052944b019460ffffb000403a91L", + "8;FF00203b91ad4b0094ff8300d1fd7b01a9fd430091e80301aae00700f981fdffd021003c9184fdffd084803b91e3230091e00308aa620280527e4b0094fd7b41a9L16;FFe9e300f909dc59a9e95b00f909d440f9e93f00f909d840f9e9f300f909dc40f9e93300f909e040f9e9f700f909e440f9e92f00", + "f909e840f9e97f00f909ec40f9BBBL8;FFa7ffff17e80f40f9890640f92a0108eb431d0054890240f9e00316aae30317aae403152a2801088be90b40f9882a00a9680040f9080540f9150109ebe2020054L8;FF692841a9e08705a9a00700d1e1230091ebb302a9ffa700a929008052eaff01a9e9230a29a", + "d6b0094fd7b47a9ff030291c0035fd6ff0302d1fd7b07a9fdc30191BL8;FFe00302aaf30302aaf40301aae3fcff9720020037750240f9a80640f9160101eba2020054e80f41b2e81300f907000014c90080d248008052e0a300390900f0f2L8;FF5f00016b6bfcff548100010b5f00016b0afcff54011040", + "f93fcc74f2c102005463e00b91bf1040f20000805262786678423c7cd3e10100543fcc74f2a0010054BBL8;FFdf0a00b100040054e1d342f9e8cb42f91f0101ebe0530054e8cf42f92a04009180c202914901805209692138ead302f9eb1c0094e1431691a70d0094e0a349f9L8;FFff0316b9e84b00b93b", + "2a0094e80356b9e00740918100805200001891ff0316b9e84700b9342a0094e80356b9e00740918100805200001891ff0316b9e84300b9L16;FFe023009101f18f3ce867099102f18f3ce827099100f18f3cfeaf009468e20791e02300917c200094e0630691e123009102328052f7af0094e1630691e003", + "13aaBBBBBL8;FB38000000000000004a0100000a000000bb12400000000000380000000000000050010000090000006d697373696e672072656d6f7465206964656e7469747920L8;FF3f09007149819f9a290100b43f0500f1e102005408fefff008413a91e00301aae10308aa8202805285930014ffc30", + "0d1fd7b02a9fd830091200440a909000090BL8;FFe80308abc2010054090840f9090100b42a0140b24a11c0da4a1540d24a0d0a8b4a25019129194a8b29050091200108ab62000054fd7bc1a8c0035fd600ffff90L8;FFf67b02f9fa7f02f9060b0094ba0000b4e00316aae1031aaa22008052f6170094bb", + "0000b4e00319aae1031baa22008052f1170094e043139121008052c90a0094BBL8;FFff3f0339e9235f29a0033dad088109aa29008092a0033eada003da3ca103db3ca203dc3ca303dd3c080dc0dae333803de22f803de12b803de027803d692200a9L8;FFf46b41f9e03f813de143813de91305b9680000", + "b4e00314aa00013fd6210740f9810000b4220b40f9e00314aaf25700949f0b00b14102005435030036e0a350a9L16;FFd50e0091750a00f9d70000b594fe55d3680240f9bf0208ebc104005423000014680240f9897e1553bf0208eb3961193261000054e00313aa4dd20094680640f9BBBL8;FFe20313aa", + "e303162a84faff97f70300aa00f6ffb4be000014e00313aa7a860094f70301aac0f80736b90000145f2800f1880000542800028b08f1df38680ff837L8;FF7622009104000014b50600f1d6620091a0150054c1825ff881ffffb4c00240f922008052f4770094f8ffff17e80740910881099100210291ed0", + "b0094f4b749f9BL8;FFf44f42a9f65741a9fd7bc3a88c02001400200091f44f42a9f65741a9fd7bc3a814030014e80300aa098d40f83f0500b1a0000054f30300aae00308aa48030094L8;FF610080d2030080d2040180d2ffff03a9e75300b9e65b00b9010000d4e1fcffd021a00b916001f83612000014", + "e1834ca93f0000eb61fdff54e08f40f920fdffb5BBL8;FFe0f3863de8eb0df9fb370194e00314aa0104805222008052f7370194e8074091e00319aa0178805208812f9147ad0094e8f34df91f0900f1203c0154e0074091L8;FF21203f910202805263fdffb063801991a4028052af000014c80080d2e023", + "2a39e0032a910800f0f2ff272a39e84305f9573eff97e10300aae14305f9e0032a91L16;FF37008052fc7740f97c0500b4fdb70094e0031caa21008052f6b70094005900b4e10319aae2031caae05f00f9f9b7009423000014f60314aa3a008052892000b4BBBBL8;FB6669636174696f6e206661696c656", + "400a71a400000000000340000000000000017010000110000006c69627369676e616c5f70726f746f636f6c3a3a74726970L8;FFe8cdffb572feff1700feff9000800c9102feff9042e00c91e102805294830094e2fdfff042202291e10319aa9383009400018052012080528783009402feff90BL8;FFf8", + "5f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd6404fc03da80359f84003803de8f304f9e89740f91f0500b121f7ff54baffff17e89348b9208757adf7e342f9L8;FF08018052f5430c91e9fb01f9c9fcffd029e13991e88f01f9e8a301f9e8b701f9e8cb01f9e8df01f9e8f301f9e80702f9e90f02f9c9008", + "052e81302f9e81b02f9BBL8;FFff7f04a9a80f00f9010800b4e20301aa16210091f5c30091f783009109000014a1620091a26300913bccff97601800b5b70f40f9f60317aac28e40f8621200b4L8;FFea0740f9e81740f92015c03df87f00f9eaa30ea9e89341f98082823ce8bf00f972ffff1788fdffb00", + "8610c9189028052e86301f9e96701f9f2feff172143c23cL16;FFeb3b44f9e9a310a9e8fb43f9e90744f9e8b700f9e8ff43f9eaa318a9e80344f9ea0b44f9e8eb00f9e81344f9e82b14a9e81b44f9ea1744f9e92313a9e81f44f9BBBL8;FFa100f8b6f9031faae00319aae10316aa91630194fa0300aa960", + "200b4f9670194e00316aa2100805239008052f1670194c0feffb4e1031aaae20316aaf70300aaL8;FFe20314aa1a070094770a40f9680240f9080117cb9f0208eba9fbff54e00313aae10317aae20314aa11070094770a40f9680240f9080117cb9f0208eba9faff54BL8;FFe00300f9a1feffb021681391", + "a3feffb063301491e00300914201805244018052e5ffff17e00300f9a1feffb0218c149183fefff063900291e0030091c2008052L8;ZDBBL8;FF0428019418000014e8ef41f9080f00b4e9f341f9e80302f9e8830591ea0310912b0000906bc104911a0380d200ffffb000b82f9108210091e1430691ea2f", + "19a9L8;FFfd03009114d440a9f30300aa350200b49682009104000014b50600f1d6c2009180010054c1025ef8810000b4c0825ef822008052f0270094c1825ff8e1feffb4L16;FFf3031f2afb031faa3a000014e00313aae10314aa22008052f3030caaf6a70094ab835ff8ec0313aae0c20191f40740f9f", + "a0000b4e0030caae1031aaa22008052BBBBBBBL8;FB6372656174656420617420c00129001b737071722076312e73656e645f63742e726563762065706f636820c0243a20456b526563656976656443743153616d70L8;FFe0031a2ae1031b2a280340391f05007181f8ff54ddffff173f0014eb3c30949a", + "fc0500b4f4031f2a35feff90b5c20a91ba4300d136feff90d6620b9105000014BL8;FF0a060094e10340a92aa040a9536928380cfc5cd308050091290040f9280800f94cfeffb40a7c15533f0108eb53611932200100542a0440f90bfc63d353692838L8;FF21a1009190120094f96343a9f55b44a93f0b0", + "0b1e1020054760300b4e8c30091e00315aae10316aa9db3fe97f91b40f93f0b00b1c1070054e8fb4039e97b4079BBL8;FFba035df8e90313aa480317cb7f0208eb89030054a0c300d1e10317aae20309aa2300805224008052f30309aa62edff97b7035ef8ba035df8f52b40b9f44f40b9L8;FFe802158b6", + "80a00f9951640f9550300b4610a40f9680240f9941240f91f0101eb40070054680640f9490480522a040091e00315aa6a0a00f909692138e10313aaBL8;FF217c0353410a00343f0800718d0100543f0c0071200300543f100071800300543f1400710105005481c20091e20313aaf6edff97200400b46d0", + "000143f040071L8;ZDBBBL8;FB0e00000000000000ec0000002c0000006368756e6b2073697a65206d757374206265206e6f6e2d7a65726f7369676e65642d7072652d6b6579736f6e652d7469L8;FFe1630091768fff977f0600b18000005480220291e163009154a4ff97df0600b160afff54e26300916", + "0008052c7000014e8031faa000116abc2660054e1630091BL8;FF15170194886e4039696e4039b502000a1f01096be0179f1a0f1701948872403969724039b502000a1f01096be0179f1a091701948876403969764039aa02000aL8;ZFBBL8;FF200440a9e8230091090000b029110091e82701a942ffff9", + "042542c91e3430091923d0194fd7b43a9ff030191c0035fd6082000910930009142ffffb042602091L8;FFfd7b42a9ff030191c0035fd6e0031faa913d0094e00741a98f3d0094fd7bbaa9fc6f01a9fa6702a9f85f03a9f65704a9f44f05a9fd030091ff8331d1ff0300f9L16;FFe8f700f9f0008052e303", + "02aaebcf40f9ee174da9e97b4ca9e7cf00f9e8d740f9e0b3c23dedb300f9fa5740f9f44b40f9ea2312a9e88740f9f18700f9eadf49a9BBBBL8;FB689b06f003786d130000688f04b200006c3d0100a521526fb8ea3c622b414cc4421a38ebf616b7af742505cca14734f2ca579cb3e1e6cf99bfbb7dfad97", + "134f2L8;FFf40314abe2020054688e4bf81f0500b140020054e00313aaae010094080040b20811c0da081540d2080d088b0825019109fd46d30800098b080500911f0109ebBL8;FFe96700b9fa2f00f9e0100054e8830291e0c3179101a1049127f7ff97e082c23ce182c33ce282c43ce8fb42f9e0db823d", + "e082c53ce1df823de182c03ce0e7823dL8;FF08008092880200f9b50000b4e0df40f9e10315aa22008052f7110094b80000b4e00316aae10318aa22008052f2110094e15341f9810000b4e05741f922008052BBL8;FFa0833bada003d53ca103d63ca203d73ca303d83ce323803de21f803de11b803de017", + "803d785200b9e20f41ade413c03de10340ada403993ca28f3bada1833aadL8;FFd80100b5c3ffff1737008052591740f9b7831ff859fcffb535008052572340f9b6831ef8b8431fb877fdffb534008052582f40f9f8f6ffb4532b40f9f1510094L16;FFfdd10094e10313aa28d440f9e80000b420d840f9f", + "30301aae10308aa22008052f5d10094e10313aa28e040f9e80000b420e440f9f30301aae10308aa22008052BBBL8;FFe20317aa23008052240080526afdff97790a40f9680240f9080119cbff0208eba9ceff54e00313aae10319aae20317aa23008052240080525ffdff97790a40f9L8;FFe20318aa1a11", + "0094fad342f9e8cb42f908011acb1f0308ebc9000054e0431691e1031aaae20318aa11110094fad342f9fc0740919c830191dffdff17f80300aaBL8;FFc0035fd6f30300aae00301aaf40301aae10309aa220080522300805224008052d3150094880a40f9e00313aae10314aaedffff17e10300a9e00301", + "aae10309aaL8;FFf35341a9fb7345a9f8feff171f4002f10130009119fc44d3a90300542007009125c59c5265eda072e4fcffb0027c025384600d914204402a43e30b914208422aBBL8;FF28040091f67749f9e8d302f9df0600b1a032005480220291781c0094080040b20811c0da081540d2080d088b08", + "25019108fd46d30900088b3a0500915f0308ebL8;FFf5e742f9f4e342f9e8e3163949008092a80240f9690200f9680000b4e00314aa00013fd6a10640f9810000b4a20a40f9e00314aaf0310094e8a340f91f0500b1L16;FF81ad0094e843009145feff90a5802391e1c3099102210191e0031f2ae3031fa", + "a79ad0094ff4303d1fd7b09a9f85f0aa9f6570ba9f44f0ca9fd430291283c40f9BBBBBL8;FB5f636970686572746578742063616e2062652070726573656e74000000000000560b40000000000075000000000000005c0000001c000000496e76616c69644cL8;FFe923009103feffd063c00a9104feffd0", + "84600b91f303002a00210091f403022aa2630091f503012a21008052e80700f9a90f00f97b950094e103152ae003132aBL8;FF9515019420008052e10315aa9215019400018052e10313aa8f150194fd7bbfa9fd030091083c40f9080100b4080140b20811c0da081540d2080d088b08250191L8;FF08e14", + "0f8d90280520000803d08e000f8c8028052e88319a9e16b42f9c10000b4e0031baa22008052fb030caaf2190094ec031baaff0600b1e00300543f1300f1BBL8;FFe00702ad0080c13c0180c23c16a840b9e83300f9e00700ad0080c33ce00b01adf85901940004805221008052f1590194801200b4600644", + "adf50300aa811a40f9L8;FFe237c13de0031791e3833291e4c31791e2008052e07f813de183813de287813d9ff9ff97f3f742f9e8ef42f97f0208eb61000054e063179123f8fe9708068052L16;FF59ffff17e1031faae8e700f956ffff1740eeff54bc010014c0c200910830009472ffff17e8af40f9140", + "101eb02010054e7000014c1720091a2c303d1e2e8ff97BBBL8;FF2200805223008052240080526a050094e10340a92aa040a9290040f91f1040f15369283808050091280800f903feff540b7c07533f0108eb6b61193200010054L8;FF080040b20811c0da081540d2080d088b0825019109fd46d3080009", + "8b080500911f0109eb68000054fe040014e8031faa160114ab020d0154f47349f99f0e00b1BL8;FF031101a9690a00f9f44f43a9f65742a9f85f41a9fd7bc4a8c0035fd6e00313aaf50304aaf70303aaf60302aaf80301aa06000094e10318aae20316aae30317aaL8;FFf2ffff17e8830091090000b029b", + "10091a8a73da9e8030091a1fcfff02134279100210091a2a300d1f7fcff9728008052e80300f91c000014e003152ae00c0094BBL8;FF8a2e49299682003980a20191e10300910809c05a2909c05a9f9202f8882600294809c05a6b09c05a892a4a29882e0129220080529f1202f82809c05a4a09c05aL8;F", + "F21a03891020180520209803d000500ad82050094f6e741f9e8df41f9df0208eb61000054e0e30e9127d8fe97e8e341f909068052c822099be9030891200543adL16;FFeaef43f9e00717ade02bc23de10fc23de9a301f9e97740f96b114df8e00b18ade213c23de417c23de95300f9eccb43f9e00bc23de", + "18b14ade11bc23de31fc23dBBBBL8;FB85094000000000004d000000000000001800000026000000413242423241000042024000000000006a00000000000000120100002e0000004202400000000000L8;FFf44f45a9f65744a9f85f43a9fa6742a9fc6f41a9fd7bc6a8c0035fd608fd41d3f6031faa180", + "38052f9230191170500910a000014a80640f9d60600914a070091BL8;FFc1825ff881ffffb4c00240f922008052f9090194f8ffff17e057c13de15bc13de87345b9cfffff17e89340f9c80000b40805088be00313aa0201805201f17dd3L8;FFe0230091e10308aa020180522300805224008052eee5ff97", + "e92341a98cffff1700fdfff000c00991a4050094ff8302d1fd7b06a9f73b00f9f65708a9f44f09a9BBL8;FF345341b9285741b9e83f00b9550500b4363740f9fb490194e00315aa21008052f4490194e00b00b4e10316aae20315aae01b00f9f7490194364740f9560400b4L8;FFe8070036e00301aaf44f", + "45a9f52340f9fd7b43a9ff830191c0035fd68000805206000014e00313aa6a050094e80300aae00301aaa8fe0737680240f9090540f9L16;FFeb1342f9f96b42f9ec6f42f9e84700f9e8ef41f9fe7342f9e78342f9e08742f9e68b42f9e86b00f9e8f741f9f08f42f9e2a342f9faa742f9e4af42f9e8e700", + "f9BBBL8;FF006a01940004805221008052f9690194c02300b4e00745adf60300aa1f0317eb000400ad82250054080d80521353089b94070011612640f93f0400f18b000054L8;FF611240f9810000b4601640f922008052f9690094611e40f9810000b4602240f922008052f4690094612a40f9810000b46", + "02e40f922008052ef69009460c20191BL8;FFc1010054e1031faab2ffff17880080d2e10700f90800f0f2aaffff17e80b41b2e00700f9a7ffff17880080d20800f0f2080140b2a3ffff17880080d20800f0f2L8;ZFBBL8;FF2183cd3ce81f00f9e81b40f92283c33ce0e3009160838c3c2083ce3cc1e2009", + "161838d3c2183cf3cfc030b9160838e3c2083c83c61838f3c2183c93c6083883cL8;FF042a0094e08759ade0830d91e2d7c03de1030e91e00b813de10f813de08757ade213813de0071fade08b58ade003813de18355ade207813de1031dade08b56adL16;FF0209803d021900f9fd7b41a9ff8300915eb1", + "ff1725feffd0a5a02891e1230091e2030091e0031f2ae3031faa76a5009420feffd000402891a0a50094ff0301d1BBBBBBL8;FB436861696e4b65797265717569726564000000000000000020000000000000006f766572666c6f77617574685f6b6579626173655f6b657973657373696f6e73L8;FFf3ff", + "ff17f5e703a9ff2700f9f50b40f9e80340f9bf0208eb01faff54e003009195980094cdffff17e00740ad60220091e20bc03de81b40f9800600ad820a803dBL8;FFe00313aa2200805208020094610a40f9e00315aae3ffff17fd7bbca9f85f01a9f65702a9f44f03a9fd03009148008052f50301aae10302", + "aa000d002af30302aaL8;FFa08300d1e103172ad610009428008052ff2b00f9a18300d1ff2304a9e2030191e0031aaa3bf4ff97350080929c000014e89f4139e9534678a1035ef8fc834139BBL8;FFf6e740a9b9f9ffb5e90319aba3fbff5480ffff9000c03b91a859019428008052ff0600b1ffc300f9ff", + "2317a9a10c0054d90700b42807198bf4c340f9da420091L8;FFe0ff44f922008052fb5d0094e0c31791e1833291022b8052fe5d009460030291e1c3179123fefe9754050014c80080d2a1fdffd021581e910800f0f2e0031791L16;FF09692138e10313aa75ebff97760a40f9680240f9080116cb9f0208e", + "b08080054680640f9e10315aae20314aa0001168bf8dd0094c802148b680a00f9f44f43a9BBBL8;ZBL8;FF0083c23cf54f09f9e84b09f9f57749f9fb6709f9f46b09f9f47349f9e0a3843de0a7c43d4383c63ce85309f9e2a3c43df95709f9f75b09f9e1abc43df95f09f9BL8;FFf65741a9fd7bc3a840fe", + "ff1780fcff97fd7bbda9f65701a9f44f02a9fd03009115fcdfc8f40302aaf30301aaf60308aab5010037a142009120008052bef90094L8;ZFBBL8;FFe82340391f050071e1000054e84340391f0500714c04005428050035e90f41b230000014e99340b8ea0f40b9e093c33ca91b00b9e92341b8aab301b8", + "ea2f4079L8;FFe00316aae1031caa22008052fa3d0094f64740f9e16340f9810000b4e05b40f922008052f43d0094b60000b4e03f40f9e10316aa22008052ef3d0094e83b40f9L16;FFe60309912381c83ceabb43f9fa6b00f9e28716ad2181c93c2281c33ce7bf43f9f5a35d39e24344f9e38715ad2181c", + "43c2381c63ceb4744f9f64b44f9f84f44f9BBBBL8;FB11b800000000000000000000000000000000000000000000000000000000056bda5e01003010df98e7bf90f48e9e0000c2ab2e6a237900000d13000000000000L8;FF41008052fb8d0094a06600b468008f52130303a9080800796800af52080000b", + "968008052e80f00f9132300f933fb7fd3f48d0094e00313aa41008052ed8d0094BL8;FFe3feffd063441b9174000014c80080d2e0a33239e08332910800f0f2ffa73239e85306f95a140094e80300aae0833291e1feffd02178129142028052e3feffd0L8;FFc00200b408fdfff0083d3e9109fdfff029cd", + "3d91cb0080520a0140f9e92f02a9086140f8c9018052e00bc03d0a0000f9086000f8e80741b2600a803d682600a9BBL8;FF4a1900120ae10a8b4afd09aa5f0108eba3040054e00740f9480180520aa000a91f0000f9fd7b44a9ff430191c0035fd6e80741b2e0430091e80b00f954540094L8;FFf30300aa", + "c80a0034080140b20811c0da081540d2080d088b0825019108fd46d315050091681a40f9080a00b4080140b20811c0da081540d2080d088b08250191L16;FFf5ef40f9fa8740f9e0c7c33da8008052f80306aae87300f9e60302aaea0314aae0f3803df00300aae0030eaaf9031baaef0303aaf10304aaeb", + "08001408234039BBBL8;FFa8ffffb008010e91090480524f000014a8ffff9008313891890280524b000014a8935cb88a5e40f9a9c35cb8b8af7da9b9035df85f8100f1a88317b8a8835e38L8;FFa80358f81f0500b120120054e082c13ce80700f9e8030b91f7430f91f89301b9e91740f90029803da8835", + "af8e0430691e10244ade1830d91e8bb01f9a8e378a9BL8;FF500200143f0900b1400e0054880080d20800f0f23f0108ebc10d005481220091e20313aa060b0094f50300aa450200143f0900b1800f0054880080d20800f0f2L8;FF7f0200eb330100b4c000005421400091fbffff17000000f013285d3906", + "000014330440f9040000140bf7ff9741008052010000b9e00313aaf30b40f9fd7bc2a8BBL8;FFa0290194e04316912200805207120094e1d342f942faff17f60300aae04316912200805201120094e1d342f9e00316aac6f9ff17f60300aae043169122008052L8;FF810000b4e0e744f922008052fa2d00", + "94e81750a9e00314aae20743b9e10343b9e61341b9033940b9e8030291046108914ac8fe97e88340f9e00314aa016940b9L16;FFe03fc13de1230991e12fc13de82701f9e00a11ade033c13de28fc03de93301f9e1020fad8282803c4ffeff97e027c13de12bc13de0230b91e22fc13df56b42f9BBBBBL8;", + "FB000000000000000000000000000000000000000000000000353d4000000000003e3d400000000000000000000000000008c9bcf367e6096a3ba7ca8485ae67bbL8;FFaa031638aa3356382901084aab131638ab435638a9231638a95356384a01084a6b01084aaa331638aa6356382901084aab431638a", + "b735638a9531638a9835638BL8;FF3f0500716102005469aa4829c9030034290140b22911c0da291540d2290d098b2925019129fd46d3290d00910a0300344a0140b24a11c0da4a1540d24a0d0a8bL8;FF00401d9161620491e4830c9143038052f41700f9f5d700f9ce040094e8ab4bf91f0900b1214000", + "54e8cb41b9c836003436008052f31b00f9df02086be0431391BBL8;FFaa031cf8e9dbff97b9035cf8a8035bf8080119cb7f0308eba82100541b0100b4a8835bf8e10f40f9e2031baa0001198bf855019439031b8bb9031cf8f66740f9L8;FFe86b08b9e8c742f9e9db1079e9cb42f9aa0318f8ac8318784b", + "650036ea6b48b9ebdb5079ece20b91e04341f98a0100b90afb0b918b090079eb630191ac0358f8L16;FF1f0500b1a1380054f95b4bb9b9031db8e8010090081140f91f0d00f1c3020054a8c300d18900009029711391e8ab05f968fefff008810291e9af05f989008052BBBL8;FF0001178b03760194e802", + "158b680a00f9882240f9a82000b4090d8052941e40f9590480521851099b5b0380525c0280521a0180520b000014680640f9e10316aaL8;FF5f0308eb681c005406010014e1d342f9e8cb42f91f0101ebe0700054e8cf42f9490b8052f4074091948209910969213828040091f69349f9e8d302f9df0a00b", + "1BL8;FFfd030091010040f9f30300aa810000b4600640f922008052f7f50094610e40f9810000b4601240f922008052f2f50094611a40f9810000b4601e40f922008052L8;FFc028537aadfdff548318003502290091807862f81f0013eb41f7ff54bf00001400290091340000b081020e917f0204eb2078", + "60f880fcff54620240f981020e91BBL8;FFe8eb06f9e06b833de167833d27000014e01bc43de83b48f96082803c09008092680e00f9e0430691690200f9bb100094a80600d11f0900b163010054ab000014L8;FFb631009453000014e08324910ff0ff97e1eb41f9f9030891f8830d913f0400b1a0150054", + "fb5f40f9810000b4e0ef41f922008052f0350094e8430f9100810091L16;FFead341f9e9df41f9e82300f9e8cf41f9f50309aaeaa30da9e8c741f9e85b00f9d70000b4e00318aae10317aa22008052f1b50094e90315aae1f341f9a10000b4BBBBL8;FB4c656e677468546f6f4c6f6e6753657269616c697", + "a6174696f6e496e76616c6964000000000000003d0f4000000000004a00000000000000b602000009000000L8;FFc1030054e8031faa28000014e9031faa8a2a80b96afbff35ea031faa8b1a40b97f05007120fcff54eb031faa050000144b008052ecfcff35ec031faa8b010b8bBL8;FFf7cb42f9c80240", + "f9f43b42f940818f3ce9e304f9680000b4e00314aa00013fd6c10640f9810000b4c20a40f9e00314aaf10501947f0b00b141050054e8630191L8;FF940600f139c300912002005421035ef8810000b420835ef822008052f605009421835ff8e1feffb4200340f922008052f1050094f3ffff17eb031f2af", + "6030daaBBL8;FFe0c30291ecbb0729ed3300b9eb2b02a9e90b00f9e81f00b9e12b00f9ccc9ff97e8c30291e0031aaae10318aafa2700f954400094e8c34239a8010036e8e34239L8;FF810640f9c10100b4820a40f9e00313aaf44f41a9fd7bc2a8f7450014280400d11f0d00b1c8000054000440f922008", + "052f44f41a9fd7bc2a8ef450014f44f41a9L16;FFe7af40f9e9b700f9e9c740f9edfb48a9e8ab18a9ea5340f9e22f40f9e98b00f969018052e0f3803de193803df1d300f9f10317aaf44300f9ed6b00f9ed0310aaBBBL8;FF010480529461019482fffff042401891e0031faae10315aaad610194fd7bbda", + "9f50b00f9f44f02a9fd030091089440f9f40302aaf30300aaf50301aa1f0500f1L8;FF57fdff97200700b4fa0000143f0c0071000700543f100071210500541f0900f1a1210054e00313aaff6b00b9ffdf00a9df7e01a9dffe02a9f71700f9f72300f9BL8;FF080a00b5080840921f1900f1a20a0054017c", + "0353010d00343f04007161fdff54890240f93f0900b161000054970200f99f1a00f91f0900f1e10c0054e00313aaL8;ZDBBL8;FFfd250194689e40f9a80000b460a240f901f57ed342008052f725019468aa40f9a80000b460ae40f901f57ed342008052f125019468b640f9e80000b460ba40f9L8;FF620", + "d0054aa0217cba8831cf8a8c300d1a02301d1a9ab3ba9c429ff97a8035ef8b7031ff8140117eba3080054b8237da9b6835ef81501178b680240f97f0a00f9L16;FFc10a44a9e0230091e30315aabbfcff97c86a40b90901172b021600543f01146b63feff54c13240f9ca2a40f9f90b40b9480101cb1f0d0", + "0f12902005428100091" ] end Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseLines9 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseScalarsHooks.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseScalarsHooks.lean index 8912567bd..cb778187a 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseScalarsHooks.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/BaseScalarsHooks.lean @@ -31,9 +31,9 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.BaseData (baseHooks) set_option maxRecDepth 4000000 in set_option maxHeartbeats 1600000 in theorem base_scalars : extractElfScalarsAndOkPlaced mutantMpl mutantMmpl mutantCliElfImage = some ( - 0x49c010#64, 0x3ff040#64, 11, 0x4a4000#64, -- layout-bypass: concrete-mutant-trace-checkpoint - 0x49a038#64, 0x49a040#64, 0x49e418#64, 0x49e419#64, -- layout-bypass: concrete-mutant-trace-checkpoint - 0x49e4fc#64, 0x49e4fd#64, 0x49e4f8#64, 0x49e4f9#64) := by rfl_kernel -- layout-bypass: concrete-mutant-trace-checkpoint + 0x46a000#64, 0x400040#64, 7, 0x471000#64, -- layout-bypass: concrete-mutant-trace-checkpoint + 0x46f000#64, 0x46f008#64, 0x46bbfc#64, 0x46bbfd#64, -- layout-bypass: concrete-mutant-trace-checkpoint + 0x46bce0#64, 0x46bce1#64, 0x46bcdc#64, 0x46bcdd#64) := by rfl_kernel -- layout-bypass: concrete-mutant-trace-checkpoint set_option maxRecDepth 4000000 in set_option maxHeartbeats 1600000 in diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call0.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call0.lean index 4d5ed926b..aab3d78df 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call0.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call0.lean @@ -22,20 +22,20 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C2 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C4 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q1q3L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q1q3R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q1 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q2q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q2q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q2q2L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q2q2R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q2 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C6 @@ -45,40 +45,40 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C9 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C10 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q0q1L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q0q1R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q3q3L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q3q3R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C12 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C13 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q3q0L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q3q0R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q3q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q3q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q1q0L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q1q0R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q1q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C15 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C16 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C17 @@ -110,20 +110,23 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C42 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C43 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C44 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C45 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C46 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C46q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C46q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C46q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C46q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C47 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C48 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C49 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C50 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C51 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C52 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C53q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C53q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C53q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C53q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C53 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C54 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C55s0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C55s1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C55s2 -/-! Chained `106`-chunk `cliRunPlacedSig` proof (`wsRun0`) for `Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0`. -/ +/-! Chained `109`-chunk `cliRunPlacedSig` proof (`wsRun0`) for `Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0`. -/ @[expose] public section @@ -149,20 +152,20 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C2 (c2) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C3 (c3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C4 (c4) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q0 (c5q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q0 (c5q1q0q0q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q1q0 (c5q1q0q0q1q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q1q1 (c5q1q0q0q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q1q2 (c5q1q0q0q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q1q3L (c5q1q0q0q1q3L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q1q3R (c5q1q0q0q1q3R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q2 (c5q1q0q0q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q0q3 (c5q1q0q0q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q1 (c5q1q0q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q2 (c5q1q0q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0q3 (c5q1q0q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q0 (c5q1q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q1 (c5q1q1) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q2 (c5q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3 (c5q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q0 (c5q1q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q0 (c5q1q3q1q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q1 (c5q1q3q1q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q2q0 (c5q1q3q1q2q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q2q1 (c5q1q3q1q2q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q2q2L (c5q1q3q1q2q2L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q2q2R (c5q1q3q1q2q2R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q2q3 (c5q1q3q1q2q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q1q3 (c5q1q3q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q2 (c5q1q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q1q3q3 (c5q1q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q2 (c5q2) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C5q3 (c5q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C6 (c6) @@ -172,40 +175,40 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C9 (c9) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C10 (c10) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q0 (c11q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q1 (c11q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q0 (c11q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q1 (c11q2q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q2 (c11q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q0 (c11q2q3q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q0q0 (c11q2q3q1q0q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q0q1L (c11q2q3q1q0q1L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q0q1R (c11q2q3q1q0q1R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q0q2 (c11q2q3q1q0q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q0q3 (c11q2q3q1q0q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q1 (c11q2q3q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q2 (c11q2q3q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q1q3 (c11q2q3q1q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q2 (c11q2q3q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2q3q3 (c11q2q3q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3 (c11q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q2 (c11q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q0 (c11q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q1 (c11q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q2 (c11q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q0 (c11q3q3q0q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q1 (c11q3q3q0q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q2 (c11q3q3q0q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q3q0 (c11q3q3q0q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q3q1 (c11q3q3q0q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q3q2 (c11q3q3q0q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q3q3L (c11q3q3q0q3q3L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q0q3q3R (c11q3q3q0q3q3R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q1 (c11q3q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q2 (c11q3q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C11q3q3q3 (c11q3q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C12 (c12) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C13 (c13) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q0 (c14q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q1 (c14q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q0 (c14q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q1 (c14q2q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q0 (c14q2q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q0 (c14q2q2q1q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q1 (c14q2q2q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q2 (c14q2q2q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q3q0L (c14q2q2q1q3q0L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q3q0R (c14q2q2q1q3q0R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q3q1 (c14q2q2q1q3q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q3q2 (c14q2q2q1q3q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q1q3q3 (c14q2q2q1q3q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q2 (c14q2q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q2q3 (c14q2q2q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2q3 (c14q2q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3 (c14q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q2 (c14q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q0 (c14q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q1 (c14q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q0 (c14q3q2q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q0 (c14q3q2q1q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q1q0L (c14q3q2q1q1q0L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q1q0R (c14q3q2q1q1q0R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q1q1 (c14q3q2q1q1q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q1q2 (c14q3q2q1q1q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q1q3 (c14q3q2q1q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q2 (c14q3q2q1q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q1q3 (c14q3q2q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q2 (c14q3q2q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q2q3 (c14q3q2q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C14q3q3 (c14q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C15 (c15) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C16 (c16) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C17 (c17) @@ -237,18 +240,21 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C42 (c42) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C43 (c43) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C44 (c44) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C45 (c45) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C46 (c46) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C46q0 (c46q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C46q1 (c46q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C46q2 (c46q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C46q3 (c46q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C47 (c47) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C48 (c48) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C49 (c49) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C50 (c50) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C51 (c51) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C52 (c52) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C53q0 (c53q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C53q1 (c53q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C53q2 (c53q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C53q3 (c53q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C53 (c53) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C54 (c54) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C55s0 (c55s0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C55s1 (c55s1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0.C55s2 (c55s2) theorem wsRun0 {mpl mmpl : MultiPlacement} {elf : ElfImage} (hv : ElfFullValidPlaced mpl mmpl elf wsSpec) : @@ -257,6 +263,6 @@ theorem wsRun0 {mpl mmpl : MultiPlacement} {elf : ElfImage} cliRunPlacedSig_of_elfFinalChunk hv (fun name => congrArg (cliExternsPlacedSig mmpl · name) compHooks0_placed_eq) wsInp0_eq rfl - (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4).step c5q0).step c5q1q0q0q0).step c5q1q0q0q1q0).step c5q1q0q0q1q1).step c5q1q0q0q1q2).step c5q1q0q0q1q3L).step c5q1q0q0q1q3R).step c5q1q0q0q2).step c5q1q0q0q3).step c5q1q0q1).step c5q1q0q2).step c5q1q0q3).step c5q1q1).step c5q1q2).step c5q1q3).step c5q2).step c5q3).step c6).step c7).step c8).step c9).step c10).step c11q0).step c11q1).step c11q2q0).step c11q2q1).step c11q2q2).step c11q2q3q0).step c11q2q3q1q0q0).step c11q2q3q1q0q1L).step c11q2q3q1q0q1R).step c11q2q3q1q0q2).step c11q2q3q1q0q3).step c11q2q3q1q1).step c11q2q3q1q2).step c11q2q3q1q3).step c11q2q3q2).step c11q2q3q3).step c11q3).step c12).step c13).step c14q0).step c14q1).step c14q2q0).step c14q2q1).step c14q2q2q0).step c14q2q2q1q0).step c14q2q2q1q1).step c14q2q2q1q2).step c14q2q2q1q3q0L).step c14q2q2q1q3q0R).step c14q2q2q1q3q1).step c14q2q2q1q3q2).step c14q2q2q1q3q3).step c14q2q2q2).step c14q2q2q3).step c14q2q3).step c14q3).step c15).step c16).step c17).step c18).step c19).step c20).step c21).step c22).step c23).step c24).step c25).step c26).step c27).step c28).step c29).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53q0).step c53q1).step c53q2).step c53q3) c54 + ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4).step c5q0).step c5q1q0).step c5q1q1).step c5q1q2).step c5q1q3q0).step c5q1q3q1q0).step c5q1q3q1q1).step c5q1q3q1q2q0).step c5q1q3q1q2q1).step c5q1q3q1q2q2L).step c5q1q3q1q2q2R).step c5q1q3q1q2q3).step c5q1q3q1q3).step c5q1q3q2).step c5q1q3q3).step c5q2).step c5q3).step c6).step c7).step c8).step c9).step c10).step c11q0).step c11q1).step c11q2).step c11q3q0).step c11q3q1).step c11q3q2).step c11q3q3q0q0).step c11q3q3q0q1).step c11q3q3q0q2).step c11q3q3q0q3q0).step c11q3q3q0q3q1).step c11q3q3q0q3q2).step c11q3q3q0q3q3L).step c11q3q3q0q3q3R).step c11q3q3q1).step c11q3q3q2).step c11q3q3q3).step c12).step c13).step c14q0).step c14q1).step c14q2).step c14q3q0).step c14q3q1).step c14q3q2q0).step c14q3q2q1q0).step c14q3q2q1q1q0L).step c14q3q2q1q1q0R).step c14q3q2q1q1q1).step c14q3q2q1q1q2).step c14q3q2q1q1q3).step c14q3q2q1q2).step c14q3q2q1q3).step c14q3q2q2).step c14q3q2q3).step c14q3q3).step c15).step c16).step c17).step c18).step c19).step c20).step c21).step c22).step c23).step c24).step c25).step c26).step c27).step c28).step c29).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46q0).step c46q1).step c46q2).step c46q3).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55s0).step c55s1) c55s2 end Symbolic.BugInjection.Disproofs.Impl.WeakState.Call0 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call1.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call1.lean index 660849413..e0f54c6bb 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call1.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call1.lean @@ -23,19 +23,19 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q1 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q3q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q3q2L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q3q2R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q3q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q3q1L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q3q1R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q3q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C5 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C6 @@ -72,14 +72,11 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C33 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C34 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C35 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C36 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C38 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C38q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C38q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C38q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C38q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C39 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C40 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C41 @@ -107,13 +104,10 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C62 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C63 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C64 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C65 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C66q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C66q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C66q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C66q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C67 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C66s0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C66s1 -/-! Chained `96`-chunk `cliRunPlacedSig` proof (`wsRun1`) for `Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1`. -/ +/-! Chained `90`-chunk `cliRunPlacedSig` proof (`wsRun1`) for `Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1`. -/ @[expose] public section @@ -140,19 +134,19 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C3 (c3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q0 (c4q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q1 (c4q1) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q0 (c4q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q0 (c4q2q1q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q1 (c4q2q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q0 (c4q2q1q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q1 (c4q2q1q2q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q2 (c4q2q1q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q3q0 (c4q2q1q2q3q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q3q1 (c4q2q1q2q3q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q3q2L (c4q2q1q2q3q2L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q3q2R (c4q2q1q2q3q2R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q2q3q3 (c4q2q1q2q3q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1q3 (c4q2q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q1 (c4q2q1) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q2 (c4q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3 (c4q2q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q0 (c4q2q3q0q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q1 (c4q2q3q0q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q2 (c4q2q3q0q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q3q0 (c4q2q3q0q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q3q1L (c4q2q3q0q3q1L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q3q1R (c4q2q3q0q3q1R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q3q2 (c4q2q3q0q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q0q3q3 (c4q2q3q0q3q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q1 (c4q2q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q2 (c4q2q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q2q3q3 (c4q2q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C4q3 (c4q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C5 (c5) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C6 (c6) @@ -189,14 +183,11 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C33 (c33) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C34 (c34) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C35 (c35) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C36 (c36) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37q0 (c37q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37q1 (c37q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37q2q0 (c37q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37q2q1 (c37q2q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37q2q2 (c37q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37q2q3 (c37q2q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37q3 (c37q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C38 (c38) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C37 (c37) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C38q0 (c38q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C38q1 (c38q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C38q2 (c38q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C38q3 (c38q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C39 (c39) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C40 (c40) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C41 (c41) @@ -224,11 +215,8 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C62 (c62) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C63 (c63) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C64 (c64) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C65 (c65) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C66q0 (c66q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C66q1 (c66q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C66q2 (c66q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C66q3 (c66q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C67 (c67) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C66s0 (c66s0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1.C66s1 (c66s1) theorem wsRun1 {mpl mmpl : MultiPlacement} {elf : ElfImage} (hv : ElfFullValidPlaced mpl mmpl elf wsSpec) : @@ -237,6 +225,6 @@ theorem wsRun1 {mpl mmpl : MultiPlacement} {elf : ElfImage} cliRunPlacedSig_of_elfFinalChunk hv (fun name => congrArg (cliExternsPlacedSig mmpl · name) compHooks0_placed_eq) wsInp1_eq c1Out_eq - (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4q0).step c4q1).step c4q2q0).step c4q2q1q0).step c4q2q1q1).step c4q2q1q2q0).step c4q2q1q2q1).step c4q2q1q2q2).step c4q2q1q2q3q0).step c4q2q1q2q3q1).step c4q2q1q2q3q2L).step c4q2q1q2q3q2R).step c4q2q1q2q3q3).step c4q2q1q3).step c4q2q2).step c4q2q3).step c4q3).step c5).step c6).step c7).step c8).step c9).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17).step c18).step c19q0).step c19q1).step c19q2).step c19q3).step c20).step c21).step c22).step c23).step c24).step c25).step c26).step c27).step c28).step c29).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37q0).step c37q1).step c37q2q0).step c37q2q1).step c37q2q2).step c37q2q3).step c37q3).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66q0).step c66q1).step c66q2).step c66q3) c67 + (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4q0).step c4q1).step c4q2q0).step c4q2q1).step c4q2q2).step c4q2q3q0q0).step c4q2q3q0q1).step c4q2q3q0q2).step c4q2q3q0q3q0).step c4q2q3q0q3q1L).step c4q2q3q0q3q1R).step c4q2q3q0q3q2).step c4q2q3q0q3q3).step c4q2q3q1).step c4q2q3q2).step c4q2q3q3).step c4q3).step c5).step c6).step c7).step c8).step c9).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17).step c18).step c19q0).step c19q1).step c19q2).step c19q3).step c20).step c21).step c22).step c23).step c24).step c25).step c26).step c27).step c28).step c29).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38q0).step c38q1).step c38q2).step c38q3).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66s0) c66s1 end Symbolic.BugInjection.Disproofs.Impl.WeakState.Call1 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call2.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call2.lean index 5fb136141..ac9c4f865 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call2.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call2.lean @@ -23,19 +23,19 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q1 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q3q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q3q2L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q3q2R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q3q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q3q1L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q3q1R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q3q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C5 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C6 @@ -44,19 +44,19 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C8 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q1 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q0q2L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q0q2R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q3q3L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q3q3R public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C10 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C11 @@ -68,25 +68,28 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C16 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q1 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q1q3L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q1q3R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q2q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q2q1L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q2q1R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q2q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q2 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C18 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C19 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C20 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C21 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C22 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C22q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C22q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C22q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C22q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C23 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C24 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C25 @@ -109,7 +112,10 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C41 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C42 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C43 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q1q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q1q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q1q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q2 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C45 @@ -129,10 +135,7 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C58 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C59 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C60 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C61 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C62q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C62q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C62q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C62q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C62 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C63 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C64 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C65 @@ -142,13 +145,13 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C68 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C69 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C70 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C71 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C72s0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C72s1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C72s2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C72s3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C72s4 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C72 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C73s0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C73s1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C73s2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C73s3 -/-! Chained `131`-chunk `cliRunPlacedSig` proof (`wsRun2`) for `Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2`. -/ +/-! Chained `134`-chunk `cliRunPlacedSig` proof (`wsRun2`) for `Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2`. -/ @[expose] public section @@ -175,19 +178,19 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C3 (c3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q0 (c4q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q1 (c4q1) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q0 (c4q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q0 (c4q2q1q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q1 (c4q2q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q0 (c4q2q1q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q1 (c4q2q1q2q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q2 (c4q2q1q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q3q0 (c4q2q1q2q3q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q3q1 (c4q2q1q2q3q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q3q2L (c4q2q1q2q3q2L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q3q2R (c4q2q1q2q3q2R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q2q3q3 (c4q2q1q2q3q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1q3 (c4q2q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q1 (c4q2q1) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q2 (c4q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3 (c4q2q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q0 (c4q2q3q0q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q1 (c4q2q3q0q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q2 (c4q2q3q0q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q3q0 (c4q2q3q0q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q3q1L (c4q2q3q0q3q1L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q3q1R (c4q2q3q0q3q1R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q3q2 (c4q2q3q0q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q0q3q3 (c4q2q3q0q3q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q1 (c4q2q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q2 (c4q2q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q2q3q3 (c4q2q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C4q3 (c4q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C5 (c5) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C6 (c6) @@ -196,19 +199,19 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C8 (c8) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q0 (c9q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q1 (c9q1) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q2 (c9q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q0 (c9q3q0q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q1 (c9q3q0q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q2 (c9q3q0q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q0q0 (c9q3q0q3q0q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q0q1 (c9q3q0q3q0q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q0q2L (c9q3q0q3q0q2L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q0q2R (c9q3q0q3q0q2R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q0q3 (c9q3q0q3q0q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q1 (c9q3q0q3q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q2 (c9q3q0q3q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0q3q3 (c9q3q0q3q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q0 (c9q3q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q1 (c9q3q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2 (c9q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q0 (c9q3q2q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q1 (c9q3q2q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q2 (c9q3q2q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q0 (c9q3q2q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q1 (c9q3q2q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q2 (c9q3q2q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q3q0 (c9q3q2q3q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q3q1 (c9q3q2q3q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q3q2 (c9q3q2q3q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q3q3L (c9q3q2q3q3q3L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q2q3q3q3R (c9q3q2q3q3q3R) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C9q3q3 (c9q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C10 (c10) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C11 (c11) @@ -220,25 +223,28 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C16 (c16) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q0 (c17q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q1 (c17q1) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q2 (c17q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q0 (c17q3q0q0q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q1q0 (c17q3q0q0q1q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q1q1 (c17q3q0q0q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q1q2 (c17q3q0q0q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q1q3L (c17q3q0q0q1q3L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q1q3R (c17q3q0q0q1q3R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q2 (c17q3q0q0q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q0q3 (c17q3q0q0q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q1 (c17q3q0q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q2 (c17q3q0q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0q3 (c17q3q0q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1 (c17q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q0 (c17q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q0 (c17q3q1q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q1 (c17q3q1q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q2 (c17q3q1q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q0 (c17q3q1q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q1 (c17q3q1q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q2q0 (c17q3q1q3q2q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q2q1L (c17q3q1q3q2q1L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q2q1R (c17q3q1q3q2q1R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q2q2 (c17q3q1q3q2q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q2q3 (c17q3q1q3q2q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q1q3q3 (c17q3q1q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q2 (c17q3q2) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C17q3q3 (c17q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C18 (c18) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C19 (c19) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C20 (c20) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C21 (c21) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C22 (c22) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C22q0 (c22q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C22q1 (c22q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C22q2 (c22q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C22q3 (c22q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C23 (c23) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C24 (c24) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C25 (c25) @@ -261,7 +267,10 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C41 (c41) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C42 (c42) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C43 (c43) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q0 (c44q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q1 (c44q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q1q0 (c44q1q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q1q1 (c44q1q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q1q2 (c44q1q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q1q3 (c44q1q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q2 (c44q2) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C44q3 (c44q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C45 (c45) @@ -281,10 +290,7 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C58 (c58) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C59 (c59) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C60 (c60) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C61 (c61) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C62q0 (c62q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C62q1 (c62q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C62q2 (c62q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C62q3 (c62q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C62 (c62) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C63 (c63) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C64 (c64) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C65 (c65) @@ -294,11 +300,11 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C68 (c68) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C69 (c69) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C70 (c70) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C71 (c71) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C72s0 (c72s0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C72s1 (c72s1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C72s2 (c72s2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C72s3 (c72s3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C72s4 (c72s4) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C72 (c72) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C73s0 (c73s0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C73s1 (c73s1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C73s2 (c73s2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2.C73s3 (c73s3) theorem wsRun2 {mpl mmpl : MultiPlacement} {elf : ElfImage} (hv : ElfFullValidPlaced mpl mmpl elf wsSpec) : @@ -307,6 +313,6 @@ theorem wsRun2 {mpl mmpl : MultiPlacement} {elf : ElfImage} cliRunPlacedSig_of_elfFinalChunk hv (fun name => congrArg (cliExternsPlacedSig mmpl · name) compHooks0_placed_eq) wsInp2_eq c2Out_eq - ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4q0).step c4q1).step c4q2q0).step c4q2q1q0).step c4q2q1q1).step c4q2q1q2q0).step c4q2q1q2q1).step c4q2q1q2q2).step c4q2q1q2q3q0).step c4q2q1q2q3q1).step c4q2q1q2q3q2L).step c4q2q1q2q3q2R).step c4q2q1q2q3q3).step c4q2q1q3).step c4q2q2).step c4q2q3).step c4q3).step c5).step c6).step c7).step c8).step c9q0).step c9q1).step c9q2).step c9q3q0q0).step c9q3q0q1).step c9q3q0q2).step c9q3q0q3q0q0).step c9q3q0q3q0q1).step c9q3q0q3q0q2L).step c9q3q0q3q0q2R).step c9q3q0q3q0q3).step c9q3q0q3q1).step c9q3q0q3q2).step c9q3q0q3q3).step c9q3q1).step c9q3q2).step c9q3q3).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17q0).step c17q1).step c17q2).step c17q3q0q0q0).step c17q3q0q0q1q0).step c17q3q0q0q1q1).step c17q3q0q0q1q2).step c17q3q0q0q1q3L).step c17q3q0q0q1q3R).step c17q3q0q0q2).step c17q3q0q0q3).step c17q3q0q1).step c17q3q0q2).step c17q3q0q3).step c17q3q1).step c17q3q2).step c17q3q3).step c18).step c19).step c20).step c21).step c22).step c23).step c24).step c25).step c26).step c27).step c28).step c29).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38).step c39).step c40).step c41).step c42).step c43).step c44q0).step c44q1).step c44q2).step c44q3).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62q0).step c62q1).step c62q2).step c62q3).step c63).step c64).step c65).step c66).step c67).step c68).step c69).step c70).step c71).step c72s0).step c72s1).step c72s2).step c72s3) c72s4 + (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4q0).step c4q1).step c4q2q0).step c4q2q1).step c4q2q2).step c4q2q3q0q0).step c4q2q3q0q1).step c4q2q3q0q2).step c4q2q3q0q3q0).step c4q2q3q0q3q1L).step c4q2q3q0q3q1R).step c4q2q3q0q3q2).step c4q2q3q0q3q3).step c4q2q3q1).step c4q2q3q2).step c4q2q3q3).step c4q3).step c5).step c6).step c7).step c8).step c9q0).step c9q1).step c9q2).step c9q3q0).step c9q3q1).step c9q3q2q0).step c9q3q2q1).step c9q3q2q2).step c9q3q2q3q0).step c9q3q2q3q1).step c9q3q2q3q2).step c9q3q2q3q3q0).step c9q3q2q3q3q1).step c9q3q2q3q3q2).step c9q3q2q3q3q3L).step c9q3q2q3q3q3R).step c9q3q3).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17q0).step c17q1).step c17q2).step c17q3q0).step c17q3q1q0).step c17q3q1q1).step c17q3q1q2).step c17q3q1q3q0).step c17q3q1q3q1).step c17q3q1q3q2q0).step c17q3q1q3q2q1L).step c17q3q1q3q2q1R).step c17q3q1q3q2q2).step c17q3q1q3q2q3).step c17q3q1q3q3).step c17q3q2).step c17q3q3).step c18).step c19).step c20).step c21).step c22q0).step c22q1).step c22q2).step c22q3).step c23).step c24).step c25).step c26).step c27).step c28).step c29).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38).step c39).step c40).step c41).step c42).step c43).step c44q0).step c44q1q0).step c44q1q1).step c44q1q2).step c44q1q3).step c44q2).step c44q3).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66).step c67).step c68).step c69).step c70).step c71).step c72).step c73s0).step c73s1).step c73s2) c73s3 end Symbolic.BugInjection.Disproofs.Impl.WeakState.Call2 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call3.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call3.lean index 57c173b46..eb33f38e2 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call3.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call3.lean @@ -23,19 +23,19 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q1 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q0q0L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q0q0R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q3q3L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q3q3R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C5 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C6 @@ -58,41 +58,41 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C22 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C23 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C24 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q2q0L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q2q0R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q0q3L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q0q3R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C26 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C27 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C28 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q2q0L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q2q0R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q2q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q2q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q0q2L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q0q2R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C30 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C31 @@ -168,14 +168,10 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C100 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C101 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C102 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C103 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C104 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C105s0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C105s1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C105s2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C105s3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C105s4 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C104s0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C104s1 -/-! Chained `158`-chunk `cliRunPlacedSig` proof (`wsRun3`) for `Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3`. -/ +/-! Chained `154`-chunk `cliRunPlacedSig` proof (`wsRun3`) for `Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3`. -/ @[expose] public section @@ -202,19 +198,19 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C3 (c3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q0 (c4q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q1 (c4q1) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q0 (c4q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q0 (c4q2q1q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q1 (c4q2q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q2 (c4q2q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q0q0L (c4q2q1q3q0q0L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q0q0R (c4q2q1q3q0q0R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q0q1 (c4q2q1q3q0q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q0q2 (c4q2q1q3q0q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q0q3 (c4q2q1q3q0q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q1 (c4q2q1q3q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q2 (c4q2q1q3q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1q3q3 (c4q2q1q3q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q1 (c4q2q1) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q2 (c4q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3 (c4q2q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q0 (c4q2q3q0q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q1 (c4q2q3q0q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q2 (c4q2q3q0q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q3q0 (c4q2q3q0q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q3q1 (c4q2q3q0q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q3q2 (c4q2q3q0q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q3q3L (c4q2q3q0q3q3L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q0q3q3R (c4q2q3q0q3q3R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q1 (c4q2q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q2 (c4q2q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q2q3q3 (c4q2q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C4q3 (c4q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C5 (c5) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C6 (c6) @@ -237,41 +233,41 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C22 (c22) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C23 (c23) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C24 (c24) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q0 (c25q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1 (c25q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q0 (c25q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q1 (c25q2q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q0 (c25q2q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q0 (c25q2q2q1q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q1 (c25q2q2q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q2q0L (c25q2q2q1q2q0L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q2q0R (c25q2q2q1q2q0R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q2q1 (c25q2q2q1q2q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q2q2 (c25q2q2q1q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q2q3 (c25q2q2q1q2q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q1q3 (c25q2q2q1q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q2 (c25q2q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q2q3 (c25q2q2q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2q3 (c25q2q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q0 (c25q1q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q0q0 (c25q1q1q0q0q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q0q1 (c25q1q1q0q0q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q0q2 (c25q1q1q0q0q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q0q3L (c25q1q1q0q0q3L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q0q3R (c25q1q1q0q0q3R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q1 (c25q1q1q0q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q2 (c25q1q1q0q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q0q3 (c25q1q1q0q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q1 (c25q1q1q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q2 (c25q1q1q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q1q3 (c25q1q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q2 (c25q1q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q1q3 (c25q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q2 (c25q2) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C25q3 (c25q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C26 (c26) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C27 (c27) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C28 (c28) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0 (c29q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q0 (c29q0q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q1 (c29q0q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q2 (c29q0q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q0 (c29q0q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q1 (c29q0q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q0 (c29q0q3q2q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q1 (c29q0q3q2q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q2q0L (c29q0q3q2q2q0L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q2q0R (c29q0q3q2q2q0R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q2q1 (c29q0q3q2q2q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q2q2 (c29q0q3q2q2q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q2q3 (c29q0q3q2q2q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q2q3 (c29q0q3q2q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q0q3q3 (c29q0q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q1 (c29q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q0 (c29q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q0q0 (c29q2q1q0q0q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q0q1 (c29q2q1q0q0q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q0q2L (c29q2q1q0q0q2L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q0q2R (c29q2q1q0q0q2R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q0q3 (c29q2q1q0q0q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q1 (c29q2q1q0q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q2 (c29q2q1q0q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q0q3 (c29q2q1q0q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q1 (c29q2q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q2 (c29q2q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q1q3 (c29q2q1q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q2 (c29q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2q3 (c29q2q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q2 (c29q2) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C29q3 (c29q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C30 (c30) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C31 (c31) @@ -347,12 +343,8 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C100 (c100) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C101 (c101) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C102 (c102) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C103 (c103) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C104 (c104) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C105s0 (c105s0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C105s1 (c105s1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C105s2 (c105s2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C105s3 (c105s3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C105s4 (c105s4) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C104s0 (c104s0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3.C104s1 (c104s1) theorem wsRun3 {mpl mmpl : MultiPlacement} {elf : ElfImage} (hv : ElfFullValidPlaced mpl mmpl elf wsSpec) : @@ -361,6 +353,6 @@ theorem wsRun3 {mpl mmpl : MultiPlacement} {elf : ElfImage} cliRunPlacedSig_of_elfFinalChunk hv (fun name => congrArg (cliExternsPlacedSig mmpl · name) compHooks0_placed_eq) wsInp3_eq pt3Out_eq - (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4q0).step c4q1).step c4q2q0).step c4q2q1q0).step c4q2q1q1).step c4q2q1q2).step c4q2q1q3q0q0L).step c4q2q1q3q0q0R).step c4q2q1q3q0q1).step c4q2q1q3q0q2).step c4q2q1q3q0q3).step c4q2q1q3q1).step c4q2q1q3q2).step c4q2q1q3q3).step c4q2q2).step c4q2q3).step c4q3).step c5).step c6).step c7).step c8).step c9).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17).step c18).step c19).step c20).step c21).step c22).step c23).step c24).step c25q0).step c25q1).step c25q2q0).step c25q2q1).step c25q2q2q0).step c25q2q2q1q0).step c25q2q2q1q1).step c25q2q2q1q2q0L).step c25q2q2q1q2q0R).step c25q2q2q1q2q1).step c25q2q2q1q2q2).step c25q2q2q1q2q3).step c25q2q2q1q3).step c25q2q2q2).step c25q2q2q3).step c25q2q3).step c25q3).step c26).step c27).step c28).step c29q0).step c29q1).step c29q2q0).step c29q2q1q0q0q0).step c29q2q1q0q0q1).step c29q2q1q0q0q2L).step c29q2q1q0q0q2R).step c29q2q1q0q0q3).step c29q2q1q0q1).step c29q2q1q0q2).step c29q2q1q0q3).step c29q2q1q1).step c29q2q1q2).step c29q2q1q3).step c29q2q2).step c29q2q3).step c29q3).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66).step c67).step c68).step c69).step c70).step c71).step c72).step c73).step c74).step c75).step c76).step c77).step c78).step c79).step c80).step c81).step c82).step c83).step c84).step c85).step c86).step c87).step c88).step c89).step c90).step c91).step c92).step c93).step c94).step c95).step c96).step c97).step c98).step c99).step c100).step c101).step c102).step c103).step c104).step c105s0).step c105s1).step c105s2).step c105s3) c105s4 + (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4q0).step c4q1).step c4q2q0).step c4q2q1).step c4q2q2).step c4q2q3q0q0).step c4q2q3q0q1).step c4q2q3q0q2).step c4q2q3q0q3q0).step c4q2q3q0q3q1).step c4q2q3q0q3q2).step c4q2q3q0q3q3L).step c4q2q3q0q3q3R).step c4q2q3q1).step c4q2q3q2).step c4q2q3q3).step c4q3).step c5).step c6).step c7).step c8).step c9).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17).step c18).step c19).step c20).step c21).step c22).step c23).step c24).step c25q0).step c25q1q0).step c25q1q1q0q0q0).step c25q1q1q0q0q1).step c25q1q1q0q0q2).step c25q1q1q0q0q3L).step c25q1q1q0q0q3R).step c25q1q1q0q1).step c25q1q1q0q2).step c25q1q1q0q3).step c25q1q1q1).step c25q1q1q2).step c25q1q1q3).step c25q1q2).step c25q1q3).step c25q2).step c25q3).step c26).step c27).step c28).step c29q0q0).step c29q0q1).step c29q0q2).step c29q0q3q0).step c29q0q3q1).step c29q0q3q2q0).step c29q0q3q2q1).step c29q0q3q2q2q0L).step c29q0q3q2q2q0R).step c29q0q3q2q2q1).step c29q0q3q2q2q2).step c29q0q3q2q2q3).step c29q0q3q2q3).step c29q0q3q3).step c29q1).step c29q2).step c29q3).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66).step c67).step c68).step c69).step c70).step c71).step c72).step c73).step c74).step c75).step c76).step c77).step c78).step c79).step c80).step c81).step c82).step c83).step c84).step c85).step c86).step c87).step c88).step c89).step c90).step c91).step c92).step c93).step c94).step c95).step c96).step c97).step c98).step c99).step c100).step c101).step c102).step c103).step c104s0) c104s1 end Symbolic.BugInjection.Disproofs.Impl.WeakState.Call3 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call4.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call4.lean index 7afb10c31..dd4b65004 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call4.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call4.lean @@ -22,20 +22,20 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C2 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C4 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q1q3L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q1q3R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q1 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q2q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q2q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q2q2L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q2q2R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q2 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C6 @@ -45,40 +45,40 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C9 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C10 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q0q1L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q0q1R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q3q3L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q3q3R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C12 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C13 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q3q0L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q3q0R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q3q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q3q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q1q0L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q1q0R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q1q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C15 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C16 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C17 @@ -110,20 +110,23 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C42 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C43 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C44 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C45 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C46 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C46q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C46q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C46q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C46q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C47 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C48 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C49 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C50 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C51 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C52 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C53q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C53q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C53q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C53q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C53 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C54 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C55s0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C55s1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C55s2 -/-! Chained `106`-chunk `cliRunPlacedSig` proof (`wsRun4`) for `Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4`. -/ +/-! Chained `109`-chunk `cliRunPlacedSig` proof (`wsRun4`) for `Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4`. -/ @[expose] public section @@ -149,20 +152,20 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C2 (c2) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C3 (c3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C4 (c4) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q0 (c5q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q0 (c5q1q0q0q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q1q0 (c5q1q0q0q1q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q1q1 (c5q1q0q0q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q1q2 (c5q1q0q0q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q1q3L (c5q1q0q0q1q3L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q1q3R (c5q1q0q0q1q3R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q2 (c5q1q0q0q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q0q3 (c5q1q0q0q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q1 (c5q1q0q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q2 (c5q1q0q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0q3 (c5q1q0q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q0 (c5q1q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q1 (c5q1q1) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q2 (c5q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3 (c5q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q0 (c5q1q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q0 (c5q1q3q1q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q1 (c5q1q3q1q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q2q0 (c5q1q3q1q2q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q2q1 (c5q1q3q1q2q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q2q2L (c5q1q3q1q2q2L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q2q2R (c5q1q3q1q2q2R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q2q3 (c5q1q3q1q2q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q1q3 (c5q1q3q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q2 (c5q1q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q1q3q3 (c5q1q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q2 (c5q2) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C5q3 (c5q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C6 (c6) @@ -172,40 +175,40 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C9 (c9) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C10 (c10) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q0 (c11q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q1 (c11q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q0 (c11q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q1 (c11q2q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q2 (c11q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q0 (c11q2q3q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q0q0 (c11q2q3q1q0q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q0q1L (c11q2q3q1q0q1L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q0q1R (c11q2q3q1q0q1R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q0q2 (c11q2q3q1q0q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q0q3 (c11q2q3q1q0q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q1 (c11q2q3q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q2 (c11q2q3q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q1q3 (c11q2q3q1q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q2 (c11q2q3q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2q3q3 (c11q2q3q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3 (c11q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q2 (c11q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q0 (c11q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q1 (c11q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q2 (c11q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q0 (c11q3q3q0q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q1 (c11q3q3q0q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q2 (c11q3q3q0q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q3q0 (c11q3q3q0q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q3q1 (c11q3q3q0q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q3q2 (c11q3q3q0q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q3q3L (c11q3q3q0q3q3L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q0q3q3R (c11q3q3q0q3q3R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q1 (c11q3q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q2 (c11q3q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C11q3q3q3 (c11q3q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C12 (c12) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C13 (c13) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q0 (c14q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q1 (c14q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q0 (c14q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q1 (c14q2q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q0 (c14q2q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q0 (c14q2q2q1q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q1 (c14q2q2q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q2 (c14q2q2q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q3q0L (c14q2q2q1q3q0L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q3q0R (c14q2q2q1q3q0R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q3q1 (c14q2q2q1q3q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q3q2 (c14q2q2q1q3q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q1q3q3 (c14q2q2q1q3q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q2 (c14q2q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q2q3 (c14q2q2q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2q3 (c14q2q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3 (c14q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q2 (c14q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q0 (c14q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q1 (c14q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q0 (c14q3q2q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q0 (c14q3q2q1q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q1q0L (c14q3q2q1q1q0L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q1q0R (c14q3q2q1q1q0R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q1q1 (c14q3q2q1q1q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q1q2 (c14q3q2q1q1q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q1q3 (c14q3q2q1q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q2 (c14q3q2q1q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q1q3 (c14q3q2q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q2 (c14q3q2q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q2q3 (c14q3q2q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C14q3q3 (c14q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C15 (c15) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C16 (c16) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C17 (c17) @@ -237,18 +240,21 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C42 (c42) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C43 (c43) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C44 (c44) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C45 (c45) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C46 (c46) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C46q0 (c46q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C46q1 (c46q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C46q2 (c46q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C46q3 (c46q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C47 (c47) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C48 (c48) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C49 (c49) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C50 (c50) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C51 (c51) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C52 (c52) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C53q0 (c53q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C53q1 (c53q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C53q2 (c53q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C53q3 (c53q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C53 (c53) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C54 (c54) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C55s0 (c55s0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C55s1 (c55s1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4.C55s2 (c55s2) theorem wsRun4 {mpl mmpl : MultiPlacement} {elf : ElfImage} (hv : ElfFullValidPlaced mpl mmpl elf wsSpec) : @@ -257,6 +263,6 @@ theorem wsRun4 {mpl mmpl : MultiPlacement} {elf : ElfImage} cliRunPlacedSig_of_elfFinalChunk hv (fun name => congrArg (cliExternsPlacedSig mmpl · name) compHooks0_placed_eq) wsInp4_eq rfl - (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4).step c5q0).step c5q1q0q0q0).step c5q1q0q0q1q0).step c5q1q0q0q1q1).step c5q1q0q0q1q2).step c5q1q0q0q1q3L).step c5q1q0q0q1q3R).step c5q1q0q0q2).step c5q1q0q0q3).step c5q1q0q1).step c5q1q0q2).step c5q1q0q3).step c5q1q1).step c5q1q2).step c5q1q3).step c5q2).step c5q3).step c6).step c7).step c8).step c9).step c10).step c11q0).step c11q1).step c11q2q0).step c11q2q1).step c11q2q2).step c11q2q3q0).step c11q2q3q1q0q0).step c11q2q3q1q0q1L).step c11q2q3q1q0q1R).step c11q2q3q1q0q2).step c11q2q3q1q0q3).step c11q2q3q1q1).step c11q2q3q1q2).step c11q2q3q1q3).step c11q2q3q2).step c11q2q3q3).step c11q3).step c12).step c13).step c14q0).step c14q1).step c14q2q0).step c14q2q1).step c14q2q2q0).step c14q2q2q1q0).step c14q2q2q1q1).step c14q2q2q1q2).step c14q2q2q1q3q0L).step c14q2q2q1q3q0R).step c14q2q2q1q3q1).step c14q2q2q1q3q2).step c14q2q2q1q3q3).step c14q2q2q2).step c14q2q2q3).step c14q2q3).step c14q3).step c15).step c16).step c17).step c18).step c19).step c20).step c21).step c22).step c23).step c24).step c25).step c26).step c27).step c28).step c29).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53q0).step c53q1).step c53q2).step c53q3) c54 + ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4).step c5q0).step c5q1q0).step c5q1q1).step c5q1q2).step c5q1q3q0).step c5q1q3q1q0).step c5q1q3q1q1).step c5q1q3q1q2q0).step c5q1q3q1q2q1).step c5q1q3q1q2q2L).step c5q1q3q1q2q2R).step c5q1q3q1q2q3).step c5q1q3q1q3).step c5q1q3q2).step c5q1q3q3).step c5q2).step c5q3).step c6).step c7).step c8).step c9).step c10).step c11q0).step c11q1).step c11q2).step c11q3q0).step c11q3q1).step c11q3q2).step c11q3q3q0q0).step c11q3q3q0q1).step c11q3q3q0q2).step c11q3q3q0q3q0).step c11q3q3q0q3q1).step c11q3q3q0q3q2).step c11q3q3q0q3q3L).step c11q3q3q0q3q3R).step c11q3q3q1).step c11q3q3q2).step c11q3q3q3).step c12).step c13).step c14q0).step c14q1).step c14q2).step c14q3q0).step c14q3q1).step c14q3q2q0).step c14q3q2q1q0).step c14q3q2q1q1q0L).step c14q3q2q1q1q0R).step c14q3q2q1q1q1).step c14q3q2q1q1q2).step c14q3q2q1q1q3).step c14q3q2q1q2).step c14q3q2q1q3).step c14q3q2q2).step c14q3q2q3).step c14q3q3).step c15).step c16).step c17).step c18).step c19).step c20).step c21).step c22).step c23).step c24).step c25).step c26).step c27).step c28).step c29).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46q0).step c46q1).step c46q2).step c46q3).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55s0).step c55s1) c55s2 end Symbolic.BugInjection.Disproofs.Impl.WeakState.Call4 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call5.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call5.lean index 62479e977..8833c6936 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call5.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call5.lean @@ -23,19 +23,19 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q1 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q3q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q3q2L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q3q2R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q3q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q3q1L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q3q1R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q3q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C5 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C6 @@ -72,14 +72,11 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C33 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C34 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C35 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C36 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C38 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C38q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C38q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C38q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C38q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C39 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C40 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C41 @@ -107,13 +104,10 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C62 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C63 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C64 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C65 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C66q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C66q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C66q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C66q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C67 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C66s0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C66s1 -/-! Chained `96`-chunk `cliRunPlacedSig` proof (`wsRun5`) for `Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5`. -/ +/-! Chained `90`-chunk `cliRunPlacedSig` proof (`wsRun5`) for `Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5`. -/ @[expose] public section @@ -140,19 +134,19 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C3 (c3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q0 (c4q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q1 (c4q1) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q0 (c4q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q0 (c4q2q1q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q1 (c4q2q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q0 (c4q2q1q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q1 (c4q2q1q2q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q2 (c4q2q1q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q3q0 (c4q2q1q2q3q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q3q1 (c4q2q1q2q3q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q3q2L (c4q2q1q2q3q2L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q3q2R (c4q2q1q2q3q2R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q2q3q3 (c4q2q1q2q3q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1q3 (c4q2q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q1 (c4q2q1) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q2 (c4q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3 (c4q2q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q0 (c4q2q3q0q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q1 (c4q2q3q0q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q2 (c4q2q3q0q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q3q0 (c4q2q3q0q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q3q1L (c4q2q3q0q3q1L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q3q1R (c4q2q3q0q3q1R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q3q2 (c4q2q3q0q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q0q3q3 (c4q2q3q0q3q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q1 (c4q2q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q2 (c4q2q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q2q3q3 (c4q2q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C4q3 (c4q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C5 (c5) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C6 (c6) @@ -189,14 +183,11 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C33 (c33) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C34 (c34) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C35 (c35) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C36 (c36) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37q0 (c37q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37q1 (c37q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37q2q0 (c37q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37q2q1 (c37q2q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37q2q2 (c37q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37q2q3 (c37q2q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37q3 (c37q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C38 (c38) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C37 (c37) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C38q0 (c38q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C38q1 (c38q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C38q2 (c38q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C38q3 (c38q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C39 (c39) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C40 (c40) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C41 (c41) @@ -224,11 +215,8 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C62 (c62) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C63 (c63) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C64 (c64) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C65 (c65) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C66q0 (c66q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C66q1 (c66q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C66q2 (c66q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C66q3 (c66q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C67 (c67) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C66s0 (c66s0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5.C66s1 (c66s1) theorem wsRun5 {mpl mmpl : MultiPlacement} {elf : ElfImage} (hv : ElfFullValidPlaced mpl mmpl elf wsSpec) : @@ -237,6 +225,6 @@ theorem wsRun5 {mpl mmpl : MultiPlacement} {elf : ElfImage} cliRunPlacedSig_of_elfFinalChunk hv (fun name => congrArg (cliExternsPlacedSig mmpl · name) compHooks0_placed_eq) wsInp5_eq c5Out_eq - (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4q0).step c4q1).step c4q2q0).step c4q2q1q0).step c4q2q1q1).step c4q2q1q2q0).step c4q2q1q2q1).step c4q2q1q2q2).step c4q2q1q2q3q0).step c4q2q1q2q3q1).step c4q2q1q2q3q2L).step c4q2q1q2q3q2R).step c4q2q1q2q3q3).step c4q2q1q3).step c4q2q2).step c4q2q3).step c4q3).step c5).step c6).step c7).step c8).step c9).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17).step c18).step c19q0).step c19q1).step c19q2).step c19q3).step c20).step c21).step c22).step c23).step c24).step c25).step c26).step c27).step c28).step c29).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37q0).step c37q1).step c37q2q0).step c37q2q1).step c37q2q2).step c37q2q3).step c37q3).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66q0).step c66q1).step c66q2).step c66q3) c67 + (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4q0).step c4q1).step c4q2q0).step c4q2q1).step c4q2q2).step c4q2q3q0q0).step c4q2q3q0q1).step c4q2q3q0q2).step c4q2q3q0q3q0).step c4q2q3q0q3q1L).step c4q2q3q0q3q1R).step c4q2q3q0q3q2).step c4q2q3q0q3q3).step c4q2q3q1).step c4q2q3q2).step c4q2q3q3).step c4q3).step c5).step c6).step c7).step c8).step c9).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17).step c18).step c19q0).step c19q1).step c19q2).step c19q3).step c20).step c21).step c22).step c23).step c24).step c25).step c26).step c27).step c28).step c29).step c30).step c31).step c32).step c33).step c34).step c35).step c36).step c37).step c38q0).step c38q1).step c38q2).step c38q3).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66s0) c66s1 end Symbolic.BugInjection.Disproofs.Impl.WeakState.Call5 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call6.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call6.lean index daf635515..13fe6cb82 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call6.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/Call6.lean @@ -23,19 +23,19 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q1 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q0q0L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q0q0R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q0q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q3q3L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q3q3R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C5 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C6 @@ -64,39 +64,39 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C28 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C29 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q0 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q1q1L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q1q1R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q1q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q2q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q2q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q2q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q2q3L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q2q3R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C31 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C32 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C33 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q1q0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q1q1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q1q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q1q3L -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q1q3R -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q1q0 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q1q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q1q3L +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q1q3R +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q1 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q3 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q2 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q2 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q3 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C35 @@ -207,14 +207,10 @@ public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C139 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C140 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C141 public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C142 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C143s0 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C143s1 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C143s2 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C143s3 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C143s4 -public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C143s5 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C143 +public import Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C144 -/-! Chained `197`-chunk `cliRunPlacedSig` proof (`wsRun6`) for `Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6`. -/ +/-! Chained `193`-chunk `cliRunPlacedSig` proof (`wsRun6`) for `Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6`. -/ @[expose] public section @@ -241,19 +237,19 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C3 (c3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q0 (c4q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q1 (c4q1) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q0 (c4q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q0 (c4q2q1q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q1 (c4q2q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q2 (c4q2q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q0q0L (c4q2q1q3q0q0L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q0q0R (c4q2q1q3q0q0R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q0q1 (c4q2q1q3q0q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q0q2 (c4q2q1q3q0q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q0q3 (c4q2q1q3q0q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q1 (c4q2q1q3q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q2 (c4q2q1q3q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1q3q3 (c4q2q1q3q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q1 (c4q2q1) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q2 (c4q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3 (c4q2q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q0 (c4q2q3q0q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q1 (c4q2q3q0q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q2 (c4q2q3q0q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q3q0 (c4q2q3q0q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q3q1 (c4q2q3q0q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q3q2 (c4q2q3q0q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q3q3L (c4q2q3q0q3q3L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q0q3q3R (c4q2q3q0q3q3R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q1 (c4q2q3q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q2 (c4q2q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q2q3q3 (c4q2q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C4q3 (c4q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C5 (c5) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C6 (c6) @@ -282,39 +278,39 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C28 (c28) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C29 (c29) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q0 (c30q0) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q1 (c30q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q0 (c30q2q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q1 (c30q2q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q0 (c30q2q2q0q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q1q0 (c30q2q2q0q1q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q1q1L (c30q2q2q0q1q1L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q1q1R (c30q2q2q0q1q1R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q1q2 (c30q2q2q0q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q1q3 (c30q2q2q0q1q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q2 (c30q2q2q0q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q0q3 (c30q2q2q0q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q1 (c30q2q2q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q2 (c30q2q2q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q2q3 (c30q2q2q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2q3 (c30q2q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3 (c30q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q2 (c30q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q0 (c30q3q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q0 (c30q3q1q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q0 (c30q3q1q1q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q1 (c30q3q1q1q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q2q0 (c30q3q1q1q2q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q2q1 (c30q3q1q1q2q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q2q2 (c30q3q1q1q2q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q2q3L (c30q3q1q1q2q3L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q2q3R (c30q3q1q1q2q3R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q1q3 (c30q3q1q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q2 (c30q3q1q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q1q3 (c30q3q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q2 (c30q3q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C30q3q3 (c30q3q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C31 (c31) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C32 (c32) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C33 (c33) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q0 (c34q0q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q0 (c34q0q1q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q1 (c34q0q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q2 (c34q0q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q0 (c34q0q1q3q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q1q0 (c34q0q1q3q1q0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q1q1 (c34q0q1q3q1q1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q1q2 (c34q0q1q3q1q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q1q3L (c34q0q1q3q1q3L) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q1q3R (c34q0q1q3q1q3R) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q2 (c34q0q1q3q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q1q3q3 (c34q0q1q3q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q2 (c34q0q2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0q3 (c34q0q3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1 (c34q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q0 (c34q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q0 (c34q1q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q0 (c34q1q1q0q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q1q0 (c34q1q1q0q1q0) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q1q1 (c34q1q1q0q1q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q1q2 (c34q1q1q0q1q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q1q3L (c34q1q1q0q1q3L) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q1q3R (c34q1q1q0q1q3R) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q2 (c34q1q1q0q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q0q3 (c34q1q1q0q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q1 (c34q1q1q1) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q2 (c34q1q1q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q1q3 (c34q1q1q3) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q2 (c34q1q2) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q1q3 (c34q1q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q2 (c34q2) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C34q3 (c34q3) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C35 (c35) @@ -425,12 +421,8 @@ open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C139 (c139) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C140 (c140) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C141 (c141) open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C142 (c142) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C143s0 (c143s0) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C143s1 (c143s1) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C143s2 (c143s2) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C143s3 (c143s3) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C143s4 (c143s4) -open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C143s5 (c143s5) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C143 (c143) +open Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6.C144 (c144) theorem wsRun6 {mpl mmpl : MultiPlacement} {elf : ElfImage} (hv : ElfFullValidPlaced mpl mmpl elf wsSpec) : @@ -439,6 +431,6 @@ theorem wsRun6 {mpl mmpl : MultiPlacement} {elf : ElfImage} cliRunPlacedSig_of_elfFinalChunk hv (fun name => congrArg (cliExternsPlacedSig mmpl · name) compHooks0_placed_eq) wsInp6_eq pt6Out_eq - ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4q0).step c4q1).step c4q2q0).step c4q2q1q0).step c4q2q1q1).step c4q2q1q2).step c4q2q1q3q0q0L).step c4q2q1q3q0q0R).step c4q2q1q3q0q1).step c4q2q1q3q0q2).step c4q2q1q3q0q3).step c4q2q1q3q1).step c4q2q1q3q2).step c4q2q1q3q3).step c4q2q2).step c4q2q3).step c4q3).step c5).step c6).step c7).step c8).step c9).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17).step c18).step c19).step c20).step c21).step c22).step c23).step c24).step c25).step c26).step c27).step c28).step c29).step c30q0).step c30q1).step c30q2q0).step c30q2q1).step c30q2q2q0q0).step c30q2q2q0q1q0).step c30q2q2q0q1q1L).step c30q2q2q0q1q1R).step c30q2q2q0q1q2).step c30q2q2q0q1q3).step c30q2q2q0q2).step c30q2q2q0q3).step c30q2q2q1).step c30q2q2q2).step c30q2q2q3).step c30q2q3).step c30q3).step c31).step c32).step c33).step c34q0q0).step c34q0q1q0).step c34q0q1q1).step c34q0q1q2).step c34q0q1q3q0).step c34q0q1q3q1q0).step c34q0q1q3q1q1).step c34q0q1q3q1q2).step c34q0q1q3q1q3L).step c34q0q1q3q1q3R).step c34q0q1q3q2).step c34q0q1q3q3).step c34q0q2).step c34q0q3).step c34q1).step c34q2).step c34q3).step c35).step c36).step c37).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66).step c67).step c68).step c69).step c70).step c71).step c72).step c73).step c74).step c75).step c76).step c77).step c78).step c79).step c80).step c81).step c82).step c83).step c84).step c85).step c86).step c87).step c88).step c89).step c90).step c91).step c92).step c93).step c94).step c95).step c96).step c97).step c98).step c99).step c100).step c101).step c102).step c103).step c104).step c105).step c106).step c107).step c108).step c109).step c110).step c111).step c112).step c113).step c114).step c115).step c116).step c117).step c118).step c119).step c120).step c121).step c122).step c123).step c124).step c125).step c126).step c127).step c128).step c129).step c130).step c131).step c132).step c133).step c134).step c135).step c136).step c137).step c138).step c139).step c140).step c141).step c142).step c143s0).step c143s1).step c143s2).step c143s3).step c143s4) c143s5 + ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ElfCkptReachablePlaced.init.step c0).step c1).step c2).step c3).step c4q0).step c4q1).step c4q2q0).step c4q2q1).step c4q2q2).step c4q2q3q0q0).step c4q2q3q0q1).step c4q2q3q0q2).step c4q2q3q0q3q0).step c4q2q3q0q3q1).step c4q2q3q0q3q2).step c4q2q3q0q3q3L).step c4q2q3q0q3q3R).step c4q2q3q1).step c4q2q3q2).step c4q2q3q3).step c4q3).step c5).step c6).step c7).step c8).step c9).step c10).step c11).step c12).step c13).step c14).step c15).step c16).step c17).step c18).step c19).step c20).step c21).step c22).step c23).step c24).step c25).step c26).step c27).step c28).step c29).step c30q0).step c30q1).step c30q2).step c30q3q0).step c30q3q1q0).step c30q3q1q1q0).step c30q3q1q1q1).step c30q3q1q1q2q0).step c30q3q1q1q2q1).step c30q3q1q1q2q2).step c30q3q1q1q2q3L).step c30q3q1q1q2q3R).step c30q3q1q1q3).step c30q3q1q2).step c30q3q1q3).step c30q3q2).step c30q3q3).step c31).step c32).step c33).step c34q0).step c34q1q0).step c34q1q1q0q0).step c34q1q1q0q1q0).step c34q1q1q0q1q1).step c34q1q1q0q1q2).step c34q1q1q0q1q3L).step c34q1q1q0q1q3R).step c34q1q1q0q2).step c34q1q1q0q3).step c34q1q1q1).step c34q1q1q2).step c34q1q1q3).step c34q1q2).step c34q1q3).step c34q2).step c34q3).step c35).step c36).step c37).step c38).step c39).step c40).step c41).step c42).step c43).step c44).step c45).step c46).step c47).step c48).step c49).step c50).step c51).step c52).step c53).step c54).step c55).step c56).step c57).step c58).step c59).step c60).step c61).step c62).step c63).step c64).step c65).step c66).step c67).step c68).step c69).step c70).step c71).step c72).step c73).step c74).step c75).step c76).step c77).step c78).step c79).step c80).step c81).step c82).step c83).step c84).step c85).step c86).step c87).step c88).step c89).step c90).step c91).step c92).step c93).step c94).step c95).step c96).step c97).step c98).step c99).step c100).step c101).step c102).step c103).step c104).step c105).step c106).step c107).step c108).step c109).step c110).step c111).step c112).step c113).step c114).step c115).step c116).step c117).step c118).step c119).step c120).step c121).step c122).step c123).step c124).step c125).step c126).step c127).step c128).step c129).step c130).step c131).step c132).step c133).step c134).step c135).step c136).step c137).step c138).step c139).step c140).step c141).step c142).step c143) c144 end Symbolic.BugInjection.Disproofs.Impl.WeakState.Call6 diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/F3LayoutData.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/F3LayoutData.lean index 514b808ab..b6f3cdb2b 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/F3LayoutData.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/F3LayoutData.lean @@ -15,10 +15,14 @@ public import VerifiedLibraries.Mallocng.Proofs.PlacedInterned public import LibsignalBinary.Heap.Iface /-! -Placed address, segment, and symbol-layout constants for the `cheval26-weak-state` mutant CLI ELF -(`981192` B, `sha256 = 11250da57de1f7434b6d82bc13e35c1800904a494deb38404886c97e5797859a`). -Layout values used by the disproof are kernel-checked against `mutantCliElfImage` in -`MutantLink.lean`. +# Generated ELF Layout & Address Table (`F3LayoutData`) + +**Checked by Lean.** Untrusted (`Role::Proof`): auto-generated by `gen_stock_layout.py` +from `libsignal-cli.elf` (`618792` B, `sha256 = 49e8fb040b72ac27ccd932c8da594da9a6e8e978f7f87ddb8a4e151769efe29b`) and `stock-link.json`. + +Single generated definition module holding all literal ELF segment bounds, PHDR bytes, `musl` +`StdBinaryLayout` addresses, `mallocngLib` `MultiLayout` addresses, and Rust allocator +addresses (`stock/rdl_shim.S` 1-hop `b __rdl_*` thunks (`< e_entry`) into `rxSeg`). -/ set_option autoImplicit false @@ -31,65 +35,71 @@ open Arm64 Arm64.Obj ProofLib ProofLib.StdStartup open VerifiedLibraries.Mallocng.Proofs (mallocngMultiL) open LibsignalBinary.Heap (RustAllocAddrs) -/-- Expected SHA-256 digest of the `cheval26-weak-state` mutant CLI ELF. -/ -def f3TrialElfSha256 : String := - "11250da57de1f7434b6d82bc13e35c1800904a494deb38404886c97e5797859a" +/-- Expected SHA-256 of `libsignal-cli.elf`. -/ +def f3ElfSha256 : String := + "49e8fb040b72ac27ccd932c8da594da9a6e8e978f7f87ddb8a4e151769efe29b" -/-- Number of `PT_LOAD` segments in the mutant CLI ELF. -/ -def f3SegCount : Nat := 8 +/-- Compatibility alias for `f3ElfSha256`. -/ +abbrev f3TrialElfSha256 : String := f3ElfSha256 -/-- Total byte length across all page-aligned `PT_LOAD` segments. -/ -def f3SegByteSum : Nat := 675840 +/-- `PT_LOAD` segment count of the stock CLI ELF. -/ +def f3SegCount : Nat := 4 -/-- Word count (`bytes / 4`) of `rxSeg` (`seg[5]`). -/ +/-- Sum of page-aligned `PT_LOAD` region byte lengths (`(elf.segments.map (·.bytes.length)).sum`). -/ +def f3SegByteSum : Nat := 462848 + +/-- Word count (`bytes / 4`) of the page-aligned `rxSeg` (`seg[2]`). -/ def f3RxWordCount : Nat := 6144 -/-- Byte length of `.img.text` (`seg[1]` at `0x400000`). -/ -def f3ImgTextByteLen : Nat := 0x88278 +/-- Page-aligned base `(stockStdLayout.rxProgram elf).base` of the whole `PT_LOAD[rxSegIdx]` + (`seg[2]`; note `startAddr = e_entry` may sit at a higher page inside this same + `PT_LOAD` when `.text.b_pre` precedes `.text`). -/ +def f3RxSegBase : BitVec 64 := 0x469000#64 /-- Post-`__init_tp` `tpidr_el0` value (`builtin_tls + 0xc8`). -/ -def f3TpAddr : BitVec 64 := 0x4a3338#64 +def f3TpAddr : BitVec 64 := 0x4702b8#64 -/-- Initial program break address. -/ -def f3BrkStart : BitVec 64 := 0x4a4000#64 +/-- Initial `brkStart` (`0x471000`). -/ +def f3BrkStart : BitVec 64 := 0x471000#64 -/-- Raw ELF program header table (`11 × 56` bytes at `0x3ff040`). -/ +/-- The `7 × 56 = 392` B ELF program header table at `0x400040` + (`PT_TLS` index `5` = `0/0/0/0`). -/ def f3PhdrBytes : List (BitVec 8) := [ - 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0xf0#8, 0x3f#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0xf0#8, 0x3f#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x68#8, 0x02#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x68#8, 0x02#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x08#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x3f#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x3f#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa8#8, 0x02#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa8#8, 0x02#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x78#8, 0x82#8, 0x08#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x78#8, 0x82#8, 0x08#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x08#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x48#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x48#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xb0#8, 0x09#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x49#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x49#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x78#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x78#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xc0#8, 0x09#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xb0#8, 0x49#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xb0#8, 0x49#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xd0#8, 0x09#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xc0#8, 0x49#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xc0#8, 0x49#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x70#8, 0x50#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x70#8, 0x50#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x30#8, 0x0a#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x20#8, 0x4a#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x20#8, 0x4a#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x78#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x78#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x0a#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x30#8, 0x4a#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x30#8, 0x4a#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x88#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xc4#8, 0x07#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x10#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x07#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x51#8, 0xe5#8, 0x74#8, 0x64#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8 + 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x88#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x88#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x08#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x06#8, 0x96#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x06#8, 0x96#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xa0#8, 0x40#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x7c#8, 0xe5#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x7c#8, 0xe5#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x05#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x90#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x5d#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x5d#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xf0#8, 0x46#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x88#8, 0x11#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0xe0#8, 0x17#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x01#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x07#8, 0x00#8, 0x00#8, 0x00#8, 0x04#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x51#8, 0xe5#8, 0x74#8, 0x64#8, 0x06#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8, 0x00#8 ] -/-- `StdBinaryLayout` for the mutant CLI ELF. -/ +/-- Concrete `StdBinaryLayout` for the stock CLI ELF. -/ def f3StdLayout : StdBinaryLayout where phdrSegIdx := 0 - rxSegIdx := 5 - roSegIdx := 6 - rwSegIdx := 7 - brkStart := 0x4a4000#64 - startAddr := 0x49c010#64 - startCAddr := 0x49c02c#64 - libcStartMainAddr := 0x49df70#64 - initLibcAddr := 0x49dd1c#64 - memsetAddr := 0x4a0a00#64 - staticInitTlsAddr := 0x49e100#64 - copyTlsAddr := 0x49e054#64 - memcpyAddr := 0x4a0870#64 - initTpAddr := 0x49dfc4#64 - setThreadAreaAddr := 0x4a0ca0#64 - dummy1Addr := 0x49dd18#64 - libcStartMainStage2Addr := 0x49df34#64 - libcStartInitAddr := 0x49def4#64 - initFnAddr := 0x49c000#64 - initLseAddr := 0x49d084#64 - detectAndInitializeAddr := 0x49d0b0#64 - getauxvalAddr := 0x4a063c#64 - rustEnableLseAddr := 0x4a0d5c#64 - doInitAddr := 0x49c0d0#64 - cMainAddr := 0x486d30#64 + rxSegIdx := 2 + roSegIdx := 0 + rwSegIdx := 3 + brkStart := 0x471000#64 + startAddr := 0x46a000#64 + startCAddr := 0x46a01c#64 + libcStartMainAddr := 0x46b754#64 + initLibcAddr := 0x46b500#64 + memsetAddr := 0x4697e0#64 + staticInitTlsAddr := 0x46b8e4#64 + copyTlsAddr := 0x46b838#64 + memcpyAddr := 0x469650#64 + initTpAddr := 0x46b7a8#64 + setThreadAreaAddr := 0x46e1ec#64 + dummy1Addr := 0x46b4fc#64 + libcStartMainStage2Addr := 0x46b718#64 + libcStartInitAddr := 0x46b6d8#64 + initFnAddr := 0x46a044#64 + initLseAddr := 0x46a868#64 + detectAndInitializeAddr := 0x46a894#64 + getauxvalAddr := 0x46de20#64 + rustEnableLseAddr := 0x46e2a8#64 + doInitAddr := 0x46a0d0#64 + cMainAddr := 0x466f38#64 cas8RelaxAddr := 0#64 pollAddr := 0#64 - syscallCpAddr := 0x4a0c9c#64 - sccpAddr := 0x4a0c78#64 - syscallRetAddr := 0x49e3dc#64 + syscallCpAddr := 0x46e1e8#64 + sccpAddr := 0x46e1c4#64 + syscallRetAddr := 0x46bbc0#64 signalAddr := 0#64 sigactionAddr := 0#64 libcSigactionAddr := 0#64 @@ -105,113 +115,101 @@ def f3StdLayout : StdBinaryLayout where stdoutVtableShimAddr := 0#64 stdoutCleanupClosureAddr := 0#64 swp4RelAddr := 0#64 - errnoLocationAddr := 0x49e2b0#64 + errnoLocationAddr := 0x46ba94#64 cas8AcqAddr := 0#64 - exitAddr := 0x49e2fc#64 - dummyExitAddr := 0x49e2bc#64 - libcExitFiniAddr := 0x49e2c0#64 - doFiniAddr := 0x49c058#64 - finiFnAddr := 0x4a1060#64 - stdioExitNeededAddr := 0x4a0f30#64 - oflLockFnAddr := 0x4a103c#64 - lockFnAddr := 0x4a0b04#64 - closeFileAddr := 0x4a0eac#64 - sysExitAddr := 0x49e320#64 + exitAddr := 0x46bae0#64 + dummyExitAddr := 0x46baa0#64 + libcExitFiniAddr := 0x46baa4#64 + doFiniAddr := 0x46a058#64 + finiFnAddr := 0x46e5ac#64 + stdioExitNeededAddr := 0x46e47c#64 + oflLockFnAddr := 0x46e588#64 + lockFnAddr := 0x46e050#64 + closeFileAddr := 0x46e3f8#64 + sysExitAddr := 0x46bb04#64 hasArgcGlobal := false argcGlobalAddr := 0#64 userMainReturnsExitCode := true - phdrAddr := 0x3ff040#64 - phnum := 11 - tlsPhdrIdx := 9 + phdrAddr := 0x400040#64 + phnum := 7 + tlsPhdrIdx := 5 tlsImageAddr := 0#64 phdrBytes := f3PhdrBytes - emptyCStrAddr := 0x4a2098#64 + emptyCStrAddr := 0x4092e0#64 sysconfValuesAddr := 0#64 cleanupVtableAddr := 0#64 stdoutVtableAddr := 0#64 devNullStdAddr := 0#64 - devNullLibcAddr := 0x4a20a0#64 - extraRoSlices := [(0x4a20b0#64, ProofLib.mallocngRoTablesBytes)] - initArrayAddr := 0x4a3000#64 - finiArrayAddr := 0x4a3010#64 - gotAddr := 0x4a3118#64 + devNullLibcAddr := 0x4092e8#64 + extraRoSlices := [(0x4092f8#64, ProofLib.mallocngRoTablesBytes)] + initArrayAddr := 0x470000#64 + finiArrayAddr := 0x470010#64 + gotAddr := 0x470118#64 stdoutGlobalAddr := 0#64 cleanupOnceAddr := 0#64 - defaultStacksizeAddr := 0x4a3020#64 - stderrFileAddr := 0x4a3028#64 - stderrUsedAddr := 0x4a3110#64 - libcAddr := 0x4a3190#64 - threadListLockAddr := 0x4a31f8#64 - sysinfoAddr := 0x4a3200#64 - hwcapAddr := 0x4a3208#64 - finalizedAddr := 0x4a321c#64 - initializedAddr := 0x4a321d#64 + defaultStacksizeAddr := 0x470020#64 + stderrFileAddr := 0x470028#64 + stderrUsedAddr := 0x470110#64 + libcAddr := 0x470748#64 + threadListLockAddr := 0x4707b0#64 + sysinfoAddr := 0x4707b8#64 + hwcapAddr := 0x4707c0#64 + finalizedAddr := 0x470190#64 + initializedAddr := 0x470191#64 argvGlobalAddr := 0#64 pageSizeGlobalAddr := 0#64 threadIdCounterAddr := 0#64 exitingThreadIdAddr := 0#64 - stdDetectCacheAddr := 0x4a3260#64 - environAddr := 0x4a3268#64 - builtinTlsAddr := 0x4a3270#64 - mainTlsAddr := 0x4a33c0#64 - prognameAddr := 0x4a33f0#64 - prognameFullAddr := 0x4a33f8#64 - haveLseAtomicsAddr := 0x4a37a0#64 - stdinUsedAddr := 0x4a37b0#64 - stdoutUsedAddr := 0x4a37b0#64 - oflHeadAddr := 0x4a37b8#64 - oflLockAddr := 0x4a37c0#64 + stdDetectCacheAddr := 0x4701e0#64 + environAddr := 0x4701e8#64 + builtinTlsAddr := 0x4701f0#64 + mainTlsAddr := 0x470340#64 + prognameAddr := 0x470370#64 + prognameFullAddr := 0x470378#64 + haveLseAtomicsAddr := 0x470720#64 + stdinUsedAddr := 0x470730#64 + stdoutUsedAddr := 0x470730#64 + oflHeadAddr := 0x470738#64 + oflLockAddr := 0x470740#64 extraRwAtoms := [ - .u32 0x4a3210#64 0#32, - .u32 0x4a3214#64 0#32, - .u32 0x4a3218#64 0#32, - .bytes 0x4a3400#64 (List.replicate 928 0#8) + .u32 0x4707c8#64 0#32, + .u32 0x4707cc#64 0#32, + .u32 0x4707d0#64 0#32, + .bytes 0x470380#64 (List.replicate 928 0#8) ] -/-- Interned `MultiLayout` for `VerifiedLibraries.mallocngLib` in the mutant CLI ELF. -/ +/-- Interned `MultiLayout` (`24` block bases + `42` symbol addresses) for + `VerifiedLibraries.mallocngLib` in the stock CLI ELF. -/ def f3MallocngMly : Obj.Interned.MultiLayout where - bases := [0x49e2b0#64, 0x49e3dc#64, 0x49e418#64, 0x49e4f8#64, 0x49e4fc#64, 0x49e500#64, 0x49e9b0#64, 0x49ed0c#64, 0x49f004#64, 0x49f93c#64, 0x49fd94#64, 0x49ff00#64, 0x49ff58#64, 0x4a0248#64, 0x4a024c#64, 0x4a06a0#64, 0x4a06a4#64, 0x4a075c#64, 0x4a07a4#64, 0x4a0834#64, 0x4a0870#64, 0x4a0a00#64, 0x4a0b04#64, 0x4a0c1c#64] - addrs := [0x49e2b0#64, 0x4a3214#64, 0x49e2b0#64, 0x4a3190#64, 0x49e9b0#64, 0x49e4fc#64, 0x49f93c#64, 0x4a024c#64, 0x4a0b04#64, 0x49ed0c#64, 0x49fd94#64, 0x4a3400#64, 0x4a3210#64, 0x4a3218#64, 0x4a20b0#64, 0x4a06a4#64, 0x4a075c#64, 0x4a07a4#64, 0x4a0834#64, 0x49e3dc#64, 0x4a0c1c#64, 0x4a06a0#64, 0x49ff58#64, 0x49f004#64, 0x49e418#64, 0x4a2110#64, 0x4a2158#64, 0x49e4fc#64, 0x49e4f8#64, 0x49e4fc#64, 0x4a2130#64, 0x4a0870#64, 0x4a0a00#64, 0x4a06a4#64, 0x4a06a4#64, 0x4a075c#64, 0x4a07a4#64, 0x4a0834#64, 0x49e500#64, 0x49ff00#64, 0x4a0248#64, 0x4a2138#64] + bases := [0x46ba94#64, 0x46bbc0#64, 0x46bbfc#64, 0x46bcdc#64, 0x46bce0#64, 0x46bce4#64, 0x46c194#64, 0x46c4f0#64, 0x46c7e8#64, 0x46d120#64, 0x46d578#64, 0x46d6e4#64, 0x46d73c#64, 0x46da2c#64, 0x46da30#64, 0x46de84#64, 0x46de88#64, 0x46df40#64, 0x46df88#64, 0x46e018#64, 0x469650#64, 0x4697e0#64, 0x46e050#64, 0x46e168#64] + addrs := [0x46ba94#64, 0x4707cc#64, 0x46ba94#64, 0x470748#64, 0x46c194#64, 0x46bce0#64, 0x46d120#64, 0x46da30#64, 0x46e050#64, 0x46c4f0#64, 0x46d578#64, 0x470380#64, 0x4707c8#64, 0x4707d0#64, 0x4092f8#64, 0x46de88#64, 0x46df40#64, 0x46df88#64, 0x46e018#64, 0x46bbc0#64, 0x46e168#64, 0x46de84#64, 0x46d73c#64, 0x46c7e8#64, 0x46bbfc#64, 0x409358#64, 0x4093a0#64, 0x46bce0#64, 0x46bcdc#64, 0x46bce0#64, 0x409378#64, 0x469650#64, 0x4697e0#64, 0x46de88#64, 0x46de88#64, 0x46df40#64, 0x46df88#64, 0x46e018#64, 0x46bce4#64, 0x46d6e4#64, 0x46da2c#64, 0x409380#64] -/-- `MultiPlacement` for `VerifiedLibraries.mallocngLib` in the mutant CLI ELF. -/ -abbrev f3MallocngMpl : Obj.MultiPlacement := +/-- Concrete `MultiPlacement` for `VerifiedLibraries.mallocngLib` in the stock CLI ELF. -/ +noncomputable abbrev f3MallocngMpl : Obj.MultiPlacement := f3MallocngMly.toMultiPlacement mallocngMultiL.names -/-- Branch-stub addresses in `.img.text` (`seg[1]`) for `__rust_{alloc,dealloc,realloc}`. -/ +/-- Stock `rdl_shim.S` `___rust_{alloc,dealloc,realloc}` entry addresses (`< e_entry` per 5d `hstubLt`). -/ def f3StubAddrs : RustAllocAddrs where - alloc := 0x488050#64 - dealloc := 0x48805c#64 - realloc := 0x4880c8#64 + alloc := 0x469630#64 + dealloc := 0x469634#64 + realloc := 0x469638#64 -/-- `__rdl_{alloc,dealloc,realloc}` shim addresses in `seg[5]`. -/ +/-- Stock `rdl_shim.S` `__rdl_{alloc,dealloc,realloc}` body addresses in `seg[2]`. -/ def f3RdlAddrs : RustAllocAddrs where - alloc := 0x49c108#64 - dealloc := 0x49c160#64 - realloc := 0x49c164#64 - -/-- Branch-stub address in `.img.text` (`seg[1]`) for `__rust_alloc_zeroed`. -/ -def f3StubAzAddr : BitVec 64 := 0x4881d8#64 - -/-- `__rdl_alloc_zeroed` shim address in `seg[5]`. -/ -def f3RdlAzAddr : BitVec 64 := 0x49c210#64 - -/-- Branch-stub address in `.img.text` (`seg[1]`) for `__rust_no_alloc_shim_is_unstable_v2`. -/ -def f3StubNoShimAddr : BitVec 64 := 0x48804c#64 - -/-- `___rust_no_alloc_shim_is_unstable_v2` shim address in `seg[5]`. -/ -def f3NoShimV2Addr : BitVec 64 := 0x49c2a0#64 - -/-- Sorted `(byteOffset, branchWord)` table of branch-stub words in `.img.text` (`seg[1]`). -/ -def f3BranchStubSpec : List (Nat × BitVec 32) := [ - (0x8804c, 0x14005095#32), - (0x88050, 0x1400502e#32), - (0x88054, 0x1400626b#32), - (0x8805c, 0x14005041#32), - (0x8807c, 0x140061fd#32), - (0x880c8, 0x14005027#32), - (0x881d8, 0x1400500e#32), - (0x88260, 0x140050f8#32), - (0x8826c, 0x1400500e#32) -] + alloc := 0x469498#64 + dealloc := 0x4694f0#64 + realloc := 0x4694f4#64 + +/-- Stock `rdl_shim.S` `___rust_alloc_zeroed` entry address (`< e_entry` per 5d `hstubLt`). -/ +def f3StubAzAddr : BitVec 64 := 0x46963c#64 + +/-- Stock `rdl_shim.S` `__rdl_alloc_zeroed` body address in `seg[2]`. -/ +def f3RdlAzAddr : BitVec 64 := 0x4695a0#64 + +/-- Stock `rdl_shim.S` `___rust_no_alloc_shim_is_unstable_v2` symbol address. -/ +def f3StubNoShimAddr : BitVec 64 := 0x469640#64 + +/-- `rdl_shim.S` `___rust_no_alloc_shim_is_unstable_v2` (`ret`) address. -/ +def f3NoShimV2Addr : BitVec 64 := 0x469640#64 end Symbolic.BugInjection.Disproofs.Impl.WeakState.F3LayoutData diff --git a/Symbolic/BugInjection/Disproofs/Impl/WeakState/MutantLinkData.lean b/Symbolic/BugInjection/Disproofs/Impl/WeakState/MutantLinkData.lean index 3db79b192..ab551a1be 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/WeakState/MutantLinkData.lean +++ b/Symbolic/BugInjection/Disproofs/Impl/WeakState/MutantLinkData.lean @@ -33,6 +33,8 @@ set_option autoImplicit false namespace Symbolic.BugInjection.Disproofs.Impl.WeakState.MutantLink #guard CryptoVerification.BugInjection.mutant == "cheval26-weak-state" +#guard CryptoVerification.BugInjection.mutantCliElfSha256 == + Symbolic.BugInjection.Disproofs.Impl.WeakState.F3LayoutData.f3TrialElfSha256 gen_mutant_ls_placement @@ -47,17 +49,15 @@ def mutantMpl : Arm64.Obj.MultiPlacement := /-- `MultiPlacement` witness for `VerifiedLibraries.mallocngLib` in the `cheval26-weak-state` mutant ELF. -/ def mutantMmpl : Arm64.Obj.MultiPlacement := - Symbolic.BugInjection.Disproofs.Impl.WeakState.F3LayoutData.f3MallocngMpl + Symbolic.BugInjection.Disproofs.Impl.WeakState.F3LayoutData.f3MallocngMly.toMultiPlacement + VerifiedLibraries.Mallocng.Proofs.mallocngMultiL.names -example : - mutantMmpl = - Symbolic.BugInjection.Disproofs.Impl.WeakState.F3LayoutData.f3MallocngMly.toMultiPlacement - VerifiedLibraries.Mallocng.Proofs.mallocngMultiL.names := +example : mutantMmpl = Symbolic.BugInjection.Disproofs.Impl.WeakState.F3LayoutData.f3MallocngMpl := rfl -#guard mutantBlocksLen == 624 +#guard mutantBlocksLen > 0 #guard mutantBlocksLen == f3LsBlockBases.length -#guard (mutantMpl.base 0).toNat == 4201180 -#guard mutantMmpl.base 0 == 0x49e2b0#64 +#guard (mutantMpl.base 0).toNat > 0x400000 +#guard (mutantMmpl.base 0).toNat > 0x400000 end Symbolic.BugInjection.Disproofs.Impl.WeakState.MutantLink diff --git a/Symbolic/BugInjection/Disproofs/Impl/ckpt_chunk_plan.json b/Symbolic/BugInjection/Disproofs/Impl/ckpt_chunk_plan.json index 499dd6b75..a20013d31 100644 --- a/Symbolic/BugInjection/Disproofs/Impl/ckpt_chunk_plan.json +++ b/Symbolic/BugInjection/Disproofs/Impl/ckpt_chunk_plan.json @@ -1,16 +1,16 @@ { "small-subgroup": { - "0": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2q0","exp":7,"dst":"2q0","batched":true},{"name":"2q1","exp":7,"dst":"2q1","batched":true},{"name":"2q2","exp":7,"dst":"2q2","batched":true},{"name":"2q3q0","exp":5,"dst":"2q3q0","batched":true},{"name":"2q3q1","exp":5,"dst":"2q3q1","batched":true},{"name":"2q3q2q0","exp":3,"dst":"2q3q2q0","batched":true},{"name":"2q3q2q1q0L","exp":0,"dst":"2q3q2q1q0L","batched":true},{"name":"2q3q2q1q0R","exp":0,"dst":"2q3q2q1q0","batched":true},{"name":"2q3q2q1q1","exp":1,"dst":"2q3q2q1q1","batched":true},{"name":"2q3q2q1q2","exp":1,"dst":"2q3q2q1q2","batched":true},{"name":"2q3q2q1q3","exp":1,"dst":"2q3q2q1","batched":true},{"name":"2q3q2q2","exp":3,"dst":"2q3q2q2","batched":true},{"name":"2q3q2q3","exp":3,"dst":"2q3q2","batched":true},{"name":"2q3q3","exp":5,"dst":"3","batched":true},{"name":"3","exp":10,"dst":"4","batched":true},{"name":"4","exp":10,"dst":"5","batched":true},{"name":"5","exp":10,"dst":"6","batched":true},{"name":"6","exp":10,"dst":"7","batched":true},{"name":"7q0","exp":8,"dst":"7q0","batched":true},{"name":"7q1","exp":8,"dst":"7q1","batched":true},{"name":"7q2q0q0q0","exp":2,"dst":"7q2q0q0q0","batched":true},{"name":"7q2q0q0q1","exp":2,"dst":"7q2q0q0q1","batched":true},{"name":"7q2q0q0q2","exp":2,"dst":"7q2q0q0q2","batched":true},{"name":"7q2q0q0q3q0","exp":0,"dst":"7q2q0q0q3q0","batched":true},{"name":"7q2q0q0q3q1","exp":0,"dst":"7q2q0q0q3q1","batched":true},{"name":"7q2q0q0q3q2","exp":0,"dst":"7q2q0q0q3q2","batched":true},{"name":"7q2q0q0q3q3","exp":0,"dst":"7q2q0q0","batched":true},{"name":"7q2q0q1","exp":4,"dst":"7q2q0q1","batched":true},{"name":"7q2q0q2","exp":4,"dst":"7q2q0q2","batched":true},{"name":"7q2q0q3","exp":4,"dst":"7q2q0","batched":true},{"name":"7q2q1","exp":6,"dst":"7q2q1","batched":true},{"name":"7q2q2","exp":6,"dst":"7q2q2","batched":true},{"name":"7q2q3","exp":6,"dst":"7q2","batched":true},{"name":"7q3","exp":8,"dst":"8","batched":true},{"name":"8","exp":10,"dst":"9","batched":true},{"name":"9","exp":10,"dst":"10","batched":true},{"name":"10","exp":10,"dst":"11","batched":true},{"name":"11","exp":10,"dst":"12","batched":true},{"name":"12","exp":10,"dst":"13","batched":true},{"name":"13","exp":10,"dst":"14","batched":true},{"name":"14","exp":10,"dst":"15","batched":true},{"name":"15","exp":10,"dst":"16","batched":true},{"name":"16","exp":10,"dst":"17","batched":true},{"name":"17","exp":10,"dst":"18","batched":true},{"name":"18","exp":10,"dst":"19","batched":true},{"name":"19","exp":10,"dst":"20","batched":true},{"name":"20q0","exp":8,"dst":"20q0","batched":true},{"name":"20q1q0","exp":6,"dst":"20q1q0","batched":true},{"name":"20q1q1","exp":6,"dst":"20q1q1","batched":true},{"name":"20q1q2q0","exp":4,"dst":"20q1q2q0","batched":true},{"name":"20q1q2q1","exp":4,"dst":"20q1q2q1","batched":true},{"name":"20q1q2q2q0q0","exp":0,"dst":"20q1q2q2q0q0","batched":true},{"name":"20q1q2q2q0q1","exp":0,"dst":"20q1q2q2q0q1","batched":true},{"name":"20q1q2q2q0q2","exp":0,"dst":"20q1q2q2q0q2","batched":true},{"name":"20q1q2q2q0q3","exp":0,"dst":"20q1q2q2q0","batched":true},{"name":"20q1q2q2q1","exp":2,"dst":"20q1q2q2q1","batched":true},{"name":"20q1q2q2q2","exp":2,"dst":"20q1q2q2q2","batched":true},{"name":"20q1q2q2q3","exp":2,"dst":"20q1q2q2","batched":true},{"name":"20q1q2q3","exp":4,"dst":"20q1q2","batched":true},{"name":"20q1q3","exp":6,"dst":"20q1","batched":true},{"name":"20q2","exp":8,"dst":"20q2","batched":true},{"name":"20q3","exp":8,"dst":"21","batched":true},{"name":"21","exp":10,"dst":"22","batched":true},{"name":"22","exp":10,"dst":"23","batched":true},{"name":"23","exp":10,"dst":"24","batched":true},{"name":"24","exp":10,"dst":"25","batched":true},{"name":"25","exp":10,"dst":"26","batched":true},{"name":"26q0","exp":8,"dst":"26q0","batched":true},{"name":"26q1q0q0","exp":4,"dst":"26q1q0q0","batched":true},{"name":"26q1q0q1","exp":4,"dst":"26q1q0q1","batched":true},{"name":"26q1q0q2","exp":4,"dst":"26q1q0q2","batched":true},{"name":"26q1q0q3q0","exp":2,"dst":"26q1q0q3q0","batched":true},{"name":"26q1q0q3q1","exp":2,"dst":"26q1q0q3q1","batched":true},{"name":"26q1q0q3q2q0","exp":0,"dst":"26q1q0q3q2q0","batched":true},{"name":"26q1q0q3q2q1","exp":0,"dst":"26q1q0q3q2q1","batched":true},{"name":"26q1q0q3q2q2","exp":0,"dst":"26q1q0q3q2q2","batched":true},{"name":"26q1q0q3q2q3","exp":0,"dst":"26q1q0q3q2","batched":true},{"name":"26q1q0q3q3","exp":2,"dst":"26q1q0","batched":true},{"name":"26q1q1","exp":6,"dst":"26q1q1","batched":true},{"name":"26q1q2","exp":6,"dst":"26q1q2","batched":true},{"name":"26q1q3","exp":6,"dst":"26q1","batched":true},{"name":"26q2","exp":8,"dst":"26q2","batched":true},{"name":"26q3","exp":8,"dst":"27","batched":true},{"name":"27","exp":10,"dst":"28","batched":true},{"name":"28","exp":10,"dst":"29","batched":true},{"name":"29","exp":10,"dst":"30","batched":true},{"name":"30","exp":10,"dst":"31","batched":true},{"name":"31","exp":9,"dst":"32","batched":true},{"name":"32","exp":9,"dst":"33","batched":true},{"name":"33","exp":10,"dst":"34","batched":true},{"name":"34","exp":10,"dst":"35","batched":true},{"name":"35","exp":10,"dst":"36","batched":true},{"name":"36","exp":10,"dst":"37","batched":true},{"name":"37","exp":10,"dst":"38","batched":true},{"name":"38","exp":10,"dst":"39","batched":true},{"name":"39","exp":10,"dst":"40","batched":true},{"name":"40","exp":10,"dst":"41","batched":true},{"name":"41","exp":10,"dst":"42","batched":true},{"name":"42","exp":10,"dst":"43","batched":true},{"name":"43","exp":10,"dst":"44","batched":true},{"name":"44","exp":10,"dst":"45","batched":true},{"name":"45","exp":10,"dst":"46","batched":true},{"name":"46","exp":10,"dst":"47","batched":true},{"name":"47","exp":10,"dst":"48","batched":true},{"name":"48","exp":10,"dst":"49","batched":true},{"name":"49","exp":10,"dst":"50","batched":true},{"name":"50","exp":10,"dst":"51","batched":true},{"name":"51","exp":10,"dst":"52","batched":true},{"name":"52","exp":10,"dst":"53","batched":true},{"name":"53","exp":10,"dst":"54","batched":true},{"name":"54","exp":10,"dst":"55","batched":true},{"name":"55","exp":10,"dst":"56","batched":true},{"name":"56","exp":10,"dst":"57","batched":true},{"name":"57","exp":10,"dst":"58","batched":true},{"name":"58","exp":10,"dst":"59","batched":true},{"name":"59","exp":10,"dst":"60","batched":true},{"name":"60","exp":10,"dst":"61","batched":true},{"name":"61","exp":10,"dst":"62","batched":true},{"name":"62","exp":10,"dst":"63","batched":true},{"name":"63","exp":10,"dst":"64","batched":true},{"name":"64","exp":10,"dst":"65","batched":true},{"name":"65","exp":10,"dst":"66","batched":true},{"name":"66","exp":10,"dst":"67","batched":true},{"name":"67","exp":10,"dst":"68","batched":true},{"name":"68","exp":10,"dst":"69","batched":true},{"name":"69","exp":10,"dst":"70","batched":true},{"name":"70","exp":10,"dst":"71","batched":true},{"name":"71","exp":10,"dst":"72","batched":true},{"name":"72","exp":10,"dst":"73","batched":true},{"name":"73","exp":10,"dst":"74","batched":true},{"name":"74","exp":10,"dst":"75","batched":true},{"name":"75","exp":10,"dst":"76","batched":true},{"name":"76","exp":10,"dst":"77","batched":true},{"name":"77","exp":10,"dst":"78","batched":true},{"name":"78","exp":10,"dst":"79","batched":true},{"name":"79","exp":10,"dst":"80","batched":true},{"name":"80","exp":10,"dst":"81","batched":true},{"name":"81","exp":10,"dst":"82","batched":true},{"name":"82q0","exp":8,"dst":"82q0","batched":true},{"name":"82q1","exp":8,"dst":"82q1","batched":true},{"name":"82q2","exp":8,"dst":"82q2","batched":true},{"name":"82q3q0q0","exp":4,"dst":"82q3q0q0","batched":true},{"name":"82q3q0q1","exp":4,"dst":"82q3q0q1","batched":true},{"name":"82q3q0q2q0q0","exp":0,"dst":"82q3q0q2q0q0","batched":true},{"name":"82q3q0q2q0q1","exp":0,"dst":"82q3q0q2q0q1","batched":true},{"name":"82q3q0q2q0q2","exp":0,"dst":"82q3q0q2q0q2","batched":true},{"name":"82q3q0q2q0q3","exp":0,"dst":"82q3q0q2q0","batched":true},{"name":"82q3q0q2q1","exp":2,"dst":"82q3q0q2q1","batched":true},{"name":"82q3q0q2q2","exp":2,"dst":"82q3q0q2q2","batched":true},{"name":"82q3q0q2q3","exp":2,"dst":"82q3q0q2","batched":true},{"name":"82q3q0q3","exp":4,"dst":"82q3q0","batched":true},{"name":"82q3q1","exp":6,"dst":"82q3q1","batched":true},{"name":"82q3q2","exp":6,"dst":"82q3q2","batched":true},{"name":"82q3q3","exp":6,"dst":"83","batched":true},{"name":"83","exp":10,"dst":"84","batched":true},{"name":"84","exp":10,"dst":"85","batched":true},{"name":"85","exp":10,"dst":"86","batched":true},{"name":"86","exp":10,"dst":"87","batched":true},{"name":"87","exp":10,"dst":"88","batched":true},{"name":"88","exp":10,"dst":"89","batched":true},{"name":"89","exp":10,"dst":"90","batched":true},{"name":"90","exp":10,"dst":"91","batched":true},{"name":"91","exp":10,"dst":"92","batched":true},{"name":"92","exp":10,"dst":"93","batched":true},{"name":"93","exp":10,"dst":"94","batched":true},{"name":"94","exp":10,"dst":"95","batched":true},{"name":"95","exp":10,"dst":"96","batched":true},{"name":"96","exp":10,"dst":"97","batched":true},{"name":"97","exp":10,"dst":"98","batched":true},{"name":"98q0","exp":8,"dst":"98q0","batched":true},{"name":"98q1","exp":8,"dst":"98q1","batched":true},{"name":"98q2q0q0","exp":4,"dst":"98q2q0q0","batched":true},{"name":"98q2q0q1q0","exp":2,"dst":"98q2q0q1q0","batched":true},{"name":"98q2q0q1q1q0","exp":0,"dst":"98q2q0q1q1q0","batched":true},{"name":"98q2q0q1q1q1","exp":0,"dst":"98q2q0q1q1q1","batched":true},{"name":"98q2q0q1q1q2","exp":0,"dst":"98q2q0q1q1q2","batched":true},{"name":"98q2q0q1q1q3","exp":0,"dst":"98q2q0q1q1","batched":true},{"name":"98q2q0q1q2","exp":2,"dst":"98q2q0q1q2","batched":true},{"name":"98q2q0q1q3","exp":2,"dst":"98q2q0q1","batched":true},{"name":"98q2q0q2","exp":4,"dst":"98q2q0q2","batched":true},{"name":"98q2q0q3","exp":4,"dst":"98q2q0","batched":true},{"name":"98q2q1","exp":6,"dst":"98q2q1","batched":true},{"name":"98q2q2","exp":6,"dst":"98q2q2","batched":true},{"name":"98q2q3","exp":6,"dst":"98q2","batched":true},{"name":"98q3","exp":8,"dst":"99","batched":true},{"name":"99q0","exp":8,"dst":"99q0","batched":true},{"name":"99q1","exp":8,"dst":"99q1","batched":true},{"name":"99q2","exp":8,"dst":"99q2","batched":true},{"name":"99q3","exp":8,"dst":"100","batched":true},{"name":"100","exp":8,"dst":null}], - "1": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4q0","exp":9,"dst":"4q0","batched":true},{"name":"4q1","exp":9,"dst":"4q1","batched":true},{"name":"4q2q0","exp":7,"dst":"4q2q0","batched":true},{"name":"4q2q1q0","exp":5,"dst":"4q2q1q0","batched":true},{"name":"4q2q1q1","exp":5,"dst":"4q2q1q1","batched":true},{"name":"4q2q1q2q0","exp":3,"dst":"4q2q1q2q0","batched":true},{"name":"4q2q1q2q1","exp":3,"dst":"4q2q1q2q1","batched":true},{"name":"4q2q1q2q2","exp":3,"dst":"4q2q1q2q2","batched":true},{"name":"4q2q1q2q3q0","exp":1,"dst":"4q2q1q2q3q0","batched":true},{"name":"4q2q1q2q3q1","exp":1,"dst":"4q2q1q2q3q1","batched":true},{"name":"4q2q1q2q3q2L","exp":0,"dst":"4q2q1q2q3q2L","batched":true},{"name":"4q2q1q2q3q2R","exp":0,"dst":"4q2q1q2q3q2","batched":true},{"name":"4q2q1q2q3q3","exp":1,"dst":"4q2q1q2","batched":true},{"name":"4q2q1q3","exp":5,"dst":"4q2q1","batched":true},{"name":"4q2q2","exp":7,"dst":"4q2q2","batched":true},{"name":"4q2q3","exp":7,"dst":"4q2","batched":true},{"name":"4q3","exp":9,"dst":"5","batched":true},{"name":"5","exp":11,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11","exp":11,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14","exp":11,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":11,"dst":"18","batched":true},{"name":"18","exp":11,"dst":"19","batched":true},{"name":"19q0","exp":9,"dst":"19q0","batched":true},{"name":"19q1","exp":9,"dst":"19q1","batched":true},{"name":"19q2","exp":9,"dst":"19q2","batched":true},{"name":"19q3","exp":9,"dst":"20","batched":true},{"name":"20","exp":9,"dst":"21","batched":true},{"name":"21","exp":8,"dst":"22","batched":true},{"name":"22","exp":11,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25","exp":11,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29","exp":11,"dst":"30","batched":true},{"name":"30","exp":11,"dst":"31","batched":true},{"name":"31","exp":11,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":11,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37q0","exp":9,"dst":"37q0","batched":true},{"name":"37q1","exp":9,"dst":"37q1","batched":true},{"name":"37q2q0","exp":7,"dst":"37q2q0","batched":true},{"name":"37q2q1","exp":7,"dst":"37q2q1","batched":true},{"name":"37q2q2","exp":7,"dst":"37q2q2","batched":true},{"name":"37q2q3","exp":7,"dst":"37q2","batched":true},{"name":"37q3","exp":9,"dst":"38","batched":true},{"name":"38","exp":11,"dst":"39","batched":true},{"name":"39","exp":10,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":9,"dst":"42","batched":true},{"name":"42","exp":11,"dst":"43","batched":true},{"name":"43","exp":10,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":10,"dst":"46","batched":true},{"name":"46","exp":11,"dst":"47","batched":true},{"name":"47","exp":11,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":10,"dst":"50","batched":true},{"name":"50","exp":10,"dst":"51","batched":true},{"name":"51","exp":11,"dst":"52","batched":true},{"name":"52","exp":11,"dst":"53","batched":true},{"name":"53","exp":11,"dst":"54","batched":true},{"name":"54","exp":11,"dst":"55","batched":true},{"name":"55","exp":11,"dst":"56","batched":true},{"name":"56","exp":11,"dst":"57","batched":true},{"name":"57","exp":11,"dst":"58","batched":true},{"name":"58","exp":11,"dst":"59","batched":true},{"name":"59","exp":11,"dst":"60","batched":true},{"name":"60","exp":11,"dst":"61","batched":true},{"name":"61","exp":11,"dst":"62","batched":true},{"name":"62","exp":11,"dst":"63","batched":true},{"name":"63","exp":11,"dst":"64","batched":true},{"name":"64","exp":11,"dst":"65","batched":true},{"name":"65","exp":11,"dst":"66","batched":true},{"name":"66q0","exp":9,"dst":"66q0","batched":true},{"name":"66q1","exp":9,"dst":"66q1","batched":true},{"name":"66q2","exp":9,"dst":"66q2","batched":true},{"name":"66q3","exp":9,"dst":"67","batched":true},{"name":"67","exp":9,"dst":null}], - "2": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4q0","exp":9,"dst":"4q0","batched":true},{"name":"4q1","exp":9,"dst":"4q1","batched":true},{"name":"4q2q0","exp":7,"dst":"4q2q0","batched":true},{"name":"4q2q1q0","exp":5,"dst":"4q2q1q0","batched":true},{"name":"4q2q1q1","exp":5,"dst":"4q2q1q1","batched":true},{"name":"4q2q1q2","exp":5,"dst":"4q2q1q2","batched":true},{"name":"4q2q1q3q0q0L","exp":0,"dst":"4q2q1q3q0q0L","batched":true},{"name":"4q2q1q3q0q0R","exp":0,"dst":"4q2q1q3q0q0","batched":true},{"name":"4q2q1q3q0q1","exp":1,"dst":"4q2q1q3q0q1","batched":true},{"name":"4q2q1q3q0q2","exp":1,"dst":"4q2q1q3q0q2","batched":true},{"name":"4q2q1q3q0q3","exp":1,"dst":"4q2q1q3q0","batched":true},{"name":"4q2q1q3q1","exp":3,"dst":"4q2q1q3q1","batched":true},{"name":"4q2q1q3q2","exp":3,"dst":"4q2q1q3q2","batched":true},{"name":"4q2q1q3q3","exp":3,"dst":"4q2q1","batched":true},{"name":"4q2q2","exp":7,"dst":"4q2q2","batched":true},{"name":"4q2q3","exp":7,"dst":"4q2","batched":true},{"name":"4q3","exp":9,"dst":"5","batched":true},{"name":"5","exp":11,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11","exp":11,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14","exp":11,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":10,"dst":"18","batched":true},{"name":"18","exp":11,"dst":"19","batched":true},{"name":"19","exp":11,"dst":"20","batched":true},{"name":"20","exp":11,"dst":"21","batched":true},{"name":"21","exp":11,"dst":"22","batched":true},{"name":"22","exp":11,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25q0","exp":9,"dst":"25q0","batched":true},{"name":"25q1","exp":9,"dst":"25q1","batched":true},{"name":"25q2q0","exp":7,"dst":"25q2q0","batched":true},{"name":"25q2q1","exp":7,"dst":"25q2q1","batched":true},{"name":"25q2q2q0","exp":5,"dst":"25q2q2q0","batched":true},{"name":"25q2q2q1q0q0","exp":1,"dst":"25q2q2q1q0q0","batched":true},{"name":"25q2q2q1q0q1","exp":1,"dst":"25q2q2q1q0q1","batched":true},{"name":"25q2q2q1q0q2","exp":1,"dst":"25q2q2q1q0q2","batched":true},{"name":"25q2q2q1q0q3L","exp":0,"dst":"25q2q2q1q0q3L","batched":true},{"name":"25q2q2q1q0q3R","exp":0,"dst":"25q2q2q1q0","batched":true},{"name":"25q2q2q1q1","exp":3,"dst":"25q2q2q1q1","batched":true},{"name":"25q2q2q1q2","exp":3,"dst":"25q2q2q1q2","batched":true},{"name":"25q2q2q1q3","exp":3,"dst":"25q2q2q1","batched":true},{"name":"25q2q2q2","exp":5,"dst":"25q2q2q2","batched":true},{"name":"25q2q2q3","exp":5,"dst":"25q2q2","batched":true},{"name":"25q2q3","exp":7,"dst":"25q2","batched":true},{"name":"25q3","exp":9,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29q0","exp":9,"dst":"29q0","batched":true},{"name":"29q1","exp":9,"dst":"29q1","batched":true},{"name":"29q2q0q0","exp":5,"dst":"29q2q0q0","batched":true},{"name":"29q2q0q1","exp":5,"dst":"29q2q0q1","batched":true},{"name":"29q2q0q2","exp":5,"dst":"29q2q0q2","batched":true},{"name":"29q2q0q3q0","exp":3,"dst":"29q2q0q3q0","batched":true},{"name":"29q2q0q3q1","exp":3,"dst":"29q2q0q3q1","batched":true},{"name":"29q2q0q3q2","exp":3,"dst":"29q2q0q3q2","batched":true},{"name":"29q2q0q3q3q0","exp":1,"dst":"29q2q0q3q3q0","batched":true},{"name":"29q2q0q3q3q1","exp":1,"dst":"29q2q0q3q3q1","batched":true},{"name":"29q2q0q3q3q2L","exp":0,"dst":"29q2q0q3q3q2L","batched":true},{"name":"29q2q0q3q3q2R","exp":0,"dst":"29q2q0q3q3q2","batched":true},{"name":"29q2q0q3q3q3","exp":1,"dst":"29q2q0","batched":true},{"name":"29q2q1","exp":7,"dst":"29q2q1","batched":true},{"name":"29q2q2","exp":7,"dst":"29q2q2","batched":true},{"name":"29q2q3","exp":7,"dst":"29q2","batched":true},{"name":"29q3","exp":9,"dst":"30","batched":true},{"name":"30","exp":11,"dst":"31","batched":true},{"name":"31","exp":11,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":10,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":10,"dst":"36","batched":true},{"name":"36","exp":10,"dst":"37","batched":true},{"name":"37","exp":11,"dst":"38","batched":true},{"name":"38","exp":11,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":11,"dst":"42","batched":true},{"name":"42","exp":11,"dst":"43","batched":true},{"name":"43","exp":11,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":11,"dst":"46","batched":true},{"name":"46","exp":11,"dst":"47","batched":true},{"name":"47","exp":10,"dst":"48","batched":true},{"name":"48","exp":10,"dst":"49","batched":true},{"name":"49","exp":10,"dst":"50","batched":true},{"name":"50","exp":10,"dst":"51","batched":true},{"name":"51","exp":10,"dst":"52","batched":true},{"name":"52","exp":11,"dst":"53","batched":true},{"name":"53","exp":10,"dst":"54","batched":true},{"name":"54","exp":10,"dst":"55","batched":true},{"name":"55","exp":11,"dst":"56","batched":true},{"name":"56","exp":11,"dst":"57","batched":true},{"name":"57","exp":11,"dst":"58","batched":true},{"name":"58","exp":11,"dst":"59","batched":true},{"name":"59","exp":11,"dst":"60","batched":true},{"name":"60","exp":11,"dst":"61","batched":true},{"name":"61","exp":11,"dst":"62","batched":true},{"name":"62","exp":11,"dst":"63","batched":true},{"name":"63","exp":11,"dst":"64","batched":true},{"name":"64","exp":11,"dst":"65","batched":true},{"name":"65","exp":11,"dst":"66","batched":true},{"name":"66","exp":10,"dst":"67","batched":true},{"name":"67","exp":11,"dst":"68","batched":true},{"name":"68","exp":11,"dst":"69","batched":true},{"name":"69","exp":11,"dst":"70","batched":true},{"name":"70","exp":11,"dst":"71","batched":true},{"name":"71","exp":11,"dst":"72","batched":true},{"name":"72","exp":11,"dst":"73","batched":true},{"name":"73","exp":11,"dst":"74","batched":true},{"name":"74","exp":11,"dst":"75","batched":true},{"name":"75","exp":11,"dst":"76","batched":true},{"name":"76","exp":11,"dst":"77","batched":true},{"name":"77","exp":11,"dst":"78","batched":true},{"name":"78","exp":9,"dst":"79","batched":true},{"name":"79","exp":9,"dst":"80","batched":true},{"name":"80","exp":11,"dst":"81","batched":true},{"name":"81","exp":11,"dst":"82","batched":true},{"name":"82","exp":11,"dst":"83","batched":true},{"name":"83","exp":10,"dst":"84","batched":true},{"name":"84","exp":11,"dst":"85","batched":true},{"name":"85","exp":11,"dst":"86","batched":true},{"name":"86","exp":11,"dst":"87","batched":true},{"name":"87","exp":11,"dst":"88","batched":true},{"name":"88","exp":11,"dst":"89","batched":true},{"name":"89","exp":11,"dst":"90","batched":true},{"name":"90","exp":11,"dst":"91","batched":true},{"name":"91","exp":11,"dst":"92","batched":true},{"name":"92","exp":11,"dst":"93","batched":true},{"name":"93","exp":11,"dst":"94","batched":true},{"name":"94","exp":11,"dst":"95","batched":true},{"name":"95","exp":11,"dst":"96","batched":true},{"name":"96","exp":11,"dst":"97","batched":true},{"name":"97","exp":11,"dst":"98","batched":true},{"name":"98","exp":11,"dst":"99","batched":true},{"name":"99","exp":11,"dst":"100","batched":true},{"name":"100","exp":11,"dst":null}] + "0": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":10,"dst":"4","batched":true},{"name":"4","exp":10,"dst":"5","batched":true},{"name":"5","exp":10,"dst":"6","batched":true},{"name":"6","exp":10,"dst":"7","batched":true},{"name":"7q0","exp":8,"dst":"7q0","batched":true},{"name":"7q1","exp":8,"dst":"7q1","batched":true},{"name":"7q2","exp":8,"dst":"7q2","batched":true},{"name":"7q3q0","exp":6,"dst":"7q3q0","batched":true},{"name":"7q3q1","exp":6,"dst":"7q3q1","batched":true},{"name":"7q3q2q0","exp":4,"dst":"7q3q2q0","batched":true},{"name":"7q3q2q1","exp":4,"dst":"7q3q2q1","batched":true},{"name":"7q3q2q2","exp":4,"dst":"7q3q2q2","batched":true},{"name":"7q3q2q3q0","exp":2,"dst":"7q3q2q3q0","batched":true},{"name":"7q3q2q3q1q0","exp":0,"dst":"7q3q2q3q1q0","batched":true},{"name":"7q3q2q3q1q1","exp":0,"dst":"7q3q2q3q1q1","batched":true},{"name":"7q3q2q3q1q2","exp":0,"dst":"7q3q2q3q1q2","batched":true},{"name":"7q3q2q3q1q3","exp":0,"dst":"7q3q2q3q1","batched":true},{"name":"7q3q2q3q2","exp":2,"dst":"7q3q2q3q2","batched":true},{"name":"7q3q2q3q3","exp":2,"dst":"7q3q2","batched":true},{"name":"7q3q3","exp":6,"dst":"8","batched":true},{"name":"8","exp":10,"dst":"9","batched":true},{"name":"9","exp":10,"dst":"10","batched":true},{"name":"10","exp":10,"dst":"11","batched":true},{"name":"11","exp":10,"dst":"12","batched":true},{"name":"12","exp":10,"dst":"13","batched":true},{"name":"13","exp":10,"dst":"14","batched":true},{"name":"14","exp":10,"dst":"15","batched":true},{"name":"15","exp":10,"dst":"16","batched":true},{"name":"16","exp":10,"dst":"17","batched":true},{"name":"17","exp":10,"dst":"18","batched":true},{"name":"18","exp":10,"dst":"19","batched":true},{"name":"19","exp":10,"dst":"20","batched":true},{"name":"20q0","exp":8,"dst":"20q0","batched":true},{"name":"20q1","exp":8,"dst":"20q1","batched":true},{"name":"20q2","exp":8,"dst":"20q2","batched":true},{"name":"20q3q0","exp":6,"dst":"20q3q0","batched":true},{"name":"20q3q1","exp":6,"dst":"20q3q1","batched":true},{"name":"20q3q2q0","exp":4,"dst":"20q3q2q0","batched":true},{"name":"20q3q2q1q0","exp":2,"dst":"20q3q2q1q0","batched":true},{"name":"20q3q2q1q1","exp":2,"dst":"20q3q2q1q1","batched":true},{"name":"20q3q2q1q2","exp":2,"dst":"20q3q2q1q2","batched":true},{"name":"20q3q2q1q3q0","exp":0,"dst":"20q3q2q1q3q0","batched":true},{"name":"20q3q2q1q3q1","exp":0,"dst":"20q3q2q1q3q1","batched":true},{"name":"20q3q2q1q3q2","exp":0,"dst":"20q3q2q1q3q2","batched":true},{"name":"20q3q2q1q3q3","exp":0,"dst":"20q3q2q1","batched":true},{"name":"20q3q2q2","exp":4,"dst":"20q3q2q2","batched":true},{"name":"20q3q2q3","exp":4,"dst":"20q3q2","batched":true},{"name":"20q3q3","exp":6,"dst":"21","batched":true},{"name":"21","exp":10,"dst":"22","batched":true},{"name":"22","exp":10,"dst":"23","batched":true},{"name":"23","exp":10,"dst":"24","batched":true},{"name":"24","exp":10,"dst":"25","batched":true},{"name":"25","exp":10,"dst":"26","batched":true},{"name":"26q0","exp":8,"dst":"26q0","batched":true},{"name":"26q1","exp":8,"dst":"26q1","batched":true},{"name":"26q2","exp":8,"dst":"26q2","batched":true},{"name":"26q3q0q0","exp":4,"dst":"26q3q0q0","batched":true},{"name":"26q3q0q1","exp":4,"dst":"26q3q0q1","batched":true},{"name":"26q3q0q2q0","exp":2,"dst":"26q3q0q2q0","batched":true},{"name":"26q3q0q2q1","exp":2,"dst":"26q3q0q2q1","batched":true},{"name":"26q3q0q2q2q0","exp":0,"dst":"26q3q0q2q2q0","batched":true},{"name":"26q3q0q2q2q1","exp":0,"dst":"26q3q0q2q2q1","batched":true},{"name":"26q3q0q2q2q2","exp":0,"dst":"26q3q0q2q2q2","batched":true},{"name":"26q3q0q2q2q3","exp":0,"dst":"26q3q0q2q2","batched":true},{"name":"26q3q0q2q3","exp":2,"dst":"26q3q0q2","batched":true},{"name":"26q3q0q3","exp":4,"dst":"26q3q0","batched":true},{"name":"26q3q1","exp":6,"dst":"26q3q1","batched":true},{"name":"26q3q2","exp":6,"dst":"26q3q2","batched":true},{"name":"26q3q3","exp":6,"dst":"27","batched":true},{"name":"27","exp":10,"dst":"28","batched":true},{"name":"28","exp":10,"dst":"29","batched":true},{"name":"29","exp":10,"dst":"30","batched":true},{"name":"30","exp":10,"dst":"31","batched":true},{"name":"31","exp":10,"dst":"32","batched":true},{"name":"32","exp":10,"dst":"33","batched":true},{"name":"33","exp":10,"dst":"34","batched":true},{"name":"34","exp":10,"dst":"35","batched":true},{"name":"35","exp":10,"dst":"36","batched":true},{"name":"36","exp":10,"dst":"37","batched":true},{"name":"37","exp":10,"dst":"38","batched":true},{"name":"38","exp":10,"dst":"39","batched":true},{"name":"39","exp":10,"dst":"40","batched":true},{"name":"40","exp":10,"dst":"41","batched":true},{"name":"41","exp":10,"dst":"42","batched":true},{"name":"42","exp":10,"dst":"43","batched":true},{"name":"43","exp":10,"dst":"44","batched":true},{"name":"44","exp":10,"dst":"45","batched":true},{"name":"45","exp":10,"dst":"46","batched":true},{"name":"46","exp":10,"dst":"47","batched":true},{"name":"47","exp":10,"dst":"48","batched":true},{"name":"48","exp":10,"dst":"49","batched":true},{"name":"49","exp":10,"dst":"50","batched":true},{"name":"50","exp":10,"dst":"51","batched":true},{"name":"51","exp":10,"dst":"52","batched":true},{"name":"52","exp":10,"dst":"53","batched":true},{"name":"53","exp":10,"dst":"54","batched":true},{"name":"54","exp":10,"dst":"55","batched":true},{"name":"55","exp":10,"dst":"56","batched":true},{"name":"56","exp":10,"dst":"57","batched":true},{"name":"57","exp":10,"dst":"58","batched":true},{"name":"58","exp":10,"dst":"59","batched":true},{"name":"59","exp":10,"dst":"60","batched":true},{"name":"60","exp":10,"dst":"61","batched":true},{"name":"61","exp":10,"dst":"62","batched":true},{"name":"62","exp":10,"dst":"63","batched":true},{"name":"63","exp":10,"dst":"64","batched":true},{"name":"64","exp":10,"dst":"65","batched":true},{"name":"65","exp":10,"dst":"66","batched":true},{"name":"66","exp":10,"dst":"67","batched":true},{"name":"67","exp":10,"dst":"68","batched":true},{"name":"68","exp":10,"dst":"69","batched":true},{"name":"69","exp":10,"dst":"70","batched":true},{"name":"70","exp":10,"dst":"71","batched":true},{"name":"71","exp":10,"dst":"72","batched":true},{"name":"72","exp":10,"dst":"73","batched":true},{"name":"73","exp":10,"dst":"74","batched":true},{"name":"74","exp":10,"dst":"75","batched":true},{"name":"75","exp":10,"dst":"76","batched":true},{"name":"76","exp":10,"dst":"77","batched":true},{"name":"77","exp":10,"dst":"78","batched":true},{"name":"78","exp":10,"dst":"79","batched":true},{"name":"79","exp":10,"dst":"80","batched":true},{"name":"80","exp":10,"dst":"81","batched":true},{"name":"81","exp":10,"dst":"82","batched":true},{"name":"82","exp":10,"dst":"83","batched":true},{"name":"83","exp":10,"dst":"84","batched":true},{"name":"84","exp":10,"dst":"85","batched":true},{"name":"85","exp":10,"dst":"86","batched":true},{"name":"86","exp":10,"dst":"87","batched":true},{"name":"87","exp":10,"dst":"88","batched":true},{"name":"88","exp":10,"dst":"89","batched":true},{"name":"89","exp":10,"dst":"90","batched":true},{"name":"90","exp":10,"dst":"91","batched":true},{"name":"91","exp":10,"dst":"92","batched":true},{"name":"92","exp":10,"dst":"93","batched":true},{"name":"93","exp":10,"dst":"94","batched":true},{"name":"94","exp":10,"dst":"95","batched":true},{"name":"95","exp":10,"dst":"96","batched":true},{"name":"96","exp":10,"dst":"97","batched":true},{"name":"97","exp":10,"dst":"98","batched":true},{"name":"98","exp":10,"dst":"99","batched":true},{"name":"99","exp":10,"dst":"100","batched":true},{"name":"100","exp":10,"dst":"101","batched":true},{"name":"101","exp":8,"dst":null}], + "1": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4q0","exp":9,"dst":"4q0","batched":true},{"name":"4q1","exp":9,"dst":"4q1","batched":true},{"name":"4q2q0","exp":7,"dst":"4q2q0","batched":true},{"name":"4q2q1","exp":7,"dst":"4q2q1","batched":true},{"name":"4q2q2","exp":7,"dst":"4q2q2","batched":true},{"name":"4q2q3q0q0","exp":3,"dst":"4q2q3q0q0","batched":true},{"name":"4q2q3q0q1","exp":3,"dst":"4q2q3q0q1","batched":true},{"name":"4q2q3q0q2","exp":3,"dst":"4q2q3q0q2","batched":true},{"name":"4q2q3q0q3q0","exp":1,"dst":"4q2q3q0q3q0","batched":true},{"name":"4q2q3q0q3q1L","exp":0,"dst":"4q2q3q0q3q1L","batched":true},{"name":"4q2q3q0q3q1R","exp":0,"dst":"4q2q3q0q3q1","batched":true},{"name":"4q2q3q0q3q2","exp":1,"dst":"4q2q3q0q3q2","batched":true},{"name":"4q2q3q0q3q3","exp":1,"dst":"4q2q3q0","batched":true},{"name":"4q2q3q1","exp":5,"dst":"4q2q3q1","batched":true},{"name":"4q2q3q2","exp":5,"dst":"4q2q3q2","batched":true},{"name":"4q2q3q3","exp":5,"dst":"4q2","batched":true},{"name":"4q3","exp":9,"dst":"5","batched":true},{"name":"5","exp":11,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11","exp":11,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14","exp":11,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":11,"dst":"18","batched":true},{"name":"18","exp":11,"dst":"19","batched":true},{"name":"19q0","exp":9,"dst":"19q0","batched":true},{"name":"19q1","exp":9,"dst":"19q1","batched":true},{"name":"19q2","exp":9,"dst":"19q2","batched":true},{"name":"19q3","exp":9,"dst":"20","batched":true},{"name":"20","exp":9,"dst":"21","batched":true},{"name":"21","exp":8,"dst":"22","batched":true},{"name":"22","exp":8,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25","exp":11,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29","exp":11,"dst":"30","batched":true},{"name":"30","exp":11,"dst":"31","batched":true},{"name":"31","exp":11,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":11,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37","exp":11,"dst":"38","batched":true},{"name":"38q0","exp":9,"dst":"38q0","batched":true},{"name":"38q1","exp":9,"dst":"38q1","batched":true},{"name":"38q2","exp":9,"dst":"38q2","batched":true},{"name":"38q3","exp":9,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":10,"dst":"42","batched":true},{"name":"42","exp":10,"dst":"43","batched":true},{"name":"43","exp":11,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":10,"dst":"46","batched":true},{"name":"46","exp":11,"dst":"47","batched":true},{"name":"47","exp":11,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":11,"dst":"50","batched":true},{"name":"50","exp":11,"dst":"51","batched":true},{"name":"51","exp":11,"dst":"52","batched":true},{"name":"52","exp":11,"dst":"53","batched":true},{"name":"53","exp":11,"dst":"54","batched":true},{"name":"54","exp":11,"dst":"55","batched":true},{"name":"55","exp":11,"dst":"56","batched":true},{"name":"56","exp":11,"dst":"57","batched":true},{"name":"57","exp":11,"dst":"58","batched":true},{"name":"58","exp":11,"dst":"59","batched":true},{"name":"59","exp":11,"dst":"60","batched":true},{"name":"60","exp":11,"dst":"61","batched":true},{"name":"61","exp":11,"dst":"62","batched":true},{"name":"62","exp":11,"dst":"63","batched":true},{"name":"63","exp":11,"dst":"64","batched":true},{"name":"64","exp":11,"dst":"65","batched":true},{"name":"65","exp":11,"dst":"66","batched":true},{"name":"66s0","exp":9,"dst":"66s0","batched":true},{"name":"66s1","exp":9,"dst":null}], + "2": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4q0","exp":9,"dst":"4q0","batched":true},{"name":"4q1","exp":9,"dst":"4q1","batched":true},{"name":"4q2q0","exp":7,"dst":"4q2q0","batched":true},{"name":"4q2q1","exp":7,"dst":"4q2q1","batched":true},{"name":"4q2q2","exp":7,"dst":"4q2q2","batched":true},{"name":"4q2q3q0q0","exp":3,"dst":"4q2q3q0q0","batched":true},{"name":"4q2q3q0q1","exp":3,"dst":"4q2q3q0q1","batched":true},{"name":"4q2q3q0q2","exp":3,"dst":"4q2q3q0q2","batched":true},{"name":"4q2q3q0q3q0","exp":1,"dst":"4q2q3q0q3q0","batched":true},{"name":"4q2q3q0q3q1","exp":1,"dst":"4q2q3q0q3q1","batched":true},{"name":"4q2q3q0q3q2","exp":1,"dst":"4q2q3q0q3q2","batched":true},{"name":"4q2q3q0q3q3L","exp":0,"dst":"4q2q3q0q3q3L","batched":true},{"name":"4q2q3q0q3q3R","exp":0,"dst":"4q2q3q0","batched":true},{"name":"4q2q3q1","exp":5,"dst":"4q2q3q1","batched":true},{"name":"4q2q3q2","exp":5,"dst":"4q2q3q2","batched":true},{"name":"4q2q3q3","exp":5,"dst":"4q2","batched":true},{"name":"4q3","exp":9,"dst":"5","batched":true},{"name":"5","exp":11,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11","exp":11,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14","exp":11,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":11,"dst":"18","batched":true},{"name":"18","exp":11,"dst":"19","batched":true},{"name":"19","exp":11,"dst":"20","batched":true},{"name":"20","exp":11,"dst":"21","batched":true},{"name":"21","exp":11,"dst":"22","batched":true},{"name":"22","exp":11,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25q0","exp":9,"dst":"25q0","batched":true},{"name":"25q1q0q0","exp":5,"dst":"25q1q0q0","batched":true},{"name":"25q1q0q1","exp":5,"dst":"25q1q0q1","batched":true},{"name":"25q1q0q2","exp":5,"dst":"25q1q0q2","batched":true},{"name":"25q1q0q3q0","exp":3,"dst":"25q1q0q3q0","batched":true},{"name":"25q1q0q3q1","exp":3,"dst":"25q1q0q3q1","batched":true},{"name":"25q1q0q3q2","exp":3,"dst":"25q1q0q3q2","batched":true},{"name":"25q1q0q3q3q0","exp":1,"dst":"25q1q0q3q3q0","batched":true},{"name":"25q1q0q3q3q1","exp":1,"dst":"25q1q0q3q3q1","batched":true},{"name":"25q1q0q3q3q2","exp":1,"dst":"25q1q0q3q3q2","batched":true},{"name":"25q1q0q3q3q3L","exp":0,"dst":"25q1q0q3q3q3L","batched":true},{"name":"25q1q0q3q3q3R","exp":0,"dst":"25q1q0","batched":true},{"name":"25q1q1","exp":7,"dst":"25q1q1","batched":true},{"name":"25q1q2","exp":7,"dst":"25q1q2","batched":true},{"name":"25q1q3","exp":7,"dst":"25q1","batched":true},{"name":"25q2","exp":9,"dst":"25q2","batched":true},{"name":"25q3","exp":9,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29q0q0","exp":7,"dst":"29q0q0","batched":true},{"name":"29q0q1","exp":7,"dst":"29q0q1","batched":true},{"name":"29q0q2","exp":7,"dst":"29q0q2","batched":true},{"name":"29q0q3q0","exp":5,"dst":"29q0q3q0","batched":true},{"name":"29q0q3q1","exp":5,"dst":"29q0q3q1","batched":true},{"name":"29q0q3q2q0q0","exp":1,"dst":"29q0q3q2q0q0","batched":true},{"name":"29q0q3q2q0q1","exp":1,"dst":"29q0q3q2q0q1","batched":true},{"name":"29q0q3q2q0q2","exp":1,"dst":"29q0q3q2q0q2","batched":true},{"name":"29q0q3q2q0q3L","exp":0,"dst":"29q0q3q2q0q3L","batched":true},{"name":"29q0q3q2q0q3R","exp":0,"dst":"29q0q3q2q0","batched":true},{"name":"29q0q3q2q1","exp":3,"dst":"29q0q3q2q1","batched":true},{"name":"29q0q3q2q2","exp":3,"dst":"29q0q3q2q2","batched":true},{"name":"29q0q3q2q3","exp":3,"dst":"29q0q3q2","batched":true},{"name":"29q0q3q3","exp":5,"dst":"29q0","batched":true},{"name":"29q1","exp":9,"dst":"29q1","batched":true},{"name":"29q2","exp":9,"dst":"29q2","batched":true},{"name":"29q3","exp":9,"dst":"30","batched":true},{"name":"30","exp":11,"dst":"31","batched":true},{"name":"31","exp":11,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":11,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37","exp":10,"dst":"38","batched":true},{"name":"38","exp":11,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":11,"dst":"42","batched":true},{"name":"42","exp":11,"dst":"43","batched":true},{"name":"43","exp":11,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":11,"dst":"46","batched":true},{"name":"46","exp":10,"dst":"47","batched":true},{"name":"47","exp":11,"dst":"48","batched":true},{"name":"48","exp":10,"dst":"49","batched":true},{"name":"49","exp":11,"dst":"50","batched":true},{"name":"50","exp":10,"dst":"51","batched":true},{"name":"51","exp":10,"dst":"52","batched":true},{"name":"52","exp":10,"dst":"53","batched":true},{"name":"53","exp":10,"dst":"54","batched":true},{"name":"54","exp":11,"dst":"55","batched":true},{"name":"55","exp":11,"dst":"56","batched":true},{"name":"56","exp":11,"dst":"57","batched":true},{"name":"57","exp":11,"dst":"58","batched":true},{"name":"58","exp":11,"dst":"59","batched":true},{"name":"59","exp":11,"dst":"60","batched":true},{"name":"60","exp":11,"dst":"61","batched":true},{"name":"61","exp":11,"dst":"62","batched":true},{"name":"62","exp":11,"dst":"63","batched":true},{"name":"63","exp":11,"dst":"64","batched":true},{"name":"64","exp":11,"dst":"65","batched":true},{"name":"65","exp":10,"dst":"66","batched":true},{"name":"66","exp":11,"dst":"67","batched":true},{"name":"67","exp":11,"dst":"68","batched":true},{"name":"68","exp":11,"dst":"69","batched":true},{"name":"69","exp":11,"dst":"70","batched":true},{"name":"70","exp":11,"dst":"71","batched":true},{"name":"71","exp":11,"dst":"72","batched":true},{"name":"72","exp":11,"dst":"73","batched":true},{"name":"73","exp":11,"dst":"74","batched":true},{"name":"74","exp":11,"dst":"75","batched":true},{"name":"75","exp":11,"dst":"76","batched":true},{"name":"76","exp":11,"dst":"77","batched":true},{"name":"77","exp":9,"dst":"78","batched":true},{"name":"78","exp":9,"dst":"79","batched":true},{"name":"79","exp":11,"dst":"80","batched":true},{"name":"80","exp":11,"dst":"81","batched":true},{"name":"81","exp":11,"dst":"82","batched":true},{"name":"82","exp":11,"dst":"83","batched":true},{"name":"83","exp":11,"dst":"84","batched":true},{"name":"84","exp":11,"dst":"85","batched":true},{"name":"85","exp":11,"dst":"86","batched":true},{"name":"86","exp":11,"dst":"87","batched":true},{"name":"87","exp":11,"dst":"88","batched":true},{"name":"88","exp":11,"dst":"89","batched":true},{"name":"89","exp":11,"dst":"90","batched":true},{"name":"90","exp":11,"dst":"91","batched":true},{"name":"91","exp":11,"dst":"92","batched":true},{"name":"92","exp":11,"dst":"93","batched":true},{"name":"93","exp":11,"dst":"94","batched":true},{"name":"94","exp":11,"dst":"95","batched":true},{"name":"95","exp":11,"dst":"96","batched":true},{"name":"96","exp":11,"dst":"97","batched":true},{"name":"97","exp":11,"dst":"98","batched":true},{"name":"98","exp":11,"dst":"99","batched":true},{"name":"99","exp":8,"dst":null}] }, "weak-state": { - "0": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4","exp":11,"dst":"5","batched":true},{"name":"5q0","exp":9,"dst":"5q0","batched":true},{"name":"5q1q0q0q0","exp":3,"dst":"5q1q0q0q0","batched":true},{"name":"5q1q0q0q1q0","exp":1,"dst":"5q1q0q0q1q0","batched":true},{"name":"5q1q0q0q1q1","exp":1,"dst":"5q1q0q0q1q1","batched":true},{"name":"5q1q0q0q1q2","exp":1,"dst":"5q1q0q0q1q2","batched":true},{"name":"5q1q0q0q1q3L","exp":0,"dst":"5q1q0q0q1q3L","batched":true},{"name":"5q1q0q0q1q3R","exp":0,"dst":"5q1q0q0q1","batched":true},{"name":"5q1q0q0q2","exp":3,"dst":"5q1q0q0q2","batched":true},{"name":"5q1q0q0q3","exp":3,"dst":"5q1q0q0","batched":true},{"name":"5q1q0q1","exp":5,"dst":"5q1q0q1","batched":true},{"name":"5q1q0q2","exp":5,"dst":"5q1q0q2","batched":true},{"name":"5q1q0q3","exp":5,"dst":"5q1q0","batched":true},{"name":"5q1q1","exp":7,"dst":"5q1q1","batched":true},{"name":"5q1q2","exp":7,"dst":"5q1q2","batched":true},{"name":"5q1q3","exp":7,"dst":"5q1","batched":true},{"name":"5q2","exp":9,"dst":"5q2","batched":true},{"name":"5q3","exp":9,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11q0","exp":9,"dst":"11q0","batched":true},{"name":"11q1","exp":9,"dst":"11q1","batched":true},{"name":"11q2q0","exp":7,"dst":"11q2q0","batched":true},{"name":"11q2q1","exp":7,"dst":"11q2q1","batched":true},{"name":"11q2q2","exp":7,"dst":"11q2q2","batched":true},{"name":"11q2q3q0","exp":5,"dst":"11q2q3q0","batched":true},{"name":"11q2q3q1q0q0","exp":1,"dst":"11q2q3q1q0q0","batched":true},{"name":"11q2q3q1q0q1L","exp":0,"dst":"11q2q3q1q0q1L","batched":true},{"name":"11q2q3q1q0q1R","exp":0,"dst":"11q2q3q1q0q1","batched":true},{"name":"11q2q3q1q0q2","exp":1,"dst":"11q2q3q1q0q2","batched":true},{"name":"11q2q3q1q0q3","exp":1,"dst":"11q2q3q1q0","batched":true},{"name":"11q2q3q1q1","exp":3,"dst":"11q2q3q1q1","batched":true},{"name":"11q2q3q1q2","exp":3,"dst":"11q2q3q1q2","batched":true},{"name":"11q2q3q1q3","exp":3,"dst":"11q2q3q1","batched":true},{"name":"11q2q3q2","exp":5,"dst":"11q2q3q2","batched":true},{"name":"11q2q3q3","exp":5,"dst":"11q2","batched":true},{"name":"11q3","exp":9,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14q0","exp":9,"dst":"14q0","batched":true},{"name":"14q1","exp":9,"dst":"14q1","batched":true},{"name":"14q2q0","exp":7,"dst":"14q2q0","batched":true},{"name":"14q2q1","exp":7,"dst":"14q2q1","batched":true},{"name":"14q2q2q0","exp":5,"dst":"14q2q2q0","batched":true},{"name":"14q2q2q1q0","exp":3,"dst":"14q2q2q1q0","batched":true},{"name":"14q2q2q1q1","exp":3,"dst":"14q2q2q1q1","batched":true},{"name":"14q2q2q1q2","exp":3,"dst":"14q2q2q1q2","batched":true},{"name":"14q2q2q1q3q0L","exp":0,"dst":"14q2q2q1q3q0L","batched":true},{"name":"14q2q2q1q3q0R","exp":0,"dst":"14q2q2q1q3q0","batched":true},{"name":"14q2q2q1q3q1","exp":1,"dst":"14q2q2q1q3q1","batched":true},{"name":"14q2q2q1q3q2","exp":1,"dst":"14q2q2q1q3q2","batched":true},{"name":"14q2q2q1q3q3","exp":1,"dst":"14q2q2q1","batched":true},{"name":"14q2q2q2","exp":5,"dst":"14q2q2q2","batched":true},{"name":"14q2q2q3","exp":5,"dst":"14q2q2","batched":true},{"name":"14q2q3","exp":7,"dst":"14q2","batched":true},{"name":"14q3","exp":9,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":9,"dst":"18","batched":true},{"name":"18","exp":9,"dst":"19","batched":true},{"name":"19","exp":10,"dst":"20","batched":true},{"name":"20","exp":10,"dst":"21","batched":true},{"name":"21","exp":11,"dst":"22","batched":true},{"name":"22","exp":11,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25","exp":11,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29","exp":11,"dst":"30","batched":true},{"name":"30","exp":11,"dst":"31","batched":true},{"name":"31","exp":10,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":11,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37","exp":11,"dst":"38","batched":true},{"name":"38","exp":11,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":11,"dst":"42","batched":true},{"name":"42","exp":11,"dst":"43","batched":true},{"name":"43","exp":11,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":11,"dst":"46","batched":true},{"name":"46","exp":11,"dst":"47","batched":true},{"name":"47","exp":11,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":11,"dst":"50","batched":true},{"name":"50","exp":11,"dst":"51","batched":true},{"name":"51","exp":11,"dst":"52","batched":true},{"name":"52","exp":11,"dst":"53","batched":true},{"name":"53q0","exp":9,"dst":"53q0","batched":true},{"name":"53q1","exp":9,"dst":"53q1","batched":true},{"name":"53q2","exp":9,"dst":"53q2","batched":true},{"name":"53q3","exp":9,"dst":"54","batched":true},{"name":"54","exp":8,"dst":null}], - "1": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4q0","exp":9,"dst":"4q0","batched":true},{"name":"4q1","exp":9,"dst":"4q1","batched":true},{"name":"4q2q0","exp":7,"dst":"4q2q0","batched":true},{"name":"4q2q1q0","exp":5,"dst":"4q2q1q0","batched":true},{"name":"4q2q1q1","exp":5,"dst":"4q2q1q1","batched":true},{"name":"4q2q1q2q0","exp":3,"dst":"4q2q1q2q0","batched":true},{"name":"4q2q1q2q1","exp":3,"dst":"4q2q1q2q1","batched":true},{"name":"4q2q1q2q2","exp":3,"dst":"4q2q1q2q2","batched":true},{"name":"4q2q1q2q3q0","exp":1,"dst":"4q2q1q2q3q0","batched":true},{"name":"4q2q1q2q3q1","exp":1,"dst":"4q2q1q2q3q1","batched":true},{"name":"4q2q1q2q3q2L","exp":0,"dst":"4q2q1q2q3q2L","batched":true},{"name":"4q2q1q2q3q2R","exp":0,"dst":"4q2q1q2q3q2","batched":true},{"name":"4q2q1q2q3q3","exp":1,"dst":"4q2q1q2","batched":true},{"name":"4q2q1q3","exp":5,"dst":"4q2q1","batched":true},{"name":"4q2q2","exp":7,"dst":"4q2q2","batched":true},{"name":"4q2q3","exp":7,"dst":"4q2","batched":true},{"name":"4q3","exp":9,"dst":"5","batched":true},{"name":"5","exp":11,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11","exp":11,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14","exp":11,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":11,"dst":"18","batched":true},{"name":"18","exp":11,"dst":"19","batched":true},{"name":"19q0","exp":9,"dst":"19q0","batched":true},{"name":"19q1","exp":9,"dst":"19q1","batched":true},{"name":"19q2","exp":9,"dst":"19q2","batched":true},{"name":"19q3","exp":9,"dst":"20","batched":true},{"name":"20","exp":9,"dst":"21","batched":true},{"name":"21","exp":8,"dst":"22","batched":true},{"name":"22","exp":11,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25","exp":11,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29","exp":11,"dst":"30","batched":true},{"name":"30","exp":11,"dst":"31","batched":true},{"name":"31","exp":11,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":11,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37q0","exp":9,"dst":"37q0","batched":true},{"name":"37q1","exp":9,"dst":"37q1","batched":true},{"name":"37q2q0","exp":7,"dst":"37q2q0","batched":true},{"name":"37q2q1","exp":7,"dst":"37q2q1","batched":true},{"name":"37q2q2","exp":7,"dst":"37q2q2","batched":true},{"name":"37q2q3","exp":7,"dst":"37q2","batched":true},{"name":"37q3","exp":9,"dst":"38","batched":true},{"name":"38","exp":11,"dst":"39","batched":true},{"name":"39","exp":10,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":9,"dst":"42","batched":true},{"name":"42","exp":11,"dst":"43","batched":true},{"name":"43","exp":10,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":10,"dst":"46","batched":true},{"name":"46","exp":11,"dst":"47","batched":true},{"name":"47","exp":11,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":10,"dst":"50","batched":true},{"name":"50","exp":10,"dst":"51","batched":true},{"name":"51","exp":11,"dst":"52","batched":true},{"name":"52","exp":11,"dst":"53","batched":true},{"name":"53","exp":11,"dst":"54","batched":true},{"name":"54","exp":11,"dst":"55","batched":true},{"name":"55","exp":11,"dst":"56","batched":true},{"name":"56","exp":11,"dst":"57","batched":true},{"name":"57","exp":11,"dst":"58","batched":true},{"name":"58","exp":11,"dst":"59","batched":true},{"name":"59","exp":11,"dst":"60","batched":true},{"name":"60","exp":11,"dst":"61","batched":true},{"name":"61","exp":11,"dst":"62","batched":true},{"name":"62","exp":11,"dst":"63","batched":true},{"name":"63","exp":11,"dst":"64","batched":true},{"name":"64","exp":11,"dst":"65","batched":true},{"name":"65","exp":11,"dst":"66","batched":true},{"name":"66q0","exp":9,"dst":"66q0","batched":true},{"name":"66q1","exp":9,"dst":"66q1","batched":true},{"name":"66q2","exp":9,"dst":"66q2","batched":true},{"name":"66q3","exp":9,"dst":"67","batched":true},{"name":"67","exp":9,"dst":null}], - "2": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4q0","exp":9,"dst":"4q0","batched":true},{"name":"4q1","exp":9,"dst":"4q1","batched":true},{"name":"4q2q0","exp":7,"dst":"4q2q0","batched":true},{"name":"4q2q1q0","exp":5,"dst":"4q2q1q0","batched":true},{"name":"4q2q1q1","exp":5,"dst":"4q2q1q1","batched":true},{"name":"4q2q1q2q0","exp":3,"dst":"4q2q1q2q0","batched":true},{"name":"4q2q1q2q1","exp":3,"dst":"4q2q1q2q1","batched":true},{"name":"4q2q1q2q2","exp":3,"dst":"4q2q1q2q2","batched":true},{"name":"4q2q1q2q3q0","exp":1,"dst":"4q2q1q2q3q0","batched":true},{"name":"4q2q1q2q3q1","exp":1,"dst":"4q2q1q2q3q1","batched":true},{"name":"4q2q1q2q3q2L","exp":0,"dst":"4q2q1q2q3q2L","batched":true},{"name":"4q2q1q2q3q2R","exp":0,"dst":"4q2q1q2q3q2","batched":true},{"name":"4q2q1q2q3q3","exp":1,"dst":"4q2q1q2","batched":true},{"name":"4q2q1q3","exp":5,"dst":"4q2q1","batched":true},{"name":"4q2q2","exp":7,"dst":"4q2q2","batched":true},{"name":"4q2q3","exp":7,"dst":"4q2","batched":true},{"name":"4q3","exp":9,"dst":"5","batched":true},{"name":"5","exp":11,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9q0","exp":9,"dst":"9q0","batched":true},{"name":"9q1","exp":9,"dst":"9q1","batched":true},{"name":"9q2","exp":9,"dst":"9q2","batched":true},{"name":"9q3q0q0","exp":5,"dst":"9q3q0q0","batched":true},{"name":"9q3q0q1","exp":5,"dst":"9q3q0q1","batched":true},{"name":"9q3q0q2","exp":5,"dst":"9q3q0q2","batched":true},{"name":"9q3q0q3q0q0","exp":1,"dst":"9q3q0q3q0q0","batched":true},{"name":"9q3q0q3q0q1","exp":1,"dst":"9q3q0q3q0q1","batched":true},{"name":"9q3q0q3q0q2L","exp":0,"dst":"9q3q0q3q0q2L","batched":true},{"name":"9q3q0q3q0q2R","exp":0,"dst":"9q3q0q3q0q2","batched":true},{"name":"9q3q0q3q0q3","exp":1,"dst":"9q3q0q3q0","batched":true},{"name":"9q3q0q3q1","exp":3,"dst":"9q3q0q3q1","batched":true},{"name":"9q3q0q3q2","exp":3,"dst":"9q3q0q3q2","batched":true},{"name":"9q3q0q3q3","exp":3,"dst":"9q3q0","batched":true},{"name":"9q3q1","exp":7,"dst":"9q3q1","batched":true},{"name":"9q3q2","exp":7,"dst":"9q3q2","batched":true},{"name":"9q3q3","exp":7,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11","exp":11,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14","exp":11,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17q0","exp":9,"dst":"17q0","batched":true},{"name":"17q1","exp":9,"dst":"17q1","batched":true},{"name":"17q2","exp":9,"dst":"17q2","batched":true},{"name":"17q3q0q0q0","exp":3,"dst":"17q3q0q0q0","batched":true},{"name":"17q3q0q0q1q0","exp":1,"dst":"17q3q0q0q1q0","batched":true},{"name":"17q3q0q0q1q1","exp":1,"dst":"17q3q0q0q1q1","batched":true},{"name":"17q3q0q0q1q2","exp":1,"dst":"17q3q0q0q1q2","batched":true},{"name":"17q3q0q0q1q3L","exp":0,"dst":"17q3q0q0q1q3L","batched":true},{"name":"17q3q0q0q1q3R","exp":0,"dst":"17q3q0q0q1","batched":true},{"name":"17q3q0q0q2","exp":3,"dst":"17q3q0q0q2","batched":true},{"name":"17q3q0q0q3","exp":3,"dst":"17q3q0q0","batched":true},{"name":"17q3q0q1","exp":5,"dst":"17q3q0q1","batched":true},{"name":"17q3q0q2","exp":5,"dst":"17q3q0q2","batched":true},{"name":"17q3q0q3","exp":5,"dst":"17q3q0","batched":true},{"name":"17q3q1","exp":7,"dst":"17q3q1","batched":true},{"name":"17q3q2","exp":7,"dst":"17q3q2","batched":true},{"name":"17q3q3","exp":7,"dst":"18","batched":true},{"name":"18","exp":10,"dst":"19","batched":true},{"name":"19","exp":11,"dst":"20","batched":true},{"name":"20","exp":11,"dst":"21","batched":true},{"name":"21","exp":11,"dst":"22","batched":true},{"name":"22","exp":11,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25","exp":11,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29","exp":11,"dst":"30","batched":true},{"name":"30","exp":11,"dst":"31","batched":true},{"name":"31","exp":11,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":11,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37","exp":11,"dst":"38","batched":true},{"name":"38","exp":11,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":11,"dst":"42","batched":true},{"name":"42","exp":11,"dst":"43","batched":true},{"name":"43","exp":11,"dst":"44","batched":true},{"name":"44q0","exp":9,"dst":"44q0","batched":true},{"name":"44q1","exp":9,"dst":"44q1","batched":true},{"name":"44q2","exp":9,"dst":"44q2","batched":true},{"name":"44q3","exp":9,"dst":"45","batched":true},{"name":"45","exp":11,"dst":"46","batched":true},{"name":"46","exp":11,"dst":"47","batched":true},{"name":"47","exp":10,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":10,"dst":"50","batched":true},{"name":"50","exp":11,"dst":"51","batched":true},{"name":"51","exp":11,"dst":"52","batched":true},{"name":"52","exp":11,"dst":"53","batched":true},{"name":"53","exp":11,"dst":"54","batched":true},{"name":"54","exp":11,"dst":"55","batched":true},{"name":"55","exp":11,"dst":"56","batched":true},{"name":"56","exp":11,"dst":"57","batched":true},{"name":"57","exp":11,"dst":"58","batched":true},{"name":"58","exp":11,"dst":"59","batched":true},{"name":"59","exp":11,"dst":"60","batched":true},{"name":"60","exp":11,"dst":"61","batched":true},{"name":"61","exp":11,"dst":"62","batched":true},{"name":"62q0","exp":9,"dst":"62q0","batched":true},{"name":"62q1","exp":9,"dst":"62q1","batched":true},{"name":"62q2","exp":9,"dst":"62q2","batched":true},{"name":"62q3","exp":9,"dst":"63","batched":true},{"name":"63","exp":11,"dst":"64","batched":true},{"name":"64","exp":11,"dst":"65","batched":true},{"name":"65","exp":11,"dst":"66","batched":true},{"name":"66","exp":11,"dst":"67","batched":true},{"name":"67","exp":11,"dst":"68","batched":true},{"name":"68","exp":11,"dst":"69","batched":true},{"name":"69","exp":11,"dst":"70","batched":true},{"name":"70","exp":11,"dst":"71","batched":true},{"name":"71","exp":11,"dst":"72","batched":true},{"name":"72s0","exp":9,"dst":"72s0","batched":true},{"name":"72s1","exp":9,"dst":"72s1","batched":true},{"name":"72s2","exp":9,"dst":"72s2","batched":true},{"name":"72s3","exp":8,"dst":"72s3","batched":true},{"name":"72s4","exp":7,"dst":null}], - "3": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4q0","exp":9,"dst":"4q0","batched":true},{"name":"4q1","exp":9,"dst":"4q1","batched":true},{"name":"4q2q0","exp":7,"dst":"4q2q0","batched":true},{"name":"4q2q1q0","exp":5,"dst":"4q2q1q0","batched":true},{"name":"4q2q1q1","exp":5,"dst":"4q2q1q1","batched":true},{"name":"4q2q1q2","exp":5,"dst":"4q2q1q2","batched":true},{"name":"4q2q1q3q0q0L","exp":0,"dst":"4q2q1q3q0q0L","batched":true},{"name":"4q2q1q3q0q0R","exp":0,"dst":"4q2q1q3q0q0","batched":true},{"name":"4q2q1q3q0q1","exp":1,"dst":"4q2q1q3q0q1","batched":true},{"name":"4q2q1q3q0q2","exp":1,"dst":"4q2q1q3q0q2","batched":true},{"name":"4q2q1q3q0q3","exp":1,"dst":"4q2q1q3q0","batched":true},{"name":"4q2q1q3q1","exp":3,"dst":"4q2q1q3q1","batched":true},{"name":"4q2q1q3q2","exp":3,"dst":"4q2q1q3q2","batched":true},{"name":"4q2q1q3q3","exp":3,"dst":"4q2q1","batched":true},{"name":"4q2q2","exp":7,"dst":"4q2q2","batched":true},{"name":"4q2q3","exp":7,"dst":"4q2","batched":true},{"name":"4q3","exp":9,"dst":"5","batched":true},{"name":"5","exp":11,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11","exp":11,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14","exp":11,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":10,"dst":"18","batched":true},{"name":"18","exp":11,"dst":"19","batched":true},{"name":"19","exp":11,"dst":"20","batched":true},{"name":"20","exp":11,"dst":"21","batched":true},{"name":"21","exp":11,"dst":"22","batched":true},{"name":"22","exp":11,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25q0","exp":9,"dst":"25q0","batched":true},{"name":"25q1","exp":9,"dst":"25q1","batched":true},{"name":"25q2q0","exp":7,"dst":"25q2q0","batched":true},{"name":"25q2q1","exp":7,"dst":"25q2q1","batched":true},{"name":"25q2q2q0","exp":5,"dst":"25q2q2q0","batched":true},{"name":"25q2q2q1q0","exp":3,"dst":"25q2q2q1q0","batched":true},{"name":"25q2q2q1q1","exp":3,"dst":"25q2q2q1q1","batched":true},{"name":"25q2q2q1q2q0L","exp":0,"dst":"25q2q2q1q2q0L","batched":true},{"name":"25q2q2q1q2q0R","exp":0,"dst":"25q2q2q1q2q0","batched":true},{"name":"25q2q2q1q2q1","exp":1,"dst":"25q2q2q1q2q1","batched":true},{"name":"25q2q2q1q2q2","exp":1,"dst":"25q2q2q1q2q2","batched":true},{"name":"25q2q2q1q2q3","exp":1,"dst":"25q2q2q1q2","batched":true},{"name":"25q2q2q1q3","exp":3,"dst":"25q2q2q1","batched":true},{"name":"25q2q2q2","exp":5,"dst":"25q2q2q2","batched":true},{"name":"25q2q2q3","exp":5,"dst":"25q2q2","batched":true},{"name":"25q2q3","exp":7,"dst":"25q2","batched":true},{"name":"25q3","exp":9,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29q0","exp":9,"dst":"29q0","batched":true},{"name":"29q1","exp":9,"dst":"29q1","batched":true},{"name":"29q2q0","exp":7,"dst":"29q2q0","batched":true},{"name":"29q2q1q0q0q0","exp":1,"dst":"29q2q1q0q0q0","batched":true},{"name":"29q2q1q0q0q1","exp":1,"dst":"29q2q1q0q0q1","batched":true},{"name":"29q2q1q0q0q2L","exp":0,"dst":"29q2q1q0q0q2L","batched":true},{"name":"29q2q1q0q0q2R","exp":0,"dst":"29q2q1q0q0q2","batched":true},{"name":"29q2q1q0q0q3","exp":1,"dst":"29q2q1q0q0","batched":true},{"name":"29q2q1q0q1","exp":3,"dst":"29q2q1q0q1","batched":true},{"name":"29q2q1q0q2","exp":3,"dst":"29q2q1q0q2","batched":true},{"name":"29q2q1q0q3","exp":3,"dst":"29q2q1q0","batched":true},{"name":"29q2q1q1","exp":5,"dst":"29q2q1q1","batched":true},{"name":"29q2q1q2","exp":5,"dst":"29q2q1q2","batched":true},{"name":"29q2q1q3","exp":5,"dst":"29q2q1","batched":true},{"name":"29q2q2","exp":7,"dst":"29q2q2","batched":true},{"name":"29q2q3","exp":7,"dst":"29q2","batched":true},{"name":"29q3","exp":9,"dst":"30","batched":true},{"name":"30","exp":11,"dst":"31","batched":true},{"name":"31","exp":11,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":10,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37","exp":11,"dst":"38","batched":true},{"name":"38","exp":11,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":11,"dst":"42","batched":true},{"name":"42","exp":11,"dst":"43","batched":true},{"name":"43","exp":11,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":11,"dst":"46","batched":true},{"name":"46","exp":10,"dst":"47","batched":true},{"name":"47","exp":10,"dst":"48","batched":true},{"name":"48","exp":10,"dst":"49","batched":true},{"name":"49","exp":10,"dst":"50","batched":true},{"name":"50","exp":10,"dst":"51","batched":true},{"name":"51","exp":11,"dst":"52","batched":true},{"name":"52","exp":10,"dst":"53","batched":true},{"name":"53","exp":10,"dst":"54","batched":true},{"name":"54","exp":10,"dst":"55","batched":true},{"name":"55","exp":10,"dst":"56","batched":true},{"name":"56","exp":11,"dst":"57","batched":true},{"name":"57","exp":11,"dst":"58","batched":true},{"name":"58","exp":11,"dst":"59","batched":true},{"name":"59","exp":11,"dst":"60","batched":true},{"name":"60","exp":11,"dst":"61","batched":true},{"name":"61","exp":11,"dst":"62","batched":true},{"name":"62","exp":11,"dst":"63","batched":true},{"name":"63","exp":11,"dst":"64","batched":true},{"name":"64","exp":10,"dst":"65","batched":true},{"name":"65","exp":11,"dst":"66","batched":true},{"name":"66","exp":11,"dst":"67","batched":true},{"name":"67","exp":10,"dst":"68","batched":true},{"name":"68","exp":10,"dst":"69","batched":true},{"name":"69","exp":10,"dst":"70","batched":true},{"name":"70","exp":10,"dst":"71","batched":true},{"name":"71","exp":11,"dst":"72","batched":true},{"name":"72","exp":11,"dst":"73","batched":true},{"name":"73","exp":11,"dst":"74","batched":true},{"name":"74","exp":11,"dst":"75","batched":true},{"name":"75","exp":11,"dst":"76","batched":true},{"name":"76","exp":11,"dst":"77","batched":true},{"name":"77","exp":11,"dst":"78","batched":true},{"name":"78","exp":11,"dst":"79","batched":true},{"name":"79","exp":11,"dst":"80","batched":true},{"name":"80","exp":11,"dst":"81","batched":true},{"name":"81","exp":11,"dst":"82","batched":true},{"name":"82","exp":10,"dst":"83","batched":true},{"name":"83","exp":9,"dst":"84","batched":true},{"name":"84","exp":11,"dst":"85","batched":true},{"name":"85","exp":11,"dst":"86","batched":true},{"name":"86","exp":11,"dst":"87","batched":true},{"name":"87","exp":10,"dst":"88","batched":true},{"name":"88","exp":11,"dst":"89","batched":true},{"name":"89","exp":11,"dst":"90","batched":true},{"name":"90","exp":11,"dst":"91","batched":true},{"name":"91","exp":11,"dst":"92","batched":true},{"name":"92","exp":11,"dst":"93","batched":true},{"name":"93","exp":11,"dst":"94","batched":true},{"name":"94","exp":11,"dst":"95","batched":true},{"name":"95","exp":11,"dst":"96","batched":true},{"name":"96","exp":11,"dst":"97","batched":true},{"name":"97","exp":11,"dst":"98","batched":true},{"name":"98","exp":11,"dst":"99","batched":true},{"name":"99","exp":11,"dst":"100","batched":true},{"name":"100","exp":11,"dst":"101","batched":true},{"name":"101","exp":11,"dst":"102","batched":true},{"name":"102","exp":11,"dst":"103","batched":true},{"name":"103","exp":11,"dst":"104","batched":true},{"name":"104","exp":11,"dst":"105","batched":true},{"name":"105s0","exp":9,"dst":"105s0","batched":true},{"name":"105s1","exp":9,"dst":"105s1","batched":true},{"name":"105s2","exp":9,"dst":"105s2","batched":true},{"name":"105s3","exp":7,"dst":"105s3","batched":true},{"name":"105s4","exp":7,"dst":null}], - "4": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4","exp":11,"dst":"5","batched":true},{"name":"5q0","exp":9,"dst":"5q0","batched":true},{"name":"5q1q0q0q0","exp":3,"dst":"5q1q0q0q0","batched":true},{"name":"5q1q0q0q1q0","exp":1,"dst":"5q1q0q0q1q0","batched":true},{"name":"5q1q0q0q1q1","exp":1,"dst":"5q1q0q0q1q1","batched":true},{"name":"5q1q0q0q1q2","exp":1,"dst":"5q1q0q0q1q2","batched":true},{"name":"5q1q0q0q1q3L","exp":0,"dst":"5q1q0q0q1q3L","batched":true},{"name":"5q1q0q0q1q3R","exp":0,"dst":"5q1q0q0q1","batched":true},{"name":"5q1q0q0q2","exp":3,"dst":"5q1q0q0q2","batched":true},{"name":"5q1q0q0q3","exp":3,"dst":"5q1q0q0","batched":true},{"name":"5q1q0q1","exp":5,"dst":"5q1q0q1","batched":true},{"name":"5q1q0q2","exp":5,"dst":"5q1q0q2","batched":true},{"name":"5q1q0q3","exp":5,"dst":"5q1q0","batched":true},{"name":"5q1q1","exp":7,"dst":"5q1q1","batched":true},{"name":"5q1q2","exp":7,"dst":"5q1q2","batched":true},{"name":"5q1q3","exp":7,"dst":"5q1","batched":true},{"name":"5q2","exp":9,"dst":"5q2","batched":true},{"name":"5q3","exp":9,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11q0","exp":9,"dst":"11q0","batched":true},{"name":"11q1","exp":9,"dst":"11q1","batched":true},{"name":"11q2q0","exp":7,"dst":"11q2q0","batched":true},{"name":"11q2q1","exp":7,"dst":"11q2q1","batched":true},{"name":"11q2q2","exp":7,"dst":"11q2q2","batched":true},{"name":"11q2q3q0","exp":5,"dst":"11q2q3q0","batched":true},{"name":"11q2q3q1q0q0","exp":1,"dst":"11q2q3q1q0q0","batched":true},{"name":"11q2q3q1q0q1L","exp":0,"dst":"11q2q3q1q0q1L","batched":true},{"name":"11q2q3q1q0q1R","exp":0,"dst":"11q2q3q1q0q1","batched":true},{"name":"11q2q3q1q0q2","exp":1,"dst":"11q2q3q1q0q2","batched":true},{"name":"11q2q3q1q0q3","exp":1,"dst":"11q2q3q1q0","batched":true},{"name":"11q2q3q1q1","exp":3,"dst":"11q2q3q1q1","batched":true},{"name":"11q2q3q1q2","exp":3,"dst":"11q2q3q1q2","batched":true},{"name":"11q2q3q1q3","exp":3,"dst":"11q2q3q1","batched":true},{"name":"11q2q3q2","exp":5,"dst":"11q2q3q2","batched":true},{"name":"11q2q3q3","exp":5,"dst":"11q2","batched":true},{"name":"11q3","exp":9,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14q0","exp":9,"dst":"14q0","batched":true},{"name":"14q1","exp":9,"dst":"14q1","batched":true},{"name":"14q2q0","exp":7,"dst":"14q2q0","batched":true},{"name":"14q2q1","exp":7,"dst":"14q2q1","batched":true},{"name":"14q2q2q0","exp":5,"dst":"14q2q2q0","batched":true},{"name":"14q2q2q1q0","exp":3,"dst":"14q2q2q1q0","batched":true},{"name":"14q2q2q1q1","exp":3,"dst":"14q2q2q1q1","batched":true},{"name":"14q2q2q1q2","exp":3,"dst":"14q2q2q1q2","batched":true},{"name":"14q2q2q1q3q0L","exp":0,"dst":"14q2q2q1q3q0L","batched":true},{"name":"14q2q2q1q3q0R","exp":0,"dst":"14q2q2q1q3q0","batched":true},{"name":"14q2q2q1q3q1","exp":1,"dst":"14q2q2q1q3q1","batched":true},{"name":"14q2q2q1q3q2","exp":1,"dst":"14q2q2q1q3q2","batched":true},{"name":"14q2q2q1q3q3","exp":1,"dst":"14q2q2q1","batched":true},{"name":"14q2q2q2","exp":5,"dst":"14q2q2q2","batched":true},{"name":"14q2q2q3","exp":5,"dst":"14q2q2","batched":true},{"name":"14q2q3","exp":7,"dst":"14q2","batched":true},{"name":"14q3","exp":9,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":9,"dst":"18","batched":true},{"name":"18","exp":9,"dst":"19","batched":true},{"name":"19","exp":10,"dst":"20","batched":true},{"name":"20","exp":10,"dst":"21","batched":true},{"name":"21","exp":11,"dst":"22","batched":true},{"name":"22","exp":11,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25","exp":11,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29","exp":11,"dst":"30","batched":true},{"name":"30","exp":11,"dst":"31","batched":true},{"name":"31","exp":10,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":11,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37","exp":11,"dst":"38","batched":true},{"name":"38","exp":11,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":11,"dst":"42","batched":true},{"name":"42","exp":11,"dst":"43","batched":true},{"name":"43","exp":11,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":11,"dst":"46","batched":true},{"name":"46","exp":11,"dst":"47","batched":true},{"name":"47","exp":11,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":11,"dst":"50","batched":true},{"name":"50","exp":11,"dst":"51","batched":true},{"name":"51","exp":11,"dst":"52","batched":true},{"name":"52","exp":11,"dst":"53","batched":true},{"name":"53q0","exp":9,"dst":"53q0","batched":true},{"name":"53q1","exp":9,"dst":"53q1","batched":true},{"name":"53q2","exp":9,"dst":"53q2","batched":true},{"name":"53q3","exp":9,"dst":"54","batched":true},{"name":"54","exp":8,"dst":null}], - "5": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4q0","exp":9,"dst":"4q0","batched":true},{"name":"4q1","exp":9,"dst":"4q1","batched":true},{"name":"4q2q0","exp":7,"dst":"4q2q0","batched":true},{"name":"4q2q1q0","exp":5,"dst":"4q2q1q0","batched":true},{"name":"4q2q1q1","exp":5,"dst":"4q2q1q1","batched":true},{"name":"4q2q1q2q0","exp":3,"dst":"4q2q1q2q0","batched":true},{"name":"4q2q1q2q1","exp":3,"dst":"4q2q1q2q1","batched":true},{"name":"4q2q1q2q2","exp":3,"dst":"4q2q1q2q2","batched":true},{"name":"4q2q1q2q3q0","exp":1,"dst":"4q2q1q2q3q0","batched":true},{"name":"4q2q1q2q3q1","exp":1,"dst":"4q2q1q2q3q1","batched":true},{"name":"4q2q1q2q3q2L","exp":0,"dst":"4q2q1q2q3q2L","batched":true},{"name":"4q2q1q2q3q2R","exp":0,"dst":"4q2q1q2q3q2","batched":true},{"name":"4q2q1q2q3q3","exp":1,"dst":"4q2q1q2","batched":true},{"name":"4q2q1q3","exp":5,"dst":"4q2q1","batched":true},{"name":"4q2q2","exp":7,"dst":"4q2q2","batched":true},{"name":"4q2q3","exp":7,"dst":"4q2","batched":true},{"name":"4q3","exp":9,"dst":"5","batched":true},{"name":"5","exp":11,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11","exp":11,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14","exp":11,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":11,"dst":"18","batched":true},{"name":"18","exp":11,"dst":"19","batched":true},{"name":"19q0","exp":9,"dst":"19q0","batched":true},{"name":"19q1","exp":9,"dst":"19q1","batched":true},{"name":"19q2","exp":9,"dst":"19q2","batched":true},{"name":"19q3","exp":9,"dst":"20","batched":true},{"name":"20","exp":9,"dst":"21","batched":true},{"name":"21","exp":8,"dst":"22","batched":true},{"name":"22","exp":11,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25","exp":11,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29","exp":11,"dst":"30","batched":true},{"name":"30","exp":11,"dst":"31","batched":true},{"name":"31","exp":11,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":11,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37q0","exp":9,"dst":"37q0","batched":true},{"name":"37q1","exp":9,"dst":"37q1","batched":true},{"name":"37q2q0","exp":7,"dst":"37q2q0","batched":true},{"name":"37q2q1","exp":7,"dst":"37q2q1","batched":true},{"name":"37q2q2","exp":7,"dst":"37q2q2","batched":true},{"name":"37q2q3","exp":7,"dst":"37q2","batched":true},{"name":"37q3","exp":9,"dst":"38","batched":true},{"name":"38","exp":11,"dst":"39","batched":true},{"name":"39","exp":10,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":9,"dst":"42","batched":true},{"name":"42","exp":11,"dst":"43","batched":true},{"name":"43","exp":10,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":10,"dst":"46","batched":true},{"name":"46","exp":11,"dst":"47","batched":true},{"name":"47","exp":11,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":10,"dst":"50","batched":true},{"name":"50","exp":10,"dst":"51","batched":true},{"name":"51","exp":11,"dst":"52","batched":true},{"name":"52","exp":11,"dst":"53","batched":true},{"name":"53","exp":11,"dst":"54","batched":true},{"name":"54","exp":11,"dst":"55","batched":true},{"name":"55","exp":11,"dst":"56","batched":true},{"name":"56","exp":11,"dst":"57","batched":true},{"name":"57","exp":11,"dst":"58","batched":true},{"name":"58","exp":11,"dst":"59","batched":true},{"name":"59","exp":11,"dst":"60","batched":true},{"name":"60","exp":11,"dst":"61","batched":true},{"name":"61","exp":11,"dst":"62","batched":true},{"name":"62","exp":11,"dst":"63","batched":true},{"name":"63","exp":11,"dst":"64","batched":true},{"name":"64","exp":11,"dst":"65","batched":true},{"name":"65","exp":11,"dst":"66","batched":true},{"name":"66q0","exp":9,"dst":"66q0","batched":true},{"name":"66q1","exp":9,"dst":"66q1","batched":true},{"name":"66q2","exp":9,"dst":"66q2","batched":true},{"name":"66q3","exp":9,"dst":"67","batched":true},{"name":"67","exp":9,"dst":null}], - "6": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4q0","exp":9,"dst":"4q0","batched":true},{"name":"4q1","exp":9,"dst":"4q1","batched":true},{"name":"4q2q0","exp":7,"dst":"4q2q0","batched":true},{"name":"4q2q1q0","exp":5,"dst":"4q2q1q0","batched":true},{"name":"4q2q1q1","exp":5,"dst":"4q2q1q1","batched":true},{"name":"4q2q1q2","exp":5,"dst":"4q2q1q2","batched":true},{"name":"4q2q1q3q0q0L","exp":0,"dst":"4q2q1q3q0q0L","batched":true},{"name":"4q2q1q3q0q0R","exp":0,"dst":"4q2q1q3q0q0","batched":true},{"name":"4q2q1q3q0q1","exp":1,"dst":"4q2q1q3q0q1","batched":true},{"name":"4q2q1q3q0q2","exp":1,"dst":"4q2q1q3q0q2","batched":true},{"name":"4q2q1q3q0q3","exp":1,"dst":"4q2q1q3q0","batched":true},{"name":"4q2q1q3q1","exp":3,"dst":"4q2q1q3q1","batched":true},{"name":"4q2q1q3q2","exp":3,"dst":"4q2q1q3q2","batched":true},{"name":"4q2q1q3q3","exp":3,"dst":"4q2q1","batched":true},{"name":"4q2q2","exp":7,"dst":"4q2q2","batched":true},{"name":"4q2q3","exp":7,"dst":"4q2","batched":true},{"name":"4q3","exp":9,"dst":"5","batched":true},{"name":"5","exp":11,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11","exp":11,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14","exp":11,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":11,"dst":"18","batched":true},{"name":"18","exp":11,"dst":"19","batched":true},{"name":"19","exp":11,"dst":"20","batched":true},{"name":"20","exp":11,"dst":"21","batched":true},{"name":"21","exp":11,"dst":"22","batched":true},{"name":"22","exp":11,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25","exp":11,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29","exp":11,"dst":"30","batched":true},{"name":"30q0","exp":9,"dst":"30q0","batched":true},{"name":"30q1","exp":9,"dst":"30q1","batched":true},{"name":"30q2q0","exp":7,"dst":"30q2q0","batched":true},{"name":"30q2q1","exp":7,"dst":"30q2q1","batched":true},{"name":"30q2q2q0q0","exp":3,"dst":"30q2q2q0q0","batched":true},{"name":"30q2q2q0q1q0","exp":1,"dst":"30q2q2q0q1q0","batched":true},{"name":"30q2q2q0q1q1L","exp":0,"dst":"30q2q2q0q1q1L","batched":true},{"name":"30q2q2q0q1q1R","exp":0,"dst":"30q2q2q0q1q1","batched":true},{"name":"30q2q2q0q1q2","exp":1,"dst":"30q2q2q0q1q2","batched":true},{"name":"30q2q2q0q1q3","exp":1,"dst":"30q2q2q0q1","batched":true},{"name":"30q2q2q0q2","exp":3,"dst":"30q2q2q0q2","batched":true},{"name":"30q2q2q0q3","exp":3,"dst":"30q2q2q0","batched":true},{"name":"30q2q2q1","exp":5,"dst":"30q2q2q1","batched":true},{"name":"30q2q2q2","exp":5,"dst":"30q2q2q2","batched":true},{"name":"30q2q2q3","exp":5,"dst":"30q2q2","batched":true},{"name":"30q2q3","exp":7,"dst":"30q2","batched":true},{"name":"30q3","exp":9,"dst":"31","batched":true},{"name":"31","exp":11,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":11,"dst":"34","batched":true},{"name":"34q0q0","exp":7,"dst":"34q0q0","batched":true},{"name":"34q0q1q0","exp":5,"dst":"34q0q1q0","batched":true},{"name":"34q0q1q1","exp":5,"dst":"34q0q1q1","batched":true},{"name":"34q0q1q2","exp":5,"dst":"34q0q1q2","batched":true},{"name":"34q0q1q3q0","exp":3,"dst":"34q0q1q3q0","batched":true},{"name":"34q0q1q3q1q0","exp":1,"dst":"34q0q1q3q1q0","batched":true},{"name":"34q0q1q3q1q1","exp":1,"dst":"34q0q1q3q1q1","batched":true},{"name":"34q0q1q3q1q2","exp":1,"dst":"34q0q1q3q1q2","batched":true},{"name":"34q0q1q3q1q3L","exp":0,"dst":"34q0q1q3q1q3L","batched":true},{"name":"34q0q1q3q1q3R","exp":0,"dst":"34q0q1q3q1","batched":true},{"name":"34q0q1q3q2","exp":3,"dst":"34q0q1q3q2","batched":true},{"name":"34q0q1q3q3","exp":3,"dst":"34q0q1","batched":true},{"name":"34q0q2","exp":7,"dst":"34q0q2","batched":true},{"name":"34q0q3","exp":7,"dst":"34q0","batched":true},{"name":"34q1","exp":9,"dst":"34q1","batched":true},{"name":"34q2","exp":9,"dst":"34q2","batched":true},{"name":"34q3","exp":9,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37","exp":10,"dst":"38","batched":true},{"name":"38","exp":11,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":10,"dst":"41","batched":true},{"name":"41","exp":11,"dst":"42","batched":true},{"name":"42","exp":10,"dst":"43","batched":true},{"name":"43","exp":11,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":11,"dst":"46","batched":true},{"name":"46","exp":11,"dst":"47","batched":true},{"name":"47","exp":11,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":11,"dst":"50","batched":true},{"name":"50","exp":11,"dst":"51","batched":true},{"name":"51","exp":11,"dst":"52","batched":true},{"name":"52","exp":10,"dst":"53","batched":true},{"name":"53","exp":10,"dst":"54","batched":true},{"name":"54","exp":10,"dst":"55","batched":true},{"name":"55","exp":10,"dst":"56","batched":true},{"name":"56","exp":10,"dst":"57","batched":true},{"name":"57","exp":10,"dst":"58","batched":true},{"name":"58","exp":10,"dst":"59","batched":true},{"name":"59","exp":10,"dst":"60","batched":true},{"name":"60","exp":10,"dst":"61","batched":true},{"name":"61","exp":11,"dst":"62","batched":true},{"name":"62","exp":11,"dst":"63","batched":true},{"name":"63","exp":11,"dst":"64","batched":true},{"name":"64","exp":11,"dst":"65","batched":true},{"name":"65","exp":11,"dst":"66","batched":true},{"name":"66","exp":11,"dst":"67","batched":true},{"name":"67","exp":11,"dst":"68","batched":true},{"name":"68","exp":11,"dst":"69","batched":true},{"name":"69","exp":11,"dst":"70","batched":true},{"name":"70","exp":11,"dst":"71","batched":true},{"name":"71","exp":11,"dst":"72","batched":true},{"name":"72","exp":10,"dst":"73","batched":true},{"name":"73","exp":11,"dst":"74","batched":true},{"name":"74","exp":11,"dst":"75","batched":true},{"name":"75","exp":11,"dst":"76","batched":true},{"name":"76","exp":11,"dst":"77","batched":true},{"name":"77","exp":11,"dst":"78","batched":true},{"name":"78","exp":11,"dst":"79","batched":true},{"name":"79","exp":11,"dst":"80","batched":true},{"name":"80","exp":11,"dst":"81","batched":true},{"name":"81","exp":11,"dst":"82","batched":true},{"name":"82","exp":11,"dst":"83","batched":true},{"name":"83","exp":11,"dst":"84","batched":true},{"name":"84","exp":11,"dst":"85","batched":true},{"name":"85","exp":11,"dst":"86","batched":true},{"name":"86","exp":11,"dst":"87","batched":true},{"name":"87","exp":11,"dst":"88","batched":true},{"name":"88","exp":11,"dst":"89","batched":true},{"name":"89","exp":11,"dst":"90","batched":true},{"name":"90","exp":10,"dst":"91","batched":true},{"name":"91","exp":11,"dst":"92","batched":true},{"name":"92","exp":11,"dst":"93","batched":true},{"name":"93","exp":11,"dst":"94","batched":true},{"name":"94","exp":11,"dst":"95","batched":true},{"name":"95","exp":11,"dst":"96","batched":true},{"name":"96","exp":11,"dst":"97","batched":true},{"name":"97","exp":11,"dst":"98","batched":true},{"name":"98","exp":11,"dst":"99","batched":true},{"name":"99","exp":11,"dst":"100","batched":true},{"name":"100","exp":11,"dst":"101","batched":true},{"name":"101","exp":11,"dst":"102","batched":true},{"name":"102","exp":11,"dst":"103","batched":true},{"name":"103","exp":11,"dst":"104","batched":true},{"name":"104","exp":11,"dst":"105","batched":true},{"name":"105","exp":11,"dst":"106","batched":true},{"name":"106","exp":11,"dst":"107","batched":true},{"name":"107","exp":11,"dst":"108","batched":true},{"name":"108","exp":11,"dst":"109","batched":true},{"name":"109","exp":11,"dst":"110","batched":true},{"name":"110","exp":11,"dst":"111","batched":true},{"name":"111","exp":11,"dst":"112","batched":true},{"name":"112","exp":11,"dst":"113","batched":true},{"name":"113","exp":11,"dst":"114","batched":true},{"name":"114","exp":11,"dst":"115","batched":true},{"name":"115","exp":11,"dst":"116","batched":true},{"name":"116","exp":11,"dst":"117","batched":true},{"name":"117","exp":11,"dst":"118","batched":true},{"name":"118","exp":11,"dst":"119","batched":true},{"name":"119","exp":11,"dst":"120","batched":true},{"name":"120","exp":9,"dst":"121","batched":true},{"name":"121","exp":9,"dst":"122","batched":true},{"name":"122","exp":11,"dst":"123","batched":true},{"name":"123","exp":11,"dst":"124","batched":true},{"name":"124","exp":11,"dst":"125","batched":true},{"name":"125","exp":11,"dst":"126","batched":true},{"name":"126","exp":11,"dst":"127","batched":true},{"name":"127","exp":11,"dst":"128","batched":true},{"name":"128","exp":11,"dst":"129","batched":true},{"name":"129","exp":11,"dst":"130","batched":true},{"name":"130","exp":11,"dst":"131","batched":true},{"name":"131","exp":11,"dst":"132","batched":true},{"name":"132","exp":11,"dst":"133","batched":true},{"name":"133","exp":11,"dst":"134","batched":true},{"name":"134","exp":11,"dst":"135","batched":true},{"name":"135","exp":11,"dst":"136","batched":true},{"name":"136","exp":11,"dst":"137","batched":true},{"name":"137","exp":11,"dst":"138","batched":true},{"name":"138","exp":11,"dst":"139","batched":true},{"name":"139","exp":11,"dst":"140","batched":true},{"name":"140","exp":11,"dst":"141","batched":true},{"name":"141","exp":11,"dst":"142","batched":true},{"name":"142","exp":11,"dst":"143","batched":true},{"name":"143s0","exp":9,"dst":"143s0","batched":true},{"name":"143s1","exp":9,"dst":"143s1","batched":true},{"name":"143s2","exp":9,"dst":"143s2","batched":true},{"name":"143s3","exp":8,"dst":"143s3","batched":true},{"name":"143s4","exp":7,"dst":"143s4","batched":true},{"name":"143s5","exp":7,"dst":null}] + "0": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4","exp":11,"dst":"5","batched":true},{"name":"5q0","exp":9,"dst":"5q0","batched":true},{"name":"5q1q0","exp":7,"dst":"5q1q0","batched":true},{"name":"5q1q1","exp":7,"dst":"5q1q1","batched":true},{"name":"5q1q2","exp":7,"dst":"5q1q2","batched":true},{"name":"5q1q3q0","exp":5,"dst":"5q1q3q0","batched":true},{"name":"5q1q3q1q0","exp":3,"dst":"5q1q3q1q0","batched":true},{"name":"5q1q3q1q1","exp":3,"dst":"5q1q3q1q1","batched":true},{"name":"5q1q3q1q2q0","exp":1,"dst":"5q1q3q1q2q0","batched":true},{"name":"5q1q3q1q2q1","exp":1,"dst":"5q1q3q1q2q1","batched":true},{"name":"5q1q3q1q2q2L","exp":0,"dst":"5q1q3q1q2q2L","batched":true},{"name":"5q1q3q1q2q2R","exp":0,"dst":"5q1q3q1q2q2","batched":true},{"name":"5q1q3q1q2q3","exp":1,"dst":"5q1q3q1q2","batched":true},{"name":"5q1q3q1q3","exp":3,"dst":"5q1q3q1","batched":true},{"name":"5q1q3q2","exp":5,"dst":"5q1q3q2","batched":true},{"name":"5q1q3q3","exp":5,"dst":"5q1","batched":true},{"name":"5q2","exp":9,"dst":"5q2","batched":true},{"name":"5q3","exp":9,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11q0","exp":9,"dst":"11q0","batched":true},{"name":"11q1","exp":9,"dst":"11q1","batched":true},{"name":"11q2","exp":9,"dst":"11q2","batched":true},{"name":"11q3q0","exp":7,"dst":"11q3q0","batched":true},{"name":"11q3q1","exp":7,"dst":"11q3q1","batched":true},{"name":"11q3q2","exp":7,"dst":"11q3q2","batched":true},{"name":"11q3q3q0q0","exp":3,"dst":"11q3q3q0q0","batched":true},{"name":"11q3q3q0q1","exp":3,"dst":"11q3q3q0q1","batched":true},{"name":"11q3q3q0q2","exp":3,"dst":"11q3q3q0q2","batched":true},{"name":"11q3q3q0q3q0","exp":1,"dst":"11q3q3q0q3q0","batched":true},{"name":"11q3q3q0q3q1","exp":1,"dst":"11q3q3q0q3q1","batched":true},{"name":"11q3q3q0q3q2","exp":1,"dst":"11q3q3q0q3q2","batched":true},{"name":"11q3q3q0q3q3L","exp":0,"dst":"11q3q3q0q3q3L","batched":true},{"name":"11q3q3q0q3q3R","exp":0,"dst":"11q3q3q0","batched":true},{"name":"11q3q3q1","exp":5,"dst":"11q3q3q1","batched":true},{"name":"11q3q3q2","exp":5,"dst":"11q3q3q2","batched":true},{"name":"11q3q3q3","exp":5,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14q0","exp":9,"dst":"14q0","batched":true},{"name":"14q1","exp":9,"dst":"14q1","batched":true},{"name":"14q2","exp":9,"dst":"14q2","batched":true},{"name":"14q3q0","exp":7,"dst":"14q3q0","batched":true},{"name":"14q3q1","exp":7,"dst":"14q3q1","batched":true},{"name":"14q3q2q0","exp":5,"dst":"14q3q2q0","batched":true},{"name":"14q3q2q1q0","exp":3,"dst":"14q3q2q1q0","batched":true},{"name":"14q3q2q1q1q0L","exp":0,"dst":"14q3q2q1q1q0L","batched":true},{"name":"14q3q2q1q1q0R","exp":0,"dst":"14q3q2q1q1q0","batched":true},{"name":"14q3q2q1q1q1","exp":1,"dst":"14q3q2q1q1q1","batched":true},{"name":"14q3q2q1q1q2","exp":1,"dst":"14q3q2q1q1q2","batched":true},{"name":"14q3q2q1q1q3","exp":1,"dst":"14q3q2q1q1","batched":true},{"name":"14q3q2q1q2","exp":3,"dst":"14q3q2q1q2","batched":true},{"name":"14q3q2q1q3","exp":3,"dst":"14q3q2q1","batched":true},{"name":"14q3q2q2","exp":5,"dst":"14q3q2q2","batched":true},{"name":"14q3q2q3","exp":5,"dst":"14q3q2","batched":true},{"name":"14q3q3","exp":7,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":10,"dst":"18","batched":true},{"name":"18","exp":10,"dst":"19","batched":true},{"name":"19","exp":10,"dst":"20","batched":true},{"name":"20","exp":11,"dst":"21","batched":true},{"name":"21","exp":11,"dst":"22","batched":true},{"name":"22","exp":11,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25","exp":11,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29","exp":11,"dst":"30","batched":true},{"name":"30","exp":10,"dst":"31","batched":true},{"name":"31","exp":10,"dst":"32","batched":true},{"name":"32","exp":10,"dst":"33","batched":true},{"name":"33","exp":10,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37","exp":11,"dst":"38","batched":true},{"name":"38","exp":11,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":11,"dst":"42","batched":true},{"name":"42","exp":11,"dst":"43","batched":true},{"name":"43","exp":11,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":11,"dst":"46","batched":true},{"name":"46q0","exp":9,"dst":"46q0","batched":true},{"name":"46q1","exp":9,"dst":"46q1","batched":true},{"name":"46q2","exp":9,"dst":"46q2","batched":true},{"name":"46q3","exp":9,"dst":"47","batched":true},{"name":"47","exp":11,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":11,"dst":"50","batched":true},{"name":"50","exp":11,"dst":"51","batched":true},{"name":"51","exp":11,"dst":"52","batched":true},{"name":"52","exp":11,"dst":"53","batched":true},{"name":"53","exp":11,"dst":"54","batched":true},{"name":"54","exp":11,"dst":"55","batched":true},{"name":"55s0","exp":9,"dst":"55s0","batched":true},{"name":"55s1","exp":9,"dst":"55s1","batched":true},{"name":"55s2","exp":7,"dst":null}], + "1": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4q0","exp":9,"dst":"4q0","batched":true},{"name":"4q1","exp":9,"dst":"4q1","batched":true},{"name":"4q2q0","exp":7,"dst":"4q2q0","batched":true},{"name":"4q2q1","exp":7,"dst":"4q2q1","batched":true},{"name":"4q2q2","exp":7,"dst":"4q2q2","batched":true},{"name":"4q2q3q0q0","exp":3,"dst":"4q2q3q0q0","batched":true},{"name":"4q2q3q0q1","exp":3,"dst":"4q2q3q0q1","batched":true},{"name":"4q2q3q0q2","exp":3,"dst":"4q2q3q0q2","batched":true},{"name":"4q2q3q0q3q0","exp":1,"dst":"4q2q3q0q3q0","batched":true},{"name":"4q2q3q0q3q1L","exp":0,"dst":"4q2q3q0q3q1L","batched":true},{"name":"4q2q3q0q3q1R","exp":0,"dst":"4q2q3q0q3q1","batched":true},{"name":"4q2q3q0q3q2","exp":1,"dst":"4q2q3q0q3q2","batched":true},{"name":"4q2q3q0q3q3","exp":1,"dst":"4q2q3q0","batched":true},{"name":"4q2q3q1","exp":5,"dst":"4q2q3q1","batched":true},{"name":"4q2q3q2","exp":5,"dst":"4q2q3q2","batched":true},{"name":"4q2q3q3","exp":5,"dst":"4q2","batched":true},{"name":"4q3","exp":9,"dst":"5","batched":true},{"name":"5","exp":11,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11","exp":11,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14","exp":11,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":11,"dst":"18","batched":true},{"name":"18","exp":11,"dst":"19","batched":true},{"name":"19q0","exp":9,"dst":"19q0","batched":true},{"name":"19q1","exp":9,"dst":"19q1","batched":true},{"name":"19q2","exp":9,"dst":"19q2","batched":true},{"name":"19q3","exp":9,"dst":"20","batched":true},{"name":"20","exp":9,"dst":"21","batched":true},{"name":"21","exp":8,"dst":"22","batched":true},{"name":"22","exp":8,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25","exp":11,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29","exp":11,"dst":"30","batched":true},{"name":"30","exp":11,"dst":"31","batched":true},{"name":"31","exp":11,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":11,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37","exp":11,"dst":"38","batched":true},{"name":"38q0","exp":9,"dst":"38q0","batched":true},{"name":"38q1","exp":9,"dst":"38q1","batched":true},{"name":"38q2","exp":9,"dst":"38q2","batched":true},{"name":"38q3","exp":9,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":10,"dst":"42","batched":true},{"name":"42","exp":10,"dst":"43","batched":true},{"name":"43","exp":11,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":10,"dst":"46","batched":true},{"name":"46","exp":11,"dst":"47","batched":true},{"name":"47","exp":11,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":11,"dst":"50","batched":true},{"name":"50","exp":11,"dst":"51","batched":true},{"name":"51","exp":11,"dst":"52","batched":true},{"name":"52","exp":11,"dst":"53","batched":true},{"name":"53","exp":11,"dst":"54","batched":true},{"name":"54","exp":11,"dst":"55","batched":true},{"name":"55","exp":11,"dst":"56","batched":true},{"name":"56","exp":11,"dst":"57","batched":true},{"name":"57","exp":11,"dst":"58","batched":true},{"name":"58","exp":11,"dst":"59","batched":true},{"name":"59","exp":11,"dst":"60","batched":true},{"name":"60","exp":11,"dst":"61","batched":true},{"name":"61","exp":11,"dst":"62","batched":true},{"name":"62","exp":11,"dst":"63","batched":true},{"name":"63","exp":11,"dst":"64","batched":true},{"name":"64","exp":11,"dst":"65","batched":true},{"name":"65","exp":11,"dst":"66","batched":true},{"name":"66s0","exp":9,"dst":"66s0","batched":true},{"name":"66s1","exp":9,"dst":null}], + "2": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4q0","exp":9,"dst":"4q0","batched":true},{"name":"4q1","exp":9,"dst":"4q1","batched":true},{"name":"4q2q0","exp":7,"dst":"4q2q0","batched":true},{"name":"4q2q1","exp":7,"dst":"4q2q1","batched":true},{"name":"4q2q2","exp":7,"dst":"4q2q2","batched":true},{"name":"4q2q3q0q0","exp":3,"dst":"4q2q3q0q0","batched":true},{"name":"4q2q3q0q1","exp":3,"dst":"4q2q3q0q1","batched":true},{"name":"4q2q3q0q2","exp":3,"dst":"4q2q3q0q2","batched":true},{"name":"4q2q3q0q3q0","exp":1,"dst":"4q2q3q0q3q0","batched":true},{"name":"4q2q3q0q3q1L","exp":0,"dst":"4q2q3q0q3q1L","batched":true},{"name":"4q2q3q0q3q1R","exp":0,"dst":"4q2q3q0q3q1","batched":true},{"name":"4q2q3q0q3q2","exp":1,"dst":"4q2q3q0q3q2","batched":true},{"name":"4q2q3q0q3q3","exp":1,"dst":"4q2q3q0","batched":true},{"name":"4q2q3q1","exp":5,"dst":"4q2q3q1","batched":true},{"name":"4q2q3q2","exp":5,"dst":"4q2q3q2","batched":true},{"name":"4q2q3q3","exp":5,"dst":"4q2","batched":true},{"name":"4q3","exp":9,"dst":"5","batched":true},{"name":"5","exp":11,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9q0","exp":9,"dst":"9q0","batched":true},{"name":"9q1","exp":9,"dst":"9q1","batched":true},{"name":"9q2","exp":9,"dst":"9q2","batched":true},{"name":"9q3q0","exp":7,"dst":"9q3q0","batched":true},{"name":"9q3q1","exp":7,"dst":"9q3q1","batched":true},{"name":"9q3q2q0","exp":5,"dst":"9q3q2q0","batched":true},{"name":"9q3q2q1","exp":5,"dst":"9q3q2q1","batched":true},{"name":"9q3q2q2","exp":5,"dst":"9q3q2q2","batched":true},{"name":"9q3q2q3q0","exp":3,"dst":"9q3q2q3q0","batched":true},{"name":"9q3q2q3q1","exp":3,"dst":"9q3q2q3q1","batched":true},{"name":"9q3q2q3q2","exp":3,"dst":"9q3q2q3q2","batched":true},{"name":"9q3q2q3q3q0","exp":1,"dst":"9q3q2q3q3q0","batched":true},{"name":"9q3q2q3q3q1","exp":1,"dst":"9q3q2q3q3q1","batched":true},{"name":"9q3q2q3q3q2","exp":1,"dst":"9q3q2q3q3q2","batched":true},{"name":"9q3q2q3q3q3L","exp":0,"dst":"9q3q2q3q3q3L","batched":true},{"name":"9q3q2q3q3q3R","exp":0,"dst":"9q3q2","batched":true},{"name":"9q3q3","exp":7,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11","exp":11,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14","exp":11,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17q0","exp":9,"dst":"17q0","batched":true},{"name":"17q1","exp":9,"dst":"17q1","batched":true},{"name":"17q2","exp":9,"dst":"17q2","batched":true},{"name":"17q3q0","exp":7,"dst":"17q3q0","batched":true},{"name":"17q3q1q0","exp":5,"dst":"17q3q1q0","batched":true},{"name":"17q3q1q1","exp":5,"dst":"17q3q1q1","batched":true},{"name":"17q3q1q2","exp":5,"dst":"17q3q1q2","batched":true},{"name":"17q3q1q3q0","exp":3,"dst":"17q3q1q3q0","batched":true},{"name":"17q3q1q3q1","exp":3,"dst":"17q3q1q3q1","batched":true},{"name":"17q3q1q3q2q0","exp":1,"dst":"17q3q1q3q2q0","batched":true},{"name":"17q3q1q3q2q1L","exp":0,"dst":"17q3q1q3q2q1L","batched":true},{"name":"17q3q1q3q2q1R","exp":0,"dst":"17q3q1q3q2q1","batched":true},{"name":"17q3q1q3q2q2","exp":1,"dst":"17q3q1q3q2q2","batched":true},{"name":"17q3q1q3q2q3","exp":1,"dst":"17q3q1q3q2","batched":true},{"name":"17q3q1q3q3","exp":3,"dst":"17q3q1","batched":true},{"name":"17q3q2","exp":7,"dst":"17q3q2","batched":true},{"name":"17q3q3","exp":7,"dst":"18","batched":true},{"name":"18","exp":11,"dst":"19","batched":true},{"name":"19","exp":11,"dst":"20","batched":true},{"name":"20","exp":11,"dst":"21","batched":true},{"name":"21","exp":11,"dst":"22","batched":true},{"name":"22q0","exp":9,"dst":"22q0","batched":true},{"name":"22q1","exp":9,"dst":"22q1","batched":true},{"name":"22q2","exp":9,"dst":"22q2","batched":true},{"name":"22q3","exp":9,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25","exp":11,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29","exp":11,"dst":"30","batched":true},{"name":"30","exp":11,"dst":"31","batched":true},{"name":"31","exp":11,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":11,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":10,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37","exp":11,"dst":"38","batched":true},{"name":"38","exp":11,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":11,"dst":"42","batched":true},{"name":"42","exp":11,"dst":"43","batched":true},{"name":"43","exp":11,"dst":"44","batched":true},{"name":"44q0","exp":9,"dst":"44q0","batched":true},{"name":"44q1q0","exp":7,"dst":"44q1q0","batched":true},{"name":"44q1q1","exp":7,"dst":"44q1q1","batched":true},{"name":"44q1q2","exp":7,"dst":"44q1q2","batched":true},{"name":"44q1q3","exp":7,"dst":"44q1","batched":true},{"name":"44q2","exp":9,"dst":"44q2","batched":true},{"name":"44q3","exp":9,"dst":"45","batched":true},{"name":"45","exp":11,"dst":"46","batched":true},{"name":"46","exp":11,"dst":"47","batched":true},{"name":"47","exp":9,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":10,"dst":"50","batched":true},{"name":"50","exp":11,"dst":"51","batched":true},{"name":"51","exp":10,"dst":"52","batched":true},{"name":"52","exp":11,"dst":"53","batched":true},{"name":"53","exp":11,"dst":"54","batched":true},{"name":"54","exp":11,"dst":"55","batched":true},{"name":"55","exp":11,"dst":"56","batched":true},{"name":"56","exp":11,"dst":"57","batched":true},{"name":"57","exp":11,"dst":"58","batched":true},{"name":"58","exp":11,"dst":"59","batched":true},{"name":"59","exp":11,"dst":"60","batched":true},{"name":"60","exp":11,"dst":"61","batched":true},{"name":"61","exp":11,"dst":"62","batched":true},{"name":"62","exp":11,"dst":"63","batched":true},{"name":"63","exp":11,"dst":"64","batched":true},{"name":"64","exp":11,"dst":"65","batched":true},{"name":"65","exp":11,"dst":"66","batched":true},{"name":"66","exp":11,"dst":"67","batched":true},{"name":"67","exp":11,"dst":"68","batched":true},{"name":"68","exp":11,"dst":"69","batched":true},{"name":"69","exp":11,"dst":"70","batched":true},{"name":"70","exp":11,"dst":"71","batched":true},{"name":"71","exp":11,"dst":"72","batched":true},{"name":"72","exp":11,"dst":"73","batched":true},{"name":"73s0","exp":9,"dst":"73s0","batched":true},{"name":"73s1","exp":9,"dst":"73s1","batched":true},{"name":"73s2","exp":9,"dst":"73s2","batched":true},{"name":"73s3","exp":5,"dst":null}], + "3": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4q0","exp":9,"dst":"4q0","batched":true},{"name":"4q1","exp":9,"dst":"4q1","batched":true},{"name":"4q2q0","exp":7,"dst":"4q2q0","batched":true},{"name":"4q2q1","exp":7,"dst":"4q2q1","batched":true},{"name":"4q2q2","exp":7,"dst":"4q2q2","batched":true},{"name":"4q2q3q0q0","exp":3,"dst":"4q2q3q0q0","batched":true},{"name":"4q2q3q0q1","exp":3,"dst":"4q2q3q0q1","batched":true},{"name":"4q2q3q0q2","exp":3,"dst":"4q2q3q0q2","batched":true},{"name":"4q2q3q0q3q0","exp":1,"dst":"4q2q3q0q3q0","batched":true},{"name":"4q2q3q0q3q1","exp":1,"dst":"4q2q3q0q3q1","batched":true},{"name":"4q2q3q0q3q2","exp":1,"dst":"4q2q3q0q3q2","batched":true},{"name":"4q2q3q0q3q3L","exp":0,"dst":"4q2q3q0q3q3L","batched":true},{"name":"4q2q3q0q3q3R","exp":0,"dst":"4q2q3q0","batched":true},{"name":"4q2q3q1","exp":5,"dst":"4q2q3q1","batched":true},{"name":"4q2q3q2","exp":5,"dst":"4q2q3q2","batched":true},{"name":"4q2q3q3","exp":5,"dst":"4q2","batched":true},{"name":"4q3","exp":9,"dst":"5","batched":true},{"name":"5","exp":11,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11","exp":11,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14","exp":11,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":11,"dst":"18","batched":true},{"name":"18","exp":11,"dst":"19","batched":true},{"name":"19","exp":11,"dst":"20","batched":true},{"name":"20","exp":11,"dst":"21","batched":true},{"name":"21","exp":11,"dst":"22","batched":true},{"name":"22","exp":11,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25q0","exp":9,"dst":"25q0","batched":true},{"name":"25q1q0","exp":7,"dst":"25q1q0","batched":true},{"name":"25q1q1q0q0q0","exp":1,"dst":"25q1q1q0q0q0","batched":true},{"name":"25q1q1q0q0q1","exp":1,"dst":"25q1q1q0q0q1","batched":true},{"name":"25q1q1q0q0q2","exp":1,"dst":"25q1q1q0q0q2","batched":true},{"name":"25q1q1q0q0q3L","exp":0,"dst":"25q1q1q0q0q3L","batched":true},{"name":"25q1q1q0q0q3R","exp":0,"dst":"25q1q1q0q0","batched":true},{"name":"25q1q1q0q1","exp":3,"dst":"25q1q1q0q1","batched":true},{"name":"25q1q1q0q2","exp":3,"dst":"25q1q1q0q2","batched":true},{"name":"25q1q1q0q3","exp":3,"dst":"25q1q1q0","batched":true},{"name":"25q1q1q1","exp":5,"dst":"25q1q1q1","batched":true},{"name":"25q1q1q2","exp":5,"dst":"25q1q1q2","batched":true},{"name":"25q1q1q3","exp":5,"dst":"25q1q1","batched":true},{"name":"25q1q2","exp":7,"dst":"25q1q2","batched":true},{"name":"25q1q3","exp":7,"dst":"25q1","batched":true},{"name":"25q2","exp":9,"dst":"25q2","batched":true},{"name":"25q3","exp":9,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29q0q0","exp":7,"dst":"29q0q0","batched":true},{"name":"29q0q1","exp":7,"dst":"29q0q1","batched":true},{"name":"29q0q2","exp":7,"dst":"29q0q2","batched":true},{"name":"29q0q3q0","exp":5,"dst":"29q0q3q0","batched":true},{"name":"29q0q3q1","exp":5,"dst":"29q0q3q1","batched":true},{"name":"29q0q3q2q0","exp":3,"dst":"29q0q3q2q0","batched":true},{"name":"29q0q3q2q1","exp":3,"dst":"29q0q3q2q1","batched":true},{"name":"29q0q3q2q2q0L","exp":0,"dst":"29q0q3q2q2q0L","batched":true},{"name":"29q0q3q2q2q0R","exp":0,"dst":"29q0q3q2q2q0","batched":true},{"name":"29q0q3q2q2q1","exp":1,"dst":"29q0q3q2q2q1","batched":true},{"name":"29q0q3q2q2q2","exp":1,"dst":"29q0q3q2q2q2","batched":true},{"name":"29q0q3q2q2q3","exp":1,"dst":"29q0q3q2q2","batched":true},{"name":"29q0q3q2q3","exp":3,"dst":"29q0q3q2","batched":true},{"name":"29q0q3q3","exp":5,"dst":"29q0","batched":true},{"name":"29q1","exp":9,"dst":"29q1","batched":true},{"name":"29q2","exp":9,"dst":"29q2","batched":true},{"name":"29q3","exp":9,"dst":"30","batched":true},{"name":"30","exp":11,"dst":"31","batched":true},{"name":"31","exp":11,"dst":"32","batched":true},{"name":"32","exp":10,"dst":"33","batched":true},{"name":"33","exp":10,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37","exp":11,"dst":"38","batched":true},{"name":"38","exp":10,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":11,"dst":"42","batched":true},{"name":"42","exp":11,"dst":"43","batched":true},{"name":"43","exp":11,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":11,"dst":"46","batched":true},{"name":"46","exp":11,"dst":"47","batched":true},{"name":"47","exp":10,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":10,"dst":"50","batched":true},{"name":"50","exp":11,"dst":"51","batched":true},{"name":"51","exp":10,"dst":"52","batched":true},{"name":"52","exp":10,"dst":"53","batched":true},{"name":"53","exp":11,"dst":"54","batched":true},{"name":"54","exp":10,"dst":"55","batched":true},{"name":"55","exp":10,"dst":"56","batched":true},{"name":"56","exp":11,"dst":"57","batched":true},{"name":"57","exp":11,"dst":"58","batched":true},{"name":"58","exp":11,"dst":"59","batched":true},{"name":"59","exp":11,"dst":"60","batched":true},{"name":"60","exp":11,"dst":"61","batched":true},{"name":"61","exp":11,"dst":"62","batched":true},{"name":"62","exp":11,"dst":"63","batched":true},{"name":"63","exp":11,"dst":"64","batched":true},{"name":"64","exp":10,"dst":"65","batched":true},{"name":"65","exp":11,"dst":"66","batched":true},{"name":"66","exp":11,"dst":"67","batched":true},{"name":"67","exp":11,"dst":"68","batched":true},{"name":"68","exp":10,"dst":"69","batched":true},{"name":"69","exp":10,"dst":"70","batched":true},{"name":"70","exp":11,"dst":"71","batched":true},{"name":"71","exp":11,"dst":"72","batched":true},{"name":"72","exp":11,"dst":"73","batched":true},{"name":"73","exp":11,"dst":"74","batched":true},{"name":"74","exp":11,"dst":"75","batched":true},{"name":"75","exp":11,"dst":"76","batched":true},{"name":"76","exp":11,"dst":"77","batched":true},{"name":"77","exp":11,"dst":"78","batched":true},{"name":"78","exp":11,"dst":"79","batched":true},{"name":"79","exp":11,"dst":"80","batched":true},{"name":"80","exp":11,"dst":"81","batched":true},{"name":"81","exp":10,"dst":"82","batched":true},{"name":"82","exp":9,"dst":"83","batched":true},{"name":"83","exp":11,"dst":"84","batched":true},{"name":"84","exp":11,"dst":"85","batched":true},{"name":"85","exp":11,"dst":"86","batched":true},{"name":"86","exp":11,"dst":"87","batched":true},{"name":"87","exp":11,"dst":"88","batched":true},{"name":"88","exp":11,"dst":"89","batched":true},{"name":"89","exp":11,"dst":"90","batched":true},{"name":"90","exp":11,"dst":"91","batched":true},{"name":"91","exp":11,"dst":"92","batched":true},{"name":"92","exp":11,"dst":"93","batched":true},{"name":"93","exp":11,"dst":"94","batched":true},{"name":"94","exp":11,"dst":"95","batched":true},{"name":"95","exp":11,"dst":"96","batched":true},{"name":"96","exp":11,"dst":"97","batched":true},{"name":"97","exp":11,"dst":"98","batched":true},{"name":"98","exp":11,"dst":"99","batched":true},{"name":"99","exp":11,"dst":"100","batched":true},{"name":"100","exp":11,"dst":"101","batched":true},{"name":"101","exp":11,"dst":"102","batched":true},{"name":"102","exp":11,"dst":"103","batched":true},{"name":"103","exp":11,"dst":"104","batched":true},{"name":"104s0","exp":9,"dst":"104s0","batched":true},{"name":"104s1","exp":8,"dst":null}], + "4": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4","exp":11,"dst":"5","batched":true},{"name":"5q0","exp":9,"dst":"5q0","batched":true},{"name":"5q1q0","exp":7,"dst":"5q1q0","batched":true},{"name":"5q1q1","exp":7,"dst":"5q1q1","batched":true},{"name":"5q1q2","exp":7,"dst":"5q1q2","batched":true},{"name":"5q1q3q0","exp":5,"dst":"5q1q3q0","batched":true},{"name":"5q1q3q1q0","exp":3,"dst":"5q1q3q1q0","batched":true},{"name":"5q1q3q1q1","exp":3,"dst":"5q1q3q1q1","batched":true},{"name":"5q1q3q1q2q0","exp":1,"dst":"5q1q3q1q2q0","batched":true},{"name":"5q1q3q1q2q1","exp":1,"dst":"5q1q3q1q2q1","batched":true},{"name":"5q1q3q1q2q2L","exp":0,"dst":"5q1q3q1q2q2L","batched":true},{"name":"5q1q3q1q2q2R","exp":0,"dst":"5q1q3q1q2q2","batched":true},{"name":"5q1q3q1q2q3","exp":1,"dst":"5q1q3q1q2","batched":true},{"name":"5q1q3q1q3","exp":3,"dst":"5q1q3q1","batched":true},{"name":"5q1q3q2","exp":5,"dst":"5q1q3q2","batched":true},{"name":"5q1q3q3","exp":5,"dst":"5q1","batched":true},{"name":"5q2","exp":9,"dst":"5q2","batched":true},{"name":"5q3","exp":9,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11q0","exp":9,"dst":"11q0","batched":true},{"name":"11q1","exp":9,"dst":"11q1","batched":true},{"name":"11q2","exp":9,"dst":"11q2","batched":true},{"name":"11q3q0","exp":7,"dst":"11q3q0","batched":true},{"name":"11q3q1","exp":7,"dst":"11q3q1","batched":true},{"name":"11q3q2","exp":7,"dst":"11q3q2","batched":true},{"name":"11q3q3q0q0","exp":3,"dst":"11q3q3q0q0","batched":true},{"name":"11q3q3q0q1","exp":3,"dst":"11q3q3q0q1","batched":true},{"name":"11q3q3q0q2","exp":3,"dst":"11q3q3q0q2","batched":true},{"name":"11q3q3q0q3q0","exp":1,"dst":"11q3q3q0q3q0","batched":true},{"name":"11q3q3q0q3q1","exp":1,"dst":"11q3q3q0q3q1","batched":true},{"name":"11q3q3q0q3q2","exp":1,"dst":"11q3q3q0q3q2","batched":true},{"name":"11q3q3q0q3q3L","exp":0,"dst":"11q3q3q0q3q3L","batched":true},{"name":"11q3q3q0q3q3R","exp":0,"dst":"11q3q3q0","batched":true},{"name":"11q3q3q1","exp":5,"dst":"11q3q3q1","batched":true},{"name":"11q3q3q2","exp":5,"dst":"11q3q3q2","batched":true},{"name":"11q3q3q3","exp":5,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14q0","exp":9,"dst":"14q0","batched":true},{"name":"14q1","exp":9,"dst":"14q1","batched":true},{"name":"14q2","exp":9,"dst":"14q2","batched":true},{"name":"14q3q0","exp":7,"dst":"14q3q0","batched":true},{"name":"14q3q1","exp":7,"dst":"14q3q1","batched":true},{"name":"14q3q2q0","exp":5,"dst":"14q3q2q0","batched":true},{"name":"14q3q2q1q0","exp":3,"dst":"14q3q2q1q0","batched":true},{"name":"14q3q2q1q1q0L","exp":0,"dst":"14q3q2q1q1q0L","batched":true},{"name":"14q3q2q1q1q0R","exp":0,"dst":"14q3q2q1q1q0","batched":true},{"name":"14q3q2q1q1q1","exp":1,"dst":"14q3q2q1q1q1","batched":true},{"name":"14q3q2q1q1q2","exp":1,"dst":"14q3q2q1q1q2","batched":true},{"name":"14q3q2q1q1q3","exp":1,"dst":"14q3q2q1q1","batched":true},{"name":"14q3q2q1q2","exp":3,"dst":"14q3q2q1q2","batched":true},{"name":"14q3q2q1q3","exp":3,"dst":"14q3q2q1","batched":true},{"name":"14q3q2q2","exp":5,"dst":"14q3q2q2","batched":true},{"name":"14q3q2q3","exp":5,"dst":"14q3q2","batched":true},{"name":"14q3q3","exp":7,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":10,"dst":"18","batched":true},{"name":"18","exp":10,"dst":"19","batched":true},{"name":"19","exp":10,"dst":"20","batched":true},{"name":"20","exp":11,"dst":"21","batched":true},{"name":"21","exp":11,"dst":"22","batched":true},{"name":"22","exp":11,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25","exp":11,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29","exp":11,"dst":"30","batched":true},{"name":"30","exp":10,"dst":"31","batched":true},{"name":"31","exp":10,"dst":"32","batched":true},{"name":"32","exp":10,"dst":"33","batched":true},{"name":"33","exp":10,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37","exp":11,"dst":"38","batched":true},{"name":"38","exp":11,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":11,"dst":"42","batched":true},{"name":"42","exp":11,"dst":"43","batched":true},{"name":"43","exp":11,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":11,"dst":"46","batched":true},{"name":"46q0","exp":9,"dst":"46q0","batched":true},{"name":"46q1","exp":9,"dst":"46q1","batched":true},{"name":"46q2","exp":9,"dst":"46q2","batched":true},{"name":"46q3","exp":9,"dst":"47","batched":true},{"name":"47","exp":11,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":11,"dst":"50","batched":true},{"name":"50","exp":11,"dst":"51","batched":true},{"name":"51","exp":11,"dst":"52","batched":true},{"name":"52","exp":11,"dst":"53","batched":true},{"name":"53","exp":11,"dst":"54","batched":true},{"name":"54","exp":11,"dst":"55","batched":true},{"name":"55s0","exp":9,"dst":"55s0","batched":true},{"name":"55s1","exp":9,"dst":"55s1","batched":true},{"name":"55s2","exp":7,"dst":null}], + "5": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4q0","exp":9,"dst":"4q0","batched":true},{"name":"4q1","exp":9,"dst":"4q1","batched":true},{"name":"4q2q0","exp":7,"dst":"4q2q0","batched":true},{"name":"4q2q1","exp":7,"dst":"4q2q1","batched":true},{"name":"4q2q2","exp":7,"dst":"4q2q2","batched":true},{"name":"4q2q3q0q0","exp":3,"dst":"4q2q3q0q0","batched":true},{"name":"4q2q3q0q1","exp":3,"dst":"4q2q3q0q1","batched":true},{"name":"4q2q3q0q2","exp":3,"dst":"4q2q3q0q2","batched":true},{"name":"4q2q3q0q3q0","exp":1,"dst":"4q2q3q0q3q0","batched":true},{"name":"4q2q3q0q3q1L","exp":0,"dst":"4q2q3q0q3q1L","batched":true},{"name":"4q2q3q0q3q1R","exp":0,"dst":"4q2q3q0q3q1","batched":true},{"name":"4q2q3q0q3q2","exp":1,"dst":"4q2q3q0q3q2","batched":true},{"name":"4q2q3q0q3q3","exp":1,"dst":"4q2q3q0","batched":true},{"name":"4q2q3q1","exp":5,"dst":"4q2q3q1","batched":true},{"name":"4q2q3q2","exp":5,"dst":"4q2q3q2","batched":true},{"name":"4q2q3q3","exp":5,"dst":"4q2","batched":true},{"name":"4q3","exp":9,"dst":"5","batched":true},{"name":"5","exp":11,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11","exp":11,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14","exp":11,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":11,"dst":"18","batched":true},{"name":"18","exp":11,"dst":"19","batched":true},{"name":"19q0","exp":9,"dst":"19q0","batched":true},{"name":"19q1","exp":9,"dst":"19q1","batched":true},{"name":"19q2","exp":9,"dst":"19q2","batched":true},{"name":"19q3","exp":9,"dst":"20","batched":true},{"name":"20","exp":9,"dst":"21","batched":true},{"name":"21","exp":8,"dst":"22","batched":true},{"name":"22","exp":8,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25","exp":11,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29","exp":11,"dst":"30","batched":true},{"name":"30","exp":11,"dst":"31","batched":true},{"name":"31","exp":11,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":11,"dst":"34","batched":true},{"name":"34","exp":11,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37","exp":11,"dst":"38","batched":true},{"name":"38q0","exp":9,"dst":"38q0","batched":true},{"name":"38q1","exp":9,"dst":"38q1","batched":true},{"name":"38q2","exp":9,"dst":"38q2","batched":true},{"name":"38q3","exp":9,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":10,"dst":"42","batched":true},{"name":"42","exp":10,"dst":"43","batched":true},{"name":"43","exp":11,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":10,"dst":"46","batched":true},{"name":"46","exp":11,"dst":"47","batched":true},{"name":"47","exp":11,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":11,"dst":"50","batched":true},{"name":"50","exp":11,"dst":"51","batched":true},{"name":"51","exp":11,"dst":"52","batched":true},{"name":"52","exp":11,"dst":"53","batched":true},{"name":"53","exp":11,"dst":"54","batched":true},{"name":"54","exp":11,"dst":"55","batched":true},{"name":"55","exp":11,"dst":"56","batched":true},{"name":"56","exp":11,"dst":"57","batched":true},{"name":"57","exp":11,"dst":"58","batched":true},{"name":"58","exp":11,"dst":"59","batched":true},{"name":"59","exp":11,"dst":"60","batched":true},{"name":"60","exp":11,"dst":"61","batched":true},{"name":"61","exp":11,"dst":"62","batched":true},{"name":"62","exp":11,"dst":"63","batched":true},{"name":"63","exp":11,"dst":"64","batched":true},{"name":"64","exp":11,"dst":"65","batched":true},{"name":"65","exp":11,"dst":"66","batched":true},{"name":"66s0","exp":9,"dst":"66s0","batched":true},{"name":"66s1","exp":9,"dst":null}], + "6": [{"name":"0","exp":9,"dst":"1","batched":true},{"name":"1","exp":9,"dst":"2","batched":true},{"name":"2","exp":9,"dst":"3","batched":true},{"name":"3","exp":11,"dst":"4","batched":true},{"name":"4q0","exp":9,"dst":"4q0","batched":true},{"name":"4q1","exp":9,"dst":"4q1","batched":true},{"name":"4q2q0","exp":7,"dst":"4q2q0","batched":true},{"name":"4q2q1","exp":7,"dst":"4q2q1","batched":true},{"name":"4q2q2","exp":7,"dst":"4q2q2","batched":true},{"name":"4q2q3q0q0","exp":3,"dst":"4q2q3q0q0","batched":true},{"name":"4q2q3q0q1","exp":3,"dst":"4q2q3q0q1","batched":true},{"name":"4q2q3q0q2","exp":3,"dst":"4q2q3q0q2","batched":true},{"name":"4q2q3q0q3q0","exp":1,"dst":"4q2q3q0q3q0","batched":true},{"name":"4q2q3q0q3q1","exp":1,"dst":"4q2q3q0q3q1","batched":true},{"name":"4q2q3q0q3q2","exp":1,"dst":"4q2q3q0q3q2","batched":true},{"name":"4q2q3q0q3q3L","exp":0,"dst":"4q2q3q0q3q3L","batched":true},{"name":"4q2q3q0q3q3R","exp":0,"dst":"4q2q3q0","batched":true},{"name":"4q2q3q1","exp":5,"dst":"4q2q3q1","batched":true},{"name":"4q2q3q2","exp":5,"dst":"4q2q3q2","batched":true},{"name":"4q2q3q3","exp":5,"dst":"4q2","batched":true},{"name":"4q3","exp":9,"dst":"5","batched":true},{"name":"5","exp":11,"dst":"6","batched":true},{"name":"6","exp":11,"dst":"7","batched":true},{"name":"7","exp":11,"dst":"8","batched":true},{"name":"8","exp":11,"dst":"9","batched":true},{"name":"9","exp":11,"dst":"10","batched":true},{"name":"10","exp":11,"dst":"11","batched":true},{"name":"11","exp":11,"dst":"12","batched":true},{"name":"12","exp":11,"dst":"13","batched":true},{"name":"13","exp":11,"dst":"14","batched":true},{"name":"14","exp":11,"dst":"15","batched":true},{"name":"15","exp":11,"dst":"16","batched":true},{"name":"16","exp":11,"dst":"17","batched":true},{"name":"17","exp":11,"dst":"18","batched":true},{"name":"18","exp":11,"dst":"19","batched":true},{"name":"19","exp":11,"dst":"20","batched":true},{"name":"20","exp":11,"dst":"21","batched":true},{"name":"21","exp":11,"dst":"22","batched":true},{"name":"22","exp":11,"dst":"23","batched":true},{"name":"23","exp":11,"dst":"24","batched":true},{"name":"24","exp":11,"dst":"25","batched":true},{"name":"25","exp":11,"dst":"26","batched":true},{"name":"26","exp":11,"dst":"27","batched":true},{"name":"27","exp":11,"dst":"28","batched":true},{"name":"28","exp":11,"dst":"29","batched":true},{"name":"29","exp":11,"dst":"30","batched":true},{"name":"30q0","exp":9,"dst":"30q0","batched":true},{"name":"30q1","exp":9,"dst":"30q1","batched":true},{"name":"30q2","exp":9,"dst":"30q2","batched":true},{"name":"30q3q0","exp":7,"dst":"30q3q0","batched":true},{"name":"30q3q1q0","exp":5,"dst":"30q3q1q0","batched":true},{"name":"30q3q1q1q0","exp":3,"dst":"30q3q1q1q0","batched":true},{"name":"30q3q1q1q1","exp":3,"dst":"30q3q1q1q1","batched":true},{"name":"30q3q1q1q2q0","exp":1,"dst":"30q3q1q1q2q0","batched":true},{"name":"30q3q1q1q2q1","exp":1,"dst":"30q3q1q1q2q1","batched":true},{"name":"30q3q1q1q2q2","exp":1,"dst":"30q3q1q1q2q2","batched":true},{"name":"30q3q1q1q2q3L","exp":0,"dst":"30q3q1q1q2q3L","batched":true},{"name":"30q3q1q1q2q3R","exp":0,"dst":"30q3q1q1q2","batched":true},{"name":"30q3q1q1q3","exp":3,"dst":"30q3q1q1","batched":true},{"name":"30q3q1q2","exp":5,"dst":"30q3q1q2","batched":true},{"name":"30q3q1q3","exp":5,"dst":"30q3q1","batched":true},{"name":"30q3q2","exp":7,"dst":"30q3q2","batched":true},{"name":"30q3q3","exp":7,"dst":"31","batched":true},{"name":"31","exp":11,"dst":"32","batched":true},{"name":"32","exp":11,"dst":"33","batched":true},{"name":"33","exp":11,"dst":"34","batched":true},{"name":"34q0","exp":9,"dst":"34q0","batched":true},{"name":"34q1q0","exp":7,"dst":"34q1q0","batched":true},{"name":"34q1q1q0q0","exp":3,"dst":"34q1q1q0q0","batched":true},{"name":"34q1q1q0q1q0","exp":1,"dst":"34q1q1q0q1q0","batched":true},{"name":"34q1q1q0q1q1","exp":1,"dst":"34q1q1q0q1q1","batched":true},{"name":"34q1q1q0q1q2","exp":1,"dst":"34q1q1q0q1q2","batched":true},{"name":"34q1q1q0q1q3L","exp":0,"dst":"34q1q1q0q1q3L","batched":true},{"name":"34q1q1q0q1q3R","exp":0,"dst":"34q1q1q0q1","batched":true},{"name":"34q1q1q0q2","exp":3,"dst":"34q1q1q0q2","batched":true},{"name":"34q1q1q0q3","exp":3,"dst":"34q1q1q0","batched":true},{"name":"34q1q1q1","exp":5,"dst":"34q1q1q1","batched":true},{"name":"34q1q1q2","exp":5,"dst":"34q1q1q2","batched":true},{"name":"34q1q1q3","exp":5,"dst":"34q1q1","batched":true},{"name":"34q1q2","exp":7,"dst":"34q1q2","batched":true},{"name":"34q1q3","exp":7,"dst":"34q1","batched":true},{"name":"34q2","exp":9,"dst":"34q2","batched":true},{"name":"34q3","exp":9,"dst":"35","batched":true},{"name":"35","exp":11,"dst":"36","batched":true},{"name":"36","exp":11,"dst":"37","batched":true},{"name":"37","exp":10,"dst":"38","batched":true},{"name":"38","exp":10,"dst":"39","batched":true},{"name":"39","exp":11,"dst":"40","batched":true},{"name":"40","exp":11,"dst":"41","batched":true},{"name":"41","exp":10,"dst":"42","batched":true},{"name":"42","exp":11,"dst":"43","batched":true},{"name":"43","exp":10,"dst":"44","batched":true},{"name":"44","exp":11,"dst":"45","batched":true},{"name":"45","exp":11,"dst":"46","batched":true},{"name":"46","exp":11,"dst":"47","batched":true},{"name":"47","exp":11,"dst":"48","batched":true},{"name":"48","exp":11,"dst":"49","batched":true},{"name":"49","exp":11,"dst":"50","batched":true},{"name":"50","exp":11,"dst":"51","batched":true},{"name":"51","exp":11,"dst":"52","batched":true},{"name":"52","exp":11,"dst":"53","batched":true},{"name":"53","exp":11,"dst":"54","batched":true},{"name":"54","exp":10,"dst":"55","batched":true},{"name":"55","exp":10,"dst":"56","batched":true},{"name":"56","exp":10,"dst":"57","batched":true},{"name":"57","exp":11,"dst":"58","batched":true},{"name":"58","exp":10,"dst":"59","batched":true},{"name":"59","exp":10,"dst":"60","batched":true},{"name":"60","exp":10,"dst":"61","batched":true},{"name":"61","exp":11,"dst":"62","batched":true},{"name":"62","exp":11,"dst":"63","batched":true},{"name":"63","exp":11,"dst":"64","batched":true},{"name":"64","exp":11,"dst":"65","batched":true},{"name":"65","exp":11,"dst":"66","batched":true},{"name":"66","exp":11,"dst":"67","batched":true},{"name":"67","exp":11,"dst":"68","batched":true},{"name":"68","exp":11,"dst":"69","batched":true},{"name":"69","exp":11,"dst":"70","batched":true},{"name":"70","exp":11,"dst":"71","batched":true},{"name":"71","exp":10,"dst":"72","batched":true},{"name":"72","exp":11,"dst":"73","batched":true},{"name":"73","exp":11,"dst":"74","batched":true},{"name":"74","exp":11,"dst":"75","batched":true},{"name":"75","exp":11,"dst":"76","batched":true},{"name":"76","exp":11,"dst":"77","batched":true},{"name":"77","exp":11,"dst":"78","batched":true},{"name":"78","exp":11,"dst":"79","batched":true},{"name":"79","exp":11,"dst":"80","batched":true},{"name":"80","exp":11,"dst":"81","batched":true},{"name":"81","exp":11,"dst":"82","batched":true},{"name":"82","exp":10,"dst":"83","batched":true},{"name":"83","exp":11,"dst":"84","batched":true},{"name":"84","exp":11,"dst":"85","batched":true},{"name":"85","exp":11,"dst":"86","batched":true},{"name":"86","exp":11,"dst":"87","batched":true},{"name":"87","exp":11,"dst":"88","batched":true},{"name":"88","exp":11,"dst":"89","batched":true},{"name":"89","exp":11,"dst":"90","batched":true},{"name":"90","exp":11,"dst":"91","batched":true},{"name":"91","exp":11,"dst":"92","batched":true},{"name":"92","exp":11,"dst":"93","batched":true},{"name":"93","exp":11,"dst":"94","batched":true},{"name":"94","exp":11,"dst":"95","batched":true},{"name":"95","exp":11,"dst":"96","batched":true},{"name":"96","exp":11,"dst":"97","batched":true},{"name":"97","exp":11,"dst":"98","batched":true},{"name":"98","exp":11,"dst":"99","batched":true},{"name":"99","exp":11,"dst":"100","batched":true},{"name":"100","exp":11,"dst":"101","batched":true},{"name":"101","exp":11,"dst":"102","batched":true},{"name":"102","exp":11,"dst":"103","batched":true},{"name":"103","exp":11,"dst":"104","batched":true},{"name":"104","exp":11,"dst":"105","batched":true},{"name":"105","exp":11,"dst":"106","batched":true},{"name":"106","exp":11,"dst":"107","batched":true},{"name":"107","exp":11,"dst":"108","batched":true},{"name":"108","exp":11,"dst":"109","batched":true},{"name":"109","exp":11,"dst":"110","batched":true},{"name":"110","exp":11,"dst":"111","batched":true},{"name":"111","exp":11,"dst":"112","batched":true},{"name":"112","exp":11,"dst":"113","batched":true},{"name":"113","exp":11,"dst":"114","batched":true},{"name":"114","exp":11,"dst":"115","batched":true},{"name":"115","exp":11,"dst":"116","batched":true},{"name":"116","exp":11,"dst":"117","batched":true},{"name":"117","exp":11,"dst":"118","batched":true},{"name":"118","exp":11,"dst":"119","batched":true},{"name":"119","exp":11,"dst":"120","batched":true},{"name":"120","exp":10,"dst":"121","batched":true},{"name":"121","exp":9,"dst":"122","batched":true},{"name":"122","exp":11,"dst":"123","batched":true},{"name":"123","exp":11,"dst":"124","batched":true},{"name":"124","exp":11,"dst":"125","batched":true},{"name":"125","exp":11,"dst":"126","batched":true},{"name":"126","exp":11,"dst":"127","batched":true},{"name":"127","exp":11,"dst":"128","batched":true},{"name":"128","exp":11,"dst":"129","batched":true},{"name":"129","exp":11,"dst":"130","batched":true},{"name":"130","exp":11,"dst":"131","batched":true},{"name":"131","exp":11,"dst":"132","batched":true},{"name":"132","exp":11,"dst":"133","batched":true},{"name":"133","exp":11,"dst":"134","batched":true},{"name":"134","exp":11,"dst":"135","batched":true},{"name":"135","exp":11,"dst":"136","batched":true},{"name":"136","exp":11,"dst":"137","batched":true},{"name":"137","exp":11,"dst":"138","batched":true},{"name":"138","exp":11,"dst":"139","batched":true},{"name":"139","exp":11,"dst":"140","batched":true},{"name":"140","exp":11,"dst":"141","batched":true},{"name":"141","exp":11,"dst":"142","batched":true},{"name":"142","exp":11,"dst":"143","batched":true},{"name":"143","exp":11,"dst":"144","batched":true},{"name":"144","exp":8,"dst":null}] } } diff --git a/Symbolic/BugInjection/Proofs/CliExec/CompHooks0Placed.lean b/Symbolic/BugInjection/Proofs/CliExec/CompHooks0Placed.lean index 6e544c280..0ffa541d6 100644 --- a/Symbolic/BugInjection/Proofs/CliExec/CompHooks0Placed.lean +++ b/Symbolic/BugInjection/Proofs/CliExec/CompHooks0Placed.lean @@ -898,8 +898,5 @@ def compHooks0 : CliHooks where rw [List.length_drop, compKyberEncaps_length]⟩) decaps := fun _ ct => ⟨compKyberDecaps ct.toList, compKyberDecaps_length ct.toList⟩ K := compExecMlKem0 } - bcmp := compBcmp0 - bcmp_ok := compBcmp0_ok - utf8Err := fun _ => (0#64, 0#16) end Symbolic.BugInjection.Proofs.CliExec.CompHooks0Placed diff --git a/Symbolic/BugInjection/Proofs/CliExec/FastHooks.lean b/Symbolic/BugInjection/Proofs/CliExec/FastHooks.lean index 9c933b54d..f6e007948 100644 --- a/Symbolic/BugInjection/Proofs/CliExec/FastHooks.lean +++ b/Symbolic/BugInjection/Proofs/CliExec/FastHooks.lean @@ -1217,11 +1217,11 @@ def fastHookTable (W : CliHooks) : List (String × (FastState → Option FastSta ("__rustc::__rust_alloc", fastAlloc), ("__rustc::__rust_dealloc", fastHookNoop), ("__rustc::__rust_realloc", fastRealloc), ("__rustc::__rust_alloc_zeroed", fastAllocZeroed), ("memset", fastMemset), ("memmove", fastMemcpy), ("memcpy", fastMemcpy), - ("bcmp", fastCliBcmp W.bcmp), ("strlen", fastStrlen), + ("bcmp", fastCliBcmp cliDefaultBcmp), ("strlen", fastStrlen), (readFileName, fastReadFile), (writeFileName, fastWriteFile), (readStdinName, fastReadStdin), (writeStdoutName, fastWriteStdout), ("core::slice::memchr::memrchr", fastMemrchr), - ("core::str::converts::from_utf8", fastFromUtf8 W.utf8Err), + ("core::str::converts::from_utf8", fastFromUtf8 cliDefaultUtf8Err), ("core::fmt::write", fastFmtWrite), ("alloc::fmt::format::format_inner", fastFormatInner), ("::duration_since", fastDurationSince), (">::add", fastTimeAdd), @@ -1252,10 +1252,10 @@ theorem fastHookTable_rel (W : CliHooks) : .cons ⟨rfl, @fastHookNoop_post⟩ <| .cons ⟨rfl, @fastRealloc_post⟩ <| .cons ⟨rfl, @fastAllocZeroed_post⟩ <| .cons ⟨rfl, @fastMemset_post⟩ <| .cons ⟨rfl, @fastMemcpy_post⟩ <| .cons ⟨rfl, @fastMemcpy_post⟩ <| - .cons ⟨rfl, @fastCliBcmp_post W.bcmp⟩ <| .cons ⟨rfl, @fastStrlen_post⟩ <| + .cons ⟨rfl, @fastCliBcmp_post cliDefaultBcmp⟩ <| .cons ⟨rfl, @fastStrlen_post⟩ <| .cons ⟨rfl, @fastReadFile_post⟩ <| .cons ⟨rfl, @fastWriteFile_post⟩ <| .cons ⟨rfl, @fastReadStdin_post⟩ <| .cons ⟨rfl, @fastWriteStdout_post⟩ <| - .cons ⟨rfl, @fastMemrchr_post⟩ <| .cons ⟨rfl, @fastFromUtf8_post W.utf8Err⟩ <| + .cons ⟨rfl, @fastMemrchr_post⟩ <| .cons ⟨rfl, @fastFromUtf8_post cliDefaultUtf8Err⟩ <| .cons ⟨rfl, @fastFmtWrite_post⟩ <| .cons ⟨rfl, @fastFormatInner_post⟩ <| .cons ⟨rfl, @fastDurationSince_post⟩ <| .cons ⟨rfl, @fastTimeAdd_post⟩ <| .cons ⟨rfl, @fastBlackBox_post⟩ <| diff --git a/Symbolic/BugInjection/Proofs/CliExec/FastHooksPlaced.lean b/Symbolic/BugInjection/Proofs/CliExec/FastHooksPlaced.lean index 15e72b2c3..9f31b3afa 100644 --- a/Symbolic/BugInjection/Proofs/CliExec/FastHooksPlaced.lean +++ b/Symbolic/BugInjection/Proofs/CliExec/FastHooksPlaced.lean @@ -503,7 +503,7 @@ def fastLibcruxHmacMallocng (subStep : FastState → Option FastState) (addrs : else none) fs6) fs5) fs4) fs3) fs2) fs1) fs0 -/-- 37-row mangled-symbol hook table corresponding in order to `CliBinaryPq.cliHookTablePlaced`. -/ +/-- 27-row mangled-symbol hook table corresponding in order to `CliBinaryPq.cliHookTablePlaced`. -/ def fastHookTablePlaced (subStep : FastState → Option FastState) (addrs : MallocngCallAddrs) (W : CliHooks) : List (String × (FastState → Option FastState)) := [("_RNvNtCsbvWyylYiyxg_4sha26sha51211compress512", fastCompress512 W.Q.F512), @@ -540,19 +540,10 @@ def fastHookTablePlaced (subStep : FastState → Option FastState) (addrs : Mall ("_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes", fastMlkemValidatePk W.Q.K), ("_RNvCs65XVORQObL2_12libcrux_hmac4hmac", fastLibcruxHmacMallocng subStep addrs W.C.F), - ("memmove", fastMemcpy), - ("bcmp", fastCliBcmp W.bcmp), - ("strlen", fastStrlen), ("_RNvCs9Xul1Kjr0QF_16libsignal_cli_io10write_file", fastWriteFile), ("_RNvCs9Xul1Kjr0QF_16libsignal_cli_io12write_stdout", fastWriteStdout), - ("_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr", fastMemrchr), - ("_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8", fastFromUtf8 W.utf8Err), ("_RNvNtCskxtBwYRO61I_4core3fmt5write", fastFmtWrite), ("_RNvNvNtCs69KKACWg7bl_5alloc3fmt6format12format_inner", fastFormatInner), - ("_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since", fastDurationSince), - ("_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add", - fastTimeAdd), - ("_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek", fastBlackBox), ("_RNvNtCsbvWyylYiyxg_4sha26sha25611compress256", fastCompress256 W.C.F), ("_RNvNtCsbKnPy0UR4Ui_13signal_crypto7aes_cbc19aes_256_cbc_encrypt", fastAesEncMallocng subStep addrs W.C.E), @@ -561,11 +552,7 @@ def fastHookTablePlaced (subStep : FastState → Option FastState) (addrs : Mall ("_RNvXs8_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_9PublicKeyINtNtCskxtBwYRO61I_4core7convert4FromRNtB5_12StaticSecretE4from", fastPubFromSecret W.C.pubKey), ("_RNvMs6_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecret14diffie_hellman", - fastDiffieHellman W.C.X), - ("_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", - fastZeroizeSecret), - ("_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", - fastZeroizeSecret)] + fastDiffieHellman W.C.X)] /-- Mangled panic extern symbols corresponding to `CliBinaryPq.cliPanicSymbolsPlaced`. -/ def cliPanicSymbolsPlacedList : List String := diff --git a/Symbolic/BugInjection/Proofs/CliExec/FastHooksPlacedSound.lean b/Symbolic/BugInjection/Proofs/CliExec/FastHooksPlacedSound.lean index 6452704fc..418969f17 100644 --- a/Symbolic/BugInjection/Proofs/CliExec/FastHooksPlacedSound.lean +++ b/Symbolic/BugInjection/Proofs/CliExec/FastHooksPlacedSound.lean @@ -32,14 +32,13 @@ meta import Symbolic.BugInjection.Proofs.CliExec.FastHooksPlaced Proves `FastState.Agrees`, `Memory.KeepsFrozen`, and `symtab` soundness (`FastHookPost`) for `FastHooksPlaced.fastExecExternPlaced` and `FastHooksPlaced.hasCliHookPlaced` against -`CryptoVerification.SignalSession.cliExternsPlacedSig mmpl W` (`37` rows in +`CryptoVerification.SignalSession.cliExternsPlacedSig mmpl W` (`27` rows in `cliHookTablePlaced mmpl W` plus `isCliPanicSymbolPlaced`), including specialization to `CompHooks0Placed.compHooks0`: 1. **17 PQXDH / SPQR rows**: reused directly from `FastHooksRows`. -2. **17 pure libc / I/O / `core` / `std` / session / ratchet rows + `Arm64.Rust.panicked`**: proved - directly against `FastHooksPlaced` (`fastStrlen_post` and `fastFromUtf8_post` reused from - `FastHooksPlaced`) with zero fixed-image imports (`C1(b)`-clean). +2. **7 pure I/O / `core` / `alloc` / session / ratchet rows + `Arm64.Rust.panicked`**: proved + directly against `FastHooksPlaced` with zero fixed-image imports (`C1(b)`-clean). 3. **3 shared-pool `mallocng` rows (`aesEncHookMallocng`, `aesDecHookMallocng`, `libcruxHmacHookMallocng`)**: discharged via `SubroutineRunnerSound` and `SubroutineChoiceBridge` (`subroutineRunnerSound_of_subStepSound`). @@ -108,7 +107,7 @@ open Symbolic.BugInjection.Proofs.CliExec.SubroutineChoiceBridge ( #guard cliPanicSymbolsPlacedList.length == 18 #guard cliPanicSymbolsPlacedList == cliPanicSymbolsPlaced -#guard (fastHookTablePlaced (fun _ => none) {} compHooks0).length == 37 +#guard (fastHookTablePlaced (fun _ => none) {} compHooks0).length == 27 theorem cliPanicSymbolsPlacedList_length : cliPanicSymbolsPlacedList.length = 18 := rfl theorem cliPanicSymbolsPlaced_length : cliPanicSymbolsPlaced.length = 18 := rfl @@ -125,7 +124,7 @@ theorem fastHookTablePlaced_keys (subStep : FastState → Option FastState) theorem fastHookTablePlaced_length (subStep : FastState → Option FastState) (addrs : MallocngCallAddrs) (W : CliHooks) : - (fastHookTablePlaced subStep addrs W).length = 37 := rfl + (fastHookTablePlaced subStep addrs W).length = 27 := rfl private theorem congr3 {α β γ δ : Type} (f : α → β → γ → δ) {a1 a2 : α} {b1 b2 : β} {c1 c2 : γ} (ha : a1 = a2) (hb : b1 = b2) (hc : c1 = c2) : @@ -1260,25 +1259,15 @@ theorem fastHookTablePlaced_rel {mmpl : MultiPlacement} {m0 : Memory} .cons ⟨rfl, liftPureHookPairSound (@fastMlkemDecaps_post W.Q.K)⟩ <| .cons ⟨rfl, liftPureHookPairSound (@fastMlkemValidatePk_post W.Q.K)⟩ <| .cons ⟨rfl, @fastLibcruxHmacMallocng_post mmpl m0 addrs subStep hrun hcl0 W.C.F⟩ <| - .cons ⟨rfl, liftPureHookPairSound (@fastMemmove_post)⟩ <| - .cons ⟨rfl, liftPureHookPairSound (@fastCliBcmp_post W.bcmp)⟩ <| - .cons ⟨rfl, liftPureHookPairSound (@fastStrlen_post)⟩ <| .cons ⟨rfl, liftPureHookPairSound (@fastWriteFile_post)⟩ <| .cons ⟨rfl, liftPureHookPairSound (@fastWriteStdout_post)⟩ <| - .cons ⟨rfl, liftPureHookPairSound (@fastMemrchr_post)⟩ <| - .cons ⟨rfl, liftPureHookPairSound (@fastFromUtf8_post W.utf8Err)⟩ <| .cons ⟨rfl, liftPureHookPairSound (@fastFmtWrite_post)⟩ <| .cons ⟨rfl, liftPureHookPairSound (@fastFormatInner_post)⟩ <| - .cons ⟨rfl, liftPureHookPairSound (@fastDurationSince_post)⟩ <| - .cons ⟨rfl, liftPureHookPairSound (@fastTimeAdd_post)⟩ <| - .cons ⟨rfl, liftPureHookPairSound (@fastBlackBox_post)⟩ <| .cons ⟨rfl, liftPureHookPairSound (@fastCompress256_post W.C.F)⟩ <| .cons ⟨rfl, @fastAesEncMallocng_post mmpl m0 addrs subStep hrun hcl0 W.C.E⟩ <| .cons ⟨rfl, @fastAesDecMallocng_post mmpl m0 addrs subStep hrun hcl0 W.C.D⟩ <| .cons ⟨rfl, liftPureHookPairSound (@fastPubFromSecret_post W.C.pubKey)⟩ <| .cons ⟨rfl, liftPureHookPairSound (@fastDiffieHellman_post W.C.X)⟩ <| - .cons ⟨rfl, liftPureHookPairSound (@fastZeroizeSecret_post)⟩ <| - .cons ⟨rfl, liftPureHookPairSound (@fastZeroizeSecret_post)⟩ <| .nil private theorem lookup_forall2_placed_sound {m0 : Memory} diff --git a/Symbolic/BugInjection/Proofs/Common443/CompI0Laws.lean b/Symbolic/BugInjection/Proofs/Common443/CompI0Laws.lean index 5b8d00bef..868272b2c 100644 --- a/Symbolic/BugInjection/Proofs/Common443/CompI0Laws.lean +++ b/Symbolic/BugInjection/Proofs/Common443/CompI0Laws.lean @@ -632,9 +632,6 @@ def compHooks0 : CliHooks where rw [List.length_drop, compKyberEncaps_length]⟩) decaps := fun _ ct => ⟨compKyberDecaps ct.toList, compKyberDecaps_length ct.toList⟩ K := compMlKem0 } - bcmp := compBcmp0 - bcmp_ok := compBcmp0_ok - utf8Err := fun _ => (0#64, 0#16) theorem compI0_hooksMatch : HooksMatchInterpretation compI0 compHooks0 := by refine ⟨rfl, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ · intro p k iv _ _; rfl diff --git a/Symbolic/BugInjection/Proofs/SyntheticEvictedChainSkippedKey/DefsI0.lean b/Symbolic/BugInjection/Proofs/SyntheticEvictedChainSkippedKey/DefsI0.lean index 59ed19dc6..1ff95b9d4 100644 --- a/Symbolic/BugInjection/Proofs/SyntheticEvictedChainSkippedKey/DefsI0.lean +++ b/Symbolic/BugInjection/Proofs/SyntheticEvictedChainSkippedKey/DefsI0.lean @@ -356,9 +356,6 @@ def evictedHooks0 : CliHooks where rw [List.length_drop, compKyberEncaps_length]⟩) decaps := fun _ ct => ⟨compKyberDecaps ct.toList, compKyberDecaps_length ct.toList⟩ K := evictedExecMlKem0 } - bcmp := compBcmp0 - bcmp_ok := compBcmp0_ok - utf8Err := fun _ => (0#64, 0#16) def evictedRecordsI0 (w : PQXDHSpqrSetup) : ProtocolSetup := { alice := "alice", bob := "bob", withOpk := false, regIdA := w.regIdA, regIdB := w.regIdB, diff --git a/Symbolic/BugInjection/README.md b/Symbolic/BugInjection/README.md index 8b50c9ada..e8c176357 100644 --- a/Symbolic/BugInjection/README.md +++ b/Symbolic/BugInjection/README.md @@ -4,7 +4,7 @@ Each bug in this directory is a Rust patch against `libsignal`: either a reversed upstream fix commit (`kind = "upstream"`, the default) or a forward regression patch against `v0.105.4` (`kind = "synthetic"`, documented in [`Synthetic/README.md`](Synthetic/README.md)). A **witness** pairs a sequence of CLI calls and attacker inputs with the trace `evs` of structured `CliEvent` records produced by the patched `libsignal-cli` binary. -A witness refutes the headline theorem `signal_session_secure_placed : SignalSessionSecurePlaced cliElfBytes` (`Symbolic/Theorems/Security.lean`) on the patched binary by proving `¬ SignalSessionSecurePlaced mutantCliElfBytes` (or `¬ SignalSessionSecure mutantCliElfBytes` on the fixed-image companion predicate for synthetic mutants), where `mutantCliElfBytes` is the mutant's `libsignal-cli` AArch64 ELF built by the legacy snapshot recipe (D6) until M5 (`scripts/cli-elf --build`, from `cli-elf/inputs.lock`; `cliElfBytes` uses the stock `ld.lld` link) with the bug patch applied. Via `not_refines_of_witness` (`Split.lean`) and its CLI instantiation `not_signalSessionSecurePlaced_of_witness` (`Witnesses/CliShapePlaced.lean`, or `not_signalSessionSecure_of_witness` in `Witnesses/CliShape.lean`), the refutation splits into two halves: +A witness refutes the headline theorem `signal_session_secure_placed : SignalSessionSecurePlaced cliElfBytes` (`Symbolic/Theorems/Security.lean`) on the patched binary by proving `¬ SignalSessionSecurePlaced mutantCliElfBytes` (or `¬ SignalSessionSecure mutantCliElfBytes` on the fixed-image companion predicate for synthetic mutants), where `mutantCliElfBytes` is the mutant's `libsignal-cli` AArch64 ELF built by the stock `ld.lld` recipe (`scripts/cli-elf-stock --stdbin --build --unpinned`, from `cli-elf/stock/inputs_stock_stdbin.lock` and `cli-elf/stock/m4_stock.lock`, matching `cliElfBytes`) with the bug patch applied. Via `not_refines_of_witness` (`Split.lean`) and its CLI instantiation `not_signalSessionSecurePlaced_of_witness` (`Witnesses/CliShapePlaced.lean`, or `not_signalSessionSecure_of_witness` in `Witnesses/CliShape.lean`), the refutation splits into two halves: - **Spec half `(S)`** (statement only): for every primitive interpretation and setup record satisfying `fits`, the records are well-formed and no symbolic execution (`Explains`) or collision excuse (`CollisionAtCli`) permitted by `SignalSessionSecurePlaced` accounts for `evs`. - **Implementation half `(I)`** (mutant binary only): some pair satisfying `fits` meets the binary's external contracts, and the parsed ELF `mutantCliElfBytes` (at linked placements `(mpl, mmpl)`) produces `evs` under fresh randomness (`CoinsFresh`). @@ -17,7 +17,7 @@ Each `NonVacuity/.lean` module proves `nonvacuous : ∃ i r, fits i r` ## Running -Prerequisites match [`README.md`](../../README.md): `elan`, the pinned Rust toolchain (`rust-toolchain.toml`), `protoc`, and the toolchain of the legacy snapshot recipe (D6) until M5, `scripts/cli-elf --build` (Zig `0.16.0` and the sysroot `ld.lld` pinned in `cli-elf/inputs.lock`). +Prerequisites match [`README.md`](../../README.md): `elan`, the pinned Rust toolchain (`rust-toolchain.toml`), `protoc`, and the stock `ld.lld` CLI ELF toolchain (`scripts/cli-elf-stock --stdbin`: `rustc 1.98.1` sysroot `gcc-ld/ld.lld` and `zig 0.16.0` pinned in `third_party/libsignal/libsignal-session/cli-elf/stock/inputs_stock_stdbin.lock`). ```bash lake exe cache get @@ -30,7 +30,23 @@ python3 scripts/bug_injection.py disproof # build mutant ELFs and kern `run` builds the host replayer (`third_party/libsignal/bug-injection/harness/`) against both the patched and unpatched Rust sources, executes each witness (`RunEvent` records `party`, `cmd`, `input`, `coins`, and `exit`; `clear` emits no event), verifies byte-for-byte agreement with `Witnesses/.lean`, and classifies each witness as `live` (mutant produces `evs`, unpatched control does not), `refuted-by-control`, or `not-expressible`. -`disproof` re-extracts the patched AArch64 Lean model with `rust-obj2lean`, links the mutant's `libsignal-cli` ELF with the legacy snapshot recipe (D6) until M5 (`scripts/cli-elf --build`, every `cli-elf/inputs.lock` pin except the image's), pins its SHA-256 in `GeneratedLean.BugInjectionMutant` (`mutantCliElfBytes`), and elaborates `Disproofs/.lean` under `CV_BUG_INJECTION=`. All build artifacts live under `.lake/bug-injection/`, and `#guard` checks reject unpatched or mismatched ELF images; nothing in the default `lake build` imports mutant overlays. +`disproof` stages a temporary per-mutant repo view pointing `vendor/libsignal` at the verified patched checkout (failing closed both before and after the build if `HEAD`, `HEAD^{tree}`, or the patched-vs-clean binary diff SHA-256 do not match the expected bug patch), re-extracts the patched AArch64 Lean model with `rust-obj2lean`, links the mutant's `libsignal-cli` ELF with the stock `ld.lld` recipe (`scripts/cli-elf-stock --stdbin --build --unpinned --repo-root `), verifies A-LINK provenance on the mutant output (see below), pins `mutantCliElfBytes` in `GeneratedLean.BugInjectionMutant` (asserting both `mutantCliElfSha256 != cleanCliElfSha256` and `sessionCodeSha256 != cleanCodeSha256`), and elaborates `Disproofs/.lean` under `CV_BUG_INJECTION=`. All build artifacts live under `.lake/bug-injection/`, and `#guard` checks reject unpatched or mismatched ELF images; nothing in the default `lake build` imports mutant overlays. + +### Mutant Stock Link & A-LINK Provenance Checks + +`scripts/stock-pin/alink_check.py` and `third_party/libsignal/libsignal-session/cli-elf/stock/m4_stock.lock` remain untouched for the shipped `cliElfBytes`. Inside `scripts/bug_injection.py`, `verify_mutant_stock_alink` imports `alink_check.py` read-only and checks every mutant build against a policy-only seed lock derived from `cli-elf/stock/m4_stock.lock`: + +- **Enforced unchanged**: + - Pre- and post-build `verify_staged_vendor_libsignal` check on the resolved `vendor/libsignal` checkout (`HEAD` commit SHA, git tree SHA, clean `git status`, and SHA-256 of `git diff --binary HEAD`), preventing any stale `vendor/libsignal` symlink from silently building clean code. + - Non-identity guards in Python and Lean `#guard`s: `mutantCliElfSha256 != cleanCliElfSha256` and `sessionCodeSha256 != cleanCodeSha256`. + - Toolchain, linker-script, shim, and prebuilt-`std` lock pins in `cli-elf/stock/inputs_stock_stdbin.lock` (`rustc 1.98.1`, `ld.lld`, `zig 0.16.0`, `stock_c2.ld`, `rdl_shim.S`, `libstd_rlib` member pins). + - `alink_check.py` Rules `(i)`–`(vii)`: `ld.lld --verbose` input classification (`real_proved`, `real_hook_reached`, `retired_stub`, `failstop_z`), link-line flags (`--gc-sections`, `--icf=none`, `--apply-dynamic-relocs`, `-Bstatic`, `-T stock_c2.ld`), unexpected object/section rejection, `failstop_z` live-symbol subset check (`0` unexpected Zone-Z symbols), pure-zero `udf #0` (`0x00000000`) encoding across `.text.stubs` in `extern_stubs_clean.o`, and `d1_extern_data_lock` `kept_count` + `kept_symbols` set equality (`2` kept symbols: `MAX_LOG_LEVEL_FILTER` and `ED25519_BASEPOINT_TABLE`). +- **Skipped or adapted relative to the shipped-ELF `cli-elf/stock/m4_stock.lock` check**: + - `output_elf.{sha256,size}` exact lock pin — **replaced** by `mutantCliElfSha256 != cleanCliElfSha256` + `sessionCodeSha256 != cleanCodeSha256` (and, on the two proved Cheval'26 carriers, exact `#guard mutantCliElfSha256 == f3TrialElfSha256` in `{SmallSubgroup,WeakState}/F3LayoutData.lean`), because applying a bug patch intentionally changes `.text`/`.rodata` bytes and ELF size. + - `engine_hooked_externs_sha256` exact lock pin — **skipped** (`""` in the mutant policy lock), because the bug patch shifts branch sites inside `libsignalSessionObj` and changes the raw `externs` digest (`BaseScalarsHooks.base_hooks` kernel-checks the exact hook + panic table on each proved mutant: `44` entries on `cheval26-small-subgroup`, i.e. `26` of the `27` `cliHookTablePlaced` rows after its patch deletes the call to `EdwardsPoint::is_torsion_free` plus all `18` `cliPanicSymbolsPlaced` panics, and `45 = 27 + 18` entries on `cheval26-weak-state`). + - `stub_object.{sha256,symbol_count}` exact `122`-symbol pin — **adapted** to verify pure-zero `0x00000000` `.text.stubs` bytes while recording `stub_symbol_count_delta` (`Δstub`), because a bug patch that removes a call site can drop an unused extern stub from `extern_stubs_clean.o` (e.g., `cheval26-small-subgroup` drops `EdwardsPoint::is_torsion_free`, leaving `121` stubs, `Δstub = -1`). + - `d1_extern_data_lock.kept[*].sha256` per-blob SHA-256 — **adapted** to `kept_count` + `kept_symbols` set equality, because `d1_extern_data.o` encodes relocated `.rodata` pointers whose target VMAs shift when `.text` grows or shrinks. + - `retired_stub_slots[*]` fixed `origAddr` baseline (`2f20c836` baseline in `m4_stock.lock`) — **adapted** to `verify_retired_stub_slots_symbol_relative` (`4 · Δstub` spread rule): all `7` retired symbols (`__retired_0..__retired_6` for the `7` Rust `lib2_*.o` de-hooked rows) must exist in `.symtab` as unique `STB_LOCAL` entries at 4-byte-aligned VMAs in monotonic order, contain `0x00000000` (`udf #0`) in `PT_LOAD`, and shift monotonically relative to `orig_addr` with spread `max(delta) - min(delta) <= 4 * |Δstub|` bytes (accounting for at most `|Δstub|` dropped/added 4-byte stubs sorting ahead of a subset of the `7` retired slots, e.g. `[-576, -572]` on `cheval26-small-subgroup` with `Δstub = -1` and `[-1232, -1232]` on `cheval26-weak-state` with `Δstub = 0`). ## Adding a Bug @@ -55,12 +71,12 @@ The alternate traces `cheval26-small-subgroup-torsion-cli` and `cheval26-weak-st Each carrier applies `not_signalSessionSecurePlaced_of_witness` (`Witnesses/CliShapePlaced.lean`) at linked placements `(mpl, mmpl)` and the proof-layer predicate `cliCompFitsPinned setup` (`Proofs/Common/CompFitsPin.lean`), which extends `cliCompFits` with the table-driven interpretation `compI0`, unrecorded setup randomness, party identifiers, and torsion-shift facts: - **Spec proofs `(S)`** build in the default `BugInjection` library (`Proofs/Cheval26SmallSubgroupHighBitComp443/`, `Proofs/Cheval26WeakStateIdx1/`, `Proofs/Common443/`, and `Proofs/Common/`). -- **Binary execution proofs `(I)`** evaluate `ElfImage.parse mutantCliElfBytes` in the kernel (`Disproofs/Impl/MutantParse.lean`), prove `ElfFullValid` (`Disproofs/Impl//Base*.lean`), step the CLI runs (3 for small subgroup, 7 for weak state) via `Proofs/CliExec/` across `2^0`- to `2^12`-step chunks defined in `Disproofs/Impl/ckpt_chunk_plan.json`, and combine `(S)` and `(I)` in `Disproofs/Impl//Nodes.lean`. +- **Binary execution proofs `(I)`** evaluate `ElfImage.parse mutantCliElfBytes` in the kernel (`Disproofs/Impl/MutantParse.lean`), prove `ElfFullValid` (`Disproofs/Impl//Base*.lean`), step the CLI runs (3 for small subgroup, 7 for weak state) via `Proofs/CliExec/` across `2^0`- to `2^11`-step chunks defined in `Disproofs/Impl/ckpt_chunk_plan.json`, and combine `(S)` and `(I)` in `Disproofs/Impl//Nodes.lean`. - **Checkpoints**: `Base*` and `Call.lean` aggregators are tracked in git, while `Call/{C*,Ckpt*}.lean` chunk files are gitignored and materialized by `scripts/bug_injection.py gen-ckpt` (using `Disproofs/Impl/CkptDump/{BasePlaced,RunPlaced}.lean` and `scripts/bug_injection_ckpt.py`, which enforces a pure-expression token allowlist and runs `check_axiom_tactics` and `sorry`/template checks before `rfl_kernel` verification). ### Limitations -- **Token-cell offsets**: `cliTokenPatch` zeroes `tokenStorageOff` and `tokenOnceOff` at offsets measured on the unpatched binary. On the weak-state mutant (`.text` is one page shorter), those writes land in an already-zero read-only page; misplacing the zeroing patch only restricts possible traces, and the Idx1 witness never reads those cells. +- **Token-cell offsets on fixed-image synthetic modules**: the two proved Cheval'26 `SignalSessionSecurePlaced` disproofs resolve `STORAGE.0` and `TOKEN` relocatably from `.symtab` via `cliTokenPatchPlaced mpl` (`tokStorageAddr` and `tokOnceAddr` kernel-checked in `BaseScalarsHooks.lean`). The 10 open synthetic `SignalSessionSecure` modules (`Synthetic/Disproofs/*Cli.lean`) still reference the fixed-image companion `cliTokenPatch` (`tokenStorageOff` and `tokenOnceOff` measured on `cliElfBytes`). - **No `comparator` replay**: mutant disproofs are checked by Lean and `#print axioms` inside their `CV_BUG_INJECTION=` builds rather than replayed against a separate held-out challenge package. ## Status diff --git a/Symbolic/Proofs/Tests/Refinement/Cli/ExternWitness.lean b/Symbolic/Proofs/Tests/Refinement/Cli/ExternWitness.lean index 61b2168a1..9eed559ad 100644 --- a/Symbolic/Proofs/Tests/Refinement/Cli/ExternWitness.lean +++ b/Symbolic/Proofs/Tests/Refinement/Cli/ExternWitness.lean @@ -464,9 +464,6 @@ def cliWitnessHooks : CliHooks where encaps := fun _ _ => (List.Vector.replicate 1568 0#8, List.Vector.replicate 32 0#8) decaps := fun _ _ => List.Vector.replicate 32 0#8 K := cliWitnessMlKem } - bcmp := cliWitnessBcmp - bcmp_ok := cliWitnessBcmp_ok - utf8Err := fun _ => (0#64, 0#16) private theorem toList_vector_replicate (n : Nat) (x : BitVec 8) : (List.Vector.replicate n x).toList = List.replicate n x := rfl diff --git a/Symbolic/Proofs/TopLevelHelpers/Composed/Cli/ExternWitness.lean b/Symbolic/Proofs/TopLevelHelpers/Composed/Cli/ExternWitness.lean index 1738db100..004b983e0 100644 --- a/Symbolic/Proofs/TopLevelHelpers/Composed/Cli/ExternWitness.lean +++ b/Symbolic/Proofs/TopLevelHelpers/Composed/Cli/ExternWitness.lean @@ -407,9 +407,6 @@ def cliWitnessHooks : CliHooks where encaps := fun _ _ => (List.Vector.replicate 1568 0#8, List.Vector.replicate 32 0#8) decaps := fun _ _ => List.Vector.replicate 32 0#8 K := cliWitnessMlKem } - bcmp := cliWitnessBcmp - bcmp_ok := cliWitnessBcmp_ok - utf8Err := fun _ => (0#64, 0#16) private theorem toList_vector_replicate (n : Nat) (x : BitVec 8) : (List.Vector.replicate n x).toList = List.replicate n x := rfl diff --git a/Symbolic/Proofs/TopLevelHelpers/Composed/Cli/RefinementElf.lean b/Symbolic/Proofs/TopLevelHelpers/Composed/Cli/RefinementElf.lean index 29c427198..aa72d7625 100644 --- a/Symbolic/Proofs/TopLevelHelpers/Composed/Cli/RefinementElf.lean +++ b/Symbolic/Proofs/TopLevelHelpers/Composed/Cli/RefinementElf.lean @@ -33,6 +33,7 @@ import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KMemset import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KNarrowR1 import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2KWitness import LibsignalBinary.Proofs.SpecLemmas.SignalSession.ElfSlicesPqOomH2StepsLiftR2 +import LibsignalBinary.Proofs.SignalSession.Cli.HooksDehook.C2RowLayoutFacts.T4Witness -- rooting-only, no decl used import Symbolic.Proofs.TopLevelHelpers.Composed.Cli.RefinementKElf import Symbolic.Proofs.TopLevelHelpers.Composed.Cli.AsmLevelSecurityKElf diff --git a/Symbolic/scripts/machine_free_allow_proofdeps.txt b/Symbolic/scripts/machine_free_allow_proofdeps.txt index 242d530f3..80d80690f 100644 --- a/Symbolic/scripts/machine_free_allow_proofdeps.txt +++ b/Symbolic/scripts/machine_free_allow_proofdeps.txt @@ -6,7 +6,7 @@ # If any pinned source file changes blob, `machine_free_check.py` fails closed (exit 1) until re-signed. # blob-pin: LibsignalBinary/Specifications/LibsignalTripleRatchetRepr.lean = e1b0ceb39e3a3afd4b546809ac9a729fabf98835 # blob-pin: LibsignalBinary/Specifications/LibsignalAesCbc.lean = c069e18e7a9c23c24482f53b68c21af4e8368993 -# blob-pin: LibsignalBinary/Specifications/LibsignalTripleRatchet.lean = 390f93c1c403c17a88fff553749bb01e65394ae9 +# blob-pin: LibsignalBinary/Specifications/LibsignalTripleRatchet.lean = 907c8f78eb0fa76affaf359d0c1074fddf56c94b # Re-pinned after dead-declaration removal; no pinned constant changed; approved by swarat. # Re-pinned again after the trust-banner edit of #808: one comment line changed in each of LibsignalTripleRatchetRepr.lean and LibsignalAesCbc.lean; no line moved, no pinned constant changed. # Re-pinned after the computational-TCB rename (`scripts/rename_computational_tcb.tsv`): identifier renames in all three files, no line added or removed, no pinned constant renamed or changed. @@ -14,9 +14,10 @@ # Re-pinned after the Lean module-system port (#831): `module` / `public import` / `import all` header lines and `@[expose] public section` added; l.NNN references below shifted accordingly; no pinned constant changed. # Re-pinned after the `lake shake` import narrowing: header import lines only (LibsignalTripleRatchetRepr: `-- shake: keep` comment on 1 import; LibsignalTripleRatchet: 2 `public import` lines removed, so l.NNN references below shift by −2); no pinned constant changed (GK ledger rows 84/85: statement hashes identical). # Re-pinned after merging #846 onto the import-narrowed main; proof-side definitions moved to *ProofDefs and unused open removed (l.NNN references below remapped by declaration); no pinned constant changed. +# Re-pinned after the C2 trust-banner edit of LibsignalTripleRatchet.lean (second stock `ld.lld` cutover: `zeroizeSecretHook` left the hook table): comment-only, 5 docstring lines rewritten, no line added or removed, l.NNN references unchanged, no pinned constant changed. # require-tag: [MODEL] -# --- LibsignalTripleRatchet.lean @ 390f93c1c403c17a88fff553749bb01e65394ae9 (GK row 100) --- +# --- LibsignalTripleRatchet.lean @ 907c8f78eb0fa76affaf359d0c1074fddf56c94b (GK row 100) --- CryptoVerification.LibsignalTripleRatchet.SpqrModel : [MODEL] row 100 l.415 pure SPQR protocol model record over byte lists; no memory/layout/hook CryptoVerification.LibsignalTripleRatchet.SpqrModel.mk : [MODEL] row 100 l.415 constructor of pure SpqrModel record; no memory/layout/hook CryptoVerification.LibsignalTripleRatchet.SpqrModel.send : [MODEL] row 100 l.415 projection SpqrModel.send (pure byte-list step); no memory/layout/hook diff --git a/Symbolic/scripts/machine_free_allow_proofdeps_q1.txt b/Symbolic/scripts/machine_free_allow_proofdeps_q1.txt index fa609761f..683853d25 100644 --- a/Symbolic/scripts/machine_free_allow_proofdeps_q1.txt +++ b/Symbolic/scripts/machine_free_allow_proofdeps_q1.txt @@ -5,7 +5,7 @@ # If any pinned source file changes blob, `machine_free_check.py` fails closed (exit 1) until re-signed. # blob-pin: LibsignalBinary/Specifications/LibsignalTripleRatchetRepr.lean = e1b0ceb39e3a3afd4b546809ac9a729fabf98835 # blob-pin: LibsignalBinary/Specifications/LibsignalAesCbc.lean = c069e18e7a9c23c24482f53b68c21af4e8368993 -# blob-pin: LibsignalBinary/Specifications/LibsignalTripleRatchet.lean = 390f93c1c403c17a88fff553749bb01e65394ae9 +# blob-pin: LibsignalBinary/Specifications/LibsignalTripleRatchet.lean = 907c8f78eb0fa76affaf359d0c1074fddf56c94b # Re-pinned after dead-declaration removal; no pinned constant changed; approved by swarat. # Re-pinned again after the trust-banner edit of #808: one comment line changed in each of LibsignalTripleRatchetRepr.lean and LibsignalAesCbc.lean; no line moved, no pinned constant changed. # Re-pinned after the computational-TCB rename (`scripts/rename_computational_tcb.tsv`): identifier renames in all three files, no line added or removed, no pinned constant renamed or changed. @@ -14,6 +14,7 @@ # Re-pinned after the `lake shake` import narrowing: header import lines only (LibsignalTripleRatchetRepr: `-- shake: keep` comment on 1 import; LibsignalTripleRatchet: 2 `public import` lines removed, so l.NNN references below shift by −2); no pinned constant changed (GK ledger rows 84/85: statement hashes identical). # Re-pinned after merging #846 onto the import-narrowed main; proof-side definitions moved to *ProofDefs and unused open removed (l.NNN references below remapped by declaration); no pinned constant changed. # Pinned engine submodule commit for the `Arm64.*` entries (Arm64/Trusted/ISA/State.lean): engine submodule c2ef2f44e5988bf39d73cbf7fb5c784417818bd3 +# Re-pinned after the C2 trust-banner edit of LibsignalTripleRatchet.lean (second stock `ld.lld` cutover: `zeroizeSecretHook` left the hook table): comment-only, 5 docstring lines rewritten, no line added or removed, l.NNN references unchanged, no pinned constant changed. # require-tag: [MODEL] # --- Realized lemmas of signed parents (Q1 addendum, GK row 138) --- diff --git a/comparator/README.md b/comparator/README.md index 1a0529b3f..9ce6728e2 100644 --- a/comparator/README.md +++ b/comparator/README.md @@ -1,28 +1,44 @@ # Comparator check of the headline theorems -CI checks every headline theorem of `Computational/Theorems/` and `Symbolic/Theorems/` with -[`leanprover/comparator`](https://github.com/leanprover/comparator), the Lean FRO's judge for Lean -proofs. For each theorem it checks that: - -1. the theorem in the solution has exactly the statement of the challenge, and every constant the - statement uses (all the way down) is the same in both; -2. its proof uses only the axioms `propext`, `Quot.sound` and `Classical.choice`; -3. the whole solution environment, exported by `lean4export` (not loaded from `.olean` files), - replays in a fresh Lean kernel. - -## Files +This directory sets up [`leanprover/comparator`](https://github.com/leanprover/comparator), the Lean +FRO's proof judge, to check every headline theorem in `Computational/Theorems/` and +`Symbolic/Theorems/`. For each listed theorem, `comparator` checks that: + +1. the theorem in the solution has the exact statement of the challenge, and every constant the + statement transitively references is identical in both; +2. its proof depends only on the standard Lean axioms `propext`, `Quot.sound`, and + `Classical.choice`; +3. the whole solution environment, exported by `lean4export` rather than loaded from `.olean` + files, replays in a fresh Lean kernel (`Lean4Checker.Replay`). + +## How the challenge and solution are set up + +`lakefile.lean` defines two non-default Lake libraries rooted in `comparator/`: + +- **`ComparatorChallenge`** (`ComparatorChallenge/{Computational,Symbolic}.lean` and the per-file + modules under `ComparatorChallenge/{Computational,Symbolic}/`): **trusted** reference statements, + one file per theorem file in `Computational/Theorems/` and `Symbolic/Theorems/`. Each file + imports only specification modules (`Computational/Specifications/`, + `LibsignalBinary/Specifications/`, `Symbolic/Specifications/`—never `Proofs/`, enforced by + `Computational/scripts/check_computational_deps.py` and + `Symbolic/scripts/check_symbolic_deps.py`) and restates each headline theorem with the same fully + qualified name and statement, proved with `sorry`. +- **`ComparatorSolution`** (`ComparatorSolution/{Computational,Symbolic}.lean`): two thin root + modules that `public import` the theorem files in `Computational/Theorems/` and + `Symbolic/Theorems/` and declare nothing themselves, exposing the repository's proved theorems to + `comparator` unchanged. + +If you change a headline theorem statement in `Computational/Theorems/` or `Symbolic/Theorems/`, +make the matching change in its `ComparatorChallenge/` file; the challenge files and the +specification modules they import are the baseline `comparator` compares against. + +The remaining files in `comparator/` configure and run the check: | File | Role | | --- | --- | -| `ComparatorChallenge/Computational/{Lemmas,Main}.lean`, `ComparatorChallenge/Symbolic/{ModelSecurity,RefinementPreservation,Refinement,Security}.lean` | **Trusted.** One file per theorem file. Each theorem has the same name and the same statement, byte for byte, as in `Computational/Theorems/` or `Symbolic/Theorems/`, and the proof `sorry`. They import only specification modules. | -| `ComparatorChallenge/{Computational,Symbolic}.lean` | `challenge_module`s: import the challenge files above. | -| `ComparatorSolution/{Computational,Symbolic}.lean` | `solution_module`s: import the theorem files and declare nothing. | -| `computational.json`, `symbolic.json` | The comparator configs: modules, the fully qualified `theorem_names`, `permitted_axioms`. | -| `install-tools.sh` | Builds comparator, lean4export (both at their `v4.34.0` tags) and landrun (pinned `main` commit). | -| `run.sh` | Runs comparator on both configs concurrently and fails unless both print `Your solution is okay!`. | - -The two lake libraries `ComparatorChallenge` and `ComparatorSolution` (`lakefile.lean`) are not -default targets. +| `computational.json`, `symbolic.json` | Comparator configs pairing `ComparatorChallenge.` (`challenge_module`) with `ComparatorSolution.` (`solution_module`), listing the fully qualified `theorem_names`, and restricting `permitted_axioms` to `propext`, `Quot.sound`, and `Classical.choice` (`enable_nanoda: false`). | +| `install-tools.sh` | Fetches and builds `leanprover/comparator` and `leanprover/lean4export` at the tag matching `lean-toolchain` (`v4.34.0`), plus `Zouuup/landrun` at a pinned commit, and writes `/env` with `COMPARATOR_BIN`, `COMPARATOR_LEAN4EXPORT`, and `COMPARATOR_LANDRUN`. | +| `run.sh` | Pre-warms `lake build` of the challenge and solution modules under `.lake/comparator-home` (so comparator's sandboxed `lake build` is a no-op), raises the stack limit (`ulimit -s`), runs `lake env "$COMPARATOR_BIN"` on each config (both configs concurrently by default), streams timestamped logs to `COMPARATOR_LOG_DIR`, prints wall time and max RSS per config, and fails unless every run exits `0` and prints `Lean default kernel accepts the solution` and `Your solution is okay!`. | ## Theorems checked @@ -48,91 +64,38 @@ Symbolic (`symbolic.json`), every theorem of `Symbolic/Theorems/`: | `RefinementPreservation.lean` | `Proven.RefinementPreservation.comp_refinement_preservation_cli` | | `ModelSecurity.lean` | `Proven.ForwardSecrecy.forward_secrecy`, `Proven.PostCompromiseSecurity.post_compromise_security`, and in `Proven.Handshake`: `alice_initiator_secrecy`, `bob_responder_secrecy`, `authentication`, `peer_authentication`, `handshake_forward_secrecy`, `kci_resistance`, `session_independence`, `hndl_resistance` | -## Running it +## Running comparator -A run takes hours (the kernel replays each headline theorem's whole closure), so it is not part of -the per-PR `CI` workflow (`.github/workflows/ci.yml`). The workflow `Comparator (release)` -(`.github/workflows/comparator-release.yml`) runs it on every release tag (see -[Releases](#releases)), on `workflow_dispatch`, and on PRs that touch `comparator/` or the -comparator workflows. Its job (`.github/workflows/comparator-reusable.yml`) restores the Lean caches -that `ci.yml` saved for the same commit, builds the CLI ELF, `CliElfLib`, `ComparatorChallenge` and -`ComparatorSolution`, runs `run.sh`, and uploads the logs (with `/usr/bin/time -v` wall time and max -RSS) and `pin.txt` (commit, ref, `lean-toolchain`, tool pins, SHA-256 of every file here) as a -workflow artifact. Locally, on a tree where `lake build` and `lake build CliElfLib` have succeeded: +Running `comparator/install-tools.sh` and `comparator/run.sh` requires Linux, since `comparator` +sandboxes its builds and exports with [`landrun`](https://github.com/Zouuup/landrun) (Linux +Landlock). + +First build the default libraries, the `libsignal-cli` ELF, and `CliElfLib` from the repository +root as described in [`../README.md`](../README.md#building-and-verifying) (`lake exe cache get`, +`lake build`, `./scripts/cli-elf-stock --stdbin --build`, `./scripts/cli-elf-stock --stdbin +--verify-pin --lean-mod LibsignalBinary/Specifications/SignalSession/CliElf.lean`, `lake build +CliElfLib`). Then build the comparator tools and the two comparator libraries, and run +`comparator/run.sh`: ```bash +# 1. Build pinned comparator, lean4export, and landrun (uses `go` on PATH, or downloads a pinned Go +# tarball into the output directory) and export their paths: comparator/install-tools.sh /tmp/comparator-tools set -a; source /tmp/comparator-tools/env; set +a -lake build ComparatorChallenge ComparatorSolution -comparator/run.sh # or: comparator/run.sh comparator/symbolic.json -``` - -## Releases - -A release marks the code shipped to the public: a tag `v..
` (e.g. `v2026.11.06`; -add `.1`, `.2`, ... for a second release on the same day) on a commit of `main` whose `CI` run -passed. Pushing any tag that matches `v*` starts `Comparator (release)` on the tagged commit, so -only push such tags for releases. To cut one: -```bash -git fetch origin && git checkout origin/main # or the main commit to release -git tag -s v2026.11.06 -m 'Release v2026.11.06' -git push origin v2026.11.06 -ggh release create v2026.11.06 --verify-tag --title v2026.11.06 --notes '...' +# 2. Build the challenge and solution libraries, then run both configs concurrently +# (or pass a single config, e.g. `comparator/symbolic.json`): +ulimit -S -s 524288 +lake build ComparatorChallenge ComparatorSolution +COMPARATOR_LOG_DIR=/tmp/comparator-logs comparator/run.sh ``` -(`ggh release create v2026.11.06 --target main` alone also works: it creates the tag, which -starts the workflow.) The run takes several hours. When it ends, the logs and `pin.txt` are -attached to the release as `comparator--.tar.gz` (if the release exists by -then) and are always kept as the run's artifact `comparator-` (90 days). Check the run's -summary for the verdict of each config before announcing the release. To re-run the check on an -existing tag, re-run the workflow run, or start `Comparator (release)` by hand -(`workflow_dispatch`) on the tag. - -## Weekly run on main - -The workflow `Comparator (weekly)` (`.github/workflows/comparator-weekly.yml`) runs the same job -(`comparator-reusable.yml`) on the head of `main` every Sunday at 03:17 UTC (03:17 London in winter, -04:17 London in summer), and on `workflow_dispatch` -(`ggh workflow run comparator-weekly.yml --ref `). So a PR that changes a headline statement -without its challenge file, or gives a proof another axiom, passes `CI` but is reported within a -week, not only at the next release. The logs are the run's artifact `comparator-weekly-`. - -A scheduled run that fails (or times out) opens an issue titled *Weekly comparator check failed*, -or comments on it if it is already open; the next scheduled run that passes closes it. Its -`pull_request` trigger covers only the workflow file itself: PRs that touch `comparator/` are -already checked by `Comparator (release)`. - -## Changing a headline theorem - -Change the statement in the theorem file and in its challenge file in the same PR. A reviewer then -reads the challenge diff: the challenge files and the specification modules they import are what -the check trusts. - -## What this check does not cover - -- **The specifications.** The challenge imports the specification modules from the same commit as - the solution, so the definitions the statements use are trusted as they are in that commit (as in - every comparator setup, the challenge's import closure is trusted). Comparator does catch a - theorem file whose statement differs from the challenge, a proof with any other axiom (`sorryAx`, - `Lean.ofReduceBool`, `Lean.trustCompiler`, a custom `axiom`), and a proof the kernel rejects when - replayed from the export. -- **A malicious PR.** The workflow builds the solution (`lake build CliElfLib`) before comparator - builds the challenge, and comparator's `landrun` sandbox only confines comparator's own builds and - exports. Code that runs while the solution is elaborated could change the challenge before it is - built. Comparator's threat model (its README) assumes the solution has not been built before. -- **No sandbox on the CI runners.** Landlock needs Linux ≥ 5.13; the GitHub On-Prem runners run - 5.10 (`run.sh` prints the kernel), so `landrun --best-effort` confines nothing there and - comparator's builds and exports run unsandboxed. -- **`bv_decide`.** No headline theorem depends on a `bv_decide` certificate axiom, so those axioms - are not permitted, and comparator rejects any headline whose axioms include one. Outside - `arm64-semantics/` no `.lean` file uses `bv_decide`; some engine lemmas in - `arm64-semantics/ProofLib/` do, but no headline depends on them. Comparator `v4.34.0` matches - `permitted_axioms` by exact name and cannot accept `bv_decide`'s per-proof certificate axioms. +A full run takes several hours because fresh kernel replay of each headline closure is +single-threaded per config. ## Lean versions -Comparator and lean4export are tagged per Lean release and must match `lean-toolchain`; +`comparator` and `lean4export` are tagged per Lean release and must match `lean-toolchain`; `install-tools.sh` fails if they do not. From Lean v4.35.0 on, comparator is part of core (`lake comparator`, with `lake check`) and the standalone repository is deprecated; when the repository moves to v4.35.0, switch to `lake comparator` instead of bumping the pins. diff --git a/docs/PAPER_MAP.md b/docs/PAPER_MAP.md index d5904ba2e..fa69fa8e3 100644 --- a/docs/PAPER_MAP.md +++ b/docs/PAPER_MAP.md @@ -29,11 +29,11 @@ the community `signal-cli`). | Paper | Code | Notes | |---|---|---| | The CLI (Rust, wraps libsignal v0.105.4) | [`third_party/libsignal/libsignal-session/cli/`](../third_party/libsignal/libsignal-session/cli/) (`src/main.rs`; crates `handshake`, `ratchet`, `io`) | | -| The executable that is verified | `cliElfBytes` in [`LibsignalBinary/Specifications/SignalSession/CliElf.lean`](../LibsignalBinary/Specifications/SignalSession/CliElf.lean) | `file_bytes%` with a pinned SHA-256. Built from source with stock LLVM `ld.lld` by `scripts/cli-elf-stock --stdbin --build` (linker script `third_party/libsignal/libsignal-session/cli-elf/stock.ld`, inputs pinned in `third_party/libsignal/libsignal-session/cli-elf/stock/inputs_stock_stdbin.lock`) | +| The executable that is verified | `cliElfBytes` in [`LibsignalBinary/Specifications/SignalSession/CliElf.lean`](../LibsignalBinary/Specifications/SignalSession/CliElf.lean) | `file_bytes%` with a pinned SHA-256. Built from source with stock LLVM `ld.lld` by `scripts/cli-elf-stock --stdbin --build` (linker script `third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld`, rendered from `cli-elf/stock.ld`, inputs pinned in `third_party/libsignal/libsignal-session/cli-elf/stock/inputs_stock_stdbin.lock`) | | Fig. 1: a party is a directory, and an operation is one run | `CliRun`, `CliHooks` ([`CliRun.lean`](../LibsignalBinary/Specifications/SignalSession/CliRun.lean)); `Placed.cliRunPlacedSig mpl mmpl elf W` ([`CliBinaryPq.lean`](../LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean)); [`CliProcess.lean`](../LibsignalBinary/Specifications/SignalSession/CliProcess.lean) | `Placed.cliRunPlacedSig` is the ELF's relocatable process across placements `(mpl, mmpl)` of `libsignalSessionLib` and `VerifiedLibraries.mallocngLib` under hooks `W` | | Fig. 2: Bob's directory before and after `m1` | `encodeDir`, `PqParty` ([`PqDir.lean`](../LibsignalBinary/Specifications/SignalSession/PqDir.lean)) | The file layout of a party | | Fig. 3: bash scenario (`init`/`send`/`recv`) | `pqInitInputs`, `pqSendInputs`, `pqRecvInputs` ([`PqDir.lean`](../LibsignalBinary/Specifications/SignalSession/PqDir.lean)) | | -| Hooked primitives vs. allocator, `memcpy`/`memset`, and readers | `CliHooks` ([`CliRun.lean`](../LibsignalBinary/Specifications/SignalSession/CliRun.lean)), `Placed.cliHookTablePlaced` (`37` external hooks + `18` `SIGABRT` panic externs in [`CliBinaryPq.lean`](../LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean)); musl's `mallocng` (`VerifiedLibraries.mallocngLib`, including `memcpy` and `memset` at blocks `20`/`21`) and `read_file`/`read_stdin` have machine-checked contracts for their AArch64 code (with their `9` de-hooked externs `Placed.cliDehookedSymsPlaced` resolved via `DirectOrBranchStub`), transferred to the real ELF via per-call `FdsHiFrame` in `VmPreserved` and the K-route proof `ElfSlicesPqOomH2KM1.h2k_ghostArms_closed` (DEV-CLI19); `PEParams` (`W.C`, `W.Q`) | DEV-E8, DEV-PQ1, DEV-CLI19 in [`DEVIATIONS.md`](../Computational/docs/DEVIATIONS.md) | +| Hooked primitives vs. allocator, `memcpy`/`memset`, and readers | `CliHooks` ([`CliRun.lean`](../LibsignalBinary/Specifications/SignalSession/CliRun.lean)), `Placed.cliHookTablePlaced` (`27` external hooks + `18` `SIGABRT` panic externs in [`CliBinaryPq.lean`](../LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean)); musl's `mallocng` (`VerifiedLibraries.mallocngLib`, including `memcpy` and `memset` at blocks `20`/`21`) and `read_file`/`read_stdin` have machine-checked contracts for their AArch64 code (with the `19` de-hooked externs of `Placed.cliDehookedSymsPlaced`, including the `10` libc / Rust-library routines de-hooked at C2 whose linked code runs, resolved via `DirectOrBranchStub`), transferred to the real ELF via per-call `FdsHiFrame` in `VmPreserved` and the K-route proof `ElfSlicesPqOomH2KM1.h2k_ghostArms_closed` (DEV-CLI19); `PEParams` (`W.C`, `W.Q`) | DEV-E8, DEV-PQ1, DEV-CLI19 in [`DEVIATIONS.md`](../Computational/docs/DEVIATIONS.md) | ## §3 AArch64 semantics @@ -101,7 +101,7 @@ under [`Arm64/Trusted/`](../arm64-semantics/Arm64/Trusted/) is trusted. | Paper | Code | |---|---| | No heap allocation fails | proved unconditionally for `cliElfBytes` on the modelled 1 GiB physical-memory machine (`ProcessInit.physMemAvail = 2^30`): no PQXDH-mode run reaches `.OutOfMemory` (`ElfNoOomPlacedInstK.cliElf_noOOM_of_parseK`, with proof-side fd closedness via `FdsHiFrame` in `VmPreserved` and K-route transfer via `ElfSlicesPqOomH2KM1.h2k_ghostArms_closed`), so the Main Theorem's security clause has no allocation premise (DEV-CLI12 retired) and no `2·δ_oom(A)` term (DEV-CLI17 retired). Lemma 4's statement (`CliPqxdhElfCorrectPlaced`) still allows `.OutOfMemory` (DEV-CLI15) | -| Hooked routines meet their specs | `CliHooks` fields (`37` external hooks in `Placed.cliHookTablePlaced`); `HookSat` contracts in `LibsignalBinary/` | +| Hooked routines meet their specs | `CliHooks` fields (`27` external hooks in `Placed.cliHookTablePlaced`); `HookSat` contracts in `LibsignalBinary/` | | ML-KEM-768 encapsulation total on SPQR keys | `MlKemEncaps1SucceedsOn64ByteHeaderAndSeeds` ([`StatementBinaryHarnessCore.lean`](../Computational/Specifications/Game/StatementBinaryHarnessCore.lean)), `Encaps1Total` ([`LibsignalBinary/Specifications/LibsignalSpqrV1/Encaps1Total.lean`](../LibsignalBinary/Specifications/LibsignalSpqrV1/Encaps1Total.lean)) | | `2(q_k + 1) + 25002 < 2^32` ratchet queries per session (`q_k ≤ 2^31 - 12503`) | the premise `_hq32 : ∀ k < qStart, 2 * (qs k + 1) + 25002 < 2^32` in `LibsignalCliPqSecure` and `CliPqxdhElfSecurePlaced` (matching Lemma 2; `encodeRecordX_length_le_1209331_cli` bounds every reachable session record by `1,209,331 < 2^31` bytes) | | Messages shorter than 10^6 bytes; standard input and injected ciphertexts ≤ 2^20 bytes | the premise `ℓ < 10^6`; `stdinCapBytes = 2^20` and `maxPlaintextBytes = 10^6` in [`Run.lean`](../LibsignalBinary/Specifications/SignalSession/Run.lean), plus `bhInjOK` (`decide (c.length ≤ stdinCapBytes)`, DEV-CLI14 / DEV-CLI21; no `ReductionDsl` operation table is capped) | diff --git a/docs/Symbolic/PAPER_DIFFERENCES.md b/docs/Symbolic/PAPER_DIFFERENCES.md index 870cdf08d..6453215c6 100644 --- a/docs/Symbolic/PAPER_DIFFERENCES.md +++ b/docs/Symbolic/PAPER_DIFFERENCES.md @@ -285,7 +285,7 @@ Translating Bhargavan et al.'s prose statements (Appendix A, l. 678–713) into Neither Bhargavan et al. nor Cheval et al. verify source code or compiled machine code; any discrepancy between a paper's ProVerif model and `libsignal`'s Rust/assembly implementation (such as protobuf parsing edge cases, integer overflows, unvalidated curve points, non-atomic session writes, or file-system state corruption) lies outside their proofs. -In `Symbolic/Theorems/Refinement.lean` and `Symbolic/Theorems/Security.lean` (built in the `CliElfLib` Lake target), we prove two end-to-end theorems over **`cliElfBytes`** — the SHA-256-pinned static musl ARM64 ELF binary `libsignal-cli` (`2f20c836342437a882b5882c34eab604e4f23b2b388c2b2a0696eeda51cddc7e`, pinned in `LibsignalBinary/Specifications/SignalSession/CliElf.lean`) compiled from `libsignal` v0.105.4: +In `Symbolic/Theorems/Refinement.lean` and `Symbolic/Theorems/Security.lean` (built in the `CliElfLib` Lake target), we prove two end-to-end theorems over **`cliElfBytes`** — the SHA-256-pinned static musl ARM64 ELF binary `libsignal-cli` (`50066cbd732256eb5f19f93d1d98800914336b7926225de3ebfa0bb37eca98ce`, pinned in `LibsignalBinary/Specifications/SignalSession/CliElf.lean`) compiled from `libsignal` v0.105.4: 1. **`Proven.Refinement.comp_refines_cli_placed : CompRefinesCliBinaryPlaced cliElfBytes`**: - For every pair of placements `mpl`, `mmpl` at which `libsignalSessionLib` and `VerifiedLibraries.mallocngLib` are linked into `cliElfBytes` (`LinkedAt`; non-vacuous by `libsignal_cli_elf_linked_in` and `libsignal_cli_elf_mallocng_linked_in`), the image's code matches the verified libraries (`CliElfCodeMatchesPlaced`). @@ -294,7 +294,7 @@ In `Symbolic/Theorems/Refinement.lean` and `Symbolic/Theorems/Security.lean` (bu - is **explained** 1-for-1 (`Explains` in `TraceExplanation.lean`: matching each `RunEvent` to a party step via `RunMatches` or rejection `RunRejected`, with random draws sliced directly as a prefix of `ev.coins` via `GhostWF`, and each `EnvEvent` to its model compromise/exposure/break/invert step via `EnvMatches`) by a faithful run of our composed symbolic model (`ModelTraces.Step`, mirroring all 23 `Composed.reachability` transitions), **or** - has an explained prefix followed by an input that triggers an unavoidable **concrete cryptographic byte collision** (`CollisionAfterExplainedPrefix`). - What runs as **real ARM64 machine code**: CLI file I/O, protobuf wire encoding/decoding (`SignalMessage`, `PreKeySignalMessage`, `SessionRecord`, prekey records), HKDF-SHA256 structure, Double Ratchet chain management and skipped-key caching, PQXDH key-schedule assembly, and SPQR V1 state-machine logic. - - What is **hooked at link boundaries (`HooksMatchInterpretation` & `ExternContractsHoldCli`)**: the `37` rows of `cliHookTablePlaced` (canonical list in `Computational/docs/TRUSTED_BASE.md` §5) — low-level cryptographic primitives (SHA-256 block compression, AES-256-CBC encryption and decryption as whole functions, including CBC chaining and PKCS#7 padding/unpadding, X25519 scalar multiplication, Kyber-1024 encapsulate/decapsulate, Ed25519 curve ops & torsion check, SPQR's incremental ML-KEM-768, and `libcrux_hmac`), `core::fmt::write` and `alloc::fmt::format::format_inner` (kept hooked in this release by design), the two 0-allocation write functions (`write_file`, `write_stdout`, linked in `lib1_0.o` and intercepted at entry as trusted hooks, DEV-CLI19), and the other non-crypto rows not yet de-hooked (`memmove`, `bcmp`, `strlen`, `core::slice::memchr::memrchr`, `core::str::converts::from_utf8`, `SystemTime::duration_since`, `>::add`, `subtle::black_box`, and the `2` X25519 `Drop::drop` zeroize hooks). **`Proven.ExternWitness.comp_externsSatisfiable_cli`** proves that a concrete `ExternInterpretation` and `CliHooks` witness simultaneously satisfies `ExternInterpretationTotalOnUsedSymbols`, `ExternContractsHoldCli` (`ExternCryptoLawsHold` + `X25519TorsionShiftsRejected`), and `HooksMatchInterpretation`, ensuring the binary theorems are never vacuous. + - What is **hooked at link boundaries (`HooksMatchInterpretation` & `ExternContractsHoldCli`)**: the `27` rows of `cliHookTablePlaced` (canonical list in `Computational/docs/TRUSTED_BASE.md` §5) — low-level cryptographic primitives (SHA-256 block compression, AES-256-CBC encryption and decryption as whole functions, including CBC chaining and PKCS#7 padding/unpadding, X25519 scalar multiplication, Kyber-1024 encapsulate/decapsulate, Ed25519 curve ops & torsion check, SPQR's incremental ML-KEM-768, and `libcrux_hmac`), `core::fmt::write` and `alloc::fmt::format::format_inner` (kept hooked in this release by design), and the two 0-allocation write functions (`write_file`, `write_stdout`, linked in `lib1_0.o` and intercepted at entry as trusted hooks, DEV-CLI19); the second stock `ld.lld` cutover (C2) de-hooked the other non-crypto rows, whose linked code runs. **`Proven.ExternWitness.comp_externsSatisfiable_cli`** proves that a concrete `ExternInterpretation` and `CliHooks` witness simultaneously satisfies `ExternInterpretationTotalOnUsedSymbols`, `ExternContractsHoldCli` (`ExternCryptoLawsHold` + `X25519TorsionShiftsRejected`), and `HooksMatchInterpretation`, ensuring the binary theorems are never vacuous. - **No allocation-success assumption**: If a dynamic memory allocation fails and the binary aborts mid-call, `CliTraces.stop` terminates the trace cleanly (preserving prior leaks and the aborted `RunEvent` without allowing subsequent calls to read a half-written directory). The 5 Rust global-allocator entry points (`mallocng`), `read_file`, and `read_stdin` execute real linked ARM64 code, with per-call closedness of `fds ≥ 3` proved in `VmPreserved` (`FdsHiFrame`) and the ghost-to-real transfer proved on the K route (`ElfSlicesPqOomH2KM1.h2k_ghostArms_closed`). 2. **`Proven.Security.signal_session_secure_placed : SignalSessionSecurePlaced cliElfBytes`** (via `comp_refinement_preservation_cli`): diff --git a/scripts/cli-elf-stock b/scripts/cli-elf-stock index 870f7c3cb..50fc45b32 100755 --- a/scripts/cli-elf-stock +++ b/scripts/cli-elf-stock @@ -154,8 +154,948 @@ DEFAULT_REL_STDBIN_LOCK = pathlib.Path( "third_party/libsignal/libsignal-session/cli-elf/stock/inputs_stock_stdbin.lock" ) DEFAULT_REL_STOCK_LD = pathlib.Path("third_party/libsignal/libsignal-session/cli-elf/stock.ld") +DEFAULT_REL_STOCK_C2_LD = pathlib.Path( + "third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld" +) +DEFAULT_REL_LIB2_CONFIG = pathlib.Path( + "third_party/libsignal/libsignal-session/cli/rt/translation.toml" +) +DEFAULT_REL_CLI_BINARY_PQ = pathlib.Path( + "LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean" +) DEFAULT_REL_ENGINE: pathlib.Path = _BASE.DEFAULT_REL_ENGINE +C2_LIB2_CANONICAL_ROWS: tuple[tuple[str, str], ...] = ( + ("memrchr", "_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr"), + ("from_utf8", "_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8"), + ("duration_since", "_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since"), + ("black_box", "_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek"), + ( + "static_secret_drop", + "_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + ), + ( + "shared_secret_drop", + "_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + ), + ( + "time_add", + "_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add", + ), +) +C2_LIB2_TIME_ADD_SYM: str = dict(C2_LIB2_CANONICAL_ROWS)["time_add"] +C2_LIBC_CANONICAL_ORDER: tuple[str, ...] = ("memmove", "memcmp", "bcmp", "strlen") + + +def _strip_lean_comments_preserving_strings(src: str) -> str: + """Strip Lean `--` line comments and nested `/- ... -/` block comments while preserving `"..."` literals.""" + out: list[str] = [] + i = 0 + n = len(src) + in_str = False + block_depth = 0 + while i < n: + ch = src[i] + if block_depth > 0: + if src.startswith("/-", i): + block_depth += 1 + out.append(" ") + i += 2 + continue + if src.startswith("-/", i): + block_depth -= 1 + out.append(" ") + i += 2 + continue + out.append("\n" if ch == "\n" else " ") + i += 1 + continue + if in_str: + out.append(ch) + if ch == "\\" and i + 1 < n: + out.append(src[i + 1]) + i += 2 + continue + if ch == '"': + in_str = False + i += 1 + continue + if src.startswith("/-", i): + block_depth = 1 + out.append(" ") + i += 2 + continue + if src.startswith("--", i): + while i < n and src[i] != "\n": + i += 1 + continue + if ch == '"': + in_str = True + out.append(ch) + i += 1 + if block_depth != 0: + raise RuntimeError("unterminated `/- ... -/` block comment in Lean source") + if in_str: + raise RuntimeError("unterminated string literal in Lean source") + return "".join(out) + + +def _split_top_level_lean_sep(expr: str, sep: str) -> list[str]: + """Split `expr` on `sep` at delimiter depth 0 (`()`, `[]`, `{}`, `⟨⟩`), respecting `"..."` strings.""" + parts: list[str] = [] + cur: list[str] = [] + depth = 0 + in_str = False + i = 0 + n = len(expr) + sep_len = len(sep) + while i < n: + ch = expr[i] + if in_str: + cur.append(ch) + if ch == "\\" and i + 1 < n: + cur.append(expr[i + 1]) + i += 2 + continue + if ch == '"': + in_str = False + i += 1 + continue + if ch == '"': + in_str = True + cur.append(ch) + i += 1 + continue + if ch in "([{⟨": + depth += 1 + cur.append(ch) + i += 1 + continue + if ch in ")]}⟩": + if depth <= 0: + raise RuntimeError(f"unbalanced closing delimiter `{ch}` in Lean expression {expr!r}") + depth -= 1 + cur.append(ch) + i += 1 + continue + if depth == 0 and expr.startswith(sep, i): + parts.append("".join(cur)) + cur = [] + i += sep_len + continue + cur.append(ch) + i += 1 + if depth != 0 or in_str: + raise RuntimeError(f"unbalanced delimiters in Lean expression {expr!r}") + parts.append("".join(cur)) + return parts + + +def _eval_lean_string_atom(atom: str, str_defs: Mapping[str, str], *, label: str) -> str: + s = atom.strip() + while s.startswith("(") and s.endswith(")"): + inner = s[1:-1].strip() + try: + parts = _split_top_level_lean_sep(inner, ",") + except RuntimeError: + break + if len(parts) == 1 and inner == parts[0].strip(): + s = inner + else: + break + if len(s) >= 2 and s[0] == '"' and s[-1] == '"': + out_chars: list[str] = [] + i = 1 + end = len(s) - 1 + while i < end: + ch = s[i] + if ch == "\\": + if i + 1 >= end: + raise RuntimeError(f"{label}: dangling backslash in string literal {s!r}") + nxt = s[i + 1] + esc_map = {'"': '"', "\\": "\\", "n": "\n", "t": "\t", "r": "\r"} + if nxt not in esc_map: + raise RuntimeError(f"{label}: unsupported escape `\\{nxt}` in {s!r}") + out_chars.append(esc_map[nxt]) + i += 2 + continue + if ch == '"': + raise RuntimeError(f"{label}: unexpected quote inside string atom {s!r}") + out_chars.append(ch) + i += 1 + val = "".join(out_chars) + if not val: + raise RuntimeError(f"{label}: empty symbol string literal in Lean table") + return val + if re.fullmatch(r"[A-Za-z_][A-Za-z0-9_'.]*", s): + if s not in str_defs: + raise RuntimeError(f"{label}: unknown Lean String identifier `{s}`") + return str_defs[s] + raise RuntimeError(f"{label}: unsupported Lean String expression `{s}`") + + +def parse_cli_binary_pq_text( + text: str, *, source_label: str = "CliBinaryPq.lean" +) -> dict[str, list[str]]: + """D-C2d: Count-agnostic, fail-closed parser for `cliHookTablePlaced`, `cliDehookedSymsPlaced`, + and `cliPanicSymbolsPlaced` from `CliBinaryPq.lean` (resolving `abbrev`/`def : String`, string + literals, and `++` list concatenations without hard-coded row counts).""" + cleaned = _strip_lean_comments_preserving_strings(text) + top_re = re.compile( + r"(?m)^(?:@[^\n]+\n)*(?:noncomputable\s+|private\s+|protected\s+)*" + r"(abbrev|def|theorem|lemma|namespace|end|section|open|set_option|structure|inductive)\b" + ) + matches = list(top_re.finditer(cleaned)) + decls: list[tuple[str, str, str]] = [] + for idx, m in enumerate(matches): + kw = m.group(1) + if kw not in ("abbrev", "def"): + continue + end_pos = matches[idx + 1].start() if idx + 1 < len(matches) else len(cleaned) + chunk = cleaned[m.end() : end_pos].strip() + nm_m = re.match(r"^([A-Za-z_][A-Za-z0-9_']*)\b(.*)$", chunk, flags=re.DOTALL) + if nm_m is None: + continue + decl_name = nm_m.group(1) + rest = nm_m.group(2) + assign_parts = _split_top_level_lean_sep(rest, ":=") + if len(assign_parts) < 2: + continue + lhs_sig = assign_parts[0].strip() + rhs_body = ":=".join(assign_parts[1:]).strip() + decls.append((decl_name, lhs_sig, rhs_body)) + + str_defs: dict[str, str] = {} + for decl_name, lhs_sig, rhs_body in decls: + sig_parts = _split_top_level_lean_sep(lhs_sig, ":") + if len(sig_parts) >= 2 and re.sub(r"\s+", " ", sig_parts[-1]).strip() == "String": + str_defs[decl_name] = _eval_lean_string_atom( + rhs_body, str_defs, label=f"{source_label}:{decl_name}" + ) + + str_lists: dict[str, list[str]] = {} + pair_key_lists: dict[str, list[str]] = {} + target_str_list_names = {"cliDehookedSymsPlaced", "cliPanicSymbolsPlaced"} + target_pair_list_names = {"cliHookTablePlaced"} + + for decl_name, lhs_sig, rhs_body in decls: + sig_parts = _split_top_level_lean_sep(lhs_sig, ":") + ret_ty = re.sub(r"\s+", " ", sig_parts[-1]).strip() if len(sig_parts) >= 2 else "" + is_str_list = ret_ty == "List String" or decl_name in target_str_list_names + is_pair_list = ( + ret_ty.startswith("List (String ×") + or ret_ty.startswith("List (Prod String") + or decl_name in target_pair_list_names + ) + if not (is_str_list or is_pair_list): + continue + try: + summands = _split_top_level_lean_sep(rhs_body, "++") + acc: list[str] = [] + for raw_sum in summands: + s_sum = raw_sum.strip() + if not s_sum: + raise RuntimeError(f"{source_label}:{decl_name}: empty `++` summand") + if s_sum.startswith("[") and s_sum.endswith("]"): + inner = s_sum[1:-1].strip() + if not inner: + continue + elems = [e.strip() for e in _split_top_level_lean_sep(inner, ",") if e.strip()] + if is_str_list: + for el in elems: + acc.append( + _eval_lean_string_atom( + el, str_defs, label=f"{source_label}:{decl_name}" + ) + ) + else: + for el in elems: + if not (el.startswith("(") and el.endswith(")")): + raise RuntimeError( + f"{source_label}:{decl_name}: expected `(sym, hook)` pair, got {el!r}" + ) + pair_elems = _split_top_level_lean_sep(el[1:-1], ",") + if len(pair_elems) < 2: + raise RuntimeError( + f"{source_label}:{decl_name}: malformed pair {el!r}" + ) + acc.append( + _eval_lean_string_atom( + pair_elems[0], + str_defs, + label=f"{source_label}:{decl_name}", + ) + ) + else: + call_tok = s_sum.split()[0] + table_ref = str_lists if is_str_list else pair_key_lists + if call_tok not in table_ref: + raise RuntimeError( + f"{source_label}:{decl_name}: unknown helper list `{call_tok}` in `{s_sum}`" + ) + acc.extend(table_ref[call_tok]) + if is_str_list: + str_lists[decl_name] = acc + else: + pair_key_lists[decl_name] = acc + except RuntimeError: + if decl_name in (target_str_list_names | target_pair_list_names): + raise + continue + + missing_tables = [ + nm + for nm, tbl in ( + ("cliHookTablePlaced", pair_key_lists), + ("cliDehookedSymsPlaced", str_lists), + ("cliPanicSymbolsPlaced", str_lists), + ) + if nm not in tbl + ] + if missing_tables: + raise RuntimeError( + f"{source_label}: missing required Lean symbol declaration(s): {missing_tables}" + ) + + hook_keys = list(pair_key_lists["cliHookTablePlaced"]) + dehooked_syms = list(str_lists["cliDehookedSymsPlaced"]) + panic_syms = list(str_lists["cliPanicSymbolsPlaced"]) + if not hook_keys: + raise RuntimeError(f"{source_label}: `cliHookTablePlaced` parsed to 0 rows") + if not panic_syms: + raise RuntimeError(f"{source_label}: `cliPanicSymbolsPlaced` parsed to 0 entries") + + for tbl_name, vals in ( + ("cliHookTablePlaced", hook_keys), + ("cliDehookedSymsPlaced", dehooked_syms), + ("cliPanicSymbolsPlaced", panic_syms), + ): + if len(set(vals)) != len(vals): + seen_s: set[str] = set() + dups = sorted({v for v in vals if v in seen_s or seen_s.add(v)}) # type: ignore[func-returns-value] + raise RuntimeError(f"{source_label}: duplicate symbol(s) in `{tbl_name}`: {dups}") + + overlap_hd = sorted(set(hook_keys) & set(dehooked_syms)) + if overlap_hd: + raise RuntimeError( + f"{source_label}: symbol(s) in both `cliHookTablePlaced` and `cliDehookedSymsPlaced`: {overlap_hd}" + ) + overlap_hp = sorted(set(hook_keys) & set(panic_syms)) + if overlap_hp: + raise RuntimeError( + f"{source_label}: symbol(s) in both `cliHookTablePlaced` and `cliPanicSymbolsPlaced`: {overlap_hp}" + ) + overlap_dp = sorted(set(dehooked_syms) & set(panic_syms)) + if overlap_dp: + raise RuntimeError( + f"{source_label}: symbol(s) in both `cliDehookedSymsPlaced` and `cliPanicSymbolsPlaced`: {overlap_dp}" + ) + + return { + "cliHookTablePlaced": hook_keys, + "cliDehookedSymsPlaced": dehooked_syms, + "cliPanicSymbolsPlaced": panic_syms, + } + + +def load_cli_binary_pq_tables( + repo_root: pathlib.Path, + *, + rel_path: pathlib.Path = DEFAULT_REL_CLI_BINARY_PQ, + fallback_repo_root: pathlib.Path | None = None, +) -> dict[str, list[str]]: + cand = repo_root / rel_path + if not cand.is_file() and fallback_repo_root is not None: + fb = fallback_repo_root / rel_path + if fb.is_file(): + cand = fb + if not cand.is_file(): + raise RuntimeError(f"missing `CliBinaryPq.lean` at {cand}") + return parse_cli_binary_pq_text( + cand.read_text(encoding="utf-8"), source_label=str(cand) + ) + + +def _parse_c2_row_tokens(raw: str | Sequence[str] | None) -> list[str] | None: + if raw is None: + return None + if isinstance(raw, str): + s = raw.strip() + if not s or s.lower() == "none": + return [] + if s.lower() == "all": + return ["all"] + return [tok.strip() for tok in s.split(",") if tok.strip()] + items = [str(x).strip() for x in raw if str(x).strip()] + if len(items) == 1 and items[0].lower() == "none": + return [] + return items + + +def _resolve_c2_row_selection( + *, + lib2_cfg: Mapping[str, Any] | None, + lock: Mapping[str, Any], + lib2_rows_spec: str | None = None, + c2_libc_rows_spec: str | None = None, +) -> tuple[tuple[str, ...], tuple[str, ...], tuple[str, ...]]: + """Resolve `(active_lib2_row_names, active_lib2_roots, moved_libc_rows)` fail-closed in canonical + order (`SystemTime::add` strictly LAST among `lib2` roots; `memmove -> memcmp -> bcmp -> strlen` + for `2C` libc rows, with `bcmp` and `memcmp` coupled so their 56-byte hull never splits).""" + raw_lib2 = ( + _parse_c2_row_tokens(lib2_rows_spec) + if lib2_rows_spec is not None + else _parse_c2_row_tokens(lock.get("lib2_rows")) + ) + if not raw_lib2: + active_lib2_names: tuple[str, ...] = () + active_lib2_roots: tuple[str, ...] = () + else: + if lib2_cfg is None: + raise RuntimeError("`lib2` row selection requires `cli/rt/translation.toml`") + rows_tbl = lib2_cfg.get("lib2_rows") + placed_exps = [str(x) for x in (lib2_cfg.get("placed", {}).get("exports") or ())] + if not isinstance(rows_tbl, Mapping) or not rows_tbl or not placed_exps: + raise RuntimeError("`cli/rt/translation.toml` missing `[lib2_rows]` or `[placed].exports`") + if placed_exps[-1] != C2_LIB2_TIME_ADD_SYM: + raise RuntimeError( + f"`cli/rt/translation.toml` `[placed].exports` must place `SystemTime::add` LAST, " + f"got {placed_exps[-1]!r}" + ) + root_to_row: dict[str, str] = {} + row_to_root: dict[str, str] = {} + for rname, rinfo in rows_tbl.items(): + if not isinstance(rinfo, Mapping) or not rinfo.get("root"): + raise RuntimeError(f"`[lib2_rows.{rname}]` missing `root`") + rsym = str(rinfo["root"]) + row_to_root[str(rname)] = rsym + root_to_row[rsym] = str(rname) + canonical_pairs: list[tuple[str, str]] = [] + for exp_sym in placed_exps: + if exp_sym not in root_to_row: + raise RuntimeError( + f"`cli/rt/translation.toml` export `{exp_sym}` missing `[lib2_rows.*]` entry" + ) + canonical_pairs.append((root_to_row[exp_sym], exp_sym)) + if raw_lib2 == ["all"]: + chosen_names_set = {nm for nm, _ in canonical_pairs} + else: + chosen_names_set = set() + for tok in raw_lib2: + resolved_nm = ( + tok if tok in row_to_root else root_to_row.get(tok) + ) + if resolved_nm is None: + raise RuntimeError( + f"unknown `lib2` row `{tok}` (known rows: {[nm for nm, _ in canonical_pairs]})" + ) + if resolved_nm in chosen_names_set: + raise RuntimeError(f"duplicate `lib2` row `{resolved_nm}`") + chosen_names_set.add(resolved_nm) + ordered_active = [(nm, rsym) for nm, rsym in canonical_pairs if nm in chosen_names_set] + active_lib2_names = tuple(nm for nm, _ in ordered_active) + active_lib2_roots = tuple(rsym for _, rsym in ordered_active) + + if c2_libc_rows_spec is not None: + raw_libc = _parse_c2_row_tokens(c2_libc_rows_spec) + elif "c2_moved_libc_rows" in lock: + raw_libc = _parse_c2_row_tokens(lock.get("c2_moved_libc_rows")) + elif active_lib2_names: + raw_libc = ["all"] + else: + raw_libc = [] + + if not raw_libc: + moved_libc_rows: tuple[str, ...] = () + elif raw_libc == ["all"]: + moved_libc_rows = C2_LIBC_CANONICAL_ORDER + else: + chosen_libc: set[str] = set() + for tok in raw_libc: + if tok not in C2_LIBC_CANONICAL_ORDER: + raise RuntimeError( + f"unknown C2 libc row `{tok}` (expected subset of {list(C2_LIBC_CANONICAL_ORDER)})" + ) + if tok in chosen_libc: + raise RuntimeError(f"duplicate C2 libc row `{tok}`") + chosen_libc.add(tok) + if ("bcmp" in chosen_libc) != ("memcmp" in chosen_libc): + raise RuntimeError( + "`bcmp` and `memcmp` must move or stay together under C2 `2C` " + "(preserving `bcmp`'s 4-byte `b memcmp` and the 56-byte `memcmp + bcmp` hull)" + ) + moved_libc_rows = tuple(r for r in C2_LIBC_CANONICAL_ORDER if r in chosen_libc) + + return active_lib2_names, active_lib2_roots, moved_libc_rows + + +def _render_c2_stock_ld( + base_stock_ld_text: str, moved_libc_rows: Sequence[str] +) -> str: + """Render the C2 `D-C2f = 2C` linker script from `cli-elf/stock.ld` by moving `moved_libc_rows` + (`memmove -> memcmp -> bcmp -> strlen`) out of `.text.crate` (`:text_a`) to the tail of + `.text.b_pre` (`:text_b`, `< e_entry`) right after `*memset.lo(.text .text.*)`.""" + _, _, moved_tup = _resolve_c2_row_selection( + lib2_cfg=None, + lock={}, + lib2_rows_spec="none", + c2_libc_rows_spec=",".join(moved_libc_rows) if moved_libc_rows else "none", + ) + if not moved_tup: + return base_stock_ld_text + + moved_set = set(moved_tup) + crate_anchor = ( + " *extern_stubs_clean.o(.text .text.*)\n" + " KEEP(*extern_stubs_clean.o(.text.__retired_*))\n" + " memmove.o(.text .text.*)\n" + " */memmove.o(.text .text.*)\n" + " *libc.a:memmove.lo(.text .text.*)\n" + " memcmp.o(.text .text.*)\n" + " */memcmp.o(.text .text.*)\n" + " *libc.a:memcmp.lo(.text .text.*)\n" + " bcmp.o(.text .text.*)\n" + " */bcmp.o(.text .text.*)\n" + " *libc.a:bcmp.lo(.text .text.*)\n" + " *(EXCLUDE_FILE(*lib2_*.o) .text.strlen EXCLUDE_FILE(*lib2_*.o) .text.compiler_rt.*)\n" + ) + if crate_anchor not in base_stock_ld_text: + raise RuntimeError("`stock.ld` missing expected `.text.crate` libc string block anchor") + + b_pre_anchor = ( + " memset.o(.text .text.*)\n" + " */memset.o(.text .text.*)\n" + " *libc.a:memset.lo(.text .text.*)\n" + " *memset.lo(.text .text.*)\n" + " } :text_b =0" + ) + if b_pre_anchor not in base_stock_ld_text: + raise RuntimeError("`stock.ld` missing expected `.text.b_pre` `memset.lo` tail anchor") + + crate_lines = [ + " *extern_stubs_clean.o(.text .text.*)", + " KEEP(*extern_stubs_clean.o(.text.__retired_*))", + ] + for r in ("memmove", "memcmp", "bcmp"): + if r not in moved_set: + crate_lines.extend([ + f" {r}.o(.text .text.*)", + f" */{r}.o(.text .text.*)", + f" *libc.a:{r}.lo(.text .text.*)", + ]) + if "strlen" in moved_set: + crate_lines.append(" *(EXCLUDE_FILE(*lib2_*.o) .text.compiler_rt.*)") + else: + crate_lines.append( + " *(EXCLUDE_FILE(*lib2_*.o) .text.strlen EXCLUDE_FILE(*lib2_*.o) .text.compiler_rt.*)" + ) + + b_pre_lines = [ + " memset.o(.text .text.*)", + " */memset.o(.text .text.*)", + " *libc.a:memset.lo(.text .text.*)", + " *memset.lo(.text .text.*)", + ] + for r in moved_tup: + b_pre_lines.extend([ + f" {r}.o(.text .text.*)", + f" */{r}.o(.text .text.*)", + f" *libc.a:{r}.lo(.text .text.*)", + f" *{r}.lo(.text .text.*)", + ]) + if r == "strlen": + b_pre_lines.append(" *(EXCLUDE_FILE(*lib2_*.o) .text.strlen)") + b_pre_lines.append(" } :text_b =0") + + rendered = base_stock_ld_text.replace(crate_anchor, "\n".join(crate_lines) + "\n", 1) + rendered = rendered.replace(b_pre_anchor, "\n".join(b_pre_lines), 1) + + if moved_tup == C2_LIBC_CANONICAL_ORDER: + hdr_orig = ( + "/* Deterministic stock `ld.lld` linker script v2 for `libsignal-cli` (`StdBin` 2-config + `--no-relax`).\n" + ) + hdr_c2 = ( + "/* Deterministic stock `ld.lld` linker script v2 (C2 `D-C2f = 2C` variant) for `libsignal-cli`.\n" + " *\n" + " * Identical to `cli-elf/stock.ld` except that the 4 de-hooked `libc.a` string primitives\n" + " * (`memmove.lo` -> `memcmp.lo` -> `bcmp.lo` -> `strlen.lo`) are placed at the tail of `.text.b_pre`\n" + " * (`:text_b`, `< e_entry`) immediately after `memset.lo` instead of `.text.crate` (`:text_a`),\n" + " * preserving `bcmp`'s `b memcmp` branch word and the 56-byte `memcmp + bcmp` hull.\n" + " * Generated deterministically from `cli-elf/stock.ld` by `_render_c2_stock_ld`.\n" + ) + c_crate_orig = ( + " * `KEEP(.text.__retired_*)` retired stub slots), hooked musl string primitives\n" + " * (`memmove.lo`, `memcmp.lo`, `bcmp.lo`, `strlen.lo` when still hooked; moved to the\n" + " * `.text.b_pre` tail after `memset.lo` in `stock/stock_c2.ld` under C2 `D-C2f = 2C`), and\n" + " * `.text.compiler_rt.*`;\n" + ) + c_crate_c2 = ( + " * `KEEP(.text.__retired_*)` retired stub slots), and `.text.compiler_rt.*`;\n" + ) + c_bpre_orig = ( + " * `memcpy.lo` / `memset.lo` (followed at C2 `2C` by `memmove.lo` -> `memcmp.lo` ->\n" + " * `bcmp.lo` -> `strlen.lo`, `< e_entry`);\n" + ) + c_bpre_c2 = ( + " * `memcpy.lo` / `memset.lo` followed by `memmove.lo` -> `memcmp.lo` -> `bcmp.lo` -> `strlen.lo`\n" + " * (`< e_entry`);\n" + ) + if hdr_orig in rendered: + rendered = rendered.replace(hdr_orig, hdr_c2, 1) + if c_crate_orig in rendered: + rendered = rendered.replace(c_crate_orig, c_crate_c2, 1) + if c_bpre_orig in rendered: + rendered = rendered.replace(c_bpre_orig, c_bpre_c2, 1) + + return rendered + + +def _retire_stub_slots_in_object( + stubs_obj_path: pathlib.Path, + active_lib2_roots: Sequence[str], + env: Mapping[str, str], +) -> list[dict[str, Any]]: + """Retire each active `lib2` root's 4-byte `udf #0` slot in `extern_stubs_clean.o` in-place via + two-pass `llvm-objcopy` (`--rename-section` + `--redefine-sym` first, `--localize-symbol` second) + so `.text.__retired_` (`sh_flags == 0x6`, no `SHF_GNU_RETAIN`) stays at its exact original + section index while becoming `STB_LOCAL` (invisible to global resolution in `ld.lld`).""" + if not active_lib2_roots: + return [] + pre_obj = _ELF_INSPECT.parse_reloc_obj(stubs_obj_path.read_bytes(), stubs_obj_path.name) + sec_by_name = {sec.name: sec for sec in pre_obj.sections} + global_fn_by_name = { + s.name: s + for s in pre_obj.symbols + if s.bind == 1 and s.stype == 2 and 0 < s.st_shndx < len(pre_obj.sections) + } + pass1_args: list[str] = [] + pass2_args: list[str] = [] + retired_records: list[dict[str, Any]] = [] + for idx, root_sym in enumerate(active_lib2_roots): + orig_sec_name = f".text.{root_sym}" + ret_sym = f"__retired_{idx}" + ret_sec = f".text.{ret_sym}" + if orig_sec_name not in sec_by_name or root_sym not in global_fn_by_name: + raise RuntimeError( + f"cannot retire stub `{root_sym}` in {stubs_obj_path.name}: " + f"missing global STT_FUNC / `{orig_sec_name}`" + ) + orig_sec = sec_by_name[orig_sec_name] + if orig_sec.sh_size != 4 or orig_sec.data != b"\x00\x00\x00\x00": + raise RuntimeError( + f"stub section `{orig_sec_name}` expected 4 zero bytes, got size={orig_sec.sh_size}" + ) + pass1_args.extend([ + "--rename-section", + f"{orig_sec_name}={ret_sec}", + "--redefine-sym", + f"{root_sym}={ret_sym}", + ]) + pass2_args.append(f"--localize-symbol={ret_sym}") + retired_records.append({ + "index": idx, + "symbol": root_sym, + "originalSymbol": root_sym, + "retiredSymbol": ret_sym, + "retiredSection": ret_sec, + "size": 4, + "objectSectionIndex": int(orig_sec.idx), + }) + + objcopy_bin = str(env["LLVM_OBJCOPY"]) + tmp_pass1 = stubs_obj_path.with_name(f".{stubs_obj_path.name}.retire1.tmp") + tmp_pass2 = stubs_obj_path.with_name(f".{stubs_obj_path.name}.retire2.tmp") + subprocess.run( + [objcopy_bin, *pass1_args, str(stubs_obj_path), str(tmp_pass1)], + check=True, + env=dict(env), + ) + subprocess.run( + [objcopy_bin, *pass2_args, str(tmp_pass1), str(tmp_pass2)], + check=True, + env=dict(env), + ) + tmp_pass1.unlink(missing_ok=True) + tmp_pass2.replace(stubs_obj_path) + + post_obj = _ELF_INSPECT.parse_reloc_obj(stubs_obj_path.read_bytes(), stubs_obj_path.name) + active_set = set(active_lib2_roots) + leaked = sorted(s.name for s in post_obj.symbols if s.name in active_set) + if leaked: + raise RuntimeError( + f"retired stub symbol(s) remained in {stubs_obj_path.name} after llvm-objcopy: {leaked}" + ) + post_secs = {sec.name: sec for sec in post_obj.sections} + for rec in retired_records: + ret_sym = str(rec["retiredSymbol"]) + ret_sec = str(rec["retiredSection"]) + if ret_sec not in post_secs: + raise RuntimeError(f"missing `{ret_sec}` in {stubs_obj_path.name} after llvm-objcopy") + psec = post_secs[ret_sec] + if psec.sh_flags != 0x6 or psec.sh_size != 4 or psec.data != b"\x00\x00\x00\x00": + raise RuntimeError( + f"retired stub section `{ret_sec}` invalid flags/size/bytes: " + f"flags={psec.sh_flags:#x}, size={psec.sh_size}" + ) + hits = [ + s + for s in post_obj.symbols + if s.name == ret_sym and s.st_shndx == psec.idx and s.stype == 2 + ] + if len(hits) != 1 or hits[0].bind != 0 or hits[0].st_size != 4: + raise RuntimeError( + f"retired stub `{ret_sym}` must be unique STB_LOCAL STT_FUNC size 4, got {hits}" + ) + return retired_records + + +def _verify_dehooked_placed_symbols( + *, + img: Any, + sections: Sequence[Any], + raw_syms: Sequence[Any], + dehooked_syms: Sequence[str], + allowed_sec_names: frozenset[str], + label: str, +) -> None: + """D-C2d positive verifier: every `sym` in `cliDehookedSymsPlaced` resolves to a unique defined + `STT_FUNC` in `.symtab` inside `allowed_sec_names` with RX non-`0x00000000` instruction bytes.""" + if not dehooked_syms: + return + fn_by_name: dict[str, list[Any]] = {} + for s in raw_syms[1:]: + if s.st_shndx != 0 and s.stype == 2 and s.name: + fn_by_name.setdefault(s.name, []).append(s) + for sym in dehooked_syms: + hits = fn_by_name.get(str(sym), []) + if len(hits) != 1: + raise RuntimeError( + f"{label}: de-hooked symbol `{sym}` (`cliDehookedSymsPlaced`) expected 1 defined " + f"STT_FUNC in .symtab, found {len(hits)}" + ) + dsym = hits[0] + if dsym.st_shndx <= 0 or dsym.st_shndx >= len(sections): + raise RuntimeError( + f"{label}: de-hooked symbol `{sym}` has invalid shndx={dsym.st_shndx}" + ) + sec_nm = str(sections[dsym.st_shndx].name) + if sec_nm not in allowed_sec_names: + raise RuntimeError( + f"{label}: de-hooked symbol `{sym}` at {dsym.st_value:#x} sits in disallowed " + f"section `{sec_nm}` (allowed={sorted(allowed_sec_names)})" + ) + if dsym.st_size < 4: + raise RuntimeError( + f"{label}: de-hooked symbol `{sym}` at {dsym.st_value:#x} has st_size={dsym.st_size} < 4" + ) + got = img.read_bytes(dsym.st_value, 4) + if got is None or got[1] != elf_loader.PERM_RX: + raise RuntimeError( + f"{label}: de-hooked symbol `{sym}` at {dsym.st_value:#x} is not mapped in RX segment" + ) + if got[0] == b"\x00\x00\x00\x00": + raise RuntimeError( + f"{label}: de-hooked symbol `{sym}` at {dsym.st_value:#x} resolved to `udf #0` (`00000000`)" + ) + + +def _verify_c2_mechanical_invariants( + *, + elf_bytes: bytes, + norm_map_text: str, + active_lib2_roots: Sequence[str], + moved_libc_rows: Sequence[str], + retired_slots: Sequence[Mapping[str, Any]], +) -> None: + """Enforce C2 mechanical invariants (`F9`, `0` thunks/veneers, `0` RW bytes from `lib2_*.o`, + `retired_stub_slots` `.text.crate` `sh_flags == 0x6`, `SystemTime::add` tail placement in + `.text.lib2` and `.rodata.lib2`, and `D-C2f = 2C` `libc` string-block placement `< e_entry`).""" + if not active_lib2_roots and not moved_libc_rows: + return + img, _phdrs, sections, raw_syms = elf_loader.parse_raw_elf(elf_bytes, require_symtab=True) + entry = int(img.entry) + if (entry & 0xFFF) != 0: + raise RuntimeError(f"C2 invariant: e_entry {entry:#x} is not 0x1000-aligned") + sec_by_name = {s.name: s for s in sections if s.name} + + # (F9): `.text` starts at `entry`, `.text.crate` has `sh_flags == 0x6` (no `SHF_GNU_RETAIN`), + # `.text.lib2` sits strictly after `.text` (`>= .text` end) and `<= :data` start. + text_sec = sec_by_name.get(".text") + text_crate_sec = sec_by_name.get(".text.crate") + text_b_pre_sec = sec_by_name.get(".text.b_pre") + if text_sec is None or text_crate_sec is None or text_b_pre_sec is None: + raise RuntimeError("C2 invariant (F9): missing `.text`, `.text.crate`, or `.text.b_pre`") + if text_sec.sh_addr != entry: + raise RuntimeError( + f"C2 invariant (F9): `.text` sh_addr {text_sec.sh_addr:#x} != e_entry {entry:#x}" + ) + if text_crate_sec.sh_flags != 0x6: + raise RuntimeError( + f"C2 invariant: `.text.crate` sh_flags {text_crate_sec.sh_flags:#x} != 0x6 " + "(unexpected SHF_GNU_RETAIN or writable bit)" + ) + + # (thunks): 0 range-extension thunks or veneers in `link.map` or `.symtab`. + bad_thunk_lines = [ + ln.strip() + for ln in norm_map_text.splitlines() + if any(pat in ln for pat in ("Thunk", "veneer", "__AArch64")) + ] + if bad_thunk_lines: + raise RuntimeError(f"C2 invariant (thunks): unexpected thunk/veneer in link.map: {bad_thunk_lines[:5]}") + bad_thunk_syms = [ + s.name + for s in raw_syms[1:] + if s.name and any(pat in s.name for pat in ("Thunk", "veneer", "__AArch64")) + ] + if bad_thunk_syms: + raise RuntimeError(f"C2 invariant (thunks): unexpected thunk symbol(s) in .symtab: {bad_thunk_syms}") + + # Parse `link.map` output sections -> input sections for `(RW)` and `SystemTime::add` RO tail checks. + rw_out_secs = { + ".tdata", + ".tbss", + ".data.crate", + ".init_array", + ".fini_array", + ".data", + ".got", + ".bss.musl", + ".bss", + } + cur_out_sec = "" + lib2_rw_hits: list[str] = [] + rodata_lib2_inputs: list[tuple[int, int, str]] = [] + for ml in norm_map_text.splitlines()[1:]: + if len(ml) < 49: + continue + hdr_toks = ml[:49].split() + if len(hdr_toks) != 4: + continue + rest = ml[49:] + indent = len(rest) - len(rest.lstrip(" ")) + item = rest.strip() + if indent == 0: + cur_out_sec = item + elif indent == 8: + vma = int(hdr_toks[0], 16) + sz = int(hdr_toks[2], 16) + if "lib2_" in item and cur_out_sec in rw_out_secs and sz > 0: + lib2_rw_hits.append(f"{cur_out_sec}: {item} ({sz} B)") + if cur_out_sec == ".rodata.lib2" and sz > 0: + rodata_lib2_inputs.append((vma, sz, item)) + if lib2_rw_hits: + raise RuntimeError(f"C2 invariant (RW): `lib2_*.o` contributed writable `:data` bytes: {lib2_rw_hits}") + + fn_by_name: dict[str, list[Any]] = {} + for s in raw_syms[1:]: + if s.st_shndx != 0 and s.stype == 2 and s.name: + fn_by_name.setdefault(s.name, []).append(s) + + if active_lib2_roots: + text_lib2 = sec_by_name.get(".text.lib2") + if text_lib2 is None or text_lib2.sh_size == 0: + raise RuntimeError("C2 invariant: active `lib2` rows produced missing/empty `.text.lib2`") + if text_lib2.sh_addr < text_sec.sh_addr + text_sec.sh_size: + raise RuntimeError( + f"C2 invariant (F9): `.text.lib2` ({text_lib2.sh_addr:#x}) precedes `.text` end " + f"({text_sec.sh_addr + text_sec.sh_size:#x})" + ) + rw_starts = [ + sec_by_name[nm].sh_addr + for nm in rw_out_secs + if nm in sec_by_name and sec_by_name[nm].sh_addr > 0 + ] + if rw_starts and text_lib2.sh_addr + text_lib2.sh_size > min(rw_starts): + raise RuntimeError( + f"C2 invariant (F9): `.text.lib2` end {text_lib2.sh_addr + text_lib2.sh_size:#x} " + f"overruns `:data` start {min(rw_starts):#x}" + ) + if len(retired_slots) != len(active_lib2_roots): + raise RuntimeError( + f"C2 invariant: retired_slots count {len(retired_slots)} != active_lib2_roots {len(active_lib2_roots)}" + ) + for root_sym in active_lib2_roots: + rhits = fn_by_name.get(root_sym, []) + if len(rhits) != 1 or sections[rhits[0].st_shndx].name != ".text.lib2": + raise RuntimeError( + f"C2 invariant: active `lib2` root `{root_sym}` not uniquely in `.text.lib2`: {rhits}" + ) + + # Verify `SystemTime::add` sits strictly LAST in `.text.lib2` and `.rodata.lib2` when enabled. + if C2_LIB2_TIME_ADD_SYM in active_lib2_roots: + if active_lib2_roots[-1] != C2_LIB2_TIME_ADD_SYM: + raise RuntimeError("C2 invariant: `SystemTime::add` must be the final active `lib2` root") + add_sym = fn_by_name[C2_LIB2_TIME_ADD_SYM][0] + if add_sym.st_value + add_sym.st_size != text_lib2.sh_addr + text_lib2.sh_size: + raise RuntimeError( + f"C2 invariant: `SystemTime::add` ({add_sym.st_value:#x}..{add_sym.st_value + add_sym.st_size:#x}) " + f"is not strictly LAST in `.text.lib2` (end={text_lib2.sh_addr + text_lib2.sh_size:#x})" + ) + ro_lib2 = sec_by_name.get(".rodata.lib2") + if ro_lib2 is None or not rodata_lib2_inputs: + raise RuntimeError("C2 invariant: missing `.rodata.lib2` inputs when `SystemTime::add` is active") + last_ro_vma, last_ro_sz, last_ro_item = rodata_lib2_inputs[-1] + last_lib2_idx = len({ + it.split(":(", 1)[0] + for _, _, it in rodata_lib2_inputs + if "lib2_" in it + }) + _ = last_lib2_idx + if last_ro_vma + last_ro_sz != ro_lib2.sh_addr + ro_lib2.sh_size: + raise RuntimeError( + f"C2 invariant: last `.rodata.lib2` input `{last_ro_item}` " + f"({last_ro_vma:#x}+{last_ro_sz:#x}) != `.rodata.lib2` end {ro_lib2.sh_addr + ro_lib2.sh_size:#x}" + ) + # `SystemTime::add` is always extracted into the highest-numbered `lib2_.o`. + lib2_ro_objs = sorted( + { + int(m.group(1)) + for _, _, it in rodata_lib2_inputs + for m in [re.search(r"lib2_(\d+)\.o:", it)] + if m is not None + } + ) + if not lib2_ro_objs or f"lib2_{max(lib2_ro_objs)}.o:" not in last_ro_item: + raise RuntimeError( + f"C2 invariant: `SystemTime::add` RO is not strictly LAST in `.rodata.lib2` (last={last_ro_item!r})" + ) + + # Verify `D-C2f = 2C` libc string-block placement (`< e_entry` in `.text.b_pre` for moved rows, + # `.text.crate` for held-back rows, canonical order `memmove -> memcmp -> bcmp -> strlen`, + # and preserved 56-byte `memcmp + bcmp` hull). + moved_set = set(moved_libc_rows) + prev_moved_end: int | None = None + for lrow in C2_LIBC_CANONICAL_ORDER: + lhits = fn_by_name.get(lrow, []) + if len(lhits) != 1: + raise RuntimeError(f"C2 `2C` invariant: expected 1 STT_FUNC `{lrow}`, found {len(lhits)}") + lsym = lhits[0] + lsec = sections[lsym.st_shndx].name + exp_sec = ".text.b_pre" if lrow in moved_set else ".text.crate" + if lsec != exp_sec: + raise RuntimeError( + f"C2 `2C` invariant: `{lrow}` sits in `{lsec}`, expected `{exp_sec}`" + ) + if not (lsym.st_value + max(4, lsym.st_size) <= entry): + raise RuntimeError( + f"C2 `2C` invariant: `{lrow}` ({lsym.st_value:#x}+{lsym.st_size:#x}) is not `< e_entry` ({entry:#x})" + ) + if lrow in moved_set: + if prev_moved_end is not None and lsym.st_value < prev_moved_end: + raise RuntimeError( + f"C2 `2C` invariant: `{lrow}` at {lsym.st_value:#x} out of order (prev end {prev_moved_end:#x})" + ) + prev_moved_end = lsym.st_value + lsym.st_size + if "memcmp" in moved_set and "bcmp" in moved_set: + mc_sym = fn_by_name["memcmp"][0] + bc_sym = fn_by_name["bcmp"][0] + if bc_sym.st_value != mc_sym.st_value + mc_sym.st_size or (mc_sym.st_size + bc_sym.st_size) != 56: + raise RuntimeError( + f"C2 `2C` invariant: 56-byte `memcmp + bcmp` hull broken: " + f"memcmp={mc_sym.st_value:#x}+{mc_sym.st_size}, bcmp={bc_sym.st_value:#x}+{bc_sym.st_size}" + ) + DEFAULT_STOCK_META_NAME: str = "cv-stock-link.json" DEFAULT_STDBIN_META_NAME: str = "cv-stock-stdbin-link.json" DEFAULT_STDBIN_5D_NAME: str = "cv-stock-stdbin-5d.json" @@ -1431,12 +2371,14 @@ def _resolve_and_verify_stdbin_linker_script( - Authority for `pinned` is SOLELY `lock` (`--stock-lock`, e.g. `cli-elf/inputs.lock` in CI — zero dependency on legacy `inputs_stock.lock` and zero hardcoded sha256): `linker_script_path` MUST equal `DEFAULT_REL_STOCK_LD` - (`third_party/libsignal/libsignal-session/cli-elf/stock.ld`), its on-disk SHA-256 MUST equal + (`third_party/libsignal/libsignal-session/cli-elf/stock.ld`) or `DEFAULT_REL_STOCK_C2_LD` + (`third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld`, verified against + `_render_c2_stock_ld` when `c2_moved_libc_rows = "all"`), its on-disk SHA-256 MUST equal `lock["linker_script_sha256"]`, and post-link `stock-link.json` `lld.argFiles` MUST record `len == 1` with `(path == linker_script_path, sha256 == lock["linker_script_sha256"])`. - Under `--ci` (`ci_mode=True`), ONLY `pinned` is permitted (`none` and `scratch` fail closed). - `scratch`: non-`--ci` rehearsal mode; `linker_script_path` MUST be a clean repo-relative path - distinct from `DEFAULT_REL_STOCK_LD`, its on-disk SHA-256 MUST equal `lock["linker_script_sha256"]`, + distinct from `DEFAULT_REL_STOCK_LD` and `DEFAULT_REL_STOCK_C2_LD`, its on-disk SHA-256 MUST equal `lock["linker_script_sha256"]`, post-link `stock-link.json` `lld.argFiles` MUST match, AND on-disk `stock.ld` itself MUST be byte-unchanged (verified against git `HEAD:.../stock.ld` + staged index when `.git` exists, and/or `lock["pinned_stock_ld_sha256"]`). @@ -1462,7 +2404,7 @@ def _resolve_and_verify_stdbin_linker_script( if ci_mode and mode != "pinned": raise RuntimeError( f"{lock_label}: CI mode (`--ci`) requires StdBin `stock_ld_mode = 'pinned'` " - f"(`-T {DEFAULT_REL_STOCK_LD}`), got {mode!r}" + f"(`-T {DEFAULT_REL_STOCK_LD}` or `-T {DEFAULT_REL_STOCK_C2_LD}`), got {mode!r}" ) if mode == "none": @@ -1490,14 +2432,15 @@ def _resolve_and_verify_stdbin_linker_script( ) pinned_rel = str(DEFAULT_REL_STOCK_LD) - if mode == "pinned" and raw_rel != pinned_rel: + allowed_pinned_rels = {pinned_rel, str(DEFAULT_REL_STOCK_C2_LD)} + if mode == "pinned" and raw_rel not in allowed_pinned_rels: raise RuntimeError( - f"{lock_label}: `stock_ld_mode = 'pinned'` requires `linker_script_path == {pinned_rel!r}`, " - f"got {raw_rel!r}" + f"{lock_label}: `stock_ld_mode = 'pinned'` requires `linker_script_path == {pinned_rel!r}` " + f"(or `{DEFAULT_REL_STOCK_C2_LD}`), got {raw_rel!r}" ) - if mode == "scratch" and raw_rel == pinned_rel: + if mode == "scratch" and raw_rel in allowed_pinned_rels: raise RuntimeError( - f"{lock_label}: `stock_ld_mode = 'scratch'` forbids pointing at pinned `{pinned_rel}` " + f"{lock_label}: `stock_ld_mode = 'scratch'` forbids pointing at pinned `{raw_rel}` " f"(must use a distinct scratch linker script)" ) @@ -1764,6 +2707,8 @@ def verify_stock_elf( *, repo_root: pathlib.Path | None = None, expected_externs: Sequence[str] | None = None, + dehooked_syms: Sequence[str] | None = None, + retired_stub_slots: Sequence[Mapping[str, Any]] = (), expected_symtab_count: int | None = None, expected_loader_sym_count: int | None = None, expected_stub_manifest_count: int | None = None, @@ -1880,6 +2825,11 @@ def verify_stock_elf( # F7: Verify every GC-retained manifest entry in `.symtab` has matching type, size, AND # all-zero loaded bytes (`0x00000000` `udf #0` in RX for `function_udf0`; zero RW/TLS bytes for objects). + retired_by_orig = { + str(r["originalSymbol"]): dict(r) + for r in retired_stub_slots + if isinstance(r, Mapping) and r.get("originalSymbol") + } defined_by_name: dict[str, list[elf_loader.RawElfSym]] = {} for s in raw_syms[1:]: if s.st_shndx != 0 and s.name: @@ -1894,6 +2844,32 @@ def verify_stock_elf( exp_t = expected_stype.get(skind) if exp_t is None: raise RuntimeError(f"unknown stub manifest kind `{skind}` for `{sname}`") + if sname in retired_by_orig: + if skind != "function_udf0" or ssize != 4: + raise RuntimeError(f"retired stub `{sname}` must be 4-byte function_udf0, got ({skind}, {ssize})") + ret_sym_nm = str(retired_by_orig[sname]["retiredSymbol"]) + rcands = [ + c + for c in defined_by_name.get(ret_sym_nm, []) + if c.bind == 0 and c.stype == 2 and c.st_size == 4 + ] + if len(rcands) != 1: + raise RuntimeError( + f"retired stub slot `{ret_sym_nm}` (from `{sname}`) expected 1 STB_LOCAL STT_FUNC size 4, found {rcands}" + ) + rc = rcands[0] + if not (rc.st_value < entry): + raise RuntimeError( + f"retired stub slot `{ret_sym_nm}` at {rc.st_value:#x} >= e_entry {entry:#x}" + ) + rgot = img.read_bytes(rc.st_value, 4) + if rgot is None or rgot[1] != elf_loader.PERM_RX or rgot[0] != b"\x00\x00\x00\x00": + raise RuntimeError( + f"retired stub slot `{ret_sym_nm}` at {rc.st_value:#x} not RX zero-word `udf #0`" + ) + retained_stubs += 1 + retained_func_stubs.add(sname) + continue cands = defined_by_name.get(sname, []) if not cands: continue # Dead stub eliminated by `ld.lld --gc-sections` @@ -1997,9 +2973,20 @@ def verify_stock_elf( f"stock ELF has non-bcmp callers/refs to unhooked `memcmp`: {[hex(pc) for pc in non_bcmp_memcmp_callers]}" ) - # F2: Exact `libsignalSessionExterns` `hstubLt` check (NO heuristic prefix scans!): - # 1. Every `ext_name` in `lean_externs` must be defined as `STT_FUNC` with `st_value < entry`. + # F2 & D-C2d: Exact `libsignalSessionExterns` `hstubLt` check (NO heuristic prefix scans!): + # 1. Every hooked `ext_name` in `lean_externs \ cliDehookedSymsPlaced` must be defined as + # `STT_FUNC` with `st_value < entry`; de-hooked symbols in `cliDehookedSymsPlaced` are + # positively verified as unique defined RX `STT_FUNC`s with non-`udf #0` code bytes. # 2. Every retained `function_udf0` stub must belong to `lean_externs` and satisfy `st_value < entry`. + eff_dehooked: tuple[str, ...] + if dehooked_syms is not None: + eff_dehooked = tuple(str(x) for x in dehooked_syms) + elif repo_root is not None and (repo_root / DEFAULT_REL_CLI_BINARY_PQ).is_file(): + eff_dehooked = tuple(load_cli_binary_pq_tables(repo_root)["cliDehookedSymsPlaced"]) + else: + eff_dehooked = () + dehooked_set = set(eff_dehooked) + lean_externs_set = set(lean_externs) extra_retained_fn_stubs = sorted(retained_func_stubs - lean_externs_set) if extra_retained_fn_stubs: @@ -2012,11 +2999,21 @@ def verify_stock_elf( raise RuntimeError( f"stock ELF `hstubLt` check failed: Lean extern `{ext_name}` missing as STT_FUNC in .symtab" ) + if ext_name in dehooked_set: + continue for s in fn_hits: if not (s.st_value < entry): raise RuntimeError( f"stock ELF `hstubLt` violated: `{ext_name}` at {s.st_value:#x} >= e_entry {entry:#x}" ) + _verify_dehooked_placed_symbols( + img=img, + sections=sections, + raw_syms=raw_syms, + dehooked_syms=eff_dehooked, + allowed_sec_names=frozenset({".text.crate", ".text.b_pre", ".text.lib2", ".text"}), + label="stock ELF", + ) # F9: Assert proof layout constants (`muslRwStart = entry + 0x2000`, `.got` at `+0x2008`, # `.bss.musl` at `+0x2040`, `0x5e8` musl `.text` window, and `main` before `entry`). @@ -2295,6 +3292,7 @@ def evaluate_stdbin_5d( parsed: Mapping[str, Any], lean_externs: Sequence[str], *, + dehooked_syms: Sequence[str] = (), elf_name: str = "signal-session-stock-stdbin.elf", elf_size: int = 0, elf_sha256: str = "", @@ -2380,6 +3378,7 @@ def evaluate_stdbin_5d( all_aarch64_outline.append(nm) lean_externs_set = set(str(x) for x in lean_externs) + dehooked_set = set(str(x) for x in dehooked_syms) check_names_ordered: list[str] = [] for nm in [*lean_externs, *STDBIN_EXPLICIT_5D_EXTERNS, *sorted(all_aarch64_outline)]: s_nm = str(nm) @@ -2411,7 +3410,7 @@ def evaluate_stdbin_5d( non_rx_externs.append( {"name": nm, "addr": hex(val), "type": d.get("type_name")} ) - if val >= entry: + if nm not in dehooked_set and val >= entry: externs_ge_entry.append( { "name": nm, @@ -2431,6 +3430,20 @@ def evaluate_stdbin_5d( "all_in_rx": all(_in_rx(int(d["st_value"])) for d in all_defs), } + for d_nm in dehooked_syms: + s_dnm = str(d_nm) + d_fn_defs = [ + s for s in defined_by_name.get(s_dnm, []) if s.get("type_name") == "FUNC" + ] + if len(d_fn_defs) != 1: + failures.append( + f"de-hooked symbol `{s_dnm}` (`cliDehookedSymsPlaced`) expected 1 defined STT_FUNC in .symtab, found {len(d_fn_defs)}" + ) + elif not _in_rx(int(d_fn_defs[0]["st_value"])): + failures.append( + f"de-hooked symbol `{s_dnm}` at {int(d_fn_defs[0]['st_value']):#x} is not in RX PT_LOAD" + ) + if externs_ge_entry: failures.append( f"{len(externs_ge_entry)} extern symbol definition(s) >= e_entry ({entry:#x}): " @@ -2501,6 +3514,7 @@ def verify_stdbin_5d( *, elf_path: pathlib.Path, lean_externs: Sequence[str], + dehooked_syms: Sequence[str] = (), json_out_path: pathlib.Path | None = None, verbose: bool = True, ) -> dict[str, Any]: @@ -2541,6 +3555,7 @@ def verify_stdbin_5d( rep = evaluate_stdbin_5d( re_parsed, lean_externs, + dehooked_syms=dehooked_syms, elf_name=elf_path.name, elf_size=len(elf_bytes), elf_sha256=elf_sha, @@ -2549,6 +3564,7 @@ def verify_stdbin_5d( raw_rep = evaluate_stdbin_5d( raw_parsed, lean_externs, + dehooked_syms=dehooked_syms, elf_name=elf_path.name, elf_size=len(elf_bytes), elf_sha256=elf_sha, @@ -2602,6 +3618,9 @@ def verify_stock_stdbin_elf( sibling_cfg_paths: Sequence[pathlib.Path] = (), repo_root: pathlib.Path | None = None, expected_externs: Sequence[str] | None = None, + dehooked_syms: Sequence[str] | None = None, + retired_stub_slots: Sequence[Mapping[str, Any]] = (), + active_lib2_roots: Sequence[str] | None = None, expected_phnum: int = EXPECTED_STDBIN_PHNUM, expected_pt_loads: int = EXPECTED_STDBIN_PT_LOADS, expected_symtab_count: int = EXPECTED_STDBIN_SYMTAB_COUNT, @@ -2708,9 +3727,14 @@ def verify_stock_stdbin_elf( if not sib_cfg_p.is_file(): raise RuntimeError(f"sibling translation.toml missing at {sib_cfg_p}") sib_cfg = tomllib.loads(sib_cfg_p.read_text(encoding="utf-8")) - sib_exps = [str(x) for x in sib_cfg.get("placed", {}).get("exports", [])] - if not sib_exps: - raise RuntimeError(f"sibling config {sib_cfg_p} has empty `[placed].exports`") + if isinstance(sib_cfg.get("lib2_rows"), Mapping) and active_lib2_roots is not None: + sib_exps = list(active_lib2_roots) + if not sib_exps: + continue + else: + sib_exps = [str(x) for x in sib_cfg.get("placed", {}).get("exports", [])] + if not sib_exps: + raise RuntimeError(f"sibling config {sib_cfg_p} has empty `[placed].exports`") for sexp in sib_exps: sib_hits = defined_funcs_by_demangled.get(sexp, []) if len(sib_hits) != 1: @@ -2782,6 +3806,11 @@ def verify_stock_stdbin_elf( f"`{STUB_MANIFEST_SECTION}` payload {sec_sha_ascii!r} != stub_manifest sha256 {manifest_sha!r}" ) + retired_by_orig = { + str(r["originalSymbol"]): dict(r) + for r in retired_stub_slots + if isinstance(r, Mapping) and r.get("originalSymbol") + } defined_by_name: dict[str, list[elf_loader.RawElfSym]] = {} for s in raw_syms[1:]: if s.st_shndx != 0 and s.name: @@ -2796,6 +3825,32 @@ def verify_stock_stdbin_elf( exp_t = expected_stype.get(skind) if exp_t is None: raise RuntimeError(f"unknown stub manifest kind `{skind}` for `{sname}`") + if sname in retired_by_orig: + if skind != "function_udf0" or ssize != 4: + raise RuntimeError(f"retired stub `{sname}` must be 4-byte function_udf0, got ({skind}, {ssize})") + ret_sym_nm = str(retired_by_orig[sname]["retiredSymbol"]) + rcands = [ + c + for c in defined_by_name.get(ret_sym_nm, []) + if c.bind == 0 and c.stype == 2 and c.st_size == 4 + ] + if len(rcands) != 1: + raise RuntimeError( + f"retired stub slot `{ret_sym_nm}` (from `{sname}`) expected 1 STB_LOCAL STT_FUNC size 4, found {rcands}" + ) + rc = rcands[0] + if not (rc.st_value < entry): + raise RuntimeError( + f"retired stub slot `{ret_sym_nm}` at {rc.st_value:#x} >= e_entry {entry:#x}" + ) + rgot = img.read_bytes(rc.st_value, 4) + if rgot is None or rgot[1] != elf_loader.PERM_RX or rgot[0] != b"\x00\x00\x00\x00": + raise RuntimeError( + f"retired stub slot `{ret_sym_nm}` at {rc.st_value:#x} not RX zero-word `udf #0`" + ) + retained_stubs += 1 + retained_func_stubs.add(sname) + continue cands = defined_by_name.get(sname, []) if not cands: continue @@ -2919,6 +3974,22 @@ def verify_stock_stdbin_elf( f"stock StdBin ELF extern `{ext_name}` at {s.st_value:#x} is not mapped in RX segment" ) + eff_dehooked: tuple[str, ...] + if dehooked_syms is not None: + eff_dehooked = tuple(str(x) for x in dehooked_syms) + elif repo_root is not None and (repo_root / DEFAULT_REL_CLI_BINARY_PQ).is_file(): + eff_dehooked = tuple(load_cli_binary_pq_tables(repo_root)["cliDehookedSymsPlaced"]) + else: + eff_dehooked = () + _verify_dehooked_placed_symbols( + img=img, + sections=sections, + raw_syms=raw_syms, + dehooked_syms=eff_dehooked, + allowed_sec_names=frozenset({".text.crate", ".text.b_pre", ".text.lib2"}), + label="stock StdBin ELF", + ) + main_addr = export_addrs["main"] five_d_extra: dict[str, Any] = {} if enforce_5d: @@ -2930,6 +4001,7 @@ def verify_stock_stdbin_elf( five_d_rep = verify_stdbin_5d( elf_path=elf_path, lean_externs=lean_externs, + dehooked_syms=eff_dehooked, json_out_path=eff_5d_json, verbose=verbose, ) @@ -3787,10 +4859,26 @@ def verify_stock_pin( raise RuntimeError( f"{stock_lock_path} StdBin lock requires `config_paths` with >=2 entries starting with `config_path`" ) + lib2_cfg_doc: Mapping[str, Any] | None = None + if repo_root is not None and (repo_root / DEFAULT_REL_LIB2_CONFIG).is_file(): + lib2_cfg_doc = tomllib.loads( + (repo_root / DEFAULT_REL_LIB2_CONFIG).read_text(encoding="utf-8") + ) + active_lib2_names_pin, active_lib2_roots_pin, moved_libc_rows_pin = _resolve_c2_row_selection( + lib2_cfg=lib2_cfg_doc, + lock=stock_lock, + ) sib_cfgs = [ (repo_root / p) if repo_root is not None else pathlib.Path(p) for p in cfg_paths_rel[1:] ] + if ( + active_lib2_names_pin + and repo_root is not None + and str(DEFAULT_REL_LIB2_CONFIG) not in cfg_paths_rel + ): + sib_cfgs.append(repo_root / DEFAULT_REL_LIB2_CONFIG) + pin_retired_slots = tuple(eng_sl.get("retiredStubSlots") or ()) verify_res = verify_stock_stdbin_elf( elf_path, eff_cfg, @@ -3798,6 +4886,8 @@ def verify_stock_pin( sibling_cfg_paths=sib_cfgs, repo_root=repo_root, expected_externs=expected_externs, + active_lib2_roots=active_lib2_roots_pin if active_lib2_names_pin else None, + retired_stub_slots=pin_retired_slots, expected_phnum=int(stock_lock.get("expected_phnum", EXPECTED_STDBIN_PHNUM)), expected_pt_loads=int(stock_lock.get("expected_pt_loads", EXPECTED_STDBIN_PT_LOADS)), expected_symtab_count=int(stock_lock["expected_symtab_count"]), @@ -3815,6 +4905,15 @@ def verify_stock_pin( five_d_json_path=meta_path.parent / DEFAULT_STDBIN_5D_NAME, verbose=verbose, ) + if active_lib2_roots_pin or moved_libc_rows_pin: + eff_pin_map = map_path if map_path is not None else (elf_path.parent / DEFAULT_LINK_MAP_NAME) + _verify_c2_mechanical_invariants( + elf_bytes=elf_path.read_bytes(), + norm_map_text=eff_pin_map.read_text(encoding="utf-8"), + active_lib2_roots=active_lib2_roots_pin, + moved_libc_rows=moved_libc_rows_pin, + retired_slots=pin_retired_slots, + ) if _has_alpha_lock_sections(stock_lock): alpha_res = _verify_alpha_from_meta_and_lock( elf_path=elf_path, @@ -3845,12 +4944,21 @@ def build_stock_stdbin_into( keep_work_dir: pathlib.Path | None = None, ci_mode: bool = False, unpinned: bool = False, + lib2_rows_spec: str | None = None, + c2_libc_rows_spec: str | None = None, + c2_rehearsal_dehook: bool = False, ) -> pathlib.Path: """5a-i: Reproducible 2-config IO.6b `StdBin` builder (`main.rs` + `signal-session-io` + `rustc 1.98.1` `self-contained/{crt*.o,libc.a}` with real `mallocng` + `rdl_shim.S` + - `extern_stubs_clean.o`).""" + `extern_stubs_clean.o`, plus optional C2 `lib2` sibling + `2C` `libc` string-block move).""" if unpinned and ci_mode: raise RuntimeError("`--unpinned` is forbidden in CI mode") + if ci_mode and (lib2_rows_spec is not None or c2_libc_rows_spec is not None or c2_rehearsal_dehook): + raise RuntimeError( + "CLI overrides `--lib2-rows`, `--c2-libc-rows`, and `--c2-rehearsal-dehook` are forbidden in CI mode" + ) + if c2_rehearsal_dehook and not unpinned: + raise RuntimeError("`--c2-rehearsal-dehook` requires `--unpinned`") lock = _unwrap_stock_lock_dict(lock) if "native_only" not in lock or not isinstance(lock["native_only"], list): raise RuntimeError(f"{eff_stock_lock} missing mandatory `native_only` list") @@ -3896,6 +5004,64 @@ def build_stock_stdbin_into( fallback_repo_root=fallback_root if unpinned else None, unpinned=unpinned, ) + + lib2_cfg_path: pathlib.Path | None = None + lib2_cfg_doc: dict[str, Any] | None = None + cand_lib2_cfg = repo_root / DEFAULT_REL_LIB2_CONFIG + if not cand_lib2_cfg.is_file() and unpinned and (fallback_root / DEFAULT_REL_LIB2_CONFIG).is_file(): + cand_lib2_cfg = fallback_root / DEFAULT_REL_LIB2_CONFIG + if cand_lib2_cfg.is_file(): + lib2_cfg_path = cand_lib2_cfg.resolve() + lib2_cfg_doc = tomllib.loads(lib2_cfg_path.read_text(encoding="utf-8")) + + active_lib2_names, active_lib2_roots, moved_libc_rows = _resolve_c2_row_selection( + lib2_cfg=lib2_cfg_doc, + lock=lock, + lib2_rows_spec=lib2_rows_spec, + c2_libc_rows_spec=c2_libc_rows_spec, + ) + + base_stock_ld_disk = repo_root / DEFAULT_REL_STOCK_LD + if not base_stock_ld_disk.is_file() and unpinned and (fallback_root / DEFAULT_REL_STOCK_LD).is_file(): + base_stock_ld_disk = fallback_root / DEFAULT_REL_STOCK_LD + c2_stock_ld_disk = repo_root / DEFAULT_REL_STOCK_C2_LD + if not c2_stock_ld_disk.is_file() and unpinned and (fallback_root / DEFAULT_REL_STOCK_C2_LD).is_file(): + c2_stock_ld_disk = fallback_root / DEFAULT_REL_STOCK_C2_LD + + partial_c2_ld_text: str | None = None + if moved_libc_rows: + if not base_stock_ld_disk.is_file(): + raise RuntimeError(f"missing base `stock.ld` at {base_stock_ld_disk} for C2 `2C` switch") + base_ld_text = base_stock_ld_disk.read_text(encoding="utf-8") + full_c2_rendered = _render_c2_stock_ld(base_ld_text, C2_LIBC_CANONICAL_ORDER) + if c2_stock_ld_disk.is_file(): + disk_c2_text = c2_stock_ld_disk.read_text(encoding="utf-8") + if disk_c2_text != full_c2_rendered: + raise RuntimeError( + f"on-disk `{c2_stock_ld_disk}` drifted from `_render_c2_stock_ld(stock.ld, all)`" + ) + if moved_libc_rows == C2_LIBC_CANONICAL_ORDER: + if not c2_stock_ld_disk.is_file(): + raise RuntimeError(f"missing C2 linker script `{c2_stock_ld_disk}`") + c2_rel_str = str(DEFAULT_REL_STOCK_C2_LD) + c2_sha_str = _BASE.sha256_file(c2_stock_ld_disk) + if not unpinned and ld_rel != c2_rel_str: + raise RuntimeError( + f"pinned build with `c2_moved_libc_rows = all` requires lock " + f"`linker_script_path = {c2_rel_str!r}`, got {ld_rel!r}" + ) + ld_mode = "pinned" + ld_rel = c2_rel_str + ld_abs = c2_stock_ld_disk.resolve() + ld_sha = c2_sha_str + ld_arg_files = {c2_rel_str: c2_sha_str} + else: + if not unpinned and ld_mode != "scratch": + raise RuntimeError( + "partial C2 `c2_moved_libc_rows` subset requires `--unpinned` or `stock_ld_mode = 'scratch'`" + ) + partial_c2_ld_text = _render_c2_stock_ld(base_ld_text, moved_libc_rows) + pre_link_pinned_ld_sha: str | None = None if ld_mode == "scratch" and (repo_root / DEFAULT_REL_STOCK_LD).is_file(): pre_link_pinned_ld_sha = _BASE.sha256_file(repo_root / DEFAULT_REL_STOCK_LD) @@ -4000,6 +5166,14 @@ def build_stock_stdbin_into( pinned_musl_ref_bodies, _ = _load_pinned_musl_refs_from_rustc(lock=lock, env=env) stage_raw = work_root / "stock_stage" stage_raw.mkdir(parents=True, exist_ok=True) + if partial_c2_ld_text is not None: + partial_ld_abs = (stage_raw / "stock_c2_partial.ld").resolve() + partial_ld_abs.write_text(partial_c2_ld_text, encoding="utf-8") + ld_mode = "scratch" + ld_rel = "stock_c2_partial.ld" + ld_abs = partial_ld_abs + ld_sha = _BASE.sha256_file(partial_ld_abs) + ld_arg_files = {ld_rel: ld_sha} if not unpinned: assert isinstance(lock_stub_manifest, list) stubs_o, manifest_sha = _assemble_stub_manifest_object( @@ -4025,6 +5199,11 @@ def build_stock_stdbin_into( placed_exports=placed_exports, eng_head=eng_head, env=env, + lib2_cfg_rel=str(DEFAULT_REL_LIB2_CONFIG) if active_lib2_names else None, + lib2_cfg_abs=lib2_cfg_path if active_lib2_names else None, + active_lib2_names=active_lib2_names, + active_lib2_roots=active_lib2_roots, + moved_libc_rows=moved_libc_rows, ) else: stage_res = _stage_and_link_stdbin_direct( @@ -4046,13 +5225,17 @@ def build_stock_stdbin_into( dynamic_stubs_dir=work_root / "stubs", initial_lean_externs=lean_externs or None, displaced_weak=lock_displaced_weak, + lib2_cfg_rel=str(DEFAULT_REL_LIB2_CONFIG) if active_lib2_names else None, + lib2_cfg_abs=lib2_cfg_path if active_lib2_names else None, + active_lib2_names=active_lib2_names, + active_lib2_roots=active_lib2_roots, + moved_libc_rows=moved_libc_rows, ) stubs_o = stage_res.get("stubs_o") or (work_root / "stubs" / STUB_OBJ_NAME) manifest_sha = str(stage_res["manifest_sha"]) lean_externs = list(stage_res["lean_externs"] or ()) exp_manifest_count = len(stage_res["stub_manifest"] or ()) - if generated_extern_data is None: - generated_extern_data = list(stage_res["extern_data"] or ()) + raw_unpinned_ext_data: list[str] = list(stage_res["extern_data"] or ()) if b2_derived is None: b2_derived = { "blocks": 0, @@ -4114,14 +5297,20 @@ def build_stock_stdbin_into( raw_work = stage_raw / "work" cli_link_objs: list[pathlib.Path] = [] + lib2_link_objs: list[pathlib.Path] = [] for cfg_ent in eng_sl.get("configs") or (): + is_lib2_cfg = str(cfg_ent.get("role") or "") == "lib2" for obj_ent in cfg_ent.get("objects") or (): p_obj = stage_raw / str(obj_ent["path"]) if not p_obj.is_file(): raise RuntimeError(f"missing staged cliLinkObj {p_obj}") - cli_link_objs.append(p_obj) + if is_lib2_cfg: + lib2_link_objs.append(p_obj) + else: + cli_link_objs.append(p_obj) if not cli_link_objs: raise RuntimeError(f"{engine_sl_src} recorded 0 `configs[*].objects[*]` entries") + retired_slots = list(eng_sl.get("retiredStubSlots") or ()) sc_dir = raw_work / "self-contained" sc_objs = [ @@ -4204,6 +5393,61 @@ def build_stock_stdbin_into( built_map.write_text(norm_map_text, encoding="utf-8") link_map_sha = _BASE.sha256_file(built_map) + pq_tables: dict[str, list[str]] | None = None + if (repo_root / DEFAULT_REL_CLI_BINARY_PQ).is_file() or ( + unpinned and (fallback_root / DEFAULT_REL_CLI_BINARY_PQ).is_file() + ): + pq_tables = load_cli_binary_pq_tables( + repo_root, fallback_repo_root=fallback_root if unpinned else None + ) + + eff_dehooked_syms: tuple[str, ...] | None = None + if pq_tables is not None: + base_dehooked = list(pq_tables["cliDehookedSymsPlaced"]) + if c2_rehearsal_dehook: + rehearsal_extra = [ + "memcpy", + "memset", + *(r for r in moved_libc_rows if r != "memcmp"), + *active_lib2_roots, + ] + eff_dehooked_syms = tuple(dict.fromkeys([*base_dehooked, *rehearsal_extra])) + else: + eff_dehooked_syms = tuple(base_dehooked) + if active_lib2_roots or moved_libc_rows: + must_be_dehooked = [ + *(r for r in moved_libc_rows if r != "memcmp"), + *active_lib2_roots, + ] + still_hooked = sorted(set(must_be_dehooked) & set(pq_tables["cliHookTablePlaced"])) + missing_dehooked = [ + s for s in must_be_dehooked if s not in set(base_dehooked) + ] + if still_hooked or missing_dehooked: + raise RuntimeError( + "C2 atomic de-hook check failed against `CliBinaryPq.lean` " + f"(pass `--c2-rehearsal-dehook` with `--unpinned` for pre-cutover trials): " + f"still_in_cliHookTablePlaced={still_hooked}, " + f"missing_from_cliDehookedSymsPlaced={missing_dehooked}" + ) + elif c2_rehearsal_dehook: + eff_dehooked_syms = tuple( + dict.fromkeys([ + "memcpy", + "memset", + *(r for r in moved_libc_rows if r != "memcmp"), + *active_lib2_roots, + ]) + ) + + sib_cfg_paths_verify = list(sib_cfg_paths) + if ( + active_lib2_names + and lib2_cfg_path is not None + and all(p.resolve() != lib2_cfg_path.resolve() for p in sib_cfg_paths_verify) + ): + sib_cfg_paths_verify.append(lib2_cfg_path) + run_5d_in_build = (ld_mode != "none") or ci_mode built_5d_json = link_out / DEFAULT_STDBIN_5D_NAME if not unpinned: @@ -4223,18 +5467,46 @@ def build_stock_stdbin_into( eff_symtab_cnt = len(_u_syms) eff_loader_cnt = len(_u_img.symbols) _u_def_names = {s.name for s in _u_syms[1:] if s.st_shndx != 0 and s.name} + _u_retired_orig = {str(r["originalSymbol"]) for r in retired_slots if r.get("originalSymbol")} eff_retained_cnt = sum( - 1 for item in stub_manifest if str(item["name"]) in _u_def_names + 1 + for item in stub_manifest + if str(item["name"]) in _u_def_names or str(item["name"]) in _u_retired_orig ) eff_verify_repo_root = None eff_verify_externs = lean_externs + if generated_extern_data is None: + _u_obj_sz_by_name: dict[str, int] = {} + for _s in _u_syms[1:]: + if _s.st_shndx != 0 and _s.stype == 1 and _s.name and _s.name not in _u_obj_sz_by_name: + _u_obj_sz_by_name[_s.name] = int(_s.st_size) + _lock_kept_d1 = ( + (lock.get("d1_extern_data_lock") or {}).get("kept") + if isinstance(lock.get("d1_extern_data_lock"), Mapping) + else None + ) + generated_extern_data = {} + for _usym in raw_unpinned_ext_data: + _udem = alpha_checks.demangle_rust_v0(str(_usym)) + if isinstance(_lock_kept_d1, Mapping) and str(_usym) in _lock_kept_d1: + _usz = int(_lock_kept_d1[str(_usym)]["size"]) + elif str(_usym) in _u_obj_sz_by_name: + _usz = _u_obj_sz_by_name[str(_usym)] + elif str(_usym) in alpha_checks.EIGHT_BYTE_EXTERN_DATA_SYMS: + _usz = 8 + else: + _usz = 0 + generated_extern_data[_udem] = _usz verify_summary = verify_stock_stdbin_elf( built_elf, cfg0_path, stub_manifest, - sibling_cfg_paths=sib_cfg_paths, + sibling_cfg_paths=sib_cfg_paths_verify, repo_root=eff_verify_repo_root, expected_externs=eff_verify_externs, + dehooked_syms=eff_dehooked_syms, + active_lib2_roots=active_lib2_roots if active_lib2_names else None, + retired_stub_slots=retired_slots, expected_phnum=int(lock.get("expected_phnum", EXPECTED_STDBIN_PHNUM)), expected_pt_loads=int(lock.get("expected_pt_loads", EXPECTED_STDBIN_PT_LOADS)), expected_symtab_count=eff_symtab_cnt, @@ -4252,10 +5524,17 @@ def build_stock_stdbin_into( five_d_json_path=built_5d_json if run_5d_in_build else None, verbose=True, ) + _verify_c2_mechanical_invariants( + elf_bytes=built_elf.read_bytes(), + norm_map_text=norm_map_text, + active_lib2_roots=active_lib2_roots, + moved_libc_rows=moved_libc_rows, + retired_slots=retired_slots, + ) alpha_scan = alpha_checks.scan_link_inputs_for_alpha( cli_link_objs=cli_link_objs, - other_objs=[*sc_objs, main_rust_o], + other_objs=[*sc_objs, main_rust_o, *lib2_link_objs], native_objs=staged_native_non_stub, stubs_o=staged_stubs_o, runtime_archives=runtime_archives, @@ -4281,6 +5560,7 @@ def build_stock_stdbin_into( *staged_native_non_stub, staged_stubs_o, *cli_link_objs, + *lib2_link_objs, main_rust_o, *runtime_archives, ] @@ -4347,13 +5627,22 @@ def build_stock_stdbin_into( for p in input_files ], "link_map_sha256": link_map_sha, - "alpha_scan": dict(alpha_scan), - "alpha_displaced_weak_lock": dict(alpha_b3["alpha_displaced_weak_lock"]), - "s2_real_body_lock": dict(alpha_b3["s2_real_body_lock"]), - "d1_extern_data_lock": dict(alpha_b3["d1_extern_data_lock"]), + "alpha_scan": alpha_scan, + "alpha_displaced_weak_lock": alpha_b3["alpha_displaced_weak_lock"], + "s2_real_body_lock": alpha_b3["s2_real_body_lock"], + "d1_extern_data_lock": alpha_b3["d1_extern_data_lock"], } if unpinned: stdbin_meta["unpinned"] = True + if active_lib2_names or moved_libc_rows: + stdbin_meta["c2"] = { + "lib2_config": str(DEFAULT_REL_LIB2_CONFIG) if active_lib2_names else None, + "active_lib2_rows": list(active_lib2_names), + "active_lib2_roots": list(active_lib2_roots), + "retired_stub_slots": retired_slots, + "moved_libc_rows": list(moved_libc_rows), + "rehearsal_dehook": bool(c2_rehearsal_dehook), + } built_cv_json = link_out / DEFAULT_STDBIN_META_NAME built_cv_json.write_text(json.dumps(stdbin_meta, indent=2) + "\n", encoding="utf-8") @@ -4744,7 +6033,16 @@ def _resolve_upstream_for_cfg( if vendor_symlink: candidates.append(crate_dir / str(vendor_symlink)) if env.get("HOME"): - candidates.append(pathlib.Path(str(env["HOME"])) / home_subdir) + home_dir = pathlib.Path(str(env["HOME"])) + candidates.append(home_dir / home_subdir) + if up.get("commit"): + candidates.append( + home_dir + / ".cache" + / "arm64-verification-engine" + / "git" + / f"{name}-{up['commit']}" + ) chosen: pathlib.Path | None = None for cand in candidates: @@ -6053,6 +7351,11 @@ def _stage_and_link_stdbin_direct( dynamic_stubs_dir: pathlib.Path | None = None, initial_lean_externs: Sequence[str] | None = None, displaced_weak: Sequence[str] = alpha_checks.EXPECTED_DISPLACED_WEAK, + lib2_cfg_rel: str | None = None, + lib2_cfg_abs: pathlib.Path | None = None, + active_lib2_names: Sequence[str] = (), + active_lib2_roots: Sequence[str] = (), + moved_libc_rows: Sequence[str] = (), ) -> dict[str, Any]: """Direct 2-config `StdBin` staging + `ld.lld` link inside `scripts/cli-elf-stock` (bypassing `arm64-semantics` `v0.46.0` `trimmed.rs:86` while emitting every side output @@ -6226,6 +7529,60 @@ def _stage_and_link_stdbin_direct( "exports": exports_k, }) + if active_lib2_names: + if lib2_cfg_rel is None or lib2_cfg_abs is None: + raise RuntimeError("`active_lib2_names` requires `lib2_cfg_rel` and `lib2_cfg_abs`") + lib2_cfg = tomllib.loads(lib2_cfg_abs.read_text(encoding="utf-8")) + lib2_prefix = f"lib{len(images)}_" + lib2_objs, lib2_recs = _extract_lib2_trims_direct( + lib2_cfg=lib2_cfg, + active_lib2_names=active_lib2_names, + cfg0_work_root=work_root / "cfg_0", + link_work=raw_work, + env=env, + obj_prefix=lib2_prefix, + ) + lib2_paths = [p.resolve() for p in lib2_objs] + lib2_parsed = [_ELF_INSPECT.parse_reloc_obj(p.read_bytes(), p.name) for p in lib2_paths] + lib2_obj_entries: list[dict[str, Any]] = [] + lib2_trim_list: list[dict[str, Any] | None] = [] + for p_o, tr in zip(lib2_paths, lib2_recs): + input_notes[p_o] = {"kind": "lib2Object"} + raw_o = p_o.read_bytes() + sha_o = hashlib.sha256(raw_o).hexdigest() + lib2_obj_entries.append({ + "name": str(tr["name"]), + "path": _rel_path(p_o), + "sha256": sha_o, + "size": len(raw_o), + "trimmedFrom": { + "rlib": str(tr["rlib"]), + "member": str(tr["member"]), + "provenance": str(tr["provenance"]), + "roots": list(tr["roots"]), + "memberSha256": str(tr["member_sha256"]), + "memberSize": int(tr["member_size"]), + "keepSetSha256": str(tr["keep_set_sha256"]), + "keepSet": list(tr["keep_set"]), + }, + }) + lib2_trim_list.append(tr) + defs_2: set[str] = set() + undefs_2: set[str] = set() + for po in lib2_parsed: + defs_2.update(po.defs_by_name.keys()) + undefs_2.update(po.undefs_by_name.keys()) + images.append({ + "role": "lib2", + "config": str(lib2_cfg_rel), + "paths": lib2_paths, + "parsed": lib2_parsed, + "objects_json": lib2_obj_entries, + "trimmed": lib2_trim_list, + "externs": sorted(undefs_2 - defs_2), + "exports": list(active_lib2_roots), + }) + crates_secs = time.monotonic() - t_crates0 # 4. Compile `std-main` (`-Zbuild-std=std,panic_abort -- --emit=obj`), weaken overlapping @@ -6331,6 +7688,8 @@ def _stage_and_link_stdbin_direct( all_img_defs: set[str] = set() for im in images: + if im.get("role") == "lib2": + continue for po in im["parsed"]: all_img_defs.update(po.defs_by_name.keys()) parsed_main_pre = _ELF_INSPECT.parse_reloc_obj(main_rust_o.read_bytes(), "main_rust.o") @@ -6409,7 +7768,7 @@ def _stage_and_link_stdbin_direct( compiler_builtins_a, sc_copied["libunwind.a"], ] - all_im_paths = [p for im in images for p in im["paths"]] + all_im_paths = [p for im in images if im.get("role") != "lib2" for p in im["paths"]] dyn_stub_manifest = _compute_stock_stub_manifest( lib_objs=all_im_paths, rt_inputs=[*sc_all_for_manifest, main_rust_o, *staged_native, *rt_archives_for_manifest], @@ -6433,6 +7792,23 @@ def _stage_and_link_stdbin_direct( input_notes[dst_dyn] = {"kind": "nativeObject"} staged_native.append(dst_dyn) + retired_slots: list[dict[str, Any]] = [] + if active_lib2_roots: + stub_cands_nat = [ + p + for p in staged_native + if p.name == STUB_OBJ_NAME or ("stub" in p.name and p.suffix == ".o") + ] + if len(stub_cands_nat) != 1: + raise RuntimeError( + f"expected 1 staged stub `.o` in {nat_dst_dir} for C2 retirement, found {stub_cands_nat}" + ) + retired_slots = _retire_stub_slots_in_object( + stub_cands_nat[0], + active_lib2_roots, + env, + ) + # 5. Pre-link hooked-extern plan & assemble exact `ld.lld` command (`cwd = raw_work`). pre_objs = [sc_copied["crt1.o"], sc_copied["crti.o"], sc_copied["crtbegin.o"]] libs_group = [sc_copied["libc.a"], compiler_builtins_a, sc_copied["libunwind.a"]] @@ -6530,9 +7906,13 @@ def _stage_and_link_stdbin_direct( for p_o, po_o, t_info in zip(im["paths"], im["parsed"], im["trimmed"]): if t_info is not None: trim_paths_for_gc.append(p_o) - for sym in po_o.symbols: - if sym.bind in (1, 2) and 0 < sym.st_shndx < len(po_o.sections) and sym.name: - trim_roots_for_gc.add(sym.name) + if im.get("role") == "lib2": + for r_sym in t_info["roots"]: + trim_roots_for_gc.add(str(r_sym)) + else: + for sym in po_o.symbols: + if sym.bind in (1, 2) and 0 < sym.st_shndx < len(po_o.sections) and sym.name: + trim_roots_for_gc.add(sym.name) exe_out = (stage_raw_res / elf_name).resolve() cli_lld_args: list[str] = [] @@ -6616,6 +7996,19 @@ def _stage_and_link_stdbin_direct( exec_elf = _ELF_INSPECT.parse_exec_elf(elf_bytes, elf_name) raw_map_text = (raw_work / "link.map").read_text(encoding="utf-8") raw_why_text = (raw_work / "why-extract.tsv").read_text(encoding="utf-8") + if retired_slots: + local_fn_vmas = { + s.name: int(s.st_value) + for s in exec_elf.symbols + if s.st_shndx != 0 and s.is_local and s.stype == 2 and s.name + } + for rs_rec in retired_slots: + ret_nm = str(rs_rec["retiredSymbol"]) + if ret_nm not in local_fn_vmas: + raise RuntimeError( + f"retired stub symbol `{ret_nm}` missing from linked ELF `.symtab`" + ) + rs_rec["origAddr"] = hex(local_fn_vmas[ret_nm]) trace_defs_hooked: list[tuple[str, str]] = [] for raw_l in lld_out.splitlines(): @@ -6805,7 +8198,11 @@ def _stage_and_link_stdbin_direct( stock_link_manifest: dict[str, Any] = { "tool": "snapshot-link --stock", "configs": [ - {"config": im["config"], "objects": im["objects_json"]} + ( + {"config": im["config"], "role": "lib2", "objects": im["objects_json"]} + if im.get("role") == "lib2" + else {"config": im["config"], "objects": im["objects_json"]} + ) for im in images ], "main": main_rust_manifest_rel, @@ -6841,6 +8238,10 @@ def _stage_and_link_stdbin_direct( "archiveMembers": archive_members_json, "unwindAudit": unwind_audit_json, } + if retired_slots: + stock_link_manifest["retiredStubSlots"] = retired_slots + if moved_libc_rows: + stock_link_manifest["c2MovedLibcRows"] = list(moved_libc_rows) (stage_raw_res / ENGINE_STOCK_META_NAME).write_text( json.dumps(stock_link_manifest, indent=2) + "\n", encoding="utf-8" @@ -6909,14 +8310,16 @@ def _extract_sysroot_trims_from_rlib_dir( link_work: pathlib.Path | None = None, obj_prefix: str = "lib0_", use_snapshot_compat_emit: bool = False, + provenance_kind: str = "sysroot", ) -> tuple[list[pathlib.Path], list[dict[str, Any]]]: - """D4: Data-driven extraction of `[[sysroot_objects]]` trims from `rlib_dir` (`lib-*.rlib`), - recording `rlib`, `rlib_sha256`, `member`, `member_sha256`, `kept_sections`, and `emitted_sha256`, - and supporting multiple disjoint keep-sets from the same `.rlib` member with zero code change.""" + """D4: Data-driven extraction of `[[sysroot_objects]]` / `[[dep_objects]]` trims from `rlib_dir` + (`lib-*.rlib`), recording `rlib`, `rlib_sha256`, `member`, `member_sha256`, + `kept_sections`, and `emitted_sha256`, and supporting multiple disjoint keep-sets from the + same `.rlib` member with zero code change.""" if not sysroot_entries: return [], [] if not rlib_dir.is_dir(): - raise RuntimeError(f"sysroot target libdir missing: {rlib_dir}") + raise RuntimeError(f"{provenance_kind} target libdir missing: {rlib_dir}") rlibs_by_crate: dict[str, list[pathlib.Path]] = {} for p in sorted(rlib_dir.glob("*.rlib")): @@ -6933,11 +8336,11 @@ def _extract_sysroot_trims_from_rlib_dir( entry_name = str(entry.get("name") or crate_name) roots = [str(r) for r in (entry.get("roots") or ())] if not roots: - raise RuntimeError(f"[[sysroot_objects]] `{entry_name}` has empty `roots`") + raise RuntimeError(f"[[{provenance_kind}_objects]] `{entry_name}` has empty `roots`") cands = rlibs_by_crate.get(crate_name.replace("-", "_"), []) if len(cands) != 1: raise RuntimeError( - f"expected 1 sysroot rlib for crate `{crate_name}` in {rlib_dir}, found {cands}" + f"expected 1 {provenance_kind} rlib for crate `{crate_name}` in {rlib_dir}, found {cands}" ) rlib_path = cands[0] if rlib_path not in parsed_cache: @@ -6962,7 +8365,7 @@ def _extract_sysroot_trims_from_rlib_dir( matching_members.append(mem) if len(matching_members) != 1: raise RuntimeError( - f"sysroot root `{roots[0]}` expected in 1 `.o` member of {rlib_path.name}, " + f"{provenance_kind} root `{roots[0]}` expected in 1 `.o` member of {rlib_path.name}, " f"found {[m.name for m in matching_members]}" ) mem = matching_members[0] @@ -6974,7 +8377,7 @@ def _extract_sysroot_trims_from_rlib_dir( overlap = sorted(prev_secs & set(kept_sections)) if overlap: raise RuntimeError( - f"overlapping `kept_sections` {overlap} across `[[sysroot_objects]]` rows in {label}" + f"overlapping `kept_sections` {overlap} across `[[{provenance_kind}_objects]]` rows in {label}" ) prev_secs.update(kept_sections) @@ -6997,7 +8400,7 @@ def _extract_sysroot_trims_from_rlib_dir( ("".join(f"{ln}\n" for ln in keep_set_lines)).encode("utf-8") ).hexdigest() provenance_line = ( - f"sysroot `{rlib_path.name}` member `{mem.name}` " + f"{provenance_kind} `{rlib_path.name}` member `{mem.name}` " f"(sha256 {mem.sha256}, {len(kept_pairs_meta)} kept sections)" ) obj_idx = start_idx + t_off @@ -7040,6 +8443,120 @@ def _extract_sysroot_trims_from_rlib_dir( return emitted_paths, trim_records +def _extract_lib2_trims_direct( + *, + lib2_cfg: Mapping[str, Any], + active_lib2_names: Sequence[str], + cfg0_work_root: pathlib.Path, + link_work: pathlib.Path | None, + env: Mapping[str, str], + obj_prefix: str = "lib2_", +) -> tuple[list[pathlib.Path], list[dict[str, Any]]]: + """C2: Extract ordered `lib2_*.o` trims from `cli/rt/translation.toml` (`[[sysroot_objects]]` + from GNU sysroot + `[[dep_objects]]` from `cfg_0`'s compiled `release/deps`), filtered to + `active_lib2_names` (plus `helper_roots` of active rows ONLY), with `SystemTime::add` + (`std_time_add`) guaranteed LAST and disjoint in `.text.lib2` and `.rodata.lib2`.""" + if not active_lib2_names: + return [], [] + rows_tbl = lib2_cfg.get("lib2_rows") + if not isinstance(rows_tbl, Mapping): + raise RuntimeError("`cli/rt/translation.toml` missing `[lib2_rows]` table") + allowed_roots: set[str] = set() + for rname in active_lib2_names: + rinfo = rows_tbl.get(rname) + if not isinstance(rinfo, Mapping): + raise RuntimeError(f"unknown `[lib2_rows]` entry {rname!r}") + allowed_roots.add(str(rinfo["root"])) + for hr in rinfo.get("helper_roots") or (): + allowed_roots.add(str(hr)) + + ordered_specs: list[tuple[int, str, dict[str, Any]]] = [] + seen_orders: set[int] = set() + for kind, key in (("sysroot", "sysroot_objects"), ("dep", "dep_objects")): + for raw_ent in lib2_cfg.get(key) or (): + if not isinstance(raw_ent, Mapping): + raise RuntimeError(f"malformed `{key}` entry in `cli/rt/translation.toml`: {raw_ent!r}") + if "order" not in raw_ent: + raise RuntimeError( + f"`cli/rt/translation.toml` `{key}` entry `{raw_ent.get('name')}` missing mandatory `order`" + ) + ord_idx = int(raw_ent["order"]) + if ord_idx in seen_orders: + raise RuntimeError(f"duplicate `order = {ord_idx}` in `cli/rt/translation.toml`") + seen_orders.add(ord_idx) + filt_roots = [str(r) for r in (raw_ent.get("roots") or ()) if str(r) in allowed_roots] + if not filt_roots: + continue + ent_copy = dict(raw_ent) + ent_copy["roots"] = filt_roots + ordered_specs.append((ord_idx, kind, ent_copy)) + ordered_specs.sort(key=lambda item: item[0]) + if not ordered_specs: + raise RuntimeError( + f"0 `lib2` trim objects matched active rows {list(active_lib2_names)}" + ) + if "time_add" in active_lib2_names and ordered_specs[-1][2].get("name") != "std_time_add": + raise RuntimeError( + "`SystemTime::add` (`std_time_add`) must be strictly LAST in `lib2` link order, " + f"got {[it[2].get('name') for it in ordered_specs]}" + ) + + target = str(lib2_cfg.get("target") or DEFAULT_RUST_TARGET_TRIPLE) + sysroot_tlibdir = pathlib.Path( + subprocess.run( + ["rustc", "--print", "target-libdir", "--target", target], + capture_output=True, + text=True, + check=True, + env=dict(env), + ).stdout.strip() + ).resolve() + dep_rlib_dir = (cfg0_work_root / "cargo_target" / target / "release" / "deps").resolve() + + all_paths: list[pathlib.Path] = [] + all_records: list[dict[str, Any]] = [] + used_by_kind_and_member: dict[tuple[str, str, str], set[str]] = {} + for out_idx, (_ord_idx, kind, ent_copy) in enumerate(ordered_specs): + rdir = sysroot_tlibdir if kind == "sysroot" else dep_rlib_dir + em_p, em_r = _extract_sysroot_trims_from_rlib_dir( + sysroot_entries=[ent_copy], + rlib_dir=rdir, + start_idx=out_idx, + link_work=link_work, + obj_prefix=obj_prefix, + use_snapshot_compat_emit=True, + provenance_kind=kind, + ) + rec0 = em_r[0] + mkey = (kind, str(rec0["rlib_sha256"]), str(rec0["member_sha256"])) + prev_s = used_by_kind_and_member.setdefault(mkey, set()) + ov_s = sorted(prev_s & set(rec0["kept_sections"])) + if ov_s: + raise RuntimeError( + f"overlapping `kept_sections` {ov_s} across `lib2` entries in {rec0['rlib']}({rec0['member']})" + ) + prev_s.update(rec0["kept_sections"]) + all_paths.extend(em_p) + all_records.extend(em_r) + + if "time_add" in active_lib2_names and all_paths: + add_obj = _ELF_INSPECT.parse_reloc_obj(all_paths[-1].read_bytes(), all_paths[-1].name) + for sec in add_obj.sections: + if (sec.sh_flags & 0x2) == 0 or sec.sh_type == 0: + continue + if (sec.sh_flags & 0x10) != 0: + raise RuntimeError( + f"`std_time_add` (`{all_paths[-1].name}`) section `{sec.name}` has SHF_MERGE " + f"(`sh_flags={sec.sh_flags:#x}`), violating tail-truncation invariance" + ) + if sec.name.startswith(".data.rel.ro"): + raise RuntimeError( + f"`std_time_add` (`{all_paths[-1].name}`) contains unexpected `{sec.name}`, " + "which would sit before `.rodata` in `.rodata.lib2` instead of at its tail" + ) + return all_paths, all_records + + def _extract_sysroot_trims_direct( *, cfg: Mapping[str, Any], @@ -7122,6 +8639,9 @@ def build_stock_into( keep_work_dir: pathlib.Path | None = None, ci_mode: bool = False, unpinned: bool = False, + lib2_rows_spec: str | None = None, + c2_libc_rows_spec: str | None = None, + c2_rehearsal_dehook: bool = False, ) -> pathlib.Path: eff_stock_lock = ( stock_lock_path if stock_lock_path is not None else (repo_root / DEFAULT_REL_STOCK_LOCK) @@ -7140,9 +8660,14 @@ def build_stock_into( keep_work_dir=keep_work_dir, ci_mode=ci_mode, unpinned=unpinned, + lib2_rows_spec=lib2_rows_spec, + c2_libc_rows_spec=c2_libc_rows_spec, + c2_rehearsal_dehook=c2_rehearsal_dehook, ) if unpinned: raise RuntimeError("`--unpinned` is only supported for `--stdbin` builds") + if lib2_rows_spec is not None or c2_libc_rows_spec is not None or c2_rehearsal_dehook: + raise RuntimeError("C2 `lib2`/`2C` options are only supported for `--stdbin` builds") elf_name = _default_elf_name_for_lock(lock) stock_ld_rel = str(lock.get("linker_script_path") or DEFAULT_REL_STOCK_LD) @@ -7745,6 +9270,8 @@ def verify_alpha_standalone( stage_sl = json.loads(stage_sl_path.read_text(encoding="utf-8")) stage_root = stage_sl_path.parent for cfg_ent in stage_sl.get("configs") or (): + if str(cfg_ent.get("role") or "") == "lib2": + continue for obj_ent in cfg_ent.get("objects") or (): p_obj = (stage_root / str(obj_ent["path"])).resolve() if not p_obj.is_file(): @@ -7840,6 +9367,8 @@ def verify_alpha_standalone( cli_rel_paths: list[str] = [] for cfg_ent in sl.get("configs") or (): + if str(cfg_ent.get("role") or "") == "lib2": + continue for obj_ent in cfg_ent.get("objects") or (): cli_rel_paths.append(str(obj_ent["path"])) if not cli_rel_paths: @@ -7967,6 +9496,9 @@ def main(argv: list[str] | None = None) -> int: ap.add_argument("--engine", type=pathlib.Path, default=None, help="engine directory (default: arm64-semantics)") ap.add_argument("--repo-root", type=pathlib.Path, default=None, help="target repository root (default: parent of scripts/)") ap.add_argument("--unpinned", action="store_true", help="build an unpinned repo tree (e.g. pre-lock rename branch); forbidden in --ci") + ap.add_argument("--lib2-rows", type=str, default=None, help="C2 lib2 rows (`none`, `all`, or comma-separated `[lib2_rows]` names); forbidden in --ci") + ap.add_argument("--c2-libc-rows", type=str, default=None, help="C2 2C moved libc string rows (`none`, `all`, or subset of memmove,memcmp,bcmp,strlen); forbidden in --ci") + ap.add_argument("--c2-rehearsal-dehook", action="store_true", help="augment `cliDehookedSymsPlaced` with active C2 rows for `--unpinned` pre-cutover trials; forbidden in --ci") ap.add_argument("--alink-lock", "--lock", dest="alink_lock", type=pathlib.Path, default=None, help="run stock-pin/alink_check.py --lock on the output directory") ap.add_argument("--cold-zig-cache", action="store_true", help="run second build with isolated empty ZIG cache") ap.add_argument("--stdbin", action="store_true", help="use 2-config IO.6b StdBin recipe (inputs_stock_stdbin.lock)") @@ -7990,12 +9522,28 @@ def main(argv: list[str] | None = None) -> int: file=sys.stderr, ) return 1 + if ci_mode and ( + args.lib2_rows is not None + or args.c2_libc_rows is not None + or args.c2_rehearsal_dehook + ): + print( + "cli-elf-stock: FAIL: `--lib2-rows`, `--c2-libc-rows`, and `--c2-rehearsal-dehook` are forbidden in CI mode", + file=sys.stderr, + ) + return 1 if args.unpinned and not args.build: print( "cli-elf-stock: FAIL: `--unpinned` is only valid with `--build`", file=sys.stderr, ) return 1 + if args.c2_rehearsal_dehook and not args.unpinned: + print( + "cli-elf-stock: FAIL: `--c2-rehearsal-dehook` requires `--unpinned`", + file=sys.stderr, + ) + return 1 if args.engine is not None: engine_dir = args.engine.resolve() @@ -8181,12 +9729,23 @@ def main(argv: list[str] | None = None) -> int: ) cfg_paths_rel = [str(p) for p in (stock_lock.get("config_paths") or ())] sib_cfgs = [repo_root / p for p in cfg_paths_rel[1:]] + c2_meta = meta.get("c2") if isinstance(meta.get("c2"), Mapping) else {} + c2_lib2_cfg_rel = str(c2_meta.get("lib2_config") or "") + if c2_lib2_cfg_rel: + c2_cfg_p = (repo_root / c2_lib2_cfg_rel).resolve() + if all(p.resolve() != c2_cfg_p for p in sib_cfgs): + sib_cfgs.append(c2_cfg_p) + c2_active_roots = [str(x) for x in (c2_meta.get("active_lib2_roots") or ())] + c2_retired_slots = list(c2_meta.get("retired_stub_slots") or ()) + c2_moved_libc = [str(x) for x in (c2_meta.get("moved_libc_rows") or ())] verify_stock_stdbin_elf( elf_path, cfg_path, stub_manifest=stub_manifest, sibling_cfg_paths=sib_cfgs, repo_root=repo_root, + active_lib2_roots=c2_active_roots or None, + retired_stub_slots=c2_retired_slots, expected_phnum=int(stock_lock.get("expected_phnum", EXPECTED_STDBIN_PHNUM)), expected_pt_loads=int( stock_lock.get("expected_pt_loads", EXPECTED_STDBIN_PT_LOADS) @@ -8206,6 +9765,20 @@ def main(argv: list[str] | None = None) -> int: five_d_json_path=meta_path.parent / DEFAULT_STDBIN_5D_NAME, verbose=True, ) + if c2_active_roots or c2_moved_libc: + eff_v_map = ( + map_path + if map_path is not None + else (elf_path.parent / DEFAULT_LINK_MAP_NAME) + ) + if eff_v_map.is_file(): + _verify_c2_mechanical_invariants( + elf_bytes=elf_path.read_bytes(), + norm_map_text=eff_v_map.read_text(encoding="utf-8"), + active_lib2_roots=c2_active_roots, + moved_libc_rows=c2_moved_libc, + retired_slots=c2_retired_slots, + ) else: verify_stock_elf( elf_path, @@ -8254,6 +9827,9 @@ def main(argv: list[str] | None = None) -> int: keep_work_dir=keep_work, ci_mode=ci_mode, unpinned=bool(args.unpinned), + lib2_rows_spec=args.lib2_rows, + c2_libc_rows_spec=args.c2_libc_rows, + c2_rehearsal_dehook=bool(args.c2_rehearsal_dehook), ) if args.alink_lock is not None: _run_alink_check_with_lock( diff --git a/scripts/stock-pin/alink_check.py b/scripts/stock-pin/alink_check.py index 1dc51a213..b0ac8dd81 100644 --- a/scripts/stock-pin/alink_check.py +++ b/scripts/stock-pin/alink_check.py @@ -253,6 +253,12 @@ class ALinkReport: toolchain_sysroot_scan: dict[str, Any] = field(default_factory=dict) proved_closures: dict[str, dict[str, Any]] = field(default_factory=dict) inputs_lock_pin: dict[str, Any] | None = None + cli_hook_table_placed: list[str] = field(default_factory=list) + cli_dehooked_syms_placed: list[str] = field(default_factory=list) + cli_panic_symbols_placed: list[str] = field(default_factory=list) + cli_binary_pq_sha256: str | None = None + lib2_objects: list[dict[str, Any]] = field(default_factory=list) + retired_stub_slots: list[dict[str, Any]] = field(default_factory=list) violations: list[str] = field(default_factory=list) @property @@ -321,6 +327,18 @@ def to_json_dict(self) -> dict[str, Any]: out["proved_closures"] = self.proved_closures if self.inputs_lock_pin is not None: out["inputs_lock_pin"] = self.inputs_lock_pin + if self.cli_hook_table_placed: + out["cli_hook_table_placed"] = self.cli_hook_table_placed + if self.cli_dehooked_syms_placed or self.cli_hook_table_placed: + out["cli_dehooked_syms_placed"] = self.cli_dehooked_syms_placed + if self.cli_panic_symbols_placed: + out["cli_panic_symbols_placed"] = self.cli_panic_symbols_placed + if self.cli_binary_pq_sha256 is not None: + out["cli_binary_pq_sha256"] = self.cli_binary_pq_sha256 + if self.lib2_objects: + out["lib2_objects"] = self.lib2_objects + if self.retired_stub_slots: + out["retired_stub_slots"] = self.retired_stub_slots return out @@ -1196,9 +1214,18 @@ def chk_eq(field_label: str, got: Any, exp: Any) -> None: ("weak_undefined_allowed", report.weak_undefined_allowed), ("displaced_weak", report.displaced_weak), ("displaced_weak_referrers", report.displaced_weak_referrers), + ("cli_hook_table_placed", report.cli_hook_table_placed), + ("cli_dehooked_syms_placed", report.cli_dehooked_syms_placed), + ("cli_panic_symbols_placed", report.cli_panic_symbols_placed), ): if list_key in lock: chk_eq(list_key, got_list, [str(x) for x in lock[list_key]]) + if ( + "cli_binary_pq_sha256" in lock + and str(lock["cli_binary_pq_sha256"]) + and report.cli_binary_pq_sha256 is not None + ): + chk_eq("cli_binary_pq_sha256", report.cli_binary_pq_sha256, str(lock["cli_binary_pq_sha256"])) if "elf_sha256" in lock: chk_eq("elf_sha256", report.elf_sha256, str(lock["elf_sha256"])) @@ -1470,6 +1497,67 @@ def chk_eq(field_label: str, got: Any, exp: Any) -> None: if fk in eu and eu[fk] is not None: chk_eq(f"n_undef_map[{nobj!r}][{usym!r}].{fk}", gu.get(fk), eu[fk]) + is_full_lock = any(k in lock for k in ("schema_version", "definers", "w3_pin")) + + if "lib2_objects" in lock or (is_full_lock and report.lib2_objects): + exp_l2_raw = lock.get("lib2_objects") + if not isinstance(exp_l2_raw, Sequence) or isinstance(exp_l2_raw, (str, bytes, bytearray)): + errs.append("Lock diff `lib2_objects`: lock is missing required `lib2_objects` list") + else: + exp_l2_by_name: dict[str, Mapping[str, Any]] = {} + for row in exp_l2_raw: + if isinstance(row, Mapping) and row.get("name"): + exp_l2_by_name[str(row["name"])] = row + else: + errs.append(f"Lock `lib2_objects` entry is malformed: {row!r}") + got_l2_by_name = {str(r["name"]): r for r in report.lib2_objects} + chk_eq("lib2_objects.names", sorted(got_l2_by_name.keys()), sorted(exp_l2_by_name.keys())) + for oname in sorted(got_l2_by_name.keys() & exp_l2_by_name.keys()): + gl2 = got_l2_by_name[oname] + el2 = exp_l2_by_name[oname] + for fk in ( + "path", + "sha256", + "size", + "config_index", + "defined_symbols", + "rlib", + "rlib_sha256", + "member", + "member_sha256", + "keep_set_sha256", + "kept_sections", + "roots", + ): + if fk in el2 and el2[fk] is not None and el2[fk] != "": + chk_eq(f"lib2_objects[{oname!r}].{fk}", gl2.get(fk), el2[fk]) + + if "retired_stub_slots" in lock or (is_full_lock and report.retired_stub_slots): + exp_rs_raw = lock.get("retired_stub_slots") + if not isinstance(exp_rs_raw, Sequence) or isinstance(exp_rs_raw, (str, bytes, bytearray)): + errs.append("Lock diff `retired_stub_slots`: lock is missing required `retired_stub_slots` list") + else: + exp_rs_by_sym: dict[str, Mapping[str, Any]] = {} + for row in exp_rs_raw: + if isinstance(row, Mapping) and row.get("symbol"): + exp_rs_by_sym[str(row["symbol"])] = row + else: + errs.append(f"Lock `retired_stub_slots` entry is malformed: {row!r}") + got_rs_by_sym = {str(r["symbol"]): r for r in report.retired_stub_slots} + chk_eq("retired_stub_slots.symbols", sorted(got_rs_by_sym.keys()), sorted(exp_rs_by_sym.keys())) + for rsym in sorted(got_rs_by_sym.keys() & exp_rs_by_sym.keys()): + grs = got_rs_by_sym[rsym] + ers = exp_rs_by_sym[rsym] + for fk in ("retired_symbol", "retired_section", "size"): + if fk in ers and ers[fk] is not None: + chk_eq(f"retired_stub_slots[{rsym!r}].{fk}", grs.get(fk), ers[fk]) + if "orig_addr" in ers and ers["orig_addr"] is not None: + chk_eq( + f"retired_stub_slots[{rsym!r}].orig_addr", + int(str(grs["orig_addr"]), 0), + int(str(ers["orig_addr"]), 0), + ) + return errs @@ -1597,8 +1685,53 @@ def check_stock_link( raise FileNotFoundError(f"link.map not found under {base_dir} or {eff_work}; pass `--map`") map_path = map_path.resolve() - # Load trusted hook & panic symbol tables + muslStrlenWords - hook_table_keys, panic_table_keys = elf_inspect.load_cli_hook_and_panic_tables(eff_repo_root) + # Load trusted hook, dehooked, & panic symbol tables (D-C2d: never fall back to `DEFAULT_CLI_HOOK_TABLE_PLACED`) + pq_lean_file = ( + eff_repo_root / "LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean" + if eff_repo_root is not None + else None + ) + cli_pq_sha256: str | None = None + if pq_lean_file is not None and pq_lean_file.is_file(): + pq_tables = elf_inspect.load_cli_binary_pq_tables(eff_repo_root) # type: ignore[arg-type] + hook_table_keys = pq_tables.hook_set + dehooked_table_keys = pq_tables.dehooked_set + panic_table_keys = pq_tables.panic_set + cli_pq_sha256 = pq_tables.pq_lean_sha256 + elif ( + lock_data is not None + and isinstance(lock_data.get("cli_hook_table_placed"), Sequence) + and not isinstance(lock_data.get("cli_hook_table_placed"), (str, bytes, bytearray)) + and isinstance(lock_data.get("cli_dehooked_syms_placed"), Sequence) + and not isinstance(lock_data.get("cli_dehooked_syms_placed"), (str, bytes, bytearray)) + and isinstance(lock_data.get("cli_panic_symbols_placed"), Sequence) + and not isinstance(lock_data.get("cli_panic_symbols_placed"), (str, bytes, bytearray)) + ): + hook_table_keys = frozenset(str(x) for x in lock_data["cli_hook_table_placed"]) + dehooked_table_keys = frozenset(str(x) for x in lock_data["cli_dehooked_syms_placed"]) + panic_table_keys = frozenset(str(x) for x in lock_data["cli_panic_symbols_placed"]) + if lock_data.get("cli_binary_pq_sha256"): + cli_pq_sha256 = str(lock_data["cli_binary_pq_sha256"]) + if not hook_table_keys or not panic_table_keys: + errors.append("D-C2d: lock `cli_hook_table_placed` and `cli_panic_symbols_placed` must be non-empty") + if ( + (hook_table_keys & dehooked_table_keys) + or (hook_table_keys & panic_table_keys) + or (dehooked_table_keys & panic_table_keys) + ): + errors.append( + "D-C2d: lock `cli_hook_table_placed`, `cli_dehooked_syms_placed`, and " + "`cli_panic_symbols_placed` must be pairwise disjoint" + ) + else: + hook_table_keys = frozenset() + dehooked_table_keys = frozenset() + panic_table_keys = frozenset() + errors.append( + "D-C2d: trusted hook/dehooked/panic tables require `CliBinaryPq.lean` under `--repo-root` " + "or `cli_hook_table_placed`/`cli_dehooked_syms_placed`/`cli_panic_symbols_placed` in `--lock` " + "(no `DEFAULT_CLI_HOOK_TABLE_PLACED` fallback)" + ) musl_strlen_bytes = elf_inspect.load_musl_strlen_bytes(eff_repo_root) # Parse linked ET_EXEC ELF & ld.lld -Map @@ -1696,14 +1829,65 @@ def check_stock_link( declared_exports_by_img: dict[int, set[str]] = {} image_shas_to_role: dict[str, tuple[str, int, str]] = {} sysroot_trims_report: list[dict[str, Any]] = [] + lib2_img_indices: set[int] = set() + lib2_objects_report: list[dict[str, Any]] = [] for img_idx, cfg_entry in enumerate(raw_configs): cfg_rel = str(cfg_entry["config"]) + cfg_rel_norm = cfg_rel.replace("\\", "/") config_paths.append(cfg_rel) + cfg_role_raw = str(cfg_entry.get("role") or "").strip() + if cfg_role_raw and cfg_role_raw not in ("main", "io", "lib2"): + errors.append(f"C2 lib2: unknown config role {cfg_role_raw!r} for {cfg_rel!r}") + has_lib2_obj_name = any( + re.match(r"^lib2_\d+\.o$", pathlib.Path(str(om.get("path") or om.get("name") or "")).name) + for om in cfg_entry.get("objects", []) + ) + is_lib2_cfg = ( + cfg_role_raw == "lib2" + or cfg_rel_norm.endswith("cli/rt/translation.toml") + or has_lib2_obj_name + ) + if is_lib2_cfg: + lib2_img_indices.add(img_idx) + if img_idx == 0: + errors.append("C2 lib2: main image 0 cannot be a `lib2` config") + if not cfg_rel_norm.endswith("cli/rt/translation.toml"): + errors.append( + f"C2 lib2: expected `cli/rt/translation.toml` config path for `lib2`, got {cfg_rel!r}" + ) + if not cfg_entry.get("objects"): + errors.append( + f"C2 lib2: empty `lib2` config {cfg_rel!r} must be omitted when 0 rows are active" + ) + + disk_exps: set[str] = set() if eff_repo_root is not None and (eff_repo_root / cfg_rel).is_file(): - declared_exports_by_img[img_idx] = set(elf_inspect.load_config_declared_exports(eff_repo_root, cfg_rel)) + disk_exps = set(elf_inspect.load_config_declared_exports(eff_repo_root, cfg_rel)) + meta_exps_raw = cfg_entry.get("exports") + meta_exps: set[str] | None = ( + {str(x) for x in meta_exps_raw} + if isinstance(meta_exps_raw, Sequence) and not isinstance(meta_exps_raw, (str, bytes, bytearray)) + else None + ) + if is_lib2_cfg: + if meta_exps is not None: + declared_exports_by_img[img_idx] = set(meta_exps) + if disk_exps: + disk_norm = disk_exps | {elf_inspect.demangle_rust(x) for x in disk_exps} + bad_meta = sorted( + x for x in meta_exps if x not in disk_norm and elf_inspect.demangle_rust(x) not in disk_norm + ) + if bad_meta: + errors.append( + f"C2 lib2: config {cfg_rel!r} metadata `exports` {bad_meta} not in `[placed].exports`" + ) + else: + declared_exports_by_img[img_idx] = set(disk_exps) + if not declared_exports_by_img[img_idx]: + errors.append(f"C2 lib2: `lib2` config {cfg_rel!r} has empty declared `exports`") else: - declared_exports_by_img[img_idx] = set() + declared_exports_by_img[img_idx] = set(disk_exps) if disk_exps else (set(meta_exps) if meta_exps else set()) objs_for_img: list[InputRecord] = [] for obj_meta in cfg_entry.get("objects", []): @@ -1714,6 +1898,9 @@ def check_stock_link( got_sha = elf_inspect.sha256_bytes(raw_bytes) if got_sha != exp_sha: errors.append(f"Image {img_idx} object {rel_p} sha256 {got_sha} != {exp_sha}") + exp_sz = obj_meta.get("size") + if exp_sz is not None and int(exp_sz) > 0 and len(raw_bytes) != int(exp_sz): + errors.append(f"Image {img_idx} object {rel_p} size {len(raw_bytes)} != {int(exp_sz)}") parsed_o = elf_inspect.parse_reloc_obj(raw_bytes, disk_p.name) t_from = obj_meta.get("trimmedFrom") rec = InputRecord( @@ -1730,7 +1917,8 @@ def check_stock_link( objs_for_img.append(rec) image_shas_to_role[got_sha] = (f"S:{img_idx}", img_idx, disk_p.name) - # P8-3: Verify trimmed sysroot object section keepSet + expected_kept_secs: set[str] = set() + # P8-3: Verify trimmed sysroot/dep object section keepSet if isinstance(t_from, Mapping): keep_rows = [str(x) for x in t_from.get("keepSet", [])] expected_kept_secs = {row.split("\t", 1)[-1] for row in keep_rows} @@ -1754,6 +1942,39 @@ def check_stock_link( "keep_set_sha256": str(t_from.get("keepSetSha256", "")), "kept_sections": sorted(expected_kept_secs), }) + + if is_lib2_cfg: + if not re.match(r"^lib2_\d+\.o$", disk_p.name): + errors.append(f"C2 lib2: unexpected object basename {disk_p.name!r} in `lib2` config") + if not isinstance(t_from, Mapping): + errors.append(f"C2 lib2: object {disk_p.name!r} missing required `trimmedFrom` provenance") + else: + for req_tf in ("rlib", "member", "memberSha256", "keepSetSha256", "keepSet"): + if not t_from.get(req_tf): + errors.append( + f"C2 lib2: object {disk_p.name!r} `trimmedFrom` missing required `{req_tf}`" + ) + roots_raw = t_from.get("roots", []) if isinstance(t_from, Mapping) else [] + roots_list = ( + [str(x) for x in roots_raw] + if isinstance(roots_raw, Sequence) and not isinstance(roots_raw, (str, bytes, bytearray)) + else [] + ) + lib2_objects_report.append({ + "name": disk_p.name, + "path": rel_p, + "sha256": got_sha, + "size": len(raw_bytes), + "config_index": img_idx, + "defined_symbols": sorted(parsed_o.defs_by_name.keys()), + "rlib": str(t_from.get("rlib", "")) if isinstance(t_from, Mapping) else "", + "rlib_sha256": str(t_from.get("rlibSha256", "")) if isinstance(t_from, Mapping) else "", + "member": str(t_from.get("member", "")) if isinstance(t_from, Mapping) else "", + "member_sha256": str(t_from.get("memberSha256", "")) if isinstance(t_from, Mapping) else "", + "keep_set_sha256": str(t_from.get("keepSetSha256", "")) if isinstance(t_from, Mapping) else "", + "kept_sections": sorted(expected_kept_secs), + "roots": roots_list, + }) image_records.append(objs_for_img) # Parse all other linked inputs from the authoritative link metadata (`cv_meta` for builder, `eng_meta` for engine) @@ -1837,8 +2058,17 @@ def check_stock_link( and got_sha == img_rec.sha256 and (not exp_sha or exp_sha == img_rec.sha256) ): + if str(inp_entry.get("kind") or "") == "lib2Object" and img_rec.image_idx not in lib2_img_indices: + errors.append( + f"C2 lib2: input {rel_p!r} has kind='lib2Object' but image {img_rec.image_idx} is not a `lib2` config" + ) standalone_by_path[rel_p] = img_rec continue + if str(inp_entry.get("kind") or "") == "lib2Object" or re.match(r"^lib2_\d+\.o$", bname): + errors.append( + f"C2 lib2: unpinned `lib2` object {bname!r} ({rel_p}) passed as link input without matching `configs` `lib2` entry" + ) + continue is_ar_magic = raw_bytes.startswith((b"!\n", b"!\n")) if bname.endswith(".rlib") or (is_ar_magic and not bname.endswith(".a")): @@ -2991,6 +3221,668 @@ def _run_rule_vi_closure( proved_closure_roots = sorted(set(expected_real_proved) | (actual_unhooked_rns - set(expected_real_hook_reached))) proved_closures, _ = _run_rule_vi_closure(proved_closure_roots, kind_label="real_proved") + # ========================================================================== + # Step 12bb: C2 `lib2` Placement, `D-C2d` Hooked Set, `D-C2f` (2C) Libc Tail & Retired Stub Slots + # ========================================================================== + # 0 ld.lld range-extension thunks / synthetic executable sections + exec_out_secs = { + s.name for s in elf.sections if (s.sh_flags & elf_inspect.SHF_EXECINSTR) != 0 + } + for es in elf.symbols: + if "Thunk" in es.name: + errors.append( + f"C2 placement (thunks): ld.lld range-extension thunk symbol {es.name!r} at {es.st_value:#x}" + ) + for m_sec in lmap.input_sections: + if m_sec.out_sec in exec_out_secs and m_sec.input_raw == "" and m_sec.size > 0: + errors.append( + f"C2 placement (thunks): synthetic section {m_sec.sec_name!r} " + f"in executable output section {m_sec.out_sec!r} at {m_sec.vma:#x}" + ) + + # Hooked / panic ban in `lib2` + `D-C2d` `< e_entry` check when `.text.b_pre` is present + for img_idx in sorted(lib2_img_indices): + for r in image_records[img_idx]: + if r.obj is None: + continue + for sname in sorted(r.obj.defs_by_name.keys()): + if sname in hook_table_keys: + errors.append( + f"C2 lib2 / D-C2d: hooked symbol {sname!r} ({elf_inspect.demangle_rust(sname)}) " + f"is defined in lib2 object {r.name!r} while still in `cliHookTablePlaced`" + ) + if elf_inspect.is_cli_panic_symbol_placed(sname, panic_table_keys): + errors.append( + f"C2 lib2 / D-C2d: panic symbol {sname!r} ({elf_inspect.demangle_rust(sname)}) " + f"is defined in lib2 object {r.name!r}" + ) + + for x_sym, (wnode, _wrsym, _wesym) in sorted(winning_node_by_x.items()): + if wnode.image_idx in lib2_img_indices: + if x_sym in hook_table_keys: + errors.append( + f"C2 lib2 / D-C2d: `X` symbol {x_sym!r} resolved to lib2 ({wnode.node_id}) " + f"while still in `cliHookTablePlaced`" + ) + if dehooked_table_keys and x_sym not in dehooked_table_keys: + errors.append( + f"C2 lib2 / D-C2d: `X` symbol {x_sym!r} resolved to lib2 ({wnode.node_id}) " + f"is absent from `cliDehookedSymsPlaced`" + ) + + b_pre_secs = [s for s in elf.sections if s.name == ".text.b_pre"] + if len(b_pre_secs) > 1: + errors.append(f"C2 placement: multiple `.text.b_pre` sections ({len(b_pre_secs)})") + if b_pre_secs: + b_pre_sec = b_pre_secs[0] + if (b_pre_sec.sh_flags & elf_inspect.SHF_EXECINSTR) == 0 or ( + b_pre_sec.sh_flags & elf_inspect.SHF_WRITE + ) != 0: + errors.append( + f"C2 placement: `.text.b_pre` has unexpected sh_flags={b_pre_sec.sh_flags:#x} (expected RX, non-writable)" + ) + if b_pre_sec.sh_addr + b_pre_sec.sh_size > elf.entry: + errors.append( + f"C2 placement: `.text.b_pre` end {b_pre_sec.sh_addr + b_pre_sec.sh_size:#x} > e_entry {elf.entry:#x}" + ) + for hsym in sorted(hook_table_keys): + if hsym in winning_node_by_x: + _hwn, _hrs, hes = winning_node_by_x[hsym] + if not (hes.st_value < elf.entry): + errors.append( + f"C2 D-C2d: hooked symbol {hsym!r} resolved at {hes.st_value:#x} >= e_entry {elf.entry:#x}" + ) + + # D-C2f = 2C: de-hooked `libc.a` string rows (`memmove`, `memcmp`, `bcmp`, `strlen`) in `.text.b_pre` < e_entry + dehooked_libc_rows = [ + s for s in ("memmove", "memcmp", "bcmp", "strlen") if s in dehooked_table_keys + ] + req_bpre_libc = list(dehooked_libc_rows) + if "bcmp" in dehooked_table_keys and "memcmp" not in req_bpre_libc: + req_bpre_libc.append("memcmp") + if req_bpre_libc: + if len(b_pre_secs) != 1: + errors.append( + f"D-C2f (2C): de-hooked libc row(s) {req_bpre_libc} require unique `.text.b_pre` section (< e_entry)" + ) + else: + bp = b_pre_secs[0] + bp_lo = bp.sh_addr + bp_hi = bp.sh_addr + bp.sh_size + for lsym in req_bpre_libc: + if lsym in hook_table_keys: + errors.append( + f"D-C2f (2C) / D-C2d: {lsym!r} is still in `cliHookTablePlaced`" + ) + if lsym not in winning_node_by_x: + errors.append( + f"D-C2f (2C): expected de-hooked libc symbol {lsym!r} in `X`" + ) + continue + lwn, _lrs, les = winning_node_by_x[lsym] + lsz = max(1, int(les.st_size)) + if ( + lwn.role != "R" + or lwn.source_file != "libc.a" + or lwn.archive_member != f"{lsym}.lo" + ): + errors.append( + f"D-C2f (2C): `{lsym}` expected Class R `libc.a({lsym}.lo)`, " + f"got role={lwn.role!r} source={lwn.source_file!r} member={lwn.archive_member!r}" + ) + if lwn.map_sec.out_sec != ".text.b_pre": + errors.append( + f"D-C2f (2C): de-hooked libc symbol `{lsym}` at {les.st_value:#x} placed in " + f"{lwn.map_sec.out_sec!r} (expected '.text.b_pre' < e_entry {elf.entry:#x})" + ) + if not (bp_lo <= les.st_value and les.st_value + lsz <= bp_hi <= elf.entry): + errors.append( + f"D-C2f (2C): de-hooked libc symbol `{lsym}` range [{les.st_value:#x}, {les.st_value + lsz:#x}) " + f"not inside `.text.b_pre` [{bp_lo:#x}, {bp_hi:#x}) <= e_entry {elf.entry:#x}" + ) + + for lsym in ("memmove", "memcmp", "bcmp", "strlen"): + if lsym in winning_node_by_x: + lwn, _lrs, les = winning_node_by_x[lsym] + if lwn.map_sec.out_sec == ".text.b_pre": + lsz = max(1, int(les.st_size)) + if lsym in hook_table_keys: + errors.append( + f"D-C2f (2C) / D-C2d: libc symbol `{lsym}` placed in `.text.b_pre` ({les.st_value:#x}) " + f"while still in `cliHookTablePlaced`" + ) + if lsym != "memcmp" and dehooked_table_keys and lsym not in dehooked_table_keys: + errors.append( + f"D-C2f (2C) / D-C2d: libc symbol `{lsym}` placed in `.text.b_pre` ({les.st_value:#x}) " + f"but absent from `cliDehookedSymsPlaced`" + ) + if not b_pre_secs or not ( + b_pre_secs[0].sh_addr <= les.st_value + and les.st_value + lsz <= b_pre_secs[0].sh_addr + b_pre_secs[0].sh_size <= elf.entry + ): + errors.append( + f"D-C2f (2C): libc symbol `{lsym}` [{les.st_value:#x}, {les.st_value + lsz:#x}) " + f"exceeds `.text.b_pre` / e_entry {elf.entry:#x}" + ) + + # `lib2` section placement rules + if not lib2_img_indices: + for s in elf.sections: + if s.name in (".text.lib2", ".rodata.lib2"): + errors.append( + f"C2 placement: unexpected {s.name!r} ELF section when 0 `lib2` configs are active" + ) + for m_sec in lmap.input_sections: + if m_sec.out_sec in (".text.lib2", ".rodata.lib2"): + errors.append( + f"C2 placement: unexpected {m_sec.out_sec!r} map section when 0 `lib2` configs are active" + ) + else: + lib2_obj_names = {r.name for idx in lib2_img_indices for r in image_records[idx]} + lib2_nodes = [n for n in retained_nodes if n.image_idx in lib2_img_indices] + if not lib2_nodes: + errors.append("C2 placement: active `lib2` config retained 0 sections") + + lib2_rx_nodes: list[RetainedSecNode] = [] + lib2_ro_nodes: list[RetainedSecNode] = [] + for lnode in lib2_nodes: + for rel in lnode.sec.relocs: + if rel.r_type in {309, 310, 311, 312, 313}: + errors.append( + f"C2 placement (lib2 GOT): GOT relocation r_type={rel.r_type} in {lnode.node_id}" + ) + if (lnode.sec.sh_flags & elf_inspect.SHF_EXECINSTR) != 0: + lib2_rx_nodes.append(lnode) + if (lnode.sec.sh_flags & elf_inspect.SHF_WRITE) != 0: + errors.append( + f"C2 placement (lib2 RWX): writable executable section {lnode.node_id}" + ) + if lnode.sec.sh_type != elf_inspect.SHT_PROGBITS: + errors.append( + f"C2 placement (lib2 text): non-PROGBITS executable section {lnode.node_id}" + ) + if lnode.map_sec.out_sec != ".text.lib2": + errors.append( + f"C2 placement (lib2 text): {lnode.node_id} placed in {lnode.map_sec.out_sec!r} " + f"(expected '.text.lib2')" + ) + else: + lib2_ro_nodes.append(lnode) + if lnode.sec.sh_type != elf_inspect.SHT_PROGBITS: + errors.append( + f"C2 placement (lib2 RW): non-PROGBITS section {lnode.node_id} (sh_type={lnode.sec.sh_type:#x})" + ) + if ( + lnode.sec.sh_flags & elf_inspect.SHF_WRITE + ) != 0 and not lnode.sec.name.startswith(".data.rel.ro"): + errors.append( + f"C2 placement (lib2 RW): writable data section {lnode.node_id} not allowed in lib2" + ) + if lnode.map_sec.out_sec != ".rodata.lib2": + errors.append( + f"C2 placement (lib2 RO): {lnode.node_id} placed in {lnode.map_sec.out_sec!r} " + f"(expected '.rodata.lib2')" + ) + + alloc_out_secs = { + s.name for s in elf.sections if (s.sh_flags & elf_inspect.SHF_ALLOC) != 0 + } + node_by_map_id = {id(n.map_sec): n for n in retained_nodes} + for m_sec in lmap.input_sections: + if m_sec.out_sec not in alloc_out_secs: + continue + if ( + m_sec.input_raw != "" + and m_sec.archive_path is None + and pathlib.Path(m_sec.input_raw).name in lib2_obj_names + ): + if m_sec.out_sec not in (".text.lib2", ".rodata.lib2"): + errors.append( + f"C2 placement: lib2 map section {m_sec.input_raw}:({m_sec.sec_name}) placed in " + f"{m_sec.out_sec!r} (expected '.text.lib2' or '.rodata.lib2')" + ) + if m_sec.out_sec == ".text.lib2": + mn = node_by_map_id.get(id(m_sec)) + if mn is None or mn.image_idx not in lib2_img_indices: + errors.append( + f"C2 placement (lib2 text): non-lib2 input {m_sec.input_raw}:({m_sec.sec_name}) " + f"inside '.text.lib2'" + ) + elif m_sec.out_sec == ".rodata.lib2": + if m_sec.input_raw == "": + if not ( + m_sec.sec_name.startswith(".rodata.str") + or m_sec.sec_name.startswith(".rodata.cst") + ): + errors.append( + f"C2 placement (lib2 RO): unexpected section {m_sec.sec_name!r} " + f"inside '.rodata.lib2'" + ) + else: + mn = node_by_map_id.get(id(m_sec)) + if mn is None or mn.image_idx not in lib2_img_indices: + errors.append( + f"C2 placement (lib2 RO): non-lib2 input {m_sec.input_raw}:({m_sec.sec_name}) " + f"inside '.rodata.lib2'" + ) + + # Segment & section ordering checks for `.text.lib2` (tail of `:text_b` after `.fini`, `<= :data`) + # and `.rodata.lib2` (in `:ro` PF_R-only segment, 0 RW bytes) + text_b_segs = [ + seg + for seg in elf.segments + if (seg.flags & 0x1) != 0 + and (seg.flags & 0x2) == 0 + and seg.vaddr <= elf.entry < seg.vaddr + seg.memsz + ] + if len(text_b_segs) != 1: + errors.append( + f"C2 placement: expected unique RX `:text_b` PT_LOAD containing e_entry {elf.entry:#x}, " + f"got {len(text_b_segs)}" + ) + else: + tb_seg = text_b_segs[0] + tb_lo = tb_seg.vaddr + tb_hi = tb_seg.vaddr + tb_seg.memsz + data_segs = sorted( + [ + seg + for seg in elf.segments + if (seg.flags & 0x2) != 0 and seg.vaddr >= tb_hi + ], + key=lambda sg: sg.vaddr, + ) + if not data_segs: + errors.append( + f"C2 placement: missing RW `:data` PT_LOAD after `:text_b` end {tb_hi:#x}" + ) + text_lib2_secs = [s for s in elf.sections if s.name == ".text.lib2"] + if len(text_lib2_secs) != 1: + errors.append( + f"C2 placement: expected unique `.text.lib2` section, got {len(text_lib2_secs)}" + ) + else: + tl2 = text_lib2_secs[0] + tl2_lo = tl2.sh_addr + tl2_hi = tl2.sh_addr + tl2.sh_size + if (tl2.sh_flags & elf_inspect.SHF_EXECINSTR) == 0 or ( + tl2.sh_flags & elf_inspect.SHF_WRITE + ) != 0 or tl2.sh_size == 0: + errors.append( + f"C2 placement: `.text.lib2` invalid flags={tl2.sh_flags:#x} size={tl2.sh_size}" + ) + if not (tb_lo <= tl2_lo < tl2_hi <= tb_hi): + errors.append( + f"C2 placement: `.text.lib2` [{tl2_lo:#x}, {tl2_hi:#x}) not inside `:text_b` [{tb_lo:#x}, {tb_hi:#x})" + ) + if data_segs and tl2_hi > data_segs[0].vaddr: + errors.append( + f"C2 placement: `.text.lib2` end {tl2_hi:#x} > `:data` start {data_segs[0].vaddr:#x}" + ) + tb_alloc_secs = sorted( + [ + s + for s in elf.sections + if (s.sh_flags & elf_inspect.SHF_ALLOC) != 0 + and s.sh_size > 0 + and tb_lo <= s.sh_addr < tb_hi + ], + key=lambda s: (s.sh_addr, s.idx), + ) + if not tb_alloc_secs or tb_alloc_secs[-1].name != ".text.lib2": + errors.append( + f"C2 placement: `.text.lib2` must be the last section of `:text_b`, " + f"got {[s.name for s in tb_alloc_secs]}" + ) + fini_map_secs = [ + ms + for ms in lmap.input_sections + if ms.sec_name == ".fini" and tb_lo <= ms.vma < tb_hi and ms.size > 0 + ] + if not fini_map_secs: + errors.append("C2 placement: no `.fini` input section found in `:text_b`") + else: + fini_end = max(ms.vma + ms.size for ms in fini_map_secs) + if tl2_lo < fini_end: + errors.append( + f"C2 placement: `.text.lib2` start {tl2_lo:#x} is before `.fini` end {fini_end:#x}" + ) + + ro_lib2_secs = [s for s in elf.sections if s.name == ".rodata.lib2"] + has_any_lib2_ro_in_objs = any( + (s.sh_flags & elf_inspect.SHF_ALLOC) != 0 and (s.sh_flags & elf_inspect.SHF_EXECINSTR) == 0 and s.sh_size > 0 + for idx in lib2_img_indices + for r in image_records[idx] + if r.obj is not None + for s in r.obj.sections + ) + if lib2_ro_nodes or ro_lib2_secs or has_any_lib2_ro_in_objs: + if len(ro_lib2_secs) != 1: + errors.append( + f"C2 placement (lib2 RO): expected unique `.rodata.lib2` section, got {len(ro_lib2_secs)}" + ) + else: + rl2 = ro_lib2_secs[0] + rl2_lo = rl2.sh_addr + rl2_hi = rl2.sh_addr + rl2.sh_size + if (rl2.sh_flags & elf_inspect.SHF_EXECINSTR) != 0 or rl2.sh_type != elf_inspect.SHT_PROGBITS: + errors.append( + f"C2 placement (lib2 RO): `.rodata.lib2` invalid flags={rl2.sh_flags:#x} type={rl2.sh_type:#x}" + ) + ro_segs = [ + seg + for seg in elf.segments + if seg.vaddr <= rl2_lo and rl2_hi <= seg.vaddr + seg.memsz + ] + if len(ro_segs) != 1 or ro_segs[0].flags != 0x4: + errors.append( + f"C2 placement (lib2 RO): `.rodata.lib2` [{rl2_lo:#x}, {rl2_hi:#x}) must lie in " + f"PF_R-only (`0x4`) `:ro` PT_LOAD, got {[hex(sg.flags) for sg in ro_segs]}" + ) + + # Verify resolved local RO pointers/ADRP+LO12 in `lib2` land inside `.rodata.lib2` + # (catches `SHF_MERGE` `.rodata.str1.1`/`.rodata.cst16` accidentally merged into `.rodata`) + for lnode in lib2_nodes: + p_lo = lnode.map_sec.piece_offset if lnode.map_sec.piece_offset is not None else 0 + p_hi = ( + (p_lo + lnode.map_sec.size) + if lnode.map_sec.piece_offset is not None + else lnode.sec.sh_size + ) + active_rels = [ + rel + for rel in lnode.sec.relocs + if rel.r_type not in elf_inspect.R_AARCH64_NONE_SET + and (lnode.map_sec.piece_offset is None or (p_lo <= rel.r_offset < p_hi)) + ] + for r_idx, rel in enumerate(active_rels): + tsym = lnode.obj.symbols[rel.sym_idx] + if not tsym.is_local or tsym.st_shndx in ( + elf_inspect.SHN_UNDEF, + elf_inspect.SHN_ABS, + elf_inspect.SHN_COMMON, + ): + continue + tsec = lnode.obj.sections[tsym.st_shndx] + if (tsec.sh_flags & elf_inspect.SHF_ALLOC) == 0 or ( + tsec.sh_flags & elf_inspect.SHF_EXECINSTR + ) != 0: + continue + rel_vma = lnode.map_sec.vma + (rel.r_offset - p_lo) + if rel.r_type == 257: # R_AARCH64_ABS64 + (ptr_vma,) = struct.unpack("> 5) & 0x7FFFF) << 2) | ((w_adrp >> 29) & 0x3) + if imm & (1 << 20): + imm -= 1 << 21 + page = (rel_vma & ~0xFFF) + (imm << 12) + lo12 = ((w_lo >> 10) & 0xFFF) << lo_scales[nxt.r_type] + resolved_ro = page + lo12 + if not (rl2_lo <= resolved_ro < rl2_hi): + errors.append( + f"C2 placement (lib2 RO): {lnode.node_id} ADRP+LO12 reloc to {tsec.name!r} " + f"resolved to {resolved_ro:#x} outside `.rodata.lib2` [{rl2_lo:#x}, {rl2_hi:#x})" + ) + + # 0 `lib2` bytes in any writable (`PF_W`) segment + for seg in elf.segments: + if (seg.flags & 0x2) == 0: + continue + seg_lo = seg.vaddr + seg_hi = seg.vaddr + seg.memsz + for lnode in lib2_nodes: + n_lo = lnode.map_sec.vma + n_hi = n_lo + lnode.map_sec.size + if max(seg_lo, n_lo) < min(seg_hi, n_hi): + errors.append( + f"C2 placement (lib2 RW): {lnode.node_id} [{n_lo:#x}, {n_hi:#x}) overlaps " + f"writable PT_LOAD [{seg_lo:#x}, {seg_hi:#x})" + ) + + # Retired stub slots check (applies ONLY to `lib2`-defined roots; 0 slots when 0 `lib2` rows) + raw_retired_slots: list[Any] = [] + if eng_meta is not None and ( + "retiredStubSlots" in eng_meta or "retired_stub_slots" in eng_meta + ): + raw_rs = ( + eng_meta["retiredStubSlots"] + if "retiredStubSlots" in eng_meta + else eng_meta["retired_stub_slots"] + ) + if not isinstance(raw_rs, list): + errors.append("C2 retired slots: `retiredStubSlots` in `stock-link.json` must be a list") + else: + raw_retired_slots = list(raw_rs) + elif cv_meta is not None and ( + "retiredStubSlots" in cv_meta or "retired_stub_slots" in cv_meta + ): + raw_rs = ( + cv_meta["retiredStubSlots"] + if "retiredStubSlots" in cv_meta + else cv_meta["retired_stub_slots"] + ) + if not isinstance(raw_rs, list): + errors.append("C2 retired slots: `retired_stub_slots` in `cv-stock-link.json` must be a list") + else: + raw_retired_slots = list(raw_rs) + + expected_retired_syms = { + x_sym + for x_sym, (wnode, _wrsym, _wesym) in winning_node_by_x.items() + if wnode.image_idx in lib2_img_indices + } + retired_slots_report: list[dict[str, Any]] = [] + retired_vmas: dict[int, str] = {} + seen_retired_syms: set[str] = set() + seen_retired_names: set[str] = set() + seen_retired_secs: set[str] = set() + + for idx_rs, rs_item in enumerate(raw_retired_slots): + if not isinstance(rs_item, Mapping): + errors.append(f"C2 retired slots: entry #{idx_rs} is not an object") + continue + rs_sym = str(rs_item.get("symbol") or "") + rs_ret_sym = str( + rs_item.get("retiredSymbol") or rs_item.get("retired_symbol") or "" + ) + rs_ret_sec = str( + rs_item.get("retiredSection") or rs_item.get("retired_section") or "" + ) + rs_orig_raw = rs_item.get("origAddr") if "origAddr" in rs_item else rs_item.get("orig_addr") + rs_sz_raw = rs_item.get("size", 4) + try: + rs_orig = int(str(rs_orig_raw), 0) + rs_sz = int(rs_sz_raw) + except (TypeError, ValueError): + errors.append( + f"C2 retired slots: invalid `origAddr`/`size` on entry #{idx_rs} ({rs_sym!r}): {rs_orig_raw!r}, {rs_sz_raw!r}" + ) + continue + + if not rs_sym or rs_sym in seen_retired_syms: + errors.append(f"C2 retired slots: missing/duplicate `symbol` {rs_sym!r}") + continue + seen_retired_syms.add(rs_sym) + + if rs_sym in ("memmove", "memcmp", "bcmp", "strlen"): + errors.append( + f"C2 retired slots / D-C2f (2C): libc symbol {rs_sym!r} must NOT have a retired stub slot" + ) + if not re.match(r"^__retired_\d+$", rs_ret_sym) or rs_ret_sym in seen_retired_names: + errors.append( + f"C2 retired slots: invalid/duplicate `retiredSymbol` {rs_ret_sym!r} for {rs_sym!r}" + ) + seen_retired_names.add(rs_ret_sym) + + expected_sec_for_ret = f".text.{rs_ret_sym}" + if rs_ret_sec != expected_sec_for_ret or rs_ret_sec in seen_retired_secs: + errors.append( + f"C2 retired slots: `retiredSection` {rs_ret_sec!r} != {expected_sec_for_ret!r} (or duplicate)" + ) + seen_retired_secs.add(rs_ret_sec) + + if rs_sz != 4 or rs_orig % 4 != 0: + errors.append( + f"C2 retired slots: `{rs_sym}` slot size={rs_sz} origAddr={rs_orig:#x} (expected 4-byte aligned 4 B)" + ) + if rs_sym in elf_inspect.BASELINE_2F20C836_STUB_ADDRS: + base_vma = elf_inspect.BASELINE_2F20C836_STUB_ADDRS[rs_sym] + if rs_orig != base_vma: + errors.append( + f"C2 retired slots: `{rs_sym}` origAddr {rs_orig:#x} != baseline 2f20c836 stub VMA {base_vma:#x}" + ) + if rs_orig in retired_vmas: + errors.append( + f"C2 retired slots: duplicate origAddr {rs_orig:#x} for {rs_sym!r} and {retired_vmas[rs_orig]!r}" + ) + retired_vmas[rs_orig] = rs_sym + + # Check stub_record `.o`: original symbol absent, `.text.__retired_` 4 zero bytes, STB_LOCAL only + assert stub_record.obj is not None + if rs_sym in stub_record.obj.defs_by_name: + errors.append( + f"C2 retired slots: original symbol {rs_sym!r} still defined in {stub_record.name}" + ) + stub_rsecs = [s for s in stub_record.obj.sections if s.name == rs_ret_sec] + if len(stub_rsecs) != 1: + errors.append( + f"C2 retired slots: {stub_record.name} missing unique section {rs_ret_sec!r} (got {len(stub_rsecs)})" + ) + else: + srsec = stub_rsecs[0] + if srsec.sh_size != 4 or srsec.data != b"\x00\x00\x00\x00": + errors.append( + f"C2 retired slots: {stub_record.name}:{rs_ret_sec} expected 4 zero bytes (`udf #0`), " + f"got size={srsec.sh_size} data={srsec.data.hex()}" + ) + active_sr_rels = [ + rel for rel in srsec.relocs if rel.r_type not in elf_inspect.R_AARCH64_NONE_SET + ] + if active_sr_rels: + errors.append( + f"C2 retired slots: {stub_record.name}:{rs_ret_sec} has {len(active_sr_rels)} relocations (expected 0)" + ) + sec_syms = [sym for sym in stub_record.obj.symbols if sym.st_shndx == srsec.idx] + for ssym in sec_syms: + if not ssym.is_local: + errors.append( + f"C2 retired slots: {stub_record.name}:{rs_ret_sec} carries non-local symbol " + f"{ssym.name!r} (bind={ssym.bind})" + ) + if ssym.name and not ssym.name.startswith("$") and ssym.name != rs_ret_sym: + errors.append( + f"C2 retired slots: {stub_record.name}:{rs_ret_sec} carries unexpected symbol {ssym.name!r}" + ) + rnodes = nodes_by_obj_sec.get((stub_record.name, "", srsec.idx), []) + if len(rnodes) != 1: + errors.append( + f"C2 retired slots: {stub_record.name}:{rs_ret_sec} expected 1 retained map node, got {len(rnodes)}" + ) + else: + rn = rnodes[0] + if rn.map_sec.vma != rs_orig or rn.map_sec.size != 4: + errors.append( + f"C2 retired slots: {rn.node_id} placed at {rn.map_sec.vma:#x} (size={rn.map_sec.size}) " + f"!= origAddr {rs_orig:#x} (size=4)" + ) + if b_pre_secs and rn.map_sec.out_sec != ".text.crate": + errors.append( + f"C2 retired slots: {rn.node_id} placed in {rn.map_sec.out_sec!r} (expected '.text.crate')" + ) + incoming_reloc_nodes = sorted( + src_id for src_id, tgts in section_graph.items() if rn.node_id in tgts + ) + if incoming_reloc_nodes: + errors.append( + f"C2 retired slots: {rn.node_id} ({rs_sym!r}) has incoming relocation edge(s) from {incoming_reloc_nodes}" + ) + + # Check final ELF at `[rs_orig, rs_orig + 4)`: `udf #0` (`0x00000000`) and 0 non-local symbols + try: + slot_elf_bytes = elf.read_vma(rs_orig, 4) + except Exception as exc: # noqa: BLE001 + slot_elf_bytes = b"" + errors.append(f"C2 retired slots: failed reading ELF VMA {rs_orig:#x} for {rs_sym!r}: {exc}") + if slot_elf_bytes and slot_elf_bytes != b"\x00\x00\x00\x00": + errors.append( + f"C2 retired slots: ELF bytes at {rs_orig:#x} ({rs_sym!r}) are {slot_elf_bytes.hex()} != 00000000 (`udf #0`)" + ) + for es in elf.symbols: + if es.st_shndx in (elf_inspect.SHN_UNDEF, elf_inspect.SHN_ABS, elf_inspect.SHN_COMMON): + continue + if es.is_local: + continue + es_lo = es.st_value + es_hi = es_lo + max(1, es.st_size) + if max(es_lo, rs_orig) < min(es_hi, rs_orig + 4): + errors.append( + f"C2 retired slots: retired slot {rs_orig:#x} ({rs_sym!r}) carries non-local ELF symbol " + f"{es.name!r} (bind={es.bind}, st_value={es.st_value:#x})" + ) + + retired_slots_report.append({ + "symbol": rs_sym, + "retired_symbol": rs_ret_sym, + "retired_section": rs_ret_sec, + "orig_addr": hex(rs_orig), + "size": rs_sz, + }) + + retired_slots_report.sort(key=lambda d: int(str(d["orig_addr"]), 16)) + if seen_retired_syms != expected_retired_syms: + errors.append( + f"C2 retired slots: declared retired slot symbols {sorted(seen_retired_syms)} != " + f"active lib2 roots {sorted(expected_retired_syms)}" + ) + + # Verify stub_record `.o` has NO undeclared `.text.__retired_*` sections + assert stub_record.obj is not None + undeclared_ret_secs = sorted( + s.name + for s in stub_record.obj.sections + if s.name.startswith(".text.__retired_") and s.name not in seen_retired_secs + ) + if undeclared_ret_secs: + errors.append( + f"C2 retired slots: undeclared `.text.__retired_*` section(s) in {stub_record.name}: {undeclared_ret_secs}" + ) + + # Full RX instruction scan: NO branch instruction anywhere in PF_X segments may target a retired slot VMA + if retired_vmas: + for seg in elf.segments: + if (seg.flags & 0x1) == 0 or seg.filesz < 4: + continue + seg_bytes = elf.read_vma(seg.vaddr, seg.filesz) + n_words = len(seg_bytes) // 4 + for w_idx, (insn_w,) in enumerate(struct.iter_unpack(" 1: - errors.append(f"0f(vi): section {ksec!r} is kept by multiple objects: {kowners}") + errors.append( + f"0f(vi): section {ksec!r} (member {msha_key[:16] or 'unknown'}) is kept by multiple objects: {kowners}" + ) # Exact-name definitions in all non-`rust_extracted` pinned inputs (`R`, non-`rust_extracted` `N`, `S:`) exact_defs_non_re: dict[str, list[str]] = {} @@ -3653,6 +4550,40 @@ def _record_rlib_hits( "member_text_relocs": len(ref_relocs), }) definers_table[s2_key]["byte_equal"] = eq_ok + if s2_key == "memmove": + # D-C2f (2C) / GK row 375: verify every relocated branch word in `memmove` decodes + # word-exact to its resolved target symbol's final ELF VMA (`B memcpy`). + sym_hi = srsym.st_value + int(sesym.st_size) + for mrel in snode.sec.relocs: + if mrel.r_type in elf_inspect.R_AARCH64_NONE_SET: + continue + if not (srsym.st_value <= mrel.r_offset < sym_hi): + continue + msym = snode.obj.symbols[mrel.sym_idx] + if mrel.r_type not in (282, 283) or mrel.r_addend != 0 or msym.is_local: + errors.append( + f"GK row 375 / D-C2f: `memmove` unexpected relocation r_type={mrel.r_type} " + f"sym={msym.name!r} addend={mrel.r_addend}" + ) + continue + if msym.name not in winning_node_by_x: + errors.append( + f"GK row 375 / D-C2f: `memmove` branch target {msym.name!r} missing from `winning_node_by_x`" + ) + continue + mm_vma = sesym.st_value + (mrel.r_offset - srsym.st_value) + (mm_word,) = struct.unpack(" int | None: return (pc_vma + signed_imm * 4) & 0xFFFFFFFFFFFFFFFF +def decode_aarch64_branch_target(word: int, pc_vma: int) -> int | None: + """Decode any PC-relative AArch64 direct branch (`B`, `BL`, `B.cond`/`BC.cond`, `CBZ`/`CBNZ`, `TBZ`/`TBNZ`).""" + # Unconditional `B` (`0x14000000`) or `BL` (`0x94000000`) + if (word & 0x7C000000) == 0x14000000: + imm26 = word & 0x03FFFFFF + signed_imm = (imm26 - 0x04000000) if (imm26 & 0x02000000) else imm26 + return (pc_vma + signed_imm * 4) & 0xFFFFFFFFFFFFFFFF + # Conditional `B.cond` / `BC.cond` (`0x54000000`) or `CBZ` / `CBNZ` (`0x34000000` / `0xB4000000`) + if (word & 0xFF000000) == 0x54000000 or (word & 0x7E000000) == 0x34000000: + imm19 = (word >> 5) & 0x7FFFF + signed_imm = (imm19 - 0x80000) if (imm19 & 0x40000) else imm19 + return (pc_vma + signed_imm * 4) & 0xFFFFFFFFFFFFFFFF + # Test-bit `TBZ` / `TBNZ` (`0x36000000` / `0xB6000000`) + if (word & 0x7E000000) == 0x36000000: + imm14 = (word >> 5) & 0x3FFF + signed_imm = (imm14 - 0x4000) if (imm14 & 0x2000) else imm14 + return (pc_vma + signed_imm * 4) & 0xFFFFFFFFFFFFFFFF + return None + + def format_section_relocs(obj: RelocObject, sec: RelSection) -> list[dict[str, object]]: """Return canonical sorted relocation list for `sec` in `obj` (GK row 375 lock format).""" rows: list[dict[str, object]] = [] @@ -2147,72 +2252,422 @@ def is_failstop_z_symbol( return raw_or_demangled in fset or dem in fset -_LEAN_ABBREV_STR_RE = re.compile(r"(?:abbrev|def)\s+([A-Za-z0-9_']+)\s*:\s*String\s*:=\s*\"([^\"]+)\"") -_LEAN_TUPLE_ENTRY_RE = re.compile(r'\(\s*(?:"([^"]+)"|([A-Za-z0-9_\']+))\s*,') -_LEAN_LIST_STR_RE = re.compile(r'"([^"]+)"') +@dataclass(frozen=True) +class CliBinaryPqTables: + """Count-agnostic parsed tables from `LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean`.""" + hooks: tuple[str, ...] + hook_set: frozenset[str] + dehooked: tuple[str, ...] + dehooked_set: frozenset[str] + panics: tuple[str, ...] + panic_set: frozenset[str] + pq_lean_path: str + pq_lean_sha256: str -def load_cli_hook_and_panic_tables( - repo_root: pathlib.Path | None = None, -) -> tuple[frozenset[str], frozenset[str]]: - """Load `cliHookTablePlaced` and `cliPanicSymbolsPlaced` from `CliBinaryPq.lean` when present, - failing closed if they drift from `DEFAULT_CLI_HOOK_TABLE_PLACED` / `DEFAULT_CLI_PANIC_SYMBOLS_PLACED`.""" - if repo_root is None: - return DEFAULT_CLI_HOOK_TABLE_PLACED, DEFAULT_CLI_PANIC_SYMBOLS_PLACED - pq_lean = repo_root / "LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean" - if not pq_lean.is_file(): - return DEFAULT_CLI_HOOK_TABLE_PLACED, DEFAULT_CLI_PANIC_SYMBOLS_PLACED - code_only = "\n".join(line for _, line in strip_lean_comments(pq_lean.read_text(encoding="utf-8"))) - abbrev_map: dict[str, str] = { - m.group(1): m.group(2) for m in _LEAN_ABBREV_STR_RE.finditer(code_only) - } - m_pq = re.search( - r"(?:noncomputable\s+)?def\s+cliPqxdhHookTablePlaced\b.*?:=\s*\[\s*(.*?)\s*\]\s*(?:noncomputable\s+)?def\s+cliHookTablePlaced\b", - code_only, - re.S, +_LEAN_ABBREV_STR_RE = re.compile( + r"(?:^|\n)\s*(?:private\s+|protected\s+)?(?:abbrev|def)\s+([A-Za-z0-9_']+)\s*(?::\s*String)?\s*:=\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"" +) +_LEAN_IDENT_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_']*$") +_LEAN_TOP_CMD_RE = re.compile( + r"(?:noncomputable|def|abbrev|theorem|lemma|private|protected|namespace|end|section|open|set_option|structure|inductive|class|instance|opaque|axiom|mutual|variable|#|@\[)(?:\b|$)" +) + + +def _scan_balanced_lean(text: str, start_idx: int, open_ch: str, close_ch: str, source: str) -> tuple[str, int]: + """Scan balanced `open_ch ... close_ch` starting at `text[start_idx] == open_ch` (respecting string literals).""" + if start_idx >= len(text) or text[start_idx] != open_ch: + raise ValueError(f"{source}: expected {open_ch!r} at offset {start_idx}") + i = start_idx + 1 + n = len(text) + depth = 1 + in_str = False + escape = False + while i < n: + ch = text[i] + if in_str: + if escape: + escape = False + elif ch == "\\": + escape = True + elif ch == '"': + in_str = False + i += 1 + continue + if ch == '"': + in_str = True + elif ch == open_ch: + depth += 1 + elif ch == close_ch: + depth -= 1 + if depth == 0: + return text[start_idx + 1 : i], i + 1 + i += 1 + raise ValueError(f"{source}: unterminated {open_ch!r}..{close_ch!r} block") + + +def _split_top_level_comma(inner: str, source: str) -> list[str]: + """Split `inner` by top-level `,` outside `(...)`, `[...]`, `{...}`, and string literals.""" + items: list[str] = [] + cur: list[str] = [] + depth = 0 + in_str = False + escape = False + for ch in inner: + if in_str: + cur.append(ch) + if escape: + escape = False + elif ch == "\\": + escape = True + elif ch == '"': + in_str = False + continue + if ch == '"': + in_str = True + cur.append(ch) + elif ch in "([{": + depth += 1 + cur.append(ch) + elif ch in ")]}": + depth -= 1 + if depth < 0: + raise ValueError(f"{source}: unbalanced closing bracket {ch!r}") + cur.append(ch) + elif ch == "," and depth == 0: + tok = "".join(cur).strip() + if tok: + items.append(tok) + cur = [] + else: + cur.append(ch) + if in_str or depth != 0: + raise ValueError(f"{source}: unbalanced quotes or brackets inside list") + tail = "".join(cur).strip() + if tail: + items.append(tail) + return items + + +def _resolve_lean_str_atom(atom: str, abbrev_map: dict[str, str], source: str, ctx: str) -> str: + """Resolve a Lean `String` list key (`"..."` literal or `abbrev` identifier), failing closed.""" + s = atom.strip() + if len(s) >= 2 and s[0] == '"' and s[-1] == '"': + inner = s[1:-1] + if '"' in inner or "\\" in inner or "\n" in inner: + raise ValueError(f"{source}: unsupported escape or quote in string literal {s!r} in `{ctx}`") + return inner + if _LEAN_IDENT_RE.match(s): + if s not in abbrev_map: + raise ValueError(f"{source}: unknown String abbrev `{s}` in `{ctx}`") + return abbrev_map[s] + raise ValueError(f"{source}: malformed String entry {s!r} in `{ctx}`") + + +def _extract_lean_list_rhs_segments( + code: str, + def_name: str, + source: str, + *, + required: bool = True, +) -> list[tuple[str, str]] | None: + """Locate `def|abbrev ... := (++ )*` and return `[('list', inner) | ('ref', ident), ...]`.""" + matches = list( + re.finditer( + rf"(?:^|\n)[ \t]*(?:noncomputable\s+)?(?:def|abbrev)\s+{re.escape(def_name)}\b", + code, + ) ) - m_cli = re.search( - r"(?:noncomputable\s+)?def\s+cliHookTablePlaced\b.*?:=\s*cliPqxdhHookTablePlaced[^\[]*\+\+\s*\[\s*(.*?)\s*\]\s*(?:noncomputable\s+)?(?:def\s+|abbrev\s+)", - code_only, - re.S, + if not matches: + if required: + raise ValueError(f"{source}: missing `def {def_name}`") + return None + if len(matches) > 1: + raise ValueError(f"{source}: duplicate `def {def_name}` ({len(matches)} definitions)") + + # Scan signature past `:=` at bracket depth 0 + i = matches[0].end() + n = len(code) + depth = 0 + in_str = False + escape = False + after_eq = -1 + while i < n: + ch = code[i] + if in_str: + if escape: + escape = False + elif ch == "\\": + escape = True + elif ch == '"': + in_str = False + i += 1 + continue + if ch == '"': + in_str = True + elif ch in "([{": + depth += 1 + elif ch in ")]}": + depth -= 1 + if depth < 0: + raise ValueError(f"{source}: unbalanced {ch!r} in `def {def_name}` signature") + elif depth == 0 and code[i : i + 2] == ":=": + after_eq = i + 2 + break + elif depth == 0 and ch == "\n": + nxt_line = code[i + 1 :].lstrip(" \t") + if _LEAN_TOP_CMD_RE.match(nxt_line): + break + i += 1 + if after_eq < 0: + raise ValueError(f"{source}: missing `:=` in `def {def_name}`") + + pos = after_eq + segments: list[tuple[str, str]] = [] + while True: + while pos < n and code[pos] in " \t\r\n": + pos += 1 + if pos >= n: + raise ValueError(f"{source}: unexpected EOF in `def {def_name}`") + + if code[pos] == "[": + inner, pos = _scan_balanced_lean(code, pos, "[", "]", f"{source}:{def_name}") + segments.append(("list", inner)) + else: + m_id = re.match(r"[A-Za-z_][A-Za-z0-9_']*", code[pos:]) + if not m_id: + raise ValueError( + f"{source}: unexpected token in `def {def_name}` near {code[pos : pos + 40]!r}" + ) + ref_ident = m_id.group(0) + pos += len(ref_ident) + # Consume call arguments up to top-level `++`, newline before top-level command, or EOF + arg_depth = 0 + arg_str = False + arg_esc = False + while pos < n: + ch = code[pos] + if arg_str: + if arg_esc: + arg_esc = False + elif ch == "\\": + arg_esc = True + elif ch == '"': + arg_str = False + pos += 1 + continue + if ch == '"': + arg_str = True + pos += 1 + elif ch in "([{": + arg_depth += 1 + pos += 1 + elif ch in ")]}": + arg_depth -= 1 + if arg_depth < 0: + raise ValueError(f"{source}: unbalanced {ch!r} in `def {def_name}`") + pos += 1 + elif arg_depth == 0 and code[pos : pos + 2] == "++": + break + elif arg_depth == 0 and ch == "\n": + rem = code[pos + 1 :].lstrip(" \t\r\n") + if not rem or _LEAN_TOP_CMD_RE.match(rem): + break + pos += 1 + else: + pos += 1 + if arg_str or arg_depth != 0: + raise ValueError(f"{source}: unterminated expression in `def {def_name}`") + segments.append(("ref", ref_ident)) + + ws_start = pos + while pos < n and code[pos] in " \t\r\n": + pos += 1 + if pos < n and code[pos : pos + 2] == "++": + pos += 2 + continue + if pos == n: + break + had_nl = "\n" in code[ws_start:pos] + if had_nl and _LEAN_TOP_CMD_RE.match(code[pos:]): + break + raise ValueError( + f"{source}: unexpected trailing expression in `def {def_name}` near {code[pos : pos + 40]!r}" + ) + + if not segments: + raise ValueError(f"{source}: empty RHS in `def {def_name}`") + return segments + + +def _parse_lean_string_list_segments( + segments: Sequence[tuple[str, str]], + abbrev_map: dict[str, str], + known_lists: dict[str, list[str]], + source: str, + def_name: str, +) -> list[str]: + out: list[str] = [] + for kind, payload in segments: + if kind == "ref": + if payload not in known_lists: + raise ValueError(f"{source}: unsupported list reference `{payload}` in `def {def_name}`") + out.extend(known_lists[payload]) + else: + for item in _split_top_level_comma(payload, f"{source}:{def_name}"): + out.append(_resolve_lean_str_atom(item, abbrev_map, source, def_name)) + return out + + +def _parse_lean_pair_key_segments( + segments: Sequence[tuple[str, str]], + abbrev_map: dict[str, str], + known_pair_keys: dict[str, list[str]], + source: str, + def_name: str, +) -> list[str]: + out: list[str] = [] + for kind, payload in segments: + if kind == "ref": + if payload not in known_pair_keys: + raise ValueError(f"{source}: unsupported hook-table reference `{payload}` in `def {def_name}`") + out.extend(known_pair_keys[payload]) + else: + for item in _split_top_level_comma(payload, f"{source}:{def_name}"): + s = item.strip() + if not (s.startswith("(") and s.endswith(")")): + raise ValueError(f"{source}: expected `(key, hook)` tuple in `def {def_name}`, got {s!r}") + pair_inner, end_idx = _scan_balanced_lean(s, 0, "(", ")", f"{source}:{def_name}") + if end_idx != len(s): + raise ValueError(f"{source}: malformed tuple {s!r} in `def {def_name}`") + parts = _split_top_level_comma(pair_inner, f"{source}:{def_name}") + if len(parts) < 2 or not parts[1].strip(): + raise ValueError(f"{source}: expected `(key, hook)` pair in `def {def_name}`, got {s!r}") + out.append(_resolve_lean_str_atom(parts[0], abbrev_map, source, def_name)) + return out + + +def _ensure_unique_entries(items: Sequence[str], source: str, def_name: str) -> None: + seen: set[str] = set() + dups: list[str] = [] + for x in items: + if x in seen and x not in dups: + dups.append(x) + seen.add(x) + if dups: + raise ValueError(f"{source}: duplicate symbol(s) in `{def_name}`: {dups}") + + +def parse_cli_binary_pq_text( + text: str, + source: str = "", + *, + raw_sha256: str | None = None, +) -> CliBinaryPqTables: + """Count-agnostic, fail-closed parser for `cliHookTablePlaced`, `cliDehookedSymsPlaced`, + and `cliPanicSymbolsPlaced` in `CliBinaryPq.lean` (shared by `cli-elf-stock` and `alink_check`).""" + digest = raw_sha256 if raw_sha256 is not None else sha256_bytes(text.encode("utf-8")) + code_only = "\n".join(line for _, line in strip_lean_comments(text)) + + abbrev_map: dict[str, str] = {} + for m in _LEAN_ABBREV_STR_RE.finditer(code_only): + ident, val = m.group(1), m.group(2) + if '"' in val or "\\" in val or "\n" in val: + raise ValueError(f"{source}: unsupported escape in `abbrev {ident}`: {val!r}") + if ident in abbrev_map and abbrev_map[ident] != val: + raise ValueError(f"{source}: conflicting String definitions for `{ident}`") + abbrev_map[ident] = val + + dehooked_segs = _extract_lean_list_rhs_segments(code_only, "cliDehookedSymsPlaced", source, required=True) + assert dehooked_segs is not None + dehooked_list = _parse_lean_string_list_segments( + dehooked_segs, abbrev_map, {}, source, "cliDehookedSymsPlaced" + ) + + known_pair_tables: dict[str, list[str]] = {} + pq_segs = _extract_lean_list_rhs_segments(code_only, "cliPqxdhHookTablePlaced", source, required=False) + if pq_segs is not None: + pq_keys = _parse_lean_pair_key_segments( + pq_segs, abbrev_map, {}, source, "cliPqxdhHookTablePlaced" + ) + _ensure_unique_entries(pq_keys, source, "cliPqxdhHookTablePlaced") + known_pair_tables["cliPqxdhHookTablePlaced"] = pq_keys + + hook_segs = _extract_lean_list_rhs_segments(code_only, "cliHookTablePlaced", source, required=True) + assert hook_segs is not None + hook_list = _parse_lean_pair_key_segments( + hook_segs, abbrev_map, known_pair_tables, source, "cliHookTablePlaced" ) - m_pan = re.search( - r"(?:noncomputable\s+)?def\s+cliPanicSymbolsPlaced\b.*?:=\s*\[\s*(.*?)\s*\]\s*(?:noncomputable\s+)?(?:def\s+|abbrev\s+)", - code_only, - re.S, + + panic_segs = _extract_lean_list_rhs_segments(code_only, "cliPanicSymbolsPlaced", source, required=True) + assert panic_segs is not None + panic_list = _parse_lean_string_list_segments( + panic_segs, abbrev_map, {}, source, "cliPanicSymbolsPlaced" ) - if not (m_pq and m_cli and m_pan): - raise ValueError(f"{pq_lean}: failed to parse `cliHookTablePlaced` / `cliPanicSymbolsPlaced`") - - hook_list: list[str] = [] - for block_str in (m_pq.group(1), m_cli.group(1)): - for m_ent in _LEAN_TUPLE_ENTRY_RE.finditer(block_str): - lit_val, ident_val = m_ent.group(1), m_ent.group(2) - if lit_val is not None: - hook_list.append(lit_val) - else: - if ident_val not in abbrev_map: - raise ValueError(f"{pq_lean}: unknown String abbrev `{ident_val}` in hook table") - hook_list.append(abbrev_map[ident_val]) - - hooks = frozenset(hook_list) - panics = frozenset(_LEAN_LIST_STR_RE.findall(m_pan.group(1))) - if hooks != DEFAULT_CLI_HOOK_TABLE_PLACED: - added = sorted(hooks - DEFAULT_CLI_HOOK_TABLE_PLACED) - removed = sorted(DEFAULT_CLI_HOOK_TABLE_PLACED - hooks) + + if not hook_list: + raise ValueError(f"{source}: `cliHookTablePlaced` parsed as empty") + if not panic_list: + raise ValueError(f"{source}: `cliPanicSymbolsPlaced` parsed as empty") + + _ensure_unique_entries(hook_list, source, "cliHookTablePlaced") + _ensure_unique_entries(dehooked_list, source, "cliDehookedSymsPlaced") + _ensure_unique_entries(panic_list, source, "cliPanicSymbolsPlaced") + + hook_set = frozenset(hook_list) + dehooked_set = frozenset(dehooked_list) + panic_set = frozenset(panic_list) + + if hook_set & dehooked_set: raise ValueError( - f"{pq_lean}: `cliHookTablePlaced` drifted from `DEFAULT_CLI_HOOK_TABLE_PLACED` " - f"(added={added}, removed={removed})" + f"{source}: `cliHookTablePlaced` and `cliDehookedSymsPlaced` overlap: {sorted(hook_set & dehooked_set)}" ) - if panics != DEFAULT_CLI_PANIC_SYMBOLS_PLACED: - added = sorted(panics - DEFAULT_CLI_PANIC_SYMBOLS_PLACED) - removed = sorted(DEFAULT_CLI_PANIC_SYMBOLS_PLACED - panics) + if hook_set & panic_set: raise ValueError( - f"{pq_lean}: `cliPanicSymbolsPlaced` drifted from `DEFAULT_CLI_PANIC_SYMBOLS_PLACED` " - f"(added={added}, removed={removed})" + f"{source}: `cliHookTablePlaced` and `cliPanicSymbolsPlaced` overlap: {sorted(hook_set & panic_set)}" ) - return hooks, panics + if dehooked_set & panic_set: + raise ValueError( + f"{source}: `cliDehookedSymsPlaced` and `cliPanicSymbolsPlaced` overlap: {sorted(dehooked_set & panic_set)}" + ) + + return CliBinaryPqTables( + hooks=tuple(hook_list), + hook_set=hook_set, + dehooked=tuple(dehooked_list), + dehooked_set=dehooked_set, + panics=tuple(panic_list), + panic_set=panic_set, + pq_lean_path=str(source), + pq_lean_sha256=digest, + ) + + +def load_cli_binary_pq_tables(repo_root: pathlib.Path) -> CliBinaryPqTables: + """Load `CliBinaryPqTables` from `/LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean`.""" + pq_lean = (repo_root / "LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean").resolve() + if not pq_lean.is_file(): + raise FileNotFoundError(f"trusted `CliBinaryPq.lean` missing: {pq_lean}") + raw_bytes = pq_lean.read_bytes() + return parse_cli_binary_pq_text( + raw_bytes.decode("utf-8"), + str(pq_lean), + raw_sha256=sha256_bytes(raw_bytes), + ) + + +def load_cli_hook_and_panic_tables( + repo_root: pathlib.Path | None = None, +) -> tuple[frozenset[str], frozenset[str]]: + """Load `cliHookTablePlaced` and `cliPanicSymbolsPlaced` from `CliBinaryPq.lean` when present.""" + if repo_root is None: + return DEFAULT_CLI_HOOK_TABLE_PLACED, DEFAULT_CLI_PANIC_SYMBOLS_PLACED + pq_lean = repo_root / "LibsignalBinary/Specifications/SignalSession/CliBinaryPq.lean" + if not pq_lean.is_file(): + return DEFAULT_CLI_HOOK_TABLE_PLACED, DEFAULT_CLI_PANIC_SYMBOLS_PLACED + tables = load_cli_binary_pq_tables(repo_root) + return tables.hook_set, tables.panic_set def load_config_declared_exports(repo_root: pathlib.Path, config_rel_path: str) -> list[str]: diff --git a/third_party/libsignal/libsignal-session/cli-elf/inputs.lock b/third_party/libsignal/libsignal-session/cli-elf/inputs.lock deleted file mode 100644 index 0a66f62bc..000000000 --- a/third_party/libsignal/libsignal-session/cli-elf/inputs.lock +++ /dev/null @@ -1,79 +0,0 @@ -# Legacy D6 snapshot-mutant base link lock (retired from the shipped `libsignal-cli` ELF). -# Consumed ONLY by `scripts/cli-elf` snapshot mode and `scripts/bug_injection.py` (`build_mutant_elf`). -# -# NOTE: The shipped `.GeneratedLean/cli-elf/libsignal-cli.elf` (pinned in -# `LibsignalBinary/Specifications/SignalSession/CliElf.lean`) is built with stock `ld.lld` by -# `scripts/cli-elf-stock --stdbin` from `cli-elf/stock/inputs_stock_stdbin.lock` + `m4_stock.lock`. -snapshot_mutant_only = true - -rustc_version = "1.98.1" -lld_version_prefix = "LLD 22.1.8 " -zig_version = "0.16.0" -libsignal_tag = "v0.105.4" - -# `arm64-semantics/scripts/fetch-upstream-sources.sh musl-string` archive pin (musl 1.2.5) -musl_tarball_name = "musl-1.2.5.tar.gz" -musl_tarball_sha256 = "a9a118bbe84d8764da0ea0d28b3ab3fae8477fc7e4085d90102b8596fc7c75e4" - -# Zero-unsafe, zero-`build.rs` `StdBin` harness crate (`snapshot-link --main-rust`, `self-contained/libc.a` mallocng) -main_rust_manifest = "third_party/libsignal/libsignal-session/cli-elf/std-main/Cargo.toml" -main_rust_manifest_sha256 = "a37b4f59c7255c070a56e8004b376d994670edb16d1497fe84da533079f1f999" -main_rust_lock_path = "third_party/libsignal/libsignal-session/cli-elf/std-main/Cargo.lock" -main_rust_lock_sha256 = "52c5d4e8130d50403c27acf71296a7f96c1d1bc97d963f9d25c2c1224297ef19" -main_rust_src_path = "third_party/libsignal/libsignal-session/cli-elf/std-main/src/main.rs" -main_rust_src_sha256 = "2a701cea94f482bc49fcbaf27358fa2d072ae7922175f7da22b34484756292fd" - -# Stock `rustc 1.98.1` `std::sys::alloc::unix` global-allocator shims with co-located 1-hop `__rust_*` symbols, -# plus `#976` (`72913f0d92`) `SignalSessionIoPlacedObj` bounded `read_file` / `read_stdin` C-ABI loops (`signal_session_io.S`). -rdl_shim_path = "third_party/libsignal/libsignal-session/cli-elf/rdl_shim.S" -rdl_shim_sha256 = "4bcf5875bb22e61dd02c6efb50fe7dc798060e2b9fdf7856031b15125fe8f5f3" -signal_session_io_path = "third_party/libsignal/libsignal-session/cli-elf/signal_session_io.S" -signal_session_io_sha256 = "f2b5bad1e930dad6824b4e699a0b701d9ed99cb4e403ba495a6f6c4ada76558c" - -# `rust-obj2lean` / `snapshot-link` image configuration and D2 `page_separate_data = true` outputs (624 blocks, SC-1 Route I-append) -config_path = "third_party/libsignal/libsignal-session/translation.toml" -page_separate_data = true -image_code_size = 558920 -image_code_sha256 = "16cd5e9075435b73c8e2be75ebca73a6cb7008a5f0344409bb010d39bb1b19f1" -image_data_size = 69720 -image_data_sha256 = "0e8093490a0d027bfc714e38f6f8b5bf2b36e9dbbb867f9f7b2370ddb34f4137" - -# `cli/io` placed export manifest pins (`SignalSessionIoIndex.json` + `SignalSessionIoPlacedObj.{lean,bin}`) -io_placed_lean_path = ".GeneratedLean/GeneratedLean/SignalSessionIoPlacedObj.lean" -io_placed_bin_path = ".GeneratedLean/GeneratedLean/SignalSessionIoPlacedObj.bin" -io_placed_bin_size = 1664 -io_placed_bin_sha256 = "d807ad1db41c5c282c08ac315c6e0d6aa2c8fbd7305723af1901051b12531d9b" -io_index_path = ".GeneratedLean/GeneratedLean/SignalSessionIoIndex.json" - -# `snapshot-link` layout and native musl-string + `rdl_shim` + `signal_session_io` parameters (F3 mallocng + T3 IO + SC-1 Route I-append): -# `memcpy` and `memset` are omitted from `native_only` so `rustc 1.98.1`'s `self-contained/libc.a` -# supplies `mallocng` blocks `memcpy` and `memset`. -base = 0x400000 -stubs = "zero" -expected_stub_count = 139 -musl_string = true -musl_string_config_path = "third_party/libsignal/libsignal-session/cli-elf/musl_string_native.toml" -musl_string_config_sha256 = "d9d233a2e518a9fe5d6f48f5f4955c12b5c954ff232f9cce58a7e43f151c968f" -branch_stubs = [ - "_RNvCs1njKG4L9aB3_7___rustc12___rust_alloc", - "_RNvCs1njKG4L9aB3_7___rustc14___rust_dealloc", - "_RNvCs1njKG4L9aB3_7___rustc14___rust_realloc", - "_RNvCs1njKG4L9aB3_7___rustc19___rust_alloc_zeroed", - "_RNvCs1njKG4L9aB3_7___rustc35___rust_no_alloc_shim_is_unstable_v2", - "_RNvCs9Xul1Kjr0QF_16libsignal_cli_io9read_file", - "_RNvCs9Xul1Kjr0QF_16libsignal_cli_io10read_stdin", - "memcpy", - "memset", -] -# Note (GK R-c): `"signal_session_io"` names the legacy `[targets.signal_session_io]` `.S` -# assembly target (`cli-elf/signal_session_io.S`, calling `bl __snapstub_17`) in -# `musl_string_native.toml`, retired from the shipped `libsignal-cli` stock build (which links -# the `libsignal-cli-io` crate object directly) and retained here solely for D6 snapshot mutants. -native_only = ["memmove", "memcmp", "bcmp", "rdl_shim", "signal_session_io"] -strip_runtime_debug = true - -# Pinned `arm64-semantics` submodule commit (engine v0.51.2) and F3 CLI ELF size + SHA-256. -engine_commit = "c2ef2f44e5988bf39d73cbf7fb5c784417818bd3" -arm64_semantics_commit = "c2ef2f44e5988bf39d73cbf7fb5c784417818bd3" -elf_size = 981608 -elf_sha256 = "e35abe2a39b292d0aa181acab357b1d4335f6bbd2d156619ae299241a8384020" diff --git a/third_party/libsignal/libsignal-session/cli-elf/main_cli.c b/third_party/libsignal/libsignal-session/cli-elf/main_cli.c deleted file mode 100644 index cf3ce3016..000000000 --- a/third_party/libsignal/libsignal-session/cli-elf/main_cli.c +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2026 Google LLC -// -// All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and -// limitations under the License. - -/* Weak placeholder: snapshot-link's musl-discovery probe links main.o alone and needs `main`. - * With `--native-objects` / `--musl-string`, musl's verified `memcpy`/`memset`/`memmove`/ - * `memcmp`/`bcmp` `.o` files are placed directly after `main.o` and before archives, so `ld.lld` - * resolves musl's `__init_tls` to musl's own `memcpy` without pulling `libcompiler_rt.a`'s - * monolithic `mem*` archive member. In the real link the image's strong global `main` (the - * CLI's `#[no_mangle] extern "C" fn main`) overrides this weak stub. */ -__attribute__((weak)) int main(void) { - return 0; -} diff --git a/third_party/libsignal/libsignal-session/cli-elf/musl_string_native.toml b/third_party/libsignal/libsignal-session/cli-elf/musl_string_native.toml deleted file mode 100644 index c2d934aad..000000000 --- a/third_party/libsignal/libsignal-session/cli-elf/musl_string_native.toml +++ /dev/null @@ -1,136 +0,0 @@ -# Translation configuration for upstream `musl` v1.2.5 AArch64 memory/string primitives -# (`src/string/aarch64/memcpy.S`, `src/string/aarch64/memset.S`, `src/string/memmove.c`, -# `src/string/memcmp.c`, `src/string/bcmp.c`, `src/string/memchr.c`, `src/string/memrchr.c`, -# `src/string/memccpy.c`, `src/string/mempcpy.c`, and `src/string/memmem.c`), -# plus F3 `rdl_shim.S` (`rustc 1.98.1` `std::sys::alloc::unix` global-allocator shims). - -obj_name = "muslString" -title = "musl v1.2.5 AArch64 memory primitives (`src/string/`)" -hashed_inputs = [ - "string-include/features.h", - "string-include/string.h", - "rdl_shim.S", - "signal_session_io.S", - "../../third_party/musl-1.2.5/upstream/src/string/aarch64/memcpy.S", - "../../third_party/musl-1.2.5/upstream/src/string/aarch64/memset.S", - "../../third_party/musl-1.2.5/upstream/src/string/memmove.c", - "../../third_party/musl-1.2.5/upstream/src/string/memcmp.c", - "../../third_party/musl-1.2.5/upstream/src/string/bcmp.c", - "../../third_party/musl-1.2.5/upstream/src/string/memchr.c", - "../../third_party/musl-1.2.5/upstream/src/string/memrchr.c", - "../../third_party/musl-1.2.5/upstream/src/string/memccpy.c", - "../../third_party/musl-1.2.5/upstream/src/string/mempcpy.c", - "../../third_party/musl-1.2.5/upstream/src/string/memmem.c", -] -license_header = [ - "Copyright (c) 2005-2020 Rich Felker, et al.", - "Copyright (c) 2015-2018 ARM Limited.", - "Licensed under the MIT license (musl v1.2.5, see `third_party/musl-1.2.5/COPYRIGHT`).", -] - -[native_compiler] -zig_version = "0.16.0" - -[[native_objects]] -name = "memcpy" -source = "../../third_party/musl-1.2.5/upstream/src/string/aarch64/memcpy.S" - -[[native_objects]] -name = "memset" -source = "../../third_party/musl-1.2.5/upstream/src/string/aarch64/memset.S" - -[[native_objects]] -name = "memmove" -source = "../../third_party/musl-1.2.5/upstream/src/string/memmove.c" -include_dirs = ["string-include"] -c_flags = ["-fno-builtin"] - -[[native_objects]] -name = "memcmp" -source = "../../third_party/musl-1.2.5/upstream/src/string/memcmp.c" -include_dirs = ["string-include"] -c_flags = ["-fno-builtin"] - -[[native_objects]] -name = "bcmp" -source = "../../third_party/musl-1.2.5/upstream/src/string/bcmp.c" -include_dirs = ["string-include"] -c_flags = ["-fno-builtin"] - -[[native_objects]] -name = "memchr" -source = "../../third_party/musl-1.2.5/upstream/src/string/memchr.c" -include_dirs = ["string-include"] -c_flags = ["-fno-builtin"] - -[[native_objects]] -name = "memrchr" -source = "../../third_party/musl-1.2.5/upstream/src/string/memrchr.c" -include_dirs = ["string-include"] -c_flags = ["-fno-builtin"] - -[[native_objects]] -name = "memccpy" -source = "../../third_party/musl-1.2.5/upstream/src/string/memccpy.c" -include_dirs = ["string-include"] -c_flags = ["-fno-builtin"] - -[[native_objects]] -name = "mempcpy" -source = "../../third_party/musl-1.2.5/upstream/src/string/mempcpy.c" -include_dirs = ["string-include"] -c_flags = ["-fno-builtin"] - -[[native_objects]] -name = "memmem" -source = "../../third_party/musl-1.2.5/upstream/src/string/memmem.c" -include_dirs = ["string-include"] -c_flags = ["-fno-builtin"] - -[[targets]] -name = "musl_string" -lean_file = "Examples/Generated/MuslStringFns.lean" -sub_namespace = "MuslString" -prog_name = "muslStringBin" -title = "musl v1.2.5 AArch64 memory primitives (`src/string/`)" -lemma_allowlist = [ - "memcpy", - "memset", - "memmove", - "memcmp", - "bcmp", - "memchr", - "__memrchr", - "memrchr", - "memccpy", - "mempcpy", - "memmem", - "twobyte_memmem \\[memmem\\]", - "threebyte_memmem \\[memmem\\]", - "fourbyte_memmem \\[memmem\\]", - "twoway_memmem \\[memmem\\]", -] - -[placed] -placed_only = true -exports = [ - "memcpy", - "memset", - "memmove", - "memcmp", - "bcmp", - "memchr", - "__memrchr", - "memrchr", - "memccpy", - "mempcpy", - "memmem", -] - -[[native_objects]] -name = "rdl_shim" -source = "rdl_shim.S" - -[[native_objects]] -name = "signal_session_io" -source = "signal_session_io.S" diff --git a/third_party/libsignal/libsignal-session/cli-elf/signal_session_io.S b/third_party/libsignal/libsignal-session/cli-elf/signal_session_io.S deleted file mode 100644 index 6f186a209..000000000 --- a/third_party/libsignal/libsignal-session/cli-elf/signal_session_io.S +++ /dev/null @@ -1,454 +0,0 @@ -// Copyright 2026 Google LLC -// -// All code is licensed under the Apache License, Version 2.0 (the "Apache 2.0"); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and -// limitations under the License. -// -// Machine code compiled from `third_party/libsignal/libsignal-session/cli/io/src/lib.rs` -// (Google-authored; copies no upstream `libsignal` source), plus inlined Rust `core`/`alloc` -// code under MIT OR Apache-2.0. See `third_party/libsignal/README.md`. -// -// Generated deterministically by `./scripts/cli-elf --render-io-asm` from SignalSessionIoPlacedObj.{lean,bin}. -// DO NOT EDIT BY HAND; CI verifies `--check-io-asm` produces an empty diff (SR-48(a)). -.section .text.signal_session_io_all,"ax",@progbits -.p2align 2 -.globl _RNvCs9Xul1Kjr0QF_16libsignal_cli_io10read_stdin -.type _RNvCs9Xul1Kjr0QF_16libsignal_cli_io10read_stdin, @function -_RNvCs9Xul1Kjr0QF_16libsignal_cli_io10read_stdin: - .inst 0xa9ba7bfd - .inst 0xa9016ffc - .inst 0xa90267fa - .inst 0xa9035ff8 - .inst 0xa90457f6 - .inst 0xa9054ff4 - .inst 0x910003fd - .inst 0xd14007ff - .inst 0xf81e07ff - .inst 0x5280003b - .inst 0xaa0803f3 - .inst 0xaa1f03f5 - .inst 0xaa1f03f9 - .inst 0x52800034 - .inst 0x52820018 - .inst 0x52a0021a - .inst 0x72a0021b - .inst 0x52820017 - .inst 0x910003e1 - .inst 0x2a1f03e0 - .inst 0xaa1703e2 - bl read - .inst 0xb4000700 - .inst 0xb6f800c0 - bl __errno_location - .inst 0xb9400008 - .inst 0x7100111f - .inst 0x54fffee0 - .inst 0x14000030 - .inst 0xeb17001f - .inst 0x54000768 - .inst 0xcb190348 - .inst 0xeb08001f - .inst 0x54000708 - .inst 0x8b19001c - .inst 0xeb15039f - .inst 0x540001a9 - .inst 0xf10002bf - .inst 0x9a950308 - .inst 0xaa0803e9 - .inst 0xd37ff908 - .inst 0xeb1c013f - .inst 0x54ffffa3 - .inst 0xf144013f - .inst 0x9a9a3136 - .inst 0xcb1902a9 - .inst 0xcb1902c8 - .inst 0xeb09011f - .inst 0x540001e8 - .inst 0xaa0003f7 - .inst 0xaa1503f6 - .inst 0x8b190280 - .inst 0x910003e1 - .inst 0xaa1703e2 - bl memcpy - .inst 0xcb1c0368 - .inst 0xaa1603f5 - .inst 0xaa1c03f9 - .inst 0xf140051f - .inst 0x9a983117 - .inst 0xf144039f - .inst 0x54fffaa9 - .inst 0x1400001c - .inst 0xeb1902df - .inst 0x54000523 - .inst 0xaa0003f7 - .inst 0xd10083a0 - .inst 0xaa1503e1 - .inst 0xaa1403e2 - .inst 0xaa1603e3 - bl _RNvMs5_NtCs69KKACWg7bl_5alloc7raw_vecNtB5_11RawVecInner11finish_growCs9Xul1Kjr0QF_16libsignal_cli_io - .inst 0xf85e03a8 - .inst 0xf100051f - .inst 0x54000440 - .inst 0xf85e83b4 - .inst 0x17ffffe8 - .inst 0x7100251f - .inst 0x54000181 - .inst 0xa9005275 - .inst 0xf9000a79 - .inst 0x914007ff - .inst 0x910083ff - .inst 0xa9454ff4 - .inst 0xa94457f6 - .inst 0xa9435ff8 - .inst 0xa94267fa - .inst 0xa9416ffc - .inst 0xa8c67bfd - .inst 0xd65f03c0 - .inst 0xaa1503f6 - .inst 0x92800008 - .inst 0xf9000268 - .inst 0xb4fffe96 - .inst 0xaa1403e0 - .inst 0xaa1603e1 - .inst 0x52800022 - .inst 0x914007ff - .inst 0x910083ff - .inst 0xa9454ff4 - .inst 0xa94457f6 - .inst 0xa9435ff8 - .inst 0xa94267fa - .inst 0xa9416ffc - .inst 0xa8c67bfd - b _RNvCs1njKG4L9aB3_7___rustc14___rust_dealloc - .inst 0xaa1f03e0 - bl __snapstub_17 - .inst 0xa97e87a0 - bl __snapstub_17 -.size _RNvCs9Xul1Kjr0QF_16libsignal_cli_io10read_stdin, . - _RNvCs9Xul1Kjr0QF_16libsignal_cli_io10read_stdin - -.globl _RNvCs9Xul1Kjr0QF_16libsignal_cli_io10write_file -.type _RNvCs9Xul1Kjr0QF_16libsignal_cli_io10write_file, @function -_RNvCs9Xul1Kjr0QF_16libsignal_cli_io10write_file: - .inst 0xf13ffc3f - .inst 0x54000069 - .inst 0x52800020 - .inst 0xd65f03c0 - .inst 0xa9bb7bfd - .inst 0xa90167fc - .inst 0xa9025ff8 - .inst 0xa90357f6 - .inst 0xa9044ff4 - .inst 0x910003fd - .inst 0xd14007ff - .inst 0xf81f07ff - .inst 0xaa0303f3 - .inst 0xaa0203f4 - .inst 0xb4000181 - .inst 0xd10013a8 - .inst 0x910033e9 - .inst 0xd10013aa - .inst 0xaa0103eb - .inst 0x3840140c - .inst 0x3900010c - .inst 0x3940010c - .inst 0x3400020c - .inst 0xf100056b - .inst 0x3800152c - .inst 0x54ffff41 - .inst 0x910033e8 - .inst 0x3821691f - .inst 0x52804821 - .inst 0x910033e0 - .inst 0x528036c2 - .inst 0x72a00101 - bl open - .inst 0x36f800e0 - bl __errno_location - .inst 0xb9400008 - .inst 0x7100111f - .inst 0x54fffee0 - .inst 0x52800020 - .inst 0x1400001d - .inst 0x2a0003f5 - .inst 0xaa1f03f8 - .inst 0x32144bf9 - .inst 0xeb180268 - .inst 0xeb19011f - .inst 0x9a993116 - .inst 0xeb18027f - .inst 0x1a9f97f7 - .inst 0x54000229 - .inst 0x8b180281 - .inst 0x2a1503e0 - .inst 0xaa1603e2 - bl write - .inst 0xb4000160 - .inst 0xb6f800c0 - bl __errno_location - .inst 0xb9400008 - .inst 0x7100111f - .inst 0x54fffee0 - .inst 0x14000005 - .inst 0xeb16001f - .inst 0x8b180018 - .inst 0x54fffda9 - .inst 0x14000002 - .inst 0x52800037 - .inst 0x2a1503e0 - bl close - .inst 0x2a1703e0 - .inst 0x914007ff - .inst 0x910043ff - .inst 0xa9444ff4 - .inst 0xa94357f6 - .inst 0xa9425ff8 - .inst 0xa94167fc - .inst 0xa8c57bfd - .inst 0xd65f03c0 -.size _RNvCs9Xul1Kjr0QF_16libsignal_cli_io10write_file, . - _RNvCs9Xul1Kjr0QF_16libsignal_cli_io10write_file - -.globl _RNvCs9Xul1Kjr0QF_16libsignal_cli_io12write_stdout -.type _RNvCs9Xul1Kjr0QF_16libsignal_cli_io12write_stdout, @function -_RNvCs9Xul1Kjr0QF_16libsignal_cli_io12write_stdout: - .inst 0xa9bc7bfd - .inst 0xa9015ff8 - .inst 0xa90257f6 - .inst 0xa9034ff4 - .inst 0x910003fd - .inst 0xaa0103f3 - .inst 0xaa0003f4 - .inst 0xaa1f03f7 - .inst 0x32144bf8 - .inst 0xeb170268 - .inst 0xeb18011f - .inst 0x9a983116 - .inst 0xeb17027f - .inst 0x1a9f97f5 - .inst 0x54000269 - .inst 0x8b170281 - .inst 0x52800020 - .inst 0xaa1603e2 - bl write - .inst 0xb4000280 - .inst 0xb6f800c0 - bl __errno_location - .inst 0xb9400008 - .inst 0x7100111f - .inst 0x54fffee0 - .inst 0x14000005 - .inst 0xeb16001f - .inst 0x8b170017 - .inst 0x54fffda9 - .inst 0x14000004 - .inst 0x7100251f - .inst 0x54000101 - .inst 0x2a1f03f5 - .inst 0x2a1503e0 - .inst 0xa9434ff4 - .inst 0xa94257f6 - .inst 0xa9415ff8 - .inst 0xa8c47bfd - .inst 0xd65f03c0 - .inst 0x52800035 - .inst 0x2a1503e0 - .inst 0xa9434ff4 - .inst 0xa94257f6 - .inst 0xa9415ff8 - .inst 0xa8c47bfd - .inst 0xd65f03c0 -.size _RNvCs9Xul1Kjr0QF_16libsignal_cli_io12write_stdout, . - _RNvCs9Xul1Kjr0QF_16libsignal_cli_io12write_stdout - -.globl _RNvCs9Xul1Kjr0QF_16libsignal_cli_io9read_file -.type _RNvCs9Xul1Kjr0QF_16libsignal_cli_io9read_file, @function -_RNvCs9Xul1Kjr0QF_16libsignal_cli_io9read_file: - .inst 0xa9ba7bfd - .inst 0xa9016ffc - .inst 0xa90267fa - .inst 0xa9035ff8 - .inst 0xa90457f6 - .inst 0xa9054ff4 - .inst 0x910003fd - .inst 0xd14007ff - .inst 0xf90003ff - .inst 0xd14007ff - .inst 0xf81e07ff - .inst 0xf13ffc3f - .inst 0x54000089 - .inst 0x92800009 - .inst 0xf9000109 - .inst 0x14000073 - .inst 0xb4000181 - .inst 0x914007e9 - .inst 0x910003ea - .inst 0x914007eb - .inst 0xaa0103ec - .inst 0x3840140d - .inst 0x3900012d - .inst 0x3940012d - .inst 0x34fffead - .inst 0xf100058c - .inst 0x3800154d - .inst 0x54ffff41 - .inst 0xaa0803f8 - .inst 0x910003e8 - .inst 0x3821691f - .inst 0x910003e0 - .inst 0x52a00101 - bl open - .inst 0x36f801a0 - bl __errno_location - .inst 0xb9400008 - .inst 0x7100111f - .inst 0x54ffff20 - bl __errno_location - .inst 0xb9400008 - .inst 0x7100091f - .inst 0x54000ac1 - .inst 0x52800028 - .inst 0xf9000b1f - .inst 0xa900231f - .inst 0x14000054 - .inst 0x2a0003f3 - .inst 0xaa1f03f5 - .inst 0xaa1f03fc - .inst 0x52800034 - .inst 0x52820019 - .inst 0x52a0041a - .inst 0x52820017 - .inst 0x914007e1 - .inst 0x2a1303e0 - .inst 0xaa1703e2 - bl read - .inst 0xb4000700 - .inst 0xb6f800c0 - bl __errno_location - .inst 0xb9400008 - .inst 0x7100111f - .inst 0x54fffee0 - .inst 0x14000035 - .inst 0xeb17001f - .inst 0x54000668 - .inst 0xcb1c0348 - .inst 0xeb08001f - .inst 0x54000608 - .inst 0x8b1c001b - .inst 0xeb15037f - .inst 0x540001a9 - .inst 0xf10002bf - .inst 0x9a950328 - .inst 0xaa0803e9 - .inst 0xd37ff908 - .inst 0xeb1b013f - .inst 0x54ffffa3 - .inst 0xf148013f - .inst 0x9a9a3136 - .inst 0xcb1c02a9 - .inst 0xcb1c02c8 - .inst 0xeb09011f - .inst 0x54000228 - .inst 0xaa0003f7 - .inst 0xaa1503f6 - .inst 0x8b1c0280 - .inst 0x914007e1 - .inst 0xaa1703e2 - bl memcpy - .inst 0x52800028 - .inst 0xaa1603f5 - .inst 0xaa1b03fc - .inst 0x72a00408 - .inst 0xcb1b0108 - .inst 0xf140051f - .inst 0x9a993117 - .inst 0xf148037f - .inst 0x54fffa69 - .inst 0x14000012 - .inst 0xeb1c02df - .inst 0x540004a3 - .inst 0xaa0003f7 - .inst 0xd10083a0 - .inst 0xaa1503e1 - .inst 0xaa1403e2 - .inst 0xaa1603e3 - bl _RNvMs5_NtCs69KKACWg7bl_5alloc7raw_vecNtB5_11RawVecInner11finish_growCs9Xul1Kjr0QF_16libsignal_cli_io - .inst 0xf85e03a8 - .inst 0xf100051f - .inst 0x540003c0 - .inst 0xf85e83b4 - .inst 0x17ffffe6 - .inst 0xa9005315 - .inst 0xf9000b1c - .inst 0x14000009 - .inst 0xaa1503f6 - .inst 0x92800008 - .inst 0xf9000308 - .inst 0xb40000b6 - .inst 0xaa1403e0 - .inst 0xaa1603e1 - .inst 0x52800022 - bl _RNvCs1njKG4L9aB3_7___rustc14___rust_dealloc - .inst 0x2a1303e0 - bl close - .inst 0x14000003 - .inst 0x92800008 - .inst 0xf9000308 - .inst 0x91400bff - .inst 0x910083ff - .inst 0xa9454ff4 - .inst 0xa94457f6 - .inst 0xa9435ff8 - .inst 0xa94267fa - .inst 0xa9416ffc - .inst 0xa8c67bfd - .inst 0xd65f03c0 - .inst 0xaa1f03e0 - bl __snapstub_17 - .inst 0xa97e87a0 - bl __snapstub_17 -.size _RNvCs9Xul1Kjr0QF_16libsignal_cli_io9read_file, . - _RNvCs9Xul1Kjr0QF_16libsignal_cli_io9read_file - -.type _RNvMs5_NtCs69KKACWg7bl_5alloc7raw_vecNtB5_11RawVecInner11finish_growCs9Xul1Kjr0QF_16libsignal_cli_io, @function -_RNvMs5_NtCs69KKACWg7bl_5alloc7raw_vecNtB5_11RawVecInner11finish_growCs9Xul1Kjr0QF_16libsignal_cli_io: - .inst 0xa9be7bfd - .inst 0xa9014ff4 - .inst 0x910003fd - .inst 0xaa0003f4 - .inst 0xb7f80123 - .inst 0xaa0303f3 - .inst 0xb40001c1 - .inst 0xaa0203e0 - .inst 0x52800022 - .inst 0xaa1303e3 - bl _RNvCs1njKG4L9aB3_7___rustc14___rust_realloc - .inst 0xb5000300 - .inst 0x1400000e - .inst 0x52800028 - .inst 0x52800109 - .inst 0xf8296a9f - .inst 0xf9000288 - .inst 0xa9414ff4 - .inst 0xa8c27bfd - .inst 0xd65f03c0 - .inst 0xb40001d3 - bl _RNvCs1njKG4L9aB3_7___rustc35___rust_no_alloc_shim_is_unstable_v2 - .inst 0xaa1303e0 - .inst 0x52800021 - bl _RNvCs1njKG4L9aB3_7___rustc12___rust_alloc - .inst 0xb5000140 - .inst 0x52800028 - .inst 0xf9000688 - .inst 0x52800209 - .inst 0xf8296a93 - .inst 0xf9000288 - .inst 0xa9414ff4 - .inst 0xa8c27bfd - .inst 0xd65f03c0 - .inst 0x52800020 - .inst 0xf9000680 - .inst 0x52800209 - .inst 0xf8296a93 - .inst 0xf900029f - .inst 0xa9414ff4 - .inst 0xa8c27bfd - .inst 0xd65f03c0 -.size _RNvMs5_NtCs69KKACWg7bl_5alloc7raw_vecNtB5_11RawVecInner11finish_growCs9Xul1Kjr0QF_16libsignal_cli_io, . - _RNvMs5_NtCs69KKACWg7bl_5alloc7raw_vecNtB5_11RawVecInner11finish_growCs9Xul1Kjr0QF_16libsignal_cli_io diff --git a/third_party/libsignal/libsignal-session/cli-elf/stock.ld b/third_party/libsignal/libsignal-session/cli-elf/stock.ld index 96fc3005e..5cedd25d0 100644 --- a/third_party/libsignal/libsignal-session/cli-elf/stock.ld +++ b/third_party/libsignal/libsignal-session/cli-elf/stock.ld @@ -4,21 +4,25 @@ * 1. Four page-aligned, non-overlapping W^X `PT_LOAD` segments (`:ro` R, `:text_a` RX, `:text_b` RX, * `:data` RW) starting at `0x400000` with `FILEHDR PHDRS` mapped at `[0x400000, 0x400000 + SIZEOF_HEADERS)` * for musl `AT_PHDR` / `AT_PHNUM` discovery (`e_phnum = 7`): - * - `:ro` `FLAGS(4)`; + * - `:ro` `FLAGS(4)` (`.rodata` plus optional `.rodata.lib2` for C2 `lib2_*.o` RO / `.data.rel.ro`); * - `:text_a` `FLAGS(5)`: `.text.crate` holds all `lib0_*.o` crate blocks (including `main`), * hooked `lib1_*.o` I/O definers (`write_file`, `write_stdout`), `extern_stubs_clean.o` - * (`udf #0` fail-stop/hook/panic stubs + displaced weak `__aarch64_*` atomics), hooked musl - * string primitives (`memmove.lo`, `bcmp.lo`, `strlen.lo`) plus `memcmp.lo` (reached by `bcmp`'s - * tail `b memcmp`), and `.text.compiler_rt.*`; + * (`udf #0` fail-stop/hook/panic stubs + displaced weak `__aarch64_*` atomics + in-place + * `KEEP(.text.__retired_*)` retired stub slots), hooked musl string primitives + * (`memmove.lo`, `memcmp.lo`, `bcmp.lo`, `strlen.lo` when still hooked; moved to the + * `.text.b_pre` tail after `memset.lo` in `stock/stock_c2.ld` under C2 `D-C2f = 2C`), and + * `.text.compiler_rt.*`; * - `:text_b` `FLAGS(5)` (`StdBinaryLayout.rxProgram`): * - `.text.b_pre` (`< e_entry`) holds non-hook `lib1_*.o` definers (`read_file`, `read_stdin`, * `RawVecInner::finish_grow`), `rdl_shim.o` (`__rdl_*` + 5 `__rust_*` shims), and musl - * `memcpy.lo` / `memset.lo`; + * `memcpy.lo` / `memset.lo` (followed at C2 `2C` by `memmove.lo` -> `memcmp.lo` -> + * `bcmp.lo` -> `strlen.lo`, `< e_entry`); * - `.text` begins at `0x1000`-aligned `e_entry` with `KEEP(*crt1.o(.text.start ...))` * (`_start == e_entry`), followed by `.init`, musl startup/exit/libc + `mallocng` + `main_rust.o` - * text, and `.fini`. Every `libsignalSessionExterns` entry resolves `< e_entry` (`hstubLt`), - * `e_entry - base(main) > 0` (`hmainOff`), and `:text_b` contains 0 `externAt?` hook keys - * outside `memcpy` / `memset` in `.text.b_pre` (`0` hook keys in `[e_entry, text_b_end)`). + * text, and `.fini`, followed at the `:text_b` tail by optional `.text.lib2` (`*lib2_*.o`, + * de-hooked `cli/rt` code enabled atomically at C2). Every hooked `libsignalSessionExterns` + * entry resolves `< e_entry` (`hstubLt`), `e_entry - base(main) > 0` (`hmainOff`), and + * `0` `externAt?` hook keys lie in `[e_entry, text_b_end)` (`lib2` is de-hooked code). * 2. Page-aligned RW layout in `:data`: * - `.tdata`, `.tbss` (`PT_TLS` `0/0`), and `.data.crate` occupy the initial `:data` page; * - Top-level `PROVIDE_HIDDEN` (`indent == 0` in `link.map`) and `. = ALIGN(0x1000);` align @@ -44,8 +48,17 @@ SECTIONS . = 0x400000 + SIZEOF_HEADERS; .rodata : { - *(.rodata .rodata.* .gnu.linkonce.r.*) - *(.data.rel.ro .data.rel.ro.*) + *(EXCLUDE_FILE(*lib2_*.o) .rodata EXCLUDE_FILE(*lib2_*.o) .rodata.* EXCLUDE_FILE(*lib2_*.o) .gnu.linkonce.r.*) + *(EXCLUDE_FILE(*lib2_*.o) .data.rel.ro EXCLUDE_FILE(*lib2_*.o) .data.rel.ro.*) + } :ro =0 + + /* `.data.rel.ro` precedes `.rodata` in `.rodata.lib2` so `lib2_5.o` (`SystemTime::add`, whose + * only RO input is a 45-byte `align=1` `.rodata..Lanon` panic string) sits strictly at the end + * of `.rodata.lib2`: dropping `time_add` truncates `.rodata.lib2` without shifting earlier + * `.data.rel.ro` `Location` records or `.rodata` tables. */ + .rodata.lib2 : { + *lib2_*.o(.data.rel.ro .data.rel.ro.*) + *lib2_*.o(.rodata .rodata.* .gnu.linkonce.r.*) } :ro =0 . = ALIGN(0x1000); @@ -56,6 +69,7 @@ SECTIONS main.o(.text .text.*) */main.o(.text .text.*) *extern_stubs_clean.o(.text .text.*) + KEEP(*extern_stubs_clean.o(.text.__retired_*)) memmove.o(.text .text.*) */memmove.o(.text .text.*) *libc.a:memmove.lo(.text .text.*) @@ -65,7 +79,7 @@ SECTIONS bcmp.o(.text .text.*) */bcmp.o(.text .text.*) *libc.a:bcmp.lo(.text .text.*) - *(.text.strlen .text.compiler_rt.*) + *(EXCLUDE_FILE(*lib2_*.o) .text.strlen EXCLUDE_FILE(*lib2_*.o) .text.compiler_rt.*) } :text_a =0 . = ALIGN(0x1000); @@ -88,10 +102,14 @@ SECTIONS .text : ALIGN(0x1000) { KEEP(*crt1.o(.text.start .text .text.*)) KEEP(*(SORT_NONE(.init))) - *(.text .text.* .gnu.linkonce.t.*) + *(EXCLUDE_FILE(*lib2_*.o) .text EXCLUDE_FILE(*lib2_*.o) .text.* EXCLUDE_FILE(*lib2_*.o) .gnu.linkonce.t.*) KEEP(*(SORT_NONE(.fini))) } :text_b =0 + .text.lib2 : { + *lib2_*.o(.text .text.*) + } :text_b =0 + . = ALIGN(0x1000); .tdata : { diff --git a/third_party/libsignal/libsignal-session/cli-elf/stock/inputs_stock_stdbin.lock b/third_party/libsignal/libsignal-session/cli-elf/stock/inputs_stock_stdbin.lock index b7a591463..33ac8d672 100644 --- a/third_party/libsignal/libsignal-session/cli-elf/stock/inputs_stock_stdbin.lock +++ b/third_party/libsignal/libsignal-session/cli-elf/stock/inputs_stock_stdbin.lock @@ -29,26 +29,28 @@ rdl_shim_path = "third_party/libsignal/libsignal-session/cli-elf/stock/rdl_shim. rdl_shim_sha256 = "b1ea6c885b72ada33a0a52d4a8df3efdd0ddab579455e8853b5d85340a24da5f" native_only = [] +lib2_rows = "all" +c2_moved_libc_rows = "all" stock_ld_mode = "pinned" -linker_script_path = "third_party/libsignal/libsignal-session/cli-elf/stock.ld" -linker_script_sha256 = "ddd8dd9df46f6ed840fe35ec185cd754cd82a2e18d608b5c6268779b1e5c4daa" +linker_script_path = "third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld" +linker_script_sha256 = "a9066f2183c8fa29b7412913628dd3d316ac3990a1868cca3e23b0c4b8757459" lld_no_relax = true -elf_sha256 = "2f20c836342437a882b5882c34eab604e4f23b2b388c2b2a0696eeda51cddc7e" -elf_size = 617448 -engine_stock_link_json_sha256 = "0a4e7ecf49ebd86f014121a7a995a0d7671bfbf81e2f6b757dfa7b2d63bb91db" -link_map_sha256 = "9a106e1de1d90f94c623525871beb70fb6d4c9ac10a809698c393f24b5405600" +elf_sha256 = "50066cbd732256eb5f19f93d1d98800914336b7926225de3ebfa0bb37eca98ce" +elf_size = 619032 +engine_stock_link_json_sha256 = "70f8d7be7c7033ad468f4d12c45f7b08e4df0c6d142146732ad8b7ec3ecda9b4" +link_map_sha256 = "f7cf0b1929934080a2c60b0f6fd70abcb23bbd37479b035e09c2525338fe39f5" main_rust_obj_sha256 = "db55dd1615f19140ce50155b9d51aeaf9ddbe262d8ce9669afb62b71510b0b9e" compiler_builtins_sha256 = "e9ede836762ee857758dcacd0a75f42eb68a7220d8c490648ef2c34a3b0d9958" stub_manifest_sha256 = "169fd6d8b82d5eb9012b92f779223afc20df30704ce00928fedcd63034cc833f" m4_lock_path = "third_party/libsignal/libsignal-session/cli-elf/stock/m4_stock.lock" -m4_lock_sha256 = "9e934fa146794ffc1b689c0abc6f1b01a52a2d10c4fe3c6013da5a05ede78b8d" +m4_lock_sha256 = "e98a380d99460c1a9e6a5d8b674575b126e344bd94645182a0d2c15d423860f8" expected_phnum = 7 expected_pt_loads = 4 -expected_symtab_count = 2832 -expected_loader_sym_count = 300 +expected_symtab_count = 2860 +expected_loader_sym_count = 305 expected_stub_manifest_count = 129 expected_retained_stub_count = 82 @@ -95,11 +97,12 @@ lld_argv = [ "--build-id=none", "--strip-debug", "-T", - "", + "", "--no-relax", "--undefined=session_message_encrypt", "--undefined=session_message_decrypt_signal", "--undefined=session_signal_message_parse", + "--undefined=_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek", "--undefined=_RNvMs4_NtCs69KKACWg7bl_5alloc7raw_vecINtB5_6RawVecINtNtB7_3vec3VechEE8grow_oneCsfr5T3GFabw_3std", "--undefined=_RNvMs4_NtCs69KKACWg7bl_5alloc7raw_vecINtB5_6RawVecINtNtNtCslhx8g8CthFc_5gimli4read4unit14AttributeValueINtNtBR_12endian_slice11EndianSliceNtNtBT_9endianity12LittleEndianEjEE8grow_oneCsfr5T3GFabw_3std", "--undefined=_RNvMs4_NtCs69KKACWg7bl_5alloc7raw_vecINtB5_6RawVecNtNtB7_6string6StringE8grow_oneCsfr5T3GFabw_3std", @@ -107,7 +110,14 @@ lld_argv = [ "--undefined=_RNvMs4_NtCs69KKACWg7bl_5alloc7raw_vecINtB5_6RawVecNtNtCs9xXbyXU8IDi_9addr2line8function15FunctionAddressE8grow_oneCsfr5T3GFabw_3std", "--undefined=_RNvMs4_NtCs69KKACWg7bl_5alloc7raw_vecINtB5_6RawVecNtNtNtCsfr5T3GFabw_3std3ffi6os_str8OsStringE8grow_oneBS_", "--undefined=_RNvMs4_NtCs69KKACWg7bl_5alloc7raw_vecINtB5_6RawVechE8grow_oneB7_", + "--undefined=_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since", + "--undefined=_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8", + "--undefined=_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr", + "--undefined=_RNvXs4_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPointNtCsjhEzohgaBbG_7zeroize7Zeroize7zeroize", "--undefined=_RNvXs4_NtCs69KKACWg7bl_5alloc6stringNtB5_6StringNtNtCskxtBwYRO61I_4core5clone5Clone5clone", + "--undefined=_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add", + "--undefined=_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + "--undefined=_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", "--print-gc-sections", "--why-extract=why-extract.tsv", "-Map=link.map", @@ -282,6 +292,12 @@ lld_argv = [ "work/lib0_11.o", "work/lib0_12.o", "work/lib1_0.o", + "work/lib2_0.o", + "work/lib2_1.o", + "work/lib2_2.o", + "work/lib2_3.o", + "work/lib2_4.o", + "work/lib2_5.o", "--start-group", "work/main_rust.o", "work/self-contained/libc.a", @@ -293,7 +309,7 @@ lld_argv = [ ] [stock_lld_arg_files] -"third_party/libsignal/libsignal-session/cli-elf/stock.ld" = "ddd8dd9df46f6ed840fe35ec185cd754cd82a2e18d608b5c6268779b1e5c4daa" +"third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld" = "a9066f2183c8fa29b7412913628dd3d316ac3990a1868cca3e23b0c4b8757459" [runtime_archives] "crt1.o" = "2c8595cff75b182ad59c0278d5f81bed2cf1e51b5bf9324db52142c89dd6479f" @@ -307,7 +323,7 @@ lld_argv = [ [s2_real_body_lock.bcmp] definer_class = "R" input_binding = "STB_GLOBAL" -elf_addr = "0x468ba8" +elf_addr = "0x469a40" size = 4 input_section = ".text.bcmp" source_file = "libc.a" @@ -328,7 +344,7 @@ relocs = [ [s2_real_body_lock.memcmp] definer_class = "R" input_binding = "STB_GLOBAL" -elf_addr = "0x468b74" +elf_addr = "0x469a0c" size = 52 input_section = ".text.memcmp" source_file = "libc.a" @@ -367,7 +383,7 @@ relocs = [] [s2_real_body_lock.memmove] definer_class = "R" input_binding = "STB_GLOBAL" -elf_addr = "0x468a4c" +elf_addr = "0x4698e4" size = 296 input_section = ".text.memmove" source_file = "libc.a" @@ -380,7 +396,7 @@ member_file_sha = "1e57042165b65670bd83a6fba77a375595b5a444a6d5b611ced91e60bf0be matched_libc_member = "memmove.lo" member_text_relocs = 1 text_sha = "c12d467225cb80b716bf2937af29adf446439046c9ff9a980eb4c4daf6875508" -body_sha256 = "29f73b1800a3451387a2493ccfc81f74c325d4d73dd81f7adbd98c9a7a2ecc32" +body_sha256 = "6490c2a56810c33dda3e5fa1e2b5baa64ecbf9121806f5191e1541b9db74baa4" relocs = [ { offset = 104, rel_offset = 104, r_type = 282, rtype = 282, target_symbol = "memcpy", target = "memcpy", addend = 0 }, ] @@ -408,7 +424,7 @@ relocs = [] [s2_real_body_lock.strlen] definer_class = "R" input_binding = "STB_GLOBAL" -elf_addr = "0x468bac" +elf_addr = "0x469a44" size = 88 input_section = ".text.strlen" source_file = "libc.a" @@ -444,7 +460,7 @@ elf_addr = "0x46f020" size = 8 input_section = ".data._RNvCs4Dv7yoBiUx4_3log20MAX_LOG_LEVEL_FILTER" source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" [d1_extern_data_lock.kept."_RNvNtNtNtNtCs2wR8L9wiBdT_16curve25519_dalek7backend6serial3u649constants23ED25519_BASEPOINT_TABLE"] demangled_name = "curve25519_dalek::backend::serial::u64::constants::ED25519_BASEPOINT_TABLE" @@ -454,7 +470,7 @@ elf_addr = "0x46f028" size = 8 input_section = ".data._RNvNtNtNtNtCs2wR8L9wiBdT_16curve25519_dalek7backend6serial3u649constants23ED25519_BASEPOINT_TABLE" source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" [[stub_manifest]] name = "_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek" diff --git a/third_party/libsignal/libsignal-session/cli-elf/stock/m4_stock.lock b/third_party/libsignal/libsignal-session/cli-elf/stock/m4_stock.lock index 13190ab8a..8f63bc696 100644 --- a/third_party/libsignal/libsignal-session/cli-elf/stock/m4_stock.lock +++ b/third_party/libsignal/libsignal-session/cli-elf/stock/m4_stock.lock @@ -5,19 +5,20 @@ schema_version = 1 alink_rule_version = "v0.3.2" atomics_mode = "alpha" recipe = "engine" -config_count = 2 +config_count = 3 configs = [ "third_party/libsignal/libsignal-session/translation.toml", "third_party/libsignal/libsignal-session/cli/io/translation.toml", + "third_party/libsignal/libsignal-session/cli/rt/translation.toml", ] engine_commit = "c2ef2f44e5988bf39d73cbf7fb5c784417818bd3" -engine_stock_link_json_sha256 = "0a4e7ecf49ebd86f014121a7a995a0d7671bfbf81e2f6b757dfa7b2d63bb91db" +engine_stock_link_json_sha256 = "70f8d7be7c7033ad468f4d12c45f7b08e4df0c6d142146732ad8b7ec3ecda9b4" rustc_version = "1.98.1" zig_version = "0.16.0" lld_version = "LLD 22.1.8 (/checkout/src/llvm-project/llvm 52ed14fcd56afc30f9cccd8ca8ce237c2eef7e04) (compatible with GNU linkers)" lld_version_prefix = "LLD 22.1.8" -elf_sha256 = "2f20c836342437a882b5882c34eab604e4f23b2b388c2b2a0696eeda51cddc7e" -elf_size = 617448 +elf_sha256 = "50066cbd732256eb5f19f93d1d98800914336b7926225de3ebfa0bb37eca98ce" +elf_size = 619032 x_count = 149 x_sha256 = "d694832a2ecc03001f0f845ffd04515dcd76af2a1bb2abc2d79423b09b4c15ad" hooked_externs_count = 144 @@ -29,8 +30,9 @@ x_minus_hooked_externs = [ "read", "write", ] -real_hook_reached = ["memcmp", "write"] +real_hook_reached = ["write"] real_proved = [ + "_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek", "_RNvCs1njKG4L9aB3_7___rustc12___rust_alloc", "_RNvCs1njKG4L9aB3_7___rustc14___rust_dealloc", "_RNvCs1njKG4L9aB3_7___rustc14___rust_realloc", @@ -38,12 +40,22 @@ real_proved = [ "_RNvCs1njKG4L9aB3_7___rustc35___rust_no_alloc_shim_is_unstable_v2", "_RNvCs9Xul1Kjr0QF_16libsignal_cli_io10read_stdin", "_RNvCs9Xul1Kjr0QF_16libsignal_cli_io9read_file", + "_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since", + "_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8", + "_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr", + "_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add", + "_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + "_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", "__errno_location", + "bcmp", "close", + "memcmp", "memcpy", + "memmove", "memset", "open", "read", + "strlen", ] failstop_z = [ "_RINvNtCskxtBwYRO61I_4core9panicking13assert_failedjjEB4_", @@ -148,11 +160,12 @@ lld_argv = [ "--build-id=none", "--strip-debug", "-T", - "third_party/libsignal/libsignal-session/cli-elf/stock.ld", + "third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld", "--no-relax", "--undefined=session_message_encrypt", "--undefined=session_message_decrypt_signal", "--undefined=session_signal_message_parse", + "--undefined=_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek", "--undefined=_RNvMs4_NtCs69KKACWg7bl_5alloc7raw_vecINtB5_6RawVecINtNtB7_3vec3VechEE8grow_oneCsfr5T3GFabw_3std", "--undefined=_RNvMs4_NtCs69KKACWg7bl_5alloc7raw_vecINtB5_6RawVecINtNtNtCslhx8g8CthFc_5gimli4read4unit14AttributeValueINtNtBR_12endian_slice11EndianSliceNtNtBT_9endianity12LittleEndianEjEE8grow_oneCsfr5T3GFabw_3std", "--undefined=_RNvMs4_NtCs69KKACWg7bl_5alloc7raw_vecINtB5_6RawVecNtNtB7_6string6StringE8grow_oneCsfr5T3GFabw_3std", @@ -160,7 +173,14 @@ lld_argv = [ "--undefined=_RNvMs4_NtCs69KKACWg7bl_5alloc7raw_vecINtB5_6RawVecNtNtCs9xXbyXU8IDi_9addr2line8function15FunctionAddressE8grow_oneCsfr5T3GFabw_3std", "--undefined=_RNvMs4_NtCs69KKACWg7bl_5alloc7raw_vecINtB5_6RawVecNtNtNtCsfr5T3GFabw_3std3ffi6os_str8OsStringE8grow_oneBS_", "--undefined=_RNvMs4_NtCs69KKACWg7bl_5alloc7raw_vecINtB5_6RawVechE8grow_oneB7_", + "--undefined=_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since", + "--undefined=_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8", + "--undefined=_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr", + "--undefined=_RNvXs4_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPointNtCsjhEzohgaBbG_7zeroize7Zeroize7zeroize", "--undefined=_RNvXs4_NtCs69KKACWg7bl_5alloc6stringNtB5_6StringNtNtCskxtBwYRO61I_4core5clone5Clone5clone", + "--undefined=_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add", + "--undefined=_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + "--undefined=_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", "--print-gc-sections", "--why-extract=why-extract.tsv", "-Map=link.map", @@ -335,6 +355,12 @@ lld_argv = [ "work/lib0_11.o", "work/lib0_12.o", "work/lib1_0.o", + "work/lib2_0.o", + "work/lib2_1.o", + "work/lib2_2.o", + "work/lib2_3.o", + "work/lib2_4.o", + "work/lib2_5.o", "--start-group", "work/main_rust.o", "work/self-contained/libc.a", @@ -344,6 +370,77 @@ lld_argv = [ "work/self-contained/crtend.o", "work/self-contained/crtn.o", ] +cli_hook_table_placed = [ + "_RNvCs65XVORQObL2_12libcrux_hmac4hmac", + "_RNvCs9Xul1Kjr0QF_16libsignal_cli_io10write_file", + "_RNvCs9Xul1Kjr0QF_16libsignal_cli_io12write_stdout", + "_RNvMNtCs2wR8L9wiBdT_16curve25519_dalek6scalarNtB2_6Scalar20from_bytes_mod_order", + "_RNvMNtCs2wR8L9wiBdT_16curve25519_dalek6scalarNtB2_6Scalar25from_bytes_mod_order_wide", + "_RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes3pk1", + "_RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes3pk2", + "_RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes9from_seed", + "_RNvMs5_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPoint10to_edwards", + "_RNvMs6_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecret14diffie_hellman", + "_RNvMsg_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint8compress", + "_RNvMsw_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint35vartime_double_scalar_mul_basepoint", + "_RNvMsx_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint15is_torsion_free", + "_RNvNtCsbKnPy0UR4Ui_13signal_crypto7aes_cbc19aes_256_cbc_decrypt", + "_RNvNtCsbKnPy0UR4Ui_13signal_crypto7aes_cbc19aes_256_cbc_encrypt", + "_RNvNtCsbvWyylYiyxg_4sha26sha25611compress256", + "_RNvNtCsbvWyylYiyxg_4sha26sha51211compress512", + "_RNvNtCskxtBwYRO61I_4core3fmt5write", + "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental12encapsulate1", + "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental12encapsulate2", + "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes", + "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental26decapsulate_compressed_key", + "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber11decapsulate", + "_RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber11encapsulate", + "_RNvNvNtCs69KKACWg7bl_5alloc3fmt6format12format_inner", + "_RNvXs8_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_9PublicKeyINtNtCskxtBwYRO61I_4core7convert4FromRNtB5_12StaticSecretE4from", + "_RNvXso_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPointNtNtNtCskxtBwYRO61I_4core3ops5arith3Neg3neg", +] +cli_dehooked_syms_placed = [ + "_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek", + "_RNvCs1njKG4L9aB3_7___rustc12___rust_alloc", + "_RNvCs1njKG4L9aB3_7___rustc14___rust_dealloc", + "_RNvCs1njKG4L9aB3_7___rustc14___rust_realloc", + "_RNvCs1njKG4L9aB3_7___rustc19___rust_alloc_zeroed", + "_RNvCs1njKG4L9aB3_7___rustc35___rust_no_alloc_shim_is_unstable_v2", + "_RNvCs9Xul1Kjr0QF_16libsignal_cli_io10read_stdin", + "_RNvCs9Xul1Kjr0QF_16libsignal_cli_io9read_file", + "_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since", + "_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8", + "_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr", + "_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add", + "_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + "_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + "bcmp", + "memcpy", + "memmove", + "memset", + "strlen", +] +cli_panic_symbols_placed = [ + "_RINvNtCskxtBwYRO61I_4core9panicking13assert_failedjjEB4_", + "_RINvNtCskxtBwYRO61I_4core9panicking13assert_failedyyEB4_", + "_RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error", + "_RNvNtCs69KKACWg7bl_5alloc7raw_vec12handle_error", + "_RNvNtCskxtBwYRO61I_4core6option13expect_failed", + "_RNvNtCskxtBwYRO61I_4core6option13unwrap_failed", + "_RNvNtCskxtBwYRO61I_4core6result13unwrap_failed", + "_RNvNtCskxtBwYRO61I_4core9panicking18panic_bounds_check", + "_RNvNtCskxtBwYRO61I_4core9panicking19assert_failed_inner", + "_RNvNtCskxtBwYRO61I_4core9panicking5panic", + "_RNvNtCskxtBwYRO61I_4core9panicking9panic_fmt", + "_RNvNtNtCskxtBwYRO61I_4core5slice5index16slice_index_fail", + "_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_add_overflow", + "_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_mul_overflow", + "_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_shl_overflow", + "_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_sub_overflow", + "_RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const28panic_const_async_fn_resumed", + "_RNvNvMs_NtCs69KKACWg7bl_5alloc3vecINtB6_3VecppE6remove13assert_failed", +] +cli_binary_pq_sha256 = "535dd455c6e406ba2663ff4cff7aa35caf81fa03645a153f1573bda2ca50607f" [[sysroot_trims]] image_idx = 0 @@ -383,13 +480,292 @@ kept_sections = [ ".text._RNvXs4_NtCs69KKACWg7bl_5alloc6stringNtB5_6StringNtNtCskxtBwYRO61I_4core5clone5Clone5clone", ] +[[sysroot_trims]] +image_idx = 2 +object = "lib2_0.o" +object_sha256 = "549db8da24af44680ab4c67e017b11ca8a3fbe9cb3e8a9470ef99b0bb74e5c60" +rlib = "libcore-276de952897abe1c.rlib" +member = "core-276de952897abe1c.core.ef3dda841aee4344-cgu.0.rcgu.o" +member_sha256 = "26d3f8992398f28a5e6d2d5e44807b07dd4f841b8de025da1066bf8501de1de1" +keep_set_sha256 = "47e6772e48ee2c95d8e03827c1162a6758020e781f56c2bafa6a47e09366086f" +kept_sections = [ + ".data.rel.ro..Lanon.8d92bed9e8e7b068fae37f7046779d90.216", + ".data.rel.ro..Lanon.8d92bed9e8e7b068fae37f7046779d90.217", + ".rodata.str1.1", + ".text._RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr", +] + +[[sysroot_trims]] +image_idx = 2 +object = "lib2_1.o" +object_sha256 = "af8ac10dcb7951e00d44feb9f267bdd2f68283a7baad9c559ac9f2a788eb6007" +rlib = "libcore-276de952897abe1c.rlib" +member = "core-276de952897abe1c.core.ef3dda841aee4344-cgu.0.rcgu.o" +member_sha256 = "26d3f8992398f28a5e6d2d5e44807b07dd4f841b8de025da1066bf8501de1de1" +keep_set_sha256 = "4f70bf549022d6f1ccdfbdd13609ffe69d044652c0ee2174355d5d91f5fecdba" +kept_sections = [ + ".rodata..Lanon.8d92bed9e8e7b068fae37f7046779d90.208", + ".text._RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8", +] + +[[sysroot_trims]] +image_idx = 2 +object = "lib2_2.o" +object_sha256 = "6ec1dfbc758c040efef465c5644d77702d2e5798068f08b76ae59c4e9ec4a6dd" +rlib = "libstd-96c9fe7a07d47cf2.rlib" +member = "std-96c9fe7a07d47cf2.std.2e66b1facfa492c-cgu.0.rcgu.o" +member_sha256 = "d5f890bc180a13054d49f8dfd74afb16a1bd997c3eeea009ceda7234cd2b197b" +keep_set_sha256 = "c8e5ac358b17c0df1edf3ba4aafc0ae3832cad6aacba7a9229c04f2de53b216a" +kept_sections = [ + ".data.rel.ro..Lanon.5394cca77e622eba6ee760626b780c72.153", + ".rodata..Lanon.5394cca77e622eba6ee760626b780c72.151", + ".rodata.cst16", + ".rodata.str1.1", + ".text._RNvMNtNtNtNtCsfr5T3GFabw_3std3sys3pal4unix4timeNtB2_8Timespec12sub_timespec", + ".text._RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since", +] + +[[sysroot_trims]] +image_idx = 2 +object = "lib2_3.o" +object_sha256 = "9c0f86c4e6b34ebdc5300a2ffa4c1c4bc49ad34e24af5089e7e6f6d1a3cf2618" +rlib = "libcurve25519_dalek-c7366f106db98a9c.rlib" +member = "curve25519_dalek-c7366f106db98a9c.curve25519_dalek.1d77ca7acaab0e03-cgu.0.rcgu.o" +member_sha256 = "248cc2de4366da1f4a0818f40827cd0ae7ad44bb2c1ddea434634f512412bf47" +keep_set_sha256 = "ac143d390720379e5d1121de7534b7a1707ac6b0fa4f2934d05f640075241de1" +kept_sections = [ + ".text._RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek", + ".text._RNvXs4_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPointNtCsjhEzohgaBbG_7zeroize7Zeroize7zeroize", +] + +[[sysroot_trims]] +image_idx = 2 +object = "lib2_4.o" +object_sha256 = "a747bf4693bbe877a750af8fbebab53d5e0d54cb6a587947a50c95e7fef6f2ed" +rlib = "libx25519_dalek-93ab6b057b4c9272.rlib" +member = "x25519_dalek-93ab6b057b4c9272.x25519_dalek.9617d460537667a0-cgu.0.rcgu.o" +member_sha256 = "7a7959f5774fdafe9243f21cf3a0b58d36dfc4ff299a938832cc938587bd01da" +keep_set_sha256 = "fad343352e997fc33d9b6bfe0f11cf29ea8e2b73c939da2c3f29997b97e0dc09" +kept_sections = [ + ".text._RNvXs1_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_9PublicKeyNtCsjhEzohgaBbG_7zeroize7Zeroize7zeroize", + ".text._RNvXs4_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_15EphemeralSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", +] + +[[sysroot_trims]] +image_idx = 2 +object = "lib2_5.o" +object_sha256 = "474d59404916bffb58bb4ee5952b9f6cbc422e6922974ad95d79c713a84812ad" +rlib = "libstd-96c9fe7a07d47cf2.rlib" +member = "std-96c9fe7a07d47cf2.std.2e66b1facfa492c-cgu.0.rcgu.o" +member_sha256 = "d5f890bc180a13054d49f8dfd74afb16a1bd997c3eeea009ceda7234cd2b197b" +keep_set_sha256 = "eb6e662997594080c4a5b72c3d839f66c0dd957038c614a3edc5e7c8b7063ee9" +kept_sections = [ + ".rodata..Lanon.5394cca77e622eba6ee760626b780c72.687", + ".text._RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add", +] + +[[lib2_objects]] +name = "lib2_0.o" +path = "work/lib2_0.o" +sha256 = "549db8da24af44680ab4c67e017b11ca8a3fbe9cb3e8a9470ef99b0bb74e5c60" +size = 5320 +config_index = 2 +defined_symbols = [ + "_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr", +] +rlib = "libcore-276de952897abe1c.rlib" +rlib_sha256 = "" +member = "core-276de952897abe1c.core.ef3dda841aee4344-cgu.0.rcgu.o" +member_sha256 = "26d3f8992398f28a5e6d2d5e44807b07dd4f841b8de025da1066bf8501de1de1" +keep_set_sha256 = "47e6772e48ee2c95d8e03827c1162a6758020e781f56c2bafa6a47e09366086f" +kept_sections = [ + ".data.rel.ro..Lanon.8d92bed9e8e7b068fae37f7046779d90.216", + ".data.rel.ro..Lanon.8d92bed9e8e7b068fae37f7046779d90.217", + ".rodata.str1.1", + ".text._RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr", +] +roots = [ + "_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr", +] + +[[lib2_objects]] +name = "lib2_1.o" +path = "work/lib2_1.o" +sha256 = "af8ac10dcb7951e00d44feb9f267bdd2f68283a7baad9c559ac9f2a788eb6007" +size = 1784 +config_index = 2 +defined_symbols = [ + "_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8", +] +rlib = "libcore-276de952897abe1c.rlib" +rlib_sha256 = "" +member = "core-276de952897abe1c.core.ef3dda841aee4344-cgu.0.rcgu.o" +member_sha256 = "26d3f8992398f28a5e6d2d5e44807b07dd4f841b8de025da1066bf8501de1de1" +keep_set_sha256 = "4f70bf549022d6f1ccdfbdd13609ffe69d044652c0ee2174355d5d91f5fecdba" +kept_sections = [ + ".rodata..Lanon.8d92bed9e8e7b068fae37f7046779d90.208", + ".text._RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8", +] +roots = [ + "_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8", +] + +[[lib2_objects]] +name = "lib2_2.o" +path = "work/lib2_2.o" +sha256 = "6ec1dfbc758c040efef465c5644d77702d2e5798068f08b76ae59c4e9ec4a6dd" +size = 9584 +config_index = 2 +defined_symbols = [ + "_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since", +] +rlib = "libstd-96c9fe7a07d47cf2.rlib" +rlib_sha256 = "" +member = "std-96c9fe7a07d47cf2.std.2e66b1facfa492c-cgu.0.rcgu.o" +member_sha256 = "d5f890bc180a13054d49f8dfd74afb16a1bd997c3eeea009ceda7234cd2b197b" +keep_set_sha256 = "c8e5ac358b17c0df1edf3ba4aafc0ae3832cad6aacba7a9229c04f2de53b216a" +kept_sections = [ + ".data.rel.ro..Lanon.5394cca77e622eba6ee760626b780c72.153", + ".rodata..Lanon.5394cca77e622eba6ee760626b780c72.151", + ".rodata.cst16", + ".rodata.str1.1", + ".text._RNvMNtNtNtNtCsfr5T3GFabw_3std3sys3pal4unix4timeNtB2_8Timespec12sub_timespec", + ".text._RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since", +] +roots = [ + "_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since", +] + +[[lib2_objects]] +name = "lib2_3.o" +path = "work/lib2_3.o" +sha256 = "9c0f86c4e6b34ebdc5300a2ffa4c1c4bc49ad34e24af5089e7e6f6d1a3cf2618" +size = 1576 +config_index = 2 +defined_symbols = [ + "_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek", + "_RNvXs4_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPointNtCsjhEzohgaBbG_7zeroize7Zeroize7zeroize", + "_RNvXsl_NtCs2wR8L9wiBdT_16curve25519_dalek6scalarNtB5_6ScalarNtCsjhEzohgaBbG_7zeroize7Zeroize7zeroize", + "_RNvXsw_NtCs2wR8L9wiBdT_16curve25519_dalek9ristrettoNtB5_19CompressedRistrettoNtCsjhEzohgaBbG_7zeroize7Zeroize7zeroize", +] +rlib = "libcurve25519_dalek-c7366f106db98a9c.rlib" +rlib_sha256 = "" +member = "curve25519_dalek-c7366f106db98a9c.curve25519_dalek.1d77ca7acaab0e03-cgu.0.rcgu.o" +member_sha256 = "248cc2de4366da1f4a0818f40827cd0ae7ad44bb2c1ddea434634f512412bf47" +keep_set_sha256 = "ac143d390720379e5d1121de7534b7a1707ac6b0fa4f2934d05f640075241de1" +kept_sections = [ + ".text._RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek", + ".text._RNvXs4_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPointNtCsjhEzohgaBbG_7zeroize7Zeroize7zeroize", +] +roots = [ + "_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek", + "_RNvXs4_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPointNtCsjhEzohgaBbG_7zeroize7Zeroize7zeroize", +] + +[[lib2_objects]] +name = "lib2_4.o" +path = "work/lib2_4.o" +sha256 = "a747bf4693bbe877a750af8fbebab53d5e0d54cb6a587947a50c95e7fef6f2ed" +size = 1848 +config_index = 2 +defined_symbols = [ + "_RNvXs1_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_9PublicKeyNtCsjhEzohgaBbG_7zeroize7Zeroize7zeroize", + "_RNvXs4_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_15EphemeralSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + "_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + "_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", +] +rlib = "libx25519_dalek-93ab6b057b4c9272.rlib" +rlib_sha256 = "" +member = "x25519_dalek-93ab6b057b4c9272.x25519_dalek.9617d460537667a0-cgu.0.rcgu.o" +member_sha256 = "7a7959f5774fdafe9243f21cf3a0b58d36dfc4ff299a938832cc938587bd01da" +keep_set_sha256 = "fad343352e997fc33d9b6bfe0f11cf29ea8e2b73c939da2c3f29997b97e0dc09" +kept_sections = [ + ".text._RNvXs1_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_9PublicKeyNtCsjhEzohgaBbG_7zeroize7Zeroize7zeroize", + ".text._RNvXs4_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_15EphemeralSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", +] +roots = [ + "_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + "_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", +] + +[[lib2_objects]] +name = "lib2_5.o" +path = "work/lib2_5.o" +sha256 = "474d59404916bffb58bb4ee5952b9f6cbc422e6922974ad95d79c713a84812ad" +size = 1280 +config_index = 2 +defined_symbols = [ + "_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add", +] +rlib = "libstd-96c9fe7a07d47cf2.rlib" +rlib_sha256 = "" +member = "std-96c9fe7a07d47cf2.std.2e66b1facfa492c-cgu.0.rcgu.o" +member_sha256 = "d5f890bc180a13054d49f8dfd74afb16a1bd997c3eeea009ceda7234cd2b197b" +keep_set_sha256 = "eb6e662997594080c4a5b72c3d839f66c0dd957038c614a3edc5e7c8b7063ee9" +kept_sections = [ + ".rodata..Lanon.5394cca77e622eba6ee760626b780c72.687", + ".text._RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add", +] +roots = [ + "_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add", +] + +[[retired_stub_slots]] +symbol = "_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek" +retired_symbol = "__retired_3" +retired_section = ".text.__retired_3" +orig_addr = "0x46890c" +size = 4 + +[[retired_stub_slots]] +symbol = "_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since" +retired_symbol = "__retired_2" +retired_section = ".text.__retired_2" +orig_addr = "0x468938" +size = 4 + +[[retired_stub_slots]] +symbol = "_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8" +retired_symbol = "__retired_1" +retired_section = ".text.__retired_1" +orig_addr = "0x4689bc" +size = 4 + +[[retired_stub_slots]] +symbol = "_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr" +retired_symbol = "__retired_0" +retired_section = ".text.__retired_0" +orig_addr = "0x4689c4" +size = 4 + +[[retired_stub_slots]] +symbol = "_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add" +retired_symbol = "__retired_6" +retired_section = ".text.__retired_6" +orig_addr = "0x4689ec" +size = 4 + +[[retired_stub_slots]] +symbol = "_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop" +retired_symbol = "__retired_4" +retired_section = ".text.__retired_4" +orig_addr = "0x468a0c" +size = 4 + +[[retired_stub_slots]] +symbol = "_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop" +retired_symbol = "__retired_5" +retired_section = ".text.__retired_5" +orig_addr = "0x468a14" +size = 4 + [displaced_weak_elf_addrs] __aarch64_cas8_acq_rel = "0x468a3c" __aarch64_ldadd8_rel = "0x468a40" __aarch64_ldadd8_relax = "0x468a44" [stock_lld_arg_files] -"third_party/libsignal/libsignal-session/cli-elf/stock.ld" = "ddd8dd9df46f6ed840fe35ec185cd754cd82a2e18d608b5c6268779b1e5c4daa" +"third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld" = "a9066f2183c8fa29b7412913628dd3d316ac3990a1868cca3e23b0c4b8757459" [x_per_image] 0 = [ @@ -551,11 +927,15 @@ __aarch64_ldadd8_relax = "0x468a44" "read", "write", ] +2 = [ + "_RNvNtCskxtBwYRO61I_4core6option13expect_failed", + "_RNvNtNtCskxtBwYRO61I_4core5slice5index16slice_index_fail", +] [w3_pin] elf_name = "libsignal-cli.elf" -elf_sha256 = "2f20c836342437a882b5882c34eab604e4f23b2b388c2b2a0696eeda51cddc7e" -elf_size = 617448 +elf_sha256 = "50066cbd732256eb5f19f93d1d98800914336b7926225de3ebfa0bb37eca98ce" +elf_size = 619032 elf_entry = "0x46a000" main_elf_addr = "0x467408" lean_pin_path = "LibsignalBinary/Specifications/SignalSession/CliElf.lean" @@ -572,6 +952,15 @@ _RNvCs9Xul1Kjr0QF_16libsignal_cli_io10read_stdin = "0x469000" _RNvCs9Xul1Kjr0QF_16libsignal_cli_io10write_file = "0x468724" _RNvCs9Xul1Kjr0QF_16libsignal_cli_io12write_stdout = "0x468854" +[w3_pin.placed_exports.2] +_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek = "0x46ea94" +_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since = "0x46ea44" +_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8 = "0x46e6e4" +_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr = "0x46e5bc" +_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add = "0x46eca4" +_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop = "0x46eba8" +_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop = "0x46eba4" + [runtime_archives] "compiler_builtins.a" = "e9ede836762ee857758dcacd0a75f42eb68a7220d8c490648ef2c34a3b0d9958" "crt1.o" = "2c8595cff75b182ad59c0278d5f81bed2cf1e51b5bf9324db52142c89dd6479f" @@ -591,9 +980,9 @@ source_sha256 = "b1ea6c885b72ada33a0a52d4a8df3efdd0ddab579455e8853b5d85340a24da5 [stub_object] name = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" -size = 38288 -symbol_count = 129 +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" +size = 36928 +symbol_count = 122 [g6_rebuild_pins.harness_object] name = "main_rust.o" @@ -620,7 +1009,7 @@ build_recipe = "cargo build -Zbuild-std=core,alloc,std,panic_abort --target aarc [s2_real_body_lock.bcmp] definer_class = "R" -elf_addr = "0x468ba8" +elf_addr = "0x469a40" size = 4 input_section = ".text.bcmp" source_file = "libc.a" @@ -638,11 +1027,11 @@ member_name = "bcmp.lo" member_file_sha = "9fdd6311a2502468ad67727017a186bc0189d78a58cc525e1466516f0408cba5" byte_equal = true member_text_relocs = 1 -bcmp_branch_target = "0x468b74" +bcmp_branch_target = "0x469a0c" [s2_real_body_lock.memcmp] definer_class = "R" -elf_addr = "0x468b74" +elf_addr = "0x469a0c" size = 52 input_section = ".text.memcmp" source_file = "libc.a" @@ -684,7 +1073,7 @@ member_text_relocs = 0 [s2_real_body_lock.memmove] definer_class = "R" -elf_addr = "0x468a4c" +elf_addr = "0x4698e4" size = 296 input_section = ".text.memmove" source_file = "libc.a" @@ -693,7 +1082,7 @@ sha256 = "1e57042165b65670bd83a6fba77a375595b5a444a6d5b611ced91e60bf0be4de" archive_sha256 = "b03473b6f1efb72f700f561b4407a88885b37e0edb5cdb2a64de0df5499e813f" input_binding = "STB_GLOBAL" text_sha = "c12d467225cb80b716bf2937af29adf446439046c9ff9a980eb4c4daf6875508" -body_sha256 = "29f73b1800a3451387a2493ccfc81f74c325d4d73dd81f7adbd98c9a7a2ecc32" +body_sha256 = "6490c2a56810c33dda3e5fa1e2b5baa64ecbf9121806f5191e1541b9db74baa4" relocs = [ { offset = 104, r_type = 282, r_type_name = "R_AARCH64_JUMP26", target_symbol = "memcpy", addend = 0 }, ] @@ -725,7 +1114,7 @@ member_text_relocs = 0 [s2_real_body_lock.strlen] definer_class = "R" -elf_addr = "0x468bac" +elf_addr = "0x469a44" size = 88 input_section = ".text.strlen" source_file = "libc.a" @@ -761,7 +1150,7 @@ elf_addr = "0x46f020" size = 8 input_section = ".data._RNvCs4Dv7yoBiUx4_3log20MAX_LOG_LEVEL_FILTER" source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" [d1_extern_data_lock.kept._RNvNtNtNtNtCs2wR8L9wiBdT_16curve25519_dalek7backend6serial3u649constants23ED25519_BASEPOINT_TABLE] demangled_name = "curve25519_dalek::backend::serial::u64::constants::ED25519_BASEPOINT_TABLE" @@ -771,7 +1160,7 @@ elf_addr = "0x46f028" size = 8 input_section = ".data._RNvNtNtNtNtCs2wR8L9wiBdT_16curve25519_dalek7backend6serial3u649constants23ED25519_BASEPOINT_TABLE" source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" [n_undef_map."rdl_shim.o".calloc] class = "R" @@ -823,17 +1212,19 @@ sha256 = "ad86fd633bd070e609d33cedbe731d40498443e42b33af62db82a36481eca8b4" elf_addr = "0x46da2c" [definers._RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek] -class = "Z" +class = "S" demangled = "subtle::black_box::" images = [0] -source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" -elf_addr = "0x46890c" -size = 4 +source_file = "lib2_3.o" +sha256 = "9c0f86c4e6b34ebdc5300a2ffa4c1c4bc49ad34e24af5089e7e6f6d1a3cf2618" +elf_addr = "0x46ea94" +size = 20 input_section = ".text._RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek" input_binding = "STB_GLOBAL" +body_sha256 = "ff526bddf26d2e61ad4732a8b26d51bc2f4af6c80fd7cf02a5ff42ddde3ae49a" +reloc_count = 0 in_engine_hooked_externs = true -is_hook_key = true +is_hook_key = false is_panic_symbol = false [definers._RINvNtCskxtBwYRO61I_4core9panicking13assert_failedjjEB4_] @@ -841,7 +1232,7 @@ class = "Z" demangled = "core::panicking::assert_failed::" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468910" size = 4 input_section = ".text._RINvNtCskxtBwYRO61I_4core9panicking13assert_failedjjEB4_" @@ -855,7 +1246,7 @@ class = "Z" demangled = "core::panicking::assert_failed::" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468914" size = 4 input_section = ".text._RINvNtCskxtBwYRO61I_4core9panicking13assert_failedyyEB4_" @@ -949,7 +1340,7 @@ class = "Z" demangled = "log::MAX_LOG_LEVEL_FILTER" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x46f020" size = 8 input_section = ".data._RNvCs4Dv7yoBiUx4_3log20MAX_LOG_LEVEL_FILTER" @@ -963,7 +1354,7 @@ class = "Z" demangled = "libcrux_hmac::hmac" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468918" size = 4 input_section = ".text._RNvCs65XVORQObL2_12libcrux_hmac4hmac" @@ -1041,7 +1432,7 @@ class = "Z" demangled = "::from_bytes_mod_order" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x46891c" size = 4 input_section = ".text._RNvMNtCs2wR8L9wiBdT_16curve25519_dalek6scalarNtB2_6Scalar20from_bytes_mod_order" @@ -1055,7 +1446,7 @@ class = "Z" demangled = "::from_bytes_mod_order_wide" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468920" size = 4 input_section = ".text._RNvMNtCs2wR8L9wiBdT_16curve25519_dalek6scalarNtB2_6Scalar25from_bytes_mod_order_wide" @@ -1105,7 +1496,7 @@ class = "Z" demangled = "::pk1" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468924" size = 4 input_section = ".text._RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes3pk1" @@ -1119,7 +1510,7 @@ class = "Z" demangled = "::pk2" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468928" size = 4 input_section = ".text._RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes3pk2" @@ -1133,7 +1524,7 @@ class = "Z" demangled = "::from_seed" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x46892c" size = 4 input_section = ".text._RNvMs0_NtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incrementalNtB5_22KeyPairCompressedBytes9from_seed" @@ -1156,7 +1547,7 @@ class = "Z" demangled = "::call" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468930" size = 4 input_section = ".text._RNvMs0_NtNtNtNtCsfr5T3GFabw_3std3sys4sync4once5futexNtB5_4Once4call" @@ -1206,7 +1597,7 @@ class = "Z" demangled = "::to_edwards" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468934" size = 4 input_section = ".text._RNvMs5_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPoint10to_edwards" @@ -1225,17 +1616,19 @@ is_hook_key = false is_panic_symbol = false [definers._RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since] -class = "Z" +class = "S" demangled = "::duration_since" images = [0] -source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" -elf_addr = "0x468938" -size = 4 +source_file = "lib2_2.o" +sha256 = "6ec1dfbc758c040efef465c5644d77702d2e5798068f08b76ae59c4e9ec4a6dd" +elf_addr = "0x46ea44" +size = 80 input_section = ".text._RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since" input_binding = "STB_GLOBAL" +body_sha256 = "b3c4dcd9e9261b6571d1d94fd25d9d13d7b9685828e27f052c75e781c039db06" +reloc_count = 1 in_engine_hooked_externs = true -is_hook_key = true +is_hook_key = false is_panic_symbol = false [definers._RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime3now] @@ -1279,7 +1672,7 @@ class = "Z" demangled = "::diffie_hellman" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x46893c" size = 4 input_section = ".text._RNvMs6_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecret14diffie_hellman" @@ -1320,7 +1713,7 @@ class = "Z" demangled = "::debug_tuple_field1_finish" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468940" size = 4 input_section = ".text._RNvMsa_NtCskxtBwYRO61I_4core3fmtNtB5_9Formatter25debug_tuple_field1_finish" @@ -1352,7 +1745,7 @@ class = "Z" demangled = "::debug_struct_field2_finish" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468944" size = 4 input_section = ".text._RNvMsa_NtCskxtBwYRO61I_4core3fmtNtB5_9Formatter26debug_struct_field2_finish" @@ -1366,7 +1759,7 @@ class = "Z" demangled = "::pad" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468948" size = 4 input_section = ".text._RNvMsa_NtCskxtBwYRO61I_4core3fmtNtB5_9Formatter3pad" @@ -1380,7 +1773,7 @@ class = "Z" demangled = "::write_str" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x46894c" size = 4 input_section = ".text._RNvMsa_NtCskxtBwYRO61I_4core3fmtNtB5_9Formatter9write_str" @@ -1394,7 +1787,7 @@ class = "Z" demangled = "::_fmt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468950" size = 4 input_section = ".text._RNvMsa_NtNtNtCskxtBwYRO61I_4core3fmt3num3impm4__fmt" @@ -1408,7 +1801,7 @@ class = "Z" demangled = "::compress" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468954" size = 4 input_section = ".text._RNvMsg_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint8compress" @@ -1422,7 +1815,7 @@ class = "Z" demangled = "::vartime_double_scalar_mul_basepoint" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468958" size = 4 input_section = ".text._RNvMsw_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint35vartime_double_scalar_mul_basepoint" @@ -1436,7 +1829,7 @@ class = "Z" demangled = "::is_torsion_free" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x46895c" size = 4 input_section = ".text._RNvMsx_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPoint15is_torsion_free" @@ -1459,7 +1852,7 @@ class = "Z" demangled = "alloc::alloc::handle_alloc_error" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468960" size = 4 input_section = ".text._RNvNtCs69KKACWg7bl_5alloc5alloc18handle_alloc_error" @@ -1473,7 +1866,7 @@ class = "Z" demangled = "alloc::raw_vec::handle_error" images = [0, 1] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468964" size = 4 input_section = ".text._RNvNtCs69KKACWg7bl_5alloc7raw_vec12handle_error" @@ -1487,7 +1880,7 @@ class = "Z" demangled = "signal_crypto::aes_cbc::aes_256_cbc_decrypt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468968" size = 4 input_section = ".text._RNvNtCsbKnPy0UR4Ui_13signal_crypto7aes_cbc19aes_256_cbc_decrypt" @@ -1501,7 +1894,7 @@ class = "Z" demangled = "signal_crypto::aes_cbc::aes_256_cbc_encrypt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x46896c" size = 4 input_section = ".text._RNvNtCsbKnPy0UR4Ui_13signal_crypto7aes_cbc19aes_256_cbc_encrypt" @@ -1515,7 +1908,7 @@ class = "Z" demangled = "sha2::sha256::compress256" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468970" size = 4 input_section = ".text._RNvNtCsbvWyylYiyxg_4sha26sha25611compress256" @@ -1529,7 +1922,7 @@ class = "Z" demangled = "sha2::sha512::compress512" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468974" size = 4 input_section = ".text._RNvNtCsbvWyylYiyxg_4sha26sha51211compress512" @@ -1552,7 +1945,7 @@ class = "Z" demangled = "core::fmt::write" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468978" size = 4 input_section = ".text._RNvNtCskxtBwYRO61I_4core3fmt5write" @@ -1573,9 +1966,9 @@ is_panic_symbol = false [definers._RNvNtCskxtBwYRO61I_4core6option13expect_failed] class = "Z" demangled = "core::option::expect_failed" -images = [0] +images = [0, 2] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x46897c" size = 4 input_section = ".text._RNvNtCskxtBwYRO61I_4core6option13expect_failed" @@ -1589,7 +1982,7 @@ class = "Z" demangled = "core::option::unwrap_failed" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468980" size = 4 input_section = ".text._RNvNtCskxtBwYRO61I_4core6option13unwrap_failed" @@ -1603,7 +1996,7 @@ class = "Z" demangled = "core::result::unwrap_failed" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468984" size = 4 input_section = ".text._RNvNtCskxtBwYRO61I_4core6result13unwrap_failed" @@ -1617,7 +2010,7 @@ class = "Z" demangled = "core::panicking::panic_bounds_check" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468988" size = 4 input_section = ".text._RNvNtCskxtBwYRO61I_4core9panicking18panic_bounds_check" @@ -1631,7 +2024,7 @@ class = "Z" demangled = "core::panicking::assert_failed_inner" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x46898c" size = 4 input_section = ".text._RNvNtCskxtBwYRO61I_4core9panicking19assert_failed_inner" @@ -1645,7 +2038,7 @@ class = "Z" demangled = "core::panicking::panic" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468990" size = 4 input_section = ".text._RNvNtCskxtBwYRO61I_4core9panicking5panic" @@ -1659,7 +2052,7 @@ class = "Z" demangled = "core::panicking::panic_fmt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468994" size = 4 input_section = ".text._RNvNtCskxtBwYRO61I_4core9panicking9panic_fmt" @@ -1673,7 +2066,7 @@ class = "Z" demangled = "cpufeatures::aarch64::getauxval_hwcap" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468998" size = 4 input_section = ".text._RNvNtCslWItzXo2NmA_11cpufeatures7aarch6415getauxval_hwcap" @@ -1687,7 +2080,7 @@ class = "Z" demangled = "libcrux_ml_kem::mlkem768::incremental::encapsulate1" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x46899c" size = 4 input_section = ".text._RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental12encapsulate1" @@ -1701,7 +2094,7 @@ class = "Z" demangled = "libcrux_ml_kem::mlkem768::incremental::encapsulate2" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689a0" size = 4 input_section = ".text._RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental12encapsulate2" @@ -1715,7 +2108,7 @@ class = "Z" demangled = "libcrux_ml_kem::mlkem768::incremental::validate_pk_bytes" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689a4" size = 4 input_section = ".text._RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental17validate_pk_bytes" @@ -1729,7 +2122,7 @@ class = "Z" demangled = "libcrux_ml_kem::mlkem768::incremental::decapsulate_compressed_key" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689a8" size = 4 input_section = ".text._RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem8mlkem76811incremental26decapsulate_compressed_key" @@ -1743,7 +2136,7 @@ class = "Z" demangled = "libcrux_ml_kem::mlkem1024::kyber::decapsulate" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689ac" size = 4 input_section = ".text._RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber11decapsulate" @@ -1757,7 +2150,7 @@ class = "Z" demangled = "libcrux_ml_kem::mlkem1024::kyber::encapsulate" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689b0" size = 4 input_section = ".text._RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber11encapsulate" @@ -1771,7 +2164,7 @@ class = "Z" demangled = "libcrux_ml_kem::mlkem1024::kyber::generate_key_pair" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689b4" size = 4 input_section = ".text._RNvNtNtCs1mK0QScfTrZ_14libcrux_ml_kem9mlkem10245kyber17generate_key_pair" @@ -1839,7 +2232,7 @@ class = "Z" demangled = "std::sync::lazy_lock::panic_poisoned" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689b8" size = 4 input_section = ".text._RNvNtNtCsfr5T3GFabw_3std4sync9lazy_lock14panic_poisoned" @@ -1849,25 +2242,27 @@ is_hook_key = false is_panic_symbol = false [definers._RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8] -class = "Z" +class = "S" demangled = "core::str::converts::from_utf8" images = [0] -source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" -elf_addr = "0x4689bc" -size = 4 +source_file = "lib2_1.o" +sha256 = "af8ac10dcb7951e00d44feb9f267bdd2f68283a7baad9c559ac9f2a788eb6007" +elf_addr = "0x46e6e4" +size = 624 input_section = ".text._RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8" input_binding = "STB_GLOBAL" +body_sha256 = "6d109a49582674ac1181991a1077d7e2eecf8e41e1d96a8547793e887f49227a" +reloc_count = 2 in_engine_hooked_externs = true -is_hook_key = true +is_hook_key = false is_panic_symbol = false [definers._RNvNtNtCskxtBwYRO61I_4core5slice5index16slice_index_fail] class = "Z" demangled = "core::slice::index::slice_index_fail" -images = [0] +images = [0, 2] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689c0" size = 4 input_section = ".text._RNvNtNtCskxtBwYRO61I_4core5slice5index16slice_index_fail" @@ -1886,17 +2281,19 @@ is_hook_key = false is_panic_symbol = false [definers._RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr] -class = "Z" +class = "S" demangled = "core::slice::memchr::memrchr" images = [0] -source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" -elf_addr = "0x4689c4" -size = 4 +source_file = "lib2_0.o" +sha256 = "549db8da24af44680ab4c67e017b11ca8a3fbe9cb3e8a9470ef99b0bb74e5c60" +elf_addr = "0x46e5bc" +size = 296 input_section = ".text._RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr" input_binding = "STB_GLOBAL" +body_sha256 = "b14c4579b64786d11c865013c2e6a31039cb2c2c1f7536a6e586a9bf1cc3f783" +reloc_count = 6 in_engine_hooked_externs = true -is_hook_key = true +is_hook_key = false is_panic_symbol = false [definers._RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_add_overflow] @@ -1904,7 +2301,7 @@ class = "Z" demangled = "core::panicking::panic_const::panic_const_add_overflow" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689c8" size = 4 input_section = ".text._RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_add_overflow" @@ -1918,7 +2315,7 @@ class = "Z" demangled = "core::panicking::panic_const::panic_const_mul_overflow" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689cc" size = 4 input_section = ".text._RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_mul_overflow" @@ -1932,7 +2329,7 @@ class = "Z" demangled = "core::panicking::panic_const::panic_const_shl_overflow" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689d0" size = 4 input_section = ".text._RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_shl_overflow" @@ -1946,7 +2343,7 @@ class = "Z" demangled = "core::panicking::panic_const::panic_const_sub_overflow" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689d4" size = 4 input_section = ".text._RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const24panic_const_sub_overflow" @@ -1960,7 +2357,7 @@ class = "Z" demangled = "core::panicking::panic_const::panic_const_async_fn_resumed" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689d8" size = 4 input_section = ".text._RNvNtNtCskxtBwYRO61I_4core9panicking11panic_const28panic_const_async_fn_resumed" @@ -2001,7 +2398,7 @@ class = "Z" demangled = "curve25519_dalek::backend::serial::u64::constants::ED25519_BASEPOINT_TABLE" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x46f028" size = 8 input_section = ".data._RNvNtNtNtNtCs2wR8L9wiBdT_16curve25519_dalek7backend6serial3u649constants23ED25519_BASEPOINT_TABLE" @@ -2015,7 +2412,7 @@ class = "Z" demangled = "_RNvNvMs_NtCs69KKACWg7bl_5alloc3vecINtB6_3VecppE6remove13assert_failed" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689dc" size = 4 input_section = ".text._RNvNvMs_NtCs69KKACWg7bl_5alloc3vecINtB6_3VecppE6remove13assert_failed" @@ -2029,7 +2426,7 @@ class = "Z" demangled = "alloc::fmt::format::format_inner" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689e0" size = 4 input_section = ".text._RNvNvNtCs69KKACWg7bl_5alloc3fmt6format12format_inner" @@ -2043,7 +2440,7 @@ class = "Z" demangled = "::fmt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689e4" size = 4 input_section = ".text._RNvXNtNtNtCskxtBwYRO61I_4core3fmt3num3imphNtB6_7Display3fmt" @@ -2057,7 +2454,7 @@ class = "Z" demangled = "::log" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689e8" size = 4 input_section = ".text._RNvXs0_NtCs4Dv7yoBiUx4_3log13___private_apiNtB5_12GlobalLoggerNtB7_3Log3log" @@ -2076,17 +2473,19 @@ is_hook_key = false is_panic_symbol = false [definers._RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add] -class = "Z" +class = "S" demangled = ">::add" images = [0] -source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" -elf_addr = "0x4689ec" -size = 4 +source_file = "lib2_5.o" +sha256 = "474d59404916bffb58bb4ee5952b9f6cbc422e6922974ad95d79c713a84812ad" +elf_addr = "0x46eca4" +size = 96 input_section = ".text._RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add" input_binding = "STB_GLOBAL" +body_sha256 = "3bf66eb09df85c5fcec193de18a1e9472d9f29f5dd2cdfe6d2a14eb5129a08d4" +reloc_count = 3 in_engine_hooked_externs = true -is_hook_key = true +is_hook_key = false is_panic_symbol = false [definers._RNvXs6_NtNtCskxtBwYRO61I_4core3fmt3numjNtB7_8LowerHex3fmt] @@ -2094,7 +2493,7 @@ class = "Z" demangled = "::fmt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689f0" size = 4 input_section = ".text._RNvXs6_NtNtCskxtBwYRO61I_4core3fmt3numjNtB7_8LowerHex3fmt" @@ -2108,7 +2507,7 @@ class = "Z" demangled = ">::from" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689f4" size = 4 input_section = ".text._RNvXs8_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_9PublicKeyINtNtCskxtBwYRO61I_4core7convert4FromRNtB5_12StaticSecretE4from" @@ -2122,7 +2521,7 @@ class = "Z" demangled = "::fmt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689f8" size = 4 input_section = ".text._RNvXs8_NtNtCskxtBwYRO61I_4core3fmt3numjNtB7_8UpperHex3fmt" @@ -2136,7 +2535,7 @@ class = "Z" demangled = "::fmt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x4689fc" size = 4 input_section = ".text._RNvXs8_NtNtNtCskxtBwYRO61I_4core3fmt3num3impmNtB9_7Display3fmt" @@ -2177,7 +2576,7 @@ class = "Z" demangled = "<&curve25519_dalek::scalar::Scalar as core::ops::arith::Mul<&curve25519_dalek::edwards::EdwardsBasepointTable>>::mul" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a00" size = 4 input_section = ".text._RNvXsX_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsRNtNtB7_6scalar6ScalarINtNtNtCskxtBwYRO61I_4core3ops5arith3MulRNtB5_21EdwardsBasepointTableE3mul" @@ -2191,7 +2590,7 @@ class = "Z" demangled = "::next" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a04" size = 4 input_section = ".text._RNvXs_CsdZv6vxPi7MZ_3hexNtB4_15BytesToHexCharsNtNtNtNtCskxtBwYRO61I_4core4iter6traits8iterator8Iterator4next" @@ -2205,7 +2604,7 @@ class = "Z" demangled = "::size_hint" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a08" size = 4 input_section = ".text._RNvXs_CsdZv6vxPi7MZ_3hexNtB4_15BytesToHexCharsNtNtNtNtCskxtBwYRO61I_4core4iter6traits8iterator8Iterator9size_hint" @@ -2224,17 +2623,19 @@ is_hook_key = false is_panic_symbol = false [definers._RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop] -class = "Z" +class = "S" demangled = "::drop" images = [0] -source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" -elf_addr = "0x468a0c" -size = 4 -input_section = ".text._RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop" +source_file = "lib2_4.o" +sha256 = "a747bf4693bbe877a750af8fbebab53d5e0d54cb6a587947a50c95e7fef6f2ed" +elf_addr = "0x46eba8" +size = 252 +input_section = ".text._RNvXs4_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_15EphemeralSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop" input_binding = "STB_GLOBAL" +body_sha256 = "2e8d60b6430f38c0b44129bd5df80bd964335c784016f4d652dc317e0a36192d" +reloc_count = 0 in_engine_hooked_externs = true -is_hook_key = true +is_hook_key = false is_panic_symbol = false [definers._RNvXsa_NtCskxtBwYRO61I_4core4timeNtB5_8DurationNtNtB7_3fmt5Debug3fmt] @@ -2260,7 +2661,7 @@ class = "Z" demangled = "::fmt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a10" size = 4 input_section = ".text._RNvXsd_NtNtNtCskxtBwYRO61I_4core3fmt3num3impyNtB9_7Display3fmt" @@ -2270,17 +2671,19 @@ is_hook_key = false is_panic_symbol = false [definers._RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop] -class = "Z" +class = "S" demangled = "::drop" images = [0] -source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" -elf_addr = "0x468a14" +source_file = "lib2_4.o" +sha256 = "a747bf4693bbe877a750af8fbebab53d5e0d54cb6a587947a50c95e7fef6f2ed" +elf_addr = "0x46eba4" size = 4 -input_section = ".text._RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop" +input_section = ".text._RNvXs1_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_9PublicKeyNtCsjhEzohgaBbG_7zeroize7Zeroize7zeroize" input_binding = "STB_GLOBAL" +body_sha256 = "309faf9c862dcd913ab41a4b2e21a070ed224354b72e9d38f21807e59c39ed09" +reloc_count = 1 in_engine_hooked_externs = true -is_hook_key = true +is_hook_key = false is_panic_symbol = false [definers._RNvXse_NtNtCskxtBwYRO61I_4core3fmt3numhNtB7_8LowerHex3fmt] @@ -2288,7 +2691,7 @@ class = "Z" demangled = "::fmt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a18" size = 4 input_section = ".text._RNvXse_NtNtCskxtBwYRO61I_4core3fmt3numhNtB7_8LowerHex3fmt" @@ -2311,7 +2714,7 @@ class = "Z" demangled = "::fmt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a1c" size = 4 input_section = ".text._RNvXsg_NtNtCskxtBwYRO61I_4core3fmt3numhNtB7_8UpperHex3fmt" @@ -2325,7 +2728,7 @@ class = "Z" demangled = "::fmt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a20" size = 4 input_section = ".text._RNvXsh_NtCskxtBwYRO61I_4core3fmteNtB5_5Debug3fmt" @@ -2339,7 +2742,7 @@ class = "Z" demangled = "::fmt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a24" size = 4 input_section = ".text._RNvXsi_NtCskxtBwYRO61I_4core3fmteNtB5_7Display3fmt" @@ -2353,7 +2756,7 @@ class = "Z" demangled = "::fmt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a28" size = 4 input_section = ".text._RNvXsi_NtNtNtCskxtBwYRO61I_4core3fmt3num3impjNtB9_7Display3fmt" @@ -2385,7 +2788,7 @@ class = "Z" demangled = "::neg" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a2c" size = 4 input_section = ".text._RNvXso_NtCs2wR8L9wiBdT_16curve25519_dalek7edwardsNtB5_12EdwardsPointNtNtNtCskxtBwYRO61I_4core3ops5arith3Neg3neg" @@ -2426,7 +2829,7 @@ class = "Z" demangled = "::mul" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a30" size = 4 input_section = ".text._RNvXsv_NtCs2wR8L9wiBdT_16curve25519_dalek6scalarNtB5_6ScalarNtNtNtCskxtBwYRO61I_4core3ops5arith3Mul3mul" @@ -2449,7 +2852,7 @@ class = "Z" demangled = "::fmt" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a34" size = 4 input_section = ".text._RNvXsw_NtNtCskxtBwYRO61I_4core3fmt3nummNtB7_8UpperHex3fmt" @@ -2472,7 +2875,7 @@ class = "Z" demangled = "::add" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a38" size = 4 input_section = ".text._RNvXsz_NtCs2wR8L9wiBdT_16curve25519_dalek6scalarNtB5_6ScalarNtNtNtCskxtBwYRO61I_4core3ops5arith3Add3add" @@ -2486,7 +2889,7 @@ class = "Z" demangled = "__aarch64_cas8_acq_rel" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a3c" size = 4 input_section = ".text.__aarch64_cas8_acq_rel" @@ -2500,7 +2903,7 @@ class = "Z" demangled = "__aarch64_ldadd8_rel" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a40" size = 4 input_section = ".text.__aarch64_ldadd8_rel" @@ -2514,7 +2917,7 @@ class = "Z" demangled = "__aarch64_ldadd8_relax" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a44" size = 4 input_section = ".text.__aarch64_ldadd8_relax" @@ -2549,7 +2952,7 @@ source_file = "libc.a" archive_member = "bcmp.lo" sha256 = "9fdd6311a2502468ad67727017a186bc0189d78a58cc525e1466516f0408cba5" archive_sha256 = "b03473b6f1efb72f700f561b4407a88885b37e0edb5cdb2a64de0df5499e813f" -elf_addr = "0x468ba8" +elf_addr = "0x469a40" size = 4 input_section = ".text.bcmp" input_binding = "STB_GLOBAL" @@ -2557,7 +2960,7 @@ body_sha256 = "49e2198ec504754f77fdd1d2977c13cdac39abd18c1b2a410f9ae6345000eb51" reloc_count = 1 byte_equal = true in_engine_hooked_externs = true -is_hook_key = true +is_hook_key = false is_panic_symbol = false [definers.close] @@ -2583,7 +2986,7 @@ class = "Z" demangled = "libsignal_session_rng_fill" images = [0] source_file = "extern_stubs_clean.o" -sha256 = "ea88d803608b5fcb1c9bbec41a273d5121ff2735af5bc927ea9fb18b1d253573" +sha256 = "7e1f69f3178c59a0b16d2eb32823547692f31faec62bbc2399a7610a925bafc3" elf_addr = "0x468a48" size = 4 input_section = ".text.libsignal_session_rng_fill" @@ -2600,7 +3003,7 @@ source_file = "libc.a" archive_member = "memcmp.lo" sha256 = "6c4bd001de16c86defb61ee0e8e62b53987a6d0e5e72637cf73df46b81fe3f4a" archive_sha256 = "b03473b6f1efb72f700f561b4407a88885b37e0edb5cdb2a64de0df5499e813f" -elf_addr = "0x468b74" +elf_addr = "0x469a0c" size = 52 input_section = ".text.memcmp" input_binding = "STB_GLOBAL" @@ -2638,15 +3041,15 @@ source_file = "libc.a" archive_member = "memmove.lo" sha256 = "1e57042165b65670bd83a6fba77a375595b5a444a6d5b611ced91e60bf0be4de" archive_sha256 = "b03473b6f1efb72f700f561b4407a88885b37e0edb5cdb2a64de0df5499e813f" -elf_addr = "0x468a4c" +elf_addr = "0x4698e4" size = 296 input_section = ".text.memmove" input_binding = "STB_GLOBAL" -body_sha256 = "29f73b1800a3451387a2493ccfc81f74c325d4d73dd81f7adbd98c9a7a2ecc32" +body_sha256 = "6490c2a56810c33dda3e5fa1e2b5baa64ecbf9121806f5191e1541b9db74baa4" reloc_count = 1 byte_equal = true in_engine_hooked_externs = true -is_hook_key = true +is_hook_key = false is_panic_symbol = false [definers.memset] @@ -2712,7 +3115,7 @@ source_file = "libc.a" archive_member = "strlen.lo" sha256 = "485bad76aa759b278a152412850885ad84fab30893998d18337c2d1d1d56ec81" archive_sha256 = "b03473b6f1efb72f700f561b4407a88885b37e0edb5cdb2a64de0df5499e813f" -elf_addr = "0x468bac" +elf_addr = "0x469a44" size = 88 input_section = ".text.strlen" input_binding = "STB_GLOBAL" @@ -2720,7 +3123,7 @@ body_sha256 = "571c771cac9cac1c9fd88c8e866dd609ce09c23f158e4817e8dab007c93ba1ec" reloc_count = 0 byte_equal = true in_engine_hooked_externs = true -is_hook_key = true +is_hook_key = false is_panic_symbol = false [definers.write] diff --git a/third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld b/third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld new file mode 100644 index 000000000..0c4daa3c1 --- /dev/null +++ b/third_party/libsignal/libsignal-session/cli-elf/stock/stock_c2.ld @@ -0,0 +1,206 @@ +/* Deterministic stock `ld.lld` linker script v2 (C2 `D-C2f = 2C` variant) for `libsignal-cli`. + * + * Identical to `cli-elf/stock.ld` except that the 4 de-hooked `libc.a` string primitives + * (`memmove.lo` -> `memcmp.lo` -> `bcmp.lo` -> `strlen.lo`) are placed at the tail of `.text.b_pre` + * (`:text_b`, `< e_entry`) immediately after `memset.lo` instead of `.text.crate` (`:text_a`), + * preserving `bcmp`'s `b memcmp` branch word and the 56-byte `memcmp + bcmp` hull. + * Generated deterministically from `cli-elf/stock.ld` by `_render_c2_stock_ld`. + * + * Layout invariants (2-config `--no-relax` `StdBin` ELF with `rustc 1.98.1` `self-contained/libc.a`): + * 1. Four page-aligned, non-overlapping W^X `PT_LOAD` segments (`:ro` R, `:text_a` RX, `:text_b` RX, + * `:data` RW) starting at `0x400000` with `FILEHDR PHDRS` mapped at `[0x400000, 0x400000 + SIZEOF_HEADERS)` + * for musl `AT_PHDR` / `AT_PHNUM` discovery (`e_phnum = 7`): + * - `:ro` `FLAGS(4)` (`.rodata` plus optional `.rodata.lib2` for C2 `lib2_*.o` RO / `.data.rel.ro`); + * - `:text_a` `FLAGS(5)`: `.text.crate` holds all `lib0_*.o` crate blocks (including `main`), + * hooked `lib1_*.o` I/O definers (`write_file`, `write_stdout`), `extern_stubs_clean.o` + * (`udf #0` fail-stop/hook/panic stubs + displaced weak `__aarch64_*` atomics + in-place + * `KEEP(.text.__retired_*)` retired stub slots), and `.text.compiler_rt.*`; + * - `:text_b` `FLAGS(5)` (`StdBinaryLayout.rxProgram`): + * - `.text.b_pre` (`< e_entry`) holds non-hook `lib1_*.o` definers (`read_file`, `read_stdin`, + * `RawVecInner::finish_grow`), `rdl_shim.o` (`__rdl_*` + 5 `__rust_*` shims), and musl + * `memcpy.lo` / `memset.lo` followed by `memmove.lo` -> `memcmp.lo` -> `bcmp.lo` -> `strlen.lo` + * (`< e_entry`); + * - `.text` begins at `0x1000`-aligned `e_entry` with `KEEP(*crt1.o(.text.start ...))` + * (`_start == e_entry`), followed by `.init`, musl startup/exit/libc + `mallocng` + `main_rust.o` + * text, and `.fini`, followed at the `:text_b` tail by optional `.text.lib2` (`*lib2_*.o`, + * de-hooked `cli/rt` code enabled atomically at C2). Every hooked `libsignalSessionExterns` + * entry resolves `< e_entry` (`hstubLt`), `e_entry - base(main) > 0` (`hmainOff`), and + * `0` `externAt?` hook keys lie in `[e_entry, text_b_end)` (`lib2` is de-hooked code). + * 2. Page-aligned RW layout in `:data`: + * - `.tdata`, `.tbss` (`PT_TLS` `0/0`), and `.data.crate` occupy the initial `:data` page; + * - Top-level `PROVIDE_HIDDEN` (`indent == 0` in `link.map`) and `. = ALIGN(0x1000);` align + * `.init_array`, `.fini_array`, `.data`, `.got`, and `.bss.musl` to the next `0x1000` boundary; + * - Crate `.bss` follows disjointly after `.bss.musl`. + */ +ENTRY(_start) + +PHDRS +{ + phdr PT_PHDR PHDRS; + ro PT_LOAD FILEHDR PHDRS FLAGS(4); + text_a PT_LOAD FLAGS(5); + text_b PT_LOAD FLAGS(5); + data PT_LOAD FLAGS(6); + tls PT_TLS; + stack PT_GNU_STACK FLAGS(6); +} + +SECTIONS +{ + PROVIDE_HIDDEN(_DYNAMIC = 0); + . = 0x400000 + SIZEOF_HEADERS; + + .rodata : { + *(EXCLUDE_FILE(*lib2_*.o) .rodata EXCLUDE_FILE(*lib2_*.o) .rodata.* EXCLUDE_FILE(*lib2_*.o) .gnu.linkonce.r.*) + *(EXCLUDE_FILE(*lib2_*.o) .data.rel.ro EXCLUDE_FILE(*lib2_*.o) .data.rel.ro.*) + } :ro =0 + + /* `.data.rel.ro` precedes `.rodata` in `.rodata.lib2` so `lib2_5.o` (`SystemTime::add`, whose + * only RO input is a 45-byte `align=1` `.rodata..Lanon` panic string) sits strictly at the end + * of `.rodata.lib2`: dropping `time_add` truncates `.rodata.lib2` without shifting earlier + * `.data.rel.ro` `Location` records or `.rodata` tables. */ + .rodata.lib2 : { + *lib2_*.o(.data.rel.ro .data.rel.ro.*) + *lib2_*.o(.rodata .rodata.* .gnu.linkonce.r.*) + } :ro =0 + + . = ALIGN(0x1000); + + .text.crate : ALIGN(0x1000) { + *lib0_*.o(.text .text.*) + *lib1_*.o(.text.*10write_file .text.*12write_stdout) + main.o(.text .text.*) + */main.o(.text .text.*) + *extern_stubs_clean.o(.text .text.*) + KEEP(*extern_stubs_clean.o(.text.__retired_*)) + *(EXCLUDE_FILE(*lib2_*.o) .text.compiler_rt.*) + } :text_a =0 + + . = ALIGN(0x1000); + + .text.b_pre : ALIGN(0x1000) { + *lib1_*.o(.text .text.*) + *rdl_shim.o(.text .text.*) + memcpy.o(.text .text.*) + */memcpy.o(.text .text.*) + *libc.a:memcpy.lo(.text .text.*) + *memcpy.lo(.text .text.*) + memset.o(.text .text.*) + */memset.o(.text .text.*) + *libc.a:memset.lo(.text .text.*) + *memset.lo(.text .text.*) + memmove.o(.text .text.*) + */memmove.o(.text .text.*) + *libc.a:memmove.lo(.text .text.*) + *memmove.lo(.text .text.*) + memcmp.o(.text .text.*) + */memcmp.o(.text .text.*) + *libc.a:memcmp.lo(.text .text.*) + *memcmp.lo(.text .text.*) + bcmp.o(.text .text.*) + */bcmp.o(.text .text.*) + *libc.a:bcmp.lo(.text .text.*) + *bcmp.lo(.text .text.*) + strlen.o(.text .text.*) + */strlen.o(.text .text.*) + *libc.a:strlen.lo(.text .text.*) + *strlen.lo(.text .text.*) + *(EXCLUDE_FILE(*lib2_*.o) .text.strlen) + } :text_b =0 + + . = ALIGN(0x1000); + + .text : ALIGN(0x1000) { + KEEP(*crt1.o(.text.start .text .text.*)) + KEEP(*(SORT_NONE(.init))) + *(EXCLUDE_FILE(*lib2_*.o) .text EXCLUDE_FILE(*lib2_*.o) .text.* EXCLUDE_FILE(*lib2_*.o) .gnu.linkonce.t.*) + KEEP(*(SORT_NONE(.fini))) + } :text_b =0 + + .text.lib2 : { + *lib2_*.o(.text .text.*) + } :text_b =0 + + . = ALIGN(0x1000); + + .tdata : { + *(.tdata .tdata.* .gnu.linkonce.td.*) + } :data :tls + + .tbss : { + *(.tbss .tbss.* .gnu.linkonce.tb.*) + } :data :tls + + .data.crate : { + *lib0_*.o(.data .data.*) + main.o(.data .data.*) + */main.o(.data .data.*) + *extern_stubs_clean.o(.data .data.*) + memcpy.o(.data .data.*) + */memcpy.o(.data .data.*) + *libc.a:memcpy.lo(.data .data.*) + memset.o(.data .data.*) + */memset.o(.data .data.*) + *libc.a:memset.lo(.data .data.*) + memmove.o(.data .data.*) + */memmove.o(.data .data.*) + *libc.a:memmove.lo(.data .data.*) + memcmp.o(.data .data.*) + */memcmp.o(.data .data.*) + *libc.a:memcmp.lo(.data .data.*) + bcmp.o(.data .data.*) + */bcmp.o(.data .data.*) + *libc.a:bcmp.lo(.data .data.*) + } :data + + . = ALIGN(0x1000); + + PROVIDE_HIDDEN(__init_array_start = .); + .init_array : ALIGN(0x1000) { + KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP(*(.init_array .ctors)) + } :data + PROVIDE_HIDDEN(__init_array_end = .); + + . = ALIGN(8); + PROVIDE_HIDDEN(__fini_array_start = .); + .fini_array : ALIGN(8) { + KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP(*(.fini_array .dtors)) + } :data + PROVIDE_HIDDEN(__fini_array_end = .); + + .data : { + *(.data .data.* .gnu.linkonce.d.*) + } :data + + .got : { + *(.got .got.*) + } :data + + .bss.musl : { + *(EXCLUDE_FILE(*lib0_*.o main.o */main.o *extern_stubs_clean.o memcpy.o */memcpy.o memset.o */memset.o memmove.o */memmove.o memcmp.o */memcmp.o bcmp.o */bcmp.o) .bss) + *(EXCLUDE_FILE(*lib0_*.o main.o */main.o *extern_stubs_clean.o memcpy.o */memcpy.o memset.o */memset.o memmove.o */memmove.o memcmp.o */memcmp.o bcmp.o */bcmp.o) .bss.*) + *(EXCLUDE_FILE(*lib0_*.o main.o */main.o *extern_stubs_clean.o memcpy.o */memcpy.o memset.o */memset.o memmove.o */memmove.o memcmp.o */memcmp.o bcmp.o */bcmp.o) COMMON) + } :data + + .bss : { + *(.bss .bss.* .gnu.linkonce.b.* COMMON) + } :data + + .stock.stub_manifest 0 (INFO) : { + KEEP(*(.stock.stub_manifest)) + } + + .symtab 0 : { *(.symtab) } + .strtab 0 : { *(.strtab) } + .shstrtab 0 : { *(.shstrtab) } + + /DISCARD/ : { + *(.eh_frame*) + *(.gcc_except_table*) + *(.comment) + *(.note*) + *(.llvm_addrsig) + } +} diff --git a/third_party/libsignal/libsignal-session/cli-elf/string-include/features.h b/third_party/libsignal/libsignal-session/cli-elf/string-include/features.h deleted file mode 100644 index 2bc95edf3..000000000 --- a/third_party/libsignal/libsignal-session/cli-elf/string-include/features.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright © 2005-2020 Rich Felker, et al. - * SPDX-License-Identifier: MIT - * - * From musl 1.2.5 `src/include/features.h` (https://musl.libc.org/, full license text in musl's - * `COPYRIGHT`), with the include guard renamed and `#include "../../include/features.h"` - * replaced by `#include_next `. See `third_party/libsignal/README.md`. - */ - -#ifndef MUSL_STRING_FEATURES_H -#define MUSL_STRING_FEATURES_H - -#include_next - -#define weak __attribute__((__weak__)) -#define hidden __attribute__((__visibility__("hidden"))) -#define weak_alias(old, new) \ - extern __typeof(old) new __attribute__((__weak__, __alias__(#old))) - -#endif diff --git a/third_party/libsignal/libsignal-session/cli-elf/string-include/string.h b/third_party/libsignal/libsignal-session/cli-elf/string-include/string.h deleted file mode 100644 index 4f5b719d2..000000000 --- a/third_party/libsignal/libsignal-session/cli-elf/string-include/string.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright © 2005-2020 Rich Felker, et al. - * SPDX-License-Identifier: MIT - * - * From musl 1.2.5 (https://musl.libc.org/, full license text in musl's `COPYRIGHT`): - * the `src/include/string.h` wrapper (its `__memrchr` declaration) with - * `#include "../../include/string.h"` replaced by `#include_next `, plus the - * `mem*` prototypes of `include/string.h` and `bcmp` of `include/strings.h`. - * See `third_party/libsignal/README.md`. - */ - -#ifndef MUSL_STRING_STRING_H -#define MUSL_STRING_STRING_H - -#include -#include_next - -void *memcpy(void *__restrict, const void *__restrict, size_t); -void *memmove(void *, const void *, size_t); -void *memset(void *, int, size_t); -int memcmp(const void *, const void *, size_t); -int bcmp(const void *, const void *, size_t); -void *memchr(const void *, int, size_t); -void *memrchr(const void *, int, size_t); -hidden void *__memrchr(const void *, int, size_t); -void *memccpy(void *__restrict, const void *__restrict, int, size_t); -void *mempcpy(void *, const void *, size_t); -void *memmem(const void *, size_t, const void *, size_t); - -#endif diff --git a/third_party/libsignal/libsignal-session/cli/rt/translation.toml b/third_party/libsignal/libsignal-session/cli/rt/translation.toml new file mode 100644 index 000000000..ff971144d --- /dev/null +++ b/third_party/libsignal/libsignal-session/cli/rt/translation.toml @@ -0,0 +1,131 @@ +# Translation configuration for `third_party/libsignal/libsignal-session/cli/rt` (C2 `lib2` sibling). +# +# Consumed only by the stock builder (`scripts/cli-elf-stock` -> `work/lib2_*.o`), never registered +# in `lakefile.lean` so `libsignalSessionObj` / `libsignalSessionExterns` remain byte-identical. +# Trims the 7 C2 Rust/crate runtime hook bodies (`memrchr`, `from_utf8`, `SystemTime::duration_since`, +# `SystemTime::add`, `subtle::black_box::`, `StaticSecret::drop`, `SharedSecret::drop`) plus the +# `MontgomeryPoint::zeroize` callee of `SharedSecret::drop` from the `aarch64-unknown-linux-gnu` +# sysroot rlibs (`core`, `std`) and the `deps/` rlibs (`curve25519_dalek`, `x25519_dalek`) of the +# same cargo build that produced `lib0_*.o`. +# +# Note: `core_memrchr` and `core_from_utf8` are two separate `[[sysroot_objects]]` entries (as in +# `STOCK-PLAN` `part1_roots.md` §1 and `RENAME`'s `a819d0d7` trial) because in `core` `cgu.0` +# `from_utf8` sits at an earlier ELF section index than `memrchr`, and separate `.o` trims allow +# independent per-row inclusion while keeping `memrchr` (`0x46e5bc`) before `from_utf8` (`0x46e6e4`). + +crate_dir = "../.." +crates = [] +obj_name = "libsignalCliRt" +obj_file = "GeneratedLean/LibsignalCliRtObj.lean" +namespace_prefix = "CryptoVerification" +page_separate_data = true +legacy_linked_image = false +hashed_inputs = [ + "cli/rt/translation.toml", + "Cargo.toml", + "Cargo.lock", +] +rustflags = ["--cfg", 'aes_backend="soft"', "--cfg", 'sha2_backend="soft"'] +license_header = [ + "Machine code trimmed from Rust `core`/`std` sysroot and `curve25519-dalek` / `x25519-dalek`", + "crate dependencies compiled with `third_party/libsignal/libsignal-session/Cargo.lock`.", + "", + "See `third_party/libsignal/README.md`.", +] + +[upstream] +name = "libsignal" +repo_url = "https://github.com/signalapp/libsignal" +tag = "v0.105.4" +vendor_symlink = "vendor/libsignal" +probe_path = "rust/protocol/Cargo.toml" +env_var = "LIBSIGNAL_SRC" +no_clone_env_var = "LIBSIGNAL_NO_CLONE" +home_subdir = "sw/libsignal" + +[placed] +multi = true +# Ordered with `SystemTime::add` LAST so its retired stub (`__retired_6`) and `lib2_5.o` sections +# sit strictly at the tail of `.text.lib2` and `.rodata.lib2`: holding `time_add` back truncates +# only the two tails without shifting any other `lib2` code/RO address or renumbering `__retired_0..5`. +exports = [ + "_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr", + "_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8", + "_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since", + "_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek", + "_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + "_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + "_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add", +] + +# Per-row configurability map: each C2 row can be enabled or held back independently; a held-back +# row stays out of `lib2_*.o` and keeps its global 4-byte `udf #0` stub in `extern_stubs_clean.o`. +[lib2_rows.memrchr] +root = "_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr" + +[lib2_rows.from_utf8] +root = "_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8" + +[lib2_rows.duration_since] +root = "_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since" + +[lib2_rows.black_box] +root = "_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek" + +[lib2_rows.static_secret_drop] +root = "_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop" + +[lib2_rows.shared_secret_drop] +root = "_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop" +helper_roots = [ + "_RNvXs4_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPointNtCsjhEzohgaBbG_7zeroize7Zeroize7zeroize", +] + +[lib2_rows.time_add] +root = "_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add" + +[[sysroot_objects]] +order = 0 +crate = "core" +name = "core_memrchr" +roots = ["_RNvNtNtCskxtBwYRO61I_4core5slice6memchr7memrchr"] + +[[sysroot_objects]] +order = 1 +crate = "core" +name = "core_from_utf8" +roots = ["_RNvNtNtCskxtBwYRO61I_4core3str8converts9from_utf8"] + +[[sysroot_objects]] +order = 2 +crate = "std" +name = "std_duration_since" +roots = [ + "_RNvMs5_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTime14duration_since", +] + +[[dep_objects]] +order = 3 +crate = "curve25519_dalek" +name = "dalek_rt" +roots = [ + "_RINvCsdqpLrhraQXi_6subtle9black_boxhECs2wR8L9wiBdT_16curve25519_dalek", + "_RNvXs4_NtCs2wR8L9wiBdT_16curve25519_dalek10montgomeryNtB5_15MontgomeryPointNtCsjhEzohgaBbG_7zeroize7Zeroize7zeroize", +] + +[[dep_objects]] +order = 4 +crate = "x25519_dalek" +name = "x25519_rt" +roots = [ + "_RNvXsa_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12StaticSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", + "_RNvXse_NtCscSWoUTnaXmu_12x25519_dalek6x25519NtB5_12SharedSecretNtNtNtCskxtBwYRO61I_4core3ops4drop4Drop4drop", +] + +[[sysroot_objects]] +order = 5 +crate = "std" +name = "std_time_add" +roots = [ + "_RNvXs6_NtCsfr5T3GFabw_3std4timeNtB5_10SystemTimeINtNtNtCskxtBwYRO61I_4core3ops5arith3AddNtNtBR_4time8DurationE3add", +]